diff --git a/.github/workflows/seo-audit.yml b/.github/workflows/seo-audit.yml index d8b9f4d1..848e3593 100644 --- a/.github/workflows/seo-audit.yml +++ b/.github/workflows/seo-audit.yml @@ -5,9 +5,9 @@ on: paths: - '**/*.html' - 'public/locales/**' - - 'scripts/generate-i18n-pages.mjs' - - 'scripts/generate-sitemap.mjs' - - 'scripts/seo-audit.mjs' + - 'scripts/**' + - 'translations/**' + - 'docs/**' - 'src/partials/**' - 'package.json' - 'package-lock.json' diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index ea552ee5..3e3208cd 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -28,6 +28,7 @@ env: SIMPLE_MODE: ${{ vars.SIMPLE_MODE }} BASE_URL: ${{ vars.BASE_URL }}/ SITE_URL: ${{ vars.SITE_URL }} + ALLOW_INDEXING: ${{ vars.ALLOW_INDEXING }} HUSKY: 0 jobs: diff --git a/.prettierignore b/.prettierignore index fb47a898..5e8b35fd 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,7 @@ blog/posts/ public/pdfjs-viewer/ public/pdfjs-annotation-viewer/ + +translations/source.json +translations/pages.json +translations/ui-source.json diff --git a/Dockerfile b/Dockerfile index 4551448e..7f406fd2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,10 +65,12 @@ ARG DISABLE_TOOLS ENV DISABLE_TOOLS=$DISABLE_TOOLS # Public-facing canonical site URL. Defaults to the official site so self-hosters -# consolidate SEO signals back to bentopdf.com. Override with --build-arg -# SITE_URL=https://your-domain.example to claim canonical for your own deployment. +# consolidate SEO signals back to bentopdf.com. A custom SITE_URL marks every page +# noindex unless ALLOW_INDEXING=true is also set. ARG SITE_URL=https://www.bentopdf.com ENV SITE_URL=$SITE_URL +ARG ALLOW_INDEXING=false +ENV ALLOW_INDEXING=$ALLOW_INDEXING ENV NODE_OPTIONS="--max-old-space-size=3072" diff --git a/Dockerfile.nonroot b/Dockerfile.nonroot index ebeb6f30..144ad57e 100644 --- a/Dockerfile.nonroot +++ b/Dockerfile.nonroot @@ -60,6 +60,8 @@ ENV VITE_FOOTER_TEXT=$VITE_FOOTER_TEXT # Public-facing canonical site URL. See Dockerfile for details. ARG SITE_URL=https://www.bentopdf.com ENV SITE_URL=$SITE_URL +ARG ALLOW_INDEXING=false +ENV ALLOW_INDEXING=$ALLOW_INDEXING ENV NODE_OPTIONS="--max-old-space-size=3072" diff --git a/STATIC-HOSTING.md b/STATIC-HOSTING.md index 44ec284f..10c3ddee 100644 --- a/STATIC-HOSTING.md +++ b/STATIC-HOSTING.md @@ -94,16 +94,19 @@ You have two clean overrides depending on what you want. ### Run your own SEO instance (claim canonical for yourself) If you operate a public deployment and want it to be the indexed copy for -your audience, set `SITE_URL` at build time to your origin. The build will -emit canonicals, hreflang, and structured data pointing at your domain. +your audience, set `SITE_URL` at build time to your origin and also set +`ALLOW_INDEXING=true`. The build will emit canonicals, hreflang and +sitemap URLs pointing at your domain. Without `ALLOW_INDEXING=true`, a +build with a custom `SITE_URL` marks every page `noindex`. - Docker: ```sh - docker build --build-arg SITE_URL=https://pdf.example.com -t bentopdf-self . + docker build --build-arg SITE_URL=https://pdf.example.com --build-arg ALLOW_INDEXING=true -t bentopdf-self . ``` - Netlify, Vercel, GitHub Pages, or any other static host: set `SITE_URL` - in your project's environment variables and re-deploy. The build script - reads it during `npm run build`. + and `ALLOW_INDEXING=true` in your project's environment variables and + re-deploy. The build script reads them during `npm run build`. For the + GitHub Pages workflow, add both as repository variables. ### Stay invisible to search engines (no SEO competition either way) @@ -117,9 +120,10 @@ bentopdf.com as the authoritative source. docker run -d -p 8080:8080 -e ROBOTS_NOINDEX=true ghcr.io/alam00000/bentopdf:latest ``` -You can combine the two: build with your own `SITE_URL` and run with -`ROBOTS_NOINDEX=true` for a private deployment that's neither competing -with bentopdf.com nor advertising itself. +A build with your own `SITE_URL` and without `ALLOW_INDEXING=true` is +already `noindex`, so it neither competes with bentopdf.com nor advertises +itself. `ROBOTS_NOINDEX=true` does the same at runtime for the prebuilt +images. ### Note on Simple Mode diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index bad15862..df7ca9ff 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,222 +1,210 @@ import { defineConfig } from 'vitepress' +import type { DefaultTheme } from 'vitepress' +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { nav, sidebar } from './navigation.mjs' +import { DESCRIPTION, FOOTER_MESSAGE } from './i18n/theme-labels.mjs' +import { completeDocsLanguages } from '../../scripts/docs-languages.mjs' const SITE_URL = 'https://www.bentopdf.com' +const docsDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const labelsDir = path.join(docsDir, '.vitepress', 'i18n') + +const LANGUAGE_NAMES: Record = { + ar: 'العربية', + be: 'Беларуская', + ca: 'Català', + da: 'Dansk', + de: 'Deutsch', + es: 'Español', + fa: 'فارسی', + fr: 'Français', + id: 'Bahasa Indonesia', + it: 'Italiano', + ja: '日本語', + ko: '한국어', + nl: 'Nederlands', + pl: 'Polski', + pt: 'Português', + ru: 'Русский', + sk: 'Slovenčina', + sv: 'Svenska', + tr: 'Türkçe', + uk: 'Українська', + vi: 'Tiếng Việt', + zh: '简体中文', + 'zh-TW': '繁體中文' +} + +const RTL_LANGUAGES = new Set(['ar', 'fa']) +const ENGLISH_ONLY_DOCS = new Set(['licensing']) + +const { enabled, incomplete } = completeDocsLanguages( + docsDir, + Object.keys(LANGUAGE_NAMES), + process.env.DOCS_LANGUAGES +) +for (const { lang, missing, total } of incomplete) { + console.warn(`[docs] Skipping "${lang}": ${missing} of ${total} pages are not translated yet`) +} +const excluded = Object.keys(LANGUAGE_NAMES) + .filter((lang) => !enabled.includes(lang)) + .map((lang) => `${lang}/**`) + +type Labels = Record + +function readLabels(lang: string): Labels { + const file = path.join(labelsDir, `${lang}.json`) + return fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, 'utf-8')) : {} +} + +function localizedLink(link: string | undefined, lang: string) { + return link && link.startsWith('/') ? `/${lang}${link}` : link +} + +type LocalizableItem = { + text?: string + link?: string + items?: LocalizableItem[] +} + +function localizeItems( + items: T[], + lang: string, + translate: (text: string) => string +): T[] { + return items.map((item) => ({ + ...item, + ...(item.text ? { text: translate(item.text) } : {}), + ...(item.link ? { link: localizedLink(item.link, lang) } : {}), + ...(item.items ? { items: localizeItems(item.items, lang, translate) } : {}) + })) +} + +function localeThemeConfig(lang: string): DefaultTheme.Config { + const labels = readLabels(lang) + const translate = (text: string) => labels[text] || text + return { + nav: localizeItems(nav, lang, translate), + sidebar: Object.fromEntries( + Object.entries(sidebar).map(([base, items]) => [ + `/${lang}${base}`, + localizeItems(items as DefaultTheme.SidebarItem[], lang, translate) + ]) + ), + footer: { + message: translate(FOOTER_MESSAGE), + copyright: 'Copyright © 2026 BentoPDF' + }, + outline: { label: translate('On this page') }, + docFooter: { + prev: translate('Previous page'), + next: translate('Next page') + }, + returnToTopLabel: translate('Return to top'), + sidebarMenuLabel: translate('Menu'), + darkModeSwitchLabel: translate('Appearance'), + lightModeSwitchTitle: translate('Switch to light theme'), + darkModeSwitchTitle: translate('Switch to dark theme'), + skipToContentLabel: translate('Skip to content'), + langMenuLabel: translate('Change language') + } +} + +function localeSearch(lang: string) { + const labels = readLabels(lang) + const translate = (text: string) => labels[text] || text + return { + translations: { + button: { + buttonText: translate('Search'), + buttonAriaLabel: translate('Search') + }, + modal: { + displayDetails: translate('Display detailed list'), + resetButtonTitle: translate('Reset search'), + backButtonTitle: translate('Close search'), + noResultsText: translate('No results for'), + footer: { + selectText: translate('to select'), + navigateText: translate('to navigate'), + closeText: translate('to close') + } + } + } + } +} + +const locales = Object.fromEntries( + enabled.map((lang) => { + const labels = readLabels(lang) + return [ + lang, + { + label: LANGUAGE_NAMES[lang], + lang, + dir: RTL_LANGUAGES.has(lang) ? 'rtl' : 'ltr', + link: `/${lang}/`, + title: 'BentoPDF Docs', + description: labels[DESCRIPTION] || DESCRIPTION, + themeConfig: localeThemeConfig(lang) + } + ] + }) +) + +function pageUrl(lang: string, pagePath: string) { + const prefix = lang === 'en' ? '' : `/${lang}` + const suffix = pagePath === 'index' ? '' : `/${pagePath.replace(/\/index$/, '')}` + return `${SITE_URL}/docs${prefix}${suffix}` +} + export default defineConfig({ title: "BentoPDF Docs", - description: "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit", + description: DESCRIPTION, base: '/docs/', cleanUrls: true, metaChunk: true, + srcExclude: excluded, + + locales: { + root: { label: 'English', lang: 'en-US' }, + ...locales + }, transformPageData(pageData) { const relPath = pageData.relativePath.replace(/\.md$/, '') - const slug = relPath === 'index' ? '' : relPath.replace(/\/index$/, '') + const pageLang = enabled.find((lang) => relPath.startsWith(`${lang}/`)) + const pagePath = pageLang ? relPath.slice(pageLang.length + 1) : relPath + const englishOnly = ENGLISH_ONLY_DOCS.has(pagePath) + const canonicalPath = englishOnly ? pagePath : relPath + const slug = canonicalPath === 'index' ? '' : canonicalPath.replace(/\/index$/, '') const canonicalUrl = slug ? `${SITE_URL}/docs/${slug}` : `${SITE_URL}/docs` pageData.frontmatter.head ??= [] pageData.frontmatter.head.push(['link', { rel: 'canonical', href: canonicalUrl }]) + if (enabled.length === 0 || englishOnly) return + for (const lang of ['en', ...enabled]) { + const source = lang === 'en' ? pagePath : `${lang}/${pagePath}` + if (!fs.existsSync(path.join(docsDir, `${source}.md`))) continue + pageData.frontmatter.head.push([ + 'link', + { rel: 'alternate', hreflang: lang, href: pageUrl(lang, pagePath) } + ]) + } + pageData.frontmatter.head.push([ + 'link', + { rel: 'alternate', hreflang: 'x-default', href: pageUrl('en', pagePath) } + ]) }, themeConfig: { logo: '/images/favicon-no-bg.svg', - nav: [ - { text: 'Home', link: '/' }, - { text: 'Getting Started', link: '/getting-started' }, - { text: 'Tools', link: '/tools/' }, - { text: 'Self-Hosting', link: '/self-hosting/' }, - { text: 'Contributing', link: '/contributing' }, - { text: 'Commercial License', link: '/licensing' } - ], + nav, - sidebar: { - '/tools/': [ - { - text: 'Tools Reference', - items: [ - { text: 'Overview', link: '/tools/' } - ] - }, - { - text: 'Edit & Annotate', - collapsed: false, - items: [ - { text: 'PDF Editor', link: '/tools/edit-pdf' }, - { text: 'Edit Bookmarks', link: '/tools/bookmark' }, - { text: 'Table of Contents', link: '/tools/table-of-contents' }, - { text: 'Page Numbers', link: '/tools/page-numbers' }, - { text: 'Add Page Labels', link: '/tools/add-page-labels' }, - { text: 'Bates Numbering', link: '/tools/bates-numbering' }, - { text: 'Add Watermark', link: '/tools/add-watermark' }, - { text: 'Header & Footer', link: '/tools/header-footer' }, - { text: 'Invert Colors', link: '/tools/invert-colors' }, - { text: 'Scanner Effect', link: '/tools/scanner-effect' }, - { text: 'Adjust Colors', link: '/tools/adjust-colors' }, - { text: 'Background Color', link: '/tools/background-color' }, - { text: 'Change Text Color', link: '/tools/text-color' }, - { text: 'Sign PDF', link: '/tools/sign-pdf' }, - { text: 'Add Stamps', link: '/tools/add-stamps' }, - { text: 'Remove Annotations', link: '/tools/remove-annotations' }, - { text: 'Crop PDF', link: '/tools/crop-pdf' }, - { text: 'PDF Form Filler', link: '/tools/form-filler' }, - { text: 'Create PDF Form', link: '/tools/form-creator' }, - { text: 'Remove Blank Pages', link: '/tools/remove-blank-pages' } - ] - }, - { - text: 'Convert to PDF', - collapsed: true, - items: [ - { text: 'Images to PDF', link: '/tools/image-to-pdf' }, - { text: 'JPG to PDF', link: '/tools/jpg-to-pdf' }, - { text: 'PNG to PDF', link: '/tools/png-to-pdf' }, - { text: 'WebP to PDF', link: '/tools/webp-to-pdf' }, - { text: 'SVG to PDF', link: '/tools/svg-to-pdf' }, - { text: 'BMP to PDF', link: '/tools/bmp-to-pdf' }, - { text: 'HEIC to PDF', link: '/tools/heic-to-pdf' }, - { text: 'TIFF to PDF', link: '/tools/tiff-to-pdf' }, - { text: 'Text to PDF', link: '/tools/txt-to-pdf' }, - { text: 'Markdown to PDF', link: '/tools/markdown-to-pdf' }, - { text: 'JSON to PDF', link: '/tools/json-to-pdf' }, - { text: 'ODT to PDF', link: '/tools/odt-to-pdf' }, - { text: 'CSV to PDF', link: '/tools/csv-to-pdf' }, - { text: 'RTF to PDF', link: '/tools/rtf-to-pdf' }, - { text: 'Word to PDF', link: '/tools/word-to-pdf' }, - { text: 'Excel to PDF', link: '/tools/excel-to-pdf' }, - { text: 'PowerPoint to PDF', link: '/tools/powerpoint-to-pdf' }, - { text: 'XPS to PDF', link: '/tools/xps-to-pdf' }, - { text: 'MOBI to PDF', link: '/tools/mobi-to-pdf' }, - { text: 'EPUB to PDF', link: '/tools/epub-to-pdf' }, - { text: 'FB2 to PDF', link: '/tools/fb2-to-pdf' }, - { text: 'CBZ to PDF', link: '/tools/cbz-to-pdf' }, - { text: 'WPD to PDF', link: '/tools/wpd-to-pdf' }, - { text: 'WPS to PDF', link: '/tools/wps-to-pdf' }, - { text: 'XML to PDF', link: '/tools/xml-to-pdf' }, - { text: 'ODG to PDF', link: '/tools/odg-to-pdf' }, - { text: 'ODS to PDF', link: '/tools/ods-to-pdf' }, - { text: 'ODP to PDF', link: '/tools/odp-to-pdf' }, - { text: 'PUB to PDF', link: '/tools/pub-to-pdf' }, - { text: 'VSD to PDF', link: '/tools/vsd-to-pdf' }, - { text: 'PSD to PDF', link: '/tools/psd-to-pdf' }, - { text: 'Email to PDF', link: '/tools/email-to-pdf' } - ] - }, - { - text: 'Convert from PDF', - collapsed: true, - items: [ - { text: 'PDF to JPG', link: '/tools/pdf-to-jpg' }, - { text: 'PDF to PNG', link: '/tools/pdf-to-png' }, - { text: 'PDF to WebP', link: '/tools/pdf-to-webp' }, - { text: 'PDF to BMP', link: '/tools/pdf-to-bmp' }, - { text: 'PDF to TIFF', link: '/tools/pdf-to-tiff' }, - { text: 'PDF to CBZ', link: '/tools/pdf-to-cbz' }, - { text: 'PDF to SVG', link: '/tools/pdf-to-svg' }, - { text: 'PDF to CSV', link: '/tools/pdf-to-csv' }, - { text: 'PDF to Excel', link: '/tools/pdf-to-excel' }, - { text: 'PDF to Greyscale', link: '/tools/pdf-to-greyscale' }, - { text: 'PDF to JSON', link: '/tools/pdf-to-json' }, - { text: 'PDF to Word', link: '/tools/pdf-to-word' }, - { text: 'Extract Images', link: '/tools/extract-images' }, - { text: 'PDF to Markdown', link: '/tools/pdf-to-markdown' }, - { text: 'Prepare PDF for AI', link: '/tools/prepare-pdf-for-ai' }, - { text: 'PDF to Text', link: '/tools/pdf-to-text' }, - { text: 'Extract Tables', link: '/tools/extract-tables' } - ] - }, - { - text: 'Organize & Manage', - collapsed: true, - items: [ - { text: 'PDF Workflow Builder', link: '/tools/pdf-workflow' }, - { text: 'PDF Multi Tool', link: '/tools/pdf-multi-tool' }, - { text: 'OCR PDF', link: '/tools/ocr-pdf' }, - { text: 'Merge PDF', link: '/tools/merge-pdf' }, - { text: 'Alternate & Mix Pages', link: '/tools/alternate-merge' }, - { text: 'Duplex Collate', link: '/tools/duplex-collate' }, - { text: 'Organize & Duplicate', link: '/tools/organize-pdf' }, - { text: 'Add Attachments', link: '/tools/add-attachments' }, - { text: 'Extract Attachments', link: '/tools/extract-attachments' }, - { text: 'Edit Attachments', link: '/tools/edit-attachments' }, - { text: 'PDF OCG', link: '/tools/pdf-layers' }, - { text: 'Split PDF', link: '/tools/split-pdf' }, - { text: 'Divide Pages', link: '/tools/divide-pages' }, - { text: 'Extract Pages', link: '/tools/extract-pages' }, - { text: 'Delete Pages', link: '/tools/delete-pages' }, - { text: 'Add Blank Page', link: '/tools/add-blank-page' }, - { text: 'Reverse Pages', link: '/tools/reverse-pages' }, - { text: 'Rotate PDF', link: '/tools/rotate-pdf' }, - { text: 'Rotate by Custom Degrees', link: '/tools/rotate-custom' }, - { text: 'N-Up PDF', link: '/tools/n-up-pdf' }, - { text: 'PDF Booklet', link: '/tools/pdf-booklet' }, - { text: 'Combine to Single Page', link: '/tools/combine-single-page' }, - { text: 'View Metadata', link: '/tools/view-metadata' }, - { text: 'Edit Metadata', link: '/tools/edit-metadata' }, - { text: 'PDFs to ZIP', link: '/tools/pdf-to-zip' }, - { text: 'Compare PDFs', link: '/tools/compare-pdfs' }, - { text: 'Posterize PDF', link: '/tools/posterize-pdf' } - ] - }, - { - text: 'Optimize & Repair', - collapsed: true, - items: [ - { text: 'Compress PDF', link: '/tools/compress-pdf' }, - { text: 'PDF to PDF/A', link: '/tools/pdf-to-pdfa' }, - { text: 'Fix Page Size', link: '/tools/fix-page-size' }, - { text: 'Linearize PDF', link: '/tools/linearize-pdf' }, - { text: 'Page Dimensions', link: '/tools/page-dimensions' }, - { text: 'Remove Restrictions', link: '/tools/remove-restrictions' }, - { text: 'Repair PDF', link: '/tools/repair-pdf' }, - { text: 'Rasterize PDF', link: '/tools/rasterize-pdf' }, - { text: 'Deskew PDF', link: '/tools/deskew-pdf' }, - { text: 'Font to Outline', link: '/tools/font-to-outline' } - ] - }, - { - text: 'Secure PDF', - collapsed: true, - items: [ - { text: 'Protect PDF', link: '/tools/protect-pdf' }, - { text: 'Sanitize PDF', link: '/tools/sanitize-pdf' }, - { text: 'Unlock PDF', link: '/tools/unlock-pdf' }, - { text: 'Flatten PDF', link: '/tools/flatten-pdf' }, - { text: 'Remove Metadata', link: '/tools/remove-metadata' }, - { text: 'Change Permissions', link: '/tools/change-permissions' }, - { text: 'Digital Signature', link: '/tools/digital-sign-pdf' }, - { text: 'Validate Signature', link: '/tools/validate-signature-pdf' } - ] - } - ], - '/self-hosting/': [ - { - text: 'Self-Hosting Guide', - items: [ - { text: 'Overview', link: '/self-hosting/' }, - { text: 'Docker', link: '/self-hosting/docker' }, - { text: 'Vercel', link: '/self-hosting/vercel' }, - { text: 'Netlify', link: '/self-hosting/netlify' }, - { text: 'Cloudflare Pages', link: '/self-hosting/cloudflare' }, - { text: 'AWS S3 + CloudFront', link: '/self-hosting/aws' }, - { text: 'Hostinger', link: '/self-hosting/hostinger' }, - { text: 'Nginx', link: '/self-hosting/nginx' }, - { text: 'Apache', link: '/self-hosting/apache' } - ] - } - ], - '/': [ - { - text: 'Guide', - items: [ - { text: 'Getting Started', link: '/getting-started' }, - { text: 'Tools Reference', link: '/tools/' }, - { text: 'Self-Hosting', link: '/self-hosting/' }, - { text: 'Contributing', link: '/contributing' }, - { text: 'Commercial License', link: '/licensing' } - ] - } - ] - }, + sidebar, socialLinks: [ { icon: 'github', link: 'https://github.com/alam00000/bentopdf' }, @@ -224,12 +212,17 @@ export default defineConfig({ ], footer: { - message: 'Dual-licensed under AGPL-3.0 and Commercial License.', + message: FOOTER_MESSAGE, copyright: 'Copyright © 2026 BentoPDF' }, search: { - provider: 'local' + provider: 'local', + options: { + locales: Object.fromEntries( + enabled.map((lang) => [lang, localeSearch(lang)]) + ) + } } } }) diff --git a/docs/.vitepress/i18n/ar.json b/docs/.vitepress/i18n/ar.json new file mode 100644 index 00000000..2e59a8eb --- /dev/null +++ b/docs/.vitepress/i18n/ar.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "إضافة مرفقات", + "Add Blank Page": "إضافة صفحة فارغة", + "Add Page Labels": "إضافة تسميات الصفحات", + "Add Stamps": "إضافة أختام", + "Add Watermark": "إضافة علامة مائية", + "Adjust Colors": "ضبط الألوان", + "Alternate & Mix Pages": "تبديل ومزج الصفحات", + "Apache": "Apache", + "Appearance": "المظهر", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "لون الخلفية", + "Bates Numbering": "ترقيم بيتس", + "BMP to PDF": "BMP إلى PDF", + "CBZ to PDF": "CBZ إلى PDF", + "Change language": "تغيير اللغة", + "Change Permissions": "تغيير الأذونات", + "Change Text Color": "تغيير لون النص", + "Close search": "إغلاق البحث", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "دمج في صفحة واحدة", + "Commercial License": "الترخيص التجاري", + "Compare PDFs": "مقارنة ملفات PDF", + "Compress PDF": "ضغط PDF", + "Contributing": "المساهمة", + "Convert from PDF": "التحويل من PDF", + "Convert to PDF": "التحويل إلى PDF", + "Create PDF Form": "إنشاء نموذج PDF", + "Crop PDF": "قص PDF", + "CSV to PDF": "CSV إلى PDF", + "Delete Pages": "حذف الصفحات", + "Deskew PDF": "تصحيح انحراف PDF", + "Digital Signature": "التوقيع الرقمي", + "Display detailed list": "عرض القائمة التفصيلية", + "Divide Pages": "تقسيم الصفحات", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "توثيق BentoPDF، مجموعة أدوات PDF المجانية ومفتوحة المصدر والمصممة للخصوصية", + "Dual-licensed under AGPL-3.0 and Commercial License.": "مرخّص بترخيصين: AGPL-3.0 والترخيص التجاري.", + "Duplex Collate": "ترتيب المسح على الوجهين", + "Edit & Annotate": "تعديل وتعليق", + "Edit Attachments": "تعديل المرفقات", + "Edit Bookmarks": "تعديل الإشارات المرجعية", + "Edit Metadata": "تعديل البيانات الوصفية", + "Email to PDF": "بريد إلكتروني إلى PDF", + "EPUB to PDF": "EPUB إلى PDF", + "Excel to PDF": "Excel إلى PDF", + "Extract Attachments": "استخراج المرفقات", + "Extract Images": "استخراج الصور", + "Extract Pages": "استخراج الصفحات", + "Extract Tables": "استخراج الجداول", + "FB2 to PDF": "FB2 إلى PDF", + "Fix Page Size": "توحيد حجم الصفحة", + "Flatten PDF": "تسطيح PDF", + "Font to Outline": "تحويل الخطوط إلى مخططات", + "Getting Started": "البدء", + "Guide": "الدليل", + "Header & Footer": "رأس وتذييل", + "HEIC to PDF": "HEIC إلى PDF", + "Home": "الرئيسية", + "Hostinger": "Hostinger", + "Images to PDF": "صور إلى PDF", + "Invert Colors": "عكس الألوان", + "JPG to PDF": "JPG إلى PDF", + "JSON to PDF": "JSON إلى PDF", + "Linearize PDF": "تحسين PDF للويب", + "Markdown to PDF": "Markdown إلى PDF", + "Menu": "القائمة", + "Merge PDF": "دمج PDF", + "MOBI to PDF": "MOBI إلى PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "الصفحة التالية", + "Nginx": "Nginx", + "No results for": "لا توجد نتائج لـ", + "OCR PDF": "التعرف الضوئي على PDF", + "ODG to PDF": "ODG إلى PDF", + "ODP to PDF": "ODP إلى PDF", + "ODS to PDF": "ODS إلى PDF", + "ODT to PDF": "ODT إلى PDF", + "On this page": "في هذه الصفحة", + "Optimize & Repair": "التحسين والإصلاح", + "Organize & Duplicate": "تكرار وتنظيم", + "Organize & Manage": "التنظيم والإدارة", + "Overview": "نظرة عامة", + "Page Dimensions": "أبعاد الصفحة", + "Page Numbers": "أرقام الصفحات", + "PDF Booklet": "كتيّب PDF", + "PDF Editor": "محرر PDF", + "PDF Form Filler": "ملء نماذج PDF", + "PDF Multi Tool": "أداة PDF المتعددة", + "PDF OCG": "طبقات PDF OCG", + "PDF to BMP": "PDF إلى BMP", + "PDF to CBZ": "PDF إلى CBZ", + "PDF to CSV": "PDF إلى CSV", + "PDF to Excel": "PDF إلى Excel", + "PDF to Greyscale": "PDF إلى تدرج الرمادي", + "PDF to JPG": "PDF إلى JPG", + "PDF to JSON": "PDF إلى JSON", + "PDF to Markdown": "PDF إلى Markdown", + "PDF to PDF/A": "PDF إلى PDF/A", + "PDF to PNG": "PDF إلى PNG", + "PDF to SVG": "PDF إلى SVG", + "PDF to Text": "PDF إلى نص", + "PDF to TIFF": "PDF إلى TIFF", + "PDF to WebP": "PDF إلى WebP", + "PDF to Word": "PDF إلى Word", + "PDF Workflow Builder": "منشئ سير عمل PDF", + "PDFs to ZIP": "PDF إلى ZIP", + "PNG to PDF": "PNG إلى PDF", + "Posterize PDF": "تقسيم PDF إلى ملصقات", + "PowerPoint to PDF": "PowerPoint إلى PDF", + "Prepare PDF for AI": "تحضير PDF للذكاء الاصطناعي", + "Previous page": "الصفحة السابقة", + "Protect PDF": "حماية PDF", + "PSD to PDF": "PSD إلى PDF", + "PUB to PDF": "PUB إلى PDF", + "Rasterize PDF": "تحويل PDF إلى صور نقطية", + "Remove Annotations": "إزالة التعليقات", + "Remove Blank Pages": "إزالة الصفحات الفارغة", + "Remove Metadata": "إزالة البيانات الوصفية", + "Remove Restrictions": "إزالة القيود", + "Repair PDF": "إصلاح PDF", + "Reset search": "إعادة تعيين البحث", + "Return to top": "العودة إلى الأعلى", + "Reverse Pages": "عكس الصفحات", + "Rotate by Custom Degrees": "تدوير بزاوية مخصصة", + "Rotate PDF": "تدوير PDF", + "RTF to PDF": "RTF إلى PDF", + "Sanitize PDF": "تنظيف PDF", + "Scanner Effect": "تأثير الماسح الضوئي", + "Search": "بحث", + "Secure PDF": "تأمين PDF", + "Self-Hosting": "الاستضافة الذاتية", + "Self-Hosting Guide": "دليل الاستضافة الذاتية", + "Sign PDF": "توقيع PDF", + "Skip to content": "انتقل إلى المحتوى", + "Split PDF": "تقسيم PDF", + "SVG to PDF": "SVG إلى PDF", + "Switch to dark theme": "التبديل إلى المظهر الداكن", + "Switch to light theme": "التبديل إلى المظهر الفاتح", + "Table of Contents": "جدول المحتويات", + "Text to PDF": "نص إلى PDF", + "TIFF to PDF": "TIFF إلى PDF", + "to close": "للإغلاق", + "to navigate": "للتنقل", + "to select": "للاختيار", + "Tools": "الأدوات", + "Tools Reference": "مرجع الأدوات", + "Unlock PDF": "إلغاء قفل PDF", + "Validate Signature": "التحقق من توقيع PDF", + "Vercel": "Vercel", + "View Metadata": "عرض البيانات الوصفية", + "VSD to PDF": "VSD إلى PDF", + "WebP to PDF": "WebP إلى PDF", + "Word to PDF": "Word إلى PDF", + "WPD to PDF": "WPD إلى PDF", + "WPS to PDF": "WPS إلى PDF", + "XML to PDF": "XML إلى PDF", + "XPS to PDF": "XPS إلى PDF" +} diff --git a/docs/.vitepress/i18n/be.json b/docs/.vitepress/i18n/be.json new file mode 100644 index 00000000..489d6272 --- /dev/null +++ b/docs/.vitepress/i18n/be.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Дадаць далучэнні", + "Add Blank Page": "Дадаць пустую старонку", + "Add Page Labels": "Дадаць пазнакі старонак", + "Add Stamps": "Дадаць штампы", + "Add Watermark": "Дадаць вадзяны знак", + "Adjust Colors": "Наладзіць колеры", + "Alternate & Mix Pages": "Чаргаваць і змяшаць старонкі", + "Apache": "Apache", + "Appearance": "Знешні выгляд", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Колер фону", + "Bates Numbering": "Нумарацыя Бейтса", + "BMP to PDF": "BMP у PDF", + "CBZ to PDF": "CBZ у PDF", + "Change language": "Змяніць мову", + "Change Permissions": "Змяніць дазволы", + "Change Text Color": "Змяніць колер тэксту", + "Close search": "Закрыць пошук", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Аб'яднаць у адну старонку", + "Commercial License": "Камерцыйная ліцэнзія", + "Compare PDFs": "Параўнаць PDF", + "Compress PDF": "Сціснуць PDF", + "Contributing": "Удзел у распрацоўцы", + "Convert from PDF": "Канвертацыя з PDF", + "Convert to PDF": "Канвертацыя ў PDF", + "Create PDF Form": "Стварыць форму PDF", + "Crop PDF": "Абрэзаць PDF", + "CSV to PDF": "CSV у PDF", + "Delete Pages": "Выдаліць старонкі", + "Deskew PDF": "Выпрастаць PDF", + "Digital Signature": "Лічбавы подпіс", + "Display detailed list": "Паказаць падрабязны спіс", + "Divide Pages": "Падзяліць старонкі", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Дакументацыя BentoPDF: бясплатны набор інструментаў PDF з адкрытым кодам і пашанай да прыватнасці", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Двайная ліцэнзія: AGPL-3.0 і камерцыйная ліцэнзія.", + "Duplex Collate": "Сартаванне двухбаковага сканавання", + "Edit & Annotate": "Рэдагаванне і анатацыі", + "Edit Attachments": "Рэдагаваць далучэнні", + "Edit Bookmarks": "Рэдагаваць закладкі", + "Edit Metadata": "Рэдагаваць метаданыя", + "Email to PDF": "Email у PDF", + "EPUB to PDF": "EPUB у PDF", + "Excel to PDF": "Excel у PDF", + "Extract Attachments": "Выняць далучэнні", + "Extract Images": "Выняць відарысы", + "Extract Pages": "Выняць старонкі", + "Extract Tables": "Выняць табліцы", + "FB2 to PDF": "FB2 у PDF", + "Fix Page Size": "Уніфікаваць памер старонак", + "Flatten PDF": "Звесці PDF", + "Font to Outline": "Шрыфт у контуры", + "Getting Started": "Пачатак працы", + "Guide": "Кіраўніцтва", + "Header & Footer": "Верхні і ніжні калантытул", + "HEIC to PDF": "HEIC у PDF", + "Home": "Галоўная", + "Hostinger": "Hostinger", + "Images to PDF": "Відарысы ў PDF", + "Invert Colors": "Інвертаваць колеры", + "JPG to PDF": "JPG у PDF", + "JSON to PDF": "JSON у PDF", + "Linearize PDF": "Зрабіць лінейны PDF", + "Markdown to PDF": "Markdown у PDF", + "Menu": "Меню", + "Merge PDF": "Аб'яднаць PDF", + "MOBI to PDF": "MOBI у PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Наступная старонка", + "Nginx": "Nginx", + "No results for": "Няма вынікаў для", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG у PDF", + "ODP to PDF": "ODP у PDF", + "ODS to PDF": "ODS у PDF", + "ODT to PDF": "ODT у PDF", + "On this page": "На гэтай старонцы", + "Optimize & Repair": "Аптымізацыя і аднаўленне", + "Organize & Duplicate": "Арганізацыя і дубліраванне", + "Organize & Manage": "Арганізацыя і кіраванне", + "Overview": "Агляд", + "Page Dimensions": "Памеры старонкі", + "Page Numbers": "Нумары старонак", + "PDF Booklet": "Буклет PDF", + "PDF Editor": "Рэдактар PDF", + "PDF Form Filler": "Запоўніць форму PDF", + "PDF Multi Tool": "Мультыінструмент PDF", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDF у BMP", + "PDF to CBZ": "PDF у CBZ", + "PDF to CSV": "PDF у CSV", + "PDF to Excel": "PDF у Excel", + "PDF to Greyscale": "PDF у градацыі шэрага", + "PDF to JPG": "PDF у JPG", + "PDF to JSON": "PDF у JSON", + "PDF to Markdown": "PDF у Markdown", + "PDF to PDF/A": "PDF у PDF/A", + "PDF to PNG": "PDF у PNG", + "PDF to SVG": "PDF у SVG", + "PDF to Text": "PDF у тэкст", + "PDF to TIFF": "PDF у TIFF", + "PDF to WebP": "PDF у WebP", + "PDF to Word": "PDF у Word", + "PDF Workflow Builder": "Канструктар рабочага працэсу PDF", + "PDFs to ZIP": "PDF у ZIP", + "PNG to PDF": "PNG у PDF", + "Posterize PDF": "Пераўтварыць у постэр", + "PowerPoint to PDF": "PowerPoint у PDF", + "Prepare PDF for AI": "Падрыхтаваць PDF для ШI", + "Previous page": "Папярэдняя старонка", + "Protect PDF": "Абараніць PDF", + "PSD to PDF": "PSD у PDF", + "PUB to PDF": "PUB у PDF", + "Rasterize PDF": "Растарызаваць PDF", + "Remove Annotations": "Выдаліць анатацыі", + "Remove Blank Pages": "Выдаліць пустыя старонкі", + "Remove Metadata": "Выдаліць метаданыя", + "Remove Restrictions": "Выдаліць абмежаванні", + "Repair PDF": "Аднавіць PDF", + "Reset search": "Скінуць пошук", + "Return to top": "Вярнуцца ўгару", + "Reverse Pages": "Адваротны парадак старонак", + "Rotate by Custom Degrees": "Павярнуць на зададзены вугал", + "Rotate PDF": "Павярнуць PDF", + "RTF to PDF": "RTF у PDF", + "Sanitize PDF": "Ачысціць PDF", + "Scanner Effect": "Эфект сканера", + "Search": "Пошук", + "Secure PDF": "Бяспека PDF", + "Self-Hosting": "Уласны хостынг", + "Self-Hosting Guide": "Кіраўніцтва па ўласным хостынгу", + "Sign PDF": "Падпісаць PDF", + "Skip to content": "Перайсці да зместу", + "Split PDF": "Падзяліць PDF", + "SVG to PDF": "SVG у PDF", + "Switch to dark theme": "Уключыць цёмную тэму", + "Switch to light theme": "Уключыць светлую тэму", + "Table of Contents": "Змест", + "Text to PDF": "Тэкст у PDF", + "TIFF to PDF": "TIFF у PDF", + "to close": "каб закрыць", + "to navigate": "для навігацыі", + "to select": "каб выбраць", + "Tools": "Інструменты", + "Tools Reference": "Даведнік па інструментах", + "Unlock PDF": "Разблакаваць PDF", + "Validate Signature": "Праверыць подпіс", + "Vercel": "Vercel", + "View Metadata": "Праглядзець метаданыя", + "VSD to PDF": "VSD у PDF", + "WebP to PDF": "WebP у PDF", + "Word to PDF": "Word у PDF", + "WPD to PDF": "WPD у PDF", + "WPS to PDF": "WPS у PDF", + "XML to PDF": "XML у PDF", + "XPS to PDF": "XPS у PDF" +} diff --git a/docs/.vitepress/i18n/ca.json b/docs/.vitepress/i18n/ca.json new file mode 100644 index 00000000..ed2e3f3d --- /dev/null +++ b/docs/.vitepress/i18n/ca.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Afegeix fitxers adjunts", + "Add Blank Page": "Afegeix una pàgina en blanc", + "Add Page Labels": "Afegeix etiquetes de pàgina", + "Add Stamps": "Afegeix segells", + "Add Watermark": "Afegeix una marca d'aigua", + "Adjust Colors": "Ajusta els colors", + "Alternate & Mix Pages": "Alterna i barreja pàgines", + "Apache": "Apache", + "Appearance": "Aparença", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Color de fons", + "Bates Numbering": "Numeració Bates", + "BMP to PDF": "BMP a PDF", + "CBZ to PDF": "CBZ a PDF", + "Change language": "Canvia l'idioma", + "Change Permissions": "Canvia els permisos", + "Change Text Color": "Canvia el color del text", + "Close search": "Tanca la cerca", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Combina en una única pàgina", + "Commercial License": "Llicència comercial", + "Compare PDFs": "Compara PDF", + "Compress PDF": "Comprimeix PDF", + "Contributing": "Contribuir", + "Convert from PDF": "Converteix des de PDF", + "Convert to PDF": "Converteix a PDF", + "Create PDF Form": "Crea un formulari PDF", + "Crop PDF": "Retalla PDF", + "CSV to PDF": "CSV a PDF", + "Delete Pages": "Suprimeix pàgines", + "Deskew PDF": "Redreça PDF", + "Digital Signature": "Signatura digital de PDF", + "Display detailed list": "Mostra la llista detallada", + "Divide Pages": "Divideix pàgines", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Documentació de BentoPDF: el conjunt d'eines PDF gratuït, de codi obert i pensat per protegir la privadesa", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Doble llicència: AGPL-3.0 i llicència comercial.", + "Duplex Collate": "Ordena les cares d'un escaneig a doble cara", + "Edit & Annotate": "Edita i anota", + "Edit Attachments": "Edita els fitxers adjunts", + "Edit Bookmarks": "Edita els marcadors", + "Edit Metadata": "Edita les metadades", + "Email to PDF": "Correu electrònic a PDF", + "EPUB to PDF": "EPUB a PDF", + "Excel to PDF": "Excel a PDF", + "Extract Attachments": "Extreu fitxers adjunts", + "Extract Images": "Extreu imatges", + "Extract Pages": "Extreu pàgines", + "Extract Tables": "Extreu taules de PDF", + "FB2 to PDF": "FB2 a PDF", + "Fix Page Size": "Uniformitza la mida de pàgina", + "Flatten PDF": "Aplana PDF", + "Font to Outline": "Converteix tipus de lletra en contorns", + "Getting Started": "Primers passos", + "Guide": "Guia", + "Header & Footer": "Capçalera i peu de pàgina", + "HEIC to PDF": "HEIC a PDF", + "Home": "Inici", + "Hostinger": "Hostinger", + "Images to PDF": "Imatges a PDF", + "Invert Colors": "Inverteix els colors", + "JPG to PDF": "JPG a PDF", + "JSON to PDF": "JSON a PDF", + "Linearize PDF": "Linealitza PDF", + "Markdown to PDF": "Markdown a PDF", + "Menu": "Menú", + "Merge PDF": "Fusiona PDF", + "MOBI to PDF": "MOBI a PDF", + "N-Up PDF": "PDF amb diverses pàgines per full", + "Netlify": "Netlify", + "Next page": "Pàgina següent", + "Nginx": "Nginx", + "No results for": "Cap resultat per a", + "OCR PDF": "Reconeixement OCR de PDF", + "ODG to PDF": "ODG a PDF", + "ODP to PDF": "ODP a PDF", + "ODS to PDF": "ODS a PDF", + "ODT to PDF": "ODT a PDF", + "On this page": "En aquesta pàgina", + "Optimize & Repair": "Optimitza i repara", + "Organize & Duplicate": "Duplica i organitza", + "Organize & Manage": "Organitza i gestiona", + "Overview": "Visió general", + "Page Dimensions": "Dimensions de pàgina", + "Page Numbers": "Números de pàgina", + "PDF Booklet": "Fullet PDF", + "PDF Editor": "Editor de PDF", + "PDF Form Filler": "Emplena formularis PDF", + "PDF Multi Tool": "Eina PDF multifunció", + "PDF OCG": "Capes OCG del PDF", + "PDF to BMP": "PDF a BMP", + "PDF to CBZ": "PDF a CBZ", + "PDF to CSV": "PDF a CSV", + "PDF to Excel": "PDF a Excel", + "PDF to Greyscale": "PDF a escala de grisos", + "PDF to JPG": "PDF a JPG", + "PDF to JSON": "PDF a JSON", + "PDF to Markdown": "PDF a Markdown", + "PDF to PDF/A": "PDF a PDF/A", + "PDF to PNG": "PDF a PNG", + "PDF to SVG": "PDF a SVG", + "PDF to Text": "PDF a text", + "PDF to TIFF": "PDF a TIFF", + "PDF to WebP": "PDF a WebP", + "PDF to Word": "PDF a Word", + "PDF Workflow Builder": "Creador de fluxos de treball PDF", + "PDFs to ZIP": "PDF a ZIP", + "PNG to PDF": "PNG a PDF", + "Posterize PDF": "Divideix PDF en format pòster", + "PowerPoint to PDF": "PowerPoint a PDF", + "Prepare PDF for AI": "Prepara PDF per a IA", + "Previous page": "Pàgina anterior", + "Protect PDF": "Protegeix PDF", + "PSD to PDF": "PSD a PDF", + "PUB to PDF": "PUB a PDF", + "Rasterize PDF": "Rasteritza PDF", + "Remove Annotations": "Elimina les anotacions", + "Remove Blank Pages": "Elimina les pàgines en blanc", + "Remove Metadata": "Elimina les metadades", + "Remove Restrictions": "Elimina les restriccions", + "Repair PDF": "Repara PDF", + "Reset search": "Restableix la cerca", + "Return to top": "Torna a dalt", + "Reverse Pages": "Inverteix l'ordre de les pàgines", + "Rotate by Custom Degrees": "Gira amb un angle personalitzat", + "Rotate PDF": "Gira PDF", + "RTF to PDF": "RTF a PDF", + "Sanitize PDF": "Neteja PDF", + "Scanner Effect": "Efecte d'escàner", + "Search": "Cerca", + "Secure PDF": "Xifra PDF", + "Self-Hosting": "Autoallotjament", + "Self-Hosting Guide": "Guia d'autoallotjament", + "Sign PDF": "Signa PDF", + "Skip to content": "Vés al contingut", + "Split PDF": "Divideix PDF", + "SVG to PDF": "SVG a PDF", + "Switch to dark theme": "Canvia al tema fosc", + "Switch to light theme": "Canvia al tema clar", + "Table of Contents": "Taula de continguts", + "Text to PDF": "Text a PDF", + "TIFF to PDF": "TIFF a PDF", + "to close": "per tancar", + "to navigate": "per navegar", + "to select": "per seleccionar", + "Tools": "Eines", + "Tools Reference": "Referència d'eines", + "Unlock PDF": "Desbloqueja PDF", + "Validate Signature": "Valida la signatura d'un PDF", + "Vercel": "Vercel", + "View Metadata": "Visualitza les metadades", + "VSD to PDF": "VSD a PDF", + "WebP to PDF": "WebP a PDF", + "Word to PDF": "Word a PDF", + "WPD to PDF": "WPD a PDF", + "WPS to PDF": "WPS a PDF", + "XML to PDF": "XML a PDF", + "XPS to PDF": "XPS a PDF" +} diff --git a/docs/.vitepress/i18n/da.json b/docs/.vitepress/i18n/da.json new file mode 100644 index 00000000..dd05d0df --- /dev/null +++ b/docs/.vitepress/i18n/da.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Tilføj vedhæftninger", + "Add Blank Page": "Tilføj tom side", + "Add Page Labels": "Tilføj sideetiketter", + "Add Stamps": "Tilføj stempler", + "Add Watermark": "Tilføj vandmærke", + "Adjust Colors": "Justér farver", + "Alternate & Mix Pages": "Alternér og miks sider", + "Apache": "Apache", + "Appearance": "Udseende", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Baggrundsfarve", + "Bates Numbering": "Bates-nummerering", + "BMP to PDF": "BMP til PDF", + "CBZ to PDF": "CBZ til PDF", + "Change language": "Skift sprog", + "Change Permissions": "Skift tilladelser", + "Change Text Color": "Skift tekstfarve", + "Close search": "Luk søgning", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Kombinér til én side", + "Commercial License": "Kommerciel licens", + "Compare PDFs": "Sammenlign PDF’er", + "Compress PDF": "Komprimer PDF", + "Contributing": "Bidrag", + "Convert from PDF": "Konvertér fra PDF", + "Convert to PDF": "Konvertér til PDF", + "Create PDF Form": "Opret PDF-formular", + "Crop PDF": "Beskær PDF", + "CSV to PDF": "CSV til PDF", + "Delete Pages": "Slet sider", + "Deskew PDF": "Ret skæve sider", + "Digital Signature": "Digital signatur", + "Display detailed list": "Vis detaljeret liste", + "Divide Pages": "Opdel sider", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Dokumentation for BentoPDF: Den gratis, open source PDF-værktøjskasse med privatliv i første række", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Dobbelt licenseret under AGPL-3.0 og Kommerciel licens.", + "Duplex Collate": "Sortér dupleks-scanning", + "Edit & Annotate": "Redigér og annotér", + "Edit Attachments": "Redigér vedhæftninger", + "Edit Bookmarks": "Redigér bogmærker", + "Edit Metadata": "Redigér metadata", + "Email to PDF": "E-mail til PDF", + "EPUB to PDF": "EPUB til PDF", + "Excel to PDF": "Excel til PDF", + "Extract Attachments": "Udtræk vedhæftninger", + "Extract Images": "Udtræk billeder", + "Extract Pages": "Udtræk sider", + "Extract Tables": "Udtræk tabeller", + "FB2 to PDF": "FB2 til PDF", + "Fix Page Size": "Ret sidestørrelse", + "Flatten PDF": "Fladgør PDF", + "Font to Outline": "Skrifttype til kontur", + "Getting Started": "Kom i gang", + "Guide": "Guide", + "Header & Footer": "Sidehoved og sidefod", + "HEIC to PDF": "HEIC til PDF", + "Home": "Hjem", + "Hostinger": "Hostinger", + "Images to PDF": "Billeder til PDF", + "Invert Colors": "Invertér farver", + "JPG to PDF": "JPG til PDF", + "JSON to PDF": "JSON til PDF", + "Linearize PDF": "Lineariser PDF", + "Markdown to PDF": "Markdown til PDF", + "Menu": "Menu", + "Merge PDF": "Flet PDF", + "MOBI to PDF": "MOBI til PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Næste side", + "Nginx": "Nginx", + "No results for": "Ingen resultater for", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG til PDF", + "ODP to PDF": "ODP til PDF", + "ODS to PDF": "ODS til PDF", + "ODT to PDF": "ODT til PDF", + "On this page": "På denne side", + "Optimize & Repair": "Optimér og reparér", + "Organize & Duplicate": "Organisér og dupliker", + "Organize & Manage": "Organisér og administrér", + "Overview": "Oversigt", + "Page Dimensions": "Sidestørrelser", + "Page Numbers": "Sidetal", + "PDF Booklet": "PDF-hæfte", + "PDF Editor": "PDF-editor", + "PDF Form Filler": "PDF-formularudfylder", + "PDF Multi Tool": "PDF-multiværktøj", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDF til BMP", + "PDF to CBZ": "PDF til CBZ", + "PDF to CSV": "PDF til CSV", + "PDF to Excel": "PDF til Excel", + "PDF to Greyscale": "PDF til gråtoner", + "PDF to JPG": "PDF til JPG", + "PDF to JSON": "PDF til JSON", + "PDF to Markdown": "PDF til Markdown", + "PDF to PDF/A": "PDF til PDF/A", + "PDF to PNG": "PDF til PNG", + "PDF to SVG": "PDF til SVG", + "PDF to Text": "PDF til tekst", + "PDF to TIFF": "PDF til TIFF", + "PDF to WebP": "PDF til WebP", + "PDF to Word": "PDF til Word", + "PDF Workflow Builder": "PDF-workflowbygger", + "PDFs to ZIP": "PDF’er til ZIP", + "PNG to PDF": "PNG til PDF", + "Posterize PDF": "Posterisér PDF", + "PowerPoint to PDF": "PowerPoint til PDF", + "Prepare PDF for AI": "Forbered PDF til AI", + "Previous page": "Forrige side", + "Protect PDF": "Beskyt PDF", + "PSD to PDF": "PSD til PDF", + "PUB to PDF": "PUB til PDF", + "Rasterize PDF": "Rasterisér PDF", + "Remove Annotations": "Fjern annotationer", + "Remove Blank Pages": "Fjern tomme sider", + "Remove Metadata": "Fjern metadata", + "Remove Restrictions": "Fjern begrænsninger", + "Repair PDF": "Reparér PDF", + "Reset search": "Nulstil søgning", + "Return to top": "Tilbage til toppen", + "Reverse Pages": "Vend sider", + "Rotate by Custom Degrees": "Roter med brugerdefineret vinkel", + "Rotate PDF": "Roter PDF", + "RTF to PDF": "RTF til PDF", + "Sanitize PDF": "Rens PDF", + "Scanner Effect": "Scannereffekt", + "Search": "Søg", + "Secure PDF": "Sikr PDF", + "Self-Hosting": "Selvhosting", + "Self-Hosting Guide": "Guide til selvhosting", + "Sign PDF": "Underskriv PDF", + "Skip to content": "Gå til indhold", + "Split PDF": "Opdel PDF", + "SVG to PDF": "SVG til PDF", + "Switch to dark theme": "Skift til mørkt tema", + "Switch to light theme": "Skift til lyst tema", + "Table of Contents": "Indholdsfortegnelse", + "Text to PDF": "Tekst til PDF", + "TIFF to PDF": "TIFF til PDF", + "to close": "for at lukke", + "to navigate": "for at navigere", + "to select": "for at vælge", + "Tools": "Værktøjer", + "Tools Reference": "Værktøjsreference", + "Unlock PDF": "Lås PDF op", + "Validate Signature": "Validér signatur", + "Vercel": "Vercel", + "View Metadata": "Vis metadata", + "VSD to PDF": "VSD til PDF", + "WebP to PDF": "WebP til PDF", + "Word to PDF": "Word til PDF", + "WPD to PDF": "WPD til PDF", + "WPS to PDF": "WPS til PDF", + "XML to PDF": "XML til PDF", + "XPS to PDF": "XPS til PDF" +} diff --git a/docs/.vitepress/i18n/de.json b/docs/.vitepress/i18n/de.json new file mode 100644 index 00000000..37cd45c9 --- /dev/null +++ b/docs/.vitepress/i18n/de.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Anhänge hinzufügen", + "Add Blank Page": "Leere Seite hinzufügen", + "Add Page Labels": "Seitenbeschriftungen hinzufügen", + "Add Stamps": "Stempel hinzufügen", + "Add Watermark": "Wasserzeichen hinzufügen", + "Adjust Colors": "Farben anpassen", + "Alternate & Mix Pages": "Seiten abwechselnd mischen", + "Apache": "Apache", + "Appearance": "Darstellung", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Hintergrundfarbe", + "Bates Numbering": "Bates-Nummerierung", + "BMP to PDF": "BMP zu PDF", + "CBZ to PDF": "CBZ zu PDF", + "Change language": "Sprache ändern", + "Change Permissions": "Berechtigungen ändern", + "Change Text Color": "Textfarbe ändern", + "Close search": "Suche schließen", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Zu einer Seite kombinieren", + "Commercial License": "Kommerzielle Lizenz", + "Compare PDFs": "PDFs vergleichen", + "Compress PDF": "PDF komprimieren", + "Contributing": "Mitwirken", + "Convert from PDF": "Aus PDF konvertieren", + "Convert to PDF": "In PDF konvertieren", + "Create PDF Form": "PDF-Formular erstellen", + "Crop PDF": "PDF zuschneiden", + "CSV to PDF": "CSV zu PDF", + "Delete Pages": "Seiten löschen", + "Deskew PDF": "PDF entzerren", + "Digital Signature": "Digitale PDF-Signatur", + "Display detailed list": "Detaillierte Liste anzeigen", + "Divide Pages": "Seiten teilen", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Dokumentation für BentoPDF: das kostenlose Open-Source-PDF-Toolkit mit Fokus auf Privatsphäre", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Doppelt lizenziert unter AGPL-3.0 und kommerzieller Lizenz.", + "Duplex Collate": "Duplex-Zusammenführung", + "Edit & Annotate": "Bearbeiten & Annotieren", + "Edit Attachments": "Anhänge bearbeiten", + "Edit Bookmarks": "Lesezeichen bearbeiten", + "Edit Metadata": "Metadaten bearbeiten", + "Email to PDF": "E-Mail zu PDF", + "EPUB to PDF": "EPUB zu PDF", + "Excel to PDF": "Excel zu PDF", + "Extract Attachments": "Anhänge extrahieren", + "Extract Images": "Bilder extrahieren", + "Extract Pages": "Seiten extrahieren", + "Extract Tables": "PDF-Tabellen extrahieren", + "FB2 to PDF": "FB2 zu PDF", + "Fix Page Size": "Seitengröße reparieren", + "Flatten PDF": "PDF reduzieren", + "Font to Outline": "Schriftart zu Umriss", + "Getting Started": "Erste Schritte", + "Guide": "Anleitung", + "Header & Footer": "Kopf- & Fußzeile", + "HEIC to PDF": "HEIC zu PDF", + "Home": "Startseite", + "Hostinger": "Hostinger", + "Images to PDF": "Bilder zu PDF", + "Invert Colors": "Farben invertieren", + "JPG to PDF": "JPG zu PDF", + "JSON to PDF": "JSON zu PDF", + "Linearize PDF": "PDF linearisieren", + "Markdown to PDF": "Markdown zu PDF", + "Menu": "Menü", + "Merge PDF": "PDF zusammenführen", + "MOBI to PDF": "MOBI zu PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Nächste Seite", + "Nginx": "Nginx", + "No results for": "Keine Ergebnisse für", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG zu PDF", + "ODP to PDF": "ODP zu PDF", + "ODS to PDF": "ODS zu PDF", + "ODT to PDF": "ODT zu PDF", + "On this page": "Auf dieser Seite", + "Optimize & Repair": "Optimieren & Reparieren", + "Organize & Duplicate": "Duplizieren & Organisieren", + "Organize & Manage": "Organisieren & Verwalten", + "Overview": "Übersicht", + "Page Dimensions": "Seitenmaße", + "Page Numbers": "Seitenzahlen", + "PDF Booklet": "PDF-Broschüre", + "PDF Editor": "PDF-Editor", + "PDF Form Filler": "PDF-Formular ausfüllen", + "PDF Multi Tool": "PDF-Multitool", + "PDF OCG": "PDF-Ebenen (OCG)", + "PDF to BMP": "PDF zu BMP", + "PDF to CBZ": "PDF zu CBZ", + "PDF to CSV": "PDF zu CSV", + "PDF to Excel": "PDF zu Excel", + "PDF to Greyscale": "PDF zu Graustufen", + "PDF to JPG": "PDF zu JPG", + "PDF to JSON": "PDF zu JSON", + "PDF to Markdown": "PDF zu Markdown", + "PDF to PDF/A": "PDF zu PDF/A", + "PDF to PNG": "PDF zu PNG", + "PDF to SVG": "PDF zu SVG", + "PDF to Text": "PDF zu Text", + "PDF to TIFF": "PDF zu TIFF", + "PDF to WebP": "PDF zu WebP", + "PDF to Word": "PDF zu Word", + "PDF Workflow Builder": "PDF-Workflow-Builder", + "PDFs to ZIP": "PDFs zu ZIP", + "PNG to PDF": "PNG zu PDF", + "Posterize PDF": "PDF posterisieren", + "PowerPoint to PDF": "PowerPoint zu PDF", + "Prepare PDF for AI": "PDF für KI vorbereiten", + "Previous page": "Vorherige Seite", + "Protect PDF": "PDF schützen", + "PSD to PDF": "PSD zu PDF", + "PUB to PDF": "PUB zu PDF", + "Rasterize PDF": "PDF rastern", + "Remove Annotations": "Annotationen entfernen", + "Remove Blank Pages": "Leere Seiten entfernen", + "Remove Metadata": "Metadaten entfernen", + "Remove Restrictions": "Beschränkungen entfernen", + "Repair PDF": "PDF reparieren", + "Reset search": "Suche zurücksetzen", + "Return to top": "Zurück nach oben", + "Reverse Pages": "Seiten umkehren", + "Rotate by Custom Degrees": "Um benutzerdefinierte Grad drehen", + "Rotate PDF": "PDF drehen", + "RTF to PDF": "RTF zu PDF", + "Sanitize PDF": "PDF bereinigen", + "Scanner Effect": "Scanner-Effekt", + "Search": "Suchen", + "Secure PDF": "PDF sichern", + "Self-Hosting": "Selbst hosten", + "Self-Hosting Guide": "Anleitung zum Selbst-Hosting", + "Sign PDF": "PDF unterschreiben", + "Skip to content": "Zum Inhalt springen", + "Split PDF": "PDF teilen", + "SVG to PDF": "SVG zu PDF", + "Switch to dark theme": "Zum dunklen Design wechseln", + "Switch to light theme": "Zum hellen Design wechseln", + "Table of Contents": "Inhaltsverzeichnis", + "Text to PDF": "Text zu PDF", + "TIFF to PDF": "TIFF zu PDF", + "to close": "zum Schließen", + "to navigate": "zum Navigieren", + "to select": "zum Auswählen", + "Tools": "Werkzeuge", + "Tools Reference": "Werkzeugübersicht", + "Unlock PDF": "PDF entsperren", + "Validate Signature": "PDF-Signatur überprüfen", + "Vercel": "Vercel", + "View Metadata": "Metadaten anzeigen", + "VSD to PDF": "VSD zu PDF", + "WebP to PDF": "WebP zu PDF", + "Word to PDF": "Word zu PDF", + "WPD to PDF": "WPD zu PDF", + "WPS to PDF": "WPS zu PDF", + "XML to PDF": "XML zu PDF", + "XPS to PDF": "XPS zu PDF" +} diff --git a/docs/.vitepress/i18n/es.json b/docs/.vitepress/i18n/es.json new file mode 100644 index 00000000..fa1af2ad --- /dev/null +++ b/docs/.vitepress/i18n/es.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Agregar adjuntos", + "Add Blank Page": "Agregar página en blanco", + "Add Page Labels": "Agregar etiquetas de página", + "Add Stamps": "Agregar sellos", + "Add Watermark": "Agregar marca de agua", + "Adjust Colors": "Ajustar colores", + "Alternate & Mix Pages": "Alternar y mezclar páginas", + "Apache": "Apache", + "Appearance": "Apariencia", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Color de fondo", + "Bates Numbering": "Numeración Bates", + "BMP to PDF": "BMP a PDF", + "CBZ to PDF": "CBZ a PDF", + "Change language": "Cambiar idioma", + "Change Permissions": "Cambiar permisos", + "Change Text Color": "Cambiar color de texto", + "Close search": "Cerrar búsqueda", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Combinar en una sola página", + "Commercial License": "Licencia comercial", + "Compare PDFs": "Comparar PDFs", + "Compress PDF": "Comprimir PDF", + "Contributing": "Contribuir", + "Convert from PDF": "Convertir desde PDF", + "Convert to PDF": "Convertir a PDF", + "Create PDF Form": "Crear formulario PDF", + "Crop PDF": "Recortar PDF", + "CSV to PDF": "CSV a PDF", + "Delete Pages": "Eliminar páginas", + "Deskew PDF": "Enderezar PDF", + "Digital Signature": "Firma Digital PDF", + "Display detailed list": "Mostrar lista detallada", + "Divide Pages": "Dividir páginas", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Documentación de BentoPDF: el kit de herramientas PDF gratuito, de código abierto y centrado en la privacidad", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Con doble licencia: AGPL-3.0 y licencia comercial.", + "Duplex Collate": "Intercalar escaneo a doble cara", + "Edit & Annotate": "Editar y anotar", + "Edit Attachments": "Editar adjuntos", + "Edit Bookmarks": "Editar marcadores", + "Edit Metadata": "Editar metadatos", + "Email to PDF": "Email a PDF", + "EPUB to PDF": "EPUB a PDF", + "Excel to PDF": "Excel a PDF", + "Extract Attachments": "Extraer adjuntos", + "Extract Images": "Extraer imágenes", + "Extract Pages": "Extraer páginas", + "Extract Tables": "Extraer Tablas de PDF", + "FB2 to PDF": "FB2 a PDF", + "Fix Page Size": "Ajustar tamaño de página", + "Flatten PDF": "Aplanar PDF", + "Font to Outline": "Fuente a contorno", + "Getting Started": "Primeros pasos", + "Guide": "Guía", + "Header & Footer": "Encabezado y pie de página", + "HEIC to PDF": "HEIC a PDF", + "Home": "Inicio", + "Hostinger": "Hostinger", + "Images to PDF": "Imágenes a PDF", + "Invert Colors": "Invertir colores", + "JPG to PDF": "JPG a PDF", + "JSON to PDF": "JSON a PDF", + "Linearize PDF": "Linealizar PDF", + "Markdown to PDF": "Markdown a PDF", + "Menu": "Menú", + "Merge PDF": "Fusionar PDF", + "MOBI to PDF": "MOBI a PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Página siguiente", + "Nginx": "Nginx", + "No results for": "Sin resultados para", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG a PDF", + "ODP to PDF": "ODP a PDF", + "ODS to PDF": "ODS a PDF", + "ODT to PDF": "ODT a PDF", + "On this page": "En esta página", + "Optimize & Repair": "Optimizar y reparar", + "Organize & Duplicate": "Duplicar y Organizar", + "Organize & Manage": "Organizar y gestionar", + "Overview": "Resumen", + "Page Dimensions": "Dimensiones de página", + "Page Numbers": "Números de página", + "PDF Booklet": "Folleto PDF", + "PDF Editor": "Editor PDF", + "PDF Form Filler": "Rellenar formularios PDF", + "PDF Multi Tool": "Multiherramienta PDF", + "PDF OCG": "Capas PDF (OCG)", + "PDF to BMP": "PDF a BMP", + "PDF to CBZ": "PDF a CBZ", + "PDF to CSV": "PDF a CSV", + "PDF to Excel": "PDF a Excel", + "PDF to Greyscale": "PDF a escala de grises", + "PDF to JPG": "PDF a JPG", + "PDF to JSON": "PDF a JSON", + "PDF to Markdown": "PDF a Markdown", + "PDF to PDF/A": "PDF a PDF/A", + "PDF to PNG": "PDF a PNG", + "PDF to SVG": "PDF a SVG", + "PDF to Text": "PDF a texto", + "PDF to TIFF": "PDF a TIFF", + "PDF to WebP": "PDF a WebP", + "PDF to Word": "PDF a Word", + "PDF Workflow Builder": "Constructor de flujos de trabajo PDF", + "PDFs to ZIP": "PDFs a ZIP", + "PNG to PDF": "PNG a PDF", + "Posterize PDF": "Posterizar PDF", + "PowerPoint to PDF": "PowerPoint a PDF", + "Prepare PDF for AI": "Preparar PDF para IA", + "Previous page": "Página anterior", + "Protect PDF": "Proteger PDF", + "PSD to PDF": "PSD a PDF", + "PUB to PDF": "PUB a PDF", + "Rasterize PDF": "Rasterizar PDF", + "Remove Annotations": "Eliminar anotaciones", + "Remove Blank Pages": "Eliminar páginas en blanco", + "Remove Metadata": "Eliminar metadatos", + "Remove Restrictions": "Eliminar restricciones", + "Repair PDF": "Reparar PDF", + "Reset search": "Restablecer búsqueda", + "Return to top": "Volver arriba", + "Reverse Pages": "Invertir páginas", + "Rotate by Custom Degrees": "Rotar por grados personalizados", + "Rotate PDF": "Rotar PDF", + "RTF to PDF": "RTF a PDF", + "Sanitize PDF": "Sanear PDF", + "Scanner Effect": "Efecto escáner", + "Search": "Buscar", + "Secure PDF": "Proteger PDF", + "Self-Hosting": "Autoalojamiento", + "Self-Hosting Guide": "Guía de autoalojamiento", + "Sign PDF": "Firmar PDF", + "Skip to content": "Saltar al contenido", + "Split PDF": "Dividir PDF", + "SVG to PDF": "SVG a PDF", + "Switch to dark theme": "Cambiar al tema oscuro", + "Switch to light theme": "Cambiar al tema claro", + "Table of Contents": "Índice", + "Text to PDF": "Texto a PDF", + "TIFF to PDF": "TIFF a PDF", + "to close": "para cerrar", + "to navigate": "para navegar", + "to select": "para seleccionar", + "Tools": "Herramientas", + "Tools Reference": "Referencia de herramientas", + "Unlock PDF": "Desbloquear PDF", + "Validate Signature": "Validar Firma PDF", + "Vercel": "Vercel", + "View Metadata": "Ver metadatos", + "VSD to PDF": "VSD a PDF", + "WebP to PDF": "WebP a PDF", + "Word to PDF": "Word a PDF", + "WPD to PDF": "WPD a PDF", + "WPS to PDF": "WPS a PDF", + "XML to PDF": "XML a PDF", + "XPS to PDF": "XPS a PDF" +} diff --git a/docs/.vitepress/i18n/fa.json b/docs/.vitepress/i18n/fa.json new file mode 100644 index 00000000..f6641db2 --- /dev/null +++ b/docs/.vitepress/i18n/fa.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "افزودن پیوست", + "Add Blank Page": "افزودن صفحهٔ خالی", + "Add Page Labels": "افزودن برچسب صفحه", + "Add Stamps": "افزودن مهر", + "Add Watermark": "افزودن واترمارک", + "Adjust Colors": "تنظیم رنگ‌ها", + "Alternate & Mix Pages": "ادغام یک‌درمیان صفحات", + "Apache": "Apache", + "Appearance": "ظاهر", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "رنگ پس‌زمینه", + "Bates Numbering": "شماره‌گذاری Bates", + "BMP to PDF": "BMP به PDF", + "CBZ to PDF": "CBZ به PDF", + "Change language": "تغییر زبان", + "Change Permissions": "تغییر مجوزها", + "Change Text Color": "تغییر رنگ متن", + "Close search": "بستن جستجو", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "ترکیب در یک صفحه", + "Commercial License": "مجوز تجاری", + "Compare PDFs": "مقایسهٔ PDFها", + "Compress PDF": "فشرده‌سازی PDF", + "Contributing": "مشارکت", + "Convert from PDF": "تبدیل از PDF", + "Convert to PDF": "تبدیل به PDF", + "Create PDF Form": "ساخت فرم PDF", + "Crop PDF": "برش PDF", + "CSV to PDF": "CSV به PDF", + "Delete Pages": "حذف صفحات", + "Deskew PDF": "صاف‌کردن PDF", + "Digital Signature": "امضای دیجیتال", + "Display detailed list": "نمایش فهرست تفصیلی", + "Divide Pages": "تقسیم صفحات", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "مستندات BentoPDF، مجموعه ابزار PDF رایگان، متن‌باز و حریم‌خصوصی‌محور", + "Dual-licensed under AGPL-3.0 and Commercial License.": "دارای مجوز دوگانه: AGPL-3.0 و مجوز تجاری.", + "Duplex Collate": "تلفیق دورو", + "Edit & Annotate": "ویرایش و حاشیه‌نویسی", + "Edit Attachments": "ویرایش پیوست‌ها", + "Edit Bookmarks": "ویرایش نشانک‌ها", + "Edit Metadata": "ویرایش فراداده", + "Email to PDF": "ایمیل به PDF", + "EPUB to PDF": "EPUB به PDF", + "Excel to PDF": "Excel به PDF", + "Extract Attachments": "استخراج پیوست‌ها", + "Extract Images": "استخراج تصاویر", + "Extract Pages": "استخراج صفحات", + "Extract Tables": "استخراج جدول‌های PDF", + "FB2 to PDF": "FB2 به PDF", + "Fix Page Size": "اصلاح اندازهٔ صفحه", + "Flatten PDF": "مسطح‌سازی PDF", + "Font to Outline": "تبدیل قلم به خطوط برداری", + "Getting Started": "شروع کار", + "Guide": "راهنما", + "Header & Footer": "سرصفحه و پاصفحه", + "HEIC to PDF": "HEIC به PDF", + "Home": "خانه", + "Hostinger": "Hostinger", + "Images to PDF": "تصاویر به PDF", + "Invert Colors": "وارونه‌سازی رنگ‌ها", + "JPG to PDF": "JPG به PDF", + "JSON to PDF": "JSON به PDF", + "Linearize PDF": "خطی‌سازی PDF", + "Markdown to PDF": "Markdown به PDF", + "Menu": "منو", + "Merge PDF": "ادغام PDF", + "MOBI to PDF": "MOBI به PDF", + "N-Up PDF": "N-Up کردن PDF", + "Netlify": "Netlify", + "Next page": "صفحهٔ بعد", + "Nginx": "Nginx", + "No results for": "نتیجه‌ای یافت نشد برای", + "OCR PDF": "OCR روی PDF", + "ODG to PDF": "ODG به PDF", + "ODP to PDF": "ODP به PDF", + "ODS to PDF": "ODS به PDF", + "ODT to PDF": "ODT به PDF", + "On this page": "در این صفحه", + "Optimize & Repair": "بهینه‌سازی و ترمیم", + "Organize & Duplicate": "تکثیر و سازماندهی", + "Organize & Manage": "سازماندهی و مدیریت", + "Overview": "نمای کلی", + "Page Dimensions": "ابعاد صفحه", + "Page Numbers": "شماره‌گذاری صفحات", + "PDF Booklet": "دفترچهٔ PDF", + "PDF Editor": "ویرایشگر PDF", + "PDF Form Filler": "پرکنندهٔ فرم PDF", + "PDF Multi Tool": "ابزار چندکارهٔ PDF", + "PDF OCG": "لایه‌های OCG در PDF", + "PDF to BMP": "PDF به BMP", + "PDF to CBZ": "PDF به CBZ", + "PDF to CSV": "PDF به CSV", + "PDF to Excel": "PDF به Excel", + "PDF to Greyscale": "PDF به خاکستری", + "PDF to JPG": "PDF به JPG", + "PDF to JSON": "PDF به JSON", + "PDF to Markdown": "PDF به Markdown", + "PDF to PDF/A": "PDF به PDF/A", + "PDF to PNG": "PDF به PNG", + "PDF to SVG": "PDF به SVG", + "PDF to Text": "PDF به متن", + "PDF to TIFF": "PDF به TIFF", + "PDF to WebP": "PDF به WebP", + "PDF to Word": "PDF به Word", + "PDF Workflow Builder": "سازندهٔ گردش کار PDF", + "PDFs to ZIP": "PDFها به ZIP", + "PNG to PDF": "PNG به PDF", + "Posterize PDF": "پوستری‌کردن PDF", + "PowerPoint to PDF": "PowerPoint به PDF", + "Prepare PDF for AI": "آماده‌سازی PDF برای هوش مصنوعی", + "Previous page": "صفحهٔ قبل", + "Protect PDF": "محافظت از PDF", + "PSD to PDF": "PSD به PDF", + "PUB to PDF": "PUB به PDF", + "Rasterize PDF": "رستر کردن PDF", + "Remove Annotations": "حذف حاشیه‌نویسی‌ها", + "Remove Blank Pages": "حذف صفحات خالی", + "Remove Metadata": "حذف فراداده", + "Remove Restrictions": "حذف محدودیت‌ها", + "Repair PDF": "ترمیم PDF", + "Reset search": "بازنشانی جستجو", + "Return to top": "بازگشت به بالا", + "Reverse Pages": "وارونه‌سازی ترتیب صفحات", + "Rotate by Custom Degrees": "چرخاندن با زاویهٔ دلخواه", + "Rotate PDF": "چرخاندن PDF", + "RTF to PDF": "RTF به PDF", + "Sanitize PDF": "پاک‌سازی PDF", + "Scanner Effect": "جلوهٔ اسکنر", + "Search": "جستجو", + "Secure PDF": "ایمن‌سازی PDF", + "Self-Hosting": "میزبانی شخصی", + "Self-Hosting Guide": "راهنمای میزبانی شخصی", + "Sign PDF": "امضای PDF", + "Skip to content": "رفتن به محتوا", + "Split PDF": "تقسیم PDF", + "SVG to PDF": "SVG به PDF", + "Switch to dark theme": "تغییر به پوستهٔ تیره", + "Switch to light theme": "تغییر به پوستهٔ روشن", + "Table of Contents": "فهرست مطالب", + "Text to PDF": "متن به PDF", + "TIFF to PDF": "TIFF به PDF", + "to close": "برای بستن", + "to navigate": "برای پیمایش", + "to select": "برای انتخاب", + "Tools": "ابزارها", + "Tools Reference": "مرجع ابزارها", + "Unlock PDF": "باز کردن قفل PDF", + "Validate Signature": "اعتبارسنجی امضا", + "Vercel": "Vercel", + "View Metadata": "مشاهدهٔ فراداده", + "VSD to PDF": "VSD به PDF", + "WebP to PDF": "WebP به PDF", + "Word to PDF": "Word به PDF", + "WPD to PDF": "WPD به PDF", + "WPS to PDF": "WPS به PDF", + "XML to PDF": "XML به PDF", + "XPS to PDF": "XPS به PDF" +} diff --git a/docs/.vitepress/i18n/fr.json b/docs/.vitepress/i18n/fr.json new file mode 100644 index 00000000..2eb1f97d --- /dev/null +++ b/docs/.vitepress/i18n/fr.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Ajouter des pièces jointes", + "Add Blank Page": "Ajouter une page vierge", + "Add Page Labels": "Ajouter des étiquettes de page", + "Add Stamps": "Ajouter des tampons", + "Add Watermark": "Ajouter un filigrane", + "Adjust Colors": "Ajuster les couleurs", + "Alternate & Mix Pages": "Alterner et mélanger les pages", + "Apache": "Apache", + "Appearance": "Apparence", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Couleur de fond", + "Bates Numbering": "Numérotation Bates", + "BMP to PDF": "BMP vers PDF", + "CBZ to PDF": "CBZ vers PDF", + "Change language": "Changer de langue", + "Change Permissions": "Modifier les autorisations", + "Change Text Color": "Changer la couleur du texte", + "Close search": "Fermer la recherche", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Combiner en une seule page", + "Commercial License": "Licence commerciale", + "Compare PDFs": "Comparer des PDF", + "Compress PDF": "Compresser un PDF", + "Contributing": "Contribuer", + "Convert from PDF": "Convertir depuis PDF", + "Convert to PDF": "Convertir vers PDF", + "Create PDF Form": "Créer un formulaire PDF", + "Crop PDF": "Rogner un PDF", + "CSV to PDF": "CSV vers PDF", + "Delete Pages": "Supprimer des pages", + "Deskew PDF": "Redresser un PDF", + "Digital Signature": "Signature numérique PDF", + "Display detailed list": "Afficher la liste détaillée", + "Divide Pages": "Diviser les pages", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Documentation de BentoPDF : la boîte à outils PDF gratuite, open source et axée sur la confidentialité", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Double licence : AGPL-3.0 et licence commerciale.", + "Duplex Collate": "Assembler un scan recto/verso", + "Edit & Annotate": "Modifier et annoter", + "Edit Attachments": "Gérer les pièces jointes", + "Edit Bookmarks": "Modifier les signets", + "Edit Metadata": "Modifier les métadonnées", + "Email to PDF": "Email vers PDF", + "EPUB to PDF": "EPUB vers PDF", + "Excel to PDF": "Excel vers PDF", + "Extract Attachments": "Extraire les pièces jointes", + "Extract Images": "Extraire les images", + "Extract Pages": "Extraire des pages", + "Extract Tables": "Extraire les tableaux PDF", + "FB2 to PDF": "FB2 vers PDF", + "Fix Page Size": "Uniformiser la taille des pages", + "Flatten PDF": "Aplatir le PDF", + "Font to Outline": "Polices en contours", + "Getting Started": "Premiers pas", + "Guide": "Guide", + "Header & Footer": "En-tête et pied de page", + "HEIC to PDF": "HEIC vers PDF", + "Home": "Accueil", + "Hostinger": "Hostinger", + "Images to PDF": "Images vers PDF", + "Invert Colors": "Inverser les couleurs", + "JPG to PDF": "JPG vers PDF", + "JSON to PDF": "JSON vers PDF", + "Linearize PDF": "Optimiser pour le web", + "Markdown to PDF": "Markdown vers PDF", + "Menu": "Menu", + "Merge PDF": "Fusionner des PDF", + "MOBI to PDF": "MOBI vers PDF", + "N-Up PDF": "PDF N-up", + "Netlify": "Netlify", + "Next page": "Page suivante", + "Nginx": "Nginx", + "No results for": "Aucun résultat pour", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG vers PDF", + "ODP to PDF": "ODP vers PDF", + "ODS to PDF": "ODS vers PDF", + "ODT to PDF": "ODT vers PDF", + "On this page": "Sur cette page", + "Optimize & Repair": "Optimiser et réparer", + "Organize & Duplicate": "Dupliquer et organiser", + "Organize & Manage": "Organiser et gérer", + "Overview": "Vue d’ensemble", + "Page Dimensions": "Dimensions des pages", + "Page Numbers": "Numéros de page", + "PDF Booklet": "Livret PDF", + "PDF Editor": "Éditeur PDF", + "PDF Form Filler": "Remplir un formulaire PDF", + "PDF Multi Tool": "Outil PDF tout-en-un", + "PDF OCG": "Calques PDF (OCG)", + "PDF to BMP": "PDF vers BMP", + "PDF to CBZ": "PDF vers CBZ", + "PDF to CSV": "PDF vers CSV", + "PDF to Excel": "PDF vers Excel", + "PDF to Greyscale": "PDF en niveaux de gris", + "PDF to JPG": "PDF vers JPG", + "PDF to JSON": "PDF vers JSON", + "PDF to Markdown": "PDF vers Markdown", + "PDF to PDF/A": "PDF vers PDF/A", + "PDF to PNG": "PDF vers PNG", + "PDF to SVG": "PDF vers SVG", + "PDF to Text": "PDF vers texte", + "PDF to TIFF": "PDF vers TIFF", + "PDF to WebP": "PDF vers WebP", + "PDF to Word": "PDF vers Word", + "PDF Workflow Builder": "Constructeur de workflow PDF", + "PDFs to ZIP": "PDF vers ZIP", + "PNG to PDF": "PNG vers PDF", + "Posterize PDF": "Posteriser un PDF", + "PowerPoint to PDF": "PowerPoint vers PDF", + "Prepare PDF for AI": "Préparer le PDF pour l'IA", + "Previous page": "Page précédente", + "Protect PDF": "Protéger un PDF", + "PSD to PDF": "PSD vers PDF", + "PUB to PDF": "PUB vers PDF", + "Rasterize PDF": "Rastériser le PDF", + "Remove Annotations": "Supprimer les annotations", + "Remove Blank Pages": "Supprimer les pages blanches", + "Remove Metadata": "Supprimer les métadonnées", + "Remove Restrictions": "Supprimer les restrictions", + "Repair PDF": "Réparer un PDF", + "Reset search": "Réinitialiser la recherche", + "Return to top": "Retour en haut", + "Reverse Pages": "Inverser l’ordre des pages", + "Rotate by Custom Degrees": "Rotation par angle personnalisé", + "Rotate PDF": "Faire pivoter un PDF", + "RTF to PDF": "RTF vers PDF", + "Sanitize PDF": "Nettoyer un PDF", + "Scanner Effect": "Effet scanner", + "Search": "Rechercher", + "Secure PDF": "Sécuriser un PDF", + "Self-Hosting": "Auto-hébergement", + "Self-Hosting Guide": "Guide d’auto-hébergement", + "Sign PDF": "Signer un PDF", + "Skip to content": "Aller au contenu", + "Split PDF": "Scinder un PDF", + "SVG to PDF": "SVG vers PDF", + "Switch to dark theme": "Passer au thème sombre", + "Switch to light theme": "Passer au thème clair", + "Table of Contents": "Table des matières", + "Text to PDF": "Texte vers PDF", + "TIFF to PDF": "TIFF vers PDF", + "to close": "pour fermer", + "to navigate": "pour naviguer", + "to select": "pour sélectionner", + "Tools": "Outils", + "Tools Reference": "Référence des outils", + "Unlock PDF": "Déverrouiller un PDF", + "Validate Signature": "Valider la signature PDF", + "Vercel": "Vercel", + "View Metadata": "Afficher les métadonnées", + "VSD to PDF": "VSD vers PDF", + "WebP to PDF": "WebP vers PDF", + "Word to PDF": "Word vers PDF", + "WPD to PDF": "WPD vers PDF", + "WPS to PDF": "WPS vers PDF", + "XML to PDF": "XML vers PDF", + "XPS to PDF": "XPS vers PDF" +} diff --git a/docs/.vitepress/i18n/id.json b/docs/.vitepress/i18n/id.json new file mode 100644 index 00000000..0c93f659 --- /dev/null +++ b/docs/.vitepress/i18n/id.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Tambah Lampiran", + "Add Blank Page": "Tambah Halaman Kosong", + "Add Page Labels": "Tambahkan label halaman", + "Add Stamps": "Tambah Stempel", + "Add Watermark": "Tambah Watermark", + "Adjust Colors": "Sesuaikan Warna", + "Alternate & Mix Pages": "Selang-seling & Campur Halaman", + "Apache": "Apache", + "Appearance": "Tampilan", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Warna Latar Belakang", + "Bates Numbering": "Penomoran Bates", + "BMP to PDF": "BMP ke PDF", + "CBZ to PDF": "CBZ ke PDF", + "Change language": "Ubah bahasa", + "Change Permissions": "Ubah Izin", + "Change Text Color": "Ubah Warna Teks", + "Close search": "Tutup pencarian", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Gabung ke Halaman Tunggal", + "Commercial License": "Lisensi Komersial", + "Compare PDFs": "Bandingkan PDF", + "Compress PDF": "Kompres PDF", + "Contributing": "Berkontribusi", + "Convert from PDF": "Konversi dari PDF", + "Convert to PDF": "Konversi ke PDF", + "Create PDF Form": "Buat Formulir PDF", + "Crop PDF": "Potong PDF", + "CSV to PDF": "CSV ke PDF", + "Delete Pages": "Hapus Halaman", + "Deskew PDF": "Luruskan PDF", + "Digital Signature": "Tanda Tangan Digital", + "Display detailed list": "Tampilkan daftar terperinci", + "Divide Pages": "Bagi Halaman", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Dokumentasi BentoPDF - Toolkit PDF gratis, sumber terbuka, dan mengutamakan privasi", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Berlisensi ganda di bawah AGPL-3.0 dan Lisensi Komersial.", + "Duplex Collate": "Susun Ulang Pindaian Dupleks", + "Edit & Annotate": "Edit & Anotasi", + "Edit Attachments": "Edit Lampiran", + "Edit Bookmarks": "Edit Bookmark", + "Edit Metadata": "Edit Metadata", + "Email to PDF": "Email ke PDF", + "EPUB to PDF": "EPUB ke PDF", + "Excel to PDF": "Excel ke PDF", + "Extract Attachments": "Ekstrak Lampiran", + "Extract Images": "Ekstrak Gambar", + "Extract Pages": "Ekstrak Halaman", + "Extract Tables": "Ekstrak Tabel PDF", + "FB2 to PDF": "FB2 ke PDF", + "Fix Page Size": "Perbaiki Ukuran Halaman", + "Flatten PDF": "Ratakan PDF", + "Font to Outline": "Font ke Garis Tepi", + "Getting Started": "Memulai", + "Guide": "Panduan", + "Header & Footer": "Kepala & Kaki Halaman", + "HEIC to PDF": "HEIC ke PDF", + "Home": "Beranda", + "Hostinger": "Hostinger", + "Images to PDF": "Gambar ke PDF", + "Invert Colors": "Balik Warna", + "JPG to PDF": "JPG ke PDF", + "JSON to PDF": "JSON ke PDF", + "Linearize PDF": "Linierisasi PDF", + "Markdown to PDF": "Markdown ke PDF", + "Menu": "Menu", + "Merge PDF": "Gabung PDF", + "MOBI to PDF": "MOBI ke PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Halaman berikutnya", + "Nginx": "Nginx", + "No results for": "Tidak ada hasil untuk", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG ke PDF", + "ODP to PDF": "ODP ke PDF", + "ODS to PDF": "ODS ke PDF", + "ODT to PDF": "ODT ke PDF", + "On this page": "Di halaman ini", + "Optimize & Repair": "Optimalkan & Perbaiki", + "Organize & Duplicate": "Duplikat & Atur", + "Organize & Manage": "Atur & Kelola", + "Overview": "Ringkasan", + "Page Dimensions": "Dimensi Halaman", + "Page Numbers": "Nomor Halaman", + "PDF Booklet": "Buku Kecil PDF", + "PDF Editor": "Editor PDF", + "PDF Form Filler": "Pengisi Formulir PDF", + "PDF Multi Tool": "Alat Multi PDF", + "PDF OCG": "Lapisan PDF (OCG)", + "PDF to BMP": "PDF ke BMP", + "PDF to CBZ": "PDF ke CBZ", + "PDF to CSV": "PDF ke CSV", + "PDF to Excel": "PDF ke Excel", + "PDF to Greyscale": "PDF ke Skala Abu-abu", + "PDF to JPG": "PDF ke JPG", + "PDF to JSON": "PDF ke JSON", + "PDF to Markdown": "PDF ke Markdown", + "PDF to PDF/A": "PDF ke PDF/A", + "PDF to PNG": "PDF ke PNG", + "PDF to SVG": "PDF ke SVG", + "PDF to Text": "PDF ke Teks", + "PDF to TIFF": "PDF ke TIFF", + "PDF to WebP": "PDF ke WebP", + "PDF to Word": "PDF ke Word", + "PDF Workflow Builder": "Pembangun Alur Kerja PDF", + "PDFs to ZIP": "PDF ke ZIP", + "PNG to PDF": "PNG ke PDF", + "Posterize PDF": "Posterisasi PDF", + "PowerPoint to PDF": "PowerPoint ke PDF", + "Prepare PDF for AI": "Siapkan PDF untuk AI", + "Previous page": "Halaman sebelumnya", + "Protect PDF": "Lindungi PDF", + "PSD to PDF": "PSD ke PDF", + "PUB to PDF": "PUB ke PDF", + "Rasterize PDF": "Rasterisasi PDF", + "Remove Annotations": "Hapus Anotasi", + "Remove Blank Pages": "Hapus Halaman Kosong", + "Remove Metadata": "Hapus Metadata", + "Remove Restrictions": "Hapus Pembatasan", + "Repair PDF": "Perbaiki PDF", + "Reset search": "Atur ulang pencarian", + "Return to top": "Kembali ke atas", + "Reverse Pages": "Balik Halaman", + "Rotate by Custom Degrees": "Putar dengan Derajat Kustom", + "Rotate PDF": "Putar PDF", + "RTF to PDF": "RTF ke PDF", + "Sanitize PDF": "Sanitasi PDF", + "Scanner Effect": "Efek Pemindai", + "Search": "Cari", + "Secure PDF": "Amankan PDF", + "Self-Hosting": "Hosting Mandiri", + "Self-Hosting Guide": "Panduan Hosting Mandiri", + "Sign PDF": "Tanda Tangan PDF", + "Skip to content": "Lewati ke konten", + "Split PDF": "Pisah PDF", + "SVG to PDF": "SVG ke PDF", + "Switch to dark theme": "Beralih ke tema gelap", + "Switch to light theme": "Beralih ke tema terang", + "Table of Contents": "Daftar Isi", + "Text to PDF": "Teks ke PDF", + "TIFF to PDF": "TIFF ke PDF", + "to close": "untuk menutup", + "to navigate": "untuk bernavigasi", + "to select": "untuk memilih", + "Tools": "Alat", + "Tools Reference": "Referensi Alat", + "Unlock PDF": "Buka Kunci PDF", + "Validate Signature": "Validasi Tanda Tangan PDF", + "Vercel": "Vercel", + "View Metadata": "Lihat Metadata", + "VSD to PDF": "VSD ke PDF", + "WebP to PDF": "WebP ke PDF", + "Word to PDF": "Word ke PDF", + "WPD to PDF": "WPD ke PDF", + "WPS to PDF": "WPS ke PDF", + "XML to PDF": "XML ke PDF", + "XPS to PDF": "XPS ke PDF" +} diff --git a/docs/.vitepress/i18n/it.json b/docs/.vitepress/i18n/it.json new file mode 100644 index 00000000..c49c2f8f --- /dev/null +++ b/docs/.vitepress/i18n/it.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Aggiungi allegati", + "Add Blank Page": "Aggiungi pagina vuota", + "Add Page Labels": "Aggiungi etichette di pagina", + "Add Stamps": "Aggiungi timbri", + "Add Watermark": "Aggiungi filigrana", + "Adjust Colors": "Regola colori", + "Alternate & Mix Pages": "Alterna e mescola pagine", + "Apache": "Apache", + "Appearance": "Aspetto", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Colore di sfondo", + "Bates Numbering": "Numerazione Bates", + "BMP to PDF": "BMP in PDF", + "CBZ to PDF": "CBZ in PDF", + "Change language": "Cambia lingua", + "Change Permissions": "Modifica permessi", + "Change Text Color": "Cambia colore testo", + "Close search": "Chiudi la ricerca", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Combina in una pagina", + "Commercial License": "Licenza commerciale", + "Compare PDFs": "Confronta PDF", + "Compress PDF": "Comprimi PDF", + "Contributing": "Contribuire", + "Convert from PDF": "Converti da PDF", + "Convert to PDF": "Converti in PDF", + "Create PDF Form": "Crea modulo PDF", + "Crop PDF": "Ritaglia PDF", + "CSV to PDF": "CSV in PDF", + "Delete Pages": "Elimina pagine", + "Deskew PDF": "Raddrizza PDF", + "Digital Signature": "Firma digitale", + "Display detailed list": "Mostra elenco dettagliato", + "Divide Pages": "Dividi pagine", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Documentazione di BentoPDF: il toolkit PDF gratuito, open source e attento alla privacy", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Doppia licenza: AGPL-3.0 e Licenza commerciale.", + "Duplex Collate": "Fascicola scansione fronte/retro", + "Edit & Annotate": "Modifica e annota", + "Edit Attachments": "Modifica allegati", + "Edit Bookmarks": "Modifica segnalibri", + "Edit Metadata": "Modifica metadati", + "Email to PDF": "Email in PDF", + "EPUB to PDF": "EPUB in PDF", + "Excel to PDF": "Excel in PDF", + "Extract Attachments": "Estrai allegati", + "Extract Images": "Estrai immagini", + "Extract Pages": "Estrai pagine", + "Extract Tables": "Estrai tabelle", + "FB2 to PDF": "FB2 in PDF", + "Fix Page Size": "Correggi dimensione pagina", + "Flatten PDF": "Appiattisci PDF", + "Font to Outline": "Font in contorni", + "Getting Started": "Per iniziare", + "Guide": "Guida", + "Header & Footer": "Intestazione e piè di pagina", + "HEIC to PDF": "HEIC in PDF", + "Home": "Home", + "Hostinger": "Hostinger", + "Images to PDF": "Immagini in PDF", + "Invert Colors": "Inverti colori", + "JPG to PDF": "JPG in PDF", + "JSON to PDF": "JSON in PDF", + "Linearize PDF": "Linearizza PDF", + "Markdown to PDF": "Markdown in PDF", + "Menu": "Menu", + "Merge PDF": "Unisci PDF", + "MOBI to PDF": "MOBI in PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Pagina successiva", + "Nginx": "Nginx", + "No results for": "Nessun risultato per", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG in PDF", + "ODP to PDF": "ODP in PDF", + "ODS to PDF": "ODS in PDF", + "ODT to PDF": "ODT in PDF", + "On this page": "In questa pagina", + "Optimize & Repair": "Ottimizza e ripara", + "Organize & Duplicate": "Organizza e duplica", + "Organize & Manage": "Organizza e gestisci", + "Overview": "Panoramica", + "Page Dimensions": "Dimensioni pagina", + "Page Numbers": "Numeri di pagina", + "PDF Booklet": "Opuscolo PDF", + "PDF Editor": "Editor PDF", + "PDF Form Filler": "Compilatore moduli PDF", + "PDF Multi Tool": "Strumento PDF multifunzione", + "PDF OCG": "Livelli PDF (OCG)", + "PDF to BMP": "PDF in BMP", + "PDF to CBZ": "PDF in CBZ", + "PDF to CSV": "PDF in CSV", + "PDF to Excel": "PDF in Excel", + "PDF to Greyscale": "PDF in scala di grigi", + "PDF to JPG": "PDF in JPG", + "PDF to JSON": "PDF in JSON", + "PDF to Markdown": "PDF in Markdown", + "PDF to PDF/A": "PDF in PDF/A", + "PDF to PNG": "PDF in PNG", + "PDF to SVG": "PDF in SVG", + "PDF to Text": "PDF in Testo", + "PDF to TIFF": "PDF in TIFF", + "PDF to WebP": "PDF in WebP", + "PDF to Word": "PDF in Word", + "PDF Workflow Builder": "Costruttore di workflow PDF", + "PDFs to ZIP": "PDF in ZIP", + "PNG to PDF": "PNG in PDF", + "Posterize PDF": "Posterizza PDF", + "PowerPoint to PDF": "PowerPoint in PDF", + "Prepare PDF for AI": "Prepara PDF per IA", + "Previous page": "Pagina precedente", + "Protect PDF": "Proteggi PDF", + "PSD to PDF": "PSD in PDF", + "PUB to PDF": "PUB in PDF", + "Rasterize PDF": "Rasterizza PDF", + "Remove Annotations": "Rimuovi annotazioni", + "Remove Blank Pages": "Rimuovi pagine vuote", + "Remove Metadata": "Rimuovi metadati", + "Remove Restrictions": "Rimuovi restrizioni", + "Repair PDF": "Ripara PDF", + "Reset search": "Reimposta la ricerca", + "Return to top": "Torna su", + "Reverse Pages": "Inverti pagine", + "Rotate by Custom Degrees": "Ruota di gradi personalizzati", + "Rotate PDF": "Ruota PDF", + "RTF to PDF": "RTF in PDF", + "Sanitize PDF": "Sanitizza PDF", + "Scanner Effect": "Effetto scanner", + "Search": "Cerca", + "Secure PDF": "Proteggi PDF", + "Self-Hosting": "Self-hosting", + "Self-Hosting Guide": "Guida al self-hosting", + "Sign PDF": "Firma PDF", + "Skip to content": "Vai al contenuto", + "Split PDF": "Dividi PDF", + "SVG to PDF": "SVG in PDF", + "Switch to dark theme": "Passa al tema scuro", + "Switch to light theme": "Passa al tema chiaro", + "Table of Contents": "Indice", + "Text to PDF": "Testo in PDF", + "TIFF to PDF": "TIFF in PDF", + "to close": "per chiudere", + "to navigate": "per navigare", + "to select": "per selezionare", + "Tools": "Strumenti", + "Tools Reference": "Riferimento degli strumenti", + "Unlock PDF": "Sblocca PDF", + "Validate Signature": "Convalida firma", + "Vercel": "Vercel", + "View Metadata": "Visualizza metadati", + "VSD to PDF": "VSD in PDF", + "WebP to PDF": "WebP in PDF", + "Word to PDF": "Word in PDF", + "WPD to PDF": "WPD in PDF", + "WPS to PDF": "WPS in PDF", + "XML to PDF": "XML in PDF", + "XPS to PDF": "XPS in PDF" +} diff --git a/docs/.vitepress/i18n/ja.json b/docs/.vitepress/i18n/ja.json new file mode 100644 index 00000000..7ddffdf9 --- /dev/null +++ b/docs/.vitepress/i18n/ja.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "添付ファイルの追加", + "Add Blank Page": "空白ページの追加", + "Add Page Labels": "ページラベルの追加", + "Add Stamps": "スタンプの追加", + "Add Watermark": "透かしの追加", + "Adjust Colors": "色の調整", + "Alternate & Mix Pages": "ページの交互結合と混合", + "Apache": "Apache", + "Appearance": "外観", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "背景色", + "Bates Numbering": "通し番号付け", + "BMP to PDF": "BMPからPDF", + "CBZ to PDF": "CBZからPDF", + "Change language": "言語を変更", + "Change Permissions": "権限の変更", + "Change Text Color": "テキストの色の変更", + "Close search": "検索を閉じる", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "単一ページに結合", + "Commercial License": "商用ライセンス", + "Compare PDFs": "PDFの比較", + "Compress PDF": "PDFの圧縮", + "Contributing": "コントリビュート", + "Convert from PDF": "PDFから変換", + "Convert to PDF": "PDFに変換", + "Create PDF Form": "PDFフォームの作成", + "Crop PDF": "PDFのトリミング", + "CSV to PDF": "CSVからPDF", + "Delete Pages": "ページの削除", + "Deskew PDF": "PDFの傾き補正", + "Digital Signature": "PDFへの電子署名", + "Display detailed list": "詳細リストを表示", + "Divide Pages": "ページの分割", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "BentoPDFのドキュメント: 無料でオープンソース、プライバシーを第一に考えたPDFツールキット", + "Dual-licensed under AGPL-3.0 and Commercial License.": "AGPL-3.0と商用ライセンスのデュアルライセンスです。", + "Duplex Collate": "両面スキャンの並べ替え", + "Edit & Annotate": "編集と注釈", + "Edit Attachments": "添付ファイルの編集", + "Edit Bookmarks": "しおりの編集", + "Edit Metadata": "メタデータの編集", + "Email to PDF": "電子メールからPDF", + "EPUB to PDF": "EPUBからPDF", + "Excel to PDF": "ExcelからPDF", + "Extract Attachments": "添付ファイルの抽出", + "Extract Images": "画像の抽出", + "Extract Pages": "ページの抽出", + "Extract Tables": "PDFテーブルの抽出", + "FB2 to PDF": "FB2からPDF", + "Fix Page Size": "ページサイズを固定", + "Flatten PDF": "PDFの平坦化", + "Font to Outline": "フォントをアウトライン化", + "Getting Started": "はじめに", + "Guide": "ガイド", + "Header & Footer": "ヘッダーとフッター", + "HEIC to PDF": "HEICからPDF", + "Home": "ホーム", + "Hostinger": "Hostinger", + "Images to PDF": "画像からPDF", + "Invert Colors": "色の反転", + "JPG to PDF": "JPGからPDF", + "JSON to PDF": "JSONからPDF", + "Linearize PDF": "PDFの線形化", + "Markdown to PDF": "マークダウンからPDF", + "Menu": "メニュー", + "Merge PDF": "PDFの結合", + "MOBI to PDF": "MOBIからPDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "次のページ", + "Nginx": "Nginx", + "No results for": "次の検索結果はありません:", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODGからPDF", + "ODP to PDF": "ODPからPDF", + "ODS to PDF": "ODSからPDF", + "ODT to PDF": "ODTからPDF", + "On this page": "このページの内容", + "Optimize & Repair": "最適化と修復", + "Organize & Duplicate": "複製と整理", + "Organize & Manage": "整理と管理", + "Overview": "概要", + "Page Dimensions": "ページ寸法", + "Page Numbers": "ページ番号", + "PDF Booklet": "PDFブックレット", + "PDF Editor": "PDFエディター", + "PDF Form Filler": "PDFフォーム入力機能", + "PDF Multi Tool": "PDFマルチツール", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDFからBMP", + "PDF to CBZ": "PDFからCBZ", + "PDF to CSV": "PDFからCSV", + "PDF to Excel": "PDFからExcel", + "PDF to Greyscale": "PDFのグレースケール化", + "PDF to JPG": "PDFからJPG", + "PDF to JSON": "PDFからJSON", + "PDF to Markdown": "PDFからマークダウン", + "PDF to PDF/A": "PDFからPDF/A", + "PDF to PNG": "PDFからPNG", + "PDF to SVG": "PDFからSVG", + "PDF to Text": "PDFからテキスト", + "PDF to TIFF": "PDFからTIFF", + "PDF to WebP": "PDFからWebP", + "PDF to Word": "PDFからWord", + "PDF Workflow Builder": "PDFワークフロービルダー", + "PDFs to ZIP": "PDFからZIP", + "PNG to PDF": "PNGからPDF", + "Posterize PDF": "PDFのポスタライズ", + "PowerPoint to PDF": "PowerPointからPDF", + "Prepare PDF for AI": "AI用のPDFを準備する", + "Previous page": "前のページ", + "Protect PDF": "PDFの保護", + "PSD to PDF": "PSDからPDF", + "PUB to PDF": "PUBからPDF", + "Rasterize PDF": "PDFの画像化", + "Remove Annotations": "注釈の削除", + "Remove Blank Pages": "空白ページの削除", + "Remove Metadata": "メタデータの削除", + "Remove Restrictions": "制限の解除", + "Repair PDF": "PDFの修復", + "Reset search": "検索をリセット", + "Return to top": "トップに戻る", + "Reverse Pages": "ページの反転", + "Rotate by Custom Degrees": "任意の角度で回転", + "Rotate PDF": "PDFの回転", + "RTF to PDF": "RTFからPDF", + "Sanitize PDF": "PDFをサニタイズ", + "Scanner Effect": "スキャナー効果", + "Search": "検索", + "Secure PDF": "PDFのセキュリティ", + "Self-Hosting": "セルフホスティング", + "Self-Hosting Guide": "セルフホスティングガイド", + "Sign PDF": "PDFへ署名", + "Skip to content": "コンテンツへスキップ", + "Split PDF": "PDFの分割", + "SVG to PDF": "SVGからPDF", + "Switch to dark theme": "ダークテーマに切り替え", + "Switch to light theme": "ライトテーマに切り替え", + "Table of Contents": "目次", + "Text to PDF": "テキストからPDF", + "TIFF to PDF": "TIFFからPDF", + "to close": "閉じる", + "to navigate": "移動", + "to select": "選択", + "Tools": "ツール", + "Tools Reference": "ツールリファレンス", + "Unlock PDF": "PDFのロック解除", + "Validate Signature": "PDF署名を検証する", + "Vercel": "Vercel", + "View Metadata": "メタデータの表示", + "VSD to PDF": "VSDからPDF", + "WebP to PDF": "WebPからPDF", + "Word to PDF": "WordからPDF", + "WPD to PDF": "WPDからPDF", + "WPS to PDF": "WPSからPDF", + "XML to PDF": "XMLからPDF", + "XPS to PDF": "XPSからPDF" +} diff --git a/docs/.vitepress/i18n/ko.json b/docs/.vitepress/i18n/ko.json new file mode 100644 index 00000000..70f0fffa --- /dev/null +++ b/docs/.vitepress/i18n/ko.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "첨부파일 추가", + "Add Blank Page": "빈 페이지 추가", + "Add Page Labels": "페이지 레이블 추가", + "Add Stamps": "도장 추가", + "Add Watermark": "워터마크 추가", + "Adjust Colors": "색상 조정", + "Alternate & Mix Pages": "페이지 교차 병합", + "Apache": "Apache", + "Appearance": "모양", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "배경색 변경", + "Bates Numbering": "베이츠 번호 매기기", + "BMP to PDF": "BMP를 PDF로", + "CBZ to PDF": "CBZ를 PDF로", + "Change language": "언어 변경", + "Change Permissions": "권한 변경", + "Change Text Color": "텍스트 색상 변경", + "Close search": "검색 닫기", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "한 페이지로 합치기", + "Commercial License": "상용 라이선스", + "Compare PDFs": "PDF 비교", + "Compress PDF": "PDF 압축", + "Contributing": "기여하기", + "Convert from PDF": "PDF에서 변환", + "Convert to PDF": "PDF로 변환", + "Create PDF Form": "PDF 양식 만들기", + "Crop PDF": "PDF 자르기", + "CSV to PDF": "CSV를 PDF로", + "Delete Pages": "페이지 삭제", + "Deskew PDF": "PDF 기울기 보정", + "Digital Signature": "PDF 디지털 서명", + "Display detailed list": "자세한 목록 표시", + "Divide Pages": "페이지 분할", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "BentoPDF 문서 - 무료 오픈소스, 개인정보 보호 중심 PDF 도구 모음", + "Dual-licensed under AGPL-3.0 and Commercial License.": "AGPL-3.0과 상용 라이선스의 이중 라이선스로 제공됩니다.", + "Duplex Collate": "양면 스캔 정렬", + "Edit & Annotate": "편집 및 주석", + "Edit Attachments": "첨부파일 편집", + "Edit Bookmarks": "북마크 편집", + "Edit Metadata": "메타데이터 편집", + "Email to PDF": "이메일을 PDF로", + "EPUB to PDF": "EPUB를 PDF로", + "Excel to PDF": "Excel을 PDF로", + "Extract Attachments": "첨부파일 추출", + "Extract Images": "이미지 추출", + "Extract Pages": "페이지 추출", + "Extract Tables": "PDF 표 추출", + "FB2 to PDF": "FB2를 PDF로", + "Fix Page Size": "페이지 크기 통일", + "Flatten PDF": "PDF 평탄화", + "Font to Outline": "폰트 윤곽선 변환", + "Getting Started": "시작하기", + "Guide": "가이드", + "Header & Footer": "머리글 및 바닥글", + "HEIC to PDF": "HEIC를 PDF로", + "Home": "홈", + "Hostinger": "Hostinger", + "Images to PDF": "이미지를 PDF로", + "Invert Colors": "색상 반전", + "JPG to PDF": "JPG를 PDF로", + "JSON to PDF": "JSON을 PDF로", + "Linearize PDF": "PDF 선형화", + "Markdown to PDF": "Markdown을 PDF로", + "Menu": "메뉴", + "Merge PDF": "PDF 병합", + "MOBI to PDF": "MOBI를 PDF로", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "다음 페이지", + "Nginx": "Nginx", + "No results for": "검색 결과 없음:", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG를 PDF로", + "ODP to PDF": "ODP를 PDF로", + "ODS to PDF": "ODS를 PDF로", + "ODT to PDF": "ODT를 PDF로", + "On this page": "이 페이지의 내용", + "Optimize & Repair": "최적화 및 복구", + "Organize & Duplicate": "복제 및 정리", + "Organize & Manage": "정리 및 관리", + "Overview": "개요", + "Page Dimensions": "페이지 크기 정보", + "Page Numbers": "페이지 번호", + "PDF Booklet": "PDF 소책자", + "PDF Editor": "PDF 편집기", + "PDF Form Filler": "PDF 양식 작성", + "PDF Multi Tool": "PDF 멀티 도구", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDF를 BMP로", + "PDF to CBZ": "PDF를 CBZ로", + "PDF to CSV": "PDF를 CSV로", + "PDF to Excel": "PDF를 Excel로", + "PDF to Greyscale": "PDF 흑백 변환", + "PDF to JPG": "PDF를 JPG로", + "PDF to JSON": "PDF를 JSON으로", + "PDF to Markdown": "PDF를 Markdown으로", + "PDF to PDF/A": "PDF를 PDF/A로", + "PDF to PNG": "PDF를 PNG로", + "PDF to SVG": "PDF를 SVG로", + "PDF to Text": "PDF를 텍스트로", + "PDF to TIFF": "PDF를 TIFF로", + "PDF to WebP": "PDF를 WebP로", + "PDF to Word": "PDF를 Word로", + "PDF Workflow Builder": "PDF 워크플로우 빌더", + "PDFs to ZIP": "PDF를 ZIP으로", + "PNG to PDF": "PNG를 PDF로", + "Posterize PDF": "PDF 포스터화", + "PowerPoint to PDF": "PowerPoint를 PDF로", + "Prepare PDF for AI": "AI용 PDF 준비", + "Previous page": "이전 페이지", + "Protect PDF": "PDF 보호", + "PSD to PDF": "PSD를 PDF로", + "PUB to PDF": "PUB를 PDF로", + "Rasterize PDF": "PDF 래스터화", + "Remove Annotations": "주석 제거", + "Remove Blank Pages": "빈 페이지 제거", + "Remove Metadata": "메타데이터 제거", + "Remove Restrictions": "제한 해제", + "Repair PDF": "PDF 복구", + "Reset search": "검색 초기화", + "Return to top": "맨 위로", + "Reverse Pages": "페이지 역순 정렬", + "Rotate by Custom Degrees": "사용자 지정 각도 회전", + "Rotate PDF": "PDF 회전", + "RTF to PDF": "RTF를 PDF로", + "Sanitize PDF": "PDF 정리", + "Scanner Effect": "스캔 효과", + "Search": "검색", + "Secure PDF": "PDF 보안", + "Self-Hosting": "자체 호스팅", + "Self-Hosting Guide": "자체 호스팅 가이드", + "Sign PDF": "PDF 서명", + "Skip to content": "본문으로 건너뛰기", + "Split PDF": "PDF 분할", + "SVG to PDF": "SVG를 PDF로", + "Switch to dark theme": "다크 테마로 전환", + "Switch to light theme": "라이트 테마로 전환", + "Table of Contents": "목차 생성", + "Text to PDF": "텍스트를 PDF로", + "TIFF to PDF": "TIFF를 PDF로", + "to close": "닫기", + "to navigate": "이동", + "to select": "선택", + "Tools": "도구", + "Tools Reference": "도구 참조", + "Unlock PDF": "PDF 잠금 해제", + "Validate Signature": "PDF 서명 검증", + "Vercel": "Vercel", + "View Metadata": "메타데이터 보기", + "VSD to PDF": "VSD를 PDF로", + "WebP to PDF": "WebP를 PDF로", + "Word to PDF": "Word를 PDF로", + "WPD to PDF": "WPD를 PDF로", + "WPS to PDF": "WPS를 PDF로", + "XML to PDF": "XML을 PDF로", + "XPS to PDF": "XPS를 PDF로" +} diff --git a/docs/.vitepress/i18n/nl.json b/docs/.vitepress/i18n/nl.json new file mode 100644 index 00000000..10240bf0 --- /dev/null +++ b/docs/.vitepress/i18n/nl.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Bijlagen toevoegen", + "Add Blank Page": "Blanco pagina toevoegen", + "Add Page Labels": "Paginalabels toevoegen", + "Add Stamps": "Stempels toevoegen", + "Add Watermark": "Watermerk toevoegen", + "Adjust Colors": "Kleuren aanpassen", + "Alternate & Mix Pages": "Pagina's afwisselen en mixen", + "Apache": "Apache", + "Appearance": "Weergave", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Achtergrondkleur", + "Bates Numbering": "Bates-nummering", + "BMP to PDF": "BMP naar PDF", + "CBZ to PDF": "CBZ naar PDF", + "Change language": "Taal wijzigen", + "Change Permissions": "Rechten aanpassen", + "Change Text Color": "Tekstkleur", + "Close search": "Zoeken sluiten", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Combineren tot één pagina", + "Commercial License": "Commerciële licentie", + "Compare PDFs": "PDF's vergelijken", + "Compress PDF": "PDF comprimeren", + "Contributing": "Bijdragen", + "Convert from PDF": "Converteren van PDF", + "Convert to PDF": "Converteren naar PDF", + "Create PDF Form": "PDF-formulier aanmaken", + "Crop PDF": "PDF bijsnijden", + "CSV to PDF": "CSV naar PDF", + "Delete Pages": "Pagina's verwijderen", + "Deskew PDF": "PDF rechttrekken", + "Digital Signature": "Digitale handtekening", + "Display detailed list": "Gedetailleerde lijst tonen", + "Divide Pages": "Pagina's opdelen", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Documentatie voor BentoPDF - De gratis, open-source PDF-toolkit met privacy voorop", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Dubbel gelicentieerd onder AGPL-3.0 en een commerciële licentie.", + "Duplex Collate": "Dubbelzijdige scan sorteren", + "Edit & Annotate": "Bewerken & Annoteren", + "Edit Attachments": "Bijlagen bewerken", + "Edit Bookmarks": "Bladwijzers bewerken", + "Edit Metadata": "Metadata bewerken", + "Email to PDF": "E-mail naar PDF", + "EPUB to PDF": "EPUB naar PDF", + "Excel to PDF": "Excel naar PDF", + "Extract Attachments": "Bijlagen extraheren", + "Extract Images": "Afbeeldingen extraheren", + "Extract Pages": "Pagina's extraheren", + "Extract Tables": "PDF-tabellen Extraheren", + "FB2 to PDF": "FB2 naar PDF", + "Fix Page Size": "Paginagrootte corrigeren", + "Flatten PDF": "PDF platmaken", + "Font to Outline": "Lettertype naar contouren", + "Getting Started": "Aan de slag", + "Guide": "Gids", + "Header & Footer": "Koptekst en voettekst", + "HEIC to PDF": "HEIC naar PDF", + "Home": "Startpagina", + "Hostinger": "Hostinger", + "Images to PDF": "Afbeelding naar PDF", + "Invert Colors": "Kleuren omkeren", + "JPG to PDF": "JPG naar PDF", + "JSON to PDF": "JSON naar PDF", + "Linearize PDF": "PDF lineariseren", + "Markdown to PDF": "Markdown naar PDF", + "Menu": "Menu", + "Merge PDF": "PDF samenvoegen", + "MOBI to PDF": "MOBI naar PDF", + "N-Up PDF": "N-up PDF", + "Netlify": "Netlify", + "Next page": "Volgende pagina", + "Nginx": "Nginx", + "No results for": "Geen resultaten voor", + "OCR PDF": "PDF OCR", + "ODG to PDF": "ODG naar PDF", + "ODP to PDF": "ODP naar PDF", + "ODS to PDF": "ODS naar PDF", + "ODT to PDF": "ODT naar PDF", + "On this page": "Op deze pagina", + "Optimize & Repair": "Optimaliseren & Repareren", + "Organize & Duplicate": "Dupliceren & Organiseren", + "Organize & Manage": "Organiseren & Beheren", + "Overview": "Overzicht", + "Page Dimensions": "Paginaafmetingen", + "Page Numbers": "Paginanummers", + "PDF Booklet": "PDF-boekje", + "PDF Editor": "PDF bewerken", + "PDF Form Filler": "PDF-formulier invullen", + "PDF Multi Tool": "PDF-multitool", + "PDF OCG": "PDF-lagen (OCG)", + "PDF to BMP": "PDF naar BMP", + "PDF to CBZ": "PDF naar CBZ", + "PDF to CSV": "PDF naar CSV", + "PDF to Excel": "PDF naar Excel", + "PDF to Greyscale": "PDF naar grijswaarden", + "PDF to JPG": "PDF naar JPG", + "PDF to JSON": "PDF naar JSON", + "PDF to Markdown": "PDF naar Markdown", + "PDF to PDF/A": "PDF naar PDF/A", + "PDF to PNG": "PDF naar PNG", + "PDF to SVG": "PDF naar SVG", + "PDF to Text": "PDF naar tekst", + "PDF to TIFF": "PDF naar TIFF", + "PDF to WebP": "PDF naar WebP", + "PDF to Word": "PDF naar Word", + "PDF Workflow Builder": "PDF-workflowbouwer", + "PDFs to ZIP": "PDF's naar ZIP", + "PNG to PDF": "PNG naar PDF", + "Posterize PDF": "PDF-poster", + "PowerPoint to PDF": "PowerPoint naar PDF", + "Prepare PDF for AI": "PDF voorbereiden voor AI", + "Previous page": "Vorige pagina", + "Protect PDF": "PDF beveiligen", + "PSD to PDF": "PSD naar PDF", + "PUB to PDF": "PUB naar PDF", + "Rasterize PDF": "PDF rasteren", + "Remove Annotations": "Annotaties verwijderen", + "Remove Blank Pages": "Blanco pagina's verwijderen", + "Remove Metadata": "Metadata verwijderen", + "Remove Restrictions": "Beperkingen verwijderen", + "Repair PDF": "PDF repareren", + "Reset search": "Zoekopdracht wissen", + "Return to top": "Terug naar boven", + "Reverse Pages": "Paginavolgorde omkeren", + "Rotate by Custom Degrees": "Roteren met aangepaste hoek", + "Rotate PDF": "PDF roteren", + "RTF to PDF": "RTF naar PDF", + "Sanitize PDF": "PDF opschonen", + "Scanner Effect": "Scannereffect", + "Search": "Zoeken", + "Secure PDF": "PDF Beveiligen", + "Self-Hosting": "Zelf hosten", + "Self-Hosting Guide": "Gids voor zelf hosten", + "Sign PDF": "PDF ondertekenen", + "Skip to content": "Naar inhoud springen", + "Split PDF": "PDF splitsen", + "SVG to PDF": "SVG naar PDF", + "Switch to dark theme": "Overschakelen naar donker thema", + "Switch to light theme": "Overschakelen naar licht thema", + "Table of Contents": "Inhoudsopgave", + "Text to PDF": "Tekst naar PDF", + "TIFF to PDF": "TIFF naar PDF", + "to close": "om te sluiten", + "to navigate": "om te navigeren", + "to select": "om te selecteren", + "Tools": "Tools", + "Tools Reference": "Toolsoverzicht", + "Unlock PDF": "PDF ontgrendelen", + "Validate Signature": "PDF-handtekening Valideren", + "Vercel": "Vercel", + "View Metadata": "Metadata weergeven", + "VSD to PDF": "VSD naar PDF", + "WebP to PDF": "WebP naar PDF", + "Word to PDF": "Word naar PDF", + "WPD to PDF": "WPD naar PDF", + "WPS to PDF": "WPS naar PDF", + "XML to PDF": "XML naar PDF", + "XPS to PDF": "XPS naar PDF" +} diff --git a/docs/.vitepress/i18n/pl.json b/docs/.vitepress/i18n/pl.json new file mode 100644 index 00000000..e715eda3 --- /dev/null +++ b/docs/.vitepress/i18n/pl.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Dodaj załączniki", + "Add Blank Page": "Dodaj pustą stronę", + "Add Page Labels": "Dodaj etykiety stron", + "Add Stamps": "Dodaj pieczątki", + "Add Watermark": "Dodaj znak wodny", + "Adjust Colors": "Dostosuj kolory", + "Alternate & Mix Pages": "Naprzemienne i mieszane strony", + "Apache": "Apache", + "Appearance": "Wygląd", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Kolor tła", + "Bates Numbering": "Numeracja Batesa", + "BMP to PDF": "BMP na PDF", + "CBZ to PDF": "CBZ na PDF", + "Change language": "Zmień język", + "Change Permissions": "Zmień uprawnienia", + "Change Text Color": "Zmień kolor tekstu", + "Close search": "Zamknij wyszukiwanie", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Połącz w jedną stronę", + "Commercial License": "Licencja komercyjna", + "Compare PDFs": "Porównaj PDF", + "Compress PDF": "Kompresuj PDF", + "Contributing": "Współtworzenie", + "Convert from PDF": "Konwertuj z PDF", + "Convert to PDF": "Konwertuj do PDF", + "Create PDF Form": "Utwórz formularz PDF", + "Crop PDF": "Przytnij PDF", + "CSV to PDF": "CSV na PDF", + "Delete Pages": "Usuń strony", + "Deskew PDF": "Wyprostuj PDF", + "Digital Signature": "Podpis cyfrowy", + "Display detailed list": "Wyświetl szczegółową listę", + "Divide Pages": "Podziel strony", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Dokumentacja BentoPDF: darmowy zestaw narzędzi PDF o otwartym kodzie źródłowym, stworzony z myślą o prywatności", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Podwójna licencja: AGPL-3.0 i licencja komercyjna.", + "Duplex Collate": "Sortowanie skanu dwustronnego", + "Edit & Annotate": "Edycja i adnotacje", + "Edit Attachments": "Edytuj załączniki", + "Edit Bookmarks": "Edytuj zakładki", + "Edit Metadata": "Edytuj metadane", + "Email to PDF": "E-mail na PDF", + "EPUB to PDF": "EPUB na PDF", + "Excel to PDF": "Excel na PDF", + "Extract Attachments": "Wyodrębnij załączniki", + "Extract Images": "Wyodrębnij obrazy", + "Extract Pages": "Wyodrębnij strony", + "Extract Tables": "Wyodrębnij tabele", + "FB2 to PDF": "FB2 na PDF", + "Fix Page Size": "Napraw rozmiar strony", + "Flatten PDF": "Spłaszcz PDF", + "Font to Outline": "Czcionka na krzywe", + "Getting Started": "Pierwsze kroki", + "Guide": "Przewodnik", + "Header & Footer": "Nagłówek i stopka", + "HEIC to PDF": "HEIC na PDF", + "Home": "Strona główna", + "Hostinger": "Hostinger", + "Images to PDF": "Obrazy do PDF", + "Invert Colors": "Odwróć kolory", + "JPG to PDF": "JPG na PDF", + "JSON to PDF": "JSON na PDF", + "Linearize PDF": "Linearyzuj PDF", + "Markdown to PDF": "Markdown na PDF", + "Menu": "Menu", + "Merge PDF": "Połącz PDF", + "MOBI to PDF": "MOBI na PDF", + "N-Up PDF": "PDF N-Up", + "Netlify": "Netlify", + "Next page": "Następna strona", + "Nginx": "Nginx", + "No results for": "Brak wyników dla", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG na PDF", + "ODP to PDF": "ODP na PDF", + "ODS to PDF": "ODS na PDF", + "ODT to PDF": "ODT na PDF", + "On this page": "Na tej stronie", + "Optimize & Repair": "Optymalizacja i naprawa", + "Organize & Duplicate": "Organizacja i duplikowanie", + "Organize & Manage": "Organizacja i zarządzanie", + "Overview": "Przegląd", + "Page Dimensions": "Wymiary strony", + "Page Numbers": "Numery stron", + "PDF Booklet": "Broszura PDF", + "PDF Editor": "Edytor PDF", + "PDF Form Filler": "Wypełnianie formularzy PDF", + "PDF Multi Tool": "Wielofunkcyjne narzędzie PDF", + "PDF OCG": "Warstwy PDF (OCG)", + "PDF to BMP": "PDF na BMP", + "PDF to CBZ": "PDF na CBZ", + "PDF to CSV": "PDF na CSV", + "PDF to Excel": "PDF na Excel", + "PDF to Greyscale": "PDF na odcienie szarości", + "PDF to JPG": "PDF na JPG", + "PDF to JSON": "PDF na JSON", + "PDF to Markdown": "PDF na Markdown", + "PDF to PDF/A": "PDF na PDF/A", + "PDF to PNG": "PDF na PNG", + "PDF to SVG": "PDF na SVG", + "PDF to Text": "PDF na tekst", + "PDF to TIFF": "PDF na TIFF", + "PDF to WebP": "PDF na WebP", + "PDF to Word": "PDF na Word", + "PDF Workflow Builder": "Kreator przepływów PDF", + "PDFs to ZIP": "PDF na ZIP", + "PNG to PDF": "PNG na PDF", + "Posterize PDF": "Plakatowanie PDF", + "PowerPoint to PDF": "PowerPoint na PDF", + "Prepare PDF for AI": "Przygotuj PDF dla AI", + "Previous page": "Poprzednia strona", + "Protect PDF": "Zabezpiecz PDF", + "PSD to PDF": "PSD na PDF", + "PUB to PDF": "PUB na PDF", + "Rasterize PDF": "Rasteryzuj PDF", + "Remove Annotations": "Usuń adnotacje", + "Remove Blank Pages": "Usuń puste strony", + "Remove Metadata": "Usuń metadane", + "Remove Restrictions": "Usuń restrykcje", + "Repair PDF": "Napraw PDF", + "Reset search": "Wyczyść wyszukiwanie", + "Return to top": "Wróć na górę", + "Reverse Pages": "Odwróć strony", + "Rotate by Custom Degrees": "Obróć o niestandardowy kąt", + "Rotate PDF": "Obróć PDF", + "RTF to PDF": "RTF na PDF", + "Sanitize PDF": "Sanityzuj PDF", + "Scanner Effect": "Efekt skanera", + "Search": "Szukaj", + "Secure PDF": "Zabezpiecz PDF", + "Self-Hosting": "Własny hosting", + "Self-Hosting Guide": "Przewodnik po własnym hostingu", + "Sign PDF": "Podpisz PDF", + "Skip to content": "Przejdź do treści", + "Split PDF": "Podziel PDF", + "SVG to PDF": "SVG na PDF", + "Switch to dark theme": "Przełącz na ciemny motyw", + "Switch to light theme": "Przełącz na jasny motyw", + "Table of Contents": "Spis treści", + "Text to PDF": "Tekst na PDF", + "TIFF to PDF": "TIFF na PDF", + "to close": "aby zamknąć", + "to navigate": "aby nawigować", + "to select": "aby wybrać", + "Tools": "Narzędzia", + "Tools Reference": "Opis narzędzi", + "Unlock PDF": "Odblokuj PDF", + "Validate Signature": "Zweryfikuj podpis", + "Vercel": "Vercel", + "View Metadata": "Wyświetl metadane", + "VSD to PDF": "VSD na PDF", + "WebP to PDF": "WebP na PDF", + "Word to PDF": "Word na PDF", + "WPD to PDF": "WPD na PDF", + "WPS to PDF": "WPS na PDF", + "XML to PDF": "XML na PDF", + "XPS to PDF": "XPS na PDF" +} diff --git a/docs/.vitepress/i18n/pt.json b/docs/.vitepress/i18n/pt.json new file mode 100644 index 00000000..c868457b --- /dev/null +++ b/docs/.vitepress/i18n/pt.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Adicionar anexos", + "Add Blank Page": "Adicionar página em branco", + "Add Page Labels": "Adicionar rótulos de página", + "Add Stamps": "Adicionar carimbos", + "Add Watermark": "Adicionar marca d'água", + "Adjust Colors": "Ajustar cores", + "Alternate & Mix Pages": "Alternar e misturar páginas", + "Apache": "Apache", + "Appearance": "Aparência", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Cor de fundo", + "Bates Numbering": "Numeração Bates", + "BMP to PDF": "BMP para PDF", + "CBZ to PDF": "CBZ para PDF", + "Change language": "Mudar idioma", + "Change Permissions": "Alterar permissões", + "Change Text Color": "Alterar cor do texto", + "Close search": "Fechar busca", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Combinar em página única", + "Commercial License": "Licença comercial", + "Compare PDFs": "Comparar PDFs", + "Compress PDF": "Comprimir PDF", + "Contributing": "Contribuir", + "Convert from PDF": "Converter de PDF", + "Convert to PDF": "Converter para PDF", + "Create PDF Form": "Criar formulário PDF", + "Crop PDF": "Cortar PDF", + "CSV to PDF": "CSV para PDF", + "Delete Pages": "Excluir páginas", + "Deskew PDF": "Desinclinar PDF", + "Digital Signature": "Assinatura Digital", + "Display detailed list": "Exibir lista detalhada", + "Divide Pages": "Dividir páginas", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Documentação do BentoPDF: o kit de ferramentas PDF gratuito, de código aberto e focado em privacidade", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Licenciado em dupla licença: AGPL-3.0 e Licença Comercial.", + "Duplex Collate": "Intercalar digitalização frente e verso", + "Edit & Annotate": "Editar e Anotar", + "Edit Attachments": "Editar anexos", + "Edit Bookmarks": "Editar marcadores", + "Edit Metadata": "Editar metadados", + "Email to PDF": "E-mail para PDF", + "EPUB to PDF": "EPUB para PDF", + "Excel to PDF": "Excel para PDF", + "Extract Attachments": "Extrair anexos", + "Extract Images": "Extrair imagens", + "Extract Pages": "Extrair páginas", + "Extract Tables": "Extrair Tabelas", + "FB2 to PDF": "FB2 para PDF", + "Fix Page Size": "Ajustar tamanho da página", + "Flatten PDF": "Achatar PDF", + "Font to Outline": "Fonte para contorno", + "Getting Started": "Primeiros Passos", + "Guide": "Guia", + "Header & Footer": "Cabeçalho e rodapé", + "HEIC to PDF": "HEIC para PDF", + "Home": "Início", + "Hostinger": "Hostinger", + "Images to PDF": "Imagens para PDF", + "Invert Colors": "Inverter cores", + "JPG to PDF": "JPG para PDF", + "JSON to PDF": "JSON para PDF", + "Linearize PDF": "Linearizar PDF", + "Markdown to PDF": "Markdown para PDF", + "Menu": "Menu", + "Merge PDF": "Mesclar PDF", + "MOBI to PDF": "MOBI para PDF", + "N-Up PDF": "PDF N-Up", + "Netlify": "Netlify", + "Next page": "Próxima página", + "Nginx": "Nginx", + "No results for": "Nenhum resultado para", + "OCR PDF": "OCR em PDF", + "ODG to PDF": "ODG para PDF", + "ODP to PDF": "ODP para PDF", + "ODS to PDF": "ODS para PDF", + "ODT to PDF": "ODT para PDF", + "On this page": "Nesta página", + "Optimize & Repair": "Otimizar e Reparar", + "Organize & Duplicate": "Duplicar e Organizar", + "Organize & Manage": "Organizar e Gerenciar", + "Overview": "Visão geral", + "Page Dimensions": "Dimensões da página", + "Page Numbers": "Números de página", + "PDF Booklet": "Livreto PDF", + "PDF Editor": "Editor de PDF", + "PDF Form Filler": "Preenchimento de formulário PDF", + "PDF Multi Tool": "Multiferramenta PDF", + "PDF OCG": "Camadas de PDF (OCG)", + "PDF to BMP": "PDF para BMP", + "PDF to CBZ": "PDF para CBZ", + "PDF to CSV": "PDF para CSV", + "PDF to Excel": "PDF para Excel", + "PDF to Greyscale": "PDF para tons de cinza", + "PDF to JPG": "PDF para JPG", + "PDF to JSON": "PDF para JSON", + "PDF to Markdown": "PDF para Markdown", + "PDF to PDF/A": "PDF para PDF/A", + "PDF to PNG": "PDF para PNG", + "PDF to SVG": "PDF para SVG", + "PDF to Text": "PDF para texto", + "PDF to TIFF": "PDF para TIFF", + "PDF to WebP": "PDF para WebP", + "PDF to Word": "PDF para Word", + "PDF Workflow Builder": "Construtor de fluxo de trabalho PDF", + "PDFs to ZIP": "PDFs para ZIP", + "PNG to PDF": "PNG para PDF", + "Posterize PDF": "Posterizar PDF", + "PowerPoint to PDF": "PowerPoint para PDF", + "Prepare PDF for AI": "Preparar PDF para IA", + "Previous page": "Página anterior", + "Protect PDF": "Proteger PDF", + "PSD to PDF": "PSD para PDF", + "PUB to PDF": "PUB para PDF", + "Rasterize PDF": "Rasterizar PDF", + "Remove Annotations": "Remover anotações", + "Remove Blank Pages": "Remover páginas em branco", + "Remove Metadata": "Remover metadados", + "Remove Restrictions": "Remover restrições", + "Repair PDF": "Reparar PDF", + "Reset search": "Limpar busca", + "Return to top": "Voltar ao topo", + "Reverse Pages": "Inverter ordem das páginas", + "Rotate by Custom Degrees": "Girar em graus personalizados", + "Rotate PDF": "Girar PDF", + "RTF to PDF": "RTF para PDF", + "Sanitize PDF": "Sanitizar PDF", + "Scanner Effect": "Efeito scanner", + "Search": "Buscar", + "Secure PDF": "Proteger PDF", + "Self-Hosting": "Hospedagem Própria", + "Self-Hosting Guide": "Guia de Hospedagem Própria", + "Sign PDF": "Assinar PDF", + "Skip to content": "Pular para o conteúdo", + "Split PDF": "Dividir PDF", + "SVG to PDF": "SVG para PDF", + "Switch to dark theme": "Mudar para o tema escuro", + "Switch to light theme": "Mudar para o tema claro", + "Table of Contents": "Sumário", + "Text to PDF": "Texto para PDF", + "TIFF to PDF": "TIFF para PDF", + "to close": "para fechar", + "to navigate": "para navegar", + "to select": "para selecionar", + "Tools": "Ferramentas", + "Tools Reference": "Referência de Ferramentas", + "Unlock PDF": "Desbloquear PDF", + "Validate Signature": "Validar Assinatura", + "Vercel": "Vercel", + "View Metadata": "Ver metadados", + "VSD to PDF": "VSD para PDF", + "WebP to PDF": "WebP para PDF", + "Word to PDF": "Word para PDF", + "WPD to PDF": "WPD para PDF", + "WPS to PDF": "WPS para PDF", + "XML to PDF": "XML para PDF", + "XPS to PDF": "XPS para PDF" +} diff --git a/docs/.vitepress/i18n/ru.json b/docs/.vitepress/i18n/ru.json new file mode 100644 index 00000000..1011291b --- /dev/null +++ b/docs/.vitepress/i18n/ru.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Добавление вложений", + "Add Blank Page": "Добавление пустой страницы", + "Add Page Labels": "Добавить метки страниц", + "Add Stamps": "Добавление штампов", + "Add Watermark": "Добавление водяных знаков", + "Adjust Colors": "Настройка цвета", + "Alternate & Mix Pages": "Объединение документов с чередованием страниц", + "Apache": "Apache", + "Appearance": "Оформление", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Цвет фона", + "Bates Numbering": "Bates-нумерация", + "BMP to PDF": "BMP в PDF", + "CBZ to PDF": "CBZ в PDF", + "Change language": "Сменить язык", + "Change Permissions": "Изменение разрешений", + "Change Text Color": "Изменение цвета текста", + "Close search": "Закрыть поиск", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Объединение в одну страницу", + "Commercial License": "Коммерческая лицензия", + "Compare PDFs": "Сравнение документов", + "Compress PDF": "Сжатие PDF", + "Contributing": "Участие в разработке", + "Convert from PDF": "Конвертация из PDF", + "Convert to PDF": "Конвертация в PDF", + "Create PDF Form": "Создание PDF-форм", + "Crop PDF": "Обрезка PDF", + "CSV to PDF": "CSV в PDF", + "Delete Pages": "Удаление страниц", + "Deskew PDF": "Выпрямление PDF", + "Digital Signature": "Цифровая подпись PDF", + "Display detailed list": "Показать подробный список", + "Divide Pages": "Разделение страниц", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Документация BentoPDF: бесплатный набор PDF-инструментов с открытым исходным кодом и приоритетом приватности", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Двойное лицензирование: AGPL-3.0 и коммерческая лицензия.", + "Duplex Collate": "Сортировка двустороннего сканирования", + "Edit & Annotate": "Редактирование и добавление примечаний", + "Edit Attachments": "Редактирование вложений", + "Edit Bookmarks": "Редактирование закладок", + "Edit Metadata": "Редактирование метаданных", + "Email to PDF": "Email в PDF", + "EPUB to PDF": "EPUB в PDF", + "Excel to PDF": "Excel в PDF", + "Extract Attachments": "Извлечение вложений", + "Extract Images": "Извлечение изображений", + "Extract Pages": "Извлечение страниц", + "Extract Tables": "Извлечение таблиц из PDF", + "FB2 to PDF": "FB2 в PDF", + "Fix Page Size": "Редактор размера страниц", + "Flatten PDF": "Сведение документа", + "Font to Outline": "Шрифты в кривые", + "Getting Started": "Начало работы", + "Guide": "Руководство", + "Header & Footer": "Колонтитулы", + "HEIC to PDF": "HEIC в PDF", + "Home": "Главная", + "Hostinger": "Hostinger", + "Images to PDF": "Изображения в PDF", + "Invert Colors": "Инверсия цвета", + "JPG to PDF": "JPG в PDF", + "JSON to PDF": "JSON в PDF", + "Linearize PDF": "Линеаризация документа", + "Markdown to PDF": "Markdown в PDF", + "Menu": "Меню", + "Merge PDF": "Объединение PDF", + "MOBI to PDF": "MOBI в PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Следующая страница", + "Nginx": "Nginx", + "No results for": "Нет результатов для", + "OCR PDF": "Распознавание текста в PDF", + "ODG to PDF": "ODG в PDF", + "ODP to PDF": "ODP в PDF", + "ODS to PDF": "ODS в PDF", + "ODT to PDF": "ODT в PDF", + "On this page": "На этой странице", + "Optimize & Repair": "Оптимизация и восстановление", + "Organize & Duplicate": "Дублирование и организация", + "Organize & Manage": "Организация и управление", + "Overview": "Обзор", + "Page Dimensions": "Размеры страниц", + "Page Numbers": "Нумерация страниц", + "PDF Booklet": "PDF-буклет", + "PDF Editor": "Редактор PDF", + "PDF Form Filler": "Заполнение PDF-форм", + "PDF Multi Tool": "PDF мультиинструмент", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDF в BMP", + "PDF to CBZ": "PDF в CBZ", + "PDF to CSV": "PDF в CSV", + "PDF to Excel": "PDF в Excel", + "PDF to Greyscale": "PDF в оттенки серого", + "PDF to JPG": "PDF в JPG", + "PDF to JSON": "PDF в JSON", + "PDF to Markdown": "PDF в Markdown", + "PDF to PDF/A": "PDF в PDF/A", + "PDF to PNG": "PDF в PNG", + "PDF to SVG": "PDF в SVG", + "PDF to Text": "PDF в текст", + "PDF to TIFF": "PDF в TIFF", + "PDF to WebP": "PDF в WebP", + "PDF to Word": "PDF в Word", + "PDF Workflow Builder": "Конструктор PDF-процессов", + "PDFs to ZIP": "PDF в ZIP", + "PNG to PDF": "PNG в PDF", + "Posterize PDF": "Постеризация документа", + "PowerPoint to PDF": "PowerPoint в PDF", + "Prepare PDF for AI": "Подготовка PDF для ИИ", + "Previous page": "Предыдущая страница", + "Protect PDF": "Защита PDF", + "PSD to PDF": "PSD в PDF", + "PUB to PDF": "PUB в PDF", + "Rasterize PDF": "Растеризация документа", + "Remove Annotations": "Удаление аннотаций", + "Remove Blank Pages": "Удаление пустых страниц", + "Remove Metadata": "Удаление метаданных", + "Remove Restrictions": "Снятие ограничений", + "Repair PDF": "Восстановление документа", + "Reset search": "Сбросить поиск", + "Return to top": "Вернуться наверх", + "Reverse Pages": "Обращение порядка страниц", + "Rotate by Custom Degrees": "Поворот на заданное количество градусов", + "Rotate PDF": "Поворот PDF", + "RTF to PDF": "RTF в PDF", + "Sanitize PDF": "Санирование документа", + "Scanner Effect": "Эффект сканера", + "Search": "Поиск", + "Secure PDF": "Защита PDF", + "Self-Hosting": "Самостоятельный хостинг", + "Self-Hosting Guide": "Руководство по самостоятельному хостингу", + "Sign PDF": "Подписание PDF", + "Skip to content": "Перейти к содержимому", + "Split PDF": "Разделение PDF", + "SVG to PDF": "SVG в PDF", + "Switch to dark theme": "Переключить на тёмную тему", + "Switch to light theme": "Переключить на светлую тему", + "Table of Contents": "Оглавление", + "Text to PDF": "Текст в PDF", + "TIFF to PDF": "TIFF в PDF", + "to close": "закрыть", + "to navigate": "навигация", + "to select": "выбрать", + "Tools": "Инструменты", + "Tools Reference": "Справочник по инструментам", + "Unlock PDF": "Разблокировка PDF", + "Validate Signature": "Проверка подписи в PDF", + "Vercel": "Vercel", + "View Metadata": "Просмотр метаданных", + "VSD to PDF": "VSD в PDF", + "WebP to PDF": "WebP в PDF", + "Word to PDF": "Word в PDF", + "WPD to PDF": "WPD в PDF", + "WPS to PDF": "WPS в PDF", + "XML to PDF": "XML в PDF", + "XPS to PDF": "XPS в PDF" +} diff --git a/docs/.vitepress/i18n/sk.json b/docs/.vitepress/i18n/sk.json new file mode 100644 index 00000000..81b2f117 --- /dev/null +++ b/docs/.vitepress/i18n/sk.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Pridať prílohy", + "Add Blank Page": "Pridať prázdnu stranu", + "Add Page Labels": "Pridať označenia strán", + "Add Stamps": "Pridať pečiatky", + "Add Watermark": "Pridať vodoznak", + "Adjust Colors": "Úprava farieb", + "Alternate & Mix Pages": "Striedavo spojiť a zmiešať strany", + "Apache": "Apache", + "Appearance": "Vzhľad", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Farba pozadia", + "Bates Numbering": "Batesovo číslovanie", + "BMP to PDF": "BMP do PDF", + "CBZ to PDF": "CBZ do PDF", + "Change language": "Zmeniť jazyk", + "Change Permissions": "Zmeniť oprávnenia", + "Change Text Color": "Zmeniť farbu textu", + "Close search": "Zavrieť vyhľadávanie", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Spojiť do jednej strany", + "Commercial License": "Komerčná licencia", + "Compare PDFs": "Porovnať PDF", + "Compress PDF": "Komprimovať PDF", + "Contributing": "Prispievanie", + "Convert from PDF": "Konvertovať z PDF", + "Convert to PDF": "Konvertovať do PDF", + "Create PDF Form": "Vytvoriť PDF formulár", + "Crop PDF": "Orezať PDF", + "CSV to PDF": "CSV do PDF", + "Delete Pages": "Odstrániť strany", + "Deskew PDF": "Zarovnať naklonené PDF", + "Digital Signature": "Digitálny podpis", + "Display detailed list": "Zobraziť podrobný zoznam", + "Divide Pages": "Rozdeliť strany", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Dokumentácia k BentoPDF - bezplatná open source sada PDF nástrojov s dôrazom na súkromie", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Duálne licencovaný pod AGPL-3.0 a komerčnou licenciou.", + "Duplex Collate": "Usporiadať obojstranné skenovanie", + "Edit & Annotate": "Úpravy a poznámky", + "Edit Attachments": "Upraviť prílohy", + "Edit Bookmarks": "Upraviť záložky", + "Edit Metadata": "Upraviť metadáta", + "Email to PDF": "E-mail do PDF", + "EPUB to PDF": "EPUB do PDF", + "Excel to PDF": "Excel do PDF", + "Extract Attachments": "Extrahovať prílohy", + "Extract Images": "Extrahovať obrázky", + "Extract Pages": "Extrahovať strany", + "Extract Tables": "Extrahovať tabuľky", + "FB2 to PDF": "FB2 do PDF", + "Fix Page Size": "Zjednotiť veľkosť strán", + "Flatten PDF": "Sploštiť PDF", + "Font to Outline": "Písma do kriviek", + "Getting Started": "Začíname", + "Guide": "Príručka", + "Header & Footer": "Hlavička a pätička", + "HEIC to PDF": "HEIC do PDF", + "Home": "Domov", + "Hostinger": "Hostinger", + "Images to PDF": "Obrázky do PDF", + "Invert Colors": "Invertovať farby", + "JPG to PDF": "JPG do PDF", + "JSON to PDF": "JSON do PDF", + "Linearize PDF": "Linearizovať PDF", + "Markdown to PDF": "Markdown do PDF", + "Menu": "Menu", + "Merge PDF": "Spojiť PDF", + "MOBI to PDF": "MOBI do PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Nasledujúca strana", + "Nginx": "Nginx", + "No results for": "Žiadne výsledky pre", + "OCR PDF": "Rozpoznávanie textu (OCR) PDF", + "ODG to PDF": "ODG do PDF", + "ODP to PDF": "ODP do PDF", + "ODS to PDF": "ODS do PDF", + "ODT to PDF": "ODT do PDF", + "On this page": "Na tejto stránke", + "Optimize & Repair": "Optimalizácia a oprava", + "Organize & Duplicate": "Usporiadanie a duplikovanie", + "Organize & Manage": "Usporiadanie a správa", + "Overview": "Prehľad", + "Page Dimensions": "Rozmery strany", + "Page Numbers": "Čísla strán", + "PDF Booklet": "PDF brožúra", + "PDF Editor": "Editor PDF", + "PDF Form Filler": "Vypĺňanie PDF formulárov", + "PDF Multi Tool": "Multinástroj PDF", + "PDF OCG": "PDF OCG (vrstvy)", + "PDF to BMP": "PDF do BMP", + "PDF to CBZ": "PDF do CBZ", + "PDF to CSV": "PDF do CSV", + "PDF to Excel": "PDF do Excelu", + "PDF to Greyscale": "PDF do odtieňov sivej", + "PDF to JPG": "PDF do JPG", + "PDF to JSON": "PDF do JSON", + "PDF to Markdown": "PDF do Markdownu", + "PDF to PDF/A": "PDF do PDF/A", + "PDF to PNG": "PDF do PNG", + "PDF to SVG": "PDF do SVG", + "PDF to Text": "PDF do textu", + "PDF to TIFF": "PDF do TIFF", + "PDF to WebP": "PDF do WebP", + "PDF to Word": "PDF do Wordu", + "PDF Workflow Builder": "Tvorca pracovných postupov (Workflow) PDF", + "PDFs to ZIP": "PDF do ZIP", + "PNG to PDF": "PNG do PDF", + "Posterize PDF": "Vytvoriť plagát z PDF", + "PowerPoint to PDF": "PowerPoint do PDF", + "Prepare PDF for AI": "Pripraviť PDF pre AI", + "Previous page": "Predchádzajúca strana", + "Protect PDF": "Chrániť PDF heslom", + "PSD to PDF": "PSD do PDF", + "PUB to PDF": "PUB do PDF", + "Rasterize PDF": "Rastrovať PDF", + "Remove Annotations": "Odstrániť anotácie", + "Remove Blank Pages": "Odstrániť prázdne strany", + "Remove Metadata": "Odstrániť metadáta", + "Remove Restrictions": "Odstrániť obmedzenia", + "Repair PDF": "Opraviť PDF", + "Reset search": "Vynulovať vyhľadávanie", + "Return to top": "Späť hore", + "Reverse Pages": "Obrátiť poradie strán", + "Rotate by Custom Degrees": "Otočiť o vlastné stupne", + "Rotate PDF": "Otočiť PDF", + "RTF to PDF": "RTF do PDF", + "Sanitize PDF": "Vyčistiť PDF", + "Scanner Effect": "Efekt skenera", + "Search": "Hľadať", + "Secure PDF": "Zabezpečiť PDF", + "Self-Hosting": "Vlastný hosting", + "Self-Hosting Guide": "Príručka k vlastnému hostingu", + "Sign PDF": "Podpísať PDF", + "Skip to content": "Preskočiť na obsah", + "Split PDF": "Rozdeliť PDF", + "SVG to PDF": "SVG do PDF", + "Switch to dark theme": "Prepnúť na tmavú tému", + "Switch to light theme": "Prepnúť na svetlú tému", + "Table of Contents": "Obsah", + "Text to PDF": "Text do PDF", + "TIFF to PDF": "TIFF do PDF", + "to close": "zavrieť", + "to navigate": "navigovať", + "to select": "vybrať", + "Tools": "Nástroje", + "Tools Reference": "Prehľad nástrojov", + "Unlock PDF": "Odomknúť PDF", + "Validate Signature": "Overiť podpis", + "Vercel": "Vercel", + "View Metadata": "Zobraziť metadáta", + "VSD to PDF": "VSD do PDF", + "WebP to PDF": "WebP do PDF", + "Word to PDF": "Word do PDF", + "WPD to PDF": "WPD do PDF", + "WPS to PDF": "WPS do PDF", + "XML to PDF": "XML do PDF", + "XPS to PDF": "XPS do PDF" +} diff --git a/docs/.vitepress/i18n/source.json b/docs/.vitepress/i18n/source.json new file mode 100644 index 00000000..f0d26338 --- /dev/null +++ b/docs/.vitepress/i18n/source.json @@ -0,0 +1,160 @@ +[ + "Add Attachments", + "Add Blank Page", + "Add Page Labels", + "Add Stamps", + "Add Watermark", + "Adjust Colors", + "Alternate & Mix Pages", + "Apache", + "Appearance", + "AWS S3 + CloudFront", + "Background Color", + "Bates Numbering", + "BMP to PDF", + "CBZ to PDF", + "Change language", + "Change Permissions", + "Change Text Color", + "Close search", + "Cloudflare Pages", + "Combine to Single Page", + "Commercial License", + "Compare PDFs", + "Compress PDF", + "Contributing", + "Convert from PDF", + "Convert to PDF", + "Create PDF Form", + "Crop PDF", + "CSV to PDF", + "Delete Pages", + "Deskew PDF", + "Digital Signature", + "Display detailed list", + "Divide Pages", + "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit", + "Dual-licensed under AGPL-3.0 and Commercial License.", + "Duplex Collate", + "Edit & Annotate", + "Edit Attachments", + "Edit Bookmarks", + "Edit Metadata", + "Email to PDF", + "EPUB to PDF", + "Excel to PDF", + "Extract Attachments", + "Extract Images", + "Extract Pages", + "Extract Tables", + "FB2 to PDF", + "Fix Page Size", + "Flatten PDF", + "Font to Outline", + "Getting Started", + "Guide", + "Header & Footer", + "HEIC to PDF", + "Home", + "Hostinger", + "Images to PDF", + "Invert Colors", + "JPG to PDF", + "JSON to PDF", + "Linearize PDF", + "Markdown to PDF", + "Menu", + "Merge PDF", + "MOBI to PDF", + "N-Up PDF", + "Netlify", + "Next page", + "Nginx", + "No results for", + "OCR PDF", + "ODG to PDF", + "ODP to PDF", + "ODS to PDF", + "ODT to PDF", + "On this page", + "Optimize & Repair", + "Organize & Duplicate", + "Organize & Manage", + "Overview", + "Page Dimensions", + "Page Numbers", + "PDF Booklet", + "PDF Editor", + "PDF Form Filler", + "PDF Multi Tool", + "PDF OCG", + "PDF to BMP", + "PDF to CBZ", + "PDF to CSV", + "PDF to Excel", + "PDF to Greyscale", + "PDF to JPG", + "PDF to JSON", + "PDF to Markdown", + "PDF to PDF/A", + "PDF to PNG", + "PDF to SVG", + "PDF to Text", + "PDF to TIFF", + "PDF to WebP", + "PDF to Word", + "PDF Workflow Builder", + "PDFs to ZIP", + "PNG to PDF", + "Posterize PDF", + "PowerPoint to PDF", + "Prepare PDF for AI", + "Previous page", + "Protect PDF", + "PSD to PDF", + "PUB to PDF", + "Rasterize PDF", + "Remove Annotations", + "Remove Blank Pages", + "Remove Metadata", + "Remove Restrictions", + "Repair PDF", + "Reset search", + "Return to top", + "Reverse Pages", + "Rotate by Custom Degrees", + "Rotate PDF", + "RTF to PDF", + "Sanitize PDF", + "Scanner Effect", + "Search", + "Secure PDF", + "Self-Hosting", + "Self-Hosting Guide", + "Sign PDF", + "Skip to content", + "Split PDF", + "SVG to PDF", + "Switch to dark theme", + "Switch to light theme", + "Table of Contents", + "Text to PDF", + "TIFF to PDF", + "to close", + "to navigate", + "to select", + "Tools", + "Tools Reference", + "Unlock PDF", + "Validate Signature", + "Vercel", + "View Metadata", + "VSD to PDF", + "WebP to PDF", + "Word to PDF", + "WPD to PDF", + "WPS to PDF", + "XML to PDF", + "XPS to PDF" +] diff --git a/docs/.vitepress/i18n/sv.json b/docs/.vitepress/i18n/sv.json new file mode 100644 index 00000000..75d87e37 --- /dev/null +++ b/docs/.vitepress/i18n/sv.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Lägg till bilagor", + "Add Blank Page": "Lägg till tom sida", + "Add Page Labels": "Lägg till sidetiketter", + "Add Stamps": "Lägg till stämplar", + "Add Watermark": "Lägg till vattenstämpel", + "Adjust Colors": "Justera färger", + "Alternate & Mix Pages": "Alternera & blanda sidor", + "Apache": "Apache", + "Appearance": "Utseende", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Bakgrundsfärg", + "Bates Numbering": "Bates-numrering", + "BMP to PDF": "BMP till PDF", + "CBZ to PDF": "CBZ till PDF", + "Change language": "Byt språk", + "Change Permissions": "Ändra behörigheter", + "Change Text Color": "Ändra textfärg", + "Close search": "Stäng sökning", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Kombinera till en sida", + "Commercial License": "Kommersiell licens", + "Compare PDFs": "Jämför PDF:er", + "Compress PDF": "Komprimera PDF", + "Contributing": "Bidra", + "Convert from PDF": "Konvertera från PDF", + "Convert to PDF": "Konvertera till PDF", + "Create PDF Form": "Skapa PDF-formulär", + "Crop PDF": "Beskär PDF", + "CSV to PDF": "CSV till PDF", + "Delete Pages": "Ta bort sidor", + "Deskew PDF": "Räta upp PDF", + "Digital Signature": "Digital signatur", + "Display detailed list": "Visa detaljerad lista", + "Divide Pages": "Dela sidor", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Dokumentation för BentoPDF, den kostnadsfria PDF-verktygslådan med öppen källkod och integritet i fokus", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Dubbellicensierad under AGPL-3.0 och kommersiell licens.", + "Duplex Collate": "Sortera dubbelsidig skanning", + "Edit & Annotate": "Redigera & Kommentera", + "Edit Attachments": "Redigera bilagor", + "Edit Bookmarks": "Redigera bokmärken", + "Edit Metadata": "Redigera metadata", + "Email to PDF": "E-post till PDF", + "EPUB to PDF": "EPUB till PDF", + "Excel to PDF": "Excel till PDF", + "Extract Attachments": "Extrahera bilagor", + "Extract Images": "Extrahera bilder", + "Extract Pages": "Extrahera sidor", + "Extract Tables": "Extrahera tabeller", + "FB2 to PDF": "FB2 till PDF", + "Fix Page Size": "Fixa sidstorlek", + "Flatten PDF": "Platta till PDF", + "Font to Outline": "Typsnitt till kontur", + "Getting Started": "Kom igång", + "Guide": "Guide", + "Header & Footer": "Sidhuvud & sidfot", + "HEIC to PDF": "HEIC till PDF", + "Home": "Hem", + "Hostinger": "Hostinger", + "Images to PDF": "Bilder till PDF", + "Invert Colors": "Invertera färger", + "JPG to PDF": "JPG till PDF", + "JSON to PDF": "JSON till PDF", + "Linearize PDF": "Linjärisera PDF", + "Markdown to PDF": "Markdown till PDF", + "Menu": "Meny", + "Merge PDF": "Sammanfoga PDF", + "MOBI to PDF": "MOBI till PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Nästa sida", + "Nginx": "Nginx", + "No results for": "Inga resultat för", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG till PDF", + "ODP to PDF": "ODP till PDF", + "ODS to PDF": "ODS till PDF", + "ODT to PDF": "ODT till PDF", + "On this page": "På den här sidan", + "Optimize & Repair": "Optimera & Reparera", + "Organize & Duplicate": "Organisera & Duplicera", + "Organize & Manage": "Organisera & Hantera", + "Overview": "Översikt", + "Page Dimensions": "Sidmått", + "Page Numbers": "Sidnummer", + "PDF Booklet": "PDF-broschyr", + "PDF Editor": "PDF-redigerare", + "PDF Form Filler": "PDF-formulärifyllare", + "PDF Multi Tool": "PDF-multiverktyg", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDF till BMP", + "PDF to CBZ": "PDF till CBZ", + "PDF to CSV": "PDF till CSV", + "PDF to Excel": "PDF till Excel", + "PDF to Greyscale": "PDF till gråskala", + "PDF to JPG": "PDF till JPG", + "PDF to JSON": "PDF till JSON", + "PDF to Markdown": "PDF till Markdown", + "PDF to PDF/A": "PDF till PDF/A", + "PDF to PNG": "PDF till PNG", + "PDF to SVG": "PDF till SVG", + "PDF to Text": "PDF till text", + "PDF to TIFF": "PDF till TIFF", + "PDF to WebP": "PDF till WebP", + "PDF to Word": "PDF till Word", + "PDF Workflow Builder": "PDF-arbetsflödesbyggare", + "PDFs to ZIP": "PDF:er till ZIP", + "PNG to PDF": "PNG till PDF", + "Posterize PDF": "Postera PDF", + "PowerPoint to PDF": "PowerPoint till PDF", + "Prepare PDF for AI": "Förbered PDF för AI", + "Previous page": "Föregående sida", + "Protect PDF": "Skydda PDF", + "PSD to PDF": "PSD till PDF", + "PUB to PDF": "PUB till PDF", + "Rasterize PDF": "Rasterisera PDF", + "Remove Annotations": "Ta bort anteckningar", + "Remove Blank Pages": "Ta bort tomma sidor", + "Remove Metadata": "Ta bort metadata", + "Remove Restrictions": "Ta bort begränsningar", + "Repair PDF": "Reparera PDF", + "Reset search": "Återställ sökning", + "Return to top": "Tillbaka till toppen", + "Reverse Pages": "Vänd sidordning", + "Rotate by Custom Degrees": "Rotera med valfri vinkel", + "Rotate PDF": "Rotera PDF", + "RTF to PDF": "RTF till PDF", + "Sanitize PDF": "Sanera PDF", + "Scanner Effect": "Skannereffekt", + "Search": "Sök", + "Secure PDF": "Säkra PDF", + "Self-Hosting": "Egen drift", + "Self-Hosting Guide": "Guide för egen drift", + "Sign PDF": "Signera PDF", + "Skip to content": "Hoppa till innehåll", + "Split PDF": "Dela PDF", + "SVG to PDF": "SVG till PDF", + "Switch to dark theme": "Byt till mörkt tema", + "Switch to light theme": "Byt till ljust tema", + "Table of Contents": "Innehållsförteckning", + "Text to PDF": "Text till PDF", + "TIFF to PDF": "TIFF till PDF", + "to close": "för att stänga", + "to navigate": "för att navigera", + "to select": "för att välja", + "Tools": "Verktyg", + "Tools Reference": "Verktygsreferens", + "Unlock PDF": "Lås upp PDF", + "Validate Signature": "Validera signatur", + "Vercel": "Vercel", + "View Metadata": "Visa metadata", + "VSD to PDF": "VSD till PDF", + "WebP to PDF": "WebP till PDF", + "Word to PDF": "Word till PDF", + "WPD to PDF": "WPD till PDF", + "WPS to PDF": "WPS till PDF", + "XML to PDF": "XML till PDF", + "XPS to PDF": "XPS till PDF" +} diff --git a/docs/.vitepress/i18n/theme-labels.mjs b/docs/.vitepress/i18n/theme-labels.mjs new file mode 100644 index 00000000..f4499754 --- /dev/null +++ b/docs/.vitepress/i18n/theme-labels.mjs @@ -0,0 +1,26 @@ +export const DESCRIPTION = + 'Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit'; + +export const FOOTER_MESSAGE = + 'Dual-licensed under AGPL-3.0 and Commercial License.'; + +export const THEME_LABELS = [ + 'On this page', + 'Return to top', + 'Menu', + 'Appearance', + 'Switch to light theme', + 'Switch to dark theme', + 'Skip to content', + 'Change language', + 'Previous page', + 'Next page', + 'Search', + 'No results for', + 'Reset search', + 'Close search', + 'Display detailed list', + 'to select', + 'to navigate', + 'to close', +]; diff --git a/docs/.vitepress/i18n/tr.json b/docs/.vitepress/i18n/tr.json new file mode 100644 index 00000000..47f421bc --- /dev/null +++ b/docs/.vitepress/i18n/tr.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Ek Dosya Ekle", + "Add Blank Page": "Boş Sayfa Ekle", + "Add Page Labels": "Sayfa Etiketleri Ekle", + "Add Stamps": "Damga Ekle", + "Add Watermark": "Filigran Ekle", + "Adjust Colors": "Renkleri Ayarla", + "Alternate & Mix Pages": "Sayfaları Karıştır & Birleştir", + "Apache": "Apache", + "Appearance": "Görünüm", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Arka Plan Rengi", + "Bates Numbering": "Bates Numaralandırma", + "BMP to PDF": "BMP'den PDF'ye", + "CBZ to PDF": "CBZ'den PDF'ye", + "Change language": "Dili değiştir", + "Change Permissions": "İzinleri Değiştir", + "Change Text Color": "Metin Rengini Değiştir", + "Close search": "Aramayı kapat", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Tek Sayfada Birleştir", + "Commercial License": "Ticari Lisans", + "Compare PDFs": "PDF'leri Karşılaştır", + "Compress PDF": "PDF Sıkıştır", + "Contributing": "Katkıda Bulunma", + "Convert from PDF": "PDF'den Dönüştür", + "Convert to PDF": "PDF'ye Dönüştür", + "Create PDF Form": "PDF Formu Oluştur", + "Crop PDF": "PDF Kırp", + "CSV to PDF": "CSV'den PDF'ye", + "Delete Pages": "Sayfaları Sil", + "Deskew PDF": "PDF Eğriliğini Düzelt", + "Digital Signature": "Dijital İmza", + "Display detailed list": "Ayrıntılı listeyi göster", + "Divide Pages": "Sayfaları Böl", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "BentoPDF belgeleri: ücretsiz, açık kaynaklı, gizlilik odaklı PDF araç seti", + "Dual-licensed under AGPL-3.0 and Commercial License.": "AGPL-3.0 ve Ticari Lisans ile çift lisanslıdır.", + "Duplex Collate": "Çift Taraflı Harmanla", + "Edit & Annotate": "Düzenle & Açıklama Ekle", + "Edit Attachments": "Ek Dosyaları Düzenle", + "Edit Bookmarks": "Yer İşaretlerini Düzenle", + "Edit Metadata": "Üst Veriyi Düzenle", + "Email to PDF": "E-postadan PDF'ye", + "EPUB to PDF": "EPUB'dan PDF'ye", + "Excel to PDF": "Excel'den PDF'ye", + "Extract Attachments": "Ek Dosyaları Çıkar", + "Extract Images": "Görüntüleri Çıkar", + "Extract Pages": "Sayfaları Çıkar", + "Extract Tables": "Tabloları Çıkar", + "FB2 to PDF": "FB2'den PDF'ye", + "Fix Page Size": "Sayfa Boyutunu Düzelt", + "Flatten PDF": "PDF'yi Düzleştir", + "Font to Outline": "Yazı Tipini Ana Hatlara Dönüştür", + "Getting Started": "Başlarken", + "Guide": "Kılavuz", + "Header & Footer": "Üst Bilgi & Alt Bilgi", + "HEIC to PDF": "HEIC'den PDF'ye", + "Home": "Ana Sayfa", + "Hostinger": "Hostinger", + "Images to PDF": "Görselden PDF'ye", + "Invert Colors": "Renkleri Ters Çevir", + "JPG to PDF": "JPG'den PDF'ye", + "JSON to PDF": "JSON'dan PDF'ye", + "Linearize PDF": "PDF'yi Doğrusallaştır", + "Markdown to PDF": "Markdown'dan PDF'ye", + "Menu": "Menü", + "Merge PDF": "PDF Birleştir", + "MOBI to PDF": "MOBI'den PDF'ye", + "N-Up PDF": "N'li PDF", + "Netlify": "Netlify", + "Next page": "Sonraki sayfa", + "Nginx": "Nginx", + "No results for": "Sonuç bulunamadı:", + "OCR PDF": "PDF'de OCR", + "ODG to PDF": "ODG'den PDF'ye", + "ODP to PDF": "ODP'den PDF'ye", + "ODS to PDF": "ODS'ten PDF'ye", + "ODT to PDF": "ODT'den PDF'ye", + "On this page": "Bu sayfada", + "Optimize & Repair": "Optimize Et & Onar", + "Organize & Duplicate": "Çoğalt & Düzenle", + "Organize & Manage": "Düzenle & Yönet", + "Overview": "Genel Bakış", + "Page Dimensions": "Sayfa Boyutları", + "Page Numbers": "Sayfa Numaraları", + "PDF Booklet": "PDF Kitapçık", + "PDF Editor": "PDF Düzenleyici", + "PDF Form Filler": "PDF Form Doldurucu", + "PDF Multi Tool": "PDF Çoklu Araç", + "PDF OCG": "PDF Katmanları (OCG)", + "PDF to BMP": "PDF'den BMP'ye", + "PDF to CBZ": "PDF'den CBZ'ye", + "PDF to CSV": "PDF'den CSV'ye", + "PDF to Excel": "PDF'den Excel'e", + "PDF to Greyscale": "PDF'yi Gri Tonlamaya Çevir", + "PDF to JPG": "PDF'den JPG'ye", + "PDF to JSON": "PDF'den JSON'a", + "PDF to Markdown": "PDF'den Markdown'a", + "PDF to PDF/A": "PDF'den PDF/A'ya", + "PDF to PNG": "PDF'den PNG'ye", + "PDF to SVG": "PDF'den SVG'ye", + "PDF to Text": "PDF'den Metne", + "PDF to TIFF": "PDF'den TIFF'e", + "PDF to WebP": "PDF'den WebP'ye", + "PDF to Word": "PDF'den Word'e", + "PDF Workflow Builder": "PDF İş Akışı Oluşturucu", + "PDFs to ZIP": "PDF'leri ZIP Yap", + "PNG to PDF": "PNG'den PDF'ye", + "Posterize PDF": "PDF'yi Posterleştir", + "PowerPoint to PDF": "PowerPoint'ten PDF'ye", + "Prepare PDF for AI": "PDF'yi Yapay Zeka için Hazırla", + "Previous page": "Önceki sayfa", + "Protect PDF": "PDF'yi Şifrele", + "PSD to PDF": "PSD'den PDF'ye", + "PUB to PDF": "PUB'dan PDF'ye", + "Rasterize PDF": "PDF'yi Rasterleştir", + "Remove Annotations": "Açıklamaları Kaldır", + "Remove Blank Pages": "Boş Sayfaları Kaldır", + "Remove Metadata": "Üst Veriyi Kaldır", + "Remove Restrictions": "Kısıtlamaları Kaldır", + "Repair PDF": "PDF'yi Onar", + "Reset search": "Aramayı sıfırla", + "Return to top": "Başa dön", + "Reverse Pages": "Sayfaları Ters Çevir", + "Rotate by Custom Degrees": "Özel Açıyla Döndür", + "Rotate PDF": "PDF'yi Döndür", + "RTF to PDF": "RTF'den PDF'ye", + "Sanitize PDF": "PDF'yi Temizle", + "Scanner Effect": "Tarayıcı Efekti", + "Search": "Ara", + "Secure PDF": "PDF'yi Güvenceye Al", + "Self-Hosting": "Kendi Sunucunda Barındırma", + "Self-Hosting Guide": "Kendi Sunucunda Barındırma Kılavuzu", + "Sign PDF": "PDF İmzala", + "Skip to content": "İçeriğe geç", + "Split PDF": "PDF Böl", + "SVG to PDF": "SVG'den PDF'ye", + "Switch to dark theme": "Koyu temaya geç", + "Switch to light theme": "Açık temaya geç", + "Table of Contents": "İçindekiler", + "Text to PDF": "Metinden PDF'ye", + "TIFF to PDF": "TIFF'den PDF'ye", + "to close": "kapatmak için", + "to navigate": "gezinmek için", + "to select": "seçmek için", + "Tools": "Araçlar", + "Tools Reference": "Araç Başvurusu", + "Unlock PDF": "PDF'nin Şifresini Çöz", + "Validate Signature": "İmzayı Doğrula", + "Vercel": "Vercel", + "View Metadata": "Üst Veriyi Görüntüle", + "VSD to PDF": "VSD'den PDF'ye", + "WebP to PDF": "WebP'den PDF'ye", + "Word to PDF": "Word'den PDF'ye", + "WPD to PDF": "WPD'den PDF'ye", + "WPS to PDF": "WPS'ten PDF'ye", + "XML to PDF": "XML'den PDF'ye", + "XPS to PDF": "XPS'ten PDF'ye" +} diff --git a/docs/.vitepress/i18n/uk.json b/docs/.vitepress/i18n/uk.json new file mode 100644 index 00000000..6af831e2 --- /dev/null +++ b/docs/.vitepress/i18n/uk.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Додати вкладення", + "Add Blank Page": "Додати порожню сторінку", + "Add Page Labels": "Додати нумерацію сторінок", + "Add Stamps": "Додати штампи", + "Add Watermark": "Додати водяний знак", + "Adjust Colors": "Корекція кольору", + "Alternate & Mix Pages": "Чергування та змішування сторінок", + "Apache": "Apache", + "Appearance": "Вигляд", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Колір фону", + "Bates Numbering": "Нумерація Bates", + "BMP to PDF": "BMP у PDF", + "CBZ to PDF": "CBZ у PDF", + "Change language": "Змінити мову", + "Change Permissions": "Змінити дозволи", + "Change Text Color": "Змінити колір тексту", + "Close search": "Закрити пошук", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Об’єднати в одну сторінку", + "Commercial License": "Комерційна ліцензія", + "Compare PDFs": "Порівняти PDF", + "Compress PDF": "Стиснення PDF", + "Contributing": "Участь у розробці", + "Convert from PDF": "Конвертувати з PDF", + "Convert to PDF": "Конвертувати в PDF", + "Create PDF Form": "Створити PDF-форму", + "Crop PDF": "Обрізати PDF", + "CSV to PDF": "CSV у PDF", + "Delete Pages": "Видалити сторінки", + "Deskew PDF": "Вирівнювання PDF", + "Digital Signature": "Цифровий підпис PDF", + "Display detailed list": "Показати докладний список", + "Divide Pages": "Розділити сторінки", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Документація BentoPDF: безкоштовний PDF-набір з відкритим кодом, створений з урахуванням конфіденційності", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Подвійне ліцензування: AGPL-3.0 і комерційна ліцензія.", + "Duplex Collate": "Сортування двостороннього сканування", + "Edit & Annotate": "Редагування та анотації", + "Edit Attachments": "Редагувати вкладення", + "Edit Bookmarks": "Редагувати закладки", + "Edit Metadata": "Редагувати метадані", + "Email to PDF": "Email у PDF", + "EPUB to PDF": "EPUB у PDF", + "Excel to PDF": "Excel у PDF", + "Extract Attachments": "Витяг вкладень", + "Extract Images": "Витяг зображень", + "Extract Pages": "Витяг сторінок", + "Extract Tables": "Витяг таблиць з PDF", + "FB2 to PDF": "FB2 у PDF", + "Fix Page Size": "Вирівняти розмір сторінок", + "Flatten PDF": "Сплющити PDF", + "Font to Outline": "Шрифти у контури", + "Getting Started": "Початок роботи", + "Guide": "Посібник", + "Header & Footer": "Колонтитули", + "HEIC to PDF": "HEIC у PDF", + "Home": "Головна", + "Hostinger": "Hostinger", + "Images to PDF": "Зображення у PDF", + "Invert Colors": "Інвертувати кольори", + "JPG to PDF": "JPG у PDF", + "JSON to PDF": "JSON у PDF", + "Linearize PDF": "Лінеаризація PDF", + "Markdown to PDF": "Markdown у PDF", + "Menu": "Меню", + "Merge PDF": "Об’єднати PDF", + "MOBI to PDF": "MOBI у PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Наступна сторінка", + "Nginx": "Nginx", + "No results for": "Нічого не знайдено за запитом", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG у PDF", + "ODP to PDF": "ODP у PDF", + "ODS to PDF": "ODS у PDF", + "ODT to PDF": "ODT у PDF", + "On this page": "На цій сторінці", + "Optimize & Repair": "Оптимізація та відновлення", + "Organize & Duplicate": "Дублювати та впорядкувати", + "Organize & Manage": "Упорядкування та керування", + "Overview": "Огляд", + "Page Dimensions": "Розміри сторінок", + "Page Numbers": "Нумерація сторінок", + "PDF Booklet": "PDF-буклет", + "PDF Editor": "Редактор PDF", + "PDF Form Filler": "Заповнення PDF-форм", + "PDF Multi Tool": "PDF мультиінструмент", + "PDF OCG": "PDF OCG", + "PDF to BMP": "PDF у BMP", + "PDF to CBZ": "PDF у CBZ", + "PDF to CSV": "PDF у CSV", + "PDF to Excel": "PDF у Excel", + "PDF to Greyscale": "PDF у відтінки сірого", + "PDF to JPG": "PDF у JPG", + "PDF to JSON": "PDF у JSON", + "PDF to Markdown": "PDF у Markdown", + "PDF to PDF/A": "PDF у PDF/A", + "PDF to PNG": "PDF у PNG", + "PDF to SVG": "PDF у SVG", + "PDF to Text": "PDF у текст", + "PDF to TIFF": "PDF у TIFF", + "PDF to WebP": "PDF у WebP", + "PDF to Word": "PDF у Word", + "PDF Workflow Builder": "Конструктор PDF-процесів", + "PDFs to ZIP": "PDF у ZIP", + "PNG to PDF": "PNG у PDF", + "Posterize PDF": "Постеризація PDF", + "PowerPoint to PDF": "PowerPoint у PDF", + "Prepare PDF for AI": "Підготовка PDF для AI", + "Previous page": "Попередня сторінка", + "Protect PDF": "Захистити PDF", + "PSD to PDF": "PSD у PDF", + "PUB to PDF": "PUB у PDF", + "Rasterize PDF": "Растеризація PDF", + "Remove Annotations": "Видалити анотації", + "Remove Blank Pages": "Видалити порожні сторінки", + "Remove Metadata": "Видалити метадані", + "Remove Restrictions": "Зняти обмеження", + "Repair PDF": "Відновити PDF", + "Reset search": "Скинути пошук", + "Return to top": "Повернутися нагору", + "Reverse Pages": "Зворотний порядок сторінок", + "Rotate by Custom Degrees": "Повернути на довільний кут", + "Rotate PDF": "Повернути PDF", + "RTF to PDF": "RTF у PDF", + "Sanitize PDF": "Очистити PDF", + "Scanner Effect": "Ефект сканера", + "Search": "Пошук", + "Secure PDF": "Захист PDF", + "Self-Hosting": "Самостійний хостинг", + "Self-Hosting Guide": "Посібник із самостійного хостингу", + "Sign PDF": "Підписати PDF", + "Skip to content": "Перейти до вмісту", + "Split PDF": "Розділити PDF", + "SVG to PDF": "SVG у PDF", + "Switch to dark theme": "Перейти на темну тему", + "Switch to light theme": "Перейти на світлу тему", + "Table of Contents": "Зміст", + "Text to PDF": "Текст у PDF", + "TIFF to PDF": "TIFF у PDF", + "to close": "закрити", + "to navigate": "навігація", + "to select": "вибрати", + "Tools": "Інструменти", + "Tools Reference": "Довідник інструментів", + "Unlock PDF": "Розблокувати PDF", + "Validate Signature": "Перевірка підпису PDF", + "Vercel": "Vercel", + "View Metadata": "Перегляд метаданих", + "VSD to PDF": "VSD у PDF", + "WebP to PDF": "WebP у PDF", + "Word to PDF": "Word у PDF", + "WPD to PDF": "WPD у PDF", + "WPS to PDF": "WPS у PDF", + "XML to PDF": "XML у PDF", + "XPS to PDF": "XPS у PDF" +} diff --git a/docs/.vitepress/i18n/vi.json b/docs/.vitepress/i18n/vi.json new file mode 100644 index 00000000..8a0e79d0 --- /dev/null +++ b/docs/.vitepress/i18n/vi.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "Thêm tệp đính kèm", + "Add Blank Page": "Thêm trang trống", + "Add Page Labels": "Thêm nhãn trang", + "Add Stamps": "Thêm tem", + "Add Watermark": "Thêm Watermark", + "Adjust Colors": "Điều chỉnh màu sắc", + "Alternate & Mix Pages": "Xen kẽ & Trộn trang", + "Apache": "Apache", + "Appearance": "Giao diện", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "Màu nền", + "Bates Numbering": "Đánh số Bates", + "BMP to PDF": "BMP sang PDF", + "CBZ to PDF": "CBZ sang PDF", + "Change language": "Đổi ngôn ngữ", + "Change Permissions": "Thay đổi quyền", + "Change Text Color": "Thay đổi màu văn bản", + "Close search": "Đóng tìm kiếm", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "Kết hợp thành một trang", + "Commercial License": "Giấy phép thương mại", + "Compare PDFs": "So sánh PDF", + "Compress PDF": "Nén PDF", + "Contributing": "Đóng góp", + "Convert from PDF": "Chuyển đổi từ PDF", + "Convert to PDF": "Chuyển đổi sang PDF", + "Create PDF Form": "Tạo form PDF", + "Crop PDF": "Cắt PDF", + "CSV to PDF": "CSV sang PDF", + "Delete Pages": "Xóa trang", + "Deskew PDF": "Chỉnh nghiêng PDF", + "Digital Signature": "Chữ ký số PDF", + "Display detailed list": "Hiển thị danh sách chi tiết", + "Divide Pages": "Chia trang", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "Tài liệu BentoPDF - Bộ công cụ PDF miễn phí, mã nguồn mở, đặt quyền riêng tư lên hàng đầu", + "Dual-licensed under AGPL-3.0 and Commercial License.": "Cấp phép kép theo AGPL-3.0 và Giấy phép thương mại.", + "Duplex Collate": "Sắp xếp bản quét hai mặt", + "Edit & Annotate": "Chỉnh sửa & Ghi chú", + "Edit Attachments": "Chỉnh sửa tệp đính kèm", + "Edit Bookmarks": "Chỉnh sửa Bookmark", + "Edit Metadata": "Chỉnh sửa Metadata", + "Email to PDF": "Email sang PDF", + "EPUB to PDF": "EPUB sang PDF", + "Excel to PDF": "Excel sang PDF", + "Extract Attachments": "Trích xuất tệp đính kèm", + "Extract Images": "Trích xuất hình ảnh", + "Extract Pages": "Trích xuất trang", + "Extract Tables": "Trích xuất bảng PDF", + "FB2 to PDF": "FB2 sang PDF", + "Fix Page Size": "Sửa kích thước trang", + "Flatten PDF": "Làm phẳng PDF", + "Font to Outline": "Phông chữ thành đường viền", + "Getting Started": "Bắt đầu", + "Guide": "Hướng dẫn", + "Header & Footer": "Đầu trang & Chân trang", + "HEIC to PDF": "HEIC sang PDF", + "Home": "Trang chủ", + "Hostinger": "Hostinger", + "Images to PDF": "Hình ảnh sang PDF", + "Invert Colors": "Đảo ngược màu", + "JPG to PDF": "JPG sang PDF", + "JSON to PDF": "JSON sang PDF", + "Linearize PDF": "Tuyến tính hóa PDF", + "Markdown to PDF": "Markdown sang PDF", + "Menu": "Menu", + "Merge PDF": "Gộp PDF", + "MOBI to PDF": "MOBI sang PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "Trang sau", + "Nginx": "Nginx", + "No results for": "Không có kết quả cho", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG sang PDF", + "ODP to PDF": "ODP sang PDF", + "ODS to PDF": "ODS sang PDF", + "ODT to PDF": "ODT sang PDF", + "On this page": "Trên trang này", + "Optimize & Repair": "Tối ưu hóa & Sửa chữa", + "Organize & Duplicate": "Nhân đôi & Sắp xếp", + "Organize & Manage": "Sắp xếp & Quản lý", + "Overview": "Tổng quan", + "Page Dimensions": "Kích thước trang", + "Page Numbers": "Số trang", + "PDF Booklet": "Sách nhỏ PDF", + "PDF Editor": "Trình chỉnh sửa PDF", + "PDF Form Filler": "Điền form PDF", + "PDF Multi Tool": "Công cụ đa năng PDF", + "PDF OCG": "Lớp PDF (OCG)", + "PDF to BMP": "PDF sang BMP", + "PDF to CBZ": "PDF sang CBZ", + "PDF to CSV": "PDF sang CSV", + "PDF to Excel": "PDF sang Excel", + "PDF to Greyscale": "PDF sang thang xám", + "PDF to JPG": "PDF sang JPG", + "PDF to JSON": "PDF sang JSON", + "PDF to Markdown": "PDF sang Markdown", + "PDF to PDF/A": "PDF sang PDF/A", + "PDF to PNG": "PDF sang PNG", + "PDF to SVG": "PDF sang SVG", + "PDF to Text": "PDF sang văn bản", + "PDF to TIFF": "PDF sang TIFF", + "PDF to WebP": "PDF sang WebP", + "PDF to Word": "PDF sang Word", + "PDF Workflow Builder": "Trình xây dựng quy trình PDF", + "PDFs to ZIP": "PDF sang ZIP", + "PNG to PDF": "PNG sang PDF", + "Posterize PDF": "Chia PDF thành poster", + "PowerPoint to PDF": "PowerPoint sang PDF", + "Prepare PDF for AI": "Chuẩn bị PDF cho AI", + "Previous page": "Trang trước", + "Protect PDF": "Bảo vệ PDF", + "PSD to PDF": "PSD sang PDF", + "PUB to PDF": "PUB sang PDF", + "Rasterize PDF": "Raster hóa PDF", + "Remove Annotations": "Xóa ghi chú", + "Remove Blank Pages": "Xóa trang trống", + "Remove Metadata": "Xóa Metadata", + "Remove Restrictions": "Xóa hạn chế", + "Repair PDF": "Sửa chữa PDF", + "Reset search": "Đặt lại tìm kiếm", + "Return to top": "Về đầu trang", + "Reverse Pages": "Đảo ngược trang", + "Rotate by Custom Degrees": "Xoay theo độ tùy chỉnh", + "Rotate PDF": "Xoay PDF", + "RTF to PDF": "RTF sang PDF", + "Sanitize PDF": "Làm sạch PDF", + "Scanner Effect": "Hiệu ứng máy quét", + "Search": "Tìm kiếm", + "Secure PDF": "Bảo mật PDF", + "Self-Hosting": "Tự lưu trữ", + "Self-Hosting Guide": "Hướng dẫn tự lưu trữ", + "Sign PDF": "Ký PDF", + "Skip to content": "Chuyển đến nội dung", + "Split PDF": "Chia PDF", + "SVG to PDF": "SVG sang PDF", + "Switch to dark theme": "Chuyển sang giao diện tối", + "Switch to light theme": "Chuyển sang giao diện sáng", + "Table of Contents": "Mục lục", + "Text to PDF": "Văn bản sang PDF", + "TIFF to PDF": "TIFF sang PDF", + "to close": "để đóng", + "to navigate": "để di chuyển", + "to select": "để chọn", + "Tools": "Công cụ", + "Tools Reference": "Tham chiếu công cụ", + "Unlock PDF": "Mở khóa PDF", + "Validate Signature": "Xác minh chữ ký PDF", + "Vercel": "Vercel", + "View Metadata": "Xem Metadata", + "VSD to PDF": "VSD sang PDF", + "WebP to PDF": "WebP sang PDF", + "Word to PDF": "Word sang PDF", + "WPD to PDF": "WPD sang PDF", + "WPS to PDF": "WPS sang PDF", + "XML to PDF": "XML sang PDF", + "XPS to PDF": "XPS sang PDF" +} diff --git a/docs/.vitepress/i18n/zh-TW.json b/docs/.vitepress/i18n/zh-TW.json new file mode 100644 index 00000000..ef7af814 --- /dev/null +++ b/docs/.vitepress/i18n/zh-TW.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "新增附件", + "Add Blank Page": "新增空白頁面", + "Add Page Labels": "新增頁面標籤", + "Add Stamps": "新增印章", + "Add Watermark": "新增浮水印", + "Adjust Colors": "調整顏色", + "Alternate & Mix Pages": "交錯混合頁面", + "Apache": "Apache", + "Appearance": "外觀", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "背景顏色", + "Bates Numbering": "Bates 編號", + "BMP to PDF": "BMP 轉 PDF", + "CBZ to PDF": "CBZ 轉 PDF", + "Change language": "變更語言", + "Change Permissions": "變更權限", + "Change Text Color": "更改文字顏色", + "Close search": "關閉搜尋", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "合併為單一頁面", + "Commercial License": "商業授權", + "Compare PDFs": "比較 PDF", + "Compress PDF": "壓縮 PDF", + "Contributing": "參與貢獻", + "Convert from PDF": "從 PDF 轉換", + "Convert to PDF": "轉換為 PDF", + "Create PDF Form": "建立 PDF 表單", + "Crop PDF": "裁切 PDF", + "CSV to PDF": "CSV 轉 PDF", + "Delete Pages": "刪除頁面", + "Deskew PDF": "PDF 歪斜修正", + "Digital Signature": "數位簽章", + "Display detailed list": "顯示詳細清單", + "Divide Pages": "分割頁面", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "BentoPDF 說明文件:免費、開源、隱私優先的 PDF 工具箱", + "Dual-licensed under AGPL-3.0 and Commercial License.": "以 AGPL-3.0 與商業授權雙重授權。", + "Duplex Collate": "雙面掃描整理", + "Edit & Annotate": "編輯與註解", + "Edit Attachments": "編輯附件", + "Edit Bookmarks": "編輯書籤", + "Edit Metadata": "編輯中繼資料", + "Email to PDF": "電子郵件轉 PDF", + "EPUB to PDF": "EPUB 轉 PDF", + "Excel to PDF": "Excel 轉 PDF", + "Extract Attachments": "擷取附件", + "Extract Images": "擷取圖片", + "Extract Pages": "擷取頁面", + "Extract Tables": "擷取 PDF 表格", + "FB2 to PDF": "FB2 轉 PDF", + "Fix Page Size": "統一頁面尺寸", + "Flatten PDF": "平面化 PDF", + "Font to Outline": "字型轉外框", + "Getting Started": "開始使用", + "Guide": "指南", + "Header & Footer": "頁首與頁尾", + "HEIC to PDF": "HEIC 轉 PDF", + "Home": "首頁", + "Hostinger": "Hostinger", + "Images to PDF": "圖片轉 PDF", + "Invert Colors": "反轉顏色", + "JPG to PDF": "JPG 轉 PDF", + "JSON to PDF": "JSON 轉 PDF", + "Linearize PDF": "線性化 PDF", + "Markdown to PDF": "Markdown 轉 PDF", + "Menu": "選單", + "Merge PDF": "合併 PDF", + "MOBI to PDF": "MOBI 轉 PDF", + "N-Up PDF": "多頁併一頁 (N-Up)", + "Netlify": "Netlify", + "Next page": "下一頁", + "Nginx": "Nginx", + "No results for": "找不到相關結果:", + "OCR PDF": "PDF 文字辨識 (OCR)", + "ODG to PDF": "ODG 轉 PDF", + "ODP to PDF": "ODP 轉 PDF", + "ODS to PDF": "ODS 轉 PDF", + "ODT to PDF": "ODT 轉 PDF", + "On this page": "本頁內容", + "Optimize & Repair": "最佳化與修復", + "Organize & Duplicate": "整理與複製", + "Organize & Manage": "整理與管理", + "Overview": "概覽", + "Page Dimensions": "頁面尺寸", + "Page Numbers": "頁碼", + "PDF Booklet": "PDF 小手冊", + "PDF Editor": "PDF 編輯器", + "PDF Form Filler": "PDF 表單填寫器", + "PDF Multi Tool": "PDF 多功能工具", + "PDF OCG": "PDF 圖層(OCG)", + "PDF to BMP": "PDF 轉 BMP", + "PDF to CBZ": "PDF 轉 CBZ", + "PDF to CSV": "PDF 轉 CSV", + "PDF to Excel": "PDF 轉 Excel", + "PDF to Greyscale": "PDF 轉灰階", + "PDF to JPG": "PDF 轉 JPG", + "PDF to JSON": "PDF 轉 JSON", + "PDF to Markdown": "PDF 轉 Markdown", + "PDF to PDF/A": "PDF 轉 PDF/A", + "PDF to PNG": "PDF 轉 PNG", + "PDF to SVG": "PDF 轉 SVG", + "PDF to Text": "PDF 轉文字", + "PDF to TIFF": "PDF 轉 TIFF", + "PDF to WebP": "PDF 轉 WebP", + "PDF to Word": "PDF 轉 Word", + "PDF Workflow Builder": "PDF 工作流程建構器", + "PDFs to ZIP": "PDF 轉 ZIP", + "PNG to PDF": "PNG 轉 PDF", + "Posterize PDF": "海報化 PDF", + "PowerPoint to PDF": "PowerPoint 轉 PDF", + "Prepare PDF for AI": "為 AI 準備 PDF", + "Previous page": "上一頁", + "Protect PDF": "保護 PDF", + "PSD to PDF": "PSD 轉 PDF", + "PUB to PDF": "PUB 轉 PDF", + "Rasterize PDF": "光柵化 PDF", + "Remove Annotations": "移除註解", + "Remove Blank Pages": "移除空白頁面", + "Remove Metadata": "移除中繼資料", + "Remove Restrictions": "移除限制", + "Repair PDF": "修復 PDF", + "Reset search": "重設搜尋", + "Return to top": "回到頂端", + "Reverse Pages": "反轉頁面", + "Rotate by Custom Degrees": "自訂角度旋轉", + "Rotate PDF": "旋轉 PDF", + "RTF to PDF": "RTF 轉 PDF", + "Sanitize PDF": "清理 PDF", + "Scanner Effect": "掃描效果", + "Search": "搜尋", + "Secure PDF": "保護 PDF", + "Self-Hosting": "自行架設", + "Self-Hosting Guide": "自行架設指南", + "Sign PDF": "簽署 PDF", + "Skip to content": "跳至內容", + "Split PDF": "分割 PDF", + "SVG to PDF": "SVG 轉 PDF", + "Switch to dark theme": "切換為深色主題", + "Switch to light theme": "切換為淺色主題", + "Table of Contents": "目錄", + "Text to PDF": "文字轉 PDF", + "TIFF to PDF": "TIFF 轉 PDF", + "to close": "關閉", + "to navigate": "切換選項", + "to select": "選取", + "Tools": "工具", + "Tools Reference": "工具參考", + "Unlock PDF": "解除鎖定 PDF", + "Validate Signature": "驗證 PDF 數位簽章", + "Vercel": "Vercel", + "View Metadata": "檢視中繼資料", + "VSD to PDF": "VSD 轉 PDF", + "WebP to PDF": "WebP 轉 PDF", + "Word to PDF": "Word 轉 PDF", + "WPD to PDF": "WPD 轉 PDF", + "WPS to PDF": "WPS 轉 PDF", + "XML to PDF": "XML 轉 PDF", + "XPS to PDF": "XPS 轉 PDF" +} diff --git a/docs/.vitepress/i18n/zh.json b/docs/.vitepress/i18n/zh.json new file mode 100644 index 00000000..f957ccce --- /dev/null +++ b/docs/.vitepress/i18n/zh.json @@ -0,0 +1,160 @@ +{ + "Add Attachments": "添加附件", + "Add Blank Page": "添加空白页", + "Add Page Labels": "添加页面标签", + "Add Stamps": "添加印章", + "Add Watermark": "添加水印", + "Adjust Colors": "调整颜色", + "Alternate & Mix Pages": "交替混合页面", + "Apache": "Apache", + "Appearance": "外观", + "AWS S3 + CloudFront": "AWS S3 + CloudFront", + "Background Color": "背景颜色", + "Bates Numbering": "Bates 编号", + "BMP to PDF": "BMP 转 PDF", + "CBZ to PDF": "CBZ 转 PDF", + "Change language": "切换语言", + "Change Permissions": "更改权限", + "Change Text Color": "更改文本颜色", + "Close search": "关闭搜索", + "Cloudflare Pages": "Cloudflare Pages", + "Combine to Single Page": "合并为单页", + "Commercial License": "商业许可", + "Compare PDFs": "比较 PDF", + "Compress PDF": "压缩 PDF", + "Contributing": "参与贡献", + "Convert from PDF": "从 PDF 转换", + "Convert to PDF": "转换为 PDF", + "Create PDF Form": "创建 PDF 表单", + "Crop PDF": "裁剪 PDF", + "CSV to PDF": "CSV 转 PDF", + "Delete Pages": "删除页面", + "Deskew PDF": "校正 PDF", + "Digital Signature": "数字签名", + "Display detailed list": "显示详细列表", + "Divide Pages": "分割页面", + "Docker": "Docker", + "Documentation for BentoPDF - The free, open-source, privacy-first PDF toolkit": "BentoPDF 文档:免费、开源、隐私优先的 PDF 工具箱", + "Dual-licensed under AGPL-3.0 and Commercial License.": "采用 AGPL-3.0 与商业许可双重授权。", + "Duplex Collate": "双面扫描整理", + "Edit & Annotate": "编辑与注释", + "Edit Attachments": "编辑附件", + "Edit Bookmarks": "编辑书签", + "Edit Metadata": "编辑元数据", + "Email to PDF": "邮件转 PDF", + "EPUB to PDF": "EPUB 转 PDF", + "Excel to PDF": "Excel 转 PDF", + "Extract Attachments": "提取附件", + "Extract Images": "提取图片", + "Extract Pages": "提取页面", + "Extract Tables": "提取 PDF 表格", + "FB2 to PDF": "FB2 转 PDF", + "Fix Page Size": "修复页面尺寸", + "Flatten PDF": "扁平化 PDF", + "Font to Outline": "字体转轮廓", + "Getting Started": "快速入门", + "Guide": "指南", + "Header & Footer": "页眉和页脚", + "HEIC to PDF": "HEIC 转 PDF", + "Home": "首页", + "Hostinger": "Hostinger", + "Images to PDF": "图片转 PDF", + "Invert Colors": "反转颜色", + "JPG to PDF": "JPG 转 PDF", + "JSON to PDF": "JSON 转 PDF", + "Linearize PDF": "线性化 PDF", + "Markdown to PDF": "Markdown 转 PDF", + "Menu": "菜单", + "Merge PDF": "合并 PDF", + "MOBI to PDF": "MOBI 转 PDF", + "N-Up PDF": "N-Up PDF", + "Netlify": "Netlify", + "Next page": "下一页", + "Nginx": "Nginx", + "No results for": "没有找到相关结果:", + "OCR PDF": "OCR PDF", + "ODG to PDF": "ODG 转 PDF", + "ODP to PDF": "ODP 转 PDF", + "ODS to PDF": "ODS 转 PDF", + "ODT to PDF": "ODT 转 PDF", + "On this page": "本页内容", + "Optimize & Repair": "优化与修复", + "Organize & Duplicate": "复制与组织", + "Organize & Manage": "组织与管理", + "Overview": "概览", + "Page Dimensions": "页面尺寸", + "Page Numbers": "页码", + "PDF Booklet": "PDF 小册子", + "PDF Editor": "PDF 编辑器", + "PDF Form Filler": "PDF 表单填写器", + "PDF Multi Tool": "PDF 多功能工具", + "PDF OCG": "PDF 图层 (OCG)", + "PDF to BMP": "PDF 转 BMP", + "PDF to CBZ": "PDF 转 CBZ", + "PDF to CSV": "PDF 转 CSV", + "PDF to Excel": "PDF 转 Excel", + "PDF to Greyscale": "PDF 转灰度", + "PDF to JPG": "PDF 转 JPG", + "PDF to JSON": "PDF 转 JSON", + "PDF to Markdown": "PDF 转 Markdown", + "PDF to PDF/A": "PDF 转 PDF/A", + "PDF to PNG": "PDF 转 PNG", + "PDF to SVG": "PDF 转 SVG", + "PDF to Text": "PDF 转文本", + "PDF to TIFF": "PDF 转 TIFF", + "PDF to WebP": "PDF 转 WebP", + "PDF to Word": "PDF 转 Word", + "PDF Workflow Builder": "PDF 工作流构建器", + "PDFs to ZIP": "PDF 转 ZIP", + "PNG to PDF": "PNG 转 PDF", + "Posterize PDF": "海报化 PDF", + "PowerPoint to PDF": "PowerPoint 转 PDF", + "Prepare PDF for AI": "为 AI 准备 PDF", + "Previous page": "上一页", + "Protect PDF": "保护 PDF", + "PSD to PDF": "PSD 转 PDF", + "PUB to PDF": "PUB 转 PDF", + "Rasterize PDF": "栅格化 PDF", + "Remove Annotations": "移除注释", + "Remove Blank Pages": "移除空白页", + "Remove Metadata": "移除元数据", + "Remove Restrictions": "移除限制", + "Repair PDF": "修复 PDF", + "Reset search": "重置搜索", + "Return to top": "返回顶部", + "Reverse Pages": "反转页面", + "Rotate by Custom Degrees": "按自定义角度旋转", + "Rotate PDF": "旋转 PDF", + "RTF to PDF": "RTF 转 PDF", + "Sanitize PDF": "清理 PDF", + "Scanner Effect": "扫描效果", + "Search": "搜索", + "Secure PDF": "安全 PDF", + "Self-Hosting": "自托管", + "Self-Hosting Guide": "自托管指南", + "Sign PDF": "签署 PDF", + "Skip to content": "跳到正文", + "Split PDF": "分割 PDF", + "SVG to PDF": "SVG 转 PDF", + "Switch to dark theme": "切换到深色主题", + "Switch to light theme": "切换到浅色主题", + "Table of Contents": "目录", + "Text to PDF": "文本转 PDF", + "TIFF to PDF": "TIFF 转 PDF", + "to close": "关闭", + "to navigate": "导航", + "to select": "选择", + "Tools": "工具", + "Tools Reference": "工具参考", + "Unlock PDF": "解锁 PDF", + "Validate Signature": "验证签名", + "Vercel": "Vercel", + "View Metadata": "查看元数据", + "VSD to PDF": "VSD 转 PDF", + "WebP to PDF": "WebP 转 PDF", + "Word to PDF": "Word 转 PDF", + "WPD to PDF": "WPD 转 PDF", + "WPS to PDF": "WPS 转 PDF", + "XML to PDF": "XML 转 PDF", + "XPS to PDF": "XPS 转 PDF" +} diff --git a/docs/.vitepress/navigation.mjs b/docs/.vitepress/navigation.mjs new file mode 100644 index 00000000..24c1d73d --- /dev/null +++ b/docs/.vitepress/navigation.mjs @@ -0,0 +1,195 @@ +export const nav = [ + { text: 'Home', link: '/' }, + { text: 'Getting Started', link: '/getting-started' }, + { text: 'Tools', link: '/tools/' }, + { text: 'Self-Hosting', link: '/self-hosting/' }, + { text: 'Contributing', link: '/contributing' }, + { text: 'Commercial License', link: '/licensing' }, +]; + +export const sidebar = { + '/tools/': [ + { + text: 'Tools Reference', + items: [{ text: 'Overview', link: '/tools/' }], + }, + { + text: 'Edit & Annotate', + collapsed: false, + items: [ + { text: 'PDF Editor', link: '/tools/edit-pdf' }, + { text: 'Edit Bookmarks', link: '/tools/bookmark' }, + { text: 'Table of Contents', link: '/tools/table-of-contents' }, + { text: 'Page Numbers', link: '/tools/page-numbers' }, + { text: 'Add Page Labels', link: '/tools/add-page-labels' }, + { text: 'Bates Numbering', link: '/tools/bates-numbering' }, + { text: 'Add Watermark', link: '/tools/add-watermark' }, + { text: 'Header & Footer', link: '/tools/header-footer' }, + { text: 'Invert Colors', link: '/tools/invert-colors' }, + { text: 'Scanner Effect', link: '/tools/scanner-effect' }, + { text: 'Adjust Colors', link: '/tools/adjust-colors' }, + { text: 'Background Color', link: '/tools/background-color' }, + { text: 'Change Text Color', link: '/tools/text-color' }, + { text: 'Sign PDF', link: '/tools/sign-pdf' }, + { text: 'Add Stamps', link: '/tools/add-stamps' }, + { text: 'Remove Annotations', link: '/tools/remove-annotations' }, + { text: 'Crop PDF', link: '/tools/crop-pdf' }, + { text: 'PDF Form Filler', link: '/tools/form-filler' }, + { text: 'Create PDF Form', link: '/tools/form-creator' }, + { text: 'Remove Blank Pages', link: '/tools/remove-blank-pages' }, + ], + }, + { + text: 'Convert to PDF', + collapsed: true, + items: [ + { text: 'Images to PDF', link: '/tools/image-to-pdf' }, + { text: 'JPG to PDF', link: '/tools/jpg-to-pdf' }, + { text: 'PNG to PDF', link: '/tools/png-to-pdf' }, + { text: 'WebP to PDF', link: '/tools/webp-to-pdf' }, + { text: 'SVG to PDF', link: '/tools/svg-to-pdf' }, + { text: 'BMP to PDF', link: '/tools/bmp-to-pdf' }, + { text: 'HEIC to PDF', link: '/tools/heic-to-pdf' }, + { text: 'TIFF to PDF', link: '/tools/tiff-to-pdf' }, + { text: 'Text to PDF', link: '/tools/txt-to-pdf' }, + { text: 'Markdown to PDF', link: '/tools/markdown-to-pdf' }, + { text: 'JSON to PDF', link: '/tools/json-to-pdf' }, + { text: 'ODT to PDF', link: '/tools/odt-to-pdf' }, + { text: 'CSV to PDF', link: '/tools/csv-to-pdf' }, + { text: 'RTF to PDF', link: '/tools/rtf-to-pdf' }, + { text: 'Word to PDF', link: '/tools/word-to-pdf' }, + { text: 'Excel to PDF', link: '/tools/excel-to-pdf' }, + { text: 'PowerPoint to PDF', link: '/tools/powerpoint-to-pdf' }, + { text: 'XPS to PDF', link: '/tools/xps-to-pdf' }, + { text: 'MOBI to PDF', link: '/tools/mobi-to-pdf' }, + { text: 'EPUB to PDF', link: '/tools/epub-to-pdf' }, + { text: 'FB2 to PDF', link: '/tools/fb2-to-pdf' }, + { text: 'CBZ to PDF', link: '/tools/cbz-to-pdf' }, + { text: 'WPD to PDF', link: '/tools/wpd-to-pdf' }, + { text: 'WPS to PDF', link: '/tools/wps-to-pdf' }, + { text: 'XML to PDF', link: '/tools/xml-to-pdf' }, + { text: 'ODG to PDF', link: '/tools/odg-to-pdf' }, + { text: 'ODS to PDF', link: '/tools/ods-to-pdf' }, + { text: 'ODP to PDF', link: '/tools/odp-to-pdf' }, + { text: 'PUB to PDF', link: '/tools/pub-to-pdf' }, + { text: 'VSD to PDF', link: '/tools/vsd-to-pdf' }, + { text: 'PSD to PDF', link: '/tools/psd-to-pdf' }, + { text: 'Email to PDF', link: '/tools/email-to-pdf' }, + ], + }, + { + text: 'Convert from PDF', + collapsed: true, + items: [ + { text: 'PDF to JPG', link: '/tools/pdf-to-jpg' }, + { text: 'PDF to PNG', link: '/tools/pdf-to-png' }, + { text: 'PDF to WebP', link: '/tools/pdf-to-webp' }, + { text: 'PDF to BMP', link: '/tools/pdf-to-bmp' }, + { text: 'PDF to TIFF', link: '/tools/pdf-to-tiff' }, + { text: 'PDF to CBZ', link: '/tools/pdf-to-cbz' }, + { text: 'PDF to SVG', link: '/tools/pdf-to-svg' }, + { text: 'PDF to CSV', link: '/tools/pdf-to-csv' }, + { text: 'PDF to Excel', link: '/tools/pdf-to-excel' }, + { text: 'PDF to Greyscale', link: '/tools/pdf-to-greyscale' }, + { text: 'PDF to JSON', link: '/tools/pdf-to-json' }, + { text: 'PDF to Word', link: '/tools/pdf-to-word' }, + { text: 'Extract Images', link: '/tools/extract-images' }, + { text: 'PDF to Markdown', link: '/tools/pdf-to-markdown' }, + { text: 'Prepare PDF for AI', link: '/tools/prepare-pdf-for-ai' }, + { text: 'PDF to Text', link: '/tools/pdf-to-text' }, + { text: 'Extract Tables', link: '/tools/extract-tables' }, + ], + }, + { + text: 'Organize & Manage', + collapsed: true, + items: [ + { text: 'PDF Workflow Builder', link: '/tools/pdf-workflow' }, + { text: 'PDF Multi Tool', link: '/tools/pdf-multi-tool' }, + { text: 'OCR PDF', link: '/tools/ocr-pdf' }, + { text: 'Merge PDF', link: '/tools/merge-pdf' }, + { text: 'Alternate & Mix Pages', link: '/tools/alternate-merge' }, + { text: 'Duplex Collate', link: '/tools/duplex-collate' }, + { text: 'Organize & Duplicate', link: '/tools/organize-pdf' }, + { text: 'Add Attachments', link: '/tools/add-attachments' }, + { text: 'Extract Attachments', link: '/tools/extract-attachments' }, + { text: 'Edit Attachments', link: '/tools/edit-attachments' }, + { text: 'PDF OCG', link: '/tools/pdf-layers' }, + { text: 'Split PDF', link: '/tools/split-pdf' }, + { text: 'Divide Pages', link: '/tools/divide-pages' }, + { text: 'Extract Pages', link: '/tools/extract-pages' }, + { text: 'Delete Pages', link: '/tools/delete-pages' }, + { text: 'Add Blank Page', link: '/tools/add-blank-page' }, + { text: 'Reverse Pages', link: '/tools/reverse-pages' }, + { text: 'Rotate PDF', link: '/tools/rotate-pdf' }, + { text: 'Rotate by Custom Degrees', link: '/tools/rotate-custom' }, + { text: 'N-Up PDF', link: '/tools/n-up-pdf' }, + { text: 'PDF Booklet', link: '/tools/pdf-booklet' }, + { text: 'Combine to Single Page', link: '/tools/combine-single-page' }, + { text: 'View Metadata', link: '/tools/view-metadata' }, + { text: 'Edit Metadata', link: '/tools/edit-metadata' }, + { text: 'PDFs to ZIP', link: '/tools/pdf-to-zip' }, + { text: 'Compare PDFs', link: '/tools/compare-pdfs' }, + { text: 'Posterize PDF', link: '/tools/posterize-pdf' }, + ], + }, + { + text: 'Optimize & Repair', + collapsed: true, + items: [ + { text: 'Compress PDF', link: '/tools/compress-pdf' }, + { text: 'PDF to PDF/A', link: '/tools/pdf-to-pdfa' }, + { text: 'Fix Page Size', link: '/tools/fix-page-size' }, + { text: 'Linearize PDF', link: '/tools/linearize-pdf' }, + { text: 'Page Dimensions', link: '/tools/page-dimensions' }, + { text: 'Remove Restrictions', link: '/tools/remove-restrictions' }, + { text: 'Repair PDF', link: '/tools/repair-pdf' }, + { text: 'Rasterize PDF', link: '/tools/rasterize-pdf' }, + { text: 'Deskew PDF', link: '/tools/deskew-pdf' }, + { text: 'Font to Outline', link: '/tools/font-to-outline' }, + ], + }, + { + text: 'Secure PDF', + collapsed: true, + items: [ + { text: 'Protect PDF', link: '/tools/protect-pdf' }, + { text: 'Sanitize PDF', link: '/tools/sanitize-pdf' }, + { text: 'Unlock PDF', link: '/tools/unlock-pdf' }, + { text: 'Flatten PDF', link: '/tools/flatten-pdf' }, + { text: 'Remove Metadata', link: '/tools/remove-metadata' }, + { text: 'Change Permissions', link: '/tools/change-permissions' }, + { text: 'Digital Signature', link: '/tools/digital-sign-pdf' }, + { text: 'Validate Signature', link: '/tools/validate-signature-pdf' }, + ], + }, + ], + '/self-hosting/': [ + { + text: 'Self-Hosting Guide', + items: [ + { text: 'Overview', link: '/self-hosting/' }, + { text: 'Docker', link: '/self-hosting/docker' }, + { text: 'Vercel', link: '/self-hosting/vercel' }, + { text: 'Netlify', link: '/self-hosting/netlify' }, + { text: 'Cloudflare Pages', link: '/self-hosting/cloudflare' }, + { text: 'AWS S3 + CloudFront', link: '/self-hosting/aws' }, + { text: 'Hostinger', link: '/self-hosting/hostinger' }, + { text: 'Nginx', link: '/self-hosting/nginx' }, + { text: 'Apache', link: '/self-hosting/apache' }, + ], + }, + ], + '/': [ + { + text: 'Guide', + items: [ + { text: 'Getting Started', link: '/getting-started' }, + { text: 'Tools Reference', link: '/tools/' }, + { text: 'Self-Hosting', link: '/self-hosting/' }, + { text: 'Contributing', link: '/contributing' }, + { text: 'Commercial License', link: '/licensing' }, + ], + }, + ], +}; diff --git a/docs/ar/contributing.md b/docs/ar/contributing.md new file mode 100644 index 00000000..515f6f24 --- /dev/null +++ b/docs/ar/contributing.md @@ -0,0 +1,136 @@ +# المساهمة + +شكرًا لاهتمامك بالمساهمة في BentoPDF! سيساعدك هذا الدليل على البدء. + +## البدء + +### المتطلبات + +- Node.js 18+ +- npm 9+ +- Git + +### الإعداد + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## بنية المشروع + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## إضافة أداة جديدة + +### الخطوة 1: إنشاء ملف المنطق + +أنشئ `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### الخطوة 2: إنشاء صفحة HTML + +أنشئ `src/pages/your-tool.html` باتباع قوالب الأدوات الموجودة. + +### الخطوة 3: تسجيل الأداة + +أضف إلى `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### الخطوة 4: الإضافة إلى إعدادات البناء + +أضف الصفحة إلى `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### الخطوة 5: إضافة الترجمات + +أضف مدخلات إلى جميع ملفات اللغات في `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## نمط الكود + +- استخدم TypeScript لكل الكود الجديد +- اتبع الأنماط الموجودة للحفاظ على الاتساق +- شغّل `npm run format` قبل الإيداع +- لا تضف تعليقات في كود الإنتاج (تُزال التعليقات أثناء البناء) + +## عملية طلب السحب + +1. أنشئ فرعًا للميزة: `git checkout -b feature/your-feature` +2. أجرِ تعديلاتك +3. اختبر جيدًا: `npm run build` +4. أرسل طلب سحب (PR) مع وصف واضح + +## الترجمة + +راجع [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) لإضافة لغات جديدة. + +## اتفاقية ترخيص المساهم + +قبل دمج طلب السحب، ستحتاج إلى توقيع اتفاقية CLA الخاصة بنا: + +- [اتفاقية المساهم الفرد (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [اتفاقية المساهم المؤسسي (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## الحصول على المساعدة + +- [مشكلات GitHub](https://github.com/alam00000/bentopdf/issues) +- [مجتمع Discord](https://discord.gg/Bgq3Ay3f2w) + +## الترخيص + +BentoPDF مرخّص بترخيص مزدوج: + +- **AGPL-3.0** للمشاريع مفتوحة المصدر التي تشارك كامل شيفرتها المصدرية علنًا +- **ترخيص تجاري** للتطبيقات الخاصة/مغلقة المصدر - [احصل على ترخيص مدى الحياة مقابل 79$](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +بمساهمتك، فإنك توافق على ترخيص مساهماتك بموجب هذه الشروط. diff --git a/docs/ar/getting-started.md b/docs/ar/getting-started.md new file mode 100644 index 00000000..84cf1dbc --- /dev/null +++ b/docs/ar/getting-started.md @@ -0,0 +1,80 @@ +# البدء + +مرحبًا بك في BentoPDF! سيساعدك هذا الدليل على الانطلاق بسرعة. + +## ما هو BentoPDF؟ + +BentoPDF مجموعة أدوات PDF مجانية ومفتوحة المصدر تضع الخصوصية أولًا، وتعمل **بالكامل داخل متصفحك**. ملفاتك لا تغادر جهازك أبدًا، فكل المعالجة تتم محليًا باستخدام تقنية WebAssembly (WASM). + +## بداية سريعة + +### الخيار 1: استخدام النسخة المستضافة + +زر [bentopdf.com](https://www.bentopdf.com) لاستخدام BentoPDF فورًا، بدون أي تثبيت. + +### الخيار 2: الاستضافة الذاتية باستخدام Docker + +> [!IMPORTANT] +> يتطلب تحويل ملفات Office وجود `SharedArrayBuffer`، وهذا يحتاج إلى كل مما يلي: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - سياق آمن +> +> يعمل `http://localhost` للاختبار المحلي لأن المتصفحات تعتبر عنوان الحلقة المحلية موثوقًا. أما `http://192.168.x.x` أو غيره من عناوين الشبكة المحلية فعادةً لا يُعتبر كذلك، لذا تتطلب تحويلات Word/Excel/PowerPoint اتصال HTTPS عند الوصول من أجهزة أخرى على شبكتك. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> يتوفر BentoPDF بنسختين: **نسخة الاستضافة الذاتية** (`bentopdf-simple`، المستخدمة أعلاه) لعمليات النشر الداخلية وللفرق والمؤسسات، و**النسخة التجارية** (`bentopdf:latest`) التي يستخدمها bentopdf.com نفسه وأصحاب التراخيص التجارية الذين ينشرون خدمات موجهة للعامة. كلتا النسختين تتضمنان أدوات PDF نفسها، وتضيف النسخة التجارية الواجهة الرئيسية لـ bentopdf.com والأسئلة الشائعة وآراء المستخدمين والتذييل. إذا كنت غير متأكد، فاستخدم نسخة الاستضافة الذاتية. + +ثم افتح `http://localhost:3000` في متصفحك. + +> [!NOTE] +> إذا كنت تجهّز نشرًا معزولًا عن الإنترنت لميزة OCR، فعليك استضافة خطوط الطبقة النصية الخاصة بـ OCR داخليًا، إضافة إلى عامل Tesseract وبيئة التشغيل الأساسية وملفات traineddata. الإعداد الكامل موثّق في [الاستضافة الذاتية](/ar/self-hosting/)، بما في ذلك `VITE_OCR_FONT_BASE_URL` والمجلد المضمّن `ocr-fonts/`. + +### الخيار 3: البناء من المصدر + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## نظرة سريعة على الميزات + +| الفئة | الأدوات | +| -------------------- | ----------------------------------------------------------- | +| **التحويل إلى PDF** | Word وExcel وPowerPoint والصور وMarkdown وEPUB وMOBI وغيرها | +| **التحويل من PDF** | JPG وPNG ونص وExcel وSVG وغيرها | +| **التحرير والتعليق** | التوقيع، التمييز، التنقيح، تعبئة النماذج، إضافة الأختام | +| **التنظيم** | دمج، تقسيم، تدوير، حذف الصفحات، إعادة الترتيب | +| **التحسين** | ضغط، إصلاح، تسطيح، OCR | +| **الأمان** | تشفير، فك التشفير، إزالة القيود | + +## دعم المتصفحات + +يعمل BentoPDF بأفضل شكل على المتصفحات الحديثة: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## الخطوات التالية + +- [استكشف جميع الأدوات](/ar/tools/) +- [استضف BentoPDF بنفسك](/ar/self-hosting/) +- [ساهم في المشروع](/ar/contributing) diff --git a/docs/ar/index.md b/docs/ar/index.md new file mode 100644 index 00000000..c7c793d9 --- /dev/null +++ b/docs/ar/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'أدوات PDF مجانية ومفتوحة المصدر' + tagline: عالج ملفات PDF بالكامل داخل متصفحك. بدون رفع ملفات. بدون خوادم. خصوصية كاملة. + actions: + - theme: brand + text: ابدأ الآن + link: /ar/getting-started + - theme: alt + text: عرض الأدوات + link: /ar/tools/ + - theme: alt + text: الاستضافة الذاتية + link: /ar/self-hosting/ + - theme: alt + text: الترخيص التجاري + link: /ar/licensing + +features: + - icon: 🔒 + title: خصوصية 100% + details: ملفاتك لا تغادر جهازك أبدًا. تتم كل المعالجة محليًا في متصفحك باستخدام WebAssembly. + - icon: ⚡ + title: سريع ومجاني + details: بدون تسجيل، بدون حدود، بدون علامات مائية. عالج عددًا غير محدود من ملفات PDF مجانًا، إلى الأبد. + - icon: 🛠️ + title: أكثر من 50 أداة + details: حوّل وحرّر وادمج وقسّم وضغط ووقّع وطبّق OCR، والمزيد. كل ما تحتاجه في مكان واحد. + + - icon: 🌐 + title: قابل للاستضافة الذاتية + details: انشره على بنيتك التحتية الخاصة. Docker أو Vercel أو Netlify أو AWS، أو بيئات معزولة تمامًا عن الإنترنت مع عمال OCR وبيانات لغات وخطوط طبقة نصية مستضافة ذاتيًا. +--- + +## OCR بدون اتصال + +إذا استضفت BentoPDF ذاتيًا في بيئة معزولة عن الإنترنت أو بدون اتصال، فإن OCR يحتاج إلى أكثر من عامل Tesseract وملفات traineddata. فإخراج PDF القابل للبحث يتطلب أيضًا تقديم خطوط الطبقة النصية الخاصة بـ OCR من الداخل. +راجع [الاستضافة الذاتية](/ar/self-hosting/) للإعداد الكامل، بما في ذلك `VITE_OCR_FONT_BASE_URL` والمجلد المضمّن `ocr-fonts/` وسير العمل المحدّث للبيئات المعزولة. diff --git a/docs/ar/licensing.md b/docs/ar/licensing.md new file mode 100644 index 00000000..cf218705 --- /dev/null +++ b/docs/ar/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/ar/self-hosting/#إعداد-wasm-مكونات-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/ar/self-hosting/apache.md b/docs/ar/self-hosting/apache.md new file mode 100644 index 00000000..7171021e --- /dev/null +++ b/docs/ar/self-hosting/apache.md @@ -0,0 +1,275 @@ +# النشر باستخدام Apache + +استضف BentoPDF باستخدام خادم Apache HTTP. + +## المتطلبات + +- Apache 2.4+ +- تفعيل mod_rewrite +- شهادة SSL (موصى بها) + +## الخطوة 1: بناء المشروع + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +لتخصيص العلامة التجارية، عيّن متغيرات البيئة قبل البناء: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## الخطوة 2: نسخ الملفات + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## الخطوة 3: إعداد Apache + +أنشئ `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## الخطوة 4: ملف .htaccess للتوجيه + +أنشئ `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## الخطوة 5: تفعيل الوحدات المطلوبة + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## الخطوة 6: تفعيل الموقع + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## النشر في مجلد فرعي + +للاستضافة على المسار `/pdf/`: + +1. ابنِ المشروع مع عنوان أساسي (base URL): + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. حدّث `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## استكشاف الأخطاء وإصلاحها + +### أخطاء WASM 404 + +تأكد من ضبط نوع MIME: + +```apache +AddType application/wasm .wasm +``` + +### أداة توقيع PDF أو تعبئة النماذج تعرض عارضًا فارغًا (خطأ MIME لملفات `.mjs`) + +إذا ظهر في وحدة تحكم المتصفح: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...وكان الطلب الفاشل ينتهي بـ `.mjs`، فإن إعداد Apache لديك يفتقد الربط `.mjs → application/javascript`. يتضمن عارض PDF المدمج ملفات وحدات ES بامتداد `.mjs`، ولا يشملها ملف `mime.types` الافتراضي في Apache. + +أضف التالي إلى VirtualHost أو إلى `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +ثم أعد تحميل Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +للتأكد: في أدوات المطوّر بالمتصفح (DevTools) ← تبويب Network، ابحث عن طلب `.mjs` الفاشل وافحص ترويسة الاستجابة `Content-Type`. يجب أن تكون الآن `application/javascript` وليست `application/octet-stream`. + +### إعادة الكتابة لا تعمل + +تأكد من تفعيل mod_rewrite: + +```bash +sudo a2enmod rewrite +``` + +### تحويل Word/ODT/Excel إلى PDF لا يعمل + +يتطلب LibreOffice WASM وجود `SharedArrayBuffer`، وهذا يحتاج إلى هذه الترويسات: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +ويحتاج أيضًا إلى سياق آمن. يعمل `http://localhost` للاختبار المحلي، لكن `http://192.168.x.x` أو غيره من عناوين الشبكة المحلية يتطلب عادةً HTTPS. إذا كانت الترويسات موجودة لكن `window.crossOriginIsolated` ما زالت `false`، فتحقق مما إذا كانت الصفحة تُفتح عبر HTTP عادي من مصدر ليس عنوان الحلقة المحلية. + +كما تحتاج ملفات `.wasm.gz` و`.data.gz` المضغوطة مسبقًا إلى `Content-Encoding` صحيح: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +تأكد من تفعيل `mod_headers`: `sudo a2enmod headers` + +### تم رفض الإذن + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/ar/self-hosting/aws.md b/docs/ar/self-hosting/aws.md new file mode 100644 index 00000000..34c0f32e --- /dev/null +++ b/docs/ar/self-hosting/aws.md @@ -0,0 +1,200 @@ +# النشر على AWS S3 + CloudFront + +استضف BentoPDF على AWS للحصول على أقصى تحكم وقابلية للتوسع. + +## البنية + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## الخطوة 1: إنشاء حاوية S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## الخطوة 2: البناء والرفع + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## الخطوة 3: إنشاء توزيع CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +أو استخدم وحدة تحكم AWS: + +1. انتقل إلى CloudFront ← Create distribution +2. Origin domain: اختر حاوية S3 الخاصة بك +3. فعّل "Origin Access Control" +4. Default root object: `index.html` +5. أنشئ التوزيع (Create distribution) + +## الخطوة 3b: سياسة ترويسات الاستجابة (مطلوبة لـ LibreOffice WASM) + +تتطلب التحويلات المعتمدة على LibreOffice (من Word وExcel وPowerPoint إلى PDF) وجود `SharedArrayBuffer`، وهذا يحتاج إلى ترويسات استجابة محددة. أنشئ سياسة ترويسات استجابة في CloudFront: + +1. انتقل إلى CloudFront ← Policies ← Response headers +2. أنشئ سياسة مخصصة بهذه الترويسات: + +| الترويسة | القيمة | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. اربط السياسة بسلوك التخزين المؤقت الافتراضي لتوزيعك + +أو عبر سطر الأوامر: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## الخطوة 3c: بيانات S3 الوصفية لملفات WASM المضغوطة مسبقًا + +ملفات LibreOffice WASM مضغوطة مسبقًا (`.wasm.gz` و`.data.gz`). اضبط Content-Type وContent-Encoding الصحيحين لكي تفك المتصفحات ضغطها: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning مهم +بدون سياسة ترويسات الاستجابة، لن يتوفر `SharedArrayBuffer` وستتوقف تحويلات LibreOffice WASM عند نحو 55%. وبدون Content-Encoding الصحيح على ملفات `.gz`، يستلم المتصفح بايتات gzip الخام ويفشل تجميع WASM. +::: + +## الخطوة 4: سياسة حاوية S3 + +اسمح لـ CloudFront بالوصول إلى الحاوية: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## الخطوة 5: صفحات الخطأ المخصصة + +اضبط الخطأ 404 ليعيد `index.html` لتوجيه تطبيق الصفحة الواحدة (SPA): + +1. CloudFront ← Error pages +2. أنشئ استجابة خطأ مخصصة: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## تقدير التكلفة + +| المورد | التكلفة التقديرية | +| --------------------- | ----------------- | +| تخزين S3 (~500MB) | ~$0.01/شهريًا | +| CloudFront (نقل 1TB) | ~$85/شهريًا | +| CloudFront (نقل 10GB) | ~$0.85/شهريًا | + +::: tip +استخدم S3 Intelligent Tiering لتحسين التكلفة للملفات التي نادرًا ما يُوصل إليها. +::: + +## الأتمتة باستخدام Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/ar/self-hosting/cloudflare.md b/docs/ar/self-hosting/cloudflare.md new file mode 100644 index 00000000..4d43ebd0 --- /dev/null +++ b/docs/ar/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# النشر على Cloudflare Pages + +يوفر [Cloudflare Pages](https://pages.cloudflare.com) استضافة سريعة وعالمية للمواقع الثابتة مع نطاق ترددي غير محدود. + +## نشر سريع + +1. انتقل إلى [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. انقر على "Create a project" +3. اربط مستودع GitHub الخاص بك + +## إعدادات البناء + +| الإعداد | القيمة | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## متغيرات البيئة + +أضف هذه في Settings ← Environment variables: + +| المتغير | القيمة | +| ----------------------- | ------------------------------------------ | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (اختياري) | +| `VITE_BRAND_NAME` | اسم العلامة التجارية (اختياري) | +| `VITE_BRAND_LOGO` | مسار الشعار نسبةً إلى `public/` (اختياري) | +| `VITE_FOOTER_TEXT` | نص التذييل/حقوق النشر (اختياري) | +| `VITE_DEFAULT_LANGUAGE` | لغة الواجهة الافتراضية، مثل `fr` (اختياري) | + +## ملف الإعدادات + +أنشئ `_headers` في مجلد `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning مهم +الترويستان `Cross-Origin-Embedder-Policy` و`Cross-Origin-Opener-Policy` مطلوبتان لتحويلات Word/ODT/Excel/PowerPoint إلى PDF. بدونهما لن يتوفر `SharedArrayBuffer` وسيفشل محرك LibreOffice WASM في التهيئة. +::: + +أنشئ `_redirects` لتوجيه تطبيق الصفحة الواحدة (SPA): + +``` +/* /index.html 200 +``` + +## نطاق مخصص + +1. انتقل إلى مشروع Pages الخاص بك +2. انقر على "Custom domains" +3. أضف نطاقك +4. سيضبط Cloudflare إعدادات DNS تلقائيًا إذا كان النطاق على Cloudflare + +## المزايا + +- **نطاق ترددي غير محدود ومجاني** +- **شبكة CDN عالمية** بأكثر من 300 موقع طرفي +- **HTTPS تلقائي** +- **عمليات نشر معاينة** لطلبات السحب +- **بناء سريع** + +## استكشاف الأخطاء وإصلاحها + +### رفع الملفات الكبيرة + +يدعم Cloudflare Pages ملفات حتى 25 MB. يفترض أن تعمل وحدات WASM بدون مشكلة، لكن إذا وصلت إلى الحدود، فجرّب: + +```bash +# Split large files during build +npm run build +``` + +### حدود حجم Worker + +إذا كنت تستخدم Cloudflare Workers للتوجيه المتقدم، فانتبه إلى حد 1 MB في الخطط المجانية. + +## Worker وكيل CORS (للتوقيعات الرقمية) + +تتطلب أداة التوقيع الرقمي وكيل CORS لجلب سلاسل الشهادات. انشر الـ Worker المضمّن: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### ميزات الأمان + +| الميزة | الوصف | +| ------------------------ | --------------------------------- | +| **قيود الروابط** | يُسمح بروابط الشهادات فقط | +| **حد حجم الملف** | حتى 10MB لكل طلب | +| **تحديد المعدل** | 60 طلبًا/IP/دقيقة (يتطلب KV) | +| **حظر عناوين IP الخاصة** | يحظر localhost والعناوين الداخلية | + +### تفعيل تحديد المعدل + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### البناء مع رابط الوكيل + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +أو باستخدام Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **ملاحظة:** راجع [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) لإعداد توقيع HMAC. diff --git a/docs/ar/self-hosting/cors-proxy.md b/docs/ar/self-hosting/cors-proxy.md new file mode 100644 index 00000000..11c86e63 --- /dev/null +++ b/docs/ar/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# وكيل CORS لجلب الشهادات + +تستخدم أداة التوقيع الرقمي وكيل CORS لجلب شهادات الجهات المُصدِرة من جهات إصدار الشهادات (CA) الخارجية. هذا ضروري لأن كثيرًا من خوادم CA لا تتضمن ترويسات CORS في استجاباتها، مما يمنع الجلب المباشر من المتصفح. + +إضافة إلى ذلك، تقدّم كثير من خوادم CA الشهادات عبر HTTP عادي. وعندما تكون نسخة BentoPDF لديك مستضافة عبر HTTPS، تحظر المتصفحات هذه الطلبات (سياسة المحتوى المختلط). يحل وكيل CORS المشكلتين بتوجيه الطلبات عبر نقطة HTTPS بترويسات صحيحة. + +## كيف يعمل + +عند توقيع ملف PDF بشهادة: + +1. تحاول مكتبة `zgapdfsigner` بناء سلسلة شهادات كاملة +2. تجلب شهادات الجهات المُصدِرة من الروابط المضمّنة في امتداد AIA (Authority Information Access) في شهادتك +3. تُوجَّه هذه الطلبات عبر وكيل CORS يضيف ترويسات `Access-Control-Allow-Origin` اللازمة +4. يعيد الوكيل بيانات الشهادة إلى المتصفح + +## استضافة وكيل CORS ذاتيًا + +إذا كنت تستضيف BentoPDF ذاتيًا، فستحتاج إلى نشر وكيل CORS خاص بك لكي تعمل التوقيعات الرقمية مع الشهادات التي تتطلب جلب السلسلة. + +### الخيار 1: Cloudflare Workers (موصى به) + +1. **ثبّت Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **سجّل الدخول إلى Cloudflare**: + + ```bash + wrangler login + ``` + +3. **انسخ BentoPDF وحدّث المصادر المسموح بها**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + افتح `cors-proxy-worker.js` وغيّر المصفوفة `ALLOWED_ORIGINS` إلى نطاقك: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning مهم + بدون هذا التغيير، سيرفض الوكيل كل الطلبات القادمة من موقعك بخطأ **403 Forbidden**. الإعداد الافتراضي يسمح فقط بالطلبات القادمة من `bentopdf.com`. + ::: + +4. **انشر الوكيل**: + + ```bash + wrangler deploy + ``` + + دوّن رابط الـ Worker الخاص بك (مثل `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **أعد بناء BentoPDF مع رابط الوكيل**: + + إذا كنت تستخدم Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + إذا كنت تبني من المصدر: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### الخيار 2: وكيل خلفي مخصص + +يمكنك أيضًا إنشاء نقطة وكيل خاصة بك. المتطلبات هي: + +1. قبول طلبات GET مع معامل الاستعلام `url` +2. جلب الرابط من خادمك (لا توجد قيود CORS على جهة الخادم) +3. إرجاع الاستجابة بهذه الترويسات: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +مثال على تنفيذ باستخدام Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## اعتبارات الأمان + +يتضمن Cloudflare Worker المرفق عدة إجراءات أمنية: + +| الميزة | الوصف | +| ------------------------ | -------------------------------------------------------------------------------------------------- | +| **التحقق من المصدر** | يسمح فقط بالطلبات القادمة من النطاقات المدرجة في `ALLOWED_ORIGINS` | +| **قيود الروابط** | يسمح فقط بروابط الشهادات (`.crt` و`.cer` و`.pem` و`/certs/` و`/ocsp` و`/crl`) | +| **حظر عناوين IP الخاصة** | يحظر النطاقات الخاصة في IPv4/IPv6 وlink-local وloopback وعناوين IP العشرية وبيانات السحابة الوصفية | +| **أمان Content-Type** | يعيد أنواع MIME الآمنة للشهادات فقط، ويمنع حقن content-type من المصدر | +| **حد حجم الملف** | يبثّ الاستجابة بحد 10MB ويقطع التنزيل في منتصفه إذا تم تجاوزه | +| **تحديد المعدل** | 60 طلبًا في الدقيقة لكل IP أو IPv6 /64 (يتطلب KV، ويسمح بالمرور عند أخطاء KV) | +| **توقيعات HMAC** | توقيع اختياري من جهة العميل (يردع الاستغلال العابر) | + +### إعادة ربط DNS (عند الاستضافة الذاتية خارج Cloudflare) + +يرفض الـ Worker أي رابط يُحلّ إلى عنوان IP خاص أو داخلي. ولا يمكنه استخدام قائمة ثابتة بالمضيفين المسموح بهم، لأن روابط سلسلة الشهادات تشير إلى أي جهة CA أصدرت الشهادة (FNMT وجهات CA المؤسسية وغيرها)، فلا تُعرف الوجهات مسبقًا. وهذا يترك نافذة صغيرة لإعادة الربط: يمكن لمن يدير DNS لنطاقه أن يعطي فحص الأمان عنوان IP عامًا، ثم يعطي الطلب الفعلي عنوانًا خاصًا بعد لحظة. + +على Cloudflare لا يمكن استغلال ذلك: لا تستطيع Workers الوصول إلى عناوين IP الخاصة ولا إلى نقطة البيانات الوصفية `169.254.169.254`، فتنتهي إعادة الربط إلى لا شيء. فقط لا تمنح الـ Worker طريقًا إلى الداخل: لا تربط Tunnel أو Service أو ربطًا بشبكة خاصة (فهو يحتاج فقط إلى `RATE_LIMIT_KV`). + +إذا شغّلته خارج Cloudflare (workerd أو Node وما شابههما) داخل VPC، فإن بيئة التشغيل _تستطيع_ الوصول إلى عناوين IP الداخلية. ضع جدار حماية للحركة الصادرة أمامه واحظر النطاقات الخاصة: `10.0.0.0/8` و`172.16.0.0/12` و`192.168.0.0/16` و`127.0.0.0/8` و`169.254.0.0/16` ونظائرها في IPv6. لا يمكن لكود التطبيق فرض ذلك بمجرد أن تخرج من Cloudflare. + +## تعطيل الوكيل + +إذا كنت لا تريد استخدام وكيل CORS، فاضبط متغير البيئة على سلسلة فارغة: + +``` +VITE_CORS_PROXY_URL= +``` + +**ملاحظة**: بدون الوكيل، سيفشل التوقيع بالشهادات التي تتطلب جلب سلسلة خارجية (مثل FNMT أو بعض جهات CA المؤسسية) بخطأ "Failed to fetch". + +## استكشاف الأخطاء وإصلاحها + +### "Signing error: TypeError: Failed to fetch" + +يعني هذا عادةً أحد الأمرين: + +1. **لم يُضبط وكيل CORS**: عيّن `VITE_CORS_PROXY_URL` وأعد البناء +2. **حظر المحتوى المختلط**: موقعك يعمل عبر HTTPS لكن رابط مُصدِر الشهادة يعمل عبر HTTP. يحل وكيل CORS هذه المشكلة. +3. **وكيل CORS يرفض مصدرك**: تأكد من وجود نطاقك في المصفوفة `ALLOWED_ORIGINS` في `cors-proxy-worker.js` + +### خطأ "403 Forbidden" من الوكيل + +نطاقك غير موجود في قائمة `ALLOWED_ORIGINS`. عدّل `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +ثم أعد النشر: `npx wrangler deploy` + +### اختبار الوكيل + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### الشهادات التي تعمل بدون وكيل + +تتضمن بعض الشهادات السلسلة كاملة في ملف P12/PFX ولا تتطلب جلبًا خارجيًا: + +- الشهادات الموقّعة ذاتيًا +- بعض جهات CA التجارية التي تضمّن الشهادات الوسيطة +- الشهادات التي جمعتَ سلسلتها الكاملة يدويًا diff --git a/docs/ar/self-hosting/docker.md b/docs/ar/self-hosting/docker.md new file mode 100644 index 00000000..fd28e37b --- /dev/null +++ b/docs/ar/self-hosting/docker.md @@ -0,0 +1,622 @@ +# النشر باستخدام Docker / Podman + +أسهل طريقة لاستضافة BentoPDF ذاتيًا في بيئة إنتاج. + +> [!IMPORTANT] +> **الترويسات المطلوبة لتحويل ملفات Office** +> +> تتطلب الأدوات المعتمدة على LibreOffice (تحويل Word وExcel وPowerPoint) ترويسات HTTP هذه لدعم `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> يجب أيضًا تقديم الصفحة من سياق آمن. يعمل `http://localhost` للاختبار المحلي، لكن `http://192.168.x.x` أو غيره من عناوين الشبكة المحلية لا يُعد مؤهلًا عادةً، لذا سيفشل تحويل Office عبر HTTP العادي حتى لو كانت الترويسات موجودة. +> +> تتضمن صور الحاويات الرسمية هذه الترويسات. إذا كنت تستخدم وكيلًا عكسيًا (Traefik أو Caddy وغيرهما)، فتأكد من الحفاظ على هذه الترويسات أو إضافتها، واستخدم HTTPS للوصول من غير عنوان الحلقة المحلية. + +> [!TIP] +> **مستخدمو Podman:** تعمل جميع أوامر `docker` مع Podman باستبدال `docker` بـ `podman` و`docker-compose` بـ `podman-compose`. + +## بداية سريعة + +> [!TIP] +> يتوفر BentoPDF بنسختين: +> +> - **نسخة الاستضافة الذاتية**: `ghcr.io/alam00000/bentopdf-simple:latest`. جميع أدوات PDF، **بدون** عناصر التسويق (بلا واجهة رئيسية أو أسئلة شائعة أو آراء مستخدمين أو تذييل). استخدمها لعمليات النشر الداخلية وللفرق والمؤسسات. وهي **ليست** نسخة "مخففة" بميزات أقل. +> - **النسخة التجارية**: `ghcr.io/alam00000/bentopdf:latest`. موقع التسويق الكامل، ويستخدمه bentopdf.com نفسه وأصحاب التراخيص التجارية الذين ينشرون خدمات موجهة للعامة. +> +> إذا كنت غير متأكد: استخدم نسخة الاستضافة الذاتية. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +أنشئ `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +شغّل: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## بناء صورتك الخاصة + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +ابنِ وشغّل: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## متغيرات البيئة + +| المتغير | الوصف | الافتراضي | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | بناء نسخة الاستضافة الذاتية (تخفي عناصر تسويق bentopdf.com: الواجهة الرئيسية والأسئلة الشائعة وآراء المستخدمين والتذييل). تبقى جميع أدوات PDF. | `false` | +| `BASE_URL` | النشر في مجلد فرعي | `/` | +| `VITE_WASM_PYMUPDF_URL` | عنوان وحدة PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | عنوان وحدة Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | عنوان وحدة CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | عنوان سكربت عامل OCR | _(فارغ؛ يستخدم CDN الافتراضي لـ Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | مجلد بيئة OCR الأساسية | _(فارغ؛ يستخدم CDN الافتراضي لـ Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | مجلد traineddata الخاص بـ OCR | _(فارغ؛ يستخدم CDN الافتراضي لـ Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | لغات OCR المعروضة في الواجهة، مفصولة بفواصل | _(فارغ؛ عرض الفهرس الكامل)_ | +| `VITE_OCR_FONT_BASE_URL` | مجلد خطوط الطبقة النصية لـ OCR | _(فارغ؛ يستخدم روابط خطوط Noto البعيدة)_ | +| `VITE_DEFAULT_LANGUAGE` | لغة الواجهة الافتراضية | `en` | +| `VITE_BRAND_NAME` | اسم العلامة التجارية المخصص | `BentoPDF` | +| `VITE_BRAND_LOGO` | مسار الشعار نسبةً إلى `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | نص التذييل/حقوق النشر المخصص | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | معرّفات الأدوات المراد إخفاؤها، مفصولة بفواصل | _(فارغ؛ جميع الأدوات مفعّلة)_ | +| `DISABLE_GITHUB_STARS` | تخطي جلب عدد نجوم GitHub عند تحميل الصفحة وحذف `api.github.com` من CSP. عمليات بناء Simple Mode تتخطاه دائمًا. | `false` | +| `SITE_URL` | العنوان العام المكتوب في روابط canonical وhreflang وخريطة الموقع. اتركه على الافتراضي ما لم تكن تريد أن تعامل محركات البحث نشرك كموقع مستقل. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | مع `SITE_URL` مخصص، توضع على كل صفحة علامة `noindex` لكي لا تنافس نسختك bentopdf.com في نتائج البحث. اضبطه على `true` للسماح لمحركات البحث بفهرستها. | `false` | + +عناوين وحدات WASM مُعدّة مسبقًا بقيم CDN افتراضية، فتعمل جميع الميزات المتقدمة مباشرة. غيّرها في عمليات النشر المعزولة عن الإنترنت أو المستضافة ذاتيًا. + +### محركات البحث + +افتراضيًا، تشير كل صفحة محركات البحث إلى bentopdf.com بوصفه الأصل، فلا يظهر نشرك كنسخة مكررة. لا تحتاج إلى تغيير أي شيء لنسخة خاصة أو داخلية. + +- **إبقاء نسختك خارج نتائج البحث تمامًا:** شغّل الحاوية مع `-e ROBOTS_NOINDEX=true`. يتطلب هذا إعادة تشغيل فقط، وليس إعادة بناء. +- **جعل نسختك موقعًا مستقلًا في نتائج البحث:** ابنِ مع `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. بدون `ALLOW_INDEXING=true`، يضع `SITE_URL` المخصص وسم `noindex` على كل صفحة. + +### Content-Security-Policy + +تأتي صورة nginx مع ترويسة `Content-Security-Policy` مُفعَّلة. توجيهات `script-src` و`connect-src` و`font-src` في CSP **تُولَّد وقت البناء** من متغيرات الروابط `VITE_*` أعلاه، وأي مضيفات تمررها عبر `--build-arg` تُضاف تلقائيًا إلى السياسة. + +ونتيجة لذلك: + +- إذا غيّرت `VITE_CORS_PROXY_URL` أو `VITE_WASM_*_URL` وقت البناء، تسمح CSP بهذه المصادر تلقائيًا، دون إعداد إضافي. +- بالنسبة للروابط على `cdn.jsdelivr.net`، يسمح `script-src` بمجلد الحزمة المُرقَّم بدقة فقط، مثل `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`، وليس بكامل CDN. تقدّم jsDelivr أي حزمة npm عامة أو مستودع GitHub، فالسماح بالمضيف كاملًا سيتيح تشغيلها كلها على نسختك. أما الروابط على أي مضيف آخر فيُسمح بها حسب المصدر. +- إذا ضبطت عناوين WASM مخصصة _وقت التشغيل_ عبر صفحة الإعدادات المتقدمة داخل التطبيق، فهذه المصادر **ليست** في CSP وسيحظر المتصفح الجلب منها. وينطبق ذلك أيضًا على إصدار مختلف من الحزمة نفسها على `cdn.jsdelivr.net`، لأن الإصدار المضبوط وقت البناء وحده مسموح. الضبط وقت التشغيل مخصص للتجربة؛ وللعناوين المخصصة الدائمة اضبط معامل البناء `VITE_*` المطابق. +- في عمليات النشر المعزولة عن الإنترنت التي تغيّر قيم `VITE_WASM_*_URL` الثلاث جميعها، تُزال أيضًا مجلدات حزم `cdn.jsdelivr.net` تلك من CSP (يُستبدل كل افتراضي ولا يُضاف إليه). وتبقى القيم الافتراضية لـ Tesseract OCR على `cdn.jsdelivr.net` في السياسة حتى تضبط أيضًا قيم `VITE_TESSERACT_*` الثلاث. وبالمثل، فإن ضبط `VITE_CORS_PROXY_URL` يستبدل الافتراضي العام `bentopdf-cors-proxy.bentopdf.workers.dev`. + +تتضمن CSP القيمة `'unsafe-eval'` في `script-src` لأن بيئة LibreOffice WASM (المستخدمة في أدوات تحويل Word/Excel/PowerPoint) ومكتبة الصور wasm-vips (المستخدمة في PDF إلى TIFF) تجمّعان شيفرة توزيع داخلية عبر `new Function()`. إزالتها ستعطّل هذه الأدوات. إذا بنيت بوضع `SIMPLE_MODE` (بدون LibreOffice) ولا تحتاج PDF إلى TIFF، فيمكنك تعديل ملف `security-headers.conf` المُولَّد يدويًا لحذف `'unsafe-eval'` والحصول على سياسة أكثر صرامة. + +بالنسبة لـ OCR، اترك متغيرات `VITE_TESSERACT_*` فارغة لاستخدام الأصول الافتراضية عبر الإنترنت، أو اضبطها الثلاثة معًا لـ OCR المستضاف ذاتيًا أو بدون اتصال. تُرفض التغييرات الجزئية لإعدادات OCR لأن العامل والبيئة الأساسية ومجلد traineddata يجب أن تتطابق. وللحصول على ملف PDF قابل للبحث بالكامل دون اتصال، اضبط أيضًا `VITE_OCR_FONT_BASE_URL` لكي تُحمَّل خطوط الطبقة النصية الخاصة بـ OCR من خادمك الداخلي بدل روابط خطوط Noto العامة. + +يحدد `VITE_DEFAULT_LANGUAGE` لغة الواجهة للزوار لأول مرة. القيم المدعومة: `en` و`ar` و`be` و`fr` و`de` و`es` و`zh` و`zh-TW` و`vi` و`tr` و`id` و`it` و`pt` و`nl` و`da`. ما زال بإمكان المستخدمين تبديل اللغة، وهذا يغيّر الافتراضي فقط. + +مثال: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### العلامة التجارية المخصصة + +استبدل شعار BentoPDF الافتراضي واسمه ونص التذييل بما يخصك. ضع ملف الشعار في مجلد `public/` (أو استخدم صورة موجودة)، ثم مرّر متغيرات العلامة التجارية وقت البناء: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +تعمل العلامة التجارية في الوضع الكامل ووضع Simple Mode، ويمكن دمجها مع جميع خيارات وقت البناء الأخرى. + +### تعطيل أدوات محددة + +أخفِ أدوات من الواجهة لأغراض الامتثال أو الأمان. تُزال الأدوات المعطلة من الصفحة الرئيسية ونتائج البحث واختصارات لوحة المفاتيح ومنشئ سير العمل. يعرض الوصول المباشر عبر الرابط صفحة "الأداة غير متاحة". + +معرّف الأداة هو رابط الصفحة بدون `.html`. مثلًا، إذا كانت الأداة على `bentopdf.com/edit-pdf.html`، فالمعرّف هو `edit-pdf`. + +#### العثور على معرّفات الأدوات + +أسهل طريقة: افتح أي أداة في BentoPDF وانظر إلى الرابط. الجزء الأخير من المسار (بدون `.html`) هو معرّف الأداة. + +
+القائمة الكاملة لمعرّفات الأدوات + +**التحرير والتعليق:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**التحويل إلى PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**التحويل من PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**التنظيم والإدارة:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**التحسين والإصلاح:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**الأمان:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### الخيار 1: وقت البناء (معامل بناء Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +يدمج هذا قائمة الأدوات المعطلة في حزمة JavaScript. يتطلب إعادة بناء لتغييرها. + +#### الخيار 2: وقت التشغيل (config.json) + +اربط ملف `config.json` في المجلد المقدَّم، دون الحاجة لإعادة بناء: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +أو باستخدام Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +يمكن دمج الطريقتين، إذ تُدمج القوائم. إذا ظهرت أداة في أي منهما، فهي معطلة. + +#### تعطيل ميزات المحرر + +يمكنك أيضًا تعطيل ميزات محددة داخل محرر PDF (مثل التنقيح والتعليقات التوضيحية والنماذج) دون تعطيل أداة المحرر بالكامل. أضف `editorDisabledCategories` إلى `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+القائمة الكاملة لفئات المحرر + +**التكبير:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**التعليقات التوضيحية:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**الأشكال:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**النماذج:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**التنقيح:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**المستند:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**الصفحة:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**اللوحة:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**الأدوات:** `tools`, `pan`, `pointer`, `capture` + +**التحديد:** `selection`, `selection-copy` + +**السجل:** `history`, `history-undo`, `history-redo` + +
+ +الفئات هرمية، فتعطيل فئة أب (مثل `annotation`) يعطّل جميع فئاتها الفرعية. + +### تعطيل عداد نجوم GitHub + +يعرض شريط التنقل عدد نجوم GitHub الحي، ويُجلب من `api.github.com` عند تحميل الصفحة. وهو الطلب الخارجي الوحيد الذي لا يخدم ميزة PDF. عطّله وقت البناء لإزالة شيفرة الجلب من الحزمة وحذف `api.github.com` من Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +عمليات بناء Simple Mode (`bentopdf-simple`) تتخطى عداد النجوم دائمًا، فهذا الخيار مطلوب فقط في النسخة التجارية أو عمليات البناء الكاملة المخصصة. + +### عناوين WASM مخصصة (بيئات معزولة عن الإنترنت / استضافة ذاتية) + +> [!IMPORTANT] +> تُدمج عناوين WASM في JavaScript **وقت البناء**. وتُنزَّل ملفات WASM بواسطة **متصفح المستخدم** وقت التشغيل، فلا ينزّلها Docker أثناء البناء. في الشبكات المعزولة عن الإنترنت، يجب استضافة ملفات WASM على خادم داخلي تصل إليه المتصفحات. + +**سير العمل الكامل للبيئات المعزولة:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +استخدم الرموز التي يطبعها الأمر `bash scripts/prepare-airgap.sh --list-ocr-languages`، أو ابحث بالاسم عبر `bash scripts/prepare-airgap.sh --search-ocr-language `، لقيمة `--ocr-languages`. وعند البناء بمجموعة OCR مقيّدة، مرّر الرموز نفسها إلى `VITE_TESSERACT_AVAILABLE_LANGUAGES` لكي يعرض التطبيق اللغات المضمّنة فقط. وللحصول على إخراج OCR كامل دون اتصال، استضف أيضًا مجلد `ocr-fonts/` المضمّن ووجّه `VITE_OCR_FONT_BASE_URL` إليه. + +اضبط المتغير على سلسلة فارغة لتعطيل تلك الوحدة (يجب على المستخدمين ضبطها يدويًا عبر الإعدادات المتقدمة). + +## منفذ مخصص + +افتراضيًا، يستمع BentoPDF على المنفذ `8080` داخل الحاوية. لتغييره، اضبط متغير البيئة `PORT` وقت التشغيل: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| المتغير | الوصف | الافتراضي | +| ------- | ---------------------------- | --------- | +| `PORT` | منفذ استماع Nginx في الحاوية | `8080` | + +يعمل هذا مع Dockerfile القياسي وغير الجذري (nonroot) معًا. + +## معرّف مستخدم مخصص (PUID/PGID) + +للبيئات التي تتطلب التشغيل بمستخدم محدد غير جذري (أجهزة NAS وKubernetes مع سياقات الأمان وسياسات المؤسسات)، يوفر BentoPDF ملف Dockerfile منفصلًا يدعم PUID/PGID بأسلوب LSIO. + +### البناء والتشغيل + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### متغيرات البيئة + +| المتغير | الوصف | الافتراضي | +| -------------- | ---------------------- | --------- | +| `PUID` | معرّف المستخدم للتشغيل | `1000` | +| `PGID` | معرّف المجموعة للتشغيل | `1000` | +| `PORT` | منفذ استماع Nginx | `8080` | +| `DISABLE_IPV6` | تعطيل مستمع IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### كيف يعمل + +تبدأ الحاوية كمستخدم جذر، وتنشئ مستخدمًا بقيم PUID/PGID المحددة، وتضبط الملكية على جميع المجلدات القابلة للكتابة، ثم تتخلى عن الصلاحيات باستخدام `su-exec`. وتعمل عملية nginx بالكامل بصفتك المستخدم الذي حددته. + +> [!NOTE] +> يستخدم `Dockerfile` القياسي الصورة `nginx-unprivileged` (UID 101) ويُوصى به لمعظم عمليات النشر. استخدم `Dockerfile.nonroot` فقط عندما تحتاج إلى UID/GID محدد. + +> [!WARNING] +> لا يمكن أن يكون PUID/PGID هو `0` (الجذر). يتحقق نقطة الدخول من المدخلات وسيخرج بخطأ عند القيم غير الصالحة. + +## مع Traefik (وكيل عكسي) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## مع Caddy (وكيل عكسي) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## حدود الموارد + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## تكامل Podman Quadlet مع Systemd + +يتيح لك [Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) تشغيل حاويات Podman كخدمات systemd. وهذا مثالي لعمليات النشر الإنتاجية على أنظمة Linux. + +### إعداد Quadlet الأساسي + +أنشئ ملف وحدة حاوية في `~/.config/containers/systemd/bentopdf.container` (للمستخدم) أو `/etc/containers/systemd/bentopdf.container` (للنظام): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### التفعيل والتشغيل + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> للنشر على مستوى النظام، استخدم `systemctl` بدون الخيار `--user` وضع الملف في `/etc/containers/systemd/`. + +### Quadlet مع فحص الصحة + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### التحديث التلقائي مع Quadlet + +يمكن لـ Podman تحديث الحاويات تلقائيًا عند توفر صور جديدة: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### إعداد شبكة Quadlet + +لإعداد شبكة مخصص، أنشئ ملف شبكة `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +ثم أشر إليه في ملف الحاوية: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## التحديث + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/ar/self-hosting/hostinger.md b/docs/ar/self-hosting/hostinger.md new file mode 100644 index 00000000..1dc42a9b --- /dev/null +++ b/docs/ar/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# النشر على Hostinger + +[Hostinger](https://hostinger.com) مزوّد استضافة مشتركة شهير. يشرح هذا الدليل نشر BentoPDF على الاستضافة المشتركة في Hostinger. + +## المتطلبات + +- خطة استضافة Hostinger مع إمكانية الوصول إلى مدير الملفات +- تثبيت Node.js محليًا للبناء + +## الخطوة 1: بناء المشروع + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +ستكون الملفات المبنية في مجلد `dist`. + +## الخطوة 2: الرفع إلى Hostinger + +### النشر على النطاق الرئيسي + +1. سجّل الدخول إلى حسابك في Hostinger +2. انتقل إلى **File Manager** ← **public_html** +3. **احذف** أي ملفات موجودة (خذ نسخة احتياطية عند الحاجة) +4. **ارفع** كل محتويات مجلد `dist` المحلي إلى `public_html` + +### النشر في مجلد فرعي + +إذا كنت تنشر في مجلد فرعي (مثل `yourdomain.com/pdf-tools/`): + +1. ابنِ المشروع بعنوان أساسي (base URL) صحيح: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. أنشئ المجلد في Hostinger: + - انتقل إلى **File Manager** ← **public_html** + - أنشئ مجلدًا جديدًا: `pdf-tools` +3. ارفع كل محتويات `dist` إلى `public_html/pdf-tools/` + +## الخطوة 3: إنشاء ملف .htaccess + +أنشئ ملف `.htaccess` في جذر مجلد النشر (`public_html` أو `public_html/pdf-tools/`): + +::: warning مهم +عند النشر في مجلد فرعي، غيّر `RewriteBase /` إلى `RewriteBase /pdf-tools/` (أو اسم مجلدك). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## مثال على .htaccess للمجلد الفرعي + +للنطاق `yourdomain.com/pdf-tools/`، حدّث هذه الأسطر: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## استكشاف الأخطاء وإصلاحها + +### ملفات WASM لا تُحمَّل + +تأكد من ضبط أنواع MIME بشكل صحيح في `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### أدوات LibreOffice لا تعمل + +ترويسات الأمان حاسمة لعمل SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +إذا لم تُطبَّق الترويسات، فتواصل مع دعم Hostinger لتفعيل `mod_headers`. + +### أخطاء 404 عند تحديث الصفحة + +تأكد من ضبط قاعدة امتداد `.html` ومسارات اللغات بشكل صحيح. يستخدم BentoPDF ملفات HTML ثابتة وليس توجيه SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### حدود رفع الملفات + +قد تفرض Hostinger حدودًا على حجم الملفات. ارفع ملفات WASM بشكل منفصل إذا فشل الرفع الجماعي. diff --git a/docs/ar/self-hosting/index.md b/docs/ar/self-hosting/index.md new file mode 100644 index 00000000..4471babd --- /dev/null +++ b/docs/ar/self-hosting/index.md @@ -0,0 +1,538 @@ +# دليل الاستضافة الذاتية + +يمكن استضافة BentoPDF ذاتيًا على بنيتك التحتية. يغطي هذا الدليل خيارات النشر المختلفة. + +## بداية سريعة مع Docker / Podman + +أسرع طريقة لاستضافة BentoPDF ذاتيًا: + +> [!TIP] +> يأتي BentoPDF في بنائين: +> +> - **بناء الاستضافة الذاتية**: `ghcr.io/alam00000/bentopdf-simple:latest`. يتضمن كل أدوات PDF، **بدون** الواجهة التسويقية (لا قسم رئيسي ولا أسئلة شائعة ولا شهادات ولا تذييل). استخدمه للنشر الداخلي أو لفرق العمل أو المؤسسات. وهو **ليس** نسخة "خفيفة" منقوصة الميزات. +> - **البناء التجاري**: `ghcr.io/alam00000/bentopdf:latest`. الموقع التسويقي الكامل، ويستخدمه bentopdf.com نفسه وحاملو الترخيص التجاري الذين يشغّلون عمليات نشر موجهة للجمهور. +> +> إذا كنت في شك: استخدم بناء الاستضافة الذاتية. + +> [!IMPORTANT] +> يتطلب تحويل ملفات Office وجود `SharedArrayBuffer`، ما يعني أن التطبيق يجب أن يكون معزولًا عبر الأصول (cross-origin isolated) ومقدَّمًا من سياق آمن. تُرسل الصورة الرسمية ترويستي COOP/COEP المطلوبتين، لكن المتصفحات تظل تعطّل `SharedArrayBuffer` على أصول HTTP العادية في الشبكات المحلية مثل `http://192.168.x.x`. +> +> استخدم `http://localhost` للاختبار على الجهاز نفسه فقط. إذا كان المستخدمون يصلون إلى BentoPDF عبر عنوان IP محلي أو اسم مضيف، فأنهِ الاتصال بـ HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +أو باستخدام Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (خدمة systemd على Linux) + +شغّل BentoPDF كخدمة systemd. أنشئ الملف `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +راجع [دليل نشر Docker](/ar/self-hosting/docker) للاطلاع على توثيق Quadlet الكامل. + +## البناء من المصدر + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## خيارات الإعداد + +### بناء الاستضافة الذاتية (الوضع المبسط) + +بناء الاستضافة الذاتية (صورة `bentopdf-simple`، ويسمى أيضًا الوضع المبسط) **مطابق وظيفيًا** للبناء التجاري: كل أداة PDF موجودة وتعمل بالطريقة نفسها. هو فقط يُخفي الواجهة التسويقية التي لا معنى لها إلا على bentopdf.com نفسه أو في نشر تجاري موجه للجمهور. **وهو ليس نسخة منقوصة الميزات أو "خفيفة".** + +**ما يخفيه بناء الاستضافة الذاتية** (تجميلي فقط، ولا تُزال أي ميزات PDF): + +- شريط التنقل، والقسم الرئيسي، وقسم المزايا، والأسئلة الشائعة، والشهادات، والتذييل +- يحدّث عنوان الصفحة إلى "أدوات PDF" + +**ما يحتفظ به بناء الاستضافة الذاتية** (كل ما يقوم فعلًا بعمل PDF): + +- كل أدوات PDF (الدمج، والتقسيم، والتحرير، والتوقيع، وOCR، وتحويل Office، وغيرها) +- دعم العلامة التجارية المخصصة، وكل إعدادات وقت البناء ووقت التشغيل + +البناء التجاري (`ghcr.io/alam00000/bentopdf:latest`) هو ما يشغّل bentopdf.com نفسه ويستخدمه حاملو الترخيص التجاري الذين يشغّلون عمليات نشر موجهة للجمهور. فهو يضيف القسم الرئيسي والأسئلة الشائعة والشهادات والتذييل التي لا معنى لها في أداة داخلية. + +إذا كنت تستضيف BentoPDF ذاتيًا لفريقك أو مؤسستك أو كأداة داخلية، فاستخدم بناء الاستضافة الذاتية: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +راجع [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) للتفاصيل الكاملة. + +### البناء التجاري (عمليات نشر موجهة للجمهور بعلامتك التجارية) + +البناء التجاري (صورة `bentopdf` بدون اللاحقة `-simple`) هو ما يشغّل bentopdf.com نفسه. يتضمن الموقع التسويقي الكامل (القسم الرئيسي، والمزايا، والأسئلة الشائعة، والشهادات، والتذييل) فوق كل أدوات PDF. استخدم هذا البناء عندما تريد **نشر BentoPDF كخدمة PDF موجهة للجمهور تحت علامتك التجارية**، على سبيل المثال: + +- تشغّل BentoPDF كخدمة SaaS مستضافة للمستخدمين النهائيين على نطاقك الخاص +- تريد تجربة صفحة الهبوط (أقسام تسويقية مع الأدوات)، وليس واجهة الأدوات المجردة فقط +- أنت حامل ترخيص تجاري تدمج BentoPDF في منتج تجاري + +**شغّله كما هو** (بعلامة BentoPDF، مفيد لمعاينة البناء): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**ابنِ بعلامتك التجارية** (سير العمل التجاري المعتاد): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +كل خيار آخر من خيارات وقت البناء (`BASE_URL` و`VITE_DEFAULT_LANGUAGE` و`DISABLE_TOOLS` وتجاوزات عناوين WASM وغيرها) يعمل بالطريقة نفسها كما في بناء الاستضافة الذاتية. + +::: warning الترخيص +تشغيل البناء التجاري مسموح بموجب أي من خياري ترخيص BentoPDF: + +- **AGPL-3.0** (مجاني): مسموح إذا كان نشرك ينشر شيفرته المصدرية كاملة بموجب AGPL، بما في ذلك أي تعديلات على العلامة التجارية ومنطق الأعمال المحيط. +- **الترخيص التجاري** (79 دولارًا مدى الحياة): مطلوب لعمليات النشر مغلقة المصدر أو المملوكة التي لا تفتح فيها مصدر نسخة العلامة التجارية أو شيفرة الأعمال. + +راجع [صفحة الترخيص](https://www.bentopdf.com/licensing) للمقارنة الكاملة. تُحمَّل وحدات WASM الخاضعة لـ AGPL (PyMuPDF وGhostscript وCoherentPDF) من CDN وقت التشغيل، لذا لا تدخل في صورتك ولا تغيّر وضعك الترخيصي. +::: + +### عنوان URL الأساسي + +انشر في مجلد فرعي: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### علامة تجارية مخصصة + +استبدل شعار BentoPDF الافتراضي واسمه ونص التذييل بما يخصك وقت البناء: + +| المتغير | الوصف | الافتراضي | +| ------------------ | -------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | اسم العلامة التجارية في الرأس والتذييل | `BentoPDF` | +| `VITE_BRAND_LOGO` | مسار الشعار نسبةً إلى `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | نص التذييل/حقوق النشر المخصص | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +أو عبر Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +تعمل العلامة التجارية في الوضع الكامل والوضع المبسط، ويمكن دمجها مع كل خيارات وقت البناء الأخرى (`BASE_URL` و`SIMPLE_MODE` و`VITE_DEFAULT_LANGUAGE`). + +### تعطيل أدوات محددة + +أخفِ أدوات بعينها لأغراض الامتثال أو الأمان. تُزال الأدوات المعطلة من الصفحة الرئيسية والبحث والاختصارات ومنشئ سير العمل والوصول المباشر عبر URL. + +معرّفات الأدوات هي عنوان URL للصفحة بدون `.html`: افتح أي أداة وانظر إلى العنوان (مثل `edit-pdf` و`sign-pdf` و`encrypt-pdf`). + +**وقت البناء** (مضمّن في الحزمة): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**وقت التشغيل** (بدون إعادة بناء: اربط ملف `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +يمكن الجمع بين الطريقتين: تُدمج القوائم. + +يمكنك أيضًا تعطيل ميزات محددة داخل محرر PDF (مثل الحجب) دون تعطيل الأداة بأكملها بإضافة `editorDisabledCategories` إلى `config.json`. راجع [دليل Docker](/ar/self-hosting/docker#تعطيل-ميزات-المحرر) للاطلاع على القائمة الكاملة للفئات. + +## أدلة النشر + +اختر منصتك: + +- [Vercel](/ar/self-hosting/vercel) +- [Netlify](/ar/self-hosting/netlify) +- [Cloudflare Pages](/ar/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/ar/self-hosting/aws) +- [Hostinger](/ar/self-hosting/hostinger) +- [Nginx](/ar/self-hosting/nginx) +- [Apache](/ar/self-hosting/apache) +- [Docker](/ar/self-hosting/docker) +- [Kubernetes](/ar/self-hosting/kubernetes) +- [وكيل CORS](/ar/self-hosting/cors-proxy) - مطلوب للتوقيعات الرقمية + +## مشكلات شائعة + +### تحويل Word / ODT / Excel / PowerPoint إلى PDF يتوقف (SharedArrayBuffer غير متاح) + +**العَرَض**: تتوقف تحويلات المستندات المعتمدة على LibreOffice (Word وODT وExcel وPowerPoint إلى PDF) عند نحو 55% أو تفشل في البدء. قد تعرض وحدة تحكم المتصفح: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...أو يعرض `window.crossOriginIsolated` القيمة `false`، أو تُبلغ ترجمة WASM عن `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**السبب**: يتطلب LibreOffice WASM وجود `SharedArrayBuffer`، والمتصفح لا يفعّله إلا عندما تكون الصفحة **معزولة عبر الأصول** و**مقدَّمة من سياق آمن**. أي أن أمرين يجب أن يتحققا: + +1. تتضمن كل استجابة الترويستين معًا: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. تُقدَّم الصفحة من `https://...` أو `http://localhost`. لا يُعد HTTP العادي على عنوان IP محلي (مثل `http://192.168.x.x`) آمنًا: تعطّل المتصفحات `SharedArrayBuffer` هناك. + +عدم التطابق `00 61 73 6d / 1f 8b 08 08` عَرَض فرعي منفصل: ملفات `.wasm.gz` / `.data.gz` المضغوطة مسبقًا تفتقر إلى ترويسة الاستجابة `Content-Encoding: gzip`، فيتلقى المتصفح بايتات gzip الخام بدل WASM المفكوك ضغطه. + +**الحل**: راجع دليل النشر الخاص بمنصتك للاطلاع على الإعداد الدقيق: + +- [Nginx →](/ar/self-hosting/nginx#تحويل-word-odt-excel-إلى-pdf-لا-يعمل) +- [Apache →](/ar/self-hosting/apache#تحويل-word-odt-excel-إلى-pdf-لا-يعمل) +- [AWS S3 + CloudFront →](/ar/self-hosting/aws#الخطوة-3b-سياسة-ترويسات-الاستجابة-مطلوبة-لـ-libreoffice-wasm) +- [Cloudflare Pages →](/ar/self-hosting/cloudflare#ملف-الإعدادات) (ملف `_headers`) +- [Netlify →](/ar/self-hosting/netlify#تحويل-word-odt-excel-إلى-pdf-يتوقف-عند-55) (`netlify.toml`) +- [Vercel →](/ar/self-hosting/vercel#تحويل-word-odt-excel-إلى-pdf-لا-يعمل) (`vercel.json`) +- [Hostinger →](/ar/self-hosting/hostinger#أدوات-libreoffice-لا-تعمل) (`.htaccess`) +- [Kubernetes →](/ar/self-hosting/kubernetes#التأكد-من-استمرار-عمل-ترويسات-sharedarraybuffer-ingress-gateway) +- **Docker**: يُعالَج تلقائيًا بواسطة إعداد nginx المضمّن، ولا حاجة لأي إجراء. + +**التحقق**: افتح وحدة تحكم DevTools في أي صفحة BentoPDF ونفّذ: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +إذا كانت الصفحة HTTPS أو `http://localhost` وترويستا COEP/COOP موجودتان في كل استجابة، ينجح الفحصان. وإذا كنت على `http://192.168.x.x` أو أي أصل HTTP آخر غير loopback، فأنهِ الاتصال بـ HTTPS، إذ لا يوجد حل بالترويسات وحدها. + +### ملفات `.mjs` تُقدَّم بنوع `application/octet-stream` + +**العَرَض**: تعرض أداة توقيع PDF / ملء النماذج / أدوات أخرى عارضًا فارغًا أو تفشل في التحميل. تُبلغ وحدة تحكم المتصفح: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**السبب**: لا يملك خادم الويب أو الوكيل العكسي لديك تعيين نوع MIME لملفات `.mjs` (يأتي عارض PDF المضمّن بوحدات ES بهذا الامتداد). تستخدم كثير من إعدادات الخوادم الافتراضية `application/octet-stream` للامتدادات غير المعروفة، وترفض المتصفحات تنفيذها كوحدات ES. + +**الحل**: راجع دليل النشر الخاص بمنصتك للاطلاع على المقطع الدقيق: + +- [Nginx →](/ar/self-hosting/nginx#عارض-توقيع-pdf-أو-ملء-النماذج-فارغ-خطأ-mime-لملفات-mjs) +- [Apache →](/ar/self-hosting/apache#أداة-توقيع-pdf-أو-تعبئة-النماذج-تعرض-عارضًا-فارغًا-خطأ-mime-لملفات-mjs) +- [AWS S3 + CloudFront →](/ar/self-hosting/aws#الخطوة-2-البناء-والرفع) (راجع `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/ar/self-hosting/kubernetes#أخطاء-نوع-mime-لملفات-mjs-عارض-توقيع-pdf-ملء-النماذج-فارغ) +- **Docker وVercel وNetlify وCloudflare Pages وHostinger**: يُعالَج تلقائيًا، ولا حاجة لأي إجراء. + +**التحقق**: افتح DevTools ثم تبويب Network، وابحث عن طلب `.mjs` الفاشل، وتحقق من ترويسة الاستجابة `Content-Type`. يجب أن تكون `application/javascript`. وإذا بقيت `application/octet-stream`، فقد يكون وكيل عكسي خارجي أو CDN يعيد استنتاج النوع، فافحص كل طبقة في سلسلة التقديم. + +## إعداد WASM (مكونات AGPL) + +**لا يضمّن** BentoPDF مكتبات المعالجة الخاضعة لـ AGPL في شيفرته المصدرية، لكنه **يهيّئ مسبقًا عناوين CDN** بحيث تعمل كل الميزات مباشرة، دون إعداد يدوي. + +::: tip بدون إعداد افتراضيًا +منذ الإصدار v2.0.0، تُهيَّأ وحدات WASM مسبقًا للتحميل من jsDelivr CDN عبر متغيرات البيئة. تعمل كل الميزات المتقدمة فورًا دون أي إعداد من المستخدم. +::: + +| المكوّن | الترخيص | الميزات | +| --------------- | -------- | --------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | تحويل EPUB/MOBI/FB2/XPS، واستخراج الصور، واستخراج الجداول | +| **Ghostscript** | AGPL-3.0 | تحويل PDF/A، والضغط، وتصحيح الميل، والتحويل إلى صور نقطية | +| **CoherentPDF** | AGPL-3.0 | جدول المحتويات، والمرفقات، ودمج PDF مع الإشارات المرجعية | + +### متغيرات البيئة الافتراضية + +تُضبط هذه في `.env.production` وتُضمَّن في البناء: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### تجاوز عناوين WASM + +يمكنك تجاوز القيم الافتراضية وقت البناء لعمليات النشر المخصصة: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +لتعطيل وحدة بالكامل (يتطلب إعدادًا يدويًا من المستخدم عبر الإعدادات المتقدمة)، اضبط متغيرها على سلسلة فارغة. + +بالنسبة إلى OCR، إما أن تترك كل متغيرات `VITE_TESSERACT_*` فارغة وتبقي الأصول الافتراضية عبر الإنترنت، أو تضبط عناوين worker/core/lang معًا للـ OCR المستضاف ذاتيًا أو دون اتصال. وإذا ضمّنت لغات OCR محددة فقط، فاضبط أيضًا `VITE_TESSERACT_AVAILABLE_LANGUAGES` على الرموز نفسها مفصولة بفواصل، بحيث تعرض الواجهة اللغات المثبتة فقط وتفشل الاختيارات غير المدعومة برسالة خطأ وصفية. وللحصول على ملفات PDF قابلة للبحث دون اتصال بالكامل، اضبط أيضًا `VITE_OCR_FONT_BASE_URL` على المجلد الداخلي الذي يقدّم خطوط OCR المضمّنة. + +يمكن للمستخدمين أيضًا تجاوز هذه القيم الافتراضية في أي وقت عبر **الإعدادات المتقدمة** في الواجهة: تتقدم التجاوزات المخزنة في المتصفح على القيم الافتراضية للبيئة. + +### نشر معزول عن الإنترنت / دون اتصال + +للشبكات التي لا تملك وصولًا إلى الإنترنت (الحكومة والرعاية الصحية والمالية وغيرها). تُضمَّن عناوين WASM في JavaScript **وقت البناء**، بينما **متصفح المستخدم** هو من ينزّل ملفات WASM الفعلية وقت التشغيل. لذلك تحتاج إلى تجهيز كل شيء على جهاز متصل بالإنترنت ثم نقله إلى الشبكة المعزولة. + +#### سكربت آلي (موصى به) + +يؤتمت السكربت المضمّن `prepare-airgap.sh` العملية كاملة: تنزيل حزم WASM وبناء صورة Docker وإنتاج حزمة مستقلة مع سكربت إعداد. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +ينتج هذا مجلد الحزمة: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +انقل الحزمة إلى الشبكة المعزولة عبر USB أو مستودع الأدوات الداخلي أو أي وسيلة معتمدة. ثم شغّل سكربت الإعداد المضمّن: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +يحمّل سكربت الإعداد صورة Docker ويستخرج ملفات WASM ويشغّل الحاوية اختياريًا. + +**خيارات السكربت:** + +| الخيار | الوصف | الافتراضي | +| ------------------------------ | --------------------------------------------- | ------------------------------ | +| `--wasm-base-url ` | المكان الذي ستُستضاف فيه ملفات WASM داخليًا | _(مطلوب، يُطلب إدخاله إن غاب)_ | +| `--image-name ` | وسم صورة Docker | `bentopdf` | +| `--output-dir ` | مجلد الحزمة الناتجة | `./bentopdf-airgap-bundle` | +| `--simple-mode` | تفعيل الوضع المبسط | off | +| `--base-url ` | عنوان URL الأساسي للمجلد الفرعي (مثل `/pdf/`) | `/` | +| `--language ` | لغة الواجهة الافتراضية (مثل `fr` و`de`) | _(none)_ | +| `--brand-name ` | اسم العلامة التجارية المخصص | _(none)_ | +| `--brand-logo ` | مسار الشعار نسبةً إلى `public/` | _(none)_ | +| `--footer-text ` | نص التذييل المخصص | _(none)_ | +| `--ocr-languages ` | لغات OCR المراد تضمينها مفصولة بفواصل | `eng` | +| `--list-ocr-languages` | يطبع رموز وأسماء OCR المدعومة ثم يخرج | off | +| `--search-ocr-language ` | يبحث في رموز OCR بالاسم أو الاختصار | off | +| `--dockerfile ` | ملف Dockerfile المستخدم | `Dockerfile` | +| `--skip-docker` | تخطي بناء Docker وتصديره | off | +| `--skip-wasm` | تخطي تنزيل WASM (إعادة استخدام ملفات `.tgz`) | off | + +تقبل المطالبة التفاعلية أيضًا `list` لطباعة القائمة الكاملة لرموز Tesseract المدعومة و`search ` للعثور على تطابقات مثل `search german` أو `search chi`. + +::: warning شرط الأصل نفسه +يجب تقديم ملفات WASM من **الأصل نفسه** الذي يقدّم تطبيق BentoPDF. تستخدم Web Workers الدالة `importScripts()` التي لا تستطيع تحميل السكربتات عبر الأصول. فمثلًا، إذا كان BentoPDF يعمل على `https://internal.example.com`، فيجب أن يكون عنوان WASM الأساسي أيضًا `https://internal.example.com/wasm`. +::: + +#### الخطوات اليدوية + +
+إذا كنت تفضّل تنفيذ الخطوات يدويًا دون السكربت + +**الخطوة 1: نزّل حزم WASM وOCR** (على جهاز متصل بالإنترنت) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**الخطوة 2: ابنِ صورة Docker بالعناوين الداخلية** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**الخطوة 3: صدّر صورة Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**الخطوة 4: انقل إلى الشبكة المعزولة** + +انسخ عبر USB أو مستودع الأدوات الداخلي أو أي وسيلة نقل معتمدة: + +- `bentopdf.tar`: صورة Docker +- حزم `.tgz` الخمس لـ WASM/OCR من الخطوة 1 +- مجلد `tesseract-langdata/` من الخطوة 1 +- مجلد `ocr-fonts/` من الخطوة 1 + +**الخطوة 5: الإعداد داخل الشبكة المعزولة** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +تأكد من أن الملفات متاحة على العناوين التي ضبطتها في الخطوة 2، بما فيها `.../ocr/worker.min.js` و`.../ocr/core` و`.../ocr/lang-data` و`.../ocr/fonts`. + +
+ +::: info البناء من المصدر بدلًا من Docker؟ +اضبط المتغيرات في `.env.production` قبل تشغيل `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### استضافة وكيل WASM الخاص بك + +إذا احتجت إلى تقديم ملفات WASM الخاضعة لـ AGPL مع ترويسات CORS المناسبة، فيمكنك نشر وكيل بسيط. راجع [دليل Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) للاطلاع على مثال للتنفيذ. + +::: tip لماذا الفصل؟ +يضمن هذا الفصل: + +- امتثالًا قانونيًا واضحًا للمستخدمين التجاريين +- بقاء نواة BentoPDF تحت ترخيصها المزدوج (AGPL-3.0 / تجاري) +- تحميل ملفات WASM وقت التشغيل، لا تضمينها في المصدر + ::: + +## متطلبات النظام + +| المتطلب | الحد الأدنى | +| ------- | -------------------------------- | +| التخزين | ~100 MB (النواة بدون وحدات AGPL) | +| الذاكرة | 512 MB | +| المعالج | أي معالج حديث | + +::: tip +BentoPDF موقع ثابت، فلا حاجة إلى قاعدة بيانات أو خادم خلفي! +::: diff --git a/docs/ar/self-hosting/kubernetes.md b/docs/ar/self-hosting/kubernetes.md new file mode 100644 index 00000000..104a97e0 --- /dev/null +++ b/docs/ar/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# النشر باستخدام Kubernetes + +قد يكون Kubernetes أكثر مما يلزم لموقع ثابت، لكنه قد يكون خيارًا ممتازًا إذا كنت تعتمد أصلًا Helm وGitOps. + +> [!IMPORTANT] +> **الترويسات المطلوبة لتحويل ملفات Office** +> +> تتطلب الأدوات المعتمدة على LibreOffice (تحويل Word وExcel وPowerPoint) ترويسات HTTP هذه لدعم `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> تتضمن صور nginx الرسمية لـ BentoPDF هذه الترويسات. في Kubernetes، **تُعد وحدات تحكم Ingress/Gateway أيضًا وكلاء عكسيين**، لذا تأكد من الحفاظ على هذه الترويسات (أو أضفها على الحافة). + +## المتطلبات المسبقة + +- عنقود Kubernetes +- Helm v3 +- صورة nginx لـ BentoPDF (مثل `ghcr.io/alam00000/bentopdf:`) تعمل على **المنفذ 8080** + +## النشر باستخدام Helm + +### التثبيت من هذا المستودع (مخطط محلي) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### التثبيت من GHCR (مخطط OCI) + +إذا كان المخطط منشورًا على GHCR كعنصر OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## إتاحته + +### إعادة توجيه المنفذ (اختبار سريع) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (اختياري) + +فعّل Ingress (مثال لـ nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (اختياري) + +يدعم هذا المخطط `Gateway` + `HTTPRoute` الخاصين بـ Gateway API. + +مثال (مشغّل Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## التأكد من استمرار عمل ترويسات SharedArrayBuffer (Ingress/Gateway) + +### ما الذي "يجب" أن يحدث + +يضبط إعداد nginx في BentoPDF ترويسات الاستجابة المطلوبة. تقوم معظم وحدات تحكم Ingress/Gateway بـ**تمرير ترويسات استجابة المصدر كما هي دون تغيير**. + +### ما الذي قد يعطّل ذلك + +- سياسة في وحدة التحكم أو على الحافة **تستبدل** ترويسات الاستجابة أو **تحذفها** +- وسيط "ترويسات أمان" يضبط قيم COOP/COEP مختلفة + +### كيف تتحقق + +نفّذ هذا على نقطة النهاية العامة لديك: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +يجب أن ترى: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### إذا كانت وحدة تحكم Ingress لا تحافظ عليها + +أضف الترويسات على الحافة (بحسب وحدة التحكم). مثال لـ **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## أخطاء نوع MIME لملفات `.mjs` (عارض توقيع PDF / ملء النماذج فارغ) + +إذا عرضت وحدة تحكم المتصفح `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` عند طلب `.mjs`، فإن وحدة تحكم Ingress/Gateway الموجودة أمام nginx الخاص بـ BentoPDF تستبدل ترويسة `Content-Type` الأصلية بـ `application/octet-stream`. + +يقدّم nginx في صورة BentoPDF ملفات `.mjs` أصلًا بنوع `application/javascript`. الحل هو منع وحدة التحكم من حذفها أو استبدالها. بالنسبة إلى nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +أو استخدم مرشح `ResponseHeaderModifier` في Gateway API لضبط `Content-Type: application/javascript` لمسارات `.mjs`. تحقق عبر DevTools ثم تبويب Network: يجب أن يعرض طلب `.mjs` الفاشل الآن `content-type: application/javascript`. + +### إذا كنت تستخدم Gateway API وتريد إضافة الترويسات قسرًا + +يدعم Gateway API مرشح `ResponseHeaderModifier`. يمكنك إرفاقه في `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +يعتمد دعم مرشحات محددة على وحدة تحكم Gateway لديك. إذا تم تجاهل مرشح، فأضف الترويسات في طبقة الحافة/وحدة التحكم بدلًا من ذلك. + +## تعطيل أدوات محددة + +استخدم ConfigMap لتعطيل الأدوات وقت التشغيل دون إعادة بناء الصورة: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +اربطه بالمجلد المقدَّم: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +معرّفات الأدوات هي عنوان URL للصفحة بدون `.html`: افتح أي أداة وانظر إلى العنوان (مثل `edit-pdf` و`merge-pdf` و`compress-pdf`). تُخفى الأدوات المعطلة من الصفحة الرئيسية والبحث والاختصارات ومنشئ سير العمل والوصول المباشر عبر URL. راجع [دليل Docker](/ar/self-hosting/docker#تعطيل-أدوات-محددة) للاطلاع على القائمة الكاملة للخيارات. diff --git a/docs/ar/self-hosting/netlify.md b/docs/ar/self-hosting/netlify.md new file mode 100644 index 00000000..4d9ce36e --- /dev/null +++ b/docs/ar/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# النشر على Netlify + +توفّر [Netlify](https://netlify.com) استضافة ممتازة للمواقع الثابتة مع خطة مجانية سخية. + +## النشر بنقرة واحدة + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## النشر اليدوي + +### الخطوة 1: ربط المستودع + +1. سجّل الدخول إلى [Netlify](https://app.netlify.com) +2. انقر على "Add new site" ← "Import an existing project" +3. اربط حسابك على GitHub +4. اختر نسخة BentoPDF المتفرعة (fork) الخاصة بك + +### الخطوة 2: ضبط إعدادات البناء + +| الإعداد | القيمة | +| ---------- | --------------- | +| أمر البناء | `npm run build` | +| مجلد النشر | `dist` | +| إصدار Node | 18+ | + +### الخطوة 3: النشر + +انقر على "Deploy site" وانتظر اكتمال البناء. + +## ملف الإعداد + +أنشئ `netlify.toml` في جذر مشروعك: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning مهم +ترويستا `Cross-Origin-Embedder-Policy` و`Cross-Origin-Opener-Policy` مطلوبتان لتحويلات Word/ODT/Excel/PowerPoint إلى PDF. بدونهما يصبح `SharedArrayBuffer` غير متاح وسيفشل محرك LibreOffice WASM في التهيئة. + +تخبر الترويستان `Content-Encoding: gzip` الخاصتان بملفي `.wasm.gz` و`.data.gz` المتصفح بفك ضغطهما تلقائيًا. بدونهما يتلقى المتصفح بايتات gzip الخام وتفشل ترجمة WASM. +::: + +## متغيرات البيئة + +اضبطها في Site settings ← Environment variables: + +| المتغير | الوصف | +| ----------------------- | ---------------------------------------------------------- | +| `SIMPLE_MODE` | اضبطه على `true` لبناء مبسط | +| `VITE_BRAND_NAME` | اسم العلامة التجارية المخصص (يحل محل "BentoPDF") | +| `VITE_BRAND_LOGO` | مسار الشعار نسبةً إلى `public/` (مثل `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | نص التذييل/حقوق النشر المخصص | +| `VITE_DEFAULT_LANGUAGE` | لغة الواجهة الافتراضية (مثل `fr` و`de` و`es`) | + +## نطاق مخصص + +1. انتقل إلى Site settings ← Domain management +2. انقر على "Add custom domain" +3. اتبع تعليمات إعداد DNS + +## الوسائط الكبيرة + +بالنسبة إلى ملفات WASM الكبيرة، فكّر في تفعيل [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## استكشاف الأخطاء وإصلاحها + +### تحويل Word/ODT/Excel إلى PDF يتوقف عند 55% + +إذا توقفت تحويلات المستندات عند 55%، فافتح وحدة تحكم DevTools وتحقق: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +إذا كانت قيمة `crossOriginIsolated` هي `false`، فإن ترويسات COEP/COOP من `netlify.toml` لا تُطبَّق. تأكد من أن الملف في جذر مشروعك وأعد النشر. + +إذا ظهرت `expected magic word 00 61 73 6d, found 1f 8b 08 08` في وحدة التحكم، فإن ملفات `.wasm.gz` تفتقر إلى ترويسات `Content-Encoding: gzip`. تأكد من وجود كتل `[[headers]]` الخاصة بـ `soffice.wasm.gz` و`soffice.data.gz` في `netlify.toml`. + +### فشل البناء + +تحقق من توافق إصدار Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### بطء التحميل الأولي + +فعّل تحسين الأصول في Site settings ← Build & deploy ← Asset optimization. diff --git a/docs/ar/self-hosting/nginx.md b/docs/ar/self-hosting/nginx.md new file mode 100644 index 00000000..1964a057 --- /dev/null +++ b/docs/ar/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# النشر باستخدام Nginx + +استضف BentoPDF على خادمك الخاص باستخدام Nginx. + +## المتطلبات + +- خادم Ubuntu/Debian +- Nginx مثبّت +- شهادة SSL (يُنصح بـ Let's Encrypt) + +## الخطوة 1: بناء المشروع + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +لتخصيص العلامة التجارية، اضبط متغيرات البيئة قبل البناء: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## الخطوة 2: نسخ الملفات + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## الخطوة 3: إعداد Nginx + +أنشئ `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## الخطوة 4: تفعيل الموقع + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## الخطوة 5: SSL مع Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## النشر في مجلد فرعي + +للاستضافة على `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +ابنِ باستخدام: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## ضبط الأداء + +أضف إلى `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## استكشاف الأخطاء وإصلاحها + +### عدم تحميل WASM + +تأكد من ضبط نوع MIME: + +```nginx +types { + application/wasm wasm; +} +``` + +### عارض توقيع PDF أو ملء النماذج فارغ (خطأ MIME لملفات `.mjs`) + +إذا عرضت وحدة تحكم المتصفح: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...وانتهى الطلب الفاشل بـ `.mjs`، فإن nginx لديك يفتقر إلى التعيين `.mjs → application/javascript`. يأتي عارض PDF المضمّن (الذي تستخدمه أدوات توقيع PDF وملء النماذج وبعض الأدوات الأخرى) بملفات وحدات ES بامتداد `.mjs`، ولا يتضمنها ملف `mime.types` الافتراضي في nginx. + +أصلح ذلك بإضافة `mjs` إلى سطر `application/javascript` الموجود في `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> لا تُضف سطرًا _ثانيًا_ لـ `application/javascript`: يحلل nginx الملف `mime.types` سطرًا بسطر ويفوز تعيين واحد فقط من النوع إلى الامتداد، لذا يُتجاهل السطر الثاني بصمت في بعض الإصدارات. عدّل السطر الموجود لإضافة `mjs` بجانب `js`. + +أو تجاوزه محليًا داخل كتلة server (دون تعديل الملف العام): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +أعد تحميل nginx بعد التغيير: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +للتأكد: في DevTools بالمتصفح، افتح تبويب Network، وابحث عن طلب `.mjs` الفاشل وتحقق من ترويسة الاستجابة `Content-Type`. يجب أن تكون الآن `application/javascript` وليس `application/octet-stream`. + +### تحويل Word/ODT/Excel إلى PDF لا يعمل + +يتطلب LibreOffice WASM وجود `SharedArrayBuffer`، الذي يحتاج إلى ترويستي `Cross-Origin-Embedder-Policy` و`Cross-Origin-Opener-Policy`. كما يحتاج إلى سياق آمن، لذا يعمل `http://localhost` للاختبار المحلي، بينما يتطلب `http://192.168.x.x` أو غيره من عناوين IP المحلية عادةً HTTPS. لاحظ أن توجيهات `add_header` في nginx داخل كتلة `location` **تستبدل** توجيهات `add_header` على مستوى server ولا تُدمج معها. يجب أن تتضمن كل كتلة `location` لها `add_header` خاص بها ترويستي COEP/COOP. + +تحقق باستخدام: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +إذا كنت تستخدم وكيلًا عكسيًا أمام nginx، فتأكد من أنه يحافظ على هذه الترويسات. + +### 502 Bad Gateway + +افحص سجلات أخطاء Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/ar/self-hosting/vercel.md b/docs/ar/self-hosting/vercel.md new file mode 100644 index 00000000..737430a3 --- /dev/null +++ b/docs/ar/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# النشر على Vercel + +توفّر [Vercel](https://vercel.com) أسهل تجربة نشر للمواقع الثابتة. + +## النشر بنقرة واحدة + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## النشر اليدوي + +### الخطوة 1: عمل Fork للمستودع + +اعمل Fork لـ [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) إلى حسابك على GitHub. + +### الخطوة 2: الاستيراد إلى Vercel + +1. انتقل إلى [vercel.com/new](https://vercel.com/new) +2. اختر المستودع المتفرع الخاص بك +3. اضبط المشروع: + +| الإعداد | القيمة | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### الخطوة 3: متغيرات البيئة (اختياري) + +أضف هذه عند الحاجة: + +| المتغير | الوصف | +| ----------------------- | ---------------------------------------------------------- | +| `SIMPLE_MODE` | اضبطه على `true` لواجهة مبسطة | +| `VITE_BRAND_NAME` | اسم العلامة التجارية المخصص (يحل محل "BentoPDF") | +| `VITE_BRAND_LOGO` | مسار الشعار نسبةً إلى `public/` (مثل `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | نص التذييل/حقوق النشر المخصص | +| `VITE_DEFAULT_LANGUAGE` | لغة الواجهة الافتراضية (مثل `fr` و`de` و`es`) | + +### الخطوة 4: النشر + +انقر على "Deploy" وانتظر اكتمال البناء. + +## نطاق مخصص + +1. انتقل إلى إعدادات مشروعك +2. افتح "Domains" +3. أضف نطاقك المخصص +4. اضبط DNS كما هو موضح + +## القيود + +::: warning الملفات الكبيرة +للدوال عديمة الخادم (serverless) في Vercel حد قدره 50MB. بما أن BentoPDF موقع ثابت، فلا ينبغي أن يؤثر ذلك عليك، لكن وحدات WASM كبيرة (~100MB إجمالًا). تأكد من تقديمها من مجلد `/public`. +::: + +## استكشاف الأخطاء وإصلاحها + +### انتهاء مهلة البناء + +إذا انتهت مهلة البناء، فجرّب: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### خطأ 404 عند التحديث + +أضف ملف `vercel.json` لتوجيه SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### تحويل Word/ODT/Excel إلى PDF لا يعمل + +تتطلب تحويلات LibreOffice WASM وجود `SharedArrayBuffer`، الذي يحتاج إلى ترويسات الاستجابة هذه على جميع الصفحات: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +كما تحتاج ملفات `.wasm.gz` و`.data.gz` المضغوطة مسبقًا إلى `Content-Encoding: gzip` ليفك المتصفح ضغطها. + +أضف هذه إلى `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +للتحقق، افتح وحدة تحكم DevTools ونفّذ `console.log(window.crossOriginIsolated)`، ويجب أن تعيد `true`. diff --git a/docs/ar/tools/add-attachments.md b/docs/ar/tools/add-attachments.md new file mode 100644 index 00000000..cd798894 --- /dev/null +++ b/docs/ar/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: إضافة مرفقات +description: ضمّن ملفات من أي نوع داخل ملف PDF على مستوى المستند أو مرتبطة بصفحات محددة. +--- + +# إضافة مرفقات + +ضمّن ملفًا واحدًا أو أكثر مباشرة داخل مستند PDF. يمكن إضافة المرفقات على مستوى المستند (تظهر في لوحة المرفقات في أي قارئ PDF) أو ربطها بصفحات محددة. + +## طريقة العمل + +1. ارفع ملف PDF الذي تريد إرفاق الملفات به. +2. استخدم منطقة إفلات المرفقات لاختيار الملفات التي تريد تضمينها (من أي نوع). +3. اختر مستوى المرفق: **المستند** (الافتراضي) أو **الصفحة**. +4. إذا اخترت مستوى الصفحة، فأدخل نطاق الصفحات (مثل `1-3` أو `5`). +5. انقر على زر المعالجة. سيتم تنزيل ملف PDF المعدّل مع الملفات المضمّنة. + +## المزايا + +- إرفاق أي نوع من الملفات: صور، جداول بيانات، أرشيفات، ملفات تنفيذية، أي شيء +- وضع المرفق على مستوى المستند أو على مستوى الصفحة +- يمكن إرفاق عدة ملفات في عملية واحدة +- عرض أسماء الملفات وأحجامها لجميع المرفقات المحددة +- يحافظ الناتج على محتوى PDF الأصلي مع إضافة الملفات المضمّنة + +## الخيارات + +| الخيار | الوصف | +| ----------------- | -------------------------------------------------------------- | +| **مستوى المستند** | يرفق الملفات بملف PDF ككل، ويمكن الوصول إليها من لوحة المرفقات | +| **مستوى الصفحة** | يرفق الملفات بصفحات محددة، تُحدَّد عبر إدخال نطاق الصفحات | + +## حالات الاستخدام + +- حزم بيانات المصدر (ملفات Excel وCSV) مع تقرير PDF +- إرفاق ملفات الصور الأصلية بملف PDF لمعرض أعمال تصوير +- تضمين المستندات الداعمة داخل عقد أو عرض مقترح +- إضافة مواد تكميلية إلى صفحات محددة من دليل تدريبي + +## نصائح + +- المرفقات على مستوى المستند هي الأكثر دعمًا في قارئات PDF. قد لا تظهر المرفقات على مستوى الصفحة في جميع العارضات. +- لا يوجد حد لحجم المرفقات، لكن الملفات المضمّنة الكبيرة جدًا ستزيد حجم PDF بما يتناسب معها. + +## أدوات ذات صلة + +- [استخراج المرفقات](./extract-attachments) +- [تعديل المرفقات](./edit-attachments) +- [دمج PDF](./merge-pdf) diff --git a/docs/ar/tools/add-blank-page.md b/docs/ar/tools/add-blank-page.md new file mode 100644 index 00000000..37b1a210 --- /dev/null +++ b/docs/ar/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: إضافة صفحة فارغة +description: أدرج صفحة فارغة أو أكثر في أي موضع من مستند PDF. +--- + +# إضافة صفحة فارغة + +أدرج صفحات فارغة في ملف PDF في الموضع الذي تحدده. أنت تتحكم في مكان الصفحات الفارغة وعددها. + +## طريقة العمل + +1. ارفع ملف PDF. تعرض الأداة عدد الصفحات. +2. أدخل **الموضع** الذي ستُدرج فيه الصفحات الفارغة. استخدم `0` للإدراج في البداية تمامًا، أو إجمالي عدد الصفحات للإضافة في النهاية. +3. أدخل **عدد** الصفحات الفارغة المراد إضافتها (الافتراضي 1). +4. انقر على زر المعالجة. سيتم تنزيل ملف PDF المعدّل مع الصفحات الفارغة المدرجة. + +## المزايا + +- الإدراج في أي موضع: بداية المستند أو وسطه أو نهايته +- إضافة عدة صفحات فارغة في عملية واحدة +- يتحدث تلميح الموضع ديناميكيًا بحسب عدد صفحات ملف PDF المرفوع +- صفحات فارغة بحجم A4 القياسي + +## حالات الاستخدام + +- إضافة صفحة فاصلة فارغة بين أقسام مستند مجمّع +- إدراج صفحات فارغة لضبط الطباعة على الوجهين +- إضافة مساحة للملاحظات المكتوبة بخط اليد في دليل دراسي مطبوع +- إكمال مستند لتحقيق الحد الأدنى المطلوب لعدد الصفحات + +## نصائح + +- الموضع `0` يُدرج قبل الصفحة الأولى. أما الموضع المساوي لإجمالي عدد الصفحات فيضيف بعد الصفحة الأخيرة. +- إذا أردت إدراج محتوى (وليس صفحات فارغة فقط) في موضع محدد، فاستخدم [أداة PDF المتعددة](./pdf-multi-tool) لإدراج ملف PDF آخر بعد صفحة معينة. + +## أدوات ذات صلة + +- [تكرار وتنظيم](./organize-pdf) +- [أداة PDF المتعددة](./pdf-multi-tool) +- [دمج PDF](./merge-pdf) diff --git a/docs/ar/tools/add-page-labels.md b/docs/ar/tools/add-page-labels.md new file mode 100644 index 00000000..49fc4f5d --- /dev/null +++ b/docs/ar/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: إضافة تسميات الصفحات +description: أضف تسميات صفحات PDF بالأرقام الرومانية والبادئات الحرفية والترقيم المخصص وعدة قواعد لكل مستند. +--- + +# إضافة تسميات الصفحات + +تتحكم تسميات الصفحات في طريقة عرض أرقام الصفحات في عارضات PDF (الرقم الظاهر في شريط الأدوات، وليس المطبوع على الصفحة). تتيح لك هذه الأداة تعيين أنظمة تسمية مختلفة لنطاقات صفحات مختلفة: أرقام رومانية للصفحات التمهيدية، وأرقام عشرية للمتن، وملاحق مرقّمة بالحروف، وغير ذلك. + +## طريقة العمل + +1. ارفع ملف PDF. +2. تظهر لوحة الخيارات مع قاعدة تسمية واحدة افتراضيًا. +3. اضبط كل قاعدة بنطاق الصفحات والنمط والبادئة الاختيارية وقيمة البداية. +4. انقر على **إضافة قاعدة** لإنشاء قواعد إضافية لأقسام مختلفة. +5. انقر على **إضافة تسميات الصفحات** لتطبيق جميع القواعد وتنزيل النتيجة. + +## الخيارات + +لكل قاعدة تسمية الإعدادات التالية: + +- **نطاق الصفحات**: الصفحات التي تنطبق عليها القاعدة. اتركه فارغًا لجميع الصفحات. يدعم نطاقات مثل `1-4` أو `7` أو `odd` أو `1-9,30-40`. +- **نمط التسمية**: أرقام عربية عشرية، أرقام رومانية صغيرة (i, ii, iii)، أرقام رومانية كبيرة (I, II, III)، حروف صغيرة (a, b, c)، حروف كبيرة (A, B, C)، أو بلا تسمية (بادئة فقط). +- **بادئة التسمية**: نص اختياري يُضاف قبل كل تسمية، مثل "A-" لإنشاء تسميات مثل A-1 وA-2 وA-3. +- **قيمة البداية**: الرقم الذي يبدأ العد منه. الافتراضي 1. اضبطه على 0 للترقيم الذي يبدأ من الصفر. +- **متابعة الترقيم عبر النطاقات المتفرقة**: فعّله عندما تستهدف القاعدة صفحات غير متجاورة (مثل `1-9,30-40` أو `odd`) وتريد أن يستمر الترقيم بالتتابع. +- **إزالة تسميات الصفحات الحالية**: محدد افتراضيًا. يمسح أي تسميات سابقة قبل تطبيق قواعدك الجديدة. + +## المزايا + +- عدة قواعد تسمية لكل مستند لأنظمة الترقيم المعقدة +- ستة أنماط تسمية تغطي جميع أنظمة الترقيم القياسية +- دعم البادئات المخصصة للتسمية حسب الأقسام +- دعم النطاقات المتفرقة مع ترقيم متتابع +- خيار الإبقاء على التسميات الحالية أو إزالتها + +## حالات الاستخدام + +- ضبط تسميات رومانية (i, ii, iii) لمقدمة كتاب وتسميات عشرية للنص الرئيسي +- تسمية صفحات الملاحق ببادئات حرفية مثل "A-1" و"A-2" و"B-1" و"B-2" +- تصحيح تسميات الصفحات في مستند ممسوح ضوئيًا لا تطابق فيه أرقام الصفحات الفعلية ترتيب صفحات PDF +- إضافة ترقيم يبدأ من الصفر للمستندات التقنية + +## نصائح + +- تسميات الصفحات بيانات وصفية تعرضها عارضات PDF في شريط التنقل. لا تُطبع على الصفحة نفسها. للحصول على أرقام ظاهرة، استخدم [أرقام الصفحات](./page-numbers). +- تتطلب هذه الأداة ضبط CoherentPDF (CPDF) في إعدادات WASM. إذا لم يكن مضبوطًا، فستُطالَب بإعداده. + +## أدوات ذات صلة + +- [أرقام الصفحات](./page-numbers) +- [ترقيم بيتس](./bates-numbering) +- [تعديل الإشارات المرجعية](./bookmark) diff --git a/docs/ar/tools/add-stamps.md b/docs/ar/tools/add-stamps.md new file mode 100644 index 00000000..0d83528e --- /dev/null +++ b/docs/ar/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: إضافة أختام +description: أضف أختامًا صورية إلى صفحات PDF باستخدام شريط أدوات تعليقات توضيحية مدمج مع نسب الختم إلى اسم المستخدم. +--- + +# إضافة أختام + +ضع أختامًا صورية على صفحات PDF باستخدام عارض مدمج مزوّد بشريط أدوات لتعليقات الأختام. يمكن أن تتضمن الأختام اسمك للنسب، ما يجعلها مفيدة في مسارات الموافقة وعمليات المراجعة ووسم المستندات. + +## طريقة العمل + +1. أدخل اسمك في حقل **اسم مستخدم الختم**. سيظهر هذا الاسم على الأختام التي تنشئها. +2. ارفع ملف PDF بالنقر أو بسحبه إلى منطقة الإفلات. +3. يفتح محرر الأختام مع تحميل مستندك في العارض. +4. استخدم أداة الختم الصوري في شريط الأدوات لاختيار الأختام ووضعها على أي صفحة. +5. حدّد موضع الأختام وغيّر حجمها حسب الحاجة. +6. انقر على **حفظ PDF المختوم** لتنزيل النتيجة. + +## المزايا + +- عارض PDF مدمج مع شريط أدوات تعليقات خاص بالأختام +- نسب الأختام المنشأة إلى اسم المستخدم +- وضع الأختام الصورية على أي صفحة +- تحديد الموضع وتغيير الحجم بالسحب والإفلات +- ضبط حجم العارض تلقائيًا بحسب نسبة أبعاد الصفحة +- عرض الملف مع اسمه وحجمه + +## حالات الاستخدام + +- إضافة أختام صورية مثل "APPROVED" أو "REVIEWED" إلى المستندات في مسار المراجعة +- وضع صور ختم الشركة أو ختم كاتب العدل على المستندات الرسمية +- وسم الصفحات بأختام "RECEIVED" تتضمن اسم المراجع +- إضافة أختام مراقبة الجودة إلى تقارير الفحص + +## نصائح + +- اضبط اسم مستخدم الختم قبل رفع ملف PDF. يُضمَّن اسم المستخدم في البيانات الوصفية للختم. +- يضبط العارض ارتفاعه بحسب نسبة أبعاد الصفحة الأولى من PDF للحصول على عرض مثالي. +- للعلامات المائية النصية بدلًا من الأختام الصورية، استخدم أداة [إضافة علامة مائية](./add-watermark). + +## أدوات ذات صلة + +- [توقيع PDF](./sign-pdf) +- [إضافة علامة مائية](./add-watermark) +- [محرر PDF](./edit-pdf) diff --git a/docs/ar/tools/add-watermark.md b/docs/ar/tools/add-watermark.md new file mode 100644 index 00000000..465b4831 --- /dev/null +++ b/docs/ar/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: إضافة علامة مائية +description: ضع علامات مائية نصية أو صورية على صفحات PDF باستخدام محرر مرئي بالسحب والإفلات ومعاينة مباشرة. +--- + +# إضافة علامة مائية + +أضف علامات مائية نصية أو صورية إلى صفحات PDF باستخدام محرر مرئي. يمكنك تحديد موضع العلامة المائية بسحبها مباشرة على المعاينة، وتغيير حجمها بمقابض الزوايا، وضبط الشفافية والتدوير والخط واللون. يمكن أن يكون لكل صفحة موضع علامة مائية خاص بها، أو يمكنك تطبيق العلامة نفسها على جميع الصفحات دفعة واحدة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. يفتح المحرر مع معاينة مباشرة للصفحة الأولى وطبقة علامة مائية قابلة للسحب. +3. اختر بين وضع العلامة المائية **النصية** أو **الصورية** باستخدام أزرار التبديل. +4. اضبط إعدادات العلامة المائية في اللوحة الجانبية. +5. اسحب العلامة المائية على المعاينة لوضعها في المكان الذي تريده تمامًا. استخدم مقابض الزوايا لتغيير الحجم. +6. تنقّل بين الصفحات لضبط علامات مائية لكل صفحة، أو أبقِ خيار **تطبيق على جميع الصفحات** محددًا. +7. انقر على **إضافة علامة مائية** للمعالجة والتنزيل. + +## الخيارات + +**إعدادات العلامة المائية النصية:** + +- **النص**: نص العلامة المائية (مثل "CONFIDENTIAL" أو "DRAFT"). +- **حجم الخط**: من 10 إلى 200 نقطة. الافتراضي 72. +- **اللون**: أي لون عبر منتقي الألوان. +- **الشفافية**: تحكم في الشفافية من شفاف تمامًا إلى معتم تمامًا. +- **التدوير**: دوّر نص العلامة المائية من -180 إلى 180 درجة. + +**إعدادات العلامة المائية الصورية:** + +- **رفع صورة**: ارفع ملف PNG أو JPG أو أي صورة أخرى لاستخدامه كعلامة مائية. +- **الشفافية**: تحكم في شفافية الصورة. +- **المقياس**: غيّر حجم العلامة المائية الصورية. + +**إعدادات التخطيط:** + +- **مفردة**: علامة مائية واحدة لكل صفحة، تُحدَّد بالسحب أو بالمواضع المسبقة. +- **مكررة**: تكرر العلامة المائية على الصفحة كلها في شبكة قطرية تتبع زاوية التدوير، فتغطي العلامة المستند من حافة إلى حافة. +- **الفجوة الأفقية**: المسافة بين المربعات المكررة على امتداد اتجاه النص، كنسبة مئوية من عرض العلامة المائية (في الوضع المكرر فقط). +- **الفجوة الرأسية**: المسافة بين صفوف المربعات المكررة، كنسبة مئوية من ارتفاع العلامة المائية (في الوضع المكرر فقط). + +**الإعدادات العامة:** + +- **تطبيق على جميع الصفحات**: عند تحديده تنطبق العلامة المائية نفسها على كل صفحة. ألغِ تحديده لضبط علامات مائية فردية لكل صفحة. +- **نطاق الصفحات**: حدد الصفحات التي ستحصل على العلامة المائية (مثل "1-3, 5, 7-9" أو "all"). + +## المزايا + +- تحديد الموضع بالسحب والإفلات على معاينة PDF مباشرة +- علامة مائية قابلة لتغيير الحجم بمقابض الزوايا +- وضعا العلامة المائية النصية والصورية +- تخطيط مفرد أو مكرر على كامل الصفحة مع مسافات قابلة للضبط +- تطبيق العلامة لكل صفحة أو على المستند كله +- التنقل بين الصفحات صفحة صفحة في المعاينة +- عناصر تحكم في الشفافية والتدوير +- تصفية بنطاق الصفحات + +## حالات الاستخدام + +- وسم المستندات المسودة بعلامة "DRAFT" قبل تعميمها للمراجعة +- إضافة علامات "CONFIDENTIAL" المائية إلى التقارير المالية الحساسة +- وسم المستندات بعلامة مائية صورية لشعار الشركة +- ختم "SAMPLE" على وثائق المنتجات المشاركة مع العملاء المحتملين +- إضافة إشعارات حقوق النشر إلى مواد PDF الموزعة + +## نصائح + +- للعلامات المائية القطرية عبر الصفحة، اضبط التدوير على نحو 45 درجة وكبّر حجم الخط. +- يجعل الوضع المكرر إعادة استخدام المستند بعد القص أصعب بكثير، لأن إزالة علامة واحدة تترك عشرات غيرها. خفّض الشفافية عند التكرار ليبقى النص الأساسي مقروءًا. +- العلامات المائية الصورية ذات الخلفيات الشفافة (بصيغة PNG) تمتزج بسلاسة أكبر مع محتوى المستند. +- إذا كنت تحتاج نص علامة مائية مختلفًا في صفحات مختلفة، فألغِ تحديد "تطبيق على جميع الصفحات" وتنقّل صفحة بصفحة. + +## أدوات ذات صلة + +- [رأس وتذييل](./header-footer) +- [إضافة أختام](./add-stamps) +- [ترقيم بيتس](./bates-numbering) +- [توقيع PDF](./sign-pdf) diff --git a/docs/ar/tools/adjust-colors.md b/docs/ar/tools/adjust-colors.md new file mode 100644 index 00000000..d23a7bd6 --- /dev/null +++ b/docs/ar/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: ضبط الألوان +description: اضبط السطوع والتباين والتشبع والصبغة ودرجة الحرارة والتلوين وغاما والبني الداكن (سيبيا) في ملف PDF. +--- + +# ضبط الألوان + +مجموعة أدوات كاملة لتدرج الألوان في ملفات PDF. اضبط ثمانية معاملات مستقلة (السطوع، التباين، التشبع، إزاحة الصبغة، درجة الحرارة، التلوين، غاما، السيبيا) مع معاينة مباشرة تتحدث أثناء تحريك كل شريط تمرير. + +## طريقة العمل + +1. ارفع ملف PDF. +2. يفتح المحرر عارضًا معاينة للصفحة الأولى ولوحة إعدادات الألوان. +3. حرّك أشرطة التمرير لضبط كل معامل لوني. تتحدث المعاينة في الوقت الفعلي. +4. انقر على **إعادة تعيين** لاستعادة جميع أشرطة التمرير إلى مواضعها الافتراضية. +5. انقر على **تطبيق** لمعالجة جميع الصفحات وتنزيل ملف PDF المعدّل. + +## الخيارات + +- **السطوع**: تفتيح الصفحة بأكملها أو تعتيمها (من -100 إلى +100). +- **التباين**: زيادة الفرق بين المناطق الفاتحة والداكنة أو تقليله (من -100 إلى +100). +- **التشبع**: زيادة شدة الألوان أو تقليلها (من -100 إلى +100). ضبطه على -100 ينتج تدرجًا رماديًا. +- **إزاحة الصبغة**: تدوير عجلة الألوان لإزاحة جميع الألوان بشكل موحد. +- **درجة الحرارة**: إزاحة الألوان نحو الدفء (أصفر/برتقالي) أو البرودة (أزرق). +- **التلوين**: إضافة مسحة خضراء أو أرجوانية. +- **غاما**: ضبط سطوع الدرجات المتوسطة باستخدام منحنى غاما. القيم الأقل من 1.0 تعتّم الدرجات المتوسطة، والقيم الأعلى من 1.0 تفتّحها. +- **السيبيا**: تطبيق تأثير لوني سيبيا كلاسيكي. القيم الأعلى تعطي صبغة بنية أقوى. + +## المزايا + +- ثمانية معاملات لونية قابلة للضبط بشكل مستقل +- معاينة مباشرة تستجيب فورًا لتغييرات أشرطة التمرير +- زر إعادة تعيين للعودة السريعة إلى الإعدادات الافتراضية +- معالجة جميع صفحات المستند +- يعمل مع أي محتوى PDF (نصوص وصور ورسومات) + +## حالات الاستخدام + +- تفتيح مسح ضوئي داكن أو تصحيح صفحات مفرطة التعريض +- تقليل تشبع مستند ملون لتوفير الحبر قبل الطباعة +- تطبيق صبغة سيبيا لإعطاء الشهادات أو الجوائز مظهرًا قديمًا +- تصحيح درجة حرارة اللون في الصور المضمّنة في ملف PDF +- رفع التباين في المستندات الممسوحة الباهتة أو منخفضة الجودة + +## نصائح + +- للتحويل السريع إلى التدرج الرمادي، اسحب شريط التشبع إلى -100 بالكامل. +- شريط غاما مفيد بشكل خاص لتحسين قابلية قراءة المستندات الممسوحة التي تكون فيها الدرجات المتوسطة داكنة جدًا أو فاتحة جدًا. +- مثل أدوات التأثيرات الصورية الأخرى، تحوّل هذه الأداة كل صفحة إلى صورة نقطية. سيكون الناتج قائمًا على الصور، لذا لن يكون النص قابلًا للتحديد. + +## أدوات ذات صلة + +- [عكس الألوان](./invert-colors) +- [تأثير الماسح الضوئي](./scanner-effect) +- [لون الخلفية](./background-color) diff --git a/docs/ar/tools/alternate-merge.md b/docs/ar/tools/alternate-merge.md new file mode 100644 index 00000000..ae91273d --- /dev/null +++ b/docs/ar/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: تبديل ومزج الصفحات +description: ادمج ملفات PDF بتداخل الصفحات من كل ملف بالتناوب، مع الحفاظ على الإشارات المرجعية. +--- + +# تبديل ومزج الصفحات + +داخِل صفحات عدة ملفات PDF بحيث تتناوب الصفحات بين المستندات. هذه هي الأداة التي تلجأ إليها عندما يكتفي الدمج العادي بإلحاق الملفات واحدًا تلو الآخر، بينما تحتاج إلى الصفحة 1 من الملف A، ثم الصفحة 1 من الملف B، ثم الصفحة 2 من الملف A، وهكذا. + +## طريقة العمل + +1. ارفع ملفي PDF على الأقل باستخدام منطقة الإفلات. +2. تعرض الأداة كل ملف مع عدد صفحاته وحجمه. +3. اسحب مقابض الإمساك لإعادة ترتيب الملف الذي تأتي صفحاته أولًا في تسلسل التداخل. +4. انقر على **مزج الصفحات** لإنتاج الناتج المتداخل. +5. يتم تنزيل النتيجة باسم `alternated-mixed.pdf`. + +## المزايا + +- تداخل الصفحات عبر أي عدد من ملفات PDF (اثنان على الأقل) +- إعادة ترتيب الملفات بالسحب والإفلات للتحكم في أولوية التداخل +- الحفاظ على الإشارات المرجعية من المستندات المصدر +- عرض عدد الصفحات وحجم الملف لكل ملف مرفوع +- المعالجة عبر web worker مخصص للحفاظ على سلاسة الواجهة + +## حالات الاستخدام + +- إعادة تجميع المسح الضوئي على الوجهين عندما مُسحت الصفحات الفردية والزوجية بشكل منفصل +- دمج أوراق الأسئلة مع مفاتيح الإجابات بحيث يتبع كل سؤال جوابه +- دمج مستندات بلغتين صفحة بصفحة (مثل الإنجليزية في وجه والترجمة في الوجه التالي) +- تداخل مسح الوجه الأمامي والخلفي من ماسح ضوئي أحادي الوجه + +## نصائح + +- إذا كانت أعداد صفحات ملفات PDF المصدر مختلفة، فستنفد صفحات المستند الأقصر أولًا وستظهر الصفحات المتبقية من المستند الأطول في النهاية. +- ترتيب الملفات مهم: الملف الأول في القائمة يقدّم الصفحة الأولى من الناتج. اسحب لإعادة الترتيب عند الحاجة. + +## أدوات ذات صلة + +- [دمج PDF](./merge-pdf) +- [تكرار وتنظيم](./organize-pdf) +- [تقسيم PDF](./split-pdf) diff --git a/docs/ar/tools/background-color.md b/docs/ar/tools/background-color.md new file mode 100644 index 00000000..f82868e3 --- /dev/null +++ b/docs/ar/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: لون الخلفية +description: غيّر لون خلفية كل صفحة في ملف PDF مع الحفاظ على كل المحتوى فوقها. +--- + +# لون الخلفية + +اضبط لون خلفية موحدًا خلف كل المحتوى الموجود في ملف PDF. تنشئ الأداة مستطيلًا ملونًا في كل صفحة وتضع المحتوى الأصلي فوقه، فتبقى النصوص والصور والرسومات مرئية بالكامل على الخلفية الجديدة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اختر لون الخلفية باستخدام منتقي الألوان. الافتراضي أصفر فاتح (#FFFFCC). +3. انقر على **تغيير لون الخلفية** للمعالجة. +4. يتم تنزيل ملف PDF المحدّث تلقائيًا. + +## الخيارات + +- **لون الخلفية**: منتقي ألوان قياسي لاختيار أي لون موحد. الافتراضي أصفر فاتح. + +## المزايا + +- تطبيق لون خلفية موحد على كل صفحة +- الحفاظ على كل المحتوى الأصلي (نصوص وصور ورسومات متجهة) فوق الطبقة الملونة +- الإبقاء على أبعاد الصفحات الأصلية +- يعمل مع مستندات بأي عدد من الصفحات + +## حالات الاستخدام + +- إضافة خلفية بلون كريمي أو عاجي فاتح لمنح المستندات مظهرًا أنعم يشبه الورق +- ترميز مجموعات المستندات بالألوان بتطبيق ألوان خلفية مختلفة على فئات مختلفة +- إنشاء نسخ متميزة بصريًا من المستند نفسه لجماهير مختلفة +- إضافة صبغة خلفية فاتحة لتحسين القراءة عند عرض المستندات على الشاشة + +## نصائح + +- الألوان الفاتحة الهادئة هي الأنسب. قد تجعل الخلفية الداكنة جدًا النص صعب القراءة ما لم يكن النص فاتح اللون أصلًا. +- إذا أردت تغيير لون الخلفية والنص معًا، فطبّق لون الخلفية أولًا، ثم استخدم [تغيير لون النص](./text-color) على الناتج. +- تعمل هذه الأداة على مستوى بنية PDF (دون تحويل إلى صور نقطية)، لذا يبقى النص قابلًا للتحديد والبحث في الناتج. + +## أدوات ذات صلة + +- [تغيير لون النص](./text-color) +- [عكس الألوان](./invert-colors) +- [ضبط الألوان](./adjust-colors) diff --git a/docs/ar/tools/bates-numbering.md b/docs/ar/tools/bates-numbering.md new file mode 100644 index 00000000..732ab2a7 --- /dev/null +++ b/docs/ar/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: ترقيم بيتس +description: طبّق أرقام بيتس على ملف PDF واحد أو عدة ملفات بقوالب وحشو وخطوط ومواضع قابلة للتخصيص. +--- + +# ترقيم بيتس + +يختم ترقيم بيتس معرّفات متسلسلة على كل صفحة من ملفات PDF. وهو الطريقة القياسية لتسمية المستندات في الإجراءات القانونية وعمليات التدقيق وسير عمل الامتثال. تدعم هذه الأداة عدة ملفات وقوالب قابلة للتخصيص، وتنتج ملفات PDF مرقّمة بشكل فردي أو أرشيف ZIP واحدًا. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. يمكنك سحب عدة ملفات دفعة واحدة. +2. اختر نمطًا جاهزًا أو أنشئ قالبًا مخصصًا. +3. اضبط الموضع والخط والحجم واللون وأرقام البداية. +4. انقر على **تطبيق أرقام بيتس** للمعالجة. +5. يُنزَّل الملف الواحد مباشرة. أما الملفات المتعددة فتُنزَّل كأرشيف ZIP. + +## الخيارات + +- **النمط الجاهز**: اختر من الصيغ المدمجة: + - Exhibit + Case + Bates + Page (مثل "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (بدون رقم الصفحة) + - Case + Bates + - Bates Number Only (مثل "000001") + - مخصص (اكتب قالبك الخاص) +- **تخصيص النمط**: سلسلة قالب تستخدم العناصر النائبة: `[BATES]` و`[PAGE]` و`[FILE]` و`[FILENAME]`. +- **حشو بيتس**: عدد الخانات (من 3 إلى 6) لأرقام بيتس المحشوة بالأصفار. يظهر في الوضع المخصص فقط. +- **الموضع**: رأس أو تذييل، يسار أو وسط أو يمين. +- **يبدأ بيتس من**: أول رقم بيتس. الافتراضي 1. يستمر الترقيم عبر الملفات. +- **يبدأ عداد الملفات من**: الرقم الابتدائي للعنصر النائب `[FILE]`. +- **الخط**: Helvetica أو Times New Roman أو Courier. +- **حجم الخط**: حجم النص المختوم. +- **اللون**: منتقي ألوان لنص رقم بيتس. + +## المزايا + +- معاينة مباشرة توضح شكل أرقام بيتس عبر جميع الملفات المرفوعة +- دعم عدة ملفات مع ترقيم متواصل عبر المستندات +- إعادة ترتيب الملفات بالسحب والإفلات للتحكم في تسلسل الترقيم +- ستة خيارات للموضع (رأس/تذييل، يسار/وسط/يمين) +- حساب تكيفي للهوامش يراعي أحجام الصفحات المختلفة +- ناتج ZIP لدفعات الملفات المتعددة +- عناصر نائبة في القوالب لأقصى قدر من المرونة + +## حالات الاستخدام + +- ختم مستندات الكشف في التقاضي بأرقام مرفقات متسلسلة +- ترقيم حزم أدلة التدقيق التي تمتد عبر عشرات الملفات +- تطبيق أرقام مرجعية تنظيمية على وثائق الامتثال +- تسمية مرفقات طلبات براءات الاختراع بمعرّفات خاصة بالقضية + +## نصائح + +- اسحب الملفات في قائمة الملفات لإعادة ترتيبها قبل المعالجة. يتبع تسلسل ترقيم بيتس هذا الترتيب. +- استخدم العنصر النائب `[FILENAME]` لتضمين اسم الملف الأصلي في الختم، ما يساعد على تتبع الصفحات إلى المستندات المصدر. +- يتحدث مربع المعاينة في الوقت الفعلي عند تغيير الإعدادات، لذا يمكنك التحقق من الصيغة قبل المعالجة. + +## أدوات ذات صلة + +- [أرقام الصفحات](./page-numbers) +- [إضافة تسميات الصفحات](./add-page-labels) +- [رأس وتذييل](./header-footer) diff --git a/docs/ar/tools/bmp-to-pdf.md b/docs/ar/tools/bmp-to-pdf.md new file mode 100644 index 00000000..f22c91cd --- /dev/null +++ b/docs/ar/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP إلى PDF +description: حوّل صور BMP النقطية إلى صيغة PDF مباشرة في متصفحك، دون الحاجة إلى رفع أي شيء إلى خادم. +--- + +# BMP إلى PDF + +حوّل ملفات Windows Bitmap (BMP) إلى PDF. BMP صيغة صور غير مضغوطة لا تزال موجودة في الأنظمة القديمة والتصوير الطبي والماسحات الضوئية الصناعية. تحوّلها هذه الأداة إلى PDF دون الحاجة إلى تثبيت أي شيء. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :--------- | +| BMP | `.bmp` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات BMP وأفلتها. +2. راجع قائمة الملفات. أضف المزيد من الملفات أو أزل غير المرغوب فيها. +3. انقر على **تحويل إلى PDF**. يتم تنزيل الناتج باسم `from_bmps.pdf`. + +يُرسم كل ملف BMP على canvas، ثم يُصدَّر بصيغة PNG، ثم يُضمَّن في PDF باستخدام pdf-lib. يطابق حجم الصفحة أبعاد الصورة الأصلية. + +## الخيارات + +لا تعرض هذه الأداة إعدادات جودة إضافية. تُضمَّن الصور بدقتها الأصلية بصيغة PNG دون فقدان داخل PDF. + +## حالات الاستخدام + +- تحويل المستندات الممسوحة القديمة المخزنة بصيغة BMP إلى ملفات PDF للأرشفة +- تحويل لقطات شاشة BMP من تطبيقات Windows القديمة إلى مستندات قابلة للمشاركة +- معالجة مخرجات الماسحات الطبية أو الصناعية التي تعتمد BMP افتراضيًا +- نقل أرشيفات الصور القديمة إلى صيغة أكثر قابلية للنقل + +## نصائح + +- ملفات BMP غير مضغوطة، لذا تميل إلى أن تكون كبيرة. سيكون ملف PDF الناتج أصغر بكثير لأن الصور تُعاد ترميزها داخليًا بصيغة PNG. +- إذا كانت لديك ملفات BMP إلى جانب صيغ صور أخرى، فاستخدم أداة [صور إلى PDF](./image-to-pdf) لتحويل كل شيء في دفعة واحدة. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [PNG إلى PDF](./png-to-pdf) +- [TIFF إلى PDF](./tiff-to-pdf) diff --git a/docs/ar/tools/bookmark.md b/docs/ar/tools/bookmark.md new file mode 100644 index 00000000..72535c25 --- /dev/null +++ b/docs/ar/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: تعديل الإشارات المرجعية +description: أضف إشارات PDF المرجعية وعدّلها واستوردها وصدّرها واحذفها بمحرر مرئي مع دعم CSV/JSON. +--- + +# تعديل الإشارات المرجعية + +يمنحك محرر الإشارات المرجعية تحكمًا كاملًا في إشارات التنقل في PDF (وتسمى أيضًا المخططات التفصيلية). يمكنك إضافة إشارات جديدة وتعديل الموجودة وإعادة ترتيب التسلسل الهرمي واستيراد بيانات الإشارات وتصديرها بصيغتي CSV وJSON. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإسقاط أو بسحب الملف إليها. +2. يمكنك اختيار **استخراج الإشارات المرجعية الموجودة تلقائيًا** لجلب شجرة الإشارات الحالية للمستند. +3. يفتح المحرر بعرض مقسوم: عارض PDF على اليسار ولوحة الإشارات على اليمين. +4. اكتب عنوان الإشارة ثم انقر **إضافة إلى الصفحة** لإنشاء إشارة جديدة تشير إلى الصفحة الحالية. +5. استخدم أزرار شريط الأدوات لإعادة الترتيب أو التنسيق أو الحذف. +6. انقر **حفظ PDF مع الإشارات المرجعية** لتنزيل الملف المحدّث. + +## الميزات + +- عارض PDF مرئي مع التنقل بين الصفحات وأدوات التكبير وحقل الانتقال إلى صفحة +- إضافة إشارات إلى أي صفحة بنقرة واحدة +- النقر مباشرة على PDF لتحديد وجهة دقيقة للإشارة (وضع الالتقاط) +- تسلسل هرمي متداخل للإشارات مع إعادة الترتيب بالسحب والإفلات +- عمليات دفعية: حدّد عدة إشارات لتغيير اللون أو النمط أو الحذف دفعة واحدة +- بحث في الإشارات للعثور بسرعة على العناصر في الأشجار الكبيرة +- دعم التراجع والإعادة لجميع التغييرات +- استيراد الإشارات من ملفات CSV (العنوان، الصفحة، المستوى) أو JSON +- تصدير الإشارات إلى CSV أو JSON للتعديل خارجيًا +- تنسيق الإشارات: اللون (أحمر، أزرق، أخضر، أصفر، بنفسجي) ونمط الخط (عريض، مائل، عريض مائل) +- تنقل سريع: تصفح الصفحات بمفتاحي Page Up وPage Down + +## الخيارات + +- **استخراج الإشارات المرجعية الموجودة تلقائيًا**: عند تفعيله، تقرأ الأداة إشارات PDF الحالية وتعرضها عند التحميل. +- **الوضع الدفعي**: فعّله لتحديد عدة إشارات وتطبيق تغيير اللون أو النمط أو الحذف عليها دفعة واحدة. +- **توسيع/طي الكل**: إظهار أو إخفاء الإشارات الفرعية المتداخلة بسرعة. + +## حالات الاستخدام + +- إضافة جدول محتويات إلى كتاب مدرسي أو دليل لا يحتوي على إشارات +- إعادة هيكلة الإشارات في مستند ممسوح ضوئيًا بعد المعالجة بالتعرف الضوئي +- تصدير الإشارات إلى CSV وتعديلها في جدول بيانات ثم إعادة استيرادها +- تنظيف الإشارات المولّدة تلقائيًا التي تحتوي على مراجع صفحات خاطئة +- إضافة إشارات ملونة لتمييز الأقسام المهمة في مذكرة قانونية + +## نصائح + +- استخدم استيراد CSV لإنشاء إشارات كثيرة دفعة واحدة. الصيغة بسيطة: `title,page,level` حيث المستوى 1 هو المستوى الأعلى. +- يتيح لك وضع الالتقاط النقر على موضع محدد في صفحة PDF لتعيين وجهة الإشارة، وهو أدق من استهداف رقم الصفحة فقط. +- صدّر إشاراتك قبل إجراء تغييرات كبيرة لتحتفظ بنسخة احتياطية. + +## أدوات ذات صلة + +- [جدول المحتويات](./table-of-contents) +- [محرر PDF](./edit-pdf) +- [إضافة تسميات الصفحات](./add-page-labels) diff --git a/docs/ar/tools/cbz-to-pdf.md b/docs/ar/tools/cbz-to-pdf.md new file mode 100644 index 00000000..00c128a9 --- /dev/null +++ b/docs/ar/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ إلى PDF +description: حوّل أرشيفات الكتب المصورة CBZ وCBR إلى PDF في متصفحك. مجاني وخاص وبدون رفع ملفات. +--- + +# CBZ إلى PDF + +حوّل ملفات أرشيف الكتب المصورة إلى ملفات PDF. CBZ وCBR هما الصيغتان القياسيتان للقصص المصورة الرقمية، وهما في الحقيقة أرشيفات ZIP أو RAR مليئة بالصور. تستخرج هذه الأداة كل صفحة وتحافظ على ترتيب القراءة وتنتج ملف PDF نظيفًا تصبح فيه كل صورة صفحة كاملة الحجم. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----- | :------- | :---------------------------------------------------------- | +| CBZ | `.cbz` | أرشيف كتب مصورة قائم على ZIP (يُعالج محليًا بواسطة pdf-lib) | +| CBR | `.cbr` | أرشيف كتب مصورة قائم على RAR (يُعالج عبر محرك PyMuPDF) | + +يتعرف محوّل CBZ على صور JPEG وPNG وGIF وBMP وWebP وAVIF وTIFF وHEIC وJXL داخل الأرشيف. تُحوَّل الصيغ غير القياسية تلقائيًا إلى PNG قبل التضمين. + +## طريقة العمل + +1. انقر منطقة الرفع أو اسحب ملفات CBZ أو CBR وأفلتها. يمكنك خلط الصيغتين في دفعة واحدة. +2. راجع الملفات المدرجة. أزل ما لا تحتاجه، أو انقر **إضافة المزيد من الملفات** لإضافة ملفات أخرى. +3. انقر **تحويل إلى PDF**. بالنسبة لملفات CBZ، تفك الأداة ضغط الأرشيف وترتب ملفات الصور بالاسم بترتيب طبيعي وتكتشف الصيغة الفعلية لكل صورة وتضمّنها في PDF باستخدام pdf-lib. أما ملفات CBR فتُمرَّر عبر محرك PyMuPDF بدلًا من ذلك. +4. يُنزَّل الملف الواحد بصيغة PDF. وتنتج الملفات المتعددة أرشيف ZIP باسم `comic-converted.zip`. + +## الخيارات + +لا حاجة لأي إعداد. تصبح كل صورة صفحة بحجم أبعادها الأصلية، فتبقى الصفحات المزدوجة عريضة والصفحات المفردة ضيقة. + +## حالات الاستخدام + +- قراءة القصص المصورة على تطبيق لجهاز لوحي أو هاتف يدعم PDF ولا يدعم CBZ/CBR +- طباعة صفحات محددة من قصة مصورة رقمية +- أرشفة مجموعة قصص مصورة بصيغة يستطيع أي عارض ملفات فتحها +- مشاركة قصة مصورة مع شخص لا يملك قارئ قصص مخصصًا + +## نصائح + +- تُرتَّب الصور داخل الأرشيف بالترتيب الطبيعي (فيأتي `page2.jpg` قبل `page10.jpg`). سمِّ ملفاتك بترقيم متسق للحصول على تسلسل صفحات صحيح. +- يكتشف المحوّل صيغ الصور من توقيعاتها الثنائية لا من امتدادات الملفات. وسيُضمَّن ملف PNG سُمّي خطأً `.jpg` بشكل صحيح. +- تُعالج ملفات CBZ بالكامل داخل المتصفح دون تحميل محرك PyMuPDF، لذا تُحوَّل أسرع من ملفات CBR. + +## أدوات ذات صلة + +- [EPUB إلى PDF](./epub-to-pdf) +- [MOBI إلى PDF](./mobi-to-pdf) +- [صور إلى PDF](./image-to-pdf) diff --git a/docs/ar/tools/change-permissions.md b/docs/ar/tools/change-permissions.md new file mode 100644 index 00000000..2117781b --- /dev/null +++ b/docs/ar/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: تغيير الأذونات +description: اضبط أو عدّل أذونات استخدام PDF للطباعة والنسخ والتحرير والتعليق. يستخدم تشفير AES بطول 256 بت. +--- + +# تغيير الأذونات + +تحكم بدقة فيما يستطيع المستلمون فعله بملف PDF الخاص بك. فعلى عكس التشفير الأساسي الذي يكتفي بقفل الملف بكلمة مرور، تتيح لك هذه الأداة السماح أو المنع انتقائيًا للطباعة والنسخ والتحرير والتعليق وتعبئة النماذج وتجميع المستند واستخراج الصفحات، وكل ذلك يُفرض عبر تشفير AES بطول 256 بت. + +## طريقة العمل + +1. ارفع ملف PDF. +2. إذا كان PDF مشفرًا بالفعل، أدخل **كلمة المرور الحالية**. +3. عيّن **كلمة مرور مستخدم جديدة** (مطلوبة للفتح) و/أو **كلمة مرور مالك جديدة** (تتحكم بالأذونات). +4. فعّل الأذونات أو عطّلها كلًا على حدة باستخدام مربعات الاختيار. +5. انقر **تغيير الأذونات**. +6. نزّل ملف PDF المحدّث. + +إذا تركت حقلي كلمة المرور الجديدتين فارغين، تفك الأداة تشفير PDF بالكامل وتزيل كل التشفير والقيود. + +## عناصر التحكم بالأذونات + +| الإذن | ما الذي يتحكم به | +| --------------------------- | ----------------------------------------- | +| **السماح بالطباعة** | هل يمكن طباعة المستند | +| **السماح بالنسخ** | هل يمكن تحديد النصوص والصور ونسخها | +| **السماح بالتعديل** | هل يمكن تحرير محتوى المستند | +| **السماح بالتعليق** | هل يمكن إضافة تعليقات وتمييز وأختام | +| **السماح بتعبئة النماذج** | هل يمكن إكمال حقول النموذج التفاعلية | +| **السماح بتجميع المستند** | هل يمكن إدراج الصفحات أو حذفها أو تدويرها | +| **السماح باستخراج الصفحات** | هل يمكن استخراج صفحات فردية | + +تتطلب جميع الأذونات كلمة مرور مالك لتُفرض. وبدون كلمة مرور المالك، تتجاهل معظم قارئات PDF علامات الأذونات. + +## كيف تعمل الأذونات في PDF + +الأذونات في PDF جزء من مواصفة التشفير. وتُخزَّن كعلامات بتّية في قاموس التشفير وتفرضها قارئات PDF المتوافقة. الفرق الأساسي: + +- **كلمة مرور المستخدم**: مطلوبة لفتح الملف أصلًا. +- **كلمة مرور المالك**: مطلوبة لتغيير الأذونات أو إزالة القيود. وبدونها، تتحكم علامات الأذونات بالعمليات التي يستطيع المستخدم تنفيذها. + +إذا عيّنت كلمة مرور مالك فقط (دون كلمة مرور مستخدم)، يستطيع أي شخص فتح الملف لكنه مقيّد بالعمليات المسموحة. وإذا عيّنت الاثنتين، يتطلب الملف كلمة مرور لفتحه ويصبح مقيّدًا بعد المصادقة. + +## حالات الاستخدام + +- توزيع تقرير يمكن عرضه وطباعته دون تحريره أو نسخه +- مشاركة قالب عقد يستطيع المستلمون تعبئته دون تعديله +- نشر كتالوج PDF مع تعطيل نسخ الصور +- السماح بالتعليق على مسودة مراجعة مع منع التغييرات الهيكلية + +## نصائح + +- لتكون الأذونات فعّالة، عيّن دائمًا كلمة مرور مالك. فالأذونات بدون كلمة مرور مالك لا يمكن فرضها. +- بعض أدوات PDF الخارجية تتجاهل علامات الأذونات. لحماية أقوى، فكّر في تحويل PDF إلى صور أو استخدام إدارة الحقوق الرقمية (DRM). +- استخدم هذه الأداة لترقية ملفات PDF القديمة المشفرة بـ RC4 إلى AES-256. + +## أدوات ذات صلة + +- [حماية PDF](./protect-pdf): حماية بسيطة بكلمة مرور دون أذونات دقيقة +- [إلغاء قفل PDF](./unlock-pdf): إزالة التشفير بالكامل +- [إزالة القيود](./remove-restrictions): أزل جميع القيود عندما تملك كلمة مرور المالك diff --git a/docs/ar/tools/combine-single-page.md b/docs/ar/tools/combine-single-page.md new file mode 100644 index 00000000..c65714a0 --- /dev/null +++ b/docs/ar/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: دمج في صفحة واحدة +description: اجمع جميع صفحات PDF في صفحة واحدة متصلة بتمرير عمودي أو أفقي. +--- + +# دمج في صفحة واحدة + +ادمج كل صفحات PDF في صفحة واحدة طويلة. تُجمَّع الصفحات عموديًا (مثل لفافة) أو أفقيًا (جنبًا إلى جنب) لتنتج صفحة واحدة متصلة في الملف الناتج. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اختر اتجاه التخطيط: **عمودي** (الصفحات مرصوصة من الأعلى إلى الأسفل) أو **أفقي** (الصفحات جنبًا إلى جنب). +3. حدّد المسافة بين الصفحات بالنقاط. +4. اختر لون خلفية للفراغات بين الصفحات. +5. يمكنك تفعيل الفواصل (خطوط رفيعة بين الصفحات) وضبط سماكتها ولونها. +6. انقر زر المعالجة. الناتج ملف PDF من صفحة واحدة. + +## الميزات + +- تجميع الصفحات عموديًا أو أفقيًا +- مسافة قابلة للضبط بين الصفحات +- منتقي لون الخلفية لمناطق الفراغ +- خطوط فاصلة اختيارية بسماكة ولون قابلين للتعديل +- يعرض كل صفحة أصلية بدقتها الكاملة على اللوحة المدمجة + +## الخيارات + +| الخيار | الوصف | +| ----------------------- | ------------------------------------- | +| **الاتجاه** | عمودي (مرصوص) أو أفقي (جنبًا إلى جنب) | +| **المسافة بين الصفحات** | الفراغ بين الصفحات بالنقاط | +| **لون الخلفية** | لون المنطقة بين الصفحات | +| **إضافة فاصل** | تفعيل خطوط رفيعة بين الصفحات | +| **سماكة الفاصل** | سماكة الخط بالنقاط | +| **لون الفاصل** | لون الخطوط الفاصلة | + +## حالات الاستخدام + +- إنشاء صورة واحدة طويلة من هيكل أو تصميم تجريبي متعدد الصفحات +- توليد عرض متصل قابل للتمرير لمستند من أجل تضمينه في الويب +- ربط قصة مصورة أو لوحة قصصية متعددة الصفحات في شريط واحد +- إنتاج عرض بانورامي لصفحات متتابعة للمراجعة + +## نصائح + +- يناسب الاتجاه العمودي المستندات ذات الصفحات الطولية. أما الأفقي فأفضل للمحتوى ذي الاتجاه العرضي. +- ستنتج المستندات الكبيرة ذات الصفحات الكثيرة ملفًا طويلًا أو عريضًا جدًا. وقد تعجز بعض عارضات PDF عن التعامل مع صفحات مفردة كبيرة للغاية. +- إضافة فواصل بلون متباين تسهّل رؤية أين تنتهي صفحة أصلية وتبدأ التي تليها. + +## أدوات ذات صلة + +- [N-Up PDF](./n-up-pdf) +- [دمج PDF](./merge-pdf) +- [تقسيم الصفحات](./divide-pages) diff --git a/docs/ar/tools/compare-pdfs.md b/docs/ar/tools/compare-pdfs.md new file mode 100644 index 00000000..76709e98 --- /dev/null +++ b/docs/ar/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: مقارنة ملفات PDF +description: قارن مستندي PDF جنبًا إلى جنب أو بوضع التراكب مع كشف مفصل للتغييرات وتصنيفها. +--- + +# مقارنة ملفات PDF + +ارفع ملفي PDF وشاهد بالضبط ما تغيّر بينهما. تقرن الأداة الصفحات بذكاء وتكشف الاختلافات في النصوص والصور والتعليقات التوضيحية والرؤوس والتنسيق وتعرضها بعرض جنبًا إلى جنب أو بالتراكب. + +## طريقة العمل + +1. ارفع ملفي PDF: الأصلي (يسارًا) والنسخة المعدّلة (يمينًا). +2. تقرن الأداة الصفحات بين المستندين باستخدام بصمات المحتوى. +3. اختر وضع العرض: **جنبًا إلى جنب** أو **تراكب**. +4. تنقّل بين أزواج الصفحات باستخدام عناصر التحكم بالترقيم. +5. تُميَّز الاختلافات وتُصنَّف. استخدم لوحة التصفية للتركيز على أنواع تغيير محددة. +6. يمكنك تصدير المقارنة كتقرير PDF. + +## الميزات + +- اقتران تلقائي للصفحات بناءً على تشابه المحتوى +- عرضا مقارنة: جنبًا إلى جنب وتراكب +- تصنيف التغييرات: نص، صورة، رأس/تذييل، تعليق توضيحي، تنسيق، خلفية +- مفاتيح تصفية لكل فئة لإظهار أنواع تغيير محددة أو إخفائها +- بحث في تغييرات النص مع تصفية بالاستعلام +- دعم التعرف الضوئي لمقارنة المستندات الممسوحة ضوئيًا +- أدوات تكبير للفحص التفصيلي +- تمرير متزامن بين اللوحتين في وضع جنبًا إلى جنب +- تصدير نتائج المقارنة بصيغة PDF + +## الخيارات + +| الخيار | الوصف | +| --------------------- | ------------------------------------------------------------------------------------- | +| **وضع العرض** | جنبًا إلى جنب أو تراكب | +| **التعرف الضوئي** | تفعيل/تعطيل التعرف الضوئي لمقارنة المستندات الممسوحة ضوئيًا | +| **لغة التعرف الضوئي** | لغة استخراج النص بالتعرف الضوئي | +| **مرشحات الفئات** | تبديل ظهور تغييرات النص والصورة والرأس/التذييل والتعليقات التوضيحية والتنسيق والخلفية | +| **نطاق التغيير** | في وضع التراكب، التصفية بين كل التغييرات أو المحتوى فقط | +| **التكبير** | ضبط مستوى التكبير للفحص التفصيلي | + +## حالات الاستخدام + +- مراجعة تعديلات العقود لمعرفة ما تغيّر بالضبط بين النسخ +- مقارنة التصاميم التجريبية للتحقق من أن تصديرات PDF تطابق المتوقع +- تدقيق تغييرات المستندات في القطاعات الخاضعة للتنظيم حيث يجب تتبع كل تعديل +- التحقق من أن عملية تحويل PDF حافظت على المحتوى الأصلي بدقة +- فحص مستندات الترجمة مقابل الأصل بحثًا عن تغييرات في التخطيط + +## نصائح + +- يضع عرض التراكب المستندين فوق بعضهما، فتظهر الفروق المكانية (العناصر المزاحة والصور المعاد تحجيمها) فورًا. +- فعّل التعرف الضوئي عند مقارنة مستندات ممسوحة ضوئيًا لا تحتوي على طبقة نصية. سيستخرج محرك المقارنة النص من صور الصفحات. +- استخدم مرشحات الفئات للتركيز على المهم. على سبيل المثال، أخفِ تغييرات التنسيق عندما تهتم باختلافات محتوى النص فقط. + +## أدوات ذات صلة + +- [عرض البيانات الوصفية](./view-metadata) +- [التعرف الضوئي على PDF](./ocr-pdf) +- [دمج PDF](./merge-pdf) diff --git a/docs/ar/tools/compress-pdf.md b/docs/ar/tools/compress-pdf.md new file mode 100644 index 00000000..db93a5ff --- /dev/null +++ b/docs/ar/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: ضغط PDF +description: قلّل حجم ملف PDF حتى 90% بمحرك Hyper Compress. يدعم أحجام الملفات المستهدفة والمعالجة الدفعية وإعدادات الجودة المخصصة. +--- + +# ضغط PDF + +قلّل حجم ملفات PDF دون إتلافها. يعمل ضغط PDF بواسطة [Hyper Compress](https://www.bentopdf.com/hyper-compress)، محرك الضغط الخاص بـ BentoPDF. فهو يعيد ضغط الصور ويستخلص مجموعات جزئية من الخطوط ويدمجها ويزيل الحمولة الزائدة مثل الصور المصغرة المضمنة وبيانات التطبيقات الخاصة. يبقى PDF وظيفيًا بالكامل: النص قابل للتحديد والروابط وحقول النماذج تعمل. + +يُترجم Hyper Compress إلى WebAssembly ويأتي مع BentoPDF، لذا يعمل الضغط دون اتصال وفي البيئات المعزولة عن الشبكة دون أي إعداد إضافي. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإسقاط أو بسحب الملفات إليها. +2. اختر **مستوى الضغط**: منخفض أو متوسط أو عالٍ أو بلا فقدان. +3. يمكنك إدخال **حجم الملف المستهدف**، أو توسيع **الإعدادات المخصصة** لتحكم أدق، بما في ذلك **التحويل إلى تدرج الرمادي**. +4. انقر **ضغط PDF**. وعند رفع عدة ملفات، تحصل على تنزيل ZIP واحد. + +## المستندات الخاصة + +- **ملفات PDF الموقعة رقميًا** تُعاد دون تغيير، لأن أي تعديل سيُبطل التوقيع. فعّل **تجاوز حماية المحتوى** ضمن الإعدادات المخصصة لإزالة التوقيعات وضغط الملف؛ يبقى التوقيع المرئي على الصفحة لكن الملف لم يعد موقّعًا. +- **ملفات PDF/A** تفقد تسمية PDF/A بعد الضغط، حتى لا يدّعي الملف مطابقة لم يعد يستوفيها. فعّل **الحفاظ على PDF/A** ضمن الإعدادات المخصصة للإبقاء على مطابقة الملف بدلًا من ذلك. +- **ملفات PDF المحمية بكلمة مرور** يظهر على بطاقة ملفها حقل كلمة مرور. أدخل كلمة المرور هناك ويفتح Hyper Compress الملف بنفسه، دون خطوة فك قفل منفصلة. عند وجود ملفين مقفلين أو أكثر، يفك حقل مشترك واحد قفل كل الملفات التي تستخدم كلمة المرور نفسها. النسخة المضغوطة بلا كلمة مرور؛ استخدم [حماية PDF](./protect-pdf) لإضافتها مجددًا. +- **الممسوحات الضوئية بلا طبقة نصية** يمكن تقليص حجمها أكثر بخيار **تحويل الصفحات إلى صور** ضمن الإعدادات المخصصة، الذي يستبدل كل صفحة بصورة واحدة محسّنة. يُتخطى هذا الخيار لأي مستند فيه نص قابل للتحديد، بما في ذلك الممسوحات ضوئيًا التي خضعت للتعرف الضوئي، ما لم يكن **تجاوز حماية المحتوى** مفعّلًا. عندها تتحول صفحات النص إلى صور أيضًا، فيتوقف النص عن كونه قابلًا للتحديد وتتوقف الروابط عن العمل. + +## مستويات الضغط + +| المستوى | جودة الصورة | أقصى دقة | الأنسب لـ | +| ------------- | ------------ | --------- | ---------------------------- | +| **منخفض** | 80 | 200 DPI | الحفاظ على الجودة البصرية | +| **متوسط** | 50 | 150 DPI | المستندات اليومية | +| **عالٍ** | 20 | 72 DPI | مرفقات البريد وتحميلات الويب | +| **بلا فقدان** | صور دون مساس | دون تغيير | نسخ الأرشفة | + +يزيل المستوى العالي أيضًا تضمين الخطوط القياسية الـ 14 في PDF، إضافة إلى الخطوط المشابهة لها مثل Arial عندما يكون ذلك آمنًا. + +## حجم الملف المستهدف + +أدخل حجمًا بالكيلوبايت أو الميغابايت ويبحث Hyper Compress عن أفضل جودة صور تظل ضمن هذا الحجم، بدءًا من المستوى الذي اخترته. إذا تعذّر تصغير المستند إلى ذلك الحجم، تحصل على أصغر نسخة يمكنه إنتاجها مع رسالة بذلك. أما الصفحات المخصصة مثل [ضغط PDF إلى 1 ميغابايت](https://www.bentopdf.com/compress-pdf-to-1mb) فتفتح والهدف مملوء مسبقًا. + +## الإعدادات المخصصة + +وسّع لوحة الإعدادات المخصصة لضبط Hyper Compress مباشرة. اختيار مستوى ضغط يعيد هذه الإعدادات إلى قيم ذلك المستوى، وتعديل أي منها ينقل المستوى إلى مخصص. + +- **تجاوز حماية المحتوى**: افتراضيًا يترك Hyper Compress ملفات PDF الموقعة دون مساس ولا يحوّل الصفحات التي تحتوي نصًا إلى صور. تفعيل هذا الخيار يتجاوز الأمرين. ويبقى مفعّلًا عند تغيير المستوى. + +- **الصور**: جودة الصورة وأقصى دقة وإعادة التشكيل القسرية وتقليل الألوان وقص مناطق الصور غير المرئية وإزالة الصور البديلة وتبسيط ملفات الألوان وJPEG 2000 والوضع بلا فقدان +- **الخطوط**: استخلاص المجموعات الجزئية ودمج المكرر وإلغاء تضمين الخطوط القياسية وما يشبهها +- **المحتوى**: تسطيح التعليقات التوضيحية أو حقول النماذج أو الروابط +- **التنظيف**: إزالة الصور المصغرة وبيانات التطبيقات وخيوط المقالات ومعلومات التقاط الويب وشجرة البنية ونوايا الإخراج +- **التحويل إلى صور**: استبدال الصفحات بصور، للممسوحات ضوئيًا المكونة من صور فقط؛ يُتخطى عندما يحتوي المستند نصًا قابلًا للتحديد +- **الإخراج**: الحفاظ على PDF/A، وضغط Brotli لقارئات PDF 2.0 التي تدعمه + +## حالات الاستخدام + +- خفض تقرير بحجم 50 ميغابايت إلى ما دون حد مرفقات البريد +- إنزال ملف ممسوح ضوئيًا تحت حد الرفع الصارم لبوابة ما باستخدام حجم ملف مستهدف +- تحسين ملفات PDF التسويقية لتنزيل أسرع من المواقع +- أرشفة مجموعات مستندات كبيرة حيث تهم تكاليف التخزين +- تقليل استهلاك بيانات الجوال عند مشاركة ملفات PDF عبر تطبيقات المراسلة + +## نصائح + +- ابدأ بالمستوى المتوسط. وإذا بقيت النتيجة كبيرة، حدّد حجم ملف مستهدفًا أو انتقل إلى العالي. +- للممسوحات الضوئية بلا طبقة نصية، فعّل تحويل الصفحات إلى صور ضمن الإعدادات المخصصة. +- يمكن للتحويل إلى تدرج الرمادي، ضمن الإعدادات المخصصة، أن يخفض حجم المستندات الغنية بالألوان. + +## أدوات ذات صلة + +- [تحسين PDF للويب](./linearize-pdf): حسّن PDF المضغوط لعرض سريع على الويب +- [تحويل PDF إلى صور](./rasterize-pdf): حوّل الصفحات إلى صور بدقة DPI محددة، بما فيها الصفحات التي تحتوي نصًا +- [إصلاح PDF](./repair-pdf): أصلح ملف PDF تعطل أثناء الضغط في مكان آخر +- [إزالة البيانات الوصفية](./remove-metadata): أزل البيانات المخفية للخصوصية diff --git a/docs/ar/tools/crop-pdf.md b/docs/ar/tools/crop-pdf.md new file mode 100644 index 00000000..bb7e0890 --- /dev/null +++ b/docs/ar/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: قص PDF +description: اقصص صفحات PDF بصريًا برسم منطقة القص على كل صفحة بمحرر مدعوم بـ Cropper.js. +--- + +# قص PDF + +قلّم هوامش صفحات PDF باستخدام واجهة قص مرئية. ارسم مستطيل القص مباشرة على كل صفحة، وعاين النتيجة ثم طبّق القص. يمكنك تعيين مناطق قص مختلفة لصفحات مختلفة أو تطبيق القص نفسه على المستند كاملًا. + +## طريقة العمل + +1. ارفع ملف PDF. +2. يفتح محرر القص ويعرض الصفحة الأولى مع طبقة قص قابلة للسحب. +3. اضبط مستطيل القص بسحب حوافه أو زواياه. +4. استخدم أزرار التنقل بين الصفحات للانتقال بينها وتعيين مناطق القص لكل منها. +5. انقر **قص** لتطبيق القص وتنزيل النتيجة. + +## الميزات + +- محرر قص مرئي مدعوم بـ Cropper.js مع مقابض للضبط الدقيق +- تنقل صفحة بصفحة لتعيين مناطق قص فردية +- يخزّن إعدادات القص لكل صفحة لتتمكن من تحديد قصات مختلفة لصفحات مختلفة +- معاينة مباشرة لمنطقة القص المحددة +- يدعم ملفات PDF بأي حجم صفحة أو اتجاه + +## حالات الاستخدام + +- إزالة الهوامش العريضة من المستندات الممسوحة ضوئيًا للتركيز على منطقة المحتوى +- تقليم علامات القص أو التسجيل الخاصة بالطابعة من ملفات PDF قبل الطباعة +- قص شرائح المحاضرات لإزالة منطقة ملاحظات المقدّم +- إزالة الرؤوس أو التذييلات من كل صفحة قبل مشاركة مقتطف من مستند +- تغيير حجم الصفحات لتناسب شاشة أو تخطيط طباعة محددًا + +## نصائح + +- يمكن تغيير حجم طبقة القص وإعادة تموضعها بحرية. اسحب الزوايا لتغيير الحجم بتناسب أو الحواف لضبط محور واحد. +- في المستندات التي تحتاج كل صفحاتها إلى القص نفسه، عيّنه على الصفحة الأولى، فالأداة تتذكر منطقة القص أثناء تنقلك بين الصفحات. +- إذا كنت تريد توحيد أحجام الصفحات بدل القص البصري، فقد تكون أداة توحيد حجم الصفحة أنسب. + +## أدوات ذات صلة + +- [محرر PDF](./edit-pdf) +- [أرقام الصفحات](./page-numbers) +- [إزالة الصفحات الفارغة](./remove-blank-pages) diff --git a/docs/ar/tools/csv-to-pdf.md b/docs/ar/tools/csv-to-pdf.md new file mode 100644 index 00000000..7546184d --- /dev/null +++ b/docs/ar/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV إلى PDF +description: حوّل ملفات جداول CSV إلى جداول PDF منسقة مباشرة في متصفحك. +--- + +# CSV إلى PDF + +حوّل ملفات CSV إلى مستندات PDF نظيفة ومنسقة. يُحلَّل كل ملف CSV ويُعرض كجدول في ملف PDF الناتج. هذا مفيد عندما تريد طباعة بيانات جدولية أو مشاركتها دون أن يحتاج المستلم إلى برنامج جداول بيانات. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :--------- | +| CSV | `.csv` | + +## طريقة العمل + +1. انقر منطقة الرفع أو اسحب ملف CSV واحدًا أو أكثر وأفلته. +2. راجع قائمة الملفات. أضف المزيد أو أزل ما لا تريده. +3. انقر **تحويل إلى PDF**. يعرض مؤشر التقدم حالة التحويل. +4. يُنزَّل الملف الواحد مباشرة بصيغة PDF. وتُجمَّع الملفات المتعددة في `csv-converted.zip`. + +## الخيارات + +لا تحتاج هذه الأداة إلى أي إعداد إضافي. يُحلَّل ملف CSV وينسَّق كجدول تلقائيًا. + +## الناتج + +| عدد المدخلات | الناتج | +| :------------ | :---------------------------------------------------- | +| ملف واحد | تنزيل ملف PDF واحد (مثل `data.pdf`) | +| ملفان أو أكثر | أرشيف ZIP (`csv-converted.zip`) يحتوي ملف PDF لكل ملف | + +## حالات الاستخدام + +- تحويل تقارير قواعد البيانات المصدّرة إلى جداول PDF قابلة للطباعة +- مشاركة البيانات المالية أو قوائم المخزون مع من لا يملكون Excel +- إنشاء نسخ PDF من ملفات سجلات CSV لتوثيق الامتثال +- طباعة قوائم العناوين أو كشوف الدرجات أو أي بيانات جدولية مخزنة بصيغة CSV + +## نصائح + +- للحصول على أفضل النتائج، تأكد أن ملف CSV يستخدم فواصل الفاصلة القياسية. تتبع الأداة أعراف تحليل CSV الشائعة. +- إذا كان ملف CSV يحتوي أعمدة كثيرة، فقد يُضغط الجدول ليناسب عرض الصفحة. فكّر في تقسيم مجموعات البيانات العريضة إلى عدة ملفات. +- لملفات Excel (`.xls`، `.xlsx`)، استخدم أداة [Excel إلى PDF](./excel-to-pdf) التي تحافظ على تنسيق الجداول وتعدد الأوراق. + +## أدوات ذات صلة + +- [Excel إلى PDF](./excel-to-pdf) +- [نص إلى PDF](./txt-to-pdf) +- [JSON إلى PDF](./json-to-pdf) diff --git a/docs/ar/tools/delete-pages.md b/docs/ar/tools/delete-pages.md new file mode 100644 index 00000000..99d37bf2 --- /dev/null +++ b/docs/ar/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: حذف الصفحات +description: أزل صفحات محددة من PDF برقم الصفحة أو النطاق أو التحديد المرئي عبر الصور المصغرة. +--- + +# حذف الصفحات + +أزل الصفحات غير المرغوبة من مستند PDF. حدّد الصفحات المراد حذفها بكتابة أرقام الصفحات أو النطاقات، أو انقر مباشرة على الصور المصغرة للصفحات لتعليمها للإزالة. + +## طريقة العمل + +1. ارفع ملف PDF. تعرض الأداة معاينات مصغرة لكل صفحة. +2. أدخل الصفحات المراد حذفها في حقل النص بصيغة النطاقات (مثل `2, 5-8`)، أو انقر الصور المصغرة لتبديل تحديدها. +3. تُميَّز الصفحات المعلَّمة بصريًا لتتأكد من اختيارك. +4. انقر زر المعالجة. يُنشأ ملف PDF جديد بعد إزالة الصفحات المحددة. + +## الميزات + +- تحديد الصفحات بالنص بصيغة النطاقات (`2, 5-8, 12`) +- شبكة صور مصغرة مرئية للحذف بالنقر +- تمييز فوري في المعاينة للصفحات المعلَّمة للحذف +- التحقق من المدخلات مقابل عدد الصفحات الفعلي +- يُبقي جميع الصفحات غير المحذوفة بترتيبها الأصلي + +## حالات الاستخدام + +- إزالة الصفحات الفارغة أو الحشو من مستند ممسوح ضوئيًا +- حذف صفحات الغلاف أو الملاحق قبل مشاركة المستند +- تنظيف صفحات المسودات التي بقيت عن طريق الخطأ في PDF نهائي +- إزالة الصفحات التي تحتوي معلومات حساسة قبل التوزيع + +## نصائح + +- حذف الصفحات لا يؤثر على محتوى الصفحات المتبقية أو تنسيقها. الناتج نسخة مطابقة للأصل بعد طرح الصفحات المحذوفة. +- إذا كنت تريد الاحتفاظ بصفحات محددة بدل إزالة صفحات محددة، فإن [استخراج الصفحات](./extract-pages) أنسب. +- يُحمَّل عرض الصور المصغرة تدريجيًا، لذا تبقى المستندات الكبيرة سريعة الاستجابة. + +## أدوات ذات صلة + +- [استخراج الصفحات](./extract-pages) +- [تكرار وتنظيم](./organize-pdf) +- [تقسيم PDF](./split-pdf) diff --git a/docs/ar/tools/deskew-pdf.md b/docs/ar/tools/deskew-pdf.md new file mode 100644 index 00000000..231e80cd --- /dev/null +++ b/docs/ar/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: تصحيح انحراف PDF +description: عدّل الصفحات المائلة تلقائيًا في ملفات PDF الممسوحة ضوئيًا باستخدام كشف الانحراف في OpenCV. مع حد ودقة DPI قابلين للضبط. +--- + +# تصحيح انحراف PDF + +نادرًا ما تكون المستندات الممسوحة ضوئيًا مستقيمة تمامًا. حتى الميل الطفيف يقلل دقة التعرف الضوئي ويجعل الطباعة تبدو غير مرتبة. تستخدم هذه الأداة خوارزميات معالجة الصور في OpenCV لكشف زاوية انحراف كل صفحة وإعادة تدويرها لتصبح مستوية. + +## طريقة العمل + +1. ارفع ملف PDF ممسوحًا ضوئيًا واحدًا أو أكثر. +2. اضبط **حد الانحراف**: تُترك دون تغيير الصفحات التي يقل انحرافها المكتشف عن هذه القيمة. +3. اختر **جودة المعالجة (DPI)**: الدقة الأعلى تحسّن دقة الكشف لكنها تستغرق وقتًا أطول. +4. انقر **تصحيح انحراف PDF**. +5. بعد المعالجة، تعرض لوحة النتائج زاوية كل صفحة المكتشفة وهل صُحِّحت. + +## الخيارات + +| الإعداد | القيم | الافتراضي | +| ---------------- | ----------------------- | --------- | +| **حد الانحراف** | 0.1، 0.5، 1.0، 2.0 درجة | 0.5 | +| **DPI المعالجة** | 100، 150، 200، 300 | 150 | + +## كيف يعمل كشف الانحراف + +تعرض الأداة كل صفحة كصورة بدقة DPI المحددة، ثم تستخدم OpenCV لكشف زوايا الخطوط المهيمنة في المحتوى. إذا تجاوز الانحراف المكتشف الحد، تُدوَّر الصفحة بالزاوية المعاكسة لتستقيم. وتمر الصفحات الأقل من الحد دون تغيير. + +## حالات الاستخدام + +- تنظيف العقود أو المستندات القانونية الممسوحة ضوئيًا دفعة واحدة +- تجهيز الإيصالات أو الفواتير الممسوحة للتعرف الضوئي +- تقويم صفحات من ماسح مسطح وُضع فيه الورق بشكل غير متسق +- تحسين الجودة البصرية للمواد الأرشيفية المرقمنة + +## نصائح + +- اخفض الحد إلى 0.1 درجة إذا احتجت محاذاة دقيقة للتعرف الضوئي. +- 150 DPI سريعة ودقيقة لمعظم المستندات. استخدم 300 DPI للنصوص الصغيرة جدًا أو الصفحات كثيرة التفاصيل. +- يعمل تصحيح الانحراف بأفضل شكل على المستندات ذات الأسطر الأفقية الواضحة. وقد يواجه صعوبة مع الصفحات التي تغلب عليها الصور أو عناصر التصميم المائلة. + +## أدوات ذات صلة + +- [تحويل PDF إلى صور](./rasterize-pdf): حوّل الناتج المصحّح إلى PDF مسطح قائم على الصور +- [ضغط PDF](./compress-pdf): قلّل حجم الملف بعد التصحيح +- [إصلاح PDF](./repair-pdf): أصلح المشكلات البنيوية في ملفات PDF الممسوحة ضوئيًا diff --git a/docs/ar/tools/digital-sign-pdf.md b/docs/ar/tools/digital-sign-pdf.md new file mode 100644 index 00000000..0042f4bf --- /dev/null +++ b/docs/ar/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: توقيع رقمي +description: أضف توقيعات رقمية مشفرة إلى ملفات PDF باستخدام شهادات X.509. يدعم صيغتي PKCS#12 وPEM مع خيارات التوقيع المرئي. +--- + +# توقيع رقمي + +التوقيع الرقمي دليل تشفيري على أن شخصًا محددًا وقّع مستندًا وأن المستند لم يُعدَّل منذ ذلك الحين. وعلى عكس التوقيع المرسوم (وهو مجرد صورة)، يستخدم التوقيع الرقمي شهادات X.509 ومعايير PKCS#7 لتوفير أصالة وسلامة يمكن التحقق منهما. + +يطبّق BentoPDF التوقيعات الرقمية بالكامل داخل متصفحك. مفتاحك الخاص لا يغادر جهازك أبدًا. + +## طريقة العمل + +1. ارفع ملف PDF. +2. ارفع ملف الشهادة (.pfx أو .p12 أو .pem). +3. أدخل كلمة مرور الشهادة لفتحها. تعرض الأداة موضوع الشهادة والجهة المصدرة وفترة الصلاحية. +4. يمكنك ضبط بيانات التوقيع الوصفية (السبب والموقع ومعلومات الاتصال). +5. يمكنك تفعيل **توقيع مرئي** مع تخصيص الموضع والحجم والصورة والنص. +6. انقر **توقيع PDF**. + +## صيغ الشهادات المدعومة + +| الصيغة | الامتدادات | الوصف | +| ----------- | ---------- | ---------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | حزمة معيارية في الصناعة تحتوي المفتاح الخاص وسلسلة الشهادات. الصيغة الأكثر شيوعًا. | +| **PEM** | .pem | صيغة نصية. يجب أن تحتوي الشهادة والمفتاح الخاص معًا في ملف واحد. تدعم المفاتيح الخاصة المشفرة. | + +## خيارات التوقيع المرئي + +عند التفعيل، تُعرض كتلة توقيع مرئية على صفحة PDF: + +- **الموضع**: إحداثيات X/Y والعرض/الارتفاع بالنقاط +- **الصفحة**: الصفحة الأولى أو الأخيرة أو كل الصفحات أو رقم صفحة محدد +- **الصورة**: ارفع صورة PNG أو JPG أو WebP (توقيعك بخط اليد أو ختم شركتك وغيرها) +- **النص**: نص مخصص بلون وحجم خط قابلين للضبط. إذا لم تُقدَّم صورة أو نص، تولّد الأداة نصًا تلقائيًا من الاسم الشائع للشهادة والتاريخ الحالي. + +## بيانات التوقيع الوصفية + +- **السبب**: لماذا وُقّع المستند (مثل "تمت الموافقة"، "تمت المراجعة") +- **الموقع**: مكان التوقيع (مثل "New York, NY") +- **معلومات الاتصال**: كيفية الوصول إلى الموقّع (مثل البريد الإلكتروني) + +## ملاحظة حول الاتصال بالإنترنت + +قد يتطلب التوقيع اتصالًا بالإنترنت. تجلب مكتبة التوقيع سلسلة الشهادات من عناوين URL مضمنة في امتداد الوصول إلى معلومات الجهة (AIA) في شهادتك. وإذا تعذّر الوصول إلى تلك الخوادم، سيفشل التوقيع للشهادات التي تتطلب التحقق من السلسلة. + +## حالات الاستخدام + +- توقيع العقود والعروض والاتفاقيات بتوقيعات رقمية ملزمة قانونًا +- اعتماد المستندات الرسمية في سير العمل الذي يتطلب مصادقة قائمة على PKI +- توقيع فواتير PDF للامتثال التنظيمي (تشترط دول أوروبية كثيرة فواتير إلكترونية موقعة رقميًا) +- إضافة اعتماد مؤسسي إلى الرسومات الهندسية أو مستندات الجودة + +## نصائح + +- تصلح الشهادات الموقعة ذاتيًا للاختبار لكنها ستعرض تحذيرات في Adobe Reader. استخدم شهادة من جهة إصدار شهادات موثوقة للمستندات الفعلية. +- التوقيع المرئي بصري فقط. أما التوقيع التشفيري فيُضمَّن سواء فُعِّلت الكتلة المرئية أم لا. +- تحقق من ملف PDF الموقّع باستخدام أداة التحقق من التوقيع للتأكد من سلامة التوقيع. + +## أدوات ذات صلة + +- [التحقق من توقيع PDF](./validate-signature-pdf): تحقق من التوقيعات الرقمية في ملفات PDF الموقعة +- [تسطيح PDF](./flatten-pdf): سطّح النماذج قبل التوقيع لمنع التعديلات +- [حماية PDF](./protect-pdf): أضف حماية بكلمة مرور فوق التوقيع الرقمي +- [إزالة البيانات الوصفية](./remove-metadata): أزل البيانات الوصفية قبل التوقيع diff --git a/docs/ar/tools/divide-pages.md b/docs/ar/tools/divide-pages.md new file mode 100644 index 00000000..1279444f --- /dev/null +++ b/docs/ar/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: تقسيم الصفحات +description: قسّم صفحات PDF أفقيًا أو عموديًا إلى صفحات فرعية أصغر. +--- + +# تقسيم الصفحات + +اقطع صفحات PDF الفردية إلى نصفين بتقسيمها أفقيًا أو عموديًا. هذا مفيد عندما تحتوي صفحة واحدة على محتوى ينبغي فصله إلى صفحات مستقلة، مثل تخطيط بعمودين مُسح ضوئيًا كصفحة عريضة واحدة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اختر اتجاه التقسيم: **عمودي** (نصفان أيسر/أيمن) أو **أفقي** (نصفان علوي/سفلي). +3. يمكنك تحديد نطاق صفحات لتقييد الصفحات المراد تقسيمها. اتركه فارغًا لتقسيم كل الصفحات. +4. انقر زر المعالجة لتوليد PDF المقسّم. + +## الميزات + +- التقسيم العمودي: يقسم كل صفحة إلى نصفين أيسر وأيمن +- التقسيم الأفقي: يقسم كل صفحة إلى نصفين علوي وسفلي +- مرشح نطاق الصفحات لتقسيم صفحات محددة فقط +- الصفحات غير المستهدفة تمر دون تغيير +- يحافظ على جودة المحتوى دون إعادة عرض + +## حالات الاستخدام + +- فصل الصفحات الممسوحة ضوئيًا بصفحتين في كل ورقة (مثل مسح كتاب تظهر فيه الصفحتان اليسرى واليمنى على ورقة واحدة) +- تقسيم PDF عرضي يحتوي محتوى جنبًا إلى جنب إلى صفحات طولية منفصلة +- تقسيم الإنفوجرافيك أو الملصقات الطويلة إلى قسمين علوي وسفلي منفصلين +- تجهيز المستندات ذات الصيغة العريضة للطباعة على الورق القياسي + +## نصائح + +- إذا كان توزيع المحتوى في صفحاتك غير متساوٍ، يحدث التقسيم مع ذلك عند المنتصف تمامًا. للتقسيم غير المتماثل، فكّر في استخدام [قص PDF](./crop-pdf) بدلًا من ذلك. +- ادمج هذه الأداة مع [تدوير PDF](./rotate-pdf) إذا كانت صفحاتك تحتاج إلى تدوير قبل التقسيم أو بعده. + +## أدوات ذات صلة + +- [تقسيم PDF](./split-pdf) +- [قص PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [تكبير PDF إلى ملصق](./posterize-pdf) diff --git a/docs/ar/tools/duplex-collate.md b/docs/ar/tools/duplex-collate.md new file mode 100644 index 00000000..145379b7 --- /dev/null +++ b/docs/ar/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: ترتيب المسح على الوجهين +description: أعد ترتيب ملفات PDF الممسوحة على الوجهين التي تحتوي الصفحات الأمامية والخلفية في كتلتين منفصلتين إلى ترتيب صحيح أمامي/خلفي. +--- + +# ترتيب المسح على الوجهين + +صُمّمت هذه الأداة لسير عمل المسح بالتغذية التلقائية (ADF) حيث يحتوي ملف PDF واحد على كتلتين من الصفحات: + +- كل الوجوه الأمامية أولًا +- كل الوجوه الخلفية ثانيًا + +بدلًا من التقسيم وإعادة التجميع يدويًا، تدمج هذه الأداة الكتلتين بترتيب القراءة الطبيعي: أمامي1، خلفي1، أمامي2، خلفي2، وهكذا. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا ناتجًا عن مسح رزمة على الوجهين. +2. حدّد نقطة التقسيم حيث تنتهي كتلة الوجوه الأمامية. +3. اختر طريقة التعامل مع كتلة الوجوه الخلفية: + - **عكس كتلة الوجوه الخلفية** (شائع عند قلب الرزمة قبل مسح الوجوه الخلفية) + - **إبقاء كتلة الوجوه الخلفية كما هي** +4. انقر **ترتيب PDF** لتنزيل الناتج المعاد ترتيبه. + +## الخيارات + +- **كشف التقسيم تلقائيًا (النصف)**: يضبط نقطة التقسيم على `ceil(totalPages / 2)`. +- **تحذير الصفحات الفردية**: يحذّر عندما يكون إجمالي الصفحات فرديًا (وغالبًا يدل على عدم تطابق في المسح). +- **تأكيد الكتل غير المتساوية**: يطلب تأكيدًا عندما يختلف حجم كتلتي الأمام والخلف. +- **التصدير المجمّع**: قسّم الناتج المرتب إلى ملفات PDF منفصلة بناءً على عدد صفحات المستند الأصلي ونزّلها كملف ZIP. + +## سلوك الناتج + +- **الافتراضي**: ملف PDF ناتج واحد (ملف PDF واحد مدخل، وملف PDF واحد ناتج). +- **الوضع المجمّع**: يُقسَّم الناتج حسب قيمة عدد الصفحات لكل مستند؛ وإذا نتجت عدة أجزاء تُنزَّل كملف ZIP واحد، وإلا يُنزَّل ملف PDF واحد. + +إذا كانت أحجام الكتل غير متساوية، تُرتَّب الصفحات المقترنة أولًا، وتُلحَق الصفحات المتبقية غير المقترنة في النهاية. + +## حالات الاستخدام الشائعة + +- استعادة الترتيب بعد مسح كومة نماذج مطبوعة على الوجهين على مرحلتين. +- إعادة بناء حزم الأمام/الخلف من ماسحات المكاتب التي تُخرج كل الوجوه الأمامية ثم كل الخلفية. +- المعالجة اللاحقة للمسوحات الأرشيفية قبل تقسيمها إلى ملفات لكل مستند. + +## نصائح + +- ينبغي أن يكون إجمالي عدد الصفحات زوجيًا في معظم دفعات الوجهين. +- إذا بدا الناتج مقلوبًا في الوجوه الخلفية، بدّل بين **عكس كتلة الوجوه الخلفية** و**إبقاء كتلة الوجوه الخلفية كما هي**. +- للأصول المكونة من صفحتين (أمام+خلف)، استخدم التصدير المجمّع مع `2` صفحة لكل مستند. + +## أدوات ذات صلة + +- [تبديل ومزج الصفحات](./alternate-merge) +- [تقسيم PDF](./split-pdf) +- [دمج PDF](./merge-pdf) +- [تكرار وتنظيم](./organize-pdf) diff --git a/docs/ar/tools/edit-attachments.md b/docs/ar/tools/edit-attachments.md new file mode 100644 index 00000000..d3ce5970 --- /dev/null +++ b/docs/ar/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: تعديل المرفقات +description: اعرض المرفقات المضمنة في مستند PDF وأزل منها ما تختاره. +--- + +# تعديل المرفقات + +افحص المرفقات داخل ملف PDF وأدرها. تسرد الأداة كل ملف مضمن باسمه ومستوى إرفاقه، ثم تتيح لك تعليم مرفقات فردية للإزالة أو حذفها كلها دفعة واحدة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. تفحص الأداة المرفقات تلقائيًا وتعرضها في قائمة. +3. يعرض كل مرفق اسم ملفه وهل هو مرفق على مستوى المستند أو على مستوى الصفحة. +4. انقر أيقونة سلة المهملات بجوار المرفق لتعليمه للإزالة (انقر مرة أخرى لإلغاء التعليم). +5. استخدم زر **إزالة كل المرفقات** لتحديد كل شيء دفعة واحدة، أو **إلغاء تحديد الكل** لمسح التحديدات. +6. انقر زر المعالجة لحفظ PDF جديد بعد إزالة المرفقات المحددة. + +## الميزات + +- يسرد كل المرفقات على مستوى المستند وعلى مستوى الصفحة +- إزالة المرفقات فرديًا أو دفعة واحدة +- تبديل التحديد تشغيلًا وإيقافًا قبل تثبيت التغييرات +- شطب مرئي وتغيير في الشفافية للعناصر المعلَّمة للإزالة +- ينزّل PDF المعدّل بعد حذف المرفقات المحددة + +## حالات الاستخدام + +- إزالة الملفات القديمة أو الخاطئة المضمنة في مستند قبل إعادة توزيعه +- حذف المرفقات الحساسة (بيانات مالية أو معلومات شخصية) من PDF قبل مشاركته +- تقليل حجم PDF بإزالة الملفات المضمنة الكبيرة التي لم تعد مطلوبة +- تدقيق المحتوى المضمن وتنظيف المستند قبل الأرشفة + +## نصائح + +- تظهر المرفقات المعلَّمة للإزالة مع شطب مرئي. يمكنك إعادتها قبل المعالجة إذا غيّرت رأيك. +- إذا لم تُعثر على مرفقات، تعرض الأداة رسالة واضحة "لم يتم العثور على مرفقات"، أي أن PDF لا يحتوي ببساطة على ملفات مضمنة. + +## أدوات ذات صلة + +- [إضافة مرفقات](./add-attachments) +- [استخراج المرفقات](./extract-attachments) +- [عرض البيانات الوصفية](./view-metadata) diff --git a/docs/ar/tools/edit-metadata.md b/docs/ar/tools/edit-metadata.md new file mode 100644 index 00000000..d91f02d0 --- /dev/null +++ b/docs/ar/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: تعديل البيانات الوصفية +description: اعرض حقول البيانات الوصفية في PDF وعدّلها، ومنها العنوان والمؤلف والكلمات المفتاحية والتواريخ والخصائص المخصصة. +--- + +# تعديل البيانات الوصفية + +عدّل البيانات الوصفية المضمنة في ملف PDF. تملأ الأداة نموذجًا مسبقًا بالبيانات الوصفية الحالية للمستند، وتتيح لك تعديل أي حقل، ثم تحفظ التغييرات في ملف PDF جديد. + +## طريقة العمل + +1. ارفع ملف PDF. تقرأ الأداة بياناته الوصفية الحالية وتملأ النموذج بها. +2. عدّل أي حقل قياسي: العنوان، المؤلف، الموضوع، الكلمات المفتاحية، المنشئ، المنتِج. +3. اضبط تاريخ الإنشاء وتاريخ التعديل باستخدام منتقيات التاريخ والوقت. +4. أضف حقول بيانات وصفية مخصصة بالنقر على زر الإضافة وإدخال زوج مفتاح وقيمة. +5. انقر زر المعالجة لحفظ PDF المعدّل. + +## الميزات + +- يملأ مسبقًا كل البيانات الوصفية الموجودة من ملف PDF المرفوع +- الحقول القياسية: العنوان، المؤلف، الموضوع، الكلمات المفتاحية، المنشئ، المنتِج +- منتقيات التاريخ والوقت لتاريخ الإنشاء وتاريخ التعديل +- حقول بيانات وصفية مخصصة بأزواج مفتاح وقيمة لخصائص اعتباطية +- يحفظ التغييرات مباشرة في قاموس معلومات المستند في PDF + +## الحقول القابلة للتعديل + +| الحقل | الوصف | +| --------------------- | ------------------------------------ | +| **العنوان** | عنوان المستند المعروض في قارئات PDF | +| **المؤلف** | الشخص أو الجهة التي أنشأت المستند | +| **الموضوع** | وصف موجز لموضوع المستند | +| **الكلمات المفتاحية** | مصطلحات مفصولة بفواصل للبحث والتصنيف | +| **المنشئ** | التطبيق الذي أنشأ المحتوى في الأصل | +| **المنتِج** | التطبيق الذي ولّد ملف PDF | +| **تاريخ الإنشاء** | متى أُنشئ المستند أصلًا | +| **تاريخ التعديل** | متى عُدّل المستند آخر مرة | +| **الحقول المخصصة** | أي أزواج مفتاح وقيمة إضافية تحددها | + +## حالات الاستخدام + +- تعيين عنوان ومؤلف مناسبين قبل نشر مستند +- إضافة كلمات مفتاحية لتحسين قابلية البحث في أنظمة إدارة المستندات +- تحديث تاريخ التعديل ليعكس المراجعة الحالية +- إضافة حقول بيانات وصفية مخصصة مثل القسم أو معرّف المشروع أو التصنيف +- تنظيف البيانات الوصفية التي تركها برنامج التأليف الأصلي + +## نصائح + +- تُكتب الحقول المخصصة مباشرة في قاموس معلومات PDF. قد لا تعرض بعض قارئات PDF الحقول المخصصة، لكنها تبقى محفوظة في الملف. +- اترك حقلًا فارغًا لمسحه من البيانات الوصفية. يحفظ زر المعالجة ما هو موجود في النموذج. +- لعرض البيانات الوصفية دون تعديل، استخدم [عرض البيانات الوصفية](./view-metadata). ولإزالة كل البيانات الوصفية، استخدم إزالة البيانات الوصفية. + +## أدوات ذات صلة + +- [عرض البيانات الوصفية](./view-metadata) +- [طبقات PDF OCG](./pdf-layers) +- [ضغط PDF](./compress-pdf) diff --git a/docs/ar/tools/edit-pdf.md b/docs/ar/tools/edit-pdf.md new file mode 100644 index 00000000..f6ab21e7 --- /dev/null +++ b/docs/ar/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: محرر PDF +description: علّق على ملفات PDF وميّزها واحجب منها وأضف أشكالًا وصورًا وابحث فيها واعرضها مباشرة في متصفحك. +--- + +# محرر PDF + +يتيح لك محرر PDF في BentoPDF التعليق على ملفات PDF وتمييزها وحجب محتواها وإضافة ملاحظات وأشكال وصور والبحث فيها. يحمّل محررًا متكامل الميزات مباشرة في متصفحك دون الحاجة إلى رفع أي ملفات إلى خادم. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإسقاط أو بسحب ملف إليها. +2. يفتح محرر PDF المضمن تلقائيًا ومستندك محمّل فيه. +3. استخدم شريط الأدوات للتعليق أو التمييز أو الحجب أو إضافة نص أو رسم أشكال أو إدراج صور. +4. انقر **تنزيل PDF المعدّل** لحفظ تغييراتك. + +## الميزات + +- شريط أدوات تعليق كامل مع التمييز والتسطير والشطب والرسم الحر +- إدراج النصوص والتعليقات +- أدوات حجب تزيل المحتوى المعلَّم نهائيًا بعد تطبيق الحجب. إذا كانت هناك علامات لم تُطبَّق عند النقر على **تنزيل PDF المعدّل**، يعرض المحرر تطبيقها أولًا. +- أدوات أشكال للمستطيلات والدوائر والخطوط والأسهم +- إدراج الصور على صفحات PDF +- بحث نصي مدمج في المستند +- دعم مستندات متعددة بعلامات تبويب (حتى 10 مستندات مفتوحة في وقت واحد) +- تحميل الملفات بالسحب والإفلات + +## حالات الاستخدام + +- مراجعة العقود ووضع علامات على التغييرات بالتمييز والتعليقات +- حجب المعلومات السرية مثل أرقام الضمان الاجتماعي أو البيانات المالية قبل المشاركة +- إضافة تعليقات على المخططات المعمارية أو الرسومات الهندسية +- إدراج شعارات الشركات أو الأختام على صفحات المستند +- البحث في مستندات قانونية طويلة عن مصطلحات محددة + +## نصائح + +- يمكنك فتح عدة ملفات PDF في وقت واحد والتبديل بينها باستخدام شريط علامات التبويب أعلى المحرر. +- يحافظ المحرر على بنية PDF الأصلية، فتبقى الخطوط والتخطيطات وحقول النماذج سليمة. +- تعليم نص أو منطقة للحجب لا يزيل أي شيء حتى يُطبَّق الحجب. وعند حجب نص محدد، تُزال أيضًا نسخه الموجودة في خصائص الملف والإشارات المرجعية والتعليقات والمرفقات من الملف المنزَّل، ما لم يكن الملف مشفرًا. +- للعلامات المائية أو ترقيم الصفحات بالجملة، استخدم الأدوات المخصصة لهما للحصول على تحكم أكبر في التنسيق. + +## أدوات ذات صلة + +- [إضافة علامة مائية](./add-watermark) +- [توقيع PDF](./sign-pdf) +- [إضافة أختام](./add-stamps) +- [إزالة التعليقات](./remove-annotations) diff --git a/docs/ar/tools/email-to-pdf.md b/docs/ar/tools/email-to-pdf.md new file mode 100644 index 00000000..dac2ab51 --- /dev/null +++ b/docs/ar/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: بريد إلكتروني إلى PDF +description: حوّل ملفات البريد الإلكتروني EML وMSG إلى PDF في متصفحك. يحافظ على الرؤوس والمحتوى وقائمة المرفقات. +--- + +# بريد إلكتروني إلى PDF + +حوّل ملفات البريد الإلكتروني المحفوظة إلى ملفات PDF نظيفة وقابلة للطباعة. تحلل الأداة ملفات EML وMSG وتستخرج الرسالة كاملة، من رؤوس ومحتوى وبيانات وصفية للمرفقات، وتعرض كل شيء في ملف PDF منظم. مفيدة للكشف القانوني وحفظ السجلات أو لمجرد طباعة بريد مهم. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----- | :------- | :----------------------------------------------------- | +| EML | `.eml` | صيغة بريد MIME القياسية (تُصدَّر من معظم برامج البريد) | +| MSG | `.msg` | صيغة Microsoft Outlook الخاصة | + +## طريقة العمل + +1. انقر منطقة الرفع أو اسحب ملفات EML أو MSG وأفلتها. يمكنك خلط الصيغتين في دفعة واحدة. +2. راجع قائمة الملفات. أزل أي عناصر غير مرغوبة بأيقونة سلة المهملات، أو انقر **إضافة المزيد من الملفات** لتضمين رسائل أخرى. +3. اضبط خيارات التحويل (انظر أدناه). +4. انقر **تحويل إلى PDF**. تحلل الأداة كل رسالة وتعرض المحتوى كـ HTML منسّق وتحوّله إلى PDF عبر محرك PyMuPDF. +5. تُنزَّل الرسالة الواحدة مباشرة بصيغة PDF. وتُجمَّع الرسائل المتعددة في `emails-converted.zip`. + +## الخيارات + +| الخيار | الافتراضي | الوصف | +| :---------------------------------- | :-------- | :------------------------------------------------------------------------------ | +| **حجم الصفحة** | A4 | اختر بين أبعاد A4 أو Letter أو Legal. | +| **تضمين النسخة الكربونية والمخفية** | مفعّل | عند التفعيل، تظهر قوائم مستلمي CC وBCC في قسم رأس الرسالة في PDF. | +| **تضمين قائمة المرفقات** | مفعّل | عند التفعيل، تظهر في PDF قائمة بالملفات المرفقة بالرسالة (مع أسمائها وأحجامها). | + +## حالات الاستخدام + +- أرشفة المراسلات التجارية المهمة بصيغة PDF للامتثال أو التدقيق +- طباعة سلاسل الرسائل للإجراءات القانونية أو طلبات الكشف +- إنشاء سجل دائم لتأكيدات الطلبات أو الإيصالات أو العقود الواردة بالبريد +- نسخ ملفات Outlook MSG احتياطيًا بصيغة لا تتطلب Outlook لقراءتها +- توثيق تفاعلات دعم العملاء من ملفات EML المصدّرة + +## نصائح + +- كلٌّ من EML (المستخدمة في Thunderbird وApple Mail ومعظم برامج البريد) وملفات Outlook MSG مدعومة. صدّر الرسائل من برنامج بريدك وأفلتها مباشرة في الأداة. +- تحتفظ رسائل البريد المنسقة بـ HTML بتنسيقها في PDF. أما الرسائل النصية العادية فتُعرض بتنسيق نظيف ومقروء. +- تعرض قائمة المرفقات الأسماء والأحجام لكنها لا تضمّن ملفات المرفقات الفعلية في PDF. + +## أدوات ذات صلة + +- [XML إلى PDF](./xml-to-pdf) +- [XPS إلى PDF](./xps-to-pdf) diff --git a/docs/ar/tools/epub-to-pdf.md b/docs/ar/tools/epub-to-pdf.md new file mode 100644 index 00000000..5276ac0b --- /dev/null +++ b/docs/ar/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB إلى PDF +description: حوّل الكتب الإلكترونية EPUB إلى PDF في متصفحك. مجاني وبدون رفع ملفات وبخصوصية أولًا. +--- + +# EPUB إلى PDF + +حوّل الكتب الإلكترونية EPUB إلى ملفات PDF دون مغادرة متصفحك. EPUB هو المعيار المفتوح للكتب الرقمية، لكنك تحتاج أحيانًا إلى PDF بتخطيط ثابت للطباعة أو التعليق أو المشاركة مع من لا يملكون قارئ كتب إلكترونية. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----- | :------- | :------------------- | +| EPUB | `.epub` | ملفات EPUB 2 وEPUB 3 | + +## طريقة العمل + +1. انقر منطقة الرفع أو اسحب ملفات EPUB وأفلتها. التحديد المتعدد مدعوم. +2. راجع الملفات المرفوعة. أزل أي عناصر غير مرغوبة بأيقونة سلة المهملات، أو انقر **إضافة المزيد من الملفات** لتوسيع الدفعة. +3. انقر **تحويل إلى PDF**. يعرض محرك PyMuPDF محتوى EPUB، من نص وصور وتنسيق، في ناتج PDF مقسّم إلى صفحات. +4. يُنزَّل ملف EPUB الواحد مباشرة بصيغة PDF. وتُجمَّع الملفات المتعددة في أرشيف ZIP باسم `epub-converted.zip`. + +## الخيارات + +يعمل التحويل بإعدادات افتراضية معقولة ودون الحاجة إلى أي ضبط. ينساب النص في أبعاد صفحات قياسية، وتنتقل الخطوط والصور المضمنة إلى PDF. + +## حالات الاستخدام + +- طباعة كتاب إلكتروني خالٍ من DRM للقراءة بعيدًا عن الشاشات +- تقديم مخطوطة EPUB بصيغة PDF بتخطيط ثابت للمراجعة +- أرشفة الكتب الرقمية بصيغة يفتحها كل نظام تشغيل أصلًا +- مشاركة فصل مع زميل لا يملك قارئ EPUB +- تحويل الوثائق التقنية الموزعة بصيغة EPUB إلى ملفات PDF قابلة للتعليق + +## نصائح + +- ميزات EPUB 3 مثل الصوت والفيديو المضمنين لن تنتقل إلى PDF، لكن كل النصوص والصور والجداول تُحوَّل بسلاسة. +- للحصول على أفضل النتائج مع ملفات EPUB كثيرة التنسيق، افحص الصفحات الأولى من الناتج للتأكد من دقة التخطيط. + +## أدوات ذات صلة + +- [MOBI إلى PDF](./mobi-to-pdf) +- [FB2 إلى PDF](./fb2-to-pdf) +- [CBZ إلى PDF](./cbz-to-pdf) diff --git a/docs/ar/tools/excel-to-pdf.md b/docs/ar/tools/excel-to-pdf.md new file mode 100644 index 00000000..06b3538e --- /dev/null +++ b/docs/ar/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel إلى PDF +description: حوّل جداول Excel (XLS وXLSX) وملفات ODS وCSV إلى PDF مع الحفاظ على التنسيق. +--- + +# Excel إلى PDF + +حوّل ملفات جداول البيانات إلى PDF. تتعامل الأداة مع ملفات Excel الحديثة وصيغة XLS القديمة وجداول OpenDocument وحتى CSV، وكلها تُعرض عبر محرك LibreOffice داخل المتصفح الذي يحافظ على تنسيق الخلايا والصيغ (كقيم محسوبة) والمخططات وتخطيطات الأوراق المتعددة. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----------------------- | :--------- | +| Excel (حديثة) | `.xlsx` | +| Excel (قديمة) | `.xls` | +| OpenDocument Spreadsheet | `.ods` | +| CSV | `.csv` | + +## طريقة العمل + +1. انقر منطقة الرفع أو اسحب ملفات جداول البيانات وأفلتها. +2. راجع قائمة الملفات. أضف المزيد أو أزل ما لا تريده. +3. انقر **تحويل إلى PDF**. يبدأ محرك LibreOffice عند أول استخدام، ثم يعالج كل ملف. +4. يُنزَّل الملف الواحد مباشرة بصيغة PDF. وتُسلَّم الملفات المتعددة باسم `excel-converted.zip`. + +## الخيارات + +لا تحتاج هذه الأداة إلى أي إعداد إضافي. يحدد محرك LibreOffice تخطيط الصفحة والتحجيم ومنطقة الطباعة بناءً على الإعدادات المضمنة في جدول البيانات. + +## الناتج + +| عدد المدخلات | الناتج | +| :------------ | :------------------------------------------------------ | +| ملف واحد | تنزيل ملف PDF واحد (اسم الملف الأصلي بامتداد `.pdf`) | +| ملفان أو أكثر | أرشيف ZIP (`excel-converted.zip`) يحتوي ملف PDF لكل ملف | + +## حالات الاستخدام + +- تحويل التقارير المالية أو الميزانيات من Excel إلى PDF للتوزيع +- إنشاء ملفات PDF جاهزة للطباعة من جداول المخزون أو كتالوجات المنتجات +- مشاركة نتائج تحليل البيانات مع أصحاب المصلحة الذين لا يملكون Excel +- أرشفة التقارير ربع السنوية بصيغة غير قابلة للتعديل +- تحويل ملفات ODS من LibreOffice Calc إلى PDF + +## نصائح + +- تُعرض المخططات المضمنة في جدول البيانات في PDF. تأكد من أنها تبدو صحيحة في الملف المصدر قبل التحويل. +- إذا كان جدول بياناتك يحتوي أوراقًا متعددة، تُضمَّن كل الأوراق في ناتج PDF. +- لبيانات CSV البسيطة دون تنسيق، توفر أداة [CSV إلى PDF](./csv-to-pdf) تحويلًا أخف. استخدم Excel إلى PDF عندما تحتاج إلى الحفاظ على التنسيق أو المخططات أو الأوراق المتعددة. + +## أدوات ذات صلة + +- [CSV إلى PDF](./csv-to-pdf) +- [Word إلى PDF](./word-to-pdf) +- [PowerPoint إلى PDF](./powerpoint-to-pdf) diff --git a/docs/ar/tools/extract-attachments.md b/docs/ar/tools/extract-attachments.md new file mode 100644 index 00000000..81cdb9b8 --- /dev/null +++ b/docs/ar/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: استخراج المرفقات +description: استخرج كل الملفات المرفقة المضمنة من ملف PDF واحد أو أكثر ونزّلها كأرشيف ZIP. +--- + +# استخراج المرفقات + +استخرج كل مرفق مضمن من ملف PDF واحد أو أكثر. تُجمَّع كل الملفات المستخرجة في أرشيف ZIP واحد للتنزيل. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر يحتوي على مرفقات مضمنة. +2. انقر **استخراج المرفقات**. +3. تفحص الأداة كل ملف PDF بحثًا عن المرفقات على مستوى المستند وعلى مستوى الصفحة. +4. تُجمَّع كل الملفات التي عُثر عليها في أرشيف ZIP وتُنزَّل تلقائيًا. +5. تؤكد رسالة حالة عدد المرفقات التي عُثر عليها وحجمها الإجمالي. + +## الميزات + +- استخراج دفعي من عدة ملفات PDF في وقت واحد +- يستخرج المرفقات على مستوى المستند وعلى مستوى الصفحة +- ينتج ملف ZIP واحدًا يحتوي كل الملفات المستخرجة +- يعرض العدد الإجمالي للمرفقات والحجم المجمّع للملفات +- رسائل حالة واضحة إذا لم يُعثر على مرفقات + +## حالات الاستخدام + +- استعادة ملفات البيانات المضمنة في تقرير PDF +- سحب أصول الصور من ملف أعمال أو مستند مواصفات +- استخراج المواد التكميلية من ملفات PDF الخاصة بالتدريب أو الامتثال +- تدقيق الملفات المضمنة داخل دفعة من ملفات PDF + +## نصائح + +- إذا أبلغت الأداة بعدم وجود مرفقات، فقد يحتوي PDF على صور مضمنة أو بيانات نماذج بدلًا من ذلك، وهذه ليست ملفات مرفقة. استخدم [استخراج الصور](./extract-images) للصور المضمنة. +- عند معالجة عدة ملفات PDF، تنتهي مرفقات كل الملفات في ملف ZIP واحد. وتُحفظ أسماء الملفات كما كانت عند تضمينها الأصلي. + +## أدوات ذات صلة + +- [إضافة مرفقات](./add-attachments) +- [تعديل المرفقات](./edit-attachments) +- [استخراج الصور](./extract-images) diff --git a/docs/ar/tools/extract-images.md b/docs/ar/tools/extract-images.md new file mode 100644 index 00000000..d8470832 --- /dev/null +++ b/docs/ar/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: استخراج الصور +description: استخرج كل الصور المضمنة من ملفات PDF. عاينها في شبكة ونزّلها فرديًا أو كأرشيف ZIP. +--- + +# استخراج الصور + +يسحب كل صورة مضمنة من ملف PDF واحد أو أكثر. تُعرض الصور المستخرجة في شبكة معاينة حيث يمكنك تنزيلها فرديًا أو الحصول على كل شيء دفعة واحدة كملف ZIP. يعمل بواسطة PyMuPDF. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإسقاط أو بسحب الملفات إليها. أضف المزيد من الملفات أو أزل ملفات فردية حسب الحاجة. +2. انقر **استخراج** لبدء المعالجة. +3. تفحص الأداة كل صفحة في كل ملف PDF مرفوع وتجد الصور المضمنة وتستخرجها. +4. تظهر الصور المستخرجة في شبكة بصور مصغرة. لكل صورة زر تنزيل. +5. انقر **تنزيل الكل** لحفظ كل شيء كأرشيف ZIP. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُستخرج كل الصور المضمنة بصيغتها الأصلية (عادةً PNG أو JPEG أو أي صيغة استُخدمت عند تضمين الصورة في PDF). + +## صيغة الناتج + +- تُعرض الصور في شبكة المعاينة بأسماء مثل `image_1.png` و`image_2.jpg` وهكذا. +- ينتج **تنزيل الكل** ملف `extracted-images.zip` يحتوي كل الصور. +- يمكن تنزيل الصور فرديًا واحدة تلو الأخرى من الشبكة. + +## حالات الاستخدام + +- استعادة الصور أو الرسومات من PDF لإعادة استخدامها في مشروع آخر. +- استخراج صور المنتجات من كتالوج PDF لعرضها في قائمة تجارة إلكترونية. +- سحب المخططات من الوثائق التقنية لاستخدامها في العروض التقديمية. +- تدقيق الصور المضمنة في مستند قبل مشاركته. + +## نصائح + +- تستخرج الأداة الصور تمامًا كما هي مخزنة في PDF. ولا تعيد عرض الصفحات كصور، ولهذا استخدم [PDF إلى PNG](./pdf-to-png) أو [PDF إلى JPG](./pdf-to-jpg). +- إذا أبلغت الأداة "لم يتم العثور على صور"، فقد يستخدم PDF رسومات متجهية بدلًا من صور نقطية مضمنة، أو قد يكون مستندًا ممسوحًا ضوئيًا تمثل فيه الصفحة كلها صورة واحدة كبيرة. +- تعمل المعالجة الدفعية عبر عدة ملفات PDF. وتُجمع كل الصور من كل الملفات في شبكة واحدة وملف ZIP واحد. + +## أدوات ذات صلة + +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى JPG](./pdf-to-jpg) +- [منشئ سير عمل PDF](./pdf-workflow) diff --git a/docs/ar/tools/extract-pages.md b/docs/ar/tools/extract-pages.md new file mode 100644 index 00000000..47d91f91 --- /dev/null +++ b/docs/ar/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: استخراج الصفحات +description: احفظ نطاقًا محددًا من صفحات PDF كمستند جديد. +--- + +# استخراج الصفحات + +اسحب مجموعة من الصفحات من PDF واحفظها كملف جديد. حدّد الصفحات التي تريدها بدقة باستخدام صيغة النطاقات، وتنشئ الأداة ملف PDF نظيفًا يحتوي تلك الصفحات فقط. + +## طريقة العمل + +1. ارفع ملف PDF. تعرض الأداة اسم الملف وحجمه وإجمالي عدد الصفحات. +2. أدخل الصفحات التي تريد استخراجها بصيغة النطاقات (مثل `1-5` أو `3, 7, 10-12`). +3. يمكنك اختيار تنزيل كل نطاق كملف PDF منفصل داخل أرشيف ZIP. +4. انقر زر المعالجة. تُنزَّل الصفحات المستخرجة كملف PDF جديد (أو ZIP). + +## الميزات + +- صيغة مرنة لنطاقات الصفحات: صفحات فردية أو نطاقات أو توليفات مفصولة بفواصل +- يعرض إجمالي عدد الصفحات بعد الرفع للرجوع إليه بسهولة +- خيار الإخراج كملف PDF واحد مدمج أو ملفات منفصلة في ZIP +- يحافظ على محتوى الصفحات الأصلي وتنسيقها + +## حالات الاستخدام + +- سحب الملخص التنفيذي (الصفحات الأولى) من تقرير طويل +- استخراج فصل واحد من PDF كتاب دراسي +- حفظ صفحات محددة من حزمة نماذج كمستندات مستقلة +- إنشاء مستند عيّنة من صفحات مختارة من ملف أكبر + +## نصائح + +- تبدأ ترقيم الصفحات من 1. استخدم `1` للصفحة الأولى، لا `0`. +- لإزالة الصفحات بدلًا من استخراجها، استخدم [حذف الصفحات](./delete-pages)، فهي العملية المعاكسة. +- إذا كنت تحتاج إلى تحديد مرئي للصفحات بالصور المصغرة، فاستخدم [تقسيم PDF](./split-pdf) بوضع التحديد المرئي. + +## أدوات ذات صلة + +- [تقسيم PDF](./split-pdf) +- [حذف الصفحات](./delete-pages) +- [دمج PDF](./merge-pdf) diff --git a/docs/ar/tools/extract-tables.md b/docs/ar/tools/extract-tables.md new file mode 100644 index 00000000..ba784d32 --- /dev/null +++ b/docs/ar/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: استخراج الجداول +description: اكشف الجداول في مستندات PDF واستخرجها. صدّرها بصيغة CSV أو JSON أو Markdown مع دقة لكل جدول على حدة. +--- + +# استخراج الجداول + +يكشف كل الجداول في ملف PDF ويتيح لك تصديرها بالصيغة التي تختارها: CSV أو JSON أو Markdown. يُستخرج كل جدول على حدة مع بيانات وصفية عن الصفحة والموضع. يعمل بمحرك كشف الجداول في PyMuPDF. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإسقاط أو بسحب ملف إليها. +2. اختر **صيغة التصدير** المفضلة: CSV أو JSON أو Markdown. +3. انقر **استخراج** لبدء المعالجة. +4. إذا عُثر على جدول واحد، يُنزَّل كملف واحد. أما الجداول المتعددة فتنتج أرشيف ZIP بملف لكل جدول. + +## الخيارات + +- **صيغة التصدير**: اختر بين: + - **CSV**: قيم مفصولة بفواصل مع اقتباس صحيح للحقول التي تحتوي فواصل أو علامات اقتباس أو أسطرًا جديدة. مناسبة لجداول البيانات وقواعد البيانات. + - **JSON**: بنية مصفوفة من المصفوفات، منسّقة بمسافتين بادئتين. مناسبة للاستهلاك البرمجي. + - **Markdown**: صيغة جدول مفصولة بخطوط عمودية يعرضها PyMuPDF. مناسبة للوثائق وملفات README. + +## صيغة الناتج + +- **جدول واحد**: `filename_table.csv` (أو `.json` / `.md`) +- **جداول متعددة**: `filename_tables.zip` يحتوي ملفات بأسماء مثل `table_1_page3.csv` و`table_2_page5.csv` وهكذا. + +## حالات الاستخدام + +- استخراج جداول محددة من تقارير PDF الطويلة دون سحب بيانات المستند كاملًا. +- الحصول على الجداول بصيغة Markdown للصقها مباشرة في مسائل GitHub أو الويكي أو الوثائق. +- سحب بيانات JSON منظمة من جداول PDF لتكاملات API أو السكربتات. +- مقارنة الجداول بين نسخ PDF مختلفة بتصدير كليهما إلى CSV ومقارنة الفروق. + +## نصائح + +- تمنحك هذه الأداة تحكمًا لكل جدول. إذا أردت فقط تفريغ كل الجداول في ملف CSV واحد، استخدم [PDF إلى CSV](./pdf-to-csv). ولمصنف Excel كامل، استخدم [PDF إلى Excel](./pdf-to-excel). +- قد تُكتشف الجداول الممتدة على عدة صفحات كجداول منفصلة لكل صفحة. وقد تحتاج إلى دمجها يدويًا. +- إذا لم تُكتشف أي جداول، فقد يكون PDF صورة ممسوحة ضوئيًا. مرّره على التعرف الضوئي أولًا لإضافة طبقة نصية. + +## أدوات ذات صلة + +- [PDF إلى CSV](./pdf-to-csv) +- [PDF إلى Excel](./pdf-to-excel) +- [PDF إلى نص](./pdf-to-text) diff --git a/docs/ar/tools/fb2-to-pdf.md b/docs/ar/tools/fb2-to-pdf.md new file mode 100644 index 00000000..c650f363 --- /dev/null +++ b/docs/ar/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 إلى PDF +description: حوّل ملفات الكتب الإلكترونية FictionBook (FB2) إلى PDF في متصفحك. مجاني وخاص ودون رفع إلى خادم. +--- + +# FB2 إلى PDF + +حوّل ملفات FictionBook 2 (FB2) إلى مستندات PDF. FB2 صيغة كتب إلكترونية مبنية على XML، وهي شائعة في روسيا وأوروبا الشرقية. ورغم أنها مدعومة جيدًا على بعض المنصات، فهي شبه مجهولة على غيرها، والتحويل إلى PDF يجعل كتبك قابلة للقراءة في كل مكان. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :------------ | :------- | :------------------------------- | +| FictionBook 2 | `.fb2` | صيغة كتب إلكترونية مبنية على XML | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات FB2 وأفلتها. يمكنك تحديد عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات. استخدم أيقونة سلة المهملات لإزالة ملف بعينه، أو **إضافة المزيد من الملفات** لإضافة غيرها. +3. انقر على **تحويل إلى PDF**. يحلّل محرك PyMuPDF بنية XML الخاصة بـ FB2 ويعرضها كمحتوى PDF مقسّم إلى صفحات. +4. يُنزَّل ملف واحد كـ PDF مباشرة. أما التحويلات المتعددة فتُجمَّع في `fb2-converted.zip`. + +## الخيارات + +لا حاجة إلى أي إعدادات. يتعامل المحوّل مع بنية FB2 XML تلقائيًا، ويحافظ على فواصل الفصول والتنسيق وأي صور مضمّنة. + +## حالات الاستخدام + +- قراءة كتب FB2 على أجهزة أو تطبيقات تدعم PDF فقط +- طباعة الأدب الروسي الموزّع بصيغة FB2 +- أرشفة مكتبة FB2 في صيغة مدعومة عالميًا +- مشاركة كتاب مع شخص لا يدعم قارئه FictionBook + +## نصائح + +- ملفات FB2 هي XML نصي عادي، لذا تميل إلى أن تكون صغيرة وتتحول بسرعة حتى داخل المتصفح. +- إذا كانت ملفات FB2 مضغوطة بصيغة `.fb2.zip`، فاستخرجها أولًا قبل رفعها. + +## أدوات ذات صلة + +- [EPUB إلى PDF](./epub-to-pdf) +- [MOBI إلى PDF](./mobi-to-pdf) +- [XML إلى PDF](./xml-to-pdf) diff --git a/docs/ar/tools/fix-page-size.md b/docs/ar/tools/fix-page-size.md new file mode 100644 index 00000000..86dc55ba --- /dev/null +++ b/docs/ar/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: توحيد حجم الصفحة +description: وحّد حجم جميع صفحات ملف PDF. اختر من أحجام الورق القياسية أو حدّد أبعادًا مخصصة. +--- + +# توحيد حجم الصفحة + +غالبًا ما تحتوي ملفات PDF المجمّعة من مصادر متعددة على صفحات بأحجام غير متطابقة: بعضها Letter وبعضها A4 وبعضها بحجم غير قياسي تمامًا. تفرض هذه الأداة حجمًا مستهدفًا واحدًا على كل الصفحات، مع تحجيم المحتوى ليلائم الصفحة أو يملأها حسب الحاجة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اختر **حجم الصفحة المستهدف** من القائمة المنسدلة (A4 أو Letter أو Legal أو A3 أو A5 أو Tabloid أو مخصص). +3. اختر **الاتجاه**: تلقائي يُبقي اتجاه كل صفحة الأصلي، أو يمكنك فرض عمودي أو أفقي. +4. اختر وضع **تحجيم المحتوى**: ملاءمة (يحافظ على كل المحتوى وقد يضيف هوامش) أو ملء (يملأ الصفحة وقد يقص الحواف). +5. يمكنك اختياريًا تعيين **لون الخلفية** للهوامش المضافة. +6. انقر على **توحيد حجم الصفحة**. + +## الخيارات + +- **الأحجام القياسية**: A4 وLetter وLegal وA3 وA5 وTabloid +- **أبعاد مخصصة**: أدخل العرض والارتفاع بالبوصة أو بالملليمتر +- **الاتجاه**: تلقائي أو عمودي أو أفقي +- **وضع التحجيم**: ملاءمة أو ملء (قص) +- **لون الخلفية**: أي لون لتعبئة الهوامش + +## حالات الاستخدام + +- توحيد ملف PDF مدموج جاءت صفحاته من ماسحات ضوئية مختلفة +- تحويل مستند بحجم US Letter إلى A4 للتوزيع الدولي +- تجهيز ملفات PDF للطباعة تتطلب حجم قص ثابتًا +- إصلاح الصفحات التي تنحرف قليلًا عن الحجم القياسي (مثل 8.49 × 11.02 بوصة بدلًا من 8.5 × 11) + +## نصائح + +- استخدم وضع الملاءمة لضمان عدم فقدان أي محتوى. وضع الملء يبدو أنظف لكنه قد يقص الحواف. +- افحص الناتج بأداة أبعاد الصفحة للتأكد من تطابق كل الصفحات مع الحجم المستهدف. +- الأبيض هو لون الخلفية الافتراضي، فبدّله إلى لون داكن إذا كان لمستندك هوامش داكنة. + +## أدوات ذات صلة + +- [أبعاد الصفحة](./page-dimensions): افحص أحجام الصفحات قبل التوحيد وبعده +- [ضغط PDF](./compress-pdf): قلّل حجم الملف بعد التوحيد +- [قص PDF](./crop-pdf): اقصص الصفحات يدويًا بدل التحجيم التلقائي diff --git a/docs/ar/tools/flatten-pdf.md b/docs/ar/tools/flatten-pdf.md new file mode 100644 index 00000000..0c568900 --- /dev/null +++ b/docs/ar/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: تسطيح PDF +description: سطّح النماذج التفاعلية والتعليقات التوضيحية إلى محتوى ثابت. يجعل حقول النماذج غير قابلة للتحرير ويدمج التعليقات في الصفحة. +--- + +# تسطيح PDF + +يدمج التسطيح العناصر التفاعلية (حقول النماذج والقوائم المنسدلة ومربعات الاختيار والتعليقات التوضيحية والتحديدات والملاحظات اللاصقة) مباشرة في محتوى الصفحة. يبقى المظهر المرئي كما هو، لكن لا شيء يصبح قابلًا للتحرير أو الاستخراج. إنه المكافئ في PDF لطباعة نموذج مملوء ثم مسحه ضوئيًا، إلا أن الجودة تبقى مثالية. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. +2. انقر على **تسطيح PDF**. +3. يُنزَّل الملف الواحد مباشرة. أما الملفات المتعددة فتنتج أرشيف ZIP. + +تستخدم الأداة pdf-lib لتسطيح حقول النماذج (عبر `form.flatten()`) ومسطِّحًا مخصصًا للتعليقات التوضيحية لدمجها في تدفق الصفحة. تتم العمليتان في تمريرة واحدة. + +## ما الذي يُسطَّح + +- **حقول النماذج**: حقول النص ومربعات الاختيار وأزرار الراديو والقوائم المنسدلة وحقول التوقيع +- **التعليقات التوضيحية**: التعليقات والتحديدات والشطب والتسطير والملاحظات اللاصقة والأختام وتعليقات الحبر +- **العناصر التفاعلية**: الأزرار ومشغّلات الإجراءات + +## ما الذي يبقى دون تغيير + +- محتوى النص (يظل قابلًا للتحديد والبحث) +- الصور والرسومات +- تخطيط الصفحة وأبعادها +- الإشارات المرجعية وجدول المحتويات +- الروابط التشعبية (ما لم تكن مبنية على تعليقات توضيحية) + +## حالات الاستخدام + +- قفل نموذج مكتمل حتى لا يتمكن المستلمون من تغيير الإجابات المقدَّمة +- تجهيز ملف PDF للأرشفة حيث لا حاجة إلى العناصر التفاعلية +- إصلاح مشكلات العرض الناتجة عن اختلاف ظهور التعليقات بين برامج العرض +- ضمان عدم إمكانية تعديل مستند موقَّع بعد تطبيق التوقيع +- تقليل حجم الملف بإزالة تعريفات حقول النماذج وكائنات التعليقات التوضيحية + +## نصائح + +- سطّح بعد اكتمال جميع التعديلات. لا توجد طريقة لعكس تسطيح ملف PDF. +- إذا كنت تريد التسطيح وإزالة البيانات الوصفية وJavaScript والمرفقات أيضًا، فاستخدم أداة تنظيف PDF بدلًا من ذلك، إذ تتضمن التسطيح كأحد خياراتها. +- قد تعرض بعض ملفات PDF رسالة "لم يتم العثور على نموذج". هذا طبيعي إذا كان المستند يحتوي على تعليقات توضيحية فقط دون حقول نماذج. + +## أدوات ذات صلة + +- [تنظيف PDF](./sanitize-pdf): سطّح النماذج وأزل البيانات الوصفية والبرامج النصية وغيرها +- [تحويل PDF إلى صور نقطية](./rasterize-pdf): حوّل إلى PDF مبني على الصور لأقصى درجات التسطيح +- [تحويل الخطوط إلى مخططات](./font-to-outline): سطّح الخطوط إلى مسارات متجهة +- [حماية PDF](./protect-pdf): اقفل ملف PDF المسطَّح بكلمة مرور diff --git a/docs/ar/tools/font-to-outline.md b/docs/ar/tools/font-to-outline.md new file mode 100644 index 00000000..67ce23c6 --- /dev/null +++ b/docs/ar/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: تحويل الخطوط إلى مخططات +description: حوّل جميع خطوط PDF إلى مخططات متجهة لعرض متسق على كل الأجهزة. يزيل مشكلات الاعتماد على الخطوط. +--- + +# تحويل الخطوط إلى مخططات + +يحوّل تحويل الخطوط إلى مخططات كل حرف نصي من رمز مبني على خط إلى مسار متجه. لا يعود ملف PDF معتمدًا على أي خطوط مثبّتة، فيُعرض بشكل متطابق على كل جهاز وكل نظام تشغيل وكل طابعة. وهذه خطوة قياسية في سير عمل ما قبل الطباعة. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. +2. انقر على **تحويل إلى مخططات**. +3. يحوّل Ghostscript كل النصوص إلى مسارات متجهة. +4. نزّل النتيجة. الملفات المتعددة تنتج أرشيف ZIP. + +لا توجد إعدادات لضبطها. تستخدم الأداة Ghostscript (WebAssembly) لتحويل كل مراجع الخطوط إلى مسارات مخططة في تمريرة واحدة. + +## ما الذي يتغير + +- تتحول الأحرف النصية إلى منحنيات متجهة (مسارات بيزييه) +- لم يعد تضمين الخطوط ضروريًا، فملف PDF مكتفٍ بذاته على مستوى الرموز +- قد يزداد حجم الملف لأن المسارات المتجهة تكون عادةً أكبر من مراجع الخطوط +- يُحفظ المظهر المرئي تمامًا + +## ما الذي تخسره + +- تحديد النص ونسخه ولصقه +- إمكانية البحث في النص (يتوقف Ctrl+F عن العمل) +- القدرة على تحرير محتوى النص +- إمكانية الوصول لقارئات الشاشة + +## حالات الاستخدام + +- إرسال ملفات PDF إلى مطبعة تشترط خطوطًا محوّلة إلى مخططات +- مشاركة مستندات تستخدم خطوطًا مخصصة أو مرخّصة مع أشخاص لا يملكون تلك الخطوط +- منع استبدال الخطوط الذي يغيّر مظهر مستندك على أنظمة أخرى +- تجهيز ملفات PDF لسير عمل النقش بالليزر أو القطع بـ CNC الذي يتطلب مدخلات متجهة +- ضمان عرض ملف PDF الكثيف بالشعارات بشكل صحيح على كل المنصات + +## نصائح + +- احتفظ بملف PDF الأصلي. التحويل إلى مخططات لا رجعة فيه، ولا يمكنك إعادة المسارات إلى نص قابل للتحرير. +- إذا كنت تحتاج أن يبقى النص قابلًا للبحث، ففكّر في استخدام أداة تحويل PDF إلى صور نقطية مع OCR كخطوة لاحقة. +- تميل ملفات PDF المحوّلة إلى مخططات إلى أن تكون أكبر. شغّل ضغط PDF بعد ذلك إذا كان حجم الملف مهمًا. + +## أدوات ذات صلة + +- [تسطيح PDF](./flatten-pdf): سطّح النماذج والتعليقات دون المساس بالخطوط +- [تحويل PDF إلى صور نقطية](./rasterize-pdf): حوّل إلى PDF مبني على الصور بدل المخططات المتجهة +- [ضغط PDF](./compress-pdf): قلّل حجم الملف بعد التحويل إلى مخططات +- [PDF إلى PDF/A](./pdf-to-pdfa): حوّل للأرشفة بعد ضمان الاستقلال عن الخطوط diff --git a/docs/ar/tools/form-creator.md b/docs/ar/tools/form-creator.md new file mode 100644 index 00000000..eb51db85 --- /dev/null +++ b/docs/ar/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: إنشاء نموذج PDF +description: أنشئ نماذج PDF قابلة للتعبئة بحقول نصية ومربعات اختيار وقوائم منسدلة وأزرار راديو وغيرها بالسحب والإفلات. +--- + +# إنشاء نموذج PDF + +صمّم نماذج PDF قابلة للتعبئة باحترافية من الصفر أو بإضافة حقول إلى ملف PDF موجود. يتيح لك المحرر المرئي سحب عناصر النموذج وإفلاتها (الحقول النصية ومربعات الاختيار والقوائم المنسدلة وأزرار الراديو وحقول التوقيع وغيرها) مباشرة على معاينات الصفحات. اضبط خصائص الحقول، وأعدّ قواعد الظهور المشروط، وصدّر نموذج PDF تفاعليًا بالكامل. + +## طريقة العمل + +1. ارفع ملف PDF موجودًا **أو** انقر على **إنشاء PDF فارغ** للبدء من الصفر. +2. عند إنشاء PDF فارغ، اختر حجم الصفحة (Letter أو A4 أو A5 أو Legal أو Tabloid أو A3 أو أبعاد مخصصة). +3. يفتح محرر النماذج بشريط أدوات لأنواع الحقول ومنطقة معاينة الصفحة. +4. اختر نوع الحقل من شريط الأدوات، ثم انقر على الصفحة لوضعه. +5. اسحب الحقول لتغيير مواضعها. استخدم مقابض تغيير الحجم لضبط الأبعاد. +6. انقر على حقل لفتح لوحة الخصائص حيث يمكنك تعيين اسم الحقل والقيمة الافتراضية وحجم الخط والمحاذاة وغير ذلك. +7. تنقّل بين الصفحات باستخدام عناصر التحكم في الصفحات. +8. انقر على **حفظ** لتنزيل ملف PDF القابل للتعبئة الجاهز. + +## الميزات + +- وضع الحقول بالسحب والإفلات مع مقابض مرئية لتغيير الحجم +- أنواع الحقول: إدخال نص، نص متعدد الأسطر، مربع اختيار، قائمة منسدلة، زر راديو، توقيع، تاريخ، رقم، وباركود +- لوحة خصائص لضبط اسم كل حقل وتسميته وقيمته الافتراضية وحجم خطه ولونه ومحاذاته والتحقق من صحته +- إجراءات الحقول وقواعد الظهور المشروط (إظهار الحقول أو إخفاؤها بناءً على قيم حقول أخرى) +- التنقل بين الصفحات في النماذج متعددة الصفحات +- استخراج الحقول الموجودة: يكتشف حقول النماذج في ملفات PDF المرفوعة ويستوردها تلقائيًا +- دعم ملفات PDF المرفوعة والصفحات الفارغة كلوحة للنموذج +- عدة أحجام صفحات جاهزة بالإضافة إلى أبعاد مخصصة +- توليد الباركود بواسطة bwip-js +- إدارة مجموعات أزرار الراديو + +## الخيارات + +**أحجام الصفحات الجاهزة (لملفات PDF الفارغة):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- مخصص (حدّد العرض والارتفاع) + +**خصائص الحقل (تختلف حسب نوع الحقل):** + +- الاسم والتسمية والنص التوضيحي +- القيمة الافتراضية +- نوع الخط وحجمه ولونه +- محاذاة النص (يسار أو وسط أو يمين) +- مفتاح الحقل الإلزامي +- مفتاح القراءة فقط +- الحد الأقصى للطول في الحقول النصية +- قائمة الخيارات للقوائم المنسدلة وأزرار الراديو +- إجراءات الظهور المشروط + +## حالات الاستخدام + +- بناء نماذج تعريف الموظفين الجدد بحقول نصية للمعلومات الشخصية ومربعات اختيار للإقرار بالسياسات +- إنشاء استبيانات استقبال العملاء بقوائم منسدلة لاختيار الخدمة +- تصميم نماذج الطلبات بحقول محسوبة ومعرّفات باركود +- بناء قوائم فحص بأزرار راديو لتقييمات النجاح والفشل +- إنشاء نماذج استطلاعات بأسئلة متابعة مشروطة تظهر بحسب الإجابات + +## نصائح + +- إذا رفعت ملف PDF موجودًا، فستحاول الأداة استخراج أي حقول نماذج موجودة فيه، مما يتيح لك تعديلها أو الإضافة إليها. +- استخدم ميزة مجموعة أزرار الراديو لإنشاء اختيارات متنافية. الحقول في مجموعة الراديو نفسها تتشارك اسم المجموعة. +- اختبر نموذجك بتنزيله وفتحه في [ملء نماذج PDF](./form-filler) للتحقق من سلوك الحقول. + +## أدوات ذات صلة + +- [ملء نماذج PDF](./form-filler) +- [توقيع PDF](./sign-pdf) +- [محرر PDF](./edit-pdf) diff --git a/docs/ar/tools/form-filler.md b/docs/ar/tools/form-filler.md new file mode 100644 index 00000000..c863ead2 --- /dev/null +++ b/docs/ar/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: ملء نماذج PDF +description: املأ نماذج PDF، بما فيها نماذج XFA، مباشرة في متصفحك باستخدام عارض مضمّن. +--- + +# ملء نماذج PDF + +افتح ملف PDF يحتوي على حقول نماذج واملأه مباشرة في عارض مضمّن. تدعم الأداة حقول AcroForm القياسية ونماذج XFA (XML Forms Architecture) القديمة. بعد إكمال النموذج، نزّل النسخة المملوءة بنقرة واحدة. + +## طريقة العمل + +1. ارفع ملف PDF يحتوي على حقول نماذج. +2. يُفتح المستند في عارض PDF متكامل يعرض حقول النماذج كمدخلات تفاعلية. +3. انقر على الحقول النصية ومربعات الاختيار والقوائم المنسدلة وأزرار الراديو لملئها. +4. انقر على **حفظ وتنزيل النموذج المملوء** للحصول على ملف PDF المكتمل. + +## الميزات + +- عارض PDF.js مضمّن مع تفاعل كامل مع حقول النماذج +- دعم حقول AcroForm القياسية (حقول النص ومربعات الاختيار والقوائم المنسدلة وأزرار الراديو) +- دعم نماذج XFA للنماذج القديمة المبنية على XML +- ضبط حجم العارض تلقائيًا بحسب أبعاد الصفحة +- عرض الملف مع معلومات الاسم والحجم + +## الخيارات + +لا توجد خيارات إعداد إضافية. ارفع النموذج واملأه ثم نزّله. + +## حالات الاستخدام + +- إكمال النماذج الضريبية وطلبات التأمين والأوراق الحكومية +- ملء نماذج طلبات التوظيف المستلمة كمرفقات PDF +- إكمال نماذج تسجيل الموردين أو استبيانات الموردين +- المصادقة على قوائم الامتثال بحقول مربعات الاختيار +- ملء نماذج الاستقبال الطبية قبل الموعد + +## نصائح + +- نماذج XFA صيغة قديمة لا تدعمها إلا بعض عارضات PDF. إذا فتحت ملف XFA PDF في Chrome أو معظم الأدوات الأخرى ورأيت صفحات فارغة، فهذا يعني أن تلك العارضات لا تدعم XFA. يتعامل ملء نماذج PDF في BentoPDF وFirefox مع XFA بشكل صحيح. +- لملفات PDF التي لا تحتوي على حقول نماذج، استخدم أداة [إنشاء نموذج PDF](./form-creator) لإضافة الحقول أولًا، ثم املأها هنا. +- يضبط العارض حجمه تلقائيًا ليطابق أبعاد صفحة PDF. + +## أدوات ذات صلة + +- [إنشاء نموذج PDF](./form-creator) +- [توقيع PDF](./sign-pdf) +- [محرر PDF](./edit-pdf) diff --git a/docs/ar/tools/header-footer.md b/docs/ar/tools/header-footer.md new file mode 100644 index 00000000..071f0531 --- /dev/null +++ b/docs/ar/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: رأس وتذييل +description: أضف نصوص رأس وتذييل قابلة للتخصيص إلى صفحات PDF مع متغيرات ديناميكية لأرقام الصفحات. +--- + +# رأس وتذييل + +أضف نصًا في ست مواضع على صفحات PDF: يسار الرأس ووسط الرأس ويمين الرأس ويسار التذييل ووسط التذييل ويمين التذييل. تدعم الأداة متغيرات ديناميكية لأرقام الصفحات وإجمالي عدد الصفحات، فيمكنك إنشاء قوالب مثل "صفحة 3 من 10" تتحدث تلقائيًا لكل صفحة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. تظهر لوحة الخيارات مع عناصر التحكم في التنسيق وستة حقول إدخال نصية. +3. أدخل النص المطلوب في أي من مواضع الرأس والتذييل. +4. استخدم العنصرين النائبين `{page}` و`{total}` لترقيم الصفحات ديناميكيًا. +5. اضبط حجم الخط ولونه، ويمكنك اختياريًا الاقتصار على نطاق صفحات محدد. +6. انقر على **إضافة رأس وتذييل** للمعالجة والتنزيل. + +## الخيارات + +- **نطاق الصفحات**: يمكنك اختياريًا تحديد الصفحات التي تحصل على رأس وتذييل. اتركه فارغًا للتطبيق على كل الصفحات. الصيغة: "1-3, 5" (نطاقات مفصولة بفواصل). +- **حجم الخط**: بين 6 و24 نقطة. القيمة الافتراضية 10. +- **لون الخط**: اختر أي لون بمنتقي الألوان. +- **يسار / وسط / يمين الرأس**: حقول نصية لأعلى كل صفحة. +- **يسار / وسط / يمين التذييل**: حقول نصية لأسفل كل صفحة. + +## الميزات + +- ست مواضع نصية مستقلة لكل صفحة +- المتغير الديناميكي `{page}` الذي يُدرج رقم الصفحة الحالية +- المتغير الديناميكي `{total}` الذي يُدرج إجمالي عدد الصفحات +- تصفية نطاق الصفحات لاستهداف صفحات محددة +- حجم خط ولون قابلان للتخصيص +- خط Helvetica لمخرجات نظيفة واحترافية + +## حالات الاستخدام + +- إضافة "صفحة {page} من {total}" إلى وسط تذييل تقرير +- وضع اسم الشركة في يسار الرأس وتاريخ المستند في يمين الرأس +- إضافة إشعارات السرية إلى تذييل المستندات القانونية +- ختم أرقام مراجعات المستند على نطاقات صفحات محددة + +## نصائح + +- اجمع `{page}` و`{total}` في حقل واحد لتحصل على صيغ مثل "صفحة {page} من {total}" أو "{page}/{total}". +- يمكنك ترك معظم الحقول فارغة وملء المواضع التي تحتاجها فقط. الحقول الفارغة تُتجاهل ببساطة. +- للرؤوس الأكثر تعقيدًا التي تحتوي على صور أو شعارات، فكّر في استخدام أداة [إضافة علامة مائية](./add-watermark) موضوعة أعلى الصفحة. + +## أدوات ذات صلة + +- [أرقام الصفحات](./page-numbers) +- [إضافة علامة مائية](./add-watermark) +- [ترقيم بيتس](./bates-numbering) diff --git a/docs/ar/tools/heic-to-pdf.md b/docs/ar/tools/heic-to-pdf.md new file mode 100644 index 00000000..cf42323d --- /dev/null +++ b/docs/ar/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC إلى PDF +description: حوّل صور HEIC وHEIF من أجهزة iPhone وiPad إلى صيغة PDF مباشرة في متصفحك. +--- + +# HEIC إلى PDF + +حوّل صور HEIC/HEIF إلى PDF. HEIC هي صيغة الصور الافتراضية على أجهزة iPhone وiPad منذ iOS 11. تتيح لك هذه الأداة تحويل تلك الصور إلى ملفات PDF دون تثبيت أي برنامج مكتبي ودون رفع الملفات إلى خادم. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :--------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات HEIC/HEIF وأفلتها. +2. راجع قائمة الملفات وأزل أي ملفات غير مرغوبة. +3. انقر على **تحويل إلى PDF**. تُنزَّل النتيجة باسم `from_heic.pdf`. + +يُفك ترميز كل ملف HEIC باستخدام مكتبة heic2any التي تحوّله إلى PNG بجودة 92%. ثم تُضمَّن صورة PNG في ملف PDF باستخدام pdf-lib، مع وضع كل صورة في صفحة مستقلة بدقتها الكاملة. + +## الخيارات + +لا تعرض هذه الأداة إعدادات إضافية. تُحوَّل صور HEIC بجودة عالية (0.92) إلى PNG قبل التضمين. + +## حالات الاستخدام + +- إنشاء ملف PDF من صور iPhone لإرفاقه بمطالبة تأمين أو تقرير +- تحويل صور HEIC لإعلان عقاري إلى مستند واحد قابل للطباعة +- تحويل لقطات شاشة iPad (بصيغة HEIF) إلى PDF قابل للمشاركة +- تحويل صور الإجازة دفعة واحدة لمفكرة سفر + +## نصائح + +- يتم فك ترميز HEIC بالكامل داخل المتصفح باستخدام WebAssembly. قد يستغرق التحويل الأول لحظة ريثما يُحمَّل المفكّك. +- إذا كنت تحتاج إلى مزج HEIC مع صيغ صور أخرى (JPG وPNG وغيرها)، فاستخدم أداة [صور إلى PDF](./image-to-pdf) التي تتعامل مع HEIC إلى جانب كل الصيغ الأخرى. +- غالبًا ما تحتوي ملفات HEIC من iPhone على بيانات EXIF بما فيها إحداثيات GPS. لا ينقل ملف PDF الناتج هذه البيانات الوصفية. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [JPG إلى PDF](./jpg-to-pdf) +- [PNG إلى PDF](./png-to-pdf) diff --git a/docs/ar/tools/image-to-pdf.md b/docs/ar/tools/image-to-pdf.md new file mode 100644 index 00000000..61396c3e --- /dev/null +++ b/docs/ar/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: صور إلى PDF +description: حوّل صيغ JPG وPNG وBMP وGIF وTIFF وSVG وHEIC وWebP وPSD وأكثر من 10 صيغ صور أخرى إلى ملف PDF واحد. +--- + +# صور إلى PDF + +المحوّل الشامل من الصور إلى PDF. ارفع صورًا بأي صيغة تقريبًا وادمجها في مستند PDF واحد. تحصل كل صورة على صفحتها الخاصة بحجم يطابق أبعادها الأصلية. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +هذا أوسع دعم للصيغ بين كل محوّلات الصور في BentoPDF. إذا كنت تحتاج صيغة محددة فقط، فاستخدم إحدى الأدوات المخصصة بدلًا من ذلك. + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات الصور وأفلتها. يمكنك تحديد عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات. أزل أي ملفات غير مرغوبة بأيقونة سلة المهملات، أو انقر على **إضافة المزيد من الملفات** لإضافة صور أخرى. +3. اختر مستوى **جودة PDF** من القائمة المنسدلة. +4. انقر على **تحويل إلى PDF**. تعالج الأداة الصور عبر محرك PyMuPDF وتنزّل النتيجة باسم `images_to_pdf.pdf`. + +## الخيارات + +تتحكم **جودة PDF** في ضغط الصور المطبَّق عند تضمينها في ملف PDF: + +- **جودة عالية**: ضغط أدنى وحجم ملف أكبر. الأفضل للطباعة أو الأرشفة. +- **جودة متوسطة** (الافتراضي): ضغط متوازن. مناسبة لمعظم الأغراض. +- **جودة منخفضة**: ضغط قوي وأصغر حجم ملف. مناسبة للبريد الإلكتروني أو المشاركة السريعة. + +تُحوَّل ملفات HEIC وWebP تلقائيًا إلى PNG قبل التضمين. يحدث ذلك بشفافية ولا يتطلب أي خطوات إضافية. + +## حالات الاستخدام + +- دمج إيصالات أو مستندات ممسوحة بكاميرا الهاتف في ملف PDF واحد +- إنشاء ملف أعمال أو كتيّب صور من صور بصيغ مختلطة +- تحويل صور iPhone (HEIC) إلى PDF قابل للمشاركة دون تثبيت برنامج مكتبي +- تجميع نماذج التصميم من ملفات PSD ولقطات الشاشة في مخرج جاهز للعميل +- أرشفة مجلد من صيغ الصور القديمة (PNM وJXR وJP2) كملف PDF واحد + +## نصائح + +- ترتيب الصور في ملف PDF يطابق ترتيبها في قائمة الملفات. ارفعها بالتسلسل الذي تريده. +- لأصغر حجم ممكن للملف، اختر الجودة المنخفضة. غالبًا ما يكون الفرق المرئي ضئيلًا في المسوحات الكثيفة بالنصوص. +- إذا كانت لديك صيغة صور واحدة فقط، فإن المحوّلات المخصصة (JPG إلى PDF وPNG إلى PDF وغيرها) تعطي النتيجة نفسها بواجهة أبسط. + +## أدوات ذات صلة + +- [JPG إلى PDF](./jpg-to-pdf) +- [PNG إلى PDF](./png-to-pdf) +- [HEIC إلى PDF](./heic-to-pdf) +- [WebP إلى PDF](./webp-to-pdf) diff --git a/docs/ar/tools/index.md b/docs/ar/tools/index.md new file mode 100644 index 00000000..2cc44cd0 --- /dev/null +++ b/docs/ar/tools/index.md @@ -0,0 +1,183 @@ +# مرجع الأدوات + +يقدّم BentoPDF **أكثر من 130 أداة** للعمل مع ملفات PDF. تعمل كل الأدوات بالكامل في متصفحك: ملفاتك لا تغادر جهازك أبدًا. + +--- + +## تحرير وتعليق + +عدّل مستندات PDF وعلّق عليها وحسّنها بمجموعة كاملة من أدوات التحرير. + +
+ +- [**محرر PDF**](./edit-pdf): علّق على ملفات PDF وحدّد النص واحجب المعلومات وأضف تعليقات وأشكالًا وصورًا وابحث واعرضها. +- [**تعديل الإشارات المرجعية**](./bookmark): أضف إشارات PDF المرجعية وعدّلها واستوردها واحذفها واستخرجها. +- [**جدول المحتويات**](./table-of-contents): أنشئ صفحة جدول محتويات من إشارات PDF المرجعية. +- [**أرقام الصفحات**](./page-numbers): أدرج أرقام الصفحات في مستندك. +- [**إضافة تسميات الصفحات**](./add-page-labels): طبّق تسميات صفحات PDF بأرقام رومانية وبادئات وبدايات مخصصة. +- [**ترقيم بيتس**](./bates-numbering): أضف أرقام بيتس التسلسلية عبر ملف PDF واحد أو أكثر. +- [**إضافة علامة مائية**](./add-watermark): ضع نصًا أو صورة فوق صفحات PDF. +- [**رأس وتذييل**](./header-footer): أضف نصًا إلى أعلى الصفحات وأسفلها. +- [**عكس الألوان**](./invert-colors): أنشئ نسخة بالوضع الداكن من ملف PDF. +- [**تأثير الماسح الضوئي**](./scanner-effect): اجعل ملف PDF يبدو كمستند ممسوح ضوئيًا. +- [**ضبط الألوان**](./adjust-colors): اضبط السطوع والتباين والتشبع وغيرها بدقة. +- [**لون الخلفية**](./background-color): غيّر لون خلفية ملف PDF. +- [**تغيير لون النص**](./text-color): غيّر لون النص في ملف PDF. +- [**توقيع PDF**](./sign-pdf): ارسم توقيعك أو اكتبه أو ارفعه. +- [**إضافة أختام**](./add-stamps): أضف أختام صور إلى ملف PDF باستخدام شريط أدوات التعليقات. +- [**إزالة التعليقات**](./remove-annotations): أزل التعليقات والتحديدات والروابط. +- [**قص PDF**](./crop-pdf): قصّ هوامش كل صفحة في ملف PDF. +- [**ملء نماذج PDF**](./form-filler): املأ النماذج مباشرة في المتصفح. يدعم أيضًا نماذج XFA. +- [**إنشاء نموذج PDF**](./form-creator): أنشئ نماذج PDF قابلة للتعبئة بحقول نصية بالسحب والإفلات. +- [**إزالة الصفحات الفارغة**](./remove-blank-pages): اكتشف الصفحات الفارغة واحذفها تلقائيًا. + +
+ +--- + +## التحويل إلى PDF + +حوّل الصور والمستندات والكتب الإلكترونية وصيغ الملفات الأخرى إلى PDF. + +
+ +- [**صور إلى PDF**](./image-to-pdf): حوّل JPG وPNG وBMP وGIF وTIFF وSVG وHEIC وWebP وغيرها إلى PDF. +- [**JPG إلى PDF**](./jpg-to-pdf): أنشئ ملف PDF من صورة JPG واحدة أو أكثر. +- [**PNG إلى PDF**](./png-to-pdf): أنشئ ملف PDF من صورة PNG واحدة أو أكثر. +- [**WebP إلى PDF**](./webp-to-pdf): أنشئ ملف PDF من صورة WebP واحدة أو أكثر. +- [**SVG إلى PDF**](./svg-to-pdf): أنشئ ملف PDF من صورة SVG واحدة أو أكثر. +- [**BMP إلى PDF**](./bmp-to-pdf): أنشئ ملف PDF من صورة BMP واحدة أو أكثر. +- [**HEIC إلى PDF**](./heic-to-pdf): أنشئ ملف PDF من صورة HEIC واحدة أو أكثر. +- [**TIFF إلى PDF**](./tiff-to-pdf): أنشئ ملف PDF من صورة TIFF واحدة أو أكثر. +- [**نص إلى PDF**](./txt-to-pdf): حوّل ملفًا نصيًا عاديًا إلى PDF. +- [**Markdown إلى PDF**](./markdown-to-pdf): حوّل Markdown إلى PDF مع معاينة مباشرة وتمييز للصياغة. +- [**JSON إلى PDF**](./json-to-pdf): حوّل ملفات JSON إلى صيغة PDF. +- [**ODT إلى PDF**](./odt-to-pdf): حوّل ملفات ODT (OpenDocument Text) إلى PDF. +- [**CSV إلى PDF**](./csv-to-pdf): حوّل جداول CSV إلى PDF. +- [**RTF إلى PDF**](./rtf-to-pdf): حوّل مستندات RTF (Rich Text Format) إلى PDF. +- [**Word إلى PDF**](./word-to-pdf): حوّل مستندات Word (DOCX وDOC وODT) إلى PDF. +- [**Excel إلى PDF**](./excel-to-pdf): حوّل جداول Excel (XLSX وXLS وODS) إلى PDF. +- [**PowerPoint إلى PDF**](./powerpoint-to-pdf): حوّل عروض PowerPoint التقديمية (PPTX وPPT وODP) إلى PDF. +- [**XPS إلى PDF**](./xps-to-pdf): حوّل مستندات XPS/OXPS إلى PDF. +- [**MOBI إلى PDF**](./mobi-to-pdf): حوّل كتب MOBI الإلكترونية إلى PDF. +- [**EPUB إلى PDF**](./epub-to-pdf): حوّل كتب EPUB الإلكترونية إلى PDF. +- [**FB2 إلى PDF**](./fb2-to-pdf): حوّل كتب FictionBook (FB2) الإلكترونية إلى PDF. +- [**CBZ إلى PDF**](./cbz-to-pdf): حوّل أرشيفات الكتب المصورة (CBZ/CBR) إلى PDF. +- [**WPD إلى PDF**](./wpd-to-pdf): حوّل مستندات WordPerfect (WPD) إلى PDF. +- [**WPS إلى PDF**](./wps-to-pdf): حوّل مستندات WPS Office إلى PDF. +- [**XML إلى PDF**](./xml-to-pdf): حوّل مستندات XML إلى PDF. +- [**ODG إلى PDF**](./odg-to-pdf): حوّل OpenDocument Graphics (ODG) إلى PDF. +- [**ODS إلى PDF**](./ods-to-pdf): حوّل OpenDocument Spreadsheet (ODS) إلى PDF. +- [**ODP إلى PDF**](./odp-to-pdf): حوّل OpenDocument Presentation (ODP) إلى PDF. +- [**PUB إلى PDF**](./pub-to-pdf): حوّل Microsoft Publisher (PUB) إلى PDF. +- [**VSD إلى PDF**](./vsd-to-pdf): حوّل Microsoft Visio (VSD وVSDX) إلى PDF. +- [**PSD إلى PDF**](./psd-to-pdf): حوّل ملفات Adobe Photoshop (PSD) إلى PDF. +- [**بريد إلكتروني إلى PDF**](./email-to-pdf): حوّل ملفات البريد الإلكتروني (EML وMSG) إلى صيغة PDF. + +
+ +--- + +## التحويل من PDF + +استخرج المحتوى من ملفات PDF إلى صور ومستندات وصيغ بيانات. + +
+ +- [**PDF إلى JPG**](./pdf-to-jpg): حوّل كل صفحة PDF إلى صورة JPG. +- [**PDF إلى PNG**](./pdf-to-png): حوّل كل صفحة PDF إلى صورة PNG. +- [**PDF إلى WebP**](./pdf-to-webp): حوّل كل صفحة PDF إلى صورة WebP. +- [**PDF إلى BMP**](./pdf-to-bmp): حوّل كل صفحة PDF إلى صورة BMP. +- [**PDF إلى TIFF**](./pdf-to-tiff): حوّل كل صفحة PDF إلى صورة TIFF. +- [**PDF إلى CBZ**](./pdf-to-cbz): حوّل ملف PDF إلى CBZ (أرشيف كتب مصورة) لقارئات الكتب المصورة وCalibre. +- [**PDF إلى SVG**](./pdf-to-svg): حوّل كل صفحة PDF إلى رسم متجه قابل للتحجيم. +- [**PDF إلى CSV**](./pdf-to-csv): استخرج الجداول من PDF وحوّلها إلى صيغة CSV. +- [**PDF إلى Excel**](./pdf-to-excel): استخرج الجداول من PDF وحوّلها إلى Excel (XLSX). +- [**PDF إلى تدرج الرمادي**](./pdf-to-greyscale): حوّل كل الألوان إلى الأبيض والأسود. +- [**PDF إلى JSON**](./pdf-to-json): حوّل ملفات PDF إلى صيغة JSON. +- [**PDF إلى Word**](./pdf-to-word): حوّل ملفات PDF إلى مستندات Word قابلة للتحرير. +- [**استخراج الصور**](./extract-images): استخرج كل الصور المضمّنة من ملفات PDF. +- [**PDF إلى Markdown**](./pdf-to-markdown): حوّل نص PDF وجداوله إلى صيغة Markdown. +- [**تحضير PDF للذكاء الاصطناعي**](./prepare-pdf-for-ai): استخرج محتوى PDF بصيغة LlamaIndex JSON لمسارات RAG/LLM. +- [**PDF إلى نص**](./pdf-to-text): استخرج النص من ملفات PDF واحفظه كنص عادي. +- [**استخراج جداول PDF**](./extract-tables): استخرج الجداول من ملفات PDF بصيغة CSV أو JSON أو Markdown. + +
+ +--- + +## التنظيم والإدارة + +أعد ترتيب صفحات PDF وملفاتها وادمجها وقسّمها وأدرها. + +
+ +- [**منشئ سير عمل PDF**](./pdf-workflow): ابنِ مسارات معالجة PDF مخصصة بمحرر عُقد مرئي. +- [**أداة PDF المتعددة**](./pdf-multi-tool): محرر PDF متكامل مع إدارة الصفحات. +- [**التعرف الضوئي على PDF**](./ocr-pdf): اجعل ملف PDF قابلًا للبحث والنسخ. +- [**دمج PDF**](./merge-pdf): ادمج عدة ملفات PDF في ملف واحد. +- [**تبديل ومزج الصفحات**](./alternate-merge): ادمج ملفات PDF بتبديل الصفحات من كل ملف. +- [**ترتيب المسح على الوجهين**](./duplex-collate): أعد ترتيب كتل المسح الأمامي والخلفي إلى تسلسل الصفحات الصحيح. +- [**تكرار وتنظيم**](./organize-pdf): كرّر الصفحات وأعد ترتيبها واحذفها. +- [**إضافة مرفقات**](./add-attachments): ضمّن ملفًا واحدًا أو أكثر في ملف PDF. +- [**استخراج المرفقات**](./extract-attachments): استخرج كل الملفات المضمّنة من ملفات PDF في ملف ZIP. +- [**تعديل المرفقات**](./edit-attachments): اعرض المرفقات في ملف PDF أو أزلها. +- [**طبقات PDF OCG**](./pdf-layers): اعرض طبقات OCG في ملف PDF وبدّلها وأضفها واحذفها. +- [**تقسيم PDF**](./split-pdf): استخرج نطاقًا من الصفحات إلى ملف PDF جديد. +- [**تقسيم الصفحات**](./divide-pages): قسّم الصفحات أفقيًا أو رأسيًا. +- [**استخراج الصفحات**](./extract-pages): احفظ مجموعة من الصفحات كملفات جديدة. +- [**حذف الصفحات**](./delete-pages): أزل صفحات محددة من مستندك. +- [**إضافة صفحة فارغة**](./add-blank-page): أدرج صفحة فارغة في أي مكان من ملف PDF. +- [**عكس الصفحات**](./reverse-pages): اعكس ترتيب كل صفحات مستندك. +- [**تدوير PDF**](./rotate-pdf): دوّر الصفحات بزيادات 90 درجة. +- [**تدوير بزاوية مخصصة**](./rotate-custom): دوّر الصفحات بأي زاوية مخصصة. +- [**N-Up PDF**](./n-up-pdf): رتّب عدة صفحات على ورقة واحدة. +- [**كتيّب PDF**](./pdf-booklet): أعد ترتيب الصفحات لطباعة كتيّب على الوجهين. +- [**دمج في صفحة واحدة**](./combine-single-page): اجمع كل الصفحات في شريط تمرير متصل واحد. +- [**عرض البيانات الوصفية**](./view-metadata): افحص الخصائص المخفية في ملف PDF. +- [**تعديل البيانات الوصفية**](./edit-metadata): غيّر المؤلف والعنوان وخصائص أخرى. +- [**PDF إلى ZIP**](./pdf-to-zip): ضع عدة ملفات PDF في أرشيف ZIP. +- [**مقارنة ملفات PDF**](./compare-pdfs): قارن ملفي PDF جنبًا إلى جنب. +- [**تقسيم PDF إلى ملصقات**](./posterize-pdf): قسّم صفحة كبيرة إلى عدة صفحات أصغر. + +
+ +--- + +## التحسين والإصلاح + +اضغط ملفات PDF وأصلحها وحسّنها لأداء وتوافق أفضل. + +
+ +- [**ضغط PDF**](./compress-pdf): قلّل حجم ملف PDF. +- [**PDF إلى PDF/A**](./pdf-to-pdfa): حوّل PDF إلى PDF/A للأرشفة طويلة الأمد. +- [**توحيد حجم الصفحة**](./fix-page-size): وحّد كل الصفحات إلى حجم موحد. +- [**تحسين PDF للويب**](./linearize-pdf): حسّن PDF للعرض السريع على الويب. +- [**أبعاد الصفحة**](./page-dimensions): حلّل حجم الصفحة واتجاهها ووحداتها. +- [**إزالة القيود**](./remove-restrictions): أزل حماية كلمة المرور وقيود الأمان. +- [**إصلاح PDF**](./repair-pdf): استرجع البيانات من ملفات PDF التالفة أو المعطوبة. +- [**تحويل PDF إلى صور نقطية**](./rasterize-pdf): حوّل PDF إلى PDF مبني على الصور. سطّح الطبقات وأزل النص القابل للتحديد. +- [**تصحيح انحراف PDF**](./deskew-pdf): قوّم الصفحات الممسوحة المائلة تلقائيًا باستخدام OpenCV. +- [**تحويل الخطوط إلى مخططات**](./font-to-outline): حوّل كل الخطوط إلى مخططات متجهة لعرض متسق. + +
+ +--- + +## تأمين PDF + +احمِ مستندات PDF وشفّرها وتحكم في الوصول إليها. + +
+ +- [**تشفير PDF**](./protect-pdf): اقفل ملف PDF بإضافة كلمة مرور. +- [**تنظيف PDF**](./sanitize-pdf): أزل البيانات الوصفية والتعليقات والبرامج النصية وغيرها. +- [**فك تشفير PDF**](./unlock-pdf): افتح قفل PDF بإزالة حماية كلمة المرور. +- [**تسطيح PDF**](./flatten-pdf): اجعل حقول النماذج والتعليقات غير قابلة للتحرير. +- [**إزالة البيانات الوصفية**](./remove-metadata): أزل البيانات المخفية من ملف PDF. +- [**تغيير الأذونات**](./change-permissions): عيّن أذونات المستخدم على ملف PDF أو غيّرها. +- [**توقيع رقمي لـ PDF**](./digital-sign-pdf): أضف توقيعًا رقميًا مشفّرًا باستخدام شهادات X.509. +- [**التحقق من توقيع PDF**](./validate-signature-pdf): تحقق من التوقيعات الرقمية واعرض تفاصيل الشهادة. + +
diff --git a/docs/ar/tools/invert-colors.md b/docs/ar/tools/invert-colors.md new file mode 100644 index 00000000..441d4e3f --- /dev/null +++ b/docs/ar/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: عكس الألوان +description: اعكس كل الألوان في ملف PDF لإنشاء نسخة بالوضع الداكن من أي مستند. +--- + +# عكس الألوان + +اقلب كل لون في ملف PDF إلى عكسه. تتحول الخلفيات البيضاء إلى سوداء، والنص الأسود إلى أبيض، وتنتقل كل الألوان الأخرى إلى قيمها المتممة. هذه أسرع طريقة لإنشاء نسخة "وضع داكن" من أي ملف PDF. + +## طريقة العمل + +1. ارفع ملف PDF. +2. انقر على **عكس الألوان** للمعالجة. +3. يُنزَّل ملف PDF المعكوس تلقائيًا. + +لا توجد إعدادات إضافية. تعرض الأداة كل صفحة كصورة، وتعكس ألوان كل البكسلات، ثم تعيد تجميع النتيجة في ملف PDF جديد. + +## الميزات + +- عكس الألوان بنقرة واحدة لكل الصفحات +- معالجة كل صفحة في المستند +- الحفاظ على أبعاد الصفحة وتخطيطها الأصليين +- يعمل مع أي ملف PDF بغض النظر عن نوع المحتوى (نص أو صور أو مختلط) + +## حالات الاستخدام + +- إنشاء نسخ بالوضع الداكن من الكتب الدراسية أو الأدلة لقراءة مريحة ليلًا +- تجهيز نسخ عالية التباين من المستندات لأغراض إمكانية الوصول +- عكس المستندات الممسوحة التي التُقطت بتعريض ضوئي غير صحيح +- إنشاء نسخ سالبة من ملفات PDF الكثيفة بالصور للتحليل البصري + +## نصائح + +- بما أن الأداة تحوّل الصفحات إلى صور نقطية لتطبيق التأثير، فإن الناتج مبني على الصور. لن يكون النص قابلًا للتحديد أو البحث. إذا كنت تحتاج نصًا قابلًا للبحث بعد العكس، فمرّر الناتج عبر أداة OCR. +- لضبط أدق للألوان (السطوع والتباين والتشبع)، استخدم أداة [ضبط الألوان](./adjust-colors) بدلًا من ذلك. +- قد تستغرق ملفات PDF الكبيرة ذات الصفحات الكثيرة وقتًا أطول لأن كل صفحة تُعرض وتُعكس على حدة. + +## أدوات ذات صلة + +- [ضبط الألوان](./adjust-colors) +- [لون الخلفية](./background-color) +- [تأثير الماسح الضوئي](./scanner-effect) diff --git a/docs/ar/tools/jpg-to-pdf.md b/docs/ar/tools/jpg-to-pdf.md new file mode 100644 index 00000000..73d6b3e8 --- /dev/null +++ b/docs/ar/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG إلى PDF +description: حوّل صورة JPG أو JPEG أو JPEG 2000 واحدة أو أكثر إلى ملف PDF واحد مباشرة في متصفحك. +--- + +# JPG إلى PDF + +حوّل صور JPG إلى ملف PDF نظيف. ارفع ملفًا واحدًا أو عدة ملفات JPG معًا، وستصبح كل صورة صفحة كاملة الحجم في المستند الناتج. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات JPG وأفلتها. التحديد المتعدد مدعوم. +2. راجع الملفات المرفوعة. استخدم أيقونة سلة المهملات لإزالة ملف بعينه، أو انقر على **إضافة المزيد من الملفات** للإلحاق بالقائمة. +3. اختر مستوى **جودة PDF**. +4. انقر على **تحويل إلى PDF**. تضغط الأداة الصور وفق إعداد الجودة، وتحوّلها عبر محرك PyMuPDF، وتنزّل `from_jpgs.pdf`. + +## الخيارات + +تضبط **جودة PDF** الضغط المطبَّق على كل صورة قبل تضمينها في ملف PDF: + +- **جودة عالية**: تحافظ على أقصى قدر من التفاصيل. استخدمها للتصوير أو الطباعة. +- **جودة متوسطة** (الافتراضي): توازن جيد بين الوضوح وحجم الملف. +- **جودة منخفضة**: ضغط قوي لأصغر ناتج. + +## حالات الاستخدام + +- تحويل المستندات الممسوحة المحفوظة بصيغة JPG إلى ملف PDF واحد للتقديم +- تجميع صور المنتجات في كتالوج للعملاء +- تحويل صور JPEG 2000 الطبية أو الفضائية إلى PDF قابل للنقل +- إنشاء ألبوم صور قابل للطباعة من صور الكاميرا + +## نصائح + +- ملفات JPEG 2000 (`.jp2` و`.jpx`) مدعومة بالكامل وليس JPEG القياسي فقط. وهذا مفيد للتصوير الطبي والبيانات الجيومكانية. +- إذا كانت صور JPG من كاميرا هاتف، فإن الجودة المتوسطة تنتج عادةً ملفًا أصغر بنسبة 40-60% من العالية دون فرق مرئي على الشاشة. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [PNG إلى PDF](./png-to-pdf) +- [WebP إلى PDF](./webp-to-pdf) diff --git a/docs/ar/tools/json-to-pdf.md b/docs/ar/tools/json-to-pdf.md new file mode 100644 index 00000000..0a136ef9 --- /dev/null +++ b/docs/ar/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON إلى PDF +description: أعد بناء ملفات PDF من صيغة JSON الخاصة بـ BentoPDF. حوّل ملفات JSON المصدّرة إلى مستندات PDF الأصلية. +--- + +# JSON إلى PDF + +أعد بناء مستندات PDF من ملفات JSON أُنشئت سابقًا بأداة **PDF إلى JSON** في BentoPDF. هذه أداة تحويل ذهابًا وإيابًا: تأخذ التمثيل المنظَّم لملف PDF بصيغة JSON وتعيد بناء المستند الأصلي. + +::: warning +تقبل هذه الأداة فقط ملفات JSON التي أنتجها محوّل PDF إلى JSON في BentoPDF. ملفات JSON القياسية من واجهات API أو قواعد البيانات أو أدوات أخرى غير مدعومة. +::: + +## الصيغ المدعومة + +| المدخل | الوصف | +| :------ | :------------------------------------------------- | +| `.json` | ملفات JSON المصدّرة بأداة PDF إلى JSON في BentoPDF | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملف JSON واحدًا أو أكثر وأفلته. +2. تعرض قائمة الملفات كل ملف محدد مع حجمه. +3. انقر على **تحويل إلى PDF**. تعالج الأداة كل الملفات باستخدام Web Worker ومحرك CPDF. +4. يُنزَّل الناتج باسم `jsons-to-pdf.zip` ويحتوي على ملف PDF واحد لكل ملف JSON مُدخَل. + +يعمل التحويل في Web Worker في الخلفية، لذا تبقى الواجهة سريعة الاستجابة حتى مع الملفات الكبيرة. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. بنية JSON تحدد ملف PDF الناتج بالكامل. + +## المخرجات + +عند تحويل عدة ملفات JSON، تُسلَّم النتائج كأرشيف ZIP. يُسمّى كل ملف PDF باسم ملف JSON المصدر (مثلًا يصبح `report.json` هو `report.pdf`). + +## حالات الاستخدام + +- استعادة ملفات PDF من نسخة احتياطية أو مسار أرشفة مبني على JSON +- تمرير ملف PDF عبر JSON للفحص ثم إعادته إلى PDF +- إعادة بناء المستندات بعد تعديلات برمجية على بنية JSON +- التحقق من أن تصدير PDF إلى JSON التقط كل محتوى المستند بتحويله عائدًا + +## نصائح + +- إذا كنت تحتاج إلى تحويل بيانات JSON عشوائية (مثل استجابات API أو ملفات الإعدادات) إلى PDF منسّق، فأداة [نص إلى PDF](./txt-to-pdf) أنسب. الصق JSON كنص وسيُعرض بتنسيق مناسب. +- يجب أن يكون محرك CPDF WebAssembly متاحًا لتعمل هذه الأداة. تحتاج النسخ المستضافة ذاتيًا إلى ضبط ملفات CPDF WASM. + +## أدوات ذات صلة + +- [نص إلى PDF](./txt-to-pdf) +- [Markdown إلى PDF](./markdown-to-pdf) +- [CSV إلى PDF](./csv-to-pdf) diff --git a/docs/ar/tools/linearize-pdf.md b/docs/ar/tools/linearize-pdf.md new file mode 100644 index 00000000..c6cec607 --- /dev/null +++ b/docs/ar/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: تحسين PDF للويب +description: حسّن ملفات PDF للعرض السريع على الويب بالتحميل التدريجي. يُعرف أيضًا بتحسين "Fast Web View". +--- + +# تحسين PDF للويب + +يعيد التحسين للويب (Linearization) هيكلة ملف PDF بحيث يمكن عرض الصفحة الأولى قبل اكتمال تنزيل الملف بأكمله. تسمي Adobe هذا "Fast Web View". إذا كنت تستضيف ملفات PDF على موقع ويب أو تقدمها عبر بوابة مستندات، فإن هذا التحسين يجعل فتحها أسرع بشكل ملحوظ. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. +2. انقر على **تحسين PDF**. +3. نزّل النتائج كأرشيف ZIP يحتوي على كل الملفات المحسَّنة. + +لا توجد إعدادات لضبطها. تستخدم الأداة الخيار `--linearize` من QPDF، الذي يعيد ترتيب البنية الداخلية لملف PDF دون تغيير محتواه المرئي. + +## ماذا يفعل التحسين للويب + +- يعيد ترتيب كائنات PDF بحيث تظهر بيانات الصفحة الأولى في بداية الملف +- يضيف قاموس التحسين وجداول التلميحات لتعرف العارضات مكان كل صفحة +- يتيح طلبات نطاق البايتات: يمكن للمتصفح جلب الصفحة الأولى فقط دون تنزيل الملف كله +- ينظّف جدول المراجع المتقاطعة للوصول العشوائي الفعّال + +## الميزات + +- معالجة دفعية لعدة ملفات PDF في عملية واحدة +- يحافظ الناتج على كل المحتوى والخطوط والصور والعناصر التفاعلية +- يستخدم QPDF (WebAssembly) لتحسين موثوق ومتوافق مع المعايير +- تُجمَّع النتائج في ZIP لتنزيل سهل + +## حالات الاستخدام + +- استضافة تقارير PDF على موقع ويب حيث يتوقع المستخدمون عرضًا فوريًا للصفحة +- تضمين ملفات PDF في تطبيقات الويب ذات العارضات داخل المتصفح +- نشر كتالوجات أو أدلة PDF يُوصل إليها عبر اتصالات جوال بطيئة +- تجهيز المستندات لشبكات توصيل المحتوى (CDN) التي تدعم تقديم نطاقات البايتات + +## نصائح + +- حسّن للويب بعد الانتهاء من كل التعديلات الأخرى. أي تعديل لاحق (دمج أو إضافة صفحات) سيُبطل التحسين. +- اجمعه مع ضغط PDF لأصغر ملفات PDF وأسرعها تحميلًا. +- يضيف التحسين قدرًا صغيرًا إلى حجم الملف (عادةً أقل من 1%). + +## أدوات ذات صلة + +- [ضغط PDF](./compress-pdf): قلّل حجم الملف قبل التحسين +- [إصلاح PDF](./repair-pdf): أصلح المشكلات البنيوية التي تمنع التحسين +- [إزالة البيانات الوصفية](./remove-metadata): أزل البيانات الوصفية قبل النشر على الإنترنت diff --git a/docs/ar/tools/markdown-to-pdf.md b/docs/ar/tools/markdown-to-pdf.md new file mode 100644 index 00000000..1a2005cb --- /dev/null +++ b/docs/ar/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown إلى PDF +description: اكتب Markdown أو الصقه وصدّره كملف PDF منسّق باحترافية مع معاينة مباشرة وتمييز للصياغة. +--- + +# Markdown إلى PDF + +محرر Markdown متكامل مع معاينة مباشرة وتصدير PDF بنقرة واحدة. اكتب من الصفر، أو ارفع ملف `.md` موجودًا، أو الصق المحتوى من الحافظة. يعرض المحرر Markdown في الوقت الفعلي ويصدّر ملف PDF منسقًا باستخدام محرك الطباعة المدمج في المتصفح. + +## الصيغ المدعومة + +| المدخل | الوصف | +| :---------- | :--------------------- | +| ملفات `.md` | ارفعها عبر زر الرفع | +| إدخال مباشر | اكتب أو الصق في المحرر | + +## طريقة العمل + +1. افتح أداة Markdown إلى PDF. يُحمَّل المحرر بعرض مقسوم: مصدر Markdown على اليسار والمعاينة المعروضة على اليمين. +2. اكتب Markdown أو الصقه، أو انقر على **رفع** لتحميل ملف `.md`. +3. بدّل بين السمتين الفاتحة والداكنة بمنزلق السمة في شريط الأدوات. +4. انقر على **تصدير PDF** (أو اضغط `Ctrl/Cmd + S`) لإنشاء ملف PDF عبر مربع حوار الطباعة في المتصفح. + +## الميزات + +يدعم المحرر مجموعة واسعة من ميزات Markdown تتجاوز الأساسيات: + +- **Markdown القياسي**: العناوين والخط الغامق والمائل والروابط والصور والقوائم والاقتباسات والخطوط الأفقية +- **كتل الأكواد** مع تمييز الصياغة لأكثر من 15 لغة (JavaScript وTypeScript وPython وGo وRust وSQL وJava وC# وC++ وYAML وBash وغيرها) +- **مخططات Mermaid**: تُعرض المخططات الانسيابية ومخططات التسلسل ومخططات ER وأنواع مخططات Mermaid الأخرى مباشرة في المعاينة +- **الجداول** بصياغة جداول Markdown القياسية +- **قوائم المهام** مع مربعات اختيار +- **الحواشي السفلية** و**النص المنخفض** و**النص المرتفع** +- **قوائم التعريفات** و**الاختصارات** +- دعم **الرموز التعبيرية** (يُعرض `:smile:` كرمز تعبيري) +- **التمييز** (`==marked text==`) و**الإدراج** (`++inserted text++`) +- **الروابط التلقائية**: تُحوَّل عناوين URL العادية إلى روابط قابلة للنقر +- إنشاء **جدول المحتويات** +- **روابط الارتساء** على العناوين + +## حالات الاستخدام + +- كتابة وثائق المشاريع وتصدير ملف PDF أنيق لأصحاب المصلحة +- إنشاء تقارير تقنية بنماذج أكواد ومخططات معمارية بـ Mermaid +- تحويل README من GitHub إلى PDF للاستخدام دون اتصال أو للطباعة +- صياغة مقترح أو مواصفة مع قوائم مهام وجداول +- إنشاء نشرة منسقة من ملاحظات محاضرة مكتوبة بـ Markdown + +## نصائح + +- يستخدم ناتج PDF وظيفة الطباعة إلى PDF في المتصفح. في Chrome، يمكنك تخصيص الهوامش والمقياس في مربع حوار الطباعة قبل الحفظ. +- تُعرض مخططات Mermaid في المعاينة لكنها قد تحتاج لحظة للتهيئة عند أول استخدام. +- استخدم `Ctrl/Cmd + S` كاختصار لوحة مفاتيح للتصدير دون الحاجة إلى الزر. + +## أدوات ذات صلة + +- [نص إلى PDF](./txt-to-pdf) +- [Word إلى PDF](./word-to-pdf) +- [JSON إلى PDF](./json-to-pdf) diff --git a/docs/ar/tools/merge-pdf.md b/docs/ar/tools/merge-pdf.md new file mode 100644 index 00000000..3e9a88d4 --- /dev/null +++ b/docs/ar/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: دمج PDF +description: ادمج عدة ملفات PDF في مستند واحد مع إعادة ترتيب بالسحب والإفلات وتحكم على مستوى الصفحات. +--- + +# دمج PDF + +ادمج عدة ملفات PDF في مستند واحد. يمكنك دمج ملفات كاملة بترتيب محدد، أو التبديل إلى وضع الصفحات للتحكم الدقيق في كل صفحة من كل ملف PDF مرفوع. + +## طريقة العمل + +1. ارفع ملفَّي PDF أو أكثر بالنقر على منطقة الإفلات أو سحبها إليها. +2. اختر بين **وضع الملفات** و**وضع الصفحات** باستخدام المفتاح في الأعلى. +3. في وضع الملفات، اسحب الملفات لإعادة ترتيبها وحدّد اختياريًا نطاقات الصفحات (مثل `1-3, 5`) لكل ملف. اترك النطاق فارغًا لتضمين كل الصفحات. +4. في وضع الصفحات، اسحب صور الصفحات المصغرة وأفلتها لبناء تسلسل الصفحات الدقيق. +5. انقر على **دمج ملفات PDF** لدمج كل شيء في ملف واحد. يُنزَّل ملف PDF المدموج تلقائيًا. + +## الميزات + +- وضعا دمج: وضع الملفات للدمج السريع للملفات كاملة، ووضع الصفحات للتحكم في كل صفحة +- إعادة ترتيب بالسحب والإفلات في كلا الوضعين مع حركات سلسة +- صياغة نطاق الصفحات (مثل `1-3, 5, 8-10`) تتيح لك انتقاء الصفحات دون التبديل إلى وضع الصفحات +- الصور المصغرة للصفحات تُحمَّل عند الحاجة لتبقى الواجهة سريعة الاستجابة حتى مع المستندات الكبيرة +- لا حد لعدد الملفات أو إجمالي عدد الصفحات +- يحافظ على جودة PDF الأصلية دون إعادة ترميز + +## الخيارات + +| الخيار | الوصف | +| --------------- | ----------------------------------------------------------------------- | +| **وضع الملفات** | ادمج ملفات كاملة بترتيب مخصص، مع مرشحات اختيارية لنطاق الصفحات لكل ملف | +| **وضع الصفحات** | شبكة مرئية بكل صفحات كل الملفات: اسحب الصور المصغرة لبناء تسلسلك الدقيق | +| **حقل الصفحات** | حقل نصي لكل ملف يقبل نطاقات مثل `1-3, 5` لتضمين صفحات محددة فقط | + +## حالات الاستخدام + +- دمج ملفات PDF منفصلة للفصول في كتاب أو تقرير واحد +- دمج خطاب التغطية والسيرة الذاتية في مستند تقديم واحد +- سحب صفحات محددة من عدة مستندات مصدر إلى ملف موحّد +- تجميع الإيصالات أو الفواتير الممسوحة في ملف PDF أرشيفي واحد +- إنشاء نشرة عرض تقديمي من شرائح عدة عروض + +## نصائح + +- استخدم وضع الصفحات عندما تحتاج إلى تداخل الصفحات من ملفات مختلفة بدلًا من إلحاق ملف بعد آخر. +- يمكنك إضافة ملفات أخرى بعد الرفع الأولي بزر **إضافة المزيد من الملفات** دون فقدان ترتيبك الحالي. +- تبدأ نطاقات الصفحات من 1، لذا يشير `1` إلى الصفحة الأولى من ذلك الملف. + +## أدوات ذات صلة + +- [تقسيم PDF](./split-pdf) +- [تكرار وتنظيم](./organize-pdf) +- [تبديل ومزج الصفحات](./alternate-merge) +- [حذف الصفحات](./delete-pages) diff --git a/docs/ar/tools/mobi-to-pdf.md b/docs/ar/tools/mobi-to-pdf.md new file mode 100644 index 00000000..d3ac4257 --- /dev/null +++ b/docs/ar/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI إلى PDF +description: حوّل ملفات الكتب الإلكترونية MOBI إلى PDF مباشرة في متصفحك. مجاني وخاص ودون رفع ملفات. +--- + +# MOBI إلى PDF + +حوّل كتب Amazon Kindle الإلكترونية بصيغة MOBI إلى مستندات PDF. ملفات MOBI مرتبطة بأجهزة Kindle وتطبيقاتها، مما يصعّب قراءتها في أماكن أخرى. يمنحك التحويل إلى PDF نسخة محمولة يمكنك فتحها على أي جهاز أو طباعتها. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----- | :------- | :--------------------------------------- | +| MOBI | `.mobi` | صيغة كتب Kindle الإلكترونية (Mobipocket) | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملف MOBI واحدًا أو أكثر وأفلته. +2. راجع قائمة الملفات. أزل الملفات غير المرغوبة بأيقونة سلة المهملات، أو استخدم **إضافة المزيد من الملفات** لإضافة كتب أخرى. +3. انقر على **تحويل إلى PDF**. يحلّل محرك PyMuPDF بنية MOBI ويعرض كل صفحة كمحتوى PDF. +4. يُنزَّل الملف الواحد كـ PDF. وعند تحويل عدة ملفات تحصل على أرشيف ZIP باسم `mobi-converted.zip`. + +## الخيارات + +لا حاجة إلى إعدادات إضافية. يحافظ التحويل على المحتوى النصي والتنسيق والصور المضمّنة من ملف MOBI الأصلي. + +## حالات الاستخدام + +- قراءة المحتوى المشترى من Kindle على قارئ إلكتروني غير Kindle يدعم PDF فقط +- طباعة فصول من كتاب إلكتروني للدراسة أو التعليق دون اتصال +- أرشفة مكتبتك الشخصية من الكتب الإلكترونية بصيغة عالمية +- مشاركة مقتطفات مع شخص لم يثبّت تطبيق Kindle + +## نصائح + +- لا يمكن تحويل ملفات MOBI المحمية بـ DRM. تعمل الأداة مع ملفات MOBI الخالية من DRM فقط. +- قد تستغرق الكتب الكبيرة ذات الصور المضمّنة الكثيرة بضع ثوانٍ إضافية للمعالجة لأن كل شيء يحدث داخل المتصفح. + +## أدوات ذات صلة + +- [EPUB إلى PDF](./epub-to-pdf) +- [FB2 إلى PDF](./fb2-to-pdf) +- [CBZ إلى PDF](./cbz-to-pdf) diff --git a/docs/ar/tools/n-up-pdf.md b/docs/ar/tools/n-up-pdf.md new file mode 100644 index 00000000..9d49c5be --- /dev/null +++ b/docs/ar/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: رتّب عدة صفحات PDF على ورقة واحدة بتخطيط شبكي لطباعة مضغوطة. +--- + +# N-Up PDF + +ضع عدة صفحات على ورقة واحدة بترتيب شبكي. يقلل هذا عدد الصفحات المطبوعة بوضع 2 أو 4 أو 6 أو 8 أو 9 أو 16 صفحة في الورقة الواحدة. تتولى الأداة التحجيم وتحديد المواضع وضبط حجم الصفحة اختياريًا. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اختر عدد الصفحات في الورقة (قيمة "N"): 2 أو 4 أو 6 أو 8 أو 9 أو 16. +3. اختر حجم صفحة الناتج (الافتراضي A4) واتجاهها. +4. يمكنك اختياريًا ضبط التباعد ولون الحدود ولون الخلفية. +5. انقر على زر المعالجة. تحجّم الأداة كل صفحة وترصفها على أوراق جديدة. + +## الميزات + +- تخطيطات شبكية: 2 و4 و6 و8 و9 و16 صفحة في الورقة +- حجم صفحة الناتج واتجاهها قابلان للضبط +- تباعد اختياري بين الصفحات المرصوفة +- إعدادات لون الخلفية والحدود +- يحافظ على نسبة أبعاد الصفحات الأصلية أثناء التحجيم للملاءمة + +## الخيارات + +| الخيار | الوصف | +| --------------------- | ------------------------------------------------------------------ | +| **الصفحات في الورقة** | عدد الصفحات الأصلية في كل صفحة ناتجة (2 أو 4 أو 6 أو 8 أو 9 أو 16) | +| **حجم الصفحة** | حجم ورقة الناتج (A4 وLetter وLegal وغيرها) | +| **الاتجاه** | عمودي أو أفقي لورقة الناتج | +| **التباعد** | الفجوة بالنقاط بين الصفحات المرصوفة | +| **لون الخلفية** | لون تعبئة خلفية ورقة الناتج | +| **لون الحدود** | لون الحدود حول كل صفحة مرصوفة | + +## حالات الاستخدام + +- طباعة نشرات بأربع شرائح في الصفحة لتوفير الورق +- إنشاء أوراق مذاكرة بعدة صفحات مرجعية في ورقة واحدة +- إنتاج أرشيفات مستندات مضغوطة للحفظ +- إنشاء أوراق نظرة عامة مصغرة لمستند طويل + +## نصائح + +- غالبًا ما يعمل الاتجاه الأفقي بشكل أفضل مع تخطيط 2 في الورقة، بينما يكون العمودي الأفضل عادةً لـ 4 وما فوق. +- زيادة التباعد تحسّن القراءة لكنها تقلل المساحة المتاحة لكل صفحة مرصوفة. +- للعملية العكسية (تقسيم صفحة واحدة إلى عدة صفحات)، راجع [تقسيم PDF إلى ملصقات](./posterize-pdf). + +## أدوات ذات صلة + +- [تقسيم PDF إلى ملصقات](./posterize-pdf) +- [كتيّب PDF](./pdf-booklet) +- [دمج في صفحة واحدة](./combine-single-page) diff --git a/docs/ar/tools/ocr-pdf.md b/docs/ar/tools/ocr-pdf.md new file mode 100644 index 00000000..0841940e --- /dev/null +++ b/docs/ar/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: التعرف الضوئي على PDF +description: اجعل ملفات PDF الممسوحة قابلة للبحث والنسخ باستخدام Tesseract OCR مع دعم لغات متعددة وتصفية الأحرف. +--- + +# التعرف الضوئي على PDF + +حوّل المستندات الممسوحة إلى ملفات PDF قابلة للبحث والنسخ. تستخدم الأداة Tesseract OCR للتعرف على النص في الصور وتضع طبقة نصية غير مرئية فوق الصفحات الأصلية، مما يحافظ على مظهرها المرئي ويجعل المحتوى قابلًا للبحث بالكامل. + +## طريقة العمل + +1. ارفع ملف PDF ممسوحًا ضوئيًا أو مبنيًا على الصور. +2. اختر لغة واحدة أو أكثر موجودة في المستند من قائمة اللغات القابلة للبحث. +3. اضبط الإعدادات المتقدمة اختياريًا (الدقة والتحويل الثنائي والقائمة البيضاء). +4. انقر على **بدء OCR** وتابع التقدم في شريط التقدم المباشر. +5. عند الانتهاء، راجع النص المستخرج، ثم نزّل ملف PDF القابل للبحث أو ملف `.txt` نصيًا عاديًا. + +## الميزات + +- OCR متعدد اللغات مع محدد لغات قابل للبحث +- الطبقة النصية غير المرئية تحافظ على مظهر المستند الأصلي +- شريط تقدم مباشر وسجل مخرجات أثناء المعالجة +- نزّل النتائج كملف PDF قابل للبحث أو ملف نصي عادي +- انسخ النص المستخرج مباشرة إلى الحافظة +- ثلاثة مستويات دقة للموازنة بين السرعة والدقة + +## الخيارات + +| الإعداد | القيم | الافتراضي | الغرض | +| -------------------------------- | ----------------------------------------------------------------------- | --------- | ------------------------------------------------------------------ | +| **الدقة** | قياسية (192 DPI)، عالية (288 DPI)، فائقة (384 DPI) | عالية | الدقة الأعلى تحسّن الدقة في النصوص الصغيرة لكنها تستغرق وقتًا أطول | +| **تحويل الصورة إلى ثنائية** | تشغيل / إيقاف | إيقاف | يعزز التباين للمسوحات النظيفة بتحويلها إلى أبيض وأسود | +| **إعداد القائمة البيضاء للأحرف** | بلا، أبجدي رقمي، أرقام وعملات، حروف فقط، أرقام فقط، فاتورة، نماذج، مخصص | بلا | يحصر الأحرف المتعرَّف عليها لتحسين الدقة لأنواع مستندات معينة | +| **القائمة البيضاء للأحرف** | نص حر | فارغ | مجموعة أحرف يدوية عند ضبط الإعداد المسبق على مخصص | + +## حالات الاستخدام + +- جعل العقود والفواتير الممسوحة قابلة للبحث بحيث يمكنك استخدام Ctrl+F فيها +- استخراج النص من المستندات المصوَّرة أو السجلات الورقية القديمة +- معالجة الإيصالات بإعداد الفاتورة لالتقاط المبالغ والتواريخ بدقة +- إنشاء ملفات PDF يسهل الوصول إليها من مسوحات الصور فقط لمتطلبات الامتثال +- استخراج المحتوى النصي دفعة واحدة من كتب أو أدلة ممسوحة + +## نصائح + +- اختر عدة لغات إذا كان مستندك يحتوي على محتوى بلغات مختلطة (مثل عناوين بالإنجليزية ونص أساسي بالياباني). +- استخدم خيار التحويل الثنائي للمستندات ذات النص الباهت أو منخفض التباين، فقد يحسّن دقة التعرف بشكل كبير. +- تقلل إعدادات القائمة البيضاء للفواتير والنماذج النتائج الخاطئة بشكل كبير في المستندات المنظمة بتجاهل أشكال الأحرف غير ذات الصلة. + +## أدوات ذات صلة + +- [استخراج جداول PDF](./extract-tables) +- [دمج PDF](./merge-pdf) +- [ضغط PDF](./compress-pdf) diff --git a/docs/ar/tools/odg-to-pdf.md b/docs/ar/tools/odg-to-pdf.md new file mode 100644 index 00000000..d2f76de9 --- /dev/null +++ b/docs/ar/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG إلى PDF +description: حوّل ملفات LibreOffice Draw (ODG) إلى PDF في متصفحك. مجاني ودون رفع وخاص بالكامل. +--- + +# ODG إلى PDF + +حوّل ملفات OpenDocument Graphics إلى PDF. ODG هي الصيغة الأصلية لـ LibreOffice Draw وتُستخدم للمخططات والمخططات الانسيابية والرسومات المتجهة. يجعل التحويل إلى PDF مشاركة هذه الرسومات وطباعتها وتضمينها في مستندات أخرى أمرًا سهلًا. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :-------------------- | :------- | :--------------------------------------- | +| OpenDocument Graphics | `.odg` | ملفات LibreOffice Draw / OpenOffice Draw | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات ODG وأفلتها. يمكن إضافة عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات. أزل ملفًا بعينه بأيقونة سلة المهملات، أو انقر على **إضافة المزيد من الملفات** لإضافة رسومات أخرى. +3. انقر على **تحويل إلى PDF**. يُحمَّل محرك مبني على LibreOffice في المتصفح ويحوّل كل ملف ODG، مع الحفاظ على الرسومات المتجهة والأشكال والنصوص. +4. يُنزَّل الملف الواحد كـ PDF مباشرة. أما الملفات المتعددة فتنتج أرشيف ZIP باسم `odg-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى إعدادات إضافية. يحافظ التحويل على أبعاد الصفحة الأصلية والأشكال والموصِّلات ومربعات النص من مصدر ODG. + +## حالات الاستخدام + +- مشاركة مخططات LibreOffice Draw مع عملاء لم يثبّتوا LibreOffice +- طباعة المخططات الانسيابية ومخططات الشبكات المنشأة في Draw +- تضمين رسومات ODG في تقرير أو عرض تقديمي كملفات PDF مضمّنة +- أرشفة الرسومات التقنية بصيغة ستبقى قابلة للقراءة لعقود + +## نصائح + +- تبقى العناصر المتجهة متجهة في ناتج PDF، لذا يتدرج الناتج بوضوح إلى أي حجم طباعة. +- يستغرق محرك LibreOffice لحظة للتهيئة عند أول استخدام. التحويلات اللاحقة في الجلسة نفسها أسرع. + +## أدوات ذات صلة + +- [ODS إلى PDF](./ods-to-pdf) +- [ODP إلى PDF](./odp-to-pdf) +- [VSD إلى PDF](./vsd-to-pdf) diff --git a/docs/ar/tools/odp-to-pdf.md b/docs/ar/tools/odp-to-pdf.md new file mode 100644 index 00000000..3651e7fe --- /dev/null +++ b/docs/ar/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP إلى PDF +description: حوّل عروض LibreOffice Impress (ODP) التقديمية إلى PDF في متصفحك. مجاني وخاص ودون رفع. +--- + +# ODP إلى PDF + +حوّل ملفات OpenDocument Presentation إلى PDF. ODP هي الصيغة الأصلية لـ LibreOffice Impress وصيغة تصدير قياسية من Google Slides. يتيح تحويل العروض التقديمية إلى PDF لأي شخص عرضها دون برنامج عروض تقديمية، وتُطبع الشرائح بشكل نظيف. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :------------------------ | :------- | :---------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / تصدير Google Slides | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات ODP وأفلتها. يمكنك تحديد عدة عروض تقديمية دفعة واحدة. +2. راجع قائمة الملفات. أزل ملفًا بأيقونة سلة المهملات، أو استخدم **إضافة المزيد من الملفات** لإضافة عروض أخرى. +3. انقر على **تحويل إلى PDF**. يعالج المحرك المبني على LibreOffice كل عرض تقديمي وينتج ملف PDF تصبح فيه كل شريحة صفحة. +4. يُنزَّل الملف الواحد كـ PDF. أما الملفات المتعددة فتُسلَّم في أرشيف ZIP باسم `odp-to-pdf.zip`. + +## الخيارات + +لا توجد إعدادات لضبطها. تُعرض كل شريحة بأبعادها الأصلية مع الحفاظ على النصوص والصور والأشكال وخلفيات الشرائح. + +## حالات الاستخدام + +- توزيع عرض تقديمي على الجمهور كنشرة PDF +- مشاركة تصديرات Google Slides مع أشخاص يفضلون PDF على ODP +- أرشفة محاضرات ومداخلات المؤتمرات بصيغة للقراءة فقط +- طباعة العروض التقديمية لورش العمل الحضورية + +## نصائح + +- انتقالات الشرائح والرسوم المتحركة ميزات مرئية فقط لا تنتقل إلى PDF، لكن كل المحتوى الثابت يُعرض بشكل صحيح. +- ملاحظات المتحدث غير مضمّنة في ناتج PDF. إذا كنت تحتاج الملاحظات، فصدّرها بشكل منفصل من برنامج العروض التقديمية. +- مثل الأدوات الأخرى المبنية على LibreOffice، يُحمَّل المحرك عند أول استخدام ويبقى مخزنًا مؤقتًا طوال الجلسة. + +## أدوات ذات صلة + +- [ODG إلى PDF](./odg-to-pdf) +- [ODS إلى PDF](./ods-to-pdf) +- [PUB إلى PDF](./pub-to-pdf) diff --git a/docs/ar/tools/ods-to-pdf.md b/docs/ar/tools/ods-to-pdf.md new file mode 100644 index 00000000..9c11e77d --- /dev/null +++ b/docs/ar/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS إلى PDF +description: حوّل جداول LibreOffice Calc (ODS) إلى PDF داخل متصفحك. مجاني وخاص وبدون تسجيل. +--- + +# ODS إلى PDF + +حوّل ملفات OpenDocument Spreadsheet إلى PDF. ODS هو الصيغة الأصلية لـ LibreOffice Calc وصيغة تصدير شائعة من Google Sheets. تعرض هذه الأداة بيانات جدولك وتنسيقه ومخططاته في ملف PDF مقسّم إلى صفحات يمكنك طباعته أو مشاركته. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----------------------- | :------- | :------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | تصدير LibreOffice Calc / Google Sheets | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات ODS وأفلتها. يمكنك رفع عدة ملفات. +2. راجع قائمة الملفات. استخدم أيقونة سلة المهملات لإزالة الملفات، أو انقر على **إضافة المزيد من الملفات** لتوسيع الدفعة. +3. انقر على **تحويل إلى PDF**. يتم تحميل المحرك المبني على LibreOffice في المتصفح ويحوّل كل جدول إلى صفحات PDF. +4. يتم تنزيل الجدول الواحد كملف PDF. أما الملفات المتعددة فتُحزم في `ods-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى أي إعداد. يطبّق المحوّل تخطيط الطباعة الحالي للجدول وتنسيق الخلايا وعرض الأعمدة على ملف PDF الناتج. + +## حالات الاستخدام + +- مشاركة ميزانية أو تقرير من LibreOffice Calc مع شخص لا يقبل إلا ملفات PDF +- طباعة ملف من Google Sheets تم تنزيله بصيغة ODS +- أرشفة السجلات المالية بصيغة غير قابلة للتعديل +- تسليم النماذج أو سجلات الدوام المبنية على ODS كمستندات بتخطيط ثابت + +## نصائح + +- إذا كان جدولك يحتوي على عدة أوراق، فستُضمَّن جميعها في ملف PDF الناتج. +- قد تمتد الجداول العريضة جدًا على عدة صفحات PDF أفقيًا. فكّر في ضبط عرض الأعمدة في الملف المصدر قبل التحويل إذا كان التخطيط مهمًا. +- يتم تهيئة محرك LibreOffice عند أول استخدام. التحويلات اللاحقة في الجلسة نفسها أسرع. + +## أدوات ذات صلة + +- [ODG إلى PDF](./odg-to-pdf) +- [ODP إلى PDF](./odp-to-pdf) +- [XML إلى PDF](./xml-to-pdf) diff --git a/docs/ar/tools/odt-to-pdf.md b/docs/ar/tools/odt-to-pdf.md new file mode 100644 index 00000000..85f0af3c --- /dev/null +++ b/docs/ar/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT إلى PDF +description: حوّل ملفات OpenDocument Text (ODT) إلى صيغة PDF داخل متصفحك باستخدام محرك يعتمد على LibreOffice. +--- + +# ODT إلى PDF + +حوّل ملفات OpenDocument Text إلى PDF. ODT هي الصيغة الأصلية لـ LibreOffice Writer وApache OpenOffice وغيرهما من معالجات النصوص مفتوحة المصدر. تستخدم هذه الأداة محرك LibreOffice يعمل داخل المتصفح لإنتاج تحويلات دقيقة تحافظ على التنسيق والجداول والصور والأنماط. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :---------------- | :--------- | +| OpenDocument Text | `.odt` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملف ODT واحدًا أو أكثر وأفلته. +2. راجع قائمة الملفات. أضف المزيد من الملفات أو أزل غير المرغوب فيها. +3. انقر على **التحويل إلى PDF**. يتم تهيئة محرك LibreOffice (يعرض مؤشر التقدم حالة التحميل)، ثم يتم تحويل كل ملف. +4. يتم تنزيل الملف الواحد مباشرة كملف PDF. أما الملفات المتعددة فتُحزم في `odt-converted.zip`. + +## الخيارات + +لا تحتوي هذه الأداة على إعدادات إضافية. يحافظ التحويل على تنسيق المستند الأصلي قدر الإمكان. + +## الناتج + +| عدد المدخلات | الناتج | +| :------------ | :-------------------------------------------------------- | +| ملف واحد | تنزيل ملف PDF واحد (مثل `document.pdf`) | +| ملفان أو أكثر | أرشيف ZIP (`odt-converted.zip`) يحتوي على ملف PDF لكل ملف | + +## حالات الاستخدام + +- تحويل مستندات LibreOffice Writer إلى PDF لمشاركتها مع مستخدمي Microsoft Office +- إنتاج ملفات PDF جاهزة للطباعة من الأوراق البحثية المكتوبة بصيغة OpenDocument +- تحويل مجلد كامل من قوالب ODT إلى ملفات PDF للتوزيع دفعة واحدة +- إنشاء ملفات PDF من ملفات ODT التي تنتجها أنظمة توليد المستندات الآلية + +## نصائح + +- يتم تحميل محرك LibreOffice عند أول استخدام ويُخزَّن مؤقتًا للتحويلات اللاحقة. يستغرق التحميل الأول بضع ثوانٍ، وبعدها تكون التحويلات سريعة. +- قد تظهر المستندات المعقدة التي تحتوي على كائنات OLE مضمّنة أو خطوط غير شائعة بشكل مختلف قليلًا عن LibreOffice المثبّت على سطح المكتب. جرّب عينة قبل التحويل الجماعي. +- لمستندات Word (`.doc` و`.docx`)، استخدم أداة [Word إلى PDF](./word-to-pdf) بدلًا من ذلك، فهي تستخدم محرك LibreOffice أيضًا لكنها تقبل صيغ Microsoft مباشرة. + +## أدوات ذات صلة + +- [Word إلى PDF](./word-to-pdf) +- [RTF إلى PDF](./rtf-to-pdf) +- [نص إلى PDF](./txt-to-pdf) diff --git a/docs/ar/tools/organize-pdf.md b/docs/ar/tools/organize-pdf.md new file mode 100644 index 00000000..bbfca2ed --- /dev/null +++ b/docs/ar/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: تنظيم ونسخ الصفحات +description: أعد ترتيب صفحات PDF وكرّرها واحذفها باستخدام الصور المصغرة بالسحب والإفلات أو بإدخال ترتيب مخصص للصفحات. +--- + +# تنظيم ونسخ الصفحات + +أعد ترتيب صفحات ملف PDF وكرّرها واحذفها عبر واجهة مرئية بالسحب والإفلات. تظهر كل صفحة كصورة مصغرة يمكنك نقلها أو نسخها أو حذفها قبل حفظ النتيجة كملف جديد. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا. +2. تعرض الأداة شبكة من الصور المصغرة لكل صفحة. +3. اسحب الصور المصغرة لإعادة ترتيب الصفحات، أو انقر على زر النسخ الأخضر لتكرار صفحة، أو انقر على زر الحذف الأحمر لإزالتها. +4. أو أدخل ترتيبًا مخصصًا للصفحات في حقل النص (مثل `3, 1, 2, 4`) وانقر على **تطبيق الترتيب** لإعادة ترتيب جميع الصفحات دفعة واحدة. +5. انقر على زر المعالجة لإنشاء ملف PDF المعاد تنظيمه وتنزيله. + +## الميزات + +- إعادة ترتيب الصفحات بالسحب والإفلات مع انتقالات متحركة +- أزرار نسخ وحذف لكل صفحة +- حقل ترتيب مخصص للصفحات لإعادة ترتيب دقيقة +- تتحدث أرقام الصفحات تلقائيًا بعد كل تغيير +- يمنع حذف آخر صفحة متبقية + +## حالات الاستخدام + +- نقل صفحة في غير موضعها إلى المكان الصحيح في تقرير +- تكرار صفحة نموذج للحصول على عدة نسخ فارغة في ملف واحد +- إزالة الصفحات المبدئية أو النائبة قبل توزيع المستند +- عكس ترتيب الصفحات أو خلطها استعدادًا للطباعة +- إنشاء تسلسل مخصص للصفحات دون إعادة دمج ملفات منفصلة + +## نصائح + +- يتوقع حقل الترتيب المخصص أرقام الصفحات الأصلية مفصولة بفواصل. ويجب أن يتضمن كل صفحة مرة واحدة بالضبط، دون حذف أو تكرار. +- بعد تكرار صفحة، تشير النسختان إلى فهرس الصفحة الأصلية نفسه. ويعمل إعادة ترتيب أي من النسختين بشكل مستقل. +- للعمليات الجماعية على عدة ملفات أو لسير العمل الأكثر تقدمًا، فكّر في استخدام [أداة PDF المتعددة](./pdf-multi-tool) بدلًا من ذلك. + +## أدوات ذات صلة + +- [دمج PDF](./merge-pdf) +- [حذف الصفحات](./delete-pages) +- [أداة PDF المتعددة](./pdf-multi-tool) +- [عكس الصفحات](./reverse-pages) diff --git a/docs/ar/tools/page-dimensions.md b/docs/ar/tools/page-dimensions.md new file mode 100644 index 00000000..19da9c53 --- /dev/null +++ b/docs/ar/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: أبعاد الصفحة +description: حلّل أحجام صفحات PDF واتجاهاتها ونسب أبعادها ودورانها. اكتشف المستندات ذات الأحجام المختلطة وصدّر البيانات إلى CSV. +--- + +# أبعاد الصفحة + +أداة تشخيصية تقرأ كل صفحة في ملف PDF وتعرض أبعادها الدقيقة واتجاهها واسم حجمها القياسي ونسبة أبعادها ومساحتها ودورانها. مفيدة لاكتشاف الصفحات ذات الأحجام المختلفة قبل الطباعة أو لتوثيق خصائص ملف PDF استلمته. + +## طريقة العمل + +1. ارفع ملف PDF. يبدأ التحليل تلقائيًا، فلا يوجد زر للضغط عليه. +2. تعرض لوحة الملخص إجمالي الصفحات وعدد الأحجام الفريدة وما إذا كان المستند يحتوي على أحجام مختلطة. +3. تصفّح جدول النتائج الكامل مع تفاصيل كل صفحة. +4. بدّل وحدات العرض بين النقاط والبوصات والمليمترات والبكسلات. +5. انقر على **تصدير إلى CSV** لحفظ البيانات. + +## الحقول المعروضة + +| العمود | الوصف | +| ----------------------- | ------------------------------------------- | +| رقم الصفحة | رقم الصفحة التسلسلي | +| الأبعاد | العرض × الارتفاع بالوحدة المحددة | +| الحجم القياسي | الاسم المطابق (A4 وLetter وغيرها) أو "مخصص" | +| الاتجاه | عمودي أو أفقي | +| نسبة العرض إلى الارتفاع | نسبة العرض إلى الارتفاع كعدد عشري | +| المساحة | مساحة الصفحة بمربع الوحدة المحددة | +| Rotation | دوران الصفحة بالدرجات | + +## الميزات + +- اكتشاف تلقائي لأحجام الورق القياسية (A3 وA4 وA5 وLetter وLegal وTabloid وغيرها) +- تحذير من المستند ذي الأحجام المختلطة مع تفصيل الأحجام الموجودة وعدد الصفحات التي تستخدم كل حجم +- تحويل الوحدات بين النقاط والبوصات والمليمترات والبكسلات (بدقة 96 PPI) +- تصدير CSV للاستخدام في جداول البيانات أو أنظمة التوثيق + +## حالات الاستخدام + +- التحقق من أن جميع الصفحات بحجم A4 قبل تسليم المستند إلى المطبعة +- تشخيص سبب طباعة ملف PDF مدموج بهوامش غير متوقعة في بعض الصفحات +- توثيق تخطيط صفحات أرشيف PDF كبير لسجلات البيانات الوصفية +- تحديد الصفحات المدارة التي تحتاج إلى تصحيح + +## نصائح + +- إذا أظهر الملخص "أحجام مختلفة"، فاستخدم أداة توحيد حجم الصفحة لتوحيد الأحجام قبل الطباعة. +- يساعد حقل الدوران على تحديد الصفحات التي تُعرض بشكل صحيح لكن لها خاصية دوران غير صفرية، وقد تسبب مشاكل في بعض سير العمل. + +## أدوات ذات صلة + +- [توحيد حجم الصفحة](./fix-page-size) (وحّد الصفحات بعد تحديد الأحجام المختلطة) +- [ضغط PDF](./compress-pdf) (حسّن ملف PDF بعد إصلاح مشاكل الصفحات) +- [تدوير PDF](./rotate-pdf) (صحّح الصفحات المدارة) diff --git a/docs/ar/tools/page-numbers.md b/docs/ar/tools/page-numbers.md new file mode 100644 index 00000000..e4c22b97 --- /dev/null +++ b/docs/ar/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: أرقام الصفحات +description: أضف أرقام صفحات قابلة للتخصيص في أي موضع على صفحات PDF مع خط وحجم ولون قابلة للضبط. +--- + +# أرقام الصفحات + +أضف أرقام صفحات ظاهرة إلى كل صفحة في ملف PDF. أنت تختار الموضع والصيغة وحجم الخط واللون، وتتولى الأداة الباقي. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اضبط إعدادات أرقام الصفحات في لوحة الخيارات التي تظهر. +3. انقر على **إضافة أرقام الصفحات** للمعالجة. +4. يتم تنزيل ملف PDF المرقّم تلقائيًا. + +## الخيارات + +- **الموضع**: اختر موضع ظهور أرقام الصفحات: أسفل المنتصف أو أسفل اليسار أو أسفل اليمين أو أعلى المنتصف أو أعلى اليسار أو أعلى اليمين. +- **التنسيق**: اختر بين الترقيم البسيط (1، 2، 3...) أو صيغة "صفحة X من Y" (1 / 5، 2 / 5...). +- **حجم الخط**: حدد حجم نص رقم الصفحة. القيمة الافتراضية 12. +- **اللون**: اختر أي لون لنص رقم الصفحة باستخدام منتقي الألوان. + +## الميزات + +- ستة خيارات للموضع تغطي جميع الزوايا ومواضع المنتصف +- صيغتان للترقيم: تسلسلي بسيط أو "صفحة X من Y" +- حجم خط قابل للتخصيص من 6 إلى 72 نقطة +- منتقي ألوان كامل للون النص +- معالجة تلقائية للهوامش تُبقي الأرقام ضمن المناطق الآمنة مهما كان حجم الصفحة + +## حالات الاستخدام + +- تجهيز المستندات للطباعة التي تحتاج إلى مراجع صفحات ظاهرة +- إضافة أرقام الصفحات إلى ملف PDF مدموج من عدة ملفات مصدر +- ترقيم ملازم العروض التقديمية قبل توزيعها +- إضافة ترقيم تسلسلي إلى المستندات القانونية أو العقود + +## نصائح + +- صيغة "صفحة X من Y" مفيدة للمستندات التي يحتاج القراء فيها إلى معرفة الطول الإجمالي، مثل العروض والتقارير. +- إذا كنت تحتاج إلى أنماط ترقيم مختلفة لأقسام مختلفة (مثل الأرقام الرومانية للمقدمة)، فاستخدم أداة [إضافة تسميات الصفحات](./add-page-labels) بدلًا من ذلك. + +## أدوات ذات صلة + +- [إضافة تسميات الصفحات](./add-page-labels) +- [ترقيم بيتس](./bates-numbering) +- [رأس وتذييل](./header-footer) diff --git a/docs/ar/tools/pdf-booklet.md b/docs/ar/tools/pdf-booklet.md new file mode 100644 index 00000000..a1974ea8 --- /dev/null +++ b/docs/ar/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: كتيّب PDF +description: أعد ترتيب صفحات PDF بنظام الكتيب (التدبيس بالسرج) للطي والتدبيس في كتيب مطبوع. +--- + +# كتيّب PDF + +أعد ترتيب صفحات ملف PDF بنظام فرض الكتيب. عند الطباعة على الوجهين والطي من المنتصف، تظهر الصفحات بتسلسل القراءة الصحيح. هذا هو التخطيط المستخدم في الكتيبات المدبّسة بالسرج والمجلات الصغيرة (zines). + +## طريقة العمل + +1. ارفع ملف PDF. +2. اضبط إعدادات الكتيب: حجم صفحة الإخراج واتجاهها. +3. انقر على **إنشاء معاينة** لمعاينة كيفية ترتيب الصفحات على كل ورقة. +4. راجع المعاينة التي تعرض كل ورقة فعلية مع توزيع صفحات الوجه والظهر. +5. انقر على **تنزيل** لحفظ ملف PDF بترتيب الكتيب. + +## الميزات + +- إعادة ترتيب تلقائية للصفحات للتجليد بالسرج +- حجم صفحة إخراج قابل للضبط +- معاينة مرئية لتخطيط الكتيب قبل التنزيل +- يتعامل مع أعداد الصفحات الفردية بإدراج صفحات فارغة عند الحاجة +- يقيس صفحات المصدر لتناسب حجم ورقة الكتيب + +## حالات الاستخدام + +- إنشاء كتيبات أو مجلات صغيرة قابلة للطباعة من ملف PDF عادي +- تجهيز برامج المؤتمرات أو أدلة الفعاليات للطباعة الداخلية +- صنع بطاقات تهنئة مطوية أو كتالوجات صغيرة +- إنتاج كتيبات صغيرة أو مجموعات شعرية للتجليد اليدوي + +## نصائح + +- يُفضَّل أن يكون عدد صفحات ملف PDF المصدر من مضاعفات 4 للحصول على كتيب نظيف. وإن لم يكن كذلك، تُضاف صفحات فارغة تلقائيًا لإكمال الورقة الأخيرة. +- اطبع الناتج على الوجهين مع إعداد الطابعة "القلب على الحافة القصيرة"، ثم اطوِ جميع الأوراق معًا وثبّتها بالدبابيس عند الكعب. +- لوضع عدة صفحات على ورقة واحدة دون ترتيب الكتيب، استخدم [N-Up PDF](./n-up-pdf) بدلًا من ذلك. + +## أدوات ذات صلة + +- [N-Up PDF](./n-up-pdf) +- [تدوير PDF](./rotate-pdf) +- [إضافة صفحة فارغة](./add-blank-page) diff --git a/docs/ar/tools/pdf-layers.md b/docs/ar/tools/pdf-layers.md new file mode 100644 index 00000000..3b41ee64 --- /dev/null +++ b/docs/ar/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: طبقات PDF OCG +description: اعرض طبقات Optional Content Group (OCG) في مستند PDF وبدّل ظهورها وأضفها واحذفها. +--- + +# طبقات PDF OCG + +أدر مجموعات المحتوى الاختياري (OCG)، وتُسمى عادةً "الطبقات"، داخل ملف PDF. يمكنك تبديل ظهور الطبقات وإضافة طبقات جديدة (بما فيها الطبقات الفرعية المتداخلة) وحذف الطبقات وحفظ ملف PDF المعدّل. + +## طريقة العمل + +1. ارفع ملف PDF. +2. انقر على زر المعالجة لتحميل المستند بمحرك PyMuPDF. +3. تعرض الأداة جميع الطبقات الموجودة مع حالة ظهورها وحالة القفل والتسلسل الهرمي للتداخل. +4. بدّل مربعات الاختيار لإظهار الطبقات أو إخفائها. لا يمكن تبديل الطبقات المقفلة. +5. أضف طبقات جديدة من المستوى الأعلى بكتابة اسم والنقر على زر الإضافة، أو أضف طبقات فرعية تحت طبقة أصل موجودة. +6. احذف الطبقات التي لم تعد بحاجة إليها. +7. انقر على **تنزيل PDF المعدّل** لتنزيل ملف PDF المعدّل مع تطبيق تغييرات الطبقات. + +## الميزات + +- يعرض التسلسل الهرمي للطبقات مع إزاحة مناسبة للطبقات المتداخلة +- تبديل ظهور الطبقة بين التشغيل والإيقاف +- مؤشر الطبقة المقفلة يمنع التغييرات العرضية +- إضافة طبقات من المستوى الأعلى أو طبقات فرعية بأسماء مخصصة +- حذف الطبقات الفردية +- يحفظ جميع التغييرات في ملف PDF جديد + +## حالات الاستخدام + +- تبديل ظهور طبقات التعليقات في الرسومات المعمارية أو الهندسية +- إضافة طبقات تعليقات توضيحية جديدة إلى مستند تصميم متعدد الطبقات +- إزالة الطبقات القديمة من قالب قبل توزيعه +- فحص الطبقات الموجودة في ملف PDF معقد استلمته من طرف ثالث + +## نصائح + +- إذا لم يحتوِ ملف PDF على طبقات، تعرض الأداة حالة فارغة مع دعوة لإضافة طبقة. لا تستخدم كل ملفات PDF طبقات OCG، فهي أكثر شيوعًا في ملفات تصدير CAD وملفات التصميم. +- تظهر الطبقات الفرعية بإزاحة بصرية تحت الطبقة الأصل. يمكنك تداخل الطبقات إلى أي عمق. +- تُعرض الطبقات المقفلة بأيقونة قفل وتُعطَّل مربعات اختيارها. هذه الأقفال يضعها منشئ ملف PDF. + +## أدوات ذات صلة + +- [عرض البيانات الوصفية](./view-metadata) +- [تعديل البيانات الوصفية](./edit-metadata) +- [تنظيم ونسخ الصفحات](./organize-pdf) diff --git a/docs/ar/tools/pdf-multi-tool.md b/docs/ar/tools/pdf-multi-tool.md new file mode 100644 index 00000000..081c414d --- /dev/null +++ b/docs/ar/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: أداة PDF المتعددة +description: مدير صفحات شامل لدمج صفحات PDF وتقسيمها وتدويرها وتكرارها وحذفها وإعادة ترتيبها. +--- + +# أداة PDF المتعددة + +مساحة عمل موحدة لكل عمليات PDF على مستوى الصفحة. ارفع ملف PDF واحدًا أو أكثر وتعامل مع جميع صفحاتها في شبكة مرئية واحدة. دوّر وأعد الترتيب وكرّر واحذف وأدرج ملفات PDF جديدة وأضف صفحات فارغة وقسّم النتيجة، كل ذلك دون مغادرة الأداة. + +## طريقة العمل + +1. انقر على **رفع ملفات PDF** أو اسحب الملفات إلى منطقة الرفع. يمكنك رفع عدة ملفات. +2. تظهر جميع صفحات كل ملف مرفوع في شبكة قابلة للتمرير مع صور مصغرة. +3. استخدم شريط الأدوات أو أزرار الإجراءات لكل صفحة للتعامل مع الصفحات. +4. حدد الصفحات باستخدام مربع الاختيار في كل بطاقة، ثم طبّق العمليات الجماعية. +5. ضع نقاط تقسيم بأيقونة المقص لتقسيم الناتج إلى ملفات منفصلة. +6. انقر على **تصدير PDF** لتنزيل النتيجة النهائية. إذا وُجدت علامات تقسيم، يكون الناتج ملف ZIP يضم عدة ملفات PDF. + +## الميزات + +- **دمج**: ارفع عدة ملفات PDF وستُدمج في مساحة عمل واحدة تلقائيًا +- **إعادة الترتيب**: اسحب بطاقات الصفحات وأفلتها لإعادة ترتيب التسلسل +- **تدوير**: تدوير لكل صفحة أو جماعي بمقدار 90 درجة (يسارًا أو يمينًا) +- **تكرار**: انسخ أي صفحة بنقرة واحدة +- **حذف**: احذف صفحات فردية أو احذف المحددة منها دفعة واحدة +- **إدراج PDF**: أضف ملف PDF جديدًا بعد أي صفحة محددة +- **إضافة صفحة فارغة**: أضف صفحة A4 فارغة في النهاية +- **تقسيم**: ضع علامات تقسيم بين الصفحات، ثم صدّر كملف ZIP من ملفات PDF منفصلة +- **تحديد الكل / إلغاء تحديد الكل**: تحديد سريع للعمليات الجماعية +- **تراجع / إعادة**: سجل كامل للتراجع والإعادة لكل عملية +- **تنزيل المحدد**: صدّر الصفحات المحددة فقط كملف PDF مستقل +- يصلح ملفات PDF التالفة تلقائيًا قبل التحميل + +## حالات الاستخدام + +- إنشاء مستند مخصص من صفحات عدة ملفات PDF مصدر +- تنظيف مستند ممسوح ضوئيًا بحذف الصفحات الفارغة وتدوير الصفحات الجانبية وإعادة ترتيب الأقسام +- تقسيم ملف PDF كبير عند حدود الفصول باستخدام علامات تقسيم مرئية +- تعديل سريع على مستوى الصفحة دون الحاجة إلى محرر PDF كامل + +## نصائح + +- يتتبع نظام التراجع والإعادة كل عملية. استخدمه بحرية، فلا يمكنك إتلاف عملك عن طريق الخطأ. +- تظهر علامات التقسيم كخطوط زرقاء متقطعة بين الصفحات. ضعها بصريًا حيث تريد تقسيم المستند، ثم صدّر للحصول على ملف ZIP. +- لمهام الدمج أو التقسيم البسيطة، قد تكون أداتا [دمج PDF](./merge-pdf) و[تقسيم PDF](./split-pdf) المخصصتان أسرع. تتألق الأداة المتعددة عندما تحتاج إلى عدة عمليات في جلسة واحدة. + +## أدوات ذات صلة + +- [دمج PDF](./merge-pdf) +- [تقسيم PDF](./split-pdf) +- [تنظيم ونسخ الصفحات](./organize-pdf) +- [تدوير PDF](./rotate-pdf) diff --git a/docs/ar/tools/pdf-to-bmp.md b/docs/ar/tools/pdf-to-bmp.md new file mode 100644 index 00000000..f039b560 --- /dev/null +++ b/docs/ar/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF إلى BMP +description: حوّل صفحات PDF إلى صور BMP غير مضغوطة. مفيد للأنظمة القديمة وسير عمل الطباعة التي تتطلب مدخلات نقطية. +--- + +# PDF إلى BMP + +يحوّل كل صفحة من ملف PDF إلى صورة BMP (Bitmap). BMP صيغة غير مضغوطة، لذا يكون الناتج مطابقًا للأصل بكسلًا ببكسل دون فقدان في الجودة، لكن الملفات كبيرة. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. انقر على **تحويل** لمعالجة الملف. +3. يتم تنزيل ملف `.bmp` واحد أو أرشيف ZIP تلقائيًا. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُعرض الصفحات بمقياس ثابت 2x، مما ينتج صورًا بحجم يقارب ضعف أبعاد الصفحة الأصلية في ملف PDF. + +## صيغة الناتج + +- **صفحة واحدة**: `filename.bmp` +- **عدة صفحات**: `filename_bmps.zip` يحتوي على `page_1.bmp` و`page_2.bmp` وهكذا. + +## حالات الاستخدام + +- تغذية الأنظمة أو الأجهزة القديمة التي لا تقبل إلا BMP بصفحات PDF. +- تجهيز صور غير مضغوطة لسير عمل طباعة معين. +- استخدام الناتج النقطي كمدخل لأدوات معالجة الصور التي تتطلب بيانات بكسلات خام. + +## نصائح + +- ملفات BMP كبيرة جدًا لأنها تخزن بيانات البكسلات الخام دون ضغط. في معظم الاستخدامات، تمنحك [PDF إلى PNG](./pdf-to-png) جودة دون فقدان بملفات أصغر بكثير. +- إذا كان نظامك الهدف يقبل PNG أو TIFF، ففضّل هاتين الصيغتين لتوفير مساحة القرص. + +## أدوات ذات صلة + +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى TIFF](./pdf-to-tiff) +- [PDF إلى JPG](./pdf-to-jpg) diff --git a/docs/ar/tools/pdf-to-cbz.md b/docs/ar/tools/pdf-to-cbz.md new file mode 100644 index 00000000..3cf0dced --- /dev/null +++ b/docs/ar/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF إلى CBZ +description: حوّل ملف PDF إلى ملف CBZ (أرشيف الكتب المصورة) لقارئات الكتب المصورة مثل Komga وKavita وCDisplayEx وCalibre. +--- + +# PDF إلى CBZ + +يحوّل ملف PDF إلى ملف CBZ (Comic Book ZIP)، وهي الصيغة القياسية للكتب المصورة الرقمية والمانغا. تصبح كل صفحة PDF صورة داخل الأرشيف. تنشئ الأداة البيانات الوصفية بثلاث صيغ لأقصى توافق: ComicInfo.xml وmetadata.opf وComicBookInfo JSON. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. اختر صيغة الصورة والجودة والمقياس والبيانات الوصفية الاختيارية. +3. انقر على **تحويل** لإنشاء ملف CBZ. +4. يتم تنزيل ملف `.cbz` تلقائيًا. + +## الخيارات + +| الخيار | القيم | الافتراضي | الوصف | +| ---------------------- | --------------- | --------- | ------------------------------------------------------------------------------------ | +| تنسيق الصورة | JPEG, PNG, WebP | JPEG | JPEG للكتب المصورة الملونة، وPNG للمانغا بالأبيض والأسود دون فقدان، وWebP لأفضل ضغط. | +| جودة الصورة | 50–100% | 85% | يتحكم في ضغط JPEG/WebP. مخفي مع PNG (دائمًا دون فقدان). | +| المقياس | 1.0x–4.0x | 2.0x | يعطي المقياس الأعلى صورًا أكثر حدة للشاشات عالية الدقة. | +| تدرج الرمادي | تشغيل/إيقاف | إيقاف | يحوّل الصفحات إلى تدرج الرمادي. يقلل حجم الملف للمحتوى بالأبيض والأسود. | +| وضع المانغا | تشغيل/إيقاف | إيقاف | يضبط اتجاه القراءة من اليمين إلى اليسار في البيانات الوصفية. | +| تضمين البيانات الوصفية | تشغيل/إيقاف | تشغيل | يضمّن ComicInfo.xml وmetadata.opf وComicBookInfo JSON. | + +## حقول البيانات الوصفية + +عند تفعيل البيانات الوصفية، يمكنك تعبئة ما يلي: + +- **العنوان**: يُكتشف تلقائيًا من اسم ملف PDF. +- **السلسلة**: اسم السلسلة (مثل "Naruto"). +- **الرقم (#)**: رقم العدد داخل السلسلة. +- **المجلد**: رقم المجلد. +- **المؤلف(ون)**: اسم الكاتب أو المبدع. +- **الناشر**: شركة النشر. +- **الوسوم / النوع**: وسوم مفصولة بفواصل (مثل "Action, Adventure"). +- **سنة النشر**: سنة النشر (1900–2100). +- **التقييم**: تقييم المجتمع من 0 إلى 5. + +## توافق البيانات الوصفية + +تكتب الأداة البيانات الوصفية بثلاث صيغ ليتمكن كل قارئ من العثور عليها: + +| الصيغة | الموقع | مدعومة من | +| ------------------ | ------------- | ------------------------------------------- | +| ComicInfo.xml | ملف داخل ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | ملف داخل ZIP | Calibre | +| ComicBookInfo JSON | حقل تعليق ZIP | Calibre (احتياطي) | + +## صيغة الناتج + +- `filename.cbz`: أرشيف ZIP يحتوي على صور الصفحات المرقّمة وملفات البيانات الوصفية. + +تُسمى صور الصفحات بأرقام مسبوقة بأصفار (`01.jpg` و`02.jpg` وهكذا) لتعرضها القارئات بالترتيب الصحيح. + +## حالات الاستخدام + +- تحويل ملفات PDF للمانغا أو الكتب المصورة لاستخدامها مع قارئات الكتب المصورة. +- بناء مكتبة كتب مصورة رقمية في Komga أو Kavita أو Calibre. +- تحويل الكتب المصورة الممسوحة ضوئيًا إلى صيغة مناسبة للقارئات. +- مشاركة الكتب المصورة بصيغة تحافظ على اتجاه القراءة والبيانات الوصفية. + +## نصائح + +- استخدم **JPEG** للكتب المصورة الملونة و**PNG** للمانغا بالأبيض والأسود، فـ PNG يضغط المحتوى بالأبيض والأسود بكفاءة عالية. +- فعّل **تحويل إلى تدرج الرمادي** للمانغا لتقليل حجم الملف بشكل كبير. +- املأ حقلي **السلسلة** و**الرقم (#)** ليتمكن مديرو المكتبات (Komga وCalibre) من تنظيم مجموعتك تلقائيًا. +- يوفر **WebP** أفضل ضغط، لكن قارئات الكتب المصورة الأقدم قد لا تدعمه. + +## أدوات ذات صلة + +- [PDF إلى JPG](./pdf-to-jpg) +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى TIFF](./pdf-to-tiff) +- [استخراج الصور](./extract-images) diff --git a/docs/ar/tools/pdf-to-csv.md b/docs/ar/tools/pdf-to-csv.md new file mode 100644 index 00000000..947a2da3 --- /dev/null +++ b/docs/ar/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF إلى CSV +description: استخرج الجداول من مستندات PDF وصدّرها كملف CSV واحد. يتعامل مع ملفات PDF متعددة الصفحات مع اكتشاف تلقائي للجداول. +--- + +# PDF إلى CSV + +يستخرج الجداول من ملف PDF ويصدّرها كملف CSV. تفحص الأداة كل صفحة بحثًا عن بيانات جدولية باستخدام محرك اكتشاف الجداول في PyMuPDF، ثم تكتب جميع الصفوف التي عثرت عليها في ناتج واحد مفصول بفواصل. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. انقر على **تحويل إلى CSV** لبدء استخراج الجداول. +3. تفحص الأداة كل صفحة وتحدد الجداول تلقائيًا. +4. يتم تنزيل ملف `.csv` يحتوي على جميع بيانات الجداول المستخرجة. + +تُفصل الجداول من الصفحات المختلفة بصفوف فارغة في الناتج. وتُهرَّب الخلايا التي تحتوي على فواصل أو علامات اقتباس أو أسطر جديدة بشكل صحيح وفق RFC 4180. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُستخرج جميع الجداول الموجودة في المستند وتُدمج في ملف CSV واحد. + +## صيغة الناتج + +- ملف `filename.csv` واحد يحتوي على جميع الجداول المكتشفة. + +## حالات الاستخدام + +- سحب البيانات المالية من كشوف الحسابات البنكية أو الفواتير بصيغة PDF إلى جدول بيانات. +- استخراج جداول الأسعار من عروض الموردين للمقارنة. +- تحويل البيانات البحثية الجدولية من أوراق PDF إلى صيغة مناسبة لأدوات التحليل. +- ترحيل البيانات من تقارير PDF القديمة إلى قواعد البيانات. + +## نصائح + +- إذا لم يتم العثور على جداول، تعرض الأداة رسالة "لم يتم العثور على جداول". يعني هذا عادةً أن ملف PDF يستخدم تخطيط نص يبدو جدوليًا لكنه غير مبني كجدول فعلي. +- لمزيد من التحكم في الجداول الفردية، استخدم [استخراج الجداول](./extract-tables) التي تتيح لك الاختيار بين صيغ الناتج CSV وJSON وMarkdown. +- إذا كنت تحتاج إلى البيانات بصيغة Excel مع ورقة منفصلة لكل جدول، فاستخدم [PDF إلى Excel](./pdf-to-excel). + +## أدوات ذات صلة + +- [PDF إلى Excel](./pdf-to-excel) +- [استخراج الجداول](./extract-tables) +- [PDF إلى نص](./pdf-to-text) diff --git a/docs/ar/tools/pdf-to-excel.md b/docs/ar/tools/pdf-to-excel.md new file mode 100644 index 00000000..243a181b --- /dev/null +++ b/docs/ar/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF إلى Excel +description: استخرج الجداول من مستندات PDF إلى جدول بيانات Excel. يحصل كل جدول على ورقة عمل خاصة به مع مرجع الصفحة. +--- + +# PDF إلى Excel + +يستخرج الجداول من ملف PDF ويحفظها كجدول بيانات Excel (`.xlsx`). يوضع كل جدول مكتشف في ورقة عمل خاصة به، مسمّاة برقم الجدول وصفحة المصدر. يعتمد على PyMuPDF لاكتشاف الجداول ومكتبة SheetJS لإنشاء ملف Excel. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. انقر على **تحويل إلى Excel** لبدء استخراج الجداول. +3. تفحص الأداة كل صفحة بحثًا عن الجداول، ثم تبني مصنّف Excel. +4. يتم تنزيل ملف `.xlsx` بورقة واحدة لكل جدول. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُستخرج جميع الجداول المكتشفة تلقائيًا. + +## صيغة الناتج + +- ملف `filename.xlsx` واحد. +- **جدول واحد**: ورقة عمل واحدة باسم "Table". +- **عدة جداول**: أوراق عمل بأسماء مثل "Table 1 (Page 3)" و"Table 2 (Page 5)" وهكذا. تُقتطع أسماء الأوراق إلى 31 حرفًا (حد Excel). + +## حالات الاستخدام + +- تحويل التقارير المالية بصيغة PDF إلى جداول بيانات قابلة للتعديل لمزيد من التحليل. +- استخراج جداول المخزون أو الطلبات من ملفات PDF الخاصة بالموردين. +- سحب البيانات المنظمة من نماذج أو كتالوجات PDF إلى Excel للفرز والتصفية. +- أرشفة بيانات PDF الجدولية بصيغة يستطيع الزملاء غير التقنيين العمل بها. + +## نصائح + +- إذا أبلغت الأداة عن "لم يتم العثور على جداول"، فالأرجح أن ملف PDF يستخدم تخطيط نص حرًا بدلًا من جداول منظمة. جرّب [PDF إلى نص](./pdf-to-text) للحصول على المحتوى الخام بدلًا من ذلك. +- لصيغة مسطحة أبسط، استخدم [PDF إلى CSV](./pdf-to-csv). ولتنزيلات لكل جدول بعدة صيغ، استخدم [استخراج الجداول](./extract-tables). +- راجع أسماء الأوراق لمعرفة الصفحة التي جاء منها كل جدول. + +## أدوات ذات صلة + +- [PDF إلى CSV](./pdf-to-csv) +- [استخراج الجداول](./extract-tables) +- [PDF إلى نص](./pdf-to-text) diff --git a/docs/ar/tools/pdf-to-greyscale.md b/docs/ar/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..0387d2dd --- /dev/null +++ b/docs/ar/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF إلى تدرج الرمادي +description: حوّل ملف PDF الملون إلى نسخة بتدرج الرمادي (أبيض وأسود). ينتج ملف PDF جديدًا أُزيل منه اللون من كل صفحة. +--- + +# PDF إلى تدرج الرمادي + +يحوّل ملف PDF ملونًا إلى نسخة بتدرج الرمادي. تُعرض كل صفحة وتُزال منها التشبع اللوني ثم تُضمَّن من جديد كصورة JPEG في ملف PDF جديد. يحافظ الناتج على أبعاد الصفحة الأصلية. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. انقر على **تحويل إلى تدرج رمادي** لمعالجة الملف. +3. يتم تنزيل ملف `greyscale.pdf` جديد بجميع صفحاته محولة إلى الأبيض والأسود. + +في الخلفية، تُعرض كل صفحة بمقياس 2x، وتمرَّر بيانات البكسلات عبر مرشح تدرج الرمادي، ثم تُرمَّز من جديد كصورة JPEG بجودة 90% وتوضع في مستند PDF جديد. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. يستخدم تحويل تدرج الرمادي معادلة السطوع القياسية، وجودة JPEG ثابتة عند 90%. + +## صيغة الناتج + +- ملف `greyscale.pdf` واحد يحتوي على جميع الصفحات كصور JPEG بتدرج الرمادي. + +## حالات الاستخدام + +- تجهيز المستندات للطباعة بالأبيض والأسود لتوفير تكلفة الحبر الملون. +- تلبية متطلبات التقديم في الملفات القانونية أو الحكومية التي تشترط تدرج الرمادي. +- تقليل حجم الملفات الغنية بالألوان (صور JPEG بتدرج الرمادي أصغر من الملونة). +- إنشاء أسلوب بصري موحد عبر مستندات تحتوي على صفحات ملونة وأخرى بالأبيض والأسود. + +## نصائح + +- بما أن كل صفحة تُحوَّل إلى صورة وتُضمَّن كـ JPEG، فإن الناتج قائم على الصور. لن يكون النص في ملف PDF الأصلي قابلًا للتحديد أو البحث بعد ذلك. إذا كنت تحتاج إلى نص قابل للبحث لاحقًا، فمرّر الناتج عبر أداة OCR. +- لمزيد من التحكم في تعديلات الألوان (السطوع والتباين والتشبع)، راجع أداة "ضبط الألوان" أو عقدة "PDF إلى تدرج الرمادي" في [منشئ سير عمل PDF](./pdf-workflow). + +## أدوات ذات صلة + +- [PDF إلى JPG](./pdf-to-jpg) +- [PDF إلى PNG](./pdf-to-png) +- [منشئ سير عمل PDF](./pdf-workflow) diff --git a/docs/ar/tools/pdf-to-jpg.md b/docs/ar/tools/pdf-to-jpg.md new file mode 100644 index 00000000..e8d7935f --- /dev/null +++ b/docs/ar/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF إلى JPG +description: حوّل صفحات PDF إلى صور JPG بجودة قابلة للضبط. تُنزَّل ملفات PDF ذات الصفحة الواحدة مباشرة، وتُصدَّر متعددة الصفحات كملف ZIP. +--- + +# PDF إلى JPG + +يحوّل كل صفحة من ملف PDF إلى صورة JPG. تُنزَّل المستندات ذات الصفحة الواحدة كملف `.jpg` مستقل. أما ملفات PDF متعددة الصفحات فتنتج أرشيف ZIP يحتوي على صورة JPG لكل صفحة. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. تعرض الأداة اسم الملف وحجمه وعدد صفحاته. +2. اضبط شريط **جودة الصورة** للتحكم في ضغط JPG. +3. انقر على **تحويل** لبدء المعالجة. +4. يتم تنزيل النتيجة تلقائيًا: صورة JPG واحدة لملفات PDF ذات الصفحة الواحدة، أو ملف ZIP للمستندات متعددة الصفحات. + +## الخيارات + +- **جودة الصورة**: شريط من 0% إلى 100% (الافتراضي 90%). تنتج القيم الأعلى صورًا أكثر حدة بحجم ملف أكبر. وتضغط القيم الأقل بشكل أشد. + +تُعرض الصفحات داخليًا بمقياس 2x، لذا تكون دقة الناتج ضعف أبعاد صفحة PDF. تنتج صفحة بحجم Letter القياسي صورة بحجم 1,224 × 1,584 بكسل تقريبًا. + +## صيغة الناتج + +- **صفحة واحدة**: `filename.jpg` +- **عدة صفحات**: `filename_jpgs.zip` يحتوي على `page_1.jpg` و`page_2.jpg` وهكذا. + +## حالات الاستخدام + +- إنشاء صور مصغرة للمعاينة في نظام إدارة المستندات. +- مشاركة صفحة من تقرير في محادثة أو بريد إلكتروني لا يدعم PDF. +- إنشاء أصول صور من مخططات أو رسومات PDF. +- أرشفة المستندات الممسوحة ضوئيًا كصور فردية. + +## نصائح + +- للحصول على ناتج دون فقدان، استخدم [PDF إلى PNG](./pdf-to-png) بدلًا من ذلك. +- يحقق إعداد جودة 80-90% توازنًا جيدًا بين حجم الملف والدقة البصرية. +- إذا كنت تحتاج إلى صيغة محددة لكل صفحة، ففكّر في [منشئ سير عمل PDF](./pdf-workflow) الذي يحتوي على عقدة إخراج "PDF إلى صور". + +## أدوات ذات صلة + +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى WebP](./pdf-to-webp) +- [PDF إلى BMP](./pdf-to-bmp) +- [PDF إلى TIFF](./pdf-to-tiff) diff --git a/docs/ar/tools/pdf-to-json.md b/docs/ar/tools/pdf-to-json.md new file mode 100644 index 00000000..ae3cf127 --- /dev/null +++ b/docs/ar/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF إلى JSON +description: حوّل ملفات PDF إلى صيغة JSON منظمة باستخدام CPDF. يصدّر البنية الداخلية لـ PDF كبيانات JSON قابلة للقراءة آليًا. +--- + +# PDF إلى JSON + +يحوّل ملف PDF واحدًا أو أكثر إلى صيغة JSON. تستخدم الأداة CPDF (Coherent PDF) لتسلسل البنية الداخلية لكل ملف PDF إلى تمثيل JSON قابل للقراءة آليًا. يُسلَّم الناتج دائمًا كأرشيف ZIP. + +## طريقة العمل + +1. اختر ملف PDF واحدًا أو أكثر باستخدام منتقي الملفات. +2. انقر على **تحويل إلى JSON** لبدء المعالجة. يعمل التحويل في web worker في الخلفية. +3. يتم تنزيل أرشيف ZIP يحتوي على ملف JSON واحد لكل ملف PDF مدخل. + +يعرض شريط الحالة التقدم خلال مرحلتي التحويل وإنشاء ZIP. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. يتم تحويل كل ملف PDF إلى تمثيل JSON الكامل له. + +## صيغة الناتج + +- ملف `pdfs-to-json.zip` يحتوي على `filename.json` لكل ملف PDF مدخل. + +يمثّل ناتج JSON بنية كائنات PDF الداخلية، بما في ذلك أشجار الصفحات ومراجع الخطوط والبيانات الوصفية وتدفقات المحتوى. + +## حالات الاستخدام + +- فحص البنية الداخلية لملف PDF لأغراض تصحيح الأخطاء أو التحقق. +- استخراج البيانات الوصفية وخصائص الصفحات المنظمة برمجيًا. +- تغذية خطوط معالجة مخصصة ببيانات بنية PDF. +- تدقيق مستندات PDF للامتثال عبر تحليل أشجار كائناتها. + +## نصائح + +- تُخرج هذه الأداة بنية كائنات PDF الخام، وليس محتوى النص المستخرج. إذا كنت تحتاج إلى نص الصفحات بصيغة JSON، فاستخدم [تحضير PDF للذكاء الاصطناعي](./prepare-pdf-for-ai) بدلًا من ذلك. +- لاستخراج النص العادي، تكون [PDF إلى نص](./pdf-to-text) أكثر مباشرة. +- تنتج ملفات PDF الكبيرة ذات البنى المعقدة ملفات JSON كبيرة جدًا. + +## أدوات ذات صلة + +- [PDF إلى نص](./pdf-to-text) +- [تحضير PDF للذكاء الاصطناعي](./prepare-pdf-for-ai) +- [استخراج الجداول](./extract-tables) diff --git a/docs/ar/tools/pdf-to-markdown.md b/docs/ar/tools/pdf-to-markdown.md new file mode 100644 index 00000000..086a11e5 --- /dev/null +++ b/docs/ar/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF إلى Markdown +description: حوّل مستندات PDF إلى صيغة Markdown مع استخراج اختياري للصور. يدعم التحويل الجماعي لعدة ملفات. +--- + +# PDF إلى Markdown + +يحوّل ملفات PDF إلى صيغة Markdown (`.md`) مع الحفاظ على العناوين والفقرات والقوائم والتنسيق الأساسي. ويمكنه اختياريًا استخراج الصور المضمّنة وإدراجها. يدعم التحويل الفردي والجماعي. يعتمد على PyMuPDF. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإفلات أو بسحب الملفات إليها. +2. بدّل خيار **تضمين الصور بصيغة base64** اختياريًا لتضمين الصور المستخرجة في ناتج Markdown. +3. انقر على **تحويل إلى Markdown** لبدء المعالجة. +4. يتم تنزيل الملف الواحد باسم `filename.md`. أما الملفات المتعددة فتنتج `markdown-files.zip`. + +## الخيارات + +- **تضمين الصور بصيغة base64**: عند تفعيله، تُستخرج الصور المضمّنة من ملف PDF ويُشار إليها في ناتج Markdown. وعند تعطيله، يُحوَّل محتوى النص فقط. + +## صيغة الناتج + +- **ملف واحد**: `filename.md` +- **عدة ملفات**: `markdown-files.zip` يحتوي على ملف `.md` واحد لكل ملف PDF مدخل. + +## حالات الاستخدام + +- تحويل وثائق PDF إلى Markdown لمولّد مواقع ثابتة مثل VitePress أو Hugo أو Jekyll. +- تحويل الأوراق البحثية بصيغة PDF إلى Markdown قابل للتعديل لتطبيقات تدوين الملاحظات مثل Obsidian. +- ترحيل قواعد المعرفة القديمة بصيغة PDF إلى صيغة نصية مناسبة لـ Git. +- استخراج المحتوى المنظم من كتب PDF الإلكترونية لإعادة تنسيقه. + +## نصائح + +- خيار "تضمين الصور بصيغة base64" مفيد عندما يحتوي ملف PDF على مخططات أو أشكال أساسية للمحتوى. عطّله للمستندات النصية الكثيفة للحفاظ على نظافة الناتج. +- قد تنتج التخطيطات المعقدة ذات الأشرطة الجانبية أو الحواشي السفلية أو النص متعدد الأعمدة ملف Markdown غير مثالي. راجع الناتج وعدّله حسب الحاجة. +- للحصول على نص خام دون أي تنسيق، استخدم [PDF إلى نص](./pdf-to-text) بدلًا من ذلك. + +## أدوات ذات صلة + +- [PDF إلى نص](./pdf-to-text) +- [PDF إلى Word](./pdf-to-word) +- [تحضير PDF للذكاء الاصطناعي](./prepare-pdf-for-ai) diff --git a/docs/ar/tools/pdf-to-pdfa.md b/docs/ar/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..6fb491b7 --- /dev/null +++ b/docs/ar/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF إلى PDF/A +description: حوّل ملفات PDF العادية إلى صيغة PDF/A للأرشفة طويلة الأمد. يدعم مستويات المطابقة PDF/A-1b وPDF/A-2b وPDF/A-3b. +--- + +# PDF إلى PDF/A + +PDF/A هو مجموعة فرعية من PDF موحّدة بمعيار ISO ومصممة للحفظ الرقمي طويل الأمد. تحوّل هذه الأداة ملفات PDF العادية إلى مستندات متوافقة مع PDF/A باستخدام Ghostscript الذي يعمل مباشرة في متصفحك. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. +2. اختر **إصدار PDF/A** من القائمة المنسدلة. +3. فعّل اختياريًا **تسطيح PDF مسبقًا** للملفات المعقدة التي يفشل تحويلها العادي. +4. انقر على **تحويل إلى PDF/A**. تنتج الملفات المتعددة أرشيف ZIP. + +## إصدارات PDF/A + +| الإصدار | القيود | الأفضل لـ | +| ------------ | -------------------------------------- | ---------------------------------------- | +| **PDF/A-1b** | الأكثر صرامة. بدون شفافية وبدون طبقات. | أقصى توافق مع أنظمة الأرشفة الأقدم | +| **PDF/A-2b** | يسمح بالشفافية وJPEG2000. | الأرشفة العامة (موصى به) | +| **PDF/A-3b** | يسمح بالمرفقات المضمّنة بأي صيغة. | أرشفة المستندات مع ملفات البيانات المصدر | + +يكون PDF/A-2b محددًا افتراضيًا ويناسب الغالبية العظمى من احتياجات الأرشفة. + +## خيار Pre-flatten + +تحتوي بعض ملفات PDF على ميزات تمنع التحويل النظيف إلى PDF/A، مثل ترميزات خطوط غير شائعة أو تراكبات شفافية معقدة أو بنى داخلية تالفة. يؤدي تفعيل **تسطيح PDF مسبقًا** إلى تحويل PDF إلى صور نقطية بدقة 300 DPI قبل التحويل، مما يضمن المطابقة على حساب جعل النص غير قابل للتحديد. استخدمه كحل احتياطي عندما ينتج التحويل العادي أخطاء. + +يتطلب Pre-flatten محرك PyMuPDF WASM. + +## حالات الاستخدام + +- تلبية متطلبات الأرشفة الحكومية أو القانونية (تشترط ولايات قضائية كثيرة PDF/A في ملفات المحاكم) +- تقديم المستندات إلى المستودعات المؤسسية أو المكتبات الرقمية +- حفظ سجلات الأعمال التي قد لا يبقى البرنامج الأصلي لها موجودًا بعد عشر سنوات +- تجهيز الفواتير لمعايير الفوترة الإلكترونية التي تتطلب PDF/A-3b مع مرفقات XML + +## نصائح + +- جرّب التحويل دون pre-flatten أولًا. فعّله فقط إذا ظهر خطأ. +- يضمّن PDF/A جميع الخطوط، لذا تكون ملفات الناتج غالبًا أكبر من الأصلية. +- تحقق من الناتج في أداة تحقق مخصصة لـ PDF/A إذا كان الامتثال الصارم مطلوبًا في سير عملك. + +## أدوات ذات صلة + +- [ضغط PDF](./compress-pdf) (قلّل حجم الملف بعد التحويل) +- [تسطيح PDF](./flatten-pdf) (سطّح النماذج قبل التحويل إلى PDF/A) +- [إزالة البيانات الوصفية](./remove-metadata) (أزل البيانات الوصفية قبل الأرشفة) diff --git a/docs/ar/tools/pdf-to-png.md b/docs/ar/tools/pdf-to-png.md new file mode 100644 index 00000000..402ec937 --- /dev/null +++ b/docs/ar/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF إلى PNG +description: حوّل صفحات PDF إلى صور PNG دون فقدان بمقياس قابل للضبط. مثالي للقطات الشاشة عالية الجودة والخلفيات الشفافة. +--- + +# PDF إلى PNG + +يحوّل كل صفحة من ملف PDF إلى صورة PNG. يستخدم PNG ضغطًا دون فقدان، لذا يحافظ الناتج على كل تفصيل في الصفحة الأصلية. تُنزَّل ملفات PDF ذات الصفحة الواحدة كملف `.png`، وتنتج متعددة الصفحات ملف ZIP. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. اضبط شريط **مقياس الصورة** للتحكم في دقة الناتج. +3. انقر على **تحويل** لبدء المعالجة. +4. يتم تنزيل ملف PNG واحد أو أرشيف ZIP تلقائيًا. + +## الخيارات + +- **مقياس الصورة**: يتراوح من 1.0x إلى 3.0x (الافتراضي 2.0x). عند 2.0x، تُعرض صفحة بحجم Letter القياسي بحجم 1,224 × 1,584 بكسل تقريبًا. تنتج قيم المقياس الأعلى صورًا أكبر وأكثر حدة على حساب حجم الملف ووقت المعالجة. + +## صيغة الناتج + +- **صفحة واحدة**: `filename.png` +- **عدة صفحات**: `filename_pngs.zip` يحتوي على `page_1.png` و`page_2.png` وهكذا. + +## حالات الاستخدام + +- التقاط لقطات شاشة عالية الدقة لصفحات PDF للعروض التقديمية. +- استخراج المخططات أو الرسوم التي تحتاج إلى حواف حادة دون عيوب ضغط. +- تجهيز أصول تصميم الويب من نماذج PDF. +- إنشاء صور صفحات دون فقدان للمعالجة المسبقة قبل OCR. + +## نصائح + +- ملفات PNG أكبر بكثير من JPG. إذا كان حجم الملف أهم من الجودة المثالية، فاستخدم [PDF إلى JPG](./pdf-to-jpg) أو [PDF إلى WebP](./pdf-to-webp). +- عند المقياس 1.0x، يطابق الناتج الدقة الأصلية لملف PDF. ارفعه إلى 3.0x للتصدير بجودة الطباعة. + +## أدوات ذات صلة + +- [PDF إلى JPG](./pdf-to-jpg) +- [PDF إلى WebP](./pdf-to-webp) +- [PDF إلى SVG](./pdf-to-svg) diff --git a/docs/ar/tools/pdf-to-svg.md b/docs/ar/tools/pdf-to-svg.md new file mode 100644 index 00000000..62edccb1 --- /dev/null +++ b/docs/ar/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF إلى SVG +description: حوّل صفحات PDF إلى رسومات SVG متجهية قابلة للتحجيم. يحافظ على النصوص والأشكال كمسارات متجهية لتحجيم لا نهائي. +--- + +# PDF إلى SVG + +يحوّل كل صفحة من ملف PDF إلى ملف SVG (Scalable Vector Graphics). وعلى عكس الصيغ النقطية، يحافظ SVG على المسارات المتجهية والنصوص والأشكال، لذا يتحجّم الناتج إلى أي حجم دون تشوه بكسلي. يعتمد على PyMuPDF. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإفلات أو بسحب الملفات إليها. يمكنك إضافة عدة ملفات وإدارتها بشكل فردي. +2. انقر على **تحويل إلى SVG** لمعالجة جميع الملفات المرفوعة. +3. يتم تنزيل تحويل ملف واحد بصفحة واحدة كملف `.svg` مستقل. وفي غير ذلك يتم التنزيل كأرشيف ZIP. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُحوَّل كل صفحة إلى SVG باستخدام التصدير المتجهي الأصلي في PyMuPDF. + +## صيغة الناتج + +- **ملف واحد، صفحة واحدة**: `filename.svg` +- **ملف واحد، عدة صفحات**: `filename_svg.zip` يحتوي على `page_1.svg` و`page_2.svg` وهكذا. +- **عدة ملفات**: `pdf_to_svg.zip` مع ملفات منظمة حسب اسم المستند المصدر. + +## حالات الاستخدام + +- استخراج المخططات المتجهية أو الرسوم البيانية أو الرسومات التوضيحية من تقارير PDF لاستخدامها في صفحات الويب. +- تعديل محتوى صفحات PDF في محرر متجهي مثل Inkscape أو Illustrator. +- تضمين معاينات صفحات قابلة للتحجيم في تطبيقات الويب المتجاوبة. +- استخراج الشعارات أو الرسومات من كتيبات PDF مع الحفاظ على حدة الحواف. + +## نصائح + +- يعمل SVG بأفضل شكل مع ملفات PDF التي تحتوي على محتوى متجهي. ستنتج المستندات الممسوحة ضوئيًا أو ملفات PDF الكثيفة بالصور ملفات SVG كبيرة تحتوي على بيانات نقطية مضمّنة. +- للحصول على ناتج نقطي من ملفات PDF الكثيفة بالصور، استخدم [PDF إلى PNG](./pdf-to-png) أو [PDF إلى JPG](./pdf-to-jpg) بدلًا من ذلك. +- تدعم هذه الأداة التحويل الجماعي: ارفع عدة ملفات PDF دفعة واحدة لتحويلها كلها في تشغيل واحد. + +## أدوات ذات صلة + +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى JPG](./pdf-to-jpg) +- [PDF إلى Markdown](./pdf-to-markdown) diff --git a/docs/ar/tools/pdf-to-text.md b/docs/ar/tools/pdf-to-text.md new file mode 100644 index 00000000..7b2bff44 --- /dev/null +++ b/docs/ar/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF إلى نص +description: استخرج النص العادي من ملفات PDF. يدعم الاستخراج الجماعي لعدة ملفات PDF مع ناتج بصيغة ملفات TXT. +--- + +# PDF إلى نص + +يستخرج كل محتوى النص من ملفات PDF ويحفظه كملفات `.txt` عادية. يدعم المعالجة الجماعية: ارفع عدة ملفات PDF واستخرج نص كل منها في عملية واحدة. يعتمد على PyMuPDF. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإفلات أو بسحب الملفات إليها. أدر قائمة ملفاتك بزري "إضافة المزيد من الملفات" و"مسح الملفات". +2. انقر على **استخراج النص** لبدء المعالجة. +3. يتم تنزيل الملف الواحد باسم `filename.txt`. أما الملفات المتعددة فتنتج أرشيف `pdf-to-text.zip`. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. يُستخرج كل محتوى النص من كل صفحة بترتيب القراءة. + +## صيغة الناتج + +- **ملف واحد**: `filename.txt` +- **عدة ملفات**: `pdf-to-text.zip` يحتوي على ملف `.txt` واحد لكل ملف PDF مدخل. + +## حالات الاستخدام + +- استخراج نص المتن من تقارير PDF لفهرسة البحث في النص الكامل. +- تحويل كتب PDF الإلكترونية أو المقالات إلى نص عادي للقراءة على أجهزة الحبر الإلكتروني. +- سحب النص من العقود أو المستندات القانونية لتحليل الكلمات المفتاحية. +- إزالة التنسيق من ملفات PDF للحصول على نص نظيف لسكربتات معالجة البيانات. +- تجهيز مجموعة نصوص من أرشيفات PDF لمعالجة اللغات الطبيعية. + +## نصائح + +- ستنتج ملفات PDF الممسوحة ضوئيًا (الصور فقط) ملفات نصية فارغة لعدم وجود طبقة نص للاستخراج. مرّر المستندات الممسوحة عبر OCR أولًا. +- يحافظ الناتج على ترتيب القراءة كما يفسره PyMuPDF، وهو يتبع عمومًا من اليسار إلى اليمين ومن الأعلى إلى الأسفل. قد تنتج التخطيطات متعددة الأعمدة نصًا متداخلًا. +- للحصول على ناتج منظم مع العناوين والتنسيق، جرّب [PDF إلى Markdown](./pdf-to-markdown). وللحصول على JSON منظم جاهز للذكاء الاصطناعي، استخدم [تحضير PDF للذكاء الاصطناعي](./prepare-pdf-for-ai). + +## أدوات ذات صلة + +- [PDF إلى Markdown](./pdf-to-markdown) +- [تحضير PDF للذكاء الاصطناعي](./prepare-pdf-for-ai) +- [PDF إلى Word](./pdf-to-word) diff --git a/docs/ar/tools/pdf-to-tiff.md b/docs/ar/tools/pdf-to-tiff.md new file mode 100644 index 00000000..5a98d56e --- /dev/null +++ b/docs/ar/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF إلى TIFF +description: حوّل صفحات PDF إلى صور TIFF، المستخدمة عادةً في الطباعة والفاكس وسير عمل الأرشفة. يعود إلى PNG إذا فشل الترميز. +--- + +# PDF إلى TIFF + +يحوّل كل صفحة من ملف PDF إلى صورة TIFF. TIFF هي الصيغة القياسية لإنتاج المطبوعات وأنظمة الفاكس وأرشفة المستندات. تستخدم الأداة ضغط PackBits لترميز TIFF وتعود إلى PNG إذا فشل ترميز صفحة ما. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. انقر على **تحويل** لمعالجة الملف. +3. يتم تنزيل ملف TIFF واحد أو أرشيف ZIP تلقائيًا. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُعرض الصفحات بمقياس ثابت 2x. + +## صيغة الناتج + +- **صفحة واحدة**: `filename.tiff` +- **عدة صفحات**: `filename_tiffs.zip` يحتوي على `page_1.tiff` و`page_2.tiff` وهكذا. + +إذا فشل ترميز TIFF لصفحة معينة (بسبب مشاكل في الضغط)، تُحفظ تلك الصفحة كملف `.png` بدلًا من ذلك. وسيحتوي ملف ZIP في هذه الحالة على مزيج من ملفات TIFF وPNG. + +## حالات الاستخدام + +- تقديم المستندات إلى الجهات الحكومية أو الأنظمة القانونية التي تتطلب صيغة TIFF. +- تجهيز الصفحات للإرسال بالفاكس عبر خدمات الفاكس الرقمية. +- أرشفة المستندات الممسوحة ضوئيًا بصيغة واسعة الدعم دون فقدان. +- تغذية أنظمة إدارة المستندات المؤسسية بالصفحات. + +## نصائح + +- ملفات TIFF كبيرة. إذا كنت تحتاج إلى جودة دون فقدان للويب أو الشاشة فقط، فإن [PDF إلى PNG](./pdf-to-png) خيار أفضل. +- تحقق من محتويات ملف ZIP إذا احتاجت بعض الصفحات إلى الرجوع إلى PNG، فقد ترغب في تحويلها بشكل منفصل. + +## أدوات ذات صلة + +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى BMP](./pdf-to-bmp) +- [PDF إلى JPG](./pdf-to-jpg) diff --git a/docs/ar/tools/pdf-to-webp.md b/docs/ar/tools/pdf-to-webp.md new file mode 100644 index 00000000..e2ded2e2 --- /dev/null +++ b/docs/ar/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF إلى WebP +description: حوّل صفحات PDF إلى صور WebP بجودة قابلة للضبط. أحجام ملفات أصغر من JPG بجودة بصرية مماثلة. +--- + +# PDF إلى WebP + +يحوّل كل صفحة من ملف PDF إلى صورة WebP. ينتج WebP عادةً ملفات أصغر بنسبة 25-35% من JPG بالجودة المدركة نفسها، مما يجعله خيارًا قويًا للاستخدام على الويب. + +## طريقة العمل + +1. ارفع ملف PDF بالنقر على منطقة الإفلات أو بسحب ملف إليها. +2. اضبط شريط **جودة الصورة**. +3. انقر على **تحويل** لمعالجة الملف. +4. يتم تنزيل ملف `.webp` واحد أو أرشيف ZIP تلقائيًا. + +## الخيارات + +- **جودة الصورة**: شريط من 0% إلى 100% (الافتراضي 85%). يتحكم في مستوى الضغط مع فقدان. تحتفظ القيم الأعلى بتفاصيل أكثر. + +تُعرض الصفحات داخليًا بمقياس 2x، مما ينتج صورًا بحجم يقارب ضعف الأبعاد الأصلية لملف PDF. + +## صيغة الناتج + +- **صفحة واحدة**: `filename.webp` +- **عدة صفحات**: `filename_webps.zip` يحتوي على `page_1.webp` و`page_2.webp` وهكذا. + +## حالات الاستخدام + +- تجهيز معاينات الصفحات لمواقع الويب التي يهمها عرض النطاق الترددي. +- إنشاء نسخ صور خفيفة من النشرات أو الكتيبات لوسائل التواصل الاجتماعي. +- تحويل المستندات متعددة الصفحات دفعة واحدة إلى مجموعة صور محسّنة للويب. + +## نصائح + +- WebP مدعوم في جميع المتصفحات الحديثة. وللتوافق مع المتصفحات القديمة، استخدم [PDF إلى JPG](./pdf-to-jpg). +- عادةً لا يمكن تمييز جودة 80-85% عن الأصل على الشاشة مع إبقاء أحجام الملفات صغيرة. + +## أدوات ذات صلة + +- [PDF إلى JPG](./pdf-to-jpg) +- [PDF إلى PNG](./pdf-to-png) +- [PDF إلى BMP](./pdf-to-bmp) diff --git a/docs/ar/tools/pdf-to-word.md b/docs/ar/tools/pdf-to-word.md new file mode 100644 index 00000000..2d3b4a01 --- /dev/null +++ b/docs/ar/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF إلى Word +description: حوّل ملفات PDF إلى مستندات Word (DOCX) قابلة للتعديل. يدعم التحويل الجماعي لعدة ملفات PDF دفعة واحدة. +--- + +# PDF إلى Word + +يحوّل ملفات PDF إلى مستندات Word (`.docx`) قابلة للتعديل. تستخدم الأداة PyMuPDF لإعادة بناء محتوى المستند مع الحفاظ على النص والتنسيق الأساسي والتخطيط. يدعم التحويل الفردي والجماعي. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإفلات أو بسحب الملفات إليها. يمكنك إضافة المزيد من الملفات أو إزالة ملفات فردية من القائمة. +2. انقر على **تحويل إلى DOCX** لبدء المعالجة. +3. يتم تنزيل الملف الواحد باسم `filename.docx`. أما الملفات المتعددة فتُحزم في `converted-documents.zip`. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. يُحوَّل كل ملف PDF إلى DOCX باستخدام محرك التحويل المدمج في PyMuPDF. + +## صيغة الناتج + +- **ملف واحد**: `filename.docx` +- **عدة ملفات**: `converted-documents.zip` يحتوي على ملف `.docx` واحد لكل ملف PDF مدخل. + +## حالات الاستخدام + +- تعديل النص في ملف PDF استلمته وتحتاج إلى تغييره. +- تحويل تقارير PDF المؤرشفة إلى صيغة يستطيع الزملاء تعديلها في Microsoft Word أو Google Docs. +- سحب المحتوى من عقود أو عروض PDF إلى Word لوضع التعديلات عليها. +- ترحيل الوثائق القديمة بصيغة PDF إلى صيغة قابلة للتعديل. + +## نصائح + +- قد لا تتحول التخطيطات المعقدة ذات النص متعدد الأعمدة أو النماذج المضمّنة أو الرسومات الكثيفة بشكل مثالي. راجع الناتج واضبط التنسيق في معالج النصوص. +- ستنتج ملفات PDF الممسوحة ضوئيًا (الصور فقط) ملفات DOCX فارغة أو شبه فارغة. مرّرها عبر OCR أولًا لإضافة طبقة نص. +- الوضع الجماعي فعّال لتحويل مجلدات كاملة من ملفات PDF، فارفعها كلها دفعة واحدة. + +## أدوات ذات صلة + +- [PDF إلى نص](./pdf-to-text) +- [PDF إلى Markdown](./pdf-to-markdown) +- [منشئ سير عمل PDF](./pdf-workflow) diff --git a/docs/ar/tools/pdf-to-zip.md b/docs/ar/tools/pdf-to-zip.md new file mode 100644 index 00000000..f70129f1 --- /dev/null +++ b/docs/ar/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF إلى ZIP +description: احزم عدة ملفات PDF في أرشيف ZIP واحد لسهولة المشاركة والتخزين. +--- + +# PDF إلى ZIP + +اجمع عدة ملفات PDF في أرشيف ZIP واحد. هذه أداة تحزيم بسيطة: لا يتم تحويل ملفات PDF أو ضغطها أو تعديلها. + +## طريقة العمل + +1. ارفع عدة ملفات PDF باستخدام منطقة الإفلات. +2. راجع قائمة الملفات. أزل أي ملف لا تريد تضمينه. +3. انقر على زر المعالجة. +4. يتم تنزيل أرشيف ZIP يحتوي على جميع ملفات PDF المرفوعة فورًا. + +## الميزات + +- يقبل أي عدد من ملفات PDF +- إزالة كل ملف على حدة قبل إنشاء الأرشيف +- يحافظ على أسماء الملفات الأصلية داخل ZIP +- لا تعديل على محتوى PDF، فالملفات تُحزم كما هي +- يعرض اسم الملف وحجمه لكل ملف PDF مرفوع + +## حالات الاستخدام + +- جمع مجموعة من الفواتير أو الإيصالات كمرفق بريد إلكتروني +- تحزيم مخرجات المشروع (عدة تقارير PDF) للتسليم +- إنشاء تنزيل واحد لمجموعة نماذج أو قوالب +- أرشفة دفعة من المستندات في ملف مضغوط واحد + +## نصائح + +- يستخدم ملف ZIP أسماء ملفات PDF الأصلية. إذا كانت لديك ملفات بالاسم نفسه، فأعد تسميتها قبل الرفع لتجنب التعارضات. +- لا تضغط هذه الأداة ملفات PDF نفسها. لتقليل حجم الملفات، مرّرها عبر ضغط PDF أولًا، ثم احزمها بهذه الأداة. + +## أدوات ذات صلة + +- [دمج PDF](./merge-pdf) +- [تقسيم PDF](./split-pdf) +- [ضغط PDF](./compress-pdf) diff --git a/docs/ar/tools/pdf-workflow.md b/docs/ar/tools/pdf-workflow.md new file mode 100644 index 00000000..f267cfd2 --- /dev/null +++ b/docs/ar/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: منشئ سير عمل PDF +description: ابنِ خطوط معالجة PDF مخصصة بصريًا عبر ربط العقد على لوحة. اربط عمليات مثل الدمج والضغط والعلامة المائية والتصدير. +--- + +# منشئ سير عمل PDF + +يتيح لك منشئ سير العمل ربط عدة عمليات PDF في خط معالجة آلي واحد. بدلًا من تشغيل الأدوات واحدة تلو الأخرى، توصّل رسمًا بيانيًا مرئيًا من العقد (إدخال ومعالجة وإخراج) وتنفّذ كل شيء بنقرة واحدة. لا تغادر ملفاتك المتصفح أبدًا. + +## طريقة العمل + +تنقسم الواجهة إلى ثلاث لوحات: **صندوق أدوات العقد** على اليسار و**اللوحة** في الوسط و**لوحة الإعدادات** على اليمين التي تظهر عند تحديد عقدة. + +1. **أضف العقد** بالنقر عليها في الشريط الجانبي الأيسر، أو اسحبها مباشرة إلى اللوحة. استخدم شريط البحث أعلى صندوق الأدوات للتصفية حسب الاسم. +2. **اربط العقد** بالسحب من مقبس الإخراج (أسفل العقدة) إلى مقبس الإدخال (أعلى عقدة أخرى). تتدفق الروابط من الأعلى إلى الأسفل. +3. **اضبط الإعدادات** بالنقر على عقدة لفتح لوحة إعداداتها على اليمين. لكل نوع عقدة خياراته الخاصة (نطاقات الصفحات وأشرطة الجودة وكلمات المرور وغيرها). +4. **شغّل سير العمل** بالنقر على زر **تشغيل** في شريط الأدوات. ينفّذ المحرك العقد بترتيب طوبولوجي، ويعالج كل واحدة بالتسلسل. يتتبع شريط الحالة في الأسفل التقدم. +5. **نزّل النتائج**: تحفظ عقدة تنزيل الطرفية ملف PDF النهائي (أو ZIP إذا أُنتجت عدة ملفات). + +## فئات العقد + +تُنظَّم العقد في ست فئات، لكل منها لون مميز على اللوحة: + +- **إدخال** (أزرق): إدخال PDF وإدخال الصور وWord/Excel/PowerPoint إلى PDF وأكثر من 15 محوّل صيغ آخر تغذي الملفات في خط المعالجة. +- **تعديل وتعليق** (نيلي): قص PDF وPDF إلى تدرج الرمادي وعكس الألوان وإضافة علامة مائية وأرقام الصفحات ورأس وتذييل وتأثير الماسح الضوئي وضبط الألوان ولون الخلفية وإزالة الصفحات الفارغة وإزالة التعليقات. +- **تنظيم وإدارة** (بنفسجي): دمج PDF وتقسيم PDF واستخراج الصفحات وتدوير PDF وحذف الصفحات وعكس الصفحات وإضافة صفحة فارغة وتقسيم الصفحات وN-Up PDF وتوحيد حجم الصفحة ودمج في صفحة واحدة وكتيّب PDF وتقسيم PDF إلى ملصقات وتعديل البيانات الوصفية وجدول المحتويات والتعرف الضوئي على PDF. +- **تحسين وإصلاح** (كهرماني): ضغط PDF وتحويل PDF إلى صور نقطية وتحسين PDF للويب وتصحيح انحراف PDF وPDF إلى PDF/A وتحويل الخطوط إلى مخططات وإصلاح PDF. +- **تأمين PDF** (وردي): تشفير وفك التشفير وتنظيف PDF وتسطيح PDF وتوقيع رقمي وتنقيح. +- **إخراج** (أخضر مزرق): تنزيل (يكتشف تلقائيًا ملف PDF واحدًا أو ZIP) وPDF إلى صور وPDF إلى نص وPDF إلى DOCX وPDF إلى XLSX وPDF إلى CSV وPDF إلى SVG وPDF إلى Markdown واستخراج الصور. + +## حفظ سير العمل وتحميله + +يوفر شريط الأدوات أربعة خيارات للحفظ: + +- **حفظ**: يخزّن سير العمل الحالي كقالب مسمّى في التخزين المحلي لمتصفحك. يمكنك حفظ عدة قوالب. +- **تحميل**: يفتح نافذة تسرد جميع القوالب المحفوظة. انقر على تحميل لاستعادة قالب، أو احذف القوالب التي لم تعد بحاجة إليها. +- **تصدير**: ينزّل سير العمل كملف `.json` لتتمكن من مشاركته أو نسخه احتياطيًا. +- **استيراد**: يحمّل ملف سير عمل `.json` من القرص، ويستعيد جميع العقد ومواضعها وروابطها. + +تبقى القوالب محفوظة بين الجلسات في التخزين المحلي. وملفات JSON المصدّرة قابلة للنقل بين المتصفحات والأجهزة. + +## نموذج التنفيذ + +يبني المحرك رسمًا بيانيًا للتبعيات من روابطك وينفّذ العقد بترتيب طوبولوجي. إذا فشلت أي عقدة، يتوقف التنفيذ وتُعلَّم العقدة الفاشلة باللون الأحمر. بعض القواعد التي يجب تذكرها: + +- يحتاج كل سير عمل إلى عقدة **إدخال** واحدة على الأقل وعقدة **إخراج** واحدة. +- يكتشف المحرك التبعيات الدائرية ويمنع التنفيذ مع رسالة خطأ. +- يجب أن تكون عقدة **تشفير** آخر خطوة معالجة قبل عقدة الإخراج. وضعها في موضع أبكر يؤدي إلى تحذير تحقق لأن العقد التالية لا تستطيع العمل على بيانات مشفرة. +- تطلب ملفات PDF المحمية بكلمة مرور إدخال كلمة المرور أثناء التنفيذ. +- مدخلات PDF المتعددة مدعومة: يمكن لعقدة دمج PDF دمجها، أو تعالج عقد المعالجة الدفعية كل ملف PDF على حدة. + +## أنواع المقابس + +تستخدم الروابط مقابس مصنّفة لمنع التوصيلات غير الصالحة: + +- **PDF** (نيلي): مستند PDF واحد. +- **MultiPDF** (كهرماني): عدة مستندات PDF محزمة معًا. +- **Image** (أخضر): كائن صورة. + +## الخيارات + +لكل عقدة إعداداتها الخاصة المتاحة عبر لوحة الإعدادات اليمنى. تشمل الأنماط الشائعة: + +- **نطاقات الصفحات** في عقد تقسيم PDF واستخراج الصفحات وحذف الصفحات +- **أشرطة الجودة** في عقد إخراج تحويل الصور +- **حقول كلمة المرور** في عقدتي تشفير وفك التشفير +- **مدخلات نصية** لـ إضافة علامة مائية ورأس وتذييل وتعديل البيانات الوصفية +- **زوايا التدوير** في عقدة تدوير PDF +- **مستوى الضغط** في عقدة ضغط PDF +- **اختيار لغة OCR** في عقدة التعرف الضوئي على PDF + +## حالات الاستخدام + +- **خط معالجة الفواتير**: إدخال PDF -> التعرف الضوئي على PDF -> استخراج جداول PDF -> تنزيل بصيغة CSV. +- **توحيد التقارير**: Word إلى PDF -> توحيد حجم الصفحة -> أرقام الصفحات -> إضافة علامة مائية -> ضغط PDF -> تنزيل. +- **التحضير للأرشفة**: إدخال PDF -> إصلاح PDF -> تسطيح PDF -> تنظيف PDF -> PDF إلى PDF/A -> تنزيل. +- **استخراج الصور الجماعي**: إدخال PDF (عدة ملفات) -> استخراج الصور -> تنزيل ZIP. +- **كتيبات جاهزة للطباعة**: إدخال PDF -> كتيّب PDF -> قص PDF -> ضغط PDF -> تنزيل. +- **التوزيع الآمن**: إدخال PDF -> تنقيح -> إزالة التعليقات -> تشفير -> تنزيل. + +## نصائح + +- استخدم **Delete** أو **Backspace** لإزالة العقدة المحددة من اللوحة. +- انقر على زر **X** في شريط حالة العقدة لحذفها مباشرة. +- حرّك اللوحة بالنقر والسحب على مساحة فارغة. يتغير المؤشر إلى أيقونة قبضة أثناء التحريك. +- على الجوال، استخدم زر **+** في شريط الأدوات لتبديل صندوق أدوات العقد. +- إذا أنتج سير عملك عدة ملفات إخراج، تحزمها عقدة تنزيل تلقائيًا في ملف ZIP. +- ابدأ ببساطة: ابنِ خط معالجة من عقدتين واختبره قبل إضافة التعقيد. + +## أدوات ذات صلة + +- [PDF إلى نص](./pdf-to-text) +- [PDF إلى Excel](./pdf-to-excel) +- [استخراج الصور](./extract-images) +- [PDF إلى Markdown](./pdf-to-markdown) diff --git a/docs/ar/tools/png-to-pdf.md b/docs/ar/tools/png-to-pdf.md new file mode 100644 index 00000000..d963e52c --- /dev/null +++ b/docs/ar/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG إلى PDF +description: حوّل صورة PNG واحدة أو أكثر إلى مستند PDF بجودة قابلة للضبط، بالكامل داخل متصفحك. +--- + +# PNG إلى PDF + +حوّل صور PNG إلى PDF مع الحفاظ على دقتها الكاملة. تصبح كل صورة PNG صفحة خاصة بها بحجم يطابق أبعاد الصورة الأصلية. تتم معالجة الشفافية تلقائيًا. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :--------- | +| PNG | `.png` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات PNG وأفلتها. يمكنك تحديد عدة ملفات دفعة واحدة. +2. أدر قائمة الملفات: أزل الملفات غير المرغوب فيها أو أضف المزيد. +3. اختر مستوى **جودة PDF** من القائمة المنسدلة. +4. انقر على **التحويل إلى PDF**. يتم تنزيل الناتج باسم `from_jpgs.pdf`. + +تستخدم الأداة pdf-lib لتضمين كل صورة مباشرة. إذا تعذر تضمين ملف PNG بشكل أصلي (مثلًا بسبب ملف تعريف ألوان غير شائع)، فإنها تعود إلى إعادة عرضه عبر canvas كصورة JPEG. + +## الخيارات + +يتحكم **جودة PDF** في الضغط المطبّق قبل التضمين: + +- **جودة عالية**: ضغط أدنى وأكبر حجم ملف. +- **جودة متوسطة** (الافتراضي): توازن جيد بين الحجم والوضوح. +- **جودة منخفضة**: أقصى ضغط وأصغر ناتج. + +## حالات الاستخدام + +- تحويل لقطات الشاشة إلى ملف PDF متعدد الصفحات لتقارير الأخطاء أو التوثيق +- تحزيم مخرجات تصميم واجهات المستخدم في ملف واحد للمراجعة +- تحويل مخرجات المخططات (draw.io وExcalidraw) إلى ملف PDF قابل للمشاركة +- تجميع مجموعة من صور المخططات البيانية في تقرير + +## نصائح + +- تحصل ملفات PNG ذات الشفافية على خلفية بيضاء في ملف PDF. إذا كنت تحتاج إلى خلفية مختلفة، فعدّل الصور مسبقًا. +- بالنسبة للقطات الشاشة والمخططات ذات الحواف الحادة والنصوص، تتجنب الجودة High عيوب ضغط JPEG. وقد تتحول الصور داخليًا إلى JPEG مع Medium أو Low. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [JPG إلى PDF](./jpg-to-pdf) +- [SVG إلى PDF](./svg-to-pdf) diff --git a/docs/ar/tools/posterize-pdf.md b/docs/ar/tools/posterize-pdf.md new file mode 100644 index 00000000..9a070340 --- /dev/null +++ b/docs/ar/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: تقسيم PDF إلى ملصقات +description: قسّم صفحات PDF إلى شبكة من الصفحات الأصغر للطباعة بحجم كبير على عدة أوراق. +--- + +# تقسيم PDF إلى ملصقات + +قسّم كل صفحة في ملف PDF إلى شبكة من الصفحات الفرعية الأصغر. هذه هي الأداة المناسبة لطباعة صفحة واحدة على عدة أوراق، ثم تجميعها معًا للحصول على ملصق كبير أو لافتة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. حدّد عدد **الصفوف** و**الأعمدة** لتكوين الشبكة (مثلًا، 2 صف × 2 عمود يقسم كل صفحة إلى 4 صفحات فرعية). +3. يمكنك اختياريًا تحديد نطاق صفحات لتقييد الصفحات التي سيتم تقسيمها. +4. تعرض لوحة المعاينة شبكة فوق الصفحة الحالية لتتمكن من رؤية أماكن القص. +5. تنقّل بين الصفحات للتحقق من الشبكة على صفحات مختلفة. +6. انقر على زر المعالجة. تصبح كل خلية في الشبكة صفحة مستقلة في ملف PDF الناتج. + +## الميزات + +- عدد صفوف وأعمدة قابل للضبط لأحجام شبكة مرنة +- معاينة مباشرة مع شبكة توضح بدقة أماكن تقسيم الصفحات +- مرشح نطاق الصفحات لتقسيم صفحات محددة فقط +- التنقل بين الصفحات في المعاينة +- لقطات مخزنة مؤقتًا للصفحات لتنقل سريع في المعاينة +- خطوط شبكة حمراء متقطعة تحدد حدود القص بوضوح + +## الخيارات + +| الخيار | الوصف | +| ---------------- | ------------------------------------------ | +| **الصفوف** | عدد التقسيمات الأفقية (الافتراضي: 1) | +| **الأعمدة** | عدد التقسيمات الرأسية (الافتراضي: 1) | +| **نطاق الصفحات** | الصفحات المراد تقسيمها (فارغ = كل الصفحات) | + +## حالات الاستخدام + +- طباعة ملف PDF بحجم ملصق على أوراق A4 أو Letter القياسية لتجميعها على الحائط +- إنشاء لافتات كبيرة من تصميم PDF من صفحة واحدة +- تقسيم الرسومات الفنية كبيرة الحجم إلى أجزاء قابلة للطباعة +- الحصول على مطبوعات كبيرة دون الحاجة إلى طابعة عريضة + +## نصائح + +- شبكة 2×2 تحوّل الصفحة الواحدة إلى 4 صفحات، وشبكة 3×3 تحوّلها إلى 9. خطّط للشبكة بحسب الحجم الذي تريده للناتج النهائي بعد التجميع. +- تساعدك الشبكة في المعاينة على التأكد من أن المحتوى المهم لا يقع على خط القص. عدّل الصفوف والأعمدة عند الحاجة. +- للعملية العكسية (وضع عدة صفحات على ورقة واحدة)، استخدم [N-Up PDF](./n-up-pdf). + +## أدوات ذات صلة + +- [N-Up PDF](./n-up-pdf) +- [تقسيم الصفحات](./divide-pages) +- [تقسيم PDF](./split-pdf) diff --git a/docs/ar/tools/powerpoint-to-pdf.md b/docs/ar/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..bbc22406 --- /dev/null +++ b/docs/ar/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint إلى PDF +description: حوّل عروض PowerPoint التقديمية (PPT وPPTX) وملفات ODP إلى PDF مع الحفاظ على تنسيق الشرائح. +--- + +# PowerPoint إلى PDF + +حوّل ملفات العروض التقديمية إلى PDF. تصبح كل شريحة صفحة في المستند الناتج، مع عرض النصوص والصور والأشكال والانتقالات عبر محرك LibreOffice يعمل داخل المتصفح. يدعم صيغ PowerPoint الحديثة والقديمة، إضافة إلى صيغة OpenDocument Presentation. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :------------------------ | :--------- | +| PowerPoint (حديثة) | `.pptx` | +| PowerPoint (قديمة) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات العرض التقديمي وأفلتها. +2. راجع قائمة الملفات. أضف المزيد أو أزل ما لا تحتاجه. +3. انقر على **تحويل إلى PDF**. يتم تحميل محرك LibreOffice عند أول استخدام، ثم يحوّل كل ملف. +4. يتم تنزيل الملف الواحد مباشرة بصيغة PDF. أما الملفات المتعددة فتُحزم في `powerpoint-converted.zip`. + +## الخيارات + +لا تحتوي هذه الأداة على إعدادات إضافية. تُعرض الشرائح بأبعادها الأصلية. + +## الناتج + +| عدد الملفات المدخلة | الناتج | +| :------------------ | :--------------------------------------------------------------- | +| ملف واحد | تنزيل ملف PDF واحد (باسم الملف الأصلي مع الامتداد `.pdf`) | +| ملفان أو أكثر | أرشيف ZIP (`powerpoint-converted.zip`) يحتوي على ملف PDF لكل ملف | + +## حالات الاستخدام + +- تحويل عرض تقديمي إلى PDF قبل مشاركته مع جمهور قد لا يملك PowerPoint +- إنشاء نسخة مطبوعة من العرض كمذكرة لمؤتمر أو ورشة عمل +- أرشفة العروض التقديمية بصيغة تظهر بشكل متطابق على كل جهاز +- تحويل مجموعة كبيرة من عروض ODP من LibreOffice Impress إلى PDF دفعة واحدة +- إنشاء نسخة PDF من عرض تقديمي للمستثمرين لإرفاقها بالبريد الإلكتروني + +## نصائح + +- لا تُنقل حركات الشرائح وانتقالاتها إلى PDF. تُلتقط كل شريحة كصفحة ثابتة. +- لن تظهر مقاطع الفيديو المضمّنة في الناتج. استبدلها بلقطة شاشة أو صورة بديلة عند الحاجة. +- لا تُضمَّن ملاحظات المتحدث في تصدير PDF الافتراضي. إذا احتجت إليها، فكّر في التصدير أولًا من عرض "طباعة الملاحظات" الأصلي في PowerPoint. +- يحتفظ المتصفح بمحرك LibreOffice مخزنًا مؤقتًا بعد التحميل الأول، لذا يكون تحويل عرض ثانٍ في الجلسة نفسها أسرع بكثير. + +## أدوات ذات صلة + +- [Word إلى PDF](./word-to-pdf) +- [Excel إلى PDF](./excel-to-pdf) +- [صور إلى PDF](./image-to-pdf) diff --git a/docs/ar/tools/prepare-pdf-for-ai.md b/docs/ar/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..273d32ec --- /dev/null +++ b/docs/ar/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: تحضير PDF للذكاء الاصطناعي +description: استخرج محتوى PDF إلى JSON منظم ومحسّن لنماذج اللغة الكبيرة وخطوط الذكاء الاصطناعي مثل LlamaIndex. يدعم المعالجة الدفعية. +--- + +# تحضير PDF للذكاء الاصطناعي + +يستخرج محتوى ملفات PDF وينظّمه بصيغة JSON محسّنة للاستيعاب من قبل نماذج اللغة الكبيرة (LLMs) وأطر الذكاء الاصطناعي مثل LlamaIndex. يُستخرج محتوى كل صفحة ويُنظَّم في بنية جاهزة لخطوط RAG وروبوتات المحادثة وأنظمة البحث الدلالي. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر بالنقر على منطقة الإفلات أو بسحب الملفات إليها. +2. انقر على **استخراج** لبدء المعالجة. +3. يتم تنزيل الملف الواحد باسم `filename_llm.json`. أما الملفات المتعددة فتنتج أرشيف `pdf-for-ai.zip`. + +تستخدم الأداة تكامل LlamaIndex في PyMuPDF لاستخراج محتوى كل صفحة مع البيانات الوصفية، لينتج مخرجات يمكن تحميلها مباشرة في أطر الذكاء الاصطناعي. + +## الخيارات + +لا تحتوي هذه الأداة على خيارات قابلة للضبط. تُستخرج كل الصفحات بالنص الكامل والبيانات الوصفية. + +## صيغة الناتج + +- **ملف واحد**: `filename_llm.json` +- **ملفات متعددة**: `pdf-for-ai.zip` يحتوي على ملف `_llm.json` واحد لكل ملف PDF مدخل. + +يتبع ناتج JSON مخطط مستندات LlamaIndex مع محتوى نصي وحقول بيانات وصفية لكل صفحة. + +## حالات الاستخدام + +- تحضير مستندات PDF لخطوط التوليد المعزز بالاسترجاع (RAG). +- بناء قاعدة معرفة قابلة للبحث من أرشيفات PDF لروبوت محادثة يعمل بالذكاء الاصطناعي. +- تغذية تقارير PDF إلى مسارات التحليل المعتمدة على نماذج اللغة الكبيرة. +- المعالجة المسبقة للأوراق البحثية لأنظمة البحث الدلالي والإجابة عن الأسئلة. +- إنشاء بيانات تدريب منظمة من مجموعات مستندات PDF. + +## نصائح + +- لاستخراج النص العادي دون تنسيق خاص بالذكاء الاصطناعي، استخدم [PDF إلى نص](./pdf-to-text). +- للحصول على ناتج Markdown يحافظ على العناوين والبنية، استخدم [PDF إلى Markdown](./pdf-to-markdown). +- ستنتج ملفات PDF الممسوحة ضوئيًا مخرجات فارغة أو شبه فارغة. مرّرها عبر التعرف الضوئي على الحروف أولًا لإضافة طبقة نصية قبل الاستخراج. + +## أدوات ذات صلة + +- [PDF إلى نص](./pdf-to-text) +- [PDF إلى Markdown](./pdf-to-markdown) +- [PDF إلى JSON](./pdf-to-json) diff --git a/docs/ar/tools/protect-pdf.md b/docs/ar/tools/protect-pdf.md new file mode 100644 index 00000000..a0a590be --- /dev/null +++ b/docs/ar/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: حماية PDF +description: احمِ ملفات PDF بكلمة مرور وتشفير AES بطول 256 بت. عيّن كلمتي مرور المستخدم والمالك مع قيود استخدام قابلة للضبط. +--- + +# حماية PDF + +اقفل ملف PDF بكلمة مرور بحيث لا يفتحه إلا الأشخاص المصرّح لهم. يستخدم BentoPDF تشفير AES بطول 256 بت، وهو المعيار نفسه الذي تستخدمه البنوك والجهات الحكومية، ويُطبَّق بالكامل داخل متصفحك عبر QPDF. + +## طريقة العمل + +1. ارفع ملف PDF. +2. أدخل **كلمة مرور المستخدم** (مطلوبة). هذه هي كلمة المرور التي سيحتاجها الأشخاص لفتح الملف. +3. يمكنك اختياريًا إدخال **كلمة مرور المالك**. عند تعيينها، يحصل ملف PDF على قيود استخدام تمنع الطباعة والتحرير والنسخ والتعليق. +4. انقر على **تشفير PDF**. +5. نزّل الملف المشفر. + +## أنواع كلمات المرور + +### كلمة مرور المستخدم (مطلوبة) + +كلمة مرور المستخدم هي ما يكتبه المستلمون لفتح ملف PDF. بدونها يصبح المستند غير متاح تمامًا. يجب أن يملك كل ملف PDF مشفر كلمة مرور مستخدم. + +### كلمة مرور المالك (اختيارية) + +تتحكم كلمة مرور المالك فيما يستطيع المستخدم المصرّح له فعله بعد فتح الملف. عند تعيين كلمة مرور مالك مختلفة، يطبّق BentoPDF تلقائيًا أشد مجموعة قيود: + +- التعديل معطّل +- الاستخراج والنسخ معطّلان +- الطباعة معطّلة +- التعليق معطّل +- تعبئة النماذج معطّلة +- تجميع المستند معطّل + +إذا تركت كلمة مرور المالك فارغة، فسيكون ملف PDF مشفرًا (ما زال يتطلب كلمة مرور المستخدم لفتحه) لكن دون قيود استخدام بعد فتحه. + +## تفاصيل التشفير + +- **الخوارزمية**: AES-256 (معيار التشفير المتقدم بطول 256 بت) +- **طول المفتاح**: 256 بت +- **المعيار**: تشفير PDF 2.0 (تنفيذ QPDF) + +يستحيل عمليًا كسر AES-256 بالقوة الغاشمة بالتقنيات الحالية. يعتمد أمان ملف PDF المشفر بالكامل على قوة كلمة المرور. + +## حالات الاستخدام + +- حماية التقارير المالية السرية قبل إرسالها بالبريد الإلكتروني +- تأمين المستندات القانونية المشاركة مع الطرف المقابل +- إضافة كلمة مرور إلى السجلات الطبية أو المعلومات الشخصية +- توزيع المحتوى المدفوع (الكتب الإلكترونية والتقارير) مع التحكم في الوصول +- الامتثال لسياسات حماية البيانات التي تتطلب التشفير أثناء التخزين + +## نصائح + +- استخدم كلمة مرور قوية وفريدة. عبارة مرور من 12 حرفًا أو أكثر تجمع الأحرف الكبيرة والصغيرة والأرقام والرموز مثالية. +- شارك كلمة المرور عبر قناة منفصلة (الهاتف أو رسالة نصية)، وليس أبدًا في رسالة البريد نفسها التي تحمل ملف PDF. +- إذا كنت تريد فقط تقييد الإجراءات (منع الطباعة والنسخ) دون طلب كلمة مرور للفتح، فاستخدم أداة تغيير الأذونات. + +## أدوات ذات صلة + +- [إلغاء قفل PDF](./unlock-pdf): أزل التشفير عندما تعرف كلمة المرور +- [تغيير الأذونات](./change-permissions): عدّل قيود الاستخدام المحددة +- [إزالة القيود](./remove-restrictions): أزل كل إعدادات الأمان من ملف PDF +- [تنظيف PDF](./sanitize-pdf): أزل المحتوى المخفي قبل التشفير diff --git a/docs/ar/tools/psd-to-pdf.md b/docs/ar/tools/psd-to-pdf.md new file mode 100644 index 00000000..67292694 --- /dev/null +++ b/docs/ar/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD إلى PDF +description: حوّل ملفات Photoshop (PSD) إلى PDF داخل متصفحك. مجاني وخاص ولا يتطلب برامج Adobe. +--- + +# PSD إلى PDF + +حوّل ملفات Adobe Photoshop بصيغة PSD إلى مستندات PDF. PSD هي الصيغة الأصلية لبرنامج Photoshop، وفتحها يتطلب عادةً برنامج Adobe مكلفًا. تعرض هذه الأداة الصورة المركّبة المسطّحة من ملف PSD كصفحة PDF بالدقة الكاملة. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :-------------- | :------- | :---------------------------- | +| Adobe Photoshop | `.psd` | تعرض الصورة المركّبة المسطّحة | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات PSD وأفلتها. يمكن رفع ملفات متعددة. +2. راجع قائمة الملفات. أزل الملفات غير المرغوبة بأيقونة سلة المهملات، أو استخدم **إضافة المزيد من الملفات** لإضافة ملفات أخرى. +3. انقر على **تحويل إلى PDF**. يقرأ محرك PyMuPDF ملف PSD ويضمّن الصورة المركّبة في صفحة PDF بالدقة الأصلية. +4. ينتج ملف PSD واحد ملف PDF واحدًا. عند رفع عدة ملفات PSD، تُدمج في ملف PDF واحد متعدد الصفحات باسم `psd_to_pdf.pdf`، ويصبح كل ملف PSD صفحة واحدة. + +## الخيارات + +لا حاجة إلى أي إعدادات. يستخدم المحوّل بيانات الصورة المسطّحة من ملف PSD. + +## حالات الاستخدام + +- معاينة تصاميم Photoshop دون فتح Photoshop +- إرسال نماذج التصميم إلى عملاء لا يملكون Adobe Creative Suite +- طباعة أعمال فنية عالية الدقة من ملفات PSD +- إنشاء ملف PDF لمحفظة أعمال من عدة ملفات تصميم PSD، إذ يصبح كل منها صفحة في مستند واحد + +## نصائح + +- يعرض التحويل العرض المركّب (المسطّح) لملف PSD. لا تُحفظ الطبقات الفردية وطبقات الضبط وتأثيرات الطبقات كعناصر منفصلة في PDF. +- تُدمج ملفات PSD المتعددة في ملف PDF واحد متعدد الصفحات بدلًا من ملفات PDF منفصلة. هذا مفيد لبناء محافظ الأعمال أو الكتيبات المصورة. +- ستنتج ملفات PSD عالية الدقة (ملفات الطباعة بدقة 300 نقطة في البوصة أو أكثر) ملفات PDF كبيرة. تحافظ الأداة على الدقة الكاملة. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [PNG إلى PDF](./png-to-pdf) +- [VSD إلى PDF](./vsd-to-pdf) diff --git a/docs/ar/tools/pub-to-pdf.md b/docs/ar/tools/pub-to-pdf.md new file mode 100644 index 00000000..217dac48 --- /dev/null +++ b/docs/ar/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB إلى PDF +description: حوّل ملفات Microsoft Publisher (PUB) إلى PDF داخل متصفحك. مجاني وخاص ولا يتطلب أي برنامج. +--- + +# PUB إلى PDF + +حوّل ملفات Microsoft Publisher إلى PDF. Publisher أداة نشر مكتبي مرفقة مع بعض إصدارات Microsoft Office، لكن معظم الناس لا يملكونها. تتيح لك هذه الأداة تحويل ملفات PUB إلى PDF مباشرة في المتصفح، دون الحاجة إلى أي برنامج من Microsoft. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :------------------ | :------- | :-------------------- | +| Microsoft Publisher | `.pub` | مستندات النشر المكتبي | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات PUB وأفلتها. يمكن رفع عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات. أزل الملفات غير المرغوبة بأيقونة سلة المهملات، أو انقر على **إضافة المزيد من الملفات** لإضافة ملفات أخرى. +3. انقر على **تحويل إلى PDF**. يتم تحميل محرك قائم على LibreOffice في المتصفح ويحوّل كل ملف PUB مع الحفاظ على التخطيط والصور ومربعات النص. +4. يُنزَّل الملف الواحد مباشرة بصيغة PDF. أما الملفات المتعددة فتُسلَّم في أرشيف ZIP باسم `pub-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى إعدادات إضافية. يتعامل المحوّل مع محرك تخطيط PUB تلقائيًا. + +## حالات الاستخدام + +- فتح نشرة إعلانية أو رسالة إخبارية بصيغة PUB من عميل دون شراء Microsoft Publisher +- تحويل نشرات الكنائس وبرامج الفعاليات والرسائل الإخبارية المدرسية المنشأة في Publisher +- أرشفة المواد التسويقية من Publisher بصيغة يمكن للجميع فتحها +- طباعة ملفات PUB على جهاز لا يحتوي على Publisher + +## نصائح + +- قد تتحرك قليلًا التخطيطات المعقدة في Publisher التي تضم مربعات نص متراكبة وتموضعًا دقيقًا أثناء التحويل. راجع الناتج إذا كان التموضع الدقيق مهمًا. +- يُهيَّأ محرك LibreOffice مرة واحدة في كل جلسة. يستغرق التحويل الأول وقتًا أطول، وتكون التحويلات اللاحقة أسرع. +- للحصول على أدق تحويل لملفات Publisher، تأكد من أن أي خطوط مخصصة مستخدمة في الملف الأصلي هي خطوط نظام قياسية. + +## أدوات ذات صلة + +- [VSD إلى PDF](./vsd-to-pdf) +- [ODP إلى PDF](./odp-to-pdf) diff --git a/docs/ar/tools/rasterize-pdf.md b/docs/ar/tools/rasterize-pdf.md new file mode 100644 index 00000000..b80dae84 --- /dev/null +++ b/docs/ar/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: تحويل PDF إلى صور نقطية +description: حوّل صفحات PDF إلى ملف PDF قائم على الصور. سطّح كل الطبقات، وأزل النص القابل للتحديد، وتحكم في الدقة وصيغة الصورة. +--- + +# تحويل PDF إلى صور نقطية + +يحوّل التحويل النقطي كل صفحة من ملف PDF إلى صورة ثم يعيد تجميع هذه الصور في ملف PDF. تبدو النتيجة مطابقة للأصل لكنها لا تحتوي على نص قابل للتحديد ولا عناصر تفاعلية ولا طبقات قابلة للتحرير. إنها عمليًا نسخة ضوئية عالية الجودة. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. +2. اضبط **الدقة (DPI)** للناتج النقطي. +3. اختر **صيغة الصورة**: PNG لجودة بلا فقدان أو JPEG لملفات أصغر. +4. يمكنك اختياريًا تحديد **التحويل إلى تدرج الرمادي**. +5. انقر على **تحويل PDF إلى صور نقطية**. تُنزَّل الملفات المتعددة في ملف ZIP. + +## الخيارات + +| الإعداد | القيم | الافتراضي | +| ---------------- | ---------------------------- | --------- | +| **الدقة (DPI)** | 72، 150، 200، 300، 600 | 150 | +| **صيغة الصورة** | PNG (بلا فقدان)، JPEG (أصغر) | PNG | +| **تدرج الرمادي** | تشغيل/إيقاف | إيقاف | + +## إرشادات الدقة + +- **72**: للعرض على الشاشة فقط، وأصغر حجم للملف +- **150**: توازن جيد للاستخدام العام +- **200**: نص أكثر حدة وحجم ملف معتدل +- **300**: ناتج بجودة الطباعة +- **600**: أرشفة عالية الجودة أو طباعة احترافية + +## حالات الاستخدام + +- منع استخراج النص من المستندات السرية قبل مشاركتها +- التخلص من مشكلات الاعتماد على الخطوط بتحويل النص إلى بكسلات +- إنشاء نسخة "مسطحة" من ملف PDF ذي طبقات معقدة أو شفافية تظهر بشكل مختلف بين برامج العرض +- تجهيز ملف PDF لنظام يقبل المدخلات القائمة على الصور فقط +- إزالة المحتوى المخفي (مثل التغييرات المتتبعة أو بيانات النماذج) بتحويل PDF إلى صور خالصة + +## نصائح + +- دقة 150 مع PNG إعداد افتراضي جيد. لا ترفعها إلا إذا احتجت إلى ناتج للطباعة أو إلى تكبير التفاصيل الدقيقة. +- ينتج JPEG ملفات أصغر بشكل ملحوظ لكنه يضيف تشوهات الضغط على حواف النص الحادة. +- التحويل النقطي لا رجعة فيه، لذا احتفظ بملف PDF الأصلي إذا كنت قد تحتاج إلى نص قابل للتحرير لاحقًا. + +## أدوات ذات صلة + +- [ضغط PDF](./compress-pdf): قلّل حجم ملف PDF النقطي +- [تصحيح انحراف PDF](./deskew-pdf): عدّل استقامة الصفحات قبل التحويل النقطي للمستندات الممسوحة ضوئيًا +- [تحويل الخطوط إلى مخططات](./font-to-outline): حوّل الخطوط إلى مسارات متجهة إذا أردت الحفاظ على قابلية التكبير +- [تسطيح PDF](./flatten-pdf): سطّح النماذج دون التحويل إلى صور diff --git a/docs/ar/tools/remove-annotations.md b/docs/ar/tools/remove-annotations.md new file mode 100644 index 00000000..73a00eb7 --- /dev/null +++ b/docs/ar/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: إزالة التعليقات +description: أزل كل التعليقات والتمييزات والروابط وسائر الشروح من ملف PDF بنقرة واحدة. +--- + +# إزالة التعليقات + +نظّف ملف PDF بإزالة كل التعليقات التوضيحية: الملاحظات والتمييزات والملاحظات اللاصقة وعلامات النص والروابط والأختام وأي كائنات تعليق أخرى مضمّنة في المستند. يبقى محتوى الصفحة الأساسي (النصوص والصور والرسومات) دون تغيير. + +## طريقة العمل + +1. ارفع ملف PDF. +2. تكتشف الأداة عدد صفحات المستند وتعرض معلومات الملف. +3. انقر على **إزالة التعليقات** للمعالجة. +4. يُنزَّل ملف PDF النظيف تلقائيًا بعد إزالة كل التعليقات. + +## الميزات + +- تزيل كل أنواع التعليقات: الملاحظات والتمييزات والتسطير والشطب والملاحظات اللاصقة والأختام والروابط وعلامات النماذج +- تعمل على كل صفحة في المستند +- تحافظ على كل المحتوى غير التعليقي (النصوص والصور والرسومات المتجهة وحقول النماذج) +- تعرض عدد الصفحات وحجم الملف قبل المعالجة + +## حالات الاستخدام + +- تنظيف مستند قبل توزيعه النهائي بعد دورة مراجعة أضاف فيها عدة مراجعين تعليقاتهم +- إزالة التمييزات والملاحظات اللاصقة من دليل دراسة مشترك +- إزالة تعليقات الروابط من مستند قبل أرشفته +- تجهيز نسخة "نظيفة" من مستند قانوني كثرت عليه التعليقات أثناء التفاوض +- إزالة تعليقات المراجعين من مخطوطة قبل إرسالها إلى الطباعة + +## نصائح + +- تزيل هذه الأداة التعليقات على مستوى بنية PDF، لذا تحتفظ النتيجة بالنص القابل للتحديد والجودة الأصلية دون أي تحويل نقطي. +- إذا أردت إزالة تعليقات محددة فقط بدلًا من كلها، فاستخدم [محرر PDF](./edit-pdf) لحذف التعليقات الفردية بشكل انتقائي. +- لا يمكن إزالة التعليقات في ملفات PDF المسطّحة (التي دُمجت فيها التعليقات داخل محتوى الصفحة) لأنها لم تعد كائنات منفصلة. + +## أدوات ذات صلة + +- [محرر PDF](./edit-pdf) +- [إضافة علامة مائية](./add-watermark) +- [توقيع PDF](./sign-pdf) diff --git a/docs/ar/tools/remove-blank-pages.md b/docs/ar/tools/remove-blank-pages.md new file mode 100644 index 00000000..444bdfeb --- /dev/null +++ b/docs/ar/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: إزالة الصفحات الفارغة +description: اكتشف الصفحات الفارغة أو شبه الفارغة في ملف PDF وأزلها تلقائيًا مع حساسية قابلة للضبط. +--- + +# إزالة الصفحات الفارغة + +افحص ملف PDF بحثًا عن الصفحات الفارغة أو شبه الفارغة وأزلها تلقائيًا. تعرض الأداة كل صفحة وتحلل محتوى بكسلاتها لتحديد ما إذا كانت فارغة، ثم تتيح لك تأكيد الصفحات المراد إزالتها قبل المعالجة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اضبط شريط **الحساسية** للتحكم في مدى صرامة تعريف "الفارغة". +3. انقر على **اكتشاف الصفحات الفارغة** لفحص المستند. +4. تعرض الأداة صورًا مصغرة للصفحات الفارغة المكتشفة لتراجعها. +5. أكّد التحديد ونزّل ملف PDF النظيف بعد إزالة الصفحات الفارغة. + +## الخيارات + +- **الحساسية**: شريط من 0% إلى 100% (الافتراضي 80%). القيم الأعلى أكثر صرامة، فلا تُعلَّم إلا الصفحات البيضاء تمامًا أو تقريبًا. القيم الأدنى أكثر تساهلًا، فتلتقط الصفحات ذات المحتوى الضئيل مثل نقطة واحدة أو علامة مائية باهتة. + +## الميزات + +- تحليل على مستوى البكسل لكل صفحة لاكتشاف المحتوى الفارغ +- شريط حساسية قابل للضبط لتحسين الاكتشاف +- معاينة بصور مصغرة للصفحات الفارغة المكتشفة للتحقق اليدوي +- تحافظ على كل الصفحات غير الفارغة كما هي تمامًا +- تتعامل مع مستندات من أي حجم أو عدد صفحات +- تعرض تقدم الفحص أثناء المعالجة + +## حالات الاستخدام + +- تنظيف المستندات الممسوحة ضوئيًا التي التقط فيها الماسح الضوئي ظهر الأوراق الفارغ من الأصول أحادية الوجه +- إزالة صفحات الفصل من دفعات المستندات الممسوحة بالجملة +- إزالة الصفحات الفارغة التي تضيفها أنظمة إدارة المستندات +- تنظيف ملفات PDF المصدّرة من معالجات النصوص التي تضيف أحيانًا صفحات فارغة في النهاية +- تقليل حجم الملف بإزالة الصفحات الفارغة غير الضرورية + +## نصائح + +- ابدأ بالحساسية الافتراضية 80% ثم عدّل منها. إذا فاتت الأداة صفحات تبدو لك فارغة، فخفّض الحساسية. وإذا علّمت صفحات ذات محتوى خفيف تريد الاحتفاظ بها، فارفعها. +- تعرض الأداة كل صفحة لتحليل محتواها، لذا يزداد وقت المعالجة مع عدد الصفحات. توقع انتظارًا قصيرًا للمستندات الكبيرة جدًا. +- راجع الصفحات الفارغة المكتشفة في المعاينة المصغرة قبل تأكيد الإزالة. قد تُعلَّم الصفحات ذات الرؤوس أو التذييلات أو العلامات المائية الباهتة بحسب إعدادات الحساسية. + +## أدوات ذات صلة + +- [اقتصاص PDF](./crop-pdf) +- [محرر PDF](./edit-pdf) +- [أرقام الصفحات](./page-numbers) diff --git a/docs/ar/tools/remove-metadata.md b/docs/ar/tools/remove-metadata.md new file mode 100644 index 00000000..95b886c1 --- /dev/null +++ b/docs/ar/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: إزالة البيانات الوصفية +description: أزل كل البيانات الوصفية المخفية من ملفات PDF بما في ذلك المؤلف والعنوان وتاريخ الإنشاء والمنتج وبيانات XMP ومعرّفات المستند. +--- + +# إزالة البيانات الوصفية + +يحمل كل ملف PDF بيانات وصفية قد تكشف من أنشأه، وأي برنامج استُخدم، ومتى عُدّل آخر مرة، وغير ذلك. تزيل هذه الأداة كل ذلك: قاموس المعلومات، وتدفقات بيانات XMP الوصفية، ومعرّفات المستند، والبيانات الخاصة بالتطبيقات، لتترك مستندًا نظيفًا بلا أي أثر لأصله. + +## طريقة العمل + +1. ارفع ملف PDF. +2. انقر على **إزالة البيانات الوصفية**. +3. نزّل الملف النظيف. + +لا توجد خيارات للضبط. الأداة شاملة بطبيعتها: تمسح كل شيء. + +## ما الذي تتم إزالته + +- **حقول قاموس المعلومات**: العنوان والمؤلف والموضوع والكلمات المفتاحية والمنشئ والمنتج وتاريخ الإنشاء وتاريخ التعديل +- **تدفق بيانات XMP الوصفية**: كتلة البيانات الوصفية المبنية على XML المخزنة في فهرس المستند +- **معرّفات المستند**: المعرّفات الفريدة في ذيل PDF التي يمكن استخدامها لتتبع مستند عبر الأنظمة +- **PieceInfo**: بيانات وصفية خاصة بالتطبيقات تضيفها برامج مثل Illustrator أو InDesign + +## ما الذي يبقى + +- كل محتوى الصفحات المرئي (النصوص والصور والرسومات) +- حقول النماذج والتعليقات +- الإشارات المرجعية والروابط +- بنية المستند نفسها + +## حالات الاستخدام + +- إزالة اسمك ومؤسستك من مستند قبل نشره دون الكشف عن هويتك +- إزالة الطوابع الزمنية للإنشاء التي تكشف وقت إعداد المستند +- تنظيف سلاسل المنتج التي تحدد البرنامج المستخدم في إنشاء PDF +- تجهيز مستندات للتقديم التنظيمي تتطلب ملفات PDF خالية من البيانات الوصفية +- إزالة آثار سجل التعديل قبل مشاركة مستند خارجيًا + +## نصائح + +- استخدم أداة عرض البيانات الوصفية أولًا لترى بالضبط ما تحتويه ملفات PDF من بيانات وصفية قبل إزالتها. +- إذا أردت إزالة البيانات الوصفية _وكذلك_ JavaScript والتعليقات والملفات المضمّنة، فاستخدم تنظيف PDF لتنظيف أشمل. +- إزالة البيانات الوصفية دائمة. احتفظ بالأصل إذا كنت قد تحتاج إلى تلك البيانات لاحقًا. + +## أدوات ذات صلة + +- [تنظيف PDF](./sanitize-pdf): أزل البيانات الوصفية إضافة إلى السكربتات والمرفقات وغيرها +- [حماية PDF](./protect-pdf): احمِ ملف PDF النظيف بكلمة مرور +- [ضغط PDF](./compress-pdf): قد تقلل إزالة البيانات الوصفية حجم الملف قليلًا، واستخدم الضغط لتوفير أكبر diff --git a/docs/ar/tools/remove-restrictions.md b/docs/ar/tools/remove-restrictions.md new file mode 100644 index 00000000..a41f7975 --- /dev/null +++ b/docs/ar/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: إزالة القيود +description: أزل الحماية بكلمة المرور وقيود الطباعة وأقفال التحرير وحدود النسخ من ملفات PDF. +--- + +# إزالة القيود + +يمكن أن يحمل PDF نوعين من كلمات المرور: كلمة مرور المستخدم (مطلوبة لفتح الملف) وكلمة مرور المالك (تتحكم فيما يمكنك فعله به). تزيل هذه الأداة الاثنين مع كل القيود المرتبطة بهما: أقفال الطباعة والتحرير والنسخ والتعليق. + +## طريقة العمل + +1. ارفع ملف PDF. +2. إذا كان لملف PDF كلمة مرور مالك، فأدخلها في حقل **كلمة مرور المالك**. اتركه فارغًا إذا كان ملف PDF يحتوي على قيود استخدام فقط دون كلمة مرور. +3. انقر على **إزالة القيود**. +4. نزّل ملف PDF الخالي من القيود. + +تستخدم الأداة الخيارين `--decrypt` و`--remove-restrictions` من QPDF لإنتاج نسخة نظيفة وغير مقيدة. + +## ما الذي تتم إزالته + +- الحماية بكلمة المرور (كلمتا مرور المستخدم والمالك) +- قيود الطباعة +- قيود التحرير +- قيود نسخ النصوص والصور +- قيود التعليق والتدوين +- كل القيود الأمنية الأخرى المضمّنة في PDF + +## حالات الاستخدام + +- فتح قفل ملف PDF تملكه لكنك عيّنت كلمة مروره قبل سنوات +- إزالة قيود الطباعة من مستند يحق لك الوصول إليه +- تمكين النسخ واللصق في المراجع لتدوين الملاحظات +- تجهيز ملفات PDF لأدوات إمكانية الوصول التي لا تتعامل مع المستندات المقيدة + +## نصائح + +- يجب أن تعرف كلمة مرور المالك إذا كانت معيّنة. لا تكسر هذه الأداة كلمات المرور ولا تخمّنها بالقوة الغاشمة. +- إذا أردت إبقاء الملف مشفرًا مع تغيير أذونات محددة، فاستخدم أداة تغيير الأذونات بدلًا من ذلك. +- لا يحتوي الملف الناتج على أي تشفير، فيمكن لأي شخص يستلمه فتحه بحرية. + +## أدوات ذات صلة + +- [إلغاء قفل PDF](./unlock-pdf): افتح قفل ملف PDF عندما تعرف كلمة مرور المستخدم +- [حماية PDF](./protect-pdf): أعد تطبيق التشفير بإعدادات جديدة +- [تغيير الأذونات](./change-permissions): عدّل الإجراءات المسموح بها بشكل انتقائي diff --git a/docs/ar/tools/repair-pdf.md b/docs/ar/tools/repair-pdf.md new file mode 100644 index 00000000..a5c61c04 --- /dev/null +++ b/docs/ar/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: إصلاح PDF +description: استعد البيانات من ملفات PDF التالفة أو المعطوبة باستخدام محرك الإصلاح في QPDF. يدعم المعالجة الدفعية. +--- + +# إصلاح PDF + +عندما يرفض ملف PDF أن يُفتح أو يعرض محتوى مشوشًا أو يسبب أخطاء في برنامج العرض، تحاول هذه الأداة إعادة بناء بنيته الداخلية. تستخدم محرك الإصلاح في QPDF الذي يستطيع استعادة البيانات من أنواع كثيرة من التلف: جداول المراجع المتقاطعة المكسورة، والتدفقات المقتطعة، ومراجع الكائنات غير الصالحة، وغيرها. + +## طريقة العمل + +1. ارفع ملف PDF تالفًا واحدًا أو أكثر. +2. انقر على **إصلاح PDF**. +3. يُنزَّل الملف المُصلَح الواحد مباشرة. أما الملفات المتعددة فتنتج أرشيف ZIP. + +تمرر الأداة كل ملف عبر QPDF مع الخيار `--decrypt`، الذي يجبر QPDF على قراءة بنية PDF بالكامل وإعادة كتابتها، فتُصلَح المشكلات القابلة للإصلاح أثناء ذلك. + +## الميزات + +- إصلاح دفعي لعدة ملفات PDF في عملية واحدة +- اكتشاف تلقائي للملفات القابلة للاسترداد وغير القابلة له +- تقرير نجاح/فشل لكل ملف عند معالجة ملفات متعددة +- يستخدم QPDF (WebAssembly)، وهي مكتبة مجرَّبة لتحويل PDF + +## ما الذي يمكنها إصلاحه + +- جداول المراجع المتقاطعة المكسورة أو المفقودة +- نهايات الملفات المقتطعة بسبب تنزيلات غير مكتملة +- ترقيم الكائنات وأطوال التدفقات غير الصالحة +- التناقضات البنيوية الطفيفة الناتجة عن مولدات PDF المعيبة +- آثار التشفير الناتجة عن محاولات فك تشفير فاشلة + +## ما الذي لا يمكنها إصلاحه + +- الملفات المقتطعة بشدة التي فُقد معظم بيانات محتواها +- ملفات PDF المشفرة بكلمة مرور لا تملكها +- الملفات التي ليست PDF فعليًا (امتداد ملف خاطئ) +- تلف الصور داخل PDF (تُصلَح البنية لكن لا يُعاد توليد بيانات البكسل) + +## حالات الاستخدام + +- استعادة ملف PDF من تنزيل فاشل عبر البريد الإلكتروني +- فتح ملفات أنتجتها مولدات PDF قديمة أو غير قياسية +- إصلاح ملفات PDF التي تعمل في برنامج عرض ولا تعمل في آخر +- تجهيز مستندات أرشيفية تالفة للتخزين طويل الأمد + +## نصائح + +- إذا فشل الإصلاح، فجرّب فتح الملف في المتصفح أولًا، فللمتصفحات منطق استرداد خاص بها وقد تعرض محتوى كافيًا لإعادة حفظه. +- بالنسبة لملفات PDF المشفرة التي يفشل إصلاحها، جرّب فك تشفير PDF أولًا، ثم أصلح الناتج بعد فك التشفير. + +## أدوات ذات صلة + +- [ضغط PDF](./compress-pdf): نظّف بنية ملف PDF المُصلَح أكثر +- [تحسين PDF للويب](./linearize-pdf): حسّن الملف المُصلَح للعرض عبر الويب +- [تسطيح PDF](./flatten-pdf): سطّح النماذج التي ربما تضررت diff --git a/docs/ar/tools/reverse-pages.md b/docs/ar/tools/reverse-pages.md new file mode 100644 index 00000000..ea92a4e9 --- /dev/null +++ b/docs/ar/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: عكس الصفحات +description: اعكس ترتيب صفحات ملف PDF أو أكثر ليصبح آخر صفحة هي الأولى. +--- + +# عكس الصفحات + +اعكس ترتيب صفحات ملف PDF بحيث تصبح الصفحة الأخيرة هي الأولى، والصفحة قبل الأخيرة هي الثانية، وهكذا. يدعم المعالجة الدفعية لعدة ملفات في آنٍ واحد. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا أو أكثر. +2. انقر على زر المعالجة. +3. يُعكس كل ملف بشكل مستقل. إذا رفعت ملفات متعددة، فالناتج أرشيف ZIP يحتوي على كل ملفات PDF المعكوسة. +4. يُنزَّل الملف الواحد مباشرة بصيغة PDF معكوس. + +## الميزات + +- معالجة دفعية: اعكس عدة ملفات PDF في عملية واحدة +- ناتج بملف واحد لملف PDF واحد، وبصيغة ZIP للملفات المتعددة +- أزرار إزالة لكل ملف قبل المعالجة +- تحافظ على كل محتوى الصفحات وتنسيقها + +## حالات الاستخدام + +- إصلاح مستند مُسح ضوئيًا بترتيب معكوس +- تجهيز عرض تقديمي بصيغة PDF ليُقرأ من الخلف إلى الأمام +- عكس ترتيب الصفحات لسير عمل طباعة معين يغذّي الصفحات بترتيب معكوس +- تصحيح مستند جُمعت صفحاته بالخطأ بترتيب معكوس + +## نصائح + +- يُعكس كل ملف في الدفعة بشكل مستقل، ولا يُعاد ترتيب الملفات نفسها بالنسبة لبعضها. +- لإعادة ترتيب أدق للصفحات (وليس عكسًا كاملًا فقط)، استخدم [تنظيم وتكرار](./organize-pdf). + +## أدوات ذات صلة + +- [تنظيم وتكرار](./organize-pdf) +- [تدوير PDF](./rotate-pdf) +- [أداة PDF المتعددة](./pdf-multi-tool) diff --git a/docs/ar/tools/rotate-custom.md b/docs/ar/tools/rotate-custom.md new file mode 100644 index 00000000..d659bccb --- /dev/null +++ b/docs/ar/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: تدوير بزاوية مخصصة +description: دوّر صفحات PDF بأي زاوية مع إدخال درجات لكل صفحة وعناصر تحكم للتدوير الدفعي. +--- + +# تدوير بزاوية مخصصة + +دوّر صفحات PDF بأي زاوية تريدها، وليس فقط بمضاعفات 90 درجة. لكل صفحة حقل زاوية خاص بها، ويمكنك تطبيق زاوية واحدة على كل الصفحات دفعة واحدة باستخدام عنصر التحكم الدفعي. + +## طريقة العمل + +1. ارفع ملف PDF. تُعرض صور مصغرة لكل صفحة. +2. لكل صفحة حقل إدخال رقمي يعرض زاوية تدويرها الحالية. +3. اكتب أي قيمة بالدرجات (موجبة أو سالبة) لتدوير صفحة محددة، أو استخدم أزرار اليسار/اليمين لكل صفحة لتعديلات سريعة بمقدار 90 درجة. +4. استخدم حقل **الزاوية الدفعية** في الأعلى لتعيين تدوير موحد لكل الصفحات. +5. انقر على زر المعالجة لإنشاء ملف PDF المدوَّر. + +## الميزات + +- إدخال حر للدرجات لكل صفحة (أي عدد صحيح) +- عنصر تحكم بزاوية دفعية لتعيين التدوير نفسه على كل صفحة +- معاينة فورية للتدوير في الصور المصغرة +- أزرار تدوير سريع لكل صفحة بمقدار 90 درجة +- تحميل الصور المصغرة عند الحاجة لأداء أفضل في المستندات الكبيرة + +## حالات الاستخدام + +- تصحيح المسوحات الضوئية المائلة قليلًا بضع درجات +- تدوير الصفحات لتطابق متطلبات اتجاه غير قياسية +- تطبيق تدويرات دقيقة على صفحات فردية في مستند متنوع المحتوى +- ضبط زوايا الصفحات بدقة بعد تدوير جماعي أولي + +## نصائح + +- القيم الموجبة تدور مع اتجاه عقارب الساعة، والقيم السالبة عكس اتجاه عقارب الساعة. +- يستبدل حقل الزاوية الدفعية كل زوايا الصفحات عند تطبيقه. أجرِ التعديلات الفردية بعد العملية الدفعية عند الحاجة. +- لتدويرات 90/180/270 درجة القياسية بواجهة أبسط، استخدم [تدوير PDF](./rotate-pdf). + +## أدوات ذات صلة + +- [تدوير PDF](./rotate-pdf) +- [أداة PDF المتعددة](./pdf-multi-tool) +- [تنظيم وتكرار](./organize-pdf) diff --git a/docs/ar/tools/rotate-pdf.md b/docs/ar/tools/rotate-pdf.md new file mode 100644 index 00000000..c661ba3f --- /dev/null +++ b/docs/ar/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: تدوير PDF +description: دوّر صفحات فردية أو كل صفحات ملف PDF بمضاعفات 90 درجة عبر واجهة صور مصغرة مرئية. +--- + +# تدوير PDF + +دوّر صفحات ملف PDF بمقدار 90 درجة مع اتجاه عقارب الساعة أو عكسه. تعرض الأداة معاينات مصغرة لكل صفحة، فتتيح لك تدويرها فرديًا أو تطبيق تدوير جماعي على المستند بأكمله. + +## طريقة العمل + +1. ارفع ملف PDF. تُعرض الصور المصغرة لكل صفحة في شبكة. +2. استخدم أزرار التدوير يسارًا/يمينًا أسفل كل صورة مصغرة لتدوير تلك الصفحة تحديدًا. +3. استخدم عناصر التدوير الجماعي في الأعلى لتدوير كل الصفحات دفعة واحدة. +4. تتحدث المعاينة المصغرة فوريًا لتُظهر التدوير. +5. انقر على زر المعالجة لحفظ ملف PDF المدوَّر. + +## الميزات + +- تدوير لكل صفحة بمضاعفات 90 درجة (يسارًا أو يمينًا) +- تدوير جماعي لكل الصفحات في آنٍ واحد +- معاينة مصغرة فورية مع انتقالات تدوير متحركة +- تحميل الصور المصغرة عند الحاجة لأداء سلس في المستندات الكبيرة +- تحافظ على محتوى الصفحات الأصلي وجودته + +## حالات الاستخدام + +- إصلاح الصفحات الممسوحة ضوئيًا بشكل جانبي أو مقلوبة +- تدوير الصفحات الأفقية إلى اتجاه عمودي (أو العكس) +- تصحيح مستند متنوع الاتجاهات مُسحت بعض صفحاته بزاوية خاطئة +- تجهيز مستند لاتجاه عرض معين + +## نصائح + +- التدويرات تراكمية. النقر على زر اتجاه عقارب الساعة مرتين يطبّق تدويرًا بمقدار 180 درجة. +- للتدويرات التي ليست من مضاعفات 90 درجة (مثل 45 درجة لتصحيح مسح ضوئي مائل قليلًا)، استخدم [تدوير بزاوية مخصصة](./rotate-custom) بدلًا من ذلك. +- تؤثر عناصر التدوير الجماعي على كل الصفحات، وليس على المحددة فقط. لا توجد آلية تحديد في هذه الأداة، وللتحديد استخدم [أداة PDF المتعددة](./pdf-multi-tool). + +## أدوات ذات صلة + +- [تدوير بزاوية مخصصة](./rotate-custom) +- [أداة PDF المتعددة](./pdf-multi-tool) +- [تنظيم وتكرار](./organize-pdf) diff --git a/docs/ar/tools/rtf-to-pdf.md b/docs/ar/tools/rtf-to-pdf.md new file mode 100644 index 00000000..d419252c --- /dev/null +++ b/docs/ar/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF إلى PDF +description: حوّل ملفات Rich Text Format (RTF) إلى PDF داخل متصفحك باستخدام محرك يعمل بـ LibreOffice. +--- + +# RTF إلى PDF + +حوّل مستندات Rich Text Format إلى PDF. RTF صيغة مستندات متعددة المنصات تدعمها تقريبًا كل معالجات النصوص. تستخدم هذه الأداة محرك LibreOffice يعمل داخل المتصفح لعرض ملفات RTF مع الحفاظ على تنسيقها: الخط العريض والمائل والجداول والصور المضمّنة كلها تنتقل إلى PDF. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | أنواع MIME | +| :----- | :--------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملف RTF واحدًا أو أكثر وأفلته. +2. راجع قائمة الملفات. أضف المزيد أو أزل ما لا تحتاجه. +3. انقر على **تحويل إلى PDF**. يُهيَّأ محرك LibreOffice عند أول استخدام، ثم يعالج كل ملف. +4. يُنزَّل الملف الواحد مباشرة بصيغة PDF. أما الملفات المتعددة فتُسلَّم باسم `rtf-converted.zip`. + +## الخيارات + +لا تحتوي هذه الأداة على إعدادات إضافية. يحافظ التحويل على تنسيق RTF الأصلي. + +## الناتج + +| عدد الملفات المدخلة | الناتج | +| :------------------ | :-------------------------------------------------------- | +| ملف واحد | تنزيل ملف PDF واحد (مثل `letter.pdf`) | +| ملفان أو أكثر | أرشيف ZIP (`rtf-converted.zip`) يحتوي على ملف PDF لكل ملف | + +## حالات الاستخدام + +- تحويل مستندات RTF القديمة من معالجات النصوص الأقدم إلى ملفات PDF حديثة +- تحويل قوالب البريد الإلكتروني بصيغة RTF إلى معاينات PDF +- معالجة مخرجات RTF من الأنظمة القانونية أو الطبية +- تحويل ملفات RTF من نظام إدارة مستندات إلى PDF للأرشفة دفعة واحدة + +## نصائح + +- يُحمَّل محرك LibreOffice مرة واحدة ويُخزَّن مؤقتًا. يستغرق التحويل الأول في الجلسة بضع ثوانٍ إضافية، وتكون التحويلات اللاحقة أسرع. +- قد لا تُعرض كائنات OLE المضمّنة في ملفات RTF بشكل مثالي. أما النص العادي والصور والتنسيق القياسي فتُحوَّل بموثوقية. +- إذا أُنشئت ملفات RTF بواسطة Microsoft Word، فيمكنك أيضًا تحويلها مباشرة بأداة [Word إلى PDF](./word-to-pdf) التي تقبل RTF إلى جانب DOC وDOCX. + +## أدوات ذات صلة + +- [Word إلى PDF](./word-to-pdf) +- [ODT إلى PDF](./odt-to-pdf) +- [نص إلى PDF](./txt-to-pdf) diff --git a/docs/ar/tools/sanitize-pdf.md b/docs/ar/tools/sanitize-pdf.md new file mode 100644 index 00000000..4d7f02ca --- /dev/null +++ b/docs/ar/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: تنظيف PDF +description: أزل المحتوى المخفي والخطير محتملًا من ملفات PDF بما في ذلك البيانات الوصفية وJavaScript والملفات المضمّنة والتعليقات والطبقات. +--- + +# تنظيف PDF + +يمكن أن تحمل ملفات PDF أكثر بكثير مما تراه على الشاشة. فالبيانات الوصفية المخفية وJavaScript المضمّن ومرفقات الملفات وبيانات النماذج ومعلومات الطبقات قد تسرّب بيانات حساسة أو تشكل مخاطر أمنية. يزيل التنظيف كل ذلك، ليترك لك مستندًا نظيفًا وآمنًا للمشاركة العلنية. + +## طريقة العمل + +1. ارفع ملف PDF. +2. حدد العناصر المراد إزالتها من قائمة الخيارات. +3. انقر على **تنظيف PDF**. +4. نزّل الملف النظيف. + +## خيارات التنظيف + +كل الخيارات مفعّلة افتراضيًا. ألغِ تحديد أي خيار تريد الإبقاء عليه. + +| الخيار | ما الذي يزيله | +| -------------------------- | ----------------------------------------------------------------- | +| **تسطيح النماذج** | يحوّل حقول النماذج التفاعلية إلى محتوى ثابت | +| **إزالة البيانات الوصفية** | يزيل المؤلف والعنوان وتاريخ الإنشاء ومعلومات البرنامج وبيانات XMP | +| **إزالة التعليقات** | يحذف الملاحظات والتمييزات والملاحظات اللاصقة وعلامات التدوين | +| **إزالة JavaScript** | يزيل السكربتات المضمّنة التي قد تُنفَّذ عند الفتح | +| **إزالة الملفات المضمّنة** | يزيل مرفقات الملفات المضمّنة داخل PDF | +| **إزالة الطبقات (OCG)** | يسطّح مجموعات المحتوى الاختياري في طبقة واحدة | +| **إزالة الروابط** | يزيل الروابط التشعبية ومراجع URL | +| **إزالة شجرة البنية** | يزيل بنية المستند المستخدمة في وسوم إمكانية الوصول | +| **إزالة MarkInfo** | يزيل معلومات المحتوى الموسوم | +| **إزالة الخطوط** | يزيل بيانات الخطوط المضمّنة (استخدمه بحذر) | + +## حالات الاستخدام + +- تجهيز ملف PDF للنشر العلني بإزالة البيانات الوصفية الداخلية (أسماء المؤلفين وإصدارات البرامج وسجل التعديل) +- إزالة JavaScript من ملف PDF وارد من مصدر غير موثوق قبل فتحه +- تنظيف ملف PDF قبل إرساله إلى عميل لا ينبغي أن يرى التعليقات المضمّنة أو أسماء حقول النماذج +- إزالة الطبقات المخفية من رسم معماري قبل مشاركة النسخة النهائية +- الامتثال لمتطلبات تقليل البيانات بموجب لوائح الخصوصية + +## نصائح + +- اترك "إزالة الخطوط" غير محدد ما لم تكن متأكدًا من أن ملف PDF سيظهر بشكل صحيح بعد ذلك. قد تجعل إزالة الخطوط النص غير مرئي في بعض برامج العرض. +- إذا كنت تحتاج فقط إلى إزالة البيانات الوصفية، فأداة إزالة البيانات الوصفية المخصصة أسرع وأكثر تركيزًا. +- التنظيف لا رجعة فيه. احتفظ بملفك الأصلي. + +## أدوات ذات صلة + +- [إزالة البيانات الوصفية](./remove-metadata): أزل البيانات الوصفية فقط دون المساس بالمحتوى الآخر +- [تسطيح PDF](./flatten-pdf): سطّح النماذج والتعليقات تحديدًا +- [حماية PDF](./protect-pdf): أضف حماية بكلمة مرور بعد التنظيف +- [تحويل PDF إلى صور نقطية](./rasterize-pdf): الخيار الأشد: حوّل إلى صور للقضاء على كل المحتوى المخفي diff --git a/docs/ar/tools/scanner-effect.md b/docs/ar/tools/scanner-effect.md new file mode 100644 index 00000000..f6666f63 --- /dev/null +++ b/docs/ar/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: تأثير الماسح الضوئي +description: اجعل ملف PDF يبدو كمستند ممسوح ضوئيًا مع ضوضاء وتدوير وتمويه وتأثيرات تقادم الورق القابلة للضبط. +--- + +# تأثير الماسح الضوئي + +حوّل ملف PDF رقميًا نظيفًا إلى ما يبدو وكأنه خرج من ماسح ضوئي مسطح. تطبّق الأداة ضوضاء وتدويرًا طفيفًا وتمويهًا وتغييرات في السطوع واصفرارًا اختياريًا لمحاكاة عيوب المسح الضوئي الفعلي. + +## طريقة العمل + +1. ارفع ملف PDF. +2. يفتح المحرر مع معاينة مباشرة للصفحة الأولى بجانب لوحة الإعدادات. +3. اضبط معاملات تأثير المسح باستخدام أشرطة التمرير ومفاتيح التبديل. +4. تتحدث المعاينة فوريًا أثناء تغيير الإعدادات. +5. انقر على **تطبيق** لمعالجة كل الصفحات وتنزيل النتيجة. + +## الخيارات + +- **فضاء الألوان (مفتاح تدرج الرمادي)**: حوّل الناتج إلى تدرج الرمادي لمظهر مسح كلاسيكي بالأبيض والأسود. +- **الحدود**: أضف حدودًا داكنة خفيفة حول أطراف الصفحة لمحاكاة آثار حدود الماسح الضوئي. +- **التدوير**: طبّق تدويرًا طفيفًا (من -5 إلى +5 درجات) لمحاكاة تغذية الورق غير المستقيمة. +- **تباين التدوير**: أضف تباينًا عشوائيًا إلى زاوية التدوير ليميل كل صفحة ميلًا مختلفًا قليلًا. +- **السطوع**: ارفع السطوع العام أو اخفضه. +- **التباين**: اضبط التباين لمحاكاة اختلافات جودة الحبر. +- **التمويه**: طبّق تمويهًا غاوسيًا لتليين حواف النص كما في مسح منخفض الجودة. +- **الضوضاء**: أضف ضوضاء بكسلات عشوائية لمحاكاة حبيبات مستشعر الماسح الضوئي. القيم الأعلى تنتج نتائج أكثر خشونة. +- **الاصفرار**: أضف صبغة صفراء دافئة لمحاكاة الورق القديم أو المعاد تدويره. +- **الدقة**: عيّن الدقة (DPI) للناتج. القيم الأدنى تعطي مظهرًا أكثر تحببًا يشبه المسح الضوئي. +- **إعادة تعيين**: أعد كل الإعدادات إلى قيمها الافتراضية. + +## الميزات + +- معاينة فورية تتحدث أثناء تعديل كل معامل +- تباين عشوائي في التدوير لكل صفحة لتنوع واقعي +- عشرة معاملات قابلة للضبط بشكل مستقل +- وضع تدرج الرمادي لناتج مسح أصيل بالأبيض والأسود +- تحكم في الدقة من جودة الفاكس المنخفضة إلى جودة الأرشيف العالية + +## حالات الاستخدام + +- جعل المستندات المنشأة رقميًا تبدو كأنها طُبعت ثم مُسحت ضوئيًا +- محاكاة تقادم المستندات الورقية لإعادة إنشاء مستندات تاريخية +- اختبار برامج التعرف الضوئي على الحروف مع جودة مسح متدهورة +- إنتاج مستندات تطابق النمط المرئي لأرشيفات ممسوحة ضوئيًا موجودة + +## نصائح + +- ابدأ بقيم خفيفة. مستوى ضوضاء 10 إلى 20 وتدوير طفيف بمقدار 0.5 درجة وتمويه أدنى تكفي لمظهر مسح مقنع. +- اجمع وضع تدرج الرمادي مع اصفرار طفيف لتأثير "نسخة من نسخة". +- إعدادات الدقة المنخفضة (100 إلى 150 DPI) تعطي مظهر جهاز الفاكس الأكثر واقعية. + +## أدوات ذات صلة + +- [عكس الألوان](./invert-colors) +- [ضبط الألوان](./adjust-colors) +- [لون الخلفية](./background-color) diff --git a/docs/ar/tools/sign-pdf.md b/docs/ar/tools/sign-pdf.md new file mode 100644 index 00000000..2ebd2145 --- /dev/null +++ b/docs/ar/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: توقيع PDF +description: ارسم توقيعًا أو اكتبه أو ارفعه وضعه على صفحات PDF عبر عارض مدمج. +--- + +# توقيع PDF + +أضف توقيعك إلى أي مستند PDF. تضمّن الأداة عارض PDF كاملًا بأدوات توقيع مدمجة، يمكنك فيها رسم توقيع بيدك أو كتابة اسمك بخط توقيع أو رفع صورة توقيع. ضع التوقيعات وغيّر حجمها على أي صفحة، ثم احفظ المستند الموقَّع. + +## طريقة العمل + +1. ارفع ملف PDF. +2. يفتح المستند في عارض PDF مدمج بأدوات تعليق. +3. استخدم أداة التوقيع في العارض لإنشاء توقيعك بالرسم أو الكتابة أو رفع صورة. +4. انقر على الصفحة في المكان الذي تريد وضع التوقيع فيه واضبط حجمه وموضعه. +5. يمكنك اختياريًا تحديد **تسطيح PDF** لتضمين التوقيع نهائيًا في المستند. +6. انقر على **حفظ وتنزيل PDF الموقَّع** للحصول على ملفك الموقَّع. + +## الخيارات + +- **تسطيح PDF**: عند تحديده، يُضمَّن التوقيع نهائيًا في محتوى الصفحة. يمنع هذا الآخرين من تحريك التوقيع أو حذفه. وعند عدم تحديده، يبقى التوقيع تعليقًا يمكن تحريره في برامج العرض المتوافقة. + +## الميزات + +- ثلاث طرق لإنشاء التوقيع: الرسم اليدوي أو النص المكتوب أو الصورة المرفوعة +- عارض PDF مدمج للتموضع الدقيق +- السحب لتحديد موضع التوقيعات وتغيير حجمها على أي صفحة +- تسطيح اختياري لتضمين التوقيعات نهائيًا +- دعم عدة توقيعات في المستند نفسه + +## حالات الاستخدام + +- توقيع العقود والاتفاقيات ونماذج الموافقة قبل إعادة إرسالها +- إضافة توقيعك إلى المستندات الضريبية ومطالبات التأمين والنماذج الحكومية +- وضع الأحرف الأولى على صفحات فردية من اتفاقية متعددة الصفحات +- توقيع اتفاقيات عدم الإفصاح أو مستندات الموارد البشرية التي تصل كمرفقات PDF + +## نصائح + +- فعّل التسطيح إذا كنت سترسل ملف PDF الموقَّع إلى شخص لا ينبغي أن يتمكن من إزالة توقيعك أو تغيير موضعه. +- للتوقيعات الرقمية الملزمة قانونيًا مع التحقق القائم على الشهادات، يقدم BentoPDF أيضًا أداة توقيع رقمي منفصلة. +- ارفع صورة توقيع بصيغة PNG بخلفية شفافة للحصول على أنظف نتيجة. + +## أدوات ذات صلة + +- [محرر PDF](./edit-pdf) +- [إضافة أختام](./add-stamps) +- [تعبئة النماذج](./form-filler) diff --git a/docs/ar/tools/split-pdf.md b/docs/ar/tools/split-pdf.md new file mode 100644 index 00000000..759720ef --- /dev/null +++ b/docs/ar/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: تقسيم PDF +description: قسّم ملف PDF إلى ملفات أصغر بحسب نطاق الصفحات أو التحديد المرئي أو الإشارات المرجعية أو الصفحات الزوجية والفردية أو فواصل ثابتة. +--- + +# تقسيم PDF + +قسّم ملف PDF إلى مستندات أصغر باستخدام أحد ستة أوضاع تقسيم. من نطاقات الصفحات البسيطة إلى التقسيم بحسب الإشارات المرجعية، تتعامل هذه الأداة مع كل سيناريو لتقسيم المستند. + +## طريقة العمل + +1. ارفع ملف PDF واحدًا. +2. اختر وضع التقسيم من القائمة المنسدلة. +3. اضبط الخيارات الخاصة بالوضع (نطاقات الصفحات والتحديدات وغيرها). +4. انقر على زر المعالجة. +5. تُنزَّل النتيجة كملف PDF واحد أو أرشيف ZIP بحسب الوضع والإعدادات. + +## أوضاع التقسيم + +| الوضع | الوصف | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| **نطاق** | أدخل نطاقات صفحات مثل `1-3, 5, 8-10`. النطاقات المتعددة تنتج ملفات PDF منفصلة في ZIP. النطاق الواحد ينتج ملف PDF واحدًا. | +| **تحديد مرئي** | تصفح الصور المصغرة للصفحات وانقر لتحديد الصفحات المطلوبة. تُستخرج الصفحات المحددة في ملف PDF جديد. | +| **زوجي / فردي** | استخرج الصفحات ذات الأرقام الزوجية أو الفردية فقط. | +| **كل الصفحات** | قسّم كل صفحة إلى ملف PDF مستقل، يُنزَّل في ZIP. | +| **الإشارات المرجعية** | قسّم عند حدود الإشارات المرجعية. اختر مستوى الإشارة للتحكم في أماكن التقسيم. | +| **كل N صفحة** | قسّم إلى أجزاء من N صفحة لكل منها (مثلًا كل 5 صفحات). قد يحتوي الجزء الأخير على صفحات أقل. | + +## الميزات + +- ستة أوضاع تقسيم متميزة تغطي تقريبًا كل حالات الاستخدام +- محدد صفحات مرئي مع صور مصغرة تُحمَّل عند الحاجة +- تقسيم يراعي الإشارات المرجعية مع تصفية المستويات +- خيار ناتج ZIP لوضعي النطاق والتحديد المرئي +- يتعامل مع نطاقات الصفحات ذات الصيغة المختلطة (`1-3, 5, 8-10`) +- تحذير عندما ينتج تقسيم N صفحة أجزاء غير متساوية + +## حالات الاستخدام + +- استخراج فصل أو قسم محدد من مستند كبير +- فصل الصفحات الفردية والزوجية لسير عمل الطباعة على الوجهين +- تقسيم كتاب PDF إلى ملفات فصول فردية عند حدود الإشارات المرجعية +- عزل صفحات محددة (مثل صفحة التوقيع) من عقد +- تقسيم تقرير مجمَّع إلى ملفات لكل قسم للتوزيع + +## نصائح + +- النطاقات المتعددة المفصولة بفواصل (مثل `1-5, 10-15, 20-25`) تنتج ملفات PDF منفصلة، واحدًا لكل نطاق، في حزمة ZIP. +- يتطلب وضع التقسيم بالإشارات المرجعية أن يحتوي ملف PDF فعليًا على إشارات مرجعية. إذا لم توجد، فستظهر رسالة خطأ. +- يتيح مربع "تنزيل كملف ZIP" في وضعي النطاق والتحديد المرئي الحصول على ملف PDF منفصل لكل صفحة بدلًا من ملف مجمَّع. + +## أدوات ذات صلة + +- [دمج PDF](./merge-pdf) +- [استخراج الصفحات](./extract-pages) +- [حذف الصفحات](./delete-pages) +- [أداة PDF المتعددة](./pdf-multi-tool) diff --git a/docs/ar/tools/svg-to-pdf.md b/docs/ar/tools/svg-to-pdf.md new file mode 100644 index 00000000..1e3cff9d --- /dev/null +++ b/docs/ar/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG إلى PDF +description: حوّل الرسومات المتجهة SVG إلى PDF مع التحكم في الجودة، بالكامل داخل متصفحك. +--- + +# SVG إلى PDF + +حوّل ملفات Scalable Vector Graphics (SVG) إلى PDF. تحوّل الأداة كل ملف SVG إلى صورة نقطية عبر محرك العرض في المتصفح، ثم تضمّن النتيجة بدقتها الأصلية. مفيدة لتحويل الأيقونات المتجهة والمخططات والرسوم التوضيحية إلى مستندات قابلة للنقل. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :--------- | +| SVG | `.svg` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملف SVG واحدًا أو أكثر وأفلته. +2. راجع قائمة الملفات وأدرها. +3. اختر مستوى **جودة PDF**. +4. انقر على **تحويل إلى PDF**. تُنزَّل النتيجة باسم `from_svgs.pdf`. + +يُقرأ كل ملف SVG كنص، ويُعرض على لوحة رسم بعرضه وارتفاعه الأصليين (الافتراضي 800x600 إذا لم تُحدَّد أبعاد)، ويُصدَّر بصيغة PNG. ثم تُضمَّن صورة PNG هذه في PDF باستخدام pdf-lib. تُملأ المناطق الشفافة بخلفية بيضاء. + +## الخيارات + +تتحكم **جودة PDF** في الضغط بعد التحويل إلى صورة نقطية: + +- **جودة عالية**: الأقرب إلى العرض الأصلي. +- **جودة متوسطة** (الافتراضي): توازن جيد. +- **جودة منخفضة**: أصغر ملف مع بعض فقدان التفاصيل. + +## حالات الاستخدام + +- تحويل المخططات المعمارية أو الهندسية من SVG إلى PDF جاهز للطباعة +- تجميع مجموعات الأيقونات في ملف PDF مرجعي لنظام تصميم +- تحويل تصورات البيانات (D3.js وتصديرات مكتبات الرسوم البيانية) إلى ملفات PDF جاهزة للتقارير +- إنشاء نسخ قابلة للطباعة من الرسوم المعلوماتية المعتمدة على SVG + +## نصائح + +- تُعرض ملفات SVG التي لا تحتوي على السمتين `width` و`height` الصريحتين بحجم 800x600 بكسل. للحصول على أفضل النتائج، عيّن الأبعاد في مصدر SVG قبل التحويل. +- قد لا تُعرض ملفات SVG المعقدة ذات مراجع الخطوط الخارجية أو الصور المرتبطة بشكل مثالي. ضمّن كل الموارد داخل ملف SVG للحصول على ناتج موثوق. +- بما أن ملف SVG يُحوَّل إلى صورة نقطية، سيحتوي ملف PDF على صورة نقطية بدلًا من مسارات متجهة. للحصول على ناتج PDF متجه حقيقي، تلزم أداة متجهة مخصصة. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [PNG إلى PDF](./png-to-pdf) +- [BMP إلى PDF](./bmp-to-pdf) diff --git a/docs/ar/tools/table-of-contents.md b/docs/ar/tools/table-of-contents.md new file mode 100644 index 00000000..d84dcb32 --- /dev/null +++ b/docs/ar/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: جدول المحتويات +description: أنشئ صفحة جدول محتويات منسقة من الإشارات المرجعية الموجودة في ملف PDF. +--- + +# جدول المحتويات + +تقرأ هذه الأداة الإشارات المرجعية (المخططات التفصيلية) في ملف PDF وتنشئ صفحة جدول محتويات منسقة تُضاف إلى بداية المستند. إذا كان ملف PDF يحتوي على إشارات مرجعية لكنه يفتقر إلى صفحة فهرس مرئية، فتنشئ هذه الأداة واحدة تلقائيًا. + +## طريقة العمل + +1. ارفع ملف PDF يحتوي على إشارات مرجعية. +2. خصّص عنوان الفهرس وحجم الخط ونوع الخط. +3. يمكنك اختياريًا تحديد **إضافة إشارة مرجعية لصفحة الفهرس** لإدراج الفهرس نفسه في شجرة الإشارات المرجعية. +4. انقر على **إنشاء جدول المحتويات** لمعالجة الملف. +5. يُنزَّل ملف PDF المحدَّث تلقائيًا مع إدراج صفحة الفهرس في البداية. + +## الخيارات + +- **عنوان الفهرس**: العنوان المعروض في أعلى الصفحة المنشأة. الافتراضي "جدول المحتويات". +- **حجم الخط**: اختر من 10 إلى 72 نقطة. الافتراضي 12 نقطة. +- **نوع الخط**: اختر من متغيرات Times Roman أو Helvetica أو Courier (عادي وعريض ومائل وعريض مائل). الافتراضي Helvetica. +- **إضافة إشارة مرجعية لصفحة الفهرس**: عند تحديده، تُضاف إشارة مرجعية لصفحة الفهرس نفسها إلى شجرة المخطط التفصيلي في PDF. + +## الميزات + +- يقرأ التسلسل الهرمي الكامل للإشارات المرجعية من PDF +- ينشئ صفحة فهرس منسقة بوضوح مع مراجع أرقام الصفحات +- يدعم مستويات الإشارات المرجعية المتداخلة مع الإزاحة +- اختيار من 12 خطًا مدمجًا في PDF +- إشارة مرجعية ذاتية المرجع اختيارية لصفحة الفهرس + +## حالات الاستخدام + +- إضافة جدول محتويات قابل للطباعة إلى الكتب الإلكترونية أو التقارير التي تحتوي على إشارات مرجعية رقمية فقط +- إنشاء فهرس لمستند مدمج بعد جمع عدة ملفات PDF +- إنشاء صفحة مرجعية للأدلة التقنية الطويلة +- تجهيز المستندات للطباعة حيث يُتوقع وجود فهرس مرئي + +## نصائح + +- إذا لم يكن في ملف PDF إشارات مرجعية، فاستخدم أداة [تحرير الإشارات المرجعية](./bookmark) أولًا لإنشائها، ثم عد إلى هنا لإنشاء الفهرس. +- للمستندات الكبيرة، يحسّن حجم خط أكبر مثل 14 أو 16 نقطة سهولة القراءة. + +## أدوات ذات صلة + +- [تحرير الإشارات المرجعية](./bookmark) +- [أرقام الصفحات](./page-numbers) +- [رأس وتذييل الصفحة](./header-footer) diff --git a/docs/ar/tools/text-color.md b/docs/ar/tools/text-color.md new file mode 100644 index 00000000..f1e66cba --- /dev/null +++ b/docs/ar/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: تغيير لون النص +description: غيّر لون كل النصوص في ملف PDF إلى أي لون تختاره. +--- + +# تغيير لون النص + +استبدل لون النص في ملف PDF بالكامل. تحدد الأداة مناطق النص في كل صفحة وتعيد تلوينها باللون الذي تختاره مع الحفاظ على تخطيط المستند والمحتوى غير النصي. + +## طريقة العمل + +1. ارفع ملف PDF. +2. اختر لون النص الجديد باستخدام محدد الألوان. الافتراضي هو الأزرق (#0000FF). +3. انقر على **تغيير لون النص** للمعالجة. +4. يُنزَّل ملف PDF المعاد تلوينه تلقائيًا. يوضح مؤشر التقدم أي صفحة تجري معالجتها. + +## الخيارات + +- **لون النص الجديد**: محدد ألوان لاختيار اللون البديل لكل النصوص في المستند. + +## الميزات + +- يعيد تلوين النص في كل صفحة من المستند +- معالجة لكل صفحة مع عرض التقدم +- محدد ألوان يدعم الألوان السداسية بالكامل +- يحافظ على تخطيط الصفحة والعناصر غير النصية + +## حالات الاستخدام + +- تغيير النص الأسود إلى أزرق داكن لمظهر مستند أخف وأحدث +- إعادة تلوين النص ليتوافق مع إرشادات العلامة التجارية قبل توزيع المستندات +- تحويل النص إلى لون محدد للامتثال لمتطلبات إمكانية الوصول +- جعل النص مرئيًا على خلفية جديدة مطبَّقة + +## نصائح + +- تعرض هذه الأداة الصفحات بمقياس 2x للجودة، ثم تعيد بناء ملف PDF. الناتج قائم على الصور، لذا لن يعود النص قابلًا للتحديد أو البحث. +- للمستندات التي تحتاج فيها إلى إبقاء النص قابلًا للتحديد، فكّر في تحرير ملف PDF مباشرة باستخدام [محرر PDF](./edit-pdf) بدلًا من ذلك. +- يزداد وقت المعالجة مع عدد الصفحات لأن كل صفحة تُعرض على حدة. + +## أدوات ذات صلة + +- [لون الخلفية](./background-color) +- [عكس الألوان](./invert-colors) +- [ضبط الألوان](./adjust-colors) diff --git a/docs/ar/tools/tiff-to-pdf.md b/docs/ar/tools/tiff-to-pdf.md new file mode 100644 index 00000000..d704bc52 --- /dev/null +++ b/docs/ar/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF إلى PDF +description: حوّل صور TIFF أحادية الصفحة ومتعددة الصفحات إلى PDF داخل متصفحك مع دعم كامل للصفحات. +--- + +# TIFF إلى PDF + +حوّل ملفات TIFF إلى PDF، بما فيها ملفات TIFF متعددة الصفحات. تصبح كل صفحة (أو "IFD") في ملف TIFF صفحة منفصلة في ملف PDF الناتج. هذا مفيد خصوصًا للمستندات الممسوحة ضوئيًا والفاكسات والصور الطبية التي تُخزَّن عادةً بصيغة TIFF متعددة الصفحات. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات TIFF وأفلتها. +2. راجع قائمة الملفات وأدرها حسب الحاجة. +3. انقر على **تحويل إلى PDF**. تُنزَّل النتيجة باسم `from_tiff.pdf`. + +تفك الأداة ترميز كل ملف TIFF باستخدام مفكك ترميز TIFF بلغة JavaScript، وتستخرج بيانات بكسلات RGBA الخام لكل صفحة. تُعرض كل صفحة على لوحة رسم وتُصدَّر بصيغة PNG وتُضمَّن في PDF. تطابق أبعاد الصفحات صفحات TIFF الأصلية. + +## الخيارات + +لا تعرض هذه الأداة إعدادات جودة إضافية. تُضمَّن الصور بدقتها الأصلية. + +## حالات الاستخدام + +- تحويل مستندات الفاكس متعددة الصفحات (TIFF-F) إلى صيغة PDF أكثر قابلية للنقل +- تحويل أرشيفات المستندات الممسوحة ضوئيًا المخزنة بصيغة TIFF إلى ملفات PDF قابلة للبحث (اجمعها مع أداة التعرف الضوئي لاحقًا) +- معالجة ملفات التصوير الطبي (شرائح علم الأمراض وتصديرات الأشعة) التي تستخدم TIFF +- تحويل ملفات TIFF الخاصة بنظم المعلومات الجغرافية أو صور الأقمار الصناعية إلى مستندات قابلة للمشاركة + +## نصائح + +- ملفات TIFF متعددة الصفحات مدعومة بالكامل. ملف TIFF من 10 صفحات سينتج ملف PDF من 10 صفحات. لا حاجة إلى تقسيم TIFF أولًا. +- قد تستغرق ملفات TIFF الكبيرة جدًا (مئات الميغابايت) وقتًا أطول لأن الملف بأكمله يجب فك ترميزه في ذاكرة المتصفح. +- إذا احتجت إلى التعرف الضوئي على الحروف في ملف PDF الناتج، فمرّره عبر أداة [التعرف الضوئي على PDF](./ocr-pdf) بعد التحويل. + +## أدوات ذات صلة + +- [صور إلى PDF](./image-to-pdf) +- [BMP إلى PDF](./bmp-to-pdf) +- [JPG إلى PDF](./jpg-to-pdf) diff --git a/docs/ar/tools/txt-to-pdf.md b/docs/ar/tools/txt-to-pdf.md new file mode 100644 index 00000000..f4947bb4 --- /dev/null +++ b/docs/ar/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: نص إلى PDF +description: حوّل ملفات النص العادي أو النص المكتوب إلى PDF مع خطوط وألوان وأحجام صفحات مخصصة. +--- + +# نص إلى PDF + +حوّل النص العادي إلى ملف PDF منسق. يمكنك رفع ملفات `.txt` أو الكتابة مباشرة في محرر النص المدمج. تدعم الأداة عدة خطوط وألوان نص مخصصة ومجموعة واسعة من أحجام الصفحات، من A0 إلى A10، إضافة إلى US Letter وLegal وTabloid. + +## الصيغ المدعومة + +| المدخلات | الامتدادات | +| :------------- | :--------------------- | +| ملفات نص عادي | `.txt` | +| إدخال نص مباشر | اكتب أو الصق في المحرر | + +## طريقة العمل + +1. اختر وضع الإدخال باستخدام المفتاح في الأعلى: **رفع الملفات** أو **كتابة نص**. +2. إذا كنت ترفع ملفات، فاسحب وأفلت أو انقر لاختيار ملف `.txt` واحد أو أكثر. وإذا كنت تكتب، فأدخل النص مباشرة في مربع النص. +3. اضبط خيارات التنسيق: نوع الخط وحجمه ولون النص وحجم الصفحة. +4. انقر على **إنشاء PDF**. يُنزَّل الناتج باسم `text_to_pdf.pdf`. + +عند رفع عدة ملفات، تُدمج محتوياتها مع أسطر فارغة بينها. + +## الخيارات + +| الخيار | القيم | الافتراضي | +| :------------- | :------------------------------------------------------------------------------- | :------------- | +| **نوع الخط** | Helvetica (بلا زوائد)، Tiro (بزوائد)، Courier (أحادي المسافة)، Times (بزوائد) | Helvetica | +| **حجم الخط** | 6 إلى 72 نقطة | 12 | +| **لون النص** | أي لون عبر محدد الألوان | أسود (#000000) | +| **حجم الصفحة** | ISO A0 إلى A10، B0 إلى B10، C0 إلى C10، US Letter، Legal، Tabloid، Ledger، 11x17 | A4 | + +تُكتشف اللغات التي تُكتب من اليمين إلى اليسار (العربية والعبرية والفارسية والأردية) تلقائيًا. وعند العثور على نص من اليمين إلى اليسار، يتبدل اتجاه النص ومحاذاته وفقًا لذلك. + +## حالات الاستخدام + +- تحويل مقتطفات الشيفرة أو ملفات السجل إلى ملف PDF قابل للطباعة بخط Courier +- إنشاء ملف PDF سريع من ملاحظات اجتماع مكتوبة في الحال +- تنسيق مخطوطة نصية عادية بخط وحجم صفحة محددين للتقديم +- إنتاج نسخة PDF من README أو سجل التغييرات للتوزيع دون اتصال + +## نصائح + +- استخدم وضع **كتابة نص** عندما تريد تحويل محتوى الحافظة بسرعة دون حفظه كملف أولًا. +- خط Courier (أحادي المسافة) هو الخيار الأفضل للشيفرة والسجلات وأي محتوى تهم فيه محاذاة الأعمدة. +- هوامش الصفحة ثابتة عند 72 نقطة (بوصة واحدة) من كل الجهات. + +## أدوات ذات صلة + +- [Markdown إلى PDF](./markdown-to-pdf) +- [CSV إلى PDF](./csv-to-pdf) +- [Word إلى PDF](./word-to-pdf) diff --git a/docs/ar/tools/unlock-pdf.md b/docs/ar/tools/unlock-pdf.md new file mode 100644 index 00000000..3dd58627 --- /dev/null +++ b/docs/ar/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: إلغاء قفل PDF +description: أزل حماية كلمة المرور من ملفات PDF المشفرة. يدعم فك التشفير على دفعات بكلمة مرور واحدة لعدة ملفات. +--- + +# إلغاء قفل PDF + +إذا كانت لديك كلمة مرور ملف PDF مشفر، تزيل هذه الأداة التشفير بالكامل وتنتج نسخة غير مقفلة يمكن لأي شخص فتحها دون بيانات اعتماد. وهي تدعم فك التشفير على دفعات عندما تشترك عدة ملفات PDF في كلمة المرور نفسها. + +## طريقة العمل + +1. ارفع ملف PDF مشفرًا واحدًا أو أكثر. +2. أدخل **كلمة المرور** المستخدمة لحماية الملفات. +3. انقر على **فك تشفير PDF**. +4. يتم تنزيل الملف الواحد مباشرة. أما الملفات المتعددة فتنتج أرشيف ZIP يضم جميع ملفات PDF غير المقفلة. + +## الميزات + +- فك التشفير لملف واحد أو على دفعات +- يتعامل مع كلمات مرور المستخدم وكلمات مرور المالك +- ينتج ملفًا غير مشفر تمامًا دون أي قيود متبقية +- رسائل خطأ واضحة عند إدخال كلمة مرور خاطئة أو وجود ملفات تالفة +- تتبع النجاح أو الفشل لكل ملف في وضع الدفعات + +## الفرق بينها وبين إزالة القيود + +تتطلب **فك تشفير PDF** كلمة المرور وتزيل كل أنواع التشفير. أما **إزالة القيود** فتستهدف قيود الاستخدام (الطباعة والنسخ والتحرير) وقد لا تحتاج إلى كلمة مرور إذا كانت كلمة مرور المالك فقط هي المعيّنة. استخدم فك التشفير عندما لا يُفتح ملف PDF إطلاقًا دون كلمة مرور. + +## حالات الاستخدام + +- فتح ملفات PDF التي شفّرتها سابقًا بشكل دائم عندما لا تعود كلمة المرور مطلوبة +- إزالة التشفير من دفعة من المستندات المؤرشفة لتسهيل الوصول إليها على المدى الطويل +- تجهيز ملفات PDF المحمية بكلمة مرور لنظام إدارة مستندات لا يدعم الملفات المشفرة +- فك قفل ملفات PDF قبل دمجها مع مستندات أخرى (فكثير من أدوات الدمج لا تستطيع معالجة المدخلات المشفرة) + +## نصائح + +- يُطبَّق حقل كلمة المرور على جميع الملفات المرفوعة. إذا كانت لملفاتك كلمات مرور مختلفة، فعالجها في دفعات منفصلة. +- إذا ظهر خطأ "كلمة المرور غير صحيحة"، فتحقق من وجود مسافات زائدة أو من تفعيل Caps Lock. +- بعد فك التشفير لا تبقى أي حماية للملف. أعد تشفيره باستخدام تشفير PDF إذا أردت تطبيق كلمة مرور جديدة. + +## أدوات ذات صلة + +- [حماية PDF](./protect-pdf): أعد تطبيق التشفير بكلمة مرور جديدة +- [إزالة القيود](./remove-restrictions): أزل قيود الاستخدام دون فك التشفير بالكامل +- [تغيير الأذونات](./change-permissions): عدّل أذونات محددة في ملف PDF مشفر diff --git a/docs/ar/tools/validate-signature-pdf.md b/docs/ar/tools/validate-signature-pdf.md new file mode 100644 index 00000000..24a2b6e7 --- /dev/null +++ b/docs/ar/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: التحقق من توقيع PDF +description: تحقق من التوقيعات الرقمية في ملفات PDF. افحص صلاحية الشهادة وهوية الموقّع وسلامة المستند وحالة سلسلة الثقة. +--- + +# التحقق من توقيع PDF + +ارفع ملف PDF موقّعًا وستستخرج هذه الأداة كل توقيع رقمي، وتحدد هوية الموقّع، وتفحص صلاحية الشهادة، وتبلغك ما إذا كان المستند قد تغيّر منذ توقيعه. يمكنك أيضًا تقديم شهادة موثوقة للتحقق من سلسلة التوقيع. + +## طريقة العمل + +1. ارفع ملف PDF موقّعًا. يبدأ التحقق تلقائيًا. +2. تعرض الأداة ملخصًا: عدد التوقيعات التي وُجدت وعدد الصالحة منها. +3. يحصل كل توقيع على بطاقة مفصلة تعرض اسم الموقّع والجهة المصدِرة والتواريخ والحالة. +4. يمكنك اختياريًا رفع **شهادة موثوقة** (‎.pem أو ‎.crt أو ‎.cer أو ‎.der) للتحقق من التوقيع مقابل مرساة ثقة محددة. تعمل إعادة التحقق تلقائيًا. + +## ما الذي يُفحص + +### تحليل التوقيع + +تستخرج الأداة كائنات توقيع PKCS#7 من ملف PDF، وتفك ترميز بنية ASN.1، وتستخرج شهادة X.509 الخاصة بالموقّع مع أي سلسلة شهادات مضمّنة في التوقيع. + +### صلاحية الشهادة + +- **انتهاء الصلاحية**: هل الشهادة ضمن نطاق تواريخ صلاحيتها حاليًا؟ +- **اكتشاف التوقيع الذاتي**: هل الشهادة هي مُصدِرة نفسها؟ +- **سلسلة الثقة**: عند تقديم شهادة موثوقة، هل ترتبط شهادة الموقّع بها عبر السلسلة؟ + +### التحقق التشفيري + +- تعيد الأداة بناء البايتات التي يغطيها `/ByteRange` الخاص بالتوقيع، وتحسب لها التجزئة بالخوارزمية التي أعلن عنها الموقّع، وتقارن النتيجة بالسمة `messageDigest` داخل التوقيع. +- ثم تعيد تسلسل السمات الموقّعة كمجموعة DER SET وتتحقق من التوقيع مقابل المفتاح العام لشهادة الموقّع. +- **لا يُبلَّغ عن التوقيع على أنه صالح إلا عند نجاح جميع هذه الفحوص.** إذا تغيرت بايتات PDF بعد التوقيع، أو لم يطابق التوقيع المضمّن مفتاح الموقّع، تعرض الحالة "غير صالح، فشل التحقق التشفيري" مع السبب المحدد. + +#### خوارزميات التوقيع المدعومة + +| الخوارزمية | مسار التحقق | +| ----------------------- | ----------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`، مع بديل Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})`، بعد تحويل التوقيع من DER إلى IEEE P1363 | + +إذا استخدم التوقيع خوارزمية خارج هذه القائمة (مثل Ed25519 أو SM2 أو RSA مع OID غير معتاد للتجزئة)، تعرض البطاقة **"غير متحقق منه، خوارزمية توقيع غير مدعومة"** باللون الأصفر، مع OID المحدد أو السبب. وهذا تمييز متعمد بين ثلاث حالات: + +- **صالح**: تم التحقق من التوقيع تشفيريًا مقابل المفتاح العام للموقّع. +- **غير صالح**: جرى التحقق وأعطى نتيجة سلبية (تغيّرت البايتات أو عدم تطابق المفتاح). +- **غير متحقق منه**: تعذر على الأداة إجراء التحقق لهذه الخوارزمية. تبقى بيانات الشهادة معروضة، لكن عليك التعامل مع التوقيع على أنه "غير معروف" والتحقق منه باستخدام Adobe Acrobat أو `openssl cms -verify`. + +### خوارزميات التجزئة غير الآمنة + +- تُرفض التوقيعات التي تستخدم **MD5 أو SHA-1** وتُعد غير صالحة وتُوسم بحالة "تجزئة غير آمنة". لكلتا الخوارزميتين هجمات تصادم منشورة، لذا لا يوفر التوقيع على تجزئة SHA-1 أو MD5 أي ضمان للسلامة. +- يُقبل كل من SHA-224 وSHA-256 وSHA-384 وSHA-512. + +### تغطية المستند + +- **تغطية كاملة**: يغطي التوقيع ملف PDF بأكمله، أي لم تُضف أو تُغيَّر أي بايتات بعد التوقيع. +- **تغطية جزئية**: يغطي التوقيع جزءًا من الملف فقط. قد يشير ذلك إلى إجراء تعديلات بعد التوقيع (وليس بالضرورة بنية خبيثة، فالحفظ التزايدي ينتج تغطية جزئية). + +## تفاصيل التوقيع + +تعرض كل بطاقة توقيع ما يلي: + +- **وُقّع بواسطة**: الاسم الشائع والمؤسسة والبريد الإلكتروني من شهادة الموقّع +- **المُصدِر**: سلطة الشهادات التي أصدرت شهادة الموقّع +- **تاريخ التوقيع**: الطابع الزمني المضمّن في التوقيع +- **صالح من / صالح حتى**: فترة صلاحية الشهادة +- **السبب**: سبب توقيع المستند (إن وُجد) +- **الموقع**: مكان التوقيع (إن وُجد) +- **حالة التغطية**: كاملة أو جزئية +- **شارة الثقة**: موثوق أو خارج سلسلة الثقة (فقط عند تقديم شهادة مخصصة) + +### التفاصيل التقنية + +وسّع قسم التفاصيل التقنية لعرض: + +- الرقم التسلسلي لشهادة الموقّع +- خوارزمية التجزئة (SHA-256 وSHA-512 وغيرها) +- خوارزمية التوقيع (RSA مع SHA-256 وECDSA مع SHA-256 وغيرها) +- رسائل الخطأ الخاصة بالتوقيعات غير الصالحة + +## حالات الاستخدام + +- التحقق من عقد موقّع رقميًا قبل التوقيع المقابل +- تدقيق المستندات الموقّعة للتأكد من عدم العبث بها +- فحص ما إذا كانت الشهادة قد انتهت صلاحيتها منذ توقيع المستند +- التحقق من التوقيعات مقابل الشهادة الجذرية لمؤسستك +- فحص تفاصيل التوقيع في المستندات الحكومية أو القانونية + +## نصائح + +- الشهادة الموقّعة ذاتيًا لا تعني أن التوقيع غير صالح، بل تعني أنه لا يمكن التحقق من هوية الموقّع عبر طرف ثالث موثوق. وهذا شائع في المستندات الداخلية. +- التغطية الجزئية لا تدل دائمًا على عبث. فكثير من سير عمل PDF يضيف تحديثات تزايدية (مثل توقيع ثانٍ) تنتج تغطية جزئية. +- ارفع الشهادة الجذرية أو الوسيطة لمؤسستك كشهادة موثوقة للحصول على التحقق من سلسلة الثقة. + +## أدوات ذات صلة + +- [توقيع رقمي لـ PDF](./digital-sign-pdf): وقّع ملفات PDF بشهادتك الخاصة +- [تسطيح PDF](./flatten-pdf): سطّح ملف PDF قبل التوقيع لمنع التعديلات بعد التوقيع +- [إزالة البيانات الوصفية](./remove-metadata): نظّف ملف PDF قبل تطبيق التوقيع diff --git a/docs/ar/tools/view-metadata.md b/docs/ar/tools/view-metadata.md new file mode 100644 index 00000000..33c5e4fb --- /dev/null +++ b/docs/ar/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: عرض البيانات الوصفية +description: افحص جميع خصائص البيانات الوصفية في ملف PDF، بما في ذلك معلومات المستند وبيانات XMP والتفاصيل البنيوية. +--- + +# عرض البيانات الوصفية + +اطّلع على الخصائص المخفية المضمّنة في ملف PDF. تعرض الأداة معلومات المستند (العنوان والمؤلف والتواريخ) وبيانات XMP الوصفية وأبعاد الصفحات وغيرها من البيانات البنيوية بصيغة مقروءة. + +## طريقة العمل + +1. ارفع ملف PDF. +2. تحلل الأداة الملف فورًا وتعرض كل البيانات الوصفية المتاحة في أقسام منظمة. +3. راجع قاموس معلومات المستند وشجرة بيانات XMP الوصفية والخصائص البنيوية. +4. لا حاجة إلى خطوة معالجة: تُعرض البيانات الوصفية بمجرد تحميل الملف. + +## الميزات + +- يعرض حقول معلومات المستند القياسية: العنوان والمؤلف والموضوع والكلمات المفتاحية والمنشئ والمنتج +- يعرض تواريخ الإنشاء والتعديل بصيغة مقروءة +- يحلل شجرة بيانات XMP الوصفية كاملة بمساحات أسماء متداخلة ويعرضها +- يحول صيغة تاريخ PDF (`D:20240101120000Z`) إلى تواريخ مقروءة +- منظم في أقسام قابلة للطي لسهولة التنقل + +## أقسام البيانات الوصفية + +| القسم | المحتويات | +| ---------------------- | ----------------------------------------------------------------------------------------- | +| **معلومات المستند** | العنوان والمؤلف والموضوع والكلمات المفتاحية والمنشئ والمنتج وتاريخ الإنشاء وتاريخ التعديل | +| **بيانات XMP الوصفية** | شجرة بيانات وصفية كاملة بصيغة XML مع Dublin Core وXAP وPDF ومساحات أسماء مخصصة | +| **خصائص المستند** | عدد الصفحات وإصدار PDF وحجم الملف وحالة التشفير | + +## حالات الاستخدام + +- معرفة من أنشأ ملف PDF ومتى عُدّل آخر مرة +- التحقق من ضبط البيانات الوصفية بشكل صحيح قبل نشر مستند +- تدقيق ملفات PDF من حيث الخصوصية بفحص المعلومات الشخصية المضمّنة +- معرفة البرنامج المستخدم في إنشاء ملف PDF أو تعديله (عبر حقل المنتج) +- مراجعة بيانات XMP الوصفية للامتثال في إدارة الأصول الرقمية + +## نصائح + +- تُحوَّل سلاسل تاريخ PDF التي تبدأ بـ `D:` تلقائيًا إلى صيغة منطقتك الزمنية المحلية. +- إذا بدت بعض الحقول فارغة، فهذا يعني أن منشئ ملف PDF لم يضبطها. لا تحتوي كل ملفات PDF على بيانات وصفية غنية. +- لتعديل البيانات الوصفية بعد فحصها، استخدم [تعديل البيانات الوصفية](./edit-metadata). ولإزالتها بالكامل، استخدم إزالة البيانات الوصفية. + +## أدوات ذات صلة + +- [تعديل البيانات الوصفية](./edit-metadata) +- [طبقات PDF OCG](./pdf-layers) +- [مقارنة ملفات PDF](./compare-pdfs) diff --git a/docs/ar/tools/vsd-to-pdf.md b/docs/ar/tools/vsd-to-pdf.md new file mode 100644 index 00000000..debe4a7f --- /dev/null +++ b/docs/ar/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD إلى PDF +description: حوّل مخططات Microsoft Visio (VSD/VSDX) إلى PDF في متصفحك. مجاني وخاص ولا يتطلب Visio. +--- + +# VSD إلى PDF + +حوّل مخططات Microsoft Visio إلى PDF دون تثبيت Visio. تحتوي ملفات VSD وVSDX على مخططات انسيابية ومخططات هيكلية ومخططات شبكات ومخططات طوابق يعجز معظم الناس عن فتحها. تعرضها هذه الأداة كملفات PDF نظيفة يمكن عرضها على أي جهاز. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----------- | :------- | :--------------------------------------- | +| Visio Binary | `.vsd` | صيغة Visio القديمة (Visio 2003 وما قبله) | +| Visio XML | `.vsdx` | صيغة Visio الحديثة (Visio 2013 وما بعده) | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات VSD أو VSDX وأفلتها. يمكن خلط الصيغتين في دفعة واحدة. +2. راجع قائمة الملفات. أزل الإدخالات غير المرغوبة بأيقونة سلة المهملات، أو استخدم **إضافة المزيد من الملفات** لإضافة مخططات أخرى. +3. انقر على **تحويل إلى PDF**. يُحمَّل المحرك المعتمد على LibreOffice في المتصفح ويحوّل كل مخطط إلى PDF مع الحفاظ على الأشكال والموصلات والتسميات وتخطيط الصفحة. +4. يُنزَّل المخطط الواحد مباشرة كملف PDF. أما الملفات المتعددة فتنتج أرشيف ZIP باسم `vsd-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى أي إعداد. يحترم المحوّل حجم الصفحة واتجاهها الأصليين من مستند Visio. + +## حالات الاستخدام + +- مراجعة مخططات Visio من زميل عندما لا تملك ترخيص Visio +- تضمين مخططات الشبكات أو البنية في وثائق المشروع بصيغة PDF +- طباعة المخططات الهيكلية أو مخططات سير العمل كمطبوعات للاجتماعات +- أرشفة ملفات VSD القديمة من إصدارات Visio السابقة بصيغة تدوم مستقبلًا + +## نصائح + +- تنتج مستندات Visio متعددة الصفحات ملفات PDF متعددة الصفحات، وتقابل كل صفحة Visio صفحة PDF. +- تُحوَّل ملفات VSDX (الصيغة الحديثة المعتمدة على XML) عمومًا بدقة أعلى من ملفات VSD الثنائية الأقدم. +- يُحمَّل محرك LibreOffice مرة واحدة في كل جلسة. توقع انتظارًا قصيرًا عند أول تحويل، ونتائج أسرع مع الملفات اللاحقة. + +## أدوات ذات صلة + +- [ODG إلى PDF](./odg-to-pdf) +- [PUB إلى PDF](./pub-to-pdf) +- [PSD إلى PDF](./psd-to-pdf) diff --git a/docs/ar/tools/webp-to-pdf.md b/docs/ar/tools/webp-to-pdf.md new file mode 100644 index 00000000..16924c28 --- /dev/null +++ b/docs/ar/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP إلى PDF +description: حوّل صور WebP إلى صيغة PDF مباشرة في متصفحك مع جودة ضغط قابلة للتعديل. +--- + +# WebP إلى PDF + +حوّل صيغة الصور WebP من Google إلى PDF. هذا مفيد خصوصًا عندما تنزّل صورًا من الويب بصيغة WebP وتحتاجها بصيغة أوسع قبولًا للطباعة أو المشاركة. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :----- | :--------- | +| WebP | `.webp` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات WebP وأفلتها. +2. راجع قائمة الملفات وأزل ما لا تحتاج إليه. +3. اختر مستوى **جودة PDF**. +4. انقر على **تحويل إلى PDF**. يُنزَّل الناتج باسم `from_webps.pdf`. + +داخليًا، تُفك ترميز كل صورة WebP عبر واجهة canvas في المتصفح، ثم تُضمَّن في PDF باستخدام pdf-lib. وهذا يعني أن التحويل يعمل في أي متصفح يدعم فك ترميز WebP (وكل المتصفحات الحديثة تدعمه). + +## الخيارات + +تتحكم **جودة PDF** في الضغط عند تضمين الصور: + +- **جودة عالية**: تحافظ على أكبر قدر من التفاصيل. +- **جودة متوسطة** (الافتراضية): ناتج متوازن. +- **جودة منخفضة**: أصغر حجم للملف. + +## حالات الاستخدام + +- تحويل الصور المنزّلة من الويب والمحفوظة بصيغة WebP إلى PDF قابل للطباعة +- تجميع لقطات شاشة WebP من Chrome أو Edge في وثائق +- إنشاء ملف أعمال PDF من صور صدّرتها أدوات تصميم تعتمد WebP افتراضيًا +- أرشفة صور WebP بصيغة أوسع قابلية للقراءة + +## نصائح + +- تُحوَّل WebP إلى PNG داخليًا قبل التضمين في PDF، لذا تحافظ صور WebP غير الفاقدة على جودتها عند الإعداد العالي. +- إذا كان لديك خليط من WebP وصيغ صور أخرى، فاستخدم أداة [الصور إلى PDF](./image-to-pdf) بدلًا من ذلك، فهي تقبل كل شيء دفعة واحدة. + +## أدوات ذات صلة + +- [الصور إلى PDF](./image-to-pdf) +- [PNG إلى PDF](./png-to-pdf) +- [JPG إلى PDF](./jpg-to-pdf) diff --git a/docs/ar/tools/word-to-pdf.md b/docs/ar/tools/word-to-pdf.md new file mode 100644 index 00000000..e66979ac --- /dev/null +++ b/docs/ar/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word إلى PDF +description: حوّل مستندات Word (DOC وDOCX) وملفات ODT وRTF إلى PDF في متصفحك مع الحفاظ الكامل على التنسيق. +--- + +# Word إلى PDF + +حوّل مستندات Microsoft Word والصيغ المتوافقة معها إلى PDF. تستخدم الأداة محرك LibreOffice يعمل في المتصفح ويتعامل مع ملفات DOC وDOCX وODT وRTF، مع الحفاظ على التنسيق والجداول والصور والرؤوس والتذييلات والأنماط في الناتج. + +## الصيغ المدعومة + +| الصيغة | الامتدادات | +| :---------------- | :--------- | +| Word (حديثة) | `.docx` | +| Word (قديمة) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب مستندات Word وأفلتها. يمكن تحديد عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات وأدرها. +3. انقر على **تحويل إلى PDF**. يُحمَّل محرك LibreOffice عند أول استخدام (يعرض مؤشر التقدم حالة التهيئة)، ثم يُحوَّل كل ملف. +4. يُنزَّل الملف الواحد مباشرة كملف PDF. أما الملفات المتعددة فتُجمَّع في `word-converted.zip`. + +## الخيارات + +لا تحتوي هذه الأداة على إعدادات إضافية. ينتج محرك LibreOffice الناتج باستخدام ملف تصدير PDF الافتراضي. + +## الناتج + +| عدد المدخلات | الناتج | +| :------------ | :---------------------------------------------------------- | +| ملف واحد | تنزيل ملف PDF واحد (اسم الملف الأصلي بالامتداد `.pdf`) | +| ملفان أو أكثر | أرشيف ZIP (`word-converted.zip`) يضم ملف PDF واحدًا لكل ملف | + +## حالات الاستخدام + +- تحويل سيرة ذاتية أو خطاب تقديم من DOCX إلى PDF قبل إرسال طلب وظيفة +- تحويل مجموعة من العقود أو العروض دفعة واحدة إلى PDF لتسليمها لعميل +- تحويل ملفات `.doc` القديمة إلى ملفات PDF حديثة للأرشفة طويلة الأمد +- تحويل المستندات التعاونية من Google Docs (المصدّرة بصيغة DOCX) إلى PDF +- إنتاج ملفات PDF جاهزة للطباعة من قوالب Word المستخدمة في توليد المستندات آليًا + +## نصائح + +- يُنزَّل محرك LibreOffice مرة واحدة في كل جلسة ويُخزَّن مؤقتًا. توقع بضع ثوانٍ من التحميل عند أول تحويل، وتكون التحويلات اللاحقة أسرع بكثير. +- قد لا تُحوَّل التنسيقات المعقدة (الماكرو وعناصر ActiveX وSmartArt المتقدمة) بشكل مثالي. أما عناصر المستند القياسية (النصوص والجداول والصور والرؤوس والحواشي السفلية) فتُحوَّل بموثوقية. +- بما أن هذه الأداة تقبل ODT وRTF أيضًا، يمكنك استخدامها كمحوّل شامل لجميع صيغ معالجة النصوص. + +## أدوات ذات صلة + +- [ODT إلى PDF](./odt-to-pdf) +- [RTF إلى PDF](./rtf-to-pdf) +- [Excel إلى PDF](./excel-to-pdf) +- [PowerPoint إلى PDF](./powerpoint-to-pdf) diff --git a/docs/ar/tools/wpd-to-pdf.md b/docs/ar/tools/wpd-to-pdf.md new file mode 100644 index 00000000..db4c271a --- /dev/null +++ b/docs/ar/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD إلى PDF +description: حوّل مستندات WordPerfect (WPD) إلى PDF في متصفحك باستخدام LibreOffice. مجاني وخاص. +--- + +# WPD إلى PDF + +حوّل مستندات Corel WordPerfect إلى ملفات PDF. كانت WPD ذات يوم صيغة معالجة النصوص المهيمنة في المكاتب القانونية والجهات الحكومية. وإذا كانت لديك ملفات WordPerfect قديمة ترفض البرامج الحديثة فتحها، تعيدها هذه الأداة إلى الحياة كملفات PDF قياسية. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :---------- | :------- | :-------------------------------- | +| WordPerfect | `.wpd` | جميع إصدارات WordPerfect الرئيسية | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات WPD وأفلتها. يمكن تحديد عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات. أزل الملفات غير المرغوبة بأيقونة سلة المهملات، أو استخدم **إضافة المزيد من الملفات** لإضافة مستندات أخرى. +3. انقر على **تحويل إلى PDF**. تحمّل الأداة محرك تحويل معتمدًا على LibreOffice في متصفحك، يحلل صيغة WPD وينتج PDF. +4. يُنزَّل الملف الواحد مباشرة كملف PDF. أما التحويلات الدفعية فتنتج أرشيف ZIP باسم `wpd-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى أي إعداد. يتعامل محرك LibreOffice مع تنسيق WPD والخطوط والتخطيط تلقائيًا. + +## حالات الاستخدام + +- فتح مستندات قانونية عمرها عقود كُتبت بـ WordPerfect +- تحويل الملفات الحكومية المؤرشفة من WPD إلى صيغة حديثة +- ترحيل مكتبة مستندات WordPerfect قديمة إلى PDF للتخزين طويل الأمد +- مشاركة ملفات WPD مع مستلمين لا يملكون Corel WordPerfect + +## نصائح + +- يُحمَّل محرك LibreOffice عند أول استخدام، وهذا يستغرق لحظة. تكون التحويلات اللاحقة في الجلسة نفسها أسرع. +- لا تُحفظ ماكروهات WPD المعقدة ورموز الكشف (reveal codes)، لكن التخطيط المرئي والمحتوى النصي والتنسيق الأساسي تنتقل إلى PDF. + +## أدوات ذات صلة + +- [WPS إلى PDF](./wps-to-pdf) +- [ODG إلى PDF](./odg-to-pdf) diff --git a/docs/ar/tools/wps-to-pdf.md b/docs/ar/tools/wps-to-pdf.md new file mode 100644 index 00000000..4bea9572 --- /dev/null +++ b/docs/ar/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS إلى PDF +description: حوّل مستندات Microsoft Works (WPS) إلى PDF في متصفحك. مجاني وبلا تسجيل وخاص تمامًا. +--- + +# WPS إلى PDF + +حوّل ملفات معالج النصوص في Microsoft Works إلى PDF. كان Microsoft Works يأتي مع الحواسيب الشخصية الاستهلاكية في أواخر التسعينيات وخلال العقد الأول من الألفية، وما زالت ملفات WPS كثيرة موجودة على الأقراص الصلبة القديمة وأرشيفات البريد. تفتحها هذه الأداة في المتصفح وتنتج ملفات PDF نظيفة. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :-------------- | :------- | :------------------------------------ | +| Microsoft Works | `.wps` | ملفات معالج النصوص من Microsoft Works | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات WPS وأفلتها. تُقبل عدة ملفات. +2. راجع قائمة الملفات. استخدم أيقونة سلة المهملات لإزالة ملفات فردية، أو انقر على **إضافة المزيد من الملفات** لتوسيع الدفعة. +3. انقر على **تحويل إلى PDF**. يُحمَّل محرك معتمد على LibreOffice في المتصفح ويحوّل كل مستند WPS إلى PDF. +4. يُنزَّل ملف واحد مباشرة كملف PDF. أما الملفات المتعددة فتُجمَّع في أرشيف ZIP باسم `wps-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى إعدادات إضافية. يتعامل المحوّل مع النص والتنسيق الأساسي والصور المضمّنة من ملف WPS. + +## حالات الاستخدام + +- استرداد مستندات المدرسة أو العمل القديمة المحفوظة بصيغة Microsoft Works +- فتح مرفقات البريد بصيغة WPS عندما لا يكون Microsoft Works مثبتًا لديك +- تحويل أرشيف من ملفات WPS للانتقال إلى نظام مستندات حديث +- طباعة مستندات قديمة لا تستطيع معالجات النصوص الحالية فتحها + +## نصائح + +- لا تخلط بين ملفات Microsoft Works بامتداد `.wps` وملفات WPS Office. هذه الأداة مخصصة لصيغة Microsoft Works الأقدم. +- يستغرق محرك LibreOffice لحظة للتحميل عند أول استخدام. وبعد تحميله، تعمل التحويلات الإضافية في الجلسة نفسها بسرعة أكبر. + +## أدوات ذات صلة + +- [WPD إلى PDF](./wpd-to-pdf) +- [PUB إلى PDF](./pub-to-pdf) diff --git a/docs/ar/tools/xml-to-pdf.md b/docs/ar/tools/xml-to-pdf.md new file mode 100644 index 00000000..8433f381 --- /dev/null +++ b/docs/ar/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML إلى PDF +description: حوّل ملفات XML إلى مستندات PDF منظمة في متصفحك. مجاني وخاص وبلا معالجة على الخادم. +--- + +# XML إلى PDF + +حوّل ملفات بيانات XML إلى مستندات PDF منظمة ومقروءة. XML قوي لكنه صعب القراءة على البشر. تحلل هذه الأداة شجرة XML وتتعرف على هياكل البيانات المتكررة وتعرضها كجداول وأقسام منسقة في ملف PDF بحجم A4 أفقي. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----- | :------- | :----------------------- | +| XML | `.xml` | أي مستند XML سليم البنية | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات XML وأفلتها. يمكن معالجة عدة ملفات في دفعة واحدة. +2. راجع قائمة الملفات. أزل الملفات غير المرغوبة بأيقونة سلة المهملات، أو انقر على **إضافة المزيد من الملفات** لإضافة المزيد. +3. انقر على **تحويل إلى PDF**. تحلل الأداة بنية XML باستخدام DOMParser المدمج في المتصفح، وتحلل التسلسل الهرمي للبيانات، وتعرضه في PDF باستخدام jsPDF مع تنسيق الجداول التلقائي. +4. يُنزَّل الملف الواحد كملف PDF. أما التحويلات المتعددة فتُجمَّع في `xml-to-pdf.zip`. + +## الخيارات + +لا حاجة إلى إعداد يدوي. يكتشف المحوّل بنية XML تلقائيًا ويختار تخطيطات الجداول المناسبة. يستخدم الناتج اتجاه A4 الأفقي لاستيعاب مجموعات البيانات العريضة. + +## حالات الاستخدام + +- تحويل بيانات XML المصدّرة من قواعد البيانات أو واجهات API إلى تقارير قابلة للطباعة +- إنشاء ملخصات مقروءة من ملفات إعداد XML +- تحويل الفواتير أو سجلات المعاملات المعتمدة على XML إلى PDF لحفظ السجلات +- جعل خرائط مواقع XML أو خلاصات RSS مقروءة بصيغة مستند + +## نصائح + +- يجب أن يكون XML سليم البنية. إذا واجه المحلل أخطاء في الصياغة، يفشل التحويل مع رسالة خطأ وصفية تشير إلى المشكلة. +- تُسطَّح بنى XML العميقة التداخل إلى جداول. وللحصول على أفضل النتائج، ينبغي أن تحتوي البيانات على عناصر شقيقة متكررة ذات عناصر فرعية متسقة. +- تظهر تحديثات التقدم أثناء التحويل وتعرض كل مرحلة: القراءة والتحليل والفحص والعرض. + +## أدوات ذات صلة + +- [FB2 إلى PDF](./fb2-to-pdf) +- [XPS إلى PDF](./xps-to-pdf) +- [البريد الإلكتروني إلى PDF](./email-to-pdf) diff --git a/docs/ar/tools/xps-to-pdf.md b/docs/ar/tools/xps-to-pdf.md new file mode 100644 index 00000000..7d25085b --- /dev/null +++ b/docs/ar/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS إلى PDF +description: حوّل مستندات XPS وOXPS إلى صيغة PDF في متصفحك. بلا رفع وبلا تسجيل وخاص تمامًا. +--- + +# XPS إلى PDF + +حوّل مستندات Microsoft XPS وOXPS إلى ملفات PDF قياسية. كانت XPS (XML Paper Specification) رد Microsoft على PDF، لكن دعمها تراجع عبر المنصات. تجعل هذه الأداة تلك المستندات مقروءة للجميع من جديد. + +## الصيغ المدعومة + +| الصيغة | الامتداد | ملاحظات | +| :----- | :------- | :------------------------------------------- | +| XPS | `.xps` | صيغة Microsoft XPS الأصلية | +| OXPS | `.oxps` | Open XPS، النسخة المتوافقة مع معيار ECMA-388 | + +## طريقة العمل + +1. انقر على منطقة الرفع أو اسحب ملفات XPS/OXPS وأفلتها. يمكنك تحديد عدة ملفات دفعة واحدة. +2. راجع قائمة الملفات. أزل الملفات الفردية بأيقونة سلة المهملات، أو انقر على **إضافة المزيد من الملفات** لإلحاق مستندات إضافية. +3. انقر على **تحويل إلى PDF**. يعالج محرك PyMuPDF كل مستند محليًا في متصفحك. +4. يُنزَّل الملف الواحد مباشرة كملف PDF. أما الملفات المتعددة فتُجمَّع في أرشيف ZIP باسم `xps-converted.zip`. + +## الخيارات + +تجري هذه الأداة تحويلًا مباشرًا للصيغة دون أي إعداد إضافي. يحافظ الناتج على أبعاد الصفحات الأصلية والرسومات المتجهية والخطوط والصور من مصدر XPS. + +## حالات الاستخدام + +- فتح ملفات XPS المستلمة من أنظمة Windows الأقدم التي كانت تعتمد برنامج طباعة XPS افتراضيًا +- تحويل مستندات OXPS من Windows 10/11 لمشاركتها مع مستخدمي macOS أو Linux +- أرشفة ملفات XPS القديمة في صيغة أوسع دعمًا +- إتاحة المستندات الحكومية أو المؤسسية المعتمدة على XPS للمستلمين الخارجيين + +## نصائح + +- يُتعامل مع الامتدادين `.xps` و`.oxps` تلقائيًا، ويمكنك خلطهما في الدفعة نفسها. +- إذا أُنشئ ملف XPS الأصلي من برنامج طباعة عالي الدقة، يحتفظ ملف PDF الناتج بتلك الجودة. لا تجري أي إعادة أخذ عينات. + +## أدوات ذات صلة + +- [Word إلى PDF](./word-to-pdf) +- [XML إلى PDF](./xml-to-pdf) diff --git a/docs/be/contributing.md b/docs/be/contributing.md new file mode 100644 index 00000000..f45303b3 --- /dev/null +++ b/docs/be/contributing.md @@ -0,0 +1,136 @@ +# Удзел у распрацоўцы + +Дзякуй за цікавасць да ўдзелу ў распрацоўцы BentoPDF! Гэта кіраўніцтва дапаможа вам пачаць. + +## Пачатак працы + +### Патрабаванні + +- Node.js 18+ +- npm 9+ +- Git + +### Наладка + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Структура праекта + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Даданне новага інструмента + +### Крок 1: Стварыце файл логікі + +Стварыце `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Крок 2: Стварыце HTML-старонку + +Стварыце `src/pages/your-tool.html`, абапіраючыся на існуючыя шаблоны інструментаў. + +### Крок 3: Зарэгіструйце інструмент + +Дадайце ў `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Крок 4: Дадайце ў канфігурацыю зборкі + +Дадайце старонку ў `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Крок 5: Дадайце пераклады + +Дадайце запісы ва ўсе файлы лакалізацыі ў `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Стыль кода + +- Выкарыстоўвайце TypeScript для ўсяго новага кода +- Прытрымлівайцеся існуючых шаблонаў для аднастайнасці +- Запускайце `npm run format` перад камітам +- Без каментарыяў у прадакшн-кодзе (каментарыі выдаляюцца падчас зборкі) + +## Працэс Pull Request + +1. Стварыце галіну для функцыі: `git checkout -b feature/your-feature` +2. Унясіце змены +3. Старанна пратэстуйце: `npm run build` +4. Адпраўце PR з зразумелым апісаннем + +## Пераклад + +Глядзіце [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md), каб даведацца, як дадаць новыя мовы. + +## Ліцэнзійнае пагадненне ўдзельніка + +Перш чым ваш PR можна будзе аб'яднаць, вам трэба падпісаць наша CLA: + +- [Індывідуальнае CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Карпаратыўнае CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Атрыманне дапамогі + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Супольнасць у Discord](https://discord.gg/Bgq3Ay3f2w) + +## Ліцэнзія + +BentoPDF мае падвойную ліцэнзію: + +- **AGPL-3.0** для праектаў з адкрытым зыходным кодам, якія публічна дзеляцца ўсім сваім зыходным кодам +- **Камерцыйная ліцэнзія** для прапрыетарных праграм і праграм з закрытым кодам: [Атрымаць пажыццёвую ліцэнзію за $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Робячы ўнёсак, вы згаджаецеся, што ваш унёсак будзе ліцэнзаваны на гэтых умовах. diff --git a/docs/be/getting-started.md b/docs/be/getting-started.md new file mode 100644 index 00000000..b89284c9 --- /dev/null +++ b/docs/be/getting-started.md @@ -0,0 +1,80 @@ +# Пачатак працы + +Вітаем у BentoPDF! Гэта кіраўніцтва дапаможа вам хутка пачаць працу. + +## Што такое BentoPDF? + +BentoPDF гэта бясплатны набор інструментаў PDF з адкрытым зыходным кодам, арыентаваны на прыватнасць, які працуе **цалкам у вашым браўзеры**. Вашы файлы ніколі не пакідаюць вашу прыладу: уся апрацоўка адбываецца лакальна з дапамогай тэхналогіі WebAssembly (WASM). + +## Хуткі старт + +### Варыянт 1: Выкарыстоўвайце размешчаную версію + +Наведайце [bentopdf.com](https://www.bentopdf.com), каб адразу карыстацца BentoPDF, без усталявання. + +### Варыянт 2: Уласнае размяшчэнне з Docker + +> [!IMPORTANT] +> Канвертацыя офісных файлаў патрабуе `SharedArrayBuffer`, для якога патрэбныя: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - бяспечны кантэкст +> +> `http://localhost` падыходзіць для лакальнага тэсціравання, бо браўзеры лічаць loopback давераным. `http://192.168.x.x` і іншыя IP-адрасы лакальнай сеткі звычайна не, таму канвертацыя Word/Excel/PowerPoint патрабуе HTTPS пры доступе з іншых прылад у вашай сетцы. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF пастаўляецца ў дзвюх зборках: **Self-Hosted build** (`bentopdf-simple`, выкарыстоўваецца вышэй) для ўнутраных, камандных і арганізацыйных разгортванняў, і **Commercial build** (`bentopdf:latest`), якую выкарыстоўвае сам bentopdf.com і ўладальнікі камерцыйнай ліцэнзіі для публічных разгортванняў. Абедзве маюць аднолькавыя інструменты PDF; Commercial build дадае галоўны блок, FAQ, водгукі і футэр bentopdf.com. Калі сумняваецеся, выкарыстоўвайце Self-Hosted build. + +Затым адкрыйце `http://localhost:3000` у браўзеры. + +> [!NOTE] +> Калі вы рыхтуеце ізаляванае (air-gapped) разгортванне OCR, вам трэба размясціць шрыфты тэкставага слоя OCR унутры сеткі ў дадатак да воркера Tesseract, асноўнага асяроддзя выканання і файлаў traineddata. Поўная наладка апісана ў раздзеле [Уласнае размяшчэнне](/be/self-hosting/), уключаючы `VITE_OCR_FONT_BASE_URL` і ўбудаваны каталог `ocr-fonts/`. + +### Варыянт 3: Зборка з зыходнага кода + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Магчымасці коратка + +| Катэгорыя | Інструменты | +| -------------------------- | ---------------------------------------------------------------------------- | +| **Канвертаваць у PDF** | Word, Excel, PowerPoint, відарысы, Markdown, EPUB, MOBI і іншае | +| **Канвертаваць з PDF** | JPG, PNG, тэкст, Excel, SVG і іншае | +| **Рэдагаванне і анатацыі** | Подпіс, вылучэнне, рэдагаванне канфідэнцыйных даных, запаўненне форм, штампы | +| **Арганізацыя** | Аб'яднанне, падзел, паварот, выдаленне старонак, змена парадку | +| **Аптымізацыя** | Сцісканне, аднаўленне, зглажванне, OCR | +| **Бяспека** | Шыфраванне, расшыфроўка, зняцце абмежаванняў | + +## Падтрымка браўзераў + +BentoPDF лепш за ўсё працуе ў сучасных браўзерах: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Наступныя крокі + +- [Агляд усіх інструментаў](/be/tools/) +- [Размясціць BentoPDF у сябе](/be/self-hosting/) +- [Зрабіць унёсак у праект](/be/contributing) diff --git a/docs/be/index.md b/docs/be/index.md new file mode 100644 index 00000000..d3ac50dd --- /dev/null +++ b/docs/be/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Бясплатныя інструменты PDF з адкрытым кодам' + tagline: Апрацоўвайце PDF цалкам у браўзеры. Без загрузак. Без сервераў. Поўная прыватнасць. + actions: + - theme: brand + text: Пачаць + link: /be/getting-started + - theme: alt + text: Інструменты + link: /be/tools/ + - theme: alt + text: Уласнае размяшчэнне + link: /be/self-hosting/ + - theme: alt + text: Камерцыйная ліцэнзія + link: /be/licensing + +features: + - icon: 🔒 + title: 100% прыватна + details: Вашы файлы ніколі не пакідаюць вашу прыладу. Уся апрацоўка адбываецца лакальна ў браўзеры з дапамогай WebAssembly. + - icon: ⚡ + title: Хутка і бясплатна + details: Без рэгістрацыі, без абмежаванняў, без вадзяных знакаў. Апрацоўвайце колькі заўгодна PDF бясплатна, назаўсёды. + - icon: 🛠️ + title: 50+ інструментаў + details: Канвертацыя, рэдагаванне, аб'яднанне, падзел, сцісканне, подпіс, OCR і іншае. Усё неабходнае ў адным месцы. + + - icon: 🌐 + title: Уласнае размяшчэнне + details: Разгортвайце на ўласнай інфраструктуры. Docker, Vercel, Netlify, AWS або цалкам ізаляваныя асяроддзі з уласнымі воркерамі OCR, моўнымі данымі і шрыфтамі тэкставага слоя. +--- + +## OCR па-за сеткай + +Калі вы размяшчаеце BentoPDF у ізаляваным або аўтаномным асяроддзі, для OCR патрэбны не толькі воркер Tesseract і файлы traineddata. Для PDF з магчымасцю пошуку таксама трэба раздаваць шрыфты тэкставага слоя OCR унутры сеткі. +Глядзіце [Уласнае размяшчэнне](/be/self-hosting/), каб даведацца пра поўную наладку, уключаючы `VITE_OCR_FONT_BASE_URL`, убудаваны каталог `ocr-fonts/` і абноўлены працэс для ізаляваных сетак. diff --git a/docs/be/licensing.md b/docs/be/licensing.md new file mode 100644 index 00000000..4b7c4bbe --- /dev/null +++ b/docs/be/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/be/self-hosting/#канфігурацыя-wasm-кампаненты-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/be/self-hosting/apache.md b/docs/be/self-hosting/apache.md new file mode 100644 index 00000000..2b1fff65 --- /dev/null +++ b/docs/be/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Разгортванне з Apache + +Размясціце BentoPDF з дапамогай Apache HTTP Server. + +## Патрабаванні + +- Apache 2.4+ +- уключаны mod_rewrite +- SSL-сертыфікат (рэкамендуецца) + +## Крок 1: Збярыце праект + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Каб змяніць брэндынг, задайце зменныя асяроддзя перад зборкай: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Крок 2: Скапіруйце файлы + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Крок 3: Канфігурацыя Apache + +Стварыце `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Крок 4: .htaccess для маршрутызацыі + +Стварыце `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Крок 5: Уключыце неабходныя модулі + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Крок 6: Уключыце сайт + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Разгортванне ў падкаталогу + +Каб размясціць па адрасе `/pdf/`: + +1. Збярыце з базавым URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Абнавіце `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Вырашэнне праблем + +### Памылкі 404 для WASM + +Пераканайцеся, што MIME-тып настроены: + +```apache +AddType application/wasm .wasm +``` + +### Падпісаць PDF або Запоўніць форму PDF паказвае пусты прагляднік (памылка MIME `.mjs`) + +Калі ў кансолі браўзера з'яўляецца: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…і запыт з памылкай заканчваецца на `.mjs`, у вашай канфігурацыі Apache адсутнічае адпаведнасць `.mjs → application/javascript`. Убудаваны прагляднік PDF пастаўляецца з файламі ES-модуляў з пашырэннем `.mjs`, а стандартны `mime.types` Apache па змаўчанні іх не ўключае. + +Дадайце ў VirtualHost або `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Затым перазагрузіце Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Каб праверыць: у DevTools браўзера → укладка Network знайдзіце запыт `.mjs` з памылкай і праверце загаловак адказу `Content-Type`. Цяпер ён павінен быць `application/javascript`, а не `application/octet-stream`. + +### Rewrite не працуе + +Праверце, што mod_rewrite уключаны: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel у PDF не працуе + +LibreOffice WASM патрабуе `SharedArrayBuffer`, для якога патрэбныя гэтыя загалоўкі: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Таксама патрэбны бяспечны кантэкст. `http://localhost` падыходзіць для лакальнага тэсціравання, але `http://192.168.x.x` і іншыя IP-адрасы лакальнай сеткі звычайна патрабуюць HTTPS. Калі загалоўкі ёсць, але `window.crossOriginIsolated` усё яшчэ `false`, праверце, ці не адкрываецца старонка праз звычайны HTTP з адраса, які не з'яўляецца loopback. + +Папярэдне сціснутым файлам `.wasm.gz` і `.data.gz` таксама патрэбны правільны `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Пераканайцеся, што `mod_headers` уключаны: `sudo a2enmod headers` + +### Адмоўлена ў доступе + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/be/self-hosting/aws.md b/docs/be/self-hosting/aws.md new file mode 100644 index 00000000..ddf8621d --- /dev/null +++ b/docs/be/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Разгортванне на AWS S3 + CloudFront + +Размясціце BentoPDF на AWS для максімальнага кантролю і маштабаванасці. + +## Архітэктура + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Крок 1: Стварыце бакет S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Крок 2: Зборка і загрузка + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Крок 3: Стварыце дыстрыбуцыю CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Або выкарыстайце AWS Console: + +1. Перайдзіце ў CloudFront → Create distribution +2. Origin domain: выберыце ваш бакет S3 +3. Уключыце "Origin Access Control" +4. Default root object: `index.html` +5. Стварыце дыстрыбуцыю + +## Крок 3b: Палітыка загалоўкаў адказу (абавязкова для LibreOffice WASM) + +Канвертацыі на аснове LibreOffice (Word, Excel, PowerPoint у PDF) патрабуюць `SharedArrayBuffer`, для якога патрэбныя пэўныя загалоўкі адказу. Стварыце CloudFront Response Headers Policy: + +1. Перайдзіце ў CloudFront → Policies → Response headers +2. Стварыце ўласную палітыку з гэтымі загалоўкамі: + +| Загаловак | Значэнне | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Прымацуйце палітыку да default cache behavior вашай дыстрыбуцыі + +Або праз CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Крок 3c: Метаданыя S3 для папярэдне сціснутых файлаў WASM + +Файлы LibreOffice WASM папярэдне сціснутыя (`.wasm.gz`, `.data.gz`). Задайце правільныя Content-Type і Content-Encoding, каб браўзеры іх распакоўвалі: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Важна +Без палітыкі загалоўкаў адказу `SharedArrayBuffer` недаступны, і канвертацыі LibreOffice WASM завісаюць на ~55%. Без правільнага Content-Encoding для файлаў `.gz` браўзер атрымлівае сырыя байты gzip, і кампіляцыя WASM не ўдаецца. +::: + +## Крок 4: Палітыка бакета S3 + +Дазвольце CloudFront доступ да бакета: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Крок 5: Уласныя старонкі памылак + +Наладзьце 404 так, каб вяртаўся `index.html` для SPA-маршрутызацыі: + +1. CloudFront → Error pages +2. Стварыце custom error response: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Ацэнка кошту + +| Рэсурс | Прыблізны кошт | +| ------------------------- | -------------- | +| Сховішча S3 (~500MB) | ~$0.01/месяц | +| CloudFront (1TB трафіку) | ~$85/месяц | +| CloudFront (10GB трафіку) | ~$0.85/месяц | + +::: tip +Выкарыстоўвайце S3 Intelligent Tiering, каб зэканоміць на файлах, да якіх рэдка звяртаюцца. +::: + +## Аўтаматызацыя з Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/be/self-hosting/cloudflare.md b/docs/be/self-hosting/cloudflare.md new file mode 100644 index 00000000..d75264c0 --- /dev/null +++ b/docs/be/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Разгортванне на Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) прапануе хуткі глабальны хостынг статычных сайтаў з неабмежаванай прапускной здольнасцю. + +## Хуткае разгортванне + +1. Перайдзіце ў [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Націсніце "Create a project" +3. Падключыце ваш рэпазіторый GitHub + +## Канфігурацыя зборкі + +| Параметр | Значэнне | +| --------------------- | --------------- | +| Framework preset | None | +| Каманда зборкі | `npm run build` | +| Каталог вываду зборкі | `dist` | +| Каранёвы каталог | `/` | + +## Зменныя асяроддзя + +Дадайце іх у Settings → Environment variables: + +| Зменная | Значэнне | +| ----------------------- | ----------------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (неабавязкова) | +| `VITE_BRAND_NAME` | Уласная назва брэнда (неабавязкова) | +| `VITE_BRAND_LOGO` | Шлях да лагатыпа адносна `public/` (неабавязкова) | +| `VITE_FOOTER_TEXT` | Уласны тэкст футэра/аўтарскіх правоў (неабавязкова) | +| `VITE_DEFAULT_LANGUAGE` | Мова інтэрфейсу па змаўчанні, напрыклад `fr` (неабавязкова) | + +## Файл канфігурацыі + +Стварыце `_headers` у тэчцы `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Важна +Загалоўкі `Cross-Origin-Embedder-Policy` і `Cross-Origin-Opener-Policy` абавязковыя для канвертацыі Word/ODT/Excel/PowerPoint у PDF. Без іх `SharedArrayBuffer` недаступны, і рухавік LibreOffice WASM не здолее ініцыялізавацца. +::: + +Стварыце `_redirects` для SPA-маршрутызацыі: + +``` +/* /index.html 200 +``` + +## Уласны дамен + +1. Перайдзіце ў ваш праект Pages +2. Націсніце "Custom domains" +3. Дадайце ваш дамен +4. Cloudflare аўтаматычна наладзіць DNS, калі дамен знаходзіцца ў Cloudflare + +## Перавагі + +- **Бясплатная неабмежаваная прапускная здольнасць** +- **Глабальны CDN** з 300+ пагранічнымі вузламі +- **Аўтаматычны HTTPS** +- **Папярэднія разгортванні** для pull request +- **Хуткія зборкі** + +## Вырашэнне праблем + +### Загрузка вялікіх файлаў + +Cloudflare Pages падтрымлівае файлы да 25 MB. З модулямі WASM праблем быць не павінна, але калі вы ўпраецеся ў ліміты, паспрабуйце: + +```bash +# Split large files during build +npm run build +``` + +### Ліміты памеру Worker + +Калі вы выкарыстоўваеце Cloudflare Workers для пашыранай маршрутызацыі, улічвайце ліміт 1 MB на бясплатных планах. + +## CORS-проксі Worker (для лічбавых подпісаў) + +Інструменту лічбавага подпісу патрэбны CORS-проксі, каб атрымліваць ланцужкі сертыфікатаў. Разгарніце ўключаны worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Функцыі бяспекі + +| Функцыя | Апісанне | +| --------------------------- | --------------------------------- | +| **Абмежаванні URL** | Дазволены толькі URL сертыфікатаў | +| **Ліміт памеру файла** | Максімум 10MB на запыт | +| **Абмежаванне частаты** | 60 запытаў/IP/хв (патрабуе KV) | +| **Блакіроўка прыватных IP** | Блакіруе localhost і ўнутраныя IP | + +### Уключэнне абмежавання частаты + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Зборка з URL проксі + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Або з Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Заўвага:** наладка подпісу HMAC апісана ў [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required). diff --git a/docs/be/self-hosting/cors-proxy.md b/docs/be/self-hosting/cors-proxy.md new file mode 100644 index 00000000..ce9d2c39 --- /dev/null +++ b/docs/be/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-проксі для атрымання сертыфікатаў + +Інструмент лічбавага подпісу выкарыстоўвае CORS-проксі, каб атрымліваць сертыфікаты выдаўцоў ад знешніх цэнтраў сертыфікацыі (CA). Гэта неабходна, бо многія серверы CA не ўключаюць загалоўкі CORS у свае адказы, што не дазваляе атрымліваць іх непасрэдна з браўзера. + +Акрамя таго, многія серверы CA аддаюць сертыфікаты праз звычайны HTTP. Калі ваш экзэмпляр BentoPDF працуе праз HTTPS, браўзеры блакіруюць такія HTTP-запыты (палітыка змешанага кантэнту). CORS-проксі вырашае абедзве праблемы, накіроўваючы запыты праз HTTPS-адрас з правільнымі загалоўкамі. + +## Як гэта працуе + +Пры подпісе PDF сертыфікатам: + +1. Бібліятэка `zgapdfsigner` спрабуе пабудаваць поўны ланцужок сертыфікатаў +2. Яна атрымлівае сертыфікаты выдаўцоў па URL, укладзеных у пашырэнне AIA (Authority Information Access) вашага сертыфіката +3. Гэтыя запыты праходзяць праз CORS-проксі, які дадае неабходныя загалоўкі `Access-Control-Allow-Origin` +4. Проксі вяртае даныя сертыфіката браўзеру + +## Уласнае размяшчэнне CORS-проксі + +Калі вы размяшчаеце BentoPDF у сябе, вам трэба разгарнуць уласны CORS-проксі, каб лічбавыя подпісы працавалі з сертыфікатамі, якія патрабуюць атрымання ланцужка. + +### Варыянт 1: Cloudflare Workers (рэкамендуецца) + +1. **Усталюйце Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Увайдзіце ў Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Скланіруйце BentoPDF і абнавіце дазволеныя крыніцы**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Адкрыйце `cors-proxy-worker.js` і змяніце масіў `ALLOWED_ORIGINS` на ваш дамен: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Важна + Без гэтай змены проксі будзе адхіляць усе запыты з вашага сайта з памылкай **403 Forbidden**. Па змаўчанні дазволены толькі запыты з `bentopdf.com`. + ::: + +4. **Разгарніце проксі**: + + ```bash + wrangler deploy + ``` + + Запішыце URL вашага worker (напрыклад, `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Перасабярыце BentoPDF з URL проксі**: + + Калі выкарыстоўваеце Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Калі збіраеце з зыходнага кода: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Варыянт 2: Уласны серверны проксі + +Вы таксама можаце стварыць уласны адрас проксі. Патрабаванні: + +1. Прымаць GET-запыты з параметрам `url` +2. Атрымліваць URL з вашага сервера (на баку сервера абмежаванняў CORS няма) +3. Вяртаць адказ з гэтымі загалоўкамі: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Прыклад рэалізацыі на Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Пытанні бяспекі + +Уключаны Cloudflare Worker мае некалькі мер бяспекі: + +| Функцыя | Апісанне | +| --------------------------- | ------------------------------------------------------------------------------------------------ | +| **Праверка крыніцы** | Дазваляе толькі запыты з даменаў, пералічаных у `ALLOWED_ORIGINS` | +| **Абмежаванні URL** | Дазваляе толькі URL сертыфікатаў (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Блакіроўка прыватных IP** | Блакіруе прыватныя дыяпазоны IPv4/IPv6, link-local, loopback, дзесятковыя IP і хмарныя метаданыя | +| **Бяспека Content-Type** | Вяртае толькі бяспечныя MIME-тыпы сертыфікатаў, блакіруе падмену content-type з крыніцы | +| **Ліміт памеру файла** | Перадае адказ патокам з лімітам 10MB, перарывае загрузку пры перавышэнні | +| **Абмежаванне частаты** | 60 запытаў у хвіліну на IP або IPv6 /64 (патрабуе KV, пры памылках KV прапускае запыты) | +| **Подпісы HMAC** | Неабавязковы подпіс на баку кліента (стрымлівае выпадковыя злоўжыванні) | + +### DNS rebinding (уласнае размяшчэнне па-за Cloudflare) + +Worker адхіляе любы URL, які разрознаецца ў прыватны або ўнутраны IP. Ён не можа выкарыстоўваць фіксаваны спіс дазволеных хостаў, бо URL ланцужкоў сертыфікатаў вядуць да таго CA, які выдаў сертыфікат (FNMT, карпаратыўныя CA і г.д.), таму адрасы загадзя невядомыя. Гэта пакідае невялікае акно для rebinding: той, хто кіруе DNS свайго дамена, можа аддаць публічны IP для праверкі бяспекі, а праз імгненне прыватны для сапраўднага запыту. + +На Cloudflare гэтым немагчыма скарыстацца: Workers не маюць доступу да прыватных IP і адраса метаданых `169.254.169.254`, таму rebind нікуды не вядзе. Проста не давайце worker шляху ўнутр: не падключайце Tunnel, Service або прывязку да прыватнай сеткі (яму патрэбен толькі `RATE_LIMIT_KV`). + +Калі вы запускаеце яго па-за Cloudflare (workerd, Node і падобнае) унутры VPC, асяроддзе выканання _можа_ дасягнуць унутраных IP. Пастаўце перад ім брандмаўэр выходнага трафіку і заблакіруйце прыватныя дыяпазоны: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` і іх аналагі IPv6. Па-за Cloudflare код праграмы не можа гэтага забяспечыць. + +## Адключэнне проксі + +Калі вы не хочаце выкарыстоўваць CORS-проксі, задайце зменнай асяроддзя пусты радок: + +``` +VITE_CORS_PROXY_URL= +``` + +**Заўвага**: без проксі подпіс сертыфікатамі, якія патрабуюць знешняга атрымання ланцужка (напрыклад, FNMT або некаторыя карпаратыўныя CA), завершыцца памылкай "Failed to fetch". + +## Вырашэнне праблем + +### "Signing error: TypeError: Failed to fetch" + +Звычайна гэта азначае адно з наступнага: + +1. **CORS-проксі не настроены**: задайце `VITE_CORS_PROXY_URL` і перасабярыце +2. **Змешаны кантэнт заблакіраваны**: ваш сайт працуе праз HTTPS, а URL выдаўца сертыфіката праз HTTP. CORS-проксі гэта вырашае. +3. **CORS-проксі адхіляе вашу крыніцу**: праверце, што ваш дамен ёсць у масіве `ALLOWED_ORIGINS` у `cors-proxy-worker.js` + +### "403 Forbidden" ад проксі + +Вашага дамена няма ў спісе `ALLOWED_ORIGINS`. Адрэдагуйце `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Затым разгарніце нанова: `npx wrangler deploy` + +### Праверка проксі + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Сертыфікаты, якія працуюць без проксі + +Некаторыя сертыфікаты ўключаюць поўны ланцужок у файл P12/PFX і не патрабуюць знешняга атрымання: + +- Самападпісаныя сертыфікаты +- Некаторыя камерцыйныя CA, якія дадаюць прамежкавыя сертыфікаты +- Сертыфікаты, у якія вы ўручную сабралі поўны ланцужок diff --git a/docs/be/self-hosting/docker.md b/docs/be/self-hosting/docker.md new file mode 100644 index 00000000..bc1c3f23 --- /dev/null +++ b/docs/be/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Разгортванне з Docker / Podman + +Самы просты спосаб размясціць BentoPDF у сябе ў працоўным асяроддзі. + +> [!IMPORTANT] +> **Неабходныя загалоўкі для канвертацыі офісных файлаў** +> +> Інструменты на аснове LibreOffice (канвертацыя Word, Excel, PowerPoint) патрабуюць гэтых HTTP-загалоўкаў для падтрымкі `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Старонка таксама павінна аддавацца ў бяспечным кантэксце. `http://localhost` падыходзіць для лакальнага тэсціравання, але `http://192.168.x.x` і іншыя IP-адрасы лакальнай сеткі звычайна не, таму канвертацыя офісных файлаў праз звычайны HTTP не спрацуе нават пры наяўнасці загалоўкаў. +> +> Афіцыйныя вобразы кантэйнераў уключаюць гэтыя загалоўкі. Калі вы выкарыстоўваеце зваротны проксі (Traefik, Caddy і г.д.), пераканайцеся, што гэтыя загалоўкі захоўваюцца або дадаюцца, і выкарыстоўвайце HTTPS для доступу не праз loopback. + +> [!TIP] +> **Карыстальнікам Podman:** усе каманды `docker` працуюць з Podman, калі замяніць `docker` на `podman`, а `docker-compose` на `podman-compose`. + +## Хуткі старт + +> [!TIP] +> BentoPDF пастаўляецца ў дзвюх зборках: +> +> - **Self-Hosted build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Усе інструменты PDF **без** маркетынгавага афармлення (без галоўнага блока, FAQ, водгукаў, футэра). Выкарыстоўвайце яе для ўнутраных, камандных і арганізацыйных разгортванняў. Гэта **не** скарочаная "lite" версія. +> - **Commercial build**: `ghcr.io/alam00000/bentopdf:latest`. Поўны маркетынгавы сайт, які выкарыстоўвае сам bentopdf.com і ўладальнікі камерцыйнай ліцэнзіі для публічных разгортванняў. +> +> Калі сумняваецеся, выкарыстоўвайце Self-Hosted build. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Стварыце `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Запусціце: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Зборка ўласнага вобраза + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Збярыце і запусціце: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Зменныя асяроддзя + +| Зменная | Апісанне | Па змаўчанні | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Зборка варыянта Self-Hosted (хавае маркетынгавае афармленне bentopdf.com: галоўны блок, FAQ, водгукі, футэр). Усе інструменты PDF застаюцца. | `false` | +| `BASE_URL` | Разгортванне ў падкаталог | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL модуля PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL модуля Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL модуля CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL скрыпта воркера OCR | _(пуста; CDN Tesseract.js па змаўчанні)_ | +| `VITE_TESSERACT_CORE_URL` | Каталог асноўнага асяроддзя выканання OCR | _(пуста; CDN Tesseract.js па змаўчанні)_ | +| `VITE_TESSERACT_LANG_URL` | Каталог traineddata OCR | _(пуста; CDN Tesseract.js па змаўчанні)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Мовы OCR праз коску, даступныя ў інтэрфейсе | _(пуста; поўны каталог)_ | +| `VITE_OCR_FONT_BASE_URL` | Каталог шрыфтоў тэкставага слоя OCR | _(пуста; аддаленыя URL шрыфтоў Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Мова інтэрфейсу па змаўчанні | `en` | +| `VITE_BRAND_NAME` | Уласная назва брэнда | `BentoPDF` | +| `VITE_BRAND_LOGO` | Шлях да лагатыпа адносна `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Уласны тэкст футэра/аўтарскіх правоў | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID інструментаў праз коску, якія трэба схаваць | _(пуста; усе інструменты ўключаны)_ | +| `DISABLE_GITHUB_STARS` | Не загружаць колькасць зорак GitHub пры загрузцы старонкі і прыбраць `api.github.com` з CSP. Зборкі Simple Mode заўсёды гэта прапускаюць. | `false` | +| `SITE_URL` | Публічны URL для спасылак canonical, hreflang і sitemap. Пакіньце значэнне па змаўчанні, калі не хочаце, каб пошукавыя сістэмы лічылі ваша разгортванне асобным сайтам. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | З уласным `SITE_URL` кожная старонка пазначаецца `noindex`, каб ваша копія не канкурыравала з bentopdf.com у выніках пошуку. Задайце `true`, каб дазволіць індэксацыю. | `false` | + +URL модуляў WASM загадзя настроены на CDN па змаўчанні: усе пашыраныя функцыі працуюць адразу. Перавызначце іх для ізаляваных або ўласных разгортванняў. + +### Пошукавыя сістэмы + +Па змаўчанні кожная старонка паказвае пошукавым сістэмам bentopdf.com як арыгінал, таму ваша разгортванне не з'яўляецца як дублікат. Для прыватнага або ўнутранага экзэмпляра нічога мяняць не трэба. + +- **Цалкам выключыць экзэмпляр з вынікаў пошуку:** запусціце кантэйнер з `-e ROBOTS_NOINDEX=true`. Патрэбны толькі перазапуск, без перазборкі. +- **Зрабіць экзэмпляр асобным сайтам у выніках пошуку:** збярыце з `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Без `ALLOW_INDEXING=true` уласны `SITE_URL` пазначае кожную старонку як `noindex`. + +### Content-Security-Policy + +Вобраз nginx пастаўляецца з актыўным загалоўкам `Content-Security-Policy`. Дырэктывы CSP `script-src`, `connect-src` і `font-src` **генеруюцца падчас зборкі** з URL-зменных `VITE_*` вышэй: усе хасты, перададзеныя праз `--build-arg`, аўтаматычна дадаюцца ў палітыку. + +У выніку: + +- Калі вы перавызначаеце `VITE_CORS_PROXY_URL` або `VITE_WASM_*_URL` падчас зборкі, CSP аўтаматычна дазваляе гэтыя крыніцы, дадатковая наладка не патрэбна. +- Для URL на `cdn.jsdelivr.net` `script-src` дазваляе толькі дакладную тэчку пакета з версіяй, напрыклад `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, а не ўвесь CDN. jsDelivr аддае любы публічны пакет npm або рэпазіторый GitHub, таму дазвол на ўвесь хост дазволіў бы любому з іх выконвацца ў вашым экзэмпляры. URL на іншых хастах дазваляюцца па крыніцы (origin). +- Калі вы наладжваеце ўласныя URL WASM _падчас выканання_ на старонцы пашыраных налад праграмы, гэтых крыніц **няма** ў CSP, і браўзер заблакіруе запыты да іх. Гэта датычыцца і іншай версіі таго ж пакета на `cdn.jsdelivr.net`, бо дазволена толькі версія, зададзеная падчас зборкі. Наладка падчас выканання прызначана для эксперыментаў; для пастаянных уласных URL задайце адпаведны build arg `VITE_*`. +- У ізаляваных разгортваннях, якія перавызначаюць усе тры значэнні `VITE_WASM_*_URL`, гэтыя тэчкі пакетаў `cdn.jsdelivr.net` таксама выдаляюцца з CSP (кожнае значэнне па змаўчанні замяняецца, а не дапаўняецца). Значэнні Tesseract OCR па змаўчанні на `cdn.jsdelivr.net` застаюцца ў палітыцы, пакуль вы не зададзіце і тры значэнні `VITE_TESSERACT_*`. Аналагічна, `VITE_CORS_PROXY_URL` замяняе публічнае значэнне па змаўчанні `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP уключае `'unsafe-eval'` у `script-src`, бо асяроддзе выканання LibreOffice WASM (выкарыстоўваецца інструментамі канвертацыі Word/Excel/PowerPoint) і бібліятэка відарысаў wasm-vips (выкарыстоўваецца PDF у TIFF) кампілююць унутраны код дыспетчарызацыі праз `new Function()`. Яго выдаленне зламае гэтыя інструменты. Калі вы збіраеце ў `SIMPLE_MODE` (без LibreOffice) і вам не патрэбны PDF у TIFF, можна ўручную адрэдагаваць згенераваны `security-headers.conf` і прыбраць `'unsafe-eval'` для больш строгай палітыкі. + +Для OCR пакіньце зменныя `VITE_TESSERACT_*` пустымі, каб выкарыстоўваць анлайн-рэсурсы па змаўчанні, або задайце ўсе тры разам для ўласнага/аўтаномнага OCR. Частковыя перавызначэнні OCR адхіляюцца, бо воркер, асноўнае асяроддзе выканання і каталог traineddata павінны адпавядаць адно аднаму. Для цалкам аўтаномнага PDF з магчымасцю пошуку таксама задайце `VITE_OCR_FONT_BASE_URL`, каб шрыфты тэкставага слоя OCR загружаліся з вашага ўнутранага сервера, а не з публічных URL шрыфтоў Noto. + +`VITE_DEFAULT_LANGUAGE` задае мову інтэрфейсу для новых наведвальнікаў. Падтрымліваемыя значэнні: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Карыстальнікі ўсё роўна могуць пераключаць мову, гэта змяняе толькі значэнне па змаўчанні. + +Прыклад: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Уласны брэндынг + +Замяніце лагатып, назву і тэкст футэра BentoPDF па змаўчанні на свае. Змясціце файл лагатыпа ў тэчку `public/` (або выкарыстайце існуючы відарыс), затым перадайце зменныя брэндынгу падчас зборкі: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Брэндынг працуе і ў поўным рэжыме, і ў Simple Mode, і можа спалучацца з усімі іншымі параметрамі зборкі. + +### Адключэнне асобных інструментаў + +Хавайце інструменты з інтэрфейсу дзеля адпаведнасці патрабаванням або бяспекі. Адключаныя інструменты выдаляюцца з галоўнай старонкі, вынікаў пошуку, спалучэнняў клавіш і канструктара працоўных працэсаў. Пры прамым пераходзе па URL паказваецца старонка "інструмент недаступны". + +ID інструмента гэта URL старонкі без `.html`. Напрыклад, калі інструмент знаходзіцца па адрасе `bentopdf.com/edit-pdf.html`, яго ID `edit-pdf`. + +#### Як знайсці ID інструментаў + +Самы просты спосаб: адкрыйце любы інструмент у BentoPDF і паглядзіце на URL. Апошняя частка шляху (без `.html`) і ёсць ID інструмента. + +
+Поўны спіс ID інструментаў + +**Рэдагаванне і анатацыі:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Канвертаваць у PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Канвертаваць з PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Арганізацыя і кіраванне:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Аптымізацыя і аднаўленне:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Бяспека:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Варыянт 1: Падчас зборкі (Docker build arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Спіс адключаных інструментаў убудоўваецца ў JavaScript-бандл. Для змены патрэбна перазборка. + +#### Варыянт 2: Падчас выканання (config.json) + +Падключыце файл `config.json` у каталог, які аддаецца серверам, перазборка не патрэбна: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Або з Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Абодва спосабы можна спалучаць: спісы аб'ядноўваюцца. Калі інструмент ёсць хоць у адным, ён адключаны. + +#### Адключэнне функцый рэдактара + +Вы таксама можаце адключыць асобныя функцыі ў Рэдактары PDF (напрыклад, рэдагаванне канфідэнцыйных даных, анатацыі, формы), не адключаючы ўвесь інструмент. Дадайце `editorDisabledCategories` у ваш `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Поўны спіс катэгорый рэдактара + +**Маштаб:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Анатацыі:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Фігуры:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Формы:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Рэдагаванне даных:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Дакумент:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Старонка:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Панэль:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Інструменты:** `tools`, `pan`, `pointer`, `capture` + +**Вылучэнне:** `selection`, `selection-copy` + +**Гісторыя:** `history`, `history-undo`, `history-redo` + +
+ +Катэгорыі іерархічныя: адключэнне бацькоўскай (напрыклад, `annotation`) адключае ўсе даччыныя. + +### Адключэнне лічыльніка зорак GitHub + +Панэль навігацыі паказвае актуальную колькасць зорак GitHub, якая загружаецца з `api.github.com` пры загрузцы старонкі. Гэта адзіны знешні запыт, не звязаны з функцыямі PDF. Адключыце яго падчас зборкі, каб выдаліць код запыту з бандла і прыбраць `api.github.com` з Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Зборкі Simple Mode (`bentopdf-simple`) заўсёды прапускаюць лічыльнік зорак; гэты сцяг патрэбны толькі для Commercial build або ўласных поўных зборак. + +### Уласныя URL WASM (ізаляваныя / уласныя разгортванні) + +> [!IMPORTANT] +> URL WASM убудоўваюцца ў JavaScript **падчас зборкі**. Файлы WASM спампоўвае **браўзер карыстальніка** падчас выканання, Docker не спампоўвае іх падчас зборкі. Для ізаляваных сетак вы павінны размясціць файлы WASM на ўнутраным серверы, даступным для браўзераў. + +**Поўны працэс для ізаляванай сеткі:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Для `--ocr-languages` выкарыстоўвайце коды, якія выводзіць `bash scripts/prepare-airgap.sh --list-ocr-languages`, або шукайце па назве з `bash scripts/prepare-airgap.sh --search-ocr-language `. Калі збіраеце з абмежаваным наборам моў OCR, перадайце тыя ж коды ў `VITE_TESSERACT_AVAILABLE_LANGUAGES`, каб праграма паказвала толькі ўключаныя мовы. Для цалкам аўтаномнага OCR таксама размясціце ўбудаваны каталог `ocr-fonts/` і ўкажыце на яго ў `VITE_OCR_FONT_BASE_URL`. + +Задайце зменнай пусты радок, каб адключыць адпаведны модуль (карыстальнікам давядзецца наладзіць яго ўручную ў пашыраных наладах). + +## Уласны порт + +Па змаўчанні BentoPDF слухае порт `8080` унутры кантэйнера. Каб змяніць яго, задайце зменную асяроддзя `PORT` пры запуску: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Зменная | Апісанне | Па змаўчанні | +| ------- | ----------------------- | ------------ | +| `PORT` | Порт Nginx у кантэйнеры | `8080` | + +Гэта працуе і са стандартным, і з nonroot Dockerfile. + +## Уласны ID карыстальніка (PUID/PGID) + +Для асяроддзяў, дзе патрабуецца запуск ад пэўнага карыстальніка без правоў root (NAS-прылады, Kubernetes з security contexts, палітыкі арганізацыі), BentoPDF мае асобны Dockerfile з падтрымкай PUID/PGID у стылі LSIO. + +### Зборка і запуск + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Зменныя асяроддзя + +| Зменная | Апісанне | Па змаўчанні | +| -------------- | ----------------------------- | ------------ | +| `PUID` | ID карыстальніка для запуску | `1000` | +| `PGID` | ID групы для запуску | `1000` | +| `PORT` | Порт Nginx | `8080` | +| `DISABLE_IPV6` | Адключыць праслухоўванне IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Як гэта працуе + +Кантэйнер запускаецца ад root, стварае карыстальніка з зададзенымі PUID/PGID, змяняе ўладальніка ўсіх каталогаў з правам запісу, затым скідае прывілеі з дапамогай `su-exec`. Працэс nginx цалкам працуе ад указанага вамі карыстальніка. + +> [!NOTE] +> Стандартны `Dockerfile` выкарыстоўвае `nginx-unprivileged` (UID 101) і рэкамендуецца для большасці разгортванняў. Выкарыстоўвайце `Dockerfile.nonroot`, толькі калі вам патрэбны пэўны UID/GID. + +> [!WARNING] +> PUID/PGID не можа быць `0` (root). Entrypoint правярае ўваходныя даныя і завяршаецца з памылкай пры няправільных значэннях. + +## З Traefik (зваротны проксі) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## З Caddy (зваротны проксі) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Ліміты рэсурсаў + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (інтэграцыя з systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) дазваляе запускаць кантэйнеры Podman як сэрвісы systemd. Гэта ідэальна для працоўных разгортванняў на Linux. + +### Базавая наладка Quadlet + +Стварыце файл юніта кантэйнера ў `~/.config/containers/systemd/bentopdf.container` (карыстальнік) або `/etc/containers/systemd/bentopdf.container` (сістэма): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Уключэнне і запуск + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Для агульнасістэмнага разгортвання выкарыстоўвайце `systemctl` без сцяга `--user` і змясціце файл у `/etc/containers/systemd/`. + +### Quadlet з праверкай стану + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Аўтаабнаўленне з Quadlet + +Podman можа аўтаматычна абнаўляць кантэйнеры, калі з'яўляюцца новыя вобразы: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Сеткавая канфігурацыя Quadlet + +Для ўласнай сеткавай канфігурацыі стварыце сеткавы файл `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Затым спашліцеся на яго ў файле кантэйнера: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Абнаўленне + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/be/self-hosting/hostinger.md b/docs/be/self-hosting/hostinger.md new file mode 100644 index 00000000..290da96c --- /dev/null +++ b/docs/be/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Разгортванне на Hostinger + +[Hostinger](https://hostinger.com) папулярны правайдар віртуальнага хостынгу. У гэтым кіраўніцтве апісана разгортванне BentoPDF на віртуальным хостынгу Hostinger. + +## Патрабаванні + +- Тарыф хостынгу Hostinger з доступам да файлавага менеджара +- Node.js, усталяваны лакальна для зборкі + +## Крок 1: Збярыце праект + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Сабраныя файлы будуць у тэчцы `dist`. + +## Крок 2: Загрузка ў Hostinger + +### Разгортванне ў каранёвым дамене + +1. Увайдзіце ў ваш уліковы запіс Hostinger +2. Перайдзіце ў **File Manager** → **public_html** +3. **Выдаліце** ўсе існуючыя файлы (пры неабходнасці зрабіце рэзервовую копію) +4. **Загрузіце** ўвесь змест вашай лакальнай тэчкі `dist` у `public_html` + +### Разгортванне ў падкаталогу + +Калі разгортваеце ў падкаталог (напрыклад, `yourdomain.com/pdf-tools/`): + +1. Збярыце з правільным базавым URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Стварыце тэчку ў Hostinger: + - Перайдзіце ў **File Manager** → **public_html** + - Стварыце новую тэчку: `pdf-tools` +3. Загрузіце ўвесь змест `dist` у `public_html/pdf-tools/` + +## Крок 3: Стварыце файл .htaccess + +Стварыце файл `.htaccess` у корані тэчкі разгортвання (`public_html` або `public_html/pdf-tools/`): + +::: warning Важна +Для разгортвання ў падкаталогу змяніце `RewriteBase /` на `RewriteBase /pdf-tools/` (або назву вашай тэчкі). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Прыклад .htaccess для падкаталога + +Для `yourdomain.com/pdf-tools/` абнавіце гэтыя радкі: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Вырашэнне праблем + +### Файлы WASM не загружаюцца + +Пераканайцеся, што MIME-тыпы правільна зададзены ў `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Інструменты LibreOffice не працуюць + +Загалоўкі бяспекі крытычна важныя для SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Калі загалоўкі не прымяняюцца, звярніцеся ў падтрымку Hostinger, каб уключыць `mod_headers`. + +### Памылкі 404 пры абнаўленні старонкі + +Пераканайцеся, што правіла пашырэння `.html` і моўныя маршруты настроены правільна. BentoPDF выкарыстоўвае статычныя HTML-файлы, а не SPA-маршрутызацыю: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Ліміты загрузкі файлаў + +У Hostinger могуць быць ліміты памеру файлаў. Калі масавая загрузка не ўдаецца, загружайце файлы WASM асобна. diff --git a/docs/be/self-hosting/index.md b/docs/be/self-hosting/index.md new file mode 100644 index 00000000..41793ff9 --- /dev/null +++ b/docs/be/self-hosting/index.md @@ -0,0 +1,538 @@ +# Кіраўніцтва па самастойным размяшчэнні + +BentoPDF можна размясціць на ўласнай інфраструктуры. Гэта кіраўніцтва апісвае розныя варыянты разгортвання. + +## Хуткі старт з Docker / Podman + +Самы хуткі спосаб размясціць BentoPDF самастойна: + +> [!TIP] +> BentoPDF пастаўляецца ў дзвюх зборках: +> +> - **Зборка для самастойнага размяшчэння**: `ghcr.io/alam00000/bentopdf-simple:latest`. Усе інструменты PDF, **без** маркетынгавага афармлення (без hero-блока, FAQ, водгукаў, ніжняга калантытула). Выкарыстоўвайце яе для ўнутраных разгортванняў каманды або арганізацыі. Гэта **не** скарочаная "lite" версія. +> - **Камерцыйная зборка**: `ghcr.io/alam00000/bentopdf:latest`. Поўны маркетынгавы сайт, які выкарыстоўвае сам bentopdf.com і ўладальнікі камерцыйнай ліцэнзіі для публічных разгортванняў. +> +> Калі сумняваецеся, бярыце зборку для самастойнага размяшчэння. + +> [!IMPORTANT] +> Пераўтварэнне офісных файлаў патрабуе `SharedArrayBuffer`, а значыць, праграма павінна быць ізаляванай паміж крыніцамі (cross-origin isolated) і раздавацца з бяспечнага кантэксту. Афіцыйны вобраз ужо адпраўляе патрэбныя загалоўкі COOP/COEP, але браўзеры ўсё роўна адключаюць `SharedArrayBuffer` на звычайных HTTP-адрасах лакальнай сеткі, напрыклад `http://192.168.x.x`. +> +> Выкарыстоўвайце `http://localhost` толькі для праверкі на той жа прыладзе. Калі карыстальнікі заходзяць у BentoPDF праз IP або імя хаста ў LAN, падключыце HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Або з Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Запускайце BentoPDF як сэрвіс systemd. Стварыце `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Поўная дакументацыя па Quadlet ёсць у [кіраўніцтве па разгортванні з Docker](/be/self-hosting/docker). + +## Зборка з зыходнага кода + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Параметры канфігурацыі + +### Зборка для самастойнага размяшчэння (Simple Mode) + +Зборка для самастойнага размяшчэння (вобраз `bentopdf-simple`, таксама вядомы як Simple Mode) **функцыянальна ідэнтычная** камерцыйнай зборцы: усе інструменты PDF прысутнічаюць і працуюць аднолькава. Яна толькі хавае маркетынгавае афармленне, якое мае сэнс толькі на самім bentopdf.com або ў камерцыйным публічным разгортванні. **Гэта не скарочаная і не "lite" версія.** + +**Што хавае зборка для самастойнага размяшчэння** (толькі касметыка, ніякія функцыі PDF не выдаляюцца): + +- Панэль навігацыі, hero-блок, раздзел магчымасцей, FAQ, водгукі, ніжні калантытул +- Змяняе загаловак старонкі на "Інструменты PDF" + +**Што застаецца ў зборцы для самастойнага размяшчэння** (усё, што сапраўды працуе з PDF): + +- Усе інструменты PDF (аб'яднанне, падзел, рэдагаванне, подпіс, OCR, пераўтварэнне офісных файлаў і г.д.) +- Падтрымка ўласнага брэндынгу, уся канфігурацыя падчас зборкі і выканання + +Камерцыйная зборка (`ghcr.io/alam00000/bentopdf:latest`) ляжыць у аснове самога bentopdf.com і выкарыстоўваецца ўладальнікамі камерцыйнай ліцэнзіі для публічных разгортванняў: яна дадае hero-блок, FAQ, водгукі і ніжні калантытул, якія не мелі б сэнсу ва ўнутраным інструменце. + +Калі вы размяшчаеце BentoPDF для сваёй каманды, арганізацыі або як унутраны інструмент, бярыце зборку для самастойнага размяшчэння: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Падрабязнасці глядзіце ў [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md). + +### Камерцыйная зборка (публічныя разгортванні пад уласным брэндам) + +Камерцыйная зборка (вобраз `bentopdf`, без суфікса `-simple`) ляжыць у аснове самога bentopdf.com. Яна ўключае поўны маркетынгавы сайт (hero-блок, магчымасці, FAQ, водгукі, ніжні калантытул) у дадатак да ўсіх інструментаў PDF. Выкарыстоўвайце гэтую зборку, калі хочаце **разгарнуць BentoPDF як публічны PDF-сэрвіс пад уласным брэндам**, напрыклад: + +- Вы прапануеце BentoPDF як SaaS для канчатковых карыстальнікаў на сваім дамене +- Вам патрэбна поўная старонка (маркетынгавыя раздзелы + інструменты), а не толькі голы набор інструментаў +- Вы ўладальнік камерцыйнай ліцэнзіі і ўбудоўваеце BentoPDF у камерцыйны прадукт + +**Запуск як ёсць** (брэндынг BentoPDF, зручна для папярэдняга прагляду зборкі): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Зборка з уласным брэндам** (тыповы камерцыйны сцэнарый): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Усе іншыя параметры зборкі (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, перавызначэнні URL для WASM і г.д.) працуюць гэтак жа, як і ў зборцы для самастойнага размяшчэння. + +::: warning Ліцэнзаванне +Выкарыстанне камерцыйнай зборкі дазволена паводле любога з двух варыянтаў ліцэнзіі BentoPDF: + +- **AGPL-3.0** (бясплатна): дазволена, калі ваша разгортванне публікуе ўвесь свой зыходны код пад AGPL, уключаючы змены брэндынгу і звязаную бізнес-логіку. +- **Камерцыйная ліцэнзія** ($79 пажыццёва): патрэбна для закрытых / прапрыетарных разгортванняў, калі вы не адкрываеце код свайго форка з брэндынгам або бізнес-код. + +Поўнае параўнанне глядзіце на [старонцы ліцэнзавання](https://www.bentopdf.com/licensing). Модулі WASM пад AGPL (PyMuPDF, Ghostscript, CoherentPDF) загружаюцца з CDN падчас выканання, таму яны не трапляюць у ваш вобраз і не змяняюць вашага ліцэнзійнага становішча. +::: + +### Базавы URL + +Разгортванне ў падкаталог: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Уласны брэндынг + +Замяніце стандартны лагатып, назву і тэкст ніжняга калантытула BentoPDF на свае падчас зборкі: + +| Зменная | Апісанне | Па змаўчанні | +| ------------------ | ------------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Назва брэнда ў загалоўку і ніжнім калантытуле | `BentoPDF` | +| `VITE_BRAND_LOGO` | Шлях да лагатыпа адносна `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Уласны тэкст ніжняга калантытула/аўтарскага права | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Або праз Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Брэндынг працуе і ў поўным рэжыме, і ў Simple Mode, і можа спалучацца з усімі іншымі параметрамі зборкі (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Адключэнне пэўных інструментаў + +Хавайце асобныя інструменты з меркаванняў адпаведнасці патрабаванням або бяспекі. Адключаныя інструменты выдаляюцца з галоўнай старонкі, пошуку, спалучэнняў клавіш, канструктара працоўных працэсаў і недаступныя па прамым URL. + +Ідэнтыфікатары інструментаў: гэта URL старонкі без `.html`. Адкрыйце любы інструмент і паглядзіце на URL (напрыклад, `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Падчас зборкі** (убудоўваецца ў бандл): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Падчас выканання** (без перазборкі, падключыце `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Абодва спосабы можна спалучаць: спісы аб'ядноўваюцца. + +Таксама можна адключыць асобныя функцыі ў рэдактары PDF (напрыклад, рэдагаванне канфідэнцыйных даных), не адключаючы ўвесь інструмент, дадаўшы `editorDisabledCategories` у `config.json`. Поўны спіс катэгорый глядзіце ў [кіраўніцтве па Docker](/be/self-hosting/docker#адключэнне-функцыи-рэдактара). + +## Кіраўніцтвы па разгортванні + +Выберыце платформу: + +- [Vercel](/be/self-hosting/vercel) +- [Netlify](/be/self-hosting/netlify) +- [Cloudflare Pages](/be/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/be/self-hosting/aws) +- [Hostinger](/be/self-hosting/hostinger) +- [Nginx](/be/self-hosting/nginx) +- [Apache](/be/self-hosting/apache) +- [Docker](/be/self-hosting/docker) +- [Kubernetes](/be/self-hosting/kubernetes) +- [CORS-проксі](/be/self-hosting/cors-proxy) - патрэбны для лічбавых подпісаў + +## Тыповыя праблемы + +### Word / ODT / Excel / PowerPoint у PDF завісае (SharedArrayBuffer недаступны) + +**Сімптом**: пераўтварэнні дакументаў на базе LibreOffice (Word, ODT, Excel, PowerPoint у PDF) завісаюць на ~55% або не пачынаюцца. У кансолі браўзера можа быць: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…або `window.crossOriginIsolated` вяртае `false`, або кампіляцыя WASM паведамляе `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Прычына**: LibreOffice WASM патрабуе `SharedArrayBuffer`, які браўзер уключае толькі калі старонка **ізаляваная паміж крыніцамі** І раздаецца з **бяспечнага кантэксту**. Гэта значыць, што павінны выконвацца дзве ўмовы: + +1. Кожны адказ уключае абодва загалоўкі: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Старонка раздаецца з `https://...` або `http://localhost`. Звычайны HTTP на IP лакальнай сеткі (напрыклад, `http://192.168.x.x`) НЕ лічыцца бяспечным: браўзеры адключаюць там `SharedArrayBuffer`. + +Неадпаведнасць `00 61 73 6d / 1f 8b 08 08` з'яўляецца асобным сімптомам: у папярэдне сціснутых файлаў `.wasm.gz` / `.data.gz` няма загалоўка адказу `Content-Encoding: gzip`, таму браўзер атрымлівае сырыя байты gzip замест распакаванага WASM. + +**Рашэнне**: дакладную канфігурацыю глядзіце ў кіраўніцтве для вашай платформы: + +- [Nginx →](/be/self-hosting/nginx#word-odt-excel-у-pdf-не-працуе) +- [Apache →](/be/self-hosting/apache#word-odt-excel-у-pdf-не-працуе) +- [AWS S3 + CloudFront →](/be/self-hosting/aws#крок-3b-палітыка-загалоукау-адказу-абавязкова-для-libreoffice-wasm) +- [Cloudflare Pages →](/be/self-hosting/cloudflare#фаил-канфігурацыі) (файл `_headers`) +- [Netlify →](/be/self-hosting/netlify#word-odt-excel-у-pdf-спыняецца-на-55) (`netlify.toml`) +- [Vercel →](/be/self-hosting/vercel#word-odt-excel-у-pdf-не-працуе) (`vercel.json`) +- [Hostinger →](/be/self-hosting/hostinger#інструменты-libreoffice-не-працуюць) (`.htaccess`) +- [Kubernetes →](/be/self-hosting/kubernetes#як-пераканацца-што-загалоукі-sharedarraybuffer-працуюць-ingress-gateway) +- **Docker**: апрацоўваецца аўтаматычна ўбудаванай канфігурацыяй nginx, нічога рабіць не трэба. + +**Праверка**: адкрыйце кансоль DevTools на любой старонцы BentoPDF і выканайце: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Калі старонка працуе праз HTTPS або `http://localhost` І абодва загалоўкі COEP/COOP ёсць у кожным адказе, абедзве праверкі праходзяць. Калі вы на `http://192.168.x.x` або іншым не-loopback HTTP-адрасе, падключыце HTTPS: выпраўлення толькі загалоўкамі няма. + +### Файлы `.mjs` аддаюцца як `application/octet-stream` + +**Сімптом**: Падпісаць PDF / Запаўненне форм / некаторыя іншыя інструменты паказваюць пусты праглядальнік або не загружаюцца. Кансоль браўзера паведамляе: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Прычына**: у вашым вэб-серверы або зваротным проксі няма адпаведнасці MIME-тыпу для файлаў `.mjs` (убудаваны праглядальнік PDF пастаўляецца з ES-модулямі з гэтым пашырэннем). Многія стандартныя канфігурацыі сервераў па змаўчанні аддаюць `application/octet-stream` для невядомых пашырэнняў, а браўзеры адмаўляюцца выконваць такое як ES-модулі. + +**Рашэнне**: дакладны фрагмент глядзіце ў кіраўніцтве для вашай платформы: + +- [Nginx →](/be/self-hosting/nginx#падпісаць-pdf-або-запауненне-форм-паказвае-пусты-праглядальнік-памылка-mime-mjs) +- [Apache →](/be/self-hosting/apache#падпісаць-pdf-або-запоуніць-форму-pdf-паказвае-пусты-прагляднік-памылка-mime-mjs) +- [AWS S3 + CloudFront →](/be/self-hosting/aws#крок-2-зборка-і-загрузка) (глядзіце `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/be/self-hosting/kubernetes#памылкі-mime-тыпу-mjs-пусты-iframe-у-падпісаць-pdf-запауненне-форм) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: апрацоўваецца аўтаматычна, нічога рабіць не трэба. + +**Праверка**: адкрыйце DevTools → укладка Network, знайдзіце няўдалы запыт `.mjs` і праверце загаловак адказу `Content-Type`. Ён павінен быць `application/javascript`. Калі ён усё яшчэ `application/octet-stream`, знешні зваротны проксі або CDN можа паўторна вызначаць тып: праверце кожны ўзровень ланцужка раздачы. + +## Канфігурацыя WASM (кампаненты AGPL) + +BentoPDF **не ўключае** ў свой зыходны код бібліятэкі апрацоўкі пад ліцэнзіяй AGPL, але **загадзя наладжвае URL CDN**, каб усе функцыі працавалі адразу, без ручной налады. + +::: tip Без налад па змаўчанні +Пачынаючы з v2.0.0, модулі WASM загадзя наладжаны на загрузку з CDN jsDelivr праз зменныя асяроддзя. Усе пашыраныя функцыі працуюць адразу без налад з боку карыстальніка. +::: + +| Кампанент | Ліцэнзія | Функцыі | +| --------------- | -------- | ------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Пераўтварэнне EPUB/MOBI/FB2/XPS, выманне выяў, выманне табліц | +| **Ghostscript** | AGPL-3.0 | Пераўтварэнне ў PDF/A, сцісканне, выраўноўванне нахілу, растраванне | +| **CoherentPDF** | AGPL-3.0 | Змест, далучэнні, аб'яднанне PDF з закладкамі | + +### Зменныя асяроддзя па змаўчанні + +Яны задаюцца ў `.env.production` і ўбудоўваюцца ў зборку: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Перавызначэнне URL для WASM + +Значэнні па змаўчанні можна перавызначыць падчас зборкі для ўласных разгортванняў: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Каб цалкам адключыць модуль (патрабуючы ручной налады карыстальнікам праз пашыраныя налады), задайце яго зменнай пусты радок. + +Для OCR альбо пакіньце ўсе зменныя `VITE_TESSERACT_*` пустымі і выкарыстоўвайце стандартныя анлайн-рэсурсы, альбо задайце URL worker/core/lang разам для ўласнага або аўтаномнага OCR. Калі вы ўключаеце толькі пэўныя мовы OCR, таксама задайце `VITE_TESSERACT_AVAILABLE_LANGUAGES` з тымі ж кодамі праз коску, каб інтэрфейс прапаноўваў толькі ўсталяваныя мовы, а непадтрымліваемы выбар завяршаўся зразумелай памылкай. Для поўнасцю аўтаномнага выніку PDF з пошукам таксама задайце `VITE_OCR_FONT_BASE_URL` на ўнутраны каталог, які раздае ўбудаваныя шрыфты OCR. + +Карыстальнікі таксама могуць у любы момант перавызначыць гэтыя значэнні праз **Пашыраныя налады** ў інтэрфейсе: перавызначэнні карыстальніка, захаваныя ў браўзеры, маюць прыярытэт над значэннямі асяроддзя. + +### Ізаляванае / аўтаномнае разгортванне + +Для сетак без доступу да інтэрнэту (дзяржаўныя, медыцынскія, фінансавыя і г.д.). URL для WASM убудоўваюцца ў JavaScript **падчас зборкі**, а самі файлы WASM спампоўвае **браўзер карыстальніка** падчас выканання. Таму ўсё трэба падрыхтаваць на машыне з інтэрнэтам, а потым перанесці ў ізаляваную сетку. + +#### Аўтаматычны скрыпт (рэкамендуецца) + +Уключаны скрыпт `prepare-airgap.sh` аўтаматызуе ўвесь працэс: спампоўвае пакеты WASM, збірае вобраз Docker і стварае самадастатковы пакет са скрыптом усталявання. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +У выніку атрымаецца каталог пакета: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Перанясіце пакет у ізаляваную сетку праз USB, унутраны рэпазіторый артэфактаў або іншы дазволены спосаб. Затым запусціце ўключаны скрыпт усталявання: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Скрыпт загружае вобраз Docker, распакоўвае файлы WASM і пры жаданні запускае кантэйнер. + +**Параметры скрыпта:** + +| Сцяг | Апісанне | Па змаўчанні | +| ------------------------------ | ---------------------------------------------------------- | -------------------------------------- | +| `--wasm-base-url ` | Дзе WASM будуць размешчаны ўнутры сеткі | _(абавязкова, запытваецца, калі няма)_ | +| `--image-name ` | Тэг вобраза Docker | `bentopdf` | +| `--output-dir ` | Каталог выніковага пакета | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Уключыць Simple Mode | выкл. | +| `--base-url ` | Базавы URL падкаталога (напрыклад, `/pdf/`) | `/` | +| `--language ` | Мова інтэрфейсу па змаўчанні (напрыклад, `fr`, `de`) | _(няма)_ | +| `--brand-name ` | Уласная назва брэнда | _(няма)_ | +| `--brand-logo ` | Шлях да лагатыпа адносна `public/` | _(няма)_ | +| `--footer-text ` | Уласны тэкст ніжняга калантытула | _(няма)_ | +| `--ocr-languages ` | Мовы OCR для ўключэння ў пакет праз коску | `eng` | +| `--list-ocr-languages` | Вывесці падтрымліваемыя коды і назвы OCR і выйсці | выкл. | +| `--search-ocr-language ` | Пошук кодаў OCR па назве або скарачэнні | выкл. | +| `--dockerfile ` | Dockerfile для выкарыстання | `Dockerfile` | +| `--skip-docker` | Прапусціць зборку і экспарт Docker | выкл. | +| `--skip-wasm` | Прапусціць спампоўванне WASM (выкарыстаць існуючыя `.tgz`) | выкл. | + +Інтэрактыўны рэжым таксама прымае `list`, каб вывесці поўны спіс падтрымліваемых кодаў Tesseract, і `search ` для пошуку адпаведнасцей, напрыклад `search german` або `search chi`. + +::: warning Патрабаванне аднаго паходжання +Файлы WASM павінны раздавацца з **таго ж паходжання (origin)**, што і праграма BentoPDF. Web Workers выкарыстоўваюць `importScripts()`, які не можа загружаць скрыпты з іншых паходжанняў. Напрыклад, калі BentoPDF працуе на `https://internal.example.com`, базавы URL для WASM таксама павінен быць `https://internal.example.com/wasm`. +::: + +#### Ручныя крокі + +
+Калі вы аддаеце перавагу рабіць усё ўручную без скрыпта + +**Крок 1: Спампуйце пакеты WASM і OCR** (на машыне з інтэрнэтам) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Крок 2: Збярыце вобраз Docker з унутранымі URL** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Крок 3: Экспартуйце вобраз Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Крок 4: Перанясіце ў ізаляваную сетку** + +Скапіруйце праз USB, унутраны рэпазіторый артэфактаў або іншы дазволены спосаб: + +- `bentopdf.tar`: вобраз Docker +- Пяць пакетаў WASM/OCR `.tgz` з кроку 1 +- Каталог `tesseract-langdata/` з кроку 1 +- Каталог `ocr-fonts/` з кроку 1 + +**Крок 5: Наладзьце ўнутры ізаляванай сеткі** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Пераканайцеся, што файлы даступныя па URL, наладжаных на кроку 2, уключаючы `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` і `.../ocr/fonts`. + +
+ +::: info Збіраеце з зыходнага кода замест Docker? +Задайце зменныя ў `.env.production` перад запускам `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Уласны проксі для WASM + +Калі трэба раздаваць файлы WASM пад AGPL з правільнымі загалоўкамі CORS, можна разгарнуць просты проксі. Прыклад рэалізацыі ёсць у [кіраўніцтве па Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md). + +::: tip Чаму асобна? +Такое раздзяленне забяспечвае: + +- Зразумелую юрыдычную адпаведнасць для камерцыйных карыстальнікаў +- Ядро BentoPDF застаецца пад двайной ліцэнзіяй (AGPL-3.0 / камерцыйная) +- Файлы WASM загружаюцца падчас выканання, а не ўключаюцца ў зыходны код + ::: + +## Сістэмныя патрабаванні + +| Патрабаванне | Мінімум | +| ------------ | ------------------------------- | +| Сховішча | ~100 MB (ядро без модуляў AGPL) | +| RAM | 512 MB | +| CPU | Любы сучасны працэсар | + +::: tip +BentoPDF з'яўляецца статычным сайтам: ніякая база даных або бэкэнд-сервер не патрэбныя! +::: diff --git a/docs/be/self-hosting/kubernetes.md b/docs/be/self-hosting/kubernetes.md new file mode 100644 index 00000000..b5a31e96 --- /dev/null +++ b/docs/be/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Разгортванне з Kubernetes + +Kubernetes можа быць залішнім для статычнага сайта, але выдатна падыходзіць, калі вы ўжо карыстаецеся Helm + GitOps як стандартам. + +> [!IMPORTANT] +> **Абавязковыя загалоўкі для пераўтварэння офісных файлаў** +> +> Інструменты на базе LibreOffice (пераўтварэнне Word, Excel, PowerPoint) патрабуюць гэтыя HTTP-загалоўкі для падтрымкі `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Афіцыйныя вобразы BentoPDF з nginx уключаюць гэтыя загалоўкі. У Kubernetes **кантролеры Ingress/Gateway таксама з'яўляюцца зваротнымі проксі**, таму пераканайцеся, што гэтыя загалоўкі захоўваюцца (або дадайце іх на краі). + +## Патрабаванні + +- Кластар Kubernetes +- Helm v3 +- Вобраз BentoPDF з nginx (напрыклад, `ghcr.io/alam00000/bentopdf:`), які працуе на **порце 8080** + +## Разгортванне з Helm + +### Усталяванне з гэтага рэпазіторыя (лакальны chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Усталяванне з GHCR (OCI chart) + +Калі chart апублікаваны ў GHCR як артэфакт OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Адкрыццё доступу + +### Port-forward (хуткая праверка) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (неабавязкова) + +Уключыце Ingress (прыклад для nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (неабавязкова) + +Гэты chart падтрымлівае Gateway API `Gateway` + `HTTPRoute`. + +Прыклад (аператар Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Як пераканацца, што загалоўкі SharedArrayBuffer працуюць (Ingress/Gateway) + +### Што "павінна" адбывацца + +Канфігурацыя nginx у BentoPDF задае патрэбныя загалоўкі адказу. Большасць кантролераў Ingress/Gateway **перадаюць загалоўкі адказу ад upstream без змен**. + +### Што можа гэта зламаць + +- Палітыка кантролера/краю, якая **перавызначае** або **выдаляе** загалоўкі адказу +- Прамежкавае ПЗ для "security headers", якое задае іншыя значэнні COOP/COEP + +### Як праверыць + +Выканайце гэта для свайго публічнага адраса: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Вы павінны ўбачыць: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Калі ваш кантролер Ingress не захоўвае іх + +Дадайце загалоўкі на краі (залежыць ад кантролера). Прыклад для **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Памылкі MIME-тыпу `.mjs` (пусты iframe у Падпісаць PDF / Запаўненне форм) + +Калі ў кансолі браўзера бачна `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` для запыту `.mjs`, кантролер Ingress/Gateway перад nginx BentoPDF замяняе загаловак `Content-Type` ад upstream на `application/octet-stream`. + +Nginx у вобразе BentoPDF ужо аддае `.mjs` як `application/javascript`. Рашэнне: забараніць кантролеру выдаляць або замяняць яго. Для nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Або выкарыстайце фільтр `ResponseHeaderModifier` у Gateway API, каб задаць `Content-Type: application/javascript` для шляхоў `.mjs`. Праверце ў DevTools → укладка Network: няўдалы раней запыт `.mjs` цяпер павінен паказваць `content-type: application/javascript`. + +### Калі вы выкарыстоўваеце Gateway API і хочаце прымусова дадаць загалоўкі + +Gateway API падтрымлівае фільтр `ResponseHeaderModifier`. Яго можна далучыць у `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Падтрымка пэўных фільтраў залежыць ад вашага кантролера Gateway; калі фільтр ігнаруецца, дадайце загалоўкі на ўзроўні краю/кантролера. + +## Адключэнне пэўных інструментаў + +Выкарыстайце ConfigMap, каб адключаць інструменты падчас выканання без перазборкі вобраза: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Падключыце яго ў каталог, які раздаецца: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Ідэнтыфікатары інструментаў: гэта URL старонкі без `.html`. Адкрыйце любы інструмент і паглядзіце на URL (напрыклад, `edit-pdf`, `merge-pdf`, `compress-pdf`). Адключаныя інструменты схаваныя з галоўнай старонкі, пошуку, спалучэнняў клавіш, канструктара працоўных працэсаў і недаступныя па прамым URL. Поўны спіс параметраў глядзіце ў [кіраўніцтве па Docker](/be/self-hosting/docker#адключэнне-асобных-інструментау). diff --git a/docs/be/self-hosting/netlify.md b/docs/be/self-hosting/netlify.md new file mode 100644 index 00000000..8a931290 --- /dev/null +++ b/docs/be/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Разгортванне на Netlify + +[Netlify](https://netlify.com) прапануе выдатны хостынг статычных сайтаў са шчодрым бясплатным тарыфам. + +## Разгортванне адным клікам + +[![Разгарнуць на Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Ручное разгортванне + +### Крок 1: Падключыце рэпазіторый + +1. Увайдзіце ў [Netlify](https://app.netlify.com) +2. Націсніце "Add new site" → "Import an existing project" +3. Падключыце свой уліковы запіс GitHub +4. Выберыце свой форк BentoPDF + +### Крок 2: Наладзьце параметры зборкі + +| Налада | Значэнне | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Версія Node | 18+ | + +### Крок 3: Разгортванне + +Націсніце "Deploy site" і пачакайце завяршэння зборкі. + +## Файл канфігурацыі + +Стварыце `netlify.toml` у корані праекта: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Важна +Загалоўкі `Cross-Origin-Embedder-Policy` і `Cross-Origin-Opener-Policy` патрэбныя для пераўтварэнняў Word/ODT/Excel/PowerPoint у PDF. Без іх `SharedArrayBuffer` недаступны, і рухавік LibreOffice WASM не ініцыялізуецца. + +Загалоўкі `Content-Encoding: gzip` для файлаў `.wasm.gz` і `.data.gz` кажуць браўзеру распакоўваць іх аўтаматычна. Без іх браўзер атрымлівае сырыя байты gzip, і кампіляцыя WASM завяршаецца памылкай. +::: + +## Зменныя асяроддзя + +Задайце іх у Site settings → Environment variables: + +| Зменная | Апісанне | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Задайце `true` для мінімальнай зборкі | +| `VITE_BRAND_NAME` | Уласная назва брэнда (замяняе "BentoPDF") | +| `VITE_BRAND_LOGO` | Шлях да лагатыпа адносна `public/` (напрыклад, `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Уласны тэкст ніжняга калантытула/аўтарскага права | +| `VITE_DEFAULT_LANGUAGE` | Мова інтэрфейсу па змаўчанні (напрыклад, `fr`, `de`, `es`) | + +## Уласны дамен + +1. Перайдзіце ў Site settings → Domain management +2. Націсніце "Add custom domain" +3. Выконвайце інструкцыі па наладзе DNS + +## Вялікія медыяфайлы + +Для вялікіх файлаў WASM варта ўключыць [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Выпраўленне непаладак + +### Word/ODT/Excel у PDF спыняецца на 55% + +Калі пераўтварэнне дакументаў завісае на 55%, адкрыйце кансоль DevTools і праверце: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Калі `crossOriginIsolated` роўна `false`, загалоўкі COEP/COOP з вашага `netlify.toml` не прымяняюцца. Пераканайцеся, што файл ляжыць у корані праекта, і разгарніце нанова. + +Калі ў кансолі бачна `expected magic word 00 61 73 6d, found 1f 8b 08 08`, у файлаў `.wasm.gz` няма загалоўкаў `Content-Encoding: gzip`. Пераканайцеся, што блокі `[[headers]]` для `soffice.wasm.gz` і `soffice.data.gz` ёсць у вашым `netlify.toml`. + +### Памылка зборкі + +Праверце сумяшчальнасць версіі Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Павольная першая загрузка + +Уключыце аптымізацыю рэсурсаў у Site settings → Build & deploy → Asset optimization. diff --git a/docs/be/self-hosting/nginx.md b/docs/be/self-hosting/nginx.md new file mode 100644 index 00000000..cfacf9ba --- /dev/null +++ b/docs/be/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Разгортванне з Nginx + +Размясціце BentoPDF на ўласным серверы з дапамогай Nginx. + +## Патрабаванні + +- Сервер Ubuntu/Debian +- Усталяваны Nginx +- SSL-сертыфікат (рэкамендуецца Let's Encrypt) + +## Крок 1: Зборка праекта + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Каб змяніць брэндынг, задайце зменныя асяроддзя перад зборкай: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Крок 2: Капіраванне файлаў + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Крок 3: Канфігурацыя Nginx + +Стварыце `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Крок 4: Уключэнне сайта + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Крок 5: SSL з Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Разгортванне ў падкаталогу + +Каб размясціць па шляху `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Збярыце з: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Налада прадукцыйнасці + +Дадайце ў `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Выпраўленне непаладак + +### WASM не загружаецца + +Пераканайцеся, што MIME-тып зададзены: + +```nginx +types { + application/wasm wasm; +} +``` + +### Падпісаць PDF або Запаўненне форм паказвае пусты праглядальнік (памылка MIME `.mjs`) + +Калі ў кансолі браўзера бачна: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…і няўдалы запыт заканчваецца на `.mjs`, у вашым nginx няма адпаведнасці `.mjs → application/javascript`. Убудаваны праглядальнік PDF (выкарыстоўваецца ў Падпісаць PDF, Запаўненні форм і некалькіх іншых інструментах) пастаўляецца з файламі ES-модуляў з пашырэннем `.mjs`, а стандартны `mime.types` у nginx па змаўчанні іх не ўключае. + +Выправіце гэта, дадаўшы `mjs` у існуючы радок `application/javascript` у `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> НЕ дадавайце _другі_ радок `application/javascript`: nginx разбірае `mime.types` радок за радком, і перамагае толькі адна адпаведнасць тыпу і пашырэння, таму ў некаторых версіях другі радок моўчкі ігнаруецца. Адрэдагуйце існуючы радок, дадаўшы `mjs` побач з `js`. + +Або перавызначце лакальна ўнутры блока server (без рэдагавання глабальнага файла): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Перазагрузіце nginx пасля змены: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Каб пераканацца: у DevTools браўзера → укладка Network знайдзіце няўдалы запыт `.mjs` і праверце загаловак адказу `Content-Type`. Цяпер ён павінен быць `application/javascript`, а не `application/octet-stream`. + +### Word/ODT/Excel у PDF не працуе + +LibreOffice WASM патрабуе `SharedArrayBuffer`, для чаго патрэбныя загалоўкі `Cross-Origin-Embedder-Policy` і `Cross-Origin-Opener-Policy`. Таксама патрэбны бяспечны кантэкст, таму `http://localhost` працуе для лакальнай праверкі, а `http://192.168.x.x` ці іншыя IP лакальнай сеткі звычайна патрабуюць HTTPS. Звярніце ўвагу: дырэктывы nginx `add_header` у блоку `location` **перавызначаюць** дырэктывы `add_header` узроўню server, а не аб'ядноўваюцца з імі. Кожны блок `location` з уласным `add_header` павінен уключаць загалоўкі COEP/COOP. + +Праверце з дапамогай: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Калі перад nginx стаіць зваротны проксі, пераканайцеся, што ён захоўвае гэтыя загалоўкі. + +### 502 Bad Gateway + +Праверце журналы памылак Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/be/self-hosting/vercel.md b/docs/be/self-hosting/vercel.md new file mode 100644 index 00000000..4357f9cd --- /dev/null +++ b/docs/be/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Разгортванне на Vercel + +[Vercel](https://vercel.com) прапануе самы просты спосаб разгортвання статычных сайтаў. + +## Разгортванне адным клікам + +[![Разгарнуць з Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Ручное разгортванне + +### Крок 1: Зрабіце форк рэпазіторыя + +Зрабіце форк [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) у свой уліковы запіс GitHub. + +### Крок 2: Імпарт у Vercel + +1. Перайдзіце на [vercel.com/new](https://vercel.com/new) +2. Выберыце свой форк рэпазіторыя +3. Наладзьце праект: + +| Налада | Значэнне | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Крок 3: Зменныя асяроддзя (неабавязкова) + +Дадайце пры неабходнасці: + +| Зменная | Апісанне | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Задайце `true` для мінімальнага інтэрфейсу | +| `VITE_BRAND_NAME` | Уласная назва брэнда (замяняе "BentoPDF") | +| `VITE_BRAND_LOGO` | Шлях да лагатыпа адносна `public/` (напрыклад, `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Уласны тэкст ніжняга калантытула/аўтарскага права | +| `VITE_DEFAULT_LANGUAGE` | Мова інтэрфейсу па змаўчанні (напрыклад, `fr`, `de`, `es`) | + +### Крок 4: Разгортванне + +Націсніце "Deploy" і пачакайце завяршэння зборкі. + +## Уласны дамен + +1. Адкрыйце налады праекта +2. Перайдзіце ў "Domains" +3. Дадайце свой дамен +4. Наладзьце DNS паводле інструкцый + +## Абмежаванні + +::: warning Вялікія файлы +Бессерверныя функцыі Vercel маюць абмежаванне 50MB. Паколькі BentoPDF з'яўляецца статычным сайтам, гэта не павінна вас закрануць, але модулі WASM вялікія (каля 100MB агулам). Пераканайцеся, што яны раздаюцца з папкі `/public`. +::: + +## Выпраўленне непаладак + +### Перавышэнне часу зборкі + +Калі зборка перавышае час чакання, паспрабуйце: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 пры абнаўленні старонкі + +Дадайце `vercel.json` для маршрутызацыі SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel у PDF не працуе + +Пераўтварэнні LibreOffice WASM патрабуюць `SharedArrayBuffer`, для чаго на ўсіх старонках патрэбныя такія загалоўкі адказу: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Папярэдне сціснутым файлам `.wasm.gz` і `.data.gz` таксама патрэбны `Content-Encoding: gzip`, каб браўзер іх распакоўваў. + +Дадайце гэта ў свой `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Каб праверыць, адкрыйце кансоль DevTools і выканайце `console.log(window.crossOriginIsolated)`: павінна вярнуцца `true`. diff --git a/docs/be/tools/add-attachments.md b/docs/be/tools/add-attachments.md new file mode 100644 index 00000000..2edaa74a --- /dev/null +++ b/docs/be/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Дадаць далучэнні +description: Убудоўвайце файлы любога тыпу ў PDF на ўзроўні дакумента або з прывязкай да пэўных старонак. +--- + +# Дадаць далучэнні + +Убудоўвайце адзін або некалькі файлаў непасрэдна ў PDF-дакумент. Далучэнні можна дадаць на ўзроўні дакумента (бачныя на панэлі далучэнняў любой праграмы для чытання PDF) або прывязаць да пэўных старонак. + +## Як гэта працуе + +1. Загрузіце PDF, да якога хочаце далучыць файлы. +2. Выкарыстайце вобласць далучэнняў, каб выбраць файлы для ўбудавання (любога тыпу). +3. Выберыце ўзровень далучэння: **Дакумент** (па змаўчанні) або **Старонка**. +4. Калі вы выбралі ўзровень старонкі, увядзіце дыяпазон старонак (напрыклад, `1-3` або `5`). +5. Націсніце кнопку апрацоўкі. Зменены PDF з убудаванымі файламі спампуецца. + +## Магчымасці + +- Далучайце файлы любога тыпу: выявы, табліцы, архівы, выканальныя файлы, што заўгодна +- Размяшчэнне далучэнняў на ўзроўні дакумента або старонкі +- Некалькі файлаў можна далучыць за адну аперацыю +- Паказваюцца назвы і памеры ўсіх выбраных далучэнняў +- Вынік захоўвае зыходны змест PDF з дададзенымі ўбудаванымі файламі + +## Параметры + +| Параметр | Апісанне | +| ---------------------- | --------------------------------------------------------------------- | +| **Узровень дакумента** | Далучае файлы да ўсяго PDF, даступныя з панэлі далучэнняў | +| **Узровень старонкі** | Далучае файлы да пэўных старонак, зададзеных полем дыяпазону старонак | + +## Сцэнарыі выкарыстання + +- Аб'яднанне зыходных даных (файлы Excel, CSV) са справаздачай у PDF +- Далучэнне арыгінальных файлаў выяў да PDF-партфоліо фатографа +- Убудаванне дапаможных дакументаў у дагавор або прапанову +- Даданне дадатковых матэрыялаў да пэўных старонак навучальнага дапаможніка + +## Парады + +- Далучэнні на ўзроўні дакумента найлепш падтрымліваюцца праграмамі для чытання PDF. Далучэнні на ўзроўні старонкі могуць быць бачныя не ва ўсіх праграмах. +- Абмежавання памеру файлаў для далучэнняў няма, але вельмі вялікія ўбудаваныя файлы прапарцыйна павялічаць памер PDF. + +## Звязаныя інструменты + +- [Выняць далучэнні](./extract-attachments) +- [Рэдагаваць далучэнні](./edit-attachments) +- [Аб'яднаць PDF](./merge-pdf) diff --git a/docs/be/tools/add-blank-page.md b/docs/be/tools/add-blank-page.md new file mode 100644 index 00000000..577ed423 --- /dev/null +++ b/docs/be/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Дадаць пустую старонку +description: Устаўляйце адну або некалькі пустых старонак у любое месца PDF-дакумента. +--- + +# Дадаць пустую старонку + +Устаўляйце пустыя старонкі ў PDF у вызначанае вамі месца. Вы самі выбіраеце, куды іх уставіць і колькі дадаць. + +## Як гэта працуе + +1. Загрузіце PDF-файл. Інструмент пакажа колькасць старонак. +2. Увядзіце **пазіцыю**, куды трэба ўставіць пустыя старонкі. Выкарыстайце `0`, каб уставіць у самы пачатак, або агульную колькасць старонак, каб дадаць у канец. +3. Увядзіце **колькасць** пустых старонак (па змаўчанні 1). +4. Націсніце кнопку апрацоўкі. Зменены PDF з устаўленымі пустымі старонкамі спампуецца. + +## Магчымасці + +- Устаўка ў любое месца: пачатак, сярэдзіну або канец дакумента +- Даданне некалькіх пустых старонак за адну аперацыю +- Падказка пазіцыі абнаўляецца паводле колькасці старонак загружанага PDF +- Стандартныя пустыя старонкі памеру A4 + +## Сцэнарыі выкарыстання + +- Даданне пустой старонкі-раздзяляльніка паміж раздзеламі сабранага дакумента +- Устаўка пустых старонак для выраўноўвання пры двухбаковым друку +- Даданне месца для рукапісных нататак у раздрукаваным вучэбным дапаможніку +- Дапаўненне дакумента да мінімальнай патрабаванай колькасці старонак + +## Парады + +- Пазіцыя `0` устаўляе перад першай старонкай. Пазіцыя, роўная агульнай колькасці старонак, дадае пасля апошняй. +- Калі трэба ўставіць змест (а не толькі пустыя старонкі) у пэўнае месца, выкарыстайце [Шматфункцыянальны інструмент PDF](./pdf-multi-tool), каб уставіць іншы PDF пасля зададзенай старонкі. + +## Звязаныя інструменты + +- [Упарадкаваць і дубляваць](./organize-pdf) +- [Шматфункцыянальны інструмент PDF](./pdf-multi-tool) +- [Аб'яднаць PDF](./merge-pdf) diff --git a/docs/be/tools/add-page-labels.md b/docs/be/tools/add-page-labels.md new file mode 100644 index 00000000..3329b8da --- /dev/null +++ b/docs/be/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Дадаць пазнакі старонак +description: Дадавайце пазнакі старонак PDF з рымскімі лічбамі, літарнымі прэфіксамі, уласнай нумарацыяй і некалькімі правіламі на дакумент. +--- + +# Дадаць пазнакі старонак + +Пазнакі старонак вызначаюць, як нумары старонак паказваюцца ў праграмах прагляду PDF (нумар на панэлі інструментаў, а не надрукаваны на старонцы). Гэты інструмент дазваляе прызначаць розныя схемы пазначэння розным дыяпазонам старонак: рымскія лічбы для ўступнай часткі, дзесятковыя лікі для асноўнага тэксту, літарныя дадаткі і іншае. + +## Як гэта працуе + +1. Загрузіце PDF-файл. +2. З'явіцца панэль параметраў з адным правілам па змаўчанні. +3. Наладзьце кожнае правіла: дыяпазон старонак, стыль, неабавязковы прэфікс і пачатковае значэнне. +4. Націсніце **Дадаць правіла**, каб стварыць дадатковыя правілы для іншых раздзелаў. +5. Націсніце **Дадаць пазнакі старонак**, каб прымяніць усе правілы і спампаваць вынік. + +## Параметры + +Кожнае правіла мае такія налады: + +- **Дыяпазон старонак**: да якіх старонак ужываецца правіла. Пакіньце пустым для ўсіх старонак. Падтрымліваюцца дыяпазоны накшталт `1-4`, `7`, `odd` або `1-9,30-40`. +- **Стыль пазнакі**: дзесятковыя арабскія, малыя рымскія (i, ii, iii), вялікія рымскія (I, II, III), малыя літары (a, b, c), вялікія літары (A, B, C) або без пазнакі (толькі прэфікс). +- **Прэфікс пазнакі**: неабавязковы тэкст перад кожнай пазнакай, напрыклад "A-", каб атрымаць пазнакі A-1, A-2, A-3. +- **Пачатковае значэнне**: лік, з якога пачынаецца адлік. Па змаўчанні 1. Устанавіце 0 для нумарацыі з нуля. +- **Працягваць нумарацыю праз несумежныя дыяпазоны**: уключыце, калі правіла ахоплівае несумежныя старонкі (напрыклад, `1-9,30-40` або `odd`) і вы хочаце, каб нумарацыя ішла паслядоўна. +- **Выдаліць існуючыя пазнакі старонак**: уключана па змаўчанні. Ачышчае папярэднія пазнакі перад прымяненнем новых правілаў. + +## Магчымасці + +- Некалькі правілаў на дакумент для складаных схем нумарацыі +- Шэсць стыляў пазнак, якія ахопліваюць усе стандартныя сістэмы нумарацыі +- Падтрымка ўласных прэфіксаў для пазначэння па раздзелах +- Падтрымка несумежных дыяпазонаў з паслядоўнай нумарацыяй +- Магчымасць захаваць або выдаліць існуючыя пазнакі + +## Сцэнарыі выкарыстання + +- Рымскія пазнакі (i, ii, iii) для прадмовы кнігі і дзесятковыя для асноўнага тэксту +- Пазначэнне старонак дадаткаў літарнымі прэфіксамі, напрыклад "A-1", "A-2", "B-1", "B-2" +- Выпраўленне пазнак у сканаваным дакуменце, дзе фізічныя нумары старонак не адпавядаюць парадку старонак PDF +- Нумарацыя з нуля для тэхнічных дакументаў + +## Парады + +- Пазнакі старонак з'яўляюцца метаданымі, якія праграмы прагляду PDF паказваюць на панэлі навігацыі. Яны не друкуюцца на самой старонцы. Для бачных нумароў выкарыстайце [Нумары старонак](./page-numbers). +- Для гэтага інструмента патрэбна наладзіць CoherentPDF (CPDF) у наладах WASM. Калі ён не наладжаны, вам прапануюць гэта зрабіць. + +## Звязаныя інструменты + +- [Нумары старонак](./page-numbers) +- [Нумарацыя Бейтса](./bates-numbering) +- [Рэдагаваць закладкі](./bookmark) diff --git a/docs/be/tools/add-stamps.md b/docs/be/tools/add-stamps.md new file mode 100644 index 00000000..dce85b1a --- /dev/null +++ b/docs/be/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Дадаць штампы +description: Дадавайце штампы-выявы на старонкі PDF з дапамогай убудаванай панэлі анатацый з подпісам імя карыстальніка. +--- + +# Дадаць штампы + +Размяшчайце штампы-выявы на старонках PDF ва ўбудаваным праглядальніку з панэллю анатацый для штампаў. Штампы могуць змяшчаць ваша імя, што карысна для працэсаў зацвярджэння, рэцэнзавання і пазначэння дакументаў. + +## Як гэта працуе + +1. Увядзіце сваё імя ў поле **Імя карыстальніка для штампа**. Гэта імя будзе на створаных вамі штампах. +2. Загрузіце PDF-файл, націснуўшы на вобласць загрузкі або перацягнуўшы яго туды. +3. Адкрыецца рэдактар штампаў з вашым дакументам у праглядальніку. +4. Выкарыстайце інструмент штампа-выявы на панэлі, каб выбраць і размясціць штампы на любой старонцы. +5. Пры неабходнасці змяніце размяшчэнне і памер штампаў. +6. Націсніце **Захаваць PDF са штампамі**, каб спампаваць вынік. + +## Магчымасці + +- Убудаваны праглядальнік PDF з панэллю анатацый для штампаў +- Подпіс імя карыстальніка на створаных штампах +- Размяшчэнне штампаў-выяў на любой старонцы +- Размяшчэнне і змена памеру перацягваннем +- Аўтаматычны памер праглядальніка паводле прапорцый старонкі +- Паказ файла з назвай і памерам + +## Сцэнарыі выкарыстання + +- Даданне штампаў "APPROVED" або "REVIEWED" да дакументаў у працэсе рэцэнзавання +- Размяшчэнне выяў пячаткі кампаніі або натарыуса на афіцыйных дакументах +- Пазначэнне старонак штампам "RECEIVED" з імем рэцэнзента +- Даданне штампаў кантролю якасці да справаздач аб праверцы + +## Парады + +- Задайце імя карыстальніка для штампа перад загрузкай PDF. Імя ўбудоўваецца ў метаданыя штампа. +- Праглядальнік падладжвае сваю вышыню пад прапорцыі першай старонкі PDF для зручнага прагляду. +- Для тэкставых вадзяных знакаў замест штампаў-выяў выкарыстайце інструмент [Дадаць вадзяны знак](./add-watermark). + +## Звязаныя інструменты + +- [Падпісаць PDF](./sign-pdf) +- [Дадаць вадзяны знак](./add-watermark) +- [Рэдактар PDF](./edit-pdf) diff --git a/docs/be/tools/add-watermark.md b/docs/be/tools/add-watermark.md new file mode 100644 index 00000000..964cac8e --- /dev/null +++ b/docs/be/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Дадаць вадзяны знак +description: Дадавайце тэкставыя або графічныя вадзяныя знакі на старонкі PDF з дапамогай візуальнага рэдактара з перацягваннем і жывым праглядам. +--- + +# Дадаць вадзяны знак + +Дадавайце тэкставыя або графічныя вадзяныя знакі на старонкі PDF у візуальным рэдактары. Вадзяны знак можна размясціць, перацягнуўшы яго непасрэдна на праглядзе, змяніць памер вугловымі маркерамі і наладзіць непразрыстасць, паварот, шрыфт і колер. Кожная старонка можа мець сваё размяшчэнне вадзянога знака, або можна прымяніць адзін знак да ўсіх старонак адразу. + +## Як гэта працуе + +1. Загрузіце PDF-файл. +2. Адкрыецца рэдактар з жывым праглядам першай старонкі і вадзяным знакам, які можна перацягваць. +3. Выберыце рэжым **Тэкст** або **Выява** кнопкамі-пераключальнікамі. +4. Наладзьце параметры вадзянога знака на бакавой панэлі. +5. Перацягніце вадзяны знак на праглядзе туды, дзе ён патрэбен. Выкарыстайце вугловыя маркеры для змены памеру. +6. Пераходзьце паміж старонкамі, каб задаць вадзяныя знакі для кожнай, або пакіньце ўключаным **Прымяніць да ўсіх старонак**. +7. Націсніце **Дадаць вадзяны знак**, каб апрацаваць і спампаваць. + +## Параметры + +**Налады тэкставага вадзянога знака:** + +- **Тэкст**: тэкст вадзянога знака (напрыклад, "КАНФІДЭНЦЫЙНА", "ЧАРНАВІК"). +- **Памер шрыфту**: ад 10 да 200 пунктаў. Па змаўчанні 72. +- **Колер**: любы колер праз палітру. +- **Непразрыстасць**: ад цалкам празрыстага да цалкам непразрыстага. +- **Паварот**: паварот тэксту ад -180 да 180 градусаў. + +**Налады графічнага вадзянога знака:** + +- **Загрузка выявы**: загрузіце PNG, JPG або іншую выяву для вадзянога знака. +- **Непразрыстасць**: празрыстасць выявы. +- **Маштаб**: змена памеру графічнага вадзянога знака. + +**Налады размяшчэння:** + +- **Адзіночны**: адзін вадзяны знак на старонку, размешчаны перацягваннем або з дапамогай гатовых пазіцый. +- **Плітка**: паўтарае вадзяны знак па ўсёй старонцы дыяганальнай сеткай, якая адпавядае куту павароту, так што знак пакрывае дакумент ад краю да краю. +- **Гарызантальны прамежак**: адлегласць паміж пліткамі ўздоўж напрамку тэксту ў працэнтах ад шырыні вадзянога знака (толькі ў рэжыме пліткі). +- **Вертыкальны прамежак**: адлегласць паміж радамі плітак у працэнтах ад вышыні вадзянога знака (толькі ў рэжыме пліткі). + +**Агульныя налады:** + +- **Прымяніць да ўсіх старонак**: калі ўключана, адзін вадзяны знак ужываецца да кожнай старонкі. Адключыце, каб задаць асобныя знакі для кожнай старонкі. +- **Дыяпазон старонак**: якія старонкі атрымаюць вадзяны знак (напрыклад, "1-3, 5, 7-9" або "all"). + +## Магчымасці + +- Візуальнае размяшчэнне перацягваннем на жывым праглядзе PDF +- Змена памеру вадзянога знака вугловымі маркерамі +- Рэжымы тэкставага і графічнага вадзянога знака +- Адзіночнае або плітачнае (паўторнае) размяшчэнне на ўсю старонку з наладжвальнымі прамежкамі +- Вадзяныя знакі для кожнай старонкі асобна або для ўсіх +- Пастаронкавая навігацыя ў праглядзе +- Кіраванне непразрыстасцю і паваротам +- Фільтр па дыяпазоне старонак + +## Сцэнарыі выкарыстання + +- Пазначэнне чарнавікоў знакам "ЧАРНАВІК" перад рассылкай на рэцэнзію +- Даданне вадзяных знакаў "КАНФІДЭНЦЫЙНА" да канфідэнцыйных фінансавых справаздач +- Брэндынг дакументаў графічным вадзяным знакам з лагатыпам кампаніі +- Пазначэнне "SAMPLE" на дакументацыі прадукту для патэнцыйных кліентаў +- Даданне апавяшчэнняў аб аўтарскім праве да распаўсюджваных PDF-матэрыялаў + +## Парады + +- Для дыяганальных вадзяных знакаў задайце паварот каля 45 градусаў і павялічце памер шрыфту. +- Рэжым пліткі значна ўскладняе паўторнае выкарыстанне дакумента пасля абрэзкі, бо выдаленне аднаго знака пакідае дзясяткі іншых. Пры плітцы паменшыце непразрыстасць, каб тэкст пад знакам заставаўся чытэльным. +- Графічныя вадзяныя знакі з празрыстым фонам (фармат PNG) больш натуральна спалучаюцца са зместам дакумента. +- Калі патрэбны розны тэкст вадзянога знака на розных старонках, адключыце "Прымяніць да ўсіх старонак" і праходзьце старонку за старонкай. + +## Звязаныя інструменты + +- [Верхні і ніжні калантытулы](./header-footer) +- [Дадаць штампы](./add-stamps) +- [Нумарацыя Бейтса](./bates-numbering) +- [Падпісаць PDF](./sign-pdf) diff --git a/docs/be/tools/adjust-colors.md b/docs/be/tools/adjust-colors.md new file mode 100644 index 00000000..517bd03a --- /dev/null +++ b/docs/be/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Наладзіць колеры +description: Тонка наладжвайце яркасць, кантраст, насычанасць, адценне, тэмпературу, тон, гаму і сэпію ў PDF. +--- + +# Наладзіць колеры + +Поўны набор інструментаў каляровай карэкцыі для PDF. Наладжвайце восем незалежных параметраў (яркасць, кантраст, насычанасць, зрух адцення, тэмпературу, тон, гаму і сэпію) з жывым праглядам, які абнаўляецца пры руху кожнага паўзунка. + +## Як гэта працуе + +1. Загрузіце PDF-файл. +2. Адкрыецца рэдактар з праглядам першай старонкі і панэллю налад колеру. +3. Рухайце паўзункі, каб наладзіць кожны параметр. Прагляд абнаўляецца ў рэальным часе. +4. Націсніце **Скінуць**, каб вярнуць усе паўзункі ў пачатковае становішча. +5. Націсніце **Прымяніць**, каб апрацаваць усе старонкі і спампаваць зменены PDF. + +## Параметры + +- **Яркасць**: асвятліць або зацямніць усю старонку (ад -100 да +100). +- **Кантраст**: павялічыць або паменшыць розніцу паміж светлымі і цёмнымі ўчасткамі (ад -100 да +100). +- **Насычанасць**: узмацніць або аслабіць інтэнсіўнасць колераў (ад -100 да +100). Значэнне -100 дае адценні шэрага. +- **Зрух адцення**: паварочвае каляровае кола, раўнамерна зрушваючы ўсе колеры. +- **Тэмпература**: робіць колеры цяплейшымі (жоўты/аранжавы) або халаднейшымі (сіні). +- **Тон**: дадае зялёны або пурпурны адцянак. +- **Гама**: наладжвае яркасць сярэдніх тонаў з дапамогай крывой гамы. Значэнні ніжэй за 1.0 зацямняюць сярэднія тоны, вышэй за 1.0 асвятляюць іх. +- **Сэпія**: прымяняе класічны эфект сэпіі. Большыя значэнні даюць мацнейшы карычневы адцянак. + +## Магчымасці + +- Восем незалежна наладжвальных параметраў колеру +- Жывы прагляд, які адразу рэагуе на змены паўзункоў +- Кнопка скіду для хуткага вяртання да значэнняў па змаўчанні +- Апрацоўка ўсіх старонак дакумента +- Працуе з любым змесцівам PDF (тэкст, выявы, графіка) + +## Сцэнарыі выкарыстання + +- Асвятленне цёмнага скана або выпраўленне перасветленых старонак +- Зніжэнне насычанасці каляровага дакумента, каб зэканоміць чарніла пры друку +- Эфект сэпіі для старадаўняга выгляду сертыфікатаў або ўзнагарод +- Выпраўленне каляровай тэмпературы фотаздымкаў, убудаваных у PDF +- Павышэнне кантрасту выцвілых або няякасных сканаваных дакументаў + +## Парады + +- Для хуткага пераўтварэння ў адценні шэрага перацягніце паўзунок насычанасці да -100. +- Паўзунок гамы асабліва карысны для паляпшэння чытэльнасці сканаваных дакументаў, дзе сярэднія тоны занадта цёмныя або светлыя. +- Як і іншыя інструменты эфектаў выяў, гэты растравае кожную старонку. Вынік будзе складацца з выяў, таму тэкст нельга будзе вылучыць. + +## Звязаныя інструменты + +- [Інвертаваць колеры](./invert-colors) +- [Эфект сканера](./scanner-effect) +- [Колер фону](./background-color) diff --git a/docs/be/tools/alternate-merge.md b/docs/be/tools/alternate-merge.md new file mode 100644 index 00000000..65471b5b --- /dev/null +++ b/docs/be/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Чаргаваць і змяшаць старонкі +description: Аб'ядноўвайце PDF, чаргуючы старонкі з кожнага файла, з захаваннем закладак. +--- + +# Чаргаваць і змяшаць старонкі + +Перамяжоўвайце старонкі з некалькіх PDF-файлаў так, каб яны чаргаваліся паміж дакументамі. Гэты інструмент патрэбен, калі звычайнае аб'яднанне проста дадало б файлы адзін за адным, а вам трэба старонка 1 файла A, потым старонка 1 файла B, потым старонка 2 файла A і гэтак далей. + +## Як гэта працуе + +1. Загрузіце як мінімум два PDF-файлы праз вобласць загрузкі. +2. Інструмент пакажа кожны файл з колькасцю старонак і памерам. +3. Перацягвайце за маркеры, каб змяніць, старонкі якога файла ідуць першымі ў паслядоўнасці. +4. Націсніце **Змяшаць старонкі**, каб атрымаць вынік. +5. Вынік спампуецца як `alternated-mixed.pdf`. + +## Магчымасці + +- Чаргаванне старонак любой колькасці PDF (мінімум два) +- Змена парадку файлаў перацягваннем для кіравання прыярытэтам чаргавання +- Захаванне закладак з зыходных дакументаў +- Паказ колькасці старонак і памеру кожнага загружанага файла +- Апрацоўка ў асобным web worker для спагаднага інтэрфейсу + +## Сцэнарыі выкарыстання + +- Зборка двухбаковых сканаў, дзе няцотныя і цотныя старонкі сканаваліся асобна +- Спалучэнне аркушаў з пытаннямі і адказаў, каб пасля кожнага пытання ішоў адказ +- Пастаронкавае аб'яднанне двухмоўных дакументаў (напрыклад, англійская на адной старонцы, пераклад на наступнай) +- Чаргаванне сканаў пярэдняга і адваротнага бакоў з аднабаковага сканера + +## Парады + +- Калі ў зыходных PDF розная колькасць старонак, старонкі карацейшага дакумента скончацца раней, а астатнія старонкі даўжэйшага з'явяцца ў канцы. +- Парадак файлаў важны: першы файл у спісе дае першую старонку выніку. Пры неабходнасці перацягніце, каб змяніць парадак. + +## Звязаныя інструменты + +- [Аб'яднаць PDF](./merge-pdf) +- [Упарадкаваць і дубляваць](./organize-pdf) +- [Падзяліць PDF](./split-pdf) diff --git a/docs/be/tools/background-color.md b/docs/be/tools/background-color.md new file mode 100644 index 00000000..fed61ff0 --- /dev/null +++ b/docs/be/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Колер фону +description: Змяняйце колер фону кожнай старонкі PDF з захаваннем усяго змесціва зверху. +--- + +# Колер фону + +Задайце суцэльны колер фону пад усім існуючым змесцівам PDF. Інструмент стварае каляровы прамавугольнік на кожнай старонцы і накладае зверху зыходнае змесціва, таму тэкст, выявы і графіка застаюцца цалкам бачнымі на новым фоне. + +## Як гэта працуе + +1. Загрузіце PDF-файл. +2. Выберыце колер фону ў палітры. Па змаўчанні светла-жоўты (#FFFFCC). +3. Націсніце **Змяніць колер фону**, каб апрацаваць. +4. Абноўлены PDF спампуецца аўтаматычна. + +## Параметры + +- **Колер фону**: стандартная палітра для выбару любога суцэльнага колеру. Па змаўчанні светла-жоўты. + +## Магчымасці + +- Аднолькавы колер фону на кожнай старонцы +- Захаванне ўсяго зыходнага змесціва (тэкст, выявы, вектарная графіка) над каляровым слоем +- Захаванне зыходных памераў старонак +- Працуе з дакументамі любой колькасці старонак + +## Сцэнарыі выкарыстання + +- Светла-крэмавы або слановай косці фон, каб надаць дакументам мякчэйшы выгляд, падобны да паперы +- Каляровае кадзіраванне камплектаў дакументаў рознымі фонамі для розных катэгорый +- Стварэнне візуальна адрозных версій аднаго дакумента для розных аўдыторый +- Лёгкі адценне фону для лепшай чытэльнасці пры праекцыі дакументаў на экран + +## Парады + +- Лепш за ўсё падыходзяць светлыя, прыглушаныя колеры. Вельмі цёмны фон можа зрабіць тэкст цяжкім для чытання, калі тэкст не светлы. +- Калі трэба змяніць і фон, і колер тэксту, спачатку прымяніце колер фону, а потым выкарыстайце [Змяніць колер тэксту](./text-color) для выніку. +- Інструмент працуе на ўзроўні структуры PDF (без растравання), таму тэкст у выніку застаецца даступным для вылучэння і пошуку. + +## Звязаныя інструменты + +- [Змяніць колер тэксту](./text-color) +- [Інвертаваць колеры](./invert-colors) +- [Наладзіць колеры](./adjust-colors) diff --git a/docs/be/tools/bates-numbering.md b/docs/be/tools/bates-numbering.md new file mode 100644 index 00000000..71abb6f4 --- /dev/null +++ b/docs/be/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Нумарацыя Бейтса +description: Дадавайце нумары Бейтса да аднаго або некалькіх PDF з наладжвальнымі шаблонамі, дапаўненнем нулямі, шрыфтамі і размяшчэннем. +--- + +# Нумарацыя Бейтса + +Нумарацыя Бейтса праштампоўвае паслядоўныя ідэнтыфікатары на кожнай старонцы PDF. Гэта стандартны спосаб пазначэння дакументаў у судовых працэсах, аўдытах і працэсах адпаведнасці патрабаванням. Інструмент падтрымлівае некалькі файлаў і наладжвальныя шаблоны і стварае асобна пранумараваныя PDF або адзін ZIP-архіў. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі PDF-файлаў. Можна перацягнуць некалькі файлаў адразу. +2. Выберыце гатовы стыль або стварыце ўласны шаблон. +3. Наладзьце размяшчэнне, шрыфт, памер, колер і пачатковыя нумары. +4. Націсніце **Прымяніць нумары Бейтса**, каб апрацаваць. +5. Адзін файл спампуецца непасрэдна. Некалькі файлаў спампуюцца як ZIP-архіў. + +## Параметры + +- **Гатовы стыль**: выберыце адзін з убудаваных фарматаў: + - Доказ + Справа + Бейтс + Старонка (напрыклад, "Exhibit 1 Case XYZ 000001 Page 1") + - Доказ + Справа + Бейтс (без нумара старонкі) + - Справа + Бейтс + - Толькі нумар Бейтса (напрыклад, "000001") + - Уласны (напішыце свой шаблон) +- **Наладзіць стыль**: радок шаблону з запаўняльнікамі: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Дапаўненне Бейтса**: колькасць лічбаў (ад 3 да 6) для нумароў Бейтса з вядучымі нулямі. Бачна толькі ва ўласным рэжыме. +- **Размяшчэнне**: верхні або ніжні калантытул, злева, па цэнтры або справа. +- **Бейтс пачынаецца з**: першы нумар Бейтса. Па змаўчанні 1. Нумарацыя працягваецца паміж файламі. +- **Лічыльнік файлаў пачынаецца з**: пачатковы нумар для запаўняльніка `[FILE]`. +- **Шрыфт**: Helvetica, Times New Roman або Courier. +- **Памер шрыфту**: памер праштампаванага тэксту. +- **Колер**: палітра для колеру тэксту нумара Бейтса. + +## Магчымасці + +- Жывы прагляд таго, як нумары Бейтса будуць выглядаць ва ўсіх загружаных файлах +- Падтрымка некалькіх файлаў з бесперапыннай нумарацыяй паміж дакументамі +- Змена парадку файлаў перацягваннем для кіравання паслядоўнасцю нумарацыі +- Шэсць варыянтаў размяшчэння (верхні/ніжні калантытул, злева/па цэнтры/справа) +- Адаптыўны разлік палёў з улікам розных памераў старонак +- Вынік у ZIP для пакетаў з некалькіх файлаў +- Запаўняльнікі шаблону для максімальнай гнуткасці + +## Сцэнарыі выкарыстання + +- Штампаванне дакументаў для судовага разбору паслядоўнымі нумарамі доказаў +- Нумарацыя пакетаў аўдытарскіх доказаў з дзясяткаў файлаў +- Нанясенне рэгулятарных даведачных нумароў на дакументацыю адпаведнасці +- Пазначэнне дадаткаў да патэнтавых заявак ідэнтыфікатарамі справы + +## Парады + +- Перацягвайце файлы ў спісе, каб змяніць іх парадак перад апрацоўкай. Паслядоўнасць нумарацыі Бейтса ідзе ў гэтым парадку. +- Выкарыстайце запаўняльнік `[FILENAME]`, каб уключыць у штамп зыходную назву файла: гэта дапамагае адсочваць старонкі да зыходных дакументаў. +- Акно прагляду абнаўляецца ў рэальным часе пры змене налад, таму фармат можна праверыць перад апрацоўкай. + +## Звязаныя інструменты + +- [Нумары старонак](./page-numbers) +- [Дадаць пазнакі старонак](./add-page-labels) +- [Верхні і ніжні калантытулы](./header-footer) diff --git a/docs/be/tools/bmp-to-pdf.md b/docs/be/tools/bmp-to-pdf.md new file mode 100644 index 00000000..2b25ec0a --- /dev/null +++ b/docs/be/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP у PDF +description: Пераўтварайце растравыя выявы BMP у фармат PDF непасрэдна ў браўзеры, без загрузкі на сервер. +--- + +# BMP у PDF + +Пераўтварайце файлы Windows Bitmap (BMP) у PDF. BMP: гэта нясціснуты фармат выяў, які дагэтуль сустракаецца ў састарэлых сістэмах, медыцынскай візуалізацыі і прамысловых сканерах. Інструмент пераўтварае іх у PDF без усталявання чаго-небудзь. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------- | +| BMP | `.bmp` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце туды файлы BMP. +2. Праверце спіс файлаў. Дадайце яшчэ файлы або выдаліце непатрэбныя. +3. Націсніце **Пераўтварыць у PDF**. Вынік спампуецца як `from_bmps.pdf`. + +Кожны BMP малюецца на canvas, экспартуецца як PNG і затым убудоўваецца ў PDF з дапамогай pdf-lib. Памер старонкі адпавядае памерам зыходнай выявы. + +## Параметры + +Інструмент не мае дадатковых налад якасці. Выявы ўбудоўваюцца ў PDF у зыходным раздзяленні як PNG без страт. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне састарэлых сканаваных дакументаў у BMP у архіўныя PDF +- Ператварэнне скрыншотаў BMP са старых праграм Windows у дакументы для абмену +- Апрацоўка выніку медыцынскіх або прамысловых сканераў, якія па змаўчанні захоўваюць BMP +- Перанос старых архіваў выяў у больш партатыўны фармат + +## Парады + +- Файлы BMP не сціснутыя, таму звычайна вялікія. Выніковы PDF будзе значна меншым, бо выявы ўнутры перакадуюцца ў PNG. +- Калі ў вас ёсць BMP разам з выявамі іншых фарматаў, выкарыстайце інструмент [Выявы ў PDF](./image-to-pdf), каб пераўтварыць усё адным пакетам. + +## Звязаныя інструменты + +- [Выявы ў PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [TIFF у PDF](./tiff-to-pdf) diff --git a/docs/be/tools/bookmark.md b/docs/be/tools/bookmark.md new file mode 100644 index 00000000..4bfbfb14 --- /dev/null +++ b/docs/be/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Рэдагаваць закладкі +description: Дадавайце, рэдагуйце, імпартуйце, экспартуйце і выдаляйце закладкі PDF з дапамогай візуальнага рэдактара і падтрымкі CSV/JSON. +--- + +# Рэдагаваць закладкі + +Рэдактар закладак дае поўны кантроль над навігацыйнымі закладкамі PDF (іх таксама называюць структурай дакумента). Вы можаце дадаваць новыя закладкі, рэдагаваць існуючыя, перабудоўваць іерархію, а таксама імпартаваць і экспартаваць даныя закладак у фарматах CSV і JSON. + +## Як гэта працуе + +1. Загрузіце PDF: націсніце на вобласць загрузкі або перацягніце ў яе файл. +2. Пры жаданні адзначце **Аўтаматычна выняць існуючыя закладкі**, каб падцягнуць бягучае дрэва закладак дакумента. +3. Рэдактар адкрываецца ў падзеленым выглядзе: праглядальнік PDF злева, панэль закладак справа. +4. Увядзіце назву закладкі і націсніце **Дадаць на старонку**, каб стварыць закладку на бягучую старонку. +5. Карыстайцеся кнопкамі панэлі інструментаў, каб пераўпарадкоўваць, афармляць або выдаляць закладкі. +6. Націсніце **Захаваць PDF з закладкамі**, каб спампаваць абноўлены файл. + +## Магчымасці + +- Візуальны праглядальнік PDF з навігацыяй па старонках, маштабаваннем і полем пераходу да старонкі +- Дадаванне закладак на любую старонку адным націскам +- Націск непасрэдна на PDF, каб дакладна задаць месца закладкі (рэжым выбару) +- Укладзеная іерархія закладак з пераўпарадкаваннем перацягваннем +- Пакетныя аперацыі: выбірайце некалькі закладак, каб адразу змяніць колер, стыль або выдаліць іх +- Пошук закладак, каб хутка знаходзіць запісы ў вялікіх дрэвах +- Адмена і паўтор для ўсіх змен +- Імпарт закладак з CSV (назва, старонка, узровень) або файлаў JSON +- Экспарт закладак у CSV або JSON для знешняга рэдагавання +- Афармленне закладак: колер (чырвоны, сіні, зялёны, жоўты, фіялетавы) і стыль шрыфту (тоўсты, курсіў, тоўсты курсіў) +- Хуткая навігацыя: гартанне старонак клавішамі Page Up/Page Down + +## Параметры + +- **Аўтаматычна выняць існуючыя закладкі**: калі адзначана, інструмент пры загрузцы чытае і паказвае бягучыя закладкі PDF. +- **Пакетны рэжым**: дазваляе выбраць некалькі закладак і масава змяніць колер, стыль або выдаліць іх. +- **Разгарнуць/Згарнуць усё**: хутка паказвае або хавае ўкладзеныя закладкі. + +## Сцэнарыі выкарыстання + +- Дадаванне зместу ў падручнік або дапаможнік без закладак +- Перабудова закладак у сканаваным дакуменце пасля OCR +- Экспарт закладак у CSV, рэдагаванне ў электроннай табліцы і паўторны імпарт +- Выпраўленне аўтаматычна створаных закладак з няправільнымі спасылкамі на старонкі +- Дадаванне каляровых закладак для вылучэння важных раздзелаў юрыдычнага дакумента + +## Парады + +- Для масавага стварэння закладак карыстайцеся імпартам CSV. Фармат просты: `title,page,level`, дзе ўзровень 1 азначае верхні ўзровень. +- Рэжым выбару дазваляе націснуць на дакладнае месца на старонцы PDF, каб задаць пункт прызначэння закладкі, што дакладней за проста нумар старонкі. +- Перад буйнымі зменамі экспартуйце закладкі, каб мець рэзервовую копію. + +## Звязаныя інструменты + +- [Змест](./table-of-contents) +- [Рэдактар PDF](./edit-pdf) +- [Дадаць пазнакі старонак](./add-page-labels) diff --git a/docs/be/tools/cbz-to-pdf.md b/docs/be/tools/cbz-to-pdf.md new file mode 100644 index 00000000..be592d54 --- /dev/null +++ b/docs/be/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ у PDF +description: Пераўтварайце архівы коміксаў CBZ і CBR у PDF у браўзеры. Бясплатна, прыватна, без загрузкі на сервер. +--- + +# CBZ у PDF + +Ператварайце архівы коміксаў у PDF. CBZ і CBR з'яўляюцца стандартнымі фарматамі лічбавых коміксаў: гэта проста архівы ZIP або RAR з відарысамі. Інструмент вымае кожную старонку, захоўвае парадак чытання і стварае акуратны PDF, дзе кожны відарыс становіцца поўнапамернай старонкай. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----- | :-------- | :-------------------------------------------------------------- | +| CBZ | `.cbz` | Архіў коміксаў на аснове ZIP (апрацоўваецца лакальна з pdf-lib) | +| CBR | `.cbr` | Архіў коміксаў на аснове RAR (апрацоўваецца рухавіком PyMuPDF) | + +Канвертар CBZ распазнае ўнутры архіва відарысы JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC і JXL. Нестандартныя фарматы перад устаўкай аўтаматычна пераўтвараюцца ў PNG. + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы CBZ ці CBR. Можна змешваць абодва фарматы ў адным пакеце. +2. Праверце спіс файлаў. Выдаліце непатрэбныя або націсніце **Дадаць файлы**, каб дадаць яшчэ. +3. Націсніце **Пераўтварыць у PDF**. Для файлаў CBZ інструмент распакоўвае архіў, сартуе відарысы па назве ў натуральным парадку, вызначае сапраўдны фармат кожнага відарыса і ўстаўляе іх у PDF з дапамогай pdf-lib. Файлы CBR замест гэтага апрацоўваюцца рухавіком PyMuPDF. +4. Адзін файл спампоўваецца як PDF. Некалькі файлаў даюць архіў ZIP з назвай `comic-converted.zip`. + +## Параметры + +Налады не патрэбныя. Кожны відарыс становіцца старонкай памерам з арыгінал, таму развароты застаюцца шырокімі, а асобныя старонкі вузкімі. + +## Сцэнарыі выкарыстання + +- Чытанне коміксаў на планшэце або ў праграме на тэлефоне, якая падтрымлівае PDF, але не CBZ/CBR +- Друк асобных старонак лічбавага комікса +- Архіваванне калекцыі коміксаў у фармаце, які адкрые любы праглядальнік +- Абмен коміксам з тым, у каго няма спецыяльнай праграмы для чытання коміксаў + +## Парады + +- Відарысы ў архіве сартуюцца ў натуральным парадку (таму `page2.jpg` ідзе перад `page10.jpg`). Называйце файлы з паслядоўнай нумарацыяй, каб старонкі ішлі правільна. +- Канвертар вызначае фармат відарысаў па іх двайковых сігнатурах, а не па пашырэннях. PNG, выпадкова названы `.jpg`, усё роўна ўставіцца правільна. +- Файлы CBZ цалкам апрацоўваюцца ў браўзеры без загрузкі рухавіка PyMuPDF, таму яны пераўтвараюцца хутчэй за файлы CBR. + +## Звязаныя інструменты + +- [EPUB у PDF](./epub-to-pdf) +- [MOBI у PDF](./mobi-to-pdf) +- [Відарысы ў PDF](./image-to-pdf) diff --git a/docs/be/tools/change-permissions.md b/docs/be/tools/change-permissions.md new file mode 100644 index 00000000..aeef7b22 --- /dev/null +++ b/docs/be/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Змяніць дазволы +description: Задавайце або змяняйце дазволы PDF на друк, капіраванне, рэдагаванне і анатаванне. Выкарыстоўваецца 256-бітнае шыфраванне AES. +--- + +# Змяніць дазволы + +Дакладна вызначайце, што атрымальнікі могуць рабіць з вашым PDF. У адрозненне ад простага шыфравання, якое толькі закрывае файл паролем, гэты інструмент дазваляе выбарачна дазваляць або забараняць друк, капіраванне, рэдагаванне, анатаванне, запаўненне форм, зборку дакумента і выманне старонак, і ўсё гэта забяспечваецца 256-бітным шыфраваннем AES. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Калі PDF ужо зашыфраваны, увядзіце **Бягучы пароль**. +3. Задайце **Новы пароль карыстальніка** (патрэбны для адкрыцця) і/або **Новы пароль уладальніка** (кіруе дазволамі). +4. Уключайце або выключайце асобныя дазволы сцяжкамі. +5. Націсніце **Змяніць дазволы**. +6. Спампуйце абноўлены PDF. + +Калі пакінуць абодва палі новых пароляў пустымі, інструмент цалкам расшыфроўвае PDF і выдаляе ўсё шыфраванне і абмежаванні. + +## Кіраванне дазволамі + +| Дазвол | Што кантралюе | +| ------------------------------ | ----------------------------------------------------- | +| **Дазволіць друк** | Ці можна раздрукаваць дакумент | +| **Дазволіць капіраванне** | Ці можна вылучаць і капіраваць тэкст і відарысы | +| **Дазволіць змяненне** | Ці можна рэдагаваць змесціва дакумента | +| **Дазволіць анатаванне** | Ці можна дадаваць каментарыі, вылучэнні і штампы | +| **Дазволіць запаўненне форм** | Ці можна запаўняць інтэрактыўныя палі формы | +| **Дазволіць зборку дакумента** | Ці можна ўстаўляць, выдаляць або паварочваць старонкі | +| **Дазволіць выманне старонак** | Ці можна вымаць асобныя старонкі | + +Каб дазволы дзейнічалі, патрэбны пароль уладальніка. Без яго большасць праграм для чытання PDF ігнаруе сцяжкі дазволаў. + +## Як працуюць дазволы ў PDF + +Дазволы PDF з'яўляюцца часткай спецыфікацыі шыфравання. Яны захоўваюцца як бітавыя сцяжкі ў слоўніку шыфравання, і іх выконваюць сумяшчальныя праграмы для чытання PDF. Галоўнае адрозненне: + +- **Пароль карыстальніка**: патрэбны, каб наогул адкрыць файл. +- **Пароль уладальніка**: патрэбны, каб змяніць дазволы або зняць абмежаванні. Без яго сцяжкі дазволаў вызначаюць, якія аперацыі можа выконваць карыстальнік. + +Калі задаць толькі пароль уладальніка (без пароля карыстальніка), любы можа адкрыць файл, але будзе абмежаваны дазволенымі аперацыямі. Калі задаць абодва, файл патрабуе пароль для адкрыцця і застаецца абмежаваным пасля аўтэнтыфікацыі. + +## Сцэнарыі выкарыстання + +- Распаўсюджванне справаздачы, якую можна праглядаць і друкаваць, але нельга рэдагаваць або капіраваць +- Абмен шаблонам дагавора, які атрымальнікі могуць запоўніць, але не змяніць +- Публікацыя каталога PDF з забаронай капіравання відарысаў +- Дазвол анатавання ў чарнавіку для рэцэнзавання з забаронай структурных змен + +## Парады + +- Каб дазволы дзейнічалі, заўсёды задавайце пароль уладальніка. Без яго дазволы немагчыма забяспечыць. +- Некаторыя іншыя інструменты PDF ігнаруюць сцяжкі дазволаў. Для мацнейшай абароны разгледзьце растарызацыю PDF або DRM. +- Карыстайцеся гэтым інструментам, каб абнавіць старыя PDF з шыфраваннем RC4 да AES-256. + +## Звязаныя інструменты + +- [Зашыфраваць PDF](./protect-pdf): простая абарона паролем без дэталёвых дазволаў +- [Расшыфраваць PDF](./unlock-pdf): поўнае выдаленне шыфравання +- [Выдаліць абмежаванні](./remove-restrictions): зняцце ўсіх абмежаванняў, калі ў вас ёсць пароль уладальніка diff --git a/docs/be/tools/combine-single-page.md b/docs/be/tools/combine-single-page.md new file mode 100644 index 00000000..8c00b16a --- /dev/null +++ b/docs/be/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Аб'яднаць у адну старонку +description: Злучайце ўсе старонкі PDF у адну бесперапынную вертыкальную або гарызантальную стужку. +--- + +# Аб'яднаць у адну старонку + +Аб'ядноўвайце ўсе старонкі PDF у адну доўгую старонку. Старонкі злучаюцца вертыкальна (як скрутак) або гарызантальна (побач), і ў выніку атрымліваецца адна бесперапынная старонка. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Выберыце напрамак размяшчэння: **Вертыкальна** (старонкі адна пад адной) або **Гарызантальна** (старонкі побач). +3. Задайце адлегласць паміж старонкамі ў пунктах. +4. Выберыце колер фону для прамежкаў паміж старонкамі. +5. Пры жаданні ўключыце раздзяляльнікі (тонкія лініі паміж старонкамі) і наладзьце іх таўшчыню і колер. +6. Націсніце кнопку апрацоўкі. У выніку атрымаецца PDF з адной старонкай. + +## Магчымасці + +- Вертыкальнае або гарызантальнае злучэнне старонак +- Настройваемая адлегласць паміж старонкамі +- Выбар колеру фону для прамежкаў +- Неабавязковыя лініі-раздзяляльнікі з наладжвальнай таўшчынёй і колерам +- Кожная арыгінальная старонка рэндэрыцца ў поўным разрозненні на агульным палатне + +## Параметры + +| Параметр | Апісанне | +| ------------------------------- | ------------------------------------------------------ | +| **Арыентацыя** | Вертыкальна (адна пад адной) або Гарызантальна (побач) | +| **Адлегласць паміж старонкамі** | Прамежак паміж старонкамі ў пунктах | +| **Колер фону** | Колер вобласці паміж старонкамі | +| **Дадаць раздзяляльнік** | Уключае тонкія лініі паміж старонкамі | +| **Таўшчыня раздзяляльніка** | Таўшчыня лініі ў пунктах | +| **Колер раздзяляльніка** | Колер ліній-раздзяляльнікаў | + +## Сцэнарыі выкарыстання + +- Стварэнне аднаго доўгага відарыса з шматстаронкавага макета або дызайн-макета +- Стварэнне бесперапыннага выгляду дакумента для ўбудавання на вэб-старонку +- Злучэнне шматстаронкавага комікса або раскадроўкі ў адну стужку +- Стварэнне панарамнага выгляду паслядоўных старонак для прагляду + +## Парады + +- Вертыкальная арыентацыя лепш падыходзіць для дакументаў з кніжнымі старонкамі. Гарызантальная лепш для альбомнага змесціва. +- Вялікія дакументы з мноствам старонак дадуць вельмі высокі або шырокі вынік. Некаторыя праглядальнікі PDF могуць не спраўляцца з надзвычай вялікімі старонкамі. +- Раздзяляльнікі кантрастнага колеру дапамагаюць убачыць, дзе заканчваецца адна арыгінальная старонка і пачынаецца наступная. + +## Звязаныя інструменты + +- [N-Up PDF](./n-up-pdf) +- [Аб'яднаць PDF](./merge-pdf) +- [Падзяліць старонкі](./divide-pages) diff --git a/docs/be/tools/compare-pdfs.md b/docs/be/tools/compare-pdfs.md new file mode 100644 index 00000000..f355f67b --- /dev/null +++ b/docs/be/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Параўнаць PDF +description: Параўноўвайце два дакументы PDF побач або ў рэжыме накладання з дэталёвым выяўленнем і класіфікацыяй змен. +--- + +# Параўнаць PDF + +Загрузіце два PDF і дакладна ўбачце, што змянілася паміж імі. Інструмент разумна супастаўляе старонкі, выяўляе адрозненні ў тэксце, відарысах, анатацыях, калантытулах і фарматаванні і паказвае іх побач або ў рэжыме накладання. + +## Як гэта працуе + +1. Загрузіце два файлы PDF: арыгінал (злева) і перагледжаную версію (справа). +2. Інструмент супастаўляе старонкі дакументаў па сігнатурах змесціва. +3. Выберыце рэжым прагляду: **Побач** або **Накладанне**. +4. Пераходзьце паміж парамі старонак з дапамогай элементаў пагінацыі. +5. Адрозненні вылучаюцца і класіфікуюцца. Карыстайцеся панэллю фільтраў, каб засяродзіцца на пэўных тыпах змен. +6. Пры жаданні экспартуйце параўнанне як справаздачу PDF. + +## Магчымасці + +- Аўтаматычнае супастаўленне старонак па падабенстве змесціва +- Рэжымы параўнання побач і накладаннем +- Класіфікацыя змен: тэкст, відарыс, калантытул, анатацыя, фарматаванне, фон +- Пераключальнікі фільтраў па катэгорыях, каб паказваць або хаваць пэўныя тыпы змен +- Пошук тэкставых змен з фільтрацыяй па запыце +- Падтрымка OCR для параўнання сканаваных дакументаў +- Маштабаванне для дэталёвага агляду +- Сінхранізаваная пракрутка панэляў у рэжыме побач +- Экспарт вынікаў параўнання ў PDF + +## Параметры + +| Параметр | Апісанне | +| --------------------- | ------------------------------------------------------------------------- | +| **Рэжым прагляду** | Побач або Накладанне | +| **OCR** | Уключыць/выключыць OCR для параўнання сканаваных дакументаў | +| **Мова OCR** | Мова для вымання тэксту з дапамогай OCR | +| **Фільтры катэгорый** | Паказ змен тэксту, відарысаў, калантытулаў, анатацый, фарматавання і фону | +| **Аб'ём змен** | У рэжыме накладання выбар паміж усімі зменамі і толькі зменамі змесціва | +| **Маштаб** | Налада павелічэння для дэталёвага агляду | + +## Сцэнарыі выкарыстання + +- Праверка рэдакцый дагавора, каб дакладна знайсці змены паміж версіямі +- Параўнанне дызайн-макетаў, каб пераканацца, што экспарт у PDF адпавядае чаканням +- Аўдыт змен дакументаў у рэгуляваных галінах, дзе трэба адсочваць кожную праўку +- Праверка, што пераўтварэнне ў PDF дакладна захавала арыгінальнае змесціва +- Параўнанне перакладзеных дакументаў з арыгіналам на прадмет змен макета + +## Парады + +- Рэжым накладання размяшчае абодва дакументы адзін на адным, таму прасторавыя адрозненні (зрушаныя элементы, змененыя відарысы) адразу бачныя. +- Уключайце OCR пры параўнанні сканаваных дакументаў без тэкставага пласта. Рухавік параўнання выме тэкст з відарысаў старонак. +- Карыстайцеся фільтрамі катэгорый, каб засяродзіцца на галоўным. Напрыклад, схавайце змены фарматавання, калі вас цікавяць толькі адрозненні ў тэксце. + +## Звязаныя інструменты + +- [Праглядзець метаданыя](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Аб'яднаць PDF](./merge-pdf) diff --git a/docs/be/tools/compress-pdf.md b/docs/be/tools/compress-pdf.md new file mode 100644 index 00000000..f7bb059e --- /dev/null +++ b/docs/be/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Сціснуць PDF +description: Памяншайце памер файла PDF да 90% з дапамогай рухавіка Hyper Compress. Падтрымліваюцца мэтавы памер файла, пакетная апрацоўка і ўласныя налады якасці. +--- + +# Сціснуць PDF + +Памяншайце файлы PDF, не псуючы іх. Інструмент «Сціснуць PDF» працуе на [Hyper Compress](https://www.bentopdf.com/hyper-compress), уласным рухавіку сціскання BentoPDF. Ён пераціскае відарысы, стварае падмноствы шрыфтоў і аб'ядноўвае іх, а таксама выдаляе лішняе, напрыклад убудаваныя мініяцюры і прыватныя даныя праграм. PDF застаецца цалкам працаздольным: тэкст можна вылучаць, спасылкі і палі форм працуюць. + +Hyper Compress скампіляваны ў WebAssembly і пастаўляецца разам з BentoPDF, таму сцісканне працуе па-за сеткай і ў ізаляваных разгортваннях без дадатковай налады. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі PDF: націсніце на вобласць загрузкі або перацягніце файлы. +2. Выберыце **Узровень сціскання**: Нізкі, Сярэдні, Высокі або Без страт. +3. Пры жаданні ўвядзіце **Мэтавы памер файла** або разгарніце **Уласныя налады** для дэталёвага кіравання, у тым ліку **Пераўтварыць у градацыі шэрага**. +4. Націсніце **Сціснуць PDF**. Для некалькіх файлаў вы атрымаеце адзін архіў ZIP. + +## Асаблівыя дакументы + +- **PDF з лічбавым подпісам** вяртаюцца без змен, бо любая змена зробіць подпіс несапраўдным. Уключыце **Абыйсці абарону змесціва** ва Уласных наладах, каб выдаліць подпісы і сціснуць такія файлы; бачны подпіс застаецца на старонцы, але файл ужо не падпісаны. +- **Файлы PDF/A** пасля сціскання губляюць пазнаку PDF/A, каб файл не заяўляў адпаведнасць, якой ужо не мае. Уключыце **Захаваць PDF/A** ва Уласных наладах, каб файл застаўся адпаведным. +- **PDF, абароненыя паролем**, атрымліваюць поле пароля на сваёй картцы файла. Увядзіце там пароль, і Hyper Compress сам адкрые файл, без асобнага кроку разблакіроўкі. Калі заблакіраваных файлаў два ці больш, адно агульнае поле разблакіруе ўсе файлы з аднолькавым паролем. Сціснутая копія не мае пароля; каб дадаць яго зноў, скарыстайцеся [Абараніць PDF](./protect-pdf). +- **Сканы без тэкставага пласта** можна сціснуць яшчэ мацней з дапамогай **Растарызаваць старонкі** ва Уласных наладах: кожная старонка замяняецца адным аптымізаваным відарысам. Гэта не выконваецца для дакументаў з тэкстам, які можна вылучыць, у тым ліку сканаў пасля OCR, калі не ўключана **Абыйсці абарону змесціва**. Тады тэкставыя старонкі таксама становяцца відарысамі, тэкст больш нельга вылучыць, а спасылкі перастаюць працаваць. + +## Узроўні сціскання + +| Узровень | Якасць відарысаў | Макс. разрозненне | Лепш для | +| ------------- | --------------------- | ----------------- | -------------------------------------- | +| **Нізкі** | 80 | 200 DPI | Захавання візуальнай якасці | +| **Сярэдні** | 50 | 150 DPI | Звычайных дакументаў | +| **Высокі** | 20 | 72 DPI | Укладанняў у ліст, загрузак у інтэрнэт | +| **Без страт** | Відарысы не змяняюцца | Без змен | Архіўных копій | + +Высокі ўзровень таксама адмяняе ўбудаванне 14 стандартных шрыфтоў PDF, а таксама падобных да іх, напрыклад Arial, калі гэта бяспечна. + +## Мэтавы памер файла + +Увядзіце памер у КБ або МБ, і Hyper Compress падбярэ найлепшую якасць відарысаў, пры якой файл усё яшчэ змяшчаецца ў гэты памер, пачынаючы з выбранага ўзроўню. Калі дакумент нельга зрабіць такім малым, вы атрымаеце найменшую магчымую версію і паведамленне пра гэта. Асобныя старонкі, напрыклад [Сціснуць PDF да 1 МБ](https://www.bentopdf.com/compress-pdf-to-1mb), адкрываюцца з ужо запоўненым мэтавым памерам. + +## Уласныя налады + +Разгарніце панэль Уласных налад, каб наладзіць Hyper Compress напрамую. Выбар узроўню сціскання скідае гэтыя налады да значэнняў узроўню, а змяненне любой з іх пераключае ўзровень на Уласны. + +- **Абыйсці абарону змесціва**: па змаўчанні Hyper Compress не чапае падпісаныя PDF і не растарызуе старонкі з тэкстам. Гэтая опцыя абыходзіць абодва абмежаванні. Яна застаецца ўключанай пры змене ўзроўню. + +- **Відарысы**: якасць відарысаў, максімальнае разрозненне, прымусовая перадыскрэтызацыя, памяншэнне колькасці колераў, абрэзка нябачных абласцей відарысаў, выдаленне альтэрнатыўных відарысаў, спрашчэнне колеравых профіляў, JPEG 2000 і рэжым без страт +- **Шрыфты**: стварэнне падмностваў, аб'яднанне дублікатаў і адмена ўбудавання стандартных шрыфтоў і падобных да іх +- **Змесціва**: звядзенне анатацый, палёў форм або спасылак +- **Ачыстка**: выдаленне мініяцюр, даных праграм, ланцужкоў артыкулаў, інфармацыі вэб-захопу, дрэва структуры або выходных інтэнтаў +- **Растарызацыя**: замена старонак відарысамі для сканаў толькі з відарысаў; не выконваецца, калі ў дакуменце ёсць тэкст, які можна вылучыць +- **Вывад**: Захаваць PDF/A і сцісканне Brotli для праграм чытання PDF 2.0, якія яго падтрымліваюць + +## Сцэнарыі выкарыстання + +- Памяншэнне справаздачы на 50 МБ да ліміту ўкладанняў электроннай пошты +- Змяншэнне скана пад строгі ліміт загрузкі партала з дапамогай мэтавага памеру файла +- Аптымізацыя маркетынгавых PDF для хутчэйшага спампоўвання з сайта +- Архіваванне вялікіх набораў дакументаў, калі важны кошт захоўвання +- Скарачэнне мабільнага трафіку пры абмене PDF у месенджарах + +## Парады + +- Пачніце з Сярэдняга. Калі вынік усё яшчэ завялікі, задайце мэтавы памер файла або перайдзіце на Высокі. +- Для скана без тэкставага пласта ўключыце Растарызаваць старонкі ва Уласных наладах. +- Пераўтварэнне ў градацыі шэрага ва Уласных наладах можа паменшыць памер файла для дакументаў з вялікай колькасцю колеру. + +## Звязаныя інструменты + +- [Зрабіць лінейны PDF](./linearize-pdf): аптымізуе сціснуты PDF для хуткага прагляду ў інтэрнэце +- [Растарызаваць PDF](./rasterize-pdf): пераўтварае старонкі ў відарысы з зададзеным DPI, у тым ліку старонкі з тэкстам +- [Аднавіць PDF](./repair-pdf): выпраўляе PDF, які пашкодзіўся пры сцісканні ў іншым месцы +- [Выдаліць метаданыя](./remove-metadata): выдаляе схаваныя даныя для прыватнасці diff --git a/docs/be/tools/crop-pdf.md b/docs/be/tools/crop-pdf.md new file mode 100644 index 00000000..1ad8087a --- /dev/null +++ b/docs/be/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Абрэзаць PDF +description: Візуальна абразайце старонкі PDF, малюючы вобласць абрэзкі на кожнай старонцы ў рэдактары на аснове Cropper.js. +--- + +# Абрэзаць PDF + +Абразайце палі старонак PDF з дапамогай візуальнага інтэрфейсу. Намалюйце прамавугольнік абрэзкі непасрэдна на кожнай старонцы, праглядзіце вынік і прымяніце абрэзку. Можна задаваць розныя вобласці для розных старонак або прымяніць адну абрэзку да ўсяго дакумента. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Адкрываецца рэдактар абрэзкі з першай старонкай і рамкай абрэзкі, якую можна перацягваць. +3. Наладзьце прамавугольнік абрэзкі, перацягваючы яго краі або вуглы. +4. Карыстайцеся кнопкамі навігацыі, каб пераходзіць паміж старонкамі і задаваць вобласць абрэзкі для кожнай. +5. Націсніце **Абрэзаць**, каб прымяніць абрэзку і спампаваць вынік. + +## Магчымасці + +- Візуальны рэдактар абрэзкі на аснове Cropper.js з маркерамі для дакладнай налады +- Пастаронкавая навігацыя для задання асобных абласцей абрэзкі +- Налады абрэзкі захоўваюцца для кожнай старонкі, таму для розных старонак можна задаць розную абрэзку +- Жывы папярэдні прагляд выбранай вобласці +- Падтрымка PDF з любым памерам і арыентацыяй старонак + +## Сцэнарыі выкарыстання + +- Выдаленне шырокіх палёў са сканаваных дакументаў, каб засяродзіцца на змесціве +- Абрэзка друкарскіх метак і метак сумяшчэння з PDF для перадрукарскай падрыхтоўкі +- Абрэзка слайдаў лекцый, каб прыбраць вобласць нататак дакладчыка +- Выдаленне калантытулаў з кожнай старонкі перад абменам урыўкам дакумента +- Змяненне памеру старонак пад пэўны экран або макет друку + +## Парады + +- Рамку абрэзкі можна свабодна змяняць і перамяшчаць. Цягніце за вуглы для прапарцыйнай змены памеру або за краі для змены па адной восі. +- Калі для ўсіх старонак патрэбна аднолькавая абрэзка, задайце яе на першай старонцы: інструмент запамінае вобласць абрэзкі пры пераходзе паміж старонкамі. +- Калі трэба ўніфікаваць памеры старонак, а не абразаць іх візуальна, лепш падыдзе інструмент «Уніфікаваць памер старонак». + +## Звязаныя інструменты + +- [Рэдактар PDF](./edit-pdf) +- [Нумары старонак](./page-numbers) +- [Выдаліць пустыя старонкі](./remove-blank-pages) diff --git a/docs/be/tools/csv-to-pdf.md b/docs/be/tools/csv-to-pdf.md new file mode 100644 index 00000000..d9f33c22 --- /dev/null +++ b/docs/be/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV у PDF +description: Пераўтварайце файлы электронных табліц CSV у адфарматаваныя табліцы PDF непасрэдна ў браўзеры. +--- + +# CSV у PDF + +Ператварайце файлы CSV у акуратныя адфарматаваныя дакументы PDF. Кожны CSV разбіраецца і выводзіцца ў PDF як табліца. Гэта зручна, калі трэба раздрукаваць або перадаць таблічныя даныя, не патрабуючы ад атрымальніка праграмы для электронных табліц. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------- | +| CSV | `.csv` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце адзін ці некалькі файлаў CSV. +2. Праверце спіс файлаў. Дадайце яшчэ файлы або выдаліце непатрэбныя. +3. Націсніце **Пераўтварыць у PDF**. Індыкатар паказвае ход пераўтварэння. +4. Адзін файл спампоўваецца непасрэдна як PDF. Некалькі файлаў пакуюцца ў `csv-converted.zip`. + +## Параметры + +У гэтага інструмента няма дадатковых налад. CSV аўтаматычна разбіраецца і фармуецца як табліца. + +## Вынік + +| Колькасць файлаў | Вынік | +| :--------------- | :-------------------------------------------------------- | +| 1 файл | Спампоўванне аднаго PDF (напрыклад, `data.pdf`) | +| 2+ файлы | Архіў ZIP (`csv-converted.zip`) з адным PDF на кожны файл | + +## Сцэнарыі выкарыстання + +- Пераўтварэнне экспартаваных справаздач з баз даных у табліцы PDF для друку +- Перадача фінансавых даных або спісаў запасаў людзям, у якіх няма Excel +- Стварэнне PDF-версій файлаў журналаў CSV для дакументацыі па адпаведнасці +- Друк спісаў адрасоў, ведамасцей ацэнак або любых таблічных даных у CSV + +## Парады + +- Для лепшага выніку пераканайцеся, што ў CSV выкарыстоўваюцца стандартныя раздзяляльнікі-коскі. Інструмент прытрымліваецца агульнапрынятых правілаў разбору CSV. +- Калі ў CSV шмат слупкоў, табліца можа быць сціснута да шырыні старонкі. Падумайце пра падзел шырокіх набораў даных на некалькі файлаў. +- Для файлаў Excel (`.xls`, `.xlsx`) карыстайцеся інструментам [Excel у PDF](./excel-to-pdf), які захоўвае фарматаванне і некалькі аркушаў. + +## Звязаныя інструменты + +- [Excel у PDF](./excel-to-pdf) +- [Тэкст у PDF](./txt-to-pdf) +- [JSON у PDF](./json-to-pdf) diff --git a/docs/be/tools/delete-pages.md b/docs/be/tools/delete-pages.md new file mode 100644 index 00000000..28e39bf6 --- /dev/null +++ b/docs/be/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Выдаліць старонкі +description: Выдаляйце пэўныя старонкі з PDF па нумары, дыяпазоне або выбары на мініяцюрах. +--- + +# Выдаліць старонкі + +Выдаляйце непатрэбныя старонкі з дакумента PDF. Укажыце старонкі для выдалення, увёўшы нумары або дыяпазоны, або націскайце на мініяцюры старонак, каб пазначыць іх. + +## Як гэта працуе + +1. Загрузіце файл PDF. Інструмент паказвае мініяцюры ўсіх старонак. +2. Увядзіце старонкі для выдалення ў тэкставае поле з дыяпазонамі (напрыклад, `2, 5-8`) або націскайце на мініяцюры, каб пазначыць іх. +3. Пазначаныя старонкі вылучаюцца, каб вы маглі праверыць выбар. +4. Націсніце кнопку апрацоўкі. Будзе створаны новы PDF без выбраных старонак. + +## Магчымасці + +- Тэкставы выбар старонак з дыяпазонамі (`2, 5-8, 12`) +- Сетка мініяцюр для выбару старонак націскам +- Вылучэнне пазначаных для выдалення старонак у рэальным часе +- Праверка ўводу адносна сапраўднай колькасці старонак +- Усе невыдаленыя старонкі захоўваюць зыходны парадак + +## Сцэнарыі выкарыстання + +- Выдаленне пустых або лішніх старонак са сканаванага дакумента +- Выдаленне вокладак або дадаткаў перад абменам дакументам +- Ачыстка чарнавых старонак, якія выпадкова засталіся ў выніковым PDF +- Выдаленне старонак з канфідэнцыйнай інфармацыяй перад распаўсюджваннем + +## Парады + +- Выдаленне старонак не ўплывае на змесціва і фарматаванне астатніх. Вынік з'яўляецца дакладнай копіяй арыгінала без выдаленых старонак. +- Калі трэба пакінуць толькі пэўныя старонкі, а не выдаліць пэўныя, лепш падыдзе [Выняць старонкі](./extract-pages). +- Мініяцюры загружаюцца па меры патрэбы, таму вялікія дакументы застаюцца хуткімі. + +## Звязаныя інструменты + +- [Выняць старонкі](./extract-pages) +- [Дубляваць і арганізаваць](./organize-pdf) +- [Падзяліць PDF](./split-pdf) diff --git a/docs/be/tools/deskew-pdf.md b/docs/be/tools/deskew-pdf.md new file mode 100644 index 00000000..ec9084c6 --- /dev/null +++ b/docs/be/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Выпрастаць PDF +description: Аўтаматычна выраўноўвайце нахіленыя старонкі ў сканаваных PDF з дапамогай выяўлення нахілу OpenCV. Наладжвальныя парог і DPI. +--- + +# Выпрастаць PDF + +Сканаваныя дакументы рэдка бываюць ідэальна роўнымі. Нават невялікі нахіл зніжае дакладнасць OCR і робіць друк неакуратным. Гэты інструмент выкарыстоўвае алгарытмы апрацоўкі відарысаў OpenCV, каб вызначыць кут нахілу кожнай старонкі і павярнуць яе назад да роўнага становішча. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі сканаваных PDF. +2. Задайце **Парог нахілу**: старонкі з нахілам меншым за гэта значэнне застаюцца без змен. +3. Выберыце **Якасць апрацоўкі (DPI)**: больш высокі DPI павышае дакладнасць выяўлення, але апрацоўка займае больш часу. +4. Націсніце **Выпрастаць PDF**. +5. Пасля апрацоўкі панэль вынікаў паказвае выяўлены кут кожнай старонкі і ці была яна выпраўлена. + +## Параметры + +| Налада | Значэнні | Па змаўчанні | +| ----------------- | -------------------------- | ------------ | +| **Парог нахілу** | 0.1, 0.5, 1.0, 2.0 градуса | 0.5 | +| **DPI апрацоўкі** | 100, 150, 200, 300 | 150 | + +## Як працуе выяўленне нахілу + +Інструмент рэндэрыць кожную старонку ў відарыс з выбраным DPI, а потым з дапамогай OpenCV вызначае дамінуючыя вуглы ліній у змесціве. Калі выяўлены нахіл перавышае парог, старонка паварочваецца на адваротны кут, каб выраўнаваць яе. Старонкі ніжэй за парог застаюцца без змен. + +## Сцэнарыі выкарыстання + +- Ачыстка пакетна адсканаваных дагавораў або юрыдычных дакументаў +- Падрыхтоўка адсканаваных чэкаў або рахункаў да OCR +- Выраўноўванне старонак з планшэтнага сканера пры няроўна пакладзенай паперы +- Паляпшэнне візуальнай якасці алічбаваных архіўных матэрыялаў + +## Парады + +- Паменшыце парог да 0.1 градуса, калі для OCR патрэбна ідэальнае выраўноўванне. +- 150 DPI хутка і дакладна для большасці дакументаў. Для вельмі дробнага тэксту або старонак з дробнымі дэталямі выкарыстоўвайце 300 DPI. +- Выпрастанне лепш за ўсё працуе з дакументамі з выразнымі гарызантальнымі радкамі тэксту. Яно можа не спраўляцца са старонкамі, дзе пераважаюць відарысы або дыяганальныя элементы дызайну. + +## Звязаныя інструменты + +- [Растарызаваць PDF](./rasterize-pdf): пераўтварае выпраўлены вынік у PDF на аснове плоскіх відарысаў +- [Сціснуць PDF](./compress-pdf): памяншае памер файла пасля выпрастання +- [Аднавіць PDF](./repair-pdf): выпраўляе структурныя праблемы ў сканаваных PDF diff --git a/docs/be/tools/digital-sign-pdf.md b/docs/be/tools/digital-sign-pdf.md new file mode 100644 index 00000000..4ab81d59 --- /dev/null +++ b/docs/be/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Лічбавы подпіс +description: Дадавайце ў PDF крыптаграфічныя лічбавыя подпісы з сертыфікатамі X.509. Падтрымліваюцца фарматы PKCS#12 і PEM з бачным подпісам. +--- + +# Лічбавы подпіс + +Лічбавы подпіс з'яўляецца крыптаграфічным доказам таго, што пэўны чалавек падпісаў дакумент і што дакумент з таго часу не змяняўся. У адрозненне ад намаляванага подпісу (які з'яўляецца проста відарысам), лічбавы подпіс выкарыстоўвае сертыфікаты X.509 і стандарты PKCS#7, каб забяспечыць правяральную сапраўднасць і цэласнасць. + +BentoPDF ставіць лічбавыя подпісы цалкам у вашым браўзеры. Ваш закрыты ключ ніколі не пакідае прыладу. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Загрузіце файл сертыфіката (.pfx, .p12 або .pem). +3. Увядзіце пароль сертыфіката, каб разблакіраваць яго. Інструмент пакажа суб'ект, выдаўца і тэрмін дзеяння сертыфіката. +4. Пры жаданні наладзьце метаданыя подпісу (прычына, месца, кантактная інфармацыя). +5. Пры жаданні ўключыце **бачны подпіс** і наладзьце пазіцыю, памер, відарыс і тэкст. +6. Націсніце **Падпісаць PDF**. + +## Падтрымліваемыя фарматы сертыфікатаў + +| Фармат | Пашырэнні | Апісанне | +| ----------- | ---------- | -------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Галіновы стандарт пакета з закрытым ключом і ланцужком сертыфікатаў. Найбольш распаўсюджаны фармат. | +| **PEM** | .pem | Тэкставы фармат. Павінен утрымліваць і сертыфікат, і закрыты ключ у адным файле. Падтрымлівае зашыфраваныя закрытыя ключы. | + +## Параметры бачнага подпісу + +Калі ўключана, на старонцы PDF выводзіцца бачны блок подпісу: + +- **Пазіцыя**: каардынаты X/Y і шырыня/вышыня ў пунктах +- **Старонка**: першая, апошняя, усе старонкі або пэўны нумар старонкі +- **Відарыс**: загрузіце відарыс PNG, JPG або WebP (рукапісны подпіс, пячатка кампаніі і г. д.) +- **Тэкст**: уласны тэкст з наладжвальным колерам і памерам шрыфту. Калі не зададзены ні відарыс, ні тэкст, інструмент аўтаматычна стварае тэкст з агульнага імя сертыфіката і бягучай даты. + +## Метаданыя подпісу + +- **Прычына**: чаму дакумент быў падпісаны (напрыклад, «Зацверджана», «Праверана») +- **Месца**: дзе адбылося падпісанне (напрыклад, «Мінск») +- **Кантактная інфармацыя**: як звязацца з падпісантам (напрыклад, адрас электроннай пошты) + +## Заўвага пра падключэнне да інтэрнэту + +Для падпісання можа спатрэбіцца падключэнне да інтэрнэту. Бібліятэка подпісу атрымлівае ланцужок сертыфікатаў па URL, убудаваных у пашырэнне Authority Information Access (AIA) вашага сертыфіката. Калі гэтыя серверы недаступныя, падпісанне не атрымаецца для сертыфікатаў, якія патрабуюць праверкі ланцужка. + +## Сцэнарыі выкарыстання + +- Падпісанне дагавораў, прапаноў і пагадненняў юрыдычна значнымі лічбавымі подпісамі +- Сертыфікацыя афіцыйных дакументаў у працэсах, якія патрабуюць аўтэнтыфікацыі на аснове PKI +- Падпісанне рахункаў PDF для выканання патрабаванняў рэгулятараў (многія краіны ЕС патрабуюць лічбава падпісаных электронных рахункаў) +- Дадаванне арганізацыйнага зацвярджэння да інжынерных чарцяжоў або дакументаў па якасці + +## Парады + +- Самападпісаныя сертыфікаты падыходзяць для тэставання, але ў Adobe Reader будуць паказваць папярэджанні. Для рабочых дакументаў выкарыстоўвайце сертыфікат ад давернага цэнтра сертыфікацыі. +- Бачны подпіс з'яўляецца чыста візуальным. Крыптаграфічны подпіс убудоўваецца незалежна ад таго, ці ўключаны бачны блок. +- Праверце падпісаны PDF інструментам «Праверыць подпіс PDF», каб пераканацца, што подпіс цэлы. + +## Звязаныя інструменты + +- [Праверыць подпіс PDF](./validate-signature-pdf): правярае лічбавыя подпісы ў падпісаных PDF +- [Звесці PDF](./flatten-pdf): зводзіць формы перад падпісаннем, каб прадухіліць змены +- [Зашыфраваць PDF](./protect-pdf): дадае абарону паролем паверх лічбавага подпісу +- [Выдаліць метаданыя](./remove-metadata): выдаляе метаданыя перад падпісаннем diff --git a/docs/be/tools/divide-pages.md b/docs/be/tools/divide-pages.md new file mode 100644 index 00000000..1a221445 --- /dev/null +++ b/docs/be/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Падзяліць старонкі +description: Дзяліце старонкі PDF гарызантальна або вертыкальна на меншыя падстаронкі. +--- + +# Падзяліць старонкі + +Разразайце асобныя старонкі PDF напалову, дзелячы іх гарызантальна або вертыкальна. Гэта зручна, калі адна старонка ўтрымлівае змесціва, якое трэба раздзяліць на асобныя старонкі, напрыклад макет у дзве калонкі, адсканаваны як адна шырокая старонка. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Выберыце напрамак падзелу: **Вертыкальна** (левая/правая палова) або **Гарызантальна** (верхняя/ніжняя палова). +3. Пры жаданні ўкажыце дыяпазон старонак, каб абмежаваць, якія старонкі дзяліць. Пакіньце пустым, каб падзяліць усе старонкі. +4. Націсніце кнопку апрацоўкі, каб стварыць падзелены PDF. + +## Магчымасці + +- Вертыкальны падзел: дзеліць кожную старонку на левую і правую паловы +- Гарызантальны падзел: дзеліць кожную старонку на верхнюю і ніжнюю паловы +- Фільтр дыяпазону старонак для выбарачнага падзелу +- Астатнія старонкі застаюцца без змен +- Якасць змесціва захоўваецца без паўторнага рэндэрынгу + +## Сцэнарыі выкарыстання + +- Раздзяленне сканаў з дзвюма старонкамі на аркушы (напрыклад, скан кнігі з левай і правай старонкамі на адным аркушы) +- Падзел альбомнага PDF са змесцівам побач на асобныя кніжныя старонкі +- Падзел высокай інфаграфікі або постэраў на асобныя верхнюю і ніжнюю часткі +- Падрыхтоўка шырокафарматных дакументаў да друку на стандартнай паперы + +## Парады + +- Калі змесціва на старонках размеркавана нераўнамерна, падзел усё роўна адбываецца дакладна пасярэдзіне. Для асіметрычнага падзелу лепш скарыстацца [Абрэзаць PDF](./crop-pdf). +- Спалучайце гэты інструмент з [Павярнуць PDF](./rotate-pdf), калі старонкі трэба павярнуць да або пасля падзелу. + +## Звязаныя інструменты + +- [Падзяліць PDF](./split-pdf) +- [Абрэзаць PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Пераўтварыць у постэр](./posterize-pdf) diff --git a/docs/be/tools/duplex-collate.md b/docs/be/tools/duplex-collate.md new file mode 100644 index 00000000..b007a7dd --- /dev/null +++ b/docs/be/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Сартаванне двухбаковага сканавання +description: Упарадкоўвайце PDF двухбаковага сканавання, дзе пярэднія і адваротныя бакі ідуць асобнымі блокамі, у правільны парадак старонак. +--- + +# Сартаванне двухбаковага сканавання + +Сартаванне двухбаковага сканавання прызначана для сканавання з аўтападатчыкам (ADF), калі адзін PDF утрымлівае два блокі старонак: + +- спачатку ўсе пярэднія бакі +- потым усе адваротныя бакі + +Замест ручнога падзелу і зборкі інструмент чаргуе два блокі ў натуральны парадак чытання: пярэдні1, адваротны1, пярэдні2, адваротны2 і г. д. + +## Як гэта працуе + +1. Загрузіце адзін PDF, створаны пры двухбаковым сканаванні стосу. +2. Задайце пункт падзелу, дзе заканчваецца блок пярэдніх бакоў. +3. Выберыце, як апрацоўваць блок адваротных бакоў: + - **Перавярнуць блок адваротных бакоў** (звычайна, калі стос пераварочваюць перад сканаваннем адваротных бакоў) + - **Пакінуць блок адваротных бакоў як ёсць** +4. Націсніце **Сартаваць PDF**, каб спампаваць упарадкаваны вынік. + +## Параметры + +- **Аўтавызначэнне падзелу (палова)**: задае пункт падзелу як `ceil(totalPages / 2)`. +- **Папярэджанне пра няцотную колькасць**: папярэджвае, калі агульная колькасць старонак няцотная (часта гэта памылка сканавання). +- **Пацвярджэнне няроўных блокаў**: запытвае пацвярджэнне, калі памеры блокаў пярэдніх і адваротных бакоў адрозніваюцца. +- **Групавы экспарт**: дзеліць вынік на асобныя PDF паводле колькасці старонак у арыгінальным дакуменце і спампоўвае іх як ZIP. + +## Паводзіны выніку + +- **Па змаўчанні**: адзін выходны PDF (адзін PDF на ўваходзе, адзін на выхадзе). +- **Групавы рэжым**: вынік дзеліцца на часткі паводле значэння старонак на дакумент; калі атрымліваецца некалькі частак, яны спампоўваюцца адным ZIP, інакш спампоўваецца адзін PDF. + +Калі памеры блокаў няроўныя, спачатку сартуюцца старонкі, што маюць пару, а астатнія старонкі без пары дадаюцца ў канцы. + +## Звычайныя сцэнарыі выкарыстання + +- Аднаўленне парадку пасля сканавання стосу двухбаковых бланкаў за два праходы. +- Аднаўленне пакетаў «пярэдні/адваротны бок» з офісных сканераў, якія выводзяць спачатку ўсе пярэднія бакі, потым усе адваротныя. +- Апрацоўка архіўных сканаў перад падзелам на файлы па дакументах. + +## Парады + +- У большасці пакетаў двухбаковага сканавання агульная колькасць старонак павінна быць цотнай. +- Калі адваротныя бакі ў выніку ідуць у адваротным парадку, пераключыцеся паміж **Перавярнуць блок адваротных бакоў** і **Пакінуць блок адваротных бакоў як ёсць**. +- Для двухстаронкавых арыгіналаў (пярэдні+адваротны бок) выкарыстоўвайце групавы экспарт з `2` старонкамі на дакумент. + +## Звязаныя інструменты + +- [Чаргаваць і змяшаць старонкі](./alternate-merge) +- [Падзяліць PDF](./split-pdf) +- [Аб'яднаць PDF](./merge-pdf) +- [Дубляваць і арганізаваць](./organize-pdf) diff --git a/docs/be/tools/edit-attachments.md b/docs/be/tools/edit-attachments.md new file mode 100644 index 00000000..c13f8fda --- /dev/null +++ b/docs/be/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Рэдагаваць далучэнні +description: Праглядайце і выбарачна выдаляйце файлы, далучаныя да дакумента PDF. +--- + +# Рэдагаваць далучэнні + +Праглядайце і кіруйце далучанымі файламі ўнутры PDF. Інструмент паказвае кожны ўбудаваны файл з назвай і ўзроўнем далучэння, а потым дазваляе пазначыць асобныя далучэнні для выдалення або выдаліць іх усе адразу. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Інструмент аўтаматычна шукае далучэнні і паказвае іх спісам. +3. Для кожнага далучэння паказваецца назва файла і тое, ці далучана яно да дакумента або да старонкі. +4. Націсніце значок кошыка побач з далучэннем, каб пазначыць яго для выдалення (націсніце яшчэ раз, каб зняць пазнаку). +5. Карыстайцеся кнопкай **Выдаліць усе далучэнні**, каб выбраць усё адразу, або **Зняць выбар з усіх**, каб ачысціць выбар. +6. Націсніце кнопку апрацоўкі, каб захаваць новы PDF без выбраных далучэнняў. + +## Магчымасці + +- Спіс усіх далучэнняў на ўзроўні дакумента і старонак +- Выдаленне далучэнняў па адным або ўсіх разам +- Уключэнне і выключэнне выбару перад захаваннем змен +- Пазначаныя для выдалення элементы закрэсліваюцца і становяцца паўпразрыстымі +- Спампоўванне змененага PDF без выбраных далучэнняў + +## Сцэнарыі выкарыстання + +- Выдаленне састарэлых або памылковых файлаў, убудаваных у дакумент, перад паўторным распаўсюджваннем +- Выдаленне канфідэнцыйных далучэнняў (фінансавыя даныя, асабістая інфармацыя) з PDF перад абменам +- Памяншэнне памеру PDF за кошт выдалення вялікіх убудаваных файлаў, якія больш не патрэбныя +- Аўдыт убудаванага змесціва і ачыстка дакумента перад архіваваннем + +## Парады + +- Пазначаныя для выдалення далучэнні паказваюцца закрэсленымі. Калі перадумаеце, можна вярнуць іх перад апрацоўкай. +- Калі далучэнні не знойдзены, інструмент паказвае паведамленне «Далучэнні не знойдзены»: PDF проста не ўтрымлівае ўбудаваных файлаў. + +## Звязаныя інструменты + +- [Дадаць далучэнні](./add-attachments) +- [Выняць далучэнні](./extract-attachments) +- [Праглядзець метаданыя](./view-metadata) diff --git a/docs/be/tools/edit-metadata.md b/docs/be/tools/edit-metadata.md new file mode 100644 index 00000000..0477eaf6 --- /dev/null +++ b/docs/be/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Рэдагаваць метаданыя +description: Праглядайце і змяняйце палі метаданых PDF, у тым ліку назву, аўтара, ключавыя словы, даты і ўласныя ўласцівасці. +--- + +# Рэдагаваць метаданыя + +Рэдагуйце метаданыя, убудаваныя ў файл PDF. Інструмент загадзя запаўняе форму існуючымі метаданымі дакумента, дазваляе змяніць любое поле і захоўвае змены ў новы PDF. + +## Як гэта працуе + +1. Загрузіце файл PDF. Інструмент чытае яго бягучыя метаданыя і запаўняе форму. +2. Рэдагуйце любыя стандартныя палі: Назва, Аўтар, Тэма, Ключавыя словы, Стваральнік, Вытворца. +3. Наладзьце Дату стварэння і Дату змянення з дапамогай выбару даты і часу. +4. Дадавайце ўласныя палі метаданых: націсніце кнопку дадавання і ўвядзіце пару ключ-значэнне. +5. Націсніце кнопку апрацоўкі, каб захаваць зменены PDF. + +## Магчымасці + +- Загадзя запаўняе ўсе існуючыя метаданыя з загружанага PDF +- Стандартныя палі: Назва, Аўтар, Тэма, Ключавыя словы, Стваральнік, Вытворца +- Выбар даты і часу для Даты стварэння і Даты змянення +- Уласныя палі метаданых ключ-значэнне для любых уласцівасцей +- Захоўвае змены непасрэдна ў інфармацыйны слоўнік дакумента PDF + +## Палі для рэдагавання + +| Поле | Апісанне | +| ------------------ | --------------------------------------------------------- | +| **Назва** | Назва дакумента, якая паказваецца ў праграмах чытання PDF | +| **Аўтар** | Чалавек або арганізацыя, якія стварылі дакумент | +| **Тэма** | Кароткае апісанне тэмы дакумента | +| **Ключавыя словы** | Тэрміны праз коску для пошуку і катэгарызацыі | +| **Стваральнік** | Праграма, у якой першапачаткова створана змесціва | +| **Вытворца** | Праграма, якая стварыла PDF | +| **Дата стварэння** | Калі дакумент быў першапачаткова створаны | +| **Дата змянення** | Калі дакумент быў апошні раз зменены | +| **Уласныя палі** | Любыя дадатковыя пары ключ-значэнне, якія вы задасце | + +## Сцэнарыі выкарыстання + +- Заданне правільнай назвы і аўтара перад публікацыяй дакумента +- Дадаванне ключавых слоў для лепшага пошуку ў сістэмах кіравання дакументамі +- Абнаўленне даты змянення ў адпаведнасці з бягучай рэдакцыяй +- Дадаванне ўласных палёў метаданых, такіх як Аддзел, ID праекта або Класіфікацыя +- Ачыстка метаданых, пакінутых зыходнай праграмай стварэння + +## Парады + +- Уласныя палі запісваюцца непасрэдна ў інфармацыйны слоўнік PDF. Некаторыя праграмы чытання PDF могуць іх не паказваць, але ў файле яны захоўваюцца. +- Пакіньце поле пустым, каб выдаліць яго з метаданых. Кнопка апрацоўкі захоўвае тое, што ёсць у форме. +- Каб праглядзець метаданыя без рэдагавання, скарыстайцеся [Праглядзець метаданыя](./view-metadata). Каб цалкам выдаліць усе метаданыя, скарыстайцеся «Выдаліць метаданыя». + +## Звязаныя інструменты + +- [Праглядзець метаданыя](./view-metadata) +- [Пласты PDF OCG](./pdf-layers) +- [Сціснуць PDF](./compress-pdf) diff --git a/docs/be/tools/edit-pdf.md b/docs/be/tools/edit-pdf.md new file mode 100644 index 00000000..7e5fad24 --- /dev/null +++ b/docs/be/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Рэдактар PDF +description: Анатуйце, вылучайце, рэдагуйце з выдаленнем, дадавайце фігуры і відарысы, шукайце і праглядайце PDF непасрэдна ў браўзеры. +--- + +# Рэдактар PDF + +Рэдактар PDF ад BentoPDF дазваляе анатаваць, вылучаць, выдаляць канфідэнцыйнае змесціва, каментаваць, дадаваць фігуры і відарысы і шукаць у вашых PDF. Ён загружае поўнафункцыянальны рэдактар непасрэдна ў браўзеры без загрузкі файлаў на сервер. + +## Як гэта працуе + +1. Загрузіце PDF: націсніце на вобласць загрузкі або перацягніце на яе файл. +2. Убудаваны рэдактар PDF адкрываецца аўтаматычна з вашым дакументам. +3. Карыстайцеся панэллю інструментаў, каб анатаваць, вылучаць, выдаляць змесціва, дадаваць тэкст, маляваць фігуры або ўстаўляць відарысы. +4. Націсніце **Спампаваць адрэдагаваны PDF**, каб захаваць змены. + +## Магчымасці + +- Поўная панэль анатацый з вылучэннем, падкрэсліваннем, закрэсліваннем і малюнкам ад рукі +- Устаўка тэксту і каментаванне +- Інструменты выдалення змесціва, якія назаўсёды выдаляюць пазначанае змесціва пасля прымянення. Калі пры націску **Спампаваць адрэдагаваны PDF** засталіся непрымененыя пазнакі, рэдактар прапануе спачатку прымяніць іх. +- Інструменты фігур: прамавугольнікі, кругі, лініі і стрэлкі +- Устаўка відарысаў на старонкі PDF +- Убудаваны пошук тэксту па дакуменце +- Падтрымка некалькіх дакументаў ва ўкладках (да 10 адначасова адкрытых дакументаў) +- Загрузка файлаў перацягваннем + +## Сцэнарыі выкарыстання + +- Праверка дагавораў і пазначэнне змен вылучэннямі і каментарыямі +- Выдаленне канфідэнцыйнай інфармацыі, напрыклад нумароў сацыяльнага страхавання або фінансавых даных, перад абменам +- Дадаванне анатацый да архітэктурных планаў або інжынерных чарцяжоў +- Устаўка лагатыпаў кампаніі або штампаў на старонкі дакумента +- Пошук пэўных тэрмінаў у аб'ёмных юрыдычных дакументах + +## Парады + +- Можна адкрыць некалькі PDF адначасова і пераключацца паміж імі ўкладкамі ўверсе рэдактара. +- Рэдактар захоўвае арыгінальную структуру PDF, таму шрыфты, макеты і палі форм застаюцца некранутымі. +- Пазначэнне тэксту або вобласці для выдалення нічога не выдаляе, пакуль выдаленне не прыменена. Калі вы выдаляеце вылучаны тэкст, яго копіі ва ўласцівасцях файла, закладках, каментарыях і далучэннях таксама выдаляюцца са спампаванага файла, калі файл не зашыфраваны. +- Для масавага дадавання вадзяных знакаў або нумароў старонак карыстайцеся спецыяльнымі інструментамі, яны даюць больш кантролю над фарматаваннем. + +## Звязаныя інструменты + +- [Дадаць вадзяны знак](./add-watermark) +- [Падпісаць PDF](./sign-pdf) +- [Дадаць штампы](./add-stamps) +- [Выдаліць анатацыі](./remove-annotations) diff --git a/docs/be/tools/email-to-pdf.md b/docs/be/tools/email-to-pdf.md new file mode 100644 index 00000000..ee235cb7 --- /dev/null +++ b/docs/be/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email у PDF +description: Пераўтварайце файлы электроннай пошты EML і MSG у PDF у браўзеры. Захоўваюцца загалоўкі, тэкст і спіс далучэнняў. +--- + +# Email у PDF + +Пераўтварайце захаваныя лісты ў акуратныя PDF для друку. Інструмент разбірае файлы EML і MSG, вымае ўвесь ліст (загалоўкі, тэкст і метаданыя далучэнняў) і выводзіць усё ў структураваны PDF. Зручна для юрыдычнага раскрыцця даных, вядзення запісаў або проста друку важнага ліста. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----- | :-------- | :------------------------------------------------------------------------ | +| EML | `.eml` | Стандартны фармат лістоў MIME (экспартуецца з большасці паштовых праграм) | +| MSG | `.msg` | Уласны фармат Microsoft Outlook | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы EML ці MSG. Можна змешваць абодва фарматы ў адным пакеце. +2. Праверце спіс файлаў. Выдаліце непатрэбныя значком кошыка або націсніце **Дадаць файлы**, каб дадаць яшчэ лісты. +3. Наладзьце параметры пераўтварэння (гл. ніжэй). +4. Націсніце **Пераўтварыць у PDF**. Інструмент разбірае кожны ліст, выводзіць змесціва як аформлены HTML і пераўтварае яго ў PDF рухавіком PyMuPDF. +5. Адзін ліст спампоўваецца непасрэдна як PDF. Некалькі лістоў пакуюцца ў `emails-converted.zip`. + +## Параметры + +| Параметр | Па змаўчанні | Апісанне | +| :--------------------------- | :----------- | :-------------------------------------------------------------------------------------- | +| **Памер старонкі** | A4 | Выбар паміж памерамі старонак A4, Letter або Legal. | +| **Уключыць CC і BCC** | Укл. | Калі ўключана, спісы атрымальнікаў CC і BCC паказваюцца ў загалоўку ліста ў PDF. | +| **Уключыць спіс далучэнняў** | Укл. | Калі ўключана, у PDF паказваецца спіс далучаных да ліста файлаў (з назвамі і памерамі). | + +## Сцэнарыі выкарыстання + +- Архіваванне важнай дзелавой перапіскі ў PDF для адпаведнасці патрабаванням або аўдыту +- Друк ланцужкоў лістоў для судовых разбіральніцтваў або запытаў на раскрыццё +- Стварэнне пастаяннага запісу пацвярджэнняў заказаў, чэкаў або дагавораў, атрыманых па пошце +- Рэзервовае капіраванне файлаў Outlook MSG у фармат, для чытання якога не патрэбны Outlook +- Дакументаванне зваротаў у службу падтрымкі з экспартаваных файлаў EML + +## Парады + +- Падтрымліваюцца і EML (выкарыстоўваецца ў Thunderbird, Apple Mail і большасці паштовых праграм), і файлы Outlook MSG. Экспартуйце лісты з паштовай праграмы і перацягніце іх непасрэдна ў інструмент. +- Лісты ў фармаце HTML захоўваюць афармленне ў PDF. Лісты простым тэкстам выводзяцца з акуратным, лёгкім для чытання фарматаваннем. +- Спіс далучэнняў паказвае назвы і памеры файлаў, але не ўбудоўвае самі далучаныя файлы ў PDF. + +## Звязаныя інструменты + +- [XML у PDF](./xml-to-pdf) +- [XPS у PDF](./xps-to-pdf) diff --git a/docs/be/tools/epub-to-pdf.md b/docs/be/tools/epub-to-pdf.md new file mode 100644 index 00000000..52899e01 --- /dev/null +++ b/docs/be/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB у PDF +description: Пераўтварайце электронныя кнігі EPUB у PDF у браўзеры. Бясплатна, без загрузкі на сервер, з прыярытэтам прыватнасці. +--- + +# EPUB у PDF + +Пераўтварайце электронныя кнігі EPUB у файлы PDF, не пакідаючы браўзер. EPUB з'яўляецца адкрытым стандартам лічбавых кніг, але часам патрэбны PDF з фіксаваным макетам для друку, анатавання або абмену з тымі, у каго няма праграмы для чытання электронных кніг. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----- | :-------- | :-------------------- | +| EPUB | `.epub` | Файлы EPUB 2 і EPUB 3 | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы EPUB. Падтрымліваецца выбар некалькіх файлаў. +2. Праверце загружаныя файлы. Выдаліце непатрэбныя значком кошыка або націсніце **Дадаць файлы**, каб пашырыць пакет. +3. Націсніце **Пераўтварыць у PDF**. Рухавік PyMuPDF выводзіць змесціва EPUB (тэкст, відарысы і фарматаванне) у PDF са старонкамі. +4. Адзін EPUB спампоўваецца непасрэдна як PDF. Некалькі файлаў пакуюцца ў архіў ZIP з назвай `epub-converted.zip`. + +## Параметры + +Пераўтварэнне выконваецца з разумнымі наладамі па змаўчанні і не патрабуе налады. Тэкст перацякае ў стандартныя памеры старонак, а ўбудаваныя шрыфты і відарысы пераносяцца ў PDF. + +## Сцэнарыі выкарыстання + +- Друк электроннай кнігі без DRM, каб чытаць без экрана +- Падача рукапісу EPUB як PDF з фіксаваным макетам для рэцэнзавання +- Архіваванне лічбавых кніг у фармаце, які кожная аперацыйная сістэма адкрывае штатна +- Абмен раздзелам з калегам, у якога няма праграмы для чытання EPUB +- Пераўтварэнне тэхнічнай дакументацыі, распаўсюджанай у EPUB, у PDF, якія можна анатаваць + +## Парады + +- Магчымасці EPUB 3, такія як убудаванае аўдыя і відэа, не пераносяцца ў PDF, але ўвесь тэкст, відарысы і табліцы пераўтвараюцца акуратна. +- Для EPUB са складаным афармленнем праверце першыя некалькі старонак выніку, каб пераканацца ў дакладнасці макета. + +## Звязаныя інструменты + +- [MOBI у PDF](./mobi-to-pdf) +- [FB2 у PDF](./fb2-to-pdf) +- [CBZ у PDF](./cbz-to-pdf) diff --git a/docs/be/tools/excel-to-pdf.md b/docs/be/tools/excel-to-pdf.md new file mode 100644 index 00000000..497c7608 --- /dev/null +++ b/docs/be/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel у PDF +description: Пераўтварайце электронныя табліцы Excel (XLS, XLSX), ODS і файлы CSV у PDF з захаваннем фарматавання. +--- + +# Excel у PDF + +Пераўтварайце файлы электронных табліц у PDF. Інструмент апрацоўвае сучасныя файлы Excel, стары фармат XLS, электронныя табліцы OpenDocument і нават CSV, і ўсё гэта праз рухавік LibreOffice у браўзеры, які захоўвае фарматаванне ячэек, формулы (як вылічаныя значэнні), дыяграмы і макеты з некалькімі аркушамі. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :------------------------------- | :-------- | +| Excel (сучасны) | `.xlsx` | +| Excel (стары) | `.xls` | +| Электронная табліца OpenDocument | `.ods` | +| CSV | `.csv` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы электронных табліц. +2. Праверце спіс файлаў. Дадайце яшчэ файлы або выдаліце непатрэбныя. +3. Націсніце **Пераўтварыць у PDF**. Рухавік LibreOffice ініцыялізуецца пры першым выкарыстанні, а потым апрацоўвае кожны файл. +4. Адзін файл спампоўваецца непасрэдна як PDF. Некалькі файлаў перадаюцца як `excel-converted.zip`. + +## Параметры + +У гэтага інструмента няма дадатковых налад. Рухавік LibreOffice вызначае макет старонкі, маштаб і вобласць друку паводле ўбудаваных налад электроннай табліцы. + +## Вынік + +| Колькасць файлаў | Вынік | +| :--------------- | :--------------------------------------------------------------------- | +| 1 файл | Спампоўванне аднаго PDF (арыгінальная назва файла з пашырэннем `.pdf`) | +| 2+ файлы | Архіў ZIP (`excel-converted.zip`) з адным PDF на кожны файл | + +## Сцэнарыі выкарыстання + +- Пераўтварэнне фінансавых справаздач або бюджэтаў з Excel у PDF для распаўсюджвання +- Стварэнне гатовых да друку PDF з табліц запасаў або каталогаў прадукцыі +- Абмен вынікамі аналізу даных з зацікаўленымі асобамі, у якіх не ўсталяваны Excel +- Архіваванне квартальных справаздач у фармаце, які нельга рэдагаваць +- Пераўтварэнне файлаў ODS з LibreOffice Calc у PDF + +## Парады + +- Дыяграмы, убудаваныя ў электронную табліцу, выводзяцца ў PDF. Перад пераўтварэннем пераканайцеся, што яны правільна выглядаюць у зыходным файле. +- Калі ў электроннай табліцы некалькі аркушаў, усе яны ўключаюцца ў PDF. +- Для простых даных CSV без фарматавання інструмент [CSV у PDF](./csv-to-pdf) дае больш лёгкае пераўтварэнне. Выкарыстоўвайце Excel у PDF, калі трэба захаваць фарматаванне, дыяграмы або некалькі аркушаў. + +## Звязаныя інструменты + +- [CSV у PDF](./csv-to-pdf) +- [Word у PDF](./word-to-pdf) +- [PowerPoint у PDF](./powerpoint-to-pdf) diff --git a/docs/be/tools/extract-attachments.md b/docs/be/tools/extract-attachments.md new file mode 100644 index 00000000..96a05838 --- /dev/null +++ b/docs/be/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Выняць далучэнні +description: Вымайце ўсе ўбудаваныя далучаныя файлы з аднаго або некалькіх PDF і спампоўвайце іх як архіў ZIP. +--- + +# Выняць далучэнні + +Вымайце кожнае ўбудаванае далучэнне з аднаго або некалькіх файлаў PDF. Усе вынятыя файлы збіраюцца ў адзін архіў ZIP для спампоўвання. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі файлаў PDF з убудаванымі далучэннямі. +2. Націсніце **Выняць далучэнні**. +3. Інструмент шукае ў кожным PDF далучэнні на ўзроўні дакумента і старонак. +4. Усе знойдзеныя файлы пакуюцца ў архіў ZIP і спампоўваюцца аўтаматычна. +5. Паведамленне пра стан паказвае, колькі далучэнняў знойдзена і іх агульны памер. + +## Магчымасці + +- Пакетнае выманне з некалькіх PDF адначасова +- Выманне далучэнняў як на ўзроўні дакумента, так і на ўзроўні старонак +- Вынік у выглядзе аднаго файла ZIP з усімі вынятымі файламі +- Паказ агульнай колькасці далучэнняў і іх сумарнага памеру +- Зразумелыя паведамленні, калі далучэнні не знойдзены + +## Сцэнарыі выкарыстання + +- Аднаўленне файлаў даных, убудаваных у PDF справаздачы +- Выманне відарысаў з партфоліо або дакумента са спецыфікацыяй +- Выманне дадатковых матэрыялаў з навучальных PDF або PDF па адпаведнасці +- Аўдыт таго, якія файлы ўбудаваны ў набор PDF + +## Парады + +- Калі інструмент не знаходзіць далучэнняў, PDF можа ўтрымліваць убудаваныя відарысы або даныя форм, якія не з'яўляюцца далучанымі файламі. Для ўбудаваных відарысаў карыстайцеся [Выняць відарысы](./extract-images). +- Пры апрацоўцы некалькіх PDF усе далучэнні з кожнага файла трапляюць у адзін ZIP. Назвы файлаў захоўваюцца з арыгінальных далучэнняў. + +## Звязаныя інструменты + +- [Дадаць далучэнні](./add-attachments) +- [Рэдагаваць далучэнні](./edit-attachments) +- [Выняць відарысы](./extract-images) diff --git a/docs/be/tools/extract-images.md b/docs/be/tools/extract-images.md new file mode 100644 index 00000000..b295e33f --- /dev/null +++ b/docs/be/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Выняць відарысы +description: Вымайце ўсе ўбудаваныя відарысы з файлаў PDF. Праглядайце іх у сетцы і спампоўвайце па адным або архівам ZIP. +--- + +# Выняць відарысы + +Вымае кожны ўбудаваны відарыс з аднаго або некалькіх файлаў PDF. Вынятыя відарысы паказваюцца ў сетцы папярэдняга прагляду, дзе іх можна спампаваць па адным або ўсе адразу архівам ZIP. Працуе на PyMuPDF. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі PDF: націсніце на вобласць загрузкі або перацягніце на яе файлы. Пры патрэбе дадайце яшчэ файлы або выдаліце асобныя. +2. Націсніце **Выняць**, каб пачаць апрацоўку. +3. Інструмент праглядае кожную старонку кожнага загружанага PDF, знаходзіць і вымае ўбудаваныя відарысы. +4. Вынятыя відарысы з'яўляюцца ў сетцы з мініяцюрамі. Кожны відарыс мае кнопку спампоўвання. +5. Націсніце **Спампаваць усё**, каб захаваць усё як архіў ZIP. + +## Параметры + +У гэтага інструмента няма наладжвальных параметраў. Усе ўбудаваныя відарысы вымаюцца ў іх родным фармаце (звычайна PNG, JPEG або той фармат, у якім відарыс быў убудаваны ў PDF). + +## Фармат выніку + +- Відарысы паказваюцца ў сетцы з назвамі `image_1.png`, `image_2.jpg` і г. д. +- **Спампаваць усё** стварае `extracted-images.zip` з усімі відарысамі. +- Асобныя відарысы можна спампоўваць па адным з сеткі. + +## Сцэнарыі выкарыстання + +- Аднаўленне фатаграфій або графікі з PDF для выкарыстання ў іншым праекце. +- Выманне відарысаў тавараў з каталога PDF для інтэрнэт-крамы. +- Выманне дыяграм з тэхнічнай дакументацыі для прэзентацый. +- Аўдыт таго, якія відарысы ўбудаваны ў дакумент, перад абменам ім. + +## Парады + +- Інструмент вымае відарысы дакладна так, як яны захоўваюцца ў PDF. Ён не рэндэрыць старонкі ў відарысы: для гэтага карыстайцеся [PDF у PNG](./pdf-to-png) або [PDF у JPG](./pdf-to-jpg). +- Калі інструмент паведамляе «Відарысы не знойдзены», PDF можа выкарыстоўваць вектарную графіку замест убудаваных растравых відарысаў або быць сканаваным дакументам, дзе ўся старонка з'яўляецца адным вялікім відарысам. +- Пакетная апрацоўка працуе для некалькіх PDF. Усе відарысы з усіх файлаў аб'ядноўваюцца ў адну сетку і адзін ZIP. + +## Звязаныя інструменты + +- [PDF у PNG](./pdf-to-png) +- [PDF у JPG](./pdf-to-jpg) +- [Канструктар рабочага працэсу PDF](./pdf-workflow) diff --git a/docs/be/tools/extract-pages.md b/docs/be/tools/extract-pages.md new file mode 100644 index 00000000..6d64bc01 --- /dev/null +++ b/docs/be/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Выняць старонкі +description: Захоўвайце пэўны дыяпазон старонак з PDF як новы дакумент. +--- + +# Выняць старонкі + +Вымайце набор старонак з PDF і захоўвайце іх як новы файл. Дакладна ўкажыце патрэбныя старонкі з дапамогай дыяпазонаў, і інструмент створыць акуратны PDF толькі з гэтымі старонкамі. + +## Як гэта працуе + +1. Загрузіце файл PDF. Інструмент паказвае назву файла, памер і агульную колькасць старонак. +2. Увядзіце старонкі, якія трэба выняць, з дапамогай дыяпазонаў (напрыклад, `1-5`, `3, 7, 10-12`). +3. Пры жаданні выберыце спампоўванне кожнага дыяпазону як асобнага PDF у архіве ZIP. +4. Націсніце кнопку апрацоўкі. Вынятыя старонкі спампуюцца як новы PDF (або ZIP). + +## Магчымасці + +- Гнуткі сінтаксіс дыяпазонаў: асобныя старонкі, дыяпазоны або спалучэнні праз коску +- Паказ агульнай колькасці старонак пасля загрузкі для зручнасці +- Вынік у выглядзе аднаго агульнага PDF або асобных файлаў у ZIP +- Захоўваюцца арыгінальнае змесціва і фарматаванне старонак + +## Сцэнарыі выкарыстання + +- Выманне кароткага выкладу (першых некалькіх старонак) з аб'ёмнай справаздачы +- Выманне аднаго раздзела з падручніка ў PDF +- Захаванне пэўных старонак з пакета бланкаў як асобных дакументаў +- Стварэнне ўзору дакумента з выбраных старонак большага файла + +## Парады + +- Нумарацыя старонак пачынаецца з 1. Выкарыстоўвайце `1` для першай старонкі, а не `0`. +- Каб выдаліць старонкі, а не выняць іх, карыстайцеся [Выдаліць старонкі](./delete-pages): гэта адваротная аперацыя. +- Калі патрэбны візуальны выбар старонак з мініяцюрамі, карыстайцеся [Падзяліць PDF](./split-pdf) у рэжыме візуальнага выбару. + +## Звязаныя інструменты + +- [Падзяліць PDF](./split-pdf) +- [Выдаліць старонкі](./delete-pages) +- [Аб'яднаць PDF](./merge-pdf) diff --git a/docs/be/tools/extract-tables.md b/docs/be/tools/extract-tables.md new file mode 100644 index 00000000..6a1597cf --- /dev/null +++ b/docs/be/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Выняць табліцы з PDF +description: Знаходзьце і вымайце табліцы з дакументаў PDF. Экспартуйце ў CSV, JSON або Markdown з падзелам па табліцах. +--- + +# Выняць табліцы з PDF + +Знаходзіць усе табліцы ў PDF і дазваляе экспартаваць іх у выбраным фармаце: CSV, JSON або Markdown. Кожная табліца вымаецца асобна з метаданымі пра старонку і пазіцыю. Працуе на рухавіку выяўлення табліц PyMuPDF. + +## Як гэта працуе + +1. Загрузіце PDF: націсніце на вобласць загрузкі або перацягніце на яе файл. +2. Выберыце патрэбны **фармат экспарту**: CSV, JSON або Markdown. +3. Націсніце **Выняць**, каб пачаць апрацоўку. +4. Калі знойдзена адна табліца, яна спампоўваецца як адзін файл. Некалькі табліц даюць архіў ZIP з адным файлам на кожную табліцу. + +## Параметры + +- **Фармат экспарту**: выбар паміж: + - **CSV**: значэнні праз коску з правільным выкарыстаннем двукоссяў для палёў, што ўтрымліваюць коскі, двукоссі або пераносы радкоў. Падыходзіць для электронных табліц і баз даных. + - **JSON**: структура «масіў масіваў», адфарматаваная з водступам у 2 прабелы. Падыходзіць для праграмнай апрацоўкі. + - **Markdown**: фармат табліц з раздзяляльнікамі `|`, які стварае PyMuPDF. Падыходзіць для дакументацыі і файлаў README. + +## Фармат выніку + +- **Адна табліца**: `filename_table.csv` (або `.json` / `.md`) +- **Некалькі табліц**: `filename_tables.zip` з файламі `table_1_page3.csv`, `table_2_page5.csv` і г. д. + +## Сцэнарыі выкарыстання + +- Выманне пэўных табліц з аб'ёмных справаздач PDF без вымання даных усяго дакумента. +- Атрыманне табліц у фармаце Markdown, каб устаўляць іх непасрэдна ў issues на GitHub, вікі або дакументацыю. +- Выманне структураваных даных JSON з табліц PDF для інтэграцый праз API або скрыптоў. +- Параўнанне табліц у розных версіях PDF: экспартуйце абедзве ў CSV і параўнайце. + +## Парады + +- Гэты інструмент дае кантроль над кожнай табліцай. Калі трэба проста выгрузіць усе табліцы ў адзін CSV, карыстайцеся [PDF у CSV](./pdf-to-csv). Для поўнай кнігі Excel карыстайцеся [PDF у Excel](./pdf-to-excel). +- Табліцы, што займаюць некалькі старонак, могуць распазнавацца як асобныя табліцы на кожнай старонцы. Можа спатрэбіцца аб'яднаць іх уручную. +- Калі табліцы не знойдзены, PDF можа быць сканаваным відарысам. Спачатку прапусціце яго праз OCR, каб дадаць тэкставы пласт. + +## Звязаныя інструменты + +- [PDF у CSV](./pdf-to-csv) +- [PDF у Excel](./pdf-to-excel) +- [PDF у тэкст](./pdf-to-text) diff --git a/docs/be/tools/fb2-to-pdf.md b/docs/be/tools/fb2-to-pdf.md new file mode 100644 index 00000000..b5c727f3 --- /dev/null +++ b/docs/be/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 у PDF +description: Пераўтварайце электронныя кнігі FictionBook (FB2) у PDF у браўзеры. Бясплатна, прыватна, без запампоўвання на сервер. +--- + +# FB2 у PDF + +Пераўтварайце файлы FictionBook 2 (FB2) у дакументы PDF. FB2 гэта фармат электронных кніг на аснове XML, папулярны ў Расіі і Усходняй Еўропе. На адных платформах ён добра падтрымліваецца, а на іншых амаль невядомы, таму пераўтварэнне ў PDF робіць вашы кнігі даступнымі для чытання паўсюль. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :------------ | :-------- | :------------------------------------ | +| FictionBook 2 | `.fb2` | Фармат электронных кніг на аснове XML | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце файлы FB2. Можна выбраць некалькі файлаў адразу. +2. Праверце спіс файлаў. Выкарыстоўвайце значок сметніцы, каб выдаліць асобныя файлы, або **Дадаць яшчэ файлы**, каб дадаць новыя. +3. Націсніце **Пераўтварыць у PDF**. Рухавік PyMuPDF разбірае XML-структуру FB2 і выводзіць яе ў выглядзе PDF са старонкамі. +4. Адзін файл спампоўваецца як PDF. Некалькі вынікаў аб'ядноўваюцца ў `fb2-converted.zip`. + +## Параметры + +Налады не патрэбныя. Канвертар аўтаматычна апрацоўвае XML-структуру FB2, захоўваючы падзел на раздзелы, фарматаванне і ўбудаваныя відарысы. + +## Сцэнарыі выкарыстання + +- Чытанне кніг FB2 на прыладах або ў праграмах, якія падтрымліваюць толькі PDF +- Друк рускамоўнай літаратуры, распаўсюджанай у фармаце FB2 +- Архіваванне бібліятэкі FB2 ва ўніверсальна падтрымліваемым фармаце +- Абмен кнігай з чалавекам, чыя чытанка не падтрымлівае FictionBook + +## Парады + +- Файлы FB2 гэта звычайны XML, таму яны звычайна невялікія і хутка пераўтвараюцца нават у браўзеры. +- Калі вашы файлы FB2 сціснутыя як `.fb2.zip`, спачатку распакуйце іх. + +## Звязаныя інструменты + +- [EPUB у PDF](./epub-to-pdf) +- [MOBI у PDF](./mobi-to-pdf) +- [XML у PDF](./xml-to-pdf) diff --git a/docs/be/tools/fix-page-size.md b/docs/be/tools/fix-page-size.md new file mode 100644 index 00000000..eb01cfe2 --- /dev/null +++ b/docs/be/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Уніфікаваць памер старонак +description: Прывядзіце ўсе старонкі PDF да аднаго памеру. Выбірайце стандартныя памеры паперы або задавайце ўласныя. +--- + +# Уніфікаваць памер старонак + +PDF, сабраныя з розных крыніц, часта маюць старонкі рознага памеру: адны Letter, іншыя A4, а некаторыя зусім нестандартныя. Гэты інструмент прыводзіць кожную старонку да аднаго мэтавага памеру, маштабуючы змесціва так, каб яно ўмяшчалася або запаўняла старонку. + +## Як гэта працуе + +1. Запампуйце файл PDF. +2. Выберыце **Мэтавы памер старонкі** у спісе (A4, Letter, Legal, A3, A5, Tabloid або ўласны). +3. Выберыце **Арыентацыю**: «Аўта» захоўвае арыгінальную арыентацыю кожнай старонкі, або можна прымусова задаць кніжную ці альбомную. +4. Выберыце рэжым **Маштабавання змесціва**: «Умясціць» (захоўвае ўсё змесціва, можа дадаць палі) або «Запоўніць» (запаўняе старонку, можа абрэзаць краі). +5. Пры жаданні задайце **Колер фону** для дададзеных палёў. +6. Націсніце **Уніфікаваць памер старонак**. + +## Параметры + +- **Стандартныя памеры**: A4, Letter, Legal, A3, A5, Tabloid +- **Уласныя памеры**: увядзіце шырыню і вышыню ў цалях або міліметрах +- **Арыентацыя**: аўта, кніжная, альбомная +- **Рэжым маштабавання**: «Умясціць» або «Запоўніць» (абрэзка) +- **Колер фону**: любы колер для запаўнення палёў + +## Сцэнарыі выкарыстання + +- Нармалізацыя аб'яднанага PDF, старонкі якога атрыманы з розных сканераў +- Пераўтварэнне дакумента US Letter у A4 для міжнароднага распаўсюджвання +- Падрыхтоўка PDF да друку, дзе патрэбны аднолькавы фармат +- Выпраўленне старонак, якія крыху адхіляюцца ад стандарту (напрыклад, 8.49 x 11.02 цаля замест 8.5 x 11) + +## Парады + +- Выкарыстоўвайце рэжым «Умясціць», каб гарантавана не страціць змесціва. Рэжым «Запоўніць» выглядае акуратней, але можа абрэзаць краі. +- Праверце вынік інструментам «Памеры старонкі», каб пераканацца, што кожная старонка адпавядае мэтаваму памеру. +- Колер фону па змаўчанні белы; выберыце цёмны колер, калі ў дакумента цёмныя палі. + +## Звязаныя інструменты + +- [Памеры старонкі](./page-dimensions): праверка памераў старонак да і пасля выпраўлення +- [Сціснуць PDF](./compress-pdf): памяншэнне памеру файла пасля ўніфікацыі +- [Абрэзаць PDF](./crop-pdf): ручная абрэзка старонак замест аўтамаштабавання diff --git a/docs/be/tools/flatten-pdf.md b/docs/be/tools/flatten-pdf.md new file mode 100644 index 00000000..a5f79272 --- /dev/null +++ b/docs/be/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Звесці PDF +description: Звядзіце інтэрактыўныя формы і анатацыі ў статычнае змесціва. Палі формы становяцца нерэдагаванымі, а анатацыі ўпякаюцца ў старонку. +--- + +# Звесці PDF + +Зводжанне ўбудоўвае інтэрактыўныя элементы (палі формы, выпадальныя спісы, сцяжкі, анатацыі, вылучэнні, нататкі) непасрэдна ў змесціва старонкі. Выгляд застаецца ранейшым, але нічога больш нельга рэдагаваць або выняць. Гэта аналаг друку запоўненай формы і яе сканавання назад, толькі якасць застаецца ідэальнай. + +## Як гэта працуе + +1. Запампуйце адзін або некалькі файлаў PDF. +2. Націсніце **Звесці PDF**. +3. Адзін файл спампоўваецца адразу. Некалькі файлаў ствараюць архіў ZIP. + +Інструмент выкарыстоўвае pdf-lib для зводжання палёў формы (праз `form.flatten()`) і асобны модуль, які ўпякае анатацыі ў паток старонкі. Абедзве аперацыі выконваюцца за адзін праход. + +## Што зводзіцца + +- **Палі формы**: тэкставыя палі, сцяжкі, перамыкачы, выпадальныя спісы, палі подпісу +- **Анатацыі**: каментарыі, вылучэнні, закрэсліванне, падкрэсліванне, нататкі, штампы, рукапісныя анатацыі +- **Інтэрактыўныя элементы**: кнопкі, трыгеры дзеянняў + +## Што застаецца без змен + +- Тэкставае змесціва (застаецца даступным для вылучэння і пошуку) +- Відарысы і графіка +- Макет і памеры старонак +- Закладкі і змест +- Гіперспасылкі (калі яны не з'яўляюцца анатацыямі) + +## Сцэнарыі выкарыстання + +- Блакіроўка запоўненай формы, каб атрымальнікі не маглі змяніць адказы +- Падрыхтоўка PDF да архівавання, калі інтэрактыўныя элементы не патрэбныя +- Выпраўленне праблем адлюстравання, калі анатацыі выглядаюць па-рознаму ў розных праглядальніках +- Гарантыя таго, што падпісаны дакумент нельга змяніць пасля подпісу +- Памяншэнне памеру файла за кошт выдалення азначэнняў палёў формы і аб'ектаў анатацый + +## Парады + +- Зводзьце пасля завяршэння ўсіх правак. Адмяніць зводжанне PDF немагчыма. +- Калі трэба звесці і адначасова выдаліць метаданыя, JavaScript і далучэнні, выкарыстоўвайце інструмент «Ачысціць PDF»: зводжанне ўваходзіць у яго параметры. +- Некаторыя PDF паведамляюць «форма не знойдзена». Гэта нармальна, калі ў дакуменце ёсць толькі анатацыі без палёў формы. + +## Звязаныя інструменты + +- [Ачысціць PDF](./sanitize-pdf): зводжанне формаў плюс выдаленне метаданых, скрыптоў і іншага +- [Растарызаваць PDF](./rasterize-pdf): пераўтварэнне ў PDF на аснове відарысаў для максімальнага зводжання +- [Шрыфт у контуры](./font-to-outline): пераўтварэнне шрыфтоў у вектарныя контуры +- [Зашыфраваць PDF](./protect-pdf): абарона зведзенага PDF паролем diff --git a/docs/be/tools/font-to-outline.md b/docs/be/tools/font-to-outline.md new file mode 100644 index 00000000..671a2f49 --- /dev/null +++ b/docs/be/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Шрыфт у контуры +description: Пераўтварыце ўсе шрыфты PDF у вектарныя контуры для аднолькавага адлюстравання на ўсіх прыладах. Пазбаўляе ад залежнасці ад шрыфтоў. +--- + +# Шрыфт у контуры + +Пераўтварэнне шрыфтоў у контуры ператварае кожны сімвал тэксту з гліфа шрыфту ў вектарны контур. PDF больш не залежыць ад усталяваных шрыфтоў: ён выглядае аднолькава на любой прыладзе, аперацыйнай сістэме і прынтары. Гэта стандартны этап дадрукарскай падрыхтоўкі. + +## Як гэта працуе + +1. Запампуйце адзін або некалькі файлаў PDF. +2. Націсніце **Пераўтварыць у контуры**. +3. Ghostscript пераўтварае ўвесь тэкст у вектарныя контуры. +4. Спампуйце вынік. Некалькі файлаў ствараюць архіў ZIP. + +Наладжваць нічога не трэба. Інструмент выкарыстоўвае Ghostscript (WebAssembly), каб пераўтварыць усе спасылкі на шрыфты ў контуры за адзін праход. + +## Што змяняецца + +- Сімвалы тэксту становяцца вектарнымі крывымі (крывыя Безье) +- Убудоўванне шрыфтоў больш не патрэбнае: PDF самадастатковы на ўзроўні гліфаў +- Памер файла можа павялічыцца, бо вектарныя контуры звычайна займаюць больш, чым спасылкі на шрыфты +- Выгляд захоўваецца дакладна + +## Што вы губляеце + +- Вылучэнне і капіраванне тэксту +- Пошук па тэксце (Ctrl+F перастае працаваць) +- Магчымасць рэдагаваць тэкст +- Даступнасць для чытачоў экрана + +## Сцэнарыі выкарыстання + +- Адпраўка PDF у друкарню, якая патрабуе шрыфтоў у контурах +- Абмен дакументамі з уласнымі або ліцэнзаванымі шрыфтамі з людзьмі, у якіх гэтых шрыфтоў няма +- Прадухіленне замены шрыфтоў, якая змяняе выгляд дакумента ў іншых сістэмах +- Падрыхтоўка PDF для лазернай гравіроўкі або ЧПУ-рэзкі, дзе патрэбны вектарныя дадзеныя +- Карэктнае адлюстраванне PDF з вялікай колькасцю лагатыпаў на ўсіх платформах + +## Парады + +- Захоўвайце арыгінальны PDF. Пераўтварэнне ў контуры незваротнае: контуры нельга вярнуць у рэдагаваны тэкст. +- Калі тэкст павінен заставацца даступным для пошуку, разгледзьце інструмент «Растарызаваць PDF» з наступным OCR. +- PDF з контурамі звычайна большыя. Пасля пераўтварэння запусціце «Сціснуць PDF», калі важны памер файла. + +## Звязаныя інструменты + +- [Звесці PDF](./flatten-pdf): зводжанне формаў і анатацый без змены шрыфтоў +- [Растарызаваць PDF](./rasterize-pdf): пераўтварэнне ў PDF на аснове відарысаў замест вектарных контураў +- [Сціснуць PDF](./compress-pdf): памяншэнне памеру файла пасля пераўтварэння +- [PDF у PDF/A](./pdf-to-pdfa): пераўтварэнне для архівавання пасля пазбаўлення ад залежнасці ад шрыфтоў diff --git a/docs/be/tools/form-creator.md b/docs/be/tools/form-creator.md new file mode 100644 index 00000000..a8d31407 --- /dev/null +++ b/docs/be/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Стварыць форму PDF +description: Стварайце запаўняльныя формы PDF з дапамогай перацягвання тэкставых палёў, сцяжкоў, выпадальных спісаў, перамыкачоў і іншага. +--- + +# Стварыць форму PDF + +Стварайце прафесійныя запаўняльныя формы PDF з нуля або дадавайце палі ў існуючы PDF. Візуальны рэдактар дазваляе перацягваць элементы формы (тэкставыя палі, сцяжкі, выпадальныя спісы, перамыкачы, палі подпісу і іншае) непасрэдна на перадпрагляд старонак. Наладжвайце ўласцівасці палёў, задавайце правілы ўмоўнай бачнасці і экспартуйце цалкам інтэрактыўную форму PDF. + +## Як гэта працуе + +1. Запампуйце існуючы PDF **або** націсніце **Стварыць пусты PDF**, каб пачаць з нуля. +2. Калі ствараеце пусты PDF, выберыце памер старонкі (Letter, A4, A5, Legal, Tabloid, A3 або ўласныя памеры). +3. Адкрыецца рэдактар формаў з панэллю тыпаў палёў і вобласцю перадпрагляду старонкі. +4. Выберыце тып поля на панэлі, затым націсніце на старонку, каб размясціць яго. +5. Перацягвайце палі, каб перамясціць іх. Выкарыстоўвайце маркеры, каб змяніць памеры. +6. Націсніце на поле, каб адкрыць панэль уласцівасцей, дзе можна задаць імя поля, значэнне па змаўчанні, памер шрыфту, выраўноўванне і іншае. +7. Пераходзьце паміж старонкамі з дапамогай элементаў навігацыі. +8. Націсніце **Захаваць**, каб спампаваць гатовы запаўняльны PDF. + +## Магчымасці + +- Размяшчэнне палёў перацягваннем з візуальнымі маркерамі для змены памеру +- Тыпы палёў: тэкставае поле, шматрадковы тэкст, сцяжок, выпадальны спіс, перамыкач, подпіс, дата, лік і штрыхкод +- Панэль уласцівасцей для налады імя, адмеціны, значэння па змаўчанні, памеру шрыфту, колеру, выраўноўвання і праверкі кожнага поля +- Дзеянні палёў і правілы ўмоўнай бачнасці (паказ або хаванне палёў у залежнасці ад значэнняў іншых палёў) +- Навігацыя па старонках для шматстаронкавых формаў +- Выманне існуючых палёў: аўтаматычна знаходзіць і імпартуе палі формы з запампаваных PDF +- Падтрымка як запампаваных PDF, так і пустых старонак у якасці асновы формы +- Некалькі шаблонаў памеру старонкі плюс уласныя памеры +- Генерацыя штрыхкодаў на базе bwip-js +- Кіраванне групамі перамыкачоў + +## Параметры + +**Шаблоны памеру старонкі (для пустых PDF):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Уласны (укажыце шырыню і вышыню) + +**Уласцівасці палёў (залежаць ад тыпу поля):** + +- Імя, адмеціна і тэкст-падказка +- Значэнне па змаўчанні +- Сямейства, памер і колер шрыфту +- Выраўноўванне тэксту (злева, па цэнтры, справа) +- Пераключальнік абавязковага поля +- Пераключальнік «толькі для чытання» +- Максімальная даўжыня для тэкставых палёў +- Спіс варыянтаў для выпадальных спісаў і перамыкачоў +- Дзеянні ўмоўнай бачнасці + +## Сцэнарыі выкарыстання + +- Стварэнне формаў адаптацыі супрацоўнікаў з тэкставымі палямі для асабістых даных і сцяжкамі для пацвярджэння азнаямлення з правіламі +- Стварэнне анкет для кліентаў з выпадальнымі спісамі для выбару паслуг +- Распрацоўка бланкаў заказу з вылічальнымі палямі і штрыхкодамі +- Стварэнне чэк-лістоў інспекцыі з перамыкачамі для ацэнак «прайшоў/не прайшоў» +- Стварэнне апытанняў з умоўнымі дадатковымі пытаннямі, якія з'яўляюцца ў залежнасці ад адказаў + +## Парады + +- Калі вы запампуеце існуючы PDF, інструмент паспрабуе выняць палі формы, якія ўжо ёсць, каб вы маглі іх рэдагаваць або дапаўняць. +- Выкарыстоўвайце групы перамыкачоў, каб стварыць узаемавыключальны выбар. Палі адной групы маюць агульнае імя групы. +- Праверце форму: спампуйце яе і адкрыйце ў інструменце [Запоўніць форму PDF](./form-filler), каб праверыць паводзіны палёў. + +## Звязаныя інструменты + +- [Запоўніць форму PDF](./form-filler) +- [Падпісаць PDF](./sign-pdf) +- [Рэдактар PDF](./edit-pdf) diff --git a/docs/be/tools/form-filler.md b/docs/be/tools/form-filler.md new file mode 100644 index 00000000..0b2ff335 --- /dev/null +++ b/docs/be/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Запоўніць форму PDF +description: Запаўняйце формы PDF, уключаючы формы XFA, непасрэдна ў браўзеры з дапамогай убудаванага праглядальніка. +--- + +# Запоўніць форму PDF + +Адкрыйце PDF з палямі формы і запоўніце яго непасрэдна ва ўбудаваным праглядальніку. Інструмент падтрымлівае як стандартныя палі AcroForm, так і састарэлыя формы XFA (XML Forms Architecture). Пасля запаўнення спампуйце гатовую версію адным націскам. + +## Як гэта працуе + +1. Запампуйце PDF, які змяшчае палі формы. +2. Дакумент адкрываецца ва ўбудаваным праглядальніку PDF, які паказвае палі формы як інтэрактыўныя элементы ўводу. +3. Націскайце на тэкставыя палі, сцяжкі, выпадальныя спісы і перамыкачы, каб запоўніць іх. +4. Націсніце **Захаваць і спампаваць запоўненую форму**, каб атрымаць гатовы PDF. + +## Магчымасці + +- Убудаваны праглядальнік PDF.js з поўнай падтрымкай палёў формы +- Падтрымка стандартных палёў AcroForm (тэкставыя палі, сцяжкі, выпадальныя спісы, перамыкачы) +- Падтрымка састарэлых формаў XFA на аснове XML +- Аўтаматычны памер праглядальніка ў залежнасці ад памераў старонкі +- Паказ файла з назвай і памерам + +## Параметры + +Дадатковых налад няма. Запампуйце форму, запоўніце яе і спампуйце. + +## Сцэнарыі выкарыстання + +- Запаўненне падатковых формаў, страхавых заяў або дзяржаўных дакументаў +- Запаўненне анкет кандыдатаў на працу, атрыманых у выглядзе далучэнняў PDF +- Запаўненне формаў рэгістрацыі пастаўшчыкоў або анкет +- Пацвярджэнне чэк-лістоў адпаведнасці з дапамогай сцяжкоў +- Запаўненне медыцынскіх анкет перад прыёмам + +## Парады + +- Формы XFA гэта састарэлы фармат, які падтрымліваюць толькі некаторыя праглядальнікі PDF. Калі вы адкрываеце PDF з XFA у Chrome або большасці іншых інструментаў і бачыце пустыя старонкі, значыць гэтыя праглядальнікі не падтрымліваюць XFA. Інструмент запаўнення формаў BentoPDF і Firefox карэктна апрацоўваюць XFA. +- Для PDF без палёў формы спачатку дадайце палі інструментам [Стварыць форму PDF](./form-creator), а потым запоўніце іх тут. +- Праглядальнік аўтаматычна падладжвае свой памер пад памеры старонак PDF. + +## Звязаныя інструменты + +- [Стварыць форму PDF](./form-creator) +- [Падпісаць PDF](./sign-pdf) +- [Рэдактар PDF](./edit-pdf) diff --git a/docs/be/tools/header-footer.md b/docs/be/tools/header-footer.md new file mode 100644 index 00000000..d0b81ddd --- /dev/null +++ b/docs/be/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Верхні і ніжні калантытул +description: Дадавайце на старонкі PDF наладжвальны тэкст верхняга і ніжняга калантытулаў з дынамічнымі зменнымі нумароў старонак. +--- + +# Верхні і ніжні калантытул + +Дадавайце тэкст у шэсць пазіцый на старонках PDF: верхні калантытул злева, па цэнтры і справа, ніжні калантытул злева, па цэнтры і справа. Інструмент падтрымлівае дынамічныя зменныя для нумара старонкі і агульнай колькасці старонак, таму можна ствараць шаблоны накшталт «Старонка 3 з 10», якія аўтаматычна абнаўляюцца на кожнай старонцы. + +## Як гэта працуе + +1. Запампуйце файл PDF. +2. З'явіцца панэль параметраў з элементамі фарматавання і шасцю тэкставымі палямі. +3. Увядзіце патрэбны тэкст у любую з пазіцый калантытулаў. +4. Выкарыстоўвайце запаўняльнікі `{page}` і `{total}` для дынамічнай нумарацыі старонак. +5. Наладзьце памер і колер шрыфту і пры жаданні абмяжуйце пэўным дыяпазонам старонак. +6. Націсніце **Дадаць калантытулы**, каб апрацаваць і спампаваць файл. + +## Параметры + +- **Дыяпазон старонак**: пры жаданні абмяжуйце старонкі, на якія дадаюцца калантытулы. Пакіньце пустым, каб ужыць да ўсіх старонак. Фармат: "1-3, 5" (дыяпазоны праз коску). +- **Памер шрыфту**: ад 6 да 24 пунктаў. Па змаўчанні 10. +- **Колер шрыфту**: выберыце любы колер з дапамогай палітры. +- **Верхні калантытул злева / па цэнтры / справа**: тэкставыя палі для верхняй часткі кожнай старонкі. +- **Ніжні калантытул злева / па цэнтры / справа**: тэкставыя палі для ніжняй часткі кожнай старонкі. + +## Магчымасці + +- Шэсць незалежных тэкставых пазіцый на кожнай старонцы +- Дынамічная зменная `{page}`, якая ўстаўляе нумар бягучай старонкі +- Дынамічная зменная `{total}`, якая ўстаўляе агульную колькасць старонак +- Фільтр дыяпазону старонак для выбару пэўных старонак +- Наладжвальны памер і колер шрыфту +- Шрыфт Helvetica для акуратнага прафесійнага выніку + +## Сцэнарыі выкарыстання + +- Даданне «Старонка {page} з {total}» у цэнтр ніжняга калантытула справаздачы +- Размяшчэнне назвы кампаніі ў верхнім калантытуле злева і даты дакумента справа +- Даданне паметак пра канфідэнцыйнасць у ніжні калантытул юрыдычных дакументаў +- Пазначэнне нумароў рэдакцый дакумента на пэўных дыяпазонах старонак + +## Парады + +- Спалучайце `{page}` і `{total}` у адным полі для фарматаў накшталт «Старонка {page} з {total}» або «{page}/{total}». +- Большасць палёў можна пакінуць пустымі і запоўніць толькі патрэбныя пазіцыі. Пустыя палі проста прапускаюцца. +- Для больш складаных калантытулаў з відарысамі або лагатыпамі разгледзьце інструмент [Дадаць вадзяны знак](./add-watermark) з размяшчэннем уверсе старонкі. + +## Звязаныя інструменты + +- [Нумары старонак](./page-numbers) +- [Дадаць вадзяны знак](./add-watermark) +- [Нумарацыя Бейтса](./bates-numbering) diff --git a/docs/be/tools/heic-to-pdf.md b/docs/be/tools/heic-to-pdf.md new file mode 100644 index 00000000..6a64a3bd --- /dev/null +++ b/docs/be/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC у PDF +description: Пераўтварайце відарысы HEIC і HEIF з iPhone і iPad у фармат PDF непасрэдна ў браўзеры. +--- + +# HEIC у PDF + +Пераўтварайце відарысы HEIC/HEIF у PDF. HEIC з'яўляецца стандартным фарматам фота на iPhone і iPad пачынаючы з iOS 11. Гэты інструмент дазваляе ператварыць такія фота ў PDF без усталявання праграм на камп'ютар і без запампоўвання файлаў на сервер. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце файлы HEIC/HEIF. +2. Праверце спіс файлаў і выдаліце непатрэбныя. +3. Націсніце **Пераўтварыць у PDF**. Вынік спампоўваецца як `from_heic.pdf`. + +Кожны файл HEIC дэкадуецца бібліятэкай heic2any, якая пераўтварае яго ў PNG з якасцю 92%. Потым PNG убудоўваецца ў PDF з дапамогай pdf-lib, кожны відарыс на асобнай старонцы ў поўным разрозненні. + +## Параметры + +Дадатковых налад няма. Відарысы HEIC пераўтвараюцца ў PNG з высокай якасцю (0.92) перад убудоўваннем. + +## Сцэнарыі выкарыстання + +- Стварэнне PDF з фота з iPhone для далучэння да страхавой заявы або справаздачы +- Пераўтварэнне фота HEIC для аб'явы аб нерухомасці ў адзін дакумент для друку +- Ператварэнне здымкаў экрана iPad (фармат HEIF) у PDF для абмену +- Пакетнае пераўтварэнне фота з адпачынку для дзённіка падарожжаў + +## Парады + +- Дэкадаванне HEIC цалкам адбываецца ў браўзеры з дапамогай WebAssembly. Першае пераўтварэнне можа заняць крыху часу, пакуль загружаецца дэкодар. +- Калі трэба спалучыць HEIC з іншымі фарматамі відарысаў (JPG, PNG і г.д.), выкарыстоўвайце інструмент [Відарысы ў PDF](./image-to-pdf), які апрацоўвае HEIC разам з усімі іншымі фарматамі. +- Файлы HEIC з iPhone часта змяшчаюць даныя EXIF, у тым ліку каардынаты GPS. Выніковы PDF гэтыя метаданыя не захоўвае. + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [JPG у PDF](./jpg-to-pdf) +- [PNG у PDF](./png-to-pdf) diff --git a/docs/be/tools/image-to-pdf.md b/docs/be/tools/image-to-pdf.md new file mode 100644 index 00000000..48fa7b95 --- /dev/null +++ b/docs/be/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Відарысы ў PDF +description: Пераўтварайце JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD і больш за 10 іншых фарматаў відарысаў у адзін файл PDF. +--- + +# Відарысы ў PDF + +Універсальны канвертар відарысаў у PDF. Запампоўвайце відарысы практычна ў любым фармаце і аб'ядноўвайце іх у адзін дакумент PDF. Кожны відарыс атрымлівае асобную старонку, памер якой адпавядае арыгінальным памерам. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Гэта найшырэйшая падтрымка фарматаў сярод усіх канвертараў відарысаў BentoPDF. Калі вам патрэбны толькі пэўны фармат, выкарыстоўвайце адзін са спецыялізаваных інструментаў. + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце файлы відарысаў. Можна выбраць некалькі файлаў адразу. +2. Праверце спіс файлаў. Выдаліце непатрэбныя файлы значком сметніцы або націсніце **Дадаць яшчэ файлы**, каб дадаць іншыя відарысы. +3. Выберыце ўзровень **Якасці PDF** у спісе. +4. Націсніце **Пераўтварыць у PDF**. Інструмент апрацоўвае відарысы рухавіком PyMuPDF і спампоўвае вынік як `images_to_pdf.pdf`. + +## Параметры + +**Якасць PDF** вызначае сціск відарысаў пры ўбудоўванні ў PDF: + +- **Высокая якасць**: мінімальны сціск, большы памер файла. Найлепш для друку або архівавання. +- **Сярэдняя якасць** (па змаўчанні): збалансаваны сціск. Падыходзіць для большасці задач. +- **Нізкая якасць**: моцны сціск, найменшы памер файла. Падыходзіць для электроннай пошты або хуткага абмену. + +Файлы HEIC і WebP аўтаматычна пераўтвараюцца ў PNG перад убудоўваннем. Гэта адбываецца незаўважна і не патрабуе дадатковых крокаў. + +## Сцэнарыі выкарыстання + +- Аб'яднанне сканаваных чэкаў або дакументаў з камеры тэлефона ў адзін PDF +- Стварэнне фотапартфоліо або лукбука з відарысаў розных фарматаў +- Пераўтварэнне фота з iPhone (HEIC) у PDF для абмену без усталявання праграм +- Зборка макетаў дызайну з экспартаў PSD і здымкаў экрана ў матэрыял для кліента +- Архіваванне папкі з відарысамі ў старых фарматах (PNM, JXR, JP2) у адзін PDF + +## Парады + +- Парадак відарысаў у PDF адпавядае іх парадку ў спісе файлаў. Запампоўвайце іх у патрэбнай паслядоўнасці. +- Для найменшага памеру файла выберыце нізкую якасць. Для сканаў з вялікай колькасцю тэксту візуальная розніца часта нязначная. +- Калі ў вас толькі адзін фармат відарысаў, спецыялізаваныя канвертары (JPG у PDF, PNG у PDF і г.д.) даюць той жа вынік з больш простым інтэрфейсам. + +## Звязаныя інструменты + +- [JPG у PDF](./jpg-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [HEIC у PDF](./heic-to-pdf) +- [WebP у PDF](./webp-to-pdf) diff --git a/docs/be/tools/index.md b/docs/be/tools/index.md new file mode 100644 index 00000000..1ce9b303 --- /dev/null +++ b/docs/be/tools/index.md @@ -0,0 +1,183 @@ +# Даведнік па інструментах + +BentoPDF прапануе **больш за 130 інструментаў** для працы з PDF. Усе інструменты працуюць цалкам у вашым браўзеры: вашы файлы ніколі не пакідаюць прыладу. + +--- + +## Рэдагаванне і анатацыі + +Змяняйце, размячайце і паляпшайце дакументы PDF з дапамогай поўнага набору інструментаў рэдагавання. + +
+ +- [**Рэдактар PDF**](./edit-pdf): анатацыі, вылучэнне, рэдакцыя, каментарыі, даданне фігур і відарысаў, пошук і прагляд PDF. +- [**Рэдагаваць закладкі**](./bookmark): даданне, рэдагаванне, імпарт, выдаленне і выманне закладак PDF. +- [**Змест**](./table-of-contents): стварэнне старонкі зместу з закладак PDF. +- [**Нумары старонак**](./page-numbers): устаўка нумароў старонак у дакумент. +- [**Дадаць пазнакі старонак**](./add-page-labels): пазнакі старонак PDF з рымскімі лічбамі, прэфіксамі і ўласным пачатковым нумарам. +- [**Нумарацыя Бейтса**](./bates-numbering): паслядоўныя нумары Бейтса ў адным або некалькіх файлах PDF. +- [**Дадаць вадзяны знак**](./add-watermark): накладанне тэксту або відарыса на старонкі PDF. +- [**Верхні і ніжні калантытул**](./header-footer): даданне тэксту ўверсе і ўнізе старонак. +- [**Інвертаваць колеры**](./invert-colors): стварэнне цёмнай версіі PDF. +- [**Эфект сканера**](./scanner-effect): PDF, які выглядае як сканаваны дакумент. +- [**Наладзіць колеры**](./adjust-colors): тонкая налада яркасці, кантрасту, насычанасці і іншага. +- [**Колер фону**](./background-color): змена колеру фону PDF. +- [**Змяніць колер тэксту**](./text-color): змена колеру тэксту ў PDF. +- [**Падпісаць PDF**](./sign-pdf): намалюйце, увядзіце або запампуйце свой подпіс. +- [**Дадаць штампы**](./add-stamps): даданне штампаў-відарысаў у PDF праз панэль анатацый. +- [**Выдаліць анатацыі**](./remove-annotations): выдаленне каментарыяў, вылучэнняў і спасылак. +- [**Абрэзаць PDF**](./crop-pdf): абрэзка палёў кожнай старонкі PDF. +- [**Запоўніць форму PDF**](./form-filler): запаўненне формаў непасрэдна ў браўзеры. Таксама падтрымлівае формы XFA. +- [**Стварыць форму PDF**](./form-creator): стварэнне запаўняльных формаў PDF з перацягваннем тэкставых палёў. +- [**Выдаліць пустыя старонкі**](./remove-blank-pages): аўтаматычнае выяўленне і выдаленне пустых старонак. + +
+ +--- + +## Пераўтварэнне ў PDF + +Ператварайце відарысы, дакументы, электронныя кнігі і іншыя фарматы файлаў у PDF. + +
+ +- [**Відарысы ў PDF**](./image-to-pdf): пераўтварэнне JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP і іншых у PDF. +- [**JPG у PDF**](./jpg-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў JPG. +- [**PNG у PDF**](./png-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў PNG. +- [**WebP у PDF**](./webp-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў WebP. +- [**SVG у PDF**](./svg-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў SVG. +- [**BMP у PDF**](./bmp-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў BMP. +- [**HEIC у PDF**](./heic-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў HEIC. +- [**TIFF у PDF**](./tiff-to-pdf): стварэнне PDF з аднаго або некалькіх відарысаў TIFF. +- [**Тэкст у PDF**](./txt-to-pdf): пераўтварэнне звычайнага тэкставага файла ў PDF. +- [**Markdown у PDF**](./markdown-to-pdf): пераўтварэнне Markdown у PDF з жывым перадпраглядам і падсветкай сінтаксісу. +- [**JSON у PDF**](./json-to-pdf): пераўтварэнне файлаў JSON у фармат PDF. +- [**ODT у PDF**](./odt-to-pdf): пераўтварэнне файлаў ODT (OpenDocument Text) у PDF. +- [**CSV у PDF**](./csv-to-pdf): пераўтварэнне табліц CSV у PDF. +- [**RTF у PDF**](./rtf-to-pdf): пераўтварэнне дакументаў RTF (Rich Text Format) у PDF. +- [**Word у PDF**](./word-to-pdf): пераўтварэнне дакументаў Word (DOCX, DOC, ODT) у PDF. +- [**Excel у PDF**](./excel-to-pdf): пераўтварэнне табліц Excel (XLSX, XLS, ODS) у PDF. +- [**PowerPoint у PDF**](./powerpoint-to-pdf): пераўтварэнне прэзентацый PowerPoint (PPTX, PPT, ODP) у PDF. +- [**XPS у PDF**](./xps-to-pdf): пераўтварэнне дакументаў XPS/OXPS у PDF. +- [**MOBI у PDF**](./mobi-to-pdf): пераўтварэнне электронных кніг MOBI у PDF. +- [**EPUB у PDF**](./epub-to-pdf): пераўтварэнне электронных кніг EPUB у PDF. +- [**FB2 у PDF**](./fb2-to-pdf): пераўтварэнне электронных кніг FictionBook (FB2) у PDF. +- [**CBZ у PDF**](./cbz-to-pdf): пераўтварэнне архіваў коміксаў (CBZ/CBR) у PDF. +- [**WPD у PDF**](./wpd-to-pdf): пераўтварэнне дакументаў WordPerfect (WPD) у PDF. +- [**WPS у PDF**](./wps-to-pdf): пераўтварэнне дакументаў WPS Office у PDF. +- [**XML у PDF**](./xml-to-pdf): пераўтварэнне дакументаў XML у PDF. +- [**ODG у PDF**](./odg-to-pdf): пераўтварэнне OpenDocument Graphics (ODG) у PDF. +- [**ODS у PDF**](./ods-to-pdf): пераўтварэнне OpenDocument Spreadsheet (ODS) у PDF. +- [**ODP у PDF**](./odp-to-pdf): пераўтварэнне OpenDocument Presentation (ODP) у PDF. +- [**PUB у PDF**](./pub-to-pdf): пераўтварэнне Microsoft Publisher (PUB) у PDF. +- [**VSD у PDF**](./vsd-to-pdf): пераўтварэнне Microsoft Visio (VSD, VSDX) у PDF. +- [**PSD у PDF**](./psd-to-pdf): пераўтварэнне файлаў Adobe Photoshop (PSD) у PDF. +- [**Email у PDF**](./email-to-pdf): пераўтварэнне файлаў электроннай пошты (EML, MSG) у фармат PDF. + +
+ +--- + +## Пераўтварэнне з PDF + +Вымайце змесціва з PDF у відарысы, дакументы і фарматы даных. + +
+ +- [**PDF у JPG**](./pdf-to-jpg): пераўтварэнне кожнай старонкі PDF у відарыс JPG. +- [**PDF у PNG**](./pdf-to-png): пераўтварэнне кожнай старонкі PDF у відарыс PNG. +- [**PDF у WebP**](./pdf-to-webp): пераўтварэнне кожнай старонкі PDF у відарыс WebP. +- [**PDF у BMP**](./pdf-to-bmp): пераўтварэнне кожнай старонкі PDF у відарыс BMP. +- [**PDF у TIFF**](./pdf-to-tiff): пераўтварэнне кожнай старонкі PDF у відарыс TIFF. +- [**PDF у CBZ**](./pdf-to-cbz): пераўтварэнне PDF у CBZ (архіў коміксаў) для праграм чытання коміксаў і Calibre. +- [**PDF у SVG**](./pdf-to-svg): пераўтварэнне кожнай старонкі PDF у маштабуемую вектарную графіку. +- [**PDF у CSV**](./pdf-to-csv): выманне табліц з PDF і пераўтварэнне ў фармат CSV. +- [**PDF у Excel**](./pdf-to-excel): выманне табліц з PDF і пераўтварэнне ў Excel (XLSX). +- [**PDF у градацыі шэрага**](./pdf-to-greyscale): пераўтварэнне ўсіх колераў у чорна-белыя. +- [**PDF у JSON**](./pdf-to-json): пераўтварэнне файлаў PDF у фармат JSON. +- [**PDF у Word**](./pdf-to-word): пераўтварэнне файлаў PDF у рэдагаваныя дакументы Word. +- [**Выняць відарысы**](./extract-images): выманне ўсіх убудаваных відарысаў з файлаў PDF. +- [**PDF у Markdown**](./pdf-to-markdown): пераўтварэнне тэксту і табліц PDF у фармат Markdown. +- [**Падрыхтаваць PDF для ШI**](./prepare-pdf-for-ai): выманне змесціва PDF у фармаце LlamaIndex JSON для канвеераў RAG/LLM. +- [**PDF у тэкст**](./pdf-to-text): выманне тэксту з файлаў PDF і захаванне ў выглядзе звычайнага тэксту. +- [**Выняць табліцы**](./extract-tables): выманне табліц з PDF у фарматы CSV, JSON або Markdown. + +
+ +--- + +## Арганізацыя і кіраванне + +Пераўпарадкоўвайце, аб'ядноўвайце, дзяліце старонкі і файлы PDF і кіруйце імі. + +
+ +- [**Канструктар рабочага працэсу PDF**](./pdf-workflow): стварэнне ўласных канвеераў апрацоўкі PDF у візуальным рэдактары вузлоў. +- [**Мультыінструмент PDF**](./pdf-multi-tool): поўнафункцыйны рэдактар PDF з кіраваннем старонкамі. +- [**OCR PDF**](./ocr-pdf): PDF з магчымасцю пошуку і капіравання. +- [**Аб'яднаць PDF**](./merge-pdf): аб'яднанне некалькіх PDF у адзін файл. +- [**Чаргаваць і змяшаць старонкі**](./alternate-merge): аб'яднанне PDF з чаргаваннем старонак з кожнага файла. +- [**Сартаванне двухбаковага сканавання**](./duplex-collate): пераўпарадкаванне блокаў сканаў пярэдняга і адваротнага бакоў у правільную паслядоўнасць. +- [**Дубляваць і арганізаваць**](./organize-pdf): дубляванне, пераўпарадкаванне і выдаленне старонак. +- [**Дадаць далучэнні**](./add-attachments): убудоўванне аднаго або некалькіх файлаў у PDF. +- [**Выняць далучэнні**](./extract-attachments): выманне ўсіх убудаваных файлаў з PDF у ZIP. +- [**Рэдагаваць далучэнні**](./edit-attachments): прагляд або выдаленне далучэнняў у PDF. +- [**PDF OCG**](./pdf-layers): прагляд, пераключэнне, даданне і выдаленне слаёў OCG у PDF. +- [**Падзяліць PDF**](./split-pdf): выманне дыяпазону старонак у новы PDF. +- [**Падзяліць старонкі**](./divide-pages): падзел старонак па гарызанталі або вертыкалі. +- [**Выняць старонкі**](./extract-pages): захаванне выбраных старонак як новых файлаў. +- [**Выдаліць старонкі**](./delete-pages): выдаленне пэўных старонак з дакумента. +- [**Дадаць пустую старонку**](./add-blank-page): устаўка пустой старонкі ў любое месца PDF. +- [**Адваротны парадак старонак**](./reverse-pages): змена парадку ўсіх старонак на адваротны. +- [**Павярнуць PDF**](./rotate-pdf): паварот старонак з крокам 90 градусаў. +- [**Павярнуць на зададзены вугал**](./rotate-custom): паварот старонак на любы вугал. +- [**N-Up PDF**](./n-up-pdf): размяшчэнне некалькіх старонак на адным аркушы. +- [**Буклет PDF**](./pdf-booklet): пераўпарадкаванне старонак для двухбаковага друку буклета. +- [**Аб'яднаць у адну старонку**](./combine-single-page): злучэнне ўсіх старонак у адну бесперапынную стужку. +- [**Праглядзець метаданыя**](./view-metadata): прагляд схаваных уласцівасцей PDF. +- [**Рэдагаваць метаданыя**](./edit-metadata): змена аўтара, загалоўка і іншых уласцівасцей. +- [**PDF у ZIP**](./pdf-to-zip): упакоўка некалькіх файлаў PDF у архіў ZIP. +- [**Параўнаць PDF**](./compare-pdfs): параўнанне двух PDF побач. +- [**Пераўтварыць у постэр**](./posterize-pdf): падзел вялікай старонкі на некалькі меншых. + +
+ +--- + +## Аптымізацыя і аднаўленне + +Сціскайце, выпраўляйце і аптымізуйце PDF для лепшай прадукцыйнасці і сумяшчальнасці. + +
+ +- [**Сціснуць PDF**](./compress-pdf): памяншэнне памеру файла PDF. +- [**PDF у PDF/A**](./pdf-to-pdfa): пераўтварэнне PDF у PDF/A для доўгатэрміновага архівавання. +- [**Уніфікаваць памер старонак**](./fix-page-size): прывядзенне ўсіх старонак да аднаго памеру. +- [**Зрабіць лінейны PDF**](./linearize-pdf): аптымізацыя PDF для хуткага прагляду ў вэбе. +- [**Памеры старонкі**](./page-dimensions): аналіз памеру, арыентацыі і адзінак старонкі. +- [**Выдаліць абмежаванні**](./remove-restrictions): зняцце абароны паролем і абмежаванняў бяспекі. +- [**Аднавіць PDF**](./repair-pdf): аднаўленне даных з пашкоджаных файлаў PDF. +- [**Растарызаваць PDF**](./rasterize-pdf): пераўтварэнне PDF у PDF на аснове відарысаў. Зводжанне слаёў і выдаленне тэксту, які можна вылучыць. +- [**Выпрастаць PDF**](./deskew-pdf): аўтаматычнае выпраўленне нахіленых сканаваных старонак з дапамогай OpenCV. +- [**Шрыфт у контуры**](./font-to-outline): пераўтварэнне ўсіх шрыфтоў у вектарныя контуры для аднолькавага адлюстравання. + +
+ +--- + +## Бяспека PDF + +Абараняйце, шыфруйце і кіруйце доступам да дакументаў PDF. + +
+ +- [**Зашыфраваць PDF**](./protect-pdf): абарона PDF паролем. +- [**Ачысціць PDF**](./sanitize-pdf): выдаленне метаданых, анатацый, скрыптоў і іншага. +- [**Расшыфраваць PDF**](./unlock-pdf): разблакіроўка PDF з выдаленнем абароны паролем. +- [**Звесці PDF**](./flatten-pdf): палі формы і анатацыі становяцца нерэдагаванымі. +- [**Выдаліць метаданыя**](./remove-metadata): выдаленне схаваных даных з PDF. +- [**Змяніць дазволы**](./change-permissions): задаванне або змена дазволаў карыстальніка ў PDF. +- [**Лічбавы подпіс PDF**](./digital-sign-pdf): даданне крыптаграфічнага лічбавага подпісу з сертыфікатамі X.509. +- [**Праверыць подпіс PDF**](./validate-signature-pdf): праверка лічбавых подпісаў і прагляд звестак пра сертыфікаты. + +
diff --git a/docs/be/tools/invert-colors.md b/docs/be/tools/invert-colors.md new file mode 100644 index 00000000..e4db2c07 --- /dev/null +++ b/docs/be/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Інвертаваць колеры +description: Інвертуйце ўсе колеры ў PDF, каб стварыць цёмную версію любога дакумента. +--- + +# Інвертаваць колеры + +Ператварыце кожны колер у PDF у адваротны. Белы фон становіцца чорным, чорны тэкст становіцца белым, а ўсе іншыя колеры змяняюцца на дадатковыя. Гэта самы хуткі спосаб стварыць «цёмную» версію любога PDF. + +## Як гэта працуе + +1. Запампуйце файл PDF. +2. Націсніце **Інвертаваць колеры**, каб апрацаваць файл. +3. Інвертаваны PDF спампуецца аўтаматычна. + +Дадатковых налад няма. Інструмент выводзіць кожную старонку як відарыс, інвертуе колеры ўсіх пікселяў і збірае вынік у новы PDF. + +## Магчымасці + +- Інверсія колераў усіх старонак адным націскам +- Апрацоўка кожнай старонкі дакумента +- Захаванне арыгінальных памераў і макета старонак +- Працуе з любым PDF незалежна ад тыпу змесціва (тэкст, відарысы, змешанае) + +## Сцэнарыі выкарыстання + +- Стварэнне цёмных версій падручнікаў або інструкцый для зручнага чытання ўначы +- Падрыхтоўка высокакантрасных версій дакументаў для даступнасці +- Інверсія сканаваных дакументаў, знятых з няправільнай экспазіцыяй +- Стварэнне негатываў PDF з вялікай колькасцю відарысаў для візуальнага аналізу + +## Парады + +- Паколькі інструмент растарызуе старонкі, вынік складаецца з відарысаў. Тэкст больш нельга будзе вылучыць або знайсці. Калі пасля інверсіі патрэбны тэкст з пошукам, апрацуйце вынік інструментам OCR. +- Для больш тонкай налады колераў (яркасць, кантраст, насычанасць) выкарыстоўвайце інструмент [Наладзіць колеры](./adjust-colors). +- Вялікія PDF з мноствам старонак могуць апрацоўвацца даўжэй, бо кожная старонка выводзіцца і інвертуецца асобна. + +## Звязаныя інструменты + +- [Наладзіць колеры](./adjust-colors) +- [Колер фону](./background-color) +- [Эфект сканера](./scanner-effect) diff --git a/docs/be/tools/jpg-to-pdf.md b/docs/be/tools/jpg-to-pdf.md new file mode 100644 index 00000000..026721b3 --- /dev/null +++ b/docs/be/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG у PDF +description: Пераўтварайце адзін або некалькі відарысаў JPG, JPEG і JPEG 2000 у адзін файл PDF непасрэдна ў браўзеры. +--- + +# JPG у PDF + +Ператварайце відарысы JPG у акуратны PDF. Запампуйце адзін файл або некалькі JPG адразу: кожны відарыс становіцца поўнапамернай старонкай выніковага дакумента. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце файлы JPG. Падтрымліваецца выбар некалькіх файлаў. +2. Праверце запампаваныя файлы. Выкарыстоўвайце значок сметніцы, каб выдаліць асобныя файлы, або націсніце **Дадаць яшчэ файлы**, каб дапоўніць спіс. +3. Выберыце ўзровень **Якасці PDF**. +4. Націсніце **Пераўтварыць у PDF**. Інструмент сціскае відарысы згодна з наладай якасці, пераўтварае іх рухавіком PyMuPDF і спампоўвае `from_jpgs.pdf`. + +## Параметры + +**Якасць PDF** вызначае сціск кожнага відарыса перад убудоўваннем у PDF: + +- **Высокая якасць**: захоўвае максімум дэталяў. Для фатаграфій або друку. +- **Сярэдняя якасць** (па змаўчанні): добры баланс паміж выразнасцю і памерам файла. +- **Нізкая якасць**: моцны сціск для найменшага выніку. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне сканаваных дакументаў, захаваных як JPG, у адзін PDF для падачы +- Збор фота тавараў у каталог для кліентаў +- Пераўтварэнне медыцынскіх або спадарожнікавых відарысаў JPEG 2000 у партатыўны PDF +- Стварэнне фотаальбома для друку з экспартаў камеры + +## Парады + +- Файлы JPEG 2000 (`.jp2`, `.jpx`) цалкам падтрымліваюцца, а не толькі стандартны JPEG. Гэта карысна для медыцынскіх відарысаў і геапрасторавых даных. +- Калі вашы JPG зроблены камерай тэлефона, сярэдняя якасць звычайна дае файл на 40-60% меншы, чым высокая, без бачнай розніцы на экране. + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [WebP у PDF](./webp-to-pdf) diff --git a/docs/be/tools/json-to-pdf.md b/docs/be/tools/json-to-pdf.md new file mode 100644 index 00000000..1eed6b90 --- /dev/null +++ b/docs/be/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON у PDF +description: Аднаўляйце файлы PDF з фармату JSON BentoPDF. Пераўтварайце экспарты JSON назад у арыгінальныя дакументы PDF. +--- + +# JSON у PDF + +Аднаўляйце дакументы PDF з файлаў JSON, раней створаных інструментам BentoPDF **PDF у JSON**. Гэта інструмент зваротнага пераўтварэння: ён бярэ структураванае JSON-прадстаўленне PDF і аднаўляе арыгінальны дакумент. + +::: warning +Гэты інструмент прымае толькі файлы JSON, створаныя канвертарам BentoPDF «PDF у JSON». Звычайныя файлы JSON з API, баз даных або іншых інструментаў не падтрымліваюцца. +::: + +## Падтрымліваемыя фарматы + +| Уваход | Апісанне | +| :------ | :----------------------------------------------------------- | +| `.json` | Файлы JSON, экспартаваныя інструментам BentoPDF «PDF у JSON» | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце адзін або некалькі файлаў JSON. +2. Спіс файлаў паказвае кожны выбраны файл з яго памерам. +3. Націсніце **Пераўтварыць у PDF**. Інструмент апрацоўвае ўсе файлы з дапамогай Web Worker і рухавіка CPDF. +4. Вынік спампоўваецца як `jsons-to-pdf.zip`, які змяшчае па адным PDF на кожны ўваходны файл JSON. + +Пераўтварэнне выконваецца ў фонавым Web Worker, таму інтэрфейс застаецца спагадлівым нават з вялікімі файламі. + +## Параметры + +Наладжвальных параметраў няма. Структура JSON цалкам вызначае выніковы PDF. + +## Вынік + +Пры пераўтварэнні некалькіх файлаў JSON вынікі перадаюцца ў архіве ZIP. Кожны PDF называецца паводле зыходнага файла JSON (напрыклад, `report.json` становіцца `report.pdf`). + +## Сцэнарыі выкарыстання + +- Аднаўленне PDF з рэзервовай копіі або архіва на аснове JSON +- Пераўтварэнне PDF у JSON для праверкі і назад у PDF +- Аднаўленне дакументаў пасля праграмных змен у структуры JSON +- Праверка таго, што экспарт PDF у JSON захапіў усё змесціва, праз зваротнае пераўтварэнне + +## Парады + +- Калі трэба пераўтварыць адвольныя даныя JSON (напрыклад, адказы API або файлы канфігурацыі) у адфарматаваны PDF, лепш падыдзе інструмент [Тэкст у PDF](./txt-to-pdf). Устаўце JSON як тэкст, і ён будзе выведзены з належным фарматаваннем. +- Для працы гэтага інструмента павінен быць даступны рухавік CPDF на WebAssembly. Для ўласных разгортванняў трэба наладзіць файлы CPDF WASM. + +## Звязаныя інструменты + +- [Тэкст у PDF](./txt-to-pdf) +- [Markdown у PDF](./markdown-to-pdf) +- [CSV у PDF](./csv-to-pdf) diff --git a/docs/be/tools/linearize-pdf.md b/docs/be/tools/linearize-pdf.md new file mode 100644 index 00000000..c26bb6f3 --- /dev/null +++ b/docs/be/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Зрабіць лінейны PDF +description: Аптымізуйце файлы PDF для хуткага прагляду ў вэбе з паступовай загрузкай. Таксама вядома як аптымізацыя «Fast Web View». +--- + +# Зрабіць лінейны PDF + +Лінеарызацыя перабудоўвае PDF так, каб першую старонку можна было паказаць да таго, як спампуецца ўвесь файл. Adobe называе гэта «Fast Web View». Калі вы размяшчаеце PDF на сайце або раздаяце іх праз партал дакументаў, лінеарызацыя робіць іх адкрыццё значна хутчэйшым. + +## Як гэта працуе + +1. Запампуйце адзін або некалькі файлаў PDF. +2. Націсніце **Лінеарызаваць PDF**. +3. Спампуйце вынікі ў архіве ZIP з усімі лінеарызаванымі файламі. + +Наладжваць нічога не трэба. Інструмент выкарыстоўвае сцяг `--linearize` QPDF, які перабудоўвае ўнутраную структуру PDF, не змяняючы яго выгляду. + +## Што робіць лінеарызацыя + +- Пераўпарадкоўвае аб'екты PDF так, каб даныя першай старонкі былі ў пачатку файла +- Дадае слоўнік лінеарызацыі і табліцы падказак, каб праглядальнікі ведалі, дзе знаходзіцца кожная старонка +- Дазваляе запыты дыяпазонаў байтаў: браўзер можа атрымаць толькі першую старонку без спампоўвання ўсяго файла +- Упарадкоўвае табліцу перакрыжаваных спасылак для эфектыўнага адвольнага доступу + +## Магчымасці + +- Пакетная апрацоўка некалькіх PDF за адну аперацыю +- Вынік захоўвае ўсё змесціва, шрыфты, відарысы і інтэрактыўныя элементы +- Выкарыстоўвае QPDF (WebAssembly) для надзейнай лінеарызацыі ў адпаведнасці са стандартамі +- Вынікі пакуюцца ў ZIP для зручнага спампоўвання + +## Сцэнарыі выкарыстання + +- Размяшчэнне справаздач PDF на сайце, дзе карыстальнікі чакаюць імгненнага паказу старонак +- Убудоўванне PDF у вэб-праграмы з праглядальнікамі ў браўзеры +- Публікацыя каталогаў або інструкцый PDF, якія адкрываюць праз павольнае мабільнае злучэнне +- Падрыхтоўка дакументаў для сетак дастаўкі кантэнту (CDN) з падтрымкай дыяпазонаў байтаў + +## Парады + +- Лінеарызуйце пасля ўсіх іншых правак. Любая наступная змена (аб'яднанне, даданне старонак) парушыць лінеарызацыю. +- Спалучайце з інструментам «Сціснуць PDF», каб атрымаць найменшыя і найхутчэйшыя PDF. +- Лінеарызацыя крыху павялічвае памер файла (звычайна менш за 1%). + +## Звязаныя інструменты + +- [Сціснуць PDF](./compress-pdf): памяншэнне памеру файла перад лінеарызацыяй +- [Аднавіць PDF](./repair-pdf): выпраўленне структурных праблем, якія перашкаджаюць лінеарызацыі +- [Выдаліць метаданыя](./remove-metadata): ачыстка метаданых перад публікацыяй diff --git a/docs/be/tools/markdown-to-pdf.md b/docs/be/tools/markdown-to-pdf.md new file mode 100644 index 00000000..086b5241 --- /dev/null +++ b/docs/be/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown у PDF +description: Пішыце або ўстаўляйце Markdown і экспартуйце яго ў прафесійна адфарматаваны PDF з жывым перадпраглядам і падсветкай сінтаксісу. +--- + +# Markdown у PDF + +Поўнафункцыйны рэдактар Markdown з жывым перадпраглядам і экспартам у PDF адным націскам. Пішыце з нуля, запампуйце існуючы файл `.md` або ўстаўце змесціва з буфера абмену. Рэдактар паказвае ваш Markdown у рэальным часе і экспартуе стыльны PDF праз убудаваны механізм друку браўзера. + +## Падтрымліваемыя фарматы + +| Уваход | Апісанне | +| :-------------- | :---------------------------------- | +| Файлы `.md` | Запампоўванне кнопкай «Запампаваць» | +| Непасрэдны ўвод | Увядзіце або ўстаўце ў рэдактар | + +## Як гэта працуе + +1. Адкрыйце інструмент «Markdown у PDF». Рэдактар загружаецца ў падзеленым выглядзе: зыходны Markdown злева, перадпрагляд справа. +2. Пішыце Markdown, устаўце яго або націсніце **Запампаваць**, каб загрузіць файл `.md`. +3. Пераключайцеся паміж светлай і цёмнай тэмамі паўзунком тэмы на панэлі інструментаў. +4. Націсніце **Экспартаваць PDF** (або `Ctrl/Cmd + S`), каб стварыць PDF праз дыялог друку браўзера. + +## Магчымасці + +Рэдактар падтрымлівае шырокі набор магчымасцей Markdown, акрамя базавых: + +- **Стандартны Markdown**: загалоўкі, тлусты шрыфт, курсіў, спасылкі, відарысы, спісы, цытаты, гарызантальныя лініі +- **Блокі кода** з падсветкай сінтаксісу для больш чым 15 моў (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash і іншыя) +- **Дыяграмы Mermaid**: блок-схемы, дыяграмы паслядоўнасці, ER-дыяграмы і іншыя тыпы дыяграм Mermaid паказваюцца непасрэдна ў перадпраглядзе +- **Табліцы** са стандартным сінтаксісам табліц Markdown +- **Спісы задач** са сцяжкамі +- **Зноскі**, **ніжні індэкс**, **верхні індэкс** +- **Спісы азначэнняў**, **абрэвіятуры** +- Падтрымка **эмодзі** (`:smile:` паказваецца як эмодзі) +- **Вылучэнні** (`==marked text==`) і **ўстаўкі** (`++inserted text++`) +- **Аўтаспасылкі**: звычайныя URL ператвараюцца ў спасылкі +- Генерацыя **зместу** +- **Якары** на загалоўках + +## Сцэнарыі выкарыстання + +- Напісанне праектнай дакументацыі і экспарт акуратнага PDF для зацікаўленых бакоў +- Стварэнне тэхнічных справаздач з прыкладамі кода і архітэктурнымі дыяграмамі Mermaid +- Пераўтварэнне README з GitHub у PDF для афлайн-выкарыстання або друку +- Падрыхтоўка прапановы або спецыфікацыі са спісамі задач і табліцамі +- Стварэнне стыльнага раздатковага матэрыялу з канспектаў лекцый, напісаных у Markdown + +## Парады + +- Вынік PDF выкарыстоўвае функцыю друку ў PDF браўзера. У Chrome можна наладзіць палі і маштаб у дыялогу друку перад захаваннем. +- Дыяграмы Mermaid паказваюцца ў перадпраглядзе, але пры першым выкарыстанні ім можа спатрэбіцца крыху часу на ініцыялізацыю. +- Выкарыстоўвайце спалучэнне `Ctrl/Cmd + S`, каб экспартаваць без націскання кнопкі. + +## Звязаныя інструменты + +- [Тэкст у PDF](./txt-to-pdf) +- [Word у PDF](./word-to-pdf) +- [JSON у PDF](./json-to-pdf) diff --git a/docs/be/tools/merge-pdf.md b/docs/be/tools/merge-pdf.md new file mode 100644 index 00000000..99efb6fc --- /dev/null +++ b/docs/be/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Аб'яднаць PDF +description: Аб'ядноўвайце некалькі файлаў PDF у адзін дакумент з пераўпарадкаваннем перацягваннем і кіраваннем на ўзроўні старонак. +--- + +# Аб'яднаць PDF + +Аб'ядноўвайце некалькі файлаў PDF у адзін дакумент. Можна аб'яднаць цэлыя файлы ў пэўным парадку або пераключыцца ў рэжым старонак для дэталёвага кіравання асобнымі старонкамі з кожнага запампаванага PDF. + +## Як гэта працуе + +1. Запампуйце два або больш файлаў PDF, націснуўшы на вобласць запампоўвання або перацягнуўшы іх. +2. Выберыце **Рэжым файлаў** або **Рэжым старонак** пераключальнікам уверсе. +3. У рэжыме файлаў перацягвайце файлы, каб змяніць іх парадак, і пры жаданні ўказвайце дыяпазоны старонак (напрыклад, `1-3, 5`) для кожнага файла. Пакіньце дыяпазон пустым, каб уключыць усе старонкі. +4. У рэжыме старонак перацягвайце мініяцюры асобных старонак, каб скласці патрэбную паслядоўнасць. +5. Націсніце **Аб'яднаць PDF**, каб злучыць усё ў адзін файл. Аб'яднаны PDF спампуецца аўтаматычна. + +## Магчымасці + +- Два рэжымы аб'яднання: рэжым файлаў для хуткага аб'яднання цэлых файлаў, рэжым старонак для кіравання кожнай старонкай +- Пераўпарадкаванне перацягваннем у абодвух рэжымах з плаўнымі анімацыямі +- Сінтаксіс дыяпазонаў старонак (напрыклад, `1-3, 5, 8-10`) дазваляе выбіраць старонкі без пераходу ў рэжым старонак +- Адкладзеная загрузка мініяцюр старонак захоўвае спагадлівасць інтэрфейсу нават з вялікімі дакументамі +- Без абмежаванняў на колькасць файлаў або агульную колькасць старонак +- Захоўвае арыгінальную якасць PDF без перакадавання + +## Параметры + +| Параметр | Апісанне | +| ------------------ | --------------------------------------------------------------------------------------------------------- | +| **Рэжым файлаў** | Аб'яднанне цэлых файлаў у ўласным парадку з неабавязковымі фільтрамі дыяпазону старонак для кожнага файла | +| **Рэжым старонак** | Візуальная сетка ўсіх старонак з усіх файлаў: перацягвайце мініяцюры, каб скласці патрэбную паслядоўнасць | +| **Поле старонак** | Тэкставае поле для кожнага файла з дыяпазонамі накшталт `1-3, 5`, каб уключыць толькі пэўныя старонкі | + +## Сцэнарыі выкарыстання + +- Аб'яднанне асобных PDF з раздзеламі ў адну кнігу або справаздачу +- Аб'яднанне суправаджальнага ліста і рэзюмэ ў адзін дакумент заяўкі +- Выбар пэўных старонак з некалькіх дакументаў у зводны файл +- Збор сканаваных чэкаў або рахункаў у адзін архіўны PDF +- Стварэнне раздатковага матэрыялу са слайдаў некалькіх прэзентацый + +## Парады + +- Выкарыстоўвайце рэжым старонак, калі трэба чаргаваць старонкі з розных файлаў, а не проста дадаваць адзін файл за адным. +- Пасля першага запампоўвання можна дадаць яшчэ файлы кнопкай **Дадаць яшчэ файлы**, не губляючы бягучага парадку. +- Нумарацыя старонак у дыяпазонах пачынаецца з 1, таму `1` азначае першую старонку файла. + +## Звязаныя інструменты + +- [Падзяліць PDF](./split-pdf) +- [Дубляваць і арганізаваць](./organize-pdf) +- [Чаргаваць і змяшаць старонкі](./alternate-merge) +- [Выдаліць старонкі](./delete-pages) diff --git a/docs/be/tools/mobi-to-pdf.md b/docs/be/tools/mobi-to-pdf.md new file mode 100644 index 00000000..317d1d20 --- /dev/null +++ b/docs/be/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI у PDF +description: Пераўтварайце электронныя кнігі MOBI у PDF непасрэдна ў браўзеры. Бясплатна, прыватна, без запампоўвання файлаў. +--- + +# MOBI у PDF + +Пераўтварайце электронныя кнігі Amazon Kindle MOBI у дакументы PDF. Файлы MOBI прывязаныя да прылад і праграм Kindle, таму іх складана чытаць у іншых месцах. Пераўтварэнне ў PDF дае партатыўную версію, якую можна адкрыць на любой прыладзе або надрукаваць. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----- | :-------- | :------------------------------------------ | +| MOBI | `.mobi` | Фармат электронных кніг Kindle (Mobipocket) | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце адзін або некалькі файлаў MOBI. +2. Праверце спіс файлаў. Выдаліце непатрэбныя файлы значком сметніцы або выкарыстоўвайце **Дадаць яшчэ файлы**, каб дадаць іншыя кнігі. +3. Націсніце **Пераўтварыць у PDF**. Рухавік PyMuPDF разбірае структуру MOBI і выводзіць кожную старонку як змесціва PDF. +4. Адзін файл спампоўваецца як PDF. Пры пераўтварэнні некалькіх файлаў вы атрымаеце архіў ZIP з назвай `mobi-converted.zip`. + +## Параметры + +Дадатковыя налады не патрэбныя. Пераўтварэнне захоўвае тэкст, фарматаванне і ўбудаваныя відарысы з арыгінальнага файла MOBI. + +## Сцэнарыі выкарыстання + +- Чытанне набытага ў Kindle змесціва на іншай чытанцы, якая падтрымлівае толькі PDF +- Друк раздзелаў электроннай кнігі для афлайн-вывучэння або нататак +- Архіваванне асабістай бібліятэкі электронных кніг ва ўніверсальным фармаце +- Абмен урыўкамі з чалавекам, у якога не ўсталявана праграма Kindle + +## Парады + +- Файлы MOBI з абаронай DRM нельга пераўтварыць. Інструмент працуе толькі з файламі MOBI без DRM. +- Вялікія кнігі з мноствам відарысаў могуць апрацоўвацца на некалькі секунд даўжэй, бо ўсё адбываецца ў браўзеры. + +## Звязаныя інструменты + +- [EPUB у PDF](./epub-to-pdf) +- [FB2 у PDF](./fb2-to-pdf) +- [CBZ у PDF](./cbz-to-pdf) diff --git a/docs/be/tools/n-up-pdf.md b/docs/be/tools/n-up-pdf.md new file mode 100644 index 00000000..68765b19 --- /dev/null +++ b/docs/be/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Размяшчайце некалькі старонак PDF на адным аркушы ў выглядзе сеткі для кампактнага друку. +--- + +# N-Up PDF + +Размяшчайце некалькі старонак на адным аркушы ў выглядзе сеткі. Гэта памяншае колькасць друкаваных старонак, змяшчаючы 2, 4, 6, 8, 9 або 16 старонак на аркуш. Інструмент сам маштабуе і размяшчае старонкі і дазваляе наладзіць памер старонкі. + +## Як гэта працуе + +1. Запампуйце файл PDF. +2. Выберыце колькасць старонак на аркуш (значэнне «N»): 2, 4, 6, 8, 9 або 16. +3. Выберыце памер выніковай старонкі (па змаўчанні A4) і арыентацыю. +4. Пры жаданні наладзьце адступы, колер рамкі і колер фону. +5. Націсніце кнопку апрацоўкі. Інструмент маштабуе кожную старонку і размяшчае іх на новых аркушах. + +## Магчымасці + +- Макеты сеткі: 2-up, 4-up, 6-up, 8-up, 9-up і 16-up +- Наладжвальны памер і арыентацыя выніковай старонкі +- Неабавязковыя адступы паміж старонкамі +- Налады колеру фону і рамкі +- Захоўвае прапорцыі арыгінальных старонак пры маштабаванні + +## Параметры + +| Параметр | Апісанне | +| --------------------- | -------------------------------------------------------------------------------- | +| **Старонак на аркуш** | Колькасць арыгінальных старонак на кожнай выніковай старонцы (2, 4, 6, 8, 9, 16) | +| **Памер старонкі** | Памер выніковага аркуша (A4, Letter, Legal і г.д.) | +| **Арыентацыя** | Кніжная або альбомная для выніковага аркуша | +| **Адступ** | Прамежак у пунктах паміж старонкамі | +| **Колер фону** | Колер запаўнення фону выніковага аркуша | +| **Колер рамкі** | Колер рамак вакол кожнай старонкі | + +## Сцэнарыі выкарыстання + +- Друк раздатковых матэрыялаў з 4 слайдамі на старонку для эканоміі паперы +- Стварэнне шпаргалак з некалькімі даведачнымі старонкамі на адным аркушы +- Стварэнне кампактных архіваў дакументаў для захоўвання +- Стварэнне аглядных аркушаў з мініяцюрамі доўгага дакумента + +## Парады + +- Альбомная арыентацыя часта лепш падыходзіць для макетаў 2-up, а кніжная звычайна найлепшая для 4-up і больш. +- Павелічэнне адступу паляпшае чытэльнасць, але памяншае даступную плошчу для кожнай старонкі. +- Для адваротнай аперацыі (падзел адной старонкі на некалькі) гл. [Пераўтварыць у постэр](./posterize-pdf). + +## Звязаныя інструменты + +- [Пераўтварыць у постэр](./posterize-pdf) +- [Буклет PDF](./pdf-booklet) +- [Аб'яднаць у адну старонку](./combine-single-page) diff --git a/docs/be/tools/ocr-pdf.md b/docs/be/tools/ocr-pdf.md new file mode 100644 index 00000000..bdac3e38 --- /dev/null +++ b/docs/be/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Зрабіце сканаваныя PDF даступнымі для пошуку і капіравання з дапамогай Tesseract OCR з падтрымкай некалькіх моў і фільтрацыяй сімвалаў. +--- + +# OCR PDF + +Ператварайце сканаваныя дакументы ў PDF з пошукам і капіраваннем. Інструмент выкарыстоўвае Tesseract OCR для распазнавання тэксту на відарысах і накладае нябачны тэкставы пласт на арыгінальныя старонкі, захоўваючы іх выгляд і робячы змесціва цалкам даступным для пошуку. + +## Як гэта працуе + +1. Запампуйце сканаваны PDF або PDF на аснове відарысаў. +2. Выберыце адну або некалькі моў дакумента ў спісе моў з пошукам. +3. Пры жаданні змяніце пашыраныя налады (разрозненне, бінарызацыя, белы спіс). +4. Націсніце **Пачаць OCR** і сачыце за ходам па індыкатары ў рэальным часе. +5. Пасля завяршэння праглядзіце атрыманы тэкст і спампуйце PDF з пошукам або звычайны файл `.txt`. + +## Магчымасці + +- OCR на некалькіх мовах з пошукам у выбары моў +- Нябачны тэкставы пласт захоўвае арыгінальны выгляд дакумента +- Індыкатар ходу і журнал у рэальным часе падчас апрацоўкі +- Спампоўванне вынікаў як PDF з пошукам або звычайнага тэкставага файла +- Капіраванне вынятага тэксту непасрэдна ў буфер абмену +- Тры ўзроўні разрознення для балансу паміж хуткасцю і дакладнасцю + +## Параметры + +| Налада | Значэнні | Па змаўчанні | Прызначэнне | +| -------------------------------- | ----------------------------------------------------------------------------------------- | ------------ | -------------------------------------------------------------------------------------- | +| **Разрозненне** | Стандартнае (192 DPI), Высокае (288 DPI), Ультра (384 DPI) | Высокае | Больш высокае разрозненне павышае дакладнасць на дробным тэксце, але займае больш часу | +| **Бінарызаваць відарыс** | Укл. / Выкл. | Выкл. | Павышае кантраст чыстых сканаў, пераўтвараючы іх у чорна-белыя | +| **Шаблон белага спіса сімвалаў** | Няма, Літары і лічбы, Лічбы + валюта, Толькі літары, Толькі лічбы, Рахунак, Формы, Уласны | Няма | Абмяжоўвае распазнаваныя сімвалы для павышэння дакладнасці на пэўных тыпах дакументаў | +| **Белы спіс сімвалаў** | Адвольны тэкст | Пуста | Ручны набор сімвалаў, калі выбраны шаблон «Уласны» | + +## Сцэнарыі выкарыстання + +- Пошук па сканаваных дагаворах і рахунках з дапамогай Ctrl+F +- Выманне тэксту з сфатаграфаваных дакументаў або старых папяровых запісаў +- Апрацоўка чэкаў з шаблонам «Рахунак» для дакладнага распазнавання сум у доларах і дат +- Стварэнне даступных PDF са сканаў, якія складаюцца толькі з відарысаў, для выканання патрабаванняў +- Пакетнае выманне тэксту са сканаваных кніг або інструкцый + +## Парады + +- Выберыце некалькі моў, калі дакумент змяшчае тэкст на розных мовах (напрыклад, англійскія загалоўкі і асноўны тэкст на японскай). +- Выкарыстоўвайце бінарызацыю для дакументаў з выцвілым або малакантрасным тэкстам: яна можа значна павысіць дакладнасць распазнавання. +- Шаблоны белага спіса «Рахунак» і «Формы» значна памяншаюць колькасць ілжывых спрацоўванняў на структураваных дакументах, ігнаруючы непатрэбныя формы сімвалаў. + +## Звязаныя інструменты + +- [Выняць табліцы](./extract-tables) +- [Аб'яднаць PDF](./merge-pdf) +- [Сціснуць PDF](./compress-pdf) diff --git a/docs/be/tools/odg-to-pdf.md b/docs/be/tools/odg-to-pdf.md new file mode 100644 index 00000000..b75940df --- /dev/null +++ b/docs/be/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG у PDF +description: Пераўтварайце файлы LibreOffice Draw (ODG) у PDF у браўзеры. Бясплатна, без запампоўвання, цалкам прыватна. +--- + +# ODG у PDF + +Пераўтварайце файлы OpenDocument Graphics у PDF. ODG з'яўляецца ўласным фарматам LibreOffice Draw і выкарыстоўваецца для дыяграм, блок-схем і вектарных ілюстрацый. Пераўтварэнне ў PDF спрашчае абмен, друк і ўбудоўванне гэтых малюнкаў у іншыя дакументы. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :-------------------- | :-------- | :--------------------------------------- | +| OpenDocument Graphics | `.odg` | Файлы LibreOffice Draw / OpenOffice Draw | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце файлы ODG. Можна дадаць некалькі файлаў адразу. +2. Праверце спіс файлаў. Выдаліце асобныя файлы значком сметніцы або націсніце **Дадаць яшчэ файлы**, каб дадаць іншыя малюнкі. +3. Націсніце **Пераўтварыць у PDF**. Рухавік на аснове LibreOffice загружаецца ў браўзеры і пераўтварае кожны файл ODG, захоўваючы вектарную графіку, фігуры і тэкст. +4. Адзін файл спампоўваецца як PDF. Некалькі файлаў ствараюць архіў ZIP з назвай `odg-to-pdf.zip`. + +## Параметры + +Дадатковыя налады не патрэбныя. Пераўтварэнне захоўвае арыгінальныя памеры старонак, фігуры, злучальныя лініі і тэкставыя блокі з зыходнага ODG. + +## Сцэнарыі выкарыстання + +- Абмен дыяграмамі LibreOffice Draw з кліентамі, у якіх не ўсталяваны LibreOffice +- Друк блок-схем і сеткавых дыяграм, створаных у Draw +- Уключэнне ілюстрацый ODG у справаздачу або прэзентацыю ў выглядзе ўбудаваных PDF +- Архіваванне тэхнічных чарцяжоў у фармаце, які застанецца чытэльным дзесяцігоддзямі + +## Парады + +- Вектарныя элементы застаюцца вектарнымі ў выніковым PDF, таму вынік чыста маштабуецца да любога памеру друку. +- Пры першым выкарыстанні рухавіку LibreOffice патрэбны час на ініцыялізацыю. Наступныя пераўтварэнні ў тым жа сеансе хутчэйшыя. + +## Звязаныя інструменты + +- [ODS у PDF](./ods-to-pdf) +- [ODP у PDF](./odp-to-pdf) +- [VSD у PDF](./vsd-to-pdf) diff --git a/docs/be/tools/odp-to-pdf.md b/docs/be/tools/odp-to-pdf.md new file mode 100644 index 00000000..7eadb065 --- /dev/null +++ b/docs/be/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP у PDF +description: Пераўтварайце прэзентацыі LibreOffice Impress (ODP) у PDF у браўзеры. Бясплатна, прыватна, без запампоўвання. +--- + +# ODP у PDF + +Пераўтварайце файлы OpenDocument Presentation у PDF. ODP з'яўляецца ўласным фарматам LibreOffice Impress і стандартным фарматам экспарту з Google Slides. Пасля пераўтварэння ў PDF прэзентацыі можа праглядаць любы чалавек без праграм для прэзентацый, а слайды акуратна друкуюцца. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :------------------------ | :-------- | :------------------------------------------ | +| OpenDocument Presentation | `.odp` | Экспарт LibreOffice Impress / Google Slides | + +## Як гэта працуе + +1. Націсніце на вобласць запампоўвання або перацягніце файлы ODP. Можна выбраць некалькі прэзентацый адразу. +2. Праверце спіс файлаў. Выдаліце файлы значком сметніцы або выкарыстоўвайце **Дадаць яшчэ файлы**, каб дадаць іншыя прэзентацыі. +3. Націсніце **Пераўтварыць у PDF**. Рухавік на аснове LibreOffice апрацоўвае кожную прэзентацыю і стварае PDF, дзе кожны слайд становіцца старонкай. +4. Адзін файл спампоўваецца як PDF. Некалькі файлаў перадаюцца ў архіве ZIP з назвай `odp-to-pdf.zip`. + +## Параметры + +Наладжваць нічога не трэба. Кожны слайд выводзіцца ў арыгінальных памерах, захоўваючы тэкст, відарысы, фігуры і фон слайдаў. + +## Сцэнарыі выкарыстання + +- Распаўсюджванне прэзентацыі сярод аўдыторыі ў выглядзе раздатковага PDF +- Абмен экспартамі Google Slides з людзьмі, якія аддаюць перавагу PDF, а не ODP +- Архіваванне выступаў на канферэнцыях і лекцый у фармаце толькі для чытання +- Друк слайдаў для очных семінараў + +## Парады + +- Пераходы паміж слайдамі і анімацыі з'яўляюцца толькі візуальнымі эфектамі і не пераносяцца ў PDF, але ўсё статычнае змесціва выводзіцца правільна. +- Нататкі дакладчыка не ўключаюцца ў PDF. Калі яны патрэбныя, экспартуйце іх асобна з праграмы для прэзентацый. +- Як і ў іншых інструментах на аснове LibreOffice, рухавік загружаецца пры першым выкарыстанні і застаецца ў кэшы на ўвесь сеанс. + +## Звязаныя інструменты + +- [ODG у PDF](./odg-to-pdf) +- [ODS у PDF](./ods-to-pdf) +- [PUB у PDF](./pub-to-pdf) diff --git a/docs/be/tools/ods-to-pdf.md b/docs/be/tools/ods-to-pdf.md new file mode 100644 index 00000000..30604cdc --- /dev/null +++ b/docs/be/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS у PDF +description: Пераўтварайце электронныя табліцы LibreOffice Calc (ODS) у PDF у браўзеры. Бясплатна, прыватна, без рэгістрацыі. +--- + +# ODS у PDF + +Пераўтварайце файлы OpenDocument Spreadsheet у PDF. ODS з'яўляецца ўласным фарматам LibreOffice Calc і распаўсюджаным фарматам экспарту з Google Sheets. Гэты інструмент ператварае даныя, фарматаванне і дыяграмы вашай табліцы ў PDF са старонкамі, які можна надрукаваць або адправіць. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----------------------- | :-------- | :----------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Экспарт з LibreOffice Calc / Google Sheets | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы ODS. Падтрымліваецца некалькі файлаў. +2. Праверце спіс файлаў. Выдаляйце файлы значком сметніцы або націсніце **Дадаць яшчэ файлы**, каб пашырыць пакет. +3. Націсніце **Пераўтварыць у PDF**. Рухавік на аснове LibreOffice загружаецца ў браўзеры і ператварае кожную табліцу ў старонкі PDF. +4. Адна табліца спампоўваецца як PDF. Некалькі файлаў пакуюцца ў `ods-to-pdf.zip`. + +## Налады + +Налады не патрэбныя. Канвертар ужывае да PDF існуючы макет друку, фарматаванне ячэек і шырыню слупкоў табліцы. + +## Сцэнарыі выкарыстання + +- Адпраўка бюджэту або справаздачы з LibreOffice Calc таму, хто прымае толькі PDF +- Друк экспарту з Google Sheets, спампаванага ў фармаце ODS +- Архіваванне фінансавых запісаў у нерэдагаваным фармаце +- Падача форм або табеляў на аснове ODS як дакументаў з фіксаваным макетам + +## Парады + +- Калі ў табліцы некалькі аркушаў, усе яны ўключаюцца ў PDF. +- Вельмі шырокія табліцы могуць займаць некалькі старонак PDF па гарызанталі. Калі макет важны, падумайце пра змяненне шырыні слупкоў у зыходным файле перад пераўтварэннем. +- Рухавік LibreOffice ініцыялізуецца пры першым выкарыстанні. Наступныя пераўтварэнні ў той жа сесіі хутчэйшыя. + +## Звязаныя інструменты + +- [ODG у PDF](./odg-to-pdf) +- [ODP у PDF](./odp-to-pdf) +- [XML у PDF](./xml-to-pdf) diff --git a/docs/be/tools/odt-to-pdf.md b/docs/be/tools/odt-to-pdf.md new file mode 100644 index 00000000..41d97fd9 --- /dev/null +++ b/docs/be/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT у PDF +description: Пераўтварайце файлы OpenDocument Text (ODT) у PDF у браўзеры з дапамогай рухавіка на аснове LibreOffice. +--- + +# ODT у PDF + +Пераўтварайце файлы OpenDocument Text у PDF. ODT з'яўляецца ўласным фарматам LibreOffice Writer, Apache OpenOffice і іншых тэкставых рэдактараў з адкрытым кодам. Гэты інструмент выкарыстоўвае рухавік LibreOffice у браўзеры для дакладнага пераўтварэння з захаваннем фарматавання, табліц, відарысаў і стыляў. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :---------------- | :-------- | +| OpenDocument Text | `.odt` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце адзін ці некалькі файлаў ODT. +2. Праверце спіс файлаў. Дадайце яшчэ файлы або выдаліце непатрэбныя. +3. Націсніце **Пераўтварыць у PDF**. Рухавік LibreOffice ініцыялізуецца (індыкатар паказвае ход загрузкі), затым кожны файл пераўтвараецца. +4. Адзін файл спампоўваецца непасрэдна як PDF. Некалькі файлаў пакуюцца ў `odt-converted.zip`. + +## Налады + +У гэтага інструмента няма дадатковых налад. Пераўтварэнне як мага дакладней захоўвае фарматаванне арыгінальнага дакумента. + +## Вынік + +| Колькасць файлаў | Вынік | +| :--------------- | :-------------------------------------------------------- | +| 1 файл | Адзін PDF (напрыклад, `document.pdf`) | +| 2+ файлы | Архіў ZIP (`odt-converted.zip`) з адным PDF на кожны файл | + +## Сцэнарыі выкарыстання + +- Пераўтварэнне дакументаў LibreOffice Writer у PDF для карыстальнікаў Microsoft Office +- Стварэнне гатовых да друку PDF з навуковых работ у фармаце OpenDocument +- Пакетнае пераўтварэнне папкі шаблонаў ODT у PDF для распаўсюджвання +- Стварэнне PDF з файлаў ODT, згенераваных аўтаматычнымі сістэмамі + +## Парады + +- Рухавік LibreOffice загружаецца пры першым выкарыстанні і кэшуецца для наступных пераўтварэнняў. Першая загрузка займае некалькі секунд, пасля гэтага пераўтварэнні хуткія. +- Складаныя дакументы з убудаванымі аб'ектамі OLE або незвычайнымі шрыфтамі могуць выглядаць крыху інакш, чым у настольным LibreOffice. Праверце на ўзоры перад пакетным пераўтварэннем. +- Для дакументаў Word (`.doc`, `.docx`) выкарыстоўвайце інструмент [Word у PDF](./word-to-pdf): ён таксама працуе на рухавіку LibreOffice, але прымае фарматы Microsoft напрамую. + +## Звязаныя інструменты + +- [Word у PDF](./word-to-pdf) +- [RTF у PDF](./rtf-to-pdf) +- [Тэкст у PDF](./txt-to-pdf) diff --git a/docs/be/tools/organize-pdf.md b/docs/be/tools/organize-pdf.md new file mode 100644 index 00000000..ba040508 --- /dev/null +++ b/docs/be/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Дубляваць і арганізаваць +description: Змяняйце парадак, дублюйце і выдаляйце старонкі PDF з дапамогай мініяцюр з перацягваннем і ўласнага парадку старонак. +--- + +# Дубляваць і арганізаваць + +Пераўпарадкоўвайце, дублюйце і выдаляйце старонкі PDF у візуальным інтэрфейсе з перацягваннем. Кожная старонка паказваецца як мініяцюра, якую можна перамясціць, скапіяваць або выдаліць перад захаваннем выніку ў новы файл. + +## Як гэта працуе + +1. Загрузіце адзін файл PDF. +2. Інструмент паказвае сетку мініяцюр усіх старонак. +3. Перацягвайце мініяцюры, каб змяніць парадак, націсніце зялёную кнопку дублявання, каб скапіяваць старонку, або чырвоную кнопку выдалення, каб яе выдаліць. +4. Або ўвядзіце ўласны парадак старонак у тэкставае поле (напрыклад, `3, 1, 2, 4`) і націсніце **Ужыць**, каб пераўпарадкаваць усе старонкі адразу. +5. Націсніце кнопку апрацоўкі, каб сабраць і спампаваць пераўпарадкаваны PDF. + +## Магчымасці + +- Змяненне парадку старонак перацягваннем з анімацыяй +- Кнопкі дублявання і выдалення для кожнай старонкі +- Уласны парадак старонак для дакладнага пераўпарадкавання +- Нумары старонак абнаўляюцца аўтаматычна пасля кожнай змены +- Нельга выдаліць апошнюю старонку + +## Сцэнарыі выкарыстання + +- Перамяшчэнне памылкова размешчанай старонкі на правільнае месца ў справаздачы +- Дубляванне старонкі формы, каб мець некалькі пустых копій у адным файле +- Выдаленне чарнавых старонак або запаўняльнікаў перад распаўсюджваннем дакумента +- Адваротны або перамешаны парадак старонак для падрыхтоўкі да друку +- Стварэнне ўласнай паслядоўнасці старонак без паўторнага аб'яднання файлаў + +## Парады + +- Поле ўласнага парадку чакае арыгінальныя нумары старонак праз коску. Кожная старонка павінна быць указана роўна адзін раз, без пропускаў і паўтораў. +- Пасля дублявання абедзве копіі спасылаюцца на той самы арыгінальны індэкс старонкі. Кожную копію можна перамяшчаць незалежна. +- Для масавых аперацый з некалькімі файламі або больш складаных працэсаў лепш выкарыстаць [Мультыінструмент PDF](./pdf-multi-tool). + +## Звязаныя інструменты + +- [Аб'яднаць PDF](./merge-pdf) +- [Выдаліць старонкі](./delete-pages) +- [Мультыінструмент PDF](./pdf-multi-tool) +- [Адваротны парадак старонак](./reverse-pages) diff --git a/docs/be/tools/page-dimensions.md b/docs/be/tools/page-dimensions.md new file mode 100644 index 00000000..a87ca1c9 --- /dev/null +++ b/docs/be/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Памеры старонкі +description: Аналізуйце памеры, арыентацыю, суадносіны бакоў і паварот старонак PDF. Выяўляйце дакументы са змешанымі памерамі і экспартуйце даныя ў CSV. +--- + +# Памеры старонкі + +Дыягнастычны інструмент, які чытае кожную старонку PDF і паказвае яе дакладныя памеры, арыентацыю, назву стандартнага фармату, суадносіны бакоў, плошчу і паварот. Карысны, каб заўважыць старонкі розных памераў перад друкам або задакументаваць уласцівасці атрыманага PDF. + +## Як гэта працуе + +1. Загрузіце файл PDF. Аналіз пачынаецца аўтаматычна, націскаць кнопку не трэба. +2. Панэль зводкі паказвае колькасць старонак, колькасць унікальных памераў і ці ёсць у дакуменце змешаныя памеры. +3. Праглядзіце поўную табліцу вынікаў з падрабязнасцямі па кожнай старонцы. +4. Пераключайце адзінкі паміж пунктамі, цалямі, міліметрамі і пікселямі. +5. Націсніце **Экспарт у CSV**, каб захаваць даныя. + +## Палі справаздачы + +| Слупок | Апісанне | +| ----------------- | ------------------------------------------------- | +| Старонка № | Паслядоўны нумар старонкі | +| Памеры | Шырыня x Вышыня ў выбраных адзінках | +| Стандартны фармат | Знойдзеная назва (A4, Letter і г.д.) або «Уласны» | +| Арыентацыя | Кніжная або альбомная | +| Суадносіны бакоў | Адносіны шырыні да вышыні ў выглядзе дробу | +| Плошча | Плошча старонкі ў квадратных выбраных адзінках | +| Паварот | Паварот старонкі ў градусах | + +## Магчымасці + +- Аўтаматычнае вызначэнне стандартных фарматаў паперы (A3, A4, A5, Letter, Legal, Tabloid і іншыя) +- Папярэджанне пра змешаныя памеры з разбіўкай, якія памеры ёсць і колькі старонак кожнага +- Пераўтварэнне адзінак паміж пунктамі, цалямі, міліметрамі і пікселямі (пры 96 PPI) +- Экспарт у CSV для электронных табліц або сістэм дакументацыі + +## Сцэнарыі выкарыстання + +- Праверка, што ўсе старонкі A4, перад адпраўкай дакумента ў друкарню +- Высвятленне, чаму аб'яднаны PDF друкуецца з нечаканымі палямі на некаторых старонках +- Дакументаванне макета старонак вялікага архіва PDF для запісаў метаданых +- Пошук павернутых старонак, якія трэба выправіць + +## Парады + +- Калі зводка паказвае «Змешаныя памеры», выкарыстайце інструмент «Уніфікаваць памер старонак» перад друкам. +- Поле павароту дапамагае знайсці старонкі, якія адлюстроўваюцца правільна, але маюць ненулявы атрыбут павароту, што можа выклікаць праблемы ў некаторых працэсах. + +## Звязаныя інструменты + +- [Уніфікаваць памер старонак](./fix-page-size): выраўноўвае старонкі пасля выяўлення змешаных памераў +- [Сціснуць PDF](./compress-pdf): аптымізуе PDF пасля выпраўлення старонак +- [Павярнуць PDF](./rotate-pdf): выпраўляе павернутыя старонкі diff --git a/docs/be/tools/page-numbers.md b/docs/be/tools/page-numbers.md new file mode 100644 index 00000000..b4c616af --- /dev/null +++ b/docs/be/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Нумары старонак +description: Дадавайце нумары старонак у любое месца старонак PDF з наладай шрыфту, памеру і колеру. +--- + +# Нумары старонак + +Дадавайце бачныя нумары на кожную старонку PDF. Вы выбіраеце месца, фармат, памер шрыфту і колер, а астатняе зробіць інструмент. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Наладзьце нумары старонак на панэлі налад, якая з'явіцца. +3. Націсніце **Дадаць нумары старонак**, каб апрацаваць файл. +4. PDF з нумарамі спампуецца аўтаматычна. + +## Налады + +- **Размяшчэнне**: выберыце, дзе будуць нумары: унізе па цэнтры, унізе злева, унізе справа, уверсе па цэнтры, уверсе злева або ўверсе справа. +- **Фармат**: простая нумарацыя (1, 2, 3...) або фармат «старонка X з Y» (1 / 5, 2 / 5...). +- **Памер шрыфту**: памер тэксту нумара. Па змаўчанні 12. +- **Колер**: любы колер тэксту нумара праз палітру колераў. + +## Магчымасці + +- Шэсць варыянтаў размяшчэння: усе куты і цэнтр +- Два фарматы нумарацыі: простая паслядоўная або «старонка X з Y» +- Памер шрыфту ад 6 да 72 пунктаў +- Поўная палітра для колеру тэксту +- Аўтаматычныя водступы ўтрымліваюць нумары ў бяспечнай зоне пры любым памеры старонкі + +## Сцэнарыі выкарыстання + +- Падрыхтоўка да друку дакументаў, якім патрэбныя бачныя нумары старонак +- Нумарацыя аб'яднанага PDF, сабранага з некалькіх файлаў +- Нумарацыя раздатковых матэрыялаў прэзентацыі перад распаўсюджваннем +- Паслядоўная нумарацыя юрыдычных дакументаў або дагавораў + +## Парады + +- Фармат «старонка X з Y» карысны для дакументаў, дзе чытачу трэба ведаць агульны аб'ём, напрыклад прапаноў або справаздач. +- Калі патрэбныя розныя стылі нумарацыі для розных раздзелаў (напрыклад, рымскія лічбы для ўступнай часткі), выкарыстайце інструмент [Дадаць пазнакі старонак](./add-page-labels). + +## Звязаныя інструменты + +- [Дадаць пазнакі старонак](./add-page-labels) +- [Нумарацыя Бейтса](./bates-numbering) +- [Верхні і ніжні калантытул](./header-footer) diff --git a/docs/be/tools/pdf-booklet.md b/docs/be/tools/pdf-booklet.md new file mode 100644 index 00000000..547dcaa3 --- /dev/null +++ b/docs/be/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Буклет PDF +description: Пераўпарадкоўвайце старонкі PDF у парадак буклета (шыццё скобай) для згінання і сшывання ў друкаваны буклет. +--- + +# Буклет PDF + +Пераўпарадкоўвае старонкі PDF у парадак спуска палос для буклета. Пасля двухбаковага друку і згінання напалову старонкі будуць ісці ў правільнай паслядоўнасці. Такі макет выкарыстоўваецца для буклетаў і зінаў, сшытых скобай. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Наладзьце буклет: памер і арыентацыю выходных старонак. +3. Націсніце **Стварыць папярэдні прагляд**, каб убачыць, як старонкі размесцяцца на кожным аркушы. +4. Праглядзіце папярэдні прагляд: ён паказвае кожны фізічны аркуш са старонкамі на ліцавым і адваротным баку. +5. Націсніце **Спампаваць**, каб захаваць PDF у парадку буклета. + +## Магчымасці + +- Аўтаматычнае пераўпарадкаванне старонак для шыцця скобай +- Налада памеру выходных старонак +- Візуальны папярэдні прагляд макета буклета перад спампоўваннем +- Пры няцотнай колькасці старонак пры неабходнасці дадаюцца пустыя +- Зыходныя старонкі маштабуюцца пад памер аркуша буклета + +## Сцэнарыі выкарыстання + +- Стварэнне буклетаў або зінаў для друку са звычайнага PDF +- Падрыхтоўка праграм канферэнцый або даведнікаў мерапрыемстваў для друку ўласнымі сіламі +- Выраб складаных паштовак або невялікіх каталогаў +- Стварэнне невялікіх кніжак або паэтычных зборнікаў для ручнога пераплёту + +## Парады + +- Для акуратнага буклета колькасць старонак зыходнага PDF лепш мець кратнай 4. Калі гэта не так, пустыя старонкі дадаюцца аўтаматычна, каб запоўніць апошні аркуш. +- Надрукуйце вынік з двух бакоў з наладай прынтара «пераварот па кароткім краі», затым складзіце ўсе аркушы разам і сшыйце па згібе. +- Каб проста размясціць некалькі старонак на адным аркушы без парадку буклета, выкарыстайце [N-Up PDF](./n-up-pdf). + +## Звязаныя інструменты + +- [N-Up PDF](./n-up-pdf) +- [Павярнуць PDF](./rotate-pdf) +- [Дадаць пустую старонку](./add-blank-page) diff --git a/docs/be/tools/pdf-layers.md b/docs/be/tools/pdf-layers.md new file mode 100644 index 00000000..109f63be --- /dev/null +++ b/docs/be/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCG +description: Праглядайце, пераключайце, дадавайце і выдаляйце пласты Optional Content Group (OCG) у дакуменце PDF. +--- + +# PDF OCG + +Кіруйце групамі дадатковага змесціва (OCG), якія звычайна называюць «пластамі», у PDF. Можна пераключаць бачнасць пластоў, дадаваць новыя пласты (у тым ліку ўкладзеныя даччыныя), выдаляць пласты і захоўваць змены ў PDF. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Націсніце кнопку апрацоўкі, каб загрузіць дакумент рухавіком PyMuPDF. +3. Інструмент паказвае ўсе існуючыя пласты з іх бачнасцю, станам блакіроўкі і іерархіяй укладзенасці. +4. Адзначайце сцяжкі, каб паказаць або схаваць пласты. Заблакіраваныя пласты пераключыць нельга. +5. Дадавайце новыя пласты верхняга ўзроўню, увёўшы назву і націснуўшы кнопку дадавання, або даччыныя пласты пад існуючым бацькоўскім. +6. Выдаляйце непатрэбныя пласты. +7. Націсніце **Захаваць**, каб спампаваць PDF са змененымі пластамі. + +## Магчымасці + +- Іерархія пластоў з адступамі для ўкладзеных пластоў +- Уключэнне і выключэнне бачнасці пластоў +- Індыкатар блакіроўкі абараняе ад выпадковых змен +- Дадаванне пластоў верхняга ўзроўню або даччыных з уласнымі назвамі +- Выдаленне асобных пластоў +- Захаванне ўсіх змен у новы файл PDF + +## Сцэнарыі выкарыстання + +- Пераключэнне бачнасці пластоў з разметкай у архітэктурных або інжынерных чарцяжах +- Дадаванне новых пластоў анатацый у шматпластавы дызайнерскі дакумент +- Выдаленне састарэлых пластоў з шаблона перад распаўсюджваннем +- Праверка, якія пласты ёсць у складаным PDF, атрыманым ад іншага боку + +## Парады + +- Калі ў PDF няма пластоў, інструмент паказвае пусты стан з прапановай дадаць пласт. Не ўсе PDF выкарыстоўваюць пласты OCG: часцей за ўсё яны сустракаюцца ў экспарце з CAD і дызайнерскіх файлах. +- Даччыныя пласты паказваюцца з адступам пад бацькоўскім. Укладваць пласты можна на любую глыбіню. +- Заблакіраваныя пласты паказваюцца са значком замка, а іх сцяжкі неактыўныя. Гэтыя блакіроўкі задае стваральнік PDF. + +## Звязаныя інструменты + +- [Праглядзець метаданыя](./view-metadata) +- [Рэдагаваць метаданыя](./edit-metadata) +- [Дубляваць і арганізаваць](./organize-pdf) diff --git a/docs/be/tools/pdf-multi-tool.md b/docs/be/tools/pdf-multi-tool.md new file mode 100644 index 00000000..784d0b21 --- /dev/null +++ b/docs/be/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Мультыінструмент PDF +description: Універсальны менеджар старонак для аб'яднання, падзелу, павароту, дублявання, выдалення і змены парадку старонак PDF. +--- + +# Мультыінструмент PDF + +Адзінае працоўнае асяроддзе для ўсіх аперацый са старонкамі PDF. Загрузіце адзін ці некалькі PDF і працуйце з усімі старонкамі ў адной візуальнай сетцы. Паварочвайце, пераўпарадкоўвайце, дублюйце, выдаляйце, устаўляйце новыя PDF, дадавайце пустыя старонкі і дзяліце вынік, не пакідаючы інструмента. + +## Як гэта працуе + +1. Націсніце **Загрузіць PDF** або перацягніце файлы ў вобласць загрузкі. Падтрымліваецца некалькі файлаў. +2. Усе старонкі з кожнага загружанага файла з'яўляюцца ў сетцы мініяцюр з пракруткай. +3. Выкарыстоўвайце панэль інструментаў або кнопкі на кожнай старонцы для працы са старонкамі. +4. Вылучайце старонкі сцяжком на кожнай картцы, затым ужывайце масавыя аперацыі. +5. Адзначайце пункты падзелу значком нажніц, каб падзяліць вынік на асобныя файлы. +6. Націсніце **Экспартаваць PDF**, каб спампаваць канчатковы вынік. Калі ёсць маркеры падзелу, вынікам будзе ZIP з некалькімі PDF. + +## Магчымасці + +- **Аб'яднанне**: загрузіце некалькі PDF, і яны аўтаматычна аб'яднаюцца ў адно працоўнае асяроддзе +- **Змяненне парадку**: перацягвайце карткі старонак, каб змяніць паслядоўнасць +- **Паварот**: паварот асобных або некалькіх старонак з крокам 90 градусаў (улева або ўправа) +- **Дубляванне**: капіяванне любой старонкі адным націскам +- **Выдаленне**: выдаленне асобных старонак або ўсіх вылучаных +- **Уставіць PDF**: дадаванне новага PDF пасля любой старонкі +- **Дадаць пустую старонку**: дадаванне пустой старонкі A4 у канец +- **Падзел**: размясціце маркеры падзелу паміж старонкамі і экспартуйце ZIP з асобнымі PDF +- **Вылучыць усё / Зняць вылучэнне**: хуткае вылучэнне для масавых аперацый +- **Адрабіць / Паўтарыць**: поўная гісторыя адмены і паўтору для кожнай аперацыі +- **Спампаваць вылучанае**: экспарт толькі вылучаных старонак як асобнага PDF +- Аўтаматычнае аднаўленне пашкоджаных PDF перад загрузкай + +## Сцэнарыі выкарыстання + +- Стварэнне ўласнага дакумента са старонак некалькіх зыходных PDF +- Ачыстка сканаванага дакумента: выдаленне пустых старонак, паварот бакавых сканаў і змяненне парадку раздзелаў +- Падзел вялікага PDF па межах раздзелаў з дапамогай візуальных маркераў +- Хуткае рэдагаванне старонак без поўнага рэдактара PDF + +## Парады + +- Сістэма адмены і паўтору адсочвае кожную аперацыю. Карыстайцеся ёй смела: выпадкова знішчыць сваю працу не атрымаецца. +- Маркеры падзелу паказваюцца як сінія пункцірныя лініі паміж старонкамі. Размясціце іх там, дзе трэба падзяліць дакумент, і экспартуйце ZIP. +- Для простага аб'яднання або падзелу спецыяльныя інструменты [Аб'яднаць PDF](./merge-pdf) і [Падзяліць PDF](./split-pdf) могуць быць хутчэйшыя. Мультыінструмент найлепшы, калі ў адной сесіі патрэбныя некалькі аперацый. + +## Звязаныя інструменты + +- [Аб'яднаць PDF](./merge-pdf) +- [Падзяліць PDF](./split-pdf) +- [Дубляваць і арганізаваць](./organize-pdf) +- [Павярнуць PDF](./rotate-pdf) diff --git a/docs/be/tools/pdf-to-bmp.md b/docs/be/tools/pdf-to-bmp.md new file mode 100644 index 00000000..ce0e9bf1 --- /dev/null +++ b/docs/be/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF у BMP +description: Пераўтварайце старонкі PDF у несціснутыя відарысы BMP. Карысна для састарэлых сістэм і працэсаў друку, якім патрэбны растравы ўвод. +--- + +# PDF у BMP + +Пераўтварае кожную старонку PDF у відарыс BMP (Bitmap). BMP з'яўляецца несціснутым фарматам, таму вынік дакладны да пікселя без страты якасці, але файлы вялікія. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Націсніце **Пераўтварыць**, каб апрацаваць файл. +3. Адзін файл `.bmp` або архіў ZIP спампуецца аўтаматычна. + +## Налады + +У гэтага інструмента няма налад. Старонкі рэндэрацца з фіксаваным маштабам 2x, таму відарысы прыкладна ўдвая большыя за ўласныя памеры старонак PDF. + +## Фармат выніку + +- **Адна старонка**: `filename.bmp` +- **Некалькі старонак**: `filename_bmps.zip` з `page_1.bmp`, `page_2.bmp` і г.д. + +## Сцэнарыі выкарыстання + +- Перадача старонак PDF у састарэлыя сістэмы або абсталяванне, якія прымаюць толькі BMP. +- Падрыхтоўка несціснутых відарысаў для пэўных працэсаў друку. +- Выкарыстанне растравага выніку як уваходу для інструментаў апрацоўкі відарысаў, якім патрэбныя сырыя піксельныя даныя. + +## Парады + +- Файлы BMP вельмі вялікія, бо захоўваюць сырыя піксельныя даныя без сціскання. У большасці выпадкаў [PDF у PNG](./pdf-to-png) дае якасць без страт пры значна меншых файлах. +- Калі мэтавая сістэма прымае PNG або TIFF, выбірайце гэтыя фарматы, каб зэканоміць месца на дыску. + +## Звязаныя інструменты + +- [PDF у PNG](./pdf-to-png) +- [PDF у TIFF](./pdf-to-tiff) +- [PDF у JPG](./pdf-to-jpg) diff --git a/docs/be/tools/pdf-to-cbz.md b/docs/be/tools/pdf-to-cbz.md new file mode 100644 index 00000000..15d39be9 --- /dev/null +++ b/docs/be/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF у CBZ +description: Пераўтварайце PDF у файл CBZ (архіў коміксаў) для праграм чытання коміксаў, такіх як Komga, Kavita, CDisplayEx і Calibre. +--- + +# PDF у CBZ + +Пераўтварае PDF у файл CBZ (Comic Book ZIP), стандартны фармат для лічбавых коміксаў і мангі. Кожная старонка PDF становіцца відарысам у архіве. Інструмент стварае метаданыя ў трох фарматах для максімальнай сумяшчальнасці: ComicInfo.xml, metadata.opf і ComicBookInfo JSON. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Выберыце фармат відарысаў, якасць, маштаб і, пры жаданні, метаданыя. +3. Націсніце **Пераўтварыць**, каб стварыць файл CBZ. +4. Файл `.cbz` спампуецца аўтаматычна. + +## Налады + +| Налада | Значэнні | Па змаўчанні | Апісанне | +| ------------------ | --------------- | ------------ | ------------------------------------------------------------------------------------------------ | +| Фармат відарысаў | JPEG, PNG, WebP | JPEG | JPEG для каляровых коміксаў, PNG для чорна-белай мангі без страт, WebP для найлепшага сціскання. | +| Якасць | 50–100% | 85% | Кіруе сцісканнем JPEG/WebP. Схавана для PNG (заўсёды без страт). | +| Маштаб | 1.0x–4.0x | 2.0x | Большы маштаб дае больш выразныя відарысы для экранаў з высокім разрозненнем. | +| Градацыі шэрага | Укл./Выкл. | Выкл. | Пераўтварае старонкі ў градацыі шэрага. Памяншае памер для чорна-белага змесціва. | +| Рэжым мангі | Укл./Выкл. | Выкл. | Задае ў метаданых кірунак чытання справа налева. | +| Уключыць метаданыя | Укл./Выкл. | Укл. | Убудоўвае ComicInfo.xml, metadata.opf і ComicBookInfo JSON. | + +## Палі метаданых + +Калі метаданыя ўключаныя, можна запоўніць: + +- **Назва**: вызначаецца аўтаматычна з імя файла PDF. +- **Серыя**: назва серыі (напрыклад, «Naruto»). +- **Нумар (#)**: нумар выпуску ў серыі. +- **Том (Vol.)**: нумар тома. +- **Аўтар(ы)**: імя сцэнарыста або стваральніка. +- **Выдавец**: выдавецкая кампанія. +- **Тэгі / Жанр**: тэгі праз коску (напрыклад, «Баявік, Прыгоды»). +- **Год выдання**: год публікацыі (1900–2100). +- **Рэйтынг**: рэйтынг супольнасці ад 0 да 5. + +## Сумяшчальнасць метаданых + +Інструмент запісвае метаданыя ў трох фарматах, каб іх знайшла кожная праграма: + +| Фармат | Размяшчэнне | Падтрымліваецца | +| ------------------ | ------------------- | ------------------------------------------- | +| ComicInfo.xml | Файл у ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Файл у ZIP | Calibre | +| ComicBookInfo JSON | Поле каментарыя ZIP | Calibre (рэзервова) | + +## Фармат выніку + +- `filename.cbz`: архіў ZIP з пранумараванымі відарысамі старонак і файламі метаданых. + +Відарысы старонак названыя нумарамі з вядучымі нулямі (`01.jpg`, `02.jpg` і г.д.), каб праграмы паказвалі іх у правільным парадку. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне PDF з мангай або коміксамі для праграм чытання коміксаў. +- Стварэнне бібліятэкі лічбавых коміксаў у Komga, Kavita або Calibre. +- Пераўтварэнне сканаваных коміксаў у зручны для чытання фармат. +- Абмен коміксамі ў фармаце, які захоўвае кірунак чытання і метаданыя. + +## Парады + +- Выкарыстоўвайце **JPEG** для каляровых коміксаў і **PNG** для чорна-белай мангі: PNG вельмі эфектыўна сціскае чорна-белае змесціва. +- Уключыце **Градацыі шэрага** для мангі, каб значна паменшыць памер файла. +- Запоўніце палі **Серыя** і **Нумар**, каб менеджары бібліятэк (Komga, Calibre) упарадкавалі калекцыю аўтаматычна. +- **WebP** дае найлепшае сцісканне, але старыя праграмы чытання коміксаў могуць яго не падтрымліваць. + +## Звязаныя інструменты + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у PNG](./pdf-to-png) +- [PDF у TIFF](./pdf-to-tiff) +- [Выняць відарысы](./extract-images) diff --git a/docs/be/tools/pdf-to-csv.md b/docs/be/tools/pdf-to-csv.md new file mode 100644 index 00000000..63f47b1c --- /dev/null +++ b/docs/be/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF у CSV +description: Вымайце табліцы з дакументаў PDF і экспартуйце іх у адзін файл CSV. Падтрымліваюцца шматстаронкавыя PDF з аўтаматычным выяўленнем табліц. +--- + +# PDF у CSV + +Вымае табліцы з PDF і экспартуе іх у файл CSV. Інструмент шукае таблічныя даныя на кожнай старонцы з дапамогай рухавіка выяўлення табліц PyMuPDF, а потым запісвае ўсе знойдзеныя радкі ў адзін файл са значэннямі праз коску. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Націсніце **Пераўтварыць**, каб пачаць выманне табліц. +3. Інструмент праглядае кожную старонку і аўтаматычна знаходзіць табліцы. +4. Спампоўваецца файл `.csv` з усімі вынятымі данымі табліц. + +Табліцы з розных старонак у выніку раздзеленыя пустымі радкамі. Ячэйкі з коскамі, двукоссямі або пераносамі радкоў экранаваныя паводле RFC 4180. + +## Налады + +У гэтага інструмента няма налад. Усе знойдзеныя ў дакуменце табліцы вымаюцца і аб'ядноўваюцца ў адзін CSV. + +## Фармат выніку + +- Адзін файл `filename.csv` з усімі знойдзенымі табліцамі. + +## Сцэнарыі выкарыстання + +- Перанос фінансавых даных з PDF-выпісак банка або рахункаў у электронную табліцу. +- Выманне табліц цэн з камерцыйных прапаноў пастаўшчыкоў для параўнання. +- Пераўтварэнне таблічных даных даследаванняў з PDF у фармат для інструментаў аналізу. +- Перанос даных са старых справаздач PDF у базы даных. + +## Парады + +- Калі табліцы не знойдзеныя, інструмент паказвае паведамленне «Табліцы не знойдзены». Звычайна гэта значыць, што PDF выкарыстоўвае тэкставы макет, які выглядае як табліца, але не з'яўляецца сапраўднай табліцай. +- Для большага кантролю над асобнымі табліцамі выкарыстайце [Выняць табліцы з PDF](./extract-tables): там можна выбраць фармат CSV, JSON або Markdown. +- Калі даныя патрэбныя ў фармаце Excel з асобным аркушам на кожную табліцу, выкарыстайце [PDF у Excel](./pdf-to-excel). + +## Звязаныя інструменты + +- [PDF у Excel](./pdf-to-excel) +- [Выняць табліцы з PDF](./extract-tables) +- [PDF у тэкст](./pdf-to-text) diff --git a/docs/be/tools/pdf-to-excel.md b/docs/be/tools/pdf-to-excel.md new file mode 100644 index 00000000..99760816 --- /dev/null +++ b/docs/be/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF у Excel +description: Вымайце табліцы з дакументаў PDF у электронную табліцу Excel. Кожная табліца трапляе на асобны аркуш са спасылкай на старонку. +--- + +# PDF у Excel + +Вымае табліцы з PDF і захоўвае іх як электронную табліцу Excel (`.xlsx`). Кожная знойдзеная табліца змяшчаецца на асобны аркуш з нумарам табліцы і зыходнай старонкай. Выяўленне табліц працуе на PyMuPDF, а файл Excel стварае бібліятэка SheetJS. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Націсніце **Пераўтварыць**, каб пачаць выманне табліц. +3. Інструмент шукае табліцы на кожнай старонцы і стварае кнігу Excel. +4. Спампоўваецца файл `.xlsx` з адным аркушам на кожную табліцу. + +## Налады + +У гэтага інструмента няма налад. Усе знойдзеныя табліцы вымаюцца аўтаматычна. + +## Фармат выніку + +- Адзін файл `filename.xlsx`. +- **Адна табліца**: адзін аркуш з назвай «Table». +- **Некалькі табліц**: аркушы з назвамі «Table 1 (Page 3)», «Table 2 (Page 5)» і г.д. Назвы аркушаў абразаюцца да 31 сімвала (абмежаванне Excel). + +## Сцэнарыі выкарыстання + +- Пераўтварэнне фінансавых справаздач PDF у рэдагаваныя табліцы для далейшага аналізу. +- Выманне табліц запасаў або заказаў з PDF пастаўшчыкоў. +- Перанос структураваных даных з форм або каталогаў PDF у Excel для сартавання і фільтрацыі. +- Архіваванне таблічных даных PDF у фармаце, з якім могуць працаваць калегі без тэхнічных ведаў. + +## Парады + +- Калі інструмент паведамляе «Табліцы не знойдзены», PDF, хутчэй за ўсё, мае свабодны тэкставы макет замест структураваных табліц. Паспрабуйце [PDF у тэкст](./pdf-to-text), каб атрымаць сыры змест. +- Для простага плоскага фармату выкарыстайце [PDF у CSV](./pdf-to-csv). Каб спампоўваць кожную табліцу асобна ў розных фарматах, выкарыстайце [Выняць табліцы з PDF](./extract-tables). +- Па назвах аркушаў відаць, з якой старонкі ўзята кожная табліца. + +## Звязаныя інструменты + +- [PDF у CSV](./pdf-to-csv) +- [Выняць табліцы з PDF](./extract-tables) +- [PDF у тэкст](./pdf-to-text) diff --git a/docs/be/tools/pdf-to-greyscale.md b/docs/be/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..fa115780 --- /dev/null +++ b/docs/be/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF у градацыі шэрага +description: Пераўтварайце каляровы PDF у версію ў градацыях шэрага (чорна-белую). Ствараецца новы PDF без колеру на ўсіх старонках. +--- + +# PDF у градацыі шэрага + +Пераўтварае каляровы PDF у версію ў градацыях шэрага. Кожная старонка рэндэрыцца, абескаляроўваецца і зноў убудоўваецца як відарыс JPEG у новы PDF. Вынік захоўвае арыгінальныя памеры старонак. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Націсніце **Пераўтварыць**, каб апрацаваць файл. +3. Спампоўваецца новы `greyscale.pdf` з усімі старонкамі ў чорна-белым выглядзе. + +Унутры кожная старонка рэндэрыцца з маштабам 2x, піксельныя даныя праходзяць праз фільтр градацый шэрага, затым перакадуюцца ў JPEG з якасцю 90% і змяшчаюцца ў новы дакумент PDF. + +## Налады + +У гэтага інструмента няма налад. Пераўтварэнне выкарыстоўвае стандартную формулу яркасці, а якасць JPEG фіксаваная на 90%. + +## Фармат выніку + +- Адзін файл `greyscale.pdf` з усімі старонкамі ў выглядзе відарысаў JPEG у градацыях шэрага. + +## Сцэнарыі выкарыстання + +- Падрыхтоўка дакументаў да чорна-белага друку, каб зэканоміць на каляровым чарніле. +- Выкананне патрабаванняў юрыдычных або дзяржаўных устаноў, якія патрабуюць градацый шэрага. +- Памяншэнне памеру каляровых PDF (відарысы JPEG у градацыях шэрага меншыя за каляровыя). +- Аднастайны візуальны стыль для дакументаў са змешанымі каляровымі і чорна-белымі старонкамі. + +## Парады + +- Паколькі кожная старонка растарызуецца і зноў убудоўваецца як JPEG, вынік складаецца з відарысаў. Тэкст арыгінальнага PDF больш нельга будзе вылучыць або шукаць. Калі пасля гэтага патрэбны тэкст з пошукам, апрацуйце вынік інструментам OCR. +- Для большага кантролю над колерам (яркасць, кантраст, насычанасць) паглядзіце інструмент «Наладзіць колеры» або вузел градацый шэрага ў [Канструктары рабочага працэсу PDF](./pdf-workflow). + +## Звязаныя інструменты + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у PNG](./pdf-to-png) +- [Канструктар рабочага працэсу PDF](./pdf-workflow) diff --git a/docs/be/tools/pdf-to-jpg.md b/docs/be/tools/pdf-to-jpg.md new file mode 100644 index 00000000..20b6eb49 --- /dev/null +++ b/docs/be/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF у JPG +description: Пераўтварайце старонкі PDF у відарысы JPG з наладжвальнай якасцю. Аднастаронкавыя PDF спампоўваюцца напрамую, шматстаронкавыя экспартуюцца ў ZIP. +--- + +# PDF у JPG + +Пераўтварае кожную старонку PDF у відарыс JPG. Аднастаронкавыя дакументы спампоўваюцца як асобны файл `.jpg`. Шматстаронкавыя PDF даюць архіў ZIP з адным JPG на кожную старонку. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. Інструмент паказвае імя файла, памер і колькасць старонак. +2. Наладзьце паўзунок **Якасць**, каб кіраваць сцісканнем JPG. +3. Націсніце **Пераўтварыць**, каб пачаць апрацоўку. +4. Вынік спампуецца аўтаматычна: адзін JPG для аднастаронкавых PDF або файл ZIP для шматстаронкавых дакументаў. + +## Налады + +- **Якасць**: паўзунок ад 0% да 100% (па змаўчанні 90%). Большыя значэнні даюць больш выразныя відарысы большага памеру. Меншыя значэнні сціскаюць мацней. + +Унутры старонкі рэндэрацца з маштабам 2x, таму разрозненне выніку ўдвая большае за памеры старонкі PDF. Стандартная старонка фармату Letter дае відарыс прыкладна 1 224 x 1 584 пікселі. + +## Фармат выніку + +- **Адна старонка**: `filename.jpg` +- **Некалькі старонак**: `filename_jpgs.zip` з `page_1.jpg`, `page_2.jpg` і г.д. + +## Сцэнарыі выкарыстання + +- Стварэнне мініяцюр для сістэмы кіравання дакументамі. +- Абмен старонкай справаздачы ў чаце або лісце, дзе PDF не падтрымліваецца. +- Стварэнне відарысаў з дыяграм або ілюстрацый PDF. +- Архіваванне сканаваных дакументаў як асобных відарысаў. + +## Парады + +- Для выніку без страт выкарыстайце [PDF у PNG](./pdf-to-png). +- Якасць 80-90% дае добры баланс паміж памерам файла і візуальнай дакладнасцю. +- Калі для кожнай старонкі патрэбны пэўны фармат, паглядзіце [Канструктар рабочага працэсу PDF](./pdf-workflow) з вузлом вываду PDF у відарысы. + +## Звязаныя інструменты + +- [PDF у PNG](./pdf-to-png) +- [PDF у WebP](./pdf-to-webp) +- [PDF у BMP](./pdf-to-bmp) +- [PDF у TIFF](./pdf-to-tiff) diff --git a/docs/be/tools/pdf-to-json.md b/docs/be/tools/pdf-to-json.md new file mode 100644 index 00000000..8121109a --- /dev/null +++ b/docs/be/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF у JSON +description: Пераўтварайце файлы PDF у структураваны фармат JSON з дапамогай CPDF. Экспартуе ўнутраную структуру PDF як машыначытэльныя даныя JSON. +--- + +# PDF у JSON + +Пераўтварае адзін або некалькі файлаў PDF у фармат JSON. Інструмент выкарыстоўвае CPDF (Coherent PDF), каб сэрыялізаваць унутраную структуру кожнага PDF у машыначытэльнае прадстаўленне JSON. Вынік заўсёды выдаецца як архіў ZIP. + +## Як гэта працуе + +1. Выберыце адзін або некалькі файлаў PDF праз акно выбару файлаў. +2. Націсніце **Пераўтварыць**, каб пачаць апрацоўку. Пераўтварэнне выконваецца ў фонавым web worker. +3. Спампоўваецца архіў ZIP з адным файлам JSON на кожны ўваходны PDF. + +Радок стану паказвае ход пераўтварэння і стварэння ZIP. + +## Налады + +У гэтага інструмента няма налад. Кожны PDF пераўтвараецца ў поўнае прадстаўленне JSON. + +## Фармат выніку + +- Файл `pdfs-to-json.zip` з `filename.json` для кожнага ўваходнага PDF. + +Вынік JSON адлюстроўвае ўнутраную структуру аб'ектаў PDF, у тым ліку дрэвы старонак, спасылкі на шрыфты, метаданыя і патокі змесціва. + +## Сцэнарыі выкарыстання + +- Праверка ўнутранай структуры PDF для адладкі або валідацыі. +- Праграмнае выманне структураваных метаданых і ўласцівасцей старонак. +- Перадача даных структуры PDF ва ўласныя канвееры апрацоўкі. +- Аўдыт дакументаў PDF на адпаведнасць праз аналіз дрэў аб'ектаў. + +## Парады + +- Гэты інструмент выдае сырую структуру аб'ектаў PDF, а не вынятае тэкставае змесціва. Калі патрэбны тэкст старонак у JSON, выкарыстайце [Падрыхтаваць PDF для ШI](./prepare-pdf-for-ai). +- Для простага вымання тэксту [PDF у тэкст](./pdf-to-text) зручнейшы. +- Вялікія PDF са складанай структурай даюць вельмі вялікія файлы JSON. + +## Звязаныя інструменты + +- [PDF у тэкст](./pdf-to-text) +- [Падрыхтаваць PDF для ШI](./prepare-pdf-for-ai) +- [Выняць табліцы з PDF](./extract-tables) diff --git a/docs/be/tools/pdf-to-markdown.md b/docs/be/tools/pdf-to-markdown.md new file mode 100644 index 00000000..05ab0431 --- /dev/null +++ b/docs/be/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF у Markdown +description: Пераўтварайце дакументы PDF у фармат Markdown з магчымасцю вымання відарысаў. Падтрымліваецца пакетнае пераўтварэнне некалькіх файлаў. +--- + +# PDF у Markdown + +Пераўтварае файлы PDF у фармат Markdown (`.md`), захоўваючы загалоўкі, абзацы, спісы і базавае фарматаванне. Пры жаданні вымае і ўключае ўбудаваныя відарысы. Падтрымліваецца адзіночнае і пакетнае пераўтварэнне. Працуе на PyMuPDF. + +## Як гэта працуе + +1. Загрузіце адзін ці некалькі PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файлы. +2. Пры жаданні ўключыце **Уключаць відарысы**, каб убудаваць вынятыя відарысы ў Markdown. +3. Націсніце **Пераўтварыць**, каб пачаць апрацоўку. +4. Адзін файл спампоўваецца як `filename.md`. Некалькі файлаў даюць `markdown-files.zip`. + +## Налады + +- **Уключаць відарысы**: калі адзначана, убудаваныя відарысы з PDF вымаюцца і на іх ёсць спасылкі ў Markdown. Калі не адзначана, пераўтвараецца толькі тэкст. + +## Фармат выніку + +- **Адзін файл**: `filename.md` +- **Некалькі файлаў**: `markdown-files.zip` з адным `.md` на кожны ўваходны PDF. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне дакументацыі PDF у Markdown для генератара статычных сайтаў, такога як VitePress, Hugo або Jekyll. +- Ператварэнне навуковых артыкулаў PDF у рэдагаваны Markdown для праграм нататак, такіх як Obsidian. +- Перанос старых баз ведаў PDF у тэкставы фармат, зручны для Git. +- Выманне структураванага змесціва з электронных кніг PDF для пераафармлення. + +## Парады + +- Опцыя «Уключаць відарысы» карысная, калі PDF змяшчае схемы або ілюстрацыі, важныя для зместу. Для тэкставых дакументаў адключыце яе, каб вынік быў чыстым. +- Складаныя макеты з бакавымі панэлямі, зноскамі або некалькімі слупкамі могуць даць недасканалы Markdown. Праверце і пры неабходнасці выпраўце вынік. +- Для сырога тэксту без фарматавання выкарыстайце [PDF у тэкст](./pdf-to-text). + +## Звязаныя інструменты + +- [PDF у тэкст](./pdf-to-text) +- [PDF у Word](./pdf-to-word) +- [Падрыхтаваць PDF для ШI](./prepare-pdf-for-ai) diff --git a/docs/be/tools/pdf-to-pdfa.md b/docs/be/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..b9ce7d09 --- /dev/null +++ b/docs/be/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF у PDF/A +description: Пераўтварайце звычайныя PDF у фармат PDF/A для доўгатэрміновага архівавання. Падтрымліваюцца ўзроўні адпаведнасці PDF/A-1b, PDF/A-2b і PDF/A-3b. +--- + +# PDF у PDF/A + +PDF/A з'яўляецца стандартызаваным ISO падмноствам PDF для доўгатэрміновага лічбавага захоўвання. Гэты інструмент пераўтварае звычайныя PDF у дакументы, сумяшчальныя з PDF/A, з дапамогай Ghostscript, які працуе непасрэдна ў браўзеры. + +## Як гэта працуе + +1. Загрузіце адзін ці некалькі файлаў PDF. +2. Выберыце **Версію PDF/A** у выпадальным спісе. +3. Пры жаданні ўключыце **Папярэдне звесці PDF** для складаных файлаў, якія не пераўтвараюцца звычайным спосабам. +4. Націсніце **Пераўтварыць у PDF/A**. Для некалькіх файлаў ствараецца архіў ZIP. + +## Версіі PDF/A + +| Версія | Абмежаванні | Лепш для | +| ------------ | --------------------------------------------- | ---------------------------------------------------------- | +| **PDF/A-1b** | Найстражэйшая. Без празрыстасці і пластоў. | Максімальнай сумяшчальнасці са старымі архіўнымі сістэмамі | +| **PDF/A-2b** | Дазваляе празрыстасць і JPEG2000. | Агульнага архівавання (рэкамендуецца) | +| **PDF/A-3b** | Дазваляе ўбудаваныя далучэнні любога фармату. | Архівавання дакументаў з зыходнымі файламі даных | + +PDF/A-2b выбрана па змаўчанні і падыходзіць для пераважнай большасці задач архівавання. + +## Опцыя папярэдняга звядзення + +Некаторыя PDF маюць асаблівасці, якія перашкаджаюць чыстаму пераўтварэнню ў PDF/A: незвычайныя кадзіроўкі шрыфтоў, складаныя стэкі празрыстасці або пашкоджаную ўнутраную структуру. Опцыя **Папярэдне звесці** растарызуе PDF з 300 DPI перад пераўтварэннем, што гарантуе адпаведнасць, але тэкст больш нельга вылучыць. Выкарыстоўвайце яе як запасны варыянт, калі звычайнае пераўтварэнне дае памылкі. + +Для папярэдняга звядзення патрэбны рухавік PyMuPDF WASM. + +## Сцэнарыі выкарыстання + +- Выкананне дзяржаўных або юрыдычных патрабаванняў да архівавання (многія юрысдыкцыі патрабуюць PDF/A для судовых дакументаў) +- Падача дакументаў у інстытуцыйныя рэпазіторыі або лічбавыя бібліятэкі +- Захаванне дзелавых запісаў, калі арыгінальнай праграмы праз дзесяць гадоў можа ўжо не быць +- Падрыхтоўка рахункаў для стандартаў электронных рахункаў, якія патрабуюць PDF/A-3b з далучэннямі XML + +## Парады + +- Спачатку паспрабуйце пераўтварэнне без папярэдняга звядзення. Уключайце яго, толькі калі атрымаеце памылку. +- PDF/A убудоўвае ўсе шрыфты, таму выходныя файлы часта большыя за арыгіналы. +- Калі для вашага працэсу патрэбная строгая адпаведнасць, праверце вынік у спецыяльным валідатары PDF/A. + +## Звязаныя інструменты + +- [Сціснуць PDF](./compress-pdf): памяншае памер файла пасля пераўтварэння +- [Звесці PDF](./flatten-pdf): зводзіць формы перад пераўтварэннем у PDF/A +- [Выдаліць метаданыя](./remove-metadata): выдаляе метаданыя перад архіваваннем diff --git a/docs/be/tools/pdf-to-png.md b/docs/be/tools/pdf-to-png.md new file mode 100644 index 00000000..66b53302 --- /dev/null +++ b/docs/be/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF у PNG +description: Пераўтварайце старонкі PDF у відарысы PNG без страт з наладжвальным маштабам. Ідэальна для якасных здымкаў і празрыстага фону. +--- + +# PDF у PNG + +Пераўтварае кожную старонку PDF у відарыс PNG. PNG выкарыстоўвае сцісканне без страт, таму вынік захоўвае кожную дэталь арыгінальнай старонкі. Аднастаронкавыя PDF спампоўваюцца як файл `.png`, шматстаронкавыя даюць ZIP. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Наладзьце паўзунок **Маштаб**, каб кіраваць разрозненнем выніку. +3. Націсніце **Пераўтварыць**, каб пачаць апрацоўку. +4. Адзін PNG або архіў ZIP спампуецца аўтаматычна. + +## Налады + +- **Маштаб**: ад 1.0x да 3.0x (па змаўчанні 2.0x). Пры 2.0x стандартная старонка Letter рэндэрыцца прыкладна ў 1 224 x 1 584 пікселі. Большы маштаб дае большыя і больш выразныя відарысы за кошт памеру файла і часу апрацоўкі. + +## Фармат выніку + +- **Адна старонка**: `filename.png` +- **Некалькі старонак**: `filename_pngs.zip` з `page_1.png`, `page_2.png` і г.д. + +## Сцэнарыі выкарыстання + +- Дакладныя здымкі старонак PDF для прэзентацый. +- Выманне графікаў або схем, якім патрэбныя выразныя краі без артэфактаў сціскання. +- Падрыхтоўка рэсурсаў для вэб-дызайну з макетаў PDF. +- Стварэнне відарысаў старонак без страт для папярэдняй апрацоўкі перад OCR. + +## Парады + +- Файлы PNG значна большыя за JPG. Калі памер файла важнейшы за ідэальную якасць, выкарыстайце [PDF у JPG](./pdf-to-jpg) або [PDF у WebP](./pdf-to-webp). +- Пры маштабе 1.0x вынік адпавядае ўласнаму разрозненню PDF. Павялічце да 3.0x для экспарту ў друкарскай якасці. + +## Звязаныя інструменты + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у WebP](./pdf-to-webp) +- [PDF у SVG](./pdf-to-svg) diff --git a/docs/be/tools/pdf-to-svg.md b/docs/be/tools/pdf-to-svg.md new file mode 100644 index 00000000..9fe9a9aa --- /dev/null +++ b/docs/be/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF у SVG +description: Пераўтварайце старонкі PDF у маштабуемую вектарную графіку SVG. Тэкст і фігуры захоўваюцца як вектарныя контуры для бясконцага маштабавання. +--- + +# PDF у SVG + +Пераўтварае кожную старонку PDF у файл SVG (Scalable Vector Graphics). У адрозненне ад растравых фарматаў, SVG захоўвае вектарныя контуры, тэкст і фігуры, таму вынік маштабуецца да любога памеру без пікселізацыі. Працуе на PyMuPDF. + +## Як гэта працуе + +1. Загрузіце адзін ці некалькі PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файлы. Можна дадаць некалькі файлаў і кіраваць імі асобна. +2. Націсніце **Пераўтварыць**, каб апрацаваць усе загружаныя файлы. +3. Адзін файл з адной старонкай спампоўваецца як асобны `.svg`. Усё астатняе спампоўваецца як архіў ZIP. + +## Налады + +У гэтага інструмента няма налад. Кожная старонка пераўтвараецца ў SVG уласным вектарным экспартам PyMuPDF. + +## Фармат выніку + +- **Адзін файл, адна старонка**: `filename.svg` +- **Адзін файл, некалькі старонак**: `filename_svg.zip` з `page_1.svg`, `page_2.svg` і г.д. +- **Некалькі файлаў**: `pdf_to_svg.zip` з файламі, упарадкаванымі па назвах зыходных дакументаў. + +## Сцэнарыі выкарыстання + +- Выманне вектарных схем, графікаў або ілюстрацый са справаздач PDF для вэб-старонак. +- Рэдагаванне змесціва старонак PDF у вектарным рэдактары, такім як Inkscape або Illustrator. +- Убудаванне маштабуемых праглядаў старонак у адаптыўныя вэб-праграмы. +- Выманне лагатыпаў або графікі з брашур PDF з захаваннем выразных краёў. + +## Парады + +- SVG лепш за ўсё працуе з PDF з вектарным змесцівам. Сканаваныя дакументы або PDF з мноствам відарысаў дадуць вялікія файлы SVG з убудаванымі растравымі данымі. +- Для растравага выніку з PDF з мноствам відарысаў выкарыстайце [PDF у PNG](./pdf-to-png) або [PDF у JPG](./pdf-to-jpg). +- Інструмент падтрымлівае пакетнае пераўтварэнне: загрузіце некалькі PDF адразу, каб пераўтварыць іх за адзін запуск. + +## Звязаныя інструменты + +- [PDF у PNG](./pdf-to-png) +- [PDF у JPG](./pdf-to-jpg) +- [PDF у Markdown](./pdf-to-markdown) diff --git a/docs/be/tools/pdf-to-text.md b/docs/be/tools/pdf-to-text.md new file mode 100644 index 00000000..c0acaca1 --- /dev/null +++ b/docs/be/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF у тэкст +description: Вымайце просты тэкст з файлаў PDF. Падтрымліваецца пакетнае выманне з некалькіх PDF з вынікам у файлах TXT. +--- + +# PDF у тэкст + +Вымае ўвесь тэкст з файлаў PDF і захоўвае яго як простыя файлы `.txt`. Падтрымліваецца пакетная апрацоўка: загрузіце некалькі PDF і атрымайце тэкст кожнага за адну аперацыю. Працуе на PyMuPDF. + +## Як гэта працуе + +1. Загрузіце адзін ці некалькі PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файлы. Кіруйце спісам файлаў кнопкамі «Дадаць яшчэ» і «Ачысціць». +2. Націсніце **Выняць**, каб пачаць апрацоўку. +3. Адзін файл спампоўваецца як `filename.txt`. Некалькі файлаў даюць архіў `pdf-to-text.zip`. + +## Налады + +У гэтага інструмента няма налад. Увесь тэкст вымаецца з кожнай старонкі ў парадку чытання. + +## Фармат выніку + +- **Адзін файл**: `filename.txt` +- **Некалькі файлаў**: `pdf-to-text.zip` з адным `.txt` на кожны ўваходны PDF. + +## Сцэнарыі выкарыстання + +- Выманне асноўнага тэксту са справаздач PDF для паўнатэкставай індэксацыі. +- Пераўтварэнне электронных кніг або артыкулаў PDF у просты тэкст для чытання на прыладах з e-ink. +- Выманне тэксту з дагавораў або юрыдычных дакументаў для аналізу ключавых слоў. +- Выдаленне фарматавання з PDF, каб атрымаць чысты тэкст для скрыптоў апрацоўкі даных. +- Падрыхтоўка тэкставага корпуса з архіваў PDF для апрацоўкі натуральнай мовы. + +## Парады + +- Сканаваныя PDF (толькі відарысы) дадуць пустыя тэкставыя файлы, бо ў іх няма тэкставага пласта. Спачатку апрацуйце сканы з дапамогай OCR. +- Вынік захоўвае парадак чытання так, як яго вызначае PyMuPDF: звычайна злева направа і зверху ўніз. Макеты з некалькімі слупкамі могуць даць перамешаны тэкст. +- Для структураванага выніку з загалоўкамі і фарматаваннем паспрабуйце [PDF у Markdown](./pdf-to-markdown). Для структураванага JSON, гатовага для ШI, выкарыстайце [Падрыхтаваць PDF для ШI](./prepare-pdf-for-ai). + +## Звязаныя інструменты + +- [PDF у Markdown](./pdf-to-markdown) +- [Падрыхтаваць PDF для ШI](./prepare-pdf-for-ai) +- [PDF у Word](./pdf-to-word) diff --git a/docs/be/tools/pdf-to-tiff.md b/docs/be/tools/pdf-to-tiff.md new file mode 100644 index 00000000..d0199cd0 --- /dev/null +++ b/docs/be/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF у TIFF +description: Пераўтварайце старонкі PDF у відарысы TIFF, якія часта выкарыстоўваюцца ў друку, факсе і архіваванні. Калі кадаванне не ўдаецца, выкарыстоўваецца PNG. +--- + +# PDF у TIFF + +Пераўтварае кожную старонку PDF у відарыс TIFF. TIFF з'яўляецца стандартным фарматам для друкарскай вытворчасці, факсавых сістэм і архівавання дакументаў. Інструмент выкарыстоўвае сцісканне PackBits для кадавання TIFF і пераходзіць на PNG, калі старонку не ўдаецца закадаваць. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Націсніце **Пераўтварыць**, каб апрацаваць файл. +3. Адзін файл TIFF або архіў ZIP спампуецца аўтаматычна. + +## Налады + +У гэтага інструмента няма налад. Старонкі рэндэрацца з фіксаваным маштабам 2x. + +## Фармат выніку + +- **Адна старонка**: `filename.tiff` +- **Некалькі старонак**: `filename_tiffs.zip` з `page_1.tiff`, `page_2.tiff` і г.д. + +Калі кадаванне TIFF для пэўнай старонкі не ўдаецца (з-за праблем са сцісканнем), гэтая старонка захоўваецца як файл `.png`. У такім выпадку ZIP будзе змяшчаць і TIFF, і PNG. + +## Сцэнарыі выкарыстання + +- Падача дакументаў у дзяржаўныя ўстановы або судовыя сістэмы, якія патрабуюць фармат TIFF. +- Падрыхтоўка старонак для перадачы праз лічбавыя факсавыя сэрвісы. +- Архіваванне сканаваных дакументаў у шырока падтрымліваемым фармаце без страт. +- Перадача старонак у карпаратыўныя сістэмы кіравання дакументамі. + +## Парады + +- Файлы TIFF вялікія. Калі патрэбна якасць без страт толькі для вэба або экрана, лепш выбраць [PDF у PNG](./pdf-to-png). +- Праверце змесціва ZIP, калі для некаторых старонак спатрэбіўся PNG: магчыма, іх варта пераўтварыць асобна. + +## Звязаныя інструменты + +- [PDF у PNG](./pdf-to-png) +- [PDF у BMP](./pdf-to-bmp) +- [PDF у JPG](./pdf-to-jpg) diff --git a/docs/be/tools/pdf-to-webp.md b/docs/be/tools/pdf-to-webp.md new file mode 100644 index 00000000..d32dd277 --- /dev/null +++ b/docs/be/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF у WebP +description: Пераўтварайце старонкі PDF у відарысы WebP з наладжвальнай якасцю. Файлы меншыя за JPG пры падобнай візуальнай якасці. +--- + +# PDF у WebP + +Пераўтварае кожную старонку PDF у відарыс WebP. Пры той жа ўспрымаемай якасці WebP звычайна дае файлы на 25-35% меншыя за JPG, таму гэта добры выбар для вэба. + +## Як гэта працуе + +1. Загрузіце PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файл. +2. Наладзьце паўзунок **Якасць**. +3. Націсніце **Пераўтварыць**, каб апрацаваць файл. +4. Адзін файл `.webp` або архіў ZIP спампуецца аўтаматычна. + +## Налады + +- **Якасць**: паўзунок ад 0% да 100% (па змаўчанні 85%). Кіруе ўзроўнем сціскання са стратамі. Большыя значэнні захоўваюць больш дэталяў. + +Унутры старонкі рэндэрацца з маштабам 2x, таму відарысы прыкладна ўдвая большыя за ўласныя памеры PDF. + +## Фармат выніку + +- **Адна старонка**: `filename.webp` +- **Некалькі старонак**: `filename_webps.zip` з `page_1.webp`, `page_2.webp` і г.д. + +## Сцэнарыі выкарыстання + +- Падрыхтоўка праглядаў старонак для сайтаў, дзе важны трафік. +- Стварэнне лёгкіх версій улётак або брашур для сацыяльных сетак. +- Пакетнае пераўтварэнне шматстаронкавых дакументаў у набор відарысаў, аптымізаваных для вэба. + +## Парады + +- WebP падтрымліваецца ва ўсіх сучасных браўзерах. Для сумяшчальнасці са старымі сістэмамі выкарыстайце [PDF у JPG](./pdf-to-jpg). +- Якасць 80-85% на экране звычайна не адрозніць ад арыгінала, а памер файлаў застаецца малым. + +## Звязаныя інструменты + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у PNG](./pdf-to-png) +- [PDF у BMP](./pdf-to-bmp) diff --git a/docs/be/tools/pdf-to-word.md b/docs/be/tools/pdf-to-word.md new file mode 100644 index 00000000..9f99a140 --- /dev/null +++ b/docs/be/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF у Word +description: Пераўтварайце файлы PDF у рэдагаваныя дакументы Word (DOCX). Падтрымліваецца пакетнае пераўтварэнне некалькіх PDF адразу. +--- + +# PDF у Word + +Пераўтварае файлы PDF у рэдагаваныя дакументы Word (`.docx`). Інструмент выкарыстоўвае PyMuPDF, каб аднавіць змесціва дакумента з захаваннем тэксту, базавага фарматавання і макета. Падтрымліваецца адзіночнае і пакетнае пераўтварэнне. + +## Як гэта працуе + +1. Загрузіце адзін ці некалькі PDF, націснуўшы на вобласць загрузкі або перацягнуўшы туды файлы. Можна дадаць яшчэ файлы або выдаліць асобныя са спісу. +2. Націсніце **Пераўтварыць**, каб пачаць апрацоўку. +3. Адзін файл спампоўваецца як `filename.docx`. Некалькі файлаў пакуюцца ў `converted-documents.zip`. + +## Налады + +У гэтага інструмента няма налад. Кожны PDF пераўтвараецца ў DOCX убудаваным рухавіком пераўтварэння PyMuPDF. + +## Фармат выніку + +- **Адзін файл**: `filename.docx` +- **Некалькі файлаў**: `converted-documents.zip` з адным `.docx` на кожны ўваходны PDF. + +## Сцэнарыі выкарыстання + +- Рэдагаванне тэксту ў атрыманым PDF, які трэба змяніць. +- Пераўтварэнне архіўных справаздач PDF у фармат, які калегі могуць рэдагаваць у Microsoft Word або Google Docs. +- Перанос змесціва дагавораў або прапаноў PDF у Word для праўкі з адсочваннем змен. +- Перанос старой дакументацыі PDF у рэдагаваны фармат. + +## Парады + +- Складаныя макеты з некалькімі слупкамі, убудаванымі формамі або вялікай колькасцю графікі могуць пераўтварыцца не ідэальна. Праверце вынік і выпраўце фарматаванне ў тэкставым рэдактары. +- Сканаваныя PDF (толькі відарысы) дадуць пустыя або амаль пустыя файлы DOCX. Спачатку апрацуйце іх з дапамогай OCR, каб дадаць тэкставы пласт. +- Пакетны рэжым зручны для пераўтварэння цэлых папак PDF: загрузіце іх усе адразу. + +## Звязаныя інструменты + +- [PDF у тэкст](./pdf-to-text) +- [PDF у Markdown](./pdf-to-markdown) +- [Канструктар рабочага працэсу PDF](./pdf-workflow) diff --git a/docs/be/tools/pdf-to-zip.md b/docs/be/tools/pdf-to-zip.md new file mode 100644 index 00000000..c312006b --- /dev/null +++ b/docs/be/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF у ZIP +description: Пакуйце некалькі файлаў PDF у адзін архіў ZIP для зручнага абмену і захоўвання. +--- + +# PDF у ZIP + +Аб'ядноўвайце некалькі файлаў PDF у адзін архіў ZIP. Гэта просты інструмент упакоўкі: самі PDF не пераўтвараюцца, не сціскаюцца і не змяняюцца. + +## Як гэта працуе + +1. Загрузіце некалькі файлаў PDF праз вобласць загрузкі. +2. Праверце спіс файлаў. Выдаліце тыя, якія не трэба ўключаць. +3. Націсніце кнопку апрацоўкі. +4. Архіў ZIP з усімі загружанымі PDF адразу спампуецца. + +## Магчымасці + +- Прымае любую колькасць файлаў PDF +- Выдаленне асобных файлаў перад стварэннем архіва +- Захоўвае арыгінальныя імёны файлаў у ZIP +- Змесціва PDF не змяняецца: файлы пакуюцца як ёсць +- Паказвае імя і памер кожнага загружанага PDF + +## Сцэнарыі выкарыстання + +- Аб'яднанне набору рахункаў або чэкаў для ўкладання ў ліст +- Упакоўка вынікаў праекта (некалькіх справаздач PDF) для перадачы +- Стварэнне адной спампоўкі для калекцыі форм або шаблонаў +- Архіваванне пакета дакументаў у адзін сціснуты файл + +## Парады + +- ZIP выкарыстоўвае арыгінальныя імёны файлаў PDF. Калі ёсць файлы з аднолькавымі імёнамі, перайменуйце іх перад загрузкай, каб пазбегнуць канфліктаў. +- Інструмент не сціскае самі PDF. Каб паменшыць памер, спачатку апрацуйце іх інструментам «Сціснуць PDF», а потым запакуйце тут. + +## Звязаныя інструменты + +- [Аб'яднаць PDF](./merge-pdf) +- [Падзяліць PDF](./split-pdf) +- [Сціснуць PDF](./compress-pdf) diff --git a/docs/be/tools/pdf-workflow.md b/docs/be/tools/pdf-workflow.md new file mode 100644 index 00000000..d7fda336 --- /dev/null +++ b/docs/be/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Канструктар рабочага працэсу PDF +description: Стварайце ўласныя канвееры апрацоўкі PDF візуальна, злучаючы вузлы на палатне. Аб'ядноўвайце ў ланцужок аб'яднанне, сцісканне, вадзяны знак і экспарт. +--- + +# Канструктар рабочага працэсу PDF + +Канструктар рабочага працэсу дазваляе аб'яднаць некалькі аперацый з PDF у адзін аўтаматызаваны канвеер. Замест таго каб запускаць інструменты па адным, вы злучаеце візуальны граф вузлоў (увод, апрацоўка, вывад) і выконваеце ўсё адным націскам. Вашы файлы ніколі не пакідаюць браўзер. + +## Як гэта працуе + +Інтэрфейс падзелены на тры панэлі: **набор вузлоў** злева, **палатно** ў цэнтры і **панэль налад** справа, якая з'яўляецца пры выбары вузла. + +1. **Дадавайце вузлы**, націскаючы на іх у левай бакавой панэлі, або перацягвайце іх непасрэдна на палатно. Радок пошуку ўверсе набору фільтруе вузлы па назве. +2. **Злучайце вузлы**, перацягваючы ад выходнага гнязда (унізе вузла) да ўваходнага гнязда (уверсе іншага вузла). Злучэнні ідуць зверху ўніз. +3. **Наладжвайце** вузел, націснуўшы на яго, каб адкрыць панэль налад справа. У кожнага тыпу вузла свае налады (дыяпазоны старонак, паўзункі якасці, паролі і г.д.). +4. **Запускайце рабочы працэс** кнопкай **Запусціць** на панэлі інструментаў. Рухавік выконвае вузлы ў тапалагічным парадку, апрацоўваючы іх па чарзе. Радок стану ўнізе паказвае ход выканання. +5. **Спампоўвайце вынікі**: канчатковы вузел «Спампаваць» захоўвае выніковы PDF (або ZIP, калі файлаў некалькі). + +## Катэгорыі вузлоў + +Вузлы падзелены на шэсць катэгорый, кожная мае свой колер на палатне: + +- **Увод** (сіні): Увод PDF, Увод відарысаў, Word/Excel/PowerPoint у PDF і больш за 15 іншых канвертараў фарматаў, якія падаюць файлы ў канвеер. +- **Рэдагаванне і анатацыі** (індыга): Абрэзка, Градацыі шэрага, Інвертаваць колеры, Вадзяны знак, Нумары старонак, Верхні і ніжні калантытул, Эфект сканера, Наладзіць колеры, Колер фону, Выдаліць пустыя старонкі, Выдаліць анатацыі. +- **Арганізацыя і кіраванне** (фіялетавы): Аб'яднаць, Падзяліць, Выняць старонкі, Павярнуць, Выдаліць старонкі, Адваротны парадак, Дадаць пустую старонку, Падзяліць старонкі, N-Up, Уніфікаваць памер старонак, Аб'яднаць у адну старонку, Буклет, Постэр, Рэдагаваць метаданыя, Змест, OCR. +- **Аптымізацыя і аднаўленне** (бурштынавы): Сціснуць, Растарызаваць, Зрабіць лінейным, Выпрастаць, PDF у PDF/A, Шрыфт у контуры, Аднавіць. +- **Абарона PDF** (ружовы): Зашыфраваць, Расшыфраваць, Ачысціць, Звесці, Лічбавы подпіс, Схаваць даныя. +- **Вывад** (бірузовы): Спампаваць (аўтаматычна выбірае адзін PDF або ZIP), PDF у відарысы, PDF у тэкст, PDF у DOCX, PDF у XLSX, PDF у CSV, PDF у SVG, PDF у Markdown, Выняць відарысы. + +## Захаванне і загрузка рабочых працэсаў + +Панэль інструментаў мае чатыры спосабы захавання: + +- **Захаваць**: захоўвае бягучы рабочы працэс як названы шаблон у лакальным сховішчы браўзера. Можна захаваць некалькі шаблонаў. +- **Загрузіць**: адкрывае акно са спісам захаваных шаблонаў. Націсніце «Загрузіць», каб аднавіць шаблон, або выдаліце непатрэбныя. +- **Экспарт**: спампоўвае рабочы працэс як файл `.json`, каб падзяліцца ім або зрабіць рэзервовую копію. +- **Імпарт**: загружае файл рабочага працэсу `.json` з дыска і аднаўляе ўсе вузлы, пазіцыі і злучэнні. + +Шаблоны захоўваюцца паміж сесіямі ў лакальным сховішчы. Экспартаваныя файлы JSON можна пераносіць паміж браўзерамі і камп'ютарамі. + +## Мадэль выканання + +Рухавік будуе граф залежнасцей па вашых злучэннях і выконвае вузлы ў тапалагічным парадку. Калі які-небудзь вузел дае збой, выкананне спыняецца, а гэты вузел пазначаецца чырвоным. Некалькі правілаў: + +- Кожнаму рабочаму працэсу патрэбны хаця б адзін вузел **Увод** і адзін вузел **Вывад**. +- Рухавік выяўляе цыклічныя залежнасці і блакіруе выкананне з памылкай. +- Вузел **Зашыфраваць** павінен быць апошнім крокам апрацоўкі перад вузлом вываду. Калі паставіць яго раней, з'явіцца папярэджанне праверкі, бо наступныя вузлы не могуць працаваць з зашыфраванымі данымі. +- Для PDF, абароненых паролем, падчас выканання запытваецца пароль. +- Падтрымліваецца ўвод некалькіх PDF: вузел «Аб'яднаць» можа іх аб'яднаць, або вузлы пакетнай апрацоўкі апрацуюць кожны PDF асобна. + +## Тыпы гнёздаў + +Злучэнні выкарыстоўваюць тыпізаваныя гнёзды, каб не дапусціць няправільных злучэнняў: + +- **PDF** (індыга): адзін дакумент PDF. +- **MultiPDF** (бурштынавы): некалькі дакументаў PDF разам. +- **Відарыс** (зялёны): blob відарыса. + +## Налады + +Кожны вузел мае ўласныя налады на правай панэлі налад. Тыповыя прыклады: + +- **Дыяпазоны старонак** у вузлах «Падзяліць», «Выняць старонкі», «Выдаліць старонкі» +- **Паўзункі якасці** ў вузлах вываду з пераўтварэннем у відарысы +- **Палі пароля** ў вузлах «Зашыфраваць» і «Расшыфраваць» +- **Тэкставыя палі** для «Вадзяны знак», «Верхні і ніжні калантытул», «Рэдагаваць метаданыя» +- **Вуглы павароту** ў вузле «Павярнуць» +- **Узровень сціскання** ў вузле «Сціснуць» +- **Выбар мовы OCR** у вузле OCR + +## Сцэнарыі выкарыстання + +- **Апрацоўка рахункаў**: Увод PDF -> OCR -> Выняць табліцы -> Спампаваць як CSV. +- **Стандартызацыя справаздач**: Word у PDF -> Уніфікаваць памер старонак -> Нумары старонак -> Вадзяны знак -> Сціснуць -> Спампаваць. +- **Падрыхтоўка да архівавання**: Увод PDF -> Аднавіць -> Звесці -> Ачысціць -> PDF у PDF/A -> Спампаваць. +- **Пакетнае выманне відарысаў**: Увод PDF (некалькі файлаў) -> Выняць відарысы -> Спампаваць ZIP. +- **Буклеты для друку**: Увод PDF -> Буклет -> Абрэзка -> Сціснуць -> Спампаваць. +- **Бяспечнае распаўсюджванне**: Увод PDF -> Схаваць даныя -> Выдаліць анатацыі -> Зашыфраваць -> Спампаваць. + +## Парады + +- Націсніце **Delete** або **Backspace**, каб выдаліць вылучаны вузел з палатна. +- Націсніце кнопку **X** на радку стану вузла, каб выдаліць яго адразу. +- Перамяшчайце палатно, націскаючы і перацягваючы на пустым месцы. Падчас перамяшчэння курсор змяняецца на значок рукі. +- На мабільных прыладах выкарыстоўвайце кнопку **+** на панэлі інструментаў, каб паказаць або схаваць набор вузлоў. +- Калі рабочы працэс стварае некалькі выходных файлаў, вузел «Спампаваць» аўтаматычна пакуе іх у ZIP. +- Пачынайце з простага: збярыце і праверце канвеер з двух вузлоў, перш чым ускладняць. + +## Звязаныя інструменты + +- [PDF у тэкст](./pdf-to-text) +- [PDF у Excel](./pdf-to-excel) +- [Выняць відарысы](./extract-images) +- [PDF у Markdown](./pdf-to-markdown) diff --git a/docs/be/tools/png-to-pdf.md b/docs/be/tools/png-to-pdf.md new file mode 100644 index 00000000..920ae784 --- /dev/null +++ b/docs/be/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG у PDF +description: Пераўтварайце адзін ці некалькі відарысаў PNG у дакумент PDF з наладжвальнай якасцю, цалкам у браўзеры. +--- + +# PNG у PDF + +Пераўтварайце відарысы PNG у PDF з захаваннем поўнага разрознення. Кожны PNG становіцца асобнай старонкай памерам з арыгінальны відарыс. Празрыстасць апрацоўваецца аўтаматычна. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------- | +| PNG | `.png` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы PNG. Можна выбраць некалькі адразу. +2. Кіруйце спісам файлаў: выдаляйце непатрэбныя або дадавайце новыя. +3. Выберыце ўзровень **Якасць PDF** у выпадальным спісе. +4. Націсніце **Пераўтварыць у PDF**. Вынік спампоўваецца як `from_jpgs.pdf`. + +Інструмент выкарыстоўвае pdf-lib, каб убудаваць кожны відарыс напрамую. Калі PNG нельга ўбудаваць напрамую (напрыклад, з-за незвычайнага колеравага профілю), ён перарысоўваецца праз canvas у JPEG. + +## Налады + +**Якасць PDF** кіруе сцісканнем перад убудаваннем: + +- **Высокая якасць**: мінімальнае сцісканне, найбольшы памер файла. +- **Сярэдняя якасць** (па змаўчанні): добры баланс памеру і выразнасці. +- **Нізкая якасць**: максімальнае сцісканне, найменшы вынік. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне здымкаў экрана ў шматстаронкавы PDF для справаздач пра памылкі або дакументацыі +- Упакоўка экспарту дызайну інтэрфейсу ў адзін файл для прагляду +- Ператварэнне экспартаваных схем (draw.io, Excalidraw) у PDF для абмену +- Збор набору відарысаў графікаў у справаздачу + +## Парады + +- Файлы PNG з празрыстасцю атрымліваюць у PDF белы фон. Калі патрэбны іншы фон, адрэдагуйце відарысы загадзя. +- Для здымкаў экрана і схем з выразнымі краямі і тэкстам высокая якасць дазваляе пазбегнуць артэфактаў сціскання JPEG. Сярэдняя або нізкая могуць унутры пераўтвараць у JPEG. + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [JPG у PDF](./jpg-to-pdf) +- [SVG у PDF](./svg-to-pdf) diff --git a/docs/be/tools/posterize-pdf.md b/docs/be/tools/posterize-pdf.md new file mode 100644 index 00000000..34fb10c5 --- /dev/null +++ b/docs/be/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Пераўтварыць у постэр +description: Дзяліце старонкі PDF на сетку меншых старонак для друку вялікага фармату на некалькіх аркушах. +--- + +# Пераўтварыць у постэр + +Дзяліце кожную старонку PDF на сетку меншых падстаронак. Гэты інструмент дазваляе надрукаваць адну старонку на некалькіх аркушах паперы, якія потым складаюцца разам у вялікі постэр або банер. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Задайце колькасць **радкоў** і **слупкоў** сеткі (напрыклад, 2 радкі x 2 слупкі дзеляць кожную старонку на 4 падстаронкі). +3. Пры жаданні ўкажыце дыяпазон старонак, каб абмежаваць, якія старонкі будуць апрацаваны. +4. Палатно папярэдняга прагляду паказвае сетку на бягучай старонцы, каб вы бачылі лініі разрэзу. +5. Пераключайцеся паміж старонкамі, каб праверыць сетку на розных старонках. +6. Націсніце кнопку апрацоўкі. Кожная ячэйка сеткі становіцца асобнай старонкай у выніковым PDF. + +## Магчымасці + +- Наладжвальная колькасць радкоў і слупкоў для гнуткага памеру сеткі +- Жывы папярэдні прагляд з сеткай, якая дакладна паказвае, дзе будуць падзелены старонкі +- Фільтр дыяпазону старонак, каб апрацаваць толькі пэўныя старонкі +- Пастаронкавая навігацыя ў папярэднім праглядзе +- Кэшаваныя здымкі старонак для хуткай навігацыі +- Чырвоныя пункцірныя лініі сеткі выразна адзначаюць межы разрэзу + +## Параметры + +| Параметр | Апісанне | +| --------------------- | ---------------------------------------------------- | +| **Радкі** | Колькасць гарызантальных дзяленняў (па змаўчанні: 1) | +| **Слупкі** | Колькасць вертыкальных дзяленняў (па змаўчанні: 1) | +| **Дыяпазон старонак** | Якія старонкі апрацаваць (пуста = усе старонкі) | + +## Сцэнарыі выкарыстання + +- Друк PDF памеру постэра на стандартных аркушах A4 або Letter для зборкі на сцяне +- Стварэнне вялікіх банераў з аднастаронкавага дызайну PDF +- Падзел вялікіх тэхнічных чарцяжоў на фрагменты для друку +- Друк вялікага фармату без шырокафарматнага прынтара + +## Парады + +- Сетка 2x2 ператварае адну старонку ў 4. Сетка 3x3 ператварае адну старонку ў 9. Плануйце сетку ў залежнасці ад жаданага памеру сабранага выніку. +- Сетка ў папярэднім праглядзе дапамагае пераканацца, што важны змест не трапляе на лінію разрэзу. Пры неабходнасці змяніце радкі або слупкі. +- Для адваротнай аперацыі (размяшчэнне некалькіх старонак на адным аркушы) выкарыстоўвайце [N-Up PDF](./n-up-pdf). + +## Звязаныя інструменты + +- [N-Up PDF](./n-up-pdf) +- [Падзяліць старонкі](./divide-pages) +- [Падзяліць PDF](./split-pdf) diff --git a/docs/be/tools/powerpoint-to-pdf.md b/docs/be/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..4da267b3 --- /dev/null +++ b/docs/be/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint у PDF +description: Пераўтварайце прэзентацыі PowerPoint (PPT, PPTX) і файлы ODP у PDF з захаваннем афармлення слайдаў. +--- + +# PowerPoint у PDF + +Пераўтварайце файлы прэзентацый у PDF. Кожны слайд становіцца старонкай выніковага дакумента, а тэкст, відарысы, фігуры і пераходы адмалёўваюцца рухавіком LibreOffice, які працуе ў браўзеры. Падтрымліваюцца сучасныя і старыя фарматы PowerPoint, а таксама фармат OpenDocument Presentation. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :------------------------ | :-------- | +| PowerPoint (сучасны) | `.pptx` | +| PowerPoint (стары) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы прэзентацый. +2. Праверце спіс файлаў. Дадайце або выдаліце файлы пры неабходнасці. +3. Націсніце **Канвертаваць у PDF**. Рухавік LibreOffice загружаецца пры першым выкарыстанні, а потым пераўтварае кожны файл. +4. Адзін файл спампоўваецца адразу як PDF. Некалькі файлаў пакуюцца ў `powerpoint-converted.zip`. + +## Параметры + +У гэтага інструмента няма дадатковых налад. Слайды адмалёўваюцца ў іх родных памерах. + +## Вынік + +| Колькасць файлаў | Вынік | +| :--------------- | :--------------------------------------------------------------- | +| 1 файл | Спампоўка аднаго PDF (зыходная назва файла з пашырэннем `.pdf`) | +| 2+ файлы | Архіў ZIP (`powerpoint-converted.zip`) з адным PDF на кожны файл | + +## Сцэнарыі выкарыстання + +- Пераўтварэнне прэзентацыі ў PDF перад тым, як падзяліцца ёю з аўдыторыяй, у якой можа не быць PowerPoint +- Стварэнне версіі слайдаў для друку на канферэнцыю або семінар +- Архіваванне прэзентацый у фармаце, які аднолькава адлюстроўваецца на любой прыладзе +- Пакетнае пераўтварэнне бібліятэкі прэзентацый ODP з LibreOffice Impress у PDF +- Стварэнне PDF-версіі пітч-дэка для ўкладанняў у электронныя лісты + +## Парады + +- Анімацыі і пераходы слайдаў не перадаюцца ў PDF. Кожны слайд захоўваецца як статычная старонка. +- Убудаваныя відэа не з'явяцца ў выніку. Пры неабходнасці замяніце іх скрыншотам або відарысам-запаўняльнікам. +- Нататкі дакладчыка не ўключаюцца ў стандартны экспарт PDF. Калі вам патрэбны нататкі, спачатку экспартуйце з рэжыму "Друк нататак" у самім PowerPoint. +- Рухавік LibreOffice кэшуецца пасля першай загрузкі, таму пераўтварэнне наступнай прэзентацыі ў той жа сесіі адбываецца значна хутчэй. + +## Звязаныя інструменты + +- [Word у PDF](./word-to-pdf) +- [Excel у PDF](./excel-to-pdf) +- [Відарысы ў PDF](./image-to-pdf) diff --git a/docs/be/tools/prepare-pdf-for-ai.md b/docs/be/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..1a3d4cd7 --- /dev/null +++ b/docs/be/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Падрыхтаваць PDF для ШI +description: Выцягвайце змест PDF у структураваны JSON, аптымізаваны для LLM і ШI-канвеераў, такіх як LlamaIndex. Падтрымліваецца пакетная апрацоўка. +--- + +# Падрыхтаваць PDF для ШI + +Выцягвае змест з файлаў PDF і структуруе яго ў JSON, аптымізаваны для апрацоўкі вялікімі моўнымі мадэлямі (LLM) і ШI-фрэймворкамі, такімі як LlamaIndex. Змест кожнай старонкі выцягваецца і арганізуецца ў структураваны фармат, гатовы для RAG-канвеераў, чат-ботаў або сістэм семантычнага пошуку. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі PDF, націснуўшы на вобласць загрузкі або перацягнуўшы файлы на яе. +2. Націсніце **Выняць для ШІ**, каб пачаць апрацоўку. +3. Адзін файл спампоўваецца як `filename_llm.json`. Некалькі файлаў ствараюць архіў `pdf-for-ai.zip`. + +Інструмент выкарыстоўвае інтэграцыю PyMuPDF з LlamaIndex, каб выцягваць змест на ўзроўні старонак разам з метаданымі, і стварае вынік, які можна адразу загрузіць у ШI-фрэймворкі. + +## Параметры + +У гэтага інструмента няма наладжвальных параметраў. Усе старонкі выцягваюцца з поўным тэкстам і метаданымі. + +## Фармат выніку + +- **Адзін файл**: `filename_llm.json` +- **Некалькі файлаў**: `pdf-for-ai.zip` з адным `_llm.json` на кожны ўваходны PDF. + +Вынік у JSON адпавядае схеме дакумента LlamaIndex з тэкставым зместам і палямі метаданых для кожнай старонкі. + +## Сцэнарыі выкарыстання + +- Падрыхтоўка дакументаў PDF для канвеераў генерацыі з дапамогай пошуку (RAG). +- Стварэнне базы ведаў з архіваў PDF для ШI-чат-бота. +- Перадача справаздач PDF у працоўныя працэсы аналізу на аснове LLM. +- Папярэдняя апрацоўка навуковых артыкулаў для семантычнага пошуку і сістэм адказаў на пытанні. +- Стварэнне структураваных навучальных даных з калекцый дакументаў PDF. + +## Парады + +- Для простага выцягвання тэксту без фарматавання для ШI выкарыстоўвайце [PDF у тэкст](./pdf-to-text). +- Для выніку ў Markdown з захаваннем загалоўкаў і структуры выкарыстоўвайце [PDF у Markdown](./pdf-to-markdown). +- Сканаваныя PDF дадуць пусты або мінімальны вынік. Спачатку прапусціце іх праз OCR, каб дадаць тэкставы пласт. + +## Звязаныя інструменты + +- [PDF у тэкст](./pdf-to-text) +- [PDF у Markdown](./pdf-to-markdown) +- [PDF у JSON](./pdf-to-json) diff --git a/docs/be/tools/protect-pdf.md b/docs/be/tools/protect-pdf.md new file mode 100644 index 00000000..02e988f1 --- /dev/null +++ b/docs/be/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Абараніць PDF +description: Абараняйце файлы PDF паролем з 256-бітным шыфраваннем AES. Задавайце пароль карыстальніка і пароль уладальніка з наладжвальнымі абмежаваннямі выкарыстання. +--- + +# Абараніць PDF + +Закрыйце PDF паролем, каб адкрыць яго маглі толькі ўпаўнаважаныя людзі. BentoPDF выкарыстоўвае 256-бітнае шыфраванне AES (той жа стандарт, што выкарыстоўваюць банкі і дзяржаўныя ўстановы), і ўсё гэта выконваецца цалкам у вашым браўзеры праз QPDF. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Увядзіце **Пароль карыстальніка** (абавязкова). Гэта пароль, які спатрэбіцца, каб адкрыць файл. +3. Пры жаданні ўвядзіце **Пароль уладальніка**. Калі ён зададзены, PDF атрымлівае абмежаванні, якія забараняюць друк, рэдагаванне, капіраванне і анатаванне. +4. Націсніце **Зашыфраваць PDF**. +5. Спампуйце зашыфраваны файл. + +## Тыпы пароляў + +### Пароль карыстальніка (абавязковы) + +Пароль карыстальніка атрымальнікі ўводзяць, каб адкрыць PDF. Без яго дакумент цалкам недаступны. Кожны зашыфраваны PDF павінен яго мець. + +### Пароль уладальніка (неабавязковы) + +Пароль уладальніка вызначае, што ўпаўнаважаны карыстальнік можа рабіць пасля адкрыцця файла. Калі вы задаяце асобны пароль уладальніка, BentoPDF аўтаматычна ўжывае самы строгі набор абмежаванняў: + +- Змяненне забаронена +- Выцягванне і капіраванне забаронены +- Друк забаронены +- Анатаванне забаронена +- Запаўненне формаў забаронена +- Зборка дакумента забаронена + +Калі пакінуць пароль уладальніка пустым, PDF будзе зашыфраваны (для адкрыцця ўсё роўна патрэбны пароль карыстальніка), але пасля адкрыцця не будзе мець абмежаванняў. + +## Падрабязнасці шыфравання + +- **Алгарытм**: AES-256 (256-бітны Advanced Encryption Standard) +- **Даўжыня ключа**: 256 біт +- **Стандарт**: шыфраванне PDF 2.0 (рэалізацыя QPDF) + +AES-256 практычна немагчыма ўзламаць перабором з сучаснымі тэхналогіямі. Бяспека вашага зашыфраванага PDF цалкам залежыць ад надзейнасці пароля. + +## Сцэнарыі выкарыстання + +- Абарона канфідэнцыйных фінансавых справаздач перад адпраўкай па электроннай пошце +- Абарона юрыдычных дакументаў, якія перадаюцца процілегламу боку +- Даданне пароля да медыцынскіх запісаў або персанальных даных +- Распаўсюджванне платнага кантэнту (электронныя кнігі, справаздачы) з кантролем доступу +- Выкананне палітык аховы даных, якія патрабуюць шыфравання пры захоўванні + +## Парады + +- Выкарыстоўвайце надзейны ўнікальны пароль. Ідэальна падыходзіць парольная фраза з 12+ сімвалаў з вялікімі і малымі літарамі, лічбамі і сімваламі. +- Перадавайце пароль па асобным канале (тэлефон, SMS), ніколі не ў тым жа лісце, што і PDF. +- Калі трэба толькі абмежаваць дзеянні (без друку, без капіравання), не патрабуючы пароля для адкрыцця, выкарыстоўвайце інструмент "Змяніць дазволы". + +## Звязаныя інструменты + +- [Расшыфраваць PDF](./unlock-pdf): выдаліць шыфраванне, калі вы ведаеце пароль +- [Змяніць дазволы](./change-permissions): змяніць пэўныя абмежаванні выкарыстання +- [Выдаліць абмежаванні](./remove-restrictions): прыбраць усю абарону з PDF +- [Ачысціць PDF](./sanitize-pdf): выдаліць схаваны змест перад шыфраваннем diff --git a/docs/be/tools/psd-to-pdf.md b/docs/be/tools/psd-to-pdf.md new file mode 100644 index 00000000..781fe444 --- /dev/null +++ b/docs/be/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD у PDF +description: Пераўтварайце файлы Photoshop (PSD) у PDF у браўзеры. Бясплатна, прыватна, без праграм Adobe. +--- + +# PSD у PDF + +Пераўтварайце файлы Adobe Photoshop PSD у дакументы PDF. PSD з'яўляецца родным фарматам Photoshop, і каб адкрыць яго, звычайна патрэбна дарагая праграма Adobe. Гэты інструмент адмалёўвае зведзены кампазітны відарыс вашага файла PSD як старонку PDF у поўным разрозненні. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :-------------- | :-------- | :------------------------------------- | +| Adobe Photoshop | `.psd` | Адмалёўвае зведзены кампазітны відарыс | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы PSD. Падтрымліваецца некалькі файлаў. +2. Праверце спіс файлаў. Выдаліце непатрэбныя файлы значком сметніцы або дадайце іншыя праз **Дадаць больш файлаў**. +3. Націсніце **Канвертаваць у PDF**. Рухавік PyMuPDF чытае файл PSD і ўбудоўвае кампазітны відарыс у старонку PDF у зыходным разрозненні. +4. Адзін PSD дае адзін PDF. Калі вы загружаеце некалькі файлаў PSD, яны аб'ядноўваюцца ў адзін шматстаронкавы PDF з назвай `psd_to_pdf.pdf`, дзе кожны PSD становіцца адной старонкай. + +## Параметры + +Налады не патрэбныя. Канвертар выкарыстоўвае зведзеныя даныя відарыса з файла PSD. + +## Сцэнарыі выкарыстання + +- Прагляд дызайнаў Photoshop без адкрыцця Photoshop +- Адпраўка макетаў кліентам, у якіх няма Adobe Creative Suite +- Друк выяў высокага разрознення з файлаў PSD +- Стварэнне партфоліо PDF з некалькіх файлаў PSD: кожны становіцца старонкай аднаго дакумента + +## Парады + +- Пераўтварэнне адмалёўвае кампазітны (зведзены) выгляд PSD. Асобныя пласты, карэкцыйныя пласты і эфекты пластоў не захоўваюцца ў PDF як асобныя элементы. +- Некалькі файлаў PSD аб'ядноўваюцца ў адзін шматстаронкавы PDF, а не ў асобныя PDF. Гэта зручна для стварэння партфоліо або лукбукаў. +- Файлы PSD з вельмі высокім разрозненнем (файлы для друку 300+ DPI) дадуць вялікія PDF. Інструмент захоўвае поўнае разрозненне. + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [VSD у PDF](./vsd-to-pdf) diff --git a/docs/be/tools/pub-to-pdf.md b/docs/be/tools/pub-to-pdf.md new file mode 100644 index 00000000..383bf294 --- /dev/null +++ b/docs/be/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB у PDF +description: Пераўтварайце файлы Microsoft Publisher (PUB) у PDF у браўзеры. Бясплатна, прыватна, без дадатковых праграм. +--- + +# PUB у PDF + +Пераўтварайце файлы Microsoft Publisher у PDF. Publisher з'яўляецца праграмай для настольнай вёрсткі, якая ўваходзіць у некаторыя выданні Microsoft Office, але ў большасці людзей яна не ўсталявана. Гэты інструмент дазваляе любому пераўтварыць файлы PUB у PDF проста ў браўзеры, без праграм Microsoft. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :------------------ | :-------- | :--------------------------- | +| Microsoft Publisher | `.pub` | Дакументы настольнай вёрсткі | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы PUB. Можна загрузіць некалькі файлаў адразу. +2. Праверце спіс файлаў. Выдаліце непатрэбныя файлы значком сметніцы або націсніце **Дадаць больш файлаў**, каб дадаць іншыя. +3. Націсніце **Канвертаваць у PDF**. Рухавік на аснове LibreOffice загружаецца ў браўзеры і пераўтварае кожны файл PUB, захоўваючы макет, відарысы і тэкставыя блокі. +4. Адзін файл спампоўваецца адразу як PDF. Некалькі файлаў перадаюцца ў архіве ZIP з назвай `pub-to-pdf.zip`. + +## Параметры + +Дадатковая налада не патрэбна. Канвертар аўтаматычна апрацоўвае макет PUB. + +## Сцэнарыі выкарыстання + +- Адкрыццё флаера або бюлетэня PUB ад кліента без набыцця Microsoft Publisher +- Пераўтварэнне царкоўных бюлетэняў, праграм мерапрыемстваў або школьных газет, створаных у Publisher +- Архіваванне маркетынгавых матэрыялаў з Publisher у агульнадаступным фармаце +- Друк файлаў PUB на сістэме без усталяванага Publisher + +## Парады + +- Складаныя макеты Publisher з накладзенымі тэкставымі блокамі і дакладным пазіцыянаваннем могуць крыху зрушыцца пры пераўтварэнні. Праверце вынік, калі дакладнае размяшчэнне важнае. +- Рухавік LibreOffice ініцыялізуецца адзін раз за сесію. Першае пераўтварэнне займае больш часу, наступныя хутчэйшыя. +- Для найбольш дакладнага пераўтварэння файлаў Publisher пераканайцеся, што ўсе шрыфты ў арыгінале з'яўляюцца стандартнымі сістэмнымі шрыфтамі. + +## Звязаныя інструменты + +- [VSD у PDF](./vsd-to-pdf) +- [ODP у PDF](./odp-to-pdf) diff --git a/docs/be/tools/rasterize-pdf.md b/docs/be/tools/rasterize-pdf.md new file mode 100644 index 00000000..388545d3 --- /dev/null +++ b/docs/be/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Растарызаваць PDF +description: Пераўтварайце старонкі PDF у PDF на аснове відарысаў. Зводзьце ўсе пласты, выдаляйце вылучальны тэкст і кіруйце DPI і фарматам відарысаў. +--- + +# Растарызаваць PDF + +Растарызацыя пераўтварае кожную старонку PDF у відарыс і збірае гэтыя відарысы назад у PDF. Вынік выглядае гэтак жа, як арыгінал, але не мае вылучальнага тэксту, інтэрактыўных элементаў і рэдагавальных пластоў. Па сутнасці, гэта якасная ксеракопія. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі файлаў PDF. +2. Задайце **DPI** (разрозненне) выніку. +3. Выберыце **Фармат выявы**: PNG для якасці без страт або JPEG для меншых файлаў. +4. Пры жаданні адзначце **Пераўтварыць у адценні шэрага**. +5. Націсніце **Растарызаваць PDF**. Некалькі файлаў спампоўваюцца як ZIP. + +## Параметры + +| Налада | Значэнні | Па змаўчанні | +| --------------------------------- | ----------------------------- | ------------ | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Фармат выявы** | PNG (без страт), JPEG (меншы) | PNG | +| **Пераўтварыць у адценні шэрага** | Укл./Выкл. | Выкл. | + +## Рэкамендацыі па DPI + +- **72**: толькі для прагляду на экране, найменшы памер файла +- **150**: добры баланс для звычайнага выкарыстання +- **200**: больш выразны тэкст, умераны памер файла +- **300**: якасць для друку +- **600**: высокая якасць для архівавання або прафесійнага друку + +## Сцэнарыі выкарыстання + +- Прадухіленне выцягвання тэксту з канфідэнцыйных дакументаў перад перадачай +- Пазбаўленне ад праблем з шрыфтамі праз пераўтварэнне тэксту ў пікселі +- Стварэнне "плоскай" версіі PDF са складанымі пластамі або празрыстасцю, якія па-рознаму адлюстроўваюцца ў розных праграмах +- Падрыхтоўка PDF для сістэмы, якая прымае толькі відарысы +- Выдаленне схаванага зместу (напрыклад, адсочаных змен або даных формаў) шляхам ператварэння PDF у чыстыя відарысы + +## Парады + +- 150 DPI у PNG з'яўляецца надзейным значэннем па змаўчанні. Павялічвайце толькі для друку або калі трэба набліжаць дробныя дэталі. +- JPEG дае прыкметна меншыя файлы, але дадае артэфакты сціскання на рэзкіх краях тэксту. +- Растарызацыя незваротная: захоўвайце арыгінальны PDF, калі пазней можа спатрэбіцца рэдагавальны тэкст. + +## Звязаныя інструменты + +- [Сціснуць PDF](./compress-pdf): паменшыць памер растарызаванага PDF +- [Выпрастаць PDF](./deskew-pdf): выраўнаваць старонкі перад растарызацыяй сканаваных дакументаў +- [Шрыфт у контуры](./font-to-outline): пераўтварыць шрыфты ў вектарныя контуры, каб захаваць маштабаванасць +- [Звесці PDF](./flatten-pdf): звесці формы без пераўтварэння ў відарысы diff --git a/docs/be/tools/remove-annotations.md b/docs/be/tools/remove-annotations.md new file mode 100644 index 00000000..cdd0b1d4 --- /dev/null +++ b/docs/be/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Выдаліць анатацыі +description: Выдаляйце ўсе каментарыі, вылучэнні, спасылкі і іншыя анатацыі з PDF адным націскам. +--- + +# Выдаліць анатацыі + +Ачысціце PDF, выдаліўшы ўсе анатацыі: каментарыі, вылучэнні, нататкі-налепкі, тэкставую разметку, спасылкі, штампы і любыя іншыя аб'екты анатацый у дакуменце. Асноўны змест старонак (тэкст, відарысы, графіка) застаецца некранутым. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Інструмент вызначае колькасць старонак дакумента і паказвае звесткі пра файл. +3. Націсніце **Выдаліць анатацыі**, каб пачаць апрацоўку. +4. Ачышчаны PDF без анатацый спампоўваецца аўтаматычна. + +## Магчымасці + +- Выдаляе ўсе тыпы анатацый: каментарыі, вылучэнні, падкрэсліванні, закрэсліванні, нататкі-налепкі, штампы, спасылкі і разметку формаў +- Апрацоўвае кожную старонку дакумента +- Захоўвае ўвесь змест, які не з'яўляецца анатацыямі (тэкст, відарысы, вектарную графіку, палі формаў) +- Паказвае колькасць старонак і памер файла перад апрацоўкай + +## Сцэнарыі выкарыстання + +- Ачыстка дакумента перад канчатковым распаўсюджваннем пасля рэцэнзавання, калі некалькі рэцэнзентаў дадалі каментарыі +- Выдаленне вылучэнняў і нататак-налепак з агульнага навучальнага дапаможніка +- Выдаленне анатацый-спасылак з дакумента перад архіваваннем +- Падрыхтоўка "чыстай" версіі юрыдычнага дакумента, які актыўна анатаваўся падчас перамоў +- Выдаленне каментарыяў рэцэнзентаў з рукапісу перад адпраўкай у друк + +## Парады + +- Гэты інструмент выдаляе анатацыі на ўзроўні структуры PDF, таму вынік захоўвае вылучальны тэкст і зыходную якасць, без растарызацыі. +- Калі трэба выдаліць толькі пэўныя анатацыі, а не ўсе, выкарыстоўвайце [Рэдактар PDF](./edit-pdf), каб выбіральна выдаліць асобныя анатацыі. +- Анатацыі ў зведзеных PDF (дзе анатацыі ўжо аб'яднаны са зместам старонкі) выдаліць немагчыма, бо яны больш не з'яўляюцца асобнымі аб'ектамі. + +## Звязаныя інструменты + +- [Рэдактар PDF](./edit-pdf) +- [Дадаць вадзяны знак](./add-watermark) +- [Падпісаць PDF](./sign-pdf) diff --git a/docs/be/tools/remove-blank-pages.md b/docs/be/tools/remove-blank-pages.md new file mode 100644 index 00000000..7c31a8b7 --- /dev/null +++ b/docs/be/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Выдаліць пустыя старонкі +description: Аўтаматычна знаходзьце і выдаляйце пустыя або амаль пустыя старонкі з PDF з наладжвальнай адчувальнасцю. +--- + +# Выдаліць пустыя старонкі + +Праскануйце PDF на наяўнасць пустых або амаль пустых старонак і аўтаматычна выдаліце іх. Інструмент адмалёўвае кожную старонку і аналізуе яе пікселі, каб вызначыць, ці пустая яна, а потым дазваляе пацвердзіць, якія старонкі выдаліць, перад апрацоўкай. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Наладзьце паўзунок **Адчувальнасць**, каб вызначыць, наколькі строга вызначаецца "пустая" старонка. +3. Націсніце **Знайсці пустыя старонкі**, каб праскануваць дакумент. +4. Інструмент паказвае мініяцюры знойдзеных пустых старонак для праверкі. +5. Пацвердзіце выбар і спампуйце ачышчаны PDF без пустых старонак. + +## Параметры + +- **Адчувальнасць**: паўзунок ад 0% да 100% (па змаўчанні 80%). Больш высокія значэнні строжэйшыя і адзначаюць толькі цалкам або амаль белыя старонкі. Ніжэйшыя значэнні мякчэйшыя і ловяць старонкі з мінімальным зместам, напрыклад з адной кропкай або бледным вадзяным знакам. + +## Магчымасці + +- Аналіз кожнай старонкі на ўзроўні пікселяў для выяўлення пустога зместу +- Наладжвальны паўзунок адчувальнасці для дакладнай налады выяўлення +- Мініяцюры знойдзеных пустых старонак для ручной праверкі +- Захоўвае ўсе непустыя старонкі без змен +- Апрацоўвае дакументы любога памеру і з любой колькасцю старонак +- Паказ прагрэсу падчас сканавання + +## Сцэнарыі выкарыстання + +- Ачыстка сканаваных дакументаў, дзе сканер захапіў пустыя адваротныя бакі аднабаковых арыгіналаў +- Выдаленне раздзяляльных старонак з пакетаў масава сканаваных дакументаў +- Выдаленне пустых старонак, устаўленых сістэмамі кіравання дакументамі +- Ачыстка PDF, экспартаваных з тэкставых рэдактараў, якія часам дадаюць пустыя старонкі ў канцы +- Памяншэнне памеру файла за кошт выдалення непатрэбных пустых старонак + +## Парады + +- Пачніце са стандартнай адчувальнасці 80% і падладжвайце ад яе. Калі інструмент прапускае старонкі, якія вам здаюцца пустымі, панізьце адчувальнасць. Калі ён адзначае старонкі са слабым зместам, які вы хочаце захаваць, павысьце яе. +- Інструмент адмалёўвае кожную старонку для аналізу, таму час апрацоўкі расце з колькасцю старонак. Для вельмі вялікіх дакументаў давядзецца крыху пачакаць. +- Праглядзіце знойдзеныя пустыя старонкі ў мініяцюрах перад пацвярджэннем выдалення. Старонкі з бледнымі калантытуламі або вадзянымі знакамі могуць быць адзначаны ў залежнасці ад адчувальнасці. + +## Звязаныя інструменты + +- [Абрэзаць PDF](./crop-pdf) +- [Рэдактар PDF](./edit-pdf) +- [Нумары старонак](./page-numbers) diff --git a/docs/be/tools/remove-metadata.md b/docs/be/tools/remove-metadata.md new file mode 100644 index 00000000..5ada9073 --- /dev/null +++ b/docs/be/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Выдаліць метаданыя +description: Выдаляйце ўсе схаваныя метаданыя з файлаў PDF, уключаючы аўтара, назву, дату стварэння, вытворцу, даныя XMP і ідэнтыфікатары дакумента. +--- + +# Выдаліць метаданыя + +Кожны PDF змяшчае метаданыя, якія могуць паказаць, хто яго стварыў, якая праграма выкарыстоўвалася, калі ён апошні раз змяняўся, і іншае. Гэты інструмент выдаляе ўсё гэта: слоўнік Info, патокі метаданых XMP, ідэнтыфікатары дакумента і спецыфічныя для праграм даныя, пакідаючы чысты дакумент без слядоў паходжання. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Націсніце **Выдаліць метаданыя**. +3. Спампуйце ачышчаны файл. + +Налад няма. Інструмент наўмысна грунтоўны: ён ачышчае ўсё. + +## Што выдаляецца + +- **Палі слоўніка Info**: загаловак, аўтар, тэма, ключавыя словы, стваральнік, вытворца, дата стварэння, дата змянення +- **Паток метаданых XMP**: блок метаданых на аснове XML, які захоўваецца ў каталогу дакумента +- **Ідэнтыфікатары дакумента**: унікальныя ідэнтыфікатары ў трэйлеры PDF, якія можна выкарыстоўваць для адсочвання дакумента паміж сістэмамі +- **PieceInfo**: спецыфічныя метаданыя, дададзеныя праграмамі накшталт Illustrator або InDesign + +## Што застаецца + +- Увесь бачны змест старонак (тэкст, відарысы, графіка) +- Палі формаў і анатацыі +- Закладкі і спасылкі +- Сама структура дакумента + +## Сцэнарыі выкарыстання + +- Выдаленне вашага імя і арганізацыі з дакумента перад ананімнай публікацыяй +- Выдаленне часовых метак стварэння, якія паказваюць, калі дакумент быў падрыхтаваны +- Ачыстка радкоў вытворцы, якія ідэнтыфікуюць ваша праграмнае забеспячэнне для PDF +- Падрыхтоўка дакументаў для рэгулятарных падач, якія патрабуюць PDF без метаданых +- Выдаленне слядоў гісторыі рэдагавання перад перадачай дакумента вонкі + +## Парады + +- Спачатку выкарыстайце інструмент "Праглядзець метаданыя", каб убачыць, якія менавіта метаданыя ёсць у PDF, перад іх выдаленнем. +- Калі трэба выдаліць метаданыя _і_ JavaScript, анатацыі і ўбудаваныя файлы, выкарыстоўвайце "Ачысціць PDF" для больш грунтоўнай ачысткі. +- Выдаленне метаданых незваротнае. Захавайце арыгінал, калі гэтыя даныя могуць спатрэбіцца пазней. + +## Звязаныя інструменты + +- [Ачысціць PDF](./sanitize-pdf): выдаліць метаданыя, а таксама скрыпты, далучэнні і іншае +- [Зашыфраваць PDF](./protect-pdf): абараніць ачышчаны PDF паролем +- [Сціснуць PDF](./compress-pdf): выдаленне метаданых можа крыху паменшыць памер файла; сцісканне дае большую эканомію diff --git a/docs/be/tools/remove-restrictions.md b/docs/be/tools/remove-restrictions.md new file mode 100644 index 00000000..14755d42 --- /dev/null +++ b/docs/be/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Выдаліць абмежаванні +description: Выдаляйце абарону паролем, абмежаванні друку, блакіроўкі рэдагавання і забароны капіравання з файлаў PDF. +--- + +# Выдаліць абмежаванні + +PDF можа мець два тыпы пароляў: пароль карыстальніка (патрэбны для адкрыцця файла) і пароль уладальніка (вызначае, што можна рабіць з файлам). Гэты інструмент выдаляе абодва разам з усімі звязанымі абмежаваннямі: блакіроўкамі друку, рэдагавання, капіравання і анатавання. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Калі PDF мае пароль уладальніка, увядзіце яго ў поле **Пароль уладальніка**. Пакіньце поле пустым, калі PDF мае толькі абмежаванні выкарыстання без пароля. +3. Націсніце **Выдаліць абмежаванні**. +4. Спампуйце PDF без абмежаванняў. + +Інструмент выкарыстоўвае сцягі QPDF `--decrypt` і `--remove-restrictions`, каб стварыць чыстую копію без абмежаванняў. + +## Што выдаляецца + +- Абарона паролем (і пароль карыстальніка, і пароль уладальніка) +- Абмежаванні друку +- Абмежаванні рэдагавання +- Абмежаванні капіравання тэксту і відарысаў +- Абмежаванні анатавання і каментавання +- Усе іншыя абмежаванні бяспекі, закадаваныя ў PDF + +## Сцэнарыі выкарыстання + +- Разблакіроўка вашага ўласнага PDF, пароль якога вы задалі шмат гадоў таму +- Выдаленне абмежаванняў друку з дакумента, да якога ў вас ёсць законны доступ +- Уключэнне капіравання і ўстаўкі ў даведачных матэрыялах для нататак +- Падрыхтоўка PDF для інструментаў даступнасці, якія не працуюць з абмежаванымі дакументамі + +## Парады + +- Калі пароль уладальніка зададзены, вы павінны яго ведаць. Гэты інструмент не ўзломвае і не падбірае паролі. +- Калі трэба пакінуць файл зашыфраваным, але змяніць пэўныя дазволы, выкарыстоўвайце інструмент "Змяніць дазволы". +- Выніковы файл зусім не зашыфраваны: любы, хто яго атрымае, зможа свабодна яго адкрыць. + +## Звязаныя інструменты + +- [Расшыфраваць PDF](./unlock-pdf): разблакіраваць PDF, калі вы ведаеце пароль карыстальніка +- [Зашыфраваць PDF](./protect-pdf): зноў зашыфраваць з новымі наладамі +- [Змяніць дазволы](./change-permissions): выбіральна змяніць дазволеныя дзеянні diff --git a/docs/be/tools/repair-pdf.md b/docs/be/tools/repair-pdf.md new file mode 100644 index 00000000..1495d3a6 --- /dev/null +++ b/docs/be/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Аднавіць PDF +description: Аднаўляйце даныя з пашкоджаных файлаў PDF з дапамогай рухавіка аднаўлення QPDF. Падтрымліваецца пакетная апрацоўка. +--- + +# Аднавіць PDF + +Калі PDF не адкрываецца, паказвае скажоны змест або выклікае памылкі ў праграме прагляду, гэты інструмент спрабуе перабудаваць яго ўнутраную структуру. Ён выкарыстоўвае рухавік аднаўлення QPDF, які можа аднавіць даныя пры многіх відах пашкоджанняў: зламаных табліцах перакрыжаваных спасылак, абрэзаных патоках, няслушных спасылках на аб'екты і іншых. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі пашкоджаных файлаў PDF. +2. Націсніце **Аднавіць PDF**. +3. Адзін адноўлены файл спампоўваецца адразу. Некалькі файлаў ствараюць архіў ZIP. + +Інструмент прапускае кожны файл праз QPDF са сцягам `--decrypt`, які прымушае QPDF прачытаць і перазапісаць усю структуру PDF, па ходзе выпраўляючы праблемы, якія можна выправіць. + +## Магчымасці + +- Пакетнае аднаўленне некалькіх PDF за адну аперацыю +- Аўтаматычнае вызначэнне файлаў, якія можна і нельга аднавіць +- Справаздача пра поспех або памылку для кожнага файла пры апрацоўцы некалькіх файлаў +- Выкарыстоўвае QPDF (WebAssembly), правераную часам бібліятэку пераўтварэння PDF + +## Што можна выправіць + +- Зламаныя або адсутныя табліцы перакрыжаваных спасылак +- Абрэзаныя канцы файлаў пасля незавершаных спамповак +- Няслушную нумарацыю аб'ектаў і даўжыні патокаў +- Дробныя структурныя неадпаведнасці ад памылковых генератараў PDF +- Артэфакты шыфравання пасля няўдалых спроб расшыфроўкі + +## Што выправіць нельга + +- Моцна абрэзаныя файлы, у якіх адсутнічае большая частка даных +- PDF, зашыфраваныя паролем, якога ў вас няма +- Файлы, якія насамрэч не з'яўляюцца PDF (няправільнае пашырэнне) +- Пашкоджанне відарысаў унутры PDF (структура выпраўляецца, але даныя пікселяў не ствараюцца нанова) + +## Сцэнарыі выкарыстання + +- Аднаўленне PDF пасля няўдалай спампоўкі з электроннай пошты +- Адкрыццё файлаў, створаных старымі або нестандартнымі генератарамі PDF +- Выпраўленне PDF, якія працуюць у адной праграме прагляду, але не ў іншай +- Падрыхтоўка пашкоджаных архіўных дакументаў да доўгатэрміновага захоўвання + +## Парады + +- Калі аднавіць не атрымалася, паспрабуйце спачатку адкрыць файл у браўзеры: у браўзераў ёсць уласная логіка аднаўлення, і яны могуць адмаляваць дастаткова зместу для паўторнага захавання. +- Для зашыфраваных PDF, якія не ўдаецца аднавіць, спачатку выкарыстайце "Расшыфраваць PDF", а потым аднавіце расшыфраваны вынік. + +## Звязаныя інструменты + +- [Сціснуць PDF](./compress-pdf): дадаткова ачысціць структуру адноўленага PDF +- [Зрабіць лінейны PDF](./linearize-pdf): аптымізаваць адноўлены файл для вэб-дастаўкі +- [Звесці PDF](./flatten-pdf): звесці формы, якія маглі быць пашкоджаны diff --git a/docs/be/tools/reverse-pages.md b/docs/be/tools/reverse-pages.md new file mode 100644 index 00000000..f0908987 --- /dev/null +++ b/docs/be/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Адваротны парадак старонак +description: Перавярніце парадак старонак аднаго або некалькіх файлаў PDF, каб апошняя старонка стала першай. +--- + +# Адваротны парадак старонак + +Перавярніце парадак старонак PDF, каб апошняя старонка стала першай, перадапошняя другой і гэтак далей. Падтрымліваецца пакетная апрацоўка некалькіх файлаў адразу. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі файлаў PDF. +2. Націсніце кнопку апрацоўкі. +3. Кожны файл апрацоўваецца асобна. Калі вы загрузілі некалькі файлаў, вынікам будзе архіў ZIP з усімі перавернутымі PDF. +4. Адзін файл спампоўваецца адразу як перавернуты PDF. + +## Магчымасці + +- Пакетная апрацоўка: змяненне парадку ў некалькіх PDF за адну аперацыю +- Адзін файл на выхадзе для аднаго PDF, ZIP для некалькіх +- Кнопкі выдалення кожнага файла перад апрацоўкай +- Захоўвае ўвесь змест і фарматаванне старонак + +## Сцэнарыі выкарыстання + +- Выпраўленне дакумента, які быў адсканаваны ў адваротным парадку +- Падрыхтоўка PDF прэзентацыі для чытання з канца ў пачатак +- Змяненне парадку старонак для пэўных працэсаў друку, якія падаюць старонкі ў адваротным парадку +- Выпраўленне дакумента, старонкі якога выпадкова сабралі задам наперад + +## Парады + +- Кожны файл у пакеце перагортваецца асобна: самі файлы не мяняюць парадак адзін адносна аднаго. +- Для больш дэталёвага змянення парадку старонак (не толькі поўнага перагортвання) выкарыстоўвайце [Дубляваць і арганізаваць](./organize-pdf). + +## Звязаныя інструменты + +- [Дубляваць і арганізаваць](./organize-pdf) +- [Павярнуць PDF](./rotate-pdf) +- [Мультыінструмент PDF](./pdf-multi-tool) diff --git a/docs/be/tools/rotate-custom.md b/docs/be/tools/rotate-custom.md new file mode 100644 index 00000000..8800c8ad --- /dev/null +++ b/docs/be/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Павярнуць на зададзены вугал +description: Паварочвайце старонкі PDF на любы вугал з полем градусаў для кожнай старонкі і пакетным кіраваннем паваротам. +--- + +# Павярнуць на зададзены вугал + +Паварочвайце старонкі PDF на любы адвольны вугал, а не толькі з крокам 90 градусаў. Кожная старонка мае ўласнае поле вугла, а з дапамогай пакетнага кіравання можна адразу ўжыць адзін вугал да ўсіх старонак. + +## Як гэта працуе + +1. Загрузіце файл PDF. Для кожнай старонкі адмалёўваюцца мініяцюры. +2. Кожная старонка мае лікавае поле з яе бягучым вуглом павароту. +3. Увядзіце любое значэнне ў градусах (дадатнае або адмоўнае), каб павярнуць пэўную старонку, або выкарыстоўвайце кнопкі ўлева/ўправа для хуткага павароту на 90 градусаў. +4. Выкарыстоўвайце поле **пакетнага вугла** уверсе, каб задаць аднолькавы паварот для ўсіх старонак. +5. Націсніце кнопку апрацоўкі, каб стварыць павернуты PDF. + +## Магчымасці + +- Адвольнае значэнне градусаў для кожнай старонкі (любы цэлы лік) +- Пакетнае кіраванне вуглом для аднолькавага павароту ўсіх старонак +- Папярэдні прагляд павароту ў мініяцюрах у рэальным часе +- Кнопкі хуткага павароту на 90 градусаў для кожнай старонкі +- Адкладзеная загрузка мініяцюр для хуткасці на вялікіх дакументах + +## Сцэнарыі выкарыстання + +- Выпраўленне крыху нахіленых сканаў на некалькі градусаў +- Паварот старонак пад нестандартную арыентацыю +- Дакладны паварот асобных старонак у дакуменце са змешаным зместам +- Тонкая налада вуглоў старонак пасля першаснага масавага павароту + +## Парады + +- Дадатныя значэнні паварочваюць па гадзінніку, адмоўныя супраць гадзінніка. +- Пакетнае поле вугла перазапісвае ўсе вуглы асобных старонак пры ўжыванні. Пры неабходнасці задавайце асобныя налады пасля пакетнай аперацыі. +- Для стандартных паваротаў на 90/180/270 градусаў з прасцейшым інтэрфейсам выкарыстоўвайце [Павярнуць PDF](./rotate-pdf). + +## Звязаныя інструменты + +- [Павярнуць PDF](./rotate-pdf) +- [Мультыінструмент PDF](./pdf-multi-tool) +- [Дубляваць і арганізаваць](./organize-pdf) diff --git a/docs/be/tools/rotate-pdf.md b/docs/be/tools/rotate-pdf.md new file mode 100644 index 00000000..bb426b5e --- /dev/null +++ b/docs/be/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Павярнуць PDF +description: Паварочвайце асобныя старонкі або ўсе старонкі PDF з крокам 90 градусаў праз візуальны інтэрфейс з мініяцюрамі. +--- + +# Павярнуць PDF + +Паварочвайце старонкі PDF на 90 градусаў па гадзінніку або супраць гадзінніка. Інструмент паказвае мініяцюры ўсіх старонак, дазваляючы паварочваць іх асобна або ўжыць масавы паварот да ўсяго дакумента. + +## Як гэта працуе + +1. Загрузіце файл PDF. Мініяцюры ўсіх старонак адмалёўваюцца ў сетцы. +2. Выкарыстоўвайце кнопкі павароту ўлева/ўправа пад кожнай мініяцюрай, каб павярнуць пэўную старонку. +3. Выкарыстоўвайце элементы масавага павароту ўверсе, каб павярнуць усе старонкі адразу. +4. Мініяцюры абнаўляюцца ў рэальным часе, паказваючы паварот. +5. Націсніце кнопку апрацоўкі, каб захаваць павернуты PDF. + +## Магчымасці + +- Паварот кожнай старонкі з крокам 90 градусаў (улева або ўправа) +- Масавы паварот усіх старонак адначасова +- Папярэдні прагляд мініяцюр у рэальным часе з анімацыяй павароту +- Адкладзеная загрузка мініяцюр для плаўнай працы з вялікімі дакументамі +- Захоўвае зыходны змест і якасць старонак + +## Сцэнарыі выкарыстання + +- Выпраўленне сканаваных старонак, якія ляжаць бокам або дагары нагамі +- Паварот альбомных старонак у кніжную арыентацыю (або наадварот) +- Выпраўленне дакумента са змешанай арыентацыяй, дзе частка старонак адсканавана пад няправільным вуглом +- Падрыхтоўка дакумента для пэўнай арыентацыі адлюстравання + +## Парады + +- Павароты сумуюцца. Двайны націск кнопкі па гадзінніку дае паварот на 180 градусаў. +- Для паваротаў, не кратных 90 градусам (напрыклад, 45 градусаў, каб выправіць крыху нахілены скан), выкарыстоўвайце [Павярнуць на зададзены вугал](./rotate-custom). +- Элементы масавага павароту ўплываюць на ўсе старонкі, а не толькі на выбраныя. У гэтым інструменце няма выбару старонак: для гэтага выкарыстоўвайце [Мультыінструмент PDF](./pdf-multi-tool). + +## Звязаныя інструменты + +- [Павярнуць на зададзены вугал](./rotate-custom) +- [Мультыінструмент PDF](./pdf-multi-tool) +- [Дубляваць і арганізаваць](./organize-pdf) diff --git a/docs/be/tools/rtf-to-pdf.md b/docs/be/tools/rtf-to-pdf.md new file mode 100644 index 00000000..ca39d06c --- /dev/null +++ b/docs/be/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF у PDF +description: Пераўтварайце файлы Rich Text Format (RTF) у PDF у браўзеры з дапамогай рухавіка на аснове LibreOffice. +--- + +# RTF у PDF + +Пераўтварайце дакументы Rich Text Format у PDF. RTF з'яўляецца кросплатформенным фарматам дакументаў, які падтрымліваюць практычна ўсе тэкставыя рэдактары. Гэты інструмент выкарыстоўвае рухавік LibreOffice у браўзеры, каб адмаляваць файлы RTF з захаваннем фарматавання: тлусты шрыфт, курсіў, табліцы і ўбудаваныя відарысы пераносяцца ў PDF. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | Тыпы MIME | +| :----- | :-------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце адзін або некалькі файлаў RTF. +2. Праверце спіс файлаў. Дадайце або выдаліце файлы пры неабходнасці. +3. Націсніце **Канвертаваць у PDF**. Рухавік LibreOffice ініцыялізуецца пры першым выкарыстанні, а потым апрацоўвае кожны файл. +4. Адзін файл спампоўваецца адразу як PDF. Некалькі файлаў перадаюцца як `rtf-converted.zip`. + +## Параметры + +У гэтага інструмента няма дадатковых налад. Пераўтварэнне захоўвае зыходнае фарматаванне RTF. + +## Вынік + +| Колькасць файлаў | Вынік | +| :--------------- | :-------------------------------------------------------- | +| 1 файл | Спампоўка аднаго PDF (напрыклад, `letter.pdf`) | +| 2+ файлы | Архіў ZIP (`rtf-converted.zip`) з адным PDF на кожны файл | + +## Сцэнарыі выкарыстання + +- Пераўтварэнне старых дакументаў RTF са старых тэкставых рэдактараў у сучасныя PDF +- Ператварэнне шаблонаў электронных лістоў RTF у папярэдні прагляд PDF +- Апрацоўка вынікаў RTF з юрыдычных або медыцынскіх праграмных сістэм +- Пакетнае пераўтварэнне файлаў RTF з сістэмы кіравання дакументамі ў PDF для архіва + +## Парады + +- Рухавік LibreOffice загружаецца адзін раз і кэшуецца. Першае пераўтварэнне ў сесіі займае некалькі лішніх секунд, наступныя хутчэйшыя. +- Файлы RTF з убудаванымі аб'ектамі OLE могуць адмалёўвацца не ідэальна. Просты тэкст, відарысы і стандартнае фарматаванне пераўтвараюцца надзейна. +- Калі файлы RTF створаны ў Microsoft Word, іх таксама можна пераўтварыць праз інструмент [Word у PDF](./word-to-pdf), які прымае RTF разам з DOC і DOCX. + +## Звязаныя інструменты + +- [Word у PDF](./word-to-pdf) +- [ODT у PDF](./odt-to-pdf) +- [Тэкст у PDF](./txt-to-pdf) diff --git a/docs/be/tools/sanitize-pdf.md b/docs/be/tools/sanitize-pdf.md new file mode 100644 index 00000000..8142b940 --- /dev/null +++ b/docs/be/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Ачысціць PDF +description: Выдаляйце з PDF схаваны і патэнцыйна небяспечны змест, уключаючы метаданыя, JavaScript, убудаваныя файлы, анатацыі і пласты. +--- + +# Ачысціць PDF + +PDF можа змяшчаць значна больш, чым вы бачыце на экране. Схаваныя метаданыя, убудаваны JavaScript, далучаныя файлы, даныя формаў і звесткі пра пласты могуць выдаць адчувальныя даныя або стварыць рызыку бяспекі. Ачыстка выдаляе ўсё гэта і пакідае чысты дакумент, які бяспечна публікаваць. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Выберыце ў спісе элементы, якія трэба выдаліць. +3. Націсніце **Ачысціць PDF**. +4. Спампуйце ачышчаны файл. + +## Параметры ачысткі + +Усе параметры ўключаны па змаўчанні. Зніміце адзнаку з тых, што хочаце захаваць. + +| Параметр | Што выдаляе | +| ------------------------------ | ------------------------------------------------------------------------ | +| **Сплошчыць формы** | Пераўтварае інтэрактыўныя палі формаў у статычны змест | +| **Выдаліць метаданыя** | Выдаляе аўтара, назву, дату стварэння, звесткі пра праграму і даныя XMP | +| **Выдаліць анатацыі** | Выдаляе каментарыі, вылучэнні, нататкі-налепкі і разметку | +| **Выдаліць JavaScript** | Выдаляе ўбудаваныя скрыпты, якія могуць выконвацца пры адкрыцці | +| **Выдаліць убудаваныя файлы** | Выдаляе файлы, далучаныя ўнутры PDF | +| **Выдаліць слаі (OCG)** | Зводзіць групы неабавязковага зместу ў адзін пласт | +| **Выдаліць спасылкі** | Выдаляе гіперспасылкі і спасылкі на URL | +| **Выдаліць дрэва структуры** | Выдаляе структуру дакумента, якая выкарыстоўваецца для тэгаў даступнасці | +| **Выдаліць MarkInfo** | Выдаляе звесткі пра пазначаны змест | +| **Выдаліць убудаваныя шрыфты** | Выдаляе ўбудаваныя даныя шрыфтоў (выкарыстоўвайце асцярожна) | + +## Сцэнарыі выкарыстання + +- Падрыхтоўка PDF да публікацыі з выдаленнем унутраных метаданых (імёнаў аўтараў, версій праграм, гісторыі рэдагавання) +- Выдаленне JavaScript з PDF, атрыманага з ненадзейнай крыніцы, перад адкрыццём +- Ачыстка PDF перад адпраўкай кліенту, які не павінен бачыць убудаваныя каментарыі або назвы палёў формаў +- Выдаленне схаваных пластоў з архітэктурнага чарцяжа перад перадачай канчатковай версіі +- Выкананне патрабаванняў мінімізацыі даных паводле правілаў прыватнасці + +## Парады + +- Не адзначайце "Выдаліць убудаваныя шрыфты", калі не ўпэўнены, што PDF усё роўна будзе адлюстроўвацца правільна. Выдаленне шрыфтоў можа зрабіць тэкст нябачным у некаторых праграмах прагляду. +- Калі трэба выдаліць толькі метаданыя, асобны інструмент "Выдаліць метаданыя" хутчэйшы і больш мэтанакіраваны. +- Ачыстка незваротная. Захавайце арыгінальны файл. + +## Звязаныя інструменты + +- [Выдаліць метаданыя](./remove-metadata): выдаліць толькі метаданыя, не кранаючы іншы змест +- [Звесці PDF](./flatten-pdf): звесці менавіта формы і анатацыі +- [Зашыфраваць PDF](./protect-pdf): дадаць абарону паролем пасля ачысткі +- [Растарызаваць PDF](./rasterize-pdf): радыкальны варыянт, пераўтварэнне ў відарысы для выдалення ўсяго схаванага зместу diff --git a/docs/be/tools/scanner-effect.md b/docs/be/tools/scanner-effect.md new file mode 100644 index 00000000..932ca2ce --- /dev/null +++ b/docs/be/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Эфект сканера +description: Зрабіце PDF падобным да сканаванага дакумента з наладжвальным шумам, паваротам, размыццём і эфектам старой паперы. +--- + +# Эфект сканера + +Ператварыце чысты лічбавы PDF у дакумент, які выглядае так, быццам выйшаў з планшэтнага сканера. Інструмент ужывае наладжвальны шум, лёгкі паварот, размыццё, змяненне яркасці і неабавязковае пажаўценне, каб імітаваць недахопы фізічнага сканавання. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Рэдактар адкрываецца з жывым папярэднім праглядам першай старонкі побач з панэллю налад. +3. Наладзьце параметры эфекту сканавання паўзункамі і пераключальнікамі. +4. Папярэдні прагляд абнаўляецца ў рэальным часе пры змене налад. +5. Націсніце **Ужыць эфект сканера**, каб апрацаваць усе старонкі і спампаваць вынік. + +## Параметры + +- **Colorspace (пераключальнік Grayscale)**: пераўтварыць вынік у адценні шэрага для класічнага чорна-белага выгляду скана. +- **Рамка**: дадаць лёгкую цёмную рамку па краях старонкі, каб імітаваць артэфакты краёў сканера. +- **Паварот**: ужыць лёгкі паварот (ад -5 да +5 градусаў), каб імітаваць крыва пададзеную паперу. +- **Варыяцыя павароту**: дадаць выпадковае адхіленне вугла павароту, каб кожная старонка нахілялася крыху па-рознаму. +- **Яркасць**: павысіць або панізіць агульную яркасць. +- **Кантраст**: наладзіць кантраснасць, каб імітаваць ваганні якасці тонера. +- **Размытасць**: ужыць размыццё па Гаусе, каб змякчыць краі тэксту як у скане нізкай якасці. +- **Шум**: дадаць выпадковы шум пікселяў, каб імітаваць зярністасць сенсара сканера. Больш высокія значэнні даюць больш зярністы вынік. +- **Жаўтаватасць**: дадаць цёплы жоўты адценак, каб імітаваць старую або перапрацаваную паперу. +- **Раздзяляльнасць**: задаць DPI выніку. Ніжэйшыя значэнні ствараюць больш піксельны выгляд, падобны да скана. +- **Скінуць**: вярнуць усе налады да стандартных значэнняў. + +## Магчымасці + +- Папярэдні прагляд у рэальным часе, які абнаўляецца пры змене кожнага параметра +- Выпадковае адхіленне павароту для кожнай старонкі для рэалістычнай варыятыўнасці +- Дзесяць параметраў, якія наладжваюцца незалежна +- Рэжым адценняў шэрага для сапраўднага чорна-белага скана +- Кіраванне разрозненнем ад нізкага DPI, як у факса, да высокага DPI архіўнай якасці + +## Сцэнарыі выкарыстання + +- Каб лічбава створаныя дакументы выглядалі адсканаванымі і надрукаванымі +- Імітацыя старэння фізічных дакументаў для ўзнаўлення гістарычных дакументаў +- Тэставанне праграм OCR на сканах дрэннай якасці +- Стварэнне дакументаў, якія адпавядаюць візуальнаму стылю існых сканаваных архіваў + +## Парады + +- Пачынайце з невялікіх значэнняў. Шум 10-20, лёгкі паварот на 0,5 градуса і мінімальнае размыццё ўжо даюць пераканаўчы выгляд скана. +- Спалучайце рэжым адценняў шэрага з лёгкім пажаўценнем для эфекту "ксеракопіі з ксеракопіі". +- Нізкае разрозненне (100-150 DPI) стварае найбольш рэалістычны выгляд факса. + +## Звязаныя інструменты + +- [Інвертаваць колеры](./invert-colors) +- [Наладзіць колеры](./adjust-colors) +- [Колер фону](./background-color) diff --git a/docs/be/tools/sign-pdf.md b/docs/be/tools/sign-pdf.md new file mode 100644 index 00000000..f9b28c88 --- /dev/null +++ b/docs/be/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Падпісаць PDF +description: Намалюйце, увядзіце або загрузіце подпіс і размясціце яго на старонках PDF ва ўбудаванай праграме прагляду. +--- + +# Падпісаць PDF + +Дадайце свой подпіс у любы дакумент PDF. Інструмент убудоўвае поўную праграму прагляду PDF з інструментамі подпісу, дзе можна намаляваць подпіс ад рукі, увесці імя рукапісным шрыфтам або загрузіць відарыс подпісу. Размяшчайце і змяняйце памер подпісаў на любой старонцы, а потым захавайце падпісаны дакумент. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Дакумент адкрываецца ва ўбудаванай праграме прагляду PDF з інструментамі анатавання. +3. Выкарыстоўвайце інструмент подпісу, каб стварыць подпіс: намаляваць, увесці або загрузіць відарыс. +4. Націсніце на месца на старонцы, дзе трэба размясціць подпіс, і наладзьце яго памер і пазіцыю. +5. Пры жаданні адзначце **Сплошчыць PDF**, каб назаўсёды ўбудаваць подпіс у дакумент. +6. Націсніце **Захаваць і спампаваць падпісаны PDF**, каб атрымаць падпісаны файл. + +## Параметры + +- **Сплошчыць PDF**: калі адзначана, подпіс назаўсёды ўбудоўваецца ў змест старонкі. Гэта не дае іншым перамясціць або выдаліць подпіс. Калі не адзначана, подпіс застаецца анатацыяй, якую можна рэдагаваць у сумяшчальных праграмах прагляду. + +## Магчымасці + +- Тры спосабы стварэння подпісу: малюнак ад рукі, уведзены тэкст або загружаны відарыс +- Убудаваная праграма прагляду PDF для дакладнага размяшчэння +- Перацягванне для размяшчэння і змянення памеру подпісаў на любой старонцы +- Неабавязковае зводжанне для пастаяннага ўбудавання подпісаў +- Падтрымка некалькіх подпісаў у адным дакуменце + +## Сцэнарыі выкарыстання + +- Падпісанне кантрактаў, пагадненняў або формаў зацвярджэння перад адпраўкай назад +- Даданне подпісу да падатковых дакументаў, страхавых заяў або дзяржаўных формаў +- Размяшчэнне ініцыялаў на асобных старонках шматстаронкавага пагаднення +- Падпісанне NDA або кадравых дакументаў, якія прыходзяць як далучэнні PDF + +## Парады + +- Уключыце зводжанне, калі адпраўляеце падпісаны PDF таму, хто не павінен мець магчымасці выдаліць або перамясціць ваш подпіс. +- Для юрыдычна значных лічбавых подпісаў з праверкай на аснове сертыфікатаў BentoPDF таксама прапануе асобны інструмент "Лічбавы подпіс PDF". +- Для найлепшага выніку загружайце відарыс подпісу PNG з празрыстым фонам. + +## Звязаныя інструменты + +- [Рэдактар PDF](./edit-pdf) +- [Дадаць штампы](./add-stamps) +- [Запоўніць форму PDF](./form-filler) diff --git a/docs/be/tools/split-pdf.md b/docs/be/tools/split-pdf.md new file mode 100644 index 00000000..a07f8142 --- /dev/null +++ b/docs/be/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Падзяліць PDF +description: Дзяліце PDF на меншыя файлы па дыяпазоне старонак, візуальным выбары, закладках, цотных і няцотных старонках або фіксаваных інтэрвалах. +--- + +# Падзяліць PDF + +Разбівайце PDF на меншыя дакументы з дапамогай аднаго з шасці рэжымаў падзелу. Ад простых дыяпазонаў старонак да падзелу па закладках, гэты інструмент спраўляецца з любым сцэнарыем падзелу дакумента. + +## Як гэта працуе + +1. Загрузіце адзін файл PDF. +2. Выберыце рэжым падзелу ў выпадальным спісе. +3. Наладзьце параметры рэжыму (дыяпазоны старонак, выбар і г.д.). +4. Націсніце кнопку апрацоўкі. +5. Вынік спампоўваецца як адзін PDF або архіў ZIP у залежнасці ад рэжыму і налад. + +## Рэжымы падзелу + +| Рэжым | Апісанне | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| **Здабыванне па дыяпазоне старонак** | Увядзіце дыяпазоны старонак, напрыклад `1-3, 5, 8-10`. Некалькі дыяпазонаў ствараюць асобныя PDF у ZIP. Адзін дыяпазон стварае адзін PDF. | +| **Выбар старонак візуальна** | Праглядайце мініяцюры старонак і націскайце, каб выбраць патрэбныя старонкі. Выбраныя старонкі выцягваюцца ў новы PDF. | +| **Падзел па цотных і няцотных старонках** | Выцягнуць толькі цотныя або няцотныя старонкі. | +| **Падзяліць усе старонкі на асобныя файлы** | Падзяліць кожную старонку ў асобны файл PDF, які спампоўваецца як ZIP. | +| **Падзел па закладках** | Дзяліць па межах закладак. Выберыце ўзровень закладак, каб вызначыць месцы падзелу. | +| **Падзел кожныя N старонак** | Дзяліць на часткі па N старонак (напрыклад, кожныя 5 старонак). Апошняя частка можа мець менш старонак. | + +## Магчымасці + +- Шэсць розных рэжымаў падзелу, якія ахопліваюць практычна любы сцэнарый +- Візуальны выбар старонак з адкладзенай загрузкай мініяцюр +- Падзел з улікам закладак з фільтрацыяй па ўзроўні +- Варыянт выніку ў ZIP для рэжымаў дыяпазону і візуальнага выбару +- Апрацоўка дыяпазонаў старонак са змешаным сінтаксісам (`1-3, 5, 8-10`) +- Папярэджанне, калі падзел па N старонак дае нераўнамерныя часткі + +## Сцэнарыі выкарыстання + +- Выцягванне пэўнага раздзела або часткі з вялікага дакумента +- Падзел цотных і няцотных старонак для двухбаковага друку +- Разбіўка кнігі PDF на асобныя файлы раздзелаў па межах закладак +- Вылучэнне пэўных старонак (напрыклад, старонкі подпісу) з кантракта +- Падзел зводнай справаздачы на файлы па раздзелах для распаўсюджвання + +## Парады + +- Некалькі дыяпазонаў старонак праз коску (напрыклад, `1-5, 10-15, 20-25`) ствараюць асобныя PDF, па адным на дыяпазон, сабраныя ў ZIP. +- Рэжым падзелу па закладках патрабуе, каб PDF сапраўды змяшчаў закладкі. Калі іх няма, вы ўбачыце паведамленне пра памылку. +- Сцяжок "Спампаваць як ZIP" у рэжымах выбару дыяпазону і візуальнага выбару дазваляе атрымаць асобныя PDF для кожнай старонкі замест аднаго аб'яднанага файла. + +## Звязаныя інструменты + +- [Аб'яднаць PDF](./merge-pdf) +- [Выняць старонкі](./extract-pages) +- [Выдаліць старонкі](./delete-pages) +- [Мультыінструмент PDF](./pdf-multi-tool) diff --git a/docs/be/tools/svg-to-pdf.md b/docs/be/tools/svg-to-pdf.md new file mode 100644 index 00000000..193f6767 --- /dev/null +++ b/docs/be/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG у PDF +description: Пераўтварайце вектарную графіку SVG у PDF з кіраваннем якасцю, цалкам у браўзеры. +--- + +# SVG у PDF + +Пераўтварайце файлы Scalable Vector Graphics (SVG) у PDF. Інструмент растарызуе кожны SVG рухавіком адмалёўкі браўзера, а потым убудоўвае вынік у родным разрозненні. Зручна, каб ператварыць вектарныя значкі, дыяграмы і ілюстрацыі ў партатыўныя дакументы. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------- | +| SVG | `.svg` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце адзін або некалькі файлаў SVG. +2. Праверце спіс файлаў і кіруйце ім. +3. Выберыце ўзровень **Якасць PDF**. +4. Націсніце **Канвертаваць у PDF**. Вынік спампоўваецца як `from_svgs.pdf`. + +Кожны SVG чытаецца як тэкст, адмалёўваецца на палатне ў яго ўласнай шырыні і вышыні (800x600 па змаўчанні, калі памеры не зададзены) і экспартуецца ў PNG. Затым гэты PNG убудоўваецца ў PDF з дапамогай pdf-lib. Празрыстыя вобласці запаўняюцца белым фонам. + +## Параметры + +**Якасць PDF** кіруе сцісканнем пасля растарызацыі: + +- **Высокая якасць**: найбліжэй да арыгінальнай адмалёўкі. +- **Сярэдняя якасць** (па змаўчанні): добры баланс. +- **Нізкая якасць**: найменшы файл, частковая страта дэталяў. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне архітэктурных або інжынерных дыяграм з SVG у PDF, гатовы да друку +- Упакоўка набораў значкоў у даведачны PDF для дызайн-сістэмы +- Ператварэнне візуалізацый даных (D3.js, экспарт бібліятэк дыяграм) у PDF для справаздач +- Стварэнне версій інфаграфікі на аснове SVG для друку + +## Парады + +- Файлы SVG без яўных атрыбутаў `width` і `height` адмалёўваюцца ў памеры 800x600 пікселяў. Для найлепшага выніку задайце памеры ў зыходным SVG перад пераўтварэннем. +- Складаныя SVG са спасылкамі на знешнія шрыфты або звязаныя відарысы могуць адмалёўвацца не ідэальна. Убудуйце ўсе рэсурсы ў SVG для надзейнага выніку. +- Паколькі SVG растарызуецца, PDF будзе змяшчаць растравы відарыс, а не вектарныя контуры. Для сапраўднага вектарнага PDF патрэбны спецыяльны вектарны інструмент. + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [BMP у PDF](./bmp-to-pdf) diff --git a/docs/be/tools/table-of-contents.md b/docs/be/tools/table-of-contents.md new file mode 100644 index 00000000..aec58fe1 --- /dev/null +++ b/docs/be/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Змест +description: Стварайце адфарматаваную старонку зместу з існых закладак PDF. +--- + +# Змест + +Гэты інструмент чытае закладкі (структуру) вашага PDF і стварае адфарматаваную старонку зместу, якая дадаецца ў пачатак дакумента. Калі ў PDF ужо ёсць закладкі, але няма бачнай старонкі зместу, гэты інструмент створыць яе аўтаматычна. + +## Як гэта працуе + +1. Загрузіце PDF, які змяшчае закладкі. +2. Наладзьце загаловак зместу, памер шрыфту і гарнітуру. +3. Пры жаданні адзначце **Дадаць закладку для старонкі зместу**, каб уключыць саму старонку зместу ў дрэва закладак. +4. Націсніце **Стварыць змест**, каб апрацаваць файл. +5. Абноўлены PDF са старонкай зместу ў пачатку спампоўваецца аўтаматычна. + +## Параметры + +- **Загаловак зместу**: загаловак уверсе створанай старонкі. Па змаўчанні "Змест". +- **Памер шрыфта**: ад 10pt да 72pt. Па змаўчанні 12pt. +- **Сямейства шрыфтоў**: выбар з варыянтаў Times Roman, Helvetica або Courier (звычайны, тлусты, курсіў, тлусты курсіў). Па змаўчанні Helvetica. +- **Дадаць закладку для старонкі зместу**: калі адзначана, у дрэва структуры PDF дадаецца закладка на саму старонку зместу. + +## Магчымасці + +- Чытае ўсю іерархію закладак з PDF +- Стварае акуратна адфарматаваную старонку зместу з нумарамі старонак +- Падтрымлівае ўкладзеныя ўзроўні закладак з водступамі +- Выбар з 12 убудаваных шрыфтоў PDF +- Неабавязковая закладка на саму старонку зместу + +## Сцэнарыі выкарыстання + +- Даданне зместу для друку ў электронныя кнігі або справаздачы, якія маюць толькі лічбавыя закладкі +- Стварэнне зместу для аб'яднанага дакумента пасля злучэння некалькіх PDF +- Стварэнне даведачнай старонкі для доўгіх тэхнічных дапаможнікаў +- Падрыхтоўка дакументаў да друку, дзе чакаецца бачны змест + +## Парады + +- Калі ў PDF няма закладак, спачатку стварыце іх у інструменце [Рэдагаваць закладкі](./bookmark), а потым вярніцеся сюды, каб стварыць змест. +- Для вялікіх дакументаў больш буйны шрыфт, напрыклад 14pt або 16pt, палепшыць чытэльнасць. + +## Звязаныя інструменты + +- [Рэдагаваць закладкі](./bookmark) +- [Нумары старонак](./page-numbers) +- [Верхні і ніжні калантытул](./header-footer) diff --git a/docs/be/tools/text-color.md b/docs/be/tools/text-color.md new file mode 100644 index 00000000..4ed87712 --- /dev/null +++ b/docs/be/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Змяніць колер тэксту +description: Змяняйце колер усяго тэксту ў PDF на любы выбраны колер. +--- + +# Змяніць колер тэксту + +Замяніце колер тэксту ва ўсім PDF. Інструмент знаходзіць вобласці тэксту на кожнай старонцы і перафарбоўвае іх у выбраны колер, захоўваючы макет дакумента і нетэкставы змест. + +## Як гэта працуе + +1. Загрузіце файл PDF. +2. Выберыце новы колер тэксту праз выбар колеру. Па змаўчанні сіні (#0000FF). +3. Націсніце **Змяніць колер тэксту**, каб пачаць апрацоўку. +4. Перафарбаваны PDF спампоўваецца аўтаматычна. Індыкатар прагрэсу паказвае, якая старонка апрацоўваецца. + +## Параметры + +- **Новы колер тэксту**: выбар колеру, які заменіць колер усяго тэксту ў дакуменце. + +## Магчымасці + +- Перафарбоўвае тэкст на кожнай старонцы дакумента +- Пастаронкавая апрацоўка з паказам прагрэсу +- Выбар колеру з поўнай падтрымкай hex-колераў +- Захоўвае макет старонак і нетэкставыя элементы + +## Сцэнарыі выкарыстання + +- Змяненне чорнага тэксту на цёмна-сіні для больш мяккага і сучаснага выгляду дакумента +- Перафарбоўванне тэксту пад патрабаванні брэнда перад распаўсюджваннем дакументаў +- Змяненне колеру тэксту на пэўны для адпаведнасці патрабаванням даступнасці +- Каб тэкст быў бачны на новым колеры фону + +## Парады + +- Гэты інструмент адмалёўвае старонкі ў маштабе 2x для якасці, а потым перабудоўвае PDF. Вынік складаецца з відарысаў, таму тэкст больш нельга будзе вылучыць або шукаць. +- Для дакументаў, дзе трэба захаваць вылучальны тэкст, лепш рэдагаваць PDF непасрэдна ў [Рэдактары PDF](./edit-pdf). +- Час апрацоўкі расце з колькасцю старонак, бо кожная старонка адмалёўваецца асобна. + +## Звязаныя інструменты + +- [Колер фону](./background-color) +- [Інвертаваць колеры](./invert-colors) +- [Наладзіць колеры](./adjust-colors) diff --git a/docs/be/tools/tiff-to-pdf.md b/docs/be/tools/tiff-to-pdf.md new file mode 100644 index 00000000..73827459 --- /dev/null +++ b/docs/be/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF у PDF +description: Пераўтварайце аднастаронкавыя і шматстаронкавыя відарысы TIFF у PDF у браўзеры з поўнай падтрымкай старонак. +--- + +# TIFF у PDF + +Пераўтварайце файлы TIFF у PDF, у тым ліку шматстаронкавыя TIFF. Кожная старонка (або "IFD") у файле TIFF становіцца асобнай старонкай выніковага PDF. Гэта асабліва зручна для сканаваных дакументаў, факсаў і медыцынскіх відарысаў, якія часта захоўваюцца як шматстаронкавыя TIFF. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы TIFF. +2. Праверце спіс файлаў і кіруйце ім пры неабходнасці. +3. Націсніце **Канвертаваць у PDF**. Вынік спампоўваецца як `from_tiff.pdf`. + +Інструмент дэкадуе кожны файл TIFF з дапамогай дэкодэра TIFF на JavaScript і выцягвае сырыя даныя пікселяў RGBA кожнай старонкі. Кожная старонка адмалёўваецца на палатне, экспартуецца ў PNG і ўбудоўваецца ў PDF. Памеры старонак адпавядаюць зыходным старонкам TIFF. + +## Параметры + +Гэты інструмент не мае дадатковых налад якасці. Відарысы ўбудоўваюцца ў родным разрозненні. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне шматстаронкавых факсаў (TIFF-F) у больш партатыўны фармат PDF +- Ператварэнне архіваў сканаваных дакументаў у TIFF у PDF з пошукам (пасля выкарыстайце інструмент OCR) +- Апрацоўка медыцынскіх відарысаў (гісталагічныя прэпараты, экспарт з радыялогіі) у фармаце TIFF +- Пераўтварэнне файлаў TIFF з ГІС або спадарожнікавымі здымкамі ў дакументы, якімі зручна дзяліцца + +## Парады + +- Шматстаронкавыя TIFF падтрымліваюцца цалкам. 10-старонкавы TIFF дасць 10-старонкавы PDF. Падзяляць TIFF загадзя не трэба. +- Вельмі вялікія файлы TIFF (сотні мегабайт) могуць апрацоўвацца даўжэй, бо ўвесь файл трэба дэкадаваць у памяці браўзера. +- Калі для выніковага PDF патрэбны OCR, пасля пераўтварэння апрацуйце яго інструментам [OCR PDF](./ocr-pdf). + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [BMP у PDF](./bmp-to-pdf) +- [JPG у PDF](./jpg-to-pdf) diff --git a/docs/be/tools/txt-to-pdf.md b/docs/be/tools/txt-to-pdf.md new file mode 100644 index 00000000..244f7bb1 --- /dev/null +++ b/docs/be/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Тэкст у PDF +description: Пераўтварайце простыя тэкставыя файлы або ўведзены тэкст у PDF з наладай шрыфтоў, колераў і памераў старонак. +--- + +# Тэкст у PDF + +Пераўтварайце просты тэкст у адфарматаваны PDF. Можна загрузіць файлы `.txt` або ўвесці тэкст непасрэдна ва ўбудаваны тэкставы рэдактар. Інструмент падтрымлівае некалькі шрыфтоў, уласныя колеры тэксту і шырокі выбар памераў старонак: ад A0 да A10, а таксама US Letter, Legal і Tabloid. + +## Падтрымліваемыя фарматы + +| Увод | Пашырэнні | +| :---------------------- | :------------------------------ | +| Простыя тэкставыя файлы | `.txt` | +| Непасрэдны ўвод тэксту | Увядзіце або ўстаўце ў рэдактар | + +## Як гэта працуе + +1. Выберыце рэжым уводу пераключальнікам уверсе: **Запампаваць файлы** або **Увесці тэкст**. +2. Пры загрузцы перацягніце або націсніце, каб выбраць адзін або некалькі файлаў `.txt`. Пры ўводзе ўпішыце тэкст непасрэдна ў тэкставае поле. +3. Наладзьце параметры фарматавання: гарнітуру, памер шрыфту, колер тэксту і памер старонкі. +4. Націсніце **Стварыць PDF**. Вынік спампоўваецца як `text_to_pdf.pdf`. + +Пры загрузцы некалькіх файлаў іх змест аб'ядноўваецца з пустымі радкамі паміж імі. + +## Параметры + +| Параметр | Значэнні | Па змаўчанні | +| :-------------------- | :-------------------------------------------------------------------------------------- | :-------------- | +| **Сямейства шрыфтоў** | Helvetica (без засечак), Tiro (з засечкамі), Courier (монашырынны), Times (з засечкамі) | Helvetica | +| **Памер шрыфта** | 6-72 pt | 12 | +| **Колер тэксту** | Любы колер праз выбар колеру | Чорны (#000000) | +| **Памер старонкі** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Мовы з напрамкам справа налева (арабская, іўрыт, фарсі, урду) вызначаюцца аўтаматычна. Калі знойдзены такі тэкст, напрамак і выраўноўванне тэксту пераключаюцца адпаведна. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне фрагментаў кода або файлаў журналаў у PDF для друку са шрыфтам Courier +- Хуткае стварэнне PDF з нататак сустрэчы, набраных на месцы +- Фарматаванне простага тэкставага рукапісу з пэўным шрыфтам і памерам старонкі для падачы +- Стварэнне PDF-версіі README або changelog для распаўсюджвання па-за сеткай + +## Парады + +- Выкарыстоўвайце рэжым **Увесці тэкст**, калі трэба хутка пераўтварыць змест буфера абмену, не захоўваючы яго спачатку ў файл. +- Courier (монашырынны) з'яўляецца найлепшым выбарам для кода, журналаў або любога зместу, дзе важнае выраўноўванне па слупках. +- Палі старонкі фіксаваныя: 72 пункты (1 цаля) з усіх бакоў. + +## Звязаныя інструменты + +- [Markdown у PDF](./markdown-to-pdf) +- [CSV у PDF](./csv-to-pdf) +- [Word у PDF](./word-to-pdf) diff --git a/docs/be/tools/unlock-pdf.md b/docs/be/tools/unlock-pdf.md new file mode 100644 index 00000000..85eb3a65 --- /dev/null +++ b/docs/be/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Разблакаваць PDF +description: Выдаляйце абарону паролем з зашыфраваных PDF. Падтрымліваецца пакетная расшыфроўка некалькіх файлаў адным паролем. +--- + +# Разблакаваць PDF + +Калі ў вас ёсць пароль ад зашыфраванага PDF, гэты інструмент цалкам выдаляе шыфраванне і стварае разблакаваную копію, якую любы можа адкрыць без уліковых даных. Падтрымліваецца пакетная расшыфроўка, калі некалькі PDF маюць аднолькавы пароль. + +## Як гэта працуе + +1. Загрузіце адзін або некалькі зашыфраваных PDF-файлаў. +2. Увядзіце **пароль**, якім абаронены файлы. +3. Націсніце **Расшыфраваць PDF**. +4. Адзін файл спампоўваецца адразу. Некалькі файлаў ствараюць ZIP-архіў з усімі разблакаванымі PDF. + +## Магчымасці + +- Расшыфроўка аднаго файла і пакетная расшыфроўка +- Апрацоўка як пароляў карыстальніка, так і пароляў уладальніка +- Цалкам незашыфраваны вынік без рэшткавых абмежаванняў +- Зразумелыя паведамленні пра памылкі пры няправільным паролі або пашкоджаных файлах +- Адсочванне поспеху або памылкі для кожнага файла ў пакетным рэжыме + +## Чым адрозніваецца ад «Выдаліць абмежаванні» + +**Расшыфраваць PDF** патрабуе пароль і выдаляе ўсё шыфраванне. **Выдаліць абмежаванні** працуе з абмежаваннямі выкарыстання (друк, капіраванне, рэдагаванне) і можа не патрабаваць пароля, калі быў зададзены толькі пароль уладальніка. Выкарыстоўвайце расшыфроўку, калі PDF наогул не адкрываецца без пароля. + +## Сцэнарыі выкарыстання + +- Канчатковая разблакоўка PDF, якія вы раней зашыфравалі, калі пароль больш не патрэбны +- Выдаленне шыфравання з пакета архіўных дакументаў для зручнага доўгатэрміновага доступу +- Падрыхтоўка абароненых паролем PDF для сістэмы кіравання дакументамі, якая не падтрымлівае зашыфраваныя файлы +- Разблакоўка PDF перад іх аб'яднаннем з іншымі дакументамі (многія інструменты аб'яднання не могуць апрацоўваць зашыфраваныя файлы) + +## Парады + +- Поле пароля прымяняецца да ўсіх загружаных файлаў. Калі ў вашых PDF розныя паролі, апрацоўвайце іх асобнымі пакетамі. +- Калі вы атрымалі памылку «Няправільны пароль», праверце, ці няма прабелаў у канцы і ці не ўключаны Caps Lock. +- Пасля расшыфроўкі вынік не мае ніякай абароны. Зашыфруйце яго зноў праз «Зашыфраваць PDF», калі трэба задаць новы пароль. + +## Звязаныя інструменты + +- [Зашыфраваць PDF](./protect-pdf): паўторна прымяніць шыфраванне з новым паролем +- [Выдаліць абмежаванні](./remove-restrictions): выдаліць абмежаванні выкарыстання без поўнай расшыфроўкі +- [Змяніць дазволы](./change-permissions): змяніць асобныя дазволы ў зашыфраваным PDF diff --git a/docs/be/tools/validate-signature-pdf.md b/docs/be/tools/validate-signature-pdf.md new file mode 100644 index 00000000..b97f4d70 --- /dev/null +++ b/docs/be/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Праверыць подпіс PDF +description: Правярайце лічбавыя подпісы ў PDF-файлах. Праверка сапраўднасці сертыфіката, асобы падпісанта, цэласнасці дакумента і ланцужка даверу. +--- + +# Праверыць подпіс PDF + +Загрузіце падпісаны PDF, і гэты інструмент выцягне кожны лічбавы подпіс, вызначыць падпісанта, праверыць сапраўднасць сертыфіката і паведаміць, ці быў дакумент зменены пасля падпісання. Таксама можна дадаць давераны сертыфікат, каб праверыць ланцужок подпісу. + +## Як гэта працуе + +1. Загрузіце падпісаны PDF-файл. Праверка пачнецца аўтаматычна. +2. Інструмент пакажа зводку: колькасць знойдзеных подпісаў і колькі з іх сапраўдныя. +3. Для кожнага подпісу ствараецца падрабязная картка з імем падпісанта, выдаўцом, датамі і статусам. +4. Пры жаданні загрузіце **давераны сертыфікат** (.pem, .crt, .cer, .der), каб праверыць подпіс адносна пэўнага якара даверу. Паўторная праверка запусціцца аўтаматычна. + +## Што правяраецца + +### Разбор подпісу + +Інструмент выцягвае з PDF аб'екты подпісу PKCS#7, дэкадуе структуру ASN.1 і атрымлівае сертыфікат X.509 падпісанта разам з любым ланцужком сертыфікатаў, убудаваным у подпіс. + +### Сапраўднасць сертыфіката + +- **Тэрмін дзеяння**: ці знаходзіцца сертыфікат зараз у межах свайго тэрміну дзеяння? +- **Выяўленне самападпісаных**: ці з'яўляецца сертыфікат сам сваім выдаўцом? +- **Ланцужок даверу**: калі дададзены давераны сертыфікат, ці вядзе да яго ланцужок сертыфіката падпісанта? + +### Крыптаграфічная праверка + +- Інструмент аднаўляе байты, ахопленыя `/ByteRange` подпісу, хэшуе іх алгарытмам, заяўленым падпісантам, і параўноўвае вынік з атрыбутам `messageDigest` унутры подпісу. +- Затым ён паўторна серыялізуе падпісаныя атрыбуты як DER SET і правярае подпіс з дапамогай адкрытага ключа сертыфіката падпісанта. +- **Подпіс лічыцца сапраўдным, толькі калі ўсе гэтыя праверкі пройдзены.** Калі байты PDF былі зменены пасля падпісання або ўбудаваны подпіс не адпавядае ключу падпісанта, статус будзе «Несапраўдны: крыптаграфічная праверка не пройдзена» з канкрэтнай прычынай. + +#### Падтрымліваемыя алгарытмы подпісу + +| Алгарытм | Спосаб праверкі | +| ----------------------- | --------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, з рэзервовым Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` пасля пераўтварэння подпісу DER → IEEE P1363 | + +Калі подпіс выкарыстоўвае алгарытм не з гэтага спіса (напрыклад, Ed25519, SM2 або RSA з незвычайным OID дайджэста), картка паказвае жоўты статус **«Не праверана: непадтрымліваемы алгарытм подпісу»** разам з канкрэтным OID або прычынай. Гэта наўмыснае падзяленне на тры станы: + +- **Сапраўдны**: подпіс крыптаграфічна правераны з дапамогай адкрытага ключа падпісанта. +- **Несапраўдны**: праверка выканана і дала адмоўны вынік (байты зменены, ключ не адпавядае). +- **Не праверана**: інструмент не змог выканаць праверку для гэтага алгарытму. Метаданыя сертыфіката ўсё роўна паказваюцца, але лічыце подпіс «невядомым» і праверце яго ў Adobe Acrobat або праз `openssl cms -verify`. + +### Ненадзейныя алгарытмы дайджэста + +- Подпісы з **MD5 або SHA-1** адхіляюцца як несапраўдныя і пазначаюцца статусам «Ненадзейны дайджэст». Для абодвух алгарытмаў апублікаваны атакі на калізіі, таму подпіс над хэшам SHA-1 або MD5 не гарантуе цэласнасці. +- SHA-224, SHA-256, SHA-384 і SHA-512 прымаюцца. + +### Ахоп дакумента + +- **Поўны ахоп**: подпіс ахоплівае ўвесь PDF-файл, гэта значыць пасля падпісання ніводзін байт не быў дададзены або зменены. +- **Частковы ахоп**: подпіс ахоплівае толькі частку файла. Гэта можа азначаць, што пасля падпісання былі ўнесены змены (не абавязкова зламысныя: інкрэментальныя захаванні даюць частковы ахоп). + +## Падрабязнасці подпісу + +Кожная картка подпісу паказвае: + +- **Падпісаў**: агульнае імя, арганізацыя і электронная пошта з сертыфіката падпісанта +- **Выдавец**: цэнтр сертыфікацыі, які выдаў сертыфікат падпісанта +- **Дата подпісу**: часавая пазнака, убудаваная ў подпіс +- **Сапраўдны з / Сапраўдны да**: тэрмін дзеяння сертыфіката +- **Прычына**: чаму дакумент быў падпісаны (калі пазначана) +- **Месца**: дзе ён быў падпісаны (калі пазначана) +- **Статус ахопу**: поўны або частковы +- **Значок даверу**: давераны або не ў ланцужку даверу (толькі калі дададзены ўласны сертыфікат) + +### Тэхнічныя падрабязнасці + +Разгарніце раздзел тэхнічных падрабязнасцей, каб убачыць: + +- Серыйны нумар сертыфіката падпісанта +- Алгарытм дайджэста (SHA-256, SHA-512 і г. д.) +- Алгарытм подпісу (RSA з SHA-256, ECDSA з SHA-256 і г. д.) +- Паведамленні пра памылкі для несапраўдных подпісаў + +## Сцэнарыі выкарыстання + +- Праверка лічбава падпісанага дагавора перад сустрэчным падпісаннем +- Аўдыт падпісаных дакументаў, каб пераканацца, што іх не падрабілі +- Праверка, ці не скончыўся тэрмін дзеяння сертыфіката пасля падпісання дакумента +- Праверка подпісаў адносна каранёвага сертыфіката вашай арганізацыі +- Прагляд падрабязнасцей подпісу дзяржаўных або юрыдычных дакументаў + +## Парады + +- Самападпісаны сертыфікат не азначае, што подпіс несапраўдны: гэта значыць, што асобу падпісанта нельга пацвердзіць праз давераны трэці бок. Для ўнутраных дакументаў гэта звычайная справа. +- Частковы ахоп не заўсёды сведчыць пра падробку. Многія працэсы працы з PDF дадаюць інкрэментальныя абнаўленні (напрыклад, другі подпіс), якія ствараюць частковы ахоп. +- Загрузіце каранёвы або прамежкавы сертыфікат вашай арганізацыі як давераны, каб праверыць ланцужок даверу. + +## Звязаныя інструменты + +- [Лічбавы подпіс PDF](./digital-sign-pdf): падпісвайце PDF уласным сертыфікатам +- [Звесці PDF](./flatten-pdf): звядзіце PDF перад падпісаннем, каб прадухіліць змены пасля подпісу +- [Выдаліць метаданыя](./remove-metadata): ачысціце PDF перад падпісаннем diff --git a/docs/be/tools/view-metadata.md b/docs/be/tools/view-metadata.md new file mode 100644 index 00000000..83ce4743 --- /dev/null +++ b/docs/be/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Праглядзець метаданыя +description: Праглядайце ўсе ўласцівасці метаданых PDF, уключаючы звесткі пра дакумент, даныя XMP і структурныя падрабязнасці. +--- + +# Праглядзець метаданыя + +Вывучайце схаваныя ўласцівасці, убудаваныя ў PDF-файл. Інструмент паказвае звесткі пра дакумент (назва, аўтар, даты), метаданыя XMP, памеры старонак і іншыя структурныя даныя ў зручным для чытання выглядзе. + +## Як гэта працуе + +1. Загрузіце PDF-файл. +2. Інструмент адразу разбірае файл і паказвае ўсе даступныя метаданыя ў выглядзе ўпарадкаваных раздзелаў. +3. Праглядзіце слоўнік звестак пра дакумент, дрэва метаданых XMP і структурныя ўласцівасці. +4. Асобны крок апрацоўкі не патрэбны: метаданыя паказваюцца адразу пасля загрузкі файла. + +## Магчымасці + +- Паказвае стандартныя палі звестак пра дакумент: загаловак, аўтар, тэма, ключавыя словы, стваральнік, вытворца +- Паказвае даты стварэння і змянення ў зручным для чытання фармаце +- Разбірае і адлюстроўвае поўнае дрэва метаданых XMP з укладзенымі прасторамі імёнаў +- Пераўтварае фармат даты PDF (`D:20240101120000Z`) у зразумелыя даты +- Раздзелы можна згортваць для зручнай навігацыі + +## Раздзелы метаданых + +| Раздзел | Змест | +| ------------------------- | ----------------------------------------------------------------------------------------- | +| **Звесткі пра дакумент** | Назва, аўтар, тэма, ключавыя словы, стваральнік, вытворца, дата стварэння, дата змянення | +| **Метаданыя XMP** | Поўнае дрэва метаданых на аснове XML з прасторамі імёнаў Dublin Core, XAP, PDF і ўласнымі | +| **Уласцівасці дакумента** | Колькасць старонак, версія PDF, памер файла, стан шыфравання | + +## Сцэнарыі выкарыстання + +- Праверка, хто аўтар PDF і калі ён быў зменены апошні раз +- Праверка, што метаданыя правільна зададзены перад публікацыяй дакумента +- Аўдыт PDF на прыватнасць: праверка, якія асабістыя звесткі ўбудаваны +- Вызначэнне праграмы, з дапамогай якой PDF быў створаны або зменены (праз поле Producer) +- Прагляд метаданых XMP для адпаведнасці патрабаванням кіравання лічбавымі актывамі + +## Парады + +- Радкі дат PDF, якія пачынаюцца з `D:`, аўтаматычна пераўтвараюцца ў фармат вашага мясцовага часавага пояса. +- Калі палі метаданых пустыя, стваральнік PDF проста іх не запоўніў. Не ўсе PDF маюць багатыя метаданыя. +- Каб змяніць метаданыя пасля прагляду, выкарыстоўвайце [Рэдагаваць метаданыя](./edit-metadata). Каб цалкам іх выдаліць, выкарыстоўвайце «Выдаліць метаданыя». + +## Звязаныя інструменты + +- [Рэдагаваць метаданыя](./edit-metadata) +- [Слаі OCG у PDF](./pdf-layers) +- [Параўнаць PDF](./compare-pdfs) diff --git a/docs/be/tools/vsd-to-pdf.md b/docs/be/tools/vsd-to-pdf.md new file mode 100644 index 00000000..9fbd6689 --- /dev/null +++ b/docs/be/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD у PDF +description: Пераўтварайце дыяграмы Microsoft Visio (VSD/VSDX) у PDF у браўзеры. Бясплатна, прыватна, Visio не патрэбны. +--- + +# VSD у PDF + +Пераўтварайце дыяграмы Microsoft Visio у PDF без усталёўкі Visio. Файлы VSD і VSDX змяшчаюць блок-схемы, арганізацыйныя дыяграмы, сеткавыя схемы і планы памяшканняў, якія большасць людзей не можа адкрыць. Гэты інструмент ператварае іх у акуратныя PDF, якія можна праглядаць на любой прыладзе. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----------- | :-------- | :----------------------------------------- | +| Visio Binary | `.vsd` | Стары фармат Visio (Visio 2003 і ранейшыя) | +| Visio XML | `.vsdx` | Сучасны фармат Visio (Visio 2013+) | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы VSD ці VSDX. Абодва фарматы можна змешваць у адным пакеце. +2. Праглядзіце спіс файлаў. Выдаліце непатрэбныя з дапамогай значка сметніцы або выкарыстайце **Дадаць файлы**, каб дадаць іншыя дыяграмы. +3. Націсніце **Пераўтварыць у PDF**. Рухавік на аснове LibreOffice загружаецца ў браўзеры і ператварае кожную дыяграму ў PDF, захоўваючы фігуры, злучальнікі, подпісы і макет старонкі. +4. Адна дыяграма спампоўваецца адразу як PDF. Некалькі файлаў ствараюць ZIP-архіў з назвай `vsd-to-pdf.zip`. + +## Параметры + +Налады не патрэбны. Пераўтваральнік захоўвае арыгінальны памер і арыентацыю старонкі з дакумента Visio. + +## Сцэнарыі выкарыстання + +- Прагляд дыяграм Visio ад калегі, калі ў вас няма ліцэнзіі Visio +- Уключэнне сеткавых або архітэктурных дыяграм у праектную дакументацыю ў выглядзе PDF +- Друк арганізацыйных дыяграм або схем працэсаў для раздатковых матэрыялаў на сустрэчах +- Архіваванне старых файлаў VSD з ранейшых версій Visio ў надзейным фармаце + +## Парады + +- Шматстаронкавыя дакументы Visio ствараюць шматстаронкавыя PDF: кожная старонка Visio адпавядае старонцы PDF. +- Файлы VSDX (сучасны фармат на аснове XML) звычайна пераўтвараюцца дакладней, чым старыя двайковыя файлы VSD. +- Рухавік LibreOffice загружаецца адзін раз за сеанс. Пры першым пераўтварэнні давядзецца крыху пачакаць, наступныя файлы апрацоўваюцца хутчэй. + +## Звязаныя інструменты + +- [ODG у PDF](./odg-to-pdf) +- [PUB у PDF](./pub-to-pdf) +- [PSD у PDF](./psd-to-pdf) diff --git a/docs/be/tools/webp-to-pdf.md b/docs/be/tools/webp-to-pdf.md new file mode 100644 index 00000000..98cd2f5e --- /dev/null +++ b/docs/be/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP у PDF +description: Пераўтварайце выявы WebP у фармат PDF непасрэдна ў браўзеры з рэгуляванай якасцю сціскання. +--- + +# WebP у PDF + +Пераўтварайце выявы ў фармаце Google WebP у PDF. Гэта асабліва карысна, калі вы спампавалі з сеціва выявы ў фармаце WebP і вам патрэбны больш універсальны фармат для друку або абмену. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :----- | :-------- | +| WebP | `.webp` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы WebP. +2. Праглядзіце спіс файлаў і выдаліце непатрэбныя. +3. Выберыце ўзровень **Якасць PDF**. +4. Націсніце **Пераўтварыць у PDF**. Вынік спампуецца як `from_webps.pdf`. + +Унутры кожная выява WebP дэкадуецца праз canvas API браўзера, а затым убудоўваецца ў PDF з дапамогай pdf-lib. Гэта значыць, што пераўтварэнне працуе ў любым браўзеры, які падтрымлівае дэкадаванне WebP (так робяць усе сучасныя браўзеры). + +## Параметры + +**Якасць PDF** кіруе сцісканнем пры ўбудаванні выяў: + +- **Высокая якасць**: захоўвае найбольш дэталей. +- **Сярэдняя якасць** (па змаўчанні): збалансаваны вынік. +- **Нізкая якасць**: найменшы памер файла. + +## Сцэнарыі выкарыстання + +- Пераўтварэнне спампаваных з сеціва выяў WebP у PDF для друку +- Афармленне здымкаў экрана WebP з Chrome або Edge у дакументацыю +- Стварэнне PDF-партфоліо з выяў, экспартаваных з дызайнерскіх праграм, якія па змаўчанні захоўваюць у WebP +- Архіваванне выяў WebP у больш універсальным фармаце + +## Парады + +- Унутры WebP дэкадуецца ў PNG перад убудаваннем у PDF, таму выявы WebP без страт захоўваюць якасць пры наладзе «Высокая». +- Калі ў вас сумесь WebP і іншых фарматаў выяў, выкарыстоўвайце інструмент [Відарысы ў PDF](./image-to-pdf): ён прымае ўсё адразу. + +## Звязаныя інструменты + +- [Відарысы ў PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [JPG у PDF](./jpg-to-pdf) diff --git a/docs/be/tools/word-to-pdf.md b/docs/be/tools/word-to-pdf.md new file mode 100644 index 00000000..bc5f92cc --- /dev/null +++ b/docs/be/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word у PDF +description: Пераўтварайце дакументы Word (DOC, DOCX), файлы ODT і RTF у PDF у браўзеры з поўным захаваннем фарматавання. +--- + +# Word у PDF + +Пераўтварайце дакументы Microsoft Word і сумяшчальныя фарматы ў PDF. Інструмент выкарыстоўвае рухавік LibreOffice у браўзеры, які апрацоўвае файлы DOC, DOCX, ODT і RTF і захоўвае ў выніку фарматаванне, табліцы, выявы, верхнія і ніжнія калантытулы і стылі. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнні | +| :---------------- | :-------- | +| Word (сучасны) | `.docx` | +| Word (стары) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце дакументы Word. Можна выбраць некалькі файлаў адразу. +2. Праглядзіце спіс файлаў і кіруйце ім. +3. Націсніце **Пераўтварыць у PDF**. Рухавік LibreOffice загружаецца пры першым выкарыстанні (індыкатар прагрэсу паказвае стан ініцыялізацыі), пасля чаго пераўтвараецца кожны файл. +4. Адзін файл спампоўваецца адразу як PDF. Некалькі файлаў пакуюцца ў `word-converted.zip`. + +## Параметры + +У гэтага інструмента няма дадатковых налад. Рухавік LibreOffice стварае вынік з дапамогай свайго стандартнага профілю экспарту ў PDF. + +## Вынік + +| Колькасць файлаў | Вынік | +| :--------------- | :--------------------------------------------------------- | +| 1 файл | Адзін PDF (арыгінальная назва файла з пашырэннем `.pdf`) | +| 2+ файлы | ZIP-архіў (`word-converted.zip`) з адным PDF на кожны файл | + +## Сцэнарыі выкарыстання + +- Пераўтварэнне рэзюмэ або суправаджальнага ліста з DOCX у PDF перад адпраўкай на вакансію +- Пакетнае пераўтварэнне дагавораў або прапаноў у PDF для перадачы кліенту +- Ператварэнне старых файлаў `.doc` у сучасныя PDF для доўгатэрміновага архіва +- Пераўтварэнне сумесных дакументаў з Google Docs (экспартаваных як DOCX) у PDF +- Стварэнне гатовых да друку PDF з шаблонаў Word, якія выкарыстоўваюцца для аўтаматычнага стварэння дакументаў + +## Парады + +- Рухавік LibreOffice спампоўваецца адзін раз за сеанс і кэшуецца. Пры першым пераўтварэнні загрузка зойме некалькі секунд, наступныя пераўтварэнні значна хутчэйшыя. +- Складанае фарматаванне (макрасы, элементы ActiveX, складаны SmartArt) можа пераўтварыцца не ідэальна. Стандартныя элементы дакумента (тэкст, табліцы, выявы, калантытулы, зноскі) пераўтвараюцца надзейна. +- Паколькі інструмент таксама прымае ODT і RTF, яго можна выкарыстоўваць як універсальны пераўтваральнік для ўсіх тэкставых фарматаў. + +## Звязаныя інструменты + +- [ODT у PDF](./odt-to-pdf) +- [RTF у PDF](./rtf-to-pdf) +- [Excel у PDF](./excel-to-pdf) +- [PowerPoint у PDF](./powerpoint-to-pdf) diff --git a/docs/be/tools/wpd-to-pdf.md b/docs/be/tools/wpd-to-pdf.md new file mode 100644 index 00000000..840c44fa --- /dev/null +++ b/docs/be/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD у PDF +description: Пераўтварайце дакументы WordPerfect (WPD) у PDF у браўзеры з дапамогай LibreOffice. Бясплатна і прыватна. +--- + +# WPD у PDF + +Пераўтварайце дакументы Corel WordPerfect у PDF-файлы. Калісьці WPD быў асноўным тэкставым фарматам у юрыдычных кантор і дзяржаўных установах. Калі ў вас ёсць старыя файлы WordPerfect, якія сучасныя праграмы не адкрываюць, гэты інструмент верне іх да жыцця ў выглядзе стандартных PDF. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :---------- | :-------- | :------------------------------ | +| WordPerfect | `.wpd` | Усе асноўныя версіі WordPerfect | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы WPD. Можна выбраць некалькі файлаў адразу. +2. Праглядзіце спіс файлаў. Выдаліце непатрэбныя з дапамогай значка сметніцы або выкарыстайце **Дадаць файлы**, каб дадаць іншыя дакументы. +3. Націсніце **Пераўтварыць у PDF**. Інструмент загружае ў браўзеры рухавік пераўтварэння на аснове LibreOffice, які разбірае фармат WPD і стварае PDF. +4. Адзін файл спампоўваецца адразу як PDF. Пакетнае пераўтварэнне стварае ZIP-архіў з назвай `wpd-to-pdf.zip`. + +## Параметры + +Налады не патрэбны. Рухавік LibreOffice аўтаматычна апрацоўвае фарматаванне, шрыфты і макет WPD. + +## Сцэнарыі выкарыстання + +- Адкрыццё юрыдычных дакументаў многагадовай даўнасці, напісаных у WordPerfect +- Пераўтварэнне архіўных дзяржаўных дакументаў з WPD у сучасны фармат +- Перанос старой бібліятэкі дакументаў WordPerfect у PDF для доўгатэрміновага захоўвання +- Абмен файламі WPD з атрымальнікамі, у якіх не ўсталяваны Corel WordPerfect + +## Парады + +- Рухавік LibreOffice загружаецца пры першым выкарыстанні, гэта займае некаторы час. Наступныя пераўтварэнні ў тым жа сеансе хутчэйшыя. +- Складаныя макрасы WPD і коды фарматавання (reveal codes) не захоўваюцца, але візуальны макет, тэкст і базавае фарматаванне пераносяцца ў PDF. + +## Звязаныя інструменты + +- [WPS у PDF](./wps-to-pdf) +- [ODG у PDF](./odg-to-pdf) diff --git a/docs/be/tools/wps-to-pdf.md b/docs/be/tools/wps-to-pdf.md new file mode 100644 index 00000000..dce22aa2 --- /dev/null +++ b/docs/be/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS у PDF +description: Пераўтварайце дакументы Microsoft Works (WPS) у PDF у браўзеры. Бясплатна, без рэгістрацыі, цалкам прыватна. +--- + +# WPS у PDF + +Пераўтварайце файлы тэкставага рэдактара Microsoft Works у PDF. Microsoft Works пастаўляўся з хатнімі камп'ютарамі ў канцы 1990-х і ў 2000-я гады, і шмат файлаў WPS дагэтуль захоўваецца на старых дысках і ў архівах пошты. Гэты інструмент адкрывае іх у браўзеры і стварае акуратныя PDF. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :-------------- | :-------- | :------------------------------------------- | +| Microsoft Works | `.wps` | Файлы тэкставага рэдактара з Microsoft Works | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы WPS. Можна дадаць некалькі файлаў. +2. Праглядзіце спіс файлаў. Выкарыстайце значок сметніцы, каб выдаліць асобныя файлы, або націсніце **Дадаць файлы**, каб пашырыць пакет. +3. Націсніце **Пераўтварыць у PDF**. Рухавік на аснове LibreOffice загружаецца ў браўзеры і пераўтварае кожны дакумент WPS у PDF. +4. Адзін файл спампоўваецца адразу як PDF. Некалькі файлаў аб'ядноўваюцца ў ZIP-архіў з назвай `wps-to-pdf.zip`. + +## Параметры + +Дадатковыя налады не патрэбны. Пераўтваральнік апрацоўвае тэкст, базавае фарматаванне і ўбудаваныя выявы з файла WPS. + +## Сцэнарыі выкарыстання + +- Аднаўленне старых школьных або працоўных дакументаў, захаваных у фармаце Microsoft Works +- Адкрыццё далучэнняў WPS з электроннай пошты, калі Microsoft Works не ўсталяваны +- Пераўтварэнне архіва файлаў WPS для пераносу ў сучасную сістэму дакументаў +- Друк старых дакументаў, якія сучасныя тэкставыя рэдактары не могуць адкрыць + +## Парады + +- Не блытайце файлы `.wps` з Microsoft Works з файламі WPS Office. Гэты інструмент прызначаны менавіта для старога фармату Microsoft Works. +- Рухавік LibreOffice загружаецца пры першым выкарыстанні некаторы час. Пасля загрузкі наступныя пераўтварэнні ў тым жа сеансе выконваюцца хутчэй. + +## Звязаныя інструменты + +- [WPD у PDF](./wpd-to-pdf) +- [PUB у PDF](./pub-to-pdf) diff --git a/docs/be/tools/xml-to-pdf.md b/docs/be/tools/xml-to-pdf.md new file mode 100644 index 00000000..5abacf4f --- /dev/null +++ b/docs/be/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML у PDF +description: Пераўтварайце файлы XML у структураваныя PDF-дакументы ў браўзеры. Бясплатна, прыватна, без апрацоўкі на серверы. +--- + +# XML у PDF + +Пераўтварайце файлы даных XML у зручныя для чытання структураваныя PDF-дакументы. Сыры XML магутны, але людзям яго цяжка чытаць. Гэты інструмент разбірае дрэва XML, знаходзіць паўторныя структуры даных і афармляе іх як табліцы і раздзелы ў PDF фармату A4 з альбомнай арыентацыяй. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----- | :-------- | :------------------------------------ | +| XML | `.xml` | Любы карэктна сфармаваны XML-дакумент | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы XML. Некалькі файлаў можна апрацаваць адным пакетам. +2. Праглядзіце спіс файлаў. Выдаліце непатрэбныя з дапамогай значка сметніцы або націсніце **Дадаць файлы**, каб дадаць іншыя. +3. Націсніце **Пераўтварыць у PDF**. Інструмент разбірае структуру XML з дапамогай убудаванага ў браўзер DOMParser, аналізуе іерархію даных і стварае PDF з дапамогай jsPDF з аўтаматычным фарматаваннем табліц. +4. Адзін файл спампоўваецца як PDF. Некалькі вынікаў пакуюцца ў `xml-to-pdf.zip`. + +## Параметры + +Ручная налада не патрэбна. Пераўтваральнік аўтаматычна вызначае структуру XML і выбірае прыдатны макет табліц. Вынік выкарыстоўвае альбомную арыентацыю A4, каб змясціць шырокія наборы даных. + +## Сцэнарыі выкарыстання + +- Ператварэнне экспартаў даных XML з баз даных або API у справаздачы для друку +- Стварэнне зразумелых зводак з файлаў канфігурацыі XML +- Пераўтварэнне рахункаў або журналаў транзакцый на аснове XML у PDF для ўліку +- Ператварэнне карт сайта XML або стужак RSS у зручныя для чытання дакументы + +## Парады + +- XML павінен быць карэктна сфармаваны. Калі аналізатар знойдзе сінтаксічныя памылкі, пераўтварэнне не атрымаецца, і з'явіцца паведамленне з апісаннем праблемы. +- Глыбока ўкладзеныя структуры XML разгортваюцца ў табліцы. Для лепшага выніку даныя павінны мець паўторныя суседнія элементы з аднолькавымі даччынымі элементамі. +- Падчас пераўтварэння паказваецца прагрэс кожнага этапу: чытанне, разбор, аналіз і адлюстраванне. + +## Звязаныя інструменты + +- [FB2 у PDF](./fb2-to-pdf) +- [XPS у PDF](./xps-to-pdf) +- [Email у PDF](./email-to-pdf) diff --git a/docs/be/tools/xps-to-pdf.md b/docs/be/tools/xps-to-pdf.md new file mode 100644 index 00000000..c20f79ff --- /dev/null +++ b/docs/be/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS у PDF +description: Пераўтварайце дакументы XPS і OXPS у фармат PDF у браўзеры. Без загрузкі на сервер, без рэгістрацыі, цалкам прыватна. +--- + +# XPS у PDF + +Пераўтварайце дакументы Microsoft XPS і OXPS у стандартныя PDF-файлы. XPS (XML Paper Specification) быў адказам Microsoft на PDF, але яго падтрымка на розных платформах значна скарацілася. Гэты інструмент зноў робіць такія дакументы даступнымі для ўсіх. + +## Падтрымліваемыя фарматы + +| Фармат | Пашырэнне | Заўвагі | +| :----- | :-------- | :----------------------------------- | +| XPS | `.xps` | Арыгінальны фармат Microsoft XPS | +| OXPS | `.oxps` | Open XPS, варыянт стандарту ECMA-388 | + +## Як гэта працуе + +1. Націсніце на вобласць загрузкі або перацягніце файлы XPS/OXPS. Можна выбраць некалькі файлаў адразу. +2. Праглядзіце спіс файлаў. Выдаліце асобныя файлы з дапамогай значка сметніцы або націсніце **Дадаць файлы**, каб дадаць іншыя дакументы. +3. Націсніце **Пераўтварыць у PDF**. Рухавік PyMuPDF апрацоўвае кожны дакумент лакальна ў вашым браўзеры. +4. Адзін файл спампоўваецца адразу як PDF. Некалькі файлаў аб'ядноўваюцца ў ZIP-архіў з назвай `xps-converted.zip`. + +## Параметры + +Гэты інструмент выконвае прамое пераўтварэнне фармату без дадатковых налад. Вынік захоўвае арыгінальныя памеры старонак, вектарную графіку, шрыфты і выявы з крыніцы XPS. + +## Сцэнарыі выкарыстання + +- Адкрыццё файлаў XPS са старых сістэм Windows, дзе па змаўчанні выкарыстоўваўся драйвер друку XPS +- Пераўтварэнне дакументаў OXPS з Windows 10/11 для абмену з карыстальнікамі macOS або Linux +- Архіваванне старых файлаў XPS у больш распаўсюджаным фармаце +- Забеспячэнне доступу знешніх атрымальнікаў да дзяржаўных або карпаратыўных дакументаў у фармаце XPS + +## Парады + +- Пашырэнні `.xps` і `.oxps` апрацоўваюцца аўтаматычна: іх можна змешваць у адным пакеце. +- Калі арыгінальны файл XPS быў створаны драйверам друку з высокай раздзяляльнасцю, атрыманы PDF захоўвае гэтую якасць. Перадыскрэтызацыя не выконваецца. + +## Звязаныя інструменты + +- [Word у PDF](./word-to-pdf) +- [XML у PDF](./xml-to-pdf) diff --git a/docs/ca/contributing.md b/docs/ca/contributing.md new file mode 100644 index 00000000..b223d032 --- /dev/null +++ b/docs/ca/contributing.md @@ -0,0 +1,136 @@ +# Contribuir + +Gràcies pel teu interès a contribuir a BentoPDF! Aquesta guia t'ajudarà a començar. + +## Primers passos + +### Requisits previs + +- Node.js 18+ +- npm 9+ +- Git + +### Configuració + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Estructura del projecte + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Afegir una eina nova + +### Pas 1: crea el fitxer de lògica + +Crea `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Pas 2: crea la pàgina HTML + +Crea `src/pages/your-tool.html` seguint les plantilles d'eines existents. + +### Pas 3: registra l'eina + +Afegeix a `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Pas 4: afegeix-la a la configuració de la compilació + +Afegeix la pàgina a `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Pas 5: afegeix les traduccions + +Afegeix entrades a tots els fitxers d'idioma de `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Estil de codi + +- Utilitza TypeScript per a tot el codi nou +- Segueix els patrons existents per mantenir la coherència +- Executa `npm run format` abans de fer commit +- Sense comentaris al codi de producció (els comentaris s'eliminen durant la compilació) + +## Procés de pull request + +1. Crea una branca de funcionalitat: `git checkout -b feature/your-feature` +2. Fes els canvis +3. Prova-ho a fons: `npm run build` +4. Envia una PR amb una descripció clara + +## Traducció + +Consulta [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) per afegir idiomes nous. + +## Acord de llicència de col·laborador + +Abans que es pugui fusionar la teva PR, hauràs de signar el nostre CLA: + +- [CLA individual (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA corporatiu (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Obtenir ajuda + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Comunitat de Discord](https://discord.gg/Bgq3Ay3f2w) + +## Llicència + +BentoPDF té doble llicència: + +- **AGPL-3.0** per a projectes de codi obert on comparteixes tot el codi font públicament +- **Llicència comercial** per a aplicacions propietàries o de codi tancat: [Aconsegueix la llicència vitalícia per 79 $](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +En contribuir, acceptes que les teves contribucions es llicenciïn amb aquests termes. diff --git a/docs/ca/getting-started.md b/docs/ca/getting-started.md new file mode 100644 index 00000000..778554a4 --- /dev/null +++ b/docs/ca/getting-started.md @@ -0,0 +1,80 @@ +# Primers passos + +Et donem la benvinguda a BentoPDF! Aquesta guia t'ajudarà a posar-te en marxa ràpidament. + +## Què és BentoPDF? + +BentoPDF és un conjunt d'eines PDF gratuït, de codi obert i pensat per protegir la privadesa, que funciona **íntegrament al navegador**. Els fitxers no surten mai del dispositiu: tot el processament es fa en local amb tecnologia WebAssembly (WASM). + +## Inici ràpid + +### Opció 1: utilitza la versió allotjada + +Visita [bentopdf.com](https://www.bentopdf.com) per utilitzar BentoPDF a l'instant, sense instal·lació. + +### Opció 2: allotja'l tu mateix amb Docker + +> [!IMPORTANT] +> La conversió de fitxers d'Office requereix `SharedArrayBuffer`, que necessita tots dos: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - un context segur +> +> `http://localhost` funciona per a proves locals perquè els navegadors consideren fiable el bucle local. `http://192.168.x.x` o altres IP de la xarxa local normalment no, de manera que les conversions de Word/Excel/PowerPoint requeriran HTTPS quan s'hi accedeixi des d'altres dispositius de la xarxa. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF s'ofereix en dues versions: la **versió autoallotjada** (`bentopdf-simple`, la utilitzada més amunt) per a desplegaments interns, d'equip o d'organització, i la **versió comercial** (`bentopdf:latest`) que utilitza el mateix bentopdf.com i els titulars de llicència comercial amb desplegaments públics. Totes dues inclouen les mateixes eines PDF: la versió comercial afegeix la portada, les preguntes freqüents, els testimonis i el peu de pàgina de bentopdf.com. Si tens dubtes, utilitza la versió autoallotjada. + +Després obre `http://localhost:3000` al navegador. + +> [!NOTE] +> Si prepares un desplegament d'OCR aïllat de la xarxa, has d'allotjar internament les fonts de la capa de text d'OCR, a més del worker de Tesseract, el runtime principal i els fitxers traineddata. La configuració completa es documenta a [Autoallotjament](/ca/self-hosting/), incloent-hi `VITE_OCR_FONT_BASE_URL` i el directori `ocr-fonts/` inclòs. + +### Opció 3: compila des del codi font + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Les funcions d'un cop d'ull + +| Categoria | Eines | +| ------------------------- | ------------------------------------------------------------ | +| **Converteix a PDF** | Word, Excel, PowerPoint, imatges, Markdown, EPUB, MOBI i més | +| **Converteix des de PDF** | JPG, PNG, text, Excel, SVG i més | +| **Edita i anota** | Signa, ressalta, censura, omple formularis, afegeix segells | +| **Organitza** | Fusiona, divideix, gira, suprimeix pàgines, reordena | +| **Optimitza** | Comprimeix, repara, aplana, OCR | +| **Seguretat** | Xifra, desxifra, elimina restriccions | + +## Compatibilitat amb navegadors + +BentoPDF funciona millor en navegadors moderns: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Següents passos + +- [Explora totes les eines](/ca/tools/) +- [Allotja BentoPDF tu mateix](/ca/self-hosting/) +- [Contribueix al projecte](/ca/contributing) diff --git a/docs/ca/index.md b/docs/ca/index.md new file mode 100644 index 00000000..1c308d63 --- /dev/null +++ b/docs/ca/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Eines PDF gratuïtes i de codi obert' + tagline: Processa PDF íntegrament al navegador. Sense càrregues. Sense servidors. Privadesa total. + actions: + - theme: brand + text: Comença + link: /ca/getting-started + - theme: alt + text: Veure les eines + link: /ca/tools/ + - theme: alt + text: Autoallotjament + link: /ca/self-hosting/ + - theme: alt + text: Llicència comercial + link: /ca/licensing + +features: + - icon: 🔒 + title: 100 % privat + details: Els fitxers no surten mai del dispositiu. Tot el processament es fa en local al navegador amb WebAssembly. + - icon: ⚡ + title: Ràpid i gratuït + details: Sense registres, sense límits, sense marques d'aigua. Processa PDF il·limitats de franc, per sempre. + - icon: 🛠️ + title: Més de 50 eines + details: Converteix, edita, fusiona, divideix, comprimeix, signa, aplica OCR i més. Tot el que necessites en un sol lloc. + + - icon: 🌐 + title: Autoallotjable + details: Desplega'l a la teva pròpia infraestructura. Docker, Vercel, Netlify, AWS o entorns totalment aïllats de la xarxa amb workers d'OCR, dades d'idioma i fonts de capa de text autoallotjats. +--- + +## OCR sense connexió + +Si autoallotges BentoPDF en un entorn aïllat de la xarxa o sense connexió, l'OCR necessita més que el worker de Tesseract i els fitxers traineddata. Per generar PDF amb text cercable, també cal servir internament les fonts de la capa de text d'OCR. +Consulta [Autoallotjament](/ca/self-hosting/) per a la configuració completa, incloent-hi `VITE_OCR_FONT_BASE_URL`, el directori `ocr-fonts/` inclòs i el flux de treball aïllat actualitzat. diff --git a/docs/ca/licensing.md b/docs/ca/licensing.md new file mode 100644 index 00000000..faf94f4f --- /dev/null +++ b/docs/ca/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/ca/self-hosting/#configuracio-de-wasm-components-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/ca/self-hosting/apache.md b/docs/ca/self-hosting/apache.md new file mode 100644 index 00000000..50838591 --- /dev/null +++ b/docs/ca/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Desplega amb Apache + +Allotja BentoPDF amb Apache HTTP Server. + +## Requisits previs + +- Apache 2.4+ +- mod_rewrite activat +- Certificat SSL (recomanat) + +## Pas 1: compila el projecte + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Per personalitzar la marca, defineix variables d'entorn abans de compilar: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Pas 2: copia els fitxers + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Pas 3: configuració d'Apache + +Crea `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Pas 4: .htaccess per a l'encaminament + +Crea `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Pas 5: activa els mòduls necessaris + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Pas 6: activa el lloc + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Desplegament en un subdirectori + +Per allotjar-lo a `/pdf/`: + +1. Compila amb la URL base: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Actualitza `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Resolució de problemes + +### Errors 404 amb WASM + +Assegura't que el tipus MIME està configurat: + +```apache +AddType application/wasm .wasm +``` + +### Signa PDF o el emplenador de formularis mostra un visor en blanc (error de MIME amb `.mjs`) + +Si la consola del navegador mostra: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…i la petició que falla acaba en `.mjs`, a la configuració d'Apache li falta l'assignació `.mjs → application/javascript`. El visor de PDF inclòs porta fitxers de mòdul ES amb extensió `.mjs`, i el `mime.types` estàndard d'Apache no els inclou per defecte. + +Afegeix-ho al VirtualHost o a `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Després recarrega Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Per comprovar-ho: a les DevTools del navegador → pestanya Network, troba la petició `.mjs` que falla i mira la capçalera de resposta `Content-Type`. Ara hauria de ser `application/javascript`, no `application/octet-stream`. + +### La reescriptura no funciona + +Comprova que mod_rewrite està activat: + +```bash +sudo a2enmod rewrite +``` + +### La conversió de Word/ODT/Excel a PDF no funciona + +LibreOffice WASM requereix `SharedArrayBuffer`, que necessita aquestes capçaleres: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +També necessita un context segur. `http://localhost` funciona per a proves locals, però `http://192.168.x.x` o altres IP de la xarxa local normalment requereixen HTTPS. Si les capçaleres hi són però `window.crossOriginIsolated` continua sent `false`, comprova si la pàgina s'obre per HTTP sense xifrar des d'un origen que no és de bucle local. + +Els fitxers precomprimits `.wasm.gz` i `.data.gz` també necessiten un `Content-Encoding` correcte: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Assegura't que `mod_headers` està activat: `sudo a2enmod headers` + +### Permís denegat + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/ca/self-hosting/aws.md b/docs/ca/self-hosting/aws.md new file mode 100644 index 00000000..0c19695a --- /dev/null +++ b/docs/ca/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Desplega a AWS S3 + CloudFront + +Allotja BentoPDF a AWS per tenir el màxim control i escalabilitat. + +## Arquitectura + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Pas 1: crea el bucket d'S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Pas 2: compila i puja + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Pas 3: crea la distribució de CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +O utilitza la consola d'AWS: + +1. Ves a CloudFront → Create distribution +2. Origin domain: selecciona el teu bucket d'S3 +3. Activa "Origin Access Control" +4. Default root object: `index.html` +5. Crea la distribució + +## Pas 3b: política de capçaleres de resposta (obligatòria per a LibreOffice WASM) + +Les conversions basades en LibreOffice (Word, Excel i PowerPoint a PDF) requereixen `SharedArrayBuffer`, que necessita unes capçaleres de resposta concretes. Crea una Response Headers Policy de CloudFront: + +1. Ves a CloudFront → Policies → Response headers +2. Crea una política personalitzada amb aquestes capçaleres: + +| Capçalera | Valor | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Associa la política al comportament de memòria cau per defecte de la distribució + +O per CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Pas 3c: metadades d'S3 per als fitxers WASM precomprimits + +Els fitxers WASM de LibreOffice estan precomprimits (`.wasm.gz`, `.data.gz`). Defineix el Content-Type i el Content-Encoding correctes perquè els navegadors els descomprimeixin: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Important +Sense la política de capçaleres de resposta, `SharedArrayBuffer` no està disponible i les conversions de LibreOffice WASM es quedaran bloquejades al ~55 %. Sense el Content-Encoding correcte als fitxers `.gz`, el navegador rep bytes gzip en brut i la compilació de WASM falla. +::: + +## Pas 4: política del bucket d'S3 + +Permet que CloudFront accedeixi al bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Pas 5: pàgines d'error personalitzades + +Configura el 404 perquè retorni `index.html` per a l'encaminament SPA: + +1. CloudFront → Error pages +2. Crea una resposta d'error personalitzada: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Estimació de costos + +| Recurs | Cost estimat | +| --------------------------- | ------------ | +| Emmagatzematge S3 (~500MB) | ~0,01 $/mes | +| CloudFront (1TB transfer.) | ~85 $/mes | +| CloudFront (10GB transfer.) | ~0,85 $/mes | + +::: tip +Utilitza S3 Intelligent Tiering per optimitzar costos en fitxers d'accés poc freqüent. +::: + +## Automatització amb Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/ca/self-hosting/cloudflare.md b/docs/ca/self-hosting/cloudflare.md new file mode 100644 index 00000000..85a5eb95 --- /dev/null +++ b/docs/ca/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Desplega a Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) ofereix allotjament estàtic ràpid i global amb amplada de banda il·limitada. + +## Desplegament ràpid + +1. Ves a [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Fes clic a "Create a project" +3. Connecta el teu repositori de GitHub + +## Configuració de la compilació + +| Paràmetre | Valor | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Variables d'entorn + +Afegeix-les a Settings → Environment variables: + +| Variable | Valor | +| ----------------------- | ----------------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (opcional) | +| `VITE_BRAND_NAME` | Nom de marca personalitzat (opcional) | +| `VITE_BRAND_LOGO` | Ruta del logotip relativa a `public/` (opcional) | +| `VITE_FOOTER_TEXT` | Text personalitzat del peu de pàgina/copyright (opcional) | +| `VITE_DEFAULT_LANGUAGE` | Idioma per defecte de la interfície, p. ex. `fr` (opcional) | + +## Fitxer de configuració + +Crea `_headers` a la carpeta `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Important +Les capçaleres `Cross-Origin-Embedder-Policy` i `Cross-Origin-Opener-Policy` són obligatòries per a les conversions de Word/ODT/Excel/PowerPoint a PDF. Sense elles, `SharedArrayBuffer` no està disponible i el motor LibreOffice WASM no s'inicialitzarà. +::: + +Crea `_redirects` per a l'encaminament SPA: + +``` +/* /index.html 200 +``` + +## Domini personalitzat + +1. Ves al teu projecte de Pages +2. Fes clic a "Custom domains" +3. Afegeix el teu domini +4. Cloudflare configurarà el DNS automàticament si el domini és a Cloudflare + +## Avantatges + +- **Amplada de banda il·limitada i gratuïta** +- **CDN global** amb més de 300 ubicacions de xarxa +- **HTTPS automàtic** +- **Desplegaments de previsualització** per a les pull requests +- **Compilacions ràpides** + +## Resolució de problemes + +### Càrrega de fitxers grans + +Cloudflare Pages admet fitxers de fins a 25 MB. Els mòduls WASM haurien d'anar bé, però si arribes als límits, considera: + +```bash +# Split large files during build +npm run build +``` + +### Límits de mida dels Workers + +Si utilitzes Cloudflare Workers per a un encaminament avançat, tingues en compte el límit d'1 MB dels plans gratuïts. + +## Worker de proxy CORS (per a signatures digitals) + +L'eina de signatura digital requereix un proxy CORS per obtenir les cadenes de certificats. Desplega el worker inclòs: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Funcions de seguretat + +| Funció | Descripció | +| -------------------------- | ------------------------------------ | +| **Restriccions d'URL** | Només es permeten URL de certificats | +| **Límit de mida** | Màx. 10MB per petició | +| **Límit de freqüència** | 60 peticions/IP/min (requereix KV) | +| **Bloqueig d'IP privades** | Bloqueja localhost i IP internes | + +### Activa el límit de freqüència + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Compila amb la URL del proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +O amb Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Nota:** Consulta el [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) per a la configuració de la signatura HMAC. diff --git a/docs/ca/self-hosting/cors-proxy.md b/docs/ca/self-hosting/cors-proxy.md new file mode 100644 index 00000000..88f6c0d5 --- /dev/null +++ b/docs/ca/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Proxy CORS per obtenir certificats + +L'eina de signatura digital utilitza un proxy CORS per obtenir els certificats dels emissors a les autoritats de certificació (CA) externes. Això és necessari perquè molts servidors de CA no inclouen capçaleres CORS a les respostes, cosa que impedeix la consulta directa des del navegador. + +A més, molts servidors de CA serveixen els certificats per HTTP sense xifrar. Quan la teva instància de BentoPDF s'allotja per HTTPS, els navegadors bloquegen aquestes peticions HTTP (política de contingut mixt). El proxy CORS resol tots dos problemes encaminant les peticions per un punt final HTTPS amb les capçaleres adequades. + +## Com funciona + +Quan signes un PDF amb un certificat: + +1. La biblioteca `zgapdfsigner` intenta construir una cadena de certificats completa +2. Obté els certificats dels emissors a partir de les URL incrustades a l'extensió AIA (Authority Information Access) del teu certificat +3. Aquestes peticions passen per un proxy CORS que afegeix les capçaleres `Access-Control-Allow-Origin` necessàries +4. El proxy retorna les dades del certificat al navegador + +## Autoallotjar el proxy CORS + +Si autoallotges BentoPDF, hauràs de desplegar el teu propi proxy CORS perquè les signatures digitals funcionin amb certificats que requereixen obtenir la cadena. + +### Opció 1: Cloudflare Workers (recomanada) + +1. **Instal·la la CLI de Wrangler**: + + ```bash + npm install -g wrangler + ``` + +2. **Inicia sessió a Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clona BentoPDF i actualitza els orígens permesos**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Obre `cors-proxy-worker.js` i canvia l'array `ALLOWED_ORIGINS` pel teu domini: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Important + Sense aquest canvi, el proxy rebutjarà totes les peticions del teu lloc amb un error **403 Forbidden**. Per defecte, només permet peticions de `bentopdf.com`. + ::: + +4. **Desplega el proxy**: + + ```bash + wrangler deploy + ``` + + Anota la URL del worker (p. ex., `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Torna a compilar BentoPDF amb la URL del proxy**: + + Si utilitzes Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Si compiles des del codi font: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Opció 2: proxy de backend propi + +També pots crear el teu propi punt final de proxy. Els requisits són: + +1. Acceptar peticions GET amb un paràmetre de consulta `url` +2. Obtenir la URL des del teu servidor (sense restriccions CORS al servidor) +3. Retornar la resposta amb aquestes capçaleres: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Exemple d'implementació amb Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Consideracions de seguretat + +El Cloudflare Worker inclòs té diverses mesures de seguretat: + +| Funció | Descripció | +| ------------------------------ | ------------------------------------------------------------------------------------------------------- | +| **Validació d'origen** | Només permet peticions dels dominis llistats a `ALLOWED_ORIGINS` | +| **Restriccions d'URL** | Només permet URL de certificats (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Bloqueig d'IP privades** | Bloqueja intervals privats IPv4/IPv6, d'enllaç local, de bucle local, IP decimals i metadades del núvol | +| **Seguretat del Content-Type** | Només retorna tipus MIME de certificats segurs i bloqueja la injecció de content-type des de l'origen | +| **Límit de mida** | Transmet la resposta amb un límit de 10MB i l'interromp a mitja descàrrega si se supera | +| **Límit de freqüència** | 60 peticions per minut per IP o IPv6 /64 (requereix KV, no bloqueja si KV falla) | +| **Signatures HMAC** | Signatura opcional al client (dissuadeix l'abús casual) | + +### DNS rebinding (autoallotjament fora de Cloudflare) + +El worker rebutja qualsevol URL que es resolgui a una IP privada o interna. No pot utilitzar una llista fixa de servidors permesos, ja que les URL de la cadena de certificats apunten a qualsevol CA que hagi emès el certificat (FNMT, CA corporatives, etc.), de manera que les destinacions no es coneixen per endavant. Això deixa una petita finestra de rebinding: algú que gestioni el DNS del seu propi domini podria donar una IP pública a la comprovació de seguretat i una de privada a la petició real un moment després. + +A Cloudflare no es pot explotar: els Workers no poden accedir a IP privades ni al punt final de metadades `169.254.169.254`, així que un rebinding no arriba enlloc. Només cal no donar al worker cap via d'entrada: no hi associïs cap Tunnel, Service ni enllaç de xarxa privada (només necessita `RATE_LIMIT_KV`). + +Si l'executes fora de Cloudflare (workerd, Node i similars) dins d'una VPC, l'entorn _sí_ pot accedir a IP internes. Posa-hi al davant un tallafoc de sortida i bloqueja els intervals privats: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` i els seus equivalents IPv6. El codi de l'aplicació no ho pot garantir un cop fora de Cloudflare. + +## Desactivar el proxy + +Si no vols utilitzar un proxy CORS, defineix la variable d'entorn amb una cadena buida: + +``` +VITE_CORS_PROXY_URL= +``` + +**Nota**: sense el proxy, la signatura amb certificats que requereixen obtenir la cadena externament (com FNMT o algunes CA corporatives) fallarà amb l'error "Failed to fetch". + +## Resolució de problemes + +### "Signing error: TypeError: Failed to fetch" + +Normalment vol dir una d'aquestes coses: + +1. **No hi ha cap proxy CORS configurat**: defineix `VITE_CORS_PROXY_URL` i torna a compilar +2. **Contingut mixt bloquejat**: el teu lloc és HTTPS però la URL de l'emissor del certificat és HTTP. El proxy CORS ho resol. +3. **El proxy CORS rebutja el teu origen**: comprova que el teu domini és a l'array `ALLOWED_ORIGINS` de `cors-proxy-worker.js` + +### "403 Forbidden" del proxy + +El teu domini no és a la llista `ALLOWED_ORIGINS`. Edita `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Després torna a desplegar: `npx wrangler deploy` + +### Provar el proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certificats que funcionen sense proxy + +Alguns certificats inclouen la cadena completa al fitxer P12/PFX i no requereixen obtenir res externament: + +- Certificats autosignats +- Algunes CA comercials que inclouen els certificats intermedis +- Certificats que has muntat manualment amb la cadena completa diff --git a/docs/ca/self-hosting/docker.md b/docs/ca/self-hosting/docker.md new file mode 100644 index 00000000..4827c227 --- /dev/null +++ b/docs/ca/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Desplega amb Docker / Podman + +La manera més fàcil d'autoallotjar BentoPDF en un entorn de producció. + +> [!IMPORTANT] +> **Capçaleres necessàries per a la conversió de fitxers d'Office** +> +> Les eines basades en LibreOffice (conversió de Word, Excel i PowerPoint) requereixen aquestes capçaleres HTTP per admetre `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> La pàgina també s'ha de servir des d'un context segur. `http://localhost` funciona per a proves locals, però `http://192.168.x.x` o altres IP de la xarxa local normalment no ho compleixen, de manera que la conversió d'Office per HTTP sense xifrar fallarà encara que les capçaleres hi siguin. +> +> Les imatges de contenidor oficials inclouen aquestes capçaleres. Si utilitzes un proxy invers (Traefik, Caddy, etc.), assegura't que aquestes capçaleres es conserven o s'afegeixen, i utilitza HTTPS per a l'accés fora del bucle local. + +> [!TIP] +> **Usuaris de Podman:** totes les ordres `docker` funcionen amb Podman substituint `docker` per `podman` i `docker-compose` per `podman-compose`. + +## Inici ràpid + +> [!TIP] +> BentoPDF s'ofereix en dues versions: +> +> - **Versió autoallotjada**: `ghcr.io/alam00000/bentopdf-simple:latest`. Totes les eines PDF, **sense** els elements de màrqueting (sense portada, preguntes freqüents, testimonis ni peu de pàgina). Utilitza-la per a desplegaments interns, d'equip o d'organització. **No** és una versió "lite" amb menys funcions. +> - **Versió comercial**: `ghcr.io/alam00000/bentopdf:latest`. El lloc de màrqueting complet, que utilitza el mateix bentopdf.com i els titulars de llicència comercial amb desplegaments públics. +> +> Si tens dubtes, descarrega la versió autoallotjada. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Crea `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Executa: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Compila la teva pròpia imatge + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Compila i executa: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Variables d'entorn + +| Variable | Descripció | Per defecte | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Compila la variant autoallotjada (amaga els elements de màrqueting de bentopdf.com: portada, preguntes freqüents, testimonis i peu de pàgina). Es mantenen totes les eines PDF. | `false` | +| `BASE_URL` | Desplega en un subdirectori | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL del mòdul WASM de PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL del mòdul WASM de Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL del mòdul WASM de CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL del script del worker d'OCR | _(buit; utilitza el CDN per defecte de Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Directori del runtime principal d'OCR | _(buit; utilitza el CDN per defecte de Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Directori de traineddata d'OCR | _(buit; utilitza el CDN per defecte de Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Idiomes d'OCR separats per comes que es mostren a la interfície | _(buit; mostra el catàleg complet)_ | +| `VITE_OCR_FONT_BASE_URL` | Directori de fonts de la capa de text d'OCR | _(buit; utilitza les URL remotes de fonts Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Idioma per defecte de la interfície | `en` | +| `VITE_BRAND_NAME` | Nom de marca personalitzat | `BentoPDF` | +| `VITE_BRAND_LOGO` | Ruta del logotip relativa a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Text personalitzat del peu de pàgina/copyright | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID d'eines separats per comes que s'han d'amagar | _(buit; totes les eines activades)_ | +| `DISABLE_GITHUB_STARS` | Omet la consulta del nombre d'estrelles de GitHub en carregar la pàgina i elimina `api.github.com` de la CSP. Les compilacions en mode simple sempre l'ometen. | `false` | +| `SITE_URL` | URL pública escrita als enllaços canonical, hreflang i del mapa del lloc. Deixa-la per defecte tret que vulguis que els cercadors tractin el teu desplegament com un lloc propi. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Amb un `SITE_URL` personalitzat, totes les pàgines es marquen com a `noindex` perquè la teva còpia no competeixi amb bentopdf.com als resultats de cerca. Defineix-ho a `true` perquè els cercadors l'indexin. | `false` | + +Les URL dels mòduls WASM vénen preconfigurades amb CDN per defecte, així que totes les funcions avançades funcionen directament. Substitueix-les en desplegaments aïllats de la xarxa o autoallotjats. + +### Cercadors + +Per defecte, totes les pàgines indiquen als cercadors que l'original és bentopdf.com, de manera que el teu desplegament no apareix com a duplicat. No cal canviar res per a una instància privada o interna. + +- **Mantenir la instància fora dels resultats de cerca:** executa el contenidor amb `-e ROBOTS_NOINDEX=true`. Només cal reiniciar-lo, no tornar a compilar. +- **Fer que la instància sigui un lloc propi als resultats de cerca:** compila amb `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Sense `ALLOW_INDEXING=true`, un `SITE_URL` personalitzat marca totes les pàgines com a `noindex`. + +### Content-Security-Policy + +La imatge d'nginx inclou una capçalera `Content-Security-Policy` d'aplicació obligatòria. Les directives `script-src`, `connect-src` i `font-src` de la CSP es **generen en el moment de la compilació** a partir de les variables d'URL `VITE_*` anteriors: els servidors que passis amb `--build-arg` s'afegeixen automàticament a la política. + +Com a resultat: + +- Si substitueixes `VITE_CORS_PROXY_URL` o `VITE_WASM_*_URL` en compilar, la CSP permet aquests orígens automàticament, sense cap configuració addicional. +- Per a les URL de `cdn.jsdelivr.net`, `script-src` només permet la carpeta exacta del paquet amb versió, per exemple `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, no tot el CDN. jsDelivr serveix qualsevol paquet npm públic o repositori de GitHub, així que permetre tot el servidor deixaria executar-los a la teva instància. Les URL de qualsevol altre servidor es permeten per origen. +- Si configures URL WASM personalitzades _en execució_ a la pàgina de configuració avançada de l'aplicació, aquests orígens **no** són a la CSP i el navegador en bloquejarà les peticions. Això també val per a una versió diferent del mateix paquet a `cdn.jsdelivr.net`, perquè només es permet la versió definida en compilar. La configuració en execució és per experimentar; per a URL personalitzades permanents, defineix l'argument de compilació `VITE_*` corresponent. +- Als desplegaments aïllats de la xarxa que substitueixen els tres valors `VITE_WASM_*_URL`, també s'eliminen de la CSP aquestes carpetes de paquets de `cdn.jsdelivr.net` (cada valor per defecte se substitueix, no s'afegeix). Els valors per defecte d'OCR de Tesseract a `cdn.jsdelivr.net` es queden a la política fins que també defineixis els tres valors `VITE_TESSERACT_*`. De la mateixa manera, definir `VITE_CORS_PROXY_URL` substitueix el valor públic per defecte `bentopdf-cors-proxy.bentopdf.workers.dev`. + +La CSP inclou `'unsafe-eval'` a `script-src` perquè el runtime de LibreOffice WASM (utilitzat per les eines de conversió de Word/Excel/PowerPoint) i la biblioteca d'imatges wasm-vips (utilitzada per PDF a TIFF) compilen codi de distribució intern mitjançant `new Function()`. Eliminar-lo trencaria aquestes eines. Si compiles en `SIMPLE_MODE` (sense LibreOffice) i no necessites PDF a TIFF, pots editar manualment el `security-headers.conf` generat per treure `'unsafe-eval'` i obtenir una política més estricta. + +Per a l'OCR, deixa buides les variables `VITE_TESSERACT_*` per utilitzar els recursos en línia per defecte, o defineix-les totes tres alhora per a l'OCR autoallotjat o sense connexió. Les substitucions parcials d'OCR es rebutgen perquè el worker, el runtime principal i el directori de traineddata han de coincidir. Per generar PDF cercables totalment sense connexió, defineix també `VITE_OCR_FONT_BASE_URL` perquè les fonts de la capa de text d'OCR es carreguin des del teu servidor intern i no des de les URL públiques de fonts Noto. + +`VITE_DEFAULT_LANGUAGE` defineix l'idioma de la interfície per als visitants que hi entren per primera vegada. Valors admesos: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Els usuaris poden canviar d'idioma igualment: això només canvia el valor per defecte. + +Exemple: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Marca personalitzada + +Substitueix el logotip, el nom i el text del peu de pàgina de BentoPDF pels teus. Posa el fitxer del logotip a la carpeta `public/` (o utilitza una imatge existent) i passa les variables de marca en compilar: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La marca funciona tant en mode complet com en mode simple, i es pot combinar amb totes les altres opcions de compilació. + +### Desactivar eines concretes + +Amaga eines de la interfície per requisits de compliment o seguretat. Les eines desactivades s'eliminen de la pàgina d'inici, dels resultats de cerca, de les dreceres de teclat i del creador de fluxos de treball. L'accés directe per URL mostra una pàgina d'"eina no disponible". + +Els ID d'eina són la URL de la pàgina sense `.html`. Per exemple, si l'eina és a `bentopdf.com/edit-pdf.html`, l'ID és `edit-pdf`. + +#### Trobar els ID d'eina + +La manera més fàcil: obre qualsevol eina de BentoPDF i mira la URL. L'última part de la ruta (sense `.html`) és l'ID de l'eina. + +
+Llista completa d'ID d'eina + +**Edita i anota:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Converteix a PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Converteix des de PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organitza i gestiona:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimitza i repara:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Seguretat:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Opció 1: en compilar (argument de compilació de Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Això incorpora la llista de desactivades al paquet de JavaScript. Per canviar-la cal tornar a compilar. + +#### Opció 2: en execució (config.json) + +Munta un fitxer `config.json` al directori servit, sense necessitat de tornar a compilar: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +O amb Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Els dos mètodes es poden combinar: les llistes es fusionen. Si una eina apareix en qualsevol de les dues, es desactiva. + +#### Desactivar funcions de l'editor + +També pots desactivar funcions concretes de l'editor de PDF (p. ex., censura, anotacions, formularis) sense desactivar tota l'eina d'edició. Afegeix `editorDisabledCategories` al teu `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Llista completa de categories de l'editor + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Anotació:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Formes:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulari:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Censura:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Document:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Pàgina:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Tauler:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Eines:** `tools`, `pan`, `pointer`, `capture` + +**Selecció:** `selection`, `selection-copy` + +**Historial:** `history`, `history-undo`, `history-redo` + +
+ +Les categories són jeràrquiques: desactivar una categoria pare (p. ex., `annotation`) desactiva tots els seus fills. + +### Desactivar el comptador d'estrelles de GitHub + +La barra de navegació mostra el nombre d'estrelles de GitHub en directe, obtingut de `api.github.com` en carregar la pàgina. És l'única petició externa que no serveix una funció de PDF. Desactiva-ho en compilar per eliminar el codi de consulta del paquet i treure `api.github.com` de la Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Les compilacions en mode simple (`bentopdf-simple`) sempre ometen el comptador d'estrelles: aquesta opció només cal a la versió comercial o a compilacions completes personalitzades. + +### URL WASM personalitzades (aïllat de la xarxa / autoallotjat) + +> [!IMPORTANT] +> Les URL WASM s'incorporen al JavaScript **en compilar**. Els fitxers WASM els descarrega el **navegador de l'usuari** en execució: Docker no els descarrega durant la compilació. En xarxes aïllades, has d'allotjar els fitxers WASM en un servidor intern al qual arribin els navegadors. + +**Flux de treball complet en xarxa aïllada:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Utilitza per a `--ocr-languages` els codis que mostra `bash scripts/prepare-airgap.sh --list-ocr-languages`, o cerca per nom amb `bash scripts/prepare-airgap.sh --search-ocr-language `. Quan compiles amb un subconjunt restringit d'OCR, passa els mateixos codis a `VITE_TESSERACT_AVAILABLE_LANGUAGES` perquè l'aplicació només mostri els idiomes inclosos. Per a una sortida d'OCR totalment sense connexió, allotja també el directori `ocr-fonts/` inclòs i fes que `VITE_OCR_FONT_BASE_URL` hi apunti. + +Defineix una variable amb una cadena buida per desactivar aquest mòdul (els usuaris l'hauran de configurar manualment a la configuració avançada). + +## Port personalitzat + +Per defecte, BentoPDF escolta al port `8080` dins del contenidor. Per canviar-ho, defineix la variable d'entorn `PORT` en execució: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variable | Descripció | Per defecte | +| -------- | ------------------------------------ | ----------- | +| `PORT` | Port d'escolta d'Nginx al contenidor | `8080` | + +Això funciona tant amb el Dockerfile estàndard com amb el nonroot. + +## ID d'usuari personalitzat (PUID/PGID) + +Per a entorns que requereixen executar-se com un usuari concret que no sigui root (dispositius NAS, Kubernetes amb contextos de seguretat, polítiques de l'organització), BentoPDF ofereix un Dockerfile independent amb suport de PUID/PGID a l'estil LSIO. + +### Compila i executa + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Variables d'entorn + +| Variable | Descripció | Per defecte | +| -------------- | ----------------------------- | ----------- | +| `PUID` | ID d'usuari amb què s'executa | `1000` | +| `PGID` | ID de grup amb què s'executa | `1000` | +| `PORT` | Port d'escolta d'Nginx | `8080` | +| `DISABLE_IPV6` | Desactiva l'escoltador IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Com funciona + +El contenidor s'inicia com a root, crea un usuari amb el PUID/PGID especificat, ajusta la propietat de tots els directoris escrivibles i després retira els privilegis mitjançant `su-exec`. El procés d'nginx s'executa íntegrament com l'usuari que has indicat. + +> [!NOTE] +> El `Dockerfile` estàndard utilitza `nginx-unprivileged` (UID 101) i es recomana per a la majoria de desplegaments. Utilitza `Dockerfile.nonroot` només quan necessitis un UID/GID concret. + +> [!WARNING] +> PUID/PGID no poden ser `0` (root). El punt d'entrada valida els valors i sortirà amb un error si no són vàlids. + +## Amb Traefik (proxy invers) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Amb Caddy (proxy invers) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Límits de recursos + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (integració amb systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) permet executar contenidors de Podman com a serveis de systemd. És ideal per a desplegaments de producció en sistemes Linux. + +### Configuració bàsica de Quadlet + +Crea un fitxer d'unitat de contenidor a `~/.config/containers/systemd/bentopdf.container` (usuari) o `/etc/containers/systemd/bentopdf.container` (sistema): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Activa i inicia + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Per a un desplegament a nivell de sistema, utilitza `systemctl` sense l'opció `--user` i posa el fitxer a `/etc/containers/systemd/`. + +### Quadlet amb comprovació d'estat + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Actualització automàtica amb Quadlet + +Podman pot actualitzar els contenidors automàticament quan hi ha imatges noves disponibles: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Configuració de xarxa de Quadlet + +Per a una configuració de xarxa personalitzada, crea un fitxer de xarxa `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Després fes-hi referència al fitxer del contenidor: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Actualització + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/ca/self-hosting/hostinger.md b/docs/ca/self-hosting/hostinger.md new file mode 100644 index 00000000..62fbf897 --- /dev/null +++ b/docs/ca/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Desplega a Hostinger + +[Hostinger](https://hostinger.com) és un proveïdor d'allotjament compartit molt popular. Aquesta guia explica com desplegar BentoPDF a l'allotjament compartit de Hostinger. + +## Requisits previs + +- Pla d'allotjament de Hostinger amb accés al gestor de fitxers +- Node.js instal·lat en local per compilar + +## Pas 1: compila el projecte + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Els fitxers compilats seran a la carpeta `dist`. + +## Pas 2: puja'l a Hostinger + +### Desplegament al domini arrel + +1. Inicia sessió al teu compte de Hostinger +2. Ves a **File Manager** → **public_html** +3. **Suprimeix** els fitxers existents (fes-ne una còpia de seguretat si cal) +4. **Puja** tot el contingut de la teva carpeta `dist` local a `public_html` + +### Desplegament en un subdirectori + +Si el desplegues en un subdirectori (p. ex., `yourdomain.com/pdf-tools/`): + +1. Compila amb la URL base correcta: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Crea la carpeta a Hostinger: + - Ves a **File Manager** → **public_html** + - Crea una carpeta nova: `pdf-tools` +3. Puja tot el contingut de `dist` a `public_html/pdf-tools/` + +## Pas 3: crea el fitxer .htaccess + +Crea un fitxer `.htaccess` a l'arrel de la carpeta de desplegament (`public_html` o `public_html/pdf-tools/`): + +::: warning Important +Per al desplegament en un subdirectori, canvia `RewriteBase /` per `RewriteBase /pdf-tools/` (o el nom de la teva carpeta). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Exemple de .htaccess per a un subdirectori + +Per a `yourdomain.com/pdf-tools/`, actualitza aquestes línies: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Resolució de problemes + +### Els fitxers WASM no es carreguen + +Assegura't que els tipus MIME estan ben definits a `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Les eines de LibreOffice no funcionen + +Les capçaleres de seguretat són imprescindibles per a SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Si les capçaleres no s'apliquen, contacta amb el suport de Hostinger perquè activin `mod_headers`. + +### Errors 404 en actualitzar la pàgina + +Assegura't que la regla de l'extensió `.html` i les rutes d'idioma estan ben configurades. BentoPDF utilitza fitxers HTML estàtics, no encaminament SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Límits de càrrega de fitxers + +Hostinger pot tenir límits de mida de fitxer. Puja els fitxers WASM per separat si la càrrega en bloc falla. diff --git a/docs/ca/self-hosting/index.md b/docs/ca/self-hosting/index.md new file mode 100644 index 00000000..67f6a698 --- /dev/null +++ b/docs/ca/self-hosting/index.md @@ -0,0 +1,538 @@ +# Guia d'autoallotjament + +BentoPDF es pot autoallotjar a la teva pròpia infraestructura. Aquesta guia cobreix diverses opcions de desplegament. + +## Inici ràpid amb Docker / Podman + +La manera més ràpida d'autoallotjar BentoPDF: + +> [!TIP] +> BentoPDF es distribueix en dues compilacions: +> +> - **Compilació autoallotjada**: `ghcr.io/alam00000/bentopdf-simple:latest`. Totes les eines de PDF, **sense** l'embolcall de màrqueting (sense secció principal, preguntes freqüents, testimonis ni peu de pàgina). Fes-la servir per a desplegaments interns, d'equip o d'organització. **No** és una versió "lite" amb menys funcions. +> - **Compilació comercial**: `ghcr.io/alam00000/bentopdf:latest`. El lloc de màrqueting complet, que fan servir el mateix bentopdf.com i els titulars de llicència comercial que executen desplegaments de cara al públic. +> +> Si tens dubtes: descarrega la compilació autoallotjada. + +> [!IMPORTANT] +> La conversió de fitxers d'Office requereix `SharedArrayBuffer`, cosa que vol dir que l'aplicació ha d'estar aïllada entre orígens i servida des d'un context segur. La imatge oficial ja envia les capçaleres COOP/COEP necessàries, però els navegadors encara desactiven `SharedArrayBuffer` en orígens HTTP simples de la xarxa local, com `http://192.168.x.x`. +> +> Utilitza `http://localhost` només per a proves al mateix dispositiu. Si els usuaris accedeixen a BentoPDF mitjançant una IP o un nom d'amfitrió de la xarxa local, finalitza la connexió amb HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +O amb Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Executa BentoPDF com a servei de systemd. Crea `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Consulta la [guia de desplegament amb Docker](/ca/self-hosting/docker) per a la documentació completa de Quadlet. + +## Compilació des del codi font + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Opcions de configuració + +### Compilació autoallotjada (mode simple) + +La compilació autoallotjada (la imatge `bentopdf-simple`, també anomenada mode simple) és **funcionalment idèntica** a la compilació comercial: totes les eines de PDF hi són i es comporten igual. Només amaga l'embolcall de màrqueting, que només té sentit al mateix bentopdf.com o en un desplegament comercial de cara al públic. **No és una versió reduïda ni "lite".** + +**Què amaga la compilació autoallotjada** (només cosmètic, no s'elimina cap funció de PDF): + +- Barra de navegació, secció principal, secció de característiques, preguntes freqüents, testimonis i peu de pàgina +- Actualitza el títol de la pàgina a "Eines PDF" + +**Què conserva la compilació autoallotjada** (tot el que realment treballa amb PDF): + +- Totes les eines de PDF (fusionar, dividir, editar, signar, OCR, conversió d'Office, etc.) +- Compatibilitat amb marca personalitzada i tota la configuració en temps de compilació i d'execució + +La compilació comercial (`ghcr.io/alam00000/bentopdf:latest`) és la que fa funcionar el mateix bentopdf.com i la fan servir els titulars de llicència comercial que executen desplegaments de cara al públic: afegeix la secció principal, les preguntes freqüents, els testimonis i el peu de pàgina, que no tindrien sentit en una eina interna. + +Si autoallotges BentoPDF per al teu equip, la teva organització o com a eina interna, descarrega la compilació autoallotjada: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Consulta [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) per a més detalls. + +### Compilació comercial (desplegaments de cara al públic amb la teva pròpia marca) + +La compilació comercial (la imatge `bentopdf`, sense el sufix `-simple`) és la que fa funcionar el mateix bentopdf.com. Inclou el lloc de màrqueting complet (secció principal, característiques, preguntes freqüents, testimonis i peu de pàgina) a més de totes les eines de PDF. Fes servir aquesta compilació quan vulguis **desplegar BentoPDF com a servei de PDF de cara al públic sota la teva pròpia marca**, per exemple: + +- Executes BentoPDF com a SaaS allotjat per a usuaris finals al teu propi domini +- Vols l'experiència de pàgina d'aterratge (seccions de màrqueting + eines), no només la superfície nua de les eines +- Ets titular d'una llicència comercial i incrustes BentoPDF en un producte comercial + +**Executa'l tal com és** (amb la marca BentoPDF, útil per previsualitzar la compilació): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Compila amb la teva pròpia marca** (el flux de treball comercial habitual): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Totes les altres opcions de compilació (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, substitució d'URL de WASM, etc.) funcionen igual que a la compilació autoallotjada. + +::: warning Llicències +Executar la compilació comercial està permès amb qualsevol de les dues opcions de llicència de BentoPDF: + +- **AGPL-3.0** (gratuïta): permesa si el teu desplegament publica tot el seu codi font sota AGPL, incloses les modificacions de marca i la lògica de negoci que l'envolta. +- **Llicència comercial** (79 $ de per vida): necessària per a desplegaments de codi tancat o propietaris en què no publiques el codi del teu fork de marca ni del teu codi de negoci. + +Consulta la [pàgina de llicències](https://www.bentopdf.com/licensing) per a la comparació completa. Els mòduls WASM amb llicència AGPL (PyMuPDF, Ghostscript, CoherentPDF) es carreguen des d'un CDN en temps d'execució, de manera que no entren a la teva imatge i no canvien la teva situació de llicència. +::: + +### URL base + +Desplega en un subdirectori: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Marca personalitzada + +Substitueix el logotip, el nom i el text del peu de pàgina per defecte de BentoPDF pels teus en temps de compilació: + +| Variable | Descripció | Per defecte | +| ------------------ | --------------------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Nom de marca mostrat a la capçalera i al peu | `BentoPDF` | +| `VITE_BRAND_LOGO` | Ruta del logotip relativa a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Text personalitzat del peu de pàgina o dels drets d'autor | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +O amb Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La marca funciona tant en mode complet com en mode simple, i es pot combinar amb totes les altres opcions de compilació (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Desactiva eines concretes + +Amaga eines individuals per motius de compliment normatiu o de seguretat. Les eines desactivades s'eliminen de la pàgina d'inici, la cerca, les dreceres, el constructor de fluxos de treball i l'accés directe per URL. + +Els identificadors d'eina són l'URL de la pàgina sense `.html`: obre qualsevol eina i mira l'URL (per exemple, `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**En temps de compilació** (integrat al paquet): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**En temps d'execució** (sense recompilar: munta un `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Els dos mètodes es poden combinar: les llistes es fusionen. + +També pots desactivar funcions concretes de l'Editor de PDF (per exemple, la censura) sense desactivar tota l'eina, afegint `editorDisabledCategories` a `config.json`. Consulta la [guia de Docker](/ca/self-hosting/docker#desactivar-funcions-de-l-editor) per veure la llista completa de categories. + +## Guies de desplegament + +Tria la teva plataforma: + +- [Vercel](/ca/self-hosting/vercel) +- [Netlify](/ca/self-hosting/netlify) +- [Cloudflare Pages](/ca/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/ca/self-hosting/aws) +- [Hostinger](/ca/self-hosting/hostinger) +- [Nginx](/ca/self-hosting/nginx) +- [Apache](/ca/self-hosting/apache) +- [Docker](/ca/self-hosting/docker) +- [Kubernetes](/ca/self-hosting/kubernetes) +- [Servidor intermediari CORS](/ca/self-hosting/cors-proxy): necessari per a les signatures digitals + +## Problemes habituals + +### La conversió de Word / ODT / Excel / PowerPoint a PDF es penja (SharedArrayBuffer no disponible) + +**Símptoma**: les conversions de documents basades en LibreOffice (Word, ODT, Excel, PowerPoint a PDF) es pengen cap al 55 % o no s'arriben a iniciar. La consola del navegador pot mostrar: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...o `window.crossOriginIsolated` retorna `false`, o la compilació de WASM informa `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Causa**: LibreOffice WASM requereix `SharedArrayBuffer`, que el navegador només activa quan la pàgina està **aïllada entre orígens** I es serveix des d'un **context segur**. Això vol dir que s'han de complir dues coses: + +1. Totes les respostes inclouen les dues capçaleres: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. La pàgina es serveix des de `https://...` o `http://localhost`. HTTP simple en una IP de la xarxa local (p. ex. `http://192.168.x.x`) NO es considera segur: els navegadors hi desactiven `SharedArrayBuffer`. + +La discrepància `00 61 73 6d / 1f 8b 08 08` és un subsímptoma a part: als fitxers precomprimits `.wasm.gz` / `.data.gz` els falta la capçalera de resposta `Content-Encoding: gzip`, de manera que el navegador rep bytes gzip en brut en comptes de WASM descomprimit. + +**Solució**: consulta la guia de desplegament de la teva plataforma per veure la configuració exacta: + +- [Nginx →](/ca/self-hosting/nginx#la-conversio-de-word-odt-excel-a-pdf-no-funciona) +- [Apache →](/ca/self-hosting/apache#la-conversio-de-word-odt-excel-a-pdf-no-funciona) +- [AWS S3 + CloudFront →](/ca/self-hosting/aws#pas-3b-politica-de-capcaleres-de-resposta-obligatoria-per-a-libreoffice-wasm) +- [Cloudflare Pages →](/ca/self-hosting/cloudflare#fitxer-de-configuracio) (`_headers` file) +- [Netlify →](/ca/self-hosting/netlify#la-conversio-de-word-odt-excel-a-pdf-es-queda-al-55) (`netlify.toml`) +- [Vercel →](/ca/self-hosting/vercel#la-conversio-de-word-odt-excel-a-pdf-no-funciona) (`vercel.json`) +- [Hostinger →](/ca/self-hosting/hostinger#les-eines-de-libreoffice-no-funcionen) (`.htaccess`) +- [Kubernetes →](/ca/self-hosting/kubernetes#comprova-que-les-capcaleres-de-sharedarraybuffer-continuen-funcionant-ingress-gateway) +- **Docker**: ho gestiona automàticament la configuració de nginx inclosa, no cal fer res. + +**Verificació**: obre la consola de DevTools en qualsevol pàgina de BentoPDF i executa: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Si la pàgina és HTTPS o `http://localhost` I les dues capçaleres COEP/COOP són presents a totes les respostes, les dues comprovacions passen. Si ets a `http://192.168.x.x` o a un altre origen HTTP que no sigui de loopback, finalitza la connexió amb HTTPS: no hi ha cap solució només amb capçaleres. + +### Fitxers `.mjs` servits com a `application/octet-stream` + +**Símptoma**: Signa PDF, l'Emplenador de formularis i algunes altres eines mostren un visualitzador en blanc o no es carreguen. La consola del navegador informa: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Causa**: el teu servidor web o servidor intermediari invers no té cap assignació de tipus MIME per als fitxers `.mjs` (el visualitzador de PDF incorporat inclou mòduls ES amb aquesta extensió). Moltes configuracions de servidor estàndard fan servir `application/octet-stream` per a extensions no reconegudes, i els navegadors es neguen a executar-ho com a mòduls ES. + +**Solució**: consulta la guia de desplegament de la teva plataforma per veure el fragment exacte: + +- [Nginx →](/ca/self-hosting/nginx#signa-pdf-o-l-emplenador-de-formularis-mostra-un-visualitzador-en-blanc-error-mime-de-mjs) +- [Apache →](/ca/self-hosting/apache#signa-pdf-o-el-emplenador-de-formularis-mostra-un-visor-en-blanc-error-de-mime-amb-mjs) +- [AWS S3 + CloudFront →](/ca/self-hosting/aws#pas-2-compila-i-puja) (consulta `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/ca/self-hosting/kubernetes#errors-de-tipus-mime-de-mjs-iframe-en-blanc-a-signa-pdf-emplenador-de-formularis) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: es gestiona automàticament, no cal fer res. + +**Verificació**: obre DevTools → pestanya Network, troba la petició `.mjs` que falla i comprova la capçalera de resposta `Content-Type`. Hauria de ser `application/javascript`. Si encara és `application/octet-stream`, és possible que un servidor intermediari invers o un CDN exterior estigui tornant a detectar el tipus: revisa cada capa de la teva cadena de servei. + +## Configuració de WASM (components AGPL) + +BentoPDF **no inclou** al seu codi font les biblioteques de processament amb llicència AGPL, però **preconfigura URL de CDN** perquè totes les funcions funcionin de sèrie, sense configuració manual. + +::: tip Sense configuració per defecte +Des de la v2.0.0, els mòduls WASM estan preconfigurats per carregar-se des del CDN de jsDelivr mitjançant variables d'entorn. Totes les funcions avançades funcionen de seguida sense cap configuració per part de l'usuari. +::: + +| Component | Llicència | Funcions | +| --------------- | --------- | -------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Conversió d'EPUB/MOBI/FB2/XPS, extracció d'imatges i de taules | +| **Ghostscript** | AGPL-3.0 | Conversió a PDF/A, compressió, correcció d'inclinació, rasterització | +| **CoherentPDF** | AGPL-3.0 | Taula de continguts, adjunts, fusió de PDF amb marcadors | + +### Variables d'entorn per defecte + +Estan definides a `.env.production` i integrades a la compilació: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Substitució de les URL de WASM + +Pots substituir els valors per defecte en temps de compilació per a desplegaments personalitzats: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Per desactivar un mòdul del tot (cal que l'usuari el configuri manualment a Configuració avançada), posa la seva variable a una cadena buida. + +Per a l'OCR, deixa totes les variables `VITE_TESSERACT_*` buides i conserva els recursos en línia per defecte, o defineix alhora les URL de worker, core i lang per a un OCR autoallotjat o sense connexió. Si només incloses idiomes d'OCR concrets, defineix també `VITE_TESSERACT_AVAILABLE_LANGUAGES` amb els mateixos codis separats per comes perquè la interfície només ofereixi els idiomes instal·lats i les seleccions no admeses fallin amb un error descriptiu. Per obtenir PDF cercables totalment sense connexió, defineix també `VITE_OCR_FONT_BASE_URL` amb el directori intern que serveix els tipus de lletra d'OCR inclosos. + +Els usuaris també poden substituir aquests valors per defecte en qualsevol moment a **Configuració avançada** de la interfície: les substitucions de l'usuari desades al navegador tenen prioritat sobre els valors per defecte de l'entorn. + +### Desplegament aïllat de la xarxa / sense connexió + +Per a xarxes sense accés a Internet (govern, sanitat, finances, etc.). Les URL de WASM s'integren al JavaScript en **temps de compilació**; els fitxers WASM reals els baixa el **navegador de l'usuari** en temps d'execució. Per tant, has de preparar-ho tot en una màquina amb Internet i després transferir-ho a la xarxa aïllada. + +#### Script automatitzat (recomanat) + +L'script `prepare-airgap.sh` inclòs automatitza tot el procés: descarrega els paquets WASM, compila la imatge de Docker i genera un paquet autocontingut amb un script de configuració. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Això genera un directori de paquet: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Transfereix el paquet a la xarxa aïllada per USB, un repositori d'artefactes intern o un mètode aprovat. Després executa l'script de configuració inclòs: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +L'script de configuració carrega la imatge de Docker, extreu els fitxers WASM i, opcionalment, inicia el contenidor. + +**Opcions de l'script:** + +| Indicador | Descripció | Per defecte | +| ------------------------------ | --------------------------------------------------------- | ---------------------------------- | +| `--wasm-base-url ` | On s'allotjaran els WASM internament | _(obligatori, es demana si falta)_ | +| `--image-name ` | Etiqueta de la imatge de Docker | `bentopdf` | +| `--output-dir ` | Directori de sortida del paquet | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Activa el mode simple | desactivat | +| `--base-url ` | URL base del subdirectori (p. ex. `/pdf/`) | `/` | +| `--language ` | Idioma per defecte de la interfície (p. ex. `fr`, `de`) | _(cap)_ | +| `--brand-name ` | Nom de marca personalitzat | _(cap)_ | +| `--brand-logo ` | Ruta del logotip relativa a `public/` | _(cap)_ | +| `--footer-text ` | Text personalitzat del peu de pàgina | _(cap)_ | +| `--ocr-languages ` | Idiomes d'OCR a incloure, separats per comes | `eng` | +| `--list-ocr-languages` | Mostra els codis i noms d'OCR admesos i surt | desactivat | +| `--search-ocr-language ` | Cerca codis d'OCR per nom o abreviatura | desactivat | +| `--dockerfile ` | Dockerfile que s'utilitzarà | `Dockerfile` | +| `--skip-docker` | Omet la compilació i l'exportació de Docker | desactivat | +| `--skip-wasm` | Omet la baixada de WASM (reutilitza els `.tgz` existents) | desactivat | + +El mode interactiu també accepta `list` per mostrar la llista completa de codis de Tesseract admesos i `search ` per trobar coincidències, com `search german` o `search chi`. + +::: warning Requisit del mateix origen +Els fitxers WASM s'han de servir des del **mateix origen** que l'aplicació BentoPDF. Els Web Workers fan servir `importScripts()`, que no pot carregar scripts d'un altre origen. Per exemple, si BentoPDF s'executa a `https://internal.example.com`, l'URL base de WASM també ha de ser `https://internal.example.com/wasm`. +::: + +#### Passos manuals + +
+Si prefereixes fer-ho manualment sense l'script + +**Pas 1: baixa els paquets WASM i d'OCR** (en una màquina amb Internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Pas 2: compila la imatge de Docker amb les URL internes** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Pas 3: exporta la imatge de Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Pas 4: transfereix-ho a la xarxa aïllada** + +Copia-ho per USB, un repositori d'artefactes intern o un mètode de transferència aprovat: + +- `bentopdf.tar`: la imatge de Docker +- Els cinc paquets `.tgz` de WASM/OCR del pas 1 +- El directori `tesseract-langdata/` del pas 1 +- El directori `ocr-fonts/` del pas 1 + +**Pas 5: configura-ho dins de la xarxa aïllada** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Assegura't que els fitxers són accessibles a les URL que has configurat al pas 2, incloses `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` i `.../ocr/fonts`. + +
+ +::: info Compiles des del codi font en comptes de fer servir Docker? +Defineix les variables a `.env.production` abans d'executar `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Allotja el teu propi servidor intermediari de WASM + +Si necessites servir fitxers WASM AGPL amb les capçaleres CORS adequades, pots desplegar un servidor intermediari senzill. Consulta la [guia del servidor intermediari de WASM de Cloudflare](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) per veure una implementació d'exemple. + +::: tip Per què separat? +Aquesta separació garanteix: + +- Un compliment legal clar per als usuaris comercials +- El nucli de BentoPDF es manté sota la seva llicència dual (AGPL-3.0 / comercial) +- Els fitxers WASM es carreguen en temps d'execució, no s'inclouen al codi font + ::: + +## Requisits del sistema + +| Requisit | Mínim | +| -------------- | --------------------------------- | +| Emmagatzematge | ~100 MB (nucli sense mòduls AGPL) | +| RAM | 512 MB | +| CPU | Qualsevol processador modern | + +::: tip +BentoPDF és un lloc estàtic: no cal cap base de dades ni servidor de backend! +::: diff --git a/docs/ca/self-hosting/kubernetes.md b/docs/ca/self-hosting/kubernetes.md new file mode 100644 index 00000000..1af0cedd --- /dev/null +++ b/docs/ca/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Desplega amb Kubernetes + +Kubernetes pot ser excessiu per a un lloc estàtic, però pot encaixar molt bé si ja estandarditzes amb Helm + GitOps. + +> [!IMPORTANT] +> **Capçaleres necessàries per a la conversió de fitxers d'Office** +> +> Les eines basades en LibreOffice (conversió de Word, Excel i PowerPoint) requereixen aquestes capçaleres HTTP per a la compatibilitat amb `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Les imatges nginx oficials de BentoPDF inclouen aquestes capçaleres. A Kubernetes, **els controladors d'Ingress/Gateway també són servidors intermediaris inversos**, així que assegura't que aquestes capçaleres es conservin (o afegeix-les a l'edge). + +## Requisits previs + +- Clúster de Kubernetes +- Helm v3 +- Una imatge nginx de BentoPDF (per exemple, `ghcr.io/alam00000/bentopdf:`) que serveixi pel **port 8080** + +## Desplega amb Helm + +### Instal·la des d'aquest repositori (chart local) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Instal·la des de GHCR (chart OCI) + +Si el chart es publica a GHCR com a artefacte OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Exposa'l + +### Port-forward (prova ràpida) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (opcional) + +Activa l'Ingress (exemple per a nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (opcional) + +Aquest chart admet `Gateway` + `HTTPRoute` de Gateway API. + +Exemple (operador de Gateway API de Cloudflare): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Comprova que les capçaleres de SharedArrayBuffer continuen funcionant (Ingress/Gateway) + +### Què hauria de passar + +La configuració de nginx de BentoPDF estableix les capçaleres de resposta necessàries. La majoria de controladors d'Ingress/Gateway **deixen passar les capçaleres de resposta de l'origen sense canvis**. + +### Què ho pot trencar + +- Una política del controlador o de l'edge que **sobreescrigui** o **elimini** capçaleres de resposta +- Un middleware de "capçaleres de seguretat" que estableixi valors de COOP/COEP diferents + +### Com verificar-ho + +Executa això contra el teu punt d'accés públic: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Hauries de veure: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Si el teu controlador d'Ingress no les conserva + +Afegeix les capçaleres a l'edge (depèn del controlador). Exemple per a **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Errors de tipus MIME de `.mjs` (iframe en blanc a Signa PDF / Emplenador de formularis) + +Si la consola del navegador mostra `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` en una petició `.mjs`, un controlador d'Ingress/Gateway situat davant del nginx de BentoPDF està substituint la capçalera `Content-Type` de l'origen per `application/octet-stream`. + +El nginx de la imatge de BentoPDF ja serveix `.mjs` com a `application/javascript`. La solució és evitar que el controlador l'elimini o la substitueixi. Per a nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +O utilitza un filtre `ResponseHeaderModifier` a Gateway API per establir `Content-Type: application/javascript` per a les rutes `.mjs`. Verifica-ho amb DevTools → pestanya Network: la petició `.mjs` que fallava ara hauria de mostrar `content-type: application/javascript`. + +### Si utilitzes Gateway API i vols forçar l'addició de capçaleres + +Gateway API admet un filtre `ResponseHeaderModifier`. Pots afegir-lo a `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +La compatibilitat amb filtres concrets depèn del teu controlador de Gateway; si un filtre s'ignora, afegeix les capçaleres a la capa d'edge o de controlador. + +## Desactiva eines concretes + +Utilitza un ConfigMap per desactivar eines en temps d'execució sense reconstruir la imatge: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Munta'l al directori servit: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Els identificadors d'eina són l'URL de la pàgina sense `.html`: obre qualsevol eina i mira l'URL (per exemple, `edit-pdf`, `merge-pdf`, `compress-pdf`). Les eines desactivades s'amaguen de la pàgina d'inici, la cerca, les dreceres, el constructor de fluxos de treball i l'accés directe per URL. Consulta la [guia de Docker](/ca/self-hosting/docker#desactivar-eines-concretes) per veure la llista completa d'opcions. diff --git a/docs/ca/self-hosting/netlify.md b/docs/ca/self-hosting/netlify.md new file mode 100644 index 00000000..40fb3d51 --- /dev/null +++ b/docs/ca/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Desplega a Netlify + +[Netlify](https://netlify.com) ofereix un excel·lent allotjament de llocs estàtics amb un nivell gratuït generós. + +## Desplegament amb un clic + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Desplegament manual + +### Pas 1: connecta el repositori + +1. Inicia sessió a [Netlify](https://app.netlify.com) +2. Fes clic a "Add new site" → "Import an existing project" +3. Connecta el teu compte de GitHub +4. Selecciona el teu fork de BentoPDF + +### Pas 2: configura la compilació + +| Paràmetre | Valor | +| ----------------------- | --------------- | +| Ordre de compilació | `npm run build` | +| Directori de publicació | `dist` | +| Versió de Node | 18+ | + +### Pas 3: desplega + +Fes clic a "Deploy site" i espera que acabi la compilació. + +## Fitxer de configuració + +Crea `netlify.toml` a l'arrel del projecte: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Important +Les capçaleres `Cross-Origin-Embedder-Policy` i `Cross-Origin-Opener-Policy` són necessàries per a les conversions de Word/ODT/Excel/PowerPoint a PDF. Sense elles, `SharedArrayBuffer` no està disponible i el motor WASM de LibreOffice no es podrà inicialitzar. + +Les capçaleres `Content-Encoding: gzip` als fitxers `.wasm.gz` i `.data.gz` indiquen al navegador que els descomprimeixi automàticament. Sense elles, el navegador rep bytes gzip en brut i la compilació de WASM falla. +::: + +## Variables d'entorn + +Defineix-les a Site settings → Environment variables: + +| Variable | Descripció | +| ----------------------- | ------------------------------------------------------------------- | +| `SIMPLE_MODE` | Posa-ho a `true` per a una compilació mínima | +| `VITE_BRAND_NAME` | Nom de marca personalitzat (substitueix "BentoPDF") | +| `VITE_BRAND_LOGO` | Ruta del logotip relativa a `public/` (p. ex. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Text personalitzat del peu de pàgina o dels drets d'autor | +| `VITE_DEFAULT_LANGUAGE` | Idioma per defecte de la interfície (p. ex. `fr`, `de`, `es`) | + +## Domini personalitzat + +1. Ves a Site settings → Domain management +2. Fes clic a "Add custom domain" +3. Segueix les instruccions de configuració del DNS + +## Fitxers multimèdia grans + +Per als fitxers WASM grans, considera activar [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Resolució de problemes + +### La conversió de Word/ODT/Excel a PDF es queda al 55 % + +Si les conversions de documents es queden penjades al 55 %, obre la consola de DevTools i comprova: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Si `crossOriginIsolated` és `false`, les capçaleres COEP/COOP del teu `netlify.toml` no s'estan aplicant. Assegura't que el fitxer és a l'arrel del projecte i torna a desplegar. + +Si veus `expected magic word 00 61 73 6d, found 1f 8b 08 08` a la consola, als fitxers `.wasm.gz` els falten les capçaleres `Content-Encoding: gzip`. Assegura't que els blocs `[[headers]]` de `soffice.wasm.gz` i `soffice.data.gz` són al teu `netlify.toml`. + +### La compilació falla + +Comprova la compatibilitat de la versió de Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Càrrega inicial lenta + +Activa l'optimització d'actius a Site settings → Build & deploy → Asset optimization. diff --git a/docs/ca/self-hosting/nginx.md b/docs/ca/self-hosting/nginx.md new file mode 100644 index 00000000..d3e3f844 --- /dev/null +++ b/docs/ca/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Desplega amb Nginx + +Allotja BentoPDF al teu propi servidor amb Nginx. + +## Requisits previs + +- Servidor Ubuntu/Debian +- Nginx instal·lat +- Certificat SSL (recomanat: Let's Encrypt) + +## Pas 1: compila el projecte + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Per personalitzar la marca, defineix variables d'entorn abans de compilar: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Pas 2: copia els fitxers + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Pas 3: configuració de Nginx + +Crea `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Pas 4: activa el lloc + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Pas 5: SSL amb Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Desplegament en un subdirectori + +Per allotjar-lo a `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Compila amb: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Ajust del rendiment + +Afegeix a `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Resolució de problemes + +### WASM no es carrega + +Assegura't que el tipus MIME està definit: + +```nginx +types { + application/wasm wasm; +} +``` + +### Signa PDF o l'Emplenador de formularis mostra un visualitzador en blanc (error MIME de `.mjs`) + +Si la consola del navegador mostra: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...i la petició que falla acaba en `.mjs`, al teu nginx li falta l'assignació `.mjs → application/javascript`. El visualitzador de PDF incorporat (que fan servir Signa PDF, l'Emplenador de formularis i algunes altres eines) inclou fitxers de mòdul ES amb extensió `.mjs`, i el `mime.types` estàndard de nginx no els inclou per defecte. + +Per solucionar-ho, afegeix `mjs` a la línia existent d'`application/javascript` de `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> NO afegeixis una _segona_ línia `application/javascript`: nginx analitza `mime.types` línia per línia i només guanya una assignació de tipus a extensió, així que una segona línia s'ignora en silenci en algunes versions. Edita la línia existent per afegir `mjs` al costat de `js`. + +O sobreescriu-ho localment dins del bloc server (sense editar el fitxer global): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Torna a carregar nginx després del canvi: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Per confirmar-ho: a DevTools del navegador → pestanya Network, troba la petició `.mjs` que fallava i comprova la capçalera de resposta `Content-Type`. Ara hauria de ser `application/javascript`, no `application/octet-stream`. + +### La conversió de Word/ODT/Excel a PDF no funciona + +LibreOffice WASM requereix `SharedArrayBuffer`, que necessita les capçaleres `Cross-Origin-Embedder-Policy` i `Cross-Origin-Opener-Policy`. També necessita un context segur, així que `http://localhost` funciona per a proves locals, però `http://192.168.x.x` o altres IP de la xarxa local normalment requereixen HTTPS. Tingues en compte que les directives `add_header` de nginx dins d'un bloc `location` **sobreescriuen** les directives `add_header` del nivell de servidor: no es combinen. Cada bloc `location` amb el seu propi `add_header` ha d'incloure les capçaleres COEP/COOP. + +Verifica-ho amb: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Si fas servir un servidor intermediari invers davant de nginx, assegura't que conservi aquestes capçaleres. + +### 502 Bad Gateway + +Comprova els registres d'errors de Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/ca/self-hosting/vercel.md b/docs/ca/self-hosting/vercel.md new file mode 100644 index 00000000..4777752f --- /dev/null +++ b/docs/ca/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Desplega a Vercel + +[Vercel](https://vercel.com) ofereix l'experiència de desplegament més senzilla per a llocs estàtics. + +## Desplegament amb un clic + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Desplegament manual + +### Pas 1: fes un fork del repositori + +Fes un fork de [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) al teu compte de GitHub. + +### Pas 2: importa'l a Vercel + +1. Ves a [vercel.com/new](https://vercel.com/new) +2. Selecciona el repositori del teu fork +3. Configura el projecte: + +| Paràmetre | Valor | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Pas 3: variables d'entorn (opcional) + +Afegeix-les si cal: + +| Variable | Descripció | +| ----------------------- | ------------------------------------------------------------------- | +| `SIMPLE_MODE` | Posa-ho a `true` per a una interfície mínima | +| `VITE_BRAND_NAME` | Nom de marca personalitzat (substitueix "BentoPDF") | +| `VITE_BRAND_LOGO` | Ruta del logotip relativa a `public/` (p. ex. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Text personalitzat del peu de pàgina o dels drets d'autor | +| `VITE_DEFAULT_LANGUAGE` | Idioma per defecte de la interfície (p. ex. `fr`, `de`, `es`) | + +### Pas 4: desplega + +Fes clic a "Deploy" i espera que s'acabi la compilació. + +## Domini personalitzat + +1. Ves a la configuració del projecte +2. Navega a "Domains" +3. Afegeix el teu domini personalitzat +4. Configura el DNS segons les instruccions + +## Limitacions + +::: warning Fitxers grans +Les funcions serverless de Vercel tenen un límit de 50 MB. Com que BentoPDF és un lloc estàtic, això no hauria d'afectar-te, però els mòduls WASM són grans (~100 MB en total). Assegura't que es serveixin des de la carpeta `/public`. +::: + +## Resolució de problemes + +### Temps d'espera de la compilació esgotat + +Si les compilacions s'esgoten, prova això: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 en actualitzar la pàgina + +Afegeix un `vercel.json` per a l'encaminament SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### La conversió de Word/ODT/Excel a PDF no funciona + +Les conversions de LibreOffice WASM requereixen `SharedArrayBuffer`, que necessita aquestes capçaleres de resposta a totes les pàgines: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Els fitxers precomprimits `.wasm.gz` i `.data.gz` també necessiten `Content-Encoding: gzip` perquè el navegador els descomprimeixi. + +Afegeix-ho al teu `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Per verificar-ho, obre la consola de DevTools i executa `console.log(window.crossOriginIsolated)`: hauria de retornar `true`. diff --git a/docs/ca/tools/add-attachments.md b/docs/ca/tools/add-attachments.md new file mode 100644 index 00000000..a05c41e8 --- /dev/null +++ b/docs/ca/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Afegeix fitxers adjunts +description: Incrusta fitxers de qualsevol tipus en un PDF, a nivell de document o adjunts a pàgines concretes. +--- + +# Afegeix fitxers adjunts + +Incrusta un o més fitxers directament dins d'un document PDF. Els adjunts es poden afegir a nivell de document (visibles al tauler d'adjunts de qualsevol lector de PDF) o vincular a pàgines concretes. + +## Com funciona + +1. Puja el PDF al qual vols adjuntar fitxers. +2. Fes servir la zona de càrrega d'adjunts per seleccionar els fitxers que vols incrustar (de qualsevol tipus). +3. Tria el nivell de l'adjunt: **Document** (per defecte) o **Pàgina**. +4. Si tries el nivell de pàgina, introdueix un interval de pàgines (per exemple, `1-3` o `5`). +5. Fes clic al botó de processar. El PDF modificat es baixa amb els fitxers incrustats. + +## Característiques + +- Adjunta qualsevol tipus de fitxer: imatges, fulls de càlcul, arxius comprimits, executables, el que sigui +- Adjunts a nivell de document o de pàgina +- Es poden adjuntar diversos fitxers en una sola operació +- Mostra els noms i les mides de tots els adjunts seleccionats +- El resultat conserva el contingut original del PDF amb els fitxers incrustats afegits + +## Opcions + +| Opció | Descripció | +| ---------------------- | ----------------------------------------------------------------------------- | +| **Nivell de document** | Adjunta els fitxers al PDF en conjunt, accessibles des del tauler d'adjunts | +| **Nivell de pàgina** | Adjunta els fitxers a pàgines concretes, indicades amb un interval de pàgines | + +## Casos d'ús + +- Incloure dades d'origen (fitxers Excel, CSV) amb un informe en PDF +- Adjuntar les imatges originals a un PDF de portfoli fotogràfic +- Incrustar documents justificatius dins d'un contracte o una proposta +- Afegir material complementari a pàgines concretes d'un manual de formació + +## Consells + +- Els adjunts a nivell de document són els més compatibles amb els lectors de PDF. És possible que els adjunts a nivell de pàgina no es vegin en tots els visualitzadors. +- No hi ha cap límit de mida per als adjunts, però els fitxers incrustats molt grans fan créixer el PDF en la mateixa proporció. + +## Eines relacionades + +- [Extreu fitxers adjunts](./extract-attachments) +- [Edita fitxers adjunts](./edit-attachments) +- [Fusiona PDF](./merge-pdf) diff --git a/docs/ca/tools/add-blank-page.md b/docs/ca/tools/add-blank-page.md new file mode 100644 index 00000000..0a21fa36 --- /dev/null +++ b/docs/ca/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Afegeix una pàgina en blanc +description: Insereix una o més pàgines en blanc a qualsevol posició d'un document PDF. +--- + +# Afegeix una pàgina en blanc + +Insereix pàgines buides en un PDF a la posició que indiquis. Tu decideixes on van les pàgines en blanc i quantes n'afegeixes. + +## Com funciona + +1. Puja un fitxer PDF. L'eina mostra el nombre de pàgines. +2. Introdueix la **posició** on s'han d'inserir les pàgines en blanc. Utilitza `0` per inserir-les al principi de tot, o el total de pàgines per afegir-les al final. +3. Introdueix el **nombre** de pàgines en blanc que vols afegir (per defecte, 1). +4. Fes clic al botó de processar. El PDF modificat es baixa amb les pàgines en blanc inserides. + +## Característiques + +- Insereix a qualsevol posició: al principi, al mig o al final del document +- Afegeix diverses pàgines en blanc en una sola operació +- La indicació de la posició s'actualitza dinàmicament segons el nombre de pàgines del PDF pujat +- Pàgines en blanc de mida A4 estàndard + +## Casos d'ús + +- Afegir una pàgina separadora en blanc entre les seccions d'un document recopilat +- Inserir pàgines en blanc per alinear la impressió a doble cara +- Deixar espai per a notes manuscrites en una guia d'estudi impresa +- Completar un document per arribar a un nombre mínim de pàgines + +## Consells + +- La posició `0` insereix abans de la primera pàgina. Una posició igual al total de pàgines afegeix després de l'última pàgina. +- Si has d'inserir contingut (no només pàgines en blanc) en una posició concreta, utilitza l'[Eina multifunció de PDF](./pdf-multi-tool) per inserir un altre PDF després d'una pàgina determinada. + +## Eines relacionades + +- [Organitza i duplica](./organize-pdf) +- [Eina multifunció de PDF](./pdf-multi-tool) +- [Fusiona PDF](./merge-pdf) diff --git a/docs/ca/tools/add-page-labels.md b/docs/ca/tools/add-page-labels.md new file mode 100644 index 00000000..d7d3e103 --- /dev/null +++ b/docs/ca/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Afegeix etiquetes de pàgina +description: Afegeix etiquetes de pàgina al PDF amb xifres romanes, prefixos de lletres, numeració personalitzada i diverses regles per document. +--- + +# Afegeix etiquetes de pàgina + +Les etiquetes de pàgina controlen com es mostren els números de pàgina als visualitzadors de PDF (el número que apareix a la barra d'eines, no el imprès a la pàgina). Aquesta eina et permet assignar diferents esquemes d'etiquetatge a diferents intervals de pàgines: xifres romanes per als preliminars, números decimals per al cos, apèndixs amb lletres i més. + +## Com funciona + +1. Puja el fitxer PDF. +2. Apareix el tauler d'opcions amb una regla d'etiqueta per defecte. +3. Configura cada regla amb un interval de pàgines, un estil, un prefix opcional i un valor inicial. +4. Fes clic a **Afegeix una regla** per crear regles addicionals per a altres seccions. +5. Fes clic a **Afegeix etiquetes de pàgina** per aplicar totes les regles i baixar el resultat. + +## Opcions + +Cada regla d'etiqueta té aquests paràmetres: + +- **Interval de pàgines**: les pàgines a les quals s'aplica la regla. Deixa-ho buit per a totes les pàgines. Admet intervals com `1-4`, `7`, `odd` o `1-9,30-40`. +- **Estil d'etiqueta**: àrab decimal, romà en minúscula (i, ii, iii), romà en majúscula (I, II, III), lletres en minúscula (a, b, c), lletres en majúscula (A, B, C) o sense etiqueta (només prefix). +- **Prefix de l'etiqueta**: text opcional que s'afegeix davant de cada etiqueta, com ara "A-" per crear etiquetes com A-1, A-2, A-3. +- **Valor inicial**: el número des del qual comença el recompte. Per defecte és 1. Posa 0 per a una numeració que comenci per zero. +- **Continua la numeració entre intervals no contigus**: activa-ho quan una regla afecta pàgines no contigües (com `1-9,30-40` o `odd`) i vols que la numeració continuï de manera seqüencial. +- **Elimina les etiquetes de pàgina existents**: marcat per defecte. Esborra les etiquetes anteriors abans d'aplicar les regles noves. + +## Característiques + +- Diverses regles d'etiqueta per document per a esquemes de numeració complexos +- Sis estils d'etiqueta que cobreixen tots els sistemes de numeració estàndard +- Prefixos personalitzats per etiquetar per seccions +- Compatibilitat amb intervals no contigus amb numeració progressiva +- Opció de conservar o eliminar les etiquetes existents + +## Casos d'ús + +- Posar etiquetes amb xifres romanes (i, ii, iii) al prefaci d'un llibre i etiquetes decimals al text principal +- Etiquetar les pàgines d'un apèndix amb prefixos de lletres com "A-1", "A-2", "B-1", "B-2" +- Corregir les etiquetes de pàgina d'un document escanejat en què els números de pàgina físics no coincideixen amb l'ordre de pàgines del PDF +- Afegir una numeració que comenci per zero a documents tècnics + +## Consells + +- Les etiquetes de pàgina són metadades que els visualitzadors de PDF mostren a la barra de navegació. No s'imprimeixen a la pàgina. Per a números visibles, utilitza [Números de pàgina](./page-numbers). +- Aquesta eina requereix que CoherentPDF (CPDF) estigui configurat a la configuració de WASM. Si no ho està, se't demanarà que el configuris. + +## Eines relacionades + +- [Números de pàgina](./page-numbers) +- [Numeració Bates](./bates-numbering) +- [Edita els marcadors](./bookmark) diff --git a/docs/ca/tools/add-stamps.md b/docs/ca/tools/add-stamps.md new file mode 100644 index 00000000..f396f3ae --- /dev/null +++ b/docs/ca/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Afegeix segells +description: Afegeix segells d'imatge a les pàgines del PDF amb una barra d'eines d'anotació integrada i atribució amb nom d'usuari. +--- + +# Afegeix segells + +Col·loca segells d'imatge a les pàgines del PDF amb un visualitzador incrustat que inclou una barra d'eines d'anotació de segells. Els segells poden incloure el teu nom com a atribució, cosa que és útil per a fluxos d'aprovació, processos de revisió i marcatge de documents. + +## Com funciona + +1. Introdueix el teu nom al camp **Nom d'usuari del segell**. Aquest nom apareixerà als segells que creïs. +2. Puja el fitxer PDF fent-hi clic o arrossegant-lo a la zona de càrrega. +3. S'obre l'editor de segells amb el document carregat en un visualitzador. +4. Utilitza l'eina de segell d'imatge de la barra d'eines per seleccionar i col·locar segells a qualsevol pàgina. +5. Posiciona i redimensiona els segells segons calgui. +6. Fes clic a **Desa el PDF amb segells** per baixar el resultat. + +## Característiques + +- Visualitzador de PDF integrat amb una barra d'eines d'anotació específica per a segells +- Atribució amb nom d'usuari als segells creats +- Col·locació de segells d'imatge a qualsevol pàgina +- Posicionament i redimensionament arrossegant +- Mida del visualitzador automàtica segons la proporció d'aspecte de la pàgina +- Visualització del fitxer amb el nom i la mida + +## Casos d'ús + +- Afegir segells d'imatge "APROVAT" o "REVISAT" a documents en un flux de revisió +- Col·locar imatges del segell de l'empresa o d'un notari en documents oficials +- Marcar pàgines amb segells "REBUT" que inclouen el nom del revisor +- Afegir segells de control de qualitat als informes d'inspecció + +## Consells + +- Defineix el nom d'usuari del segell abans de pujar el PDF. El nom d'usuari s'incrusta a les metadades del segell. +- El visualitzador ajusta l'alçada segons la proporció d'aspecte de la primera pàgina del PDF per oferir una visualització òptima. +- Per a marques d'aigua de text en comptes de segells d'imatge, utilitza l'eina [Afegeix una marca d'aigua](./add-watermark). + +## Eines relacionades + +- [Signa PDF](./sign-pdf) +- [Afegeix una marca d'aigua](./add-watermark) +- [Editor de PDF](./edit-pdf) diff --git a/docs/ca/tools/add-watermark.md b/docs/ca/tools/add-watermark.md new file mode 100644 index 00000000..652ce01c --- /dev/null +++ b/docs/ca/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Afegeix una marca d'aigua +description: Estampa marques d'aigua de text o d'imatge a les pàgines del PDF amb un editor visual d'arrossegar i deixar anar i vista prèvia en directe. +--- + +# Afegeix una marca d'aigua + +Afegeix marques d'aigua de text o d'imatge a les pàgines del PDF amb un editor visual. Pots posicionar la marca d'aigua arrossegant-la directament sobre la vista prèvia, redimensionar-la amb els tiradors de les cantonades i configurar l'opacitat, la rotació, el tipus de lletra i el color. Cada pàgina pot tenir la seva pròpia posició de marca d'aigua, o pots aplicar la mateixa marca a totes les pàgines alhora. + +## Com funciona + +1. Puja el fitxer PDF. +2. S'obre l'editor amb una vista prèvia en directe de la primera pàgina i una superposició de marca d'aigua que es pot arrossegar. +3. Tria entre el mode de marca d'aigua de **Text** o d'**Imatge** amb els botons commutadors. +4. Configura els paràmetres de la marca d'aigua al tauler lateral. +5. Arrossega la marca d'aigua sobre la vista prèvia per posicionar-la exactament on vulguis. Utilitza els tiradors de les cantonades per redimensionar-la. +6. Navega entre pàgines per definir marques d'aigua per pàgina, o deixa marcat **Aplica a totes les pàgines**. +7. Fes clic a **Afegeix una marca d'aigua** per processar i baixar. + +## Opcions + +**Paràmetres de la marca d'aigua de text:** + +- **Text**: el text de la marca d'aigua (per exemple, "CONFIDENCIAL", "ESBORRANY"). +- **Mida de la lletra**: de 10 a 200 punts. Per defecte és 72. +- **Color**: qualsevol color amb el selector de color. +- **Opacitat**: controla la transparència, de totalment transparent a totalment opac. +- **Rotació**: gira el text de la marca d'aigua de -180 a 180 graus. + +**Paràmetres de la marca d'aigua d'imatge:** + +- **Càrrega d'imatge**: puja un fitxer PNG, JPG o d'un altre format d'imatge per fer-lo servir com a marca d'aigua. +- **Opacitat**: controla la transparència de la imatge. +- **Escala**: redimensiona la marca d'aigua d'imatge. + +**Paràmetres de disposició:** + +- **Única**: una marca d'aigua per pàgina, posicionada arrossegant-la o amb les posicions predefinides. +- **En mosaic**: repeteix la marca d'aigua per tota la pàgina en una quadrícula diagonal que segueix l'angle de rotació, de manera que la marca cobreix el document d'extrem a extrem. +- **Separació horitzontal**: espai entre les rajoles al llarg de la direcció del text, com a percentatge de l'amplada de la marca d'aigua (només en mode mosaic). +- **Separació vertical**: espai entre les files de rajoles, com a percentatge de l'alçada de la marca d'aigua (només en mode mosaic). + +**Paràmetres generals:** + +- **Aplica a totes les pàgines**: si està marcat, la mateixa marca d'aigua s'aplica a cada pàgina. Desmarca-ho per definir marques d'aigua individuals per pàgina. +- **Interval de pàgines**: indica quines pàgines reben la marca d'aigua (per exemple, "1-3, 5, 7-9" o "all"). + +## Característiques + +- Posicionament visual arrossegant sobre una vista prèvia en directe del PDF +- Marca d'aigua redimensionable amb tiradors a les cantonades +- Modes de marca d'aigua de text i d'imatge +- Disposició única o en mosaic (repetida) a tota la pàgina amb espaiat ajustable +- Aplicació de la marca d'aigua per pàgina o global +- Navegació pàgina per pàgina a la vista prèvia +- Controls d'opacitat i rotació +- Filtratge per interval de pàgines + +## Casos d'ús + +- Marcar documents en esborrany amb "ESBORRANY" abans de fer-los circular per revisar +- Afegir marques d'aigua "CONFIDENCIAL" a informes financers sensibles +- Donar identitat de marca als documents amb una marca d'aigua amb el logotip de l'empresa +- Estampar "MOSTRA" a la documentació de productes compartida amb clients potencials +- Afegir avisos de drets d'autor als materials en PDF que es distribueixen + +## Consells + +- Per a marques d'aigua diagonals a tota la pàgina, defineix una rotació d'uns 45 graus i augmenta la mida de la lletra. +- El mode en mosaic fa que un document sigui molt més difícil de reutilitzar després de retallar-lo, ja que eliminar una marca deixa desenes d'altres. Redueix l'opacitat quan facis servir mosaic perquè el text de sota continuï sent llegible. +- Les marques d'aigua d'imatge amb fons transparent (format PNG) es combinen de manera més natural amb el contingut del document. +- Si necessites un text de marca d'aigua diferent a pàgines diferents, desmarca "Aplica a totes les pàgines" i navega pàgina per pàgina. + +## Eines relacionades + +- [Capçalera i peu de pàgina](./header-footer) +- [Afegeix segells](./add-stamps) +- [Numeració Bates](./bates-numbering) +- [Signa PDF](./sign-pdf) diff --git a/docs/ca/tools/adjust-colors.md b/docs/ca/tools/adjust-colors.md new file mode 100644 index 00000000..691c37c9 --- /dev/null +++ b/docs/ca/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Ajusta els colors +description: Ajusta amb precisió la brillantor, el contrast, la saturació, el to, la temperatura, el matís, la gamma i el sèpia del PDF. +--- + +# Ajusta els colors + +Un conjunt complet d'eines de gradació de color per a PDF. Ajusta vuit paràmetres independents (brillantor, contrast, saturació, canvi de to, temperatura, matís, gamma i sèpia) amb una vista prèvia en directe que s'actualitza a mesura que mous cada control lliscant. + +## Com funciona + +1. Puja el fitxer PDF. +2. S'obre l'editor amb una vista prèvia de la primera pàgina i un tauler de configuració del color. +3. Mou els controls lliscants per ajustar cada paràmetre de color. La vista prèvia s'actualitza en temps real. +4. Fes clic a **Restableix** per tornar tots els controls lliscants a la posició per defecte. +5. Fes clic a **Aplica** per processar totes les pàgines i baixar el PDF ajustat. + +## Opcions + +- **Brillantor**: il·lumina o enfosqueix tota la pàgina (de -100 a +100). +- **Contrast**: augmenta o redueix la diferència entre les zones clares i fosques (de -100 a +100). +- **Saturació**: augmenta o redueix la intensitat del color (de -100 a +100). Si la poses a -100, el resultat és en escala de grisos. +- **Canvi de to**: gira la roda de colors per desplaçar tots els colors de manera uniforme. +- **Temperatura**: desplaça els colors cap a tons més càlids (groc/taronja) o més freds (blau). +- **Matís**: afegeix una dominant verda o magenta. +- **Gamma**: ajusta la brillantor dels tons mitjans amb una corba gamma. Els valors inferiors a 1,0 enfosqueixen els tons mitjans; els valors superiors a 1,0 els il·luminen. +- **Sèpia**: aplica un efecte clàssic de to sèpia. Com més alt és el valor, més intens és el to marró. + +## Característiques + +- Vuit paràmetres de color que es poden ajustar de manera independent +- Vista prèvia en directe que respon immediatament als canvis dels controls lliscants +- Botó de restabliment per tornar ràpidament als valors per defecte +- Processa totes les pàgines del document +- Funciona amb qualsevol contingut del PDF (text, imatges, gràfics) + +## Casos d'ús + +- Il·luminar un escaneig fosc o corregir pàgines sobreexposades +- Desaturar un document de colors per reduir el consum de tinta abans d'imprimir +- Aplicar un to sèpia per donar un aspecte antic a certificats o guardons +- Corregir la temperatura de color de les fotos incrustades en un PDF +- Augmentar el contrast de documents escanejats esvaïts o de baixa qualitat + +## Consells + +- Per fer una conversió ràpida a escala de grisos, arrossega el control de saturació fins a -100. +- El control de gamma és especialment útil per millorar la llegibilitat de documents escanejats en què els tons mitjans són massa foscos o massa clars. +- Igual que les altres eines d'efectes d'imatge, aquesta rasteritza cada pàgina. El resultat serà basat en imatges, de manera que el text no es podrà seleccionar. + +## Eines relacionades + +- [Inverteix els colors](./invert-colors) +- [Efecte d'escàner](./scanner-effect) +- [Color de fons](./background-color) diff --git a/docs/ca/tools/alternate-merge.md b/docs/ca/tools/alternate-merge.md new file mode 100644 index 00000000..ad3c6667 --- /dev/null +++ b/docs/ca/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alterna i barreja pàgines +description: Fusiona PDF intercalant les pàgines de cada fitxer en ordre alternat, conservant els marcadors. +--- + +# Alterna i barreja pàgines + +Intercala les pàgines de diversos fitxers PDF perquè les pàgines s'alternin entre documents. És l'eina que necessites quan una fusió estàndard només enganxaria els fitxers un darrere l'altre, però tu vols la pàgina 1 del fitxer A, després la pàgina 1 del fitxer B, després la pàgina 2 del fitxer A, i així successivament. + +## Com funciona + +1. Puja almenys dos fitxers PDF amb la zona de càrrega. +2. L'eina mostra cada fitxer amb el seu nombre de pàgines i la seva mida. +3. Arrossega els tiradors per reordenar quin fitxer aporta les pàgines primer en la seqüència d'intercalat. +4. Fes clic a **Barreja pàgines** per generar el resultat intercalat. +5. El resultat es baixa com a `alternated-mixed.pdf`. + +## Característiques + +- Intercala pàgines de qualsevol nombre de PDF (mínim dos) +- Reordenació dels fitxers arrossegant-los per controlar la prioritat de l'intercalat +- Conserva els marcadors dels documents d'origen +- Mostra el nombre de pàgines i la mida de cada fitxer pujat +- Es processa en un web worker dedicat perquè la interfície respongui bé + +## Casos d'ús + +- Tornar a muntar escanejos a doble cara en què les pàgines senars i parelles es van escanejar per separat +- Combinar fulls de preguntes amb les claus de respostes perquè cada pregunta vagi seguida de la seva resposta +- Fusionar documents en dos idiomes pàgina per pàgina (per exemple, l'anglès en una cara i la traducció a la següent) +- Intercalar escanejos de l'anvers i el revers fets amb un escàner d'una sola cara + +## Consells + +- Si els PDF d'origen tenen un nombre de pàgines diferent, les pàgines del document més curt s'acabaran primer i les pàgines restants del document més llarg apareixeran al final. +- L'ordre dels fitxers importa: el primer fitxer de la llista aporta la primera pàgina del resultat. Arrossega'ls per reordenar-los si cal. + +## Eines relacionades + +- [Fusiona PDF](./merge-pdf) +- [Organitza i duplica](./organize-pdf) +- [Divideix PDF](./split-pdf) diff --git a/docs/ca/tools/background-color.md b/docs/ca/tools/background-color.md new file mode 100644 index 00000000..b87e18ae --- /dev/null +++ b/docs/ca/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Color de fons +description: Canvia el color de fons de totes les pàgines del PDF conservant tot el contingut al damunt. +--- + +# Color de fons + +Defineix un color de fons uniforme darrere de tot el contingut existent del PDF. L'eina crea un rectangle de color a cada pàgina i hi col·loca al damunt el contingut original, de manera que el text, les imatges i els gràfics es continuen veient perfectament sobre el fons nou. + +## Com funciona + +1. Puja el fitxer PDF. +2. Tria un color de fons amb el selector de color. El valor per defecte és un groc clar (#FFFFCC). +3. Fes clic a **Canvia el color de fons** per processar. +4. El PDF actualitzat es baixa automàticament. + +## Opcions + +- **Color de fons**: un selector de color estàndard per triar qualsevol color uniforme. Per defecte és groc clar. + +## Característiques + +- Aplica un color de fons uniforme a totes les pàgines +- Conserva tot el contingut original (text, imatges, gràfics vectorials) al damunt de la capa de color +- Manté les dimensions originals de la pàgina +- Funciona amb documents de qualsevol nombre de pàgines + +## Casos d'ús + +- Afegir un fons crema o ivori clar per donar als documents un aspecte més suau, semblant al paper +- Codificar amb colors conjunts de documents aplicant fons diferents a categories diferents +- Crear versions visualment diferenciades del mateix document per a públics diferents +- Afegir un lleu to de fons per millorar la llegibilitat quan es projecten documents en pantalla + +## Consells + +- Els colors clars i suaus funcionen millor. Un fons molt fosc pot dificultar la lectura del text, tret que el text ja sigui de color clar. +- Si vols canviar tant el color de fons com el del text, aplica primer el color de fons i després utilitza [Canvia el color del text](./text-color) sobre el resultat. +- Aquesta eina treballa a nivell estructural del PDF (no rasteritza), de manera que el text continua sent seleccionable i es pot cercar al resultat. + +## Eines relacionades + +- [Canvia el color del text](./text-color) +- [Inverteix els colors](./invert-colors) +- [Ajusta els colors](./adjust-colors) diff --git a/docs/ca/tools/bates-numbering.md b/docs/ca/tools/bates-numbering.md new file mode 100644 index 00000000..34f13a96 --- /dev/null +++ b/docs/ca/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Numeració Bates +description: Aplica números Bates a un o diversos PDF amb plantilles personalitzables, farciment, tipus de lletra i posicionament. +--- + +# Numeració Bates + +La numeració Bates estampa identificadors seqüencials a cada pàgina dels PDF. És el mètode estàndard per etiquetar documents en procediments judicials, auditories i fluxos de compliment normatiu. Aquesta eina admet diversos fitxers i plantilles personalitzables, i genera PDF numerats individualment o un únic arxiu ZIP. + +## Com funciona + +1. Puja un o més fitxers PDF. Pots arrossegar-ne diversos alhora. +2. Tria un estil predefinit o crea una plantilla personalitzada. +3. Configura la posició, el tipus de lletra, la mida, el color i els números inicials. +4. Fes clic a **Aplica els números Bates** per processar. +5. Un sol fitxer es baixa directament. Diversos fitxers es baixen en un arxiu ZIP. + +## Opcions + +- **Estil predefinit**: tria entre els formats integrats: + - Exhibit + Case + Bates + Page (per exemple, "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (sense número de pàgina) + - Case + Bates + - Només número Bates (per exemple, "000001") + - Personalitzat (escriu la teva pròpia plantilla) +- **Personalitza l'estil**: una cadena de plantilla amb marcadors de posició: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Farciment Bates**: nombre de dígits (de 3 a 6) dels números Bates amb zeros a l'esquerra. Només es veu en mode personalitzat. +- **Posició**: capçalera o peu de pàgina, esquerra, centre o dreta. +- **El Bates comença a**: el primer número Bates. Per defecte és 1. La numeració continua entre fitxers. +- **El comptador de fitxers comença a**: el número inicial del marcador de posició `[FILE]`. +- **Tipus de lletra**: Helvetica, Times New Roman o Courier. +- **Mida de la lletra**: mida del text estampat. +- **Color**: selector de color per al text del número Bates. + +## Característiques + +- Vista prèvia en directe que mostra com apareixeran els números Bates a tots els fitxers pujats +- Compatibilitat amb diversos fitxers amb numeració contínua entre documents +- Reordenació dels fitxers arrossegant-los per controlar la seqüència de numeració +- Sis opcions de posició (capçalera/peu, esquerra/centre/dreta) +- Càlcul adaptatiu dels marges que respecta les diferents mides de pàgina +- Sortida en ZIP per a lots de diversos fitxers +- Marcadors de posició a les plantilles per a la màxima flexibilitat + +## Casos d'ús + +- Estampar documents de descobriment per a litigis amb números d'exhibit seqüencials +- Numerar paquets de proves d'auditoria que abasten desenes de fitxers +- Aplicar números de referència reglamentaris a la documentació de compliment normatiu +- Etiquetar els annexos d'una sol·licitud de patent amb identificadors propis del cas + +## Consells + +- Arrossega els fitxers de la llista per reordenar-los abans de processar. La seqüència de numeració Bates segueix aquest ordre. +- Utilitza el marcador de posició `[FILENAME]` per incloure el nom original del fitxer a l'estampat, cosa que ajuda a localitzar les pàgines als documents d'origen. +- El quadre de vista prèvia s'actualitza en temps real quan canvies la configuració, de manera que pots comprovar el format abans de processar. + +## Eines relacionades + +- [Números de pàgina](./page-numbers) +- [Afegeix etiquetes de pàgina](./add-page-labels) +- [Capçalera i peu de pàgina](./header-footer) diff --git a/docs/ca/tools/bmp-to-pdf.md b/docs/ca/tools/bmp-to-pdf.md new file mode 100644 index 00000000..4b0d666a --- /dev/null +++ b/docs/ca/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP a PDF +description: Converteix imatges de mapa de bits BMP a PDF directament al navegador, sense pujar res a cap servidor. +--- + +# BMP a PDF + +Converteix fitxers Windows Bitmap (BMP) a PDF. BMP és un format d'imatge sense compressió que encara es troba en sistemes antics, imatgeria mèdica i escàners industrials. Aquesta eina els converteix a PDF sense haver d'instal·lar res. + +## Formats compatibles + +| Format | Extensions | +| :----- | :--------- | +| BMP | `.bmp` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers BMP. +2. Revisa la llista de fitxers. Afegeix-ne més o elimina els que no vulguis. +3. Fes clic a **Converteix a PDF**. El resultat es baixa com a `from_bmps.pdf`. + +Cada BMP es dibuixa en un canvas, s'exporta com a PNG i després s'incrusta al PDF amb pdf-lib. La mida de la pàgina coincideix amb les dimensions originals de la imatge. + +## Opcions + +Aquesta eina no ofereix paràmetres de qualitat addicionals. Les imatges s'incrusten a la resolució original com a PNG sense pèrdua dins del PDF. + +## Casos d'ús + +- Convertir en PDF d'arxiu documents antics escanejats i desats com a BMP +- Convertir captures de pantalla BMP d'aplicacions antigues de Windows en documents que es puguin compartir +- Processar la sortida d'escàners mèdics o industrials que per defecte genera BMP +- Migrar arxius d'imatges antics a un format més portàtil + +## Consells + +- Els fitxers BMP no estan comprimits, de manera que solen ser grans. El PDF resultant serà considerablement més petit perquè internament les imatges es tornen a codificar com a PNG. +- Si tens fitxers BMP juntament amb altres formats d'imatge, utilitza l'eina [Imatges a PDF](./image-to-pdf) per convertir-ho tot en un sol lot. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [TIFF a PDF](./tiff-to-pdf) diff --git a/docs/ca/tools/bookmark.md b/docs/ca/tools/bookmark.md new file mode 100644 index 00000000..e18cf0e7 --- /dev/null +++ b/docs/ca/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Edita els marcadors +description: Afegeix, edita, importa, exporta i elimina els marcadors d'un PDF amb un editor visual i compatibilitat amb CSV/JSON. +--- + +# Edita els marcadors + +L'editor de marcadors et dona control total sobre els marcadors de navegació d'un PDF (també anomenats esquema). Pots afegir-ne de nous, editar els existents, reorganitzar la jerarquia i importar o exportar les dades dels marcadors en format CSV i JSON. + +## Com funciona + +1. Puja el PDF fent clic o arrossegant un fitxer a la zona de càrrega. +2. Si vols, marca **Extreu automàticament els marcadors existents** per carregar l'arbre de marcadors actual del document. +3. L'editor s'obre amb una vista dividida: el visor de PDF a l'esquerra i el tauler de marcadors a la dreta. +4. Escriu el títol d'un marcador i fes clic a **Afegeix a la pàgina** per crear un marcador que apunti a la pàgina actual. +5. Fes servir els botons de la barra d'eines per reorganitzar, aplicar estil o eliminar marcadors. +6. Fes clic a **Desa el PDF amb els marcadors** per baixar el fitxer actualitzat. + +## Funcions + +- Visor de PDF visual amb navegació per pàgines, controls de zoom i camp per anar a una pàgina +- Afegeix marcadors a qualsevol pàgina amb un sol clic +- Fes clic directament al PDF per definir una destinació exacta del marcador (mode de selecció) +- Jerarquia de marcadors imbricats amb reordenació per arrossegament +- Operacions per lots: selecciona diversos marcadors per canviar-ne el color o l'estil, o eliminar-los alhora +- Cerca de marcadors per trobar ràpidament entrades en arbres grans +- Suport de desfer i refer per a tots els canvis +- Importa marcadors des de fitxers CSV (títol, pàgina, nivell) o JSON +- Exporta marcadors a CSV o JSON per editar-los externament +- Estil dels marcadors: color (vermell, blau, verd, groc, lila) i estil de la lletra (negreta, cursiva, negreta cursiva) +- Navegació ràpida: desplaça't per les pàgines amb les tecles de pàgina amunt i avall + +## Opcions + +- **Extreu automàticament els marcadors existents**: quan està marcada, l'eina llegeix i mostra els marcadors actuals del PDF en carregar-lo. +- **Mode per lots**: activa-ho per seleccionar diversos marcadors i aplicar-hi canvis de color o estil, o eliminar-los en bloc. +- **Desplega-ho tot / Replega-ho tot**: mostra o amaga ràpidament els marcadors fills imbricats. + +## Casos d'ús + +- Afegir una taula de continguts a un llibre de text o un manual que no té marcadors +- Reestructurar els marcadors d'un document escanejat després de processar-lo amb OCR +- Exportar els marcadors a CSV, editar-los en un full de càlcul i tornar-los a importar +- Netejar marcadors generats automàticament que tenen referències de pàgina incorrectes +- Afegir marcadors de colors per assenyalar les seccions importants d'un escrit jurídic + +## Consells + +- Fes servir la importació CSV per crear marcadors en massa. El format és senzill: `title,page,level`, on el nivell 1 és el nivell superior. +- El mode de selecció et permet fer clic en un punt exacte de la pàgina del PDF per definir la destinació del marcador, cosa que és més precisa que apuntar només a un número de pàgina. +- Exporta els marcadors abans de fer canvis importants per tenir-ne una còpia de seguretat. + +## Eines relacionades + +- [Taula de continguts](./table-of-contents) +- [Editor de PDF](./edit-pdf) +- [Afegeix etiquetes de pàgina](./add-page-labels) diff --git a/docs/ca/tools/cbz-to-pdf.md b/docs/ca/tools/cbz-to-pdf.md new file mode 100644 index 00000000..a7765ed5 --- /dev/null +++ b/docs/ca/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ a PDF +description: Converteix arxius de còmics CBZ i CBR a PDF al navegador. Gratuït, privat i sense càrrega de fitxers. +--- + +# CBZ a PDF + +Converteix arxius de còmics en PDF. CBZ i CBR són els formats estàndard dels còmics digitals: simplement són arxius ZIP o RAR plens d'imatges. Aquesta eina extreu cada pàgina, conserva l'ordre de lectura i genera un PDF net on cada imatge es converteix en una pàgina a mida completa. + +## Formats compatibles + +| Format | Extensió | Notes | +| :----- | :------- | :------------------------------------------------------------ | +| CBZ | `.cbz` | Arxiu de còmic basat en ZIP (processat localment amb pdf-lib) | +| CBR | `.cbr` | Arxiu de còmic basat en RAR (processat amb el motor PyMuPDF) | + +El convertidor de CBZ reconeix imatges JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC i JXL dins de l'arxiu. Els formats no estàndard es converteixen automàticament a PNG abans d'incrustar-los. + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega i deixa anar els fitxers CBZ o CBR. Pots barrejar tots dos formats en un mateix lot. +2. Revisa els fitxers de la llista. Elimina els que no necessitis o fes clic a **Afegeix més fitxers** per afegir-ne més. +3. Fes clic a **Converteix a PDF**. Als fitxers CBZ, l'eina descomprimeix l'arxiu, ordena les imatges pel nom en ordre natural, detecta el format real de cada imatge i les incrusta en un PDF amb pdf-lib. Els fitxers CBR passen pel motor PyMuPDF. +4. Un sol fitxer es baixa com a PDF. Si en són diversos, es genera un arxiu ZIP anomenat `comic-converted.zip`. + +## Opcions + +No cal cap configuració. Cada imatge es converteix en una pàgina amb les mateixes dimensions que l'original, de manera que les pàgines dobles continuen sent amples i les pàgines senzilles continuen sent estretes. + +## Casos d'ús + +- Llegir còmics en una tauleta o una aplicació mòbil que admet PDF però no CBZ/CBR +- Imprimir pàgines concretes d'un còmic digital +- Arxivar una col·lecció de còmics en un format que qualsevol visor de fitxers pugui obrir +- Compartir un còmic amb algú que no té un lector de còmics específic + +## Consells + +- Les imatges de l'arxiu s'ordenen amb ordre natural (de manera que `page2.jpg` va abans de `page10.jpg`). Posa als fitxers una numeració coherent perquè la seqüència de pàgines sigui correcta. +- El convertidor detecta el format de les imatges per les seves signatures binàries, no per l'extensió. Un PNG anomenat per error `.jpg` s'incrustarà correctament igualment. +- Els fitxers CBZ es processen íntegrament al navegador sense carregar el motor PyMuPDF, de manera que es converteixen més de pressa que els CBR. + +## Eines relacionades + +- [EPUB a PDF](./epub-to-pdf) +- [MOBI a PDF](./mobi-to-pdf) +- [Imatges a PDF](./image-to-pdf) diff --git a/docs/ca/tools/change-permissions.md b/docs/ca/tools/change-permissions.md new file mode 100644 index 00000000..52e0b961 --- /dev/null +++ b/docs/ca/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Canvia els permisos +description: Defineix o modifica els permisos d'ús d'un PDF per a la impressió, la còpia, l'edició i les anotacions. Fa servir xifratge AES de 256 bits. +--- + +# Canvia els permisos + +Ajusta amb precisió què poden fer els destinataris amb el teu PDF. A diferència del xifratge bàsic, que només bloqueja el fitxer amb una contrasenya, aquesta eina et permet permetre o denegar selectivament la impressió, la còpia, l'edició, les anotacions, l'emplenament de formularis, el muntatge del document i l'extracció de pàgines, tot garantit amb xifratge AES de 256 bits. + +## Com funciona + +1. Puja un fitxer PDF. +2. Si el PDF ja està xifrat, introdueix la **Contrasenya actual**. +3. Defineix una **Nova contrasenya d'usuari** (necessària per obrir-lo) i/o una **Nova contrasenya de propietari** (controla els permisos). +4. Activa o desactiva cada permís amb les caselles de verificació. +5. Fes clic a **Canvia els permisos**. +6. Baixa el PDF actualitzat. + +Si deixes buits els dos camps de contrasenya nova, l'eina desxifra el PDF completament i n'elimina tot el xifratge i les restriccions. + +## Control de permisos + +| Permís | Què controla | +| ------------------------------ | ------------------------------------------------------- | +| **Permet imprimir** | Si el document es pot imprimir | +| **Permet copiar text** | Si es pot seleccionar i copiar el text i les imatges | +| **Permet modificar** | Si es pot editar el contingut del document | +| **Permet anotar** | Si es poden afegir comentaris, ressaltats i segells | +| **Permet emplenar formularis** | Si es poden emplenar els camps de formulari interactius | +| **Permet muntar el document** | Si es poden inserir, eliminar o girar pàgines | +| **Permet extreure pàgines** | Si es poden extreure pàgines individuals | + +Tots els permisos necessiten una contrasenya de propietari per aplicar-se. Sense contrasenya de propietari, la majoria de lectors de PDF ignoren els indicadors de permisos. + +## Com funcionen els permisos en un PDF + +Els permisos d'un PDF formen part de l'especificació de xifratge. Es desen com a indicadors de bits al diccionari de xifratge i els apliquen els lectors de PDF compatibles. La diferència clau: + +- **Contrasenya d'usuari**: necessària per obrir el fitxer. +- **Contrasenya de propietari**: necessària per canviar els permisos o eliminar les restriccions. Sense ella, els indicadors de permisos controlen quines operacions pot fer l'usuari. + +Si només defineixes una contrasenya de propietari (sense contrasenya d'usuari), tothom pot obrir el fitxer però queda limitat a les operacions permeses. Si defineixes les dues, el fitxer requereix una contrasenya per obrir-se i queda restringit després de l'autenticació. + +## Casos d'ús + +- Distribuir un informe que es pot veure i imprimir però no editar ni copiar +- Compartir una plantilla de contracte que els destinataris poden emplenar però no modificar +- Publicar un catàleg en PDF amb la còpia d'imatges desactivada +- Permetre anotacions en un esborrany de revisió i evitar canvis estructurals + +## Consells + +- Perquè sigui efectiu, defineix sempre una contrasenya de propietari. Els permisos sense contrasenya de propietari no es poden fer complir. +- Algunes eines de PDF de tercers ignoren els indicadors de permisos. Per a una protecció més sòlida, considera rasteritzar el PDF o fer servir DRM. +- Fes servir aquesta eina per actualitzar PDF antics xifrats amb RC4 a AES-256. + +## Eines relacionades + +- [Xifra PDF](./protect-pdf): protecció senzilla amb contrasenya, sense permisos granulars +- [Desxifra PDF](./unlock-pdf): elimina el xifratge completament +- [Elimina les restriccions](./remove-restrictions): elimina totes les restriccions quan tens la contrasenya de propietari diff --git a/docs/ca/tools/combine-single-page.md b/docs/ca/tools/combine-single-page.md new file mode 100644 index 00000000..e4fbcea9 --- /dev/null +++ b/docs/ca/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Combina en una única pàgina +description: Uneix totes les pàgines d'un PDF en un únic desplaçament continu vertical o horitzontal. +--- + +# Combina en una única pàgina + +Fusiona totes les pàgines d'un PDF en una sola pàgina llarga. Les pàgines s'uneixen en vertical (com un rotllo) o en horitzontal (una al costat de l'altra) i el resultat és una única pàgina contínua. + +## Com funciona + +1. Puja un fitxer PDF. +2. Selecciona la direcció del disseny: **Vertical** (pàgines apilades de dalt a baix) o **Horitzontal** (pàgines col·locades una al costat de l'altra). +3. Defineix l'espai entre pàgines en punts. +4. Tria un color de fons per als espais entre pàgines. +5. Si vols, activa els separadors (línies fines entre pàgines) i configura'n el gruix i el color. +6. Fes clic al botó de processar. El resultat és un PDF d'una sola pàgina. + +## Funcions + +- Unió de pàgines en vertical o en horitzontal +- Espai entre pàgines configurable +- Selector de color de fons per a les àrees d'espai +- Línies separadores opcionals amb gruix i color ajustables +- Renderitza cada pàgina original a resolució completa sobre el llenç combinat + +## Opcions + +| Opció | Descripció | +| ------------------------------ | ----------------------------------------------------------- | +| **Direcció de la disposició** | Vertical (apilades) o Horizontal (una al costat de l'altra) | +| **Espaiat** | Espai entre pàgines en punts | +| **Color de fons** | Color de l'àrea entre pàgines | +| **Afegeix línies separadores** | Activa les línies fines entre pàgines | +| **Gruix del separador** | Gruix de la línia en punts | +| **Color del separador** | Color de les línies separadores | + +## Casos d'ús + +- Crear una única imatge llarga a partir d'un wireframe o una maqueta de disseny de diverses pàgines +- Generar una vista contínua i desplaçable d'un document per incrustar-la al web +- Unir un còmic o un guió gràfic de diverses pàgines en una sola tira +- Obtenir una vista panoràmica de pàgines consecutives per revisar-les + +## Consells + +- L'orientació vertical funciona millor amb documents de pàgines verticals. L'horitzontal és més adequada per a contingut apaïsat. +- Els documents grans amb moltes pàgines generaran un resultat molt alt o molt ample. Alguns visors de PDF poden tenir problemes amb pàgines úniques extremadament grans. +- Afegir separadors d'un color que contrasti permet veure fàcilment on acaba una pàgina original i on comença la següent. + +## Eines relacionades + +- [PDF amb diverses pàgines per full](./n-up-pdf) +- [Fusiona PDF](./merge-pdf) +- [Divideix pàgines](./divide-pages) diff --git a/docs/ca/tools/compare-pdfs.md b/docs/ca/tools/compare-pdfs.md new file mode 100644 index 00000000..cd8d6871 --- /dev/null +++ b/docs/ca/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Compara PDF +description: Compara dos documents PDF un al costat de l'altre o en mode de superposició, amb detecció i categorització detallades dels canvis. +--- + +# Compara PDF + +Puja dos PDF i comprova exactament què ha canviat entre ells. L'eina aparella les pàgines de manera intel·ligent, detecta diferències en el text, les imatges, les anotacions, les capçaleres i el format, i les presenta en una vista de costat a costat o de superposició. + +## Com funciona + +1. Puja dos fitxers PDF: l'original (a l'esquerra) i la versió revisada (a la dreta). +2. L'eina aparella les pàgines dels dos documents mitjançant signatures de contingut. +3. Selecciona un mode de vista: **Un al costat de l'altre** o **Superposició**. +4. Navega entre els parells de pàgines amb els controls de paginació. +5. Les diferències es ressalten i es classifiquen. Fes servir el tauler de filtres per centrar-te en tipus de canvi concrets. +6. Si vols, exporta la comparació com a informe en PDF. + +## Funcions + +- Aparellament automàtic de pàgines segons la semblança del contingut +- Vistes de comparació de costat a costat i de superposició +- Classificació dels canvis: text, imatge, capçalera/peu de pàgina, anotació, format, fons +- Filtres per categoria per mostrar o amagar tipus de canvi concrets +- Cerca de canvis de text amb filtratge per consulta +- Compatibilitat amb OCR per comparar documents escanejats +- Controls de zoom per a una inspecció detallada +- Desplaçament sincronitzat entre tauler i tauler en el mode de costat a costat +- Exporta els resultats de la comparació com a PDF + +## Opcions + +| Opció | Descripció | +| ------------------------- | ----------------------------------------------------------------------------------------------------- | +| **Mode de visualització** | Un al costat de l'altre o Superposició | +| **OCR** | Activa o desactiva l'OCR per comparar documents escanejats | +| **Idioma de l'OCR** | Idioma per a l'extracció de text amb OCR | +| **Filtres de categoria** | Activa o desactiva la visibilitat dels canvis de text, imatge, capçalera/peu, anotació, format i fons | +| **Abast dels canvis** | En mode de superposició, filtra entre tots els canvis o només el contingut | +| **Zoom** | Ajusta el nivell d'ampliació per a una inspecció detallada | + +## Casos d'ús + +- Revisar les modificacions d'un contracte per trobar exactament què ha canviat entre versions +- Comparar maquetes de disseny per verificar que les exportacions a PDF coincideixen amb el que s'espera +- Auditar els canvis en documents de sectors regulats on cal registrar cada edició +- Verificar que un procés de conversió de PDF ha conservat amb precisió el contingut original +- Comprovar si hi ha canvis de disseny en documents traduïts respecte a l'original + +## Consells + +- La vista de superposició apila els dos documents l'un sobre l'altre, de manera que les diferències espacials (elements desplaçats, imatges redimensionades) es veuen a l'instant. +- Activa l'OCR quan comparis documents escanejats que no tenen capa de text. El motor de comparació extreurà el text de les imatges de les pàgines. +- Fes servir els filtres per categoria per centrar-te en el que importa. Per exemple, amaga els canvis de format quan només t'interessin les diferències en el text. + +## Eines relacionades + +- [Visualitza les metadades](./view-metadata) +- [Reconeixement OCR de PDF](./ocr-pdf) +- [Fusiona PDF](./merge-pdf) diff --git a/docs/ca/tools/compress-pdf.md b/docs/ca/tools/compress-pdf.md new file mode 100644 index 00000000..754254e6 --- /dev/null +++ b/docs/ca/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Comprimeix PDF +description: Redueix la mida d'un PDF fins a un 90 % amb el motor Hyper Compress. Admet mides de fitxer objectiu, processament per lots i ajustos de qualitat personalitzats. +--- + +# Comprimeix PDF + +Redueix els teus fitxers PDF sense fer-los malbé. Comprimeix PDF funciona amb [Hyper Compress](https://www.bentopdf.com/hyper-compress), el motor de compressió propi de BentoPDF. Torna a comprimir les imatges, crea subconjunts de tipus de lletra i els fusiona, i elimina el pes mort, com ara les miniatures incrustades i les dades privades d'aplicacions. El PDF continua sent plenament funcional: el text es pot seleccionar i els enllaços i els camps de formulari continuen funcionant. + +Hyper Compress està compilat a WebAssembly i s'inclou amb BentoPDF, de manera que la compressió funciona sense connexió i en desplegaments aïllats de la xarxa, sense cap configuració addicional. + +## Com funciona + +1. Puja un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. +2. Tria un **Nivell de compressió**: Baix, Mitjà, Alt o Sense pèrdua. +3. Si vols, introdueix una **Mida objectiu del fitxer**, o desplega **Configuració personalitzada** per a un control més precís, inclosa l'opció **Converteix a escala de grisos**. +4. Fes clic a **Comprimeix PDF**. Si hi ha diversos fitxers, obtens una única baixada en ZIP. + +## Documents especials + +- **Els PDF signats digitalment** es retornen sense canvis, perquè qualsevol modificació invalidaria la signatura. Activa **Substitueix la protecció del contingut** a Configuració personalitzada per eliminar-ne les signatures i comprimir-los; la signatura visible es manté a la pàgina, però el fitxer ja no està signat. +- **Els fitxers PDF/A** perden l'etiqueta PDF/A després de la compressió, de manera que el fitxer no declara mai una conformitat que ja no compleix. Activa **Conserva el PDF/A** a Configuració personalitzada per mantenir el fitxer conforme. +- **Els PDF protegits amb contrasenya** mostren un camp de contrasenya a la targeta del fitxer. Introdueix-hi la contrasenya i Hyper Compress obre el fitxer ell mateix, sense un pas de desbloqueig a part. Amb dos o més fitxers bloquejats, un únic camp compartit desbloqueja tots els fitxers que fan servir la mateixa contrasenya. La còpia comprimida no té contrasenya; fes servir [Protegeix PDF](./protect-pdf) per tornar-n'hi a afegir una. +- **Els escanejos sense capa de text** poden reduir-se encara més amb **Rasteritza les pàgines a imatges** a Configuració personalitzada, que substitueix cada pàgina per una imatge optimitzada. S'omet en qualsevol document que tingui text seleccionable, inclosos els escanejos amb OCR, tret que **Substitueix la protecció del contingut** estigui activat. Aleshores les pàgines de text també es converteixen en imatges, de manera que el text deixa de poder-se seleccionar i els enllaços deixen de funcionar. + +## Nivells de compressió + +| Nivell | Qualitat d'imatge | Resolució màxima | Ideal per a | +| ---------------- | ----------------- | ---------------- | ------------------------------------------- | +| **Baix** | 80 | 200 DPI | Conservar la qualitat visual | +| **Mitjà** | 50 | 150 DPI | Documents quotidians | +| **Alt** | 20 | 72 DPI | Fitxers adjunts de correu, càrregues al web | +| **Sense pèrdua** | Imatges intactes | Sense canvis | Còpies d'arxiu | + +Alt també desincrusta les 14 fonts PDF estàndard, a més de tipus de lletra semblants com Arial quan és segur fer-ho. + +## Mida de fitxer objectiu + +Introdueix una mida en KB o MB i Hyper Compress cerca la millor qualitat d'imatge que hi càpiga, partint del nivell que has triat. Si el document no pot arribar a ser tan petit, obtens la versió més petita possible i un missatge que ho indica. Les pàgines dedicades, com [Comprimeix PDF a 1 MB](https://www.bentopdf.com/compress-pdf-to-1mb), s'obren amb l'objectiu ja emplenat. + +## Configuració personalitzada + +Desplega el tauler Configuració personalitzada per ajustar Hyper Compress directament. En triar un nivell de compressió, aquests valors es restableixen als del nivell, i si en edites qualsevol, el nivell passa a Personalitzat. + +- **Substitueix la protecció del contingut**: per defecte, Hyper Compress no toca els PDF signats i no rasteritza les pàgines amb text. Si l'actives, se salta totes dues limitacions. Continua activat quan canvies de nivell. + +- **Imatges**: qualitat de la imatge, resolució màxima, remostreig forçat, reducció de color, retallada de les àrees invisibles de les imatges, eliminació d'imatges alternatives, simplificació dels perfils de color, JPEG 2000 i mode sense pèrdua +- **Tipus de lletra**: creació de subconjunts, fusió de duplicats i desincrustació de fonts estàndard i de les que s'hi assemblen +- **Contingut**: aplanament d'anotacions, camps de formulari o enllaços +- **Neteja**: eliminació de miniatures, dades d'aplicacions, fils d'articles, informació de captura web, l'arbre d'estructura o les intencions de sortida +- **Rasteritza**: substitució de pàgines per imatges, per a escanejos que només tenen imatges; s'omet quan el document té text seleccionable +- **Sortida**: Conserva el PDF/A i compressió Brotli per a lectors de PDF 2.0 que la admetin + +## Casos d'ús + +- Fer que un informe de 50 MB càpiga en el límit d'un fitxer adjunt de correu +- Aconseguir que un escaneig càpiga en el límit estricte de càrrega d'un portal amb una mida de fitxer objectiu +- Optimitzar PDF de màrqueting perquè es baixin més de pressa des d'un lloc web +- Arxivar grans conjunts de documents quan els costos d'emmagatzematge importen +- Reduir l'ús de dades mòbils en compartir PDF per aplicacions de missatgeria + +## Consells + +- Comença amb Mitjà. Si el resultat continua sent massa gran, defineix una mida de fitxer objectiu o puja a Alt. +- Per a un escaneig sense capa de text, activa Rasteritza les pàgines a imatges a Configuració personalitzada. +- Converteix a escala de grisos, a Configuració personalitzada, pot reduir la mida dels documents amb molt de color. + +## Eines relacionades + +- [Linealitza PDF](./linearize-pdf): optimitza el PDF comprimit per veure'l ràpidament al web +- [Rasteritza PDF](./rasterize-pdf): converteix les pàgines en imatges a un DPI concret, incloses les pàgines amb text +- [Repara PDF](./repair-pdf): arregla un PDF que s'ha fet malbé durant una compressió en un altre lloc +- [Elimina les metadades](./remove-metadata): elimina les dades ocultes per a més privadesa diff --git a/docs/ca/tools/crop-pdf.md b/docs/ca/tools/crop-pdf.md new file mode 100644 index 00000000..dab4efae --- /dev/null +++ b/docs/ca/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Retalla PDF +description: Retalla visualment les pàgines d'un PDF dibuixant una regió de retall a cada pàgina amb un editor basat en Cropper.js. +--- + +# Retalla PDF + +Retalla els marges de les pàgines del teu PDF amb una interfície de retall visual. Dibuixa un rectangle de retall directament sobre cada pàgina, previsualitza el resultat i aplica el retall. Pots definir regions de retall diferents per a pàgines diferents o aplicar el mateix retall a tot el document. + +## Com funciona + +1. Puja el teu fitxer PDF. +2. S'obre l'editor de retall, que mostra la primera pàgina amb una superposició de retall que es pot arrossegar. +3. Ajusta el rectangle de retall arrossegant-ne les vores o els cantons. +4. Fes servir els botons de navegació de pàgines per moure't entre pàgines i definir la regió de retall de cadascuna. +5. Fes clic a **Retalla i descarrega** per aplicar el retall i baixar el resultat. + +## Funcions + +- Editor de retall visual amb Cropper.js i nanses per a un ajust precís +- Navegació pàgina a pàgina per definir regions de retall individuals +- Desa la configuració del retall per pàgina, de manera que pots definir retalls diferents per a pàgines diferents +- Previsualització en directe de l'àrea de retall seleccionada +- Admet PDF de qualsevol mida o orientació de pàgina + +## Casos d'ús + +- Eliminar els marges amples dels documents escanejats per centrar-se en l'àrea de contingut +- Treure les marques de tall o de registre de la impressora dels PDF de preimpressió +- Retallar diapositives de classe per eliminar l'àrea de notes del presentador +- Eliminar les capçaleres o els peus de pàgina de totes les pàgines abans de compartir un fragment d'un document +- Canviar la mida de les pàgines perquè s'ajustin a una pantalla o a un disseny d'impressió concrets + +## Consells + +- La superposició de retall es pot redimensionar i reposicionar lliurement. Arrossega els cantons per redimensionar-la proporcionalment o les vores per ajustar-la en un sol eix. +- En documents on totes les pàgines necessiten el mateix retall, defineix-lo a la primera pàgina: l'eina recorda la regió de retall mentre navegues per les pàgines. +- Si necessites normalitzar la mida de les pàgines en lloc de retallar visualment, l'eina Uniformitza la mida de pàgina pot ser més adequada. + +## Eines relacionades + +- [Editor de PDF](./edit-pdf) +- [Números de pàgina](./page-numbers) +- [Elimina les pàgines en blanc](./remove-blank-pages) diff --git a/docs/ca/tools/csv-to-pdf.md b/docs/ca/tools/csv-to-pdf.md new file mode 100644 index 00000000..f30b656e --- /dev/null +++ b/docs/ca/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV a PDF +description: Converteix fitxers de full de càlcul CSV en taules PDF formatades directament al navegador. +--- + +# CSV a PDF + +Converteix fitxers CSV en documents PDF nets i formatats. Cada CSV s'analitza i es representa com una taula al PDF resultant. Això és útil quan necessites imprimir o compartir dades tabulars sense que el destinatari hagi de tenir un programa de fulls de càlcul. + +## Formats compatibles + +| Format | Extensions | +| :----- | :--------- | +| CSV | `.csv` | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega i deixa anar un o més fitxers CSV. +2. Revisa la llista de fitxers. Afegeix-ne més o elimina els que no vulguis. +3. Fes clic a **Converteix a PDF**. Un indicador de progrés mostra l'estat de la conversió. +4. Un sol fitxer es baixa directament com a PDF. Si són diversos, s'empaqueten a `csv-converted.zip`. + +## Opcions + +Aquesta eina no té cap configuració addicional. El CSV s'analitza i es formata automàticament com a taula. + +## Resultat + +| Nombre d'entrades | Resultat | +| :---------------- | :--------------------------------------------------------- | +| 1 fitxer | Baixada d'un únic PDF (p. ex., `data.pdf`) | +| 2 o més fitxers | Arxiu ZIP (`csv-converted.zip`) amb un PDF per cada fitxer | + +## Casos d'ús + +- Convertir informes de bases de dades exportats en taules PDF imprimibles +- Compartir dades financeres o llistes d'inventari amb persones que no tenen Excel +- Crear versions en PDF de fitxers de registre CSV per a la documentació de compliment normatiu +- Imprimir llistes d'adreces, fulls de notes o qualsevol dada tabular desada com a CSV + +## Consells + +- Per obtenir els millors resultats, assegura't que el CSV fa servir comes com a delimitadors estàndard. L'eina segueix les convencions habituals d'anàlisi de CSV. +- Si el CSV té moltes columnes, la taula es pot comprimir per ajustar-se a l'amplada de la pàgina. Considera dividir els conjunts de dades amples en diversos fitxers. +- Per als fitxers d'Excel (`.xls`, `.xlsx`), fes servir l'eina [Excel a PDF](./excel-to-pdf), que conserva el format del full de càlcul i els diversos fulls. + +## Eines relacionades + +- [Excel a PDF](./excel-to-pdf) +- [Text a PDF](./txt-to-pdf) +- [JSON a PDF](./json-to-pdf) diff --git a/docs/ca/tools/delete-pages.md b/docs/ca/tools/delete-pages.md new file mode 100644 index 00000000..e4604d26 --- /dev/null +++ b/docs/ca/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Suprimeix pàgines +description: Elimina pàgines concretes d'un PDF per número de pàgina, per interval o mitjançant la selecció visual de miniatures. +--- + +# Suprimeix pàgines + +Elimina les pàgines no desitjades d'un document PDF. Indica les pàgines que vols suprimir escrivint-ne els números o intervals, o fes clic directament a les miniatures de les pàgines per marcar-les perquè s'eliminin. + +## Com funciona + +1. Puja un fitxer PDF. L'eina mostra previsualitzacions en miniatura de totes les pàgines. +2. Introdueix les pàgines que vols suprimir al camp de text amb la sintaxi d'intervals (p. ex., `2, 5-8`), o fes clic a les miniatures per activar-les o desactivar-les. +3. Les pàgines marcades es ressalten visualment perquè puguis confirmar la selecció. +4. Fes clic al botó de processar. Es crea un PDF nou sense les pàgines seleccionades. + +## Funcions + +- Selecció de pàgines per text amb sintaxi d'intervals (`2, 5-8, 12`) +- Quadrícula visual de miniatures per suprimir amb un clic +- Ressaltat en temps real de les pàgines marcades per suprimir +- Validació de l'entrada segons el nombre real de pàgines +- Conserva totes les pàgines no suprimides en l'ordre original + +## Casos d'ús + +- Eliminar pàgines en blanc o de farciment d'un document escanejat +- Treure les portades o els apèndixs abans de compartir un document +- Netejar les pàgines d'esborrany que s'han deixat per error en un PDF final +- Eliminar les pàgines amb informació sensible abans de distribuir-lo + +## Consells + +- Suprimir pàgines no afecta el contingut ni el format de les pàgines restants. El resultat és una còpia fidel de l'original sense les pàgines eliminades. +- Si vols conservar només pàgines concretes en lloc d'eliminar-ne, [Extreu pàgines](./extract-pages) és l'opció més adequada. +- La vista de miniatures es carrega de manera progressiva, de manera que els documents grans continuen responent bé. + +## Eines relacionades + +- [Extreu pàgines](./extract-pages) +- [Duplica i organitza](./organize-pdf) +- [Divideix PDF](./split-pdf) diff --git a/docs/ca/tools/deskew-pdf.md b/docs/ca/tools/deskew-pdf.md new file mode 100644 index 00000000..6b503a60 --- /dev/null +++ b/docs/ca/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Redreça PDF +description: Redreça automàticament les pàgines inclinades dels PDF escanejats amb la detecció d'inclinació d'OpenCV. Llindar i DPI ajustables. +--- + +# Redreça PDF + +Els documents escanejats poques vegades queden perfectament rectes. Fins i tot una lleugera inclinació fa que l'OCR sigui menys precís i que la impressió quedi descuidada. Aquesta eina fa servir els algorismes de processament d'imatge d'OpenCV per detectar l'angle d'inclinació de cada pàgina i tornar-la a posar recta. + +## Com funciona + +1. Puja un o més PDF escanejats. +2. Defineix el **Llindar d'inclinació**: les pàgines amb una inclinació detectada inferior a aquest valor no es toquen. +3. Tria una **Qualitat de processament (DPI)**: un DPI més alt millora la precisió de la detecció però triga més. +4. Fes clic a **Redreça PDF**. +5. Un cop processat, un tauler de resultats mostra l'angle detectat a cada pàgina i si s'ha corregit. + +## Opcions + +| Paràmetre | Valors | Per defecte | +| ---------------------------------- | ------------------------ | ----------- | +| **Llindar d'inclinació** | 0,1, 0,5, 1,0, 2,0 graus | 0,5 | +| **Qualitat de processament (DPI)** | 100, 150, 200, 300 | 150 | + +## Com funciona la detecció d'inclinació + +L'eina renderitza cada pàgina com a imatge amb el DPI seleccionat i després fa servir OpenCV per detectar els angles de les línies dominants del contingut. Si la inclinació detectada supera el llindar, la pàgina es gira l'angle invers per redreçar-la. Les pàgines per sota del llindar passen sense canvis. + +## Casos d'ús + +- Netejar contractes o documents legals escanejats per lots +- Preparar rebuts o factures escanejats per al processament amb OCR +- Redreçar pàgines d'un escàner pla amb una col·locació del paper irregular +- Millorar la qualitat visual de materials d'arxiu digitalitzats + +## Consells + +- Redueix el llindar a 0,1 graus si necessites un alineament perfecte per a l'OCR. +- 150 DPI és ràpid i precís per a la majoria de documents. Fes servir 300 DPI per a text molt petit o pàgines amb molt de detall. +- Redreça PDF funciona millor amb documents que tenen línies de text horitzontals clares. Pot tenir dificultats amb pàgines que són sobretot imatges o elements de disseny en diagonal. + +## Eines relacionades + +- [Rasteritza PDF](./rasterize-pdf): converteix el resultat redreçat en un PDF pla basat en imatges +- [Comprimeix PDF](./compress-pdf): redueix la mida del fitxer després de redreçar-lo +- [Repara PDF](./repair-pdf): arregla problemes estructurals en PDF escanejats diff --git a/docs/ca/tools/digital-sign-pdf.md b/docs/ca/tools/digital-sign-pdf.md new file mode 100644 index 00000000..81119442 --- /dev/null +++ b/docs/ca/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Signatura digital de PDF +description: Afegeix signatures digitals criptogràfiques als PDF amb certificats X.509. Admet els formats PKCS#12 i PEM amb opcions de signatura visible. +--- + +# Signatura digital de PDF + +Una signatura digital és una prova criptogràfica que una persona concreta ha signat un document i que el document no s'ha alterat des de llavors. A diferència d'una signatura dibuixada (que és només una imatge), una signatura digital fa servir certificats X.509 i els estàndards PKCS#7 per oferir autenticitat i integritat verificables. + +BentoPDF aplica les signatures digitals íntegrament al teu navegador. La teva clau privada no surt mai del dispositiu. + +## Com funciona + +1. Puja un fitxer PDF. +2. Puja el fitxer del teu certificat (.pfx, .p12 o .pem). +3. Introdueix la contrasenya del certificat per desbloquejar-lo. L'eina mostra el subjecte, l'emissor i el període de validesa del certificat. +4. Si vols, configura les metadades de la signatura (motiu, ubicació, informació de contacte). +5. Si vols, activa una **signatura visible** amb personalització de la posició, la mida, la imatge i el text. +6. Fes clic a **Signa PDF**. + +## Formats de certificat compatibles + +| Format | Extensions | Descripció | +| ----------- | ---------- | --------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Paquet estàndard del sector que conté la clau privada i la cadena de certificats. El format més habitual. | +| **PEM** | .pem | Format basat en text. Ha de contenir el certificat i la clau privada en un sol fitxer. Admet claus privades xifrades. | + +## Opcions de la signatura visible + +Quan s'activa, es renderitza un bloc de signatura visible a la pàgina del PDF: + +- **Posició**: coordenades X/Y i amplada/alçada en punts +- **Pàgina**: primera pàgina, última pàgina, totes les pàgines o un número de pàgina concret +- **Imatge**: puja una imatge PNG, JPG o WebP (la teva signatura manuscrita, el segell de l'empresa, etc.) +- **Text**: text personalitzat amb color i mida de lletra configurables. Si no es proporciona cap imatge ni text, l'eina genera automàticament un text a partir del nom comú del certificat i la data actual. + +## Metadades de la signatura + +- **Motiu**: per què s'ha signat el document (p. ex., "Aprovat", "Revisat") +- **Ubicació**: on s'ha fet la signatura (p. ex., "Barcelona") +- **Informació de contacte**: com contactar amb el signant (p. ex., una adreça electrònica) + +## Nota sobre la connexió a internet + +Pot ser que signar requereixi una connexió a internet. La biblioteca de signatura obté la cadena de certificats d'unes URL incrustades a l'extensió Authority Information Access (AIA) del teu certificat. Si aquests servidors no són accessibles, la signatura fallarà amb els certificats que requereixen validació de la cadena. + +## Casos d'ús + +- Signar contractes, propostes i acords amb signatures digitals jurídicament vinculants +- Certificar documents oficials en fluxos de treball que requereixen autenticació basada en PKI +- Signar factures en PDF per complir la normativa (molts països de la UE exigeixen factures electròniques signades digitalment) +- Afegir l'aprovació d'una organització a plànols d'enginyeria o documents de qualitat + +## Consells + +- Els certificats autosignats serveixen per fer proves, però mostraran advertències a l'Adobe Reader. Fes servir un certificat d'una autoritat de certificació de confiança per als documents en producció. +- La signatura visible és purament visual. La signatura criptogràfica s'incrusta tant si el bloc visible està activat com si no. +- Verifica el PDF signat amb l'eina Valida la signatura d'un PDF per confirmar que la signatura està intacta. + +## Eines relacionades + +- [Valida la signatura d'un PDF](./validate-signature-pdf): verifica les signatures digitals dels PDF signats +- [Aplana PDF](./flatten-pdf): aplana els formularis abans de signar per evitar modificacions +- [Xifra PDF](./protect-pdf): afegeix protecció amb contrasenya a sobre de la signatura digital +- [Elimina les metadades](./remove-metadata): elimina les metadades abans de signar diff --git a/docs/ca/tools/divide-pages.md b/docs/ca/tools/divide-pages.md new file mode 100644 index 00000000..a9907ef2 --- /dev/null +++ b/docs/ca/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Divideix pàgines +description: Divideix les pàgines d'un PDF en vertical o en horitzontal en subpàgines més petites. +--- + +# Divideix pàgines + +Talla les pàgines d'un PDF per la meitat, dividint-les en horitzontal o en vertical. Això és útil quan una sola pàgina conté contingut que s'hauria de separar en pàgines diferents, per exemple, un disseny de dues columnes escanejat com una única pàgina ampla. + +## Com funciona + +1. Puja un fitxer PDF. +2. Selecciona la direcció de la divisió: **Vertical** (meitats esquerra i dreta) o **Horitzontal** (meitats superior i inferior). +3. Si vols, indica un interval de pàgines per limitar quines pàgines es divideixen. Deixa-ho en blanc per dividir-les totes. +4. Fes clic al botó de processar per generar el PDF dividit. + +## Funcions + +- Divisió vertical: divideix cada pàgina en una meitat esquerra i una de dreta +- Divisió horitzontal: divideix cada pàgina en una meitat superior i una d'inferior +- Filtre per interval de pàgines per dividir només pàgines concretes +- Les pàgines no seleccionades passen sense canvis +- Conserva la qualitat del contingut sense tornar-lo a renderitzar + +## Casos d'ús + +- Separar pàgines escanejades de dues en dues (p. ex., l'escaneig d'un llibre amb la pàgina esquerra i la dreta en un mateix full) +- Dividir un PDF apaïsat amb contingut un al costat de l'altre en pàgines verticals individuals +- Dividir infografies o pòsters alts en seccions superior i inferior separades +- Preparar documents de format ample per imprimir-los en paper estàndard + +## Consells + +- Si les pàgines tenen el contingut repartit de manera desigual, la divisió es fa igualment al punt mitjà exacte. Per a divisions asimètriques, considera fer servir [Retalla PDF](./crop-pdf). +- Combina aquesta eina amb [Gira PDF](./rotate-pdf) si les pàgines s'han de girar abans o després de dividir-les. + +## Eines relacionades + +- [Divideix PDF](./split-pdf) +- [Retalla PDF](./crop-pdf) +- [PDF amb diverses pàgines per full](./n-up-pdf) +- [Divideix PDF en format pòster](./posterize-pdf) diff --git a/docs/ca/tools/duplex-collate.md b/docs/ca/tools/duplex-collate.md new file mode 100644 index 00000000..adbdae68 --- /dev/null +++ b/docs/ca/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Ordena les cares d'un escaneig a doble cara +description: Reordena els PDF d'escanejos a doble cara que tenen les pàgines anteriors i les posteriors en blocs separats, i els posa en l'ordre correcte de cara i revers. +--- + +# Ordena les cares d'un escaneig a doble cara + +Aquesta eina està pensada per als fluxos d'escaneig amb alimentador automàtic en què un PDF conté dos blocs de pàgines: + +- primer, totes les cares anteriors +- després, totes les cares posteriors + +En lloc de dividir i tornar a muntar manualment, l'eina intercala els dos blocs en l'ordre natural de lectura: cara 1, revers 1, cara 2, revers 2, i així successivament. + +## Com funciona + +1. Puja un sol PDF creat a partir de l'escaneig d'una pila a doble cara. +2. Defineix el punt de divisió on acaba el bloc de cares anteriors. +3. Tria com es tracta el bloc de reversos: + - **Inverteix el bloc de reversos** (habitual quan la pila es gira abans d'escanejar els reversos) + - **Mantén el bloc de reversos tal com està** +4. Fes clic a **Ordena les cares del PDF** per baixar el resultat reordenat. + +## Opcions + +- **Detecta automàticament el punt de divisió (meitat)**: defineix el punt de divisió a `ceil(totalPages / 2)`. +- **Avís de pàgines senars**: avisa quan el total de pàgines és senar (sovint és un desajust de l'escaneig). +- **Confirmació de blocs desiguals**: demana confirmació quan les mides dels blocs de cares i reversos són diferents. +- **Exportació agrupada**: divideix el resultat ordenat en PDF separats segons el nombre de pàgines del document original i el baixa com a ZIP. + +## Comportament de la sortida + +- **Per defecte**: un PDF de sortida (un PDF d'entrada, un PDF de sortida). +- **Mode agrupat**: la sortida es divideix en fragments segons el valor de pàgines per document; si es produeixen diversos fragments, es baixen en un sol ZIP, i si no, es baixa un únic PDF. + +Si les mides dels blocs són desiguals, primer s'ordenen les pàgines aparellades i les pàgines sense parella restants s'afegeixen al final. + +## Casos d'ús habituals + +- Restaurar l'ordre després d'escanejar una pila de formularis a doble cara en dues passades. +- Reconstruir paquets de cara i revers a partir d'escàners d'oficina que generen primer totes les cares i després tots els reversos. +- Postprocessar escanejos d'arxiu abans de dividir-los en fitxers per document. + +## Consells + +- La majoria dels lots a doble cara haurien de tenir un nombre total de pàgines parell. +- Si el resultat sembla invertit als reversos, canvia entre **Inverteix el bloc de reversos** i **Mantén el bloc de reversos tal com està**. +- Per a originals de 2 pàgines (cara i revers), fes servir l'exportació agrupada amb `2` pàgines per document. + +## Eines relacionades + +- [Alterna i barreja pàgines](./alternate-merge) +- [Divideix PDF](./split-pdf) +- [Fusiona PDF](./merge-pdf) +- [Duplica i organitza](./organize-pdf) diff --git a/docs/ca/tools/edit-attachments.md b/docs/ca/tools/edit-attachments.md new file mode 100644 index 00000000..46488a2b --- /dev/null +++ b/docs/ca/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Edita els fitxers adjunts +description: Visualitza i elimina selectivament els fitxers adjunts incrustats en un document PDF. +--- + +# Edita els fitxers adjunts + +Inspecciona i gestiona els fitxers adjunts d'un PDF. L'eina llista cada fitxer incrustat amb el seu nom i nivell d'adjunció, i després et permet marcar adjunts individuals per eliminar-los o eliminar-los tots alhora. + +## Com funciona + +1. Puja un fitxer PDF. +2. L'eina cerca automàticament els fitxers adjunts i els mostra en una llista. +3. Cada adjunt mostra el nom del fitxer i si és un adjunt de nivell de document o de nivell de pàgina. +4. Fes clic a la icona de la paperera al costat d'un adjunt per marcar-lo per eliminar (torna-hi a fer clic per desmarcar-lo). +5. Fes servir el botó **Elimina tots els fitxers adjunts** per seleccionar-ho tot alhora, o **Desselecciona-ho tot** per esborrar les seleccions. +6. Fes clic al botó de processar per desar un PDF nou sense els adjunts seleccionats. + +## Funcions + +- Llista tots els adjunts de nivell de document i de nivell de pàgina +- Eliminació d'adjunts individual o en bloc +- Activa i desactiva la selecció abans de confirmar els canvis +- Ratllat visual i canvi d'opacitat en els elements marcats per eliminar +- Baixa el PDF modificat sense els adjunts seleccionats + +## Casos d'ús + +- Eliminar fitxers obsolets o incorrectes incrustats en un document abans de tornar-lo a distribuir +- Treure d'un PDF els adjunts sensibles (dades financeres, informació personal) abans de compartir-lo +- Reduir la mida del PDF eliminant fitxers incrustats grans que ja no calen +- Auditar el contingut incrustat i netejar un document abans d'arxivar-lo + +## Consells + +- Els adjunts marcats per eliminar es mostren ratllats. Pots tornar-los a activar abans de processar si canvies d'idea. +- Si no es troba cap adjunt, l'eina mostra un missatge clar de "No s'ha trobat cap fitxer adjunt": el PDF simplement no conté fitxers incrustats. + +## Eines relacionades + +- [Afegeix fitxers adjunts](./add-attachments) +- [Extreu fitxers adjunts](./extract-attachments) +- [Visualitza les metadades](./view-metadata) diff --git a/docs/ca/tools/edit-metadata.md b/docs/ca/tools/edit-metadata.md new file mode 100644 index 00000000..fac936d8 --- /dev/null +++ b/docs/ca/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Edita les metadades +description: Visualitza i modifica els camps de metadades d'un PDF, com el títol, l'autor, les paraules clau, les dates i les propietats personalitzades. +--- + +# Edita les metadades + +Edita les metadades incrustades en un fitxer PDF. L'eina emplena prèviament un formulari amb les metadades existents del document, et deixa modificar qualsevol camp i desa els canvis en un PDF nou. + +## Com funciona + +1. Puja un fitxer PDF. L'eina en llegeix les metadades actuals i emplena el formulari. +2. Edita qualsevol dels camps estàndard: Títol, Autor, Assumpte, Paraules clau, Creador, Productor. +3. Ajusta la Data de creació i la Data de modificació amb els selectors de data i hora. +4. Afegeix camps de metadades personalitzats fent clic al botó d'afegir i introduint un parell clau-valor. +5. Fes clic al botó de processar per desar el PDF modificat. + +## Funcions + +- Emplena prèviament totes les metadades existents del PDF pujat +- Camps estàndard: Títol, Autor, Assumpte, Paraules clau, Creador, Productor +- Selectors de data i hora per a la Data de creació i la Data de modificació +- Camps de metadades personalitzats de tipus clau-valor per a propietats arbitràries +- Desa els canvis directament al diccionari d'informació del document del PDF + +## Camps editables + +| Camp | Descripció | +| ------------------------ | ------------------------------------------------------------ | +| **Títol** | El títol del document que mostren els lectors de PDF | +| **Autor** | La persona o organització que ha creat el document | +| **Assumpte** | Una breu descripció del tema del document | +| **Paraules clau** | Termes separats per comes per a la cerca i la categorització | +| **Creador** | L'aplicació que va crear originalment el contingut | +| **Productor** | L'aplicació que ha generat el PDF | +| **Data de creació** | Quan es va crear originalment el document | +| **Data de modificació** | Quan es va modificar per darrera vegada el document | +| **Camps personalitzats** | Qualsevol parell clau-valor addicional que defineixis | + +## Casos d'ús + +- Definir un títol i un autor adequats abans de publicar un document +- Afegir paraules clau per millorar la cerca als sistemes de gestió documental +- Actualitzar la data de modificació perquè reflecteixi la revisió actual +- Afegir camps de metadades personalitzats com Departament, ID de projecte o Classificació +- Netejar les metadades que ha deixat el programari d'autoria original + +## Consells + +- Els camps personalitzats s'escriuen directament al diccionari d'informació del PDF. Pot ser que alguns lectors de PDF no mostrin els camps personalitzats, però es conserven al fitxer. +- Deixa un camp en blanc per esborrar-lo de les metadades. El botó de processar desa el que hi hagi al formulari. +- Per veure les metadades sense editar-les, fes servir [Visualitza les metadades](./view-metadata). Per eliminar-les totes completament, fes servir Elimina les metadades. + +## Eines relacionades + +- [Visualitza les metadades](./view-metadata) +- [Capes OCG del PDF](./pdf-layers) +- [Comprimeix PDF](./compress-pdf) diff --git a/docs/ca/tools/edit-pdf.md b/docs/ca/tools/edit-pdf.md new file mode 100644 index 00000000..df22c4b1 --- /dev/null +++ b/docs/ca/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Editor de PDF +description: Anota, ressalta, censura, afegeix formes i imatges, cerca i visualitza PDF directament al navegador. +--- + +# Editor de PDF + +L'Editor de PDF de BentoPDF et permet anotar, ressaltar, censurar, comentar, afegir formes i imatges i fer cerques als teus PDF. Carrega un editor complet directament al navegador, sense càrregues a cap servidor. + +## Com funciona + +1. Puja el PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. L'editor de PDF integrat s'obre automàticament amb el document carregat. +3. Fes servir la barra d'eines per anotar, ressaltar, censurar, afegir text, dibuixar formes o inserir imatges. +4. Fes clic a **Baixa el PDF editat** per desar els canvis. + +## Funcions + +- Barra d'eines d'anotació completa amb ressaltat, subratllat, ratllat i dibuix a mà alçada +- Inserció de text i comentaris +- Eines de censura que eliminen permanentment el contingut marcat un cop apliques la censura. Si en fer clic a **Baixa el PDF editat** hi ha marques sense aplicar, l'editor ofereix aplicar-les primer. +- Eines de formes per a rectangles, cercles, línies i fletxes +- Inserció d'imatges a les pàgines del PDF +- Cerca de text integrada a tot el document +- Compatibilitat amb diversos documents amb pestanyes (fins a 10 documents oberts simultàniament) +- Càrrega de fitxers per arrossegament + +## Casos d'ús + +- Revisar contractes i marcar-hi els canvis amb ressaltats i comentaris +- Censurar informació confidencial, com números de la seguretat social o dades financeres, abans de compartir-la +- Afegir anotacions a plànols d'arquitectura o dibuixos d'enginyeria +- Inserir logotips o segells d'empresa a les pàgines d'un document +- Cercar termes concrets en documents jurídics extensos + +## Consells + +- Pots obrir diversos PDF alhora i canviar entre ells amb la barra de pestanyes de la part superior de l'editor. +- L'editor conserva l'estructura original del PDF, de manera que els tipus de lletra, els dissenys i els camps de formulari es mantenen intactes. +- Marcar un text o una àrea per censurar no elimina res fins que s'aplica la censura. Quan censures un text seleccionat, també se n'eliminen de la baixada les còpies que hi hagi a les propietats del fitxer, els marcadors, els comentaris i els fitxers adjunts, tret que el fitxer estigui xifrat. +- Per aplicar marques d'aigua o numeració de pàgines en massa, fes servir les eines específiques, que ofereixen més control sobre el format. + +## Eines relacionades + +- [Afegeix una marca d'aigua](./add-watermark) +- [Signa PDF](./sign-pdf) +- [Afegeix segells](./add-stamps) +- [Elimina les anotacions](./remove-annotations) diff --git a/docs/ca/tools/email-to-pdf.md b/docs/ca/tools/email-to-pdf.md new file mode 100644 index 00000000..bc0796f2 --- /dev/null +++ b/docs/ca/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Correu electrònic a PDF +description: Converteix fitxers de correu EML i MSG a PDF al navegador. Conserva les capçaleres, el cos i la llista de fitxers adjunts. +--- + +# Correu electrònic a PDF + +Converteix fitxers de correu desats en PDF nets i imprimibles. L'eina analitza fitxers EML i MSG, n'extreu el missatge complet (capçaleres, contingut del cos i metadades dels adjunts) i ho renderitza tot en un PDF estructurat. És útil per a la descoberta judicial, per conservar registres o simplement per imprimir un correu important. + +## Formats compatibles + +| Format | Extensió | Notes | +| :----- | :------- | :----------------------------------------------------------------------------- | +| EML | `.eml` | Format de correu MIME estàndard (exportat per la majoria de clients de correu) | +| MSG | `.msg` | Format propietari de Microsoft Outlook | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega i deixa anar els fitxers EML o MSG. Pots barrejar tots dos formats en un mateix lot. +2. Revisa la llista de fitxers. Elimina les entrades que no vulguis amb la icona de la paperera o fes clic a **Afegeix més fitxers** per incloure-hi més correus. +3. Configura les opcions de conversió (vegeu més avall). +4. Fes clic a **Converteix a PDF**. L'eina analitza cada correu, en renderitza el contingut com a HTML amb estil i el converteix a PDF amb el motor PyMuPDF. +5. Un sol correu es baixa directament com a PDF. Si són diversos, s'empaqueten a `emails-converted.zip`. + +## Opcions + +| Opció | Per defecte | Descripció | +| :-------------------------------------------------- | :---------- | :------------------------------------------------------------------------------------------------------------- | +| **Mida de pàgina** | A4 | Tria entre les dimensions de pàgina A4, Letter o Legal. | +| **Inclou els destinataris CC i CCO a la capçalera** | Activat | Si està activat, les llistes de destinataris en CC i CCO apareixen a la secció de capçalera del correu al PDF. | +| **Inclou la llista d'adjunts del correu** | Activat | Si està activat, al PDF apareix una llista dels fitxers adjunts del correu (amb noms i mides). | + +## Casos d'ús + +- Arxivar correspondència empresarial important en PDF per al compliment normatiu o l'auditoria +- Imprimir fils de correu per a procediments judicials o sol·licituds de descoberta +- Crear un registre permanent de confirmacions de comanda, rebuts o contractes rebuts per correu +- Fer una còpia de seguretat de fitxers MSG d'Outlook en un format que no requereixi Outlook per llegir-los +- Documentar interaccions d'atenció al client a partir de fitxers EML exportats + +## Consells + +- S'admeten tant els fitxers EML (que fan servir Thunderbird, Apple Mail i la majoria de clients de correu) com els MSG d'Outlook. Exporta els correus des del teu client de correu i deixa'ls anar directament a l'eina. +- Els correus en format HTML conserven l'estil al PDF. Els correus en text pla es renderitzen amb un format net i llegible. +- La llista d'adjunts mostra noms de fitxer i mides, però no incrusta els fitxers adjunts reals al PDF. + +## Eines relacionades + +- [XML a PDF](./xml-to-pdf) +- [XPS a PDF](./xps-to-pdf) diff --git a/docs/ca/tools/epub-to-pdf.md b/docs/ca/tools/epub-to-pdf.md new file mode 100644 index 00000000..a420d060 --- /dev/null +++ b/docs/ca/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB a PDF +description: Converteix llibres electrònics EPUB a PDF al navegador. Gratuït, sense càrrega de fitxers i amb una conversió que prioritza la privadesa. +--- + +# EPUB a PDF + +Converteix llibres electrònics EPUB en fitxers PDF sense sortir del navegador. EPUB és l'estàndard obert dels llibres digitals, però de vegades necessites un PDF de disseny fix per imprimir, anotar o compartir amb persones que no tenen un lector de llibres electrònics. + +## Formats compatibles + +| Format | Extensió | Notes | +| :----- | :------- | :---------------------- | +| EPUB | `.epub` | Fitxers EPUB 2 i EPUB 3 | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega i deixa anar els fitxers EPUB. Es permet la selecció múltiple. +2. Revisa els fitxers pujats. Elimina les entrades que no vulguis amb la icona de la paperera o fes clic a **Afegeix més fitxers** per ampliar el lot. +3. Fes clic a **Converteix a PDF**. El motor PyMuPDF renderitza el contingut de l'EPUB (text, imatges i format) en una sortida PDF paginada. +4. Un sol EPUB es baixa directament com a PDF. Si són diversos fitxers, s'empaqueten en un arxiu ZIP anomenat `epub-converted.zip`. + +## Opcions + +La conversió s'executa amb uns valors per defecte raonables i no requereix cap configuració. El text es reajusta a les dimensions de pàgina estàndard, i els tipus de lletra i les imatges incrustats passen al PDF. + +## Casos d'ús + +- Imprimir un llibre electrònic sense DRM per llegir-lo lluny de les pantalles +- Enviar un manuscrit EPUB com a PDF de disseny fix per a la revisió +- Arxivar llibres digitals en un format que tots els sistemes operatius poden obrir de manera nativa +- Compartir un capítol amb un company que no té un lector d'EPUB +- Convertir documentació tècnica distribuïda com a EPUB en PDF que es poden anotar + +## Consells + +- Les funcions d'EPUB 3, com l'àudio i el vídeo incrustats, no passaran al PDF, però tot el text, les imatges i les taules es converteixen sense problemes. +- Per obtenir els millors resultats amb EPUB amb molt d'estil, revisa les primeres pàgines del resultat per confirmar la fidelitat del disseny. + +## Eines relacionades + +- [MOBI a PDF](./mobi-to-pdf) +- [FB2 a PDF](./fb2-to-pdf) +- [CBZ a PDF](./cbz-to-pdf) diff --git a/docs/ca/tools/excel-to-pdf.md b/docs/ca/tools/excel-to-pdf.md new file mode 100644 index 00000000..c9dbe094 --- /dev/null +++ b/docs/ca/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel a PDF +description: Converteix fulls de càlcul d'Excel (XLS, XLSX), ODS i fitxers CSV a PDF conservant el format. +--- + +# Excel a PDF + +Converteix fitxers de full de càlcul en PDF. L'eina admet fitxers d'Excel moderns, el format XLS antic, fulls de càlcul OpenDocument i fins i tot CSV, tots renderitzats amb un motor LibreOffice al navegador que conserva el format de les cel·les, les fórmules (com a valors calculats), els gràfics i els dissenys de diversos fulls. + +## Formats compatibles + +| Format | Extensions | +| :-------------------------- | :--------- | +| Excel (modern) | `.xlsx` | +| Excel (antic) | `.xls` | +| Full de càlcul OpenDocument | `.ods` | +| CSV | `.csv` | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega i deixa anar els fitxers de full de càlcul. +2. Revisa la llista de fitxers. Afegeix-ne més o elimina els que no vulguis. +3. Fes clic a **Converteix a PDF**. El motor LibreOffice s'inicialitza la primera vegada que s'utilitza i després processa cada fitxer. +4. Un sol fitxer es baixa directament com a PDF. Si són diversos, es lliuren com a `excel-converted.zip`. + +## Opcions + +Aquesta eina no té cap configuració addicional. El motor LibreOffice determina el disseny de pàgina, l'escala i l'àrea d'impressió segons els paràmetres integrats del full de càlcul. + +## Resultat + +| Nombre d'entrades | Resultat | +| :---------------- | :------------------------------------------------------------------- | +| 1 fitxer | Baixada d'un únic PDF (nom de fitxer original amb l'extensió `.pdf`) | +| 2 o més fitxers | Arxiu ZIP (`excel-converted.zip`) amb un PDF per cada fitxer | + +## Casos d'ús + +- Convertir informes financers o pressupostos d'Excel a PDF per distribuir-los +- Crear PDF llestos per imprimir a partir de fulls de càlcul d'inventari o de catàlegs de productes +- Compartir els resultats d'una anàlisi de dades amb parts interessades que no tenen Excel instal·lat +- Arxivar informes trimestrals en un format no editable +- Convertir fitxers ODS de LibreOffice Calc a PDF + +## Consells + +- Els gràfics incrustats al full de càlcul es renderitzen al PDF. Assegura't que es vegin correctament al fitxer d'origen abans de convertir. +- Si el full de càlcul té diversos fulls, tots s'inclouen al PDF resultant. +- Per a dades CSV simples sense format, l'eina [CSV a PDF](./csv-to-pdf) ofereix una conversió més lleugera. Fes servir Excel a PDF quan necessitis conservar el format, els gràfics o diversos fulls. + +## Eines relacionades + +- [CSV a PDF](./csv-to-pdf) +- [Word a PDF](./word-to-pdf) +- [PowerPoint a PDF](./powerpoint-to-pdf) diff --git a/docs/ca/tools/extract-attachments.md b/docs/ca/tools/extract-attachments.md new file mode 100644 index 00000000..1a5f9975 --- /dev/null +++ b/docs/ca/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Extreu fitxers adjunts +description: Extreu tots els fitxers adjunts incrustats d'un o més PDF i baixa'ls com a arxiu ZIP. +--- + +# Extreu fitxers adjunts + +Extreu tots els adjunts incrustats d'un o més fitxers PDF. Tots els fitxers extrets s'agrupen en un únic arxiu ZIP per baixar-lo. + +## Com funciona + +1. Puja un o més fitxers PDF que continguin adjunts incrustats. +2. Fes clic a **Extreu fitxers adjunts**. +3. L'eina cerca adjunts de nivell de document i de nivell de pàgina a cada PDF. +4. Tots els fitxers trobats s'empaqueten en un arxiu ZIP i es baixen automàticament. +5. Un missatge d'estat confirma quants adjunts s'han trobat i la seva mida total. + +## Funcions + +- Extracció per lots de diversos PDF alhora +- Extreu tant els adjunts de nivell de document com els de nivell de pàgina +- Genera un únic fitxer ZIP amb tots els fitxers extrets +- Mostra el nombre total d'adjunts i la mida combinada dels fitxers +- Missatges d'estat clars si no es troba cap adjunt + +## Casos d'ús + +- Recuperar fitxers de dades incrustats en un PDF d'informe +- Extreure recursos d'imatge d'un porfoli o d'un document d'especificacions +- Extreure materials complementaris de PDF de formació o de compliment normatiu +- Auditar quins fitxers hi ha incrustats en un lot de PDF + +## Consells + +- Si l'eina informa que no hi ha adjunts, és possible que el PDF contingui imatges incrustades o dades de formulari, que no són fitxers adjunts. Fes servir [Extreu imatges](./extract-images) per a les imatges incrustades. +- Quan processes diversos PDF, tots els adjunts de tots els fitxers acaben en un sol ZIP. Els noms dels fitxers es conserven tal com eren a les incrustacions originals. + +## Eines relacionades + +- [Afegeix fitxers adjunts](./add-attachments) +- [Edita els fitxers adjunts](./edit-attachments) +- [Extreu imatges](./extract-images) diff --git a/docs/ca/tools/extract-images.md b/docs/ca/tools/extract-images.md new file mode 100644 index 00000000..a19ca888 --- /dev/null +++ b/docs/ca/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Extreu imatges +description: Extreu totes les imatges incrustades dels fitxers PDF. Previsualitza-les en una quadrícula i baixa-les individualment o com a arxiu ZIP. +--- + +# Extreu imatges + +Extreu totes les imatges incrustades d'un o més fitxers PDF. Les imatges extretes es mostren en una quadrícula de previsualització on pots baixar-les individualment o agafar-ho tot alhora en un ZIP. Funciona amb PyMuPDF. + +## Com funciona + +1. Puja un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. Afegeix-ne més o elimina'n d'individuals segons calgui. +2. Fes clic a **Extreu imatges** per iniciar el processament. +3. L'eina explora totes les pàgines de tots els PDF pujats, i troba i extreu les imatges incrustades. +4. Les imatges extretes apareixen en una quadrícula amb miniatures. Cada imatge té un botó de baixada. +5. Fes clic a **Baixa-ho tot** per desar-ho tot com a arxiu ZIP. + +## Opcions + +Aquesta eina no té opcions configurables. Totes les imatges incrustades s'extreuen en el seu format original (normalment PNG, JPEG o el format que es va fer servir quan la imatge es va incrustar al PDF). + +## Format de sortida + +- Les imatges es mostren en una quadrícula de previsualització amb noms com `image_1.png`, `image_2.jpg`, etc. +- **Baixa-ho tot** genera `extracted-images.zip` amb totes les imatges. +- Les imatges es poden baixar una a una des de la quadrícula. + +## Casos d'ús + +- Recuperar fotos o gràfics d'un PDF per reutilitzar-los en un altre projecte. +- Extreure imatges de productes d'un PDF de catàleg per a una fitxa de comerç electrònic. +- Treure diagrames de documentació tècnica per fer-los servir en presentacions. +- Auditar quines imatges hi ha incrustades en un document abans de compartir-lo. + +## Consells + +- L'eina extreu les imatges exactament com estan emmagatzemades al PDF. No torna a renderitzar les pàgines com a imatges: per a això, fes servir [PDF a PNG](./pdf-to-png) o [PDF a JPG](./pdf-to-jpg). +- Si l'eina informa de "No s'ha trobat cap imatge", és possible que el PDF faci servir gràfics vectorials en lloc d'imatges de mapa de bits incrustades, o que sigui un document escanejat on tota la pàgina és una sola imatge gran. +- El processament per lots funciona amb diversos PDF. Totes les imatges de tots els fitxers es combinen en una única quadrícula i en un sol ZIP. + +## Eines relacionades + +- [PDF a PNG](./pdf-to-png) +- [PDF a JPG](./pdf-to-jpg) +- [Creador de fluxos de treball PDF](./pdf-workflow) diff --git a/docs/ca/tools/extract-pages.md b/docs/ca/tools/extract-pages.md new file mode 100644 index 00000000..4fdfe084 --- /dev/null +++ b/docs/ca/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Extreu pàgines +description: Desa un interval concret de pàgines d'un PDF com a document nou. +--- + +# Extreu pàgines + +Extreu un conjunt de pàgines d'un PDF i desa-les com a fitxer nou. Indica exactament quines pàgines vols amb la sintaxi d'intervals i l'eina crea un PDF net que conté només aquestes pàgines. + +## Com funciona + +1. Puja un fitxer PDF. L'eina mostra el nom del fitxer, la mida i el nombre total de pàgines. +2. Introdueix les pàgines que vols extreure amb la sintaxi d'intervals (p. ex., `1-5`, `3, 7, 10-12`). +3. Si vols, tria baixar cada interval com un PDF separat en un arxiu ZIP. +4. Fes clic al botó de processar. Les pàgines extretes es baixen com un PDF nou (o un ZIP). + +## Funcions + +- Sintaxi d'intervals de pàgines flexible: pàgines individuals, intervals o combinacions separades per comes +- Mostra el nombre total de pàgines després de la càrrega per consultar-lo fàcilment +- Opció de generar un únic PDF combinat o fitxers separats en un ZIP +- Conserva el contingut i el format originals de les pàgines + +## Casos d'ús + +- Extreure el resum executiu (les primeres pàgines) d'un informe extens +- Extreure un sol capítol d'un PDF de llibre de text +- Desar pàgines concretes d'un paquet de formularis com a documents independents +- Crear un document de mostra a partir de pàgines seleccionades d'un fitxer més gran + +## Consells + +- Els números de pàgina comencen a 1. Fes servir `1` per a la primera pàgina, no `0`. +- Per eliminar pàgines en lloc d'extreure-les, fes servir [Suprimeix pàgines](./delete-pages), que és l'operació inversa. +- Si necessites una selecció visual de pàgines amb miniatures, fes servir [Divideix PDF](./split-pdf) en mode Visual Select. + +## Eines relacionades + +- [Divideix PDF](./split-pdf) +- [Suprimeix pàgines](./delete-pages) +- [Fusiona PDF](./merge-pdf) diff --git a/docs/ca/tools/extract-tables.md b/docs/ca/tools/extract-tables.md new file mode 100644 index 00000000..9f823017 --- /dev/null +++ b/docs/ca/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Extreu taules de PDF +description: Detecta i extreu taules de documents PDF. Exporta-les com a CSV, JSON o Markdown amb una granularitat per taula. +--- + +# Extreu taules de PDF + +Detecta totes les taules d'un PDF i et permet exportar-les en el format que triïs: CSV, JSON o Markdown. Cada taula s'extreu individualment amb metadades de pàgina i de posició. Funciona amb el motor de detecció de taules de PyMuPDF. + +## Com funciona + +1. Puja un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Selecciona el **format d'exportació** que prefereixis: CSV, JSON o Markdown. +3. Fes clic a **Extreu taules** per iniciar el processament. +4. Si es troba una sola taula, es baixa com un únic fitxer. Si n'hi ha diverses, es genera un arxiu ZIP amb un fitxer per taula. + +## Opcions + +- **Format d'exportació**: tria entre: + - **CSV**: valors separats per comes, amb les cometes adequades als camps que contenen comes, cometes o salts de línia. Adequat per a fulls de càlcul i bases de dades. + - **JSON**: estructura de matrius de matrius, amb format llegible i sagnat de 2 espais. Adequat per al consum programàtic. + - **Markdown**: format de taula delimitada per barres verticals renderitzat per PyMuPDF. Adequat per a documentació i fitxers README. + +## Format de sortida + +- **Una sola taula**: `filename_table.csv` (o `.json` / `.md`) +- **Diverses taules**: `filename_tables.zip` amb fitxers anomenats `table_1_page3.csv`, `table_2_page5.csv`, etc. + +## Casos d'ús + +- Extreure taules concretes d'informes PDF extensos sense treure les dades de tot el document. +- Obtenir taules en format Markdown per enganxar-les directament a incidències de GitHub, wikis o documentació. +- Obtenir dades JSON estructurades de les taules d'un PDF per a integracions d'API o scripts. +- Comparar taules entre diferents versions d'un PDF exportant-ne totes dues a CSV i comparant-les. + +## Consells + +- Aquesta eina et dona control per taula. Si només vols abocar totes les taules en un únic CSV, fes servir [PDF a CSV](./pdf-to-csv). Per a un llibre d'Excel complet, fes servir [PDF a Excel](./pdf-to-excel). +- Les taules que s'estenen per diverses pàgines es poden detectar com a taules separades per pàgina. Potser les hauràs de concatenar manualment. +- Si no es detecta cap taula, és possible que el PDF sigui una imatge escanejada. Passa'l primer per l'OCR per afegir-hi una capa de text. + +## Eines relacionades + +- [PDF a CSV](./pdf-to-csv) +- [PDF a Excel](./pdf-to-excel) +- [PDF a text](./pdf-to-text) diff --git a/docs/ca/tools/fb2-to-pdf.md b/docs/ca/tools/fb2-to-pdf.md new file mode 100644 index 00000000..230badce --- /dev/null +++ b/docs/ca/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 a PDF +description: Converteix llibres electrònics FictionBook (FB2) a PDF al navegador. Gratuït, privat i sense pujar res a cap servidor. +--- + +# FB2 a PDF + +Converteix fitxers FictionBook 2 (FB2) en documents PDF. FB2 és un format de llibre electrònic basat en XML molt popular a Rússia i a l'Europa de l'Est. Tot i que algunes plataformes el reconeixen bé, en moltes altres és pràcticament desconegut: convertir-lo a PDF fa que els teus llibres es puguin llegir a qualsevol lloc. + +## Formats compatibles + +| Format | Extensió | Notes | +| :------------ | :------- | :--------------------------------------- | +| FictionBook 2 | `.fb2` | Format de llibre electrònic basat en XML | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers FB2. Pots seleccionar-ne diversos alhora. +2. Revisa la llista de fitxers. Fes servir la icona de la paperera per eliminar-ne de concrets, o **Afegeix més fitxers** per incloure'n més. +3. Fes clic a **Converteix a PDF**. El motor PyMuPDF analitza l'estructura XML de l'FB2 i la renderitza com a contingut de PDF paginat. +4. Si és un sol fitxer, es baixa directament com a PDF. Si en converteixes diversos, s'agrupen a `fb2-converted.zip`. + +## Opcions + +No cal configurar res. El convertidor gestiona automàticament l'estructura XML de l'FB2 i conserva els salts de capítol, el format i les imatges incrustades. + +## Casos d'ús + +- Llegir llibres FB2 en dispositius o aplicacions que només admeten PDF +- Imprimir literatura en rus distribuïda en format FB2 +- Arxivar una biblioteca FB2 en un format compatible arreu +- Compartir un llibre amb algú el lector del qual no admet FictionBook + +## Consells + +- Els fitxers FB2 són XML pla, de manera que solen ser petits i es converteixen ràpidament, fins i tot al navegador. +- Si els teus fitxers FB2 estan comprimits com a `.fb2.zip`, extreu-los abans de pujar-los. + +## Eines relacionades + +- [EPUB a PDF](./epub-to-pdf) +- [MOBI a PDF](./mobi-to-pdf) +- [XML a PDF](./xml-to-pdf) diff --git a/docs/ca/tools/fix-page-size.md b/docs/ca/tools/fix-page-size.md new file mode 100644 index 00000000..502da253 --- /dev/null +++ b/docs/ca/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Uniformitza la mida de pàgina +description: Uniformitza totes les pàgines d'un PDF a la mateixa mida. Tria una mida de paper estàndard o defineix dimensions personalitzades. +--- + +# Uniformitza la mida de pàgina + +Els PDF muntats a partir de diverses fonts solen tenir pàgines de mides diferents: unes en Letter, unes altres en A4 i d'altres amb mides gens estàndard. Aquesta eina força totes les pàgines a una única mida de destinació i escala el contingut perquè hi càpiga o l'ompli, segons el cas. + +## Com funciona + +1. Puja un fitxer PDF. +2. Selecciona una **Mida de pàgina de destinació** al desplegable (A4, Letter, Legal, A3, A5, Tabloid o Personalitzada). +3. Tria una **Orientació**: Automàtica conserva l'orientació original de cada pàgina, o bé pots forçar Vertical o Horitzontal. +4. Escull un mode d'**Escalat del contingut**: Ajusta (conserva tot el contingut i pot afegir marges) o Omple (omple la pàgina i pot retallar les vores). +5. Si vols, defineix un **Color de fons** per als marges afegits. +6. Fes clic a **Uniformitza la mida de pàgina**. + +## Opcions + +- **Mides estàndard**: A4, Letter, Legal, A3, A5, Tabloid +- **Dimensions personalitzades**: introdueix l'amplada i l'alçada en polzades o mil·límetres +- **Orientació**: Automàtica, Vertical, Horitzontal +- **Mode d'escalat**: Ajusta o Omple (retalla) +- **Color de fons**: qualsevol color per als marges + +## Casos d'ús + +- Normalitzar un PDF fusionat amb pàgines que provenen d'escàners diferents +- Convertir un document en US Letter a A4 per distribuir-lo internacionalment +- Preparar PDF llestos per imprimir que requereixen una mida de tall uniforme +- Corregir pàgines que no s'ajusten gaire a l'estàndard (p. ex., 8,49 x 11,02 polzades en lloc de 8,5 x 11) + +## Consells + +- Fes servir el mode Ajusta per garantir que no es perdi cap contingut. El mode Omple té un aspecte més net, però pot tallar les vores. +- Comprova el resultat amb l'eina Dimensions de pàgina per confirmar que totes les pàgines coincideixen amb la mida de destinació. +- El blanc és el color de fons per defecte; canvia'l a un color fosc si el teu document té marges foscos. + +## Eines relacionades + +- [Dimensions de pàgina](./page-dimensions): inspecciona les mides de pàgina abans i després de la correcció +- [Comprimeix PDF](./compress-pdf): redueix la mida del fitxer després d'uniformitzar-lo +- [Retalla PDF](./crop-pdf): retalla les pàgines manualment en lloc d'escalar-les automàticament diff --git a/docs/ca/tools/flatten-pdf.md b/docs/ca/tools/flatten-pdf.md new file mode 100644 index 00000000..f67a613a --- /dev/null +++ b/docs/ca/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Aplana PDF +description: Aplana els formularis interactius i les anotacions en contingut estàtic. Fa que els camps del formulari no es puguin editar i incrusta les anotacions a la pàgina. +--- + +# Aplana PDF + +Aplanar fusiona els elements interactius (camps de formulari, desplegables, caselles de selecció, anotacions, ressaltats, notes adhesives) directament amb el contingut de la pàgina. L'aspecte visual es manté, però ja no es pot editar ni extreure res. És l'equivalent en PDF d'imprimir un formulari emplenat i tornar-lo a escanejar, tot i que la qualitat es manté perfecta. + +## Com funciona + +1. Puja un o més fitxers PDF. +2. Fes clic a **Aplana PDF**. +3. Un sol fitxer es baixa directament. Si en són diversos, es genera un arxiu ZIP. + +L'eina fa servir pdf-lib per aplanar els camps del formulari (mitjançant `form.flatten()`) i un aplanador d'anotacions propi per incrustar les anotacions al flux de la pàgina. Ambdues operacions es fan en una sola passada. + +## Què s'aplana + +- **Camps de formulari**: camps de text, caselles de selecció, botons d'opció, desplegables, camps de signatura +- **Anotacions**: comentaris, ressaltats, text ratllat, subratllat, notes adhesives, segells, anotacions de tinta +- **Elements interactius**: botons, activadors d'accions + +## Què no canvia + +- El contingut de text (continua sent seleccionable i es pot cercar) +- Imatges i gràfics +- El disseny i les dimensions de la pàgina +- Marcadors i taula de continguts +- Enllaços (tret que estiguin basats en anotacions) + +## Casos d'ús + +- Bloquejar un formulari emplenat perquè els destinataris no puguin canviar les respostes enviades +- Preparar un PDF per arxivar-lo quan els elements interactius no són necessaris +- Corregir problemes de visualització causats per anotacions que es mostren diferent segons el visor +- Assegurar que un document signat no es pugui modificar després d'aplicar la signatura +- Reduir la mida del fitxer eliminant les definicions de camps de formulari i els objectes d'anotació + +## Consells + +- Aplana quan hagis acabat totes les edicions. No hi ha cap manera de desfer l'aplanament d'un PDF. +- Si necessites aplanar i, a més, eliminar metadades, JavaScript i fitxers adjunts, fes servir l'eina Neteja PDF: inclou l'aplanament com una de les seves opcions. +- Alguns PDF indiquen «no s'ha trobat cap formulari»: és normal si el document només té anotacions i cap camp de formulari. + +## Eines relacionades + +- [Neteja PDF](./sanitize-pdf): aplana formularis i, a més, elimina metadades, scripts i més +- [Rasteritza PDF](./rasterize-pdf): converteix a un PDF basat en imatges per a un aplanament màxim +- [Converteix tipus de lletra en contorns](./font-to-outline): aplana els tipus de lletra en traçats vectorials +- [Xifra PDF](./protect-pdf): bloqueja el PDF aplanat amb una contrasenya diff --git a/docs/ca/tools/font-to-outline.md b/docs/ca/tools/font-to-outline.md new file mode 100644 index 00000000..e20e0b73 --- /dev/null +++ b/docs/ca/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Converteix tipus de lletra en contorns +description: Converteix tots els tipus de lletra d'un PDF en contorns vectorials per obtenir una renderització coherent a tots els dispositius. Elimina els problemes de dependència de tipus de lletra. +--- + +# Converteix tipus de lletra en contorns + +Convertir els tipus de lletra en contorns transforma cada caràcter de text, que deixa de ser un glif basat en un tipus de lletra i passa a ser un traçat vectorial. El PDF ja no depèn de cap tipus de lletra instal·lat: es veu igual a tots els dispositius, a tots els sistemes operatius i a totes les impressores. És un pas estàndard en els fluxos de treball de preimpressió. + +## Com funciona + +1. Puja un o més fitxers PDF. +2. Fes clic a **Converteix en contorns**. +3. Ghostscript converteix tot el text en traçats vectorials. +4. Baixa el resultat. Si en són diversos fitxers, es genera un arxiu ZIP. + +No hi ha cap paràmetre per configurar. L'eina fa servir Ghostscript (WebAssembly) per convertir totes les referències a tipus de lletra en traçats de contorn en una sola passada. + +## Què canvia + +- Els caràcters de text passen a ser corbes vectorials (traçats de Bézier) +- Ja no cal incrustar els tipus de lletra: el PDF és autònom a nivell de glif +- La mida del fitxer pot augmentar perquè els traçats vectorials solen pesar més que les referències a tipus de lletra +- L'aspecte visual es conserva exactament + +## Què es perd + +- La selecció de text i copiar i enganxar +- La possibilitat de cercar text (Ctrl+F deixa de funcionar) +- La capacitat d'editar el contingut del text +- L'accessibilitat per a lectors de pantalla + +## Casos d'ús + +- Enviar PDF a una impremta que exigeix tipus de lletra en contorns +- Compartir documents que fan servir tipus de lletra personalitzats o amb llicència amb persones que no els tenen +- Evitar la substitució de tipus de lletra que canvia l'aspecte del document en altres sistemes +- Preparar PDF per a fluxos de gravat làser o tall CNC que requereixen entrada vectorial +- Assegurar que un PDF ple de logotips es mostri correctament a totes les plataformes + +## Consells + +- Conserva el PDF original. Convertir en contorns és irreversible: no es poden tornar a convertir els traçats en text editable. +- Si necessites que el text es pugui seguir cercant, considera l'eina Rasteritza PDF amb OCR com a pas posterior. +- Els PDF amb contorns solen ser més grans. Executa després Comprimeix PDF si la mida del fitxer és important. + +## Eines relacionades + +- [Aplana PDF](./flatten-pdf): aplana formularis i anotacions sense tocar els tipus de lletra +- [Rasteritza PDF](./rasterize-pdf): converteix a un PDF basat en imatges en lloc de contorns vectorials +- [Comprimeix PDF](./compress-pdf): redueix la mida del fitxer després de convertir en contorns +- [PDF a PDF/A](./pdf-to-pdfa): converteix per arxivar després d'assegurar la independència dels tipus de lletra diff --git a/docs/ca/tools/form-creator.md b/docs/ca/tools/form-creator.md new file mode 100644 index 00000000..2d1a8807 --- /dev/null +++ b/docs/ca/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Crea un formulari PDF +description: Crea formularis PDF emplenables amb camps de text, caselles de selecció, desplegables, botons d'opció i més, arrossegant i deixant anar. +--- + +# Crea un formulari PDF + +Dissenya formularis PDF emplenables professionals des de zero o afegint camps a un PDF existent. L'editor visual et permet arrossegar i deixar anar elements de formulari (camps de text, caselles de selecció, desplegables, botons d'opció, camps de signatura i més) directament sobre les vistes prèvies de les pàgines. Configura les propietats dels camps, defineix regles de visibilitat condicional i exporta un formulari PDF totalment interactiu. + +## Com funciona + +1. Puja un PDF existent **o** fes clic a **Crea un PDF en blanc** per començar de zero. +2. Si crees un PDF en blanc, selecciona una mida de pàgina (Letter, A4, A5, Legal, Tabloid, A3 o dimensions personalitzades). +3. S'obre l'editor de formularis amb una barra d'eines amb els tipus de camp i una àrea de vista prèvia de la pàgina. +4. Selecciona un tipus de camp a la barra d'eines i fes clic a la pàgina per col·locar-lo. +5. Arrossega els camps per canviar-ne la posició. Fes servir els tiradors per ajustar-ne les dimensions. +6. Fes clic en un camp per obrir el tauler de propietats, on pots definir el nom del camp, el valor per defecte, la mida de la lletra, l'alineació i més. +7. Navega entre pàgines amb els controls de pàgina. +8. Fes clic a **Desa** per baixar el PDF emplenable acabat. + +## Funcionalitats + +- Col·locació de camps arrossegant i deixant anar, amb tiradors visuals per redimensionar +- Tipus de camp: entrada de text, text multilínia, casella de selecció, desplegable, botó d'opció, signatura, data, número i codi de barres +- Tauler de propietats per configurar el nom, l'etiqueta, el valor per defecte, la mida de la lletra, el color, l'alineació i la validació de cada camp +- Accions de camp i regles de visibilitat condicional (mostrar o amagar camps segons els valors d'altres camps) +- Navegació per pàgines per a formularis de diverses pàgines +- Extracció de camps existents: detecta i importa automàticament els camps de formulari dels PDF pujats +- Compatibilitat amb PDF pujats i pàgines en blanc com a llenç del formulari +- Diverses mides de pàgina predefinides, a més de dimensions personalitzades +- Generació de codis de barres amb bwip-js +- Gestió de grups de botons d'opció + +## Opcions + +**Mides de pàgina predefinides (per a PDF en blanc):** + +- Letter (8,5" x 11") +- A4 (210 mm x 297 mm) +- A5 (148 mm x 210 mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297 mm x 420 mm) +- Personalitzada (indica l'amplada i l'alçada) + +**Propietats dels camps (varien segons el tipus de camp):** + +- Nom, etiqueta i text de subtítol +- Valor per defecte +- Família, mida i color de la lletra +- Alineació del text (esquerra, centre, dreta) +- Interruptor de camp obligatori +- Interruptor de només lectura +- Longitud màxima dels camps de text +- Llista d'opcions per a desplegables i botons d'opció +- Accions de visibilitat condicional + +## Casos d'ús + +- Crear formularis d'acollida d'empleats amb camps de text per a les dades personals i caselles de selecció per acceptar polítiques +- Crear qüestionaris d'entrada de clients amb desplegables per triar el servei +- Dissenyar formularis de comanda amb camps calculats i identificadors de codi de barres +- Crear llistes de control d'inspecció amb botons d'opció per a valoracions d'apte o no apte +- Crear formularis d'enquesta amb preguntes de seguiment condicionals que apareixen segons les respostes + +## Consells + +- Si puges un PDF existent, l'eina intentarà extreure'n els camps de formulari que ja hi hagi, perquè els puguis editar o ampliar. +- Fes servir la funció de grup de botons d'opció per crear seleccions mútuament excloents. Els camps del mateix grup comparteixen un nom de grup. +- Prova el formulari baixant-lo i obrint-lo a l'[Emplena formularis PDF](./form-filler) per comprovar el comportament dels camps. + +## Eines relacionades + +- [Emplena formularis PDF](./form-filler) +- [Signa PDF](./sign-pdf) +- [Editor de PDF](./edit-pdf) diff --git a/docs/ca/tools/form-filler.md b/docs/ca/tools/form-filler.md new file mode 100644 index 00000000..971f4742 --- /dev/null +++ b/docs/ca/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Emplena formularis PDF +description: Emplena formularis PDF, inclosos els formularis XFA, directament al navegador amb un visor integrat. +--- + +# Emplena formularis PDF + +Obre un PDF amb camps de formulari i emplena'l directament en un visor integrat. L'eina admet tant els camps AcroForm estàndard com els formularis XFA (XML Forms Architecture) heretats. Quan hagis acabat el formulari, baixa la versió emplenada amb un sol clic. + +## Com funciona + +1. Puja un PDF que contingui camps de formulari. +2. El document s'obre en un visor de PDF integrat que mostra els camps de formulari com a entrades interactives. +3. Fes clic als camps de text, les caselles de selecció, els desplegables i els botons d'opció per emplenar-los. +4. Fes clic a **Desa i baixa el formulari emplenat** per obtenir el PDF completat. + +## Funcionalitats + +- Visor PDF.js integrat amb interacció completa amb els camps de formulari +- Compatibilitat amb els camps AcroForm estàndard (entrades de text, caselles de selecció, desplegables, botons d'opció) +- Compatibilitat amb formularis XFA per a formularis heretats basats en XML +- Mida del visor ajustada automàticament segons les dimensions de la pàgina +- Visualització del fitxer amb el nom i la mida + +## Opcions + +No hi ha opcions de configuració addicionals. Puja el formulari, emplena'l i baixa'l. + +## Casos d'ús + +- Completar formularis d'impostos, sol·licituds d'assegurança o tràmits administratius +- Emplenar formularis de sol·licitud de feina rebuts com a fitxers PDF adjunts +- Completar formularis d'alta de proveïdors o qüestionaris per a proveïdors +- Aprovar llistes de control de compliment amb camps de casella de selecció +- Emplenar formularis mèdics d'ingrés abans d'una cita + +## Consells + +- Els formularis XFA són un format heretat que només admeten alguns visors de PDF. Si obres un PDF XFA a Chrome o a la majoria d'altres eines i veus pàgines en blanc, vol dir que aquests visors no admeten XFA. L'emplenador de formularis de BentoPDF i Firefox gestionen correctament l'XFA. +- Per als PDF sense camps de formulari, fes servir l'eina [Crea un formulari PDF](./form-creator) per afegir-hi camps primer i després emplena'ls aquí. +- El visor ajusta automàticament la mida perquè coincideixi amb les dimensions de la pàgina del PDF. + +## Eines relacionades + +- [Crea un formulari PDF](./form-creator) +- [Signa PDF](./sign-pdf) +- [Editor de PDF](./edit-pdf) diff --git a/docs/ca/tools/header-footer.md b/docs/ca/tools/header-footer.md new file mode 100644 index 00000000..6f282bcb --- /dev/null +++ b/docs/ca/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Capçalera i peu de pàgina +description: Afegeix text personalitzable de capçalera i peu de pàgina a les pàgines d'un PDF amb variables dinàmiques de número de pàgina. +--- + +# Capçalera i peu de pàgina + +Afegeix text a sis posicions de les pàgines del PDF: capçalera esquerra, capçalera centre, capçalera dreta, peu esquerre, peu centre i peu dret. L'eina admet variables dinàmiques per al número de pàgina i el total de pàgines, de manera que pots crear plantilles com «Pàgina 3 de 10» que s'actualitzen automàticament a cada pàgina. + +## Com funciona + +1. Puja el fitxer PDF. +2. Apareix el tauler d'opcions amb els controls de format i sis camps de text. +3. Escriu el text que vulguis en qualsevol de les posicions de capçalera o peu. +4. Fes servir els marcadors `{page}` i `{total}` per a la numeració dinàmica de pàgines. +5. Ajusta la mida i el color de la lletra i, si vols, limita-ho a un interval de pàgines concret. +6. Fes clic a **Afegeix capçalera i peu de pàgina** per processar i baixar el resultat. + +## Opcions + +- **Interval de pàgines**: limita, si vols, quines pàgines porten capçalera i peu. Deixa-ho buit per aplicar-ho a totes. Format: «1-3, 5» (intervals separats per comes). +- **Mida de la lletra**: entre 6 i 24 punts. Per defecte, 10. +- **Color de la lletra**: tria qualsevol color amb el selector de color. +- **Capçalera esquerra / centre / dreta**: camps de text per a la part superior de cada pàgina. +- **Peu esquerre / centre / dret**: camps de text per a la part inferior de cada pàgina. + +## Funcionalitats + +- Sis posicions de text independents per pàgina +- Variable dinàmica `{page}` que insereix el número de la pàgina actual +- Variable dinàmica `{total}` que insereix el nombre total de pàgines +- Filtratge per interval de pàgines per afectar només pàgines concretes +- Mida i color de la lletra personalitzables +- Tipus de lletra Helvetica per a un resultat net i professional + +## Casos d'ús + +- Afegir «Pàgina {page} de {total}» al peu centre d'un informe +- Posar el nom de l'empresa a la capçalera esquerra i la data del document a la capçalera dreta +- Afegir avisos de confidencialitat al peu dels documents legals +- Estampar els números de revisió del document en intervals de pàgines concrets + +## Consells + +- Combina `{page}` i `{total}` en un sol camp per a formats com «Pàgina {page} de {total}» o «{page}/{total}». +- Pots deixar la majoria dels camps buits i omplir només les posicions que necessitis. Els camps buits simplement s'ometen. +- Per a capçaleres més complexes amb imatges o logotips, considera l'eina [Afegeix una marca d'aigua](./add-watermark) col·locada a la part superior de la pàgina. + +## Eines relacionades + +- [Números de pàgina](./page-numbers) +- [Afegeix una marca d'aigua](./add-watermark) +- [Numeració Bates](./bates-numbering) diff --git a/docs/ca/tools/heic-to-pdf.md b/docs/ca/tools/heic-to-pdf.md new file mode 100644 index 00000000..cfba98ca --- /dev/null +++ b/docs/ca/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC a PDF +description: Converteix imatges HEIC i HEIF d'iPhone i iPad a PDF directament al navegador. +--- + +# HEIC a PDF + +Converteix imatges HEIC/HEIF a PDF. HEIC és el format de foto per defecte dels iPhone i els iPad des d'iOS 11. Aquesta eina et permet convertir aquestes fotos en PDF sense instal·lar cap programa d'escriptori ni pujar fitxers a cap servidor. + +## Formats compatibles + +| Format | Extensions | +| :----- | :--------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers HEIC/HEIF. +2. Revisa la llista de fitxers i elimina els que no vulguis. +3. Fes clic a **Converteix a PDF**. El resultat es baixa com a `from_heic.pdf`. + +Cada fitxer HEIC es descodifica amb la biblioteca heic2any, que el converteix a PNG amb una qualitat del 92 %. Després, el PNG s'incrusta al PDF amb pdf-lib, amb cada imatge en una pàgina pròpia a resolució completa. + +## Opcions + +Aquesta eina no ofereix paràmetres addicionals. Les imatges HEIC es converteixen a PNG amb alta qualitat (0,92) abans d'incrustar-les. + +## Casos d'ús + +- Crear un PDF a partir de fotos d'iPhone per adjuntar-lo a una reclamació d'assegurança o a un informe +- Convertir fotos HEIC per a un anunci immobiliari en un únic document imprimible +- Convertir captures de pantalla d'iPad (format HEIF) en un PDF que es pugui compartir +- Convertir per lots fotos de vacances per a un diari de viatge + +## Consells + +- La descodificació de HEIC es fa íntegrament al navegador amb WebAssembly. La primera conversió pot trigar una mica mentre es carrega el descodificador. +- Si necessites barrejar HEIC amb altres formats d'imatge (JPG, PNG, etc.), fes servir l'eina [Imatges a PDF](./image-to-pdf), que gestiona HEIC juntament amb tots els altres formats. +- Els fitxers HEIC dels iPhone sovint contenen dades EXIF, com ara coordenades GPS. El PDF resultant no conserva aquestes metadades. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [JPG a PDF](./jpg-to-pdf) +- [PNG a PDF](./png-to-pdf) diff --git a/docs/ca/tools/image-to-pdf.md b/docs/ca/tools/image-to-pdf.md new file mode 100644 index 00000000..ec345595 --- /dev/null +++ b/docs/ca/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Imatges a PDF +description: Converteix JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD i més de 10 formats d'imatge en un únic fitxer PDF. +--- + +# Imatges a PDF + +El convertidor universal d'imatges a PDF. Puja imatges en pràcticament qualsevol format i combina-les en un únic document PDF. Cada imatge té la seva pròpia pàgina, amb la mida de l'original. + +## Formats compatibles + +| Format | Extensions | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Aquesta és la compatibilitat de formats més àmplia de tots els convertidors d'imatges de BentoPDF. Si només necessites un format concret, fes servir una de les eines dedicades. + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers d'imatge. Pots seleccionar-ne diversos alhora. +2. Revisa la llista de fitxers. Elimina els que no vulguis amb la icona de la paperera, o fes clic a **Afegeix més fitxers** per incloure més imatges. +3. Tria un nivell de **Qualitat del PDF** al desplegable. +4. Fes clic a **Converteix a PDF**. L'eina processa les imatges amb el motor PyMuPDF i baixa el resultat com a `images_to_pdf.pdf`. + +## Opcions + +**Qualitat del PDF** controla la compressió que s'aplica a les imatges en incrustar-les al PDF: + +- **Alta qualitat**: compressió mínima, mida de fitxer més gran. Ideal per a impressió o arxiu. +- **Qualitat mitjana** (per defecte): compressió equilibrada. Bona per a la majoria d'usos. +- **Baixa qualitat**: compressió agressiva, la mida de fitxer més petita. Adequada per al correu electrònic o per compartir ràpidament. + +Els fitxers HEIC i WebP es converteixen automàticament a PNG abans d'incrustar-los. Es fa de manera transparent i no requereix cap pas addicional. + +## Casos d'ús + +- Combinar en un sol PDF tiquets o documents escanejats amb la càmera del mòbil +- Crear un portafoli de fotos o un catàleg a partir d'imatges de formats diversos +- Convertir fotos d'iPhone (HEIC) en un PDF que es pugui compartir sense instal·lar cap programa d'escriptori +- Muntar maquetes de disseny a partir d'exportacions PSD i captures de pantalla com a lliurable per a un client +- Arxivar una carpeta de formats d'imatge antics (PNM, JXR, JP2) com un únic PDF + +## Consells + +- L'ordre de les imatges al PDF coincideix amb l'ordre de la llista de fitxers. Puja-les en la seqüència que vulguis. +- Per obtenir la mida de fitxer més petita possible, tria Baixa qualitat. La diferència visual sol ser insignificant en escanejos amb molt de text. +- Si només tens un format d'imatge, els convertidors dedicats (JPG a PDF, PNG a PDF, etc.) donen el mateix resultat amb una interfície més senzilla. + +## Eines relacionades + +- [JPG a PDF](./jpg-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [HEIC a PDF](./heic-to-pdf) +- [WebP a PDF](./webp-to-pdf) diff --git a/docs/ca/tools/index.md b/docs/ca/tools/index.md new file mode 100644 index 00000000..15b8fb79 --- /dev/null +++ b/docs/ca/tools/index.md @@ -0,0 +1,183 @@ +# Referència d'eines + +BentoPDF ofereix **més de 130 eines** per treballar amb PDF. Totes les eines s'executen íntegrament al navegador: els teus fitxers no surten mai del dispositiu. + +--- + +## Edita i anota + +Modifica, marca i millora els teus documents PDF amb un conjunt complet d'eines d'edició. + +
+ +- [**Editor de PDF**](./edit-pdf): anota, ressalta, censura, comenta, afegeix formes i imatges, cerca i visualitza PDF. +- [**Edita els marcadors**](./bookmark): afegeix, edita, importa, elimina i extreu marcadors de PDF. +- [**Taula de continguts**](./table-of-contents): genera una pàgina de taula de continguts a partir dels marcadors del PDF. +- [**Números de pàgina**](./page-numbers): insereix números de pàgina al document. +- [**Afegeix etiquetes de pàgina**](./add-page-labels): aplica etiquetes de pàgina de PDF amb números romans, prefixos i inicis personalitzats. +- [**Numeració Bates**](./bates-numbering): afegeix números Bates seqüencials a un o més fitxers PDF. +- [**Afegeix una marca d'aigua**](./add-watermark): estampa text o una imatge sobre les pàgines del PDF. +- [**Capçalera i peu de pàgina**](./header-footer): afegeix text a la part superior i inferior de les pàgines. +- [**Inverteix els colors**](./invert-colors): crea una versió en mode fosc del PDF. +- [**Efecte d'escàner**](./scanner-effect): fes que el PDF sembli un document escanejat. +- [**Ajusta els colors**](./adjust-colors): ajusta amb precisió la brillantor, el contrast, la saturació i més. +- [**Color de fons**](./background-color): canvia el color de fons del PDF. +- [**Canvia el color del text**](./text-color): canvia el color del text del PDF. +- [**Signa PDF**](./sign-pdf): dibuixa, escriu o puja la teva signatura. +- [**Afegeix segells**](./add-stamps): afegeix segells d'imatge al PDF amb la barra d'eines d'anotacions. +- [**Elimina les anotacions**](./remove-annotations): elimina comentaris, ressaltats i enllaços. +- [**Retalla PDF**](./crop-pdf): retalla els marges de totes les pàgines del PDF. +- [**Emplena formularis PDF**](./form-filler): emplena formularis directament al navegador. També admet formularis XFA. +- [**Crea un formulari PDF**](./form-creator): crea formularis PDF emplenables amb camps de text arrossegant i deixant anar. +- [**Elimina les pàgines en blanc**](./remove-blank-pages): detecta i elimina automàticament les pàgines en blanc. + +
+ +--- + +## Converteix a PDF + +Converteix imatges, documents, llibres electrònics i altres formats de fitxer en PDF. + +
+ +- [**Imatges a PDF**](./image-to-pdf): converteix JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP i més a PDF. +- [**JPG a PDF**](./jpg-to-pdf): crea un PDF a partir d'una o més imatges JPG. +- [**PNG a PDF**](./png-to-pdf): crea un PDF a partir d'una o més imatges PNG. +- [**WebP a PDF**](./webp-to-pdf): crea un PDF a partir d'una o més imatges WebP. +- [**SVG a PDF**](./svg-to-pdf): crea un PDF a partir d'una o més imatges SVG. +- [**BMP a PDF**](./bmp-to-pdf): crea un PDF a partir d'una o més imatges BMP. +- [**HEIC a PDF**](./heic-to-pdf): crea un PDF a partir d'una o més imatges HEIC. +- [**TIFF a PDF**](./tiff-to-pdf): crea un PDF a partir d'una o més imatges TIFF. +- [**Text a PDF**](./txt-to-pdf): converteix un fitxer de text pla en un PDF. +- [**Markdown a PDF**](./markdown-to-pdf): converteix Markdown a PDF amb vista prèvia en directe i ressaltat de sintaxi. +- [**JSON a PDF**](./json-to-pdf): converteix fitxers JSON a format PDF. +- [**ODT a PDF**](./odt-to-pdf): converteix fitxers ODT (OpenDocument Text) a PDF. +- [**CSV a PDF**](./csv-to-pdf): converteix fulls de càlcul CSV a PDF. +- [**RTF a PDF**](./rtf-to-pdf): converteix documents RTF (Rich Text Format) a PDF. +- [**Word a PDF**](./word-to-pdf): converteix documents de Word (DOCX, DOC, ODT) a PDF. +- [**Excel a PDF**](./excel-to-pdf): converteix fulls de càlcul d'Excel (XLSX, XLS, ODS) a PDF. +- [**PowerPoint a PDF**](./powerpoint-to-pdf): converteix presentacions de PowerPoint (PPTX, PPT, ODP) a PDF. +- [**XPS a PDF**](./xps-to-pdf): converteix documents XPS/OXPS a PDF. +- [**MOBI a PDF**](./mobi-to-pdf): converteix llibres electrònics MOBI a PDF. +- [**EPUB a PDF**](./epub-to-pdf): converteix llibres electrònics EPUB a PDF. +- [**FB2 a PDF**](./fb2-to-pdf): converteix llibres electrònics FictionBook (FB2) a PDF. +- [**CBZ a PDF**](./cbz-to-pdf): converteix arxius de còmics (CBZ/CBR) a PDF. +- [**WPD a PDF**](./wpd-to-pdf): converteix documents de WordPerfect (WPD) a PDF. +- [**WPS a PDF**](./wps-to-pdf): converteix documents de WPS Office a PDF. +- [**XML a PDF**](./xml-to-pdf): converteix documents XML a PDF. +- [**ODG a PDF**](./odg-to-pdf): converteix OpenDocument Graphics (ODG) a PDF. +- [**ODS a PDF**](./ods-to-pdf): converteix OpenDocument Spreadsheet (ODS) a PDF. +- [**ODP a PDF**](./odp-to-pdf): converteix OpenDocument Presentation (ODP) a PDF. +- [**PUB a PDF**](./pub-to-pdf): converteix Microsoft Publisher (PUB) a PDF. +- [**VSD a PDF**](./vsd-to-pdf): converteix Microsoft Visio (VSD, VSDX) a PDF. +- [**PSD a PDF**](./psd-to-pdf): converteix fitxers d'Adobe Photoshop (PSD) a PDF. +- [**Correu electrònic a PDF**](./email-to-pdf): converteix fitxers de correu electrònic (EML, MSG) a format PDF. + +
+ +--- + +## Converteix des de PDF + +Extreu el contingut dels PDF a imatges, documents i formats de dades. + +
+ +- [**PDF a JPG**](./pdf-to-jpg): converteix cada pàgina del PDF en una imatge JPG. +- [**PDF a PNG**](./pdf-to-png): converteix cada pàgina del PDF en una imatge PNG. +- [**PDF a WebP**](./pdf-to-webp): converteix cada pàgina del PDF en una imatge WebP. +- [**PDF a BMP**](./pdf-to-bmp): converteix cada pàgina del PDF en una imatge BMP. +- [**PDF a TIFF**](./pdf-to-tiff): converteix cada pàgina del PDF en una imatge TIFF. +- [**PDF a CBZ**](./pdf-to-cbz): converteix un PDF en un CBZ (arxiu de còmic) per a lectors de còmics i Calibre. +- [**PDF a SVG**](./pdf-to-svg): converteix cada pàgina del PDF en un gràfic vectorial escalable. +- [**PDF a CSV**](./pdf-to-csv): extreu taules del PDF i converteix-les a format CSV. +- [**PDF a Excel**](./pdf-to-excel): extreu taules del PDF i converteix-les a Excel (XLSX). +- [**PDF a escala de grisos**](./pdf-to-greyscale): converteix tots els colors a blanc i negre. +- [**PDF a JSON**](./pdf-to-json): converteix fitxers PDF a format JSON. +- [**PDF a Word**](./pdf-to-word): converteix fitxers PDF en documents de Word editables. +- [**Extreu imatges**](./extract-images): extreu totes les imatges incrustades dels fitxers PDF. +- [**PDF a Markdown**](./pdf-to-markdown): converteix el text i les taules del PDF a format Markdown. +- [**Prepara PDF per a IA**](./prepare-pdf-for-ai): extreu el contingut del PDF com a JSON de LlamaIndex per a fluxos RAG/LLM. +- [**PDF a text**](./pdf-to-text): extreu el text dels fitxers PDF i desa'l com a text pla. +- [**Extreu taules de PDF**](./extract-tables): extreu taules dels PDF com a CSV, JSON o Markdown. + +
+ +--- + +## Organitza i gestiona + +Reorganitza, combina, divideix i gestiona les pàgines i els fitxers PDF. + +
+ +- [**Creador de fluxos de treball PDF**](./pdf-workflow): crea fluxos de processament de PDF personalitzats amb un editor visual de nodes. +- [**Eina PDF multifunció**](./pdf-multi-tool): editor de PDF complet amb gestió de pàgines. +- [**Reconeixement OCR de PDF**](./ocr-pdf): fes que un PDF es pugui cercar i copiar. +- [**Fusiona PDF**](./merge-pdf): combina diversos PDF en un sol fitxer. +- [**Alterna i barreja pàgines**](./alternate-merge): fusiona PDF alternant les pàgines de cada PDF. +- [**Ordena les cares d'un escaneig a doble cara**](./duplex-collate): reordena els blocs d'escaneig d'anvers i revers en la seqüència de pàgines correcta. +- [**Duplica i organitza**](./organize-pdf): duplica, reordena i elimina pàgines. +- [**Afegeix fitxers adjunts**](./add-attachments): incrusta un o més fitxers al PDF. +- [**Extreu fitxers adjunts**](./extract-attachments): extreu tots els fitxers incrustats dels PDF en un ZIP. +- [**Edita els fitxers adjunts**](./edit-attachments): consulta o elimina els fitxers adjunts del PDF. +- [**Capes OCG del PDF**](./pdf-layers): consulta, activa o desactiva, afegeix i elimina capes OCG del PDF. +- [**Divideix PDF**](./split-pdf): extreu un interval de pàgines en un PDF nou. +- [**Divideix pàgines**](./divide-pages): divideix les pàgines horitzontalment o verticalment. +- [**Extreu pàgines**](./extract-pages): desa una selecció de pàgines com a fitxers nous. +- [**Suprimeix pàgines**](./delete-pages): elimina pàgines concretes del document. +- [**Afegeix una pàgina en blanc**](./add-blank-page): insereix una pàgina buida en qualsevol lloc del PDF. +- [**Inverteix l'ordre de les pàgines**](./reverse-pages): inverteix l'ordre de totes les pàgines del document. +- [**Gira PDF**](./rotate-pdf): gira les pàgines en increments de 90 graus. +- [**Gira amb un angle personalitzat**](./rotate-custom): gira les pàgines amb qualsevol angle personalitzat. +- [**PDF amb diverses pàgines per full**](./n-up-pdf): disposa diverses pàgines en un sol full. +- [**Fullet PDF**](./pdf-booklet): reorganitza les pàgines per imprimir un fullet a doble cara. +- [**Combina en una única pàgina**](./combine-single-page): uneix totes les pàgines en un únic desplaçament continu. +- [**Visualitza les metadades**](./view-metadata): inspecciona les propietats ocultes del PDF. +- [**Edita les metadades**](./edit-metadata): canvia l'autor, el títol i altres propietats. +- [**PDF a ZIP**](./pdf-to-zip): empaqueta diversos fitxers PDF en un arxiu ZIP. +- [**Compara PDF**](./compare-pdfs): compara dos PDF un al costat de l'altre. +- [**Divideix PDF en format pòster**](./posterize-pdf): divideix una pàgina gran en diverses pàgines més petites. + +
+ +--- + +## Optimitza i repara + +Comprimeix, corregeix i optimitza els PDF per a un millor rendiment i compatibilitat. + +
+ +- [**Comprimeix PDF**](./compress-pdf): redueix la mida del fitxer del PDF. +- [**PDF a PDF/A**](./pdf-to-pdfa): converteix el PDF a PDF/A per a l'arxiu a llarg termini. +- [**Uniformitza la mida de pàgina**](./fix-page-size): uniformitza totes les pàgines a la mateixa mida. +- [**Linealitza PDF**](./linearize-pdf): optimitza el PDF per a una visualització web ràpida. +- [**Dimensions de pàgina**](./page-dimensions): analitza la mida, l'orientació i les unitats de les pàgines. +- [**Elimina les restriccions**](./remove-restrictions): elimina la protecció amb contrasenya i les restriccions de seguretat. +- [**Repara PDF**](./repair-pdf): recupera dades de fitxers PDF corruptes o danyats. +- [**Rasteritza PDF**](./rasterize-pdf): converteix el PDF en un PDF basat en imatges. Aplana les capes i elimina el text seleccionable. +- [**Redreça PDF**](./deskew-pdf): redreça automàticament les pàgines escanejades inclinades amb OpenCV. +- [**Converteix tipus de lletra en contorns**](./font-to-outline): converteix tots els tipus de lletra en contorns vectorials per a una renderització coherent. + +
+ +--- + +## Protegeix PDF + +Protegeix, xifra i controla l'accés als teus documents PDF. + +
+ +- [**Xifra PDF**](./protect-pdf): bloqueja el PDF afegint-hi una contrasenya. +- [**Neteja PDF**](./sanitize-pdf): elimina metadades, anotacions, scripts i més. +- [**Desxifra PDF**](./unlock-pdf): desbloqueja el PDF eliminant-ne la protecció amb contrasenya. +- [**Aplana PDF**](./flatten-pdf): fes que els camps de formulari i les anotacions no es puguin editar. +- [**Elimina les metadades**](./remove-metadata): elimina les dades ocultes del PDF. +- [**Canvia els permisos**](./change-permissions): defineix o canvia els permisos d'usuari d'un PDF. +- [**Signatura digital de PDF**](./digital-sign-pdf): afegeix una signatura digital criptogràfica amb certificats X.509. +- [**Valida la signatura d'un PDF**](./validate-signature-pdf): verifica les signatures digitals i consulta els detalls del certificat. + +
diff --git a/docs/ca/tools/invert-colors.md b/docs/ca/tools/invert-colors.md new file mode 100644 index 00000000..253dfb54 --- /dev/null +++ b/docs/ca/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Inverteix els colors +description: Inverteix tots els colors del PDF per crear una versió en mode fosc de qualsevol document. +--- + +# Inverteix els colors + +Canvia cada color del PDF pel seu invers. Els fons blancs passen a ser negres, el text negre passa a ser blanc i la resta de colors es converteixen en els seus complementaris. És la manera més ràpida de crear una versió en «mode fosc» de qualsevol PDF. + +## Com funciona + +1. Puja el fitxer PDF. +2. Fes clic a **Inverteix els colors** per processar-lo. +3. El PDF invertit es baixa automàticament. + +No hi ha cap paràmetre addicional. L'eina renderitza cada pàgina com a imatge, inverteix el color de tots els píxels i torna a muntar el resultat en un PDF nou. + +## Funcionalitats + +- Inversió de colors amb un sol clic per a totes les pàgines +- Processa totes les pàgines del document +- Manté les dimensions i el disseny originals de la pàgina +- Funciona amb qualsevol PDF, sigui quin sigui el tipus de contingut (text, imatges o mixt) + +## Casos d'ús + +- Crear versions en mode fosc de llibres de text o manuals per llegir còmodament de nit +- Preparar versions d'alt contrast dels documents per a l'accessibilitat +- Invertir documents escanejats que es van capturar amb una exposició incorrecta +- Generar versions en negatiu de PDF plens d'imatges per a l'anàlisi visual + +## Consells + +- Com que l'eina rasteritza les pàgines per aplicar l'efecte, el resultat és basat en imatges. El text ja no es podrà seleccionar ni cercar. Si necessites text cercable després de la inversió, passa el resultat per una eina d'OCR. +- Per a ajustos de color més detallats (brillantor, contrast, saturació), fes servir l'eina [Ajusta els colors](./adjust-colors). +- Els PDF grans amb moltes pàgines poden trigar més a processar-se, ja que cada pàgina es renderitza i s'inverteix per separat. + +## Eines relacionades + +- [Ajusta els colors](./adjust-colors) +- [Color de fons](./background-color) +- [Efecte d'escàner](./scanner-effect) diff --git a/docs/ca/tools/jpg-to-pdf.md b/docs/ca/tools/jpg-to-pdf.md new file mode 100644 index 00000000..3c94090e --- /dev/null +++ b/docs/ca/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG a PDF +description: Converteix una o més imatges JPG, JPEG i JPEG 2000 en un únic fitxer PDF directament al navegador. +--- + +# JPG a PDF + +Converteix imatges JPG en un PDF net. Puja un fitxer o diversos JPG alhora: cada imatge es converteix en una pàgina a mida completa del document resultant. + +## Formats compatibles + +| Format | Extensions | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers JPG. Es pot seleccionar més d'un fitxer. +2. Revisa els fitxers pujats. Fes servir la icona de la paperera per eliminar-ne de concrets, o fes clic a **Afegeix més fitxers** per afegir-ne a la llista. +3. Selecciona un nivell de **Qualitat del PDF**. +4. Fes clic a **Converteix a PDF**. L'eina comprimeix les imatges segons la qualitat triada, les converteix amb el motor PyMuPDF i baixa `from_jpgs.pdf`. + +## Opcions + +**Qualitat del PDF** ajusta la compressió que s'aplica a cada imatge abans d'incrustar-la al PDF: + +- **Alta qualitat**: conserva el màxim detall. Fes-la servir per a fotografia o impressió. +- **Qualitat mitjana** (per defecte): un bon equilibri entre nitidesa i mida del fitxer. +- **Baixa qualitat**: compressió agressiva per obtenir el resultat més petit. + +## Casos d'ús + +- Convertir en un únic PDF per presentar documents escanejats desats com a JPG +- Empaquetar fotos de productes en un catàleg per als clients +- Convertir imatges mèdiques o de satèl·lit en JPEG 2000 en un PDF portàtil +- Crear un àlbum de fotos imprimible a partir d'exportacions de la càmera + +## Consells + +- Els fitxers JPEG 2000 (`.jp2`, `.jpx`) són totalment compatibles, no només el JPEG estàndard. És útil per a imatgeria mèdica i dades geoespacials. +- Si els teus JPG provenen de la càmera d'un mòbil, la qualitat mitjana sol produir un fitxer entre un 40 % i un 60 % més petit que l'alta, sense cap diferència visible a la pantalla. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [WebP a PDF](./webp-to-pdf) diff --git a/docs/ca/tools/json-to-pdf.md b/docs/ca/tools/json-to-pdf.md new file mode 100644 index 00000000..877e26d0 --- /dev/null +++ b/docs/ca/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON a PDF +description: Reconstrueix fitxers PDF a partir del format JSON de BentoPDF. Converteix les exportacions JSON de nou en els documents PDF originals. +--- + +# JSON a PDF + +Reconstrueix documents PDF a partir de fitxers JSON creats prèviament amb l'eina **PDF a JSON** de BentoPDF. És una eina de conversió d'anada i tornada: agafa la representació estructurada en JSON d'un PDF i en reconstrueix el document original. + +::: warning +Aquesta eina només accepta fitxers JSON generats pel convertidor PDF a JSON de BentoPDF. Els fitxers JSON estàndard d'API, bases de dades o altres eines no són compatibles. +::: + +## Formats compatibles + +| Entrada | Descripció | +| :------ | :------------------------------------------------------- | +| `.json` | Fitxers JSON exportats per l'eina PDF a JSON de BentoPDF | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi un o més fitxers JSON. +2. La llista de fitxers mostra cada fitxer seleccionat amb la seva mida. +3. Fes clic a **Converteix a PDF**. L'eina processa tots els fitxers amb un Web Worker i el motor CPDF. +4. El resultat es baixa com a `jsons-to-pdf.zip`, que conté un PDF per cada fitxer JSON d'entrada. + +La conversió s'executa en un Web Worker en segon pla, de manera que la interfície continua responent bé fins i tot amb fitxers grans. + +## Opcions + +Aquesta eina no té opcions configurables. L'estructura del JSON determina completament el PDF resultant. + +## Sortida + +Quan converteixes diversos fitxers JSON, els resultats es lliuren en un arxiu ZIP. Cada PDF rep el nom del seu fitxer JSON d'origen (p. ex., `report.json` passa a ser `report.pdf`). + +## Casos d'ús + +- Restaurar PDF des d'una còpia de seguretat o un flux d'arxiu basat en JSON +- Fer passar un PDF per JSON per inspeccionar-lo i tornar-lo a convertir en PDF +- Reconstruir documents després de modificacions programàtiques de l'estructura JSON +- Verificar que una exportació de PDF a JSON ha capturat tot el contingut del document tornant-la a convertir + +## Consells + +- Si necessites convertir dades JSON arbitràries (com respostes d'API o fitxers de configuració) en un PDF amb format, l'eina [Text a PDF](./txt-to-pdf) és més adequada. Enganxa el JSON com a text i es renderitzarà amb el format correcte. +- El motor WebAssembly CPDF ha d'estar disponible perquè aquesta eina funcioni. Les instàncies autoallotjades necessiten tenir configurats els fitxers WASM de CPDF. + +## Eines relacionades + +- [Text a PDF](./txt-to-pdf) +- [Markdown a PDF](./markdown-to-pdf) +- [CSV a PDF](./csv-to-pdf) diff --git a/docs/ca/tools/linearize-pdf.md b/docs/ca/tools/linearize-pdf.md new file mode 100644 index 00000000..5ad54d30 --- /dev/null +++ b/docs/ca/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linealitza PDF +description: Optimitza els fitxers PDF per a una visualització web ràpida amb càrrega progressiva. També conegut com a optimització «Fast Web View». +--- + +# Linealitza PDF + +La linealització reestructura un PDF perquè la primera pàgina es pugui mostrar abans que s'hagi baixat tot el fitxer. Adobe ho anomena «Fast Web View». Si publiques PDF en un lloc web o els serveixes mitjançant un portal de documents, la linealització fa que s'obrin molt més ràpid. + +## Com funciona + +1. Puja un o més fitxers PDF. +2. Fes clic a **Linealitza PDF**. +3. Baixa els resultats en un arxiu ZIP que conté tots els fitxers linealitzats. + +No hi ha cap paràmetre per configurar. L'eina fa servir l'indicador `--linearize` de QPDF, que reorganitza l'estructura interna del PDF sense alterar-ne el contingut visual. + +## Què fa la linealització + +- Reordena els objectes del PDF perquè les dades de la primera pàgina apareguin al principi del fitxer +- Afegeix un diccionari de linealització i taules de pistes perquè els visors sàpiguen on trobar cada pàgina +- Permet les peticions per intervals de bytes: un navegador pot obtenir només la primera pàgina sense baixar tot el fitxer +- Neteja la taula de referències creuades per a un accés aleatori eficient + +## Funcionalitats + +- Processament per lots de diversos PDF en una sola operació +- El resultat conserva tot el contingut, els tipus de lletra, les imatges i els elements interactius +- Fa servir QPDF (WebAssembly) per a una linealització fiable i conforme a l'estàndard +- Els resultats s'empaqueten en un ZIP per baixar-los fàcilment + +## Casos d'ús + +- Publicar informes en PDF en un lloc web on els usuaris esperen que les pàgines es mostrin a l'instant +- Incrustar PDF en aplicacions web amb visors al navegador +- Publicar catàlegs o manuals en PDF als quals s'accedeix amb connexions mòbils lentes +- Preparar documents per a xarxes de distribució de contingut (CDN) que admeten el servei per intervals de bytes + +## Consells + +- Linealitza quan hagis acabat totes les altres edicions. Qualsevol modificació posterior (fusionar, afegir pàgines) trencarà la linealització. +- Combina-ho amb Comprimeix PDF per obtenir els PDF més petits i que es carreguin més ràpid possible. +- La linealització afegeix una petita quantitat de pes al fitxer (normalment menys d'un 1 %). + +## Eines relacionades + +- [Comprimeix PDF](./compress-pdf): redueix la mida del fitxer abans de linealitzar-lo +- [Repara PDF](./repair-pdf): corregeix els problemes estructurals que impedeixen la linealització +- [Elimina les metadades](./remove-metadata): elimina les metadades abans de publicar en línia diff --git a/docs/ca/tools/markdown-to-pdf.md b/docs/ca/tools/markdown-to-pdf.md new file mode 100644 index 00000000..8c70598f --- /dev/null +++ b/docs/ca/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown a PDF +description: Escriu o enganxa Markdown i exporta'l com a PDF amb un format professional, amb vista prèvia en directe i ressaltat de sintaxi. +--- + +# Markdown a PDF + +Un editor de Markdown complet amb vista prèvia en directe i exportació a PDF amb un sol clic. Escriu des de zero, puja un fitxer `.md` existent o enganxa contingut del porta-retalls. L'editor renderitza el Markdown en temps real i exporta un PDF amb estil mitjançant el motor d'impressió integrat al navegador. + +## Formats compatibles + +| Entrada | Descripció | +| :-------------- | :----------------------------------- | +| Fitxers `.md` | Puja'ls amb el botó Puja | +| Entrada directa | Escriu o enganxa al camp de l'editor | + +## Com funciona + +1. Obre l'eina Markdown a PDF. L'editor es carrega amb una vista dividida: el codi Markdown a l'esquerra i la vista prèvia renderitzada a la dreta. +2. Escriu el Markdown, enganxa'l o fes clic a **Puja** per carregar un fitxer `.md`. +3. Canvia entre el tema clar i el fosc amb el control lliscant de tema de la barra d'eines. +4. Fes clic a **Exporta PDF** (o prem `Ctrl/Cmd + S`) per generar un PDF mitjançant el diàleg d'impressió del navegador. + +## Funcionalitats + +L'editor admet un conjunt ampli de funcionalitats de Markdown més enllà de les bàsiques: + +- **Markdown estàndard**: encapçalaments, negreta, cursiva, enllaços, imatges, llistes, cites, línies horitzontals +- **Blocs de codi** amb ressaltat de sintaxi per a més de 15 llenguatges (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash i més) +- **Diagrames Mermaid**: els diagrames de flux, de seqüència, ER i altres tipus de gràfics Mermaid es renderitzen directament a la vista prèvia +- **Taules** amb la sintaxi estàndard de taules de Markdown +- **Llistes de tasques** amb caselles de selecció +- **Notes a peu de pàgina**, **subíndexs**, **superíndexs** +- **Llistes de definicions**, **abreviatures** +- Compatibilitat amb **emojis** (`:smile:` es renderitza com a emoji) +- **Ressaltats** (`==marked text==`) i **insercions** (`++inserted text++`) +- **URL enllaçades automàticament**: les URL soltes es converteixen en enllaços clicables +- Generació de **taula de continguts** +- **Enllaços d'àncora** als encapçalaments + +## Casos d'ús + +- Escriure documentació de projectes i exportar un PDF acurat per als interessats +- Crear informes tècnics amb exemples de codi i diagrames d'arquitectura Mermaid +- Convertir un README de GitHub en un PDF per utilitzar-lo sense connexió o imprimir-lo +- Redactar una proposta o una especificació amb llistes de tasques i taules +- Generar un full de resum amb estil a partir d'apunts de classe escrits en Markdown + +## Consells + +- El PDF resultant es genera amb la funció d'imprimir a PDF del navegador. A Chrome, pots personalitzar els marges i l'escala al diàleg d'impressió abans de desar. +- Els diagrames Mermaid es renderitzen a la vista prèvia, però poden necessitar un moment per inicialitzar-se el primer cop. +- Fes servir `Ctrl/Cmd + S` com a drecera de teclat per exportar sense haver d'anar al botó. + +## Eines relacionades + +- [Text a PDF](./txt-to-pdf) +- [Word a PDF](./word-to-pdf) +- [JSON a PDF](./json-to-pdf) diff --git a/docs/ca/tools/merge-pdf.md b/docs/ca/tools/merge-pdf.md new file mode 100644 index 00000000..4bd6bc51 --- /dev/null +++ b/docs/ca/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Fusiona PDF +description: Combina diversos fitxers PDF en un sol document amb reordenació arrossegant i deixant anar i control a nivell de pàgina. +--- + +# Fusiona PDF + +Combina diversos fitxers PDF en un únic document. Pots fusionar fitxers sencers en un ordre concret o canviar al mode Pàgina per tenir un control detallat de cada pàgina de tots els PDF pujats. + +## Com funciona + +1. Puja dos o més fitxers PDF fent clic a la zona de càrrega o arrossegant-hi els fitxers. +2. Tria entre el **Mode Fitxer** i el **Mode Pàgina** amb l'interruptor de la part superior. +3. Al Mode Fitxer, arrossega els fitxers per reordenar-los i, si vols, indica intervals de pàgines (p. ex., `1-3, 5`) per a cadascun. Deixa l'interval en blanc per incloure-hi totes les pàgines. +4. Al Mode Pàgina, arrossega i deixa anar les miniatures de cada pàgina per construir la seqüència exacta. +5. Fes clic a **Fusiona PDF** per combinar-ho tot en un sol fitxer. El PDF fusionat es baixa automàticament. + +## Funcionalitats + +- Dos modes de fusió: el Mode Fitxer per combinar fitxers sencers ràpidament i el Mode Pàgina per controlar cada pàgina +- Reordenació arrossegant i deixant anar en tots dos modes, amb animacions fluides +- La sintaxi d'intervals de pàgines (p. ex., `1-3, 5, 8-10`) permet triar pàgines concretes sense canviar al Mode Pàgina +- Les miniatures de pàgina es carreguen a mesura que cal, de manera que la interfície continua responent bé amb documents grans +- Sense límit de nombre de fitxers ni de pàgines totals +- Conserva la qualitat original del PDF, sense tornar a codificar res + +## Opcions + +| Opció | Descripció | +| ------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| **Mode Fitxer** | Fusiona fitxers sencers en un ordre personalitzat, amb filtres opcionals d'interval de pàgines per fitxer | +| **Mode Pàgina** | Quadrícula visual amb totes les pàgines de tots els fitxers: arrossega les miniatures per construir la seqüència exacta | +| **Camp de pàgines** | Camp de text per fitxer que accepta intervals com `1-3, 5` per incloure només pàgines concretes | + +## Casos d'ús + +- Combinar PDF de capítols independents en un sol llibre o informe +- Fusionar una carta de presentació i un currículum en un únic document de candidatura +- Reunir pàgines concretes de diversos documents d'origen en un fitxer consolidat +- Muntar tiquets o factures escanejats en un únic PDF d'arxiu +- Crear un full de resum d'una presentació a partir de diapositives de diverses presentacions + +## Consells + +- Fes servir el Mode Pàgina quan necessitis intercalar pàgines de fitxers diferents en lloc d'afegir un fitxer darrere de l'altre. +- Pots afegir més fitxers després de la càrrega inicial amb el botó **Afegeix més fitxers** sense perdre l'ordenació actual. +- Els intervals de pàgines comencen a 1, de manera que `1` fa referència a la primera pàgina d'aquell fitxer. + +## Eines relacionades + +- [Divideix PDF](./split-pdf) +- [Duplica i organitza](./organize-pdf) +- [Alterna i barreja pàgines](./alternate-merge) +- [Suprimeix pàgines](./delete-pages) diff --git a/docs/ca/tools/mobi-to-pdf.md b/docs/ca/tools/mobi-to-pdf.md new file mode 100644 index 00000000..cb7e505a --- /dev/null +++ b/docs/ca/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI a PDF +description: Converteix fitxers de llibre electrònic MOBI a PDF directament al navegador. Gratuït, privat i sense pujar fitxers. +--- + +# MOBI a PDF + +Converteix llibres electrònics MOBI d'Amazon Kindle en documents PDF. Els fitxers MOBI estan lligats als dispositius i aplicacions Kindle, la qual cosa dificulta llegir-los en altres llocs. Convertir-los a PDF et dona una versió portàtil que pots obrir en qualsevol dispositiu o imprimir. + +## Formats compatibles + +| Format | Extensió | Notes | +| :----- | :------- | :---------------------------------------------- | +| MOBI | `.mobi` | Format de llibre electrònic Kindle (Mobipocket) | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi un o més fitxers MOBI. +2. Revisa la llista de fitxers. Elimina els que no vulguis amb la icona de la paperera, o fes servir **Afegeix més fitxers** per incloure més llibres electrònics. +3. Fes clic a **Converteix a PDF**. El motor PyMuPDF analitza l'estructura del MOBI i renderitza cada pàgina com a contingut de PDF. +4. Si és un sol fitxer, es baixa com a PDF. Si en converteixes diversos, obtens un arxiu ZIP anomenat `mobi-converted.zip`. + +## Opcions + +No calen paràmetres addicionals. La conversió conserva el contingut de text, el format i les imatges incrustades del fitxer MOBI original. + +## Casos d'ús + +- Llegir contingut comprat a Kindle en un lector electrònic que no sigui Kindle i només admeti PDF +- Imprimir capítols d'un llibre electrònic per estudiar-los o anotar-los sense connexió +- Arxivar la teva biblioteca personal de llibres electrònics en un format universal +- Compartir fragments amb algú que no té l'aplicació Kindle instal·lada + +## Consells + +- Els fitxers MOBI protegits amb DRM no es poden convertir. L'eina només funciona amb fitxers MOBI sense DRM. +- Els llibres electrònics grans amb moltes imatges incrustades poden trigar uns segons més a processar-se, ja que tot es fa al navegador. + +## Eines relacionades + +- [EPUB a PDF](./epub-to-pdf) +- [FB2 a PDF](./fb2-to-pdf) +- [CBZ a PDF](./cbz-to-pdf) diff --git a/docs/ca/tools/n-up-pdf.md b/docs/ca/tools/n-up-pdf.md new file mode 100644 index 00000000..5f2d56fd --- /dev/null +++ b/docs/ca/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF amb diverses pàgines per full +description: Disposa diverses pàgines d'un PDF en un sol full amb una quadrícula per a una impressió compacta. +--- + +# PDF amb diverses pàgines per full + +Col·loca diverses pàgines en un sol full amb una disposició en quadrícula. Així es redueix el nombre de pàgines impreses, ja que hi caben 2, 4, 6, 8, 9 o 16 pàgines per full. L'eina s'encarrega de l'escalat, el posicionament i la configuració opcional de la mida de pàgina. + +## Com funciona + +1. Puja un fitxer PDF. +2. Selecciona el nombre de pàgines per full (el valor «N»): 2, 4, 6, 8, 9 o 16. +3. Tria la mida de pàgina de sortida (per defecte, A4) i l'orientació. +4. Si vols, configura l'espaiat, el color de la vora i el color de fons. +5. Fes clic al botó de processar. L'eina escala cada pàgina i les distribueix en fulls nous. + +## Funcionalitats + +- Disposicions en quadrícula: 2, 4, 6, 8, 9 i 16 pàgines per full +- Mida de pàgina de sortida i orientació configurables +- Espaiat opcional entre les pàgines disposades +- Configuració del color de fons i de les vores +- Manté la proporció de les pàgines originals en escalar-les perquè hi càpiguen + +## Opcions + +| Opció | Descripció | +| -------------------- | ---------------------------------------------------------------------------------- | +| **Pàgines per full** | Nombre de pàgines originals que caben a cada pàgina de sortida (2, 4, 6, 8, 9, 16) | +| **Mida de pàgina** | Mida del full de sortida (A4, Letter, Legal, etc.) | +| **Orientació** | Vertical o horitzontal per al full de sortida | +| **Espaiat** | Espai en punts entre les pàgines disposades | +| **Color de fons** | Color d'emplenament del fons del full de sortida | +| **Color de la vora** | Color de les vores al voltant de cada pàgina disposada | + +## Casos d'ús + +- Imprimir resums amb 4 diapositives per pàgina per estalviar paper +- Crear fulls d'estudi amb diverses pàgines de referència en un sol full +- Produir arxius de documents compactes per arxivar +- Generar fulls de miniatures per tenir una visió general d'un document llarg + +## Consells + +- L'orientació horitzontal sol anar millor per a les disposicions de 2 pàgines per full, mentre que la vertical acostuma a ser la millor per a 4 o més. +- Augmentar l'espaiat millora la llegibilitat, però redueix l'àrea disponible per a cada pàgina disposada. +- Per a l'operació inversa (dividir una pàgina en diverses), consulta [Divideix PDF en format pòster](./posterize-pdf). + +## Eines relacionades + +- [Divideix PDF en format pòster](./posterize-pdf) +- [Fullet PDF](./pdf-booklet) +- [Combina en una única pàgina](./combine-single-page) diff --git a/docs/ca/tools/ocr-pdf.md b/docs/ca/tools/ocr-pdf.md new file mode 100644 index 00000000..8a56b01d --- /dev/null +++ b/docs/ca/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: Reconeixement OCR de PDF +description: Fes que els PDF escanejats es puguin cercar i copiar amb Tesseract OCR, amb compatibilitat amb diversos idiomes i filtratge de caràcters. +--- + +# Reconeixement OCR de PDF + +Converteix documents escanejats en PDF en què es pot cercar i copiar. L'eina fa servir Tesseract OCR per reconèixer el text de les imatges i superposa una capa de text invisible sobre les pàgines originals, de manera que es conserva l'aspecte visual i el contingut es pot cercar completament. + +## Com funciona + +1. Puja un PDF escanejat o basat en imatges. +2. Selecciona un o més idiomes presents al document a la llista d'idiomes amb cercador. +3. Si vols, ajusta la configuració avançada (resolució, binarització, llista blanca). +4. Fes clic a **Inicia l'OCR** i segueix el progrés a la barra de progrés en temps real. +5. Quan acabi, revisa el text extret i baixa el PDF cercable o un fitxer `.txt` de text pla. + +## Funcionalitats + +- OCR multilingüe amb un selector d'idiomes amb cercador +- La capa de text invisible conserva l'aspecte original del document +- Barra de progrés en temps real i registre de sortida durant el processament +- Baixa els resultats com a PDF cercable o com a fitxer de text pla +- Copia el text extret directament al porta-retalls +- Tres nivells de resolució per equilibrar velocitat i precisió + +## Opcions + +| Paràmetre | Valors | Per defecte | Finalitat | +| --------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------- | +| **Resolució** | Estàndard (192 DPI), Alta (288 DPI), Ultra (384 DPI) | Alta | Una resolució més alta millora la precisió amb text petit, però triga més | +| **Binaritza la imatge** | Activat / Desactivat | Desactivat | Millora el contrast d'escanejos nets convertint-los a blanc i negre | +| **Preajust de la llista blanca de caràcters** | Cap, Alfanumèric, Números i moneda, Només lletres, Només números, Factura, Formularis, Personalitzat | Cap | Restringeix els caràcters reconeguts per millorar la precisió en tipus de document concrets | +| **Llista blanca de caràcters** | Text lliure | Buit | Conjunt de caràcters manual quan el preajust és Personalitzat | + +## Casos d'ús + +- Fer que els contractes i les factures escanejats es puguin cercar per poder fer Ctrl+F +- Extreure text de documents fotografiats o de registres antics en paper +- Processar tiquets amb el preajust Factura per capturar amb precisió imports i dates +- Crear PDF accessibles a partir d'escanejos que només contenen imatges per complir requisits normatius +- Extreure per lots el contingut de text de llibres o manuals escanejats + +## Consells + +- Selecciona diversos idiomes si el document conté contingut en llengües mixtes (p. ex., capçaleres en anglès amb text en japonès). +- Fes servir l'opció de binarització en documents amb text esvaït o de poc contrast: pot millorar considerablement la precisió del reconeixement. +- Els preajustos Factura i Formularis de la llista blanca redueixen dràsticament els falsos positius en documents estructurats en ignorar les formes de caràcter irrellevants. + +## Eines relacionades + +- [Extreu taules de PDF](./extract-tables) +- [Fusiona PDF](./merge-pdf) +- [Comprimeix PDF](./compress-pdf) diff --git a/docs/ca/tools/odg-to-pdf.md b/docs/ca/tools/odg-to-pdf.md new file mode 100644 index 00000000..c5409b64 --- /dev/null +++ b/docs/ca/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG a PDF +description: Converteix fitxers de LibreOffice Draw (ODG) a PDF al navegador. Gratuït, sense pujar res i totalment privat. +--- + +# ODG a PDF + +Converteix fitxers OpenDocument Graphics en PDF. ODG és el format natiu de LibreOffice Draw i s'utilitza per a diagrames, diagrames de flux i il·lustracions vectorials. Convertir-los a PDF facilita compartir aquests dibuixos, imprimir-los i incrustar-los en altres documents. + +## Formats compatibles + +| Format | Extensió | Notes | +| :-------------------- | :------- | :-------------------------------------------- | +| OpenDocument Graphics | `.odg` | Fitxers de LibreOffice Draw / OpenOffice Draw | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers ODG. Pots afegir-ne diversos alhora. +2. Revisa la llista de fitxers. Elimina entrades concretes amb la icona de la paperera, o fes clic a **Afegeix més fitxers** per afegir més dibuixos. +3. Fes clic a **Converteix a PDF**. Un motor basat en LibreOffice es carrega al navegador i converteix cada fitxer ODG, conservant els gràfics vectorials, les formes i el text. +4. Si és un sol fitxer, es baixa directament com a PDF. Si són diversos, es genera un arxiu ZIP anomenat `odg-to-pdf.zip`. + +## Opcions + +No calen paràmetres addicionals. La conversió conserva les dimensions de pàgina, les formes, els connectors i els quadres de text originals de l'ODG. + +## Casos d'ús + +- Compartir diagrames de LibreOffice Draw amb clients que no tenen LibreOffice instal·lat +- Imprimir diagrames de flux i diagrames de xarxa creats amb Draw +- Incloure il·lustracions ODG en un informe o una presentació com a PDF incrustats +- Arxivar dibuixos tècnics en un format que continuarà sent llegible durant dècades + +## Consells + +- Els elements vectorials es conserven com a vectors al PDF resultant, de manera que escalen netament a qualsevol mida d'impressió. +- El motor de LibreOffice triga una mica a inicialitzar-se el primer cop. Les conversions posteriors dins de la mateixa sessió són més ràpides. + +## Eines relacionades + +- [ODS a PDF](./ods-to-pdf) +- [ODP a PDF](./odp-to-pdf) +- [VSD a PDF](./vsd-to-pdf) diff --git a/docs/ca/tools/odp-to-pdf.md b/docs/ca/tools/odp-to-pdf.md new file mode 100644 index 00000000..4a26143d --- /dev/null +++ b/docs/ca/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP a PDF +description: Converteix presentacions de LibreOffice Impress (ODP) a PDF al navegador. Gratuït, privat i sense pujar res. +--- + +# ODP a PDF + +Converteix fitxers OpenDocument Presentation en PDF. ODP és el format natiu de LibreOffice Impress i una exportació estàndard de Google Slides. Convertir les presentacions a PDF permet que qualsevol persona les pugui veure sense programari de presentacions, i les diapositives s'imprimeixen netament. + +## Formats compatibles + +| Format | Extensió | Notes | +| :------------------------ | :------- | :------------------------------------------------ | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / exportació de Google Slides | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega-hi els fitxers ODP. Pots seleccionar diverses presentacions alhora. +2. Revisa la llista de fitxers. Elimina entrades amb la icona de la paperera, o fes servir **Afegeix més fitxers** per incloure més presentacions. +3. Fes clic a **Converteix a PDF**. El motor basat en LibreOffice processa cada presentació i genera un PDF on cada diapositiva és una pàgina. +4. Si és un sol fitxer, es baixa com a PDF. Si són diversos, es lliuren en un arxiu ZIP anomenat `odp-to-pdf.zip`. + +## Opcions + +No hi ha res per configurar. Cada diapositiva es renderitza a les seves dimensions originals, conservant el text, les imatges, les formes i els fons de les diapositives. + +## Casos d'ús + +- Distribuir una presentació al públic com a PDF de resum +- Compartir exportacions de Google Slides amb persones que prefereixen el PDF a l'ODP +- Arxivar xerrades de congressos i classes en un format de només lectura +- Imprimir presentacions per a tallers presencials + +## Consells + +- Les transicions i les animacions de les diapositives són funcions purament visuals que no passen al PDF, però tot el contingut estàtic es renderitza correctament. +- Les notes de l'orador no s'inclouen al PDF resultant. Si en necessites, exporta-les per separat des del teu programari de presentacions. +- Com les altres eines basades en LibreOffice, el motor es carrega el primer cop que s'usa i es conserva a la memòria cau durant la sessió. + +## Eines relacionades + +- [ODG a PDF](./odg-to-pdf) +- [ODS a PDF](./ods-to-pdf) +- [PUB a PDF](./pub-to-pdf) diff --git a/docs/ca/tools/ods-to-pdf.md b/docs/ca/tools/ods-to-pdf.md new file mode 100644 index 00000000..d5eb9a1a --- /dev/null +++ b/docs/ca/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS a PDF +description: Converteix fulls de càlcul de LibreOffice Calc (ODS) a PDF al navegador. Gratuït, privat i sense registre. +--- + +# ODS a PDF + +Converteix fitxers OpenDocument Spreadsheet a PDF. ODS és el format natiu de LibreOffice Calc i una exportació habitual de Google Sheets. Aquesta eina renderitza les dades, el format i els gràfics del full de càlcul en un PDF paginat que pots imprimir o compartir. + +## Formats compatibles + +| Format | Extensió | Notes | +| :----------------------- | :------- | :--------------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Exportació de LibreOffice Calc / Google Sheets | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega-hi els teus fitxers ODS. Admet diversos fitxers. +2. Revisa la llista de fitxers. Utilitza la icona de la paperera per eliminar fitxers, o fes clic a **Afegeix més fitxers** per ampliar el lot. +3. Fes clic a **Converteix a PDF**. El motor basat en LibreOffice es carrega al navegador i renderitza cada full de càlcul en pàgines PDF. +4. Un sol full de càlcul es baixa com a PDF. Si són diversos fitxers, s'empaqueten a `ods-to-pdf.zip`. + +## Opcions + +No cal cap configuració. El convertidor aplica al PDF el disseny d'impressió, el format de les cel·les i l'amplada de les columnes del full de càlcul. + +## Casos d'ús + +- Compartir un pressupost o un informe de LibreOffice Calc amb algú que només accepta PDF +- Imprimir una exportació de Google Sheets que s'ha baixat com a ODS +- Arxivar registres financers en un format no editable +- Presentar formularis o fulls d'hores basats en ODS com a documents de disseny fix + +## Consells + +- Si el full de càlcul té diversos fulls, tots s'inclouen al PDF. +- Els fulls de càlcul molt amples poden ocupar diverses pàgines PDF en horitzontal. Si el disseny és important, considera ajustar l'amplada de les columnes al fitxer d'origen abans de convertir. +- El motor de LibreOffice s'inicialitza en el primer ús. Les conversions posteriors de la mateixa sessió són més ràpides. + +## Eines relacionades + +- [ODG a PDF](./odg-to-pdf) +- [ODP a PDF](./odp-to-pdf) +- [XML a PDF](./xml-to-pdf) diff --git a/docs/ca/tools/odt-to-pdf.md b/docs/ca/tools/odt-to-pdf.md new file mode 100644 index 00000000..95f5868e --- /dev/null +++ b/docs/ca/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT a PDF +description: Converteix fitxers OpenDocument Text (ODT) a PDF al navegador amb un motor basat en LibreOffice. +--- + +# ODT a PDF + +Converteix fitxers OpenDocument Text a PDF. ODT és el format natiu de LibreOffice Writer, Apache OpenOffice i altres processadors de textos de codi obert. Aquesta eina utilitza un motor LibreOffice al navegador per obtenir conversions precises que conserven el format, les taules, les imatges i els estils. + +## Formats compatibles + +| Format | Extensions | +| :---------------- | :--------- | +| OpenDocument Text | `.odt` | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega-hi un o més fitxers ODT. +2. Revisa la llista de fitxers. Afegeix-ne més o elimina els que no vulguis. +3. Fes clic a **Converteix a PDF**. El motor de LibreOffice s'inicialitza (un indicador de progrés mostra l'estat de la càrrega) i després es converteix cada fitxer. +4. Un sol fitxer es baixa directament com a PDF. Si són diversos, s'empaqueten a `odt-converted.zip`. + +## Opcions + +Aquesta eina no té cap configuració addicional. La conversió conserva el format del document original tan fidelment com és possible. + +## Sortida + +| Nombre d'entrades | Sortida | +| :---------------- | :---------------------------------------------------- | +| 1 fitxer | Baixada d'un sol PDF (p. ex., `document.pdf`) | +| 2 o més fitxers | Arxiu ZIP (`odt-converted.zip`) amb un PDF per fitxer | + +## Casos d'ús + +- Convertir documents de LibreOffice Writer a PDF per compartir-los amb usuaris de Microsoft Office +- Generar PDF llestos per imprimir a partir de treballs acadèmics escrits en format OpenDocument +- Convertir en lot una carpeta de plantilles ODT a PDF per distribuir-les +- Generar PDF a partir de fitxers ODT creats per sistemes automàtics de generació de documents + +## Consells + +- El motor de LibreOffice es carrega en el primer ús i es desa a la memòria cau per a les conversions posteriors. La primera càrrega triga uns segons; després, les conversions són ràpides. +- Els documents complexos amb objectes OLE incrustats o tipus de lletra poc habituals poden renderitzar-se lleugerament diferent que a LibreOffice d'escriptori. Fes una prova amb un exemple abans de convertir en lot. +- Per als documents de Word (`.doc`, `.docx`), utilitza l'eina [Word a PDF](./word-to-pdf), que també fa servir el motor de LibreOffice però accepta directament els formats de Microsoft. + +## Eines relacionades + +- [Word a PDF](./word-to-pdf) +- [RTF a PDF](./rtf-to-pdf) +- [Text a PDF](./txt-to-pdf) diff --git a/docs/ca/tools/organize-pdf.md b/docs/ca/tools/organize-pdf.md new file mode 100644 index 00000000..9a259625 --- /dev/null +++ b/docs/ca/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplica i organitza +description: Reordena, duplica i suprimeix pàgines d'un PDF amb miniatures d'arrossegar i deixar anar i un ordre de pàgines personalitzat. +--- + +# Duplica i organitza + +Reorganitza, duplica i elimina pàgines d'un PDF amb una interfície visual d'arrossegar i deixar anar. Cada pàgina apareix com a miniatura que pots moure, clonar o suprimir abans de desar el resultat com a fitxer nou. + +## Com funciona + +1. Carrega un únic fitxer PDF. +2. L'eina renderitza una quadrícula de miniatures amb totes les pàgines. +3. Arrossega les miniatures per reordenar les pàgines, fes clic al botó verd de duplicar per clonar una pàgina o al botó vermell de suprimir per eliminar-la. +4. També pots introduir un ordre de pàgines personalitzat al camp de text (p. ex., `3, 1, 2, 4`) i fer clic a **Aplica** per reorganitzar totes les pàgines alhora. +5. Fes clic al botó de processar per crear i baixar el PDF reorganitzat. + +## Característiques + +- Reordenació de pàgines arrossegant i deixant anar amb transicions animades +- Botons de duplicar i suprimir per a cada pàgina +- Camp d'ordre de pàgines personalitzat per a una reorganització precisa +- Els números de pàgina s'actualitzen automàticament després de cada canvi +- Impedeix suprimir l'última pàgina que queda + +## Casos d'ús + +- Moure una pàgina mal col·locada a la posició correcta d'un informe +- Duplicar la pàgina d'un formulari per tenir diverses còpies en blanc en un sol fitxer +- Eliminar pàgines d'esborrany o de reserva abans de distribuir un document +- Invertir o barrejar l'ordre de les pàgines per preparar la impressió +- Crear una seqüència de pàgines personalitzada sense tornar a fusionar fitxers separats + +## Consells + +- El camp d'ordre de pàgines personalitzat espera els números de pàgina originals separats per comes. Ha d'incloure cada pàgina exactament una vegada, sense ometre'n ni repetir-ne cap. +- Després de duplicar una pàgina, les dues còpies fan referència al mateix índex de pàgina original. Reordenar qualsevol de les dues funciona de manera independent. +- Per a operacions en bloc amb diversos fitxers o fluxos més avançats, considera l'[Eina PDF multifunció](./pdf-multi-tool). + +## Eines relacionades + +- [Fusiona PDF](./merge-pdf) +- [Suprimeix pàgines](./delete-pages) +- [Eina PDF multifunció](./pdf-multi-tool) +- [Inverteix l'ordre de les pàgines](./reverse-pages) diff --git a/docs/ca/tools/page-dimensions.md b/docs/ca/tools/page-dimensions.md new file mode 100644 index 00000000..6b0d3212 --- /dev/null +++ b/docs/ca/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Dimensions de pàgina +description: Analitza les mides, les orientacions, les proporcions i la rotació de les pàgines d'un PDF. Detecta documents amb mides mixtes i exporta les dades a CSV. +--- + +# Dimensions de pàgina + +Una eina de diagnòstic que llegeix cada pàgina del PDF i en informa de les dimensions exactes, l'orientació, el nom de la mida estàndard, la proporció, l'àrea i la rotació. És útil per detectar pàgines de mides diferents abans d'imprimir o per documentar les propietats d'un PDF que has rebut. + +## Com funciona + +1. Carrega un fitxer PDF. L'anàlisi comença automàticament, sense cap botó per prémer. +2. Un quadre de resum mostra el total de pàgines, el nombre de mides de pàgina úniques i si el document té mides mixtes. +3. Consulta la taula completa de resultats amb els detalls de cada pàgina. +4. Canvia les unitats de visualització entre punts, polzades, mil·límetres o píxels. +5. Fes clic a **Exporta a CSV** per desar les dades. + +## Camps de l'informe + +| Columna | Descripció | +| -------------- | ------------------------------------------------------ | +| Pàg. núm. | Número de pàgina correlatiu | +| Dimensions | Amplada x Alçada en la unitat seleccionada | +| Mida estàndard | Nom coincident (A4, Letter, etc.) o "Personalitzada" | +| Orientació | Vertical o Horitzontal | +| Proporció | Relació entre amplada i alçada en decimal | +| Àrea | Àrea de la pàgina en la unitat seleccionada al quadrat | +| Rotació | Rotació de la pàgina en graus | + +## Característiques + +- Detecció automàtica de mides de paper estàndard (A3, A4, A5, Letter, Legal, Tabloid i més) +- Avís de document amb mides mixtes amb el detall de quines mides apareixen i quantes pàgines n'utilitzen cadascuna +- Conversió d'unitats entre punts, polzades, mil·límetres i píxels (a 96 PPI) +- Exportació a CSV per utilitzar-la en fulls de càlcul o sistemes de documentació + +## Casos d'ús + +- Verificar que totes les pàgines són A4 abans de lliurar un document a una impremta +- Diagnosticar per què un PDF fusionat s'imprimeix amb marges inesperats en algunes pàgines +- Documentar el disseny de pàgina d'un gran arxiu de PDF per als registres de metadades +- Identificar pàgines girades que cal corregir + +## Consells + +- Si el resum mostra "Mides mixtes", utilitza l'eina Uniformitza la mida de pàgina per estandarditzar abans d'imprimir. +- El camp de rotació ajuda a identificar pàgines que es mostren correctament però tenen un atribut de rotació diferent de zero, cosa que pot causar problemes en alguns fluxos de treball. + +## Eines relacionades + +- [Uniformitza la mida de pàgina](./fix-page-size): estandarditza les pàgines després d'identificar mides mixtes +- [Comprimeix PDF](./compress-pdf): optimitza el PDF després de corregir els problemes de pàgina +- [Gira PDF](./rotate-pdf): corregeix les pàgines girades diff --git a/docs/ca/tools/page-numbers.md b/docs/ca/tools/page-numbers.md new file mode 100644 index 00000000..82cc1b08 --- /dev/null +++ b/docs/ca/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Números de pàgina +description: Afegeix números de pàgina personalitzables a qualsevol posició de les pàgines del PDF amb tipus de lletra, mida i color configurables. +--- + +# Números de pàgina + +Afegeix números de pàgina visibles a totes les pàgines del PDF. Tu tries la posició, el format, la mida del text i el color, i l'eina fa la resta. + +## Com funciona + +1. Carrega el fitxer PDF. +2. Configura els paràmetres dels números de pàgina al quadre d'opcions que apareix. +3. Fes clic a **Afegeix números de pàgina** per processar. +4. El PDF numerat es baixa automàticament. + +## Opcions + +- **Posició**: tria on apareixen els números de pàgina: a baix al centre, a baix a l'esquerra, a baix a la dreta, a dalt al centre, a dalt a l'esquerra o a dalt a la dreta. +- **Format**: selecciona entre la numeració simple (1, 2, 3...) o el format "pàgina X de Y" (1 / 5, 2 / 5...). +- **Mida del text**: defineix la mida del text del número de pàgina. Per defecte, 12. +- **Color**: tria qualsevol color per al text del número de pàgina amb el selector de color. + +## Característiques + +- Sis opcions de posició que cobreixen totes les cantonades i les posicions centrals +- Dos formats de numeració: correlatiu simple o "pàgina X de Y" +- Mida del text personalitzable de 6 a 72 punts +- Selector de color complet per al color del text +- Gestió automàtica dels marges que manté els números dins de les àrees segures, sigui quina sigui la mida de la pàgina + +## Casos d'ús + +- Preparar documents per imprimir que necessiten referències de pàgina visibles +- Afegir números de pàgina a un PDF fusionat creat a partir de diversos fitxers d'origen +- Numerar el material de les presentacions abans de distribuir-lo +- Afegir numeració correlativa a documents legals o contractes + +## Consells + +- El format "pàgina X de Y" és útil per als documents en què els lectors necessiten saber la longitud total, com ara propostes o informes. +- Si necessites estils de numeració diferents per a seccions diferents (com xifres romanes per a les pàgines preliminars), utilitza l'eina [Afegeix etiquetes de pàgina](./add-page-labels). + +## Eines relacionades + +- [Afegeix etiquetes de pàgina](./add-page-labels) +- [Numeració Bates](./bates-numbering) +- [Capçalera i peu de pàgina](./header-footer) diff --git a/docs/ca/tools/pdf-booklet.md b/docs/ca/tools/pdf-booklet.md new file mode 100644 index 00000000..27fac804 --- /dev/null +++ b/docs/ca/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Fullet PDF +description: Reorganitza les pàgines d'un PDF en l'ordre de fullet (grapat pel llom) per plegar-les i grapar-les en un fullet físic. +--- + +# Fullet PDF + +Reorganitza les pàgines d'un PDF en l'ordre d'imposició de fullet. Quan s'imprimeix a doble cara i es plega per la meitat, les pàgines queden en la seqüència de lectura correcta. És el disseny que s'utilitza per als fullets grapats pel llom i els fanzins. + +## Com funciona + +1. Carrega un fitxer PDF. +2. Configura els paràmetres del fullet: mida i orientació de la pàgina de sortida. +3. Fes clic a **Genera la previsualització** per veure com s'organitzaran les pàgines a cada full. +4. Revisa la previsualització, que mostra cada full físic amb les pàgines assignades al davant i al darrere. +5. Fes clic a **Baixa** per desar el PDF amb la imposició de fullet. + +## Característiques + +- Reordenació automàtica de pàgines per a l'enquadernació grapada pel llom +- Mida de la pàgina de sortida configurable +- Previsualització visual del disseny del fullet abans de baixar-lo +- Gestiona els nombres senars de pàgines inserint-hi pàgines en blanc quan cal +- Escala les pàgines d'origen perquè càpiguen a la mida del full del fullet + +## Casos d'ús + +- Crear fullets o fanzins imprimibles a partir d'un PDF normal +- Preparar programes de congressos o guies d'esdeveniments per imprimir-los internament +- Fer targetes de felicitació plegades o catàlegs petits +- Produir quaderns de poemes o recopilacions de poesia per enquadernar a mà + +## Consells + +- Idealment, el nombre de pàgines del PDF d'origen hauria de ser múltiple de 4 per obtenir un fullet net. Si no ho és, s'afegeixen pàgines en blanc automàticament per completar l'últim full. +- Imprimeix la sortida a doble cara amb l'opció "gira pel costat curt" de la impressora, després plega tots els fulls junts i grapa'ls pel llom. +- Per posar simplement diverses pàgines en un full sense l'ordre de fullet, utilitza [PDF amb diverses pàgines per full](./n-up-pdf). + +## Eines relacionades + +- [PDF amb diverses pàgines per full](./n-up-pdf) +- [Gira PDF](./rotate-pdf) +- [Afegeix una pàgina en blanc](./add-blank-page) diff --git a/docs/ca/tools/pdf-layers.md b/docs/ca/tools/pdf-layers.md new file mode 100644 index 00000000..882b76ae --- /dev/null +++ b/docs/ca/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Capes OCG de PDF +description: Visualitza, mostra o amaga, afegeix i suprimeix capes de grups de contingut opcional (OCG) en un document PDF. +--- + +# Capes OCG de PDF + +Gestiona els grups de contingut opcional (OCG), coneguts habitualment com a "capes", d'un PDF. Pots mostrar o amagar capes, afegir-ne de noves (incloses capes filles niades), suprimir-ne i desar el PDF modificat. + +## Com funciona + +1. Carrega un fitxer PDF. +2. Fes clic al botó de processar per carregar el document amb el motor PyMuPDF. +3. L'eina mostra totes les capes existents amb l'estat de visibilitat, l'estat de bloqueig i la jerarquia d'imbricació. +4. Marca o desmarca les caselles per mostrar o amagar capes. Les capes bloquejades no es poden canviar. +5. Afegeix capes de nivell superior escrivint un nom i fent clic al botó d'afegir, o afegeix capes filles sota una capa mare existent. +6. Suprimeix les capes que ja no necessitis. +7. Fes clic a **Desa** per baixar el PDF modificat amb els canvis de capes aplicats. + +## Característiques + +- Mostra la jerarquia de capes amb la sagnia adequada per a les capes niades +- Mostra o amaga la visibilitat de cada capa +- L'indicador de capa bloquejada evita canvis accidentals +- Afegeix capes de nivell superior o filles amb noms personalitzats +- Suprimeix capes individuals +- Desa tots els canvis en un fitxer PDF nou + +## Casos d'ús + +- Mostrar o amagar capes de marcatge en plànols d'arquitectura o enginyeria +- Afegir noves capes d'anotació a un document de disseny amb diverses capes +- Eliminar capes obsoletes d'una plantilla abans de distribuir-la +- Inspeccionar quines capes té un PDF complex rebut d'un tercer + +## Consells + +- Si el PDF no té capes, l'eina mostra un estat buit amb una invitació a afegir-ne una. No tots els PDF utilitzen capes OCG: són més habituals en exportacions de CAD i fitxers de disseny. +- Les capes filles apareixen amb sagnia sota la capa mare. Pots niar capes a qualsevol profunditat. +- Les capes bloquejades es mostren amb una icona de cadenat i les caselles estan desactivades. Aquests bloquejos els defineix el creador del PDF. + +## Eines relacionades + +- [Visualitza les metadades](./view-metadata) +- [Edita les metadades](./edit-metadata) +- [Duplica i organitza](./organize-pdf) diff --git a/docs/ca/tools/pdf-multi-tool.md b/docs/ca/tools/pdf-multi-tool.md new file mode 100644 index 00000000..cba67858 --- /dev/null +++ b/docs/ca/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Eina PDF multifunció +description: Un gestor de pàgines tot en un per fusionar, dividir, girar, duplicar, suprimir i reordenar pàgines de PDF. +--- + +# Eina PDF multifunció + +Un espai de treball unificat per a totes les operacions de PDF a nivell de pàgina. Carrega un o més PDF i treballa amb totes les pàgines en una sola quadrícula visual. Gira, reordena, duplica, suprimeix, insereix PDF nous, afegeix pàgines en blanc i divideix el resultat, sense sortir de l'eina. + +## Com funciona + +1. Fes clic a **Carrega PDF** o arrossega fitxers a la zona de càrrega. Admet diversos fitxers. +2. Totes les pàgines de tots els fitxers carregats apareixen en una quadrícula desplaçable amb miniatures. +3. Utilitza la barra d'eines o els botons d'acció de cada pàgina per manipular les pàgines. +4. Selecciona pàgines amb la casella de cada targeta i aplica-hi operacions en bloc. +5. Marca punts de divisió amb la icona de les tisores per dividir la sortida en fitxers separats. +6. Fes clic a **Exporta PDF** per baixar el resultat final. Si hi ha marques de divisió, la sortida és un ZIP amb diversos PDF. + +## Característiques + +- **Fusiona**: carrega diversos PDF i es combinen automàticament en un sol espai de treball +- **Reordena**: arrossega i deixa anar les targetes de pàgina per canviar la seqüència +- **Gira**: rotació per pàgina o en bloc en increments de 90 graus (a l'esquerra o a la dreta) +- **Duplica**: clona qualsevol pàgina amb un clic +- **Suprimeix**: elimina pàgines individuals o suprimeix en bloc les seleccionades +- **Insereix PDF**: afegeix un PDF nou després de qualsevol pàgina concreta +- **Afegeix una pàgina en blanc**: afegeix una pàgina A4 en blanc al final +- **Divideix**: col·loca marques de divisió entre pàgines i exporta com a ZIP de PDF separats +- **Selecciona-ho tot / Desselecciona-ho tot**: selecció ràpida per a operacions en bloc +- **Desfés / Refés**: historial complet de desfer i refer per a cada operació +- **Baixa la selecció**: exporta només les pàgines seleccionades com a PDF independent +- Repara automàticament els PDF malmesos abans de carregar-los + +## Casos d'ús + +- Crear un document personalitzat amb pàgines de diversos PDF d'origen +- Netejar un document escanejat suprimint pàgines en blanc, girant els escanejos de costat i reordenant seccions +- Dividir un PDF gran pels límits dels capítols amb marques de divisió visuals +- Edició ràpida a nivell de pàgina sense necessitat d'un editor de PDF complet + +## Consells + +- El sistema de desfer i refer registra cada operació. Utilitza'l amb llibertat: no pots destruir el teu treball per accident. +- Les marques de divisió apareixen com a línies blaves discontínues entre pàgines. Col·loca-les visualment on vulguis dividir el document i exporta per obtenir un ZIP. +- Per a tasques senzilles de fusió o divisió, les eines dedicades [Fusiona PDF](./merge-pdf) o [Divideix PDF](./split-pdf) poden ser més ràpides. L'eina multifunció destaca quan necessites fer diverses operacions en una sola sessió. + +## Eines relacionades + +- [Fusiona PDF](./merge-pdf) +- [Divideix PDF](./split-pdf) +- [Duplica i organitza](./organize-pdf) +- [Gira PDF](./rotate-pdf) diff --git a/docs/ca/tools/pdf-to-bmp.md b/docs/ca/tools/pdf-to-bmp.md new file mode 100644 index 00000000..164d9322 --- /dev/null +++ b/docs/ca/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF a BMP +description: Converteix pàgines de PDF en imatges BMP sense comprimir. Útil per a sistemes antics i fluxos d'impressió que requereixen mapes de bits. +--- + +# PDF a BMP + +Converteix cada pàgina d'un PDF en una imatge BMP (mapa de bits). BMP és un format sense comprimir, de manera que la sortida és exacta fins al píxel i sense pèrdua de qualitat, però els fitxers són grans. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Fes clic a **Converteix** per processar el fitxer. +3. Es baixa automàticament un sol fitxer `.bmp` o un arxiu ZIP. + +## Opcions + +Aquesta eina no té opcions configurables. Les pàgines es renderitzen a una escala fixa de 2x, cosa que produeix imatges d'aproximadament el doble de les dimensions natives de la pàgina del PDF. + +## Format de sortida + +- **Una pàgina**: `filename.bmp` +- **Diverses pàgines**: `filename_bmps.zip` amb `page_1.bmp`, `page_2.bmp`, etc. + +## Casos d'ús + +- Introduir pàgines de PDF en sistemes antics o maquinari que només accepten BMP. +- Preparar imatges sense comprimir per a fluxos d'impressió específics. +- Utilitzar la sortida en mapa de bits com a entrada d'eines de processament d'imatges que requereixen dades de píxels en brut. + +## Consells + +- Els fitxers BMP són molt grans perquè emmagatzemen dades de píxels en brut sense compressió. Per a la majoria d'usos, [PDF a PNG](./pdf-to-png) ofereix qualitat sense pèrdua amb fitxers molt més petits. +- Si el sistema de destinació accepta PNG o TIFF, millor aquests formats per estalviar espai al disc. + +## Eines relacionades + +- [PDF a PNG](./pdf-to-png) +- [PDF a TIFF](./pdf-to-tiff) +- [PDF a JPG](./pdf-to-jpg) diff --git a/docs/ca/tools/pdf-to-cbz.md b/docs/ca/tools/pdf-to-cbz.md new file mode 100644 index 00000000..a7d8e0b7 --- /dev/null +++ b/docs/ca/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF a CBZ +description: Converteix un PDF en un fitxer CBZ (Comic Book Archive) per a lectors de còmics com Komga, Kavita, CDisplayEx i Calibre. +--- + +# PDF a CBZ + +Converteix un PDF en un fitxer CBZ (Comic Book ZIP), el format estàndard dels còmics i el manga digitals. Cada pàgina del PDF es converteix en una imatge dins de l'arxiu. L'eina genera metadades en tres formats per garantir la màxima compatibilitat: ComicInfo.xml, metadata.opf i JSON de ComicBookInfo. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Tria el format d'imatge, la qualitat, l'escala i les metadades opcionals. +3. Fes clic a **Converteix** per generar el fitxer CBZ. +4. El fitxer `.cbz` es baixa automàticament. + +## Opcions + +| Opció | Valors | Per defecte | Descripció | +| -------------------- | --------------- | ----------- | ----------------------------------------------------------------------------------------------------------- | +| Format d'imatge | JPEG, PNG, WebP | JPEG | JPEG per a còmics en color, PNG per a manga en blanc i negre sense pèrdua, WebP per a la millor compressió. | +| Qualitat | 50–100% | 85% | Controla la compressió de JPEG/WebP. Amagada per a PNG (sempre sense pèrdua). | +| Escala | 1.0x–4.0x | 2.0x | Una escala més alta produeix imatges més nítides per a pantalles d'alta resolució. | +| Escala de grisos | Sí/No | No | Converteix les pàgines a escala de grisos. Redueix la mida del fitxer en contingut en blanc i negre. | +| Mode manga | Sí/No | No | Defineix la direcció de lectura de dreta a esquerra a les metadades. | +| Inclou les metadades | Sí/No | Sí | Incrusta ComicInfo.xml, metadata.opf i el JSON de ComicBookInfo. | + +## Camps de metadades + +Quan les metadades estan activades, pots omplir: + +- **Títol**: es detecta automàticament a partir del nom del fitxer PDF. +- **Sèrie**: el nom de la sèrie (p. ex., "Naruto"). +- **Número (#)**: número de l'exemplar dins de la sèrie. +- **Volum (Vol.)**: número de volum. +- **Autor(s)**: nom de l'escriptor o creador. +- **Editorial**: l'empresa editora. +- **Etiquetes / Gènere**: etiquetes separades per comes (p. ex., "Acció, Aventura"). +- **Any de publicació**: any de publicació (1900–2100). +- **Valoració**: valoració de la comunitat de 0 a 5. + +## Compatibilitat de les metadades + +L'eina escriu les metadades en tres formats perquè tots els lectors les puguin trobar: + +| Format | Ubicació | Compatible amb | +| ------------------ | ------------------------- | ------------------------------------------- | +| ComicInfo.xml | Fitxer dins del ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Fitxer dins del ZIP | Calibre | +| ComicBookInfo JSON | Camp de comentari del ZIP | Calibre (alternativa) | + +## Format de sortida + +- `filename.cbz`: un arxiu ZIP amb les imatges de les pàgines numerades i els fitxers de metadades. + +Les imatges de les pàgines es nomenen amb números emplenats amb zeros (`01.jpg`, `02.jpg`, etc.) perquè els lectors les mostrin en l'ordre correcte. + +## Casos d'ús + +- Convertir PDF de manga o còmics per utilitzar-los amb lectors de còmics. +- Crear una biblioteca de còmics digital a Komga, Kavita o Calibre. +- Convertir còmics escanejats a un format còmode per als lectors. +- Compartir còmics en un format que conserva la direcció de lectura i les metadades. + +## Consells + +- Utilitza **JPEG** per a còmics en color i **PNG** per a manga en blanc i negre: PNG comprimeix molt eficientment el contingut en blanc i negre. +- Activa l'**Escala de grisos** per al manga per reduir significativament la mida del fitxer. +- Omple els camps **Sèrie** i **Número** perquè els gestors de biblioteca (Komga, Calibre) puguin organitzar la teva col·lecció automàticament. +- **WebP** ofereix la millor compressió, però els lectors de còmics més antics poden no ser-hi compatibles. + +## Eines relacionades + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a PNG](./pdf-to-png) +- [PDF a TIFF](./pdf-to-tiff) +- [Extreu imatges](./extract-images) diff --git a/docs/ca/tools/pdf-to-csv.md b/docs/ca/tools/pdf-to-csv.md new file mode 100644 index 00000000..0396d19b --- /dev/null +++ b/docs/ca/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF a CSV +description: Extreu taules de documents PDF i exporta-les en un únic fitxer CSV. Admet PDF de diverses pàgines amb detecció automàtica de taules. +--- + +# PDF a CSV + +Extreu les taules d'un PDF i les exporta com a fitxer CSV. L'eina analitza cada pàgina a la cerca de dades tabulars amb el motor de detecció de taules de PyMuPDF i després escriu totes les files trobades en una única sortida separada per comes. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Fes clic a **Converteix** per iniciar l'extracció de taules. +3. L'eina analitza cada pàgina i identifica les taules automàticament. +4. Es baixa un fitxer `.csv` amb totes les dades de les taules extretes. + +Les taules de pàgines diferents se separen amb files en blanc a la sortida. Les cel·les que contenen comes, cometes o salts de línia s'escapen correctament segons la RFC 4180. + +## Opcions + +Aquesta eina no té opcions configurables. Totes les taules trobades al document s'extreuen i es combinen en un únic CSV. + +## Format de sortida + +- Un únic fitxer `filename.csv` amb totes les taules detectades. + +## Casos d'ús + +- Passar a un full de càlcul dades financeres d'extractes bancaris o factures en PDF. +- Extreure taules de preus de pressupostos de proveïdors per comparar-les. +- Convertir dades de recerca tabulars de treballs en PDF a un format adequat per a eines d'anàlisi. +- Migrar dades d'informes PDF antics a bases de dades. + +## Consells + +- Si no es troba cap taula, l'eina mostra el missatge "No s'ha trobat cap taula". Normalment vol dir que el PDF utilitza una disposició de text que sembla tabular però que no està estructurada com una taula real. +- Per tenir més control sobre cada taula, utilitza [Extreu taules](./extract-tables), que et permet triar entre els formats de sortida CSV, JSON i Markdown. +- Si necessites les dades en format Excel amb un full per a cada taula, utilitza [PDF a Excel](./pdf-to-excel). + +## Eines relacionades + +- [PDF a Excel](./pdf-to-excel) +- [Extreu taules](./extract-tables) +- [PDF a text](./pdf-to-text) diff --git a/docs/ca/tools/pdf-to-excel.md b/docs/ca/tools/pdf-to-excel.md new file mode 100644 index 00000000..5f7bc07f --- /dev/null +++ b/docs/ca/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF a Excel +description: Extreu taules de documents PDF a un full de càlcul d'Excel. Cada taula té el seu propi full amb referència de pàgina. +--- + +# PDF a Excel + +Extreu les taules d'un PDF i les desa com a full de càlcul d'Excel (`.xlsx`). Cada taula detectada es col·loca en el seu propi full, etiquetat amb el número de taula i la pàgina d'origen. Funciona amb PyMuPDF per a la detecció de taules i la biblioteca SheetJS per generar l'Excel. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Fes clic a **Converteix** per iniciar l'extracció de taules. +3. L'eina analitza cada pàgina a la cerca de taules i després crea un llibre d'Excel. +4. Es baixa un fitxer `.xlsx` amb un full per a cada taula. + +## Opcions + +Aquesta eina no té opcions configurables. Totes les taules detectades s'extreuen automàticament. + +## Format de sortida + +- Un únic fitxer `filename.xlsx`. +- **Una taula**: un sol full anomenat "Table". +- **Diverses taules**: fulls anomenats "Table 1 (Page 3)", "Table 2 (Page 5)", etc. Els noms dels fulls es trunquen a 31 caràcters (el límit d'Excel). + +## Casos d'ús + +- Convertir informes financers en PDF a fulls de càlcul editables per continuar l'anàlisi. +- Extreure taules d'inventari o de comandes de PDF de proveïdors. +- Passar dades estructurades de formularis o catàlegs en PDF a Excel per ordenar-les i filtrar-les. +- Arxivar dades tabulars de PDF en un format amb el qual els companys no tècnics puguin treballar. + +## Consells + +- Si l'eina informa "No s'ha trobat cap taula", el PDF probablement utilitza una disposició de text lliure en lloc de taules estructurades. Prova [PDF a text](./pdf-to-text) per obtenir el contingut en brut. +- Per a un format pla més senzill, utilitza [PDF a CSV](./pdf-to-csv). Per a baixades per taula en diversos formats, utilitza [Extreu taules](./extract-tables). +- Revisa els noms dels fulls per identificar de quina pàgina prové cada taula. + +## Eines relacionades + +- [PDF a CSV](./pdf-to-csv) +- [Extreu taules](./extract-tables) +- [PDF a text](./pdf-to-text) diff --git a/docs/ca/tools/pdf-to-greyscale.md b/docs/ca/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..cfef8f44 --- /dev/null +++ b/docs/ca/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF a escala de grisos +description: Converteix un PDF en color en una versió en escala de grisos (blanc i negre). Genera un PDF nou amb tot el color eliminat de totes les pàgines. +--- + +# PDF a escala de grisos + +Converteix un PDF en color en una versió en escala de grisos. Cada pàgina es renderitza, es desatura i es torna a incrustar com a imatge JPEG en un PDF nou. La sortida conserva les dimensions originals de la pàgina. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Fes clic a **Converteix** per processar el fitxer. +3. Es baixa un `greyscale.pdf` nou amb totes les pàgines convertides a blanc i negre. + +Internament, cada pàgina es renderitza a escala 2x, les dades de píxels passen per un filtre d'escala de grisos i després es tornen a codificar com a JPEG al 90 % de qualitat i es col·loquen en un document PDF nou. + +## Opcions + +Aquesta eina no té opcions configurables. La conversió a escala de grisos utilitza una fórmula de luminància estàndard i la qualitat JPEG està fixada al 90 %. + +## Format de sortida + +- Un únic fitxer `greyscale.pdf` amb totes les pàgines com a imatges JPEG en escala de grisos. + +## Casos d'ús + +- Preparar documents per a la impressió en blanc i negre per estalviar en tinta de color. +- Complir els requisits de presentació de tràmits legals o governamentals que exigeixen l'escala de grisos. +- Reduir la mida de fitxer de PDF amb molt de color (les imatges JPEG en escala de grisos són més petites que les de color). +- Crear un estil visual coherent en documents amb pàgines en color i en blanc i negre. + +## Consells + +- Com que cada pàgina es rasteritza i es torna a incrustar com a JPEG, la sortida és basada en imatges. El text del PDF original ja no es podrà seleccionar ni cercar. Si després necessites text cercable, passa la sortida per l'eina d'OCR. +- Per tenir més control sobre els ajustos de color (brillantor, contrast, saturació), mira l'eina Ajusta els colors o el node d'escala de grisos del [Creador de fluxos de treball PDF](./pdf-workflow). + +## Eines relacionades + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a PNG](./pdf-to-png) +- [Creador de fluxos de treball PDF](./pdf-workflow) diff --git a/docs/ca/tools/pdf-to-jpg.md b/docs/ca/tools/pdf-to-jpg.md new file mode 100644 index 00000000..4352883d --- /dev/null +++ b/docs/ca/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF a JPG +description: Converteix pàgines de PDF en imatges JPG amb qualitat ajustable. Els PDF d'una pàgina es baixen directament; els de diverses pàgines s'exporten com a ZIP. +--- + +# PDF a JPG + +Converteix cada pàgina d'un PDF en una imatge JPG. Els documents d'una sola pàgina es baixen com a fitxer `.jpg` independent. Els PDF de diverses pàgines generen un arxiu ZIP amb un JPG per pàgina. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. L'eina mostra el nom del fitxer, la mida i el nombre de pàgines. +2. Ajusta el control lliscant de **Qualitat** per controlar la compressió del JPG. +3. Fes clic a **Converteix** per iniciar el processament. +4. El resultat es baixa automàticament: un sol JPG per als PDF d'una pàgina o un fitxer ZIP per als documents de diverses pàgines. + +## Opcions + +- **Qualitat**: un control lliscant del 0 % al 100 % (per defecte, 90 %). Els valors més alts produeixen imatges més nítides amb fitxers més grans. Els valors més baixos comprimeixen més agressivament. + +Les pàgines es renderitzen internament a escala 2x, de manera que la resolució de sortida és el doble de les dimensions de la pàgina del PDF. Una pàgina estàndard de mida Letter produeix una imatge d'aproximadament 1.224 x 1.584 píxels. + +## Format de sortida + +- **Una pàgina**: `filename.jpg` +- **Diverses pàgines**: `filename_jpgs.zip` amb `page_1.jpg`, `page_2.jpg`, etc. + +## Casos d'ús + +- Generar miniatures de previsualització per a un sistema de gestió documental. +- Compartir una pàgina d'un informe en un xat o correu que no admet PDF. +- Crear recursos d'imatge a partir de diagrames o il·lustracions d'un PDF. +- Arxivar documents escanejats com a imatges individuals. + +## Consells + +- Per a una sortida sense pèrdua, utilitza [PDF a PNG](./pdf-to-png). +- Una qualitat del 80-90 % ofereix un bon equilibri entre mida de fitxer i fidelitat visual. +- Si necessites un format específic per a cada pàgina, considera el [Creador de fluxos de treball PDF](./pdf-workflow), que té un node de sortida de PDF a imatges. + +## Eines relacionades + +- [PDF a PNG](./pdf-to-png) +- [PDF a WebP](./pdf-to-webp) +- [PDF a BMP](./pdf-to-bmp) +- [PDF a TIFF](./pdf-to-tiff) diff --git a/docs/ca/tools/pdf-to-json.md b/docs/ca/tools/pdf-to-json.md new file mode 100644 index 00000000..f3537d09 --- /dev/null +++ b/docs/ca/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF a JSON +description: Converteix fitxers PDF a format JSON estructurat amb CPDF. Exporta l'estructura interna del PDF com a dades JSON llegibles per màquina. +--- + +# PDF a JSON + +Converteix un o més fitxers PDF a format JSON. L'eina utilitza CPDF (Coherent PDF) per serialitzar l'estructura interna de cada PDF en una representació JSON llegible per màquina. La sortida sempre es lliura com a arxiu ZIP. + +## Com funciona + +1. Selecciona un o més fitxers PDF amb el selector de fitxers. +2. Fes clic a **Converteix** per iniciar el processament. La conversió s'executa en un web worker en segon pla. +3. Es baixa un arxiu ZIP amb un fitxer JSON per a cada PDF d'entrada. + +La barra d'estat mostra el progrés de les etapes de conversió i de creació del ZIP. + +## Opcions + +Aquesta eina no té opcions configurables. Cada PDF es converteix a la seva representació JSON completa. + +## Format de sortida + +- Un fitxer `pdfs-to-json.zip` amb `filename.json` per a cada PDF d'entrada. + +La sortida JSON representa l'estructura interna d'objectes del PDF, incloent-hi els arbres de pàgines, les referències de tipus de lletra, les metadades i els fluxos de contingut. + +## Casos d'ús + +- Inspeccionar l'estructura interna d'un PDF per depurar-lo o validar-lo. +- Extreure de manera programàtica metadades estructurades i propietats de pàgina. +- Alimentar fluxos de processament personalitzats amb dades d'estructura de PDF. +- Auditar documents PDF per complir normatives analitzant-ne els arbres d'objectes. + +## Consells + +- Aquesta eina produeix l'estructura bruta d'objectes del PDF, no el contingut de text extret. Si necessites el text de les pàgines en format JSON, utilitza [Prepara el PDF per a IA](./prepare-pdf-for-ai). +- Per a l'extracció de text net, [PDF a text](./pdf-to-text) és més directe. +- Els PDF grans amb estructures complexes produeixen fitxers JSON molt grans. + +## Eines relacionades + +- [PDF a text](./pdf-to-text) +- [Prepara el PDF per a IA](./prepare-pdf-for-ai) +- [Extreu taules](./extract-tables) diff --git a/docs/ca/tools/pdf-to-markdown.md b/docs/ca/tools/pdf-to-markdown.md new file mode 100644 index 00000000..ad0b4274 --- /dev/null +++ b/docs/ca/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF a Markdown +description: Converteix documents PDF a format Markdown amb extracció opcional d'imatges. Admet la conversió en lot de diversos fitxers. +--- + +# PDF a Markdown + +Converteix fitxers PDF a format Markdown (`.md`) conservant els encapçalaments, els paràgrafs, les llistes i el format bàsic. Opcionalment extreu i inclou les imatges incrustades. Admet la conversió individual i en lot. Funciona amb PyMuPDF. + +## Com funciona + +1. Carrega un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. +2. Opcionalment, activa **Inclou les imatges** per incrustar les imatges extretes a la sortida Markdown. +3. Fes clic a **Converteix** per iniciar el processament. +4. Un sol fitxer es baixa com a `filename.md`. Diversos fitxers generen un `markdown-files.zip`. + +## Opcions + +- **Inclou les imatges**: quan està marcada, les imatges incrustades del PDF s'extreuen i es referencien a la sortida Markdown. Quan no ho està, només es converteix el contingut de text. + +## Format de sortida + +- **Un fitxer**: `filename.md` +- **Diversos fitxers**: `markdown-files.zip` amb un `.md` per a cada PDF d'entrada. + +## Casos d'ús + +- Convertir documentació en PDF a Markdown per a un generador de llocs estàtics com VitePress, Hugo o Jekyll. +- Convertir treballs de recerca en PDF a Markdown editable per a aplicacions de notes com Obsidian. +- Migrar bases de coneixement antigues en PDF a un format de text compatible amb Git. +- Extreure contingut estructurat de llibres electrònics en PDF per reformatar-lo. + +## Consells + +- L'opció Inclou les imatges és útil quan el PDF conté diagrames o figures essencials per al contingut. Desactiva-la en documents amb molt de text per mantenir la sortida neta. +- Els dissenys complexos amb barres laterals, notes al peu o text en diverses columnes poden produir un Markdown imperfecte. Revisa i ajusta la sortida si cal. +- Per a text en brut sense cap format, utilitza [PDF a text](./pdf-to-text). + +## Eines relacionades + +- [PDF a text](./pdf-to-text) +- [PDF a Word](./pdf-to-word) +- [Prepara el PDF per a IA](./prepare-pdf-for-ai) diff --git a/docs/ca/tools/pdf-to-pdfa.md b/docs/ca/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..8010ba10 --- /dev/null +++ b/docs/ca/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF a PDF/A +description: Converteix PDF estàndard a format PDF/A per a l'arxivament a llarg termini. Admet els nivells de conformitat PDF/A-1b, PDF/A-2b i PDF/A-3b. +--- + +# PDF a PDF/A + +PDF/A és un subconjunt de PDF normalitzat per l'ISO i pensat per a la preservació digital a llarg termini. Aquesta eina converteix els teus PDF estàndard en documents compatibles amb PDF/A amb Ghostscript executant-se directament al navegador. + +## Com funciona + +1. Carrega un o més fitxers PDF. +2. Selecciona una **versió de PDF/A** al menú desplegable. +3. Opcionalment, activa **Aplana el PDF prèviament** per a fitxers complexos que fallen amb la conversió normal. +4. Fes clic a **Converteix a PDF/A**. Si són diversos fitxers, es genera un arxiu ZIP. + +## Versions de PDF/A + +| Versió | Restriccions | Ideal per a | +| ------------ | ----------------------------------------------- | ------------------------------------------------- | +| **PDF/A-1b** | La més estricta. Sense transparències ni capes. | Màxima compatibilitat amb sistemes d'arxiu antics | +| **PDF/A-2b** | Permet transparències i JPEG2000. | Arxivament de propòsit general (recomanada) | +| **PDF/A-3b** | Permet adjunts incrustats de qualsevol format. | Arxivar documents amb fitxers de dades d'origen | + +PDF/A-2b ve seleccionada per defecte i serveix per a la gran majoria de necessitats d'arxivament. + +## Opció d'aplanament previ + +Alguns PDF contenen característiques que impedeixen una conversió neta a PDF/A: codificacions de tipus de lletra poc habituals, piles de transparència complexes o estructures internes malmeses. Activar l'**aplanament previ** rasteritza el PDF a 300 DPI abans de la conversió, cosa que garanteix la conformitat a costa que el text deixi de ser seleccionable. Utilitza'l com a alternativa quan la conversió estàndard produeixi errors. + +L'aplanament previ requereix el motor WASM de PyMuPDF. + +## Casos d'ús + +- Complir els requisits d'arxivament governamentals o legals (moltes jurisdiccions exigeixen PDF/A per als escrits judicials) +- Presentar documents a repositoris institucionals o biblioteques digitals +- Preservar registres empresarials quan el programari original potser ja no existirà d'aquí a deu anys +- Preparar factures per a estàndards de facturació electrònica que requereixen PDF/A-3b amb adjunts XML + +## Consells + +- Prova primer la conversió sense aplanament previ. Activa'l només si obtens un error. +- PDF/A incrusta tots els tipus de lletra, de manera que els fitxers de sortida sovint són més grans que els originals. +- Valida la sortida amb un validador de PDF/A específic si el teu flux de treball requereix una conformitat estricta. + +## Eines relacionades + +- [Comprimeix PDF](./compress-pdf): redueix la mida del fitxer després de la conversió +- [Aplana PDF](./flatten-pdf): aplana els formularis abans de convertir a PDF/A +- [Elimina les metadades](./remove-metadata): suprimeix les metadades abans d'arxivar diff --git a/docs/ca/tools/pdf-to-png.md b/docs/ca/tools/pdf-to-png.md new file mode 100644 index 00000000..7a0c4746 --- /dev/null +++ b/docs/ca/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF a PNG +description: Converteix pàgines de PDF en imatges PNG sense pèrdua amb escala ajustable. Ideal per a captures d'alta qualitat i fons transparents. +--- + +# PDF a PNG + +Converteix cada pàgina d'un PDF en una imatge PNG. PNG utilitza compressió sense pèrdua, de manera que la sortida conserva tots els detalls de la pàgina original. Els PDF d'una pàgina es baixen com a fitxer `.png`; els de diverses pàgines generen un ZIP. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Defineix el control lliscant d'**Escala** per controlar la resolució de sortida. +3. Fes clic a **Converteix** per iniciar el processament. +4. Un sol PNG o un arxiu ZIP es baixa automàticament. + +## Opcions + +- **Escala**: va d'1.0x a 3.0x (per defecte 2.0x). A 2.0x, una pàgina estàndard de mida Letter es renderitza a aproximadament 1.224 x 1.584 píxels. Els valors d'escala més alts produeixen imatges més grans i nítides a costa de la mida del fitxer i del temps de processament. + +## Format de sortida + +- **Una pàgina**: `filename.png` +- **Diverses pàgines**: `filename_pngs.zip` amb `page_1.png`, `page_2.png`, etc. + +## Casos d'ús + +- Capturar pàgines de PDF amb gran fidelitat per a presentacions. +- Extreure gràfics o diagrames que necessiten vores nítides i cap artefacte de compressió. +- Preparar recursos per al disseny web a partir de maquetes en PDF. +- Crear imatges de pàgina sense pèrdua per al preprocessament d'OCR. + +## Consells + +- Els fitxers PNG són molt més grans que els JPG. Si la mida del fitxer importa més que la qualitat perfecta, utilitza [PDF a JPG](./pdf-to-jpg) o [PDF a WebP](./pdf-to-webp). +- A escala 1.0x, la sortida coincideix amb la resolució nativa del PDF. Puja a 3.0x per a exportacions amb qualitat d'impressió. + +## Eines relacionades + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a WebP](./pdf-to-webp) +- [PDF a SVG](./pdf-to-svg) diff --git a/docs/ca/tools/pdf-to-svg.md b/docs/ca/tools/pdf-to-svg.md new file mode 100644 index 00000000..dcd89b24 --- /dev/null +++ b/docs/ca/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF a SVG +description: Converteix pàgines de PDF en gràfics vectorials SVG escalables. Conserva el text i les formes com a traçats vectorials per a un escalat infinit. +--- + +# PDF a SVG + +Converteix cada pàgina d'un PDF en un fitxer SVG (Scalable Vector Graphics). A diferència dels formats ràster, SVG conserva els traçats vectorials, el text i les formes, de manera que la sortida s'escala a qualsevol mida sense pixelar-se. Funciona amb PyMuPDF. + +## Com funciona + +1. Carrega un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. Pots afegir diversos fitxers i gestionar-los individualment. +2. Fes clic a **Converteix** per processar tots els fitxers carregats. +3. Les conversions d'un sol fitxer d'una sola pàgina es baixen com a `.svg` independent. La resta es baixa com a arxiu ZIP. + +## Opcions + +Aquesta eina no té opcions configurables. Cada pàgina es converteix a SVG amb l'exportació vectorial nativa de PyMuPDF. + +## Format de sortida + +- **Un fitxer, una pàgina**: `filename.svg` +- **Un fitxer, diverses pàgines**: `filename_svg.zip` amb `page_1.svg`, `page_2.svg`, etc. +- **Diversos fitxers**: `pdf_to_svg.zip` amb els fitxers organitzats pel nom del document d'origen. + +## Casos d'ús + +- Extreure diagrames vectorials, gràfics o il·lustracions d'informes en PDF per utilitzar-los en pàgines web. +- Editar el contingut de les pàgines d'un PDF en un editor vectorial com Inkscape o Illustrator. +- Incrustar previsualitzacions de pàgines escalables en aplicacions web adaptables. +- Extreure logotips o gràfics de fullets en PDF conservant les vores nítides. + +## Consells + +- SVG funciona millor amb PDF que contenen contingut vectorial. Els documents escanejats o els PDF amb moltes imatges produiran fitxers SVG grans amb dades ràster incrustades. +- Per a una sortida ràster de PDF amb moltes imatges, utilitza [PDF a PNG](./pdf-to-png) o [PDF a JPG](./pdf-to-jpg). +- Aquesta eina admet la conversió en lot: carrega diversos PDF alhora per convertir-los tots en una sola execució. + +## Eines relacionades + +- [PDF a PNG](./pdf-to-png) +- [PDF a JPG](./pdf-to-jpg) +- [PDF a Markdown](./pdf-to-markdown) diff --git a/docs/ca/tools/pdf-to-text.md b/docs/ca/tools/pdf-to-text.md new file mode 100644 index 00000000..a94bd157 --- /dev/null +++ b/docs/ca/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF a text +description: Extreu el contingut de text net de fitxers PDF. Admet l'extracció en lot de diversos PDF amb sortida en fitxers TXT. +--- + +# PDF a text + +Extreu tot el contingut de text de fitxers PDF i el desa com a fitxers `.txt` de text net. Admet el processament en lot: carrega diversos PDF i obtén el text de cadascun en una sola operació. Funciona amb PyMuPDF. + +## Com funciona + +1. Carrega un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. Gestiona la llista de fitxers amb els botons Afegeix més i Esborra. +2. Fes clic a **Extreu** per iniciar el processament. +3. Un sol fitxer es baixa com a `filename.txt`. Diversos fitxers generen un arxiu `pdf-to-text.zip`. + +## Opcions + +Aquesta eina no té opcions configurables. Tot el contingut de text s'extreu de cada pàgina en ordre de lectura. + +## Format de sortida + +- **Un fitxer**: `filename.txt` +- **Diversos fitxers**: `pdf-to-text.zip` amb un `.txt` per a cada PDF d'entrada. + +## Casos d'ús + +- Extreure el cos de text d'informes en PDF per a la indexació de cerca de text complet. +- Convertir llibres electrònics o articles en PDF a text net per llegir-los en dispositius de tinta electrònica. +- Obtenir text de contractes o documents legals per a l'anàlisi de paraules clau. +- Eliminar el format dels PDF per obtenir text net per a scripts de processament de dades. +- Preparar un corpus de text a partir d'arxius de PDF per al processament del llenguatge natural. + +## Consells + +- Els PDF escanejats (només imatge) produiran fitxers de text buits perquè no hi ha capa de text per extreure. Passa abans els documents escanejats per OCR. +- La sortida conserva l'ordre de lectura tal com l'interpreta PyMuPDF, que en general segueix d'esquerra a dreta i de dalt a baix. Els dissenys de diverses columnes poden produir text entrellaçat. +- Per a una sortida estructurada amb encapçalaments i format, prova [PDF a Markdown](./pdf-to-markdown). Per a un JSON estructurat preparat per a IA, utilitza [Prepara el PDF per a IA](./prepare-pdf-for-ai). + +## Eines relacionades + +- [PDF a Markdown](./pdf-to-markdown) +- [Prepara el PDF per a IA](./prepare-pdf-for-ai) +- [PDF a Word](./pdf-to-word) diff --git a/docs/ca/tools/pdf-to-tiff.md b/docs/ca/tools/pdf-to-tiff.md new file mode 100644 index 00000000..a19dbf93 --- /dev/null +++ b/docs/ca/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF a TIFF +description: Converteix pàgines de PDF en imatges TIFF, molt utilitzades en fluxos d'impressió, fax i arxivament. Recorre a PNG si la codificació falla. +--- + +# PDF a TIFF + +Converteix cada pàgina d'un PDF en una imatge TIFF. TIFF és el format estàndard per a la producció d'impressió, els sistemes de fax i l'arxivament de documents. L'eina utilitza compressió PackBits per a la codificació TIFF i recorre a PNG si una pàgina no es pot codificar. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Fes clic a **Converteix** per processar el fitxer. +3. Un sol fitxer TIFF o un arxiu ZIP es baixa automàticament. + +## Opcions + +Aquesta eina no té opcions configurables. Les pàgines es renderitzen a una escala fixa de 2x. + +## Format de sortida + +- **Una pàgina**: `filename.tiff` +- **Diverses pàgines**: `filename_tiffs.zip` amb `page_1.tiff`, `page_2.tiff`, etc. + +Si la codificació TIFF falla en una pàgina concreta (per problemes de compressió), aquesta pàgina es desa com a fitxer `.png`. En aquest cas, el ZIP contindrà una barreja de fitxers TIFF i PNG. + +## Casos d'ús + +- Presentar documents a organismes governamentals o sistemes legals que exigeixen el format TIFF. +- Preparar pàgines per transmetre-les per fax mitjançant serveis de fax digitals. +- Arxivar documents escanejats en un format sense pèrdua àmpliament compatible. +- Introduir pàgines en sistemes de gestió documental empresarials. + +## Consells + +- Els fitxers TIFF són grans. Si només necessites qualitat sense pèrdua per a ús web o en pantalla, [PDF a PNG](./pdf-to-png) és una opció millor. +- Revisa el contingut del ZIP si algunes pàgines han necessitat l'alternativa PNG: potser vulguis convertir-les per separat. + +## Eines relacionades + +- [PDF a PNG](./pdf-to-png) +- [PDF a BMP](./pdf-to-bmp) +- [PDF a JPG](./pdf-to-jpg) diff --git a/docs/ca/tools/pdf-to-webp.md b/docs/ca/tools/pdf-to-webp.md new file mode 100644 index 00000000..5edc0a91 --- /dev/null +++ b/docs/ca/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF a WebP +description: Converteix pàgines de PDF en imatges WebP amb qualitat ajustable. Fitxers més petits que JPG amb una qualitat visual comparable. +--- + +# PDF a WebP + +Converteix cada pàgina d'un PDF en una imatge WebP. WebP sol produir fitxers entre un 25 % i un 35 % més petits que JPG amb la mateixa qualitat percebuda, cosa que el converteix en una bona opció per a l'ús web. + +## Com funciona + +1. Carrega un PDF fent clic a la zona de càrrega o arrossegant-hi un fitxer. +2. Ajusta el control lliscant de **Qualitat**. +3. Fes clic a **Converteix** per processar el fitxer. +4. Un sol fitxer `.webp` o un arxiu ZIP es baixa automàticament. + +## Opcions + +- **Qualitat**: un control lliscant del 0 % al 100 % (per defecte 85 %). Controla el nivell de compressió amb pèrdua. Els valors més alts conserven més detall. + +Les pàgines es renderitzen internament a escala 2x, de manera que s'obtenen imatges d'aproximadament el doble de les dimensions natives del PDF. + +## Format de sortida + +- **Una pàgina**: `filename.webp` +- **Diverses pàgines**: `filename_webps.zip` amb `page_1.webp`, `page_2.webp`, etc. + +## Casos d'ús + +- Preparar previsualitzacions de pàgines per a llocs web on l'ample de banda és important. +- Generar versions d'imatge lleugeres de flyers o fullets per a les xarxes socials. +- Convertir en lot documents de diverses pàgines en un conjunt d'imatges optimitzat per a la web. + +## Consells + +- WebP és compatible amb tots els navegadors moderns. Per a la compatibilitat amb sistemes antics, recorre a [PDF a JPG](./pdf-to-jpg). +- Una qualitat del 80-85 % acostuma a ser indistingible de l'original en pantalla i manté els fitxers petits. + +## Eines relacionades + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a PNG](./pdf-to-png) +- [PDF a BMP](./pdf-to-bmp) diff --git a/docs/ca/tools/pdf-to-word.md b/docs/ca/tools/pdf-to-word.md new file mode 100644 index 00000000..c6c14d76 --- /dev/null +++ b/docs/ca/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF a Word +description: Converteix fitxers PDF en documents Word (DOCX) editables. Admet la conversió en lot de diversos PDF alhora. +--- + +# PDF a Word + +Converteix fitxers PDF en documents Word (`.docx`) editables. L'eina utilitza PyMuPDF per reconstruir el contingut del document, conservant el text, el format bàsic i el disseny. Admet la conversió individual i en lot. + +## Com funciona + +1. Carrega un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. Pots afegir-ne més o eliminar-ne de la llista individualment. +2. Fes clic a **Converteix** per iniciar el processament. +3. Un sol fitxer es baixa com a `filename.docx`. Diversos fitxers s'empaqueten a `converted-documents.zip`. + +## Opcions + +Aquesta eina no té opcions configurables. Cada PDF es converteix a DOCX amb el motor de conversió integrat de PyMuPDF. + +## Format de sortida + +- **Un fitxer**: `filename.docx` +- **Diversos fitxers**: `converted-documents.zip` amb un `.docx` per a cada PDF d'entrada. + +## Casos d'ús + +- Editar el text d'un PDF que has rebut i que necessites modificar. +- Convertir informes PDF arxivats en un format que els companys puguin editar a Microsoft Word o Google Docs. +- Passar contingut de contractes o propostes en PDF a Word per revisar-los amb control de canvis. +- Migrar documentació antiga en PDF a un format editable. + +## Consells + +- Els dissenys complexos amb text en diverses columnes, formularis incrustats o molts gràfics poden no convertir-se perfectament. Revisa la sortida i ajusta el format al teu processador de textos. +- Els PDF escanejats (només imatge) produiran fitxers DOCX buits o mínims. Passa'ls abans per OCR per afegir-hi una capa de text. +- El mode en lot és eficient per convertir carpetes senceres de PDF: carrega'ls tots alhora. + +## Eines relacionades + +- [PDF a text](./pdf-to-text) +- [PDF a Markdown](./pdf-to-markdown) +- [Creador de fluxos de treball PDF](./pdf-workflow) diff --git a/docs/ca/tools/pdf-to-zip.md b/docs/ca/tools/pdf-to-zip.md new file mode 100644 index 00000000..ea575f95 --- /dev/null +++ b/docs/ca/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF a ZIP +description: Empaqueta diversos fitxers PDF en un únic arxiu ZIP per compartir-los i desar-los fàcilment. +--- + +# PDF a ZIP + +Agrupa diversos fitxers PDF en un únic arxiu ZIP. És una eina d'empaquetament senzilla: no es converteix, comprimeix ni modifica els PDF. + +## Com funciona + +1. Carrega diversos fitxers PDF amb la zona de càrrega. +2. Revisa la llista de fitxers. Elimina els que no vulguis incloure. +3. Fes clic al botó de processar. +4. Un arxiu ZIP amb tots els PDF carregats es baixa immediatament. + +## Característiques + +- Accepta qualsevol nombre de fitxers PDF +- Eliminació de fitxers individuals abans de crear l'arxiu +- Conserva els noms de fitxer originals dins del ZIP +- No modifica el contingut dels PDF: els fitxers s'empaqueten tal com són +- Mostra el nom i la mida de cada PDF carregat + +## Casos d'ús + +- Agrupar un conjunt de factures o rebuts per adjuntar-los en un correu +- Empaquetar lliurables d'un projecte (diversos informes en PDF) per al traspàs +- Crear una única baixada per a una col·lecció de formularis o plantilles +- Arxivar un lot de documents en un sol fitxer comprimit + +## Consells + +- El fitxer ZIP utilitza els noms de fitxer originals dels PDF. Si tens fitxers amb el mateix nom, canvia'ls abans de carregar-los per evitar conflictes. +- Aquesta eina no comprimeix els PDF en si. Per reduir-ne la mida, passa'ls primer per Comprimeix PDF i després empaqueta'ls amb aquesta eina. + +## Eines relacionades + +- [Fusiona PDF](./merge-pdf) +- [Divideix PDF](./split-pdf) +- [Comprimeix PDF](./compress-pdf) diff --git a/docs/ca/tools/pdf-workflow.md b/docs/ca/tools/pdf-workflow.md new file mode 100644 index 00000000..53a41ba8 --- /dev/null +++ b/docs/ca/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Creador de fluxos de treball PDF +description: Crea fluxos de processament de PDF personalitzats de manera visual connectant nodes en un llenç. Encadena operacions com fusionar, comprimir, afegir marca d'aigua i exportar. +--- + +# Creador de fluxos de treball PDF + +El Creador de fluxos de treball et permet encadenar diverses operacions de PDF en un únic flux automatitzat. En lloc d'executar les eines una per una, connectes un graf visual de nodes (entrada, processament i sortida) i ho executes tot amb un clic. Els teus fitxers no surten mai del navegador. + +## Com funciona + +La interfície es divideix en tres panells: una **caixa de nodes** a l'esquerra, el **llenç** al centre i un **panell de paràmetres** a la dreta que apareix quan selecciones un node. + +1. **Afegeix nodes** fent-hi clic a la barra lateral esquerra o arrossegant-los directament al llenç. Utilitza la barra de cerca de la part superior de la caixa de nodes per filtrar per nom. +2. **Connecta els nodes** arrossegant des d'un connector de sortida (a la part inferior d'un node) fins a un connector d'entrada (a la part superior d'un altre). Les connexions flueixen de dalt a baix. +3. **Configura els paràmetres** fent clic en un node per obrir-ne el panell de paràmetres a la dreta. Cada tipus de node té les seves pròpies opcions (intervals de pàgines, controls lliscants de qualitat, contrasenyes, etc.). +4. **Executa el flux de treball** fent clic al botó **Executa** de la barra d'eines. El motor executa els nodes en ordre topològic, processant-los un darrere l'altre. Una barra d'estat a la part inferior en mostra el progrés. +5. **Baixa els resultats**: el node final Baixa desa el PDF resultant (o un ZIP si es generen diversos fitxers). + +## Categories de nodes + +Els nodes s'organitzen en sis categories, cadascuna amb un color diferent al llenç: + +- **Entrada** (blau): entrada de PDF, entrada d'imatges, Word/Excel/PowerPoint a PDF i més de 15 convertidors d'altres formats que alimenten el flux amb fitxers. +- **Edita i anota** (índigo): retalla, escala de grisos, inverteix els colors, marca d'aigua, números de pàgina, capçalera i peu de pàgina, efecte d'escàner, ajusta els colors, color de fons, elimina les pàgines en blanc, elimina les anotacions. +- **Organitza i gestiona** (violeta): fusiona, divideix, extreu pàgines, gira, suprimeix pàgines, inverteix, afegeix una pàgina en blanc, divideix pàgines, diverses pàgines per full, uniformitza la mida de pàgina, combina en una sola pàgina, fullet, pòster, edita les metadades, taula de continguts, OCR. +- **Optimitza i repara** (ambre): comprimeix, rasteritza, linealitza, corregeix la inclinació, PDF a PDF/A, tipus de lletra a contorns, repara. +- **Protegeix el PDF** (rosa): xifra, desxifra, sanititza, aplana, signatura digital, censura. +- **Sortida** (verd blavós): baixa (detecta automàticament un sol PDF o un ZIP), PDF a imatges, PDF a text, PDF a DOCX, PDF a XLSX, PDF a CSV, PDF a SVG, PDF a Markdown, extreu imatges. + +## Desar i carregar fluxos de treball + +La barra d'eines ofereix quatre opcions de persistència: + +- **Desa**: desa el flux de treball actual com a plantilla amb nom a l'emmagatzematge local del navegador. Pots desar diverses plantilles. +- **Carrega**: obre una finestra amb totes les plantilles desades. Fes clic a Carrega per restaurar-ne una, o suprimeix les plantilles que ja no necessitis. +- **Exporta**: baixa el flux de treball com a fitxer `.json` perquè el puguis compartir o en facis una còpia de seguretat. +- **Importa**: carrega un fitxer de flux de treball `.json` del disc, restaurant tots els nodes, les posicions i les connexions. + +Les plantilles es conserven entre sessions a l'emmagatzematge local. Els fitxers JSON exportats són portàtils entre navegadors i ordinadors. + +## Model d'execució + +El motor crea un graf de dependències a partir de les teves connexions i executa els nodes en ordre topològic. Si algun node falla, l'execució s'atura i el node amb error es marca en vermell. Cal tenir en compte unes quantes regles: + +- Cada flux de treball necessita almenys un node d'**Entrada** i un node de **Sortida**. +- El motor detecta les dependències circulars i bloqueja l'execució amb un error. +- El node **Xifra** ha de ser l'últim pas de processament abans del node de sortida. Si el col·loques abans, apareixerà un avís de validació perquè els nodes posteriors no poden operar amb dades xifrades. +- Els PDF protegits amb contrasenya demanen la contrasenya durant l'execució. +- S'admeten entrades de diversos PDF: el node Fusiona pot combinar-los, o els nodes de processament en lot processaran cada PDF individualment. + +## Tipus de connectors + +Les connexions utilitzen connectors tipats per evitar connexions no vàlides: + +- **PDF** (índigo): un sol document PDF. +- **MultiPDF** (ambre): diversos documents PDF agrupats. +- **Image** (verd): un blob d'imatge. + +## Opcions + +Cada node té la seva pròpia configuració accessible des del panell de paràmetres de la dreta. Els patrons habituals inclouen: + +- **Intervals de pàgines** als nodes Divideix, Extreu pàgines i Suprimeix pàgines +- **Controls lliscants de qualitat** als nodes de sortida de conversió d'imatges +- **Camps de contrasenya** als nodes Xifra i Desxifra +- **Entrades de text** per a Marca d'aigua, Capçalera i peu de pàgina, Edita les metadades +- **Angles de rotació** al node Gira +- **Nivell de compressió** al node Comprimeix +- **Selecció d'idioma d'OCR** al node OCR + +## Casos d'ús + +- **Flux de processament de factures**: entrada de PDF -> OCR -> Extreu taules -> Baixa com a CSV. +- **Estandardització d'informes**: Word a PDF -> Uniformitza la mida de pàgina -> Afegeix números de pàgina -> Marca d'aigua -> Comprimeix -> Baixa. +- **Preparació per a l'arxivament**: entrada de PDF -> Repara -> Aplana -> Sanititza -> PDF a PDF/A -> Baixa. +- **Extracció d'imatges en lot**: entrada de PDF (diversos fitxers) -> Extreu imatges -> Baixa el ZIP. +- **Fullets llestos per imprimir**: entrada de PDF -> Fullet -> Retalla -> Comprimeix -> Baixa. +- **Distribució segura**: entrada de PDF -> Censura -> Elimina les anotacions -> Xifra -> Baixa. + +## Consells + +- Utilitza **Supr** o **Retrocés** per eliminar el node seleccionat del llenç. +- Fes clic al botó **X** de la barra d'estat d'un node per suprimir-lo directament. +- Desplaça el llenç fent clic i arrossegant sobre un espai buit. El cursor canvia a una icona de mà mentre es desplaça. +- Al mòbil, utilitza el botó **+** de la barra d'eines per mostrar o amagar la caixa de nodes. +- Si el flux de treball genera diversos fitxers de sortida, el node Baixa els agrupa automàticament en un ZIP. +- Comença amb coses senzilles: crea i prova un flux de dos nodes abans d'afegir-hi complexitat. + +## Eines relacionades + +- [PDF a text](./pdf-to-text) +- [PDF a Excel](./pdf-to-excel) +- [Extreu imatges](./extract-images) +- [PDF a Markdown](./pdf-to-markdown) diff --git a/docs/ca/tools/png-to-pdf.md b/docs/ca/tools/png-to-pdf.md new file mode 100644 index 00000000..09a2ce31 --- /dev/null +++ b/docs/ca/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG a PDF +description: Converteix una o més imatges PNG en un document PDF amb qualitat ajustable, íntegrament al navegador. +--- + +# PNG a PDF + +Converteix imatges PNG a PDF conservant-ne tota la resolució. Cada PNG es converteix en la seva pròpia pàgina, amb la mida de la imatge original. La transparència es gestiona automàticament. + +## Formats compatibles + +| Format | Extensions | +| :----- | :--------- | +| PNG | `.png` | + +## Com funciona + +1. Fes clic a la zona de càrrega o arrossega-hi fitxers PNG. En pots seleccionar diversos alhora. +2. Gestiona la llista de fitxers: elimina els que no vulguis o afegeix-ne més. +3. Tria un nivell de **qualitat del PDF** al menú desplegable. +4. Fes clic a **Converteix a PDF**. La sortida es baixa com a `from_jpgs.pdf`. + +L'eina utilitza pdf-lib per incrustar cada imatge directament. Si un PNG no es pot incrustar de manera nativa (p. ex., per un perfil de color poc habitual), recorre a tornar-lo a renderitzar mitjançant un canvas com a JPEG. + +## Opcions + +La **qualitat del PDF** controla la compressió aplicada abans d'incrustar: + +- **Qualitat alta**: compressió mínima, mida de fitxer més gran. +- **Qualitat mitjana** (per defecte): bon equilibri entre mida i claredat. +- **Qualitat baixa**: compressió màxima, sortida més petita. + +## Casos d'ús + +- Convertir captures de pantalla en un PDF de diverses pàgines per a informes d'errors o documentació +- Empaquetar exportacions de disseny d'interfícies en un sol fitxer per revisar-lo +- Convertir exportacions de diagrames (draw.io, Excalidraw) en un PDF compartible +- Reunir un conjunt d'imatges de gràfics en un informe + +## Consells + +- Els fitxers PNG amb transparència obtenen un fons blanc al PDF. Si necessites un fons diferent, edita les imatges abans. +- Per a captures de pantalla i diagrames amb vores nítides i text, la qualitat alta evita els artefactes de compressió JPEG. La qualitat mitjana o baixa pot convertir internament a JPEG. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [JPG a PDF](./jpg-to-pdf) +- [SVG a PDF](./svg-to-pdf) diff --git a/docs/ca/tools/posterize-pdf.md b/docs/ca/tools/posterize-pdf.md new file mode 100644 index 00000000..d7ea50c2 --- /dev/null +++ b/docs/ca/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Divideix PDF en format pòster +description: Divideix les pàgines d'un PDF en una quadrícula de pàgines més petites per imprimir en gran format repartit en diversos fulls. +--- + +# Divideix PDF en format pòster + +Divideix cada pàgina d'un PDF en una quadrícula de subpàgines més petites. És l'eina per imprimir una sola pàgina repartida en diversos fulls de paper, que després pots unir per crear un pòster o una pancarta gran. + +## Com funciona + +1. Puja un fitxer PDF. +2. Defineix el nombre de **files** i **columnes** de la quadrícula (p. ex., 2 files x 2 columnes divideix cada pàgina en 4 subpàgines). +3. Opcionalment, indica un interval de pàgines per limitar quines pàgines es divideixen. +4. El llenç de previsualització mostra una quadrícula superposada a la pàgina actual perquè visualitzis els talls. +5. Navega entre pàgines per comprovar la quadrícula a les altres pàgines. +6. Fes clic al botó de processar. Cada cel·la de la quadrícula es converteix en una pàgina pròpia del PDF resultant. + +## Funcions + +- Nombre de files i columnes configurable per a quadrícules flexibles +- Previsualització en directe amb la quadrícula superposada que mostra exactament on es dividiran les pàgines +- Filtre d'interval de pàgines per dividir només pàgines concretes +- Navegació pàgina a pàgina a la previsualització +- Instantànies de pàgina en memòria cau per navegar ràpidament per la previsualització +- Les línies vermelles discontínues de la quadrícula marquen clarament els límits de tall + +## Opcions + +| Opció | Descripció | +| ----------------------- | ------------------------------------------------- | +| **Files** | Nombre de divisions horitzontals (per defecte: 1) | +| **Columnes** | Nombre de divisions verticals (per defecte: 1) | +| **Interval de pàgines** | Quines pàgines es divideixen (buit = totes) | + +## Casos d'ús + +- Imprimir un PDF de mida pòster en fulls A4 o Letter estàndard per muntar-lo a la paret +- Crear pancartes grans a partir d'un disseny PDF d'una sola pàgina +- Dividir plànols tècnics de grans dimensions en peces imprimibles +- Fer impressions de gran format sense tenir una impressora de format ample + +## Consells + +- Una quadrícula de 2x2 converteix una pàgina en 4 pàgines. Una de 3x3 la converteix en 9. Planifica la quadrícula segons la mida que vulguis que tingui el resultat final muntat. +- La quadrícula de la previsualització t'ajuda a comprovar que el contingut important no queda sobre una línia de tall. Ajusta les files i columnes si cal. +- Per a l'operació inversa (encabir diverses pàgines en un full), utilitza [PDF amb diverses pàgines per full](./n-up-pdf). + +## Eines relacionades + +- [PDF amb diverses pàgines per full](./n-up-pdf) +- [Divideix pàgines](./divide-pages) +- [Divideix PDF](./split-pdf) diff --git a/docs/ca/tools/powerpoint-to-pdf.md b/docs/ca/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..c0ada4e5 --- /dev/null +++ b/docs/ca/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint a PDF +description: Converteix presentacions de PowerPoint (PPT, PPTX) i fitxers ODP a PDF conservant el format de les diapositives. +--- + +# PowerPoint a PDF + +Converteix fitxers de presentació a PDF. Cada diapositiva es converteix en una pàgina del document resultant, amb text, imatges, formes i transicions renderitzats mitjançant un motor LibreOffice que s'executa al navegador. Admet tant els formats moderns com els antics de PowerPoint, i també el format OpenDocument Presentation. + +## Formats admesos + +| Format | Extensions | +| :------------------------ | :--------- | +| PowerPoint (modern) | `.pptx` | +| PowerPoint (antic) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar les presentacions. +2. Revisa la llista de fitxers. Afegeix-ne més o elimina'n els que no calguin. +3. Fes clic a **Converteix a PDF**. El motor LibreOffice es carrega la primera vegada que l'utilitzes i després converteix cada fitxer. +4. Un sol fitxer es descarrega directament com a PDF. Diversos fitxers s'empaqueten a `powerpoint-converted.zip`. + +## Opcions + +Aquesta eina no té cap configuració addicional. Les diapositives es renderitzen amb les dimensions originals. + +## Resultat + +| Nombre de fitxers | Resultat | +| :---------------- | :----------------------------------------------------------- | +| 1 fitxer | Descàrrega d'un sol PDF (nom original amb extensió `.pdf`) | +| 2 o més fitxers | Arxiu ZIP (`powerpoint-converted.zip`) amb un PDF per fitxer | + +## Casos d'ús + +- Convertir una presentació a PDF abans de compartir-la amb un públic que potser no té PowerPoint +- Crear una versió imprimible d'una presentació com a material per a una conferència o un taller +- Arxivar presentacions en un format que es veu igual a tots els dispositius +- Convertir per lots una biblioteca de presentacions ODP de LibreOffice Impress a PDF +- Generar una versió PDF d'una presentació comercial per adjuntar-la a un correu + +## Consells + +- Les animacions i transicions de les diapositives no es representen al PDF. Cada diapositiva es captura com a pàgina estàtica. +- Els vídeos incrustats no apareixeran al resultat. Substitueix-los per una captura de pantalla o una imatge de marcador de posició si cal. +- Les notes de l'orador no s'inclouen a l'exportació a PDF per defecte. Si necessites les notes, considera exportar primer des de la vista nativa «Imprimeix notes» de PowerPoint. +- El motor LibreOffice es guarda a la memòria cau després de la primera càrrega, de manera que convertir una segona presentació a la mateixa sessió és molt més ràpid. + +## Eines relacionades + +- [Word a PDF](./word-to-pdf) +- [Excel a PDF](./excel-to-pdf) +- [Imatges a PDF](./image-to-pdf) diff --git a/docs/ca/tools/prepare-pdf-for-ai.md b/docs/ca/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..d7c73228 --- /dev/null +++ b/docs/ca/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Prepara PDF per a IA +description: Extreu el contingut d'un PDF en JSON estructurat optimitzat per a LLM i fluxos d'IA com LlamaIndex. Admet processament per lots. +--- + +# Prepara PDF per a IA + +Extreu el contingut de fitxers PDF i l'estructura en JSON optimitzat per ser ingerit per models de llenguatge grans (LLM) i frameworks d'IA com LlamaIndex. El contingut de cada pàgina s'extreu i s'organitza en un format estructurat llest per a fluxos RAG, xatbots o sistemes de cerca semàntica. + +## Com funciona + +1. Puja un o més PDF fent clic a la zona de càrrega o arrossegant-hi fitxers. +2. Fes clic a **Extreu** per iniciar el processament. +3. Un sol fitxer es descarrega com a `filename_llm.json`. Diversos fitxers produeixen un arxiu `pdf-for-ai.zip`. + +L'eina utilitza la integració de PyMuPDF amb LlamaIndex per extreure el contingut per pàgines amb metadades, i genera un resultat que es pot carregar directament en frameworks d'IA. + +## Opcions + +Aquesta eina no té cap opció configurable. Totes les pàgines s'extreuen amb text complet i metadades. + +## Format de sortida + +- **Un sol fitxer**: `filename_llm.json` +- **Diversos fitxers**: `pdf-for-ai.zip` amb un `_llm.json` per cada PDF d'entrada. + +El JSON resultant segueix l'esquema de documents de LlamaIndex, amb el contingut de text de cada pàgina i camps de metadades. + +## Casos d'ús + +- Preparar documents PDF per a fluxos de generació augmentada per recuperació (RAG). +- Crear una base de coneixement cercable a partir d'arxius PDF per a un xatbot d'IA. +- Alimentar fluxos d'anàlisi basats en LLM amb informes en PDF. +- Preprocessar articles de recerca per a sistemes de cerca semàntica i de preguntes i respostes. +- Crear dades d'entrenament estructurades a partir de col·leccions de documents PDF. + +## Consells + +- Per extreure text pla sense format específic per a IA, utilitza [PDF a text](./pdf-to-text). +- Per obtenir una sortida en Markdown que conservi els encapçalaments i l'estructura, utilitza [PDF a Markdown](./pdf-to-markdown). +- Els PDF escanejats produiran un resultat buit o mínim. Passa'ls primer per l'OCR per afegir-hi una capa de text abans d'extreure. + +## Eines relacionades + +- [PDF a text](./pdf-to-text) +- [PDF a Markdown](./pdf-to-markdown) +- [PDF a JSON](./pdf-to-json) diff --git a/docs/ca/tools/protect-pdf.md b/docs/ca/tools/protect-pdf.md new file mode 100644 index 00000000..eb73a400 --- /dev/null +++ b/docs/ca/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Protegeix PDF +description: Protegeix fitxers PDF amb contrasenya mitjançant xifratge AES de 256 bits. Defineix contrasenyes d'usuari i de propietari amb restriccions d'ús configurables. +--- + +# Protegeix PDF + +Bloqueja el PDF amb una contrasenya perquè només les persones autoritzades puguin obrir-lo. BentoPDF utilitza xifratge AES de 256 bits (el mateix estàndard que fan servir bancs i agències governamentals), aplicat íntegrament al navegador mitjançant QPDF. + +## Com funciona + +1. Puja un fitxer PDF. +2. Introdueix una **contrasenya d'usuari** (obligatòria). És la contrasenya que caldrà per obrir el fitxer. +3. Opcionalment, introdueix una **contrasenya de propietari**. Si l'estableixes, el PDF adquireix restriccions d'ús que impedeixen imprimir, editar, copiar i anotar. +4. Fes clic a **Xifra PDF**. +5. Descarrega el fitxer xifrat. + +## Tipus de contrasenya + +### Contrasenya d'usuari (obligatòria) + +La contrasenya d'usuari és la que els destinataris escriuen per obrir el PDF. Sense ella, el document és totalment inaccessible. Tot PDF xifrat n'ha de tenir una. + +### Contrasenya de propietari (opcional) + +La contrasenya de propietari controla què pot fer un usuari autoritzat després d'obrir el fitxer. Quan estableixes una contrasenya de propietari diferent, BentoPDF aplica automàticament el conjunt de restriccions més estricte: + +- Modificació desactivada +- Extracció o còpia desactivada +- Impressió desactivada +- Anotació desactivada +- Emplenament de formularis desactivat +- Muntatge del document desactivat + +Si deixes en blanc la contrasenya de propietari, el PDF queda xifrat (cal la contrasenya d'usuari per obrir-lo) però no té cap restricció d'ús un cop obert. + +## Detalls del xifratge + +- **Algorisme**: AES-256 (Advanced Encryption Standard de 256 bits) +- **Longitud de la clau**: 256 bits +- **Estàndard**: xifratge PDF 2.0 (implementació de QPDF) + +Amb la tecnologia actual, és computacionalment inviable trencar AES-256 per força bruta. La seguretat del PDF xifrat depèn totalment de la fortalesa de la contrasenya. + +## Casos d'ús + +- Protegir informes financers confidencials abans d'enviar-los per correu +- Protegir documents legals compartits amb la part contrària +- Afegir una contrasenya a historials mèdics o a informació d'identificació personal +- Distribuir contingut de pagament (llibres electrònics, informes) amb control d'accés +- Complir polítiques de protecció de dades que exigeixen xifratge en repòs + +## Consells + +- Utilitza una contrasenya forta i única. Una frase de pas de 12 o més caràcters amb majúscules, minúscules, números i símbols és ideal. +- Comparteix la contrasenya per un canal diferent (telèfon, missatge de text), mai al mateix correu que el PDF. +- Si només vols restringir accions (sense imprimir ni copiar) sense exigir contrasenya per obrir-lo, utilitza l'eina Canvia els permisos. + +## Eines relacionades + +- [Desxifra PDF](./unlock-pdf): elimina el xifratge quan coneguis la contrasenya +- [Canvia els permisos](./change-permissions): modifica restriccions d'ús concretes +- [Elimina les restriccions](./remove-restrictions): elimina tota la seguretat d'un PDF +- [Neteja PDF](./sanitize-pdf): elimina el contingut ocult abans de xifrar diff --git a/docs/ca/tools/psd-to-pdf.md b/docs/ca/tools/psd-to-pdf.md new file mode 100644 index 00000000..0de21360 --- /dev/null +++ b/docs/ca/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD a PDF +description: Converteix fitxers de Photoshop (PSD) a PDF al navegador. Gratuït, privat i sense necessitat de programari d'Adobe. +--- + +# PSD a PDF + +Converteix fitxers PSD d'Adobe Photoshop en documents PDF. PSD és el format natiu de Photoshop i obrir-lo normalment requereix programari d'Adobe car. Aquesta eina renderitza la imatge composta aplanada del fitxer PSD com a pàgina PDF a resolució completa. + +## Formats admesos + +| Format | Extensió | Notes | +| :-------------- | :------- | :------------------------------------- | +| Adobe Photoshop | `.psd` | Renderitza la imatge composta aplanada | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers PSD. Se n'admeten diversos. +2. Revisa la llista de fitxers. Elimina els que no vulguis amb la icona de la paperera, o utilitza **Afegeix més fitxers** per incloure'n més. +3. Fes clic a **Converteix a PDF**. El motor PyMuPDF llegeix el fitxer PSD i incrusta la imatge composta en una pàgina PDF a la resolució original. +4. Un sol PSD produeix un PDF. Quan puges diversos fitxers PSD, es combinen en un únic PDF de diverses pàgines anomenat `psd_to_pdf.pdf`, on cada PSD es converteix en una pàgina. + +## Opcions + +No cal cap configuració. El convertidor utilitza les dades d'imatge aplanades del fitxer PSD. + +## Casos d'ús + +- Previsualitzar dissenys de Photoshop sense obrir Photoshop +- Enviar proves de disseny a clients que no tenen Adobe Creative Suite +- Imprimir il·lustracions d'alta resolució a partir de fitxers PSD +- Crear un porfolio en PDF a partir de diversos fitxers de disseny PSD: cadascun es converteix en una pàgina d'un únic document + +## Consells + +- La conversió renderitza la vista composta (aplanada) del PSD. Les capes individuals, les capes d'ajust i els efectes de capa no es conserven com a elements separats al PDF. +- Els fitxers PSD múltiples es fusionen en un PDF de diverses pàgines en lloc de PDF individuals. Això és útil per crear porfolis o catàlegs. +- Els fitxers PSD de resolució molt alta (fitxers d'impressió de 300 o més DPI) produiran PDF grans. L'eina conserva la resolució completa. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [VSD a PDF](./vsd-to-pdf) diff --git a/docs/ca/tools/pub-to-pdf.md b/docs/ca/tools/pub-to-pdf.md new file mode 100644 index 00000000..c75aa4ea --- /dev/null +++ b/docs/ca/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB a PDF +description: Converteix fitxers de Microsoft Publisher (PUB) a PDF al navegador. Gratuït, privat i sense necessitat de cap programari. +--- + +# PUB a PDF + +Converteix fitxers de Microsoft Publisher en PDF. Publisher és una eina d'autoedició inclosa en algunes edicions de Microsoft Office, però la majoria de persones no la tenen instal·lada. Aquesta eina permet a qualsevol convertir fitxers PUB a PDF directament al navegador, sense programari de Microsoft. + +## Formats admesos + +| Format | Extensió | Notes | +| :------------------ | :------- | :--------------------- | +| Microsoft Publisher | `.pub` | Documents d'autoedició | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers PUB. Pots pujar-ne diversos alhora. +2. Revisa la llista de fitxers. Elimina els que no vulguis amb la icona de la paperera, o fes clic a **Afegeix més fitxers** per afegir-ne més. +3. Fes clic a **Converteix a PDF**. Un motor basat en LibreOffice es carrega al navegador i converteix cada fitxer PUB, conservant el disseny, les imatges i els quadres de text. +4. Un sol fitxer es descarrega directament com a PDF. Diversos fitxers es lliuren en un arxiu ZIP anomenat `pub-to-pdf.zip`. + +## Opcions + +No cal cap configuració addicional. El convertidor gestiona automàticament el motor de disseny de PUB. + +## Casos d'ús + +- Obrir un full volant o un butlletí PUB d'un client sense comprar Microsoft Publisher +- Convertir fulls parroquials, programes d'esdeveniments o butlletins escolars creats amb Publisher +- Arxivar material de màrqueting de Publisher en un format accessible per a tothom +- Imprimir fitxers PUB en un sistema que no té Publisher instal·lat + +## Consells + +- Els dissenys complexos de Publisher amb quadres de text superposats i posicionament precís poden desplaçar-se lleugerament durant la conversió. Revisa el resultat si la posició exacta és crítica. +- El motor LibreOffice s'inicialitza una vegada per sessió. La primera conversió triga més; les següents són més ràpides. +- Per obtenir la conversió més fidel dels fitxers de Publisher, assegura't que els tipus de lletra personalitzats de l'original siguin tipus de lletra estàndard del sistema. + +## Eines relacionades + +- [VSD a PDF](./vsd-to-pdf) +- [ODP a PDF](./odp-to-pdf) diff --git a/docs/ca/tools/rasterize-pdf.md b/docs/ca/tools/rasterize-pdf.md new file mode 100644 index 00000000..077f33ee --- /dev/null +++ b/docs/ca/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasteritza PDF +description: Converteix les pàgines d'un PDF en un PDF basat en imatges. Aplana totes les capes, elimina el text seleccionable i controla els DPI i el format d'imatge. +--- + +# Rasteritza PDF + +La rasterització converteix cada pàgina d'un PDF en una imatge i torna a muntar aquestes imatges en un PDF. El resultat es veu idèntic a l'original però no conté text seleccionable, ni elements interactius, ni capes editables. És, en la pràctica, una fotocòpia d'alta qualitat. + +## Com funciona + +1. Puja un o més fitxers PDF. +2. Defineix els **DPI** (resolució) de la sortida rasteritzada. +3. Tria un **format d'imatge**: PNG per a qualitat sense pèrdua o JPEG per a fitxers més petits. +4. Opcionalment, marca **Converteix a escala de grisos**. +5. Fes clic a **Rasteritza PDF**. Si hi ha diversos fitxers, es descarreguen en un ZIP. + +## Opcions + +| Paràmetre | Valors | Per defecte | +| -------------------- | ------------------------------------ | ----------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Format d'imatge** | PNG (sense pèrdua), JPEG (més petit) | PNG | +| **Escala de grisos** | Activat/Desactivat | Desactivat | + +## Orientacions sobre els DPI + +- **72**: només per veure en pantalla, la mida de fitxer més petita +- **150**: bon equilibri per a l'ús general +- **200**: text més nítid, mida de fitxer moderada +- **300**: sortida amb qualitat d'impressió +- **600**: arxiu d'alta qualitat o impressió professional + +## Casos d'ús + +- Evitar l'extracció de text de documents confidencials abans de compartir-los +- Eliminar problemes de dependència de tipus de lletra convertint el text en píxels +- Crear una versió «plana» d'un PDF amb capes complexes o transparències que es renderitza diferent en cada visor +- Preparar un PDF per a un sistema que només accepta entrada basada en imatges +- Eliminar el contingut ocult (com els canvis de seguiment o les dades de formulari) reduint el PDF a imatges pures + +## Consells + +- 150 DPI amb PNG és una bona opció per defecte. Puja'l només si necessites sortida per a impressió o has d'ampliar detalls fins. +- JPEG produeix fitxers notablement més petits però introdueix artefactes de compressió a les vores nítides del text. +- La rasterització és irreversible: conserva el PDF original si més endavant pots necessitar text editable. + +## Eines relacionades + +- [Comprimeix PDF](./compress-pdf): redueix la mida del PDF rasteritzat +- [Redreça PDF](./deskew-pdf): redreça les pàgines abans de rasteritzar documents escanejats +- [Converteix tipus de lletra en contorns](./font-to-outline): converteix els tipus de lletra en traçats vectorials si vols conservar l'escalabilitat +- [Aplana PDF](./flatten-pdf): aplana formularis sense convertir-los en imatges diff --git a/docs/ca/tools/remove-annotations.md b/docs/ca/tools/remove-annotations.md new file mode 100644 index 00000000..1d41f330 --- /dev/null +++ b/docs/ca/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Elimina les anotacions +description: Elimina tots els comentaris, ressaltats, enllaços i altres anotacions del PDF amb un sol clic. +--- + +# Elimina les anotacions + +Neteja el PDF eliminant-ne totes les anotacions: comentaris, ressaltats, notes adhesives, marcatge de text, enllaços, segells i qualsevol altre objecte d'anotació incrustat al document. El contingut de fons de les pàgines (text, imatges, gràfics) queda intacte. + +## Com funciona + +1. Puja el fitxer PDF. +2. L'eina detecta el nombre de pàgines del document i mostra la informació del fitxer. +3. Fes clic a **Elimina les anotacions** per processar-lo. +4. El PDF net es descarrega automàticament sense cap anotació. + +## Funcions + +- Elimina tots els tipus d'anotació: comentaris, ressaltats, subratllats, tacats, notes adhesives, segells, enllaços i marcatge de formularis +- Actua sobre totes les pàgines del document +- Conserva tot el contingut que no és anotació (text, imatges, gràfics vectorials, camps de formulari) +- Mostra el nombre de pàgines i la mida del fitxer abans de processar + +## Casos d'ús + +- Netejar un document abans de la distribució final després d'un cicle de revisió en què diversos revisors han afegit comentaris +- Eliminar el marcatge de ressaltats i les notes adhesives d'una guia d'estudi compartida +- Eliminar les anotacions d'enllaç d'un document abans d'arxivar-lo +- Preparar una versió «neta» d'un document legal que s'ha anotat intensament durant una negociació +- Eliminar els comentaris dels revisors d'un manuscrit abans d'enviar-lo a impremta + +## Consells + +- Aquesta eina elimina les anotacions a nivell d'estructura del PDF, de manera que el resultat manté el text seleccionable i la qualitat original, sense cap rasterització. +- Si només vols eliminar anotacions concretes i no totes, utilitza l'[Editor de PDF](./edit-pdf) per suprimir-ne de manera selectiva. +- Les anotacions dels PDF aplanats (on les anotacions s'han fusionat amb el contingut de la pàgina) no es poden eliminar perquè ja no són objectes separats. + +## Eines relacionades + +- [Editor de PDF](./edit-pdf) +- [Afegeix una marca d'aigua](./add-watermark) +- [Signa PDF](./sign-pdf) diff --git a/docs/ca/tools/remove-blank-pages.md b/docs/ca/tools/remove-blank-pages.md new file mode 100644 index 00000000..836eb22a --- /dev/null +++ b/docs/ca/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Elimina les pàgines en blanc +description: Detecta i elimina automàticament les pàgines en blanc o gairebé en blanc del PDF amb sensibilitat ajustable. +--- + +# Elimina les pàgines en blanc + +Analitza el PDF a la cerca de pàgines en blanc o gairebé en blanc i elimina-les automàticament. L'eina renderitza cada pàgina i n'analitza el contingut de píxels per determinar si és en blanc, i després et deixa confirmar quines pàgines s'eliminen abans de processar. + +## Com funciona + +1. Puja el fitxer PDF. +2. Ajusta el control lliscant de **Sensibilitat** per controlar com d'estricta és la definició de «en blanc». +3. Fes clic a **Detecta pàgines en blanc** per analitzar el document. +4. L'eina mostra miniatures de les pàgines en blanc detectades perquè les revisis. +5. Confirma la selecció i descarrega el PDF net sense les pàgines en blanc. + +## Opcions + +- **Sensibilitat**: un control lliscant del 0 % al 100 % (per defecte, 80 %). Els valors alts són més estrictes i només marquen pàgines completament o gairebé blanques. Els valors baixos són més permissius i detecten pàgines amb contingut mínim, com un sol punt o una marca d'aigua tènue. + +## Funcions + +- Anàlisi a nivell de píxel de cada pàgina per detectar contingut en blanc +- Control lliscant de sensibilitat ajustable per afinar la detecció +- Previsualització en miniatura de les pàgines en blanc detectades per a la verificació manual +- Conserva exactament com són totes les pàgines que no són en blanc +- Admet documents de qualsevol mida o nombre de pàgines +- Indicador de progrés durant l'anàlisi + +## Casos d'ús + +- Netejar documents escanejats on l'escàner ha capturat el revers buit d'originals d'una sola cara +- Eliminar pàgines separadores de lots de documents escanejats en massa +- Eliminar pàgines en blanc inserides per sistemes de gestió documental +- Netejar PDF exportats de processadors de textos que de vegades inclouen pàgines en blanc al final +- Reduir la mida del fitxer eliminant pàgines buides innecessàries + +## Consells + +- Comença amb la sensibilitat per defecte del 80 % i ajusta-la a partir d'aquí. Si l'eina no detecta pàgines que a tu et semblen en blanc, redueix la sensibilitat. Si marca pàgines amb contingut lleuger que vols conservar, augmenta-la. +- L'eina renderitza cada pàgina per analitzar-ne el contingut, de manera que el temps de processament augmenta amb el nombre de pàgines. En documents molt grans, compta amb una espera breu. +- Revisa les pàgines en blanc detectades a la previsualització en miniatura abans de confirmar l'eliminació. Les pàgines amb capçaleres, peus o marques d'aigua tènues poden quedar marcades segons la sensibilitat configurada. + +## Eines relacionades + +- [Retalla PDF](./crop-pdf) +- [Editor de PDF](./edit-pdf) +- [Números de pàgina](./page-numbers) diff --git a/docs/ca/tools/remove-metadata.md b/docs/ca/tools/remove-metadata.md new file mode 100644 index 00000000..87fca82c --- /dev/null +++ b/docs/ca/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Elimina les metadades +description: Elimina totes les metadades ocultes dels fitxers PDF, com l'autor, el títol, la data de creació, el productor, les dades XMP i els identificadors de document. +--- + +# Elimina les metadades + +Tot PDF porta metadades que poden revelar qui l'ha creat, quin programari s'ha utilitzat, quan es va modificar per última vegada i més. Aquesta eina ho elimina tot (el diccionari d'informació, els fluxos de metadades XMP, els identificadors de document i les dades específiques d'aplicacions) i deixa un document net sense cap rastre del seu origen. + +## Com funciona + +1. Puja un fitxer PDF. +2. Fes clic a **Elimina les metadades**. +3. Descarrega el fitxer net. + +No hi ha opcions per configurar. L'eina és exhaustiva per disseny: ho esborra tot. + +## Què s'elimina + +- **Camps del diccionari d'informació**: títol, autor, assumpte, paraules clau, creador, productor, data de creació, data de modificació +- **Flux de metadades XMP**: el bloc de metadades basat en XML emmagatzemat al catàleg del document +- **Identificadors de document**: identificadors únics al tràiler del PDF que es poden utilitzar per rastrejar un document entre sistemes +- **PieceInfo**: metadades específiques d'aplicacions afegides per programes com Illustrator o InDesign + +## Què es conserva + +- Tot el contingut visible de les pàgines (text, imatges, gràfics) +- Camps de formulari i anotacions +- Marcadors i enllaços +- L'estructura del document en si + +## Casos d'ús + +- Eliminar el teu nom i organització d'un document abans de publicar-lo de manera anònima +- Eliminar les marques de temps de creació que revelen quan es va preparar un document +- Netejar les cadenes de productor que identifiquen el teu programari PDF +- Preparar documents per a presentacions reguladores que exigeixen PDF sense metadades +- Eliminar els rastres de l'historial d'edició abans de compartir un document externament + +## Consells + +- Utilitza primer l'eina Visualitza les metadades per veure exactament quines metadades conté el PDF abans d'eliminar-les. +- Si necessites eliminar les metadades _i també_ JavaScript, anotacions i fitxers incrustats, utilitza Neteja PDF per fer una neteja més exhaustiva. +- L'eliminació de metadades és permanent. Conserva l'original si més endavant pots necessitar aquestes dades. + +## Eines relacionades + +- [Neteja PDF](./sanitize-pdf): elimina les metadades i també scripts, fitxers adjunts i més +- [Xifra PDF](./protect-pdf): protegeix amb contrasenya el PDF net +- [Comprimeix PDF](./compress-pdf): eliminar les metadades pot reduir lleugerament la mida del fitxer; comprimeix per estalviar-ne més diff --git a/docs/ca/tools/remove-restrictions.md b/docs/ca/tools/remove-restrictions.md new file mode 100644 index 00000000..58e7169f --- /dev/null +++ b/docs/ca/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Elimina les restriccions +description: Elimina la protecció amb contrasenya, les restriccions d'impressió, els bloquejos d'edició i els límits de còpia dels fitxers PDF. +--- + +# Elimina les restriccions + +Els PDF poden tenir dos tipus de contrasenya: una contrasenya d'usuari (necessària per obrir el fitxer) i una contrasenya de propietari (que controla què pots fer amb ell). Aquesta eina elimina totes dues, juntament amb totes les restriccions associades: bloquejos d'impressió, edició, còpia i anotació. + +## Com funciona + +1. Puja un fitxer PDF. +2. Si el PDF té una contrasenya de propietari, introdueix-la al camp **Contrasenya de propietari**. Deixa'l en blanc si el PDF només té restriccions d'ús sense contrasenya. +3. Fes clic a **Elimina les restriccions**. +4. Descarrega el PDF sense restriccions. + +L'eina utilitza els indicadors `--decrypt` i `--remove-restrictions` de QPDF per produir una còpia neta i sense restriccions. + +## Què s'elimina + +- La protecció amb contrasenya (tant la d'usuari com la de propietari) +- Les restriccions d'impressió +- Les restriccions d'edició +- Les restriccions de còpia de text i imatges +- Les restriccions d'anotació i comentaris +- Qualsevol altra limitació de seguretat codificada al PDF + +## Casos d'ús + +- Desbloquejar un PDF teu del qual vas establir la contrasenya fa anys +- Eliminar les restriccions d'impressió d'un document al qual tens accés legítim +- Activar la còpia i enganxament en material de referència per prendre apunts +- Preparar PDF per a eines d'accessibilitat que no admeten documents restringits + +## Consells + +- Has de saber la contrasenya de propietari si n'hi ha una. Aquesta eina no desxifra ni força contrasenyes per força bruta. +- Si vols mantenir el fitxer xifrat però canviar permisos concrets, utilitza l'eina Canvia els permisos. +- El fitxer resultant no té cap xifratge: qualsevol persona que el rebi el pot obrir lliurement. + +## Eines relacionades + +- [Desxifra PDF](./unlock-pdf): desbloqueja un PDF quan coneixes la contrasenya d'usuari +- [Xifra PDF](./protect-pdf): torna a aplicar el xifratge amb una configuració nova +- [Canvia els permisos](./change-permissions): modifica de manera selectiva quines accions es permeten diff --git a/docs/ca/tools/repair-pdf.md b/docs/ca/tools/repair-pdf.md new file mode 100644 index 00000000..295ab5ce --- /dev/null +++ b/docs/ca/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Repara PDF +description: Recupera dades de fitxers PDF corruptes o danyats amb el motor de reparació de QPDF. Admet processament per lots. +--- + +# Repara PDF + +Quan un PDF no s'obre, mostra contingut il·legible o provoca errors al visor, aquesta eina intenta reconstruir-ne l'estructura interna. Utilitza el motor de reparació de QPDF, que pot recuperar dades de molts tipus de corrupció: taules de referències creuades trencades, fluxos truncats, referències d'objecte no vàlides i més. + +## Com funciona + +1. Puja un o més fitxers PDF danyats. +2. Fes clic a **Repara PDF**. +3. Un sol fitxer reparat es descarrega directament. Diversos fitxers produeixen un arxiu ZIP. + +L'eina passa cada fitxer per QPDF amb l'indicador `--decrypt`, que força QPDF a llegir i reescriure tota l'estructura del PDF, corregint pel camí els problemes recuperables. + +## Funcions + +- Reparació per lots de diversos PDF en una sola operació +- Detecció automàtica de fitxers recuperables i no recuperables +- Informe d'èxit o error per fitxer quan se'n processen diversos +- Utilitza QPDF (WebAssembly), una biblioteca de transformació de PDF molt contrastada + +## Què pot corregir + +- Taules de referències creuades trencades o inexistents +- Finals de fitxer truncats per descàrregues incompletes +- Numeració d'objectes i longituds de flux no vàlides +- Incoherències estructurals menors de generadors de PDF amb errors +- Artefactes de xifratge d'intents de desxifratge fallits + +## Què no pot corregir + +- Fitxers molt truncats on falta la major part de les dades de contingut +- PDF xifrats amb una contrasenya que no tens +- Fitxers que en realitat no són PDF (extensió de fitxer incorrecta) +- Corrupció d'imatges dins del PDF (l'estructura es corregeix, però les dades de píxels no es regeneren) + +## Casos d'ús + +- Recuperar un PDF d'una descàrrega de correu fallida +- Obrir fitxers produïts per generadors de PDF antics o no estàndard +- Corregir PDF que funcionen en un visor però no en un altre +- Preparar documents d'arxiu danyats per a l'emmagatzematge a llarg termini + +## Consells + +- Si la reparació falla, prova d'obrir primer el fitxer en un navegador: els navegadors tenen la seva pròpia lògica de recuperació i potser renderitzen prou contingut per tornar-lo a desar. +- Per als PDF xifrats que fallen en la reparació, prova primer Desxifra PDF i després repara el resultat desxifrat. + +## Eines relacionades + +- [Comprimeix PDF](./compress-pdf): neteja encara més l'estructura del PDF reparat +- [Linealitza PDF](./linearize-pdf): optimitza el fitxer reparat per a la distribució web +- [Aplana PDF](./flatten-pdf): aplana formularis que poden haver quedat danyats diff --git a/docs/ca/tools/reverse-pages.md b/docs/ca/tools/reverse-pages.md new file mode 100644 index 00000000..7d1f6d4a --- /dev/null +++ b/docs/ca/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Inverteix l'ordre de les pàgines +description: Inverteix l'ordre de les pàgines d'un o més fitxers PDF perquè l'última pàgina passi a ser la primera. +--- + +# Inverteix l'ordre de les pàgines + +Inverteix l'ordre de les pàgines d'un PDF perquè l'última passi a ser la primera, la penúltima la segona, i així successivament. Admet el processament per lots de diversos fitxers alhora. + +## Com funciona + +1. Puja un o més fitxers PDF. +2. Fes clic al botó de processament. +3. Cada fitxer s'inverteix de manera independent. Si has pujat diversos fitxers, el resultat és un arxiu ZIP amb tots els PDF invertits. +4. Un sol fitxer es baixa directament com a PDF invertit. + +## Funcions + +- Processament per lots: inverteix diversos PDF en una sola operació +- Sortida en un sol fitxer per a un PDF, sortida ZIP per a diversos +- Botons per eliminar cada fitxer abans del processament +- Conserva tot el contingut i el format de les pàgines + +## Casos d'ús + +- Corregir un document que es va escanejar en ordre invers +- Preparar un PDF de presentació per llegir-lo del final al principi +- Invertir l'ordre de les pàgines per a fluxos d'impressió que alimenten les pàgines a la inversa +- Corregir un document on les pàgines es van muntar al revés per error + +## Consells + +- Cada fitxer d'un lot s'inverteix de manera independent: els fitxers no es reordenen entre ells. +- Per reordenar les pàgines amb més detall (no només una inversió completa), utilitza [Duplica i organitza](./organize-pdf). + +## Eines relacionades + +- [Duplica i organitza](./organize-pdf) +- [Gira PDF](./rotate-pdf) +- [Eina PDF multifunció](./pdf-multi-tool) diff --git a/docs/ca/tools/rotate-custom.md b/docs/ca/tools/rotate-custom.md new file mode 100644 index 00000000..57c8b50b --- /dev/null +++ b/docs/ca/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Gira amb un angle personalitzat +description: Gira les pàgines d'un PDF en qualsevol angle amb camps de graus per pàgina i controls de rotació per lots. +--- + +# Gira amb un angle personalitzat + +Gira les pàgines d'un PDF en qualsevol angle arbitrari, no només en increments de 90 graus. Cada pàgina té el seu propi camp d'angle, i pots aplicar un mateix angle a totes les pàgines alhora amb el control per lots. + +## Com funciona + +1. Puja un fitxer PDF. Es mostren miniatures de totes les pàgines. +2. Cada pàgina té un camp numèric que mostra el seu angle de rotació actual. +3. Escriu qualsevol valor en graus (positiu o negatiu) per girar una pàgina concreta, o utilitza els botons esquerra/dreta de cada pàgina per fer ajustos ràpids de 90 graus. +4. Utilitza el camp **angle per lots** de la part superior per aplicar una rotació uniforme a totes les pàgines. +5. Fes clic al botó de processament per generar el PDF girat. + +## Funcions + +- Camp de graus lliure per pàgina (qualsevol valor enter) +- Control d'angle per lots per aplicar la mateixa rotació a cada pàgina +- Previsualització de la rotació en temps real a les miniatures +- Botons de gir ràpid per pàgina en increments de 90 graus +- Miniatures amb càrrega diferida per a un bon rendiment en documents grans + +## Casos d'ús + +- Corregir escanejats lleugerament inclinats uns quants graus +- Girar pàgines per complir un requisit d'orientació no estàndard +- Aplicar rotacions precises a pàgines individuals d'un document amb contingut mixt +- Ajustar amb precisió els angles de les pàgines després d'una rotació massiva inicial + +## Consells + +- Els valors positius giren en sentit horari i els negatius en sentit antihorari. +- El camp d'angle per lots sobreescriu tots els angles de cada pàgina quan s'aplica. Si cal, fes els ajustos individuals després de l'operació per lots. +- Per a rotacions estàndard de 90/180/270 graus amb una interfície més senzilla, utilitza [Gira PDF](./rotate-pdf). + +## Eines relacionades + +- [Gira PDF](./rotate-pdf) +- [Eina PDF multifunció](./pdf-multi-tool) +- [Duplica i organitza](./organize-pdf) diff --git a/docs/ca/tools/rotate-pdf.md b/docs/ca/tools/rotate-pdf.md new file mode 100644 index 00000000..813ed44c --- /dev/null +++ b/docs/ca/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Gira PDF +description: Gira pàgines individuals o totes les pàgines d'un PDF en increments de 90 graus amb una interfície visual de miniatures. +--- + +# Gira PDF + +Gira les pàgines d'un PDF 90 graus en sentit horari o antihorari. L'eina mostra miniatures de cada pàgina i et permet girar-les individualment o aplicar una rotació massiva a tot el document. + +## Com funciona + +1. Puja un fitxer PDF. Les miniatures de totes les pàgines es mostren en una quadrícula. +2. Utilitza els botons de rotació esquerra/dreta sota cada miniatura per girar aquella pàgina concreta. +3. Utilitza els controls de rotació massiva de la part superior per girar totes les pàgines alhora. +4. La previsualització de les miniatures s'actualitza en temps real per mostrar la rotació. +5. Fes clic al botó de processament per desar el PDF girat. + +## Funcions + +- Rotació per pàgina en increments de 90 graus (esquerra o dreta) +- Rotació massiva de totes les pàgines alhora +- Previsualització de miniatures en temps real amb transicions de rotació animades +- Miniatures amb càrrega diferida per a un rendiment fluid en documents grans +- Conserva el contingut i la qualitat originals de les pàgines + +## Casos d'ús + +- Corregir pàgines escanejades de costat o cap per avall +- Girar pàgines horitzontals a orientació vertical (o a l'inrevés) +- Corregir un document amb orientació mixta on algunes pàgines es van escanejar amb un angle incorrecte +- Preparar un document per a una orientació de visualització concreta + +## Consells + +- Les rotacions són acumulatives. Si fas clic dues vegades al botó horari, s'aplica una rotació de 180 graus. +- Per a rotacions que no siguin de 90 graus (p. ex., 45 graus per corregir un escanejat lleugerament inclinat), utilitza [Gira amb un angle personalitzat](./rotate-custom). +- Els controls de rotació massiva afecten totes les pàgines, no només les seleccionades. Aquesta eina no té cap mecanisme de selecció: per a això, utilitza [Eina PDF multifunció](./pdf-multi-tool). + +## Eines relacionades + +- [Gira amb un angle personalitzat](./rotate-custom) +- [Eina PDF multifunció](./pdf-multi-tool) +- [Duplica i organitza](./organize-pdf) diff --git a/docs/ca/tools/rtf-to-pdf.md b/docs/ca/tools/rtf-to-pdf.md new file mode 100644 index 00000000..28b8c183 --- /dev/null +++ b/docs/ca/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF a PDF +description: Converteix fitxers Rich Text Format (RTF) a PDF al navegador amb un motor basat en LibreOffice. +--- + +# RTF a PDF + +Converteix documents Rich Text Format a PDF. RTF és un format de document multiplataforma compatible amb pràcticament tots els processadors de text. Aquesta eina utilitza un motor LibreOffice al navegador per representar els fitxers RTF amb el format intacte: la negreta, la cursiva, les taules i les imatges incrustades es mantenen al PDF. + +## Formats compatibles + +| Format | Extensions | Tipus MIME | +| :----- | :--------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar un o més fitxers RTF. +2. Revisa la llista de fitxers. Afegeix-ne o elimina'n segons calgui. +3. Fes clic a **Converteix a PDF**. El motor LibreOffice s'inicialitza el primer cop i després processa cada fitxer. +4. Un sol fitxer es baixa directament com a PDF. Diversos fitxers s'entreguen com a `rtf-converted.zip`. + +## Opcions + +Aquesta eina no té opcions addicionals. La conversió conserva el format RTF original. + +## Sortida + +| Nombre d'entrades | Sortida | +| :---------------- | :---------------------------------------------------- | +| 1 fitxer | Baixada d'un sol PDF (p. ex., `letter.pdf`) | +| 2+ fitxers | Arxiu ZIP (`rtf-converted.zip`) amb un PDF per fitxer | + +## Casos d'ús + +- Convertir documents RTF antics de processadors de text antics a PDF moderns +- Convertir plantilles de correu RTF en previsualitzacions PDF +- Processar la sortida RTF de programari jurídic o mèdic +- Convertir per lots fitxers RTF d'un sistema de gestió documental a PDF per arxivar-los + +## Consells + +- El motor LibreOffice es carrega una vegada i es desa a la memòria cau. La primera conversió d'una sessió triga uns segons més; les següents són més ràpides. +- Els fitxers RTF amb objectes OLE incrustats poden no representar tots els objectes perfectament. El text pla, les imatges i el format estàndard es converteixen de manera fiable. +- Si els teus fitxers RTF es van crear amb Microsoft Word, també els pots convertir directament amb l'eina [Word a PDF](./word-to-pdf), que accepta RTF a més de DOC i DOCX. + +## Eines relacionades + +- [Word a PDF](./word-to-pdf) +- [ODT a PDF](./odt-to-pdf) +- [Text a PDF](./txt-to-pdf) diff --git a/docs/ca/tools/sanitize-pdf.md b/docs/ca/tools/sanitize-pdf.md new file mode 100644 index 00000000..91d58f4b --- /dev/null +++ b/docs/ca/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Neteja PDF +description: Elimina contingut ocult i potencialment perillós dels PDF, com ara metadades, JavaScript, fitxers incrustats, anotacions i capes. +--- + +# Neteja PDF + +Els PDF poden contenir molt més del que veus a la pantalla. Les metadades ocultes, el JavaScript incrustat, els fitxers adjunts, les dades de formularis i la informació de capes poden filtrar dades sensibles o suposar riscos de seguretat. La neteja ho elimina tot i et deixa un document net i segur per compartir públicament. + +## Com funciona + +1. Puja un fitxer PDF. +2. Selecciona a la llista quins elements vols eliminar. +3. Fes clic a **Neteja PDF**. +4. Baixa el fitxer net. + +## Opcions de neteja + +Totes les opcions estan activades per defecte. Desmarca les que vulguis conservar. + +| Opció | Què elimina | +| ---------------------------------- | --------------------------------------------------------------------------------- | +| **Aplana els formularis** | Converteix els camps de formulari interactius en contingut estàtic | +| **Elimina les metadades** | Suprimeix l'autor, el títol, la data de creació, el programari i les dades XMP | +| **Elimina les anotacions** | Suprimeix comentaris, ressaltats, notes adhesives i marques | +| **Elimina el JavaScript** | Elimina els scripts incrustats que es podrien executar en obrir el fitxer | +| **Elimina els fitxers incrustats** | Suprimeix els fitxers adjunts incrustats al PDF | +| **Elimina les capes (OCG)** | Aplana els grups de contingut opcional en una sola capa | +| **Elimina els enllaços** | Suprimeix els hipervincles i les referències a URL | +| **Elimina l'arbre d'estructura** | Elimina l'estructura del document utilitzada per a l'etiquetatge d'accessibilitat | +| **Elimina MarkInfo** | Suprimeix la informació de contingut marcat | +| **Elimina les fonts** | Elimina les dades de fonts incrustades (amb precaució) | + +## Casos d'ús + +- Preparar un PDF per a la publicació eliminant les metadades internes (noms d'autors, versions de programari, historial d'edicions) +- Eliminar el JavaScript d'un PDF rebut d'una font no fiable abans d'obrir-lo +- Netejar un PDF abans d'enviar-lo a un client que no hauria de veure comentaris incrustats ni noms de camps de formulari +- Eliminar capes ocultes d'un plànol arquitectònic abans de compartir-ne la versió final +- Complir els requisits de minimització de dades de les normatives de privadesa + +## Consells + +- Deixa "Elimina les fonts" sense marcar tret que estiguis segur que el PDF es continuarà mostrant correctament. Eliminar les fonts pot fer el text invisible en alguns visors. +- Si només cal eliminar les metadades, l'eina dedicada Elimina les metadades és més ràpida i específica. +- La neteja és irreversible. Conserva el fitxer original. + +## Eines relacionades + +- [Elimina les metadades](./remove-metadata): elimina només les metadades sense tocar la resta del contingut +- [Aplana PDF](./flatten-pdf): aplana específicament formularis i anotacions +- [Xifra PDF](./protect-pdf): afegeix protecció amb contrasenya després de netejar +- [Rasteritza PDF](./rasterize-pdf): l'opció radical, converteix a imatges per eliminar tot el contingut ocult diff --git a/docs/ca/tools/scanner-effect.md b/docs/ca/tools/scanner-effect.md new file mode 100644 index 00000000..a6250673 --- /dev/null +++ b/docs/ca/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Efecte d'escàner +description: Fes que el teu PDF sembli un document escanejat amb efectes ajustables de soroll, rotació, desenfocament i envelliment del paper. +--- + +# Efecte d'escàner + +Transforma un PDF digital net en un document que sembli sortit d'un escàner pla. L'eina aplica soroll configurable, una lleugera rotació, desenfocament, canvis de brillantor i un groguejat opcional per simular les imperfeccions d'un escaneig físic. + +## Com funciona + +1. Puja el fitxer PDF. +2. L'editor s'obre amb una previsualització en directe de la primera pàgina i un tauler de configuració. +3. Ajusta els paràmetres de l'efecte d'escàner amb els controls lliscants i els interruptors. +4. La previsualització s'actualitza en temps real quan canvies la configuració. +5. Fes clic a **Aplica** per processar totes les pàgines i baixar el resultat. + +## Opcions + +- **Espai de color (interruptor d'escala de grisos)**: converteix la sortida a escala de grisos per a un aspecte clàssic d'escaneig en blanc i negre. +- **Vora**: afegeix una vora fosca subtil al voltant de les pàgines per imitar els artefactes de vora de l'escàner. +- **Rotació**: aplica una lleugera rotació (de -5 a +5 graus) per simular un paper mal alineat. +- **Variació de rotació**: afegeix una variació aleatòria a l'angle de rotació perquè cada pàgina s'inclini una mica diferent. +- **Brillantor**: augmenta o redueix la brillantor general. +- **Contrast**: ajusta el contrast per simular variacions en la qualitat del tòner. +- **Desenfocament**: aplica un desenfocament gaussià per suavitzar les vores del text com en un escaneig de baixa qualitat. +- **Soroll**: afegeix soroll de píxels aleatori per simular el gra del sensor de l'escàner. Els valors més alts produeixen resultats més granulats. +- **Groguenc**: afegeix un to groc càlid per simular paper envellit o reciclat. +- **Resolució**: defineix els DPI de sortida. Els valors més baixos creen un aspecte més pixelat i d'escaneig. +- **Restableix**: restaura tota la configuració als valors per defecte. + +## Funcions + +- Previsualització en temps real que s'actualitza a mesura que ajustes cada paràmetre +- Variació aleatòria de rotació per pàgina per a una variació realista +- Deu paràmetres ajustables de manera independent +- Mode d'escala de grisos per a una sortida d'escaneig en blanc i negre autèntica +- Control de resolució des de qualitat de fax amb DPI baixos fins a qualitat d'arxiu amb DPI alts + +## Casos d'ús + +- Fer que documents creats digitalment semblin escanejats i impresos +- Simular l'envelliment de documents físics per recrear documents històrics +- Provar programari OCR amb escanejats de qualitat degradada +- Produir documents que coincideixin amb l'estil visual d'arxius escanejats existents + +## Consells + +- Comença amb valors subtils. Un nivell de soroll de 10-20, una lleugera rotació de 0,5 graus i un desenfocament mínim ja donen un aspecte d'escaneig convincent. +- Combina el mode d'escala de grisos amb un lleuger groguejat per a un efecte de "fotocòpia d'una fotocòpia". +- La configuració de resolució baixa (100-150 DPI) crea l'aspecte més realista de fax. + +## Eines relacionades + +- [Inverteix els colors](./invert-colors) +- [Ajusta els colors](./adjust-colors) +- [Color de fons](./background-color) diff --git a/docs/ca/tools/sign-pdf.md b/docs/ca/tools/sign-pdf.md new file mode 100644 index 00000000..7bd87801 --- /dev/null +++ b/docs/ca/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Signa PDF +description: Dibuixa, escriu o puja una signatura i col·loca-la a les pàgines del PDF amb un visor integrat. +--- + +# Signa PDF + +Afegeix la teva signatura a qualsevol document PDF. L'eina incorpora un visor PDF complet amb eines de signatura on pots dibuixar una signatura a mà alçada, escriure el teu nom amb una font de signatura o pujar una imatge de signatura. Col·loca i redimensiona les signatures a qualsevol pàgina i després desa el document signat. + +## Com funciona + +1. Puja el fitxer PDF. +2. El document s'obre en un visor PDF integrat amb eines d'anotació. +3. Utilitza l'eina de signatura del visor per crear la signatura dibuixant, escrivint o pujant una imatge. +4. Fes clic a la pàgina on vulguis col·locar la signatura i ajusta'n la mida i la posició. +5. Opcionalment, marca **Aplana el PDF** per incrustar la signatura de manera permanent al document. +6. Fes clic a **Desa i baixa el PDF signat** per obtenir el fitxer signat. + +## Opcions + +- **Aplana el PDF**: si està marcat, la signatura s'incrusta de manera permanent al contingut de la pàgina. Això impedeix que altres persones la moguin o l'eliminin. Si no està marcat, la signatura continua sent una anotació que es pot editar en visors compatibles. + +## Funcions + +- Tres maneres de crear signatures: dibuix a mà alçada, text escrit o imatge pujada +- Visor PDF integrat per a una col·locació precisa +- Arrossega per posicionar i redimensionar signatures a qualsevol pàgina +- Aplanament opcional per incrustar les signatures de manera permanent +- Compatibilitat amb diverses signatures al mateix document + +## Casos d'ús + +- Signar contractes, acords o formularis d'aprovació abans de retornar-los +- Afegir la teva signatura a documents fiscals, reclamacions d'assegurances o formularis oficials +- Posar inicials a pàgines individuals d'un acord de diverses pàgines +- Signar acords de confidencialitat o documents de RH que arriben com a fitxers PDF adjunts + +## Consells + +- Activa l'aplanament si envies el PDF signat a algú que no hauria de poder eliminar ni moure la teva signatura. +- Per a signatures digitals legalment vinculants amb verificació basada en certificats, BentoPDF també ofereix una eina independent de signatura digital. +- Puja una imatge de signatura PNG amb fons transparent per obtenir el resultat més net. + +## Eines relacionades + +- [Editor de PDF](./edit-pdf) +- [Afegeix segells](./add-stamps) +- [Emplena formularis PDF](./form-filler) diff --git a/docs/ca/tools/split-pdf.md b/docs/ca/tools/split-pdf.md new file mode 100644 index 00000000..5dc59d5d --- /dev/null +++ b/docs/ca/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Divideix PDF +description: Divideix un PDF en fitxers més petits per intervals de pàgines, selecció visual, marcadors, pàgines parells/senars o intervals fixos. +--- + +# Divideix PDF + +Divideix un PDF en documents més petits amb un dels sis modes de divisió. Des d'intervals de pàgines senzills fins a la divisió per marcadors, aquesta eina cobreix tots els casos per dividir un document. + +## Com funciona + +1. Puja un sol fitxer PDF. +2. Tria un mode de divisió al menú desplegable. +3. Configura les opcions específiques del mode (intervals de pàgines, seleccions, etc.). +4. Fes clic al botó de processament. +5. El resultat es baixa com a un sol PDF o com a arxiu ZIP segons el mode i la configuració. + +## Modes de divisió + +| Mode | Descripció | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| **Interval** | Introdueix intervals de pàgines com `1-3, 5, 8-10`. Diversos intervals generen PDF separats en un ZIP. Un sol interval genera un PDF. | +| **Selecció visual** | Navega per les miniatures i fes clic per seleccionar les pàgines que vulguis. Les pàgines seleccionades s'extreuen en un PDF nou. | +| **Parells / Senars** | Extreu només les pàgines parells o les senars. | +| **Totes les pàgines** | Divideix cada pàgina en un fitxer PDF individual, baixat com a ZIP. | +| **Marcadors** | Divideix als límits dels marcadors. Tria el nivell de marcador per controlar on es fan les divisions. | +| **Cada N pàgines** | Divideix en blocs de N pàgines (p. ex., cada 5 pàgines). L'últim bloc pot tenir menys pàgines. | + +## Funcions + +- Sis modes de divisió diferents que cobreixen pràcticament tots els casos d'ús +- Selector visual de pàgines amb miniatures de càrrega diferida +- Divisió per marcadors amb filtre de nivell +- Opció de sortida ZIP per als modes d'interval i visual +- Admet intervals de pàgines amb sintaxi mixta (`1-3, 5, 8-10`) +- Avís quan la divisió per N pàgines genera blocs desiguals + +## Casos d'ús + +- Extreure un capítol o secció concrets d'un document gran +- Separar pàgines senars i parells per a fluxos d'impressió a doble cara +- Dividir un llibre en PDF en fitxers per capítol segons els marcadors +- Aïllar pàgines concretes (com la pàgina de signatures) d'un contracte +- Dividir un informe recopilat en fitxers per secció per distribuir-los + +## Consells + +- Diversos intervals de pàgines separats per comes (p. ex., `1-5, 10-15, 20-25`) generen PDF separats, un per interval, agrupats en un ZIP. +- El mode de divisió per marcadors requereix que el PDF contingui marcadors. Si no se'n troba cap, rebràs un missatge d'error. +- La casella "Baixa com a ZIP" dels modes Interval i Visual et permet obtenir PDF individuals per pàgina en lloc d'un fitxer combinat. + +## Eines relacionades + +- [Fusiona PDF](./merge-pdf) +- [Extreu pàgines](./extract-pages) +- [Suprimeix pàgines](./delete-pages) +- [Eina PDF multifunció](./pdf-multi-tool) diff --git a/docs/ca/tools/svg-to-pdf.md b/docs/ca/tools/svg-to-pdf.md new file mode 100644 index 00000000..f2ba2d45 --- /dev/null +++ b/docs/ca/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG a PDF +description: Converteix gràfics vectorials SVG a PDF amb control de qualitat, completament al navegador. +--- + +# SVG a PDF + +Converteix fitxers Scalable Vector Graphics (SVG) a PDF. L'eina rasteritza cada SVG amb el motor de renderització del navegador i n'incrusta el resultat a la resolució nativa. És útil per convertir icones vectorials, diagrames i il·lustracions en documents portàtils. + +## Formats compatibles + +| Format | Extensions | +| :----- | :--------- | +| SVG | `.svg` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar un o més fitxers SVG. +2. Revisa i gestiona la llista de fitxers. +3. Tria un nivell de **Qualitat del PDF**. +4. Fes clic a **Converteix a PDF**. El resultat es baixa com a `from_svgs.pdf`. + +Cada SVG es llegeix com a text, es representa en un llenç amb l'amplada i l'alçada intrínseques (800x600 per defecte si no s'especifiquen dimensions) i s'exporta com a PNG. Aquest PNG s'incrusta després al PDF amb pdf-lib. Les àrees transparents s'omplen amb un fons blanc. + +## Opcions + +**Qualitat del PDF** controla la compressió després de la rasterització: + +- **Alta qualitat**: el més proper a la representació original. +- **Qualitat mitjana** (per defecte): bon equilibri. +- **Qualitat baixa**: fitxer més petit, amb una mica de pèrdua de detall. + +## Casos d'ús + +- Convertir diagrames d'arquitectura o enginyeria d'SVG a un PDF llest per imprimir +- Empaquetar conjunts d'icones en un PDF de referència per a un sistema de disseny +- Convertir visualitzacions de dades (D3.js, exportacions de biblioteques de gràfics) en PDF per a informes +- Crear versions imprimibles d'infografies basades en SVG + +## Consells + +- Els fitxers SVG sense atributs `width` i `height` explícits es representen a 800x600 píxels. Per obtenir els millors resultats, defineix les dimensions a l'SVG abans de convertir-lo. +- Els SVG complexos amb referències a fonts externes o imatges enllaçades poden no representar-se perfectament. Incrusta tots els recursos a l'SVG per a una sortida fiable. +- Com que l'SVG es rasteritza, el PDF contindrà una imatge de mapa de bits en lloc de traçats vectorials. Per a una sortida PDF realment vectorial, cal una eina vectorial dedicada. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [BMP a PDF](./bmp-to-pdf) diff --git a/docs/ca/tools/table-of-contents.md b/docs/ca/tools/table-of-contents.md new file mode 100644 index 00000000..7e6852c2 --- /dev/null +++ b/docs/ca/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Taula de continguts +description: Genera una pàgina de taula de continguts amb format a partir dels marcadors existents del PDF. +--- + +# Taula de continguts + +Aquesta eina llegeix els marcadors (esquemes) del PDF i genera una pàgina de taula de continguts amb format que s'afegeix al principi del document. Si el PDF ja té marcadors però no té una pàgina de sumari visible, aquesta eina en crea una automàticament. + +## Com funciona + +1. Puja un PDF que contingui marcadors. +2. Personalitza el títol, la mida de lletra i la família tipogràfica del sumari. +3. Opcionalment, marca **Afegeix un marcador per a la pàgina del sumari** per incloure el sumari mateix a l'arbre de marcadors. +4. Fes clic a **Genera la taula de continguts** per processar el fitxer. +5. El PDF actualitzat es baixa automàticament amb la pàgina del sumari inserida al principi. + +## Opcions + +- **Títol del sumari**: l'encapçalament que es mostra a la part superior de la pàgina generada. Per defecte és "Taula de continguts". +- **Mida de lletra**: tria entre 10 pt i 72 pt. El valor per defecte és 12 pt. +- **Família tipogràfica**: tria entre variants de Times Roman, Helvetica o Courier (normal, negreta, cursiva, negreta cursiva). Per defecte és Helvetica. +- **Afegeix un marcador per a la pàgina del sumari**: si està marcat, s'afegeix a l'esquema del PDF un marcador per a la pàgina del sumari mateixa. + +## Funcions + +- Llegeix tota la jerarquia de marcadors del PDF +- Genera una pàgina de sumari amb un format net i referències de número de pàgina +- Admet nivells de marcadors imbricats amb sagnat +- Tria entre 12 fonts PDF integrades +- Marcador opcional que apunta a la pàgina del sumari mateixa + +## Casos d'ús + +- Afegir una taula de continguts imprimible a llibres electrònics o informes que només tenen marcadors digitals +- Crear un sumari per a un document fusionat després de combinar diversos PDF +- Generar una pàgina de referència per a manuals tècnics llargs +- Preparar documents per imprimir quan s'espera un sumari visible + +## Consells + +- Si el PDF no té marcadors, utilitza primer l'eina [Edita els marcadors](./bookmark) per crear-los i després torna aquí per generar el sumari. +- En documents grans, una mida de lletra més gran com 14 pt o 16 pt millora la llegibilitat. + +## Eines relacionades + +- [Edita els marcadors](./bookmark) +- [Números de pàgina](./page-numbers) +- [Capçalera i peu de pàgina](./header-footer) diff --git a/docs/ca/tools/text-color.md b/docs/ca/tools/text-color.md new file mode 100644 index 00000000..d8c1377a --- /dev/null +++ b/docs/ca/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Canvia el color del text +description: Canvia el color de tot el text del PDF al color que triïs. +--- + +# Canvia el color del text + +Substitueix el color del text de tot el PDF. L'eina identifica les zones de text de cada pàgina i les torna a pintar amb el color triat, conservant el disseny del document i el contingut que no és text. + +## Com funciona + +1. Puja el fitxer PDF. +2. Tria un color de text nou amb el selector de color. El valor per defecte és blau (#0000FF). +3. Fes clic a **Canvia el color del text** per processar-lo. +4. El PDF amb el color nou es baixa automàticament. Un indicador de progrés mostra quina pàgina s'està processant. + +## Opcions + +- **Color de text nou**: un selector de color per triar el color de substitució de tot el text del document. + +## Funcions + +- Canvia el color del text a totes les pàgines del document +- Processament per pàgina amb indicació del progrés +- Selector de color amb compatibilitat completa amb colors hexadecimals +- Conserva el disseny de la pàgina i els elements que no són text + +## Casos d'ús + +- Canviar el text negre a blau fosc per donar al document un aspecte més suau i modern +- Canviar el color del text perquè coincideixi amb la guia d'estil de la marca abans de distribuir documents +- Convertir el text a un color concret per complir requisits d'accessibilitat +- Fer visible el text sobre un color de fons aplicat recentment + +## Consells + +- Aquesta eina representa les pàgines a escala 2x per mantenir la qualitat i després reconstrueix el PDF. La sortida es basa en imatges, de manera que el text ja no es podrà seleccionar ni cercar. +- Per a documents en què necessitis conservar el text seleccionable, considera editar el PDF directament amb l'[Editor de PDF](./edit-pdf). +- El temps de processament augmenta amb el nombre de pàgines, ja que cada pàgina es representa individualment. + +## Eines relacionades + +- [Color de fons](./background-color) +- [Inverteix els colors](./invert-colors) +- [Ajusta els colors](./adjust-colors) diff --git a/docs/ca/tools/tiff-to-pdf.md b/docs/ca/tools/tiff-to-pdf.md new file mode 100644 index 00000000..b3a18649 --- /dev/null +++ b/docs/ca/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF a PDF +description: Converteix imatges TIFF d'una o diverses pàgines a format PDF al navegador, amb compatibilitat completa de pàgines. +--- + +# TIFF a PDF + +Converteix fitxers TIFF a PDF, inclosos els TIFF de diverses pàgines. Cada pàgina (o "IFD") d'un fitxer TIFF es converteix en una pàgina separada al PDF de sortida. Això és especialment útil per a documents escanejats, faxos i imatges mèdiques, que sovint es desen com a TIFF de diverses pàgines. + +## Formats compatibles + +| Format | Extensions | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers TIFF. +2. Revisa la llista de fitxers i gestiona-la segons calgui. +3. Fes clic a **Converteix a PDF**. El resultat es baixa com a `from_tiff.pdf`. + +L'eina descodifica cada fitxer TIFF amb un descodificador TIFF en JavaScript i n'extreu les dades de píxels RGBA de cada pàgina. Cada pàgina es representa en un llenç, s'exporta com a PNG i s'incrusta al PDF. Les dimensions de les pàgines coincideixen amb les pàgines TIFF originals. + +## Opcions + +Aquesta eina no ofereix opcions de qualitat addicionals. Les imatges s'incrusten a la seva resolució nativa. + +## Casos d'ús + +- Convertir documents de fax de diverses pàgines (TIFF-F) a un format PDF més portàtil +- Convertir arxius de documents escanejats desats com a TIFF en PDF cercables (combinant-ho després amb l'eina OCR) +- Processar fitxers d'imatge mèdica (preparacions de patologia, exportacions de radiologia) que utilitzen TIFF +- Convertir fitxers TIFF d'imatges SIG o de satèl·lit en documents fàcils de compartir + +## Consells + +- Els TIFF de diverses pàgines són totalment compatibles. Un TIFF de 10 pàgines produirà un PDF de 10 pàgines. No cal dividir el TIFF abans. +- Els fitxers TIFF molt grans (centenars de megabytes) poden trigar més a processar-se, ja que tot el fitxer s'ha de descodificar a la memòria del navegador. +- Si necessites OCR al PDF resultant, passa'l per l'eina [Reconeixement OCR de PDF](./ocr-pdf) després de la conversió. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [BMP a PDF](./bmp-to-pdf) +- [JPG a PDF](./jpg-to-pdf) diff --git a/docs/ca/tools/txt-to-pdf.md b/docs/ca/tools/txt-to-pdf.md new file mode 100644 index 00000000..1922b115 --- /dev/null +++ b/docs/ca/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Text a PDF +description: Converteix fitxers de text pla o text escrit a PDF amb fonts, colors i mides de pàgina personalitzats. +--- + +# Text a PDF + +Converteix text pla en un PDF amb format. Pots pujar fitxers `.txt` o escriure directament a l'editor de text integrat. L'eina admet diverses fonts, colors de text personalitzats i una àmplia gamma de mides de pàgina, des d'A0 fins a A10, a més de US Letter, Legal i Tabloid. + +## Formats compatibles + +| Entrada | Extensions | +| :---------------------- | :---------------------------------- | +| Fitxers de text pla | `.txt` | +| Entrada de text directa | Escriu o enganxa el text a l'editor | + +## Com funciona + +1. Tria el mode d'entrada amb el commutador de la part superior: **Puja fitxers** o **Escriu text**. +2. Si puges fitxers, arrossega i deixa anar o fes clic per seleccionar un o més fitxers `.txt`. Si escrius, introdueix el text directament a l'àrea de text. +3. Configura les opcions de format: família tipogràfica, mida de lletra, color del text i mida de pàgina. +4. Fes clic a **Crea el PDF**. La sortida es baixa com a `text_to_pdf.pdf`. + +Quan puges diversos fitxers, el seu contingut es concatena amb línies en blanc entre ells. + +## Opcions + +| Opció | Valors | Per defecte | +| :---------------------- | :----------------------------------------------------------------------- | :-------------- | +| **Família tipogràfica** | Helvetica (sans-serif), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Mida de lletra** | 6-72 pt | 12 | +| **Color del text** | Qualsevol color amb el selector de color | Negre (#000000) | +| **Mida de pàgina** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Les llengües de dreta a esquerra (àrab, hebreu, persa, urdú) es detecten automàticament. Quan es troba text RTL, la direcció i l'alineació del text canvien en conseqüència. + +## Casos d'ús + +- Convertir fragments de codi o fitxers de registre en un PDF imprimible amb la font Courier +- Crear ràpidament un PDF a partir de notes de reunió escrites al moment +- Donar format a un manuscrit de text pla amb una font i una mida de pàgina concretes per enviar-lo +- Produir una versió PDF d'un README o d'un registre de canvis per distribuir-lo fora de línia + +## Consells + +- Utilitza el mode **Escriu text** quan vulguis convertir ràpidament el contingut del porta-retalls sense desar-lo abans com a fitxer. +- Courier (monospace) és la millor font per a codi, registres o qualsevol contingut on importi l'alineació de columnes. +- Els marges de la pàgina són fixos de 72 punts (1 polzada) a tots els costats. + +## Eines relacionades + +- [Markdown a PDF](./markdown-to-pdf) +- [CSV a PDF](./csv-to-pdf) +- [Word a PDF](./word-to-pdf) diff --git a/docs/ca/tools/unlock-pdf.md b/docs/ca/tools/unlock-pdf.md new file mode 100644 index 00000000..b75bdf58 --- /dev/null +++ b/docs/ca/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Desbloqueja PDF +description: Elimina la protecció amb contrasenya dels PDF xifrats. Admet el desxifratge per lots amb una sola contrasenya per a diversos fitxers. +--- + +# Desbloqueja PDF + +Si tens la contrasenya d'un PDF xifrat, aquesta eina n'elimina el xifratge per complet i genera una còpia desbloquejada que qualsevol pot obrir sense credencials. Admet el desxifratge per lots quan diversos PDF comparteixen la mateixa contrasenya. + +## Com funciona + +1. Puja un o més fitxers PDF xifrats. +2. Introdueix la **contrasenya** utilitzada per protegir els fitxers. +3. Fes clic a **Desxifra PDF**. +4. Un sol fitxer es descarrega directament. Diversos fitxers generen un arxiu ZIP amb tots els PDF desbloquejats. + +## Característiques + +- Desxifratge d'un sol fitxer i per lots +- Admet tant contrasenyes d'usuari com de propietari +- Genera una sortida completament sense xifrar i sense cap restricció residual +- Informes d'error clars per a contrasenyes incorrectes o fitxers malmesos +- Seguiment per fitxer de l'èxit o l'error en mode per lots + +## En què es diferencia d'Elimina les restriccions + +**Desxifra PDF** requereix la contrasenya i elimina tot el xifratge. **Elimina les restriccions** actua sobre les restriccions d'ús (impressió, còpia, edició) i pot no requerir contrasenya si només s'havia definit una contrasenya de propietari. Utilitza Desxifra quan el PDF no s'obre de cap manera sense contrasenya. + +## Casos d'ús + +- Desbloquejar de manera permanent PDF que vas xifrar abans quan ja no cal la contrasenya +- Eliminar el xifratge d'un lot de documents arxivats per facilitar-ne l'accés a llarg termini +- Preparar PDF protegits amb contrasenya per a un sistema de gestió documental que no admet fitxers xifrats +- Desbloquejar PDF abans de combinar-los amb altres documents (moltes eines de combinació no poden processar fitxers xifrats) + +## Consells + +- El camp de la contrasenya s'aplica a tots els fitxers pujats. Si els teus PDF tenen contrasenyes diferents, processa'ls en lots separats. +- Si obtens l'error «Contrasenya incorrecta», comprova que no hi hagi espais al final ni les majúscules activades. +- Després del desxifratge, la sortida no té cap seguretat. Torna-la a xifrar amb Xifra PDF si vols aplicar una contrasenya nova. + +## Eines relacionades + +- [Xifra PDF](./protect-pdf): torna a aplicar el xifratge amb una contrasenya nova +- [Elimina les restriccions](./remove-restrictions): elimina les restriccions d'ús sense desxifrar-ho tot +- [Canvia els permisos](./change-permissions): modifica permisos concrets d'un PDF xifrat diff --git a/docs/ca/tools/validate-signature-pdf.md b/docs/ca/tools/validate-signature-pdf.md new file mode 100644 index 00000000..132709dc --- /dev/null +++ b/docs/ca/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Valida la signatura +description: Verifica les signatures digitals dels fitxers PDF. Comprova la validesa del certificat, la identitat del signant, la integritat del document i l'estat de la cadena de confiança. +--- + +# Valida la signatura + +Puja un PDF signat i aquesta eina n'extreu totes les signatures digitals, identifica el signant, comprova la validesa del certificat i indica si el document s'ha modificat després de signar-lo. També pots proporcionar un certificat de confiança per verificar la cadena de signatura. + +## Com funciona + +1. Puja un fitxer PDF signat. La validació comença automàticament. +2. L'eina mostra un resum: nombre de signatures trobades i quantes són vàlides. +3. Cada signatura té una targeta detallada amb el nom del signant, l'emissor, les dates i l'estat. +4. Opcionalment, puja un **certificat de confiança** (.pem, .crt, .cer, .der) per verificar la signatura amb una àncora de confiança concreta. La revalidació s'executa automàticament. + +## Què es comprova + +### Anàlisi de la signatura + +L'eina extreu els objectes de signatura PKCS#7 del PDF, descodifica l'estructura ASN.1 i n'obté el certificat X.509 del signant, juntament amb qualsevol cadena de certificats inclosa a la signatura. + +### Validesa del certificat + +- **Caducitat**: el certificat és actualment dins del seu període de validesa? +- **Detecció d'autosignatura**: el certificat és el seu propi emissor? +- **Cadena de confiança**: quan es proporciona un certificat de confiança, el certificat del signant enllaça amb aquest? + +### Verificació criptogràfica + +- L'eina reconstrueix els bytes coberts per `/ByteRange` de la signatura, en calcula el resum amb l'algorisme declarat pel signant i compara el resultat amb l'atribut `messageDigest` de la signatura. +- Després torna a serialitzar els atributs signats com a DER SET i verifica la signatura amb la clau pública del certificat del signant. +- **Una signatura es considera vàlida només quan totes aquestes comprovacions es superen.** Si els bytes del PDF s'han modificat després de signar, o la signatura incrustada no coincideix amb la clau del signant, l'estat mostra «No vàlida: la verificació criptogràfica ha fallat» amb el motiu concret. + +#### Algorismes de signatura admesos + +| Algorisme | Camí de verificació | +| ----------------------- | ----------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, amb alternativa a Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` després de la conversió DER → IEEE P1363 | + +Si una signatura utilitza un algorisme que no és a la llista (per exemple Ed25519, SM2 o RSA amb un OID de resum poc habitual), la targeta mostra **«No verificada: algorisme de signatura no compatible»** en groc, juntament amb l'OID o el motiu concret. És una distinció deliberada de tres estats: + +- **Vàlida**: la signatura s'ha verificat criptogràficament amb la clau pública del signant. +- **No vàlida**: la verificació s'ha executat i ha donat un resultat negatiu (bytes modificats, clau no coincident). +- **No verificada**: l'eina no ha pogut executar la verificació per a aquest algorisme. Les metadades del certificat es mostren igualment, però has de tractar la signatura com a «desconeguda» i verificar-la amb Adobe Acrobat o `openssl cms -verify`. + +### Algorismes de resum insegurs + +- Les signatures que utilitzen **MD5 o SHA-1** es rebutgen com a no vàlides i es marquen amb l'estat «Resum insegur». Tots dos algorismes tenen atacs de col·lisió publicats, de manera que una signatura sobre un resum SHA-1 o MD5 no ofereix cap garantia d'integritat. +- SHA-224, SHA-256, SHA-384 i SHA-512 s'accepten tots. + +### Cobertura del document + +- **Cobertura completa**: la signatura cobreix tot el fitxer PDF, és a dir, no s'ha afegit ni canviat cap byte després de signar. +- **Cobertura parcial**: la signatura només cobreix una part del fitxer. Pot indicar que s'han fet modificacions després de signar (no necessàriament malintencionades: els desats incrementals produeixen cobertura parcial). + +## Detalls de la signatura + +Cada targeta de signatura mostra: + +- **Signat per**: nom comú, organització i correu electrònic del certificat del signant +- **Emissor**: l'autoritat de certificació que va emetre el certificat del signant +- **Signat el**: la marca de temps incrustada a la signatura +- **Vàlid des de / Vàlid fins a**: el període de validesa del certificat +- **Motiu**: per què es va signar el document (si es proporciona) +- **Ubicació**: on es va signar (si es proporciona) +- **Estat de cobertura**: completa o parcial +- **Insígnia de confiança**: de confiança o fora de la cadena de confiança (només quan es proporciona un certificat personalitzat) + +### Detalls tècnics + +Desplega la secció de detalls tècnics per veure: + +- El número de sèrie del certificat del signant +- L'algorisme de resum (SHA-256, SHA-512, etc.) +- L'algorisme de signatura (RSA amb SHA-256, ECDSA amb SHA-256, etc.) +- Els missatges d'error de les signatures no vàlides + +## Casos d'ús + +- Verificar un contracte signat digitalment abans de contrasignar-lo +- Auditar documents signats per confirmar que no s'han manipulat +- Comprovar si un certificat ha caducat des que es va signar el document +- Validar signatures amb el certificat arrel de la teva organització +- Inspeccionar els detalls de signatura de documents governamentals o legals + +## Consells + +- Un certificat autosignat no vol dir que la signatura no sigui vàlida: vol dir que la identitat del signant no es pot verificar mitjançant un tercer de confiança. És habitual en documents interns. +- La cobertura parcial no sempre indica manipulació. Molts fluxos de treball amb PDF afegeixen actualitzacions incrementals (com una segona signatura) que creen cobertura parcial. +- Puja el certificat arrel o intermedi de la teva organització com a certificat de confiança per obtenir la verificació de la cadena de confiança. + +## Eines relacionades + +- [Signatura digital de PDF](./digital-sign-pdf): signa PDF amb el teu propi certificat +- [Aplana PDF](./flatten-pdf): aplana un PDF abans de signar-lo per evitar modificacions posteriors a la signatura +- [Elimina les metadades](./remove-metadata): neteja un PDF abans d'aplicar-hi una signatura diff --git a/docs/ca/tools/view-metadata.md b/docs/ca/tools/view-metadata.md new file mode 100644 index 00000000..48a14cbc --- /dev/null +++ b/docs/ca/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Visualitza les metadades +description: Inspecciona totes les propietats de metadades d'un PDF, incloent-hi la informació del document, les dades XMP i els detalls estructurals. +--- + +# Visualitza les metadades + +Examina les propietats ocultes incrustades en un fitxer PDF. L'eina mostra la informació del document (títol, autor, dates), les metadades XMP, les dimensions de les pàgines i altres dades estructurals en un format llegible. + +## Com funciona + +1. Puja un fitxer PDF. +2. L'eina analitza el fitxer immediatament i mostra totes les metadades disponibles en seccions organitzades. +3. Revisa el diccionari d'informació del document, l'arbre de metadades XMP i les propietats estructurals. +4. No cal cap pas de processament: les metadades es mostren tan bon punt es carrega el fitxer. + +## Característiques + +- Mostra els camps d'informació estàndard del document: Títol, Autor, Assumpte, Paraules clau, Creador, Productor +- Mostra les dates de creació i modificació en un format llegible +- Analitza i mostra l'arbre complet de metadades XMP amb espais de noms imbricats +- Converteix el format de data del PDF (`D:20240101120000Z`) en dates llegibles +- Organitzat en seccions plegables per facilitar la navegació + +## Seccions de metadades + +| Secció | Contingut | +| --------------------------- | ------------------------------------------------------------------------------------------------- | +| **Informació del document** | Títol, Autor, Assumpte, Paraules clau, Creador, Productor, Data de creació, Data de modificació | +| **Metadades XMP** | Arbre complet de metadades basat en XML amb Dublin Core, XAP, PDF i espais de noms personalitzats | +| **Propietats del document** | Nombre de pàgines, versió del PDF, mida del fitxer, estat del xifratge | + +## Casos d'ús + +- Comprovar qui ha creat un PDF i quan es va modificar per última vegada +- Verificar que les metadades s'han definit correctament abans de publicar un document +- Auditar PDF per protegir la privadesa comprovant quina informació personal hi ha incrustada +- Investigar el programari utilitzat per crear o modificar un PDF (mitjançant el camp Productor) +- Revisar les metadades XMP per complir amb la gestió d'actius digitals + +## Consells + +- Les cadenes de data del PDF que comencen per `D:` es converteixen automàticament al format de la teva zona horària local. +- Si els camps de metadades apareixen buits, el creador del PDF simplement no els va definir. No tots els PDF contenen metadades riques. +- Per modificar les metadades després d'inspeccionar-les, utilitza [Edita les metadades](./edit-metadata). Per eliminar-les del tot, utilitza Elimina les metadades. + +## Eines relacionades + +- [Edita les metadades](./edit-metadata) +- [Capes OCG del PDF](./pdf-layers) +- [Compara PDF](./compare-pdfs) diff --git a/docs/ca/tools/vsd-to-pdf.md b/docs/ca/tools/vsd-to-pdf.md new file mode 100644 index 00000000..545ef53f --- /dev/null +++ b/docs/ca/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD a PDF +description: Converteix diagrames de Microsoft Visio (VSD/VSDX) a PDF al navegador. Gratuït, privat i sense necessitat de Visio. +--- + +# VSD a PDF + +Converteix diagrames de Microsoft Visio a PDF sense instal·lar Visio. Els fitxers VSD i VSDX contenen diagrames de flux, organigrames, diagrames de xarxa i plànols que la majoria de persones no poden obrir. Aquesta eina els renderitza com a PDF nets que es poden veure en qualsevol dispositiu. + +## Formats admesos + +| Format | Extensió | Notes | +| :----------- | :------- | :----------------------------------------------- | +| Visio binari | `.vsd` | Format antic de Visio (Visio 2003 i anteriors) | +| Visio XML | `.vsdx` | Format modern de Visio (Visio 2013 i posteriors) | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers VSD o VSDX. Es poden barrejar tots dos formats en un mateix lot. +2. Revisa la llista de fitxers. Elimina les entrades que no vulguis amb la icona de la paperera, o utilitza **Afegeix més fitxers** per afegir més diagrames. +3. Fes clic a **Converteix a PDF**. El motor basat en LibreOffice es carrega al navegador i renderitza cada diagrama en un PDF, conservant les formes, els connectors, les etiquetes i la maquetació de la pàgina. +4. Un sol diagrama es descarrega directament com a PDF. Diversos fitxers generen un arxiu ZIP anomenat `vsd-to-pdf.zip`. + +## Opcions + +No cal cap configuració. El convertidor respecta la mida i l'orientació de pàgina originals del document de Visio. + +## Casos d'ús + +- Revisar diagrames de Visio d'un company quan no tens llicència de Visio +- Incloure diagrames de xarxa o d'arquitectura en la documentació d'un projecte com a PDF +- Imprimir organigrames o fluxos de processos per a materials de reunions +- Arxivar fitxers VSD antics de versions anteriors de Visio en un format preparat per al futur + +## Consells + +- Els documents de Visio de diverses pàgines generen PDF de diverses pàgines, amb cada pàgina de Visio assignada a una pàgina del PDF. +- Els fitxers VSDX (el format modern basat en XML) generalment es converteixen amb més fidelitat que els fitxers binaris VSD antics. +- El motor LibreOffice es carrega un cop per sessió. Espera una breu estona a la primera conversió, amb resultats més ràpids als fitxers següents. + +## Eines relacionades + +- [ODG a PDF](./odg-to-pdf) +- [PUB a PDF](./pub-to-pdf) +- [PSD a PDF](./psd-to-pdf) diff --git a/docs/ca/tools/webp-to-pdf.md b/docs/ca/tools/webp-to-pdf.md new file mode 100644 index 00000000..7e9495b6 --- /dev/null +++ b/docs/ca/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP a PDF +description: Converteix imatges WebP a PDF directament al navegador amb una qualitat de compressió ajustable. +--- + +# WebP a PDF + +Converteix el format d'imatge WebP de Google a PDF. És especialment útil quan has baixat imatges del web en format WebP i les necessites en un format més acceptat universalment per imprimir-les o compartir-les. + +## Formats admesos + +| Format | Extensions | +| :----- | :--------- | +| WebP | `.webp` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers WebP. +2. Revisa la llista de fitxers i elimina els que no necessitis. +3. Selecciona un nivell de **Qualitat del PDF**. +4. Fes clic a **Converteix a PDF**. El resultat es descarrega com a `from_webps.pdf`. + +Internament, cada imatge WebP es descodifica mitjançant l'API canvas del navegador i després s'incrusta al PDF amb pdf-lib. Això vol dir que la conversió funciona en qualsevol navegador que admeti la descodificació de WebP (tots els navegadors moderns ho fan). + +## Opcions + +**Qualitat del PDF** controla la compressió en incrustar les imatges: + +- **Qualitat alta**: conserva el màxim detall. +- **Qualitat mitjana** (per defecte): resultat equilibrat. +- **Qualitat baixa**: mida de fitxer més petita. + +## Casos d'ús + +- Convertir en un PDF imprimible les imatges baixades del web i desades com a WebP +- Reunir captures de pantalla WebP de Chrome o Edge en documentació +- Crear un porfolit en PDF a partir d'imatges exportades per eines de disseny que fan servir WebP per defecte +- Arxivar imatges WebP en un format llegible de manera més universal + +## Consells + +- WebP es descodifica internament a PNG abans d'incrustar-lo al PDF, de manera que les imatges WebP sense pèrdua conserven la qualitat amb l'opció Alta. +- Si tens una barreja d'imatges WebP i d'altres formats, utilitza l'eina [Imatges a PDF](./image-to-pdf): accepta tot d'una vegada. + +## Eines relacionades + +- [Imatges a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [JPG a PDF](./jpg-to-pdf) diff --git a/docs/ca/tools/word-to-pdf.md b/docs/ca/tools/word-to-pdf.md new file mode 100644 index 00000000..09d3e0a2 --- /dev/null +++ b/docs/ca/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word a PDF +description: Converteix documents de Word (DOC, DOCX), ODT i RTF a PDF al navegador conservant tot el format. +--- + +# Word a PDF + +Converteix documents de Microsoft Word i formats compatibles a PDF. L'eina utilitza un motor LibreOffice que s'executa al navegador i que admet fitxers DOC, DOCX, ODT i RTF, conservant a la sortida el format, les taules, les imatges, les capçaleres, els peus de pàgina i els estils. + +## Formats admesos + +| Format | Extensions | +| :---------------------- | :--------- | +| Word (modern) | `.docx` | +| Word (antic) | `.doc` | +| Text OpenDocument | `.odt` | +| Format de text enriquit | `.rtf` | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els documents de Word. Pots seleccionar diversos fitxers alhora. +2. Revisa i gestiona la llista de fitxers. +3. Fes clic a **Converteix a PDF**. El motor LibreOffice es carrega en el primer ús (un indicador de progrés mostra l'estat d'inicialització) i després es converteix cada fitxer. +4. Un sol fitxer es descarrega directament com a PDF. Diversos fitxers s'empaqueten a `word-converted.zip`. + +## Opcions + +Aquesta eina no té cap configuració addicional. El motor LibreOffice genera la sortida amb el seu perfil d'exportació a PDF per defecte. + +## Sortida + +| Nombre d'entrades | Sortida | +| :---------------- | :------------------------------------------------------------------ | +| 1 fitxer | Baixada d'un sol PDF (nom de fitxer original amb l'extensió `.pdf`) | +| 2 o més fitxers | Arxiu ZIP (`word-converted.zip`) que conté un PDF per fitxer | + +## Casos d'ús + +- Convertir un currículum o una carta de presentació de DOCX a PDF abans d'enviar una candidatura +- Convertir per lots un conjunt de contractes o propostes a PDF per lliurar-los a un client +- Convertir fitxers `.doc` antics en PDF moderns per a l'arxivament a llarg termini +- Convertir a PDF documents col·laboratius de Google Docs (exportats com a DOCX) +- Generar PDF llestos per imprimir a partir de plantilles de Word utilitzades en la generació automatitzada de documents + +## Consells + +- El motor LibreOffice es descarrega un cop per sessió i es desa a la memòria cau. Espera uns segons de càrrega a la primera conversió, amb conversions posteriors molt més ràpides. +- El format complex (macros, controls ActiveX, SmartArt avançat) pot no convertir-se perfectament. Els elements estàndard d'un document (text, taules, imatges, capçaleres, notes al peu) es converteixen de manera fiable. +- Com que aquesta eina també accepta ODT i RTF, pots utilitzar-la com a convertidor únic per a tots els formats de processament de textos. + +## Eines relacionades + +- [ODT a PDF](./odt-to-pdf) +- [RTF a PDF](./rtf-to-pdf) +- [Excel a PDF](./excel-to-pdf) +- [PowerPoint a PDF](./powerpoint-to-pdf) diff --git a/docs/ca/tools/wpd-to-pdf.md b/docs/ca/tools/wpd-to-pdf.md new file mode 100644 index 00000000..f1eb1298 --- /dev/null +++ b/docs/ca/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD a PDF +description: Converteix documents de WordPerfect (WPD) a PDF al navegador amb LibreOffice. Gratuït i privat. +--- + +# WPD a PDF + +Converteix documents de Corel WordPerfect en fitxers PDF. WPD va ser en el seu dia el format de processament de textos dominant en despatxos d'advocats i organismes públics. Si tens fitxers antics de WordPerfect que el programari modern es nega a obrir, aquesta eina els torna a la vida com a PDF estàndard. + +## Formats admesos + +| Format | Extensió | Notes | +| :---------- | :------- | :------------------------------------------- | +| WordPerfect | `.wpd` | Totes les versions principals de WordPerfect | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers WPD. Pots seleccionar diversos fitxers alhora. +2. Revisa la llista de fitxers. Elimina els fitxers que no vulguis amb la icona de la paperera, o utilitza **Afegeix més fitxers** per afegir més documents. +3. Fes clic a **Converteix a PDF**. L'eina carrega al navegador un motor de conversió basat en LibreOffice, que analitza el format WPD i genera el PDF. +4. Un sol fitxer es descarrega directament com a PDF. Les conversions per lots generen un arxiu ZIP anomenat `wpd-to-pdf.zip`. + +## Opcions + +No cal cap configuració. El motor LibreOffice gestiona automàticament el format, les tipografies i la maquetació de WPD. + +## Casos d'ús + +- Obrir documents legals de fa dècades escrits amb WordPerfect +- Convertir expedients governamentals arxivats de WPD a un format modern +- Migrar una biblioteca antiga de documents de WordPerfect a PDF per a l'emmagatzematge a llarg termini +- Compartir fitxers WPD amb destinataris que no tenen Corel WordPerfect instal·lat + +## Consells + +- El motor LibreOffice es carrega en el primer ús, cosa que triga una estona. Les conversions següents de la mateixa sessió són més ràpides. +- Les macros complexes de WPD i els codis de revelació no es conserven, però la maquetació visual, el contingut del text i el format bàsic es mantenen al PDF. + +## Eines relacionades + +- [WPS a PDF](./wps-to-pdf) +- [ODG a PDF](./odg-to-pdf) diff --git a/docs/ca/tools/wps-to-pdf.md b/docs/ca/tools/wps-to-pdf.md new file mode 100644 index 00000000..a38478d3 --- /dev/null +++ b/docs/ca/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS a PDF +description: Converteix documents de Microsoft Works (WPS) a PDF al navegador. Gratuït, sense registre i totalment privat. +--- + +# WPS a PDF + +Converteix fitxers de processador de textos de Microsoft Works a PDF. Microsoft Works s'incloïa als ordinadors domèstics a finals dels anys 90 i durant els 2000, i encara hi ha molts fitxers WPS en discs durs antics i arxius de correu. Aquesta eina els obre al navegador i genera PDF nets. + +## Formats admesos + +| Format | Extensió | Notes | +| :-------------- | :------- | :-------------------------------------------------- | +| Microsoft Works | `.wps` | Fitxers de processador de textos de Microsoft Works | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers WPS. S'accepten diversos fitxers. +2. Revisa la llista de fitxers. Utilitza la icona de la paperera per eliminar fitxers individuals, o fes clic a **Afegeix més fitxers** per ampliar el lot. +3. Fes clic a **Converteix a PDF**. Un motor basat en LibreOffice es carrega al navegador i converteix cada document WPS a PDF. +4. Un fitxer es descarrega directament com a PDF. Diversos fitxers s'agrupen en un arxiu ZIP anomenat `wps-to-pdf.zip`. + +## Opcions + +No calen paràmetres addicionals. El convertidor gestiona el text, el format bàsic i les imatges incrustades del fitxer WPS. + +## Casos d'ús + +- Recuperar documents antics d'escola o de feina desats en format Microsoft Works +- Obrir fitxers WPS adjunts al correu quan no tens Microsoft Works instal·lat +- Convertir un arxiu de fitxers WPS per migrar-lo a un sistema de documents modern +- Imprimir documents antics que els processadors de textos actuals no poden obrir + +## Consells + +- No confonguis els fitxers `.wps` de Microsoft Works amb els fitxers de WPS Office. Aquesta eina és específicament per al format antic de Microsoft Works. +- El motor LibreOffice triga una estona a carregar-se en el primer ús. Un cop carregat, les conversions següents de la mateixa sessió són més ràpides. + +## Eines relacionades + +- [WPD a PDF](./wpd-to-pdf) +- [PUB a PDF](./pub-to-pdf) diff --git a/docs/ca/tools/xml-to-pdf.md b/docs/ca/tools/xml-to-pdf.md new file mode 100644 index 00000000..38c288cf --- /dev/null +++ b/docs/ca/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML a PDF +description: Converteix fitxers XML en documents PDF estructurats al navegador. Gratuït, privat i sense processament al servidor. +--- + +# XML a PDF + +Converteix fitxers de dades XML en documents PDF llegibles i estructurats. L'XML en brut és potent, però difícil de llegir per a les persones. Aquesta eina analitza l'arbre XML, identifica les estructures de dades repetides i les renderitza com a taules i seccions amb format en un PDF A4 apaïsat. + +## Formats admesos + +| Format | Extensió | Notes | +| :----- | :------- | :-------------------------------- | +| XML | `.xml` | Qualsevol document XML ben format | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers XML. Es poden processar diversos fitxers en un sol lot. +2. Revisa la llista de fitxers. Elimina els fitxers que no vulguis amb la icona de la paperera, o fes clic a **Afegeix més fitxers** per incloure'n més. +3. Fes clic a **Converteix a PDF**. L'eina analitza l'estructura XML amb el DOMParser integrat del navegador, n'analitza la jerarquia de dades i la renderitza en un PDF amb jsPDF i format de taula automàtic. +4. Un sol fitxer es descarrega com a PDF. Diverses conversions s'empaqueten a `xml-to-pdf.zip`. + +## Opcions + +No cal cap configuració manual. El convertidor detecta automàticament l'estructura XML i tria les maquetacions de taula adequades. La sortida utilitza l'orientació A4 apaïsada per encabir conjunts de dades amples. + +## Casos d'ús + +- Convertir exportacions de dades XML de bases de dades o API en informes imprimibles +- Crear resums llegibles a partir de fitxers de configuració XML +- Convertir factures o registres de transaccions basats en XML en PDF per conservar-los +- Fer llegibles en forma de document mapes del lloc XML o canals RSS + +## Consells + +- L'XML ha d'estar ben format. Si l'analitzador troba errors de sintaxi, la conversió fallarà amb un missatge d'error descriptiu que indica el problema. +- Les estructures XML molt imbricades s'aplanen en taules. Per obtenir els millors resultats, les dades haurien de tenir elements germans repetits amb elements fills coherents. +- Durant la conversió apareixen actualitzacions de progrés que mostren cada fase: lectura, anàlisi, estudi i renderització. + +## Eines relacionades + +- [FB2 a PDF](./fb2-to-pdf) +- [XPS a PDF](./xps-to-pdf) +- [Correu electrònic a PDF](./email-to-pdf) diff --git a/docs/ca/tools/xps-to-pdf.md b/docs/ca/tools/xps-to-pdf.md new file mode 100644 index 00000000..a8657c71 --- /dev/null +++ b/docs/ca/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS a PDF +description: Converteix documents XPS i OXPS a PDF al navegador. Sense càrregues, sense registre i totalment privat. +--- + +# XPS a PDF + +Converteix documents Microsoft XPS i OXPS en fitxers PDF estàndard. XPS (XML Paper Specification) va ser la resposta de Microsoft al PDF, però el seu suport ha anat minvant a totes les plataformes. Aquesta eina fa que aquests documents tornin a ser llegibles per a tothom. + +## Formats admesos + +| Format | Extensió | Notes | +| :----- | :------- | :------------------------------------------- | +| XPS | `.xps` | Format XPS original de Microsoft | +| OXPS | `.oxps` | Open XPS, la variant de l'estàndard ECMA-388 | + +## Com funciona + +1. Fes clic a l'àrea de càrrega o arrossega i deixa anar els fitxers XPS/OXPS. Pots seleccionar diversos fitxers alhora. +2. Revisa la llista de fitxers. Elimina fitxers individuals amb la icona de la paperera, o fes clic a **Afegeix més fitxers** per afegir-hi més documents. +3. Fes clic a **Converteix a PDF**. El motor PyMuPDF processa cada document localment al navegador. +4. Un sol fitxer es descarrega directament com a PDF. Diversos fitxers s'agrupen en un arxiu ZIP anomenat `xps-converted.zip`. + +## Opcions + +Aquesta eina fa una conversió de format directa, sense cap configuració addicional. La sortida conserva les dimensions de pàgina, els gràfics vectorials, les tipografies i les imatges originals de l'XPS. + +## Casos d'ús + +- Obrir fitxers XPS rebuts de sistemes Windows antics que feien servir per defecte el controlador d'impressió XPS +- Convertir documents OXPS de Windows 10/11 per compartir-los amb usuaris de macOS o Linux +- Arxivar fitxers XPS antics en un format més àmpliament compatible +- Fer accessibles a destinataris externs documents governamentals o corporatius basats en XPS + +## Consells + +- Les extensions `.xps` i `.oxps` es gestionen automàticament: les pots barrejar en un mateix lot. +- Si el fitxer XPS original es va crear amb un controlador d'impressió d'alta resolució, el PDF resultant conserva aquesta qualitat. No es fa cap remostreig. + +## Eines relacionades + +- [Word a PDF](./word-to-pdf) +- [XML a PDF](./xml-to-pdf) diff --git a/docs/da/contributing.md b/docs/da/contributing.md new file mode 100644 index 00000000..9887c6ad --- /dev/null +++ b/docs/da/contributing.md @@ -0,0 +1,136 @@ +# Contributing + +Tak for din interesse i at bidrage til BentoPDF! Denne vejledning hjælper dig i gang. + +## Kom i gang + +### Forudsætninger + +- Node.js 18+ +- npm 9+ +- Git + +### Opsætning + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Projektstruktur + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Tilføj et nyt værktøj + +### Trin 1: Opret logikfilen + +Opret `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Trin 2: Opret HTML-siden + +Opret `src/pages/your-tool.html` efter de eksisterende værktøjsskabeloner. + +### Trin 3: Registrer værktøjet + +Tilføj til `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Trin 4: Tilføj til build-konfigurationen + +Tilføj siden til `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Trin 5: Tilføj oversættelser + +Tilføj poster til alle sprogfiler i `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Kodestil + +- Brug TypeScript til al ny kode +- Følg eksisterende mønstre for at holde det ensartet +- Kør `npm run format` før du committer +- Ingen kommentarer i produktionskode (kommentarer fjernes under build) + +## Pull request-processen + +1. Opret en feature-branch: `git checkout -b feature/your-feature` +2. Foretag dine ændringer +3. Test grundigt: `npm run build` +4. Send en PR med en tydelig beskrivelse + +## Oversættelse + +Se [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) for at tilføje nye sprog. + +## Contributor License Agreement + +Før din PR kan flettes, skal du underskrive vores CLA: + +- [Individuel CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Virksomheds-CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Få hjælp + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord-fællesskab](https://discord.gg/Bgq3Ay3f2w) + +## Licens + +BentoPDF er dobbeltlicenseret: + +- **AGPL-3.0** til open source-projekter, hvor du deler hele din kildekode offentligt +- **Kommerciel licens** til proprietære applikationer med lukket kildekode: [Få en livstidslicens for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Når du bidrager, accepterer du, at dine bidrag licenseres på disse vilkår. diff --git a/docs/da/getting-started.md b/docs/da/getting-started.md new file mode 100644 index 00000000..d5f8f7f3 --- /dev/null +++ b/docs/da/getting-started.md @@ -0,0 +1,80 @@ +# Kom i gang + +Velkommen til BentoPDF! Denne vejledning hjælper dig hurtigt i gang. + +## Hvad er BentoPDF? + +BentoPDF er en gratis, open source PDF-værktøjskasse med privatliv i fokus, der kører **helt i din browser**. Dine filer forlader aldrig din enhed. Al behandling sker lokalt ved hjælp af WebAssembly (WASM). + +## Hurtig start + +### Mulighed 1: Brug den hostede version + +Besøg [bentopdf.com](https://www.bentopdf.com) for at bruge BentoPDF med det samme, uden installation. + +### Mulighed 2: Selvhost med Docker + +> [!IMPORTANT] +> Konvertering af Office-filer kræver `SharedArrayBuffer`, som kræver både: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - en sikker kontekst +> +> `http://localhost` virker til lokal test, fordi browsere behandler loopback som troværdig. `http://192.168.x.x` eller andre LAN-IP'er gør det normalt ikke, så Word/Excel/PowerPoint-konverteringer kræver HTTPS, når der tilgås fra andre enheder på dit netværk. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF leveres i to builds: **Self-Hosted-builden** (`bentopdf-simple`, brugt ovenfor) til interne installationer i teams og organisationer, og **Commercial-builden** (`bentopdf:latest`), som bruges af bentopdf.com selv og af indehavere af kommercielle licenser med offentligt tilgængelige installationer. Begge indeholder de samme PDF-værktøjer. Commercial-builden tilføjer bentopdf.com's hero, FAQ, udtalelser og footer. Er du i tvivl, så brug Self-Hosted-builden. + +Åbn derefter `http://localhost:3000` i din browser. + +> [!NOTE] +> Hvis du forbereder en air-gapped OCR-installation, skal du hoste OCR-tekstlagets skrifttyper internt ud over Tesseract-workeren, kerne-runtime og traineddata-filerne. Den fulde opsætning er beskrevet i [Selvhosting](/da/self-hosting/), herunder `VITE_OCR_FONT_BASE_URL` og den medfølgende mappe `ocr-fonts/`. + +### Mulighed 3: Byg fra kildekode + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funktioner i overblik + +| Kategori | Værktøjer | +| ---------------------- | ---------------------------------------------------------------- | +| **Konverter til PDF** | Word, Excel, PowerPoint, billeder, Markdown, EPUB, MOBI og mere | +| **Konverter fra PDF** | JPG, PNG, tekst, Excel, SVG og mere | +| **Rediger og annotér** | Underskriv, fremhæv, sortlæg, udfyld formularer, tilføj stempler | +| **Organiser** | Flet, opdel, roter, slet sider, omarranger | +| **Optimer** | Komprimer, reparer, fladgør, OCR | +| **Sikkerhed** | Kryptér, dekryptér, fjern begrænsninger | + +## Browserunderstøttelse + +BentoPDF fungerer bedst i moderne browsere: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Næste skridt + +- [Udforsk alle værktøjer](/da/tools/) +- [Selvhost BentoPDF](/da/self-hosting/) +- [Bidrag til projektet](/da/contributing) diff --git a/docs/da/index.md b/docs/da/index.md new file mode 100644 index 00000000..116e5e0c --- /dev/null +++ b/docs/da/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Gratis PDF-værktøjer med åben kildekode' + tagline: Behandl PDF'er helt i din browser. Ingen uploads. Ingen servere. Fuldt privatliv. + actions: + - theme: brand + text: Kom i gang + link: /da/getting-started + - theme: alt + text: Se værktøjer + link: /da/tools/ + - theme: alt + text: Selvhost + link: /da/self-hosting/ + - theme: alt + text: Kommerciel licens + link: /da/licensing + +features: + - icon: 🔒 + title: 100% privat + details: Dine filer forlader aldrig din enhed. Al behandling sker lokalt i din browser ved hjælp af WebAssembly. + - icon: ⚡ + title: Hurtig og gratis + details: Ingen tilmeldinger, ingen grænser, ingen vandmærker. Behandl ubegrænset mange PDF'er gratis, for altid. + - icon: 🛠️ + title: 50+ værktøjer + details: Konverter, rediger, flet, opdel, komprimer, underskriv, OCR og mere. Alt hvad du har brug for samlet ét sted. + + - icon: 🌐 + title: Kan selvhostes + details: Installer på din egen infrastruktur. Docker, Vercel, Netlify, AWS eller helt air-gapped miljøer med selvhostede OCR-workers, sprogdata og tekstlagsskrifttyper. +--- + +## OCR offline + +Hvis du selvhoster BentoPDF i et air-gapped eller offline miljø, kræver OCR mere end Tesseract-workeren og traineddata-filerne. Søgbar PDF-output kræver også, at OCR-tekstlagets skrifttyper serveres internt. +Se [Selvhosting](/da/self-hosting/) for den fulde opsætning, herunder `VITE_OCR_FONT_BASE_URL`, den medfølgende mappe `ocr-fonts/` og den opdaterede air-gap-arbejdsgang. diff --git a/docs/da/licensing.md b/docs/da/licensing.md new file mode 100644 index 00000000..e37155c1 --- /dev/null +++ b/docs/da/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/da/self-hosting/#wasm-konfiguration-agpl-komponenter) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/da/self-hosting/apache.md b/docs/da/self-hosting/apache.md new file mode 100644 index 00000000..ffd47fb9 --- /dev/null +++ b/docs/da/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Installer med Apache + +Host BentoPDF med Apache HTTP Server. + +## Forudsætninger + +- Apache 2.4+ +- mod_rewrite aktiveret +- SSL-certifikat (anbefales) + +## Trin 1: Byg projektet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Hvis du vil tilpasse branding, skal du sætte miljøvariabler før build: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Trin 2: Kopiér filer + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Trin 3: Apache-konfiguration + +Opret `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Trin 4: .htaccess til routing + +Opret `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Trin 5: Aktivér de nødvendige moduler + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Trin 6: Aktivér sitet + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Installation i en undermappe + +For at hoste på `/pdf/`: + +1. Byg med base-URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Opdater `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Fejlfinding + +### WASM 404-fejl + +Sørg for, at MIME-typen er konfigureret: + +```apache +AddType application/wasm .wasm +``` + +### Underskriv PDF eller Formularudfylder viser en tom viewer (`.mjs` MIME-fejl) + +Hvis browserkonsollen viser: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…og den mislykkede forespørgsel ender på `.mjs`, mangler din Apache-konfiguration tilknytningen `.mjs → application/javascript`. Den medfølgende PDF-viewer leveres med ES-modulfiler med filtypen `.mjs`, og Apaches standard-`mime.types` indeholder dem ikke som standard. + +Tilføj til din VirtualHost eller `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Genindlæs derefter Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Sådan bekræfter du: find den mislykkede `.mjs`-forespørgsel under fanen Network i browserens DevTools, og tjek svarheaderen `Content-Type`. Den skal nu være `application/javascript`, ikke `application/octet-stream`. + +### Rewrite virker ikke + +Tjek, at mod_rewrite er aktiveret: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel til PDF virker ikke + +LibreOffice WASM kræver `SharedArrayBuffer`, som kræver disse headers: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Det kræver også en sikker kontekst. `http://localhost` virker til lokal test, men `http://192.168.x.x` eller andre LAN-IP'er kræver normalt HTTPS. Hvis headerne er til stede, men `window.crossOriginIsolated` stadig er `false`, så tjek, om siden åbnes over almindelig HTTP på en origin, der ikke er loopback. + +De forkomprimerede `.wasm.gz`- og `.data.gz`-filer kræver også korrekt `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Sørg for, at `mod_headers` er aktiveret: `sudo a2enmod headers` + +### Tilladelse nægtet + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/da/self-hosting/aws.md b/docs/da/self-hosting/aws.md new file mode 100644 index 00000000..e7a6a38d --- /dev/null +++ b/docs/da/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Installer på AWS S3 + CloudFront + +Host BentoPDF på AWS for maksimal kontrol og skalerbarhed. + +## Arkitektur + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Trin 1: Opret S3-bucket + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Trin 2: Byg og upload + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Trin 3: Opret CloudFront-distribution + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Eller brug AWS Console: + +1. Gå til CloudFront → Create distribution +2. Origin domain: Vælg din S3-bucket +3. Aktivér "Origin Access Control" +4. Default root object: `index.html` +5. Opret distributionen + +## Trin 3b: Response Headers Policy (påkrævet til LibreOffice WASM) + +LibreOffice-baserede konverteringer (Word, Excel, PowerPoint til PDF) kræver `SharedArrayBuffer`, som kræver bestemte svarheadere. Opret en CloudFront Response Headers Policy: + +1. Gå til CloudFront → Policies → Response headers +2. Opret en brugerdefineret policy med disse headere: + +| Header | Værdi | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Tilknyt policyen til din distributions standard-cache behavior + +Eller via CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Trin 3c: S3-metadata til forkomprimerede WASM-filer + +LibreOffice WASM-filerne er forkomprimerede (`.wasm.gz`, `.data.gz`). Sæt den korrekte Content-Type og Content-Encoding, så browsere dekomprimerer dem: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Vigtigt +Uden response headers policy er `SharedArrayBuffer` ikke tilgængelig, og LibreOffice WASM-konverteringer hænger ved ca. 55 %. Uden den korrekte Content-Encoding på `.gz`-filerne modtager browseren rå gzip-bytes, og WASM-kompilering mislykkes. +::: + +## Trin 4: S3 bucket policy + +Giv CloudFront adgang til bucketten: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Trin 5: Brugerdefinerede fejlsider + +Konfigurer 404 til at returnere `index.html` til SPA-routing: + +1. CloudFront → Error pages +2. Opret et brugerdefineret fejlsvar: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Omkostningsestimat + +| Ressource | Estimeret pris | +| -------------------------- | -------------- | +| S3 Storage (~500MB) | ~$0.01/måned | +| CloudFront (1TB transfer) | ~$85/måned | +| CloudFront (10GB transfer) | ~$0.85/måned | + +::: tip +Brug S3 Intelligent Tiering til at spare penge på filer, der sjældent tilgås. +::: + +## Automatisering med Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/da/self-hosting/cloudflare.md b/docs/da/self-hosting/cloudflare.md new file mode 100644 index 00000000..a1788b44 --- /dev/null +++ b/docs/da/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Installer på Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) tilbyder hurtig, global hosting af statiske sites med ubegrænset båndbredde. + +## Hurtig installation + +1. Gå til [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Klik på "Create a project" +3. Forbind dit GitHub-repository + +## Build-konfiguration + +| Indstilling | Værdi | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Miljøvariabler + +Tilføj disse under Settings → Environment variables: + +| Variabel | Værdi | +| ----------------------- | ---------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (valgfrit) | +| `VITE_BRAND_NAME` | Brugerdefineret brandnavn (valgfrit) | +| `VITE_BRAND_LOGO` | Logosti relativt til `public/` (valgfrit) | +| `VITE_FOOTER_TEXT` | Brugerdefineret footer-/copyrighttekst (valgfrit) | +| `VITE_DEFAULT_LANGUAGE` | Standardsprog i brugerfladen, f.eks. `fr` (valgfrit) | + +## Konfigurationsfil + +Opret `_headers` i din `public`-mappe: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Vigtigt +Headerne `Cross-Origin-Embedder-Policy` og `Cross-Origin-Opener-Policy` er påkrævet til konvertering af Word/ODT/Excel/PowerPoint til PDF. Uden dem er `SharedArrayBuffer` ikke tilgængelig, og LibreOffice WASM-motoren kan ikke starte. +::: + +Opret `_redirects` til SPA-routing: + +``` +/* /index.html 200 +``` + +## Eget domæne + +1. Gå til dit Pages-projekt +2. Klik på "Custom domains" +3. Tilføj dit domæne +4. Cloudflare konfigurerer automatisk DNS, hvis domænet ligger hos Cloudflare + +## Fordele + +- **Gratis, ubegrænset båndbredde** +- **Globalt CDN** med 300+ edge-lokationer +- **Automatisk HTTPS** +- **Preview-installationer** til pull requests +- **Hurtige builds** + +## Fejlfinding + +### Upload af store filer + +Cloudflare Pages understøtter filer op til 25 MB. WASM-moduler bør være fine, men hvis du rammer grænser, kan du overveje: + +```bash +# Split large files during build +npm run build +``` + +### Størrelsesgrænser for Workers + +Hvis du bruger Cloudflare Workers til avanceret routing, skal du være opmærksom på grænsen på 1 MB for gratis planer. + +## CORS-proxy-worker (til digitale signaturer) + +Værktøjet til digital signatur kræver en CORS-proxy for at hente certifikatkæder. Installer den medfølgende worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Sikkerhedsfunktioner + +| Funktion | Beskrivelse | +| ------------------------------ | ----------------------------------- | +| **URL-begrænsninger** | Kun certifikat-URL'er tilladt | +| **Filstørrelsesgrænse** | Maks. 10MB pr. forespørgsel | +| **Rate limiting** | 60 forespørgsler/IP/min (kræver KV) | +| **Blokering af private IP'er** | Blokerer localhost og interne IP'er | + +### Aktivér rate limiting + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Byg med proxy-URL + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Eller med Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Bemærk:** Se [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) for opsætning af HMAC-signatur. diff --git a/docs/da/self-hosting/cors-proxy.md b/docs/da/self-hosting/cors-proxy.md new file mode 100644 index 00000000..433119de --- /dev/null +++ b/docs/da/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-proxy til hentning af certifikater + +Værktøjet til digital signatur bruger en CORS-proxy til at hente udstedercertifikater fra eksterne certifikatudstedere (CA'er). Det er nødvendigt, fordi mange CA-servere ikke inkluderer CORS-headere i deres svar, hvilket forhindrer direkte hentning fra browseren. + +Derudover udleverer mange CA-servere certifikater over almindelig HTTP. Når din BentoPDF-instans hostes over HTTPS, blokerer browsere disse HTTP-forespørgsler (mixed content-politik). CORS-proxyen løser begge problemer ved at route forespørgsler gennem et HTTPS-endpoint med de rette headere. + +## Sådan fungerer det + +Når du signerer en PDF med et certifikat: + +1. Biblioteket `zgapdfsigner` forsøger at bygge en komplet certifikatkæde +2. Det henter udstedercertifikater fra URL'er indlejret i dit certifikats AIA-udvidelse (Authority Information Access) +3. Disse forespørgsler routes gennem en CORS-proxy, der tilføjer de nødvendige `Access-Control-Allow-Origin`-headere +4. Proxyen returnerer certifikatdata til browseren + +## Selvhosting af CORS-proxyen + +Hvis du selvhoster BentoPDF, skal du installere din egen CORS-proxy, for at digitale signaturer virker med certifikater, der kræver hentning af kæden. + +### Mulighed 1: Cloudflare Workers (anbefales) + +1. **Installer Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Log ind på Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Klon BentoPDF og opdater tilladte origins**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Åbn `cors-proxy-worker.js` og ret arrayet `ALLOWED_ORIGINS` til dit domæne: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Vigtigt + Uden denne ændring afviser proxyen alle forespørgsler fra dit site med fejlen **403 Forbidden**. Standarden tillader kun forespørgsler fra `bentopdf.com`. + ::: + +4. **Installer proxyen**: + + ```bash + wrangler deploy + ``` + + Notér din worker-URL (f.eks. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Genbyg BentoPDF med proxy-URL'en**: + + Hvis du bruger Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Hvis du bygger fra kildekode: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Mulighed 2: Egen backend-proxy + +Du kan også oprette dit eget proxy-endpoint. Kravene er: + +1. Acceptér GET-forespørgsler med en `url`-forespørgselsparameter +2. Hent URL'en fra din server (ingen CORS-begrænsninger på serversiden) +3. Returnér svaret med disse headere: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Eksempel på en implementering i Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Sikkerhedsovervejelser + +Den medfølgende Cloudflare Worker har flere sikkerhedsforanstaltninger: + +| Funktion | Beskrivelse | +| ------------------------------ | ------------------------------------------------------------------------------------------------ | +| **Origin-validering** | Tillader kun forespørgsler fra domæner på listen `ALLOWED_ORIGINS` | +| **URL-begrænsninger** | Tillader kun certifikat-URL'er (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blokering af private IP'er** | Blokerer private IPv4/IPv6-områder, link-local, loopback, decimale IP'er og cloud-metadata | +| **Content-Type-sikkerhed** | Returnerer kun sikre MIME-typer for certifikater og blokerer content-type-injektion fra upstream | +| **Filstørrelsesgrænse** | Streamer svaret med en grænse på 10MB og afbryder midt i overførslen, hvis den overskrides | +| **Rate limiting** | 60 forespørgsler pr. minut pr. IP eller IPv6 /64 (kræver KV, fejler åbent ved KV-fejl) | +| **HMAC-signaturer** | Valgfri signering på klientsiden (afskrækker tilfældigt misbrug) | + +### DNS rebinding (selvhosting uden for Cloudflare) + +Workeren afviser enhver URL, der resolver til en privat eller intern IP. Den kan ikke bruge en fast tilladelsesliste over værter, fordi URL'er i certifikatkæder peger på den CA, der har udstedt certifikatet (FNMT, virksomheders CA'er og så videre), så destinationerne kendes ikke på forhånd. Det efterlader et lille rebinding-vindue: en person, der driver DNS for sit eget domæne, kan give sikkerhedstjekket en offentlig IP og den egentlige forespørgsel en privat lidt senere. + +På Cloudflare kan det ikke udnyttes: Workers kan ikke nå private IP'er eller metadata-endpointet `169.254.169.254`, så en rebind rammer ingenting. Giv bare ikke workeren en vej ind: tilknyt ikke en Tunnel, Service eller binding til et privat netværk (den behøver kun `RATE_LIMIT_KV`). + +Hvis du kører den uden for Cloudflare (workerd, Node og lignende) i en VPC, _kan_ runtime'en nå interne IP'er. Sæt en egress-firewall foran, og bloker de private områder: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` og deres IPv6-ækvivalenter. Det kan applikationskode ikke håndhæve, når du er uden for Cloudflare. + +## Deaktivering af proxyen + +Hvis du ikke vil bruge en CORS-proxy, så sæt miljøvariablen til en tom streng: + +``` +VITE_CORS_PROXY_URL= +``` + +**Bemærk**: Uden proxyen mislykkes signering med certifikater, der kræver ekstern hentning af kæden (som FNMT eller nogle virksomheders CA'er), med fejlen "Failed to fetch". + +## Fejlfinding + +### "Signing error: TypeError: Failed to fetch" + +Det betyder normalt enten: + +1. **Ingen CORS-proxy konfigureret**: Sæt `VITE_CORS_PROXY_URL` og genbyg +2. **Mixed content blokeret**: Dit site bruger HTTPS, men certifikatets udsteder-URL er HTTP. CORS-proxyen løser dette. +3. **CORS-proxyen afviser din origin**: Tjek, at dit domæne står i arrayet `ALLOWED_ORIGINS` i `cors-proxy-worker.js` + +### "403 Forbidden" fra proxyen + +Dit domæne står ikke på listen `ALLOWED_ORIGINS`. Rediger `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Installer derefter igen: `npx wrangler deploy` + +### Test af proxyen + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certifikater, der virker uden proxy + +Nogle certifikater indeholder hele kæden i P12/PFX-filen og kræver ikke ekstern hentning: + +- Selvsignerede certifikater +- Nogle kommercielle CA'er, der medsender mellemliggende certifikater +- Certifikater, du selv har samlet med hele kæden diff --git a/docs/da/self-hosting/docker.md b/docs/da/self-hosting/docker.md new file mode 100644 index 00000000..e78b82e1 --- /dev/null +++ b/docs/da/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Installer med Docker / Podman + +Den nemmeste måde at selvhoste BentoPDF i et produktionsmiljø. + +> [!IMPORTANT] +> **Påkrævede headere til konvertering af Office-filer** +> +> LibreOffice-baserede værktøjer (konvertering af Word, Excel og PowerPoint) kræver disse HTTP-headere for at understøtte `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Siden skal også serveres fra en sikker kontekst. `http://localhost` virker til lokal test, men `http://192.168.x.x` eller andre LAN-IP'er opfylder normalt ikke kravet, så Office-konvertering over almindelig HTTP mislykkes, selv om headerne er til stede. +> +> De officielle containerbilleder indeholder disse headere. Hvis du bruger en reverse proxy (Traefik, Caddy osv.), så sørg for, at headerne bevares eller tilføjes, og brug HTTPS ved adgang uden for loopback. + +> [!TIP] +> **Podman-brugere:** Alle `docker`-kommandoer virker med Podman, hvis du erstatter `docker` med `podman` og `docker-compose` med `podman-compose`. + +## Hurtig start + +> [!TIP] +> BentoPDF leveres i to builds: +> +> - **Self-Hosted-build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Alle PDF-værktøjer, **uden** markedsføringsindhold (ingen hero, FAQ, udtalelser, footer). Brug den til interne installationer i teams og organisationer. Det er **ikke** en "lite"-version med færre funktioner. +> - **Commercial-build**: `ghcr.io/alam00000/bentopdf:latest`. Det fulde markedsføringssite, som bruges af bentopdf.com selv og af indehavere af kommercielle licenser med offentligt tilgængelige installationer. +> +> Er du i tvivl: hent Self-Hosted-builden. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Opret `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Kør: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Byg dit eget image + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Byg og kør: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Miljøvariabler + +| Variabel | Beskrivelse | Standard | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Byg Self-Hosted-varianten (skjuler bentopdf.com's markedsføringsindhold: hero, FAQ, udtalelser, footer). Alle PDF-værktøjer bevares. | `false` | +| `BASE_URL` | Installer i en undermappe | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL til PyMuPDF WASM-modul | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL til Ghostscript WASM-modul | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL til CoherentPDF WASM-modul | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL til OCR-workerscript | _(tom; brug Tesseract.js' standard-CDN)_ | +| `VITE_TESSERACT_CORE_URL` | Mappe til OCR-kerne-runtime | _(tom; brug Tesseract.js' standard-CDN)_ | +| `VITE_TESSERACT_LANG_URL` | Mappe til OCR-traineddata | _(tom; brug Tesseract.js' standard-CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Kommaseparerede OCR-sprog, der vises i brugerfladen | _(tom; vis hele kataloget)_ | +| `VITE_OCR_FONT_BASE_URL` | Mappe til OCR-tekstlagets skrifttyper | _(tom; brug eksterne Noto-skrift-URL'er)_ | +| `VITE_DEFAULT_LANGUAGE` | Standard UI language | `en` | +| `VITE_BRAND_NAME` | Brugerdefineret brandnavn | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logosti relativt til `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Brugerdefineret footer-/copyrighttekst | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Kommaseparerede værktøjs-ID'er, der skal skjules | _(tom; alle værktøjer aktiveret)_ | +| `DISABLE_GITHUB_STARS` | Spring hentningen af GitHub-stjerneantal over ved sideindlæsning, og fjern `api.github.com` fra CSP. Simple Mode-builds springer den altid over. | `false` | +| `SITE_URL` | Offentlig URL, der skrives i canonical-, hreflang- og sitemap-links. Lad den stå på standardværdien, medmindre du vil have søgemaskiner til at behandle din installation som et eget site. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Med en brugerdefineret `SITE_URL` markeres hver side `noindex`, så din kopi ikke konkurrerer med bentopdf.com i søgeresultaterne. Sæt til `true` for at lade søgemaskiner indeksere den. | `false` | + +WASM-modul-URL'erne er forudkonfigureret med CDN-standarder, så alle avancerede funktioner virker fra start. Overskriv dem til air-gapped eller selvhostede installationer. + +### Søgemaskiner + +Som standard peger hver side søgemaskiner hen på bentopdf.com som originalen, så din installation ikke vises som dublet. Du behøver ikke ændre noget for en privat eller intern instans. + +- **Hold din instans helt ude af søgeresultaterne:** kør containeren med `-e ROBOTS_NOINDEX=true`. Det kræver kun en genstart, ikke en ny build. +- **Gør din instans til sit eget site i søgeresultaterne:** byg med `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Uden `ALLOW_INDEXING=true` markerer en brugerdefineret `SITE_URL` hver side `noindex`. + +### Content-Security-Policy + +Nginx-imaget leveres med en håndhævende `Content-Security-Policy`-header. CSP'ens direktiver `script-src`, `connect-src` og `font-src` **genereres ved build** ud fra `VITE_*`-URL-variablerne ovenfor, og alle værter, du angiver via `--build-arg`, føjes automatisk til politikken. + +Det betyder: + +- Hvis du overskriver `VITE_CORS_PROXY_URL` eller `VITE_WASM_*_URL` ved build, tillader CSP automatisk disse origins, så der kræves ingen ekstra konfiguration. +- For URL'er på `cdn.jsdelivr.net` tillader `script-src` kun den præcise versionerede pakkemappe, for eksempel `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, ikke hele CDN'et. jsDelivr leverer enhver offentlig npm-pakke eller GitHub-repository, så hvis hele værten blev tilladt, kunne hvilken som helst af dem køre på din instans. URL'er på alle andre værter tillades pr. origin. +- Hvis du konfigurerer brugerdefinerede WASM-URL'er _ved kørsel_ via siden Avancerede indstillinger i appen, står disse origins **ikke** i CSP, og browseren blokerer hentning fra dem. Det gælder også en anden version af samme pakke på `cdn.jsdelivr.net`, fordi kun den version, der blev sat ved build, er tilladt. Konfiguration ved kørsel er beregnet til eksperimenter. Til permanente brugerdefinerede URL'er skal du sætte det tilsvarende `VITE_*`-build-arg. +- Air-gapped installationer, der overskriver alle tre `VITE_WASM_*_URL`-værdier, får også disse `cdn.jsdelivr.net`-pakkemapper fjernet fra CSP (hver standardværdi erstattes, ikke tilføjes). Tesseract OCR-standarderne på `cdn.jsdelivr.net` forbliver i politikken, indtil du også sætter de tre `VITE_TESSERACT_*`-værdier. Tilsvarende erstatter `VITE_CORS_PROXY_URL` den offentlige standard `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP indeholder `'unsafe-eval'` i `script-src`, fordi LibreOffice WASM-runtime (brugt af værktøjerne til konvertering af Word/Excel/PowerPoint) og billedbiblioteket wasm-vips (brugt til PDF til TIFF) kompilerer intern dispatch-kode via `new Function()`. Hvis den fjernes, holder de værktøjer op med at virke. Hvis du bygger i `SIMPLE_MODE` (uden LibreOffice) og ikke har brug for PDF til TIFF, kan du manuelt redigere den genererede `security-headers.conf` og fjerne `'unsafe-eval'` for en strengere politik. + +For OCR skal du lade `VITE_TESSERACT_*`-variablerne stå tomme for at bruge standardressourcerne online, eller sætte alle tre sammen til selvhostet/offline OCR. Delvise OCR-overskrivninger afvises, fordi worker, kerne-runtime og traineddata-mappe skal passe sammen. For fuldt offline søgbar PDF-output skal du også sætte `VITE_OCR_FONT_BASE_URL`, så OCR-tekstlagets skrifttyper indlæses fra din interne server i stedet for de offentlige Noto-skrift-URL'er. + +`VITE_DEFAULT_LANGUAGE` angiver brugerfladens sprog for førstegangsbesøgende. Understøttede værdier: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Brugere kan stadig skifte sprog, det ændrer kun standarden. + +Eksempel: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Brugerdefineret branding + +Erstat BentoPDF's standardlogo, navn og footertekst med dine egne. Læg din logofil i mappen `public/` (eller brug et eksisterende billede), og angiv derefter branding-variablerne ved build: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Branding virker i både fuld tilstand og Simple Mode og kan kombineres med alle andre build-indstillinger. + +### Deaktivering af bestemte værktøjer + +Skjul værktøjer i brugerfladen af hensyn til compliance eller sikkerhed. Deaktiverede værktøjer fjernes fra forsiden, søgeresultater, tastaturgenveje og workflow-builderen. Direkte adgang via URL viser en side om, at værktøjet ikke er tilgængeligt. + +Værktøjs-ID'er er sidens URL uden `.html`. Hvis værktøjet for eksempel ligger på `bentopdf.com/edit-pdf.html`, er ID'et `edit-pdf`. + +#### Find værktøjs-ID'er + +Den nemmeste måde: åbn et værktøj i BentoPDF og se på URL'en. Den sidste del af stien (uden `.html`) er værktøjs-ID'et. + +
+Komplet liste over værktøjs-ID'er + +**Rediger og annotér:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Konverter til PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Konverter fra PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organiser og administrer:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimer og reparer:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Sikkerhed:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Mulighed 1: Ved build (Docker build-arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Det bager listen over deaktiverede værktøjer ind i JavaScript-bundlen. Kræver en ny build at ændre. + +#### Mulighed 2: Ved kørsel (config.json) + +Mount en `config.json`-fil i den serverede mappe, uden behov for ny build: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Eller med Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Begge metoder kan kombineres, og listerne flettes. Hvis et værktøj står i en af dem, er det deaktiveret. + +#### Deaktivering af editorfunktioner + +Du kan også deaktivere bestemte funktioner i PDF-editoren (f.eks. sortlægning, annotationer, formularer) uden at deaktivere hele editorværktøjet. Tilføj `editorDisabledCategories` til din `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Komplet liste over editorkategorier + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Annotation:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Former:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formular:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Sortlægning:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Dokument:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Side:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Værktøjer:** `tools`, `pan`, `pointer`, `capture` + +**Markering:** `selection`, `selection-copy` + +**Historik:** `history`, `history-undo`, `history-redo` + +
+ +Kategorierne er hierarkiske: Deaktiverer du en overordnet kategori (f.eks. `annotation`), deaktiveres alle dens underkategorier. + +### Deaktivering af GitHub-stjernetælleren + +Navigationslinjen viser et live antal GitHub-stjerner, som hentes fra `api.github.com` ved sideindlæsning. Det er den eneste eksterne forespørgsel, der ikke tjener en PDF-funktion. Deaktivér den ved build for at fjerne hentekoden fra bundlen og fjerne `api.github.com` fra Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Mode-builds (`bentopdf-simple`) springer altid stjernetælleren over. Flaget er kun nødvendigt på Commercial-builden eller egne fulde builds. + +### Brugerdefinerede WASM-URL'er (air-gapped / selvhostet) + +> [!IMPORTANT] +> WASM-URL'er bages ind i JavaScript **ved build**. WASM-filerne downloades af **brugerens browser** ved kørsel, og Docker downloader dem ikke under build. I air-gapped netværk skal du hoste WASM-filerne på en intern server, som browsere kan nå. + +**Fuld air-gapped arbejdsgang:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Brug koderne udskrevet af `bash scripts/prepare-airgap.sh --list-ocr-languages`, eller søg på navn med `bash scripts/prepare-airgap.sh --search-ocr-language `, til `--ocr-languages`. Når du bygger med en begrænset OCR-delmængde, skal du give de samme koder til `VITE_TESSERACT_AVAILABLE_LANGUAGES`, så appen kun viser medfølgende sprog. For fuld offline OCR-output skal du også hoste den medfølgende mappe `ocr-fonts/` og pege `VITE_OCR_FONT_BASE_URL` på den. + +Sæt en variabel til en tom streng for at deaktivere det modul (brugere skal så konfigurere manuelt via Avancerede indstillinger). + +## Brugerdefineret port + +Som standard lytter BentoPDF på port `8080` inde i containeren. For at ændre det skal du sætte miljøvariablen `PORT` ved kørsel: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variable | Beskrivelse | Standard | +| -------- | ------------------------------ | -------- | +| `PORT` | Nginx' lytteport i containeren | `8080` | + +Det virker med både standard- og nonroot-Dockerfilerne. + +## Brugerdefineret bruger-ID (PUID/PGID) + +Til miljøer, der kræver kørsel som en bestemt bruger uden root (NAS-enheder, Kubernetes med sikkerhedskontekster, organisationens politikker), tilbyder BentoPDF en separat Dockerfile med PUID/PGID-understøttelse i LSIO-stil. + +### Byg og kør + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Miljøvariabler + +| Variabel | Beskrivelse | Standard | +| -------------- | --------------------- | -------- | +| `PUID` | Bruger-ID at køre som | `1000` | +| `PGID` | Gruppe-ID at køre som | `1000` | +| `PORT` | Nginx' lytteport | `8080` | +| `DISABLE_IPV6` | Deaktivér IPv6-lytter | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Sådan fungerer det + +Containeren starter som root, opretter en bruger med den angivne PUID/PGID, justerer ejerskab på alle skrivbare mapper og dropper derefter rettigheder med `su-exec`. Nginx-processen kører udelukkende som den bruger, du har angivet. + +> [!NOTE] +> Standard-`Dockerfile` bruger `nginx-unprivileged` (UID 101) og anbefales til de fleste installationer. Brug kun `Dockerfile.nonroot`, når du har brug for et bestemt UID/GID. + +> [!WARNING] +> PUID/PGID kan ikke være `0` (root). Entrypointet validerer input og afslutter med en fejl ved ugyldige værdier. + +## Med Traefik (reverse proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Med Caddy (reverse proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Ressourcegrænser + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (systemd-integration) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) giver dig mulighed for at køre Podman-containere som systemd-services. Det er ideelt til produktionsinstallationer på Linux-systemer. + +### Grundlæggende Quadlet-opsætning + +Opret en container-unitfil på `~/.config/containers/systemd/bentopdf.container` (bruger) eller `/etc/containers/systemd/bentopdf.container` (system): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Aktivér og start + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Til installation for hele systemet skal du bruge `systemctl` uden flaget `--user` og placere filen i `/etc/containers/systemd/`. + +### Quadlet med health check + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Automatisk opdatering med Quadlet + +Podman kan automatisk opdatere containere, når nye images er tilgængelige: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadlet-netværkskonfiguration + +Til brugerdefineret netværkskonfiguration skal du oprette en netværksfil `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Henvis derefter til den i din containerfil: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Opdatering + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/da/self-hosting/hostinger.md b/docs/da/self-hosting/hostinger.md new file mode 100644 index 00000000..dc7a3397 --- /dev/null +++ b/docs/da/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Installer på Hostinger + +[Hostinger](https://hostinger.com) er en populær udbyder af shared hosting. Denne vejledning beskriver, hvordan du installerer BentoPDF på Hostingers shared hosting. + +## Forudsætninger + +- Hostinger-hostingplan med adgang til filhåndtering +- Node.js installeret lokalt til build + +## Trin 1: Byg projektet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +De byggede filer ligger i mappen `dist`. + +## Trin 2: Upload til Hostinger + +### Installation på rodomænet + +1. Log ind på din Hostinger-konto +2. Gå til **File Manager** → **public_html** +3. **Slet** eventuelle eksisterende filer (tag backup, hvis nødvendigt) +4. **Upload** hele indholdet af din lokale `dist`-mappe til `public_html` + +### Installation i en undermappe + +Hvis du installerer i en undermappe (f.eks. `yourdomain.com/pdf-tools/`): + +1. Byg med den korrekte base-URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Opret mappen i Hostinger: + - Gå til **File Manager** → **public_html** + - Opret en ny mappe: `pdf-tools` +3. Upload hele indholdet af `dist` til `public_html/pdf-tools/` + +## Trin 3: Opret .htaccess-filen + +Opret en `.htaccess`-fil i roden af din installationsmappe (`public_html` eller `public_html/pdf-tools/`): + +::: warning Vigtigt +Ved installation i en undermappe skal du ændre `RewriteBase /` til `RewriteBase /pdf-tools/` (eller navnet på din mappe). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Eksempel på .htaccess i en undermappe + +For `yourdomain.com/pdf-tools/` skal du opdatere disse linjer: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Fejlfinding + +### WASM-filer indlæses ikke + +Sørg for, at MIME-typerne er sat korrekt i `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice-værktøjer virker ikke + +Sikkerhedsheaderne er afgørende for SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Hvis headerne ikke bliver anvendt, så kontakt Hostingers support for at aktivere `mod_headers`. + +### 404-fejl ved genindlæsning af siden + +Sørg for, at reglen for filtypen `.html` og sprogrutene er konfigureret korrekt. BentoPDF bruger statiske HTML-filer, ikke SPA-routing: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Grænser for filupload + +Hostinger kan have grænser for filstørrelse. Upload WASM-filer separat, hvis masseupload mislykkes. diff --git a/docs/da/self-hosting/index.md b/docs/da/self-hosting/index.md new file mode 100644 index 00000000..3746d5ac --- /dev/null +++ b/docs/da/self-hosting/index.md @@ -0,0 +1,538 @@ +# Selvhostingsguide + +BentoPDF kan selvhostes på din egen infrastruktur. Denne guide gennemgår forskellige deployment-muligheder. + +## Hurtig start med Docker / Podman + +Den hurtigste måde at selvhoste BentoPDF på: + +> [!TIP] +> BentoPDF leveres i to builds: +> +> - **Selvhostet build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Alle PDF-værktøjer, **uden** marketingelementerne (ingen hero, FAQ, udtalelser eller sidefod). Brug denne til interne deployments i teams og organisationer. Den er **ikke** en "lite"-version med færre funktioner. +> - **Kommerciel build**: `ghcr.io/alam00000/bentopdf:latest`. Det fulde marketingsite, brugt af bentopdf.com selv og af kommercielle licensindehavere med offentligt tilgængelige deployments. +> +> Er du i tvivl: Hent det selvhostede build. + +> [!IMPORTANT] +> Konvertering af Office-filer kræver `SharedArrayBuffer`, hvilket betyder, at appen både skal være cross-origin-isoleret og serveres fra en sikker kontekst. Det officielle image sender allerede de nødvendige COOP/COEP-headere, men browsere deaktiverer stadig `SharedArrayBuffer` på almindelige HTTP-origins i lokale netværk som `http://192.168.x.x`. +> +> Brug kun `http://localhost` til test på samme enhed. Hvis brugerne tilgår BentoPDF via en LAN-IP eller et værtsnavn, skal du afslutte forbindelsen med HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Eller med Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Kør BentoPDF som en systemd-tjeneste. Opret `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Se [Docker-deploymentguiden](/da/self-hosting/docker) for den fulde Quadlet-dokumentation. + +## Bygning fra kildekode + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Konfigurationsindstillinger + +### Selvhostet build (Simple Mode) + +Det selvhostede build (imaget `bentopdf-simple`, også kaldet Simple Mode) er **funktionelt identisk** med det kommercielle build. Alle PDF-værktøjer er til stede og opfører sig på samme måde. Det skjuler blot de marketingelementer, der kun giver mening på bentopdf.com selv eller i en kommerciel, offentligt tilgængelig deployment. **Det er ikke en version med færre funktioner eller en "lite"-version.** + +**Hvad det selvhostede build skjuler** (kun kosmetisk, ingen PDF-funktioner fjernes): + +- Navigationslinje, hero-sektion, funktionssektion, FAQ, udtalelser, sidefod +- Opdaterer sidens titel til "PDF-værktøjer" + +**Hvad det selvhostede build beholder** (alt det, der faktisk arbejder med PDF): + +- Alle PDF-værktøjer (flet, opdel, rediger, underskriv, OCR, Office-konvertering osv.) +- Understøttelse af eget brand, al konfiguration ved build og under kørsel + +Det kommercielle build (`ghcr.io/alam00000/bentopdf:latest`) driver bentopdf.com selv og bruges af kommercielle licensindehavere med offentligt tilgængelige deployments. Det tilføjer hero, FAQ, udtalelser og sidefod, som ikke ville give mening i et internt værktøj. + +Hvis du selvhoster BentoPDF til dit team, din organisation eller som internt værktøj, skal du hente det selvhostede build: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Se [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) for alle detaljer. + +### Kommerciel build (offentligt tilgængelige deployments med dit eget brand) + +Det kommercielle build (imaget `bentopdf`, uden suffikset `-simple`) driver bentopdf.com selv. Det indeholder det fulde marketingsite (hero, funktioner, FAQ, udtalelser, sidefod) oven på alle PDF-værktøjer. Brug dette build, når du vil **deploye BentoPDF som en offentligt tilgængelig PDF-tjeneste under dit eget brand**, for eksempel: + +- Du kører BentoPDF som hostet SaaS for slutbrugere på dit eget domæne +- Du vil have landingsside-oplevelsen (marketingsektioner + værktøjer), ikke kun selve værktøjsfladen +- Du er kommerciel licensindehaver og indlejrer BentoPDF i et kommercielt produkt + +**Kør det som det er** (BentoPDF-branding, nyttigt til at få vist buildet): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Byg med dit eget brand** (den typiske kommercielle arbejdsgang): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Alle andre build-indstillinger (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, WASM-URL-overstyringer osv.) virker på samme måde som i det selvhostede build. + +::: warning Licensering +Det er tilladt at køre det kommercielle build under begge af BentoPDF's to licensmuligheder: + +- **AGPL-3.0** (gratis): tilladt, hvis din deployment udgiver hele sin kildekode under AGPL, inklusive eventuelle branding-ændringer og omkringliggende forretningslogik. +- **Kommerciel licens** ($79 livstid): påkrævet til lukkede/proprietære deployments, hvor du ikke gør din branding-fork eller forretningskode open source. + +Se [licenssiden](https://www.bentopdf.com/licensing) for den fulde sammenligning. AGPL-licenserede WASM-moduler (PyMuPDF, Ghostscript, CoherentPDF) indlæses fra et CDN under kørsel, så de indgår ikke i dit image og ændrer ikke din licensmæssige stilling. +::: + +### Base-URL + +Deploy til en undermappe: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Eget brand + +Erstat BentoPDF's standardlogo, -navn og sidefodstekst med dine egne ved build: + +| Variabel | Beskrivelse | Standard | +| ------------------ | ----------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Brandnavn vist i sidehoved og sidefod | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logosti relativt til `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Brugerdefineret sidefods-/ophavsretstekst | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Eller via Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Branding virker i både fuld tilstand og Simple Mode og kan kombineres med alle andre build-indstillinger (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Deaktivering af bestemte værktøjer + +Skjul enkelte værktøjer af hensyn til compliance eller sikkerhed. Deaktiverede værktøjer fjernes fra startsiden, søgning, genveje, workflow-builderen og direkte URL-adgang. + +Værktøjs-id'er er sidens URL uden `.html`. Åbn et værktøj, og se på URL'en (f.eks. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Ved build** (indbygget i bundlen): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Under kørsel** (ingen genopbygning nødvendig, montér en `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Begge metoder kan kombineres, og listerne bliver slået sammen. + +Du kan også deaktivere bestemte funktioner i PDF-editoren (f.eks. redigering af indhold) uden at deaktivere hele værktøjet ved at tilføje `editorDisabledCategories` til `config.json`. Se [Docker-guiden](/da/self-hosting/docker#deaktivering-af-editorfunktioner) for den fulde liste over kategorier. + +## Deployment-guider + +Vælg din platform: + +- [Vercel](/da/self-hosting/vercel) +- [Netlify](/da/self-hosting/netlify) +- [Cloudflare Pages](/da/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/da/self-hosting/aws) +- [Hostinger](/da/self-hosting/hostinger) +- [Nginx](/da/self-hosting/nginx) +- [Apache](/da/self-hosting/apache) +- [Docker](/da/self-hosting/docker) +- [Kubernetes](/da/self-hosting/kubernetes) +- [CORS-proxy](/da/self-hosting/cors-proxy) - Påkrævet til digitale signaturer + +## Almindelige problemer + +### Word / ODT / Excel / PowerPoint til PDF hænger (SharedArrayBuffer utilgængelig) + +**Symptom**: LibreOffice-baserede dokumentkonverteringer (Word, ODT, Excel, PowerPoint til PDF) hænger ved ca. 55 % eller starter ikke. Browserens konsol kan vise: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…eller `window.crossOriginIsolated` rapporterer `false`, eller WASM-kompileringen rapporterer `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Årsag**: LibreOffice WASM kræver `SharedArrayBuffer`, som browseren kun aktiverer, når siden er **cross-origin-isoleret** OG serveres fra en **sikker kontekst**. Det betyder, at to ting skal være opfyldt: + +1. Hvert svar indeholder begge headere: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Siden serveres fra `https://...` eller `http://localhost`. Almindelig HTTP på en LAN-IP (f.eks. `http://192.168.x.x`) tæller IKKE som sikker, og browsere deaktiverer `SharedArrayBuffer` dér. + +Uoverensstemmelsen `00 61 73 6d / 1f 8b 08 08` er et separat undersymptom: De forkomprimerede `.wasm.gz`- / `.data.gz`-filer mangler svarheaderen `Content-Encoding: gzip`, så browseren modtager rå gzip-bytes i stedet for dekomprimeret WASM. + +**Løsning**: Se din platformspecifikke deployment-guide for den præcise konfiguration: + +- [Nginx →](/da/self-hosting/nginx#underskriv-pdf-eller-formularudfylder-viser-en-tom-læser-mjs-mime-fejl) +- [Apache →](/da/self-hosting/apache#underskriv-pdf-eller-formularudfylder-viser-en-tom-viewer-mjs-mime-fejl) +- [AWS S3 + CloudFront →](/da/self-hosting/aws#trin-3b-response-headers-policy-pakrævet-til-libreoffice-wasm) +- [Cloudflare Pages →](/da/self-hosting/cloudflare#konfigurationsfil) (`_headers`-fil) +- [Netlify →](/da/self-hosting/netlify#word-odt-excel-til-pdf-hænger-ved-55) (`netlify.toml`) +- [Vercel →](/da/self-hosting/vercel#word-odt-excel-til-pdf-virker-ikke) (`vercel.json`) +- [Hostinger →](/da/self-hosting/hostinger#libreoffice-værktøjer-virker-ikke) (`.htaccess`) +- [Kubernetes →](/da/self-hosting/kubernetes#mjs-mime-typefejl-underskriv-pdf-formularudfylder-tom-iframe) +- **Docker**: håndteres automatisk af den medfølgende nginx-konfiguration, ingen handling nødvendig. + +**Kontrollér**: Åbn DevTools Console på en vilkårlig BentoPDF-side, og kør: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Hvis siden er HTTPS eller `http://localhost` OG begge COEP/COOP-headere findes på hvert svar, består begge kontroller. Hvis du er på `http://192.168.x.x` eller en anden HTTP-origin, der ikke er loopback, skal du afslutte den med HTTPS. Der findes ingen løsning, der kun bruger headere. + +### `.mjs`-filer serveres som `application/octet-stream` + +**Symptom**: Underskriv PDF / Formularudfylder / visse andre værktøjer viser en tom læser eller kan ikke indlæses. Browserens konsol rapporterer: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Årsag**: Din webserver eller reverse proxy har ingen MIME-type-tilknytning til `.mjs`-filer (den indbyggede PDF-læser leverer ES-moduler med den filendelse). Mange standardkonfigurationer bruger som standard `application/octet-stream` til ukendte filendelser, og browsere nægter at køre dem som ES-moduler. + +**Løsning**: Se din platformspecifikke deployment-guide for det præcise udsnit: + +- [Nginx →](/da/self-hosting/nginx#underskriv-pdf-eller-formularudfylder-viser-en-tom-læser-mjs-mime-fejl) +- [Apache →](/da/self-hosting/apache#underskriv-pdf-eller-formularudfylder-viser-en-tom-viewer-mjs-mime-fejl) +- [AWS S3 + CloudFront →](/da/self-hosting/aws#trin-2-byg-og-upload) (se `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/da/self-hosting/kubernetes#mjs-mime-typefejl-underskriv-pdf-formularudfylder-tom-iframe) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: håndteres automatisk, ingen handling nødvendig. + +**Kontrollér**: Åbn DevTools → fanen Network, find den mislykkede `.mjs`-anmodning, og kontrollér svarheaderen `Content-Type`. Den skal være `application/javascript`. Hvis den stadig er `application/octet-stream`, er det muligt, at en ydre reverse proxy eller et CDN gætter typen igen. Tjek hvert led i din serveringskæde. + +## WASM-konfiguration (AGPL-komponenter) + +BentoPDF **bundler ikke** AGPL-licenserede behandlingsbiblioteker i sin kildekode, men **forhåndskonfigurerer CDN-URL'er**, så alle funktioner virker ud af boksen, uden manuel opsætning. + +::: tip Nul konfiguration som standard +Fra og med v2.0.0 er WASM-moduler forhåndskonfigureret til at blive indlæst fra jsDelivr CDN via miljøvariabler. Alle avancerede funktioner virker med det samme uden brugerkonfiguration. +::: + +| Komponent | Licens | Funktioner | +| --------------- | -------- | ------------------------------------------------------------------------------ | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS-konvertering, udtrækning af billeder, udtrækning af tabeller | +| **Ghostscript** | AGPL-3.0 | PDF/A-konvertering, komprimering, udretning af skæve sider, rasterisering | +| **CoherentPDF** | AGPL-3.0 | Indholdsfortegnelse, vedhæftninger, PDF-sammenfletning med bogmærker | + +### Standardmiljøvariabler + +Disse er sat i `.env.production` og indbygget i buildet: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Overstyring af WASM-URL'er + +Du kan overstyre standardværdierne ved build til brugerdefinerede deployments: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +For at deaktivere et modul helt (kræver manuel brugerkonfiguration via Avancerede indstillinger) skal du sætte dets variabel til en tom streng. + +Til OCR skal du enten lade alle `VITE_TESSERACT_*`-variabler være tomme og beholde de online standardressourcer, eller angive worker-, core- og lang-URL'erne sammen til selvhostet/offline OCR. Hvis du kun bundler bestemte OCR-sprog, skal du også sætte `VITE_TESSERACT_AVAILABLE_LANGUAGES` til de samme kommaseparerede koder, så brugerfladen kun tilbyder installerede sprog, og ikke-understøttede valg fejler med en beskrivende fejl. Til fuldt offline PDF-output med søgbar tekst skal du desuden sætte `VITE_OCR_FONT_BASE_URL` til den interne mappe, der serverer de bundlede OCR-skrifttyper. + +Brugere kan også til enhver tid overstyre disse standardværdier via **Avancerede indstillinger** i brugerfladen. Brugeroverstyringer gemt i browseren har forrang over miljøstandarderne. + +### Air-gapped / offline deployment + +Til netværk uden internetadgang (offentlig sektor, sundhed, finans osv.). WASM-URL'erne er indbygget i JavaScript ved **build**. De egentlige WASM-filer downloades af **brugerens browser** under kørsel. Du skal derfor forberede alt på en maskine med internet og derefter overføre det til det isolerede netværk. + +#### Automatiseret script (anbefalet) + +Det medfølgende script `prepare-airgap.sh` automatiserer hele processen: det downloader WASM-pakker, bygger Docker-imaget og producerer en selvstændig bundle med et opsætningsscript. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Dette producerer en bundle-mappe: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Overfør bundlen til det air-gappede netværk via USB, internt artefaktlager eller en godkendt metode. Kør derefter det medfølgende opsætningsscript: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Opsætningsscriptet indlæser Docker-imaget, udpakker WASM-filer og starter eventuelt containeren. + +**Script-indstillinger:** + +| Flag | Beskrivelse | Standard | +| ------------------------------ | ------------------------------------------------------------- | -------------------------------------- | +| `--wasm-base-url ` | Hvor WASM-filerne hostes internt | _(påkrævet, spørges om, hvis mangler)_ | +| `--image-name ` | Docker image-tag | `bentopdf` | +| `--output-dir ` | Output-mappe til bundlen | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Aktivér Simple Mode | fra | +| `--base-url ` | Base-URL til undermappe (f.eks. `/pdf/`) | `/` | +| `--language ` | Standardsprog i brugerfladen (f.eks. `fr`, `de`) | _(ingen)_ | +| `--brand-name ` | Brugerdefineret brandnavn | _(ingen)_ | +| `--brand-logo ` | Logosti relativt til `public/` | _(ingen)_ | +| `--footer-text ` | Brugerdefineret sidefodstekst | _(ingen)_ | +| `--ocr-languages ` | Kommasepareret liste over OCR-sprog, der skal bundles | `eng` | +| `--list-ocr-languages` | Udskriv understøttede OCR-koder og navne, og afslut | fra | +| `--search-ocr-language ` | Søg efter OCR-koder via navn eller forkortelse | fra | +| `--dockerfile ` | Dockerfile, der skal bruges | `Dockerfile` | +| `--skip-docker` | Spring Docker-build og eksport over | fra | +| `--skip-wasm` | Spring WASM-download over (genbrug eksisterende `.tgz`-filer) | fra | + +Den interaktive prompt accepterer også `list` for at udskrive den fulde liste over understøttede Tesseract-koder og `search ` for at finde match som `search german` eller `search chi`. + +::: warning Krav om samme origin +WASM-filer skal serveres fra **samme origin** som BentoPDF-appen. Web Workers bruger `importScripts()`, som ikke kan indlæse scripts på tværs af origins. Hvis BentoPDF for eksempel kører på `https://internal.example.com`, skal WASM-base-URL'en også være `https://internal.example.com/wasm`. +::: + +#### Manuelle trin + +
+Hvis du foretrækker at gøre det manuelt uden scriptet + +**Trin 1: Download WASM- og OCR-pakkerne** (på en maskine med internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Trin 2: Byg Docker-imaget med interne URL'er** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Trin 3: Eksportér Docker-imaget** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Trin 4: Overfør til det air-gappede netværk** + +Kopiér via USB, internt artefaktlager eller en godkendt overførselsmetode: + +- `bentopdf.tar`: Docker-imaget +- De fem `.tgz` WASM/OCR-pakker fra trin 1 +- Mappen `tesseract-langdata/` fra trin 1 +- Mappen `ocr-fonts/` fra trin 1 + +**Trin 5: Opsætning inde i det air-gappede netværk** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Sørg for, at filerne er tilgængelige på de URL'er, du konfigurerede i trin 2, herunder `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` og `.../ocr/fonts`. + +
+ +::: info Bygger du fra kildekode i stedet for Docker? +Sæt variablerne i `.env.production`, før du kører `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Hosting af din egen WASM-proxy + +Hvis du skal servere AGPL WASM-filer med korrekte CORS-headere, kan du deploye en simpel proxy. Se [Cloudflare WASM Proxy-guiden](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) for et eksempel på en implementering. + +::: tip Hvorfor adskilt? +Denne adskillelse sikrer: + +- Klar juridisk compliance for kommercielle brugere +- BentoPDF's kerne forbliver under sin dobbeltlicens (AGPL-3.0 / kommerciel) +- WASM-filer indlæses under kørsel og bundles ikke i kildekoden + ::: + +## Systemkrav + +| Krav | Minimum | +| ---------- | --------------------------------- | +| Lagerplads | ~100 MB (kerne uden AGPL-moduler) | +| RAM | 512 MB | +| CPU | Enhver moderne processor | + +::: tip +BentoPDF er et statisk site, så der kræves ingen database eller backend-server! +::: diff --git a/docs/da/self-hosting/kubernetes.md b/docs/da/self-hosting/kubernetes.md new file mode 100644 index 00000000..38a4f0db --- /dev/null +++ b/docs/da/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Deploy med Kubernetes + +Kubernetes er måske overkill til et statisk site, men det kan passe godt, hvis du allerede standardiserer på Helm + GitOps. + +> [!IMPORTANT] +> **Påkrævede headere til konvertering af Office-filer** +> +> LibreOffice-baserede værktøjer (konvertering af Word, Excel, PowerPoint) kræver disse HTTP-headere for at understøtte `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> De officielle BentoPDF nginx-images indeholder disse headere. I Kubernetes er **Ingress-/Gateway-controllere også reverse proxies**, så sørg for, at disse headere bevares (eller tilføj dem i kanten). + +## Forudsætninger + +- Kubernetes-klynge +- Helm v3 +- Et BentoPDF nginx-image (f.eks. `ghcr.io/alam00000/bentopdf:`), der serverer på **port 8080** + +## Deploy med Helm + +### Installér fra dette repo (lokalt chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Installér fra GHCR (OCI-chart) + +Hvis chartet er udgivet til GHCR som et OCI-artefakt: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Gør det tilgængeligt + +### Port-forward (hurtig test) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (valgfrit) + +Aktivér Ingress (eksempel til nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (valgfrit) + +Dette chart understøtter Gateway API `Gateway` + `HTTPRoute`. + +Eksempel (Cloudflare Gateway API-operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Sørg for, at SharedArrayBuffer-headerne stadig virker (Ingress/Gateway) + +### Hvad der "burde" ske + +BentoPDF's nginx-konfiguration sætter de nødvendige svarheadere. De fleste Ingress-/Gateway-controllere **sender upstream-svarheadere videre uændret**. + +### Hvad der kan gå galt + +- En controller- eller edge-politik, der **overskriver** eller **fjerner** svarheadere +- En "security headers"-middleware, der sætter andre COOP/COEP-værdier + +### Sådan kontrollerer du det + +Kør dette mod dit offentlige endpoint: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Du skal se: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Hvis din Ingress-controller ikke bevarer dem + +Tilføj headerne i kanten (afhænger af controlleren). Eksempel til **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` MIME-typefejl (Underskriv PDF / Formularudfylder, tom iframe) + +Hvis browserens konsol viser `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` på en `.mjs`-anmodning, erstatter en Ingress-/Gateway-controller foran BentoPDF's nginx den upstream `Content-Type`-header med `application/octet-stream`. + +BentoPDF-imagets nginx serverer allerede `.mjs` som `application/javascript`. Løsningen er at stoppe controlleren i at fjerne eller erstatte den. For nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Eller brug et `ResponseHeaderModifier`-filter i Gateway API til at sætte `Content-Type: application/javascript` for `.mjs`-stier. Kontrollér i DevTools → fanen Network: Den mislykkede `.mjs`-anmodning skulle nu vise `content-type: application/javascript`. + +### Hvis du bruger Gateway API og vil tvinge headere på + +Gateway API understøtter et `ResponseHeaderModifier`-filter. Du kan knytte det til i `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Understøttelse af bestemte filtre afhænger af din Gateway-controller. Hvis et filter ignoreres, så tilføj headerne i kanten eller i controller-laget i stedet. + +## Deaktivering af bestemte værktøjer + +Brug en ConfigMap til at deaktivere værktøjer under kørsel uden at genopbygge imaget: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Montér den i den serverede mappe: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Værktøjs-id'er er sidens URL uden `.html`. Åbn et værktøj, og se på URL'en (f.eks. `edit-pdf`, `merge-pdf`, `compress-pdf`). Deaktiverede værktøjer skjules fra startsiden, søgning, genveje, workflow-builderen og direkte URL-adgang. Se [Docker-guiden](/da/self-hosting/docker#deaktivering-af-bestemte-værktøjer) for den fulde liste over indstillinger. diff --git a/docs/da/self-hosting/netlify.md b/docs/da/self-hosting/netlify.md new file mode 100644 index 00000000..d0593c4c --- /dev/null +++ b/docs/da/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Deploy til Netlify + +[Netlify](https://netlify.com) tilbyder fremragende hosting af statiske sites med en generøs gratis plan. + +## Deploy med ét klik + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Manuel deployment + +### Trin 1: Forbind repository + +1. Log ind på [Netlify](https://app.netlify.com) +2. Klik på "Add new site" → "Import an existing project" +3. Forbind din GitHub-konto +4. Vælg din BentoPDF-fork + +### Trin 2: Konfigurér build-indstillinger + +| Indstilling | Værdi | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Trin 3: Deploy + +Klik på "Deploy site", og vent på buildet. + +## Konfigurationsfil + +Opret `netlify.toml` i dit projekts rodmappe: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Vigtigt +Headerne `Cross-Origin-Embedder-Policy` og `Cross-Origin-Opener-Policy` er påkrævet til konvertering af Word/ODT/Excel/PowerPoint til PDF. Uden dem er `SharedArrayBuffer` utilgængelig, og LibreOffice WASM-motoren kan ikke starte. + +Headerne `Content-Encoding: gzip` på filerne `.wasm.gz` og `.data.gz` får browseren til at dekomprimere dem automatisk. Uden dem modtager browseren rå gzip-bytes, og WASM-kompileringen mislykkes. +::: + +## Miljøvariabler + +Angiv disse under Site settings → Environment variables: + +| Variabel | Beskrivelse | +| ----------------------- | ------------------------------------------------------------ | +| `SIMPLE_MODE` | Sæt til `true` for et minimalt build | +| `VITE_BRAND_NAME` | Brugerdefineret brandnavn (erstatter "BentoPDF") | +| `VITE_BRAND_LOGO` | Logosti relativt til `public/` (f.eks. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Brugerdefineret sidefods-/ophavsretstekst | +| `VITE_DEFAULT_LANGUAGE` | Standardsprog i brugerfladen (f.eks. `fr`, `de`, `es`) | + +## Eget domæne + +1. Gå til Site settings → Domain management +2. Klik på "Add custom domain" +3. Følg anvisningerne til DNS-konfiguration + +## Store mediefiler + +Til store WASM-filer kan du overveje at aktivere [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Fejlfinding + +### Word/ODT/Excel til PDF hænger ved 55 % + +Hvis dokumentkonverteringer hænger ved 55 %, så åbn DevTools Console og kontrollér: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Hvis `crossOriginIsolated` er `false`, bliver COEP/COOP-headerne fra din `netlify.toml` ikke anvendt. Sørg for, at filen ligger i dit projekts rodmappe, og deploy igen. + +Hvis du ser `expected magic word 00 61 73 6d, found 1f 8b 08 08` i konsollen, mangler `.wasm.gz`-filerne headerne `Content-Encoding: gzip`. Sørg for, at blokkene `[[headers]]` til `soffice.wasm.gz` og `soffice.data.gz` findes i din `netlify.toml`. + +### Build mislykkes + +Kontrollér kompatibiliteten med Node-versionen: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Langsom første indlæsning + +Aktivér asset-optimering under Site settings → Build & deploy → Asset optimization. diff --git a/docs/da/self-hosting/nginx.md b/docs/da/self-hosting/nginx.md new file mode 100644 index 00000000..4b224ae3 --- /dev/null +++ b/docs/da/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Deploy med Nginx + +Host BentoPDF på din egen server med Nginx. + +## Forudsætninger + +- Ubuntu/Debian-server +- Nginx installeret +- SSL-certifikat (anbefalet: Let's Encrypt) + +## Trin 1: Byg projektet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +For at tilpasse branding skal du sætte miljøvariabler, før du bygger: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Trin 2: Kopiér filer + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Trin 3: Nginx-konfiguration + +Opret `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Trin 4: Aktivér sitet + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Trin 5: SSL med Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Deployment i undermappe + +For at hoste på `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Byg med: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Ydelsesjustering + +Tilføj til `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Fejlfinding + +### WASM indlæses ikke + +Sørg for, at MIME-typen er sat: + +```nginx +types { + application/wasm wasm; +} +``` + +### Underskriv PDF eller Formularudfylder viser en tom læser (`.mjs` MIME-fejl) + +Hvis browserens konsol viser: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…og den mislykkede anmodning ender på `.mjs`, mangler din nginx tilknytningen `.mjs → application/javascript`. Den indbyggede PDF-læser (brugt af Underskriv PDF, Formularudfylder og et par andre værktøjer) leverer ES-modulfiler med filendelsen `.mjs`, og nginx' standardfil `mime.types` indeholder dem ikke som standard. + +Ret det ved at tilføje `mjs` til den eksisterende `application/javascript`-linje i `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> Tilføj IKKE en _anden_ `application/javascript`-linje. Nginx læser `mime.types` linje for linje, og kun én tilknytning mellem type og filendelse vinder, så en anden linje ignoreres i stilhed på nogle versioner. Redigér den eksisterende linje, så `mjs` står ved siden af `js`. + +Eller overstyr lokalt i din server-blok (uden at redigere den globale fil): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Genindlæs nginx efter ændringen: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +For at bekræfte det: Find den mislykkede `.mjs`-anmodning i browserens DevTools → fanen Network, og kontrollér svarheaderen `Content-Type`. Den skulle nu være `application/javascript`, ikke `application/octet-stream`. + +### Word/ODT/Excel til PDF virker ikke + +LibreOffice WASM kræver `SharedArrayBuffer`, som kræver headerne `Cross-Origin-Embedder-Policy` og `Cross-Origin-Opener-Policy`. Det kræver også en sikker kontekst, så `http://localhost` virker til lokal test, men `http://192.168.x.x` eller andre LAN-IP'er kræver normalt HTTPS. Bemærk, at nginx' `add_header`-direktiver i en `location`-blok **overskriver** `add_header`-direktiver på serverniveau. De bliver ikke slået sammen. Hver `location`-blok med sin egen `add_header` skal indeholde COEP/COOP-headerne. + +Kontrollér med: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Hvis du bruger en reverse proxy foran nginx, så sørg for, at den bevarer disse headere. + +### 502 Bad Gateway + +Tjek Nginx' fejllogge: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/da/self-hosting/vercel.md b/docs/da/self-hosting/vercel.md new file mode 100644 index 00000000..63fcc5aa --- /dev/null +++ b/docs/da/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Deploy til Vercel + +[Vercel](https://vercel.com) tilbyder den letteste deployment-oplevelse for statiske sites. + +## Deploy med ét klik + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Manuel deployment + +### Trin 1: Fork repositoriet + +Fork [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) til din GitHub-konto. + +### Trin 2: Importér til Vercel + +1. Gå til [vercel.com/new](https://vercel.com/new) +2. Vælg dit forkede repository +3. Konfigurér projektet: + +| Indstilling | Værdi | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Trin 3: Miljøvariabler (valgfrit) + +Tilføj disse, hvis det er nødvendigt: + +| Variabel | Beskrivelse | +| ----------------------- | ------------------------------------------------------------ | +| `SIMPLE_MODE` | Sæt til `true` for minimal brugerflade | +| `VITE_BRAND_NAME` | Brugerdefineret brandnavn (erstatter "BentoPDF") | +| `VITE_BRAND_LOGO` | Logosti relativt til `public/` (f.eks. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Brugerdefineret sidefods-/ophavsretstekst | +| `VITE_DEFAULT_LANGUAGE` | Standardsprog i brugerfladen (f.eks. `fr`, `de`, `es`) | + +### Trin 4: Deploy + +Klik på "Deploy", og vent på, at buildet er færdigt. + +## Eget domæne + +1. Gå til dit projekts indstillinger +2. Naviger til "Domains" +3. Tilføj dit eget domæne +4. Konfigurér DNS som anvist + +## Begrænsninger + +::: warning Store filer +Vercels serverless-funktioner har en grænse på 50 MB. Da BentoPDF er et statisk site, bør det ikke påvirke dig, men WASM-modulerne er store (ca. 100 MB i alt). Sørg for, at de leveres fra mappen `/public`. +::: + +## Fejlfinding + +### Build-timeout + +Hvis buildet timer ud, så prøv: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 ved opdatering af siden + +Tilføj en `vercel.json` til SPA-routing: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel til PDF virker ikke + +LibreOffice WASM-konverteringer kræver `SharedArrayBuffer`, som kræver disse svarheadere på alle sider: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +De forkomprimerede `.wasm.gz`- og `.data.gz`-filer skal også have `Content-Encoding: gzip`, så browseren dekomprimerer dem. + +Tilføj disse til din `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +For at kontrollere det skal du åbne DevTools Console og køre `console.log(window.crossOriginIsolated)`. Den skal returnere `true`. diff --git a/docs/da/tools/add-attachments.md b/docs/da/tools/add-attachments.md new file mode 100644 index 00000000..18be1f1d --- /dev/null +++ b/docs/da/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Tilføj vedhæftninger +description: Indlejr filer af enhver type i en PDF på dokumentniveau eller knyttet til bestemte sider. +--- + +# Tilføj vedhæftninger + +Indlejr en eller flere filer direkte i et PDF-dokument. Vedhæftninger kan tilføjes på dokumentniveau (synlige i enhver PDF-læsers panel for vedhæftninger) eller knyttes til bestemte sider. + +## Sådan fungerer det + +1. Upload den PDF, du vil vedhæfte filer til. +2. Brug dropzonen til vedhæftninger til at vælge de filer, du vil indlejre (alle filtyper). +3. Vælg niveau for vedhæftningen: **Dokument** (standard) eller **Side**. +4. Hvis du vælger sideniveau, skal du angive et sideinterval (f.eks. `1-3` eller `5`). +5. Klik på knappen for at behandle. Den ændrede PDF downloades med dine filer indlejret. + +## Funktioner + +- Vedhæft enhver filtype: billeder, regneark, arkiver, programfiler, alt muligt +- Placering af vedhæftninger på dokumentniveau eller sideniveau +- Flere filer kan vedhæftes i én handling +- Viser filnavne og størrelser for alle valgte vedhæftninger +- Outputtet bevarer det oprindelige PDF-indhold med de indlejrede filer tilføjet + +## Indstillinger + +| Indstilling | Beskrivelse | +| ------------------ | --------------------------------------------------------------------------------- | +| **Dokumentniveau** | Vedhæfter filer til PDF'en som helhed, tilgængelige fra panelet for vedhæftninger | +| **Sideniveau** | Vedhæfter filer til bestemte sider, angivet med et sideinterval | + +## Anvendelsesområder + +- Samle kildedata (Excel-filer, CSV'er) med en PDF-rapport +- Vedhæfte de originale billedfiler til en PDF med et fotoportfolio +- Indlejre underbilag i en kontrakt eller et tilbud +- Tilføje supplerende materiale til bestemte sider i en træningsmanual + +## Tips + +- Vedhæftninger på dokumentniveau understøttes bredest på tværs af PDF-læsere. Vedhæftninger på sideniveau er muligvis ikke synlige i alle læsere. +- Der er ingen grænse for filstørrelsen på vedhæftninger, men meget store indlejrede filer øger PDF'ens størrelse tilsvarende. + +## Relaterede værktøjer + +- [Udtræk vedhæftninger](./extract-attachments) +- [Redigér vedhæftninger](./edit-attachments) +- [Flet PDF](./merge-pdf) diff --git a/docs/da/tools/add-blank-page.md b/docs/da/tools/add-blank-page.md new file mode 100644 index 00000000..b17a83cf --- /dev/null +++ b/docs/da/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Tilføj tom side +description: Indsæt en eller flere tomme sider på en vilkårlig position i et PDF-dokument. +--- + +# Tilføj tom side + +Indsæt tomme sider i en PDF på en position, du selv angiver. Du bestemmer, hvor de tomme sider placeres, og hvor mange der tilføjes. + +## Sådan fungerer det + +1. Upload en PDF-fil. Værktøjet viser antallet af sider. +2. Angiv den **position**, hvor de tomme sider skal indsættes. Brug `0` for at indsætte allerførst, eller det samlede antal sider for at tilføje til sidst. +3. Angiv **antallet** af tomme sider, der skal tilføjes (standard er 1). +4. Klik på knappen for at behandle. Den ændrede PDF downloades med de tomme sider indsat. + +## Funktioner + +- Indsæt på enhver position: i begyndelsen, i midten eller til sidst i dokumentet +- Tilføj flere tomme sider i én handling +- Positionshinten opdateres dynamisk ud fra den uploadede PDF's sideantal +- Tomme sider i standard A4-format + +## Anvendelsesområder + +- Tilføje en tom skilleside mellem afsnit i et sammensat dokument +- Indsætte tomme sider, så dobbeltsidet udskrivning passer +- Tilføje plads til håndskrevne noter i en udskrevet studievejledning +- Fylde et dokument ud, så det opfylder et krav om minimum sideantal + +## Tips + +- Position `0` indsætter før første side. En position svarende til det samlede sideantal tilføjer efter sidste side. +- Hvis du skal indsætte indhold (ikke kun tomme sider) på en bestemt position, kan du bruge [PDF Multi-værktøj](./pdf-multi-tool) til at indsætte en anden PDF efter en given side. + +## Relaterede værktøjer + +- [Organisér og dupliker](./organize-pdf) +- [PDF Multi-værktøj](./pdf-multi-tool) +- [Flet PDF](./merge-pdf) diff --git a/docs/da/tools/add-page-labels.md b/docs/da/tools/add-page-labels.md new file mode 100644 index 00000000..d3c5c0ca --- /dev/null +++ b/docs/da/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Tilføj sideetiketter +description: Tilføj PDF-sideetiketter med romertal, bogstavpræfikser, brugerdefineret nummerering og flere regler pr. dokument. +--- + +# Tilføj sideetiketter + +Sideetiketter styrer, hvordan sidetal vises i PDF-læsere (tallet i værktøjslinjen, ikke det der er trykt på siden). Med dette værktøj kan du give forskellige sideintervaller forskellige nummereringsmåder: romertal til forsiden, decimaltal til hoveddelen, bogstaver til bilag og meget mere. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Indstillingspanelet vises med én etiketregel som standard. +3. Konfigurér hver regel med et sideinterval, en stil, et valgfrit præfiks og en startværdi. +4. Klik på **Tilføj regel** for at oprette flere regler til forskellige afsnit. +5. Klik på **Tilføj sideetiketter** for at anvende alle regler og downloade resultatet. + +## Indstillinger + +Hver etiketregel har disse indstillinger: + +- **Sideinterval** -- Hvilke sider reglen gælder for. Lad feltet stå tomt for alle sider. Understøtter intervaller som `1-4`, `7`, `odd` eller `1-9,30-40`. +- **Etiketstil** -- Arabiske decimaltal, små romertal (i, ii, iii), store romertal (I, II, III), små bogstaver (a, b, c), store bogstaver (A, B, C) eller ingen etiket (kun præfiks). +- **Etiketpræfiks** -- Valgfri tekst foran hver etiket, f.eks. "A-" for at lave etiketter som A-1, A-2, A-3. +- **Startværdi** -- Det tal, der tælles fra. Standard er 1. Sæt til 0 for nulbaseret nummerering. +- **Fortsæt nummerering på tværs af adskilte intervaller** -- Slå dette til, når en regel rammer ikke-sammenhængende sider (som `1-9,30-40` eller `odd`), og du vil have nummereringen til at fortsætte i rækkefølge. +- **Fjern eksisterende sideetiketter** -- Markeret som standard. Rydder tidligere etiketter, før dine nye regler anvendes. + +## Funktioner + +- Flere etiketregler pr. dokument til komplekse nummereringsskemaer +- Seks etiketstile, der dækker alle gængse nummereringssystemer +- Understøttelse af brugerdefinerede præfikser til afsnitsbaseret etikettering +- Understøttelse af adskilte intervaller med fortløbende nummerering +- Mulighed for at beholde eller fjerne eksisterende etiketter + +## Anvendelsesområder + +- Sætte romertalsetiketter (i, ii, iii) på en bogs forord og decimaletiketter på hovedteksten +- Etikettere bilagssider med bogstavpræfikser som "A-1", "A-2", "B-1", "B-2" +- Rette sideetiketter i et scannet dokument, hvor de fysiske sidetal ikke passer med PDF'ens siderækkefølge +- Tilføje nulbaseret nummerering til tekniske dokumenter + +## Tips + +- Sideetiketter er metadata, som PDF-læsere viser i deres navigationslinje. De udskrives ikke på selve siden. Til synlige tal kan du bruge [Sidetal](./page-numbers). +- Dette værktøj kræver, at CoherentPDF (CPDF) er konfigureret i dine WASM-indstillinger. Hvis det ikke er sat op, bliver du bedt om at konfigurere det. + +## Relaterede værktøjer + +- [Sidetal](./page-numbers) +- [Bates-nummerering](./bates-numbering) +- [Redigér bogmærker](./bookmark) diff --git a/docs/da/tools/add-stamps.md b/docs/da/tools/add-stamps.md new file mode 100644 index 00000000..68e75cd4 --- /dev/null +++ b/docs/da/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Tilføj stempler +description: Tilføj billedstempler til dine PDF-sider med en integreret annoteringsværktøjslinje og angivelse af brugernavn. +--- + +# Tilføj stempler + +Placér billedstempler på dine PDF-sider i en indlejret læser med en værktøjslinje til stempelannotering. Stempler kan indeholde dit navn som afsender, hvilket gør værktøjet nyttigt til godkendelsesforløb, gennemgange og markering af dokumenter. + +## Sådan fungerer det + +1. Skriv dit navn i feltet **Stempelbrugernavn**. Dette navn vises på de stempler, du opretter. +2. Upload din PDF-fil ved at klikke eller trække den ind i dropzonen. +3. Stempeleditoren åbner med dit dokument indlæst i en læser. +4. Brug værktøjslinjens billedstempelværktøj til at vælge og placere stempler på en vilkårlig side. +5. Placér og tilpas størrelsen på stemplerne efter behov. +6. Klik på **Gem stemplet PDF** for at downloade resultatet. + +## Funktioner + +- Integreret PDF-læser med en stempelspecifik annoteringsværktøjslinje +- Angivelse af brugernavn på oprettede stempler +- Placering af billedstempler på enhver side +- Placering og størrelsesændring med træk og slip +- Automatisk tilpasning af læserens størrelse efter sidens billedformat +- Visning af fil med navn og størrelse + +## Anvendelsesområder + +- Tilføje billedstemplerne "GODKENDT" eller "GENNEMGÅET" til dokumenter i et gennemgangsforløb +- Placere billeder af firmasegl eller notarstempel på officielle dokumenter +- Markere sider med "MODTAGET"-stempler med gennemgangerens navn +- Tilføje kvalitetskontrolstempler til inspektionsrapporter + +## Tips + +- Angiv dit stempelbrugernavn, før du uploader PDF'en. Brugernavnet indlejres i stemplets metadata. +- Læseren tilpasser sin højde efter PDF'ens første sides billedformat, så visningen bliver optimal. +- Til tekstbaserede vandmærker i stedet for billedstempler kan du bruge værktøjet [Tilføj vandmærke](./add-watermark). + +## Relaterede værktøjer + +- [Underskriv PDF](./sign-pdf) +- [Tilføj vandmærke](./add-watermark) +- [PDF-editor](./edit-pdf) diff --git a/docs/da/tools/add-watermark.md b/docs/da/tools/add-watermark.md new file mode 100644 index 00000000..cc98034c --- /dev/null +++ b/docs/da/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Tilføj vandmærke +description: Sæt tekst- eller billedvandmærker på PDF-sider med en visuel træk-og-slip-editor og live eksempelvisning. +--- + +# Tilføj vandmærke + +Tilføj tekst- eller billedvandmærker til dine PDF-sider med en visuel editor. Du kan placere vandmærket ved at trække det direkte i eksempelvisningen, ændre størrelsen med hjørnehåndtag og indstille gennemsigtighed, rotation, skrifttype og farve. Hver side kan have sin egen vandmærkeposition, eller du kan anvende det samme vandmærke på alle sider på én gang. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Editoren åbner med en live eksempelvisning af første side og et vandmærke, der kan trækkes. +3. Vælg mellem **Tekst**- eller **Billede**-vandmærke med skiftknapperne. +4. Konfigurér vandmærkets indstillinger i sidepanelet. +5. Træk vandmærket i eksempelvisningen, så det står præcis, hvor du vil have det. Brug hjørnehåndtagene til at ændre størrelsen. +6. Gå mellem siderne for at indstille vandmærker pr. side, eller lad **Anvend på alle sider** være markeret. +7. Klik på **Tilføj vandmærke** for at behandle og downloade. + +## Indstillinger + +**Indstillinger for tekstvandmærke:** + +- **Tekst** -- Vandmærkets tekst (f.eks. "FORTROLIG", "UDKAST"). +- **Skriftstørrelse** -- Fra 10 til 200 punkt. Standard er 72. +- **Farve** -- Vilkårlig farve via farvevælgeren. +- **Gennemsigtighed** -- Styr gennemsigtigheden fra helt gennemsigtig til helt uigennemsigtig. +- **Rotation** -- Roter vandmærketeksten fra -180 til 180 grader. + +**Indstillinger for billedvandmærke:** + +- **Billedupload** -- Upload en PNG, JPG eller anden billedfil, der skal bruges som vandmærke. +- **Gennemsigtighed** -- Styr billedets gennemsigtighed. +- **Skala** -- Ændr størrelsen på billedvandmærket. + +**Layoutindstillinger:** + +- **Enkelt** -- Ét vandmærke pr. side, placeret ved at trække eller med positionsforvalgene. +- **Fliselagt** -- Gentager vandmærket over hele siden i et diagonalt gitter, der følger rotationsvinklen, så mærket dækker dokumentet fra kant til kant. +- **Vandret afstand** -- Afstand mellem fliserne langs tekstretningen, som en procentdel af vandmærkets bredde (kun fliselagt tilstand). +- **Lodret afstand** -- Afstand mellem flisernes rækker, som en procentdel af vandmærkets højde (kun fliselagt tilstand). + +**Generelle indstillinger:** + +- **Anvend på alle sider** -- Når den er markeret, gælder det samme vandmærke for alle sider. Fjern markeringen for at indstille individuelle vandmærker pr. side. +- **Sideinterval** -- Angiv, hvilke sider der får vandmærket (f.eks. "1-3, 5, 7-9" eller "all"). + +## Funktioner + +- Visuel placering med træk og slip i en live PDF-eksempelvisning +- Vandmærke, hvis størrelse kan ændres med hjørnehåndtag +- Tilstande for tekst- og billedvandmærker +- Enkelt layout eller fliselagt (gentaget) layout over hele siden med justerbar afstand +- Vandmærke pr. side eller globalt +- Navigation side for side i eksempelvisningen +- Styring af gennemsigtighed og rotation +- Filtrering efter sideinterval + +## Anvendelsesområder + +- Markere udkast med "UDKAST", før de sendes rundt til gennemgang +- Tilføje "FORTROLIG"-vandmærker til følsomme regnskabsrapporter +- Brande dokumenter med et vandmærke med firmalogo +- Stemple "EKSEMPEL" på produktdokumentation, der deles med potentielle kunder +- Tilføje ophavsretsmeddelelser til distribuerede PDF-materialer + +## Tips + +- Til diagonale vandmærker hen over siden kan du sætte rotationen til omkring 45 grader og øge skriftstørrelsen. +- Fliselagt tilstand gør et dokument meget sværere at genbruge efter beskæring, da der stadig er snesevis af mærker tilbage, hvis du fjerner ét. Sænk gennemsigtigheden, når du bruger fliser, så den underliggende tekst forbliver læselig. +- Billedvandmærker med gennemsigtig baggrund (PNG-format) smelter mere naturligt sammen med dokumentets indhold. +- Hvis du skal bruge forskellig vandmærketekst på forskellige sider, skal du fjerne markeringen af "Anvend på alle sider" og gå side for side. + +## Relaterede værktøjer + +- [Sidehoved og sidefod](./header-footer) +- [Tilføj stempler](./add-stamps) +- [Bates-nummerering](./bates-numbering) +- [Underskriv PDF](./sign-pdf) diff --git a/docs/da/tools/adjust-colors.md b/docs/da/tools/adjust-colors.md new file mode 100644 index 00000000..7a6965d8 --- /dev/null +++ b/docs/da/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Justér farver +description: Finjustér lysstyrke, kontrast, mætning, farvetone, temperatur, nuance, gamma og sepia i din PDF. +--- + +# Justér farver + +Et komplet værktøj til farvekorrektion af PDF'er. Juster otte uafhængige parametre (lysstyrke, kontrast, mætning, farvetoneforskydning, temperatur, nuance, gamma og sepia) med en live eksempelvisning, der opdateres, mens du flytter hver skyder. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Editoren åbner med en eksempelvisning af første side og et panel med farveindstillinger. +3. Flyt skyderne for at justere hver farveparameter. Eksempelvisningen opdateres i realtid. +4. Klik på **Nulstil** for at sætte alle skydere tilbage til deres standardpositioner. +5. Klik på **Anvend** for at behandle alle sider og downloade den justerede PDF. + +## Indstillinger + +- **Lysstyrke** -- Gør hele siden lysere eller mørkere (-100 til +100). +- **Kontrast** -- Øg eller mindsk forskellen mellem lyse og mørke områder (-100 til +100). +- **Mætning** -- Forstærk eller reducér farveintensiteten (-100 til +100). Sættes den til -100, bliver resultatet gråtoner. +- **Farvetoneforskydning** -- Drej farvehjulet for at forskyde alle farver ensartet. +- **Temperatur** -- Gør farverne varmere (gul/orange) eller koldere (blå). +- **Nuance** -- Tilføj et grønt eller magentafarvet skær. +- **Gamma** -- Juster mellemtoners lysstyrke med en gammakurve. Værdier under 1,0 gør mellemtonerne mørkere, og værdier over 1,0 gør dem lysere. +- **Sepia** -- Anvend en klassisk sepiatone. Højere værdier giver et kraftigere brunt skær. + +## Funktioner + +- Otte uafhængigt justerbare farveparametre +- Live eksempelvisning, der reagerer med det samme på ændringer af skyderne +- Nulstillingsknap til hurtigt at vende tilbage til standardværdierne +- Behandler alle sider i dokumentet +- Virker med alt PDF-indhold (tekst, billeder, grafik) + +## Anvendelsesområder + +- Gøre en mørk scanning lysere eller rette overeksponerede sider +- Affarve et farverigt dokument for at spare blæk før udskrivning +- Anvende en sepiatone for at skabe et antikt look til certifikater eller priser +- Rette farvetemperaturen på fotos, der er indlejret i en PDF +- Øge kontrasten i falmede eller scannede dokumenter af lav kvalitet + +## Tips + +- For en hurtig konvertering til gråtoner skal du trække mætningsskyderen helt ned til -100. +- Gammaskyderen er særligt nyttig til at forbedre læsbarheden af scannede dokumenter, hvor mellemtonerne er for mørke eller for lyse. +- Ligesom de andre billedeffektværktøjer rasteriserer dette værktøj hver side. Outputtet er billedbaseret, så teksten kan ikke markeres. + +## Relaterede værktøjer + +- [Invertér farver](./invert-colors) +- [Scannereffekt](./scanner-effect) +- [Baggrundsfarve](./background-color) diff --git a/docs/da/tools/alternate-merge.md b/docs/da/tools/alternate-merge.md new file mode 100644 index 00000000..f1e75aef --- /dev/null +++ b/docs/da/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alternér og miks sider +description: Flet PDF'er ved at flette sider fra hver fil ind i skiftevis rækkefølge, med bevarelse af bogmærker. +--- + +# Alternér og miks sider + +Flet sider fra flere PDF-filer, så siderne skifter mellem dokumenterne. Dette er værktøjet, du skal bruge, når en almindelig sammenfletning blot sætter filerne efter hinanden, men du har brug for side 1 fra fil A, derefter side 1 fra fil B, derefter side 2 fra fil A og så videre. + +## Sådan fungerer det + +1. Upload mindst to PDF-filer i dropzonen. +2. Værktøjet viser hver fil med sideantal og filstørrelse. +3. Træk i grebshåndtagene for at ændre, hvilken fils sider der kommer først i rækkefølgen. +4. Klik på **Miks sider** for at lave det sammenflettede output. +5. Resultatet downloades som `alternated-mixed.pdf`. + +## Funktioner + +- Fletter sider på tværs af et vilkårligt antal PDF'er (minimum to) +- Omarrangering af filer med træk og slip for at styre sammenfletningens prioritet +- Bevarer bogmærker fra kildedokumenterne +- Viser sideantal og filstørrelse for hver uploadet fil +- Behandler i en dedikeret web worker, så brugerfladen forbliver responsiv + +## Anvendelsesområder + +- Samle dobbeltsidede scanninger igen, hvor ulige og lige sider er scannet hver for sig +- Kombinere opgaveark med facitlister, så hvert spørgsmål efterfølges af sit svar +- Flette tosprogede dokumenter side for side (f.eks. engelsk på den ene side og oversættelsen på den næste) +- Flette for- og bagsider fra en scanner, der kun scanner enkeltsidet + +## Tips + +- Hvis dine kilde-PDF'er har forskelligt sideantal, løber det korteste dokument tør for sider først, og de resterende sider fra det længste dokument kommer til sidst. +- Filrækkefølgen har betydning: Den første fil på listen bidrager med outputtets første side. Træk for at omarrangere, hvis det er nødvendigt. + +## Relaterede værktøjer + +- [Flet PDF](./merge-pdf) +- [Organisér og dupliker](./organize-pdf) +- [Opdel PDF](./split-pdf) diff --git a/docs/da/tools/background-color.md b/docs/da/tools/background-color.md new file mode 100644 index 00000000..52349379 --- /dev/null +++ b/docs/da/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Baggrundsfarve +description: Skift baggrundsfarven på hver side i din PDF, mens alt indhold bevares ovenpå. +--- + +# Baggrundsfarve + +Angiv en ensfarvet baggrund bag alt eksisterende indhold i din PDF. Værktøjet opretter et farvet rektangel på hver side og lægger det oprindelige indhold ovenpå, så tekst, billeder og grafik forbliver fuldt synlige mod den nye baggrund. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Vælg en baggrundsfarve med farvevælgeren. Standard er en lysegul (#FFFFCC). +3. Klik på **Skift baggrundsfarve** for at behandle. +4. Den opdaterede PDF downloades automatisk. + +## Indstillinger + +- **Baggrundsfarve** -- En almindelig farvevælger til at vælge en vilkårlig ensfarvet farve. Standard er lysegul. + +## Funktioner + +- Anvender en ensartet baggrundsfarve på hver side +- Bevarer alt oprindeligt indhold (tekst, billeder, vektorgrafik) oven på det farvede lag +- Bevarer de oprindelige sidemål +- Virker med dokumenter med et vilkårligt antal sider + +## Anvendelsesområder + +- Tilføje en lys creme- eller elfenbensfarvet baggrund, så dokumenter får et blødere, papirlignende udseende +- Farvekode dokumentsæt ved at give forskellige kategorier forskellige baggrundsfarver +- Lave visuelt adskilte versioner af det samme dokument til forskellige målgrupper +- Tilføje en lys baggrundstone for at forbedre læsbarheden, når dokumenter vises på en skærm + +## Tips + +- Lyse, dæmpede farver fungerer bedst. En meget mørk baggrund kan gøre teksten svær at læse, medmindre teksten allerede er lys. +- Hvis du vil ændre både baggrunds- og tekstfarve, skal du først anvende baggrundsfarven og derefter bruge [Skift tekstfarve](./text-color) på resultatet. +- Dette værktøj arbejder på PDF'ens strukturelle niveau (ikke rasterisering), så teksten forbliver markerbar og søgbar i outputtet. + +## Relaterede værktøjer + +- [Skift tekstfarve](./text-color) +- [Invertér farver](./invert-colors) +- [Justér farver](./adjust-colors) diff --git a/docs/da/tools/bates-numbering.md b/docs/da/tools/bates-numbering.md new file mode 100644 index 00000000..5b991bce --- /dev/null +++ b/docs/da/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates-nummerering +description: Anvend Bates-numre på en eller flere PDF'er med tilpasselige skabeloner, polstring, skrifttyper og placering. +--- + +# Bates-nummerering + +Bates-nummerering stempler fortløbende identifikatorer på hver side i dine PDF'er. Det er standardmetoden til mærkning af dokumenter i retssager, revisioner og compliance-forløb. Dette værktøj understøtter flere filer og tilpasselige skabeloner og giver enten individuelt nummererede PDF'er eller ét samlet ZIP-arkiv. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. Du kan trække flere filer ind på én gang. +2. Vælg et stilforvalg, eller opret en brugerdefineret skabelon. +3. Konfigurér position, skrifttype, størrelse, farve og startnumre. +4. Klik på **Anvend Bates-numre** for at behandle. +5. Én fil downloades direkte. Flere filer downloades som et ZIP-arkiv. + +## Indstillinger + +- **Stilforvalg** -- Vælg mellem indbyggede formater: + - Bilag + Sag + Bates + Side (f.eks. "Exhibit 1 Case XYZ 000001 Page 1") + - Bilag + Sag + Bates (uden sidetal) + - Sag + Bates + - Kun Bates-nummer (f.eks. "000001") + - Brugerdefineret (skriv din egen skabelon) +- **Tilpas stil** -- En skabelonstreng med pladsholdere: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Bates-polstring** -- Antal cifre (3 til 6) for Bates-numre polstret med nuller. Vises kun i brugerdefineret tilstand. +- **Position** -- Sidehoved eller sidefod, venstre, midten eller højre. +- **Bates starter fra** -- Det første Bates-nummer. Standard er 1. Nummereringen fortsætter på tværs af filer. +- **Filtæller starter fra** -- Startnummeret for pladsholderen `[FILE]`. +- **Skrifttype** -- Helvetica, Times New Roman eller Courier. +- **Skriftstørrelse** -- Størrelsen på den stemplede tekst. +- **Farve** -- Farvevælger til Bates-nummerets tekst. + +## Funktioner + +- Live eksempelvisning, der viser, hvordan Bates-numre vises på tværs af alle uploadede filer +- Understøttelse af flere filer med fortløbende nummerering på tværs af dokumenter +- Omarrangering af filer med træk og slip for at styre nummereringsrækkefølgen +- Seks positionsmuligheder (sidehoved/sidefod, venstre/midten/højre) +- Adaptiv beregning af margener, der tager hensyn til forskellige sidestørrelser +- ZIP-output til batches med flere filer +- Skabelonpladsholdere for maksimal fleksibilitet + +## Anvendelsesområder + +- Stemple dokumenter til brug i bevisindsamling i retssager med fortløbende bilagsnumre +- Nummerere revisionsbeviser, der spænder over dusinvis af filer +- Anvende regulatoriske referencenumre på compliance-dokumentation +- Mærke bilag til patentansøgninger med sagsspecifikke identifikatorer + +## Tips + +- Træk filerne på fillisten for at omarrangere dem, før du behandler. Bates-nummereringen følger denne rækkefølge. +- Brug pladsholderen `[FILENAME]` til at medtage det oprindelige filnavn i stemplet, hvilket gør det lettere at spore sider tilbage til kildedokumenterne. +- Eksempelboksen opdateres i realtid, når du ændrer indstillinger, så du kan kontrollere formatet, før du behandler. + +## Relaterede værktøjer + +- [Sidetal](./page-numbers) +- [Tilføj sideetiketter](./add-page-labels) +- [Sidehoved og sidefod](./header-footer) diff --git a/docs/da/tools/bmp-to-pdf.md b/docs/da/tools/bmp-to-pdf.md new file mode 100644 index 00000000..87ea5832 --- /dev/null +++ b/docs/da/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP til PDF +description: Konvertér BMP-bitmapbilleder til PDF direkte i din browser, uden upload til nogen server. +--- + +# BMP til PDF + +Konvertér Windows Bitmap-filer (BMP) til PDF. BMP er et ukomprimeret billedformat, der stadig findes i ældre systemer, medicinsk billeddannelse og industrielle scannere. Dette værktøj konverterer dem til PDF uden at du skal installere noget. + +## Understøttede formater + +| Format | Filtypenavne | +| :----- | :----------- | +| BMP | `.bmp` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine BMP-filer. +2. Gennemgå fillisten. Tilføj flere filer, eller fjern uønskede. +3. Klik på **Konvertér til PDF**. Outputtet downloades som `from_bmps.pdf`. + +Hver BMP tegnes på et canvas, eksporteres som PNG og indlejres derefter i PDF'en med pdf-lib. Sidestørrelsen svarer til det oprindelige billedes mål. + +## Indstillinger + +Dette værktøj har ingen ekstra kvalitetsindstillinger. Billederne indlejres i deres oprindelige opløsning som tabsfri PNG i PDF'en. + +## Anvendelsesområder + +- Konvertere ældre scannede dokumenter gemt som BMP til arkiv-PDF'er +- Gøre BMP-skærmbilleder fra ældre Windows-programmer til dokumenter, der kan deles +- Behandle output fra medicinske eller industrielle scannere, der som standard bruger BMP +- Migrere gamle billedarkiver til et mere flytbart format + +## Tips + +- BMP-filer er ukomprimerede og derfor ofte store. Den resulterende PDF bliver betydeligt mindre, fordi billederne internt omkodes til PNG. +- Hvis du har BMP-filer sammen med andre billedformater, kan du bruge værktøjet [Billeder til PDF](./image-to-pdf) til at konvertere alt i én batch. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [PNG til PDF](./png-to-pdf) +- [TIFF til PDF](./tiff-to-pdf) diff --git a/docs/da/tools/bookmark.md b/docs/da/tools/bookmark.md new file mode 100644 index 00000000..c1316899 --- /dev/null +++ b/docs/da/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Redigér bogmærker +description: Tilføj, redigér, importér, eksportér og slet PDF-bogmærker med en visuel editor og understøttelse af CSV/JSON. +--- + +# Redigér bogmærker + +Bogmærkeeditoren giver dig fuld kontrol over PDF'ens navigationsbogmærker (også kaldet konturer). Du kan tilføje nye bogmærker, redigere eksisterende, omorganisere hierarkiet og importere eller eksportere bogmærkedata i CSV- og JSON-format. + +## Sådan fungerer det + +1. Upload din PDF ved at klikke eller trække en fil ind i slipzonen. +2. Markér eventuelt **Udtræk eksisterende bogmærker automatisk** for at hente dokumentets nuværende bogmærketræ. +3. Editoren åbner med delt visning: PDF-fremviser til venstre, bogmærkepanel til højre. +4. Skriv en bogmærketitel og klik på **Tilføj til side** for at oprette et nyt bogmærke, der peger på den aktuelle side. +5. Brug værktøjslinjens knapper til at omarrangere, style eller slette bogmærker. +6. Klik på **Gem PDF med bogmærker** for at downloade den opdaterede fil. + +## Funktioner + +- Visuel PDF-fremviser med sidenavigation, zoomkontroller og gå-til-side-felt +- Tilføj bogmærker til enhver side med ét klik +- Klik direkte på PDF'en for at angive en præcis bogmærkedestination (udvælgelsestilstand) +- Indlejret bogmærkehierarki med omarrangering via træk og slip +- Batchhandlinger: vælg flere bogmærker for at ændre farve eller stil eller slette dem på én gang +- Bogmærkesøgning, så du hurtigt finder poster i store træer +- Fortryd og gentag for alle ændringer +- Importér bogmærker fra CSV (titel, side, niveau) eller JSON-filer +- Eksportér bogmærker til CSV eller JSON til redigering i andre programmer +- Bogmærkestil: farve (rød, blå, grøn, gul, lilla) og skrifttypestil (fed, kursiv, fed kursiv) +- Hurtig navigation: rul gennem siderne med side op/ned-tasterne + +## Indstillinger + +- **Udtræk eksisterende bogmærker automatisk**: Når den er markeret, læser og viser værktøjet PDF'ens nuværende bogmærker ved indlæsning. +- **Batchtilstand**: Slå til for at vælge flere bogmærker og anvende farve, stil eller sletning på dem samlet. +- **Udvid/skjul alle**: Vis eller skjul hurtigt indlejrede underbogmærker. + +## Anvendelser + +- Tilføj en indholdsfortegnelse til en lærebog eller manual uden bogmærker +- Omstrukturér bogmærker i et skannet dokument efter OCR-behandling +- Eksportér bogmærker til CSV, redigér dem i et regneark og importér dem igen +- Ryd op i automatisk genererede bogmærker med forkerte sidehenvisninger +- Tilføj farvede bogmærker for at markere vigtige afsnit i et juridisk notat + +## Tips + +- Brug CSV-import til oprettelse af mange bogmærker. Formatet er enkelt: `title,page,level`, hvor niveau 1 er øverste niveau. +- Udvælgelsestilstanden lader dig klikke på et præcist sted på PDF-siden for at angive bogmærkets destination, hvilket er mere præcist end blot at pege på et sidetal. +- Eksportér dine bogmærker, før du foretager store ændringer, så du har en sikkerhedskopi. + +## Relaterede værktøjer + +- [Indholdsfortegnelse](./table-of-contents) +- [PDF-editor](./edit-pdf) +- [Tilføj sideetiketter](./add-page-labels) diff --git a/docs/da/tools/cbz-to-pdf.md b/docs/da/tools/cbz-to-pdf.md new file mode 100644 index 00000000..cafcafb3 --- /dev/null +++ b/docs/da/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ til PDF +description: Konvertér CBZ- og CBR-tegneseriearkiver til PDF i din browser. Gratis, privat, ingen upload nødvendig. +--- + +# CBZ til PDF + +Gør tegneseriearkiver om til PDF'er. CBZ og CBR er standardformaterne til digitale tegneserier. De er blot ZIP- eller RAR-arkiver fyldt med billeder. Værktøjet udpakker hver side, bevarer læserækkefølgen og laver en ren PDF, hvor hvert billede bliver til en side i fuld størrelse. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----- | :---------- | :---------------------------------------------------------- | +| CBZ | `.cbz` | ZIP-baseret tegneseriearkiv (behandles lokalt med pdf-lib) | +| CBR | `.cbr` | RAR-baseret tegneseriearkiv (behandles via PyMuPDF-motoren) | + +CBZ-konverteren genkender JPEG-, PNG-, GIF-, BMP-, WebP-, AVIF-, TIFF-, HEIC- og JXL-billeder i arkivet. Ikke-standardformater konverteres automatisk til PNG, før de indlejres. + +## Sådan fungerer det + +1. Klik på uploadområdet eller træk og slip dine CBZ- eller CBR-filer. Du kan blande begge formater i en enkelt batch. +2. Gennemgå de viste filer. Fjern dem, du ikke har brug for, eller klik på **Tilføj flere filer** for at tilføje flere. +3. Klik på **Konvertér til PDF**. For CBZ-filer pakker værktøjet arkivet ud, sorterer billedfilerne efter navn i naturlig rækkefølge, registrerer hvert billedes faktiske format og indlejrer dem i en PDF med pdf-lib. CBR-filer sendes i stedet gennem PyMuPDF-motoren. +4. En enkelt fil downloades som en PDF. Flere filer giver et ZIP-arkiv ved navn `comic-converted.zip`. + +## Indstillinger + +Ingen konfiguration er nødvendig. Hvert billede bliver til en side med samme størrelse som originalen, så dobbeltsider forbliver brede, og enkeltsider forbliver smalle. + +## Anvendelser + +- Læs tegneserier på en tablet eller i en mobilapp, der understøtter PDF, men ikke CBZ/CBR +- Udskriv bestemte sider fra en digital tegneserie +- Arkivér en tegneseriesamling i et format, som enhver filfremviser kan åbne +- Del en tegneserie med en person, der ikke har en dedikeret tegneserielæser + +## Tips + +- Billeder i arkivet sorteres i naturlig rækkefølge (så `page2.jpg` kommer før `page10.jpg`). Giv dine filer ensartet nummerering for at få den rigtige siderækkefølge. +- Konverteren registrerer billedformater ud fra deres binære signaturer, ikke filendelser. En PNG, der ved en fejl hedder `.jpg`, indlejres stadig korrekt. +- CBZ-filer behandles helt i browseren uden at indlæse PyMuPDF-motoren, så de konverteres hurtigere end CBR-filer. + +## Relaterede værktøjer + +- [EPUB til PDF](./epub-to-pdf) +- [MOBI til PDF](./mobi-to-pdf) +- [Billeder til PDF](./image-to-pdf) diff --git a/docs/da/tools/change-permissions.md b/docs/da/tools/change-permissions.md new file mode 100644 index 00000000..cb814f09 --- /dev/null +++ b/docs/da/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Skift tilladelser +description: Angiv eller ændr PDF-brugstilladelser for udskrivning, kopiering, redigering og annotering. Bruger 256-bit AES-kryptering. +--- + +# Skift tilladelser + +Finjustér, hvad modtagerne kan gøre med din PDF. I modsætning til almindelig kryptering, der blot låser filen bag en adgangskode, lader dette værktøj dig selektivt tillade eller afvise udskrivning, kopiering, redigering, annotering, formularudfyldning, dokumentsammensætning og sideudtrækning, alt sammen håndhævet via 256-bit AES-kryptering. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Hvis PDF'en allerede er krypteret, skal du indtaste den **nuværende adgangskode**. +3. Angiv en **ny brugeradgangskode** (kræves for at åbne) og/eller en **ny ejeradgangskode** (styrer tilladelser). +4. Slå de enkelte tilladelser til eller fra med afkrydsningsfelterne. +5. Klik på **Skift tilladelser**. +6. Download den opdaterede PDF. + +Hvis du lader begge felter til nye adgangskoder stå tomme, dekrypterer værktøjet PDF'en helt og fjerner al kryptering og alle begrænsninger. + +## Tilladelseskontroller + +| Tilladelse | Hvad den styrer | +| -------------------------------- | ------------------------------------------------------ | +| **Tillad udskrivning** | Om dokumentet kan udskrives | +| **Tillad kopiering** | Om tekst og billeder kan markeres og kopieres | +| **Tillad ændring** | Om dokumentets indhold kan redigeres | +| **Tillad annotering** | Om kommentarer, fremhævninger og stempler kan tilføjes | +| **Tillad formularudfyldning** | Om interaktive formularfelter kan udfyldes | +| **Tillad dokumentsammensætning** | Om sider kan indsættes, slettes eller roteres | +| **Tillad sideudtrækning** | Om enkelte sider kan udtrækkes | + +Alle tilladelser kræver en ejeradgangskode for at blive håndhævet. Uden en ejeradgangskode ignoreres tilladelsesflagene af de fleste PDF-læsere. + +## Sådan fungerer tilladelser i PDF + +PDF-tilladelser er en del af krypteringsspecifikationen. De gemmes som bitflag i krypteringsordbogen og håndhæves af kompatible PDF-læsere. Den vigtige forskel: + +- **Brugeradgangskode**: Kræves for overhovedet at åbne filen. +- **Ejeradgangskode**: Kræves for at ændre tilladelser eller fjerne begrænsninger. Uden den styrer tilladelsesflagene, hvilke handlinger brugeren kan udføre. + +Hvis du kun angiver en ejeradgangskode (ingen brugeradgangskode), kan alle åbne filen, men de er begrænset til de tilladte handlinger. Hvis du angiver begge, kræver filen en adgangskode for at åbnes og er begrænset efter godkendelse. + +## Anvendelser + +- Distribuér en rapport, der kan ses og udskrives, men ikke redigeres eller kopieres +- Del en kontraktskabelon, som modtagerne kan udfylde, men ikke ændre +- Udgiv et PDF-katalog, hvor kopiering af billeder er deaktiveret +- Tillad annotering af et udkast til gennemgang, mens strukturelle ændringer forhindres + +## Tips + +- For at det virker, skal du altid angive en ejeradgangskode. Tilladelser uden ejeradgangskode kan ikke håndhæves. +- Nogle tredjeparts PDF-værktøjer ignorerer tilladelsesflag. For stærkere beskyttelse kan du overveje at rasterisere PDF'en eller bruge DRM. +- Brug dette værktøj til at opgradere gamle RC4-krypterede PDF'er til AES-256. + +## Relaterede værktøjer + +- [Kryptér PDF](./protect-pdf): enkel adgangskodebeskyttelse uden detaljerede tilladelser +- [Dekryptér PDF](./unlock-pdf): fjern kryptering helt +- [Fjern begrænsninger](./remove-restrictions): fjern alle begrænsninger, når du har ejeradgangskoden diff --git a/docs/da/tools/combine-single-page.md b/docs/da/tools/combine-single-page.md new file mode 100644 index 00000000..b68b637c --- /dev/null +++ b/docs/da/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Kombinér til én side +description: Sammensæt alle sider i en PDF til én sammenhængende lodret eller vandret rulleside. +--- + +# Kombinér til én side + +Flet hver side i en PDF til én enkelt, lang side. Siderne sættes sammen lodret (som en rulle) eller vandret (side om side), så resultatet er én sammenhængende side. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Vælg layoutretning: **Lodret** (sider stablet fra top til bund) eller **Vandret** (sider placeret side om side). +3. Angiv afstanden mellem siderne i punkter. +4. Vælg en baggrundsfarve til mellemrummene mellem siderne. +5. Aktivér eventuelt skillelinjer (tynde linjer mellem siderne) og indstil deres tykkelse og farve. +6. Klik på behandlingsknappen. Resultatet er en PDF med én side. + +## Funktioner + +- Lodret eller vandret sammensætning af sider +- Konfigurerbar afstand mellem siderne +- Farvevælger til baggrunden i mellemrummene +- Valgfrie skillelinjer med justerbar tykkelse og farve +- Gengiver hver oprindelig side i fuld opløsning på det kombinerede lærred + +## Indstillinger + +| Indstilling | Beskrivelse | +| -------------------------- | --------------------------------------------- | +| **Retning** | Lodret (stablet) eller vandret (side om side) | +| **Sideafstand** | Mellemrum mellem siderne i punkter | +| **Baggrundsfarve** | Farven på området mellem siderne | +| **Tilføj skillelinje** | Slå tynde linjer mellem siderne til eller fra | +| **Skillelinjens tykkelse** | Linjetykkelse i punkter | +| **Skillelinjens farve** | Farven på skillelinjerne | + +## Anvendelser + +- Lav ét langt billede ud fra en flersidet wireframe eller et designudkast +- Generér en sammenhængende rullevisning af et dokument til indlejring på nettet +- Sæt en flersidet tegneserie eller storyboard sammen til én strimmel +- Lav en panoramavisning af sider i rækkefølge til gennemgang + +## Tips + +- Lodret retning fungerer bedst til dokumenter med stående sider. Vandret er bedre til indhold i liggende format. +- Store dokumenter med mange sider giver et meget højt eller bredt resultat. Nogle PDF-fremvisere kan have problemer med ekstremt store enkeltsider. +- Skillelinjer i en kontrastfarve gør det let at se, hvor en oprindelig side slutter, og den næste begynder. + +## Relaterede værktøjer + +- [N-Up PDF](./n-up-pdf) +- [Flet PDF](./merge-pdf) +- [Opdel sider](./divide-pages) diff --git a/docs/da/tools/compare-pdfs.md b/docs/da/tools/compare-pdfs.md new file mode 100644 index 00000000..97380e87 --- /dev/null +++ b/docs/da/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Sammenlign PDF’er +description: Sammenlign to PDF-dokumenter side om side eller i overlejringstilstand med detaljeret registrering og kategorisering af ændringer. +--- + +# Sammenlign PDF’er + +Upload to PDF'er og se præcis, hvad der er ændret mellem dem. Værktøjet parrer sider intelligent, registrerer forskelle i tekst, billeder, annotationer, sidehoveder og formatering og viser dem i en side-om-side- eller overlejringsvisning. + +## Sådan fungerer det + +1. Upload to PDF-filer: originalen (til venstre) og den reviderede version (til højre). +2. Værktøjet parrer sider mellem dokumenterne ud fra indholdssignaturer. +3. Vælg en visningstilstand: **Side om side** eller **Overlejring**. +4. Naviger mellem sideparrene med sideinddelingskontrollerne. +5. Forskelle fremhæves og kategoriseres. Brug filterpanelet til at fokusere på bestemte typer ændringer. +6. Eksportér eventuelt sammenligningen som en PDF-rapport. + +## Funktioner + +- Automatisk sideparring baseret på indholdslighed +- Sammenligningsvisning side om side og som overlejring +- Kategorisering af ændringer: tekst, billede, sidehoved/sidefod, annotation, formatering, baggrund +- Filterkontakter pr. kategori til at vise eller skjule bestemte typer ændringer +- Søgning i tekstændringer med forespørgselsfilter +- OCR-understøttelse til sammenligning af skannede dokumenter +- Zoomkontroller til detaljeret gennemgang +- Synkroniseret rulning mellem panelerne i side-om-side-tilstand +- Eksportér sammenligningsresultater som PDF + +## Indstillinger + +| Indstilling | Beskrivelse | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| **Visningstilstand** | Side om side eller overlejring | +| **OCR** | Aktivér/deaktivér OCR til sammenligning af skannede dokumenter | +| **OCR-sprog** | Sprog til OCR-tekstudtræk | +| **Kategorifiltre** | Slå synligheden af ændringer i tekst, billeder, sidehoved/sidefod, annotationer, formatering og baggrund til eller fra | +| **Ændringsomfang** | I overlejringstilstand: filtrér mellem alle ændringer eller kun indhold | +| **Zoom** | Justér forstørrelsen til detaljeret gennemgang | + +## Anvendelser + +- Gennemgå kontraktrevisioner for at finde præcis, hvad der er ændret mellem versioner +- Sammenlign designudkast for at bekræfte, at PDF-eksporter lever op til forventningerne +- Revidér dokumentændringer i regulerede brancher, hvor hver redigering skal spores +- Kontrollér, at en PDF-konvertering har bevaret det oprindelige indhold korrekt +- Kontrollér oversatte dokumenter mod kilden for layoutændringer + +## Tips + +- Overlejringsvisningen stabler begge dokumenter oven på hinanden, så rumlige forskelle (forskudte elementer, ændrede billedstørrelser) straks er synlige. +- Aktivér OCR, når du sammenligner skannede dokumenter uden tekstlag. Sammenligningsmotoren udtrækker så tekst fra sidebillederne. +- Brug kategorifiltrene til at fokusere på det vigtige. Skjul for eksempel formateringsændringer, hvis du kun interesserer dig for forskelle i tekstindhold. + +## Relaterede værktøjer + +- [Vis metadata](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Flet PDF](./merge-pdf) diff --git a/docs/da/tools/compress-pdf.md b/docs/da/tools/compress-pdf.md new file mode 100644 index 00000000..b083b2a0 --- /dev/null +++ b/docs/da/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Komprimer PDF +description: Reducer PDF-filstørrelsen med op til 90 % med Hyper Compress-motoren. Understøtter målfilstørrelser, batchbehandling og tilpassede kvalitetsindstillinger. +--- + +# Komprimer PDF + +Gør dine PDF-filer mindre uden at ødelægge dem. Komprimer PDF drives af [Hyper Compress](https://www.bentopdf.com/hyper-compress), BentoPDF's egen komprimeringsmotor. Den genkomprimerer billeder, laver delmængder af skrifttyper og fletter dem og fjerner overflødig vægt som indlejrede miniaturebilleder og private programdata. PDF'en forbliver fuldt funktionel: tekst kan stadig markeres, og links og formularfelter virker fortsat. + +Hyper Compress er kompileret til WebAssembly og følger med BentoPDF, så komprimering virker offline og i isolerede (air-gapped) installationer uden ekstra opsætning. + +## Sådan fungerer det + +1. Upload en eller flere PDF'er ved at klikke på slipzonen eller trække filer ind. +2. Vælg et **komprimeringsniveau**: Lav, Medium, Høj eller Tabsfri. +3. Angiv eventuelt en **målfilstørrelse**, eller udvid **Brugerdefinerede indstillinger** for finjustering, herunder **Konvertér til gråtoner**. +4. Klik på **Komprimer PDF**. Ved flere filer får du en samlet ZIP-download. + +## Særlige dokumenter + +- **Digitalt signerede PDF'er** returneres uændrede, fordi enhver ændring ville ugyldiggøre signaturen. Slå **Tilsidesæt indholdsbeskyttelse** til under Brugerdefinerede indstillinger for at fjerne signaturerne og komprimere dem. Den synlige signatur bliver på siden, men filen er ikke længere signeret. +- **PDF/A-filer** mister deres PDF/A-mærkning efter komprimering, så filen aldrig hævder en overensstemmelse, den ikke længere opfylder. Slå **Bevar PDF/A** til under Brugerdefinerede indstillinger for i stedet at beholde filens overensstemmelse. +- **Adgangskodebeskyttede PDF'er** får et adgangskodefelt på deres filkort. Indtast adgangskoden dér, så åbner Hyper Compress selv filen, uden separat oplåsningstrin. Med to eller flere låste filer låser ét fælles felt alle filer op, som bruger samme adgangskode. Den komprimerede kopi har ingen adgangskode. Brug [Kryptér PDF](./protect-pdf) til at tilføje en igen. +- **Scanninger uden tekstlag** kan blive endnu mindre med **Rasterisér sider** under Brugerdefinerede indstillinger, som erstatter hver side med ét optimeret billede. Det springes over for dokumenter med markérbar tekst, herunder OCR-behandlede scanninger, medmindre **Tilsidesæt indholdsbeskyttelse** er slået til. Så bliver tekstsider også til billeder, så tekst ikke længere kan markeres, og links holder op med at virke. + +## Komprimeringsniveauer + +| Niveau | Billedkvalitet | Maks. opløsning | Bedst til | +| ----------- | -------------- | --------------- | ------------------------------- | +| **Lav** | 80 | 200 DPI | Bevarelse af visuel kvalitet | +| **Mellem** | 50 | 150 DPI | Dagligdags dokumenter | +| **Høj** | 20 | 72 DPI | E-mail-vedhæftninger, webupload | +| **Tabsfri** | Billeder urørt | Uændret | Arkivkopier | + +Høj fjerner også indlejringen af de 14 standardskrifttyper i PDF samt lignende skrifttyper som Arial, når det er sikkert. + +## Målfilstørrelse + +Angiv en størrelse i KB eller MB, og Hyper Compress søger efter den bedste billedkvalitet, der stadig passer, med udgangspunkt i det valgte niveau. Hvis dokumentet ikke kan blive så lille, får du den mindste version, det kan lave, og en besked om det. De dedikerede sider som [Komprimer PDF til 1 MB](https://www.bentopdf.com/compress-pdf-to-1mb) åbner med målet allerede udfyldt. + +## Brugerdefinerede indstillinger + +Udvid panelet Brugerdefinerede indstillinger for at justere Hyper Compress direkte. Når du vælger et komprimeringsniveau, nulstilles disse til det niveaus værdier, og hvis du ændrer en af dem, skifter niveauet til Brugerdefineret. + +- **Tilsidesæt indholdsbeskyttelse**: Som standard lader Hyper Compress signerede PDF'er være urørte og rasteriserer ikke sider med tekst. Når den slås til, springes begge over. Den forbliver slået til, når du skifter niveau. + +- **Billeder**: billedkvalitet, maksimal opløsning, gennemtvunget gensampling, farvereduktion, beskæring af usynlige billedområder, fjernelse af alternative billeder, forenkling af farveprofiler, JPEG 2000 og tabsfri tilstand +- **Skrifttyper**: delmængder, sammenfletning af dubletter og fjernelse af indlejring af standardskrifttyper og deres lignende +- **Indhold**: fladning af annotationer, formularfelter eller links +- **Oprydning**: fjernelse af miniaturebilleder, programdata, artikeltråde, weboptagelsesoplysninger, strukturtræet eller outputhensigter +- **Rasterisér**: erstatning af sider med billeder til scanninger, der kun består af billeder. Springes over, når dokumentet har markérbar tekst +- **Output**: Bevar PDF/A og Brotli-komprimering til PDF 2.0-læsere, der understøtter det + +## Anvendelser + +- Få en rapport på 50 MB under grænsen for e-mail-vedhæftninger +- Få en scanning under en portals strenge uploadgrænse med en målfilstørrelse +- Optimér marketing-PDF'er til hurtigere downloads fra et website +- Arkivér store dokumentsamlinger, hvor lageromkostninger har betydning +- Reducér mobildataforbruget, når du deler PDF'er via beskedapps + +## Tips + +- Start med Medium. Hvis resultatet stadig er for stort, kan du angive en målfilstørrelse eller gå op til Høj. +- For en scanning uden tekstlag kan du slå Rasterisér sider til under Brugerdefinerede indstillinger. +- Konvertér til gråtoner under Brugerdefinerede indstillinger kan skære i filstørrelsen for farvetunge dokumenter. + +## Relaterede værktøjer + +- [Lineariser PDF](./linearize-pdf): optimér den komprimerede PDF til hurtig visning på nettet +- [Rasterisér PDF](./rasterize-pdf): konvertér sider til billeder ved en bestemt DPI, også sider med tekst +- [Reparér PDF](./repair-pdf): ret en PDF, der gik i stykker under komprimering andetsteds +- [Fjern metadata](./remove-metadata): fjern skjulte data af hensyn til privatlivet diff --git a/docs/da/tools/crop-pdf.md b/docs/da/tools/crop-pdf.md new file mode 100644 index 00000000..59d7058f --- /dev/null +++ b/docs/da/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Beskær PDF +description: Beskær PDF-sider visuelt ved at tegne et beskæringsområde på hver side i en editor drevet af Cropper.js. +--- + +# Beskær PDF + +Trim marginerne på dine PDF-sider med en visuel beskæringsgrænseflade. Tegn et beskæringsrektangel direkte på hver side, forhåndsvis resultatet og anvend beskæringen. Du kan angive forskellige beskæringsområder for forskellige sider eller anvende den samme beskæring på hele dokumentet. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Beskæringseditoren åbner og viser første side med et trækbart beskæringsoverlay. +3. Justér beskæringsrektanglet ved at trække i dets kanter eller hjørner. +4. Brug sidenavigationsknapperne til at skifte mellem sider og angive beskæringsområder for hver enkelt. +5. Klik på **Beskær** for at anvende beskæringen og downloade resultatet. + +## Funktioner + +- Visuel beskæringseditor drevet af Cropper.js med håndtag til præcis justering +- Navigation side for side til at angive individuelle beskæringsområder +- Gemmer beskæringsindstillinger pr. side, så du kan definere forskellige beskæringer for forskellige sider +- Live-forhåndsvisning af det valgte beskæringsområde +- Understøtter PDF'er i enhver sidestørrelse og retning + +## Anvendelser + +- Fjern brede margener fra skannede dokumenter for at fokusere på indholdsområdet +- Trim printerens beskæringsmærker eller registreringsmærker fra PDF'er til prepress +- Beskær forelæsningsslides for at fjerne området med oplægsholderens noter +- Fjern sidehoveder eller sidefødder fra hver side, før du deler et uddrag af et dokument +- Tilpas sidestørrelsen til en bestemt visning eller et bestemt udskriftslayout + +## Tips + +- Beskæringsoverlayet kan frit ændres i størrelse og flyttes. Træk i hjørnerne for proportional størrelsesændring eller i kanterne for justering på én akse. +- Hvis alle sider skal have samme beskæring, kan du angive den på første side. Værktøjet husker dit beskæringsområde, mens du navigerer mellem siderne. +- Hvis du vil standardisere sidestørrelser frem for at beskære visuelt, passer værktøjet Ret sidestørrelse muligvis bedre. + +## Relaterede værktøjer + +- [PDF-editor](./edit-pdf) +- [Sidetal](./page-numbers) +- [Fjern tomme sider](./remove-blank-pages) diff --git a/docs/da/tools/csv-to-pdf.md b/docs/da/tools/csv-to-pdf.md new file mode 100644 index 00000000..5a923bce --- /dev/null +++ b/docs/da/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV til PDF +description: Konvertér CSV-regnearksfiler til formaterede PDF-tabeller direkte i din browser. +--- + +# CSV til PDF + +Gør CSV-filer om til rene, formaterede PDF-dokumenter. Hver CSV-fil fortolkes og gengives som en tabel i PDF'en. Det er nyttigt, når du skal udskrive eller dele tabeldata uden at modtageren behøver regnearksprogrammer. + +## Understøttede formater + +| Format | Filtypenavne | +| :----- | :----------- | +| CSV | `.csv` | + +## Sådan fungerer det + +1. Klik på uploadområdet eller træk og slip en eller flere CSV-filer. +2. Gennemgå fillisten. Tilføj flere filer eller fjern uønskede. +3. Klik på **Konvertér til PDF**. En statusindikator viser konverteringens fremdrift. +4. En enkelt fil downloades direkte som PDF. Flere filer pakkes i `csv-converted.zip`. + +## Indstillinger + +Dette værktøj har ingen yderligere konfiguration. CSV-filen fortolkes og formateres automatisk som en tabel. + +## Output + +| Antal input | Output | +| :---------- | :------------------------------------------------- | +| 1 fil | Download af en enkelt PDF (f.eks. `data.pdf`) | +| 2+ filer | ZIP-arkiv (`csv-converted.zip`) med én PDF pr. fil | + +## Anvendelser + +- Konvertér eksporterede databaserapporter til udskrivbare PDF-tabeller +- Del økonomidata eller lagerlister med personer, der ikke har Excel +- Opret PDF-versioner af CSV-logfiler til compliance-dokumentation +- Udskriv adresselister, karakterark eller andre tabeldata gemt som CSV + +## Tips + +- For de bedste resultater bør din CSV bruge standard kommaseparatorer. Værktøjet følger almindelige CSV-konventioner. +- Hvis din CSV har mange kolonner, kan tabellen blive presset sammen for at passe til sidebredden. Overvej at dele brede datasæt op i flere filer. +- Til Excel-filer (`.xls`, `.xlsx`) kan du bruge værktøjet [Excel til PDF](./excel-to-pdf), som bevarer regnearksformatering og flere ark. + +## Relaterede værktøjer + +- [Excel til PDF](./excel-to-pdf) +- [Tekst til PDF](./txt-to-pdf) +- [JSON til PDF](./json-to-pdf) diff --git a/docs/da/tools/delete-pages.md b/docs/da/tools/delete-pages.md new file mode 100644 index 00000000..0923b711 --- /dev/null +++ b/docs/da/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Slet sider +description: Fjern bestemte sider fra en PDF efter sidetal, interval eller visuelt valg af miniaturer. +--- + +# Slet sider + +Fjern uønskede sider fra et PDF-dokument. Angiv sider, der skal slettes, ved at skrive sidetal eller intervaller, eller klik direkte på sidernes miniaturer for at markere dem til fjernelse. + +## Sådan fungerer det + +1. Upload en PDF-fil. Værktøjet gengiver miniaturer af hver side. +2. Indtast de sider, der skal slettes, i tekstfeltet med intervalsyntaks (f.eks. `2, 5-8`), eller klik på miniaturer for at skifte dem. +3. Markerede sider fremhæves visuelt, så du kan bekræfte dit valg. +4. Klik på behandlingsknappen. Der oprettes en ny PDF uden de valgte sider. + +## Funktioner + +- Tekstbaseret sidevalg med intervalsyntaks (`2, 5-8, 12`) +- Visuelt miniaturegitter til sletning med klik +- Fremhævning i realtid af sider, der er markeret til sletning +- Inputvalidering mod det faktiske antal sider +- Bevarer alle ikke-slettede sider i deres oprindelige rækkefølge + +## Anvendelser + +- Fjern tomme sider eller fyldsider fra et skannet dokument +- Fjern forsider eller bilag, før du deler et dokument +- Ryd op i udkastsider, der ved en fejl blev liggende i en endelig PDF +- Fjern sider med følsomme oplysninger før distribution + +## Tips + +- Sletning af sider påvirker ikke de resterende siders indhold eller formatering. Resultatet er en tro kopi af originalen minus de fjernede sider. +- Hvis du vil beholde bestemte sider i stedet for at fjerne bestemte sider, er [Udtræk sider](./extract-pages) et bedre valg. +- Miniaturevisningen indlæses løbende, så store dokumenter forbliver responsive. + +## Relaterede værktøjer + +- [Udtræk sider](./extract-pages) +- [Duplikér og organisér](./organize-pdf) +- [Opdel PDF](./split-pdf) diff --git a/docs/da/tools/deskew-pdf.md b/docs/da/tools/deskew-pdf.md new file mode 100644 index 00000000..6002b153 --- /dev/null +++ b/docs/da/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Ret skæve sider +description: Ret automatisk skæve sider i skannede PDF'er med OpenCV-skævhedsregistrering. Justerbar tærskel og DPI. +--- + +# Ret skæve sider + +Skannede dokumenter er sjældent helt lige. Selv en lille hældning gør OCR mindre præcis og udskrifter sjuskede. Dette værktøj bruger OpenCV's billedbehandlingsalgoritmer til at registrere hver sides skævhedsvinkel og dreje den tilbage, så den står lige. + +## Sådan fungerer det + +1. Upload en eller flere skannede PDF'er. +2. Angiv **skævhedstærsklen**: sider med registreret skævhed under denne værdi røres ikke. +3. Vælg en **behandlingskvalitet (DPI)**: højere DPI giver mere præcis registrering, men tager længere tid. +4. Klik på **Ret skæve sider**. +5. Efter behandlingen viser et resultatpanel hver sides registrerede vinkel, og om den blev rettet. + +## Indstillinger + +| Indstilling | Værdier | Standard | +| ------------------- | ------------------------- | -------- | +| **Skævhedstærskel** | 0,1, 0,5, 1,0, 2,0 grader | 0,5 | +| **Behandlings-DPI** | 100, 150, 200, 300 | 150 | + +## Sådan fungerer skævhedsregistrering + +Værktøjet gengiver hver side som et billede ved den valgte DPI og bruger derefter OpenCV til at registrere de dominerende linjevinkler i indholdet. Hvis den registrerede skævhed overstiger tærsklen, drejes siden med den omvendte vinkel for at rette den. Sider under tærsklen sendes uændrede igennem. + +## Anvendelser + +- Ryd op i batchskannede kontrakter eller juridiske dokumenter +- Forbered skannede kvitteringer eller fakturaer til OCR-behandling +- Ret sider fra en flatbed-scanner, hvor papiret er lagt forskelligt +- Forbedr den visuelle kvalitet af digitaliseret arkivmateriale + +## Tips + +- Sæt tærsklen ned til 0,1 grader, hvis du har brug for pixelpræcis justering til OCR. +- 150 DPI er hurtigt og præcist til de fleste dokumenter. Brug 300 DPI til meget lille tekst eller sider med fine detaljer. +- Retning af skæve sider virker bedst på dokumenter med tydelige vandrette tekstlinjer. Det kan have svært ved sider, der mest består af billeder eller diagonale designelementer. + +## Relaterede værktøjer + +- [Rasterisér PDF](./rasterize-pdf): konvertér det rettede resultat til en flad, billedbaseret PDF +- [Komprimer PDF](./compress-pdf): reducer filstørrelsen efter retning +- [Reparér PDF](./repair-pdf): ret strukturelle problemer i skannede PDF'er diff --git a/docs/da/tools/digital-sign-pdf.md b/docs/da/tools/digital-sign-pdf.md new file mode 100644 index 00000000..5bc188a9 --- /dev/null +++ b/docs/da/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Digital signatur +description: Tilføj kryptografiske digitale signaturer til PDF'er med X.509-certifikater. Understøtter PKCS#12- og PEM-formater med valgfri synlig signatur. +--- + +# Digital signatur + +En digital signatur er kryptografisk bevis for, at en bestemt person har underskrevet et dokument, og at dokumentet ikke er ændret siden. I modsætning til en tegnet underskrift (som blot er et billede) bruger en digital signatur X.509-certifikater og PKCS#7-standarder til at give verificerbar ægthed og integritet. + +BentoPDF anvender digitale signaturer helt i din browser. Din private nøgle forlader aldrig din enhed. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Upload din certifikatfil (.pfx, .p12 eller .pem). +3. Indtast certifikatets adgangskode for at låse det op. Værktøjet viser certifikatets emne, udsteder og gyldighedsperiode. +4. Konfigurér eventuelt signaturmetadata (årsag, sted, kontaktoplysninger). +5. Aktivér eventuelt en **synlig signatur** med tilpasning af position, størrelse, billede og tekst. +6. Klik på **Underskriv PDF**. + +## Understøttede certifikatformater + +| Format | Filendelser | Beskrivelse | +| ----------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Branchestandard-pakke med den private nøgle og certifikatkæden. Det mest almindelige format. | +| **PEM** | .pem | Tekstbaseret format. Skal indeholde både certifikatet og den private nøgle i én fil. Understøtter krypterede private nøgler. | + +## Indstillinger for synlig signatur + +Når den er aktiveret, gengives en synlig signaturblok på PDF-siden: + +- **Position**: X/Y-koordinater samt bredde/højde i punkter +- **Side**: Første side, sidste side, alle sider eller et bestemt sidetal +- **Billede**: Upload et PNG-, JPG- eller WebP-billede (din håndskrevne underskrift, virksomhedsstempel osv.) +- **Tekst**: Brugerdefineret tekst med konfigurerbar farve og skriftstørrelse. Hvis der ikke angives billede eller tekst, genererer værktøjet automatisk tekst ud fra certifikatets almindelige navn og den aktuelle dato. + +## Signaturmetadata + +- **Årsag**: Hvorfor dokumentet blev underskrevet (f.eks. "Godkendt", "Gennemgået") +- **Sted**: Hvor underskrivelsen fandt sted (f.eks. "New York, NY") +- **Kontaktoplysninger**: Hvordan underskriveren kan kontaktes (f.eks. e-mailadresse) + +## Note om internetforbindelse + +Underskrivning kan kræve en internetforbindelse. Signaturbiblioteket henter certifikatkæden fra URL'er, der er indlejret i dit certifikats AIA-udvidelse (Authority Information Access). Hvis disse servere ikke kan nås, mislykkes underskrivningen for certifikater, der kræver kædevalidering. + +## Anvendelser + +- Underskriv kontrakter, tilbud og aftaler med juridisk bindende digitale signaturer +- Certificér officielle dokumenter i arbejdsgange, der kræver PKI-baseret autentificering +- Underskriv PDF-fakturaer af hensyn til lovgivningsmæssig overholdelse (mange EU-lande kræver digitalt signerede e-fakturaer) +- Tilføj organisatorisk godkendelse til tekniske tegninger eller kvalitetsdokumenter + +## Tips + +- Selvsignerede certifikater fungerer til test, men viser advarsler i Adobe Reader. Brug et certifikat fra en betroet certifikatudsteder til produktionsdokumenter. +- Den synlige signatur er rent visuel. Den kryptografiske signatur indlejres, uanset om den synlige blok er aktiveret. +- Verificér din signerede PDF med værktøjet Validér signatur for at bekræfte, at signaturen er intakt. + +## Relaterede værktøjer + +- [Validér signatur](./validate-signature-pdf): verificér digitale signaturer i signerede PDF'er +- [Fladgør PDF](./flatten-pdf): flad formularer ud før underskrivning for at forhindre ændringer +- [Kryptér PDF](./protect-pdf): tilføj adgangskodebeskyttelse oven på den digitale signatur +- [Fjern metadata](./remove-metadata): fjern metadata før underskrivning diff --git a/docs/da/tools/divide-pages.md b/docs/da/tools/divide-pages.md new file mode 100644 index 00000000..5bb3e9d1 --- /dev/null +++ b/docs/da/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Opdel sider +description: Opdel PDF-sider vandret eller lodret i mindre delsider. +--- + +# Opdel sider + +Skær enkelte PDF-sider i halvdele ved at opdele dem vandret eller lodret. Det er nyttigt, når en enkelt side indeholder indhold, der bør adskilles på særskilte sider, for eksempel et tospaltet layout skannet som én bred side. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Vælg opdelingsretning: **Lodret** (venstre/højre halvdel) eller **Vandret** (øverste/nederste halvdel). +3. Angiv eventuelt et sideinterval for at begrænse, hvilke sider der opdeles. Lad feltet stå tomt for at opdele alle sider. +4. Klik på behandlingsknappen for at generere den opdelte PDF. + +## Funktioner + +- Lodret opdeling: deler hver side i en venstre og en højre halvdel +- Vandret opdeling: deler hver side i en øverste og en nederste halvdel +- Sideintervalfilter til selektiv opdeling af bestemte sider +- Sider uden for udvalget sendes uændrede igennem +- Bevarer indholdskvaliteten uden at gengive siderne igen + +## Anvendelser + +- Adskil to-op-scannede sider (f.eks. en bogscanning med venstre og højre side på ét ark) +- Opdel en liggende PDF med side-om-side-indhold i individuelle stående sider +- Del høje infografikker eller plakater i separate øvre og nedre sektioner +- Forbered bredformatdokumenter til udskrivning på standardpapir + +## Tips + +- Hvis indholdet på dine sider er ujævnt fordelt, sker opdelingen stadig præcis på midten. Til asymmetriske opdelinger kan du overveje [Beskær PDF](./crop-pdf) i stedet. +- Kombinér dette værktøj med [Roter PDF](./rotate-pdf), hvis dine sider skal roteres før eller efter opdelingen. + +## Relaterede værktøjer + +- [Opdel PDF](./split-pdf) +- [Beskær PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Posterisér PDF](./posterize-pdf) diff --git a/docs/da/tools/duplex-collate.md b/docs/da/tools/duplex-collate.md new file mode 100644 index 00000000..b48c2ef6 --- /dev/null +++ b/docs/da/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Sortér dupleks-scanning +description: Omsortér dupleks-scannede PDF'er, hvor forsider og bagsider ligger i separate blokke, til korrekt for-/bagside-rækkefølge. +--- + +# Sortér dupleks-scanning + +Sortér dupleks-scanning er designet til ADF-scanningsarbejdsgange, hvor én PDF indeholder to blokke af sider: + +- først alle forsider +- derefter alle bagsider + +I stedet for manuelt at dele og samle igen fletter dette værktøj de to blokke til naturlig læserækkefølge: forside1, bagside1, forside2, bagside2 og så videre. + +## Sådan fungerer det + +1. Upload en enkelt PDF, der er oprettet ved scanning af en dupleksstak. +2. Angiv delingspunktet, hvor forsideblokken slutter. +3. Vælg håndtering af bagsideblokken: + - **Vend bagsideblokken** (almindeligt, når stakken vendes, før bagsiderne scannes) + - **Behold bagsideblokken som den er** +4. Klik på **Sortér PDF** for at downloade det omsorterede resultat. + +## Indstillinger + +- **Registrér deling automatisk (halvdelen)**: sætter delingspunktet til `ceil(totalPages / 2)`. +- **Advarsel om ulige sidetal**: advarer, når det samlede antal sider er ulige (ofte en scanningsfejl). +- **Bekræftelse ved ujævne blokke**: beder om bekræftelse, når forside- og bagsideblokkene har forskellig størrelse. +- **Grupperet eksport**: del det sorterede output i separate PDF'er ud fra det oprindelige dokuments sideantal og download som ZIP. + +## Outputadfærd + +- **Standard**: én output-PDF (én input-PDF giver én output-PDF). +- **Grupperet tilstand**: outputtet opdeles efter din værdi for sider pr. dokument. Hvis der dannes flere bidder, downloades de som én ZIP, ellers downloades en enkelt PDF. + +Hvis blokkene er ujævne, sorteres de parrede sider først, og de resterende uparrede sider sættes til sidst. + +## Almindelige anvendelser + +- Gendan rækkefølgen efter scanning af en bunke dobbeltsidede formularer i to omgange. +- Genopbyg for-/bagside-pakker fra kontorscannere, der udskriver alle forsider og derefter alle bagsider. +- Efterbehandl arkivscanninger, før de deles op i filer pr. dokument. + +## Tips + +- De fleste dupleksbatches bør have et lige samlet sidetal. +- Hvis bagsiderne ser omvendt ud i resultatet, så skift mellem **Vend bagsideblokken** og **Behold bagsideblokken som den er**. +- Til originaler på 2 sider (forside+bagside) bruges grupperet eksport med `2` sider pr. dokument. + +## Relaterede værktøjer + +- [Alternér og miks sider](./alternate-merge) +- [Opdel PDF](./split-pdf) +- [Flet PDF](./merge-pdf) +- [Duplikér og organisér](./organize-pdf) diff --git a/docs/da/tools/edit-attachments.md b/docs/da/tools/edit-attachments.md new file mode 100644 index 00000000..e000e972 --- /dev/null +++ b/docs/da/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Redigér vedhæftninger +description: Se og fjern selektivt filvedhæftninger, der er indlejret i et PDF-dokument. +--- + +# Redigér vedhæftninger + +Undersøg og administrér filvedhæftningerne i en PDF. Værktøjet viser hver indlejret fil med navn og vedhæftningsniveau og lader dig derefter markere enkelte vedhæftninger til fjernelse eller fjerne dem alle på én gang. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Værktøjet scanner automatisk efter vedhæftninger og viser dem på en liste. +3. Hver vedhæftning viser sit filnavn, og om den er en vedhæftning på dokumentniveau eller sideniveau. +4. Klik på papirkurvsikonet ved en vedhæftning for at markere den til fjernelse (klik igen for at fjerne markeringen). +5. Brug knappen **Fjern alle vedhæftninger** til at vælge alt på én gang, eller **Fravælg alle** for at rydde dine valg. +6. Klik på behandlingsknappen for at gemme en ny PDF uden de valgte vedhæftninger. + +## Funktioner + +- Viser alle vedhæftninger på dokumentniveau og sideniveau +- Fjernelse af enkelte eller alle vedhæftninger +- Slå valg til og fra, før du bekræfter ændringerne +- Visuel gennemstregning og ændret gennemsigtighed på elementer markeret til fjernelse +- Downloader den ændrede PDF uden de valgte vedhæftninger + +## Anvendelser + +- Fjern forældede eller forkerte filer indlejret i et dokument, før det distribueres igen +- Fjern følsomme vedhæftninger (økonomidata, personoplysninger) fra en PDF, før du deler den +- Reducér PDF-filstørrelsen ved at fjerne store indlejrede filer, der ikke længere er nødvendige +- Gennemgå indlejret indhold og ryd op i et dokument, før det arkiveres + +## Tips + +- Vedhæftninger markeret til fjernelse vises med gennemstregning. Du kan slå markeringen fra igen, før du behandler, hvis du ombestemmer dig. +- Hvis der ikke findes vedhæftninger, viser værktøjet en tydelig besked om "Ingen vedhæftninger fundet". PDF'en indeholder så ganske enkelt ingen indlejrede filer. + +## Relaterede værktøjer + +- [Tilføj vedhæftninger](./add-attachments) +- [Udtræk vedhæftninger](./extract-attachments) +- [Vis metadata](./view-metadata) diff --git a/docs/da/tools/edit-metadata.md b/docs/da/tools/edit-metadata.md new file mode 100644 index 00000000..ee37623e --- /dev/null +++ b/docs/da/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Redigér metadata +description: Se og ændr PDF-metadatafelter, herunder titel, forfatter, nøgleord, datoer og brugerdefinerede egenskaber. +--- + +# Redigér metadata + +Redigér de metadata, der er indlejret i en PDF-fil. Værktøjet udfylder en formular på forhånd med dokumentets eksisterende metadata, lader dig ændre ethvert felt og gemmer ændringerne i en ny PDF. + +## Sådan fungerer det + +1. Upload en PDF-fil. Værktøjet læser de nuværende metadata og udfylder formularen. +2. Redigér et af standardfelterne: Titel, Forfatter, Emne, Nøgleord, Opretter, Producent. +3. Justér oprettelsesdato og ændringsdato med dato- og tidsvælgerne. +4. Tilføj brugerdefinerede metadatafelter ved at klikke på tilføjknappen og indtaste et nøgle-værdi-par. +5. Klik på behandlingsknappen for at gemme den ændrede PDF. + +## Funktioner + +- Udfylder automatisk alle eksisterende metadata fra den uploadede PDF +- Standardfelter: Titel, Forfatter, Emne, Nøgleord, Opretter, Producent +- Dato- og tidsvælgere til oprettelsesdato og ændringsdato +- Brugerdefinerede nøgle-værdi-felter til vilkårlige egenskaber +- Gemmer ændringerne direkte i PDF'ens dokumentinfo-ordbog + +## Redigerbare felter + +| Felt | Beskrivelse | +| --------------------------- | ---------------------------------------------------------- | +| **Titel** | Dokumenttitlen, der vises i PDF-læsere | +| **Forfatter** | Den person eller organisation, der har oprettet dokumentet | +| **Emne** | En kort beskrivelse af dokumentets emne | +| **Nøgleord** | Kommaseparerede termer til søgning og kategorisering | +| **Opretter** | Programmet, der oprindeligt oprettede indholdet | +| **Producent** | Programmet, der genererede PDF'en | +| **Oprettelsesdato** | Hvornår dokumentet oprindeligt blev oprettet | +| **Ændringsdato** | Hvornår dokumentet sidst blev ændret | +| **Brugerdefinerede felter** | Alle yderligere nøgle-værdi-par, du definerer | + +## Anvendelser + +- Angiv en korrekt titel og forfatter, før et dokument udgives +- Tilføj nøgleord for at forbedre søgbarheden i dokumenthåndteringssystemer +- Opdatér ændringsdatoen, så den afspejler den aktuelle revision +- Tilføj brugerdefinerede metadatafelter som Afdeling, Projekt-id eller Klassifikation +- Ryd op i metadata, som det oprindelige forfatterprogram har efterladt + +## Tips + +- Brugerdefinerede felter skrives direkte i PDF'ens infoordbog. Nogle PDF-læsere viser dem muligvis ikke, men de bevares i filen. +- Lad et felt stå tomt for at rydde det fra metadata. Behandlingsknappen gemmer det, der står i formularen. +- Brug [Vis metadata](./view-metadata) for at se metadata uden at redigere. Brug Fjern metadata for at fjerne alle metadata helt. + +## Relaterede værktøjer + +- [Vis metadata](./view-metadata) +- [PDF OCG-lag](./pdf-layers) +- [Komprimer PDF](./compress-pdf) diff --git a/docs/da/tools/edit-pdf.md b/docs/da/tools/edit-pdf.md new file mode 100644 index 00000000..bebde56e --- /dev/null +++ b/docs/da/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF-editor +description: Annotér, fremhæv, redigér ud (redaktion), tilføj figurer og billeder, søg og se PDF'er direkte i din browser. +--- + +# PDF-editor + +BentoPDF's PDF-editor lader dig annotere, fremhæve, redigere ud, kommentere, tilføje figurer og billeder og søge i dine PDF'er. Den indlæser en fuldt udstyret editor direkte i din browser uden serveruploads. + +## Sådan fungerer det + +1. Upload din PDF ved at klikke på slipzonen eller trække en fil hen på den. +2. Den indlejrede PDF-editor åbner automatisk med dit dokument indlæst. +3. Brug værktøjslinjen til at annotere, fremhæve, redigere ud, tilføje tekst, tegne figurer eller indsætte billeder. +4. Klik på **Download redigeret PDF** for at gemme dine ændringer. + +## Funktioner + +- Fuld annotationsværktøjslinje med fremhævning, understregning, gennemstregning og frihåndstegning +- Tekstindsættelse og kommentarer +- Redaktionsværktøjer, der permanent fjerner markeret indhold, når du anvender redaktionen. Hvis nogle markeringer ikke er anvendt, når du klikker på **Download redigeret PDF**, tilbyder editoren at anvende dem først. +- Figurværktøjer til rektangler, cirkler, linjer og pile +- Indsættelse af billeder på PDF-sider +- Indbygget tekstsøgning i hele dokumentet +- Understøttelse af flere dokumenter med faner (op til 10 dokumenter åbne samtidig) +- Indlæsning af filer med træk og slip + +## Anvendelser + +- Gennemgå kontrakter og markér ændringer med fremhævninger og kommentarer +- Rediger fortrolige oplysninger som cpr-numre eller økonomidata ud, før du deler dokumentet +- Tilføj annotationer til arkitekttegninger eller tekniske tegninger +- Indsæt virksomhedslogoer eller stempler på dokumentsider +- Søg efter bestemte termer i lange juridiske dokumenter + +## Tips + +- Du kan åbne flere PDF'er på én gang og skifte mellem dem med fanelinjen øverst i editoren. +- Editoren bevarer den oprindelige PDF-struktur, så skrifttyper, layout og formularfelter forbliver intakte. +- Når du markerer tekst eller et område til redaktion, fjernes intet, før redaktionen anvendes. Når du redigerer markeret tekst ud, fjernes også kopier af den i filens egenskaber, bogmærker, kommentarer og vedhæftninger fra downloaden, medmindre filen er krypteret. +- Til masse-vandmærkning eller sidenummerering bør du bruge de dedikerede værktøjer for bedre kontrol over formateringen. + +## Relaterede værktøjer + +- [Tilføj vandmærke](./add-watermark) +- [Underskriv PDF](./sign-pdf) +- [Tilføj stempler](./add-stamps) +- [Fjern annotationer](./remove-annotations) diff --git a/docs/da/tools/email-to-pdf.md b/docs/da/tools/email-to-pdf.md new file mode 100644 index 00000000..edd48425 --- /dev/null +++ b/docs/da/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-mail til PDF +description: Konvertér EML- og MSG-e-mailfiler til PDF i din browser. Bevarer headere, brødtekst og vedhæftningsliste. +--- + +# E-mail til PDF + +Konvertér gemte e-mailfiler til rene, udskrivbare PDF'er. Værktøjet fortolker EML- og MSG-filer, udtrækker hele beskeden (headere, brødtekst og metadata om vedhæftninger) og gengiver det hele i en struktureret PDF. Nyttigt til juridisk bevisindsamling, journalføring eller blot til at udskrive en vigtig e-mail. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----- | :---------- | :---------------------------------------------------------------------- | +| EML | `.eml` | Standard MIME-e-mailformat (eksporteres fra de fleste e-mailprogrammer) | +| MSG | `.msg` | Microsoft Outlooks proprietære format | + +## Sådan fungerer det + +1. Klik på uploadområdet eller træk og slip dine EML- eller MSG-filer. Du kan blande begge formater i en enkelt batch. +2. Gennemgå fillisten. Fjern uønskede poster med papirkurvsikonet, eller klik på **Tilføj flere filer** for at medtage flere e-mails. +3. Konfigurér konverteringsindstillingerne (se nedenfor). +4. Klik på **Konvertér til PDF**. Værktøjet fortolker hver e-mail, gengiver indholdet som formateret HTML og konverterer det til PDF via PyMuPDF-motoren. +5. En enkelt e-mail downloades direkte som PDF. Flere e-mails pakkes i `emails-converted.zip`. + +## Indstillinger + +| Indstilling | Standard | Beskrivelse | +| :--------------------------- | :------- | :---------------------------------------------------------------------------------------------------------- | +| **Sidestørrelse** | A4 | Vælg mellem A4-, Letter- eller Legal-sidemål. | +| **Medtag CC og BCC** | Til | Når den er aktiveret, vises CC- og BCC-modtagerlister i e-mailens headerafsnit i PDF'en. | +| **Medtag vedhæftningsliste** | Til | Når den er aktiveret, vises en liste over e-mailens filvedhæftninger (med filnavne og størrelser) i PDF'en. | + +## Anvendelser + +- Arkivér vigtig forretningskorrespondance som PDF til compliance eller revision +- Udskriv e-mailtråde til retssager eller anmodninger om bevisindsamling +- Opret en permanent registrering af ordrebekræftelser, kvitteringer eller kontrakter modtaget på e-mail +- Sikkerhedskopiér Outlook MSG-filer i et format, der ikke kræver Outlook for at blive læst +- Dokumentér kundesupporthenvendelser fra eksporterede EML-filer + +## Tips + +- Både EML (brugt af Thunderbird, Apple Mail og de fleste e-mailprogrammer) og Outlook MSG-filer understøttes. Eksportér e-mails fra dit e-mailprogram og slip dem direkte i værktøjet. +- HTML-formaterede e-mails beholder deres styling i PDF'en. E-mails i almindelig tekst gengives med ren, læsbar formatering. +- Vedhæftningslisten viser filnavne og størrelser, men indlejrer ikke selve vedhæftningsfilerne i PDF'en. + +## Relaterede værktøjer + +- [XML til PDF](./xml-to-pdf) +- [XPS til PDF](./xps-to-pdf) diff --git a/docs/da/tools/epub-to-pdf.md b/docs/da/tools/epub-to-pdf.md new file mode 100644 index 00000000..7d16faa7 --- /dev/null +++ b/docs/da/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB til PDF +description: Konvertér EPUB-e-bøger til PDF i din browser. Gratis, ingen upload nødvendig, privatlivsorienteret konvertering. +--- + +# EPUB til PDF + +Konvertér EPUB-e-bøger til PDF-filer uden at forlade din browser. EPUB er den åbne standard for digitale bøger, men nogle gange har du brug for en PDF med fast layout til udskrivning, annotering eller deling med personer uden e-bogslæser. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----- | :---------- | :---------------------- | +| EPUB | `.epub` | EPUB 2- og EPUB 3-filer | + +## Sådan fungerer det + +1. Klik på uploadområdet eller træk og slip dine EPUB-filer. Du kan vælge flere filer. +2. Gennemgå de uploadede filer. Fjern uønskede poster med papirkurvsikonet, eller klik på **Tilføj flere filer** for at udvide batchen. +3. Klik på **Konvertér til PDF**. PyMuPDF-motoren gengiver EPUB-indholdet (tekst, billeder og formatering) som sideinddelt PDF. +4. En enkelt EPUB downloades direkte som PDF. Flere filer pakkes i et ZIP-arkiv ved navn `epub-converted.zip`. + +## Indstillinger + +Konverteringen kører med fornuftige standardindstillinger og kræver ingen konfiguration. Teksten omflyder til standardsidemål, og indlejrede skrifttyper og billeder overføres til PDF'en. + +## Anvendelser + +- Udskriv en DRM-fri e-bog, så du kan læse væk fra skærme +- Indsend et EPUB-manuskript som PDF med fast layout til gennemgang +- Arkivér digitale bøger i et format, som alle operativsystemer kan åbne direkte +- Del et kapitel med en kollega, der ikke har en EPUB-læser +- Konvertér teknisk dokumentation, der distribueres som EPUB, til PDF'er, der kan annoteres + +## Tips + +- EPUB 3-funktioner som indlejret lyd og video overføres ikke til PDF, men al tekst, alle billeder og tabeller konverteres uden problemer. +- Ved kraftigt stylede EPUB-filer bør du tjekke de første sider af resultatet for at bekræfte layoutets troværdighed. + +## Relaterede værktøjer + +- [MOBI til PDF](./mobi-to-pdf) +- [FB2 til PDF](./fb2-to-pdf) +- [CBZ til PDF](./cbz-to-pdf) diff --git a/docs/da/tools/excel-to-pdf.md b/docs/da/tools/excel-to-pdf.md new file mode 100644 index 00000000..28c6bb5d --- /dev/null +++ b/docs/da/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel til PDF +description: Konvertér Excel-regneark (XLS, XLSX), ODS- og CSV-filer til PDF med bevaret formatering. +--- + +# Excel til PDF + +Konvertér regnearksfiler til PDF. Værktøjet håndterer moderne Excel-filer, det gamle XLS-format, OpenDocument-regneark og endda CSV, alt sammen gengivet via en browserbaseret LibreOffice-motor, der bevarer cellers formatering, formler (som beregnede værdier), diagrammer og layout med flere ark. + +## Understøttede formater + +| Format | Filtypenavne | +| :-------------------- | :----------- | +| Excel (moderne) | `.xlsx` | +| Excel (ældre) | `.xls` | +| OpenDocument-regneark | `.ods` | +| CSV | `.csv` | + +## Sådan fungerer det + +1. Klik på uploadområdet eller træk og slip dine regnearksfiler. +2. Gennemgå fillisten. Tilføj flere filer eller fjern uønskede. +3. Klik på **Konvertér til PDF**. LibreOffice-motoren initialiseres ved første brug og behandler derefter hver fil. +4. En enkelt fil downloades direkte som PDF. Flere filer leveres som `excel-converted.zip`. + +## Indstillinger + +Dette værktøj har ingen yderligere konfiguration. LibreOffice-motoren bestemmer sidelayout, skalering og udskriftsområde ud fra regnearkets indbyggede indstillinger. + +## Output + +| Antal input | Output | +| :---------- | :--------------------------------------------------------------------- | +| 1 fil | Download af en enkelt PDF (oprindeligt filnavn med filendelsen `.pdf`) | +| 2+ filer | ZIP-arkiv (`excel-converted.zip`) med én PDF pr. fil | + +## Anvendelser + +- Konvertér økonomirapporter eller budgetter fra Excel til PDF til distribution +- Opret udskriftsklare PDF'er ud fra lager- eller produktkatalogregneark +- Del dataanalyseresultater med interessenter, der ikke har Excel installeret +- Arkivér kvartalsrapporter i et format, der ikke kan redigeres +- Konvertér ODS-filer fra LibreOffice Calc til PDF + +## Tips + +- Diagrammer indlejret i regnearket gengives i PDF'en. Sørg for, at de ser rigtige ud i kildefilen, før du konverterer. +- Hvis dit regneark har flere ark, er alle ark med i PDF-outputtet. +- Til simple CSV-data uden formatering giver værktøjet [CSV til PDF](./csv-to-pdf) en lettere konvertering. Brug Excel til PDF, når du har brug for bevaret formatering, diagrammer eller flere ark. + +## Relaterede værktøjer + +- [CSV til PDF](./csv-to-pdf) +- [Word til PDF](./word-to-pdf) +- [PowerPoint til PDF](./powerpoint-to-pdf) diff --git a/docs/da/tools/extract-attachments.md b/docs/da/tools/extract-attachments.md new file mode 100644 index 00000000..74c2be70 --- /dev/null +++ b/docs/da/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Udtræk vedhæftninger +description: Udtræk alle indlejrede filvedhæftninger fra en eller flere PDF'er og download dem som et ZIP-arkiv. +--- + +# Udtræk vedhæftninger + +Træk alle indlejrede vedhæftninger ud af en eller flere PDF-filer. Alle udtrukne filer samles i ét ZIP-arkiv til download. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer, der indeholder indlejrede vedhæftninger. +2. Klik på **Udtræk vedhæftninger**. +3. Værktøjet scanner hver PDF efter vedhæftninger på dokumentniveau og sideniveau. +4. Alle fundne filer pakkes i et ZIP-arkiv og downloades automatisk. +5. En statusbesked bekræfter, hvor mange vedhæftninger der blev fundet, og deres samlede størrelse. + +## Funktioner + +- Batchudtræk fra flere PDF'er på én gang +- Udtrækker både vedhæftninger på dokumentniveau og sideniveau +- Giver én ZIP-fil med alle udtrukne filer +- Viser det samlede antal vedhæftninger og den samlede filstørrelse +- Tydelige statusbeskeder, hvis der ikke findes vedhæftninger + +## Anvendelser + +- Gendan datafiler indlejret i en rapport-PDF +- Træk billedmateriale ud af en portefølje eller et specifikationsdokument +- Udtræk supplerende materiale fra trænings- eller compliance-PDF'er +- Gennemgå, hvilke filer der er indlejret i en batch af PDF'er + +## Tips + +- Hvis værktøjet melder, at der ingen vedhæftninger er, kan PDF'en i stedet indeholde indlejrede billeder eller formulardata. Disse er ikke filvedhæftninger. Brug [Udtræk billeder](./extract-images) til indlejrede billeder. +- Når du behandler flere PDF'er, havner alle vedhæftninger fra alle filer i én ZIP. Filnavnene bevares fra de oprindelige indlejringer. + +## Relaterede værktøjer + +- [Tilføj vedhæftninger](./add-attachments) +- [Redigér vedhæftninger](./edit-attachments) +- [Udtræk billeder](./extract-images) diff --git a/docs/da/tools/extract-images.md b/docs/da/tools/extract-images.md new file mode 100644 index 00000000..fb2f0742 --- /dev/null +++ b/docs/da/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Udtræk billeder +description: Udtræk alle indlejrede billeder fra PDF-filer. Forhåndsvis dem i et gitter og download dem enkeltvis eller som et ZIP-arkiv. +--- + +# Udtræk billeder + +Trækker alle indlejrede billeder ud af en eller flere PDF-filer. De udtrukne billeder vises i et forhåndsvisningsgitter, hvor du kan downloade dem enkeltvis eller tage alt på én gang som en ZIP. Drevet af PyMuPDF. + +## Sådan fungerer det + +1. Upload en eller flere PDF'er ved at klikke på slipzonen eller trække filer hen på den. Tilføj flere filer, eller fjern enkelte efter behov. +2. Klik på **Udtræk** for at starte behandlingen. +3. Værktøjet scanner hver side i hver uploadet PDF og finder og udtrækker indlejrede billeder. +4. De udtrukne billeder vises i et gitter med miniaturer. Hvert billede har en downloadknap. +5. Klik på **Download alle** for at gemme alt som et ZIP-arkiv. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Alle indlejrede billeder udtrækkes i deres oprindelige format (typisk PNG, JPEG eller det format, billedet blev indlejret i PDF'en med). + +## Outputformat + +- Billeder vises i et forhåndsvisningsgitter med navne som `image_1.png`, `image_2.jpg` osv. +- **Download alle** giver `extracted-images.zip` med alle billeder. +- Enkelte billeder kan downloades ét ad gangen fra gitteret. + +## Anvendelser + +- Gendan fotos eller grafik fra en PDF til genbrug i et andet projekt. +- Udtræk produktbilleder fra en katalog-PDF til en webshopsannonce. +- Træk diagrammer ud af teknisk dokumentation til brug i præsentationer. +- Gennemgå, hvilke billeder der er indlejret i et dokument, før du deler det. + +## Tips + +- Værktøjet udtrækker billeder præcis, som de er gemt i PDF'en. Det gengiver ikke sider som billeder. Til det kan du bruge [PDF til PNG](./pdf-to-png) eller [PDF til JPG](./pdf-to-jpg). +- Hvis værktøjet melder "Ingen billeder fundet", bruger PDF'en muligvis vektorgrafik i stedet for indlejrede rasterbilleder, eller også er det et skannet dokument, hvor hele siden er ét stort billede. +- Batchbehandling virker på tværs af flere PDF'er. Alle billeder fra alle filer samles i ét gitter og én ZIP. + +## Relaterede værktøjer + +- [PDF til PNG](./pdf-to-png) +- [PDF til JPG](./pdf-to-jpg) +- [PDF Workflow-bygger](./pdf-workflow) diff --git a/docs/da/tools/extract-pages.md b/docs/da/tools/extract-pages.md new file mode 100644 index 00000000..d6078d39 --- /dev/null +++ b/docs/da/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Udtræk sider +description: Gem et bestemt sideinterval fra en PDF som et nyt dokument. +--- + +# Udtræk sider + +Træk et udvalg af sider ud af en PDF og gem dem som en ny fil. Angiv præcis, hvilke sider du vil have, med intervalsyntaks, og værktøjet opretter en ren PDF, der kun indeholder de sider. + +## Sådan fungerer det + +1. Upload en PDF-fil. Værktøjet viser filnavn, størrelse og det samlede sideantal. +2. Indtast de sider, du vil udtrække, med intervalsyntaks (f.eks. `1-5`, `3, 7, 10-12`). +3. Vælg eventuelt at downloade hvert interval som en separat PDF i et ZIP-arkiv. +4. Klik på behandlingsknappen. De udtrukne sider downloades som en ny PDF (eller ZIP). + +## Funktioner + +- Fleksibel intervalsyntaks: enkelte sider, intervaller eller kommaseparerede kombinationer +- Viser det samlede sideantal efter upload, så du let kan se det +- Mulighed for output som én samlet PDF eller separate filer i en ZIP +- Bevarer det oprindelige sideindhold og den oprindelige formatering + +## Anvendelser + +- Træk resuméet (de første par sider) ud af en lang rapport +- Udtræk et enkelt kapitel fra en lærebogs-PDF +- Gem bestemte sider fra en formularpakke som selvstændige dokumenter +- Opret et eksempeldokument ud fra udvalgte sider i en større fil + +## Tips + +- Sidetal starter ved 1. Brug `1` til den første side, ikke `0`. +- Hvis du vil fjerne sider i stedet for at udtrække dem, kan du bruge [Slet sider](./delete-pages), som er den omvendte handling. +- Hvis du har brug for visuelt sidevalg med miniaturer, kan du bruge [Opdel PDF](./split-pdf) i tilstanden Visuelt valg. + +## Relaterede værktøjer + +- [Opdel PDF](./split-pdf) +- [Slet sider](./delete-pages) +- [Flet PDF](./merge-pdf) diff --git a/docs/da/tools/extract-tables.md b/docs/da/tools/extract-tables.md new file mode 100644 index 00000000..4e8c4af5 --- /dev/null +++ b/docs/da/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Udtræk PDF-tabeller +description: Registrer og udtræk tabeller fra PDF-dokumenter. Eksportér som CSV, JSON eller Markdown med granularitet pr. tabel. +--- + +# Udtræk PDF-tabeller + +Registrerer alle tabeller i en PDF og lader dig eksportere dem i det format, du vælger: CSV, JSON eller Markdown. Hver tabel udtrækkes individuelt med metadata om side og position. Drevet af PyMuPDF's tabelregistreringsmotor. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipzonen eller trække en fil hen på den. +2. Vælg dit foretrukne **eksportformat**: CSV, JSON eller Markdown. +3. Klik på **Udtræk** for at starte behandlingen. +4. Hvis der findes én tabel, downloades den som en enkelt fil. Flere tabeller giver et ZIP-arkiv med én fil pr. tabel. + +## Indstillinger + +- **Eksportformat**: vælg mellem: + - **CSV**: kommaseparerede værdier med korrekt citering af felter, der indeholder kommaer, anførselstegn eller linjeskift. Velegnet til regneark og databaser. + - **JSON**: struktur med array af arrays, pænt formateret med indrykning på 2 mellemrum. Velegnet til programmatisk brug. + - **Markdown**: tabelformat med lodrette streger, gengivet af PyMuPDF. Velegnet til dokumentation og README-filer. + +## Outputformat + +- **Enkelt tabel**: `filename_table.csv` (eller `.json` / `.md`) +- **Flere tabeller**: `filename_tables.zip` med filer ved navn `table_1_page3.csv`, `table_2_page5.csv` osv. + +## Anvendelser + +- Udtræk bestemte tabeller fra lange PDF-rapporter uden at hente hele dokumentets data. +- Få tabeller i Markdown-format til at indsætte direkte i GitHub-issues, wikier eller dokumentation. +- Træk struktureret JSON-data ud af PDF-tabeller til API-integrationer eller scripts. +- Sammenlign tabeller på tværs af forskellige PDF-versioner ved at eksportere begge til CSV og lave en diff. + +## Tips + +- Dette værktøj giver kontrol pr. tabel. Hvis du bare vil have alle tabeller samlet i én CSV, kan du bruge [PDF til CSV](./pdf-to-csv). Til en fuld Excel-projektmappe kan du bruge [PDF til Excel](./pdf-to-excel). +- Tabeller, der strækker sig over flere sider, kan blive registreret som separate tabeller pr. side. Du skal muligvis sætte dem sammen manuelt. +- Hvis der ikke registreres tabeller, kan PDF'en være et skannet billede. Kør den gennem OCR først for at tilføje et tekstlag. + +## Relaterede værktøjer + +- [PDF til CSV](./pdf-to-csv) +- [PDF til Excel](./pdf-to-excel) +- [PDF til tekst](./pdf-to-text) diff --git a/docs/da/tools/fb2-to-pdf.md b/docs/da/tools/fb2-to-pdf.md new file mode 100644 index 00000000..352d368d --- /dev/null +++ b/docs/da/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 til PDF +description: Konvertér FictionBook-ebogsfiler (FB2) til PDF i din browser. Gratis, privat, ingen upload til server. +--- + +# FB2 til PDF + +Konvertér FictionBook 2-filer (FB2) til PDF-dokumenter. FB2 er et XML-baseret ebogsformat, der er populært i Rusland og Østeuropa. Det understøttes godt på visse platforme, men er næsten ukendt på andre. Ved at konvertere til PDF kan dine bøger læses overalt. + +## Understøttede formater + +| Format | Filtypenavn | Bemærkninger | +| :------------ | :---------- | :---------------------- | +| FictionBook 2 | `.fb2` | XML-baseret ebogsformat | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine FB2-filer. Du kan vælge flere filer på én gang. +2. Gennemgå fillisten. Brug papirkurv-ikonet til at fjerne enkelte poster, eller **Tilføj flere filer** for at tilføje flere. +3. Klik på **Konvertér til PDF**. PyMuPDF-motoren fortolker FB2's XML-struktur og gengiver den som paginerede PDF-sider. +4. Én fil downloades direkte som PDF. Flere konverteringer samles i `fb2-converted.zip`. + +## Indstillinger + +Der kræves ingen konfiguration. Konverteren håndterer FB2's XML-struktur automatisk og bevarer kapitelskift, formatering og eventuelle indlejrede billeder. + +## Anvendelsesområder + +- Læsning af FB2-ebøger på enheder eller apps, der kun understøtter PDF +- Udskrivning af russisksproget litteratur, der distribueres i FB2-format +- Arkivering af et FB2-bibliotek i et format, der understøttes overalt +- Deling af en bog med en person, hvis læser ikke understøtter FictionBook + +## Tips + +- FB2-filer er almindelig XML, så de er typisk små og konverteres hurtigt, selv i browseren. +- Hvis dine FB2-filer er komprimeret som `.fb2.zip`, skal du pakke dem ud, før du uploader dem. + +## Relaterede værktøjer + +- [EPUB til PDF](./epub-to-pdf) +- [MOBI til PDF](./mobi-to-pdf) +- [XML til PDF](./xml-to-pdf) diff --git a/docs/da/tools/fix-page-size.md b/docs/da/tools/fix-page-size.md new file mode 100644 index 00000000..8eb84ce5 --- /dev/null +++ b/docs/da/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Ret sidestørrelse +description: Standardisér alle sider i en PDF til en ensartet størrelse. Vælg mellem standardpapirstørrelser, eller angiv egne mål. +--- + +# Ret sidestørrelse + +PDF'er, der er samlet fra flere kilder, ender ofte med forskellige sidestørrelser: nogle Letter, nogle A4 og nogle helt ikke-standard. Dette værktøj tvinger alle sider til én målstørrelse og skalerer indholdet, så det passer ind eller fylder siden. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Vælg en **Målsidestørrelse** i rullelisten (A4, Letter, Legal, A3, A5, Tabloid eller Brugerdefineret). +3. Vælg en **Orientering**. Auto bevarer hver sides oprindelige orientering, eller du kan gennemtvinge Stående eller Liggende. +4. Vælg en **Indholdsskalering**: Tilpas (bevarer alt indhold, kan tilføje margener) eller Fyld (fylder siden, kan beskære kanter). +5. Angiv eventuelt en **Baggrundsfarve** til tilføjede margener. +6. Klik på **Ret sidestørrelse**. + +## Indstillinger + +- **Standardstørrelser**: A4, Letter, Legal, A3, A5, Tabloid +- **Brugerdefinerede mål**: Angiv bredde og højde i tommer eller millimeter +- **Orientering**: Auto, Stående, Liggende +- **Skaleringstilstand**: Tilpas eller Fyld (beskær) +- **Baggrundsfarve**: Enhver farve til margenpolstring + +## Anvendelsesområder + +- Normalisering af en sammenflettet PDF, hvor siderne stammer fra forskellige scannere +- Konvertering af et amerikansk Letter-dokument til A4 til international distribution +- Klargøring af trykklare PDF'er, der kræver en ensartet beskæringsstørrelse +- Rettelse af sider, der er lidt uden for standard (f.eks. 8,49 x 11,02 tommer i stedet for 8,5 x 11) + +## Tips + +- Brug Tilpas for at sikre, at intet indhold går tabt. Fyld ser pænere ud, men kan klippe kanter af. +- Kontrollér resultatet med værktøjet Sidestørrelser for at bekræfte, at alle sider matcher målet. +- Hvid er standardbaggrundsfarven. Skift til en mørk farve, hvis dit dokument har mørke margener. + +## Relaterede værktøjer + +- [Sidestørrelser](./page-dimensions): kontrollér sidestørrelser før og efter rettelse +- [Komprimer PDF](./compress-pdf): reducer filstørrelsen efter standardisering +- [Beskær PDF](./crop-pdf): beskær sider manuelt i stedet for automatisk skalering diff --git a/docs/da/tools/flatten-pdf.md b/docs/da/tools/flatten-pdf.md new file mode 100644 index 00000000..9aa60f7c --- /dev/null +++ b/docs/da/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Fladgør PDF +description: Flad interaktive formularer og annotationer ud til statisk indhold. Gør formularfelter uredigerbare og brænder annotationer ind i siden. +--- + +# Fladgør PDF + +Flatten slår interaktive elementer sammen med sidens indhold: formularfelter, rullelister, afkrydsningsfelter, annotationer, markeringer og påsatte noter. Det visuelle udseende forbliver det samme, men intet kan længere redigeres eller udtrækkes. Det svarer til at udskrive en udfyldt formular og scanne den ind igen, bortset fra at kvaliteten forbliver perfekt. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. +2. Klik på **Fladgør PDF**. +3. En enkelt fil downloades direkte. Flere filer giver et ZIP-arkiv. + +Værktøjet bruger pdf-lib til at flade formularfelter ud (via `form.flatten()`) og en dedikeret annotationsflader til at brænde annotationer ind i sidestrømmen. Begge handlinger sker i ét gennemløb. + +## Hvad der flades ud + +- **Formularfelter**: Tekstfelter, afkrydsningsfelter, radioknapper, rullelister, signaturfelter +- **Annotationer**: Kommentarer, markeringer, gennemstregning, understregning, påsatte noter, stempler, blækannotationer +- **Interaktive elementer**: Knapper, handlingsudløsere + +## Hvad der forbliver uændret + +- Tekstindhold (kan stadig markeres og søges i) +- Billeder og grafik +- Sidelayout og -mål +- Bogmærker og indholdsfortegnelse +- Hyperlinks (medmindre de er annotationsbaserede) + +## Anvendelsesområder + +- Låsning af en udfyldt formular, så modtagere ikke kan ændre de indsendte svar +- Klargøring af en PDF til arkivering, hvor interaktive elementer er unødvendige +- Rettelse af visningsproblemer, når annotationer gengives forskelligt i forskellige læsere +- Sikring af, at et underskrevet dokument ikke kan ændres, efter underskriften er påført +- Reduktion af filstørrelsen ved at fjerne formularfeltdefinitioner og annotationsobjekter + +## Tips + +- Flatten, når alle redigeringer er færdige. Der er ingen måde at gendanne en flattenet PDF på. +- Hvis du både vil flatten og fjerne metadata, JavaScript og vedhæftninger, så brug værktøjet Rens PDF i stedet. Det har flatten som en af sine indstillinger. +- Nogle PDF'er melder "ingen formular fundet". Det er normalt, hvis dokumentet kun har annotationer og ingen formularfelter. + +## Relaterede værktøjer + +- [Rens PDF](./sanitize-pdf): flatten formularer og fjern desuden metadata, scripts og mere +- [Rasterisér PDF](./rasterize-pdf): konvertér til billedbaseret PDF for maksimal flatten +- [Skrifttype til kontur](./font-to-outline): konvertér skrifttyper til vektorstier +- [Kryptér PDF](./protect-pdf): lås den fladgjorte PDF med en adgangskode diff --git a/docs/da/tools/font-to-outline.md b/docs/da/tools/font-to-outline.md new file mode 100644 index 00000000..8d49398b --- /dev/null +++ b/docs/da/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Skrifttype til kontur +description: Konvertér alle skrifttyper i en PDF til vektorkonturer for ensartet gengivelse på tværs af enheder. Eliminerer problemer med skrifttypeafhængighed. +--- + +# Skrifttype til kontur + +Når skrifttyper konverteres til konturer, omdannes hvert tekstbogstav fra en skrifttypebaseret glyf til en vektorsti. PDF'en afhænger ikke længere af installerede skrifttyper og gengives ens på alle enheder, alle operativsystemer og alle printere. Det er et standardtrin i prepress-arbejdsgange. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. +2. Klik på **Konvertér til konturer**. +3. Ghostscript konverterer al tekst til vektorstier. +4. Download resultatet. Flere filer giver et ZIP-arkiv. + +Der er ingen indstillinger at konfigurere. Værktøjet bruger Ghostscript (WebAssembly) til at konvertere alle skrifttypereferencer til konturstier i ét gennemløb. + +## Hvad der ændres + +- Tekstbogstaver bliver til vektorkurver (bézier-stier) +- Indlejring af skrifttyper er ikke længere nødvendig, da PDF'en er selvstændig på glyfniveau +- Filstørrelsen kan stige, fordi vektorstier typisk er større end skrifttypereferencer +- Det visuelle udseende bevares nøjagtigt + +## Hvad du mister + +- Markering og kopiering af tekst +- Søgbarhed i teksten (Ctrl+F holder op med at virke) +- Muligheden for at redigere tekstindholdet +- Tilgængelighed for skærmlæsere + +## Anvendelsesområder + +- Afsendelse af PDF'er til et trykkeri, der kræver skrifttyper i konturer +- Deling af dokumenter med brugerdefinerede eller licenserede skrifttyper med personer, der ikke har disse skrifttyper +- Forebyggelse af skrifttypeudskiftning, der ændrer dit dokuments udseende på andre systemer +- Klargøring af PDF'er til lasergravering eller CNC-skæring, der kræver vektorinput +- Sikring af, at en logotung PDF vises korrekt på alle platforme + +## Tips + +- Behold din oprindelige PDF. Konvertering til konturer kan ikke fortrydes, og stier kan ikke konverteres tilbage til redigerbar tekst. +- Hvis teksten skal forblive søgbar, kan du i stedet overveje værktøjet Rasterisér PDF efterfulgt af OCR. +- PDF'er med konturer er ofte større. Kør Komprimer PDF bagefter, hvis filstørrelsen er vigtig. + +## Relaterede værktøjer + +- [Fladgør PDF](./flatten-pdf): flad formularer ud og annotationer uden at røre skrifttyper +- [Rasterisér PDF](./rasterize-pdf): konvertér til billedbaseret PDF i stedet for vektorkonturer +- [Komprimer PDF](./compress-pdf): reducer filstørrelsen efter konvertering til konturer +- [PDF til PDF/A](./pdf-to-pdfa): konvertér til arkivering, når skrifttypeuafhængighed er sikret diff --git a/docs/da/tools/form-creator.md b/docs/da/tools/form-creator.md new file mode 100644 index 00000000..e60814fe --- /dev/null +++ b/docs/da/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Opret PDF-formular +description: Byg udfyldelige PDF-formularer med træk-og-slip-tekstfelter, afkrydsningsfelter, rullelister, radioknapper og mere. +--- + +# Opret PDF-formular + +Design professionelle udfyldelige PDF-formularer fra bunden, eller tilføj felter til en eksisterende PDF. Den visuelle editor lader dig trække og slippe formularelementer (tekstfelter, afkrydsningsfelter, rullelister, radioknapper, signaturfelter og mere) direkte ind på sideforhåndsvisninger. Konfigurér feltegenskaber, opsæt regler for betinget synlighed, og eksportér en fuldt interaktiv PDF-formular. + +## Sådan fungerer det + +1. Upload en eksisterende PDF **eller** klik på **Opret tom PDF** for at starte fra bunden. +2. Hvis du opretter en tom PDF, skal du vælge en sidestørrelse (Letter, A4, A5, Legal, Tabloid, A3 eller brugerdefinerede mål). +3. Formulareditoren åbner med en værktøjslinje med felttyper og et område med sideforhåndsvisning. +4. Vælg en felttype på værktøjslinjen, og klik derefter på siden for at placere den. +5. Træk felter for at flytte dem. Brug størrelseshåndtagene til at justere målene. +6. Klik på et felt for at åbne egenskabspanelet, hvor du kan angive feltnavn, standardværdi, skriftstørrelse, justering og mere. +7. Naviger mellem siderne med sidekontrollerne. +8. Klik på **Gem** for at downloade den færdige udfyldelige PDF. + +## Funktioner + +- Placering af felter med træk og slip og visuelle håndtag til ændring af størrelse +- Felttyper: tekstinput, flerlinjet tekst, afkrydsningsfelt, rulleliste, radioknap, signatur, dato, tal og stregkode +- Egenskabspanel til konfiguration af hvert felts navn, etiket, standardværdi, skriftstørrelse, farve, justering og validering +- Felthandlinger og regler for betinget synlighed (vis/skjul felter baseret på andre feltværdier) +- Sidenavigation til formularer med flere sider +- Udtrækning af eksisterende felter: registrerer og importerer automatisk formularfelter fra uploadede PDF'er +- Understøttelse af både uploadede PDF'er og tomme sider som formularlærred +- Flere forudindstillede sidestørrelser plus brugerdefinerede mål +- Stregkodegenerering drevet af bwip-js +- Administration af radioknapgrupper + +## Indstillinger + +**Forudindstillede sidestørrelser (til tomme PDF'er):** + +- Letter (8,5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Brugerdefineret (angiv bredde og højde) + +**Feltegenskaber (varierer efter felttype):** + +- Navn, etiket og pladsholdertekst +- Standardværdi +- Skrifttype, størrelse og farve +- Tekstjustering (venstre, centreret, højre) +- Til/fra for obligatorisk felt +- Til/fra for skrivebeskyttet +- Maks. længde for tekstfelter +- Valgmuligheder for rullelister og radioknapper +- Handlinger for betinget synlighed + +## Anvendelsesområder + +- Oprettelse af onboarding-formularer til medarbejdere med tekstfelter til personlige oplysninger og afkrydsningsfelter til accept af politikker +- Oprettelse af spørgeskemaer til kundeoptagelse med rullelister til valg af ydelse +- Design af bestillingsformularer med beregnede felter og stregkodeidentifikatorer +- Oprettelse af inspektionstjeklister med radioknapper til bestået/ikke bestået +- Oprettelse af undersøgelsesformularer med betingede opfølgende spørgsmål, der vises ud fra svar + +## Tips + +- Hvis du uploader en eksisterende PDF, forsøger værktøjet at udtrække de formularfelter, der allerede findes, så du kan redigere eller tilføje til dem. +- Brug radioknapgrupper til at oprette gensidigt udelukkende valg. Felter i samme radiogruppe deler et gruppenavn. +- Test din formular ved at downloade den og åbne den i [PDF-formularudfylder](./form-filler) for at kontrollere feltadfærden. + +## Relaterede værktøjer + +- [PDF-formularudfylder](./form-filler) +- [Underskriv PDF](./sign-pdf) +- [PDF-editor](./edit-pdf) diff --git a/docs/da/tools/form-filler.md b/docs/da/tools/form-filler.md new file mode 100644 index 00000000..8147da7f --- /dev/null +++ b/docs/da/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF-formularudfylder +description: Udfyld PDF-formularer, herunder XFA-formularer, direkte i din browser med en indlejret viewer. +--- + +# PDF-formularudfylder + +Åbn en PDF med formularfelter, og udfyld den direkte i en indlejret viewer. Værktøjet understøtter både almindelige AcroForm-felter og ældre XFA-formularer (XML Forms Architecture). Når du har udfyldt formularen, kan du downloade den udfyldte version med et enkelt klik. + +## Sådan fungerer det + +1. Upload en PDF, der indeholder formularfelter. +2. Dokumentet åbner i en integreret PDF-viewer, der gengiver formularfelter som interaktive inputfelter. +3. Klik på tekstfelter, afkrydsningsfelter, rullelister og radioknapper for at udfylde dem. +4. Klik på **Gem og download udfyldt formular** for at få den færdige PDF. + +## Funktioner + +- Indlejret PDF.js-viewer med fuld interaktion med formularfelter +- Understøttelse af almindelige AcroForm-felter (tekstfelter, afkrydsningsfelter, rullelister, radioknapper) +- XFA-formularunderstøttelse til ældre XML-baserede formularer +- Automatisk tilpasning af viewerens størrelse ud fra sidemål +- Visning af fil med navn og størrelse + +## Indstillinger + +Der er ingen yderligere konfigurationsindstillinger. Upload formularen, udfyld den, og download. + +## Anvendelsesområder + +- Udfyldelse af skatteformularer, forsikringsansøgninger eller offentlige papirer +- Udfyldelse af jobansøgningsskemaer modtaget som PDF-vedhæftninger +- Udfyldelse af leverandør-onboarding-formularer eller spørgeskemaer til leverandører +- Godkendelse af compliance-tjeklister med afkrydsningsfelter +- Udfyldelse af medicinske optagelsesformularer før en aftale + +## Tips + +- XFA-formularer er et ældre format, som kun understøttes af nogle PDF-læsere. Hvis du åbner en XFA-PDF i Chrome eller de fleste andre værktøjer og ser tomme sider, mangler disse læsere XFA-understøttelse. BentoPDF's formularudfylder og Firefox håndterer begge XFA korrekt. +- Til PDF'er uden eksisterende formularfelter kan du bruge værktøjet [Opret PDF-formular](./form-creator) til først at tilføje felter og derefter udfylde dem her. +- Vieweren tilpasser automatisk sin størrelse til PDF'ens sidemål. + +## Relaterede værktøjer + +- [Opret PDF-formular](./form-creator) +- [Underskriv PDF](./sign-pdf) +- [PDF-editor](./edit-pdf) diff --git a/docs/da/tools/header-footer.md b/docs/da/tools/header-footer.md new file mode 100644 index 00000000..6108c30b --- /dev/null +++ b/docs/da/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Sidehoved og sidefod +description: Tilføj tilpasselig sidehoved- og sidefodstekst til PDF-sider med dynamiske variabler for sidetal. +--- + +# Sidehoved og sidefod + +Tilføj tekst i seks positioner på dine PDF-sider: sidehoved til venstre, i midten og til højre samt sidefod til venstre, i midten og til højre. Værktøjet understøtter dynamiske variabler for sidetal og samlet sideantal, så du kan oprette skabeloner som "Side 3 af 10", der opdateres automatisk for hver side. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Indstillingspanelet vises med formateringskontroller og seks tekstfelter. +3. Indtast den ønskede tekst i en af sidehoved-/sidefodspositionerne. +4. Brug pladsholderne `{page}` og `{total}` til dynamisk sidenummerering. +5. Juster skriftstørrelse og skriftfarve, og begræns eventuelt til et bestemt sideinterval. +6. Klik på **Tilføj sidehoved og sidefod** for at behandle og downloade. + +## Indstillinger + +- **Sideinterval**: Begræns eventuelt, hvilke sider der får sidehoved og sidefod. Lad feltet stå tomt for at anvende det på alle sider. Format: "1-3, 5" (kommaseparerede intervaller). +- **Skriftstørrelse**: Mellem 6 og 24 punkter. Standard er 10. +- **Skriftfarve**: Vælg en vilkårlig farve med farvevælgeren. +- **Sidehoved venstre / midten / højre**: Tekstfelter øverst på hver side. +- **Sidefod venstre / midten / højre**: Tekstfelter nederst på hver side. + +## Funktioner + +- Seks uafhængige tekstpositioner pr. side +- Dynamisk `{page}`-variabel, der indsætter det aktuelle sidetal +- Dynamisk `{total}`-variabel, der indsætter det samlede sideantal +- Filtrering på sideinterval for at ramme bestemte sider +- Tilpasselig skriftstørrelse og farve +- Helvetica-skrifttype for et rent, professionelt resultat + +## Anvendelsesområder + +- Tilføjelse af "Side {page} af {total}" i midten af sidefoden i en rapport +- Placering af et firmanavn i sidehovedet til venstre og en dokumentdato i sidehovedet til højre +- Tilføjelse af fortrolighedsmeddelelser i sidefoden i juridiske dokumenter +- Stempling af dokumentrevisionsnumre på bestemte sideintervaller + +## Tips + +- Kombinér `{page}` og `{total}` i ét felt til formater som "Side {page} af {total}" eller "{page}/{total}". +- Du kan lade de fleste felter stå tomme og kun udfylde de positioner, du har brug for. Tomme felter springes blot over. +- Til mere komplekse sidehoveder med billeder eller logoer kan du overveje værktøjet [Tilføj vandmærke](./add-watermark) placeret øverst på siden. + +## Relaterede værktøjer + +- [Sidetal](./page-numbers) +- [Tilføj vandmærke](./add-watermark) +- [Bates-nummerering](./bates-numbering) diff --git a/docs/da/tools/heic-to-pdf.md b/docs/da/tools/heic-to-pdf.md new file mode 100644 index 00000000..b0088898 --- /dev/null +++ b/docs/da/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC til PDF +description: Konvertér HEIC- og HEIF-billeder fra iPhones og iPads til PDF-format direkte i din browser. +--- + +# HEIC til PDF + +Konvertér HEIC/HEIF-billeder til PDF. HEIC har været standardfotoformatet på iPhones og iPads siden iOS 11. Med dette værktøj kan du omdanne disse fotos til PDF'er uden at installere desktopsoftware eller uploade filer til en server. + +## Understøttede formater + +| Format | Filtypenavne | +| :----- | :----------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine HEIC/HEIF-filer. +2. Gennemgå fillisten, og fjern uønskede filer. +3. Klik på **Konvertér til PDF**. Resultatet downloades som `from_heic.pdf`. + +Hver HEIC-fil afkodes med biblioteket heic2any, som konverterer den til PNG i 92 % kvalitet. PNG-billedet indlejres derefter i PDF'en med pdf-lib, med ét billede pr. side i fuld opløsning. + +## Indstillinger + +Dette værktøj har ingen yderligere indstillinger. HEIC-billeder konverteres i høj kvalitet (0,92) til PNG, før de indlejres. + +## Anvendelsesområder + +- Oprettelse af en PDF af iPhone-fotos til at vedhæfte en forsikringsanmeldelse eller rapport +- Konvertering af HEIC-fotos til en boligannonce til ét udskrivbart dokument +- Omdannelse af iPad-skærmbilleder (HEIF-format) til en delbar PDF +- Batchkonvertering af feriebilleder til en rejsedagbog + +## Tips + +- HEIC-afkodning sker udelukkende i browseren med WebAssembly. Den første konvertering kan tage et øjeblik, mens afkoderen indlæses. +- Hvis du skal blande HEIC med andre billedformater (JPG, PNG osv.), kan du bruge værktøjet [Billeder til PDF](./image-to-pdf), som håndterer HEIC sammen med alle andre formater. +- HEIC-filer fra iPhones indeholder ofte EXIF-data, herunder GPS-koordinater. PDF-outputtet medtager ikke disse metadata. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [JPG til PDF](./jpg-to-pdf) +- [PNG til PDF](./png-to-pdf) diff --git a/docs/da/tools/image-to-pdf.md b/docs/da/tools/image-to-pdf.md new file mode 100644 index 00000000..0d9a357b --- /dev/null +++ b/docs/da/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Billeder til PDF +description: Konvertér JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD og 10+ andre billedformater til én PDF-fil. +--- + +# Billeder til PDF + +Den universelle billede-til-PDF-konverter. Upload billeder i stort set ethvert format, og kombinér dem i ét PDF-dokument. Hvert billede får sin egen side, der svarer til de oprindelige mål. + +## Understøttede formater + +| Format | Filtypenavne | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Dette er den bredeste formatunderstøttelse af alle BentoPDF's billedkonvertere. Hvis du kun har brug for ét bestemt format, kan du bruge et af de dedikerede værktøjer i stedet. + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine billedfiler. Du kan vælge flere filer på én gang. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurv-ikonet, eller klik på **Tilføj flere filer** for at tilføje flere billeder. +3. Vælg et **PDF-kvalitetsniveau** i rullelisten. +4. Klik på **Konvertér til PDF**. Værktøjet behandler billederne med PyMuPDF-motoren og downloader resultatet som `images_to_pdf.pdf`. + +## Indstillinger + +**PDF-kvalitet** styrer den billedkomprimering, der anvendes, når billeder indlejres i PDF'en: + +- **Høj kvalitet**: minimal komprimering, større filstørrelse. Bedst til udskrivning eller arkivering. +- **Mellem kvalitet** (standard): afbalanceret komprimering. God til de fleste formål. +- **Lav kvalitet**: kraftig komprimering, mindste filstørrelse. Velegnet til e-mail eller hurtig deling. + +HEIC- og WebP-filer konverteres automatisk til PNG, før de indlejres. Det sker gennemsigtigt og kræver ingen ekstra trin. + +## Anvendelsesområder + +- Kombinering af scannede kvitteringer eller dokumenter fra et telefonkamera i én PDF +- Oprettelse af en fotoportefølje eller lookbook af billeder i blandede formater +- Konvertering af iPhone-fotos (HEIC) til en delbar PDF uden at installere desktopsoftware +- Samling af designskitser fra PSD-eksporter og skærmbilleder til en kundeleverance +- Arkivering af en mappe med ældre billedformater (PNM, JXR, JP2) som én PDF + +## Tips + +- Rækkefølgen af billederne i PDF'en svarer til rækkefølgen i fillisten. Upload dem i den rækkefølge, du ønsker. +- For den mindst mulige filstørrelse skal du vælge Lav kvalitet. Den visuelle forskel er ofte ubetydelig for tekstbaserede scanninger. +- Hvis du kun har ét billedformat, giver de dedikerede konvertere (JPG til PDF, PNG til PDF osv.) det samme resultat med en enklere grænseflade. + +## Relaterede værktøjer + +- [JPG til PDF](./jpg-to-pdf) +- [PNG til PDF](./png-to-pdf) +- [HEIC til PDF](./heic-to-pdf) +- [WebP til PDF](./webp-to-pdf) diff --git a/docs/da/tools/index.md b/docs/da/tools/index.md new file mode 100644 index 00000000..6e151550 --- /dev/null +++ b/docs/da/tools/index.md @@ -0,0 +1,183 @@ +# Værktøjsoversigt + +BentoPDF tilbyder **130+ værktøjer** til arbejde med PDF'er. Alle værktøjer kører udelukkende i din browser, og dine filer forlader aldrig din enhed. + +--- + +## Redigér og annotér + +Rediger, markér og forbedr dine PDF-dokumenter med en komplet samling redigeringsværktøjer. + +
+ +- [**PDF-editor**](./edit-pdf): Annotér, fremhæv, redigér, kommentér, tilføj former/billeder, søg i og vis PDF'er. +- [**Redigér bogmærker**](./bookmark): Tilføj, redigér, importér, slet og udtræk PDF-bogmærker. +- [**Indholdsfortegnelse**](./table-of-contents): Generér en indholdsfortegnelsesside ud fra PDF-bogmærker. +- [**Sidetal**](./page-numbers): Indsæt sidetal i dit dokument. +- [**Tilføj sideetiketter**](./add-page-labels): Anvend PDF-sideetiketter med romertal, præfikser og brugerdefinerede startværdier. +- [**Bates-nummerering**](./bates-numbering): Tilføj fortløbende Bates-numre på tværs af en eller flere PDF-filer. +- [**Tilføj vandmærke**](./add-watermark): Stempl tekst eller et billede over dine PDF-sider. +- [**Sidehoved og sidefod**](./header-footer): Tilføj tekst øverst og nederst på siderne. +- [**Invertér farver**](./invert-colors): Opret en mørk version af din PDF. +- [**Scannereffekt**](./scanner-effect): Få din PDF til at ligne et scannet dokument. +- [**Justér farver**](./adjust-colors): Finjustér lysstyrke, kontrast, mætning og mere. +- [**Baggrundsfarve**](./background-color): Skift baggrundsfarven i din PDF. +- [**Skift tekstfarve**](./text-color): Skift farven på teksten i din PDF. +- [**Underskriv PDF**](./sign-pdf): Tegn, skriv eller upload din underskrift. +- [**Tilføj stempler**](./add-stamps): Tilføj billedstempler til din PDF med annotationsværktøjslinjen. +- [**Fjern annotationer**](./remove-annotations): Fjern kommentarer, fremhævninger og links. +- [**Beskær PDF**](./crop-pdf): Beskær margenerne på alle sider i din PDF. +- [**PDF-formularudfylder**](./form-filler): Udfyld formularer direkte i browseren. Understøtter også XFA-formularer. +- [**Opret PDF-formular**](./form-creator): Opret udfyldelige PDF-formularer med træk-og-slip-tekstfelter. +- [**Fjern tomme sider**](./remove-blank-pages): Find og slet tomme sider automatisk. + +
+ +--- + +## Konvertér til PDF + +Omdan billeder, dokumenter, ebøger og andre filformater til PDF. + +
+ +- [**Billeder til PDF**](./image-to-pdf): Konvertér JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP og flere til PDF. +- [**JPG til PDF**](./jpg-to-pdf): Opret en PDF fra et eller flere JPG-billeder. +- [**PNG til PDF**](./png-to-pdf): Opret en PDF fra et eller flere PNG-billeder. +- [**WebP til PDF**](./webp-to-pdf): Opret en PDF fra et eller flere WebP-billeder. +- [**SVG til PDF**](./svg-to-pdf): Opret en PDF fra et eller flere SVG-billeder. +- [**BMP til PDF**](./bmp-to-pdf): Opret en PDF fra et eller flere BMP-billeder. +- [**HEIC til PDF**](./heic-to-pdf): Opret en PDF fra et eller flere HEIC-billeder. +- [**TIFF til PDF**](./tiff-to-pdf): Opret en PDF fra et eller flere TIFF-billeder. +- [**Tekst til PDF**](./txt-to-pdf): Konvertér en almindelig tekstfil til en PDF. +- [**Markdown til PDF**](./markdown-to-pdf): Konvertér Markdown til PDF med live forhåndsvisning og syntaksfremhævning. +- [**JSON til PDF**](./json-to-pdf): Konvertér JSON-filer til PDF-format. +- [**ODT til PDF**](./odt-to-pdf): Konvertér ODT-filer (OpenDocument Text) til PDF. +- [**CSV til PDF**](./csv-to-pdf): Konvertér CSV-regneark til PDF. +- [**RTF til PDF**](./rtf-to-pdf): Konvertér RTF-dokumenter (Rich Text Format) til PDF. +- [**Word til PDF**](./word-to-pdf): Konvertér Word-dokumenter (DOCX, DOC, ODT) til PDF. +- [**Excel til PDF**](./excel-to-pdf): Konvertér Excel-regneark (XLSX, XLS, ODS) til PDF. +- [**PowerPoint til PDF**](./powerpoint-to-pdf): Konvertér PowerPoint-præsentationer (PPTX, PPT, ODP) til PDF. +- [**XPS til PDF**](./xps-to-pdf): Konvertér XPS/OXPS-dokumenter til PDF. +- [**MOBI til PDF**](./mobi-to-pdf): Konvertér MOBI-ebøger til PDF. +- [**EPUB til PDF**](./epub-to-pdf): Konvertér EPUB-ebøger til PDF. +- [**FB2 til PDF**](./fb2-to-pdf): Konvertér FictionBook-ebøger (FB2) til PDF. +- [**CBZ til PDF**](./cbz-to-pdf): Konvertér tegneserie-arkiver (CBZ/CBR) til PDF. +- [**WPD til PDF**](./wpd-to-pdf): Konvertér WordPerfect-dokumenter (WPD) til PDF. +- [**WPS til PDF**](./wps-to-pdf): Konvertér WPS Office-dokumenter til PDF. +- [**XML til PDF**](./xml-to-pdf): Konvertér XML-dokumenter til PDF. +- [**ODG til PDF**](./odg-to-pdf): Konvertér OpenDocument Graphics (ODG) til PDF. +- [**ODS til PDF**](./ods-to-pdf): Konvertér OpenDocument Spreadsheet (ODS) til PDF. +- [**ODP til PDF**](./odp-to-pdf): Konvertér OpenDocument Presentation (ODP) til PDF. +- [**PUB til PDF**](./pub-to-pdf): Konvertér Microsoft Publisher (PUB) til PDF. +- [**VSD til PDF**](./vsd-to-pdf): Konvertér Microsoft Visio (VSD, VSDX) til PDF. +- [**PSD til PDF**](./psd-to-pdf): Konvertér Adobe Photoshop-filer (PSD) til PDF. +- [**Email til PDF**](./email-to-pdf): Konvertér e-mailfiler (EML, MSG) til PDF-format. + +
+ +--- + +## Konvertér fra PDF + +Udtræk indhold fra PDF'er til billeder, dokumenter og dataformater. + +
+ +- [**PDF til JPG**](./pdf-to-jpg): Konvertér hver PDF-side til et JPG-billede. +- [**PDF til PNG**](./pdf-to-png): Konvertér hver PDF-side til et PNG-billede. +- [**PDF til WebP**](./pdf-to-webp): Konvertér hver PDF-side til et WebP-billede. +- [**PDF til BMP**](./pdf-to-bmp): Konvertér hver PDF-side til et BMP-billede. +- [**PDF til TIFF**](./pdf-to-tiff): Konvertér hver PDF-side til et TIFF-billede. +- [**PDF til CBZ**](./pdf-to-cbz): Konvertér en PDF til et CBZ-arkiv (Comic Book Archive) til tegneserielæsere og Calibre. +- [**PDF til SVG**](./pdf-to-svg): Konvertér hver PDF-side til en skalerbar vektorgrafik. +- [**PDF til CSV**](./pdf-to-csv): Udtræk tabeller fra PDF, og konvertér dem til CSV-format. +- [**PDF til Excel**](./pdf-to-excel): Udtræk tabeller fra PDF, og konvertér dem til Excel (XLSX). +- [**PDF til gråtoner**](./pdf-to-greyscale): Konvertér alle farver til sort og hvid. +- [**PDF til JSON**](./pdf-to-json): Konvertér PDF-filer til JSON-format. +- [**PDF til Word**](./pdf-to-word): Konvertér PDF-filer til redigerbare Word-dokumenter. +- [**Udtræk billeder**](./extract-images): Udtræk alle indlejrede billeder fra dine PDF-filer. +- [**PDF til Markdown**](./pdf-to-markdown): Konvertér PDF-tekst og -tabeller til Markdown-format. +- [**Forbered PDF til AI**](./prepare-pdf-for-ai): Udtræk PDF-indhold som LlamaIndex JSON til RAG/LLM-pipelines. +- [**PDF til tekst**](./pdf-to-text): Udtræk tekst fra PDF-filer, og gem den som almindelig tekst. +- [**Udtræk PDF-tabeller**](./extract-tables): Udtræk tabeller fra PDF'er som CSV, JSON eller Markdown. + +
+ +--- + +## Organisér og administrér + +Omarranger, kombinér, opdel og administrér dine PDF-sider og -filer. + +
+ +- [**PDF Workflow-bygger**](./pdf-workflow): Byg brugerdefinerede PDF-behandlingspipelines med en visuel nodeeditor. +- [**PDF Multi-værktøj**](./pdf-multi-tool): Fuldt udstyret PDF-editor med sideadministration. +- [**OCR PDF**](./ocr-pdf): Gør en PDF søgbar og kopierbar. +- [**Flet PDF**](./merge-pdf): Kombinér flere PDF'er til én fil. +- [**Alternér og miks sider**](./alternate-merge): Flet PDF'er ved at skiftevis tage sider fra hver PDF. +- [**Sortér dupleks-scanning**](./duplex-collate): Omordn blokke af for- og bagsidescanninger til den rigtige sidesekvens. +- [**Duplikér og organisér**](./organize-pdf): Duplikér, omarranger og slet sider. +- [**Tilføj vedhæftninger**](./add-attachments): Indlejr en eller flere filer i din PDF. +- [**Udtræk vedhæftninger**](./extract-attachments): Udtræk alle indlejrede filer fra PDF'er som en ZIP-fil. +- [**Redigér vedhæftninger**](./edit-attachments): Se eller fjern vedhæftninger i din PDF. +- [**PDF OCG**](./pdf-layers): Vis, skift, tilføj og slet OCG-lag i din PDF. +- [**Opdel PDF**](./split-pdf): Udtræk et sideinterval til en ny PDF. +- [**Opdel sider**](./divide-pages): Opdel sider vandret eller lodret. +- [**Udtræk sider**](./extract-pages): Gem et udvalg af sider som nye filer. +- [**Slet sider**](./delete-pages): Fjern bestemte sider fra dit dokument. +- [**Tilføj tom side**](./add-blank-page): Indsæt en tom side hvor som helst i din PDF. +- [**Vend sider**](./reverse-pages): Vend rækkefølgen af alle sider i dit dokument. +- [**Roter PDF**](./rotate-pdf): Drej sider i trin på 90 grader. +- [**Roter med brugerdefineret vinkel**](./rotate-custom): Roter sider med en vilkårlig vinkel. +- [**N-Up PDF**](./n-up-pdf): Arrangér flere sider på ét ark. +- [**PDF-hæfte**](./pdf-booklet): Omarranger sider til dobbeltsidet hæfteudskrivning. +- [**Kombinér til én side**](./combine-single-page): Sammensæt alle sider til én sammenhængende rulleside. +- [**Vis metadata**](./view-metadata): Undersøg de skjulte egenskaber i din PDF. +- [**Redigér metadata**](./edit-metadata): Skift forfatter, titel og andre egenskaber. +- [**PDF'er til ZIP**](./pdf-to-zip): Pak flere PDF-filer i et ZIP-arkiv. +- [**Sammenlign PDF'er**](./compare-pdfs): Sammenlign to PDF'er side om side. +- [**Posterisér PDF**](./posterize-pdf): Opdel en stor side i flere mindre sider. + +
+ +--- + +## Optimér og reparér + +Komprimer, ret og optimér dine PDF'er for bedre ydeevne og kompatibilitet. + +
+ +- [**Komprimer PDF**](./compress-pdf): Reducer filstørrelsen på din PDF. +- [**PDF til PDF/A**](./pdf-to-pdfa): Konvertér PDF til PDF/A til langtidsarkivering. +- [**Ret sidestørrelse**](./fix-page-size): Standardisér alle sider til en ensartet størrelse. +- [**Lineariser PDF**](./linearize-pdf): Optimér PDF til hurtig visning på nettet. +- [**Sidestørrelser**](./page-dimensions): Analysér sidestørrelse, orientering og enheder. +- [**Fjern begrænsninger**](./remove-restrictions): Fjern adgangskodebeskyttelse og sikkerhedsbegrænsninger. +- [**Reparér PDF**](./repair-pdf): Gendan data fra korrupte eller beskadigede PDF-filer. +- [**Rasterisér PDF**](./rasterize-pdf): Konvertér PDF til billedbaseret PDF. Flad lag ud, og fjern markerbar tekst. +- [**Ret skæve sider**](./deskew-pdf): Ret automatisk skæve scannede sider ud med OpenCV. +- [**Skrifttype til kontur**](./font-to-outline): Konvertér alle skrifttyper til vektorkonturer for ensartet gengivelse. + +
+ +--- + +## Sikr PDF + +Beskyt, kryptér og kontrollér adgangen til dine PDF-dokumenter. + +
+ +- [**Kryptér PDF**](./protect-pdf): Lås din PDF ved at tilføje en adgangskode. +- [**Rens PDF**](./sanitize-pdf): Fjern metadata, annotationer, scripts og mere. +- [**Dekryptér PDF**](./unlock-pdf): Lås PDF op ved at fjerne adgangskodebeskyttelse. +- [**Fladgør PDF**](./flatten-pdf): Gør formularfelter og annotationer uredigerbare. +- [**Fjern metadata**](./remove-metadata): Fjern skjulte data fra din PDF. +- [**Skift tilladelser**](./change-permissions): Angiv eller skift brugertilladelser på en PDF. +- [**Digital signatur PDF**](./digital-sign-pdf): Tilføj en kryptografisk digital signatur med X.509-certifikater. +- [**Validér PDF-signatur**](./validate-signature-pdf): Bekræft digitale signaturer, og se certifikatoplysninger. + +
diff --git a/docs/da/tools/invert-colors.md b/docs/da/tools/invert-colors.md new file mode 100644 index 00000000..48b46cf4 --- /dev/null +++ b/docs/da/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Invertér farver +description: Invertér alle farver i din PDF for at oprette en mørk version af ethvert dokument. +--- + +# Invertér farver + +Vend hver farve i din PDF om til sin modsætning. Hvide baggrunde bliver sorte, sort tekst bliver hvid, og alle andre farver skifter til deres komplementærfarver. Det er den hurtigste måde at lave en "mørk tilstand"-version af enhver PDF. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Klik på **Invertér farver** for at behandle. +3. Den inverterede PDF downloades automatisk. + +Der er ingen yderligere indstillinger. Værktøjet gengiver hver side som et billede, inverterer alle pixelfarver og samler resultatet i en ny PDF. + +## Funktioner + +- Farveinvertering med ét klik for alle sider +- Behandler hver side i dokumentet +- Bevarer de oprindelige sidemål og layout +- Virker med enhver PDF uanset indholdstype (tekst, billeder, blandet) + +## Anvendelsesområder + +- Oprettelse af mørke versioner af lærebøger eller manualer til behagelig læsning om aftenen +- Klargøring af højkontrastversioner af dokumenter af hensyn til tilgængelighed +- Invertering af scannede dokumenter, der er optaget med forkert eksponering +- Generering af negative versioner af billedtunge PDF'er til visuel analyse + +## Tips + +- Da værktøjet rasteriserer siderne for at opnå effekten, er outputtet billedbaseret. Tekst kan ikke længere markeres eller søges i. Hvis du har brug for søgbar tekst efter invertering, kan du køre outputtet gennem et OCR-værktøj. +- Til mere detaljerede farvejusteringer (lysstyrke, kontrast, mætning) kan du bruge værktøjet [Justér farver](./adjust-colors) i stedet. +- Store PDF'er med mange sider kan tage længere tid at behandle, da hver side gengives og inverteres individuelt. + +## Relaterede værktøjer + +- [Justér farver](./adjust-colors) +- [Baggrundsfarve](./background-color) +- [Scannereffekt](./scanner-effect) diff --git a/docs/da/tools/jpg-to-pdf.md b/docs/da/tools/jpg-to-pdf.md new file mode 100644 index 00000000..624e5fda --- /dev/null +++ b/docs/da/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG til PDF +description: Konvertér et eller flere JPG-, JPEG- og JPEG 2000-billeder til én PDF-fil direkte i din browser. +--- + +# JPG til PDF + +Omdan JPG-billeder til en ren PDF. Upload én fil, eller saml flere JPG'er i en batch. Hvert billede bliver til en fuldstørrelsesside i det færdige dokument. + +## Understøttede formater + +| Format | Filtypenavne | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine JPG-filer. Flere filer kan vælges. +2. Gennemgå de uploadede filer. Brug papirkurv-ikonet til at fjerne enkelte filer, eller klik på **Tilføj flere filer** for at tilføje til listen. +3. Vælg et **PDF-kvalitetsniveau**. +4. Klik på **Konvertér til PDF**. Værktøjet komprimerer billederne efter din kvalitetsindstilling, konverterer dem via PyMuPDF-motoren og downloader `from_jpgs.pdf`. + +## Indstillinger + +**PDF-kvalitet** justerer den komprimering, der anvendes på hvert billede, før det indlejres i PDF'en: + +- **Høj kvalitet**: bevarer maksimal detaljegrad. Brug til fotografi eller udskrivning. +- **Mellem kvalitet** (standard): en solid balance mellem klarhed og filstørrelse. +- **Lav kvalitet**: kraftig komprimering for det mindste output. + +## Anvendelsesområder + +- Konvertering af scannede dokumenter gemt som JPG'er til én PDF til indsendelse +- Samling af produktfotos i et katalog til kunder +- Omdannelse af JPEG 2000-billeder fra medicin eller satellitter til en bærbar PDF +- Oprettelse af et udskrivbart fotoalbum fra kameraeksporter + +## Tips + +- JPEG 2000-filer (`.jp2`, `.jpx`) understøttes fuldt ud, ikke kun standard-JPEG. Det er nyttigt til medicinsk billeddannelse og geospatiale data. +- Hvis dine JPG'er kommer fra et telefonkamera, giver Mellem kvalitet normalt en fil, der er 40-60 % mindre end Høj uden synlig forskel på skærmen. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [PNG til PDF](./png-to-pdf) +- [WebP til PDF](./webp-to-pdf) diff --git a/docs/da/tools/json-to-pdf.md b/docs/da/tools/json-to-pdf.md new file mode 100644 index 00000000..d8e3b524 --- /dev/null +++ b/docs/da/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON til PDF +description: Genskab PDF-filer fra BentoPDF's JSON-format. Konvertér JSON-eksporter tilbage til deres oprindelige PDF-dokumenter. +--- + +# JSON til PDF + +Genskab PDF-dokumenter fra JSON-filer, der tidligere er oprettet med BentoPDF's værktøj **PDF til JSON**. Dette er et værktøj til rundturskonvertering: det tager den strukturerede JSON-repræsentation af en PDF og genopbygger det oprindelige dokument. + +::: warning +Dette værktøj accepterer kun JSON-filer, der er oprettet af BentoPDF's PDF-til-JSON-konverter. Almindelige JSON-filer fra API'er, databaser eller andre værktøjer understøttes ikke. +::: + +## Understøttede formater + +| Input | Beskrivelse | +| :------ | :-------------------------------------------------------- | +| `.json` | JSON-filer eksporteret af BentoPDF's PDF-til-JSON-værktøj | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip en eller flere JSON-filer. +2. Fillisten viser hver valgt fil med dens størrelse. +3. Klik på **Konvertér til PDF**. Værktøjet behandler alle filer med en Web Worker og CPDF-motoren. +4. Outputtet downloades som `jsons-to-pdf.zip` med én PDF pr. input-JSON-fil. + +Konverteringen kører i en Web Worker i baggrunden, så brugerfladen forbliver responsiv, selv med store filer. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. JSON-strukturen bestemmer fuldt ud den resulterende PDF. + +## Output + +Når flere JSON-filer konverteres, leveres resultaterne som et ZIP-arkiv. Hver PDF navngives efter sin kilde-JSON-fil (f.eks. bliver `report.json` til `report.pdf`). + +## Anvendelsesområder + +- Gendannelse af PDF'er fra en JSON-baseret backup eller arkiveringspipeline +- Rundtur for en PDF gennem JSON til inspektion og derefter tilbage til PDF +- Genopbygning af dokumenter efter programmatiske ændringer i JSON-strukturen +- Kontrol af, at en PDF-til-JSON-eksport har fanget alt dokumentindhold, ved at konvertere den tilbage + +## Tips + +- Hvis du skal konvertere vilkårlige JSON-data (som API-svar eller konfigurationsfiler) til en formateret PDF, passer værktøjet [Tekst til PDF](./txt-to-pdf) bedre. Indsæt JSON'en som tekst, så gengives den med korrekt formatering. +- CPDF WebAssembly-motoren skal være tilgængelig, for at dette værktøj virker. Selvhostede installationer skal have CPDF WASM-filerne konfigureret. + +## Relaterede værktøjer + +- [Tekst til PDF](./txt-to-pdf) +- [Markdown til PDF](./markdown-to-pdf) +- [CSV til PDF](./csv-to-pdf) diff --git a/docs/da/tools/linearize-pdf.md b/docs/da/tools/linearize-pdf.md new file mode 100644 index 00000000..a615c195 --- /dev/null +++ b/docs/da/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Lineariser PDF +description: Optimér PDF-filer til hurtig visning på nettet med progressiv indlæsning. Også kendt som "Fast Web View"-optimering. +--- + +# Lineariser PDF + +Linearisering omstrukturerer en PDF, så den første side kan vises, før hele filen er downloadet. Adobe kalder det "Fast Web View". Hvis du hoster PDF'er på et websted eller leverer dem via en dokumentportal, gør linearisering dem mærkbart hurtigere at åbne. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. +2. Klik på **Lineariser PDF(er)**. +3. Download resultaterne som et ZIP-arkiv med alle de lineariserede filer. + +Der er ingen indstillinger at konfigurere. Værktøjet bruger QPDF's `--linearize`-flag, som omarrangerer PDF'ens interne struktur uden at ændre det visuelle indhold. + +## Hvad linearisering gør + +- Omordner PDF-objekter, så den første sides data ligger i begyndelsen af filen +- Tilføjer en lineariseringsordbog og hint-tabeller, så læsere ved, hvor hver side findes +- Muliggør byte-range-forespørgsler: en browser kan hente blot den første side uden at downloade hele filen +- Rydder op i krydsreferencetabellen for effektiv tilfældig adgang + +## Funktioner + +- Batchbehandling af flere PDF'er i én handling +- Outputtet bevarer alt indhold, alle skrifttyper, billeder og interaktive elementer +- Bruger QPDF (WebAssembly) til pålidelig, standardkompatibel linearisering +- Resultaterne pakkes i en ZIP-fil for nem download + +## Anvendelsesområder + +- Hosting af PDF-rapporter på et websted, hvor brugerne forventer øjeblikkelig sidevisning +- Indlejring af PDF'er i webapplikationer med viewere i browseren +- Udgivelse af PDF-kataloger eller manualer, der tilgås over langsomme mobilforbindelser +- Klargøring af dokumenter til content delivery networks (CDN'er), der understøtter byte-range-levering + +## Tips + +- Lineariser, når alle andre redigeringer er færdige. Enhver efterfølgende ændring (sammenfletning, tilføjelse af sider) ødelægger lineariseringen. +- Kombinér med Komprimer PDF for de mindste og hurtigst indlæste PDF'er. +- Linearisering tilføjer en lille ekstra mængde til filstørrelsen (typisk under 1 %). + +## Relaterede værktøjer + +- [Komprimer PDF](./compress-pdf): reducer filstørrelsen før linearisering +- [Reparér PDF](./repair-pdf): ret strukturelle problemer, der forhindrer linearisering +- [Fjern metadata](./remove-metadata): fjern metadata før udgivelse online diff --git a/docs/da/tools/markdown-to-pdf.md b/docs/da/tools/markdown-to-pdf.md new file mode 100644 index 00000000..01045bb4 --- /dev/null +++ b/docs/da/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown til PDF +description: Skriv eller indsæt Markdown, og eksportér det som en professionelt formateret PDF med live forhåndsvisning og syntaksfremhævning. +--- + +# Markdown til PDF + +En fuldt udstyret Markdown-editor med live forhåndsvisning og PDF-eksport med ét klik. Skriv fra bunden, upload en eksisterende `.md`-fil, eller indsæt indhold fra udklipsholderen. Editoren gengiver din Markdown i realtid og eksporterer en formateret PDF med browserens indbyggede udskriftsmotor. + +## Understøttede formater + +| Input | Beskrivelse | +| :------------ | :---------------------------- | +| `.md`-filer | Upload med knappen Upload | +| Direkte input | Skriv eller indsæt i editoren | + +## Sådan fungerer det + +1. Åbn værktøjet Markdown til PDF. Editoren indlæses med delt visning: Markdown-kilde til venstre og gengivet forhåndsvisning til højre. +2. Skriv din Markdown, indsæt den, eller klik på **Upload** for at indlæse en `.md`-fil. +3. Skift mellem lyst og mørkt tema med temaskyderen på værktøjslinjen. +4. Klik på **Eksportér PDF** (eller tryk på `Ctrl/Cmd + S`) for at generere en PDF via browserens udskriftsdialog. + +## Funktioner + +Editoren understøtter et omfattende sæt Markdown-funktioner ud over det grundlæggende: + +- **Standard-Markdown**: overskrifter, fed, kursiv, links, billeder, lister, blokcitater, vandrette streger +- **Kodeblokke** med syntaksfremhævning for 15+ sprog (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash og flere) +- **Mermaid-diagrammer**: rutediagrammer, sekvensdiagrammer, ER-diagrammer og andre Mermaid-diagramtyper gengives direkte i forhåndsvisningen +- **Tabeller** med standard Markdown-tabelsyntaks +- **Opgavelister** med afkrydsningsfelter +- **Fodnoter**, **sænket skrift**, **hævet skrift** +- **Definitionslister**, **forkortelser** +- Understøttelse af **emoji** (`:smile:` gengives som emojien) +- **Fremhævninger** (`==marked text==`) og **indsættelser** (`++inserted text++`) +- **Automatiske links**: almindelige URL'er konverteres til klikbare links +- Generering af **indholdsfortegnelse** +- **Ankerlinks** på overskrifter + +## Anvendelsesområder + +- Skrivning af projektdokumentation og eksport af en poleret PDF til interessenter +- Oprettelse af tekniske rapporter med kodeeksempler og Mermaid-arkitekturdiagrammer +- Konvertering af en GitHub README til en PDF til offlinebrug eller udskrivning +- Udarbejdelse af et forslag eller en specifikation med opgavelister og tabeller +- Generering af et formateret handout fra forelæsningsnotater skrevet i Markdown + +## Tips + +- PDF-outputtet bruger browserens funktion til at udskrive til PDF. I Chrome kan du tilpasse margener og skalering i udskriftsdialogen, før du gemmer. +- Mermaid-diagrammer gengives i forhåndsvisningen, men kan have brug for et øjeblik til at initialisere ved første brug. +- Brug `Ctrl/Cmd + S` som tastaturgenvej til at eksportere uden at række ud efter knappen. + +## Relaterede værktøjer + +- [Tekst til PDF](./txt-to-pdf) +- [Word til PDF](./word-to-pdf) +- [JSON til PDF](./json-to-pdf) diff --git a/docs/da/tools/merge-pdf.md b/docs/da/tools/merge-pdf.md new file mode 100644 index 00000000..8d138da4 --- /dev/null +++ b/docs/da/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Flet PDF +description: Kombinér flere PDF-filer til ét dokument med omrokering via træk og slip og kontrol på sideniveau. +--- + +# Flet PDF + +Kombinér flere PDF-filer til ét dokument. Du kan flette hele filer i en bestemt rækkefølge eller skifte til Sidetilstand for detaljeret kontrol over enkelte sider fra hver uploadet PDF. + +## Sådan fungerer det + +1. Upload to eller flere PDF-filer ved at klikke på slipzonen eller trække dem ind. +2. Vælg mellem **Filtilstand** og **Sidetilstand** med kontakten øverst. +3. I Filtilstand kan du trække filer for at omrokere dem og eventuelt angive sideintervaller (f.eks. `1-3, 5`) for hver fil. Lad intervallet stå tomt for at medtage alle sider. +4. I Sidetilstand kan du trække og slippe miniaturebilleder af enkelte sider for at opbygge din nøjagtige sidesekvens. +5. Klik på **Flet PDF'er** for at kombinere alt i én fil. Den flettede PDF downloades automatisk. + +## Funktioner + +- To fletningstilstande: Filtilstand til hurtig kombination af hele filer, Sidetilstand til kontrol pr. side +- Omrokering med træk og slip i begge tilstande med jævne animationer +- Sideintervalsyntaks (f.eks. `1-3, 5, 8-10`) lader dig udvælge sider uden at skifte til Sidetilstand +- Miniaturebilleder af sider, der indlæses ved behov, holder brugerfladen responsiv, selv med store dokumenter +- Ingen grænse for antallet af filer eller samlet sideantal +- Bevarer den oprindelige PDF-kvalitet uden genkodning + +## Indstillinger + +| Indstilling | Beskrivelse | +| ---------------- | --------------------------------------------------------------------------------------------------------- | +| **Filtilstand** | Flet hele filer i en brugerdefineret rækkefølge, med valgfrie sideintervalfiltre pr. fil | +| **Sidetilstand** | Visuelt gitter med alle sider fra alle filer: træk miniaturebilleder for at opbygge din nøjagtige sekvens | +| **Sidefelt** | Tekstfelt pr. fil, der accepterer intervaller som `1-3, 5` for kun at medtage bestemte sider | + +## Anvendelsesområder + +- Kombinering af separate kapitel-PDF'er til én bog eller rapport +- Sammenfletning af et følgebrev og et CV til ét ansøgningsdokument +- Hentning af bestemte sider fra flere kildedokumenter til en samlet fil +- Samling af scannede kvitteringer eller fakturaer i én arkiv-PDF +- Oprettelse af et præsentationshandout fra slides på tværs af flere præsentationer + +## Tips + +- Brug Sidetilstand, når du skal flette sider fra forskellige filer ind mellem hinanden i stedet for at føje én fil efter en anden. +- Du kan tilføje flere filer efter den første upload med knappen **Tilføj flere filer**, uden at miste din nuværende opstilling. +- Sideintervaller starter ved 1, så `1` henviser til den første side i den pågældende fil. + +## Relaterede værktøjer + +- [Opdel PDF](./split-pdf) +- [Duplikér og organisér](./organize-pdf) +- [Alternér og miks sider](./alternate-merge) +- [Slet sider](./delete-pages) diff --git a/docs/da/tools/mobi-to-pdf.md b/docs/da/tools/mobi-to-pdf.md new file mode 100644 index 00000000..cbb4d479 --- /dev/null +++ b/docs/da/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI til PDF +description: Konvertér MOBI-ebogsfiler til PDF direkte i din browser. Gratis, privat, ingen filuploads. +--- + +# MOBI til PDF + +Konvertér Amazon Kindle MOBI-ebøger til PDF-dokumenter. MOBI-filer er knyttet til Kindle-enheder og -apps, hvilket gør dem svære at læse andre steder. Ved at konvertere til PDF får du en bærbar version, som du kan åbne på enhver enhed eller udskrive. + +## Understøttede formater + +| Format | Filtypenavn | Bemærkninger | +| :----- | :---------- | :------------------------------ | +| MOBI | `.mobi` | Kindle-ebogsformat (Mobipocket) | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip en eller flere MOBI-filer. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurv-ikonet, eller brug **Tilføj flere filer** for at tilføje flere ebøger. +3. Klik på **Konvertér til PDF**. PyMuPDF-motoren fortolker MOBI-strukturen og gengiver hver side som PDF-indhold. +4. En enkelt fil downloades som PDF. Når du konverterer flere filer, får du et ZIP-arkiv med navnet `mobi-converted.zip`. + +## Indstillinger + +Der er ikke brug for yderligere indstillinger. Konverteringen bevarer tekstindhold, formatering og indlejrede billeder fra den oprindelige MOBI-fil. + +## Anvendelsesområder + +- Læsning af indhold købt på Kindle på en e-læser uden Kindle, som kun understøtter PDF +- Udskrivning af kapitler fra en ebog til offlinestudie eller annotering +- Arkivering af dit personlige ebogsbibliotek i et universelt format +- Deling af uddrag med en person, der ikke har Kindle-appen installeret + +## Tips + +- DRM-beskyttede MOBI-filer kan ikke konverteres. Værktøjet virker kun med DRM-frie MOBI-filer. +- Store ebøger med mange indlejrede billeder kan tage et par sekunder længere at behandle, da alt sker i browseren. + +## Relaterede værktøjer + +- [EPUB til PDF](./epub-to-pdf) +- [FB2 til PDF](./fb2-to-pdf) +- [CBZ til PDF](./cbz-to-pdf) diff --git a/docs/da/tools/n-up-pdf.md b/docs/da/tools/n-up-pdf.md new file mode 100644 index 00000000..7fc5d1b9 --- /dev/null +++ b/docs/da/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Arrangér flere PDF-sider på ét ark i et gitterlayout til kompakt udskrivning. +--- + +# N-Up PDF + +Placér flere sider på ét ark i et gitterarrangement. Det reducerer antallet af udskrevne sider ved at samle 2, 4, 6, 8, 9 eller 16 sider pr. ark. Værktøjet håndterer skalering, placering og valgfri konfiguration af sidestørrelse. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Vælg antallet af sider pr. ark ("N"-værdien): 2, 4, 6, 8, 9 eller 16. +3. Vælg outputsidens størrelse (standard er A4) og orientering. +4. Konfigurér eventuelt afstand, kantfarve og baggrundsfarve. +5. Klik på behandlingsknappen. Værktøjet skalerer hver side og lægger dem i fliser på nye ark. + +## Funktioner + +- Gitterlayouts: 2-up, 4-up, 6-up, 8-up, 9-up og 16-up +- Konfigurerbar outputsidestørrelse og orientering +- Valgfri afstand mellem de placerede sider +- Indstillinger for baggrunds- og kantfarve +- Bevarer de oprindelige siders højde-bredde-forhold under skalering + +## Indstillinger + +| Indstilling | Beskrivelse | +| ------------------ | -------------------------------------------------------------- | +| **Sider pr. ark** | Antal oprindelige sider på hver outputside (2, 4, 6, 8, 9, 16) | +| **Sidestørrelse** | Outputarkets størrelse (A4, Letter, Legal osv.) | +| **Orientering** | Stående eller liggende for outputarket | +| **Afstand** | Mellemrum i punkter mellem de placerede sider | +| **Baggrundsfarve** | Fyldfarve til outputarkets baggrund | +| **Kantfarve** | Farve til kanter omkring hver placeret side | + +## Anvendelsesområder + +- Udskrivning af handouts med 4 slides pr. side for at spare papir +- Oprettelse af studieark med flere referencesider på ét ark +- Produktion af kompakte dokumentarkiver til opbevaring +- Generering af miniatureoversigtsark af et langt dokument + +## Tips + +- Liggende orientering fungerer ofte bedre til 2-up-layouts, mens stående normalt er bedst til 4-up og derover. +- Større afstand forbedrer læsbarheden, men reducerer det tilgængelige areal til hver placeret side. +- For den omvendte handling (opdeling af én side i flere) se [Posterisér PDF](./posterize-pdf). + +## Relaterede værktøjer + +- [Posterisér PDF](./posterize-pdf) +- [PDF-hæfte](./pdf-booklet) +- [Kombinér til én side](./combine-single-page) diff --git a/docs/da/tools/ocr-pdf.md b/docs/da/tools/ocr-pdf.md new file mode 100644 index 00000000..0f1eb770 --- /dev/null +++ b/docs/da/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Gør scannede PDF'er søgbare og kopierbare med Tesseract OCR med understøttelse af flere sprog og tegnfiltrering. +--- + +# OCR PDF + +Omdan scannede dokumenter til søgbare, kopierbare PDF'er. Værktøjet bruger Tesseract OCR til at genkende tekst i billeder og lægger et usynligt tekstlag oven på de oprindelige sider, så det visuelle udseende bevares, mens indholdet bliver fuldt søgbart. + +## Sådan fungerer det + +1. Upload en scannet PDF eller en billedbaseret PDF-fil. +2. Vælg et eller flere sprog, der findes i dokumentet, i den søgbare sprogliste. +3. Juster eventuelt avancerede indstillinger (opløsning, binarisering, whitelist). +4. Klik på **Start OCR**, og følg fremdriften i statuslinjen i realtid. +5. Når det er færdigt, kan du gennemgå den udtrukne tekst og derefter downloade den søgbare PDF eller en almindelig `.txt`-fil. + +## Funktioner + +- OCR på flere sprog med en søgbar sprogvælger +- Usynligt tekstlag bevarer dokumentets oprindelige udseende +- Statuslinje og logoutput i realtid under behandlingen +- Download resultater som søgbar PDF eller almindelig tekstfil +- Kopiér udtrukket tekst direkte til udklipsholderen +- Tre opløsningsniveauer til at afveje hastighed mod nøjagtighed + +## Indstillinger + +| Indstilling | Værdier | Standard | Formål | +| --------------------------------------- | ----------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------------------------------------- | +| **Opløsning** | Standard (192 DPI), Høj (288 DPI), Ultra (384 DPI) | Høj | Højere opløsning forbedrer nøjagtigheden på lille tekst, men tager længere tid | +| **Binarisér billede** | Til / Fra | Fra | Forbedrer kontrasten for rene scanninger ved at konvertere til sort og hvid | +| **Forudindstilling for tegn-whitelist** | Ingen, Alfanumerisk, Tal + valuta, Kun bogstaver, Kun tal, Faktura, Formularer, Brugerdefineret | Ingen | Begrænser genkendte tegn for at forbedre nøjagtigheden for bestemte dokumenttyper | +| **Tegn-whitelist** | Fri tekst | Tom | Manuelt tegnsæt, når forudindstillingen er sat til Brugerdefineret | + +## Anvendelsesområder + +- Gør scannede kontrakter og fakturaer søgbare, så du kan bruge Ctrl+F i dem +- Udtrækning af tekst fra fotograferede dokumenter eller gamle papirarkiver +- Behandling af kvitteringer med forudindstillingen Faktura for nøjagtigt at fange beløb og datoer +- Oprettelse af tilgængelige PDF'er fra scanninger, der kun består af billeder, til compliancekrav +- Batchudtrækning af tekstindhold fra scannede bøger eller manualer + +## Tips + +- Vælg flere sprog, hvis dit dokument indeholder tekst på blandede sprog (f.eks. engelske overskrifter med japansk brødtekst). +- Brug binariseringsindstillingen til dokumenter med falmet tekst eller lav kontrast. Den kan forbedre genkendelsesnøjagtigheden markant. +- Forudindstillingerne Faktura og Formularer reducerer falske positiver kraftigt på strukturerede dokumenter ved at ignorere irrelevante tegnformer. + +## Relaterede værktøjer + +- [Udtræk PDF-tabeller](./extract-tables) +- [Flet PDF](./merge-pdf) +- [Komprimer PDF](./compress-pdf) diff --git a/docs/da/tools/odg-to-pdf.md b/docs/da/tools/odg-to-pdf.md new file mode 100644 index 00000000..8a9c1b20 --- /dev/null +++ b/docs/da/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG til PDF +description: Konvertér LibreOffice Draw-filer (ODG) til PDF i din browser. Gratis, ingen upload, fuldt privat. +--- + +# ODG til PDF + +Konvertér OpenDocument Graphics-filer til PDF. ODG er det oprindelige format for LibreOffice Draw og bruges til diagrammer, rutediagrammer og vektorillustrationer. Ved at konvertere til PDF bliver disse tegninger nemme at dele, udskrive og indlejre i andre dokumenter. + +## Understøttede formater + +| Format | Filtypenavn | Bemærkninger | +| :-------------------- | :---------- | :---------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw- / OpenOffice Draw-filer | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine ODG-filer. Flere filer kan tilføjes på én gang. +2. Gennemgå fillisten. Fjern enkelte poster med papirkurv-ikonet, eller klik på **Tilføj flere filer** for at tilføje flere tegninger. +3. Klik på **Konvertér til PDF**. En LibreOffice-baseret motor indlæses i browseren og konverterer hver ODG-fil, så vektorgrafik, former og tekst bevares. +4. Én fil downloades direkte som PDF. Flere filer giver et ZIP-arkiv med navnet `odg-to-pdf.zip`. + +## Indstillinger + +Der kræves ingen yderligere indstillinger. Konverteringen bevarer de oprindelige sidemål, former, konnektorer og tekstbokse fra ODG-kilden. + +## Anvendelsesområder + +- Deling af LibreOffice Draw-diagrammer med kunder, der ikke har LibreOffice installeret +- Udskrivning af rutediagrammer og netværksdiagrammer oprettet i Draw +- Medtagelse af ODG-illustrationer i en rapport eller præsentation som indlejrede PDF'er +- Arkivering af tekniske tegninger i et format, der forbliver læsbart i årtier + +## Tips + +- Vektorelementer forbliver vektorer i PDF-outputtet, så resultatet skalerer rent til enhver udskriftsstørrelse. +- LibreOffice-motoren bruger et øjeblik på at initialisere ved første brug. Konverteringer i samme session derefter går hurtigere. + +## Relaterede værktøjer + +- [ODS til PDF](./ods-to-pdf) +- [ODP til PDF](./odp-to-pdf) +- [VSD til PDF](./vsd-to-pdf) diff --git a/docs/da/tools/odp-to-pdf.md b/docs/da/tools/odp-to-pdf.md new file mode 100644 index 00000000..5d08aa63 --- /dev/null +++ b/docs/da/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP til PDF +description: Konvertér LibreOffice Impress-præsentationer (ODP) til PDF i din browser. Gratis, privat, ingen upload. +--- + +# ODP til PDF + +Konvertér OpenDocument Presentation-filer til PDF. ODP er det oprindelige format for LibreOffice Impress og en standardeksport fra Google Slides. Når præsentationer bliver til PDF'er, kan alle se dem uden præsentationssoftware, og slides udskrives rent. + +## Understøttede formater + +| Format | Filtypenavn | Bemærkninger | +| :------------------------ | :---------- | :------------------------------------------ | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides-eksport | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine ODP-filer. Du kan vælge flere præsentationer på én gang. +2. Gennemgå fillisten. Fjern poster med papirkurv-ikonet, eller brug **Tilføj flere filer** for at tilføje flere præsentationer. +3. Klik på **Konvertér til PDF**. Den LibreOffice-baserede motor behandler hver præsentation og producerer en PDF, hvor hvert slide bliver til en side. +4. En enkelt fil downloades som PDF. Flere filer leveres i et ZIP-arkiv med navnet `odp-to-pdf.zip`. + +## Indstillinger + +Ingen indstillinger at konfigurere. Hvert slide gengives i sine oprindelige mål, så tekst, billeder, former og slidebaggrunde bevares. + +## Anvendelsesområder + +- Udlevering af en præsentation til et publikum som handout-PDF +- Deling af Google Slides-eksporter med personer, der foretrækker PDF frem for ODP +- Arkivering af konferenceindlæg og forelæsninger i et skrivebeskyttet format +- Udskrivning af slideshows til workshops på stedet + +## Tips + +- Slideovergange og animationer er rent visuelle funktioner, der ikke overføres til PDF, men alt statisk indhold gengives korrekt. +- Talenoter medtages ikke i PDF-outputtet. Hvis du har brug for noter, skal du eksportere dem separat fra din præsentationssoftware. +- Ligesom de andre LibreOffice-baserede værktøjer indlæses motoren ved første brug og forbliver cachet i sessionen. + +## Relaterede værktøjer + +- [ODG til PDF](./odg-to-pdf) +- [ODS til PDF](./ods-to-pdf) +- [PUB til PDF](./pub-to-pdf) diff --git a/docs/da/tools/ods-to-pdf.md b/docs/da/tools/ods-to-pdf.md new file mode 100644 index 00000000..235f2613 --- /dev/null +++ b/docs/da/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS til PDF +description: Konvertér LibreOffice Calc-regneark (ODS) til PDF i din browser. Gratis, privat, uden tilmelding. +--- + +# ODS til PDF + +Konvertér OpenDocument Spreadsheet-filer til PDF. ODS er det oprindelige format i LibreOffice Calc og en almindelig eksport fra Google Sheets. Værktøjet gengiver dine regnearksdata, formatering og diagrammer som en PDF med sideinddeling, som du kan udskrive eller dele. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----------------------- | :---------- | :--------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / Google Sheets-eksport | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine ODS-filer. Flere filer understøttes. +2. Gennemgå fillisten. Brug papirkurvsikonet til at fjerne filer, eller klik på **Tilføj flere filer** for at udvide batchen. +3. Klik på **Konvertér til PDF**. LibreOffice-baseret motor indlæses i browseren og gengiver hvert regneark som PDF-sider. +4. Et enkelt regneark downloades som en PDF. Flere filer pakkes i `ods-to-pdf.zip`. + +## Indstillinger + +Ingen konfiguration er nødvendig. Konverteren bruger regnearkets eksisterende udskriftslayout, cellformatering og kolonnebredder i PDF-outputtet. + +## Anvendelser + +- Dele et budget eller en rapport fra LibreOffice Calc med en, der kun accepterer PDF-filer +- Udskrive en Google Sheets-eksport, der blev downloadet som ODS +- Arkivere økonomiske optegnelser i et format, der ikke kan redigeres +- Indsende ODS-baserede formularer eller timesedler som dokumenter med fast layout + +## Tips + +- Hvis dit regneark har flere ark, medtages alle ark i PDF-outputtet. +- Meget brede regneark kan fordele sig over flere PDF-sider vandret. Overvej at justere kolonnebredderne i kildefilen før konvertering, hvis layoutet er vigtigt. +- LibreOffice-motoren initialiseres ved første brug. Efterfølgende konverteringer i samme session går hurtigere. + +## Relaterede værktøjer + +- [ODG til PDF](./odg-to-pdf) +- [ODP til PDF](./odp-to-pdf) +- [XML til PDF](./xml-to-pdf) diff --git a/docs/da/tools/odt-to-pdf.md b/docs/da/tools/odt-to-pdf.md new file mode 100644 index 00000000..c42ec8ee --- /dev/null +++ b/docs/da/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT til PDF +description: Konvertér OpenDocument Text-filer (ODT) til PDF i din browser med en LibreOffice-drevet motor. +--- + +# ODT til PDF + +Konvertér OpenDocument Text-filer til PDF. ODT er det oprindelige format i LibreOffice Writer, Apache OpenOffice og andre open source-tekstbehandlingsprogrammer. Værktøjet bruger en browserbaseret LibreOffice-motor til at lave præcise konverteringer, der bevarer formatering, tabeller, billeder og typografier. + +## Understøttede formater + +| Format | Filtypenavne | +| :---------------- | :----------- | +| OpenDocument Text | `.odt` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip en eller flere ODT-filer. +2. Gennemgå fillisten. Tilføj flere filer, eller fjern uønskede. +3. Klik på **Konvertér til PDF**. LibreOffice-motoren initialiseres (en statusindikator viser indlæsningen), og derefter konverteres hver fil. +4. En enkelt fil downloades direkte som PDF. Flere filer pakkes i `odt-converted.zip`. + +## Indstillinger + +Dette værktøj har ingen yderligere konfiguration. Konverteringen bevarer dokumentets oprindelige formatering så præcist som muligt. + +## Output + +| Antal inputfiler | Output | +| :--------------- | :------------------------------------------------- | +| 1 fil | Enkelt PDF-download (f.eks. `document.pdf`) | +| 2+ filer | ZIP-arkiv (`odt-converted.zip`) med én PDF pr. fil | + +## Anvendelser + +- Konvertere LibreOffice Writer-dokumenter til PDF, så de kan deles med Microsoft Office-brugere +- Lave udskriftsklare PDF-filer af akademiske artikler skrevet i OpenDocument-format +- Batchkonvertere en mappe med ODT-skabeloner til PDF-filer til distribution +- Generere PDF-filer fra ODT-filer oprettet af automatiske dokumentgenereringssystemer + +## Tips + +- LibreOffice-motoren indlæses ved første brug og gemmes i cachen til efterfølgende konverteringer. Den første indlæsning tager nogle sekunder, derefter går konverteringerne hurtigt. +- Komplekse dokumenter med indlejrede OLE-objekter eller usædvanlige skrifttyper kan gengives en smule anderledes end i LibreOffice på computeren. Test med en prøve, før du batchkonverterer. +- Til Word-dokumenter (`.doc`, `.docx`) skal du bruge værktøjet [Word til PDF](./word-to-pdf), som også bruger LibreOffice-motoren, men accepterer Microsoft-formater direkte. + +## Relaterede værktøjer + +- [Word til PDF](./word-to-pdf) +- [RTF til PDF](./rtf-to-pdf) +- [Tekst til PDF](./txt-to-pdf) diff --git a/docs/da/tools/organize-pdf.md b/docs/da/tools/organize-pdf.md new file mode 100644 index 00000000..b95201cf --- /dev/null +++ b/docs/da/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplikér og organisér +description: Omarranger, duplikér og slet PDF-sider med træk og slip-miniaturer og brugerdefineret siderækkefølge. +--- + +# Duplikér og organisér + +Omarranger, duplikér og fjern sider i en PDF med en visuel træk og slip-grænseflade. Hver side vises som en miniature, som du kan flytte, kopiere eller slette, før du gemmer resultatet som en ny fil. + +## Sådan fungerer det + +1. Upload en enkelt PDF-fil. +2. Værktøjet gengiver et miniaturegitter med alle sider. +3. Træk miniaturer for at ændre rækkefølgen, klik på den grønne duplikeringsknap for at kopiere en side, eller klik på den røde sletteknap for at fjerne en. +4. Du kan også skrive en brugerdefineret siderækkefølge i tekstfeltet (f.eks. `3, 1, 2, 4`) og klikke på **Anvend** for at omarrangere alle sider på én gang. +5. Klik på procesknappen for at bygge og downloade den omorganiserede PDF. + +## Funktioner + +- Omarrangering af sider med træk og slip og animerede overgange +- Duplikerings- og sletteknapper for hver side +- Indtastning af brugerdefineret siderækkefølge til præcis omarrangering +- Sidetalsetiketter, der opdateres automatisk efter hver ændring +- Forhindrer sletning af den sidste resterende side + +## Anvendelser + +- Flytte en forkert placeret side til den rigtige position i en rapport +- Duplikere en formularside, så du har flere blanke kopier i én fil +- Fjerne kladde- eller pladsholdersider, før et dokument distribueres +- Vende eller blande siderækkefølgen som forberedelse til udskrivning +- Bygge en brugerdefineret sidesekvens uden at flette separate filer igen + +## Tips + +- Feltet til brugerdefineret rækkefølge forventer kommaseparerede oprindelige sidetal. Det skal indeholde hver side præcis én gang, uden udeladelser eller dubletter. +- Når du har duplikeret en side, refererer begge kopier til det samme oprindelige sideindeks. Du kan omarrangere hver kopi uafhængigt. +- Til masseoperationer på tværs af flere filer eller mere avancerede arbejdsgange kan du i stedet bruge [PDF Multi-værktøj](./pdf-multi-tool). + +## Relaterede værktøjer + +- [Flet PDF](./merge-pdf) +- [Slet sider](./delete-pages) +- [PDF Multi-værktøj](./pdf-multi-tool) +- [Vend sider](./reverse-pages) diff --git a/docs/da/tools/page-dimensions.md b/docs/da/tools/page-dimensions.md new file mode 100644 index 00000000..d9c56dc2 --- /dev/null +++ b/docs/da/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Sidestørrelser +description: Analysér PDF-sidestørrelser, orienteringer, billedformater og rotation. Find dokumenter med blandede størrelser, og eksportér data til CSV. +--- + +# Sidestørrelser + +Et diagnosticeringsværktøj, der læser hver side i din PDF og rapporterer dens præcise mål, orientering, standardstørrelsesnavn, billedformat, areal og rotation. Nyttigt til at opdage sider i blandede størrelser før udskrivning eller til at dokumentere egenskaberne for en PDF, du har modtaget. + +## Sådan fungerer det + +1. Upload en PDF-fil. Analysen starter automatisk, så der er ingen knap at trykke på. +2. Et oversigtspanel viser det samlede sideantal, antallet af unikke sidestørrelser, og om dokumentet har blandede størrelser. +3. Gennemse den fulde resultattabel med detaljer for hver side. +4. Skift visningsenhed mellem punkter, tommer, millimeter eller pixel. +5. Klik på **Eksportér til CSV** for at gemme dataene. + +## Rapporterede felter + +| Kolonne | Beskrivelse | +| ----------------- | ------------------------------------------------------ | +| Side nr. | Fortløbende sidetal | +| Mål | Bredde x højde i den valgte enhed | +| Standardstørrelse | Matchet navn (A4, Letter osv.) eller "Brugerdefineret" | +| Orientering | Stående eller liggende | +| Billedformat | Forholdet mellem bredde og højde som decimaltal | +| Areal | Sidens areal i den valgte enhed i anden | +| Rotation | Sidens rotation i grader | + +## Funktioner + +- Automatisk genkendelse af standardpapirstørrelser (A3, A4, A5, Letter, Legal, Tabloid og flere) +- Advarsel om blandede størrelser med en oversigt over, hvilke størrelser der forekommer, og hvor mange sider der bruger hver +- Enhedsomregning mellem punkter, tommer, millimeter og pixel (ved 96 PPI) +- CSV-eksport til brug i regneark eller dokumentationssystemer + +## Anvendelser + +- Kontrollere, at alle sider er A4, før et dokument sendes til et trykkeri +- Finde ud af, hvorfor en flettet PDF udskrives med uventede margener på bestemte sider +- Dokumentere sidelayoutet i et stort PDF-arkiv til metadataoptegnelser +- Finde roterede sider, der skal rettes + +## Tips + +- Hvis oversigten viser "Blandede størrelser", kan du bruge værktøjet Ret sidestørrelse til at standardisere før udskrivning. +- Rotationsfeltet hjælper med at finde sider, der vises korrekt, men har en rotationsattribut forskellig fra nul, hvilket kan give problemer i nogle arbejdsgange. + +## Relaterede værktøjer + +- [Ret sidestørrelse](./fix-page-size): standardisér sider, når du har fundet blandede størrelser +- [Komprimer PDF](./compress-pdf): optimér PDF'en, når sideproblemerne er rettet +- [Roter PDF](./rotate-pdf): ret roterede sider diff --git a/docs/da/tools/page-numbers.md b/docs/da/tools/page-numbers.md new file mode 100644 index 00000000..27950e01 --- /dev/null +++ b/docs/da/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Sidetal +description: Tilføj tilpassede sidetal på en valgfri position på dine PDF-sider med konfigurerbar skrifttype, størrelse og farve. +--- + +# Sidetal + +Tilføj synlige sidetal på hver side i din PDF. Du vælger position, format, skriftstørrelse og farve, og værktøjet klarer resten. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Konfigurér indstillingerne for sidetal i det indstillingspanel, der vises. +3. Klik på **Tilføj sidetal** for at behandle. +4. Den nummererede PDF downloades automatisk. + +## Indstillinger + +- **Position**: Vælg, hvor sidetallene vises: nederst i midten, nederst til venstre, nederst til højre, øverst i midten, øverst til venstre eller øverst til højre. +- **Format**: Vælg mellem enkel nummerering (1, 2, 3...) eller formatet "side X af Y" (1 / 5, 2 / 5...). +- **Skriftstørrelse**: Angiv størrelsen på sidetallets tekst. Standard er 12. +- **Farve**: Vælg en vilkårlig farve til sidetallets tekst med farvevælgeren. + +## Funktioner + +- Seks placeringsmuligheder, der dækker alle hjørner og midterpositioner +- To nummereringsformater: enkel fortløbende eller "side X af Y" +- Tilpasselig skriftstørrelse fra 6 til 72 punkter +- Fuld farvevælger til tekstfarven +- Automatisk margenhåndtering, der holder tallene inden for sikre områder uanset sidestørrelse + +## Anvendelser + +- Forberede dokumenter til udskrivning, der har brug for synlige sidehenvisninger +- Tilføje sidetal til en flettet PDF lavet af flere kildefiler +- Nummerere præsentationsudleveringer før distribution +- Tilføje fortløbende nummerering til juridiske dokumenter eller kontrakter + +## Tips + +- Formatet "side X af Y" er nyttigt til dokumenter, hvor læserne skal kende den samlede længde, f.eks. tilbud eller rapporter. +- Hvis du har brug for forskellige nummereringsstile til forskellige afsnit (f.eks. romertal i forsiden), kan du i stedet bruge værktøjet [Tilføj sideetiketter](./add-page-labels). + +## Relaterede værktøjer + +- [Tilføj sideetiketter](./add-page-labels) +- [Bates-nummerering](./bates-numbering) +- [Sidehoved og sidefod](./header-footer) diff --git a/docs/da/tools/pdf-booklet.md b/docs/da/tools/pdf-booklet.md new file mode 100644 index 00000000..87339942 --- /dev/null +++ b/docs/da/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF-hæfte +description: Omarranger PDF-sider i hæfterækkefølge (rygstikning) til foldning og hæftning til et fysisk hæfte. +--- + +# PDF-hæfte + +Omarranger siderne i en PDF til hæfteimposition. Når den udskrives dobbeltsidet og foldes på midten, står siderne i den rigtige læserækkefølge. Det er det layout, der bruges til hæfter med rygstikning og zines. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Konfigurér hæfteindstillinger: outputsidestørrelse og orientering. +3. Klik på **Generér forhåndsvisning** for at se, hvordan siderne placeres på hvert ark. +4. Gennemgå forhåndsvisningen, som viser hvert fysiske ark med tildelingen af for- og bagside. +5. Klik på **Download** for at gemme den hæfteimponerede PDF. + +## Funktioner + +- Automatisk omarrangering af sider til rygstikning +- Konfigurerbar outputsidestørrelse +- Visuel forhåndsvisning af hæftelayoutet før download +- Håndterer ulige sideantal ved at indsætte blanke sider, hvor det er nødvendigt +- Skalerer kildesiderne, så de passer til hæftearkets størrelse + +## Anvendelser + +- Lave udskrivbare hæfter eller zines af en almindelig PDF +- Forberede konferenceprogrammer eller begivenhedsguider til udskrivning internt +- Lave foldede lykønskningskort eller små kataloger +- Producere små digtsamlinger til håndindbinding + +## Tips + +- Din kilde-PDF bør helst have et sideantal, der er deleligt med 4, for et rent hæfte. Hvis det ikke er tilfældet, tilføjes der automatisk blanke sider for at fylde det sidste ark ud. +- Udskriv outputtet dobbeltsidet med printerens indstilling "vend på kort led", fold derefter alle ark sammen, og hæft ved ryggen. +- Hvis du blot vil placere flere sider på ét ark uden hæfterækkefølge, kan du i stedet bruge [N-Up PDF](./n-up-pdf). + +## Relaterede værktøjer + +- [N-Up PDF](./n-up-pdf) +- [Roter PDF](./rotate-pdf) +- [Tilføj tom side](./add-blank-page) diff --git a/docs/da/tools/pdf-layers.md b/docs/da/tools/pdf-layers.md new file mode 100644 index 00000000..18daacac --- /dev/null +++ b/docs/da/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCG +description: Vis, skift, tilføj og slet OCG-lag (Optional Content Group) i et PDF-dokument. +--- + +# PDF OCG-lag + +Administrér de valgfrie indholdsgrupper (OCG), som ofte kaldes "lag", i en PDF. Du kan skifte lags synlighed, tilføje nye lag (også indlejrede underlag), slette lag og gemme den ændrede PDF. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Klik på procesknappen for at indlæse dokumentet med PyMuPDF-motoren. +3. Værktøjet viser alle eksisterende lag med deres synlighedstilstand, låsestatus og indlejringshierarki. +4. Slå afkrydsningsfelter til eller fra for at vise eller skjule lag. Låste lag kan ikke skiftes. +5. Tilføj nye lag på øverste niveau ved at skrive et navn og klikke på tilføjknappen, eller tilføj underlag under et eksisterende overordnet lag. +6. Slet lag, du ikke længere har brug for. +7. Klik på **Gem** for at downloade den ændrede PDF med dine lagændringer anvendt. + +## Funktioner + +- Viser lagets hierarki med korrekt indrykning for indlejrede lag +- Slå lags synlighed til eller fra +- Indikator for låste lag forhindrer utilsigtede ændringer +- Tilføj lag på øverste niveau eller underlag med brugerdefinerede navne +- Slet enkelte lag +- Gemmer alle ændringer i en ny PDF-fil + +## Anvendelser + +- Skifte synligheden af markeringslag i arkitekt- eller ingeniørtegninger +- Tilføje nye annotationslag til et designdokument med flere lag +- Fjerne forældede lag fra en skabelon, før den distribueres +- Undersøge, hvilke lag der findes i en kompleks PDF modtaget fra en tredjepart + +## Tips + +- Hvis PDF'en ikke har nogen lag, viser værktøjet en tom tilstand med en opfordring til at tilføje et. Ikke alle PDF-filer bruger OCG-lag. De er mest almindelige i CAD-eksporter og designfiler. +- Underlag er visuelt indrykket under deres overordnede lag. Du kan indlejre lag i vilkårlig dybde. +- Låste lag vises med et låseikon, og deres afkrydsningsfelter er deaktiverede. Disse låse er sat af PDF'ens skaber. + +## Relaterede værktøjer + +- [Vis metadata](./view-metadata) +- [Redigér metadata](./edit-metadata) +- [Duplikér og organisér](./organize-pdf) diff --git a/docs/da/tools/pdf-multi-tool.md b/docs/da/tools/pdf-multi-tool.md new file mode 100644 index 00000000..e399658c --- /dev/null +++ b/docs/da/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF-multiværktøj +description: En alt-i-ét sideadministrator til at flette, opdele, rotere, duplikere, slette og omarrangere PDF-sider. +--- + +# PDF-multiværktøj + +Et samlet arbejdsområde til alle sideoperationer i PDF. Upload en eller flere PDF-filer, og arbejd med alle deres sider i ét visuelt gitter. Roter, omarranger, duplikér, slet, indsæt nye PDF-filer, tilføj blanke sider og opdel resultatet, uden at forlade værktøjet. + +## Sådan fungerer det + +1. Klik på **Upload PDF'er**, eller træk filer ind på uploadområdet. Flere filer understøttes. +2. Alle sider fra hver uploadet fil vises i et rullbart gitter med miniaturer. +3. Brug værktøjslinjen eller knapperne for hver side til at ændre siderne. +4. Vælg sider med afkrydsningsfeltet på hvert kort, og anvend derefter masseoperationer. +5. Marker opdelingspunkter med saksikonet for at dele outputtet i separate filer. +6. Klik på **Eksportér PDF** for at downloade det endelige resultat. Hvis der er opdelingsmarkører, bliver outputtet en ZIP med flere PDF-filer. + +## Funktioner + +- **Flet**: Upload flere PDF-filer, og de kombineres automatisk i ét arbejdsområde +- **Omarranger**: Træk og slip sidekort for at ændre rækkefølgen +- **Roter**: Rotation af enkelte sider eller i bulk i trin på 90 grader (venstre eller højre) +- **Duplikér**: Kopiér en vilkårlig side med ét klik +- **Slet**: Fjern enkelte sider, eller slet markerede sider i bulk +- **Indsæt PDF**: Tilføj en ny PDF efter en bestemt side +- **Tilføj tom side**: Tilføj en blank A4-side til sidst +- **Opdel**: Placér opdelingsmarkører mellem sider, og eksportér derefter som en ZIP med separate PDF-filer +- **Vælg alle / Fravælg alle**: Hurtig markering til masseoperationer +- **Fortryd / Gentag**: Fuld historik for fortryd og gentag for hver operation +- **Download valgte**: Eksportér kun de valgte sider som en selvstændig PDF +- Reparerer automatisk beskadigede PDF-filer, før de indlæses + +## Anvendelser + +- Bygge et brugerdefineret dokument af sider fra flere kilde-PDF'er +- Rydde op i et scannet dokument ved at slette blanke sider, rotere sidelæns scanninger og omarrangere afsnit +- Opdele en stor PDF ved kapitelgrænser med visuelle opdelingsmarkører +- Hurtig redigering på sideniveau uden behov for en fuld PDF-editor + +## Tips + +- Fortryd/gentag-systemet registrerer hver operation. Brug det frit, for du kan ikke ved et uheld ødelægge dit arbejde. +- Opdelingsmarkører vises som stiplede blå linjer mellem siderne. Placér dem visuelt, hvor dokumentet skal deles, og eksportér derefter for at få en ZIP. +- Til simple flet- eller opdelingsopgaver kan de dedikerede værktøjer [Flet PDF](./merge-pdf) eller [Opdel PDF](./split-pdf) være hurtigere. Multi-værktøjet er bedst, når du har brug for flere operationer i én session. + +## Relaterede værktøjer + +- [Flet PDF](./merge-pdf) +- [Opdel PDF](./split-pdf) +- [Duplikér og organisér](./organize-pdf) +- [Roter PDF](./rotate-pdf) diff --git a/docs/da/tools/pdf-to-bmp.md b/docs/da/tools/pdf-to-bmp.md new file mode 100644 index 00000000..645a70b4 --- /dev/null +++ b/docs/da/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF til BMP +description: Konvertér PDF-sider til ukomprimerede BMP-billeder. Nyttigt til ældre systemer og udskriftsarbejdsgange, der kræver bitmap som input. +--- + +# PDF til BMP + +Konverterer hver side i en PDF til et BMP-billede (bitmap). BMP er et ukomprimeret format, så outputtet er pixelperfekt uden kvalitetstab, men filerne er store. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Klik på **Konvertér** for at behandle filen. +3. En enkelt `.bmp`-fil eller et ZIP-arkiv downloades automatisk. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Siderne gengives i en fast skala på 2x, hvilket giver billeder på cirka dobbelt så store som PDF'ens oprindelige sidemål. + +## Outputformat + +- **Enkelt side**: `filename.bmp` +- **Flere sider**: `filename_bmps.zip` med `page_1.bmp`, `page_2.bmp` osv. + +## Anvendelser + +- Sende PDF-sider ind i ældre systemer eller hardware, der kun accepterer BMP som input. +- Forberede ukomprimerede billeder til bestemte udskriftsarbejdsgange. +- Bruge bitmap-output som input til billedbehandlingsværktøjer, der kræver rå pixeldata. + +## Tips + +- BMP-filer er meget store, fordi de gemmer rå pixeldata uden komprimering. Til de fleste formål giver [PDF til PNG](./pdf-to-png) tabsfri kvalitet med langt mindre filer. +- Hvis dit målsystem accepterer PNG eller TIFF, bør du foretrække de formater for at spare diskplads. + +## Relaterede værktøjer + +- [PDF til PNG](./pdf-to-png) +- [PDF til TIFF](./pdf-to-tiff) +- [PDF til JPG](./pdf-to-jpg) diff --git a/docs/da/tools/pdf-to-cbz.md b/docs/da/tools/pdf-to-cbz.md new file mode 100644 index 00000000..067ee1a1 --- /dev/null +++ b/docs/da/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF til CBZ +description: Konvertér en PDF til en CBZ-fil (Comic Book Archive) til tegneserielæsere som Komga, Kavita, CDisplayEx og Calibre. +--- + +# PDF til CBZ + +Konverterer en PDF til en CBZ-fil (Comic Book ZIP), standardformatet til digitale tegneserier og manga. Hver PDF-side bliver til et billede i arkivet. Værktøjet genererer metadata i tre formater for maksimal kompatibilitet: ComicInfo.xml, metadata.opf og ComicBookInfo JSON. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Vælg billedformat, kvalitet, skala og valgfri metadata. +3. Klik på **Konvertér** for at generere CBZ-filen. +4. `.cbz`-filen downloades automatisk. + +## Indstillinger + +| Indstilling | Værdier | Standard | Beskrivelse | +| --------------- | --------------- | -------- | ---------------------------------------------------------------------------------------- | +| Billedformat | JPEG, PNG, WebP | JPEG | JPEG til farvetegneserier, PNG til tabsfri sort-hvid manga, WebP til bedst komprimering. | +| Kvalitet | 50–100% | 85% | Styrer JPEG/WebP-komprimering. Skjult for PNG (altid tabsfri). | +| Skala | 1.0x–4.0x | 2.0x | Højere skala giver skarpere billeder til skærme med høj opløsning. | +| Gråtoner | Til/Fra | Fra | Konverterer sider til gråtoner. Reducerer filstørrelsen for sort-hvidt indhold. | +| Manga-tilstand | Til/Fra | Fra | Sætter læseretningen til højre mod venstre i metadata. | +| Medtag metadata | Til/Fra | Til | Indlejrer ComicInfo.xml, metadata.opf og ComicBookInfo JSON. | + +## Metadatafelter + +Når metadata er aktiveret, kan du udfylde: + +- **Titel**: Registreres automatisk fra PDF'ens filnavn. +- **Serie**: Seriens navn (f.eks. "Naruto"). +- **Nummer (#)**: Udgavenummer i serien. +- **Bind (Vol.)**: Bindnummer. +- **Forfatter(e)**: Navn på forfatter eller skaber. +- **Forlag**: Udgivende virksomhed. +- **Tags / Genre**: Kommaseparerede tags (f.eks. "Action, Eventyr"). +- **Udgivelsesår**: Udgivelsesår (1900–2100). +- **Vurdering**: Fællesskabets vurdering fra 0 til 5. + +## Metadatakompatibilitet + +Værktøjet skriver metadata i tre formater, så alle læsere kan finde dem: + +| Format | Placering | Understøttes af | +| ------------------ | ----------------- | ------------------------------------------- | +| ComicInfo.xml | Fil i ZIP-filen | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Fil i ZIP-filen | Calibre | +| ComicBookInfo JSON | ZIP-kommentarfelt | Calibre (reserve) | + +## Outputformat + +- `filename.cbz`: Et ZIP-arkiv med nummererede sidebilleder og metadatafiler. + +Sidebillederne navngives med nuludfyldte tal (`01.jpg`, `02.jpg` osv.), så læserne viser dem i den rigtige rækkefølge. + +## Anvendelser + +- Konvertere manga- eller tegneserie-PDF'er til brug i tegneserielæsere. +- Bygge et digitalt tegneseriebibliotek i Komga, Kavita eller Calibre. +- Konvertere scannede tegneserier til et læservenligt format. +- Dele tegneserier i et format, der bevarer læseretning og metadata. + +## Tips + +- Brug **JPEG** til farvetegneserier og **PNG** til sort-hvid manga. PNG komprimerer sort-hvidt indhold meget effektivt. +- Aktivér **Gråtoner** til manga for at reducere filstørrelsen betydeligt. +- Udfyld felterne **Serie** og **Nummer**, så biblioteksadministratorer (Komga, Calibre) kan organisere din samling automatisk. +- **WebP** giver den bedste komprimering, men ældre tegneserielæsere understøtter det måske ikke. + +## Relaterede værktøjer + +- [PDF til JPG](./pdf-to-jpg) +- [PDF til PNG](./pdf-to-png) +- [PDF til TIFF](./pdf-to-tiff) +- [Udtræk billeder](./extract-images) diff --git a/docs/da/tools/pdf-to-csv.md b/docs/da/tools/pdf-to-csv.md new file mode 100644 index 00000000..455e55fc --- /dev/null +++ b/docs/da/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF til CSV +description: Udtræk tabeller fra PDF-dokumenter, og eksportér dem som én CSV-fil. Håndterer PDF-filer med flere sider med automatisk tabelgenkendelse. +--- + +# PDF til CSV + +Udtrækker tabeller fra en PDF og eksporterer dem som en CSV-fil. Værktøjet scanner hver side efter tabeldata med PyMuPDF's tabelgenkendelsesmotor og skriver derefter alle fundne rækker til ét kommasepareret output. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Klik på **Konvertér** for at starte tabeludtrækningen. +3. Værktøjet scanner hver side og finder automatisk tabeller. +4. En `.csv`-fil downloades med alle de udtrukne tabeldata. + +Tabeller fra forskellige sider adskilles af tomme rækker i outputtet. Celler med kommaer, anførselstegn eller linjeskift escapes korrekt efter RFC 4180. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Alle tabeller i dokumentet udtrækkes og kombineres i én CSV. + +## Outputformat + +- En enkelt `filename.csv`-fil med alle fundne tabeller. + +## Anvendelser + +- Hente økonomiske data fra PDF-kontoudtog eller fakturaer ind i et regneark. +- Udtrække priser fra leverandørtilbud til sammenligning. +- Konvertere tabulære forskningsdata fra PDF-artikler til et format, der egner sig til analyseværktøjer. +- Migrere data fra ældre PDF-rapporter til databaser. + +## Tips + +- Hvis der ikke findes nogen tabeller, viser værktøjet meddelelsen "Ingen tabeller fundet". Det betyder typisk, at PDF'en bruger et tekstlayout, der ligner en tabel, men ikke er struktureret som en egentlig tabel. +- Til mere kontrol over de enkelte tabeller kan du bruge [Udtræk PDF-tabeller](./extract-tables), hvor du kan vælge mellem CSV, JSON og Markdown som outputformat. +- Hvis du har brug for dataene i Excel-format med separate ark for hver tabel, kan du bruge [PDF til Excel](./pdf-to-excel). + +## Relaterede værktøjer + +- [PDF til Excel](./pdf-to-excel) +- [Udtræk PDF-tabeller](./extract-tables) +- [PDF til tekst](./pdf-to-text) diff --git a/docs/da/tools/pdf-to-excel.md b/docs/da/tools/pdf-to-excel.md new file mode 100644 index 00000000..3698192e --- /dev/null +++ b/docs/da/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF til Excel +description: Udtræk tabeller fra PDF-dokumenter til et Excel-regneark. Hver tabel får sit eget regneark med sidehenvisninger. +--- + +# PDF til Excel + +Udtrækker tabeller fra en PDF og gemmer dem som et Excel-regneark (`.xlsx`). Hver fundet tabel placeres på sit eget ark, mærket med tabelnummer og kildeside. Drevet af PyMuPDF til tabelgenkendelse og SheetJS-biblioteket til Excel-generering. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Klik på **Konvertér** for at starte tabeludtrækningen. +3. Værktøjet scanner hver side efter tabeller og bygger derefter en Excel-projektmappe. +4. En `.xlsx`-fil downloades med ét ark pr. tabel. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Alle fundne tabeller udtrækkes automatisk. + +## Outputformat + +- En enkelt `filename.xlsx`-fil. +- **Én tabel**: ét ark med navnet "Table". +- **Flere tabeller**: ark med navnene "Table 1 (Page 3)", "Table 2 (Page 5)" osv. Arknavne afkortes til 31 tegn (Excels grænse). + +## Anvendelser + +- Konvertere økonomiske PDF-rapporter til redigerbare regneark til videre analyse. +- Udtrække lager- eller ordretabeller fra leverandørers PDF-filer. +- Hente strukturerede data fra PDF-formularer eller kataloger ind i Excel til sortering og filtrering. +- Arkivere tabulære PDF-data i et format, som ikke-tekniske kolleger kan arbejde med. + +## Tips + +- Hvis værktøjet melder "Ingen tabeller fundet", bruger PDF'en sandsynligvis et frit tekstlayout i stedet for strukturerede tabeller. Prøv [PDF til tekst](./pdf-to-text) for at hente det rå indhold i stedet. +- Til et enklere fladt format kan du bruge [PDF til CSV](./pdf-to-csv). Til downloads pr. tabel i flere formater kan du bruge [Udtræk PDF-tabeller](./extract-tables). +- Se på arknavnene for at finde ud af, hvilken side hver tabel kom fra. + +## Relaterede værktøjer + +- [PDF til CSV](./pdf-to-csv) +- [Udtræk PDF-tabeller](./extract-tables) +- [PDF til tekst](./pdf-to-text) diff --git a/docs/da/tools/pdf-to-greyscale.md b/docs/da/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..817052e7 --- /dev/null +++ b/docs/da/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF til gråtoner +description: Konvertér en farve-PDF til en gråtoneversion (sort-hvid). Giver en ny PDF, hvor al farve er fjernet fra hver side. +--- + +# PDF til gråtoner + +Konverterer en farve-PDF til en gråtoneversion. Hver side gengives, affarves og indlejres igen som et JPEG-billede i en ny PDF. Outputtet bevarer de oprindelige sidemål. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Klik på **Konvertér** for at behandle filen. +3. En ny `greyscale.pdf` downloades med alle sider konverteret til sort-hvid. + +Bag kulisserne gengives hver side i 2x skala, pixeldataene sendes gennem et gråtonefilter, kodes derefter igen som JPEG i 90 % kvalitet og placeres i et nyt PDF-dokument. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Gråtonekonverteringen bruger en standardformel for luminans, og JPEG-kvaliteten er fast på 90 %. + +## Outputformat + +- En enkelt `greyscale.pdf`-fil med alle sider som gråtone-JPEG-billeder. + +## Anvendelser + +- Forberede dokumenter til sort-hvid udskrivning for at spare på farvekassetter. +- Opfylde indsendelseskrav til juridiske eller offentlige indberetninger, der kræver gråtoner. +- Reducere filstørrelsen på PDF-filer med meget farve (JPEG-gråtonebilleder er mindre end farvebilleder). +- Skabe en ensartet visuel stil på tværs af dokumenter med blandede farve- og sort-hvide sider. + +## Tips + +- Fordi hver side rasteriseres og indlejres igen som JPEG, er outputtet billedbaseret. Tekst i den oprindelige PDF kan ikke længere markeres eller søges i. Hvis du bagefter har brug for søgbar tekst, kan du køre outputtet gennem OCR-værktøjet. +- Til mere kontrol over farvejusteringer (lysstyrke, kontrast, mætning) kan du se på værktøjet Justér farver eller gråtonenoden i [PDF Workflow-bygger](./pdf-workflow). + +## Relaterede værktøjer + +- [PDF til JPG](./pdf-to-jpg) +- [PDF til PNG](./pdf-to-png) +- [PDF Workflow-bygger](./pdf-workflow) diff --git a/docs/da/tools/pdf-to-jpg.md b/docs/da/tools/pdf-to-jpg.md new file mode 100644 index 00000000..692a8411 --- /dev/null +++ b/docs/da/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF til JPG +description: Konvertér PDF-sider til JPG-billeder med justerbar kvalitet. PDF-filer med én side downloades direkte, PDF-filer med flere sider eksporteres som ZIP. +--- + +# PDF til JPG + +Konverterer hver side i en PDF til et JPG-billede. Dokumenter med én side downloades som en selvstændig `.jpg`-fil. PDF-filer med flere sider giver et ZIP-arkiv med ét JPG pr. side. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. Værktøjet viser filnavn, filstørrelse og sideantal. +2. Justér skyderen **Kvalitet** for at styre JPG-komprimeringen. +3. Klik på **Konvertér** for at starte behandlingen. +4. Resultatet downloades automatisk: ét JPG for PDF-filer med én side eller en ZIP-fil for dokumenter med flere sider. + +## Indstillinger + +- **Kvalitet**: en skyder fra 0 % til 100 % (standard 90 %). Højere værdier giver skarpere billeder med større filer. Lavere værdier komprimerer mere aggressivt. + +Siderne gengives internt i 2x skala, så outputopløsningen er dobbelt så stor som PDF'ens sidemål. En almindelig Letter-side giver et billede på cirka 1.224 x 1.584 pixel. + +## Outputformat + +- **Enkelt side**: `filename.jpg` +- **Flere sider**: `filename_jpgs.zip` med `page_1.jpg`, `page_2.jpg` osv. + +## Anvendelser + +- Generere forhåndsvisningsminiaturer til et dokumenthåndteringssystem. +- Dele en side fra en rapport i en chat eller e-mail, der ikke understøtter PDF. +- Lave billedelementer af PDF-diagrammer eller illustrationer. +- Arkivere scannede dokumenter som enkeltbilleder. + +## Tips + +- Til tabsfrit output kan du bruge [PDF til PNG](./pdf-to-png) i stedet. +- En kvalitetsindstilling på 80-90 % er en god balance mellem filstørrelse og visuel troværdighed. +- Hvis du har brug for et bestemt format pr. side, kan du overveje [PDF Workflow-bygger](./pdf-workflow), som har en outputnode til PDF til billeder. + +## Relaterede værktøjer + +- [PDF til PNG](./pdf-to-png) +- [PDF til WebP](./pdf-to-webp) +- [PDF til BMP](./pdf-to-bmp) +- [PDF til TIFF](./pdf-to-tiff) diff --git a/docs/da/tools/pdf-to-json.md b/docs/da/tools/pdf-to-json.md new file mode 100644 index 00000000..8c5043e6 --- /dev/null +++ b/docs/da/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF til JSON +description: Konvertér PDF-filer til struktureret JSON-format med CPDF. Eksporterer PDF'ens interne struktur som maskinlæsbare JSON-data. +--- + +# PDF til JSON + +Konverterer en eller flere PDF-filer til JSON-format. Værktøjet bruger CPDF (Coherent PDF) til at serialisere den interne struktur i hver PDF til en maskinlæsbar JSON-repræsentation. Outputtet leveres altid som et ZIP-arkiv. + +## Sådan fungerer det + +1. Vælg en eller flere PDF-filer med filvælgeren. +2. Klik på **Konvertér** for at starte behandlingen. Konverteringen kører i en web worker i baggrunden. +3. Et ZIP-arkiv downloades med én JSON-fil for hver input-PDF. + +Statuslinjen viser fremdriften gennem konverteringen og oprettelsen af ZIP-filen. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Hver PDF konverteres til sin fulde JSON-repræsentation. + +## Outputformat + +- En `pdfs-to-json.zip`-fil med `filename.json` for hver input-PDF. + +JSON-outputtet repræsenterer PDF'ens interne objektstruktur, herunder sidetræer, skrifttypereferencer, metadata og indholdsstrømme. + +## Anvendelser + +- Undersøge den interne struktur i en PDF til fejlfinding eller validering. +- Udtrække struktureret metadata og sideegenskaber programmatisk. +- Sende PDF-strukturdata ind i brugerdefinerede behandlingspipelines. +- Revidere PDF-dokumenter for overholdelse af krav ved at analysere deres objekttræer. + +## Tips + +- Dette værktøj udskriver den rå PDF-objektstruktur, ikke udtrukket tekstindhold. Hvis du har brug for sidetekst i JSON-format, kan du i stedet bruge [Forbered PDF til AI](./prepare-pdf-for-ai). +- Til almindelig tekstudtrækning er [PDF til tekst](./pdf-to-text) mere ligetil. +- Store PDF-filer med komplekse strukturer giver meget store JSON-filer. + +## Relaterede værktøjer + +- [PDF til tekst](./pdf-to-text) +- [Forbered PDF til AI](./prepare-pdf-for-ai) +- [Udtræk PDF-tabeller](./extract-tables) diff --git a/docs/da/tools/pdf-to-markdown.md b/docs/da/tools/pdf-to-markdown.md new file mode 100644 index 00000000..44cedbbe --- /dev/null +++ b/docs/da/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF til Markdown +description: Konvertér PDF-dokumenter til Markdown-format med valgfri billedudtrækning. Understøtter batchkonvertering af flere filer. +--- + +# PDF til Markdown + +Konverterer PDF-filer til Markdown-format (`.md`) og bevarer overskrifter, afsnit, lister og grundlæggende formatering. Udtrækker og medtager eventuelt indlejrede billeder. Understøtter konvertering af enkeltfiler og batchkonvertering. Drevet af PyMuPDF. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer ved at klikke på slipområdet eller trække filer hen på det. +2. Slå eventuelt **Medtag billeder** til for at indlejre udtrukne billeder i Markdown-outputtet. +3. Klik på **Konvertér** for at starte behandlingen. +4. En enkelt fil downloades som `filename.md`. Flere filer giver en `markdown-files.zip`. + +## Indstillinger + +- **Medtag billeder**: når det er markeret, udtrækkes indlejrede billeder fra PDF'en og refereres i Markdown-outputtet. Når det ikke er markeret, konverteres kun tekstindholdet. + +## Outputformat + +- **Enkelt fil**: `filename.md` +- **Flere filer**: `markdown-files.zip` med én `.md` pr. input-PDF. + +## Anvendelser + +- Konvertere PDF-dokumentation til Markdown til en statisk site-generator som VitePress, Hugo eller Jekyll. +- Gøre PDF-forskningsartikler til redigerbar Markdown til notatapps som Obsidian. +- Migrere ældre PDF-vidensbaser til et Git-venligt tekstformat. +- Udtrække struktureret indhold fra PDF-e-bøger til omformatering. + +## Tips + +- Indstillingen Medtag billeder er nyttig, når PDF'en indeholder diagrammer eller figurer, der er afgørende for indholdet. Slå den fra for teksttunge dokumenter for at holde outputtet rent. +- Komplekse layouts med sidebjælker, fodnoter eller tekst i flere kolonner kan give ufuldkommen Markdown. Gennemgå og justér outputtet efter behov. +- Til rå tekst uden formatering kan du i stedet bruge [PDF til tekst](./pdf-to-text). + +## Relaterede værktøjer + +- [PDF til tekst](./pdf-to-text) +- [PDF til Word](./pdf-to-word) +- [Forbered PDF til AI](./prepare-pdf-for-ai) diff --git a/docs/da/tools/pdf-to-pdfa.md b/docs/da/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..738f68ff --- /dev/null +++ b/docs/da/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF til PDF/A +description: Konvertér almindelige PDF-filer til PDF/A-format til langtidsarkivering. Understøtter konformitetsniveauerne PDF/A-1b, PDF/A-2b og PDF/A-3b. +--- + +# PDF til PDF/A + +PDF/A er en ISO-standardiseret delmængde af PDF, der er designet til langtidsbevaring af digitale dokumenter. Dette værktøj konverterer dine almindelige PDF-filer til PDF/A-kompatible dokumenter med Ghostscript, som kører direkte i din browser. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. +2. Vælg en **PDF/A-version** i rullemenuen. +3. Aktivér eventuelt **Flad PDF ud først** til komplekse filer, der ikke kan konverteres normalt. +4. Klik på **Konvertér til PDF/A**. Flere filer giver et ZIP-arkiv. + +## PDF/A-versioner + +| Version | Begrænsninger | Bedst til | +| ------------ | -------------------------------------------------- | ----------------------------------------------------- | +| **PDF/A-1b** | Strengest. Ingen gennemsigtighed, ingen lag. | Maksimal kompatibilitet med ældre arkiveringssystemer | +| **PDF/A-2b** | Tillader gennemsigtighed og JPEG2000. | Almindelig arkivering (anbefales) | +| **PDF/A-3b** | Tillader indlejrede vedhæftninger i alle formater. | Arkivering af dokumenter med kildedatafiler | + +PDF/A-2b er valgt som standard og passer til langt de fleste arkiveringsbehov. + +## Indstillingen Flad ud først + +Nogle PDF-filer indeholder funktioner, der forhindrer en ren PDF/A-konvertering: usædvanlige skrifttypekodninger, komplekse gennemsigtighedsstakke eller ødelagte interne strukturer. Når du aktiverer **Flad ud først**, rasteriseres PDF'en i 300 DPI før konvertering, hvilket garanterer overholdelse af standarden, men gør teksten umulig at markere. Brug den som reserveløsning, når den almindelige konvertering giver fejl. + +Udfladning først kræver PyMuPDF WASM-motoren. + +## Anvendelser + +- Opfylde offentlige eller juridiske arkiveringskrav (mange jurisdiktioner kræver PDF/A til retsdokumenter) +- Indsende dokumenter til institutionelle arkiver eller digitale biblioteker +- Bevare forretningsoptegnelser, hvor den oprindelige software måske ikke findes om ti år +- Forberede fakturaer til e-faktureringsstandarder, der kræver PDF/A-3b med XML-vedhæftninger + +## Tips + +- Prøv konvertering uden udfladning først. Aktivér den kun, hvis du får en fejl. +- PDF/A indlejrer alle skrifttyper, så outputfiler er ofte større end originalerne. +- Valider outputtet i en dedikeret PDF/A-validator, hvis din arbejdsgang kræver streng overholdelse. + +## Relaterede værktøjer + +- [Komprimer PDF](./compress-pdf): reducér filstørrelsen efter konvertering +- [Fladgør PDF](./flatten-pdf): flad formularer ud, før du konverterer til PDF/A +- [Fjern metadata](./remove-metadata): fjern metadata før arkivering diff --git a/docs/da/tools/pdf-to-png.md b/docs/da/tools/pdf-to-png.md new file mode 100644 index 00000000..87c7b98e --- /dev/null +++ b/docs/da/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF til PNG +description: Konvertér PDF-sider til tabsfrie PNG-billeder med justerbar skala. Ideelt til skærmbilleder i høj kvalitet og gennemsigtige baggrunde. +--- + +# PDF til PNG + +Konverterer hver side i en PDF til et PNG-billede. PNG bruger tabsfri komprimering, så outputtet bevarer alle detaljer fra den oprindelige side. PDF-filer med én side downloades som en `.png`-fil, og PDF-filer med flere sider giver en ZIP. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Indstil skyderen **Skala** for at styre outputopløsningen. +3. Klik på **Konvertér** for at starte behandlingen. +4. Et enkelt PNG eller et ZIP-arkiv downloades automatisk. + +## Indstillinger + +- **Skala**: fra 1.0x til 3.0x (standard 2.0x). Ved 2.0x gengives en almindelig Letter-side i cirka 1.224 x 1.584 pixel. Højere skalaværdier giver større og skarpere billeder på bekostning af filstørrelse og behandlingstid. + +## Outputformat + +- **Enkelt side**: `filename.png` +- **Flere sider**: `filename_pngs.zip` med `page_1.png`, `page_2.png` osv. + +## Anvendelser + +- Tage skærmbilleder af PDF-sider i høj kvalitet til præsentationer. +- Udtrække diagrammer eller figurer, der kræver skarpe kanter og ingen komprimeringsartefakter. +- Forberede elementer til webdesign ud fra PDF-mockups. +- Lave tabsfrie sidebilleder til forbehandling før OCR. + +## Tips + +- PNG-filer er væsentligt større end JPG. Hvis filstørrelsen betyder mere end perfekt kvalitet, kan du bruge [PDF til JPG](./pdf-to-jpg) eller [PDF til WebP](./pdf-to-webp). +- Ved skala 1.0x svarer outputtet til PDF'ens oprindelige opløsning. Sæt den op til 3.0x for eksport i udskriftskvalitet. + +## Relaterede værktøjer + +- [PDF til JPG](./pdf-to-jpg) +- [PDF til WebP](./pdf-to-webp) +- [PDF til SVG](./pdf-to-svg) diff --git a/docs/da/tools/pdf-to-svg.md b/docs/da/tools/pdf-to-svg.md new file mode 100644 index 00000000..ab0cf06b --- /dev/null +++ b/docs/da/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF til SVG +description: Konvertér PDF-sider til skalerbar SVG-vektorgrafik. Bevarer tekst og former som vektorstier, så de kan skaleres uendeligt. +--- + +# PDF til SVG + +Konverterer hver side i en PDF til en SVG-fil (Scalable Vector Graphics). I modsætning til rasterformater bevarer SVG vektorstier, tekst og former, så outputtet kan skaleres til enhver størrelse uden pixelering. Drevet af PyMuPDF. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer ved at klikke på slipområdet eller trække filer hen på det. Du kan tilføje flere filer og administrere dem enkeltvis. +2. Klik på **Konvertér** for at behandle alle uploadede filer. +3. Konverteringer af én fil med én side downloades som en selvstændig `.svg`. Alt andet downloades som et ZIP-arkiv. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Hver side konverteres til SVG med PyMuPDF's indbyggede vektoreksport. + +## Outputformat + +- **Én fil, én side**: `filename.svg` +- **Én fil, flere sider**: `filename_svg.zip` med `page_1.svg`, `page_2.svg` osv. +- **Flere filer**: `pdf_to_svg.zip` med filer organiseret efter kildedokumentets navn. + +## Anvendelser + +- Udtrække vektordiagrammer, grafer eller illustrationer fra PDF-rapporter til brug på websider. +- Redigere PDF-sidens indhold i en vektoreditor som Inkscape eller Illustrator. +- Indlejre skalerbare sideforhåndsvisninger i responsive webapplikationer. +- Udtrække logoer eller grafik fra PDF-brochurer og bevare skarpe kanter. + +## Tips + +- SVG fungerer bedst med PDF-filer, der indeholder vektorindhold. Scannede dokumenter eller billedtunge PDF-filer giver store SVG-filer med indlejrede rasterdata. +- Til rasteroutput af billedtunge PDF-filer kan du i stedet bruge [PDF til PNG](./pdf-to-png) eller [PDF til JPG](./pdf-to-jpg). +- Dette værktøj understøtter batchkonvertering: upload flere PDF-filer på én gang for at konvertere dem alle i én kørsel. + +## Relaterede værktøjer + +- [PDF til PNG](./pdf-to-png) +- [PDF til JPG](./pdf-to-jpg) +- [PDF til Markdown](./pdf-to-markdown) diff --git a/docs/da/tools/pdf-to-text.md b/docs/da/tools/pdf-to-text.md new file mode 100644 index 00000000..d2ae6576 --- /dev/null +++ b/docs/da/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF til tekst +description: Udtræk almindeligt tekstindhold fra PDF-filer. Understøtter batchudtrækning fra flere PDF-filer med output som TXT-filer. +--- + +# PDF til tekst + +Udtrækker alt tekstindhold fra PDF-filer og gemmer det som almindelige `.txt`-filer. Understøtter batchbehandling: upload flere PDF-filer, og få hver enkelts tekst udtrukket i én operation. Drevet af PyMuPDF. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer ved at klikke på slipområdet eller trække filer hen på det. Administrér din filliste med knapperne Tilføj flere og Ryd. +2. Klik på **Udtræk** for at starte behandlingen. +3. En enkelt fil downloades som `filename.txt`. Flere filer giver et `pdf-to-text.zip`-arkiv. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Alt tekstindhold udtrækkes fra hver side i læserækkefølge. + +## Outputformat + +- **Enkelt fil**: `filename.txt` +- **Flere filer**: `pdf-to-text.zip` med én `.txt` pr. input-PDF. + +## Anvendelser + +- Udtrække brødtekst fra PDF-rapporter til fuldtekstsøgningsindeksering. +- Konvertere PDF-e-bøger eller artikler til almindelig tekst til læsning på e-ink-enheder. +- Hente tekst fra kontrakter eller juridiske dokumenter til søgeordsanalyse. +- Fjerne formatering fra PDF-filer for at få ren tekst til databehandlingsscripts. +- Forberede et tekstkorpus fra PDF-arkiver til naturlig sprogbehandling. + +## Tips + +- Scannede PDF-filer (kun billeder) giver tomme tekstfiler, fordi der ikke er noget tekstlag at udtrække. Kør scannede dokumenter gennem OCR først. +- Outputtet bevarer den læserækkefølge, som PyMuPDF fortolker, og den følger generelt venstre mod højre og top mod bund. Layouts med flere kolonner kan give blandet tekst. +- Til struktureret output med overskrifter og formatering kan du prøve [PDF til Markdown](./pdf-to-markdown). Til AI-klar struktureret JSON kan du bruge [Forbered PDF til AI](./prepare-pdf-for-ai). + +## Relaterede værktøjer + +- [PDF til Markdown](./pdf-to-markdown) +- [Forbered PDF til AI](./prepare-pdf-for-ai) +- [PDF til Word](./pdf-to-word) diff --git a/docs/da/tools/pdf-to-tiff.md b/docs/da/tools/pdf-to-tiff.md new file mode 100644 index 00000000..10d67fb2 --- /dev/null +++ b/docs/da/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF til TIFF +description: Konvertér PDF-sider til TIFF-billeder, som ofte bruges i udskrivning, fax og arkivering. Falder tilbage til PNG, hvis kodningen mislykkes. +--- + +# PDF til TIFF + +Konverterer hver side i en PDF til et TIFF-billede. TIFF er standardformatet til trykproduktion, faxsystemer og dokumentarkivering. Værktøjet bruger PackBits-komprimering til TIFF-kodning og falder tilbage til PNG, hvis en side ikke kan kodes. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Klik på **Konvertér** for at behandle filen. +3. En enkelt TIFF-fil eller et ZIP-arkiv downloades automatisk. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Siderne gengives i en fast skala på 2x. + +## Outputformat + +- **Enkelt side**: `filename.tiff` +- **Flere sider**: `filename_tiffs.zip` med `page_1.tiff`, `page_2.tiff` osv. + +Hvis TIFF-kodningen mislykkes for en bestemt side (på grund af komprimeringsproblemer), gemmes den side som en `.png`-fil i stedet. ZIP-filen indeholder i så fald en blanding af TIFF- og PNG-filer. + +## Anvendelser + +- Indsende dokumenter til offentlige myndigheder eller juridiske systemer, der kræver TIFF-format. +- Forberede sider til faxtransmission via digitale faxtjenester. +- Arkivere scannede dokumenter i et bredt understøttet tabsfrit format. +- Sende sider ind i dokumenthåndteringssystemer i virksomheder. + +## Tips + +- TIFF-filer er store. Hvis du kun har brug for tabsfri kvalitet til web eller skærm, er [PDF til PNG](./pdf-to-png) et bedre valg. +- Tjek ZIP-indholdet, hvis nogle sider krævede PNG-reserven. Du vil måske konvertere dem separat. + +## Relaterede værktøjer + +- [PDF til PNG](./pdf-to-png) +- [PDF til BMP](./pdf-to-bmp) +- [PDF til JPG](./pdf-to-jpg) diff --git a/docs/da/tools/pdf-to-webp.md b/docs/da/tools/pdf-to-webp.md new file mode 100644 index 00000000..58411694 --- /dev/null +++ b/docs/da/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF til WebP +description: Konvertér PDF-sider til WebP-billeder med justerbar kvalitet. Mindre filer end JPG ved sammenlignelig visuel kvalitet. +--- + +# PDF til WebP + +Konverterer hver side i en PDF til et WebP-billede. WebP giver typisk filer, der er 25-35 % mindre end JPG ved samme oplevede kvalitet, hvilket gør det til et stærkt valg til web. + +## Sådan fungerer det + +1. Upload en PDF ved at klikke på slipområdet eller trække en fil hen på det. +2. Justér skyderen **Kvalitet**. +3. Klik på **Konvertér** for at behandle filen. +4. En enkelt `.webp`-fil eller et ZIP-arkiv downloades automatisk. + +## Indstillinger + +- **Kvalitet**: en skyder fra 0 % til 100 % (standard 85 %). Styrer niveauet for den tabsgivende komprimering. Højere værdier bevarer flere detaljer. + +Siderne gengives internt i 2x skala, hvilket giver billeder på cirka dobbelt så store som PDF'ens oprindelige mål. + +## Outputformat + +- **Enkelt side**: `filename.webp` +- **Flere sider**: `filename_webps.zip` med `page_1.webp`, `page_2.webp` osv. + +## Anvendelser + +- Forberede sideforhåndsvisninger til websteder, hvor båndbredde har betydning. +- Generere lette billedversioner af flyers eller brochurer til sociale medier. +- Batchkonvertere dokumenter med flere sider til et weboptimeret billedsæt. + +## Tips + +- WebP understøttes i alle moderne browsere. Til kompatibilitet med ældre systemer kan du falde tilbage til [PDF til JPG](./pdf-to-jpg). +- En kvalitet på 80-85 % kan som regel ikke skelnes fra originalen på skærmen, mens filstørrelserne holdes små. + +## Relaterede værktøjer + +- [PDF til JPG](./pdf-to-jpg) +- [PDF til PNG](./pdf-to-png) +- [PDF til BMP](./pdf-to-bmp) diff --git a/docs/da/tools/pdf-to-word.md b/docs/da/tools/pdf-to-word.md new file mode 100644 index 00000000..8f363513 --- /dev/null +++ b/docs/da/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF til Word +description: Konvertér PDF-filer til redigerbare Word-dokumenter (DOCX). Understøtter batchkonvertering af flere PDF-filer på én gang. +--- + +# PDF til Word + +Konverterer PDF-filer til redigerbare Word-dokumenter (`.docx`). Værktøjet bruger PyMuPDF til at genopbygge dokumentets indhold og bevarer tekst, grundlæggende formatering og layout. Understøtter konvertering af enkeltfiler og batchkonvertering. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer ved at klikke på slipområdet eller trække filer hen på det. Du kan tilføje flere filer eller fjerne enkelte fra listen. +2. Klik på **Konvertér** for at starte behandlingen. +3. En enkelt fil downloades som `filename.docx`. Flere filer pakkes i `converted-documents.zip`. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Hver PDF konverteres til DOCX med PyMuPDF's indbyggede konverteringsmotor. + +## Outputformat + +- **Enkelt fil**: `filename.docx` +- **Flere filer**: `converted-documents.zip` med én `.docx` pr. input-PDF. + +## Anvendelser + +- Redigere tekst i en PDF, som du har modtaget, og som skal ændres. +- Konvertere arkiverede PDF-rapporter til et format, som kolleger kan redigere i Microsoft Word eller Google Docs. +- Hente indhold fra PDF-kontrakter eller tilbud ind i Word til gennemgang med ændringsmarkering. +- Migrere ældre PDF-dokumentation til et redigerbart format. + +## Tips + +- Komplekse layouts med tekst i flere kolonner, indlejrede formularer eller meget grafik konverteres muligvis ikke perfekt. Gennemgå outputtet, og justér formateringen i dit tekstbehandlingsprogram. +- Scannede PDF-filer (kun billeder) giver tomme eller minimale DOCX-filer. Kør dem gennem OCR først for at tilføje et tekstlag. +- Batchtilstand er effektiv til at konvertere hele mapper med PDF-filer: upload dem alle på én gang. + +## Relaterede værktøjer + +- [PDF til tekst](./pdf-to-text) +- [PDF til Markdown](./pdf-to-markdown) +- [PDF Workflow-bygger](./pdf-workflow) diff --git a/docs/da/tools/pdf-to-zip.md b/docs/da/tools/pdf-to-zip.md new file mode 100644 index 00000000..68be708c --- /dev/null +++ b/docs/da/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF’er til ZIP +description: Pak flere PDF-filer i ét ZIP-arkiv, så de er nemme at dele og gemme. +--- + +# PDF’er til ZIP + +Saml flere PDF-filer i ét ZIP-arkiv. Det er et ligetil pakkeværktøj uden konvertering, komprimering eller ændring af selve PDF-filerne. + +## Sådan fungerer det + +1. Upload flere PDF-filer via slipområdet. +2. Gennemgå fillisten. Fjern dem, du ikke vil have med. +3. Klik på procesknappen. +4. Et ZIP-arkiv med alle de uploadede PDF-filer downloades med det samme. + +## Funktioner + +- Accepterer et vilkårligt antal PDF-filer +- Fjernelse af enkelte filer, før arkivet oprettes +- Bevarer de oprindelige filnavne i ZIP-filen +- Ingen ændring af PDF-indholdet: filerne pakkes som de er +- Viser filnavn og størrelse for hver uploadet PDF + +## Anvendelser + +- Samle en række fakturaer eller kvitteringer som e-mailvedhæftning +- Pakke projektleverancer (flere PDF-rapporter) til overdragelse +- Lave én samlet download til en samling formularer eller skabeloner +- Arkivere en række dokumenter i én komprimeret fil + +## Tips + +- ZIP-filen bruger de oprindelige PDF-filnavne. Hvis du har filer med samme navn, skal du omdøbe dem, før du uploader, for at undgå konflikter. +- Dette værktøj komprimerer ikke selve PDF-filerne. Hvis du vil reducere filstørrelsen, skal du først køre dem gennem Komprimer PDF og derefter pakke dem med dette værktøj. + +## Relaterede værktøjer + +- [Flet PDF](./merge-pdf) +- [Opdel PDF](./split-pdf) +- [Komprimer PDF](./compress-pdf) diff --git a/docs/da/tools/pdf-workflow.md b/docs/da/tools/pdf-workflow.md new file mode 100644 index 00000000..cc170c75 --- /dev/null +++ b/docs/da/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF-workflowbygger +description: Byg brugerdefinerede PDF-behandlingspipelines visuelt ved at forbinde noder på et lærred. Kæd operationer som flet, komprimer, vandmærke og eksportér sammen. +--- + +# PDF-workflowbygger + +Workflow-byggeren lader dig kæde flere PDF-operationer sammen i én automatiseret pipeline. I stedet for at køre værktøjer et ad gangen sammensætter du en visuel graf af noder (input, behandling, output) og kører det hele med et enkelt klik. Dine filer forlader aldrig browseren. + +## Sådan fungerer det + +Grænsefladen er delt i tre paneler: en **nodeværktøjskasse** til venstre, **lærredet** i midten og et **indstillingspanel** til højre, som vises, når du vælger en node. + +1. **Tilføj noder** ved at klikke på dem i sidebjælken til venstre, eller træk dem direkte ind på lærredet. Brug søgefeltet øverst i værktøjskassen til at filtrere efter navn. +2. **Forbind noder** ved at trække fra en outputsokkel (nederst på en node) til en inputsokkel (øverst på en anden node). Forbindelser løber oppefra og ned. +3. **Konfigurér indstillinger** ved at klikke på en node for at åbne dens indstillingspanel til højre. Hver nodetype har sine egne indstillinger (sideintervaller, kvalitetsskydere, adgangskoder osv.). +4. **Kør workflowet** ved at klikke på knappen **Kør** på værktøjslinjen. Motoren udfører noderne i topologisk rækkefølge og behandler dem én efter én. En statuslinje nederst følger fremdriften. +5. **Download resultater**: den afsluttende Download-node gemmer den endelige PDF (eller ZIP, hvis der oprettes flere filer). + +## Nodekategorier + +Noderne er organiseret i seks kategorier, som hver har sin farve på lærredet: + +- **Input** (blå): PDF-input, Billedinput, Word/Excel/PowerPoint til PDF og mere end 15 andre formatkonvertere, der leverer filer ind i pipelinen. +- **Redigér og annotér** (indigo): Beskær, Gråtoner, Invertér farver, Vandmærke, Sidetal, Sidehoved og sidefod, Scannereffekt, Justér farver, Baggrundsfarve, Fjern tomme sider, Fjern annotationer. +- **Organisér og administrér** (violet): Flet, Opdel, Udtræk sider, Roter, Slet sider, Vend, Tilføj tom side, Opdel sider, N-Up, Ret sidestørrelse, Kombinér til én side, Hæfte, Posterisér, Redigér metadata, Indholdsfortegnelse, OCR. +- **Optimér og reparér** (rav): Komprimer, Rasterisér, Lineariser, Ret skæve sider, PDF til PDF/A, Skrifttype til kontur, Reparér. +- **Beskyt PDF** (rosa): Kryptér, Dekryptér, Rens, Flatten, Digital signatur, Sortlæg. +- **Output** (blågrøn): Download (registrerer automatisk enkelt PDF eller ZIP), PDF til billeder, PDF til tekst, PDF til DOCX, PDF til XLSX, PDF til CSV, PDF til SVG, PDF til Markdown, Udtræk billeder. + +## Gemme og indlæse workflows + +Værktøjslinjen har fire muligheder for at bevare dit arbejde: + +- **Gem**: gemmer det aktuelle workflow som en navngivet skabelon i din browsers lokale lager. Du kan gemme flere skabeloner. +- **Indlæs**: åbner en dialog med alle gemte skabeloner. Klik på Indlæs for at gendanne en, eller slet skabeloner, du ikke længere har brug for. +- **Eksportér**: downloader workflowet som en `.json`-fil, så du kan dele eller sikkerhedskopiere det. +- **Importér**: indlæser en `.json`-workflowfil fra disken og gendanner alle noder, positioner og forbindelser. + +Skabeloner bevares mellem sessioner i det lokale lager. Eksporterede JSON-filer kan flyttes mellem browsere og computere. + +## Udførelsesmodel + +Motoren bygger en afhængighedsgraf ud fra dine forbindelser og udfører noderne i topologisk rækkefølge. Hvis en node fejler, stopper udførelsen, og den fejlende node markeres rød. Nogle regler at huske: + +- Hvert workflow har brug for mindst én **Input**-node og én **Output**-node. +- Motoren registrerer cirkulære afhængigheder og blokerer udførelsen med en fejl. +- Noden **Kryptér** skal være det sidste behandlingstrin før outputnoden. Hvis den placeres tidligere, udløses en valideringsadvarsel, fordi efterfølgende noder ikke kan arbejde med krypterede data. +- Adgangskodebeskyttede PDF-filer beder om en adgangskode under udførelsen. +- Input med flere PDF-filer understøttes: Flet-noden kan kombinere dem, eller batchbehandlende noder behandler hver PDF enkeltvis. + +## Soklertyper + +Forbindelser bruger typede sokler for at forhindre ugyldige koblinger: + +- **PDF** (indigo): et enkelt PDF-dokument. +- **MultiPDF** (rav): flere PDF-dokumenter samlet. +- **Image** (grøn): en billedblob. + +## Indstillinger + +Hver node har sin egen konfiguration, som du kan nå via indstillingspanelet til højre. Almindelige eksempler: + +- **Sideintervaller** på noderne Opdel, Udtræk sider og Slet sider +- **Kvalitetsskydere** på billedkonverterings-outputnoder +- **Adgangskodefelter** på noderne Kryptér og Dekryptér +- **Tekstfelter** til Vandmærke, Sidehoved og sidefod og Redigér metadata +- **Rotationsvinkler** på noden Roter +- **Komprimeringsniveau** på noden Komprimer +- **Valg af OCR-sprog** på OCR-noden + +## Anvendelser + +- **Fakturabehandlingspipeline**: PDF-input -> OCR -> Udtræk PDF-tabeller -> Download som CSV. +- **Standardisering af rapporter**: Word til PDF -> Ret sidestørrelse -> Tilføj sidetal -> Vandmærke -> Komprimer -> Download. +- **Forberedelse til arkivering**: PDF-input -> Reparér -> Flatten -> Rens -> PDF til PDF/A -> Download. +- **Batchudtrækning af billeder**: PDF-input (flere filer) -> Udtræk billeder -> Download ZIP. +- **Udskriftsklare hæfter**: PDF-input -> Hæfte -> Beskær -> Komprimer -> Download. +- **Sikker distribution**: PDF-input -> Sortlæg -> Fjern annotationer -> Kryptér -> Download. + +## Tips + +- Brug **Delete** eller **Backspace** til at fjerne den valgte node fra lærredet. +- Klik på knappen **X** i en nodes statuslinje for at slette den direkte. +- Panorér lærredet ved at klikke og trække på tomt område. Markøren skifter til et gribeikon under panorering. +- På mobil kan du bruge knappen **+** på værktøjslinjen til at vise eller skjule nodeværktøjskassen. +- Hvis dit workflow giver flere outputfiler, samler Download-noden dem automatisk i en ZIP. +- Start enkelt: byg og test en pipeline med to noder, før du tilføjer kompleksitet. + +## Relaterede værktøjer + +- [PDF til tekst](./pdf-to-text) +- [PDF til Excel](./pdf-to-excel) +- [Udtræk billeder](./extract-images) +- [PDF til Markdown](./pdf-to-markdown) diff --git a/docs/da/tools/png-to-pdf.md b/docs/da/tools/png-to-pdf.md new file mode 100644 index 00000000..7884d65a --- /dev/null +++ b/docs/da/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG til PDF +description: Konvertér et eller flere PNG-billeder til et PDF-dokument med justerbar kvalitet, helt i din browser. +--- + +# PNG til PDF + +Konvertér PNG-billeder til PDF, mens deres fulde opløsning bevares. Hver PNG bliver til sin egen side, tilpasset det oprindelige billedes mål. Gennemsigtighed håndteres automatisk. + +## Understøttede formater + +| Format | Filtypenavne | +| :----- | :----------- | +| PNG | `.png` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip PNG-filer. Du kan vælge flere på én gang. +2. Administrér fillisten: fjern uønskede filer, eller tilføj flere. +3. Vælg et niveau for **PDF-kvalitet** i rullemenuen. +4. Klik på **Konvertér til PDF**. Outputtet downloades som `from_jpgs.pdf`. + +Værktøjet bruger pdf-lib til at indlejre hvert billede direkte. Hvis en PNG ikke kan indlejres direkte (f.eks. på grund af en usædvanlig farveprofil), falder det tilbage til at gengive den via et canvas som JPEG. + +## Indstillinger + +**PDF-kvalitet** styrer den komprimering, der anvendes før indlejring: + +- **Høj kvalitet**: minimal komprimering, største filstørrelse. +- **Mellem kvalitet** (standard): god balance mellem størrelse og klarhed. +- **Lav kvalitet**: maksimal komprimering, mindste output. + +## Anvendelser + +- Konvertere skærmbilleder til en PDF med flere sider til fejlrapporter eller dokumentation +- Pakke eksporter af UI-design i én fil til gennemgang +- Gøre diagrameksporter (draw.io, Excalidraw) til en delbar PDF +- Samle en række diagrambilleder til en rapport + +## Tips + +- PNG-filer med gennemsigtighed får en hvid baggrund i PDF'en. Hvis du har brug for en anden baggrund, skal du redigere billederne på forhånd. +- Til skærmbilleder og diagrammer med skarpe kanter og tekst undgår Høj kvalitet JPEG-komprimeringsartefakter. Mellem eller Lav kan konvertere til JPEG internt. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [JPG til PDF](./jpg-to-pdf) +- [SVG til PDF](./svg-to-pdf) diff --git a/docs/da/tools/posterize-pdf.md b/docs/da/tools/posterize-pdf.md new file mode 100644 index 00000000..902bbf07 --- /dev/null +++ b/docs/da/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Posterisér PDF +description: Opdel PDF-sider i et gitter af mindre sider til storformatudskrivning på flere ark. +--- + +# Posterisér PDF + +Del hver side i en PDF op i et gitter af mindre delsider. Det er værktøjet, når du vil udskrive én side over flere ark papir, som du derefter sætter sammen til en stor plakat eller et banner. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Angiv antal **rækker** og **kolonner** for at definere gitteret (f.eks. 2 rækker x 2 kolonner deler hver side i 4 delsider). +3. Angiv eventuelt et sideinterval for at begrænse, hvilke sider der posteriseres. +4. Forhåndsvisningen viser et gitter over den aktuelle side, så du kan se skæringerne. +5. Gå mellem siderne for at kontrollere gitteret på andre sider. +6. Klik på knappen til at behandle. Hver gittercelle bliver til sin egen side i den resulterende PDF. + +## Funktioner + +- Konfigurerbart antal rækker og kolonner for fleksible gitterstørrelser +- Live-forhåndsvisning med gitter, der viser præcis, hvor siderne deles +- Sidefilter, så kun bestemte sider posteriseres +- Side-for-side-navigation i forhåndsvisningen +- Cachede sideøjebliksbilleder for hurtig navigation i forhåndsvisningen +- Stiplede røde gitterlinjer markerer tydeligt skæregrænserne + +## Indstillinger + +| Indstilling | Beskrivelse | +| ---------------- | ------------------------------------------------- | +| **Rækker** | Antal vandrette inddelinger (standard: 1) | +| **Kolonner** | Antal lodrette inddelinger (standard: 1) | +| **Sideinterval** | Hvilke sider der posteriseres (tomt = alle sider) | + +## Anvendelsesmuligheder + +- Udskrive en PDF i plakatstørrelse over standard A4- eller Letter-ark, der samles på en væg +- Lave store bannere ud fra et enkeltsidet PDF-design +- Opdele overdimensionerede tekniske tegninger i udskrivbare felter +- Lave storformatudskrifter uden adgang til en bredformatprinter + +## Tips + +- Et 2x2-gitter gør én side til 4 sider. Et 3x3-gitter gør én side til 9. Planlæg gitteret ud fra, hvor stort det samlede resultat skal være. +- Overlejringen i forhåndsvisningen hjælper dig med at kontrollere, at vigtigt indhold ikke havner på en skærelinje. Juster rækker/kolonner efter behov. +- Til den omvendte handling (at samle flere sider på ét ark) brug [N-Up PDF](./n-up-pdf). + +## Relaterede værktøjer + +- [N-Up PDF](./n-up-pdf) +- [Opdel sider](./divide-pages) +- [Opdel PDF](./split-pdf) diff --git a/docs/da/tools/powerpoint-to-pdf.md b/docs/da/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..3d46beef --- /dev/null +++ b/docs/da/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint til PDF +description: Konvertér PowerPoint-præsentationer (PPT, PPTX) og ODP-filer til PDF med bevaret slideformatering. +--- + +# PowerPoint til PDF + +Konvertér præsentationsfiler til PDF. Hvert slide bliver til en side i det resulterende dokument, hvor tekst, billeder, figurer og overgange gengives via en LibreOffice-motor i browseren. Understøtter både moderne og ældre PowerPoint-formater samt OpenDocument Presentation-formatet. + +## Understøttede formater + +| Format | Filendelser | +| :------------------------ | :---------- | +| PowerPoint (moderne) | `.pptx` | +| PowerPoint (ældre) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine præsentationsfiler. +2. Gennemgå fillisten. Tilføj flere eller fjern filer efter behov. +3. Klik på **Konvertér til PDF**. LibreOffice-motoren indlæses ved første brug og konverterer derefter hver fil. +4. En enkelt fil downloades direkte som PDF. Flere filer pakkes i `powerpoint-converted.zip`. + +## Indstillinger + +Dette værktøj har ingen yderligere indstillinger. Slides gengives i deres oprindelige dimensioner. + +## Resultat + +| Antal filer | Resultat | +| :---------- | :--------------------------------------------------------------- | +| 1 fil | Enkelt PDF-download (oprindeligt filnavn med filendelsen `.pdf`) | +| 2+ filer | ZIP-arkiv (`powerpoint-converted.zip`) med én PDF pr. fil | + +## Anvendelsesmuligheder + +- Konvertere en præsentation til PDF, før den deles med et publikum, der måske ikke har PowerPoint +- Lave en udskrivbar håndoutversion af et slideshow til en konference eller workshop +- Arkivere præsentationer i et format, der ser ens ud på alle enheder +- Batchkonvertere et bibliotek af ODP-præsentationer fra LibreOffice Impress til PDF +- Lave en PDF-version af en pitch deck til e-mailvedhæftning + +## Tips + +- Slideanimationer og overgange kan ikke repræsenteres i PDF. Hvert slide gemmes som en statisk side. +- Indlejrede videoer vises ikke i resultatet. Erstat dem om nødvendigt med et skærmbillede eller en pladsholder. +- Talernoter er ikke med i standard-PDF-eksporten. Har du brug for noter, så eksportér først fra PowerPoints egen visning "Udskriv noter". +- LibreOffice-motoren caches efter første indlæsning, så en anden præsentation i samme session konverteres meget hurtigere. + +## Relaterede værktøjer + +- [Word til PDF](./word-to-pdf) +- [Excel til PDF](./excel-to-pdf) +- [Billeder til PDF](./image-to-pdf) diff --git a/docs/da/tools/prepare-pdf-for-ai.md b/docs/da/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..9d0a1e73 --- /dev/null +++ b/docs/da/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Forbered PDF til AI +description: Udtræk PDF-indhold til struktureret JSON optimeret til LLM'er og AI-pipelines som LlamaIndex. Understøtter batchbehandling. +--- + +# Forbered PDF til AI + +Udtrækker indhold fra PDF-filer og strukturerer det som JSON optimeret til indlæsning i store sprogmodeller (LLM'er) og AI-frameworks som LlamaIndex. Indholdet på hver side udtrækkes og organiseres i et struktureret format, der er klar til RAG-pipelines, chatbots eller semantiske søgesystemer. + +## Sådan fungerer det + +1. Upload en eller flere PDF'er ved at klikke på dropzonen eller trække filer hen på den. +2. Klik på **Udtræk** for at starte behandlingen. +3. En enkelt fil downloades som `filename_llm.json`. Flere filer giver et `pdf-for-ai.zip`-arkiv. + +Værktøjet bruger PyMuPDF's LlamaIndex-integration til at udtrække indhold på sideniveau med metadata, så resultatet direkte kan indlæses i AI-frameworks. + +## Indstillinger + +Dette værktøj har ingen konfigurerbare indstillinger. Alle sider udtrækkes med fuld tekst og metadata. + +## Outputformat + +- **Enkelt fil**: `filename_llm.json` +- **Flere filer**: `pdf-for-ai.zip` med én `_llm.json` pr. input-PDF. + +JSON-outputtet følger LlamaIndex' dokumentskema med tekstindhold og metadatafelter pr. side. + +## Anvendelsesmuligheder + +- Forberede PDF-dokumenter til retrieval-augmented generation (RAG)-pipelines. +- Bygge en søgbar vidensbase af PDF-arkiver til en AI-chatbot. +- Føre PDF-rapporter ind i LLM-baserede analyseforløb. +- Forbehandle forskningsartikler til semantisk søgning og spørgsmål-svar-systemer. +- Oprette strukturerede træningsdata fra PDF-samlinger. + +## Tips + +- Til ren tekstudtrækning uden AI-specifik formatering brug [PDF til tekst](./pdf-to-text). +- Til Markdown-output, der bevarer overskrifter og struktur, brug [PDF til Markdown](./pdf-to-markdown). +- Scannede PDF'er giver tomt eller minimalt output. Kør dem gennem OCR først for at tilføje et tekstlag før udtrækning. + +## Relaterede værktøjer + +- [PDF til tekst](./pdf-to-text) +- [PDF til Markdown](./pdf-to-markdown) +- [PDF til JSON](./pdf-to-json) diff --git a/docs/da/tools/protect-pdf.md b/docs/da/tools/protect-pdf.md new file mode 100644 index 00000000..84728e6f --- /dev/null +++ b/docs/da/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Beskyt PDF +description: Beskyt PDF-filer med adgangskode og 256-bit AES-kryptering. Angiv bruger- og ejeradgangskoder med konfigurerbare brugsbegrænsninger. +--- + +# Beskyt PDF + +Lås din PDF bag en adgangskode, så kun autoriserede personer kan åbne den. BentoPDF bruger 256-bit AES-kryptering, den samme standard som banker og offentlige myndigheder bruger, og den udføres helt i din browser via QPDF. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Angiv en **brugeradgangskode** (påkrævet). Det er den adgangskode, folk skal bruge for at åbne filen. +3. Angiv eventuelt en **ejeradgangskode**. Når den er sat, får PDF'en brugsbegrænsninger, der forhindrer udskrivning, redigering, kopiering og annotering. +4. Klik på **Kryptér PDF**. +5. Download den krypterede fil. + +## Adgangskodetyper + +### Brugeradgangskode (påkrævet) + +Brugeradgangskoden er det, modtagerne skriver for at åbne PDF'en. Uden den er dokumentet helt utilgængeligt. Enhver krypteret PDF skal have en. + +### Ejeradgangskode (valgfri) + +Ejeradgangskoden styrer, hvad en autoriseret bruger kan gøre, efter filen er åbnet. Når du angiver en særskilt ejeradgangskode, anvender BentoPDF automatisk det strengeste sæt begrænsninger: + +- Ændring deaktiveret +- Udtrækning/kopiering deaktiveret +- Udskrivning deaktiveret +- Annotering deaktiveret +- Formularudfyldning deaktiveret +- Dokumentsammensætning deaktiveret + +Hvis du lader ejeradgangskoden stå tom, er PDF'en krypteret (den kræver stadig brugeradgangskoden for at blive åbnet), men har ingen brugsbegrænsninger, når den først er åbnet. + +## Krypteringsdetaljer + +- **Algoritme**: AES-256 (256-bit Advanced Encryption Standard) +- **Nøglelængde**: 256 bit +- **Standard**: PDF 2.0-kryptering (QPDF-implementering) + +AES-256 kan med nutidens teknologi ikke brute-force'es i praksis. Sikkerheden i din krypterede PDF afhænger helt af adgangskodens styrke. + +## Anvendelsesmuligheder + +- Beskytte fortrolige regnskabsrapporter, før de sendes på e-mail +- Sikre juridiske dokumenter, der deles med modpartens advokat +- Tilføje en adgangskode til patientjournaler eller personhenførbare oplysninger +- Distribuere betalt indhold (e-bøger, rapporter) med adgangskontrol +- Overholde databeskyttelsespolitikker, der kræver kryptering af lagrede data + +## Tips + +- Brug en stærk, unik adgangskode. En adgangssætning på 12+ tegn med store og små bogstaver, tal og symboler er ideel. +- Del adgangskoden via en anden kanal (telefon, sms), aldrig i den samme e-mail som PDF'en. +- Hvis du kun vil begrænse handlinger (ingen udskrivning, ingen kopiering) uden at kræve adgangskode for at åbne, så brug værktøjet Skift tilladelser i stedet. + +## Relaterede værktøjer + +- [Dekryptér PDF](./unlock-pdf): fjern kryptering, når du kender adgangskoden +- [Skift tilladelser](./change-permissions): ændr bestemte brugsbegrænsninger +- [Fjern begrænsninger](./remove-restrictions): fjern al sikkerhed fra en PDF +- [Rens PDF](./sanitize-pdf): fjern skjult indhold, før du krypterer diff --git a/docs/da/tools/psd-to-pdf.md b/docs/da/tools/psd-to-pdf.md new file mode 100644 index 00000000..849da333 --- /dev/null +++ b/docs/da/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD til PDF +description: Konvertér Photoshop-filer (PSD) til PDF i din browser. Gratis, privat, ingen Adobe-software nødvendig. +--- + +# PSD til PDF + +Konvertér Adobe Photoshop PSD-filer til PDF-dokumenter. PSD er Photoshops eget format, og at åbne en kræver normalt dyr Adobe-software. Dette værktøj gengiver det fladede sammensatte billede fra din PSD-fil som en PDF-side i fuld opløsning. + +## Understøttede formater + +| Format | Filendelse | Bemærkninger | +| :-------------- | :--------- | :--------------------------------------- | +| Adobe Photoshop | `.psd` | Gengiver det fladede sammensatte billede | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine PSD-filer. Flere filer understøttes. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurvsikonet, eller brug **Tilføj flere filer** for at tilføje flere. +3. Klik på **Konvertér til PDF**. PyMuPDF-motoren læser PSD-filen og indlejrer det sammensatte billede på en PDF-side i den oprindelige opløsning. +4. En enkelt PSD giver én PDF. Når du uploader flere PSD-filer, samles de i én flersidet PDF med navnet `psd_to_pdf.pdf`, hvor hver PSD bliver til én side. + +## Indstillinger + +Ingen indstillinger er nødvendige. Konverteren bruger de fladede billeddata fra PSD-filen. + +## Anvendelsesmuligheder + +- Forhåndsvise Photoshop-designs uden at åbne Photoshop +- Sende designudkast til kunder, der ikke har Adobe Creative Suite +- Udskrive højopløste værker fra PSD-filer +- Lave en PDF-portfolio af flere PSD-designfiler, hvor hver bliver til en side i ét dokument + +## Tips + +- Konverteringen gengiver den sammensatte (fladede) visning af PSD'en. Enkelte lag, justeringslag og lageffekter bevares ikke som separate elementer i PDF'en. +- Flere PSD-filer flettes til én flersidet PDF i stedet for individuelle PDF'er. Det er nyttigt til portfolioer eller lookbooks. +- PSD-filer med meget høj opløsning (printfiler på 300+ DPI) giver store PDF'er. Værktøjet bevarer den fulde opløsning. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [PNG til PDF](./png-to-pdf) +- [VSD til PDF](./vsd-to-pdf) diff --git a/docs/da/tools/pub-to-pdf.md b/docs/da/tools/pub-to-pdf.md new file mode 100644 index 00000000..ebe03791 --- /dev/null +++ b/docs/da/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB til PDF +description: Konvertér Microsoft Publisher-filer (PUB) til PDF i din browser. Gratis, privat, ingen software nødvendig. +--- + +# PUB til PDF + +Konvertér Microsoft Publisher-filer til PDF. Publisher er et DTP-program, der følger med nogle udgaver af Microsoft Office, men de fleste har det ikke installeret. Med dette værktøj kan alle konvertere PUB-filer til PDF direkte i browseren, uden Microsoft-software. + +## Understøttede formater + +| Format | Filendelse | Bemærkninger | +| :------------------ | :--------- | :------------- | +| Microsoft Publisher | `.pub` | DTP-dokumenter | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine PUB-filer. Du kan uploade flere filer på én gang. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurvsikonet, eller klik på **Tilføj flere filer** for at tilføje flere. +3. Klik på **Konvertér til PDF**. En LibreOffice-baseret motor indlæses i browseren og konverterer hver PUB-fil, så layout, billeder og tekstbokse bevares. +4. Én fil downloades direkte som PDF. Flere filer leveres i et ZIP-arkiv med navnet `pub-to-pdf.zip`. + +## Indstillinger + +Ingen yderligere konfiguration er nødvendig. Konverteren håndterer PUB-layoutmotoren automatisk. + +## Anvendelsesmuligheder + +- Åbne en PUB-folder eller et nyhedsbrev fra en kunde uden at købe Microsoft Publisher +- Konvertere kirkeblade, begivenhedsprogrammer eller skolenyhedsbreve lavet i Publisher +- Arkivere marketingmateriale fra Publisher i et universelt tilgængeligt format +- Udskrive PUB-filer på et system, hvor Publisher ikke er installeret + +## Tips + +- Komplekse Publisher-layouts med lagdelte tekstbokse og præcis placering kan flytte sig lidt under konverteringen. Gennemgå resultatet, hvis den præcise placering er afgørende. +- LibreOffice-motoren initialiseres én gang pr. session. Den første konvertering tager længere tid, de næste går hurtigere. +- For den mest tro konvertering af Publisher-filer bør brugerdefinerede skrifttyper i originalen være standardsystemskrifttyper. + +## Relaterede værktøjer + +- [VSD til PDF](./vsd-to-pdf) +- [ODP til PDF](./odp-to-pdf) diff --git a/docs/da/tools/rasterize-pdf.md b/docs/da/tools/rasterize-pdf.md new file mode 100644 index 00000000..6a493e4b --- /dev/null +++ b/docs/da/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasterisér PDF +description: Konvertér PDF-sider til billedbaseret PDF. Flad alle lag ud, fjern markérbar tekst, og styr DPI og billedformat. +--- + +# Rasterisér PDF + +Rasterisering konverterer hver side i en PDF til et billede og samler billederne til en PDF igen. Resultatet ser ud som originalen, men indeholder ingen markérbar tekst, ingen interaktive elementer og ingen redigerbare lag. Det er i praksis en fotokopi i høj kvalitet. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. +2. Vælg **DPI** (opløsning) for det rasteriserede resultat. +3. Vælg et **billedformat**: PNG for tabsfri kvalitet eller JPEG for mindre filer. +4. Markér eventuelt **Konvertér til gråtoner**. +5. Klik på **Rasterisér PDF**. Flere filer downloades som ZIP. + +## Indstillinger + +| Indstilling | Værdier | Standard | +| ---------------- | ---------------------------- | -------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Billedformat** | PNG (tabsfri), JPEG (mindre) | PNG | +| **Gråtoner** | Til/Fra | Fra | + +## DPI-retningslinjer + +- **72**: kun visning på skærm, mindste filstørrelse +- **150**: god balance til almindelig brug +- **200**: skarpere tekst, moderat filstørrelse +- **300**: udskriftskvalitet +- **600**: arkivering i høj kvalitet eller professionel udskrivning + +## Anvendelsesmuligheder + +- Forhindre tekstudtrækning fra fortrolige dokumenter, før de deles +- Eliminere problemer med skrifttypeafhængighed ved at konvertere tekst til pixels +- Lave en "flad" version af en PDF med komplekse lag eller gennemsigtighed, der gengives forskelligt i forskellige læsere +- Forberede en PDF til et system, der kun accepterer billedbaseret input +- Fjerne skjult indhold (som sporede ændringer eller formulardata) ved at reducere PDF'en til rene billeder + +## Tips + +- 150 DPI med PNG er en solid standard. Gå kun højere, hvis du skal bruge udskrift eller zoome ind på fine detaljer. +- JPEG giver mærkbart mindre filer, men indfører kompressionsartefakter på skarpe tekstkanter. +- Rasterisering kan ikke fortrydes. Behold din originale PDF, hvis du senere kan få brug for redigerbar tekst. + +## Relaterede værktøjer + +- [Komprimer PDF](./compress-pdf): reducer den rasteriserede PDF's filstørrelse +- [Ret skæve sider](./deskew-pdf): ret siderne ud, før du rasteriserer scannede dokumenter +- [Skrifttype til kontur](./font-to-outline): konvertér skrifttyper til vektorstier, hvis du vil bevare skalerbarheden +- [Fladgør PDF](./flatten-pdf): flad formularer ud uden at konvertere til billeder diff --git a/docs/da/tools/remove-annotations.md b/docs/da/tools/remove-annotations.md new file mode 100644 index 00000000..dd634fbc --- /dev/null +++ b/docs/da/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Fjern annotationer +description: Fjern alle kommentarer, fremhævninger, links og andre annotationer fra din PDF med et enkelt klik. +--- + +# Fjern annotationer + +Rens din PDF ved at fjerne alle annotationer: kommentarer, fremhævninger, klæbenoter, tekstmarkeringer, links, stempler og alle andre annotationsobjekter i dokumentet. Det underliggende sideindhold (tekst, billeder, grafik) forbliver urørt. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Værktøjet registrerer dokumentets sideantal og viser filoplysninger. +3. Klik på **Fjern annotationer** for at behandle. +4. Den rensede PDF downloades automatisk uden annotationer. + +## Funktioner + +- Fjerner alle annotationstyper: kommentarer, fremhævninger, understregninger, overstregninger, klæbenoter, stempler, links og formularmarkeringer +- Virker på alle sider i dokumentet +- Bevarer alt indhold, der ikke er annotationer (tekst, billeder, vektorgrafik, formularfelter) +- Viser sideantal og filstørrelse før behandling + +## Anvendelsesmuligheder + +- Rydde op i et dokument før endelig distribution efter en gennemgang, hvor flere korrekturlæsere har tilføjet kommentarer +- Fjerne fremhævninger og klæbenoter fra en delt studiehåndbog +- Fjerne linkannotationer fra et dokument før arkivering +- Lave en "ren" version af et juridisk dokument, der blev kraftigt annoteret under forhandlingerne +- Fjerne korrekturlæserkommentarer fra et manuskript, før det sendes til tryk + +## Tips + +- Værktøjet fjerner annotationer på PDF-strukturniveau, så resultatet bevarer markérbar tekst og original kvalitet, uden rasterisering. +- Hvis du kun vil fjerne bestemte annotationer og ikke alle, så brug [PDF-editor](./edit-pdf) til selektivt at slette enkelte annotationer. +- Annotationer i fladede PDF'er (hvor annotationerne er flettet ind i sideindholdet) kan ikke fjernes, da de ikke længere er separate objekter. + +## Relaterede værktøjer + +- [PDF-editor](./edit-pdf) +- [Tilføj vandmærke](./add-watermark) +- [Underskriv PDF](./sign-pdf) diff --git a/docs/da/tools/remove-blank-pages.md b/docs/da/tools/remove-blank-pages.md new file mode 100644 index 00000000..5016d0ba --- /dev/null +++ b/docs/da/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Fjern tomme sider +description: Find og fjern automatisk tomme eller næsten tomme sider fra din PDF med justerbar følsomhed. +--- + +# Fjern tomme sider + +Scan din PDF for tomme eller næsten tomme sider, og fjern dem automatisk. Værktøjet gengiver hver side og analyserer pixelindholdet for at afgøre, om den er tom, og lader dig derefter bekræfte, hvilke sider der skal fjernes, før behandlingen. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Justér **Følsomhed**-skyderen for at styre, hvor strengt "tom" defineres. +3. Klik på **Find tomme sider** for at scanne dokumentet. +4. Værktøjet viser miniaturer af de fundne tomme sider, så du kan gennemgå dem. +5. Bekræft udvalget, og download den rensede PDF uden de tomme sider. + +## Indstillinger + +- **Følsomhed**: En skyder fra 0 % til 100 % (standard 80 %). Højere værdier er strengere og markerer kun sider, der er helt eller næsten hvide. Lavere værdier er mere tolerante og fanger sider med minimalt indhold, som en enkelt prik eller et svagt vandmærke. + +## Funktioner + +- Pixelanalyse af hver side for at finde tomt indhold +- Justerbar følsomhedsskyder til finjustering af registreringen +- Miniaturevisning af fundne tomme sider til manuel kontrol +- Bevarer alle sider med indhold præcis, som de er +- Håndterer dokumenter af enhver størrelse og med et vilkårligt sideantal +- Statusvisning under scanningen + +## Anvendelsesmuligheder + +- Rydde op i scannede dokumenter, hvor scanneren har fanget tomme bagsider af ensidede originaler +- Fjerne skillesider fra bulkscannede dokumentbunker +- Fjerne tomme sider, som dokumenthåndteringssystemer har indsat +- Rydde op i PDF'er eksporteret fra tekstbehandlingsprogrammer, der somme tider tilføjer tomme sider til sidst +- Reducere filstørrelsen ved at fjerne unødvendige tomme sider + +## Tips + +- Start med standardfølsomheden på 80 %, og juster derfra. Hvis værktøjet overser sider, der ser tomme ud for dig, så sænk følsomheden. Hvis det markerer sider med let indhold, du vil beholde, så hæv den. +- Værktøjet gengiver hver side for at analysere indholdet, så behandlingstiden vokser med sideantallet. Ved meget store dokumenter må du forvente en kort ventetid. +- Gennemgå de fundne tomme sider i miniaturevisningen, før du bekræfter fjernelsen. Sider med svage sidehoveder, sidefødder eller vandmærker kan blive markeret afhængigt af følsomhedsindstillingen. + +## Relaterede værktøjer + +- [Beskær PDF](./crop-pdf) +- [PDF-editor](./edit-pdf) +- [Sidetal](./page-numbers) diff --git a/docs/da/tools/remove-metadata.md b/docs/da/tools/remove-metadata.md new file mode 100644 index 00000000..ca40f6c7 --- /dev/null +++ b/docs/da/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Fjern metadata +description: Fjern al skjult metadata fra PDF-filer, herunder forfatter, titel, oprettelsesdato, producent, XMP-data og dokument-id'er. +--- + +# Fjern metadata + +Enhver PDF indeholder metadata, der kan afsløre, hvem der har oprettet den, hvilken software der blev brugt, hvornår den sidst blev ændret, og meget mere. Dette værktøj fjerner det hele: info-ordbogen, XMP-metadatastrømme, dokument-id'er og programspecifikke data, så du står tilbage med et rent dokument uden spor af oprindelsen. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Klik på **Fjern metadata**. +3. Download den rensede fil. + +Ingen indstillinger at konfigurere. Værktøjet er grundigt af design: det rydder alt. + +## Hvad der fjernes + +- **Felter i info-ordbogen**: Titel, Forfatter, Emne, Nøgleord, Opretter, Producent, oprettelsesdato, ændringsdato +- **XMP-metadatastrøm**: Den XML-baserede metadatablok i dokumentkataloget +- **Dokument-id'er**: Unikke identifikatorer i PDF-trailer, som kan bruges til at spore et dokument på tværs af systemer +- **PieceInfo**: Programspecifik metadata tilføjet af programmer som Illustrator eller InDesign + +## Hvad der bevares + +- Alt synligt sideindhold (tekst, billeder, grafik) +- Formularfelter og annotationer +- Bogmærker og links +- Selve dokumentstrukturen + +## Anvendelsesmuligheder + +- Fjerne dit navn og din organisation fra et dokument, før det udgives anonymt +- Fjerne oprettelsestidsstempler, der afslører, hvornår et dokument blev udarbejdet +- Rydde producentstrenge, der afslører din PDF-softwarestak +- Forberede dokumenter til myndighedsindberetninger, der kræver PDF'er uden metadata +- Fjerne spor af redigeringshistorik, før et dokument deles eksternt + +## Tips + +- Brug først værktøjet Vis metadata til at se præcis, hvilken metadata din PDF indeholder, før du fjerner den. +- Hvis du skal fjerne metadata _og_ JavaScript, annotationer og indlejrede filer, så brug Rens PDF til en grundigere rensning. +- Fjernelse af metadata er permanent. Behold din original, hvis du senere kan få brug for dataene. + +## Relaterede værktøjer + +- [Rens PDF](./sanitize-pdf): fjern metadata samt scripts, vedhæftninger og mere +- [Kryptér PDF](./protect-pdf): beskyt den rensede PDF med en adgangskode +- [Komprimer PDF](./compress-pdf): fjernelse af metadata kan reducere filstørrelsen en smule, komprimer for større besparelser diff --git a/docs/da/tools/remove-restrictions.md b/docs/da/tools/remove-restrictions.md new file mode 100644 index 00000000..e2fa5ae8 --- /dev/null +++ b/docs/da/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Fjern begrænsninger +description: Fjern adgangskodebeskyttelse, udskrivningsbegrænsninger, redigeringslåse og kopieringsgrænser fra PDF-filer. +--- + +# Fjern begrænsninger + +PDF'er kan have to typer adgangskoder: en brugeradgangskode (kræves for at åbne filen) og en ejeradgangskode (styrer, hvad du kan gøre med den). Dette værktøj fjerner begge samt alle tilhørende begrænsninger: udskrivning, redigering, kopiering og annotationslåse. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Hvis PDF'en har en ejeradgangskode, så skriv den i feltet **Ejeradgangskode**. Lad feltet stå tomt, hvis PDF'en kun har brugsbegrænsninger uden adgangskode. +3. Klik på **Fjern begrænsninger**. +4. Download den ubegrænsede PDF. + +Værktøjet bruger QPDF's flag `--decrypt` og `--remove-restrictions` til at lave en ren, ubegrænset kopi. + +## Hvad der fjernes + +- Adgangskodebeskyttelse (både bruger- og ejeradgangskoder) +- Udskrivningsbegrænsninger +- Redigeringsbegrænsninger +- Begrænsninger for kopiering af tekst og billeder +- Begrænsninger for annotering og kommentarer +- Alle andre sikkerhedsbegrænsninger, der er kodet i PDF'en + +## Anvendelsesmuligheder + +- Låse en PDF op, som du ejer, men hvis adgangskode du satte for år tilbage +- Fjerne udskrivningsbegrænsninger fra et dokument, du har legitim adgang til +- Aktivere kopiér-og-indsæt i opslagsmateriale til notetagning +- Forberede PDF'er til hjælpemidler, der ikke kan håndtere begrænsede dokumenter + +## Tips + +- Du skal kende ejeradgangskoden, hvis der er sat en. Dette værktøj knækker eller brute-force'r ikke adgangskoder. +- Hvis du vil beholde filen krypteret, men ændre bestemte tilladelser, så brug værktøjet Skift tilladelser i stedet. +- Den resulterende fil har ingen kryptering. Alle, der modtager den, kan åbne den frit. + +## Relaterede værktøjer + +- [Dekryptér PDF](./unlock-pdf): lås en PDF op, når du kender brugeradgangskoden +- [Kryptér PDF](./protect-pdf): anvend kryptering igen med nye indstillinger +- [Skift tilladelser](./change-permissions): ændr selektivt, hvilke handlinger der er tilladt diff --git a/docs/da/tools/repair-pdf.md b/docs/da/tools/repair-pdf.md new file mode 100644 index 00000000..bc6a1e55 --- /dev/null +++ b/docs/da/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Reparér PDF +description: Gendan data fra korrupte eller beskadigede PDF-filer med QPDF's reparationsmotor. Understøtter batchbehandling. +--- + +# Reparér PDF + +Når en PDF ikke vil åbne, viser forvansket indhold eller udløser fejl i din læser, forsøger dette værktøj at genopbygge dens interne struktur. Det bruger QPDF's reparationsmotor, der kan genskabe data fra mange typer korruption: ødelagte krydsreferencetabeller, afkortede strømme, ugyldige objektreferencer og mere. + +## Sådan fungerer det + +1. Upload en eller flere beskadigede PDF-filer. +2. Klik på **Reparér PDF**. +3. En enkelt repareret fil downloades direkte. Flere filer giver et ZIP-arkiv. + +Værktøjet sender hver fil gennem QPDF med flaget `--decrypt`, som tvinger QPDF til at læse og omskrive hele PDF-strukturen og rette de problemer, der kan rettes, undervejs. + +## Funktioner + +- Batchreparation af flere PDF'er i én handling +- Automatisk registrering af filer, der kan genskabes, og filer, der ikke kan +- Rapportering af succes/fejl pr. fil ved behandling af flere filer +- Bruger QPDF (WebAssembly), et gennemtestet bibliotek til PDF-transformation + +## Hvad den kan rette + +- Ødelagte eller manglende krydsreferencetabeller +- Afkortede filender fra ufuldstændige downloads +- Ugyldig objektnummerering og strømlængder +- Mindre strukturelle uoverensstemmelser fra fejlbehæftede PDF-generatorer +- Krypteringsartefakter fra mislykkede dekrypteringsforsøg + +## Hvad den ikke kan rette + +- Kraftigt afkortede filer, hvor det meste af indholdet mangler +- PDF'er krypteret med en adgangskode, du ikke har +- Filer, der ikke i virkeligheden er PDF'er (forkert filendelse) +- Billedkorruption i PDF'en (strukturen rettes, men pixeldata genskabes ikke) + +## Anvendelsesmuligheder + +- Gendanne en PDF fra en mislykket e-maildownload +- Åbne filer fra ældre eller ikke-standardiserede PDF-generatorer +- Rette PDF'er, der virker i én læser, men ikke i en anden +- Forberede beskadigede arkivdokumenter til langtidsopbevaring + +## Tips + +- Hvis reparationen mislykkes, så prøv først at åbne filen i en browser. Browsere har deres egen gendannelseslogik og kan vise nok indhold til at gemme den igen. +- Til krypterede PDF'er, hvor reparationen mislykkes, så prøv først Dekryptér PDF og reparér derefter den dekrypterede fil. + +## Relaterede værktøjer + +- [Komprimer PDF](./compress-pdf): ryd yderligere op i den reparerede PDF's struktur +- [Lineariser PDF](./linearize-pdf): optimer den reparerede fil til webdistribution +- [Fladgør PDF](./flatten-pdf): flad formularer ud, som kan være blevet beskadiget diff --git a/docs/da/tools/reverse-pages.md b/docs/da/tools/reverse-pages.md new file mode 100644 index 00000000..fe2b9c92 --- /dev/null +++ b/docs/da/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Vend sider +description: Vend siderækkefølgen i en eller flere PDF-filer, så den sidste side bliver den første. +--- + +# Vend sider + +Vend siderækkefølgen i en PDF, så den sidste side bliver den første, den næstsidste bliver den anden, og så videre. Understøtter batchbehandling af flere filer på én gang. + +## Sådan fungerer det + +1. Upload en eller flere PDF-filer. +2. Klik på knappen til at behandle. +3. Hver fil vendes uafhængigt. Hvis du uploadede flere filer, er resultatet et ZIP-arkiv med alle de vendte PDF'er. +4. En enkelt fil downloades direkte som en vendt PDF. + +## Funktioner + +- Batchbehandling: vend flere PDF'er i én handling +- Enkeltfilsoutput for én PDF, ZIP-output for flere +- Fjernknapper pr. fil før behandling +- Bevarer alt sideindhold og al formatering + +## Anvendelsesmuligheder + +- Rette et dokument, der blev scannet i omvendt rækkefølge +- Forberede en præsentations-PDF, så den læses bagfra og frem +- Vende siderækkefølgen til bestemte udskrivningsforløb, der fører siderne ind omvendt +- Rette et dokument, hvor siderne ved en fejl blev samlet bagvendt + +## Tips + +- Hver fil i et parti vendes uafhængigt. Filerne ombyttes ikke i forhold til hinanden. +- Til mere detaljeret omorganisering af sider (ikke blot en fuld vending) brug [Duplikér og organisér](./organize-pdf). + +## Relaterede værktøjer + +- [Duplikér og organisér](./organize-pdf) +- [Roter PDF](./rotate-pdf) +- [PDF Multi-værktøj](./pdf-multi-tool) diff --git a/docs/da/tools/rotate-custom.md b/docs/da/tools/rotate-custom.md new file mode 100644 index 00000000..d01f151a --- /dev/null +++ b/docs/da/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Roter med brugerdefineret vinkel +description: Roter PDF-sider i enhver vinkel med gradinput pr. side og batchstyring af rotation. +--- + +# Roter med brugerdefineret vinkel + +Roter PDF-sider i en vilkårlig vinkel, ikke kun i spring på 90 grader. Hver side har sit eget vinkelfelt, og du kan anvende én vinkel på alle sider på én gang med batchstyringen. + +## Sådan fungerer det + +1. Upload en PDF-fil. Der vises miniaturer af alle sider. +2. Hver side har et numerisk inputfelt, der viser dens aktuelle rotationsvinkel. +3. Skriv en vilkårlig gradværdi (positiv eller negativ) for at rotere en bestemt side, eller brug knapperne venstre/højre pr. side til hurtige justeringer på 90 grader. +4. Brug **batchvinkel**-feltet øverst til at angive en ensartet rotation for alle sider. +5. Klik på knappen til at behandle for at oprette den roterede PDF. + +## Funktioner + +- Frit gradinput pr. side (en vilkårlig heltalsværdi) +- Batchvinkelstyring, der giver alle sider den samme rotation +- Forhåndsvisning af rotationen i realtid i miniaturerne +- Hurtigknapper pr. side til spring på 90 grader +- Miniaturer, der indlæses ved behov, for god ydeevne på store dokumenter + +## Anvendelsesmuligheder + +- Rette let skæve scanninger med nogle få grader +- Rotere sider, så de passer til et ikke-standardiseret orienteringskrav +- Anvende præcise rotationer på enkelte sider i et dokument med blandet indhold +- Finjustere sidevinkler efter en indledende masserotation + +## Tips + +- Positive værdier roterer med uret, negative værdier mod uret. +- Batchvinkelfeltet overskriver alle vinkler pr. side, når det anvendes. Foretag individuelle justeringer efter batchhandlingen, hvis det er nødvendigt. +- Til standardrotationer på 90/180/270 grader med en enklere grænseflade brug [Roter PDF](./rotate-pdf). + +## Relaterede værktøjer + +- [Roter PDF](./rotate-pdf) +- [PDF Multi-værktøj](./pdf-multi-tool) +- [Duplikér og organisér](./organize-pdf) diff --git a/docs/da/tools/rotate-pdf.md b/docs/da/tools/rotate-pdf.md new file mode 100644 index 00000000..50481356 --- /dev/null +++ b/docs/da/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Roter PDF +description: Roter enkelte sider eller alle sider i en PDF i spring på 90 grader med en visuel miniaturegrænseflade. +--- + +# Roter PDF + +Roter sider i en PDF 90 grader med eller mod uret. Værktøjet viser miniaturer af hver side, så du kan rotere dem enkeltvis eller anvende en masserotation på hele dokumentet. + +## Sådan fungerer det + +1. Upload en PDF-fil. Miniaturer af alle sider vises i et gitter. +2. Brug rotationsknapperne venstre/højre under hver miniature til at rotere den pågældende side. +3. Brug masserotationsstyringen øverst til at rotere alle sider på én gang. +4. Miniatureforhåndsvisningen opdateres i realtid og viser rotationen. +5. Klik på knappen til at behandle for at gemme den roterede PDF. + +## Funktioner + +- Rotation pr. side i spring på 90 grader (venstre eller højre) +- Masserotation af alle sider samtidigt +- Miniatureforhåndsvisning i realtid med animerede rotationsovergange +- Miniaturer, der indlæses ved behov, for jævn ydeevne på store dokumenter +- Bevarer det oprindelige sideindhold og den oprindelige kvalitet + +## Anvendelsesmuligheder + +- Rette sider, der er scannet på siden eller på hovedet +- Rotere liggende sider til stående retning (eller omvendt) +- Rette et dokument med blandet orientering, hvor nogle sider blev scannet i den forkerte vinkel +- Forberede et dokument til en bestemt visningsorientering + +## Tips + +- Rotationer er kumulative. To klik på knappen med uret giver en rotation på 180 grader. +- Til rotationer, der ikke er på 90 grader (f.eks. 45 grader for at rette en let skæv scanning), brug i stedet [Roter med brugerdefineret vinkel](./rotate-custom). +- Masserotationsstyringen påvirker alle sider, ikke kun udvalgte. Der er ingen udvælgelsesmekanisme i dette værktøj. Brug [PDF Multi-værktøj](./pdf-multi-tool) til det. + +## Relaterede værktøjer + +- [Roter med brugerdefineret vinkel](./rotate-custom) +- [PDF Multi-værktøj](./pdf-multi-tool) +- [Duplikér og organisér](./organize-pdf) diff --git a/docs/da/tools/rtf-to-pdf.md b/docs/da/tools/rtf-to-pdf.md new file mode 100644 index 00000000..7689619e --- /dev/null +++ b/docs/da/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF til PDF +description: Konvertér Rich Text Format-filer (RTF) til PDF i din browser med en LibreOffice-drevet motor. +--- + +# RTF til PDF + +Konvertér Rich Text Format-dokumenter til PDF. RTF er et dokumentformat på tværs af platforme, som stort set alle tekstbehandlingsprogrammer understøtter. Dette værktøj bruger en LibreOffice-motor i browseren til at gengive RTF-filer med formateringen intakt: fed, kursiv, tabeller og indlejrede billeder føres alle over i PDF'en. + +## Understøttede formater + +| Format | Filendelser | MIME-typer | +| :----- | :---------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip en eller flere RTF-filer. +2. Gennemgå fillisten. Tilføj flere eller fjern filer efter behov. +3. Klik på **Konvertér til PDF**. LibreOffice-motoren initialiseres ved første brug og behandler derefter hver fil. +4. En enkelt fil downloades direkte som PDF. Flere filer leveres som `rtf-converted.zip`. + +## Indstillinger + +Dette værktøj har ingen yderligere indstillinger. Konverteringen bevarer den oprindelige RTF-formatering. + +## Resultat + +| Antal filer | Resultat | +| :---------- | :------------------------------------------------- | +| 1 fil | Enkelt PDF-download (f.eks. `letter.pdf`) | +| 2+ filer | ZIP-arkiv (`rtf-converted.zip`) med én PDF pr. fil | + +## Anvendelsesmuligheder + +- Konvertere ældre RTF-dokumenter fra gamle tekstbehandlingsprogrammer til moderne PDF'er +- Gøre RTF-e-mailskabeloner til PDF-forhåndsvisninger +- Behandle RTF-output fra juridiske eller medicinske softwaresystemer +- Batchkonvertere RTF-filer fra et dokumenthåndteringssystem til PDF til arkivering + +## Tips + +- LibreOffice-motoren indlæses én gang og caches. Den første konvertering i en session tager nogle ekstra sekunder, de næste går hurtigere. +- RTF-filer med indlejrede OLE-objekter gengiver muligvis ikke alle objekter perfekt. Ren tekst, billeder og standardformatering konverteres pålideligt. +- Hvis dine RTF-filer er oprettet i Microsoft Word, kan du også konvertere dem direkte med værktøjet [Word til PDF](./word-to-pdf), som accepterer RTF ved siden af DOC og DOCX. + +## Relaterede værktøjer + +- [Word til PDF](./word-to-pdf) +- [ODT til PDF](./odt-to-pdf) +- [Tekst til PDF](./txt-to-pdf) diff --git a/docs/da/tools/sanitize-pdf.md b/docs/da/tools/sanitize-pdf.md new file mode 100644 index 00000000..44636c2c --- /dev/null +++ b/docs/da/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rens PDF +description: Fjern skjult og potentielt farligt indhold fra PDF'er, herunder metadata, JavaScript, indlejrede filer, annotationer og lag. +--- + +# Rens PDF + +PDF'er kan indeholde langt mere, end du ser på skærmen. Skjult metadata, indlejret JavaScript, filvedhæftninger, formulardata og laginformation kan lække følsomme data eller udgøre sikkerhedsrisici. Rensning fjerner det hele, så du står tilbage med et rent dokument, der er sikkert at dele offentligt. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Vælg på tjeklisten, hvilke elementer der skal fjernes. +3. Klik på **Rens PDF**. +4. Download den rensede fil. + +## Rensningsindstillinger + +Alle indstillinger er aktiveret som standard. Fjern markeringen ved dem, du vil bevare. + +| Indstilling | Hvad den fjerner | +| -------------------------- | -------------------------------------------------------------------------- | +| **Flad formularer ud** | Gør interaktive formularfelter til statisk indhold | +| **Fjern metadata** | Fjerner forfatter, titel, oprettelsesdato, softwareoplysninger og XMP-data | +| **Fjern annotationer** | Sletter kommentarer, fremhævninger, klæbenoter og markeringer | +| **Fjern JavaScript** | Fjerner indlejrede scripts, der kan køre ved åbning | +| **Fjern indlejrede filer** | Fjerner filvedhæftninger, der er indlejret i PDF'en | +| **Fjern lag (OCG)** | Flader valgfrie indholdsgrupper ud til ét lag | +| **Fjern links** | Fjerner hyperlinks og URL-referencer | +| **Fjern strukturtræ** | Fjerner dokumentstrukturen, der bruges til tilgængelighedsmærkning | +| **Fjern MarkInfo** | Fjerner oplysninger om markeret indhold | +| **Fjern skrifttyper** | Fjerner indlejrede skrifttypedata (brug med forsigtighed) | + +## Anvendelsesmuligheder + +- Forberede en PDF til offentlig udgivelse ved at fjerne intern metadata (forfatternavne, softwareversioner, redigeringshistorik) +- Fjerne JavaScript fra en PDF fra en upålidelig kilde, før du åbner den +- Rydde op i en PDF, før den sendes til en kunde, som ikke skal se indlejrede kommentarer eller formularfeltnavne +- Fjerne skjulte lag fra en arkitekttegning, før den endelige version deles +- Overholde krav om dataminimering i databeskyttelsesreglerne + +## Tips + +- Lad "Fjern skrifttyper" stå umarkeret, medmindre du er sikker på, at PDF'en stadig vises korrekt. Fjernelse af skrifttyper kan gøre tekst usynlig i nogle læsere. +- Hvis du kun skal fjerne metadata, er det dedikerede værktøj Fjern metadata hurtigere og mere fokuseret. +- Rensning kan ikke fortrydes. Behold din originale fil. + +## Relaterede værktøjer + +- [Fjern metadata](./remove-metadata): fjern kun metadata uden at røre andet indhold +- [Fladgør PDF](./flatten-pdf): flad specifikt formularer og annotationer ud +- [Kryptér PDF](./protect-pdf): tilføj adgangskodebeskyttelse efter rensning +- [Rasterisér PDF](./rasterize-pdf): den drastiske løsning: konvertér til billeder for at fjerne alt skjult indhold diff --git a/docs/da/tools/scanner-effect.md b/docs/da/tools/scanner-effect.md new file mode 100644 index 00000000..a4ca6dca --- /dev/null +++ b/docs/da/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Scannereffekt +description: Få din PDF til at ligne et scannet dokument med justerbar støj, rotation, sløring og papirældning. +--- + +# Scannereffekt + +Forvandl en ren digital PDF til noget, der ser ud, som om det kom fra en flatbed-scanner. Værktøjet anvender konfigurerbar støj, let rotation, sløring, lysstyrkeskift og valgfri gulfarvning for at efterligne en fysisk scannings ufuldkommenheder. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Editoren åbner med en live-forhåndsvisning af første side ved siden af et indstillingspanel. +3. Justér scanningseffektens parametre med skyderne og kontakterne. +4. Forhåndsvisningen opdateres i realtid, når du ændrer indstillinger. +5. Klik på **Anvend** for at behandle alle sider og downloade resultatet. + +## Indstillinger + +- **Farverum (gråtoneskift)**: Konvertér resultatet til gråtoner for et klassisk sort-hvidt scanningslook. +- **Kant**: Tilføj en diskret mørk kant rundt om siderne for at efterligne scannerens kantartefakter. +- **Rotation**: Anvend en let rotation (-5 til +5 grader) for at simulere skæv papirindføring. +- **Rotationsvariation**: Tilføj tilfældig variation i rotationsvinklen, så hver side hælder lidt forskelligt. +- **Lysstyrke**: Skift den samlede lysstyrke op eller ned. +- **Kontrast**: Justér kontrasten for at simulere variationer i tonerkvalitet. +- **Sløring**: Anvend Gaussisk sløring for at blødgøre tekstkanter som i en scanning af lav kvalitet. +- **Støj**: Tilføj tilfældig pixelstøj for at efterligne kornethed fra scannerens sensor. Højere værdier giver mere kornet resultat. +- **Gullig**: Tilføj en varm gul tone for at efterligne ældet eller genbrugspapir. +- **Opløsning**: Angiv output-DPI. Lavere værdier giver et mere pixeleret, scanningslignende udseende. +- **Nulstil**: Gendan alle indstillinger til standardværdierne. + +## Funktioner + +- Realtidsforhåndsvisning, der opdateres, mens du justerer hver parameter +- Tilfældig rotationsvariation pr. side for realistisk variation +- Ti uafhængigt justerbare parametre +- Gråtonetilstand til autentisk sort-hvidt scanningsoutput +- Opløsningsstyring fra faxkvalitet med lav DPI til arkivkvalitet med høj DPI + +## Anvendelsesmuligheder + +- Få digitalt oprettede dokumenter til at se ud, som om de er scannet og udskrevet +- Simulere fysisk dokumentældning til genskabelse af historiske dokumenter +- Teste OCR-software mod forringet scanningskvalitet +- Producere dokumenter, der matcher den visuelle stil i eksisterende scannede arkiver + +## Tips + +- Start med subtile værdier. Et støjniveau på 10-20, en let rotation på 0,5 grader og minimal sløring giver allerede et overbevisende scanningslook. +- Kombinér gråtonetilstand med let gulfarvning for en "kopi af en kopi"-effekt. +- Lavere opløsningsindstillinger (100-150 DPI) giver det mest realistiske faxmaskineudseende. + +## Relaterede værktøjer + +- [Invertér farver](./invert-colors) +- [Justér farver](./adjust-colors) +- [Baggrundsfarve](./background-color) diff --git a/docs/da/tools/sign-pdf.md b/docs/da/tools/sign-pdf.md new file mode 100644 index 00000000..fd638304 --- /dev/null +++ b/docs/da/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Underskriv PDF +description: Tegn, skriv eller upload en signatur, og placér den på dine PDF-sider med en integreret læser. +--- + +# Underskriv PDF + +Tilføj din signatur til ethvert PDF-dokument. Værktøjet indlejrer en fuld PDF-læser med indbyggede signaturværktøjer, hvor du kan tegne en signatur frihånd, skrive dit navn i en signaturskrifttype eller uploade et signaturbillede. Placér og tilpas størrelsen på signaturer på en vilkårlig side, og gem derefter det underskrevne dokument. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Dokumentet åbnes i en integreret PDF-læser med annotationsværktøjer. +3. Brug læserens signaturværktøj til at oprette din signatur ved at tegne, skrive eller uploade et billede. +4. Klik på den side, hvor du vil placere signaturen, og justér dens størrelse og position. +5. Markér eventuelt **Fladgør PDF** for permanent at indlejre signaturen i dokumentet. +6. Klik på **Gem og download underskrevet PDF** for at få din underskrevne fil. + +## Indstillinger + +- **Fladgør PDF**: Når den er markeret, indlejres signaturen permanent i sideindholdet. Det forhindrer, at andre flytter eller sletter signaturen. Når den ikke er markeret, forbliver signaturen en annotation, der kan redigeres i kompatible læsere. + +## Funktioner + +- Tre måder at oprette en signatur på: frihåndstegning, skrevet tekst eller uploadet billede +- Integreret PDF-læser til nøjagtig placering +- Træk for at placere og ændre størrelsen på signaturer på en vilkårlig side +- Valgfri udfladning for permanent at indlejre signaturer +- Understøttelse af flere signaturer i samme dokument + +## Anvendelsesmuligheder + +- Underskrive kontrakter, aftaler eller godkendelsesformularer, før de sendes tilbage +- Tilføje din signatur til skattedokumenter, forsikringskrav eller offentlige formularer +- Sætte initialer på enkelte sider i en flersidet aftale +- Underskrive fortrolighedsaftaler eller HR-dokumenter, der kommer som PDF-vedhæftninger + +## Tips + +- Aktivér udfladning, hvis du sender den underskrevne PDF til en, der ikke bør kunne fjerne eller flytte din signatur. +- Til juridisk bindende digitale signaturer med certifikatbaseret verificering tilbyder BentoPDF også et separat værktøj, Digital signatur PDF. +- Upload et PNG-signaturbillede med gennemsigtig baggrund for det reneste resultat. + +## Relaterede værktøjer + +- [PDF-editor](./edit-pdf) +- [Tilføj stempler](./add-stamps) +- [PDF-formularudfylder](./form-filler) diff --git a/docs/da/tools/split-pdf.md b/docs/da/tools/split-pdf.md new file mode 100644 index 00000000..a9b3cad9 --- /dev/null +++ b/docs/da/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Opdel PDF +description: Opdel en PDF i mindre filer efter sideinterval, visuelt udvalg, bogmærker, lige/ulige sider eller faste intervaller. +--- + +# Opdel PDF + +Del en PDF op i mindre dokumenter med en af seks opdelingstilstande. Fra enkle sideintervaller til bogmærkebaseret opdeling dækker dette værktøj alle scenarier, hvor et dokument skal deles. + +## Sådan fungerer det + +1. Upload en enkelt PDF-fil. +2. Vælg en opdelingstilstand i rullemenuen. +3. Konfigurér tilstandens indstillinger (sideintervaller, udvalg osv.). +4. Klik på knappen til at behandle. +5. Resultatet downloades som en enkelt PDF eller et ZIP-arkiv afhængigt af tilstand og indstillinger. + +## Opdelingstilstande + +| Tilstand | Beskrivelse | +| ------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| **Interval** | Angiv sideintervaller som `1-3, 5, 8-10`. Flere intervaller giver separate PDF'er i et ZIP-arkiv. Ét interval giver én PDF. | +| **Visuelt udvalg** | Gennemse sideminiaturer, og klik for at vælge de sider, du vil have. De valgte sider udtrækkes til en ny PDF. | +| **Lige / ulige** | Udtræk kun sider med lige eller ulige numre. | +| **Alle sider** | Opdel hver side i sin egen PDF-fil, downloadet som ZIP. | +| **Bogmærker** | Opdel ved bogmærkegrænser. Vælg bogmærkeniveauet for at styre, hvor opdelingerne sker. | +| **Hver N. side** | Opdel i bidder på N sider hver (f.eks. hver 5. side). Den sidste bid kan have færre sider. | + +## Funktioner + +- Seks forskellige opdelingstilstande, der dækker stort set alle behov +- Visuel sidevælger med miniaturer, der indlæses ved behov +- Bogmærkebevidst opdeling med niveaufiltrering +- ZIP-output som mulighed i interval- og visuel tilstand +- Håndterer sideintervaller med blandet syntaks (`1-3, 5, 8-10`) +- Advarsel, når opdeling i N sider giver ujævne bidder + +## Anvendelsesmuligheder + +- Udtrække et bestemt kapitel eller afsnit fra et stort dokument +- Adskille ulige og lige sider til dobbeltsidede udskrivningsforløb +- Dele en bog-PDF i enkelte kapitelfiler ved bogmærkegrænser +- Udtrække bestemte sider (som en underskriftsside) fra en kontrakt +- Opdele en samlet rapport i filer pr. afsnit til distribution + +## Tips + +- Flere sideintervaller adskilt af kommaer (f.eks. `1-5, 10-15, 20-25`) giver separate PDF'er, én pr. interval, samlet i et ZIP-arkiv. +- Bogmærketilstanden kræver, at PDF'en rent faktisk indeholder bogmærker. Hvis der ikke findes nogen, får du en fejlmeddelelse. +- Afkrydsningsfeltet "Download som ZIP" i interval- og visuel tilstand lader dig få individuelle PDF'er pr. side i stedet for en samlet fil. + +## Relaterede værktøjer + +- [Flet PDF](./merge-pdf) +- [Udtræk sider](./extract-pages) +- [Slet sider](./delete-pages) +- [PDF Multi-værktøj](./pdf-multi-tool) diff --git a/docs/da/tools/svg-to-pdf.md b/docs/da/tools/svg-to-pdf.md new file mode 100644 index 00000000..e0c89491 --- /dev/null +++ b/docs/da/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG til PDF +description: Konvertér SVG-vektorgrafik til PDF med kvalitetsstyring, helt i din browser. +--- + +# SVG til PDF + +Konvertér Scalable Vector Graphics-filer (SVG) til PDF. Værktøjet rasteriserer hver SVG gennem browserens gengivelsesmotor og indlejrer derefter resultatet i dets oprindelige opløsning. Nyttigt til at gøre vektorikoner, diagrammer og illustrationer til flytbare dokumenter. + +## Understøttede formater + +| Format | Filendelser | +| :----- | :---------- | +| SVG | `.svg` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip en eller flere SVG-filer. +2. Gennemgå og administrér fillisten. +3. Vælg et **PDF-kvalitet**-niveau. +4. Klik på **Konvertér til PDF**. Resultatet downloades som `from_svgs.pdf`. + +Hver SVG læses som tekst, gengives på et lærred i sin egen bredde og højde (standard 800x600, hvis der ikke er angivet mål) og eksporteres som PNG. Den PNG indlejres derefter i PDF'en med pdf-lib. Gennemsigtige områder udfyldes med hvid baggrund. + +## Indstillinger + +**PDF-kvalitet** styrer komprimeringen efter rasterisering: + +- **Høj kvalitet**: tættest på den oprindelige gengivelse. +- **Medium kvalitet** (standard): god balance. +- **Lav kvalitet**: mindste fil, noget detaljetab. + +## Anvendelsesmuligheder + +- Konvertere arkitekt- eller ingeniørdiagrammer fra SVG til en udskriftsklar PDF +- Samle ikonsæt i en referencerapport-PDF til et designsystem +- Gøre datavisualiseringer (D3.js, eksport fra diagrambiblioteker) til rapportklare PDF'er +- Lave udskrivbare versioner af SVG-baserede infografikker + +## Tips + +- SVG-filer uden eksplicitte attributter `width` og `height` gengives i 800x600 pixels. For det bedste resultat bør du angive mål i SVG-kilden, før du konverterer. +- Komplekse SVG'er med eksterne skrifttypereferencer eller linkede billeder gengives muligvis ikke perfekt. Indlejr alle ressourcer i SVG'en for pålideligt resultat. +- Da SVG'en rasteriseres, indeholder PDF'en et bitmapbillede frem for vektorstier. Til ægte vektor-PDF-output kræves et dedikeret vektorværktøj. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [PNG til PDF](./png-to-pdf) +- [BMP til PDF](./bmp-to-pdf) diff --git a/docs/da/tools/table-of-contents.md b/docs/da/tools/table-of-contents.md new file mode 100644 index 00000000..bbe3fd5c --- /dev/null +++ b/docs/da/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Indholdsfortegnelse +description: Generér en formateret indholdsfortegnelsesside ud fra din PDF's eksisterende bogmærker. +--- + +# Indholdsfortegnelse + +Dette værktøj læser bogmærkerne (konturen) i din PDF og genererer en formateret indholdsfortegnelsesside, som sættes foran dokumentet. Hvis din PDF allerede har bogmærker, men mangler en synlig indholdsfortegnelsesside, opretter dette værktøj en automatisk. + +## Sådan fungerer det + +1. Upload en PDF, der indeholder bogmærker. +2. Tilpas titel, skriftstørrelse og skrifttypefamilie for indholdsfortegnelsen. +3. Markér eventuelt **Tilføj bogmærke til indholdsfortegnelsessiden** for at medtage selve indholdsfortegnelsen i bogmærketræet. +4. Klik på **Generér indholdsfortegnelse** for at behandle filen. +5. Den opdaterede PDF downloades automatisk med indholdsfortegnelsessiden indsat først. + +## Indstillinger + +- **Titel på indholdsfortegnelse**: Overskriften øverst på den genererede side. Standard er "Indholdsfortegnelse". +- **Skriftstørrelse**: Vælg fra 10 pt til 72 pt. Standard er 12 pt. +- **Skrifttypefamilie**: Vælg mellem Times Roman-, Helvetica- eller Courier-varianter (normal, fed, kursiv, fed kursiv). Standard er Helvetica. +- **Tilføj bogmærke til indholdsfortegnelsessiden**: Når den er markeret, tilføjes et bogmærke for selve indholdsfortegnelsessiden til PDF'ens kontur. + +## Funktioner + +- Læser hele bogmærkehierarkiet fra PDF'en +- Genererer en pænt formateret indholdsfortegnelsesside med sidetalshenvisninger +- Understøtter indlejrede bogmærkeniveauer med indrykning +- Valg mellem 12 indbyggede PDF-skrifttyper +- Valgfrit selvrefererende bogmærke til indholdsfortegnelsessiden + +## Anvendelsesmuligheder + +- Tilføje en udskrivbar indholdsfortegnelse til e-bøger eller rapporter, der kun har digitale bogmærker +- Oprette en indholdsfortegnelse til et sammenflettet dokument efter at have kombineret flere PDF'er +- Generere en referenceside til lange tekniske manualer +- Forberede dokumenter til tryk, hvor en synlig indholdsfortegnelse forventes + +## Tips + +- Hvis din PDF ikke har bogmærker, så brug først værktøjet [Redigér bogmærker](./bookmark) til at oprette dem, og kom derefter tilbage hertil for at generere indholdsfortegnelsen. +- Til store dokumenter forbedrer en større skriftstørrelse som 14 pt eller 16 pt læsbarheden. + +## Relaterede værktøjer + +- [Redigér bogmærker](./bookmark) +- [Sidetal](./page-numbers) +- [Sidehoved og sidefod](./header-footer) diff --git a/docs/da/tools/text-color.md b/docs/da/tools/text-color.md new file mode 100644 index 00000000..7bf1d106 --- /dev/null +++ b/docs/da/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Skift tekstfarve +description: Skift farven på al tekst i din PDF til en farve, du selv vælger. +--- + +# Skift tekstfarve + +Udskift tekstens farve i hele din PDF. Værktøjet finder tekstområder på hver side og genfarver dem til din valgte farve, mens dokumentets layout og indhold, der ikke er tekst, bevares. + +## Sådan fungerer det + +1. Upload din PDF-fil. +2. Vælg en ny tekstfarve med farvevælgeren. Standard er blå (#0000FF). +3. Klik på **Skift tekstfarve** for at behandle. +4. Den genfarvede PDF downloades automatisk. En statusindikator viser, hvilken side der behandles. + +## Indstillinger + +- **Ny tekstfarve**: En farvevælger til at vælge erstatningsfarven for al tekst i dokumentet. + +## Funktioner + +- Genfarver tekst på alle sider i dokumentet +- Behandling side for side med statusvisning +- Farvevælger med fuld understøttelse af hex-farver +- Bevarer sidelayout og elementer, der ikke er tekst + +## Anvendelsesmuligheder + +- Ændre sort tekst til mørkeblå for et blødere, mere moderne dokumentudseende +- Genfarve tekst, så den passer til brandretningslinjer, før dokumenter distribueres +- Konvertere tekst til en bestemt farve af hensyn til tilgængelighed +- Gøre tekst synlig mod en nyligt anvendt baggrundsfarve + +## Tips + +- Dette værktøj gengiver sider i 2x skala for kvalitetens skyld og genopbygger derefter PDF'en. Resultatet er billedbaseret, så teksten kan ikke længere markeres eller søges i. +- Til dokumenter, hvor du skal beholde markérbar tekst, kan du i stedet redigere PDF'en direkte med [PDF-editor](./edit-pdf). +- Behandlingstiden stiger med sideantallet, da hver side gengives for sig. + +## Relaterede værktøjer + +- [Baggrundsfarve](./background-color) +- [Invertér farver](./invert-colors) +- [Justér farver](./adjust-colors) diff --git a/docs/da/tools/tiff-to-pdf.md b/docs/da/tools/tiff-to-pdf.md new file mode 100644 index 00000000..90ef8c11 --- /dev/null +++ b/docs/da/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF til PDF +description: Konvertér enkelt- og flersidede TIFF-billeder til PDF i din browser med fuld sideunderstøttelse. +--- + +# TIFF til PDF + +Konvertér TIFF-filer til PDF, herunder flersidede TIFF'er. Hver side (eller "IFD") i en TIFF-fil bliver til en separat side i den resulterende PDF. Det er især nyttigt til scannede dokumenter, faxer og medicinske billeder, som ofte gemmes som flersidede TIFF'er. + +## Understøttede formater + +| Format | Filendelser | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine TIFF-filer. +2. Gennemgå fillisten, og administrér den efter behov. +3. Klik på **Konvertér til PDF**. Resultatet downloades som `from_tiff.pdf`. + +Værktøjet afkoder hver TIFF-fil med en JavaScript-TIFF-dekoder og udtrækker de rå RGBA-pixeldata for hver side. Hver side gengives på et lærred, eksporteres som PNG og indlejres i PDF'en. Sidemålene svarer til de oprindelige TIFF-sider. + +## Indstillinger + +Dette værktøj har ingen yderligere kvalitetsindstillinger. Billeder indlejres i deres oprindelige opløsning. + +## Anvendelsesmuligheder + +- Konvertere flersidede faxdokumenter (TIFF-F) til et mere flytbart PDF-format +- Gøre scannede dokumentarkiver gemt som TIFF til søgbare PDF'er (kombinér bagefter med OCR-værktøjet) +- Behandle medicinske billedfiler (patologisnit, radiologieksport), der bruger TIFF +- Konvertere GIS- eller satellitbilleder i TIFF til delbare dokumenter + +## Tips + +- Flersidede TIFF'er understøttes fuldt ud. En TIFF på 10 sider giver en PDF på 10 sider. Du behøver ikke opdele TIFF'en først. +- Meget store TIFF-filer (hundredvis af megabyte) kan tage længere tid at behandle, da hele filen skal afkodes i browserens hukommelse. +- Hvis du har brug for OCR på den resulterende PDF, så kør den gennem værktøjet [OCR PDF](./ocr-pdf) efter konverteringen. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [BMP til PDF](./bmp-to-pdf) +- [JPG til PDF](./jpg-to-pdf) diff --git a/docs/da/tools/txt-to-pdf.md b/docs/da/tools/txt-to-pdf.md new file mode 100644 index 00000000..06c2c010 --- /dev/null +++ b/docs/da/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Tekst til PDF +description: Konvertér rene tekstfiler eller skrevet tekst til PDF med brugerdefinerede skrifttyper, farver og sidestørrelser. +--- + +# Tekst til PDF + +Konvertér ren tekst til en formateret PDF. Du kan uploade `.txt`-filer eller skrive direkte i den indbyggede teksteditor. Værktøjet understøtter flere skrifttyper, brugerdefinerede tekstfarver og et bredt udvalg af sidestørrelser, fra A0 ned til A10 samt US Letter, Legal og Tabloid. + +## Understøttede formater + +| Input | Filendelser | +| :----------------- | :---------------------------- | +| Rene tekstfiler | `.txt` | +| Direkte tekstinput | Skriv eller indsæt i editoren | + +## Sådan fungerer det + +1. Vælg inputtilstand med kontakten øverst: **Upload filer** eller **Skriv tekst**. +2. Hvis du uploader, så træk og slip eller klik for at vælge en eller flere `.txt`-filer. Hvis du skriver, så indtast din tekst direkte i tekstfeltet. +3. Konfigurér formateringsindstillingerne: skrifttypefamilie, skriftstørrelse, tekstfarve og sidestørrelse. +4. Klik på **Opret PDF**. Resultatet downloades som `text_to_pdf.pdf`. + +Når du uploader flere filer, sættes deres indhold sammen med tomme linjer imellem. + +## Indstillinger + +| Indstilling | Værdier | Standard | +| :-------------------- | :------------------------------------------------------------------------------- | :------------- | +| **Skrifttypefamilie** | Helvetica (sans-serif), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Skriftstørrelse** | 6 til 72 pt | 12 | +| **Tekstfarve** | Enhver farve via farvevælger | Sort (#000000) | +| **Sidestørrelse** | ISO A0 til A10, B0 til B10, C0 til C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +RTL-sprog (arabisk, hebraisk, persisk, urdu) registreres automatisk. Når RTL-tekst findes, skifter tekstretning og justering tilsvarende. + +## Anvendelsesmuligheder + +- Konvertere kodestykker eller logfiler til en udskrivbar PDF med Courier-skrifttype +- Lave en hurtig PDF af mødenoter, der er skrevet på stedet +- Formatere et rent tekstmanuskript med en bestemt skrifttype og sidestørrelse til indsendelse +- Producere en PDF-version af en README eller changelog til offline distribution + +## Tips + +- Brug tilstanden **Skriv tekst**, når du hurtigt vil konvertere indhold fra udklipsholderen uden først at gemme det som fil. +- Courier (monospace) er det bedste skrifttypevalg til kode, logfiler eller alt indhold, hvor kolonnejustering har betydning. +- Sidemarginerne er faste på 72 punkter (1 tomme) på alle sider. + +## Relaterede værktøjer + +- [Markdown til PDF](./markdown-to-pdf) +- [CSV til PDF](./csv-to-pdf) +- [Word til PDF](./word-to-pdf) diff --git a/docs/da/tools/unlock-pdf.md b/docs/da/tools/unlock-pdf.md new file mode 100644 index 00000000..e397eb6f --- /dev/null +++ b/docs/da/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Lås PDF op +description: Fjern adgangskodebeskyttelse fra krypterede PDF-filer. Understøtter batchdekryptering med én adgangskode til flere filer. +--- + +# Lås PDF op + +Hvis du har adgangskoden til en krypteret PDF, fjerner dette værktøj krypteringen helt og producerer en oplåst kopi, som alle kan åbne uden adgangskode. Det understøtter batchdekryptering, når flere PDF-filer deler den samme adgangskode. + +## Sådan fungerer det + +1. Upload en eller flere krypterede PDF-filer. +2. Indtast den **adgangskode**, der blev brugt til at beskytte filerne. +3. Klik på **Dekryptér PDF**. +4. En enkelt fil downloades direkte. Flere filer giver et ZIP-arkiv med alle de oplåste PDF-filer. + +## Funktioner + +- Dekryptering af enkeltfiler og batches +- Håndterer både brugeradgangskoder og ejeradgangskoder +- Giver et helt ukrypteret resultat uden resterende begrænsninger +- Tydelig fejlrapportering ved forkerte adgangskoder eller beskadigede filer +- Succes og fejl pr. fil i batchtilstand + +## Forskellen fra Fjern begrænsninger + +**Dekryptér PDF** kræver adgangskoden og fjerner al kryptering. **Fjern begrænsninger** retter sig mod brugsbegrænsninger (udskrivning, kopiering, redigering) og kræver muligvis ikke en adgangskode, hvis der kun er sat en ejeradgangskode. Brug Dekryptér, når PDF-filen slet ikke kan åbnes uden adgangskode. + +## Anvendelsesområder + +- Permanent oplåsning af PDF-filer, du selv har krypteret tidligere, når adgangskoden ikke længere er nødvendig +- Fjernelse af kryptering fra en batch af arkiverede dokumenter for lettere langtidsadgang +- Klargøring af adgangskodebeskyttede PDF-filer til et dokumenthåndteringssystem, der ikke understøtter krypterede filer +- Oplåsning af PDF-filer før de flettes med andre dokumenter (mange fletteværktøjer kan ikke behandle krypteret input) + +## Tips + +- Adgangskodefeltet gælder for alle uploadede filer. Hvis dine PDF-filer har forskellige adgangskoder, skal du behandle dem i separate batches. +- Hvis du får fejlen "Forkert adgangskode", så kontrollér for mellemrum til sidst eller caps lock. +- Efter dekryptering har resultatet ingen sikkerhed. Kryptér igen med Kryptér PDF, hvis du vil bruge en ny adgangskode. + +## Relaterede værktøjer + +- [Kryptér PDF](./protect-pdf): anvend kryptering igen med en ny adgangskode +- [Fjern begrænsninger](./remove-restrictions): fjern brugsbegrænsninger uden fuld dekryptering +- [Skift tilladelser](./change-permissions): ændr bestemte tilladelser på en krypteret PDF diff --git a/docs/da/tools/validate-signature-pdf.md b/docs/da/tools/validate-signature-pdf.md new file mode 100644 index 00000000..df188133 --- /dev/null +++ b/docs/da/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Validér signatur +description: Verificér digitale signaturer i PDF-filer. Kontrollér certifikatets gyldighed, underskriverens identitet, dokumentets integritet og status for tillidskæden. +--- + +# Validér signatur + +Upload en signeret PDF, og værktøjet udtrækker hver digital signatur, identificerer underskriveren, kontrollerer certifikatets gyldighed og rapporterer, om dokumentet er ændret siden signeringen. Du kan også angive et betroet certifikat for at verificere signaturkæden. + +## Sådan fungerer det + +1. Upload en signeret PDF-fil. Valideringen starter automatisk. +2. Værktøjet viser en oversigt: antal fundne signaturer og hvor mange der er gyldige. +3. Hver signatur får et detaljeret kort med underskrivers navn, udsteder, datoer og status. +4. Du kan eventuelt uploade et **betroet certifikat** (.pem, .crt, .cer, .der) for at verificere signaturen mod et bestemt tillidsanker. Genvalidering kører automatisk. + +## Hvad der kontrolleres + +### Parsing af signatur + +Værktøjet udtrækker PKCS#7-signaturobjekter fra PDF-filen, afkoder ASN.1-strukturen og henter underskriverens X.509-certifikat sammen med en eventuel certifikatkæde, der er indlejret i signaturen. + +### Certifikatets gyldighed + +- **Udløb**: Ligger certifikatet i øjeblikket inden for sin gyldighedsperiode? +- **Registrering af selvsignerede certifikater**: Er certifikatet sin egen udsteder? +- **Tillidskæde**: Når et betroet certifikat er angivet, fører underskriverens certifikat så tilbage til det? + +### Kryptografisk verificering + +- Værktøjet rekonstruerer de bytes, som signaturens `/ByteRange` dækker, hasher dem med den algoritme, underskriveren har angivet, og sammenligner resultatet med attributten `messageDigest` i signaturen. +- Derefter serialiseres de signerede attributter igen som et DER SET, og signaturen verificeres mod signaturcertifikatets offentlige nøgle. +- **En signatur rapporteres kun som gyldig, når alt dette lykkes.** Hvis PDF-bytes er ændret efter signeringen, eller den indlejrede signatur ikke passer til underskriverens nøgle, viser status "Ugyldig: kryptografisk verificering mislykkedes" med den konkrete årsag. + +#### Understøttede signaturalgoritmer + +| Algoritme | Verificeringsvej | +| ----------------------- | -------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, med Web Crypto som fallback | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` efter DER → IEEE P1363-signaturkonvertering | + +Hvis en signatur bruger en algoritme uden for denne liste (for eksempel Ed25519, SM2 eller RSA med et usædvanligt digest-OID), viser kortet **"Ikke verificeret: signaturalgoritmen understøttes ikke"** med gul farve sammen med det konkrete OID eller den konkrete årsag. Det er en bevidst skelnen mellem tre tilstande: + +- **Gyldig**: signaturen er kryptografisk verificeret mod underskriverens offentlige nøgle. +- **Ugyldig**: verificeringen kørte og gav et negativt resultat (ændrede bytes, nøglen passer ikke). +- **Ikke verificeret**: værktøjet kunne ikke køre verificering for denne algoritme. Certifikatets metadata vises stadig, men du bør behandle signaturen som "ukendt" og verificere den med Adobe Acrobat eller `openssl cms -verify`. + +### Usikre digest-algoritmer + +- Signaturer, der bruger **MD5 eller SHA-1**, afvises som ugyldige og markeres med status "Usikker digest". Begge algoritmer har offentliggjorte kollisionsangreb, så en signatur over en SHA-1- eller MD5-hash giver ingen integritetsgaranti. +- SHA-224, SHA-256, SHA-384 og SHA-512 accepteres alle. + +### Dokumentdækning + +- **Fuld dækning**: Signaturen dækker hele PDF-filen, hvilket betyder, at ingen bytes er tilføjet eller ændret efter signeringen. +- **Delvis dækning**: Signaturen dækker kun en del af filen. Det kan betyde, at der er foretaget ændringer efter signeringen (ikke nødvendigvis ondsindede: trinvise gemninger giver delvis dækning). + +## Signaturdetaljer + +Hvert signaturkort viser: + +- **Underskrevet af**: Almindeligt navn, organisation og e-mail fra underskriverens certifikat +- **Udsteder**: Den certificeringsmyndighed, der udstedte underskriverens certifikat +- **Underskrevet den**: Tidsstemplet, der er indlejret i signaturen +- **Gyldig fra / Gyldig til**: Certifikatets gyldighedsperiode +- **Årsag**: Hvorfor dokumentet blev signeret (hvis angivet) +- **Placering**: Hvor det blev signeret (hvis angivet) +- **Dækningsstatus**: Fuld eller delvis +- **Tillidsmærke**: Betroet eller Ikke i tillidskæden (kun når et brugerdefineret certifikat er angivet) + +### Tekniske detaljer + +Udvid afsnittet med tekniske detaljer for at se: + +- Serienummer på underskriverens certifikat +- Digest-algoritme (SHA-256, SHA-512 osv.) +- Signaturalgoritme (RSA med SHA-256, ECDSA med SHA-256 osv.) +- Fejlmeddelelser for ugyldige signaturer + +## Anvendelsesområder + +- Verificering af en digitalt signeret kontrakt, før du kontrasignerer +- Revision af signerede dokumenter for at bekræfte, at de ikke er manipuleret +- Kontrol af, om et certifikat er udløbet, siden dokumentet blev signeret +- Validering af signaturer mod din organisations rodcertifikat +- Undersøgelse af signeringsdetaljer i offentlige eller juridiske dokumenter + +## Tips + +- Et selvsigneret certifikat betyder ikke, at signaturen er ugyldig. Det betyder, at underskriverens identitet ikke kan bekræftes via en betroet tredjepart. Det er almindeligt for interne dokumenter. +- Delvis dækning er ikke altid tegn på manipulation. Mange PDF-arbejdsgange tilføjer trinvise opdateringer (som en anden signatur), der giver delvis dækning. +- Upload din organisations rod- eller mellemcertifikat som betroet certifikat for at få verificering af tillidskæden. + +## Relaterede værktøjer + +- [Digital signatur](./digital-sign-pdf): signér PDF-filer med dit eget certifikat +- [Fladgør PDF](./flatten-pdf): fladgør en PDF før signering for at forhindre ændringer efter signeringen +- [Fjern metadata](./remove-metadata): ryd op i en PDF, før du anvender en signatur diff --git a/docs/da/tools/view-metadata.md b/docs/da/tools/view-metadata.md new file mode 100644 index 00000000..1d1c956f --- /dev/null +++ b/docs/da/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Vis metadata +description: Undersøg alle metadataegenskaber i en PDF, herunder dokumentoplysninger, XMP-data og strukturelle detaljer. +--- + +# Vis metadata + +Undersøg de skjulte egenskaber, der er indlejret i en PDF-fil. Værktøjet viser dokumentoplysninger (titel, forfatter, datoer), XMP-metadata, sidestørrelser og andre strukturelle data i et læsbart format. + +## Sådan fungerer det + +1. Upload en PDF-fil. +2. Værktøjet parser straks filen og viser alle tilgængelige metadata i overskuelige sektioner. +3. Gennemgå dokumentets infoordbog, XMP-metadatatræet og de strukturelle egenskaber. +4. Intet behandlingstrin er nødvendigt: metadata vises, så snart filen er indlæst. + +## Funktioner + +- Viser standardfelter for dokumentoplysninger: Title, Author, Subject, Keywords, Creator, Producer +- Viser oprettelses- og ændringsdatoer i et læsbart format +- Parser og gengiver hele XMP-metadatatræet med indlejrede navnerum +- Konverterer PDF-datoformatet (`D:20240101120000Z`) til læsbare datoer +- Organiseret i sammenklappelige sektioner for nem navigation + +## Metadatasektioner + +| Sektion | Indhold | +| ----------------------- | -------------------------------------------------------------------------------------- | +| **Dokumentoplysninger** | Title, Author, Subject, Keywords, Creator, Producer, Creation Date, Modification Date | +| **XMP-metadata** | Komplet XML-baseret metadatatræ med Dublin Core, XAP, PDF og brugerdefinerede navnerum | +| **Dokumentegenskaber** | Sideantal, PDF-version, filstørrelse, krypteringsstatus | + +## Anvendelsesområder + +- Kontrol af, hvem der har skrevet en PDF, og hvornår den sidst blev ændret +- Bekræftelse af, at metadata er indstillet korrekt, før et dokument udgives +- Revision af PDF-filer af hensyn til privatlivet ved at kontrollere, hvilke personlige oplysninger der er indlejret +- Undersøgelse af, hvilken software der er brugt til at oprette eller ændre en PDF (via feltet Producer) +- Gennemgang af XMP-metadata i forbindelse med compliance for digital asset management + +## Tips + +- PDF-datostrenge, der begynder med `D:`, konverteres automatisk til din lokale tidszone. +- Hvis metadatafelter virker tomme, har PDF-skaberen blot ikke angivet dem. Ikke alle PDF-filer indeholder rige metadata. +- Brug [Redigér metadata](./edit-metadata) til at ændre metadata efter gennemgangen. Brug Fjern metadata til at fjerne dem helt. + +## Relaterede værktøjer + +- [Redigér metadata](./edit-metadata) +- [PDF OCG-lag](./pdf-layers) +- [Sammenlign PDF-filer](./compare-pdfs) diff --git a/docs/da/tools/vsd-to-pdf.md b/docs/da/tools/vsd-to-pdf.md new file mode 100644 index 00000000..70bc86e2 --- /dev/null +++ b/docs/da/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD til PDF +description: Konvertér Microsoft Visio-diagrammer (VSD/VSDX) til PDF i din browser. Gratis, privat, ingen Visio nødvendig. +--- + +# VSD til PDF + +Konvertér Microsoft Visio-diagrammer til PDF uden at installere Visio. VSD- og VSDX-filer indeholder rutediagrammer, organisationsdiagrammer, netværksdiagrammer og plantegninger, som de fleste ikke kan åbne. Dette værktøj gengiver dem som rene PDF-filer, der kan ses på enhver enhed. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----------- | :---------- | :------------------------------------------- | +| Visio Binary | `.vsd` | Ældre Visio-format (Visio 2003 og tidligere) | +| Visio XML | `.vsdx` | Moderne Visio-format (Visio 2013+) | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine VSD- eller VSDX-filer. Begge formater kan blandes i en enkelt batch. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurvsikonet, eller brug **Tilføj flere filer** for at tilføje flere diagrammer. +3. Klik på **Konverter til PDF**. Den LibreOffice-baserede motor indlæses i browseren og gengiver hvert diagram til en PDF, så former, forbindelser, etiketter og sidelayout bevares. +4. Et enkelt diagram downloades direkte som PDF. Flere filer giver et ZIP-arkiv med navnet `vsd-to-pdf.zip`. + +## Indstillinger + +Ingen konfiguration er nødvendig. Konverteren respekterer den oprindelige sidestørrelse og orientering fra Visio-dokumentet. + +## Anvendelsesområder + +- Gennemgang af Visio-diagrammer fra en kollega, når du ikke har en Visio-licens +- Indsættelse af netværks- eller arkitekturdiagrammer i projektdokumentation som PDF +- Udskrivning af organisationsdiagrammer eller procesforløb som mødemateriale +- Arkivering af ældre VSD-filer fra tidligere Visio-versioner i et fremtidssikret format + +## Tips + +- Visio-dokumenter med flere sider giver PDF-filer med flere sider, hvor hver Visio-side svarer til en PDF-side. +- VSDX-filer (det moderne XML-baserede format) konverteres generelt med højere troværdighed end ældre binære VSD-filer. +- LibreOffice-motoren indlæses én gang pr. session. Forvent en kort ventetid ved den første konvertering og hurtigere resultater for efterfølgende filer. + +## Relaterede værktøjer + +- [ODG til PDF](./odg-to-pdf) +- [PUB til PDF](./pub-to-pdf) +- [PSD til PDF](./psd-to-pdf) diff --git a/docs/da/tools/webp-to-pdf.md b/docs/da/tools/webp-to-pdf.md new file mode 100644 index 00000000..fe0e2039 --- /dev/null +++ b/docs/da/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP til PDF +description: Konvertér WebP-billeder til PDF direkte i din browser med justerbar komprimeringskvalitet. +--- + +# WebP til PDF + +Konvertér Googles WebP-billedformat til PDF. Det er især nyttigt, når du har downloadet billeder fra nettet i WebP-format og har brug for dem i et mere udbredt format til udskrivning eller deling. + +## Understøttede formater + +| Format | Filtypenavne | +| :----- | :----------- | +| WebP | `.webp` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine WebP-filer. +2. Gennemgå fillisten, og fjern de filer, du ikke har brug for. +3. Vælg et niveau for **PDF-kvalitet**. +4. Klik på **Konverter til PDF**. Resultatet downloades som `from_webps.pdf`. + +Internt afkodes hvert WebP-billede via browserens canvas-API og indlejres derefter i PDF-filen med pdf-lib. Det betyder, at konverteringen virker i enhver browser, der understøtter WebP-afkodning (alle moderne browsere gør). + +## Indstillinger + +**PDF-kvalitet** styrer komprimeringen, når billeder indlejres: + +- **Høj kvalitet**: bevarer flest detaljer. +- **Mellem kvalitet** (standard): afbalanceret resultat. +- **Lav kvalitet**: mindste filstørrelse. + +## Anvendelsesområder + +- Konvertering af webdownloadede billeder gemt som WebP til en udskrivbar PDF +- Samling af WebP-skærmbilleder fra Chrome eller Edge i dokumentation +- Oprettelse af en PDF-portefølje af billeder eksporteret fra designværktøjer, der som standard bruger WebP +- Arkivering af WebP-billeder i et mere udbredt læsbart format + +## Tips + +- WebP afkodes internt til PNG, før det indlejres i PDF-filen, så tabsfrie WebP-billeder bevarer deres kvalitet på indstillingen High. +- Hvis du har en blanding af WebP og andre billedformater, så brug værktøjet [Billeder til PDF](./image-to-pdf) i stedet: det accepterer alt på én gang. + +## Relaterede værktøjer + +- [Billeder til PDF](./image-to-pdf) +- [PNG til PDF](./png-to-pdf) +- [JPG til PDF](./jpg-to-pdf) diff --git a/docs/da/tools/word-to-pdf.md b/docs/da/tools/word-to-pdf.md new file mode 100644 index 00000000..57258690 --- /dev/null +++ b/docs/da/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word til PDF +description: Konvertér Word-dokumenter (DOC, DOCX), ODT- og RTF-filer til PDF i din browser med fuld bevarelse af formatering. +--- + +# Word til PDF + +Konvertér Microsoft Word-dokumenter og kompatible formater til PDF. Værktøjet bruger en browserbaseret LibreOffice-motor, der håndterer DOC-, DOCX-, ODT- og RTF-filer og bevarer formatering, tabeller, billeder, sidehoveder, sidefødder og typografier i resultatet. + +## Understøttede formater + +| Format | Filtypenavne | +| :---------------- | :----------- | +| Word (moderne) | `.docx` | +| Word (ældre) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine Word-dokumenter. Du kan vælge flere filer på én gang. +2. Gennemgå og administrér fillisten. +3. Klik på **Konverter til PDF**. LibreOffice-motoren indlæses ved første brug (en statusindikator viser initialiseringen), og derefter konverteres hver fil. +4. En enkelt fil downloades direkte som PDF. Flere filer pakkes i `word-converted.zip`. + +## Indstillinger + +Dette værktøj har ingen yderligere indstillinger. LibreOffice-motoren producerer resultatet med sin standardprofil for PDF-eksport. + +## Resultat + +| Antal filer | Resultat | +| :---------- | :----------------------------------------------------------------- | +| 1 fil | Enkelt PDF-download (oprindeligt filnavn med filtypenavnet `.pdf`) | +| 2+ filer | ZIP-arkiv (`word-converted.zip`) med én PDF pr. fil | + +## Anvendelsesområder + +- Konvertering af et CV eller en ansøgning fra DOCX til PDF, før du sender en jobansøgning +- Batchkonvertering af en række kontrakter eller tilbud til PDF til levering til en kunde +- Omdannelse af ældre `.doc`-filer til moderne PDF-filer til langtidsarkivering +- Konvertering af samarbejdsdokumenter fra Google Docs (eksporteret som DOCX) til PDF +- Fremstilling af udskriftsklare PDF-filer fra Word-skabeloner, der bruges til automatisk dokumentgenerering + +## Tips + +- LibreOffice-motoren downloades én gang pr. session og caches. Forvent et par sekunders indlæsningstid ved den første konvertering, mens efterfølgende konverteringer er meget hurtigere. +- Kompleks formatering (makroer, ActiveX-kontroller, avanceret SmartArt) konverteres måske ikke perfekt. Almindelige dokumentelementer som tekst, tabeller, billeder, sidehoveder og fodnoter konverteres pålideligt. +- Da dette værktøj også accepterer ODT og RTF, kan du bruge det som en samlet konverter til alle tekstbehandlingsformater. + +## Relaterede værktøjer + +- [ODT til PDF](./odt-to-pdf) +- [RTF til PDF](./rtf-to-pdf) +- [Excel til PDF](./excel-to-pdf) +- [PowerPoint til PDF](./powerpoint-to-pdf) diff --git a/docs/da/tools/wpd-to-pdf.md b/docs/da/tools/wpd-to-pdf.md new file mode 100644 index 00000000..e6a802bd --- /dev/null +++ b/docs/da/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD til PDF +description: Konvertér WordPerfect-dokumenter (WPD) til PDF i din browser med LibreOffice. Gratis og privat. +--- + +# WPD til PDF + +Konvertér Corel WordPerfect-dokumenter til PDF-filer. WPD var engang det dominerende tekstbehandlingsformat på advokatkontorer og i offentlige myndigheder. Hvis du har gamle WordPerfect-filer, som moderne software nægter at åbne, genopliver dette værktøj dem som almindelige PDF-filer. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :---------- | :---------- | :-------------------------------- | +| WordPerfect | `.wpd` | Alle større WordPerfect-versioner | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine WPD-filer. Du kan vælge flere filer på én gang. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurvsikonet, eller brug **Tilføj flere filer** for at tilføje flere dokumenter. +3. Klik på **Konverter til PDF**. Værktøjet indlæser en LibreOffice-baseret konverteringsmotor i din browser, som parser WPD-formatet og udskriver PDF. +4. En enkelt fil downloades direkte som PDF. Batchkonverteringer giver et ZIP-arkiv med navnet `wpd-to-pdf.zip`. + +## Indstillinger + +Ingen konfiguration er nødvendig. LibreOffice-motoren håndterer WPD-formatering, skrifttyper og layout automatisk. + +## Anvendelsesområder + +- Åbning af årtier gamle juridiske dokumenter skrevet i WordPerfect +- Konvertering af arkiverede offentlige indberetninger fra WPD til et moderne format +- Migrering af et ældre WordPerfect-dokumentbibliotek til PDF til langtidslagring +- Deling af WPD-filer med modtagere, der ikke har Corel WordPerfect installeret + +## Tips + +- LibreOffice-motoren indlæses ved første brug, hvilket tager et øjeblik. Efterfølgende konverteringer i samme session er hurtigere. +- Komplekse WPD-makroer og reveal codes bevares ikke, men det visuelle layout, tekstindholdet og den grundlæggende formatering overføres til PDF. + +## Relaterede værktøjer + +- [WPS til PDF](./wps-to-pdf) +- [ODG til PDF](./odg-to-pdf) diff --git a/docs/da/tools/wps-to-pdf.md b/docs/da/tools/wps-to-pdf.md new file mode 100644 index 00000000..c3ec61ea --- /dev/null +++ b/docs/da/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS til PDF +description: Konvertér Microsoft Works-dokumenter (WPS) til PDF i din browser. Gratis, ingen tilmelding, fuldt privat. +--- + +# WPS til PDF + +Konvertér Microsoft Works-tekstbehandlingsfiler til PDF. Microsoft Works fulgte med forbrugercomputere gennem hele slutningen af 1990'erne og 2000'erne, og mange WPS-filer ligger stadig på gamle harddiske og i e-mailarkiver. Dette værktøj åbner dem i browseren og producerer rene PDF-filer. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :-------------- | :---------- | :---------------------------------------- | +| Microsoft Works | `.wps` | Tekstbehandlingsfiler fra Microsoft Works | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine WPS-filer. Flere filer accepteres. +2. Gennemgå fillisten. Brug papirkurvsikonet til at fjerne enkelte filer, eller klik på **Tilføj flere filer** for at udvide din batch. +3. Klik på **Konverter til PDF**. En LibreOffice-baseret motor indlæses i browseren og konverterer hvert WPS-dokument til PDF. +4. Én fil downloades direkte som PDF. Flere filer samles i et ZIP-arkiv med navnet `wps-to-pdf.zip`. + +## Indstillinger + +Ingen yderligere indstillinger er nødvendige. Konverteren håndterer tekst, grundlæggende formatering og indlejrede billeder fra WPS-filen. + +## Anvendelsesområder + +- Gendannelse af gamle skole- eller arbejdsdokumenter gemt i Microsoft Works-format +- Åbning af WPS-vedhæftninger i e-mails, når du ikke har Microsoft Works installeret +- Konvertering af et arkiv med WPS-filer til migrering til et moderne dokumentsystem +- Udskrivning af ældre dokumenter, som nuværende tekstbehandlingsprogrammer ikke kan åbne + +## Tips + +- Forveksl ikke Microsoft Works-filer med `.wps`-filtypenavnet fra WPS Office. Dette værktøj er specifikt til det ældre Microsoft Works-format. +- LibreOffice-motoren tager et øjeblik at indlæse ved første brug. Når den er indlæst, kører yderligere konverteringer i samme session hurtigere. + +## Relaterede værktøjer + +- [WPD til PDF](./wpd-to-pdf) +- [PUB til PDF](./pub-to-pdf) diff --git a/docs/da/tools/xml-to-pdf.md b/docs/da/tools/xml-to-pdf.md new file mode 100644 index 00000000..58d07a02 --- /dev/null +++ b/docs/da/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML til PDF +description: Konvertér XML-filer til strukturerede PDF-dokumenter i din browser. Gratis, privat, ingen serverbehandling. +--- + +# XML til PDF + +Konvertér XML-datafiler til læsbare, strukturerede PDF-dokumenter. Rå XML er kraftfuldt, men svært at læse for mennesker. Dette værktøj parser XML-træet, genkender gentagne datastrukturer og gengiver dem som formaterede tabeller og sektioner i en A4-PDF i liggende format. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----- | :---------- | :----------------------------- | +| XML | `.xml` | Ethvert velformet XML-dokument | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine XML-filer. Flere filer kan behandles i en enkelt batch. +2. Gennemgå fillisten. Fjern uønskede filer med papirkurvsikonet, eller klik på **Tilføj flere filer** for at tilføje flere. +3. Klik på **Konverter til PDF**. Værktøjet parser XML-strukturen med browserens indbyggede DOMParser, analyserer datahierarkiet og gengiver det til en PDF med jsPDF og auto-table-formatering. +4. En enkelt fil downloades som PDF. Flere konverteringer pakkes i `xml-to-pdf.zip`. + +## Indstillinger + +Ingen manuel konfiguration er nødvendig. Konverteren registrerer automatisk XML-strukturen og vælger passende tabellayouts. Resultatet bruger A4 i liggende format for at give plads til brede datasæt. + +## Anvendelsesområder + +- Omdannelse af XML-dataeksporter fra databaser eller API'er til udskrivbare rapporter +- Oprettelse af læsbare oversigter ud fra XML-konfigurationsfiler +- Konvertering af XML-baserede fakturaer eller transaktionslogge til PDF til arkivering +- Gør XML-sitemaps eller RSS-feeds læsbare i dokumentform + +## Tips + +- XML skal være velformet. Hvis parseren støder på syntaksfejl, mislykkes konverteringen med en beskrivende fejlmeddelelse, der peger på problemet. +- Dybt indlejrede XML-strukturer flades ud til tabeller. For bedste resultat bør dataene have gentagne søskendeelementer med ensartede underelementer. +- Statusopdateringer vises under konverteringen og viser hver fase: læsning, parsing, analyse og gengivelse. + +## Relaterede værktøjer + +- [FB2 til PDF](./fb2-to-pdf) +- [XPS til PDF](./xps-to-pdf) +- [E-mail til PDF](./email-to-pdf) diff --git a/docs/da/tools/xps-to-pdf.md b/docs/da/tools/xps-to-pdf.md new file mode 100644 index 00000000..79409616 --- /dev/null +++ b/docs/da/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS til PDF +description: Konvertér XPS- og OXPS-dokumenter til PDF i din browser. Ingen upload, ingen tilmelding, fuldt privat. +--- + +# XPS til PDF + +Konvertér Microsoft XPS- og OXPS-dokumenter til almindelige PDF-filer. XPS (XML Paper Specification) var Microsofts svar på PDF, men understøttelsen er faldet på tværs af platforme. Dette værktøj gør de dokumenter universelt læsbare igen. + +## Understøttede formater + +| Format | Filtypenavn | Noter | +| :----- | :---------- | :----------------------------------- | +| XPS | `.xps` | Oprindeligt Microsoft XPS-format | +| OXPS | `.oxps` | Open XPS, ECMA-388-standardvarianten | + +## Sådan fungerer det + +1. Klik på uploadområdet, eller træk og slip dine XPS/OXPS-filer. Du kan vælge flere filer på én gang. +2. Gennemgå fillisten. Fjern enkelte filer med papirkurvsikonet, eller klik på **Tilføj flere filer** for at tilføje flere dokumenter. +3. Klik på **Konverter til PDF**. PyMuPDF-motoren behandler hvert dokument lokalt i din browser. +4. En enkelt fil downloades direkte som PDF. Flere filer samles i et ZIP-arkiv med navnet `xps-converted.zip`. + +## Indstillinger + +Dette værktøj udfører en direkte formatkonvertering uden yderligere konfiguration. Resultatet bevarer de oprindelige sidemål, vektorgrafik, skrifttyper og billeder fra XPS-kilden. + +## Anvendelsesområder + +- Åbning af XPS-filer modtaget fra ældre Windows-systemer, der som standard brugte XPS-printerdriveren +- Konvertering af OXPS-dokumenter fra Windows 10/11 til deling med macOS- eller Linux-brugere +- Arkivering af ældre XPS-filer i et mere udbredt format +- Gør XPS-baserede offentlige eller virksomhedsdokumenter tilgængelige for eksterne modtagere + +## Tips + +- Både filtypenavnene `.xps` og `.oxps` håndteres automatisk, så du kan blande dem i samme batch. +- Hvis den oprindelige XPS-fil blev oprettet med en printerdriver i høj opløsning, bevarer den resulterende PDF den kvalitet. Der sker ingen resampling. + +## Relaterede værktøjer + +- [Word til PDF](./word-to-pdf) +- [XML til PDF](./xml-to-pdf) diff --git a/docs/de/contributing.md b/docs/de/contributing.md new file mode 100644 index 00000000..42f1d366 --- /dev/null +++ b/docs/de/contributing.md @@ -0,0 +1,136 @@ +# Mitwirken + +Danke für Ihr Interesse, zu BentoPDF beizutragen! Diese Anleitung hilft Ihnen beim Einstieg. + +## Erste Schritte + +### Voraussetzungen + +- Node.js 18+ +- npm 9+ +- Git + +### Einrichtung + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Projektstruktur + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Ein neues Werkzeug hinzufügen + +### Schritt 1: Die Logikdatei erstellen + +Erstellen Sie `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Schritt 2: Die HTML-Seite erstellen + +Erstellen Sie `src/pages/your-tool.html` nach dem Vorbild der bestehenden Werkzeugvorlagen. + +### Schritt 3: Das Werkzeug registrieren + +Fügen Sie in `src/js/config/tools.ts` Folgendes hinzu: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Schritt 4: Zur Build-Konfiguration hinzufügen + +Fügen Sie die Seite in `vite.config.ts` hinzu: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Schritt 5: Übersetzungen hinzufügen + +Fügen Sie Einträge in allen Sprachdateien unter `public/locales/` hinzu: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Code-Stil + +- Verwenden Sie TypeScript für allen neuen Code +- Halten Sie sich zugunsten der Einheitlichkeit an bestehende Muster +- Führen Sie vor dem Commit `npm run format` aus +- Keine Kommentare im Produktionscode (Kommentare werden beim Build entfernt) + +## Pull-Request-Ablauf + +1. Erstellen Sie einen Feature-Branch: `git checkout -b feature/your-feature` +2. Nehmen Sie Ihre Änderungen vor +3. Testen Sie gründlich: `npm run build` +4. Reichen Sie einen PR mit einer klaren Beschreibung ein + +## Übersetzung + +In [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) erfahren Sie, wie Sie neue Sprachen hinzufügen. + +## Contributor License Agreement + +Bevor Ihr PR gemergt werden kann, müssen Sie unsere CLA unterzeichnen: + +- [Individual CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Corporate CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Hilfe erhalten + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord-Community](https://discord.gg/Bgq3Ay3f2w) + +## Lizenz + +BentoPDF ist dual lizenziert: + +- **AGPL-3.0** für Open-Source-Projekte, bei denen Sie Ihren gesamten Quellcode öffentlich teilen +- **Kommerzielle Lizenz** für proprietäre Anwendungen mit geschlossenem Quellcode: [Lifetime-Lizenz für 79 $ erwerben](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Mit Ihrem Beitrag erklären Sie sich damit einverstanden, dass er unter diesen Bedingungen lizenziert wird. diff --git a/docs/de/getting-started.md b/docs/de/getting-started.md new file mode 100644 index 00000000..168918c5 --- /dev/null +++ b/docs/de/getting-started.md @@ -0,0 +1,80 @@ +# Erste Schritte + +Willkommen bei BentoPDF! Diese Anleitung hilft Ihnen, schnell loszulegen. + +## Was ist BentoPDF? + +BentoPDF ist ein kostenloses, quelloffenes PDF-Toolkit mit Fokus auf Privatsphäre, das **komplett in Ihrem Browser** läuft. Ihre Dateien verlassen nie Ihr Gerät: Die gesamte Verarbeitung erfolgt lokal mit WebAssembly (WASM). + +## Schnellstart + +### Option 1: Die gehostete Version nutzen + +Besuchen Sie [bentopdf.com](https://www.bentopdf.com), um BentoPDF sofort zu nutzen, ganz ohne Installation. + +### Option 2: Selbst hosten mit Docker + +> [!IMPORTANT] +> Die Konvertierung von Office-Dateien benötigt `SharedArrayBuffer`. Dafür sind beide folgenden Header sowie ein sicherer Kontext erforderlich: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - ein sicherer Kontext +> +> `http://localhost` funktioniert für lokale Tests, weil Browser Loopback als vertrauenswürdig behandeln. `http://192.168.x.x` oder andere LAN-IPs gelten meist nicht als vertrauenswürdig, daher erfordern Word-/Excel-/PowerPoint-Konvertierungen HTTPS, wenn Sie von anderen Geräten in Ihrem Netzwerk darauf zugreifen. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF gibt es in zwei Builds: dem **Self-Hosted-Build** (`bentopdf-simple`, oben verwendet) für interne Bereitstellungen in Teams und Organisationen und dem **Commercial-Build** (`bentopdf:latest`), den bentopdf.com selbst und Inhaber kommerzieller Lizenzen für öffentlich zugängliche Bereitstellungen nutzen. Beide enthalten dieselben PDF-Werkzeuge. Der Commercial-Build ergänzt den Hero-Bereich, die FAQ, Testimonials und den Footer von bentopdf.com. Im Zweifel nehmen Sie den Self-Hosted-Build. + +Öffnen Sie danach `http://localhost:3000` in Ihrem Browser. + +> [!NOTE] +> Wenn Sie eine OCR-Bereitstellung in einer Air-Gap-Umgebung vorbereiten, müssen Sie zusätzlich zum Tesseract-Worker, zur Core-Runtime und zu den traineddata-Dateien auch die OCR-Textebenen-Schriften intern hosten. Die vollständige Einrichtung ist unter [Self-Hosting](/de/self-hosting/) dokumentiert, einschließlich `VITE_OCR_FONT_BASE_URL` und des mitgelieferten Verzeichnisses `ocr-fonts/`. + +### Option 3: Aus dem Quellcode bauen + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funktionen im Überblick + +| Kategorie | Werkzeuge | +| --------------------------- | -------------------------------------------------------------------------- | +| **In PDF konvertieren** | Word, Excel, PowerPoint, Bilder, Markdown, EPUB, MOBI und mehr | +| **Aus PDF konvertieren** | JPG, PNG, Text, Excel, SVG und mehr | +| **Bearbeiten & Annotieren** | Signieren, Hervorheben, Schwärzen, Formulare ausfüllen, Stempel hinzufügen | +| **Organisieren** | Zusammenführen, Teilen, Drehen, Seiten löschen, Neu anordnen | +| **Optimieren** | Komprimieren, Reparieren, Verflachen, OCR | +| **Sicherheit** | Verschlüsseln, Entschlüsseln, Beschränkungen entfernen | + +## Browser-Unterstützung + +BentoPDF funktioniert am besten mit modernen Browsern: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Nächste Schritte + +- [Alle Werkzeuge entdecken](/de/tools/) +- [BentoPDF selbst hosten](/de/self-hosting/) +- [Zum Projekt beitragen](/de/contributing) diff --git a/docs/de/index.md b/docs/de/index.md new file mode 100644 index 00000000..c9c3776b --- /dev/null +++ b/docs/de/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Kostenlose Open-Source-PDF-Werkzeuge' + tagline: Verarbeiten Sie PDFs komplett in Ihrem Browser. Keine Uploads. Keine Server. Vollständige Privatsphäre. + actions: + - theme: brand + text: Loslegen + link: /de/getting-started + - theme: alt + text: Werkzeuge ansehen + link: /de/tools/ + - theme: alt + text: Selbst hosten + link: /de/self-hosting/ + - theme: alt + text: Kommerzielle Lizenz + link: /de/licensing + +features: + - icon: 🔒 + title: 100% privat + details: Ihre Dateien verlassen nie Ihr Gerät. Die gesamte Verarbeitung erfolgt lokal in Ihrem Browser mit WebAssembly. + - icon: ⚡ + title: Schnell & kostenlos + details: Keine Anmeldung, keine Limits, keine Wasserzeichen. Verarbeiten Sie unbegrenzt viele PDFs, für immer kostenlos. + - icon: 🛠️ + title: 50+ Werkzeuge + details: Konvertieren, bearbeiten, zusammenführen, teilen, komprimieren, signieren, OCR und mehr. Alles, was Sie brauchen, an einem Ort. + + - icon: 🌐 + title: Selbst hostbar + details: Betreiben Sie es auf Ihrer eigenen Infrastruktur. Docker, Vercel, Netlify, AWS oder vollständig abgeschottete Umgebungen mit selbst gehosteten OCR-Workern, Sprachdaten und Textebenen-Schriften. +--- + +## Offline-OCR + +Wenn Sie BentoPDF in einer abgeschotteten oder Offline-Umgebung selbst hosten, braucht OCR mehr als den Tesseract-Worker und die traineddata-Dateien. Für durchsuchbare PDF-Ausgaben müssen außerdem die OCR-Textebenen-Schriften intern bereitgestellt werden. +Die vollständige Einrichtung, einschließlich `VITE_OCR_FONT_BASE_URL`, des mitgelieferten Verzeichnisses `ocr-fonts/` und des aktualisierten Air-Gap-Workflows, finden Sie unter [Self-Hosting](/de/self-hosting/). diff --git a/docs/de/licensing.md b/docs/de/licensing.md new file mode 100644 index 00000000..4a415e24 --- /dev/null +++ b/docs/de/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/de/self-hosting/#wasm-konfiguration-agpl-komponenten) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/de/self-hosting/apache.md b/docs/de/self-hosting/apache.md new file mode 100644 index 00000000..a8633426 --- /dev/null +++ b/docs/de/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Mit Apache bereitstellen + +Hosten Sie BentoPDF mit dem Apache HTTP Server. + +## Voraussetzungen + +- Apache 2.4+ +- mod_rewrite aktiviert +- SSL-Zertifikat (empfohlen) + +## Schritt 1: Projekt bauen + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Um das Branding anzupassen, setzen Sie vor dem Build Umgebungsvariablen: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Schritt 2: Dateien kopieren + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Schritt 3: Apache-Konfiguration + +Erstellen Sie `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Schritt 4: .htaccess für das Routing + +Erstellen Sie `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Schritt 5: Erforderliche Module aktivieren + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Schritt 6: Die Site aktivieren + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Bereitstellung in einem Unterverzeichnis + +So hosten Sie unter `/pdf/`: + +1. Mit Basis-URL bauen: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. `.htaccess` anpassen: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Fehlerbehebung + +### WASM-404-Fehler + +Stellen Sie sicher, dass der MIME-Typ konfiguriert ist: + +```apache +AddType application/wasm .wasm +``` + +### Signieren oder Formularausfüllung zeigt einen leeren Viewer (`.mjs`-MIME-Fehler) + +Wenn die Browserkonsole Folgendes anzeigt: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...und die fehlgeschlagene Anfrage auf `.mjs` endet, fehlt in Ihrer Apache-Konfiguration die Zuordnung `.mjs → application/javascript`. Der mitgelieferte PDF-Viewer enthält ES-Moduldateien mit der Endung `.mjs`, die in der Standard-`mime.types` von Apache nicht enthalten sind. + +Fügen Sie Folgendes zu Ihrem VirtualHost oder Ihrer `.htaccess` hinzu: + +```apache +AddType application/javascript .mjs +``` + +Laden Sie Apache anschließend neu: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Zur Kontrolle: Suchen Sie in den Browser-DevTools im Tab Netzwerk die fehlgeschlagene `.mjs`-Anfrage und prüfen Sie den Antwort-Header `Content-Type`. Er sollte jetzt `application/javascript` lauten, nicht `application/octet-stream`. + +### Rewrite funktioniert nicht + +Prüfen Sie, ob mod_rewrite aktiviert ist: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel zu PDF funktioniert nicht + +LibreOffice WASM benötigt `SharedArrayBuffer`, wofür diese Header erforderlich sind: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Außerdem ist ein sicherer Kontext nötig. `http://localhost` funktioniert für lokale Tests, aber `http://192.168.x.x` oder andere LAN-IPs erfordern meist HTTPS. Sind die Header vorhanden und `window.crossOriginIsolated` ist trotzdem `false`, prüfen Sie, ob die Seite über einfaches HTTP von einem Nicht-Loopback-Origin aus geöffnet wird. + +Die vorkomprimierten Dateien `.wasm.gz` und `.data.gz` brauchen außerdem das richtige `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Stellen Sie sicher, dass `mod_headers` aktiviert ist: `sudo a2enmod headers` + +### Zugriff verweigert + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/de/self-hosting/aws.md b/docs/de/self-hosting/aws.md new file mode 100644 index 00000000..61bcfc75 --- /dev/null +++ b/docs/de/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Auf AWS S3 + CloudFront bereitstellen + +Hosten Sie BentoPDF auf AWS für maximale Kontrolle und Skalierbarkeit. + +## Architektur + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Schritt 1: S3-Bucket erstellen + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Schritt 2: Bauen und hochladen + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Schritt 3: CloudFront-Distribution erstellen + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Oder nutzen Sie die AWS-Konsole: + +1. Gehen Sie zu CloudFront → Create distribution +2. Origin domain: Wählen Sie Ihren S3-Bucket aus +3. Aktivieren Sie "Origin Access Control" +4. Default root object: `index.html` +5. Erstellen Sie die Distribution + +## Schritt 3b: Response Headers Policy (erforderlich für LibreOffice WASM) + +LibreOffice-basierte Konvertierungen (Word, Excel, PowerPoint zu PDF) benötigen `SharedArrayBuffer`, wofür bestimmte Response-Header nötig sind. Erstellen Sie eine CloudFront Response Headers Policy: + +1. Gehen Sie zu CloudFront → Policies → Response headers +2. Erstellen Sie eine eigene Policy mit diesen Headern: + +| Header | Wert | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Weisen Sie die Policy dem Default Cache Behavior Ihrer Distribution zu + +Oder per CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Schritt 3c: S3-Metadaten für vorkomprimierte WASM-Dateien + +Die LibreOffice-WASM-Dateien sind vorkomprimiert (`.wasm.gz`, `.data.gz`). Setzen Sie den richtigen Content-Type und das richtige Content-Encoding, damit Browser sie entpacken: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Wichtig +Ohne die Response Headers Policy ist `SharedArrayBuffer` nicht verfügbar, und LibreOffice-WASM-Konvertierungen bleiben bei ca. 55% hängen. Ohne das richtige Content-Encoding für die `.gz`-Dateien erhält der Browser rohe gzip-Bytes, und die WASM-Kompilierung schlägt fehl. +::: + +## Schritt 4: S3-Bucket-Policy + +Erlauben Sie CloudFront den Zugriff auf den Bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Schritt 5: Eigene Fehlerseiten + +Konfigurieren Sie 404 so, dass für das SPA-Routing `index.html` zurückgegeben wird: + +1. CloudFront → Error pages +2. Erstellen Sie eine eigene Fehlerantwort: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Kostenschätzung + +| Ressource | Geschätzte Kosten | +| -------------------------- | ----------------- | +| S3 Storage (~500MB) | ~$0.01/Monat | +| CloudFront (1TB transfer) | ~$85/Monat | +| CloudFront (10GB transfer) | ~$0.85/Monat | + +::: tip +Nutzen Sie S3 Intelligent Tiering zur Kostenoptimierung bei selten abgerufenen Dateien. +::: + +## Automatisierung mit Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/de/self-hosting/cloudflare.md b/docs/de/self-hosting/cloudflare.md new file mode 100644 index 00000000..3501309e --- /dev/null +++ b/docs/de/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Auf Cloudflare Pages bereitstellen + +[Cloudflare Pages](https://pages.cloudflare.com) bietet schnelles, globales Hosting für statische Websites mit unbegrenzter Bandbreite. + +## Schnelle Bereitstellung + +1. Gehen Sie zu [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Klicken Sie auf "Create a project" +3. Verbinden Sie Ihr GitHub-Repository + +## Build-Konfiguration + +| Einstellung | Wert | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Umgebungsvariablen + +Fügen Sie diese unter Settings → Environment variables hinzu: + +| Variable | Wert | +| ----------------------- | -------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (optional) | +| `VITE_BRAND_NAME` | Eigener Markenname (optional) | +| `VITE_BRAND_LOGO` | Logo-Pfad relativ zu `public/` (optional) | +| `VITE_FOOTER_TEXT` | Eigener Footer-/Copyright-Text (optional) | +| `VITE_DEFAULT_LANGUAGE` | Standard-Oberflächensprache, z. B. `fr` (optional) | + +## Konfigurationsdatei + +Erstellen Sie `_headers` in Ihrem Ordner `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Wichtig +Die Header `Cross-Origin-Embedder-Policy` und `Cross-Origin-Opener-Policy` sind für Konvertierungen von Word/ODT/Excel/PowerPoint zu PDF erforderlich. Ohne sie ist `SharedArrayBuffer` nicht verfügbar, und die LibreOffice-WASM-Engine kann nicht initialisiert werden. +::: + +Erstellen Sie `_redirects` für das SPA-Routing: + +``` +/* /index.html 200 +``` + +## Eigene Domain + +1. Öffnen Sie Ihr Pages-Projekt +2. Klicken Sie auf "Custom domains" +3. Fügen Sie Ihre Domain hinzu +4. Cloudflare konfiguriert das DNS automatisch, wenn die Domain bei Cloudflare liegt + +## Vorteile + +- **Kostenlose, unbegrenzte Bandbreite** +- **Globales CDN** mit über 300 Edge-Standorten +- **Automatisches HTTPS** +- **Vorschau-Bereitstellungen** für Pull Requests +- **Schnelle Builds** + +## Fehlerbehebung + +### Upload großer Dateien + +Cloudflare Pages unterstützt Dateien bis 25 MB. WASM-Module sollten kein Problem sein, aber wenn Sie an Grenzen stoßen, sollten Sie Folgendes überlegen: + +```bash +# Split large files during build +npm run build +``` + +### Größenlimits für Worker + +Wenn Sie Cloudflare Workers für erweitertes Routing nutzen, beachten Sie das Limit von 1 MB in kostenlosen Tarifen. + +## CORS-Proxy-Worker (für digitale Signaturen) + +Das Werkzeug für digitale Signaturen benötigt einen CORS-Proxy, um Zertifikatsketten abzurufen. Stellen Sie den mitgelieferten Worker bereit: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Sicherheitsfunktionen + +| Funktion | Beschreibung | +| ---------------------------- | ----------------------------------- | +| **URL-Beschränkungen** | Nur Zertifikat-URLs erlaubt | +| **Dateigrößenlimit** | Max. 10MB pro Anfrage | +| **Ratenbegrenzung** | 60 Anfr./IP/Min. (erfordert KV) | +| **Blockierung privater IPs** | Blockiert localhost und interne IPs | + +### Ratenbegrenzung aktivieren + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Mit Proxy-URL bauen + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Oder mit Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Hinweis:** Die Einrichtung der HMAC-Signatur finden Sie in der [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required). diff --git a/docs/de/self-hosting/cors-proxy.md b/docs/de/self-hosting/cors-proxy.md new file mode 100644 index 00000000..6d44e963 --- /dev/null +++ b/docs/de/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-Proxy zum Abrufen von Zertifikaten + +Das Werkzeug für digitale Signaturen nutzt einen CORS-Proxy, um Aussteller-Zertifikate von externen Zertifizierungsstellen (CAs) abzurufen. Das ist nötig, weil viele CA-Server keine CORS-Header in ihren Antworten mitsenden, wodurch ein direkter Abruf aus dem Browser verhindert wird. + +Außerdem liefern viele CA-Server Zertifikate über einfaches HTTP aus. Wird Ihre BentoPDF-Instanz über HTTPS gehostet, blockieren Browser diese HTTP-Anfragen (Mixed-Content-Richtlinie). Der CORS-Proxy löst beide Probleme, indem er Anfragen über einen HTTPS-Endpunkt mit den passenden Headern leitet. + +## So funktioniert es + +Beim Signieren einer PDF mit einem Zertifikat: + +1. Die Bibliothek `zgapdfsigner` versucht, eine vollständige Zertifikatskette aufzubauen +2. Sie ruft Aussteller-Zertifikate von URLs ab, die in der AIA-Erweiterung (Authority Information Access) Ihres Zertifikats eingebettet sind +3. Diese Anfragen laufen über einen CORS-Proxy, der die nötigen `Access-Control-Allow-Origin`-Header ergänzt +4. Der Proxy liefert die Zertifikatsdaten an den Browser zurück + +## Den CORS-Proxy selbst hosten + +Wenn Sie BentoPDF selbst hosten, müssen Sie einen eigenen CORS-Proxy bereitstellen, damit digitale Signaturen mit Zertifikaten funktionieren, die einen Abruf der Kette erfordern. + +### Option 1: Cloudflare Workers (empfohlen) + +1. **Wrangler CLI installieren**: + + ```bash + npm install -g wrangler + ``` + +2. **Bei Cloudflare anmelden**: + + ```bash + wrangler login + ``` + +3. **BentoPDF klonen und erlaubte Origins anpassen**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Öffnen Sie `cors-proxy-worker.js` und änderen Sie das Array `ALLOWED_ORIGINS` auf Ihre Domain: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Wichtig + Ohne diese Änderung lehnt der Proxy alle Anfragen von Ihrer Website mit dem Fehler **403 Forbidden** ab. Standardmäßig sind nur Anfragen von `bentopdf.com` erlaubt. + ::: + +4. **Den Proxy bereitstellen**: + + ```bash + wrangler deploy + ``` + + Notieren Sie sich die URL Ihres Workers (z. B. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **BentoPDF mit der Proxy-URL neu bauen**: + + Bei Verwendung von Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Beim Bauen aus dem Quellcode: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Option 2: Eigener Backend-Proxy + +Sie können auch einen eigenen Proxy-Endpunkt erstellen. Die Anforderungen sind: + +1. GET-Anfragen mit einem Query-Parameter `url` annehmen +2. Die URL von Ihrem Server aus abrufen (serverseitig gibt es keine CORS-Beschränkungen) +3. Die Antwort mit diesen Headern zurückgeben: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Beispielimplementierung mit Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Sicherheitshinweise + +Der mitgelieferte Cloudflare Worker hat mehrere Sicherheitsmaßnahmen: + +| Funktion | Beschreibung | +| ---------------------------- | ----------------------------------------------------------------------------------------------- | +| **Origin-Prüfung** | Erlaubt nur Anfragen von Domains aus `ALLOWED_ORIGINS` | +| **URL-Beschränkungen** | Erlaubt nur Zertifikat-URLs (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blockierung privater IPs** | Blockiert private IPv4-/IPv6-Bereiche, Link-Local, Loopback, dezimale IPs und Cloud-Metadaten | +| **Content-Type-Sicherheit** | Liefert nur sicheren Sie Zertifikat-MIME-Typen, blockiert Content-Type-Injection vom Upstream | +| **Dateigrößenlimit** | Streamt die Antwort mit 10MB-Limit und bricht den Download bei Überschreitung ab | +| **Ratenbegrenzung** | 60 Anfragen pro Minute pro IP oder IPv6 /64 (erfordert KV, bei KV-Fehlern wird nicht blockiert) | +| **HMAC-Signaturen** | Optionale clientseitige Signierung (schreckt gelegentlichen Missbrauch ab) | + +### DNS-Rebinding (Selbst-Hosting außerhalb von Cloudflare) + +Der Worker lehnt jede URL ab, die auf eine private oder interne IP aufgelöst wird. Eine feste Allowlist von Hosts ist nicht möglich, da Zertifikatsketten-URLs auf die jeweilige CA verweisen, die das Zertifikat ausgestellt hat (FNMT, Unternehmens-CAs usw.), die Ziele also nicht im Voraus bekannt sind. Dadurch bleibt ein kleines Rebinding-Fenster: Wer das DNS für seine eigene Domain betreibt, könnte der Sicherheitsprüfung eine öffentliche IP liefern und der eigentlichen Anfrage einen Moment später eine private. + +Auf Cloudflare ist das nicht ausnutzbar: Workers können weder private IPs noch den Metadaten-Endpunkt `169.254.169.254` erreichen, ein Rebind läuft also ins Leere. Geben Sie dem Worker nur keinen Zugang: Hängen Sie keinen Tunnel, Service oder kein Private-Network-Binding an (er braucht nur `RATE_LIMIT_KV`). + +Betreiben Sie ihn außerhalb von Cloudflare (workerd, Node und Ähnliches) in einer VPC, _kann_ die Runtime interne IPs erreichen. Setzen Sie eine Egress-Firewall davor und blockieren Sie die privaten Bereiche: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` sowie die IPv6-Entsprechungen. Anwendungscode kann das außerhalb von Cloudflare nicht durchsetzen. + +## Den Proxy deaktivieren + +Wenn Sie keinen CORS-Proxy nutzen möchten, setzen Sie die Umgebungsvariable auf einen leeren String: + +``` +VITE_CORS_PROXY_URL= +``` + +**Hinweis**: Ohne den Proxy schlägt das Signieren mit Zertifikaten, die einen externen Abruf der Kette erfordern (wie FNMT oder einige Unternehmens-CAs), mit dem Fehler "Failed to fetch" fehl. + +## Fehlerbehebung + +### "Signing error: TypeError: Failed to fetch" + +Das bedeutet meist eines von beidem: + +1. **Kein CORS-Proxy konfiguriert**: Setzen Sie `VITE_CORS_PROXY_URL` und bauen Sie neu +2. **Mixed Content blockiert**: Ihre Website nutzt HTTPS, aber die Aussteller-URL des Zertifikats ist HTTP. Der CORS-Proxy löst das. +3. **CORS-Proxy lehnt Ihren Origin ab**: Prüfen Sie, ob Ihre Domain im Array `ALLOWED_ORIGINS` in `cors-proxy-worker.js` steht + +### "403 Forbidden" vom Proxy + +Ihre Domain steht nicht in der Liste `ALLOWED_ORIGINS`. Bearbeiten Sie `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Stellen Sie danach erneut bereit: `npx wrangler deploy` + +### Den Proxy testen + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Zertifikate, die ohne Proxy funktionieren + +Manche Zertifikate enthalten die vollständige Kette in der P12/PFX-Datei und benötigen keinen externen Abruf: + +- Selbstsignierte Zertifikate +- Einige kommerzielle CAs, die Zwischenzertifikate mitliefern +- Zertifikate, die Sie manuell mit der vollständigen Kette zusammengestellt haben diff --git a/docs/de/self-hosting/docker.md b/docs/de/self-hosting/docker.md new file mode 100644 index 00000000..fd9ce97b --- /dev/null +++ b/docs/de/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Mit Docker / Podman bereitstellen + +Der einfachste Weg, BentoPDF in einer Produktionsumgebung selbst zu hosten. + +> [!IMPORTANT] +> **Erforderliche Header für die Konvertierung von Office-Dateien** +> +> LibreOffice-basierte Werkzeuge (Word-, Excel-, PowerPoint-Konvertierung) benötigen diese HTTP-Header für die `SharedArrayBuffer`-Unterstützung: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Die Seite muss außerdem aus einem sicheren Kontext ausgeliefert werden. `http://localhost` funktioniert für lokale Tests, aber `http://192.168.x.x` oder andere LAN-IPs gelten meist nicht als sicher, daher schlägt die Office-Konvertierung über einfaches HTTP fehl, auch wenn die Header vorhanden sind. +> +> Die offiziellen Container-Images enthalten diese Header. Wenn Sie einen Reverse-Proxy (Traefik, Caddy usw.) verwenden, stellen Sie sicher, dass diese Header erhalten bleiben oder hinzugefügt werden, und nutzen Sie HTTPS für Zugriffe außerhalb von Loopback. + +> [!TIP] +> **Podman-Nutzer:** Alle `docker`-Befehle funktionieren mit Podman, wenn Sie `docker` durch `podman` und `docker-compose` durch `podman-compose` ersetzen. + +## Schnellstart + +> [!TIP] +> BentoPDF gibt es in zwei Builds: +> +> - **Self-Hosted-Build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Jedes PDF-Werkzeug, **ohne** Marketing-Elemente (kein Hero, keine FAQ, keine Testimonials, kein Footer). Nutzen Sie ihn für interne Bereitstellungen in Teams und Organisationen. Er ist **keine** funktionsreduzierte "Lite"-Version. +> - **Commercial-Build**: `ghcr.io/alam00000/bentopdf:latest`. Die vollständige Marketing-Website, die bentopdf.com selbst und Inhaber kommerzieller Lizenzen für öffentlich zugängliche Bereitstellungen nutzen. +> +> Im Zweifel: Nehmen Sie den Self-Hosted-Build. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Erstellen Sie `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Ausführen: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Eigenes Image bauen + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Bauen und ausführen: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Umgebungsvariablen + +| Variable | Beschreibung | Standard | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Baut die Self-Hosted-Variante (blendet die Marketing-Elemente von bentopdf.com aus: Hero, FAQ, Testimonials, Footer). Alle PDF-Werkzeuge bleiben erhalten. | `false` | +| `BASE_URL` | In Unterverzeichnis bereitstellen | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL des PyMuPDF-WASM-Moduls | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL des Ghostscript-WASM-Moduls | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL des CoherentPDF-WASM-Moduls | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL des OCR-Worker-Skripts | _(leer; Standard-CDN von Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Verzeichnis der OCR-Core-Runtime | _(leer; Standard-CDN von Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Verzeichnis der OCR-traineddata | _(leer; Standard-CDN von Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Kommagetrennte OCR-Sprachen, die in der Oberfläche angeboten werden | _(leer; vollständigen Katalog anzeigen)_ | +| `VITE_OCR_FONT_BASE_URL` | Verzeichnis der OCR-Textebenen-Schriften | _(leer; externe Noto-Schrift-URLs)_ | +| `VITE_DEFAULT_LANGUAGE` | Standard UI language | `en` | +| `VITE_BRAND_NAME` | Eigener Markenname | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logo-Pfad relativ zu `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Eigener Footer-/Copyright-Text | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Kommagetrennte Werkzeug-IDs zum Ausblenden | _(leer; alle Werkzeuge aktiviert)_ | +| `DISABLE_GITHUB_STARS` | Überspringt den Abruf der GitHub-Sterne beim Laden der Seite und entfernt `api.github.com` aus der CSP. Simple-Mode-Builds überspringen ihn immer. | `false` | +| `SITE_URL` | Öffentliche URL, die in Canonical-, hreflang- und Sitemap-Links geschrieben wird. Lassen Sie den Standard, sofern Suchmaschinen Ihre Bereitstellung nicht als eigene Website behandeln sollen. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Bei einer eigenen `SITE_URL` wird jede Seite mit `noindex` markiert, damit Ihre Kopie in den Suchergebnissen nicht mit bentopdf.com konkurriert. Mit `true` dürfen Suchmaschinen sie indexieren. | `false` | + +Die WASM-Modul-URLs sind mit CDN-Standardwerten vorkonfiguriert, sodass alle erweiterten Funktionen sofort funktionieren. Überschreiben Sie sie für abgeschottete oder selbst gehostete Bereitstellungen. + +### Suchmaschinen + +Standardmäßig verweist jede Seite Suchmaschinen auf bentopdf.com als Original, sodass Ihre Bereitstellung nicht als Duplikat erscheint. Für eine private oder interne Instanz müssen Sie nichts ändern. + +- **Ihre Instanz komplett aus den Suchergebnissen heraushalten:** Starten Sie den Container mit `-e ROBOTS_NOINDEX=true`. Das erfordert nur einen Neustart, keinen Rebuild. +- **Ihre Instanz als eigene Website in den Suchergebnissen erscheinen lassen:** Bauen Sie mit `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Ohne `ALLOW_INDEXING=true` markiert eine eigene `SITE_URL` jede Seite mit `noindex`. + +### Content-Security-Policy + +Das nginx-Image wird mit einem erzwingenden `Content-Security-Policy`-Header ausgeliefert. Die Direktiven `script-src`, `connect-src` und `font-src` der CSP werden **beim Build** aus den oben genannten `VITE_*`-URL-Variablen **generiert**: Alle Hosts, die Sie per `--build-arg` übergeben, werden automatisch in die Richtlinie aufgenommen. + +Daraus folgt: + +- Wenn Sie `VITE_CORS_PROXY_URL` oder `VITE_WASM_*_URL` beim Build überschreiben, erlaubt die CSP diese Origins automatisch, ohne zusätzliche Konfiguration. +- Für URLs auf `cdn.jsdelivr.net` erlaubt `script-src` nur den exakten versionierten Paketordner, zum Beispiel `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, nicht das gesamte CDN. jsDelivr liefert jedes öffentliche npm-Paket und GitHub-Repository aus, sodass die Freigabe des gesamten Hosts es jedem davon erlauben würde, auf Ihrer Instanz zu laufen. URLs auf allen anderen Hosts werden per Origin erlaubt. +- Wenn Sie eigene WASM-URLs zur _Laufzeit_ über die Seite Erweiterte Einstellungen in der App konfigurieren, stehen diese Origins **nicht** in der CSP, und der Browser blockiert Abrufe dorthin. Das gilt auch für eine andere Version desselben Pakets auf `cdn.jsdelivr.net`, da nur die beim Build festgelegte Version erlaubt ist. Die Konfiguration zur Laufzeit ist für Experimente gedacht; für dauerhafte eigene URLs setzen Sie das passende `VITE_*`-Build-Argument. +- Bei abgeschotteten Bereitstellungen, die alle drei `VITE_WASM_*_URL`-Werte überschreiben, werden auch diese `cdn.jsdelivr.net`-Paketordner aus der CSP entfernt (jeder Standardwert wird ersetzt, nicht ergänzt). Die Tesseract-OCR-Standardwerte auf `cdn.jsdelivr.net` bleiben in der Richtlinie, bis Sie auch die drei `VITE_TESSERACT_*`-Werte setzen. Ebenso ersetzt das Setzen von `VITE_CORS_PROXY_URL` den öffentlichen Standard `bentopdf-cors-proxy.bentopdf.workers.dev`. + +Die CSP enthält `'unsafe-eval'` in `script-src`, weil die LibreOffice-WASM-Runtime (für die Word-/Excel-/PowerPoint-Konvertierung) und die Bildbibliothek wasm-vips (für PDF zu TIFF) internen Dispatch-Code über `new Function()` kompilieren. Ohne es würden diese Werkzeuge nicht mehr funktionieren. Wenn Sie im `SIMPLE_MODE` (ohne LibreOffice) bauen und PDF zu TIFF nicht brauchen, können Sie die generierte `security-headers.conf` manuell bearbeiten und `'unsafe-eval'` für eine strengere Richtlinie entfernen. + +Lassen Sie für OCR die `VITE_TESSERACT_*`-Variablen leer, um die Standard-Online-Ressourcen zu nutzen, oder setzen Sie alle drei zusammen für selbst gehostetes/Offline-OCR. Teilweise Überschreibungen werden abgelehnt, weil Worker, Core-Runtime und traineddata-Verzeichnis zusammenpassen müssen. Für eine vollständig offline erzeugte durchsuchbare PDF setzen Sie zusätzlich `VITE_OCR_FONT_BASE_URL`, damit die OCR-Textebenen-Schriften von Ihrem internen Server statt von den öffentlichen Noto-Schrift-URLs geladen werden. + +`VITE_DEFAULT_LANGUAGE` legt die Oberflächensprache für Erstbesucher fest. Unterstützte Werte: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Nutzer können die Sprache weiterhin wechseln, das ändert nur den Standard. + +Beispiel: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Eigenes Branding + +Ersetzen Sie das Standard-Logo, den Namen und den Footer-Text von BentoPDF durch Ihre eigenen. Legen Sie Ihre Logodatei im Ordner `public/` ab (oder nutzen Sie ein vorhandenes Bild) und übergib die Branding-Variablen beim Build: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Das Branding funktioniert im Vollmodus und im Simple Mode und lässt sich mit allen anderen Build-Optionen kombinieren. + +### Bestimmte Werkzeuge deaktivieren + +Blenden Sie Werkzeuge aus der Oberfläche aus, etwa aus Compliance- oder Sicherheitsgründen. Deaktivierte Werkzeuge werden von der Startseite, aus den Suchergebnissen, den Tastenkürzeln und dem Workflow-Builder entfernt. Beim direkten Aufruf der URL erscheint eine Seite "Werkzeug nicht verfügbar". + +Werkzeug-IDs entsprechen der Seiten-URL ohne `.html`. Liegt das Werkzeug zum Beispiel unter `bentopdf.com/edit-pdf.html`, lautet die ID `edit-pdf`. + +#### Werkzeug-IDs finden + +Am einfachsten: Öffnen Sie ein beliebiges Werkzeug in BentoPDF und sehen Sie sich die URL an. Der letzte Teil des Pfads (ohne `.html`) ist die Werkzeug-ID. + +
+Vollständige Liste der Werkzeug-IDs + +**Bearbeiten & Annotieren:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**In PDF konvertieren:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Aus PDF konvertieren:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organisieren & Verwalten:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimieren & Reparieren:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Sicherheit:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Option 1: Zur Build-Zeit (Docker-Build-Argument) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Dadurch wird die Liste der deaktivierten Werkzeuge fest in das JavaScript-Bundle geschrieben. Zum Ändern ist ein Rebuild nötig. + +#### Option 2: Zur Laufzeit (config.json) + +Binden Sie eine `config.json`-Datei in das ausgelieferte Verzeichnis ein, ganz ohne Rebuild: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Oder mit Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Beide Methoden lassen sich kombinieren, die Listen werden zusammengeführt. Taucht ein Werkzeug in einer von beiden auf, ist es deaktiviert. + +#### Editor-Funktionen deaktivieren + +Sie können auch einzelne Funktionen im PDF-Editor (z. B. Schwärzen, Annotationen, Formulare) deaktivieren, ohne das gesamte Editor-Werkzeug abzuschalten. Fügen Sie `editorDisabledCategories` zu Ihrer `config.json` hinzu: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Vollständige Liste der Editor-Kategorien + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Annotation:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Formen:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formular:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Schwärzung:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Dokument:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Seite:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Werkzeuge:** `tools`, `pan`, `pointer`, `capture` + +**Auswahl:** `selection`, `selection-copy` + +**Verlauf:** `history`, `history-undo`, `history-redo` + +
+ +Kategorien sind hierarchisch: Das Deaktivieren einer übergeordneten Kategorie (z. B. `annotation`) deaktiviert alle ihre untergeordneten. + +### Den GitHub-Sternezähler deaktivieren + +Die Navigationsleiste zeigt einen Live-Zähler der GitHub-Sterne, der beim Laden der Seite von `api.github.com` abgerufen wird. Es ist die einzige externe Anfrage, die keiner PDF-Funktion dient. Deaktivieren Sie ihn beim Build, um den Abrufcode aus dem Bundle zu entfernen und `api.github.com` aus der Content-Security-Policy zu streichen: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple-Mode-Builds (`bentopdf-simple`) überspringen den Sternezähler immer. Dieses Flag wird nur für den Commercial-Build oder eigene Voll-Builds benötigt. + +### Eigene WASM-URLs (abgeschottet / selbst gehostet) + +> [!IMPORTANT] +> WASM-URLs werden **beim Build** fest in das JavaScript geschrieben. Die WASM-Dateien lädt der **Browser des Nutzers** zur Laufzeit herunter, Docker lädt sie beim Build nicht herunter. In abgeschotteten Netzwerken müssen Sie die WASM-Dateien auf einem internen Server hosten, den Browser erreichen können. + +**Vollständiger Workflow für abgeschottete Umgebungen:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Verwenden Sie für `--ocr-languages` die Codes, die `bash scripts/prepare-airgap.sh --list-ocr-languages` ausgibt, oder suchen Sie per Name mit `bash scripts/prepare-airgap.sh --search-ocr-language `. Wenn Sie mit einer eingeschränkten OCR-Teilmenge bauen, übergib dieselben Codes an `VITE_TESSERACT_AVAILABLE_LANGUAGES`, damit die App nur gebündelte Sprachen anzeigt. Für eine vollständige Offline-OCR-Ausgabe hosten Sie zusätzlich das mitgelieferte Verzeichnis `ocr-fonts/` und lassen Sie `VITE_OCR_FONT_BASE_URL` darauf zeigen. + +Setzen Sie eine Variable auf einen leeren String, um das jeweilige Modul zu deaktivieren (Nutzer müssen es dann manuell über die Erweiterten Einstellungen konfigurieren). + +## Eigener Port + +Standardmäßig lauscht BentoPDF im Container auf Port `8080`. Um das zu ändern, setzen Sie zur Laufzeit die Umgebungsvariable `PORT`: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variable | Beschreibung | Standard | +| -------- | ------------------------------ | -------- | +| `PORT` | Nginx-Listen-Port im Container | `8080` | + +Das funktioniert sowohl mit dem Standard- als auch mit dem Nonroot-Dockerfile. + +## Eigene Benutzer-ID (PUID/PGID) + +Für Umgebungen, die einen bestimmten Nicht-Root-Benutzer erfordern (NAS-Geräte, Kubernetes mit Security-Contexts, organisatorische Vorgaben), bietet BentoPDF ein separates Dockerfile mit PUID/PGID-Unterstützung im LSIO-Stil. + +### Bauen und ausführen + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Umgebungsvariablen + +| Variable | Beschreibung | Standard | +| -------------- | -------------------------------------- | -------- | +| `PUID` | Benutzer-ID, unter der ausgeführt wird | `1000` | +| `PGID` | Gruppen-ID, unter der ausgeführt wird | `1000` | +| `PORT` | Nginx-Listen-Port | `8080` | +| `DISABLE_IPV6` | IPv6-Listener deaktivieren | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### So funktioniert es + +Der Container startet als root, legt einen Benutzer mit der angegebenen PUID/PGID an, passt die Besitzrechte aller beschreibbaren Verzeichnisse an und gibt dann mit `su-exec` die Rechte ab. Der nginx-Prozess läuft vollständig unter dem angegebenen Benutzer. + +> [!NOTE] +> Das Standard-`Dockerfile` verwendet `nginx-unprivileged` (UID 101) und wird für die meisten Bereitstellungen empfohlen. Nutzen Sie `Dockerfile.nonroot` nur, wenn Sie eine bestimmte UID/GID brauchen. + +> [!WARNING] +> PUID/PGID dürfen nicht `0` (root) sein. Der Entrypoint prüft die Eingaben und beendet sich bei ungültigen Werten mit einem Fehler. + +## Mit Traefik (Reverse-Proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Mit Caddy (Reverse-Proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Ressourcenlimits + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (systemd-Integration) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) ermöglicht es, Podman-Container als systemd-Dienste auszuführen. Das ist ideal für Produktionsbereitstellungen auf Linux-Systemen. + +### Grundlegende Quadlet-Einrichtung + +Erstellen Sie eine Container-Unit-Datei unter `~/.config/containers/systemd/bentopdf.container` (Benutzer) oder `/etc/containers/systemd/bentopdf.container` (System): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Aktivieren und starten + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Für eine systemweite Bereitstellung nutzen Sie `systemctl` ohne das Flag `--user` und legen Sie die Datei in `/etc/containers/systemd/` ab. + +### Quadlet mit Health-Check + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Automatisches Update mit Quadlet + +Podman kann Container automatisch aktualisieren, wenn neue Images verfügbar sind: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadlet-Netzwerkkonfiguration + +Für eine eigene Netzwerkkonfiguration erstellen Sie eine Netzwerkdatei `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Verweisen Sie dann in Ihrer Container-Datei darauf: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Aktualisieren + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/de/self-hosting/hostinger.md b/docs/de/self-hosting/hostinger.md new file mode 100644 index 00000000..1ba4be1a --- /dev/null +++ b/docs/de/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Auf Hostinger bereitstellen + +[Hostinger](https://hostinger.com) ist ein beliebter Shared-Hosting-Anbieter. Diese Anleitung zeigt, wie Sie BentoPDF auf dem Shared Hosting von Hostinger bereitstellen. + +## Voraussetzungen + +- Hostinger-Hosting-Tarif mit Zugriff auf den Dateimanager +- Lokal installiertes Node.js zum Bauen + +## Schritt 1: Projekt bauen + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Die gebauten Dateien liegen im Ordner `dist`. + +## Schritt 2: Auf Hostinger hochladen + +### Bereitstellung auf der Hauptdomain + +1. Melden Sie sich bei Ihrem Hostinger-Konto an +2. Gehen Sie zu **File Manager** → **public_html** +3. **Löschen Sie** vorhandene Dateien (bei Bedarf vorher sichern) +4. **Laden Sie** den gesamten Inhalt Ihres lokalen Ordners `dist` nach `public_html` **hoch** + +### Bereitstellung in einem Unterverzeichnis + +Wenn Sie in einem Unterverzeichnis bereitstellen (z. B. `yourdomain.com/pdf-tools/`): + +1. Mit der richtigen Basis-URL bauen: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Den Ordner in Hostinger erstellen: + - Gehen Sie zu **File Manager** → **public_html** + - Erstellen Sie einen neuen Ordner: `pdf-tools` +3. Laden Sie den gesamten Inhalt von `dist` nach `public_html/pdf-tools/` hoch + +## Schritt 3: .htaccess-Datei erstellen + +Erstellen Sie eine `.htaccess`-Datei im Stammverzeichnis Ihres Bereitstellungsordners (`public_html` oder `public_html/pdf-tools/`): + +::: warning Wichtig +Bei der Bereitstellung in einem Unterverzeichnis änderen Sie `RewriteBase /` in `RewriteBase /pdf-tools/` (oder in den Namen Ihres Ordners). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Beispiel für .htaccess im Unterverzeichnis + +Für `yourdomain.com/pdf-tools/` passen Sie diese Zeilen an: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Fehlerbehebung + +### WASM-Dateien werden nicht geladen + +Stellen Sie sicher, dass die MIME-Typen in der `.htaccess` korrekt gesetzt sind: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice-Werkzeuge funktionieren nicht + +Die Sicherheits-Header sind für SharedArrayBuffer entscheidend: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Werden die Header nicht angewendet, bitte den Hostinger-Support, `mod_headers` zu aktivieren. + +### 404-Fehler beim Neuladen der Seite + +Stellen Sie sicher, dass die Regel für die Endung `.html` und die Sprachrouten korrekt konfiguriert sind. BentoPDF nutzt statische HTML-Dateien, kein SPA-Routing: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limits für Datei-Uploads + +Hostinger kann Dateigrößenlimits haben. Laden Sie WASM-Dateien separat hoch, wenn der Massen-Upload fehlschlägt. diff --git a/docs/de/self-hosting/index.md b/docs/de/self-hosting/index.md new file mode 100644 index 00000000..41e2915c --- /dev/null +++ b/docs/de/self-hosting/index.md @@ -0,0 +1,538 @@ +# Self-Hosting-Leitfaden + +BentoPDF kann auf Ihrer eigenen Infrastruktur selbst gehostet werden. Dieser Leitfaden behandelt verschiedene Bereitstellungsoptionen. + +## Schnellstart mit Docker / Podman + +Der schnellste Weg, BentoPDF selbst zu hosten: + +> [!TIP] +> BentoPDF gibt es in zwei Builds: +> +> - **Self-Hosted-Build** (`ghcr.io/alam00000/bentopdf-simple:latest`). Jedes PDF-Werkzeug, **ohne** das Marketing-Drumherum (kein Hero, keine FAQ, keine Testimonials, kein Footer). Nutzen Sie ihn für interne Bereitstellungen in Teams und Organisationen. Es ist **keine** funktionsreduzierte "Lite"-Version. +> - **Commercial-Build** (`ghcr.io/alam00000/bentopdf:latest`). Die vollständige Marketing-Website, die von bentopdf.com selbst und von Inhabern einer kommerziellen Lizenz mit öffentlich zugänglichen Bereitstellungen verwendet wird. +> +> Im Zweifel: Ziehen Sie den Self-Hosted-Build. + +> [!IMPORTANT] +> Die Konvertierung von Office-Dateien erfordert `SharedArrayBuffer`. Die App muss dafür sowohl Cross-Origin-isoliert sein als auch aus einem sicheren Kontext ausgeliefert werden. Das offizielle Image sendet bereits die erforderlichen COOP/COEP-Header, aber Browser deaktivieren `SharedArrayBuffer` bei reinen HTTP-Ursprüngen im lokalen Netzwerk wie `http://192.168.x.x` trotzdem. +> +> Verwenden Sie `http://localhost` nur für Tests auf demselben Gerät. Wenn Nutzende BentoPDF über eine LAN-IP oder einen Hostnamen aufrufen, beenden Sie die Verbindung mit HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Oder mit Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Betreiben Sie BentoPDF als systemd-Dienst. Erstellen Sie `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Die vollständige Quadlet-Dokumentation finden Sie im [Docker-Bereitstellungsleitfaden](/de/self-hosting/docker). + +## Aus dem Quellcode bauen + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Konfigurationsoptionen + +### Self-Hosted-Build (Simple Mode) + +Der Self-Hosted-Build (das Image `bentopdf-simple`, auch Simple Mode genannt) ist **funktional identisch** mit dem Commercial-Build: Jedes PDF-Werkzeug ist vorhanden und verhält sich gleich. Er blendet lediglich das Marketing-Drumherum aus, das nur auf bentopdf.com selbst oder in einer kommerziellen, öffentlich zugänglichen Bereitstellung sinnvoll ist. **Es ist keine funktionsreduzierte oder "Lite"-Version.** + +**Was der Self-Hosted-Build ausblendet** (nur kosmetisch, keine PDF-Funktionen werden entfernt): + +- Navigationsleiste, Hero-Bereich, Funktionsbereich, FAQ, Testimonials, Footer +- Setzt den Seitentitel auf "PDF-Werkzeuge" + +**Was der Self-Hosted-Build behält** (alles, was tatsächlich PDF-Arbeit leistet): + +- Jedes PDF-Werkzeug (Zusammenführen, Teilen, Bearbeiten, Signieren, OCR, Office-Konvertierung usw.) +- Unterstützung für eigenes Branding, alle Build-Time- und Runtime-Konfigurationen + +Der Commercial-Build (`ghcr.io/alam00000/bentopdf:latest`) betreibt bentopdf.com selbst und wird von Inhabern einer kommerziellen Lizenz für öffentlich zugängliche Bereitstellungen verwendet. Er ergänzt Hero, FAQ, Testimonials und Footer, die bei einem internen Werkzeug keinen Sinn ergeben würden. + +Wenn Sie BentoPDF für Ihr Team, Ihre Organisation oder als internes Werkzeug selbst hosten, ziehen Sie den Self-Hosted-Build: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Alle Details finden Sie in [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md). + +### Commercial-Build (öffentlich zugängliche Bereitstellungen mit eigener Marke) + +Der Commercial-Build (das Image `bentopdf`, ohne Suffix `-simple`) betreibt bentopdf.com selbst. Er enthält die vollständige Marketing-Website (Hero, Funktionen, FAQ, Testimonials, Footer) zusätzlich zu jedem PDF-Werkzeug. Verwenden Sie diesen Build, wenn Sie **BentoPDF als öffentlich zugänglichen PDF-Dienst unter Ihrer eigenen Marke bereitstellen** möchten, zum Beispiel: + +- Sie betreiben BentoPDF als gehostetes SaaS für Endnutzende auf Ihrer eigenen Domain +- Sie möchten das Landingpage-Erlebnis (Marketing-Bereiche + Werkzeuge), nicht nur die reine Werkzeugoberfläche +- Sie sind Inhaber einer kommerziellen Lizenz und betten BentoPDF in ein kommerzielles Produkt ein + +**Unverändert ausführen** (mit BentoPDF-Branding, nützlich, um den Build auszuprobieren): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Mit eigener Marke bauen** (der typische kommerzielle Workflow): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Alle anderen Build-Time-Optionen (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, WASM-URL-Überschreibungen usw.) funktionieren genauso wie beim Self-Hosted-Build. + +::: warning Lizenzierung +Der Commercial-Build darf unter einer der beiden Lizenzoptionen von BentoPDF betrieben werden: + +- **AGPL-3.0** (kostenlos): erlaubt, wenn Ihre Bereitstellung ihren vollständigen Quellcode unter der AGPL veröffentlicht, einschließlich aller Branding-Änderungen und der umgebenden Geschäftslogik. +- **Kommerzielle Lizenz** (79 $ lebenslang): erforderlich für Closed-Source-/proprietäre Bereitstellungen, bei denen Sie Ihren Branding-Fork oder Ihren Geschäftscode nicht als Open Source veröffentlichen. + +Den vollständigen Vergleich finden Sie auf der [Lizenzierungsseite](https://www.bentopdf.com/licensing). AGPL-lizenzierte WASM-Module (PyMuPDF, Ghostscript, CoherentPDF) werden zur Laufzeit von einem CDN geladen, gelangen also nicht in Ihr Image und ändern nichts an Ihrer Lizenzlage. +::: + +### Base-URL + +In einem Unterverzeichnis bereitstellen: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Eigenes Branding + +Ersetzen Sie das Standard-Logo, den Namen und den Footer-Text von BentoPDF zur Build-Zeit durch Ihre eigenen: + +| Variable | Beschreibung | Standard | +| ------------------ | ------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Markenname in Header und Footer | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logopfad relativ zu `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Eigener Footer-/Copyright-Text | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Oder über Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Das Branding funktioniert sowohl im vollständigen Modus als auch im Simple Mode und lässt sich mit allen anderen Build-Time-Optionen kombinieren (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Bestimmte Werkzeuge deaktivieren + +Blenden Sie einzelne Werkzeuge aus Compliance- oder Sicherheitsgründen aus. Deaktivierte Werkzeuge werden auf der Startseite, in der Suche, in den Tastenkürzeln, im Workflow-Builder und beim direkten URL-Zugriff entfernt. + +Werkzeug-IDs entsprechen der Seiten-URL ohne `.html`: Öffnen Sie ein beliebiges Werkzeug und sehen Sie sich die URL an (z. B. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Build-Time** (in das Bundle eingebaut): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Runtime** (ohne Neubau: eine `config.json` einbinden): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Beide Methoden lassen sich kombinieren, die Listen werden zusammengeführt. + +Sie können außerdem einzelne Funktionen im PDF-Editor (z. B. Schwärzen) deaktivieren, ohne das gesamte Werkzeug zu deaktivieren, indem Sie `editorDisabledCategories` zur `config.json` hinzufügen. Die vollständige Liste der Kategorien finden Sie im [Docker-Leitfaden](/de/self-hosting/docker#editor-funktionen-deaktivieren). + +## Bereitstellungsleitfäden + +Wählen Sie Ihre Plattform: + +- [Vercel](/de/self-hosting/vercel) +- [Netlify](/de/self-hosting/netlify) +- [Cloudflare Pages](/de/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/de/self-hosting/aws) +- [Hostinger](/de/self-hosting/hostinger) +- [Nginx](/de/self-hosting/nginx) +- [Apache](/de/self-hosting/apache) +- [Docker](/de/self-hosting/docker) +- [Kubernetes](/de/self-hosting/kubernetes) +- [CORS-Proxy](/de/self-hosting/cors-proxy) - Erforderlich für digitale Signaturen + +## Häufige Probleme + +### Word / ODT / Excel / PowerPoint zu PDF hängt (SharedArrayBuffer nicht verfügbar) + +**Symptom**: LibreOffice-basierte Dokumentkonvertierungen (Word, ODT, Excel, PowerPoint zu PDF) hängen bei ca. 55 % oder starten nicht. Die Browserkonsole zeigt möglicherweise: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…oder `window.crossOriginIsolated` meldet `false`, oder die WASM-Kompilierung meldet `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Ursache**: LibreOffice-WASM benötigt `SharedArrayBuffer`, das der Browser nur aktiviert, wenn die Seite **Cross-Origin-isoliert** ist UND aus einem **sicheren Kontext** ausgeliefert wird. Dafür müssen zwei Dinge zutreffen: + +1. Jede Antwort enthält beide Header: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Die Seite wird über `https://...` oder `http://localhost` ausgeliefert. Reines HTTP auf einer LAN-IP (z. B. `http://192.168.x.x`) zählt NICHT als sicher, dort deaktivieren Browser `SharedArrayBuffer`. + +Die Abweichung `00 61 73 6d / 1f 8b 08 08` ist ein separates Teilsymptom: Den vorkomprimierten Dateien `.wasm.gz` / `.data.gz` fehlt der Response-Header `Content-Encoding: gzip`, sodass der Browser rohe gzip-Bytes statt dekomprimiertem WASM erhält. + +**Lösung**: Die genaue Konfiguration finden Sie im Bereitstellungsleitfaden Ihrer Plattform: + +- [Nginx →](/de/self-hosting/nginx#signieren-oder-formularausfullung-zeigt-einen-leeren-viewer-mjs-mime-fehler) +- [Apache →](/de/self-hosting/apache#signieren-oder-formularausfullung-zeigt-einen-leeren-viewer-mjs-mime-fehler) +- [AWS S3 + CloudFront →](/de/self-hosting/aws#schritt-3b-response-headers-policy-erforderlich-fur-libreoffice-wasm) +- [Cloudflare Pages →](/de/self-hosting/cloudflare#konfigurationsdatei) (`_headers`-Datei) +- [Netlify →](/de/self-hosting/netlify#word-odt-excel-zu-pdf-bleibt-bei-55-hangen) (`netlify.toml`) +- [Vercel →](/de/self-hosting/vercel#word-odt-excel-zu-pdf-funktioniert-nicht) (`vercel.json`) +- [Hostinger →](/de/self-hosting/hostinger#libreoffice-werkzeuge-funktionieren-nicht) (`.htaccess`) +- [Kubernetes →](/de/self-hosting/kubernetes#mjs-mime-type-fehler-pdf-unterschreiben-pdf-formular-ausfullen-leerer-iframe) +- **Docker**: wird von der mitgelieferten Nginx-Konfiguration automatisch erledigt, keine Aktion nötig. + +**Überprüfen**: Öffnen Sie auf einer beliebigen BentoPDF-Seite die DevTools-Konsole und führen Sie aus: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Wenn die Seite über HTTPS oder `http://localhost` läuft UND beide COEP/COOP-Header in jeder Antwort vorhanden sind, bestehen beide Prüfungen. Wenn Sie auf `http://192.168.x.x` oder einem anderen nicht-Loopback-HTTP-Ursprung sind, beenden Sie die Verbindung mit HTTPS. Es gibt keine Lösung allein über Header. + +### `.mjs`-Dateien werden als `application/octet-stream` ausgeliefert + +**Symptom**: PDF unterschreiben / PDF-Formular ausfüllen / bestimmte andere Werkzeuge zeigen einen leeren Viewer oder laden nicht. Die Browserkonsole meldet: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Ursache**: Ihr Webserver oder Reverse-Proxy hat keine MIME-Type-Zuordnung für `.mjs`-Dateien (der mitgelieferte PDF-Viewer enthält ES-Module mit dieser Endung). Viele Standard-Serverkonfigurationen verwenden für unbekannte Endungen `application/octet-stream`, was Browser als ES-Module nicht ausführen. + +**Lösung**: Den genauen Ausschnitt finden Sie im Bereitstellungsleitfaden Ihrer Plattform: + +- [Nginx →](/de/self-hosting/nginx#signieren-oder-formularausfullung-zeigt-einen-leeren-viewer-mjs-mime-fehler) +- [Apache →](/de/self-hosting/apache#signieren-oder-formularausfullung-zeigt-einen-leeren-viewer-mjs-mime-fehler) +- [AWS S3 + CloudFront →](/de/self-hosting/aws#schritt-2-bauen-und-hochladen) (siehe `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/de/self-hosting/kubernetes#mjs-mime-type-fehler-pdf-unterschreiben-pdf-formular-ausfullen-leerer-iframe) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: wird automatisch erledigt, keine Aktion nötig. + +**Überprüfen**: Öffnen Sie die DevTools → Tab Network, suchen Sie die fehlgeschlagene `.mjs`-Anfrage und prüfen Sie den Response-Header `Content-Type`. Er sollte `application/javascript` lauten. Wenn er immer noch `application/octet-stream` lautet, bestimmt möglicherweise ein vorgelagerter Reverse-Proxy oder CDN den Typ neu. Prüfen Sie jede Schicht in Ihrer Auslieferungskette. + +## WASM-Konfiguration (AGPL-Komponenten) + +BentoPDF **bündelt keine** AGPL-lizenzierten Verarbeitungsbibliotheken in seinem Quellcode, **konfiguriert aber CDN-URLs vor**, sodass alle Funktionen sofort funktionieren, ohne manuelle Einrichtung. + +::: tip Standardmäßig ohne Konfiguration +Seit v2.0.0 sind WASM-Module so vorkonfiguriert, dass sie über Umgebungsvariablen vom jsDelivr-CDN geladen werden. Alle erweiterten Funktionen funktionieren sofort, ohne Konfiguration durch Nutzende. +::: + +| Komponente | Lizenz | Funktionen | +| --------------- | -------- | ---------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | EPUB-/MOBI-/FB2-/XPS-Konvertierung, Bildextraktion, Tabellenextraktion | +| **Ghostscript** | AGPL-3.0 | PDF/A-Konvertierung, Komprimierung, Begradigung, Rasterung | +| **CoherentPDF** | AGPL-3.0 | Inhaltsverzeichnis, Anhänge, PDF-Zusammenführung mit Lesezeichen | + +### Standard-Umgebungsvariablen + +Diese sind in `.env.production` gesetzt und in den Build eingebaut: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### WASM-URLs überschreiben + +Sie können die Standardwerte zur Build-Zeit für eigene Bereitstellungen überschreiben: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Um ein Modul vollständig zu deaktivieren (manuelle Konfiguration durch Nutzende über die erweiterten Einstellungen erforderlich), setzen Sie seine Variable auf eine leere Zeichenfolge. + +Für OCR lassen Sie entweder alle `VITE_TESSERACT_*`-Variablen leer und behalten die standardmäßigen Online-Assets, oder Sie setzen die Worker-/Core-/Sprach-URLs gemeinsam für selbst gehostetes/Offline-OCR. Wenn Sie nur bestimmte OCR-Sprachen bündeln, setzen Sie `VITE_TESSERACT_AVAILABLE_LANGUAGES` ebenfalls auf dieselben kommagetrennten Codes, damit die Oberfläche nur installierte Sprachen anbietet und nicht unterstützte Auswahlen mit einer aussagekräftigen Fehlermeldung fehlschlagen. Für eine vollständig offline erzeugte durchsuchbare PDF-Ausgabe setzen Sie außerdem `VITE_OCR_FONT_BASE_URL` auf das interne Verzeichnis, das die mitgelieferten OCR-Schriftarten bereitstellt. + +Nutzende können diese Standardwerte jederzeit über die **erweiterten Einstellungen** in der Oberfläche überschreiben. Im Browser gespeicherte Überschreibungen haben Vorrang vor den Standardwerten der Umgebung. + +### Air-Gapped- / Offline-Bereitstellung + +Für Netzwerke ohne Internetzugang (Behörden, Gesundheitswesen, Finanzwesen usw.). Die WASM-URLs sind zur **Build-Zeit** in das JavaScript eingebaut, die eigentlichen WASM-Dateien werden zur Laufzeit vom **Browser der Nutzenden** heruntergeladen. Sie müssen also alles auf einem Rechner mit Internetzugang vorbereiten und dann in das isolierte Netzwerk übertragen. + +#### Automatisiertes Skript (empfohlen) + +Das mitgelieferte Skript `prepare-airgap.sh` automatisiert den gesamten Ablauf: Es lädt die WASM-Pakete herunter, baut das Docker-Image und erzeugt ein in sich geschlossenes Bundle mit einem Setup-Skript. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Dies erzeugt ein Bundle-Verzeichnis: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Übertragen Sie das Bundle per USB, internem Artefakt-Repository oder auf einem anderen genehmigten Weg in das Air-Gapped-Netzwerk. Führen Sie dann das mitgelieferte Setup-Skript aus: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Das Setup-Skript lädt das Docker-Image, entpackt die WASM-Dateien und startet optional den Container. + +**Skriptoptionen:** + +| Flag | Beschreibung | Standard | +| ------------------------------ | ------------------------------------------------------------- | ------------------------------------------- | +| `--wasm-base-url ` | Wo die WASMs intern gehostet werden | _(erforderlich, wird bei Fehlen abgefragt)_ | +| `--image-name ` | Docker-Image-Tag | `bentopdf` | +| `--output-dir ` | Ausgabeverzeichnis des Bundles | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Simple Mode aktivieren | aus | +| `--base-url ` | Base-URL des Unterverzeichnisses (z. B. `/pdf/`) | `/` | +| `--language ` | Standardsprache der Oberfläche (z. B. `fr`, `de`) | _(keine)_ | +| `--brand-name ` | Eigener Markenname | _(keine)_ | +| `--brand-logo ` | Logopfad relativ zu `public/` | _(keine)_ | +| `--footer-text ` | Eigener Footer-Text | _(keine)_ | +| `--ocr-languages ` | Kommagetrennte OCR-Sprachen zum Bündeln | `eng` | +| `--list-ocr-languages` | Unterstützte OCR-Codes und Namen ausgeben, dann beenden | aus | +| `--search-ocr-language ` | OCR-Codes nach Name oder Abkürzung suchen | aus | +| `--dockerfile ` | Zu verwendendes Dockerfile | `Dockerfile` | +| `--skip-docker` | Docker-Build und -Export überspringen | aus | +| `--skip-wasm` | WASM-Download überspringen (vorhandene `.tgz`-Dateien nutzen) | aus | + +Die interaktive Abfrage akzeptiert außerdem `list`, um die vollständige Liste der unterstützten Tesseract-Codes auszugeben, und `search `, um Treffer wie `search german` oder `search chi` zu finden. + +::: warning Same-Origin-Anforderung +WASM-Dateien müssen vom **selben Ursprung** wie die BentoPDF-App ausgeliefert werden. Web Worker verwenden `importScripts()`, das keine Skripte von anderen Ursprüngen laden kann. Wenn BentoPDF beispielsweise unter `https://internal.example.com` läuft, sollte auch die WASM-Basis-URL `https://internal.example.com/wasm` lauten. +::: + +#### Manuelle Schritte + +
+Wenn Sie es lieber manuell ohne das Skript machen + +**Schritt 1: WASM- und OCR-Pakete herunterladen** (auf einem Rechner mit Internetzugang) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Schritt 2: Das Docker-Image mit internen URLs bauen** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Schritt 3: Das Docker-Image exportieren** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Schritt 4: In das Air-Gapped-Netzwerk übertragen** + +Kopieren Sie per USB, internem Artefakt-Repository oder einem genehmigten Übertragungsweg: + +- `bentopdf.tar`: das Docker-Image +- Die fünf `.tgz`-WASM-/OCR-Pakete aus Schritt 1 +- Das Verzeichnis `tesseract-langdata/` aus Schritt 1 +- Das Verzeichnis `ocr-fonts/` aus Schritt 1 + +**Schritt 5: Im Air-Gapped-Netzwerk einrichten** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Stellen Sie sicher, dass die Dateien unter den in Schritt 2 konfigurierten URLs erreichbar sind, einschließlich `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` und `.../ocr/fonts`. + +
+ +::: info Aus dem Quellcode statt mit Docker bauen? +Setzen Sie die Variablen in `.env.production`, bevor Sie `npm run build` ausführen: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Einen eigenen WASM-Proxy hosten + +Wenn Sie AGPL-WASM-Dateien mit passenden CORS-Headern ausliefern müssen, können Sie einen einfachen Proxy bereitstellen. Eine Beispielimplementierung finden Sie im [Cloudflare-WASM-Proxy-Leitfaden](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md). + +::: tip Warum getrennt? +Diese Trennung sorgt für: + +- Klare rechtliche Konformität für kommerzielle Nutzende +- Den Kern von BentoPDF unter seiner Dual-Lizenz (AGPL-3.0 / Commercial) +- WASM-Dateien, die zur Laufzeit geladen und nicht im Quellcode gebündelt werden + ::: + +## Systemanforderungen + +| Anforderung | Minimum | +| ----------- | ---------------------------------- | +| Speicher | ca. 100 MB (Kern ohne AGPL-Module) | +| RAM | 512 MB | +| CPU | Jeder moderne Prozessor | + +::: tip +BentoPDF ist eine statische Website, es werden keine Datenbank und kein Backend-Server benötigt! +::: diff --git a/docs/de/self-hosting/kubernetes.md b/docs/de/self-hosting/kubernetes.md new file mode 100644 index 00000000..ff2b3ad6 --- /dev/null +++ b/docs/de/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Mit Kubernetes bereitstellen + +Kubernetes ist für eine statische Website vielleicht überdimensioniert, kann aber gut passen, wenn Sie ohnehin auf Helm + GitOps setzen. + +> [!IMPORTANT] +> **Erforderliche Header für die Office-Dateikonvertierung** +> +> LibreOffice-basierte Werkzeuge (Word-, Excel-, PowerPoint-Konvertierung) benötigen diese HTTP-Header für die `SharedArrayBuffer`-Unterstützung: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Die offiziellen BentoPDF-Nginx-Images enthalten diese Header. In Kubernetes sind **Ingress-/Gateway-Controller ebenfalls Reverse-Proxys**. Stellen Sie daher sicher, dass diese Header erhalten bleiben (oder fügen Sie sie am Edge hinzu). + +## Voraussetzungen + +- Kubernetes-Cluster +- Helm v3 +- Ein BentoPDF-Nginx-Image (z. B. `ghcr.io/alam00000/bentopdf:`), das auf **Port 8080** läuft + +## Mit Helm bereitstellen + +### Aus diesem Repo installieren (lokales Chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Aus GHCR installieren (OCI-Chart) + +Wenn das Chart als OCI-Artefakt in GHCR veröffentlicht ist: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Verfügbar machen + +### Port-Forward (schneller Test) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (optional) + +Aktivieren Sie Ingress (Beispiel für nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (optional) + +Dieses Chart unterstützt Gateway API `Gateway` + `HTTPRoute`. + +Beispiel (Cloudflare-Gateway-API-Operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Sicherstellen, dass die SharedArrayBuffer-Header weiterhin funktionieren (Ingress/Gateway) + +### Was passieren "sollte" + +Die Nginx-Konfiguration von BentoPDF setzt die erforderlichen Response-Header. Die meisten Ingress-/Gateway-Controller **leiten Response-Header des Upstreams unverändert weiter**. + +### Was das verhindern kann + +- Eine Controller-/Edge-Richtlinie, die Response-Header **überschreibt** oder **entfernt** +- Eine "Security-Header"-Middleware, die andere COOP/COEP-Werte setzt + +### So überprüfen Sie es + +Führen Sie dies gegen Ihren öffentlichen Endpunkt aus: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Sie sollten Folgendes sehen: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Wenn Ihr Ingress-Controller sie nicht beibehält + +Fügen Sie die Header am Edge hinzu (controllerspezifisch). Beispiel für **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs`-MIME-Type-Fehler (PDF unterschreiben / PDF-Formular ausfüllen, leerer iframe) + +Wenn die Browserkonsole bei einer `.mjs`-Anfrage `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` anzeigt, ersetzt ein Ingress-/Gateway-Controller vor dem BentoPDF-Nginx den Upstream-Header `Content-Type` durch `application/octet-stream`. + +Der Nginx im BentoPDF-Image liefert `.mjs` bereits als `application/javascript` aus. Die Lösung besteht darin, den Controller daran zu hindern, den Header zu entfernen oder zu ersetzen. Für nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Oder verwenden Sie in der Gateway API einen `ResponseHeaderModifier`-Filter, um `Content-Type: application/javascript` für `.mjs`-Pfade zu setzen. Überprüfen Sie es im DevTools-Tab Network: Die fehlgeschlagene `.mjs`-Anfrage sollte nun `content-type: application/javascript` zeigen. + +### Wenn Sie die Gateway API nutzen und Header erzwingen möchten + +Die Gateway API unterstützt einen `ResponseHeaderModifier`-Filter. Sie können ihn in `httpRoute.rules[*].filters` einbinden: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Die Unterstützung bestimmter Filter hängt von Ihrem Gateway-Controller ab. Wenn ein Filter ignoriert wird, fügen Sie die Header stattdessen am Edge bzw. im Controller hinzu. + +## Bestimmte Werkzeuge deaktivieren + +Verwenden Sie eine ConfigMap, um Werkzeuge zur Laufzeit zu deaktivieren, ohne das Image neu zu bauen: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Binden Sie sie in das ausgelieferte Verzeichnis ein: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Werkzeug-IDs entsprechen der Seiten-URL ohne `.html`: Öffnen Sie ein beliebiges Werkzeug und sehen Sie sich die URL an (z. B. `edit-pdf`, `merge-pdf`, `compress-pdf`). Deaktivierte Werkzeuge werden auf der Startseite, in der Suche, in den Tastenkürzeln, im Workflow-Builder und beim direkten URL-Zugriff ausgeblendet. Die vollständige Liste der Optionen finden Sie im [Docker-Leitfaden](/de/self-hosting/docker#bestimmte-werkzeuge-deaktivieren). diff --git a/docs/de/self-hosting/netlify.md b/docs/de/self-hosting/netlify.md new file mode 100644 index 00000000..901376cb --- /dev/null +++ b/docs/de/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Auf Netlify bereitstellen + +[Netlify](https://netlify.com) bietet hervorragendes Hosting für statische Websites mit einem großzügigen kostenlosen Kontingent. + +## Bereitstellung mit einem Klick + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Manuelle Bereitstellung + +### Schritt 1: Repository verbinden + +1. Melden Sie sich bei [Netlify](https://app.netlify.com) an +2. Klicken Sie auf "Add new site" → "Import an existing project" +3. Verbinden Sie Ihr GitHub-Konto +4. Wählen Sie Ihren BentoPDF-Fork aus + +### Schritt 2: Build-Einstellungen konfigurieren + +| Einstellung | Wert | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Schritt 3: Bereitstellen + +Klicken Sie auf "Deploy site" und warten Sie auf den Build. + +## Konfigurationsdatei + +Erstellen Sie `netlify.toml` im Stammverzeichnis Ihres Projekts: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Wichtig +Die Header `Cross-Origin-Embedder-Policy` und `Cross-Origin-Opener-Policy` sind für die Konvertierung von Word/ODT/Excel/PowerPoint in PDF erforderlich. Ohne sie ist `SharedArrayBuffer` nicht verfügbar, und die LibreOffice-WASM-Engine kann nicht initialisiert werden. + +Die `Content-Encoding: gzip`-Header für die Dateien `.wasm.gz` und `.data.gz` weisen den Browser an, sie automatisch zu dekomprimieren. Ohne sie erhält der Browser rohe gzip-Bytes, und die WASM-Kompilierung schlägt fehl. +::: + +## Umgebungsvariablen + +Legen Sie diese unter Site settings → Environment variables fest: + +| Variable | Beschreibung | +| ----------------------- | ---------------------------------------------------------- | +| `SIMPLE_MODE` | Auf `true` setzen für einen minimalen Build | +| `VITE_BRAND_NAME` | Eigener Markenname (ersetzt "BentoPDF") | +| `VITE_BRAND_LOGO` | Logopfad relativ zu `public/` (z. B. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Eigener Footer-/Copyright-Text | +| `VITE_DEFAULT_LANGUAGE` | Standardsprache der Oberfläche (z. B. `fr`, `de`, `es`) | + +## Eigene Domain + +1. Gehen Sie zu Site settings → Domain management +2. Klicken Sie auf "Add custom domain" +3. Folgen Sie den Anweisungen zur DNS-Konfiguration + +## Große Mediendateien + +Für große WASM-Dateien können Sie [Netlify Large Media](https://docs.netlify.com/large-media/overview/) aktivieren: + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Fehlerbehebung + +### Word/ODT/Excel zu PDF bleibt bei 55 % hängen + +Wenn Dokumentkonvertierungen bei 55 % hängen bleiben, öffnen Sie die DevTools-Konsole und prüfen Sie: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Wenn `crossOriginIsolated` den Wert `false` hat, werden die COEP/COOP-Header aus Ihrer `netlify.toml` nicht angewendet. Stellen Sie sicher, dass sich die Datei im Stammverzeichnis Ihres Projekts befindet, und stellen Sie erneut bereit. + +Wenn Sie in der Konsole `expected magic word 00 61 73 6d, found 1f 8b 08 08` sehen, fehlen den `.wasm.gz`-Dateien die `Content-Encoding: gzip`-Header. Stellen Sie sicher, dass die `[[headers]]`-Blöcke für `soffice.wasm.gz` und `soffice.data.gz` in Ihrer `netlify.toml` enthalten sind. + +### Build schlägt fehl + +Prüfen Sie die Kompatibilität der Node-Version: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Langsames erstes Laden + +Aktivieren Sie die Asset-Optimierung unter Site settings → Build & deploy → Asset optimization. diff --git a/docs/de/self-hosting/nginx.md b/docs/de/self-hosting/nginx.md new file mode 100644 index 00000000..ec4ac172 --- /dev/null +++ b/docs/de/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Mit Nginx bereitstellen + +Hosten Sie BentoPDF mit Nginx auf Ihrem eigenen Server. + +## Voraussetzungen + +- Ubuntu-/Debian-Server +- Installierter Nginx +- SSL-Zertifikat (empfohlen: Let's Encrypt) + +## Schritt 1: Das Projekt bauen + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Um das Branding anzupassen, setzen Sie vor dem Build Umgebungsvariablen: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Schritt 2: Dateien kopieren + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Schritt 3: Nginx-Konfiguration + +Erstellen Sie `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Schritt 4: Die Site aktivieren + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Schritt 5: SSL mit Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Bereitstellung in einem Unterverzeichnis + +Um unter `/pdf/` zu hosten: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Bauen Sie mit: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Performance-Tuning + +Fügen Sie in `nginx.conf` hinzu: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Fehlerbehebung + +### WASM wird nicht geladen + +Stellen Sie sicher, dass der MIME-Type gesetzt ist: + +```nginx +types { + application/wasm wasm; +} +``` + +### Signieren oder Formularausfüllung zeigt einen leeren Viewer (`.mjs`-MIME-Fehler) + +Wenn die Browserkonsole Folgendes anzeigt: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…und die fehlgeschlagene Anfrage auf `.mjs` endet, fehlt in Ihrem Nginx die Zuordnung `.mjs → application/javascript`. Der mitgelieferte PDF-Viewer (genutzt von PDF unterschreiben, PDF-Formular ausfüllen und einigen weiteren Werkzeugen) enthält ES-Moduldateien mit der Endung `.mjs`, und die Standard-`mime.types` von Nginx enthält diese nicht. + +Beheben Sie es, indem Sie `mjs` in der bestehenden `application/javascript`-Zeile in `/etc/nginx/mime.types` ergänzen: + +```nginx +application/javascript js mjs; +``` + +> Fügen Sie KEINE _zweite_ `application/javascript`-Zeile hinzu: Nginx liest `mime.types` Zeile für Zeile und nur eine Zuordnung von Typ zu Endung gilt, sodass eine zweite Zeile in manchen Versionen stillschweigend ignoriert wird. Bearbeiten Sie die bestehende Zeile und ergänzen Sie `mjs` neben `js`. + +Oder überschreiben Sie es lokal in Ihrem Server-Block (ohne Änderung der globalen Datei): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Laden Sie Nginx nach der Änderung neu: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Zur Bestätigung: Suchen Sie in den Browser-DevTools im Tab Network die fehlgeschlagene `.mjs`-Anfrage und prüfen Sie den Response-Header `Content-Type`. Er sollte jetzt `application/javascript` lauten, nicht `application/octet-stream`. + +### Word/ODT/Excel zu PDF funktioniert nicht + +LibreOffice-WASM benötigt `SharedArrayBuffer`, wofür die Header `Cross-Origin-Embedder-Policy` und `Cross-Origin-Opener-Policy` nötig sind. Außerdem wird ein sicherer Kontext benötigt: `http://localhost` funktioniert für lokale Tests, aber `http://192.168.x.x` oder andere LAN-IPs erfordern in der Regel HTTPS. Beachten Sie, dass `add_header`-Direktiven in einem `location`-Block die `add_header`-Direktiven auf Server-Ebene **überschreiben**, statt sich mit ihnen zu vereinen. Jeder `location`-Block mit eigenem `add_header` muss die COEP/COOP-Header enthalten. + +Überprüfen Sie mit: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Wenn ein Reverse-Proxy vor Nginx liegt, stellen Sie sicher, dass er diese Header beibehält. + +### 502 Bad Gateway + +Prüfen Sie die Nginx-Fehlerprotokolle: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/de/self-hosting/vercel.md b/docs/de/self-hosting/vercel.md new file mode 100644 index 00000000..8647cead --- /dev/null +++ b/docs/de/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Auf Vercel bereitstellen + +[Vercel](https://vercel.com) bietet die einfachste Bereitstellung für statische Websites. + +## Bereitstellung mit einem Klick + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Manuelle Bereitstellung + +### Schritt 1: Repository forken + +Forken Sie [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) in Ihr GitHub-Konto. + +### Schritt 2: In Vercel importieren + +1. Gehen Sie zu [vercel.com/new](https://vercel.com/new) +2. Wählen Sie Ihr geforktes Repository aus +3. Konfigurieren Sie das Projekt: + +| Einstellung | Wert | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Schritt 3: Umgebungsvariablen (optional) + +Fügen Sie diese bei Bedarf hinzu: + +| Variable | Beschreibung | +| ----------------------- | ---------------------------------------------------------- | +| `SIMPLE_MODE` | Auf `true` setzen für eine minimale Oberfläche | +| `VITE_BRAND_NAME` | Eigener Markenname (ersetzt "BentoPDF") | +| `VITE_BRAND_LOGO` | Logopfad relativ zu `public/` (z. B. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Eigener Footer-/Copyright-Text | +| `VITE_DEFAULT_LANGUAGE` | Standardsprache der Oberfläche (z. B. `fr`, `de`, `es`) | + +### Schritt 4: Bereitstellen + +Klicken Sie auf "Deploy" und warten Sie, bis der Build abgeschlossen ist. + +## Eigene Domain + +1. Öffnen Sie die Einstellungen Ihres Projekts +2. Navigieren Sie zu "Domains" +3. Fügen Sie Ihre eigene Domain hinzu +4. Konfigurieren Sie das DNS wie angegeben + +## Einschränkungen + +::: warning Große Dateien +Die Serverless Functions von Vercel haben ein Limit von 50 MB. Da BentoPDF eine statische Website ist, sollte Sie das nicht betreffen, aber die WASM-Module sind groß (insgesamt ca. 100 MB). Stellen Sie sicher, dass sie aus dem Ordner `/public` ausgeliefert werden. +::: + +## Fehlerbehebung + +### Build-Timeout + +Wenn Builds in ein Timeout laufen, versuchen Sie Folgendes: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 beim Neuladen + +Fügen Sie eine `vercel.json` für das SPA-Routing hinzu: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel zu PDF funktioniert nicht + +Die LibreOffice-WASM-Konvertierungen erfordern `SharedArrayBuffer`, wofür diese Response-Header auf allen Seiten nötig sind: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Die vorkomprimierten Dateien `.wasm.gz` und `.data.gz` benötigen außerdem `Content-Encoding: gzip`, damit der Browser sie dekomprimiert. + +Fügen Sie diese zu Ihrer `vercel.json` hinzu: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Zur Überprüfung öffnen Sie die DevTools-Konsole und führen Sie `console.log(window.crossOriginIsolated)` aus. Es sollte `true` zurückgeben. diff --git a/docs/de/tools/add-attachments.md b/docs/de/tools/add-attachments.md new file mode 100644 index 00000000..f9b11452 --- /dev/null +++ b/docs/de/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Anhänge hinzufügen +description: Betten Sie beliebige Dateien auf Dokumentebene oder an bestimmte Seiten gebunden in ein PDF ein. +--- + +# Anhänge hinzufügen + +Betten Sie eine oder mehrere Dateien direkt in ein PDF-Dokument ein. Anhänge können auf Dokumentebene hinzugefügt werden (sichtbar im Anhangbereich jedes PDF-Readers) oder an bestimmte Seiten gebunden werden. + +## So funktioniert es + +1. Laden Sie das PDF hoch, an das Sie Dateien anhängen möchten. +2. Wählen Sie über die Ablagefläche für Anhänge die Dateien aus, die Sie einbetten möchten (beliebiger Dateityp). +3. Wählen Sie die Anhangsebene: **Dokument** (Standard) oder **Seite**. +4. Wenn Sie die Seitenebene wählen, geben Sie einen Seitenbereich ein (z. B. `1-3` oder `5`). +5. Klicken Sie auf die Verarbeiten-Schaltfläche. Das geänderte PDF wird mit den eingebetteten Dateien heruntergeladen. + +## Funktionen + +- Beliebige Dateitypen anhängen: Bilder, Tabellen, Archive, ausführbare Dateien, alles +- Anhänge auf Dokument- oder Seitenebene platzieren +- Mehrere Dateien in einem Vorgang anhängen +- Zeigt Dateinamen und Größen aller ausgewählten Anhänge an +- Die Ausgabe behält den ursprünglichen PDF-Inhalt bei und ergänzt die eingebetteten Dateien + +## Optionen + +| Option | Beschreibung | +| ----------------- | -------------------------------------------------------------------------------------- | +| **Dokumentebene** | Hängt Dateien an das gesamte PDF an, abrufbar über den Anhangbereich | +| **Seitenebene** | Hängt Dateien an bestimmte Seiten an, festgelegt über die Eingabe eines Seitenbereichs | + +## Anwendungsfälle + +- Quelldaten (Excel-Dateien, CSVs) mit einem PDF-Bericht bündeln +- Originalbilddateien an ein Fotografie-Portfolio im PDF-Format anhängen +- Begleitdokumente in einen Vertrag oder ein Angebot einbetten +- Ergänzendes Material an bestimmte Seiten eines Schulungshandbuchs anhängen + +## Tipps + +- Anhänge auf Dokumentebene werden von PDF-Readern am besten unterstützt. Anhänge auf Seitenebene sind möglicherweise nicht in allen Viewern sichtbar. +- Es gibt keine Größenbeschränkung für Anhänge, aber sehr große eingebettete Dateien lassen das PDF entsprechend wachsen. + +## Verwandte Werkzeuge + +- [Anhänge extrahieren](./extract-attachments) +- [Anhänge bearbeiten](./edit-attachments) +- [PDF zusammenführen](./merge-pdf) diff --git a/docs/de/tools/add-blank-page.md b/docs/de/tools/add-blank-page.md new file mode 100644 index 00000000..ae012d84 --- /dev/null +++ b/docs/de/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Leere Seite hinzufügen +description: Fügen Sie eine oder mehrere leere Seiten an beliebiger Position in ein PDF-Dokument ein. +--- + +# Leere Seite hinzufügen + +Fügen Sie leere Seiten an einer von Ihnen festgelegten Position in ein PDF ein. Sie bestimmen, wo die leeren Seiten eingefügt werden und wie viele es sein sollen. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Das Werkzeug zeigt die Seitenzahl an. +2. Geben Sie die **Position** ein, an der leere Seiten eingefügt werden sollen. Verwenden Sie `0` für den Anfang oder die Gesamtseitenzahl, um am Ende anzufügen. +3. Geben Sie die **Anzahl** der hinzuzufügenden leeren Seiten ein (Standard ist 1). +4. Klicken Sie auf die Verarbeiten-Schaltfläche. Das geänderte PDF wird mit den eingefügten leeren Seiten heruntergeladen. + +## Funktionen + +- An beliebiger Position einfügen: am Anfang, in der Mitte oder am Ende des Dokuments +- Mehrere leere Seiten in einem Vorgang hinzufügen +- Der Positionshinweis passt sich dynamisch an die Seitenzahl des hochgeladenen PDFs an +- Leere Seiten im Standardformat A4 + +## Anwendungsfälle + +- Eine leere Trennseite zwischen Abschnitten eines zusammengestellten Dokuments einfügen +- Leere Seiten für die korrekte Ausrichtung beim doppelseitigen Druck einfügen +- Platz für handschriftliche Notizen in einem gedruckten Lernleitfaden schaffen +- Ein Dokument auffüllen, um eine Mindestseitenzahl zu erreichen + +## Tipps + +- Position `0` fügt vor der ersten Seite ein. Eine Position gleich der Gesamtseitenzahl fügt nach der letzten Seite an. +- Wenn Sie Inhalte (nicht nur leere Seiten) an einer bestimmten Position einfügen möchten, nutzen Sie das [PDF-Multitool](./pdf-multi-tool), um ein weiteres PDF nach einer bestimmten Seite einzufügen. + +## Verwandte Werkzeuge + +- [Organisieren & Duplizieren](./organize-pdf) +- [PDF-Multitool](./pdf-multi-tool) +- [PDF zusammenführen](./merge-pdf) diff --git a/docs/de/tools/add-page-labels.md b/docs/de/tools/add-page-labels.md new file mode 100644 index 00000000..dfa082d5 --- /dev/null +++ b/docs/de/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Seitenbeschriftungen hinzufügen +description: Fügen Sie PDF-Seitenbezeichnungen mit römischen Ziffern, Buchstabenpräfixen, eigener Nummerierung und mehreren Regeln pro Dokument hinzu. +--- + +# Seitenbeschriftungen hinzufügen + +Seitenbezeichnungen legen fest, wie Seitenzahlen in PDF-Viewern angezeigt werden (die Zahl in der Symbolleiste, nicht auf der Seite aufgedruckt). Mit diesem Werkzeug können Sie verschiedenen Seitenbereichen unterschiedliche Bezeichnungsschemata zuweisen: römische Ziffern für den Vorspann, Dezimalzahlen für den Hauptteil, Anhänge mit Buchstaben und mehr. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Das Optionsfeld erscheint mit einer Bezeichnungsregel als Standard. +3. Konfigurieren Sie jede Regel mit Seitenbereich, Stil, optionalem Präfix und Startwert. +4. Klicken Sie auf **Regel hinzufügen**, um weitere Regeln für andere Abschnitte zu erstellen. +5. Klicken Sie auf **Seitenbezeichnungen hinzufügen**, um alle Regeln anzuwenden und das Ergebnis herunterzuladen. + +## Optionen + +Jede Bezeichnungsregel hat diese Einstellungen: + +- **Seitenbereich** -- Auf welche Seiten die Regel angewendet wird. Leer lassen für alle Seiten. Unterstützt Bereiche wie `1-4`, `7`, `odd` oder `1-9,30-40`. +- **Bezeichnungsstil** -- Dezimale arabische Ziffern, römische Kleinbuchstaben (i, ii, iii), römische Großbuchstaben (I, II, III), Kleinbuchstaben (a, b, c), Großbuchstaben (A, B, C) oder keine Bezeichnung (nur Präfix). +- **Bezeichnungspräfix** -- Optionaler Text, der jeder Bezeichnung vorangestellt wird, etwa "A-", um Bezeichnungen wie A-1, A-2, A-3 zu erzeugen. +- **Startwert** -- Die Zahl, ab der gezählt wird. Standard ist 1. Auf 0 setzen für eine bei null beginnende Nummerierung. +- **Nummerierung über getrennte Bereiche fortsetzen** -- Aktivieren Sie dies, wenn eine Regel nicht zusammenhängende Seiten betrifft (wie `1-9,30-40` oder `odd`) und die Nummerierung fortlaufend weitergehen soll. +- **Vorhandene Seitenbezeichnungen entfernen** -- Standardmäßig aktiviert. Löscht alle früheren Bezeichnungen, bevor Ihre neuen Regeln angewendet werden. + +## Funktionen + +- Mehrere Bezeichnungsregeln pro Dokument für komplexe Nummerierungsschemata +- Sechs Bezeichnungsstile für alle gängigen Nummerierungssysteme +- Eigene Präfixe für abschnittsbasierte Bezeichnungen +- Unterstützung getrennter Bereiche mit fortlaufender Nummerierung +- Vorhandene Bezeichnungen wahlweise beibehalten oder entfernen + +## Anwendungsfälle + +- Römische Ziffern (i, ii, iii) für das Vorwort eines Buchs und Dezimalzahlen für den Haupttext festlegen +- Anhangseiten mit Buchstabenpräfixen wie "A-1", "A-2", "B-1", "B-2" bezeichnen +- Seitenbezeichnungen in einem gescannten Dokument korrigieren, in dem die gedruckten Seitenzahlen nicht zur PDF-Seitenreihenfolge passen +- Bei null beginnende Nummerierung für technische Dokumente hinzufügen + +## Tipps + +- Seitenbezeichnungen sind Metadaten, die PDF-Viewer in ihrer Navigationsleiste anzeigen. Sie werden nicht auf die Seite gedruckt. Für sichtbare Zahlen nutzen Sie [Seitenzahlen](./page-numbers). +- Dieses Werkzeug erfordert, dass CoherentPDF (CPDF) in Ihren WASM-Einstellungen konfiguriert ist. Falls nicht, werden Sie aufgefordert, es einzurichten. + +## Verwandte Werkzeuge + +- [Seitenzahlen](./page-numbers) +- [Bates-Nummerierung](./bates-numbering) +- [Lesezeichen bearbeiten](./bookmark) diff --git a/docs/de/tools/add-stamps.md b/docs/de/tools/add-stamps.md new file mode 100644 index 00000000..2debbf46 --- /dev/null +++ b/docs/de/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Stempel hinzufügen +description: Fügen Sie Ihren PDF-Seiten Bildstempel hinzu, mit integrierter Annotations-Symbolleiste und Benutzernamen als Zuordnung. +--- + +# Stempel hinzufügen + +Platzieren Sie Bildstempel auf Ihren PDF-Seiten mit einem eingebetteten Viewer samt Symbolleiste für Stempel-Annotationen. Stempel können Ihren Namen zur Zuordnung enthalten, das ist nützlich für Freigabe-Workflows, Prüfprozesse und die Kennzeichnung von Dokumenten. + +## So funktioniert es + +1. Geben Sie Ihren Namen in das Feld **Stempel-Benutzername** ein. Dieser Name erscheint auf den Stempeln, die Sie erstellen. +2. Laden Sie Ihre PDF-Datei hoch, indem Sie auf die Ablagefläche klicken oder die Datei dorthin ziehen. +3. Der Stempel-Editor öffnet sich mit Ihrem Dokument im Viewer. +4. Wählen Sie mit dem Bildstempel-Werkzeug der Symbolleiste Stempel aus und platzieren Sie sie auf einer beliebigen Seite. +5. Positionieren Sie die Stempel und änderen Sie ihre Größe nach Bedarf. +6. Klicken Sie auf **Gestempeltes PDF speichern**, um das Ergebnis herunterzuladen. + +## Funktionen + +- Integrierter PDF-Viewer mit spezieller Annotations-Symbolleiste für Stempel +- Zuordnung über den Benutzernamen auf erstellten Stempeln +- Bildstempel auf jeder Seite platzieren +- Positionieren und Skalieren per Drag-and-drop +- Automatische Viewer-Größe basierend auf dem Seitenverhältnis +- Dateianzeige mit Name und Größe + +## Anwendungsfälle + +- "GENEHMIGT"- oder "GEPRÜFT"-Bildstempel in einem Prüf-Workflow auf Dokumente setzen +- Firmensiegel oder Notarstempel als Bild auf offizielle Dokumente setzen +- Seiten mit "ERHALTEN"-Stempeln samt Namen der prüfenden Person markieren +- Qualitätskontrollstempel zu Prüfberichten hinzufügen + +## Tipps + +- Legen Sie Ihren Stempel-Benutzernamen fest, bevor Sie das PDF hochladen. Der Benutzername wird in den Stempel-Metadaten gespeichert. +- Der Viewer passt seine Höhe an das Seitenverhältnis der ersten PDF-Seite an, für eine optimale Darstellung. +- Für textbasierte Wasserzeichen statt Bildstempeln nutzen Sie das Werkzeug [Wasserzeichen hinzufügen](./add-watermark). + +## Verwandte Werkzeuge + +- [PDF unterschreiben](./sign-pdf) +- [Wasserzeichen hinzufügen](./add-watermark) +- [PDF-Editor](./edit-pdf) diff --git a/docs/de/tools/add-watermark.md b/docs/de/tools/add-watermark.md new file mode 100644 index 00000000..a252142f --- /dev/null +++ b/docs/de/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Wasserzeichen hinzufügen +description: Setzen Sie Text- oder Bild-Wasserzeichen auf PDF-Seiten, mit visuellem Drag-and-drop-Editor und Live-Vorschau. +--- + +# Wasserzeichen hinzufügen + +Fügen Sie Ihren PDF-Seiten Text- oder Bild-Wasserzeichen mit einem visuellen Editor hinzu. Sie positionieren das Wasserzeichen direkt in der Vorschau per Ziehen, ändern die Größe über die Eckgriffe und stellen Deckkraft, Drehung, Schriftart und Farbe ein. Jede Seite kann eine eigene Wasserzeichenposition haben, oder Sie wenden dasselbe Wasserzeichen auf alle Seiten gleichzeitig an. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Der Editor öffnet sich mit einer Live-Vorschau der ersten Seite und einem verschiebbaren Wasserzeichen-Overlay. +3. Wählen Sie mit den Umschaltflächen zwischen dem Modus **Text** und **Bild**. +4. Konfigurieren Sie die Wasserzeicheneinstellungen im Seitenbereich. +5. Ziehen Sie das Wasserzeichen in der Vorschau genau an die gewünschte Stelle. Änderen Sie die Größe über die Eckgriffe. +6. Wechslen Sie zwischen den Seiten, um Wasserzeichen pro Seite festzulegen, oder lassen Sie **Auf alle Seiten anwenden** aktiviert. +7. Klicken Sie auf **Wasserzeichen hinzufügen**, um zu verarbeiten und herunterzuladen. + +## Optionen + +**Einstellungen für Text-Wasserzeichen:** + +- **Text** -- Der Wasserzeichentext (z. B. "VERTRAULICH", "ENTWURF"). +- **Schriftgröße** -- Von 10 bis 200 Punkt. Standard ist 72. +- **Farbe** -- Beliebige Farbe über die Farbauswahl. +- **Deckkraft** -- Steuere die Transparenz von vollständig transparent bis vollständig deckend. +- **Drehung** -- Drehe den Wasserzeichentext von -180 bis 180 Grad. + +**Einstellungen für Bild-Wasserzeichen:** + +- **Bild hochladen** -- Laden Sie eine PNG-, JPG- oder andere Bilddatei als Wasserzeichen hoch. +- **Deckkraft** -- Steuere die Transparenz des Bildes. +- **Skalierung** -- Änderen Sie die Größe des Bild-Wasserzeichens. + +**Layout-Einstellungen:** + +- **Einzeln** -- Ein Wasserzeichen pro Seite, positioniert per Ziehen oder mit den Positionsvorgaben. +- **Gekachelt** -- Wiederholt das Wasserzeichen auf der gesamten Seite in einem diagonalen Raster, das dem Drehwinkel folgt, sodass die Markierung das Dokument von Rand zu Rand abdeckt. +- **Horizontaler Abstand** -- Abstand zwischen den Kacheln entlang der Textrichtung, als Prozentsatz der Wasserzeichenbreite (nur im gekachelten Modus). +- **Vertikaler Abstand** -- Abstand zwischen den Kachelreihen, als Prozentsatz der Wasserzeichenhöhe (nur im gekachelten Modus). + +**Allgemeine Einstellungen:** + +- **Auf alle Seiten anwenden** -- Wenn aktiviert, gilt dasselbe Wasserzeichen für jede Seite. Deaktivieren Sie es, um einzelne Wasserzeichen pro Seite festzulegen. +- **Seitenbereich** -- Legen Sie fest, welche Seiten das Wasserzeichen erhalten (z. B. "1-3, 5, 7-9" oder "all"). + +## Funktionen + +- Visuelle Positionierung per Drag-and-drop in einer Live-PDF-Vorschau +- Größenveränderbares Wasserzeichen mit Eckgriffen +- Text- und Bildmodus für Wasserzeichen +- Einzelnes oder seitenfüllend gekacheltes (wiederholtes) Layout mit einstellbarem Abstand +- Wasserzeichen pro Seite oder global anwenden +- Seitenweise Navigation in der Vorschau +- Regler für Deckkraft und Drehung +- Filterung nach Seitenbereich + +## Anwendungsfälle + +- Entwürfe vor der Weitergabe zur Prüfung mit "ENTWURF" markieren +- "VERTRAULICH"-Wasserzeichen auf sensible Finanzberichte setzen +- Dokumente mit einem Firmenlogo als Bild-Wasserzeichen versehen +- "MUSTER" auf Produktdokumentation stempeln, die an Interessenten weitergegeben wird +- Urheberrechtshinweise zu verteilten PDF-Materialien hinzufügen + +## Tipps + +- Für diagonale Wasserzeichen über die Seite stellen Sie eine Drehung von etwa 45 Grad ein und erhöhen Sie die Schriftgröße. +- Der gekachelte Modus erschwert die Wiederverwendung eines Dokuments nach dem Zuschneiden erheblich, da nach dem Entfernen einer Markierung noch Dutzende übrig bleiben. Verringeren Sie beim Kacheln die Deckkraft, damit der darunterliegende Text lesbar bleibt. +- Bild-Wasserzeichen mit transparentem Hintergrund (PNG-Format) fügen sich natürlicher in den Dokumentinhalt ein. +- Wenn Sie auf verschiedenen Seiten unterschiedlichen Wasserzeichentext brauchen, deaktivieren Sie "Auf alle Seiten anwenden" und gehen Sie Seite für Seite vor. + +## Verwandte Werkzeuge + +- [Kopf- & Fußzeile](./header-footer) +- [Stempel hinzufügen](./add-stamps) +- [Bates-Nummerierung](./bates-numbering) +- [PDF unterschreiben](./sign-pdf) diff --git a/docs/de/tools/adjust-colors.md b/docs/de/tools/adjust-colors.md new file mode 100644 index 00000000..36571bd1 --- /dev/null +++ b/docs/de/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Farben anpassen +description: Passen Sie Helligkeit, Kontrast, Sättigung, Farbton, Temperatur, Tönung, Gamma und Sepia in Ihrem PDF fein an. +--- + +# Farben anpassen + +Ein vollständiges Farbkorrektur-Werkzeug für PDFs. Passen Sie acht unabhängige Parameter an (Helligkeit, Kontrast, Sättigung, Farbtonverschiebung, Temperatur, Tönung, Gamma und Sepia) mit einer Live-Vorschau, die sich bei jeder Reglerbewegung aktualisiert. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Der Editor öffnet sich mit einer Vorschau der ersten Seite und einem Bereich für die Farbeinstellungen. +3. Bewegen Sie die Regler, um jeden Farbparameter anzupassen. Die Vorschau aktualisiert sich in Echtzeit. +4. Klicken Sie auf **Zurücksetzen**, um alle Regler auf ihre Standardpositionen zurückzusetzen. +5. Klicken Sie auf **Anwenden**, um alle Seiten zu verarbeiten und das angepasste PDF herunterzuladen. + +## Optionen + +- **Helligkeit** -- Die gesamte Seite aufhellen oder abdunkeln (-100 bis +100). +- **Kontrast** -- Den Unterschied zwischen hellen und dunklen Bereichen erhöhen oder verringern (-100 bis +100). +- **Sättigung** -- Farbintensität verstärken oder verringern (-100 bis +100). Bei -100 entsteht ein Graustufen-Ergebnis. +- **Farbtonverschiebung** -- Das Farbrad drehen, um alle Farben gleichmäßig zu verschieben. +- **Temperatur** -- Farben wärmer (gelb/orange) oder kühler (blau) verschieben. +- **Tönung** -- Einen Grün- oder Magenta-Stich hinzufügen. +- **Gamma** -- Die Helligkeit der Mitteltöne über eine Gammakurve anpassen. Werte unter 1,0 dunkeln Mitteltöne ab, Werte über 1,0 hellen sie auf. +- **Sepia** -- Einen klassischen Sepia-Effekt anwenden. Höhere Werte erzeugen einen stärkeren Braunton. + +## Funktionen + +- Acht unabhängig einstellbare Farbparameter +- Live-Vorschau, die sofort auf Regleränderungen reagiert +- Zurücksetzen-Schaltfläche, um schnell zu den Standardwerten zurückzukehren +- Verarbeitet alle Seiten im Dokument +- Funktioniert mit jedem PDF-Inhalt (Text, Bilder, Grafiken) + +## Anwendungsfälle + +- Einen dunklen Scan aufhellen oder überbelichtete Seiten korrigieren +- Ein farbiges Dokument entsättigen, um vor dem Druck Tinte zu sparen +- Einen Sepia-Ton anwenden, um Urkunden oder Auszeichnungen einen antiken Look zu geben +- Die Farbtemperatur von in ein PDF eingebetteten Fotos korrigieren +- Den Kontrast bei verblassten oder minderwertigen gescannten Dokumenten erhöhen + +## Tipps + +- Für eine schnelle Umwandlung in Graustufen ziehen Sie den Sättigungsregler ganz auf -100. +- Der Gamma-Regler ist besonders nützlich, um die Lesbarkeit gescannter Dokumente zu verbessern, bei denen die Mitteltöne zu dunkel oder zu hell sind. +- Wie die anderen Bildeffekt-Werkzeuge rastert dieses jede Seite. Die Ausgabe ist bildbasiert, daher ist der Text nicht auswählbar. + +## Verwandte Werkzeuge + +- [Farben invertieren](./invert-colors) +- [Scanner-Effekt](./scanner-effect) +- [Hintergrundfarbe](./background-color) diff --git a/docs/de/tools/alternate-merge.md b/docs/de/tools/alternate-merge.md new file mode 100644 index 00000000..533a49e2 --- /dev/null +++ b/docs/de/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Seiten abwechselnd mischen +description: Führen Sie PDFs zusammen, indem die Seiten jeder Datei abwechselnd verschachtelt werden, mit Beibehaltung der Lesezeichen. +--- + +# Seiten abwechselnd mischen + +Verschachtelen Sie die Seiten mehrerer PDF-Dateien so, dass sich die Seiten der Dokumente abwechseln. Dieses Werkzeug brauchen Sie, wenn ein normales Zusammenführen die Dateien nur hintereinanderhängen würde, Sie aber Seite 1 von Datei A, dann Seite 1 von Datei B, dann Seite 2 von Datei A und so weiter brauchen. + +## So funktioniert es + +1. Laden Sie mindestens zwei PDF-Dateien über die Ablagefläche hoch. +2. Das Werkzeug zeigt jede Datei mit Seitenzahl und Dateigröße an. +3. Ziehen Sie an den Griffen, um die Reihenfolge festzulegen, welche Datei in der Verschachtelung zuerst kommt. +4. Klicken Sie auf **Seiten mischen**, um die verschachtelte Ausgabe zu erzeugen. +5. Das Ergebnis wird als `alternated-mixed.pdf` heruntergeladen. + +## Funktionen + +- Verschachtelt Seiten über beliebig viele PDFs (mindestens zwei) +- Dateien per Drag-and-drop neu anordnen, um die Verschachtelungspriorität zu steuern +- Behält Lesezeichen der Quelldokumente bei +- Zeigt Seitenzahl und Dateigröße jeder hochgeladenen Datei an +- Verarbeitung über einen eigenen Web Worker für eine reaktionsfähige Oberfläche + +## Anwendungsfälle + +- Doppelseitige Scans wieder zusammensetzen, bei denen ungerade und gerade Seiten getrennt gescannt wurden +- Aufgabenblätter mit Lösungsschlüsseln kombinieren, sodass auf jede Frage direkt die Antwort folgt +- Zweisprachige Dokumente Seite für Seite zusammenführen (z. B. Englisch auf einer Seite, Übersetzung auf der nächsten) +- Vorder- und Rückseiten-Scans eines Einzelseiten-Scanners verschachteln + +## Tipps + +- Wenn Ihre Quell-PDFs unterschiedlich viele Seiten haben, gehen die Seiten des kürzeren Dokuments zuerst aus, und die übrigen Seiten des längeren Dokuments erscheinen am Ende. +- Die Dateireihenfolge ist wichtig: Die erste Datei in der Liste liefert die erste Seite der Ausgabe. Ziehen Sie die Dateien bei Bedarf um. + +## Verwandte Werkzeuge + +- [PDF zusammenführen](./merge-pdf) +- [Organisieren & Duplizieren](./organize-pdf) +- [PDF teilen](./split-pdf) diff --git a/docs/de/tools/background-color.md b/docs/de/tools/background-color.md new file mode 100644 index 00000000..a29d2c42 --- /dev/null +++ b/docs/de/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Hintergrundfarbe +description: Änderen Sie die Hintergrundfarbe jeder Seite Ihres PDFs und behalten Sie dabei alle Inhalte darüber bei. +--- + +# Hintergrundfarbe + +Legen Sie hinter allen vorhandenen Inhalten Ihres PDFs eine einfarbige Hintergrundfarbe fest. Das Werkzeug erstellt auf jeder Seite ein farbiges Rechteck und legt den ursprünglichen Inhalt darüber, sodass Text, Bilder und Grafiken vor dem neuen Hintergrund vollständig sichtbar bleiben. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Wählen Sie mit der Farbauswahl eine Hintergrundfarbe. Standard ist ein helles Gelb (#FFFFCC). +3. Klicken Sie auf **Hintergrundfarbe ändern**, um zu verarbeiten. +4. Das aktualisierte PDF wird automatisch heruntergeladen. + +## Optionen + +- **Hintergrundfarbe** -- Eine Standard-Farbauswahl für jede beliebige einfarbige Farbe. Standard ist helles Gelb. + +## Funktionen + +- Wendet eine einheitliche Hintergrundfarbe auf jede Seite an +- Behält alle ursprünglichen Inhalte (Text, Bilder, Vektorgrafiken) über der Farbschicht bei +- Behält die ursprünglichen Seitenabmessungen bei +- Funktioniert mit Dokumenten beliebiger Seitenzahl + +## Anwendungsfälle + +- Einen hellen Creme- oder Elfenbeinhintergrund hinzufügen, damit Dokumente weicher und papierähnlicher wirken +- Dokumentensätze farblich kennzeichnen, indem verschiedenen Kategorien unterschiedliche Hintergrundfarben zugewiesen werden +- Optisch unterscheidbare Versionen desselben Dokuments für verschiedene Zielgruppen erstellen +- Eine helle Hintergrundtönung hinzufügen, um die Lesbarkeit bei der Projektion von Dokumenten auf einen Bildschirm zu verbessern + +## Tipps + +- Helle, gedeckte Farben funktionieren am besten. Ein sehr dunkler Hintergrund kann Text schwer lesbar machen, sofern der Text nicht bereits hell ist. +- Wenn Sie sowohl Hintergrund- als auch Textfarbe ändern möchten, wenden Sie zuerst die Hintergrundfarbe an und nutzen Sie dann [Textfarbe ändern](./text-color) auf das Ergebnis. +- Dieses Werkzeug arbeitet auf der strukturellen PDF-Ebene (ohne Rasterung), daher bleibt der Text in der Ausgabe auswählbar und durchsuchbar. + +## Verwandte Werkzeuge + +- [Textfarbe ändern](./text-color) +- [Farben invertieren](./invert-colors) +- [Farben anpassen](./adjust-colors) diff --git a/docs/de/tools/bates-numbering.md b/docs/de/tools/bates-numbering.md new file mode 100644 index 00000000..4ff2fcb2 --- /dev/null +++ b/docs/de/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates-Nummerierung +description: Wenden Sie Bates-Nummern auf ein oder mehrere PDFs an, mit anpassbaren Vorlagen, Auffüllung, Schriftarten und Positionierung. +--- + +# Bates-Nummerierung + +Die Bates-Nummerierung stempelt fortlaufende Kennungen auf jede Seite Ihrer PDFs. Sie ist die Standardmethode zur Kennzeichnung von Dokumenten in Gerichtsverfahren, Prüfungen und Compliance-Workflows. Dieses Werkzeug unterstützt mehrere Dateien und anpassbare Vorlagen und erzeugt einzeln nummerierte PDFs oder ein einzelnes ZIP-Archiv. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. Sie können mehrere Dateien gleichzeitig hineinziehen. +2. Wählen Sie eine Stilvorlage oder erstellen Sie eine eigene Vorlage. +3. Konfigurieren Sie Position, Schriftart, Größe, Farbe und Startnummern. +4. Klicken Sie auf **Bates-Nummern anwenden**, um zu verarbeiten. +5. Eine einzelne Datei wird direkt heruntergeladen. Mehrere Dateien werden als ZIP-Archiv heruntergeladen. + +## Optionen + +- **Stilvorlage** -- Wählen Sie aus eingebauten Formaten: + - Exhibit + Case + Bates + Page (z. B. "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (ohne Seitenzahl) + - Case + Bates + - Nur Bates-Nummer (z. B. "000001") + - Benutzerdefiniert (eigene Vorlage schreiben) +- **Stil anpassen** -- Eine Vorlagenzeichenfolge mit Platzhaltern: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Bates-Auffüllung** -- Anzahl der Stellen (3 bis 6) für mit Nullen aufgefüllte Bates-Nummern. Nur im benutzerdefinierten Modus sichtbar. +- **Position** -- Kopf- oder Fußzeile, links, mittig oder rechts. +- **Bates beginnt bei** -- Die erste Bates-Nummer. Standard ist 1. Die Nummerierung wird über Dateien hinweg fortgesetzt. +- **Dateizähler beginnt bei** -- Die Startnummer für den Platzhalter `[FILE]`. +- **Schriftart** -- Helvetica, Times New Roman oder Courier. +- **Schriftgröße** -- Größe des gestempelten Texts. +- **Farbe** -- Farbauswahl für den Text der Bates-Nummer. + +## Funktionen + +- Live-Vorschau, die zeigt, wie die Bates-Nummern über alle hochgeladenen Dateien aussehen werden +- Unterstützung mehrerer Dateien mit durchgehender Nummerierung über Dokumente hinweg +- Dateien per Drag-and-drop in der Liste umsortieren, um die Nummerierungsreihenfolge zu steuern +- Sechs Positionsoptionen (Kopf-/Fußzeile, links/mittig/rechts) +- Adaptive Randberechnung, die unterschiedliche Seitengrößen berücksichtigt +- ZIP-Ausgabe für Stapel mit mehreren Dateien +- Vorlagenplatzhalter für maximale Flexibilität + +## Anwendungsfälle + +- Offenlegungsdokumente für Rechtsstreitigkeiten mit fortlaufenden Exhibit-Nummern stempeln +- Prüfungsnachweispakete nummerieren, die sich über Dutzende Dateien erstrecken +- Regulatorische Referenznummern auf Compliance-Dokumentation anwenden +- Exhibits von Patentanmeldungen mit fallbezogenen Kennungen versehen + +## Tipps + +- Ziehen Sie die Dateien in der Dateiliste, um sie vor der Verarbeitung umzusortieren. Die Bates-Nummerierung folgt dieser Reihenfolge. +- Verwenden Sie den Platzhalter `[FILENAME]`, um den ursprünglichen Dateinamen in den Stempel aufzunehmen. So lassen sich Seiten zu den Quelldokumenten zurückverfolgen. +- Das Vorschaufeld aktualisiert sich in Echtzeit, wenn Sie Einstellungen ändern, sodass Sie das Format vor der Verarbeitung prüfen können. + +## Verwandte Werkzeuge + +- [Seitenzahlen](./page-numbers) +- [Seitenbezeichnungen hinzufügen](./add-page-labels) +- [Kopf- & Fußzeile](./header-footer) diff --git a/docs/de/tools/bmp-to-pdf.md b/docs/de/tools/bmp-to-pdf.md new file mode 100644 index 00000000..e51939f2 --- /dev/null +++ b/docs/de/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP zu PDF +description: Konvertieren Sie BMP-Bitmap-Bilder direkt im Browser in das PDF-Format, ohne Upload auf einen Server. +--- + +# BMP zu PDF + +Konvertieren Sie Windows-Bitmap-Dateien (BMP) in PDF. BMP ist ein unkomprimiertes Bildformat, das noch in Altsystemen, der medizinischen Bildgebung und bei Industrie-Scannern zu finden ist. Dieses Werkzeug wandelt sie in PDF um, ohne dass Sie etwas installieren müssen. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :----- | :------------ | +| BMP | `.bmp` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre BMP-Dateien hinein. +2. Prüfen Sie die Dateiliste. Fügen Sie weitere Dateien hinzu oder entfernen Sie unerwünschte. +3. Klicken Sie auf **In PDF konvertieren**. Die Ausgabe wird als `from_bmps.pdf` heruntergeladen. + +Jede BMP wird auf ein Canvas gezeichnet, als PNG exportiert und dann mit pdf-lib in das PDF eingebettet. Die Seitengröße entspricht den ursprünglichen Bildabmessungen. + +## Optionen + +Dieses Werkzeug bietet keine zusätzlichen Qualitätseinstellungen. Bilder werden in ihrer ursprünglichen Auflösung als verlustfreies PNG im PDF eingebettet. + +## Anwendungsfälle + +- Ältere gescannte Dokumente, die als BMP gespeichert sind, in Archiv-PDFs umwandeln +- BMP-Screenshots älterer Windows-Anwendungen in teilbare Dokumente verwandeln +- Ausgaben von medizinischen oder industriellen Scannern verarbeiten, die standardmäßig BMP erzeugen +- Alte Bildarchive in ein portableres Format überführen + +## Tipps + +- BMP-Dateien sind unkomprimiert und daher oft groß. Das resultierende PDF ist deutlich kleiner, da die Bilder intern als PNG neu kodiert werden. +- Wenn Sie BMP-Dateien zusammen mit anderen Bildformaten haben, nutzen Sie das Werkzeug [Bilder zu PDF](./image-to-pdf), um alles in einem Stapel zu konvertieren. + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [PNG zu PDF](./png-to-pdf) +- [TIFF zu PDF](./tiff-to-pdf) diff --git a/docs/de/tools/bookmark.md b/docs/de/tools/bookmark.md new file mode 100644 index 00000000..61e88379 --- /dev/null +++ b/docs/de/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Lesezeichen bearbeiten +description: Fügen Sie PDF-Lesezeichen hinzu, bearbeiten Sie, importiere, exportieren Sie und löschen Sie sie mit einem visuellen Editor und CSV/JSON-Unterstützung. +--- + +# Lesezeichen bearbeiten + +Der Lesezeichen-Editor gibt Ihnen volle Kontrolle über die Navigationslesezeichen einer PDF (auch Gliederung genannt). Sie können neue Lesezeichen hinzufügen, vorhandene bearbeiten, die Hierarchie umordnen und Lesezeichendaten im CSV- und JSON-Format importieren oder exportieren. + +## So funktioniert es + +1. Laden Sie Ihre PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei hineinziehen. +2. Aktivieren Sie optional **Vorhandene Lesezeichen automatisch extrahieren**, um die aktuelle Lesezeichenstruktur des Dokuments zu übernehmen. +3. Der Editor öffnet sich in geteilter Ansicht: PDF-Viewer links, Lesezeichen-Bereich rechts. +4. Geben Sie einen Lesezeichentitel ein und klicken Sie auf **Zur Seite hinzufügen**, um ein neues Lesezeichen für die aktuelle Seite zu erstellen. +5. Mit den Schaltflächen der Symbolleiste können Sie Lesezeichen verschieben, formatieren oder löschen. +6. Klicken Sie auf **PDF mit Lesezeichen speichern**, um die aktualisierte Datei herunterzuladen. + +## Funktionen + +- Visueller PDF-Viewer mit Seitennavigation, Zoom und Eingabefeld zum Springen zu einer Seite +- Lesezeichen mit einem Klick zu jeder Seite hinzufügen +- Direkt in die PDF klicken, um ein exaktes Lesezeichenziel zu setzen (Auswahlmodus) +- Verschachtelte Lesezeichenhierarchie mit Neuordnung per Drag-and-drop +- Stapelvorgänge: mehrere Lesezeichen auswählen und Farbe oder Stil ändern oder alle auf einmal löschen +- Lesezeichensuche, um Einträge in großen Strukturen schnell zu finden +- Rückgängig und Wiederherstellen für alle Änderungen +- Lesezeichen aus CSV-Dateien (Titel, Seite, Ebene) oder JSON-Dateien importieren +- Lesezeichen für die externe Bearbeitung als CSV oder JSON exportieren +- Lesezeichenformatierung: Farbe (rot, blau, grün, gelb, violett) und Schriftstil (fett, kursiv, fett kursiv) +- Schnelle Navigation: mit den Tasten Bild auf/Bild ab durch die Seiten blättern + +## Optionen + +- **Vorhandene Lesezeichen automatisch extrahieren**: Wenn aktiviert, liest das Werkzeug die aktuellen Lesezeichen der PDF beim Laden aus und zeigt sie an. +- **Stapelmodus**: Schalten Sie ihn ein, um mehrere Lesezeichen auszuwählen und Farbe, Stil oder Löschen gesammelt anzuwenden. +- **Alle ein-/ausklappen**: Verschachtelte untergeordnete Lesezeichen schnell ein- oder ausblenden. + +## Anwendungsfälle + +- Ein Inhaltsverzeichnis zu einem Lehrbuch oder Handbuch ohne Lesezeichen hinzufügen +- Lesezeichen in einem gescannten Dokument nach der OCR-Verarbeitung neu strukturieren +- Lesezeichen als CSV exportieren, in einer Tabellenkalkulation bearbeiten und wieder importieren +- Automatisch erzeugte Lesezeichen mit falschen Seitenverweisen bereinigen +- Farbige Lesezeichen hinzufügen, um wichtige Abschnitte in einem Schriftsatz zu markieren + +## Tipps + +- Nutzen Sie den CSV-Import für das Erstellen vieler Lesezeichen. Das Format ist einfach: `title,page,level`, wobei Ebene 1 die oberste Ebene ist. +- Im Auswahlmodus können Sie eine exakte Stelle auf der PDF-Seite anklicken, um das Lesezeichenziel zu setzen. Das ist genauer als nur eine Seitenzahl anzugeben. +- Exportieren Sie Ihre Lesezeichen vor größeren Änderungen, damit Sie eine Sicherung haben. + +## Verwandte Werkzeuge + +- [Inhaltsverzeichnis](./table-of-contents) +- [PDF-Editor](./edit-pdf) +- [Seitenbeschriftungen hinzufügen](./add-page-labels) diff --git a/docs/de/tools/cbz-to-pdf.md b/docs/de/tools/cbz-to-pdf.md new file mode 100644 index 00000000..71ca7796 --- /dev/null +++ b/docs/de/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ zu PDF +description: Wandlen Sie CBZ- und CBR-Comicarchive in Ihrem Browser in PDF um. Kostenlos, privat, kein Upload nötig. +--- + +# CBZ zu PDF + +Verwandlen Sie Comic-Archivdateien in PDFs. CBZ und CBR sind die Standardformate für digitale Comics: Es sind einfach ZIP- oder RAR-Archive voller Bilder. Dieses Werkzeug extrahiert jede Seite, behält die Lesereihenfolge bei und erzeugt eine saubere PDF, in der jedes Bild zu einer Seite in voller Größe wird. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----- | :---------- | :-------------------------------------------------------------- | +| CBZ | `.cbz` | ZIP-basiertes Comicarchiv (lokal mit pdf-lib verarbeitet) | +| CBR | `.cbr` | RAR-basiertes Comicarchiv (über die PyMuPDF-Engine verarbeitet) | + +Der CBZ-Konverter erkennt JPEG-, PNG-, GIF-, BMP-, WebP-, AVIF-, TIFF-, HEIC- und JXL-Bilder im Archiv. Nicht standardmäßige Formate werden vor dem Einbetten automatisch in PNG umgewandelt. + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre CBZ- oder CBR-Dateien hinein. Sie können beide Formate in einem Stapel mischen. +2. Prüfen Sie die aufgelisteten Dateien. Entfernen Sie nicht benötigte oder klicken Sie auf **Weitere Dateien hinzufügen**, um mehr hinzuzufügen. +3. Klicken Sie auf **In PDF umwandeln**. Bei CBZ-Dateien entpackt das Werkzeug das Archiv, sortiert die Bilddateien in natürlicher Reihenfolge nach Namen, erkennt das tatsächliche Format jedes Bildes und bettet sie mit pdf-lib in eine PDF ein. CBR-Dateien laufen stattdessen über die PyMuPDF-Engine. +4. Eine einzelne Datei wird als PDF heruntergeladen. Bei mehreren Dateien entsteht ein ZIP-Archiv namens `comic-converted.zip`. + +## Optionen + +Es ist keine Konfiguration nötig. Jedes Bild wird zu einer Seite in der Größe des Originals, sodass Doppelseiten breit und Einzelseiten schmal bleiben. + +## Anwendungsfälle + +- Comics auf einem Tablet oder in einer Handy-App lesen, die PDF, aber nicht CBZ/CBR unterstützt +- Bestimmte Seiten eines digitalen Comics drucken +- Eine Comicsammlung in einem Format archivieren, das jeder Dateibetrachter öffnen kann +- Einen Comic mit jemandem teilen, der keinen speziellen Comic-Reader hat + +## Tipps + +- Bilder im Archiv werden in natürlicher Reihenfolge sortiert (`page2.jpg` kommt also vor `page10.jpg`). Benennen Sie Ihre Dateien mit einheitlicher Nummerierung, damit die Seitenreihenfolge stimmt. +- Der Konverter erkennt Bildformate anhand ihrer binären Signatur, nicht anhand der Dateiendung. Eine PNG-Datei, die versehentlich `.jpg` heißt, wird trotzdem korrekt eingebettet. +- CBZ-Dateien werden vollständig im Browser verarbeitet, ohne die PyMuPDF-Engine zu laden, und werden daher schneller umgewandelt als CBR-Dateien. + +## Verwandte Werkzeuge + +- [EPUB zu PDF](./epub-to-pdf) +- [MOBI zu PDF](./mobi-to-pdf) +- [Bilder zu PDF](./image-to-pdf) diff --git a/docs/de/tools/change-permissions.md b/docs/de/tools/change-permissions.md new file mode 100644 index 00000000..39802aa8 --- /dev/null +++ b/docs/de/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Berechtigungen ändern +description: Legen Sie PDF-Nutzungsberechtigungen für Drucken, Kopieren, Bearbeiten und Kommentieren fest oder änderen Sie sie. Verwendet 256-Bit-AES-Verschlüsselung. +--- + +# Berechtigungen ändern + +Legen Sie genau fest, was Empfänger mit Ihrer PDF tun dürfen. Anders als einfache Verschlüsselung, die die Datei nur hinter einem Passwort sperrt, können Sie hier Drucken, Kopieren, Bearbeiten, Kommentieren, Formularausfüllen, Dokumentenzusammenstellung und Seitenextraktion gezielt erlauben oder verbieten. Alles wird durch 256-Bit-AES-Verschlüsselung durchgesetzt. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Ist die PDF bereits verschlüsselt, geben Sie das **Aktuelle Passwort** ein. +3. Legen Sie ein **Neues Benutzerpasswort** (zum Öffnen erforderlich) und/oder ein **Neues Besitzerpasswort** (steuert die Berechtigungen) fest. +4. Schalten Sie einzelne Berechtigungen über die Kontrollkästchen ein oder aus. +5. Klicken Sie auf **Berechtigungen ändern**. +6. Laden Sie die aktualisierte PDF herunter. + +Wenn Sie beide Felder für neue Passwörter leer lassen, entschlüsselt das Werkzeug die PDF vollständig und entfernt alle Verschlüsselungen und Beschränkungen. + +## Berechtigungseinstellungen + +| Berechtigung | Was sie steuert | +| ------------------------------------- | ----------------------------------------------------------------- | +| **Drucken erlauben** | Ob das Dokument gedruckt werden kann | +| **Kopieren erlauben** | Ob Text und Bilder ausgewählt und kopiert werden können | +| **Ändern erlauben** | Ob der Dokumentinhalt bearbeitet werden kann | +| **Kommentieren erlauben** | Ob Kommentare, Markierungen und Stempel hinzugefügt werden können | +| **Formularausfüllen erlauben** | Ob interaktive Formularfelder ausgefüllt werden können | +| **Dokumentzusammenstellung erlauben** | Ob Seiten eingefügt, gelöscht oder gedreht werden können | +| **Seitenextraktion erlauben** | Ob einzelne Seiten extrahiert werden können | + +Alle Berechtigungen benötigen ein Besitzerpasswort, um durchgesetzt zu werden. Ohne Besitzerpasswort werden die Berechtigungskennzeichen von den meisten PDF-Readern ignoriert. + +## Wie Berechtigungen in PDF funktionieren + +PDF-Berechtigungen sind Teil der Verschlüsselungsspezifikation. Sie werden als Bit-Flags im Verschlüsselungswörterbuch gespeichert und von konformen PDF-Readern durchgesetzt. Der entscheidende Unterschied: + +- **Benutzerpasswort**: Wird benötigt, um die Datei überhaupt zu öffnen. +- **Besitzerpasswort**: Wird benötigt, um Berechtigungen zu ändern oder Beschränkungen zu entfernen. Ohne es bestimmen die Berechtigungskennzeichen, welche Vorgänge der Benutzer ausführen darf. + +Wenn Sie nur ein Besitzerpasswort festlegen (kein Benutzerpasswort), kann jeder die Datei öffnen, ist aber auf die erlaubten Vorgänge beschränkt. Wenn Sie beide festlegen, braucht die Datei zum Öffnen ein Passwort und ist nach der Authentifizierung eingeschränkt. + +## Anwendungsfälle + +- Einen Bericht verteilen, der angesehen und gedruckt, aber nicht bearbeitet oder kopiert werden kann +- Eine Vertragsvorlage teilen, die Empfänger ausfüllen, aber nicht ändern können +- Einen PDF-Katalog veröffentlichen, in dem das Kopieren von Bildern deaktiviert ist +- Kommentare in einem Prüfentwurf erlauben und gleichzeitig strukturelle Änderungen verhindern + +## Tipps + +- Legen Sie immer ein Besitzerpasswort fest, sonst sind die Berechtigungen wirkungslos. Berechtigungen ohne Besitzerpasswort lassen sich nicht durchsetzen. +- Manche PDF-Werkzeuge von Drittanbietern ignorieren Berechtigungskennzeichen. Für stärkeren Schutz sollten Sie die PDF rastern oder DRM verwenden. +- Nutzen Sie dieses Werkzeug, um alte RC4-verschlüsselte PDFs auf AES-256 zu aktualisieren. + +## Verwandte Werkzeuge + +- [PDF verschlüsseln](./protect-pdf): einfacher Passwortschutz ohne detaillierte Berechtigungen +- [PDF entschlüsseln](./unlock-pdf): Verschlüsselung vollständig entfernen +- [Beschränkungen entfernen](./remove-restrictions): alle Beschränkungen aufheben, wenn Sie das Besitzerpasswort haben diff --git a/docs/de/tools/combine-single-page.md b/docs/de/tools/combine-single-page.md new file mode 100644 index 00000000..627c8498 --- /dev/null +++ b/docs/de/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Zu einer Seite kombinieren +description: Fügen Sie alle Seiten einer PDF zu einer durchgehenden vertikalen oder horizontalen Scrollseite zusammen. +--- + +# Zu einer Seite kombinieren + +Fügen Sie jede Seite einer PDF zu einer einzigen langen Seite zusammen. Die Seiten werden vertikal (wie eine Schriftrolle) oder horizontal (nebeneinander) aneinandergereiht, sodass die Ausgabe aus einer durchgehenden Seite besteht. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Wählen Sie die Ausrichtung: **Vertikal** (Seiten von oben nach unten gestapelt) oder **Horizontal** (Seiten nebeneinander). +3. Legen Sie den Abstand zwischen den Seiten in Punkt fest. +4. Wählen Sie eine Hintergrundfarbe für die Lücken zwischen den Seiten. +5. Aktivieren Sie optional Trennlinien (dünne Linien zwischen den Seiten) und stellen Sie Stärke und Farbe ein. +6. Klicken Sie auf die Verarbeitungsschaltfläche. Die Ausgabe ist eine einseitige PDF. + +## Funktionen + +- Vertikales oder horizontales Aneinanderreihen der Seiten +- Einstellbarer Abstand zwischen den Seiten +- Farbauswahl für den Hintergrund der Zwischenräume +- Optionale Trennlinien mit einstellbarer Stärke und Farbe +- Rendert jede Originalseite in voller Auflösung auf die kombinierte Fläche + +## Optionen + +| Option | Beschreibung | +| ------------------------- | ------------------------------------------------------ | +| **Ausrichtung** | Vertikal (gestapelt) oder Horizontal (nebeneinander) | +| **Seitenabstand** | Lücke zwischen den Seiten in Punkt | +| **Hintergrundfarbe** | Farbe des Bereichs zwischen den Seiten | +| **Trennlinie hinzufügen** | Dünne Linien zwischen den Seiten ein- oder ausschalten | +| **Trennlinienstärke** | Linienstärke in Punkt | +| **Trennlinienfarbe** | Farbe der Trennlinien | + +## Anwendungsfälle + +- Aus einem mehrseitigen Wireframe oder Design-Mockup ein einzelnes langes Bild erstellen +- Eine durchgehend scrollbare Ansicht eines Dokuments zum Einbetten im Web erzeugen +- Einen mehrseitigen Comic oder ein Storyboard zu einem Streifen zusammenfügen +- Eine Panoramaansicht aufeinanderfolgender Seiten zur Durchsicht erstellen + +## Tipps + +- Die vertikale Ausrichtung eignet sich am besten für Dokumente mit Hochformatseiten. Horizontal passt besser zu Querformat-Inhalten. +- Große Dokumente mit vielen Seiten ergeben eine sehr hohe oder breite Ausgabe. Einige PDF-Viewer haben mit extrem großen Einzelseiten Probleme. +- Trennlinien in einer Kontrastfarbe zeigen leicht, wo eine Originalseite endet und die nächste beginnt. + +## Verwandte Werkzeuge + +- [N-Up PDF](./n-up-pdf) +- [PDF zusammenführen](./merge-pdf) +- [Seiten teilen](./divide-pages) diff --git a/docs/de/tools/compare-pdfs.md b/docs/de/tools/compare-pdfs.md new file mode 100644 index 00000000..4320ce09 --- /dev/null +++ b/docs/de/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: PDFs vergleichen +description: Vergleichen Sie zwei PDF-Dokumente nebeneinander oder im Überlagerungsmodus mit detaillierter Erkennung und Kategorisierung von Änderungen. +--- + +# PDFs vergleichen + +Laden Sie zwei PDFs hoch und sehen Sie genau, was sich zwischen ihnen geändert hat. Das Werkzeug ordnet Seiten intelligent einander zu, erkennt Unterschiede bei Text, Bildern, Anmerkungen, Kopfzeilen und Formatierung und zeigt sie in einer Nebeneinander- oder Überlagerungsansicht an. + +## So funktioniert es + +1. Laden Sie zwei PDF-Dateien hoch: das Original (links) und die überarbeitete Version (rechts). +2. Das Werkzeug ordnet die Seiten beider Dokumente anhand von Inhaltssignaturen einander zu. +3. Wählen Sie einen Ansichtsmodus: **Nebeneinander** oder **Überlagerung**. +4. Wechslen Sie mit den Seitensteuerungen zwischen den Seitenpaaren. +5. Unterschiede werden hervorgehoben und kategorisiert. Nutzen Sie das Filterfeld, um sich auf bestimmte Änderungsarten zu konzentrieren. +6. Exportieren Sie den Vergleich optional als PDF-Bericht. + +## Funktionen + +- Automatische Seitenzuordnung anhand der Inhaltsähnlichkeit +- Vergleichsansichten nebeneinander und als Überlagerung +- Kategorisierung der Änderungen: Text, Bild, Kopf-/Fußzeile, Anmerkung, Formatierung, Hintergrund +- Filterschalter pro Kategorie, um bestimmte Änderungsarten ein- oder auszublenden +- Suche in Textänderungen mit Abfragefilter +- OCR-Unterstützung zum Vergleichen gescannter Dokumente +- Zoomsteuerung für die genaue Prüfung +- Synchronisiertes Scrollen zwischen den Bereichen in der Nebeneinander-Ansicht +- Vergleichsergebnisse als PDF exportieren + +## Optionen + +| Option | Beschreibung | +| ------------------- | ----------------------------------------------------------------------------------------------------------------- | +| **Ansichtsmodus** | Nebeneinander oder Überlagerung | +| **OCR** | OCR für den Vergleich gescannter Dokumente ein- oder ausschalten | +| **OCR-Sprache** | Sprache für die OCR-Textextraktion | +| **Kategoriefilter** | Sichtbarkeit von Text-, Bild-, Kopf-/Fußzeilen-, Anmerkungs-, Formatierungs- und Hintergrundänderungen umschalten | +| **Änderungsumfang** | Im Überlagerungsmodus zwischen allen Änderungen oder nur Inhalt filtern | +| **Zoom** | Vergrößerungsstufe für die genaue Prüfung anpassen | + +## Anwendungsfälle + +- Vertragsüberarbeitungen prüfen, um genau zu sehen, was sich zwischen Versionen geändert hat +- Design-Mockups vergleichen, um zu prüfen, dass PDF-Exporte den Erwartungen entsprechen +- Dokumentänderungen in regulierten Branchen prüfen, in denen jede Bearbeitung nachvollziehbar sein muss +- Überprüfen, dass ein PDF-Konvertierungsprozess den Originalinhalt korrekt erhalten hat +- Übersetzte Dokumente auf Layoutänderungen gegenüber dem Original prüfen + +## Tipps + +- Die Überlagerungsansicht legt beide Dokumente übereinander, sodass räumliche Unterschiede (verschobene Elemente, skalierte Bilder) sofort sichtbar werden. +- Aktivieren Sie OCR, wenn Sie gescannte Dokumente ohne Textebene vergleichen. Die Vergleichs-Engine extrahiert dann den Text aus den Seitenbildern. +- Nutzen Sie die Kategoriefilter, um sich auf das Wesentliche zu konzentrieren. Blenden Sie zum Beispiel Formatierungsänderungen aus, wenn sich nur Unterschiede im Textinhalt interessieren. + +## Verwandte Werkzeuge + +- [Metadaten anzeigen](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [PDF zusammenführen](./merge-pdf) diff --git a/docs/de/tools/compress-pdf.md b/docs/de/tools/compress-pdf.md new file mode 100644 index 00000000..ab9d001f --- /dev/null +++ b/docs/de/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: PDF komprimieren +description: Verkleineren Sie PDF-Dateien um bis zu 90 % mit der Hyper-Compress-Engine. Unterstützt Zieldateigrößen, Stapelverarbeitung und eigene Qualitätseinstellungen. +--- + +# PDF komprimieren + +Verkleineren Sie Ihre PDF-Dateien, ohne sie zu beschädigen. PDF komprimieren wird von [Hyper Compress](https://www.bentopdf.com/hyper-compress) angetrieben, der eigenen Komprimierungs-Engine von BentoPDF. Sie komprimiert Bilder neu, erstellt Teilmengen von Schriften und führt sie zusammen und entfernt unnötigen Ballast wie eingebettete Vorschaubilder und private Anwendungsdaten. Die PDF bleibt voll funktionsfähig: Text bleibt auswählbar, Links und Formularfelder funktionieren weiter. + +Hyper Compress ist zu WebAssembly kompiliert und wird mit BentoPDF ausgeliefert, sodass die Komprimierung offline und in Air-Gap-Umgebungen ohne zusätzliche Einrichtung funktioniert. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien hineinziehen. +2. Wählen Sie eine **Komprimierungsstufe**: Niedrig, Mittel, Hoch oder Verlustfrei. +3. Geben Sie optional eine **Zieldateigröße** ein oder öffnen Sie **Benutzerdefinierte Einstellungen** für feinere Kontrolle, einschließlich **In Graustufen umwandeln**. +4. Klicken Sie auf **PDF komprimieren**. Bei mehreren Dateien erhalten Sie einen einzelnen ZIP-Download. + +## Besondere Dokumente + +- **Digital signierte PDFs** werden unverändert zurückgegeben, weil jede Änderung die Signatur ungültig machen würde. Aktivieren Sie **Inhaltsschutz überschreiben** unter Benutzerdefinierte Einstellungen, um die Signaturen zu entfernen und die Datei zu komprimieren. Die sichtbare Signatur bleibt auf der Seite, die Datei ist aber nicht mehr signiert. +- **PDF/A-Dateien** verlieren nach der Komprimierung ihre PDF/A-Kennzeichnung, damit die Datei nie eine Konformität behauptet, die sie nicht mehr erfüllt. Aktivieren Sie **PDF/A beibehalten** unter Benutzerdefinierte Einstellungen, um die Konformität der Datei zu erhalten. +- **Passwortgeschützte PDFs** bekommen auf ihrer Dateikarte ein Passwortfeld. Geben Sie dort das Passwort ein, und Hyper Compress öffnet die Datei selbst, ganz ohne separaten Entsperrschritt. Bei zwei oder mehr gesperrten Dateien entsperrt ein gemeinsames Feld alle Dateien, die dasselbe Passwort verwenden. Die komprimierte Kopie hat kein Passwort. Mit [PDF verschlüsseln](./protect-pdf) können Sie wieder eines hinzufügen. +- **Scans ohne Textebene** lassen sich mit **Seiten rastern** unter Benutzerdefinierte Einstellungen weiter verkleinern, wodurch jede Seite durch ein optimiertes Bild ersetzt wird. Bei jedem Dokument mit auswählbarem Text, auch bei per OCR bearbeiteten Scans, wird dies übersprungen, außer **Inhaltsschutz überschreiben** ist aktiviert. Dann werden auch Textseiten zu Bildern, sodass Text nicht mehr auswählbar ist und Links nicht mehr funktionieren. + +## Komprimierungsstufen + +| Stufe | Bildqualität | Max. Auflösung | Am besten für | +| --------------- | ------------------ | -------------- | ----------------------------- | +| **Niedrig** | 80 | 200 DPI | Erhalt der visuellen Qualität | +| **Mittel** | 50 | 150 DPI | Alltägliche Dokumente | +| **Hoch** | 20 | 72 DPI | E-Mail-Anhänge, Web-Uploads | +| **Verlustfrei** | Bilder unverändert | Unverändert | Archivkopien | + +Bei Hoch werden außerdem die 14 Standard-PDF-Schriften sowie ähnliche Schriften wie Arial nicht mehr eingebettet, sofern das sicher ist. + +## Zieldateigröße + +Geben Sie eine Größe in KB oder MB ein, und Hyper Compress sucht die beste Bildqualität, die noch hineinpasst, ausgehend von der gewählten Stufe. Wenn das Dokument nicht so klein werden kann, erhalten Sie die kleinste mögliche Version und eine entsprechende Meldung. Die eigenen Seiten wie [PDF auf 1 MB komprimieren](https://www.bentopdf.com/compress-pdf-to-1mb) öffnen sich mit bereits eingetragenem Ziel. + +## Benutzerdefinierte Einstellungen + +Öffnen Sie den Bereich Benutzerdefinierte Einstellungen, um Hyper Compress direkt anzupassen. Wenn Sie eine Komprimierungsstufe wählen, werden diese Werte auf die der Stufe zurückgesetzt, und sobald Sie einen davon ändern, wechselt die Stufe zu Benutzerdefiniert. + +- **Inhaltsschutz überschreiben**: Standardmäßig lässt Hyper Compress signierte PDFs unangetastet und rastert keine Seiten mit Text. Wenn Sie dies aktivieren, werden beide Schutzmaßnahmen umgangen. Die Einstellung bleibt aktiv, wenn Sie die Stufe wechseln. + +- **Bilder**: Bildqualität, maximale Auflösung, erzwungenes Neuabtasten, Farbreduzierung, Beschneiden unsichtbarer Bildbereiche, Entfernen alternativer Bilder, Vereinfachen von Farbprofilen, JPEG 2000 und verlustfreier Modus +- **Schriften**: Teilmengenbildung, Zusammenführen von Duplikaten und Nicht-Einbetten von Standardschriften und ihren Ähnlichen +- **Inhalt**: Anmerkungen, Formularfelder oder Links verflachen +- **Bereinigung**: Entfernen von Vorschaubildern, Anwendungsdaten, Artikel-Threads, Weberfassungsinformationen, der Strukturhierarchie oder Ausgabeabsichten +- **Rastern**: Seiten durch Bilder ersetzen, für reine Bild-Scans. Wird übersprungen, wenn das Dokument auswählbaren Text enthält +- **Ausgabe**: PDF/A beibehalten und Brotli-Komprimierung für PDF-2.0-Reader, die sie unterstützen + +## Anwendungsfälle + +- Einen 50-MB-Bericht unter das Limit für E-Mail-Anhänge bringen +- Einen Scan mit einer Zieldateigröße unter das strenge Upload-Limit eines Portals bringen +- Marketing-PDFs für schnellere Downloads auf Websites optimieren +- Große Dokumentensätze archivieren, wenn Speicherkosten eine Rolle spielen +- Den mobilen Datenverbrauch beim Teilen von PDFs über Messenger senken + +## Tipps + +- Beginnen Sie mit Mittel. Ist das Ergebnis immer noch zu groß, legen Sie eine Zieldateigröße fest oder wechslen Sie zu Hoch. +- Bei einem Scan ohne Textebene aktivieren Sie Seiten rastern unter Benutzerdefinierte Einstellungen. +- In Graustufen umwandeln unter Benutzerdefinierte Einstellungen kann die Dateigröße bei sehr farbigen Dokumenten deutlich senken. + +## Verwandte Werkzeuge + +- [PDF linearisieren](./linearize-pdf): die komprimierte PDF für schnelles Anzeigen im Web optimieren +- [PDF rastern](./rasterize-pdf): Seiten mit einer bestimmten DPI in Bilder umwandeln, auch Seiten mit Text +- [PDF reparieren](./repair-pdf): eine PDF reparieren, die woanders bei der Komprimierung beschädigt wurde +- [Metadaten entfernen](./remove-metadata): versteckte Daten für mehr Privatsphäre entfernen diff --git a/docs/de/tools/crop-pdf.md b/docs/de/tools/crop-pdf.md new file mode 100644 index 00000000..3462846b --- /dev/null +++ b/docs/de/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: PDF zuschneiden +description: Schneiden Sie PDF-Seiten visuell zu, indem Sie in einem Cropper.js-basierten Editor auf jeder Seite einen Zuschneidebereich zeichnen. +--- + +# PDF zuschneiden + +Beschneiden Sie die Ränder Ihrer PDF-Seiten mit einer visuellen Zuschneideoberfläche. Zeichnen Sie direkt auf jeder Seite ein Zuschneiderechteck, sehen Sie sich das Ergebnis in der Vorschau an und wenden Sie den Zuschnitt an. Sie können für verschiedene Seiten unterschiedliche Zuschneidebereiche festlegen oder denselben Zuschnitt auf das ganze Dokument anwenden. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Der Zuschneide-Editor öffnet sich und zeigt die erste Seite mit einer verschiebbaren Zuschneideüberlagerung. +3. Passen Sie das Zuschneiderechteck an, indem Sie an Kanten oder Ecken ziehen. +4. Wechslen Sie mit den Seitennavigationsschaltflächen zwischen den Seiten und legen Sie für jede einen Zuschneidebereich fest. +5. Klicken Sie auf **Zuschneiden**, um den Zuschnitt anzuwenden und das Ergebnis herunterzuladen. + +## Funktionen + +- Visueller Zuschneide-Editor auf Basis von Cropper.js mit Anfassern für präzise Anpassung +- Seitenweise Navigation, um individuelle Zuschneidebereiche festzulegen +- Speichert Zuschnitteinstellungen pro Seite, sodass Sie für verschiedene Seiten unterschiedliche Zuschnitte definieren können +- Live-Vorschau des gewählten Zuschneidebereichs +- Unterstützt PDFs mit beliebiger Seitengröße oder Ausrichtung + +## Anwendungsfälle + +- Breite Ränder gescannter Dokumente entfernen, um sich auf den Inhaltsbereich zu konzentrieren +- Druckermarken oder Passermarken aus Druckvorstufen-PDFs entfernen +- Vorlesungsfolien zuschneiden, um den Bereich mit den Referentennotizen zu entfernen +- Kopf- oder Fußzeilen von jeder Seite entfernen, bevor Sie einen Dokumentauszug teilen +- Seiten an ein bestimmtes Anzeige- oder Drucklayout anpassen + +## Tipps + +- Die Zuschneideüberlagerung lässt sich frei in der Größe ändern und verschieben. Ziehen Sie an den Ecken für proportionale Größenänderung oder an den Kanten für Anpassung in einer Achse. +- Wenn jede Seite denselben Zuschnitt braucht, legen Sie ihn auf der ersten Seite fest. Das Werkzeug merkt sich Ihren Zuschneidebereich beim Wechseln der Seiten. +- Wenn Sie Seitengrößen vereinheitlichen statt visuell zuschneiden wollen, passt das Werkzeug Seitengröße korrigieren möglicherweise besser. + +## Verwandte Werkzeuge + +- [PDF-Editor](./edit-pdf) +- [Seitenzahlen](./page-numbers) +- [Leere Seiten entfernen](./remove-blank-pages) diff --git a/docs/de/tools/csv-to-pdf.md b/docs/de/tools/csv-to-pdf.md new file mode 100644 index 00000000..38bea5e1 --- /dev/null +++ b/docs/de/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV zu PDF +description: Wandlen Sie CSV-Tabellendateien direkt in Ihrem Browser in formatierte PDF-Tabellen um. +--- + +# CSV zu PDF + +Verwandlen Sie CSV-Dateien in saubere, formatierte PDF-Dokumente. Jede CSV wird geparst und als Tabelle in der Ausgabe-PDF dargestellt. Das ist praktisch, wenn Sie Tabellendaten drucken oder teilen wollen, ohne dass der Empfänger eine Tabellenkalkulation braucht. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :----- | :------------ | +| CSV | `.csv` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie eine oder mehrere CSV-Dateien hinein. +2. Prüfen Sie die Dateiliste. Fügen Sie weitere Dateien hinzu oder entfernen Sie unerwünschte. +3. Klicken Sie auf **In PDF umwandeln**. Eine Fortschrittsanzeige zeigt den Stand der Umwandlung. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in `csv-converted.zip` verpackt. + +## Optionen + +Dieses Werkzeug hat keine zusätzliche Konfiguration. Die CSV wird automatisch geparst und als Tabelle formatiert. + +## Ausgabe + +| Anzahl Eingaben | Ausgabe | +| :-------------- | :------------------------------------------------------- | +| 1 Datei | Einzelner PDF-Download (z. B. `data.pdf`) | +| 2+ Dateien | ZIP-Archiv (`csv-converted.zip`) mit einer PDF pro Datei | + +## Anwendungsfälle + +- Exportierte Datenbankberichte in druckbare PDF-Tabellen umwandeln +- Finanzdaten oder Bestandslisten mit Personen teilen, die kein Excel haben +- PDF-Versionen von CSV-Logdateien für Compliance-Dokumentation erstellen +- Adresslisten, Notenlisten oder andere als CSV gespeicherte Tabellendaten drucken + +## Tipps + +- Für beste Ergebnisse sollte Ihre CSV Standard-Kommas als Trennzeichen verwenden. Das Werkzeug folgt gängigen CSV-Parsing-Konventionen. +- Hat Ihre CSV viele Spalten, wird die Tabelle möglicherweise gestaucht, damit sie in die Seitenbreite passt. Teilen Sie breite Datensätze am besten in mehrere Dateien auf. +- Für Excel-Dateien (`.xls`, `.xlsx`) nutzen Sie das Werkzeug [Excel zu PDF](./excel-to-pdf), das die Tabellenformatierung und mehrere Blätter beibehält. + +## Verwandte Werkzeuge + +- [Excel zu PDF](./excel-to-pdf) +- [Text zu PDF](./txt-to-pdf) +- [JSON zu PDF](./json-to-pdf) diff --git a/docs/de/tools/delete-pages.md b/docs/de/tools/delete-pages.md new file mode 100644 index 00000000..5d9afc8d --- /dev/null +++ b/docs/de/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Seiten löschen +description: Entfernen Sie bestimmte Seiten aus einer PDF per Seitenzahl, Bereich oder visueller Auswahl über Vorschaubilder. +--- + +# Seiten löschen + +Entfernen Sie unerwünschte Seiten aus einem PDF-Dokument. Geben Sie die zu löschenden Seiten als Seitenzahlen oder Bereiche ein oder klicken Sie direkt auf Seitenvorschaubilder, um sie zum Entfernen zu markieren. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Das Werkzeug erstellt Vorschaubilder jeder Seite. +2. Geben Sie die zu löschenden Seiten im Textfeld mit Bereichssyntax ein (z. B. `2, 5-8`) oder klicken Sie auf Vorschaubilder, um sie umzuschalten. +3. Markierte Seiten werden visuell hervorgehoben, damit Sie Ihre Auswahl prüfen können. +4. Klicken Sie auf die Verarbeitungsschaltfläche. Es wird eine neue PDF ohne die ausgewählten Seiten erstellt. + +## Funktionen + +- Textbasierte Seitenauswahl mit Bereichssyntax (`2, 5-8, 12`) +- Visuelles Vorschaubildraster zum Löschen per Klick +- Echtzeit-Hervorhebung der zum Löschen markierten Seiten +- Eingabeprüfung anhand der tatsächlichen Seitenzahl +- Behält alle nicht gelöschten Seiten in ihrer ursprünglichen Reihenfolge + +## Anwendungsfälle + +- Leere oder Füllseiten aus einem gescannten Dokument entfernen +- Deckblätter oder Anhänge entfernen, bevor Sie ein Dokument teilen +- Entwurfsseiten bereinigen, die versehentlich in einer endgültigen PDF geblieben sind +- Seiten mit sensiblen Informationen vor der Weitergabe entfernen + +## Tipps + +- Das Löschen von Seiten wirkt sich nicht auf Inhalt oder Formatierung der übrigen Seiten aus. Die Ausgabe ist eine getreue Kopie des Originals abzüglich der entfernten Seiten. +- Wenn Sie nur bestimmte Seiten behalten statt bestimmte entfernen wollen, ist [Seiten extrahieren](./extract-pages) besser geeignet. +- Die Vorschauansicht lädt träge nach, sodass große Dokumente reaktionsschnell bleiben. + +## Verwandte Werkzeuge + +- [Seiten extrahieren](./extract-pages) +- [Organisieren & Duplizieren](./organize-pdf) +- [PDF teilen](./split-pdf) diff --git a/docs/de/tools/deskew-pdf.md b/docs/de/tools/deskew-pdf.md new file mode 100644 index 00000000..f5a5a1ee --- /dev/null +++ b/docs/de/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF entzerren +description: Richten Sie schiefe Seiten in gescannten PDFs automatisch mit OpenCV-Schräglagenerkennung gerade. Einstellbarer Schwellenwert und DPI. +--- + +# PDF entzerren + +Gescannte Dokumente sind selten perfekt gerade. Schon eine leichte Neigung macht OCR ungenauer und Ausdrucke unsauber. Dieses Werkzeug nutzt die Bildverarbeitungsalgorithmen von OpenCV, um den Schiefwinkel jeder Seite zu erkennen und sie wieder geradezudrehen. + +## So funktioniert es + +1. Laden Sie eine oder mehrere gescannte PDFs hoch. +2. Legen Sie den **Schräglagen-Schwellenwert** fest: Seiten mit einer erkannten Schräglage unterhalb dieses Wertes bleiben unverändert. +3. Wählen Sie eine **Verarbeitungsqualität (DPI)**: Höhere DPI verbessert die Erkennungsgenauigkeit, dauert aber länger. +4. Klicken Sie auf **PDF entzerren**. +5. Nach der Verarbeitung zeigt ein Ergebnisbereich für jede Seite den erkannten Winkel und ob sie korrigiert wurde. + +## Optionen + +| Einstellung | Werte | Standard | +| ----------------------------- | ----------------------- | -------- | +| **Schräglagen-Schwellenwert** | 0,1, 0,5, 1,0, 2,0 Grad | 0,5 | +| **Verarbeitungs-DPI** | 100, 150, 200, 300 | 150 | + +## Wie die Schräglagenerkennung funktioniert + +Das Werkzeug rendert jede Seite mit der gewählten DPI als Bild und erkennt dann mit OpenCV die dominanten Linienwinkel im Inhalt. Überschreitet die erkannte Schräglage den Schwellenwert, wird die Seite um den umgekehrten Winkel gedreht, um sie geradezurichten. Seiten unterhalb des Schwellenwerts werden unverändert durchgereicht. + +## Anwendungsfälle + +- Stapelweise gescannte Verträge oder Rechtsdokumente aufbereiten +- Gescannte Belege oder Rechnungen für die OCR-Verarbeitung vorbereiten +- Seiten von einem Flachbettscanner geradeziehen, bei dem das Papier uneinheitlich eingelegt wurde +- Die visuelle Qualität digitalisierter Archivmaterialien verbessern + +## Tipps + +- Senken Sie den Schwellenwert auf 0,1 Grad, wenn Sie für OCR eine pixelgenaue Ausrichtung brauchen. +- 150 DPI ist für die meisten Dokumente schnell und genau. Nutzen Sie 300 DPI für sehr kleinen Text oder Seiten mit feinen Details. +- Das Entzerren funktioniert am besten bei Dokumenten mit klaren horizontalen Textzeilen. Bei Seiten, die überwiegend aus Bildern oder diagonalen Designelementen bestehen, kann es Schwierigkeiten geben. + +## Verwandte Werkzeuge + +- [PDF rastern](./rasterize-pdf): die entzerrte Ausgabe in eine flache, bildbasierte PDF umwandeln +- [PDF komprimieren](./compress-pdf): die Dateigröße nach dem Entzerren verringern +- [PDF reparieren](./repair-pdf): strukturelle Probleme in gescannten PDFs beheben diff --git a/docs/de/tools/digital-sign-pdf.md b/docs/de/tools/digital-sign-pdf.md new file mode 100644 index 00000000..8e7cddc3 --- /dev/null +++ b/docs/de/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Digitale Signatur +description: Fügen Sie PDFs kryptografische digitale Signaturen mit X.509-Zertifikaten hinzu. Unterstützt PKCS#12- und PEM-Formate mit sichtbaren Signaturoptionen. +--- + +# Digitale Signatur + +Eine digitale Signatur ist ein kryptografischer Nachweis, dass eine bestimmte Person ein Dokument signiert hat und dass das Dokument seitdem nicht verändert wurde. Anders als eine gezeichnete Signatur (die nur ein Bild ist) nutzt eine digitale Signatur X.509-Zertifikate und PKCS#7-Standards, um überprüfbare Echtheit und Integrität zu gewährleisten. + +BentoPDF wendet digitale Signaturen vollständig in Ihrem Browser an. Ihr privater Schlüssel verlässt nie Ihr Gerät. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Laden Sie Ihre Zertifikatsdatei hoch (.pfx, .p12 oder .pem). +3. Geben Sie das Zertifikatspasswort ein, um es zu entsperren. Das Werkzeug zeigt Zertifikatsinhaber, Aussteller und Gültigkeitszeitraum an. +4. Konfigurieren Sie optional Signaturmetadaten (Grund, Ort, Kontaktinformationen). +5. Aktivieren Sie optional eine **sichtbare Signatur** mit Anpassung von Position, Größe, Bild und Text. +6. Klicken Sie auf **PDF signieren**. + +## Unterstützte Zertifikatsformate + +| Format | Erweiterungen | Beschreibung | +| ----------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| **PKCS#12** | .pfx, .p12 | Branchenstandard-Paket mit privatem Schlüssel und Zertifikatskette. Das gängigste Format. | +| **PEM** | .pem | Textbasiertes Format. Muss Zertifikat und privaten Schlüssel in einer Datei enthalten. Unterstützt verschlüsselte private Schlüssel. | + +## Optionen für die sichtbare Signatur + +Wenn aktiviert, wird ein sichtbarer Signaturblock auf der PDF-Seite dargestellt: + +- **Position**: X/Y-Koordinaten sowie Breite/Höhe in Punkt +- **Seite**: Erste Seite, letzte Seite, alle Seiten oder eine bestimmte Seitenzahl +- **Bild**: Laden Sie ein PNG-, JPG- oder WebP-Bild hoch (Ihre handschriftliche Unterschrift, ein Firmensiegel usw.) +- **Text**: Eigener Text mit einstellbarer Farbe und Schriftgröße. Wenn weder Bild noch Text angegeben sind, erzeugt das Werkzeug automatisch Text aus dem Common Name des Zertifikats und dem aktuellen Datum. + +## Signaturmetadaten + +- **Grund**: Warum das Dokument signiert wurde (z. B. "Genehmigt", "Geprüft") +- **Ort**: Wo die Signierung stattfand (z. B. "Berlin") +- **Kontaktinformationen**: Wie der Unterzeichner erreichbar ist (z. B. E-Mail-Adresse) + +## Hinweis zur Internetverbindung + +Das Signieren kann eine Internetverbindung erfordern. Die Signaturbibliothek ruft die Zertifikatskette von URLs ab, die in der Authority-Information-Access-Erweiterung (AIA) Ihres Zertifikats eingebettet sind. Sind diese Server nicht erreichbar, schlägt das Signieren bei Zertifikaten fehl, die eine Kettenprüfung erfordern. + +## Anwendungsfälle + +- Verträge, Angebote und Vereinbarungen mit rechtsverbindlichen digitalen Signaturen signieren +- Offizielle Dokumente in Abläufen beglaubigen, die PKI-basierte Authentifizierung erfordern +- PDF-Rechnungen für die Einhaltung von Vorschriften signieren (viele EU-Länder verlangen digital signierte E-Rechnungen) +- Technischen Zeichnungen oder Qualitätsdokumenten eine organisatorische Freigabe hinzufügen + +## Tipps + +- Selbstsignierte Zertifikate eignen sich zum Testen, zeigen aber in Adobe Reader Warnungen an. Verwenden Sie für Produktivdokumente ein Zertifikat einer vertrauenswürdigen Zertifizierungsstelle. +- Die sichtbare Signatur ist rein visuell. Die kryptografische Signatur wird unabhängig davon eingebettet, ob der sichtbare Block aktiviert ist. +- Prüfen Sie Ihre signierte PDF mit dem Werkzeug Signatur validieren, um sicherzustellen, dass die Signatur intakt ist. + +## Verwandte Werkzeuge + +- [Signatur validieren](./validate-signature-pdf): digitale Signaturen in signierten PDFs überprüfen +- [PDF verflachen](./flatten-pdf): Formulare vor dem Signieren verflachen, um Änderungen zu verhindern +- [PDF verschlüsseln](./protect-pdf): zusätzlich zur digitalen Signatur Passwortschutz hinzufügen +- [Metadaten entfernen](./remove-metadata): Metadaten vor dem Signieren entfernen diff --git a/docs/de/tools/divide-pages.md b/docs/de/tools/divide-pages.md new file mode 100644 index 00000000..e2f16324 --- /dev/null +++ b/docs/de/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Seiten teilen +description: Teilen Sie PDF-Seiten horizontal oder vertikal in kleinere Teilseiten. +--- + +# Seiten teilen + +Schneiden Sie einzelne PDF-Seiten in Hälften, indem Sie sie horizontal oder vertikal teilen. Das ist nützlich, wenn eine Seite Inhalte enthält, die auf getrennte Seiten gehören, zum Beispiel ein zweispaltiges Layout, das als eine breite Seite gescannt wurde. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Wählen Sie die Teilungsrichtung: **Vertikal** (linke/rechte Hälfte) oder **Horizontal** (obere/untere Hälfte). +3. Geben Sie optional einen Seitenbereich an, um einzugrenzen, welche Seiten geteilt werden. Lassen Sie das Feld leer, um alle Seiten zu teilen. +4. Klicken Sie auf die Verarbeitungsschaltfläche, um die geteilte PDF zu erzeugen. + +## Funktionen + +- Vertikale Teilung: teilt jede Seite in eine linke und eine rechte Hälfte +- Horizontale Teilung: teilt jede Seite in eine obere und eine untere Hälfte +- Seitenbereichsfilter, um gezielt bestimmte Seiten zu teilen +- Nicht ausgewählte Seiten bleiben unverändert +- Erhält die Inhaltsqualität ohne erneutes Rendern + +## Anwendungsfälle + +- Zweiseitig gescannte Seiten trennen (z. B. ein Buchscan mit linker und rechter Seite auf einem Blatt) +- Eine Querformat-PDF mit nebeneinanderliegenden Inhalten in einzelne Hochformatseiten teilen +- Hohe Infografiken oder Poster in einen oberen und einen unteren Abschnitt teilen +- Breitformatige Dokumente für den Druck auf Standardpapier vorbereiten + +## Tipps + +- Wenn der Inhalt Ihrer Seiten ungleich verteilt ist, erfolgt die Teilung trotzdem genau in der Mitte. Für asymmetrische Teilungen nutzen Sie stattdessen [PDF zuschneiden](./crop-pdf). +- Kombinieren Sie dieses Werkzeug mit [PDF drehen](./rotate-pdf), falls Ihre Seiten vor oder nach dem Teilen gedreht werden müssen. + +## Verwandte Werkzeuge + +- [PDF teilen](./split-pdf) +- [PDF zuschneiden](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [PDF-Poster erstellen](./posterize-pdf) diff --git a/docs/de/tools/duplex-collate.md b/docs/de/tools/duplex-collate.md new file mode 100644 index 00000000..b998556e --- /dev/null +++ b/docs/de/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Duplex-Zusammenführung +description: Ordnen Sie Duplex-Scan-PDFs, bei denen Vorder- und Rückseiten in getrennten Blöcken liegen, in die richtige Vorder-/Rückseiten-Reihenfolge. +--- + +# Duplex-Zusammenführung + +Duplex zusammenführen ist für ADF-Scan-Abläufe gedacht, bei denen eine PDF zwei Seitenblöcke enthält: + +- zuerst alle Vorderseiten +- danach alle Rückseiten + +Statt manuell zu teilen und neu zusammenzusetzen, verschränkt dieses Werkzeug die beiden Blöcke in natürlicher Lesereihenfolge: Vorderseite 1, Rückseite 1, Vorderseite 2, Rückseite 2 und so weiter. + +## So funktioniert es + +1. Laden Sie eine einzelne PDF hoch, die durch Stapelscannen im Duplexverfahren entstanden ist. +2. Legen Sie den Teilungspunkt fest, an dem der Vorderseitenblock endet. +3. Wählen Sie die Behandlung des Rückseitenblocks: + - **Rückseitenblock umkehren** (üblich, wenn der Stapel vor dem Scannen der Rückseiten gewendet wird) + - **Rückseitenblock unverändert lassen** +4. Klicken Sie auf **PDF zusammenführen**, um das neu geordnete Ergebnis herunterzuladen. + +## Optionen + +- **Teilung automatisch erkennen (Hälfte)**: setzt den Teilungspunkt auf `ceil(totalPages / 2)`. +- **Warnung bei ungerader Seitenzahl**: warnt, wenn die Gesamtseitenzahl ungerade ist (oft ein Scanfehler). +- **Bestätigung bei ungleichen Blöcken**: fragt nach, wenn sich die Größen von Vorder- und Rückseitenblock unterscheiden. +- **Gruppierter Export**: teilt die zusammengeführte Ausgabe anhand der ursprünglichen Seitenzahl der Dokumente in einzelne PDFs und lädt sie als ZIP herunter. + +## Ausgabeverhalten + +- **Standard**: eine Ausgabe-PDF (eine Eingabe-PDF ergibt eine Ausgabe-PDF). +- **Gruppierter Modus**: Die Ausgabe wird nach Ihrem Wert für Seiten pro Dokument aufgeteilt. Entstehen mehrere Teile, werden sie als ein ZIP heruntergeladen, andernfalls als einzelne PDF. + +Sind die Blöcke ungleich groß, werden zuerst die gepaarten Seiten zusammengeführt, und die übrigen ungepaarten Seiten werden am Ende angehängt. + +## Häufige Anwendungsfälle + +- Die Reihenfolge wiederherstellen, nachdem ein Stapel doppelseitiger Formulare in zwei Durchgängen gescannt wurde. +- Vorder-/Rückseiten-Pakete aus Bürogeräten rekonstruieren, die zuerst alle Vorderseiten und dann alle Rückseiten ausgeben. +- Archivscans nachbearbeiten, bevor sie in Einzeldokumente geteilt werden. + +## Tipps + +- Die meisten Duplex-Stapel sollten eine gerade Gesamtseitenzahl haben. +- Wenn die Rückseiten im Ergebnis verkehrt aussehen, wechseln Sie zwischen **Rückseitenblock umkehren** und **Rückseitenblock unverändert lassen**. +- Bei 2-seitigen Originalen (Vorder- und Rückseite) nutzen Sie den gruppierten Export mit `2` Seiten pro Dokument. + +## Verwandte Werkzeuge + +- [Seiten abwechselnd mischen](./alternate-merge) +- [PDF teilen](./split-pdf) +- [PDF zusammenführen](./merge-pdf) +- [Organisieren & Duplizieren](./organize-pdf) diff --git a/docs/de/tools/edit-attachments.md b/docs/de/tools/edit-attachments.md new file mode 100644 index 00000000..993e01c1 --- /dev/null +++ b/docs/de/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Anhänge bearbeiten +description: Zeigen Sie in einem PDF-Dokument eingebettete Dateianhänge an und entfernen Sie sie gezielt. +--- + +# Anhänge bearbeiten + +Prüfen und verwalten Sie die Dateianhänge in einer PDF. Das Werkzeug listet jede eingebettete Datei mit Namen und Anhangsebene auf und lässt Sie einzelne Anhänge zum Entfernen markieren oder alle auf einmal entfernen. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Das Werkzeug sucht automatisch nach Anhängen und zeigt sie in einer Liste an. +3. Jeder Anhang zeigt seinen Dateinamen und ob es ein Anhang auf Dokument- oder Seitenebene ist. +4. Klicken Sie auf das Papierkorb-Symbol neben einem Anhang, um ihn zum Entfernen zu markieren (erneut klicken hebt die Markierung auf). +5. Mit der Schaltfläche **Alle Anhänge entfernen** wählen Sie alles auf einmal aus, mit **Auswahl aufheben** löschen Sie Ihre Auswahl. +6. Klicken Sie auf die Verarbeitungsschaltfläche, um eine neue PDF ohne die ausgewählten Anhänge zu speichern. + +## Funktionen + +- Listet alle Anhänge auf Dokument- und Seitenebene auf +- Einzelnes oder gesammeltes Entfernen von Anhängen +- Auswahl vor dem Übernehmen der Änderungen ein- und ausschalten +- Visuelle Durchstreichung und geringere Deckkraft bei zum Entfernen markierten Einträgen +- Lädt die geänderte PDF ohne die ausgewählten Anhänge herunter + +## Anwendungsfälle + +- Veraltete oder falsche eingebettete Dateien aus einem Dokument entfernen, bevor es weitergegeben wird +- Sensible Anhänge (Finanzdaten, persönliche Angaben) aus einer PDF entfernen, bevor Sie sie teilen +- Die PDF-Dateigröße verringern, indem nicht mehr benötigte große eingebettete Dateien entfernt werden +- Eingebettete Inhalte prüfen und ein Dokument vor der Archivierung bereinigen + +## Tipps + +- Zum Entfernen markierte Anhänge werden durchgestrichen dargestellt. Sie können die Markierung vor der Verarbeitung wieder aufheben, wenn Sie es sich anders überlegen. +- Wenn keine Anhänge gefunden werden, zeigt das Werkzeug eine klare Meldung "Keine Anhänge gefunden". Die PDF enthält dann einfach keine eingebetteten Dateien. + +## Verwandte Werkzeuge + +- [Anhänge hinzufügen](./add-attachments) +- [Anhänge extrahieren](./extract-attachments) +- [Metadaten anzeigen](./view-metadata) diff --git a/docs/de/tools/edit-metadata.md b/docs/de/tools/edit-metadata.md new file mode 100644 index 00000000..84387685 --- /dev/null +++ b/docs/de/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Metadaten bearbeiten +description: Zeigen Sie PDF-Metadatenfelder wie Titel, Autor, Schlüsselwörter, Datumsangaben und benutzerdefinierte Eigenschaften an und ändern Sie sie. +--- + +# Metadaten bearbeiten + +Bearbeiten Sie die in einer PDF-Datei eingebetteten Metadaten. Das Werkzeug füllt ein Formular mit den vorhandenen Metadaten des Dokuments, lässt Sie jedes Feld ändern und speichert die Änderungen in einer neuen PDF. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Das Werkzeug liest ihre aktuellen Metadaten und füllt das Formular. +2. Bearbeiten Sie eines der Standardfelder: Titel, Autor, Betreff, Schlüsselwörter, Ersteller, Producer. +3. Passen Sie Erstellungsdatum und Änderungsdatum mit den Datums- und Zeitauswahlen an. +4. Fügen Sie benutzerdefinierte Metadatenfelder hinzu, indem Sie auf die Hinzufügen-Schaltfläche klicken und ein Schlüssel-Wert-Paar eingeben. +5. Klicken Sie auf die Verarbeitungsschaltfläche, um die geänderte PDF zu speichern. + +## Funktionen + +- Füllt alle vorhandenen Metadaten der hochgeladenen PDF vorab aus +- Standardfelder: Titel, Autor, Betreff, Schlüsselwörter, Ersteller, Producer +- Datums- und Zeitauswahlen für Erstellungs- und Änderungsdatum +- Benutzerdefinierte Schlüssel-Wert-Metadatenfelder für beliebige Eigenschaften +- Speichert Änderungen direkt im Dokumentinformationswörterbuch der PDF + +## Bearbeitbare Felder + +| Feld | Beschreibung | +| ----------------------------- | -------------------------------------------------------------- | +| **Titel** | Der in PDF-Readern angezeigte Dokumenttitel | +| **Autor** | Die Person oder Organisation, die das Dokument erstellt hat | +| **Betreff** | Eine kurze Beschreibung des Dokumentthemas | +| **Schlüsselwörter** | Durch Kommas getrennte Begriffe für Suche und Kategorisierung | +| **Ersteller** | Die Anwendung, die den Inhalt ursprünglich erstellt hat | +| **Produzent** | Die Anwendung, die die PDF erzeugt hat | +| **Erstellungsdatum** | Wann das Dokument ursprünglich erstellt wurde | +| **Änderungsdatum** | Wann das Dokument zuletzt geändert wurde | +| **Benutzerdefinierte Felder** | Beliebige zusätzliche Schlüssel-Wert-Paare, die Sie definieren | + +## Anwendungsfälle + +- Einen passenden Titel und Autor festlegen, bevor ein Dokument veröffentlicht wird +- Schlüsselwörter hinzufügen, um die Auffindbarkeit in Dokumentenmanagementsystemen zu verbessern +- Das Änderungsdatum aktualisieren, damit es der aktuellen Überarbeitung entspricht +- Benutzerdefinierte Metadatenfelder wie Abteilung, Projekt-ID oder Klassifizierung hinzufügen +- Metadaten bereinigen, die von der ursprünglichen Autorensoftware hinterlassen wurden + +## Tipps + +- Benutzerdefinierte Felder werden direkt in das Info-Wörterbuch der PDF geschrieben. Manche PDF-Reader zeigen benutzerdefinierte Felder nicht an, sie bleiben aber in der Datei erhalten. +- Lassen Sie ein Feld leer, um es aus den Metadaten zu löschen. Die Verarbeitungsschaltfläche speichert, was im Formular steht. +- Um Metadaten nur anzusehen, nutzen Sie [Metadaten anzeigen](./view-metadata). Um alle Metadaten vollständig zu entfernen, nutzen Sie Metadaten entfernen. + +## Verwandte Werkzeuge + +- [Metadaten anzeigen](./view-metadata) +- [PDF-OCG-Ebenen](./pdf-layers) +- [PDF komprimieren](./compress-pdf) diff --git a/docs/de/tools/edit-pdf.md b/docs/de/tools/edit-pdf.md new file mode 100644 index 00000000..697a2058 --- /dev/null +++ b/docs/de/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF-Editor +description: Kommentieren Sie, markieren Sie, schwärzen Sie, fügen Sie Formen und Bilder hinzu, durchsuchen Sie und betrachten Sie PDFs direkt in Ihrem Browser. +--- + +# PDF-Editor + +Mit dem PDF-Editor von BentoPDF können Sie Ihre PDFs kommentieren, markieren, schwärzen, mit Anmerkungen versehen, Formen und Bilder hinzufügen und durchsuchen. Er lädt einen voll ausgestatteten Editor direkt in Ihrem Browser, ganz ohne Server-Uploads. + +## So funktioniert es + +1. Laden Sie Ihre PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Der eingebettete PDF-Editor öffnet sich automatisch mit Ihrem geladenen Dokument. +3. Nutzen Sie die Symbolleiste, um zu kommentieren, zu markieren, zu schwärzen, Text hinzuzufügen, Formen zu zeichnen oder Bilder einzufügen. +4. Klicken Sie auf **Bearbeitete PDF herunterladen**, um Ihre Änderungen zu speichern. + +## Funktionen + +- Vollständige Anmerkungs-Symbolleiste mit Markieren, Unterstreichen, Durchstreichen und Freihandzeichnen +- Texteinfügung und Kommentare +- Schwärzungswerkzeuge, die markierte Inhalte endgültig entfernen, sobald Sie die Schwärzung anwenden. Wurden beim Klick auf **Bearbeitete PDF herunterladen** noch nicht alle Markierungen angewendet, bietet der Editor an, sie zuerst anzuwenden. +- Formwerkzeuge für Rechtecke, Kreise, Linien und Pfeile +- Bilder auf PDF-Seiten einfügen +- Integrierte Textsuche im gesamten Dokument +- Unterstützung mehrerer Dokumente mit Tabs (bis zu 10 gleichzeitig geöffnete Dokumente) +- Dateien per Drag-and-drop laden + +## Anwendungsfälle + +- Verträge prüfen und Änderungen mit Markierungen und Kommentaren versehen +- Vertrauliche Informationen wie Sozialversicherungsnummern oder Finanzdaten vor der Weitergabe schwärzen +- Anmerkungen zu Bauplänen oder technischen Zeichnungen hinzufügen +- Firmenlogos oder Stempel auf Dokumentseiten einfügen +- Umfangreiche Rechtsdokumente nach bestimmten Begriffen durchsuchen + +## Tipps + +- Sie können mehrere PDFs gleichzeitig öffnen und über die Tab-Leiste oben im Editor zwischen ihnen wechseln. +- Der Editor erhält die ursprüngliche PDF-Struktur, sodass Schriften, Layouts und Formularfelder intakt bleiben. +- Das Markieren von Text oder einem Bereich zum Schwärzen entfernt nichts, bis die Schwärzung angewendet wird. Wenn Sie ausgewählten Text schwärzen, werden Kopien davon in den Eigenschaften, Lesezeichen, Kommentaren und Anhängen der Datei ebenfalls aus dem Download entfernt, sofern die Datei nicht verschlüsselt ist. +- Für Massen-Wasserzeichen oder Seitenzahlen nutzen Sie die speziellen Werkzeuge, die Ihnen mehr Kontrolle über die Formatierung geben. + +## Verwandte Werkzeuge + +- [Wasserzeichen hinzufügen](./add-watermark) +- [PDF signieren](./sign-pdf) +- [Stempel hinzufügen](./add-stamps) +- [Anmerkungen entfernen](./remove-annotations) diff --git a/docs/de/tools/email-to-pdf.md b/docs/de/tools/email-to-pdf.md new file mode 100644 index 00000000..0b1513fb --- /dev/null +++ b/docs/de/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-Mail zu PDF +description: Wandeln Sie EML- und MSG-E-Mail-Dateien in Ihrem Browser in PDF um. Behält Kopfzeilen, Nachrichtentext und Anhangsliste bei. +--- + +# E-Mail zu PDF + +Wandeln Sie gespeicherte E-Mail-Dateien in saubere, druckbare PDFs um. Das Werkzeug parst EML- und MSG-Dateien, liest die gesamte Nachricht aus (Kopfzeilen, Nachrichtentext und Anhang-Metadaten) und stellt alles in einer strukturierten PDF dar. Praktisch für rechtliche Beweissicherung, Aufbewahrung oder zum Drucken einer wichtigen E-Mail. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----- | :---------- | :------------------------------------------------------------------------- | +| EML | `.eml` | Standard-MIME-E-Mail-Format (aus den meisten E-Mail-Programmen exportiert) | +| MSG | `.msg` | Proprietäres Format von Microsoft Outlook | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre EML- oder MSG-Dateien hinein. Sie können beide Formate in einem Stapel mischen. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Einträge mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um mehr E-Mails aufzunehmen. +3. Konfigurieren Sie die Umwandlungsoptionen (siehe unten). +4. Klicken Sie auf **In PDF umwandeln**. Das Werkzeug parst jede E-Mail, stellt den Inhalt als formatiertes HTML dar und wandelt ihn über die PyMuPDF-Engine in PDF um. +5. Eine einzelne E-Mail wird direkt als PDF heruntergeladen. Mehrere E-Mails werden in `emails-converted.zip` verpackt. + +## Optionen + +| Option | Standard | Beschreibung | +| :---------------------------- | :------- | :------------------------------------------------------------------------------------------------------- | +| **Seitengröße** | A4 | Wählen Sie zwischen den Seitenmaßen A4, Letter oder Legal. | +| **CC und BCC einschließen** | An | Wenn aktiviert, erscheinen die CC- und BCC-Empfängerlisten im Kopfbereich der E-Mail in der PDF. | +| **Anhangsliste einschließen** | An | Wenn aktiviert, erscheint in der PDF eine Liste der Dateianhänge der E-Mail (mit Dateinamen und Größen). | + +## Anwendungsfälle + +- Wichtige Geschäftskorrespondenz für Compliance oder Prüfungen als PDF archivieren +- E-Mail-Verläufe für Gerichtsverfahren oder Auskunftsersuchen drucken +- Einen dauerhaften Nachweis von Bestellbestätigungen, Belegen oder per E-Mail erhaltenen Verträgen anlegen +- Outlook-MSG-Dateien in einem Format sichern, für dessen Lesen Outlook nicht nötig ist +- Kundensupport-Vorgänge aus exportierten EML-Dateien dokumentieren + +## Tipps + +- Sowohl EML (von Thunderbird, Apple Mail und den meisten E-Mail-Programmen verwendet) als auch Outlook-MSG-Dateien werden unterstützt. Exportieren Sie E-Mails aus Ihrem E-Mail-Programm und ziehen Sie sie direkt in das Werkzeug. +- HTML-formatierte E-Mails behalten ihre Formatierung in der PDF. Reine Text-E-Mails werden mit sauberer, gut lesbarer Formatierung dargestellt. +- Die Anhangsliste zeigt Dateinamen und Größen, bettet die eigentlichen Anhangsdateien aber nicht in die PDF ein. + +## Verwandte Werkzeuge + +- [XML zu PDF](./xml-to-pdf) +- [XPS zu PDF](./xps-to-pdf) diff --git a/docs/de/tools/epub-to-pdf.md b/docs/de/tools/epub-to-pdf.md new file mode 100644 index 00000000..43a3c841 --- /dev/null +++ b/docs/de/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB zu PDF +description: Wandeln Sie EPUB-E-Books in Ihrem Browser in PDF um. Kostenlos, kein Upload nötig, Umwandlung mit Fokus auf Privatsphäre. +--- + +# EPUB zu PDF + +Wandeln Sie EPUB-E-Books in PDF-Dateien um, ohne Ihren Browser zu verlassen. EPUB ist der offene Standard für digitale Bücher, aber manchmal brauchen Sie eine PDF mit festem Layout zum Drucken, Kommentieren oder Teilen mit Personen ohne E-Book-Reader. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----- | :---------- | :------------------------- | +| EPUB | `.epub` | EPUB-2- und EPUB-3-Dateien | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre EPUB-Dateien hinein. Mehrfachauswahl wird unterstützt. +2. Prüfen Sie die hochgeladenen Dateien. Entfernen Sie unerwünschte Einträge mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um den Stapel zu erweitern. +3. Klicken Sie auf **In PDF umwandeln**. Die PyMuPDF-Engine rendert den EPUB-Inhalt (Text, Bilder und Formatierung) in eine paginierte PDF-Ausgabe. +4. Ein einzelnes EPUB wird direkt als PDF heruntergeladen. Mehrere Dateien werden in einem ZIP-Archiv namens `epub-converted.zip` verpackt. + +## Optionen + +Die Umwandlung läuft mit sinnvollen Standardwerten und erfordert keine Konfiguration. Der Text wird auf Standardseitengrößen umbrochen, und eingebettete Schriften und Bilder werden in die PDF übernommen. + +## Anwendungsfälle + +- Ein E-Book ohne DRM zum Lesen abseits von Bildschirmen drucken +- Ein EPUB-Manuskript als PDF mit festem Layout zur Begutachtung einreichen +- Digitale Bücher in einem Format archivieren, das jedes Betriebssystem nativ öffnen kann +- Ein Kapitel mit einem Kollegen teilen, der keinen EPUB-Reader hat +- Als EPUB verteilte technische Dokumentation in kommentierbare PDFs umwandeln + +## Tipps + +- EPUB-3-Funktionen wie eingebettetes Audio und Video werden nicht in die PDF übernommen, aber sämtlicher Text, alle Bilder und Tabellen werden sauber umgewandelt. +- Bei stark formatierten EPUBs prüfe die ersten Seiten der Ausgabe, um die Layouttreue zu bestätigen. + +## Verwandte Werkzeuge + +- [MOBI zu PDF](./mobi-to-pdf) +- [FB2 zu PDF](./fb2-to-pdf) +- [CBZ zu PDF](./cbz-to-pdf) diff --git a/docs/de/tools/excel-to-pdf.md b/docs/de/tools/excel-to-pdf.md new file mode 100644 index 00000000..604344ca --- /dev/null +++ b/docs/de/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel zu PDF +description: Wandeln Sie Excel-Tabellen (XLS, XLSX), ODS- und CSV-Dateien unter Erhalt der Formatierung in PDF um. +--- + +# Excel zu PDF + +Wandeln Sie Tabellendateien in PDF um. Das Werkzeug verarbeitet moderne Excel-Dateien, das ältere XLS-Format, OpenDocument-Tabellen und sogar CSV. Alles wird über eine browserbasierte LibreOffice-Engine gerendert, die Zellformatierung, Formeln (als berechnete Werte), Diagramme und Layouts mit mehreren Blättern erhält. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :------------------- | :------------ | +| Excel (modern) | `.xlsx` | +| Excel (älter) | `.xls` | +| OpenDocument-Tabelle | `.ods` | +| CSV | `.csv` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre Tabellendateien hinein. +2. Prüfen Sie die Dateiliste. Fügen Sie weitere Dateien hinzu oder entfernen Sie unerwünschte. +3. Klicken Sie auf **In PDF umwandeln**. Die LibreOffice-Engine wird bei der ersten Nutzung initialisiert und verarbeitet dann jede Datei. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden als `excel-converted.zip` geliefert. + +## Optionen + +Dieses Werkzeug hat keine zusätzliche Konfiguration. Die LibreOffice-Engine bestimmt Seitenlayout, Skalierung und Druckbereich anhand der integrierten Einstellungen der Tabelle. + +## Ausgabe + +| Anzahl Eingaben | Ausgabe | +| :-------------- | :------------------------------------------------------------------ | +| 1 Datei | Einzelner PDF-Download (ursprünglicher Dateiname mit Endung `.pdf`) | +| 2+ Dateien | ZIP-Archiv (`excel-converted.zip`) mit einer PDF pro Datei | + +## Anwendungsfälle + +- Finanzberichte oder Budgets aus Excel zur Weitergabe in PDF umwandeln +- Druckfertige PDFs aus Bestands- oder Produktkatalog-Tabellen erstellen +- Datenanalyse-Ergebnisse mit Beteiligten teilen, die kein Excel installiert haben +- Quartalsberichte in einem nicht bearbeitbaren Format archivieren +- ODS-Dateien aus LibreOffice Calc in PDF umwandeln + +## Tipps + +- In der Tabelle eingebettete Diagramme werden in der PDF dargestellt. Prüfen Sie vor der Umwandlung, dass sie in der Quelldatei korrekt aussehen. +- Hat Ihre Tabelle mehrere Blätter, werden alle Blätter in die PDF-Ausgabe aufgenommen. +- Für einfache CSV-Daten ohne Formatierung bietet das Werkzeug [CSV zu PDF](./csv-to-pdf) eine leichtere Umwandlung. Nutzen Sie Excel zu PDF, wenn Formatierung, Diagramme oder mehrere Blätter erhalten bleiben sollen. + +## Verwandte Werkzeuge + +- [CSV zu PDF](./csv-to-pdf) +- [Word zu PDF](./word-to-pdf) +- [PowerPoint zu PDF](./powerpoint-to-pdf) diff --git a/docs/de/tools/extract-attachments.md b/docs/de/tools/extract-attachments.md new file mode 100644 index 00000000..b32f058c --- /dev/null +++ b/docs/de/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Anhänge extrahieren +description: Extrahieren Sie alle eingebetteten Dateianhänge aus einer oder mehreren PDFs und laden Sie sie als ZIP-Archiv herunter. +--- + +# Anhänge extrahieren + +Holen Sie jeden eingebetteten Anhang aus einer oder mehreren PDF-Dateien heraus. Alle extrahierten Dateien werden zum Download in einem einzigen ZIP-Archiv gebündelt. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch, die eingebettete Anhänge enthalten. +2. Klicken Sie auf **Anhänge extrahieren**. +3. Das Werkzeug durchsucht jede PDF nach Anhängen auf Dokument- und Seitenebene. +4. Alle gefundenen Dateien werden in einem ZIP-Archiv verpackt und automatisch heruntergeladen. +5. Eine Statusmeldung bestätigt, wie viele Anhänge gefunden wurden und wie groß sie insgesamt sind. + +## Funktionen + +- Stapelextraktion aus mehreren PDFs gleichzeitig +- Extrahiert Anhänge auf Dokument- und auf Seitenebene +- Gibt eine einzelne ZIP-Datei mit allen extrahierten Dateien aus +- Zeigt die Gesamtzahl der Anhänge und die kombinierte Dateigröße an +- Klare Statusmeldungen, wenn keine Anhänge gefunden werden + +## Anwendungsfälle + +- In einer Bericht-PDF eingebettete Datendateien wiederherstellen +- Bilddateien aus einem Portfolio oder einer Spezifikation herausholen +- Ergänzende Materialien aus Schulungs- oder Compliance-PDFs extrahieren +- Prüfen, welche Dateien in einem Stapel von PDFs eingebettet sind + +## Tipps + +- Meldet das Werkzeug keine Anhänge, enthält die PDF möglicherweise stattdessen eingebettete Bilder oder Formulardaten, die keine Dateianhänge sind. Für eingebettete Bilder nutzen Sie [Bilder extrahieren](./extract-images). +- Bei der Verarbeitung mehrerer PDFs landen alle Anhänge aller Dateien in einem ZIP. Die Dateinamen bleiben wie bei der ursprünglichen Einbettung erhalten. + +## Verwandte Werkzeuge + +- [Anhänge hinzufügen](./add-attachments) +- [Anhänge bearbeiten](./edit-attachments) +- [Bilder extrahieren](./extract-images) diff --git a/docs/de/tools/extract-images.md b/docs/de/tools/extract-images.md new file mode 100644 index 00000000..3856b125 --- /dev/null +++ b/docs/de/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Bilder extrahieren +description: Extrahieren Sie alle eingebetteten Bilder aus PDF-Dateien. Zeigen Sie sie in einem Raster an und laden Sie sie einzeln oder als ZIP-Archiv herunter. +--- + +# Bilder extrahieren + +Holt jedes eingebettete Bild aus einer oder mehreren PDF-Dateien heraus. Die extrahierten Bilder werden in einem Vorschauraster angezeigt, in dem Sie sie einzeln herunterladen oder alles auf einmal als ZIP erhalten können. Angetrieben von PyMuPDF. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien darauf ziehen. Fügen Sie nach Bedarf weitere Dateien hinzu oder entfernen Sie einzelne. +2. Klicken Sie auf **Extrahieren**, um die Verarbeitung zu starten. +3. Das Werkzeug durchsucht jede Seite jeder hochgeladenen PDF und findet und extrahiert eingebettete Bilder. +4. Die extrahierten Bilder erscheinen als Vorschaubilder in einem Raster. Jedes Bild hat eine Download-Schaltfläche. +5. Klicken Sie auf **Alle herunterladen**, um alles als ZIP-Archiv zu speichern. + +## Optionen + +Dieses Werkzeug hat keine konfigurierbaren Optionen. Alle eingebetteten Bilder werden in ihrem nativen Format extrahiert (typischerweise PNG, JPEG oder dem Format, das beim Einbetten des Bildes in die PDF verwendet wurde). + +## Ausgabeformat + +- Bilder erscheinen im Vorschauraster mit Namen wie `image_1.png`, `image_2.jpg` usw. +- **Alle herunterladen** erzeugt `extracted-images.zip` mit allen Bildern. +- Einzelne Bilder können nacheinander aus dem Raster heruntergeladen werden. + +## Anwendungsfälle + +- Fotos oder Grafiken aus einer PDF zur Wiederverwendung in einem anderen Projekt zurückgewinnen. +- Produktbilder aus einer Katalog-PDF für ein E-Commerce-Angebot extrahieren. +- Diagramme aus technischer Dokumentation für Präsentationen herausholen. +- Prüfen, welche Bilder in einem Dokument eingebettet sind, bevor Sie es teilen. + +## Tipps + +- Das Werkzeug extrahiert Bilder genau so, wie sie in der PDF gespeichert sind. Es rendert keine Seiten als Bilder. Dafür nutzen Sie [PDF zu PNG](./pdf-to-png) oder [PDF zu JPG](./pdf-to-jpg). +- Meldet das Werkzeug "Keine Bilder gefunden", verwendet die PDF möglicherweise Vektorgrafiken statt eingebetteter Rasterbilder, oder es ist ein gescanntes Dokument, bei dem die gesamte Seite ein einziges großes Bild ist. +- Die Stapelverarbeitung funktioniert über mehrere PDFs hinweg. Alle Bilder aller Dateien werden in einem einzigen Raster und ZIP zusammengefasst. + +## Verwandte Werkzeuge + +- [PDF zu PNG](./pdf-to-png) +- [PDF zu JPG](./pdf-to-jpg) +- [PDF-Workflow-Builder](./pdf-workflow) diff --git a/docs/de/tools/extract-pages.md b/docs/de/tools/extract-pages.md new file mode 100644 index 00000000..d47fbf5b --- /dev/null +++ b/docs/de/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Seiten extrahieren +description: Speichern Sie einen bestimmten Seitenbereich einer PDF als neues Dokument. +--- + +# Seiten extrahieren + +Holen Sie eine Reihe von Seiten aus einer PDF und speichern Sie sie als neue Datei. Geben Sie mit der Bereichssyntax genau an, welche Seiten Sie möchten, und das Werkzeug erstellt eine saubere PDF, die nur diese Seiten enthält. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Das Werkzeug zeigt Dateinamen, Größe und Gesamtseitenzahl an. +2. Geben Sie die zu extrahierenden Seiten mit der Bereichssyntax ein (z. B. `1-5`, `3, 7, 10-12`). +3. Wählen Sie optional, jeden Bereich als separate PDF in einem ZIP-Archiv herunterzuladen. +4. Klicken Sie auf die Verarbeitungsschaltfläche. Die extrahierten Seiten werden als neue PDF (oder ZIP) heruntergeladen. + +## Funktionen + +- Flexible Seitenbereichssyntax: einzelne Seiten, Bereiche oder durch Kommas getrennte Kombinationen +- Zeigt nach dem Hochladen die Gesamtseitenzahl zur einfachen Orientierung an +- Option zur Ausgabe als eine kombinierte PDF oder als einzelne Dateien in einem ZIP +- Erhält den ursprünglichen Seiteninhalt und die Formatierung + +## Anwendungsfälle + +- Die Zusammenfassung (die ersten Seiten) aus einem langen Bericht herausziehen +- Ein einzelnes Kapitel aus einer Lehrbuch-PDF extrahieren +- Bestimmte Seiten aus einem Formularpaket als eigenständige Dokumente speichern +- Aus ausgewählten Seiten einer größeren Datei ein Beispieldokument erstellen + +## Tipps + +- Seitenzahlen beginnen bei 1. Verwenden Sie `1` für die erste Seite, nicht `0`. +- Zum Entfernen statt Extrahieren von Seiten nutzen Sie [Seiten löschen](./delete-pages), die Umkehroperation. +- Wenn Sie eine visuelle Seitenauswahl mit Vorschaubildern brauchen, nutzen Sie [PDF teilen](./split-pdf) im Modus Visuelle Auswahl. + +## Verwandte Werkzeuge + +- [PDF teilen](./split-pdf) +- [Seiten löschen](./delete-pages) +- [PDF zusammenführen](./merge-pdf) diff --git a/docs/de/tools/extract-tables.md b/docs/de/tools/extract-tables.md new file mode 100644 index 00000000..70f768d0 --- /dev/null +++ b/docs/de/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Tabellen extrahieren +description: Erkennen Sie und extrahieren Sie Tabellen aus PDF-Dokumenten. Export als CSV, JSON oder Markdown mit Einzeltabellen-Granularität. +--- + +# Tabellen extrahieren + +Erkennt alle Tabellen in einer PDF und lässt Sie sie im Format Ihrer Wahl exportieren: CSV, JSON oder Markdown. Jede Tabelle wird einzeln mit Seiten- und Positionsmetadaten extrahiert. Angetrieben von der Tabellenerkennung von PyMuPDF. + +## So funktioniert es + +1. Laden Sie eine PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Wählen Sie Ihr bevorzugtes **Exportformat**: CSV, JSON oder Markdown. +3. Klicken Sie auf **Extrahieren**, um die Verarbeitung zu starten. +4. Wird eine Tabelle gefunden, wird sie als einzelne Datei heruntergeladen. Mehrere Tabellen ergeben ein ZIP-Archiv mit einer Datei pro Tabelle. + +## Optionen + +- **Exportformat**: Wählen Sie zwischen: + - **CSV**: durch Kommas getrennte Werte mit korrekter Maskierung für Felder, die Kommas, Anführungszeichen oder Zeilenumbrüche enthalten. Geeignet für Tabellenkalkulationen und Datenbanken. + - **JSON**: Array-von-Arrays-Struktur, formatiert mit 2 Leerzeichen Einrückung. Geeignet für die programmatische Weiterverarbeitung. + - **Markdown**: Tabellenformat mit senkrechten Strichen als Trennzeichen, von PyMuPDF erzeugt. Geeignet für Dokumentation und README-Dateien. + +## Ausgabeformat + +- **Einzelne Tabelle**: `filename_table.csv` (oder `.json` / `.md`) +- **Mehrere Tabellen**: `filename_tables.zip` mit Dateien wie `table_1_page3.csv`, `table_2_page5.csv` usw. + +## Anwendungsfälle + +- Bestimmte Tabellen aus langen PDF-Berichten extrahieren, ohne die Daten des gesamten Dokuments zu ziehen. +- Tabellen im Markdown-Format erhalten, um sie direkt in GitHub-Issues, Wikis oder Dokumentation einzufügen. +- Strukturierte JSON-Daten aus PDF-Tabellen für API-Integrationen oder Skripte gewinnen. +- Tabellen verschiedener PDF-Versionen vergleichen, indem beide als CSV exportiert und per Diff verglichen werden. + +## Tipps + +- Dieses Werkzeug gibt Ihnen Kontrolle pro Tabelle. Wenn Sie einfach alle Tabellen in einer einzigen CSV haben möchten, nutzen Sie [PDF zu CSV](./pdf-to-csv). Für eine vollständige Excel-Arbeitsmappe nutzen Sie [PDF zu Excel](./pdf-to-excel). +- Tabellen, die sich über mehrere Seiten erstrecken, werden möglicherweise als separate Tabellen pro Seite erkannt. Sie müssen sie eventuell manuell zusammenfügen. +- Werden keine Tabellen erkannt, ist die PDF möglicherweise ein gescanntes Bild. Führen Sie zuerst OCR aus, um eine Textebene hinzuzufügen. + +## Verwandte Werkzeuge + +- [PDF zu CSV](./pdf-to-csv) +- [PDF zu Excel](./pdf-to-excel) +- [PDF zu Text](./pdf-to-text) diff --git a/docs/de/tools/fb2-to-pdf.md b/docs/de/tools/fb2-to-pdf.md new file mode 100644 index 00000000..454c5169 --- /dev/null +++ b/docs/de/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 zu PDF +description: Wandeln Sie FictionBook-E-Books (FB2) direkt im Browser in PDF um. Kostenlos, privat, ohne Server-Upload. +--- + +# FB2 zu PDF + +Wandeln Sie FictionBook-2-Dateien (FB2) in PDF-Dokumente um. FB2 ist ein XML-basiertes E-Book-Format, das in Russland und Osteuropa beliebt ist. Auf manchen Plattformen wird es gut unterstützt, auf anderen ist es praktisch unbekannt. Mit der Umwandlung in PDF lassen sich Ihre Bücher überall lesen. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :------------ | :---------- | :-------------------------- | +| FictionBook 2 | `.fb2` | XML-basiertes E-Book-Format | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre FB2-Dateien per Drag & Drop hinein. Mehrere Dateien auf einmal sind möglich. +2. Prüfen Sie die Dateiliste. Mit dem Papierkorb-Symbol entfernen Sie einzelne Einträge, mit **Weitere Dateien hinzufügen** ergänzen Sie weitere. +3. Klicken Sie auf **In PDF umwandeln**. Die PyMuPDF-Engine liest die FB2-XML-Struktur ein und gibt sie als paginierten PDF-Inhalt aus. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Umwandlungen werden in `fb2-converted.zip` gebündelt. + +## Optionen + +Es ist keine Konfiguration nötig. Der Konverter verarbeitet die FB2-XML-Struktur automatisch und erhält Kapitelumbrüche, Formatierungen und eingebettete Bilder. + +## Anwendungsfälle + +- FB2-E-Books auf Geräten oder in Apps lesen, die nur PDF unterstützen +- Russischsprachige Literatur drucken, die im FB2-Format verbreitet wird +- Eine FB2-Bibliothek in ein universell unterstütztes Format archivieren +- Ein Buch mit jemandem teilen, dessen Reader FictionBook nicht unterstützt + +## Tipps + +- FB2-Dateien sind reines XML, daher sind sie meist klein und lassen sich selbst im Browser schnell umwandeln. +- Wenn Ihre FB2-Dateien als `.fb2.zip` komprimiert sind, entpacken Sie sie vor dem Hochladen. + +## Verwandte Werkzeuge + +- [EPUB zu PDF](./epub-to-pdf) +- [MOBI zu PDF](./mobi-to-pdf) +- [XML zu PDF](./xml-to-pdf) diff --git a/docs/de/tools/fix-page-size.md b/docs/de/tools/fix-page-size.md new file mode 100644 index 00000000..e71b7a3f --- /dev/null +++ b/docs/de/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Seitengröße reparieren +description: Vereinheitlichen Sie alle Seiten einer PDF auf eine einheitliche Größe. Wählen Sie Standardformate oder geben Sie eigene Maße an. +--- + +# Seitengröße reparieren + +PDFs, die aus mehreren Quellen zusammengestellt wurden, haben oft unterschiedliche Seitengrößen: manche Letter, manche A4, manche völlig untypisch. Dieses Werkzeug zwingt jede Seite auf eine einzige Zielgröße und skaliert den Inhalt je nach Bedarf, damit er passt oder die Seite füllt. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Wählen Sie im Dropdown eine **Zielseitengröße** (A4, Letter, Legal, A3, A5, Tabloid oder Benutzerdefiniert). +3. Wählen Sie eine **Ausrichtung**: Automatisch behält die ursprüngliche Ausrichtung jeder Seite bei, alternativ erzwingen Sie Hochformat oder Querformat. +4. Wählen Sie einen **Inhaltsskalierungs**-Modus: Einpassen (erhält den gesamten Inhalt, kann Ränder hinzufügen) oder Füllen (füllt die Seite, kann Ränder abschneiden). +5. Legen Sie optional eine **Hintergrundfarbe** für hinzugefügte Ränder fest. +6. Klicken Sie auf **Seitengröße reparieren**. + +## Optionen + +- **Standardgrößen**: A4, Letter, Legal, A3, A5, Tabloid +- **Benutzerdefinierte Maße**: Breite und Höhe in Zoll oder Millimetern eingeben +- **Ausrichtung**: Automatisch, Hochformat, Querformat +- **Skalierungsmodus**: Einpassen oder Füllen (Zuschneiden) +- **Hintergrundfarbe**: Beliebige Farbe für die Randauffüllung + +## Anwendungsfälle + +- Eine zusammengeführte PDF vereinheitlichen, deren Seiten von verschiedenen Scannern stammen +- Ein US-Letter-Dokument für den internationalen Versand in A4 umwandeln +- Druckfertige PDFs mit einheitlichem Endformat vorbereiten +- Seiten korrigieren, die leicht vom Standard abweichen (z. B. 8,49 x 11,02 Zoll statt 8,5 x 11) + +## Tipps + +- Nutzen Sie den Modus Einpassen, damit garantiert kein Inhalt verloren geht. Der Modus Füllen sieht sauberer aus, kann aber Ränder abschneiden. +- Prüfen Sie das Ergebnis mit dem Werkzeug Seitenmaße, um sicherzugehen, dass jede Seite zur Zielgröße passt. +- Standardmäßig ist die Hintergrundfarbe Weiß. Wechseln Sie zu einer dunklen Farbe, wenn Ihr Dokument dunkle Ränder hat. + +## Verwandte Werkzeuge + +- [Seitenmaße](./page-dimensions): Seitengrößen vor und nach der Korrektur prüfen +- [PDF komprimieren](./compress-pdf): Dateigröße nach der Vereinheitlichung verringern +- [PDF zuschneiden](./crop-pdf): Seiten manuell zuschneiden statt automatisch zu skalieren diff --git a/docs/de/tools/flatten-pdf.md b/docs/de/tools/flatten-pdf.md new file mode 100644 index 00000000..6b481ff6 --- /dev/null +++ b/docs/de/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: PDF reduzieren +description: Wandeln Sie interaktive Formulare und Annotationen in statische Inhalte um. Formularfelder werden nicht mehr bearbeitbar, Annotationen werden in die Seite eingebrannt. +--- + +# PDF reduzieren + +Beim Reduzieren (Flatten) werden interaktive Elemente wie Formularfelder, Dropdowns, Kontrollkästchen, Annotationen, Markierungen und Haftnotizen direkt in den Seiteninhalt eingebunden. Das Aussehen bleibt gleich, aber nichts ist mehr bearbeitbar oder extrahierbar. Es ist das PDF-Pendant dazu, ein ausgefülltes Formular auszudrucken und wieder einzuscannen, nur bleibt die Qualität perfekt. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. +2. Klicken Sie auf **PDF reduzieren**. +3. Eine einzelne Datei wird direkt heruntergeladen. Mehrere Dateien ergeben ein ZIP-Archiv. + +Das Werkzeug nutzt pdf-lib, um Formularfelder zu reduzieren (über `form.flatten()`), und einen eigenen Annotations-Flattener, der Annotationen in den Seitenstream einbrennt. Beide Vorgänge laufen in einem Durchgang. + +## Was reduziert wird + +- **Formularfelder**: Texteingaben, Kontrollkästchen, Optionsfelder, Dropdowns, Signaturfelder +- **Annotationen**: Kommentare, Markierungen, Durchstreichungen, Unterstreichungen, Haftnotizen, Stempel, Freihandannotationen +- **Interaktive Elemente**: Schaltflächen, Aktionsauslöser + +## Was unverändert bleibt + +- Textinhalt (bleibt auswählbar und durchsuchbar) +- Bilder und Grafiken +- Seitenlayout und Abmessungen +- Lesezeichen und Inhaltsverzeichnis +- Hyperlinks (außer sie basieren auf Annotationen) + +## Anwendungsfälle + +- Ein ausgefülltes Formular sperren, damit Empfänger die abgegebenen Antworten nicht ändern können +- Eine PDF für die Archivierung vorbereiten, wenn interaktive Elemente überflüssig sind +- Darstellungsprobleme beheben, weil Annotationen in verschiedenen Viewern unterschiedlich angezeigt werden +- Sicherstellen, dass ein unterschriebenes Dokument nach der Signatur nicht mehr verändert werden kann +- Die Dateigröße verringern, indem Formularfelddefinitionen und Annotationsobjekte entfernt werden + +## Tipps + +- Reduzieren Sie erst, wenn alle Änderungen abgeschlossen sind. Das Reduzieren einer PDF lässt sich nicht rückgängig machen. +- Wenn Sie zusätzlich Metadaten, JavaScript und Anhänge entfernen wollen, nutzen Sie stattdessen das Werkzeug PDF bereinigen. Es enthält das Reduzieren als eine der Optionen. +- Manche PDFs melden "kein Formular gefunden". Das ist normal, wenn das Dokument nur Annotationen und keine Formularfelder enthält. + +## Verwandte Werkzeuge + +- [PDF bereinigen](./sanitize-pdf): Formulare reduzieren und zusätzlich Metadaten, Skripte und mehr entfernen +- [PDF rastern](./rasterize-pdf): in eine bildbasierte PDF umwandeln für maximales Reduzieren +- [Schriftart zu Umriss](./font-to-outline): Schriften in Vektorpfade umwandeln +- [PDF verschlüsseln](./protect-pdf): die reduzierte PDF mit einem Passwort sperren diff --git a/docs/de/tools/font-to-outline.md b/docs/de/tools/font-to-outline.md new file mode 100644 index 00000000..38cc3785 --- /dev/null +++ b/docs/de/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Schriftart zu Umriss +description: Wandeln Sie alle PDF-Schriften in Vektorumrisse um, für eine einheitliche Darstellung auf allen Geräten. Beseitigt Probleme mit fehlenden Schriften. +--- + +# Schriftart zu Umriss + +Beim Umwandeln von Schriften in Umrisse wird jedes Textzeichen von einem schriftbasierten Glyphen in einen Vektorpfad verwandelt. Die PDF hängt dann von keiner installierten Schrift mehr ab und wird auf jedem Gerät, in jedem Betriebssystem und auf jedem Drucker identisch dargestellt. Das ist ein Standardschritt in Prepress-Workflows. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. +2. Klicken Sie auf **In Umrisse umwandeln**. +3. Ghostscript wandelt den gesamten Text in Vektorpfade um. +4. Laden Sie das Ergebnis herunter. Mehrere Dateien ergeben ein ZIP-Archiv. + +Es gibt keine Einstellungen. Das Werkzeug nutzt Ghostscript (WebAssembly), um alle Schriftverweise in einem Durchgang in Umrisspfade umzuwandeln. + +## Was sich ändert + +- Textzeichen werden zu Vektorkurven (Bézierpfade) +- Das Einbetten von Schriften ist nicht mehr nötig, die PDF ist auf Glyphenebene in sich geschlossen +- Die Dateigröße kann steigen, da Vektorpfade meist größer sind als Schriftverweise +- Das Erscheinungsbild bleibt exakt erhalten + +## Was verloren geht + +- Textauswahl und Kopieren und Einfügen +- Durchsuchbarkeit des Textes (Strg+F funktioniert nicht mehr) +- Die Möglichkeit, den Textinhalt zu bearbeiten +- Barrierefreiheit für Screenreader + +## Anwendungsfälle + +- PDFs an eine Druckerei schicken, die Schriften in Umrissen verlangt +- Dokumente mit eigenen oder lizenzierten Schriften an Personen weitergeben, die diese Schriften nicht haben +- Schriftersetzung verhindern, die das Aussehen Ihres Dokuments auf anderen Systemen verändert +- PDFs für Lasergravur oder CNC-Fräsen vorbereiten, die Vektoreingaben erfordern +- Sicherstellen, dass eine logolastige PDF auf allen Plattformen korrekt angezeigt wird + +## Tipps + +- Behalten Sie Ihre Original-PDF. Das Umwandeln in Umrisse ist unumkehrbar, Pfade lassen sich nicht in bearbeitbaren Text zurückverwandeln. +- Wenn der Text durchsuchbar bleiben soll, nehmen Sie stattdessen das Werkzeug PDF rastern mit anschließender OCR. +- PDFs mit Umrissen sind tendenziell größer. Führen Sie danach PDF komprimieren aus, wenn die Dateigröße wichtig ist. + +## Verwandte Werkzeuge + +- [PDF reduzieren](./flatten-pdf): Formulare und Annotationen reduzieren, ohne Schriften anzutasten +- [PDF rastern](./rasterize-pdf): in eine bildbasierte PDF statt in Vektorumrisse umwandeln +- [PDF komprimieren](./compress-pdf): Dateigröße nach dem Umwandeln verringern +- [PDF zu PDF/A](./pdf-to-pdfa): für die Archivierung umwandeln, nachdem die Schriftunabhängigkeit sichergestellt ist diff --git a/docs/de/tools/form-creator.md b/docs/de/tools/form-creator.md new file mode 100644 index 00000000..e0cad9de --- /dev/null +++ b/docs/de/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: PDF-Formular erstellen +description: Erstellen Sie ausfüllbare PDF-Formulare per Drag & Drop mit Textfeldern, Kontrollkästchen, Dropdowns, Optionsfeldern und mehr. +--- + +# PDF-Formular erstellen + +Gestalten Sie professionelle ausfüllbare PDF-Formulare von Grund auf oder fügen Sie Felder zu einer bestehenden PDF hinzu. Im visuellen Editor ziehen Sie Formularelemente wie Textfelder, Kontrollkästchen, Dropdowns, Optionsfelder und Signaturfelder direkt auf die Seitenvorschau. Konfigurieren Sie Feldeigenschaften, richten Sie Regeln für bedingte Sichtbarkeit ein und exportieren Sie ein vollständig interaktives PDF-Formular. + +## So funktioniert es + +1. Laden Sie eine bestehende PDF hoch **oder** klicken Sie auf **Leere PDF erstellen**, um von vorn zu beginnen. +2. Wenn Sie eine leere PDF erstellen, wählen Sie eine Seitengröße (Letter, A4, A5, Legal, Tabloid, A3 oder eigene Maße). +3. Der Formulareditor öffnet sich mit einer Symbolleiste für Feldtypen und einer Seitenvorschau. +4. Wählen Sie in der Symbolleiste einen Feldtyp aus und klicken Sie dann auf die Seite, um es zu platzieren. +5. Ziehen Sie Felder, um sie zu verschieben. Mit den Anfasserpunkten passen Sie die Größe an. +6. Klicken Sie auf ein Feld, um das Eigenschaftenfenster zu öffnen. Dort legen Sie Feldname, Standardwert, Schriftgröße, Ausrichtung und mehr fest. +7. Wechseln Sie mit den Seitensteuerungen zwischen den Seiten. +8. Klicken Sie auf **Speichern**, um die fertige ausfüllbare PDF herunterzuladen. + +## Funktionen + +- Felder per Drag & Drop platzieren, mit sichtbaren Anfassern zur Größenänderung +- Feldtypen: Texteingabe, mehrzeiliger Text, Kontrollkästchen, Dropdown, Optionsfeld, Signatur, Datum, Zahl und Barcode +- Eigenschaftenfenster zum Konfigurieren von Name, Beschriftung, Standardwert, Schriftgröße, Farbe, Ausrichtung und Validierung jedes Felds +- Feldaktionen und Regeln für bedingte Sichtbarkeit (Felder abhängig von anderen Feldwerten ein- oder ausblenden) +- Seitennavigation für mehrseitige Formulare +- Extraktion vorhandener Felder: Formularfelder aus hochgeladenen PDFs werden automatisch erkannt und importiert +- Unterstützung sowohl für hochgeladene PDFs als auch für leere Seiten als Formularfläche +- Mehrere Seitengrößen-Voreinstellungen sowie eigene Maße +- Barcode-Erzeugung mit bwip-js +- Verwaltung von Optionsfeldgruppen + +## Optionen + +**Seitengrößen-Voreinstellungen (für leere PDFs):** + +- Letter (8,5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Benutzerdefiniert (Breite und Höhe angeben) + +**Feldeigenschaften (abhängig vom Feldtyp):** + +- Name, Beschriftung und Platzhaltertext +- Standardwert +- Schriftart, Schriftgröße und Farbe +- Textausrichtung (links, zentriert, rechts) +- Schalter für Pflichtfeld +- Schalter für Schreibschutz +- Maximale Länge für Textfelder +- Optionsliste für Dropdowns und Optionsfelder +- Aktionen für bedingte Sichtbarkeit + +## Anwendungsfälle + +- Onboarding-Formulare für Mitarbeitende mit Textfeldern für persönliche Angaben und Kontrollkästchen für die Bestätigung von Richtlinien +- Fragebögen zur Kundenaufnahme mit Dropdowns zur Leistungsauswahl +- Bestellformulare mit berechneten Feldern und Barcode-Kennungen +- Prüfchecklisten mit Optionsfeldern für Bestanden/Nicht bestanden +- Umfrageformulare mit bedingten Folgefragen, die abhängig von den Antworten erscheinen + +## Tipps + +- Wenn Sie eine bestehende PDF hochladen, versucht das Werkzeug, vorhandene Formularfelder zu extrahieren, sodass Sie sie bearbeiten oder ergänzen können. +- Nutzen Sie die Optionsfeldgruppen, um sich gegenseitig ausschließende Auswahlen zu erstellen. Felder in derselben Gruppe teilen sich einen Gruppennamen. +- Testen Sie Ihr Formular, indem Sie es herunterladen und im [PDF-Formular ausfüllen](./form-filler) öffnen, um das Feldverhalten zu prüfen. + +## Verwandte Werkzeuge + +- [PDF-Formular ausfüllen](./form-filler) +- [PDF unterschreiben](./sign-pdf) +- [PDF-Editor](./edit-pdf) diff --git a/docs/de/tools/form-filler.md b/docs/de/tools/form-filler.md new file mode 100644 index 00000000..88d8975b --- /dev/null +++ b/docs/de/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF-Formular ausfüllen +description: Füllen Sie PDF-Formulare einschließlich XFA-Formularen direkt im Browser mit einem integrierten Viewer aus. +--- + +# PDF-Formular ausfüllen + +Öffnen Sie eine PDF mit Formularfeldern und füllen Sie sie direkt in einem integrierten Viewer aus. Das Werkzeug unterstützt sowohl Standard-AcroForm-Felder als auch ältere XFA-Formulare (XML Forms Architecture). Wenn Sie das Formular ausgefüllt haben, laden Sie die ausgefüllte Version mit einem Klick herunter. + +## So funktioniert es + +1. Laden Sie eine PDF mit Formularfeldern hoch. +2. Das Dokument öffnet sich in einem integrierten PDF-Viewer, der Formularfelder als interaktive Eingaben darstellt. +3. Klicken Sie auf Textfelder, Kontrollkästchen, Dropdowns und Optionsfelder, um sie auszufüllen. +4. Klicken Sie auf **Speichern & ausgefülltes Formular herunterladen**, um die fertige PDF zu erhalten. + +## Funktionen + +- Integrierter PDF.js-Viewer mit vollständiger Interaktion mit Formularfeldern +- Unterstützung für Standard-AcroForm-Felder (Texteingaben, Kontrollkästchen, Dropdowns, Optionsfelder) +- XFA-Unterstützung für ältere XML-basierte Formulare +- Automatische Viewer-Größe anhand der Seitenmaße +- Dateianzeige mit Name und Größe + +## Optionen + +Es gibt keine zusätzlichen Konfigurationsoptionen. Laden Sie das Formular hoch, füllen Sie es aus und laden Sie es herunter. + +## Anwendungsfälle + +- Steuerformulare, Versicherungsanträge oder Behördenunterlagen ausfüllen +- Bewerbungsformulare ausfüllen, die als PDF-Anhang eingehen +- Onboarding-Formulare für Lieferanten oder Lieferantenfragebögen ausfüllen +- Compliance-Checklisten mit Kontrollkästchen abzeichnen +- Anamnesebögen vor einem Termin ausfüllen + +## Tipps + +- XFA-Formulare sind ein älteres Format, das nur von manchen PDF-Viewern unterstützt wird. Wenn Sie eine XFA-PDF in Chrome oder den meisten anderen Programmen öffnen und leere Seiten sehen, fehlt diesen Viewern die XFA-Unterstützung. Das Ausfüllen von Formularen in BentoPDF und Firefox verarbeiten XFA korrekt. +- Für PDFs ohne vorhandene Formularfelder nutzen Sie zuerst das Werkzeug [PDF-Formular erstellen](./form-creator), um Felder hinzuzufügen, und füllen sie dann hier aus. +- Der Viewer passt seine Größe automatisch an die Seitenmaße der PDF an. + +## Verwandte Werkzeuge + +- [PDF-Formular erstellen](./form-creator) +- [PDF unterschreiben](./sign-pdf) +- [PDF-Editor](./edit-pdf) diff --git a/docs/de/tools/header-footer.md b/docs/de/tools/header-footer.md new file mode 100644 index 00000000..216ae5a3 --- /dev/null +++ b/docs/de/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Kopf- & Fußzeile +description: Fügen Sie den PDF-Seiten anpassbaren Kopf- und Fußzeilentext mit dynamischen Seitenzahl-Variablen hinzu. +--- + +# Kopf- & Fußzeile + +Fügen Sie Text an sechs Positionen Ihrer PDF-Seiten hinzu: Kopfzeile links, Kopfzeile Mitte, Kopfzeile rechts, Fußzeile links, Fußzeile Mitte und Fußzeile rechts. Das Werkzeug unterstützt dynamische Variablen für Seitenzahlen und Gesamtseitenzahl, sodass Sie Vorlagen wie "Seite 3 von 10" erstellen können, die sich pro Seite automatisch aktualisieren. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Das Optionsfenster erscheint mit Formatierungssteuerungen und sechs Texteingabefeldern. +3. Geben Sie den gewünschten Text an einer beliebigen Position der Kopf- oder Fußzeile ein. +4. Nutzen Sie die Platzhalter `{page}` und `{total}` für dynamische Seitenzahlen. +5. Passen Sie Schriftgröße und Schriftfarbe an und beschränken Sie optional auf einen bestimmten Seitenbereich. +6. Klicken Sie auf **Kopf- & Fußzeile hinzufügen**, um zu verarbeiten und herunterzuladen. + +## Optionen + +- **Seitenbereich**: Beschränken Sie optional, welche Seiten Kopf- und Fußzeilen erhalten. Leer lassen, um alle Seiten einzubeziehen. Format: "1-3, 5" (kommagetrennte Bereiche). +- **Schriftgröße**: Zwischen 6 und 24 Punkt. Standard ist 10. +- **Schriftfarbe**: Wählen Sie eine beliebige Farbe mit der Farbauswahl. +- **Kopfzeile links / Mitte / rechts**: Textfelder für den oberen Seitenrand. +- **Fußzeile links / Mitte / rechts**: Textfelder für den unteren Seitenrand. + +## Funktionen + +- Sechs unabhängige Textpositionen pro Seite +- Dynamische Variable `{page}`, die die aktuelle Seitenzahl einfügt +- Dynamische Variable `{total}`, die die Gesamtseitenzahl einfügt +- Seitenbereichsfilter, um bestimmte Seiten gezielt zu bearbeiten +- Anpassbare Schriftgröße und Farbe +- Helvetica-Schrift für ein klares, professionelles Ergebnis + +## Anwendungsfälle + +- "Seite {page} von {total}" in der Fußzeile Mitte eines Berichts einfügen +- Einen Firmennamen in die Kopfzeile links und ein Dokumentdatum in die Kopfzeile rechts setzen +- Vertraulichkeitshinweise in die Fußzeile von Rechtsdokumenten einfügen +- Revisionsnummern auf bestimmten Seitenbereichen aufstempeln + +## Tipps + +- Kombinieren Sie `{page}` und `{total}` in einem Feld für Formate wie "Seite {page} von {total}" oder "{page}/{total}". +- Sie können die meisten Felder leer lassen und nur die Positionen ausfüllen, die Sie brauchen. Leere Felder werden einfach übersprungen. +- Für komplexere Kopfzeilen mit Bildern oder Logos können Sie das Werkzeug [Wasserzeichen hinzufügen](./add-watermark) nutzen und oben auf der Seite positionieren. + +## Verwandte Werkzeuge + +- [Seitenzahlen](./page-numbers) +- [Wasserzeichen hinzufügen](./add-watermark) +- [Bates-Nummerierung](./bates-numbering) diff --git a/docs/de/tools/heic-to-pdf.md b/docs/de/tools/heic-to-pdf.md new file mode 100644 index 00000000..b4065df0 --- /dev/null +++ b/docs/de/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC zu PDF +description: Wandeln Sie HEIC- und HEIF-Bilder von iPhones und iPads direkt im Browser in PDF um. +--- + +# HEIC zu PDF + +Wandeln Sie HEIC/HEIF-Bilder in PDF um. HEIC ist seit iOS 11 das Standard-Fotoformat auf iPhones und iPads. Mit diesem Werkzeug machen Sie aus diesen Fotos PDFs, ohne Desktop-Software zu installieren oder Dateien auf einen Server hochzuladen. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :----- | :------------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre HEIC/HEIF-Dateien per Drag & Drop hinein. +2. Prüfen Sie die Dateiliste und entfernen Sie unerwünschte Dateien. +3. Klicken Sie auf **In PDF umwandeln**. Das Ergebnis wird als `from_heic.pdf` heruntergeladen. + +Jede HEIC-Datei wird mit der Bibliothek heic2any dekodiert, die sie mit 92 % Qualität in PNG umwandelt. Das PNG wird dann mit pdf-lib in die PDF eingebettet, jedes Bild auf einer eigenen Seite in voller Auflösung. + +## Optionen + +Dieses Werkzeug bietet keine zusätzlichen Einstellungen. HEIC-Bilder werden vor dem Einbetten in hoher Qualität (0,92) in PNG umgewandelt. + +## Anwendungsfälle + +- Aus iPhone-Fotos eine PDF für eine Versicherungsmeldung oder einen Bericht erstellen +- HEIC-Fotos für ein Immobilienexposé in ein einziges druckbares Dokument umwandeln +- iPad-Screenshots (HEIF-Format) in eine teilbare PDF verwandeln +- Urlaubsfotos für ein Reisetagebuch im Stapel umwandeln + +## Tipps + +- Die HEIC-Dekodierung läuft vollständig im Browser mit WebAssembly. Die erste Umwandlung kann einen Moment dauern, während der Decoder geladen wird. +- Wenn Sie HEIC mit anderen Bildformaten (JPG, PNG usw.) mischen wollen, nutzen Sie das Werkzeug [Bilder zu PDF](./image-to-pdf), das HEIC zusammen mit allen anderen Formaten verarbeitet. +- HEIC-Dateien von iPhones enthalten oft EXIF-Daten einschließlich GPS-Koordinaten. Die PDF-Ausgabe übernimmt diese Metadaten nicht. + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [JPG zu PDF](./jpg-to-pdf) +- [PNG zu PDF](./png-to-pdf) diff --git a/docs/de/tools/image-to-pdf.md b/docs/de/tools/image-to-pdf.md new file mode 100644 index 00000000..5034c854 --- /dev/null +++ b/docs/de/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Bilder zu PDF +description: Wandeln Sie JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD und mehr als 10 weitere Bildformate in eine einzige PDF-Datei um. +--- + +# Bilder zu PDF + +Der universelle Bild-zu-PDF-Konverter. Laden Sie Bilder in praktisch jedem Format hoch und kombinieren Sie sie zu einem einzigen PDF-Dokument. Jedes Bild erhält eine eigene Seite in der Größe des Originals. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Das ist die breiteste Formatunterstützung aller Bildkonverter in BentoPDF. Wenn Sie nur ein bestimmtes Format brauchen, nutzen Sie stattdessen eines der spezialisierten Werkzeuge. + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre Bilddateien per Drag & Drop hinein. Sie können mehrere Dateien auf einmal auswählen. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Dateien mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um zusätzliche Bilder aufzunehmen. +3. Wählen Sie im Dropdown eine **PDF-Qualität**. +4. Klicken Sie auf **In PDF umwandeln**. Das Werkzeug verarbeitet die Bilder mit der PyMuPDF-Engine und lädt das Ergebnis als `images_to_pdf.pdf` herunter. + +## Optionen + +Die **PDF-Qualität** steuert die Bildkomprimierung beim Einbetten der Bilder in die PDF: + +- **Hohe Qualität**: minimale Komprimierung, größere Datei. Am besten für Druck oder Archivierung. +- **Mittlere Qualität** (Standard): ausgewogene Komprimierung. Für die meisten Zwecke gut geeignet. +- **Niedrige Qualität**: starke Komprimierung, kleinste Datei. Geeignet für E-Mail oder schnelles Teilen. + +HEIC- und WebP-Dateien werden vor dem Einbetten automatisch in PNG umgewandelt. Das geschieht unbemerkt und erfordert keine zusätzlichen Schritte. + +## Anwendungsfälle + +- Gescannte Belege oder Dokumente aus der Handykamera in einer PDF zusammenfassen +- Aus Bildern in gemischten Formaten ein Foto-Portfolio oder Lookbook erstellen +- iPhone-Fotos (HEIC) in eine teilbare PDF umwandeln, ohne Desktop-Software zu installieren +- Design-Mockups aus PSD-Exporten und Screenshots zu einer Kundenlieferung zusammenstellen +- Einen Ordner mit älteren Bildformaten (PNM, JXR, JP2) als eine einzige PDF archivieren + +## Tipps + +- Die Reihenfolge der Bilder in der PDF entspricht der Reihenfolge in der Dateiliste. Laden Sie sie in der gewünschten Reihenfolge hoch. +- Für die kleinstmögliche Dateigröße wähle Niedrige Qualität. Bei textlastigen Scans ist der optische Unterschied oft vernachlässigbar. +- Wenn Sie nur ein Bildformat haben, liefern die spezialisierten Konverter (JPG zu PDF, PNG zu PDF usw.) dasselbe Ergebnis mit einer einfacheren Oberfläche. + +## Verwandte Werkzeuge + +- [JPG zu PDF](./jpg-to-pdf) +- [PNG zu PDF](./png-to-pdf) +- [HEIC zu PDF](./heic-to-pdf) +- [WebP zu PDF](./webp-to-pdf) diff --git a/docs/de/tools/index.md b/docs/de/tools/index.md new file mode 100644 index 00000000..57c3b73c --- /dev/null +++ b/docs/de/tools/index.md @@ -0,0 +1,183 @@ +# Werkzeugübersicht + +BentoPDF bietet **über 130 Werkzeuge** für die Arbeit mit PDFs. Alle Werkzeuge laufen vollständig in Ihrem Browser, Ihre Dateien verlassen nie Ihr Gerät. + +--- + +## Bearbeiten & Annotieren + +Ändern, markieren und verbessern Sie Ihre PDF-Dokumente mit einem umfassenden Satz an Bearbeitungswerkzeugen. + +
+ +- [**PDF-Editor**](./edit-pdf): Annotieren Sie, markieren Sie, schwärzen Sie, kommentieren Sie, fügen Sie Formen und Bilder hinzu, suche und zeigen Sie PDFs an. +- [**Lesezeichen bearbeiten**](./bookmark): PDF-Lesezeichen hinzufügen, bearbeiten, importieren, löschen und extrahieren. +- [**Inhaltsverzeichnis**](./table-of-contents): Eine Inhaltsverzeichnisseite aus PDF-Lesezeichen erzeugen. +- [**Seitenzahlen**](./page-numbers): Seitenzahlen in Ihr Dokument einfügen. +- [**Seitenbeschriftungen hinzufügen**](./add-page-labels): PDF-Seitenbeschriftungen mit römischen Ziffern, Präfixen und eigenen Startwerten anwenden. +- [**Bates-Nummerierung**](./bates-numbering): Fortlaufende Bates-Nummern über eine oder mehrere PDF-Dateien hinzufügen. +- [**Wasserzeichen hinzufügen**](./add-watermark): Text oder ein Bild auf Ihre PDF-Seiten stempeln. +- [**Kopf- & Fußzeile**](./header-footer): Text am oberen und unteren Seitenrand hinzufügen. +- [**Farben invertieren**](./invert-colors): Eine Dark-Mode-Version Ihrer PDF erstellen. +- [**Scanner-Effekt**](./scanner-effect): Ihre PDF wie ein gescanntes Dokument aussehen lassen. +- [**Farben anpassen**](./adjust-colors): Helligkeit, Kontrast, Sättigung und mehr fein abstimmen. +- [**Hintergrundfarbe**](./background-color): Die Hintergrundfarbe Ihrer PDF ändern. +- [**Textfarbe ändern**](./text-color): Die Textfarbe in Ihrer PDF ändern. +- [**PDF unterschreiben**](./sign-pdf): Ihre Unterschrift zeichnen, tippen oder hochladen. +- [**Stempel hinzufügen**](./add-stamps): Bildstempel über die Annotationsleiste zu Ihrer PDF hinzufügen. +- [**Annotationen entfernen**](./remove-annotations): Kommentare, Markierungen und Links entfernen. +- [**PDF zuschneiden**](./crop-pdf): Die Ränder jeder Seite Ihrer PDF beschneiden. +- [**PDF-Formular ausfüllen**](./form-filler): Formulare direkt im Browser ausfüllen. Unterstützt auch XFA-Formulare. +- [**PDF-Formular erstellen**](./form-creator): Ausfüllbare PDF-Formulare mit Textfeldern per Drag & Drop erstellen. +- [**Leere Seiten entfernen**](./remove-blank-pages): Leere Seiten automatisch erkennen und löschen. + +
+ +--- + +## In PDF umwandeln + +Wandeln Sie Bilder, Dokumente, E-Books und andere Dateiformate in PDF um. + +
+ +- [**Bilder zu PDF**](./image-to-pdf): JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP und mehr in PDF umwandeln. +- [**JPG zu PDF**](./jpg-to-pdf): Aus einem oder mehreren JPG-Bildern eine PDF erstellen. +- [**PNG zu PDF**](./png-to-pdf): Aus einem oder mehreren PNG-Bildern eine PDF erstellen. +- [**WebP zu PDF**](./webp-to-pdf): Aus einem oder mehreren WebP-Bildern eine PDF erstellen. +- [**SVG zu PDF**](./svg-to-pdf): Aus einem oder mehreren SVG-Bildern eine PDF erstellen. +- [**BMP zu PDF**](./bmp-to-pdf): Aus einem oder mehreren BMP-Bildern eine PDF erstellen. +- [**HEIC zu PDF**](./heic-to-pdf): Aus einem oder mehreren HEIC-Bildern eine PDF erstellen. +- [**TIFF zu PDF**](./tiff-to-pdf): Aus einem oder mehreren TIFF-Bildern eine PDF erstellen. +- [**Text zu PDF**](./txt-to-pdf): Eine einfache Textdatei in eine PDF umwandeln. +- [**Markdown zu PDF**](./markdown-to-pdf): Markdown mit Live-Vorschau und Syntaxhervorhebung in PDF umwandeln. +- [**JSON zu PDF**](./json-to-pdf): JSON-Dateien in das PDF-Format umwandeln. +- [**ODT zu PDF**](./odt-to-pdf): ODT-Dateien (OpenDocument Text) in PDF umwandeln. +- [**CSV zu PDF**](./csv-to-pdf): CSV-Tabellen in PDF umwandeln. +- [**RTF zu PDF**](./rtf-to-pdf): RTF-Dokumente (Rich Text Format) in PDF umwandeln. +- [**Word zu PDF**](./word-to-pdf): Word-Dokumente (DOCX, DOC, ODT) in PDF umwandeln. +- [**Excel zu PDF**](./excel-to-pdf): Excel-Tabellen (XLSX, XLS, ODS) in PDF umwandeln. +- [**PowerPoint zu PDF**](./powerpoint-to-pdf): PowerPoint-Präsentationen (PPTX, PPT, ODP) in PDF umwandeln. +- [**XPS zu PDF**](./xps-to-pdf): XPS/OXPS-Dokumente in PDF umwandeln. +- [**MOBI zu PDF**](./mobi-to-pdf): MOBI-E-Books in PDF umwandeln. +- [**EPUB zu PDF**](./epub-to-pdf): EPUB-E-Books in PDF umwandeln. +- [**FB2 zu PDF**](./fb2-to-pdf): FictionBook-E-Books (FB2) in PDF umwandeln. +- [**CBZ zu PDF**](./cbz-to-pdf): Comic-Archive (CBZ/CBR) in PDF umwandeln. +- [**WPD zu PDF**](./wpd-to-pdf): WordPerfect-Dokumente (WPD) in PDF umwandeln. +- [**WPS zu PDF**](./wps-to-pdf): WPS-Office-Dokumente in PDF umwandeln. +- [**XML zu PDF**](./xml-to-pdf): XML-Dokumente in PDF umwandeln. +- [**ODG zu PDF**](./odg-to-pdf): OpenDocument Graphics (ODG) in PDF umwandeln. +- [**ODS zu PDF**](./ods-to-pdf): OpenDocument Spreadsheet (ODS) in PDF umwandeln. +- [**ODP zu PDF**](./odp-to-pdf): OpenDocument Presentation (ODP) in PDF umwandeln. +- [**PUB zu PDF**](./pub-to-pdf): Microsoft Publisher (PUB) in PDF umwandeln. +- [**VSD zu PDF**](./vsd-to-pdf): Microsoft Visio (VSD, VSDX) in PDF umwandeln. +- [**PSD zu PDF**](./psd-to-pdf): Adobe-Photoshop-Dateien (PSD) in PDF umwandeln. +- [**Email zu PDF**](./email-to-pdf): E-Mail-Dateien (EML, MSG) in das PDF-Format umwandeln. + +
+ +--- + +## Aus PDF umwandeln + +Extrahieren Sie Inhalte aus PDFs in Bilder, Dokumente und Datenformate. + +
+ +- [**PDF zu JPG**](./pdf-to-jpg): Jede PDF-Seite in ein JPG-Bild umwandeln. +- [**PDF zu PNG**](./pdf-to-png): Jede PDF-Seite in ein PNG-Bild umwandeln. +- [**PDF zu WebP**](./pdf-to-webp): Jede PDF-Seite in ein WebP-Bild umwandeln. +- [**PDF zu BMP**](./pdf-to-bmp): Jede PDF-Seite in ein BMP-Bild umwandeln. +- [**PDF zu TIFF**](./pdf-to-tiff): Jede PDF-Seite in ein TIFF-Bild umwandeln. +- [**PDF zu CBZ**](./pdf-to-cbz): Eine PDF in ein CBZ (Comic-Archiv) für Comic-Reader und Calibre umwandeln. +- [**PDF zu SVG**](./pdf-to-svg): Jede PDF-Seite in eine skalierbare Vektorgrafik umwandeln. +- [**PDF zu CSV**](./pdf-to-csv): Tabellen aus PDF extrahieren und in das CSV-Format umwandeln. +- [**PDF zu Excel**](./pdf-to-excel): Tabellen aus PDF extrahieren und in Excel (XLSX) umwandeln. +- [**PDF zu Graustufen**](./pdf-to-greyscale): Alle Farben in Schwarz-Weiß umwandeln. +- [**PDF zu JSON**](./pdf-to-json): PDF-Dateien in das JSON-Format umwandeln. +- [**PDF zu Word**](./pdf-to-word): PDF-Dateien in bearbeitbare Word-Dokumente umwandeln. +- [**Bilder extrahieren**](./extract-images): Alle eingebetteten Bilder aus Ihren PDF-Dateien extrahieren. +- [**PDF zu Markdown**](./pdf-to-markdown): PDF-Text und Tabellen in das Markdown-Format umwandeln. +- [**PDF für KI vorbereiten**](./prepare-pdf-for-ai): PDF-Inhalte als LlamaIndex-JSON für RAG/LLM-Pipelines extrahieren. +- [**PDF zu Text**](./pdf-to-text): Text aus PDF-Dateien extrahieren und als einfachen Text speichern. +- [**PDF-Tabellen extrahieren**](./extract-tables): Tabellen aus PDFs als CSV, JSON oder Markdown extrahieren. + +
+ +--- + +## Organisieren & Verwalten + +Ordnen Sie Ihre PDF-Seiten und -Dateien neu an, kombinieren, teilen und verwalten Sie sie. + +
+ +- [**PDF-Workflow-Builder**](./pdf-workflow): Eigene PDF-Verarbeitungsabläufe mit einem visuellen Node-Editor erstellen. +- [**PDF-Multitool**](./pdf-multi-tool): Voll ausgestatteter PDF-Editor mit Seitenverwaltung. +- [**OCR PDF**](./ocr-pdf): Eine PDF durchsuchbar und kopierbar machen. +- [**PDF zusammenführen**](./merge-pdf): Mehrere PDFs zu einer Datei kombinieren. +- [**Seiten abwechselnd mischen**](./alternate-merge): PDFs zusammenführen, indem Seiten aus jeder PDF abwechselnd eingefügt werden. +- [**Duplex-Zusammenführung**](./duplex-collate): Vorder- und Rückseiten-Scanblöcke in die richtige Seitenfolge bringen. +- [**Duplizieren & Organisieren**](./organize-pdf): Seiten duplizieren, neu anordnen und löschen. +- [**Anhänge hinzufügen**](./add-attachments): Eine oder mehrere Dateien in Ihre PDF einbetten. +- [**Anhänge extrahieren**](./extract-attachments): Alle eingebetteten Dateien aus PDF(s) als ZIP extrahieren. +- [**Anhänge bearbeiten**](./edit-attachments): Anhänge in Ihrer PDF anzeigen oder entfernen. +- [**PDF-Ebenen (OCG)**](./pdf-layers): OCG-Ebenen in Ihrer PDF anzeigen, umschalten, hinzufügen und löschen. +- [**PDF teilen**](./split-pdf): Einen Seitenbereich in eine neue PDF extrahieren. +- [**Seiten teilen**](./divide-pages): Seiten horizontal oder vertikal teilen. +- [**Seiten extrahieren**](./extract-pages): Eine Auswahl von Seiten als neue Dateien speichern. +- [**Seiten löschen**](./delete-pages): Bestimmte Seiten aus Ihrem Dokument entfernen. +- [**Leere Seite hinzufügen**](./add-blank-page): Eine leere Seite an beliebiger Stellen Sie in Ihre PDF einfügen. +- [**Seiten umkehren**](./reverse-pages): Die Reihenfolge aller Seiten in Ihrem Dokument umkehren. +- [**PDF drehen**](./rotate-pdf): Seiten in 90-Grad-Schritten drehen. +- [**Um benutzerdefinierte Grad drehen**](./rotate-custom): Seiten um einen beliebigen Winkel drehen. +- [**N-Up PDF**](./n-up-pdf): Mehrere Seiten auf einem Blatt anordnen. +- [**PDF-Broschüre**](./pdf-booklet): Seiten für den doppelseitigen Broschürendruck neu anordnen. +- [**Zu einer Seite kombinieren**](./combine-single-page): Alle Seiten zu einer durchgehenden Bahn zusammenfügen. +- [**Metadaten anzeigen**](./view-metadata): Die verborgenen Eigenschaften Ihrer PDF untersuchen. +- [**Metadaten bearbeiten**](./edit-metadata): Autor, Titel und andere Eigenschaften ändern. +- [**PDFs zu ZIP**](./pdf-to-zip): Mehrere PDF-Dateien in ein ZIP-Archiv packen. +- [**PDFs vergleichen**](./compare-pdfs): Zwei PDFs nebeneinander vergleichen. +- [**PDF posterisieren**](./posterize-pdf): Eine große Seite in mehrere kleinere Seiten aufteilen. + +
+ +--- + +## Optimieren & Reparieren + +Komprimieren, reparieren und optimieren Sie Ihre PDFs für bessere Leistung und Kompatibilität. + +
+ +- [**PDF komprimieren**](./compress-pdf): Die Dateigröße Ihrer PDF verringern. +- [**PDF zu PDF/A**](./pdf-to-pdfa): PDF für die Langzeitarchivierung in PDF/A umwandeln. +- [**Seitengröße reparieren**](./fix-page-size): Alle Seiten auf eine einheitliche Größe vereinheitlichen. +- [**PDF linearisieren**](./linearize-pdf): PDF für schnelles Anzeigen im Web optimieren. +- [**Seitenmaße**](./page-dimensions): Seitengröße, Ausrichtung und Einheiten analysieren. +- [**Beschränkungen entfernen**](./remove-restrictions): Passwortschutz und Sicherheitsbeschränkungen entfernen. +- [**PDF reparieren**](./repair-pdf): Daten aus beschädigten PDF-Dateien wiederherstellen. +- [**PDF rastern**](./rasterize-pdf): PDF in eine bildbasierte PDF umwandeln. Ebenen reduzieren und auswählbaren Text entfernen. +- [**PDF entzerren**](./deskew-pdf): Schiefe gescannte Seiten mit OpenCV automatisch geraderichten. +- [**Schriftart zu Umriss**](./font-to-outline): Alle Schriften für eine einheitliche Darstellung in Vektorumrisse umwandeln. + +
+ +--- + +## PDF absichern + +Schützen und verschlüsseln Sie Ihre PDF-Dokumente und steuern Sie den Zugriff darauf. + +
+ +- [**PDF verschlüsseln**](./protect-pdf): Ihre PDF mit einem Passwort sperren. +- [**PDF bereinigen**](./sanitize-pdf): Metadaten, Annotationen, Skripte und mehr entfernen. +- [**PDF entschlüsseln**](./unlock-pdf): PDF entsperren, indem der Passwortschutz entfernt wird. +- [**PDF reduzieren**](./flatten-pdf): Formularfelder und Annotationen nicht mehr bearbeitbar machen. +- [**Metadaten entfernen**](./remove-metadata): Verborgene Daten aus Ihrer PDF entfernen. +- [**Berechtigungen ändern**](./change-permissions): Benutzerberechtigungen für eine PDF festlegen oder ändern. +- [**Digitale PDF-Signatur**](./digital-sign-pdf): Eine kryptografische digitale Signatur mit X.509-Zertifikaten hinzufügen. +- [**PDF-Signatur überprüfen**](./validate-signature-pdf): Digitale Signaturen überprüfen und Zertifikatsdetails anzeigen. + +
diff --git a/docs/de/tools/invert-colors.md b/docs/de/tools/invert-colors.md new file mode 100644 index 00000000..263ba0d7 --- /dev/null +++ b/docs/de/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Farben invertieren +description: Invertieren Sie alle Farben Ihrer PDF und erstellen Sie eine Dark-Mode-Version jedes Dokuments. +--- + +# Farben invertieren + +Kehren Sie jede Farbe Ihrer PDF ins Gegenteil um. Weiße Hintergründe werden schwarz, schwarzer Text wird weiß und alle anderen Farben wechseln zu ihren Komplementärwerten. So erstellen Sie am schnellsten eine "Dark-Mode"-Version jeder PDF. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Klicken Sie zum Verarbeiten auf **Farben invertieren**. +3. Die invertierte PDF wird automatisch heruntergeladen. + +Es gibt keine weiteren Einstellungen. Das Werkzeug rendert jede Seite als Bild, invertiert alle Pixelfarben und setzt das Ergebnis zu einer neuen PDF zusammen. + +## Funktionen + +- Farbinvertierung per Klick für alle Seiten +- Verarbeitet jede Seite des Dokuments +- Behält Seitenmaße und Layout des Originals bei +- Funktioniert mit jeder PDF, unabhängig vom Inhalt (Text, Bilder, gemischt) + +## Anwendungsfälle + +- Dark-Mode-Versionen von Lehrbüchern oder Handbüchern für angenehmes Lesen bei Nacht erstellen +- Kontrastreiche Versionen von Dokumenten für die Barrierefreiheit vorbereiten +- Gescannte Dokumente invertieren, die mit falscher Belichtung erfasst wurden +- Negativversionen bildlastiger PDFs für die visuelle Analyse erzeugen + +## Tipps + +- Da das Werkzeug die Seiten rastert, um den Effekt anzuwenden, ist die Ausgabe bildbasiert. Text ist danach nicht mehr auswählbar oder durchsuchbar. Wenn Sie nach dem Invertieren durchsuchbaren Text brauchen, schicken Sie das Ergebnis durch ein OCR-Werkzeug. +- Für feinere Farbanpassungen (Helligkeit, Kontrast, Sättigung) nutzen Sie stattdessen das Werkzeug [Farben anpassen](./adjust-colors). +- Große PDFs mit vielen Seiten können länger dauern, da jede Seite einzeln gerendert und invertiert wird. + +## Verwandte Werkzeuge + +- [Farben anpassen](./adjust-colors) +- [Hintergrundfarbe](./background-color) +- [Scanner-Effekt](./scanner-effect) diff --git a/docs/de/tools/jpg-to-pdf.md b/docs/de/tools/jpg-to-pdf.md new file mode 100644 index 00000000..378f5cd2 --- /dev/null +++ b/docs/de/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG zu PDF +description: Wandeln Sie ein oder mehrere JPG-, JPEG- und JPEG-2000-Bilder direkt im Browser in eine einzige PDF-Datei um. +--- + +# JPG zu PDF + +Mach aus JPG-Bildern eine saubere PDF. Laden Sie eine Datei hoch oder bündle mehrere JPGs, jedes Bild wird zu einer Seite in voller Größe im Ausgabedokument. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre JPG-Dateien per Drag & Drop hinein. Mehrfachauswahl wird unterstützt. +2. Prüfen Sie die hochgeladenen Dateien. Entfernen Sie einzelne Dateien mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um die Liste zu erweitern. +3. Wählen Sie eine **PDF-Qualität**. +4. Klicken Sie auf **In PDF umwandeln**. Das Werkzeug komprimiert die Bilder entsprechend Ihrer Qualitätseinstellung, wandelt sie mit der PyMuPDF-Engine um und lädt `from_jpgs.pdf` herunter. + +## Optionen + +Die **PDF-Qualität** steuert die Komprimierung, die auf jedes Bild angewendet wird, bevor es in die PDF eingebettet wird: + +- **Hohe Qualität**: erhält maximale Details. Für Fotografie oder Druck. +- **Mittlere Qualität** (Standard): ein solider Mittelweg zwischen Klarheit und Dateigröße. +- **Niedrige Qualität**: starke Komprimierung für die kleinste Ausgabe. + +## Anwendungsfälle + +- Als JPG gespeicherte Scans in einer einzigen PDF zur Einreichung zusammenfassen +- Produktfotos zu einem Katalog für Kunden bündeln +- Medizinische oder Satellitenbilder in JPEG 2000 in eine portable PDF umwandeln +- Aus Kameraexporten ein druckbares Fotoalbum erstellen + +## Tipps + +- JPEG-2000-Dateien (`.jp2`, `.jpx`) werden vollständig unterstützt, nicht nur Standard-JPEG. Das ist nützlich für medizinische Bildgebung und Geodaten. +- Wenn Ihre JPGs von einer Handykamera stammen, erzeugt die mittlere Qualität meist eine Datei, die 40-60 % kleiner ist als bei hoher Qualität, ohne sichtbaren Unterschied am Bildschirm. + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [PNG zu PDF](./png-to-pdf) +- [WebP zu PDF](./webp-to-pdf) diff --git a/docs/de/tools/json-to-pdf.md b/docs/de/tools/json-to-pdf.md new file mode 100644 index 00000000..06fa1cef --- /dev/null +++ b/docs/de/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON zu PDF +description: Rekonstruieren Sie PDF-Dateien aus dem JSON-Format von BentoPDF. Wandeln Sie JSON-Exporte zurück in ihre ursprünglichen PDF-Dokumente um. +--- + +# JSON zu PDF + +Rekonstruieren Sie PDF-Dokumente aus JSON-Dateien, die zuvor mit dem Werkzeug **PDF zu JSON** von BentoPDF erstellt wurden. Es ist ein Werkzeug für die Rückumwandlung: Es nimmt die strukturierte JSON-Darstellung einer PDF und baut das ursprüngliche Dokument wieder auf. + +::: warning +Dieses Werkzeug akzeptiert nur JSON-Dateien, die mit dem PDF-zu-JSON-Konverter von BentoPDF erstellt wurden. Standard-JSON-Dateien aus APIs, Datenbanken oder anderen Werkzeugen werden nicht unterstützt. +::: + +## Unterstützte Formate + +| Eingabe | Beschreibung | +| :------ | :---------------------------------------------------------------------------- | +| `.json` | JSON-Dateien, die mit dem Werkzeug PDF zu JSON von BentoPDF exportiert wurden | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie eine oder mehrere JSON-Dateien per Drag & Drop hinein. +2. Die Dateiliste zeigt jede ausgewählte Datei mit ihrer Größe. +3. Klicken Sie auf **In PDF umwandeln**. Das Werkzeug verarbeitet alle Dateien mit einem Web Worker und der CPDF-Engine. +4. Die Ausgabe wird als `jsons-to-pdf.zip` heruntergeladen und enthält pro JSON-Eingabedatei eine PDF. + +Die Umwandlung läuft in einem Web Worker im Hintergrund, sodass die Oberfläche auch bei großen Dateien reaktionsfähig bleibt. + +## Optionen + +Dieses Werkzeug hat keine konfigurierbaren Optionen. Die JSON-Struktur bestimmt die Ausgabe-PDF vollständig. + +## Ausgabe + +Bei der Umwandlung mehrerer JSON-Dateien werden die Ergebnisse als ZIP-Archiv geliefert. Jede PDF trägt den Namen ihrer JSON-Quelldatei (z. B. wird aus `report.json` die Datei `report.pdf`). + +## Anwendungsfälle + +- PDFs aus einem JSON-basierten Backup oder Archivierungsprozess wiederherstellen +- Eine PDF zur Prüfung über JSON leiten und dann wieder in PDF zurückwandeln +- Dokumente nach programmatischen Änderungen an der JSON-Struktur neu aufbauen +- Prüfen, ob ein PDF-zu-JSON-Export den gesamten Dokumentinhalt erfasst hat, indem Sie ihn zurückwandeln + +## Tipps + +- Wenn Sie beliebige JSON-Daten (wie API-Antworten oder Konfigurationsdateien) in eine formatierte PDF umwandeln wollen, passt das Werkzeug [Text zu PDF](./txt-to-pdf) besser. Fügen Sie das JSON als Text ein, dann wird es sauber formatiert dargestellt. +- Die CPDF-WebAssembly-Engine muss verfügbar sein, damit dieses Werkzeug funktioniert. Selbst gehostete Instanzen benötigen die konfigurierten CPDF-WASM-Dateien. + +## Verwandte Werkzeuge + +- [Text zu PDF](./txt-to-pdf) +- [Markdown zu PDF](./markdown-to-pdf) +- [CSV zu PDF](./csv-to-pdf) diff --git a/docs/de/tools/linearize-pdf.md b/docs/de/tools/linearize-pdf.md new file mode 100644 index 00000000..c513fbf7 --- /dev/null +++ b/docs/de/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: PDF linearisieren +description: Optimieren Sie PDF-Dateien für schnelles Anzeigen im Web mit progressivem Laden. Auch bekannt als "Fast Web View". +--- + +# PDF linearisieren + +Die Linearisierung ordnet eine PDF so um, dass die erste Seite angezeigt werden kann, bevor die gesamte Datei heruntergeladen ist. Adobe nennt das "Fast Web View". Wenn Sie PDFs auf einer Website hosten oder über ein Dokumentenportal bereitstellen, wirken sie durch die Linearisierung deutlich schneller beim Öffnen. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. +2. Klicken Sie auf **PDF(s) linearisieren**. +3. Laden Sie die Ergebnisse als ZIP-Archiv mit allen linearisierten Dateien herunter. + +Es gibt keine Einstellungen. Das Werkzeug nutzt das Flag `--linearize` von QPDF, das die interne Struktur der PDF umordnet, ohne den sichtbaren Inhalt zu verändern. + +## Was die Linearisierung bewirkt + +- Ordnet PDF-Objekte so um, dass die Daten der ersten Seite am Anfang der Datei stehen +- Fügt ein Linearisierungswörterbuch und Hinweistabellen hinzu, damit Viewer wissen, wo sich jede Seite befindet +- Ermöglicht Byte-Range-Anfragen: Ein Browser kann nur die erste Seite abrufen, ohne die ganze Datei herunterzuladen +- Bereinigt die Querverweistabelle für effizienten wahlfreien Zugriff + +## Funktionen + +- Stapelverarbeitung mehrerer PDFs in einem Vorgang +- Die Ausgabe erhält alle Inhalte, Schriften, Bilder und interaktiven Elemente +- Nutzt QPDF (WebAssembly) für zuverlässige, standardkonforme Linearisierung +- Die Ergebnisse werden für einen einfachen Download in ein ZIP gepackt + +## Anwendungsfälle + +- PDF-Berichte auf einer Website hosten, wo Nutzende eine sofortige Seitenanzeige erwarten +- PDFs in Webanwendungen mit Viewern im Browser einbetten +- PDF-Kataloge oder Handbücher veröffentlichen, die über langsame Mobilfunkverbindungen abgerufen werden +- Dokumente für Content Delivery Networks (CDNs) vorbereiten, die Byte-Range-Auslieferung unterstützen + +## Tipps + +- Linearisieren Sie erst, wenn alle anderen Änderungen abgeschlossen sind. Jede spätere Änderung (Zusammenführen, Seiten hinzufügen) hebt die Linearisierung auf. +- Kombinieren Sie das Werkzeug mit PDF komprimieren für die kleinsten und am schnellsten ladenden PDFs. +- Die Linearisierung erhöht die Dateigröße geringfügig (typischerweise unter 1 %). + +## Verwandte Werkzeuge + +- [PDF komprimieren](./compress-pdf): Dateigröße vor dem Linearisieren verringern +- [PDF reparieren](./repair-pdf): Strukturprobleme beheben, die die Linearisierung verhindern +- [Metadaten entfernen](./remove-metadata): Metadaten vor der Veröffentlichung im Web entfernen diff --git a/docs/de/tools/markdown-to-pdf.md b/docs/de/tools/markdown-to-pdf.md new file mode 100644 index 00000000..ac3eafa3 --- /dev/null +++ b/docs/de/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown zu PDF +description: Schreiben Sie oder fügen Sie Markdown ein und exportieren Sie es als professionell formatierte PDF mit Live-Vorschau und Syntaxhervorhebung. +--- + +# Markdown zu PDF + +Ein voll ausgestatteter Markdown-Editor mit Live-Vorschau und PDF-Export per Klick. Schreiben Sie von Grund auf, laden Sie eine vorhandene `.md`-Datei hoch oder fügen Sie Inhalte aus der Zwischenablage ein. Der Editor rendert Ihr Markdown in Echtzeit und exportiert mit der integrierten Druck-Engine des Browsers eine gestaltete PDF. + +## Unterstützte Formate + +| Eingabe | Beschreibung | +| :------------ | :---------------------------------------- | +| `.md`-Dateien | Hochladen über die Schaltfläche Hochladen | +| Direkteingabe | In den Editor tippen oder einfügen | + +## So funktioniert es + +1. Öffnen Sie das Werkzeug Markdown zu PDF. Der Editor lädt mit geteilter Ansicht: Markdown-Quelltext links, gerenderte Vorschau rechts. +2. Schreiben Sie Ihr Markdown, fügen Sie es ein oder klicken Sie auf **Hochladen**, um eine `.md`-Datei zu laden. +3. Wechseln Sie mit dem Design-Schieberegler in der Symbolleiste zwischen hellem und dunklem Design. +4. Klicken Sie auf **PDF exportieren** (oder drücke `Ctrl/Cmd + S`), um über den Druckdialog des Browsers eine PDF zu erzeugen. + +## Funktionen + +Der Editor unterstützt über die Grundlagen hinaus viele Markdown-Funktionen: + +- **Standard-Markdown**: Überschriften, fett, kursiv, Links, Bilder, Listen, Blockzitate, horizontale Linien +- **Codeblöcke** mit Syntaxhervorhebung für mehr als 15 Sprachen (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash und mehr) +- **Mermaid-Diagramme**: Flussdiagramme, Sequenzdiagramme, ER-Diagramme und andere Mermaid-Diagrammtypen werden direkt in der Vorschau gerendert +- **Tabellen** mit der Standard-Markdown-Tabellensyntax +- **Aufgabenlisten** mit Kontrollkästchen +- **Fußnoten**, **tiefgestellter Text**, **hochgestellter Text** +- **Definitionslisten**, **Abkürzungen** +- **Emoji**-Unterstützung (`:smile:` wird als Emoji dargestellt) +- **Hervorhebungen** (`==marked text==`) und **Einfügungen** (`++inserted text++`) +- **Automatische Verlinkung von URLs**: einfache URLs werden in anklickbare Links umgewandelt +- Erzeugung eines **Inhaltsverzeichnisses** +- **Anker-Links** bei Überschriften + +## Anwendungsfälle + +- Projektdokumentation schreiben und eine ansprechende PDF für Stakeholder exportieren +- Technische Berichte mit Codebeispielen und Mermaid-Architekturdiagrammen erstellen +- Eine GitHub-README für die Offline-Nutzung oder zum Drucken in eine PDF umwandeln +- Ein Angebot oder eine Spezifikation mit Aufgabenlisten und Tabellen entwerfen +- Aus Vorlesungsnotizen in Markdown ein gestaltetes Handout erzeugen + +## Tipps + +- Die PDF-Ausgabe nutzt die Funktion "Als PDF drucken" des Browsers. In Chrome können Sie Ränder und Skalierung im Druckdialog vor dem Speichern anpassen. +- Mermaid-Diagramme werden in der Vorschau gerendert, brauchen bei der ersten Nutzung aber eventuell einen Moment zur Initialisierung. +- Nutzen Sie `Ctrl/Cmd + S` als Tastenkürzel zum Exportieren, ohne zur Schaltfläche greifen zu müssen. + +## Verwandte Werkzeuge + +- [Text zu PDF](./txt-to-pdf) +- [Word zu PDF](./word-to-pdf) +- [JSON zu PDF](./json-to-pdf) diff --git a/docs/de/tools/merge-pdf.md b/docs/de/tools/merge-pdf.md new file mode 100644 index 00000000..975fcb35 --- /dev/null +++ b/docs/de/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF zusammenführen +description: Kombinieren Sie mehrere PDF-Dateien zu einem Dokument, mit Neuanordnung per Drag & Drop und Kontrolle auf Seitenebene. +--- + +# PDF zusammenführen + +Kombinieren Sie mehrere PDF-Dateien zu einem einzigen Dokument. Sie können ganze Dateien in einer bestimmten Reihenfolge zusammenführen oder in den Seitenmodus wechseln, um einzelne Seiten aus allen hochgeladenen PDFs gezielt zu steuern. + +## So funktioniert es + +1. Laden Sie zwei oder mehr PDF-Dateien hoch, indem Sie auf die Ablagezone klicken oder sie hineinziehen. +2. Wählen Sie mit dem Umschalter oben zwischen **Dateimodus** und **Seitenmodus**. +3. Im Dateimodus ordnen Sie die Dateien per Drag & Drop neu an und geben optional pro Datei Seitenbereiche an (z. B. `1-3, 5`). Lassen Sie den Bereich leer, um alle Seiten einzubeziehen. +4. Im Seitenmodus ziehen Sie einzelne Seitenminiaturen per Drag & Drop, um Ihre genaue Seitenfolge aufzubauen. +5. Klicken Sie auf **PDFs zusammenführen**, um alles zu einer Datei zu kombinieren. Die zusammengeführte PDF wird automatisch heruntergeladen. + +## Funktionen + +- Zwei Zusammenführungsmodi: Dateimodus zum schnellen Kombinieren ganzer Dateien, Seitenmodus für Kontrolle pro Seite +- Neuanordnung per Drag & Drop in beiden Modi mit flüssigen Animationen +- Mit der Seitenbereichssyntax (z. B. `1-3, 5, 8-10`) wählen Sie Seiten gezielt aus, ohne in den Seitenmodus zu wechseln +- Per Lazy Loading geladene Seitenminiaturen halten die Oberfläche auch bei großen Dokumenten reaktionsfähig +- Keine Begrenzung für Anzahl der Dateien oder Gesamtseitenzahl +- Erhält die ursprüngliche PDF-Qualität ohne erneute Kodierung + +## Optionen + +| Option | Beschreibung | +| ------------------ | -------------------------------------------------------------------------------------------------------- | +| **Dateimodus** | Ganze Dateien in beliebiger Reihenfolge zusammenführen, mit optionalen Seitenbereichsfiltern pro Datei | +| **Seitenmodus** | Visuelles Raster aller Seiten aus allen Dateien: Miniaturen ziehen, um die genaue Reihenfolge aufzubauen | +| **Seiten-Eingabe** | Textfeld pro Datei, das Bereiche wie `1-3, 5` akzeptiert, um nur bestimmte Seiten aufzunehmen | + +## Anwendungsfälle + +- Einzelne Kapitel-PDFs zu einem Buch oder Bericht kombinieren +- Anschreiben und Lebenslauf zu einem Bewerbungsdokument zusammenführen +- Bestimmte Seiten aus mehreren Quelldokumenten in einer gemeinsamen Datei bündeln +- Gescannte Belege oder Rechnungen zu einer Archiv-PDF zusammenstellen +- Aus Folien mehrerer Präsentationen ein Handout erstellen + +## Tipps + +- Nutzen Sie den Seitenmodus, wenn Sie Seiten aus verschiedenen Dateien abwechselnd einfügen wollen, statt eine Datei an die andere anzuhängen. +- Sie können nach dem ersten Upload mit der Schaltfläche **Weitere Dateien hinzufügen** weitere Dateien ergänzen, ohne Ihre aktuelle Anordnung zu verlieren. +- Seitenbereiche beginnen bei 1, `1` bezeichnet also die erste Seite der jeweiligen Datei. + +## Verwandte Werkzeuge + +- [PDF teilen](./split-pdf) +- [Organisieren & Duplizieren](./organize-pdf) +- [Seiten abwechselnd mischen](./alternate-merge) +- [Seiten löschen](./delete-pages) diff --git a/docs/de/tools/mobi-to-pdf.md b/docs/de/tools/mobi-to-pdf.md new file mode 100644 index 00000000..304cf043 --- /dev/null +++ b/docs/de/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI zu PDF +description: Wandeln Sie MOBI-E-Book-Dateien direkt im Browser in PDF um. Kostenlos, privat, ohne Datei-Upload. +--- + +# MOBI zu PDF + +Wandeln Sie MOBI-E-Books von Amazon Kindle in PDF-Dokumente um. MOBI-Dateien sind an Kindle-Geräte und -Apps gebunden und lassen sich anderswo schwer lesen. Mit der Umwandlung in PDF erhalten Sie eine portable Version, die Sie auf jedem Gerät öffnen oder drucken können. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----- | :---------- | :-------------------------------- | +| MOBI | `.mobi` | Kindle-E-Book-Format (Mobipocket) | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie eine oder mehrere MOBI-Dateien per Drag & Drop hinein. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Dateien mit dem Papierkorb-Symbol oder nutzen Sie **Weitere Dateien hinzufügen**, um zusätzliche E-Books aufzunehmen. +3. Klicken Sie auf **In PDF umwandeln**. Die PyMuPDF-Engine liest die MOBI-Struktur ein und gibt jede Seite als PDF-Inhalt aus. +4. Eine einzelne Datei wird als PDF heruntergeladen. Bei mehreren Dateien erhalten Sie ein ZIP-Archiv namens `mobi-converted.zip`. + +## Optionen + +Es sind keine zusätzlichen Einstellungen nötig. Die Umwandlung erhält Textinhalt, Formatierung und eingebettete Bilder der ursprünglichen MOBI-Datei. + +## Anwendungsfälle + +- Bei Kindle gekaufte Inhalte auf einem Nicht-Kindle-E-Reader lesen, der nur PDF unterstützt +- Kapitel eines E-Books für das Lernen oder Annotieren offline ausdrucken +- Die persönliche E-Book-Bibliothek in einem universellen Format archivieren +- Auszüge mit jemandem teilen, der die Kindle-App nicht installiert hat + +## Tipps + +- MOBI-Dateien mit DRM-Schutz können nicht umgewandelt werden. Das Werkzeug funktioniert nur mit DRM-freien MOBI-Dateien. +- Große E-Books mit vielen eingebetteten Bildern brauchen etwas länger, da alles im Browser abläuft. + +## Verwandte Werkzeuge + +- [EPUB zu PDF](./epub-to-pdf) +- [FB2 zu PDF](./fb2-to-pdf) +- [CBZ zu PDF](./cbz-to-pdf) diff --git a/docs/de/tools/n-up-pdf.md b/docs/de/tools/n-up-pdf.md new file mode 100644 index 00000000..cd3b387b --- /dev/null +++ b/docs/de/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Ordnen Sie mehrere PDF-Seiten in einem Raster auf einem Blatt an, für kompaktes Drucken. +--- + +# N-Up PDF + +Platzieren Sie mehrere Seiten in einer Rasteranordnung auf einem Blatt. Das verringert die Zahl der gedruckten Seiten, indem 2, 4, 6, 8, 9 oder 16 Seiten auf ein Blatt passen. Das Werkzeug übernimmt Skalierung, Positionierung und optional die Konfiguration der Seitengröße. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Wählen Sie die Anzahl der Seiten pro Blatt (den Wert "N"): 2, 4, 6, 8, 9 oder 16. +3. Wählen Sie die Ausgabeseitengröße (Standard ist A4) und die Ausrichtung. +4. Konfigurieren Sie optional Abstand, Rahmenfarbe und Hintergrundfarbe. +5. Klicken Sie auf die Schaltfläche zum Verarbeiten. Das Werkzeug skaliert jede Seite und ordnet sie auf neuen Blättern an. + +## Funktionen + +- Rasterlayouts: 2-up, 4-up, 6-up, 8-up, 9-up und 16-up +- Konfigurierbare Ausgabeseitengröße und Ausrichtung +- Optionaler Abstand zwischen den angeordneten Seiten +- Einstellungen für Hintergrund- und Rahmenfarbe +- Behält das Seitenverhältnis der Originalseiten beim Einpassen bei + +## Optionen + +| Option | Beschreibung | +| -------------------- | -------------------------------------------------------------- | +| **Seiten pro Blatt** | Anzahl der Originalseiten pro Ausgabeseite (2, 4, 6, 8, 9, 16) | +| **Seitengröße** | Größe des Ausgabeblatts (A4, Letter, Legal usw.) | +| **Ausrichtung** | Hochformat oder Querformat für das Ausgabeblatt | +| **Abstand** | Lücke in Punkt zwischen den angeordneten Seiten | +| **Hintergrundfarbe** | Füllfarbe für den Hintergrund des Ausgabeblatts | +| **Rahmenfarbe** | Farbe für die Rahmen um jede angeordnete Seite | + +## Anwendungsfälle + +- Handouts mit 4 Folien pro Seite drucken, um Papier zu sparen +- Lernzettel mit mehreren Referenzseiten auf einem Blatt erstellen +- Kompakte Dokumentarchive zum Ablegen erzeugen +- Miniatur-Übersichtsblätter eines langen Dokuments erstellen + +## Tipps + +- Das Querformat funktioniert bei 2-up-Layouts oft besser, während Hochformat meist für 4-up und mehr am besten ist. +- Ein größerer Abstand verbessert die Lesbarkeit, verkleinert aber die verfügbare Fläche für jede angeordnete Seite. +- Für die umgekehrte Operation (eine Seite in mehrere aufteilen) siehe [PDF posterisieren](./posterize-pdf). + +## Verwandte Werkzeuge + +- [PDF posterisieren](./posterize-pdf) +- [PDF-Broschüre](./pdf-booklet) +- [Zu einer Seite kombinieren](./combine-single-page) diff --git a/docs/de/tools/ocr-pdf.md b/docs/de/tools/ocr-pdf.md new file mode 100644 index 00000000..133dec0d --- /dev/null +++ b/docs/de/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Machen Sie gescannte PDFs durchsuchbar und kopierbar mit Tesseract OCR, mit Unterstützung mehrerer Sprachen und Zeichenfilterung. +--- + +# OCR PDF + +Verwandeln Sie gescannte Dokumente in durchsuchbare, kopierbare PDFs. Das Werkzeug nutzt Tesseract OCR, um Text in Bildern zu erkennen, und legt eine unsichtbare Textebene über die Originalseiten. Das Aussehen bleibt erhalten, der Inhalt wird vollständig durchsuchbar. + +## So funktioniert es + +1. Laden Sie eine gescannte oder bildbasierte PDF-Datei hoch. +2. Wählen Sie aus der durchsuchbaren Sprachliste eine oder mehrere Sprachen, die im Dokument vorkommen. +3. Passen Sie optional erweiterte Einstellungen an (Auflösung, Binarisierung, Whitelist). +4. Klicken Sie auf **OCR starten** und verfolgen Sie den Fortschritt in der Echtzeit-Fortschrittsanzeige. +5. Prüfen Sie nach Abschluss den extrahierten Text und laden Sie dann die durchsuchbare PDF oder eine einfache `.txt`-Datei herunter. + +## Funktionen + +- OCR in mehreren Sprachen mit durchsuchbarer Sprachauswahl +- Die unsichtbare Textebene erhält das ursprüngliche Aussehen des Dokuments +- Echtzeit-Fortschrittsanzeige und Protokollausgabe während der Verarbeitung +- Ergebnisse als durchsuchbare PDF oder als einfache Textdatei herunterladen +- Extrahierten Text direkt in die Zwischenablage kopieren +- Drei Auflösungsstufen, um Geschwindigkeit und Genauigkeit auszubalancieren + +## Optionen + +| Einstellung | Werte | Standard | Zweck | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------- | +| **Auflösung** | Standard (192 DPI), Hoch (288 DPI), Ultra (384 DPI) | Hoch | Höhere Auflösung verbessert die Genauigkeit bei kleinem Text, dauert aber länger | +| **Bild binarisieren** | Ein / Aus | Aus | Verstärkt den Kontrast bei sauberen Scans durch Umwandlung in Schwarz-Weiß | +| **Zeichen-Whitelist-Voreinstellung** | Keine, Alphanumerisch, Zahlen + Währung, Nur Buchstaben, Nur Zahlen, Rechnung, Formulare, Benutzerdefiniert | Keine | Beschränkt die erkannten Zeichen, um die Genauigkeit für bestimmte Dokumenttypen zu verbessern | +| **Zeichen-Whitelist** | Freitext | Leer | Manueller Zeichensatz, wenn die Voreinstellung auf Benutzerdefiniert steht | + +## Anwendungsfälle + +- Gescannte Verträge und Rechnungen durchsuchbar machen, damit Sie sie mit Strg+F durchsuchen können +- Text aus fotografierten Dokumenten oder alten Papierunterlagen extrahieren +- Belege mit der Voreinstellung Rechnung verarbeiten, um Beträge und Daten genau zu erfassen +- Barrierefreie PDFs aus reinen Bild-Scans für Compliance-Anforderungen erstellen +- Textinhalte aus gescannten Büchern oder Handbüchern im Stapel extrahieren + +## Tipps + +- Wählen Sie mehrere Sprachen, wenn Ihr Dokument gemischtsprachige Inhalte enthält (z. B. englische Überschriften mit japanischem Fließtext). +- Nutzen Sie die Binarisierung bei Dokumenten mit verblasstem oder kontrastarmem Text. Sie kann die Erkennungsgenauigkeit deutlich verbessern. +- Die Whitelist-Voreinstellungen Rechnung und Formulare verringern Fehlerkennungen bei strukturierten Dokumenten stark, indem sie irrelevante Zeichenformen ignorieren. + +## Verwandte Werkzeuge + +- [PDF-Tabellen extrahieren](./extract-tables) +- [PDF zusammenführen](./merge-pdf) +- [PDF komprimieren](./compress-pdf) diff --git a/docs/de/tools/odg-to-pdf.md b/docs/de/tools/odg-to-pdf.md new file mode 100644 index 00000000..0b243d4b --- /dev/null +++ b/docs/de/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG zu PDF +description: Wandeln Sie LibreOffice-Draw-Dateien (ODG) im Browser in PDF um. Kostenlos, ohne Upload, vollständig privat. +--- + +# ODG zu PDF + +Wandeln Sie OpenDocument-Graphics-Dateien in PDF um. ODG ist das native Format von LibreOffice Draw und wird für Diagramme, Flussdiagramme und Vektorillustrationen verwendet. Als PDF lassen sich diese Zeichnungen leicht teilen, drucken und in andere Dokumente einbetten. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :-------------------- | :---------- | :------------------------------------------ | +| OpenDocument Graphics | `.odg` | LibreOffice-Draw- / OpenOffice-Draw-Dateien | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre ODG-Dateien per Drag & Drop hinein. Mehrere Dateien können auf einmal hinzugefügt werden. +2. Prüfen Sie die Dateiliste. Entfernen Sie einzelne Einträge mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um weitere Zeichnungen aufzunehmen. +3. Klicken Sie auf **In PDF umwandeln**. Eine LibreOffice-basierte Engine wird im Browser geladen und wandelt jede ODG-Datei um, wobei Vektorgrafiken, Formen und Text erhalten bleiben. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien ergeben ein ZIP-Archiv namens `odg-to-pdf.zip`. + +## Optionen + +Es sind keine zusätzlichen Einstellungen erforderlich. Die Umwandlung erhält Seitenmaße, Formen, Verbinder und Textfelder der ODG-Quelle. + +## Anwendungsfälle + +- LibreOffice-Draw-Diagramme mit Kunden teilen, die LibreOffice nicht installiert haben +- In Draw erstellte Flussdiagramme und Netzwerkdiagramme drucken +- ODG-Illustrationen als eingebettete PDFs in einen Bericht oder eine Präsentation aufnehmen +- Technische Zeichnungen in einem Format archivieren, das jahrzehntelang lesbar bleibt + +## Tipps + +- Vektorelemente bleiben in der PDF-Ausgabe Vektoren, das Ergebnis lässt sich daher für jede Druckgröße sauber skalieren. +- Die LibreOffice-Engine braucht bei der ersten Nutzung einen Moment zur Initialisierung. Danach sind Umwandlungen in derselben Sitzung schneller. + +## Verwandte Werkzeuge + +- [ODS zu PDF](./ods-to-pdf) +- [ODP zu PDF](./odp-to-pdf) +- [VSD zu PDF](./vsd-to-pdf) diff --git a/docs/de/tools/odp-to-pdf.md b/docs/de/tools/odp-to-pdf.md new file mode 100644 index 00000000..063dbc3f --- /dev/null +++ b/docs/de/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP zu PDF +description: Wandeln Sie LibreOffice-Impress-Präsentationen (ODP) im Browser in PDF um. Kostenlos, privat, ohne Upload. +--- + +# ODP zu PDF + +Wandeln Sie OpenDocument-Presentation-Dateien in PDF um. ODP ist das native Format von LibreOffice Impress und ein Standardexport aus Google Slides. Als PDF kann jeder Präsentationen ohne Präsentationssoftware ansehen, und die Folien lassen sich sauber drucken. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :------------------------ | :---------- | :----------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google-Slides-Export | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre ODP-Dateien per Drag & Drop hinein. Sie können mehrere Präsentationen auf einmal auswählen. +2. Prüfen Sie die Dateiliste. Entfernen Sie Einträge mit dem Papierkorb-Symbol oder nutzen Sie **Weitere Dateien hinzufügen**, um weitere Präsentationen aufzunehmen. +3. Klicken Sie auf **In PDF umwandeln**. Die LibreOffice-basierte Engine verarbeitet jede Präsentation und erzeugt eine PDF, in der jede Folie zu einer Seite wird. +4. Eine einzelne Datei wird als PDF heruntergeladen. Mehrere Dateien werden in einem ZIP-Archiv namens `odp-to-pdf.zip` geliefert. + +## Optionen + +Es gibt nichts zu konfigurieren. Jede Folie wird in ihren ursprünglichen Maßen gerendert, mit Text, Bildern, Formen und Folienhintergründen. + +## Anwendungsfälle + +- Eine Präsentation als Handout-PDF an das Publikum verteilen +- Google-Slides-Exporte mit Personen teilen, die PDF gegenüber ODP bevorzugen +- Konferenzvorträge und Vorlesungen in einem schreibgeschützten Format archivieren +- Foliensätze für Präsenz-Workshops drucken + +## Tipps + +- Folienübergänge und Animationen sind rein visuelle Funktionen, die nicht in die PDF übernommen werden, aber alle statischen Inhalte werden korrekt dargestellt. +- Sprechernotizen sind nicht in der PDF-Ausgabe enthalten. Wenn Sie Notizen brauchen, exportieren Sie sie separat aus Ihrer Präsentationssoftware. +- Wie die anderen LibreOffice-basierten Werkzeuge wird die Engine bei der ersten Nutzung geladen und für die Sitzung zwischengespeichert. + +## Verwandte Werkzeuge + +- [ODG zu PDF](./odg-to-pdf) +- [ODS zu PDF](./ods-to-pdf) +- [PUB zu PDF](./pub-to-pdf) diff --git a/docs/de/tools/ods-to-pdf.md b/docs/de/tools/ods-to-pdf.md new file mode 100644 index 00000000..ff860a98 --- /dev/null +++ b/docs/de/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS zu PDF +description: Wandeln Sie LibreOffice-Calc-Tabellen (ODS) direkt im Browser in PDF um. Kostenlos, privat, ohne Anmeldung. +--- + +# ODS zu PDF + +Wandeln Sie OpenDocument-Tabellen in PDF um. ODS ist das native Format von LibreOffice Calc und ein häufiger Export aus Google Sheets. Dieses Werkzeug rendert Ihre Tabellendaten, Formatierungen und Diagramme in ein seitenweise aufgeteiltes PDF, das Sie drucken oder teilen können. + +## Unterstützte Formate + +| Format | Endung | Hinweise | +| :----------------------- | :----- | :------------------------------------------ | +| OpenDocument Spreadsheet | `.ods` | Export aus LibreOffice Calc / Google Sheets | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre ODS-Dateien per Drag-and-drop hinein. Mehrere Dateien werden unterstützt. +2. Prüfen Sie die Dateiliste. Mit dem Papierkorb-Symbol entfernen Sie Dateien, mit **Weitere Dateien hinzufügen** erweitern Sie den Stapel. +3. Klicken Sie auf **In PDF umwandeln**. Die auf LibreOffice basierende Engine wird im Browser geladen und rendert jede Tabelle in PDF-Seiten. +4. Eine einzelne Tabelle wird als PDF heruntergeladen. Mehrere Dateien werden in `ods-to-pdf.zip` gepackt. + +## Optionen + +Es ist keine Konfiguration nötig. Der Konverter übernimmt das vorhandene Drucklayout, die Zellformatierung und die Spaltenbreiten der Tabelle in die PDF-Ausgabe. + +## Anwendungsfälle + +- Ein Budget oder einen Bericht aus LibreOffice Calc mit jemandem teilen, der nur PDFs akzeptiert +- Einen als ODS heruntergeladenen Google-Sheets-Export drucken +- Finanzunterlagen in einem nicht bearbeitbaren Format archivieren +- ODS-basierte Formulare oder Stundenzettel als Dokumente mit festem Layout einreichen + +## Tipps + +- Wenn Ihre Tabelle mehrere Blätter hat, werden alle Blätter in die PDF-Ausgabe übernommen. +- Sehr breite Tabellen können horizontal über mehrere PDF-Seiten laufen. Passen Sie die Spaltenbreiten in der Quelldatei vor der Umwandlung an, wenn das Layout wichtig ist. +- Die LibreOffice-Engine wird bei der ersten Nutzung initialisiert. Weitere Umwandlungen in derselben Sitzung sind schneller. + +## Verwandte Werkzeuge + +- [ODG zu PDF](./odg-to-pdf) +- [ODP zu PDF](./odp-to-pdf) +- [XML zu PDF](./xml-to-pdf) diff --git a/docs/de/tools/odt-to-pdf.md b/docs/de/tools/odt-to-pdf.md new file mode 100644 index 00000000..b3c1b851 --- /dev/null +++ b/docs/de/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT zu PDF +description: Wandeln Sie OpenDocument-Text-Dateien (ODT) im Browser mit einer auf LibreOffice basierenden Engine in PDF um. +--- + +# ODT zu PDF + +Wandeln Sie OpenDocument-Text-Dateien in PDF um. ODT ist das native Format von LibreOffice Writer, Apache OpenOffice und anderen Open-Source-Textverarbeitungen. Dieses Werkzeug nutzt eine browserbasierte LibreOffice-Engine für genaue Umwandlungen, die Formatierung, Tabellen, Bilder und Formatvorlagen erhalten. + +## Unterstützte Formate + +| Format | Endungen | +| :---------------- | :------- | +| OpenDocument Text | `.odt` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie eine oder mehrere ODT-Dateien per Drag-and-drop hinein. +2. Prüfen Sie die Dateiliste. Fügen Sie weitere Dateien hinzu oder entfernen Sie unerwünschte. +3. Klicken Sie auf **In PDF umwandeln**. Die LibreOffice-Engine wird initialisiert (eine Fortschrittsanzeige zeigt den Ladestatus), danach wird jede Datei umgewandelt. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in `odt-converted.zip` gepackt. + +## Optionen + +Dieses Werkzeug hat keine zusätzliche Konfiguration. Die Umwandlung erhält die Formatierung des Originaldokuments so genau wie möglich. + +## Ausgabe + +| Anzahl Eingaben | Ausgabe | +| :-------------- | :------------------------------------------------------- | +| 1 Datei | Einzelner PDF-Download (z. B. `document.pdf`) | +| 2+ Dateien | ZIP-Archiv (`odt-converted.zip`) mit einem PDF pro Datei | + +## Anwendungsfälle + +- LibreOffice-Writer-Dokumente in PDF umwandeln, um sie mit Microsoft-Office-Nutzern zu teilen +- Druckfertige PDFs aus wissenschaftlichen Arbeiten im OpenDocument-Format erzeugen +- Einen Ordner mit ODT-Vorlagen als Stapel in PDFs für die Verteilung umwandeln +- PDFs aus ODT-Dateien erzeugen, die von automatisierten Dokumentensystemen erstellt wurden + +## Tipps + +- Die LibreOffice-Engine wird bei der ersten Nutzung geladen und für weitere Umwandlungen zwischengespeichert. Das erste Laden dauert einige Sekunden, danach geht es schnell. +- Komplexe Dokumente mit eingebetteten OLE-Objekten oder ungewöhnlichen Schriften werden möglicherweise etwas anders dargestellt als in LibreOffice auf dem Desktop. Testen Sie mit einer Probe, bevor Sie einen Stapel umwandeln. +- Für Word-Dokumente (`.doc`, `.docx`) nutzen Sie stattdessen das Werkzeug [Word zu PDF](./word-to-pdf), das ebenfalls die LibreOffice-Engine verwendet, aber Microsoft-Formate direkt akzeptiert. + +## Verwandte Werkzeuge + +- [Word zu PDF](./word-to-pdf) +- [RTF zu PDF](./rtf-to-pdf) +- [Text zu PDF](./txt-to-pdf) diff --git a/docs/de/tools/organize-pdf.md b/docs/de/tools/organize-pdf.md new file mode 100644 index 00000000..788ae4ba --- /dev/null +++ b/docs/de/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplizieren & Organisieren +description: Ordnen Sie PDF-Seiten neu an, duplizieren Sie und löschen Sie sie per Drag-and-drop mit Vorschaubildern oder einer eigenen Seitenreihenfolge. +--- + +# Duplizieren & Organisieren + +Ordnen Sie Seiten eines PDFs neu an, duplizieren Sie oder entfernen Sie sie mit einer visuellen Drag-and-drop-Oberfläche. Jede Seite erscheint als Vorschaubild, das Sie verschieben, klonen oder löschen können, bevor Sie das Ergebnis als neue Datei speichern. + +## So funktioniert es + +1. Laden Sie eine einzelne PDF-Datei hoch. +2. Das Werkzeug zeigt ein Raster mit Vorschaubildern aller Seiten. +3. Ziehen Sie Vorschaubilder, um Seiten neu anzuordnen, klicken Sie auf die grüne Duplizieren-Schaltfläche, um eine Seite zu klonen, oder auf die rote Löschen-Schaltfläche, um sie zu entfernen. +4. Alternativ geben Sie im Textfeld eine eigene Seitenreihenfolge ein (z. B. `3, 1, 2, 4`) und klicken Sie auf **Anwenden**, um alle Seiten auf einmal neu anzuordnen. +5. Klicken Sie auf die Schaltfläche zum Verarbeiten, um das neu organisierte PDF zu erstellen und herunterzuladen. + +## Funktionen + +- Neuanordnung der Seiten per Drag-and-drop mit animierten Übergängen +- Duplizieren- und Löschen-Schaltflächen pro Seite +- Eingabe einer eigenen Seitenreihenfolge für präzises Umordnen +- Seitenzahlen, die sich nach jeder Änderung automatisch aktualisieren +- Verhindert das Löschen der letzten verbleibenden Seite + +## Anwendungsfälle + +- Eine falsch eingeordnete Seite in einem Bericht an die richtige Stelle verschieben +- Eine Formularseite duplizieren, um mehrere leere Kopien in einer Datei zu haben +- Entwurfs- oder Platzhalterseiten entfernen, bevor ein Dokument verteilt wird +- Die Seitenreihenfolge für die Druckvorbereitung umkehren oder mischen +- Eine eigene Seitenfolge erstellen, ohne einzelne Dateien erneut zusammenzuführen + +## Tipps + +- Das Feld für die eigene Seitenreihenfolge erwartet durch Kommas getrennte ursprüngliche Seitenzahlen. Jede Seite muss genau einmal vorkommen, ohne Auslassungen oder Duplikate. +- Nach dem Duplizieren einer Seite verweisen beide Kopien auf denselben ursprünglichen Seitenindex. Beide Kopien lassen sich unabhängig voneinander verschieben. +- Für Massenoperationen über mehrere Dateien oder komplexere Abläufe nehmen Sie besser das [PDF-Multitool](./pdf-multi-tool). + +## Verwandte Werkzeuge + +- [PDF zusammenführen](./merge-pdf) +- [Seiten löschen](./delete-pages) +- [PDF-Multitool](./pdf-multi-tool) +- [Seiten umkehren](./reverse-pages) diff --git a/docs/de/tools/page-dimensions.md b/docs/de/tools/page-dimensions.md new file mode 100644 index 00000000..c5208bab --- /dev/null +++ b/docs/de/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Seitenmaße +description: Analysieren Sie PDF-Seitengrößen, Ausrichtungen, Seitenverhältnisse und Drehung. Erkennen Sie Dokumente mit gemischten Größen und exportieren Sie die Daten als CSV. +--- + +# Seitenmaße + +Ein Diagnosewerkzeug, das jede Seite Ihres PDFs liest und die genauen Maße, Ausrichtung, Standardformat, Seitenverhältnis, Fläche und Drehung angibt. Nützlich, um gemischte Seitengrößen vor dem Drucken zu entdecken oder die Eigenschaften eines erhaltenen PDFs zu dokumentieren. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Die Analyse startet automatisch, Sie müssen keine Schaltfläche drücken. +2. Ein Übersichtsbereich zeigt die Gesamtzahl der Seiten, die Anzahl verschiedener Seitengrößen und ob das Dokument gemischte Größen enthält. +3. Durchsuchen Sie die vollständige Ergebnistabelle mit Details pro Seite. +4. Wechseln Sie die Anzeigeeinheit zwischen Punkt, Zoll, Millimeter oder Pixel. +5. Klicken Sie auf **Als CSV exportieren**, um die Daten zu speichern. + +## Angegebene Felder + +| Spalte | Beschreibung | +| ---------------- | --------------------------------------------------------- | +| Seite Nr. | Fortlaufende Seitenzahl | +| Maße | Breite x Höhe in der gewählten Einheit | +| Standardformat | Erkannter Name (A4, Letter usw.) oder "Benutzerdefiniert" | +| Ausrichtung | Hochformat oder Querformat | +| Seitenverhältnis | Verhältnis von Breite zu Höhe als Dezimalzahl | +| Fläche | Seitenfläche in der gewählten Einheit zum Quadrat | +| Drehung | Seitendrehung in Grad | + +## Funktionen + +- Automatische Erkennung von Standardpapierformaten (A3, A4, A5, Letter, Legal, Tabloid und mehr) +- Warnung bei Dokumenten mit gemischten Größen, mit einer Aufschlüsselung, welche Größen vorkommen und wie viele Seiten sie nutzen +- Einheitenumrechnung zwischen Punkt, Zoll, Millimeter und Pixel (bei 96 PPI) +- CSV-Export für Tabellenkalkulationen oder Dokumentationssysteme + +## Anwendungsfälle + +- Prüfen, ob alle Seiten A4 sind, bevor ein Dokument an eine Druckerei geht +- Herausfinden, warum ein zusammengeführtes PDF auf bestimmten Seiten mit unerwarteten Rändern gedruckt wird +- Das Seitenlayout eines großen PDF-Archivs für Metadaten dokumentieren +- Gedrehte Seiten erkennen, die korrigiert werden müssen + +## Tipps + +- Wenn die Übersicht "Gemischte Größen" anzeigt, nutzen Sie das Werkzeug Seitengröße reparieren, um sie vor dem Drucken zu vereinheitlichen. +- Das Drehungsfeld hilft, Seiten zu finden, die korrekt angezeigt werden, aber ein Drehungsattribut ungleich null haben, was in manchen Abläufen Probleme verursachen kann. + +## Verwandte Werkzeuge + +- [Seitengröße reparieren](./fix-page-size): Seiten vereinheitlichen, nachdem gemischte Größen erkannt wurden +- [PDF komprimieren](./compress-pdf): das PDF optimieren, nachdem Seitenprobleme behoben wurden +- [PDF drehen](./rotate-pdf): gedrehte Seiten korrigieren diff --git a/docs/de/tools/page-numbers.md b/docs/de/tools/page-numbers.md new file mode 100644 index 00000000..6fb30737 --- /dev/null +++ b/docs/de/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Seitenzahlen +description: Fügen Sie an beliebiger Position Ihrer PDF-Seiten anpassbare Seitenzahlen mit einstellbarer Schrift, Größe und Farbe hinzu. +--- + +# Seitenzahlen + +Fügen Sie jeder Seite Ihres PDFs sichtbare Seitenzahlen hinzu. Sie wählen Position, Format, Schriftgröße und Farbe, den Rest erledigt das Werkzeug. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Stellen Sie im erscheinenden Optionsbereich die Seitenzahlen ein. +3. Klicken Sie zum Verarbeiten auf **Seitenzahlen hinzufügen**. +4. Das nummerierte PDF wird automatisch heruntergeladen. + +## Optionen + +- **Position**: Wähle, wo die Seitenzahlen erscheinen: Unten mittig, Unten links, Unten rechts, Oben mittig, Oben links oder Oben rechts. +- **Format**: Wählen Sie zwischen einfacher Nummerierung (1, 2, 3...) oder dem Format "Seite X von Y" (1 / 5, 2 / 5...). +- **Schriftgröße**: Legen Sie die Größe des Seitenzahltexts fest. Standard ist 12. +- **Farbe**: Wählen Sie mit dem Farbwähler eine beliebige Farbe für den Seitenzahltext. + +## Funktionen + +- Sechs Positionen, die alle Ecken und die mittleren Positionen abdecken +- Zwei Nummerierungsformate: einfach fortlaufend oder "Seite X von Y" +- Anpassbare Schriftgröße von 6 bis 72 Punkt +- Vollständiger Farbwähler für die Textfarbe +- Automatische Randbehandlung, die Zahlen unabhängig von der Seitengröße in sicheren Bereichen hält + +## Anwendungsfälle + +- Dokumente für den Druck vorbereiten, die sichtbare Seitenverweise brauchen +- Seitenzahlen zu einem aus mehreren Quelldateien zusammengeführten PDF hinzufügen +- Handouts von Präsentationen vor der Verteilung nummerieren +- Rechtsdokumente oder Verträge fortlaufend nummerieren + +## Tipps + +- Das Format "Seite X von Y" ist hilfreich bei Dokumenten, bei denen Leser die Gesamtlänge kennen sollen, etwa Angebote oder Berichte. +- Wenn Sie für verschiedene Abschnitte unterschiedliche Nummerierungsstile brauchen (etwa römische Ziffern für den Vorspann), nutzen Sie stattdessen das Werkzeug [Seitenbeschriftungen hinzufügen](./add-page-labels). + +## Verwandte Werkzeuge + +- [Seitenbeschriftungen hinzufügen](./add-page-labels) +- [Bates-Nummerierung](./bates-numbering) +- [Kopf- & Fußzeile](./header-footer) diff --git a/docs/de/tools/pdf-booklet.md b/docs/de/tools/pdf-booklet.md new file mode 100644 index 00000000..dec5c167 --- /dev/null +++ b/docs/de/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF-Broschüre +description: Ordnen Sie PDF-Seiten in Broschürenreihenfolge (Rückenstichheftung) an, um sie zu einer gedruckten Broschüre zu falzen und zu heften. +--- + +# PDF-Broschüre + +Ordnen Sie die Seiten eines PDFs in der Reihenfolge einer Broschüren-Ausschießung an. Beidseitig gedruckt und in der Mitte gefalzt, ergeben die Seiten die richtige Lesereihenfolge. Dies ist das Layout für rückengeheftete Broschüren und Zines. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Stellen Sie die Broschüreneinstellungen ein: Ausgabeseitengröße und Ausrichtung. +3. Klicken Sie auf **Vorschau erstellen**, um zu sehen, wie die Seiten auf jedem Bogen angeordnet werden. +4. Prüfen Sie die Vorschau, die jeden physischen Bogen mit der Zuordnung von Vorder- und Rückseite zeigt. +5. Klicken Sie auf **Herunterladen**, um das ausgeschossene Broschüren-PDF zu speichern. + +## Funktionen + +- Automatische Seitenumordnung für die Rückenstichheftung +- Einstellbare Ausgabeseitengröße +- Visuelle Vorschau des Broschürenlayouts vor dem Herunterladen +- Verarbeitet ungerade Seitenzahlen, indem bei Bedarf Leerseiten eingefügt werden +- Skaliert die Quellseiten passend zur Bogengröße der Broschüre + +## Anwendungsfälle + +- Druckbare Broschüren oder Zines aus einem normalen PDF erstellen +- Konferenzprogramme oder Veranstaltungsführer für den Druck im eigenen Haus vorbereiten +- Gefalzte Grußkarten oder kleine Kataloge herstellen +- Heftchen oder Gedichtsammlungen zum Binden von Hand erstellen + +## Tipps + +- Die Seitenzahl Ihres Quell-PDFs sollte für eine saubere Broschüre idealerweise ein Vielfaches von 4 sein. Ist sie es nicht, werden automatisch Leerseiten ergänzt, um den letzten Bogen aufzufüllen. +- Drucken Sie die Ausgabe beidseitig mit der Druckereinstellung "Wenden an der kurzen Kante", falzen Sie dann alle Bögen zusammen und heften Sie sie am Rücken. +- Um nur mehrere Seiten auf einem Bogen ohne Broschürenreihenfolge zu platzieren, nutzen Sie stattdessen [N-Up PDF](./n-up-pdf). + +## Verwandte Werkzeuge + +- [N-Up PDF](./n-up-pdf) +- [PDF drehen](./rotate-pdf) +- [Leere Seite hinzufügen](./add-blank-page) diff --git a/docs/de/tools/pdf-layers.md b/docs/de/tools/pdf-layers.md new file mode 100644 index 00000000..aa406d5f --- /dev/null +++ b/docs/de/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF-OCG-Ebenen +description: Zeigen Sie Ebenen (Optional Content Groups, OCG) in einem PDF-Dokument an, schalten Sie sie um, fügen Sie sie hinzu und löschen Sie sie. +--- + +# PDF-OCG-Ebenen + +Verwalten Sie die Optional Content Groups (OCG), im Alltag meist "Ebenen" genannt, in einem PDF. Sie können die Sichtbarkeit von Ebenen umschalten, neue Ebenen hinzufügen (auch verschachtelte untergeordnete Ebenen), Ebenen löschen und das geänderte PDF speichern. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Klicken Sie auf die Schaltfläche zum Verarbeiten, um das Dokument mit der PyMuPDF-Engine zu laden. +3. Das Werkzeug zeigt alle vorhandenen Ebenen mit Sichtbarkeitsstatus, Sperrstatus und Verschachtelungshierarchie. +4. Schalten Sie mit den Kontrollkästchen Ebenen ein oder aus. Gesperrte Ebenen lassen sich nicht umschalten. +5. Fügen Sie neue Ebenen oberster Ebene hinzu, indem Sie einen Namen eingeben und auf die Hinzufügen-Schaltfläche klicken, oder fügen Sie untergeordnete Ebenen unter einer bestehenden übergeordneten hinzu. +6. Löschen Sie Ebenen, die Sie nicht mehr brauchen. +7. Klicken Sie auf **Speichern**, um das geänderte PDF mit Ihren Ebenenänderungen herunterzuladen. + +## Funktionen + +- Zeigt die Ebenenhierarchie mit passender Einrückung für verschachtelte Ebenen +- Sichtbarkeit von Ebenen ein- oder ausschalten +- Anzeige gesperrter Ebenen verhindert versehentliche Änderungen +- Ebenen oberster Ebene oder untergeordnete Ebenen mit eigenen Namen hinzufügen +- Einzelne Ebenen löschen +- Speichert alle Änderungen in einer neuen PDF-Datei + +## Anwendungsfälle + +- Die Sichtbarkeit von Markup-Ebenen in Architektur- oder Konstruktionszeichnungen umschalten +- Neue Anmerkungsebenen zu einem Designdokument mit mehreren Ebenen hinzufügen +- Veraltete Ebenen aus einer Vorlage entfernen, bevor sie verteilt wird +- Prüfen, welche Ebenen in einem komplexen PDF von Dritten vorhanden sind + +## Tipps + +- Hat das PDF keine Ebenen, zeigt das Werkzeug einen leeren Zustand mit der Aufforderung, eine hinzuzufügen. Nicht alle PDFs verwenden OCG-Ebenen, sie sind am häufigsten bei CAD-Exporten und Designdateien. +- Untergeordnete Ebenen werden unter ihrer übergeordneten Ebene eingerückt dargestellt. Sie können Ebenen beliebig tief verschachteln. +- Gesperrte Ebenen werden mit einem Schloss-Symbol angezeigt, ihre Kontrollkästchen sind deaktiviert. Diese Sperren setzt der Ersteller des PDFs. + +## Verwandte Werkzeuge + +- [Metadaten anzeigen](./view-metadata) +- [Metadaten bearbeiten](./edit-metadata) +- [Duplizieren & Organisieren](./organize-pdf) diff --git a/docs/de/tools/pdf-multi-tool.md b/docs/de/tools/pdf-multi-tool.md new file mode 100644 index 00000000..4441782f --- /dev/null +++ b/docs/de/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF-Multitool +description: Ein Allround-Seitenmanager zum Zusammenführen, Teilen, Drehen, Duplizieren, Löschen und Neuordnen von PDF-Seiten. +--- + +# PDF-Multitool + +Ein einheitlicher Arbeitsbereich für jede Operation auf Seitenebene. Laden Sie ein oder mehrere PDFs hoch und bearbeiten Sie alle Seiten in einem einzigen visuellen Raster. Drehe, ordnen Sie um, dupliziere, lösche, fügen Sie neue PDFs ein, ergänzen Sie Leerseiten und teilen Sie das Ergebnis, alles ohne das Werkzeug zu verlassen. + +## So funktioniert es + +1. Klicken Sie auf **PDFs hochladen** oder ziehen Sie Dateien auf den Upload-Bereich. Mehrere Dateien werden unterstützt. +2. Alle Seiten aller hochgeladenen Dateien erscheinen mit Vorschaubildern in einem scrollbaren Raster. +3. Bearbeiten Sie Seiten über die Werkzeugleiste oder die Aktionsschaltflächen pro Seite. +4. Wählen Sie Seiten über das Kontrollkästchen auf jeder Karte aus und wende dann Massenoperationen an. +5. Markieren Sie Trennpunkte mit dem Scheren-Symbol, um die Ausgabe in separate Dateien zu teilen. +6. Klicken Sie auf **PDF exportieren**, um das Endergebnis herunterzuladen. Sind Trennmarkierungen vorhanden, ist die Ausgabe ein ZIP mit mehreren PDFs. + +## Funktionen + +- **Zusammenführen**: Laden Sie mehrere PDFs hoch, sie werden automatisch in einem Arbeitsbereich vereint +- **Neu anordnen**: Ziehen Sie Seitenkarten per Drag-and-drop, um die Reihenfolge zu ändern +- **Drehen**: Drehung pro Seite oder gesammelt in 90-Grad-Schritten (links oder rechts) +- **Duplizieren**: Klonen Sie jede Seite mit einem Klick +- **Löschen**: Entfernen Sie einzelne Seiten oder löschen Sie ausgewählte gesammelt +- **PDF einfügen**: Fügen Sie nach einer bestimmten Seite ein neues PDF hinzu +- **Leere Seite hinzufügen**: Hängen Sie am Ende eine leere A4-Seite an +- **Teilen**: Setzen Sie Trennmarkierungen zwischen Seiten und exportieren Sie dann ein ZIP mit separaten PDFs +- **Alle auswählen / Auswahl aufheben**: Schnelle Auswahl für Massenoperationen +- **Rückgängig / Wiederholen**: Vollständiger Verlauf für jede Operation +- **Auswahl herunterladen**: Exportieren Sie nur die ausgewählten Seiten als eigenständiges PDF +- Repariert beschädigte PDFs automatisch vor dem Laden + +## Anwendungsfälle + +- Ein eigenes Dokument aus Seiten mehrerer Quell-PDFs zusammenstellen +- Ein gescanntes Dokument bereinigen, indem Sie leere Seiten löschen, seitlich gescannte Seiten drehen und Abschnitte neu ordnen +- Ein großes PDF an Kapitelgrenzen mit visuellen Trennmarkierungen teilen +- Schnelle Bearbeitung auf Seitenebene ohne vollständigen PDF-Editor + +## Tipps + +- Das Rückgängig/Wiederholen-System erfasst jede Operation. Nutzen Sie es ruhig, Sie können Ihre Arbeit nicht versehentlich zerstören. +- Trennmarkierungen erscheinen als gestrichelte blaue Linien zwischen Seiten. Setzen Sie sie visuell dort, wo das Dokument geteilt werden soll, und exportieren Sie dann ein ZIP. +- Für einfaches Zusammenführen oder Teilen sind die eigenen Werkzeuge [PDF zusammenführen](./merge-pdf) oder [PDF teilen](./split-pdf) möglicherweise schneller. Das Multi-Werkzeug zeigt seine Stärke, wenn Sie in einer Sitzung mehrere Operationen brauchen. + +## Verwandte Werkzeuge + +- [PDF zusammenführen](./merge-pdf) +- [PDF teilen](./split-pdf) +- [Duplizieren & Organisieren](./organize-pdf) +- [PDF drehen](./rotate-pdf) diff --git a/docs/de/tools/pdf-to-bmp.md b/docs/de/tools/pdf-to-bmp.md new file mode 100644 index 00000000..f304106d --- /dev/null +++ b/docs/de/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF zu BMP +description: Wandeln Sie PDF-Seiten in unkomprimierte BMP-Bilder um. Nützlich für Altsysteme und Druck-Workflows, die Bitmap-Eingaben erfordern. +--- + +# PDF zu BMP + +Wandelt jede Seite eines PDFs in ein BMP-Bild (Bitmap) um. BMP ist ein unkomprimiertes Format, daher ist die Ausgabe pixelgenau und ohne Qualitätsverlust, die Dateien sind aber groß. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Klicken Sie auf **Umwandeln**, um die Datei zu verarbeiten. +3. Eine einzelne `.bmp`-Datei oder ein ZIP-Archiv wird automatisch heruntergeladen. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Seiten werden mit einem festen Maßstab von 2x gerendert, sodass die Bilder etwa die doppelten Maße der ursprünglichen PDF-Seite haben. + +## Ausgabeformat + +- **Einzelne Seite**: `filename.bmp` +- **Mehrere Seiten**: `filename_bmps.zip` mit `page_1.bmp`, `page_2.bmp` usw. + +## Anwendungsfälle + +- PDF-Seiten in Altsysteme oder Hardware einspeisen, die nur BMP-Eingaben akzeptieren. +- Unkomprimierte Bilder für bestimmte Druck-Workflows vorbereiten. +- Bitmap-Ausgabe als Eingabe für Bildverarbeitungswerkzeuge nutzen, die Rohpixeldaten benötigen. + +## Tipps + +- BMP-Dateien sind sehr groß, weil sie Rohpixeldaten ohne Komprimierung speichern. Für die meisten Zwecke liefert [PDF zu PNG](./pdf-to-png) verlustfreie Qualität bei viel kleineren Dateien. +- Wenn Ihr Zielsystem PNG oder TIFF akzeptiert, bevorzugen Sie diese Formate, um Speicherplatz zu sparen. + +## Verwandte Werkzeuge + +- [PDF zu PNG](./pdf-to-png) +- [PDF zu TIFF](./pdf-to-tiff) +- [PDF zu JPG](./pdf-to-jpg) diff --git a/docs/de/tools/pdf-to-cbz.md b/docs/de/tools/pdf-to-cbz.md new file mode 100644 index 00000000..8445ae0c --- /dev/null +++ b/docs/de/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF zu CBZ +description: Wandeln Sie ein PDF in eine CBZ-Datei (Comic Book Archive) für Comic-Reader wie Komga, Kavita, CDisplayEx und Calibre um. +--- + +# PDF zu CBZ + +Wandelt ein PDF in eine CBZ-Datei (Comic Book ZIP) um, das Standardformat für digitale Comics und Manga. Jede PDF-Seite wird zu einem Bild im Archiv. Das Werkzeug erzeugt Metadaten in drei Formaten für maximale Kompatibilität: ComicInfo.xml, metadata.opf und ComicBookInfo JSON. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Wählen Sie Bildformat, Qualität, Maßstab und optionale Metadaten. +3. Klicken Sie auf **Umwandeln**, um die CBZ-Datei zu erzeugen. +4. Die `.cbz`-Datei wird automatisch heruntergeladen. + +## Optionen + +| Option | Werte | Standard | Beschreibung | +| ------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------ | +| Bildformat | JPEG, PNG, WebP | JPEG | JPEG für Farbcomics, PNG für verlustfreie Schwarzweiß-Manga, WebP für beste Komprimierung. | +| Qualität | 50–100% | 85% | Steuert die JPEG/WebP-Komprimierung. Bei PNG ausgeblendet (immer verlustfrei). | +| Maßstab | 1.0x–4.0x | 2.0x | Ein höherer Maßstab erzeugt schärfere Bilder für hochauflösende Bildschirme. | +| Graustufen | An/Aus | Aus | Wandelt Seiten in Graustufen um. Verringert die Dateigröße bei Schwarzweiß-Inhalten. | +| Manga-Modus | An/Aus | Aus | Setzt die Leserichtung von rechts nach links in den Metadaten. | +| Metadaten einbinden | An/Aus | An | Bettet ComicInfo.xml, metadata.opf und ComicBookInfo JSON ein. | + +## Metadatenfelder + +Wenn Metadaten aktiviert sind, können Sie ausfüllen: + +- **Titel**: Wird automatisch aus dem PDF-Dateinamen erkannt. +- **Serie**: Der Name der Serie (z. B. "Naruto"). +- **Nummer (#)**: Ausgabennummer innerhalb der Serie. +- **Band (Bd.)**: Bandnummer. +- **Autor(en)**: Name des Autors oder Urhebers. +- **Verlag**: Veröffentlichendes Unternehmen. +- **Tags / Genre**: Durch Kommas getrennte Tags (z. B. "Action, Abenteuer"). +- **Erscheinungsjahr**: Jahr der Veröffentlichung (1900–2100). +- **Bewertung**: Community-Bewertung von 0 bis 5. + +## Metadaten-Kompatibilität + +Das Werkzeug schreibt Metadaten in drei Formaten, damit jeder Reader sie findet: + +| Format | Ort | Unterstützt von | +| ------------------ | ----------------- | ------------------------------------------- | +| ComicInfo.xml | Datei im ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Datei im ZIP | Calibre | +| ComicBookInfo JSON | ZIP-Kommentarfeld | Calibre (Ersatzlösung) | + +## Ausgabeformat + +- `filename.cbz`: Ein ZIP-Archiv mit nummerierten Seitenbildern und Metadatendateien. + +Seitenbilder werden mit führenden Nullen nummeriert (`01.jpg`, `02.jpg` usw.), damit Reader sie in der richtigen Reihenfolge anzeigen. + +## Anwendungsfälle + +- Manga- oder Comic-PDFs für die Nutzung mit Comic-Readern umwandeln. +- Eine digitale Comic-Bibliothek in Komga, Kavita oder Calibre aufbauen. +- Gescannte Comics in ein Reader-freundliches Format umwandeln. +- Comics in einem Format teilen, das Leserichtung und Metadaten erhält. + +## Tipps + +- Nutzen Sie **JPEG** für Farbcomics und **PNG** für Schwarzweiß-Manga, denn PNG komprimiert Schwarzweiß-Inhalte sehr effizient. +- Aktivieren Sie **Graustufen** bei Manga, um die Dateigröße deutlich zu verringern. +- Füllen Sie die Felder **Serie** und **Nummer** aus, damit Bibliotheksverwaltungen (Komga, Calibre) Ihre Sammlung automatisch organisieren können. +- **WebP** bietet die beste Komprimierung, aber ältere Comic-Reader unterstützen es möglicherweise nicht. + +## Verwandte Werkzeuge + +- [PDF zu JPG](./pdf-to-jpg) +- [PDF zu PNG](./pdf-to-png) +- [PDF zu TIFF](./pdf-to-tiff) +- [Bilder extrahieren](./extract-images) diff --git a/docs/de/tools/pdf-to-csv.md b/docs/de/tools/pdf-to-csv.md new file mode 100644 index 00000000..3a82debb --- /dev/null +++ b/docs/de/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF zu CSV +description: Extrahieren Sie Tabellen aus PDF-Dokumenten und exportieren Sie sie als einzelne CSV-Datei. Verarbeitet mehrseitige PDFs mit automatischer Tabellenerkennung. +--- + +# PDF zu CSV + +Extrahiert Tabellen aus einem PDF und exportiert sie als CSV-Datei. Das Werkzeug durchsucht jede Seite mit der Tabellenerkennung von PyMuPDF nach tabellarischen Daten und schreibt alle gefundenen Zeilen in eine einzige durch Kommas getrennte Ausgabe. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Klicken Sie auf **Umwandeln**, um die Tabellenextraktion zu starten. +3. Das Werkzeug durchsucht jede Seite und erkennt Tabellen automatisch. +4. Eine `.csv`-Datei mit allen extrahierten Tabellendaten wird heruntergeladen. + +Tabellen verschiedener Seiten sind in der Ausgabe durch leere Zeilen getrennt. Zellen mit Kommas, Anführungszeichen oder Zeilenumbrüchen werden gemäß RFC 4180 korrekt maskiert. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Alle im Dokument gefundenen Tabellen werden extrahiert und in einer einzigen CSV zusammengefasst. + +## Ausgabeformat + +- Eine einzelne Datei `filename.csv` mit allen erkannten Tabellen. + +## Anwendungsfälle + +- Finanzdaten aus PDF-Kontoauszügen oder Rechnungen in eine Tabelle übernehmen. +- Preistabellen aus Lieferantenangeboten zum Vergleich extrahieren. +- Tabellarische Forschungsdaten aus PDF-Arbeiten in ein für Analysewerkzeuge geeignetes Format umwandeln. +- Daten aus alten PDF-Berichten in Datenbanken migrieren. + +## Tipps + +- Werden keine Tabellen gefunden, zeigt das Werkzeug die Meldung "Keine Tabellen gefunden". Das bedeutet meist, dass das PDF ein Textlayout nutzt, das tabellarisch aussieht, aber nicht als echte Tabelle strukturiert ist. +- Für mehr Kontrolle über einzelne Tabellen nutzen Sie [PDF-Tabellen extrahieren](./extract-tables), womit Sie zwischen CSV, JSON und Markdown als Ausgabeformat wählen können. +- Wenn Sie die Daten im Excel-Format mit separaten Blättern pro Tabelle brauchen, nutzen Sie [PDF zu Excel](./pdf-to-excel). + +## Verwandte Werkzeuge + +- [PDF zu Excel](./pdf-to-excel) +- [PDF-Tabellen extrahieren](./extract-tables) +- [PDF zu Text](./pdf-to-text) diff --git a/docs/de/tools/pdf-to-excel.md b/docs/de/tools/pdf-to-excel.md new file mode 100644 index 00000000..29dbb029 --- /dev/null +++ b/docs/de/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF zu Excel +description: Extrahieren Sie Tabellen aus PDF-Dokumenten in eine Excel-Tabelle. Jede Tabelle erhält ein eigenes Arbeitsblatt mit Seitenverweis. +--- + +# PDF zu Excel + +Extrahiert Tabellen aus einem PDF und speichert sie als Excel-Tabelle (`.xlsx`). Jede erkannte Tabelle landet auf einem eigenen Arbeitsblatt, beschriftet mit Tabellennummer und Quellseite. Die Tabellenerkennung übernimmt PyMuPDF, die Excel-Erzeugung die Bibliothek SheetJS. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Klicken Sie auf **Umwandeln**, um die Tabellenextraktion zu starten. +3. Das Werkzeug durchsucht jede Seite nach Tabellen und erstellt dann eine Excel-Arbeitsmappe. +4. Eine `.xlsx`-Datei mit einem Blatt pro Tabelle wird heruntergeladen. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Alle erkannten Tabellen werden automatisch extrahiert. + +## Ausgabeformat + +- Eine einzelne Datei `filename.xlsx`. +- **Eine Tabelle**: ein einzelnes Arbeitsblatt namens "Table". +- **Mehrere Tabellen**: Arbeitsblätter namens "Table 1 (Page 3)", "Table 2 (Page 5)" usw. Blattnamen werden auf 31 Zeichen gekürzt (die Grenze von Excel). + +## Anwendungsfälle + +- PDF-Finanzberichte in bearbeitbare Tabellen für weitere Analysen umwandeln. +- Bestands- oder Bestelltabellen aus PDFs von Lieferanten extrahieren. +- Strukturierte Daten aus PDF-Formularen oder Katalogen zum Sortieren und Filtern in Excel übernehmen. +- Tabellarische PDF-Daten in einem Format archivieren, mit dem auch nicht technische Kollegen arbeiten können. + +## Tipps + +- Meldet das Werkzeug "Keine Tabellen gefunden", nutzt das PDF wahrscheinlich ein frei fließendes Textlayout statt strukturierter Tabellen. Versuchen Sie stattdessen [PDF zu Text](./pdf-to-text), um den Rohinhalt zu erhalten. +- Für ein einfacheres flaches Format nutzen Sie [PDF zu CSV](./pdf-to-csv). Für Downloads pro Tabelle in mehreren Formaten nutzen Sie [PDF-Tabellen extrahieren](./extract-tables). +- Prüfen Sie die Blattnamen, um zu erkennen, von welcher Seite jede Tabelle stammt. + +## Verwandte Werkzeuge + +- [PDF zu CSV](./pdf-to-csv) +- [PDF-Tabellen extrahieren](./extract-tables) +- [PDF zu Text](./pdf-to-text) diff --git a/docs/de/tools/pdf-to-greyscale.md b/docs/de/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..773e93ef --- /dev/null +++ b/docs/de/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF zu Graustufen +description: Wandeln Sie ein farbiges PDF in eine Graustufen-Version (Schwarzweiß) um. Erzeugt ein neues PDF, in dem auf jeder Seite alle Farben entfernt sind. +--- + +# PDF zu Graustufen + +Wandelt ein farbiges PDF in eine Graustufen-Version um. Jede Seite wird gerendert, entsättigt und als JPEG-Bild in ein neues PDF eingebettet. Die Ausgabe behält die ursprünglichen Seitenmaße. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Klicken Sie auf **Umwandeln**, um die Datei zu verarbeiten. +3. Eine neue `greyscale.pdf` wird heruntergeladen, bei der alle Seiten in Schwarzweiß umgewandelt sind. + +Im Hintergrund wird jede Seite im Maßstab 2x gerendert, die Pixeldaten laufen durch einen Graustufenfilter und werden dann als JPEG mit 90 % Qualität neu kodiert und in ein frisches PDF-Dokument gesetzt. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Die Graustufenumwandlung nutzt eine Standard-Luminanzformel, und die JPEG-Qualität ist fest auf 90 % eingestellt. + +## Ausgabeformat + +- Eine einzelne Datei `greyscale.pdf` mit allen Seiten als Graustufen-JPEG-Bilder. + +## Anwendungsfälle + +- Dokumente für den Schwarzweißdruck vorbereiten, um Farbtinte zu sparen. +- Einreichungsanforderungen für rechtliche oder behördliche Unterlagen erfüllen, die Graustufen vorschreiben. +- Die Dateigröße bei farbintensiven PDFs verringern (JPEG-Graustufenbilder sind kleiner als Farbbilder). +- Einen einheitlichen Look für Dokumente mit gemischten Farb- und Schwarzweißseiten schaffen. + +## Tipps + +- Da jede Seite gerastert und als JPEG neu eingebettet wird, ist die Ausgabe bildbasiert. Text im ursprünglichen PDF ist danach nicht mehr auswählbar oder durchsuchbar. Wenn Sie danach durchsuchbaren Text brauchen, schicken Sie die Ausgabe durch das OCR-Werkzeug. +- Für mehr Kontrolle über Farbanpassungen (Helligkeit, Kontrast, Sättigung) sehen Sie sich das Werkzeug Farben anpassen oder den Graustufen-Knoten im [PDF-Workflow-Builder](./pdf-workflow) an. + +## Verwandte Werkzeuge + +- [PDF zu JPG](./pdf-to-jpg) +- [PDF zu PNG](./pdf-to-png) +- [PDF-Workflow-Builder](./pdf-workflow) diff --git a/docs/de/tools/pdf-to-jpg.md b/docs/de/tools/pdf-to-jpg.md new file mode 100644 index 00000000..30850c12 --- /dev/null +++ b/docs/de/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF zu JPG +description: Wandeln Sie PDF-Seiten in JPG-Bilder mit einstellbarer Qualität um. Einseitige PDFs werden direkt heruntergeladen, mehrseitige als ZIP exportiert. +--- + +# PDF zu JPG + +Wandelt jede Seite eines PDFs in ein JPG-Bild um. Einseitige Dokumente werden als eigenständige `.jpg`-Datei heruntergeladen. Mehrseitige PDFs ergeben ein ZIP-Archiv mit einem JPG pro Seite. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. Das Werkzeug zeigt Dateiname, Dateigröße und Seitenzahl an. +2. Stellen Sie den Regler **Qualität** ein, um die JPG-Komprimierung zu steuern. +3. Klicken Sie auf **Umwandeln**, um die Verarbeitung zu starten. +4. Das Ergebnis wird automatisch heruntergeladen: ein einzelnes JPG bei einseitigen PDFs oder eine ZIP-Datei bei mehrseitigen Dokumenten. + +## Optionen + +- **Qualität**: ein Regler von 0 % bis 100 % (Standard 90 %). Höhere Werte erzeugen schärfere Bilder mit größeren Dateien. Niedrigere Werte komprimieren stärker. + +Seiten werden intern im Maßstab 2x gerendert, die Ausgabeauflösung ist also doppelt so groß wie die PDF-Seitenmaße. Eine Seite im Letter-Format ergibt ein Bild mit etwa 1.224 x 1.584 Pixeln. + +## Ausgabeformat + +- **Einzelne Seite**: `filename.jpg` +- **Mehrere Seiten**: `filename_jpgs.zip` mit `page_1.jpg`, `page_2.jpg` usw. + +## Anwendungsfälle + +- Vorschaubilder für ein Dokumentenmanagementsystem erzeugen. +- Eine Seite aus einem Bericht in einem Chat oder einer E-Mail teilen, die kein PDF unterstützt. +- Bildmaterial aus PDF-Diagrammen oder Illustrationen erstellen. +- Gescannte Dokumente als einzelne Bilder archivieren. + +## Tipps + +- Für verlustfreie Ausgabe nutzen Sie stattdessen [PDF zu PNG](./pdf-to-png). +- Eine Qualitätseinstellung von 80 bis 90 % bietet einen guten Kompromiss zwischen Dateigröße und Bildtreue. +- Wenn Sie pro Seite ein bestimmtes Format brauchen, sehen Sie sich den [PDF-Workflow-Builder](./pdf-workflow) mit seinem Ausgabe-Knoten PDF zu Bildern an. + +## Verwandte Werkzeuge + +- [PDF zu PNG](./pdf-to-png) +- [PDF zu WebP](./pdf-to-webp) +- [PDF zu BMP](./pdf-to-bmp) +- [PDF zu TIFF](./pdf-to-tiff) diff --git a/docs/de/tools/pdf-to-json.md b/docs/de/tools/pdf-to-json.md new file mode 100644 index 00000000..24d7c416 --- /dev/null +++ b/docs/de/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF zu JSON +description: Wandeln Sie PDF-Dateien mit CPDF in strukturiertes JSON um. Exportiert die interne PDF-Struktur als maschinenlesbare JSON-Daten. +--- + +# PDF zu JSON + +Wandelt eine oder mehrere PDF-Dateien in das JSON-Format um. Das Werkzeug nutzt CPDF (Coherent PDF), um die interne Struktur jedes PDFs in eine maschinenlesbare JSON-Darstellung zu serialisieren. Die Ausgabe wird immer als ZIP-Archiv geliefert. + +## So funktioniert es + +1. Wählen Sie eine oder mehrere PDF-Dateien mit der Dateiauswahl. +2. Klicken Sie auf **Umwandeln**, um die Verarbeitung zu starten. Die Umwandlung läuft in einem Web Worker im Hintergrund. +3. Ein ZIP-Archiv mit einer JSON-Datei für jedes Eingabe-PDF wird heruntergeladen. + +Die Statusleiste zeigt den Fortschritt der Umwandlung und der ZIP-Erstellung. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Jedes PDF wird in seine vollständige JSON-Darstellung umgewandelt. + +## Ausgabeformat + +- Eine Datei `pdfs-to-json.zip` mit `filename.json` für jedes Eingabe-PDF. + +Die JSON-Ausgabe stellt die interne Objektstruktur des PDFs dar, einschließlich Seitenbäumen, Schriftverweisen, Metadaten und Inhaltsströmen. + +## Anwendungsfälle + +- Die interne Struktur eines PDFs zur Fehlersuche oder Validierung untersuchen. +- Strukturierte Metadaten und Seiteneigenschaften programmatisch extrahieren. +- PDF-Strukturdaten in eigene Verarbeitungspipelines einspeisen. +- PDF-Dokumente auf Konformität prüfen, indem man ihre Objektbäume analysiert. + +## Tipps + +- Dieses Werkzeug gibt die rohe PDF-Objektstruktur aus, nicht den extrahierten Textinhalt. Wenn Sie Seitentext im JSON-Format brauchen, nutzen Sie stattdessen [PDF für KI vorbereiten](./prepare-pdf-for-ai). +- Für reine Textextraktion ist [PDF zu Text](./pdf-to-text) einfacher. +- Große PDFs mit komplexen Strukturen erzeugen sehr große JSON-Dateien. + +## Verwandte Werkzeuge + +- [PDF zu Text](./pdf-to-text) +- [PDF für KI vorbereiten](./prepare-pdf-for-ai) +- [PDF-Tabellen extrahieren](./extract-tables) diff --git a/docs/de/tools/pdf-to-markdown.md b/docs/de/tools/pdf-to-markdown.md new file mode 100644 index 00000000..144e021d --- /dev/null +++ b/docs/de/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF zu Markdown +description: Wandeln Sie PDF-Dokumente in das Markdown-Format um, optional mit Bildextraktion. Unterstützt die Stapelumwandlung mehrerer Dateien. +--- + +# PDF zu Markdown + +Wandelt PDF-Dateien in das Markdown-Format (`.md`) um und erhält dabei Überschriften, Absätze, Listen und einfache Formatierung. Optional werden eingebettete Bilder extrahiert und eingebunden. Unterstützt die Umwandlung einzelner Dateien und im Stapel. Basiert auf PyMuPDF. + +## So funktioniert es + +1. Laden Sie ein oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien darauf ziehen. +2. Aktivieren Sie optional **Bilder einbinden**, um extrahierte Bilder in die Markdown-Ausgabe einzubetten. +3. Klicken Sie auf **Umwandeln**, um die Verarbeitung zu starten. +4. Eine einzelne Datei wird als `filename.md` heruntergeladen. Mehrere Dateien ergeben eine `markdown-files.zip`. + +## Optionen + +- **Bilder einbinden**: Wenn aktiviert, werden eingebettete Bilder aus dem PDF extrahiert und in der Markdown-Ausgabe referenziert. Wenn deaktiviert, wird nur der Textinhalt umgewandelt. + +## Ausgabeformat + +- **Einzelne Datei**: `filename.md` +- **Mehrere Dateien**: `markdown-files.zip` mit einer `.md` pro Eingabe-PDF. + +## Anwendungsfälle + +- PDF-Dokumentation in Markdown für einen Static-Site-Generator wie VitePress, Hugo oder Jekyll umwandeln. +- PDF-Forschungsarbeiten in bearbeitbares Markdown für Notiz-Apps wie Obsidian überführen. +- Alte PDF-Wissensdatenbanken in ein Git-freundliches Textformat migrieren. +- Strukturierte Inhalte aus PDF-E-Books zur Neuformatierung extrahieren. + +## Tipps + +- Die Option Bilder einbinden ist nützlich, wenn das PDF Diagramme oder Abbildungen enthält, die für den Inhalt wichtig sind. Deaktivieren Sie sie bei textlastigen Dokumenten, damit die Ausgabe sauber bleibt. +- Komplexe Layouts mit Seitenleisten, Fußnoten oder mehrspaltigem Text können unvollkommenes Markdown erzeugen. Prüfen Sie die Ausgabe und passen Sie sie bei Bedarf an. +- Für reinen Text ohne Formatierung nutzen Sie stattdessen [PDF zu Text](./pdf-to-text). + +## Verwandte Werkzeuge + +- [PDF zu Text](./pdf-to-text) +- [PDF zu Word](./pdf-to-word) +- [PDF für KI vorbereiten](./prepare-pdf-for-ai) diff --git a/docs/de/tools/pdf-to-pdfa.md b/docs/de/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..602dca12 --- /dev/null +++ b/docs/de/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF zu PDF/A +description: Wandeln Sie Standard-PDFs für die Langzeitarchivierung in das PDF/A-Format um. Unterstützt die Konformitätsstufen PDF/A-1b, PDF/A-2b und PDF/A-3b. +--- + +# PDF zu PDF/A + +PDF/A ist eine ISO-genormte Teilmenge von PDF, die für die digitale Langzeitarchivierung entwickelt wurde. Dieses Werkzeug wandelt Ihre Standard-PDFs mit Ghostscript, das direkt in Ihrem Browser läuft, in PDF/A-konforme Dokumente um. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. +2. Wählen Sie im Dropdown eine **PDF/A-Version**. +3. Aktivieren Sie optional **PDF vorab verflachen** für komplexe Dateien, bei denen die normale Umwandlung scheitert. +4. Klicken Sie auf **In PDF/A umwandeln**. Mehrere Dateien ergeben ein ZIP-Archiv. + +## PDF/A-Versionen + +| Version | Einschränkungen | Am besten für | +| ------------ | ----------------------------------------------- | -------------------------------------------------- | +| **PDF/A-1b** | Am strengsten. Keine Transparenz, keine Ebenen. | Maximale Kompatibilität mit älteren Archivsystemen | +| **PDF/A-2b** | Erlaubt Transparenz und JPEG2000. | Allgemeine Archivierung (empfohlen) | +| **PDF/A-3b** | Erlaubt eingebettete Anhänge in jedem Format. | Archivierung von Dokumenten mit Quelldatendateien | + +PDF/A-2b ist standardmäßig ausgewählt und genügt für die allermeisten Archivierungszwecke. + +## Option Vorab verflachen + +Manche PDFs enthalten Merkmale, die eine saubere PDF/A-Umwandlung verhindern: ungewöhnliche Schriftkodierungen, komplexe Transparenzstapel oder defekte interne Strukturen. Wenn Sie **Vorab verflachen** aktivieren, wird das PDF vor der Umwandlung mit 300 DPI gerastert. Das garantiert Konformität, macht den Text aber nicht mehr auswählbar. Nutzen Sie es als Ausweichlösung, wenn die normale Umwandlung Fehler erzeugt. + +Das Vorab-Verflachen erfordert die PyMuPDF-WASM-Engine. + +## Anwendungsfälle + +- Archivierungsvorgaben von Behörden oder Gerichten erfüllen (viele Rechtsordnungen verlangen PDF/A für Gerichtsunterlagen) +- Dokumente bei institutionellen Repositorien oder digitalen Bibliotheken einreichen +- Geschäftsunterlagen bewahren, wenn die ursprüngliche Software in zehn Jahren möglicherweise nicht mehr existiert +- Rechnungen für E-Rechnungsstandards vorbereiten, die PDF/A-3b mit XML-Anhängen verlangen + +## Tipps + +- Versuchen Sie die Umwandlung zuerst ohne Vorab-Verflachen. Aktivieren Sie es nur, wenn ein Fehler auftritt. +- PDF/A bettet alle Schriften ein, daher sind die Ausgabedateien oft größer als die Originale. +- Prüfen Sie die Ausgabe in einem eigenen PDF/A-Validator, wenn für Ihren Workflow strikte Konformität erforderlich ist. + +## Verwandte Werkzeuge + +- [PDF komprimieren](./compress-pdf): die Dateigröße nach der Umwandlung verringern +- [PDF reduzieren](./flatten-pdf): Formulare vor der Umwandlung in PDF/A verflachen +- [Metadaten entfernen](./remove-metadata): Metadaten vor der Archivierung entfernen diff --git a/docs/de/tools/pdf-to-png.md b/docs/de/tools/pdf-to-png.md new file mode 100644 index 00000000..a987a7d7 --- /dev/null +++ b/docs/de/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF zu PNG +description: Wandeln Sie PDF-Seiten in verlustfreie PNG-Bilder mit einstellbarem Maßstab um. Ideal für hochwertige Screenshots und transparente Hintergründe. +--- + +# PDF zu PNG + +Wandelt jede Seite eines PDFs in ein PNG-Bild um. PNG nutzt verlustfreie Komprimierung, daher erhält die Ausgabe jedes Detail der Originalseite. Einseitige PDFs werden als `.png`-Datei heruntergeladen, mehrseitige PDFs ergeben ein ZIP. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Stellen Sie den Regler **Maßstab** ein, um die Ausgabeauflösung zu steuern. +3. Klicken Sie auf **Umwandeln**, um die Verarbeitung zu starten. +4. Ein einzelnes PNG oder ein ZIP-Archiv wird automatisch heruntergeladen. + +## Optionen + +- **Maßstab**: reicht von 1.0x bis 3.0x (Standard 2.0x). Bei 2.0x wird eine Seite im Letter-Format mit etwa 1.224 x 1.584 Pixeln gerendert. Höhere Maßstäbe erzeugen größere, schärfere Bilder auf Kosten von Dateigröße und Verarbeitungszeit. + +## Ausgabeformat + +- **Einzelne Seite**: `filename.png` +- **Mehrere Seiten**: `filename_pngs.zip` mit `page_1.png`, `page_2.png` usw. + +## Anwendungsfälle + +- Hochwertige Screenshots von PDF-Seiten für Präsentationen erstellen. +- Diagramme oder Grafiken extrahieren, die scharfe Kanten und keine Komprimierungsartefakte brauchen. +- Assets für das Webdesign aus PDF-Entwürfen vorbereiten. +- Verlustfreie Seitenbilder für die OCR-Vorverarbeitung erzeugen. + +## Tipps + +- PNG-Dateien sind deutlich größer als JPG. Wenn die Dateigröße wichtiger ist als perfekte Qualität, nutzen Sie [PDF zu JPG](./pdf-to-jpg) oder [PDF zu WebP](./pdf-to-webp). +- Bei Maßstab 1.0x entspricht die Ausgabe der nativen Auflösung des PDFs. Erhöhen Sie auf 3.0x für Exporte in Druckqualität. + +## Verwandte Werkzeuge + +- [PDF zu JPG](./pdf-to-jpg) +- [PDF zu WebP](./pdf-to-webp) +- [PDF zu SVG](./pdf-to-svg) diff --git a/docs/de/tools/pdf-to-svg.md b/docs/de/tools/pdf-to-svg.md new file mode 100644 index 00000000..15163bcc --- /dev/null +++ b/docs/de/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF zu SVG +description: Wandeln Sie PDF-Seiten in skalierbare SVG-Vektorgrafiken um. Erhält Text und Formen als Vektorpfade für unbegrenztes Skalieren. +--- + +# PDF zu SVG + +Wandelt jede Seite eines PDFs in eine SVG-Datei (Scalable Vector Graphics) um. Anders als Rasterformate erhält SVG Vektorpfade, Text und Formen, sodass die Ausgabe ohne Pixelbildung auf jede Größe skaliert. Basiert auf PyMuPDF. + +## So funktioniert es + +1. Laden Sie ein oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien darauf ziehen. Sie können mehrere Dateien hinzufügen und einzeln verwalten. +2. Klicken Sie auf **Umwandeln**, um alle hochgeladenen Dateien zu verarbeiten. +3. Umwandlungen einer einzelnen Datei mit nur einer Seite werden als eigenständige `.svg` heruntergeladen. Alles andere wird als ZIP-Archiv heruntergeladen. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Jede Seite wird mit dem nativen Vektorexport von PyMuPDF in SVG umgewandelt. + +## Ausgabeformat + +- **Eine Datei, eine Seite**: `filename.svg` +- **Eine Datei, mehrere Seiten**: `filename_svg.zip` mit `page_1.svg`, `page_2.svg` usw. +- **Mehrere Dateien**: `pdf_to_svg.zip` mit Dateien, geordnet nach dem Namen des Quelldokuments. + +## Anwendungsfälle + +- Vektordiagramme, Grafiken oder Illustrationen aus PDF-Berichten für Webseiten extrahieren. +- PDF-Seiteninhalte in einem Vektoreditor wie Inkscape oder Illustrator bearbeiten. +- Skalierbare Seitenvorschauen in responsive Webanwendungen einbetten. +- Logos oder Grafiken aus PDF-Broschüren unter Erhalt scharfer Kanten extrahieren. + +## Tipps + +- SVG funktioniert am besten mit PDFs, die Vektorinhalte enthalten. Gescannte Dokumente oder bildlastige PDFs erzeugen große SVG-Dateien mit eingebetteten Rasterdaten. +- Für Rasterausgabe bei bildlastigen PDFs nutzen Sie stattdessen [PDF zu PNG](./pdf-to-png) oder [PDF zu JPG](./pdf-to-jpg). +- Dieses Werkzeug unterstützt die Stapelumwandlung: Laden Sie mehrere PDFs auf einmal hoch, um alle in einem Durchlauf umzuwandeln. + +## Verwandte Werkzeuge + +- [PDF zu PNG](./pdf-to-png) +- [PDF zu JPG](./pdf-to-jpg) +- [PDF zu Markdown](./pdf-to-markdown) diff --git a/docs/de/tools/pdf-to-text.md b/docs/de/tools/pdf-to-text.md new file mode 100644 index 00000000..c5851f91 --- /dev/null +++ b/docs/de/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF zu Text +description: Extrahieren Sie reinen Textinhalt aus PDF-Dateien. Unterstützt die Stapelextraktion mehrerer PDFs mit Ausgabe als TXT-Dateien. +--- + +# PDF zu Text + +Extrahiert den gesamten Textinhalt aus PDF-Dateien und speichert ihn als reine `.txt`-Dateien. Unterstützt die Stapelverarbeitung: Laden Sie mehrere PDFs hoch und lassen Sie den Text jedes einzelnen in einem Vorgang extrahieren. Basiert auf PyMuPDF. + +## So funktioniert es + +1. Laden Sie ein oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien darauf ziehen. Verwalten Sie Ihre Dateiliste mit den Schaltflächen Weitere hinzufügen und Leeren. +2. Klicken Sie auf **Extrahieren**, um die Verarbeitung zu starten. +3. Eine einzelne Datei wird als `filename.txt` heruntergeladen. Mehrere Dateien ergeben ein Archiv `pdf-to-text.zip`. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Der gesamte Textinhalt wird von jeder Seite in Lesereihenfolge extrahiert. + +## Ausgabeformat + +- **Einzelne Datei**: `filename.txt` +- **Mehrere Dateien**: `pdf-to-text.zip` mit einer `.txt` pro Eingabe-PDF. + +## Anwendungsfälle + +- Fließtext aus PDF-Berichten für die Volltextsuche-Indizierung extrahieren. +- PDF-E-Books oder Artikel zum Lesen auf E-Ink-Geräten in reinen Text umwandeln. +- Text aus Verträgen oder Rechtsdokumenten für die Stichwortanalyse gewinnen. +- Formatierung aus PDFs entfernen, um sauberen Text für Datenverarbeitungsskripte zu erhalten. +- Einen Textkorpus aus PDF-Archiven für die Verarbeitung natürlicher Sprache vorbereiten. + +## Tipps + +- Gescannte PDFs (nur Bild) erzeugen leere Textdateien, da keine Textebene zum Extrahieren vorhanden ist. Schicken Sie gescannte Dokumente zuerst durch OCR. +- Die Ausgabe erhält die Lesereihenfolge, wie PyMuPDF sie interpretiert, die im Allgemeinen von links nach rechts und von oben nach unten verläuft. Mehrspaltige Layouts können verschachtelten Text erzeugen. +- Für strukturierte Ausgabe mit Überschriften und Formatierung probieren Sie [PDF zu Markdown](./pdf-to-markdown). Für KI-taugliches strukturiertes JSON nutzen Sie [PDF für KI vorbereiten](./prepare-pdf-for-ai). + +## Verwandte Werkzeuge + +- [PDF zu Markdown](./pdf-to-markdown) +- [PDF für KI vorbereiten](./prepare-pdf-for-ai) +- [PDF zu Word](./pdf-to-word) diff --git a/docs/de/tools/pdf-to-tiff.md b/docs/de/tools/pdf-to-tiff.md new file mode 100644 index 00000000..011178e6 --- /dev/null +++ b/docs/de/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF zu TIFF +description: Wandeln Sie PDF-Seiten in TIFF-Bilder um, wie sie in Druck-, Fax- und Archiv-Workflows üblich sind. Weicht bei Kodierungsfehlern auf PNG aus. +--- + +# PDF zu TIFF + +Wandelt jede Seite eines PDFs in ein TIFF-Bild um. TIFF ist das Standardformat für Druckproduktion, Faxsysteme und Dokumentenarchivierung. Das Werkzeug nutzt PackBits-Komprimierung für die TIFF-Kodierung und weicht auf PNG aus, wenn eine Seite nicht kodiert werden kann. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Klicken Sie auf **Umwandeln**, um die Datei zu verarbeiten. +3. Eine einzelne TIFF-Datei oder ein ZIP-Archiv wird automatisch heruntergeladen. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Seiten werden mit einem festen Maßstab von 2x gerendert. + +## Ausgabeformat + +- **Einzelne Seite**: `filename.tiff` +- **Mehrere Seiten**: `filename_tiffs.zip` mit `page_1.tiff`, `page_2.tiff` usw. + +Schlägt die TIFF-Kodierung für eine bestimmte Seite fehl (wegen Komprimierungsproblemen), wird diese Seite stattdessen als `.png`-Datei gespeichert. Das ZIP enthält dann eine Mischung aus TIFF- und PNG-Dateien. + +## Anwendungsfälle + +- Dokumente bei Behörden oder Rechtssystemen einreichen, die das TIFF-Format verlangen. +- Seiten für die Faxübertragung über digitale Faxdienste vorbereiten. +- Gescannte Dokumente in einem weit unterstützten verlustfreien Format archivieren. +- Seiten in Dokumentenmanagementsysteme von Unternehmen einspeisen. + +## Tipps + +- TIFF-Dateien sind groß. Wenn Sie verlustfreie Qualität nur für Web oder Bildschirm brauchen, ist [PDF zu PNG](./pdf-to-png) die bessere Wahl. +- Prüfen Sie den ZIP-Inhalt, wenn einige Seiten auf PNG ausweichen mussten. Möglicherweise möchten Sie diese separat umwandeln. + +## Verwandte Werkzeuge + +- [PDF zu PNG](./pdf-to-png) +- [PDF zu BMP](./pdf-to-bmp) +- [PDF zu JPG](./pdf-to-jpg) diff --git a/docs/de/tools/pdf-to-webp.md b/docs/de/tools/pdf-to-webp.md new file mode 100644 index 00000000..98aa3bb5 --- /dev/null +++ b/docs/de/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF zu WebP +description: Wandeln Sie PDF-Seiten in WebP-Bilder mit einstellbarer Qualität um. Kleinere Dateien als JPG bei vergleichbarer Bildqualität. +--- + +# PDF zu WebP + +Wandelt jede Seite eines PDFs in ein WebP-Bild um. WebP erzeugt bei gleicher wahrgenommener Qualität in der Regel 25 bis 35 % kleinere Dateien als JPG und ist damit eine gute Wahl für die Webnutzung. + +## So funktioniert es + +1. Laden Sie ein PDF hoch, indem Sie auf die Ablagefläche klicken oder eine Datei darauf ziehen. +2. Stellen Sie den Regler **Qualität** ein. +3. Klicken Sie auf **Umwandeln**, um die Datei zu verarbeiten. +4. Eine einzelne `.webp`-Datei oder ein ZIP-Archiv wird automatisch heruntergeladen. + +## Optionen + +- **Qualität**: ein Regler von 0 % bis 100 % (Standard 85 %). Steuert den Grad der verlustbehafteten Komprimierung. Höhere Werte behalten mehr Details. + +Seiten werden intern im Maßstab 2x gerendert, sodass die Bilder etwa die doppelten nativen Maße des PDFs haben. + +## Ausgabeformat + +- **Einzelne Seite**: `filename.webp` +- **Mehrere Seiten**: `filename_webps.zip` mit `page_1.webp`, `page_2.webp` usw. + +## Anwendungsfälle + +- Seitenvorschauen für Websites vorbereiten, bei denen die Bandbreite zählt. +- Leichte Bildversionen von Flyern oder Broschüren für soziale Medien erzeugen. +- Mehrseitige Dokumente im Stapel in einen webtauglich optimierten Bildsatz umwandeln. + +## Tipps + +- WebP wird von allen modernen Browsern unterstützt. Für Kompatibilität mit älteren Systemen weiche auf [PDF zu JPG](./pdf-to-jpg) aus. +- Eine Qualität von 80 bis 85 % ist auf dem Bildschirm meist nicht vom Original zu unterscheiden und hält die Dateien klein. + +## Verwandte Werkzeuge + +- [PDF zu JPG](./pdf-to-jpg) +- [PDF zu PNG](./pdf-to-png) +- [PDF zu BMP](./pdf-to-bmp) diff --git a/docs/de/tools/pdf-to-word.md b/docs/de/tools/pdf-to-word.md new file mode 100644 index 00000000..2109af24 --- /dev/null +++ b/docs/de/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF zu Word +description: Wandeln Sie PDF-Dateien in bearbeitbare Word-Dokumente (DOCX) um. Unterstützt die Stapelumwandlung mehrerer PDFs auf einmal. +--- + +# PDF zu Word + +Wandelt PDF-Dateien in bearbeitbare Word-Dokumente (`.docx`) um. Das Werkzeug nutzt PyMuPDF, um den Dokumentinhalt zu rekonstruieren, und erhält Text, einfache Formatierung und Layout. Unterstützt die Umwandlung einzelner Dateien und im Stapel. + +## So funktioniert es + +1. Laden Sie ein oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien darauf ziehen. Sie können weitere Dateien hinzufügen oder einzelne aus der Liste entfernen. +2. Klicken Sie auf **Umwandeln**, um die Verarbeitung zu starten. +3. Eine einzelne Datei wird als `filename.docx` heruntergeladen. Mehrere Dateien werden in `converted-documents.zip` gepackt. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Jedes PDF wird mit der integrierten Umwandlungs-Engine von PyMuPDF in DOCX umgewandelt. + +## Ausgabeformat + +- **Einzelne Datei**: `filename.docx` +- **Mehrere Dateien**: `converted-documents.zip` mit einer `.docx` pro Eingabe-PDF. + +## Anwendungsfälle + +- Text in einem erhaltenen PDF bearbeiten, das Sie ändern müssen. +- Archivierte PDF-Berichte in ein Format umwandeln, das Kollegen in Microsoft Word oder Google Docs bearbeiten können. +- Inhalte aus PDF-Verträgen oder Angeboten zur Überarbeitung mit Änderungsverfolgung in Word übernehmen. +- Alte PDF-Dokumentation in ein bearbeitbares Format migrieren. + +## Tipps + +- Komplexe Layouts mit mehrspaltigem Text, eingebetteten Formularen oder vielen Grafiken werden möglicherweise nicht perfekt umgewandelt. Prüfen Sie die Ausgabe und passen Sie die Formatierung in Ihrer Textverarbeitung an. +- Gescannte PDFs (nur Bild) erzeugen leere oder minimale DOCX-Dateien. Schicken Sie sie zuerst durch OCR, um eine Textebene hinzuzufügen. +- Der Stapelmodus ist effizient, um ganze Ordner voller PDFs umzuwandeln: Laden Sie sie alle auf einmal hoch. + +## Verwandte Werkzeuge + +- [PDF zu Text](./pdf-to-text) +- [PDF zu Markdown](./pdf-to-markdown) +- [PDF-Workflow-Builder](./pdf-workflow) diff --git a/docs/de/tools/pdf-to-zip.md b/docs/de/tools/pdf-to-zip.md new file mode 100644 index 00000000..4df94061 --- /dev/null +++ b/docs/de/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDFs zu ZIP +description: Packen Sie mehrere PDF-Dateien in ein einziges ZIP-Archiv, um sie leicht zu teilen und zu speichern. +--- + +# PDFs zu ZIP + +Bündeln Sie mehrere PDF-Dateien in einem einzigen ZIP-Archiv. Dies ist ein einfaches Verpackungswerkzeug: Die PDFs selbst werden weder umgewandelt noch komprimiert oder verändert. + +## So funktioniert es + +1. Laden Sie mehrere PDF-Dateien über die Ablagefläche hoch. +2. Prüfen Sie die Dateiliste. Entfernen Sie alle Dateien, die nicht enthalten sein sollen. +3. Klicken Sie auf die Schaltfläche zum Verarbeiten. +4. Ein ZIP-Archiv mit allen hochgeladenen PDFs wird sofort heruntergeladen. + +## Funktionen + +- Akzeptiert beliebig viele PDF-Dateien +- Einzelne Dateien lassen sich vor dem Erstellen des Archivs entfernen +- Behält die ursprünglichen Dateinamen im ZIP bei +- Keine Änderung am PDF-Inhalt, die Dateien werden unverändert gepackt +- Zeigt Dateiname und Größe jedes hochgeladenen PDFs an + +## Anwendungsfälle + +- Eine Reihe von Rechnungen oder Belegen für den E-Mail-Anhang bündeln +- Projektergebnisse (mehrere PDF-Berichte) für die Übergabe verpacken +- Einen einzigen Download für eine Sammlung von Formularen oder Vorlagen erstellen +- Einen Stapel Dokumente in einer komprimierten Datei archivieren + +## Tipps + +- Die ZIP-Datei verwendet die ursprünglichen PDF-Dateinamen. Wenn Sie Dateien mit gleichem Namen haben, benennen Sie sie vor dem Hochladen um, um Konflikte zu vermeiden. +- Dieses Werkzeug komprimiert die PDFs selbst nicht. Um die Dateigröße zu verringern, schicken Sie sie zuerst durch PDF komprimieren und verpacken Sie sie dann mit diesem Werkzeug. + +## Verwandte Werkzeuge + +- [PDF zusammenführen](./merge-pdf) +- [PDF teilen](./split-pdf) +- [PDF komprimieren](./compress-pdf) diff --git a/docs/de/tools/pdf-workflow.md b/docs/de/tools/pdf-workflow.md new file mode 100644 index 00000000..dafc6409 --- /dev/null +++ b/docs/de/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF-Workflow-Builder +description: Erstellen Sie eigene PDF-Verarbeitungspipelines visuell, indem Sie Knoten auf einer Arbeitsfläche verbinden. Verketten Sie Operationen wie Zusammenführen, Komprimieren, Wasserzeichen und Export. +--- + +# PDF-Workflow-Builder + +Mit dem Workflow-Builder verketten Sie mehrere PDF-Operationen zu einer einzigen automatisierten Pipeline. Statt Werkzeuge nacheinander einzeln auszuführen, verbinden Sie einen visuellen Graphen aus Knoten (Eingabe, Verarbeitung, Ausgabe) und führen alles mit einem Klick aus. Ihre Dateien verlassen nie den Browser. + +## So funktioniert es + +Die Oberfläche besteht aus drei Bereichen: einer **Knoten-Werkzeugkiste** links, der **Arbeitsfläche** in der Mitte und einem **Einstellungsbereich** rechts, der erscheint, wenn Sie einen Knoten auswählen. + +1. **Knoten hinzufügen**: Klicken Sie sie in der linken Seitenleiste an oder ziehen Sie sie direkt auf die Arbeitsfläche. Mit der Suchleiste oben in der Werkzeugkiste filtern Sie nach Namen. +2. **Knoten verbinden**: Ziehen Sie von einem Ausgangsanschluss (unten an einem Knoten) zu einem Eingangsanschluss (oben an einem anderen Knoten). Verbindungen verlaufen von oben nach unten. +3. **Einstellungen vornehmen**: Klicken Sie auf einen Knoten, um rechts seinen Einstellungsbereich zu öffnen. Jeder Knotentyp hat eigene Optionen (Seitenbereiche, Qualitätsregler, Passwörter usw.). +4. **Workflow ausführen**: Klicken Sie in der Werkzeugleiste auf **Ausführen**. Die Engine führt die Knoten in topologischer Reihenfolge nacheinander aus. Eine Statusleiste unten zeigt den Fortschritt. +5. **Ergebnisse herunterladen**: Der abschließende Download-Knoten speichert das fertige PDF (oder ein ZIP, wenn mehrere Dateien entstehen). + +## Knotenkategorien + +Die Knoten sind in sechs Kategorien gegliedert, die auf der Arbeitsfläche farblich gekennzeichnet sind: + +- **Eingabe** (blau): PDF-Eingabe, Bildeingabe, Word/Excel/PowerPoint zu PDF und über 15 weitere Formatkonverter, die Dateien in die Pipeline einspeisen. +- **Bearbeiten & Kommentieren** (indigo): Zuschneiden, Graustufen, Farben invertieren, Wasserzeichen, Seitenzahlen, Kopf- & Fußzeile, Scanner-Effekt, Farben anpassen, Hintergrundfarbe, Leere Seiten entfernen, Anmerkungen entfernen. +- **Organisieren & Verwalten** (violett): Zusammenführen, Teilen, Seiten extrahieren, Drehen, Seiten löschen, Umkehren, Leere Seite hinzufügen, Seiten aufteilen, N-Up, Seitengröße reparieren, Zu einer Seite kombinieren, Broschüre, Posterize, Metadaten bearbeiten, Inhaltsverzeichnis, OCR. +- **Optimieren & Reparieren** (bernstein): Komprimieren, Rastern, Linearisieren, Begradigen, PDF zu PDF/A, Schrift in Pfade umwandeln, Reparieren. +- **PDF schützen** (rosé): Verschlüsseln, Entschlüsseln, Bereinigen, Reduzieren, Digital signieren, Schwärzen. +- **Ausgabe** (türkis): Download (erkennt automatisch einzelnes PDF oder ZIP), PDF zu Bildern, PDF zu Text, PDF zu DOCX, PDF zu XLSX, PDF zu CSV, PDF zu SVG, PDF zu Markdown, Bilder extrahieren. + +## Workflows speichern und laden + +Die Werkzeugleiste bietet vier Möglichkeiten zur Speicherung: + +- **Speichern**: legt den aktuellen Workflow als benannte Vorlage im lokalen Speicher Ihres Browsers ab. Sie können mehrere Vorlagen speichern. +- **Laden**: öffnet ein Fenster mit allen gespeicherten Vorlagen. Klicken Sie auf Laden, um eine wiederherzustellen, oder löschen Sie Vorlagen, die Sie nicht mehr brauchen. +- **Exportieren**: lädt den Workflow als `.json`-Datei herunter, damit Sie ihn teilen oder sichern können. +- **Importieren**: lädt eine `.json`-Workflow-Datei von der Festplatte und stellt alle Knoten, Positionen und Verbindungen wieder her. + +Vorlagen bleiben im lokalen Speicher über Sitzungen hinweg erhalten. Exportierte JSON-Dateien sind zwischen Browsern und Geräten übertragbar. + +## Ausführungsmodell + +Die Engine erstellt aus Ihren Verbindungen einen Abhängigkeitsgraphen und führt die Knoten in topologischer Reihenfolge aus. Schlägt ein Knoten fehl, wird die Ausführung angehalten und der fehlerhafte Knoten rot markiert. Einige Regeln, die Sie beachten sollten: + +- Jeder Workflow braucht mindestens einen **Eingabe**-Knoten und einen **Ausgabe**-Knoten. +- Die Engine erkennt zirkuläre Abhängigkeiten und blockiert die Ausführung mit einer Fehlermeldung. +- Der Knoten **Verschlüsseln** muss der letzte Verarbeitungsschritt vor dem Ausgabeknoten sein. Platzieren Sie ihn früher, erscheint eine Validierungswarnung, weil nachfolgende Knoten nicht mit verschlüsselten Daten arbeiten können. +- Passwortgeschützte PDFs fragen während der Ausführung nach einem Passwort. +- Eingaben mit mehreren PDFs werden unterstützt: Der Zusammenführen-Knoten kann sie vereinen, oder Knoten für die Stapelverarbeitung verarbeiten jedes PDF einzeln. + +## Anschlusstypen + +Verbindungen nutzen typisierte Anschlüsse, um ungültige Verdrahtung zu verhindern: + +- **PDF** (indigo): ein einzelnes PDF-Dokument. +- **MultiPDF** (bernstein): mehrere gebündelte PDF-Dokumente. +- **Image** (grün): ein Bild-Blob. + +## Optionen + +Jeder Knoten hat eine eigene Konfiguration, erreichbar über den rechten Einstellungsbereich. Häufige Muster sind: + +- **Seitenbereiche** bei den Knoten Teilen, Seiten extrahieren, Seiten löschen +- **Qualitätsregler** bei Ausgabeknoten für Bildumwandlung +- **Passwortfelder** bei den Knoten Verschlüsseln und Entschlüsseln +- **Texteingaben** für Wasserzeichen, Kopf- & Fußzeile, Metadaten bearbeiten +- **Drehwinkel** beim Knoten Drehen +- **Komprimierungsstufe** beim Knoten Komprimieren +- **OCR-Sprachauswahl** beim OCR-Knoten + +## Anwendungsfälle + +- **Rechnungsverarbeitungs-Pipeline**: PDF-Eingabe -> OCR -> Tabellen extrahieren -> Download als CSV. +- **Berichte vereinheitlichen**: Word zu PDF -> Seitengröße reparieren -> Seitenzahlen hinzufügen -> Wasserzeichen -> Komprimieren -> Download. +- **Archivierung vorbereiten**: PDF-Eingabe -> Reparieren -> Reduzieren -> Bereinigen -> PDF zu PDF/A -> Download. +- **Bilder im Stapel extrahieren**: PDF-Eingabe (mehrere Dateien) -> Bilder extrahieren -> ZIP herunterladen. +- **Druckfertige Broschüren**: PDF-Eingabe -> Broschüre -> Zuschneiden -> Komprimieren -> Download. +- **Sichere Weitergabe**: PDF-Eingabe -> Schwärzen -> Anmerkungen entfernen -> Verschlüsseln -> Download. + +## Tipps + +- Nutzen Sie **Entf** oder **Rücktaste**, um den ausgewählten Knoten von der Arbeitsfläche zu entfernen. +- Klicken Sie auf die Schaltfläche **X** in der Statusleiste eines Knotens, um ihn direkt zu löschen. +- Verschieben Sie die Arbeitsfläche, indem Sie auf leeren Bereich klicken und ziehen. Der Cursor wird dabei zu einem Greifsymbol. +- Auf Mobilgeräten schalten Sie die Knoten-Werkzeugkiste mit der Schaltfläche **+** in der Werkzeugleiste um. +- Erzeugt Ihr Workflow mehrere Ausgabedateien, bündelt der Download-Knoten sie automatisch in einem ZIP. +- Fangen Sie einfach an: Bauen und testen Sie eine Pipeline mit zwei Knoten, bevor Sie sie komplexer machen. + +## Verwandte Werkzeuge + +- [PDF zu Text](./pdf-to-text) +- [PDF zu Excel](./pdf-to-excel) +- [Bilder extrahieren](./extract-images) +- [PDF zu Markdown](./pdf-to-markdown) diff --git a/docs/de/tools/png-to-pdf.md b/docs/de/tools/png-to-pdf.md new file mode 100644 index 00000000..4f96d04f --- /dev/null +++ b/docs/de/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG zu PDF +description: Wandeln Sie ein oder mehrere PNG-Bilder mit einstellbarer Qualität vollständig in Ihrem Browser in ein PDF-Dokument um. +--- + +# PNG zu PDF + +Wandeln Sie PNG-Bilder in PDF um und behalten Sie dabei die volle Auflösung. Jedes PNG wird zu einer eigenen Seite, deren Größe den ursprünglichen Bildmaßen entspricht. Transparenz wird automatisch behandelt. + +## Unterstützte Formate + +| Format | Endungen | +| :----- | :------- | +| PNG | `.png` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie PNG-Dateien per Drag-and-drop hinein. Sie können mehrere auf einmal auswählen. +2. Verwalten Sie die Dateiliste: Entfernen Sie unerwünschte Dateien oder fügen Sie weitere hinzu. +3. Wählen Sie im Dropdown eine **PDF-Qualität**. +4. Klicken Sie auf **In PDF umwandeln**. Die Ausgabe wird als `from_jpgs.pdf` heruntergeladen. + +Das Werkzeug nutzt pdf-lib, um jedes Bild direkt einzubetten. Lässt sich ein PNG nicht nativ einbetten (z. B. wegen eines ungewöhnlichen Farbprofils), wird es stattdessen über ein Canvas als JPEG neu gerendert. + +## Optionen + +Die **PDF-Qualität** steuert die Komprimierung vor dem Einbetten: + +- **Hohe Qualität**: minimale Komprimierung, größte Dateigröße. +- **Mittlere Qualität** (Standard): guter Kompromiss aus Größe und Klarheit. +- **Niedrige Qualität**: maximale Komprimierung, kleinste Ausgabe. + +## Anwendungsfälle + +- Screenshots in ein mehrseitiges PDF für Fehlerberichte oder Dokumentation umwandeln +- UI-Design-Exporte zur Prüfung in einer einzigen Datei bündeln +- Diagramm-Exporte (draw.io, Excalidraw) in ein teilbares PDF umwandeln +- Eine Reihe von Diagrammbildern zu einem Bericht zusammenstellen + +## Tipps + +- PNG-Dateien mit Transparenz erhalten im PDF einen weißen Hintergrund. Wenn Sie einen anderen Hintergrund brauchen, bearbeiten Sie die Bilder vorher. +- Bei Screenshots und Diagrammen mit scharfen Kanten und Text vermeidet die hohe Qualität JPEG-Artefakte. Bei mittlerer oder niedriger Qualität wird möglicherweise intern in JPEG umgewandelt. + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [JPG zu PDF](./jpg-to-pdf) +- [SVG zu PDF](./svg-to-pdf) diff --git a/docs/de/tools/posterize-pdf.md b/docs/de/tools/posterize-pdf.md new file mode 100644 index 00000000..d7b1b3e5 --- /dev/null +++ b/docs/de/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF posterisieren +description: Teilen Sie PDF-Seiten in ein Raster kleinerer Seiten auf, um sie im Großformat auf mehreren Blättern zu drucken. +--- + +# PDF posterisieren + +Teilen Sie jede Seite einer PDF in ein Raster kleinerer Teilseiten auf. Mit diesem Werkzeug drucken Sie eine einzelne Seite auf mehrere Blätter Papier, die Sie anschließend zu einem großen Poster oder Banner zusammensetzen. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Legen Sie die Anzahl der **Zeilen** und **Spalten** für das Raster fest (z. B. teilen 2 Zeilen x 2 Spalten jede Seite in 4 Teilseiten). +3. Geben Sie optional einen Seitenbereich an, um einzuschränken, welche Seiten posterisiert werden. +4. Die Vorschau zeigt ein Raster über der aktuellen Seite, damit Sie die Schnitte sehen können. +5. Wechseln Sie zwischen den Seiten, um das Raster auf anderen Seiten zu prüfen. +6. Klicken Sie auf die Schaltfläche zum Verarbeiten. Jede Rasterzelle wird in der Ausgabe-PDF zu einer eigenen Seite. + +## Funktionen + +- Einstellbare Zeilen- und Spaltenanzahl für flexible Rastergrößen +- Live-Vorschau mit Rasterüberlagerung, die genau zeigt, wo die Seiten geteilt werden +- Seitenbereichsfilter, um nur bestimmte Seiten zu posterisieren +- Seitenweise Navigation in der Vorschau +- Zwischengespeicherte Seitenvorschauen für schnelles Blättern +- Gestrichelte rote Rasterlinien markieren die Schnittkanten deutlich + +## Optionen + +| Option | Beschreibung | +| ----------------- | ------------------------------------------------------ | +| **Zeilen** | Anzahl der horizontalen Teilungen (Standard: 1) | +| **Spalten** | Anzahl der vertikalen Teilungen (Standard: 1) | +| **Seitenbereich** | Welche Seiten posterisiert werden (leer = alle Seiten) | + +## Anwendungsfälle + +- Eine Poster-PDF auf normalen A4- oder Letter-Blättern drucken und an der Wand zusammensetzen +- Große Banner aus dem Design einer einzelnen PDF-Seite erstellen +- Übergroße technische Zeichnungen in druckbare Kacheln aufteilen +- Großformatige Ausdrucke ohne Großformatdrucker anfertigen + +## Tipps + +- Ein 2x2-Raster macht aus einer Seite 4 Seiten. Ein 3x3-Raster macht aus einer Seite 9. Planen Sie das Raster danach, wie groß das zusammengesetzte Ergebnis werden soll. +- Die Vorschau hilft sich zu prüfen, dass wichtige Inhalte nicht auf einer Schnittlinie liegen. Passen Sie bei Bedarf Zeilen und Spalten an. +- Für die umgekehrte Operation (mehrere Seiten auf einem Blatt) nutzen Sie [N-Up PDF](./n-up-pdf). + +## Verwandte Werkzeuge + +- [N-Up PDF](./n-up-pdf) +- [Seiten teilen](./divide-pages) +- [PDF teilen](./split-pdf) diff --git a/docs/de/tools/powerpoint-to-pdf.md b/docs/de/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..b1c5cdbb --- /dev/null +++ b/docs/de/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint zu PDF +description: Wandeln Sie PowerPoint-Präsentationen (PPT, PPTX) und ODP-Dateien in PDF um, mit erhaltener Folienformatierung. +--- + +# PowerPoint zu PDF + +Wandeln Sie Präsentationsdateien in PDF um. Jede Folie wird zu einer Seite im Ausgabedokument, wobei Text, Bilder, Formen und Übergänge über eine browserbasierte LibreOffice-Engine dargestellt werden. Unterstützt werden moderne und ältere PowerPoint-Formate sowie das OpenDocument-Präsentationsformat. + +## Unterstützte Formate + +| Format | Endungen | +| :------------------------ | :------- | +| PowerPoint (modern) | `.pptx` | +| PowerPoint (älter) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre Präsentationsdateien per Drag & Drop hinein. +2. Prüfen Sie die Dateiliste. Fügen Sie weitere Dateien hinzu oder entfernen Sie welche. +3. Klicken Sie auf **In PDF umwandeln**. Die LibreOffice-Engine wird bei der ersten Nutzung geladen und wandelt dann jede Datei um. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in `powerpoint-converted.zip` gepackt. + +## Optionen + +Dieses Werkzeug hat keine zusätzlichen Einstellungen. Folien werden in ihren Originalmaßen dargestellt. + +## Ausgabe + +| Anzahl der Eingaben | Ausgabe | +| :------------------ | :---------------------------------------------------------------------- | +| 1 Datei | Einzelner PDF-Download (ursprünglicher Dateiname mit der Endung `.pdf`) | +| 2+ Dateien | ZIP-Archiv (`powerpoint-converted.zip`) mit einer PDF pro Datei | + +## Anwendungsfälle + +- Eine Präsentation vor dem Teilen in PDF umwandeln, wenn das Publikum eventuell kein PowerPoint hat +- Eine druckbare Handout-Version einer Foliensammlung für eine Konferenz oder einen Workshop erstellen +- Präsentationen in einem Format archivieren, das auf jedem Gerät identisch aussieht +- Eine Sammlung von ODP-Präsentationen aus LibreOffice Impress stapelweise in PDF umwandeln +- Eine PDF-Version eines Pitch Decks als E-Mail-Anhang erstellen + +## Tipps + +- Folienanimationen und Übergänge werden in der PDF nicht abgebildet. Jede Folie wird als statische Seite erfasst. +- Eingebettete Videos erscheinen nicht in der Ausgabe. Ersetzen Sie sie bei Bedarf durch einen Screenshot oder ein Platzhalterbild. +- Sprechernotizen sind im Standard-PDF-Export nicht enthalten. Wenn Sie Notizen brauchen, exportieren Sie zuerst über die native Ansicht "Notizen drucken" in PowerPoint. +- Die LibreOffice-Engine wird nach dem ersten Laden zwischengespeichert, daher geht die Umwandlung einer zweiten Präsentation in derselben Sitzung deutlich schneller. + +## Verwandte Werkzeuge + +- [Word zu PDF](./word-to-pdf) +- [Excel zu PDF](./excel-to-pdf) +- [Bilder zu PDF](./image-to-pdf) diff --git a/docs/de/tools/prepare-pdf-for-ai.md b/docs/de/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..2a0f1177 --- /dev/null +++ b/docs/de/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: PDF für KI vorbereiten +description: Extrahieren Sie PDF-Inhalte in strukturiertes JSON, optimiert für LLMs und KI-Pipelines wie LlamaIndex. Unterstützt Stapelverarbeitung. +--- + +# PDF für KI vorbereiten + +Extrahiert Inhalte aus PDF-Dateien und strukturiert sie als JSON, optimiert für die Verarbeitung durch große Sprachmodelle (LLMs) und KI-Frameworks wie LlamaIndex. Der Inhalt jeder Seite wird extrahiert und in ein strukturiertes Format gebracht, das für RAG-Pipelines, Chatbots oder semantische Suchsysteme bereit ist. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDFs hoch, indem Sie auf die Ablagefläche klicken oder Dateien darauf ziehen. +2. Klicken Sie auf **Extrahieren**, um die Verarbeitung zu starten. +3. Eine einzelne Datei wird als `filename_llm.json` heruntergeladen. Bei mehreren Dateien entsteht ein Archiv `pdf-for-ai.zip`. + +Das Werkzeug nutzt die LlamaIndex-Integration von PyMuPDF, um Inhalte seitenweise mit Metadaten zu extrahieren. Die Ausgabe lässt sich direkt in KI-Frameworks laden. + +## Optionen + +Dieses Werkzeug hat keine einstellbaren Optionen. Alle Seiten werden mit vollständigem Text und Metadaten extrahiert. + +## Ausgabeformat + +- **Einzelne Datei**: `filename_llm.json` +- **Mehrere Dateien**: `pdf-for-ai.zip` mit einer `_llm.json` pro Eingabe-PDF. + +Die JSON-Ausgabe folgt dem LlamaIndex-Dokumentschema mit Textinhalt und Metadatenfeldern pro Seite. + +## Anwendungsfälle + +- PDF-Dokumente für Retrieval-Augmented-Generation-Pipelines (RAG) vorbereiten. +- Aus PDF-Archiven eine durchsuchbare Wissensdatenbank für einen KI-Chatbot aufbauen. +- PDF-Berichte in LLM-basierte Analyse-Workflows einspeisen. +- Forschungsarbeiten für semantische Suche und Frage-Antwort-Systeme vorverarbeiten. +- Aus PDF-Dokumentsammlungen strukturierte Trainingsdaten erzeugen. + +## Tipps + +- Für reine Textextraktion ohne KI-spezifische Formatierung nutzen Sie [PDF zu Text](./pdf-to-text). +- Für Markdown-Ausgabe, die Überschriften und Struktur erhält, nutzen Sie [PDF zu Markdown](./pdf-to-markdown). +- Gescannte PDFs liefern leere oder minimale Ausgaben. Führe sie vor der Extraktion durch OCR, um eine Textebene hinzuzufügen. + +## Verwandte Werkzeuge + +- [PDF zu Text](./pdf-to-text) +- [PDF zu Markdown](./pdf-to-markdown) +- [PDF zu JSON](./pdf-to-json) diff --git a/docs/de/tools/protect-pdf.md b/docs/de/tools/protect-pdf.md new file mode 100644 index 00000000..83bd5333 --- /dev/null +++ b/docs/de/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: PDF schützen +description: Schützen Sie PDF-Dateien mit 256-Bit-AES-Verschlüsselung per Passwort. Legen Sie Benutzer- und Besitzerpasswörter mit einstellbaren Nutzungsbeschränkungen fest. +--- + +# PDF schützen + +Sperre Ihre PDF mit einem Passwort, damit nur berechtigte Personen sie öffnen können. BentoPDF verwendet 256-Bit-AES-Verschlüsselung, denselben Standard wie Banken und Behörden, und wendet sie vollständig in Ihrem Browser über QPDF an. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Geben Sie ein **Benutzerpasswort** ein (erforderlich). Dieses Passwort brauchen Personen, um die Datei zu öffnen. +3. Geben Sie optional ein **Besitzerpasswort** ein. Wenn es gesetzt ist, erhält die PDF Nutzungsbeschränkungen, die Drucken, Bearbeiten, Kopieren und Kommentieren verhindern. +4. Klicken Sie auf **PDF verschlüsseln**. +5. Laden Sie die verschlüsselte Datei herunter. + +## Passworttypen + +### Benutzerpasswort (erforderlich) + +Das Benutzerpasswort geben Empfänger ein, um die PDF zu öffnen. Ohne es ist das Dokument vollständig unzugänglich. Jede verschlüsselte PDF muss eines haben. + +### Besitzerpasswort (optional) + +Das Besitzerpasswort steuert, was ein berechtigter Benutzer nach dem Öffnen der Datei tun darf. Wenn Sie ein eigenes Besitzerpasswort festlegen, wendet BentoPDF automatisch die strengsten Beschränkungen an: + +- Ändern deaktiviert +- Extrahieren/Kopieren deaktiviert +- Drucken deaktiviert +- Kommentieren deaktiviert +- Formularausfüllen deaktiviert +- Dokumentzusammenstellung deaktiviert + +Wenn Sie das Besitzerpasswort leer lassen, wird die PDF verschlüsselt (zum Öffnen ist weiterhin das Benutzerpasswort nötig), hat aber nach dem Öffnen keine Nutzungsbeschränkungen. + +## Details zur Verschlüsselung + +- **Algorithmus**: AES-256 (256-Bit Advanced Encryption Standard) +- **Schlüssellänge**: 256 Bit +- **Standard**: PDF-2.0-Verschlüsselung (QPDF-Implementierung) + +AES-256 lässt sich mit heutiger Technik rechnerisch nicht per Brute-Force knacken. Die Sicherheit Ihrer verschlüsselten PDF hängt allein von der Stärke Ihres Passworts ab. + +## Anwendungsfälle + +- Vertrauliche Finanzberichte vor dem E-Mail-Versand schützen +- Rechtsdokumente sichern, die an die Gegenseite gehen +- Medizinische Unterlagen oder personenbezogene Daten mit einem Passwort versehen +- Kostenpflichtige Inhalte (E-Books, Berichte) mit Zugriffskontrolle verteilen +- Datenschutzrichtlinien erfüllen, die Verschlüsselung gespeicherter Daten verlangen + +## Tipps + +- Verwenden Sie ein starkes, einzigartiges Passwort. Eine Passphrase mit mindestens 12 Zeichen aus Groß- und Kleinbuchstaben, Zahlen und Symbolen ist ideal. +- Teilen Sie das Passwort über einen separaten Kanal (Telefon, Textnachricht) und nie in derselben E-Mail wie die PDF. +- Wenn Sie nur Aktionen einschränken wollen (kein Drucken, kein Kopieren), ohne ein Passwort zum Öffnen zu verlangen, nutzen Sie stattdessen das Werkzeug Berechtigungen ändern. + +## Verwandte Werkzeuge + +- [PDF entschlüsseln](./unlock-pdf): Verschlüsselung entfernen, wenn Sie das Passwort kennen +- [Berechtigungen ändern](./change-permissions): bestimmte Nutzungsbeschränkungen anpassen +- [Beschränkungen entfernen](./remove-restrictions): alle Sicherheitseinstellungen aus einer PDF entfernen +- [PDF bereinigen](./sanitize-pdf): versteckte Inhalte vor dem Verschlüsseln entfernen diff --git a/docs/de/tools/psd-to-pdf.md b/docs/de/tools/psd-to-pdf.md new file mode 100644 index 00000000..cc759e6a --- /dev/null +++ b/docs/de/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD zu PDF +description: Wandeln Sie Photoshop-Dateien (PSD) in Ihrem Browser in PDF um. Kostenlos, privat, ohne Adobe-Software. +--- + +# PSD zu PDF + +Wandeln Sie Adobe-Photoshop-PSD-Dateien in PDF-Dokumente um. PSD ist das native Photoshop-Format, und zum Öffnen braucht man normalerweise teure Adobe-Software. Dieses Werkzeug rendert das reduzierte Gesamtbild Ihrer PSD-Datei als PDF-Seite in voller Auflösung. + +## Unterstützte Formate + +| Format | Endung | Hinweise | +| :-------------- | :----- | :----------------------------------------- | +| Adobe Photoshop | `.psd` | Rendert das auf eine Ebene reduzierte Bild | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre PSD-Dateien per Drag & Drop hinein. Mehrere Dateien werden unterstützt. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Dateien mit dem Papierkorb-Symbol oder fügen Sie über **Weitere Dateien hinzufügen** mehr hinzu. +3. Klicken Sie auf **In PDF umwandeln**. Die PyMuPDF-Engine liest die PSD-Datei und bettet das Gesamtbild in der Originalauflösung in eine PDF-Seite ein. +4. Eine einzelne PSD ergibt eine PDF. Wenn Sie mehrere PSD-Dateien hochladen, werden sie zu einer mehrseitigen PDF namens `psd_to_pdf.pdf` kombiniert, wobei jede PSD eine Seite wird. + +## Optionen + +Es sind keine Einstellungen nötig. Der Konverter verwendet die reduzierten Bilddaten der PSD-Datei. + +## Anwendungsfälle + +- Photoshop-Entwürfe ansehen, ohne Photoshop zu öffnen +- Design-Korrekturabzüge an Kunden senden, die keine Adobe Creative Suite haben +- Hochauflösende Grafiken aus PSD-Dateien drucken +- Aus mehreren PSD-Designdateien ein PDF-Portfolio erstellen, wobei jede Datei eine Seite in einem einzigen Dokument wird + +## Tipps + +- Die Umwandlung rendert die Gesamtansicht (auf eine Ebene reduziert) der PSD. Einzelne Ebenen, Einstellungsebenen und Ebeneneffekte bleiben in der PDF nicht als eigene Elemente erhalten. +- Mehrere PSD-Dateien werden zu einer mehrseitigen PDF zusammengeführt statt zu einzelnen PDFs. Das ist praktisch für Portfolios oder Lookbooks. +- PSD-Dateien mit sehr hoher Auflösung (Druckdateien mit 300+ DPI) ergeben große PDFs. Das Werkzeug behält die volle Auflösung bei. + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [PNG zu PDF](./png-to-pdf) +- [VSD zu PDF](./vsd-to-pdf) diff --git a/docs/de/tools/pub-to-pdf.md b/docs/de/tools/pub-to-pdf.md new file mode 100644 index 00000000..91974c87 --- /dev/null +++ b/docs/de/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB zu PDF +description: Wandeln Sie Microsoft-Publisher-Dateien (PUB) in Ihrem Browser in PDF um. Kostenlos, privat, ohne Software. +--- + +# PUB zu PDF + +Wandeln Sie Microsoft-Publisher-Dateien in PDF um. Publisher ist ein Desktop-Publishing-Programm, das in manchen Microsoft-Office-Editionen enthalten ist, aber die meisten Leute haben es nicht installiert. Mit diesem Werkzeug kann jeder PUB-Dateien direkt im Browser in PDF umwandeln, ganz ohne Microsoft-Software. + +## Unterstützte Formate + +| Format | Endung | Hinweise | +| :------------------ | :----- | :--------------------------- | +| Microsoft Publisher | `.pub` | Desktop-Publishing-Dokumente | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre PUB-Dateien per Drag & Drop hinein. Mehrere Dateien können gleichzeitig hochgeladen werden. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Dateien mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**. +3. Klicken Sie auf **In PDF umwandeln**. Eine LibreOffice-basierte Engine wird im Browser geladen und wandelt jede PUB-Datei um, wobei Layout, Bilder und Textfelder erhalten bleiben. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in einem ZIP-Archiv namens `pub-to-pdf.zip` geliefert. + +## Optionen + +Es ist keine zusätzliche Konfiguration nötig. Der Konverter übernimmt die PUB-Layout-Engine automatisch. + +## Anwendungsfälle + +- Einen PUB-Flyer oder Newsletter von einem Kunden öffnen, ohne Microsoft Publisher zu kaufen +- Gemeindebriefe, Veranstaltungsprogramme oder Schulnewsletter umwandeln, die in Publisher erstellt wurden +- Marketingmaterial aus Publisher in einem universell zugänglichen Format archivieren +- PUB-Dateien auf einem System drucken, auf dem Publisher nicht installiert ist + +## Tipps + +- Komplexe Publisher-Layouts mit überlagerten Textfeldern und exakter Positionierung können sich bei der Umwandlung leicht verschieben. Prüfen Sie die Ausgabe, wenn es auf genaue Positionen ankommt. +- Die LibreOffice-Engine wird einmal pro Sitzung initialisiert. Die erste Umwandlung dauert länger, weitere gehen schneller. +- Für die originalgetreueste Umwandlung von Publisher-Dateien sollten die im Original verwendeten Schriftarten Standard-Systemschriften sein. + +## Verwandte Werkzeuge + +- [VSD zu PDF](./vsd-to-pdf) +- [ODP zu PDF](./odp-to-pdf) diff --git a/docs/de/tools/rasterize-pdf.md b/docs/de/tools/rasterize-pdf.md new file mode 100644 index 00000000..2b265824 --- /dev/null +++ b/docs/de/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF rastern +description: Wandeln Sie PDF-Seiten in eine bildbasierte PDF um. Reduzieren Sie alle Ebenen, entfernen Sie auswählbaren Text und steuern Sie DPI und Bildformat. +--- + +# PDF rastern + +Beim Rastern wird jede Seite einer PDF in ein Bild umgewandelt, und diese Bilder werden wieder zu einer PDF zusammengesetzt. Das Ergebnis sieht identisch zum Original aus, enthält aber keinen auswählbaren Text, keine interaktiven Elemente und keine bearbeitbaren Ebenen. Es ist praktisch eine hochwertige Fotokopie. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. +2. Legen Sie die **DPI** (Auflösung) für die gerasterte Ausgabe fest. +3. Wählen Sie ein **Bildformat**: PNG für verlustfreie Qualität oder JPEG für kleinere Dateien. +4. Aktivieren Sie optional **In Graustufen umwandeln**. +5. Klicken Sie auf **PDF rastern**. Mehrere Dateien werden als ZIP heruntergeladen. + +## Optionen + +| Einstellung | Werte | Standard | +| -------------- | --------------------------------- | -------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Bildformat** | PNG (verlustfrei), JPEG (kleiner) | PNG | +| **Graustufen** | An/Aus | Aus | + +## DPI-Richtwerte + +- **72**: nur für die Bildschirmansicht, kleinste Dateigröße +- **150**: gute Balance für den allgemeinen Gebrauch +- **200**: schärferer Text, mittlere Dateigröße +- **300**: Ausgabe in Druckqualität +- **600**: hochwertige Archivierung oder professioneller Druck + +## Anwendungsfälle + +- Textextraktion aus vertraulichen Dokumenten vor dem Teilen verhindern +- Probleme mit fehlenden Schriftarten beseitigen, indem Text in Pixel umgewandelt wird +- Eine "flache" Version einer PDF mit komplexen Ebenen oder Transparenzen erstellen, die in verschiedenen Viewern unterschiedlich dargestellt wird +- Eine PDF für ein System vorbereiten, das nur bildbasierte Eingaben akzeptiert +- Versteckte Inhalte (wie nachverfolgte Änderungen oder Formulardaten) entfernen, indem die PDF auf reine Bilder reduziert wird + +## Tipps + +- 150 DPI mit PNG ist ein solider Standard. Gehen Sie nur höher, wenn Sie Druckausgabe brauchen oder feine Details vergrößern wollen. +- JPEG erzeugt deutlich kleinere Dateien, führt aber zu Kompressionsartefakten an scharfen Textkanten. +- Rastern ist nicht umkehrbar. Behalten Sie Ihre Original-PDF, falls Sie später bearbeitbaren Text brauchen. + +## Verwandte Werkzeuge + +- [PDF komprimieren](./compress-pdf): die Dateigröße der gerasterten PDF verringern +- [PDF entzerren](./deskew-pdf): Seiten gescannter Dokumente vor dem Rastern geraderichten +- [Schriftart zu Umriss](./font-to-outline): Schriften in Vektorpfade umwandeln, wenn Sie die Skalierbarkeit behalten wollen +- [PDF reduzieren](./flatten-pdf): Formulare reduzieren, ohne sie in Bilder umzuwandeln diff --git a/docs/de/tools/remove-annotations.md b/docs/de/tools/remove-annotations.md new file mode 100644 index 00000000..2a405cef --- /dev/null +++ b/docs/de/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Annotationen entfernen +description: Entfernen Sie mit einem Klick alle Kommentare, Markierungen, Links und anderen Annotationen aus Ihrer PDF. +--- + +# Annotationen entfernen + +Bereinigen Sie Ihre PDF, indem Sie alle Annotationen entfernen: Kommentare, Markierungen, Haftnotizen, Textauszeichnungen, Links, Stempel und alle anderen im Dokument eingebetteten Annotationsobjekte. Der eigentliche Seiteninhalt (Text, Bilder, Grafiken) bleibt unverändert. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Das Werkzeug erkennt die Seitenanzahl des Dokuments und zeigt Dateiinformationen an. +3. Klicken Sie auf **Annotationen entfernen**, um die Verarbeitung zu starten. +4. Die bereinigte PDF ohne Annotationen wird automatisch heruntergeladen. + +## Funktionen + +- Entfernt alle Annotationstypen: Kommentare, Markierungen, Unterstreichungen, Durchstreichungen, Haftnotizen, Stempel, Links und Formularauszeichnungen +- Arbeitet auf jeder Seite des Dokuments +- Erhält alle Inhalte, die keine Annotationen sind (Text, Bilder, Vektorgrafiken, Formularfelder) +- Zeigt vor der Verarbeitung Seitenanzahl und Dateigröße an + +## Anwendungsfälle + +- Ein Dokument nach einer Prüfungsrunde, in der mehrere Prüfer Kommentare hinterlassen haben, vor der endgültigen Verteilung bereinigen +- Markierungen und Haftnotizen aus einem geteilten Lernleitfaden entfernen +- Link-Annotationen vor dem Archivieren aus einem Dokument entfernen +- Eine "saubere" Version eines Rechtsdokuments erstellen, das bei Verhandlungen stark annotiert wurde +- Prüferkommentare aus einem Manuskript entfernen, bevor es in den Druck geht + +## Tipps + +- Dieses Werkzeug entfernt Annotationen auf Ebene der PDF-Struktur. Das Ergebnis behält daher auswählbaren Text und die ursprüngliche Qualität, es findet kein Rastern statt. +- Wenn Sie nur bestimmte Annotationen statt aller entfernen wollen, löschen Sie sie einzeln im [PDF-Editor](./edit-pdf). +- Annotationen in reduzierten PDFs (bei denen Annotationen in den Seiteninhalt eingebunden wurden) lassen sich nicht entfernen, da sie keine eigenen Objekte mehr sind. + +## Verwandte Werkzeuge + +- [PDF-Editor](./edit-pdf) +- [Wasserzeichen hinzufügen](./add-watermark) +- [PDF unterschreiben](./sign-pdf) diff --git a/docs/de/tools/remove-blank-pages.md b/docs/de/tools/remove-blank-pages.md new file mode 100644 index 00000000..29ee7bb4 --- /dev/null +++ b/docs/de/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Leere Seiten entfernen +description: Erkennen Sie leere oder fast leere Seiten in Ihrer PDF automatisch und entfernen Sie sie, mit einstellbarer Empfindlichkeit. +--- + +# Leere Seiten entfernen + +Durchsuchen Sie Ihre PDF nach leeren oder fast leeren Seiten und entfernen Sie sie automatisch. Das Werkzeug rendert jede Seite und analysiert ihren Pixelinhalt, um zu bestimmen, ob sie leer ist. Vor der Verarbeitung können Sie bestätigen, welche Seiten entfernt werden. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Stellen Sie den Regler **Empfindlichkeit** ein, um festzulegen, wie streng "leer" definiert ist. +3. Klicken Sie auf **Leere Seiten erkennen**, um das Dokument zu durchsuchen. +4. Das Werkzeug zeigt Vorschaubilder der erkannten leeren Seiten zur Kontrolle. +5. Bestätigen Sie die Auswahl und laden Sie die bereinigte PDF ohne leere Seiten herunter. + +## Optionen + +- **Empfindlichkeit**: Ein Regler von 0 % bis 100 % (Standard 80 %). Höhere Werte sind strenger und markieren nur Seiten, die vollständig oder fast weiß sind. Niedrigere Werte sind toleranter und erfassen auch Seiten mit minimalem Inhalt wie einem einzelnen Punkt oder einem schwachen Wasserzeichen. + +## Funktionen + +- Pixelgenaue Analyse jeder Seite zur Erkennung leerer Inhalte +- Einstellbarer Empfindlichkeitsregler zur Feinabstimmung der Erkennung +- Seitenvorschau der erkannten leeren Seiten zur manuellen Kontrolle +- Erhält alle nicht leeren Seiten unverändert +- Verarbeitet Dokumente beliebiger Größe oder Seitenzahl +- Fortschrittsanzeige während des Durchsuchens + +## Anwendungsfälle + +- Gescannte Dokumente bereinigen, bei denen der Scanner die leeren Rückseiten einseitiger Originale erfasst hat +- Trennseiten aus stapelweise gescannten Dokumenten entfernen +- Leerseiten entfernen, die von Dokumentenmanagementsystemen eingefügt wurden +- PDFs bereinigen, die aus Textverarbeitungen exportiert wurden und manchmal leere Seiten am Ende enthalten +- Die Dateigröße verringern, indem unnötige leere Seiten entfernt werden + +## Tipps + +- Beginnen Sie mit der Standardempfindlichkeit von 80 % und passen Sie sie von dort an. Wenn das Werkzeug Seiten übersieht, die für Sie leer aussehen, senken Sie die Empfindlichkeit. Wenn es Seiten mit schwachem Inhalt markiert, den Sie behalten wollen, erhöhen Sie sie. +- Das Werkzeug rendert jede Seite, um den Inhalt zu analysieren. Die Verarbeitungszeit wächst daher mit der Seitenzahl. Bei sehr großen Dokumenten müssen Sie mit einer kurzen Wartezeit rechnen. +- Prüfen Sie die erkannten leeren Seiten in der Vorschau, bevor Sie das Entfernen bestätigen. Seiten mit schwachen Kopfzeilen, Fußzeilen oder Wasserzeichen können je nach Empfindlichkeit markiert werden. + +## Verwandte Werkzeuge + +- [PDF zuschneiden](./crop-pdf) +- [PDF-Editor](./edit-pdf) +- [Seitenzahlen](./page-numbers) diff --git a/docs/de/tools/remove-metadata.md b/docs/de/tools/remove-metadata.md new file mode 100644 index 00000000..f2e6c393 --- /dev/null +++ b/docs/de/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Metadaten entfernen +description: Entfernen Sie alle versteckten Metadaten aus PDF-Dateien, darunter Autor, Titel, Erstellungsdatum, Producer, XMP-Daten und Dokument-IDs. +--- + +# Metadaten entfernen + +Jede PDF enthält Metadaten, die verraten können, wer sie erstellt hat, welche Software verwendet wurde, wann sie zuletzt geändert wurde und mehr. Dieses Werkzeug entfernt alles davon: das Info-Dictionary, XMP-Metadatenströme, Dokument-IDs und anwendungsspezifische Daten. Zurück bleibt ein sauberes Dokument ohne Spur seiner Herkunft. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Klicken Sie auf **Metadaten entfernen**. +3. Laden Sie die bereinigte Datei herunter. + +Es gibt nichts zu konfigurieren. Das Werkzeug arbeitet bewusst gründlich: Es löscht alles. + +## Was entfernt wird + +- **Felder des Info-Dictionary**: Titel, Autor, Thema, Stichwörter, Ersteller, Producer, Erstellungsdatum, Änderungsdatum +- **XMP-Metadatenstrom**: Der XML-basierte Metadatenblock im Dokumentkatalog +- **Dokument-IDs**: Eindeutige Kennungen im PDF-Trailer, mit denen ein Dokument systemübergreifend verfolgt werden kann +- **PieceInfo**: Anwendungsspezifische Metadaten, die von Programmen wie Illustrator oder InDesign hinzugefügt werden + +## Was erhalten bleibt + +- Alle sichtbaren Seiteninhalte (Text, Bilder, Grafiken) +- Formularfelder und Annotationen +- Lesezeichen und Links +- Die Dokumentstruktur selbst + +## Anwendungsfälle + +- Ihren Namen und Ihre Organisation aus einem Dokument entfernen, bevor Sie es anonym veröffentlichen +- Erstellungszeitstempel entfernen, die verraten, wann ein Dokument vorbereitet wurde +- Producer-Angaben bereinigen, die Ihren PDF-Software-Stack verraten +- Dokumente für behördliche Einreichungen vorbereiten, die metadatenfreie PDFs verlangen +- Spuren des Bearbeitungsverlaufs entfernen, bevor Sie ein Dokument extern teilen + +## Tipps + +- Nutzen Sie zuerst das Werkzeug Metadaten anzeigen, um genau zu sehen, welche Metadaten Ihre PDF enthält, bevor Sie sie entfernen. +- Wenn Sie Metadaten _und_ JavaScript, Annotationen und eingebettete Dateien entfernen wollen, nutzen Sie PDF bereinigen für eine gründlichere Reinigung. +- Das Entfernen von Metadaten ist endgültig. Behalten Sie Ihr Original, falls Sie diese Daten später noch brauchen. + +## Verwandte Werkzeuge + +- [PDF bereinigen](./sanitize-pdf): Metadaten sowie Skripte, Anhänge und mehr entfernen +- [PDF verschlüsseln](./protect-pdf): die bereinigte PDF mit einem Passwort schützen +- [PDF komprimieren](./compress-pdf): Das Entfernen von Metadaten kann die Dateigröße leicht verringern, durch Komprimieren sparen Sie mehr diff --git a/docs/de/tools/remove-restrictions.md b/docs/de/tools/remove-restrictions.md new file mode 100644 index 00000000..d35f1e81 --- /dev/null +++ b/docs/de/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Beschränkungen entfernen +description: Entfernen Sie Passwortschutz, Druckbeschränkungen, Bearbeitungssperren und Kopierbeschränkungen aus PDF-Dateien. +--- + +# Beschränkungen entfernen + +PDFs können zwei Arten von Passwörtern enthalten: ein Benutzerpasswort (zum Öffnen der Datei nötig) und ein Besitzerpasswort (steuert, was Sie mit der Datei tun dürfen). Dieses Werkzeug entfernt beide samt aller zugehörigen Beschränkungen: Druck-, Bearbeitungs-, Kopier- und Annotationssperren. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Wenn die PDF ein Besitzerpasswort hat, geben Sie es im Feld **Besitzerpasswort** ein. Lassen Sie das Feld leer, wenn die PDF nur Nutzungsbeschränkungen ohne Passwort hat. +3. Klicken Sie auf **Beschränkungen entfernen**. +4. Laden Sie die unbeschränkte PDF herunter. + +Das Werkzeug nutzt die QPDF-Flags `--decrypt` und `--remove-restrictions`, um eine saubere, unbeschränkte Kopie zu erzeugen. + +## Was entfernt wird + +- Passwortschutz (Benutzer- und Besitzerpasswort) +- Druckbeschränkungen +- Bearbeitungsbeschränkungen +- Beschränkungen beim Kopieren von Text und Bildern +- Beschränkungen für Annotationen und Kommentare +- Alle anderen in der PDF kodierten Sicherheitsbeschränkungen + +## Anwendungsfälle + +- Eine PDF entsperren, die Ihnen gehört, deren Passwort Sie aber vor Jahren festgelegt haben +- Druckbeschränkungen aus einem Dokument entfernen, auf das Sie rechtmäßig Zugriff haben +- Kopieren und Einfügen in Referenzmaterial für Notizen ermöglichen +- PDFs für Barrierefreiheitswerkzeuge vorbereiten, die mit eingeschränkten Dokumenten nicht umgehen können + +## Tipps + +- Wenn ein Besitzerpasswort gesetzt ist, müssen Sie es kennen. Dieses Werkzeug knackt oder errät keine Passwörter. +- Wenn die Datei verschlüsselt bleiben soll und Sie nur bestimmte Berechtigungen ändern wollen, nutzen Sie stattdessen das Werkzeug Berechtigungen ändern. +- Die Ausgabedatei ist komplett unverschlüsselt: Jeder, der sie erhält, kann sie frei öffnen. + +## Verwandte Werkzeuge + +- [PDF entschlüsseln](./unlock-pdf): eine PDF entsperren, wenn Sie das Benutzerpasswort kennen +- [PDF verschlüsseln](./protect-pdf): die Verschlüsselung mit neuen Einstellungen erneut anwenden +- [Berechtigungen ändern](./change-permissions): gezielt ändern, welche Aktionen erlaubt sind diff --git a/docs/de/tools/repair-pdf.md b/docs/de/tools/repair-pdf.md new file mode 100644 index 00000000..5f2eac73 --- /dev/null +++ b/docs/de/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: PDF reparieren +description: Stellen Sie Daten aus beschädigten oder defekten PDF-Dateien mit der Reparatur-Engine von QPDF wieder her. Unterstützt Stapelverarbeitung. +--- + +# PDF reparieren + +Wenn sich eine PDF nicht öffnen lässt, verzerrte Inhalte zeigt oder in Ihrem Viewer Fehler auslöst, versucht dieses Werkzeug, ihre interne Struktur neu aufzubauen. Es nutzt die Reparatur-Engine von QPDF, die Daten aus vielen Arten von Beschädigungen wiederherstellen kann: defekte Querverweistabellen, abgeschnittene Streams, ungültige Objektverweise und mehr. + +## So funktioniert es + +1. Laden Sie eine oder mehrere beschädigte PDF-Dateien hoch. +2. Klicken Sie auf **PDF reparieren**. +3. Eine einzelne reparierte Datei wird direkt heruntergeladen. Bei mehreren Dateien entsteht ein ZIP-Archiv. + +Das Werkzeug schickt jede Datei mit dem Flag `--decrypt` durch QPDF. Dadurch muss QPDF die gesamte PDF-Struktur lesen und neu schreiben und behebt dabei behebbare Probleme. + +## Funktionen + +- Stapelreparatur mehrerer PDFs in einem Vorgang +- Automatische Erkennung von behebbaren und nicht behebbaren Dateien +- Erfolgs- und Fehlerbericht pro Datei bei der Verarbeitung mehrerer Dateien +- Nutzt QPDF (WebAssembly), eine bewährte Bibliothek zur PDF-Transformation + +## Was repariert werden kann + +- Defekte oder fehlende Querverweistabellen +- Abgeschnittene Dateienden durch unvollständige Downloads +- Ungültige Objektnummerierung und Stream-Längen +- Kleinere Strukturfehler fehlerhafter PDF-Generatoren +- Verschlüsselungsartefakte nach fehlgeschlagenen Entschlüsselungsversuchen + +## Was nicht repariert werden kann + +- Stark abgeschnittene Dateien, in denen der Großteil der Inhaltsdaten fehlt +- PDFs, die mit einem Passwort verschlüsselt sind, das Sie nicht haben +- Dateien, die in Wirklichkeit keine PDFs sind (falsche Dateiendung) +- Bildbeschädigungen innerhalb der PDF (die Struktur wird repariert, Pixeldaten werden aber nicht neu erzeugt) + +## Anwendungsfälle + +- Eine PDF nach einem fehlgeschlagenen E-Mail-Download wiederherstellen +- Dateien öffnen, die von älteren oder nicht standardkonformen PDF-Generatoren erzeugt wurden +- PDFs reparieren, die in einem Viewer funktionieren, in einem anderen aber nicht +- Beschädigte Archivdokumente für die Langzeitspeicherung vorbereiten + +## Tipps + +- Wenn die Reparatur fehlschlägt, öffnen Sie die Datei zuerst in einem Browser. Browser haben eine eigene Wiederherstellungslogik und zeigen eventuell genug Inhalt an, um die Datei erneut zu speichern. +- Bei verschlüsselten PDFs, deren Reparatur fehlschlägt, versuchen Sie zuerst PDF entschlüsseln und reparieren Sie dann die entschlüsselte Ausgabe. + +## Verwandte Werkzeuge + +- [PDF komprimieren](./compress-pdf): die Struktur der reparierten PDF weiter bereinigen +- [PDF linearisieren](./linearize-pdf): die reparierte Datei für die Auslieferung im Web optimieren +- [PDF reduzieren](./flatten-pdf): Formulare reduzieren, die möglicherweise beschädigt wurden diff --git a/docs/de/tools/reverse-pages.md b/docs/de/tools/reverse-pages.md new file mode 100644 index 00000000..eb6cb7e1 --- /dev/null +++ b/docs/de/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Seiten umkehren +description: Kehren Sie die Seitenreihenfolge einer oder mehrerer PDF-Dateien um, sodass die letzte Seite zur ersten wird. +--- + +# Seiten umkehren + +Kehren Sie die Seitenreihenfolge einer PDF um, sodass die letzte Seite zur ersten wird, die vorletzte zur zweiten und so weiter. Unterstützt die Stapelverarbeitung mehrerer Dateien gleichzeitig. + +## So funktioniert es + +1. Laden Sie eine oder mehrere PDF-Dateien hoch. +2. Klicken Sie auf die Schaltfläche zum Verarbeiten. +3. Jede Datei wird unabhängig umgekehrt. Wenn Sie mehrere Dateien hochgeladen haben, ist die Ausgabe ein ZIP-Archiv mit allen umgekehrten PDFs. +4. Eine einzelne Datei wird direkt als umgekehrte PDF heruntergeladen. + +## Funktionen + +- Stapelverarbeitung: mehrere PDFs in einem Vorgang umkehren +- Einzeldatei-Ausgabe bei einer PDF, ZIP-Ausgabe bei mehreren +- Schaltflächen zum Entfernen einzelner Dateien vor der Verarbeitung +- Erhält alle Seiteninhalte und die Formatierung + +## Anwendungsfälle + +- Ein Dokument korrigieren, das in umgekehrter Reihenfolge gescannt wurde +- Eine Präsentations-PDF so vorbereiten, dass sie von hinten nach vorn gelesen wird +- Die Seitenreihenfolge für bestimmte Druckabläufe umkehren, die Seiten rückwärts einziehen +- Ein Dokument korrigieren, dessen Seiten versehentlich verkehrt herum zusammengestellt wurden + +## Tipps + +- Jede Datei in einem Stapel wird unabhängig umgekehrt. Die Dateien selbst werden untereinander nicht neu angeordnet. +- Für eine feinere Neuordnung der Seiten (nicht nur eine vollständige Umkehrung) nutze [Duplizieren & Organisieren](./organize-pdf). + +## Verwandte Werkzeuge + +- [Duplizieren & Organisieren](./organize-pdf) +- [PDF drehen](./rotate-pdf) +- [PDF-Multitool](./pdf-multi-tool) diff --git a/docs/de/tools/rotate-custom.md b/docs/de/tools/rotate-custom.md new file mode 100644 index 00000000..9a765d2d --- /dev/null +++ b/docs/de/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Um benutzerdefinierte Grad drehen +description: Drehen Sie PDF-Seiten um einen beliebigen Winkel, mit Gradeingabe pro Seite und Stapeldrehung. +--- + +# Um benutzerdefinierte Grad drehen + +Drehen Sie PDF-Seiten um einen beliebigen Winkel, nicht nur in 90-Grad-Schritten. Jede Seite hat ein eigenes Winkelfeld, und mit der Stapelsteuerung können Sie einen einzelnen Winkel auf alle Seiten gleichzeitig anwenden. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Für jede Seite werden Vorschaubilder erzeugt. +2. Jede Seite hat ein numerisches Eingabefeld mit ihrem aktuellen Drehwinkel. +3. Geben Sie einen beliebigen Gradwert (positiv oder negativ) ein, um eine bestimmte Seite zu drehen, oder nutzen Sie die Links-/Rechts-Schaltflächen pro Seite für schnelle 90-Grad-Anpassungen. +4. Nutzen Sie das Feld **Stapelwinkel** oben, um eine einheitliche Drehung für alle Seiten festzulegen. +5. Klicken Sie auf die Schaltfläche zum Verarbeiten, um die gedrehte PDF zu erzeugen. + +## Funktionen + +- Freie Gradeingabe pro Seite (beliebiger ganzzahliger Wert) +- Stapelwinkel, um dieselbe Drehung auf jede Seite anzuwenden +- Echtzeit-Vorschau der Drehung in den Vorschaubildern +- Schnelldreh-Schaltflächen pro Seite für 90-Grad-Schritte +- Vorschaubilder werden bei Bedarf geladen, für gute Leistung bei großen Dokumenten + +## Anwendungsfälle + +- Leicht schiefe Scans um wenige Grad korrigieren +- Seiten drehen, um eine nicht standardmäßige Ausrichtung zu erfüllen +- Einzelne Seiten in einem Dokument mit gemischten Inhalten präzise drehen +- Seitenwinkel nach einer ersten Stapeldrehung feinjustieren + +## Tipps + +- Positive Werte drehen im Uhrzeigersinn, negative gegen den Uhrzeigersinn. +- Das Feld Stapelwinkel überschreibt beim Anwenden alle Winkel der einzelnen Seiten. Nimm einzelne Anpassungen bei Bedarf nach dem Stapelvorgang vor. +- Für Standarddrehungen um 90/180/270 Grad mit einfacherer Oberfläche nutze [PDF drehen](./rotate-pdf). + +## Verwandte Werkzeuge + +- [PDF drehen](./rotate-pdf) +- [PDF-Multitool](./pdf-multi-tool) +- [Duplizieren & Organisieren](./organize-pdf) diff --git a/docs/de/tools/rotate-pdf.md b/docs/de/tools/rotate-pdf.md new file mode 100644 index 00000000..53553742 --- /dev/null +++ b/docs/de/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: PDF drehen +description: Drehen Sie einzelne oder alle Seiten einer PDF in 90-Grad-Schritten mit einer visuellen Vorschaubild-Oberfläche. +--- + +# PDF drehen + +Drehen Sie Seiten einer PDF um 90 Grad im oder gegen den Uhrzeigersinn. Das Werkzeug zeigt Vorschaubilder jeder Seite, sodass Sie sie einzeln drehen oder eine Stapeldrehung auf das gesamte Dokument anwenden können. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. Die Vorschaubilder aller Seiten werden in einem Raster dargestellt. +2. Nutzen Sie die Dreh-Schaltflächen links/rechts unter jedem Vorschaubild, um genau diese Seite zu drehen. +3. Nutzen Sie die Stapeldrehung oben, um alle Seiten auf einmal zu drehen. +4. Die Vorschaubilder werden in Echtzeit aktualisiert und zeigen die Drehung. +5. Klicken Sie auf die Schaltfläche zum Verarbeiten, um die gedrehte PDF zu speichern. + +## Funktionen + +- Drehung pro Seite in 90-Grad-Schritten (links oder rechts) +- Stapeldrehung für alle Seiten gleichzeitig +- Echtzeit-Vorschau mit animierten Drehübergängen +- Vorschaubilder werden bei Bedarf geladen, für flüssige Leistung bei großen Dokumenten +- Erhält Seiteninhalt und Qualität des Originals + +## Anwendungsfälle + +- Seitlich oder auf dem Kopf gescannte Seiten korrigieren +- Querformatseiten ins Hochformat drehen (oder umgekehrt) +- Ein Dokument mit gemischter Ausrichtung korrigieren, in dem manche Seiten im falschen Winkel gescannt wurden +- Ein Dokument für eine bestimmte Anzeigeausrichtung vorbereiten + +## Tipps + +- Drehungen summieren sich. Zweimal auf die Schaltfläche im Uhrzeigersinn zu klicken ergibt eine Drehung um 180 Grad. +- Für Drehungen, die keine Vielfachen von 90 Grad sind (z. B. 45 Grad, um einen leicht schiefen Scan zu korrigieren), nutzen Sie stattdessen [Um benutzerdefinierte Grad drehen](./rotate-custom). +- Die Stapeldrehung betrifft alle Seiten, nicht nur ausgewählte. In diesem Werkzeug gibt es keine Auswahl. Dafür nutze das [PDF-Multitool](./pdf-multi-tool). + +## Verwandte Werkzeuge + +- [Um benutzerdefinierte Grad drehen](./rotate-custom) +- [PDF-Multitool](./pdf-multi-tool) +- [Duplizieren & Organisieren](./organize-pdf) diff --git a/docs/de/tools/rtf-to-pdf.md b/docs/de/tools/rtf-to-pdf.md new file mode 100644 index 00000000..cac43a48 --- /dev/null +++ b/docs/de/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF zu PDF +description: Wandeln Sie Rich-Text-Format-Dateien (RTF) in Ihrem Browser mit einer LibreOffice-basierten Engine in PDF um. +--- + +# RTF zu PDF + +Wandeln Sie Rich-Text-Format-Dokumente in PDF um. RTF ist ein plattformübergreifendes Dokumentformat, das von praktisch jeder Textverarbeitung unterstützt wird. Dieses Werkzeug nutzt eine browserbasierte LibreOffice-Engine, um RTF-Dateien mit erhaltener Formatierung darzustellen: Fett, Kursiv, Tabellen und eingebettete Bilder werden in die PDF übernommen. + +## Unterstützte Formate + +| Format | Endungen | MIME-Typen | +| :----- | :------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie eine oder mehrere RTF-Dateien per Drag & Drop hinein. +2. Prüfen Sie die Dateiliste. Fügen Sie weitere Dateien hinzu oder entfernen Sie welche. +3. Klicken Sie auf **In PDF umwandeln**. Die LibreOffice-Engine wird bei der ersten Nutzung initialisiert und verarbeitet dann jede Datei. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden als `rtf-converted.zip` geliefert. + +## Optionen + +Dieses Werkzeug hat keine zusätzlichen Einstellungen. Die Umwandlung erhält die ursprüngliche RTF-Formatierung. + +## Ausgabe + +| Anzahl der Eingaben | Ausgabe | +| :------------------ | :------------------------------------------------------- | +| 1 Datei | Einzelner PDF-Download (z. B. `letter.pdf`) | +| 2+ Dateien | ZIP-Archiv (`rtf-converted.zip`) mit einer PDF pro Datei | + +## Anwendungsfälle + +- Ältere RTF-Dokumente aus früheren Textverarbeitungen in moderne PDFs umwandeln +- RTF-E-Mail-Vorlagen in PDF-Vorschauen verwandeln +- RTF-Ausgaben aus juristischen oder medizinischen Softwaresystemen verarbeiten +- RTF-Dateien aus einem Dokumentenmanagementsystem stapelweise zur Archivierung in PDF umwandeln + +## Tipps + +- Die LibreOffice-Engine wird einmal geladen und zwischengespeichert. Die erste Umwandlung in einer Sitzung dauert ein paar Sekunden länger, weitere gehen schneller. +- RTF-Dateien mit eingebetteten OLE-Objekten werden möglicherweise nicht alle Objekte perfekt darstellen. Reiner Text, Bilder und Standardformatierung werden zuverlässig umgewandelt. +- Wenn Ihre RTF-Dateien mit Microsoft Word erstellt wurden, können Sie sie auch direkt mit dem Werkzeug [Word zu PDF](./word-to-pdf) umwandeln, das neben DOC und DOCX auch RTF akzeptiert. + +## Verwandte Werkzeuge + +- [Word zu PDF](./word-to-pdf) +- [ODT zu PDF](./odt-to-pdf) +- [Text zu PDF](./txt-to-pdf) diff --git a/docs/de/tools/sanitize-pdf.md b/docs/de/tools/sanitize-pdf.md new file mode 100644 index 00000000..2bb29a6f --- /dev/null +++ b/docs/de/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF bereinigen +description: Entfernen Sie versteckte und potenziell gefährliche Inhalte aus PDFs, darunter Metadaten, JavaScript, eingebettete Dateien, Annotationen und Ebenen. +--- + +# PDF bereinigen + +PDFs können weit mehr enthalten, als Sie auf dem Bildschirm sehen. Versteckte Metadaten, eingebettetes JavaScript, Dateianhänge, Formulardaten und Ebeneninformationen können sensible Daten preisgeben oder Sicherheitsrisiken darstellen. Beim Bereinigen wird all das entfernt, und Sie erhalten ein sauberes Dokument, das Sie bedenkenlos öffentlich teilen können. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Wählen Sie in der Checkliste aus, welche Elemente entfernt werden sollen. +3. Klicken Sie auf **PDF bereinigen**. +4. Laden Sie die bereinigte Datei herunter. + +## Bereinigungsoptionen + +Alle Optionen sind standardmäßig aktiviert. Deaktivieren Sie diejenigen, die Sie behalten wollen. + +| Option | Was entfernt wird | +| ---------------------------------- | ----------------------------------------------------------------------------- | +| **Formulare reduzieren** | Wandelt interaktive Formularfelder in statische Inhalte um | +| **Metadaten entfernen** | Entfernt Autor, Titel, Erstellungsdatum, Softwareinfos und XMP-Daten | +| **Annotationen entfernen** | Löscht Kommentare, Markierungen, Haftnotizen und Auszeichnungen | +| **JavaScript entfernen** | Entfernt eingebettete Skripte, die beim Öffnen ausgeführt werden könnten | +| **Eingebettete Dateien entfernen** | Entfernt in die PDF eingebettete Dateianhänge | +| **Ebenen entfernen (OCG)** | Reduziert optionale Inhaltsgruppen auf eine einzige Ebene | +| **Links entfernen** | Entfernt Hyperlinks und URL-Verweise | +| **Strukturbaum entfernen** | Entfernt die Dokumentstruktur, die für Tags zur Barrierefreiheit genutzt wird | +| **MarkInfo entfernen** | Entfernt Informationen zu markierten Inhalten | +| **Schriftarten entfernen** | Entfernt eingebettete Schriftdaten (mit Vorsicht verwenden) | + +## Anwendungsfälle + +- Eine PDF für die Veröffentlichung vorbereiten, indem interne Metadaten (Autorennamen, Softwareversionen, Bearbeitungsverlauf) entfernt werden +- JavaScript aus einer PDF aus unbekannter Quelle entfernen, bevor Sie sie öffnen +- Eine PDF bereinigen, bevor Sie sie an einen Kunden senden, der eingebettete Kommentare oder Formularfeldnamen nicht sehen soll +- Versteckte Ebenen aus einer Architekturzeichnung entfernen, bevor Sie die endgültige Version teilen +- Anforderungen der Datenminimierung nach Datenschutzvorschriften erfüllen + +## Tipps + +- Lassen Sie "Schriftarten entfernen" deaktiviert, sofern Sie nicht sicher sind, dass die PDF danach noch korrekt dargestellt wird. Das Entfernen von Schriften kann Text in manchen Viewern unsichtbar machen. +- Wenn Sie nur Metadaten entfernen wollen, ist das spezielle Werkzeug Metadaten entfernen schneller und gezielter. +- Das Bereinigen ist nicht umkehrbar. Behalten Sie Ihre Originaldatei. + +## Verwandte Werkzeuge + +- [Metadaten entfernen](./remove-metadata): nur Metadaten entfernen, ohne andere Inhalte anzutasten +- [PDF reduzieren](./flatten-pdf): gezielt Formulare und Annotationen reduzieren +- [PDF verschlüsseln](./protect-pdf): nach dem Bereinigen einen Passwortschutz hinzufügen +- [PDF rastern](./rasterize-pdf): die radikale Lösung, die PDF in Bilder umwandeln, um alle versteckten Inhalte zu beseitigen diff --git a/docs/de/tools/scanner-effect.md b/docs/de/tools/scanner-effect.md new file mode 100644 index 00000000..ba8da0f9 --- /dev/null +++ b/docs/de/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Scanner-Effekt +description: Lassen Sie Ihre PDF wie ein gescanntes Dokument aussehen, mit einstellbarem Rauschen, Drehung, Unschärfe und Papieralterung. +--- + +# Scanner-Effekt + +Verwandle eine saubere digitale PDF in etwas, das aussieht, als käme es aus einem Flachbettscanner. Das Werkzeug wendet einstellbares Rauschen, leichte Drehung, Unschärfe, Helligkeitsverschiebungen und optional eine Vergilbung an, um die Unvollkommenheiten eines physischen Scans zu simulieren. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Der Editor öffnet sich mit einer Live-Vorschau der ersten Seite neben einem Einstellungsbereich. +3. Passen Sie die Parameter des Scan-Effekts mit den Reglern und Schaltern an. +4. Die Vorschau wird in Echtzeit aktualisiert, während Sie die Einstellungen ändern. +5. Klicken Sie auf **Anwenden**, um alle Seiten zu verarbeiten und das Ergebnis herunterzuladen. + +## Optionen + +- **Farbraum (Graustufen-Schalter)**: Wandelt die Ausgabe in Graustufen um, für den klassischen Schwarzweiß-Scan-Look. +- **Rand**: Fügt einen dezenten dunklen Rand um die Seitenkanten hinzu, um Randartefakte von Scannern nachzuahmen. +- **Drehen**: Wendet eine leichte Drehung (-5 bis +5 Grad) an, um schief eingezogenes Papier zu simulieren. +- **Drehvarianz**: Fügt dem Drehwinkel zufällige Abweichungen hinzu, sodass jede Seite etwas anders gekippt ist. +- **Helligkeit**: Verschiebt die Gesamthelligkeit nach oben oder unten. +- **Kontrast**: Passt den Kontrast an, um Schwankungen der Tonerqualität zu simulieren. +- **Unschärfe**: Wendet einen Gaußschen Weichzeichner an, um Textkanten wie bei einem Scan niedriger Qualität zu erweichen. +- **Rauschen**: Fügt zufälliges Pixelrauschen hinzu, um das Korn des Scannersensors zu simulieren. Höhere Werte ergeben ein körnigeres Ergebnis. +- **Gelbstich**: Fügt einen warmen Gelbton hinzu, um gealtertes oder recyceltes Papier zu simulieren. +- **Auflösung**: Legt die Ausgabe-DPI fest. Niedrigere Werte erzeugen ein pixeligeres, scanartigeres Aussehen. +- **Zurücksetzen**: Stellt alle Einstellungen auf die Standardwerte zurück. + +## Funktionen + +- Echtzeit-Vorschau, die sich bei jeder Parameteränderung aktualisiert +- Zufällige Drehabweichung pro Seite für realistische Variation +- Zehn unabhängig einstellbare Parameter +- Graustufenmodus für authentische Schwarzweiß-Scans +- Auflösungssteuerung von Fax-Qualität mit niedriger DPI bis zu Archivqualität mit hoher DPI + +## Anwendungsfälle + +- Digital erstellte Dokumente so aussehen lassen, als wären sie gedruckt und gescannt worden +- Die Alterung physischer Dokumente für die Nachbildung historischer Dokumente simulieren +- OCR-Software mit verschlechterter Scanqualität testen +- Dokumente erzeugen, die dem visuellen Stil vorhandener gescannter Archive entsprechen + +## Tipps + +- Beginnen Sie mit dezenten Werten. Ein Rauschwert von 10-20, eine leichte Drehung von 0,5 Grad und minimale Unschärfe ergeben bereits einen überzeugenden Scan-Look. +- Kombinieren Sie den Graustufenmodus mit leichter Vergilbung für einen Effekt wie eine "Kopie von einer Kopie". +- Niedrigere Auflösungen (100-150 DPI) erzeugen das realistischste Faxgerät-Aussehen. + +## Verwandte Werkzeuge + +- [Farben invertieren](./invert-colors) +- [Farben anpassen](./adjust-colors) +- [Hintergrundfarbe](./background-color) diff --git a/docs/de/tools/sign-pdf.md b/docs/de/tools/sign-pdf.md new file mode 100644 index 00000000..1d8501f6 --- /dev/null +++ b/docs/de/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF unterschreiben +description: Zeichne, tippen Sie oder laden Sie eine Unterschrift hoch und platzieren Sie sie mit einem integrierten Viewer auf Ihren PDF-Seiten. +--- + +# PDF unterschreiben + +Fügen Sie Ihre Unterschrift zu einem beliebigen PDF-Dokument hinzu. Das Werkzeug bettet einen vollständigen PDF-Viewer mit integrierten Signaturwerkzeugen ein, mit denen Sie eine Unterschrift freihändig zeichnen, Ihren Namen in einer Schreibschrift tippen oder ein Unterschriftsbild hochladen können. Platzieren Sie und skalieren Sie Unterschriften auf jeder Seite und speichern Sie dann das unterschriebene Dokument. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Das Dokument öffnet sich in einem integrierten PDF-Viewer mit Annotationswerkzeugen. +3. Erstellen Sie mit dem Signaturwerkzeug des Viewers Ihre Unterschrift durch Zeichnen, Tippen oder Hochladen eines Bildes. +4. Klicken Sie auf die Stelle der Seite, an der die Unterschrift stehen soll, und passen Sie Größe und Position an. +5. Aktivieren Sie optional **PDF reduzieren**, um die Unterschrift dauerhaft in das Dokument einzubetten. +6. Klicken Sie auf **Speichern & unterschriebene PDF herunterladen**, um Ihre unterschriebene Datei zu erhalten. + +## Optionen + +- **PDF reduzieren**: Wenn aktiviert, wird die Unterschrift dauerhaft in den Seiteninhalt eingebettet. So kann sie von anderen nicht verschoben oder gelöscht werden. Wenn deaktiviert, bleibt die Unterschrift eine Annotation, die in kompatiblen Viewern bearbeitet werden kann. + +## Funktionen + +- Drei Methoden zur Unterschriftserstellung: freihändiges Zeichnen, getippter Text oder hochgeladenes Bild +- Integrierter PDF-Viewer für genaues Platzieren +- Unterschriften auf jeder Seite per Ziehen positionieren und skalieren +- Optionales Reduzieren, um Unterschriften dauerhaft einzubetten +- Unterstützung mehrerer Unterschriften im selben Dokument + +## Anwendungsfälle + +- Verträge, Vereinbarungen oder Genehmigungsformulare unterschreiben, bevor Sie sie zurücksenden +- Ihre Unterschrift unter Steuerunterlagen, Versicherungsansprüche oder Behördenformulare setzen +- Paraphen auf einzelne Seiten einer mehrseitigen Vereinbarung setzen +- NDAs oder Personaldokumente unterschreiben, die als PDF-Anhang eintreffen + +## Tipps + +- Aktivieren Sie das Reduzieren, wenn Sie die unterschriebene PDF an jemanden senden, der Ihre Unterschrift nicht entfernen oder verschieben können soll. +- Für rechtsverbindliche digitale Signaturen mit zertifikatsbasierter Überprüfung bietet BentoPDF außerdem ein separates Werkzeug für digitale Signaturen. +- Laden Sie ein PNG-Unterschriftsbild mit transparentem Hintergrund hoch, um das sauberste Ergebnis zu erhalten. + +## Verwandte Werkzeuge + +- [PDF-Editor](./edit-pdf) +- [Stempel hinzufügen](./add-stamps) +- [PDF-Formular ausfüllen](./form-filler) diff --git a/docs/de/tools/split-pdf.md b/docs/de/tools/split-pdf.md new file mode 100644 index 00000000..3de7862c --- /dev/null +++ b/docs/de/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: PDF teilen +description: Teilen Sie eine PDF in kleinere Dateien nach Seitenbereich, visueller Auswahl, Lesezeichen, geraden/ungeraden Seiten oder festen Intervallen. +--- + +# PDF teilen + +Zerlege eine PDF mit einem von sechs Teilungsmodi in kleinere Dokumente. Von einfachen Seitenbereichen bis zur Teilung nach Lesezeichen deckt dieses Werkzeug jedes Szenario zum Aufteilen eines Dokuments ab. + +## So funktioniert es + +1. Laden Sie eine einzelne PDF-Datei hoch. +2. Wählen Sie im Dropdown einen Teilungsmodus. +3. Konfigurieren Sie die modusspezifischen Optionen (Seitenbereiche, Auswahlen usw.). +4. Klicken Sie auf die Schaltfläche zum Verarbeiten. +5. Das Ergebnis wird je nach Modus und Einstellungen als einzelne PDF oder als ZIP-Archiv heruntergeladen. + +## Teilungsmodi + +| Modus | Beschreibung | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Bereich** | Gib Seitenbereiche wie `1-3, 5, 8-10` ein. Mehrere Bereiche ergeben getrennte PDFs in einem ZIP. Ein einzelner Bereich ergibt eine PDF. | +| **Visuelle Auswahl** | Blättern Sie durch Seitenvorschauen und klicken Sie, um die gewünschten Seiten auszuwählen. Ausgewählte Seiten werden in eine neue PDF extrahiert. | +| **Gerade / Ungerade** | Extrahiere nur gerade oder nur ungerade Seiten. | +| **Alle Seiten** | Teile jede Seite in eine eigene PDF-Datei auf, die als ZIP heruntergeladen wird. | +| **Lesezeichen** | Teile an Lesezeichengrenzen. Wählen Sie die Lesezeichenebene, um zu steuern, wo geteilt wird. | +| **Alle N Seiten** | Teile in Abschnitte von je N Seiten (z. B. alle 5 Seiten). Der letzte Abschnitt kann weniger Seiten haben. | + +## Funktionen + +- Sechs verschiedene Teilungsmodi, die praktisch jeden Anwendungsfall abdecken +- Visuelle Seitenauswahl mit bei Bedarf geladenen Vorschaubildern +- Teilung nach Lesezeichen mit Ebenenfilter +- ZIP-Ausgabe als Option für die Modi Bereich und Visuell +- Verarbeitet Seitenbereiche mit gemischter Syntax (`1-3, 5, 8-10`) +- Warnung, wenn die Teilung nach N Seiten ungleich große Abschnitte ergibt + +## Anwendungsfälle + +- Ein bestimmtes Kapitel oder einen Abschnitt aus einem großen Dokument extrahieren +- Ungerade und gerade Seiten für Abläufe beim doppelseitigen Drucken trennen +- Ein Buch als PDF an den Lesezeichengrenzen in einzelne Kapiteldateien zerlegen +- Bestimmte Seiten (wie die Unterschriftsseite) aus einem Vertrag herauslösen +- Einen zusammengestellten Bericht für die Verteilung in Dateien pro Abschnitt teilen + +## Tipps + +- Mehrere durch Kommas getrennte Seitenbereiche (z. B. `1-5, 10-15, 20-25`) ergeben getrennte PDFs, eine pro Bereich, gebündelt in einem ZIP. +- Der Modus Lesezeichen setzt voraus, dass die PDF tatsächlich Lesezeichen enthält. Werden keine gefunden, erhalten Sie eine Fehlermeldung. +- Mit dem Kontrollkästchen "Als ZIP herunterladen" in den Modi Bereich und Visuell erhalten Sie einzelne PDFs pro Seite statt einer kombinierten Datei. + +## Verwandte Werkzeuge + +- [PDF zusammenführen](./merge-pdf) +- [Seiten extrahieren](./extract-pages) +- [Seiten löschen](./delete-pages) +- [PDF-Multitool](./pdf-multi-tool) diff --git a/docs/de/tools/svg-to-pdf.md b/docs/de/tools/svg-to-pdf.md new file mode 100644 index 00000000..4f2f2d4f --- /dev/null +++ b/docs/de/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG zu PDF +description: Wandeln Sie SVG-Vektorgrafiken mit Qualitätssteuerung vollständig in Ihrem Browser in PDF um. +--- + +# SVG zu PDF + +Wandeln Sie Scalable-Vector-Graphics-Dateien (SVG) in PDF um. Das Werkzeug rastert jede SVG über die Rendering-Engine des Browsers und bettet das Ergebnis in seiner Originalauflösung ein. Praktisch, um Vektorsymbole, Diagramme und Illustrationen in portable Dokumente zu verwandeln. + +## Unterstützte Formate + +| Format | Endungen | +| :----- | :------- | +| SVG | `.svg` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie eine oder mehrere SVG-Dateien per Drag & Drop hinein. +2. Prüfen und verwalten Sie die Dateiliste. +3. Wählen Sie eine **PDF-Qualität**. +4. Klicken Sie auf **In PDF umwandeln**. Das Ergebnis wird als `from_svgs.pdf` heruntergeladen. + +Jede SVG wird als Text gelesen, mit ihrer eigenen Breite und Höhe auf eine Canvas gerendert (Standard 800x600, wenn keine Maße angegeben sind) und als PNG exportiert. Dieses PNG wird dann mit pdf-lib in die PDF eingebettet. Transparente Bereiche werden mit weißem Hintergrund gefüllt. + +## Optionen + +**PDF-Qualität** steuert die Komprimierung nach dem Rastern: + +- **Hohe Qualität**: am nächsten an der ursprünglichen Darstellung. +- **Mittlere Qualität** (Standard): gute Balance. +- **Niedrige Qualität**: kleinste Datei, etwas Detailverlust. + +## Anwendungsfälle + +- Architektur- oder Konstruktionsdiagramme von SVG in eine druckfertige PDF umwandeln +- Symbolsammlungen für ein Design-System in einer Referenz-PDF bündeln +- Datenvisualisierungen (D3.js, Exporte von Diagrammbibliotheken) in berichtsfertige PDFs verwandeln +- Druckbare Versionen SVG-basierter Infografiken erstellen + +## Tipps + +- SVG-Dateien ohne explizite Attribute `width` und `height` werden mit 800x600 Pixeln gerendert. Legen Sie für beste Ergebnisse die Maße im SVG-Quelltext fest, bevor Sie umwandeln. +- Komplexe SVGs mit externen Schriftverweisen oder verknüpften Bildern werden möglicherweise nicht perfekt dargestellt. Binden Sie für zuverlässige Ausgabe alle Ressourcen direkt in die SVG ein. +- Da die SVG gerastert wird, enthält die PDF ein Bitmap-Bild statt Vektorpfaden. Für echte Vektor-PDF-Ausgabe ist ein spezielles Vektorwerkzeug nötig. + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [PNG zu PDF](./png-to-pdf) +- [BMP zu PDF](./bmp-to-pdf) diff --git a/docs/de/tools/table-of-contents.md b/docs/de/tools/table-of-contents.md new file mode 100644 index 00000000..6ca5bb92 --- /dev/null +++ b/docs/de/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Inhaltsverzeichnis +description: Erzeugen Sie aus den vorhandenen Lesezeichen Ihrer PDF eine formatierte Inhaltsverzeichnisseite. +--- + +# Inhaltsverzeichnis + +Dieses Werkzeug liest die Lesezeichen (Gliederungen) Ihrer PDF und erzeugt eine formatierte Inhaltsverzeichnisseite, die dem Dokument vorangestellt wird. Wenn Ihre PDF bereits Lesezeichen hat, aber keine sichtbare Inhaltsverzeichnisseite, erstellt dieses Werkzeug automatisch eine. + +## So funktioniert es + +1. Laden Sie eine PDF mit Lesezeichen hoch. +2. Passen Sie Titel, Schriftgröße und Schriftfamilie des Inhaltsverzeichnisses an. +3. Aktivieren Sie optional **Lesezeichen für Inhaltsverzeichnisseite hinzufügen**, um das Inhaltsverzeichnis selbst in den Lesezeichenbaum aufzunehmen. +4. Klicken Sie auf **Inhaltsverzeichnis erstellen**, um die Datei zu verarbeiten. +5. Die aktualisierte PDF wird automatisch heruntergeladen, die Inhaltsverzeichnisseite steht am Anfang. + +## Optionen + +- **Titel des Inhaltsverzeichnisses**: Die Überschrift oben auf der erzeugten Seite. Standard ist "Inhaltsverzeichnis". +- **Schriftgröße**: Wählen Sie von 10 pt bis 72 pt. Standard ist 12 pt. +- **Schriftfamilie**: Wählen Sie aus den Varianten Times Roman, Helvetica oder Courier (normal, fett, kursiv, fett kursiv). Standard ist Helvetica. +- **Lesezeichen für Inhaltsverzeichnisseite hinzufügen**: Wenn aktiviert, wird dem Gliederungsbaum der PDF ein Lesezeichen für die Inhaltsverzeichnisseite selbst hinzugefügt. + +## Funktionen + +- Liest die gesamte Lesezeichenhierarchie aus der PDF +- Erzeugt eine sauber formatierte Inhaltsverzeichnisseite mit Seitenzahlverweisen +- Unterstützt verschachtelte Lesezeichenebenen mit Einrückung +- Auswahl aus 12 integrierten PDF-Schriften +- Optionales selbstverweisendes Lesezeichen für die Inhaltsverzeichnisseite + +## Anwendungsfälle + +- Ein druckbares Inhaltsverzeichnis zu E-Books oder Berichten hinzufügen, die nur digitale Lesezeichen haben +- Ein Inhaltsverzeichnis für ein Dokument erstellen, das aus mehreren PDFs zusammengeführt wurde +- Eine Übersichtsseite für lange technische Handbücher erzeugen +- Dokumente für den Druck vorbereiten, bei denen ein sichtbares Inhaltsverzeichnis erwartet wird + +## Tipps + +- Wenn Ihre PDF keine Lesezeichen hat, erstellen Sie sie zuerst mit dem Werkzeug [Lesezeichen bearbeiten](./bookmark) und kommen Sie dann hierher zurück, um das Inhaltsverzeichnis zu erzeugen. +- Bei großen Dokumenten verbessert eine größere Schrift wie 14 pt oder 16 pt die Lesbarkeit. + +## Verwandte Werkzeuge + +- [Lesezeichen bearbeiten](./bookmark) +- [Seitenzahlen](./page-numbers) +- [Kopf- & Fußzeile](./header-footer) diff --git a/docs/de/tools/text-color.md b/docs/de/tools/text-color.md new file mode 100644 index 00000000..65e7cd58 --- /dev/null +++ b/docs/de/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Textfarbe ändern +description: Ändern Sie die Farbe des gesamten Textes in Ihrer PDF in eine beliebige Farbe Ihrer Wahl. +--- + +# Textfarbe ändern + +Ersetze die Farbe des Textes in Ihrer gesamten PDF. Das Werkzeug erkennt Textbereiche auf jeder Seite und färbt sie in Ihre gewählte Farbe um, während Layout und Inhalte, die kein Text sind, erhalten bleiben. + +## So funktioniert es + +1. Laden Sie Ihre PDF-Datei hoch. +2. Wählen Sie mit der Farbauswahl eine neue Textfarbe. Standard ist Blau (#0000FF). +3. Klicken Sie auf **Textfarbe ändern**, um die Verarbeitung zu starten. +4. Die umgefärbte PDF wird automatisch heruntergeladen. Eine Fortschrittsanzeige zeigt, welche Seite gerade verarbeitet wird. + +## Optionen + +- **Neue Textfarbe**: Eine Farbauswahl für die Ersatzfarbe des gesamten Textes im Dokument. + +## Funktionen + +- Färbt den Text auf jeder Seite des Dokuments um +- Verarbeitung seitenweise mit Fortschrittsanzeige +- Farbauswahl mit voller Unterstützung von Hex-Farbwerten +- Erhält Seitenlayout und Elemente, die kein Text sind + +## Anwendungsfälle + +- Schwarzen Text in dunkles Blau ändern, für ein weicheres, moderneres Dokumentbild +- Text vor der Verteilung von Dokumenten an Markenrichtlinien anpassen +- Text für die Barrierefreiheit in eine bestimmte Farbe umwandeln +- Text vor einer neu angewendeten Hintergrundfarbe sichtbar machen + +## Tipps + +- Dieses Werkzeug rendert Seiten für die Qualität in doppelter Größe und baut die PDF dann neu auf. Die Ausgabe ist bildbasiert, der Text ist danach nicht mehr auswählbar oder durchsuchbar. +- Wenn Sie auswählbaren Text behalten müssen, bearbeiten Sie die PDF stattdessen direkt mit dem [PDF-Editor](./edit-pdf). +- Die Verarbeitungszeit steigt mit der Seitenzahl, da jede Seite einzeln gerendert wird. + +## Verwandte Werkzeuge + +- [Hintergrundfarbe](./background-color) +- [Farben invertieren](./invert-colors) +- [Farben anpassen](./adjust-colors) diff --git a/docs/de/tools/tiff-to-pdf.md b/docs/de/tools/tiff-to-pdf.md new file mode 100644 index 00000000..7961657e --- /dev/null +++ b/docs/de/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF zu PDF +description: Wandeln Sie einseitige und mehrseitige TIFF-Bilder in Ihrem Browser mit voller Seitenunterstützung in PDF um. +--- + +# TIFF zu PDF + +Wandeln Sie TIFF-Dateien in PDF um, auch mehrseitige TIFFs. Jede Seite (oder "IFD") einer TIFF-Datei wird zu einer eigenen Seite in der Ausgabe-PDF. Das ist besonders nützlich für gescannte Dokumente, Faxe und medizinische Bilder, die häufig als mehrseitige TIFFs gespeichert werden. + +## Unterstützte Formate + +| Format | Endungen | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre TIFF-Dateien per Drag & Drop hinein. +2. Prüfen Sie die Dateiliste und verwalten Sie sie nach Bedarf. +3. Klicken Sie auf **In PDF umwandeln**. Das Ergebnis wird als `from_tiff.pdf` heruntergeladen. + +Das Werkzeug dekodiert jede TIFF-Datei mit einem JavaScript-TIFF-Decoder und extrahiert die rohen RGBA-Pixeldaten jeder Seite. Jede Seite wird auf eine Canvas gerendert, als PNG exportiert und in die PDF eingebettet. Die Seitenmaße entsprechen denen der ursprünglichen TIFF-Seiten. + +## Optionen + +Dieses Werkzeug bietet keine zusätzlichen Qualitätseinstellungen. Bilder werden in ihrer Originalauflösung eingebettet. + +## Anwendungsfälle + +- Mehrseitige Faxdokumente (TIFF-F) in ein portableres PDF-Format umwandeln +- Gescannte Dokumentarchive, die als TIFF vorliegen, in durchsuchbare PDFs verwandeln (anschließend mit dem OCR-Werkzeug kombinieren) +- Medizinische Bilddateien (Pathologie-Präparate, Radiologie-Exporte) im TIFF-Format verarbeiten +- GIS- oder Satellitenbild-TIFFs in teilbare Dokumente umwandeln + +## Tipps + +- Mehrseitige TIFFs werden vollständig unterstützt. Ein TIFF mit 10 Seiten ergibt eine PDF mit 10 Seiten. Sie müssen das TIFF nicht vorher teilen. +- Sehr große TIFF-Dateien (mehrere hundert Megabyte) können länger dauern, da die gesamte Datei im Browserspeicher dekodiert werden muss. +- Wenn Sie OCR auf der entstandenen PDF brauchen, führen Sie sie nach der Umwandlung durch das Werkzeug [OCR PDF](./ocr-pdf). + +## Verwandte Werkzeuge + +- [Bilder zu PDF](./image-to-pdf) +- [BMP zu PDF](./bmp-to-pdf) +- [JPG zu PDF](./jpg-to-pdf) diff --git a/docs/de/tools/txt-to-pdf.md b/docs/de/tools/txt-to-pdf.md new file mode 100644 index 00000000..175d69f6 --- /dev/null +++ b/docs/de/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Text zu PDF +description: Wandeln Sie reine Textdateien oder getippten Text mit eigenen Schriften, Farben und Seitengrößen in PDF um. +--- + +# Text zu PDF + +Wandeln Sie reinen Text in eine formatierte PDF um. Sie können `.txt`-Dateien hochladen oder direkt im integrierten Texteditor tippen. Das Werkzeug unterstützt mehrere Schriften, eigene Textfarben und viele Seitengrößen, von A0 bis A10 sowie US Letter, Legal und Tabloid. + +## Unterstützte Formate + +| Eingabe | Endungen | +| :------------------ | :----------------------------- | +| Reine Textdateien | `.txt` | +| Direkte Texteingabe | Im Editor tippen oder einfügen | + +## So funktioniert es + +1. Wählen Sie Ihren Eingabemodus mit dem Schalter oben: **Dateien hochladen** oder **Text eingeben**. +2. Ziehen Sie beim Hochladen eine oder mehrere `.txt`-Dateien per Drag & Drop hinein oder klicken Sie zur Auswahl. Geben Sie beim Tippen Ihren Text direkt in das Textfeld ein. +3. Konfigurieren Sie die Formatierungsoptionen: Schriftfamilie, Schriftgröße, Textfarbe und Seitengröße. +4. Klicken Sie auf **PDF erstellen**. Die Ausgabe wird als `text_to_pdf.pdf` heruntergeladen. + +Beim Hochladen mehrerer Dateien werden ihre Inhalte mit Leerzeilen dazwischen aneinandergehängt. + +## Optionen + +| Option | Werte | Standard | +| :----------------- | :------------------------------------------------------------------------------- | :---------------- | +| **Schriftfamilie** | Helvetica (serifenlos), Tiro (Serif), Courier (Festbreite), Times (Serif) | Helvetica | +| **Schriftgröße** | 6 bis 72 pt | 12 | +| **Textfarbe** | Beliebige Farbe über die Farbauswahl | Schwarz (#000000) | +| **Seitengröße** | ISO A0 bis A10, B0 bis B10, C0 bis C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +RTL-Sprachen (Arabisch, Hebräisch, Persisch, Urdu) werden automatisch erkannt. Wird RTL-Text gefunden, wechseln Textrichtung und Ausrichtung entsprechend. + +## Anwendungsfälle + +- Code-Schnipsel oder Logdateien mit der Schrift Courier in eine druckbare PDF umwandeln +- Aus spontan getippten Besprechungsnotizen schnell eine PDF erstellen +- Ein Manuskript als reinen Text für die Einreichung mit bestimmter Schrift und Seitengröße formatieren +- Eine PDF-Version einer README oder eines Changelogs für die Offline-Verteilung erstellen + +## Tipps + +- Nutzen Sie den Modus **Text eingeben**, wenn Sie Inhalte aus der Zwischenablage schnell umwandeln wollen, ohne sie zuerst als Datei zu speichern. +- Courier (Festbreite) ist die beste Schriftwahl für Code, Logs oder alle Inhalte, bei denen die Spaltenausrichtung wichtig ist. +- Die Seitenränder sind auf allen Seiten fest auf 72 Punkt (2,54 cm) eingestellt. + +## Verwandte Werkzeuge + +- [Markdown zu PDF](./markdown-to-pdf) +- [CSV zu PDF](./csv-to-pdf) +- [Word zu PDF](./word-to-pdf) diff --git a/docs/de/tools/unlock-pdf.md b/docs/de/tools/unlock-pdf.md new file mode 100644 index 00000000..91ad70c8 --- /dev/null +++ b/docs/de/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF entsperren +description: Entfernen Sie den Passwortschutz von verschlüsselten PDFs. Unterstützt die Stapelentschlüsselung mehrerer Dateien mit einem einzigen Passwort. +--- + +# PDF entsperren + +Wenn Sie das Passwort einer verschlüsselten PDF kennen, entfernt dieses Tool die Verschlüsselung vollständig und erzeugt eine entsperrte Kopie, die jeder ohne Zugangsdaten öffnen kann. Es unterstützt die Stapelentschlüsselung, wenn mehrere PDFs dasselbe Passwort haben. + +## So funktioniert es + +1. Laden Sie eine oder mehrere verschlüsselte PDF-Dateien hoch. +2. Geben Sie das **Passwort** ein, mit dem die Dateien geschützt wurden. +3. Klicken Sie auf **PDF entschlüsseln**. +4. Eine einzelne Datei wird direkt heruntergeladen. Bei mehreren Dateien entsteht ein ZIP-Archiv mit allen entsperrten PDFs. + +## Funktionen + +- Entschlüsselung einzelner Dateien und im Stapel +- Unterstützt Benutzer- und Besitzerpasswörter +- Erzeugt eine vollständig unverschlüsselte Ausgabe ohne verbleibende Einschränkungen +- Klare Fehlermeldungen bei falschen Passwörtern oder beschädigten Dateien +- Erfolg und Fehler werden im Stapelmodus pro Datei erfasst + +## Unterschied zu „Beschränkungen entfernen“ + +**PDF entschlüsseln** erfordert das Passwort und entfernt die gesamte Verschlüsselung. **Beschränkungen entfernen** zielt auf Nutzungsbeschränkungen (Drucken, Kopieren, Bearbeiten) ab und benötigt möglicherweise kein Passwort, wenn nur ein Besitzerpasswort gesetzt wurde. Verwenden Sie „Entschlüsseln“, wenn sich die PDF ohne Passwort gar nicht öffnen lässt. + +## Anwendungsfälle + +- Von Ihnen früher verschlüsselte PDFs dauerhaft entsperren, wenn das Passwort nicht mehr gebraucht wird +- Die Verschlüsselung eines Stapels archivierter Dokumente entfernen, um den Langzeitzugriff zu erleichtern +- Passwortgeschützte PDFs für ein Dokumentenmanagementsystem vorbereiten, das keine verschlüsselten Dateien unterstützt +- PDFs entsperren, bevor Sie sie mit anderen Dokumenten zusammenfügen (viele Tools zum Zusammenfügen können verschlüsselte Eingaben nicht verarbeiten) + +## Tipps + +- Das Passwortfeld gilt für alle hochgeladenen Dateien. Wenn Ihre PDFs unterschiedliche Passwörter haben, verarbeiten Sie sie in getrennten Stapeln. +- Wenn die Fehlermeldung „Falsches Passwort“ erscheint, prüfen Sie auf Leerzeichen am Ende oder eine aktivierte Feststelltaste. +- Nach der Entschlüsselung hat die Ausgabe keinerlei Schutz. Verschlüsseln Sie sie mit „PDF verschlüsseln“ erneut, wenn Sie ein neues Passwort vergeben möchten. + +## Verwandte Tools + +- [PDF verschlüsseln](./protect-pdf): Verschlüsselung mit einem neuen Passwort erneut anwenden +- [Beschränkungen entfernen](./remove-restrictions): Nutzungsbeschränkungen ohne vollständige Entschlüsselung entfernen +- [Berechtigungen ändern](./change-permissions): bestimmte Berechtigungen einer verschlüsselten PDF ändern diff --git a/docs/de/tools/validate-signature-pdf.md b/docs/de/tools/validate-signature-pdf.md new file mode 100644 index 00000000..5c76219b --- /dev/null +++ b/docs/de/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Signatur prüfen +description: Überprüfen Sie digitale Signaturen in PDF-Dateien. Prüfen Sie Zertifikatsgültigkeit, Identität des Unterzeichners, Dokumentintegrität und Status der Vertrauenskette. +--- + +# Signatur prüfen + +Laden Sie eine signierte PDF hoch, und dieses Tool liest jede digitale Signatur aus, identifiziert den Unterzeichner, prüft die Gültigkeit des Zertifikats und meldet, ob das Dokument seit der Signatur verändert wurde. Sie können auch ein vertrauenswürdiges Zertifikat angeben, um die Signaturkette zu verifizieren. + +## So funktioniert es + +1. Laden Sie eine signierte PDF-Datei hoch. Die Prüfung startet automatisch. +2. Das Tool zeigt eine Zusammenfassung: Anzahl der gefundenen Signaturen und wie viele davon gültig sind. +3. Jede Signatur erhält eine Detailkarte mit Name des Unterzeichners, Aussteller, Daten und Status. +4. Laden Sie optional ein **vertrauenswürdiges Zertifikat** (.pem, .crt, .cer, .der) hoch, um die Signatur gegen einen bestimmten Vertrauensanker zu prüfen. Die erneute Prüfung läuft automatisch. + +## Was geprüft wird + +### Signatur-Parsing + +Das Tool liest PKCS#7-Signaturobjekte aus der PDF, dekodiert die ASN.1-Struktur und extrahiert das X.509-Zertifikat des Unterzeichners sowie eine in der Signatur eingebettete Zertifikatskette. + +### Zertifikatsgültigkeit + +- **Ablauf**: Liegt das Zertifikat derzeit innerhalb seines Gültigkeitszeitraums? +- **Erkennung selbstsignierter Zertifikate**: Ist das Zertifikat sein eigener Aussteller? +- **Vertrauenskette**: Führt das Zertifikat des Unterzeichners bei Angabe eines vertrauenswürdigen Zertifikats auf dieses zurück? + +### Kryptografische Verifizierung + +- Das Tool rekonstruiert die vom `/ByteRange` der Signatur abgedeckten Bytes, bildet mit dem vom Unterzeichner angegebenen Algorithmus einen Hash und vergleicht das Ergebnis mit dem Attribut `messageDigest` in der Signatur. +- Anschließend serialisiert es die signierten Attribute erneut als DER SET und verifiziert die Signatur mit dem öffentlichen Schlüssel des Unterzeichnerzertifikats. +- **Eine Signatur wird nur dann als gültig gemeldet, wenn alle diese Prüfungen bestehen.** Wurden die PDF-Bytes nach der Signatur geändert oder passt die eingebettete Signatur nicht zum Schlüssel des Unterzeichners, zeigt der Status „Ungültig: Kryptografische Verifizierung fehlgeschlagen“ mit dem genauen Grund. + +#### Unterstützte Signaturalgorithmen + +| Algorithmus | Verifizierungspfad | +| ----------------------- | -------------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, mit Web-Crypto-Fallback | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` nach Umwandlung der Signatur von DER → IEEE P1363 | + +Verwendet eine Signatur einen Algorithmus außerhalb dieser Liste (zum Beispiel Ed25519, SM2 oder RSA mit einer ungewöhnlichen Digest-OID), zeigt die Karte in Gelb **„Ungeprüft: Nicht unterstützter Signaturalgorithmus“** zusammen mit der konkreten OID oder dem Grund. Dies ist eine bewusste Unterscheidung in drei Zustände: + +- **Gültig**: Die Signatur wurde kryptografisch gegen den öffentlichen Schlüssel des Unterzeichners verifiziert. +- **Ungültig**: Die Verifizierung lief und ergab ein negatives Ergebnis (Bytes geändert, Schlüssel passt nicht). +- **Ungeprüft**: Das Tool konnte die Verifizierung für diesen Algorithmus nicht durchführen. Die Zertifikatsmetadaten werden weiterhin angezeigt, die Signatur sollten Sie aber als „unbekannt“ behandeln und mit Adobe Acrobat oder `openssl cms -verify` prüfen. + +### Unsichere Digest-Algorithmen + +- Signaturen mit **MD5 oder SHA-1** werden als ungültig abgelehnt und mit dem Status „Unsicherer Digest“ markiert. Für beide Algorithmen gibt es veröffentlichte Kollisionsangriffe, sodass eine Signatur über einen SHA-1- oder MD5-Hash keine Integritätsgarantie bietet. +- SHA-224, SHA-256, SHA-384 und SHA-512 werden alle akzeptiert. + +### Dokumentabdeckung + +- **Vollständige Abdeckung**: Die Signatur deckt die gesamte PDF-Datei ab, das heißt, nach der Signatur wurden keine Bytes hinzugefügt oder geändert. +- **Teilweise Abdeckung**: Die Signatur deckt nur einen Teil der Datei ab. Das kann auf Änderungen nach der Signatur hindeuten (nicht zwingend böswillige, denn inkrementelle Speicherungen führen zu teilweiser Abdeckung). + +## Signaturdetails + +Jede Signaturkarte zeigt: + +- **Signiert von**: Common Name, Organisation und E-Mail-Adresse aus dem Zertifikat des Unterzeichners +- **Aussteller**: Die Zertifizierungsstelle, die das Zertifikat des Unterzeichners ausgestellt hat +- **Signiert am**: Der in der Signatur eingebettete Zeitstempel +- **Gültig ab / Gültig bis**: Der Gültigkeitszeitraum des Zertifikats +- **Grund**: Warum das Dokument signiert wurde (falls angegeben) +- **Ort**: Wo es signiert wurde (falls angegeben) +- **Abdeckungsstatus**: Vollständig oder teilweise +- **Vertrauensabzeichen**: Vertrauenswürdig oder Nicht in der Vertrauenskette (nur bei einem eigenen Zertifikat) + +### Technische Details + +Öffnen Sie den Bereich mit den technischen Details für: + +- Seriennummer des Zertifikats des Unterzeichners +- Digest-Algorithmus (SHA-256, SHA-512 usw.) +- Signaturalgorithmus (RSA mit SHA-256, ECDSA mit SHA-256 usw.) +- Fehlermeldungen für ungültige Signaturen + +## Anwendungsfälle + +- Einen digital signierten Vertrag prüfen, bevor Sie gegenzeichnen +- Signierte Dokumente prüfen, um sicherzustellen, dass sie nicht manipuliert wurden +- Kontrollieren, ob ein Zertifikat seit der Signierung des Dokuments abgelaufen ist +- Signaturen gegen das Stammzertifikat Ihrer Organisation validieren +- Die Signaturdetails von behördlichen oder rechtlichen Dokumenten untersuchen + +## Tipps + +- Ein selbstsigniertes Zertifikat bedeutet nicht, dass die Signatur ungültig ist. Es bedeutet, dass sich die Identität des Unterzeichners nicht über eine vertrauenswürdige dritte Stelle verifizieren lässt. Das ist bei internen Dokumenten üblich. +- Teilweise Abdeckung weist nicht immer auf Manipulation hin. Viele PDF-Workflows fügen inkrementelle Updates hinzu (etwa eine zweite Signatur), die eine teilweise Abdeckung erzeugen. +- Laden Sie das Stamm- oder Zwischenzertifikat Ihrer Organisation als vertrauenswürdiges Zertifikat hoch, um die Vertrauensketten-Verifizierung zu erhalten. + +## Verwandte Tools + +- [Digitale Signatur](./digital-sign-pdf): PDFs mit Ihrem eigenen Zertifikat signieren +- [PDF reduzieren](./flatten-pdf): eine PDF vor dem Signieren reduzieren, um Änderungen nach der Signatur zu verhindern +- [Metadaten entfernen](./remove-metadata): eine PDF vor dem Anbringen einer Signatur bereinigen diff --git a/docs/de/tools/view-metadata.md b/docs/de/tools/view-metadata.md new file mode 100644 index 00000000..a0bf73eb --- /dev/null +++ b/docs/de/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Metadaten anzeigen +description: Untersuchen Sie alle Metadateneigenschaften einer PDF, einschließlich Dokumentinformationen, XMP-Daten und struktureller Details. +--- + +# Metadaten anzeigen + +Untersuchen Sie die versteckten Eigenschaften, die in einer PDF-Datei eingebettet sind. Das Tool zeigt Dokumentinformationen (Titel, Autor, Datumsangaben), XMP-Metadaten, Seitenabmessungen und weitere strukturelle Daten in lesbarer Form an. + +## So funktioniert es + +1. Laden Sie eine PDF-Datei hoch. +2. Das Tool analysiert die Datei sofort und zeigt alle verfügbaren Metadaten in übersichtlichen Abschnitten an. +3. Sehen Sie sich das Dokumentinformations-Dictionary, den XMP-Metadatenbaum und die strukturellen Eigenschaften an. +4. Ein Verarbeitungsschritt ist nicht nötig: Die Metadaten erscheinen, sobald die Datei geladen ist. + +## Funktionen + +- Zeigt die Standardfelder der Dokumentinformationen: Titel, Autor, Betreff, Schlüsselwörter, Ersteller, Producer +- Zeigt Erstellungs- und Änderungsdatum in lesbarem Format +- Liest den vollständigen XMP-Metadatenbaum mit verschachtelten Namespaces und stellt ihn dar +- Wandelt das PDF-Datumsformat (`D:20240101120000Z`) in lesbare Datumsangaben um +- In einklappbare Abschnitte gegliedert für eine einfache Navigation + +## Metadatenabschnitte + +| Abschnitt | Inhalt | +| ------------------------- | --------------------------------------------------------------------------------------------- | +| **Dokumentinformationen** | Titel, Autor, Betreff, Schlüsselwörter, Ersteller, Producer, Erstellungsdatum, Änderungsdatum | +| **XMP-Metadaten** | Vollständiger XML-basierter Metadatenbaum mit Dublin Core, XAP, PDF und eigenen Namespaces | +| **Dokumenteigenschaften** | Seitenanzahl, PDF-Version, Dateigröße, Verschlüsselungsstatus | + +## Anwendungsfälle + +- Prüfen, wer eine PDF verfasst hat und wann sie zuletzt geändert wurde +- Kontrollieren, dass die Metadaten vor der Veröffentlichung eines Dokuments korrekt gesetzt wurden +- PDFs aus Datenschutzgründen prüfen, indem man nachsieht, welche persönlichen Informationen eingebettet sind +- Die Software untersuchen, mit der eine PDF erstellt oder geändert wurde (über das Feld Producer) +- XMP-Metadaten im Hinblick auf die Compliance im Digital Asset Management prüfen + +## Tipps + +- PDF-Datumsangaben, die mit `D:` beginnen, werden automatisch in das Format Ihrer lokalen Zeitzone umgewandelt. +- Wenn Metadatenfelder leer erscheinen, hat der Ersteller der PDF sie schlicht nicht gesetzt. Nicht alle PDFs enthalten umfangreiche Metadaten. +- Um Metadaten nach der Prüfung zu ändern, verwenden Sie [Metadaten bearbeiten](./edit-metadata). Um sie ganz zu entfernen, nutzen Sie „Metadaten entfernen“. + +## Verwandte Tools + +- [Metadaten bearbeiten](./edit-metadata) +- [PDF-OCG-Ebenen](./pdf-layers) +- [PDFs vergleichen](./compare-pdfs) diff --git a/docs/de/tools/vsd-to-pdf.md b/docs/de/tools/vsd-to-pdf.md new file mode 100644 index 00000000..5c3e9d5f --- /dev/null +++ b/docs/de/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD zu PDF +description: Konvertieren Sie Microsoft-Visio-Diagramme (VSD/VSDX) in Ihrem Browser in PDF. Kostenlos, privat, ohne Visio. +--- + +# VSD zu PDF + +Konvertieren Sie Microsoft-Visio-Diagramme in PDF, ohne Visio zu installieren. VSD- und VSDX-Dateien enthalten Flussdiagramme, Organigramme, Netzwerkdiagramme und Grundrisse, die die meisten Menschen nicht öffnen können. Dieses Tool wandelt sie in saubere PDFs um, die sich auf jedem Gerät ansehen lassen. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----------- | :---------- | :----------------------------------------- | +| Visio Binary | `.vsd` | Altes Visio-Format (Visio 2003 und früher) | +| Visio XML | `.vsdx` | Modernes Visio-Format (Visio 2013+) | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre VSD- oder VSDX-Dateien per Drag-and-drop hinein. Beide Formate können in einem Stapel gemischt werden. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Einträge mit dem Papierkorb-Symbol oder fügen Sie über **Weitere Dateien hinzufügen** weitere Diagramme hinzu. +3. Klicken Sie auf **In PDF konvertieren**. Die LibreOffice-basierte Engine wird im Browser geladen und wandelt jedes Diagramm in eine PDF um, wobei Formen, Verbinder, Beschriftungen und Seitenlayout erhalten bleiben. +4. Ein einzelnes Diagramm wird direkt als PDF heruntergeladen. Bei mehreren Dateien entsteht ein ZIP-Archiv mit dem Namen `vsd-to-pdf.zip`. + +## Optionen + +Es ist keine Konfiguration erforderlich. Der Konverter übernimmt Seitengröße und Ausrichtung aus dem Visio-Dokument. + +## Anwendungsfälle + +- Visio-Diagramme von Kollegen ansehen, wenn Sie keine Visio-Lizenz haben +- Netzwerk- oder Architekturdiagramme als PDF in die Projektdokumentation aufnehmen +- Organigramme oder Prozessabläufe als Handout für Besprechungen drucken +- Alte VSD-Dateien aus früheren Visio-Versionen in einem zukunftssicheren Format archivieren + +## Tipps + +- Mehrseitige Visio-Dokumente ergeben mehrseitige PDFs, wobei jede Visio-Seite einer PDF-Seite entspricht. +- VSDX-Dateien (das moderne XML-basierte Format) werden im Allgemeinen originalgetreuer konvertiert als ältere binäre VSD-Dateien. +- Die LibreOffice-Engine wird einmal pro Sitzung geladen. Rechnen Sie bei der ersten Konvertierung mit einer kurzen Wartezeit, bei weiteren Dateien geht es schneller. + +## Verwandte Tools + +- [ODG zu PDF](./odg-to-pdf) +- [PUB zu PDF](./pub-to-pdf) +- [PSD zu PDF](./psd-to-pdf) diff --git a/docs/de/tools/webp-to-pdf.md b/docs/de/tools/webp-to-pdf.md new file mode 100644 index 00000000..3d87f012 --- /dev/null +++ b/docs/de/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP zu PDF +description: Konvertieren Sie WebP-Bilder direkt in Ihrem Browser in das PDF-Format, mit einstellbarer Kompressionsqualität. +--- + +# WebP zu PDF + +Konvertieren Sie das WebP-Bildformat von Google in PDF. Das ist besonders nützlich, wenn Sie Bilder aus dem Web im WebP-Format heruntergeladen haben und sie zum Drucken oder Teilen in einem allgemein akzeptierten Format benötigen. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :----- | :------------ | +| WebP | `.webp` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre WebP-Dateien per Drag-and-drop hinein. +2. Prüfen Sie die Dateiliste und entfernen Sie nicht benötigte Dateien. +3. Wählen Sie eine **PDF-Qualität**. +4. Klicken Sie auf **In PDF konvertieren**. Die Ausgabe wird als `from_webps.pdf` heruntergeladen. + +Intern wird jedes WebP-Bild über die Canvas-API des Browsers dekodiert und dann mit pdf-lib in die PDF eingebettet. Die Konvertierung funktioniert daher in jedem Browser, der WebP-Dekodierung unterstützt (alle modernen Browser tun das). + +## Optionen + +Die **PDF-Qualität** steuert die Kompression beim Einbetten der Bilder: + +- **Hohe Qualität**: bewahrt die meisten Details. +- **Mittlere Qualität** (Standard): ausgewogene Ausgabe. +- **Niedrige Qualität**: kleinste Dateigröße. + +## Anwendungsfälle + +- Aus dem Web heruntergeladene Bilder im WebP-Format in eine druckbare PDF umwandeln +- WebP-Screenshots aus Chrome oder Edge für eine Dokumentation bündeln +- Ein PDF-Portfolio aus Bildern erstellen, die Design-Tools standardmäßig als WebP exportieren +- WebP-Bilder in einem allgemeiner lesbaren Format archivieren + +## Tipps + +- WebP wird vor dem Einbetten in die PDF intern in PNG dekodiert, sodass verlustfreie WebP-Bilder bei der Einstellung „Hoch“ ihre Qualität behalten. +- Wenn Sie eine Mischung aus WebP und anderen Bildformaten haben, verwenden Sie stattdessen das Tool [Bilder zu PDF](./image-to-pdf), das alles in einem Durchgang akzeptiert. + +## Verwandte Tools + +- [Bilder zu PDF](./image-to-pdf) +- [PNG zu PDF](./png-to-pdf) +- [JPG zu PDF](./jpg-to-pdf) diff --git a/docs/de/tools/word-to-pdf.md b/docs/de/tools/word-to-pdf.md new file mode 100644 index 00000000..b4444280 --- /dev/null +++ b/docs/de/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word zu PDF +description: Konvertieren Sie Word-Dokumente (DOC, DOCX), ODT- und RTF-Dateien in Ihrem Browser mit vollständig erhaltener Formatierung in PDF. +--- + +# Word zu PDF + +Konvertieren Sie Microsoft-Word-Dokumente und kompatible Formate in PDF. Das Tool nutzt eine browserbasierte LibreOffice-Engine, die DOC-, DOCX-, ODT- und RTF-Dateien verarbeitet und dabei Formatierung, Tabellen, Bilder, Kopf- und Fußzeilen sowie Formatvorlagen in der Ausgabe beibehält. + +## Unterstützte Formate + +| Format | Erweiterungen | +| :---------------- | :------------ | +| Word (modern) | `.docx` | +| Word (älter) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre Word-Dokumente per Drag-and-drop hinein. Es können mehrere Dateien gleichzeitig ausgewählt werden. +2. Prüfen und verwalten Sie die Dateiliste. +3. Klicken Sie auf **In PDF konvertieren**. Die LibreOffice-Engine wird bei der ersten Verwendung geladen (eine Fortschrittsanzeige zeigt den Initialisierungsstatus), danach wird jede Datei konvertiert. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in `word-converted.zip` gepackt. + +## Optionen + +Dieses Tool hat keine zusätzlichen Einstellungen. Die LibreOffice-Engine erzeugt die Ausgabe mit ihrem Standard-PDF-Exportprofil. + +## Ausgabe + +| Anzahl der Eingaben | Ausgabe | +| :------------------ | :------------------------------------------------------------------ | +| 1 Datei | Einzelner PDF-Download (ursprünglicher Dateiname mit Endung `.pdf`) | +| 2+ Dateien | ZIP-Archiv (`word-converted.zip`) mit einer PDF pro Datei | + +## Anwendungsfälle + +- Einen Lebenslauf oder ein Anschreiben vor der Bewerbung von DOCX in PDF umwandeln +- Eine Reihe von Verträgen oder Angeboten für die Übergabe an einen Kunden im Stapel in PDF konvertieren +- Alte `.doc`-Dateien für die Langzeitarchivierung in moderne PDFs umwandeln +- Gemeinsam bearbeitete Dokumente aus Google Docs (als DOCX exportiert) in PDF konvertieren +- Druckfertige PDFs aus Word-Vorlagen erzeugen, die für die automatisierte Dokumenterstellung genutzt werden + +## Tipps + +- Die LibreOffice-Engine wird einmal pro Sitzung heruntergeladen und zwischengespeichert. Rechnen Sie bei der ersten Konvertierung mit einigen Sekunden Ladezeit, weitere Konvertierungen sind deutlich schneller. +- Komplexe Formatierungen (Makros, ActiveX-Steuerelemente, fortgeschrittenes SmartArt) werden möglicherweise nicht perfekt konvertiert. Standardelemente wie Text, Tabellen, Bilder, Kopfzeilen und Fußnoten werden zuverlässig konvertiert. +- Da dieses Tool auch ODT und RTF akzeptiert, können Sie es als zentralen Konverter für alle Textverarbeitungsformate nutzen. + +## Verwandte Tools + +- [ODT zu PDF](./odt-to-pdf) +- [RTF zu PDF](./rtf-to-pdf) +- [Excel zu PDF](./excel-to-pdf) +- [PowerPoint zu PDF](./powerpoint-to-pdf) diff --git a/docs/de/tools/wpd-to-pdf.md b/docs/de/tools/wpd-to-pdf.md new file mode 100644 index 00000000..f99ae6c7 --- /dev/null +++ b/docs/de/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD zu PDF +description: Konvertieren Sie WordPerfect-Dokumente (WPD) mit LibreOffice in Ihrem Browser in PDF. Kostenlos und privat. +--- + +# WPD zu PDF + +Konvertieren Sie Corel-WordPerfect-Dokumente in PDF-Dateien. WPD war einst das dominierende Textverarbeitungsformat in Anwaltskanzleien und Behörden. Wenn Sie alte WordPerfect-Dateien haben, die moderne Software nicht mehr öffnen will, erweckt dieses Tool sie als Standard-PDFs wieder zum Leben. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :---------- | :---------- | :----------------------------------- | +| WordPerfect | `.wpd` | Alle wichtigen WordPerfect-Versionen | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre WPD-Dateien per Drag-and-drop hinein. Es können mehrere Dateien gleichzeitig ausgewählt werden. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Dateien mit dem Papierkorb-Symbol oder fügen Sie über **Weitere Dateien hinzufügen** weitere Dokumente hinzu. +3. Klicken Sie auf **In PDF konvertieren**. Das Tool lädt in Ihrem Browser eine LibreOffice-basierte Konvertierungs-Engine, die das WPD-Format einliest und PDF ausgibt. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Stapelkonvertierungen ergeben ein ZIP-Archiv mit dem Namen `wpd-to-pdf.zip`. + +## Optionen + +Es ist keine Konfiguration erforderlich. Die LibreOffice-Engine übernimmt WPD-Formatierung, Schriften und Layout automatisch. + +## Anwendungsfälle + +- Jahrzehntealte Rechtsdokumente öffnen, die in WordPerfect geschrieben wurden +- Archivierte behördliche Unterlagen von WPD in ein modernes Format umwandeln +- Eine alte WordPerfect-Dokumentenbibliothek für die Langzeitspeicherung in PDF überführen +- WPD-Dateien an Empfänger weitergeben, die Corel WordPerfect nicht installiert haben + +## Tipps + +- Die LibreOffice-Engine wird bei der ersten Verwendung geladen, was einen Moment dauert. Weitere Konvertierungen in derselben Sitzung sind schneller. +- Komplexe WPD-Makros und Reveal Codes bleiben nicht erhalten, aber das visuelle Layout, der Textinhalt und die grundlegende Formatierung werden in die PDF übernommen. + +## Verwandte Tools + +- [WPS zu PDF](./wps-to-pdf) +- [ODG zu PDF](./odg-to-pdf) diff --git a/docs/de/tools/wps-to-pdf.md b/docs/de/tools/wps-to-pdf.md new file mode 100644 index 00000000..1e706bf5 --- /dev/null +++ b/docs/de/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS zu PDF +description: Konvertieren Sie Microsoft-Works-Dokumente (WPS) in Ihrem Browser in PDF. Kostenlos, ohne Anmeldung, vollständig privat. +--- + +# WPS zu PDF + +Konvertieren Sie Textverarbeitungsdateien von Microsoft Works in PDF. Microsoft Works wurde in den späten 1990er und 2000er Jahren mit Verbraucher-PCs ausgeliefert, und viele WPS-Dateien liegen noch auf alten Festplatten und in E-Mail-Archiven. Dieses Tool öffnet sie im Browser und erzeugt saubere PDFs. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :-------------- | :---------- | :------------------------------------------- | +| Microsoft Works | `.wps` | Textverarbeitungsdateien von Microsoft Works | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre WPS-Dateien per Drag-and-drop hinein. Mehrere Dateien werden akzeptiert. +2. Prüfen Sie die Dateiliste. Entfernen Sie einzelne Dateien mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um Ihren Stapel zu erweitern. +3. Klicken Sie auf **In PDF konvertieren**. Eine LibreOffice-basierte Engine wird im Browser geladen und konvertiert jedes WPS-Dokument in PDF. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in einem ZIP-Archiv mit dem Namen `wps-to-pdf.zip` gebündelt. + +## Optionen + +Es sind keine zusätzlichen Einstellungen nötig. Der Konverter verarbeitet Text, grundlegende Formatierung und eingebettete Bilder aus der WPS-Datei. + +## Anwendungsfälle + +- Alte Schul- oder Arbeitsdokumente retten, die im Microsoft-Works-Format gespeichert wurden +- WPS-E-Mail-Anhänge öffnen, wenn Microsoft Works nicht installiert ist +- Ein Archiv von WPS-Dateien für die Migration in ein modernes Dokumentensystem konvertieren +- Alte Dokumente drucken, die aktuelle Textverarbeitungen nicht öffnen können + +## Tipps + +- Verwechseln Sie WPS-Dateien von Microsoft Works (`.wps`) nicht mit Dateien von WPS Office. Dieses Tool ist speziell für das ältere Microsoft-Works-Format gedacht. +- Die LibreOffice-Engine braucht bei der ersten Verwendung einen Moment zum Laden. Ist sie geladen, laufen weitere Konvertierungen in derselben Sitzung schneller. + +## Verwandte Tools + +- [WPD zu PDF](./wpd-to-pdf) +- [PUB zu PDF](./pub-to-pdf) diff --git a/docs/de/tools/xml-to-pdf.md b/docs/de/tools/xml-to-pdf.md new file mode 100644 index 00000000..19491f6e --- /dev/null +++ b/docs/de/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML zu PDF +description: Konvertieren Sie XML-Dateien in Ihrem Browser in strukturierte PDF-Dokumente. Kostenlos, privat, keine Verarbeitung auf einem Server. +--- + +# XML zu PDF + +Konvertieren Sie XML-Datendateien in lesbare, strukturierte PDF-Dokumente. Rohes XML ist leistungsfähig, für Menschen aber schwer zu lesen. Dieses Tool analysiert den XML-Baum, erkennt sich wiederholende Datenstrukturen und stellt sie als formatierte Tabellen und Abschnitte in einer PDF im A4-Querformat dar. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----- | :---------- | :------------------------------ | +| XML | `.xml` | Jedes wohlgeformte XML-Dokument | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre XML-Dateien per Drag-and-drop hinein. Mehrere Dateien können in einem Stapel verarbeitet werden. +2. Prüfen Sie die Dateiliste. Entfernen Sie unerwünschte Dateien mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um weitere aufzunehmen. +3. Klicken Sie auf **In PDF konvertieren**. Das Tool analysiert die XML-Struktur mit dem im Browser integrierten DOMParser, untersucht die Datenhierarchie und rendert sie mit jsPDF und Auto-Table-Formatierung in eine PDF. +4. Eine einzelne Datei wird als PDF heruntergeladen. Mehrere Konvertierungen werden in `xml-to-pdf.zip` gepackt. + +## Optionen + +Es ist keine manuelle Konfiguration erforderlich. Der Konverter erkennt die XML-Struktur automatisch und wählt passende Tabellenlayouts. Die Ausgabe erfolgt im A4-Querformat, um breite Datensätze unterzubringen. + +## Anwendungsfälle + +- XML-Datenexporte aus Datenbanken oder APIs in druckbare Berichte umwandeln +- Lesbare Zusammenfassungen aus XML-Konfigurationsdateien erstellen +- XML-basierte Rechnungen oder Transaktionsprotokolle für die Aufbewahrung in PDFs konvertieren +- XML-Sitemaps oder RSS-Feeds in Dokumentform lesbar machen + +## Tipps + +- Das XML muss wohlgeformt sein. Stößt der Parser auf Syntaxfehler, schlägt die Konvertierung mit einer aussagekräftigen Fehlermeldung fehl, die auf das Problem hinweist. +- Tief verschachtelte XML-Strukturen werden zu Tabellen abgeflacht. Für beste Ergebnisse sollten die Daten sich wiederholende Geschwisterelemente mit einheitlichen Kindelementen haben. +- Während der Konvertierung erscheinen Fortschrittsmeldungen zu den einzelnen Phasen: Lesen, Analysieren, Auswerten und Rendern. + +## Verwandte Tools + +- [FB2 zu PDF](./fb2-to-pdf) +- [XPS zu PDF](./xps-to-pdf) +- [E-Mail zu PDF](./email-to-pdf) diff --git a/docs/de/tools/xps-to-pdf.md b/docs/de/tools/xps-to-pdf.md new file mode 100644 index 00000000..c426ff32 --- /dev/null +++ b/docs/de/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS zu PDF +description: Konvertieren Sie XPS- und OXPS-Dokumente in Ihrem Browser in das PDF-Format. Kein Upload, keine Anmeldung, vollständig privat. +--- + +# XPS zu PDF + +Konvertieren Sie Microsoft-XPS- und OXPS-Dokumente in Standard-PDF-Dateien. XPS (XML Paper Specification) war Microsofts Antwort auf PDF, doch die Unterstützung dafür ist auf vielen Plattformen geschwunden. Dieses Tool macht solche Dokumente wieder universell lesbar. + +## Unterstützte Formate + +| Format | Erweiterung | Hinweise | +| :----- | :---------- | :----------------------------------- | +| XPS | `.xps` | Ursprüngliches Microsoft-XPS-Format | +| OXPS | `.oxps` | Open XPS, die Variante nach ECMA-388 | + +## So funktioniert es + +1. Klicken Sie auf den Upload-Bereich oder ziehen Sie Ihre XPS-/OXPS-Dateien per Drag-and-drop hinein. Sie können mehrere Dateien gleichzeitig auswählen. +2. Prüfen Sie die Dateiliste. Entfernen Sie einzelne Dateien mit dem Papierkorb-Symbol oder klicken Sie auf **Weitere Dateien hinzufügen**, um zusätzliche Dokumente anzuhängen. +3. Klicken Sie auf **In PDF konvertieren**. Die PyMuPDF-Engine verarbeitet jedes Dokument lokal in Ihrem Browser. +4. Eine einzelne Datei wird direkt als PDF heruntergeladen. Mehrere Dateien werden in einem ZIP-Archiv mit dem Namen `xps-converted.zip` gebündelt. + +## Optionen + +Dieses Tool führt eine direkte Formatkonvertierung ohne zusätzliche Konfiguration durch. Die Ausgabe behält Seitenabmessungen, Vektorgrafiken, Schriften und Bilder der XPS-Quelle bei. + +## Anwendungsfälle + +- XPS-Dateien öffnen, die Sie von älteren Windows-Systemen erhalten haben, auf denen der XPS-Druckertreiber voreingestellt war +- OXPS-Dokumente aus Windows 10/11 für die Weitergabe an macOS- oder Linux-Nutzer konvertieren +- Alte XPS-Dateien in einem weiter verbreiteten Format archivieren +- XPS-basierte behördliche oder geschäftliche Dokumente für externe Empfänger zugänglich machen + +## Tipps + +- Die Endungen `.xps` und `.oxps` werden automatisch erkannt, sodass Sie beide im selben Stapel mischen können. +- Wurde die ursprüngliche XPS-Datei mit einem hochauflösenden Druckertreiber erstellt, behält die resultierende PDF diese Qualität. Es findet keine Neuberechnung der Auflösung statt. + +## Verwandte Tools + +- [Word zu PDF](./word-to-pdf) +- [XML zu PDF](./xml-to-pdf) diff --git a/docs/es/contributing.md b/docs/es/contributing.md new file mode 100644 index 00000000..1ea6ed29 --- /dev/null +++ b/docs/es/contributing.md @@ -0,0 +1,136 @@ +# Contribuir + +¡Gracias por tu interés en contribuir a BentoPDF! Esta guía te ayudará a empezar. + +## Primeros pasos + +### Requisitos previos + +- Node.js 18+ +- npm 9+ +- Git + +### Configuración + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Estructura del proyecto + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Añadir una herramienta nueva + +### Paso 1: Crear el archivo de lógica + +Crea `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Paso 2: Crear la página HTML + +Crea `src/pages/your-tool.html` siguiendo las plantillas de herramientas existentes. + +### Paso 3: Registrar la herramienta + +Añade a `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Paso 4: Añadir a la configuración de compilación + +Añade la página a `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Paso 5: Añadir traducciones + +Añade entradas a todos los archivos de idioma en `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Estilo de código + +- Usa TypeScript para todo el código nuevo +- Sigue los patrones existentes para mantener la coherencia +- Ejecuta `npm run format` antes de hacer commit +- Sin comentarios en el código de producción (los comentarios se eliminan durante la compilación) + +## Proceso de pull request + +1. Crea una rama de funcionalidad: `git checkout -b feature/your-feature` +2. Haz tus cambios +3. Pruébalo a fondo: `npm run build` +4. Envía un PR con una descripción clara + +## Traducción + +Consulta [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) para añadir nuevos idiomas. + +## Acuerdo de licencia de colaborador + +Antes de que se pueda fusionar tu PR, tendrás que firmar nuestro CLA: + +- [CLA individual (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA corporativo (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Obtener ayuda + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Comunidad de Discord](https://discord.gg/Bgq3Ay3f2w) + +## Licencia + +BentoPDF tiene doble licencia: + +- **AGPL-3.0** para proyectos de código abierto en los que compartes públicamente todo tu código fuente +- **Licencia comercial** para aplicaciones propietarias o de código cerrado: [Obtén la licencia de por vida por $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Al contribuir, aceptas que tus contribuciones se licencien bajo estos términos. diff --git a/docs/es/getting-started.md b/docs/es/getting-started.md new file mode 100644 index 00000000..9553a9a9 --- /dev/null +++ b/docs/es/getting-started.md @@ -0,0 +1,80 @@ +# Primeros pasos + +¡Bienvenido a BentoPDF! Esta guía te ayudará a ponerte en marcha rápidamente. + +## ¿Qué es BentoPDF? + +BentoPDF es un kit de herramientas PDF gratuito, de código abierto y centrado en la privacidad que funciona **por completo en tu navegador**. Tus archivos nunca salen de tu dispositivo: todo el procesamiento ocurre en local mediante tecnología WebAssembly (WASM). + +## Inicio rápido + +### Opción 1: Usar la versión alojada + +Visita [bentopdf.com](https://www.bentopdf.com) para usar BentoPDF al instante, sin instalar nada. + +### Opción 2: Autoalojar con Docker + +> [!IMPORTANT] +> La conversión de archivos de Office requiere `SharedArrayBuffer`, que necesita las dos cosas siguientes: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - un contexto seguro +> +> `http://localhost` funciona para pruebas locales porque los navegadores consideran fiable la interfaz de loopback. `http://192.168.x.x` u otras IP de red local normalmente no, así que las conversiones de Word/Excel/PowerPoint requerirán HTTPS al acceder desde otros dispositivos de tu red. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF se distribuye en dos versiones: la **versión autoalojada** (`bentopdf-simple`, la usada arriba) para despliegues internos, de equipo u organización, y la **versión comercial** (`bentopdf:latest`) que usa el propio bentopdf.com y los titulares de licencia comercial con despliegues públicos. Ambas incluyen las mismas herramientas PDF: la versión comercial añade el hero, las preguntas frecuentes, los testimonios y el pie de página de bentopdf.com. Si tienes dudas, usa la versión autoalojada. + +Después abre `http://localhost:3000` en tu navegador. + +> [!NOTE] +> Si estás preparando un despliegue de OCR aislado de la red (air-gapped), además del worker de Tesseract, el runtime principal y los archivos traineddata, debes alojar internamente las fuentes de la capa de texto del OCR. La configuración completa está documentada en [Autoalojamiento](/es/self-hosting/), incluidos `VITE_OCR_FONT_BASE_URL` y el directorio incluido `ocr-fonts/`. + +### Opción 3: Compilar desde el código fuente + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funciones de un vistazo + +| Categoría | Herramientas | +| ----------------------- | --------------------------------------------------------------- | +| **Convertir a PDF** | Word, Excel, PowerPoint, imágenes, Markdown, EPUB, MOBI y más | +| **Convertir desde PDF** | JPG, PNG, texto, Excel, SVG y más | +| **Editar y anotar** | Firmar, resaltar, censurar, rellenar formularios, añadir sellos | +| **Organizar** | Unir, dividir, rotar, eliminar páginas, reordenar | +| **Optimizar** | Comprimir, reparar, aplanar, OCR | +| **Seguridad** | Cifrar, descifrar, quitar restricciones | + +## Compatibilidad con navegadores + +BentoPDF funciona mejor en navegadores modernos: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Siguientes pasos + +- [Explorar todas las herramientas](/es/tools/) +- [Autoalojar BentoPDF](/es/self-hosting/) +- [Contribuir al proyecto](/es/contributing) diff --git a/docs/es/index.md b/docs/es/index.md new file mode 100644 index 00000000..f8a54c38 --- /dev/null +++ b/docs/es/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Herramientas PDF gratuitas y de código abierto' + tagline: Procesa PDF por completo en tu navegador. Sin cargas. Sin servidores. Privacidad total. + actions: + - theme: brand + text: Empezar + link: /es/getting-started + - theme: alt + text: Ver herramientas + link: /es/tools/ + - theme: alt + text: Autoalojar + link: /es/self-hosting/ + - theme: alt + text: Licencia comercial + link: /es/licensing + +features: + - icon: 🔒 + title: 100% privado + details: Tus archivos nunca salen de tu dispositivo. Todo el procesamiento ocurre en local en tu navegador mediante WebAssembly. + - icon: ⚡ + title: Rápido y gratuito + details: Sin registros, sin límites, sin marcas de agua. Procesa PDF ilimitados gratis, para siempre. + - icon: 🛠️ + title: Más de 50 herramientas + details: Convierte, edita, une, divide, comprime, firma, aplica OCR y más. Todo lo que necesitas en un solo lugar. + + - icon: 🌐 + title: Autoalojable + details: Despliégalo en tu propia infraestructura. Docker, Vercel, Netlify, AWS o entornos totalmente aislados de la red con workers de OCR, datos de idioma y fuentes de capa de texto autoalojados. +--- + +## OCR sin conexión + +Si autoalojas BentoPDF en un entorno aislado de la red o sin conexión, el OCR necesita algo más que el worker de Tesseract y los archivos traineddata. La salida de PDF con texto buscable también necesita que las fuentes de la capa de texto del OCR se sirvan internamente. +Consulta [Autoalojamiento](/es/self-hosting/) para ver la configuración completa, incluidos `VITE_OCR_FONT_BASE_URL`, el directorio incluido `ocr-fonts/` y el flujo de trabajo aislado actualizado. diff --git a/docs/es/licensing.md b/docs/es/licensing.md new file mode 100644 index 00000000..eec02a61 --- /dev/null +++ b/docs/es/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/es/self-hosting/#configuracion-de-wasm-componentes-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/es/self-hosting/apache.md b/docs/es/self-hosting/apache.md new file mode 100644 index 00000000..58f1c169 --- /dev/null +++ b/docs/es/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Desplegar con Apache + +Aloja BentoPDF con Apache HTTP Server. + +## Requisitos previos + +- Apache 2.4+ +- mod_rewrite habilitado +- Certificado SSL (recomendado) + +## Paso 1: Compilar el proyecto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Para personalizar la marca, define variables de entorno antes de compilar: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Paso 2: Copiar los archivos + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Paso 3: Configuración de Apache + +Crea `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Paso 4: .htaccess para el enrutamiento + +Crea `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Paso 5: Habilitar los módulos necesarios + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Paso 6: Habilitar el sitio + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Despliegue en un subdirectorio + +Para alojarlo en `/pdf/`: + +1. Compila con la URL base: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Actualiza `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Solución de problemas + +### Errores 404 de WASM + +Asegúrate de que el tipo MIME esté configurado: + +```apache +AddType application/wasm .wasm +``` + +### Firmar PDF o el rellenador de formularios muestra un visor en blanco (error MIME de `.mjs`) + +Si la consola del navegador muestra: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...y la solicitud que falla termina en `.mjs`, a tu configuración de Apache le falta la asignación `.mjs → application/javascript`. El visor de PDF incluido usa módulos ES con extensión `.mjs`, y el `mime.types` de serie de Apache no los incluye por defecto. + +Añade esto a tu VirtualHost o a `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Después recarga Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Para confirmarlo: en las DevTools del navegador, pestaña Network, busca la solicitud `.mjs` que falla y revisa la cabecera de respuesta `Content-Type`. Ahora debería ser `application/javascript`, no `application/octet-stream`. + +### La reescritura no funciona + +Comprueba que mod_rewrite esté habilitado: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel a PDF no funciona + +LibreOffice WASM requiere `SharedArrayBuffer`, que necesita estas cabeceras: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +También necesita un contexto seguro. `http://localhost` funciona para pruebas locales, pero `http://192.168.x.x` u otras IP de red local normalmente requieren HTTPS. Si las cabeceras están presentes pero `window.crossOriginIsolated` sigue siendo `false`, comprueba si la página se abre por HTTP simple desde un origen que no es de loopback. + +Los archivos precomprimidos `.wasm.gz` y `.data.gz` también necesitan el `Content-Encoding` correcto: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Asegúrate de que `mod_headers` esté habilitado: `sudo a2enmod headers` + +### Permiso denegado + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/es/self-hosting/aws.md b/docs/es/self-hosting/aws.md new file mode 100644 index 00000000..6974002d --- /dev/null +++ b/docs/es/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Desplegar en AWS S3 + CloudFront + +Aloja BentoPDF en AWS para obtener el máximo control y escalabilidad. + +## Arquitectura + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Paso 1: Crear el bucket de S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Paso 2: Compilar y subir + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Paso 3: Crear la distribución de CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +O usa la consola de AWS: + +1. Ve a CloudFront → Create distribution +2. Origin domain: selecciona tu bucket de S3 +3. Activa "Origin Access Control" +4. Default root object: `index.html` +5. Crea la distribución + +## Paso 3b: Política de cabeceras de respuesta (necesaria para LibreOffice WASM) + +Las conversiones basadas en LibreOffice (Word, Excel, PowerPoint a PDF) requieren `SharedArrayBuffer`, que necesita cabeceras de respuesta específicas. Crea una Response Headers Policy de CloudFront: + +1. Ve a CloudFront → Policies → Response headers +2. Crea una política personalizada con estas cabeceras: + +| Cabecera | Valor | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Asocia la política al comportamiento de caché predeterminado de tu distribución + +O mediante la CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Paso 3c: Metadatos de S3 para los archivos WASM precomprimidos + +Los archivos WASM de LibreOffice están precomprimidos (`.wasm.gz`, `.data.gz`). Define el Content-Type y el Content-Encoding correctos para que los navegadores los descompriman: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Importante +Sin la política de cabeceras de respuesta, `SharedArrayBuffer` no está disponible y las conversiones de LibreOffice WASM se quedarán colgadas en torno al 55 %. Sin el Content-Encoding correcto en los archivos `.gz`, el navegador recibe bytes gzip sin procesar y la compilación de WASM falla. +::: + +## Paso 4: Política del bucket de S3 + +Permite que CloudFront acceda al bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Paso 5: Páginas de error personalizadas + +Configura el 404 para que devuelva `index.html` y funcione el enrutamiento SPA: + +1. CloudFront → Error pages +2. Crea una respuesta de error personalizada: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Estimación de costes + +| Recurso | Coste estimado | +| ---------------------------------- | -------------- | +| Almacenamiento S3 (~500MB) | ~$0.01/mes | +| CloudFront (1TB de transferencia) | ~$85/mes | +| CloudFront (10GB de transferencia) | ~$0.85/mes | + +::: tip +Usa S3 Intelligent Tiering para optimizar costes en archivos a los que se accede con poca frecuencia. +::: + +## Automatización con Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/es/self-hosting/cloudflare.md b/docs/es/self-hosting/cloudflare.md new file mode 100644 index 00000000..8370f58a --- /dev/null +++ b/docs/es/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Desplegar en Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) ofrece alojamiento estático global y rápido con ancho de banda ilimitado. + +## Despliegue rápido + +1. Ve a [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Haz clic en "Create a project" +3. Conecta tu repositorio de GitHub + +## Configuración de compilación + +| Ajuste | Valor | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Variables de entorno + +Añádelas en Settings → Environment variables: + +| Variable | Value | +| ----------------------- | ------------------------------------------------------------ | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (opcional) | +| `VITE_BRAND_NAME` | Nombre de marca personalizado (opcional) | +| `VITE_BRAND_LOGO` | Ruta del logo relativa a `public/` (opcional) | +| `VITE_FOOTER_TEXT` | Texto personalizado de pie/copyright (opcional) | +| `VITE_DEFAULT_LANGUAGE` | Idioma predeterminado de la interfaz, p. ej. `fr` (opcional) | + +## Archivo de configuración + +Crea `_headers` en tu carpeta `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Importante +Las cabeceras `Cross-Origin-Embedder-Policy` y `Cross-Origin-Opener-Policy` son necesarias para las conversiones de Word/ODT/Excel/PowerPoint a PDF. Sin ellas, `SharedArrayBuffer` no está disponible y el motor LibreOffice WASM no se podrá inicializar. +::: + +Crea `_redirects` para el enrutamiento SPA: + +``` +/* /index.html 200 +``` + +## Dominio personalizado + +1. Ve a tu proyecto de Pages +2. Haz clic en "Custom domains" +3. Añade tu dominio +4. Cloudflare configurará el DNS automáticamente si el dominio está en Cloudflare + +## Ventajas + +- **Ancho de banda ilimitado y gratuito** +- **CDN global** con más de 300 ubicaciones edge +- **HTTPS automático** +- **Despliegues de vista previa** para pull requests +- **Compilaciones rápidas** + +## Solución de problemas + +### Subida de archivos grandes + +Cloudflare Pages admite archivos de hasta 25 MB. Los módulos WASM deberían caber, pero si llegas a los límites, considera: + +```bash +# Split large files during build +npm run build +``` + +### Límites de tamaño del Worker + +Si usas Cloudflare Workers para un enrutamiento avanzado, ten en cuenta el límite de 1 MB de los planes gratuitos. + +## Worker de proxy CORS (para firmas digitales) + +La herramienta de firma digital necesita un proxy CORS para obtener las cadenas de certificados. Despliega el worker incluido: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Funciones de seguridad + +| Función | Descripción | +| --------------------------- | ------------------------------------ | +| **Restricciones de URL** | Solo se permiten URL de certificados | +| **Límite de tamaño** | Máx. 10MB por solicitud | +| **Limitación de velocidad** | 60 solicitudes/IP/min (requiere KV) | +| **Bloqueo de IP privadas** | Bloquea localhost e IP internas | + +### Activar la limitación de velocidad + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Compilar con la URL del proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +O con Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Nota:** Consulta el [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) para configurar la firma HMAC. diff --git a/docs/es/self-hosting/cors-proxy.md b/docs/es/self-hosting/cors-proxy.md new file mode 100644 index 00000000..bd61602f --- /dev/null +++ b/docs/es/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Proxy CORS para obtener certificados + +La herramienta de firma digital usa un proxy CORS para obtener los certificados de los emisores desde Autoridades de Certificación (CA) externas. Es necesario porque muchos servidores de CA no incluyen cabeceras CORS en sus respuestas, lo que impide la descarga directa desde el navegador. + +Además, muchos servidores de CA sirven los certificados por HTTP simple. Cuando tu instancia de BentoPDF se aloja por HTTPS, los navegadores bloquean estas solicitudes HTTP (política de contenido mixto). El proxy CORS resuelve ambos problemas al enrutar las solicitudes a través de un endpoint HTTPS con las cabeceras adecuadas. + +## Cómo funciona + +Al firmar un PDF con un certificado: + +1. La biblioteca `zgapdfsigner` intenta construir una cadena de certificados completa +2. Obtiene los certificados de los emisores desde las URL incluidas en la extensión AIA (Authority Information Access) de tu certificado +3. Estas solicitudes pasan por un proxy CORS que añade las cabeceras `Access-Control-Allow-Origin` necesarias +4. El proxy devuelve los datos del certificado al navegador + +## Autoalojar el proxy CORS + +Si autoalojas BentoPDF, tendrás que desplegar tu propio proxy CORS para que las firmas digitales funcionen con certificados que requieren obtener la cadena. + +### Opción 1: Cloudflare Workers (recomendada) + +1. **Instala la CLI de Wrangler**: + + ```bash + npm install -g wrangler + ``` + +2. **Inicia sesión en Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clona BentoPDF y actualiza los orígenes permitidos**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Abre `cors-proxy-worker.js` y cambia el array `ALLOWED_ORIGINS` por tu dominio: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Importante + Sin este cambio, el proxy rechazará todas las solicitudes de tu sitio con un error **403 Forbidden**. Por defecto solo permite solicitudes de `bentopdf.com`. + ::: + +4. **Despliega el proxy**: + + ```bash + wrangler deploy + ``` + + Anota la URL de tu worker (p. ej., `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Vuelve a compilar BentoPDF con la URL del proxy**: + + Si usas Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Si compilas desde el código fuente: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Opción 2: Proxy de backend personalizado + +También puedes crear tu propio endpoint de proxy. Los requisitos son: + +1. Aceptar solicitudes GET con un parámetro de consulta `url` +2. Obtener la URL desde tu servidor (sin restricciones CORS en el lado del servidor) +3. Devolver la respuesta con estas cabeceras: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Ejemplo de implementación con Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Consideraciones de seguridad + +El Cloudflare Worker incluido tiene varias medidas de seguridad: + +| Función | Descripción | +| ------------------------------ | ------------------------------------------------------------------------------------------------------ | +| **Validación de origen** | Solo permite solicitudes de los dominios incluidos en `ALLOWED_ORIGINS` | +| **Restricciones de URL** | Solo permite URL de certificados (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Bloqueo de IP privadas** | Bloquea rangos privados IPv4/IPv6, link-local, loopback, IP decimales y metadatos de la nube | +| **Seguridad del Content-Type** | Solo devuelve tipos MIME de certificado seguros y bloquea la inyección de content-type desde el origen | +| **Límite de tamaño** | Transmite la respuesta con un límite de 10MB y aborta la descarga si se supera | +| **Limitación de velocidad** | 60 solicitudes por minuto por IP o IPv6 /64 (requiere KV, permite el paso si KV falla) | +| **Firmas HMAC** | Firma opcional en el cliente (disuade el abuso casual) | + +### Reenlace de DNS (DNS rebinding) al autoalojar fuera de Cloudflare + +El worker rechaza cualquier URL que se resuelva a una IP privada o interna. No puede usar una lista fija de hosts permitidos, ya que las URL de la cadena de certificados apuntan a la CA que emitió el certificado (FNMT, CA corporativas, etc.), por lo que los destinos no se conocen de antemano. Eso deja una pequeña ventana de rebinding: quien controle el DNS de su propio dominio podría devolver una IP pública a la comprobación de seguridad y una privada a la solicitud real un instante después. + +En Cloudflare esto no es explotable: los Workers no pueden alcanzar IP privadas ni el endpoint de metadatos `169.254.169.254`, así que el rebinding no llega a nada. Simplemente no le des al worker una vía de entrada: no le asocies un Tunnel, un Service ni un binding de red privada (solo necesita `RATE_LIMIT_KV`). + +Si lo ejecutas fuera de Cloudflare (workerd, Node y similares) dentro de una VPC, el runtime _sí_ puede alcanzar IP internas. Coloca un firewall de salida delante y bloquea los rangos privados: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` y sus equivalentes IPv6. El código de la aplicación no puede imponerlo una vez que estás fuera de Cloudflare. + +## Desactivar el proxy + +Si no quieres usar un proxy CORS, define la variable de entorno como una cadena vacía: + +``` +VITE_CORS_PROXY_URL= +``` + +**Nota**: Sin el proxy, firmar con certificados que requieren obtener la cadena externamente (como FNMT o algunas CA corporativas) fallará con el error "Failed to fetch". + +## Solución de problemas + +### "Signing error: TypeError: Failed to fetch" + +Normalmente significa una de estas cosas: + +1. **No hay proxy CORS configurado**: define `VITE_CORS_PROXY_URL` y vuelve a compilar +2. **Contenido mixto bloqueado**: tu sitio usa HTTPS pero la URL del emisor del certificado es HTTP. El proxy CORS lo resuelve. +3. **El proxy CORS rechaza tu origen**: comprueba que tu dominio esté en el array `ALLOWED_ORIGINS` de `cors-proxy-worker.js` + +### "403 Forbidden" del proxy + +Tu dominio no está en la lista `ALLOWED_ORIGINS`. Edita `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Después vuelve a desplegar: `npx wrangler deploy` + +### Probar el proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certificados que funcionan sin proxy + +Algunos certificados incluyen la cadena completa en el archivo P12/PFX y no requieren obtención externa: + +- Certificados autofirmados +- Algunas CA comerciales que incluyen los certificados intermedios +- Certificados que has ensamblado manualmente con la cadena completa diff --git a/docs/es/self-hosting/docker.md b/docs/es/self-hosting/docker.md new file mode 100644 index 00000000..961360a2 --- /dev/null +++ b/docs/es/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Desplegar con Docker / Podman + +La forma más sencilla de autoalojar BentoPDF en un entorno de producción. + +> [!IMPORTANT] +> **Cabeceras necesarias para la conversión de archivos de Office** +> +> Las herramientas basadas en LibreOffice (conversión de Word, Excel y PowerPoint) requieren estas cabeceras HTTP para admitir `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> La página también debe servirse desde un contexto seguro. `http://localhost` funciona para pruebas locales, pero `http://192.168.x.x` u otras IP de red local normalmente no cumplen el requisito, así que la conversión de Office por HTTP simple fallará aunque las cabeceras estén presentes. +> +> Las imágenes de contenedor oficiales incluyen estas cabeceras. Si usas un proxy inverso (Traefik, Caddy, etc.), asegúrate de que estas cabeceras se conserven o se añadan, y usa HTTPS para el acceso que no sea loopback. + +> [!TIP] +> **Usuarios de Podman:** todos los comandos `docker` funcionan con Podman sustituyendo `docker` por `podman` y `docker-compose` por `podman-compose`. + +## Inicio rápido + +> [!TIP] +> BentoPDF se distribuye en dos versiones: +> +> - **Versión autoalojada**: `ghcr.io/alam00000/bentopdf-simple:latest`. Todas las herramientas PDF, **sin** el aparato de marketing (sin hero, preguntas frecuentes, testimonios ni pie de página). Úsala para despliegues internos, de equipo u organización. **No** es una versión "lite" con menos funciones. +> - **Versión comercial**: `ghcr.io/alam00000/bentopdf:latest`. El sitio de marketing completo, usado por el propio bentopdf.com y por los titulares de licencia comercial con despliegues públicos. +> +> Si tienes dudas: descarga la versión autoalojada. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Crea `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Ejecuta: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Crear tu propia imagen + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Compila y ejecuta: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Variables de entorno + +| Variable | Descripción | Predeterminado | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Compila la variante autoalojada (oculta el aparato de marketing de bentopdf.com: hero, preguntas frecuentes, testimonios y pie de página). Se mantienen todas las herramientas PDF. | `false` | +| `BASE_URL` | Desplegar en un subdirectorio | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL del módulo WASM de PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL del módulo WASM de Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL del módulo WASM de CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL del script del worker de OCR | _(vacío; usa la CDN predeterminada de Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Directorio del runtime principal de OCR | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_LANG_URL` | Directorio de traineddata de OCR | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Idiomas de OCR separados por comas que se muestran en la interfaz | _(vacío; muestra el catálogo completo)_ | +| `VITE_OCR_FONT_BASE_URL` | Directorio de fuentes de la capa de texto del OCR | _(vacío; usa las URL remotas de las fuentes Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Idioma predeterminado de la interfaz | `en` | +| `VITE_BRAND_NAME` | Nombre de marca personalizado | `BentoPDF` | +| `VITE_BRAND_LOGO` | Ruta del logo relativa a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Texto personalizado de pie/copyright | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | IDs de herramientas separados por comas para ocultar | _(vacío; todas las herramientas activadas)_ | +| `DISABLE_GITHUB_STARS` | Omite la obtención del contador de estrellas de GitHub al cargar la página y elimina `api.github.com` de la CSP. Las compilaciones en Simple Mode siempre la omiten. | `false` | +| `SITE_URL` | URL pública escrita en los enlaces canonical, hreflang y de sitemap. Déjala por defecto salvo que quieras que los buscadores traten tu despliegue como un sitio propio. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Con un `SITE_URL` personalizado, todas las páginas se marcan como `noindex` para que tu copia no compita con bentopdf.com en los resultados de búsqueda. Ponlo en `true` para que los buscadores la indexen. | `false` | + +Las URL de los módulos WASM vienen preconfiguradas con valores predeterminados de CDN, así que todas las funciones avanzadas funcionan desde el primer momento. Sobrescríbelas para despliegues aislados de la red o autoalojados. + +### Buscadores + +Por defecto, todas las páginas indican a los buscadores que el original es bentopdf.com, de modo que tu despliegue no aparece como duplicado. No necesitas cambiar nada para una instancia privada o interna. + +- **Mantener tu instancia fuera de los resultados de búsqueda por completo:** ejecuta el contenedor con `-e ROBOTS_NOINDEX=true`. Solo requiere un reinicio, no una nueva compilación. +- **Hacer que tu instancia sea un sitio propio en los resultados de búsqueda:** compila con `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Sin `ALLOW_INDEXING=true`, un `SITE_URL` personalizado marca todas las páginas como `noindex`. + +### Content-Security-Policy + +La imagen de nginx incluye una cabecera `Content-Security-Policy` en modo de aplicación. Las directivas `script-src`, `connect-src` y `font-src` de la CSP se **generan en tiempo de compilación** a partir de las variables de URL `VITE_*` anteriores: los hosts que pases mediante `--build-arg` se añaden automáticamente a la política. + +Como resultado: + +- Si sobrescribes `VITE_CORS_PROXY_URL` o `VITE_WASM_*_URL` al compilar, la CSP permite esos orígenes automáticamente, sin configuración adicional. +- Para las URL en `cdn.jsdelivr.net`, `script-src` solo permite la carpeta exacta del paquete con su versión, por ejemplo `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, no toda la CDN. jsDelivr sirve cualquier paquete público de npm o repositorio de GitHub, así que permitir todo el host dejaría que cualquiera de ellos se ejecutara en tu instancia. Las URL de cualquier otro host se permiten por origen. +- Si configuras URL de WASM personalizadas en _tiempo de ejecución_ desde la página de Ajustes avanzados de la aplicación, esos orígenes **no** están en la CSP y el navegador bloqueará las solicitudes a ellos. Esto también se aplica a una versión distinta del mismo paquete en `cdn.jsdelivr.net`, porque solo se permite la versión definida al compilar. La configuración en tiempo de ejecución está pensada para experimentar; para URL personalizadas permanentes, define el build arg `VITE_*` correspondiente. +- Los despliegues aislados de la red que sobrescriben los tres valores `VITE_WASM_*_URL` también eliminan de la CSP esas carpetas de paquete de `cdn.jsdelivr.net` (cada valor predeterminado se sustituye, no se añade). Los valores predeterminados de Tesseract OCR en `cdn.jsdelivr.net` permanecen en la política hasta que también definas los tres valores `VITE_TESSERACT_*`. Del mismo modo, definir `VITE_CORS_PROXY_URL` sustituye el valor público predeterminado `bentopdf-cors-proxy.bentopdf.workers.dev`. + +La CSP incluye `'unsafe-eval'` en `script-src` porque el runtime WASM de LibreOffice (usado por las herramientas de conversión de Word/Excel/PowerPoint) y la biblioteca de imágenes wasm-vips (usada por PDF a TIFF) compilan código de despacho interno mediante `new Function()`. Quitarlo rompería esas herramientas. Si compilas en `SIMPLE_MODE` (sin LibreOffice) y no necesitas PDF a TIFF, puedes editar manualmente el `security-headers.conf` generado para eliminar `'unsafe-eval'` y obtener una política más estricta. + +Para el OCR, deja vacías las variables `VITE_TESSERACT_*` para usar los recursos en línea predeterminados, o define las tres juntas para un OCR autoalojado o sin conexión. Las sobrescrituras parciales de OCR se rechazan porque el worker, el runtime principal y el directorio de traineddata deben coincidir. Para una salida de PDF con texto buscable totalmente sin conexión, define también `VITE_OCR_FONT_BASE_URL` para que las fuentes de la capa de texto del OCR se carguen desde tu servidor interno en lugar de las URL públicas de las fuentes Noto. + +`VITE_DEFAULT_LANGUAGE` define el idioma de la interfaz para quienes visitan por primera vez. Valores admitidos: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Los usuarios pueden seguir cambiando de idioma: esto solo cambia el valor predeterminado. + +Ejemplo: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Marca personalizada + +Sustituye el logo, el nombre y el texto de pie de BentoPDF por los tuyos. Coloca tu archivo de logo en la carpeta `public/` (o usa una imagen existente) y pasa las variables de marca al compilar: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La marca personalizada funciona tanto en el modo completo como en Simple Mode, y se puede combinar con todas las demás opciones de tiempo de compilación. + +### Desactivar herramientas concretas + +Oculta herramientas de la interfaz por requisitos de cumplimiento o seguridad. Las herramientas desactivadas desaparecen de la página de inicio, los resultados de búsqueda, los atajos de teclado y el constructor de flujos de trabajo. Si se accede directamente por URL, se muestra una página de "herramienta no disponible". + +Los ID de herramienta son la URL de la página sin `.html`. Por ejemplo, si la herramienta está en `bentopdf.com/edit-pdf.html`, el ID es `edit-pdf`. + +#### Encontrar los ID de herramienta + +La forma más fácil: abre cualquier herramienta en BentoPDF y mira la URL. La última parte de la ruta (sin `.html`) es el ID de la herramienta. + +
+Lista completa de ID de herramientas + +**Editar y anotar:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Convertir a PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Convertir desde PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organizar y gestionar:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimizar y reparar:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Seguridad:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Opción 1: En tiempo de compilación (build arg de Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Esto incorpora la lista de herramientas desactivadas en el bundle de JavaScript. Para cambiarla hay que volver a compilar. + +#### Opción 2: En tiempo de ejecución (config.json) + +Monta un archivo `config.json` en el directorio servido, sin necesidad de recompilar: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +O con Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Ambos métodos se pueden combinar: las listas se fusionan. Si una herramienta aparece en cualquiera de ellas, se desactiva. + +#### Desactivar funciones del editor + +También puedes desactivar funciones concretas dentro del editor de PDF (p. ej., censura, anotaciones, formularios) sin desactivar toda la herramienta del editor. Añade `editorDisabledCategories` a tu `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Lista completa de categorías del editor + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Anotación:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Formas:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulario:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Censura:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Documento:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Página:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Herramientas:** `tools`, `pan`, `pointer`, `capture` + +**Selección:** `selection`, `selection-copy` + +**Historial:** `history`, `history-undo`, `history-redo` + +
+ +Las categorías son jerárquicas: al desactivar una categoría padre (p. ej., `annotation`) se desactivan todas sus hijas. + +### Desactivar el contador de estrellas de GitHub + +La barra de navegación muestra un contador de estrellas de GitHub en vivo, obtenido de `api.github.com` al cargar la página. Es la única solicitud externa que no sirve a una función de PDF. Desactívalo al compilar para eliminar el código de obtención del bundle y quitar `api.github.com` de la Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Las compilaciones en Simple Mode (`bentopdf-simple`) siempre omiten el contador de estrellas: este indicador solo hace falta en la versión comercial o en compilaciones completas personalizadas. + +### URL de WASM personalizadas (aisladas de la red / autoalojadas) + +> [!IMPORTANT] +> Las URL de WASM se incorporan al JavaScript en **tiempo de compilación**. Los archivos WASM los descarga el **navegador del usuario** en tiempo de ejecución: Docker no los descarga durante la compilación. Para redes aisladas, debes alojar los archivos WASM en un servidor interno al que lleguen los navegadores. + +**Flujo de trabajo completo para redes aisladas:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Usa los códigos que muestra `bash scripts/prepare-airgap.sh --list-ocr-languages`, o busca por nombre con `bash scripts/prepare-airgap.sh --search-ocr-language `, para `--ocr-languages`. Si compilas con un subconjunto restringido de OCR, pasa los mismos códigos a `VITE_TESSERACT_AVAILABLE_LANGUAGES` para que la aplicación solo muestre los idiomas incluidos. Para una salida de OCR totalmente sin conexión, aloja también el directorio incluido `ocr-fonts/` y apunta `VITE_OCR_FONT_BASE_URL` hacia él. + +Define una variable como cadena vacía para desactivar ese módulo (los usuarios deberán configurarlo manualmente en Ajustes avanzados). + +## Puerto personalizado + +Por defecto, BentoPDF escucha en el puerto `8080` dentro del contenedor. Para cambiarlo, define la variable de entorno `PORT` en tiempo de ejecución: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variable | Descripción | Predeterminado | +| -------- | ------------------------------------------- | -------------- | +| `PORT` | Puerto de escucha de Nginx en el contenedor | `8080` | + +Funciona tanto con el Dockerfile estándar como con el nonroot. + +## ID de usuario personalizado (PUID/PGID) + +Para entornos que requieren ejecutarse como un usuario concreto que no sea root (dispositivos NAS, Kubernetes con contextos de seguridad, políticas de la organización), BentoPDF ofrece un Dockerfile aparte con compatibilidad PUID/PGID al estilo LSIO. + +### Compilar y ejecutar + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Variables de entorno + +| Variable | Descripción | Predeterminado | +| -------------- | --------------------------------- | -------------- | +| `PUID` | ID de usuario con el que ejecutar | `1000` | +| `PGID` | ID de grupo con el que ejecutar | `1000` | +| `PORT` | Puerto de escucha de Nginx | `8080` | +| `DISABLE_IPV6` | Desactivar el listener IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Cómo funciona + +El contenedor se inicia como root, crea un usuario con el PUID/PGID indicado, ajusta la propiedad de todos los directorios con permiso de escritura y después reduce privilegios con `su-exec`. El proceso de nginx se ejecuta íntegramente como el usuario que indiques. + +> [!NOTE] +> El `Dockerfile` estándar usa `nginx-unprivileged` (UID 101) y es el recomendado para la mayoría de los despliegues. Usa `Dockerfile.nonroot` solo cuando necesites un UID/GID concreto. + +> [!WARNING] +> PUID/PGID no pueden ser `0` (root). El entrypoint valida los valores y terminará con un error si son inválidos. + +## Con Traefik (proxy inverso) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Con Caddy (proxy inverso) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Límites de recursos + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (integración con systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) te permite ejecutar contenedores de Podman como servicios de systemd. Es ideal para despliegues de producción en sistemas Linux. + +### Configuración básica de Quadlet + +Crea un archivo de unidad de contenedor en `~/.config/containers/systemd/bentopdf.container` (usuario) o `/etc/containers/systemd/bentopdf.container` (sistema): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Habilitar e iniciar + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Para un despliegue a nivel de sistema, usa `systemctl` sin la opción `--user` y coloca el archivo en `/etc/containers/systemd/`. + +### Quadlet con comprobación de estado + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Actualización automática con Quadlet + +Podman puede actualizar los contenedores automáticamente cuando hay imágenes nuevas disponibles: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Configuración de red de Quadlet + +Para una configuración de red personalizada, crea un archivo de red `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Después haz referencia a él en tu archivo de contenedor: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Actualización + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/es/self-hosting/hostinger.md b/docs/es/self-hosting/hostinger.md new file mode 100644 index 00000000..c03f4465 --- /dev/null +++ b/docs/es/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Desplegar en Hostinger + +[Hostinger](https://hostinger.com) es un proveedor de alojamiento compartido muy popular. Esta guía explica cómo desplegar BentoPDF en el alojamiento compartido de Hostinger. + +## Requisitos previos + +- Plan de alojamiento de Hostinger con acceso al administrador de archivos +- Node.js instalado localmente para compilar + +## Paso 1: Compilar el proyecto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Los archivos compilados estarán en la carpeta `dist`. + +## Paso 2: Subir a Hostinger + +### Despliegue en el dominio raíz + +1. Inicia sesión en tu cuenta de Hostinger +2. Ve a **File Manager** → **public_html** +3. **Elimina** los archivos existentes (haz una copia de seguridad si hace falta) +4. **Sube** todo el contenido de tu carpeta local `dist` a `public_html` + +### Despliegue en un subdirectorio + +Si despliegas en un subdirectorio (p. ej., `yourdomain.com/pdf-tools/`): + +1. Compila con la URL base correcta: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Crea la carpeta en Hostinger: + - Ve a **File Manager** → **public_html** + - Crea una carpeta nueva: `pdf-tools` +3. Sube todo el contenido de `dist` a `public_html/pdf-tools/` + +## Paso 3: Crear el archivo .htaccess + +Crea un archivo `.htaccess` en la raíz de tu carpeta de despliegue (`public_html` o `public_html/pdf-tools/`): + +::: warning Importante +Para el despliegue en un subdirectorio, cambia `RewriteBase /` por `RewriteBase /pdf-tools/` (o el nombre de tu carpeta). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Ejemplo de .htaccess para un subdirectorio + +Para `yourdomain.com/pdf-tools/`, actualiza estas líneas: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Solución de problemas + +### Los archivos WASM no se cargan + +Asegúrate de que los tipos MIME estén bien definidos en `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Las herramientas de LibreOffice no funcionan + +Las cabeceras de seguridad son críticas para SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Si las cabeceras no se aplican, contacta con el soporte de Hostinger para que habiliten `mod_headers`. + +### Errores 404 al recargar la página + +Asegúrate de que la regla de la extensión `.html` y las rutas de idioma estén bien configuradas. BentoPDF usa archivos HTML estáticos, no enrutamiento SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Límites de subida de archivos + +Hostinger puede tener límites de tamaño de archivo. Sube los archivos WASM por separado si falla la subida en bloque. diff --git a/docs/es/self-hosting/index.md b/docs/es/self-hosting/index.md new file mode 100644 index 00000000..128df549 --- /dev/null +++ b/docs/es/self-hosting/index.md @@ -0,0 +1,538 @@ +# Guía de autoalojamiento + +BentoPDF se puede autoalojar en tu propia infraestructura. Esta guía cubre las distintas opciones de despliegue. + +## Inicio rápido con Docker / Podman + +La forma más rápida de autoalojar BentoPDF: + +> [!TIP] +> BentoPDF se distribuye en dos compilaciones: +> +> - **Compilación autoalojada**: `ghcr.io/alam00000/bentopdf-simple:latest`. Todas las herramientas de PDF, **sin** el aparato de marketing (sin hero, preguntas frecuentes, testimonios ni pie de página). Úsala para despliegues internos, de equipo o de organización. **No** es una versión "lite" con menos funciones. +> - **Compilación comercial**: `ghcr.io/alam00000/bentopdf:latest`. El sitio de marketing completo, que usa el propio bentopdf.com y los titulares de licencias comerciales que ejecutan despliegues de cara al público. +> +> Si dudas: descarga la compilación autoalojada. + +> [!IMPORTANT] +> La conversión de archivos de Office requiere `SharedArrayBuffer`, lo que significa que la aplicación debe estar aislada entre orígenes (cross-origin isolated) y servirse desde un contexto seguro. La imagen oficial ya envía las cabeceras COOP/COEP necesarias, pero los navegadores siguen desactivando `SharedArrayBuffer` en orígenes HTTP simples de red local, como `http://192.168.x.x`. +> +> Usa `http://localhost` solo para pruebas en el mismo dispositivo. Si los usuarios acceden a BentoPDF mediante una IP o un nombre de host de la red local, termina la conexión con HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +O con Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Ejecuta BentoPDF como un servicio de systemd. Crea `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Consulta la [guía de despliegue con Docker](/es/self-hosting/docker) para ver la documentación completa de Quadlet. + +## Compilar desde el código fuente + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Opciones de configuración + +### Compilación autoalojada (Modo Simple) + +La compilación autoalojada (la imagen `bentopdf-simple`, también llamada Modo Simple) es **funcionalmente idéntica** a la compilación comercial: todas las herramientas de PDF están presentes y se comportan igual. Simplemente oculta el aparato de marketing que solo tiene sentido en el propio bentopdf.com o en un despliegue comercial de cara al público. **No es una versión "lite" ni con menos funciones.** + +**Qué oculta la compilación autoalojada** (solo cosmético, no se elimina ninguna función de PDF): + +- Barra de navegación, sección hero, sección de características, preguntas frecuentes, testimonios, pie de página +- Cambia el título de la página a "Herramientas PDF" + +**Qué conserva la compilación autoalojada** (todo lo que realmente trabaja con PDF): + +- Todas las herramientas de PDF (fusionar, dividir, editar, firmar, OCR, conversión de Office, etc.) +- Compatibilidad con marca personalizada y toda la configuración de compilación y de tiempo de ejecución + +La compilación comercial (`ghcr.io/alam00000/bentopdf:latest`) es la que impulsa el propio bentopdf.com y la usan los titulares de licencias comerciales que ejecutan despliegues de cara al público. Añade el hero, las preguntas frecuentes, los testimonios y el pie de página, que no tendrían sentido en una herramienta interna. + +Si autoalojas BentoPDF para tu equipo, tu organización o como herramienta interna, descarga la compilación autoalojada: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Consulta [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) para ver todos los detalles. + +### Compilación comercial (despliegues de cara al público con tu propia marca) + +La compilación comercial (la imagen `bentopdf`, sin el sufijo `-simple`) es la que impulsa el propio bentopdf.com. Incluye el sitio de marketing completo (hero, características, preguntas frecuentes, testimonios, pie de página) además de todas las herramientas de PDF. Usa esta compilación cuando quieras **desplegar BentoPDF como un servicio de PDF de cara al público bajo tu propia marca**, por ejemplo: + +- Ejecutas BentoPDF como un SaaS alojado para usuarios finales en tu propio dominio +- Quieres la experiencia de la página de inicio (secciones de marketing y herramientas), no solo la superficie básica de herramientas +- Eres titular de una licencia comercial e integras BentoPDF en un producto comercial + +**Ejecútala tal cual** (con la marca BentoPDF, útil para previsualizar la compilación): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Compila con tu propia marca** (el flujo comercial típico): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Todas las demás opciones de compilación (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, sustitución de URL de WASM, etc.) funcionan igual que en la compilación autoalojada. + +::: warning Licencias +Ejecutar la compilación comercial está permitido bajo cualquiera de las dos opciones de licencia de BentoPDF: + +- **AGPL-3.0** (gratuita): permitida si tu despliegue publica todo su código fuente bajo AGPL, incluidas las modificaciones de marca y la lógica de negocio asociada. +- **Licencia comercial** (79 $ de por vida): necesaria para despliegues de código cerrado o propietarios en los que no publicas tu fork con la marca ni tu código de negocio. + +Consulta la [página de licencias](https://www.bentopdf.com/licensing) para ver la comparación completa. Los módulos WASM con licencia AGPL (PyMuPDF, Ghostscript, CoherentPDF) se cargan desde una CDN en tiempo de ejecución, por lo que no entran en tu imagen y no cambian tu situación de licencias. +::: + +### URL base + +Despliega en un subdirectorio: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Marca personalizada + +Sustituye el logotipo, el nombre y el texto del pie de página de BentoPDF por los tuyos en tiempo de compilación: + +| Variable | Descripción | Valor por defecto | +| ------------------ | ------------------------------------------------------------ | --------------------------------------- | +| `VITE_BRAND_NAME` | Nombre de marca que se muestra en el encabezado y el pie | `BentoPDF` | +| `VITE_BRAND_LOGO` | Ruta del logotipo relativa a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Texto personalizado del pie de página y de derechos de autor | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +O mediante Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La marca personalizada funciona tanto en el modo completo como en el Modo Simple, y se puede combinar con todas las demás opciones de compilación (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Desactivar herramientas específicas + +Oculta herramientas concretas por motivos de cumplimiento o seguridad. Las herramientas desactivadas se eliminan de la página de inicio, la búsqueda, los atajos, el generador de flujos de trabajo y el acceso directo por URL. + +Los ID de las herramientas son la URL de la página sin `.html`: abre cualquier herramienta y mira la URL (p. ej., `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**En tiempo de compilación** (incluido en el bundle): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**En tiempo de ejecución** (sin recompilar: monta un `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Se pueden combinar ambos métodos: las listas se fusionan. + +También puedes desactivar funciones específicas dentro del Editor de PDF (p. ej., la redacción) sin desactivar la herramienta completa, añadiendo `editorDisabledCategories` a `config.json`. Consulta la [guía de Docker](/es/self-hosting/docker#desactivar-funciones-del-editor) para ver la lista completa de categorías. + +## Guías de despliegue + +Elige tu plataforma: + +- [Vercel](/es/self-hosting/vercel) +- [Netlify](/es/self-hosting/netlify) +- [Cloudflare Pages](/es/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/es/self-hosting/aws) +- [Hostinger](/es/self-hosting/hostinger) +- [Nginx](/es/self-hosting/nginx) +- [Apache](/es/self-hosting/apache) +- [Docker](/es/self-hosting/docker) +- [Kubernetes](/es/self-hosting/kubernetes) +- [Proxy CORS](/es/self-hosting/cors-proxy): necesario para las firmas digitales + +## Problemas comunes + +### La conversión de Word / ODT / Excel / PowerPoint a PDF se cuelga (SharedArrayBuffer no disponible) + +**Síntoma**: las conversiones de documentos basadas en LibreOffice (Word, ODT, Excel, PowerPoint a PDF) se quedan colgadas en torno al 55% o no llegan a iniciarse. La consola del navegador puede mostrar: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...o `window.crossOriginIsolated` devuelve `false`, o la compilación de WASM informa `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Causa**: LibreOffice WASM requiere `SharedArrayBuffer`, que el navegador solo activa cuando la página está **aislada entre orígenes (cross-origin isolated)** Y se sirve desde un **contexto seguro**. Eso significa que deben cumplirse dos cosas: + +1. Todas las respuestas incluyen ambas cabeceras: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. La página se sirve desde `https://...` o `http://localhost`. HTTP simple sobre una IP de red local (p. ej. `http://192.168.x.x`) NO cuenta como seguro: los navegadores desactivan `SharedArrayBuffer` allí. + +La discrepancia `00 61 73 6d / 1f 8b 08 08` es un subsíntoma distinto: a los archivos precomprimidos `.wasm.gz` / `.data.gz` les falta la cabecera de respuesta `Content-Encoding: gzip`, por lo que el navegador recibe bytes gzip sin procesar en lugar de WASM descomprimido. + +**Solución**: consulta la guía de despliegue de tu plataforma para ver la configuración exacta: + +- [Nginx →](/es/self-hosting/nginx#la-conversion-de-word-odt-excel-a-pdf-no-funciona) +- [Apache →](/es/self-hosting/apache#word-odt-excel-a-pdf-no-funciona) +- [AWS S3 + CloudFront →](/es/self-hosting/aws#paso-3b-politica-de-cabeceras-de-respuesta-necesaria-para-libreoffice-wasm) +- [Cloudflare Pages →](/es/self-hosting/cloudflare#archivo-de-configuracion) (archivo `_headers`) +- [Netlify →](/es/self-hosting/netlify#la-conversion-de-word-odt-excel-a-pdf-se-queda-atascada-en-el-55) (`netlify.toml`) +- [Vercel →](/es/self-hosting/vercel#la-conversion-de-word-odt-excel-a-pdf-no-funciona) (`vercel.json`) +- [Hostinger →](/es/self-hosting/hostinger#las-herramientas-de-libreoffice-no-funcionan) (`.htaccess`) +- [Kubernetes →](/es/self-hosting/kubernetes#como-comprobar-que-las-cabeceras-de-sharedarraybuffer-siguen-funcionando-ingress-gateway) +- **Docker**: lo gestiona automáticamente la configuración de nginx incluida, no hace falta hacer nada. + +**Verificación**: abre la consola de DevTools en cualquier página de BentoPDF y ejecuta: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Si la página usa HTTPS o `http://localhost` Y ambas cabeceras COEP/COOP están presentes en todas las respuestas, ambas comprobaciones se superan. Si estás en `http://192.168.x.x` u otro origen HTTP que no sea de loopback, termina la conexión con HTTPS: no hay una solución que dependa solo de cabeceras. + +### Archivos `.mjs` servidos como `application/octet-stream` + +**Síntoma**: Firmar PDF / Rellenar formularios / otras herramientas muestran un visor en blanco o no se cargan. La consola del navegador informa: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Causa**: tu servidor web o proxy inverso no tiene una asignación de tipo MIME para los archivos `.mjs` (el visor de PDF incluido incorpora módulos ES con esa extensión). Muchas configuraciones de servidor por defecto usan `application/octet-stream` para las extensiones desconocidas, y los navegadores se niegan a ejecutarlas como módulos ES. + +**Solución**: consulta la guía de despliegue de tu plataforma para ver el fragmento exacto: + +- [Nginx →](/es/self-hosting/nginx#firmar-pdf-o-rellenar-formularios-muestra-un-visor-en-blanco-error-mime-de-mjs) +- [Apache →](/es/self-hosting/apache#firmar-pdf-o-el-rellenador-de-formularios-muestra-un-visor-en-blanco-error-mime-de-mjs) +- [AWS S3 + CloudFront →](/es/self-hosting/aws#paso-2-compilar-y-subir) (consulta `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/es/self-hosting/kubernetes#errores-de-tipo-mime-de-mjs-iframe-en-blanco-en-firmar-pdf-rellenar-formularios) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: se gestiona automáticamente, no hace falta hacer nada. + +**Verificación**: abre DevTools → pestaña Network, busca la petición `.mjs` que falla y revisa la cabecera de respuesta `Content-Type`. Debería ser `application/javascript`. Si sigue siendo `application/octet-stream`, puede que un proxy inverso o una CDN externos estén volviendo a detectar el tipo: revisa cada capa de tu cadena de servicio. + +## Configuración de WASM (componentes AGPL) + +BentoPDF **no incluye** en su código fuente las bibliotecas de procesamiento con licencia AGPL, pero **preconfigura las URL de CDN** para que todas las funciones funcionen de inmediato, sin configuración manual. + +::: tip Cero configuración por defecto +Desde la v2.0.0, los módulos WASM están preconfigurados para cargarse desde la CDN de jsDelivr mediante variables de entorno. Todas las funciones avanzadas funcionan de inmediato sin ninguna configuración del usuario. +::: + +| Componente | Licencia | Funciones | +| --------------- | -------- | ----------------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Conversión de EPUB/MOBI/FB2/XPS, extracción de imágenes, extracción de tablas | +| **Ghostscript** | AGPL-3.0 | Conversión a PDF/A, compresión, corrección de inclinación, rasterización | +| **CoherentPDF** | AGPL-3.0 | Tabla de contenido, adjuntos, fusión de PDF con marcadores | + +### Variables de entorno por defecto + +Se definen en `.env.production` y se incluyen en la compilación: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Sustituir las URL de WASM + +Puedes sustituir los valores por defecto en tiempo de compilación para despliegues personalizados: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Para desactivar un módulo por completo (requiere configuración manual del usuario en Ajustes avanzados), asigna una cadena vacía a su variable. + +Para OCR, deja vacías todas las variables `VITE_TESSERACT_*` y mantén los recursos en línea por defecto, o define juntas las URL de worker, core e idiomas para un OCR autoalojado o sin conexión. Si incluyes solo idiomas de OCR concretos, define también `VITE_TESSERACT_AVAILABLE_LANGUAGES` con los mismos códigos separados por comas para que la interfaz solo ofrezca los idiomas instalados y las selecciones no admitidas fallen con un error descriptivo. Para obtener PDF con capa de texto totalmente sin conexión, define también `VITE_OCR_FONT_BASE_URL` con el directorio interno que sirve las fuentes de OCR incluidas. + +Los usuarios también pueden sustituir estos valores por defecto en cualquier momento mediante **Ajustes avanzados** en la interfaz: las sustituciones del usuario guardadas en el navegador tienen prioridad sobre los valores por defecto del entorno. + +### Despliegue aislado de la red / sin conexión + +Para redes sin acceso a internet (gobierno, sanidad, finanzas, etc.). Las URL de WASM se incluyen en el JavaScript en **tiempo de compilación**: los archivos WASM reales los descarga el **navegador del usuario** en tiempo de ejecución. Por eso debes preparar todo en una máquina con internet y luego transferirlo a la red aislada. + +#### Script automatizado (recomendado) + +El script incluido `prepare-airgap.sh` automatiza todo el proceso: descarga los paquetes WASM, compila la imagen de Docker y genera un paquete autocontenido con un script de configuración. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Esto genera un directorio con el paquete: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Transfiere el paquete a la red aislada mediante USB, un repositorio interno de artefactos o un método aprobado. Después ejecuta el script de configuración incluido: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +El script de configuración carga la imagen de Docker, extrae los archivos WASM y, opcionalmente, inicia el contenedor. + +**Opciones del script:** + +| Opción | Descripción | Valor por defecto | +| ------------------------------ | ----------------------------------------------------------- | ------------------------------------- | +| `--wasm-base-url ` | Dónde se alojarán los WASM internamente | _(obligatorio, se pregunta si falta)_ | +| `--image-name ` | Etiqueta de la imagen de Docker | `bentopdf` | +| `--output-dir ` | Directorio de salida del paquete | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Activa el Modo Simple | desactivado | +| `--base-url ` | URL base de subdirectorio (p. ej. `/pdf/`) | `/` | +| `--language ` | Idioma predeterminado de la interfaz (p. ej. `fr`, `de`) | _(ninguno)_ | +| `--brand-name ` | Nombre de marca personalizado | _(ninguno)_ | +| `--brand-logo ` | Ruta del logotipo relativa a `public/` | _(ninguno)_ | +| `--footer-text ` | Texto personalizado del pie de página | _(ninguno)_ | +| `--ocr-languages ` | Idiomas de OCR separados por comas que se incluirán | `eng` | +| `--list-ocr-languages` | Muestra los códigos y nombres de OCR admitidos y sale | desactivado | +| `--search-ocr-language ` | Busca códigos de OCR por nombre o abreviatura | desactivado | +| `--dockerfile ` | Dockerfile que se usará | `Dockerfile` | +| `--skip-docker` | Omite la compilación y exportación de Docker | desactivado | +| `--skip-wasm` | Omite la descarga de WASM (reutiliza los `.tgz` existentes) | desactivado | + +El prompt interactivo también acepta `list` para mostrar la lista completa de códigos de Tesseract admitidos y `search ` para encontrar coincidencias como `search german` o `search chi`. + +::: warning Requisito de mismo origen +Los archivos WASM deben servirse desde el **mismo origen** que la aplicación BentoPDF. Los Web Workers usan `importScripts()`, que no puede cargar scripts de otro origen. Por ejemplo, si BentoPDF se ejecuta en `https://internal.example.com`, la URL base de WASM también debe ser `https://internal.example.com/wasm`. +::: + +#### Pasos manuales + +
+Si prefieres hacerlo manualmente sin el script + +**Paso 1: Descargar los paquetes de WASM y OCR** (en una máquina con internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Paso 2: Compilar la imagen de Docker con URL internas** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Paso 3: Exportar la imagen de Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Paso 4: Transferir a la red aislada** + +Copia mediante USB, un repositorio interno de artefactos o un método de transferencia aprobado: + +- `bentopdf.tar`: la imagen de Docker +- Los cinco paquetes `.tgz` de WASM/OCR del Paso 1 +- El directorio `tesseract-langdata/` del Paso 1 +- El directorio `ocr-fonts/` del Paso 1 + +**Paso 5: Configurar dentro de la red aislada** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Asegúrate de que los archivos sean accesibles en las URL que configuraste en el Paso 2, incluidas `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` y `.../ocr/fonts`. + +
+ +::: info ¿Compilas desde el código fuente en lugar de usar Docker? +Define las variables en `.env.production` antes de ejecutar `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Alojar tu propio proxy de WASM + +Si necesitas servir archivos WASM con licencia AGPL con las cabeceras CORS adecuadas, puedes desplegar un proxy sencillo. Consulta la [guía del proxy de WASM en Cloudflare](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) para ver una implementación de ejemplo. + +::: tip ¿Por qué por separado? +Esta separación garantiza: + +- Un cumplimiento legal claro para los usuarios comerciales +- Que el núcleo de BentoPDF siga bajo su doble licencia (AGPL-3.0 / Comercial) +- Que los archivos WASM se carguen en tiempo de ejecución, no incluidos en el código fuente + ::: + +## Requisitos del sistema + +| Requisito | Mínimo | +| -------------- | --------------------------------- | +| Almacenamiento | ~100 MB (núcleo sin módulos AGPL) | +| RAM | 512 MB | +| CPU | Cualquier procesador moderno | + +::: tip +BentoPDF es un sitio estático: no se necesita base de datos ni servidor backend. +::: diff --git a/docs/es/self-hosting/kubernetes.md b/docs/es/self-hosting/kubernetes.md new file mode 100644 index 00000000..7a08df8f --- /dev/null +++ b/docs/es/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Despliegue con Kubernetes + +Kubernetes puede ser excesivo para un sitio estático, pero puede encajar muy bien si ya estandarizas con Helm + GitOps. + +> [!IMPORTANT] +> **Cabeceras necesarias para la conversión de archivos de Office** +> +> Las herramientas basadas en LibreOffice (conversión de Word, Excel y PowerPoint) requieren estas cabeceras HTTP para la compatibilidad con `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Las imágenes oficiales de BentoPDF con nginx incluyen estas cabeceras. En Kubernetes, **los controladores de Ingress/Gateway también son proxies inversos**, así que asegúrate de que estas cabeceras se conserven (o añádelas en el borde). + +## Requisitos previos + +- Clúster de Kubernetes +- Helm v3 +- Una imagen de BentoPDF con nginx (p. ej. `ghcr.io/alam00000/bentopdf:`) que sirva en el **puerto 8080** + +## Despliegue con Helm + +### Instalar desde este repositorio (chart local) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Instalar desde GHCR (chart OCI) + +Si el chart está publicado en GHCR como artefacto OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Exponerlo + +### Port-forward (prueba rápida) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (opcional) + +Activa Ingress (ejemplo para nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (opcional) + +Este chart es compatible con `Gateway` + `HTTPRoute` de Gateway API. + +Ejemplo (operador de Gateway API de Cloudflare): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Cómo comprobar que las cabeceras de SharedArrayBuffer siguen funcionando (Ingress/Gateway) + +### Lo que "debería" pasar + +La configuración de nginx de BentoPDF establece las cabeceras de respuesta necesarias. La mayoría de los controladores de Ingress/Gateway **pasan las cabeceras de respuesta del upstream sin modificarlas**. + +### Qué puede romperlo + +- Una política del controlador o del borde que **sobrescriba** o **elimine** cabeceras de respuesta +- Un middleware de "cabeceras de seguridad" que establezca valores de COOP/COEP distintos + +### Cómo verificarlo + +Ejecuta esto contra tu endpoint público: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Deberías ver: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Si tu controlador de Ingress no las conserva + +Añade las cabeceras en el borde (depende del controlador). Ejemplo para **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Errores de tipo MIME de `.mjs` (iframe en blanco en Firmar PDF / Rellenar formularios) + +Si la consola del navegador muestra `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` en una petición `.mjs`, un controlador de Ingress/Gateway situado delante del nginx de BentoPDF está reemplazando la cabecera `Content-Type` del upstream por `application/octet-stream`. + +El nginx de la imagen de BentoPDF ya sirve `.mjs` como `application/javascript`. La solución es evitar que el controlador la elimine o la reemplace. Para nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +O bien usa un filtro `ResponseHeaderModifier` en Gateway API para establecer `Content-Type: application/javascript` en las rutas `.mjs`. Verifica con DevTools → pestaña Network: la petición `.mjs` que fallaba ahora debería mostrar `content-type: application/javascript`. + +### Si usas Gateway API y quieres forzar la adición de cabeceras + +Gateway API admite un filtro `ResponseHeaderModifier`. Puedes asociarlo en `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +La compatibilidad con filtros concretos depende de tu controlador de Gateway; si se ignora un filtro, añade las cabeceras en la capa del borde o del controlador. + +## Desactivar herramientas específicas + +Usa un ConfigMap para desactivar herramientas en tiempo de ejecución sin reconstruir la imagen: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Móntalo en el directorio servido: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Los ID de las herramientas son la URL de la página sin `.html`: abre cualquier herramienta y mira la URL (p. ej., `edit-pdf`, `merge-pdf`, `compress-pdf`). Las herramientas desactivadas se ocultan en la página de inicio, la búsqueda, los atajos, el generador de flujos de trabajo y el acceso directo por URL. Consulta la [guía de Docker](/es/self-hosting/docker#desactivar-herramientas-concretas) para ver la lista completa de opciones. diff --git a/docs/es/self-hosting/netlify.md b/docs/es/self-hosting/netlify.md new file mode 100644 index 00000000..37ff1f9e --- /dev/null +++ b/docs/es/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Despliegue en Netlify + +[Netlify](https://netlify.com) ofrece un excelente alojamiento de sitios estáticos con un generoso plan gratuito. + +## Despliegue con un clic + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Despliegue manual + +### Paso 1: Conectar el repositorio + +1. Inicia sesión en [Netlify](https://app.netlify.com) +2. Haz clic en "Add new site" → "Import an existing project" +3. Conecta tu cuenta de GitHub +4. Selecciona tu fork de BentoPDF + +### Paso 2: Configurar los ajustes de compilación + +| Ajuste | Valor | +| ------------------------- | --------------- | +| Comando de compilación | `npm run build` | +| Directorio de publicación | `dist` | +| Versión de Node | 18+ | + +### Paso 3: Desplegar + +Haz clic en "Deploy site" y espera a que termine la compilación. + +## Archivo de configuración + +Crea `netlify.toml` en la raíz de tu proyecto: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Importante +Las cabeceras `Cross-Origin-Embedder-Policy` y `Cross-Origin-Opener-Policy` son necesarias para las conversiones de Word/ODT/Excel/PowerPoint a PDF. Sin ellas, `SharedArrayBuffer` no está disponible y el motor LibreOffice WASM no podrá inicializarse. + +Las cabeceras `Content-Encoding: gzip` en los archivos `.wasm.gz` y `.data.gz` indican al navegador que los descomprima automáticamente. Sin ellas, el navegador recibe bytes gzip sin procesar y la compilación de WASM falla. +::: + +## Variables de entorno + +Configúralas en Site settings → Environment variables: + +| Variable | Descripción | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Ponla en `true` para una compilación mínima | +| `VITE_BRAND_NAME` | Nombre de marca personalizado (reemplaza "BentoPDF") | +| `VITE_BRAND_LOGO` | Ruta del logotipo relativa a `public/` (p. ej. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Texto personalizado del pie de página y de derechos de autor | +| `VITE_DEFAULT_LANGUAGE` | Idioma predeterminado de la interfaz (p. ej. `fr`, `de`, `es`) | + +## Dominio personalizado + +1. Ve a Site settings → Domain management +2. Haz clic en "Add custom domain" +3. Sigue las instrucciones de configuración de DNS + +## Archivos multimedia grandes + +Para archivos WASM grandes, considera activar [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Solución de problemas + +### La conversión de Word/ODT/Excel a PDF se queda atascada en el 55% + +Si las conversiones de documentos se quedan colgadas en el 55%, abre la consola de DevTools y comprueba: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Si `crossOriginIsolated` es `false`, las cabeceras COEP/COOP de tu `netlify.toml` no se están aplicando. Asegúrate de que el archivo esté en la raíz de tu proyecto y vuelve a desplegar. + +Si ves `expected magic word 00 61 73 6d, found 1f 8b 08 08` en la consola, a los archivos `.wasm.gz` les faltan las cabeceras `Content-Encoding: gzip`. Asegúrate de que los bloques `[[headers]]` de `soffice.wasm.gz` y `soffice.data.gz` estén en tu `netlify.toml`. + +### Falla la compilación + +Comprueba la compatibilidad de la versión de Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Carga inicial lenta + +Activa la optimización de recursos en Site settings → Build & deploy → Asset optimization. diff --git a/docs/es/self-hosting/nginx.md b/docs/es/self-hosting/nginx.md new file mode 100644 index 00000000..7b8d37f5 --- /dev/null +++ b/docs/es/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Despliegue con Nginx + +Aloja BentoPDF en tu propio servidor con Nginx. + +## Requisitos previos + +- Servidor Ubuntu/Debian +- Nginx instalado +- Certificado SSL (recomendado: Let's Encrypt) + +## Paso 1: Compilar el proyecto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Para personalizar la marca, define variables de entorno antes de compilar: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Paso 2: Copiar los archivos + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Paso 3: Configuración de Nginx + +Crea `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Paso 4: Activar el sitio + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Paso 5: SSL con Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Despliegue en un subdirectorio + +Para alojarlo en `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Compila con: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Ajuste del rendimiento + +Añade a `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Solución de problemas + +### WASM no se carga + +Asegúrate de que el tipo MIME esté definido: + +```nginx +types { + application/wasm wasm; +} +``` + +### Firmar PDF o Rellenar formularios muestra un visor en blanco (error MIME de `.mjs`) + +Si la consola del navegador muestra: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...y la petición que falla termina en `.mjs`, a tu nginx le falta la asignación `.mjs → application/javascript`. El visor de PDF incluido (usado por Firmar PDF, Rellenar formularios y algunas otras herramientas) incorpora archivos de módulos ES con extensión `.mjs`, y el `mime.types` por defecto de nginx no los incluye. + +Para solucionarlo, añade `mjs` a la línea `application/javascript` existente en `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> NO añadas una _segunda_ línea `application/javascript`: nginx analiza `mime.types` línea por línea y solo prevalece una asignación de tipo a extensión, así que en algunas versiones la segunda línea se ignora sin avisar. Edita la línea existente para añadir `mjs` junto a `js`. + +O bien sobrescríbelo localmente dentro de tu bloque server (sin editar el archivo global): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Recarga nginx después del cambio: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Para confirmarlo: en DevTools del navegador → pestaña Network, busca la petición `.mjs` que fallaba y revisa la cabecera de respuesta `Content-Type`. Ahora debería ser `application/javascript`, no `application/octet-stream`. + +### La conversión de Word/ODT/Excel a PDF no funciona + +LibreOffice WASM requiere `SharedArrayBuffer`, que necesita las cabeceras `Cross-Origin-Embedder-Policy` y `Cross-Origin-Opener-Policy`. También necesita un contexto seguro, así que `http://localhost` sirve para pruebas locales, pero `http://192.168.x.x` u otras IP de la red local normalmente requieren HTTPS. Ten en cuenta que las directivas `add_header` de nginx dentro de un bloque `location` **sobrescriben** las directivas `add_header` del nivel de servidor: no se combinan. Todo bloque `location` con sus propios `add_header` debe incluir las cabeceras COEP/COOP. + +Verifica con: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Si usas un proxy inverso delante de nginx, asegúrate de que conserve estas cabeceras. + +### 502 Bad Gateway + +Revisa los registros de errores de Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/es/self-hosting/vercel.md b/docs/es/self-hosting/vercel.md new file mode 100644 index 00000000..47c7c46b --- /dev/null +++ b/docs/es/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Despliegue en Vercel + +[Vercel](https://vercel.com) ofrece la experiencia de despliegue más sencilla para sitios estáticos. + +## Despliegue con un clic + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Despliegue manual + +### Paso 1: Hacer un fork del repositorio + +Haz un fork de [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) en tu cuenta de GitHub. + +### Paso 2: Importar en Vercel + +1. Ve a [vercel.com/new](https://vercel.com/new) +2. Selecciona tu repositorio con el fork +3. Configura el proyecto: + +| Ajuste | Valor | +| ---------------------- | --------------- | +| Framework Preset | Vite | +| Comando de compilación | `npm run build` | +| Directorio de salida | `dist` | +| Comando de instalación | `npm install` | + +### Paso 3: Variables de entorno (opcional) + +Añádelas si las necesitas: + +| Variable | Descripción | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Ponla en `true` para una interfaz mínima | +| `VITE_BRAND_NAME` | Nombre de marca personalizado (reemplaza "BentoPDF") | +| `VITE_BRAND_LOGO` | Ruta del logotipo relativa a `public/` (p. ej. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Texto personalizado del pie de página y de derechos de autor | +| `VITE_DEFAULT_LANGUAGE` | Idioma predeterminado de la interfaz (p. ej. `fr`, `de`, `es`) | + +### Paso 4: Desplegar + +Haz clic en "Deploy" y espera a que termine la compilación. + +## Dominio personalizado + +1. Ve a los ajustes de tu proyecto +2. Ve a "Domains" +3. Añade tu dominio personalizado +4. Configura el DNS según las instrucciones + +## Limitaciones + +::: warning Archivos grandes +Las funciones serverless de Vercel tienen un límite de 50 MB. Como BentoPDF es un sitio estático, esto no debería afectarte, pero los módulos WASM son grandes (~100 MB en total). Asegúrate de que se sirvan desde la carpeta `/public`. +::: + +## Solución de problemas + +### Tiempo de espera agotado en la compilación + +Si las compilaciones agotan el tiempo de espera, prueba lo siguiente: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Error 404 al recargar + +Añade un `vercel.json` para el enrutamiento SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### La conversión de Word/ODT/Excel a PDF no funciona + +Las conversiones de LibreOffice WASM requieren `SharedArrayBuffer`, que necesita estas cabeceras de respuesta en todas las páginas: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Los archivos precomprimidos `.wasm.gz` y `.data.gz` también necesitan `Content-Encoding: gzip` para que el navegador los descomprima. + +Añade esto a tu `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Para verificarlo, abre la consola de DevTools y ejecuta `console.log(window.crossOriginIsolated)`: debería devolver `true`. diff --git a/docs/es/tools/add-attachments.md b/docs/es/tools/add-attachments.md new file mode 100644 index 00000000..8cbdf50d --- /dev/null +++ b/docs/es/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Agregar adjuntos +description: Incrusta archivos de cualquier tipo en un PDF a nivel de documento o asociados a páginas concretas. +--- + +# Agregar adjuntos + +Incrusta uno o varios archivos directamente dentro de un documento PDF. Los adjuntos pueden añadirse a nivel de documento (visibles en el panel de adjuntos de cualquier lector de PDF) o vincularse a páginas concretas. + +## Cómo funciona + +1. Sube el PDF al que quieres adjuntar archivos. +2. Usa la zona de carga de adjuntos para seleccionar los archivos que quieres incrustar (de cualquier tipo). +3. Elige el nivel del adjunto: **Documento** (predeterminado) o **Página**. +4. Si eliges el nivel de página, introduce un rango de páginas (por ejemplo, `1-3` o `5`). +5. Haz clic en el botón de procesar. El PDF modificado se descarga con tus archivos incrustados. + +## Características + +- Adjunta cualquier tipo de archivo: imágenes, hojas de cálculo, archivos comprimidos, ejecutables, lo que sea +- Colocación de adjuntos a nivel de documento o de página +- Se pueden adjuntar varios archivos en una sola operación +- Muestra los nombres y tamaños de todos los adjuntos seleccionados +- El resultado conserva el contenido original del PDF con los archivos incrustados añadidos + +## Opciones + +| Opción | Descripción | +| ---------------------- | -------------------------------------------------------------------------------- | +| **Nivel de documento** | Adjunta los archivos al PDF completo, accesibles desde el panel de adjuntos | +| **Nivel de página** | Adjunta los archivos a páginas concretas, indicadas mediante un rango de páginas | + +## Casos de uso + +- Incluir datos de origen (archivos de Excel, CSV) junto con un informe en PDF +- Adjuntar los archivos de imagen originales a un PDF de portafolio fotográfico +- Incrustar documentos de respaldo dentro de un contrato o una propuesta +- Añadir material complementario a páginas específicas de un manual de formación + +## Consejos + +- Los adjuntos a nivel de documento son los más compatibles entre lectores de PDF. Es posible que los adjuntos a nivel de página no se vean en todos los visores. +- No hay límite de tamaño para los adjuntos, pero los archivos incrustados muy grandes aumentarán el tamaño del PDF de forma proporcional. + +## Herramientas relacionadas + +- [Extraer Adjuntos](./extract-attachments) +- [Editar Adjuntos](./edit-attachments) +- [Fusionar PDF](./merge-pdf) diff --git a/docs/es/tools/add-blank-page.md b/docs/es/tools/add-blank-page.md new file mode 100644 index 00000000..8bcdf790 --- /dev/null +++ b/docs/es/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Agregar página en blanco +description: Inserta una o varias páginas en blanco en cualquier posición de un documento PDF. +--- + +# Agregar página en blanco + +Inserta páginas vacías en un PDF en la posición que indiques. Tú controlas dónde van las páginas en blanco y cuántas añadir. + +## Cómo funciona + +1. Sube un archivo PDF. La herramienta muestra el número de páginas. +2. Introduce la **posición** donde se insertarán las páginas en blanco. Usa `0` para insertar al principio del todo, o el número total de páginas para añadirlas al final. +3. Introduce el **número** de páginas en blanco que quieres añadir (por defecto es 1). +4. Haz clic en el botón de procesar. El PDF modificado se descarga con las páginas en blanco insertadas. + +## Características + +- Inserta en cualquier posición: al principio, en medio o al final del documento +- Añade varias páginas en blanco en una sola operación +- La sugerencia de posición se actualiza dinámicamente según el número de páginas del PDF subido +- Páginas en blanco de tamaño A4 estándar + +## Casos de uso + +- Añadir una página separadora en blanco entre las secciones de un documento recopilado +- Insertar páginas en blanco para alinear la impresión a doble cara +- Dejar espacio para notas a mano en una guía de estudio impresa +- Rellenar un documento para cumplir con un requisito de número mínimo de páginas + +## Consejos + +- La posición `0` inserta antes de la primera página. Una posición igual al número total de páginas añade después de la última página. +- Si necesitas insertar contenido (no solo páginas en blanco) en una posición concreta, usa [Multiherramienta PDF](./pdf-multi-tool) para insertar otro PDF después de una página determinada. + +## Herramientas relacionadas + +- [Duplicar y Organizar](./organize-pdf) +- [Multiherramienta PDF](./pdf-multi-tool) +- [Fusionar PDF](./merge-pdf) diff --git a/docs/es/tools/add-page-labels.md b/docs/es/tools/add-page-labels.md new file mode 100644 index 00000000..f05e256f --- /dev/null +++ b/docs/es/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Agregar etiquetas de página +description: Agrega etiquetas de página PDF con números romanos, prefijos de letras, numeración personalizada y varias reglas por documento. +--- + +# Agregar etiquetas de página + +Las etiquetas de página controlan cómo se muestran los números de página en los visores de PDF (el número que aparece en la barra de herramientas, no impreso en la página). Esta herramienta te permite asignar distintos esquemas de etiquetado a distintos rangos de páginas: números romanos para las páginas preliminares, números decimales para el cuerpo, apéndices con letras y más. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Aparece el panel de opciones con una regla de etiquetas por defecto. +3. Configura cada regla con un rango de páginas, un estilo, un prefijo opcional y un valor inicial. +4. Haz clic en **Agregar regla** para crear reglas adicionales para otras secciones. +5. Haz clic en **Agregar etiquetas de página** para aplicar todas las reglas y descargar el resultado. + +## Opciones + +Cada regla de etiquetas tiene estos ajustes: + +- **Rango de páginas**: las páginas a las que se aplica la regla. Déjalo vacío para todas las páginas. Admite rangos como `1-4`, `7`, `odd` o `1-9,30-40`. +- **Estilo de etiqueta**: Arábigo decimal, Romanos en minúsculas (i, ii, iii), Romanos en mayúsculas (I, II, III), Letras en minúsculas (a, b, c), Letras en mayúsculas (A, B, C) o Sin etiqueta (solo prefijo). +- **Prefijo de etiqueta**: texto opcional que se antepone a cada etiqueta, como "A-" para crear etiquetas como A-1, A-2, A-3. +- **Valor inicial**: el número desde el que empezar a contar. Por defecto es 1. Ponlo en 0 para una numeración que empiece en cero. +- **Continuar la numeración entre rangos no contiguos**: actívalo cuando una regla se dirija a páginas no contiguas (como `1-9,30-40` u `odd`) y quieras que la numeración continúe de forma secuencial. +- **Eliminar las etiquetas de página existentes**: marcado por defecto. Borra las etiquetas anteriores antes de aplicar tus nuevas reglas. + +## Características + +- Varias reglas de etiquetas por documento para esquemas de numeración complejos +- Seis estilos de etiqueta que cubren todos los sistemas de numeración estándar +- Compatibilidad con prefijos personalizados para etiquetar por secciones +- Compatibilidad con rangos no contiguos con numeración progresiva +- Opción para conservar o eliminar las etiquetas existentes + +## Casos de uso + +- Establecer etiquetas con números romanos (i, ii, iii) para el prefacio de un libro y etiquetas decimales para el texto principal +- Etiquetar las páginas de apéndices con prefijos de letras como "A-1", "A-2", "B-1", "B-2" +- Corregir las etiquetas de página en un documento escaneado donde los números de página físicos no coinciden con el orden de páginas del PDF +- Agregar numeración desde cero para documentos técnicos + +## Consejos + +- Las etiquetas de página son metadatos que los visores de PDF muestran en su barra de navegación. No se imprimen en la página. Para números visibles, usa [Números de Página](./page-numbers). +- Esta herramienta requiere que CoherentPDF (CPDF) esté configurado en tus Ajustes de WASM. Si no está configurado, se te pedirá que lo hagas. + +## Herramientas relacionadas + +- [Números de Página](./page-numbers) +- [Numeración Bates](./bates-numbering) +- [Editar Marcadores](./bookmark) diff --git a/docs/es/tools/add-stamps.md b/docs/es/tools/add-stamps.md new file mode 100644 index 00000000..5790c23c --- /dev/null +++ b/docs/es/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Agregar sellos +description: Agrega sellos de imagen a las páginas de tu PDF con una barra de herramientas de anotaciones integrada y atribución por nombre de usuario. +--- + +# Agregar sellos + +Coloca sellos de imagen en las páginas de tu PDF usando un visor integrado con una barra de herramientas de anotaciones de sellos. Los sellos pueden incluir tu nombre como atribución, lo que resulta útil para flujos de aprobación, procesos de revisión y marcado de documentos. + +## Cómo funciona + +1. Escribe tu nombre en el campo **Nombre de usuario del sello**. Este nombre aparecerá en los sellos que crees. +2. Sube tu archivo PDF haciendo clic o arrastrándolo a la zona de carga. +3. El editor de sellos se abre con tu documento cargado en un visor. +4. Usa la herramienta de sello de imagen de la barra de herramientas para seleccionar y colocar sellos en cualquier página. +5. Coloca y cambia el tamaño de los sellos según necesites. +6. Haz clic en **Guardar PDF sellado** para descargar el resultado. + +## Características + +- Visor de PDF integrado con una barra de herramientas de anotaciones específica para sellos +- Atribución por nombre de usuario en los sellos creados +- Colocación de sellos de imagen en cualquier página +- Posicionamiento y cambio de tamaño con arrastrar y soltar +- Ajuste automático del tamaño del visor según la proporción de la página +- Visualización del archivo con su nombre y tamaño + +## Casos de uso + +- Añadir sellos de imagen de "APROBADO" o "REVISADO" a documentos en un flujo de revisión +- Colocar imágenes del sello de la empresa o de un notario en documentos oficiales +- Marcar páginas con sellos de "RECIBIDO" que incluyan el nombre del revisor +- Añadir sellos de control de calidad a informes de inspección + +## Consejos + +- Define tu nombre de usuario del sello antes de subir el PDF. El nombre de usuario se incrusta en los metadatos del sello. +- El visor ajusta su altura según la proporción de la primera página del PDF para una visualización óptima. +- Si quieres marcas de agua de texto en lugar de sellos de imagen, usa la herramienta [Agregar Marca de Agua](./add-watermark). + +## Herramientas relacionadas + +- [Firmar PDF](./sign-pdf) +- [Agregar Marca de Agua](./add-watermark) +- [Editor de PDF](./edit-pdf) diff --git a/docs/es/tools/add-watermark.md b/docs/es/tools/add-watermark.md new file mode 100644 index 00000000..d01872e8 --- /dev/null +++ b/docs/es/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Agregar marca de agua +description: Estampa marcas de agua de texto o imagen en las páginas del PDF con un editor visual de arrastrar y soltar y vista previa en vivo. +--- + +# Agregar marca de agua + +Agrega marcas de agua de texto o imagen a las páginas de tu PDF con un editor visual. Puedes colocar la marca de agua arrastrándola directamente en la vista previa, cambiar su tamaño con los tiradores de las esquinas y configurar la opacidad, la rotación, la fuente y el color. Cada página puede tener su propia posición de marca de agua, o puedes aplicar la misma marca de agua a todas las páginas a la vez. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. El editor se abre con una vista previa en vivo de la primera página y una marca de agua superpuesta que se puede arrastrar. +3. Elige entre el modo de marca de agua de **Texto** o de **Imagen** con los botones de alternancia. +4. Configura los ajustes de la marca de agua en el panel lateral. +5. Arrastra la marca de agua en la vista previa para colocarla exactamente donde quieras. Usa los tiradores de las esquinas para cambiar su tamaño. +6. Navega entre las páginas para definir marcas de agua por página, o deja marcada la opción **Aplicar a todas las páginas**. +7. Haz clic en **Agregar Marca de Agua** para procesar y descargar. + +## Opciones + +**Ajustes de marca de agua de texto:** + +- **Texto**: el texto de la marca de agua (por ejemplo, "CONFIDENCIAL", "BORRADOR"). +- **Tamaño de fuente**: de 10 a 200 puntos. Por defecto es 72. +- **Color**: cualquier color mediante el selector de color. +- **Opacidad**: controla la transparencia, desde totalmente transparente hasta totalmente opaco. +- **Rotación**: gira el texto de la marca de agua de -180 a 180 grados. + +**Ajustes de marca de agua de imagen:** + +- **Subir imagen**: sube un archivo PNG, JPG u otro formato de imagen para usarlo como marca de agua. +- **Opacidad**: controla la transparencia de la imagen. +- **Escala**: cambia el tamaño de la imagen de la marca de agua. + +**Ajustes de diseño:** + +- **Única**: una marca de agua por página, colocada arrastrándola o con las posiciones predefinidas. +- **En mosaico**: repite la marca de agua por toda la página en una cuadrícula diagonal que sigue el ángulo de rotación, de modo que la marca cubre el documento de un borde a otro. +- **Espacio horizontal**: separación entre los mosaicos a lo largo de la dirección del texto, como porcentaje del ancho de la marca de agua (solo en modo mosaico). +- **Espacio vertical**: separación entre las filas de mosaicos, como porcentaje de la altura de la marca de agua (solo en modo mosaico). + +**Ajustes generales:** + +- **Aplicar a todas las páginas**: cuando está marcada, la misma marca de agua se aplica a todas las páginas. Desmárcala para definir marcas de agua individuales por página. +- **Rango de páginas**: indica qué páginas llevan la marca de agua (por ejemplo, "1-3, 5, 7-9" o "all"). + +## Características + +- Posicionamiento visual de arrastrar y soltar sobre una vista previa del PDF en vivo +- Marca de agua redimensionable con tiradores en las esquinas +- Modos de marca de agua de texto e imagen +- Diseño único o en mosaico (repetido) a página completa con espaciado ajustable +- Aplicación de la marca de agua por página o global +- Navegación página por página en la vista previa +- Controles de opacidad y rotación +- Filtrado por rango de páginas + +## Casos de uso + +- Marcar documentos en borrador con "BORRADOR" antes de circularlos para su revisión +- Agregar marcas de agua de "CONFIDENCIAL" a informes financieros sensibles +- Dar identidad de marca a los documentos con una marca de agua de imagen con el logotipo de la empresa +- Estampar "MUESTRA" en documentación de producto compartida con clientes potenciales +- Agregar avisos de derechos de autor a materiales en PDF distribuidos + +## Consejos + +- Para marcas de agua diagonales en la página, establece una rotación de alrededor de 45 grados y aumenta el tamaño de fuente. +- El modo en mosaico hace que sea mucho más difícil reutilizar un documento recortándolo, ya que quitar una marca deja docenas más. Baja la opacidad al usar mosaico para que el texto de fondo siga siendo legible. +- Las marcas de agua de imagen con fondo transparente (formato PNG) se integran de forma más natural con el contenido del documento. +- Si necesitas un texto de marca de agua distinto en páginas diferentes, desmarca "Aplicar a todas las páginas" y navega página por página. + +## Herramientas relacionadas + +- [Encabezado y Pie de Página](./header-footer) +- [Agregar Sellos](./add-stamps) +- [Numeración Bates](./bates-numbering) +- [Firmar PDF](./sign-pdf) diff --git a/docs/es/tools/adjust-colors.md b/docs/es/tools/adjust-colors.md new file mode 100644 index 00000000..96e730ba --- /dev/null +++ b/docs/es/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Ajustar colores +description: Ajusta con precisión el brillo, el contraste, la saturación, el tono, la temperatura, el matiz, el gamma y el sepia de tu PDF. +--- + +# Ajustar colores + +Un conjunto completo de herramientas de corrección de color para PDF. Ajusta ocho parámetros independientes (brillo, contraste, saturación, cambio de tono, temperatura, matiz, gamma y sepia) con una vista previa en vivo que se actualiza a medida que mueves cada control deslizante. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Se abre el editor con una vista previa de la primera página y un panel de ajustes de color. +3. Mueve los controles deslizantes para ajustar cada parámetro de color. La vista previa se actualiza en tiempo real. +4. Haz clic en **Restablecer** para devolver todos los controles a sus posiciones por defecto. +5. Haz clic en **Aplicar** para procesar todas las páginas y descargar el PDF ajustado. + +## Opciones + +- **Brillo**: aclara u oscurece toda la página (de -100 a +100). +- **Contraste**: aumenta o reduce la diferencia entre las zonas claras y oscuras (de -100 a +100). +- **Saturación**: aumenta o reduce la intensidad del color (de -100 a +100). Si lo pones en -100, el resultado es en escala de grises. +- **Cambio de tono**: gira la rueda de color para desplazar todos los colores de manera uniforme. +- **Temperatura**: desplaza los colores hacia tonos más cálidos (amarillo/naranja) o más fríos (azul). +- **Matiz**: añade una dominante verde o magenta. +- **Gamma**: ajusta el brillo de los medios tonos mediante una curva gamma. Los valores inferiores a 1.0 oscurecen los medios tonos; los valores superiores a 1.0 los aclaran. +- **Sepia**: aplica un efecto de tono sepia clásico. Los valores más altos producen un tinte marrón más fuerte. + +## Características + +- Ocho parámetros de color ajustables de forma independiente +- Vista previa en vivo que responde de inmediato a los cambios en los controles deslizantes +- Botón de restablecer para volver rápidamente a los valores por defecto +- Procesa todas las páginas del documento +- Funciona con cualquier contenido del PDF (texto, imágenes, gráficos) + +## Casos de uso + +- Aclarar un escaneo oscuro o corregir páginas sobreexpuestas +- Reducir la saturación de un documento colorido para gastar menos tinta antes de imprimir +- Aplicar un tono sepia para dar un aspecto antiguo a certificados o diplomas +- Corregir la temperatura de color de fotos incrustadas en un PDF +- Aumentar el contraste en documentos escaneados desvaídos o de baja calidad + +## Consejos + +- Para una conversión rápida a escala de grises, arrastra el control de saturación hasta -100. +- El control de gamma es especialmente útil para mejorar la legibilidad de documentos escaneados cuyos medios tonos son demasiado oscuros o demasiado claros. +- Como las demás herramientas de efectos de imagen, esta rasteriza cada página. El resultado estará basado en imágenes, por lo que el texto no se podrá seleccionar. + +## Herramientas relacionadas + +- [Invertir Colores](./invert-colors) +- [Efecto escáner](./scanner-effect) +- [Color de Fondo](./background-color) diff --git a/docs/es/tools/alternate-merge.md b/docs/es/tools/alternate-merge.md new file mode 100644 index 00000000..85f734e9 --- /dev/null +++ b/docs/es/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alternar y mezclar páginas +description: Fusiona PDF intercalando las páginas de cada archivo en orden alterno, conservando los marcadores. +--- + +# Alternar y mezclar páginas + +Intercala las páginas de varios archivos PDF para que las páginas se alternen entre documentos. Es la herramienta a la que recurres cuando una fusión normal solo añadiría los archivos uno detrás de otro, pero necesitas la página 1 del Archivo A, luego la página 1 del Archivo B, luego la página 2 del Archivo A, y así sucesivamente. + +## Cómo funciona + +1. Sube al menos dos archivos PDF usando la zona de carga. +2. La herramienta muestra cada archivo con su número de páginas y tamaño. +3. Arrastra los tiradores para reordenar las páginas de qué archivo van primero en la secuencia de intercalado. +4. Haz clic en **Mezclar páginas** para generar el resultado intercalado. +5. El resultado se descarga como `alternated-mixed.pdf`. + +## Características + +- Intercala páginas de cualquier cantidad de PDF (mínimo dos) +- Reordenación de archivos con arrastrar y soltar para controlar la prioridad del intercalado +- Conserva los marcadores de los documentos de origen +- Muestra el número de páginas y el tamaño de cada archivo subido +- Se procesa mediante un web worker dedicado para mantener la interfaz fluida + +## Casos de uso + +- Reconstruir escaneos a doble cara en los que las páginas impares y pares se escanearon por separado +- Combinar hojas de preguntas con sus claves de respuestas para que cada pregunta vaya seguida de su respuesta +- Fusionar documentos en dos idiomas página por página (por ejemplo, inglés en una cara y la traducción en la siguiente) +- Intercalar los escaneos del anverso y del reverso de un escáner de una sola cara + +## Consejos + +- Si tus PDF de origen tienen distinto número de páginas, las páginas del documento más corto se acabarán primero y las páginas restantes del documento más largo aparecerán al final. +- El orden de los archivos importa: el primer archivo de la lista aporta la primera página del resultado. Arrastra para reorganizar si es necesario. + +## Herramientas relacionadas + +- [Fusionar PDF](./merge-pdf) +- [Duplicar y Organizar](./organize-pdf) +- [Dividir PDF](./split-pdf) diff --git a/docs/es/tools/background-color.md b/docs/es/tools/background-color.md new file mode 100644 index 00000000..1b065837 --- /dev/null +++ b/docs/es/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Color de fondo +description: Cambia el color de fondo de todas las páginas de tu PDF conservando todo el contenido por encima. +--- + +# Color de fondo + +Establece un color de fondo sólido detrás de todo el contenido existente de tu PDF. La herramienta crea un rectángulo de color en cada página y coloca el contenido original encima, de modo que el texto, las imágenes y los gráficos siguen siendo totalmente visibles sobre el nuevo fondo. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Elige un color de fondo con el selector de color. El valor por defecto es un amarillo claro (#FFFFCC). +3. Haz clic en **Cambiar Color de Fondo** para procesar. +4. El PDF actualizado se descarga automáticamente. + +## Opciones + +- **Color de Fondo**: un selector de color estándar para elegir cualquier color sólido. Por defecto es amarillo claro. + +## Características + +- Aplica un color de fondo uniforme a todas las páginas +- Conserva todo el contenido original (texto, imágenes, gráficos vectoriales) sobre la capa de color +- Mantiene las dimensiones originales de la página +- Funciona con documentos de cualquier número de páginas + +## Casos de uso + +- Añadir un fondo crema o marfil claro para dar a los documentos un aspecto más suave, parecido al papel +- Clasificar por colores conjuntos de documentos aplicando distintos colores de fondo a distintas categorías +- Crear versiones visualmente distintas del mismo documento para diferentes públicos +- Añadir un tinte de fondo claro para mejorar la legibilidad al proyectar documentos en pantalla + +## Consejos + +- Los colores claros y suaves funcionan mejor. Un fondo muy oscuro puede dificultar la lectura del texto, a menos que este ya sea de color claro. +- Si quieres cambiar tanto el color de fondo como el del texto, aplica primero el color de fondo y luego usa [Cambiar Color de Texto](./text-color) sobre el resultado. +- Esta herramienta trabaja a nivel estructural del PDF (sin rasterizar), por lo que el texto sigue siendo seleccionable y se puede buscar en el resultado. + +## Herramientas relacionadas + +- [Cambiar Color de Texto](./text-color) +- [Invertir Colores](./invert-colors) +- [Ajustar colores](./adjust-colors) diff --git a/docs/es/tools/bates-numbering.md b/docs/es/tools/bates-numbering.md new file mode 100644 index 00000000..c5aac409 --- /dev/null +++ b/docs/es/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Numeración Bates +description: Aplica números Bates a uno o varios PDF con plantillas, relleno, fuentes y posicionamiento personalizables. +--- + +# Numeración Bates + +La numeración Bates estampa identificadores secuenciales en cada página de tus PDF. Es el método estándar para etiquetar documentos en procedimientos legales, auditorías y flujos de cumplimiento normativo. Esta herramienta admite varios archivos y plantillas personalizables, y genera PDF numerados individualmente o un único archivo ZIP. + +## Cómo funciona + +1. Sube uno o varios archivos PDF. Puedes arrastrar varios archivos a la vez. +2. Elige un estilo predefinido o crea una plantilla personalizada. +3. Configura la posición, la fuente, el tamaño, el color y los números iniciales. +4. Haz clic en **Aplicar números Bates** para procesar. +5. Un solo archivo se descarga directamente. Varios archivos se descargan como un archivo ZIP. + +## Opciones + +- **Estilo predefinido**: elige entre los formatos integrados: + - Exhibit + Case + Bates + Page (p. ej., "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (sin número de página) + - Case + Bates + - Solo número Bates (p. ej., "000001") + - Personalizado (escribe tu propia plantilla) +- **Personalizar estilo**: una cadena de plantilla con marcadores: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Relleno Bates**: número de dígitos (de 3 a 6) para los números Bates rellenados con ceros. Solo visible en modo personalizado. +- **Posición**: encabezado o pie de página, a la izquierda, al centro o a la derecha. +- **Los Bates empiezan en**: el primer número Bates. Por defecto es 1. La numeración continúa entre archivos. +- **El contador de archivos empieza en**: el número inicial para el marcador `[FILE]`. +- **Fuente**: Helvetica, Times New Roman o Courier. +- **Tamaño de fuente**: tamaño del texto estampado. +- **Color**: selector de color para el texto del número Bates. + +## Características + +- Vista previa en vivo que muestra cómo aparecerán los números Bates en todos los archivos subidos +- Compatibilidad con varios archivos con numeración continua entre documentos +- Reordenación de archivos con arrastrar y soltar para controlar la secuencia de numeración +- Seis opciones de posición (encabezado/pie, izquierda/centro/derecha) +- Cálculo adaptativo de márgenes que respeta los distintos tamaños de página +- Salida en ZIP para lotes de varios archivos +- Marcadores de plantilla para la máxima flexibilidad + +## Casos de uso + +- Estampar documentos de descubrimiento probatorio en litigios con números de exhibit secuenciales +- Numerar paquetes de evidencia de auditoría que abarcan docenas de archivos +- Aplicar números de referencia regulatorios a la documentación de cumplimiento +- Etiquetar los anexos de una solicitud de patente con identificadores específicos del caso + +## Consejos + +- Arrastra los archivos en la lista para reordenarlos antes de procesar. La secuencia de numeración Bates sigue este orden. +- Usa el marcador `[FILENAME]` para incluir el nombre del archivo original en el sello, lo que ayuda a rastrear las páginas hasta los documentos de origen. +- El cuadro de vista previa se actualiza en tiempo real al cambiar los ajustes, así que puedes verificar el formato antes de procesar. + +## Herramientas relacionadas + +- [Números de Página](./page-numbers) +- [Agregar etiquetas de página](./add-page-labels) +- [Encabezado y Pie de Página](./header-footer) diff --git a/docs/es/tools/bmp-to-pdf.md b/docs/es/tools/bmp-to-pdf.md new file mode 100644 index 00000000..0d1bf4b2 --- /dev/null +++ b/docs/es/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP a PDF +description: Convierte imágenes de mapa de bits BMP a formato PDF directamente en tu navegador, sin subir nada a ningún servidor. +--- + +# BMP a PDF + +Convierte archivos Windows Bitmap (BMP) a PDF. BMP es un formato de imagen sin comprimir que aún se encuentra en sistemas heredados, imagen médica y escáneres industriales. Esta herramienta los convierte a PDF sin necesidad de instalar nada. + +## Formatos compatibles + +| Formato | Extensiones | +| :------ | :---------- | +| BMP | `.bmp` | + +## Cómo funciona + +1. Haz clic en la zona de carga o arrastra y suelta tus archivos BMP. +2. Revisa la lista de archivos. Añade más archivos o quita los que no quieras. +3. Haz clic en **Convertir a PDF**. El resultado se descarga como `from_bmps.pdf`. + +Cada BMP se dibuja en un canvas, se exporta como PNG y luego se incrusta en el PDF con pdf-lib. El tamaño de la página coincide con las dimensiones originales de la imagen. + +## Opciones + +Esta herramienta no ofrece ajustes de calidad adicionales. Las imágenes se incrustan en su resolución original como PNG sin pérdida dentro del PDF. + +## Casos de uso + +- Convertir documentos escaneados antiguos guardados como BMP en PDF de archivo +- Convertir capturas de pantalla BMP de aplicaciones antiguas de Windows en documentos fáciles de compartir +- Procesar la salida de escáneres médicos o industriales que usan BMP por defecto +- Migrar archivos de imágenes antiguos a un formato más portátil + +## Consejos + +- Los archivos BMP no están comprimidos, por lo que suelen ser grandes. El PDF resultante será bastante más pequeño porque las imágenes se recodifican internamente como PNG. +- Si tienes archivos BMP junto con otros formatos de imagen, usa la herramienta [Imágenes a PDF](./image-to-pdf) para convertir todo en un solo lote. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [TIFF a PDF](./tiff-to-pdf) diff --git a/docs/es/tools/bookmark.md b/docs/es/tools/bookmark.md new file mode 100644 index 00000000..d431ec49 --- /dev/null +++ b/docs/es/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Editar marcadores +description: Agrega, edita, importa, exporta y elimina marcadores de PDF con un editor visual y compatibilidad con CSV/JSON. +--- + +# Editar marcadores + +El editor de marcadores te da control total sobre los marcadores de navegación del PDF (también llamados esquemas). Puedes agregar marcadores nuevos, editar los existentes, reorganizar la jerarquía e importar o exportar los datos de los marcadores en formatos CSV y JSON. + +## Cómo Funciona + +1. Sube tu PDF haciendo clic o arrastrando un archivo a la zona de carga. +2. Opcionalmente, marca **Extraer automáticamente marcadores existentes** para traer el árbol de marcadores actual del documento. +3. El editor se abre con una vista dividida: visor de PDF a la izquierda y panel de marcadores a la derecha. +4. Escribe el título de un marcador y haz clic en **Añadir a la página** para crear un marcador que apunte a la página actual. +5. Usa los botones de la barra de herramientas para reorganizar, dar estilo o eliminar marcadores. +6. Haz clic en **Guardar PDF con marcadores** para descargar el archivo actualizado. + +## Características + +- Visor de PDF visual con navegación de páginas, controles de zoom y campo para ir a una página +- Agrega marcadores a cualquier página con un solo clic +- Haz clic directamente en el PDF para fijar un destino de marcador preciso (modo de selección) +- Jerarquía de marcadores anidados con reordenación mediante arrastrar y soltar +- Operaciones por lotes: selecciona varios marcadores para cambiar el color, el estilo o eliminarlos a la vez +- Búsqueda de marcadores para encontrar entradas rápidamente en árboles grandes +- Deshacer y rehacer para todos los cambios +- Importa marcadores desde archivos CSV (título, página, nivel) o JSON +- Exporta marcadores a CSV o JSON para editarlos externamente +- Estilo de marcadores: color (rojo, azul, verde, amarillo, morado) y estilo de fuente (negrita, cursiva, negrita cursiva) +- Navegación rápida: recorre las páginas con las teclas Re Pág y Av Pág + +## Opciones + +- **Extraer automáticamente marcadores existentes**: al activarla, la herramienta lee y muestra los marcadores actuales del PDF al cargarlo. +- **Modo por lotes**: actívalo para seleccionar varios marcadores y aplicar cambios masivos de color, estilo o eliminación. +- **Expandir todo / Contraer todo**: muestra u oculta rápidamente los marcadores secundarios anidados. + +## Casos de Uso + +- Agregar una tabla de contenidos a un libro de texto o manual que no tiene marcadores +- Reestructurar los marcadores de un documento escaneado después del procesamiento OCR +- Exportar marcadores a CSV, editarlos en una hoja de cálculo y volver a importarlos +- Limpiar marcadores generados automáticamente que tienen referencias de página incorrectas +- Agregar marcadores de colores para señalar secciones importantes en un escrito jurídico + +## Consejos + +- Usa la importación CSV para crear marcadores en masa. El formato es simple: `title,page,level`, donde el nivel 1 es el nivel superior. +- El modo de selección te permite hacer clic en un punto exacto de la página del PDF para fijar el destino del marcador, lo cual es más preciso que apuntar solo a un número de página. +- Exporta tus marcadores antes de hacer cambios importantes para tener una copia de seguridad. + +## Herramientas Relacionadas + +- [Tabla de Contenidos](./table-of-contents) +- [Editor PDF](./edit-pdf) +- [Agregar etiquetas de página](./add-page-labels) diff --git a/docs/es/tools/cbz-to-pdf.md b/docs/es/tools/cbz-to-pdf.md new file mode 100644 index 00000000..84eed0ce --- /dev/null +++ b/docs/es/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ a PDF +description: Convierte archivos de cómics CBZ y CBR a PDF en tu navegador. Gratis, privado, sin subir archivos. +--- + +# CBZ a PDF + +Convierte archivos de cómics en PDF. CBZ y CBR son los formatos estándar de los cómics digitales: son simplemente archivos ZIP o RAR llenos de imágenes. Esta herramienta extrae cada página, conserva el orden de lectura y produce un PDF limpio donde cada imagen se convierte en una página a tamaño completo. + +## Formatos Compatibles + +| Formato | Extensión | Notas | +| :------ | :-------- | :------------------------------------------------------------------- | +| CBZ | `.cbz` | Archivo de cómic basado en ZIP (procesado localmente con pdf-lib) | +| CBR | `.cbr` | Archivo de cómic basado en RAR (procesado mediante el motor PyMuPDF) | + +El conversor de CBZ reconoce imágenes JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC y JXL dentro del archivo. Los formatos no estándar se convierten automáticamente a PNG antes de incrustarse. + +## Cómo Funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos CBZ o CBR. Puedes mezclar ambos formatos en un mismo lote. +2. Revisa los archivos listados. Quita los que no necesites o haz clic en **Agregar Más Archivos** para agregar más. +3. Haz clic en **Convertir a PDF**. Con los archivos CBZ, la herramienta descomprime el archivo, ordena las imágenes por nombre en orden natural, detecta el formato real de cada imagen y las incrusta en un PDF con pdf-lib. Los archivos CBR se procesan con el motor PyMuPDF. +4. Un solo archivo se descarga como PDF. Varios archivos producen un ZIP llamado `comic-converted.zip`. + +## Opciones + +No se requiere configuración. Cada imagen se convierte en una página del mismo tamaño que sus dimensiones originales, así que las páginas dobles siguen siendo anchas y las páginas sencillas siguen siendo estrechas. + +## Casos de Uso + +- Leer cómics en una tableta o una app de teléfono que admite PDF pero no CBZ/CBR +- Imprimir páginas específicas de un cómic digital +- Archivar una colección de cómics en un formato que cualquier visor de archivos pueda abrir +- Compartir un cómic con alguien que no tiene un lector de cómics dedicado + +## Consejos + +- Las imágenes dentro del archivo se ordenan con orden natural (así `page2.jpg` va antes que `page10.jpg`). Nombra tus archivos con una numeración consistente para obtener la secuencia de páginas correcta. +- El conversor detecta los formatos de imagen por sus firmas binarias, no por las extensiones. Un PNG nombrado por error `.jpg` se incrustará correctamente. +- Los archivos CBZ se procesan por completo en el navegador sin cargar el motor PyMuPDF, por lo que se convierten más rápido que los CBR. + +## Herramientas Relacionadas + +- [EPUB a PDF](./epub-to-pdf) +- [MOBI a PDF](./mobi-to-pdf) +- [Imágenes a PDF](./image-to-pdf) diff --git a/docs/es/tools/change-permissions.md b/docs/es/tools/change-permissions.md new file mode 100644 index 00000000..990df8bb --- /dev/null +++ b/docs/es/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Cambiar permisos +description: Establece o modifica los permisos de uso de un PDF para imprimir, copiar, editar y anotar. Usa cifrado AES de 256 bits. +--- + +# Cambiar permisos + +Ajusta con precisión lo que los destinatarios pueden hacer con tu PDF. A diferencia del cifrado básico, que solo bloquea el archivo con una contraseña, esta herramienta te permite permitir o denegar de forma selectiva la impresión, la copia, la edición, las anotaciones, el llenado de formularios, el ensamblaje de documentos y la extracción de páginas, todo aplicado mediante cifrado AES de 256 bits. + +## Cómo Funciona + +1. Sube un archivo PDF. +2. Si el PDF ya está cifrado, ingresa la **Contraseña actual**. +3. Establece una **Nueva contraseña de usuario** (necesaria para abrir) y/o una **Nueva contraseña de propietario** (controla los permisos). +4. Activa o desactiva cada permiso con las casillas. +5. Haz clic en **Cambiar permisos**. +6. Descarga el PDF actualizado. + +Si dejas vacíos ambos campos de contraseña nueva, la herramienta descifra el PDF por completo y elimina todo el cifrado y las restricciones. + +## Controles de Permisos + +| Permiso | Qué Controla | +| ----------------------------------- | ------------------------------------------------------------ | +| **Permitir imprimir** | Si el documento se puede imprimir | +| **Permitir copiar texto** | Si se puede seleccionar y copiar texto e imágenes | +| **Permitir modificar** | Si se puede editar el contenido del documento | +| **Permitir anotar** | Si se pueden agregar comentarios, resaltados y sellos | +| **Permitir rellenar formularios** | Si se pueden completar los campos de formulario interactivos | +| **Permitir ensamblar el documento** | Si se pueden insertar, eliminar o rotar páginas | +| **Permitir extraer páginas** | Si se pueden extraer páginas individuales | + +Todos los permisos requieren una contraseña de propietario para aplicarse. Sin contraseña de propietario, la mayoría de los lectores de PDF ignoran las marcas de permisos. + +## Cómo Funcionan los Permisos en PDF + +Los permisos del PDF forman parte de la especificación de cifrado. Se almacenan como indicadores de bits en el diccionario de cifrado y los aplican los lectores de PDF compatibles. La diferencia clave: + +- **Contraseña de usuario**: necesaria para abrir el archivo. +- **Contraseña de propietario**: necesaria para cambiar los permisos o quitar las restricciones. Sin ella, las marcas de permisos controlan qué operaciones puede realizar el usuario. + +Si estableces solo una contraseña de propietario (sin contraseña de usuario), cualquiera puede abrir el archivo, pero queda limitado a las operaciones permitidas. Si estableces ambas, el archivo requiere una contraseña para abrirse y queda restringido después de la autenticación. + +## Casos de Uso + +- Distribuir un informe que se pueda ver e imprimir, pero no editar ni copiar +- Compartir una plantilla de contrato que los destinatarios puedan llenar pero no modificar +- Publicar un catálogo en PDF con la copia de imágenes deshabilitada +- Permitir anotaciones en un borrador de revisión e impedir cambios estructurales + +## Consejos + +- Para que sea efectivo, establece siempre una contraseña de propietario. Los permisos sin contraseña de propietario no se pueden hacer cumplir. +- Algunas herramientas de PDF de terceros ignoran las marcas de permisos. Para una protección más sólida, considera rasterizar el PDF o usar DRM. +- Usa esta herramienta para actualizar PDFs antiguos cifrados con RC4 a AES-256. + +## Herramientas Relacionadas + +- [Cifrar PDF](./protect-pdf): protección simple con contraseña, sin permisos granulares +- [Descifrar PDF](./unlock-pdf): elimina el cifrado por completo +- [Eliminar Restricciones](./remove-restrictions): quita todas las restricciones cuando tienes la contraseña de propietario diff --git a/docs/es/tools/combine-single-page.md b/docs/es/tools/combine-single-page.md new file mode 100644 index 00000000..c6c9734c --- /dev/null +++ b/docs/es/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Combinar en una sola página +description: Une todas las páginas de un PDF en un solo desplazamiento continuo, vertical u horizontal. +--- + +# Combinar en una sola página + +Fusiona todas las páginas de un PDF en una única página larga. Las páginas se unen verticalmente (como un pergamino) u horizontalmente (una al lado de otra), y el resultado es una página continua. + +## Cómo Funciona + +1. Sube un archivo PDF. +2. Selecciona la dirección del diseño: **Vertical** (páginas apiladas de arriba abajo) u **Horizontal** (páginas colocadas una al lado de otra). +3. Define el espacio entre páginas en puntos. +4. Elige un color de fondo para los espacios entre páginas. +5. Opcionalmente, activa los separadores (líneas finas entre páginas) y configura su grosor y color. +6. Haz clic en el botón de procesar. El resultado es un PDF de una sola página. + +## Características + +- Unión de páginas vertical u horizontal +- Espaciado configurable entre páginas +- Selector de color de fondo para las áreas de separación +- Líneas separadoras opcionales con grosor y color ajustables +- Renderiza cada página original a resolución completa sobre el lienzo combinado + +## Opciones + +| Opción | Descripción | +| ----------------------------- | ------------------------------------------------------ | +| **Dirección del diseño** | Vertical (apiladas) u Horizontal (una al lado de otra) | +| **Espaciado** | Espacio entre páginas en puntos | +| **Color de fondo** | Color del área entre páginas | +| **Añadir líneas separadoras** | Activa líneas finas entre páginas | +| **Grosor del separador** | Grosor de la línea en puntos | +| **Color del separador** | Color de las líneas separadoras | + +## Casos de Uso + +- Crear una sola imagen larga a partir de un wireframe o maqueta de diseño de varias páginas +- Generar una vista continua con desplazamiento de un documento para incrustarlo en la web +- Unir un cómic o storyboard de varias páginas en una sola tira +- Producir una vista panorámica de páginas secuenciales para su revisión + +## Consejos + +- La orientación vertical funciona mejor con documentos de páginas verticales. La horizontal es mejor para contenido apaisado. +- Los documentos grandes con muchas páginas producirán un resultado muy alto o muy ancho. Algunos visores de PDF pueden tener dificultades con páginas únicas extremadamente grandes. +- Agregar separadores con un color contrastante facilita ver dónde termina una página original y empieza la siguiente. + +## Herramientas Relacionadas + +- [N-Up PDF](./n-up-pdf) +- [Fusionar PDF](./merge-pdf) +- [Dividir Páginas](./divide-pages) diff --git a/docs/es/tools/compare-pdfs.md b/docs/es/tools/compare-pdfs.md new file mode 100644 index 00000000..b3c77dc5 --- /dev/null +++ b/docs/es/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Comparar PDFs +description: Compara dos documentos PDF lado a lado o en modo superposición, con detección y categorización detallada de cambios. +--- + +# Comparar PDFs + +Sube dos PDFs y ve exactamente qué cambió entre ellos. La herramienta empareja las páginas de forma inteligente, detecta diferencias en texto, imágenes, anotaciones, encabezados y formato, y las presenta en una vista lado a lado o superpuesta. + +## Cómo Funciona + +1. Sube dos archivos PDF: el original (izquierda) y la versión revisada (derecha). +2. La herramienta empareja las páginas de ambos documentos usando firmas de contenido. +3. Selecciona un modo de vista: **Lado a lado** u **Superponer**. +4. Navega entre los pares de páginas con los controles de paginación. +5. Las diferencias se resaltan y se categorizan. Usa el panel de filtros para centrarte en tipos de cambio específicos. +6. Opcionalmente, exporta la comparación como informe en PDF. + +## Características + +- Emparejamiento automático de páginas según la similitud del contenido +- Vistas de comparación lado a lado y superpuesta +- Categorización de cambios: texto, imagen, encabezado/pie de página, anotación, formato, fondo +- Filtros por categoría para mostrar u ocultar tipos de cambio específicos +- Búsqueda de cambios de texto con filtrado por consulta +- Compatibilidad con OCR para comparar documentos escaneados +- Controles de zoom para una inspección detallada +- Desplazamiento sincronizado entre paneles en la vista lado a lado +- Exporta los resultados de la comparación como PDF + +## Opciones + +| Opción | Descripción | +| -------------------------- | ------------------------------------------------------------------------------------------------------------ | +| **Modo de vista** | Lado a lado o Superponer | +| **OCR** | Activa o desactiva el OCR para comparar documentos escaneados | +| **Idioma del OCR** | Idioma para la extracción de texto con OCR | +| **Filtros de categoría** | Alterna la visibilidad de los cambios de texto, imagen, encabezado/pie de página, anotación, formato y fondo | +| **Alcance de los cambios** | En el modo superposición, filtra entre todos los cambios o solo el contenido | +| **Zoom** | Ajusta el nivel de aumento para una inspección detallada | + +## Casos de Uso + +- Revisar las revisiones de un contrato para encontrar exactamente qué cambió entre versiones +- Comparar maquetas de diseño para verificar que las exportaciones a PDF coincidan con lo esperado +- Auditar cambios en documentos en industrias reguladas donde cada edición debe registrarse +- Verificar que un proceso de conversión de PDF conservó con exactitud el contenido original +- Revisar documentos traducidos frente al original para detectar cambios de diseño + +## Consejos + +- La vista superpuesta apila ambos documentos uno sobre otro, haciendo visibles al instante las diferencias espaciales (elementos desplazados, imágenes redimensionadas). +- Activa el OCR al comparar documentos escaneados que no tienen capa de texto. El motor de comparación extraerá el texto de las imágenes de las páginas. +- Usa los filtros por categoría para centrarte en lo importante. Por ejemplo, oculta los cambios de formato cuando solo te interesan las diferencias de contenido de texto. + +## Herramientas Relacionadas + +- [Ver Metadatos](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Fusionar PDF](./merge-pdf) diff --git a/docs/es/tools/compress-pdf.md b/docs/es/tools/compress-pdf.md new file mode 100644 index 00000000..8ff22ff6 --- /dev/null +++ b/docs/es/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Comprimir PDF +description: Reduce el tamaño de un PDF hasta un 90% con el motor Hyper Compress. Admite tamaños de archivo objetivo, procesamiento por lotes y ajustes de calidad personalizados. +--- + +# Comprimir PDF + +Reduce el tamaño de tus archivos PDF sin destruirlos. Comprimir PDF funciona con [Hyper Compress](https://www.bentopdf.com/hyper-compress), el motor de compresión propio de BentoPDF. Recomprime imágenes, crea subconjuntos de fuentes y las fusiona, y elimina el peso muerto, como las miniaturas incrustadas y los datos privados de aplicaciones. El PDF sigue siendo totalmente funcional: el texto se puede seleccionar y los enlaces y campos de formulario siguen funcionando. + +Hyper Compress está compilado a WebAssembly y se incluye con BentoPDF, así que la compresión funciona sin conexión y en despliegues aislados de la red, sin configuración adicional. + +## Cómo Funciona + +1. Sube uno o más PDFs haciendo clic en la zona de carga o arrastrando los archivos. +2. Elige un **Nivel de compresión**: Bajo, Medio, Alto o Sin pérdidas. +3. Opcionalmente, ingresa un **Tamaño de archivo objetivo**, o expande **Ajustes personalizados** para un control más fino, incluido **Convertir a escala de grises**. +4. Haz clic en **Comprimir PDF**. Con varios archivos, obtienes una sola descarga en ZIP. + +## Documentos Especiales + +- **Los PDFs firmados digitalmente** se devuelven sin cambios, porque cualquier modificación invalidaría la firma. Activa **Anular la protección del contenido** en Ajustes personalizados para quitar las firmas y comprimirlos; la firma visible permanece en la página, pero el archivo deja de estar firmado. +- **Los archivos PDF/A** pierden su etiqueta PDF/A tras la compresión, para que el archivo nunca declare una conformidad que ya no cumple. Activa **Conservar PDF/A** en Ajustes personalizados para mantener la conformidad del archivo. +- **Los PDFs protegidos con contraseña** muestran un campo de contraseña en su tarjeta de archivo. Ingresa la contraseña allí y Hyper Compress abre el archivo por sí mismo, sin un paso de desbloqueo aparte. Con dos o más archivos bloqueados, un campo compartido desbloquea todos los archivos que usan la misma contraseña. La copia comprimida no tiene contraseña; usa [Proteger PDF](./protect-pdf) para agregarla de nuevo. +- **Los escaneos sin capa de texto** pueden reducirse aún más con **Rasteriza las páginas a imágenes** en Ajustes personalizados, que reemplaza cada página por una imagen optimizada. Se omite en cualquier documento con texto seleccionable, incluidos los escaneos con OCR, a menos que **Anular la protección del contenido** esté activado. En ese caso, las páginas de texto también se convierten en imágenes, por lo que el texto deja de ser seleccionable y los enlaces dejan de funcionar. + +## Niveles de Compresión + +| Nivel | Calidad de Imagen | Resolución Máxima | Ideal Para | +| ---------------- | ----------------- | ----------------- | ------------------------------ | +| **Bajo** | 80 | 200 DPI | Conservar la calidad visual | +| **Medio** | 50 | 150 DPI | Documentos de uso diario | +| **Alto** | 20 | 72 DPI | Adjuntos de correo, cargas web | +| **Sin pérdidas** | Imágenes intactas | Sin cambios | Copias de archivo | + +Alto también quita la incrustación de las 14 fuentes estándar de PDF, además de fuentes similares como Arial cuando es seguro hacerlo. + +## Tamaño de Archivo Objetivo + +Ingresa un tamaño en KB o MB y Hyper Compress busca la mejor calidad de imagen que aún quepa, partiendo del nivel que elegiste. Si el documento no puede llegar a ese tamaño, obtienes la versión más pequeña posible y un mensaje que lo indica. Las páginas dedicadas, como [Comprimir PDF a 1MB](https://www.bentopdf.com/compress-pdf-to-1mb), se abren con el objetivo ya rellenado. + +## Ajustes Personalizados + +Expande el panel Ajustes personalizados para ajustar Hyper Compress directamente. Al elegir un nivel de compresión, estos valores se restablecen a los de ese nivel, y al editar cualquiera de ellos el nivel cambia a Personalizado. + +- **Anular la protección del contenido**: por defecto, Hyper Compress deja intactos los PDFs firmados y no rasteriza páginas que tienen texto. Al activarlo se omiten ambas protecciones. Se mantiene activado cuando cambias el nivel. + +- **Imágenes**: calidad de imagen, resolución máxima, remuestreo forzado, reducción de color, recorte de áreas de imagen invisibles, eliminación de imágenes alternativas, simplificación de perfiles de color, JPEG 2000 y modo sin pérdida +- **Fuentes**: creación de subconjuntos, fusión de duplicados y eliminación de la incrustación de fuentes estándar y sus similares +- **Contenido**: aplanado de anotaciones, campos de formulario o enlaces +- **Limpieza**: eliminación de miniaturas, datos de aplicaciones, hilos de artículos, información de captura web, el árbol de estructura o los perfiles de salida +- **Rasterizar**: reemplazo de páginas por imágenes, para escaneos solo de imagen; se omite cuando el documento tiene texto seleccionable +- **Salida**: Conservar PDF/A y compresión Brotli para lectores de PDF 2.0 que la admitan + +## Casos de Uso + +- Reducir un informe de 50 MB para que quepa en el límite de adjuntos de un correo +- Lograr que un escaneo quede por debajo del estricto límite de carga de un portal usando un tamaño de archivo objetivo +- Optimizar PDFs de marketing para descargas más rápidas desde un sitio web +- Archivar grandes conjuntos de documentos cuando el costo de almacenamiento importa +- Reducir el uso de datos móviles al compartir PDFs por aplicaciones de mensajería + +## Consejos + +- Empieza con Medio. Si el resultado sigue siendo demasiado grande, define un tamaño de archivo objetivo o sube a Alto. +- Para un escaneo sin capa de texto, activa Rasteriza las páginas a imágenes en Ajustes personalizados. +- Convertir a escala de grises, en Ajustes personalizados, puede reducir el tamaño de documentos con mucho color. + +## Herramientas Relacionadas + +- [Linealizar PDF](./linearize-pdf): optimiza el PDF comprimido para verlo rápido en la web +- [Rasterizar PDF](./rasterize-pdf): convierte páginas en imágenes con un DPI específico, incluidas las páginas con texto +- [Reparar PDF](./repair-pdf): arregla un PDF que se dañó durante una compresión en otro lugar +- [Eliminar Metadatos](./remove-metadata): quita datos ocultos por privacidad diff --git a/docs/es/tools/crop-pdf.md b/docs/es/tools/crop-pdf.md new file mode 100644 index 00000000..840779e0 --- /dev/null +++ b/docs/es/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Recortar PDF +description: Recorta visualmente las páginas de un PDF dibujando una región de recorte en cada página con un editor basado en Cropper.js. +--- + +# Recortar PDF + +Recorta los márgenes de las páginas de tu PDF con una interfaz visual. Dibuja un rectángulo de recorte directamente sobre cada página, previsualiza el resultado y aplica el recorte. Puedes definir regiones de recorte distintas para diferentes páginas o aplicar el mismo recorte a todo el documento. + +## Cómo Funciona + +1. Sube tu archivo PDF. +2. Se abre el editor de recorte, que muestra la primera página con una superposición de recorte que se puede arrastrar. +3. Ajusta el rectángulo de recorte arrastrando sus bordes o esquinas. +4. Usa los botones de navegación de páginas para moverte entre ellas y definir la región de recorte de cada una. +5. Haz clic en **Recortar y descargar** para aplicar el recorte y descargar el resultado. + +## Características + +- Editor de recorte visual basado en Cropper.js, con controladores para un ajuste preciso +- Navegación página por página para definir regiones de recorte individuales +- Guarda los ajustes de recorte por página, para que puedas definir recortes distintos en páginas distintas +- Vista previa en vivo del área de recorte seleccionada +- Admite PDFs de cualquier tamaño u orientación de página + +## Casos de Uso + +- Quitar márgenes amplios de documentos escaneados para centrarse en el área de contenido +- Eliminar marcas de corte o de registro de impresora de PDFs de preimpresión +- Recortar diapositivas de clase para quitar el área de notas del presentador +- Quitar encabezados o pies de página de todas las páginas antes de compartir un extracto de un documento +- Redimensionar páginas para adaptarlas a una pantalla o un diseño de impresión específico + +## Consejos + +- La superposición de recorte se puede redimensionar y reposicionar libremente. Arrastra las esquinas para un cambio de tamaño proporcional o los bordes para un ajuste en un solo eje. +- Si todas las páginas necesitan el mismo recorte, defínelo en la primera página: la herramienta recuerda tu región de recorte mientras navegas por las páginas. +- Si necesitas estandarizar los tamaños de página en lugar de recortar visualmente, la herramienta Fijar Tamaño de Página puede ser más adecuada. + +## Herramientas Relacionadas + +- [Editor PDF](./edit-pdf) +- [Números de Página](./page-numbers) +- [Eliminar Páginas en Blanco](./remove-blank-pages) diff --git a/docs/es/tools/csv-to-pdf.md b/docs/es/tools/csv-to-pdf.md new file mode 100644 index 00000000..ffaef159 --- /dev/null +++ b/docs/es/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV a PDF +description: Convierte hojas de cálculo CSV en tablas PDF con formato directamente en tu navegador. +--- + +# CSV a PDF + +Convierte archivos CSV en documentos PDF limpios y con formato. Cada CSV se analiza y se muestra como una tabla en el PDF resultante. Es útil cuando necesitas imprimir o compartir datos tabulares sin que el destinatario tenga un programa de hojas de cálculo. + +## Formatos Compatibles + +| Formato | Extensiones | +| :------ | :---------- | +| CSV | `.csv` | + +## Cómo Funciona + +1. Haz clic en el área de carga o arrastra y suelta uno o más archivos CSV. +2. Revisa la lista de archivos. Agrega más archivos o quita los que no quieras. +3. Haz clic en **Convertir a PDF**. Un indicador de progreso muestra el estado de la conversión. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se empaquetan en `csv-converted.zip`. + +## Opciones + +Esta herramienta no tiene configuración adicional. El CSV se analiza y se formatea automáticamente como una tabla. + +## Resultado + +| Cantidad de Entradas | Resultado | +| :------------------- | :------------------------------------------------------------ | +| 1 archivo | Descarga de un solo PDF (p. ej., `data.pdf`) | +| 2+ archivos | Archivo ZIP (`csv-converted.zip`) con un PDF por cada archivo | + +## Casos de Uso + +- Convertir informes exportados de bases de datos en tablas PDF imprimibles +- Compartir datos financieros o listas de inventario con personas que no tienen Excel +- Crear versiones en PDF de archivos de registro CSV para documentación de cumplimiento +- Imprimir listas de direcciones, hojas de calificaciones o cualquier dato tabular guardado como CSV + +## Consejos + +- Para obtener los mejores resultados, asegúrate de que tu CSV use delimitadores de coma estándar. La herramienta sigue las convenciones comunes de análisis de CSV. +- Si tu CSV tiene muchas columnas, la tabla puede comprimirse para ajustarse al ancho de la página. Considera dividir los conjuntos de datos anchos en varios archivos. +- Para archivos de Excel (`.xls`, `.xlsx`), usa la herramienta [Excel a PDF](./excel-to-pdf), que conserva el formato de la hoja de cálculo y las múltiples hojas. + +## Herramientas Relacionadas + +- [Excel a PDF](./excel-to-pdf) +- [Texto a PDF](./txt-to-pdf) +- [JSON a PDF](./json-to-pdf) diff --git a/docs/es/tools/delete-pages.md b/docs/es/tools/delete-pages.md new file mode 100644 index 00000000..20337db5 --- /dev/null +++ b/docs/es/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Eliminar páginas +description: Quita páginas específicas de un PDF por número de página, rango o selección visual de miniaturas. +--- + +# Eliminar páginas + +Quita las páginas que no quieres de un documento PDF. Indica las páginas a eliminar escribiendo números de página o rangos, o haz clic directamente en las miniaturas para marcarlas. + +## Cómo Funciona + +1. Sube un archivo PDF. La herramienta genera vistas previas en miniatura de cada página. +2. Ingresa las páginas a eliminar en el campo de texto con la sintaxis de rangos (p. ej., `2, 5-8`), o haz clic en las miniaturas para alternarlas. +3. Las páginas marcadas se resaltan visualmente para que confirmes tu selección. +4. Haz clic en el botón de procesar. Se crea un nuevo PDF sin las páginas seleccionadas. + +## Características + +- Selección de páginas por texto con sintaxis de rangos (`2, 5-8, 12`) +- Cuadrícula visual de miniaturas para eliminar con un clic +- Resaltado en tiempo real de las páginas marcadas para eliminar +- Validación de la entrada según el número real de páginas +- Conserva todas las páginas no eliminadas en su orden original + +## Casos de Uso + +- Eliminar páginas en blanco o de relleno de un documento escaneado +- Eliminar portadas o apéndices antes de compartir un documento +- Limpiar páginas de borrador que quedaron por accidente en un PDF final +- Quitar páginas con información sensible antes de distribuir + +## Consejos + +- Eliminar páginas no afecta el contenido ni el formato de las páginas restantes. El resultado es una copia fiel del original sin las páginas eliminadas. +- Si quieres conservar solo ciertas páginas en lugar de quitar otras específicas, [Extraer Páginas](./extract-pages) es la mejor opción. +- La vista de miniaturas se carga de forma diferida, por lo que los documentos grandes siguen respondiendo con fluidez. + +## Herramientas Relacionadas + +- [Extraer Páginas](./extract-pages) +- [Organizar y Duplicar](./organize-pdf) +- [Dividir PDF](./split-pdf) diff --git a/docs/es/tools/deskew-pdf.md b/docs/es/tools/deskew-pdf.md new file mode 100644 index 00000000..68d2bbd3 --- /dev/null +++ b/docs/es/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Enderezar PDF +description: Endereza automáticamente las páginas inclinadas de PDFs escaneados con detección de inclinación de OpenCV. Umbral y DPI ajustables. +--- + +# Enderezar PDF + +Los documentos escaneados rara vez quedan perfectamente rectos. Incluso una ligera inclinación reduce la precisión del OCR y hace que la impresión se vea descuidada. Esta herramienta usa los algoritmos de procesamiento de imágenes de OpenCV para detectar el ángulo de inclinación de cada página y girarla de nuevo hasta dejarla nivelada. + +## Cómo Funciona + +1. Sube uno o más PDFs escaneados. +2. Define el **Umbral de inclinación**: las páginas con una inclinación detectada por debajo de este valor se dejan intactas. +3. Elige una **Calidad de procesamiento (DPI)**: un DPI mayor mejora la precisión de la detección, pero tarda más. +4. Haz clic en **Enderezar PDF**. +5. Tras el procesamiento, un panel de resultados muestra el ángulo detectado de cada página y si se corrigió. + +## Opciones + +| Ajuste | Valores | Predeterminado | +| ---------------------------------- | ------------------------- | -------------- | +| **Umbral de inclinación** | 0.1, 0.5, 1.0, 2.0 grados | 0.5 | +| **Calidad de procesamiento (DPI)** | 100, 150, 200, 300 | 150 | + +## Cómo Funciona la Detección de Inclinación + +La herramienta renderiza cada página como imagen con el DPI seleccionado y luego usa OpenCV para detectar los ángulos dominantes de las líneas del contenido. Si la inclinación detectada supera el umbral, la página se gira en el ángulo inverso para enderezarla. Las páginas por debajo del umbral pasan sin cambios. + +## Casos de Uso + +- Limpiar contratos o documentos legales escaneados por lotes +- Preparar recibos o facturas escaneados para el procesamiento OCR +- Enderezar páginas de un escáner de cama plana con una colocación del papel irregular +- Mejorar la calidad visual de materiales de archivo digitalizados + +## Consejos + +- Reduce el umbral a 0.1 grados si necesitas una alineación perfecta para el OCR. +- 150 DPI es rápido y preciso para la mayoría de los documentos. Usa 300 DPI para texto muy pequeño o páginas con detalles finos. +- Enderezar funciona mejor con documentos que tienen líneas de texto horizontales claras. Puede tener dificultades con páginas compuestas sobre todo por imágenes o elementos de diseño diagonales. + +## Herramientas Relacionadas + +- [Rasterizar PDF](./rasterize-pdf): convierte el resultado enderezado en un PDF plano basado en imágenes +- [Comprimir PDF](./compress-pdf): reduce el tamaño del archivo después de enderezar +- [Reparar PDF](./repair-pdf): arregla problemas estructurales en PDFs escaneados diff --git a/docs/es/tools/digital-sign-pdf.md b/docs/es/tools/digital-sign-pdf.md new file mode 100644 index 00000000..1302de35 --- /dev/null +++ b/docs/es/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Firma Digital +description: Agrega firmas digitales criptográficas a PDFs con certificados X.509. Admite los formatos PKCS#12 y PEM con opciones de firma visible. +--- + +# Firma Digital + +Una firma digital es una prueba criptográfica de que una persona específica firmó un documento y de que este no se ha alterado desde entonces. A diferencia de una firma dibujada (que es solo una imagen), una firma digital usa certificados X.509 y estándares PKCS#7 para ofrecer autenticidad e integridad verificables. + +BentoPDF aplica las firmas digitales por completo en tu navegador. Tu clave privada nunca sale de tu dispositivo. + +## Cómo Funciona + +1. Sube un archivo PDF. +2. Sube tu archivo de certificado (.pfx, .p12 o .pem). +3. Ingresa la contraseña del certificado para desbloquearlo. La herramienta muestra el sujeto, el emisor y el período de validez del certificado. +4. Opcionalmente, configura los metadatos de la firma (motivo, ubicación, información de contacto). +5. Opcionalmente, activa una **firma visible** con personalización de posición, tamaño, imagen y texto. +6. Haz clic en **Firmar PDF**. + +## Formatos de Certificado Compatibles + +| Formato | Extensiones | Descripción | +| ----------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Paquete estándar de la industria que contiene la clave privada y la cadena de certificados. El formato más común. | +| **PEM** | .pem | Formato basado en texto. Debe contener el certificado y la clave privada en un solo archivo. Admite claves privadas cifradas. | + +## Opciones de Firma Visible + +Al activarla, se renderiza un bloque de firma visible en la página del PDF: + +- **Posición**: coordenadas X/Y y ancho/alto en puntos +- **Página**: primera página, última página, todas las páginas o un número de página específico +- **Imagen**: sube una imagen PNG, JPG o WebP (tu firma manuscrita, el sello de tu empresa, etc.) +- **Texto**: texto personalizado con color y tamaño de fuente configurables. Si no se proporciona imagen ni texto, la herramienta genera automáticamente un texto a partir del nombre común del certificado y la fecha actual. + +## Metadatos de la Firma + +- **Motivo**: por qué se firmó el documento (p. ej., "Aprobado", "Revisado") +- **Ubicación**: dónde se realizó la firma (p. ej., "Nueva York, NY") +- **Información de contacto**: cómo comunicarse con el firmante (p. ej., una dirección de correo electrónico) + +## Nota sobre la Conexión a Internet + +Es posible que firmar requiera una conexión a internet. La biblioteca de firma obtiene la cadena de certificados desde las URL incluidas en la extensión Authority Information Access (AIA) de tu certificado. Si esos servidores no están disponibles, la firma fallará con los certificados que requieren validación de la cadena. + +## Casos de Uso + +- Firmar contratos, propuestas y acuerdos con firmas digitales jurídicamente vinculantes +- Certificar documentos oficiales en flujos de trabajo que requieren autenticación basada en PKI +- Firmar facturas en PDF para cumplir con la normativa (muchos países de la UE exigen facturas electrónicas firmadas digitalmente) +- Agregar la aprobación de una organización a planos de ingeniería o documentos de calidad + +## Consejos + +- Los certificados autofirmados sirven para pruebas, pero mostrarán advertencias en Adobe Reader. Usa un certificado de una Autoridad de Certificación de confianza para documentos en producción. +- La firma visible es solo visual. La firma criptográfica se incrusta independientemente de que el bloque visible esté activado. +- Verifica tu PDF firmado con la herramienta Validar Firma para confirmar que la firma está intacta. + +## Herramientas Relacionadas + +- [Validar Firma](./validate-signature-pdf): verifica las firmas digitales de PDFs firmados +- [Aplanar PDF](./flatten-pdf): aplana los formularios antes de firmar para evitar modificaciones +- [Cifrar PDF](./protect-pdf): agrega protección con contraseña sobre la firma digital +- [Eliminar Metadatos](./remove-metadata): quita los metadatos antes de firmar diff --git a/docs/es/tools/divide-pages.md b/docs/es/tools/divide-pages.md new file mode 100644 index 00000000..81775c26 --- /dev/null +++ b/docs/es/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Dividir páginas +description: Divide las páginas de un PDF horizontal o verticalmente en subpáginas más pequeñas. +--- + +# Dividir páginas + +Corta páginas individuales de un PDF por la mitad, de forma horizontal o vertical. Es útil cuando una sola página contiene contenido que debería separarse en páginas distintas, por ejemplo, un diseño de dos columnas escaneado como una sola página ancha. + +## Cómo Funciona + +1. Sube un archivo PDF. +2. Selecciona la dirección de la división: **Vertical** (mitades izquierda/derecha) u **Horizontal** (mitades superior/inferior). +3. Opcionalmente, especifica un rango de páginas para limitar cuáles se dividen. Déjalo en blanco para dividir todas las páginas. +4. Haz clic en el botón de procesar para generar el PDF dividido. + +## Características + +- División vertical: divide cada página en mitades izquierda y derecha +- División horizontal: divide cada página en mitades superior e inferior +- Filtro de rango de páginas para dividir solo páginas específicas +- Las páginas no seleccionadas pasan sin cambios +- Conserva la calidad del contenido sin volver a renderizar + +## Casos de Uso + +- Separar páginas escaneadas de dos en dos (p. ej., el escaneo de un libro con las páginas izquierda y derecha en una sola hoja) +- Dividir un PDF apaisado con contenido en paralelo en páginas verticales individuales +- Dividir infografías o pósteres altos en secciones superior e inferior separadas +- Preparar documentos de formato ancho para imprimirlos en papel estándar + +## Consejos + +- Si el contenido de tus páginas no está distribuido de forma uniforme, la división se hace igualmente en el punto medio exacto. Para divisiones asimétricas, considera usar [Recortar PDF](./crop-pdf). +- Combina esta herramienta con [Rotar PDF](./rotate-pdf) si tus páginas necesitan girarse antes o después de dividirlas. + +## Herramientas Relacionadas + +- [Dividir PDF](./split-pdf) +- [Recortar PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Posterizar PDF](./posterize-pdf) diff --git a/docs/es/tools/duplex-collate.md b/docs/es/tools/duplex-collate.md new file mode 100644 index 00000000..44714eae --- /dev/null +++ b/docs/es/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Intercalar escaneo a doble cara +description: Reordena PDFs de escaneo a doble cara que contienen las páginas frontales y traseras en bloques separados, para dejarlas en el orden correcto de anverso y reverso. +--- + +# Intercalar escaneo a doble cara + +Intercalar escaneo a doble cara está pensado para flujos de escaneo con alimentador automático (ADF) donde un PDF contiene dos bloques de páginas: + +- primero todos los anversos +- después todos los reversos + +En lugar de dividir y reensamblar manualmente, esta herramienta intercala los dos bloques en el orden natural de lectura: anverso1, reverso1, anverso2, reverso2, y así sucesivamente. + +## Cómo Funciona + +1. Sube un único PDF creado al escanear una pila a doble cara. +2. Define el punto de división donde termina el bloque de anversos. +3. Elige cómo tratar el bloque de reversos: + - **Invertir el bloque de reversos** (habitual cuando se voltea la pila antes de escanear los reversos) + - **Mantener el bloque de reversos tal cual** +4. Haz clic en **Intercalar PDF** para descargar el resultado reordenado. + +## Opciones + +- **Detectar división automáticamente (mitad)**: fija el punto de división en `ceil(totalPages / 2)`. +- **Aviso de páginas impares**: avisa cuando el total de páginas es impar (a menudo indica un desajuste en el escaneo). +- **Confirmación de bloques desiguales**: pide confirmación cuando los bloques de anversos y reversos tienen tamaños distintos. +- **Exportación agrupada**: divide el resultado intercalado en PDFs separados según el número de páginas del documento original y los descarga como ZIP. + +## Comportamiento de la Salida + +- **Predeterminado**: un PDF de salida (un solo PDF de entrada, un solo PDF de salida). +- **Modo agrupado**: la salida se divide en fragmentos según tu valor de páginas por documento; si se producen varios fragmentos, se descargan en un único ZIP; de lo contrario, se descarga un solo PDF. + +Si los bloques tienen tamaños distintos, primero se intercalan las páginas emparejadas y las páginas restantes sin pareja se agregan al final. + +## Casos de Uso Comunes + +- Restaurar el orden después de escanear una pila de formularios a doble cara en dos pasadas. +- Reconstruir paquetes de anverso y reverso a partir de escáneres de oficina que entregan todos los anversos y luego todos los reversos. +- Posprocesar escaneos de archivo antes de dividirlos en archivos por documento. + +## Consejos + +- La mayoría de los lotes a doble cara deberían tener un total de páginas par. +- Si los reversos se ven invertidos en el resultado, alterna entre **Invertir el bloque de reversos** y **Mantener el bloque de reversos tal cual**. +- Para originales de 2 páginas (anverso y reverso), usa la exportación agrupada con `2` páginas por documento. + +## Herramientas Relacionadas + +- [Alternar y Mezclar Páginas](./alternate-merge) +- [Dividir PDF](./split-pdf) +- [Fusionar PDF](./merge-pdf) +- [Organizar y Duplicar](./organize-pdf) diff --git a/docs/es/tools/edit-attachments.md b/docs/es/tools/edit-attachments.md new file mode 100644 index 00000000..49218748 --- /dev/null +++ b/docs/es/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Editar adjuntos +description: Consulta y elimina de forma selectiva los archivos adjuntos incrustados en un documento PDF. +--- + +# Editar adjuntos + +Inspecciona y administra los archivos adjuntos dentro de un PDF. La herramienta lista cada archivo incrustado con su nombre y su nivel de adjunto, y te permite marcar adjuntos individuales para eliminarlos o quitarlos todos a la vez. + +## Cómo Funciona + +1. Sube un archivo PDF. +2. La herramienta busca automáticamente los adjuntos y los muestra en una lista. +3. Cada adjunto muestra su nombre de archivo y si es un adjunto a nivel de documento o de página. +4. Haz clic en el icono de la papelera junto a un adjunto para marcarlo para eliminarlo (haz clic de nuevo para desmarcarlo). +5. Usa el botón **Quitar todos los adjuntos** para seleccionar todo a la vez, o **Deseleccionar todo** para borrar tus selecciones. +6. Haz clic en el botón de procesar para guardar un nuevo PDF sin los adjuntos seleccionados. + +## Características + +- Lista todos los adjuntos a nivel de documento y de página +- Eliminación individual o masiva de adjuntos +- Activa y desactiva la selección antes de confirmar los cambios +- Texto tachado y cambio de opacidad en los elementos marcados para eliminar +- Descarga el PDF modificado sin los adjuntos seleccionados + +## Casos de Uso + +- Quitar archivos obsoletos o incorrectos incrustados en un documento antes de redistribuirlo +- Eliminar adjuntos sensibles (datos financieros, información personal) de un PDF antes de compartirlo +- Reducir el tamaño de un PDF quitando archivos incrustados grandes que ya no se necesitan +- Auditar el contenido incrustado y limpiar un documento antes de archivarlo + +## Consejos + +- Los adjuntos marcados para eliminar se muestran tachados. Puedes volver a activarlos antes de procesar si cambias de opinión. +- Si no se encuentran adjuntos, la herramienta muestra un mensaje claro de "No se encontraron adjuntos": el PDF simplemente no contiene archivos incrustados. + +## Herramientas Relacionadas + +- [Agregar Adjuntos](./add-attachments) +- [Extraer Adjuntos](./extract-attachments) +- [Ver Metadatos](./view-metadata) diff --git a/docs/es/tools/edit-metadata.md b/docs/es/tools/edit-metadata.md new file mode 100644 index 00000000..a338dd6b --- /dev/null +++ b/docs/es/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Editar metadatos +description: Consulta y modifica los campos de metadatos de un PDF, como título, autor, palabras clave, fechas y propiedades personalizadas. +--- + +# Editar metadatos + +Edita los metadatos incrustados en un archivo PDF. La herramienta rellena un formulario con los metadatos existentes del documento, te permite modificar cualquier campo y guarda los cambios en un nuevo PDF. + +## Cómo Funciona + +1. Sube un archivo PDF. La herramienta lee sus metadatos actuales y rellena el formulario. +2. Edita cualquiera de los campos estándar: Título, Autor, Asunto, Palabras clave, Creador, Productor. +3. Ajusta Fecha de creación y Fecha de modificación con los selectores de fecha y hora. +4. Agrega campos de metadatos personalizados haciendo clic en el botón de agregar e ingresando un par clave-valor. +5. Haz clic en el botón de procesar para guardar el PDF modificado. + +## Características + +- Rellena todos los metadatos existentes del PDF subido +- Campos estándar: Título, Autor, Asunto, Palabras clave, Creador, Productor +- Selectores de fecha y hora para Fecha de creación y Fecha de modificación +- Campos de metadatos personalizados de clave-valor para propiedades arbitrarias +- Guarda los cambios directamente en el diccionario de información del documento PDF + +## Campos Editables + +| Campo | Descripción | +| ------------------------- | ------------------------------------------------------------- | +| **Título** | El título del documento que se muestra en los lectores de PDF | +| **Autor** | La persona u organización que creó el documento | +| **Asunto** | Una breve descripción del tema del documento | +| **Palabras clave** | Términos separados por comas para búsqueda y categorización | +| **Creador** | La aplicación que creó originalmente el contenido | +| **Productor** | La aplicación que generó el PDF | +| **Fecha de creación** | Cuándo se creó el documento originalmente | +| **Fecha de modificación** | Cuándo se modificó el documento por última vez | +| **Campos personalizados** | Cualquier par clave-valor adicional que definas | + +## Casos de Uso + +- Establecer un título y un autor adecuados antes de publicar un documento +- Agregar palabras clave para mejorar la capacidad de búsqueda en sistemas de gestión documental +- Actualizar la fecha de modificación para reflejar la revisión actual +- Agregar campos de metadatos personalizados como Departamento, ID de proyecto o Clasificación +- Limpiar los metadatos dejados por el software de creación original + +## Consejos + +- Los campos personalizados se escriben directamente en el diccionario de información del PDF. Algunos lectores de PDF pueden no mostrar los campos personalizados, pero se conservan en el archivo. +- Deja un campo en blanco para borrarlo de los metadatos. El botón de procesar guarda lo que haya en el formulario. +- Para ver los metadatos sin editarlos, usa [Ver Metadatos](./view-metadata). Para eliminar todos los metadatos por completo, usa Eliminar Metadatos. + +## Herramientas Relacionadas + +- [Ver Metadatos](./view-metadata) +- [Capas PDF (OCG)](./pdf-layers) +- [Comprimir PDF](./compress-pdf) diff --git a/docs/es/tools/edit-pdf.md b/docs/es/tools/edit-pdf.md new file mode 100644 index 00000000..39d94a2f --- /dev/null +++ b/docs/es/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Editor PDF +description: Anota, resalta, tacha, agrega formas e imágenes, busca y visualiza PDFs directamente en tu navegador. +--- + +# Editor PDF + +El Editor PDF de BentoPDF te permite anotar, resaltar, tachar contenido (redactar), comentar, agregar formas e imágenes y buscar dentro de tus PDFs. Carga un editor completo directamente en tu navegador, sin subir nada a ningún servidor. + +## Cómo Funciona + +1. Sube tu PDF haciendo clic en la zona de carga o arrastrando un archivo sobre ella. +2. El editor de PDF integrado se abre automáticamente con tu documento cargado. +3. Usa la barra de herramientas para anotar, resaltar, redactar, agregar texto, dibujar formas o insertar imágenes. +4. Haz clic en **Descargar PDF editado** para guardar tus cambios. + +## Características + +- Barra de herramientas de anotación completa con resaltado, subrayado, tachado y dibujo a mano alzada +- Inserción de texto y comentarios +- Herramientas de redacción que eliminan de forma permanente el contenido marcado una vez que aplicas la redacción. Si alguna marca no se ha aplicado cuando haces clic en **Descargar PDF editado**, el editor te ofrece aplicarlas primero. +- Herramientas de formas para rectángulos, círculos, líneas y flechas +- Inserción de imágenes en las páginas del PDF +- Búsqueda de texto integrada en todo el documento +- Compatibilidad con varios documentos mediante pestañas (hasta 10 documentos abiertos simultáneamente) +- Carga de archivos con arrastrar y soltar + +## Casos de Uso + +- Revisar contratos y marcar cambios con resaltados y comentarios +- Redactar información confidencial, como números de seguro social o datos financieros, antes de compartir +- Agregar anotaciones a planos arquitectónicos o dibujos de ingeniería +- Insertar logotipos o sellos de empresa en las páginas de un documento +- Buscar términos específicos en documentos legales extensos + +## Consejos + +- Puedes abrir varios PDFs a la vez y cambiar entre ellos con la barra de pestañas en la parte superior del editor. +- El editor conserva la estructura original del PDF, por lo que las fuentes, los diseños y los campos de formulario permanecen intactos. +- Marcar texto o un área para redactar no elimina nada hasta que se aplica la redacción. Cuando redactas texto seleccionado, también se eliminan de la descarga las copias de ese texto en las propiedades del archivo, los marcadores, los comentarios y los adjuntos, a menos que el archivo esté cifrado. +- Para marcas de agua o numeración de páginas en lote, usa las herramientas dedicadas, que ofrecen más control sobre el formato. + +## Herramientas Relacionadas + +- [Agregar Marca de Agua](./add-watermark) +- [Firmar PDF](./sign-pdf) +- [Agregar Sellos](./add-stamps) +- [Eliminar Anotaciones](./remove-annotations) diff --git a/docs/es/tools/email-to-pdf.md b/docs/es/tools/email-to-pdf.md new file mode 100644 index 00000000..dcb06f7f --- /dev/null +++ b/docs/es/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email a PDF +description: Convierte archivos de correo EML y MSG a PDF en tu navegador. Conserva los encabezados, el cuerpo y la lista de adjuntos. +--- + +# Email a PDF + +Convierte correos electrónicos guardados en PDFs limpios e imprimibles. La herramienta analiza archivos EML y MSG, extrae el mensaje completo (encabezados, contenido del cuerpo y metadatos de los adjuntos) y lo renderiza todo en un PDF estructurado. Es útil para peritajes legales, archivo de registros o simplemente para imprimir un correo importante. + +## Formatos Compatibles + +| Formato | Extensión | Notas | +| :------ | :-------- | :------------------------------------------------------------------------------------- | +| EML | `.eml` | Formato estándar de correo MIME (exportado desde la mayoría de los clientes de correo) | +| MSG | `.msg` | Formato propietario de Microsoft Outlook | + +## Cómo Funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos EML o MSG. Puedes mezclar ambos formatos en un mismo lote. +2. Revisa la lista de archivos. Quita las entradas que no quieras con el icono de la papelera, o haz clic en **Agregar Más Archivos** para incluir más correos. +3. Configura las opciones de conversión (ver abajo). +4. Haz clic en **Convertir a PDF**. La herramienta analiza cada correo, renderiza el contenido como HTML con estilo y lo convierte a PDF con el motor PyMuPDF. +5. Un solo correo se descarga directamente como PDF. Varios correos se empaquetan en `emails-converted.zip`. + +## Opciones + +| Opción | Predeterminado | Descripción | +| :-------------------------------------------------- | :------------- | :---------------------------------------------------------------------------------------------------------------- | +| **Tamaño de página** | A4 | Elige entre las dimensiones de página A4, Letter o Legal. | +| **Incluir destinatarios CC y CCO en el encabezado** | Activado | Si está activada, las listas de destinatarios CC y CCO aparecen en la sección de encabezado del correo en el PDF. | +| **Incluir lista de archivos adjuntos del correo** | Activado | Si está activada, en el PDF aparece una lista de los archivos adjuntos del correo (con nombres y tamaños). | + +## Casos de Uso + +- Archivar correspondencia comercial importante como PDF para cumplimiento normativo o auditorías +- Imprimir cadenas de correos para procedimientos legales o solicitudes de pruebas +- Crear un registro permanente de confirmaciones de pedidos, recibos o contratos recibidos por correo +- Respaldar archivos MSG de Outlook en un formato que no requiere Outlook para leerse +- Documentar interacciones de atención al cliente a partir de archivos EML exportados + +## Consejos + +- Se admiten tanto EML (usado por Thunderbird, Apple Mail y la mayoría de los clientes de correo) como archivos MSG de Outlook. Exporta los correos desde tu cliente de correo y suéltalos directamente en la herramienta. +- Los correos con formato HTML conservan su estilo en el PDF. Los correos de texto plano se renderizan con un formato limpio y legible. +- La lista de adjuntos muestra nombres de archivo y tamaños, pero no incrusta los archivos adjuntos reales en el PDF. + +## Herramientas Relacionadas + +- [XML a PDF](./xml-to-pdf) +- [XPS a PDF](./xps-to-pdf) diff --git a/docs/es/tools/epub-to-pdf.md b/docs/es/tools/epub-to-pdf.md new file mode 100644 index 00000000..8e06facf --- /dev/null +++ b/docs/es/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB a PDF +description: Convierte libros electrónicos EPUB a PDF en tu navegador. Gratis, sin subir archivos, con conversión que prioriza la privacidad. +--- + +# EPUB a PDF + +Convierte libros electrónicos EPUB en archivos PDF sin salir de tu navegador. EPUB es el estándar abierto para libros digitales, pero a veces necesitas un PDF de diseño fijo para imprimir, anotar o compartir con personas que no tienen un lector de libros electrónicos. + +## Formatos Compatibles + +| Formato | Extensión | Notas | +| :------ | :-------- | :----------------------- | +| EPUB | `.epub` | Archivos EPUB 2 y EPUB 3 | + +## Cómo Funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos EPUB. Se admite la selección múltiple. +2. Revisa los archivos subidos. Quita las entradas que no quieras con el icono de la papelera, o haz clic en **Agregar Más Archivos** para ampliar el lote. +3. Haz clic en **Convertir a PDF**. El motor PyMuPDF renderiza el contenido del EPUB (texto, imágenes y formato) en un PDF paginado. +4. Un solo EPUB se descarga directamente como PDF. Varios archivos se empaquetan en un ZIP llamado `epub-converted.zip`. + +## Opciones + +La conversión se ejecuta con valores predeterminados razonables y no requiere configuración. El texto se reajusta a las dimensiones de página estándar, y las fuentes e imágenes incrustadas pasan al PDF. + +## Casos de Uso + +- Imprimir un libro electrónico sin DRM para leerlo lejos de las pantallas +- Enviar un manuscrito EPUB como PDF de diseño fijo para su revisión +- Archivar libros digitales en un formato que cualquier sistema operativo pueda abrir de forma nativa +- Compartir un capítulo con un colega que no tiene un lector de EPUB +- Convertir documentación técnica distribuida en EPUB en PDFs que se pueden anotar + +## Consejos + +- Las funciones de EPUB 3, como el audio y el video incrustados, no pasan al PDF, pero todo el texto, las imágenes y las tablas se convierten sin problemas. +- Para obtener los mejores resultados con EPUBs de estilo muy elaborado, revisa las primeras páginas del resultado para confirmar la fidelidad del diseño. + +## Herramientas Relacionadas + +- [MOBI a PDF](./mobi-to-pdf) +- [FB2 a PDF](./fb2-to-pdf) +- [CBZ a PDF](./cbz-to-pdf) diff --git a/docs/es/tools/excel-to-pdf.md b/docs/es/tools/excel-to-pdf.md new file mode 100644 index 00000000..41a2df9c --- /dev/null +++ b/docs/es/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel a PDF +description: Convierte hojas de cálculo de Excel (XLS, XLSX), ODS y archivos CSV a PDF conservando el formato. +--- + +# Excel a PDF + +Convierte hojas de cálculo a PDF. La herramienta admite archivos modernos de Excel, el formato XLS heredado, hojas de cálculo OpenDocument e incluso CSV, todo renderizado con un motor LibreOffice que se ejecuta en el navegador y conserva el formato de las celdas, las fórmulas (como valores calculados), los gráficos y los diseños de varias hojas. + +## Formatos Compatibles + +| Formato | Extensiones | +| :--------------------------- | :---------- | +| Excel (moderno) | `.xlsx` | +| Excel (heredado) | `.xls` | +| Hoja de cálculo OpenDocument | `.ods` | +| CSV | `.csv` | + +## Cómo Funciona + +1. Haz clic en el área de carga o arrastra y suelta tus hojas de cálculo. +2. Revisa la lista de archivos. Agrega más archivos o quita los que no quieras. +3. Haz clic en **Convertir a PDF**. El motor LibreOffice se inicializa en el primer uso y luego procesa cada archivo. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se entregan como `excel-converted.zip`. + +## Opciones + +Esta herramienta no tiene configuración adicional. El motor LibreOffice determina el diseño de página, la escala y el área de impresión según los ajustes integrados de la hoja de cálculo. + +## Resultado + +| Cantidad de Entradas | Resultado | +| :------------------- | :------------------------------------------------------------------------ | +| 1 archivo | Descarga de un solo PDF (nombre de archivo original con extensión `.pdf`) | +| 2+ archivos | Archivo ZIP (`excel-converted.zip`) con un PDF por cada archivo | + +## Casos de Uso + +- Convertir informes financieros o presupuestos de Excel a PDF para distribuirlos +- Crear PDFs listos para imprimir a partir de hojas de cálculo de inventario o catálogos de productos +- Compartir resultados de análisis de datos con personas que no tienen Excel instalado +- Archivar informes trimestrales en un formato no editable +- Convertir archivos ODS de LibreOffice Calc a PDF + +## Consejos + +- Los gráficos incrustados en la hoja de cálculo se renderizan en el PDF. Asegúrate de que se vean correctos en el archivo de origen antes de convertir. +- Si tu hoja de cálculo tiene varias hojas, todas se incluyen en el PDF resultante. +- Para datos CSV simples sin formato, la herramienta [CSV a PDF](./csv-to-pdf) ofrece una conversión más ligera. Usa Excel a PDF cuando necesites conservar formato, gráficos o varias hojas. + +## Herramientas Relacionadas + +- [CSV a PDF](./csv-to-pdf) +- [Word a PDF](./word-to-pdf) +- [PowerPoint a PDF](./powerpoint-to-pdf) diff --git a/docs/es/tools/extract-attachments.md b/docs/es/tools/extract-attachments.md new file mode 100644 index 00000000..63f2865e --- /dev/null +++ b/docs/es/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Extraer adjuntos +description: Extrae todos los archivos adjuntos incrustados de uno o más PDFs y descárgalos como un archivo ZIP. +--- + +# Extraer adjuntos + +Saca todos los adjuntos incrustados de uno o más archivos PDF. Todos los archivos extraídos se agrupan en un único ZIP para su descarga. + +## Cómo Funciona + +1. Sube uno o más archivos PDF que contengan adjuntos incrustados. +2. Haz clic en **Extraer adjuntos**. +3. La herramienta busca en cada PDF los adjuntos a nivel de documento y de página. +4. Todos los archivos encontrados se empaquetan en un ZIP y se descargan automáticamente. +5. Un mensaje de estado confirma cuántos adjuntos se encontraron y su tamaño total. + +## Características + +- Extracción por lotes de varios PDFs a la vez +- Extrae tanto los adjuntos a nivel de documento como de página +- Genera un único archivo ZIP con todos los archivos extraídos +- Muestra la cantidad total de adjuntos y el tamaño combinado de los archivos +- Mensajes de estado claros si no se encuentran adjuntos + +## Casos de Uso + +- Recuperar archivos de datos incrustados en el PDF de un informe +- Sacar recursos de imagen de un portafolio o de un documento de especificaciones +- Extraer materiales complementarios de PDFs de capacitación o de cumplimiento +- Auditar qué archivos están incrustados en un lote de PDFs + +## Consejos + +- Si la herramienta indica que no hay adjuntos, el PDF puede contener imágenes incrustadas o datos de formulario, que no son archivos adjuntos. Usa [Extraer imágenes](./extract-images) para las imágenes incrustadas. +- Al procesar varios PDFs, todos los adjuntos de cada archivo terminan en un solo ZIP. Los nombres de archivo se conservan tal como estaban en las incrustaciones originales. + +## Herramientas Relacionadas + +- [Agregar Adjuntos](./add-attachments) +- [Editar Adjuntos](./edit-attachments) +- [Extraer imágenes](./extract-images) diff --git a/docs/es/tools/extract-images.md b/docs/es/tools/extract-images.md new file mode 100644 index 00000000..25ceb8ce --- /dev/null +++ b/docs/es/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Extraer imágenes +description: Extrae todas las imágenes incrustadas de archivos PDF. Previsualízalas en una cuadrícula y descárgalas individualmente o como un archivo ZIP. +--- + +# Extraer imágenes + +Saca todas las imágenes incrustadas de uno o más archivos PDF. Las imágenes extraídas se muestran en una cuadrícula de vista previa donde puedes descargarlas individualmente o todas a la vez como un ZIP. Funciona con PyMuPDF. + +## Cómo Funciona + +1. Sube uno o más PDFs haciendo clic en la zona de carga o arrastrando archivos sobre ella. Agrega más archivos o quita archivos individuales según necesites. +2. Haz clic en **Extraer imágenes** para iniciar el procesamiento. +3. La herramienta recorre cada página de cada PDF subido, buscando y extrayendo las imágenes incrustadas. +4. Las imágenes extraídas aparecen en una cuadrícula con miniaturas. Cada imagen tiene un botón de descarga. +5. Haz clic en **Descargar todo** para guardar todo como un archivo ZIP. + +## Opciones + +Esta herramienta no tiene opciones configurables. Todas las imágenes incrustadas se extraen en su formato original (normalmente PNG, JPEG o el formato que se usó cuando la imagen se incrustó en el PDF). + +## Formato de Salida + +- Las imágenes se muestran en una cuadrícula de vista previa con nombres como `image_1.png`, `image_2.jpg`, etc. +- **Descargar todo** genera `extracted-images.zip` con todas las imágenes. +- Las imágenes individuales se pueden descargar una por una desde la cuadrícula. + +## Casos de Uso + +- Recuperar fotos o gráficos de un PDF para reutilizarlos en otro proyecto. +- Extraer imágenes de productos del PDF de un catálogo para un listado de comercio electrónico. +- Sacar diagramas de documentación técnica para usarlos en presentaciones. +- Auditar qué imágenes están incrustadas en un documento antes de compartirlo. + +## Consejos + +- La herramienta extrae las imágenes exactamente como están almacenadas en el PDF. No vuelve a renderizar las páginas como imágenes; para eso, usa [PDF a PNG](./pdf-to-png) o [PDF a JPG](./pdf-to-jpg). +- Si la herramienta muestra "No se encontraron imágenes", es posible que el PDF use gráficos vectoriales en lugar de imágenes raster incrustadas, o que sea un documento escaneado donde toda la página es una sola imagen grande. +- El procesamiento por lotes funciona con varios PDFs. Todas las imágenes de todos los archivos se combinan en una sola cuadrícula y un solo ZIP. + +## Herramientas Relacionadas + +- [PDF a PNG](./pdf-to-png) +- [PDF a JPG](./pdf-to-jpg) +- [Constructor de flujos de trabajo PDF](./pdf-workflow) diff --git a/docs/es/tools/extract-pages.md b/docs/es/tools/extract-pages.md new file mode 100644 index 00000000..3fa6376e --- /dev/null +++ b/docs/es/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Extraer páginas +description: Guarda un rango específico de páginas de un PDF como un documento nuevo. +--- + +# Extraer páginas + +Saca un conjunto de páginas de un PDF y guárdalas como un archivo nuevo. Indica exactamente qué páginas quieres con la sintaxis de rangos, y la herramienta crea un PDF limpio que contiene solo esas páginas. + +## Cómo Funciona + +1. Sube un archivo PDF. La herramienta muestra el nombre del archivo, su tamaño y el total de páginas. +2. Ingresa las páginas que quieres extraer con la sintaxis de rangos (p. ej., `1-5`, `3, 7, 10-12`). +3. Opcionalmente, elige descargar cada rango como un PDF separado dentro de un archivo ZIP. +4. Haz clic en el botón de procesar. Las páginas extraídas se descargan como un nuevo PDF (o ZIP). + +## Características + +- Sintaxis flexible de rangos de páginas: páginas individuales, rangos o combinaciones separadas por comas +- Muestra el total de páginas después de la carga para consultarlo fácilmente +- Opción de generar un único PDF combinado o archivos separados en un ZIP +- Conserva el contenido y el formato originales de las páginas + +## Casos de Uso + +- Sacar el resumen ejecutivo (las primeras páginas) de un informe extenso +- Extraer un solo capítulo del PDF de un libro de texto +- Guardar páginas específicas de un paquete de formularios como documentos independientes +- Crear un documento de muestra con páginas seleccionadas de un archivo más grande + +## Consejos + +- Los números de página empiezan en 1. Usa `1` para la primera página, no `0`. +- Para quitar páginas en lugar de extraerlas, usa [Eliminar Páginas](./delete-pages), que es la operación inversa. +- Si necesitas selección visual de páginas con miniaturas, usa [Dividir PDF](./split-pdf) en el modo Visual Select. + +## Herramientas Relacionadas + +- [Dividir PDF](./split-pdf) +- [Eliminar Páginas](./delete-pages) +- [Fusionar PDF](./merge-pdf) diff --git a/docs/es/tools/extract-tables.md b/docs/es/tools/extract-tables.md new file mode 100644 index 00000000..97ac8a9e --- /dev/null +++ b/docs/es/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Extraer Tablas de PDF +description: Detecta y extrae tablas de documentos PDF. Exporta como CSV, JSON o Markdown con granularidad por tabla. +--- + +# Extraer Tablas de PDF + +Detecta todas las tablas de un PDF y te permite exportarlas en el formato que prefieras: CSV, JSON o Markdown. Cada tabla se extrae de forma individual con metadatos de página y posición. Funciona con el motor de detección de tablas de PyMuPDF. + +## Cómo Funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo sobre ella. +2. Selecciona tu **formato de exportación** preferido: CSV, JSON o Markdown. +3. Haz clic en **Extraer tablas** para iniciar el procesamiento. +4. Si se encuentra una tabla, se descarga como un solo archivo. Si hay varias tablas, se genera un archivo ZIP con un archivo por tabla. + +## Opciones + +- **Formato de exportación**: elige entre: + - **CSV**: valores separados por comas con las comillas adecuadas para campos que contienen comas, comillas o saltos de línea. Adecuado para hojas de cálculo y bases de datos. + - **JSON**: estructura de arreglos de arreglos, con formato legible y sangría de 2 espacios. Adecuado para su consumo por programas. + - **Markdown**: formato de tabla delimitado por barras verticales, generado por PyMuPDF. Adecuado para documentación y archivos README. + +## Formato de Salida + +- **Una sola tabla**: `filename_table.csv` (o `.json` / `.md`) +- **Varias tablas**: `filename_tables.zip` con archivos llamados `table_1_page3.csv`, `table_2_page5.csv`, etc. + +## Casos de Uso + +- Extraer tablas específicas de informes PDF extensos sin sacar los datos de todo el documento. +- Obtener tablas en formato Markdown para pegarlas directamente en issues de GitHub, wikis o documentación. +- Sacar datos JSON estructurados de tablas de PDF para integraciones de API o scripts. +- Comparar tablas entre distintas versiones de un PDF exportando ambas a CSV y comparando las diferencias. + +## Consejos + +- Esta herramienta te da control por tabla. Si solo quieres volcar todas las tablas en un único CSV, usa [PDF a CSV](./pdf-to-csv). Para un libro completo de Excel, usa [PDF a Excel](./pdf-to-excel). +- Las tablas que abarcan varias páginas pueden detectarse como tablas separadas por página. Es posible que debas concatenarlas manualmente. +- Si no se detecta ninguna tabla, el PDF podría ser una imagen escaneada. Pásalo primero por OCR para agregar una capa de texto. + +## Herramientas Relacionadas + +- [PDF a CSV](./pdf-to-csv) +- [PDF a Excel](./pdf-to-excel) +- [PDF a Texto](./pdf-to-text) diff --git a/docs/es/tools/fb2-to-pdf.md b/docs/es/tools/fb2-to-pdf.md new file mode 100644 index 00000000..99cd2aea --- /dev/null +++ b/docs/es/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 a PDF +description: Convierte libros electrónicos FictionBook (FB2) a PDF en tu navegador. Gratis, privado, sin subir nada a ningún servidor. +--- + +# FB2 a PDF + +Convierte archivos FictionBook 2 (FB2) en documentos PDF. FB2 es un formato de libro electrónico basado en XML, popular en Rusia y Europa del Este. Aunque tiene buen soporte en ciertas plataformas, en otras es prácticamente desconocido: convertirlo a PDF hace que tus libros se puedan leer en cualquier parte. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :------------ | :-------- | :----------------------------- | +| FictionBook 2 | `.fb2` | Formato de libro basado en XML | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos FB2. Puedes seleccionar varios a la vez. +2. Revisa la lista de archivos. Usa el icono de papelera para quitar entradas individuales, o **Agregar Más Archivos** para incluir más. +3. Haz clic en **Convertir a PDF**. El motor PyMuPDF analiza la estructura XML del FB2 y la renderiza como contenido PDF paginado. +4. Un solo archivo se descarga directamente como PDF. Varias conversiones se agrupan en `fb2-converted.zip`. + +## Opciones + +No hace falta configurar nada. El conversor gestiona automáticamente la estructura XML del FB2 y conserva los saltos de capítulo, el formato y las imágenes incrustadas. + +## Casos de uso + +- Leer libros FB2 en dispositivos o aplicaciones que solo admiten PDF +- Imprimir literatura en ruso distribuida en formato FB2 +- Archivar una biblioteca FB2 en un formato compatible con todo +- Compartir un libro con alguien cuyo lector no admite FictionBook + +## Consejos + +- Los archivos FB2 son XML plano, así que suelen ser pequeños y se convierten rápido incluso en el navegador. +- Si tus archivos FB2 están comprimidos como `.fb2.zip`, extráelos antes de subirlos. + +## Herramientas relacionadas + +- [EPUB a PDF](./epub-to-pdf) +- [MOBI a PDF](./mobi-to-pdf) +- [XML a PDF](./xml-to-pdf) diff --git a/docs/es/tools/fix-page-size.md b/docs/es/tools/fix-page-size.md new file mode 100644 index 00000000..5b9a9c70 --- /dev/null +++ b/docs/es/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Ajustar tamaño de página +description: Unifica todas las páginas de un PDF en un mismo tamaño. Elige entre tamaños de papel estándar o define dimensiones personalizadas. +--- + +# Ajustar tamaño de página + +Los PDF creados a partir de varias fuentes suelen tener páginas de tamaños distintos: algunas Letter, otras A4, otras totalmente fuera de norma. Esta herramienta fuerza todas las páginas a un único tamaño, escalando el contenido para ajustarlo o llenarlo según haga falta. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Selecciona un **Tamaño de página de destino** en el menú desplegable (A4, Letter, Legal, A3, A5, Tabloid o Custom). +3. Elige una **Orientación**: Auto mantiene la orientación original de cada página, o puedes forzar Portrait o Landscape. +4. Elige un modo de **Escalado del contenido**: Fit (conserva todo el contenido, puede añadir márgenes) o Fill (llena la página, puede recortar los bordes). +5. Opcionalmente, define un **Color de fondo** para los márgenes añadidos. +6. Haz clic en **Ajustar tamaño de página**. + +## Opciones + +- **Tamaños estándar**: A4, Letter, Legal, A3, A5, Tabloid +- **Dimensiones personalizadas**: introduce ancho y alto en pulgadas o milímetros +- **Orientación**: Automática, Vertical, Horizontal +- **Modo de escalado**: Fit o Fill (Crop) +- **Color de fondo**: cualquier color para el relleno de los márgenes + +## Casos de uso + +- Normalizar un PDF combinado cuyas páginas vienen de escáneres distintos +- Convertir un documento US Letter a A4 para distribución internacional +- Preparar PDF listos para imprimir que exigen un tamaño de corte uniforme +- Corregir páginas ligeramente fuera de estándar (por ejemplo, 8,49 x 11,02 pulgadas en lugar de 8,5 x 11) + +## Consejos + +- Usa el modo Fit para garantizar que no se pierda contenido. El modo Fill se ve más limpio, pero puede recortar los bordes. +- Revisa el resultado con la herramienta Dimensiones de página para confirmar que todas las páginas coinciden con el tamaño objetivo. +- El color de fondo predeterminado es el blanco; cambia a un color oscuro si tu documento tiene márgenes oscuros. + +## Herramientas relacionadas + +- [Dimensiones de página](./page-dimensions): inspecciona los tamaños de página antes y después de corregirlos +- [Comprimir PDF](./compress-pdf): reduce el tamaño del archivo tras la estandarización +- [Recortar PDF](./crop-pdf): recorta las páginas manualmente en lugar de escalarlas automáticamente diff --git a/docs/es/tools/flatten-pdf.md b/docs/es/tools/flatten-pdf.md new file mode 100644 index 00000000..293389af --- /dev/null +++ b/docs/es/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Aplanar PDF +description: Aplana formularios interactivos y anotaciones en contenido estático. Hace que los campos no sean editables e integra las anotaciones en la página. +--- + +# Aplanar PDF + +Aplanar fusiona los elementos interactivos (campos de formulario, menús desplegables, casillas, anotaciones, resaltados, notas adhesivas) directamente en el contenido de la página. La apariencia visual sigue igual, pero ya nada se puede editar ni extraer. Es el equivalente en PDF a imprimir un formulario rellenado y volver a escanearlo, solo que la calidad se mantiene perfecta. + +## Cómo funciona + +1. Sube uno o más archivos PDF. +2. Haz clic en **Aplanar PDF**. +3. Un solo archivo se descarga directamente. Varios archivos generan un archivo ZIP. + +La herramienta usa pdf-lib para aplanar los campos de formulario (mediante `form.flatten()`) y un aplanador de anotaciones dedicado para integrar las anotaciones en el flujo de la página. Ambas operaciones se realizan en una sola pasada. + +## Qué se aplana + +- **Campos de formulario**: entradas de texto, casillas, botones de opción, menús desplegables, campos de firma +- **Anotaciones**: comentarios, resaltados, tachado, subrayado, notas adhesivas, sellos, anotaciones de tinta +- **Elementos interactivos**: botones, disparadores de acciones + +## Qué no cambia + +- El contenido de texto (sigue siendo seleccionable y se puede buscar) +- Imágenes y gráficos +- Diseño y dimensiones de la página +- Marcadores y tabla de contenido +- Hipervínculos (salvo los basados en anotaciones) + +## Casos de uso + +- Bloquear un formulario completado para que los destinatarios no puedan cambiar las respuestas enviadas +- Preparar un PDF para archivo donde los elementos interactivos no son necesarios +- Corregir problemas de visualización causados por anotaciones que se muestran distinto en cada visor +- Asegurar que un documento firmado no se pueda modificar tras aplicar la firma +- Reducir el tamaño del archivo eliminando las definiciones de campos y los objetos de anotación + +## Consejos + +- Aplana cuando hayas terminado todas las ediciones. No hay forma de desaplanar un PDF. +- Si necesitas aplanar y además eliminar metadatos, JavaScript y archivos adjuntos, usa la herramienta Sanear PDF: incluye el aplanado como una de sus opciones. +- Algunos PDF indican "no se encontró ningún formulario". Es normal si el documento solo tiene anotaciones y ningún campo de formulario. + +## Herramientas relacionadas + +- [Sanear PDF](./sanitize-pdf): aplana formularios y además elimina metadatos, scripts y más +- [Rasterizar PDF](./rasterize-pdf): convierte a PDF basado en imágenes para un aplanado máximo +- [Fuente a contorno](./font-to-outline): convierte las fuentes en trazados vectoriales +- [Cifrar PDF](./protect-pdf): bloquea el PDF aplanado con una contraseña diff --git a/docs/es/tools/font-to-outline.md b/docs/es/tools/font-to-outline.md new file mode 100644 index 00000000..71413dd9 --- /dev/null +++ b/docs/es/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Fuente a contorno +description: Convierte todas las fuentes de un PDF en contornos vectoriales para un renderizado uniforme en cualquier dispositivo. Elimina los problemas de dependencia de fuentes. +--- + +# Fuente a contorno + +Convertir las fuentes en contornos transforma cada carácter de texto de un glifo basado en fuente en un trazado vectorial. El PDF deja de depender de las fuentes instaladas: se ve igual en cualquier dispositivo, sistema operativo e impresora. Es un paso habitual en los flujos de preimpresión. + +## Cómo funciona + +1. Sube uno o más archivos PDF. +2. Haz clic en **Convertir en contornos**. +3. Ghostscript convierte todo el texto en trazados vectoriales. +4. Descarga el resultado. Varios archivos generan un archivo ZIP. + +No hay ajustes que configurar. La herramienta usa Ghostscript (WebAssembly) para convertir todas las referencias de fuentes en trazados de contorno en una sola pasada. + +## Qué cambia + +- Los caracteres de texto pasan a ser curvas vectoriales (trazados bezier) +- Ya no es necesario incrustar las fuentes: el PDF es autocontenido a nivel de glifo +- El tamaño del archivo puede aumentar porque los trazados vectoriales suelen ocupar más que las referencias a fuentes +- La apariencia visual se conserva exactamente + +## Qué pierdes + +- La selección y el copiado de texto +- La capacidad de búsqueda del texto (Ctrl+F deja de funcionar) +- La posibilidad de editar el contenido del texto +- La accesibilidad para lectores de pantalla + +## Casos de uso + +- Enviar PDF a una imprenta que exige fuentes convertidas a contornos +- Compartir documentos con fuentes personalizadas o con licencia con personas que no las tienen +- Evitar la sustitución de fuentes que cambia el aspecto de tu documento en otros sistemas +- Preparar PDF para flujos de grabado láser o corte CNC que requieren entrada vectorial +- Asegurar que un PDF con muchos logotipos se muestre correctamente en todas las plataformas + +## Consejos + +- Conserva tu PDF original. Convertir a contornos es irreversible: no puedes volver a convertir los trazados en texto editable. +- Si necesitas que el texto siga siendo buscable, considera usar la herramienta Rasterizar PDF con OCR como paso posterior. +- Los PDF con contornos tienden a ser más grandes. Ejecuta Comprimir PDF después si el tamaño importa. + +## Herramientas relacionadas + +- [Aplanar PDF](./flatten-pdf): aplana formularios y anotaciones sin tocar las fuentes +- [Rasterizar PDF](./rasterize-pdf): convierte a PDF basado en imágenes en lugar de contornos vectoriales +- [Comprimir PDF](./compress-pdf): reduce el tamaño del archivo tras convertir a contornos +- [PDF a PDF/A](./pdf-to-pdfa): convierte para archivo tras asegurar la independencia de fuentes diff --git a/docs/es/tools/form-creator.md b/docs/es/tools/form-creator.md new file mode 100644 index 00000000..49104b01 --- /dev/null +++ b/docs/es/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Crear formulario PDF +description: Crea formularios PDF rellenables con campos de texto, casillas, menús desplegables, botones de opción y más, arrastrando y soltando. +--- + +# Crear formulario PDF + +Diseña formularios PDF rellenables profesionales desde cero o añadiendo campos a un PDF existente. El editor visual te permite arrastrar y soltar elementos de formulario (campos de texto, casillas, menús desplegables, botones de opción, campos de firma y más) directamente sobre las vistas previas de página. Configura las propiedades de los campos, define reglas de visibilidad condicional y exporta un formulario PDF totalmente interactivo. + +## Cómo funciona + +1. Sube un PDF existente **o** haz clic en **Crear PDF en blanco** para empezar desde cero. +2. Si creas un PDF en blanco, selecciona un tamaño de página (Letter, A4, A5, Legal, Tabloid, A3 o dimensiones personalizadas). +3. Se abre el editor de formularios con una barra de herramientas de tipos de campo y un área de vista previa de la página. +4. Selecciona un tipo de campo en la barra de herramientas y luego haz clic en la página para colocarlo. +5. Arrastra los campos para reposicionarlos. Usa los tiradores para ajustar las dimensiones. +6. Haz clic en un campo para abrir el panel de propiedades, donde puedes definir el nombre del campo, el valor predeterminado, el tamaño de fuente, la alineación y más. +7. Navega entre páginas con los controles de página. +8. Haz clic en **Descargar formulario PDF** para descargar el PDF rellenable terminado. + +## Características + +- Colocación de campos arrastrando y soltando, con tiradores visuales para redimensionar +- Tipos de campo: entrada de texto, texto multilínea, casilla, menú desplegable, botón de opción, firma, fecha, número y código de barras +- Panel de propiedades para configurar el nombre, la etiqueta, el valor predeterminado, el tamaño de fuente, el color, la alineación y la validación de cada campo +- Acciones de campo y reglas de visibilidad condicional (mostrar u ocultar campos según los valores de otros campos) +- Navegación por páginas para formularios de varias páginas +- Extracción de campos existentes: detecta e importa automáticamente los campos de formulario de los PDF subidos +- Compatible tanto con PDF subidos como con páginas en blanco como lienzo del formulario +- Varios tamaños de página predefinidos, además de dimensiones personalizadas +- Generación de códigos de barras con bwip-js +- Gestión de grupos de botones de opción + +## Opciones + +**Tamaños de página predefinidos (para PDF en blanco):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Custom (indica ancho y alto) + +**Propiedades de los campos (varían según el tipo de campo):** + +- Nombre, etiqueta y texto de marcador +- Valor predeterminado +- Familia, tamaño y color de la fuente +- Alineación del texto (izquierda, centro, derecha) +- Interruptor de campo obligatorio +- Interruptor de solo lectura +- Longitud máxima de los campos de texto +- Lista de opciones para menús desplegables y botones de opción +- Acciones de visibilidad condicional + +## Casos de uso + +- Crear formularios de incorporación de empleados con campos de texto para datos personales y casillas para aceptar políticas +- Crear cuestionarios de admisión de clientes con menús desplegables para elegir el servicio +- Diseñar formularios de pedido con campos calculados e identificadores de código de barras +- Crear listas de inspección con botones de opción para valoraciones de aprobado o suspenso +- Crear encuestas con preguntas de seguimiento condicionales que aparecen según las respuestas + +## Consejos + +- Si subes un PDF existente, la herramienta intentará extraer los campos de formulario que ya contenga, para que puedas editarlos o añadir otros. +- Usa la función de grupo de botones de opción para crear selecciones mutuamente excluyentes. Los campos del mismo grupo comparten un nombre de grupo. +- Prueba tu formulario descargándolo y abriéndolo en [Form Filler](./form-filler) para verificar el comportamiento de los campos. + +## Herramientas relacionadas + +- [Form Filler](./form-filler) +- [Firmar PDF](./sign-pdf) +- [Editor de PDF](./edit-pdf) diff --git a/docs/es/tools/form-filler.md b/docs/es/tools/form-filler.md new file mode 100644 index 00000000..50a8e652 --- /dev/null +++ b/docs/es/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Rellenar formularios PDF +description: Rellena formularios PDF, incluidos los formularios XFA, directamente en tu navegador con un visor integrado. +--- + +# Rellenar formularios PDF + +Abre un PDF con campos de formulario y rellénalo directamente en un visor integrado. La herramienta admite tanto los campos AcroForm estándar como los formularios XFA (XML Forms Architecture) heredados. Cuando termines, descarga la versión rellenada con un solo clic. + +## Cómo funciona + +1. Sube un PDF que contenga campos de formulario. +2. El documento se abre en un visor de PDF integrado que muestra los campos de formulario como entradas interactivas. +3. Haz clic en los campos de texto, casillas, menús desplegables y botones de opción para rellenarlos. +4. Haz clic en **Guardar y descargar formulario rellenado** para obtener el PDF completado. + +## Características + +- Visor PDF.js integrado con interacción completa con los campos de formulario +- Compatibilidad con los campos AcroForm estándar (entradas de texto, casillas, menús desplegables, botones de opción) +- Compatibilidad con formularios XFA, el formato heredado basado en XML +- Ajuste automático del tamaño del visor según las dimensiones de la página +- Visualización del archivo con su nombre y tamaño + +## Opciones + +No hay opciones de configuración adicionales. Sube el formulario, rellénalo y descárgalo. + +## Casos de uso + +- Completar formularios de impuestos, solicitudes de seguros o trámites con la administración +- Rellenar solicitudes de empleo recibidas como archivos PDF adjuntos +- Completar formularios de alta de proveedores o cuestionarios para proveedores +- Dar el visto bueno a listas de cumplimiento normativo con casillas +- Rellenar formularios de admisión médica antes de una cita + +## Consejos + +- Los formularios XFA son un formato heredado que solo admiten algunos visores de PDF. Si abres un PDF XFA en Chrome o en la mayoría de otras herramientas y ves páginas en blanco, es porque esos visores no admiten XFA. El Form Filler de BentoPDF y Firefox sí gestionan XFA correctamente. +- Para PDF sin campos de formulario, usa primero la herramienta [Crear formulario PDF](./form-creator) para añadir campos y luego rellénalos aquí. +- El visor ajusta su tamaño automáticamente a las dimensiones de página del PDF. + +## Herramientas relacionadas + +- [Crear formulario PDF](./form-creator) +- [Firmar PDF](./sign-pdf) +- [Editor de PDF](./edit-pdf) diff --git a/docs/es/tools/header-footer.md b/docs/es/tools/header-footer.md new file mode 100644 index 00000000..3d1e3fd7 --- /dev/null +++ b/docs/es/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Encabezado y pie de página +description: Añade texto personalizable de encabezado y pie de página a las páginas del PDF, con variables dinámicas de número de página. +--- + +# Encabezado y pie de página + +Añade texto en seis posiciones de las páginas de tu PDF: encabezado izquierdo, central y derecho, y pie de página izquierdo, central y derecho. La herramienta admite variables dinámicas para el número de página y el total de páginas, de modo que puedes crear plantillas como "Página 3 de 10" que se actualizan automáticamente en cada página. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Aparece el panel de opciones con los controles de formato y seis campos de texto. +3. Escribe el texto que quieras en cualquiera de las posiciones de encabezado o pie de página. +4. Usa los marcadores `{page}` y `{total}` para la numeración dinámica de páginas. +5. Ajusta el tamaño y el color de la fuente y, si quieres, limita el rango de páginas. +6. Haz clic en **Agregar encabezado y pie de página** para procesar y descargar. + +## Opciones + +- **Rango de páginas**: limita opcionalmente qué páginas llevan encabezado y pie de página. Déjalo vacío para aplicarlo a todas. Formato: "1-3, 5" (rangos separados por comas). +- **Tamaño de fuente**: entre 6 y 24 puntos. El valor predeterminado es 10. +- **Color de fuente**: elige cualquier color con el selector de color. +- **Encabezado izquierda / centro / derecha**: campos de texto para la parte superior de cada página. +- **Pie de página izquierda / centro / derecha**: campos de texto para la parte inferior de cada página. + +## Características + +- Seis posiciones de texto independientes por página +- Variable dinámica `{page}` que inserta el número de la página actual +- Variable dinámica `{total}` que inserta el total de páginas +- Filtro por rango de páginas para elegir páginas concretas +- Tamaño y color de fuente personalizables +- Fuente Helvetica para un resultado limpio y profesional + +## Casos de uso + +- Añadir "Página {page} de {total}" en el centro del pie de página de un informe +- Poner el nombre de la empresa en el encabezado izquierdo y la fecha del documento en el derecho +- Añadir avisos de confidencialidad al pie de página de documentos legales +- Estampar números de revisión del documento en rangos de páginas concretos + +## Consejos + +- Combina `{page}` y `{total}` en un solo campo para formatos como "Página {page} de {total}" o "{page}/{total}". +- Puedes dejar vacíos la mayoría de los campos y rellenar solo las posiciones que necesites. Los campos vacíos simplemente se omiten. +- Para encabezados más complejos con imágenes o logotipos, considera usar la herramienta [Añadir marca de agua](./add-watermark) colocada en la parte superior de la página. + +## Herramientas relacionadas + +- [Números de página](./page-numbers) +- [Añadir marca de agua](./add-watermark) +- [Numeración Bates](./bates-numbering) diff --git a/docs/es/tools/heic-to-pdf.md b/docs/es/tools/heic-to-pdf.md new file mode 100644 index 00000000..a8bcb2ee --- /dev/null +++ b/docs/es/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC a PDF +description: Convierte imágenes HEIC y HEIF de iPhone y iPad a PDF directamente en tu navegador. +--- + +# HEIC a PDF + +Convierte imágenes HEIC/HEIF a PDF. HEIC es el formato de foto predeterminado en iPhone y iPad desde iOS 11. Esta herramienta te permite convertir esas fotos en PDF sin instalar software de escritorio ni subir archivos a un servidor. + +## Formatos compatibles + +| Formato | Extensiones | +| :------ | :---------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos HEIC/HEIF. +2. Revisa la lista de archivos y quita los que no quieras. +3. Haz clic en **Convertir a PDF**. El resultado se descarga como `from_heic.pdf`. + +Cada archivo HEIC se decodifica con la biblioteca heic2any, que lo convierte a PNG con una calidad del 92 %. Después, el PNG se incrusta en el PDF con pdf-lib, con cada imagen en su propia página y a resolución completa. + +## Opciones + +Esta herramienta no ofrece ajustes adicionales. Las imágenes HEIC se convierten a PNG en alta calidad (0.92) antes de incrustarse. + +## Casos de uso + +- Crear un PDF a partir de fotos de iPhone para adjuntarlo a un parte de seguro o a un informe +- Convertir fotos HEIC de un anuncio inmobiliario en un único documento imprimible +- Convertir capturas de pantalla de iPad (formato HEIF) en un PDF para compartir +- Convertir por lotes las fotos de un viaje para un diario de viaje + +## Consejos + +- La decodificación de HEIC se realiza por completo en el navegador con WebAssembly. La primera conversión puede tardar un momento mientras se carga el decodificador. +- Si necesitas combinar HEIC con otros formatos de imagen (JPG, PNG, etc.), usa la herramienta [Imágenes a PDF](./image-to-pdf), que admite HEIC junto con todos los demás formatos. +- Los archivos HEIC de iPhone suelen contener datos EXIF, incluidas coordenadas GPS. El PDF resultante no conserva estos metadatos. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [JPG a PDF](./jpg-to-pdf) +- [PNG a PDF](./png-to-pdf) diff --git a/docs/es/tools/image-to-pdf.md b/docs/es/tools/image-to-pdf.md new file mode 100644 index 00000000..5b780ed3 --- /dev/null +++ b/docs/es/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Imágenes a PDF +description: Convierte JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD y más de 10 formatos de imagen en un único archivo PDF. +--- + +# Imágenes a PDF + +El conversor universal de imágenes a PDF. Sube imágenes en prácticamente cualquier formato y combínalas en un único documento PDF. Cada imagen ocupa su propia página, con el tamaño de las dimensiones originales. + +## Formatos compatibles + +| Formato | Extensiones | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Es la compatibilidad de formatos más amplia de todos los conversores de imágenes de BentoPDF. Si solo necesitas un formato concreto, usa en su lugar una de las herramientas dedicadas. + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos de imagen. Puedes seleccionar varios a la vez. +2. Revisa la lista de archivos. Quita los que no quieras con el icono de papelera, o haz clic en **Agregar Más Archivos** para incluir más imágenes. +3. Elige un nivel de **Calidad del PDF** en el menú desplegable. +4. Haz clic en **Convertir a PDF**. La herramienta procesa las imágenes con el motor PyMuPDF y descarga el resultado como `images_to_pdf.pdf`. + +## Opciones + +**Calidad del PDF** controla la compresión que se aplica al incrustar las imágenes en el PDF: + +- **Calidad alta**: compresión mínima, mayor tamaño de archivo. Ideal para impresión o archivo. +- **Calidad media** (predeterminado): compresión equilibrada. Buena para la mayoría de los usos. +- **Calidad baja**: compresión agresiva, el menor tamaño de archivo. Adecuada para correo electrónico o para compartir rápido. + +Los archivos HEIC y WebP se convierten automáticamente a PNG antes de incrustarse. Esto ocurre de forma transparente y no requiere pasos adicionales. + +## Casos de uso + +- Combinar en un solo PDF recibos o documentos escaneados con la cámara del móvil +- Crear un portafolio de fotos o un lookbook a partir de imágenes en distintos formatos +- Convertir fotos de iPhone (HEIC) en un PDF para compartir, sin instalar software de escritorio +- Reunir maquetas de diseño a partir de exportaciones PSD y capturas de pantalla en un entregable para el cliente +- Archivar una carpeta de formatos de imagen antiguos (PNM, JXR, JP2) como un único PDF + +## Consejos + +- El orden de las imágenes en el PDF coincide con el orden de la lista de archivos. Súbelas en la secuencia que quieras. +- Para obtener el menor tamaño de archivo posible, elige Calidad baja. La diferencia visual suele ser insignificante en escaneos con mucho texto. +- Si solo tienes un formato de imagen, los conversores dedicados (JPG a PDF, PNG a PDF, etc.) ofrecen el mismo resultado con una interfaz más sencilla. + +## Herramientas relacionadas + +- [JPG a PDF](./jpg-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [HEIC a PDF](./heic-to-pdf) +- [WebP a PDF](./webp-to-pdf) diff --git a/docs/es/tools/index.md b/docs/es/tools/index.md new file mode 100644 index 00000000..da72c1b4 --- /dev/null +++ b/docs/es/tools/index.md @@ -0,0 +1,183 @@ +# Referencia de herramientas + +BentoPDF ofrece **más de 130 herramientas** para trabajar con PDF. Todas las herramientas se ejecutan por completo en tu navegador: tus archivos nunca salen de tu dispositivo. + +--- + +## Editar y anotar + +Modifica, marca y mejora tus documentos PDF con un completo conjunto de herramientas de edición. + +
+ +- [**Editor de PDF**](./edit-pdf): anota, resalta, censura, comenta, añade formas e imágenes, busca y visualiza PDF. +- [**Editar marcadores**](./bookmark): añade, edita, importa, elimina y extrae marcadores de PDF. +- [**Tabla de contenido**](./table-of-contents): genera una página de tabla de contenido a partir de los marcadores del PDF. +- [**Números de página**](./page-numbers): inserta números de página en tu documento. +- [**Añadir etiquetas de página**](./add-page-labels): aplica etiquetas de página de PDF con números romanos, prefijos e inicios personalizados. +- [**Numeración Bates**](./bates-numbering): añade números Bates secuenciales en uno o varios archivos PDF. +- [**Añadir marca de agua**](./add-watermark): estampa texto o una imagen sobre las páginas de tu PDF. +- [**Encabezado y pie de página**](./header-footer): añade texto en la parte superior e inferior de las páginas. +- [**Invertir colores**](./invert-colors): crea una versión en modo oscuro de tu PDF. +- [**Efecto escáner**](./scanner-effect): haz que tu PDF parezca un documento escaneado. +- [**Ajustar colores**](./adjust-colors): afina el brillo, el contraste, la saturación y más. +- [**Color de fondo**](./background-color): cambia el color de fondo de tu PDF. +- [**Cambiar color del texto**](./text-color): cambia el color del texto de tu PDF. +- [**Firmar PDF**](./sign-pdf): dibuja, escribe o sube tu firma. +- [**Añadir sellos**](./add-stamps): añade sellos de imagen a tu PDF con la barra de herramientas de anotaciones. +- [**Eliminar anotaciones**](./remove-annotations): quita comentarios, resaltados y enlaces. +- [**Recortar PDF**](./crop-pdf): recorta los márgenes de todas las páginas de tu PDF. +- [**Rellenador de formularios PDF**](./form-filler): rellena formularios directamente en el navegador. También admite formularios XFA. +- [**Crear formulario PDF**](./form-creator): crea formularios PDF rellenables con campos de texto arrastrando y soltando. +- [**Eliminar páginas en blanco**](./remove-blank-pages): detecta y elimina automáticamente las páginas en blanco. + +
+ +--- + +## Convertir a PDF + +Convierte imágenes, documentos, libros electrónicos y otros formatos de archivo en PDF. + +
+ +- [**Imágenes a PDF**](./image-to-pdf): convierte JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP y más a PDF. +- [**JPG a PDF**](./jpg-to-pdf): crea un PDF a partir de una o más imágenes JPG. +- [**PNG a PDF**](./png-to-pdf): crea un PDF a partir de una o más imágenes PNG. +- [**WebP a PDF**](./webp-to-pdf): crea un PDF a partir de una o más imágenes WebP. +- [**SVG a PDF**](./svg-to-pdf): crea un PDF a partir de una o más imágenes SVG. +- [**BMP a PDF**](./bmp-to-pdf): crea un PDF a partir de una o más imágenes BMP. +- [**HEIC a PDF**](./heic-to-pdf): crea un PDF a partir de una o más imágenes HEIC. +- [**TIFF a PDF**](./tiff-to-pdf): crea un PDF a partir de una o más imágenes TIFF. +- [**Texto a PDF**](./txt-to-pdf): convierte un archivo de texto plano en un PDF. +- [**Markdown a PDF**](./markdown-to-pdf): convierte Markdown a PDF con vista previa en vivo y resaltado de sintaxis. +- [**JSON a PDF**](./json-to-pdf): convierte archivos JSON a formato PDF. +- [**ODT a PDF**](./odt-to-pdf): convierte archivos ODT (OpenDocument Text) a PDF. +- [**CSV a PDF**](./csv-to-pdf): convierte hojas de cálculo CSV a PDF. +- [**RTF a PDF**](./rtf-to-pdf): convierte documentos RTF (Rich Text Format) a PDF. +- [**Word a PDF**](./word-to-pdf): convierte documentos de Word (DOCX, DOC, ODT) a PDF. +- [**Excel a PDF**](./excel-to-pdf): convierte hojas de cálculo de Excel (XLSX, XLS, ODS) a PDF. +- [**PowerPoint a PDF**](./powerpoint-to-pdf): convierte presentaciones de PowerPoint (PPTX, PPT, ODP) a PDF. +- [**XPS a PDF**](./xps-to-pdf): convierte documentos XPS/OXPS a PDF. +- [**MOBI a PDF**](./mobi-to-pdf): convierte libros electrónicos MOBI a PDF. +- [**EPUB a PDF**](./epub-to-pdf): convierte libros electrónicos EPUB a PDF. +- [**FB2 a PDF**](./fb2-to-pdf): convierte libros electrónicos FictionBook (FB2) a PDF. +- [**CBZ a PDF**](./cbz-to-pdf): convierte archivos de cómics (CBZ/CBR) a PDF. +- [**WPD a PDF**](./wpd-to-pdf): convierte documentos de WordPerfect (WPD) a PDF. +- [**WPS a PDF**](./wps-to-pdf): convierte documentos de WPS Office a PDF. +- [**XML a PDF**](./xml-to-pdf): convierte documentos XML a PDF. +- [**ODG a PDF**](./odg-to-pdf): convierte OpenDocument Graphics (ODG) a PDF. +- [**ODS a PDF**](./ods-to-pdf): convierte OpenDocument Spreadsheet (ODS) a PDF. +- [**ODP a PDF**](./odp-to-pdf): convierte OpenDocument Presentation (ODP) a PDF. +- [**PUB a PDF**](./pub-to-pdf): convierte Microsoft Publisher (PUB) a PDF. +- [**VSD a PDF**](./vsd-to-pdf): convierte Microsoft Visio (VSD, VSDX) a PDF. +- [**PSD a PDF**](./psd-to-pdf): convierte archivos de Adobe Photoshop (PSD) a PDF. +- [**Correo electrónico a PDF**](./email-to-pdf): convierte archivos de correo (EML, MSG) a formato PDF. + +
+ +--- + +## Convertir desde PDF + +Extrae el contenido de los PDF a imágenes, documentos y formatos de datos. + +
+ +- [**PDF a JPG**](./pdf-to-jpg): convierte cada página del PDF en una imagen JPG. +- [**PDF a PNG**](./pdf-to-png): convierte cada página del PDF en una imagen PNG. +- [**PDF a WebP**](./pdf-to-webp): convierte cada página del PDF en una imagen WebP. +- [**PDF a BMP**](./pdf-to-bmp): convierte cada página del PDF en una imagen BMP. +- [**PDF a TIFF**](./pdf-to-tiff): convierte cada página del PDF en una imagen TIFF. +- [**PDF a CBZ**](./pdf-to-cbz): convierte un PDF en un CBZ (archivo de cómic) para lectores de cómics y Calibre. +- [**PDF a SVG**](./pdf-to-svg): convierte cada página del PDF en un gráfico vectorial escalable. +- [**PDF a CSV**](./pdf-to-csv): extrae tablas de un PDF y las convierte a formato CSV. +- [**PDF a Excel**](./pdf-to-excel): extrae tablas de un PDF y las convierte a Excel (XLSX). +- [**PDF a escala de grises**](./pdf-to-greyscale): convierte todos los colores a blanco y negro. +- [**PDF a JSON**](./pdf-to-json): convierte archivos PDF a formato JSON. +- [**PDF a Word**](./pdf-to-word): convierte archivos PDF en documentos de Word editables. +- [**Extraer imágenes**](./extract-images): extrae todas las imágenes incrustadas de tus archivos PDF. +- [**PDF a Markdown**](./pdf-to-markdown): convierte el texto y las tablas de un PDF a formato Markdown. +- [**Preparar PDF para IA**](./prepare-pdf-for-ai): extrae el contenido del PDF como JSON de LlamaIndex para flujos RAG/LLM. +- [**PDF a texto**](./pdf-to-text): extrae el texto de archivos PDF y guárdalo como texto plano. +- [**Extraer tablas**](./extract-tables): extrae tablas de PDF como CSV, JSON o Markdown. + +
+ +--- + +## Organizar y gestionar + +Reorganiza, combina, divide y gestiona las páginas y los archivos de tus PDF. + +
+ +- [**Creador de flujos de trabajo PDF**](./pdf-workflow): crea flujos de procesamiento de PDF personalizados con un editor visual de nodos. +- [**Multiherramienta PDF**](./pdf-multi-tool): editor de PDF completo con gestión de páginas. +- [**OCR PDF**](./ocr-pdf): haz que un PDF se pueda buscar y copiar. +- [**Combinar PDF**](./merge-pdf): une varios PDF en un solo archivo. +- [**Alternar y mezclar páginas**](./alternate-merge): combina PDF alternando las páginas de cada uno. +- [**Intercalar escaneo a doble cara**](./duplex-collate): reordena los bloques de escaneo de anverso y reverso en la secuencia de páginas correcta. +- [**Organizar y duplicar**](./organize-pdf): duplica, reordena y elimina páginas. +- [**Añadir archivos adjuntos**](./add-attachments): incrusta uno o más archivos en tu PDF. +- [**Extraer archivos adjuntos**](./extract-attachments): extrae todos los archivos incrustados de uno o varios PDF como un ZIP. +- [**Editar archivos adjuntos**](./edit-attachments): consulta o elimina los archivos adjuntos de tu PDF. +- [**Capas PDF (OCG)**](./pdf-layers): consulta, activa, añade y elimina capas OCG de tu PDF. +- [**Dividir PDF**](./split-pdf): extrae un rango de páginas a un nuevo PDF. +- [**Dividir páginas**](./divide-pages): divide las páginas horizontal o verticalmente. +- [**Extraer páginas**](./extract-pages): guarda una selección de páginas como archivos nuevos. +- [**Eliminar páginas**](./delete-pages): quita páginas concretas de tu documento. +- [**Añadir página en blanco**](./add-blank-page): inserta una página vacía en cualquier lugar de tu PDF. +- [**Invertir páginas**](./reverse-pages): invierte el orden de todas las páginas de tu documento. +- [**Rotar PDF**](./rotate-pdf): gira las páginas en incrementos de 90 grados. +- [**Rotar con grados personalizados**](./rotate-custom): rota las páginas con cualquier ángulo personalizado. +- [**PDF N-Up**](./n-up-pdf): organiza varias páginas en una sola hoja. +- [**Folleto PDF**](./pdf-booklet): reorganiza las páginas para imprimir folletos a doble cara. +- [**Combinar en una sola página**](./combine-single-page): une todas las páginas en un único desplazamiento continuo. +- [**Ver metadatos**](./view-metadata): inspecciona las propiedades ocultas de tu PDF. +- [**Editar metadatos**](./edit-metadata): cambia el autor, el título y otras propiedades. +- [**PDF a ZIP**](./pdf-to-zip): empaqueta varios archivos PDF en un archivo ZIP. +- [**Comparar PDF**](./compare-pdfs): compara dos PDF lado a lado. +- [**Posterizar PDF**](./posterize-pdf): divide una página grande en varias páginas más pequeñas. + +
+ +--- + +## Optimizar y reparar + +Comprime, corrige y optimiza tus PDF para mejorar el rendimiento y la compatibilidad. + +
+ +- [**Comprimir PDF**](./compress-pdf): reduce el tamaño del archivo de tu PDF. +- [**PDF a PDF/A**](./pdf-to-pdfa): convierte un PDF a PDF/A para archivo a largo plazo. +- [**Corregir tamaño de página**](./fix-page-size): unifica todas las páginas en un mismo tamaño. +- [**Linealizar PDF**](./linearize-pdf): optimiza el PDF para verlo rápido en la web. +- [**Dimensiones de página**](./page-dimensions): analiza el tamaño, la orientación y las unidades de las páginas. +- [**Eliminar restricciones**](./remove-restrictions): quita la protección con contraseña y las restricciones de seguridad. +- [**Reparar PDF**](./repair-pdf): recupera datos de archivos PDF corruptos o dañados. +- [**Rasterizar PDF**](./rasterize-pdf): convierte el PDF en un PDF basado en imágenes. Aplana capas y elimina el texto seleccionable. +- [**Enderezar PDF**](./deskew-pdf): endereza automáticamente las páginas escaneadas inclinadas con OpenCV. +- [**Fuente a contorno**](./font-to-outline): convierte todas las fuentes en contornos vectoriales para un renderizado uniforme. + +
+ +--- + +## Proteger PDF + +Protege, cifra y controla el acceso a tus documentos PDF. + +
+ +- [**Cifrar PDF**](./protect-pdf): bloquea tu PDF añadiendo una contraseña. +- [**Sanear PDF**](./sanitize-pdf): elimina metadatos, anotaciones, scripts y más. +- [**Descifrar PDF**](./unlock-pdf): desbloquea el PDF quitando la protección con contraseña. +- [**Aplanar PDF**](./flatten-pdf): hace que los campos de formulario y las anotaciones no se puedan editar. +- [**Eliminar metadatos**](./remove-metadata): quita los datos ocultos de tu PDF. +- [**Cambiar permisos**](./change-permissions): establece o cambia los permisos de usuario de un PDF. +- [**Firma digital**](./digital-sign-pdf): añade una firma digital criptográfica con certificados X.509. +- [**Validar firma**](./validate-signature-pdf): verifica las firmas digitales y consulta los detalles del certificado. + +
diff --git a/docs/es/tools/invert-colors.md b/docs/es/tools/invert-colors.md new file mode 100644 index 00000000..5817adfb --- /dev/null +++ b/docs/es/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Invertir colores +description: Invierte todos los colores de tu PDF para crear una versión en modo oscuro de cualquier documento. +--- + +# Invertir colores + +Convierte cada color de tu PDF en su inverso. Los fondos blancos pasan a negro, el texto negro pasa a blanco y el resto de los colores cambian a sus valores complementarios. Es la forma más rápida de crear una versión en "modo oscuro" de cualquier PDF. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Haz clic en **Invertir colores** para procesarlo. +3. El PDF invertido se descarga automáticamente. + +No hay ajustes adicionales. La herramienta renderiza cada página como imagen, invierte el color de todos los píxeles y reensambla el resultado en un nuevo PDF. + +## Características + +- Inversión de color con un solo clic en todas las páginas +- Procesa todas las páginas del documento +- Mantiene las dimensiones y el diseño originales de las páginas +- Funciona con cualquier PDF, sea cual sea su contenido (texto, imágenes o mixto) + +## Casos de uso + +- Crear versiones en modo oscuro de libros de texto o manuales para leer cómodamente de noche +- Preparar versiones de alto contraste de documentos por motivos de accesibilidad +- Invertir documentos escaneados que se capturaron con una exposición incorrecta +- Generar versiones en negativo de PDF con muchas imágenes para análisis visual + +## Consejos + +- Como la herramienta rasteriza las páginas para aplicar el efecto, el resultado está basado en imágenes. El texto ya no se podrá seleccionar ni buscar. Si necesitas texto buscable tras la inversión, pasa el resultado por una herramienta de OCR. +- Para ajustes de color más precisos (brillo, contraste, saturación), usa en su lugar la herramienta [Ajustar colores](./adjust-colors). +- Los PDF grandes con muchas páginas pueden tardar más en procesarse, ya que cada página se renderiza e invierte individualmente. + +## Herramientas relacionadas + +- [Ajustar colores](./adjust-colors) +- [Color de fondo](./background-color) +- [Efecto escáner](./scanner-effect) diff --git a/docs/es/tools/jpg-to-pdf.md b/docs/es/tools/jpg-to-pdf.md new file mode 100644 index 00000000..143a4560 --- /dev/null +++ b/docs/es/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG a PDF +description: Convierte una o más imágenes JPG, JPEG y JPEG 2000 en un único archivo PDF directamente en tu navegador. +--- + +# JPG a PDF + +Convierte imágenes JPG en un PDF limpio. Sube un archivo o varios JPG a la vez: cada imagen se convierte en una página a tamaño completo del documento resultante. + +## Formatos compatibles + +| Formato | Extensiones | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos JPG. Se admite la selección múltiple. +2. Revisa los archivos subidos. Usa el icono de papelera para quitar archivos individuales, o haz clic en **Agregar Más Archivos** para añadir más a la lista. +3. Selecciona un nivel de **Calidad del PDF**. +4. Haz clic en **Convertir a PDF**. La herramienta comprime las imágenes según el ajuste de calidad, las convierte con el motor PyMuPDF y descarga `from_jpgs.pdf`. + +## Opciones + +**Calidad del PDF** ajusta la compresión que se aplica a cada imagen antes de incrustarla en el PDF: + +- **Calidad alta**: conserva el máximo detalle. Úsala para fotografía o impresión. +- **Calidad media** (predeterminado): un buen equilibrio entre nitidez y tamaño de archivo. +- **Calidad baja**: compresión agresiva para obtener el resultado más pequeño. + +## Casos de uso + +- Convertir documentos escaneados guardados como JPG en un único PDF para entregar +- Empaquetar fotos de productos en un catálogo para clientes +- Convertir imágenes médicas o de satélite en JPEG 2000 en un PDF portátil +- Crear un álbum de fotos imprimible a partir de exportaciones de la cámara + +## Consejos + +- Los archivos JPEG 2000 (`.jp2`, `.jpx`) son totalmente compatibles, no solo el JPEG estándar. Es útil para imágenes médicas y datos geoespaciales. +- Si tus JPG provienen de la cámara de un móvil, la Calidad media suele producir un archivo entre un 40 y un 60 % más pequeño que la Calidad alta, sin diferencia visible en pantalla. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [WebP a PDF](./webp-to-pdf) diff --git a/docs/es/tools/json-to-pdf.md b/docs/es/tools/json-to-pdf.md new file mode 100644 index 00000000..4ff3fa7a --- /dev/null +++ b/docs/es/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON a PDF +description: Reconstruye archivos PDF a partir del formato JSON de BentoPDF. Convierte las exportaciones JSON de vuelta en sus documentos PDF originales. +--- + +# JSON a PDF + +Reconstruye documentos PDF a partir de archivos JSON creados previamente con la herramienta **PDF a JSON** de BentoPDF. Es una herramienta de conversión de ida y vuelta: toma la representación JSON estructurada de un PDF y reconstruye el documento original. + +::: warning +Esta herramienta solo acepta archivos JSON generados por el conversor PDF a JSON de BentoPDF. No admite archivos JSON estándar de APIs, bases de datos u otras herramientas. +::: + +## Formatos compatibles + +| Entrada | Descripción | +| :------ | :----------------------------------------------------------------- | +| `.json` | Archivos JSON exportados con la herramienta PDF a JSON de BentoPDF | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta uno o más archivos JSON. +2. La lista de archivos muestra cada archivo seleccionado con su tamaño. +3. Haz clic en **Convertir a PDF**. La herramienta procesa todos los archivos con un Web Worker y el motor CPDF. +4. El resultado se descarga como `jsons-to-pdf.zip`, con un PDF por cada archivo JSON de entrada. + +La conversión se ejecuta en un Web Worker en segundo plano, así que la interfaz sigue respondiendo incluso con archivos grandes. + +## Opciones + +Esta herramienta no tiene opciones configurables. La estructura del JSON determina por completo el PDF resultante. + +## Resultado + +Al convertir varios archivos JSON, los resultados se entregan en un archivo ZIP. Cada PDF lleva el nombre de su JSON de origen (por ejemplo, `report.json` pasa a ser `report.pdf`). + +## Casos de uso + +- Restaurar PDF desde una copia de seguridad o un flujo de archivo basados en JSON +- Pasar un PDF a JSON para inspeccionarlo y volver a convertirlo a PDF +- Reconstruir documentos tras modificar programáticamente la estructura del JSON +- Verificar que una exportación de PDF a JSON capturó todo el contenido del documento, convirtiéndolo de nuevo + +## Consejos + +- Si necesitas convertir datos JSON arbitrarios (como respuestas de API o archivos de configuración) en un PDF con formato, la herramienta [Texto a PDF](./txt-to-pdf) es más adecuada. Pega el JSON como texto y se mostrará con el formato correcto. +- El motor CPDF WebAssembly debe estar disponible para que esta herramienta funcione. Las instancias autoalojadas necesitan tener configurados los archivos WASM de CPDF. + +## Herramientas relacionadas + +- [Texto a PDF](./txt-to-pdf) +- [Markdown a PDF](./markdown-to-pdf) +- [CSV a PDF](./csv-to-pdf) diff --git a/docs/es/tools/linearize-pdf.md b/docs/es/tools/linearize-pdf.md new file mode 100644 index 00000000..369b6a3c --- /dev/null +++ b/docs/es/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linealizar PDF +description: Optimiza archivos PDF para verlos rápido en la web con carga progresiva. También conocido como optimización "Fast Web View". +--- + +# Linealizar PDF + +La linealización reestructura un PDF para que la primera página pueda mostrarse antes de que se haya descargado todo el archivo. Adobe lo llama "Fast Web View". Si alojas PDF en un sitio web o los sirves desde un portal de documentos, la linealización hace que se abran de forma notablemente más rápida. + +## Cómo funciona + +1. Sube uno o más archivos PDF. +2. Haz clic en **Linealizar PDF**. +3. Descarga los resultados como un archivo ZIP con todos los archivos linealizados. + +No hay ajustes que configurar. La herramienta usa la opción `--linearize` de QPDF, que reorganiza la estructura interna del PDF sin alterar su contenido visual. + +## Qué hace la linealización + +- Reordena los objetos del PDF para que los datos de la primera página aparezcan al principio del archivo +- Añade un diccionario de linealización y tablas de pistas para que los visores sepan dónde encontrar cada página +- Habilita las solicitudes por rangos de bytes: un navegador puede obtener solo la primera página sin descargar todo el archivo +- Limpia la tabla de referencias cruzadas para un acceso aleatorio eficiente + +## Características + +- Procesamiento por lotes de varios PDF en una sola operación +- El resultado conserva todo el contenido, las fuentes, las imágenes y los elementos interactivos +- Usa QPDF (WebAssembly) para una linealización fiable y conforme a los estándares +- Los resultados se empaquetan en un ZIP para descargarlos fácilmente + +## Casos de uso + +- Alojar informes PDF en un sitio web donde los usuarios esperan ver la página al instante +- Incrustar PDF en aplicaciones web con visores en el navegador +- Publicar catálogos o manuales en PDF a los que se accede con conexiones móviles lentas +- Preparar documentos para redes de distribución de contenido (CDN) que admiten el servicio por rangos de bytes + +## Consejos + +- Linealiza cuando hayas terminado el resto de las ediciones. Cualquier modificación posterior (combinar, añadir páginas) romperá la linealización. +- Combínalo con Comprimir PDF para obtener los PDF más pequeños y de carga más rápida posible. +- La linealización añade un pequeño aumento al tamaño del archivo (normalmente menos del 1 %). + +## Herramientas relacionadas + +- [Comprimir PDF](./compress-pdf): reduce el tamaño del archivo antes de linealizar +- [Reparar PDF](./repair-pdf): corrige problemas estructurales que impiden la linealización +- [Eliminar metadatos](./remove-metadata): quita los metadatos antes de publicar en línea diff --git a/docs/es/tools/markdown-to-pdf.md b/docs/es/tools/markdown-to-pdf.md new file mode 100644 index 00000000..464e789f --- /dev/null +++ b/docs/es/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown a PDF +description: Escribe o pega Markdown y expórtalo como un PDF con formato profesional, con vista previa en vivo y resaltado de sintaxis. +--- + +# Markdown a PDF + +Un editor de Markdown completo con vista previa en vivo y exportación a PDF con un clic. Escribe desde cero, sube un archivo `.md` existente o pega contenido del portapapeles. El editor renderiza tu Markdown en tiempo real y exporta un PDF con estilo usando el motor de impresión integrado del navegador. + +## Formatos compatibles + +| Entrada | Descripción | +| :-------------- | :-------------------------- | +| Archivos `.md` | Súbelos con el botón Upload | +| Entrada directa | Escribe o pega en el editor | + +## Cómo funciona + +1. Abre la herramienta Markdown a PDF. El editor se carga con vista dividida: el código Markdown a la izquierda y la vista previa renderizada a la derecha. +2. Escribe tu Markdown, pégalo o haz clic en **Cargar** para cargar un archivo `.md`. +3. Alterna entre los temas claro y oscuro con el control deslizante de tema de la barra de herramientas. +4. Haz clic en **Exportar PDF** (o pulsa `Ctrl/Cmd + S`) para generar un PDF mediante el cuadro de impresión del navegador. + +## Características + +El editor admite un amplio conjunto de funciones de Markdown más allá de lo básico: + +- **Markdown estándar**: encabezados, negrita, cursiva, enlaces, imágenes, listas, citas, líneas horizontales +- **Bloques de código** con resaltado de sintaxis para más de 15 lenguajes (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash y más) +- **Diagramas Mermaid**: los diagramas de flujo, de secuencia, ER y otros tipos de gráficos Mermaid se renderizan directamente en la vista previa +- **Tablas** con la sintaxis de tablas estándar de Markdown +- **Listas de tareas** con casillas +- **Notas al pie**, **subíndices**, **superíndices** +- **Listas de definiciones**, **abreviaturas** +- Compatibilidad con **emoji** (`:smile:` se muestra como el emoji) +- **Resaltados** (`==marked text==`) e **inserciones** (`++inserted text++`) +- **URL con enlace automático**: las URL sin formato se convierten en enlaces en los que se puede hacer clic +- Generación de **tabla de contenido** +- **Enlaces ancla** en los encabezados + +## Casos de uso + +- Escribir documentación de proyectos y exportar un PDF cuidado para las partes interesadas +- Crear informes técnicos con ejemplos de código y diagramas de arquitectura Mermaid +- Convertir un README de GitHub en un PDF para usarlo sin conexión o imprimirlo +- Redactar una propuesta o una especificación con listas de tareas y tablas +- Generar un material de apoyo con estilo a partir de apuntes de clase escritos en Markdown + +## Consejos + +- El PDF resultante usa la función de imprimir a PDF del navegador. En Chrome, puedes personalizar los márgenes y la escala en el cuadro de impresión antes de guardar. +- Los diagramas Mermaid se renderizan en la vista previa, pero pueden tardar un momento en inicializarse la primera vez. +- Usa `Ctrl/Cmd + S` como atajo de teclado para exportar sin tener que buscar el botón. + +## Herramientas relacionadas + +- [Texto a PDF](./txt-to-pdf) +- [Word a PDF](./word-to-pdf) +- [JSON a PDF](./json-to-pdf) diff --git a/docs/es/tools/merge-pdf.md b/docs/es/tools/merge-pdf.md new file mode 100644 index 00000000..3cd56516 --- /dev/null +++ b/docs/es/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Fusionar PDF +description: Combina varios archivos PDF en un solo documento, con reordenación por arrastrar y soltar y control a nivel de página. +--- + +# Fusionar PDF + +Combina varios archivos PDF en un solo documento. Puedes unir archivos completos en un orden concreto, o cambiar al Modo página para controlar con precisión cada página de todos los PDF subidos. + +## Cómo funciona + +1. Sube dos o más archivos PDF haciendo clic en la zona de carga o arrastrándolos. +2. Elige entre **Modo archivo** y **Modo página** con el interruptor de la parte superior. +3. En Modo archivo, arrastra los archivos para reordenarlos y, si quieres, indica rangos de páginas (por ejemplo, `1-3, 5`) para cada archivo. Deja el rango en blanco para incluir todas las páginas. +4. En Modo página, arrastra y suelta las miniaturas de cada página para construir tu secuencia exacta. +5. Haz clic en **Fusionar PDF** para combinarlo todo en un solo archivo. El PDF combinado se descarga automáticamente. + +## Características + +- Dos modos de combinación: Modo archivo para unir archivos completos rápidamente y Modo página para controlar cada página +- Reordenación por arrastrar y soltar en ambos modos, con animaciones fluidas +- La sintaxis de rangos de páginas (por ejemplo, `1-3, 5, 8-10`) permite elegir páginas sin cambiar a Modo página +- Las miniaturas de página se cargan bajo demanda para que la interfaz siga respondiendo incluso con documentos grandes +- Sin límite en el número de archivos ni en el total de páginas +- Conserva la calidad original del PDF, sin recodificar + +## Opciones + +| Opción | Descripción | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------- | +| **Modo archivo** | Combina archivos completos en un orden personalizado, con filtros opcionales de rango de páginas por archivo | +| **Modo página** | Cuadrícula visual con todas las páginas de todos los archivos: arrastra las miniaturas para construir tu secuencia exacta | +| **Campo Páginas** | Campo de texto por archivo que acepta rangos como `1-3, 5` para incluir solo páginas concretas | + +## Casos de uso + +- Combinar PDF de capítulos sueltos en un único libro o informe +- Unir una carta de presentación y un currículum en un solo documento de candidatura +- Reunir páginas concretas de varios documentos de origen en un archivo consolidado +- Reunir recibos o facturas escaneados en un único PDF de archivo +- Crear un material de apoyo para una presentación a partir de diapositivas de varias presentaciones + +## Consejos + +- Usa Modo página cuando necesites intercalar páginas de distintos archivos en lugar de añadir un archivo detrás de otro. +- Puedes añadir más archivos después de la carga inicial con el botón **Agregar Más Archivos** sin perder tu organización actual. +- Los rangos de páginas empiezan a contar en 1, así que `1` se refiere a la primera página de ese archivo. + +## Herramientas relacionadas + +- [Dividir PDF](./split-pdf) +- [Organizar y duplicar](./organize-pdf) +- [Alternar y mezclar páginas](./alternate-merge) +- [Eliminar páginas](./delete-pages) diff --git a/docs/es/tools/mobi-to-pdf.md b/docs/es/tools/mobi-to-pdf.md new file mode 100644 index 00000000..9acbbe03 --- /dev/null +++ b/docs/es/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI a PDF +description: Convierte libros electrónicos MOBI a PDF directamente en tu navegador. Gratis, privado, sin subir archivos. +--- + +# MOBI a PDF + +Convierte libros electrónicos MOBI de Amazon Kindle en documentos PDF. Los archivos MOBI están ligados a dispositivos y aplicaciones Kindle, lo que dificulta leerlos en otro sitio. Convertirlos a PDF te da una versión portátil que puedes abrir en cualquier dispositivo o imprimir. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :------ | :-------- | :----------------------------------- | +| MOBI | `.mobi` | Formato de libro Kindle (Mobipocket) | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta uno o más archivos MOBI. +2. Revisa la lista de archivos. Quita los que no quieras con el icono de papelera, o usa **Agregar Más Archivos** para incluir más libros. +3. Haz clic en **Convertir a PDF**. El motor PyMuPDF analiza la estructura del MOBI y renderiza cada página como contenido PDF. +4. Un solo archivo se descarga como PDF. Al convertir varios archivos, obtienes un archivo ZIP llamado `mobi-converted.zip`. + +## Opciones + +No hacen falta ajustes adicionales. La conversión conserva el contenido de texto, el formato y las imágenes incrustadas del archivo MOBI original. + +## Casos de uso + +- Leer contenido comprado en Kindle en un lector que no es Kindle y solo admite PDF +- Imprimir capítulos de un libro electrónico para estudiar o anotar sin conexión +- Archivar tu biblioteca personal de libros electrónicos en un formato universal +- Compartir fragmentos con alguien que no tiene la aplicación Kindle instalada + +## Consejos + +- Los archivos MOBI protegidos con DRM no se pueden convertir. La herramienta solo funciona con archivos MOBI sin DRM. +- Los libros grandes con muchas imágenes incrustadas pueden tardar unos segundos más en procesarse, ya que todo ocurre en el navegador. + +## Herramientas relacionadas + +- [EPUB a PDF](./epub-to-pdf) +- [FB2 a PDF](./fb2-to-pdf) +- [CBZ a PDF](./cbz-to-pdf) diff --git a/docs/es/tools/n-up-pdf.md b/docs/es/tools/n-up-pdf.md new file mode 100644 index 00000000..4634bfec --- /dev/null +++ b/docs/es/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Organiza varias páginas de un PDF en una sola hoja con una cuadrícula, para imprimir de forma compacta. +--- + +# N-Up PDF + +Coloca varias páginas en una sola hoja con una disposición en cuadrícula. Así se reduce el número de páginas impresas al ajustar 2, 4, 6, 8, 9 o 16 páginas por hoja. La herramienta se encarga del escalado, el posicionamiento y la configuración opcional del tamaño de página. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Selecciona el número de páginas por hoja (el valor "N"): 2, 4, 6, 8, 9 o 16. +3. Elige el tamaño de página de salida (A4 por defecto) y la orientación. +4. Opcionalmente, configura el espaciado, el color del borde y el color de fondo. +5. Haz clic en el botón de procesar. La herramienta escala cada página y las distribuye en hojas nuevas. + +## Características + +- Disposiciones en cuadrícula: 2, 4, 6, 8, 9 y 16 páginas por hoja +- Tamaño de página de salida y orientación configurables +- Espaciado opcional entre las páginas +- Ajustes de color de fondo y de borde +- Mantiene la proporción de las páginas originales al escalarlas para que quepan + +## Opciones + +| Opción | Descripción | +| ------------------------------ | ----------------------------------------------------------------------------------- | +| **Páginas por hoja** | Número de páginas originales que caben en cada página de salida (2, 4, 6, 8, 9, 16) | +| **Tamaño de página de salida** | Tamaño de la hoja de salida (A4, Letter, Legal, etc.) | +| **Orientación** | Portrait o Landscape para la hoja de salida | +| **Espaciado** | Separación en puntos entre las páginas | +| **Color de fondo** | Color de relleno del fondo de la hoja de salida | +| **Color del borde** | Color de los bordes alrededor de cada página | + +## Casos de uso + +- Imprimir material de apoyo con 4 diapositivas por página para ahorrar papel +- Crear hojas de estudio con varias páginas de referencia en una sola hoja +- Producir archivos de documentos compactos para su archivo +- Generar hojas de miniaturas con una vista general de un documento largo + +## Consejos + +- La orientación horizontal suele funcionar mejor para las disposiciones de 2 páginas, mientras que la vertical suele ser la mejor para 4 o más. +- Aumentar el espaciado mejora la legibilidad, pero reduce el área disponible para cada página. +- Para la operación inversa (dividir una página en varias), consulta [Posterizar PDF](./posterize-pdf). + +## Herramientas relacionadas + +- [Posterizar PDF](./posterize-pdf) +- [Folleto PDF](./pdf-booklet) +- [Combinar en una sola página](./combine-single-page) diff --git a/docs/es/tools/ocr-pdf.md b/docs/es/tools/ocr-pdf.md new file mode 100644 index 00000000..58d76fde --- /dev/null +++ b/docs/es/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Haz que los PDF escaneados se puedan buscar y copiar con Tesseract OCR, con compatibilidad con varios idiomas y filtrado de caracteres. +--- + +# OCR PDF + +Convierte documentos escaneados en PDF en los que se puede buscar y copiar. La herramienta usa Tesseract OCR para reconocer el texto de las imágenes y superpone una capa de texto invisible sobre las páginas originales, conservando su apariencia visual y haciendo que el contenido sea totalmente buscable. + +## Cómo funciona + +1. Sube un PDF escaneado o basado en imágenes. +2. Selecciona uno o más idiomas presentes en el documento en la lista de idiomas con búsqueda. +3. Opcionalmente, ajusta la configuración avanzada (resolución, binarización, lista blanca). +4. Haz clic en **Iniciar OCR** y sigue el progreso en la barra de progreso en tiempo real. +5. Al terminar, revisa el texto extraído y descarga el PDF con búsqueda o un archivo `.txt` de texto plano. + +## Características + +- OCR en varios idiomas con un selector de idiomas con búsqueda +- La capa de texto invisible conserva la apariencia original del documento +- Barra de progreso y registro en tiempo real durante el procesamiento +- Descarga los resultados como PDF con búsqueda o como archivo de texto plano +- Copia el texto extraído directamente al portapapeles +- Tres niveles de resolución para equilibrar velocidad y precisión + +## Opciones + +| Ajuste | Valores | Predeterminado | Finalidad | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------------------------------- | +| **Resolución** | Estándar (192 DPI), Alta (288 DPI), Ultra (384 DPI) | Alta | Una mayor resolución mejora la precisión con texto pequeño, pero tarda más | +| **Binarizar imagen** | Activado / Desactivado | Desactivado | Mejora el contraste de escaneos limpios al convertirlos a blanco y negro | +| **Preajuste de lista blanca de caracteres** | Ninguno, Alfanumérico, Números + Moneda, Solo letras, Solo números, Factura, Formularios, Personalizado | Ninguno | Restringe los caracteres reconocidos para mejorar la precisión en tipos de documento concretos | +| **Lista blanca de caracteres** | Texto libre | Vacío | Conjunto de caracteres manual cuando el preajuste es Personalizado | + +## Casos de uso + +- Hacer que los contratos y facturas escaneados sean buscables para poder usar Ctrl+F en ellos +- Extraer texto de documentos fotografiados o de registros en papel antiguos +- Procesar recibos con el preajuste Invoice para capturar con precisión importes y fechas +- Crear PDF accesibles a partir de escaneos que solo contienen imágenes, para cumplir requisitos normativos +- Extraer por lotes el contenido de texto de libros o manuales escaneados + +## Consejos + +- Selecciona varios idiomas si tu documento tiene contenido en idiomas mezclados (por ejemplo, encabezados en inglés con texto principal en japonés). +- Usa la opción de binarizar en documentos con texto desvaído o de bajo contraste: puede mejorar mucho la precisión del reconocimiento. +- Los preajustes de lista blanca Invoice y Forms reducen drásticamente los falsos positivos en documentos estructurados al ignorar formas de caracteres irrelevantes. + +## Herramientas relacionadas + +- [Extraer tablas](./extract-tables) +- [Combinar PDF](./merge-pdf) +- [Comprimir PDF](./compress-pdf) diff --git a/docs/es/tools/odg-to-pdf.md b/docs/es/tools/odg-to-pdf.md new file mode 100644 index 00000000..19816499 --- /dev/null +++ b/docs/es/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG a PDF +description: Convierte archivos de LibreOffice Draw (ODG) a PDF en tu navegador. Gratis, sin subir nada, totalmente privado. +--- + +# ODG a PDF + +Convierte archivos OpenDocument Graphics en PDF. ODG es el formato nativo de LibreOffice Draw y se usa para diagramas, diagramas de flujo e ilustraciones vectoriales. Convertirlos a PDF facilita compartir, imprimir e incrustar estos dibujos en otros documentos. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :-------------------- | :-------- | :--------------------------------------------- | +| OpenDocument Graphics | `.odg` | Archivos de LibreOffice Draw / OpenOffice Draw | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos ODG. Puedes añadir varios a la vez. +2. Revisa la lista de archivos. Quita entradas individuales con el icono de papelera, o haz clic en **Agregar Más Archivos** para añadir más dibujos. +3. Haz clic en **Convertir a PDF**. Un motor basado en LibreOffice se carga en el navegador y convierte cada archivo ODG, conservando los gráficos vectoriales, las formas y el texto. +4. Un solo archivo se descarga directamente como PDF. Varios archivos generan un archivo ZIP llamado `odg-to-pdf.zip`. + +## Opciones + +No hacen falta ajustes adicionales. La conversión conserva las dimensiones de página originales, las formas, los conectores y los cuadros de texto del ODG de origen. + +## Casos de uso + +- Compartir diagramas de LibreOffice Draw con clientes que no tienen LibreOffice instalado +- Imprimir diagramas de flujo y diagramas de red creados en Draw +- Incluir ilustraciones ODG en un informe o presentación como PDF incrustados +- Archivar dibujos técnicos en un formato que seguirá siendo legible durante décadas + +## Consejos + +- Los elementos vectoriales siguen siendo vectores en el PDF resultante, así que el resultado se escala sin pérdida a cualquier tamaño de impresión. +- El motor de LibreOffice tarda un momento en inicializarse la primera vez. Las conversiones posteriores dentro de la misma sesión son más rápidas. + +## Herramientas relacionadas + +- [ODS a PDF](./ods-to-pdf) +- [ODP a PDF](./odp-to-pdf) +- [VSD a PDF](./vsd-to-pdf) diff --git a/docs/es/tools/odp-to-pdf.md b/docs/es/tools/odp-to-pdf.md new file mode 100644 index 00000000..ad591bfb --- /dev/null +++ b/docs/es/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP a PDF +description: Convierte presentaciones de LibreOffice Impress (ODP) a PDF en tu navegador. Gratis, privado, sin subir nada. +--- + +# ODP a PDF + +Convierte archivos OpenDocument Presentation en PDF. ODP es el formato nativo de LibreOffice Impress y una exportación estándar de Google Slides. Convertir las presentaciones a PDF permite que cualquiera las vea sin software de presentaciones, y las diapositivas se imprimen con limpieza. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :------------------------ | :-------- | :------------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / exportación de Google Slides | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos ODP. Puedes seleccionar varias presentaciones a la vez. +2. Revisa la lista de archivos. Quita entradas con el icono de papelera, o usa **Agregar Más Archivos** para incluir más presentaciones. +3. Haz clic en **Convertir a PDF**. El motor basado en LibreOffice procesa cada presentación y genera un PDF en el que cada diapositiva es una página. +4. Un solo archivo se descarga como PDF. Varios archivos se entregan en un archivo ZIP llamado `odp-to-pdf.zip`. + +## Opciones + +No hay ajustes que configurar. Cada diapositiva se renderiza con sus dimensiones originales, conservando el texto, las imágenes, las formas y los fondos. + +## Casos de uso + +- Distribuir una presentación al público como PDF de material de apoyo +- Compartir exportaciones de Google Slides con personas que prefieren PDF a ODP +- Archivar charlas de congresos y clases en un formato de solo lectura +- Imprimir presentaciones para talleres presenciales + +## Consejos + +- Las transiciones y animaciones de las diapositivas son funciones puramente visuales que no pasan al PDF, pero todo el contenido estático se renderiza correctamente. +- Las notas del orador no se incluyen en el PDF. Si necesitas las notas, expórtalas por separado desde tu software de presentaciones. +- Como las demás herramientas basadas en LibreOffice, el motor se carga la primera vez que se usa y queda en caché durante la sesión. + +## Herramientas relacionadas + +- [ODG a PDF](./odg-to-pdf) +- [ODS a PDF](./ods-to-pdf) +- [PUB a PDF](./pub-to-pdf) diff --git a/docs/es/tools/ods-to-pdf.md b/docs/es/tools/ods-to-pdf.md new file mode 100644 index 00000000..b58c1c28 --- /dev/null +++ b/docs/es/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS a PDF +description: Convierte hojas de cálculo de LibreOffice Calc (ODS) a PDF en tu navegador. Gratis, privado, sin registro. +--- + +# ODS a PDF + +Convierte archivos OpenDocument Spreadsheet a PDF. ODS es el formato nativo de LibreOffice Calc y una exportación habitual de Google Sheets. Esta herramienta convierte los datos, el formato y los gráficos de tu hoja de cálculo en un PDF paginado que puedes imprimir o compartir. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :----------------------- | :-------- | :---------------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Exportación de LibreOffice Calc / Google Sheets | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos ODS. Se admiten varios archivos. +2. Revisa la lista de archivos. Usa el icono de la papelera para quitar archivos, o haz clic en **Agregar más archivos** para ampliar el lote. +3. Haz clic en **Convertir a PDF**. El motor basado en LibreOffice se carga en el navegador y convierte cada hoja de cálculo en páginas PDF. +4. Una sola hoja de cálculo se descarga como PDF. Varios archivos se empaquetan en `ods-to-pdf.zip`. + +## Opciones + +No se requiere ninguna configuración. El convertidor aplica al PDF el diseño de impresión, el formato de celdas y los anchos de columna existentes de la hoja de cálculo. + +## Casos de uso + +- Compartir un presupuesto o informe de LibreOffice Calc con alguien que solo acepta PDF +- Imprimir una exportación de Google Sheets que se descargó como ODS +- Archivar registros financieros en un formato no editable +- Enviar formularios u hojas de horas en ODS como documentos de diseño fijo + +## Consejos + +- Si tu hoja de cálculo tiene varias hojas, todas se incluyen en el PDF. +- Las hojas de cálculo muy anchas pueden extenderse horizontalmente en varias páginas PDF. Si el diseño importa, ajusta los anchos de columna en el archivo original antes de convertir. +- El motor de LibreOffice se inicializa en el primer uso. Las conversiones siguientes en la misma sesión son más rápidas. + +## Herramientas relacionadas + +- [ODG a PDF](./odg-to-pdf) +- [ODP a PDF](./odp-to-pdf) +- [XML a PDF](./xml-to-pdf) diff --git a/docs/es/tools/odt-to-pdf.md b/docs/es/tools/odt-to-pdf.md new file mode 100644 index 00000000..99768bdf --- /dev/null +++ b/docs/es/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT a PDF +description: Convierte archivos OpenDocument Text (ODT) a PDF en tu navegador con un motor basado en LibreOffice. +--- + +# ODT a PDF + +Convierte archivos OpenDocument Text a PDF. ODT es el formato nativo de LibreOffice Writer, Apache OpenOffice y otros procesadores de texto de código abierto. Esta herramienta usa un motor de LibreOffice en el navegador para lograr conversiones precisas que conservan el formato, las tablas, las imágenes y los estilos. + +## Formatos compatibles + +| Formato | Extensiones | +| :---------------- | :---------- | +| OpenDocument Text | `.odt` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta uno o más archivos ODT. +2. Revisa la lista de archivos. Agrega más archivos o quita los que no quieras. +3. Haz clic en **Convertir a PDF**. El motor de LibreOffice se inicializa (un indicador de progreso muestra el estado de carga) y luego se convierte cada archivo. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se empaquetan en `odt-converted.zip`. + +## Opciones + +Esta herramienta no tiene configuración adicional. La conversión conserva el formato del documento original lo más fielmente posible. + +## Salida + +| Cantidad de entrada | Salida | +| :------------------ | :------------------------------------------------------------ | +| 1 archivo | Descarga de un solo PDF (p. ej., `document.pdf`) | +| 2 o más archivos | Archivo ZIP (`odt-converted.zip`) con un PDF por cada archivo | + +## Casos de uso + +- Convertir documentos de LibreOffice Writer a PDF para compartirlos con usuarios de Microsoft Office +- Generar PDF listos para imprimir a partir de trabajos académicos escritos en formato OpenDocument +- Convertir por lotes una carpeta de plantillas ODT en PDF para distribuirlos +- Generar PDF a partir de archivos ODT creados por sistemas automáticos de generación de documentos + +## Consejos + +- El motor de LibreOffice se carga en el primer uso y queda en caché para las siguientes conversiones. La primera carga tarda unos segundos; después, las conversiones son rápidas. +- Los documentos complejos con objetos OLE incrustados o fuentes poco comunes pueden verse un poco distintos que en LibreOffice de escritorio. Prueba con una muestra antes de convertir por lotes. +- Para documentos de Word (`.doc`, `.docx`), usa en su lugar la herramienta [Word a PDF](./word-to-pdf), que también usa el motor de LibreOffice pero acepta directamente los formatos de Microsoft. + +## Herramientas relacionadas + +- [Word a PDF](./word-to-pdf) +- [RTF a PDF](./rtf-to-pdf) +- [Texto a PDF](./txt-to-pdf) diff --git a/docs/es/tools/organize-pdf.md b/docs/es/tools/organize-pdf.md new file mode 100644 index 00000000..ef0acb78 --- /dev/null +++ b/docs/es/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplicar y Organizar +description: Reordena, duplica y elimina páginas de un PDF con miniaturas de arrastrar y soltar y un orden de páginas personalizado. +--- + +# Duplicar y Organizar + +Reorganiza, duplica y elimina páginas de un PDF con una interfaz visual de arrastrar y soltar. Cada página aparece como una miniatura que puedes mover, clonar o eliminar antes de guardar el resultado como un archivo nuevo. + +## Cómo funciona + +1. Sube un único archivo PDF. +2. La herramienta muestra una cuadrícula de miniaturas con todas las páginas. +3. Arrastra las miniaturas para reordenar las páginas, haz clic en el botón verde de duplicar para clonar una página o en el botón rojo de eliminar para quitarla. +4. También puedes escribir un orden de páginas personalizado en el campo de texto (p. ej., `3, 1, 2, 4`) y hacer clic en **Aplicar** para reorganizar todas las páginas de una vez. +5. Haz clic en el botón de procesar para crear y descargar el PDF reorganizado. + +## Características + +- Reordenación de páginas con arrastrar y soltar y transiciones animadas +- Botones de duplicar y eliminar en cada página +- Campo de orden de páginas personalizado para una reorganización precisa +- Etiquetas con el número de página que se actualizan automáticamente tras cada cambio +- Impide eliminar la última página restante + +## Casos de uso + +- Mover una página mal colocada a su posición correcta en un informe +- Duplicar una página de formulario para tener varias copias en blanco en un solo archivo +- Quitar páginas de borrador o de relleno antes de distribuir un documento +- Invertir o mezclar el orden de las páginas para preparar la impresión +- Crear una secuencia de páginas personalizada sin volver a fusionar archivos separados + +## Consejos + +- El campo de orden de páginas personalizado espera números de página originales separados por comas. Debe incluir cada página exactamente una vez, sin omisiones ni duplicados. +- Después de duplicar una página, ambas copias hacen referencia al mismo índice de página original. Reordenar cualquiera de las copias funciona de forma independiente. +- Para operaciones masivas con varios archivos o flujos de trabajo más avanzados, considera usar en su lugar la [Multiherramienta PDF](./pdf-multi-tool). + +## Herramientas relacionadas + +- [Fusionar PDF](./merge-pdf) +- [Eliminar Páginas](./delete-pages) +- [Multiherramienta PDF](./pdf-multi-tool) +- [Invertir Páginas](./reverse-pages) diff --git a/docs/es/tools/page-dimensions.md b/docs/es/tools/page-dimensions.md new file mode 100644 index 00000000..b716dbf4 --- /dev/null +++ b/docs/es/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Dimensiones de página +description: Analiza tamaños, orientaciones, proporciones y rotación de las páginas de un PDF. Detecta documentos con tamaños mixtos y exporta los datos a CSV. +--- + +# Dimensiones de página + +Una herramienta de diagnóstico que lee cada página de tu PDF y muestra sus dimensiones exactas, orientación, nombre de tamaño estándar, proporción, área y rotación. Es útil para detectar páginas de distintos tamaños antes de imprimir o para documentar las propiedades de un PDF que recibiste. + +## Cómo funciona + +1. Sube un archivo PDF. El análisis empieza automáticamente, sin botón que pulsar. +2. Un panel de resumen muestra el total de páginas, la cantidad de tamaños de página distintos y si el documento tiene tamaños mixtos. +3. Explora la tabla completa de resultados con los detalles de cada página. +4. Cambia las unidades de visualización entre puntos, pulgadas, milímetros o píxeles. +5. Haz clic en **Exportar a CSV** para guardar los datos. + +## Campos mostrados + +| Columna | Descripción | +| --------------- | ------------------------------------------------------- | +| N.º de página | Número de página secuencial | +| Dimensiones | Ancho x Alto en la unidad seleccionada | +| Tamaño estándar | Nombre coincidente (A4, Letter, etc.) o "Personalizado" | +| Orientación | Vertical u horizontal | +| Proporción | Relación ancho/alto como número decimal | +| Área | Área de la página en la unidad seleccionada al cuadrado | +| Rotación | Rotación de la página en grados | + +## Características + +- Detección automática de tamaños de papel estándar (A3, A4, A5, Letter, Legal, Tabloid y más) +- Aviso de documento con tamaños mixtos, con el desglose de qué tamaños aparecen y cuántas páginas usa cada uno +- Conversión de unidades entre puntos, pulgadas, milímetros y píxeles (a 96 PPI) +- Exportación a CSV para usar en hojas de cálculo o sistemas de documentación + +## Casos de uso + +- Verificar que todas las páginas son A4 antes de enviar un documento a una imprenta +- Diagnosticar por qué un PDF fusionado se imprime con márgenes inesperados en ciertas páginas +- Documentar el diseño de páginas de un archivo PDF grande para registros de metadatos +- Identificar páginas rotadas que necesitan corrección + +## Consejos + +- Si el resumen muestra "Tamaños mixtos", usa la herramienta Fijar Tamaño de Página para estandarizar antes de imprimir. +- El campo de rotación ayuda a identificar páginas que se ven correctamente pero tienen un atributo de rotación distinto de cero, lo que puede causar problemas en algunos flujos de trabajo. + +## Herramientas relacionadas + +- [Fijar Tamaño de Página](./fix-page-size): estandariza las páginas tras identificar tamaños mixtos +- [Comprimir PDF](./compress-pdf): optimiza el PDF después de corregir los problemas de página +- [Rotar PDF](./rotate-pdf): corrige las páginas rotadas diff --git a/docs/es/tools/page-numbers.md b/docs/es/tools/page-numbers.md new file mode 100644 index 00000000..1fae6d0d --- /dev/null +++ b/docs/es/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Números de página +description: Agrega números de página personalizables en cualquier posición de las páginas de tu PDF, con fuente, tamaño y color configurables. +--- + +# Números de página + +Agrega números de página visibles a todas las páginas de tu PDF. Tú eliges la posición, el formato, el tamaño de fuente y el color, y la herramienta se encarga del resto. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Configura los ajustes de numeración en el panel de opciones que aparece. +3. Haz clic en **Agregar números de página** para procesar. +4. El PDF numerado se descarga automáticamente. + +## Opciones + +- **Posición**: elige dónde aparecen los números de página: abajo al centro, abajo a la izquierda, abajo a la derecha, arriba al centro, arriba a la izquierda o arriba a la derecha. +- **Formato**: elige entre numeración simple (1, 2, 3...) o el formato "página X de Y" (1 / 5, 2 / 5...). +- **Tamaño de fuente**: define el tamaño del texto del número de página. Por defecto es 12. +- **Color**: elige cualquier color para el texto del número de página con el selector de color. + +## Características + +- Seis opciones de posición que cubren todas las esquinas y las posiciones centrales +- Dos formatos de numeración: secuencial simple o "página X de Y" +- Tamaño de fuente personalizable de 6 a 72 puntos +- Selector de color completo para el color del texto +- Manejo automático de márgenes que mantiene los números dentro de zonas seguras sin importar el tamaño de la página + +## Casos de uso + +- Preparar documentos para imprimir que necesitan referencias de página visibles +- Agregar números de página a un PDF fusionado creado a partir de varios archivos de origen +- Numerar los folletos de una presentación antes de distribuirlos +- Agregar numeración secuencial a documentos legales o contratos + +## Consejos + +- El formato "página X de Y" es útil para documentos en los que los lectores necesitan saber la extensión total, como propuestas o informes. +- Si necesitas distintos estilos de numeración para diferentes secciones (como números romanos para las páginas preliminares), usa en su lugar la herramienta [Agregar etiquetas de página](./add-page-labels). + +## Herramientas relacionadas + +- [Agregar etiquetas de página](./add-page-labels) +- [Numeración Bates](./bates-numbering) +- [Encabezado y Pie de Página](./header-footer) diff --git a/docs/es/tools/pdf-booklet.md b/docs/es/tools/pdf-booklet.md new file mode 100644 index 00000000..e917bc36 --- /dev/null +++ b/docs/es/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Folleto PDF +description: Reorganiza las páginas de un PDF en orden de folleto (grapado al caballete) para doblarlo y engraparlo como folleto físico. +--- + +# Folleto PDF + +Reorganiza las páginas de un PDF en el orden de imposición de folleto. Al imprimirlo a doble cara y doblarlo por la mitad, las páginas quedan en la secuencia de lectura correcta. Es el diseño que se usa en folletos grapados al caballete y zines. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Configura los ajustes del folleto: tamaño y orientación de la página de salida. +3. Haz clic en **Generar vista previa** para ver cómo se organizarán las páginas en cada hoja. +4. Revisa la vista previa, que muestra cada hoja física con las páginas asignadas al anverso y al reverso. +5. Haz clic en **Descargar** para guardar el PDF con la imposición de folleto. + +## Características + +- Reordenación automática de páginas para encuadernación grapada al caballete +- Tamaño de página de salida configurable +- Vista previa visual del diseño del folleto antes de descargar +- Maneja cantidades impares de páginas insertando páginas en blanco donde hace falta +- Escala las páginas de origen para ajustarlas al tamaño de hoja del folleto + +## Casos de uso + +- Crear folletos o zines imprimibles a partir de un PDF normal +- Preparar programas de conferencias o guías de eventos para imprimirlos en casa o en la oficina +- Hacer tarjetas de felicitación plegadas o catálogos pequeños +- Producir cuadernillos o colecciones de poesía para encuadernar a mano + +## Consejos + +- Lo ideal es que la cantidad de páginas de tu PDF de origen sea múltiplo de 4 para un folleto limpio. Si no lo es, se agregan páginas en blanco automáticamente para completar la última hoja. +- Imprime el resultado a doble cara con la opción "voltear por el borde corto" de tu impresora, luego dobla todas las hojas juntas y engrápalas en el lomo. +- Si solo quieres colocar varias páginas en una hoja sin el orden de folleto, usa en su lugar [N-Up PDF](./n-up-pdf). + +## Herramientas relacionadas + +- [N-Up PDF](./n-up-pdf) +- [Rotar PDF](./rotate-pdf) +- [Agregar Página en Blanco](./add-blank-page) diff --git a/docs/es/tools/pdf-layers.md b/docs/es/tools/pdf-layers.md new file mode 100644 index 00000000..c68eff04 --- /dev/null +++ b/docs/es/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Capas PDF (OCG) +description: Visualiza, activa o desactiva, agrega y elimina capas de Optional Content Group (OCG) en un documento PDF. +--- + +# Capas PDF (OCG) + +Gestiona los Optional Content Groups (OCG), conocidos habitualmente como "capas", dentro de un PDF. Puedes activar o desactivar la visibilidad de las capas, agregar capas nuevas (incluidas capas hijas anidadas), eliminar capas y guardar el PDF modificado. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Haz clic en el botón de procesar para cargar el documento con el motor PyMuPDF. +3. La herramienta muestra todas las capas existentes con su estado de visibilidad, su estado de bloqueo y su jerarquía de anidación. +4. Marca o desmarca las casillas para mostrar u ocultar capas. Las capas bloqueadas no se pueden cambiar. +5. Agrega capas nuevas de nivel superior escribiendo un nombre y haciendo clic en el botón de agregar, o agrega capas hijas bajo una capa padre existente. +6. Elimina las capas que ya no necesites. +7. Haz clic en **Guardar** para descargar el PDF modificado con los cambios de capas aplicados. + +## Características + +- Muestra la jerarquía de capas con la sangría adecuada para las capas anidadas +- Activa o desactiva la visibilidad de las capas +- El indicador de capa bloqueada evita cambios accidentales +- Agrega capas de nivel superior o capas hijas con nombres personalizados +- Elimina capas individuales +- Guarda todos los cambios en un archivo PDF nuevo + +## Casos de uso + +- Activar o desactivar la visibilidad de las capas de anotaciones en planos de arquitectura o ingeniería +- Agregar nuevas capas de anotación a un documento de diseño con varias capas +- Eliminar capas obsoletas de una plantilla antes de distribuirla +- Inspeccionar qué capas existen en un PDF complejo recibido de terceros + +## Consejos + +- Si el PDF no tiene capas, la herramienta muestra un estado vacío con una invitación a agregar una. No todos los PDF usan capas OCG: son más comunes en exportaciones de CAD y archivos de diseño. +- Las capas hijas aparecen con sangría bajo su capa padre. Puedes anidar capas a cualquier profundidad. +- Las capas bloqueadas se muestran con un icono de candado y sus casillas están desactivadas. Estos bloqueos los establece el creador del PDF. + +## Herramientas relacionadas + +- [Ver Metadatos](./view-metadata) +- [Editar Metadatos](./edit-metadata) +- [Duplicar y Organizar](./organize-pdf) diff --git a/docs/es/tools/pdf-multi-tool.md b/docs/es/tools/pdf-multi-tool.md new file mode 100644 index 00000000..731e242d --- /dev/null +++ b/docs/es/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Multiherramienta PDF +description: Un gestor de páginas todo en uno para fusionar, dividir, rotar, duplicar, eliminar y reordenar páginas de PDF. +--- + +# Multiherramienta PDF + +Un espacio de trabajo unificado para cualquier operación a nivel de página en PDF. Sube uno o más PDF y trabaja con todas sus páginas en una única cuadrícula visual. Rota, reordena, duplica, elimina, inserta nuevos PDF, agrega páginas en blanco y divide el resultado, todo sin salir de la herramienta. + +## Cómo funciona + +1. Haz clic en **Subir PDFs** o arrastra archivos al área de carga. Se admiten varios archivos. +2. Todas las páginas de cada archivo subido aparecen en una cuadrícula desplazable con miniaturas. +3. Usa la barra de herramientas o los botones de acción de cada página para manipular las páginas. +4. Selecciona páginas con la casilla de cada tarjeta y luego aplica operaciones masivas. +5. Marca puntos de división con el icono de tijeras para dividir la salida en archivos separados. +6. Haz clic en **Exportar PDF** para descargar el resultado final. Si hay marcadores de división, la salida es un ZIP con varios PDF. + +## Características + +- **Fusionar**: sube varios PDF y se combinan automáticamente en un solo espacio de trabajo +- **Reordenar**: arrastra y suelta las tarjetas de página para cambiar la secuencia +- **Rotar**: rotación por página o masiva en incrementos de 90 grados (izquierda o derecha) +- **Duplicar**: clona cualquier página con un clic +- **Eliminar**: quita páginas individuales o elimina en bloque las seleccionadas +- **Insertar PDF**: agrega un nuevo PDF después de cualquier página concreta +- **Agregar página en blanco**: añade una página A4 en blanco al final +- **Dividir**: coloca marcadores de división entre páginas y luego exporta un ZIP de PDF separados +- **Seleccionar todo / Deseleccionar todo**: selección rápida para operaciones masivas +- **Deshacer / Rehacer**: historial completo de deshacer y rehacer para cada operación +- **Descargar selección**: exporta solo las páginas seleccionadas como un PDF independiente +- Repara automáticamente los PDF dañados antes de cargarlos + +## Casos de uso + +- Crear un documento personalizado con páginas de varios PDF de origen +- Limpiar un documento escaneado eliminando páginas en blanco, rotando escaneos de lado y reordenando secciones +- Dividir un PDF grande en los límites de los capítulos con marcadores de división visuales +- Edición rápida a nivel de página sin necesidad de un editor de PDF completo + +## Consejos + +- El sistema de deshacer y rehacer registra cada operación. Úsalo con libertad: no puedes perder tu trabajo por accidente. +- Los marcadores de división aparecen como líneas azules discontinuas entre páginas. Colócalos visualmente donde quieras dividir el documento y luego exporta para obtener un ZIP. +- Para tareas sencillas de fusión o división, las herramientas dedicadas [Fusionar PDF](./merge-pdf) o [Dividir PDF](./split-pdf) pueden ser más rápidas. La Multiherramienta destaca cuando necesitas varias operaciones en una sola sesión. + +## Herramientas relacionadas + +- [Fusionar PDF](./merge-pdf) +- [Dividir PDF](./split-pdf) +- [Duplicar y Organizar](./organize-pdf) +- [Rotar PDF](./rotate-pdf) diff --git a/docs/es/tools/pdf-to-bmp.md b/docs/es/tools/pdf-to-bmp.md new file mode 100644 index 00000000..e398b8c5 --- /dev/null +++ b/docs/es/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF a BMP +description: Convierte páginas de PDF a imágenes BMP sin comprimir. Útil para sistemas heredados y flujos de impresión que requieren mapas de bits. +--- + +# PDF a BMP + +Convierte cada página de un PDF en una imagen BMP (mapa de bits). BMP es un formato sin comprimir, por lo que el resultado es exacto píxel a píxel y sin pérdida de calidad, pero los archivos son grandes. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Haz clic en **Convertir** para procesar el archivo. +3. Un único archivo `.bmp` o un archivo ZIP se descarga automáticamente. + +## Opciones + +Esta herramienta no tiene opciones configurables. Las páginas se renderizan a una escala fija de 2x, lo que produce imágenes con aproximadamente el doble de las dimensiones nativas de la página del PDF. + +## Formato de salida + +- **Una página**: `filename.bmp` +- **Varias páginas**: `filename_bmps.zip` con `page_1.bmp`, `page_2.bmp`, etc. + +## Casos de uso + +- Enviar páginas de PDF a sistemas o equipos heredados que solo aceptan BMP. +- Preparar imágenes sin comprimir para flujos de impresión específicos. +- Usar la salida en mapa de bits como entrada de herramientas de procesamiento de imágenes que requieren datos de píxeles sin procesar. + +## Consejos + +- Los archivos BMP son muy grandes porque almacenan los píxeles sin comprimir. Para la mayoría de los usos, [PDF a PNG](./pdf-to-png) ofrece calidad sin pérdida con archivos mucho más pequeños. +- Si tu sistema de destino acepta PNG o TIFF, prefiere esos formatos para ahorrar espacio en disco. + +## Herramientas relacionadas + +- [PDF a PNG](./pdf-to-png) +- [PDF a TIFF](./pdf-to-tiff) +- [PDF a JPG](./pdf-to-jpg) diff --git a/docs/es/tools/pdf-to-cbz.md b/docs/es/tools/pdf-to-cbz.md new file mode 100644 index 00000000..37d18b47 --- /dev/null +++ b/docs/es/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF a CBZ +description: Convierte un PDF en un archivo CBZ (Comic Book Archive) para lectores de cómics como Komga, Kavita, CDisplayEx y Calibre. +--- + +# PDF a CBZ + +Convierte un PDF en un archivo CBZ (Comic Book ZIP), el formato estándar de cómics y manga digitales. Cada página del PDF se convierte en una imagen dentro del archivo. La herramienta genera metadatos en tres formatos para lograr la máxima compatibilidad: ComicInfo.xml, metadata.opf y ComicBookInfo JSON. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Elige el formato de imagen, la calidad, la escala y los metadatos opcionales. +3. Haz clic en **Convertir** para generar el archivo CBZ. +4. El archivo `.cbz` se descarga automáticamente. + +## Opciones + +| Opción | Valores | Predeterminado | Descripción | +| ----------------- | --------------- | -------------- | ------------------------------------------------------------------------------------------------------- | +| Formato de imagen | JPEG, PNG, WebP | JPEG | JPEG para cómics a color, PNG para manga en blanco y negro sin pérdida, WebP para la mejor compresión. | +| Calidad | 50–100% | 85% | Controla la compresión de JPEG/WebP. Se oculta con PNG (siempre sin pérdida). | +| Escala | 1.0x–4.0x | 2.0x | Una escala mayor produce imágenes más nítidas para pantallas de alta resolución. | +| Escala de grises | Sí/No | No | Convierte las páginas a escala de grises. Reduce el tamaño del archivo con contenido en blanco y negro. | +| Modo manga | Sí/No | No | Establece en los metadatos la dirección de lectura de derecha a izquierda. | +| Incluir metadatos | Sí/No | Sí | Incrusta ComicInfo.xml, metadata.opf y ComicBookInfo JSON. | + +## Campos de metadatos + +Cuando los metadatos están activados, puedes rellenar: + +- **Título**: se detecta automáticamente a partir del nombre del archivo PDF. +- **Serie**: el nombre de la serie (p. ej., "Naruto"). +- **Número (#)**: número del ejemplar dentro de la serie. +- **Volumen (Vol.)**: número de volumen. +- **Autor(es)**: nombre del guionista o creador. +- **Editorial**: empresa editora. +- **Etiquetas / Género**: etiquetas separadas por comas (p. ej., "Acción, Aventura"). +- **Año de publicación**: año de publicación (1900–2100). +- **Valoración**: valoración de la comunidad de 0 a 5. + +## Compatibilidad de metadatos + +La herramienta escribe los metadatos en tres formatos para que cualquier lector pueda encontrarlos: + +| Formato | Ubicación | Compatible con | +| ------------------ | --------------------------- | ------------------------------------------- | +| ComicInfo.xml | Archivo dentro del ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Archivo dentro del ZIP | Calibre | +| ComicBookInfo JSON | Campo de comentario del ZIP | Calibre (alternativa) | + +## Formato de salida + +- `filename.cbz`: un archivo ZIP con las imágenes de página numeradas y los archivos de metadatos. + +Las imágenes de página se nombran con números rellenados con ceros (`01.jpg`, `02.jpg`, etc.) para que los lectores las muestren en el orden correcto. + +## Casos de uso + +- Convertir PDF de manga o cómics para usarlos con lectores de cómics. +- Crear una biblioteca de cómics digital en Komga, Kavita o Calibre. +- Convertir cómics escaneados a un formato apto para lectores. +- Compartir cómics en un formato que conserva la dirección de lectura y los metadatos. + +## Consejos + +- Usa **JPEG** para cómics a color y **PNG** para manga en blanco y negro: PNG comprime muy bien el contenido en blanco y negro. +- Activa **Escala de grises** en el manga para reducir de forma notable el tamaño del archivo. +- Rellena los campos **Serie** y **Número** para que los gestores de biblioteca (Komga, Calibre) organicen tu colección automáticamente. +- **WebP** ofrece la mejor compresión, pero algunos lectores de cómics antiguos pueden no admitirlo. + +## Herramientas relacionadas + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a PNG](./pdf-to-png) +- [PDF a TIFF](./pdf-to-tiff) +- [Extraer imágenes](./extract-images) diff --git a/docs/es/tools/pdf-to-csv.md b/docs/es/tools/pdf-to-csv.md new file mode 100644 index 00000000..b27a1068 --- /dev/null +++ b/docs/es/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF a CSV +description: Extrae tablas de documentos PDF y expórtalas como un único archivo CSV. Admite PDF de varias páginas con detección automática de tablas. +--- + +# PDF a CSV + +Extrae tablas de un PDF y las exporta como un archivo CSV. La herramienta analiza cada página en busca de datos tabulares con el motor de detección de tablas de PyMuPDF y escribe todas las filas encontradas en una única salida separada por comas. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Haz clic en **Convertir** para iniciar la extracción de tablas. +3. La herramienta analiza cada página e identifica las tablas automáticamente. +4. Se descarga un archivo `.csv` con todos los datos de las tablas extraídas. + +Las tablas de páginas distintas se separan con filas en blanco en la salida. Las celdas que contienen comas, comillas o saltos de línea se escapan correctamente según RFC 4180. + +## Opciones + +Esta herramienta no tiene opciones configurables. Todas las tablas encontradas en el documento se extraen y se combinan en un único CSV. + +## Formato de salida + +- Un único archivo `filename.csv` con todas las tablas detectadas. + +## Casos de uso + +- Pasar datos financieros de extractos bancarios o facturas en PDF a una hoja de cálculo. +- Extraer tablas de precios de presupuestos de proveedores para compararlas. +- Convertir datos tabulares de investigaciones en PDF a un formato adecuado para herramientas de análisis. +- Migrar datos de informes PDF antiguos a bases de datos. + +## Consejos + +- Si no se encuentran tablas, la herramienta muestra el mensaje "No se encontraron tablas". Normalmente significa que el PDF usa un diseño de texto que parece tabular pero no está estructurado como una tabla real. +- Para tener más control sobre cada tabla, usa [Extraer Tablas de PDF](./extract-tables), que permite elegir entre salida en CSV, JSON y Markdown. +- Si necesitas los datos en formato Excel con hojas separadas por tabla, usa [PDF a Excel](./pdf-to-excel). + +## Herramientas relacionadas + +- [PDF a Excel](./pdf-to-excel) +- [Extraer Tablas de PDF](./extract-tables) +- [PDF a Texto](./pdf-to-text) diff --git a/docs/es/tools/pdf-to-excel.md b/docs/es/tools/pdf-to-excel.md new file mode 100644 index 00000000..74a8c595 --- /dev/null +++ b/docs/es/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF a Excel +description: Extrae tablas de documentos PDF a una hoja de cálculo de Excel. Cada tabla se guarda en su propia hoja con referencia a la página. +--- + +# PDF a Excel + +Extrae tablas de un PDF y las guarda como una hoja de cálculo de Excel (`.xlsx`). Cada tabla detectada se coloca en su propia hoja, etiquetada con su número de tabla y la página de origen. Funciona con PyMuPDF para la detección de tablas y la biblioteca SheetJS para generar el archivo de Excel. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Haz clic en **Convertir** para iniciar la extracción de tablas. +3. La herramienta analiza cada página en busca de tablas y luego crea un libro de Excel. +4. Se descarga un archivo `.xlsx` con una hoja por tabla. + +## Opciones + +Esta herramienta no tiene opciones configurables. Todas las tablas detectadas se extraen automáticamente. + +## Formato de salida + +- Un único archivo `filename.xlsx`. +- **Una tabla**: una sola hoja llamada "Table". +- **Varias tablas**: hojas llamadas "Table 1 (Page 3)", "Table 2 (Page 5)", etc. Los nombres de hoja se truncan a 31 caracteres (el límite de Excel). + +## Casos de uso + +- Convertir informes financieros en PDF a hojas de cálculo editables para seguir analizándolos. +- Extraer tablas de inventario o pedidos de PDF de proveedores. +- Pasar datos estructurados de formularios o catálogos en PDF a Excel para ordenarlos y filtrarlos. +- Archivar datos tabulares de PDF en un formato con el que puedan trabajar compañeros sin perfil técnico. + +## Consejos + +- Si la herramienta indica "No se encontraron tablas", es probable que el PDF use un texto de flujo libre en lugar de tablas estructuradas. Prueba [PDF a Texto](./pdf-to-text) para obtener el contenido sin procesar. +- Para un formato plano más simple, usa [PDF a CSV](./pdf-to-csv). Para descargas por tabla en varios formatos, usa [Extraer Tablas de PDF](./extract-tables). +- Revisa los nombres de las hojas para saber de qué página procede cada tabla. + +## Herramientas relacionadas + +- [PDF a CSV](./pdf-to-csv) +- [Extraer Tablas de PDF](./extract-tables) +- [PDF a Texto](./pdf-to-text) diff --git a/docs/es/tools/pdf-to-greyscale.md b/docs/es/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..0f1d0161 --- /dev/null +++ b/docs/es/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF a escala de grises +description: Convierte un PDF a color en una versión en escala de grises (blanco y negro). Genera un PDF nuevo sin color en ninguna página. +--- + +# PDF a escala de grises + +Convierte un PDF a color en una versión en escala de grises. Cada página se renderiza, se desatura y se vuelve a incrustar como imagen JPEG en un PDF nuevo. El resultado conserva las dimensiones originales de la página. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Haz clic en **Convertir** para procesar el archivo. +3. Se descarga un nuevo `greyscale.pdf` con todas las páginas convertidas a blanco y negro. + +Internamente, cada página se renderiza a escala 2x, los datos de píxeles pasan por un filtro de escala de grises y luego se recodifican como JPEG con calidad del 90% y se colocan en un documento PDF nuevo. + +## Opciones + +Esta herramienta no tiene opciones configurables. La conversión a escala de grises usa una fórmula de luminancia estándar y la calidad JPEG está fijada en el 90%. + +## Formato de salida + +- Un único archivo `greyscale.pdf` con todas las páginas como imágenes JPEG en escala de grises. + +## Casos de uso + +- Preparar documentos para imprimir en blanco y negro y ahorrar en tinta de color. +- Cumplir requisitos de presentación de trámites legales o gubernamentales que exigen escala de grises. +- Reducir el tamaño de PDF con mucho color (las imágenes JPEG en escala de grises pesan menos que las de color). +- Crear un estilo visual coherente en documentos con páginas a color y en blanco y negro. + +## Consejos + +- Como cada página se rasteriza y se vuelve a incrustar como JPEG, el resultado está basado en imágenes. El texto del PDF original ya no se podrá seleccionar ni buscar. Si después necesitas texto con búsqueda, pasa el resultado por la herramienta OCR. +- Para tener más control sobre los ajustes de color (brillo, contraste, saturación), mira la herramienta Ajustar colores o el nodo de escala de grises del [Constructor de flujos de trabajo PDF](./pdf-workflow). + +## Herramientas relacionadas + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a PNG](./pdf-to-png) +- [Constructor de flujos de trabajo PDF](./pdf-workflow) diff --git a/docs/es/tools/pdf-to-jpg.md b/docs/es/tools/pdf-to-jpg.md new file mode 100644 index 00000000..667055cc --- /dev/null +++ b/docs/es/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF a JPG +description: Convierte páginas de PDF a imágenes JPG con calidad ajustable. Los PDF de una página se descargan directamente; los de varias páginas se exportan como ZIP. +--- + +# PDF a JPG + +Convierte cada página de un PDF en una imagen JPG. Los documentos de una sola página se descargan como un archivo `.jpg` independiente. Los PDF de varias páginas generan un archivo ZIP con un JPG por página. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. La herramienta muestra el nombre del archivo, su tamaño y el número de páginas. +2. Ajusta el control deslizante de **Calidad** para controlar la compresión del JPG. +3. Haz clic en **Convertir** para iniciar el procesamiento. +4. El resultado se descarga automáticamente: un único JPG para PDF de una página o un archivo ZIP para documentos de varias páginas. + +## Opciones + +- **Calidad**: un control deslizante de 0% a 100% (por defecto 90%). Los valores altos producen imágenes más nítidas y archivos más grandes. Los valores bajos comprimen de forma más agresiva. + +Las páginas se renderizan internamente a escala 2x, así que la resolución de salida es el doble de las dimensiones de la página del PDF. Una página estándar tamaño carta produce una imagen de aproximadamente 1.224 x 1.584 píxeles. + +## Formato de salida + +- **Una página**: `filename.jpg` +- **Varias páginas**: `filename_jpgs.zip` con `page_1.jpg`, `page_2.jpg`, etc. + +## Casos de uso + +- Generar miniaturas de vista previa para un sistema de gestión documental. +- Compartir una página de un informe en un chat o correo que no admite PDF. +- Crear recursos de imagen a partir de diagramas o ilustraciones en PDF. +- Archivar documentos escaneados como imágenes individuales. + +## Consejos + +- Para una salida sin pérdida, usa [PDF a PNG](./pdf-to-png). +- Un ajuste de calidad de 80-90% logra un buen equilibrio entre tamaño de archivo y fidelidad visual. +- Si necesitas un formato específico por página, considera el [Constructor de flujos de trabajo PDF](./pdf-workflow), que tiene un nodo de salida de PDF a imágenes. + +## Herramientas relacionadas + +- [PDF a PNG](./pdf-to-png) +- [PDF a WebP](./pdf-to-webp) +- [PDF a BMP](./pdf-to-bmp) +- [PDF a TIFF](./pdf-to-tiff) diff --git a/docs/es/tools/pdf-to-json.md b/docs/es/tools/pdf-to-json.md new file mode 100644 index 00000000..bb64d576 --- /dev/null +++ b/docs/es/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF a JSON +description: Convierte archivos PDF a formato JSON estructurado con CPDF. Exporta la estructura interna del PDF como datos JSON legibles por máquina. +--- + +# PDF a JSON + +Convierte uno o más archivos PDF a formato JSON. La herramienta usa CPDF (Coherent PDF) para serializar la estructura interna de cada PDF en una representación JSON legible por máquina. El resultado siempre se entrega como un archivo ZIP. + +## Cómo funciona + +1. Selecciona uno o más archivos PDF con el selector de archivos. +2. Haz clic en **Convertir** para iniciar el procesamiento. La conversión se ejecuta en un web worker en segundo plano. +3. Se descarga un archivo ZIP con un archivo JSON por cada PDF de entrada. + +La barra de estado muestra el progreso de las etapas de conversión y de creación del ZIP. + +## Opciones + +Esta herramienta no tiene opciones configurables. Cada PDF se convierte a su representación JSON completa. + +## Formato de salida + +- Un archivo `pdfs-to-json.zip` con `filename.json` por cada PDF de entrada. + +La salida JSON representa la estructura interna de objetos del PDF, incluidos árboles de páginas, referencias de fuentes, metadatos y flujos de contenido. + +## Casos de uso + +- Inspeccionar la estructura interna de un PDF para depuración o validación. +- Extraer metadatos estructurados y propiedades de página mediante programación. +- Alimentar flujos de procesamiento personalizados con datos de la estructura del PDF. +- Auditar documentos PDF para verificar su cumplimiento analizando sus árboles de objetos. + +## Consejos + +- Esta herramienta devuelve la estructura de objetos del PDF sin procesar, no el texto extraído. Si necesitas el texto de las páginas en formato JSON, usa en su lugar [Preparar PDF para IA](./prepare-pdf-for-ai). +- Para extraer texto sin formato, [PDF a Texto](./pdf-to-text) es más directo. +- Los PDF grandes con estructuras complejas producen archivos JSON muy grandes. + +## Herramientas relacionadas + +- [PDF a Texto](./pdf-to-text) +- [Preparar PDF para IA](./prepare-pdf-for-ai) +- [Extraer Tablas de PDF](./extract-tables) diff --git a/docs/es/tools/pdf-to-markdown.md b/docs/es/tools/pdf-to-markdown.md new file mode 100644 index 00000000..eb5da39c --- /dev/null +++ b/docs/es/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF a Markdown +description: Convierte documentos PDF a formato Markdown con extracción opcional de imágenes. Admite la conversión por lotes de varios archivos. +--- + +# PDF a Markdown + +Convierte archivos PDF a formato Markdown (`.md`) conservando encabezados, párrafos, listas y el formato básico. Opcionalmente extrae e incluye las imágenes incrustadas. Admite conversión individual y por lotes. Funciona con PyMuPDF. + +## Cómo funciona + +1. Sube uno o más PDF haciendo clic en la zona de carga o arrastrando archivos hasta ella. +2. Opcionalmente, activa **Incluir imágenes** para incrustar las imágenes extraídas en la salida Markdown. +3. Haz clic en **Convertir** para iniciar el procesamiento. +4. Un solo archivo se descarga como `filename.md`. Varios archivos generan un `markdown-files.zip`. + +## Opciones + +- **Incluir imágenes**: si está marcada, las imágenes incrustadas del PDF se extraen y se referencian en la salida Markdown. Si no está marcada, solo se convierte el contenido de texto. + +## Formato de salida + +- **Un archivo**: `filename.md` +- **Varios archivos**: `markdown-files.zip` con un `.md` por cada PDF de entrada. + +## Casos de uso + +- Convertir documentación en PDF a Markdown para un generador de sitios estáticos como VitePress, Hugo o Jekyll. +- Convertir artículos de investigación en PDF a Markdown editable para aplicaciones de notas como Obsidian. +- Migrar bases de conocimiento antiguas en PDF a un formato de texto compatible con Git. +- Extraer contenido estructurado de ebooks en PDF para darles otro formato. + +## Consejos + +- La opción Incluir imágenes es útil cuando el PDF contiene diagramas o figuras esenciales para el contenido. Desactívala en documentos con mucho texto para mantener limpia la salida. +- Los diseños complejos con barras laterales, notas al pie o texto en varias columnas pueden producir un Markdown imperfecto. Revisa y ajusta el resultado según haga falta. +- Para texto sin procesar y sin ningún formato, usa en su lugar [PDF a Texto](./pdf-to-text). + +## Herramientas relacionadas + +- [PDF a Texto](./pdf-to-text) +- [PDF a Word](./pdf-to-word) +- [Preparar PDF para IA](./prepare-pdf-for-ai) diff --git a/docs/es/tools/pdf-to-pdfa.md b/docs/es/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..25f20958 --- /dev/null +++ b/docs/es/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF a PDF/A +description: Convierte PDF estándar al formato PDF/A para archivado a largo plazo. Admite los niveles de conformidad PDF/A-1b, PDF/A-2b y PDF/A-3b. +--- + +# PDF a PDF/A + +PDF/A es un subconjunto de PDF normalizado por ISO y pensado para la conservación digital a largo plazo. Esta herramienta convierte tus PDF estándar en documentos conformes con PDF/A usando Ghostscript, que se ejecuta directamente en tu navegador. + +## Cómo funciona + +1. Sube uno o más archivos PDF. +2. Selecciona una **versión de PDF/A** en el menú desplegable. +3. Opcionalmente, activa **Aplanar PDF antes** para archivos complejos que fallan en la conversión normal. +4. Haz clic en **Convertir a PDF/A**. Varios archivos generan un archivo ZIP. + +## Versiones de PDF/A + +| Versión | Restricciones | Ideal para | +| ------------ | -------------------------------------------------- | ------------------------------------------------------ | +| **PDF/A-1b** | La más estricta. Sin transparencias ni capas. | Máxima compatibilidad con sistemas de archivo antiguos | +| **PDF/A-2b** | Permite transparencias y JPEG2000. | Archivado de uso general (recomendada) | +| **PDF/A-3b** | Permite adjuntos incrustados de cualquier formato. | Archivar documentos con archivos de datos de origen | + +PDF/A-2b está seleccionada por defecto y sirve para la gran mayoría de las necesidades de archivado. + +## Opción de aplanado previo + +Algunos PDF contienen características que impiden una conversión limpia a PDF/A: codificaciones de fuente poco comunes, pilas de transparencia complejas o estructuras internas dañadas. Activar **Aplanar PDF antes** rasteriza el PDF a 300 DPI antes de la conversión, lo que garantiza el cumplimiento a costa de que el texto deje de ser seleccionable. Úsala como alternativa cuando la conversión estándar produzca errores. + +El aplanado previo requiere el motor PyMuPDF WASM. + +## Casos de uso + +- Cumplir requisitos de archivo gubernamentales o legales (muchas jurisdicciones exigen PDF/A en los escritos judiciales) +- Enviar documentos a repositorios institucionales o bibliotecas digitales +- Conservar registros empresariales cuando el software original puede no existir dentro de diez años +- Preparar facturas para estándares de facturación electrónica que exigen PDF/A-3b con adjuntos XML + +## Consejos + +- Prueba primero la conversión sin aplanado previo. Actívalo solo si obtienes un error. +- PDF/A incrusta todas las fuentes, por lo que los archivos de salida suelen ser más grandes que los originales. +- Valida el resultado con un validador de PDF/A específico si tu flujo de trabajo exige un cumplimiento estricto. + +## Herramientas relacionadas + +- [Comprimir PDF](./compress-pdf): reduce el tamaño del archivo tras la conversión +- [Aplanar PDF](./flatten-pdf): aplana los formularios antes de convertir a PDF/A +- [Eliminar Metadatos](./remove-metadata): quita los metadatos antes de archivar diff --git a/docs/es/tools/pdf-to-png.md b/docs/es/tools/pdf-to-png.md new file mode 100644 index 00000000..9df93ac1 --- /dev/null +++ b/docs/es/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF a PNG +description: Convierte páginas de PDF a imágenes PNG sin pérdida con escala ajustable. Ideal para capturas de alta calidad y fondos transparentes. +--- + +# PDF a PNG + +Convierte cada página de un PDF en una imagen PNG. PNG usa compresión sin pérdida, por lo que el resultado conserva todos los detalles de la página original. Los PDF de una página se descargan como un archivo `.png`; los de varias páginas generan un ZIP. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Ajusta el control deslizante de **Escala** para controlar la resolución de salida. +3. Haz clic en **Convertir** para iniciar el procesamiento. +4. Un único PNG o un archivo ZIP se descarga automáticamente. + +## Opciones + +- **Escala**: va de 1.0x a 3.0x (por defecto 2.0x). A 2.0x, una página estándar tamaño carta se renderiza a unos 1.224 x 1.584 píxeles. Los valores de escala más altos producen imágenes más grandes y nítidas a costa del tamaño del archivo y del tiempo de procesamiento. + +## Formato de salida + +- **Una página**: `filename.png` +- **Varias páginas**: `filename_pngs.zip` con `page_1.png`, `page_2.png`, etc. + +## Casos de uso + +- Capturar páginas de PDF con alta fidelidad para presentaciones. +- Extraer gráficos o diagramas que necesitan bordes nítidos y sin artefactos de compresión. +- Preparar recursos para diseño web a partir de maquetas en PDF. +- Crear imágenes de página sin pérdida para el preprocesamiento de OCR. + +## Consejos + +- Los archivos PNG son bastante más grandes que los JPG. Si el tamaño del archivo importa más que la calidad perfecta, usa [PDF a JPG](./pdf-to-jpg) o [PDF a WebP](./pdf-to-webp). +- A escala 1.0x, la salida coincide con la resolución nativa del PDF. Sube a 3.0x para exportaciones con calidad de impresión. + +## Herramientas relacionadas + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a WebP](./pdf-to-webp) +- [PDF a SVG](./pdf-to-svg) diff --git a/docs/es/tools/pdf-to-svg.md b/docs/es/tools/pdf-to-svg.md new file mode 100644 index 00000000..800b0e22 --- /dev/null +++ b/docs/es/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF a SVG +description: Convierte páginas de PDF a gráficos vectoriales SVG escalables. Conserva texto y formas como trazados vectoriales para un escalado infinito. +--- + +# PDF a SVG + +Convierte cada página de un PDF en un archivo SVG (Scalable Vector Graphics). A diferencia de los formatos rasterizados, SVG conserva los trazados vectoriales, el texto y las formas, por lo que el resultado se escala a cualquier tamaño sin pixelarse. Funciona con PyMuPDF. + +## Cómo funciona + +1. Sube uno o más PDF haciendo clic en la zona de carga o arrastrando archivos hasta ella. Puedes agregar varios archivos y gestionarlos individualmente. +2. Haz clic en **Convertir** para procesar todos los archivos subidos. +3. Las conversiones de un solo archivo con una sola página se descargan como un `.svg` independiente. El resto se descarga como archivo ZIP. + +## Opciones + +Esta herramienta no tiene opciones configurables. Cada página se convierte a SVG con la exportación vectorial nativa de PyMuPDF. + +## Formato de salida + +- **Un archivo, una página**: `filename.svg` +- **Un archivo, varias páginas**: `filename_svg.zip` con `page_1.svg`, `page_2.svg`, etc. +- **Varios archivos**: `pdf_to_svg.zip` con los archivos organizados por el nombre del documento de origen. + +## Casos de uso + +- Extraer diagramas vectoriales, gráficos o ilustraciones de informes en PDF para usarlos en páginas web. +- Editar el contenido de las páginas de un PDF en un editor vectorial como Inkscape o Illustrator. +- Incrustar vistas previas de página escalables en aplicaciones web adaptables. +- Extraer logotipos o gráficos de folletos en PDF conservando los bordes nítidos. + +## Consejos + +- SVG funciona mejor con PDF que contienen contenido vectorial. Los documentos escaneados o los PDF con muchas imágenes producirán archivos SVG grandes con datos rasterizados incrustados. +- Para una salida rasterizada de PDF con muchas imágenes, usa en su lugar [PDF a PNG](./pdf-to-png) o [PDF a JPG](./pdf-to-jpg). +- Esta herramienta admite la conversión por lotes: sube varios PDF a la vez para convertirlos todos en una sola ejecución. + +## Herramientas relacionadas + +- [PDF a PNG](./pdf-to-png) +- [PDF a JPG](./pdf-to-jpg) +- [PDF a Markdown](./pdf-to-markdown) diff --git a/docs/es/tools/pdf-to-text.md b/docs/es/tools/pdf-to-text.md new file mode 100644 index 00000000..0c46eb98 --- /dev/null +++ b/docs/es/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF a texto +description: Extrae el texto sin formato de archivos PDF. Admite la extracción por lotes de varios PDF con salida en archivos TXT. +--- + +# PDF a texto + +Extrae todo el contenido de texto de archivos PDF y lo guarda como archivos `.txt` de texto sin formato. Admite el procesamiento por lotes: sube varios PDF y extrae el texto de cada uno en una sola operación. Funciona con PyMuPDF. + +## Cómo funciona + +1. Sube uno o más PDF haciendo clic en la zona de carga o arrastrando archivos hasta ella. Gestiona tu lista de archivos con los botones Agregar más y Borrar. +2. Haz clic en **Extraer** para iniciar el procesamiento. +3. Un solo archivo se descarga como `filename.txt`. Varios archivos generan un archivo `pdf-to-text.zip`. + +## Opciones + +Esta herramienta no tiene opciones configurables. Todo el texto se extrae de cada página en orden de lectura. + +## Formato de salida + +- **Un archivo**: `filename.txt` +- **Varios archivos**: `pdf-to-text.zip` con un `.txt` por cada PDF de entrada. + +## Casos de uso + +- Extraer el texto principal de informes en PDF para indexarlo en búsquedas de texto completo. +- Convertir ebooks o artículos en PDF a texto sin formato para leerlos en dispositivos de tinta electrónica. +- Sacar texto de contratos o documentos legales para analizar palabras clave. +- Quitar el formato de los PDF para obtener texto limpio para scripts de procesamiento de datos. +- Preparar un corpus de texto a partir de archivos PDF para procesamiento de lenguaje natural. + +## Consejos + +- Los PDF escaneados (solo imagen) producirán archivos de texto vacíos porque no hay una capa de texto que extraer. Pasa primero los documentos escaneados por OCR. +- La salida conserva el orden de lectura según lo interpreta PyMuPDF, que por lo general sigue de izquierda a derecha y de arriba abajo. Los diseños de varias columnas pueden producir texto entremezclado. +- Para una salida estructurada con encabezados y formato, prueba [PDF a Markdown](./pdf-to-markdown). Para JSON estructurado listo para IA, usa [Preparar PDF para IA](./prepare-pdf-for-ai). + +## Herramientas relacionadas + +- [PDF a Markdown](./pdf-to-markdown) +- [Preparar PDF para IA](./prepare-pdf-for-ai) +- [PDF a Word](./pdf-to-word) diff --git a/docs/es/tools/pdf-to-tiff.md b/docs/es/tools/pdf-to-tiff.md new file mode 100644 index 00000000..81bf4d5d --- /dev/null +++ b/docs/es/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF a TIFF +description: Convierte páginas de PDF a imágenes TIFF, muy usadas en impresión, fax y archivado. Recurre a PNG si falla la codificación. +--- + +# PDF a TIFF + +Convierte cada página de un PDF en una imagen TIFF. TIFF es el formato estándar para producción de impresión, sistemas de fax y archivado de documentos. La herramienta usa compresión PackBits para codificar el TIFF y recurre a PNG si una página no se puede codificar. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Haz clic en **Convertir** para procesar el archivo. +3. Un único archivo TIFF o un archivo ZIP se descarga automáticamente. + +## Opciones + +Esta herramienta no tiene opciones configurables. Las páginas se renderizan a una escala fija de 2x. + +## Formato de salida + +- **Una página**: `filename.tiff` +- **Varias páginas**: `filename_tiffs.zip` con `page_1.tiff`, `page_2.tiff`, etc. + +Si la codificación TIFF falla en una página concreta (por problemas de compresión), esa página se guarda como archivo `.png`. En ese caso, el ZIP contendrá una mezcla de archivos TIFF y PNG. + +## Casos de uso + +- Enviar documentos a organismos públicos o sistemas legales que exigen el formato TIFF. +- Preparar páginas para transmitirlas por fax mediante servicios de fax digital. +- Archivar documentos escaneados en un formato sin pérdida ampliamente compatible. +- Alimentar sistemas empresariales de gestión documental con las páginas. + +## Consejos + +- Los archivos TIFF son grandes. Si solo necesitas calidad sin pérdida para web o pantalla, [PDF a PNG](./pdf-to-png) es una mejor opción. +- Revisa el contenido del ZIP si algunas páginas necesitaron la alternativa PNG: quizá quieras convertirlas por separado. + +## Herramientas relacionadas + +- [PDF a PNG](./pdf-to-png) +- [PDF a BMP](./pdf-to-bmp) +- [PDF a JPG](./pdf-to-jpg) diff --git a/docs/es/tools/pdf-to-webp.md b/docs/es/tools/pdf-to-webp.md new file mode 100644 index 00000000..4d54855e --- /dev/null +++ b/docs/es/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF a WebP +description: Convierte páginas de PDF a imágenes WebP con calidad ajustable. Archivos más pequeños que JPG con una calidad visual comparable. +--- + +# PDF a WebP + +Convierte cada página de un PDF en una imagen WebP. WebP suele producir archivos entre un 25 y un 35% más pequeños que JPG con la misma calidad percibida, lo que lo convierte en una gran opción para la web. + +## Cómo funciona + +1. Sube un PDF haciendo clic en la zona de carga o arrastrando un archivo hasta ella. +2. Ajusta el control deslizante de **Calidad**. +3. Haz clic en **Convertir** para procesar el archivo. +4. Un único archivo `.webp` o un archivo ZIP se descarga automáticamente. + +## Opciones + +- **Calidad**: un control deslizante de 0% a 100% (por defecto 85%). Controla el nivel de compresión con pérdida. Los valores más altos conservan más detalle. + +Las páginas se renderizan internamente a escala 2x, lo que produce imágenes con aproximadamente el doble de las dimensiones nativas del PDF. + +## Formato de salida + +- **Una página**: `filename.webp` +- **Varias páginas**: `filename_webps.zip` con `page_1.webp`, `page_2.webp`, etc. + +## Casos de uso + +- Preparar vistas previas de páginas para sitios web donde el ancho de banda importa. +- Generar versiones de imagen ligeras de volantes o folletos para redes sociales. +- Convertir por lotes documentos de varias páginas en un conjunto de imágenes optimizado para la web. + +## Consejos + +- WebP es compatible con todos los navegadores modernos. Para compatibilidad con sistemas antiguos, recurre a [PDF a JPG](./pdf-to-jpg). +- Una calidad de 80-85% suele ser indistinguible del original en pantalla y mantiene los archivos pequeños. + +## Herramientas relacionadas + +- [PDF a JPG](./pdf-to-jpg) +- [PDF a PNG](./pdf-to-png) +- [PDF a BMP](./pdf-to-bmp) diff --git a/docs/es/tools/pdf-to-word.md b/docs/es/tools/pdf-to-word.md new file mode 100644 index 00000000..4cca53b0 --- /dev/null +++ b/docs/es/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF a Word +description: Convierte archivos PDF a documentos de Word (DOCX) editables. Admite la conversión por lotes de varios PDF a la vez. +--- + +# PDF a Word + +Convierte archivos PDF a documentos de Word (`.docx`) editables. La herramienta usa PyMuPDF para reconstruir el contenido del documento, conservando el texto, el formato básico y el diseño. Admite conversión individual y por lotes. + +## Cómo funciona + +1. Sube uno o más PDF haciendo clic en la zona de carga o arrastrando archivos hasta ella. Puedes agregar más archivos o quitar archivos concretos de la lista. +2. Haz clic en **Convertir** para iniciar el procesamiento. +3. Un solo archivo se descarga como `filename.docx`. Varios archivos se empaquetan en `converted-documents.zip`. + +## Opciones + +Esta herramienta no tiene opciones configurables. Cada PDF se convierte a DOCX con el motor de conversión integrado de PyMuPDF. + +## Formato de salida + +- **Un archivo**: `filename.docx` +- **Varios archivos**: `converted-documents.zip` con un `.docx` por cada PDF de entrada. + +## Casos de uso + +- Editar el texto de un PDF que recibiste y necesitas modificar. +- Convertir informes PDF archivados a un formato que los compañeros puedan editar en Microsoft Word o Google Docs. +- Pasar contenido de contratos o propuestas en PDF a Word para revisarlos con control de cambios. +- Migrar documentación antigua en PDF a un formato editable. + +## Consejos + +- Los diseños complejos con texto en varias columnas, formularios incrustados o muchos gráficos pueden no convertirse a la perfección. Revisa el resultado y ajusta el formato en tu procesador de texto. +- Los PDF escaneados (solo imagen) producirán archivos DOCX vacíos o casi vacíos. Pásalos primero por OCR para agregar una capa de texto. +- El modo por lotes es eficiente para convertir carpetas enteras de PDF: súbelos todos a la vez. + +## Herramientas relacionadas + +- [PDF a Texto](./pdf-to-text) +- [PDF a Markdown](./pdf-to-markdown) +- [Constructor de flujos de trabajo PDF](./pdf-workflow) diff --git a/docs/es/tools/pdf-to-zip.md b/docs/es/tools/pdf-to-zip.md new file mode 100644 index 00000000..ddd9f333 --- /dev/null +++ b/docs/es/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDFs a ZIP +description: Empaqueta varios archivos PDF en un único archivo ZIP para compartirlos y guardarlos fácilmente. +--- + +# PDFs a ZIP + +Agrupa varios archivos PDF en un único archivo ZIP. Es una herramienta de empaquetado sencilla: no convierte, comprime ni modifica los PDF. + +## Cómo funciona + +1. Sube varios archivos PDF con la zona de carga. +2. Revisa la lista de archivos. Quita los que no quieras incluir. +3. Haz clic en el botón de procesar. +4. Un archivo ZIP con todos los PDF subidos se descarga de inmediato. + +## Características + +- Acepta cualquier cantidad de archivos PDF +- Permite quitar archivos individuales antes de crear el archivo comprimido +- Conserva los nombres de archivo originales dentro del ZIP +- No modifica el contenido de los PDF: los archivos se empaquetan tal cual +- Muestra el nombre y el tamaño de cada PDF subido + +## Casos de uso + +- Agrupar un conjunto de facturas o recibos para adjuntarlos a un correo +- Empaquetar entregables de un proyecto (varios informes en PDF) para su entrega +- Crear una única descarga para una colección de formularios o plantillas +- Archivar un lote de documentos en un solo archivo comprimido + +## Consejos + +- El archivo ZIP usa los nombres de archivo originales de los PDF. Si tienes archivos con el mismo nombre, renómbralos antes de subirlos para evitar conflictos. +- Esta herramienta no comprime los PDF en sí. Para reducir el tamaño, pásalos primero por Comprimir PDF y luego empaquétalos con esta herramienta. + +## Herramientas relacionadas + +- [Fusionar PDF](./merge-pdf) +- [Dividir PDF](./split-pdf) +- [Comprimir PDF](./compress-pdf) diff --git a/docs/es/tools/pdf-workflow.md b/docs/es/tools/pdf-workflow.md new file mode 100644 index 00000000..9bab6760 --- /dev/null +++ b/docs/es/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Constructor de flujos de trabajo PDF +description: Crea flujos de procesamiento de PDF personalizados de forma visual conectando nodos en un lienzo. Encadena operaciones como fusionar, comprimir, agregar marca de agua y exportar. +--- + +# Constructor de flujos de trabajo PDF + +El Constructor de flujos de trabajo te permite encadenar varias operaciones de PDF en un único flujo automatizado. En lugar de ejecutar las herramientas una por una, conectas un grafo visual de nodos (entrada, procesamiento, salida) y ejecutas todo con un clic. Tus archivos nunca salen del navegador. + +## Cómo funciona + +La interfaz se divide en tres paneles: una **caja de herramientas de nodos** a la izquierda, el **lienzo** en el centro y un **panel de ajustes** a la derecha que aparece al seleccionar un nodo. + +1. **Agrega nodos** haciendo clic en ellos en la barra lateral izquierda, o arrástralos directamente al lienzo. Usa la barra de búsqueda de la parte superior de la caja de herramientas para filtrar por nombre. +2. **Conecta nodos** arrastrando desde un conector de salida (parte inferior de un nodo) hasta un conector de entrada (parte superior de otro). Las conexiones fluyen de arriba hacia abajo. +3. **Configura los ajustes** haciendo clic en un nodo para abrir su panel de ajustes a la derecha. Cada tipo de nodo tiene sus propias opciones (rangos de páginas, controles de calidad, contraseñas, etc.). +4. **Ejecuta el flujo de trabajo** haciendo clic en el botón **Ejecutar** de la barra de herramientas. El motor ejecuta los nodos en orden topológico, procesando cada uno en secuencia. Una barra de estado en la parte inferior muestra el progreso. +5. **Descarga los resultados**: el nodo final de Descarga guarda el PDF resultante (o un ZIP si se generan varios archivos). + +## Categorías de nodos + +Los nodos se organizan en seis categorías, cada una con un color distinto en el lienzo: + +- **Entrada** (azul): Entrada PDF, Entrada de imagen, Word/Excel/PowerPoint a PDF y más de 15 convertidores de otros formatos que alimentan el flujo con archivos. +- **Editar y anotar** (índigo): Recortar, Escala de grises, Invertir colores, Marca de agua, Números de página, Encabezado y pie de página, Efecto escáner, Ajustar colores, Color de fondo, Eliminar páginas en blanco, Eliminar anotaciones. +- **Organizar y gestionar** (violeta): Fusionar, Dividir, Extraer páginas, Rotar, Eliminar páginas, Invertir, Agregar página en blanco, Dividir páginas, N-Up, Fijar tamaño de página, Combinar en una sola página, Folleto, Posterizar, Editar metadatos, Tabla de contenidos, OCR. +- **Optimizar y reparar** (ámbar): Comprimir, Rasterizar, Linealizar, Enderezar, PDF a PDF/A, Fuente a contorno, Reparar. +- **Proteger PDF** (rosa): Cifrar, Descifrar, Sanear, Aplanar, Firma digital, Censurar. +- **Salida** (verde azulado): Descargar (detecta automáticamente si es un único PDF o un ZIP), PDF a imágenes, PDF a texto, PDF a DOCX, PDF a XLSX, PDF a CSV, PDF a SVG, PDF a Markdown, Extraer imágenes. + +## Guardar y cargar flujos de trabajo + +La barra de herramientas ofrece cuatro opciones de persistencia: + +- **Guardar**: almacena el flujo actual como una plantilla con nombre en el almacenamiento local de tu navegador. Puedes guardar varias plantillas. +- **Cargar**: abre una ventana con todas las plantillas guardadas. Haz clic en Cargar para restaurar una o elimina las plantillas que ya no necesites. +- **Exportar**: descarga el flujo de trabajo como un archivo `.json` para compartirlo o hacer una copia de seguridad. +- **Importar**: carga un archivo de flujo de trabajo `.json` desde el disco y restaura todos los nodos, posiciones y conexiones. + +Las plantillas persisten entre sesiones en el almacenamiento local. Los archivos JSON exportados son portables entre navegadores y equipos. + +## Modelo de ejecución + +El motor construye un grafo de dependencias a partir de tus conexiones y ejecuta los nodos en orden topológico. Si algún nodo falla, la ejecución se detiene y el nodo con el error se marca en rojo. Algunas reglas que conviene recordar: + +- Todo flujo de trabajo necesita al menos un nodo de **Entrada** y uno de **Salida**. +- El motor detecta dependencias circulares y bloquea la ejecución con un error. +- El nodo **Cifrar** debe ser el último paso de procesamiento antes del nodo de salida. Colocarlo antes activará una advertencia de validación, porque los nodos posteriores no pueden operar con datos cifrados. +- Los PDF protegidos con contraseña piden la contraseña durante la ejecución. +- Se admiten entradas de varios PDF: el nodo Fusionar puede combinarlos, o los nodos de procesamiento por lotes procesarán cada PDF de forma individual. + +## Tipos de conectores + +Las conexiones usan conectores tipados para evitar cableados no válidos: + +- **PDF** (índigo): un único documento PDF. +- **MultiPDF** (ámbar): varios documentos PDF agrupados. +- **Image** (verde): un blob de imagen. + +## Opciones + +Cada nodo tiene su propia configuración accesible desde el panel de ajustes de la derecha. Algunos patrones comunes: + +- **Rangos de páginas** en los nodos Dividir, Extraer páginas y Eliminar páginas +- **Controles de calidad** en los nodos de salida de conversión a imagen +- **Campos de contraseña** en los nodos Cifrar y Descifrar +- **Entradas de texto** para Marca de agua, Encabezado y pie de página y Editar metadatos +- **Ángulos de rotación** en el nodo Rotar +- **Nivel de compresión** en el nodo Comprimir +- **Selección de idioma de OCR** en el nodo OCR + +## Casos de uso + +- **Flujo de procesamiento de facturas**: Entrada PDF -> OCR -> Extraer tablas -> Descargar como CSV. +- **Estandarización de informes**: Word a PDF -> Fijar tamaño de página -> Agregar números de página -> Marca de agua -> Comprimir -> Descargar. +- **Preparación para archivado**: Entrada PDF -> Reparar -> Aplanar -> Sanear -> PDF a PDF/A -> Descargar. +- **Extracción de imágenes por lotes**: Entrada PDF (varios archivos) -> Extraer imágenes -> Descargar ZIP. +- **Folletos listos para imprimir**: Entrada PDF -> Folleto -> Recortar -> Comprimir -> Descargar. +- **Distribución segura**: Entrada PDF -> Censurar -> Eliminar anotaciones -> Cifrar -> Descargar. + +## Consejos + +- Usa **Supr** o **Retroceso** para eliminar del lienzo el nodo seleccionado. +- Haz clic en el botón **X** de la barra de estado de un nodo para eliminarlo directamente. +- Desplaza el lienzo haciendo clic y arrastrando en un espacio vacío. El cursor cambia a un icono de mano mientras te desplazas. +- En el móvil, usa el botón **+** de la barra de herramientas para mostrar u ocultar la caja de herramientas de nodos. +- Si tu flujo de trabajo produce varios archivos de salida, el nodo Descargar los agrupa automáticamente en un ZIP. +- Empieza con algo sencillo: crea y prueba un flujo de dos nodos antes de añadir complejidad. + +## Herramientas relacionadas + +- [PDF a Texto](./pdf-to-text) +- [PDF a Excel](./pdf-to-excel) +- [Extraer imágenes](./extract-images) +- [PDF a Markdown](./pdf-to-markdown) diff --git a/docs/es/tools/png-to-pdf.md b/docs/es/tools/png-to-pdf.md new file mode 100644 index 00000000..cd57ff1f --- /dev/null +++ b/docs/es/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG a PDF +description: Convierte una o más imágenes PNG en un documento PDF con calidad ajustable, todo en tu navegador. +--- + +# PNG a PDF + +Convierte imágenes PNG a PDF conservando su resolución completa. Cada PNG se convierte en su propia página, con el tamaño de las dimensiones de la imagen original. La transparencia se gestiona automáticamente. + +## Formatos compatibles + +| Formato | Extensiones | +| :------ | :---------- | +| PNG | `.png` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta archivos PNG. Puedes seleccionar varios a la vez. +2. Gestiona la lista de archivos: quita los que no quieras o agrega más. +3. Elige un nivel de **Calidad del PDF** en el menú desplegable. +4. Haz clic en **Convertir a PDF**. El resultado se descarga como `from_jpgs.pdf`. + +La herramienta usa pdf-lib para incrustar cada imagen directamente. Si un PNG no se puede incrustar de forma nativa (p. ej., por un perfil de color poco común), recurre a volver a renderizarlo en un canvas como JPEG. + +## Opciones + +**Calidad del PDF** controla la compresión que se aplica antes de incrustar: + +- **Alta calidad**: compresión mínima, el tamaño de archivo más grande. +- **Calidad media** (por defecto): buen equilibrio entre tamaño y nitidez. +- **Baja calidad**: compresión máxima, la salida más pequeña. + +## Casos de uso + +- Convertir capturas de pantalla en un PDF de varias páginas para informes de errores o documentación +- Empaquetar exportaciones de diseños de interfaz en un solo archivo para su revisión +- Convertir exportaciones de diagramas (draw.io, Excalidraw) en un PDF para compartir +- Reunir un conjunto de imágenes de gráficos en un informe + +## Consejos + +- Los archivos PNG con transparencia reciben un fondo blanco en el PDF. Si necesitas otro fondo, edita las imágenes de antemano. +- Para capturas de pantalla y diagramas con bordes nítidos y texto, la calidad Alta evita los artefactos de compresión JPEG. Media o Baja pueden convertir internamente a JPEG. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [JPG a PDF](./jpg-to-pdf) +- [SVG a PDF](./svg-to-pdf) diff --git a/docs/es/tools/posterize-pdf.md b/docs/es/tools/posterize-pdf.md new file mode 100644 index 00000000..e4b2cf6e --- /dev/null +++ b/docs/es/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Posterizar PDF +description: Divide las páginas de un PDF en una cuadrícula de páginas más pequeñas para imprimir en gran formato repartido en varias hojas. +--- + +# Posterizar PDF + +Divide cada página de un PDF en una cuadrícula de subpáginas más pequeñas. Es la herramienta para imprimir una sola página repartida en varias hojas de papel, que luego unes para crear un póster o una pancarta grande. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Define el número de **filas** y **columnas** de la cuadrícula (por ejemplo, 2 filas x 2 columnas divide cada página en 4 subpáginas). +3. Opcionalmente, indica un rango de páginas para limitar cuáles se posterizan. +4. El lienzo de vista previa muestra una cuadrícula superpuesta sobre la página actual para que visualices los cortes. +5. Navega entre páginas para comprobar la cuadrícula en distintas páginas. +6. Haz clic en el botón de procesar. Cada celda de la cuadrícula se convierte en su propia página del PDF resultante. + +## Características + +- Número de filas y columnas configurable para cuadrículas flexibles +- Vista previa en vivo con la cuadrícula superpuesta que muestra exactamente dónde se dividirán las páginas +- Filtro de rango de páginas para posterizar solo páginas concretas +- Navegación página por página en la vista previa +- Instantáneas de páginas en caché para navegar rápido por la vista previa +- Las líneas rojas discontinuas de la cuadrícula marcan claramente los límites de corte + +## Opciones + +| Opción | Descripción | +| -------------------- | -------------------------------------------------- | +| **Filas** | Número de divisiones horizontales (por defecto: 1) | +| **Columnas** | Número de divisiones verticales (por defecto: 1) | +| **Rango de páginas** | Qué páginas posterizar (vacío = todas las páginas) | + +## Casos de uso + +- Imprimir un PDF del tamaño de un póster en hojas A4 o Carta estándar para montarlo en una pared +- Crear pancartas grandes a partir de un diseño PDF de una sola página +- Dividir planos técnicos de gran tamaño en teselas imprimibles +- Hacer impresiones de gran formato sin acceso a una impresora de formato ancho + +## Consejos + +- Una cuadrícula de 2x2 convierte una página en 4 páginas. Una de 3x3 convierte una página en 9. Planifica la cuadrícula según el tamaño que quieras para el resultado montado. +- La cuadrícula de la vista previa te ayuda a comprobar que el contenido importante no caiga sobre una línea de corte. Ajusta filas/columnas si hace falta. +- Para la operación inversa (colocar varias páginas en una sola hoja), usa [N-Up PDF](./n-up-pdf). + +## Herramientas relacionadas + +- [N-Up PDF](./n-up-pdf) +- [Dividir páginas](./divide-pages) +- [Dividir PDF](./split-pdf) diff --git a/docs/es/tools/powerpoint-to-pdf.md b/docs/es/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..b206056d --- /dev/null +++ b/docs/es/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint a PDF +description: Convierte presentaciones de PowerPoint (PPT, PPTX) y archivos ODP a PDF conservando el formato de las diapositivas. +--- + +# PowerPoint a PDF + +Convierte archivos de presentación a PDF. Cada diapositiva se convierte en una página del documento resultante, con texto, imágenes, formas y transiciones renderizados mediante un motor LibreOffice que funciona en el navegador. Admite formatos de PowerPoint modernos y antiguos, además del formato OpenDocument Presentation. + +## Formatos compatibles + +| Formato | Extensiones | +| :------------------------ | :---------- | +| PowerPoint (moderno) | `.pptx` | +| PowerPoint (antiguo) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos de presentación. +2. Revisa la lista de archivos. Añade más o quita los que no necesites. +3. Haz clic en **Convertir a PDF**. El motor LibreOffice se carga la primera vez que lo usas y luego convierte cada archivo. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se empaquetan en `powerpoint-converted.zip`. + +## Opciones + +Esta herramienta no tiene ajustes adicionales. Las diapositivas se renderizan con sus dimensiones originales. + +## Resultado + +| Número de archivos | Resultado | +| :----------------- | :------------------------------------------------------------------- | +| 1 archivo | Descarga de un único PDF (nombre original con extensión `.pdf`) | +| 2 o más | Archivo ZIP (`powerpoint-converted.zip`) con un PDF por cada archivo | + +## Casos de uso + +- Convertir una presentación a PDF antes de compartirla con un público que quizá no tenga PowerPoint +- Crear una versión imprimible de un conjunto de diapositivas para una conferencia o un taller +- Archivar presentaciones en un formato que se ve igual en todos los dispositivos +- Convertir por lotes una biblioteca de presentaciones ODP de LibreOffice Impress a PDF +- Generar una versión PDF de una presentación comercial para enviar por correo + +## Consejos + +- Las animaciones y transiciones de las diapositivas no se representan en el PDF. Cada diapositiva se captura como una página estática. +- Los vídeos incrustados no aparecerán en el resultado. Sustitúyelos por una captura de pantalla o una imagen de marcador si lo necesitas. +- Las notas del orador no se incluyen en la exportación a PDF predeterminada. Si necesitas las notas, exporta primero desde la vista nativa "Imprimir notas" de PowerPoint. +- El motor LibreOffice se guarda en caché tras la primera carga, así que convertir una segunda presentación en la misma sesión es mucho más rápido. + +## Herramientas relacionadas + +- [Word a PDF](./word-to-pdf) +- [Excel a PDF](./excel-to-pdf) +- [Imágenes a PDF](./image-to-pdf) diff --git a/docs/es/tools/prepare-pdf-for-ai.md b/docs/es/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..f9c64223 --- /dev/null +++ b/docs/es/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Preparar PDF para IA +description: Extrae el contenido de un PDF en JSON estructurado y optimizado para LLM y flujos de IA como LlamaIndex. Admite procesamiento por lotes. +--- + +# Preparar PDF para IA + +Extrae el contenido de archivos PDF y lo estructura como JSON optimizado para que lo ingieran modelos de lenguaje de gran tamaño (LLM) y frameworks de IA como LlamaIndex. El contenido de cada página se extrae y se organiza en un formato estructurado listo para flujos RAG, chatbots o sistemas de búsqueda semántica. + +## Cómo funciona + +1. Sube uno o más PDF haciendo clic en la zona de carga o arrastrando archivos hasta ella. +2. Haz clic en **Extraer** para iniciar el procesamiento. +3. Un solo archivo se descarga como `filename_llm.json`. Varios archivos generan un archivo `pdf-for-ai.zip`. + +La herramienta usa la integración de PyMuPDF con LlamaIndex para extraer el contenido por página con metadatos, y produce un resultado que se puede cargar directamente en frameworks de IA. + +## Opciones + +Esta herramienta no tiene opciones configurables. Todas las páginas se extraen con el texto completo y los metadatos. + +## Formato de salida + +- **Un solo archivo**: `filename_llm.json` +- **Varios archivos**: `pdf-for-ai.zip` con un `_llm.json` por cada PDF de entrada. + +El JSON resultante sigue el esquema de documentos de LlamaIndex, con el texto de cada página y campos de metadatos. + +## Casos de uso + +- Preparar documentos PDF para flujos de generación aumentada por recuperación (RAG). +- Crear una base de conocimiento consultable a partir de archivos PDF para un chatbot de IA. +- Alimentar informes en PDF a flujos de análisis basados en LLM. +- Preprocesar artículos científicos para sistemas de búsqueda semántica y de preguntas y respuestas. +- Crear datos de entrenamiento estructurados a partir de colecciones de documentos PDF. + +## Consejos + +- Para extraer texto sin formato específico para IA, usa [PDF a texto](./pdf-to-text). +- Para obtener Markdown que conserve los encabezados y la estructura, usa [PDF a Markdown](./pdf-to-markdown). +- Los PDF escaneados producirán un resultado vacío o mínimo. Pásalos antes por OCR para añadir una capa de texto antes de extraer. + +## Herramientas relacionadas + +- [PDF a texto](./pdf-to-text) +- [PDF a Markdown](./pdf-to-markdown) +- [PDF a JSON](./pdf-to-json) diff --git a/docs/es/tools/protect-pdf.md b/docs/es/tools/protect-pdf.md new file mode 100644 index 00000000..0703b710 --- /dev/null +++ b/docs/es/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Proteger PDF +description: Protege archivos PDF con contraseña mediante cifrado AES de 256 bits. Define contraseñas de usuario y de propietario con restricciones de uso configurables. +--- + +# Proteger PDF + +Bloquea tu PDF con una contraseña para que solo las personas autorizadas puedan abrirlo. BentoPDF usa cifrado AES de 256 bits, el mismo estándar que utilizan bancos y agencias gubernamentales, aplicado por completo en tu navegador mediante QPDF. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Introduce una **contraseña de usuario** (obligatoria). Es la contraseña que se necesitará para abrir el archivo. +3. Opcionalmente, introduce una **contraseña de propietario**. Si la defines, el PDF obtiene restricciones de uso que impiden imprimir, editar, copiar y anotar. +4. Haz clic en **Cifrar PDF**. +5. Descarga el archivo cifrado. + +## Tipos de contraseña + +### Contraseña de usuario (obligatoria) + +La contraseña de usuario es la que escriben los destinatarios para abrir el PDF. Sin ella, el documento es completamente inaccesible. Todo PDF cifrado debe tener una. + +### Contraseña de propietario (opcional) + +La contraseña de propietario controla lo que un usuario autorizado puede hacer después de abrir el archivo. Cuando defines una contraseña de propietario distinta, BentoPDF aplica automáticamente el conjunto de restricciones más estricto: + +- Modificación desactivada +- Extracción/copia desactivada +- Impresión desactivada +- Anotación desactivada +- Rellenado de formularios desactivado +- Ensamblaje del documento desactivado + +Si dejas en blanco la contraseña de propietario, el PDF se cifra (sigue necesitando la contraseña de usuario para abrirse), pero no tiene restricciones de uso una vez abierto. + +## Detalles del cifrado + +- **Algoritmo**: AES-256 (Advanced Encryption Standard de 256 bits) +- **Longitud de clave**: 256 bits +- **Estándar**: cifrado PDF 2.0 (implementación de QPDF) + +Con la tecnología actual, romper AES-256 por fuerza bruta es computacionalmente inviable. La seguridad de tu PDF cifrado depende por completo de la fortaleza de tu contraseña. + +## Casos de uso + +- Proteger informes financieros confidenciales antes de enviarlos por correo +- Asegurar documentos legales compartidos con la parte contraria +- Añadir una contraseña a historiales médicos o información de identificación personal +- Distribuir contenido de pago (libros electrónicos, informes) con control de acceso +- Cumplir políticas de protección de datos que exigen cifrado en reposo + +## Consejos + +- Usa una contraseña fuerte y única. Lo ideal es una frase de 12 o más caracteres con mayúsculas, minúsculas, números y símbolos. +- Comparte la contraseña por un canal distinto (teléfono, mensaje de texto), nunca en el mismo correo que el PDF. +- Si solo necesitas restringir acciones (sin imprimir, sin copiar) sin exigir contraseña para abrirlo, usa en su lugar la herramienta Cambiar permisos. + +## Herramientas relacionadas + +- [Descifrar PDF](./unlock-pdf): quita el cifrado cuando conoces la contraseña +- [Cambiar permisos](./change-permissions): modifica restricciones de uso concretas +- [Eliminar restricciones](./remove-restrictions): elimina toda la seguridad de un PDF +- [Sanear PDF](./sanitize-pdf): elimina contenido oculto antes de cifrar diff --git a/docs/es/tools/psd-to-pdf.md b/docs/es/tools/psd-to-pdf.md new file mode 100644 index 00000000..c2dd1f86 --- /dev/null +++ b/docs/es/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD a PDF +description: Convierte archivos de Photoshop (PSD) a PDF en tu navegador. Gratis, privado y sin necesidad de software de Adobe. +--- + +# PSD a PDF + +Convierte archivos PSD de Adobe Photoshop en documentos PDF. PSD es el formato nativo de Photoshop y abrirlo normalmente exige un software caro de Adobe. Esta herramienta renderiza la composición aplanada de tu archivo PSD como una página PDF a resolución completa. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :-------------- | :-------- | :------------------------------------- | +| Adobe Photoshop | `.psd` | Renderiza la imagen compuesta aplanada | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos PSD. Se admiten varios archivos. +2. Revisa la lista de archivos. Quita los que no quieras con el icono de la papelera, o usa **Añadir más archivos** para incluir otros. +3. Haz clic en **Convertir a PDF**. El motor PyMuPDF lee el archivo PSD e incrusta la imagen compuesta en una página PDF a la resolución original. +4. Un solo PSD genera un PDF. Si subes varios archivos PSD, se combinan en un único PDF de varias páginas llamado `psd_to_pdf.pdf`, y cada PSD pasa a ser una página. + +## Opciones + +No se necesita ningún ajuste. El conversor usa los datos de imagen aplanada del archivo PSD. + +## Casos de uso + +- Previsualizar diseños de Photoshop sin abrir Photoshop +- Enviar pruebas de diseño a clientes que no tienen Adobe Creative Suite +- Imprimir obras de alta resolución a partir de archivos PSD +- Crear un portafolio en PDF a partir de varios archivos de diseño PSD: cada uno pasa a ser una página de un único documento + +## Consejos + +- La conversión renderiza la vista compuesta (aplanada) del PSD. Las capas individuales, las capas de ajuste y los efectos de capa no se conservan como elementos separados en el PDF. +- Varios archivos PSD se combinan en un único PDF de varias páginas en lugar de PDF individuales. Es útil para crear portafolios o lookbooks. +- Los archivos PSD de muy alta resolución (archivos de impresión a 300+ DPI) producirán PDF grandes. La herramienta conserva la resolución completa. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [VSD a PDF](./vsd-to-pdf) diff --git a/docs/es/tools/pub-to-pdf.md b/docs/es/tools/pub-to-pdf.md new file mode 100644 index 00000000..ff220061 --- /dev/null +++ b/docs/es/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB a PDF +description: Convierte archivos de Microsoft Publisher (PUB) a PDF en tu navegador. Gratis, privado y sin necesidad de instalar software. +--- + +# PUB a PDF + +Convierte archivos de Microsoft Publisher a PDF. Publisher es una herramienta de autoedición incluida en algunas ediciones de Microsoft Office, pero la mayoría de la gente no la tiene instalada. Esta herramienta permite a cualquiera convertir archivos PUB a PDF directamente en el navegador, sin software de Microsoft. + +## Formatos compatibles + +| Formato | Extensión | Notas | +| :------------------ | :-------- | :------------------------ | +| Microsoft Publisher | `.pub` | Documentos de autoedición | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos PUB. Puedes subir varios archivos a la vez. +2. Revisa la lista de archivos. Quita los que no quieras con el icono de la papelera, o haz clic en **Añadir más archivos** para agregar otros. +3. Haz clic en **Convertir a PDF**. Un motor basado en LibreOffice se carga en el navegador y convierte cada archivo PUB, conservando el diseño, las imágenes y los cuadros de texto. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se entregan en un archivo ZIP llamado `pub-to-pdf.zip`. + +## Opciones + +No se necesita ninguna configuración adicional. El conversor gestiona automáticamente el motor de maquetación de PUB. + +## Casos de uso + +- Abrir un folleto o boletín en PUB de un cliente sin comprar Microsoft Publisher +- Convertir boletines parroquiales, programas de eventos o boletines escolares creados en Publisher +- Archivar material de marketing de Publisher en un formato accesible para todos +- Imprimir archivos PUB en un equipo que no tiene Publisher instalado + +## Consejos + +- Los diseños complejos de Publisher con cuadros de texto en capas y posicionamiento preciso pueden desplazarse ligeramente durante la conversión. Revisa el resultado si la posición exacta es crítica. +- El motor LibreOffice se inicializa una vez por sesión. La primera conversión tarda más; las siguientes son más rápidas. +- Para una conversión lo más fiel posible de los archivos de Publisher, asegúrate de que las fuentes personalizadas del original sean fuentes estándar del sistema. + +## Herramientas relacionadas + +- [VSD a PDF](./vsd-to-pdf) +- [ODP a PDF](./odp-to-pdf) diff --git a/docs/es/tools/rasterize-pdf.md b/docs/es/tools/rasterize-pdf.md new file mode 100644 index 00000000..9f67cd9f --- /dev/null +++ b/docs/es/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasterizar PDF +description: Convierte las páginas de un PDF en un PDF basado en imágenes. Aplana todas las capas, elimina el texto seleccionable y controla los DPI y el formato de imagen. +--- + +# Rasterizar PDF + +La rasterización convierte cada página de un PDF en una imagen y vuelve a ensamblar esas imágenes en un PDF. El resultado se ve idéntico al original, pero no contiene texto seleccionable, elementos interactivos ni capas editables. Es, en la práctica, una fotocopia de alta calidad. + +## Cómo funciona + +1. Sube uno o más archivos PDF. +2. Define los **DPI** (resolución) del resultado rasterizado. +3. Elige un **formato de imagen**: PNG para calidad sin pérdida o JPEG para archivos más pequeños. +4. Opcionalmente, marca **Convertir a escala de grises**. +5. Haz clic en **Rasterizar PDF**. Si son varios archivos, se descargan como ZIP. + +## Opciones + +| Ajuste | Valores | Por defecto | +| --------------------- | ------------------------------------ | ----------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Formato de imagen** | PNG (sin pérdida), JPEG (más ligero) | PNG | +| **Escala de grises** | Sí/No | No | + +## Guía de DPI + +- **72**: solo para ver en pantalla, el menor tamaño de archivo +- **150**: buen equilibrio para uso general +- **200**: texto más nítido, tamaño de archivo moderado +- **300**: resultado con calidad de impresión +- **600**: archivo de alta calidad o impresión profesional + +## Casos de uso + +- Impedir la extracción de texto de documentos confidenciales antes de compartirlos +- Eliminar problemas de dependencia de fuentes convirtiendo el texto en píxeles +- Crear una versión "plana" de un PDF con capas complejas o transparencias que se renderizan distinto según el visor +- Preparar un PDF para un sistema que solo acepta entradas basadas en imágenes +- Eliminar contenido oculto (como cambios registrados o datos de formularios) reduciendo el PDF a imágenes puras + +## Consejos + +- 150 DPI en PNG es un buen valor por defecto. Sube solo si necesitas imprimir o ampliar detalles finos. +- JPEG produce archivos notablemente más pequeños, pero introduce artefactos de compresión en los bordes nítidos del texto. +- La rasterización es irreversible: conserva tu PDF original por si más adelante necesitas texto editable. + +## Herramientas relacionadas + +- [Comprimir PDF](./compress-pdf): reduce el tamaño del PDF rasterizado +- [Enderezar PDF](./deskew-pdf): endereza las páginas antes de rasterizar documentos escaneados +- [Fuente a contorno](./font-to-outline): convierte las fuentes en trazados vectoriales si quieres conservar la escalabilidad +- [Aplanar PDF](./flatten-pdf): aplana formularios sin convertirlos en imágenes diff --git a/docs/es/tools/remove-annotations.md b/docs/es/tools/remove-annotations.md new file mode 100644 index 00000000..6101aa77 --- /dev/null +++ b/docs/es/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Eliminar anotaciones +description: Elimina con un clic todos los comentarios, resaltados, enlaces y otras anotaciones de tu PDF. +--- + +# Eliminar anotaciones + +Limpia tu PDF eliminando todas las anotaciones: comentarios, resaltados, notas adhesivas, marcado de texto, enlaces, sellos y cualquier otro objeto de anotación incrustado en el documento. El contenido subyacente de la página (texto, imágenes, gráficos) no se toca. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. La herramienta detecta el número de páginas del documento y muestra la información del archivo. +3. Haz clic en **Eliminar anotaciones** para procesar. +4. El PDF limpio se descarga automáticamente sin ninguna anotación. + +## Características + +- Elimina todos los tipos de anotación: comentarios, resaltados, subrayados, tachados, notas adhesivas, sellos, enlaces y marcado de formularios +- Actúa sobre todas las páginas del documento +- Conserva todo el contenido que no son anotaciones (texto, imágenes, gráficos vectoriales, campos de formulario) +- Muestra el número de páginas y el tamaño del archivo antes de procesar + +## Casos de uso + +- Limpiar un documento antes de la distribución final tras una ronda de revisión en la que varios revisores añadieron comentarios +- Quitar resaltados y notas adhesivas de una guía de estudio compartida +- Eliminar las anotaciones de enlace de un documento antes de archivarlo +- Preparar una versión "limpia" de un documento legal que se anotó mucho durante la negociación +- Quitar los comentarios de los revisores de un manuscrito antes de enviarlo a imprenta + +## Consejos + +- Esta herramienta elimina las anotaciones a nivel de estructura del PDF, así que el resultado conserva el texto seleccionable y la calidad original, sin rasterización. +- Si solo quieres quitar algunas anotaciones en lugar de todas, usa el [Editor de PDF](./edit-pdf) para borrar anotaciones concretas. +- Las anotaciones de los PDF aplanados (donde las anotaciones se han fusionado con el contenido de la página) no se pueden quitar, porque ya no son objetos independientes. + +## Herramientas relacionadas + +- [Editor de PDF](./edit-pdf) +- [Añadir marca de agua](./add-watermark) +- [Firmar PDF](./sign-pdf) diff --git a/docs/es/tools/remove-blank-pages.md b/docs/es/tools/remove-blank-pages.md new file mode 100644 index 00000000..05678826 --- /dev/null +++ b/docs/es/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Eliminar páginas en blanco +description: Detecta y elimina automáticamente las páginas en blanco o casi en blanco de tu PDF con sensibilidad ajustable. +--- + +# Eliminar páginas en blanco + +Analiza tu PDF en busca de páginas en blanco o casi en blanco y las elimina automáticamente. La herramienta renderiza cada página y analiza el contenido de sus píxeles para determinar si está en blanco, y luego te permite confirmar qué páginas quitar antes de procesar. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Ajusta el control deslizante de **Sensibilidad** para definir lo estricta que es la definición de "en blanco". +3. Haz clic en **Detectar páginas en blanco** para analizar el documento. +4. La herramienta muestra miniaturas de las páginas en blanco detectadas para que las revises. +5. Confirma la selección y descarga el PDF limpio sin las páginas en blanco. + +## Opciones + +- **Sensibilidad**: un control deslizante de 0% a 100% (80% por defecto). Los valores altos son más estrictos y solo marcan páginas completamente o casi blancas. Los valores bajos son más permisivos y detectan páginas con contenido mínimo, como un solo punto o una marca de agua tenue. + +## Características + +- Análisis a nivel de píxel de cada página para detectar contenido en blanco +- Control deslizante de sensibilidad ajustable para afinar la detección +- Vista previa en miniatura de las páginas en blanco detectadas para verificarlas manualmente +- Conserva todas las páginas que no están en blanco exactamente como están +- Gestiona documentos de cualquier tamaño o número de páginas +- Indicador de progreso durante el análisis + +## Casos de uso + +- Limpiar documentos escaneados en los que el escáner capturó los reversos vacíos de originales a una sola cara +- Quitar páginas separadoras de lotes de documentos escaneados en masa +- Eliminar páginas en blanco insertadas por sistemas de gestión documental +- Limpiar PDF exportados desde procesadores de texto que a veces incluyen páginas en blanco al final +- Reducir el tamaño del archivo eliminando páginas vacías innecesarias + +## Consejos + +- Empieza con la sensibilidad por defecto del 80% y ajústala desde ahí. Si la herramienta no detecta páginas que a ti te parecen en blanco, baja la sensibilidad. Si marca páginas con contenido ligero que quieres conservar, súbela. +- La herramienta renderiza cada página para analizar su contenido, así que el tiempo de procesamiento crece con el número de páginas. En documentos muy grandes, espera una breve pausa. +- Revisa las páginas en blanco detectadas en la vista previa de miniaturas antes de confirmar la eliminación. Las páginas con encabezados, pies de página o marcas de agua tenues pueden marcarse según los ajustes de sensibilidad. + +## Herramientas relacionadas + +- [Recortar PDF](./crop-pdf) +- [Editor de PDF](./edit-pdf) +- [Números de página](./page-numbers) diff --git a/docs/es/tools/remove-metadata.md b/docs/es/tools/remove-metadata.md new file mode 100644 index 00000000..c36fc13c --- /dev/null +++ b/docs/es/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Eliminar metadatos +description: Elimina todos los metadatos ocultos de los archivos PDF, incluidos autor, título, fecha de creación, productor, datos XMP e ID de documento. +--- + +# Eliminar metadatos + +Todo PDF lleva metadatos que pueden revelar quién lo creó, qué software se usó, cuándo se modificó por última vez y más. Esta herramienta elimina todo: el diccionario de información, los flujos de metadatos XMP, los ID de documento y los datos específicos de aplicaciones, y deja un documento limpio sin rastro de su origen. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Haz clic en **Eliminar metadatos**. +3. Descarga el archivo limpio. + +No hay opciones que configurar. La herramienta es exhaustiva por diseño: lo borra todo. + +## Qué se elimina + +- **Campos del diccionario de información**: título, autor, asunto, palabras clave, creador, productor, fecha de creación, fecha de modificación +- **Flujo de metadatos XMP**: el bloque de metadatos basado en XML almacenado en el catálogo del documento +- **ID de documento**: identificadores únicos en el trailer del PDF que sirven para rastrear un documento entre sistemas +- **PieceInfo**: metadatos específicos de aplicaciones añadidos por programas como Illustrator o InDesign + +## Qué se conserva + +- Todo el contenido visible de las páginas (texto, imágenes, gráficos) +- Campos de formulario y anotaciones +- Marcadores y enlaces +- La estructura del documento en sí + +## Casos de uso + +- Quitar tu nombre y organización de un documento antes de publicarlo de forma anónima +- Eliminar marcas de tiempo de creación que revelan cuándo se preparó un documento +- Limpiar las cadenas de productor que identifican tu software PDF +- Preparar documentos para envíos regulatorios que exigen PDF sin metadatos +- Eliminar rastros del historial de edición antes de compartir un documento externamente + +## Consejos + +- Usa primero la herramienta Ver metadatos para comprobar exactamente qué metadatos contiene tu PDF antes de eliminarlos. +- Si necesitas eliminar metadatos _y_ JavaScript, anotaciones y archivos incrustados, usa Sanear PDF para una limpieza más a fondo. +- La eliminación de metadatos es permanente. Conserva el original por si más adelante necesitas esos datos. + +## Herramientas relacionadas + +- [Sanear PDF](./sanitize-pdf): elimina metadatos, además de scripts, adjuntos y más +- [Cifrar PDF](./protect-pdf): protege con contraseña el PDF limpio +- [Comprimir PDF](./compress-pdf): eliminar metadatos puede reducir ligeramente el tamaño del archivo; comprime para ahorrar más diff --git a/docs/es/tools/remove-restrictions.md b/docs/es/tools/remove-restrictions.md new file mode 100644 index 00000000..a55ade95 --- /dev/null +++ b/docs/es/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Eliminar restricciones +description: Elimina la protección con contraseña, las restricciones de impresión, los bloqueos de edición y los límites de copia de los archivos PDF. +--- + +# Eliminar restricciones + +Los PDF pueden llevar dos tipos de contraseña: una contraseña de usuario (necesaria para abrir el archivo) y una contraseña de propietario (controla lo que puedes hacer con él). Esta herramienta elimina ambas, junto con todas las restricciones asociadas: bloqueos de impresión, edición, copia y anotación. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Si el PDF tiene una contraseña de propietario, introdúcela en el campo **Contraseña de propietario**. Déjalo en blanco si el PDF solo tiene restricciones de uso sin contraseña. +3. Haz clic en **Eliminar restricciones**. +4. Descarga el PDF sin restricciones. + +La herramienta usa las opciones `--decrypt` y `--remove-restrictions` de QPDF para producir una copia limpia y sin restricciones. + +## Qué se elimina + +- La protección con contraseña (tanto la de usuario como la de propietario) +- Las restricciones de impresión +- Las restricciones de edición +- Las restricciones de copia de texto e imágenes +- Las restricciones de anotación y comentarios +- Cualquier otra limitación de seguridad codificada en el PDF + +## Casos de uso + +- Desbloquear un PDF que es tuyo pero cuya contraseña definiste hace años +- Quitar las restricciones de impresión de un documento al que tienes acceso legítimo +- Habilitar copiar y pegar en material de referencia para tomar notas +- Preparar PDF para herramientas de accesibilidad que no pueden manejar documentos restringidos + +## Consejos + +- Debes conocer la contraseña de propietario si hay una. Esta herramienta no descifra ni fuerza contraseñas. +- Si necesitas mantener el archivo cifrado pero cambiar permisos concretos, usa en su lugar la herramienta Cambiar permisos. +- El archivo resultante no tiene ningún cifrado: cualquiera que lo reciba podrá abrirlo libremente. + +## Herramientas relacionadas + +- [Descifrar PDF](./unlock-pdf): desbloquea un PDF cuando conoces la contraseña de usuario +- [Cifrar PDF](./protect-pdf): vuelve a aplicar el cifrado con nuevos ajustes +- [Cambiar permisos](./change-permissions): modifica de forma selectiva qué acciones se permiten diff --git a/docs/es/tools/repair-pdf.md b/docs/es/tools/repair-pdf.md new file mode 100644 index 00000000..36ae75aa --- /dev/null +++ b/docs/es/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Reparar PDF +description: Recupera datos de archivos PDF corruptos o dañados con el motor de reparación de QPDF. Admite procesamiento por lotes. +--- + +# Reparar PDF + +Cuando un PDF no se abre, muestra contenido ilegible o provoca errores en tu visor, esta herramienta intenta reconstruir su estructura interna. Usa el motor de reparación de QPDF, que puede recuperar datos de muchos tipos de corrupción: tablas de referencias cruzadas rotas, flujos truncados, referencias de objetos no válidas y más. + +## Cómo funciona + +1. Sube uno o más archivos PDF dañados. +2. Haz clic en **Reparar PDF**. +3. Un solo archivo reparado se descarga directamente. Varios archivos generan un archivo ZIP. + +La herramienta pasa cada archivo por QPDF con la opción `--decrypt`, que obliga a QPDF a leer y reescribir toda la estructura del PDF, corrigiendo por el camino los problemas recuperables. + +## Características + +- Reparación por lotes de varios PDF en una sola operación +- Detección automática de archivos recuperables y no recuperables +- Informe de éxito o fallo por archivo al procesar varios archivos +- Usa QPDF (WebAssembly), una biblioteca de transformación de PDF probada a fondo + +## Qué puede arreglar + +- Tablas de referencias cruzadas rotas o ausentes +- Finales de archivo truncados por descargas incompletas +- Numeración de objetos y longitudes de flujo no válidas +- Inconsistencias estructurales menores de generadores de PDF defectuosos +- Restos de cifrado de intentos de descifrado fallidos + +## Qué no puede arreglar + +- Archivos muy truncados en los que falta la mayor parte de los datos de contenido +- PDF cifrados con una contraseña que no tienes +- Archivos que en realidad no son PDF (extensión de archivo incorrecta) +- Corrupción de imágenes dentro del PDF (se arregla la estructura, pero los datos de píxeles no se regeneran) + +## Casos de uso + +- Recuperar un PDF de una descarga fallida por correo +- Abrir archivos producidos por generadores de PDF antiguos o no estándar +- Arreglar PDF que funcionan en un visor pero no en otro +- Preparar documentos de archivo dañados para su almacenamiento a largo plazo + +## Consejos + +- Si la reparación falla, prueba a abrir el archivo primero en un navegador: los navegadores tienen su propia lógica de recuperación y pueden renderizar suficiente contenido para volver a guardarlo. +- Para PDF cifrados que fallan al repararse, prueba primero Descifrar PDF y después repara el resultado descifrado. + +## Herramientas relacionadas + +- [Comprimir PDF](./compress-pdf): limpia aún más la estructura del PDF reparado +- [Linealizar PDF](./linearize-pdf): optimiza el archivo reparado para su entrega web +- [Aplanar PDF](./flatten-pdf): aplana formularios que puedan haberse dañado diff --git a/docs/es/tools/reverse-pages.md b/docs/es/tools/reverse-pages.md new file mode 100644 index 00000000..7f20ade7 --- /dev/null +++ b/docs/es/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Invertir páginas +description: Invierte el orden de las páginas de uno o más archivos PDF para que la última página pase a ser la primera. +--- + +# Invertir páginas + +Invierte el orden de las páginas de un PDF para que la última página pase a ser la primera, la penúltima la segunda, y así sucesivamente. Admite el procesamiento por lotes de varios archivos a la vez. + +## Cómo funciona + +1. Sube uno o más archivos PDF. +2. Haz clic en el botón de procesar. +3. Cada archivo se invierte de forma independiente. Si subiste varios archivos, el resultado es un archivo ZIP con todos los PDF invertidos. +4. Un solo archivo se descarga directamente como PDF invertido. + +## Características + +- Procesamiento por lotes: invierte varios PDF en una sola operación +- Salida de un solo archivo para un PDF, ZIP para varios +- Botones para quitar cada archivo antes de procesar +- Conserva todo el contenido y el formato de las páginas + +## Casos de uso + +- Arreglar un documento que se escaneó en orden inverso +- Preparar un PDF de presentación para leerlo de atrás hacia delante +- Invertir el orden de las páginas para flujos de impresión que alimentan las páginas al revés +- Corregir un documento cuyas páginas se ensamblaron por error al revés + +## Consejos + +- Cada archivo de un lote se invierte de forma independiente: los archivos en sí no se reordenan entre ellos. +- Para reordenar páginas con más control (no solo una inversión completa), usa [Duplicar y organizar](./organize-pdf). + +## Herramientas relacionadas + +- [Duplicar y organizar](./organize-pdf) +- [Rotar PDF](./rotate-pdf) +- [Multiherramienta PDF](./pdf-multi-tool) diff --git a/docs/es/tools/rotate-custom.md b/docs/es/tools/rotate-custom.md new file mode 100644 index 00000000..5c4f4302 --- /dev/null +++ b/docs/es/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Rotar por grados personalizados +description: Rota las páginas de un PDF en cualquier ángulo con campos de grados por página y controles de rotación por lotes. +--- + +# Rotar por grados personalizados + +Rota las páginas de un PDF en cualquier ángulo, no solo en incrementos de 90 grados. Cada página tiene su propio campo de ángulo y puedes aplicar un único ángulo a todas las páginas a la vez con el control por lotes. + +## Cómo funciona + +1. Sube un archivo PDF. Se generan miniaturas de todas las páginas. +2. Cada página tiene un campo numérico que muestra su ángulo de rotación actual. +3. Escribe cualquier valor en grados (positivo o negativo) para rotar una página concreta, o usa los botones izquierda/derecha de cada página para ajustes rápidos de 90 grados. +4. Usa el campo de **ángulo por lotes** de la parte superior para definir una rotación uniforme en todas las páginas. +5. Haz clic en el botón de procesar para generar el PDF rotado. + +## Características + +- Campo de grados libre por página (cualquier valor entero) +- Control de ángulo por lotes para aplicar la misma rotación a todas las páginas +- Vista previa en tiempo real de la rotación en las miniaturas +- Botones de rotación rápida por página en incrementos de 90 grados +- Miniaturas de carga diferida para mantener el rendimiento en documentos grandes + +## Casos de uso + +- Corregir escaneos ligeramente inclinados unos pocos grados +- Rotar páginas para cumplir un requisito de orientación no estándar +- Aplicar rotaciones precisas a páginas individuales en un documento de contenido mixto +- Afinar los ángulos de las páginas tras una rotación masiva inicial + +## Consejos + +- Los valores positivos rotan en sentido horario y los negativos en sentido antihorario. +- El campo de ángulo por lotes sobrescribe todos los ángulos por página al aplicarse. Haz los ajustes individuales después de la operación por lotes si hace falta. +- Para rotaciones estándar de 90/180/270 grados con una interfaz más sencilla, usa [Rotar PDF](./rotate-pdf). + +## Herramientas relacionadas + +- [Rotar PDF](./rotate-pdf) +- [Multiherramienta PDF](./pdf-multi-tool) +- [Duplicar y organizar](./organize-pdf) diff --git a/docs/es/tools/rotate-pdf.md b/docs/es/tools/rotate-pdf.md new file mode 100644 index 00000000..6c74e937 --- /dev/null +++ b/docs/es/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Rotar PDF +description: Rota páginas individuales o todas las páginas de un PDF en incrementos de 90 grados con una interfaz visual de miniaturas. +--- + +# Rotar PDF + +Rota las páginas de un PDF 90 grados en sentido horario o antihorario. La herramienta muestra miniaturas de todas las páginas y te permite rotarlas individualmente o aplicar una rotación masiva a todo el documento. + +## Cómo funciona + +1. Sube un archivo PDF. Las miniaturas de todas las páginas se muestran en una cuadrícula. +2. Usa los botones de rotación izquierda/derecha bajo la miniatura de cada página para rotar esa página concreta. +3. Usa los controles de rotación masiva de la parte superior para rotar todas las páginas a la vez. +4. La vista previa de miniaturas se actualiza en tiempo real para mostrar la rotación. +5. Haz clic en el botón de procesar para guardar el PDF rotado. + +## Características + +- Rotación por página en incrementos de 90 grados (izquierda o derecha) +- Rotación masiva de todas las páginas a la vez +- Vista previa de miniaturas en tiempo real con transiciones de rotación animadas +- Miniaturas de carga diferida para un rendimiento fluido en documentos grandes +- Conserva el contenido y la calidad originales de las páginas + +## Casos de uso + +- Arreglar páginas escaneadas de lado o boca abajo +- Rotar páginas apaisadas a orientación vertical (o viceversa) +- Corregir un documento de orientación mixta en el que algunas páginas se escanearon con el ángulo equivocado +- Preparar un documento para una orientación de pantalla concreta + +## Consejos + +- Las rotaciones son acumulativas. Hacer clic dos veces en el botón de sentido horario aplica una rotación de 180 grados. +- Para rotaciones que no sean de 90 grados (por ejemplo, 45 grados para corregir un escaneo ligeramente inclinado), usa en su lugar [Rotar por grados personalizados](./rotate-custom). +- Los controles de rotación masiva afectan a todas las páginas, no solo a las seleccionadas. Esta herramienta no tiene mecanismo de selección: para eso, usa [Multiherramienta PDF](./pdf-multi-tool). + +## Herramientas relacionadas + +- [Rotar por grados personalizados](./rotate-custom) +- [Multiherramienta PDF](./pdf-multi-tool) +- [Duplicar y organizar](./organize-pdf) diff --git a/docs/es/tools/rtf-to-pdf.md b/docs/es/tools/rtf-to-pdf.md new file mode 100644 index 00000000..5d773903 --- /dev/null +++ b/docs/es/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF a PDF +description: Convierte archivos Rich Text Format (RTF) a PDF en tu navegador con un motor basado en LibreOffice. +--- + +# RTF a PDF + +Convierte documentos Rich Text Format a PDF. RTF es un formato de documento multiplataforma compatible con prácticamente todos los procesadores de texto. Esta herramienta usa un motor LibreOffice en el navegador para renderizar los archivos RTF con su formato intacto: negrita, cursiva, tablas e imágenes incrustadas pasan al PDF. + +## Formatos compatibles + +| Formato | Extensiones | Tipos MIME | +| :------ | :---------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta uno o más archivos RTF. +2. Revisa la lista de archivos. Añade más o quita los que no necesites. +3. Haz clic en **Convertir a PDF**. El motor LibreOffice se inicializa la primera vez que lo usas y luego procesa cada archivo. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se entregan como `rtf-converted.zip`. + +## Opciones + +Esta herramienta no tiene ajustes adicionales. La conversión conserva el formato RTF original. + +## Resultado + +| Número de archivos | Resultado | +| :----------------- | :------------------------------------------------------------ | +| 1 archivo | Descarga de un único PDF (por ejemplo, `letter.pdf`) | +| 2 o más | Archivo ZIP (`rtf-converted.zip`) con un PDF por cada archivo | + +## Casos de uso + +- Convertir documentos RTF antiguos de procesadores de texto veteranos a PDF modernos +- Convertir plantillas de correo en RTF en vistas previas en PDF +- Procesar la salida RTF de sistemas de software jurídico o médico +- Convertir por lotes archivos RTF de un sistema de gestión documental a PDF para archivarlos + +## Consejos + +- El motor LibreOffice se carga una vez y se guarda en caché. La primera conversión de una sesión tarda unos segundos más; las siguientes son más rápidas. +- Los archivos RTF con objetos OLE incrustados pueden no renderizar todos los objetos a la perfección. El texto sin formato, las imágenes y el formato estándar se convierten de forma fiable. +- Si tus archivos RTF se crearon con Microsoft Word, también puedes convertirlos directamente con la herramienta [Word a PDF](./word-to-pdf), que acepta RTF además de DOC y DOCX. + +## Herramientas relacionadas + +- [Word a PDF](./word-to-pdf) +- [ODT a PDF](./odt-to-pdf) +- [Texto a PDF](./txt-to-pdf) diff --git a/docs/es/tools/sanitize-pdf.md b/docs/es/tools/sanitize-pdf.md new file mode 100644 index 00000000..d7538114 --- /dev/null +++ b/docs/es/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Sanear PDF +description: Elimina el contenido oculto y potencialmente peligroso de los PDF, incluidos metadatos, JavaScript, archivos incrustados, anotaciones y capas. +--- + +# Sanear PDF + +Los PDF pueden llevar mucho más de lo que ves en pantalla. Metadatos ocultos, JavaScript incrustado, archivos adjuntos, datos de formularios e información de capas pueden filtrar datos sensibles o suponer riesgos de seguridad. Sanear elimina todo eso y te deja un documento limpio, seguro para compartir públicamente. + +## Cómo funciona + +1. Sube un archivo PDF. +2. Selecciona en la lista qué elementos quieres eliminar. +3. Haz clic en **Sanear PDF**. +4. Descarga el archivo limpio. + +## Opciones de saneamiento + +Todas las opciones están activadas por defecto. Desmarca las que quieras conservar. + +| Opción | Qué elimina | +| --------------------------------- | ----------------------------------------------------------------------------- | +| **Aplanar formularios** | Convierte los campos de formulario interactivos en contenido estático | +| **Eliminar metadatos** | Quita autor, título, fecha de creación, información de software y datos XMP | +| **Eliminar anotaciones** | Borra comentarios, resaltados, notas adhesivas y marcado | +| **Eliminar JavaScript** | Elimina scripts incrustados que podrían ejecutarse al abrir | +| **Eliminar archivos incrustados** | Quita los archivos adjuntos incrustados en el PDF | +| **Eliminar capas (OCG)** | Aplana los grupos de contenido opcional en una sola capa | +| **Eliminar enlaces** | Quita hipervínculos y referencias a URL | +| **Eliminar árbol de estructura** | Elimina la estructura del documento usada para el etiquetado de accesibilidad | +| **Eliminar MarkInfo** | Quita la información de contenido marcado | +| **Eliminar fuentes** | Elimina los datos de fuentes incrustadas (úsalo con precaución) | + +## Casos de uso + +- Preparar un PDF para su publicación quitando metadatos internos (nombres de autores, versiones de software, historial de edición) +- Eliminar JavaScript de un PDF recibido de una fuente no confiable antes de abrirlo +- Limpiar un PDF antes de enviarlo a un cliente que no debe ver comentarios incrustados ni nombres de campos de formulario +- Quitar capas ocultas de un plano de arquitectura antes de compartir la versión final +- Cumplir los requisitos de minimización de datos de las normativas de privacidad + +## Consejos + +- Deja "Eliminar fuentes" sin marcar a menos que estés seguro de que el PDF se seguirá mostrando correctamente. Quitar las fuentes puede hacer invisible el texto en algunos visores. +- Si solo necesitas quitar los metadatos, la herramienta específica Eliminar metadatos es más rápida y más concreta. +- El saneamiento es irreversible. Conserva tu archivo original. + +## Herramientas relacionadas + +- [Eliminar metadatos](./remove-metadata): quita solo los metadatos sin tocar el resto del contenido +- [Aplanar PDF](./flatten-pdf): aplana específicamente formularios y anotaciones +- [Cifrar PDF](./protect-pdf): añade protección con contraseña después de sanear +- [Rasterizar PDF](./rasterize-pdf): la opción drástica: convierte a imágenes para eliminar todo el contenido oculto diff --git a/docs/es/tools/scanner-effect.md b/docs/es/tools/scanner-effect.md new file mode 100644 index 00000000..e31d9f59 --- /dev/null +++ b/docs/es/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Efecto escáner +description: Haz que tu PDF parezca un documento escaneado con ruido, rotación, desenfoque y envejecimiento del papel ajustables. +--- + +# Efecto escáner + +Transforma un PDF digital limpio en algo que parezca salido de un escáner de cama plana. La herramienta aplica ruido configurable, una ligera rotación, desenfoque, cambios de brillo y un amarilleado opcional para simular las imperfecciones de un escaneo físico. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. El editor se abre con una vista previa en vivo de la primera página junto a un panel de ajustes. +3. Ajusta los parámetros del efecto de escaneo con los controles deslizantes y los interruptores. +4. La vista previa se actualiza en tiempo real al cambiar los ajustes. +5. Haz clic en **Aplicar** para procesar todas las páginas y descargar el resultado. + +## Opciones + +- **Espacio de color (interruptor de escala de grises)**: convierte el resultado a escala de grises para un aspecto clásico de escaneo en blanco y negro. +- **Borde**: añade un borde oscuro sutil alrededor de los bordes de la página para imitar los artefactos de borde del escáner. +- **Rotación**: aplica una ligera rotación (de -5 a +5 grados) para simular una alimentación desalineada del papel. +- **Variación de rotación**: añade una variación aleatoria al ángulo de rotación para que cada página se incline de forma ligeramente distinta. +- **Brillo**: sube o baja el brillo general. +- **Contraste**: ajusta el contraste para simular variaciones en la calidad del tóner. +- **Desenfoque**: aplica un desenfoque gaussiano para suavizar los bordes del texto como en un escaneo de baja calidad. +- **Ruido**: añade ruido aleatorio de píxeles para simular el grano del sensor del escáner. Los valores altos producen resultados más granulados. +- **Amarilleado**: añade un tinte amarillo cálido para simular papel envejecido o reciclado. +- **Resolución**: define los DPI del resultado. Los valores bajos crean una apariencia más pixelada, propia de un escaneo. +- **Restablecer**: devuelve todos los ajustes a sus valores por defecto. + +## Características + +- Vista previa en tiempo real que se actualiza al modificar cada parámetro +- Variación aleatoria de rotación por página para una variación realista +- Diez parámetros ajustables de forma independiente +- Modo de escala de grises para un resultado auténtico de escaneo en blanco y negro +- Control de resolución, desde calidad de fax de pocos DPI hasta calidad de archivo de muchos DPI + +## Casos de uso + +- Hacer que documentos creados digitalmente parezcan escaneados e impresos +- Simular el envejecimiento físico de documentos para recrear documentos históricos +- Probar software de OCR con escaneos de calidad degradada +- Producir documentos que coincidan con el estilo visual de archivos escaneados existentes + +## Consejos + +- Empieza con valores sutiles. Un nivel de ruido de 10-20, una ligera rotación de 0,5 grados y un desenfoque mínimo ya producen un aspecto de escaneo convincente. +- Combina el modo de escala de grises con un ligero amarilleado para lograr un efecto de "fotocopia de una fotocopia". +- Los ajustes de resolución más bajos (100-150 DPI) crean la apariencia más realista de máquina de fax. + +## Herramientas relacionadas + +- [Invertir colores](./invert-colors) +- [Ajustar colores](./adjust-colors) +- [Color de fondo](./background-color) diff --git a/docs/es/tools/sign-pdf.md b/docs/es/tools/sign-pdf.md new file mode 100644 index 00000000..e6d34799 --- /dev/null +++ b/docs/es/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Firmar PDF +description: Dibuja, escribe o sube una firma y colócala en las páginas de tu PDF con un visor integrado. +--- + +# Firmar PDF + +Añade tu firma a cualquier documento PDF. La herramienta incorpora un visor de PDF completo con herramientas de firma integradas, donde puedes dibujar una firma a mano alzada, escribir tu nombre con una fuente de firma o subir una imagen de firma. Coloca y redimensiona las firmas en cualquier página y luego guarda el documento firmado. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. El documento se abre en un visor de PDF integrado con herramientas de anotación. +3. Usa la herramienta de firma del visor para crear tu firma dibujando, escribiendo o subiendo una imagen. +4. Haz clic en la página donde quieras colocar la firma y ajusta su tamaño y posición. +5. Opcionalmente, marca **Aplanar PDF** para incrustar la firma de forma permanente en el documento. +6. Haz clic en **Guardar y descargar PDF firmado** para obtener tu archivo firmado. + +## Opciones + +- **Aplanar PDF**: si está marcado, la firma se incrusta de forma permanente en el contenido de la página. Esto impide que otras personas la muevan o la borren. Si no está marcado, la firma sigue siendo una anotación que se puede editar en visores compatibles. + +## Características + +- Tres métodos para crear la firma: dibujo a mano alzada, texto escrito o imagen subida +- Visor de PDF integrado para colocarla con precisión +- Arrastra para colocar y redimensionar firmas en cualquier página +- Aplanado opcional para incrustar las firmas de forma permanente +- Compatible con varias firmas en el mismo documento + +## Casos de uso + +- Firmar contratos, acuerdos o formularios de aprobación antes de devolverlos +- Añadir tu firma a documentos fiscales, reclamaciones de seguros o formularios oficiales +- Colocar tus iniciales en páginas individuales de un acuerdo de varias páginas +- Firmar acuerdos de confidencialidad o documentos de recursos humanos que llegan como adjuntos PDF + +## Consejos + +- Activa el aplanado si vas a enviar el PDF firmado a alguien que no deba poder quitar ni reposicionar tu firma. +- Para firmas digitales con validez legal y verificación basada en certificados, BentoPDF también ofrece una herramienta independiente de Firma digital. +- Sube una imagen de firma en PNG con fondo transparente para obtener el resultado más limpio. + +## Herramientas relacionadas + +- [Editor de PDF](./edit-pdf) +- [Añadir sellos](./add-stamps) +- [Rellenar formularios](./form-filler) diff --git a/docs/es/tools/split-pdf.md b/docs/es/tools/split-pdf.md new file mode 100644 index 00000000..ac57ed48 --- /dev/null +++ b/docs/es/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Dividir PDF +description: Divide un PDF en archivos más pequeños por rango de páginas, selección visual, marcadores, páginas pares/impares o intervalos fijos. +--- + +# Dividir PDF + +Divide un PDF en documentos más pequeños con uno de seis modos de división. Desde simples rangos de páginas hasta la división por marcadores, esta herramienta cubre todos los escenarios para dividir un documento. + +## Cómo funciona + +1. Sube un único archivo PDF. +2. Elige un modo de división en el menú desplegable. +3. Configura las opciones propias del modo (rangos de páginas, selecciones, etc.). +4. Haz clic en el botón de procesar. +5. El resultado se descarga como un único PDF o como un archivo ZIP, según el modo y los ajustes. + +## Modos de división + +| Modo | Descripción | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **Rango** | Introduce rangos de páginas como `1-3, 5, 8-10`. Varios rangos producen PDF separados en un ZIP. Un solo rango produce un PDF. | +| **Selección visual** | Navega por las miniaturas de las páginas y haz clic para seleccionar las que quieras. Las páginas seleccionadas se extraen a un nuevo PDF. | +| **Pares / impares** | Extrae solo las páginas de numeración par o impar. | +| **Todas las páginas** | Divide cada página en su propio archivo PDF individual, descargado como ZIP. | +| **Marcadores** | Divide en los límites de los marcadores. Elige el nivel de marcador para controlar dónde se hacen las divisiones. | +| **Cada N páginas** | Divide en bloques de N páginas cada uno (por ejemplo, cada 5 páginas). El último bloque puede tener menos páginas. | + +## Características + +- Seis modos de división distintos que cubren prácticamente todos los casos de uso +- Selector visual de páginas con miniaturas de carga diferida +- División por marcadores con filtrado por nivel +- Opción de salida en ZIP para los modos de rango y selección visual +- Admite rangos de páginas con sintaxis mixta (`1-3, 5, 8-10`) +- Aviso cuando las divisiones de N páginas producen bloques desiguales + +## Casos de uso + +- Extraer un capítulo o una sección concreta de un documento grande +- Separar páginas pares e impares para flujos de impresión a doble cara +- Dividir el PDF de un libro en archivos de capítulos individuales en los límites de los marcadores +- Aislar páginas concretas (como la página de firma) de un contrato +- Dividir un informe compilado en archivos por sección para distribuirlos + +## Consejos + +- Varios rangos de páginas separados por comas (por ejemplo, `1-5, 10-15, 20-25`) producen PDF separados, uno por rango, agrupados en un ZIP. +- El modo de división por marcadores requiere que el PDF contenga marcadores. Si no se encuentra ninguno, verás un mensaje de error. +- La casilla "Descargar como ZIP" de los modos Rango y Selección visual te permite obtener PDF individuales por página en lugar de un archivo combinado. + +## Herramientas relacionadas + +- [Fusionar PDF](./merge-pdf) +- [Extraer páginas](./extract-pages) +- [Eliminar páginas](./delete-pages) +- [Multiherramienta PDF](./pdf-multi-tool) diff --git a/docs/es/tools/svg-to-pdf.md b/docs/es/tools/svg-to-pdf.md new file mode 100644 index 00000000..c0af973f --- /dev/null +++ b/docs/es/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG a PDF +description: Convierte gráficos vectoriales SVG a PDF con control de calidad, íntegramente en tu navegador. +--- + +# SVG a PDF + +Convierte archivos Scalable Vector Graphics (SVG) a PDF. La herramienta rasteriza cada SVG con el motor de renderizado del navegador y luego incrusta el resultado a su resolución original. Es útil para convertir iconos vectoriales, diagramas e ilustraciones en documentos portátiles. + +## Formatos compatibles + +| Formato | Extensiones | +| :------ | :---------- | +| SVG | `.svg` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta uno o más archivos SVG. +2. Revisa y gestiona la lista de archivos. +3. Elige un nivel de **calidad del PDF**. +4. Haz clic en **Convertir a PDF**. El resultado se descarga como `from_svgs.pdf`. + +Cada SVG se lee como texto, se renderiza en un lienzo con su ancho y alto intrínsecos (800x600 por defecto si no se especifican dimensiones) y se exporta como PNG. Ese PNG se incrusta después en el PDF con pdf-lib. Las áreas transparentes se rellenan con fondo blanco. + +## Opciones + +La **calidad del PDF** controla la compresión tras la rasterización: + +- **Calidad alta**: lo más cercano al renderizado original. +- **Calidad media** (por defecto): buen equilibrio. +- **Calidad baja**: el archivo más pequeño, con cierta pérdida de detalle. + +## Casos de uso + +- Convertir diagramas de arquitectura o ingeniería de SVG a un PDF listo para imprimir +- Empaquetar conjuntos de iconos en un PDF de referencia para un sistema de diseño +- Convertir visualizaciones de datos (D3.js, exportaciones de bibliotecas de gráficos) en PDF listos para informes +- Crear versiones imprimibles de infografías basadas en SVG + +## Consejos + +- Los archivos SVG sin atributos `width` y `height` explícitos se renderizan a 800x600 píxeles. Para obtener mejores resultados, define las dimensiones en el código del SVG antes de convertir. +- Los SVG complejos con referencias a fuentes externas o imágenes enlazadas pueden no renderizarse a la perfección. Incrusta todos los recursos en el SVG para un resultado fiable. +- Como el SVG se rasteriza, el PDF contendrá una imagen de mapa de bits en lugar de trazados vectoriales. Para obtener un PDF vectorial real, se necesita una herramienta vectorial específica. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [BMP a PDF](./bmp-to-pdf) diff --git a/docs/es/tools/table-of-contents.md b/docs/es/tools/table-of-contents.md new file mode 100644 index 00000000..facaada4 --- /dev/null +++ b/docs/es/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Índice +description: Genera una página de tabla de contenidos con formato a partir de los marcadores existentes de tu PDF. +--- + +# Índice + +Esta herramienta lee los marcadores (esquemas) de tu PDF y genera una página de tabla de contenidos con formato que se antepone al documento. Si tu PDF ya tiene marcadores pero carece de una página de índice visible, esta herramienta la crea automáticamente. + +## Cómo funciona + +1. Sube un PDF que contenga marcadores. +2. Personaliza el título del índice, el tamaño de fuente y la familia tipográfica. +3. Opcionalmente, marca **Añadir marcador para la página del índice** para incluir el propio índice en el árbol de marcadores. +4. Haz clic en **Generar tabla de contenidos** para procesar el archivo. +5. El PDF actualizado se descarga automáticamente con la página del índice insertada al principio. + +## Opciones + +- **Título del índice**: el encabezado que se muestra en la parte superior de la página generada. Por defecto es "Índice". +- **Tamaño de fuente**: elige entre 10 pt y 72 pt. El valor por defecto es 12 pt. +- **Familia tipográfica**: elige entre las variantes de Times Roman, Helvetica o Courier (normal, negrita, cursiva, negrita cursiva). Por defecto es Helvetica. +- **Añadir marcador para la página del índice**: si está marcado, se añade al árbol de esquema del PDF una entrada de marcador para la propia página del índice. + +## Características + +- Lee toda la jerarquía de marcadores del PDF +- Genera una página de índice con formato limpio y referencias a números de página +- Admite niveles de marcadores anidados con sangría +- Elección entre 12 fuentes PDF integradas +- Marcador autorreferenciado opcional para la página del índice + +## Casos de uso + +- Añadir una tabla de contenidos imprimible a libros electrónicos o informes que solo tienen marcadores digitales +- Crear un índice para un documento combinado tras unir varios PDF +- Generar una página de referencia para manuales técnicos extensos +- Preparar documentos para impresión en los que se espera un índice visible + +## Consejos + +- Si tu PDF no tiene marcadores, usa primero la herramienta [Editar marcadores](./bookmark) para crearlos y luego vuelve aquí para generar el índice. +- En documentos grandes, un tamaño de fuente mayor, como 14 pt o 16 pt, mejora la legibilidad. + +## Herramientas relacionadas + +- [Editar marcadores](./bookmark) +- [Números de página](./page-numbers) +- [Encabezado y pie de página](./header-footer) diff --git a/docs/es/tools/text-color.md b/docs/es/tools/text-color.md new file mode 100644 index 00000000..4b02cdc2 --- /dev/null +++ b/docs/es/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Cambiar color de texto +description: Cambia el color de todo el texto de tu PDF por el color que elijas. +--- + +# Cambiar color de texto + +Sustituye el color del texto en todo tu PDF. La herramienta identifica las regiones de texto de cada página y las vuelve a colorear con el color elegido, conservando el diseño del documento y el contenido que no es texto. + +## Cómo funciona + +1. Sube tu archivo PDF. +2. Elige un nuevo color de texto con el selector de color. El valor por defecto es azul (#0000FF). +3. Haz clic en **Cambiar color de texto** para procesar. +4. El PDF recoloreado se descarga automáticamente. Un indicador de progreso muestra qué página se está procesando. + +## Opciones + +- **Nuevo color de texto**: un selector de color para elegir el color de reemplazo de todo el texto del documento. + +## Características + +- Recolorea el texto de todas las páginas del documento +- Procesamiento por página con indicador de progreso +- Selector de color con compatibilidad completa con colores hexadecimales +- Conserva el diseño de página y los elementos que no son texto + +## Casos de uso + +- Cambiar el texto negro por azul oscuro para lograr un documento más suave y moderno +- Recolorear el texto para ajustarlo a las guías de marca antes de distribuir documentos +- Convertir el texto a un color específico para cumplir con la accesibilidad +- Hacer visible el texto sobre un color de fondo recién aplicado + +## Consejos + +- Esta herramienta renderiza las páginas al doble de escala para mantener la calidad y después reconstruye el PDF. El resultado se basa en imágenes, por lo que el texto ya no se podrá seleccionar ni buscar. +- Si necesitas conservar el texto seleccionable, considera editar el PDF directamente con el [Editor de PDF](./edit-pdf). +- El tiempo de procesamiento aumenta con el número de páginas, ya que cada página se renderiza por separado. + +## Herramientas relacionadas + +- [Color de fondo](./background-color) +- [Invertir colores](./invert-colors) +- [Ajustar colores](./adjust-colors) diff --git a/docs/es/tools/tiff-to-pdf.md b/docs/es/tools/tiff-to-pdf.md new file mode 100644 index 00000000..8babe740 --- /dev/null +++ b/docs/es/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF a PDF +description: Convierte imágenes TIFF de una o varias páginas a formato PDF en tu navegador con compatibilidad completa de páginas. +--- + +# TIFF a PDF + +Convierte archivos TIFF a PDF, incluidos los TIFF de varias páginas. Cada página (o "IFD") de un archivo TIFF se convierte en una página independiente del PDF resultante. Es especialmente útil para documentos escaneados, faxes e imágenes médicas que suelen almacenarse como TIFF de varias páginas. + +## Formatos compatibles + +| Formato | Extensiones | +| :------ | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos TIFF. +2. Revisa la lista de archivos y gestiónala según necesites. +3. Haz clic en **Convertir a PDF**. El resultado se descarga como `from_tiff.pdf`. + +La herramienta decodifica cada archivo TIFF con un decodificador TIFF en JavaScript y extrae los datos de píxeles RGBA sin procesar de cada página. Cada página se renderiza en un lienzo, se exporta como PNG y se incrusta en el PDF. Las dimensiones de las páginas coinciden con las de las páginas TIFF originales. + +## Opciones + +Esta herramienta no expone ajustes de calidad adicionales. Las imágenes se incrustan a su resolución original. + +## Casos de uso + +- Convertir documentos de fax de varias páginas (TIFF-F) a un formato PDF más portátil +- Convertir archivos de documentos escaneados almacenados como TIFF en PDF con búsqueda (combínalo después con la herramienta de OCR) +- Procesar archivos de imagen médica (láminas de patología, exportaciones de radiología) que usan TIFF +- Convertir archivos TIFF de GIS o imágenes de satélite en documentos para compartir + +## Consejos + +- Los TIFF de varias páginas son totalmente compatibles. Un TIFF de 10 páginas producirá un PDF de 10 páginas. No necesitas dividir el TIFF antes. +- Los archivos TIFF muy grandes (cientos de megabytes) pueden tardar más en procesarse, ya que todo el archivo debe decodificarse en la memoria del navegador. +- Si necesitas OCR en el PDF resultante, pásalo por la herramienta [OCR PDF](./ocr-pdf) después de la conversión. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [BMP a PDF](./bmp-to-pdf) +- [JPG a PDF](./jpg-to-pdf) diff --git a/docs/es/tools/txt-to-pdf.md b/docs/es/tools/txt-to-pdf.md new file mode 100644 index 00000000..02e58575 --- /dev/null +++ b/docs/es/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Texto a PDF +description: Convierte archivos de texto sin formato o texto escrito a PDF con fuentes, colores y tamaños de página personalizados. +--- + +# Texto a PDF + +Convierte texto sin formato en un PDF con formato. Puedes subir archivos `.txt` o escribir directamente en el editor de texto integrado. La herramienta admite varias fuentes, colores de texto personalizados y una amplia gama de tamaños de página, de A0 a A10, además de US Letter, Legal y Tabloid. + +## Formatos compatibles + +| Entrada | Extensiones | +| :---------------- | :-------------------------- | +| Archivos de texto | `.txt` | +| Entrada directa | Escribe o pega en el editor | + +## Cómo funciona + +1. Elige el modo de entrada con el interruptor de la parte superior: **Subir archivos** o **Escribir texto**. +2. Si subes archivos, arrastra y suelta o haz clic para seleccionar uno o más archivos `.txt`. Si escribes, introduce el texto directamente en el área de texto. +3. Configura las opciones de formato: familia tipográfica, tamaño de fuente, color del texto y tamaño de página. +4. Haz clic en **Crear PDF**. El resultado se descarga como `text_to_pdf.pdf`. + +Al subir varios archivos, sus contenidos se concatenan con líneas en blanco entre ellos. + +## Opciones + +| Opción | Valores | Por defecto | +| :---------------------- | :--------------------------------------------------------------------------- | :-------------- | +| **Familia tipográfica** | Helvetica (sans-serif), Tiro (serif), Courier (monoespaciada), Times (serif) | Helvetica | +| **Tamaño de fuente** | 6 a 72 pt | 12 | +| **Color del texto** | Cualquier color mediante el selector de color | Negro (#000000) | +| **Tamaño de página** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Los idiomas de derecha a izquierda (árabe, hebreo, persa, urdu) se detectan automáticamente. Cuando se encuentra texto RTL, la dirección y la alineación del texto cambian en consecuencia. + +## Casos de uso + +- Convertir fragmentos de código o archivos de registro en un PDF imprimible con la fuente Courier +- Crear un PDF rápido a partir de notas de reunión escritas al momento +- Dar formato a un manuscrito de texto sin formato con una fuente y un tamaño de página concretos para su envío +- Producir una versión PDF de un README o un registro de cambios para distribuirla sin conexión + +## Consejos + +- Usa el modo **Escribir texto** cuando quieras convertir rápidamente el contenido del portapapeles sin guardarlo antes como archivo. +- Courier (monoespaciada) es la mejor fuente para código, registros o cualquier contenido en el que importe la alineación de columnas. +- Los márgenes de página son fijos, de 72 puntos (1 pulgada) por todos los lados. + +## Herramientas relacionadas + +- [Markdown a PDF](./markdown-to-pdf) +- [CSV a PDF](./csv-to-pdf) +- [Word a PDF](./word-to-pdf) diff --git a/docs/es/tools/unlock-pdf.md b/docs/es/tools/unlock-pdf.md new file mode 100644 index 00000000..0d3a6e0a --- /dev/null +++ b/docs/es/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Desbloquear PDF +description: Quita la protección con contraseña de PDF cifrados. Admite el descifrado por lotes con una sola contraseña para varios archivos. +--- + +# Desbloquear PDF + +Si tienes la contraseña de un PDF cifrado, esta herramienta elimina por completo el cifrado y genera una copia desbloqueada que cualquiera puede abrir sin credenciales. Admite el descifrado por lotes cuando varios PDF comparten la misma contraseña. + +## Cómo funciona + +1. Sube uno o más archivos PDF cifrados. +2. Introduce la **contraseña** con la que se protegieron los archivos. +3. Haz clic en **Descifrar PDF**. +4. Un solo archivo se descarga directamente. Varios archivos generan un archivo ZIP con todos los PDF desbloqueados. + +## Características + +- Descifrado de un solo archivo y por lotes +- Funciona con contraseñas de usuario y de propietario +- Genera una salida completamente sin cifrar y sin restricciones residuales +- Informes de error claros para contraseñas incorrectas o archivos dañados +- Seguimiento de éxito o fallo por archivo en el modo por lotes + +## Diferencias con Eliminar Restricciones + +**Descifrar PDF** requiere la contraseña y elimina todo el cifrado. **Eliminar Restricciones** actúa sobre las restricciones de uso (impresión, copia, edición) y puede no requerir contraseña si solo se estableció una contraseña de propietario. Usa Descifrar cuando el PDF no se abra en absoluto sin contraseña. + +## Casos de uso + +- Desbloquear de forma permanente PDF que cifraste antes cuando ya no necesitas la contraseña +- Quitar el cifrado de un lote de documentos archivados para facilitar el acceso a largo plazo +- Preparar PDF protegidos con contraseña para un sistema de gestión documental que no admite archivos cifrados +- Desbloquear PDF antes de combinarlos con otros documentos (muchas herramientas de combinación no pueden procesar archivos cifrados) + +## Consejos + +- El campo de contraseña se aplica a todos los archivos subidos. Si tus PDF tienen contraseñas distintas, procésalos en lotes separados. +- Si aparece el error "Contraseña incorrecta", revisa que no haya espacios al final ni mayúsculas activadas. +- Tras el descifrado, la salida no tiene ninguna seguridad. Vuelve a cifrar con Cifrar PDF si necesitas aplicar una contraseña nueva. + +## Herramientas relacionadas + +- [Cifrar PDF](./protect-pdf): vuelve a aplicar el cifrado con una contraseña nueva +- [Eliminar Restricciones](./remove-restrictions): quita las restricciones de uso sin descifrar por completo +- [Cambiar Permisos](./change-permissions): modifica permisos concretos de un PDF cifrado diff --git a/docs/es/tools/validate-signature-pdf.md b/docs/es/tools/validate-signature-pdf.md new file mode 100644 index 00000000..e7cc34c4 --- /dev/null +++ b/docs/es/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Validar Firma PDF +description: Verifica las firmas digitales de archivos PDF. Comprueba la validez del certificado, la identidad del firmante, la integridad del documento y el estado de la cadena de confianza. +--- + +# Validar Firma PDF + +Sube un PDF firmado y esta herramienta extrae cada firma digital, identifica al firmante, comprueba la validez del certificado e informa de si el documento se ha modificado desde que se firmó. También puedes aportar un certificado de confianza para verificar la cadena de la firma. + +## Cómo funciona + +1. Sube un archivo PDF firmado. La validación comienza automáticamente. +2. La herramienta muestra un resumen: número de firmas encontradas y cuántas son válidas. +3. Cada firma tiene una tarjeta detallada con el nombre del firmante, el emisor, las fechas y el estado. +4. Opcionalmente, sube un **certificado de confianza** (.pem, .crt, .cer, .der) para verificar la firma frente a un ancla de confianza concreta. La revalidación se ejecuta automáticamente. + +## Qué se comprueba + +### Análisis de la firma + +La herramienta extrae los objetos de firma PKCS#7 del PDF, decodifica la estructura ASN.1 y obtiene el certificado X.509 del firmante junto con cualquier cadena de certificados incrustada en la firma. + +### Validez del certificado + +- **Caducidad**: ¿Está el certificado dentro de su periodo de validez actual? +- **Detección de autofirmado**: ¿Es el certificado su propio emisor? +- **Cadena de confianza**: Cuando se aporta un certificado de confianza, ¿enlaza con él el certificado del firmante? + +### Verificación criptográfica + +- La herramienta reconstruye los bytes cubiertos por el `/ByteRange` de la firma, calcula su hash con el algoritmo que declaró el firmante y compara el resultado con el atributo `messageDigest` incluido en la firma. +- Después vuelve a serializar los atributos firmados como un SET DER y verifica la firma con la clave pública del certificado del firmante. +- **Una firma se considera válida solo cuando se superan todas estas comprobaciones.** Si los bytes del PDF se modificaron después de la firma, o la firma incrustada no coincide con la clave del firmante, el estado muestra "Inválida: falló la verificación criptográfica" con el motivo concreto. + +#### Algoritmos de firma admitidos + +| Algoritmo | Ruta de verificación | +| ----------------------- | --------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, con Web Crypto como alternativa | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` tras la conversión de firma DER → IEEE P1363 | + +Si una firma usa un algoritmo que no está en esta lista (por ejemplo Ed25519, SM2 o RSA con un OID de resumen poco habitual), la tarjeta muestra **"Sin verificar: algoritmo de firma no admitido"** en amarillo, junto con el OID o el motivo concretos. Se trata de una distinción deliberada de tres estados: + +- **Válida**: la firma se verificó criptográficamente con la clave pública del firmante. +- **Inválida**: la verificación se ejecutó y dio un resultado negativo (bytes modificados, clave que no coincide). +- **Sin verificar**: la herramienta no pudo ejecutar la verificación para este algoritmo. Los metadatos del certificado se siguen mostrando, pero debes tratar la firma como "desconocida" y verificarla con Adobe Acrobat o `openssl cms -verify`. + +### Algoritmos de resumen inseguros + +- Las firmas que usan **MD5 o SHA-1** se rechazan como inválidas y se marcan con el estado "Resumen inseguro". Ambos algoritmos tienen ataques de colisión publicados, por lo que una firma sobre un hash SHA-1 o MD5 no ofrece ninguna garantía de integridad. +- SHA-224, SHA-256, SHA-384 y SHA-512 se aceptan todos. + +### Cobertura del documento + +- **Cobertura completa**: la firma cubre todo el archivo PDF, es decir, no se añadió ni se cambió ningún byte después de la firma. +- **Cobertura parcial**: la firma cubre solo una parte del archivo. Esto puede indicar que se hicieron modificaciones después de la firma (no necesariamente maliciosas: los guardados incrementales producen cobertura parcial). + +## Detalles de la firma + +Cada tarjeta de firma muestra: + +- **Firmado por**: nombre común, organización y correo electrónico del certificado del firmante +- **Emisor**: la autoridad de certificación que emitió el certificado del firmante +- **Firmado el**: la marca de tiempo incrustada en la firma +- **Válido desde / Válido hasta**: el periodo de validez del certificado +- **Motivo**: por qué se firmó el documento (si se indica) +- **Ubicación**: dónde se firmó (si se indica) +- **Estado de cobertura**: completa o parcial +- **Insignia de confianza**: De confianza o No está en la cadena de confianza (solo cuando se aporta un certificado propio) + +### Detalles técnicos + +Despliega la sección de detalles técnicos para ver: + +- Número de serie del certificado del firmante +- Algoritmo de resumen (SHA-256, SHA-512, etc.) +- Algoritmo de firma (RSA con SHA-256, ECDSA con SHA-256, etc.) +- Mensajes de error de las firmas inválidas + +## Casos de uso + +- Verificar un contrato firmado digitalmente antes de contrafirmarlo +- Auditar documentos firmados para confirmar que no han sido manipulados +- Comprobar si un certificado ha caducado desde que se firmó el documento +- Validar firmas con el certificado raíz de tu organización +- Inspeccionar los detalles de firma de documentos oficiales o legales + +## Consejos + +- Un certificado autofirmado no significa que la firma sea inválida: significa que la identidad del firmante no se puede verificar mediante un tercero de confianza. Es habitual en documentos internos. +- La cobertura parcial no siempre indica manipulación. Muchos flujos de trabajo con PDF añaden actualizaciones incrementales (como una segunda firma) que crean cobertura parcial. +- Sube el certificado raíz o intermedio de tu organización como certificado de confianza para obtener la verificación de la cadena de confianza. + +## Herramientas relacionadas + +- [Firma Digital PDF](./digital-sign-pdf): firma PDF con tu propio certificado +- [Aplanar PDF](./flatten-pdf): aplana un PDF antes de firmarlo para evitar modificaciones posteriores a la firma +- [Eliminar Metadatos](./remove-metadata): limpia un PDF antes de aplicar una firma diff --git a/docs/es/tools/view-metadata.md b/docs/es/tools/view-metadata.md new file mode 100644 index 00000000..ca68f3a1 --- /dev/null +++ b/docs/es/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Ver metadatos +description: Inspecciona todas las propiedades de metadatos de un PDF, incluidos la información del documento, los datos XMP y los detalles estructurales. +--- + +# Ver metadatos + +Examina las propiedades ocultas incluidas en un archivo PDF. La herramienta muestra la información del documento (título, autor, fechas), los metadatos XMP, las dimensiones de página y otros datos estructurales en un formato legible. + +## Cómo funciona + +1. Sube un archivo PDF. +2. La herramienta analiza el archivo de inmediato y muestra todos los metadatos disponibles en secciones organizadas. +3. Revisa el diccionario de información del documento, el árbol de metadatos XMP y las propiedades estructurales. +4. No hace falta ningún paso de procesamiento: los metadatos se muestran en cuanto se carga el archivo. + +## Características + +- Muestra los campos estándar de información del documento: Título, Autor, Asunto, Palabras clave, Creador, Productor +- Muestra las fechas de creación y modificación en un formato legible +- Analiza y muestra el árbol completo de metadatos XMP con espacios de nombres anidados +- Convierte el formato de fecha de PDF (`D:20240101120000Z`) en fechas legibles +- Organizado en secciones plegables para navegar con facilidad + +## Secciones de metadatos + +| Sección | Contenido | +| ----------------------------- | -------------------------------------------------------------------------------------------------------- | +| **Información del documento** | Título, Autor, Asunto, Palabras clave, Creador, Productor, Fecha de creación, Fecha de modificación | +| **Metadatos XMP** | Árbol completo de metadatos basado en XML con Dublin Core, XAP, PDF y espacios de nombres personalizados | +| **Propiedades del documento** | Número de páginas, versión de PDF, tamaño del archivo, estado de cifrado | + +## Casos de uso + +- Comprobar quién es el autor de un PDF y cuándo se modificó por última vez +- Verificar que los metadatos se definieron correctamente antes de publicar un documento +- Auditar PDF en busca de problemas de privacidad revisando qué información personal contienen +- Investigar el software usado para crear o modificar un PDF (mediante el campo Productor) +- Revisar los metadatos XMP para el cumplimiento de la gestión de activos digitales + +## Consejos + +- Las cadenas de fecha de PDF que empiezan por `D:` se convierten automáticamente al formato de tu zona horaria local. +- Si los campos de metadatos aparecen vacíos, es que el creador del PDF simplemente no los definió. No todos los PDF contienen metadatos completos. +- Para modificar los metadatos después de inspeccionarlos, usa [Editar Metadatos](./edit-metadata). Para eliminarlos por completo, usa Eliminar Metadatos. + +## Herramientas relacionadas + +- [Editar Metadatos](./edit-metadata) +- [Capas OCG de PDF](./pdf-layers) +- [Comparar PDFs](./compare-pdfs) diff --git a/docs/es/tools/vsd-to-pdf.md b/docs/es/tools/vsd-to-pdf.md new file mode 100644 index 00000000..d397ec88 --- /dev/null +++ b/docs/es/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD a PDF +description: Convierte diagramas de Microsoft Visio (VSD/VSDX) a PDF en tu navegador. Gratis, privado y sin necesidad de Visio. +--- + +# VSD a PDF + +Convierte diagramas de Microsoft Visio en PDF sin instalar Visio. Los archivos VSD y VSDX contienen diagramas de flujo, organigramas, diagramas de red y planos que la mayoría de las personas no puede abrir. Esta herramienta los convierte en PDF limpios que se pueden ver en cualquier dispositivo. + +## Formatos admitidos + +| Formato | Extensión | Notas | +| :------------ | :-------- | :-------------------------------------------------- | +| Visio binario | `.vsd` | Formato antiguo de Visio (Visio 2003 y anteriores) | +| Visio XML | `.vsdx` | Formato moderno de Visio (Visio 2013 y posteriores) | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos VSD o VSDX. Se pueden mezclar ambos formatos en un mismo lote. +2. Revisa la lista de archivos. Quita las entradas que no quieras con el icono de la papelera o usa **Añadir más archivos** para agregar más diagramas. +3. Haz clic en **Convertir a PDF**. El motor basado en LibreOffice se carga en el navegador y convierte cada diagrama en un PDF, conservando formas, conectores, etiquetas y la disposición de página. +4. Un solo diagrama se descarga directamente como PDF. Varios archivos generan un archivo ZIP llamado `vsd-to-pdf.zip`. + +## Opciones + +No se requiere ninguna configuración. El conversor respeta el tamaño y la orientación de página originales del documento de Visio. + +## Casos de uso + +- Revisar diagramas de Visio de un compañero cuando no tienes licencia de Visio +- Incluir diagramas de red o de arquitectura en la documentación de un proyecto como PDF +- Imprimir organigramas o flujos de procesos como material para reuniones +- Archivar archivos VSD antiguos de versiones anteriores de Visio en un formato con futuro + +## Consejos + +- Los documentos de Visio de varias páginas generan PDF de varias páginas, y cada página de Visio se convierte en una página del PDF. +- Los archivos VSDX (el formato moderno basado en XML) suelen convertirse con mayor fidelidad que los archivos binarios VSD más antiguos. +- El motor de LibreOffice se carga una sola vez por sesión. Espera un momento en la primera conversión; los siguientes archivos serán más rápidos. + +## Herramientas relacionadas + +- [ODG a PDF](./odg-to-pdf) +- [PUB a PDF](./pub-to-pdf) +- [PSD a PDF](./psd-to-pdf) diff --git a/docs/es/tools/webp-to-pdf.md b/docs/es/tools/webp-to-pdf.md new file mode 100644 index 00000000..eefebe55 --- /dev/null +++ b/docs/es/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP a PDF +description: Convierte imágenes WebP a PDF directamente en tu navegador con calidad de compresión ajustable. +--- + +# WebP a PDF + +Convierte el formato de imagen WebP de Google a PDF. Resulta especialmente útil cuando has descargado imágenes de la web en formato WebP y las necesitas en un formato más aceptado universalmente para imprimir o compartir. + +## Formatos admitidos + +| Formato | Extensiones | +| :------ | :---------- | +| WebP | `.webp` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos WebP. +2. Revisa la lista de archivos y quita los que no necesites. +3. Selecciona un nivel de **Calidad del PDF**. +4. Haz clic en **Convertir a PDF**. El resultado se descarga como `from_webps.pdf`. + +Internamente, cada imagen WebP se decodifica mediante la API canvas del navegador y después se incrusta en el PDF con pdf-lib. Por eso la conversión funciona en cualquier navegador que admita la decodificación de WebP (todos los navegadores modernos lo hacen). + +## Opciones + +**Calidad del PDF** controla la compresión al incrustar las imágenes: + +- **Alta calidad**: conserva el máximo detalle. +- **Calidad media** (predeterminada): resultado equilibrado. +- **Baja calidad**: menor tamaño de archivo. + +## Casos de uso + +- Convertir en un PDF imprimible las imágenes descargadas de la web guardadas como WebP +- Reunir capturas de pantalla WebP de Chrome o Edge en documentación +- Crear un portafolio en PDF a partir de imágenes exportadas por herramientas de diseño que usan WebP por defecto +- Archivar imágenes WebP en un formato más universalmente legible + +## Consejos + +- WebP se decodifica internamente a PNG antes de incrustarse en el PDF, por lo que las imágenes WebP sin pérdida conservan su calidad con el ajuste Alta. +- Si tienes una mezcla de WebP y otros formatos de imagen, usa la herramienta [Imágenes a PDF](./image-to-pdf): acepta todo de una vez. + +## Herramientas relacionadas + +- [Imágenes a PDF](./image-to-pdf) +- [PNG a PDF](./png-to-pdf) +- [JPG a PDF](./jpg-to-pdf) diff --git a/docs/es/tools/word-to-pdf.md b/docs/es/tools/word-to-pdf.md new file mode 100644 index 00000000..ec3fc6d9 --- /dev/null +++ b/docs/es/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word a PDF +description: Convierte documentos de Word (DOC, DOCX), ODT y RTF a PDF en tu navegador conservando todo el formato. +--- + +# Word a PDF + +Convierte documentos de Microsoft Word y formatos compatibles a PDF. La herramienta usa un motor de LibreOffice que se ejecuta en el navegador y admite archivos DOC, DOCX, ODT y RTF, conservando en el resultado el formato, las tablas, las imágenes, los encabezados, los pies de página y los estilos. + +## Formatos admitidos + +| Formato | Extensiones | +| :--------------------------- | :---------- | +| Word (moderno) | `.docx` | +| Word (antiguo) | `.doc` | +| Texto de OpenDocument | `.odt` | +| Formato de texto enriquecido | `.rtf` | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus documentos de Word. Puedes seleccionar varios archivos a la vez. +2. Revisa y gestiona la lista de archivos. +3. Haz clic en **Convertir a PDF**. El motor de LibreOffice se carga la primera vez que se usa (un indicador de progreso muestra el estado de inicialización) y después se convierte cada archivo. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se empaquetan en `word-converted.zip`. + +## Opciones + +Esta herramienta no tiene ajustes adicionales. El motor de LibreOffice genera el resultado con su perfil de exportación a PDF predeterminado. + +## Resultado + +| Cantidad de entrada | Resultado | +| :------------------ | :------------------------------------------------------------------------ | +| 1 archivo | Descarga de un solo PDF (nombre de archivo original con extensión `.pdf`) | +| 2 o más archivos | Archivo ZIP (`word-converted.zip`) con un PDF por archivo | + +## Casos de uso + +- Convertir un currículum o una carta de presentación de DOCX a PDF antes de enviar una solicitud de empleo +- Convertir por lotes un conjunto de contratos o propuestas a PDF para entregarlos a un cliente +- Convertir archivos `.doc` antiguos en PDF modernos para archivarlos a largo plazo +- Convertir a PDF documentos colaborativos de Google Docs (exportados como DOCX) +- Generar PDF listos para imprimir a partir de plantillas de Word usadas en la generación automática de documentos + +## Consejos + +- El motor de LibreOffice se descarga una vez por sesión y se guarda en caché. Espera unos segundos de carga en la primera conversión; las siguientes serán mucho más rápidas. +- El formato complejo (macros, controles ActiveX, SmartArt avanzado) puede no convertirse a la perfección. Los elementos estándar de un documento (texto, tablas, imágenes, encabezados, notas al pie) se convierten de forma fiable. +- Como esta herramienta también acepta ODT y RTF, puedes usarla como conversor único para todos los formatos de procesamiento de texto. + +## Herramientas relacionadas + +- [ODT a PDF](./odt-to-pdf) +- [RTF a PDF](./rtf-to-pdf) +- [Excel a PDF](./excel-to-pdf) +- [PowerPoint a PDF](./powerpoint-to-pdf) diff --git a/docs/es/tools/wpd-to-pdf.md b/docs/es/tools/wpd-to-pdf.md new file mode 100644 index 00000000..b778daca --- /dev/null +++ b/docs/es/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD a PDF +description: Convierte documentos de WordPerfect (WPD) a PDF en tu navegador con LibreOffice. Gratis y privado. +--- + +# WPD a PDF + +Convierte documentos de Corel WordPerfect en archivos PDF. WPD fue en su día el formato de procesamiento de texto dominante en despachos jurídicos y organismos públicos. Si tienes archivos antiguos de WordPerfect que el software actual se niega a abrir, esta herramienta los devuelve a la vida como PDF estándar. + +## Formatos admitidos + +| Formato | Extensión | Notas | +| :---------- | :-------- | :--------------------------------------------- | +| WordPerfect | `.wpd` | Todas las versiones principales de WordPerfect | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos WPD. Puedes seleccionar varios archivos a la vez. +2. Revisa la lista de archivos. Quita los que no quieras con el icono de la papelera o usa **Añadir más archivos** para agregar más documentos. +3. Haz clic en **Convertir a PDF**. La herramienta carga en tu navegador un motor de conversión basado en LibreOffice, que analiza el formato WPD y genera el PDF. +4. Un solo archivo se descarga directamente como PDF. Las conversiones por lotes generan un archivo ZIP llamado `wpd-to-pdf.zip`. + +## Opciones + +No se requiere ninguna configuración. El motor de LibreOffice gestiona automáticamente el formato, las fuentes y la maquetación de WPD. + +## Casos de uso + +- Abrir documentos jurídicos de hace décadas escritos en WordPerfect +- Convertir expedientes archivados de organismos públicos de WPD a un formato moderno +- Migrar una biblioteca antigua de documentos de WordPerfect a PDF para almacenarla a largo plazo +- Compartir archivos WPD con destinatarios que no tienen Corel WordPerfect instalado + +## Consejos + +- El motor de LibreOffice se carga la primera vez que se usa, lo cual lleva un momento. Las conversiones posteriores en la misma sesión son más rápidas. +- Las macros complejas de WPD y los códigos revelados no se conservan, pero la maquetación visual, el contenido de texto y el formato básico pasan al PDF. + +## Herramientas relacionadas + +- [WPS a PDF](./wps-to-pdf) +- [ODG a PDF](./odg-to-pdf) diff --git a/docs/es/tools/wps-to-pdf.md b/docs/es/tools/wps-to-pdf.md new file mode 100644 index 00000000..b262b049 --- /dev/null +++ b/docs/es/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS a PDF +description: Convierte documentos de Microsoft Works (WPS) a PDF en tu navegador. Gratis, sin registro y totalmente privado. +--- + +# WPS a PDF + +Convierte archivos del procesador de textos de Microsoft Works en PDF. Microsoft Works venía incluido en los PC domésticos a finales de los noventa y durante los años 2000, y muchos archivos WPS siguen en discos duros antiguos y archivos de correo. Esta herramienta los abre en el navegador y genera PDF limpios. + +## Formatos admitidos + +| Formato | Extensión | Notas | +| :-------------- | :-------- | :--------------------------------------------------- | +| Microsoft Works | `.wps` | Archivos del procesador de textos de Microsoft Works | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos WPS. Se aceptan varios archivos. +2. Revisa la lista de archivos. Usa el icono de la papelera para quitar archivos individuales o haz clic en **Añadir más archivos** para ampliar tu lote. +3. Haz clic en **Convertir a PDF**. Un motor basado en LibreOffice se carga en el navegador y convierte cada documento WPS a PDF. +4. Un archivo se descarga directamente como PDF. Varios archivos se agrupan en un archivo ZIP llamado `wps-to-pdf.zip`. + +## Opciones + +No hacen falta ajustes adicionales. El conversor gestiona el texto, el formato básico y las imágenes incrustadas del archivo WPS. + +## Casos de uso + +- Recuperar documentos antiguos del colegio o del trabajo guardados en formato Microsoft Works +- Abrir archivos adjuntos WPS recibidos por correo cuando no tienes Microsoft Works instalado +- Convertir un archivo de documentos WPS para migrarlo a un sistema documental moderno +- Imprimir documentos antiguos que los procesadores de texto actuales no pueden abrir + +## Consejos + +- No confundas los archivos `.wps` de Microsoft Works con los de WPS Office. Esta herramienta es solo para el formato antiguo de Microsoft Works. +- El motor de LibreOffice tarda un momento en cargarse la primera vez. Una vez cargado, las conversiones adicionales de la misma sesión se ejecutan más rápido. + +## Herramientas relacionadas + +- [WPD a PDF](./wpd-to-pdf) +- [PUB a PDF](./pub-to-pdf) diff --git a/docs/es/tools/xml-to-pdf.md b/docs/es/tools/xml-to-pdf.md new file mode 100644 index 00000000..38e42264 --- /dev/null +++ b/docs/es/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML a PDF +description: Convierte archivos XML en documentos PDF estructurados en tu navegador. Gratis, privado y sin procesamiento en servidor. +--- + +# XML a PDF + +Convierte archivos de datos XML en documentos PDF legibles y estructurados. El XML en bruto es potente pero difícil de leer para las personas. Esta herramienta analiza el árbol XML, identifica las estructuras de datos repetidas y las muestra como tablas y secciones con formato en un PDF A4 horizontal. + +## Formatos admitidos + +| Formato | Extensión | Notas | +| :------ | :-------- | :----------------------------------- | +| XML | `.xml` | Cualquier documento XML bien formado | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos XML. Se pueden procesar varios archivos en un mismo lote. +2. Revisa la lista de archivos. Quita los que no quieras con el icono de la papelera o haz clic en **Añadir más archivos** para incluir más. +3. Haz clic en **Convertir a PDF**. La herramienta analiza la estructura XML con el DOMParser integrado del navegador, estudia la jerarquía de los datos y la convierte en un PDF con jsPDF y formato de tabla automático. +4. Un solo archivo se descarga como PDF. Varias conversiones se empaquetan en `xml-to-pdf.zip`. + +## Opciones + +No se requiere configuración manual. El conversor detecta automáticamente la estructura del XML y elige las disposiciones de tabla adecuadas. El resultado usa orientación A4 horizontal para acomodar conjuntos de datos anchos. + +## Casos de uso + +- Convertir exportaciones de datos XML de bases de datos o API en informes imprimibles +- Crear resúmenes legibles a partir de archivos de configuración XML +- Convertir facturas o registros de transacciones basados en XML en PDF para su archivo +- Hacer legibles en forma de documento los mapas del sitio XML o los feeds RSS + +## Consejos + +- El XML debe estar bien formado. Si el analizador encuentra errores de sintaxis, la conversión fallará con un mensaje de error descriptivo que señala el problema. +- Las estructuras XML muy anidadas se aplanan en tablas. Para obtener los mejores resultados, los datos deben tener elementos hermanos repetidos con elementos hijos coherentes. +- Durante la conversión aparecen actualizaciones de progreso que muestran cada fase: lectura, análisis, estudio y renderizado. + +## Herramientas relacionadas + +- [FB2 a PDF](./fb2-to-pdf) +- [XPS a PDF](./xps-to-pdf) +- [Email a PDF](./email-to-pdf) diff --git a/docs/es/tools/xps-to-pdf.md b/docs/es/tools/xps-to-pdf.md new file mode 100644 index 00000000..160fd18b --- /dev/null +++ b/docs/es/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS a PDF +description: Convierte documentos XPS y OXPS a formato PDF en tu navegador. Sin subir archivos, sin registro y totalmente privado. +--- + +# XPS a PDF + +Convierte documentos XPS y OXPS de Microsoft en archivos PDF estándar. XPS (XML Paper Specification) fue la respuesta de Microsoft al PDF, pero su compatibilidad ha ido disminuyendo en todas las plataformas. Esta herramienta vuelve a hacer legibles esos documentos para todo el mundo. + +## Formatos admitidos + +| Formato | Extensión | Notas | +| :------ | :-------- | :------------------------------------------ | +| XPS | `.xps` | Formato XPS original de Microsoft | +| OXPS | `.oxps` | Open XPS, la variante del estándar ECMA-388 | + +## Cómo funciona + +1. Haz clic en el área de carga o arrastra y suelta tus archivos XPS/OXPS. Puedes seleccionar varios archivos a la vez. +2. Revisa la lista de archivos. Quita archivos individuales con el icono de la papelera o haz clic en **Añadir más archivos** para agregar más documentos. +3. Haz clic en **Convertir a PDF**. El motor PyMuPDF procesa cada documento de forma local en tu navegador. +4. Un solo archivo se descarga directamente como PDF. Varios archivos se agrupan en un archivo ZIP llamado `xps-converted.zip`. + +## Opciones + +Esta herramienta realiza una conversión directa de formato sin configuración adicional. El resultado conserva las dimensiones de página, los gráficos vectoriales, las fuentes y las imágenes originales del archivo XPS. + +## Casos de uso + +- Abrir archivos XPS recibidos de sistemas Windows antiguos que usaban por defecto el controlador de impresión XPS +- Convertir documentos OXPS de Windows 10/11 para compartirlos con usuarios de macOS o Linux +- Archivar archivos XPS antiguos en un formato con mayor compatibilidad +- Hacer accesibles a destinatarios externos documentos oficiales o corporativos basados en XPS + +## Consejos + +- Las extensiones `.xps` y `.oxps` se gestionan automáticamente: puedes mezclarlas en el mismo lote. +- Si el archivo XPS original se creó con un controlador de impresión de alta resolución, el PDF resultante conserva esa calidad. No se vuelve a muestrear. + +## Herramientas relacionadas + +- [Word a PDF](./word-to-pdf) +- [XML a PDF](./xml-to-pdf) diff --git a/docs/fa/contributing.md b/docs/fa/contributing.md new file mode 100644 index 00000000..7dcd7115 --- /dev/null +++ b/docs/fa/contributing.md @@ -0,0 +1,136 @@ +# مشارکت + +از علاقهٔ شما به مشارکت در BentoPDF سپاسگزاریم! این راهنما به شما کمک می‌کند شروع کنید. + +## شروع کار + +### پیش‌نیازها + +- Node.js 18+ +- npm 9+ +- Git + +### راه‌اندازی + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## ساختار پروژه + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## افزودن ابزار جدید + +### گام ۱: ساخت فایل منطق + +فایل `src/js/logic/your-tool-page.ts` را بسازید: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### گام ۲: ساخت صفحهٔ HTML + +فایل `src/pages/your-tool.html` را مطابق قالب‌های ابزارهای موجود بسازید. + +### گام ۳: ثبت ابزار + +به `src/js/config/tools.ts` اضافه کنید: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### گام ۴: افزودن به پیکربندی ساخت + +صفحه را به `vite.config.ts` اضافه کنید: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### گام ۵: افزودن ترجمه‌ها + +ورودی‌ها را به همهٔ فایل‌های زبان در `public/locales/` اضافه کنید: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## سبک کدنویسی + +- برای همهٔ کدهای جدید از TypeScript استفاده کنید +- برای یکدستی، از الگوهای موجود پیروی کنید +- پیش از commit، دستور `npm run format` را اجرا کنید +- بدون توضیح (comment) در کد production (توضیحات هنگام ساخت حذف می‌شوند) + +## فرایند Pull Request + +1. یک شاخهٔ ویژگی بسازید: `git checkout -b feature/your-feature` +2. تغییرات خود را اعمال کنید +3. به‌طور کامل آزمایش کنید: `npm run build` +4. یک PR با توضیح روشن ارسال کنید + +## ترجمه + +برای افزودن زبان‌های جدید، [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) را ببینید. + +## توافق‌نامهٔ مجوز مشارکت‌کننده + +پیش از ادغام PR شما، باید CLA ما را امضا کنید: + +- [CLA فردی (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA شرکتی (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## دریافت کمک + +- [Issues در GitHub](https://github.com/alam00000/bentopdf/issues) +- [انجمن Discord](https://discord.gg/Bgq3Ay3f2w) + +## مجوز + +BentoPDF دارای مجوز دوگانه است: + +- **AGPL-3.0** برای پروژه‌های متن‌باز که کد منبع کامل خود را به‌صورت عمومی منتشر می‌کنند +- **مجوز تجاری** برای برنامه‌های اختصاصی یا بسته‌منبع: [دریافت مجوز مادام‌العمر با ۷۹ دلار](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +با مشارکت، می‌پذیرید که مشارکت‌های شما تحت این شرایط مجوزدهی شوند. diff --git a/docs/fa/getting-started.md b/docs/fa/getting-started.md new file mode 100644 index 00000000..71b278c2 --- /dev/null +++ b/docs/fa/getting-started.md @@ -0,0 +1,80 @@ +# شروع به کار + +به BentoPDF خوش آمدید! این راهنما به شما کمک می‌کند سریع شروع کنید. + +## BentoPDF چیست؟ + +BentoPDF مجموعه‌ابزار PDF رایگان، متن‌باز و حریم‌خصوصی‌محور است که **کاملاً در مرورگر شما** اجرا می‌شود. فایل‌های شما هرگز از دستگاهتان خارج نمی‌شوند؛ همهٔ پردازش‌ها به‌صورت محلی با فناوری WebAssembly (WASM) انجام می‌شود. + +## شروع سریع + +### گزینهٔ ۱: استفاده از نسخهٔ میزبانی‌شده + +به [bentopdf.com](https://www.bentopdf.com) بروید تا بی‌درنگ از BentoPDF استفاده کنید؛ نیازی به نصب نیست. + +### گزینهٔ ۲: میزبانی شخصی با Docker + +> [!IMPORTANT] +> تبدیل فایل‌های Office به `SharedArrayBuffer` نیاز دارد که این موارد را لازم دارد: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - یک بستر امن (secure context) +> +> `http://localhost` برای آزمایش محلی کار می‌کند، چون مرورگرها loopback را قابل‌اعتماد می‌دانند. `http://192.168.x.x` یا دیگر IPهای شبکهٔ محلی معمولاً این‌گونه نیستند، بنابراین تبدیل‌های Word/Excel/PowerPoint هنگام دسترسی از دستگاه‌های دیگر شبکه به HTTPS نیاز دارند. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF در دو نسخهٔ ساخت عرضه می‌شود: **نسخهٔ میزبانی شخصی** (`bentopdf-simple`، که در بالا استفاده شد) برای استقرارهای داخلی، تیمی و سازمانی، و **نسخهٔ تجاری** (`bentopdf:latest`) که خود bentopdf.com و دارندگان مجوز تجاری برای استقرارهای عمومی از آن استفاده می‌کنند. هر دو ابزارهای PDF یکسانی دارند؛ نسخهٔ تجاری بخش hero، پرسش‌های متداول، نظرات کاربران و پاصفحهٔ bentopdf.com را اضافه می‌کند. اگر مطمئن نیستید، از نسخهٔ میزبانی شخصی استفاده کنید. + +سپس `http://localhost:3000` را در مرورگر خود باز کنید. + +> [!NOTE] +> اگر در حال آماده‌سازی استقرار OCR در محیط ایزوله (air-gapped) هستید، باید علاوه بر worker، هستهٔ اجرایی و فایل‌های traineddata مربوط به Tesseract، فونت‌های لایهٔ متنی OCR را نیز به‌صورت داخلی میزبانی کنید. راه‌اندازی کامل در [میزبانی شخصی](/fa/self-hosting/) مستند شده است، از جمله `VITE_OCR_FONT_BASE_URL` و پوشهٔ همراه `ocr-fonts/`. + +### گزینهٔ ۳: ساخت از کد منبع + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## نگاهی به قابلیت‌ها + +| دسته | ابزارها | +| ------------------------ | ------------------------------------------------------------------ | +| **تبدیل به PDF** | Word، Excel، PowerPoint، تصاویر، Markdown، EPUB، MOBI و موارد دیگر | +| **تبدیل از PDF** | JPG، PNG، متن، Excel، SVG و موارد دیگر | +| **ویرایش و حاشیه‌نویسی** | امضا، هایلایت، حذف محتوای حساس، پر کردن فرم‌ها، افزودن مهر | +| **سازماندهی** | ادغام، تقسیم، چرخش، حذف صفحات، تغییر ترتیب | +| **بهینه‌سازی** | فشرده‌سازی، تعمیر، مسطح‌سازی، OCR | +| **امنیت** | رمزگذاری، رمزگشایی، حذف محدودیت‌ها | + +## پشتیبانی مرورگرها + +BentoPDF در مرورگرهای مدرن بهترین عملکرد را دارد: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## گام‌های بعدی + +- [مشاهدهٔ همهٔ ابزارها](/fa/tools/) +- [میزبانی شخصی BentoPDF](/fa/self-hosting/) +- [مشارکت در پروژه](/fa/contributing) diff --git a/docs/fa/index.md b/docs/fa/index.md new file mode 100644 index 00000000..4a529868 --- /dev/null +++ b/docs/fa/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'ابزارهای PDF رایگان و متن‌باز' + tagline: PDFها را کاملاً در مرورگر خود پردازش کنید. بدون بارگذاری. بدون سرور. حریم خصوصی کامل. + actions: + - theme: brand + text: شروع کنید + link: /fa/getting-started + - theme: alt + text: مشاهدهٔ ابزارها + link: /fa/tools/ + - theme: alt + text: میزبانی شخصی + link: /fa/self-hosting/ + - theme: alt + text: مجوز تجاری + link: /fa/licensing + +features: + - icon: 🔒 + title: ۱۰۰٪ خصوصی + details: فایل‌های شما هرگز از دستگاهتان خارج نمی‌شوند. همهٔ پردازش‌ها به‌صورت محلی در مرورگر شما با WebAssembly انجام می‌شود. + - icon: ⚡ + title: سریع و رایگان + details: بدون ثبت‌نام، بدون محدودیت، بدون واترمارک. PDFهای نامحدود را برای همیشه رایگان پردازش کنید. + - icon: 🛠️ + title: بیش از ۵۰ ابزار + details: تبدیل، ویرایش، ادغام، تقسیم، فشرده‌سازی، امضا، OCR و موارد دیگر. هر آنچه نیاز دارید در یک جا. + + - icon: 🌐 + title: قابل میزبانی شخصی + details: روی زیرساخت خودتان مستقر کنید. Docker، Vercel، Netlify، AWS یا محیط‌های کاملاً ایزوله با workerهای OCR، داده‌های زبانی و فونت‌های لایهٔ متنی میزبانی‌شده به‌صورت شخصی. +--- + +## OCR آفلاین + +اگر BentoPDF را در محیطی ایزوله یا آفلاین میزبانی می‌کنید، OCR به چیزی بیش از worker و فایل‌های traineddata مربوط به Tesseract نیاز دارد. خروجی PDF قابل‌جستجو همچنین نیاز دارد فونت‌های لایهٔ متنی OCR به‌صورت داخلی ارائه شوند. +برای راه‌اندازی کامل، از جمله `VITE_OCR_FONT_BASE_URL`، پوشهٔ همراه `ocr-fonts/` و روند به‌روزشدهٔ air-gap، [میزبانی شخصی](/fa/self-hosting/) را ببینید. diff --git a/docs/fa/licensing.md b/docs/fa/licensing.md new file mode 100644 index 00000000..0efaf59e --- /dev/null +++ b/docs/fa/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/fa/self-hosting/#پیکربندی-wasm-اجزای-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/fa/self-hosting/apache.md b/docs/fa/self-hosting/apache.md new file mode 100644 index 00000000..b3616c00 --- /dev/null +++ b/docs/fa/self-hosting/apache.md @@ -0,0 +1,275 @@ +# استقرار با Apache + +BentoPDF را با Apache HTTP Server میزبانی کنید. + +## پیش‌نیازها + +- Apache 2.4+ +- فعال بودن mod_rewrite +- گواهی SSL (توصیه‌شده) + +## گام ۱: ساخت پروژه + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +برای سفارشی‌سازی برند، پیش از ساخت متغیرهای محیطی را تنظیم کنید: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## گام ۲: کپی فایل‌ها + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## گام ۳: پیکربندی Apache + +فایل `/etc/apache2/sites-available/bentopdf.conf` را بسازید: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## گام ۴: فایل .htaccess برای مسیریابی + +فایل `/var/www/bentopdf/.htaccess` را بسازید: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## گام ۵: فعال‌سازی ماژول‌های لازم + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## گام ۶: فعال‌سازی سایت + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## استقرار در زیرپوشه + +برای میزبانی در `/pdf/`: + +1. با URL پایه بسازید: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. فایل `.htaccess` را به‌روز کنید: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## عیب‌یابی + +### خطاهای 404 برای WASM + +مطمئن شوید نوع MIME پیکربندی شده است: + +```apache +AddType application/wasm .wasm +``` + +### امضای PDF یا پرکنندهٔ فرم نمایشگر خالی نشان می‌دهد (خطای MIME برای `.mjs`) + +اگر کنسول مرورگر این را نشان می‌دهد: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…و درخواست ناموفق به `.mjs` ختم می‌شود، پیکربندی Apache شما نگاشت `.mjs → application/javascript` را ندارد. نمایشگر PDF همراه، فایل‌های ماژول ES با پسوند `.mjs` دارد و `mime.types` پیش‌فرض Apache به‌طور پیش‌فرض آن‌ها را شامل نمی‌شود. + +به VirtualHost یا `.htaccess` خود اضافه کنید: + +```apache +AddType application/javascript .mjs +``` + +سپس Apache را دوباره بارگذاری کنید: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +برای تأیید: در DevTools مرورگر ← زبانهٔ Network، درخواست ناموفق `.mjs` را پیدا کنید و سرآیند پاسخ `Content-Type` را بررسی کنید. اکنون باید `application/javascript` باشد، نه `application/octet-stream`. + +### بازنویسی کار نمی‌کند + +بررسی کنید که mod_rewrite فعال باشد: + +```bash +sudo a2enmod rewrite +``` + +### تبدیل Word/ODT/Excel به PDF کار نمی‌کند + +LibreOffice WASM به `SharedArrayBuffer` نیاز دارد که این سرآیندها را لازم دارد: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +همچنین به یک بستر امن (secure context) نیاز دارد. `http://localhost` برای آزمایش محلی کار می‌کند، اما `http://192.168.x.x` یا دیگر IPهای شبکهٔ محلی معمولاً به HTTPS نیاز دارند. اگر سرآیندها وجود دارند اما `window.crossOriginIsolated` همچنان `false` است، بررسی کنید که آیا صفحه با HTTP ساده روی مبدأیی غیر از loopback باز می‌شود. + +فایل‌های از پیش فشرده‌شدهٔ `.wasm.gz` و `.data.gz` نیز به `Content-Encoding` درست نیاز دارند: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +مطمئن شوید `mod_headers` فعال است: `sudo a2enmod headers` + +### دسترسی رد شد (Permission Denied) + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/fa/self-hosting/aws.md b/docs/fa/self-hosting/aws.md new file mode 100644 index 00000000..0aad6fdf --- /dev/null +++ b/docs/fa/self-hosting/aws.md @@ -0,0 +1,200 @@ +# استقرار روی AWS S3 + CloudFront + +BentoPDF را برای حداکثر کنترل و مقیاس‌پذیری روی AWS میزبانی کنید. + +## معماری + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## گام ۱: ساخت S3 Bucket + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## گام ۲: ساخت و بارگذاری + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## گام ۳: ساخت CloudFront Distribution + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +یا از AWS Console استفاده کنید: + +1. به CloudFront ← Create distribution بروید +2. Origin domain: S3 bucket خود را انتخاب کنید +3. گزینهٔ "Origin Access Control" را فعال کنید +4. Default root object: `index.html` +5. distribution را بسازید + +## گام ۳b: سیاست سرآیندهای پاسخ (لازم برای LibreOffice WASM) + +تبدیل‌های مبتنی بر LibreOffice (Word، Excel، PowerPoint به PDF) به `SharedArrayBuffer` نیاز دارند که سرآیندهای پاسخ مشخصی را لازم دارد. یک CloudFront Response Headers Policy بسازید: + +1. به CloudFront ← Policies ← Response headers بروید +2. یک سیاست سفارشی با این سرآیندها بسازید: + +| سرآیند | مقدار | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. سیاست را به default cache behavior مربوط به distribution خود متصل کنید + +یا از طریق CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## گام ۳c: فرادادهٔ S3 برای فایل‌های WASM از پیش فشرده‌شده + +فایل‌های LibreOffice WASM از پیش فشرده شده‌اند (`.wasm.gz`، `.data.gz`). Content-Type و Content-Encoding درست را تنظیم کنید تا مرورگرها آن‌ها را از حالت فشرده خارج کنند: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning مهم +بدون سیاست سرآیندهای پاسخ، `SharedArrayBuffer` در دسترس نیست و تبدیل‌های LibreOffice WASM در حدود ۵۵٪ متوقف می‌شوند. بدون Content-Encoding درست روی فایل‌های `.gz`، مرورگر بایت‌های خام gzip را دریافت می‌کند و کامپایل WASM شکست می‌خورد. +::: + +## گام ۴: سیاست S3 Bucket + +به CloudFront اجازهٔ دسترسی به bucket را بدهید: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## گام ۵: صفحات خطای سفارشی + +خطای 404 را طوری پیکربندی کنید که برای مسیریابی SPA فایل `index.html` را برگرداند: + +1. CloudFront ← Error pages +2. یک پاسخ خطای سفارشی بسازید: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## برآورد هزینه + +| منبع | هزینهٔ تقریبی | +| --------------------------- | ------------- | +| فضای ذخیره‌سازی S3 (~500MB) | ~$0.01 در ماه | +| CloudFront (انتقال 1TB) | ~$85 در ماه | +| CloudFront (انتقال 10GB) | ~$0.85 در ماه | + +::: tip +برای بهینه‌سازی هزینهٔ فایل‌هایی که کمتر به آن‌ها دسترسی می‌شود، از S3 Intelligent Tiering استفاده کنید. +::: + +## خودکارسازی با Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/fa/self-hosting/cloudflare.md b/docs/fa/self-hosting/cloudflare.md new file mode 100644 index 00000000..d469d997 --- /dev/null +++ b/docs/fa/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# استقرار روی Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) میزبانی سریع و جهانی سایت‌های ایستا با پهنای باند نامحدود ارائه می‌دهد. + +## استقرار سریع + +1. به [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) بروید +2. روی "Create a project" کلیک کنید +3. مخزن GitHub خود را متصل کنید + +## پیکربندی ساخت + +| تنظیم | مقدار | +| ---------------- | --------------- | +| Framework preset | None | +| فرمان ساخت | `npm run build` | +| پوشهٔ خروجی ساخت | `dist` | +| پوشهٔ ریشه | `/` | + +## متغیرهای محیطی + +این‌ها را در Settings ← Environment variables اضافه کنید: + +| متغیر | مقدار | +| ----------------------- | ---------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (اختیاری) | +| `VITE_BRAND_NAME` | نام برند سفارشی (اختیاری) | +| `VITE_BRAND_LOGO` | مسیر لوگو نسبت به `public/` (اختیاری) | +| `VITE_FOOTER_TEXT` | متن سفارشی پاصفحه یا کپی‌رایت (اختیاری) | +| `VITE_DEFAULT_LANGUAGE` | زبان پیش‌فرض رابط کاربری، مثلاً `fr` (اختیاری) | + +## فایل پیکربندی + +فایل `_headers` را در پوشهٔ `public` خود بسازید: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning مهم +سرآیندهای `Cross-Origin-Embedder-Policy` و `Cross-Origin-Opener-Policy` برای تبدیل Word/ODT/Excel/PowerPoint به PDF لازم هستند. بدون آن‌ها، `SharedArrayBuffer` در دسترس نیست و موتور LibreOffice WASM راه‌اندازی نمی‌شود. +::: + +فایل `_redirects` را برای مسیریابی SPA بسازید: + +``` +/* /index.html 200 +``` + +## دامنهٔ سفارشی + +1. به پروژهٔ Pages خود بروید +2. روی "Custom domains" کلیک کنید +3. دامنهٔ خود را اضافه کنید +4. اگر دامنه روی Cloudflare باشد، Cloudflare به‌طور خودکار DNS را پیکربندی می‌کند + +## مزایا + +- **پهنای باند نامحدود رایگان** +- **CDN جهانی** با بیش از ۳۰۰ نقطهٔ لبه +- **HTTPS خودکار** +- **استقرارهای پیش‌نمایش** برای pull requestها +- **ساخت سریع** + +## عیب‌یابی + +### بارگذاری فایل‌های بزرگ + +Cloudflare Pages از فایل‌هایی تا ۲۵ مگابایت پشتیبانی می‌کند. ماژول‌های WASM باید مشکلی نداشته باشند، اما اگر به محدودیت برخوردید، این را در نظر بگیرید: + +```bash +# Split large files during build +npm run build +``` + +### محدودیت اندازهٔ Worker + +اگر از Cloudflare Workers برای مسیریابی پیشرفته استفاده می‌کنید، به محدودیت ۱ مگابایت در طرح‌های رایگان توجه کنید. + +## Worker پراکسی CORS (برای امضاهای دیجیتال) + +ابزار امضای دیجیتال برای دریافت زنجیرهٔ گواهی‌ها به یک پراکسی CORS نیاز دارد. worker همراه را مستقر کنید: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### ویژگی‌های امنیتی + +| ویژگی | توضیح | +| ------------------------ | ------------------------------------------- | +| **محدودیت URL** | فقط URLهای گواهی مجاز هستند | +| **محدودیت اندازهٔ فایل** | حداکثر 10MB برای هر درخواست | +| **محدودسازی نرخ** | ۶۰ درخواست برای هر IP در دقیقه (نیازمند KV) | +| **مسدودسازی IP خصوصی** | مسدود کردن localhost و IPهای داخلی | + +### فعال‌سازی محدودسازی نرخ + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### ساخت با URL پراکسی + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +یا با Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **نکته:** برای راه‌اندازی امضای HMAC، [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) را ببینید. diff --git a/docs/fa/self-hosting/cors-proxy.md b/docs/fa/self-hosting/cors-proxy.md new file mode 100644 index 00000000..82b83c07 --- /dev/null +++ b/docs/fa/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# پراکسی CORS برای دریافت گواهی‌ها + +ابزار امضای دیجیتال از یک پراکسی CORS برای دریافت گواهی‌های صادرکننده از مراجع صدور گواهی (CA) خارجی استفاده می‌کند. این کار لازم است، چون بسیاری از سرورهای CA سرآیندهای CORS را در پاسخ‌های خود قرار نمی‌دهند و این مانع دریافت مستقیم از مرورگر می‌شود. + +علاوه بر این، بسیاری از سرورهای CA گواهی‌ها را روی HTTP ساده ارائه می‌کنند. وقتی نمونهٔ BentoPDF شما روی HTTPS میزبانی می‌شود، مرورگرها این درخواست‌های HTTP را مسدود می‌کنند (سیاست محتوای ترکیبی). پراکسی CORS هر دو مشکل را با هدایت درخواست‌ها از طریق یک endpoint با HTTPS و سرآیندهای مناسب حل می‌کند. + +## نحوهٔ کار + +هنگام امضای PDF با یک گواهی: + +1. کتابخانهٔ `zgapdfsigner` تلاش می‌کند یک زنجیرهٔ کامل گواهی بسازد +2. گواهی‌های صادرکننده را از URLهایی که در افزونهٔ AIA (Authority Information Access) گواهی شما قرار دارند دریافت می‌کند +3. این درخواست‌ها از طریق یک پراکسی CORS هدایت می‌شوند که سرآیندهای لازم `Access-Control-Allow-Origin` را اضافه می‌کند +4. پراکسی دادهٔ گواهی را به مرورگر برمی‌گرداند + +## میزبانی شخصی پراکسی CORS + +اگر BentoPDF را خودتان میزبانی می‌کنید، باید پراکسی CORS خود را مستقر کنید تا امضای دیجیتال با گواهی‌هایی که به دریافت زنجیره نیاز دارند کار کند. + +### گزینهٔ ۱: Cloudflare Workers (توصیه‌شده) + +1. **نصب Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **ورود به Cloudflare**: + + ```bash + wrangler login + ``` + +3. **کلون کردن BentoPDF و به‌روزرسانی مبدأهای مجاز**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + فایل `cors-proxy-worker.js` را باز کنید و آرایهٔ `ALLOWED_ORIGINS` را به دامنهٔ خود تغییر دهید: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning مهم + بدون این تغییر، پراکسی همهٔ درخواست‌های سایت شما را با خطای **403 Forbidden** رد می‌کند. پیش‌فرض فقط درخواست‌های `bentopdf.com` را مجاز می‌کند. + ::: + +4. **استقرار پراکسی**: + + ```bash + wrangler deploy + ``` + + URL worker خود را یادداشت کنید (مثلاً `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **ساخت دوبارهٔ BentoPDF با URL پراکسی**: + + اگر از Docker استفاده می‌کنید: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + اگر از کد منبع می‌سازید: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### گزینهٔ ۲: پراکسی بک‌اند سفارشی + +همچنین می‌توانید endpoint پراکسی خود را بسازید. الزامات عبارت‌اند از: + +1. پذیرش درخواست‌های GET با پارامتر پرس‌وجوی `url` +2. دریافت URL از سرور شما (در سمت سرور محدودیت CORS وجود ندارد) +3. بازگرداندن پاسخ با این سرآیندها: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +نمونهٔ پیاده‌سازی با Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## ملاحظات امنیتی + +Cloudflare Worker همراه چندین تدبیر امنیتی دارد: + +| ویژگی | توضیح | +| ------------------------ | --------------------------------------------------------------------------------------------------------- | +| **اعتبارسنجی مبدأ** | فقط درخواست‌های دامنه‌های فهرست‌شده در `ALLOWED_ORIGINS` را مجاز می‌کند | +| **محدودیت URL** | فقط URLهای گواهی را مجاز می‌کند (`.crt`، `.cer`، `.pem`، `/certs/`، `/ocsp`، `/crl`) | +| **مسدودسازی IP خصوصی** | محدوده‌های خصوصی IPv4/IPv6، link-local، loopback، IPهای دهدهی و فرادادهٔ ابری را مسدود می‌کند | +| **ایمنی Content-Type** | فقط انواع MIME امن گواهی را برمی‌گرداند و تزریق content-type از بالادست را مسدود می‌کند | +| **محدودیت اندازهٔ فایل** | پاسخ را با محدودیت 10MB به‌صورت جریانی ارسال می‌کند و در صورت عبور از آن، دانلود را در میانه متوقف می‌کند | +| **محدودسازی نرخ** | ۶۰ درخواست در دقیقه برای هر IP یا IPv6 /64 (نیازمند KV، در خطاهای KV باز می‌ماند) | +| **امضاهای HMAC** | امضای اختیاری سمت کاربر (بازدارندهٔ سوءاستفادهٔ معمولی) | + +### DNS rebinding (میزبانی شخصی خارج از Cloudflare) + +worker هر URL را که به یک IP خصوصی یا داخلی resolve شود رد می‌کند. نمی‌تواند از فهرست ثابتی از میزبان‌های مجاز استفاده کند، چون URLهای زنجیرهٔ گواهی به هر CA که گواهی را صادر کرده اشاره می‌کنند (FNMT، CAهای سازمانی و غیره)، پس مقصدها از پیش معلوم نیستند. این یک پنجرهٔ کوچک rebinding باقی می‌گذارد: کسی که DNS دامنهٔ خودش را اداره می‌کند می‌تواند یک IP عمومی به بررسی ایمنی و لحظه‌ای بعد یک IP خصوصی به درخواست واقعی بدهد. + +روی Cloudflare این قابل بهره‌برداری نیست: Workers نمی‌توانند به IPهای خصوصی یا endpoint فرادادهٔ `169.254.169.254` دسترسی پیدا کنند، پس rebind به جایی نمی‌رسد. فقط راه ورودی به worker ندهید: Tunnel، Service یا binding شبکهٔ خصوصی متصل نکنید (فقط به `RATE_LIMIT_KV` نیاز دارد). + +اگر این را خارج از Cloudflare (workerd، Node و مانند آن‌ها) درون یک VPC اجرا می‌کنید، محیط اجرا _می‌تواند_ به IPهای داخلی دسترسی پیدا کند. یک فایروال خروجی جلوی آن قرار دهید و محدوده‌های خصوصی را مسدود کنید: `10.0.0.0/8`، `172.16.0.0/12`، `192.168.0.0/16`، `127.0.0.0/8`، `169.254.0.0/16` و معادل‌های IPv6 آن‌ها. وقتی خارج از Cloudflare هستید، کد برنامه نمی‌تواند این را اعمال کند. + +## غیرفعال کردن پراکسی + +اگر نمی‌خواهید از پراکسی CORS استفاده کنید، متغیر محیطی را با رشتهٔ خالی تنظیم کنید: + +``` +VITE_CORS_PROXY_URL= +``` + +**نکته**: بدون پراکسی، امضا با گواهی‌هایی که به دریافت خارجی زنجیره نیاز دارند (مانند FNMT یا برخی CAهای سازمانی) با خطای "Failed to fetch" شکست می‌خورد. + +## عیب‌یابی + +### "Signing error: TypeError: Failed to fetch" + +این معمولاً یعنی یکی از این موارد: + +1. **پراکسی CORS پیکربندی نشده است**: `VITE_CORS_PROXY_URL` را تنظیم کنید و دوباره بسازید +2. **محتوای ترکیبی مسدود شده است**: سایت شما HTTPS است، اما URL صادرکنندهٔ گواهی HTTP است. پراکسی CORS این را حل می‌کند. +3. **پراکسی CORS مبدأ شما را رد می‌کند**: بررسی کنید دامنهٔ شما در آرایهٔ `ALLOWED_ORIGINS` در `cors-proxy-worker.js` باشد + +### خطای "403 Forbidden" از پراکسی + +دامنهٔ شما در فهرست `ALLOWED_ORIGINS` نیست. `cors-proxy-worker.js` را ویرایش کنید: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +سپس دوباره مستقر کنید: `npx wrangler deploy` + +### آزمایش پراکسی + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### گواهی‌هایی که بدون پراکسی کار می‌کنند + +برخی گواهی‌ها زنجیرهٔ کامل را در فایل P12/PFX دارند و به دریافت خارجی نیاز ندارند: + +- گواهی‌های خودامضا +- برخی CAهای تجاری که گواهی‌های میانی را همراه می‌کنند +- گواهی‌هایی که خودتان دستی با زنجیرهٔ کامل سرهم کرده‌اید diff --git a/docs/fa/self-hosting/docker.md b/docs/fa/self-hosting/docker.md new file mode 100644 index 00000000..94cbbe00 --- /dev/null +++ b/docs/fa/self-hosting/docker.md @@ -0,0 +1,622 @@ +# استقرار با Docker / Podman + +ساده‌ترین راه برای میزبانی شخصی BentoPDF در محیط production. + +> [!IMPORTANT] +> **سرآیندهای لازم برای تبدیل فایل‌های Office** +> +> ابزارهای مبتنی بر LibreOffice (تبدیل Word، Excel، PowerPoint) برای پشتیبانی از `SharedArrayBuffer` به این سرآیندهای HTTP نیاز دارند: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> صفحه همچنین باید از یک بستر امن (secure context) ارائه شود. `http://localhost` برای آزمایش محلی کار می‌کند، اما `http://192.168.x.x` یا دیگر IPهای شبکهٔ محلی معمولاً واجد شرایط نیستند، بنابراین تبدیل Office روی HTTP ساده حتی با وجود سرآیندها شکست می‌خورد. +> +> ایمیج‌های رسمی کانتینر این سرآیندها را دارند. اگر از پراکسی معکوس (مانند Traefik، Caddy و غیره) استفاده می‌کنید، مطمئن شوید این سرآیندها حفظ یا اضافه می‌شوند و برای دسترسی غیر loopback از HTTPS استفاده کنید. + +> [!TIP] +> **کاربران Podman:** همهٔ فرمان‌های `docker` با Podman کار می‌کنند؛ کافی است `docker` را با `podman` و `docker-compose` را با `podman-compose` جایگزین کنید. + +## شروع سریع + +> [!TIP] +> BentoPDF در دو نسخهٔ ساخت عرضه می‌شود: +> +> - **نسخهٔ میزبانی شخصی**: `ghcr.io/alam00000/bentopdf-simple:latest`. همهٔ ابزارهای PDF، **بدون** بخش‌های بازاریابی (بدون hero، پرسش‌های متداول، نظرات کاربران و پاصفحه). از این نسخه برای استقرارهای داخلی، تیمی و سازمانی استفاده کنید. این نسخه یک نسخهٔ «سبک» با قابلیت‌های کمتر **نیست**. +> - **نسخهٔ تجاری**: `ghcr.io/alam00000/bentopdf:latest`. سایت کامل بازاریابی که خود bentopdf.com و دارندگان مجوز تجاری برای استقرارهای عمومی از آن استفاده می‌کنند. +> +> اگر مطمئن نیستید: نسخهٔ میزبانی شخصی را دریافت کنید. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +فایل `docker-compose.yml` را بسازید: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +اجرا: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## ساخت ایمیج شخصی + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +ساخت و اجرا: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## متغیرهای محیطی + +| متغیر | توضیح | پیش‌فرض | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | ساخت نسخهٔ میزبانی شخصی (بخش‌های بازاریابی bentopdf.com، یعنی hero، پرسش‌های متداول، نظرات کاربران و پاصفحه را پنهان می‌کند). همهٔ ابزارهای PDF باقی می‌مانند. | `false` | +| `BASE_URL` | استقرار در زیرپوشه | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL ماژول PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL ماژول Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL ماژول CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL اسکریپت worker برای OCR | _(خالی؛ استفاده از CDN پیش‌فرض Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | پوشهٔ هستهٔ اجرایی OCR | _(خالی؛ استفاده از CDN پیش‌فرض Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | پوشهٔ traineddata برای OCR | _(خالی؛ استفاده از CDN پیش‌فرض Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | زبان‌های OCR نمایش‌داده‌شده در رابط کاربری، جداشده با کاما | _(خالی؛ نمایش فهرست کامل)_ | +| `VITE_OCR_FONT_BASE_URL` | پوشهٔ فونت‌های لایهٔ متنی OCR | _(خالی؛ استفاده از URLهای راه دور فونت Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | زبان پیش‌فرض رابط کاربری | `en` | +| `VITE_BRAND_NAME` | نام برند سفارشی | `BentoPDF` | +| `VITE_BRAND_LOGO` | مسیر لوگو نسبت به `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | متن سفارشی پاصفحه یا کپی‌رایت | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | شناسه‌های ابزارهایی که پنهان می‌شوند، جداشده با کاما | _(خالی؛ همهٔ ابزارها فعال)_ | +| `DISABLE_GITHUB_STARS` | از دریافت تعداد ستاره‌های GitHub هنگام بارگذاری صفحه صرف‌نظر می‌کند و `api.github.com` را از CSP حذف می‌کند. ساخت‌های Simple Mode همیشه از آن صرف‌نظر می‌کنند. | `false` | +| `SITE_URL` | URL عمومی که در پیوندهای canonical، hreflang و sitemap نوشته می‌شود. آن را روی پیش‌فرض نگه دارید، مگر اینکه بخواهید موتورهای جستجو استقرار شما را سایتی مستقل بدانند. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | با `SITE_URL` سفارشی، همهٔ صفحات `noindex` علامت‌گذاری می‌شوند تا نسخهٔ شما در نتایج جستجو با bentopdf.com رقابت نکند. برای اجازهٔ نمایه‌سازی به موتورهای جستجو، آن را `true` کنید. | `false` | + +URLهای ماژول‌های WASM با پیش‌فرض‌های CDN از پیش پیکربندی شده‌اند؛ همهٔ قابلیت‌های پیشرفته بلافاصله کار می‌کنند. برای استقرارهای ایزوله یا میزبانی شخصی، این‌ها را بازنویسی کنید. + +### موتورهای جستجو + +به‌طور پیش‌فرض، همهٔ صفحات bentopdf.com را به‌عنوان نسخهٔ اصلی به موتورهای جستجو معرفی می‌کنند تا استقرار شما به‌صورت تکراری نمایش داده نشود. برای یک نمونهٔ خصوصی یا داخلی نیازی به تغییر چیزی نیست. + +- **کاملاً بیرون نگه داشتن نمونهٔ شما از نتایج جستجو:** کانتینر را با `-e ROBOTS_NOINDEX=true` اجرا کنید. این فقط به راه‌اندازی مجدد نیاز دارد، نه ساخت دوباره. +- **تبدیل نمونهٔ شما به سایتی مستقل در نتایج جستجو:** با `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true` بسازید. بدون `ALLOW_INDEXING=true`، یک `SITE_URL` سفارشی همهٔ صفحات را `noindex` علامت‌گذاری می‌کند. + +### Content-Security-Policy + +ایمیج nginx با یک سرآیند `Content-Security-Policy` اجباری عرضه می‌شود. دستورهای `script-src`، `connect-src` و `font-src` در CSP **هنگام ساخت** از متغیرهای URL `VITE_*` بالا تولید می‌شوند؛ هر میزبانی که از طریق `--build-arg` بدهید به‌طور خودکار به سیاست افزوده می‌شود. + +در نتیجه: + +- اگر `VITE_CORS_PROXY_URL` یا `VITE_WASM_*_URL` را هنگام ساخت بازنویسی کنید، CSP به‌طور خودکار آن مبدأها را مجاز می‌کند؛ نیازی به پیکربندی اضافه نیست. +- برای URLهای روی `cdn.jsdelivr.net`، `script-src` فقط پوشهٔ دقیق بسته با نسخهٔ مشخص را مجاز می‌کند، برای مثال `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`، نه کل CDN را. jsDelivr هر بستهٔ عمومی npm یا مخزن GitHub را ارائه می‌کند، پس مجاز کردن کل میزبان به هر یک از آن‌ها اجازه می‌دهد روی نمونهٔ شما اجرا شوند. URLهای روی هر میزبان دیگر بر اساس مبدأ مجاز می‌شوند. +- اگر URLهای سفارشی WASM را در _زمان اجرا_ از طریق صفحهٔ «تنظیمات پیشرفته» درون برنامه پیکربندی کنید، آن مبدأها در CSP **نیستند** و مرورگر درخواست‌ها به آن‌ها را مسدود می‌کند. این برای نسخهٔ دیگری از همان بسته روی `cdn.jsdelivr.net` نیز صدق می‌کند، چون فقط نسخهٔ تنظیم‌شده هنگام ساخت مجاز است. پیکربندی زمان اجرا برای آزمایش در نظر گرفته شده است؛ برای URLهای سفارشی دائمی، build arg متناظر `VITE_*` را تنظیم کنید. +- در استقرارهای ایزوله‌ای که هر سه مقدار `VITE_WASM_*_URL` را بازنویسی می‌کنند، آن پوشه‌های بسته روی `cdn.jsdelivr.net` نیز از CSP حذف می‌شوند (هر پیش‌فرض جایگزین می‌شود، نه اینکه به آن افزوده شود). پیش‌فرض‌های Tesseract OCR روی `cdn.jsdelivr.net` تا زمانی که سه مقدار `VITE_TESSERACT_*` را نیز تنظیم نکنید در سیاست باقی می‌مانند. به همین ترتیب، تنظیم `VITE_CORS_PROXY_URL` جایگزین پیش‌فرض عمومی `bentopdf-cors-proxy.bentopdf.workers.dev` می‌شود. + +CSP شامل `'unsafe-eval'` در `script-src` است، زیرا محیط اجرایی LibreOffice WASM (که ابزارهای تبدیل Word/Excel/PowerPoint از آن استفاده می‌کنند) و کتابخانهٔ تصویر wasm-vips (که PDF به TIFF از آن استفاده می‌کند) کد توزیع داخلی را از طریق `new Function()` کامپایل می‌کنند. حذف آن این ابزارها را از کار می‌اندازد. اگر در `SIMPLE_MODE` (بدون LibreOffice) می‌سازید و به PDF به TIFF نیاز ندارید، می‌توانید فایل تولیدشدهٔ `security-headers.conf` را دستی ویرایش کنید و برای سیاستی سخت‌گیرانه‌تر `'unsafe-eval'` را حذف کنید. + +برای OCR، متغیرهای `VITE_TESSERACT_*` را خالی بگذارید تا از منابع آنلاین پیش‌فرض استفاده شود، یا برای OCR میزبانی‌شده یا آفلاین هر سه را با هم تنظیم کنید. بازنویسی‌های ناقص OCR رد می‌شوند، چون worker، هستهٔ اجرایی و پوشهٔ traineddata باید با هم سازگار باشند. برای خروجی PDF قابل‌جستجوی کاملاً آفلاین، `VITE_OCR_FONT_BASE_URL` را نیز تنظیم کنید تا فونت‌های لایهٔ متنی OCR به‌جای URLهای عمومی فونت Noto از سرور داخلی شما بارگذاری شوند. + +`VITE_DEFAULT_LANGUAGE` زبان رابط کاربری را برای بازدیدکنندگان بار اول تعیین می‌کند. مقادیر پشتیبانی‌شده: `en`، `ar`، `be`، `fr`، `de`، `es`، `zh`، `zh-TW`، `vi`، `tr`، `id`، `it`، `pt`، `nl`، `da`. کاربران همچنان می‌توانند زبان را تغییر دهند؛ این فقط پیش‌فرض را تغییر می‌دهد. + +مثال: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### برندسازی سفارشی + +لوگو، نام و متن پاصفحهٔ پیش‌فرض BentoPDF را با موارد خودتان جایگزین کنید. فایل لوگوی خود را در پوشهٔ `public/` قرار دهید (یا از یک تصویر موجود استفاده کنید)، سپس متغیرهای برندسازی را هنگام ساخت ارسال کنید: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +برندسازی هم در حالت کامل و هم در Simple Mode کار می‌کند و با همهٔ گزینه‌های دیگر زمان ساخت قابل ترکیب است. + +### غیرفعال کردن ابزارهای مشخص + +ابزارها را برای الزامات انطباق یا امنیتی از رابط کاربری پنهان کنید. ابزارهای غیرفعال از صفحهٔ اصلی، نتایج جستجو، میان‌برهای صفحه‌کلید و سازندهٔ گردش کار حذف می‌شوند. دسترسی مستقیم از طریق URL صفحهٔ «ابزار در دسترس نیست» را نشان می‌دهد. + +شناسهٔ ابزار همان URL صفحه بدون `.html` است. برای مثال، اگر ابزار در `bentopdf.com/edit-pdf.html` باشد، شناسه `edit-pdf` است. + +#### یافتن شناسهٔ ابزارها + +ساده‌ترین راه: هر ابزاری را در BentoPDF باز کنید و به URL نگاه کنید. بخش آخر مسیر (بدون `.html`) شناسهٔ ابزار است. + +
+فهرست کامل شناسه‌های ابزارها + +**ویرایش و حاشیه‌نویسی:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**تبدیل به PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**تبدیل از PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**سازماندهی و مدیریت:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**بهینه‌سازی و تعمیر:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**امنیت:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### گزینهٔ ۱: زمان ساخت (Docker build arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +این کار فهرست غیرفعال‌ها را در بستهٔ JavaScript قرار می‌دهد. تغییر آن به ساخت دوباره نیاز دارد. + +#### گزینهٔ ۲: زمان اجرا (config.json) + +یک فایل `config.json` را در پوشهٔ ارائه‌شده mount کنید؛ نیازی به ساخت دوباره نیست: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +یا با Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +هر دو روش قابل ترکیب هستند؛ فهرست‌ها ادغام می‌شوند. اگر ابزاری در هر یک از آن‌ها باشد، غیرفعال می‌شود. + +#### غیرفعال کردن قابلیت‌های ویرایشگر + +همچنین می‌توانید قابلیت‌های مشخصی را در ویرایشگر PDF (مثلاً حذف محتوای حساس، حاشیه‌نویسی‌ها، فرم‌ها) بدون غیرفعال کردن کل ابزار ویرایشگر غیرفعال کنید. `editorDisabledCategories` را به `config.json` خود اضافه کنید: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+فهرست کامل دسته‌های ویرایشگر + +**بزرگنمایی:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**حاشیه‌نویسی:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**اشکال:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**فرم:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**حذف محتوای حساس:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**سند:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**صفحه:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**پنل:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**ابزارها:** `tools`, `pan`, `pointer`, `capture` + +**انتخاب:** `selection`, `selection-copy` + +**تاریخچه:** `history`, `history-undo`, `history-redo` + +
+ +دسته‌ها سلسله‌مراتبی هستند؛ غیرفعال کردن یک والد (مثلاً `annotation`) همهٔ فرزندان آن را غیرفعال می‌کند. + +### غیرفعال کردن شمارندهٔ ستاره‌های GitHub + +نوار ناوبری تعداد زندهٔ ستاره‌های GitHub را نشان می‌دهد که هنگام بارگذاری صفحه از `api.github.com` دریافت می‌شود. این تنها درخواست خارجی است که به یک قابلیت PDF مربوط نیست. آن را هنگام ساخت غیرفعال کنید تا کد دریافت از بسته حذف شود و `api.github.com` از Content-Security-Policy کنار گذاشته شود: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +ساخت‌های Simple Mode (`bentopdf-simple`) همیشه از شمارندهٔ ستاره صرف‌نظر می‌کنند؛ این پرچم فقط در نسخهٔ تجاری یا ساخت‌های کامل سفارشی لازم است. + +### URLهای سفارشی WASM (ایزوله / میزبانی شخصی) + +> [!IMPORTANT] +> URLهای WASM **هنگام ساخت** در JavaScript قرار می‌گیرند. فایل‌های WASM در زمان اجرا توسط **مرورگر کاربر** دانلود می‌شوند؛ Docker آن‌ها را هنگام ساخت دانلود نمی‌کند. برای شبکه‌های ایزوله، باید فایل‌های WASM را روی یک سرور داخلی که مرورگرها به آن دسترسی دارند میزبانی کنید. + +**روند کامل محیط ایزوله:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +برای `--ocr-languages` از کدهایی استفاده کنید که `bash scripts/prepare-airgap.sh --list-ocr-languages` چاپ می‌کند، یا با `bash scripts/prepare-airgap.sh --search-ocr-language ` بر اساس نام جستجو کنید. وقتی با زیرمجموعهٔ محدودی از زبان‌های OCR می‌سازید، همان کدها را به `VITE_TESSERACT_AVAILABLE_LANGUAGES` بدهید تا برنامه فقط زبان‌های همراه را نشان دهد. برای خروجی OCR کاملاً آفلاین، پوشهٔ همراه `ocr-fonts/` را نیز میزبانی کنید و `VITE_OCR_FONT_BASE_URL` را به آن اشاره دهید. + +یک متغیر را با رشتهٔ خالی تنظیم کنید تا آن ماژول غیرفعال شود (کاربران باید آن را دستی از طریق «تنظیمات پیشرفته» پیکربندی کنند). + +## پورت سفارشی + +به‌طور پیش‌فرض، BentoPDF درون کانتینر روی پورت `8080` گوش می‌دهد. برای تغییر آن، متغیر محیطی `PORT` را در زمان اجرا تنظیم کنید: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| متغیر | توضیح | پیش‌فرض | +| ------ | -------------------------- | ------- | +| `PORT` | پورت شنود Nginx در کانتینر | `8080` | + +این با هر دو Dockerfile استاندارد و nonroot کار می‌کند. + +## شناسهٔ کاربر سفارشی (PUID/PGID) + +برای محیط‌هایی که اجرا با یک کاربر غیر root مشخص را لازم دارند (دستگاه‌های NAS، Kubernetes با security context، سیاست‌های سازمانی)، BentoPDF یک Dockerfile جداگانه با پشتیبانی PUID/PGID به سبک LSIO ارائه می‌دهد. + +### ساخت و اجرا + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### متغیرهای محیطی + +| متغیر | توضیح | پیش‌فرض | +| -------------- | ---------------------- | ------- | +| `PUID` | شناسهٔ کاربر برای اجرا | `1000` | +| `PGID` | شناسهٔ گروه برای اجرا | `1000` | +| `PORT` | پورت شنود Nginx | `8080` | +| `DISABLE_IPV6` | غیرفعال کردن شنود IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### نحوهٔ کار + +کانتینر با root شروع می‌شود، کاربری با PUID/PGID مشخص‌شده می‌سازد، مالکیت همهٔ پوشه‌های قابل‌نوشتن را تنظیم می‌کند و سپس با `su-exec` از دسترسی‌ها صرف‌نظر می‌کند. فرایند nginx کاملاً با کاربر مشخص‌شدهٔ شما اجرا می‌شود. + +> [!NOTE] +> `Dockerfile` استاندارد از `nginx-unprivileged` (UID 101) استفاده می‌کند و برای بیشتر استقرارها توصیه می‌شود. فقط وقتی به UID/GID مشخصی نیاز دارید از `Dockerfile.nonroot` استفاده کنید. + +> [!WARNING] +> PUID/PGID نمی‌تواند `0` (root) باشد. entrypoint ورودی‌ها را اعتبارسنجی می‌کند و برای مقادیر نامعتبر با خطا خارج می‌شود. + +## با Traefik (پراکسی معکوس) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## با Caddy (پراکسی معکوس) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## محدودیت منابع + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (یکپارچگی با Systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) به شما امکان می‌دهد کانتینرهای Podman را به‌صورت سرویس‌های systemd اجرا کنید. این برای استقرارهای production روی سیستم‌های Linux ایدئال است. + +### راه‌اندازی پایهٔ Quadlet + +یک فایل واحد کانتینر در `~/.config/containers/systemd/bentopdf.container` (کاربر) یا `/etc/containers/systemd/bentopdf.container` (سیستم) بسازید: + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### فعال‌سازی و شروع + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> برای استقرار در سطح سیستم، از `systemctl` بدون پرچم `--user` استفاده کنید و فایل را در `/etc/containers/systemd/` قرار دهید. + +### Quadlet با بررسی سلامت + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### به‌روزرسانی خودکار با Quadlet + +Podman می‌تواند هنگام در دسترس بودن ایمیج‌های جدید، کانتینرها را به‌طور خودکار به‌روز کند: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### پیکربندی شبکهٔ Quadlet + +برای پیکربندی شبکهٔ سفارشی، یک فایل شبکه به نام `bentopdf.network` بسازید: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +سپس در فایل کانتینر خود به آن ارجاع دهید: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## به‌روزرسانی + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/fa/self-hosting/hostinger.md b/docs/fa/self-hosting/hostinger.md new file mode 100644 index 00000000..648bac1f --- /dev/null +++ b/docs/fa/self-hosting/hostinger.md @@ -0,0 +1,267 @@ +# استقرار روی Hostinger + +[Hostinger](https://hostinger.com) یک ارائه‌دهندهٔ محبوب میزبانی اشتراکی است. این راهنما استقرار BentoPDF روی میزبانی اشتراکی Hostinger را پوشش می‌دهد. + +## پیش‌نیازها + +- طرح میزبانی Hostinger با دسترسی به File Manager +- Node.js نصب‌شده به‌صورت محلی برای ساخت + +## گام ۱: ساخت پروژه + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +فایل‌های ساخته‌شده در پوشهٔ `dist` قرار می‌گیرند. + +## گام ۲: بارگذاری روی Hostinger + +### استقرار در دامنهٔ اصلی + +1. وارد حساب Hostinger خود شوید +2. به **File Manager** ← **public_html** بروید +3. همهٔ فایل‌های موجود را **حذف** کنید (در صورت نیاز پشتیبان بگیرید) +4. همهٔ محتوای پوشهٔ محلی `dist` را در `public_html` **بارگذاری** کنید + +### استقرار در زیرپوشه + +اگر در یک زیرپوشه مستقر می‌کنید (مثلاً `yourdomain.com/pdf-tools/`): + +1. با base URL درست بسازید: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. پوشه را در Hostinger بسازید: + - به **File Manager** ← **public_html** بروید + - یک پوشهٔ جدید بسازید: `pdf-tools` + +3. همهٔ محتوای `dist` را در `public_html/pdf-tools/` بارگذاری کنید + +## گام ۳: ساخت فایل .htaccess + +یک فایل `.htaccess` در ریشهٔ پوشهٔ استقرار خود (`public_html` یا `public_html/pdf-tools/`) بسازید: + +::: warning مهم +برای استقرار در زیرپوشه، `RewriteBase /` را به `RewriteBase /pdf-tools/` (یا نام پوشهٔ خود) تغییر دهید. +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## نمونهٔ .htaccess برای زیرپوشه + +برای `yourdomain.com/pdf-tools/`، این خطوط را به‌روز کنید: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## عیب‌یابی + +### فایل‌های WASM بارگذاری نمی‌شوند + +مطمئن شوید انواع MIME در `.htaccess` درست تنظیم شده‌اند: + +```apache +AddType application/wasm .wasm +``` + +### ابزارهای LibreOffice کار نمی‌کنند + +سرآیندهای امنیتی برای SharedArrayBuffer حیاتی هستند: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +اگر سرآیندها اعمال نمی‌شوند، با پشتیبانی Hostinger تماس بگیرید تا `mod_headers` را فعال کنند. + +### خطاهای 404 هنگام بازخوانی صفحه + +مطمئن شوید قاعدهٔ پسوند `.html` و مسیرهای زبان درست پیکربندی شده‌اند. BentoPDF از فایل‌های HTML ایستا استفاده می‌کند، نه مسیریابی SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### محدودیت‌های بارگذاری فایل + +Hostinger ممکن است محدودیت اندازهٔ فایل داشته باشد. اگر بارگذاری گروهی شکست خورد، فایل‌های WASM را جداگانه بارگذاری کنید. diff --git a/docs/fa/self-hosting/index.md b/docs/fa/self-hosting/index.md new file mode 100644 index 00000000..41a0cdcd --- /dev/null +++ b/docs/fa/self-hosting/index.md @@ -0,0 +1,538 @@ +# راهنمای میزبانی شخصی + +BentoPDF را می‌توان روی زیرساخت خودتان میزبانی کرد. این راهنما گزینه‌های مختلف استقرار را پوشش می‌دهد. + +## شروع سریع با Docker / Podman + +سریع‌ترین راه برای میزبانی شخصی BentoPDF: + +> [!TIP] +> BentoPDF در دو نسخهٔ ساخت عرضه می‌شود: +> +> - **نسخهٔ میزبانی شخصی**: `ghcr.io/alam00000/bentopdf-simple:latest`. همهٔ ابزارهای PDF، **بدون** بخش‌های تبلیغاتی (بدون hero، پرسش‌های متداول، نظرات کاربران، پاورقی). از این نسخه برای استقرارهای داخلی، تیمی یا سازمانی استفاده کنید. این نسخه یک نسخهٔ «سبک» با امکانات کمتر **نیست**. +> - **نسخهٔ تجاری**: `ghcr.io/alam00000/bentopdf:latest`. سایت کامل تبلیغاتی که خود bentopdf.com و دارندگان مجوز تجاری برای استقرارهای عمومی از آن استفاده می‌کنند. +> +> اگر مطمئن نیستید: نسخهٔ میزبانی شخصی را دریافت کنید. + +> [!IMPORTANT] +> تبدیل فایل‌های Office به `SharedArrayBuffer` نیاز دارد، یعنی برنامه باید هم جداسازی‌شده بین مبدأها (cross-origin isolated) باشد و هم از یک بستر امن ارائه شود. ایمیج رسمی از قبل هدرهای لازم COOP/COEP را ارسال می‌کند، اما مرورگرها همچنان `SharedArrayBuffer` را روی مبداهای HTTP ساده در شبکهٔ محلی مانند `http://192.168.x.x` غیرفعال می‌کنند. +> +> از `http://localhost` فقط برای آزمایش روی همان دستگاه استفاده کنید. اگر کاربران از طریق IP یا نام میزبان شبکهٔ محلی به BentoPDF دسترسی دارند، آن را با HTTPS ارائه کنید. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +یا با Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +BentoPDF را به‌عنوان یک سرویس systemd اجرا کنید. فایل `~/.config/containers/systemd/bentopdf.container` را بسازید: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +برای مستندات کامل Quadlet، [راهنمای استقرار با Docker](/fa/self-hosting/docker) را ببینید. + +## ساخت از کد منبع + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## گزینه‌های پیکربندی + +### نسخهٔ میزبانی شخصی (Simple Mode) + +نسخهٔ میزبانی شخصی (ایمیج `bentopdf-simple` که Simple Mode هم نامیده می‌شود) از نظر عملکرد **کاملاً یکسان** با نسخهٔ تجاری است؛ همهٔ ابزارهای PDF وجود دارند و یکسان رفتار می‌کنند. این نسخه فقط بخش‌های تبلیغاتی را پنهان می‌کند که تنها روی خود bentopdf.com یا یک استقرار عمومی تجاری معنا دارند. **این نسخه یک نسخهٔ «سبک» یا با امکانات کمتر نیست.** + +**آنچه نسخهٔ میزبانی شخصی پنهان می‌کند** (فقط ظاهری؛ هیچ قابلیت PDF حذف نمی‌شود): + +- نوار پیمایش، بخش hero، بخش ویژگی‌ها، پرسش‌های متداول، نظرات کاربران، پاورقی +- عنوان صفحه را به «ابزارهای PDF» تغییر می‌دهد + +**آنچه نسخهٔ میزبانی شخصی نگه می‌دارد** (هر چیزی که واقعاً کار PDF انجام می‌دهد): + +- همهٔ ابزارهای PDF (ادغام، تقسیم، ویرایش، امضا، OCR، تبدیل Office و غیره) +- پشتیبانی از برندسازی سفارشی، همهٔ پیکربندی‌های زمان ساخت و زمان اجرا + +نسخهٔ تجاری (`ghcr.io/alam00000/bentopdf:latest`) همان چیزی است که خود bentopdf.com را اجرا می‌کند و دارندگان مجوز تجاری برای استقرارهای عمومی از آن استفاده می‌کنند؛ این نسخه hero، پرسش‌های متداول، نظرات کاربران و پاورقی را اضافه می‌کند که برای یک ابزار داخلی معنایی ندارند. + +اگر BentoPDF را برای تیم یا سازمان خود یا به‌عنوان یک ابزار داخلی میزبانی می‌کنید، نسخهٔ میزبانی شخصی را دریافت کنید: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +برای جزئیات کامل [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) را ببینید. + +### نسخهٔ تجاری (استقرارهای عمومی با برند خودتان) + +نسخهٔ تجاری (ایمیج `bentopdf`، بدون پسوند `-simple`) همان چیزی است که خود bentopdf.com را اجرا می‌کند. این نسخه علاوه بر همهٔ ابزارهای PDF، سایت کامل تبلیغاتی (hero، ویژگی‌ها، پرسش‌های متداول، نظرات کاربران، پاورقی) را دارد. وقتی می‌خواهید **BentoPDF را به‌عنوان یک سرویس عمومی PDF با برند خودتان مستقر کنید** از این نسخه استفاده کنید، برای مثال: + +- BentoPDF را به‌عنوان یک SaaS میزبانی‌شده برای کاربران نهایی روی دامنهٔ خودتان اجرا می‌کنید +- تجربهٔ صفحهٔ فرود (بخش‌های تبلیغاتی + ابزارها) را می‌خواهید، نه فقط ابزارهای خالی +- دارندهٔ مجوز تجاری هستید و BentoPDF را در یک محصول تجاری جاسازی می‌کنید + +**اجرای بدون تغییر** (با برند BentoPDF؛ برای پیش‌نمایش نسخه مفید است): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**ساخت با برند خودتان** (گردش کار معمول تجاری): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +همهٔ گزینه‌های دیگر زمان ساخت (`BASE_URL`، `VITE_DEFAULT_LANGUAGE`، `DISABLE_TOOLS`، بازنویسی URLهای WASM و غیره) دقیقاً مانند نسخهٔ میزبانی شخصی کار می‌کنند. + +::: warning مجوز +اجرای نسخهٔ تجاری تحت هر یک از دو گزینهٔ مجوز BentoPDF مجاز است: + +- **AGPL-3.0** (رایگان): مجاز است اگر استقرار شما کد منبع کامل خود را تحت AGPL منتشر کند، از جمله هرگونه تغییر برندسازی و منطق تجاری پیرامون آن. +- **مجوز تجاری** (۷۹ دلار مادام‌العمر): برای استقرارهای بسته یا اختصاصی لازم است که فورک برندسازی یا کد تجاری خود را متن‌باز نمی‌کنید. + +برای مقایسهٔ کامل [صفحهٔ مجوزها](https://www.bentopdf.com/licensing) را ببینید. ماژول‌های WASM با مجوز AGPL (PyMuPDF، Ghostscript، CoherentPDF) در زمان اجرا از یک CDN بارگذاری می‌شوند، بنابراین وارد ایمیج شما نمی‌شوند و وضعیت مجوز شما را تغییر نمی‌دهند. +::: + +### URL پایه + +استقرار در یک زیرپوشه: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### برندسازی سفارشی + +لوگو، نام و متن پاورقی پیش‌فرض BentoPDF را در زمان ساخت با موارد خودتان جایگزین کنید: + +| متغیر | توضیح | پیش‌فرض | +| ------------------ | ------------------------------------------ | --------------------------------------- | +| `VITE_BRAND_NAME` | نام برند نمایش‌داده‌شده در سرصفحه و پاورقی | `BentoPDF` | +| `VITE_BRAND_LOGO` | مسیر لوگو نسبت به `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | متن سفارشی پاورقی/حق نشر | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +یا از طریق Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +برندسازی هم در حالت کامل و هم در Simple Mode کار می‌کند و می‌توان آن را با همهٔ گزینه‌های دیگر زمان ساخت (`BASE_URL`، `SIMPLE_MODE`، `VITE_DEFAULT_LANGUAGE`) ترکیب کرد. + +### غیرفعال کردن ابزارهای خاص + +ابزارهای جداگانه را برای انطباق یا امنیت پنهان کنید. ابزارهای غیرفعال از صفحهٔ اصلی، جستجو، میان‌برها، سازندهٔ گردش کار و دسترسی مستقیم با URL حذف می‌شوند. + +شناسهٔ ابزارها همان URL صفحه بدون `.html` است؛ هر ابزاری را باز کنید و به URL نگاه کنید (مثلاً `edit-pdf`، `sign-pdf`، `encrypt-pdf`). + +**زمان ساخت** (درون بسته قرار می‌گیرد): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**زمان اجرا** (بدون نیاز به ساخت دوباره؛ یک `config.json` را mount کنید): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +هر دو روش را می‌توان ترکیب کرد؛ فهرست‌ها با هم ادغام می‌شوند. + +همچنین می‌توانید با افزودن `editorDisabledCategories` به `config.json`، قابلیت‌های خاصی را درون ویرایشگر PDF (مثلاً سانسور) غیرفعال کنید، بدون اینکه کل ابزار غیرفعال شود. برای فهرست کامل دسته‌ها [راهنمای Docker](/fa/self-hosting/docker#غیرفعال-کردن-قابلیت‌های-ویرایشگر) را ببینید. + +## راهنماهای استقرار + +پلتفرم خود را انتخاب کنید: + +- [Vercel](/fa/self-hosting/vercel) +- [Netlify](/fa/self-hosting/netlify) +- [Cloudflare Pages](/fa/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/fa/self-hosting/aws) +- [Hostinger](/fa/self-hosting/hostinger) +- [Nginx](/fa/self-hosting/nginx) +- [Apache](/fa/self-hosting/apache) +- [Docker](/fa/self-hosting/docker) +- [Kubernetes](/fa/self-hosting/kubernetes) +- [پراکسی CORS](/fa/self-hosting/cors-proxy) - برای امضاهای دیجیتال لازم است + +## مشکلات رایج + +### تبدیل Word / ODT / Excel / PowerPoint به PDF متوقف می‌شود (SharedArrayBuffer در دسترس نیست) + +**نشانه**: تبدیل‌های اسناد مبتنی بر LibreOffice (Word، ODT، Excel، PowerPoint به PDF) در حدود ۵۵٪ متوقف می‌شوند یا شروع نمی‌شوند. کنسول مرورگر ممکن است این را نشان دهد: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…یا `window.crossOriginIsolated` مقدار `false` را گزارش می‌کند، یا کامپایل WASM خطای `expected magic word 00 61 73 6d, found 1f 8b 08 08` را می‌دهد. + +**علت**: LibreOffice WASM به `SharedArrayBuffer` نیاز دارد که مرورگر فقط وقتی آن را فعال می‌کند که صفحه **جداسازی‌شده بین مبدأها (cross-origin isolated)** باشد و از یک **بستر امن** ارائه شود. یعنی دو شرط باید برقرار باشد: + +1. هر پاسخ هر دو هدر را داشته باشد: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. صفحه از `https://...` یا `http://localhost` ارائه شود. HTTP ساده روی IP شبکهٔ محلی (مثلاً `http://192.168.x.x`) امن به حساب نمی‌آید و مرورگرها `SharedArrayBuffer` را در آنجا غیرفعال می‌کنند. + +ناسازگاری `00 61 73 6d / 1f 8b 08 08` یک نشانهٔ فرعی جداگانه است: فایل‌های از پیش فشرده‌شدهٔ `.wasm.gz` / `.data.gz` هدر پاسخ `Content-Encoding: gzip` را ندارند، بنابراین مرورگر به‌جای WASM از حالت فشرده خارج‌شده، بایت‌های خام gzip را دریافت می‌کند. + +**راه‌حل**: برای پیکربندی دقیق، راهنمای استقرار پلتفرم خود را ببینید: + +- [Nginx ←](/fa/self-hosting/nginx#تبدیل-word-odt-excel-به-pdf-کار-نمی‌کند) +- [Apache ←](/fa/self-hosting/apache#تبدیل-word-odt-excel-به-pdf-کار-نمی‌کند) +- [AWS S3 + CloudFront ←](/fa/self-hosting/aws#گام-۳b-سیاست-سرآیندهای-پاسخ-لازم-برای-libreoffice-wasm) +- [Cloudflare Pages ←](/fa/self-hosting/cloudflare#فایل-پیکربندی) (فایل `_headers`) +- [Netlify ←](/fa/self-hosting/netlify#تبدیل-word-odt-excel-به-pdf-در-۵۵٪-متوقف-می‌شود) (`netlify.toml`) +- [Vercel ←](/fa/self-hosting/vercel#تبدیل-word-odt-excel-به-pdf-کار-نمی‌کند) (`vercel.json`) +- [Hostinger ←](/fa/self-hosting/hostinger#ابزارهای-libreoffice-کار-نمی‌کنند) (`.htaccess`) +- [Kubernetes ←](/fa/self-hosting/kubernetes#اطمینان-از-کارکرد-هدرهای-sharedarraybuffer-ingress-gateway) +- **Docker**: به‌طور خودکار توسط پیکربندی nginx همراه انجام می‌شود؛ نیازی به اقدام نیست. + +**بررسی**: Console در DevTools را روی هر صفحهٔ BentoPDF باز کنید و اجرا کنید: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +اگر صفحه HTTPS یا `http://localhost` باشد و هر دو هدر COEP/COOP روی همهٔ پاسخ‌ها وجود داشته باشند، هر دو بررسی موفق می‌شوند. اگر روی `http://192.168.x.x` یا مبدأ HTTP دیگری غیر از loopback هستید، آن را با HTTPS ارائه کنید؛ هیچ راه‌حلی فقط با هدر وجود ندارد. + +### فایل‌های `.mjs` با `application/octet-stream` ارائه می‌شوند + +**نشانه**: امضای PDF / پرکنندهٔ فرم / برخی ابزارهای دیگر نمایشگر خالی نشان می‌دهند یا بارگذاری نمی‌شوند. کنسول مرورگر گزارش می‌دهد: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**علت**: وب‌سرور یا پراکسی معکوس شما نگاشت نوع MIME برای فایل‌های `.mjs` ندارد (نمایشگر PDF همراه، ماژول‌های ES را با این پسوند ارائه می‌دهد). بسیاری از پیکربندی‌های پیش‌فرض سرور برای پسوندهای ناشناخته از `application/octet-stream` استفاده می‌کنند که مرورگرها از اجرای آن به‌عنوان ماژول ES خودداری می‌کنند. + +**راه‌حل**: برای قطعه‌کد دقیق، راهنمای استقرار پلتفرم خود را ببینید: + +- [Nginx ←](/fa/self-hosting/nginx#امضای-pdf-یا-پرکنندهٔ-فرم-نمایشگر-خالی-نشان-می‌دهد-خطای-mime-برای-mjs) +- [Apache ←](/fa/self-hosting/apache#امضای-pdf-یا-پرکنندهٔ-فرم-نمایشگر-خالی-نشان-می‌دهد-خطای-mime-برای-mjs) +- [AWS S3 + CloudFront ←](/fa/self-hosting/aws#گام-۲-ساخت-و-بارگذاری) (`aws s3 cp ... --include "*.mjs"` را ببینید) +- [Kubernetes ←](/fa/self-hosting/kubernetes#خطاهای-نوع-mime-برای-mjs-خالی-بودن-iframe-امضای-pdf-پرکنندهٔ-فرم) +- **Docker، Vercel، Netlify، Cloudflare Pages، Hostinger**: به‌طور خودکار انجام می‌شود؛ نیازی به اقدام نیست. + +**بررسی**: DevTools ← زبانهٔ Network را باز کنید، درخواست ناموفق `.mjs` را پیدا کنید و هدر پاسخ `Content-Type` را بررسی کنید. باید `application/javascript` باشد. اگر هنوز `application/octet-stream` است، ممکن است یک پراکسی معکوس بیرونی یا CDN نوع را دوباره تشخیص دهد؛ هر لایه از زنجیرهٔ ارائهٔ خود را بررسی کنید. + +## پیکربندی WASM (اجزای AGPL) + +BentoPDF کتابخانه‌های پردازشی با مجوز AGPL را در کد منبع خود **همراه نمی‌کند**، اما **URLهای CDN را از پیش پیکربندی می‌کند** تا همهٔ قابلیت‌ها بی‌درنگ کار کنند؛ نیازی به راه‌اندازی دستی نیست. + +::: tip بدون پیکربندی به‌طور پیش‌فرض +از نسخهٔ v2.0.0، ماژول‌های WASM از طریق متغیرهای محیطی برای بارگذاری از CDN jsDelivr از پیش پیکربندی شده‌اند. همهٔ قابلیت‌های پیشرفته بدون هیچ پیکربندی از سوی کاربر بی‌درنگ کار می‌کنند. +::: + +| جزء | مجوز | قابلیت‌ها | +| --------------- | -------- | ----------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | تبدیل EPUB/MOBI/FB2/XPS، استخراج تصویر، استخراج جدول | +| **Ghostscript** | AGPL-3.0 | تبدیل PDF/A، فشرده‌سازی، صاف‌کردن کجی، تبدیل به تصویر | +| **CoherentPDF** | AGPL-3.0 | فهرست مطالب، پیوست‌ها، ادغام PDF با نشانک‌ها | + +### متغیرهای محیطی پیش‌فرض + +این‌ها در `.env.production` تنظیم شده‌اند و درون نسخهٔ ساخت قرار می‌گیرند: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### بازنویسی URLهای WASM + +می‌توانید پیش‌فرض‌ها را در زمان ساخت برای استقرارهای سفارشی بازنویسی کنید: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +برای غیرفعال کردن کامل یک ماژول (نیاز به پیکربندی دستی کاربر از طریق تنظیمات پیشرفته)، متغیر آن را روی رشتهٔ خالی تنظیم کنید. + +برای OCR، یا همهٔ متغیرهای `VITE_TESSERACT_*` را خالی بگذارید و از دارایی‌های آنلاین پیش‌فرض استفاده کنید، یا URLهای worker/core/lang را با هم برای OCR میزبانی‌شده یا آفلاین تنظیم کنید. اگر فقط زبان‌های OCR خاصی را همراه می‌کنید، `VITE_TESSERACT_AVAILABLE_LANGUAGES` را نیز روی همان کدهای جداشده با ویرگول تنظیم کنید تا رابط کاربری فقط زبان‌های نصب‌شده را پیشنهاد دهد و انتخاب‌های پشتیبانی‌نشده با خطای توصیفی شکست بخورند. برای خروجی PDF قابل جستجوی کاملاً آفلاین، `VITE_OCR_FONT_BASE_URL` را نیز روی پوشهٔ داخلی که قلم‌های OCR همراه را ارائه می‌دهد تنظیم کنید. + +کاربران همچنین می‌توانند هر زمان این پیش‌فرض‌ها را از طریق **تنظیمات پیشرفته** در رابط کاربری بازنویسی کنند؛ بازنویسی‌های کاربر که در مرورگر ذخیره می‌شوند بر پیش‌فرض‌های محیطی اولویت دارند. + +### استقرار ایزوله / آفلاین + +برای شبکه‌های بدون دسترسی به اینترنت (دولتی، درمانی، مالی و غیره). URLهای WASM در **زمان ساخت** درون JavaScript قرار می‌گیرند؛ فایل‌های واقعی WASM در زمان اجرا توسط **مرورگر کاربر** دانلود می‌شوند. بنابراین باید همه چیز را روی دستگاهی با اینترنت آماده کنید و سپس به شبکهٔ ایزوله منتقل کنید. + +#### اسکریپت خودکار (پیشنهادی) + +اسکریپت همراه `prepare-airgap.sh` کل فرایند را خودکار می‌کند: دانلود بسته‌های WASM، ساخت ایمیج Docker و تولید یک بستهٔ مستقل همراه با اسکریپت راه‌اندازی. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +این یک پوشهٔ بسته تولید می‌کند: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +بسته را از طریق USB، مخزن داخلی آرتیفکت یا روش تأییدشده به شبکهٔ ایزوله منتقل کنید. سپس اسکریپت راه‌اندازی همراه را اجرا کنید: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +اسکریپت راه‌اندازی ایمیج Docker را بارگذاری می‌کند، فایل‌های WASM را استخراج می‌کند و در صورت تمایل کانتینر را اجرا می‌کند. + +**گزینه‌های اسکریپت:** + +| پرچم | توضیح | پیش‌فرض | +| ------------------------------ | ---------------------------------------------------------------- | -------------------------------------- | +| `--wasm-base-url ` | محل میزبانی داخلی WASMها | _(الزامی، در صورت نبود پرسیده می‌شود)_ | +| `--image-name ` | برچسب ایمیج Docker | `bentopdf` | +| `--output-dir ` | پوشهٔ خروجی بسته | `./bentopdf-airgap-bundle` | +| `--simple-mode` | فعال کردن Simple Mode | خاموش | +| `--base-url ` | URL پایهٔ زیرپوشه (مثلاً `/pdf/`) | `/` | +| `--language ` | زبان پیش‌فرض رابط کاربری (مثلاً `fr`، `de`) | _(هیچ)_ | +| `--brand-name ` | نام برند سفارشی | _(هیچ)_ | +| `--brand-logo ` | مسیر لوگو نسبت به `public/` | _(هیچ)_ | +| `--footer-text ` | متن سفارشی پاورقی | _(هیچ)_ | +| `--ocr-languages ` | زبان‌های OCR برای همراه کردن، جداشده با ویرگول | `eng` | +| `--list-ocr-languages` | چاپ کدها و نام‌های OCR پشتیبانی‌شده و سپس خروج | خاموش | +| `--search-ocr-language ` | جستجوی کدهای OCR بر اساس نام یا اختصار | خاموش | +| `--dockerfile ` | Dockerfile مورد استفاده | `Dockerfile` | +| `--skip-docker` | رد شدن از ساخت و خروجی گرفتن Docker | خاموش | +| `--skip-wasm` | رد شدن از دانلود WASM (استفادهٔ دوباره از فایل‌های `.tgz` موجود) | خاموش | + +ورودی تعاملی همچنین `list` را برای چاپ فهرست کامل کدهای پشتیبانی‌شدهٔ Tesseract و `search ` را برای یافتن موارد منطبق مانند `search german` یا `search chi` می‌پذیرد. + +::: warning الزام هم‌مبدأ بودن +فایل‌های WASM باید از **همان مبدأ** برنامهٔ BentoPDF ارائه شوند. Web Workerها از `importScripts()` استفاده می‌کنند که نمی‌تواند اسکریپت‌ها را از مبدأ دیگری بارگذاری کند. برای مثال، اگر BentoPDF روی `https://internal.example.com` اجرا می‌شود، URL پایه برای WASM نیز باید `https://internal.example.com/wasm` باشد. +::: + +#### گام‌های دستی + +
+اگر ترجیح می‌دهید بدون اسکریپت و به‌صورت دستی انجام دهید + +**گام ۱: دانلود بسته‌های WASM و OCR** (روی دستگاهی با اینترنت) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**گام ۲: ساخت ایمیج Docker با URLهای داخلی** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**گام ۳: خروجی گرفتن از ایمیج Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**گام ۴: انتقال به شبکهٔ ایزوله** + +از طریق USB، مخزن داخلی آرتیفکت یا روش انتقال تأییدشده کپی کنید: + +- `bentopdf.tar`: ایمیج Docker +- پنج بستهٔ `.tgz` مربوط به WASM/OCR از گام ۱ +- پوشهٔ `tesseract-langdata/` از گام ۱ +- پوشهٔ `ocr-fonts/` از گام ۱ + +**گام ۵: راه‌اندازی درون شبکهٔ ایزوله** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +مطمئن شوید فایل‌ها در URLهایی که در گام ۲ پیکربندی کردید در دسترس هستند، از جمله `.../ocr/worker.min.js`، `.../ocr/core`، `.../ocr/lang-data` و `.../ocr/fonts`. + +
+ +::: info به‌جای Docker از کد منبع می‌سازید؟ +پیش از اجرای `npm run build`، متغیرها را در `.env.production` تنظیم کنید: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### میزبانی پراکسی WASM خودتان + +اگر لازم است فایل‌های WASM با مجوز AGPL را با هدرهای CORS مناسب ارائه کنید، می‌توانید یک پراکسی ساده مستقر کنید. برای نمونه پیاده‌سازی، [راهنمای Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) را ببینید. + +::: tip چرا جداگانه؟ +این جداسازی تضمین می‌کند: + +- انطباق حقوقی روشن برای کاربران تجاری +- هستهٔ BentoPDF تحت مجوز دوگانهٔ خود (AGPL-3.0 / تجاری) باقی می‌ماند +- فایل‌های WASM در زمان اجرا بارگذاری می‌شوند، نه اینکه در کد منبع همراه شوند + ::: + +## نیازمندی‌های سیستم + +| نیازمندی | حداقل | +| --------------- | ------------------------------------------- | +| فضای ذخیره‌سازی | حدود ۱۰۰ مگابایت (هسته بدون ماژول‌های AGPL) | +| RAM | ۵۱۲ مگابایت | +| CPU | هر پردازندهٔ مدرن | + +::: tip +BentoPDF یک سایت ایستاست؛ به هیچ پایگاه داده یا سرور بک‌اندی نیاز نیست! +::: diff --git a/docs/fa/self-hosting/kubernetes.md b/docs/fa/self-hosting/kubernetes.md new file mode 100644 index 00000000..a125d835 --- /dev/null +++ b/docs/fa/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# استقرار با Kubernetes + +Kubernetes ممکن است برای یک سایت ایستا زیاده از حد باشد، اما اگر از قبل روی Helm و GitOps استانداردسازی کرده‌اید، گزینهٔ بسیار مناسبی است. + +> [!IMPORTANT] +> **هدرهای لازم برای تبدیل فایل‌های Office** +> +> ابزارهای مبتنی بر LibreOffice (تبدیل Word، Excel، PowerPoint) برای پشتیبانی از `SharedArrayBuffer` به این هدرهای HTTP نیاز دارند: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> ایمیج‌های رسمی nginx در BentoPDF این هدرها را دارند. در Kubernetes، **کنترلرهای Ingress/Gateway نیز پراکسی معکوس هستند**، پس مطمئن شوید این هدرها حفظ می‌شوند (یا آن‌ها را در لبه اضافه کنید). + +## پیش‌نیازها + +- یک کلاستر Kubernetes +- Helm v3 +- یک ایمیج nginx از BentoPDF (مثلاً `ghcr.io/alam00000/bentopdf:`) که روی **پورت 8080** سرویس می‌دهد + +## استقرار با Helm + +### نصب از این مخزن (چارت محلی) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### نصب از GHCR (چارت OCI) + +اگر چارت به‌صورت یک آرتیفکت OCI در GHCR منتشر شده باشد: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## در دسترس قرار دادن + +### Port-forward (آزمایش سریع) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (اختیاری) + +Ingress را فعال کنید (نمونه برای nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (اختیاری) + +این چارت از `Gateway` و `HTTPRoute` در Gateway API پشتیبانی می‌کند. + +نمونه (اپراتور Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## اطمینان از کارکرد هدرهای SharedArrayBuffer (Ingress/Gateway) + +### چه چیزی «باید» اتفاق بیفتد + +پیکربندی nginx در BentoPDF هدرهای پاسخ لازم را تنظیم می‌کند. بیشتر کنترلرهای Ingress/Gateway **هدرهای پاسخ بالادستی را بدون تغییر عبور می‌دهند**. + +### چه چیزی می‌تواند آن را خراب کند + +- سیاست کنترلر/لبه‌ای که هدرهای پاسخ را **بازنویسی** یا **حذف** می‌کند +- یک میان‌افزار «هدرهای امنیتی» که مقادیر متفاوتی برای COOP/COEP تنظیم می‌کند + +### نحوهٔ بررسی + +این را روی نقطهٔ پایانی عمومی خود اجرا کنید: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +باید این‌ها را ببینید: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### اگر کنترلر Ingress شما آن‌ها را حفظ نمی‌کند + +هدرها را در لبه اضافه کنید (وابسته به کنترلر). نمونه برای **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## خطاهای نوع MIME برای `.mjs` (خالی بودن iframe امضای PDF / پرکنندهٔ فرم) + +اگر کنسول مرورگر برای یک درخواست `.mjs` خطای `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` را نشان می‌دهد، یک کنترلر Ingress/Gateway جلوی nginx در BentoPDF هدر `Content-Type` بالادستی را با `application/octet-stream` جایگزین می‌کند. + +nginx در ایمیج BentoPDF از قبل `.mjs` را با `application/javascript` ارائه می‌دهد. راه‌حل این است که جلوی حذف یا جایگزینی آن توسط کنترلر را بگیرید. برای nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +یا از فیلتر `ResponseHeaderModifier` در Gateway API برای تنظیم `Content-Type: application/javascript` روی مسیرهای `.mjs` استفاده کنید. با DevTools ← زبانهٔ Network بررسی کنید: درخواست ناموفق `.mjs` اکنون باید `content-type: application/javascript` را نشان دهد. + +### اگر از Gateway API استفاده می‌کنید و می‌خواهید هدرها را اجباری اضافه کنید + +Gateway API از فیلتر `ResponseHeaderModifier` پشتیبانی می‌کند. می‌توانید آن را در `httpRoute.rules[*].filters` قرار دهید: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +پشتیبانی از فیلترهای خاص به کنترلر Gateway شما بستگی دارد؛ اگر فیلتری نادیده گرفته شد، هدرها را به‌جای آن در لایهٔ لبه/کنترلر اضافه کنید. + +## غیرفعال کردن ابزارهای خاص + +از یک ConfigMap برای غیرفعال کردن ابزارها در زمان اجرا، بدون ساخت دوبارهٔ ایمیج، استفاده کنید: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +آن را در پوشهٔ ارائه‌شده mount کنید: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +شناسهٔ ابزارها همان URL صفحه بدون `.html` است؛ هر ابزاری را باز کنید و به URL نگاه کنید (مثلاً `edit-pdf`، `merge-pdf`، `compress-pdf`). ابزارهای غیرفعال از صفحهٔ اصلی، جستجو، میان‌برها، سازندهٔ گردش کار و دسترسی مستقیم با URL پنهان می‌شوند. برای فهرست کامل گزینه‌ها [راهنمای Docker](/fa/self-hosting/docker#غیرفعال-کردن-ابزارهای-مشخص) را ببینید. diff --git a/docs/fa/self-hosting/netlify.md b/docs/fa/self-hosting/netlify.md new file mode 100644 index 00000000..932fc17c --- /dev/null +++ b/docs/fa/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# استقرار روی Netlify + +[Netlify](https://netlify.com) میزبانی عالی برای سایت‌های ایستا با یک طرح رایگان سخاوتمندانه ارائه می‌دهد. + +## استقرار با یک کلیک + +[![استقرار روی Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## استقرار دستی + +### گام ۱: اتصال مخزن + +1. وارد [Netlify](https://app.netlify.com) شوید +2. روی «Add new site» ← «Import an existing project» کلیک کنید +3. حساب GitHub خود را متصل کنید +4. فورک BentoPDF خود را انتخاب کنید + +### گام ۲: پیکربندی تنظیمات ساخت + +| تنظیم | مقدار | +| ------------ | --------------- | +| فرمان ساخت | `npm run build` | +| پوشهٔ انتشار | `dist` | +| نسخهٔ Node | 18+ | + +### گام ۳: استقرار + +روی «Deploy site» کلیک کنید و منتظر ساخت بمانید. + +## فایل پیکربندی + +فایل `netlify.toml` را در ریشهٔ پروژه بسازید: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning مهم +هدرهای `Cross-Origin-Embedder-Policy` و `Cross-Origin-Opener-Policy` برای تبدیل Word/ODT/Excel/PowerPoint به PDF لازم هستند. بدون آن‌ها، `SharedArrayBuffer` در دسترس نیست و موتور LibreOffice WASM راه‌اندازی نمی‌شود. + +هدرهای `Content-Encoding: gzip` روی فایل‌های `.wasm.gz` و `.data.gz` به مرورگر می‌گویند آن‌ها را به‌طور خودکار از حالت فشرده خارج کند. بدون این هدرها، مرورگر بایت‌های خام gzip را دریافت می‌کند و کامپایل WASM شکست می‌خورد. +::: + +## متغیرهای محیطی + +این موارد را در Site settings ← Environment variables تنظیم کنید: + +| متغیر | توضیح | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | برای ساخت حداقلی روی `true` تنظیم کنید | +| `VITE_BRAND_NAME` | نام برند سفارشی (جایگزین «BentoPDF») | +| `VITE_BRAND_LOGO` | مسیر لوگو نسبت به `public/` (مثلاً `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | متن سفارشی پاورقی/حق نشر | +| `VITE_DEFAULT_LANGUAGE` | زبان پیش‌فرض رابط کاربری (مثلاً `fr`، `de`، `es`) | + +## دامنهٔ سفارشی + +1. به Site settings ← Domain management بروید +2. روی «Add custom domain» کلیک کنید +3. دستورالعمل‌های پیکربندی DNS را دنبال کنید + +## رسانه‌های بزرگ + +برای فایل‌های بزرگ WASM، فعال کردن [Netlify Large Media](https://docs.netlify.com/large-media/overview/) را در نظر بگیرید: + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## عیب‌یابی + +### تبدیل Word/ODT/Excel به PDF در ۵۵٪ متوقف می‌شود + +اگر تبدیل اسناد در ۵۵٪ متوقف می‌شود، Console در DevTools را باز کنید و بررسی کنید: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +اگر `crossOriginIsolated` برابر `false` باشد، هدرهای COEP/COOP از `netlify.toml` شما اعمال نمی‌شوند. مطمئن شوید فایل در ریشهٔ پروژه است و دوباره مستقر کنید. + +اگر در کنسول `expected magic word 00 61 73 6d, found 1f 8b 08 08` را می‌بینید، هدرهای `Content-Encoding: gzip` برای فایل‌های `.wasm.gz` وجود ندارد. مطمئن شوید بلوک‌های `[[headers]]` برای `soffice.wasm.gz` و `soffice.data.gz` در `netlify.toml` شما هستند. + +### ساخت شکست می‌خورد + +سازگاری نسخهٔ Node را بررسی کنید: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### بارگذاری اولیهٔ کند + +بهینه‌سازی دارایی‌ها را در Site settings ← Build & deploy ← Asset optimization فعال کنید. diff --git a/docs/fa/self-hosting/nginx.md b/docs/fa/self-hosting/nginx.md new file mode 100644 index 00000000..357634d9 --- /dev/null +++ b/docs/fa/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# استقرار با Nginx + +BentoPDF را با Nginx روی سرور خودتان میزبانی کنید. + +## پیش‌نیازها + +- سرور Ubuntu/Debian +- Nginx نصب‌شده +- گواهی SSL (پیشنهادی: Let's Encrypt) + +## گام ۱: ساخت پروژه + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +برای سفارشی‌سازی برند، پیش از ساخت متغیرهای محیطی را تنظیم کنید: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## گام ۲: کپی فایل‌ها + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## گام ۳: پیکربندی Nginx + +فایل `/etc/nginx/sites-available/bentopdf` را بسازید: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## گام ۴: فعال کردن سایت + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## گام ۵: SSL با Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## استقرار در زیرپوشه + +برای میزبانی در `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +با این دستور بسازید: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## بهینه‌سازی کارایی + +به `nginx.conf` اضافه کنید: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## عیب‌یابی + +### WASM بارگذاری نمی‌شود + +مطمئن شوید نوع MIME تنظیم شده است: + +```nginx +types { + application/wasm wasm; +} +``` + +### امضای PDF یا پرکنندهٔ فرم نمایشگر خالی نشان می‌دهد (خطای MIME برای `.mjs`) + +اگر کنسول مرورگر این را نشان می‌دهد: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…و درخواست ناموفق به `.mjs` ختم می‌شود، nginx شما نگاشت `.mjs → application/javascript` را ندارد. نمایشگر PDF همراه (که امضای PDF، پرکنندهٔ فرم و چند ابزار دیگر از آن استفاده می‌کنند) فایل‌های ماژول ES با پسوند `.mjs` دارد و `mime.types` پیش‌فرض nginx به‌طور پیش‌فرض آن‌ها را شامل نمی‌شود. + +برای رفع آن، `mjs` را به خط موجود `application/javascript` در `/etc/nginx/mime.types` اضافه کنید: + +```nginx +application/javascript js mjs; +``` + +> خط _دومی_ برای `application/javascript` اضافه نکنید؛ nginx فایل `mime.types` را خط به خط تجزیه می‌کند و فقط یک نگاشت نوع به پسوند اعمال می‌شود، پس در برخی نسخه‌ها خط دوم بی‌صدا نادیده گرفته می‌شود. خط موجود را ویرایش کنید و `mjs` را کنار `js` اضافه کنید. + +یا به‌صورت محلی درون بلوک server بازنویسی کنید (بدون ویرایش فایل سراسری): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +پس از تغییر، nginx را دوباره بارگذاری کنید: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +برای تأیید: در DevTools مرورگر ← زبانهٔ Network، درخواست ناموفق `.mjs` را پیدا کنید و هدر پاسخ `Content-Type` را بررسی کنید. اکنون باید `application/javascript` باشد، نه `application/octet-stream`. + +### تبدیل Word/ODT/Excel به PDF کار نمی‌کند + +LibreOffice WASM به `SharedArrayBuffer` نیاز دارد که آن هم به هدرهای `Cross-Origin-Embedder-Policy` و `Cross-Origin-Opener-Policy` نیاز دارد. همچنین به یک بستر امن نیاز دارد، بنابراین `http://localhost` برای آزمایش محلی کار می‌کند اما `http://192.168.x.x` یا دیگر IPهای شبکهٔ محلی معمولاً به HTTPS نیاز دارند. توجه کنید که دستورهای `add_header` در nginx درون یک بلوک `location` دستورهای `add_header` سطح server را **بازنویسی** می‌کنند و با آن‌ها ادغام نمی‌شوند. هر بلوک `location` که `add_header` خودش را دارد باید هدرهای COEP/COOP را نیز شامل شود. + +با این دستور بررسی کنید: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +اگر جلوی nginx از پراکسی معکوس استفاده می‌کنید، مطمئن شوید این هدرها را حفظ می‌کند. + +### 502 Bad Gateway + +لاگ‌های خطای Nginx را بررسی کنید: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/fa/self-hosting/vercel.md b/docs/fa/self-hosting/vercel.md new file mode 100644 index 00000000..5c7dbbb7 --- /dev/null +++ b/docs/fa/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# استقرار روی Vercel + +[Vercel](https://vercel.com) ساده‌ترین تجربهٔ استقرار را برای سایت‌های ایستا ارائه می‌دهد. + +## استقرار با یک کلیک + +[![استقرار با Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## استقرار دستی + +### گام ۱: فورک کردن مخزن + +مخزن [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) را در حساب GitHub خود فورک کنید. + +### گام ۲: وارد کردن به Vercel + +1. به [vercel.com/new](https://vercel.com/new) بروید +2. مخزن فورک‌شدهٔ خود را انتخاب کنید +3. پروژه را پیکربندی کنید: + +| تنظیم | مقدار | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### گام ۳: متغیرهای محیطی (اختیاری) + +در صورت نیاز این موارد را اضافه کنید: + +| متغیر | توضیح | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | برای رابط کاربری حداقلی روی `true` تنظیم کنید | +| `VITE_BRAND_NAME` | نام برند سفارشی (جایگزین «BentoPDF») | +| `VITE_BRAND_LOGO` | مسیر لوگو نسبت به `public/` (مثلاً `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | متن سفارشی پاورقی/حق نشر | +| `VITE_DEFAULT_LANGUAGE` | زبان پیش‌فرض رابط کاربری (مثلاً `fr`، `de`، `es`) | + +### گام ۴: استقرار + +روی «Deploy» کلیک کنید و منتظر بمانید تا ساخت کامل شود. + +## دامنهٔ سفارشی + +1. به تنظیمات پروژه بروید +2. به بخش «Domains» بروید +3. دامنهٔ سفارشی خود را اضافه کنید +4. DNS را طبق دستورالعمل پیکربندی کنید + +## محدودیت‌ها + +::: warning فایل‌های بزرگ +توابع serverless در Vercel محدودیت ۵۰ مگابایت دارند. از آنجا که BentoPDF یک سایت ایستاست، این موضوع نباید بر شما اثر بگذارد، اما ماژول‌های WASM بزرگ هستند (در مجموع حدود ۱۰۰ مگابایت). مطمئن شوید که از پوشهٔ `/public` ارائه می‌شوند. +::: + +## عیب‌یابی + +### پایان زمان ساخت + +اگر زمان ساخت به پایان می‌رسد، این را امتحان کنید: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### خطای 404 هنگام تازه‌سازی + +برای مسیریابی SPA یک فایل `vercel.json` اضافه کنید: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### تبدیل Word/ODT/Excel به PDF کار نمی‌کند + +تبدیل‌های LibreOffice WASM به `SharedArrayBuffer` نیاز دارند که آن هم به این هدرهای پاسخ در همهٔ صفحات نیاز دارد: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +فایل‌های از پیش فشرده‌شدهٔ `.wasm.gz` و `.data.gz` نیز به `Content-Encoding: gzip` نیاز دارند تا مرورگر آن‌ها را از حالت فشرده خارج کند. + +این موارد را به `vercel.json` خود اضافه کنید: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +برای بررسی، Console در DevTools را باز کنید و `console.log(window.crossOriginIsolated)` را اجرا کنید؛ باید `true` برگرداند. diff --git a/docs/fa/tools/add-attachments.md b/docs/fa/tools/add-attachments.md new file mode 100644 index 00000000..b3897cf4 --- /dev/null +++ b/docs/fa/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: افزودن پیوست +description: فایل‌هایی از هر نوع را در سطح سند یا متصل به صفحات خاص در یک PDF جاسازی کنید. +--- + +# افزودن پیوست + +یک یا چند فایل را مستقیماً درون یک سند PDF جاسازی کنید. پیوست‌ها را می‌توان در سطح سند (قابل مشاهده در پنل پیوست هر PDF‌خوانی) اضافه کرد یا به صفحات خاص متصل کرد. + +## نحوهٔ کار + +1. PDFی را که می‌خواهید فایل‌ها را به آن پیوست کنید بارگذاری کنید. +2. از ناحیهٔ رها کردن پیوست برای انتخاب فایل‌هایی که می‌خواهید جاسازی کنید استفاده کنید (هر نوع فایل). +3. سطح پیوست را انتخاب کنید: **سند** (پیش‌فرض) یا **صفحه**. +4. اگر سطح صفحه را انتخاب کردید، یک بازهٔ صفحه وارد کنید (مثلاً `1-3` یا `5`). +5. روی دکمهٔ پردازش کلیک کنید. PDF تغییریافته همراه با فایل‌های جاسازی‌شده دانلود می‌شود. + +## ویژگی‌ها + +- پیوست هر نوع فایل: تصاویر، صفحه‌گسترده‌ها، آرشیوها، فایل‌های اجرایی و هر چیز دیگر +- قرار دادن پیوست در سطح سند یا سطح صفحه +- امکان پیوست چند فایل در یک عملیات +- نمایش نام و اندازهٔ همهٔ پیوست‌های انتخاب‌شده +- خروجی محتوای اصلی PDF را حفظ می‌کند و فایل‌های جاسازی‌شده را اضافه می‌کند + +## گزینه‌ها + +| گزینه | توضیح | +| ------------ | ------------------------------------------------------------------------- | +| **سطح سند** | فایل‌ها را به کل PDF پیوست می‌کند و از پنل پیوست‌ها در دسترس هستند | +| **سطح صفحه** | فایل‌ها را به صفحات خاصی که با ورودی بازهٔ صفحه مشخص می‌شوند پیوست می‌کند | + +## موارد استفاده + +- بسته‌بندی داده‌های منبع (فایل‌های Excel، CSV) همراه با گزارش PDF +- پیوست فایل‌های تصویری اصلی به PDF نمونه‌کار عکاسی +- جاسازی اسناد پشتیبان درون یک قرارداد یا پیشنهاد +- افزودن مطالب تکمیلی به صفحات خاص یک راهنمای آموزشی + +## نکته‌ها + +- پیوست‌های سطح سند در بیشتر PDF‌خوان‌ها پشتیبانی می‌شوند. پیوست‌های سطح صفحه ممکن است در همهٔ نمایشگرها دیده نشوند. +- محدودیتی برای اندازهٔ پیوست‌ها وجود ندارد، اما فایل‌های جاسازی‌شدهٔ بسیار بزرگ، اندازهٔ PDF را به همان نسبت افزایش می‌دهند. + +## ابزارهای مرتبط + +- [استخراج پیوست‌ها](./extract-attachments) +- [ویرایش پیوست‌ها](./edit-attachments) +- [ادغام PDF](./merge-pdf) diff --git a/docs/fa/tools/add-blank-page.md b/docs/fa/tools/add-blank-page.md new file mode 100644 index 00000000..0949aede --- /dev/null +++ b/docs/fa/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: افزودن صفحهٔ خالی +description: یک یا چند صفحهٔ خالی را در هر موقعیتی از سند PDF درج کنید. +--- + +# افزودن صفحهٔ خالی + +صفحات خالی را در موقعیتی که مشخص می‌کنید در PDF درج کنید. شما تعیین می‌کنید صفحات خالی کجا قرار بگیرند و چند صفحه اضافه شود. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. ابزار تعداد صفحات را نمایش می‌دهد. +2. **موقعیت** درج صفحات خالی را وارد کنید. از `0` برای درج در ابتدای سند استفاده کنید، یا تعداد کل صفحات را برای افزودن به انتها وارد کنید. +3. **تعداد** صفحات خالی برای افزودن را وارد کنید (پیش‌فرض ۱ است). +4. روی دکمهٔ پردازش کلیک کنید. PDF تغییریافته با صفحات خالی درج‌شده دانلود می‌شود. + +## ویژگی‌ها + +- درج در هر موقعیت: ابتدا، میانه یا انتهای سند +- افزودن چند صفحهٔ خالی در یک عملیات +- راهنمای موقعیت بر اساس تعداد صفحات PDF بارگذاری‌شده به‌روز می‌شود +- صفحات خالی استاندارد در اندازهٔ A4 + +## موارد استفاده + +- افزودن یک صفحهٔ خالی جداکننده بین بخش‌های یک سند گردآوری‌شده +- درج صفحات خالی برای هم‌ترازی در چاپ دورو +- افزودن فضا برای یادداشت‌های دست‌نویس در یک جزوهٔ چاپی +- رساندن سند به حداقل تعداد صفحات لازم + +## نکته‌ها + +- موقعیت `0` پیش از صفحهٔ اول درج می‌کند. موقعیتی برابر با تعداد کل صفحات، پس از صفحهٔ آخر اضافه می‌کند. +- اگر می‌خواهید محتوا (نه فقط صفحهٔ خالی) را در موقعیت خاصی درج کنید، از [ابزار چندکارهٔ PDF](./pdf-multi-tool) برای درج PDF دیگری پس از یک صفحهٔ مشخص استفاده کنید. + +## ابزارهای مرتبط + +- [تکثیر و سازماندهی](./organize-pdf) +- [ابزار چندکارهٔ PDF](./pdf-multi-tool) +- [ادغام PDF](./merge-pdf) diff --git a/docs/fa/tools/add-page-labels.md b/docs/fa/tools/add-page-labels.md new file mode 100644 index 00000000..08059ce6 --- /dev/null +++ b/docs/fa/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: افزودن برچسب صفحه +description: برچسب‌های صفحهٔ PDF را با اعداد رومی، پیشوندهای حرفی، شماره‌گذاری سفارشی و چند قاعده در هر سند اضافه کنید. +--- + +# افزودن برچسب صفحه + +برچسب‌های صفحه نحوهٔ نمایش شماره صفحات را در نمایشگرهای PDF کنترل می‌کنند (عددی که در نوار ابزار نشان داده می‌شود، نه آنچه روی صفحه چاپ می‌شود). این ابزار به شما امکان می‌دهد طرح‌های برچسب‌گذاری متفاوتی به بازه‌های مختلف صفحات اختصاص دهید: اعداد رومی برای صفحات مقدماتی، اعداد ده‌دهی برای متن اصلی، پیوست‌های حرفی و موارد دیگر. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. پنل گزینه‌ها با یک قاعدهٔ برچسب پیش‌فرض نمایش داده می‌شود. +3. هر قاعده را با بازهٔ صفحه، سبک، پیشوند اختیاری و مقدار شروع پیکربندی کنید. +4. روی **افزودن قاعده** کلیک کنید تا قاعده‌های بیشتری برای بخش‌های مختلف بسازید. +5. روی **افزودن برچسب صفحه** کلیک کنید تا همهٔ قاعده‌ها اعمال و نتیجه دانلود شود. + +## گزینه‌ها + +هر قاعدهٔ برچسب این تنظیمات را دارد: + +- **بازهٔ صفحه**: قاعده روی کدام صفحات اعمال شود. برای همهٔ صفحات خالی بگذارید. از بازه‌هایی مانند `1-4`، `7`، `odd` یا `1-9,30-40` پشتیبانی می‌کند. +- **سبک برچسب**: عدد عربی ده‌دهی، رومی کوچک (i, ii, iii)، رومی بزرگ (I, II, III)، حروف کوچک (a, b, c)، حروف بزرگ (A, B, C) یا بدون برچسب (فقط پیشوند). +- **پیشوند برچسب**: متن اختیاری که پیش از هر برچسب قرار می‌گیرد، مانند «A-» برای ساخت برچسب‌هایی مثل A-1، A-2، A-3. +- **مقدار شروع**: عددی که شمارش از آن آغاز می‌شود. پیش‌فرض ۱ است. برای شماره‌گذاری از صفر، روی ۰ تنظیم کنید. +- **ادامهٔ شماره‌گذاری در بازه‌های جدا از هم**: وقتی قاعده صفحات غیرپیوسته را هدف می‌گیرد (مانند `1-9,30-40` یا `odd`) و می‌خواهید شماره‌گذاری به‌ترتیب ادامه یابد، این را فعال کنید. +- **حذف برچسب‌های صفحهٔ موجود**: به‌طور پیش‌فرض فعال است. پیش از اعمال قاعده‌های جدید، برچسب‌های قبلی را پاک می‌کند. + +## ویژگی‌ها + +- چند قاعدهٔ برچسب در هر سند برای طرح‌های شماره‌گذاری پیچیده +- شش سبک برچسب که همهٔ سیستم‌های شماره‌گذاری استاندارد را پوشش می‌دهند +- پشتیبانی از پیشوند سفارشی برای برچسب‌گذاری بخش‌بندی‌شده +- پشتیبانی از بازه‌های جدا از هم با شماره‌گذاری پیوسته +- گزینهٔ حفظ یا حذف برچسب‌های موجود + +## موارد استفاده + +- تنظیم برچسب‌های رومی (i, ii, iii) برای پیشگفتار کتاب و برچسب‌های ده‌دهی برای متن اصلی +- برچسب‌گذاری صفحات پیوست با پیشوندهای حرفی مانند «A-1»، «A-2»، «B-1»، «B-2» +- اصلاح برچسب‌های صفحه در سند اسکن‌شده‌ای که شماره صفحات فیزیکی با ترتیب صفحات PDF مطابقت ندارد +- افزودن شماره‌گذاری از صفر برای اسناد فنی + +## نکته‌ها + +- برچسب‌های صفحه فراداده‌ای هستند که نمایشگرهای PDF در نوار ابزار پیمایش نشان می‌دهند. آن‌ها روی صفحهٔ واقعی چاپ نمی‌شوند. برای اعداد قابل مشاهده، از [شماره‌گذاری صفحات](./page-numbers) استفاده کنید. +- این ابزار نیاز دارد CoherentPDF (CPDF) در تنظیمات WASM پیکربندی شده باشد. اگر راه‌اندازی نشده باشد، از شما خواسته می‌شود آن را پیکربندی کنید. + +## ابزارهای مرتبط + +- [شماره‌گذاری صفحات](./page-numbers) +- [شماره‌گذاری Bates](./bates-numbering) +- [ویرایش نشانک‌ها](./bookmark) diff --git a/docs/fa/tools/add-stamps.md b/docs/fa/tools/add-stamps.md new file mode 100644 index 00000000..7e3c8a1d --- /dev/null +++ b/docs/fa/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: افزودن مهر +description: با یک نوار ابزار حاشیه‌نویسی یکپارچه و انتساب نام کاربری، مهرهای تصویری به صفحات PDF اضافه کنید. +--- + +# افزودن مهر + +با استفاده از یک نمایشگر تعبیه‌شده همراه با نوار ابزار حاشیه‌نویسی مهر، مهرهای تصویری را روی صفحات PDF قرار دهید. مهرها می‌توانند نام شما را برای انتساب داشته باشند، که این ابزار را برای گردش‌های کاری تأیید، فرایندهای بازبینی و علامت‌گذاری اسناد مفید می‌کند. + +## نحوهٔ کار + +1. نام خود را در فیلد **نام کاربری مهر** وارد کنید. این نام روی مهرهایی که می‌سازید نمایش داده می‌شود. +2. فایل PDF خود را با کلیک یا کشیدن به ناحیهٔ رها کردن بارگذاری کنید. +3. ویرایشگر مهر با سند بارگذاری‌شده در یک نمایشگر باز می‌شود. +4. از ابزار مهر تصویری در نوار ابزار برای انتخاب و قرار دادن مهر روی هر صفحه استفاده کنید. +5. در صورت نیاز موقعیت و اندازهٔ مهرها را تنظیم کنید. +6. روی **ذخیرهٔ PDF مهرشده** کلیک کنید تا نتیجه دانلود شود. + +## ویژگی‌ها + +- نمایشگر PDF یکپارچه با نوار ابزار حاشیه‌نویسی ویژهٔ مهر +- انتساب نام کاربری روی مهرهای ساخته‌شده +- قرار دادن مهر تصویری روی هر صفحه +- جابه‌جایی و تغییر اندازه با کشیدن و رها کردن +- تنظیم خودکار اندازهٔ نمایشگر بر اساس نسبت ابعاد صفحه +- نمایش فایل با نام و اندازهٔ آن + +## موارد استفاده + +- افزودن مهرهای تصویری «APPROVED» یا «REVIEWED» به اسناد در گردش کار بازبینی +- قرار دادن تصویر مهر شرکت یا مهر دفتر اسناد رسمی روی اسناد رسمی +- علامت‌گذاری صفحات با مهر «RECEIVED» همراه با نام بازبین +- افزودن مهرهای کنترل کیفیت به گزارش‌های بازرسی + +## نکته‌ها + +- پیش از بارگذاری PDF، نام کاربری مهر را تنظیم کنید. نام کاربری در فرادادهٔ مهر جاسازی می‌شود. +- نمایشگر ارتفاع خود را بر اساس نسبت ابعاد صفحهٔ اول PDF برای بهترین نمایش تنظیم می‌کند. +- برای واترمارک‌های متنی به‌جای مهرهای تصویری، از ابزار [افزودن واترمارک](./add-watermark) استفاده کنید. + +## ابزارهای مرتبط + +- [امضای PDF](./sign-pdf) +- [افزودن واترمارک](./add-watermark) +- [ویرایشگر PDF](./edit-pdf) diff --git a/docs/fa/tools/add-watermark.md b/docs/fa/tools/add-watermark.md new file mode 100644 index 00000000..3da78d30 --- /dev/null +++ b/docs/fa/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: افزودن واترمارک +description: با یک ویرایشگر بصری کشیدن و رها کردن و پیش‌نمایش زنده، واترمارک متنی یا تصویری روی صفحات PDF بزنید. +--- + +# افزودن واترمارک + +با یک ویرایشگر بصری، واترمارک متنی یا تصویری به صفحات PDF اضافه کنید. می‌توانید واترمارک را با کشیدن مستقیم روی پیش‌نمایش جابه‌جا کنید، با دستگیره‌های گوشه اندازه‌اش را تغییر دهید و شفافیت، چرخش، قلم و رنگ را تنظیم کنید. هر صفحه می‌تواند موقعیت واترمارک خودش را داشته باشد، یا می‌توانید یک واترمارک را یک‌جا روی همهٔ صفحات اعمال کنید. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. ویرایشگر با پیش‌نمایش زندهٔ صفحهٔ اول و یک لایهٔ واترمارک قابل کشیدن باز می‌شود. +3. با دکمه‌های تغییر حالت، بین واترمارک **متنی** یا **تصویری** انتخاب کنید. +4. تنظیمات واترمارک را در پنل کناری پیکربندی کنید. +5. واترمارک را روی پیش‌نمایش بکشید تا دقیقاً جایی که می‌خواهید قرار گیرد. برای تغییر اندازه از دستگیره‌های گوشه استفاده کنید. +6. برای تنظیم واترمارک هر صفحه بین صفحات جابه‌جا شوید، یا گزینهٔ **اعمال روی همهٔ صفحات** را فعال نگه دارید. +7. روی **افزودن واترمارک** کلیک کنید تا پردازش و دانلود شود. + +## گزینه‌ها + +**تنظیمات واترمارک متنی:** + +- **متن**: متن واترمارک (مثلاً «محرمانه»، «پیش‌نویس»). +- **اندازهٔ قلم**: از ۱۰ تا ۲۰۰ پوینت. پیش‌فرض ۷۲ است. +- **رنگ**: هر رنگی با انتخابگر رنگ. +- **شفافیت**: کنترل شفافیت از کاملاً شفاف تا کاملاً مات. +- **چرخش**: چرخاندن متن واترمارک از ۱۸۰- تا ۱۸۰ درجه. + +**تنظیمات واترمارک تصویری:** + +- **بارگذاری تصویر**: یک فایل PNG، JPG یا تصویر دیگر را برای استفاده به‌عنوان واترمارک بارگذاری کنید. +- **شفافیت**: کنترل شفافیت تصویر. +- **مقیاس**: تغییر اندازهٔ واترمارک تصویری. + +**تنظیمات چیدمان:** + +- **تکی**: یک واترمارک در هر صفحه که با کشیدن یا با موقعیت‌های از پیش تعیین‌شده جای‌گذاری می‌شود. +- **کاشی‌کاری**: واترمارک را در سراسر صفحه در یک شبکهٔ مورب که از زاویهٔ چرخش پیروی می‌کند تکرار می‌کند، تا علامت سند را از لبه تا لبه بپوشاند. +- **فاصلهٔ افقی**: فاصلهٔ بین کاشی‌ها در جهت متن، به‌صورت درصدی از عرض واترمارک (فقط در حالت کاشی‌کاری). +- **فاصلهٔ عمودی**: فاصلهٔ بین ردیف‌های کاشی، به‌صورت درصدی از ارتفاع واترمارک (فقط در حالت کاشی‌کاری). + +**تنظیمات عمومی:** + +- **اعمال روی همهٔ صفحات**: وقتی فعال باشد، همان واترمارک روی تک‌تک صفحات اعمال می‌شود. برای تنظیم واترمارک جداگانه برای هر صفحه، آن را غیرفعال کنید. +- **بازهٔ صفحه**: مشخص کنید کدام صفحات واترمارک بگیرند (مثلاً «1-3, 5, 7-9» یا «all»). + +## ویژگی‌ها + +- جای‌گذاری بصری با کشیدن و رها کردن روی پیش‌نمایش زندهٔ PDF +- واترمارک قابل تغییر اندازه با دستگیره‌های گوشه +- حالت‌های واترمارک متنی و تصویری +- چیدمان تکی یا کاشی‌کاری تمام‌صفحه (تکرارشونده) با فاصلهٔ قابل تنظیم +- اعمال واترمارک برای هر صفحه یا به‌صورت سراسری +- پیمایش صفحه به صفحه در پیش‌نمایش +- کنترل شفافیت و چرخش +- فیلتر بازهٔ صفحه + +## موارد استفاده + +- علامت‌گذاری پیش‌نویس‌ها با «پیش‌نویس» پیش از ارسال برای بازبینی +- افزودن واترمارک «محرمانه» به گزارش‌های مالی حساس +- برندسازی اسناد با واترمارک تصویری لوگوی شرکت +- زدن «SAMPLE» روی مستندات محصول که با مشتریان بالقوه به اشتراک گذاشته می‌شود +- افزودن اعلان حق نشر به مطالب PDF توزیع‌شده + +## نکته‌ها + +- برای واترمارک مورب در سراسر صفحه، چرخش را حدود ۴۵ درجه تنظیم کنید و اندازهٔ قلم را افزایش دهید. +- حالت کاشی‌کاری استفادهٔ دوباره از سند پس از برش را بسیار دشوارتر می‌کند، چون حذف یک علامت همچنان ده‌ها علامت دیگر را باقی می‌گذارد. هنگام کاشی‌کاری شفافیت را کم کنید تا متن زیرین خوانا بماند. +- واترمارک‌های تصویری با پس‌زمینهٔ شفاف (قالب PNG) طبیعی‌تر با محتوای سند ترکیب می‌شوند. +- اگر برای صفحات مختلف به متن واترمارک متفاوتی نیاز دارید، «اعمال روی همهٔ صفحات» را غیرفعال کنید و صفحه به صفحه پیش بروید. + +## ابزارهای مرتبط + +- [سرصفحه و پاصفحه](./header-footer) +- [افزودن مهر](./add-stamps) +- [شماره‌گذاری Bates](./bates-numbering) +- [امضای PDF](./sign-pdf) diff --git a/docs/fa/tools/adjust-colors.md b/docs/fa/tools/adjust-colors.md new file mode 100644 index 00000000..864e543e --- /dev/null +++ b/docs/fa/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: تنظیم رنگ‌ها +description: روشنایی، کنتراست، اشباع، فام، دمای رنگ، ته‌رنگ، گاما و سپیا را در PDF خود دقیق تنظیم کنید. +--- + +# تنظیم رنگ‌ها + +مجموعه‌ای کامل برای اصلاح رنگ در PDF. هشت پارامتر مستقل را تنظیم کنید (روشنایی، کنتراست، اشباع، چرخش فام، دمای رنگ، ته‌رنگ، گاما و سپیا) و پیش‌نمایش زنده با جابه‌جایی هر لغزنده به‌روز می‌شود. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. ویرایشگر با پیش‌نمایش صفحهٔ اول و پنل تنظیمات رنگ باز می‌شود. +3. لغزنده‌ها را برای تنظیم هر پارامتر رنگ جابه‌جا کنید. پیش‌نمایش بی‌درنگ به‌روز می‌شود. +4. روی **بازنشانی** کلیک کنید تا همهٔ لغزنده‌ها به موقعیت پیش‌فرض برگردند. +5. روی **اعمال** کلیک کنید تا همهٔ صفحات پردازش و PDF تنظیم‌شده دانلود شود. + +## گزینه‌ها + +- **روشنایی**: کل صفحه را روشن‌تر یا تیره‌تر می‌کند (۱۰۰- تا ۱۰۰+). +- **کنتراست**: تفاوت بین نواحی روشن و تیره را افزایش یا کاهش می‌دهد (۱۰۰- تا ۱۰۰+). +- **اشباع**: شدت رنگ را افزایش یا کاهش می‌دهد (۱۰۰- تا ۱۰۰+). تنظیم روی ۱۰۰- نتیجهٔ خاکستری ایجاد می‌کند. +- **چرخش فام**: چرخهٔ رنگ را می‌چرخاند تا همهٔ رنگ‌ها به‌طور یکسان جابه‌جا شوند. +- **دمای رنگ**: رنگ‌ها را گرم‌تر (زرد/نارنجی) یا سردتر (آبی) می‌کند. +- **ته‌رنگ**: ته‌رنگ سبز یا سرخابی اضافه می‌کند. +- **گاما**: روشنایی میان‌تون‌ها را با منحنی گاما تنظیم می‌کند. مقادیر کمتر از 1.0 میان‌تون‌ها را تیره‌تر و مقادیر بیشتر از 1.0 آن‌ها را روشن‌تر می‌کنند. +- **سپیا**: جلوهٔ کلاسیک سپیا را اعمال می‌کند. مقادیر بالاتر ته‌رنگ قهوه‌ای قوی‌تری ایجاد می‌کنند. + +## ویژگی‌ها + +- هشت پارامتر رنگ با تنظیم مستقل +- پیش‌نمایش زنده که بی‌درنگ به تغییر لغزنده‌ها واکنش نشان می‌دهد +- دکمهٔ بازنشانی برای بازگشت سریع به پیش‌فرض‌ها +- پردازش همهٔ صفحات سند +- کار با هر محتوای PDF (متن، تصاویر، گرافیک) + +## موارد استفاده + +- روشن کردن یک اسکن تیره یا اصلاح صفحات بیش از حد روشن +- کاهش اشباع یک سند رنگی برای مصرف کمتر جوهر پیش از چاپ +- اعمال تن سپیا برای ظاهری قدیمی در گواهی‌نامه‌ها یا لوح‌های تقدیر +- اصلاح دمای رنگ عکس‌های جاسازی‌شده در PDF +- افزایش کنتراست اسناد اسکن‌شدهٔ کم‌رنگ یا کم‌کیفیت + +## نکته‌ها + +- برای تبدیل سریع به خاکستری، لغزندهٔ اشباع را تا انتها روی ۱۰۰- بکشید. +- لغزندهٔ گاما به‌ویژه برای بهبود خوانایی اسناد اسکن‌شده‌ای که میان‌تون‌هایشان بیش از حد تیره یا روشن است مفید است. +- مانند دیگر ابزارهای جلوهٔ تصویری، این ابزار هر صفحه را به تصویر (راستر) تبدیل می‌کند. خروجی مبتنی بر تصویر خواهد بود، پس متن قابل انتخاب نیست. + +## ابزارهای مرتبط + +- [وارونه‌سازی رنگ‌ها](./invert-colors) +- [جلوهٔ اسکنر](./scanner-effect) +- [رنگ پس‌زمینه](./background-color) diff --git a/docs/fa/tools/alternate-merge.md b/docs/fa/tools/alternate-merge.md new file mode 100644 index 00000000..8ef3be54 --- /dev/null +++ b/docs/fa/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: ادغام یک‌درمیان صفحات +description: PDFها را با درهم‌آمیختن یک‌درمیان صفحات هر فایل ادغام کنید، با حفظ نشانک‌ها. +--- + +# ادغام یک‌درمیان صفحات + +صفحات چند فایل PDF را درهم بیامیزید تا صفحات به‌نوبت از اسناد مختلف بیایند. این ابزار برای زمانی است که ادغام معمولی فایل‌ها را فقط پشت سر هم قرار می‌دهد، اما شما به صفحهٔ ۱ فایل A، سپس صفحهٔ ۱ فایل B، سپس صفحهٔ ۲ فایل A و به همین ترتیب نیاز دارید. + +## نحوهٔ کار + +1. حداقل دو فایل PDF را با ناحیهٔ رها کردن بارگذاری کنید. +2. ابزار هر فایل را با تعداد صفحات و اندازهٔ آن نمایش می‌دهد. +3. دستگیره‌ها را بکشید تا ترتیب فایل‌ها در توالی درهم‌آمیزی را تعیین کنید. +4. روی **ترکیب صفحات** کلیک کنید تا خروجی درهم‌آمیخته ساخته شود. +5. نتیجه با نام `alternated-mixed.pdf` دانلود می‌شود. + +## ویژگی‌ها + +- درهم‌آمیزی صفحات هر تعداد PDF (حداقل دو) +- تغییر ترتیب فایل‌ها با کشیدن و رها کردن برای کنترل اولویت درهم‌آمیزی +- حفظ نشانک‌های اسناد منبع +- نمایش تعداد صفحات و اندازهٔ هر فایل بارگذاری‌شده +- پردازش با یک web worker اختصاصی برای رابط کاربری روان + +## موارد استفاده + +- بازسازی اسکن‌های دورو که صفحات فرد و زوج جداگانه اسکن شده‌اند +- ترکیب برگه‌های سؤال با پاسخ‌نامه‌ها تا هر سؤال با پاسخش دنبال شود +- ادغام صفحه به صفحهٔ اسناد دوزبانه (مثلاً انگلیسی در یک صفحه، ترجمه در صفحهٔ بعد) +- درهم‌آمیزی اسکن‌های رو و پشت از یک اسکنر یک‌رو + +## نکته‌ها + +- اگر PDFهای منبع تعداد صفحات متفاوتی دارند، صفحات سند کوتاه‌تر زودتر تمام می‌شود و صفحات باقی‌ماندهٔ سند بلندتر در انتها می‌آیند. +- ترتیب فایل‌ها مهم است: اولین فایل فهرست، صفحهٔ اول خروجی را تأمین می‌کند. در صورت نیاز با کشیدن ترتیب را تغییر دهید. + +## ابزارهای مرتبط + +- [ادغام PDF](./merge-pdf) +- [تکثیر و سازماندهی](./organize-pdf) +- [تقسیم PDF](./split-pdf) diff --git a/docs/fa/tools/background-color.md b/docs/fa/tools/background-color.md new file mode 100644 index 00000000..f94d822f --- /dev/null +++ b/docs/fa/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: رنگ پس‌زمینه +description: رنگ پس‌زمینهٔ همهٔ صفحات PDF را تغییر دهید و همهٔ محتوای رویی را حفظ کنید. +--- + +# رنگ پس‌زمینه + +یک رنگ پس‌زمینهٔ یکدست پشت همهٔ محتوای موجود PDF قرار دهید. ابزار روی هر صفحه یک مستطیل رنگی می‌سازد و محتوای اصلی را روی آن قرار می‌دهد، بنابراین متن، تصاویر و گرافیک‌ها روی پس‌زمینهٔ جدید کاملاً قابل مشاهده می‌مانند. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. با انتخابگر رنگ یک رنگ پس‌زمینه انتخاب کنید. پیش‌فرض زرد روشن (#FFFFCC) است. +3. روی **تغییر رنگ پس‌زمینه** کلیک کنید تا پردازش شود. +4. PDF به‌روزشده به‌طور خودکار دانلود می‌شود. + +## گزینه‌ها + +- **رنگ پس‌زمینه**: یک انتخابگر رنگ استاندارد برای انتخاب هر رنگ یکدست. پیش‌فرض زرد روشن است. + +## ویژگی‌ها + +- اعمال رنگ پس‌زمینهٔ یکسان روی همهٔ صفحات +- حفظ همهٔ محتوای اصلی (متن، تصاویر، گرافیک برداری) روی لایهٔ رنگی +- حفظ ابعاد اصلی صفحه +- کار با اسنادی با هر تعداد صفحه + +## موارد استفاده + +- افزودن پس‌زمینهٔ کرم یا عاجی روشن برای ظاهری نرم‌تر و کاغذمانند +- رنگ‌بندی مجموعه اسناد با اعمال رنگ‌های پس‌زمینهٔ متفاوت برای دسته‌های مختلف +- ساخت نسخه‌های متمایز بصری از یک سند برای مخاطبان مختلف +- افزودن ته‌رنگ روشن به پس‌زمینه برای خوانایی بهتر هنگام نمایش اسناد روی پرده + +## نکته‌ها + +- رنگ‌های روشن و ملایم بهترین نتیجه را دارند. پس‌زمینهٔ خیلی تیره می‌تواند خواندن متن را دشوار کند، مگر اینکه متن از قبل روشن باشد. +- اگر می‌خواهید هم پس‌زمینه و هم رنگ متن را تغییر دهید، ابتدا رنگ پس‌زمینه را اعمال کنید، سپس روی نتیجه از [تغییر رنگ متن](./text-color) استفاده کنید. +- این ابزار در سطح ساختار PDF کار می‌کند (نه تبدیل به تصویر)، بنابراین متن در خروجی قابل انتخاب و جستجو باقی می‌ماند. + +## ابزارهای مرتبط + +- [تغییر رنگ متن](./text-color) +- [وارونه‌سازی رنگ‌ها](./invert-colors) +- [تنظیم رنگ‌ها](./adjust-colors) diff --git a/docs/fa/tools/bates-numbering.md b/docs/fa/tools/bates-numbering.md new file mode 100644 index 00000000..97f4535a --- /dev/null +++ b/docs/fa/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: شماره‌گذاری Bates +description: شماره‌های Bates را با قالب‌ها، صفرگذاری، قلم‌ها و موقعیت‌های قابل تنظیم روی یک یا چند PDF اعمال کنید. +--- + +# شماره‌گذاری Bates + +شماره‌گذاری Bates شناسه‌های ترتیبی را روی همهٔ صفحات PDFهای شما درج می‌کند. این روش استاندارد برچسب‌گذاری اسناد در دادرسی‌های حقوقی، حسابرسی‌ها و گردش‌های کاری انطباق است. این ابزار از چند فایل و قالب‌های قابل تنظیم پشتیبانی می‌کند و PDFهای شماره‌گذاری‌شدهٔ جداگانه یا یک آرشیو ZIP تولید می‌کند. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. می‌توانید چند فایل را یک‌جا بکشید. +2. یک سبک از پیش تعیین‌شده انتخاب کنید یا یک قالب سفارشی بسازید. +3. موقعیت، قلم، اندازه، رنگ و شماره‌های شروع را پیکربندی کنید. +4. روی **اعمال شماره‌های Bates** کلیک کنید تا پردازش شود. +5. یک فایل تکی مستقیماً دانلود می‌شود. چند فایل به‌صورت آرشیو ZIP دانلود می‌شوند. + +## گزینه‌ها + +- **سبک از پیش تعیین‌شده**: از قالب‌های داخلی انتخاب کنید: + - Exhibit + Case + Bates + Page (مثلاً «Exhibit 1 Case XYZ 000001 Page 1») + - Exhibit + Case + Bates (بدون شماره صفحه) + - Case + Bates + - فقط شماره Bates (مثلاً «000001») + - سفارشی (قالب خودتان را بنویسید) +- **سفارشی‌سازی سبک**: رشتهٔ قالبی با جایگزین‌های `[BATES]`، `[PAGE]`، `[FILE]`، `[FILENAME]`. +- **صفرگذاری Bates**: تعداد ارقام (۳ تا ۶) برای شماره‌های Bates با صفرهای پیشرو. فقط در حالت سفارشی نمایش داده می‌شود. +- **موقعیت**: سرصفحه یا پاصفحه، چپ، وسط یا راست. +- **شروع Bates از**: نخستین شماره Bates. پیش‌فرض ۱ است. شماره‌گذاری در فایل‌ها ادامه می‌یابد. +- **شروع شمارندهٔ فایل از**: شمارهٔ شروع برای جایگزین `[FILE]`. +- **قلم**: Helvetica، Times New Roman یا Courier. +- **اندازهٔ قلم**: اندازهٔ متن درج‌شده. +- **رنگ**: انتخابگر رنگ برای متن شماره Bates. + +## ویژگی‌ها + +- پیش‌نمایش زنده که نشان می‌دهد شماره‌های Bates در همهٔ فایل‌های بارگذاری‌شده چگونه ظاهر می‌شوند +- پشتیبانی از چند فایل با شماره‌گذاری پیوسته در اسناد +- تغییر ترتیب فایل‌ها با کشیدن و رها کردن برای کنترل توالی شماره‌گذاری +- شش گزینهٔ موقعیت (سرصفحه/پاصفحه، چپ/وسط/راست) +- محاسبهٔ حاشیهٔ تطبیقی متناسب با اندازه‌های مختلف صفحه +- خروجی ZIP برای دسته‌های چندفایلی +- جایگزین‌های قالب برای بیشترین انعطاف‌پذیری + +## موارد استفاده + +- درج شماره‌های ترتیبی مدارک روی اسناد کشف دعوی برای دادرسی +- شماره‌گذاری بسته‌های شواهد حسابرسی که ده‌ها فایل را در بر می‌گیرند +- اعمال شماره‌های مرجع نظارتی روی مستندات انطباق +- برچسب‌گذاری پیوست‌های درخواست ثبت اختراع با شناسه‌های ویژهٔ پرونده + +## نکته‌ها + +- پیش از پردازش، فایل‌ها را در فهرست بکشید تا ترتیبشان را تغییر دهید. توالی شماره‌گذاری Bates از این ترتیب پیروی می‌کند. +- از جایگزین `[FILENAME]` برای درج نام فایل اصلی در مهر استفاده کنید که به ردیابی صفحات تا اسناد منبع کمک می‌کند. +- کادر پیش‌نمایش با تغییر تنظیمات بی‌درنگ به‌روز می‌شود، پس می‌توانید قالب را پیش از پردازش بررسی کنید. + +## ابزارهای مرتبط + +- [شماره‌گذاری صفحات](./page-numbers) +- [افزودن برچسب صفحه](./add-page-labels) +- [سرصفحه و پاصفحه](./header-footer) diff --git a/docs/fa/tools/bmp-to-pdf.md b/docs/fa/tools/bmp-to-pdf.md new file mode 100644 index 00000000..55dbad9a --- /dev/null +++ b/docs/fa/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP به PDF +description: تصاویر بیت‌مپ BMP را مستقیماً در مرورگر به قالب PDF تبدیل کنید، بدون نیاز به بارگذاری روی هیچ سروری. +--- + +# BMP به PDF + +فایل‌های Windows Bitmap (BMP) را به PDF تبدیل کنید. BMP یک قالب تصویر فشرده‌نشده است که هنوز در سیستم‌های قدیمی، تصویربرداری پزشکی و اسکنرهای صنعتی دیده می‌شود. این ابزار آن‌ها را بدون نیاز به نصب چیزی به PDF تبدیل می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :------ | +| BMP | `.bmp` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های BMP خود را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های بیشتری اضافه کنید یا موارد ناخواسته را حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. خروجی با نام `from_bmps.pdf` دانلود می‌شود. + +هر BMP روی یک canvas رسم می‌شود، به PNG صادر می‌شود و سپس با pdf-lib در PDF جاسازی می‌شود. اندازهٔ صفحه با ابعاد تصویر اصلی مطابقت دارد. + +## گزینه‌ها + +این ابزار تنظیمات کیفیت اضافی ندارد. تصاویر با وضوح اصلی خود به‌صورت PNG بدون اتلاف در PDF جاسازی می‌شوند. + +## موارد استفاده + +- تبدیل اسناد اسکن‌شدهٔ قدیمی ذخیره‌شده به‌صورت BMP به PDFهای آرشیوی +- تبدیل اسکرین‌شات‌های BMP از برنامه‌های قدیمی Windows به اسناد قابل اشتراک‌گذاری +- پردازش خروجی اسکنرهای پزشکی یا صنعتی که به‌طور پیش‌فرض BMP تولید می‌کنند +- انتقال آرشیوهای تصویری قدیمی به قالبی قابل حمل‌تر + +## نکته‌ها + +- فایل‌های BMP فشرده‌نشده هستند و معمولاً حجیم‌اند. PDF حاصل به‌مراتب کوچک‌تر خواهد بود، چون تصاویر در داخل دوباره به PNG رمزگذاری می‌شوند. +- اگر فایل‌های BMP را همراه با قالب‌های تصویری دیگر دارید، از ابزار [تصاویر به PDF](./image-to-pdf) برای تبدیل همه در یک دسته استفاده کنید. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [PNG به PDF](./png-to-pdf) +- [TIFF به PDF](./tiff-to-pdf) diff --git a/docs/fa/tools/bookmark.md b/docs/fa/tools/bookmark.md new file mode 100644 index 00000000..7414b78f --- /dev/null +++ b/docs/fa/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: ویرایش نشانک‌ها +description: افزودن، ویرایش، وارد کردن، صادر کردن و حذف نشانک‌های PDF با ویرایشگر بصری و پشتیبانی از CSV/JSON. +--- + +# ویرایش نشانک‌ها + +ویرایشگر نشانک کنترل کامل نشانک‌های ناوبری PDF (که «طرح کلی» نیز نامیده می‌شوند) را در اختیار شما می‌گذارد. می‌توانید نشانک‌های جدید اضافه کنید، نشانک‌های موجود را ویرایش کنید، ساختار سلسله‌مراتبی را بازآرایی کنید و داده‌های نشانک را با قالب‌های CSV و JSON وارد یا صادر کنید. + +## نحوهٔ کار + +1. PDF خود را با کلیک یا کشیدن فایل به ناحیهٔ رها کردن بارگذاری کنید. +2. در صورت تمایل گزینهٔ **استخراج خودکار نشانک‌های موجود** را علامت بزنید تا درخت نشانک فعلی سند بارگیری شود. +3. ویرایشگر با نمای دوبخشی باز می‌شود: نمایشگر PDF در سمت چپ و پنل نشانک در سمت راست. +4. عنوان نشانک را تایپ کنید و روی **افزودن به صفحه** کلیک کنید تا نشانکی جدید به صفحهٔ فعلی ساخته شود. +5. با دکمه‌های نوار ابزار نشانک‌ها را جابه‌جا، قالب‌بندی یا حذف کنید. +6. روی **ذخیرهٔ PDF با نشانک‌ها** کلیک کنید تا فایل به‌روزشده دانلود شود. + +## ویژگی‌ها + +- نمایشگر بصری PDF با ناوبری صفحه، کنترل بزرگ‌نمایی و ورودی رفتن به صفحه +- افزودن نشانک به هر صفحه تنها با یک کلیک +- کلیک مستقیم روی PDF برای تعیین مقصد دقیق نشانک (حالت انتخاب) +- سلسله‌مراتب تودرتوی نشانک‌ها با مرتب‌سازی کشیدن و رها کردن +- عملیات گروهی: انتخاب چند نشانک برای تغییر رنگ، سبک یا حذف یکجا +- جستجوی نشانک برای یافتن سریع موارد در درخت‌های بزرگ +- پشتیبانی از واگرد و ازنو برای همهٔ تغییرات +- وارد کردن نشانک از فایل‌های CSV (عنوان، صفحه، سطح) یا JSON +- صادر کردن نشانک‌ها به CSV یا JSON برای ویرایش بیرونی +- سبک‌دهی نشانک: رنگ (قرمز، آبی، سبز، زرد، بنفش) و سبک قلم (پررنگ، کج، پررنگ کج) +- ناوبری سریع: پیمایش صفحات با کلیدهای Page Up/Page Down + +## گزینه‌ها + +- **استخراج خودکار نشانک‌های موجود**: اگر علامت خورده باشد، ابزار هنگام بارگذاری نشانک‌های فعلی PDF را می‌خواند و نمایش می‌دهد. +- **حالت گروهی**: برای انتخاب چند نشانک و اعمال گروهی رنگ، سبک یا حذف، آن را روشن کنید. +- **باز/بستن همه**: نمایش یا پنهان کردن سریع زیرمجموعه‌های تودرتوی نشانک‌ها. + +## کاربردها + +- افزودن فهرست مطالب به کتاب درسی یا دفترچهٔ راهنمایی که نشانک ندارد +- بازسازی نشانک‌ها در سند اسکن‌شده پس از پردازش OCR +- صادر کردن نشانک‌ها به CSV، ویرایش آن‌ها در صفحه‌گسترده و سپس وارد کردن دوباره +- پاک‌سازی نشانک‌های خودکار ساخته‌شده که ارجاع صفحهٔ نادرست دارند +- افزودن نشانک‌های رنگی برای مشخص کردن بخش‌های مهم در یک لایحهٔ حقوقی + +## نکته‌ها + +- برای ساخت انبوه نشانک از وارد کردن CSV استفاده کنید. قالب آن ساده است: `title,page,level` که در آن سطح 1 بالاترین سطح است. +- حالت انتخاب به شما امکان می‌دهد روی نقطه‌ای دقیق از صفحهٔ PDF کلیک کنید تا مقصد نشانک تعیین شود، که دقیق‌تر از هدف‌گیری صرفاً یک شمارهٔ صفحه است. +- پیش از تغییرات اساسی، نشانک‌های خود را صادر کنید تا نسخهٔ پشتیبان داشته باشید. + +## ابزارهای مرتبط + +- [فهرست مطالب](./table-of-contents) +- [ویرایشگر PDF](./edit-pdf) +- [افزودن برچسب صفحه](./add-page-labels) diff --git a/docs/fa/tools/cbz-to-pdf.md b/docs/fa/tools/cbz-to-pdf.md new file mode 100644 index 00000000..7d02434c --- /dev/null +++ b/docs/fa/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ به PDF +description: تبدیل آرشیوهای کمیک CBZ و CBR به PDF در مرورگر. رایگان، خصوصی و بدون نیاز به بارگذاری. +--- + +# CBZ به PDF + +فایل‌های آرشیو کمیک را به PDF تبدیل کنید. CBZ و CBR قالب‌های استاندارد کمیک‌های دیجیتال هستند؛ در واقع فقط آرشیوهای ZIP یا RAR پر از تصویرند. این ابزار هر صفحه را استخراج می‌کند، ترتیب خواندن را حفظ می‌کند و یک PDF تمیز می‌سازد که در آن هر تصویر به یک صفحهٔ تمام‌اندازه تبدیل می‌شود. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :--- | :----- | :------------------------------------------------ | +| CBZ | `.cbz` | آرشیو کمیک مبتنی بر ZIP (پردازش محلی با pdf-lib) | +| CBR | `.cbr` | آرشیو کمیک مبتنی بر RAR (پردازش با موتور PyMuPDF) | + +مبدل CBZ تصاویر JPEG، PNG، GIF، BMP، WebP، AVIF، TIFF، HEIC و JXL داخل آرشیو را تشخیص می‌دهد. قالب‌های غیراستاندارد پیش از جاسازی به‌طور خودکار به PNG تبدیل می‌شوند. + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های CBZ یا CBR خود را بکشید و رها کنید. می‌توانید هر دو قالب را در یک دسته ترکیب کنید. +2. فایل‌های فهرست‌شده را بررسی کنید. هر کدام را که لازم ندارید حذف کنید یا برای افزودن فایل‌های بیشتر روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. روی **تبدیل به PDF** کلیک کنید. برای فایل‌های CBZ، ابزار آرشیو را از حالت فشرده خارج می‌کند، فایل‌های تصویر را به ترتیب طبیعی نام مرتب می‌کند، قالب واقعی هر تصویر را تشخیص می‌دهد و آن‌ها را با pdf-lib در یک PDF جاسازی می‌کند. فایل‌های CBR به‌جای آن از طریق موتور PyMuPDF پردازش می‌شوند. +4. یک فایل به‌صورت PDF دانلود می‌شود. چند فایل یک آرشیو ZIP با نام `comic-converted.zip` تولید می‌کنند. + +## گزینه‌ها + +نیازی به پیکربندی نیست. هر تصویر به صفحه‌ای با اندازهٔ ابعاد اصلی خودش تبدیل می‌شود، بنابراین صفحات دوبرگی عریض و صفحات تکی باریک می‌مانند. + +## کاربردها + +- خواندن کمیک در برنامهٔ تبلت یا تلفن که از PDF پشتیبانی می‌کند اما از CBZ/CBR نه +- چاپ صفحات مشخصی از یک کمیک دیجیتال +- بایگانی مجموعهٔ کمیک در قالبی که هر نمایشگر فایلی می‌تواند باز کند +- اشتراک‌گذاری کمیک با کسی که کمیک‌خوان اختصاصی ندارد + +## نکته‌ها + +- تصاویر داخل آرشیو با ترتیب طبیعی مرتب می‌شوند (بنابراین `page2.jpg` پیش از `page10.jpg` می‌آید). برای ترتیب درست صفحات، فایل‌ها را با شماره‌گذاری یکنواخت نام‌گذاری کنید. +- مبدل قالب تصاویر را از روی امضای دودویی آن‌ها تشخیص می‌دهد، نه پسوند فایل. یک PNG که اشتباهاً `.jpg` نام‌گذاری شده باشد همچنان درست جاسازی می‌شود. +- فایل‌های CBZ بدون بارگیری موتور PyMuPDF و کاملاً در مرورگر پردازش می‌شوند، بنابراین سریع‌تر از فایل‌های CBR تبدیل می‌شوند. + +## ابزارهای مرتبط + +- [EPUB به PDF](./epub-to-pdf) +- [MOBI به PDF](./mobi-to-pdf) +- [تصاویر به PDF](./image-to-pdf) diff --git a/docs/fa/tools/change-permissions.md b/docs/fa/tools/change-permissions.md new file mode 100644 index 00000000..aa140e52 --- /dev/null +++ b/docs/fa/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: تغییر مجوزها +description: تنظیم یا تغییر مجوزهای استفاده از PDF برای چاپ، کپی، ویرایش و حاشیه‌نویسی. با رمزگذاری AES ۲۵۶ بیتی. +--- + +# تغییر مجوزها + +آنچه گیرندگان می‌توانند با PDF شما انجام دهند را دقیق تنظیم کنید. برخلاف رمزگذاری ساده که فقط فایل را پشت گذرواژه قفل می‌کند، این ابزار به شما اجازه می‌دهد چاپ، کپی، ویرایش، حاشیه‌نویسی، پر کردن فرم، سرهم‌بندی سند و استخراج صفحه را به‌صورت انتخابی مجاز یا ممنوع کنید؛ همه با رمزگذاری AES ۲۵۶ بیتی اعمال می‌شوند. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. اگر PDF از قبل رمزگذاری شده است، **گذرواژهٔ فعلی** را وارد کنید. +3. یک **گذرواژهٔ کاربر جدید** (برای باز کردن لازم است) و/یا **گذرواژهٔ مالک جدید** (کنترل مجوزها) تعیین کنید. +4. هر مجوز را با کادرهای علامت روشن یا خاموش کنید. +5. روی **تغییر مجوزها** کلیک کنید. +6. PDF به‌روزشده را دانلود کنید. + +اگر هر دو فیلد گذرواژهٔ جدید را خالی بگذارید، ابزار PDF را به‌طور کامل رمزگشایی می‌کند و همهٔ رمزگذاری‌ها و محدودیت‌ها را برمی‌دارد. + +## کنترل‌های مجوز + +| مجوز | آنچه کنترل می‌کند | +| ------------------------- | ---------------------------------------------- | +| **اجازهٔ چاپ** | اینکه آیا سند قابل چاپ است | +| **اجازهٔ کپی** | اینکه آیا متن و تصاویر قابل انتخاب و کپی هستند | +| **اجازهٔ تغییر** | اینکه آیا محتوای سند قابل ویرایش است | +| **اجازهٔ حاشیه‌نویسی** | اینکه آیا می‌توان نظر، برجسته‌سازی و مهر افزود | +| **اجازهٔ پر کردن فرم‌ها** | اینکه آیا فیلدهای فرم تعاملی قابل تکمیل هستند | +| **اجازهٔ سرهم‌بندی سند** | اینکه آیا صفحات قابل درج، حذف یا چرخش هستند | +| **اجازهٔ استخراج صفحه** | اینکه آیا صفحات جداگانه قابل استخراج هستند | + +همهٔ مجوزها برای اعمال شدن به گذرواژهٔ مالک نیاز دارند. بدون گذرواژهٔ مالک، بیشتر نمایشگرهای PDF پرچم‌های مجوز را نادیده می‌گیرند. + +## مجوزها در PDF چگونه کار می‌کنند + +مجوزهای PDF بخشی از مشخصات رمزگذاری هستند. آن‌ها به‌صورت پرچم‌های بیتی در دیکشنری رمزگذاری ذخیره می‌شوند و نمایشگرهای PDF سازگار آن‌ها را اعمال می‌کنند. تفاوت اصلی: + +- **گذرواژهٔ کاربر**: برای باز کردن فایل لازم است. +- **گذرواژهٔ مالک**: برای تغییر مجوزها یا برداشتن محدودیت‌ها لازم است. بدون آن، پرچم‌های مجوز تعیین می‌کنند کاربر چه عملیاتی می‌تواند انجام دهد. + +اگر فقط گذرواژهٔ مالک تعیین کنید (بدون گذرواژهٔ کاربر)، هر کسی می‌تواند فایل را باز کند اما به عملیات مجاز محدود است. اگر هر دو را تعیین کنید، فایل برای باز شدن گذرواژه می‌خواهد و پس از احراز هویت نیز محدود است. + +## کاربردها + +- توزیع گزارشی که قابل مشاهده و چاپ است اما قابل ویرایش یا کپی نیست +- اشتراک‌گذاری الگوی قراردادی که گیرندگان می‌توانند پر کنند اما نمی‌توانند تغییر دهند +- انتشار کاتالوگ PDF که کپی تصاویر در آن غیرفعال است +- اجازهٔ حاشیه‌نویسی روی پیش‌نویس بازبینی در عین جلوگیری از تغییرات ساختاری + +## نکته‌ها + +- برای اثربخشی، همیشه گذرواژهٔ مالک تعیین کنید. مجوزها بدون گذرواژهٔ مالک قابل اعمال نیستند. +- برخی ابزارهای PDF شخص ثالث پرچم‌های مجوز را نادیده می‌گیرند. برای محافظت قوی‌تر، رستر کردن PDF یا استفاده از DRM را در نظر بگیرید. +- از این ابزار برای ارتقای PDFهای قدیمی رمزگذاری‌شده با RC4 به AES-256 استفاده کنید. + +## ابزارهای مرتبط + +- [رمزگذاری PDF](./protect-pdf): محافظت ساده با گذرواژه بدون مجوزهای جزئی +- [رمزگشایی PDF](./unlock-pdf): برداشتن کامل رمزگذاری +- [حذف محدودیت‌ها](./remove-restrictions): برداشتن همهٔ محدودیت‌ها وقتی گذرواژهٔ مالک را دارید diff --git a/docs/fa/tools/combine-single-page.md b/docs/fa/tools/combine-single-page.md new file mode 100644 index 00000000..08c4b520 --- /dev/null +++ b/docs/fa/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: ترکیب در یک صفحه +description: به هم دوختن همهٔ صفحات PDF در یک طومار پیوستهٔ عمودی یا افقی. +--- + +# ترکیب در یک صفحه + +همهٔ صفحات یک PDF را در یک صفحهٔ بلند ادغام کنید. صفحات به‌صورت عمودی (مانند طومار) یا افقی (کنار هم) به هم دوخته می‌شوند و خروجی یک صفحهٔ پیوسته است. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. جهت چیدمان را انتخاب کنید: **عمودی** (صفحات از بالا به پایین روی هم) یا **افقی** (صفحات کنار هم). +3. فاصلهٔ بین صفحات را بر حسب پوینت تعیین کنید. +4. یک رنگ پس‌زمینه برای فاصله‌های بین صفحات انتخاب کنید. +5. در صورت تمایل جداکننده‌ها (خطوط نازک بین صفحات) را فعال کنید و ضخامت و رنگ آن‌ها را تنظیم کنید. +6. روی دکمهٔ پردازش کلیک کنید. خروجی یک PDF تک‌صفحه‌ای است. + +## ویژگی‌ها + +- دوختن صفحات به‌صورت عمودی یا افقی +- فاصلهٔ قابل تنظیم بین صفحات +- انتخابگر رنگ پس‌زمینه برای نواحی فاصله +- خطوط جداکنندهٔ اختیاری با ضخامت و رنگ قابل تنظیم +- رندر هر صفحهٔ اصلی با وضوح کامل روی بوم ترکیبی + +## گزینه‌ها + +| گزینه | توضیحات | +| ------------------- | ----------------------------------- | +| **جهت** | عمودی (روی هم) یا افقی (کنار هم) | +| **فاصلهٔ صفحات** | فاصلهٔ بین صفحات بر حسب پوینت | +| **رنگ پس‌زمینه** | رنگ ناحیهٔ بین صفحات | +| **افزودن جداکننده** | روشن/خاموش کردن خطوط نازک بین صفحات | +| **ضخامت جداکننده** | ضخامت خط بر حسب پوینت | +| **رنگ جداکننده** | رنگ خطوط جداکننده | + +## کاربردها + +- ساخت یک تصویر بلند از وایرفریم یا ماکت طراحی چندصفحه‌ای +- تولید نمای پیوستهٔ قابل پیمایش از یک سند برای جاسازی در وب +- به هم دوختن یک کمیک یا استوری‌بورد چندصفحه‌ای در یک نوار +- تولید نمای پانوراما از صفحات متوالی برای بازبینی + +## نکته‌ها + +- جهت عمودی برای اسناد با صفحات عمودی بهترین است. جهت افقی برای محتوای افقی مناسب‌تر است. +- اسناد بزرگ با صفحات زیاد خروجی بسیار بلند یا عریضی تولید می‌کنند. برخی نمایشگرهای PDF ممکن است با صفحات تکی بسیار بزرگ مشکل داشته باشند. +- افزودن جداکننده با رنگ متضاد، دیدن محل پایان یک صفحهٔ اصلی و آغاز صفحهٔ بعدی را آسان می‌کند. + +## ابزارهای مرتبط + +- [N-Up کردن PDF](./n-up-pdf) +- [ادغام PDF](./merge-pdf) +- [تقسیم صفحات](./divide-pages) diff --git a/docs/fa/tools/compare-pdfs.md b/docs/fa/tools/compare-pdfs.md new file mode 100644 index 00000000..194db772 --- /dev/null +++ b/docs/fa/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: مقایسهٔ PDFها +description: مقایسهٔ دو سند PDF به‌صورت کنار هم یا روی‌هم با تشخیص و دسته‌بندی دقیق تغییرات. +--- + +# مقایسهٔ PDFها + +دو PDF بارگذاری کنید و دقیقاً ببینید چه چیزی بین آن‌ها تغییر کرده است. ابزار صفحات را هوشمندانه جفت می‌کند، تفاوت‌ها در متن، تصاویر، حاشیه‌نویسی‌ها، سرصفحه‌ها و قالب‌بندی را تشخیص می‌دهد و آن‌ها را در نمای کنار هم یا روی‌هم نمایش می‌دهد. + +## نحوهٔ کار + +1. دو فایل PDF بارگذاری کنید: نسخهٔ اصلی (چپ) و نسخهٔ بازبینی‌شده (راست). +2. ابزار با استفاده از امضاهای محتوایی، صفحات دو سند را جفت می‌کند. +3. حالت نمایش را انتخاب کنید: **کنار هم** یا **روی‌هم**. +4. با کنترل‌های صفحه‌بندی بین جفت‌صفحه‌ها جابه‌جا شوید. +5. تفاوت‌ها برجسته و دسته‌بندی می‌شوند. از پنل فیلتر برای تمرکز روی انواع خاص تغییر استفاده کنید. +6. در صورت تمایل، مقایسه را به‌صورت گزارش PDF صادر کنید. + +## ویژگی‌ها + +- جفت کردن خودکار صفحات بر اساس شباهت محتوا +- نمای مقایسهٔ کنار هم و روی‌هم +- دسته‌بندی تغییرات: متن، تصویر، سرصفحه/پاصفحه، حاشیه‌نویسی، قالب‌بندی، پس‌زمینه +- فیلترهای جداگانه برای هر دسته جهت نمایش یا پنهان کردن انواع خاص تغییر +- جستجوی تغییرات متنی با فیلتر پرس‌وجو +- پشتیبانی از OCR برای مقایسهٔ اسناد اسکن‌شده +- کنترل‌های بزرگ‌نمایی برای بررسی دقیق +- پیمایش هماهنگ بین پنل‌ها در حالت کنار هم +- صادر کردن نتایج مقایسه به‌صورت PDF + +## گزینه‌ها + +| گزینه | توضیحات | +| ----------------- | ---------------------------------------------------------------------------------------- | +| **حالت نمایش** | کنار هم یا روی‌هم | +| **OCR** | فعال/غیرفعال کردن OCR برای مقایسهٔ اسناد اسکن‌شده | +| **زبان OCR** | زبان استخراج متن با OCR | +| **فیلترهای دسته** | نمایش یا پنهان کردن تغییرات متن، تصویر، سرصفحه/پاصفحه، حاشیه‌نویسی، قالب‌بندی و پس‌زمینه | +| **دامنهٔ تغییر** | در حالت روی‌هم، فیلتر بین همهٔ تغییرات یا فقط محتوا | +| **بزرگ‌نمایی** | تنظیم میزان بزرگ‌نمایی برای بررسی دقیق | + +## کاربردها + +- بازبینی نسخه‌های قرارداد برای یافتن دقیق تغییرات بین نسخه‌ها +- مقایسهٔ ماکت‌های طراحی برای اطمینان از مطابقت خروجی‌های PDF با انتظارات +- ممیزی تغییرات اسناد در صنایع تحت نظارت که هر ویرایش باید ردیابی شود +- اطمینان از اینکه فرایند تبدیل PDF محتوای اصلی را دقیق حفظ کرده است +- بررسی اسناد ترجمه در برابر منبع از نظر تغییرات چیدمان + +## نکته‌ها + +- نمای روی‌هم هر دو سند را روی یکدیگر قرار می‌دهد و تفاوت‌های مکانی (عناصر جابه‌جاشده، تصاویر تغییراندازه‌یافته) را بلافاصله نمایان می‌کند. +- هنگام مقایسهٔ اسناد اسکن‌شده‌ای که لایهٔ متنی ندارند، OCR را فعال کنید. موتور مقایسه متن را از تصاویر صفحه استخراج می‌کند. +- از فیلترهای دسته برای تمرکز روی موارد مهم استفاده کنید. برای مثال، وقتی فقط تفاوت‌های محتوای متنی برایتان مهم است، تغییرات قالب‌بندی را پنهان کنید. + +## ابزارهای مرتبط + +- [مشاهدهٔ فراداده](./view-metadata) +- [OCR روی PDF](./ocr-pdf) +- [ادغام PDF](./merge-pdf) diff --git a/docs/fa/tools/compress-pdf.md b/docs/fa/tools/compress-pdf.md new file mode 100644 index 00000000..8e0ec62a --- /dev/null +++ b/docs/fa/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: فشرده‌سازی PDF +description: کاهش حجم فایل PDF تا ۹۰٪ با موتور Hyper Compress. پشتیبانی از حجم هدف، پردازش دسته‌ای و تنظیمات کیفیت سفارشی. +--- + +# فشرده‌سازی PDF + +فایل‌های PDF خود را بدون خراب کردنشان کوچک کنید. فشرده‌سازی PDF با [Hyper Compress](https://www.bentopdf.com/hyper-compress)، موتور فشرده‌سازی اختصاصی BentoPDF، کار می‌کند. این موتور تصاویر را دوباره فشرده می‌کند، قلم‌ها را زیرمجموعه‌سازی و ادغام می‌کند و داده‌های زائد مانند تصاویر بندانگشتی جاسازی‌شده و داده‌های خصوصی برنامه‌ها را حذف می‌کند. PDF کاملاً کاربردی می‌ماند: متن قابل انتخاب است و پیوندها و فیلدهای فرم همچنان کار می‌کنند. + +Hyper Compress به WebAssembly کامپایل شده و همراه BentoPDF ارائه می‌شود، بنابراین فشرده‌سازی به‌صورت آفلاین و در استقرارهای ایزوله بدون هیچ تنظیم اضافه‌ای کار می‌کند. + +## نحوهٔ کار + +1. یک یا چند PDF را با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها بارگذاری کنید. +2. یک **سطح فشرده‌سازی** انتخاب کنید: کم، متوسط، زیاد یا بدون اتلاف. +3. در صورت تمایل یک **حجم فایل هدف** وارد کنید، یا **تنظیمات سفارشی** را برای کنترل دقیق‌تر باز کنید، از جمله **تبدیل به خاکستری**. +4. روی **فشرده‌سازی PDF** کلیک کنید. برای چند فایل، یک فایل ZIP واحد دانلود می‌کنید. + +## اسناد خاص + +- **PDFهای دارای امضای دیجیتال** بدون تغییر بازگردانده می‌شوند، زیرا هر تغییری امضا را باطل می‌کند. برای حذف امضاها و فشرده‌سازی آن‌ها، **نادیده گرفتن محافظت محتوا** را در تنظیمات سفارشی روشن کنید؛ امضای قابل مشاهده روی صفحه می‌ماند، اما فایل دیگر امضاشده نیست. +- **فایل‌های PDF/A** پس از فشرده‌سازی برچسب PDF/A خود را از دست می‌دهند تا فایل هرگز ادعای انطباقی را نکند که دیگر ندارد. برای حفظ انطباق فایل، **حفظ PDF/A** را در تنظیمات سفارشی روشن کنید. +- **PDFهای محافظت‌شده با گذرواژه** روی کارت فایل خود یک فیلد گذرواژه می‌گیرند. گذرواژه را آنجا وارد کنید تا Hyper Compress خودش فایل را باز کند، بدون مرحلهٔ جداگانهٔ رمزگشایی. با دو یا چند فایل قفل‌شده، یک فیلد مشترک همهٔ فایل‌هایی را که گذرواژهٔ یکسان دارند باز می‌کند. نسخهٔ فشرده‌شده گذرواژه ندارد؛ برای افزودن دوبارهٔ آن از [رمزگذاری PDF](./protect-pdf) استفاده کنید. +- **اسکن‌های بدون لایهٔ متنی** با **رستر کردن صفحات** در تنظیمات سفارشی می‌توانند بیشتر کوچک شوند؛ این گزینه هر صفحه را با یک تصویر بهینه‌شده جایگزین می‌کند. برای هر سندی که متن قابل انتخاب دارد، از جمله اسکن‌های OCR‌شده، این کار انجام نمی‌شود مگر اینکه **نادیده گرفتن محافظت محتوا** روشن باشد. در آن صورت صفحات متنی هم به تصویر تبدیل می‌شوند، پس متن دیگر قابل انتخاب نیست و پیوندها کار نمی‌کنند. + +## سطوح فشرده‌سازی + +| سطح | کیفیت تصویر | حداکثر وضوح | مناسب برای | +| -------------- | ----------------- | ----------- | ------------------------------- | +| **کم** | 80 | 200 DPI | حفظ کیفیت بصری | +| **متوسط** | 50 | 150 DPI | اسناد روزمره | +| **زیاد** | 20 | 72 DPI | پیوست‌های ایمیل، بارگذاری در وب | +| **بدون اتلاف** | تصاویر دست‌نخورده | بدون تغییر | نسخه‌های بایگانی | + +سطح زیاد همچنین ۱۴ قلم استاندارد PDF و قلم‌های مشابه مانند Arial را، در صورتی که بی‌خطر باشد، از حالت جاسازی خارج می‌کند. + +## حجم فایل هدف + +حجمی بر حسب KB یا MB وارد کنید تا Hyper Compress، با شروع از سطحی که انتخاب کرده‌اید، بهترین کیفیت تصویری را بیابد که همچنان در آن حجم جا شود. اگر سند نتواند تا آن اندازه کوچک شود، کوچک‌ترین نسخهٔ ممکن را همراه با پیامی در این باره دریافت می‌کنید. صفحات اختصاصی مانند [فشرده‌سازی PDF به ۱ مگابایت](https://www.bentopdf.com/compress-pdf-to-1mb) با هدف از پیش پرشده باز می‌شوند. + +## تنظیمات سفارشی + +پنل تنظیمات سفارشی را باز کنید تا Hyper Compress را مستقیماً تنظیم کنید. انتخاب یک سطح فشرده‌سازی این مقادیر را به مقادیر آن سطح بازنشانی می‌کند و ویرایش هر کدام سطح را به سفارشی تغییر می‌دهد. + +- **نادیده گرفتن محافظت محتوا**: به‌طور پیش‌فرض Hyper Compress به PDFهای امضاشده دست نمی‌زند و صفحاتی را که متن دارند رستر نمی‌کند. روشن کردن این گزینه هر دو را دور می‌زند. با تغییر سطح، روشن می‌ماند. + +- **تصاویر**: کیفیت تصویر، حداکثر وضوح، نمونه‌برداری مجدد اجباری، کاهش رنگ، برش نواحی نامرئی تصویر، حذف تصاویر جایگزین، ساده‌سازی پروفایل‌های رنگ، JPEG 2000 و حالت بدون اتلاف +- **قلم‌ها**: زیرمجموعه‌سازی، ادغام موارد تکراری و خارج کردن قلم‌های استاندارد و مشابه‌هایشان از حالت جاسازی +- **محتوا**: مسطح‌سازی حاشیه‌نویسی‌ها، فیلدهای فرم یا پیوندها +- **پاک‌سازی**: حذف تصاویر بندانگشتی، داده‌های برنامه، رشته‌های مقاله، اطلاعات ضبط وب، درخت ساختار یا هدف‌های خروجی (output intent) +- **رستر**: جایگزینی صفحات با تصاویر، برای اسکن‌های فقط‌تصویری؛ وقتی سند متن قابل انتخاب دارد انجام نمی‌شود +- **خروجی**: حفظ PDF/A و فشرده‌سازی Brotli برای نمایشگرهای PDF 2.0 که از آن پشتیبانی می‌کنند + +## کاربردها + +- رساندن یک گزارش ۵۰ مگابایتی به زیر محدودیت پیوست ایمیل +- رساندن یک اسکن به زیر محدودیت سخت‌گیرانهٔ بارگذاری یک درگاه با حجم فایل هدف +- بهینه‌سازی PDFهای بازاریابی برای دانلود سریع‌تر از وب‌سایت +- بایگانی مجموعه‌های بزرگ اسناد در جایی که هزینهٔ ذخیره‌سازی مهم است +- کاهش مصرف دادهٔ همراه هنگام اشتراک‌گذاری PDF در پیام‌رسان‌ها + +## نکته‌ها + +- با سطح متوسط شروع کنید. اگر نتیجه هنوز خیلی بزرگ است، یک حجم فایل هدف تعیین کنید یا به سطح زیاد بروید. +- برای اسکن بدون لایهٔ متنی، رستر کردن صفحات را در تنظیمات سفارشی روشن کنید. +- تبدیل به خاکستری، در تنظیمات سفارشی، می‌تواند حجم اسناد پررنگ را کاهش دهد. + +## ابزارهای مرتبط + +- [خطی‌سازی PDF](./linearize-pdf): بهینه‌سازی PDF فشرده‌شده برای نمایش سریع در وب +- [رستر کردن PDF](./rasterize-pdf): تبدیل صفحات به تصویر با DPI مشخص، از جمله صفحات دارای متن +- [ترمیم PDF](./repair-pdf): اصلاح PDFی که هنگام فشرده‌سازی در جای دیگری خراب شده است +- [حذف فراداده](./remove-metadata): حذف داده‌های پنهان برای حفظ حریم خصوصی diff --git a/docs/fa/tools/crop-pdf.md b/docs/fa/tools/crop-pdf.md new file mode 100644 index 00000000..3ceb1c6e --- /dev/null +++ b/docs/fa/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: برش PDF +description: برش بصری صفحات PDF با رسم ناحیهٔ برش روی هر صفحه در ویرایشگری مبتنی بر Cropper.js. +--- + +# برش PDF + +حاشیه‌های صفحات PDF خود را با یک رابط برش بصری کوتاه کنید. یک مستطیل برش را مستقیماً روی هر صفحه رسم کنید، نتیجه را پیش‌نمایش کنید و برش را اعمال کنید. می‌توانید برای صفحات مختلف ناحیه‌های برش متفاوت تعیین کنید یا یک برش یکسان را روی کل سند اعمال کنید. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. ویرایشگر برش باز می‌شود و صفحهٔ اول را با یک لایهٔ برش قابل کشیدن نشان می‌دهد. +3. مستطیل برش را با کشیدن لبه‌ها یا گوشه‌هایش تنظیم کنید. +4. با دکمه‌های ناوبری صفحه بین صفحات جابه‌جا شوید و برای هر کدام ناحیهٔ برش تعیین کنید. +5. روی **برش** کلیک کنید تا برش اعمال و نتیجه دانلود شود. + +## ویژگی‌ها + +- ویرایشگر برش بصری مبتنی بر Cropper.js با دستگیره‌هایی برای تنظیم دقیق +- ناوبری صفحه‌به‌صفحه برای تعیین ناحیهٔ برش جداگانه +- ذخیرهٔ تنظیمات برش برای هر صفحه تا بتوانید برای صفحات مختلف برش‌های متفاوت تعریف کنید +- پیش‌نمایش زندهٔ ناحیهٔ برش انتخاب‌شده +- پشتیبانی از PDF با هر اندازه یا جهت صفحه + +## کاربردها + +- حذف حاشیه‌های پهن از اسناد اسکن‌شده برای تمرکز روی ناحیهٔ محتوا +- حذف علائم برش چاپگر یا علائم ثبت از PDFهای پیش از چاپ +- برش اسلایدهای درس برای حذف ناحیهٔ یادداشت‌های ارائه‌دهنده +- حذف سرصفحه یا پاصفحه از همهٔ صفحات پیش از اشتراک‌گذاری بخشی از سند +- تغییر اندازهٔ صفحات برای تناسب با یک نمایشگر یا چیدمان چاپی خاص + +## نکته‌ها + +- لایهٔ برش را می‌توان آزادانه تغییر اندازه و جابه‌جا کرد. گوشه‌ها را برای تغییر اندازهٔ متناسب و لبه‌ها را برای تنظیم در یک محور بکشید. +- برای اسنادی که همهٔ صفحاتشان برش یکسانی نیاز دارند، آن را روی صفحهٔ اول تعیین کنید؛ ابزار ناحیهٔ برش شما را هنگام جابه‌جایی بین صفحات به خاطر می‌سپارد. +- اگر به‌جای برش بصری نیاز به یکسان‌سازی اندازهٔ صفحات دارید، ابزار اصلاح اندازهٔ صفحه ممکن است مناسب‌تر باشد. + +## ابزارهای مرتبط + +- [ویرایشگر PDF](./edit-pdf) +- [شماره‌گذاری صفحات](./page-numbers) +- [حذف صفحات خالی](./remove-blank-pages) diff --git a/docs/fa/tools/csv-to-pdf.md b/docs/fa/tools/csv-to-pdf.md new file mode 100644 index 00000000..f342a83b --- /dev/null +++ b/docs/fa/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV به PDF +description: تبدیل فایل‌های صفحه‌گستردهٔ CSV به جدول‌های قالب‌بندی‌شدهٔ PDF مستقیماً در مرورگر. +--- + +# CSV به PDF + +فایل‌های CSV را به اسناد PDF تمیز و قالب‌بندی‌شده تبدیل کنید. هر CSV تجزیه و به‌صورت جدول در PDF خروجی رندر می‌شود. این کار زمانی مفید است که بخواهید داده‌های جدولی را چاپ یا به اشتراک بگذارید بدون اینکه گیرنده به نرم‌افزار صفحه‌گسترده نیاز داشته باشد. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :------ | +| CSV | `.csv` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا یک یا چند فایل CSV را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های بیشتری اضافه کنید یا موارد ناخواسته را حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. یک نشانگر پیشرفت وضعیت تبدیل را نشان می‌دهد. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در `csv-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +این ابزار پیکربندی اضافه‌ای ندارد. CSV به‌طور خودکار تجزیه و به‌صورت جدول قالب‌بندی می‌شود. + +## خروجی + +| تعداد ورودی | خروجی | +| :---------- | :------------------------------------------------------- | +| 1 فایل | دانلود یک PDF (مثلاً `data.pdf`) | +| 2+ فایل | آرشیو ZIP (`csv-converted.zip`) شامل یک PDF برای هر فایل | + +## کاربردها + +- تبدیل گزارش‌های صادرشده از پایگاه داده به جدول‌های PDF قابل چاپ +- اشتراک‌گذاری داده‌های مالی یا فهرست موجودی با افرادی که Excel ندارند +- ساخت نسخهٔ PDF از فایل‌های گزارش CSV برای مستندات انطباق +- چاپ فهرست نشانی‌ها، کارنامه‌ها یا هر دادهٔ جدولی ذخیره‌شده به‌صورت CSV + +## نکته‌ها + +- برای بهترین نتیجه، مطمئن شوید CSV شما از جداکنندهٔ استاندارد کاما استفاده می‌کند. ابزار از قواعد رایج تجزیهٔ CSV پیروی می‌کند. +- اگر CSV شما ستون‌های زیادی دارد، ممکن است جدول برای جا شدن در عرض صفحه فشرده شود. تقسیم مجموعه‌داده‌های عریض به چند فایل را در نظر بگیرید. +- برای فایل‌های Excel (`.xls`، `.xlsx`) از ابزار [Excel به PDF](./excel-to-pdf) استفاده کنید که قالب‌بندی صفحه‌گسترده و چند برگه را حفظ می‌کند. + +## ابزارهای مرتبط + +- [Excel به PDF](./excel-to-pdf) +- [متن به PDF](./txt-to-pdf) +- [JSON به PDF](./json-to-pdf) diff --git a/docs/fa/tools/delete-pages.md b/docs/fa/tools/delete-pages.md new file mode 100644 index 00000000..d32d84c1 --- /dev/null +++ b/docs/fa/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: حذف صفحات +description: حذف صفحات مشخص از PDF با شمارهٔ صفحه، بازه یا انتخاب بصری تصاویر بندانگشتی. +--- + +# حذف صفحات + +صفحات ناخواسته را از یک سند PDF حذف کنید. صفحات مورد نظر برای حذف را با تایپ شمارهٔ صفحه یا بازه مشخص کنید، یا مستقیماً روی تصاویر بندانگشتی صفحات کلیک کنید تا برای حذف علامت بخورند. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. ابزار پیش‌نمایش بندانگشتی همهٔ صفحات را رندر می‌کند. +2. صفحات مورد نظر برای حذف را با نحو بازه در فیلد متنی وارد کنید (مثلاً `2, 5-8`)، یا روی تصاویر بندانگشتی کلیک کنید تا انتخاب یا لغو انتخاب شوند. +3. صفحات علامت‌خورده به‌صورت بصری برجسته می‌شوند تا بتوانید انتخاب خود را تأیید کنید. +4. روی دکمهٔ پردازش کلیک کنید. یک PDF جدید بدون صفحات انتخاب‌شده ساخته می‌شود. + +## ویژگی‌ها + +- انتخاب متنی صفحات با نحو بازه (`2, 5-8, 12`) +- شبکهٔ بصری تصاویر بندانگشتی برای انتخاب با کلیک +- برجسته‌سازی هم‌زمان صفحات علامت‌خورده برای حذف +- اعتبارسنجی ورودی در برابر تعداد واقعی صفحات +- حفظ همهٔ صفحات حذف‌نشده به ترتیب اصلی + +## کاربردها + +- حذف صفحات خالی یا اضافی از یک سند اسکن‌شده +- حذف صفحات جلد یا پیوست‌ها پیش از اشتراک‌گذاری سند +- پاک‌سازی صفحات پیش‌نویسی که اشتباهاً در PDF نهایی مانده‌اند +- حذف صفحات حاوی اطلاعات حساس پیش از توزیع + +## نکته‌ها + +- حذف صفحات روی محتوا یا قالب‌بندی صفحات باقی‌مانده اثری ندارد. خروجی نسخه‌ای دقیق از سند اصلی منهای صفحات حذف‌شده است. +- اگر می‌خواهید به‌جای حذف صفحاتی خاص، فقط صفحاتی خاص را نگه دارید، [استخراج صفحات](./extract-pages) مناسب‌تر است. +- نمای بندانگشتی به‌صورت تدریجی بارگیری می‌شود، بنابراین اسناد بزرگ نیز روان می‌مانند. + +## ابزارهای مرتبط + +- [استخراج صفحات](./extract-pages) +- [تکثیر و سازماندهی](./organize-pdf) +- [تقسیم PDF](./split-pdf) diff --git a/docs/fa/tools/deskew-pdf.md b/docs/fa/tools/deskew-pdf.md new file mode 100644 index 00000000..18041cba --- /dev/null +++ b/docs/fa/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: صاف‌کردن PDF +description: صاف کردن خودکار صفحات کج در PDFهای اسکن‌شده با تشخیص کجی OpenCV. تنظیمات قابل تغییر آستانه و DPI. +--- + +# صاف‌کردن PDF + +اسناد اسکن‌شده به‌ندرت کاملاً صاف هستند. حتی کجی اندک، دقت OCR را کاهش می‌دهد و چاپ را نامرتب نشان می‌دهد. این ابزار با الگوریتم‌های پردازش تصویر OpenCV زاویهٔ کجی هر صفحه را تشخیص می‌دهد و آن را به حالت تراز برمی‌گرداند. + +## نحوهٔ کار + +1. یک یا چند PDF اسکن‌شده بارگذاری کنید. +2. **آستانهٔ کجی** را تعیین کنید؛ صفحاتی که کجی تشخیص‌داده‌شده‌شان کمتر از این مقدار است دست‌نخورده می‌مانند. +3. یک **کیفیت پردازش (DPI)** انتخاب کنید؛ DPI بالاتر دقت تشخیص را بهبود می‌دهد اما زمان بیشتری می‌برد. +4. روی **صاف‌کردن PDF** کلیک کنید. +5. پس از پردازش، پنل نتایج زاویهٔ تشخیص‌داده‌شدهٔ هر صفحه و اصلاح شدن یا نشدن آن را نشان می‌دهد. + +## گزینه‌ها + +| تنظیم | مقادیر | پیش‌فرض | +| --------------- | ----------------------- | ------- | +| **آستانهٔ کجی** | 0.1، 0.5، 1.0، 2.0 درجه | 0.5 | +| **DPI پردازش** | 100، 150، 200، 300 | 150 | + +## تشخیص کجی چگونه کار می‌کند + +ابزار هر صفحه را با DPI انتخاب‌شده به تصویر رندر می‌کند، سپس با OpenCV زاویهٔ خطوط غالب در محتوا را تشخیص می‌دهد. اگر کجی تشخیص‌داده‌شده از آستانه بیشتر باشد، صفحه با زاویهٔ معکوس چرخانده می‌شود تا صاف شود. صفحات زیر آستانه بدون تغییر عبور می‌کنند. + +## کاربردها + +- مرتب کردن قراردادها یا اسناد حقوقی که دسته‌ای اسکن شده‌اند +- آماده‌سازی رسیدها یا فاکتورهای اسکن‌شده برای پردازش OCR +- صاف کردن صفحات اسکنر تخت با قرارگیری نامنظم کاغذ +- بهبود کیفیت بصری مواد بایگانی دیجیتال‌شده + +## نکته‌ها + +- اگر برای OCR به ترازبندی کاملاً دقیق نیاز دارید، آستانه را به 0.1 درجه کاهش دهید. +- 150 DPI برای بیشتر اسناد سریع و دقیق است. برای متن بسیار ریز یا صفحات پرجزئیات از 300 DPI استفاده کنید. +- صاف‌کردن روی اسنادی با خطوط متنی افقی واضح بهترین عملکرد را دارد. ممکن است با صفحاتی که بیشترشان تصویر یا عناصر طراحی مورب هستند مشکل داشته باشد. + +## ابزارهای مرتبط + +- [رستر کردن PDF](./rasterize-pdf): تبدیل خروجی صاف‌شده به PDF مسطح مبتنی بر تصویر +- [فشرده‌سازی PDF](./compress-pdf): کاهش حجم فایل پس از صاف‌کردن +- [ترمیم PDF](./repair-pdf): اصلاح مشکلات ساختاری در PDFهای اسکن‌شده diff --git a/docs/fa/tools/digital-sign-pdf.md b/docs/fa/tools/digital-sign-pdf.md new file mode 100644 index 00000000..b44b8e75 --- /dev/null +++ b/docs/fa/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: امضای دیجیتال +description: افزودن امضای دیجیتال رمزنگاری‌شده به PDF با گواهی‌های X.509. پشتیبانی از قالب‌های PKCS#12 و PEM با گزینه‌های امضای قابل مشاهده. +--- + +# امضای دیجیتال + +امضای دیجیتال اثباتی رمزنگاری‌شده است که شخص مشخصی سند را امضا کرده و سند از آن زمان تغییر نکرده است. برخلاف امضای دستی کشیده‌شده (که فقط یک تصویر است)، امضای دیجیتال از گواهی‌های X.509 و استانداردهای PKCS#7 برای ارائهٔ اصالت و یکپارچگی قابل تأیید استفاده می‌کند. + +BentoPDF امضای دیجیتال را کاملاً در مرورگر شما اعمال می‌کند. کلید خصوصی شما هرگز از دستگاهتان خارج نمی‌شود. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. فایل گواهی خود را بارگذاری کنید (.pfx، .p12 یا .pem). +3. گذرواژهٔ گواهی را برای باز کردن آن وارد کنید. ابزار موضوع، صادرکننده و دورهٔ اعتبار گواهی را نمایش می‌دهد. +4. در صورت تمایل فرادادهٔ امضا (دلیل، مکان، اطلاعات تماس) را پیکربندی کنید. +5. در صورت تمایل یک **امضای قابل مشاهده** با موقعیت، اندازه، تصویر و متن سفارشی فعال کنید. +6. روی **امضای PDF** کلیک کنید. + +## قالب‌های گواهی پشتیبانی‌شده + +| قالب | پسوندها | توضیحات | +| ----------- | ---------- | ----------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | بستهٔ استاندارد صنعتی شامل کلید خصوصی و زنجیرهٔ گواهی. رایج‌ترین قالب. | +| **PEM** | .pem | قالب متنی. باید هم گواهی و هم کلید خصوصی را در یک فایل داشته باشد. از کلیدهای خصوصی رمزگذاری‌شده پشتیبانی می‌کند. | + +## گزینه‌های امضای قابل مشاهده + +در صورت فعال بودن، یک بلوک امضای قابل مشاهده روی صفحهٔ PDF رندر می‌شود: + +- **موقعیت**: مختصات X/Y و عرض/ارتفاع بر حسب پوینت +- **صفحه**: صفحهٔ اول، صفحهٔ آخر، همهٔ صفحات یا یک شمارهٔ صفحهٔ مشخص +- **تصویر**: بارگذاری تصویر PNG، JPG یا WebP (امضای دست‌نویس، مهر شرکت و غیره) +- **متن**: متن سفارشی با رنگ و اندازهٔ قلم قابل تنظیم. اگر تصویر یا متنی ارائه نشود، ابزار به‌طور خودکار متنی از نام رایج (Common Name) گواهی و تاریخ فعلی می‌سازد. + +## فرادادهٔ امضا + +- **دلیل**: چرا سند امضا شده است (مثلاً «تأیید شد»، «بازبینی شد») +- **مکان**: محل امضا (مثلاً «New York, NY») +- **اطلاعات تماس**: راه ارتباط با امضاکننده (مثلاً نشانی ایمیل) + +## نکته دربارهٔ اتصال اینترنت + +امضا ممکن است به اتصال اینترنت نیاز داشته باشد. کتابخانهٔ امضا زنجیرهٔ گواهی را از نشانی‌های جاسازی‌شده در افزونهٔ Authority Information Access (AIA) گواهی شما دریافت می‌کند. اگر آن سرورها در دسترس نباشند، امضا برای گواهی‌هایی که به اعتبارسنجی زنجیره نیاز دارند ناموفق خواهد بود. + +## کاربردها + +- امضای قراردادها، پیشنهادها و توافق‌نامه‌ها با امضای دیجیتال دارای اعتبار قانونی +- تأیید اسناد رسمی در گردش‌کارهایی که احراز هویت مبتنی بر PKI لازم دارند +- امضای فاکتورهای PDF برای انطباق با مقررات (بسیاری از کشورهای اتحادیهٔ اروپا فاکتورهای الکترونیکی با امضای دیجیتال می‌خواهند) +- افزودن تأیید سازمانی به نقشه‌های مهندسی یا اسناد کیفیت + +## نکته‌ها + +- گواهی‌های خودامضا برای آزمایش کار می‌کنند اما در Adobe Reader هشدار نشان می‌دهند. برای اسناد واقعی از گواهی یک مرجع صدور گواهی معتبر استفاده کنید. +- امضای قابل مشاهده صرفاً بصری است. امضای رمزنگاری‌شده صرف‌نظر از فعال بودن بلوک قابل مشاهده جاسازی می‌شود. +- PDF امضاشدهٔ خود را با ابزار اعتبارسنجی امضا بررسی کنید تا از سالم بودن امضا مطمئن شوید. + +## ابزارهای مرتبط + +- [اعتبارسنجی امضا](./validate-signature-pdf): تأیید امضاهای دیجیتال در PDFهای امضاشده +- [مسطح‌سازی PDF](./flatten-pdf): مسطح کردن فرم‌ها پیش از امضا برای جلوگیری از تغییرات +- [رمزگذاری PDF](./protect-pdf): افزودن محافظت با گذرواژه علاوه بر امضای دیجیتال +- [حذف فراداده](./remove-metadata): حذف فراداده پیش از امضا diff --git a/docs/fa/tools/divide-pages.md b/docs/fa/tools/divide-pages.md new file mode 100644 index 00000000..53e6b0a4 --- /dev/null +++ b/docs/fa/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: تقسیم صفحات +description: تقسیم صفحات PDF به‌صورت افقی یا عمودی به زیرصفحه‌های کوچک‌تر. +--- + +# تقسیم صفحات + +صفحات PDF را با برش افقی یا عمودی به دو نیم تقسیم کنید. این کار زمانی مفید است که یک صفحه محتوایی دارد که باید به صفحات جداگانه تفکیک شود؛ برای مثال، یک چیدمان دوستونی که به‌صورت یک صفحهٔ عریض اسکن شده است. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. جهت تقسیم را انتخاب کنید: **عمودی** (نیمه‌های چپ/راست) یا **افقی** (نیمه‌های بالا/پایین). +3. در صورت تمایل یک بازهٔ صفحه تعیین کنید تا فقط صفحات خاصی تقسیم شوند. برای تقسیم همهٔ صفحات خالی بگذارید. +4. روی دکمهٔ پردازش کلیک کنید تا PDF تقسیم‌شده ساخته شود. + +## ویژگی‌ها + +- تقسیم عمودی: هر صفحه را به نیمه‌های چپ و راست تقسیم می‌کند +- تقسیم افقی: هر صفحه را به نیمه‌های بالا و پایین تقسیم می‌کند +- فیلتر بازهٔ صفحه برای تقسیم انتخابی صفحات مشخص +- صفحات انتخاب‌نشده بدون تغییر عبور می‌کنند +- حفظ کیفیت محتوا بدون رندر مجدد + +## کاربردها + +- جدا کردن صفحات اسکن‌شدهٔ دوتایی (مثلاً اسکن کتاب با صفحات چپ و راست روی یک برگ) +- تقسیم PDF افقی با محتوای کنار هم به صفحات عمودی جداگانه +- تقسیم اینفوگرافیک‌ها یا پوسترهای بلند به بخش‌های بالا و پایین +- آماده‌سازی اسناد عریض برای چاپ روی کاغذ استاندارد + +## نکته‌ها + +- اگر محتوای صفحات شما نامتوازن توزیع شده باشد، تقسیم همچنان دقیقاً از نقطهٔ میانی انجام می‌شود. برای تقسیم نامتقارن، [برش PDF](./crop-pdf) را در نظر بگیرید. +- اگر صفحات شما پیش یا پس از تقسیم به چرخش نیاز دارند، این ابزار را با [چرخاندن PDF](./rotate-pdf) ترکیب کنید. + +## ابزارهای مرتبط + +- [تقسیم PDF](./split-pdf) +- [برش PDF](./crop-pdf) +- [N-Up کردن PDF](./n-up-pdf) +- [پوستری‌کردن PDF](./posterize-pdf) diff --git a/docs/fa/tools/duplex-collate.md b/docs/fa/tools/duplex-collate.md new file mode 100644 index 00000000..404b3d60 --- /dev/null +++ b/docs/fa/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: تلفیق دورو +description: مرتب‌سازی PDFهای اسکن دورو که صفحات رو و پشت را در بلوک‌های جداگانه دارند به ترتیب درست رو/پشت. +--- + +# تلفیق دورو + +تلفیق دورو برای گردش‌کارهای اسکن ADF طراحی شده است که در آن یک PDF شامل دو بلوک صفحه است: + +- ابتدا همهٔ روها +- سپس همهٔ پشت‌ها + +به‌جای تقسیم و سرهم کردن دستی، این ابزار دو بلوک را یک‌درمیان به ترتیب طبیعی خواندن درمی‌آورد: رو۱، پشت۱، رو۲، پشت۲ و به همین ترتیب. + +## نحوهٔ کار + +1. یک PDF واحد حاصل از اسکن دوروی دسته‌ای بارگذاری کنید. +2. نقطهٔ تقسیم را جایی که بلوک روها تمام می‌شود تعیین کنید. +3. نحوهٔ برخورد با بلوک پشت‌ها را انتخاب کنید: + - **معکوس کردن بلوک پشت‌ها** (رایج وقتی دسته پیش از اسکن پشت‌ها برگردانده می‌شود) + - **نگه داشتن بلوک پشت‌ها بدون تغییر** +4. روی **تلفیق PDF** کلیک کنید تا نتیجهٔ مرتب‌شده دانلود شود. + +## گزینه‌ها + +- **تشخیص خودکار تقسیم (نصف)**: نقطهٔ تقسیم را روی `ceil(totalPages / 2)` تنظیم می‌کند. +- **هشدار صفحات فرد**: وقتی تعداد کل صفحات فرد است هشدار می‌دهد (معمولاً نشانهٔ ناهماهنگی اسکن). +- **تأیید بلوک‌های نابرابر**: وقتی اندازهٔ بلوک‌های رو/پشت متفاوت است تأیید می‌خواهد. +- **خروجی گروهی**: خروجی تلفیق‌شده را بر اساس تعداد صفحات سند اصلی به PDFهای جداگانه تقسیم و به‌صورت ZIP دانلود می‌کند. + +## رفتار خروجی + +- **پیش‌فرض**: یک PDF خروجی (یک PDF ورودی، یک PDF خروجی). +- **حالت گروهی**: خروجی بر اساس مقدار صفحه‌به‌ازای‌هر‌سند شما بخش‌بندی می‌شود؛ اگر چند بخش تولید شود، به‌صورت یک ZIP دانلود می‌شوند، وگرنه یک PDF دانلود می‌شود. + +اگر اندازهٔ بلوک‌ها نابرابر باشد، ابتدا صفحات جفت‌شده تلفیق می‌شوند و صفحات بی‌جفت باقی‌مانده به انتها افزوده می‌شوند. + +## کاربردهای رایج + +- بازگرداندن ترتیب پس از اسکن دسته‌ای از فرم‌های دورو در دو نوبت. +- بازسازی بسته‌های رو/پشت از اسکنرهای اداری که ابتدا همهٔ روها و سپس همهٔ پشت‌ها را خروجی می‌دهند. +- پس‌پردازش اسکن‌های بایگانی پیش از تقسیم به فایل‌های جداگانه برای هر سند. + +## نکته‌ها + +- بیشتر دسته‌های دورو باید تعداد کل صفحات زوج داشته باشند. +- اگر پشت‌ها در خروجی وارونه به نظر می‌رسند، بین **معکوس کردن بلوک پشت‌ها** و **نگه داشتن بلوک پشت‌ها بدون تغییر** جابه‌جا شوید. +- برای اسناد اصلی ۲ صفحه‌ای (رو+پشت)، از خروجی گروهی با `2` صفحه برای هر سند استفاده کنید. + +## ابزارهای مرتبط + +- [ادغام یک‌درمیان صفحات](./alternate-merge) +- [تقسیم PDF](./split-pdf) +- [ادغام PDF](./merge-pdf) +- [تکثیر و سازماندهی](./organize-pdf) diff --git a/docs/fa/tools/edit-attachments.md b/docs/fa/tools/edit-attachments.md new file mode 100644 index 00000000..523412c4 --- /dev/null +++ b/docs/fa/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: ویرایش پیوست‌ها +description: مشاهده و حذف انتخابی فایل‌های پیوست جاسازی‌شده در یک سند PDF. +--- + +# ویرایش پیوست‌ها + +پیوست‌های فایل داخل یک PDF را بررسی و مدیریت کنید. ابزار همهٔ فایل‌های جاسازی‌شده را با نام و سطح پیوستشان فهرست می‌کند و سپس به شما اجازه می‌دهد پیوست‌های جداگانه را برای حذف علامت بزنید یا همه را یکجا حذف کنید. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. ابزار به‌طور خودکار پیوست‌ها را جستجو و در یک فهرست نمایش می‌دهد. +3. هر پیوست نام فایل و اینکه پیوست سطح سند است یا سطح صفحه را نشان می‌دهد. +4. روی نماد سطل زباله کنار هر پیوست کلیک کنید تا برای حذف علامت بخورد (برای لغو، دوباره کلیک کنید). +5. از دکمهٔ **حذف همهٔ پیوست‌ها** برای انتخاب همه یکجا، یا **لغو انتخاب همه** برای پاک کردن انتخاب‌ها استفاده کنید. +6. روی دکمهٔ پردازش کلیک کنید تا PDF جدیدی بدون پیوست‌های انتخاب‌شده ذخیره شود. + +## ویژگی‌ها + +- فهرست همهٔ پیوست‌های سطح سند و سطح صفحه +- حذف تکی یا گروهی پیوست‌ها +- روشن و خاموش کردن انتخاب پیش از اعمال تغییرات +- خط‌خوردگی و تغییر شفافیت بصری روی موارد علامت‌خورده برای حذف +- دانلود PDF تغییریافته بدون پیوست‌های انتخاب‌شده + +## کاربردها + +- حذف فایل‌های قدیمی یا نادرست جاسازی‌شده در سند پیش از توزیع دوباره +- حذف پیوست‌های حساس (داده‌های مالی، اطلاعات شخصی) از PDF پیش از اشتراک‌گذاری +- کاهش حجم PDF با حذف فایل‌های جاسازی‌شدهٔ بزرگی که دیگر لازم نیستند +- ممیزی محتوای جاسازی‌شده و پاک‌سازی سند پیش از بایگانی + +## نکته‌ها + +- پیوست‌های علامت‌خورده برای حذف با خط‌خوردگی بصری نمایش داده می‌شوند. اگر نظرتان عوض شد، می‌توانید پیش از پردازش آن‌ها را برگردانید. +- اگر پیوستی یافت نشود، ابزار پیام واضح «پیوستی یافت نشد» را نمایش می‌دهد؛ یعنی PDF هیچ فایل جاسازی‌شده‌ای ندارد. + +## ابزارهای مرتبط + +- [افزودن پیوست](./add-attachments) +- [استخراج پیوست‌ها](./extract-attachments) +- [مشاهدهٔ فراداده](./view-metadata) diff --git a/docs/fa/tools/edit-metadata.md b/docs/fa/tools/edit-metadata.md new file mode 100644 index 00000000..c9b677bd --- /dev/null +++ b/docs/fa/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: ویرایش فراداده +description: مشاهده و تغییر فیلدهای فرادادهٔ PDF از جمله عنوان، نویسنده، کلیدواژه‌ها، تاریخ‌ها و ویژگی‌های سفارشی. +--- + +# ویرایش فراداده + +فرادادهٔ جاسازی‌شده در یک فایل PDF را ویرایش کنید. ابزار فرمی را با فرادادهٔ موجود سند از پیش پر می‌کند، به شما اجازه می‌دهد هر فیلدی را تغییر دهید و تغییرات را در یک PDF جدید ذخیره می‌کند. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. ابزار فرادادهٔ فعلی آن را می‌خواند و فرم را پر می‌کند. +2. هر یک از فیلدهای استاندارد را ویرایش کنید: عنوان، نویسنده، موضوع، کلیدواژه‌ها، سازنده، تولیدکننده. +3. تاریخ ایجاد و تاریخ تغییر را با انتخابگرهای تاریخ و زمان تنظیم کنید. +4. با کلیک روی دکمهٔ افزودن و وارد کردن یک جفت کلید و مقدار، فیلدهای فرادادهٔ سفارشی اضافه کنید. +5. روی دکمهٔ پردازش کلیک کنید تا PDF تغییریافته ذخیره شود. + +## ویژگی‌ها + +- پیش‌پر کردن همهٔ فرادادهٔ موجود از PDF بارگذاری‌شده +- فیلدهای استاندارد: عنوان، نویسنده، موضوع، کلیدواژه‌ها، سازنده، تولیدکننده +- انتخابگرهای تاریخ و زمان برای تاریخ ایجاد و تاریخ تغییر +- فیلدهای فرادادهٔ سفارشی کلید و مقدار برای ویژگی‌های دلخواه +- ذخیرهٔ مستقیم تغییرات در دیکشنری اطلاعات سند PDF + +## فیلدهای قابل ویرایش + +| فیلد | توضیحات | +| ------------------ | ----------------------------------------------- | +| **عنوان** | عنوان سند که در نمایشگرهای PDF نشان داده می‌شود | +| **نویسنده** | شخص یا سازمانی که سند را ساخته است | +| **موضوع** | توضیح کوتاهی از موضوع سند | +| **کلیدواژه‌ها** | عبارت‌های جداشده با کاما برای جستجو و دسته‌بندی | +| **سازنده** | برنامه‌ای که محتوا را در اصل ساخته است | +| **تولیدکننده** | برنامه‌ای که PDF را تولید کرده است | +| **تاریخ ایجاد** | زمانی که سند در اصل ساخته شده است | +| **تاریخ تغییر** | آخرین زمانی که سند تغییر کرده است | +| **فیلدهای سفارشی** | هر جفت کلید و مقدار اضافه‌ای که تعریف می‌کنید | + +## کاربردها + +- تعیین عنوان و نویسندهٔ مناسب پیش از انتشار سند +- افزودن کلیدواژه برای بهبود قابلیت جستجو در سامانه‌های مدیریت اسناد +- به‌روزرسانی تاریخ تغییر برای بازتاب نسخهٔ فعلی +- افزودن فیلدهای فرادادهٔ سفارشی مانند دپارتمان، شناسهٔ پروژه یا طبقه‌بندی +- پاک‌سازی فرادادهٔ به‌جامانده از نرم‌افزار تولید اصلی + +## نکته‌ها + +- فیلدهای سفارشی مستقیماً در دیکشنری اطلاعات PDF نوشته می‌شوند. برخی نمایشگرهای PDF ممکن است فیلدهای سفارشی را نمایش ندهند، اما در فایل حفظ می‌شوند. +- برای پاک کردن یک فیلد از فراداده، آن را خالی بگذارید. دکمهٔ پردازش هر آنچه در فرم است را ذخیره می‌کند. +- برای مشاهدهٔ فراداده بدون ویرایش، از [مشاهدهٔ فراداده](./view-metadata) استفاده کنید. برای حذف کامل همهٔ فراداده، از حذف فراداده استفاده کنید. + +## ابزارهای مرتبط + +- [مشاهدهٔ فراداده](./view-metadata) +- [لایه‌های OCG در PDF](./pdf-layers) +- [فشرده‌سازی PDF](./compress-pdf) diff --git a/docs/fa/tools/edit-pdf.md b/docs/fa/tools/edit-pdf.md new file mode 100644 index 00000000..969e8924 --- /dev/null +++ b/docs/fa/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: ویرایشگر PDF +description: حاشیه‌نویسی، برجسته‌سازی، پوشاندن اطلاعات، افزودن شکل و تصویر، جستجو و مشاهدهٔ PDF مستقیماً در مرورگر. +--- + +# ویرایشگر PDF + +ویرایشگر PDF در BentoPDF به شما امکان می‌دهد در PDFهای خود حاشیه‌نویسی، برجسته‌سازی، پوشاندن اطلاعات و درج نظر کنید، شکل و تصویر بیفزایید و جستجو کنید. این ابزار یک ویرایشگر کامل را مستقیماً در مرورگر شما بارگیری می‌کند، بدون نیاز به بارگذاری روی سرور. + +## نحوهٔ کار + +1. PDF خود را با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن بارگذاری کنید. +2. ویرایشگر PDF جاسازی‌شده به‌طور خودکار با سند شما باز می‌شود. +3. از نوار ابزار برای حاشیه‌نویسی، برجسته‌سازی، پوشاندن اطلاعات، افزودن متن، رسم شکل یا درج تصویر استفاده کنید. +4. روی **دانلود PDF ویرایش‌شده** کلیک کنید تا تغییرات ذخیره شوند. + +## ویژگی‌ها + +- نوار ابزار کامل حاشیه‌نویسی با برجسته‌سازی، زیرخط، خط‌خوردگی و رسم آزاد +- درج متن و نظر +- ابزارهای پوشاندن اطلاعات که پس از اعمال، محتوای علامت‌خورده را برای همیشه حذف می‌کنند. اگر هنگام کلیک روی **دانلود PDF ویرایش‌شده** علامتی هنوز اعمال نشده باشد، ویرایشگر پیشنهاد می‌کند ابتدا آن‌ها را اعمال کند. +- ابزارهای شکل برای مستطیل، دایره، خط و پیکان +- درج تصویر روی صفحات PDF +- جستجوی متن داخلی در سراسر سند +- پشتیبانی از چند سند با زبانه‌ها (حداکثر ۱۰ سند باز به‌طور هم‌زمان) +- بارگیری فایل با کشیدن و رها کردن + +## کاربردها + +- بازبینی قراردادها و علامت‌گذاری تغییرات با برجسته‌سازی و نظر +- پوشاندن اطلاعات محرمانه مانند شماره‌های تأمین اجتماعی یا داده‌های مالی پیش از اشتراک‌گذاری +- افزودن حاشیه‌نویسی به نقشه‌های معماری یا مهندسی +- درج لوگو یا مهر شرکت روی صفحات سند +- جستجوی عبارت‌های خاص در اسناد حقوقی طولانی + +## نکته‌ها + +- می‌توانید چند PDF را هم‌زمان باز کنید و با نوار زبانه در بالای ویرایشگر بین آن‌ها جابه‌جا شوید. +- ویرایشگر ساختار اصلی PDF را حفظ می‌کند، بنابراین قلم‌ها، چیدمان‌ها و فیلدهای فرم دست‌نخورده می‌مانند. +- علامت زدن متن یا ناحیه برای پوشاندن تا زمانی که پوشاندن اعمال نشود چیزی را حذف نمی‌کند. وقتی متن انتخاب‌شده را می‌پوشانید، نسخه‌های آن در ویژگی‌های فایل، نشانک‌ها، نظرها و پیوست‌ها نیز از فایل دانلودی حذف می‌شوند، مگر اینکه فایل رمزگذاری شده باشد. +- برای واترمارک یا شماره‌گذاری صفحات به‌صورت انبوه، از ابزارهای اختصاصی استفاده کنید تا کنترل بیشتری بر قالب‌بندی داشته باشید. + +## ابزارهای مرتبط + +- [افزودن واترمارک](./add-watermark) +- [امضای PDF](./sign-pdf) +- [افزودن مهر](./add-stamps) +- [حذف حاشیه‌نویسی‌ها](./remove-annotations) diff --git a/docs/fa/tools/email-to-pdf.md b/docs/fa/tools/email-to-pdf.md new file mode 100644 index 00000000..768ad621 --- /dev/null +++ b/docs/fa/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: ایمیل به PDF +description: تبدیل فایل‌های ایمیل EML و MSG به PDF در مرورگر. حفظ سرایندها، متن و فهرست پیوست‌ها. +--- + +# ایمیل به PDF + +فایل‌های ایمیل ذخیره‌شده را به PDFهای تمیز و قابل چاپ تبدیل کنید. ابزار فایل‌های EML و MSG را تجزیه می‌کند، پیام کامل (سرایندها، محتوای متن و فرادادهٔ پیوست‌ها) را استخراج می‌کند و همه را در یک PDF ساختاریافته رندر می‌کند. برای کشف اسناد حقوقی، نگهداری سوابق یا صرفاً چاپ یک ایمیل مهم مفید است. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :--- | :----- | :------------------------------------------------------------ | +| EML | `.eml` | قالب استاندارد ایمیل MIME (صادرشده از بیشتر برنامه‌های ایمیل) | +| MSG | `.msg` | قالب اختصاصی Microsoft Outlook | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های EML یا MSG خود را بکشید و رها کنید. می‌توانید هر دو قالب را در یک دسته ترکیب کنید. +2. فهرست فایل‌ها را بررسی کنید. موارد ناخواسته را با نماد سطل زباله حذف کنید، یا برای افزودن ایمیل‌های بیشتر روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. گزینه‌های تبدیل را پیکربندی کنید (پایین را ببینید). +4. روی **تبدیل به PDF** کلیک کنید. ابزار هر ایمیل را تجزیه می‌کند، محتوا را به‌صورت HTML سبک‌دار رندر می‌کند و آن را از طریق موتور PyMuPDF به PDF تبدیل می‌کند. +5. یک ایمیل مستقیماً به‌صورت PDF دانلود می‌شود. چند ایمیل در `emails-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +| گزینه | پیش‌فرض | توضیحات | +| :---------------------- | :------ | :-------------------------------------------------------------------------------------------- | +| **اندازهٔ صفحه** | A4 | انتخاب بین ابعاد صفحهٔ A4، Letter یا Legal. | +| **شامل CC و BCC** | روشن | در صورت فعال بودن، فهرست گیرندگان CC و BCC در بخش سرایند ایمیل در PDF نمایش داده می‌شود. | +| **شامل فهرست پیوست‌ها** | روشن | در صورت فعال بودن، فهرستی از پیوست‌های فایل ایمیل (با نام و اندازه) در PDF نمایش داده می‌شود. | + +## کاربردها + +- بایگانی مکاتبات تجاری مهم به‌صورت PDF برای انطباق یا ممیزی +- چاپ رشته‌های ایمیل برای دادرسی یا درخواست‌های کشف اسناد +- ایجاد سابقهٔ دائمی از تأییدیه‌های سفارش، رسیدها یا قراردادهای دریافتی از طریق ایمیل +- پشتیبان‌گیری از فایل‌های MSG در Outlook در قالبی که برای خواندن به Outlook نیاز ندارد +- مستندسازی تعاملات پشتیبانی مشتری از فایل‌های EML صادرشده + +## نکته‌ها + +- هم فایل‌های EML (مورد استفادهٔ Thunderbird، Apple Mail و بیشتر برنامه‌های ایمیل) و هم فایل‌های MSG در Outlook پشتیبانی می‌شوند. ایمیل‌ها را از برنامهٔ ایمیل خود صادر کنید و مستقیماً در ابزار رها کنید. +- ایمیل‌های با قالب HTML سبک خود را در PDF حفظ می‌کنند. ایمیل‌های متن ساده با قالب‌بندی تمیز و خوانا رندر می‌شوند. +- فهرست پیوست‌ها نام و اندازهٔ فایل‌ها را نشان می‌دهد اما خود فایل‌های پیوست را در PDF جاسازی نمی‌کند. + +## ابزارهای مرتبط + +- [XML به PDF](./xml-to-pdf) +- [XPS به PDF](./xps-to-pdf) diff --git a/docs/fa/tools/epub-to-pdf.md b/docs/fa/tools/epub-to-pdf.md new file mode 100644 index 00000000..6156e13b --- /dev/null +++ b/docs/fa/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB به PDF +description: تبدیل کتاب‌های الکترونیکی EPUB به PDF در مرورگر. رایگان، بدون نیاز به بارگذاری و با اولویت حریم خصوصی. +--- + +# EPUB به PDF + +کتاب‌های الکترونیکی EPUB را بدون خروج از مرورگر به فایل PDF تبدیل کنید. EPUB استاندارد باز کتاب‌های دیجیتال است، اما گاهی برای چاپ، حاشیه‌نویسی یا اشتراک‌گذاری با کسانی که کتاب‌خوان الکترونیکی ندارند به یک PDF با چیدمان ثابت نیاز دارید. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :--- | :------ | :----------------------- | +| EPUB | `.epub` | فایل‌های EPUB 2 و EPUB 3 | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های EPUB خود را بکشید و رها کنید. انتخاب چندتایی پشتیبانی می‌شود. +2. فایل‌های بارگذاری‌شده را بررسی کنید. موارد ناخواسته را با نماد سطل زباله حذف کنید، یا برای گسترش دسته روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور PyMuPDF محتوای EPUB (متن، تصاویر و قالب‌بندی) را به خروجی PDF صفحه‌بندی‌شده رندر می‌کند. +4. یک EPUB مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در یک آرشیو ZIP با نام `epub-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +تبدیل با پیش‌فرض‌های معقول و بدون پیکربندی الزامی انجام می‌شود. متن در ابعاد استاندارد صفحه جریان می‌یابد و قلم‌ها و تصاویر جاسازی‌شده به PDF منتقل می‌شوند. + +## کاربردها + +- چاپ کتاب الکترونیکی بدون DRM برای خواندن دور از صفحه‌نمایش +- ارسال دست‌نوشتهٔ EPUB به‌صورت PDF با چیدمان ثابت برای بازبینی +- بایگانی کتاب‌های دیجیتال در قالبی که هر سیستم‌عامل به‌طور پیش‌فرض باز می‌کند +- اشتراک‌گذاری یک فصل با همکاری که EPUB‌خوان ندارد +- تبدیل مستندات فنی توزیع‌شده به‌صورت EPUB به PDFهای قابل حاشیه‌نویسی + +## نکته‌ها + +- ویژگی‌های EPUB 3 مانند صدا و ویدیوی جاسازی‌شده به PDF منتقل نمی‌شوند، اما همهٔ متن، تصاویر و جدول‌ها به‌خوبی تبدیل می‌شوند. +- برای بهترین نتیجه با EPUBهای پرسبک، چند صفحهٔ اول خروجی را بررسی کنید تا از وفاداری چیدمان مطمئن شوید. + +## ابزارهای مرتبط + +- [MOBI به PDF](./mobi-to-pdf) +- [FB2 به PDF](./fb2-to-pdf) +- [CBZ به PDF](./cbz-to-pdf) diff --git a/docs/fa/tools/excel-to-pdf.md b/docs/fa/tools/excel-to-pdf.md new file mode 100644 index 00000000..4e62e996 --- /dev/null +++ b/docs/fa/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel به PDF +description: تبدیل صفحه‌گسترده‌های Excel (XLS، XLSX)، ODS و فایل‌های CSV به PDF با حفظ قالب‌بندی. +--- + +# Excel به PDF + +فایل‌های صفحه‌گسترده را به PDF تبدیل کنید. این ابزار فایل‌های Excel جدید، قالب قدیمی XLS، صفحه‌گسترده‌های OpenDocument و حتی CSV را پشتیبانی می‌کند؛ همه از طریق موتور LibreOffice مبتنی بر مرورگر رندر می‌شوند که قالب‌بندی سلول‌ها، فرمول‌ها (به‌صورت مقادیر محاسبه‌شده)، نمودارها و چیدمان‌های چندبرگه‌ای را حفظ می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :------------------------ | :------ | +| Excel (جدید) | `.xlsx` | +| Excel (قدیمی) | `.xls` | +| صفحه‌گستردهٔ OpenDocument | `.ods` | +| CSV | `.csv` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های صفحه‌گستردهٔ خود را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های بیشتری اضافه کنید یا موارد ناخواسته را حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور LibreOffice در اولین استفاده راه‌اندازی می‌شود و سپس هر فایل را پردازش می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل به‌صورت `excel-converted.zip` تحویل داده می‌شوند. + +## گزینه‌ها + +این ابزار پیکربندی اضافه‌ای ندارد. موتور LibreOffice چیدمان صفحه، مقیاس و ناحیهٔ چاپ را بر اساس تنظیمات داخلی صفحه‌گسترده تعیین می‌کند. + +## خروجی + +| تعداد ورودی | خروجی | +| :---------- | :--------------------------------------------------------- | +| 1 فایل | دانلود یک PDF (نام فایل اصلی با پسوند `.pdf`) | +| 2+ فایل | آرشیو ZIP (`excel-converted.zip`) شامل یک PDF برای هر فایل | + +## کاربردها + +- تبدیل گزارش‌های مالی یا بودجه از Excel به PDF برای توزیع +- ساخت PDFهای آمادهٔ چاپ از صفحه‌گسترده‌های موجودی یا کاتالوگ محصول +- اشتراک‌گذاری نتایج تحلیل داده با ذی‌نفعانی که Excel نصب ندارند +- بایگانی گزارش‌های فصلی در قالبی غیرقابل ویرایش +- تبدیل فایل‌های ODS از LibreOffice Calc به PDF + +## نکته‌ها + +- نمودارهای جاسازی‌شده در صفحه‌گسترده در PDF رندر می‌شوند. پیش از تبدیل مطمئن شوید در فایل منبع درست به نظر می‌رسند. +- اگر صفحه‌گستردهٔ شما چند برگه دارد، همهٔ برگه‌ها در خروجی PDF گنجانده می‌شوند. +- برای داده‌های ساده CSV بدون قالب‌بندی، ابزار [CSV به PDF](./csv-to-pdf) تبدیلی سبک‌تر ارائه می‌دهد. وقتی به حفظ قالب‌بندی، نمودارها یا چند برگه نیاز دارید از Excel به PDF استفاده کنید. + +## ابزارهای مرتبط + +- [CSV به PDF](./csv-to-pdf) +- [Word به PDF](./word-to-pdf) +- [PowerPoint به PDF](./powerpoint-to-pdf) diff --git a/docs/fa/tools/extract-attachments.md b/docs/fa/tools/extract-attachments.md new file mode 100644 index 00000000..36433f2d --- /dev/null +++ b/docs/fa/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: استخراج پیوست‌ها +description: استخراج همهٔ پیوست‌های فایل جاسازی‌شده از یک یا چند PDF و دانلود آن‌ها به‌صورت آرشیو ZIP. +--- + +# استخراج پیوست‌ها + +همهٔ پیوست‌های جاسازی‌شده را از یک یا چند فایل PDF بیرون بکشید. همهٔ فایل‌های استخراج‌شده برای دانلود در یک آرشیو ZIP واحد بسته‌بندی می‌شوند. + +## نحوهٔ کار + +1. یک یا چند فایل PDF حاوی پیوست جاسازی‌شده بارگذاری کنید. +2. روی **استخراج پیوست‌ها** کلیک کنید. +3. ابزار هر PDF را برای یافتن پیوست‌های سطح سند و سطح صفحه جستجو می‌کند. +4. همهٔ فایل‌های یافت‌شده در یک آرشیو ZIP بسته‌بندی و به‌طور خودکار دانلود می‌شوند. +5. یک پیام وضعیت تعداد پیوست‌های یافت‌شده و حجم کل آن‌ها را تأیید می‌کند. + +## ویژگی‌ها + +- استخراج دسته‌ای از چند PDF به‌طور هم‌زمان +- استخراج پیوست‌های سطح سند و سطح صفحه +- خروجی یک فایل ZIP واحد شامل همهٔ فایل‌های استخراج‌شده +- نمایش تعداد کل پیوست‌ها و حجم مجموع فایل‌ها +- پیام‌های وضعیت واضح در صورت یافت نشدن پیوست + +## کاربردها + +- بازیابی فایل‌های داده جاسازی‌شده در یک گزارش PDF +- بیرون کشیدن فایل‌های تصویری از یک سند نمونه‌کار یا مشخصات +- استخراج مطالب تکمیلی از PDFهای آموزشی یا انطباق +- ممیزی فایل‌های جاسازی‌شده در دسته‌ای از PDFها + +## نکته‌ها + +- اگر ابزار پیوستی گزارش نکند، ممکن است PDF به‌جای آن تصاویر جاسازی‌شده یا دادهٔ فرم داشته باشد؛ این‌ها پیوست فایل نیستند. برای تصاویر جاسازی‌شده از [استخراج تصاویر](./extract-images) استفاده کنید. +- هنگام پردازش چند PDF، همهٔ پیوست‌های همهٔ فایل‌ها در یک ZIP قرار می‌گیرند. نام فایل‌ها از جاسازی‌های اصلی حفظ می‌شوند. + +## ابزارهای مرتبط + +- [افزودن پیوست](./add-attachments) +- [ویرایش پیوست‌ها](./edit-attachments) +- [استخراج تصاویر](./extract-images) diff --git a/docs/fa/tools/extract-images.md b/docs/fa/tools/extract-images.md new file mode 100644 index 00000000..7c4fe4a9 --- /dev/null +++ b/docs/fa/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: استخراج تصاویر +description: استخراج همهٔ تصاویر جاسازی‌شده از فایل‌های PDF. پیش‌نمایش در شبکه و دانلود تکی یا به‌صورت آرشیو ZIP. +--- + +# استخراج تصاویر + +همهٔ تصاویر جاسازی‌شده را از یک یا چند فایل PDF بیرون می‌کشد. تصاویر استخراج‌شده در یک شبکهٔ پیش‌نمایش نمایش داده می‌شوند که می‌توانید آن‌ها را تک‌تک دانلود کنید، یا همه را یکجا به‌صورت ZIP بگیرید. با قدرت PyMuPDF. + +## نحوهٔ کار + +1. یک یا چند PDF را با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها روی آن بارگذاری کنید. در صورت نیاز فایل‌های بیشتری اضافه یا فایل‌هایی را حذف کنید. +2. برای شروع پردازش روی **استخراج** کلیک کنید. +3. ابزار همهٔ صفحات همهٔ PDFهای بارگذاری‌شده را بررسی می‌کند و تصاویر جاسازی‌شده را یافته و استخراج می‌کند. +4. تصاویر استخراج‌شده در یک شبکه با تصاویر بندانگشتی نمایش داده می‌شوند. هر تصویر یک دکمهٔ دانلود دارد. +5. روی **دانلود همه** کلیک کنید تا همه به‌صورت آرشیو ZIP ذخیره شوند. + +## گزینه‌ها + +این ابزار گزینهٔ قابل تنظیمی ندارد. همهٔ تصاویر جاسازی‌شده در قالب اصلی خود استخراج می‌شوند (معمولاً PNG، JPEG یا هر قالبی که هنگام جاسازی تصویر در PDF استفاده شده است). + +## قالب خروجی + +- تصاویر در یک شبکهٔ پیش‌نمایش با نام‌های `image_1.png`، `image_2.jpg` و غیره نمایش داده می‌شوند. +- **دانلود همه** فایل `extracted-images.zip` شامل همهٔ تصاویر را تولید می‌کند. +- تصاویر را می‌توان تک‌تک از شبکه دانلود کرد. + +## کاربردها + +- بازیابی عکس‌ها یا گرافیک‌ها از PDF برای استفادهٔ دوباره در پروژه‌ای دیگر. +- استخراج تصاویر محصول از کاتالوگ PDF برای فهرست فروشگاه اینترنتی. +- بیرون کشیدن نمودارها از مستندات فنی برای استفاده در ارائه‌ها. +- ممیزی تصاویر جاسازی‌شده در یک سند پیش از اشتراک‌گذاری آن. + +## نکته‌ها + +- ابزار تصاویر را دقیقاً همان‌طور که در PDF ذخیره شده‌اند استخراج می‌کند. صفحات را دوباره به‌صورت تصویر رندر نمی‌کند؛ برای این کار از [PDF به PNG](./pdf-to-png) یا [PDF به JPG](./pdf-to-jpg) استفاده کنید. +- اگر ابزار «تصویری یافت نشد» گزارش کند، ممکن است PDF به‌جای تصاویر رستری جاسازی‌شده از گرافیک برداری استفاده کند، یا سندی اسکن‌شده باشد که کل صفحه‌اش یک تصویر بزرگ است. +- پردازش دسته‌ای روی چند PDF کار می‌کند. همهٔ تصاویر همهٔ فایل‌ها در یک شبکه و یک ZIP ترکیب می‌شوند. + +## ابزارهای مرتبط + +- [PDF به PNG](./pdf-to-png) +- [PDF به JPG](./pdf-to-jpg) +- [سازندهٔ گردش کار PDF](./pdf-workflow) diff --git a/docs/fa/tools/extract-pages.md b/docs/fa/tools/extract-pages.md new file mode 100644 index 00000000..df10a705 --- /dev/null +++ b/docs/fa/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: استخراج صفحات +description: ذخیرهٔ بازهٔ مشخصی از صفحات یک PDF به‌صورت سندی جدید. +--- + +# استخراج صفحات + +مجموعه‌ای از صفحات را از یک PDF بیرون بکشید و به‌صورت فایلی جدید ذخیره کنید. با نحو بازه دقیقاً مشخص کنید کدام صفحات را می‌خواهید تا ابزار یک PDF تمیز فقط شامل همان صفحات بسازد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. ابزار نام فایل، حجم و تعداد کل صفحات را نمایش می‌دهد. +2. صفحاتی را که می‌خواهید استخراج کنید با نحو بازه وارد کنید (مثلاً `1-5`، `3, 7, 10-12`). +3. در صورت تمایل انتخاب کنید که هر بازه به‌صورت PDF جداگانه در یک آرشیو ZIP دانلود شود. +4. روی دکمهٔ پردازش کلیک کنید. صفحات استخراج‌شده به‌صورت یک PDF جدید (یا ZIP) دانلود می‌شوند. + +## ویژگی‌ها + +- نحو انعطاف‌پذیر بازهٔ صفحه: صفحات تکی، بازه‌ها یا ترکیب‌های جداشده با کاما +- نمایش تعداد کل صفحات پس از بارگذاری برای مراجعهٔ آسان +- امکان خروجی به‌صورت یک PDF ترکیبی یا فایل‌های جداگانه در یک ZIP +- حفظ محتوا و قالب‌بندی اصلی صفحات + +## کاربردها + +- بیرون کشیدن خلاصهٔ مدیریتی (چند صفحهٔ اول) از یک گزارش طولانی +- استخراج یک فصل از PDF کتاب درسی +- ذخیرهٔ صفحات خاصی از یک بستهٔ فرم به‌صورت اسناد مستقل +- ساخت سند نمونه از صفحات منتخب یک فایل بزرگ‌تر + +## نکته‌ها + +- شمارهٔ صفحات از 1 شروع می‌شود. برای صفحهٔ اول از `1` استفاده کنید، نه `0`. +- برای حذف صفحات به‌جای استخراج آن‌ها، از [حذف صفحات](./delete-pages) استفاده کنید؛ این عملیات عکس آن است. +- اگر به انتخاب بصری صفحات با تصاویر بندانگشتی نیاز دارید، از [تقسیم PDF](./split-pdf) در حالت انتخاب بصری استفاده کنید. + +## ابزارهای مرتبط + +- [تقسیم PDF](./split-pdf) +- [حذف صفحات](./delete-pages) +- [ادغام PDF](./merge-pdf) diff --git a/docs/fa/tools/extract-tables.md b/docs/fa/tools/extract-tables.md new file mode 100644 index 00000000..18b0eb16 --- /dev/null +++ b/docs/fa/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: استخراج جدول‌ها +description: تشخیص و استخراج جدول‌ها از اسناد PDF. خروجی CSV، JSON یا Markdown با کنترل جداگانه برای هر جدول. +--- + +# استخراج جدول‌ها + +همهٔ جدول‌های یک PDF را تشخیص می‌دهد و به شما امکان می‌دهد آن‌ها را در قالب دلخواه خود صادر کنید: CSV، JSON یا Markdown. هر جدول به‌طور جداگانه همراه با فرادادهٔ صفحه و موقعیت استخراج می‌شود. با قدرت موتور تشخیص جدول PyMuPDF. + +## نحوهٔ کار + +1. یک PDF را با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن بارگذاری کنید. +2. **قالب خروجی** دلخواه خود را انتخاب کنید: CSV، JSON یا Markdown. +3. برای شروع پردازش روی **استخراج** کلیک کنید. +4. اگر یک جدول یافت شود، به‌صورت یک فایل دانلود می‌شود. چند جدول یک آرشیو ZIP با یک فایل برای هر جدول تولید می‌کنند. + +## گزینه‌ها + +- **قالب خروجی**: یکی را انتخاب کنید: + - **CSV**: مقادیر جداشده با کاما با نقل‌قول‌گذاری درست برای فیلدهای شامل کاما، نقل‌قول یا خط جدید. مناسب صفحه‌گسترده‌ها و پایگاه‌های داده. + - **JSON**: ساختار آرایه‌ای از آرایه‌ها، با تورفتگی ۲ فاصله‌ای و قالب‌بندی خوانا. مناسب استفادهٔ برنامه‌نویسی. + - **Markdown**: قالب جدول جداشده با خط عمودی که PyMuPDF رندر می‌کند. مناسب مستندات و فایل‌های README. + +## قالب خروجی + +- **یک جدول**: `filename_table.csv` (یا `.json` / `.md`) +- **چند جدول**: `filename_tables.zip` شامل فایل‌هایی با نام‌های `table_1_page3.csv`، `table_2_page5.csv` و غیره + +## کاربردها + +- استخراج جدول‌های خاص از گزارش‌های طولانی PDF بدون بیرون کشیدن دادهٔ کل سند. +- دریافت جدول‌ها در قالب Markdown برای چسباندن مستقیم در issueهای GitHub، ویکی‌ها یا مستندات. +- بیرون کشیدن دادهٔ ساختاریافتهٔ JSON از جدول‌های PDF برای یکپارچه‌سازی API یا اسکریپت‌ها. +- مقایسهٔ جدول‌ها در نسخه‌های مختلف PDF با صادر کردن هر دو به CSV و مقایسهٔ تفاوت‌ها. + +## نکته‌ها + +- این ابزار کنترل جداگانه بر هر جدول به شما می‌دهد. اگر فقط می‌خواهید همهٔ جدول‌ها در یک CSV ریخته شوند، از [PDF به CSV](./pdf-to-csv) استفاده کنید. برای یک کتاب کار کامل Excel، از [PDF به Excel](./pdf-to-excel) استفاده کنید. +- جدول‌هایی که در چند صفحه گسترده‌اند ممکن است به‌صورت جدول‌های جداگانه در هر صفحه تشخیص داده شوند. ممکن است لازم باشد آن‌ها را دستی به هم بچسبانید. +- اگر جدولی تشخیص داده نشود، ممکن است PDF یک تصویر اسکن‌شده باشد. ابتدا آن را از OCR عبور دهید تا لایهٔ متنی اضافه شود. + +## ابزارهای مرتبط + +- [PDF به CSV](./pdf-to-csv) +- [PDF به Excel](./pdf-to-excel) +- [PDF به متن](./pdf-to-text) diff --git a/docs/fa/tools/fb2-to-pdf.md b/docs/fa/tools/fb2-to-pdf.md new file mode 100644 index 00000000..ea6522c0 --- /dev/null +++ b/docs/fa/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 به PDF +description: فایل‌های کتاب الکترونیکی FictionBook (FB2) را در مرورگر خود به PDF تبدیل کنید. رایگان، خصوصی و بدون بارگذاری روی سرور. +--- + +# FB2 به PDF + +فایل‌های FictionBook 2 (FB2) را به اسناد PDF تبدیل کنید. FB2 یک قالب کتاب الکترونیکی مبتنی بر XML است که در روسیه و اروپای شرقی رایج است. با اینکه در برخی پلتفرم‌ها به‌خوبی پشتیبانی می‌شود، در بسیاری دیگر تقریباً ناشناخته است؛ تبدیل به PDF کتاب‌های شما را همه‌جا خواندنی می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :------------ | :----- | :-------------------------------- | +| FictionBook 2 | `.fb2` | قالب کتاب الکترونیکی مبتنی بر XML | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های FB2 خود را بکشید و رها کنید. انتخاب گروهی برای چند فایل کار می‌کند. +2. فهرست فایل‌ها را بررسی کنید. با نماد سطل زباله موارد را تک‌تک حذف کنید یا با **افزودن فایل‌های بیشتر** فایل‌های دیگری اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور PyMuPDF ساختار XML فایل FB2 را تجزیه کرده و آن را به‌صورت محتوای PDF صفحه‌بندی‌شده رندر می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند تبدیل در `fb2-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +نیازی به پیکربندی نیست. مبدل ساختار XML فایل FB2 را به‌طور خودکار مدیریت می‌کند و شکست فصل‌ها، قالب‌بندی و تصاویر جاسازی‌شده را حفظ می‌کند. + +## موارد استفاده + +- خواندن کتاب‌های الکترونیکی FB2 روی دستگاه‌ها یا برنامه‌هایی که فقط از PDF پشتیبانی می‌کنند +- چاپ آثار ادبی روسی‌زبانی که در قالب FB2 توزیع شده‌اند +- بایگانی یک کتابخانهٔ FB2 در قالبی که همه‌جا پشتیبانی می‌شود +- به اشتراک گذاشتن کتاب با کسی که کتاب‌خوانش از FictionBook پشتیبانی نمی‌کند + +## نکات + +- فایل‌های FB2 متن سادهٔ XML هستند، بنابراین معمولاً کوچک‌اند و حتی در مرورگر هم سریع تبدیل می‌شوند. +- اگر فایل‌های FB2 شما به‌صورت `.fb2.zip` فشرده شده‌اند، پیش از بارگذاری آن‌ها را از حالت فشرده خارج کنید. + +## ابزارهای مرتبط + +- [EPUB به PDF](./epub-to-pdf) +- [MOBI به PDF](./mobi-to-pdf) +- [XML به PDF](./xml-to-pdf) diff --git a/docs/fa/tools/fix-page-size.md b/docs/fa/tools/fix-page-size.md new file mode 100644 index 00000000..85279bb6 --- /dev/null +++ b/docs/fa/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: اصلاح اندازهٔ صفحه +description: همهٔ صفحات یک PDF را به اندازه‌ای یکسان استاندارد کنید. از میان اندازه‌های استاندارد کاغذ انتخاب کنید یا ابعاد دلخواه تعیین کنید. +--- + +# اصلاح اندازهٔ صفحه + +PDFهایی که از چند منبع جمع‌آوری شده‌اند اغلب اندازهٔ صفحات ناهمخوانی دارند: برخی Letter، برخی A4 و برخی کاملاً غیراستاندارد. این ابزار همهٔ صفحات را به یک اندازهٔ هدف درمی‌آورد و در صورت نیاز محتوا را برای جا شدن یا پر کردن صفحه مقیاس می‌دهد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. از منوی کشویی یک **اندازهٔ صفحهٔ هدف** انتخاب کنید (A4، Letter، Legal، A3، A5، Tabloid یا سفارشی). +3. یک **جهت** انتخاب کنید: «خودکار» جهت اصلی هر صفحه را حفظ می‌کند، یا می‌توانید عمودی یا افقی را اجبار کنید. +4. یک حالت **مقیاس‌دهی محتوا** انتخاب کنید: Fit (همهٔ محتوا را حفظ می‌کند، ممکن است حاشیه اضافه کند) یا Fill (صفحه را پر می‌کند، ممکن است لبه‌ها را برش دهد). +5. در صورت تمایل یک **رنگ پس‌زمینه** برای حاشیه‌های اضافه‌شده تعیین کنید. +6. روی **اصلاح اندازهٔ صفحه** کلیک کنید. + +## گزینه‌ها + +- **اندازه‌های استاندارد**: A4، Letter، Legal، A3، A5، Tabloid +- **ابعاد سفارشی**: عرض و ارتفاع را بر حسب اینچ یا میلی‌متر وارد کنید +- **جهت**: خودکار، عمودی، افقی +- **حالت مقیاس‌دهی**: Fit یا Fill (برش) +- **رنگ پس‌زمینه**: هر رنگی برای پر کردن حاشیه‌ها + +## موارد استفاده + +- یکدست کردن یک PDF ادغام‌شده که صفحاتش از اسکنرهای مختلف آمده‌اند +- تبدیل یک سند US Letter به A4 برای توزیع بین‌المللی +- آماده‌سازی PDFهای آمادهٔ چاپ که به اندازهٔ برش یکسان نیاز دارند +- اصلاح صفحاتی که کمی با استاندارد فاصله دارند (مثلاً 8.49 x 11.02 اینچ به‌جای 8.5 x 11) + +## نکات + +- برای اطمینان از اینکه هیچ محتوایی از دست نمی‌رود از حالت Fit استفاده کنید. حالت Fill تمیزتر به نظر می‌رسد اما ممکن است لبه‌ها را ببرد. +- خروجی را با ابزار ابعاد صفحه بررسی کنید تا مطمئن شوید همهٔ صفحات با اندازهٔ هدف مطابقت دارند. +- رنگ پس‌زمینهٔ پیش‌فرض سفید است؛ اگر سند شما حاشیه‌های تیره دارد، به یک رنگ تیره تغییر دهید. + +## ابزارهای مرتبط + +- [ابعاد صفحه](./page-dimensions): بررسی اندازهٔ صفحات پیش و پس از اصلاح +- [فشرده‌سازی PDF](./compress-pdf): کاهش حجم فایل پس از استانداردسازی +- [برش PDF](./crop-pdf): برش دستی صفحات به‌جای مقیاس‌دهی خودکار diff --git a/docs/fa/tools/flatten-pdf.md b/docs/fa/tools/flatten-pdf.md new file mode 100644 index 00000000..c7d33b2f --- /dev/null +++ b/docs/fa/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: مسطح‌سازی PDF +description: فرم‌های تعاملی و حاشیه‌نویسی‌ها را به محتوای ثابت تبدیل کنید. فیلدهای فرم غیرقابل‌ویرایش می‌شوند و حاشیه‌نویسی‌ها در صفحه ثبت می‌شوند. +--- + +# مسطح‌سازی PDF + +مسطح‌سازی عناصر تعاملی (فیلدهای فرم، منوهای کشویی، کادرهای انتخاب، حاشیه‌نویسی‌ها، هایلایت‌ها، یادداشت‌های چسبان) را مستقیماً با محتوای صفحه ادغام می‌کند. ظاهر بصری همان می‌ماند، اما دیگر هیچ چیز قابل ویرایش یا استخراج نیست. این معادل PDF چاپ یک فرم پرشده و اسکن دوبارهٔ آن است، با این تفاوت که کیفیت کاملاً حفظ می‌شود. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. +2. روی **مسطح‌سازی PDF** کلیک کنید. +3. یک فایل مستقیماً دانلود می‌شود. چند فایل یک بایگانی ZIP تولید می‌کنند. + +این ابزار از pdf-lib برای مسطح‌سازی فیلدهای فرم (از طریق `form.flatten()`) و از یک مسطح‌ساز اختصاصی حاشیه‌نویسی برای ثبت حاشیه‌نویسی‌ها در جریان صفحه استفاده می‌کند. هر دو عملیات در یک مرحله انجام می‌شوند. + +## چه چیزهایی مسطح می‌شوند + +- **فیلدهای فرم**: ورودی‌های متنی، کادرهای انتخاب، دکمه‌های رادیویی، منوهای کشویی، فیلدهای امضا +- **حاشیه‌نویسی‌ها**: نظرات، هایلایت‌ها، خط‌خوردگی، زیرخط، یادداشت‌های چسبان، مهرها، حاشیه‌نویسی‌های جوهری +- **عناصر تعاملی**: دکمه‌ها، محرک‌های عملیات + +## چه چیزهایی تغییر نمی‌کنند + +- محتوای متنی (قابل انتخاب و جستجو باقی می‌ماند) +- تصاویر و گرافیک‌ها +- چیدمان و ابعاد صفحه +- نشانک‌ها و فهرست مطالب +- پیوندها (مگر اینکه مبتنی بر حاشیه‌نویسی باشند) + +## موارد استفاده + +- قفل کردن یک فرم تکمیل‌شده تا گیرندگان نتوانند پاسخ‌های ارسالی را تغییر دهند +- آماده‌سازی PDF برای بایگانی، جایی که عناصر تعاملی لازم نیستند +- رفع مشکلات نمایشی ناشی از رندر متفاوت حاشیه‌نویسی‌ها در نمایشگرهای مختلف +- اطمینان از اینکه سند امضاشده پس از اعمال امضا قابل تغییر نیست +- کاهش حجم فایل با حذف تعاریف فیلدهای فرم و اشیای حاشیه‌نویسی + +## نکات + +- پس از اتمام همهٔ ویرایش‌ها مسطح‌سازی کنید. هیچ راهی برای برگرداندن مسطح‌سازی وجود ندارد. +- اگر علاوه بر مسطح‌سازی می‌خواهید فراداده، JavaScript و پیوست‌ها را هم حذف کنید، به‌جای آن از ابزار پاک‌سازی PDF استفاده کنید؛ مسطح‌سازی یکی از گزینه‌های آن است. +- برخی PDFها پیام «فرمی یافت نشد» نشان می‌دهند؛ اگر سند فقط حاشیه‌نویسی داشته باشد و فیلد فرم نداشته باشد، این طبیعی است. + +## ابزارهای مرتبط + +- [پاک‌سازی PDF](./sanitize-pdf): مسطح‌سازی فرم‌ها به‌علاوهٔ حذف فراداده، اسکریپت‌ها و موارد دیگر +- [رستر کردن PDF](./rasterize-pdf): تبدیل به PDF مبتنی بر تصویر برای حداکثر مسطح‌سازی +- [تبدیل قلم به خطوط برداری](./font-to-outline): تبدیل قلم‌ها به مسیرهای برداری +- [رمزگذاری PDF](./protect-pdf): قفل کردن PDF مسطح‌شده با گذرواژه diff --git a/docs/fa/tools/font-to-outline.md b/docs/fa/tools/font-to-outline.md new file mode 100644 index 00000000..f17adc58 --- /dev/null +++ b/docs/fa/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: تبدیل قلم به خطوط برداری +description: همهٔ قلم‌های PDF را برای نمایش یکسان در همهٔ دستگاه‌ها به خطوط برداری تبدیل کنید. مشکلات وابستگی به قلم را از بین می‌برد. +--- + +# تبدیل قلم به خطوط برداری + +تبدیل قلم‌ها به خطوط برداری، هر نویسهٔ متنی را از یک گلیف مبتنی بر قلم به یک مسیر برداری تبدیل می‌کند. PDF دیگر به هیچ قلم نصب‌شده‌ای وابسته نیست و روی هر دستگاه، هر سیستم‌عامل و هر چاپگری یکسان نمایش داده می‌شود. این یک مرحلهٔ استاندارد در گردش کارهای پیش از چاپ است. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. +2. روی **تبدیل به خطوط برداری** کلیک کنید. +3. Ghostscript همهٔ متن را به مسیرهای برداری تبدیل می‌کند. +4. نتیجه را دانلود کنید. چند فایل یک بایگانی ZIP تولید می‌کنند. + +هیچ تنظیماتی برای پیکربندی وجود ندارد. این ابزار از Ghostscript (WebAssembly) برای تبدیل همهٔ ارجاعات قلم به مسیرهای برداری در یک مرحله استفاده می‌کند. + +## چه چیزهایی تغییر می‌کنند + +- نویسه‌های متنی به منحنی‌های برداری (مسیرهای بزیه) تبدیل می‌شوند +- جاسازی قلم دیگر لازم نیست؛ PDF در سطح گلیف خودکفاست +- ممکن است حجم فایل افزایش یابد، چون مسیرهای برداری معمولاً از ارجاعات قلم بزرگ‌ترند +- ظاهر بصری دقیقاً حفظ می‌شود + +## چه چیزهایی از دست می‌روند + +- انتخاب متن و کپی و جای‌گذاری +- قابلیت جستجوی متن (Ctrl+F دیگر کار نمی‌کند) +- امکان ویرایش محتوای متنی +- دسترس‌پذیری برای صفحه‌خوان‌ها + +## موارد استفاده + +- ارسال PDF به چاپخانه‌ای که قلم‌های تبدیل‌شده به خطوط برداری می‌خواهد +- اشتراک اسنادی که از قلم‌های سفارشی یا دارای مجوز استفاده می‌کنند با افرادی که آن قلم‌ها را ندارند +- جلوگیری از جایگزینی قلم که ظاهر سند شما را در سیستم‌های دیگر تغییر می‌دهد +- آماده‌سازی PDF برای حکاکی لیزری یا برش CNC که ورودی برداری نیاز دارند +- اطمینان از نمایش درست یک PDF پر از لوگو در همهٔ پلتفرم‌ها + +## نکات + +- PDF اصلی خود را نگه دارید. تبدیل به خطوط برداری برگشت‌ناپذیر است و نمی‌توانید مسیرها را دوباره به متن قابل ویرایش تبدیل کنید. +- اگر لازم است متن قابل جستجو بماند، به‌جای آن ابزار رستر کردن PDF را همراه با OCR در نظر بگیرید. +- PDFهای تبدیل‌شده معمولاً بزرگ‌ترند. اگر حجم فایل مهم است، پس از آن فشرده‌سازی PDF را اجرا کنید. + +## ابزارهای مرتبط + +- [مسطح‌سازی PDF](./flatten-pdf): مسطح‌سازی فرم‌ها و حاشیه‌نویسی‌ها بدون دست زدن به قلم‌ها +- [رستر کردن PDF](./rasterize-pdf): تبدیل به PDF مبتنی بر تصویر به‌جای خطوط برداری +- [فشرده‌سازی PDF](./compress-pdf): کاهش حجم فایل پس از تبدیل +- [PDF به PDF/A](./pdf-to-pdfa): تبدیل برای بایگانی پس از اطمینان از استقلال از قلم diff --git a/docs/fa/tools/form-creator.md b/docs/fa/tools/form-creator.md new file mode 100644 index 00000000..adcfc7d4 --- /dev/null +++ b/docs/fa/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: ساخت فرم PDF +description: فرم‌های PDF قابل پر کردن با فیلدهای متنی، کادرهای انتخاب، منوهای کشویی، دکمه‌های رادیویی و موارد دیگر را با کشیدن و رها کردن بسازید. +--- + +# ساخت فرم PDF + +فرم‌های PDF حرفه‌ای قابل پر کردن را از ابتدا یا با افزودن فیلد به یک PDF موجود طراحی کنید. ویرایشگر بصری به شما امکان می‌دهد عناصر فرم (فیلدهای متنی، کادرهای انتخاب، منوهای کشویی، دکمه‌های رادیویی، فیلدهای امضا و موارد دیگر) را مستقیماً روی پیش‌نمایش صفحات بکشید و رها کنید. ویژگی‌های فیلدها را پیکربندی کنید، قواعد نمایش شرطی تعیین کنید و یک فرم PDF کاملاً تعاملی خروجی بگیرید. + +## نحوهٔ کار + +1. یک PDF موجود بارگذاری کنید **یا** برای شروع از ابتدا روی **ساخت PDF خالی** کلیک کنید. +2. اگر PDF خالی می‌سازید، اندازهٔ صفحه را انتخاب کنید (Letter، A4، A5، Legal، Tabloid، A3 یا ابعاد سفارشی). +3. ویرایشگر فرم با نوار ابزاری از انواع فیلد و یک ناحیهٔ پیش‌نمایش صفحه باز می‌شود. +4. یک نوع فیلد از نوار ابزار انتخاب کنید، سپس برای قرار دادن آن روی صفحه کلیک کنید. +5. فیلدها را برای جابه‌جایی بکشید. برای تنظیم ابعاد از دستگیره‌های تغییر اندازه استفاده کنید. +6. روی یک فیلد کلیک کنید تا پنل ویژگی‌ها باز شود؛ در آنجا می‌توانید نام فیلد، مقدار پیش‌فرض، اندازهٔ قلم، تراز و موارد دیگر را تنظیم کنید. +7. با کنترل‌های صفحه بین صفحات جابه‌جا شوید. +8. برای دانلود PDF قابل پر کردن نهایی روی **ذخیره** کلیک کنید. + +## ویژگی‌ها + +- قرار دادن فیلد با کشیدن و رها کردن و دستگیره‌های بصری برای تغییر اندازه +- انواع فیلد: ورودی متن، متن چندخطی، کادر انتخاب، منوی کشویی، دکمهٔ رادیویی، امضا، تاریخ، عدد و بارکد +- پنل ویژگی‌ها برای پیکربندی نام، برچسب، مقدار پیش‌فرض، اندازهٔ قلم، رنگ، تراز و اعتبارسنجی هر فیلد +- عملیات فیلد و قواعد نمایش شرطی (نمایش یا پنهان کردن فیلدها بر اساس مقادیر فیلدهای دیگر) +- پیمایش صفحات برای فرم‌های چندصفحه‌ای +- استخراج فیلدهای موجود: فیلدهای فرم را از PDFهای بارگذاری‌شده به‌طور خودکار شناسایی و وارد می‌کند +- پشتیبانی از PDFهای بارگذاری‌شده و صفحات خالی به‌عنوان بوم فرم +- چند پیش‌تنظیم اندازهٔ صفحه به‌علاوهٔ ابعاد سفارشی +- تولید بارکد با bwip-js +- مدیریت گروه دکمه‌های رادیویی + +## گزینه‌ها + +**پیش‌تنظیم‌های اندازهٔ صفحه (برای PDFهای خالی):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- سفارشی (تعیین عرض و ارتفاع) + +**ویژگی‌های فیلد (بسته به نوع فیلد):** + +- نام، برچسب و متن جایگزین +- مقدار پیش‌فرض +- خانوادهٔ قلم، اندازه و رنگ +- تراز متن (چپ، وسط، راست) +- گزینهٔ فیلد الزامی +- گزینهٔ فقط‌خواندنی +- حداکثر طول برای فیلدهای متنی +- فهرست گزینه‌ها برای منوهای کشویی و دکمه‌های رادیویی +- عملیات نمایش شرطی + +## موارد استفاده + +- ساخت فرم‌های ورود کارکنان با فیلدهای متنی برای اطلاعات شخصی و کادرهای انتخاب برای تأیید خط‌مشی‌ها +- ایجاد پرسشنامه‌های پذیرش مشتری با منوهای کشویی برای انتخاب خدمات +- طراحی فرم‌های سفارش با فیلدهای محاسبه‌شده و شناسه‌های بارکد +- ساخت چک‌لیست‌های بازرسی با دکمه‌های رادیویی برای ارزیابی قبول یا رد +- ایجاد فرم‌های نظرسنجی با پرسش‌های پیگیری شرطی که بر اساس پاسخ‌ها ظاهر می‌شوند + +## نکات + +- اگر یک PDF موجود بارگذاری کنید، ابزار تلاش می‌کند فیلدهای فرم موجود را استخراج کند تا بتوانید آن‌ها را ویرایش یا تکمیل کنید. +- برای ایجاد انتخاب‌های انحصاری از قابلیت گروه دکمه‌های رادیویی استفاده کنید. فیلدهای یک گروه رادیویی نام گروه مشترکی دارند. +- فرم خود را با دانلود و باز کردن آن در [پرکنندهٔ فرم PDF](./form-filler) آزمایش کنید تا رفتار فیلدها را بررسی کنید. + +## ابزارهای مرتبط + +- [پرکنندهٔ فرم PDF](./form-filler) +- [امضای PDF](./sign-pdf) +- [ویرایشگر PDF](./edit-pdf) diff --git a/docs/fa/tools/form-filler.md b/docs/fa/tools/form-filler.md new file mode 100644 index 00000000..ffc6377a --- /dev/null +++ b/docs/fa/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: پرکنندهٔ فرم PDF +description: فرم‌های PDF، از جمله فرم‌های XFA، را مستقیماً در مرورگر خود با یک نمایشگر داخلی پر کنید. +--- + +# پرکنندهٔ فرم PDF + +یک PDF دارای فیلدهای فرم را باز کنید و آن را مستقیماً در یک نمایشگر داخلی پر کنید. این ابزار هم از فیلدهای استاندارد AcroForm و هم از فرم‌های قدیمی XFA (XML Forms Architecture) پشتیبانی می‌کند. پس از تکمیل فرم، نسخهٔ پرشده را با یک کلیک دانلود کنید. + +## نحوهٔ کار + +1. یک PDF حاوی فیلدهای فرم بارگذاری کنید. +2. سند در یک نمایشگر PDF یکپارچه باز می‌شود که فیلدهای فرم را به‌صورت ورودی‌های تعاملی نمایش می‌دهد. +3. روی فیلدهای متنی، کادرهای انتخاب، منوهای کشویی و دکمه‌های رادیویی کلیک کنید تا آن‌ها را پر کنید. +4. برای دریافت PDF تکمیل‌شده روی **ذخیره و دانلود فرم پرشده** کلیک کنید. + +## ویژگی‌ها + +- نمایشگر داخلی PDF.js با تعامل کامل با فیلدهای فرم +- پشتیبانی از فیلدهای استاندارد AcroForm (ورودی‌های متنی، کادرهای انتخاب، منوهای کشویی، دکمه‌های رادیویی) +- پشتیبانی از فرم‌های XFA برای فرم‌های قدیمی مبتنی بر XML +- تنظیم خودکار اندازهٔ نمایشگر بر اساس ابعاد صفحه +- نمایش فایل با اطلاعات نام و حجم + +## گزینه‌ها + +هیچ گزینهٔ پیکربندی اضافه‌ای وجود ندارد. فرم را بارگذاری کنید، پر کنید و دانلود کنید. + +## موارد استفاده + +- تکمیل فرم‌های مالیاتی، درخواست‌های بیمه یا مدارک دولتی +- پر کردن فرم‌های درخواست شغل که به‌صورت پیوست PDF دریافت شده‌اند +- تکمیل فرم‌های ثبت تأمین‌کننده یا پرسشنامه‌های فروشندگان +- تأیید چک‌لیست‌های انطباق با فیلدهای کادر انتخاب +- پر کردن فرم‌های پذیرش پزشکی پیش از مراجعه + +## نکات + +- فرم‌های XFA قالبی قدیمی هستند که فقط برخی نمایشگرهای PDF از آن پشتیبانی می‌کنند. اگر یک PDF از نوع XFA را در Chrome یا بیشتر ابزارهای دیگر باز کنید و صفحات خالی ببینید، یعنی آن نمایشگرها از XFA پشتیبانی نمی‌کنند. پرکنندهٔ فرم BentoPDF و Firefox هر دو XFA را به‌درستی مدیریت می‌کنند. +- برای PDFهایی که فیلد فرم ندارند، ابتدا با ابزار [ساخت فرم PDF](./form-creator) فیلد اضافه کنید، سپس آن‌ها را اینجا پر کنید. +- نمایشگر اندازهٔ خود را به‌طور خودکار با ابعاد صفحهٔ PDF تطبیق می‌دهد. + +## ابزارهای مرتبط + +- [ساخت فرم PDF](./form-creator) +- [امضای PDF](./sign-pdf) +- [ویرایشگر PDF](./edit-pdf) diff --git a/docs/fa/tools/header-footer.md b/docs/fa/tools/header-footer.md new file mode 100644 index 00000000..2665e51b --- /dev/null +++ b/docs/fa/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: سرصفحه و پاصفحه +description: متن سرصفحه و پاصفحهٔ قابل تنظیم با متغیرهای پویای شمارهٔ صفحه به صفحات PDF اضافه کنید. +--- + +# سرصفحه و پاصفحه + +در شش موقعیت روی صفحات PDF خود متن اضافه کنید: چپ، وسط و راست سرصفحه و چپ، وسط و راست پاصفحه. این ابزار از متغیرهای پویا برای شمارهٔ صفحه و تعداد کل صفحات پشتیبانی می‌کند، بنابراین می‌توانید قالب‌هایی مانند «صفحهٔ 3 از 10» بسازید که برای هر صفحه به‌طور خودکار به‌روز می‌شوند. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. پنل گزینه‌ها با کنترل‌های قالب‌بندی و شش فیلد ورودی متن ظاهر می‌شود. +3. متن دلخواه خود را در هر یک از موقعیت‌های سرصفحه یا پاصفحه وارد کنید. +4. برای شماره‌گذاری پویای صفحات از جای‌نگهدارهای `{page}` و `{total}` استفاده کنید. +5. اندازهٔ قلم و رنگ قلم را تنظیم کنید و در صورت تمایل به یک بازهٔ صفحات مشخص محدود کنید. +6. برای پردازش و دانلود روی **افزودن سرصفحه و پاصفحه** کلیک کنید. + +## گزینه‌ها + +- **بازهٔ صفحات**: در صورت تمایل، صفحاتی را که سرصفحه و پاصفحه می‌گیرند محدود کنید. برای اعمال روی همهٔ صفحات خالی بگذارید. قالب: «1-3, 5» (بازه‌های جداشده با ویرگول). +- **اندازهٔ قلم**: بین 6 تا 24 پوینت. پیش‌فرض 10. +- **رنگ قلم**: هر رنگی را با انتخابگر رنگ برگزینید. +- **سرصفحهٔ چپ / وسط / راست**: فیلدهای متنی برای بالای هر صفحه. +- **پاصفحهٔ چپ / وسط / راست**: فیلدهای متنی برای پایین هر صفحه. + +## ویژگی‌ها + +- شش موقعیت متنی مستقل در هر صفحه +- متغیر پویای `{page}` که شمارهٔ صفحهٔ فعلی را درج می‌کند +- متغیر پویای `{total}` که تعداد کل صفحات را درج می‌کند +- فیلتر بازهٔ صفحات برای هدف قرار دادن صفحات خاص +- اندازه و رنگ قلم قابل تنظیم +- قلم Helvetica برای خروجی تمیز و حرفه‌ای + +## موارد استفاده + +- افزودن «صفحهٔ {page} از {total}» به وسط پاصفحهٔ یک گزارش +- قرار دادن نام شرکت در سمت چپ سرصفحه و تاریخ سند در سمت راست سرصفحه +- افزودن اطلاعیه‌های محرمانگی به پاصفحهٔ اسناد حقوقی +- درج شمارهٔ ویرایش سند روی بازه‌های صفحات مشخص + +## نکات + +- `{page}` و `{total}` را در یک فیلد ترکیب کنید تا قالب‌هایی مانند «صفحهٔ {page} از {total}» یا «{page}/{total}» بسازید. +- می‌توانید بیشتر فیلدها را خالی بگذارید و فقط موقعیت‌های مورد نیاز را پر کنید. فیلدهای خالی به‌سادگی نادیده گرفته می‌شوند. +- برای سرصفحه‌های پیچیده‌تر با تصویر یا لوگو، استفاده از ابزار [افزودن واترمارک](./add-watermark) را با قرار دادن آن در بالای صفحه در نظر بگیرید. + +## ابزارهای مرتبط + +- [شماره‌گذاری صفحات](./page-numbers) +- [افزودن واترمارک](./add-watermark) +- [شماره‌گذاری Bates](./bates-numbering) diff --git a/docs/fa/tools/heic-to-pdf.md b/docs/fa/tools/heic-to-pdf.md new file mode 100644 index 00000000..9a6a4c37 --- /dev/null +++ b/docs/fa/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC به PDF +description: تصاویر HEIC و HEIF آیفون و آیپد را مستقیماً در مرورگر خود به قالب PDF تبدیل کنید. +--- + +# HEIC به PDF + +تصاویر HEIC/HEIF را به PDF تبدیل کنید. HEIC از iOS 11 قالب پیش‌فرض عکس در آیفون و آیپد است. این ابزار به شما امکان می‌دهد این عکس‌ها را بدون نصب نرم‌افزار دسکتاپ یا بارگذاری فایل روی سرور به PDF تبدیل کنید. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های HEIC/HEIF خود را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید و فایل‌های ناخواسته را حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. نتیجه با نام `from_heic.pdf` دانلود می‌شود. + +هر فایل HEIC با کتابخانهٔ heic2any رمزگشایی می‌شود که آن را با کیفیت 92٪ به PNG تبدیل می‌کند. سپس PNG با pdf-lib در PDF جاسازی می‌شود و هر تصویر با وضوح کامل در صفحهٔ جداگانهٔ خود قرار می‌گیرد. + +## گزینه‌ها + +این ابزار تنظیمات اضافه‌ای ارائه نمی‌دهد. تصاویر HEIC پیش از جاسازی با کیفیت بالا (0.92) به PNG تبدیل می‌شوند. + +## موارد استفاده + +- ساخت PDF از عکس‌های آیفون برای پیوست به ادعای خسارت بیمه یا گزارش +- تبدیل عکس‌های HEIC یک آگهی ملک به یک سند واحد قابل چاپ +- تبدیل اسکرین‌شات‌های آیپد (قالب HEIF) به یک PDF قابل اشتراک +- تبدیل گروهی عکس‌های تعطیلات برای یک سفرنامه + +## نکات + +- رمزگشایی HEIC کاملاً در مرورگر و با WebAssembly انجام می‌شود. نخستین تبدیل ممکن است هنگام بارگیری رمزگشا کمی طول بکشد. +- اگر لازم است HEIC را با قالب‌های تصویری دیگر (JPG، PNG و غیره) ترکیب کنید، از ابزار [تصاویر به PDF](./image-to-pdf) استفاده کنید که HEIC را در کنار همهٔ قالب‌های دیگر مدیریت می‌کند. +- فایل‌های HEIC آیفون اغلب حاوی داده‌های EXIF از جمله مختصات GPS هستند. خروجی PDF این فراداده را منتقل نمی‌کند. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [JPG به PDF](./jpg-to-pdf) +- [PNG به PDF](./png-to-pdf) diff --git a/docs/fa/tools/image-to-pdf.md b/docs/fa/tools/image-to-pdf.md new file mode 100644 index 00000000..795f1423 --- /dev/null +++ b/docs/fa/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: تصاویر به PDF +description: JPG، PNG، BMP، GIF، TIFF، SVG، HEIC، WebP، PSD و بیش از 10 قالب تصویری دیگر را به یک فایل PDF تبدیل کنید. +--- + +# تصاویر به PDF + +مبدل همه‌کارهٔ تصویر به PDF. تصاویر را تقریباً در هر قالبی بارگذاری کنید و آن‌ها را در یک سند PDF ترکیب کنید. هر تصویر صفحهٔ خودش را می‌گیرد که اندازه‌اش با ابعاد اصلی تصویر مطابقت دارد. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +این گسترده‌ترین پشتیبانی از قالب‌ها در میان مبدل‌های تصویر BentoPDF است. اگر فقط به یک قالب خاص نیاز دارید، از یکی از ابزارهای اختصاصی استفاده کنید. + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های تصویری خود را بکشید و رها کنید. می‌توانید چند فایل را همزمان انتخاب کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های ناخواسته را با نماد سطل زباله حذف کنید یا برای افزودن تصاویر بیشتر روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. از منوی کشویی یک سطح **کیفیت PDF** انتخاب کنید. +4. روی **تبدیل به PDF** کلیک کنید. ابزار تصاویر را با موتور PyMuPDF پردازش می‌کند و نتیجه را با نام `images_to_pdf.pdf` دانلود می‌کند. + +## گزینه‌ها + +**کیفیت PDF** فشرده‌سازی اعمال‌شده هنگام جاسازی تصاویر در PDF را کنترل می‌کند: + +- **کیفیت بالا**: فشرده‌سازی حداقلی، حجم بیشتر. بهترین گزینه برای چاپ یا بایگانی. +- **کیفیت متوسط** (پیش‌فرض): فشرده‌سازی متعادل. مناسب برای بیشتر کاربردها. +- **کیفیت پایین**: فشرده‌سازی شدید، کمترین حجم. مناسب برای ایمیل یا اشتراک سریع. + +فایل‌های HEIC و WebP پیش از جاسازی به‌طور خودکار به PNG تبدیل می‌شوند. این کار بی‌صدا انجام می‌شود و به هیچ مرحلهٔ اضافه‌ای نیاز ندارد. + +## موارد استفاده + +- ترکیب رسیدها یا اسناد اسکن‌شده با دوربین گوشی در یک PDF +- ساخت نمونه‌کار عکس یا کاتالوگ از تصاویری با قالب‌های مختلف +- تبدیل عکس‌های آیفون (HEIC) به یک PDF قابل اشتراک بدون نصب نرم‌افزار دسکتاپ +- گردآوری ماکاپ‌های طراحی از خروجی‌های PSD و اسکرین‌شات‌ها در یک تحویلی برای مشتری +- بایگانی پوشه‌ای از قالب‌های تصویری قدیمی (PNM، JXR، JP2) در یک PDF واحد + +## نکات + +- ترتیب تصاویر در PDF با ترتیب آن‌ها در فهرست فایل‌ها یکسان است. آن‌ها را به ترتیبی که می‌خواهید بارگذاری کنید. +- برای کمترین حجم ممکن، کیفیت پایین را انتخاب کنید. تفاوت بصری برای اسکن‌های پرمتن اغلب ناچیز است. +- اگر فقط یک قالب تصویری دارید، مبدل‌های اختصاصی (JPG به PDF، PNG به PDF و غیره) همان نتیجه را با رابطی ساده‌تر ارائه می‌دهند. + +## ابزارهای مرتبط + +- [JPG به PDF](./jpg-to-pdf) +- [PNG به PDF](./png-to-pdf) +- [HEIC به PDF](./heic-to-pdf) +- [WebP به PDF](./webp-to-pdf) diff --git a/docs/fa/tools/index.md b/docs/fa/tools/index.md new file mode 100644 index 00000000..8e2716b6 --- /dev/null +++ b/docs/fa/tools/index.md @@ -0,0 +1,183 @@ +# مرجع ابزارها + +BentoPDF بیش از **130 ابزار** برای کار با PDF ارائه می‌دهد. همهٔ ابزارها کاملاً در مرورگر شما اجرا می‌شوند؛ فایل‌های شما هرگز از دستگاهتان خارج نمی‌شوند. + +--- + +## ویرایش و حاشیه‌نویسی + +اسناد PDF خود را با مجموعه‌ای کامل از ابزارهای ویرایش تغییر دهید، نشانه‌گذاری و بهبود دهید. + +
+ +- [**ویرایشگر PDF**](./edit-pdf): حاشیه‌نویسی، هایلایت، پنهان‌سازی، نظر گذاشتن، افزودن شکل و تصویر، جستجو و مشاهدهٔ PDFها. +- [**ویرایش نشانک‌ها**](./bookmark): افزودن، ویرایش، وارد کردن، حذف و استخراج نشانک‌های PDF. +- [**فهرست مطالب**](./table-of-contents): ساخت صفحهٔ فهرست مطالب از نشانک‌های PDF. +- [**شماره‌گذاری صفحات**](./page-numbers): درج شمارهٔ صفحه در سند. +- [**افزودن برچسب صفحه**](./add-page-labels): اعمال برچسب‌های صفحهٔ PDF با اعداد رومی، پیشوندها و شروع دلخواه. +- [**شماره‌گذاری Bates**](./bates-numbering): افزودن شماره‌های پیاپی Bates در یک یا چند فایل PDF. +- [**افزودن واترمارک**](./add-watermark): درج متن یا تصویر روی صفحات PDF. +- [**سرصفحه و پاصفحه**](./header-footer): افزودن متن به بالا و پایین صفحات. +- [**وارونه‌سازی رنگ‌ها**](./invert-colors): ساخت نسخهٔ حالت تیرهٔ PDF. +- [**جلوهٔ اسکنر**](./scanner-effect): PDF را شبیه یک سند اسکن‌شده کنید. +- [**تنظیم رنگ‌ها**](./adjust-colors): تنظیم دقیق روشنایی، کنتراست، اشباع و موارد دیگر. +- [**رنگ پس‌زمینه**](./background-color): تغییر رنگ پس‌زمینهٔ PDF. +- [**تغییر رنگ متن**](./text-color): تغییر رنگ متن در PDF. +- [**امضای PDF**](./sign-pdf): امضای خود را بکشید، تایپ کنید یا بارگذاری کنید. +- [**افزودن مهر**](./add-stamps): افزودن مهرهای تصویری به PDF با نوار ابزار حاشیه‌نویسی. +- [**حذف حاشیه‌نویسی‌ها**](./remove-annotations): حذف نظرات، هایلایت‌ها و پیوندها. +- [**برش PDF**](./crop-pdf): کوتاه کردن حاشیه‌های همهٔ صفحات PDF. +- [**پرکنندهٔ فرم PDF**](./form-filler): پر کردن فرم‌ها مستقیماً در مرورگر. از فرم‌های XFA هم پشتیبانی می‌کند. +- [**ساخت فرم PDF**](./form-creator): ساخت فرم‌های PDF قابل پر کردن با فیلدهای متنی کشیدنی و رهاکردنی. +- [**حذف صفحات خالی**](./remove-blank-pages): شناسایی و حذف خودکار صفحات خالی. + +
+ +--- + +## تبدیل به PDF + +تصاویر، اسناد، کتاب‌های الکترونیکی و دیگر قالب‌های فایل را به PDF تبدیل کنید. + +
+ +- [**تصاویر به PDF**](./image-to-pdf): تبدیل JPG، PNG، BMP، GIF، TIFF، SVG، HEIC، WebP و موارد دیگر به PDF. +- [**JPG به PDF**](./jpg-to-pdf): ساخت PDF از یک یا چند تصویر JPG. +- [**PNG به PDF**](./png-to-pdf): ساخت PDF از یک یا چند تصویر PNG. +- [**WebP به PDF**](./webp-to-pdf): ساخت PDF از یک یا چند تصویر WebP. +- [**SVG به PDF**](./svg-to-pdf): ساخت PDF از یک یا چند تصویر SVG. +- [**BMP به PDF**](./bmp-to-pdf): ساخت PDF از یک یا چند تصویر BMP. +- [**HEIC به PDF**](./heic-to-pdf): ساخت PDF از یک یا چند تصویر HEIC. +- [**TIFF به PDF**](./tiff-to-pdf): ساخت PDF از یک یا چند تصویر TIFF. +- [**متن به PDF**](./txt-to-pdf): تبدیل یک فایل متنی ساده به PDF. +- [**Markdown به PDF**](./markdown-to-pdf): تبدیل Markdown به PDF با پیش‌نمایش زنده و برجسته‌سازی نحو. +- [**JSON به PDF**](./json-to-pdf): تبدیل فایل‌های JSON به قالب PDF. +- [**ODT به PDF**](./odt-to-pdf): تبدیل فایل‌های ODT (OpenDocument Text) به PDF. +- [**CSV به PDF**](./csv-to-pdf): تبدیل صفحه‌گسترده‌های CSV به PDF. +- [**RTF به PDF**](./rtf-to-pdf): تبدیل اسناد RTF (Rich Text Format) به PDF. +- [**Word به PDF**](./word-to-pdf): تبدیل اسناد Word (DOCX، DOC، ODT) به PDF. +- [**Excel به PDF**](./excel-to-pdf): تبدیل صفحه‌گسترده‌های Excel (XLSX، XLS، ODS) به PDF. +- [**PowerPoint به PDF**](./powerpoint-to-pdf): تبدیل ارائه‌های PowerPoint (PPTX، PPT، ODP) به PDF. +- [**XPS به PDF**](./xps-to-pdf): تبدیل اسناد XPS/OXPS به PDF. +- [**MOBI به PDF**](./mobi-to-pdf): تبدیل کتاب‌های الکترونیکی MOBI به PDF. +- [**EPUB به PDF**](./epub-to-pdf): تبدیل کتاب‌های الکترونیکی EPUB به PDF. +- [**FB2 به PDF**](./fb2-to-pdf): تبدیل کتاب‌های الکترونیکی FictionBook (FB2) به PDF. +- [**CBZ به PDF**](./cbz-to-pdf): تبدیل بایگانی‌های کمیک (CBZ/CBR) به PDF. +- [**WPD به PDF**](./wpd-to-pdf): تبدیل اسناد WordPerfect (WPD) به PDF. +- [**WPS به PDF**](./wps-to-pdf): تبدیل اسناد WPS Office به PDF. +- [**XML به PDF**](./xml-to-pdf): تبدیل اسناد XML به PDF. +- [**ODG به PDF**](./odg-to-pdf): تبدیل OpenDocument Graphics (ODG) به PDF. +- [**ODS به PDF**](./ods-to-pdf): تبدیل OpenDocument Spreadsheet (ODS) به PDF. +- [**ODP به PDF**](./odp-to-pdf): تبدیل OpenDocument Presentation (ODP) به PDF. +- [**PUB به PDF**](./pub-to-pdf): تبدیل Microsoft Publisher (PUB) به PDF. +- [**VSD به PDF**](./vsd-to-pdf): تبدیل Microsoft Visio (VSD، VSDX) به PDF. +- [**PSD به PDF**](./psd-to-pdf): تبدیل فایل‌های Adobe Photoshop (PSD) به PDF. +- [**ایمیل به PDF**](./email-to-pdf): تبدیل فایل‌های ایمیل (EML، MSG) به قالب PDF. + +
+ +--- + +## تبدیل از PDF + +محتوای PDF را به تصاویر، اسناد و قالب‌های داده استخراج کنید. + +
+ +- [**PDF به JPG**](./pdf-to-jpg): تبدیل هر صفحهٔ PDF به یک تصویر JPG. +- [**PDF به PNG**](./pdf-to-png): تبدیل هر صفحهٔ PDF به یک تصویر PNG. +- [**PDF به WebP**](./pdf-to-webp): تبدیل هر صفحهٔ PDF به یک تصویر WebP. +- [**PDF به BMP**](./pdf-to-bmp): تبدیل هر صفحهٔ PDF به یک تصویر BMP. +- [**PDF به TIFF**](./pdf-to-tiff): تبدیل هر صفحهٔ PDF به یک تصویر TIFF. +- [**PDF به CBZ**](./pdf-to-cbz): تبدیل PDF به CBZ (Comic Book Archive) برای کمیک‌خوان‌ها و Calibre. +- [**PDF به SVG**](./pdf-to-svg): تبدیل هر صفحهٔ PDF به یک گرافیک برداری مقیاس‌پذیر. +- [**PDF به CSV**](./pdf-to-csv): استخراج جدول‌ها از PDF و تبدیل به قالب CSV. +- [**PDF به Excel**](./pdf-to-excel): استخراج جدول‌ها از PDF و تبدیل به Excel (XLSX). +- [**PDF به خاکستری**](./pdf-to-greyscale): تبدیل همهٔ رنگ‌ها به سیاه و سفید. +- [**PDF به JSON**](./pdf-to-json): تبدیل فایل‌های PDF به قالب JSON. +- [**PDF به Word**](./pdf-to-word): تبدیل فایل‌های PDF به اسناد Word قابل ویرایش. +- [**استخراج تصاویر**](./extract-images): استخراج همهٔ تصاویر جاسازی‌شده از فایل‌های PDF. +- [**PDF به Markdown**](./pdf-to-markdown): تبدیل متن و جدول‌های PDF به قالب Markdown. +- [**آماده‌سازی PDF برای هوش مصنوعی**](./prepare-pdf-for-ai): استخراج محتوای PDF به‌صورت JSON برای LlamaIndex در فرایندهای RAG/LLM. +- [**PDF به متن**](./pdf-to-text): استخراج متن از فایل‌های PDF و ذخیره به‌صورت متن ساده. +- [**استخراج جدول‌های PDF**](./extract-tables): استخراج جدول‌ها از PDF به‌صورت CSV، JSON یا Markdown. + +
+ +--- + +## سازماندهی و مدیریت + +صفحات و فایل‌های PDF خود را بازچینی، ترکیب، تقسیم و مدیریت کنید. + +
+ +- [**سازندهٔ گردش کار PDF**](./pdf-workflow): ساخت فرایندهای سفارشی پردازش PDF با یک ویرایشگر گرهٔ بصری. +- [**ابزار چندکارهٔ PDF**](./pdf-multi-tool): ویرایشگر کامل PDF با مدیریت صفحات. +- [**OCR روی PDF**](./ocr-pdf): PDF را قابل جستجو و کپی کنید. +- [**ادغام PDF**](./merge-pdf): ترکیب چند PDF در یک فایل. +- [**ادغام یک‌درمیان صفحات**](./alternate-merge): ادغام PDFها با یک‌درمیان کردن صفحات هر PDF. +- [**تلفیق دورو**](./duplex-collate): مرتب‌سازی بلوک‌های اسکن رو و پشت به ترتیب صحیح صفحات. +- [**تکثیر و سازماندهی**](./organize-pdf): تکثیر، مرتب‌سازی و حذف صفحات. +- [**افزودن پیوست**](./add-attachments): جاسازی یک یا چند فایل در PDF. +- [**استخراج پیوست‌ها**](./extract-attachments): استخراج همهٔ فایل‌های جاسازی‌شده از PDF(ها) به‌صورت ZIP. +- [**ویرایش پیوست‌ها**](./edit-attachments): مشاهده یا حذف پیوست‌های PDF. +- [**لایه‌های OCG در PDF**](./pdf-layers): مشاهده، روشن و خاموش کردن، افزودن و حذف لایه‌های OCG در PDF. +- [**تقسیم PDF**](./split-pdf): استخراج یک بازه از صفحات در یک PDF جدید. +- [**تقسیم صفحات**](./divide-pages): تقسیم صفحات به‌صورت افقی یا عمودی. +- [**استخراج صفحات**](./extract-pages): ذخیرهٔ صفحات انتخاب‌شده به‌صورت فایل‌های جدید. +- [**حذف صفحات**](./delete-pages): حذف صفحات خاص از سند. +- [**افزودن صفحهٔ خالی**](./add-blank-page): درج یک صفحهٔ خالی در هر جای PDF. +- [**وارونه‌سازی ترتیب صفحات**](./reverse-pages): وارونه کردن ترتیب همهٔ صفحات سند. +- [**چرخاندن PDF**](./rotate-pdf): چرخاندن صفحات با گام‌های 90 درجه. +- [**چرخاندن با زاویهٔ دلخواه**](./rotate-custom): چرخاندن صفحات با هر زاویهٔ دلخواه. +- [**N-Up کردن PDF**](./n-up-pdf): قرار دادن چند صفحه روی یک برگه. +- [**دفترچهٔ PDF**](./pdf-booklet): بازچینی صفحات برای چاپ دورو به‌صورت دفترچه. +- [**ترکیب در یک صفحه**](./combine-single-page): به هم دوختن همهٔ صفحات در یک صفحهٔ پیوسته. +- [**مشاهدهٔ فراداده**](./view-metadata): بررسی ویژگی‌های پنهان PDF. +- [**ویرایش فراداده**](./edit-metadata): تغییر نویسنده، عنوان و ویژگی‌های دیگر. +- [**PDFها به ZIP**](./pdf-to-zip): بسته‌بندی چند فایل PDF در یک بایگانی ZIP. +- [**مقایسهٔ PDFها**](./compare-pdfs): مقایسهٔ دو PDF در کنار هم. +- [**پوستری‌کردن PDF**](./posterize-pdf): تقسیم یک صفحهٔ بزرگ به چند صفحهٔ کوچک‌تر. + +
+ +--- + +## بهینه‌سازی و ترمیم + +PDFهای خود را برای عملکرد و سازگاری بهتر فشرده، اصلاح و بهینه کنید. + +
+ +- [**فشرده‌سازی PDF**](./compress-pdf): کاهش حجم فایل PDF. +- [**PDF به PDF/A**](./pdf-to-pdfa): تبدیل PDF به PDF/A برای بایگانی بلندمدت. +- [**اصلاح اندازهٔ صفحه**](./fix-page-size): یکسان‌سازی اندازهٔ همهٔ صفحات. +- [**خطی‌سازی PDF**](./linearize-pdf): بهینه‌سازی PDF برای مشاهدهٔ سریع در وب. +- [**ابعاد صفحه**](./page-dimensions): تحلیل اندازه، جهت و واحدهای صفحه. +- [**حذف محدودیت‌ها**](./remove-restrictions): حذف محافظت با گذرواژه و محدودیت‌های امنیتی. +- [**ترمیم PDF**](./repair-pdf): بازیابی داده از فایل‌های PDF خراب یا آسیب‌دیده. +- [**رستر کردن PDF**](./rasterize-pdf): تبدیل PDF به PDF مبتنی بر تصویر. لایه‌ها را مسطح و متن قابل انتخاب را حذف می‌کند. +- [**صاف‌کردن PDF**](./deskew-pdf): صاف کردن خودکار صفحات اسکن‌شدهٔ کج با OpenCV. +- [**تبدیل قلم به خطوط برداری**](./font-to-outline): تبدیل همهٔ قلم‌ها به خطوط برداری برای نمایش یکسان. + +
+ +--- + +## امنیت PDF + +از اسناد PDF خود محافظت کنید، آن‌ها را رمزگذاری کنید و دسترسی به آن‌ها را کنترل کنید. + +
+ +- [**رمزگذاری PDF**](./protect-pdf): قفل کردن PDF با افزودن گذرواژه. +- [**پاک‌سازی PDF**](./sanitize-pdf): حذف فراداده، حاشیه‌نویسی‌ها، اسکریپت‌ها و موارد دیگر. +- [**رمزگشایی PDF**](./unlock-pdf): باز کردن قفل PDF با حذف محافظت گذرواژه. +- [**مسطح‌سازی PDF**](./flatten-pdf): غیرقابل‌ویرایش کردن فیلدهای فرم و حاشیه‌نویسی‌ها. +- [**حذف فراداده**](./remove-metadata): حذف داده‌های پنهان از PDF. +- [**تغییر مجوزها**](./change-permissions): تعیین یا تغییر مجوزهای کاربر روی PDF. +- [**امضای دیجیتال PDF**](./digital-sign-pdf): افزودن امضای دیجیتال رمزنگاری‌شده با گواهی‌های X.509. +- [**اعتبارسنجی امضای PDF**](./validate-signature-pdf): بررسی امضاهای دیجیتال و مشاهدهٔ جزئیات گواهی. + +
diff --git a/docs/fa/tools/invert-colors.md b/docs/fa/tools/invert-colors.md new file mode 100644 index 00000000..ed08cfc1 --- /dev/null +++ b/docs/fa/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: وارونه‌سازی رنگ‌ها +description: همهٔ رنگ‌های PDF خود را وارونه کنید تا نسخهٔ حالت تیرهٔ هر سندی را بسازید. +--- + +# وارونه‌سازی رنگ‌ها + +همهٔ رنگ‌های PDF خود را به رنگ معکوسشان تبدیل کنید. پس‌زمینه‌های سفید سیاه می‌شوند، متن سیاه سفید می‌شود و همهٔ رنگ‌های دیگر به مقادیر مکملشان تغییر می‌کنند. این سریع‌ترین راه برای ساخت نسخهٔ «حالت تیره» از هر PDF است. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. برای پردازش روی **وارونه‌سازی رنگ‌ها** کلیک کنید. +3. PDF وارونه‌شده به‌طور خودکار دانلود می‌شود. + +هیچ تنظیمات اضافه‌ای وجود ندارد. ابزار هر صفحه را به‌صورت تصویر رندر می‌کند، رنگ همهٔ پیکسل‌ها را وارونه می‌کند و نتیجه را در یک PDF جدید سرهم می‌کند. + +## ویژگی‌ها + +- وارونه‌سازی رنگ همهٔ صفحات با یک کلیک +- پردازش همهٔ صفحات سند +- حفظ ابعاد و چیدمان اصلی صفحات +- کار با هر PDF صرف‌نظر از نوع محتوا (متن، تصویر، ترکیبی) + +## موارد استفاده + +- ساخت نسخه‌های حالت تیره از کتاب‌های درسی یا راهنماها برای مطالعهٔ راحت در شب +- آماده‌سازی نسخه‌های پرکنتراست اسناد برای دسترس‌پذیری +- وارونه کردن اسناد اسکن‌شده‌ای که با نوردهی نادرست ثبت شده‌اند +- تولید نسخه‌های نگاتیو از PDFهای پرتصویر برای تحلیل بصری + +## نکات + +- چون ابزار برای اعمال جلوه صفحات را رستر می‌کند، خروجی مبتنی بر تصویر است. متن دیگر قابل انتخاب یا جستجو نخواهد بود. اگر پس از وارونه‌سازی به متن قابل جستجو نیاز دارید، خروجی را با یک ابزار OCR پردازش کنید. +- برای تنظیمات دقیق‌تر رنگ (روشنایی، کنتراست، اشباع)، به‌جای آن از ابزار [تنظیم رنگ‌ها](./adjust-colors) استفاده کنید. +- پردازش PDFهای بزرگ با صفحات زیاد ممکن است بیشتر طول بکشد، چون هر صفحه جداگانه رندر و وارونه می‌شود. + +## ابزارهای مرتبط + +- [تنظیم رنگ‌ها](./adjust-colors) +- [رنگ پس‌زمینه](./background-color) +- [جلوهٔ اسکنر](./scanner-effect) diff --git a/docs/fa/tools/jpg-to-pdf.md b/docs/fa/tools/jpg-to-pdf.md new file mode 100644 index 00000000..78649bab --- /dev/null +++ b/docs/fa/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG به PDF +description: یک یا چند تصویر JPG، JPEG و JPEG 2000 را مستقیماً در مرورگر خود به یک فایل PDF تبدیل کنید. +--- + +# JPG به PDF + +تصاویر JPG را به یک PDF تمیز تبدیل کنید. یک فایل بارگذاری کنید یا چند JPG را با هم پردازش کنید؛ هر تصویر به یک صفحهٔ تمام‌اندازه در سند خروجی تبدیل می‌شود. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های JPG خود را بکشید و رها کنید. انتخاب چندگانه پشتیبانی می‌شود. +2. فایل‌های بارگذاری‌شده را بررسی کنید. با نماد سطل زباله فایل‌ها را تک‌تک حذف کنید یا برای افزودن به فهرست روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. یک سطح **کیفیت PDF** انتخاب کنید. +4. روی **تبدیل به PDF** کلیک کنید. ابزار تصاویر را مطابق تنظیم کیفیت شما فشرده می‌کند، با موتور PyMuPDF تبدیل می‌کند و `from_jpgs.pdf` را دانلود می‌کند. + +## گزینه‌ها + +**کیفیت PDF** فشرده‌سازی اعمال‌شده روی هر تصویر پیش از جاسازی در PDF را تنظیم می‌کند: + +- **کیفیت بالا**: حداکثر جزئیات را حفظ می‌کند. برای عکاسی یا چاپ استفاده کنید. +- **کیفیت متوسط** (پیش‌فرض): تعادلی مناسب بین وضوح و حجم فایل. +- **کیفیت پایین**: فشرده‌سازی شدید برای کوچک‌ترین خروجی. + +## موارد استفاده + +- تبدیل اسناد اسکن‌شدهٔ ذخیره‌شده به‌صورت JPG به یک PDF واحد برای ارسال +- بسته‌بندی عکس‌های محصول در یک کاتالوگ برای مشتریان +- تبدیل تصاویر پزشکی یا ماهواره‌ای JPEG 2000 به یک PDF قابل حمل +- ساخت آلبوم عکس قابل چاپ از خروجی‌های دوربین + +## نکات + +- فایل‌های JPEG 2000 (`.jp2`، `.jpx`) به‌طور کامل پشتیبانی می‌شوند، نه فقط JPEG استاندارد. این برای تصویربرداری پزشکی و داده‌های مکانی مفید است. +- اگر JPGهای شما از دوربین گوشی هستند، کیفیت متوسط معمولاً فایلی 40 تا 60 درصد کوچک‌تر از کیفیت بالا تولید می‌کند، بدون تفاوت قابل مشاهده روی صفحه‌نمایش. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [PNG به PDF](./png-to-pdf) +- [WebP به PDF](./webp-to-pdf) diff --git a/docs/fa/tools/json-to-pdf.md b/docs/fa/tools/json-to-pdf.md new file mode 100644 index 00000000..d58f6a88 --- /dev/null +++ b/docs/fa/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON به PDF +description: فایل‌های PDF را از قالب JSON BentoPDF بازسازی کنید. خروجی‌های JSON را به اسناد PDF اصلی‌شان برگردانید. +--- + +# JSON به PDF + +اسناد PDF را از فایل‌های JSON که پیش‌تر با ابزار **PDF به JSON** در BentoPDF ساخته شده‌اند بازسازی کنید. این یک ابزار تبدیل رفت‌وبرگشتی است: نمایش ساختاریافتهٔ JSON یک PDF را می‌گیرد و سند اصلی را دوباره می‌سازد. + +::: warning +این ابزار فقط فایل‌های JSON تولیدشده با مبدل PDF به JSON در BentoPDF را می‌پذیرد. فایل‌های JSON معمولی از APIها، پایگاه‌های داده یا ابزارهای دیگر پشتیبانی نمی‌شوند. +::: + +## قالب‌های پشتیبانی‌شده + +| ورودی | توضیحات | +| :------ | :------------------------------------------------------------- | +| `.json` | فایل‌های JSON خروجی‌گرفته‌شده با ابزار PDF به JSON در BentoPDF | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا یک یا چند فایل JSON را بکشید و رها کنید. +2. فهرست فایل‌ها هر فایل انتخاب‌شده را با حجمش نشان می‌دهد. +3. روی **تبدیل به PDF** کلیک کنید. ابزار همهٔ فایل‌ها را با یک Web Worker و موتور CPDF پردازش می‌کند. +4. خروجی با نام `jsons-to-pdf.zip` دانلود می‌شود که به‌ازای هر فایل JSON ورودی یک PDF دارد. + +تبدیل در یک Web Worker پس‌زمینه اجرا می‌شود، بنابراین رابط کاربری حتی با فایل‌های بزرگ هم پاسخگو می‌ماند. + +## گزینه‌ها + +این ابزار گزینهٔ قابل تنظیمی ندارد. ساختار JSON به‌طور کامل PDF خروجی را تعیین می‌کند. + +## خروجی + +هنگام تبدیل چند فایل JSON، نتایج به‌صورت بایگانی ZIP ارائه می‌شوند. نام هر PDF از فایل JSON منبعش گرفته می‌شود (مثلاً `report.json` به `report.pdf` تبدیل می‌شود). + +## موارد استفاده + +- بازیابی PDFها از یک پشتیبان یا فرایند بایگانی مبتنی بر JSON +- عبور رفت‌وبرگشتی یک PDF از JSON برای بررسی و سپس بازگرداندن به PDF +- بازسازی اسناد پس از تغییرات برنامه‌نویسی‌شده در ساختار JSON +- اطمینان از اینکه خروجی PDF به JSON همهٔ محتوای سند را ثبت کرده است، با تبدیل دوبارهٔ آن + +## نکات + +- اگر لازم است دادهٔ JSON دلخواه (مانند پاسخ‌های API یا فایل‌های پیکربندی) را به یک PDF قالب‌بندی‌شده تبدیل کنید، ابزار [متن به PDF](./txt-to-pdf) مناسب‌تر است. JSON را به‌صورت متن جای‌گذاری کنید تا با قالب‌بندی مناسب رندر شود. +- برای کار این ابزار، موتور CPDF WebAssembly باید در دسترس باشد. نمونه‌های خودمیزبان باید فایل‌های CPDF WASM را پیکربندی کنند. + +## ابزارهای مرتبط + +- [متن به PDF](./txt-to-pdf) +- [Markdown به PDF](./markdown-to-pdf) +- [CSV به PDF](./csv-to-pdf) diff --git a/docs/fa/tools/linearize-pdf.md b/docs/fa/tools/linearize-pdf.md new file mode 100644 index 00000000..4f3ab67e --- /dev/null +++ b/docs/fa/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: خطی‌سازی PDF +description: فایل‌های PDF را برای مشاهدهٔ سریع در وب با بارگیری تدریجی بهینه کنید. با نام بهینه‌سازی «Fast Web View» نیز شناخته می‌شود. +--- + +# خطی‌سازی PDF + +خطی‌سازی ساختار PDF را طوری بازآرایی می‌کند که صفحهٔ اول پیش از دانلود کامل فایل نمایش داده شود. Adobe این را «Fast Web View» می‌نامد. اگر PDFها را روی یک وب‌سایت میزبانی می‌کنید یا از طریق یک پورتال اسناد ارائه می‌دهید، خطی‌سازی باز شدن آن‌ها را به‌طور محسوسی سریع‌تر می‌کند. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. +2. روی **خطی‌سازی PDF(ها)** کلیک کنید. +3. نتایج را به‌صورت یک بایگانی ZIP شامل همهٔ فایل‌های خطی‌شده دانلود کنید. + +هیچ تنظیماتی برای پیکربندی وجود ندارد. این ابزار از پرچم `--linearize` در QPDF استفاده می‌کند که ساختار داخلی PDF را بدون تغییر محتوای بصری آن بازآرایی می‌کند. + +## خطی‌سازی چه می‌کند + +- اشیای PDF را طوری مرتب می‌کند که داده‌های صفحهٔ اول در ابتدای فایل قرار گیرند +- یک دیکشنری خطی‌سازی و جدول‌های راهنما اضافه می‌کند تا نمایشگرها بدانند هر صفحه کجاست +- درخواست‌های بازهٔ بایت را ممکن می‌کند: مرورگر می‌تواند فقط صفحهٔ اول را بدون دانلود کل فایل دریافت کند +- جدول ارجاع متقابل را برای دسترسی تصادفی کارآمد مرتب می‌کند + +## ویژگی‌ها + +- پردازش گروهی چند PDF در یک عملیات +- خروجی همهٔ محتوا، قلم‌ها، تصاویر و عناصر تعاملی را حفظ می‌کند +- استفاده از QPDF (WebAssembly) برای خطی‌سازی قابل اعتماد و منطبق با استانداردها +- نتایج برای دانلود آسان در یک ZIP بسته‌بندی می‌شوند + +## موارد استفاده + +- میزبانی گزارش‌های PDF روی وب‌سایتی که کاربران انتظار نمایش فوری صفحه را دارند +- جاسازی PDF در برنامه‌های وب با نمایشگرهای درون‌مرورگری +- انتشار کاتالوگ‌ها یا راهنماهای PDF که از طریق اتصال‌های کند موبایل دیده می‌شوند +- آماده‌سازی اسناد برای شبکه‌های تحویل محتوا (CDN) که از ارائهٔ بازهٔ بایت پشتیبانی می‌کنند + +## نکات + +- پس از اتمام همهٔ ویرایش‌های دیگر خطی‌سازی کنید. هر تغییر بعدی (ادغام، افزودن صفحه) خطی‌سازی را از بین می‌برد. +- برای کوچک‌ترین و سریع‌ترین PDFهای ممکن، آن را با فشرده‌سازی PDF ترکیب کنید. +- خطی‌سازی کمی به حجم فایل اضافه می‌کند (معمولاً کمتر از 1٪). + +## ابزارهای مرتبط + +- [فشرده‌سازی PDF](./compress-pdf): کاهش حجم فایل پیش از خطی‌سازی +- [ترمیم PDF](./repair-pdf): رفع مشکلات ساختاری که مانع خطی‌سازی می‌شوند +- [حذف فراداده](./remove-metadata): حذف فراداده پیش از انتشار آنلاین diff --git a/docs/fa/tools/markdown-to-pdf.md b/docs/fa/tools/markdown-to-pdf.md new file mode 100644 index 00000000..b8c1a7fd --- /dev/null +++ b/docs/fa/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown به PDF +description: Markdown بنویسید یا جای‌گذاری کنید و آن را با پیش‌نمایش زنده و برجسته‌سازی نحو به یک PDF با قالب‌بندی حرفه‌ای خروجی بگیرید. +--- + +# Markdown به PDF + +یک ویرایشگر کامل Markdown با پیش‌نمایش زنده و خروجی PDF با یک کلیک. از ابتدا بنویسید، یک فایل `.md` موجود بارگذاری کنید یا محتوا را از کلیپ‌بورد جای‌گذاری کنید. ویرایشگر Markdown شما را به‌صورت بلادرنگ رندر می‌کند و با موتور چاپ داخلی مرورگر یک PDF سبک‌دار خروجی می‌دهد. + +## قالب‌های پشتیبانی‌شده + +| ورودی | توضیحات | +| :------------- | :---------------------------- | +| فایل‌های `.md` | بارگذاری با دکمهٔ Upload | +| ورودی مستقیم | تایپ یا جای‌گذاری در ویرایشگر | + +## نحوهٔ کار + +1. ابزار Markdown به PDF را باز کنید. ویرایشگر با نمای دوقسمتی بارگیری می‌شود: منبع Markdown در سمت چپ و پیش‌نمایش رندرشده در سمت راست. +2. Markdown خود را بنویسید، جای‌گذاری کنید یا برای بارگیری یک فایل `.md` روی **بارگذاری** کلیک کنید. +3. با لغزندهٔ پوسته در نوار ابزار بین پوسته‌های روشن و تیره جابه‌جا شوید. +4. برای تولید PDF از طریق پنجرهٔ چاپ مرورگر روی **برون‌ریزی PDF** کلیک کنید (یا `Ctrl/Cmd + S` را بزنید). + +## ویژگی‌ها + +ویرایشگر مجموعهٔ گسترده‌ای از قابلیت‌های Markdown فراتر از موارد پایه را پشتیبانی می‌کند: + +- **Markdown استاندارد**: عنوان‌ها، پررنگ، کج، پیوندها، تصاویر، فهرست‌ها، نقل‌قول‌ها، خطوط افقی +- **بلوک‌های کد** با برجسته‌سازی نحو برای بیش از 15 زبان (JavaScript، TypeScript، Python، Go، Rust، SQL، Java، C#، C++، YAML، Bash و غیره) +- **نمودارهای Mermaid**: فلوچارت‌ها، نمودارهای توالی، نمودارهای ER و دیگر انواع نمودار Mermaid مستقیماً در پیش‌نمایش رندر می‌شوند +- **جدول‌ها** با نحو استاندارد جدول Markdown +- **فهرست کارها** با کادرهای انتخاب +- **پانویس‌ها**، **زیرنویس**، **بالانویس** +- **فهرست‌های تعریف**، **اختصارها** +- پشتیبانی از **ایموجی** (`:smile:` به‌صورت ایموجی رندر می‌شود) +- **هایلایت‌ها** (`==marked text==`) و **درج‌ها** (`++inserted text++`) +- **پیوند خودکار URLها**: URLهای ساده به پیوندهای قابل کلیک تبدیل می‌شوند +- تولید **فهرست مطالب** +- **پیوندهای لنگر** روی عنوان‌ها + +## موارد استفاده + +- نوشتن مستندات پروژه و خروجی گرفتن یک PDF شسته‌رفته برای ذی‌نفعان +- ساخت گزارش‌های فنی با نمونه کد و نمودارهای معماری Mermaid +- تبدیل README یک مخزن GitHub به PDF برای استفادهٔ آفلاین یا چاپ +- پیش‌نویس یک پیشنهاد یا مشخصات فنی با فهرست کارها و جدول‌ها +- تولید جزوه‌ای سبک‌دار از یادداشت‌های درسی نوشته‌شده با Markdown + +## نکات + +- خروجی PDF از قابلیت چاپ به PDF مرورگر استفاده می‌کند. در Chrome می‌توانید پیش از ذخیره، حاشیه‌ها و مقیاس را در پنجرهٔ چاپ تنظیم کنید. +- نمودارهای Mermaid در پیش‌نمایش رندر می‌شوند اما ممکن است در نخستین استفاده کمی زمان برای راه‌اندازی لازم داشته باشند. +- از `Ctrl/Cmd + S` به‌عنوان میان‌بر صفحه‌کلید برای خروجی گرفتن بدون رفتن سراغ دکمه استفاده کنید. + +## ابزارهای مرتبط + +- [متن به PDF](./txt-to-pdf) +- [Word به PDF](./word-to-pdf) +- [JSON به PDF](./json-to-pdf) diff --git a/docs/fa/tools/merge-pdf.md b/docs/fa/tools/merge-pdf.md new file mode 100644 index 00000000..20a73260 --- /dev/null +++ b/docs/fa/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: ادغام PDF +description: چند فایل PDF را با مرتب‌سازی کشیدن و رها کردن و کنترل در سطح صفحه در یک سند ترکیب کنید. +--- + +# ادغام PDF + +چند فایل PDF را در یک سند واحد ترکیب کنید. می‌توانید کل فایل‌ها را با ترتیب مشخص ادغام کنید، یا برای کنترل دقیق روی تک‌تک صفحات همهٔ PDFهای بارگذاری‌شده به حالت صفحه بروید. + +## نحوهٔ کار + +1. دو یا چند فایل PDF را با کلیک روی ناحیهٔ رها کردن یا کشیدن آن‌ها بارگذاری کنید. +2. با کلید بالای صفحه بین **حالت فایل** و **حالت صفحه** انتخاب کنید. +3. در حالت فایل، فایل‌ها را برای مرتب‌سازی بکشید و در صورت تمایل برای هر فایل بازهٔ صفحات (مثلاً `1-3, 5`) تعیین کنید. برای شامل کردن همهٔ صفحات، بازه را خالی بگذارید. +4. در حالت صفحه، تصاویر بندانگشتی صفحات را بکشید و رها کنید تا ترتیب دقیق صفحات را بسازید. +5. برای ترکیب همه در یک فایل روی **ادغام PDFها** کلیک کنید. PDF ادغام‌شده به‌طور خودکار دانلود می‌شود. + +## ویژگی‌ها + +- دو حالت ادغام: حالت فایل برای ترکیب سریع کل فایل‌ها و حالت صفحه برای کنترل تک‌تک صفحات +- مرتب‌سازی با کشیدن و رها کردن در هر دو حالت با انیمیشن‌های روان +- نحو بازهٔ صفحات (مثلاً `1-3, 5, 8-10`) به شما امکان می‌دهد صفحات را بدون رفتن به حالت صفحه گزینش کنید +- تصاویر بندانگشتی با بارگیری تنبل، رابط کاربری را حتی با اسناد بزرگ پاسخگو نگه می‌دارند +- بدون محدودیت در تعداد فایل‌ها یا تعداد کل صفحات +- کیفیت اصلی PDF بدون رمزگذاری مجدد حفظ می‌شود + +## گزینه‌ها + +| گزینه | توضیحات | +| --------------- | ---------------------------------------------------------------------------------------------- | +| **حالت فایل** | ادغام کل فایل‌ها با ترتیب دلخواه، با فیلتر اختیاری بازهٔ صفحات برای هر فایل | +| **حالت صفحه** | شبکه‌ای بصری از همهٔ صفحات همهٔ فایل‌ها؛ تصاویر بندانگشتی را بکشید تا ترتیب دقیق خود را بسازید | +| **ورودی صفحات** | فیلد متنی هر فایل که بازه‌هایی مانند `1-3, 5` را برای شامل کردن فقط صفحات خاص می‌پذیرد | + +## موارد استفاده + +- ترکیب PDFهای جداگانهٔ فصل‌ها در یک کتاب یا گزارش واحد +- ادغام نامهٔ همراه و رزومه در یک سند درخواست +- برداشتن صفحات خاص از چند سند منبع و گردآوری آن‌ها در یک فایل +- جمع کردن رسیدها یا فاکتورهای اسکن‌شده در یک PDF بایگانی +- ساخت جزوهٔ ارائه از اسلایدهای چند ارائهٔ مختلف + +## نکات + +- وقتی لازم است صفحات فایل‌های مختلف را در هم ببافید، به‌جای افزودن فایل‌ها پشت سر هم، از حالت صفحه استفاده کنید. +- پس از بارگذاری اولیه می‌توانید با دکمهٔ **افزودن فایل‌های بیشتر** فایل‌های دیگری اضافه کنید، بدون اینکه چیدمان فعلی از دست برود. +- شمارش بازه‌های صفحات از 1 شروع می‌شود، بنابراین `1` به صفحهٔ اول آن فایل اشاره دارد. + +## ابزارهای مرتبط + +- [تقسیم PDF](./split-pdf) +- [تکثیر و سازماندهی](./organize-pdf) +- [ادغام یک‌درمیان صفحات](./alternate-merge) +- [حذف صفحات](./delete-pages) diff --git a/docs/fa/tools/mobi-to-pdf.md b/docs/fa/tools/mobi-to-pdf.md new file mode 100644 index 00000000..115374e8 --- /dev/null +++ b/docs/fa/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI به PDF +description: فایل‌های کتاب الکترونیکی MOBI را مستقیماً در مرورگر خود به PDF تبدیل کنید. رایگان، خصوصی و بدون بارگذاری فایل. +--- + +# MOBI به PDF + +کتاب‌های الکترونیکی MOBI آمازون Kindle را به اسناد PDF تبدیل کنید. فایل‌های MOBI به دستگاه‌ها و برنامه‌های Kindle وابسته‌اند و خواندنشان در جای دیگر دشوار است. تبدیل به PDF نسخه‌ای قابل حمل به شما می‌دهد که می‌توانید روی هر دستگاهی باز یا چاپ کنید. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :--- | :------ | :--------------------------------------- | +| MOBI | `.mobi` | قالب کتاب الکترونیکی Kindle (Mobipocket) | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا یک یا چند فایل MOBI را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های ناخواسته را با نماد سطل زباله حذف کنید یا با **افزودن فایل‌های بیشتر** کتاب‌های دیگری اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور PyMuPDF ساختار MOBI را تجزیه کرده و هر صفحه را به‌صورت محتوای PDF رندر می‌کند. +4. یک فایل به‌صورت PDF دانلود می‌شود. هنگام تبدیل چند فایل، یک بایگانی ZIP با نام `mobi-converted.zip` دریافت می‌کنید. + +## گزینه‌ها + +نیازی به تنظیمات اضافه نیست. تبدیل، محتوای متنی، قالب‌بندی و تصاویر جاسازی‌شدهٔ فایل MOBI اصلی را حفظ می‌کند. + +## موارد استفاده + +- خواندن محتوای خریداری‌شده از Kindle روی کتاب‌خوانی غیر از Kindle که فقط از PDF پشتیبانی می‌کند +- چاپ فصل‌هایی از یک کتاب الکترونیکی برای مطالعه یا یادداشت‌نویسی آفلاین +- بایگانی کتابخانهٔ الکترونیکی شخصی در قالبی همگانی +- اشتراک بخش‌هایی از کتاب با کسی که برنامهٔ Kindle را نصب نکرده است + +## نکات + +- فایل‌های MOBI دارای DRM قابل تبدیل نیستند. این ابزار فقط با فایل‌های MOBI بدون DRM کار می‌کند. +- کتاب‌های بزرگ با تصاویر جاسازی‌شدهٔ زیاد ممکن است چند ثانیه بیشتر طول بکشند، چون همه چیز در مرورگر انجام می‌شود. + +## ابزارهای مرتبط + +- [EPUB به PDF](./epub-to-pdf) +- [FB2 به PDF](./fb2-to-pdf) +- [CBZ به PDF](./cbz-to-pdf) diff --git a/docs/fa/tools/n-up-pdf.md b/docs/fa/tools/n-up-pdf.md new file mode 100644 index 00000000..9f822140 --- /dev/null +++ b/docs/fa/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up کردن PDF +description: چند صفحهٔ PDF را در یک چیدمان شبکه‌ای روی یک برگه قرار دهید تا چاپ فشرده‌تری داشته باشید. +--- + +# N-Up کردن PDF + +چند صفحه را در یک چیدمان شبکه‌ای روی یک برگه قرار دهید. با جا دادن 2، 4، 6، 8، 9 یا 16 صفحه در هر برگه، تعداد صفحات چاپی کاهش می‌یابد. این ابزار مقیاس‌دهی، موقعیت‌یابی و پیکربندی اختیاری اندازهٔ صفحه را انجام می‌دهد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. تعداد صفحات در هر برگه (مقدار «N») را انتخاب کنید: 2، 4، 6، 8، 9 یا 16. +3. اندازهٔ صفحهٔ خروجی (پیش‌فرض A4) و جهت را انتخاب کنید. +4. در صورت تمایل فاصله، رنگ کادر و رنگ پس‌زمینه را تنظیم کنید. +5. روی دکمهٔ پردازش کلیک کنید. ابزار هر صفحه را مقیاس می‌دهد و آن‌ها را روی برگه‌های جدید می‌چیند. + +## ویژگی‌ها + +- چیدمان‌های شبکه‌ای: 2-up، 4-up، 6-up، 8-up، 9-up و 16-up +- اندازه و جهت صفحهٔ خروجی قابل تنظیم +- فاصلهٔ اختیاری بین صفحات چیده‌شده +- تنظیمات رنگ پس‌زمینه و کادر +- حفظ نسبت ابعاد صفحات اصلی هنگام مقیاس‌دهی + +## گزینه‌ها + +| گزینه | توضیحات | +| -------------------- | ---------------------------------------------------------------------- | +| **صفحات در هر برگه** | تعداد صفحات اصلی که روی هر صفحهٔ خروجی جا می‌گیرند (2، 4، 6، 8، 9، 16) | +| **اندازهٔ صفحه** | اندازهٔ برگهٔ خروجی (A4، Letter، Legal و غیره) | +| **جهت** | عمودی یا افقی برای برگهٔ خروجی | +| **فاصله** | فاصله بر حسب پوینت بین صفحات چیده‌شده | +| **رنگ پس‌زمینه** | رنگ پرکنندهٔ پس‌زمینهٔ برگهٔ خروجی | +| **رنگ کادر** | رنگ کادرهای اطراف هر صفحهٔ چیده‌شده | + +## موارد استفاده + +- چاپ جزوه با 4 اسلاید در هر صفحه برای صرفه‌جویی در کاغذ +- ساخت برگه‌های مطالعه با چند صفحهٔ مرجع روی یک برگه +- تهیهٔ بایگانی فشردهٔ اسناد برای پرونده‌سازی +- تولید برگه‌های مرور کلی با تصاویر کوچک از یک سند طولانی + +## نکات + +- جهت افقی اغلب برای چیدمان‌های 2-up بهتر است، در حالی که جهت عمودی معمولاً برای 4-up و بالاتر بهترین است. +- افزایش فاصله خوانایی را بهتر می‌کند اما فضای در دسترس هر صفحهٔ چیده‌شده را کم می‌کند. +- برای عملیات معکوس (تقسیم یک صفحه به چند صفحه)، [پوستری‌کردن PDF](./posterize-pdf) را ببینید. + +## ابزارهای مرتبط + +- [پوستری‌کردن PDF](./posterize-pdf) +- [دفترچهٔ PDF](./pdf-booklet) +- [ترکیب در یک صفحه](./combine-single-page) diff --git a/docs/fa/tools/ocr-pdf.md b/docs/fa/tools/ocr-pdf.md new file mode 100644 index 00000000..59ca6290 --- /dev/null +++ b/docs/fa/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR روی PDF +description: PDFهای اسکن‌شده را با Tesseract OCR، با پشتیبانی چندزبانه و فیلتر نویسه‌ها، قابل جستجو و کپی کنید. +--- + +# OCR روی PDF + +اسناد اسکن‌شده را به PDFهای قابل جستجو و کپی تبدیل کنید. این ابزار از Tesseract OCR برای تشخیص متن در تصاویر استفاده می‌کند و یک لایهٔ متنی نامرئی روی صفحات اصلی قرار می‌دهد؛ ظاهر بصری حفظ می‌شود و محتوا کاملاً قابل جستجو می‌شود. + +## نحوهٔ کار + +1. یک PDF اسکن‌شده یا مبتنی بر تصویر بارگذاری کنید. +2. یک یا چند زبان موجود در سند را از فهرست زبان‌های قابل جستجو انتخاب کنید. +3. در صورت تمایل تنظیمات پیشرفته (وضوح، دودویی‌سازی، فهرست مجاز) را تغییر دهید. +4. روی **شروع OCR** کلیک کنید و پیشرفت را در نوار پیشرفت بلادرنگ دنبال کنید. +5. پس از اتمام، متن استخراج‌شده را بررسی کنید و سپس PDF قابل جستجو یا یک فایل ساده `.txt` را دانلود کنید. + +## ویژگی‌ها + +- OCR چندزبانه با انتخابگر زبان قابل جستجو +- لایهٔ متنی نامرئی که ظاهر اصلی سند را حفظ می‌کند +- نوار پیشرفت بلادرنگ و خروجی گزارش در حین پردازش +- دانلود نتایج به‌صورت PDF قابل جستجو یا فایل متنی ساده +- کپی مستقیم متن استخراج‌شده در کلیپ‌بورد +- سه سطح وضوح برای ایجاد تعادل بین سرعت و دقت + +## گزینه‌ها + +| تنظیم | مقادیر | پیش‌فرض | هدف | +| --------------------------------- | --------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------- | +| **وضوح** | استاندارد (192 DPI)، بالا (288 DPI)، فوق‌العاده (384 DPI) | بالا | وضوح بالاتر دقت را روی متن ریز بهتر می‌کند اما زمان بیشتری می‌برد | +| **دودویی‌سازی تصویر** | روشن / خاموش | خاموش | با تبدیل به سیاه و سفید، کنتراست را برای اسکن‌های تمیز افزایش می‌دهد | +| **پیش‌تنظیم فهرست مجاز نویسه‌ها** | هیچ، حروف و اعداد، اعداد + ارز، فقط حروف، فقط اعداد، فاکتور، فرم‌ها، سفارشی | هیچ | نویسه‌های قابل تشخیص را محدود می‌کند تا دقت برای انواع خاص اسناد بهتر شود | +| **فهرست مجاز نویسه‌ها** | متن آزاد | خالی | مجموعهٔ نویسه‌های دستی وقتی پیش‌تنظیم روی سفارشی است | + +## موارد استفاده + +- قابل جستجو کردن قراردادها و فاکتورهای اسکن‌شده تا بتوانید با Ctrl+F در آن‌ها جستجو کنید +- استخراج متن از اسناد عکاسی‌شده یا سوابق کاغذی قدیمی +- پردازش رسیدها با پیش‌تنظیم فاکتور برای ثبت دقیق مبالغ دلاری و تاریخ‌ها +- ساخت PDFهای دسترس‌پذیر از اسکن‌های صرفاً تصویری برای الزامات انطباق +- استخراج گروهی محتوای متنی از کتاب‌ها یا راهنماهای اسکن‌شده + +## نکات + +- اگر سند شما محتوای چندزبانه دارد (مثلاً عنوان‌های انگلیسی با متن اصلی ژاپنی)، چند زبان انتخاب کنید. +- برای اسنادی با متن کم‌رنگ یا کم‌کنتراست از گزینهٔ دودویی‌سازی استفاده کنید؛ این گزینه می‌تواند دقت تشخیص را به‌طور چشمگیری بهتر کند. +- پیش‌تنظیم‌های فهرست مجاز فاکتور و فرم‌ها با نادیده گرفتن شکل‌های نویسهٔ نامرتبط، تشخیص‌های نادرست را در اسناد ساختاریافته به‌شدت کاهش می‌دهند. + +## ابزارهای مرتبط + +- [استخراج جدول‌های PDF](./extract-tables) +- [ادغام PDF](./merge-pdf) +- [فشرده‌سازی PDF](./compress-pdf) diff --git a/docs/fa/tools/odg-to-pdf.md b/docs/fa/tools/odg-to-pdf.md new file mode 100644 index 00000000..ef0178ff --- /dev/null +++ b/docs/fa/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG به PDF +description: فایل‌های LibreOffice Draw (ODG) را در مرورگر خود به PDF تبدیل کنید. رایگان، بدون بارگذاری و کاملاً خصوصی. +--- + +# ODG به PDF + +فایل‌های OpenDocument Graphics را به PDF تبدیل کنید. ODG قالب بومی LibreOffice Draw است و برای نمودارها، فلوچارت‌ها و تصاویر برداری استفاده می‌شود. تبدیل به PDF اشتراک، چاپ و جاسازی این طرح‌ها در اسناد دیگر را آسان می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :-------------------- | :----- | :------------------------------------------ | +| OpenDocument Graphics | `.odg` | فایل‌های LibreOffice Draw / OpenOffice Draw | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های ODG خود را بکشید و رها کنید. می‌توانید چند فایل را همزمان اضافه کنید. +2. فهرست فایل‌ها را بررسی کنید. موارد را با نماد سطل زباله تک‌تک حذف کنید یا برای افزودن طرح‌های بیشتر روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. روی **تبدیل به PDF** کلیک کنید. یک موتور مبتنی بر LibreOffice در مرورگر بارگیری می‌شود و هر فایل ODG را با حفظ گرافیک‌های برداری، شکل‌ها و متن تبدیل می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل یک بایگانی ZIP با نام `odg-to-pdf.zip` تولید می‌کنند. + +## گزینه‌ها + +تنظیمات اضافه‌ای لازم نیست. تبدیل، ابعاد اصلی صفحه، شکل‌ها، اتصال‌دهنده‌ها و کادرهای متنی منبع ODG را حفظ می‌کند. + +## موارد استفاده + +- اشتراک نمودارهای LibreOffice Draw با مشتریانی که LibreOffice را نصب نکرده‌اند +- چاپ فلوچارت‌ها و نمودارهای شبکهٔ ساخته‌شده در Draw +- گنجاندن تصاویر ODG در یک گزارش یا ارائه به‌صورت PDF جاسازی‌شده +- بایگانی نقشه‌های فنی در قالبی که تا دهه‌ها خواندنی باقی می‌ماند + +## نکات + +- عناصر برداری در خروجی PDF برداری باقی می‌مانند، بنابراین نتیجه در هر اندازهٔ چاپی به‌خوبی مقیاس می‌گیرد. +- موتور LibreOffice در نخستین استفاده کمی زمان برای راه‌اندازی نیاز دارد. تبدیل‌های بعدی در همان نشست سریع‌ترند. + +## ابزارهای مرتبط + +- [ODS به PDF](./ods-to-pdf) +- [ODP به PDF](./odp-to-pdf) +- [VSD به PDF](./vsd-to-pdf) diff --git a/docs/fa/tools/odp-to-pdf.md b/docs/fa/tools/odp-to-pdf.md new file mode 100644 index 00000000..7eb3b5c4 --- /dev/null +++ b/docs/fa/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP به PDF +description: ارائه‌های LibreOffice Impress (ODP) را در مرورگر خود به PDF تبدیل کنید. رایگان، خصوصی و بدون بارگذاری. +--- + +# ODP به PDF + +فایل‌های OpenDocument Presentation را به PDF تبدیل کنید. ODP قالب بومی LibreOffice Impress و یکی از خروجی‌های استاندارد Google Slides است. تبدیل ارائه‌ها به PDF یعنی هر کسی می‌تواند بدون نرم‌افزار ارائه آن‌ها را ببیند و اسلایدها تمیز چاپ می‌شوند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :------------------------ | :----- | :---------------------------------------- | +| OpenDocument Presentation | `.odp` | خروجی LibreOffice Impress / Google Slides | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های ODP خود را بکشید و رها کنید. می‌توانید چند ارائه را همزمان انتخاب کنید. +2. فهرست فایل‌ها را بررسی کنید. موارد را با نماد سطل زباله حذف کنید یا با **افزودن فایل‌های بیشتر** ارائه‌های دیگری اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور مبتنی بر LibreOffice هر ارائه را پردازش می‌کند و PDFی تولید می‌کند که در آن هر اسلاید یک صفحه است. +4. یک فایل به‌صورت PDF دانلود می‌شود. چند فایل در یک بایگانی ZIP با نام `odp-to-pdf.zip` تحویل داده می‌شوند. + +## گزینه‌ها + +تنظیماتی برای پیکربندی وجود ندارد. هر اسلاید در ابعاد اصلی خود رندر می‌شود و متن، تصاویر، شکل‌ها و پس‌زمینهٔ اسلایدها حفظ می‌شوند. + +## موارد استفاده + +- توزیع یک ارائه بین مخاطبان به‌صورت جزوهٔ PDF +- اشتراک خروجی‌های Google Slides با افرادی که PDF را به ODP ترجیح می‌دهند +- بایگانی سخنرانی‌های همایش و کلاس‌ها در قالبی فقط‌خواندنی +- چاپ اسلایدها برای کارگاه‌های حضوری + +## نکات + +- جلوه‌های گذار و انیمیشن‌های اسلاید فقط بصری هستند و به PDF منتقل نمی‌شوند، اما همهٔ محتوای ثابت به‌درستی رندر می‌شود. +- یادداشت‌های سخنران در خروجی PDF گنجانده نمی‌شوند. اگر به یادداشت‌ها نیاز دارید، آن‌ها را جداگانه از نرم‌افزار ارائهٔ خود خروجی بگیرید. +- مانند دیگر ابزارهای مبتنی بر LibreOffice، موتور در نخستین استفاده بارگیری می‌شود و برای آن نشست در حافظهٔ پنهان می‌ماند. + +## ابزارهای مرتبط + +- [ODG به PDF](./odg-to-pdf) +- [ODS به PDF](./ods-to-pdf) +- [PUB به PDF](./pub-to-pdf) diff --git a/docs/fa/tools/ods-to-pdf.md b/docs/fa/tools/ods-to-pdf.md new file mode 100644 index 00000000..c0dd59ea --- /dev/null +++ b/docs/fa/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS به PDF +description: صفحه‌گسترده‌های LibreOffice Calc (ODS) را در مرورگر خود به PDF تبدیل کنید. رایگان، خصوصی و بدون ثبت‌نام. +--- + +# ODS به PDF + +فایل‌های صفحه‌گستردهٔ OpenDocument را به PDF تبدیل کنید. ODS قالب اصلی LibreOffice Calc و یکی از خروجی‌های رایج Google Sheets است. این ابزار داده‌ها، قالب‌بندی و نمودارهای صفحه‌گستردهٔ شما را به یک PDF صفحه‌بندی‌شده تبدیل می‌کند که می‌توانید آن را چاپ یا به اشتراک بگذارید. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :------------------------ | :----- | :------------------------------------- | +| صفحه‌گستردهٔ OpenDocument | `.ods` | خروجی LibreOffice Calc / Google Sheets | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های ODS خود را بکشید و رها کنید. چند فایل پشتیبانی می‌شود. +2. فهرست فایل‌ها را بررسی کنید. با نماد سطل زباله فایل‌ها را حذف کنید یا برای افزودن به دسته روی **افزودن فایل بیشتر** کلیک کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور مبتنی بر LibreOffice در مرورگر بارگذاری می‌شود و هر صفحه‌گسترده را به صفحات PDF تبدیل می‌کند. +4. یک صفحه‌گستردهٔ تکی به‌صورت PDF دانلود می‌شود. چند فایل در `ods-to-pdf.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +نیازی به پیکربندی نیست. مبدل چیدمان چاپ موجود، قالب‌بندی سلول‌ها و عرض ستون‌های صفحه‌گسترده را روی خروجی PDF اعمال می‌کند. + +## موارد استفاده + +- اشتراک‌گذاری بودجه یا گزارش LibreOffice Calc با کسی که فقط PDF می‌پذیرد +- چاپ خروجی Google Sheets که به‌صورت ODS دانلود شده است +- بایگانی سوابق مالی در قالبی غیرقابل ویرایش +- ارسال فرم‌ها یا جدول‌های ساعت کاری مبتنی بر ODS به‌صورت اسناد با چیدمان ثابت + +## نکته‌ها + +- اگر صفحه‌گستردهٔ شما چند برگه دارد، همهٔ برگه‌ها در خروجی PDF گنجانده می‌شوند. +- صفحه‌گسترده‌های بسیار عریض ممکن است به‌صورت افقی در چند صفحهٔ PDF پخش شوند. اگر چیدمان مهم است، پیش از تبدیل عرض ستون‌ها را در فایل مبدأ تنظیم کنید. +- موتور LibreOffice در اولین استفاده راه‌اندازی می‌شود. تبدیل‌های بعدی در همان نشست سریع‌تر هستند. + +## ابزارهای مرتبط + +- [ODG به PDF](./odg-to-pdf) +- [ODP به PDF](./odp-to-pdf) +- [XML به PDF](./xml-to-pdf) diff --git a/docs/fa/tools/odt-to-pdf.md b/docs/fa/tools/odt-to-pdf.md new file mode 100644 index 00000000..4c4c2929 --- /dev/null +++ b/docs/fa/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT به PDF +description: فایل‌های متنی OpenDocument (ODT) را با موتوری مبتنی بر LibreOffice در مرورگر خود به PDF تبدیل کنید. +--- + +# ODT به PDF + +فایل‌های متنی OpenDocument را به PDF تبدیل کنید. ODT قالب اصلی LibreOffice Writer، Apache OpenOffice و دیگر واژه‌پردازهای متن‌باز است. این ابزار از یک موتور LibreOffice در مرورگر استفاده می‌کند تا تبدیل‌هایی دقیق با حفظ قالب‌بندی، جدول‌ها، تصاویر و سبک‌ها تولید کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--------------- | :------ | +| متن OpenDocument | `.odt` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا یک یا چند فایل ODT را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های بیشتری اضافه کنید یا فایل‌های ناخواسته را حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور LibreOffice راه‌اندازی می‌شود (یک نشانگر پیشرفت وضعیت بارگذاری را نشان می‌دهد) و سپس هر فایل تبدیل می‌شود. +4. یک فایل تکی مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در `odt-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +این ابزار پیکربندی اضافه‌ای ندارد. تبدیل، قالب‌بندی سند اصلی را تا حد امکان حفظ می‌کند. + +## خروجی + +| تعداد ورودی | خروجی | +| :-------------- | :--------------------------------------------------------- | +| ۱ فایل | دانلود یک PDF (مثلاً `document.pdf`) | +| ۲ فایل یا بیشتر | بایگانی ZIP (`odt-converted.zip`) شامل یک PDF برای هر فایل | + +## موارد استفاده + +- تبدیل اسناد LibreOffice Writer به PDF برای اشتراک با کاربران Microsoft Office +- تولید PDFهای آمادهٔ چاپ از مقالات دانشگاهی نوشته‌شده در قالب OpenDocument +- تبدیل دسته‌ای پوشه‌ای از قالب‌های ODT به PDF برای توزیع +- تولید PDF از فایل‌های ODT ساخته‌شده توسط سامانه‌های خودکار تولید سند + +## نکته‌ها + +- موتور LibreOffice در اولین استفاده بارگذاری و برای تبدیل‌های بعدی ذخیره می‌شود. بارگذاری اولیه چند ثانیه طول می‌کشد؛ پس از آن تبدیل‌ها سریع هستند. +- اسناد پیچیده با اشیای OLE جاسازی‌شده یا فونت‌های غیرمعمول ممکن است کمی متفاوت از LibreOffice رومیزی نمایش داده شوند. پیش از تبدیل دسته‌ای با یک نمونه آزمایش کنید. +- برای اسناد Word (`.doc`، `.docx`) به‌جای آن از ابزار [Word به PDF](./word-to-pdf) استفاده کنید که آن هم از موتور LibreOffice استفاده می‌کند اما قالب‌های Microsoft را مستقیماً می‌پذیرد. + +## ابزارهای مرتبط + +- [Word به PDF](./word-to-pdf) +- [RTF به PDF](./rtf-to-pdf) +- [متن به PDF](./txt-to-pdf) diff --git a/docs/fa/tools/organize-pdf.md b/docs/fa/tools/organize-pdf.md new file mode 100644 index 00000000..38bd25f2 --- /dev/null +++ b/docs/fa/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: تکثیر و سازماندهی +description: صفحات PDF را با تصاویر بندانگشتی کشیدنی و واردکردن ترتیب دلخواه صفحات، مرتب، تکثیر و حذف کنید. +--- + +# تکثیر و سازماندهی + +صفحات یک PDF را با یک رابط بصری کشیدن و رها کردن جابه‌جا، تکثیر و حذف کنید. هر صفحه به‌صورت یک تصویر بندانگشتی نمایش داده می‌شود که می‌توانید پیش از ذخیرهٔ نتیجه در فایلی جدید، آن را جابه‌جا، کپی یا حذف کنید. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. ابزار شبکه‌ای از تصاویر بندانگشتی همهٔ صفحات را نمایش می‌دهد. +3. برای تغییر ترتیب، تصاویر بندانگشتی را بکشید؛ برای کپی یک صفحه روی دکمهٔ سبز تکثیر و برای حذف آن روی دکمهٔ قرمز حذف کلیک کنید. +4. همچنین می‌توانید ترتیب دلخواه صفحات را در فیلد متنی وارد کنید (مثلاً `3, 1, 2, 4`) و روی **اعمال ترتیب** کلیک کنید تا همهٔ صفحات یک‌جا مرتب شوند. +5. روی دکمهٔ پردازش کلیک کنید تا PDF سازماندهی‌شده ساخته و دانلود شود. + +## ویژگی‌ها + +- تغییر ترتیب صفحات با کشیدن و رها کردن همراه با جلوه‌های پویا +- دکمه‌های تکثیر و حذف برای هر صفحه +- واردکردن ترتیب دلخواه صفحات برای چینش دقیق +- برچسب‌های شمارهٔ صفحه که پس از هر تغییر خودکار به‌روز می‌شوند +- جلوگیری از حذف آخرین صفحهٔ باقی‌مانده + +## موارد استفاده + +- انتقال یک صفحهٔ جابه‌جاشده به جای درست در یک گزارش +- تکثیر یک صفحهٔ فرم برای داشتن چند نسخهٔ خالی در یک فایل +- حذف صفحات پیش‌نویس یا جانگهدار پیش از توزیع سند +- وارونه کردن یا جابه‌جا کردن ترتیب صفحات برای آماده‌سازی چاپ +- ساخت ترتیب دلخواه صفحات بدون ادغام دوبارهٔ فایل‌های جداگانه + +## نکته‌ها + +- فیلد ترتیب دلخواه، شماره‌های صفحات اصلی جداشده با ویرگول را می‌پذیرد. باید هر صفحه دقیقاً یک بار آمده باشد، بدون جاافتادگی یا تکرار. +- پس از تکثیر یک صفحه، هر دو نسخه به همان شاخص صفحهٔ اصلی ارجاع می‌دهند. جابه‌جایی هر نسخه مستقل از دیگری انجام می‌شود. +- برای عملیات گروهی روی چند فایل یا گردش‌کارهای پیشرفته‌تر، از [ابزار چندکارهٔ PDF](./pdf-multi-tool) استفاده کنید. + +## ابزارهای مرتبط + +- [ادغام PDF](./merge-pdf) +- [حذف صفحات](./delete-pages) +- [ابزار چندکارهٔ PDF](./pdf-multi-tool) +- [وارونه‌سازی ترتیب صفحات](./reverse-pages) diff --git a/docs/fa/tools/page-dimensions.md b/docs/fa/tools/page-dimensions.md new file mode 100644 index 00000000..25736061 --- /dev/null +++ b/docs/fa/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: ابعاد صفحه +description: اندازه، جهت، نسبت ابعاد و چرخش صفحات PDF را تحلیل کنید. اسناد با اندازه‌های مختلط را شناسایی و داده‌ها را به CSV صادر کنید. +--- + +# ابعاد صفحه + +ابزاری تشخیصی که همهٔ صفحات PDF شما را می‌خواند و ابعاد دقیق، جهت، نام اندازهٔ استاندارد، نسبت ابعاد، مساحت و چرخش هر صفحه را گزارش می‌دهد. برای یافتن صفحات با اندازه‌های مختلط پیش از چاپ یا مستندسازی ویژگی‌های PDF دریافتی مفید است. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. تحلیل خودکار آغاز می‌شود و نیازی به فشردن دکمه نیست. +2. یک پنل خلاصه، تعداد کل صفحات، تعداد اندازه‌های منحصربه‌فرد و مختلط بودن یا نبودن اندازه‌ها را نشان می‌دهد. +3. جدول کامل نتایج را با جزئیات هر صفحه مرور کنید. +4. واحد نمایش را بین Points، Inches، Millimeters یا Pixels تغییر دهید. +5. برای ذخیرهٔ داده‌ها روی **خروجی CSV** کلیک کنید. + +## فیلدهای گزارش‌شده + +| ستون | توضیحات | +| ----------------- | ----------------------------------------- | +| شمارهٔ صفحه | شمارهٔ ترتیبی صفحه | +| ابعاد | عرض x ارتفاع در واحد انتخاب‌شده | +| اندازهٔ استاندارد | نام منطبق (A4، Letter و غیره) یا "سفارشی" | +| جهت | عمودی یا افقی | +| نسبت ابعاد | نسبت عرض به ارتفاع به‌صورت عدد اعشاری | +| مساحت | مساحت صفحه در مربع واحد انتخاب‌شده | +| چرخش | چرخش صفحه بر حسب درجه | + +## ویژگی‌ها + +- تشخیص خودکار اندازه‌های استاندارد کاغذ (A3، A4، A5، Letter، Legal، Tabloid و موارد دیگر) +- هشدار سند با اندازه‌های مختلط همراه با تفکیک اندازه‌های موجود و تعداد صفحات هر کدام +- تبدیل واحد بین پوینت، اینچ، میلی‌متر و پیکسل (با ۹۶ PPI) +- صدور به CSV برای استفاده در صفحه‌گسترده‌ها یا سامانه‌های مستندسازی + +## موارد استفاده + +- اطمینان از A4 بودن همهٔ صفحات پیش از ارسال سند به چاپخانه +- یافتن علت چاپ یک PDF ادغام‌شده با حاشیه‌های غیرمنتظره در برخی صفحات +- مستندسازی چیدمان صفحات یک بایگانی بزرگ PDF برای سوابق فراداده +- شناسایی صفحات چرخیده‌ای که نیاز به اصلاح دارند + +## نکته‌ها + +- اگر خلاصه "اندازه‌های ناهمسان" را نشان داد، پیش از چاپ با ابزار اصلاح اندازهٔ صفحه اندازه‌ها را یکسان کنید. +- فیلد چرخش به شناسایی صفحاتی کمک می‌کند که درست نمایش داده می‌شوند اما ویژگی چرخش غیرصفر دارند و ممکن است در برخی گردش‌کارها مشکل ایجاد کنند. + +## ابزارهای مرتبط + +- [اصلاح اندازهٔ صفحه](./fix-page-size): یکسان‌سازی صفحات پس از شناسایی اندازه‌های مختلط +- [فشرده‌سازی PDF](./compress-pdf): بهینه‌سازی PDF پس از رفع مشکلات صفحه +- [چرخاندن PDF](./rotate-pdf): اصلاح صفحات چرخیده diff --git a/docs/fa/tools/page-numbers.md b/docs/fa/tools/page-numbers.md new file mode 100644 index 00000000..3b03a484 --- /dev/null +++ b/docs/fa/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: شماره‌گذاری صفحات +description: شماره‌های صفحهٔ قابل‌تنظیم را با فونت، اندازه و رنگ دلخواه در هر موقعیتی از صفحات PDF اضافه کنید. +--- + +# شماره‌گذاری صفحات + +به همهٔ صفحات PDF خود شمارهٔ صفحهٔ قابل‌مشاهده اضافه کنید. شما موقعیت، قالب، اندازهٔ فونت و رنگ را انتخاب می‌کنید و ابزار بقیهٔ کار را انجام می‌دهد. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. تنظیمات شمارهٔ صفحه را در پنل گزینه‌هایی که نمایش داده می‌شود پیکربندی کنید. +3. برای پردازش روی **افزودن شمارهٔ صفحه** کلیک کنید. +4. PDF شماره‌گذاری‌شده خودکار دانلود می‌شود. + +## گزینه‌ها + +- **موقعیت**: محل نمایش شماره‌ها را انتخاب کنید: پایین وسط، پایین چپ، پایین راست، بالا وسط، بالا چپ یا بالا راست. +- **قالب**: بین شماره‌گذاری ساده (1، 2، 3...) یا قالب "صفحهٔ X از Y" (1 / 5، 2 / 5...) انتخاب کنید. +- **اندازهٔ فونت**: اندازهٔ متن شمارهٔ صفحه را تنظیم کنید. پیش‌فرض 12 است. +- **رنگ**: با انتخابگر رنگ، هر رنگی را برای متن شمارهٔ صفحه برگزینید. + +## ویژگی‌ها + +- شش گزینهٔ موقعیت که همهٔ گوشه‌ها و موقعیت‌های وسط را پوشش می‌دهد +- دو قالب شماره‌گذاری: ترتیبی ساده یا "صفحهٔ X از Y" +- اندازهٔ فونت قابل‌تنظیم از 6 تا 72 پوینت +- انتخابگر کامل رنگ برای رنگ متن +- مدیریت خودکار حاشیه که شماره‌ها را صرف‌نظر از اندازهٔ صفحه در نواحی امن نگه می‌دارد + +## موارد استفاده + +- آماده‌سازی اسناد برای چاپ که به ارجاع صفحهٔ قابل‌مشاهده نیاز دارند +- افزودن شمارهٔ صفحه به PDF ادغام‌شده از چند فایل مبدأ +- شماره‌گذاری جزوه‌های ارائه پیش از توزیع +- افزودن شماره‌گذاری ترتیبی به اسناد حقوقی یا قراردادها + +## نکته‌ها + +- قالب "صفحهٔ X از Y" برای اسنادی مانند پیشنهادها یا گزارش‌ها که خواننده باید طول کل را بداند مفید است. +- اگر برای بخش‌های مختلف به سبک‌های شماره‌گذاری متفاوت نیاز دارید (مانند اعداد رومی برای بخش‌های آغازین)، به‌جای آن از ابزار [افزودن برچسب صفحه](./add-page-labels) استفاده کنید. + +## ابزارهای مرتبط + +- [افزودن برچسب صفحه](./add-page-labels) +- [شماره‌گذاری Bates](./bates-numbering) +- [سرصفحه و پاصفحه](./header-footer) diff --git a/docs/fa/tools/pdf-booklet.md b/docs/fa/tools/pdf-booklet.md new file mode 100644 index 00000000..7ce3de31 --- /dev/null +++ b/docs/fa/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: دفترچهٔ PDF +description: صفحات PDF را به ترتیب دفترچه‌ای (دوخت منگنه‌ای) بچینید تا تا شده و به‌صورت دفترچهٔ فیزیکی منگنه شوند. +--- + +# دفترچهٔ PDF + +صفحات یک PDF را به ترتیب صفحه‌آرایی دفترچه‌ای بچینید. وقتی دورو چاپ و از وسط تا شود، صفحات به ترتیب درست خواندن قرار می‌گیرند. این همان چیدمانی است که برای دفترچه‌ها و زین‌های منگنه‌شده از وسط استفاده می‌شود. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. تنظیمات دفترچه را پیکربندی کنید: اندازه و جهت صفحهٔ خروجی. +3. روی **ایجاد پیش‌نمایش** کلیک کنید تا ببینید صفحات روی هر برگه چگونه چیده می‌شوند. +4. پیش‌نمایش را بررسی کنید؛ هر برگهٔ فیزیکی را با صفحات روی و پشت آن نشان می‌دهد. +5. برای ذخیرهٔ PDF دفترچه‌ای روی **دانلود** کلیک کنید. + +## ویژگی‌ها + +- ترتیب‌دهی خودکار صفحات برای صحافی منگنه‌ای از وسط +- اندازهٔ صفحهٔ خروجی قابل‌تنظیم +- پیش‌نمایش بصری چیدمان دفترچه پیش از دانلود +- مدیریت تعداد صفحات فرد با درج صفحات خالی در صورت نیاز +- مقیاس‌دهی صفحات مبدأ برای جا شدن در اندازهٔ برگهٔ دفترچه + +## موارد استفاده + +- ساخت دفترچه‌ها یا زین‌های قابل‌چاپ از یک PDF معمولی +- آماده‌سازی برنامه‌های همایش یا راهنماهای رویداد برای چاپ داخلی +- ساخت کارت‌تبریک‌های تاشو یا کاتالوگ‌های کوچک +- تولید جزوه‌ها یا مجموعه‌های شعر برای صحافی دستی + +## نکته‌ها + +- برای یک دفترچهٔ تمیز، بهتر است تعداد صفحات PDF مبدأ مضربی از 4 باشد. در غیر این صورت، صفحات خالی خودکار برای پر کردن آخرین برگه اضافه می‌شوند. +- خروجی را با تنظیم "برگرداندن از لبهٔ کوتاه" چاپگر خود دورو چاپ کنید، سپس همهٔ برگه‌ها را با هم تا کنید و از عطف منگنه کنید. +- برای قرار دادن ساده‌ی چند صفحه روی یک برگه بدون ترتیب دفترچه‌ای، به‌جای آن از [N-Up کردن PDF](./n-up-pdf) استفاده کنید. + +## ابزارهای مرتبط + +- [N-Up کردن PDF](./n-up-pdf) +- [چرخاندن PDF](./rotate-pdf) +- [افزودن صفحهٔ خالی](./add-blank-page) diff --git a/docs/fa/tools/pdf-layers.md b/docs/fa/tools/pdf-layers.md new file mode 100644 index 00000000..5817425e --- /dev/null +++ b/docs/fa/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: لایه‌های OCG در PDF +description: لایه‌های Optional Content Group (OCG) را در یک سند PDF مشاهده، روشن و خاموش، اضافه و حذف کنید. +--- + +# لایه‌های OCG در PDF + +گروه‌های محتوای اختیاری (OCG) را که معمولاً "لایه" نامیده می‌شوند در یک PDF مدیریت کنید. می‌توانید نمایش لایه‌ها را روشن و خاموش کنید، لایه‌های جدید (از جمله لایه‌های فرزند تودرتو) اضافه کنید، لایه‌ها را حذف کنید و PDF تغییریافته را ذخیره کنید. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. روی دکمهٔ پردازش کلیک کنید تا سند با موتور PyMuPDF بارگذاری شود. +3. ابزار همهٔ لایه‌های موجود را با وضعیت نمایش، وضعیت قفل و سلسله‌مراتب تودرتوی آن‌ها نشان می‌دهد. +4. برای نمایش یا پنهان کردن لایه‌ها، کادرهای انتخاب را تغییر دهید. لایه‌های قفل‌شده قابل تغییر نیستند. +5. با تایپ نام و کلیک روی دکمهٔ افزودن، لایه‌های سطح بالای جدید اضافه کنید، یا زیر یک والد موجود لایهٔ فرزند بسازید. +6. لایه‌هایی را که دیگر لازم ندارید حذف کنید. +7. روی **دانلود PDF تغییریافته** کلیک کنید تا PDF تغییریافته با اعمال تغییرات لایه‌ها دانلود شود. + +## ویژگی‌ها + +- نمایش سلسله‌مراتب لایه‌ها با تورفتگی مناسب برای لایه‌های تودرتو +- روشن یا خاموش کردن نمایش لایه +- نشانگر لایهٔ قفل‌شده برای جلوگیری از تغییرات ناخواسته +- افزودن لایه‌های سطح بالا یا فرزند با نام دلخواه +- حذف تک‌تک لایه‌ها +- ذخیرهٔ همهٔ تغییرات در یک فایل PDF جدید + +## موارد استفاده + +- روشن و خاموش کردن لایه‌های نشانه‌گذاری در نقشه‌های معماری یا مهندسی +- افزودن لایه‌های حاشیه‌نویسی جدید به یک سند طراحی چندلایه +- حذف لایه‌های منسوخ از یک الگو پیش از توزیع +- بررسی لایه‌های موجود در یک PDF پیچیدهٔ دریافتی از شخص ثالث + +## نکته‌ها + +- اگر PDF لایه‌ای نداشته باشد، ابزار حالت خالی را با پیشنهاد افزودن لایه نشان می‌دهد. همهٔ PDFها از لایه‌های OCG استفاده نمی‌کنند؛ این لایه‌ها بیشتر در خروجی‌های CAD و فایل‌های طراحی رایج‌اند. +- لایه‌های فرزند به‌صورت بصری زیر والد خود با تورفتگی نمایش داده می‌شوند. می‌توانید لایه‌ها را تا هر عمقی تودرتو کنید. +- لایه‌های قفل‌شده با نماد قفل نمایش داده می‌شوند و کادر انتخاب آن‌ها غیرفعال است. این قفل‌ها توسط سازندهٔ PDF تنظیم شده‌اند. + +## ابزارهای مرتبط + +- [مشاهدهٔ فراداده](./view-metadata) +- [ویرایش فراداده](./edit-metadata) +- [تکثیر و سازماندهی](./organize-pdf) diff --git a/docs/fa/tools/pdf-multi-tool.md b/docs/fa/tools/pdf-multi-tool.md new file mode 100644 index 00000000..8902d07d --- /dev/null +++ b/docs/fa/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: ابزار چندکارهٔ PDF +description: مدیر همه‌کارهٔ صفحات برای ادغام، تقسیم، چرخاندن، تکثیر، حذف و تغییر ترتیب صفحات PDF. +--- + +# ابزار چندکارهٔ PDF + +فضای کاری یکپارچه برای همهٔ عملیات سطح صفحه در PDF. یک یا چند PDF بارگذاری کنید و با همهٔ صفحات آن‌ها در یک شبکهٔ بصری کار کنید. صفحات را بچرخانید، جابه‌جا، تکثیر و حذف کنید، PDF جدید درج کنید، صفحهٔ خالی اضافه کنید و نتیجه را تقسیم کنید، همه بدون خروج از ابزار. + +## نحوهٔ کار + +1. روی **بارگذاری PDFها** کلیک کنید یا فایل‌ها را روی ناحیهٔ بارگذاری بکشید. چند فایل پشتیبانی می‌شود. +2. همهٔ صفحات همهٔ فایل‌های بارگذاری‌شده در یک شبکهٔ پیمایش‌پذیر با تصاویر بندانگشتی نمایش داده می‌شوند. +3. از نوار ابزار یا دکمه‌های عملیات هر صفحه برای ویرایش صفحات استفاده کنید. +4. صفحات را با کادر انتخاب روی هر کارت برگزینید و سپس عملیات گروهی را اعمال کنید. +5. با نماد قیچی نقاط تقسیم را علامت بزنید تا خروجی به فایل‌های جداگانه تقسیم شود. +6. برای دانلود نتیجهٔ نهایی روی **برون‌ریزی PDF** کلیک کنید. اگر نشانگر تقسیم وجود داشته باشد، خروجی یک ZIP از چند PDF است. + +## ویژگی‌ها + +- **ادغام**: چند PDF بارگذاری کنید تا خودکار در یک فضای کاری ترکیب شوند +- **تغییر ترتیب**: کارت‌های صفحه را بکشید و رها کنید تا ترتیب تغییر کند +- **چرخش**: چرخش تکی یا گروهی با گام‌های 90 درجه (چپ یا راست) +- **تکثیر**: کپی هر صفحه با یک کلیک +- **حذف**: حذف تک‌صفحه‌ها یا حذف گروهی صفحات انتخاب‌شده +- **درج PDF**: افزودن یک PDF جدید پس از هر صفحهٔ دلخواه +- **افزودن صفحهٔ خالی**: افزودن یک صفحهٔ خالی A4 به انتها +- **تقسیم**: قرار دادن نشانگرهای تقسیم بین صفحات و صدور به‌صورت ZIP از PDFهای جداگانه +- **انتخاب همه / لغو انتخاب همه**: انتخاب سریع برای عملیات گروهی +- **واگرد / ازنو**: تاریخچهٔ کامل واگرد و ازنو برای همهٔ عملیات +- **دانلود انتخاب‌شده‌ها**: صدور فقط صفحات انتخاب‌شده به‌صورت یک PDF مستقل +- تعمیر خودکار PDFهای آسیب‌دیده پیش از بارگذاری + +## موارد استفاده + +- ساخت یک سند دلخواه از صفحات چند PDF مبدأ +- مرتب‌سازی یک سند اسکن‌شده با حذف صفحات خالی، چرخاندن اسکن‌های کج و تغییر ترتیب بخش‌ها +- تقسیم یک PDF بزرگ در مرز فصل‌ها با نشانگرهای بصری تقسیم +- ویرایش سریع در سطح صفحه بدون نیاز به ویرایشگر کامل PDF + +## نکته‌ها + +- سامانهٔ واگرد و ازنو همهٔ عملیات را ثبت می‌کند. آزادانه از آن استفاده کنید؛ کارتان به‌اشتباه از بین نمی‌رود. +- نشانگرهای تقسیم به‌صورت خطوط آبی خط‌چین بین صفحات نمایش داده می‌شوند. آن‌ها را جایی که می‌خواهید سند تقسیم شود قرار دهید و سپس برای دریافت ZIP صادر کنید. +- برای کارهای سادهٔ ادغام یا تقسیم، ابزارهای اختصاصی [ادغام PDF](./merge-pdf) یا [تقسیم PDF](./split-pdf) ممکن است سریع‌تر باشند. ابزار چندکاره زمانی می‌درخشد که در یک نشست به چند عملیات نیاز دارید. + +## ابزارهای مرتبط + +- [ادغام PDF](./merge-pdf) +- [تقسیم PDF](./split-pdf) +- [تکثیر و سازماندهی](./organize-pdf) +- [چرخاندن PDF](./rotate-pdf) diff --git a/docs/fa/tools/pdf-to-bmp.md b/docs/fa/tools/pdf-to-bmp.md new file mode 100644 index 00000000..187deb7f --- /dev/null +++ b/docs/fa/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF به BMP +description: صفحات PDF را به تصاویر BMP بدون فشرده‌سازی تبدیل کنید. مناسب برای سامانه‌های قدیمی و گردش‌کارهای چاپی که ورودی بیت‌مپ می‌خواهند. +--- + +# PDF به BMP + +هر صفحهٔ PDF را به یک تصویر BMP (Bitmap) تبدیل می‌کند. BMP قالبی بدون فشرده‌سازی است، بنابراین خروجی بدون هیچ افت کیفیتی دقیق تا سطح پیکسل است، اما فایل‌ها حجیم هستند. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. برای پردازش فایل روی **تبدیل** کلیک کنید. +3. یک فایل `.bmp` یا یک بایگانی ZIP خودکار دانلود می‌شود. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. صفحات با مقیاس ثابت 2x رندر می‌شوند و تصاویری تقریباً دو برابر ابعاد اصلی صفحهٔ PDF تولید می‌کنند. + +## قالب خروجی + +- **تک‌صفحه**: `filename.bmp` +- **چندصفحه**: `filename_bmps.zip` شامل `page_1.bmp`، `page_2.bmp` و غیره. + +## موارد استفاده + +- ارسال صفحات PDF به سامانه‌ها یا سخت‌افزارهای قدیمی که فقط ورودی BMP می‌پذیرند. +- آماده‌سازی تصاویر بدون فشرده‌سازی برای گردش‌کارهای چاپی خاص. +- استفاده از خروجی بیت‌مپ به‌عنوان ورودی ابزارهای پردازش تصویر که دادهٔ خام پیکسل می‌خواهند. + +## نکته‌ها + +- فایل‌های BMP بسیار حجیم‌اند، چون دادهٔ خام پیکسل را بدون فشرده‌سازی ذخیره می‌کنند. برای بیشتر کاربردها، [PDF به PNG](./pdf-to-png) کیفیت بدون افت را با فایل‌های بسیار کوچک‌تر ارائه می‌دهد. +- اگر سامانهٔ مقصد شما PNG یا TIFF می‌پذیرد، برای صرفه‌جویی در فضای دیسک آن قالب‌ها را ترجیح دهید. + +## ابزارهای مرتبط + +- [PDF به PNG](./pdf-to-png) +- [PDF به TIFF](./pdf-to-tiff) +- [PDF به JPG](./pdf-to-jpg) diff --git a/docs/fa/tools/pdf-to-cbz.md b/docs/fa/tools/pdf-to-cbz.md new file mode 100644 index 00000000..3852c28a --- /dev/null +++ b/docs/fa/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF به CBZ +description: یک PDF را به فایل CBZ (Comic Book Archive) برای کمیک‌خوان‌هایی مانند Komga، Kavita، CDisplayEx و Calibre تبدیل کنید. +--- + +# PDF به CBZ + +یک PDF را به فایل CBZ (Comic Book ZIP) تبدیل می‌کند؛ قالب استاندارد کمیک‌ها و مانگاهای دیجیتال. هر صفحهٔ PDF به یک تصویر درون بایگانی تبدیل می‌شود. ابزار برای حداکثر سازگاری، فراداده را در سه قالب تولید می‌کند: ComicInfo.xml، metadata.opf و ComicBookInfo JSON. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. قالب تصویر، کیفیت، مقیاس و فرادادهٔ اختیاری را انتخاب کنید. +3. برای ساخت فایل CBZ روی **تبدیل** کلیک کنید. +4. فایل `.cbz` خودکار دانلود می‌شود. + +## گزینه‌ها + +| گزینه | مقادیر | پیش‌فرض | توضیحات | +| -------------- | --------------- | ------- | ------------------------------------------------------------------------------------------ | +| قالب تصویر | JPEG، PNG، WebP | JPEG | JPEG برای کمیک‌های رنگی، PNG برای مانگای سیاه‌وسفید بدون افت، WebP برای بهترین فشرده‌سازی. | +| کیفیت | 50–100% | 85% | فشرده‌سازی JPEG/WebP را کنترل می‌کند. برای PNG پنهان است (همیشه بدون افت). | +| مقیاس | 1.0x–4.0x | 2.0x | مقیاس بالاتر تصاویر واضح‌تری برای نمایشگرهای پرتفکیک تولید می‌کند. | +| خاکستری | روشن/خاموش | خاموش | صفحات را خاکستری می‌کند. حجم فایل را برای محتوای سیاه‌وسفید کاهش می‌دهد. | +| حالت مانگا | روشن/خاموش | خاموش | جهت خواندن راست‌به‌چپ را در فراداده تنظیم می‌کند. | +| افزودن فراداده | روشن/خاموش | روشن | ComicInfo.xml، metadata.opf و ComicBookInfo JSON را جاسازی می‌کند. | + +## فیلدهای فراداده + +وقتی فراداده فعال است، می‌توانید این موارد را پر کنید: + +- **عنوان**: خودکار از نام فایل PDF تشخیص داده می‌شود. +- **مجموعه**: نام مجموعه (مثلاً "Naruto"). +- **شماره (#)**: شمارهٔ قسمت در مجموعه. +- **جلد (Vol.)**: شمارهٔ جلد. +- **نویسنده(ها)**: نام نویسنده یا خالق. +- **ناشر**: شرکت انتشاراتی. +- **برچسب‌ها / ژانر**: برچسب‌های جداشده با ویرگول (مثلاً "Action, Adventure"). +- **سال انتشار**: سال انتشار (1900–2100). +- **امتیاز**: امتیاز جامعه از 0 تا 5. + +## سازگاری فراداده + +ابزار فراداده را در سه قالب می‌نویسد تا هر کمیک‌خوانی بتواند آن را پیدا کند: + +| قالب | محل | پشتیبانی‌شده در | +| ------------------ | -------------- | ------------------------------------------- | +| ComicInfo.xml | فایلی درون ZIP | Komga، Kavita، CDisplayEx، Mylar، ComicRack | +| metadata.opf | فایلی درون ZIP | Calibre | +| ComicBookInfo JSON | فیلد توضیح ZIP | Calibre (جایگزین) | + +## قالب خروجی + +- `filename.cbz`: یک بایگانی ZIP شامل تصاویر شماره‌دار صفحات و فایل‌های فراداده. + +نام تصاویر صفحات با اعداد دارای صفر پیشرو است (`01.jpg`، `02.jpg` و غیره) تا کمیک‌خوان‌ها آن‌ها را به ترتیب درست نمایش دهند. + +## موارد استفاده + +- تبدیل PDFهای مانگا یا کمیک برای استفاده در کمیک‌خوان‌ها. +- ساخت کتابخانهٔ کمیک دیجیتال در Komga، Kavita یا Calibre. +- تبدیل کمیک‌های اسکن‌شده به قالبی مناسب کمیک‌خوان‌ها. +- اشتراک‌گذاری کمیک‌ها در قالبی که جهت خواندن و فراداده را حفظ می‌کند. + +## نکته‌ها + +- برای کمیک‌های رنگی از **JPEG** و برای مانگای سیاه‌وسفید از **PNG** استفاده کنید؛ PNG محتوای سیاه‌وسفید را بسیار کارآمد فشرده می‌کند. +- برای مانگا **تبدیل به خاکستری** را فعال کنید تا حجم فایل به‌طور چشمگیری کاهش یابد. +- فیلدهای **مجموعه** و **شماره (#)** را پر کنید تا مدیران کتابخانه (Komga، Calibre) مجموعهٔ شما را خودکار سازماندهی کنند. +- **WebP** بهترین فشرده‌سازی را ارائه می‌دهد، اما ممکن است کمیک‌خوان‌های قدیمی‌تر از آن پشتیبانی نکنند. + +## ابزارهای مرتبط + +- [PDF به JPG](./pdf-to-jpg) +- [PDF به PNG](./pdf-to-png) +- [PDF به TIFF](./pdf-to-tiff) +- [استخراج تصاویر](./extract-images) diff --git a/docs/fa/tools/pdf-to-csv.md b/docs/fa/tools/pdf-to-csv.md new file mode 100644 index 00000000..6c3367c5 --- /dev/null +++ b/docs/fa/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF به CSV +description: جدول‌ها را از اسناد PDF استخراج و به‌صورت یک فایل CSV صادر کنید. از PDFهای چندصفحه‌ای با تشخیص خودکار جدول پشتیبانی می‌کند. +--- + +# PDF به CSV + +جدول‌ها را از یک PDF استخراج و به‌صورت فایل CSV صادر می‌کند. ابزار با موتور تشخیص جدول PyMuPDF همهٔ صفحات را برای دادهٔ جدولی بررسی می‌کند و سپس همهٔ ردیف‌های یافت‌شده را در یک خروجی جداشده با ویرگول می‌نویسد. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. برای شروع استخراج جدول روی **تبدیل به CSV** کلیک کنید. +3. ابزار هر صفحه را بررسی و جدول‌ها را خودکار شناسایی می‌کند. +4. یک فایل `.csv` با همهٔ داده‌های جدولی استخراج‌شده دانلود می‌شود. + +جدول‌های صفحات مختلف در خروجی با ردیف‌های خالی از هم جدا می‌شوند. سلول‌هایی که ویرگول، نقل‌قول یا خط جدید دارند، طبق RFC 4180 به‌درستی escape می‌شوند. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. همهٔ جدول‌های یافت‌شده در سند استخراج و در یک CSV ترکیب می‌شوند. + +## قالب خروجی + +- یک فایل `filename.csv` شامل همهٔ جدول‌های شناسایی‌شده. + +## موارد استفاده + +- انتقال داده‌های مالی از صورت‌حساب‌های بانکی یا فاکتورهای PDF به صفحه‌گسترده. +- استخراج جدول‌های قیمت از پیش‌فاکتورهای فروشندگان برای مقایسه. +- تبدیل داده‌های پژوهشی جدولی مقالات PDF به قالبی مناسب ابزارهای تحلیل. +- انتقال داده از گزارش‌های قدیمی PDF به پایگاه‌های داده. + +## نکته‌ها + +- اگر جدولی یافت نشود، ابزار پیام "جدولی پیدا نشد" را نشان می‌دهد. معمولاً یعنی PDF از چیدمان متنی استفاده می‌کند که جدولی به نظر می‌رسد اما ساختار جدول واقعی ندارد. +- برای کنترل بیشتر روی تک‌تک جدول‌ها از [استخراج جدول‌ها](./extract-tables) استفاده کنید که امکان انتخاب بین قالب‌های خروجی CSV، JSON و Markdown را می‌دهد. +- اگر داده را در قالب Excel با برگه‌های جداگانه برای هر جدول می‌خواهید، از [PDF به Excel](./pdf-to-excel) استفاده کنید. + +## ابزارهای مرتبط + +- [PDF به Excel](./pdf-to-excel) +- [استخراج جدول‌ها](./extract-tables) +- [PDF به متن](./pdf-to-text) diff --git a/docs/fa/tools/pdf-to-excel.md b/docs/fa/tools/pdf-to-excel.md new file mode 100644 index 00000000..28cad659 --- /dev/null +++ b/docs/fa/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF به Excel +description: جدول‌ها را از اسناد PDF در یک صفحه‌گستردهٔ Excel استخراج کنید. هر جدول برگهٔ خودش را با ارجاع به صفحه دارد. +--- + +# PDF به Excel + +جدول‌ها را از یک PDF استخراج و به‌صورت صفحه‌گستردهٔ Excel (`.xlsx`) ذخیره می‌کند. هر جدول شناسایی‌شده در برگهٔ جداگانه‌ای با شمارهٔ جدول و صفحهٔ مبدأ قرار می‌گیرد. تشخیص جدول با PyMuPDF و تولید Excel با کتابخانهٔ SheetJS انجام می‌شود. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. برای شروع استخراج جدول روی **تبدیل به Excel** کلیک کنید. +3. ابزار همهٔ صفحات را برای یافتن جدول بررسی و سپس یک کارپوشهٔ Excel می‌سازد. +4. یک فایل `.xlsx` با یک برگه برای هر جدول دانلود می‌شود. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. همهٔ جدول‌های شناسایی‌شده خودکار استخراج می‌شوند. + +## قالب خروجی + +- یک فایل `filename.xlsx`. +- **یک جدول**: یک برگه با نام "Table". +- **چند جدول**: برگه‌هایی با نام‌های "Table 1 (Page 3)"، "Table 2 (Page 5)" و غیره. نام برگه‌ها به 31 نویسه (محدودیت Excel) کوتاه می‌شود. + +## موارد استفاده + +- تبدیل گزارش‌های مالی PDF به صفحه‌گسترده‌های قابل‌ویرایش برای تحلیل بیشتر. +- استخراج جدول‌های موجودی یا سفارش از PDFهای تأمین‌کنندگان. +- انتقال دادهٔ ساختاریافته از فرم‌ها یا کاتالوگ‌های PDF به Excel برای مرتب‌سازی و فیلتر کردن. +- بایگانی دادهٔ جدولی PDF در قالبی که همکاران غیرفنی بتوانند با آن کار کنند. + +## نکته‌ها + +- اگر ابزار "جدولی پیدا نشد" گزارش داد، احتمالاً PDF از چیدمان متنی آزاد به‌جای جدول‌های ساختاریافته استفاده می‌کند. به‌جای آن [PDF به متن](./pdf-to-text) را برای دریافت محتوای خام امتحان کنید. +- برای قالب تخت ساده‌تر از [PDF به CSV](./pdf-to-csv) استفاده کنید. برای دانلود جداگانهٔ هر جدول در چند قالب، از [استخراج جدول‌ها](./extract-tables) استفاده کنید. +- نام برگه‌ها را بررسی کنید تا بفهمید هر جدول از کدام صفحه آمده است. + +## ابزارهای مرتبط + +- [PDF به CSV](./pdf-to-csv) +- [استخراج جدول‌ها](./extract-tables) +- [PDF به متن](./pdf-to-text) diff --git a/docs/fa/tools/pdf-to-greyscale.md b/docs/fa/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..2248c109 --- /dev/null +++ b/docs/fa/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF به خاکستری +description: یک PDF رنگی را به نسخهٔ خاکستری (سیاه‌وسفید) تبدیل کنید. یک PDF جدید بدون هیچ رنگی در صفحات تولید می‌کند. +--- + +# PDF به خاکستری + +یک PDF رنگی را به نسخهٔ خاکستری تبدیل می‌کند. هر صفحه رندر، بی‌رنگ و به‌صورت تصویر JPEG دوباره در یک PDF جدید جاسازی می‌شود. خروجی ابعاد اصلی صفحات را حفظ می‌کند. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. برای پردازش فایل روی **تبدیل به خاکستری** کلیک کنید. +3. یک `greyscale.pdf` جدید با همهٔ صفحات سیاه‌وسفید دانلود می‌شود. + +در پشت صحنه، هر صفحه با مقیاس 2x رندر می‌شود، دادهٔ پیکسل از فیلتر خاکستری عبور می‌کند، سپس به‌صورت JPEG با کیفیت 90% دوباره کدگذاری و در یک سند PDF تازه قرار می‌گیرد. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. تبدیل خاکستری از فرمول استاندارد درخشندگی استفاده می‌کند و کیفیت JPEG روی 90% ثابت است. + +## قالب خروجی + +- یک فایل `greyscale.pdf` شامل همهٔ صفحات به‌صورت تصاویر JPEG خاکستری. + +## موارد استفاده + +- آماده‌سازی اسناد برای چاپ سیاه‌وسفید و صرفه‌جویی در هزینهٔ جوهر رنگی. +- رعایت الزامات ارسال پرونده‌های حقوقی یا دولتی که خاکستری بودن را الزامی می‌کنند. +- کاهش حجم PDFهای پررنگ (تصاویر JPEG خاکستری از رنگی کوچک‌ترند). +- ایجاد سبک بصری یکدست در اسنادی با صفحات رنگی و سیاه‌وسفید مختلط. + +## نکته‌ها + +- چون هر صفحه شطرنجی و به‌صورت JPEG دوباره جاسازی می‌شود، خروجی مبتنی بر تصویر است. متن PDF اصلی دیگر قابل انتخاب یا جستجو نخواهد بود. اگر پس از آن متن قابل جستجو می‌خواهید، خروجی را از ابزار OCR عبور دهید. +- برای کنترل بیشتر روی تنظیم رنگ‌ها (روشنایی، کنتراست، اشباع)، ابزار تنظیم رنگ‌ها یا گره Greyscale در [سازندهٔ گردش کار PDF](./pdf-workflow) را ببینید. + +## ابزارهای مرتبط + +- [PDF به JPG](./pdf-to-jpg) +- [PDF به PNG](./pdf-to-png) +- [سازندهٔ گردش کار PDF](./pdf-workflow) diff --git a/docs/fa/tools/pdf-to-jpg.md b/docs/fa/tools/pdf-to-jpg.md new file mode 100644 index 00000000..f6f6eb15 --- /dev/null +++ b/docs/fa/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF به JPG +description: صفحات PDF را با کیفیت قابل‌تنظیم به تصاویر JPG تبدیل کنید. PDFهای تک‌صفحه‌ای مستقیماً و PDFهای چندصفحه‌ای به‌صورت ZIP دانلود می‌شوند. +--- + +# PDF به JPG + +هر صفحهٔ PDF را به یک تصویر JPG تبدیل می‌کند. اسناد تک‌صفحه‌ای به‌صورت یک فایل `.jpg` مستقل دانلود می‌شوند. PDFهای چندصفحه‌ای یک بایگانی ZIP شامل یک JPG برای هر صفحه تولید می‌کنند. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. ابزار نام فایل، حجم و تعداد صفحات را نشان می‌دهد. +2. لغزندهٔ **کیفیت تصویر** را برای کنترل فشرده‌سازی JPG تنظیم کنید. +3. برای شروع پردازش روی **تبدیل** کلیک کنید. +4. نتیجه خودکار دانلود می‌شود: یک JPG برای PDFهای تک‌صفحه‌ای یا یک فایل ZIP برای اسناد چندصفحه‌ای. + +## گزینه‌ها + +- **کیفیت**: لغزنده‌ای از 0% تا 100% (پیش‌فرض 90%). مقادیر بالاتر تصاویر واضح‌تر با حجم بیشتر تولید می‌کنند. مقادیر پایین‌تر فشرده‌سازی شدیدتری دارند. + +صفحات در داخل با مقیاس 2x رندر می‌شوند، بنابراین وضوح خروجی دو برابر ابعاد صفحهٔ PDF است. یک صفحهٔ استاندارد letter تصویری تقریباً 1,224 x 1,584 پیکسلی تولید می‌کند. + +## قالب خروجی + +- **تک‌صفحه**: `filename.jpg` +- **چندصفحه**: `filename_jpgs.zip` شامل `page_1.jpg`، `page_2.jpg` و غیره. + +## موارد استفاده + +- تولید تصاویر بندانگشتی پیش‌نمایش برای سامانهٔ مدیریت اسناد. +- اشتراک یک صفحه از گزارش در گفتگو یا ایمیلی که از PDF پشتیبانی نمی‌کند. +- ساخت داراییهای تصویری از نمودارها یا تصویرسازی‌های PDF. +- بایگانی اسناد اسکن‌شده به‌صورت تصاویر جداگانه. + +## نکته‌ها + +- برای خروجی بدون افت، به‌جای آن از [PDF به PNG](./pdf-to-png) استفاده کنید. +- تنظیم کیفیت 80 تا 90% تعادل خوبی بین حجم فایل و وفاداری بصری برقرار می‌کند. +- اگر برای هر صفحه قالب خاصی می‌خواهید، [سازندهٔ گردش کار PDF](./pdf-workflow) را در نظر بگیرید که گره خروجی «PDF به تصاویر» دارد. + +## ابزارهای مرتبط + +- [PDF به PNG](./pdf-to-png) +- [PDF به WebP](./pdf-to-webp) +- [PDF به BMP](./pdf-to-bmp) +- [PDF به TIFF](./pdf-to-tiff) diff --git a/docs/fa/tools/pdf-to-json.md b/docs/fa/tools/pdf-to-json.md new file mode 100644 index 00000000..c5385ec8 --- /dev/null +++ b/docs/fa/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF به JSON +description: فایل‌های PDF را با CPDF به قالب ساختاریافتهٔ JSON تبدیل کنید. ساختار داخلی PDF را به‌صورت دادهٔ JSON ماشین‌خوان صادر می‌کند. +--- + +# PDF به JSON + +یک یا چند فایل PDF را به قالب JSON تبدیل می‌کند. ابزار از CPDF (Coherent PDF) برای سریال‌سازی ساختار داخلی هر PDF به یک نمایش JSON ماشین‌خوان استفاده می‌کند. خروجی همیشه به‌صورت بایگانی ZIP ارائه می‌شود. + +## نحوهٔ کار + +1. با انتخابگر فایل یک یا چند فایل PDF انتخاب کنید. +2. برای شروع پردازش روی **تبدیل به JSON** کلیک کنید. تبدیل در یک web worker پس‌زمینه اجرا می‌شود. +3. یک بایگانی ZIP شامل یک فایل JSON برای هر PDF ورودی دانلود می‌شود. + +نوار وضعیت پیشرفت مراحل تبدیل و ساخت ZIP را نشان می‌دهد. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. هر PDF به نمایش کامل JSON خود تبدیل می‌شود. + +## قالب خروجی + +- یک فایل `pdfs-to-json.zip` شامل `filename.json` برای هر PDF ورودی. + +خروجی JSON ساختار اشیای داخلی PDF را نشان می‌دهد، از جمله درخت صفحات، ارجاع‌های فونت، فراداده و جریان‌های محتوا. + +## موارد استفاده + +- بررسی ساختار داخلی یک PDF برای اشکال‌زدایی یا اعتبارسنجی. +- استخراج برنامه‌نویسی‌شدهٔ فرادادهٔ ساختاریافته و ویژگی‌های صفحات. +- ارسال دادهٔ ساختار PDF به خطوط پردازش سفارشی. +- ممیزی اسناد PDF برای انطباق با تحلیل درخت اشیای آن‌ها. + +## نکته‌ها + +- این ابزار ساختار خام اشیای PDF را خروجی می‌دهد، نه محتوای متنی استخراج‌شده. اگر متن صفحات را در قالب JSON می‌خواهید، به‌جای آن از [آماده‌سازی PDF برای هوش مصنوعی](./prepare-pdf-for-ai) استفاده کنید. +- برای استخراج متن ساده، [PDF به متن](./pdf-to-text) سرراست‌تر است. +- PDFهای بزرگ با ساختارهای پیچیده فایل‌های JSON بسیار حجیمی تولید می‌کنند. + +## ابزارهای مرتبط + +- [PDF به متن](./pdf-to-text) +- [آماده‌سازی PDF برای هوش مصنوعی](./prepare-pdf-for-ai) +- [استخراج جدول‌ها](./extract-tables) diff --git a/docs/fa/tools/pdf-to-markdown.md b/docs/fa/tools/pdf-to-markdown.md new file mode 100644 index 00000000..385f77c5 --- /dev/null +++ b/docs/fa/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF به Markdown +description: اسناد PDF را با امکان استخراج تصاویر به قالب Markdown تبدیل کنید. از تبدیل دسته‌ای چند فایل پشتیبانی می‌کند. +--- + +# PDF به Markdown + +فایل‌های PDF را با حفظ سرفصل‌ها، پاراگراف‌ها، فهرست‌ها و قالب‌بندی پایه به قالب Markdown (`.md`) تبدیل می‌کند. به‌صورت اختیاری تصاویر جاسازی‌شده را استخراج و اضافه می‌کند. از تبدیل تکی و دسته‌ای پشتیبانی می‌کند. با قدرت PyMuPDF. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها روی آن، یک یا چند PDF بارگذاری کنید. +2. در صورت تمایل **شامل کردن تصاویر به‌صورت base64** را فعال کنید تا تصاویر استخراج‌شده در خروجی Markdown جاسازی شوند. +3. برای شروع پردازش روی **تبدیل به Markdown** کلیک کنید. +4. یک فایل تکی به‌صورت `filename.md` دانلود می‌شود. چند فایل یک `markdown-files.zip` تولید می‌کنند. + +## گزینه‌ها + +- **افزودن تصاویر**: وقتی فعال باشد، تصاویر جاسازی‌شدهٔ PDF استخراج و در خروجی Markdown ارجاع داده می‌شوند. وقتی غیرفعال باشد، فقط محتوای متنی تبدیل می‌شود. + +## قالب خروجی + +- **تک‌فایل**: `filename.md` +- **چند فایل**: `markdown-files.zip` شامل یک `.md` برای هر PDF ورودی. + +## موارد استفاده + +- تبدیل مستندات PDF به Markdown برای مولدهای سایت ایستا مانند VitePress، Hugo یا Jekyll. +- تبدیل مقالات پژوهشی PDF به Markdown قابل‌ویرایش برای برنامه‌های یادداشت‌برداری مانند Obsidian. +- انتقال پایگاه‌های دانش قدیمی PDF به قالب متنی سازگار با Git. +- استخراج محتوای ساختاریافته از کتاب‌های الکترونیکی PDF برای قالب‌بندی دوباره. + +## نکته‌ها + +- گزینهٔ «شامل کردن تصاویر به‌صورت base64» زمانی مفید است که PDF نمودارها یا شکل‌هایی ضروری برای محتوا دارد. برای اسناد پرمتن آن را غیرفعال کنید تا خروجی تمیز بماند. +- چیدمان‌های پیچیده با نوار کناری، پانویس یا متن چندستونی ممکن است Markdown ناقصی تولید کنند. در صورت نیاز خروجی را بررسی و اصلاح کنید. +- برای متن خام بدون قالب‌بندی، به‌جای آن از [PDF به متن](./pdf-to-text) استفاده کنید. + +## ابزارهای مرتبط + +- [PDF به متن](./pdf-to-text) +- [PDF به Word](./pdf-to-word) +- [آماده‌سازی PDF برای هوش مصنوعی](./prepare-pdf-for-ai) diff --git a/docs/fa/tools/pdf-to-pdfa.md b/docs/fa/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..30ece954 --- /dev/null +++ b/docs/fa/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF به PDF/A +description: PDFهای استاندارد را برای بایگانی بلندمدت به قالب PDF/A تبدیل کنید. از سطوح انطباق PDF/A-1b، PDF/A-2b و PDF/A-3b پشتیبانی می‌کند. +--- + +# PDF به PDF/A + +PDF/A زیرمجموعه‌ای از PDF با استاندارد ISO است که برای نگهداری دیجیتال بلندمدت طراحی شده است. این ابزار با Ghostscript که مستقیماً در مرورگر شما اجرا می‌شود، PDFهای استاندارد را به اسناد منطبق با PDF/A تبدیل می‌کند. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. +2. از فهرست کشویی یک **نسخهٔ PDF/A** انتخاب کنید. +3. در صورت تمایل، برای فایل‌های پیچیده‌ای که تبدیل عادی‌شان ناموفق است، **مسطح‌سازی پیشین PDF** را فعال کنید. +4. روی **تبدیل به PDF/A** کلیک کنید. چند فایل یک بایگانی ZIP تولید می‌کنند. + +## نسخه‌های PDF/A + +| نسخه | محدودیت‌ها | مناسب برای | +| ------------ | ------------------------------------------------- | --------------------------------------------- | +| **PDF/A-1b** | سخت‌گیرانه‌ترین. بدون شفافیت، بدون لایه. | حداکثر سازگاری با سامانه‌های بایگانی قدیمی‌تر | +| **PDF/A-2b** | شفافیت و JPEG2000 را مجاز می‌داند. | بایگانی عمومی (توصیه‌شده) | +| **PDF/A-3b** | پیوست‌های جاسازی‌شده با هر قالبی را مجاز می‌داند. | بایگانی اسناد همراه با فایل‌های دادهٔ مبدأ | + +PDF/A-2b به‌طور پیش‌فرض انتخاب شده است و برای اکثر نیازهای بایگانی کافی است. + +## گزینهٔ Pre-flatten + +برخی PDFها ویژگی‌هایی دارند که مانع تبدیل تمیز به PDF/A می‌شوند: کدگذاری‌های غیرمعمول فونت، پشته‌های پیچیدهٔ شفافیت یا ساختارهای داخلی معیوب. فعال کردن **مسطح‌سازی پیشین PDF** پیش از تبدیل، PDF را با 300 DPI شطرنجی می‌کند که انطباق را تضمین می‌کند، به بهای غیرقابل‌انتخاب شدن متن. از آن به‌عنوان راه جایگزین زمانی استفاده کنید که تبدیل استاندارد خطا می‌دهد. + +Pre-flatten به موتور PyMuPDF WASM نیاز دارد. + +## موارد استفاده + +- رعایت الزامات بایگانی دولتی یا حقوقی (بسیاری از حوزه‌های قضایی PDF/A را برای پرونده‌های دادگاه الزامی می‌کنند) +- ارسال اسناد به مخازن سازمانی یا کتابخانه‌های دیجیتال +- نگهداری سوابق تجاری در شرایطی که نرم‌افزار اصلی ممکن است ده سال بعد وجود نداشته باشد +- آماده‌سازی فاکتورها برای استانداردهای فاکتور الکترونیکی که PDF/A-3b با پیوست XML می‌خواهند + +## نکته‌ها + +- ابتدا تبدیل را بدون Pre-flatten امتحان کنید. فقط در صورت خطا آن را فعال کنید. +- PDF/A همهٔ فونت‌ها را جاسازی می‌کند، بنابراین فایل‌های خروجی اغلب از نسخهٔ اصلی بزرگ‌ترند. +- اگر گردش کار شما انطباق سخت‌گیرانه می‌خواهد، خروجی را در یک اعتبارسنج اختصاصی PDF/A بررسی کنید. + +## ابزارهای مرتبط + +- [فشرده‌سازی PDF](./compress-pdf): کاهش حجم فایل پس از تبدیل +- [مسطح‌سازی PDF](./flatten-pdf): مسطح کردن فرم‌ها پیش از تبدیل به PDF/A +- [حذف فراداده](./remove-metadata): پاک کردن فراداده پیش از بایگانی diff --git a/docs/fa/tools/pdf-to-png.md b/docs/fa/tools/pdf-to-png.md new file mode 100644 index 00000000..1354679f --- /dev/null +++ b/docs/fa/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF به PNG +description: صفحات PDF را با مقیاس قابل‌تنظیم به تصاویر PNG بدون افت تبدیل کنید. مناسب برای اسکرین‌شات‌های باکیفیت و پس‌زمینه‌های شفاف. +--- + +# PDF به PNG + +هر صفحهٔ PDF را به یک تصویر PNG تبدیل می‌کند. PNG از فشرده‌سازی بدون افت استفاده می‌کند، بنابراین خروجی همهٔ جزئیات صفحهٔ اصلی را حفظ می‌کند. PDFهای تک‌صفحه‌ای به‌صورت فایل `.png` دانلود می‌شوند؛ PDFهای چندصفحه‌ای یک ZIP تولید می‌کنند. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. لغزندهٔ **مقیاس تصویر** را برای کنترل وضوح خروجی تنظیم کنید. +3. برای شروع پردازش روی **تبدیل** کلیک کنید. +4. یک PNG یا یک بایگانی ZIP خودکار دانلود می‌شود. + +## گزینه‌ها + +- **مقیاس**: از 1.0x تا 3.0x (پیش‌فرض 2.0x). در 2.0x، یک صفحهٔ استاندارد letter تقریباً با 1,224 x 1,584 پیکسل رندر می‌شود. مقیاس‌های بالاتر تصاویر بزرگ‌تر و واضح‌تری تولید می‌کنند، به بهای حجم فایل و زمان پردازش بیشتر. + +## قالب خروجی + +- **تک‌صفحه**: `filename.png` +- **چندصفحه**: `filename_pngs.zip` شامل `page_1.png`، `page_2.png` و غیره. + +## موارد استفاده + +- گرفتن اسکرین‌شات‌های باکیفیت از صفحات PDF برای ارائه‌ها. +- استخراج نمودارها یا دیاگرام‌هایی که به لبه‌های تیز و بدون اثرات فشرده‌سازی نیاز دارند. +- آماده‌سازی داراییها برای طراحی وب از ماکت‌های PDF. +- ساخت تصاویر بدون افت صفحات برای پیش‌پردازش OCR. + +## نکته‌ها + +- فایل‌های PNG به‌طور چشمگیری از JPG بزرگ‌ترند. اگر حجم فایل از کیفیت کامل مهم‌تر است، از [PDF به JPG](./pdf-to-jpg) یا [PDF به WebP](./pdf-to-webp) استفاده کنید. +- در مقیاس 1.0x، خروجی با وضوح اصلی PDF برابر است. برای خروجی با کیفیت چاپ آن را تا 3.0x افزایش دهید. + +## ابزارهای مرتبط + +- [PDF به JPG](./pdf-to-jpg) +- [PDF به WebP](./pdf-to-webp) +- [PDF به SVG](./pdf-to-svg) diff --git a/docs/fa/tools/pdf-to-svg.md b/docs/fa/tools/pdf-to-svg.md new file mode 100644 index 00000000..a5c757c6 --- /dev/null +++ b/docs/fa/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF به SVG +description: صفحات PDF را به گرافیک برداری مقیاس‌پذیر SVG تبدیل کنید. متن و شکل‌ها را به‌صورت مسیرهای برداری برای مقیاس‌پذیری نامحدود حفظ می‌کند. +--- + +# PDF به SVG + +هر صفحهٔ PDF را به یک فایل SVG (Scalable Vector Graphics) تبدیل می‌کند. برخلاف قالب‌های شطرنجی، SVG مسیرهای برداری، متن و شکل‌ها را حفظ می‌کند تا خروجی بدون پیکسلی شدن در هر اندازه‌ای مقیاس‌پذیر باشد. با قدرت PyMuPDF. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها روی آن، یک یا چند PDF بارگذاری کنید. می‌توانید چند فایل اضافه و هر کدام را جداگانه مدیریت کنید. +2. برای پردازش همهٔ فایل‌های بارگذاری‌شده روی **تبدیل به SVG** کلیک کنید. +3. تبدیل‌های تک‌فایل و تک‌صفحه به‌صورت یک `.svg` مستقل دانلود می‌شوند. بقیه به‌صورت بایگانی ZIP دانلود می‌شوند. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. هر صفحه با صدور برداری داخلی PyMuPDF به SVG تبدیل می‌شود. + +## قالب خروجی + +- **تک‌فایل، تک‌صفحه**: `filename.svg` +- **تک‌فایل، چندصفحه**: `filename_svg.zip` شامل `page_1.svg`، `page_2.svg` و غیره. +- **چند فایل**: `pdf_to_svg.zip` با فایل‌هایی که بر اساس نام سند مبدأ سازماندهی شده‌اند. + +## موارد استفاده + +- استخراج دیاگرام‌ها، نمودارها یا تصویرسازی‌های برداری از گزارش‌های PDF برای استفاده در صفحات وب. +- ویرایش محتوای صفحات PDF در ویرایشگرهای برداری مانند Inkscape یا Illustrator. +- جاسازی پیش‌نمایش‌های مقیاس‌پذیر صفحات در برنامه‌های وب واکنش‌گرا. +- استخراج لوگوها یا گرافیک‌ها از بروشورهای PDF با حفظ لبه‌های تیز. + +## نکته‌ها + +- SVG با PDFهایی که محتوای برداری دارند بهترین نتیجه را می‌دهد. اسناد اسکن‌شده یا PDFهای پرتصویر فایل‌های SVG حجیمی با دادهٔ شطرنجی جاسازی‌شده تولید می‌کنند. +- برای خروجی شطرنجی از PDFهای پرتصویر، به‌جای آن از [PDF به PNG](./pdf-to-png) یا [PDF به JPG](./pdf-to-jpg) استفاده کنید. +- این ابزار از تبدیل دسته‌ای پشتیبانی می‌کند؛ چند PDF را یک‌جا بارگذاری کنید تا همه در یک اجرا تبدیل شوند. + +## ابزارهای مرتبط + +- [PDF به PNG](./pdf-to-png) +- [PDF به JPG](./pdf-to-jpg) +- [PDF به Markdown](./pdf-to-markdown) diff --git a/docs/fa/tools/pdf-to-text.md b/docs/fa/tools/pdf-to-text.md new file mode 100644 index 00000000..799a49d5 --- /dev/null +++ b/docs/fa/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF به متن +description: محتوای متن ساده را از فایل‌های PDF استخراج کنید. از استخراج دسته‌ای چند PDF با خروجی فایل‌های TXT پشتیبانی می‌کند. +--- + +# PDF به متن + +همهٔ محتوای متنی فایل‌های PDF را استخراج و به‌صورت فایل‌های ساده `.txt` ذخیره می‌کند. از پردازش دسته‌ای پشتیبانی می‌کند؛ چند PDF بارگذاری کنید و متن همه را در یک عملیات دریافت کنید. با قدرت PyMuPDF. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها روی آن، یک یا چند PDF بارگذاری کنید. فهرست فایل‌ها را با دکمه‌های «افزودن فایل بیشتر» و «پاک کردن فایل‌ها» مدیریت کنید. +2. برای شروع پردازش روی **استخراج متن** کلیک کنید. +3. یک فایل تکی به‌صورت `filename.txt` دانلود می‌شود. چند فایل یک بایگانی `pdf-to-text.zip` تولید می‌کنند. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. همهٔ محتوای متنی همهٔ صفحات به ترتیب خواندن استخراج می‌شود. + +## قالب خروجی + +- **تک‌فایل**: `filename.txt` +- **چند فایل**: `pdf-to-text.zip` شامل یک `.txt` برای هر PDF ورودی. + +## موارد استفاده + +- استخراج متن اصلی گزارش‌های PDF برای نمایه‌سازی جستجوی تمام‌متن. +- تبدیل کتاب‌ها یا مقالات الکترونیکی PDF به متن ساده برای خواندن در دستگاه‌های جوهر الکترونیکی. +- بیرون کشیدن متن از قراردادها یا اسناد حقوقی برای تحلیل کلیدواژه. +- حذف قالب‌بندی PDFها برای دریافت متن تمیز برای اسکریپت‌های پردازش داده. +- آماده‌سازی پیکرهٔ متنی از بایگانی‌های PDF برای پردازش زبان طبیعی. + +## نکته‌ها + +- PDFهای اسکن‌شده (فقط تصویر) فایل‌های متنی خالی تولید می‌کنند، چون لایهٔ متنی برای استخراج ندارند. ابتدا اسناد اسکن‌شده را از OCR عبور دهید. +- خروجی ترتیب خواندن را همان‌طور که PyMuPDF تفسیر می‌کند حفظ می‌کند که معمولاً چپ‌به‌راست و بالا به پایین است. چیدمان‌های چندستونی ممکن است متن درهم‌آمیخته تولید کنند. +- برای خروجی ساختاریافته با سرفصل‌ها و قالب‌بندی، [PDF به Markdown](./pdf-to-markdown) را امتحان کنید. برای JSON ساختاریافتهٔ آماده برای هوش مصنوعی، از [آماده‌سازی PDF برای هوش مصنوعی](./prepare-pdf-for-ai) استفاده کنید. + +## ابزارهای مرتبط + +- [PDF به Markdown](./pdf-to-markdown) +- [آماده‌سازی PDF برای هوش مصنوعی](./prepare-pdf-for-ai) +- [PDF به Word](./pdf-to-word) diff --git a/docs/fa/tools/pdf-to-tiff.md b/docs/fa/tools/pdf-to-tiff.md new file mode 100644 index 00000000..47d2242c --- /dev/null +++ b/docs/fa/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF به TIFF +description: صفحات PDF را به تصاویر TIFF تبدیل کنید که معمولاً در گردش‌کارهای چاپ، فکس و بایگانی استفاده می‌شوند. در صورت شکست کدگذاری به PNG برمی‌گردد. +--- + +# PDF به TIFF + +هر صفحهٔ PDF را به یک تصویر TIFF تبدیل می‌کند. TIFF قالب استاندارد تولید چاپی، سامانه‌های فکس و بایگانی اسناد است. ابزار برای کدگذاری TIFF از فشرده‌سازی PackBits استفاده می‌کند و اگر کدگذاری صفحه‌ای ناموفق باشد به PNG برمی‌گردد. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. برای پردازش فایل روی **تبدیل** کلیک کنید. +3. یک فایل TIFF یا یک بایگانی ZIP خودکار دانلود می‌شود. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. صفحات با مقیاس ثابت 2x رندر می‌شوند. + +## قالب خروجی + +- **تک‌صفحه**: `filename.tiff` +- **چندصفحه**: `filename_tiffs.zip` شامل `page_1.tiff`، `page_2.tiff` و غیره. + +اگر کدگذاری TIFF برای صفحه‌ای خاص (به دلیل مشکلات فشرده‌سازی) ناموفق باشد، آن صفحه به‌جای آن به‌صورت فایل `.png` ذخیره می‌شود. در این حالت ZIP ترکیبی از فایل‌های TIFF و PNG خواهد داشت. + +## موارد استفاده + +- ارسال اسناد به نهادهای دولتی یا سامانه‌های حقوقی که قالب TIFF را الزامی می‌کنند. +- آماده‌سازی صفحات برای ارسال فکس از طریق سرویس‌های فکس دیجیتال. +- بایگانی اسناد اسکن‌شده در قالبی بدون افت و با پشتیبانی گسترده. +- ارسال صفحات به سامانه‌های سازمانی مدیریت اسناد. + +## نکته‌ها + +- فایل‌های TIFF حجیم‌اند. اگر فقط کیفیت بدون افت برای وب یا نمایشگر می‌خواهید، [PDF به PNG](./pdf-to-png) انتخاب بهتری است. +- اگر برخی صفحات به جایگزین PNG نیاز داشتند، محتوای ZIP را بررسی کنید؛ شاید بخواهید آن‌ها را جداگانه تبدیل کنید. + +## ابزارهای مرتبط + +- [PDF به PNG](./pdf-to-png) +- [PDF به BMP](./pdf-to-bmp) +- [PDF به JPG](./pdf-to-jpg) diff --git a/docs/fa/tools/pdf-to-webp.md b/docs/fa/tools/pdf-to-webp.md new file mode 100644 index 00000000..d119c9f1 --- /dev/null +++ b/docs/fa/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF به WebP +description: صفحات PDF را با کیفیت قابل‌تنظیم به تصاویر WebP تبدیل کنید. حجم کمتر از JPG با کیفیت بصری مشابه. +--- + +# PDF به WebP + +هر صفحهٔ PDF را به یک تصویر WebP تبدیل می‌کند. WebP معمولاً با همان کیفیت ادراکی، فایل‌هایی 25 تا 35% کوچک‌تر از JPG تولید می‌کند و انتخاب خوبی برای وب است. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل روی آن، یک PDF بارگذاری کنید. +2. لغزندهٔ **کیفیت تصویر** را تنظیم کنید. +3. برای پردازش فایل روی **تبدیل** کلیک کنید. +4. یک فایل `.webp` یا یک بایگانی ZIP خودکار دانلود می‌شود. + +## گزینه‌ها + +- **کیفیت**: لغزنده‌ای از 0% تا 100% (پیش‌فرض 85%). سطح فشرده‌سازی با افت را کنترل می‌کند. مقادیر بالاتر جزئیات بیشتری حفظ می‌کنند. + +صفحات در داخل با مقیاس 2x رندر می‌شوند و تصاویری تقریباً دو برابر ابعاد اصلی PDF تولید می‌کنند. + +## قالب خروجی + +- **تک‌صفحه**: `filename.webp` +- **چندصفحه**: `filename_webps.zip` شامل `page_1.webp`، `page_2.webp` و غیره. + +## موارد استفاده + +- آماده‌سازی پیش‌نمایش صفحات برای وب‌سایت‌هایی که پهنای باند در آن‌ها مهم است. +- تولید نسخه‌های تصویری سبک از آگهی‌ها یا بروشورها برای شبکه‌های اجتماعی. +- تبدیل دسته‌ای اسناد چندصفحه‌ای به مجموعه‌ای از تصاویر بهینه برای وب. + +## نکته‌ها + +- WebP در همهٔ مرورگرهای مدرن پشتیبانی می‌شود. برای سازگاری با سامانه‌های قدیمی، از [PDF به JPG](./pdf-to-jpg) استفاده کنید. +- کیفیت 80 تا 85% معمولاً روی نمایشگر از نسخهٔ اصلی قابل تشخیص نیست و حجم فایل را کم نگه می‌دارد. + +## ابزارهای مرتبط + +- [PDF به JPG](./pdf-to-jpg) +- [PDF به PNG](./pdf-to-png) +- [PDF به BMP](./pdf-to-bmp) diff --git a/docs/fa/tools/pdf-to-word.md b/docs/fa/tools/pdf-to-word.md new file mode 100644 index 00000000..512d7805 --- /dev/null +++ b/docs/fa/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF به Word +description: فایل‌های PDF را به اسناد قابل‌ویرایش Word (DOCX) تبدیل کنید. از تبدیل دسته‌ای چند PDF به‌طور هم‌زمان پشتیبانی می‌کند. +--- + +# PDF به Word + +فایل‌های PDF را به اسناد قابل‌ویرایش Word (`.docx`) تبدیل می‌کند. ابزار از PyMuPDF برای بازسازی محتوای سند استفاده می‌کند و متن، قالب‌بندی پایه و چیدمان را حفظ می‌کند. از تبدیل تکی و دسته‌ای پشتیبانی می‌کند. + +## نحوهٔ کار + +1. با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها روی آن، یک یا چند PDF بارگذاری کنید. می‌توانید فایل‌های بیشتری اضافه یا تک‌تک فایل‌ها را از فهرست حذف کنید. +2. برای شروع پردازش روی **تبدیل به DOCX** کلیک کنید. +3. یک فایل تکی به‌صورت `filename.docx` دانلود می‌شود. چند فایل در `converted-documents.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +این ابزار گزینهٔ قابل‌تنظیمی ندارد. هر PDF با موتور تبدیل داخلی PyMuPDF به DOCX تبدیل می‌شود. + +## قالب خروجی + +- **تک‌فایل**: `filename.docx` +- **چند فایل**: `converted-documents.zip` شامل یک `.docx` برای هر PDF ورودی. + +## موارد استفاده + +- ویرایش متن PDF دریافتی که باید تغییرش دهید. +- تبدیل گزارش‌های PDF بایگانی‌شده به قالبی که همکاران بتوانند در Microsoft Word یا Google Docs ویرایش کنند. +- انتقال محتوای قراردادها یا پیشنهادهای PDF به Word برای بازبینی و علامت‌گذاری تغییرات. +- انتقال مستندات قدیمی PDF به قالبی قابل‌ویرایش. + +## نکته‌ها + +- چیدمان‌های پیچیده با متن چندستونی، فرم‌های جاسازی‌شده یا گرافیک سنگین ممکن است کاملاً درست تبدیل نشوند. خروجی را بررسی و قالب‌بندی را در واژه‌پرداز خود اصلاح کنید. +- PDFهای اسکن‌شده (فقط تصویر) فایل‌های DOCX خالی یا بسیار کم‌محتوا تولید می‌کنند. ابتدا آن‌ها را از OCR عبور دهید تا لایهٔ متنی اضافه شود. +- حالت دسته‌ای برای تبدیل کل پوشه‌های PDF کارآمد است؛ همه را یک‌جا بارگذاری کنید. + +## ابزارهای مرتبط + +- [PDF به متن](./pdf-to-text) +- [PDF به Markdown](./pdf-to-markdown) +- [سازندهٔ گردش کار PDF](./pdf-workflow) diff --git a/docs/fa/tools/pdf-to-zip.md b/docs/fa/tools/pdf-to-zip.md new file mode 100644 index 00000000..f3de5e70 --- /dev/null +++ b/docs/fa/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDFها به ZIP +description: چند فایل PDF را برای اشتراک‌گذاری و ذخیره‌سازی آسان در یک بایگانی ZIP بسته‌بندی کنید. +--- + +# PDFها به ZIP + +چند فایل PDF را در یک بایگانی ZIP جمع کنید. این یک ابزار سادهٔ بسته‌بندی است، بدون تبدیل، فشرده‌سازی یا تغییر خود PDFها. + +## نحوهٔ کار + +1. با ناحیهٔ رها کردن چند فایل PDF بارگذاری کنید. +2. فهرست فایل‌ها را بررسی کنید. هر فایلی را که نمی‌خواهید حذف کنید. +3. روی دکمهٔ پردازش کلیک کنید. +4. یک بایگانی ZIP شامل همهٔ PDFهای بارگذاری‌شده بی‌درنگ دانلود می‌شود. + +## ویژگی‌ها + +- پذیرش هر تعداد فایل PDF +- حذف تک‌تک فایل‌ها پیش از ساخت بایگانی +- حفظ نام اصلی فایل‌ها درون ZIP +- بدون تغییر محتوای PDF؛ فایل‌ها همان‌طور که هستند بسته‌بندی می‌شوند +- نمایش نام و حجم هر PDF بارگذاری‌شده + +## موارد استفاده + +- جمع کردن مجموعه‌ای از فاکتورها یا رسیدها برای پیوست ایمیل +- بسته‌بندی تحویلی‌های پروژه (چند گزارش PDF) برای تحویل +- ساخت یک دانلود واحد برای مجموعه‌ای از فرم‌ها یا الگوها +- بایگانی دسته‌ای از اسناد در یک فایل فشرده + +## نکته‌ها + +- فایل ZIP از نام‌های اصلی فایل‌های PDF استفاده می‌کند. اگر فایل‌های هم‌نام دارید، برای جلوگیری از تداخل پیش از بارگذاری نامشان را تغییر دهید. +- این ابزار خود PDFها را فشرده نمی‌کند. برای کاهش حجم، ابتدا آن‌ها را از فشرده‌سازی PDF عبور دهید و سپس با این ابزار بسته‌بندی کنید. + +## ابزارهای مرتبط + +- [ادغام PDF](./merge-pdf) +- [تقسیم PDF](./split-pdf) +- [فشرده‌سازی PDF](./compress-pdf) diff --git a/docs/fa/tools/pdf-workflow.md b/docs/fa/tools/pdf-workflow.md new file mode 100644 index 00000000..70d82342 --- /dev/null +++ b/docs/fa/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: سازندهٔ گردش کار PDF +description: خطوط پردازش PDF سفارشی را با اتصال گره‌ها روی بوم به‌صورت بصری بسازید. عملیاتی مانند ادغام، فشرده‌سازی، واترمارک و صدور را زنجیره کنید. +--- + +# سازندهٔ گردش کار PDF + +سازندهٔ گردش کار به شما امکان می‌دهد چند عملیات PDF را در یک خط پردازش خودکار زنجیره کنید. به‌جای اجرای ابزارها یکی‌یکی، یک گراف بصری از گره‌ها (ورودی، پردازش، خروجی) می‌سازید و همه را با یک کلیک اجرا می‌کنید. فایل‌های شما هرگز از مرورگر خارج نمی‌شوند. + +## نحوهٔ کار + +رابط به سه پنل تقسیم می‌شود: **جعبه‌ابزار گره‌ها** در سمت چپ، **بوم** در وسط و **پنل تنظیمات** در سمت راست که با انتخاب یک گره نمایش داده می‌شود. + +1. **گره‌ها را اضافه کنید**: روی آن‌ها در نوار کناری چپ کلیک کنید یا مستقیماً روی بوم بکشید. از نوار جستجو در بالای جعبه‌ابزار برای فیلتر بر اساس نام استفاده کنید. +2. **گره‌ها را متصل کنید**: از یک سوکت خروجی (پایین گره) به یک سوکت ورودی (بالای گرهٔ دیگر) بکشید. اتصال‌ها از بالا به پایین جریان دارند. +3. **تنظیمات را پیکربندی کنید**: روی یک گره کلیک کنید تا پنل تنظیمات آن در سمت راست باز شود. هر نوع گره گزینه‌های خودش را دارد (بازه‌های صفحه، لغزنده‌های کیفیت، گذرواژه‌ها و غیره). +4. **گردش کار را اجرا کنید**: روی دکمهٔ **اجرا** در نوار ابزار کلیک کنید. موتور گره‌ها را به ترتیب توپولوژیک اجرا می‌کند و هر کدام را به‌ترتیب پردازش می‌کند. یک نوار وضعیت در پایین پیشرفت را نشان می‌دهد. +5. **نتایج را دانلود کنید**: گرهٔ پایانی دانلود، PDF نهایی (یا در صورت تولید چند فایل، ZIP) را ذخیره می‌کند. + +## دسته‌های گره + +گره‌ها در شش دسته سازماندهی شده‌اند که هر کدام روی بوم رنگ مخصوص خود را دارد: + +- **ورودی** (آبی): ورودی PDF، ورودی تصویر، Word/Excel/PowerPoint به PDF و بیش از 15 مبدل قالب دیگر که فایل‌ها را وارد خط پردازش می‌کنند. +- **ویرایش و حاشیه‌نویسی** (نیلی): برش PDF، PDF به خاکستری، وارونه‌سازی رنگ‌ها، افزودن واترمارک، شماره‌گذاری صفحات، سرصفحه و پاصفحه، جلوهٔ اسکنر، تنظیم رنگ‌ها، رنگ پس‌زمینه، حذف صفحات خالی، حذف حاشیه‌نویسی‌ها. +- **سازماندهی و مدیریت** (بنفش): ادغام PDF، تقسیم PDF، استخراج صفحات، چرخاندن PDF، حذف صفحات، وارونه‌سازی ترتیب صفحات، افزودن صفحهٔ خالی، تقسیم صفحات، N-Up کردن PDF، اصلاح اندازهٔ صفحه، ترکیب در یک صفحه، دفترچهٔ PDF، پوستری‌کردن PDF، ویرایش فراداده، فهرست مطالب، OCR روی PDF. +- **بهینه‌سازی و تعمیر** (کهربایی): فشرده‌سازی PDF، رستر کردن PDF، خطی‌سازی PDF، صاف‌کردن PDF، PDF به PDF/A، تبدیل قلم به خطوط برداری، ترمیم PDF. +- **ایمن‌سازی PDF** (صورتی): رمزگذاری، رمزگشایی، پاک‌سازی PDF، مسطح‌سازی PDF، امضای دیجیتال، ردگیری. +- **خروجی** (سبزآبی): دانلود (تشخیص خودکار PDF تکی در برابر ZIP)، PDF به تصاویر، PDF به متن، PDF به DOCX، PDF به XLSX، PDF به CSV، PDF به SVG، PDF به Markdown، استخراج تصاویر. + +## ذخیره و بارگذاری گردش‌کارها + +نوار ابزار چهار گزینهٔ ماندگاری ارائه می‌دهد: + +- **ذخیره**: گردش کار فعلی را به‌صورت یک الگوی نام‌دار در حافظهٔ محلی مرورگر ذخیره می‌کند. می‌توانید چند الگو ذخیره کنید. +- **بارگذاری**: پنجره‌ای با فهرست همهٔ الگوهای ذخیره‌شده باز می‌کند. برای بازیابی یکی روی بارگذاری کلیک کنید یا الگوهایی را که دیگر لازم ندارید حذف کنید. +- **صدور**: گردش کار را به‌صورت فایل `.json` دانلود می‌کند تا بتوانید آن را به اشتراک بگذارید یا پشتیبان بگیرید. +- **ورود**: یک فایل گردش کار `.json` را از دیسک بارگذاری می‌کند و همهٔ گره‌ها، موقعیت‌ها و اتصال‌ها را بازیابی می‌کند. + +الگوها در حافظهٔ محلی بین نشست‌ها باقی می‌مانند. فایل‌های JSON صادرشده بین مرورگرها و دستگاه‌ها قابل انتقال‌اند. + +## مدل اجرا + +موتور از روی اتصال‌های شما یک گراف وابستگی می‌سازد و گره‌ها را به ترتیب توپولوژیک اجرا می‌کند. اگر گره‌ای ناموفق باشد، اجرا متوقف و آن گره قرمز علامت‌گذاری می‌شود. چند قاعده را در نظر داشته باشید: + +- هر گردش کار دست‌کم به یک گرهٔ **ورودی** و یک گرهٔ **خروجی** نیاز دارد. +- موتور وابستگی‌های چرخشی را تشخیص می‌دهد و اجرا را با خطا متوقف می‌کند. +- گرهٔ **رمزگذاری** باید آخرین مرحلهٔ پردازش پیش از گرهٔ خروجی باشد. قرار دادن آن در مراحل قبلی هشدار اعتبارسنجی ایجاد می‌کند، چون گره‌های بعدی نمی‌توانند روی دادهٔ رمزگذاری‌شده کار کنند. +- PDFهای محافظت‌شده با گذرواژه هنگام اجرا گذرواژه را درخواست می‌کنند. +- ورودی‌های چند PDF پشتیبانی می‌شوند؛ گرهٔ ادغام PDF می‌تواند آن‌ها را ترکیب کند، یا گره‌های پردازش دسته‌ای هر PDF را جداگانه پردازش می‌کنند. + +## انواع سوکت + +اتصال‌ها از سوکت‌های نوع‌دار برای جلوگیری از سیم‌کشی نامعتبر استفاده می‌کنند: + +- **PDF** (نیلی): یک سند PDF. +- **MultiPDF** (کهربایی): چند سند PDF که با هم بسته‌بندی شده‌اند. +- **Image** (سبز): یک blob تصویر. + +## گزینه‌ها + +هر گره پیکربندی خودش را دارد که از پنل تنظیمات سمت راست در دسترس است. الگوهای رایج عبارت‌اند از: + +- **بازه‌های صفحه** در گره‌های تقسیم PDF، استخراج صفحات و حذف صفحات +- **لغزنده‌های کیفیت** در گره‌های خروجی تبدیل تصویر +- **فیلدهای گذرواژه** در گره‌های رمزگذاری و رمزگشایی +- **ورودی‌های متنی** برای افزودن واترمارک، سرصفحه و پاصفحه و ویرایش فراداده +- **زاویه‌های چرخش** در گرهٔ چرخاندن PDF +- **سطح فشرده‌سازی** در گرهٔ فشرده‌سازی PDF +- **انتخاب زبان OCR** در گرهٔ OCR روی PDF + +## موارد استفاده + +- **خط پردازش فاکتور**: ورودی PDF -> OCR روی PDF -> استخراج جدول‌های PDF -> دانلود به‌صورت CSV. +- **یکسان‌سازی گزارش**: Word به PDF -> اصلاح اندازهٔ صفحه -> شماره‌گذاری صفحات -> افزودن واترمارک -> فشرده‌سازی PDF -> دانلود. +- **آماده‌سازی بایگانی**: ورودی PDF -> ترمیم PDF -> مسطح‌سازی PDF -> پاک‌سازی PDF -> PDF به PDF/A -> دانلود. +- **استخراج دسته‌ای تصاویر**: ورودی PDF (چند فایل) -> استخراج تصاویر -> دانلود ZIP. +- **دفترچه‌های آمادهٔ چاپ**: ورودی PDF -> دفترچهٔ PDF -> برش PDF -> فشرده‌سازی PDF -> دانلود. +- **توزیع امن**: ورودی PDF -> ردگیری -> حذف حاشیه‌نویسی‌ها -> رمزگذاری -> دانلود. + +## نکته‌ها + +- برای حذف گرهٔ انتخاب‌شده از بوم از **Delete** یا **Backspace** استفاده کنید. +- برای حذف مستقیم یک گره روی دکمهٔ **X** در نوار وضعیت آن کلیک کنید. +- با کلیک و کشیدن روی فضای خالی، بوم را جابه‌جا کنید. هنگام جابه‌جایی نشانگر به نماد دست تغییر می‌کند. +- در موبایل از دکمهٔ **+** در نوار ابزار برای نمایش یا پنهان کردن جعبه‌ابزار گره‌ها استفاده کنید. +- اگر گردش کار شما چند فایل خروجی تولید کند، گرهٔ دانلود آن‌ها را خودکار در یک ZIP بسته‌بندی می‌کند. +- ساده شروع کنید: پیش از افزودن پیچیدگی، یک خط پردازش دوگره‌ای بسازید و آزمایش کنید. + +## ابزارهای مرتبط + +- [PDF به متن](./pdf-to-text) +- [PDF به Excel](./pdf-to-excel) +- [استخراج تصاویر](./extract-images) +- [PDF به Markdown](./pdf-to-markdown) diff --git a/docs/fa/tools/png-to-pdf.md b/docs/fa/tools/png-to-pdf.md new file mode 100644 index 00000000..01e17ce5 --- /dev/null +++ b/docs/fa/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG به PDF +description: یک یا چند تصویر PNG را با کیفیت قابل‌تنظیم، کاملاً در مرورگر خود، به یک سند PDF تبدیل کنید. +--- + +# PNG به PDF + +تصاویر PNG را با حفظ وضوح کامل به PDF تبدیل کنید. هر PNG به یک صفحهٔ جداگانه با اندازهٔ منطبق بر ابعاد تصویر اصلی تبدیل می‌شود. شفافیت خودکار مدیریت می‌شود. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :------ | +| PNG | `.png` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های PNG را بکشید و رها کنید. می‌توانید چند فایل را هم‌زمان انتخاب کنید. +2. فهرست فایل‌ها را مدیریت کنید: فایل‌های ناخواسته را حذف یا فایل‌های بیشتری اضافه کنید. +3. از فهرست کشویی یک سطح **کیفیت PDF** انتخاب کنید. +4. روی **تبدیل به PDF** کلیک کنید. خروجی به‌صورت `from_jpgs.pdf` دانلود می‌شود. + +ابزار از pdf-lib برای جاسازی مستقیم هر تصویر استفاده می‌کند. اگر PNG به‌صورت بومی قابل جاسازی نباشد (مثلاً به دلیل نمایهٔ رنگی غیرمعمول)، از طریق canvas دوباره به‌صورت JPEG رندر می‌شود. + +## گزینه‌ها + +**کیفیت PDF** فشرده‌سازی اعمال‌شده پیش از جاسازی را کنترل می‌کند: + +- **کیفیت بالا**: کمترین فشرده‌سازی، بیشترین حجم فایل. +- **کیفیت متوسط** (پیش‌فرض): تعادل خوب بین حجم و وضوح. +- **کیفیت پایین**: بیشترین فشرده‌سازی، کوچک‌ترین خروجی. + +## موارد استفاده + +- تبدیل اسکرین‌شات‌ها به یک PDF چندصفحه‌ای برای گزارش اشکال یا مستندات +- بسته‌بندی خروجی‌های طراحی رابط کاربری در یک فایل برای بازبینی +- تبدیل خروجی‌های دیاگرام (draw.io، Excalidraw) به یک PDF قابل اشتراک +- گردآوری مجموعه‌ای از تصاویر نمودار در یک گزارش + +## نکته‌ها + +- فایل‌های PNG دارای شفافیت در PDF پس‌زمینهٔ سفید می‌گیرند. اگر پس‌زمینهٔ دیگری می‌خواهید، تصاویر را از قبل ویرایش کنید. +- برای اسکرین‌شات‌ها و دیاگرام‌هایی با لبه‌های تیز و متن، کیفیت بالا از اثرات فشرده‌سازی JPEG جلوگیری می‌کند. کیفیت متوسط یا پایین ممکن است در داخل به JPEG تبدیل کنند. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [JPG به PDF](./jpg-to-pdf) +- [SVG به PDF](./svg-to-pdf) diff --git a/docs/fa/tools/posterize-pdf.md b/docs/fa/tools/posterize-pdf.md new file mode 100644 index 00000000..a5ea3b7d --- /dev/null +++ b/docs/fa/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: پوستری‌کردن PDF +description: صفحات PDF را به شبکه‌ای از صفحات کوچک‌تر تقسیم کنید تا در قطع بزرگ روی چند برگه چاپ شوند. +--- + +# پوستری‌کردن PDF + +هر صفحهٔ PDF را به شبکه‌ای از زیرصفحه‌های کوچک‌تر تقسیم کنید. این ابزار برای چاپ یک صفحه روی چند برگه کاغذ است که سپس آن‌ها را کنار هم می‌چینید تا یک پوستر یا بنر بزرگ بسازید. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. تعداد **ردیف‌ها** و **ستون‌ها** را برای تعریف شبکه تنظیم کنید (مثلاً ۲ ردیف در ۲ ستون هر صفحه را به ۴ زیرصفحه تقسیم می‌کند). +3. در صورت تمایل یک بازهٔ صفحات مشخص کنید تا فقط صفحات خاصی پوستری شوند. +4. بوم پیش‌نمایش یک شبکهٔ روی صفحهٔ فعلی نشان می‌دهد تا محل برش‌ها را ببینید. +5. بین صفحات جابه‌جا شوید تا شبکه را روی صفحات مختلف بررسی کنید. +6. روی دکمهٔ پردازش کلیک کنید. هر خانهٔ شبکه به یک صفحهٔ جداگانه در PDF خروجی تبدیل می‌شود. + +## ویژگی‌ها + +- تعداد ردیف و ستون قابل تنظیم برای اندازه‌های متنوع شبکه +- پیش‌نمایش زنده با شبکه‌ای که دقیقاً محل تقسیم صفحات را نشان می‌دهد +- فیلتر بازهٔ صفحات برای پوستری‌کردن فقط صفحات خاص +- پیمایش صفحه به صفحه در پیش‌نمایش +- ذخیرهٔ موقت تصویر صفحات برای پیمایش سریع پیش‌نمایش +- خطوط قرمز خط‌چین مرز برش‌ها را به‌وضوح مشخص می‌کنند + +## گزینه‌ها + +| گزینه | توضیح | +| --------------- | -------------------------------------------- | +| **ردیف‌ها** | تعداد تقسیم‌های افقی (پیش‌فرض: ۱) | +| **ستون‌ها** | تعداد تقسیم‌های عمودی (پیش‌فرض: ۱) | +| **بازهٔ صفحات** | صفحاتی که پوستری می‌شوند (خالی = همهٔ صفحات) | + +## موارد استفاده + +- چاپ یک PDF در اندازهٔ پوستر روی برگه‌های استاندارد A4 یا Letter برای چیدن روی دیوار +- ساخت بنرهای بزرگ از طرح PDF تک‌صفحه‌ای +- تقسیم نقشه‌های فنی بزرگ به قطعات قابل چاپ +- چاپ در قطع بزرگ بدون دسترسی به چاپگر عریض + +## نکته‌ها + +- شبکهٔ 2x2 یک صفحه را به ۴ صفحه و شبکهٔ 3x3 یک صفحه را به ۹ صفحه تبدیل می‌کند. شبکه را بر اساس اندازهٔ نهایی مورد نظر برنامه‌ریزی کنید. +- شبکهٔ پیش‌نمایش کمک می‌کند مطمئن شوید محتوای مهم روی خط برش قرار نمی‌گیرد. در صورت نیاز ردیف‌ها یا ستون‌ها را تغییر دهید. +- برای عملیات معکوس (قرار دادن چند صفحه روی یک برگه)، از [N-Up کردن PDF](./n-up-pdf) استفاده کنید. + +## ابزارهای مرتبط + +- [N-Up کردن PDF](./n-up-pdf) +- [تقسیم صفحات](./divide-pages) +- [تقسیم PDF](./split-pdf) diff --git a/docs/fa/tools/powerpoint-to-pdf.md b/docs/fa/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..c9e83aaf --- /dev/null +++ b/docs/fa/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint به PDF +description: ارائه‌های PowerPoint (PPT، PPTX) و فایل‌های ODP را با حفظ قالب‌بندی اسلایدها به PDF تبدیل کنید. +--- + +# PowerPoint به PDF + +فایل‌های ارائه را به PDF تبدیل کنید. هر اسلاید به یک صفحه در سند خروجی تبدیل می‌شود و متن، تصاویر، شکل‌ها و جلوه‌ها با موتور LibreOffice در مرورگر رندر می‌شوند. از قالب‌های جدید و قدیمی PowerPoint و همچنین قالب OpenDocument Presentation پشتیبانی می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :------------------------ | :------ | +| PowerPoint (جدید) | `.pptx` | +| PowerPoint (قدیمی) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های ارائه را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. در صورت نیاز فایل اضافه یا حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور LibreOffice در اولین استفاده بارگذاری می‌شود و سپس هر فایل را تبدیل می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در `powerpoint-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +این ابزار تنظیمات اضافی ندارد. اسلایدها در ابعاد اصلی خود رندر می‌شوند. + +## خروجی + +| تعداد ورودی | خروجی | +| :-------------- | :---------------------------------------------------------------- | +| ۱ فایل | دانلود یک PDF (نام اصلی فایل با پسوند `.pdf`) | +| ۲ فایل یا بیشتر | بایگانی ZIP (`powerpoint-converted.zip`) شامل یک PDF برای هر فایل | + +## موارد استفاده + +- تبدیل ارائه به PDF پیش از اشتراک با مخاطبانی که ممکن است PowerPoint نداشته باشند +- ساخت نسخهٔ چاپی جزوه از اسلایدها برای همایش یا کارگاه +- بایگانی ارائه‌ها در قالبی که روی همهٔ دستگاه‌ها یکسان نمایش داده می‌شود +- تبدیل دسته‌ای مجموعه‌ای از ارائه‌های ODP از LibreOffice Impress به PDF +- تهیهٔ نسخهٔ PDF از ارائهٔ معرفی کسب‌وکار برای پیوست ایمیل + +## نکته‌ها + +- انیمیشن‌ها و جلوه‌های گذار اسلایدها در PDF نمایش داده نمی‌شوند. هر اسلاید به‌صورت یک صفحهٔ ثابت ثبت می‌شود. +- ویدیوهای جاسازی‌شده در خروجی نمایش داده نمی‌شوند. در صورت نیاز آن‌ها را با یک اسکرین‌شات یا تصویر جایگزین کنید. +- یادداشت‌های سخنران در خروجی پیش‌فرض PDF گنجانده نمی‌شوند. اگر به یادداشت‌ها نیاز دارید، ابتدا از نمای «چاپ یادداشت‌ها» در خود PowerPoint خروجی بگیرید. +- موتور LibreOffice پس از اولین بارگذاری ذخیره می‌شود، بنابراین تبدیل ارائهٔ دوم در همان نشست بسیار سریع‌تر است. + +## ابزارهای مرتبط + +- [Word به PDF](./word-to-pdf) +- [Excel به PDF](./excel-to-pdf) +- [تصاویر به PDF](./image-to-pdf) diff --git a/docs/fa/tools/prepare-pdf-for-ai.md b/docs/fa/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..e2e51de1 --- /dev/null +++ b/docs/fa/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: آماده‌سازی PDF برای هوش مصنوعی +description: محتوای PDF را به JSON ساختاریافته و بهینه برای LLMها و خطوط پردازش هوش مصنوعی مانند LlamaIndex استخراج کنید. از پردازش دسته‌ای پشتیبانی می‌کند. +--- + +# آماده‌سازی PDF برای هوش مصنوعی + +محتوای فایل‌های PDF را استخراج کرده و به‌صورت JSON بهینه برای ورود به مدل‌های زبانی بزرگ (LLM) و چارچوب‌های هوش مصنوعی مانند LlamaIndex ساختاردهی می‌کند. محتوای هر صفحه استخراج شده و در قالبی ساختاریافته، آماده برای خطوط RAG، چت‌بات‌ها یا سامانه‌های جست‌وجوی معنایی، سازماندهی می‌شود. + +## نحوهٔ کار + +1. یک یا چند PDF را با کلیک روی ناحیهٔ رها کردن یا کشیدن فایل‌ها روی آن بارگذاری کنید. +2. برای شروع پردازش روی **استخراج** کلیک کنید. +3. یک فایل به‌صورت `filename_llm.json` دانلود می‌شود. چند فایل یک بایگانی `pdf-for-ai.zip` تولید می‌کنند. + +این ابزار از یکپارچگی PyMuPDF با LlamaIndex برای استخراج محتوای سطح صفحه همراه با فراداده استفاده می‌کند و خروجی‌ای تولید می‌کند که مستقیماً در چارچوب‌های هوش مصنوعی قابل بارگذاری است. + +## گزینه‌ها + +این ابزار گزینهٔ قابل تنظیمی ندارد. همهٔ صفحات با متن کامل و فراداده استخراج می‌شوند. + +## قالب خروجی + +- **یک فایل**: `filename_llm.json` +- **چند فایل**: `pdf-for-ai.zip` شامل یک `_llm.json` برای هر PDF ورودی. + +خروجی JSON از طرح‌وارهٔ سند LlamaIndex با محتوای متنی و فیلدهای فرادادهٔ هر صفحه پیروی می‌کند. + +## موارد استفاده + +- آماده‌سازی اسناد PDF برای خطوط تولید تقویت‌شده با بازیابی (RAG). +- ساخت پایگاه دانش قابل جست‌وجو از بایگانی‌های PDF برای یک چت‌بات هوش مصنوعی. +- ارسال گزارش‌های PDF به جریان‌های تحلیل مبتنی بر LLM. +- پیش‌پردازش مقالات پژوهشی برای سامانه‌های جست‌وجوی معنایی و پرسش و پاسخ. +- ساخت داده‌های آموزشی ساختاریافته از مجموعه‌های اسناد PDF. + +## نکته‌ها + +- برای استخراج متن ساده بدون قالب‌بندی ویژهٔ هوش مصنوعی، از [PDF به متن](./pdf-to-text) استفاده کنید. +- برای خروجی Markdown که سرفصل‌ها و ساختار را حفظ می‌کند، از [PDF به Markdown](./pdf-to-markdown) استفاده کنید. +- PDFهای اسکن‌شده خروجی خالی یا ناچیزی تولید می‌کنند. ابتدا آن‌ها را با OCR پردازش کنید تا پیش از استخراج یک لایهٔ متنی اضافه شود. + +## ابزارهای مرتبط + +- [PDF به متن](./pdf-to-text) +- [PDF به Markdown](./pdf-to-markdown) +- [PDF به JSON](./pdf-to-json) diff --git a/docs/fa/tools/protect-pdf.md b/docs/fa/tools/protect-pdf.md new file mode 100644 index 00000000..9db9959f --- /dev/null +++ b/docs/fa/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: محافظت از PDF +description: از فایل‌های PDF با رمزگذاری AES ۲۵۶ بیتی محافظت کنید. رمز کاربر و رمز مالک را با محدودیت‌های استفادهٔ قابل تنظیم تعیین کنید. +--- + +# محافظت از PDF + +PDF خود را پشت یک رمز عبور قفل کنید تا فقط افراد مجاز بتوانند آن را باز کنند. BentoPDF از رمزگذاری AES ۲۵۶ بیتی استفاده می‌کند (همان استانداردی که بانک‌ها و نهادهای دولتی به کار می‌برند) و کاملاً در مرورگر شما با QPDF اعمال می‌شود. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. یک **رمز کاربر** (الزامی) وارد کنید. این رمزی است که افراد برای باز کردن فایل به آن نیاز دارند. +3. در صورت تمایل یک **رمز مالک** وارد کنید. با تعیین آن، PDF محدودیت‌هایی می‌گیرد که از چاپ، ویرایش، کپی و حاشیه‌نویسی جلوگیری می‌کند. +4. روی **رمزگذاری PDF** کلیک کنید. +5. فایل رمزگذاری‌شده را دانلود کنید. + +## انواع رمز عبور + +### رمز کاربر (الزامی) + +رمز کاربر همان چیزی است که گیرندگان برای باز کردن PDF وارد می‌کنند. بدون آن، سند کاملاً غیرقابل دسترس است. هر PDF رمزگذاری‌شده باید یکی داشته باشد. + +### رمز مالک (اختیاری) + +رمز مالک تعیین می‌کند کاربر مجاز پس از باز کردن فایل چه کارهایی می‌تواند انجام دهد. وقتی یک رمز مالک متفاوت تعیین می‌کنید، BentoPDF به‌طور خودکار سخت‌گیرانه‌ترین مجموعهٔ محدودیت‌ها را اعمال می‌کند: + +- غیرفعال‌شدن تغییر +- غیرفعال‌شدن استخراج/کپی +- غیرفعال‌شدن چاپ +- غیرفعال‌شدن حاشیه‌نویسی +- غیرفعال‌شدن پر کردن فرم +- غیرفعال‌شدن مونتاژ سند + +اگر رمز مالک را خالی بگذارید، PDF رمزگذاری می‌شود (همچنان برای باز شدن به رمز کاربر نیاز دارد) اما پس از باز شدن هیچ محدودیت استفاده‌ای ندارد. + +## جزئیات رمزگذاری + +- **الگوریتم**: AES-256 (استاندارد رمزگذاری پیشرفتهٔ ۲۵۶ بیتی) +- **طول کلید**: ۲۵۶ بیت +- **استاندارد**: رمزگذاری PDF 2.0 (پیاده‌سازی QPDF) + +شکستن AES-256 با حملهٔ جست‌وجوی فراگیر با فناوری فعلی از نظر محاسباتی ناممکن است. امنیت PDF رمزگذاری‌شدهٔ شما کاملاً به قدرت رمز عبورتان بستگی دارد. + +## موارد استفاده + +- محافظت از گزارش‌های مالی محرمانه پیش از ارسال با ایمیل +- ایمن‌سازی اسناد حقوقی که با وکیل طرف مقابل به اشتراک گذاشته می‌شوند +- افزودن رمز عبور به پرونده‌های پزشکی یا اطلاعات شناسایی شخصی +- توزیع محتوای پولی (کتاب الکترونیکی، گزارش) با کنترل دسترسی +- رعایت سیاست‌های حفاظت از داده که رمزگذاری داده‌های ذخیره‌شده را الزامی می‌کنند + +## نکته‌ها + +- از یک رمز عبور قوی و منحصربه‌فرد استفاده کنید. یک عبارت عبور ۱۲ نویسه‌ای یا بیشتر با حروف کوچک و بزرگ، اعداد و نمادها ایده‌آل است. +- رمز عبور را از طریق کانالی جداگانه (تلفن، پیامک) به اشتراک بگذارید، هرگز در همان ایمیلی که PDF را می‌فرستید. +- اگر فقط می‌خواهید کارها را محدود کنید (بدون چاپ، بدون کپی) بدون اینکه برای باز کردن رمز لازم باشد، به‌جای آن از ابزار تغییر مجوزها استفاده کنید. + +## ابزارهای مرتبط + +- [رمزگشایی PDF](./unlock-pdf): حذف رمزگذاری وقتی رمز عبور را می‌دانید +- [تغییر مجوزها](./change-permissions): تغییر محدودیت‌های استفادهٔ خاص +- [حذف محدودیت‌ها](./remove-restrictions): حذف تمام امنیت از یک PDF +- [پاک‌سازی PDF](./sanitize-pdf): حذف محتوای پنهان پیش از رمزگذاری diff --git a/docs/fa/tools/psd-to-pdf.md b/docs/fa/tools/psd-to-pdf.md new file mode 100644 index 00000000..68320031 --- /dev/null +++ b/docs/fa/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD به PDF +description: فایل‌های Photoshop (PSD) را در مرورگر به PDF تبدیل کنید. رایگان، خصوصی و بدون نیاز به نرم‌افزار Adobe. +--- + +# PSD به PDF + +فایل‌های PSD برنامهٔ Adobe Photoshop را به سند PDF تبدیل کنید. PSD قالب اصلی Photoshop است و باز کردن آن معمولاً به نرم‌افزار گران Adobe نیاز دارد. این ابزار تصویر ترکیبی یکپارچهٔ فایل PSD را به‌صورت یک صفحهٔ PDF با وضوح کامل رندر می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :-------------- | :----- | :---------------------------------- | +| Adobe Photoshop | `.psd` | تصویر ترکیبی یکپارچه را رندر می‌کند | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های PSD را بکشید و رها کنید. از چند فایل پشتیبانی می‌شود. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های ناخواسته را با نماد سطل زباله حذف کنید یا با **افزودن فایل‌های بیشتر** فایل اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور PyMuPDF فایل PSD را می‌خواند و تصویر ترکیبی را با وضوح اصلی در یک صفحهٔ PDF جاسازی می‌کند. +4. یک PSD یک PDF تولید می‌کند. وقتی چند فایل PSD بارگذاری می‌کنید، در یک PDF چندصفحه‌ای به نام `psd_to_pdf.pdf` ترکیب می‌شوند و هر PSD یک صفحه می‌شود. + +## گزینه‌ها + +نیازی به تنظیمات نیست. مبدل از دادهٔ تصویر یکپارچهٔ فایل PSD استفاده می‌کند. + +## موارد استفاده + +- پیش‌نمایش طرح‌های Photoshop بدون باز کردن Photoshop +- ارسال نمونهٔ طرح برای مشتریانی که Adobe Creative Suite ندارند +- چاپ آثار هنری با وضوح بالا از فایل‌های PSD +- ساخت نمونه‌کار PDF از چند فایل طراحی PSD، که هر کدام یک صفحه در یک سند می‌شود + +## نکته‌ها + +- تبدیل، نمای ترکیبی (یکپارچه) PSD را رندر می‌کند. لایه‌های جداگانه، لایه‌های تنظیم و جلوه‌های لایه به‌صورت عناصر جداگانه در PDF حفظ نمی‌شوند. +- چند فایل PSD به‌جای PDFهای جداگانه در یک PDF چندصفحه‌ای ادغام می‌شوند. این برای ساخت نمونه‌کار یا کاتالوگ مفید است. +- فایل‌های PSD با وضوح بسیار بالا (فایل‌های چاپی ۳۰۰ DPI یا بیشتر) PDFهای حجیمی تولید می‌کنند. ابزار وضوح کامل را حفظ می‌کند. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [PNG به PDF](./png-to-pdf) +- [VSD به PDF](./vsd-to-pdf) diff --git a/docs/fa/tools/pub-to-pdf.md b/docs/fa/tools/pub-to-pdf.md new file mode 100644 index 00000000..b453d40e --- /dev/null +++ b/docs/fa/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB به PDF +description: فایل‌های Microsoft Publisher (PUB) را در مرورگر به PDF تبدیل کنید. رایگان، خصوصی و بدون نیاز به نرم‌افزار. +--- + +# PUB به PDF + +فایل‌های Microsoft Publisher را به PDF تبدیل کنید. Publisher یک ابزار صفحه‌آرایی رومیزی است که همراه برخی نسخه‌های Microsoft Office عرضه می‌شود، اما بیشتر افراد آن را نصب ندارند. این ابزار به هر کسی اجازه می‌دهد فایل‌های PUB را مستقیماً در مرورگر به PDF تبدیل کند، بدون نیاز به نرم‌افزار Microsoft. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :------------------ | :----- | :---------------------- | +| Microsoft Publisher | `.pub` | اسناد صفحه‌آرایی رومیزی | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های PUB را بکشید و رها کنید. می‌توانید چند فایل را هم‌زمان بارگذاری کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های ناخواسته را با نماد سطل زباله حذف کنید یا برای افزودن روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتوری مبتنی بر LibreOffice در مرورگر بارگذاری می‌شود و هر فایل PUB را با حفظ چیدمان، تصاویر و کادرهای متنی تبدیل می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در یک بایگانی ZIP به نام `pub-to-pdf.zip` تحویل داده می‌شوند. + +## گزینه‌ها + +نیازی به پیکربندی اضافی نیست. مبدل موتور چیدمان PUB را به‌طور خودکار مدیریت می‌کند. + +## موارد استفاده + +- باز کردن بروشور یا خبرنامهٔ PUB از یک مشتری بدون خرید Microsoft Publisher +- تبدیل بولتن‌های کلیسا، برنامه‌های رویداد یا خبرنامه‌های مدرسه که در Publisher ساخته شده‌اند +- بایگانی مواد بازاریابی Publisher در قالبی که همه جا قابل دسترس است +- چاپ فایل‌های PUB روی سیستمی که Publisher نصب ندارد + +## نکته‌ها + +- چیدمان‌های پیچیدهٔ Publisher با کادرهای متنی لایه‌ای و موقعیت‌یابی دقیق ممکن است هنگام تبدیل کمی جابه‌جا شوند. اگر موقعیت دقیق مهم است، خروجی را بررسی کنید. +- موتور LibreOffice در هر نشست یک بار راه‌اندازی می‌شود. اولین تبدیل بیشتر طول می‌کشد و تبدیل‌های بعدی سریع‌ترند. +- برای وفادارترین تبدیل فایل‌های Publisher، مطمئن شوید قلم‌های سفارشی به‌کاررفته در فایل اصلی، قلم‌های استاندارد سیستم هستند. + +## ابزارهای مرتبط + +- [VSD به PDF](./vsd-to-pdf) +- [ODP به PDF](./odp-to-pdf) diff --git a/docs/fa/tools/rasterize-pdf.md b/docs/fa/tools/rasterize-pdf.md new file mode 100644 index 00000000..2a79643b --- /dev/null +++ b/docs/fa/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: رستر کردن PDF +description: صفحات PDF را به PDF مبتنی بر تصویر تبدیل کنید. همهٔ لایه‌ها را یکپارچه کنید، متن قابل انتخاب را حذف کنید و DPI و قالب تصویر را کنترل کنید. +--- + +# رستر کردن PDF + +رستر کردن هر صفحهٔ PDF را به تصویر تبدیل می‌کند و آن تصاویر را دوباره در یک PDF کنار هم می‌گذارد. نتیجه دقیقاً شبیه نسخهٔ اصلی است اما هیچ متن قابل انتخاب، عنصر تعاملی یا لایهٔ قابل ویرایشی ندارد. در واقع یک فتوکپی باکیفیت است. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. +2. **DPI** (وضوح) خروجی رسترشده را تنظیم کنید. +3. یک **قالب تصویر** انتخاب کنید: PNG برای کیفیت بدون افت یا JPEG برای فایل‌های کوچک‌تر. +4. در صورت تمایل **تبدیل به خاکستری** را علامت بزنید. +5. روی **رستر کردن PDF** کلیک کنید. چند فایل به‌صورت ZIP دانلود می‌شوند. + +## گزینه‌ها + +| تنظیم | مقادیر | پیش‌فرض | +| -------------- | ------------------------------ | ------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **قالب تصویر** | PNG (بدون افت)، JPEG (کوچک‌تر) | PNG | +| **خاکستری** | روشن/خاموش | خاموش | + +## راهنمای DPI + +- **72**: فقط مشاهده روی صفحه‌نمایش، کمترین حجم فایل +- **150**: تعادل خوب برای استفادهٔ عمومی +- **200**: متن واضح‌تر، حجم فایل متوسط +- **300**: خروجی با کیفیت چاپ +- **600**: بایگانی باکیفیت یا چاپ حرفه‌ای + +## موارد استفاده + +- جلوگیری از استخراج متن از اسناد محرمانه پیش از اشتراک‌گذاری +- رفع مشکلات وابستگی به قلم با تبدیل متن به پیکسل +- ساخت نسخهٔ «تخت» از PDF با لایه‌ها یا شفافیت پیچیده که در نمایشگرهای مختلف متفاوت نمایش داده می‌شود +- آماده‌سازی PDF برای سیستمی که فقط ورودی مبتنی بر تصویر می‌پذیرد +- حذف محتوای پنهان (مانند تغییرات ردیابی‌شده یا دادهٔ فرم) با تبدیل PDF به تصاویر خالص + +## نکته‌ها + +- 150 DPI با PNG یک پیش‌فرض مطمئن است. فقط وقتی به خروجی چاپی یا بزرگ‌نمایی جزئیات ریز نیاز دارید، مقدار بالاتری انتخاب کنید. +- JPEG فایل‌های به‌مراتب کوچک‌تری تولید می‌کند اما روی لبه‌های تیز متن آثار فشرده‌سازی ایجاد می‌کند. +- رستر کردن برگشت‌ناپذیر است. اگر ممکن است بعداً به متن قابل ویرایش نیاز داشته باشید، PDF اصلی را نگه دارید. + +## ابزارهای مرتبط + +- [فشرده‌سازی PDF](./compress-pdf): کاهش حجم فایل PDF رسترشده +- [صاف کردن کجی PDF](./deskew-pdf): صاف کردن صفحات پیش از رستر کردن اسناد اسکن‌شده +- [تبدیل قلم به طرح کلی](./font-to-outline): تبدیل قلم‌ها به مسیرهای برداری اگر می‌خواهید مقیاس‌پذیری حفظ شود +- [یکپارچه‌سازی PDF](./flatten-pdf): یکپارچه‌سازی فرم‌ها بدون تبدیل به تصویر diff --git a/docs/fa/tools/remove-annotations.md b/docs/fa/tools/remove-annotations.md new file mode 100644 index 00000000..89cd18c1 --- /dev/null +++ b/docs/fa/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: حذف حاشیه‌نویسی‌ها +description: همهٔ نظرها، هایلایت‌ها، پیوندها و سایر حاشیه‌نویسی‌های PDF را با یک کلیک حذف کنید. +--- + +# حذف حاشیه‌نویسی‌ها + +PDF خود را با حذف همهٔ حاشیه‌نویسی‌ها پاکیزه کنید: نظرها، هایلایت‌ها، یادداشت‌های چسبان، نشانه‌گذاری متن، پیوندها، مهرها و هر شیء حاشیه‌نویسی دیگری که در سند جاسازی شده است. محتوای اصلی صفحه (متن، تصاویر، گرافیک) دست‌نخورده باقی می‌ماند. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. ابزار تعداد صفحات سند را تشخیص داده و اطلاعات فایل را نمایش می‌دهد. +3. برای پردازش روی **حذف حاشیه‌نویسی‌ها** کلیک کنید. +4. PDF پاک‌شده بدون هیچ حاشیه‌نویسی به‌طور خودکار دانلود می‌شود. + +## ویژگی‌ها + +- حذف همهٔ انواع حاشیه‌نویسی: نظرها، هایلایت‌ها، زیرخط‌ها، خط‌خوردگی‌ها، یادداشت‌های چسبان، مهرها، پیوندها و نشانه‌گذاری فرم +- اعمال روی همهٔ صفحات سند +- حفظ همهٔ محتوای غیرحاشیه‌نویسی (متن، تصاویر، گرافیک برداری، فیلدهای فرم) +- نمایش تعداد صفحات و حجم فایل پیش از پردازش + +## موارد استفاده + +- پاک‌سازی سند پیش از توزیع نهایی پس از چرخهٔ بازبینی‌ای که چند بازبین در آن نظر گذاشته‌اند +- حذف هایلایت‌ها و یادداشت‌های چسبان از یک راهنمای مطالعهٔ مشترک +- حذف حاشیه‌نویسی‌های پیوند از سند پیش از بایگانی +- تهیهٔ نسخهٔ «تمیز» از یک سند حقوقی که در طول مذاکره به‌شدت حاشیه‌نویسی شده است +- حذف نظرهای بازبین از یک دست‌نوشته پیش از ارسال برای چاپ + +## نکته‌ها + +- این ابزار حاشیه‌نویسی‌ها را در سطح ساختار PDF حذف می‌کند، بنابراین نتیجه متن قابل انتخاب و کیفیت اصلی را حفظ می‌کند و رستر کردنی در کار نیست. +- اگر فقط می‌خواهید حاشیه‌نویسی‌های خاصی را حذف کنید، از [ویرایشگر PDF](./edit-pdf) برای حذف تک‌تک آن‌ها استفاده کنید. +- حاشیه‌نویسی‌ها در PDFهای یکپارچه‌شده (که حاشیه‌نویسی‌ها با محتوای صفحه ادغام شده‌اند) قابل حذف نیستند، زیرا دیگر اشیای جداگانه‌ای نیستند. + +## ابزارهای مرتبط + +- [ویرایشگر PDF](./edit-pdf) +- [افزودن واترمارک](./add-watermark) +- [امضای PDF](./sign-pdf) diff --git a/docs/fa/tools/remove-blank-pages.md b/docs/fa/tools/remove-blank-pages.md new file mode 100644 index 00000000..092e87de --- /dev/null +++ b/docs/fa/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: حذف صفحات خالی +description: صفحات خالی یا تقریباً خالی PDF را با حساسیت قابل تنظیم به‌طور خودکار شناسایی و حذف کنید. +--- + +# حذف صفحات خالی + +PDF خود را برای یافتن صفحات خالی یا تقریباً خالی بررسی کنید و آن‌ها را به‌طور خودکار حذف کنید. ابزار هر صفحه را رندر کرده و محتوای پیکسلی آن را تحلیل می‌کند تا خالی بودن آن را تشخیص دهد، سپس پیش از پردازش به شما اجازه می‌دهد صفحات حذفی را تأیید کنید. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. لغزندهٔ **حساسیت** را تنظیم کنید تا میزان سخت‌گیری در تعریف «خالی» مشخص شود. +3. برای بررسی سند روی **شناسایی صفحات خالی** کلیک کنید. +4. ابزار تصاویر کوچک صفحات خالی شناسایی‌شده را نشان می‌دهد تا آن‌ها را بررسی کنید. +5. انتخاب را تأیید کنید و PDF پاک‌شده بدون صفحات خالی را دانلود کنید. + +## گزینه‌ها + +- **حساسیت**: لغزنده‌ای از ۰٪ تا ۱۰۰٪ (پیش‌فرض ۸۰٪). مقادیر بالاتر سخت‌گیرانه‌ترند و فقط صفحاتی را علامت می‌زنند که کاملاً یا تقریباً سفیدند. مقادیر پایین‌تر سهل‌گیرترند و صفحاتی با محتوای ناچیز مانند یک نقطه یا واترمارک کم‌رنگ را هم شناسایی می‌کنند. + +## ویژگی‌ها + +- تحلیل سطح پیکسل هر صفحه برای شناسایی محتوای خالی +- لغزندهٔ حساسیت قابل تنظیم برای تنظیم دقیق شناسایی +- پیش‌نمایش تصاویر کوچک صفحات خالی شناسایی‌شده برای تأیید دستی +- حفظ دقیق همهٔ صفحات غیرخالی +- پشتیبانی از اسناد با هر اندازه یا تعداد صفحه +- نمایش پیشرفت هنگام بررسی + +## موارد استفاده + +- پاک‌سازی اسناد اسکن‌شده که اسکنر پشت خالی برگه‌های یک‌رو را هم ثبت کرده است +- حذف صفحات جداکننده از دسته‌های اسناد اسکن‌شدهٔ انبوه +- حذف صفحات خالی که سامانه‌های مدیریت اسناد درج کرده‌اند +- پاک‌سازی PDFهای خروجی از واژه‌پردازها که گاهی صفحات خالی انتهایی دارند +- کاهش حجم فایل با حذف صفحات خالی غیرضروری + +## نکته‌ها + +- با حساسیت پیش‌فرض ۸۰٪ شروع کنید و از آنجا تنظیم کنید. اگر ابزار صفحاتی را که به نظرتان خالی‌اند نادیده می‌گیرد، حساسیت را کاهش دهید. اگر صفحاتی با محتوای کم‌رنگ را که می‌خواهید نگه دارید علامت می‌زند، آن را افزایش دهید. +- ابزار هر صفحه را برای تحلیل محتوا رندر می‌کند، بنابراین زمان پردازش با تعداد صفحات افزایش می‌یابد. برای اسناد بسیار بزرگ کمی منتظر بمانید. +- پیش از تأیید حذف، صفحات خالی شناسایی‌شده را در پیش‌نمایش بررسی کنید. صفحاتی با سرصفحه، پاصفحه یا واترمارک کم‌رنگ بسته به تنظیم حساسیت ممکن است علامت بخورند. + +## ابزارهای مرتبط + +- [برش PDF](./crop-pdf) +- [ویرایشگر PDF](./edit-pdf) +- [شماره‌گذاری صفحات](./page-numbers) diff --git a/docs/fa/tools/remove-metadata.md b/docs/fa/tools/remove-metadata.md new file mode 100644 index 00000000..fe67f3e2 --- /dev/null +++ b/docs/fa/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: حذف فراداده +description: همهٔ فراداده‌های پنهان فایل‌های PDF از جمله نویسنده، عنوان، تاریخ ایجاد، تولیدکننده، دادهٔ XMP و شناسه‌های سند را حذف کنید. +--- + +# حذف فراداده + +هر PDF فراداده‌ای دارد که می‌تواند نشان دهد چه کسی آن را ساخته، از چه نرم‌افزاری استفاده شده، آخرین بار کی تغییر کرده و موارد دیگر. این ابزار همهٔ آن را حذف می‌کند (دیکشنری اطلاعات، جریان‌های فرادادهٔ XMP، شناسه‌های سند و داده‌های ویژهٔ برنامه‌ها) و سندی تمیز بدون هیچ ردی از منشأ آن باقی می‌گذارد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. روی **حذف فراداده** کلیک کنید. +3. فایل پاک‌شده را دانلود کنید. + +گزینه‌ای برای تنظیم وجود ندارد. ابزار عمداً جامع طراحی شده است: همه چیز را پاک می‌کند. + +## چه چیزهایی حذف می‌شوند + +- **فیلدهای دیکشنری اطلاعات**: عنوان، نویسنده، موضوع، کلیدواژه‌ها، سازنده، تولیدکننده، تاریخ ایجاد، تاریخ تغییر +- **جریان فرادادهٔ XMP**: بلوک فرادادهٔ مبتنی بر XML که در کاتالوگ سند ذخیره شده است +- **شناسه‌های سند**: شناسه‌های یکتا در بخش پایانی PDF که می‌توانند برای ردیابی سند در سامانه‌های مختلف استفاده شوند +- **PieceInfo**: فرادادهٔ ویژهٔ برنامه که برنامه‌هایی مانند Illustrator یا InDesign اضافه می‌کنند + +## چه چیزهایی باقی می‌مانند + +- همهٔ محتوای قابل مشاهدهٔ صفحه (متن، تصاویر، گرافیک) +- فیلدهای فرم و حاشیه‌نویسی‌ها +- نشانک‌ها و پیوندها +- خود ساختار سند + +## موارد استفاده + +- حذف نام خود و سازمانتان از سند پیش از انتشار ناشناس +- حذف زمان‌های ایجاد که نشان می‌دهند سند کی تهیه شده است +- پاک کردن رشته‌های تولیدکننده که نرم‌افزارهای PDF شما را مشخص می‌کنند +- آماده‌سازی اسناد برای ارسال‌های نظارتی که PDF بدون فراداده می‌خواهند +- حذف ردپای تاریخچهٔ ویرایش پیش از اشتراک سند با بیرون + +## نکته‌ها + +- ابتدا از ابزار مشاهدهٔ فراداده استفاده کنید تا دقیقاً ببینید PDF شما پیش از حذف چه فراداده‌ای دارد. +- اگر لازم است فراداده _و_ JavaScript، حاشیه‌نویسی‌ها و فایل‌های جاسازی‌شده را حذف کنید، برای پاک‌سازی کامل‌تر از پاک‌سازی PDF استفاده کنید. +- حذف فراداده دائمی است. اگر ممکن است بعداً به آن داده‌ها نیاز داشته باشید، فایل اصلی را نگه دارید. + +## ابزارهای مرتبط + +- [پاک‌سازی PDF](./sanitize-pdf): حذف فراداده به‌همراه اسکریپت‌ها، پیوست‌ها و موارد دیگر +- [رمزگذاری PDF](./protect-pdf): محافظت از PDF پاک‌شده با رمز عبور +- [فشرده‌سازی PDF](./compress-pdf): حذف فراداده حجم فایل را کمی کاهش می‌دهد؛ برای صرفه‌جویی بیشتر فشرده کنید diff --git a/docs/fa/tools/remove-restrictions.md b/docs/fa/tools/remove-restrictions.md new file mode 100644 index 00000000..233924fb --- /dev/null +++ b/docs/fa/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: حذف محدودیت‌ها +description: محافظت با رمز عبور، محدودیت‌های چاپ، قفل‌های ویرایش و محدودیت‌های کپی را از فایل‌های PDF حذف کنید. +--- + +# حذف محدودیت‌ها + +PDFها می‌توانند دو نوع رمز عبور داشته باشند: رمز کاربر (برای باز کردن فایل لازم است) و رمز مالک (تعیین می‌کند با فایل چه کاری می‌توانید انجام دهید). این ابزار هر دو را به‌همراه همهٔ محدودیت‌های مرتبط (قفل‌های چاپ، ویرایش، کپی و حاشیه‌نویسی) حذف می‌کند. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. اگر PDF رمز مالک دارد، آن را در فیلد **رمز مالک** وارد کنید. اگر PDF فقط محدودیت استفاده بدون رمز عبور دارد، آن را خالی بگذارید. +3. روی **حذف محدودیت‌ها** کلیک کنید. +4. PDF بدون محدودیت را دانلود کنید. + +این ابزار از گزینه‌های `--decrypt` و `--remove-restrictions` در QPDF برای تولید نسخه‌ای تمیز و بدون محدودیت استفاده می‌کند. + +## چه چیزهایی حذف می‌شوند + +- محافظت با رمز عبور (هم رمز کاربر و هم رمز مالک) +- محدودیت‌های چاپ +- محدودیت‌های ویرایش +- محدودیت‌های کپی متن و تصویر +- محدودیت‌های حاشیه‌نویسی و نظر دادن +- همهٔ محدودیت‌های امنیتی دیگر که در PDF رمزگذاری شده‌اند + +## موارد استفاده + +- باز کردن قفل PDFی که مال شماست اما رمزش را سال‌ها پیش تعیین کرده‌اید +- حذف محدودیت چاپ از سندی که دسترسی مشروع به آن دارید +- فعال کردن کپی و چسباندن در منابع مرجع برای یادداشت‌برداری +- آماده‌سازی PDFها برای ابزارهای دسترس‌پذیری که نمی‌توانند با اسناد محدودشده کار کنند + +## نکته‌ها + +- اگر رمز مالک تعیین شده باشد، باید آن را بدانید. این ابزار رمزها را نمی‌شکند و حدس نمی‌زند. +- اگر می‌خواهید فایل رمزگذاری‌شده بماند اما مجوزهای خاصی تغییر کنند، به‌جای آن از ابزار تغییر مجوزها استفاده کنید. +- فایل خروجی هیچ رمزگذاری‌ای ندارد و هر کسی که آن را دریافت کند می‌تواند آزادانه بازش کند. + +## ابزارهای مرتبط + +- [رمزگشایی PDF](./unlock-pdf): باز کردن قفل PDF وقتی رمز کاربر را می‌دانید +- [رمزگذاری PDF](./protect-pdf): اعمال دوبارهٔ رمزگذاری با تنظیمات جدید +- [تغییر مجوزها](./change-permissions): تغییر انتخابی کارهای مجاز diff --git a/docs/fa/tools/repair-pdf.md b/docs/fa/tools/repair-pdf.md new file mode 100644 index 00000000..0e4366b7 --- /dev/null +++ b/docs/fa/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: ترمیم PDF +description: داده‌ها را از فایل‌های PDF خراب یا آسیب‌دیده با موتور تعمیر QPDF بازیابی کنید. از پردازش دسته‌ای پشتیبانی می‌کند. +--- + +# ترمیم PDF + +وقتی یک PDF باز نمی‌شود، محتوای به‌هم‌ریخته نشان می‌دهد یا در نمایشگر خطا ایجاد می‌کند، این ابزار تلاش می‌کند ساختار درونی آن را بازسازی کند. از موتور تعمیر QPDF استفاده می‌کند که می‌تواند داده‌ها را از انواع زیادی از خرابی بازیابی کند: جدول‌های ارجاع متقابل شکسته، جریان‌های ناقص، ارجاع‌های نامعتبر به اشیا و موارد دیگر. + +## نحوهٔ کار + +1. یک یا چند فایل PDF آسیب‌دیده بارگذاری کنید. +2. روی **تعمیر PDF** کلیک کنید. +3. یک فایل تعمیرشده مستقیماً دانلود می‌شود. چند فایل یک بایگانی ZIP تولید می‌کنند. + +ابزار هر فایل را با گزینهٔ `--decrypt` از QPDF عبور می‌دهد که QPDF را وادار می‌کند کل ساختار PDF را بخواند و از نو بنویسد و در این مسیر مشکلات قابل بازیابی را رفع کند. + +## ویژگی‌ها + +- تعمیر دسته‌ای چند PDF در یک عملیات +- تشخیص خودکار فایل‌های قابل بازیابی از غیرقابل بازیابی +- گزارش موفقیت یا شکست برای هر فایل هنگام پردازش چند فایل +- استفاده از QPDF (WebAssembly)، یک کتابخانهٔ آزموده برای تبدیل PDF + +## چه چیزهایی را می‌تواند رفع کند + +- جدول‌های ارجاع متقابل شکسته یا گم‌شده +- انتهای ناقص فایل ناشی از دانلودهای ناتمام +- شماره‌گذاری نامعتبر اشیا و طول جریان‌ها +- ناسازگاری‌های ساختاری جزئی ناشی از تولیدکننده‌های PDF معیوب +- آثار رمزگذاری ناشی از تلاش‌های ناموفق رمزگشایی + +## چه چیزهایی را نمی‌تواند رفع کند + +- فایل‌های به‌شدت ناقص که بیشتر دادهٔ محتوای آن‌ها از دست رفته است +- PDFهایی که با رمزی که ندارید رمزگذاری شده‌اند +- فایل‌هایی که در واقع PDF نیستند (پسوند اشتباه) +- خرابی تصویر درون PDF (ساختار درست می‌شود، اما دادهٔ پیکسلی بازسازی نمی‌شود) + +## موارد استفاده + +- بازیابی PDF از دانلود ناموفق ایمیل +- باز کردن فایل‌های تولیدشده با تولیدکننده‌های PDF قدیمی یا غیراستاندارد +- رفع PDFهایی که در یک نمایشگر کار می‌کنند اما در دیگری نه +- آماده‌سازی اسناد بایگانی آسیب‌دیده برای نگهداری بلندمدت + +## نکته‌ها + +- اگر تعمیر ناموفق بود، ابتدا فایل را در مرورگر باز کنید. مرورگرها منطق بازیابی خود را دارند و ممکن است محتوای کافی برای ذخیرهٔ دوباره نمایش دهند. +- برای PDFهای رمزگذاری‌شده‌ای که تعمیرشان ناموفق است، ابتدا رمزگشایی PDF را امتحان کنید و سپس خروجی رمزگشایی‌شده را تعمیر کنید. + +## ابزارهای مرتبط + +- [فشرده‌سازی PDF](./compress-pdf): پاک‌سازی بیشتر ساختار PDF تعمیرشده +- [خطی‌سازی PDF](./linearize-pdf): بهینه‌سازی فایل تعمیرشده برای ارائه در وب +- [یکپارچه‌سازی PDF](./flatten-pdf): یکپارچه‌سازی فرم‌هایی که ممکن است آسیب دیده باشند diff --git a/docs/fa/tools/reverse-pages.md b/docs/fa/tools/reverse-pages.md new file mode 100644 index 00000000..9803be93 --- /dev/null +++ b/docs/fa/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: وارونه‌سازی ترتیب صفحات +description: ترتیب صفحات یک یا چند فایل PDF را برعکس کنید تا صفحهٔ آخر به صفحهٔ اول تبدیل شود. +--- + +# وارونه‌سازی ترتیب صفحات + +ترتیب صفحات PDF را برعکس کنید تا صفحهٔ آخر اول شود، صفحهٔ یکی مانده به آخر دوم شود و به همین ترتیب. از پردازش دسته‌ای چند فایل به‌طور هم‌زمان پشتیبانی می‌کند. + +## نحوهٔ کار + +1. یک یا چند فایل PDF بارگذاری کنید. +2. روی دکمهٔ پردازش کلیک کنید. +3. هر فایل به‌طور مستقل وارونه می‌شود. اگر چند فایل بارگذاری کرده باشید، خروجی یک بایگانی ZIP شامل همهٔ PDFهای وارونه است. +4. یک فایل مستقیماً به‌صورت PDF وارونه دانلود می‌شود. + +## ویژگی‌ها + +- پردازش دسته‌ای: وارونه‌سازی چند PDF در یک عملیات +- خروجی تک‌فایل برای یک PDF و خروجی ZIP برای چند فایل +- دکمهٔ حذف برای هر فایل پیش از پردازش +- حفظ همهٔ محتوا و قالب‌بندی صفحات + +## موارد استفاده + +- اصلاح سندی که به ترتیب معکوس اسکن شده است +- آماده‌سازی PDF ارائه برای خواندن از آخر به اول +- وارونه کردن ترتیب صفحات برای فرایندهای چاپی خاص که صفحات را به ترتیب معکوس تغذیه می‌کنند +- اصلاح سندی که صفحاتش به اشتباه برعکس کنار هم گذاشته شده‌اند + +## نکته‌ها + +- هر فایل در یک دسته به‌طور مستقل وارونه می‌شود و ترتیب خود فایل‌ها نسبت به هم تغییر نمی‌کند. +- برای جابه‌جایی دقیق‌تر صفحات (نه فقط وارونه‌سازی کامل)، از [تکثیر و سازماندهی](./organize-pdf) استفاده کنید. + +## ابزارهای مرتبط + +- [تکثیر و سازماندهی](./organize-pdf) +- [چرخاندن PDF](./rotate-pdf) +- [ابزار چندکارهٔ PDF](./pdf-multi-tool) diff --git a/docs/fa/tools/rotate-custom.md b/docs/fa/tools/rotate-custom.md new file mode 100644 index 00000000..97d48f02 --- /dev/null +++ b/docs/fa/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: چرخاندن با زاویهٔ دلخواه +description: صفحات PDF را با هر زاویه‌ای بچرخانید، با ورودی درجه برای هر صفحه و کنترل چرخش دسته‌ای. +--- + +# چرخاندن با زاویهٔ دلخواه + +صفحات PDF را با هر زاویهٔ دلخواهی بچرخانید، نه فقط گام‌های ۹۰ درجه‌ای. هر صفحه ورودی زاویهٔ خود را دارد و می‌توانید با کنترل دسته‌ای یک زاویه را یک‌جا روی همهٔ صفحات اعمال کنید. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. تصاویر کوچک همهٔ صفحات نمایش داده می‌شوند. +2. هر صفحه یک فیلد عددی دارد که زاویهٔ چرخش فعلی آن را نشان می‌دهد. +3. هر مقدار درجه (مثبت یا منفی) را برای چرخاندن یک صفحهٔ خاص وارد کنید، یا از دکمه‌های چپ/راست هر صفحه برای تنظیم سریع ۹۰ درجه‌ای استفاده کنید. +4. از ورودی **زاویهٔ دسته‌ای** در بالا برای تعیین چرخش یکسان همهٔ صفحات استفاده کنید. +5. روی دکمهٔ پردازش کلیک کنید تا PDF چرخانده‌شده ساخته شود. + +## ویژگی‌ها + +- ورودی آزاد درجه برای هر صفحه (هر عدد صحیح) +- کنترل زاویهٔ دسته‌ای برای تعیین چرخش یکسان روی همهٔ صفحات +- پیش‌نمایش هم‌زمان چرخش در تصاویر کوچک +- دکمه‌های چرخش سریع ۹۰ درجه‌ای برای هر صفحه +- بارگذاری تنبل تصاویر کوچک برای کارایی در اسناد بزرگ + +## موارد استفاده + +- اصلاح اسکن‌هایی که چند درجه کج شده‌اند +- چرخاندن صفحات برای تطابق با جهت غیراستاندارد مورد نیاز +- اعمال چرخش دقیق روی صفحات جداگانه در سندی با محتوای مختلط +- تنظیم دقیق زاویهٔ صفحات پس از یک چرخش دسته‌ای اولیه + +## نکته‌ها + +- مقادیر مثبت در جهت عقربه‌های ساعت و مقادیر منفی خلاف جهت عقربه‌های ساعت می‌چرخانند. +- فیلد زاویهٔ دسته‌ای هنگام اعمال، همهٔ زاویه‌های هر صفحه را بازنویسی می‌کند. در صورت نیاز، تنظیمات جداگانه را پس از عملیات دسته‌ای انجام دهید. +- برای چرخش‌های استاندارد ۹۰/۱۸۰/۲۷۰ درجه با رابط ساده‌تر، از [چرخاندن PDF](./rotate-pdf) استفاده کنید. + +## ابزارهای مرتبط + +- [چرخاندن PDF](./rotate-pdf) +- [ابزار چندکارهٔ PDF](./pdf-multi-tool) +- [تکثیر و سازماندهی](./organize-pdf) diff --git a/docs/fa/tools/rotate-pdf.md b/docs/fa/tools/rotate-pdf.md new file mode 100644 index 00000000..9558187e --- /dev/null +++ b/docs/fa/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: چرخاندن PDF +description: صفحات جداگانه یا همهٔ صفحات PDF را با گام‌های ۹۰ درجه‌ای و رابط تصویری تصاویر کوچک بچرخانید. +--- + +# چرخاندن PDF + +صفحات PDF را ۹۰ درجه در جهت یا خلاف جهت عقربه‌های ساعت بچرخانید. ابزار پیش‌نمایش کوچک همهٔ صفحات را نشان می‌دهد و می‌توانید آن‌ها را جداگانه بچرخانید یا یک چرخش دسته‌ای روی کل سند اعمال کنید. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. تصاویر کوچک همهٔ صفحات در یک شبکه نمایش داده می‌شوند. +2. از دکمه‌های چرخش چپ/راست زیر تصویر کوچک هر صفحه برای چرخاندن همان صفحه استفاده کنید. +3. از کنترل‌های چرخش دسته‌ای در بالا برای چرخاندن همهٔ صفحات به‌طور یک‌جا استفاده کنید. +4. پیش‌نمایش تصاویر کوچک به‌صورت هم‌زمان چرخش را نشان می‌دهد. +5. روی دکمهٔ پردازش کلیک کنید تا PDF چرخانده‌شده ذخیره شود. + +## ویژگی‌ها + +- چرخش هر صفحه با گام‌های ۹۰ درجه‌ای (چپ یا راست) +- چرخش دسته‌ای همهٔ صفحات به‌طور هم‌زمان +- پیش‌نمایش هم‌زمان تصاویر کوچک با انیمیشن چرخش +- بارگذاری تنبل تصاویر کوچک برای عملکرد روان در اسناد بزرگ +- حفظ محتوا و کیفیت اصلی صفحات + +## موارد استفاده + +- اصلاح صفحات اسکن‌شدهٔ کج یا وارونه +- چرخاندن صفحات افقی به عمودی (یا برعکس) +- اصلاح سندی با جهت‌های مختلط که برخی صفحاتش با زاویهٔ اشتباه اسکن شده‌اند +- آماده‌سازی سند برای جهت نمایش خاص + +## نکته‌ها + +- چرخش‌ها تجمعی‌اند. دو بار کلیک روی دکمهٔ چرخش ساعت‌گرد، چرخش ۱۸۰ درجه اعمال می‌کند. +- برای چرخش‌های غیر ۹۰ درجه‌ای (مثلاً ۴۵ درجه برای اصلاح اسکن کمی کج)، به‌جای آن از [چرخاندن با زاویهٔ دلخواه](./rotate-custom) استفاده کنید. +- کنترل‌های چرخش دسته‌ای روی همهٔ صفحات اثر می‌گذارند، نه فقط صفحات انتخاب‌شده. این ابزار سازوکار انتخاب ندارد؛ برای آن از [ابزار چندکارهٔ PDF](./pdf-multi-tool) استفاده کنید. + +## ابزارهای مرتبط + +- [چرخاندن با زاویهٔ دلخواه](./rotate-custom) +- [ابزار چندکارهٔ PDF](./pdf-multi-tool) +- [تکثیر و سازماندهی](./organize-pdf) diff --git a/docs/fa/tools/rtf-to-pdf.md b/docs/fa/tools/rtf-to-pdf.md new file mode 100644 index 00000000..460d17b6 --- /dev/null +++ b/docs/fa/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF به PDF +description: فایل‌های Rich Text Format (RTF) را با موتوری مبتنی بر LibreOffice در مرورگر به PDF تبدیل کنید. +--- + +# RTF به PDF + +اسناد Rich Text Format را به PDF تبدیل کنید. RTF یک قالب سند چندسکویی است که تقریباً همهٔ واژه‌پردازها از آن پشتیبانی می‌کنند. این ابزار از موتور LibreOffice در مرورگر برای رندر فایل‌های RTF با حفظ قالب‌بندی استفاده می‌کند: متن پررنگ، کج، جدول‌ها و تصاویر جاسازی‌شده همه به PDF منتقل می‌شوند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | انواع MIME | +| :--- | :------ | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا یک یا چند فایل RTF را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید. در صورت نیاز فایل اضافه یا حذف کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور LibreOffice در اولین استفاده راه‌اندازی می‌شود و سپس هر فایل را پردازش می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل به‌صورت `rtf-converted.zip` تحویل داده می‌شوند. + +## گزینه‌ها + +این ابزار تنظیمات اضافی ندارد. تبدیل، قالب‌بندی اصلی RTF را حفظ می‌کند. + +## خروجی + +| تعداد ورودی | خروجی | +| :-------------- | :--------------------------------------------------------- | +| ۱ فایل | دانلود یک PDF (مثلاً `letter.pdf`) | +| ۲ فایل یا بیشتر | بایگانی ZIP (`rtf-converted.zip`) شامل یک PDF برای هر فایل | + +## موارد استفاده + +- تبدیل اسناد RTF قدیمی از واژه‌پردازهای قدیمی به PDFهای امروزی +- تبدیل قالب‌های ایمیل RTF به پیش‌نمایش PDF +- پردازش خروجی RTF از نرم‌افزارهای حقوقی یا پزشکی +- تبدیل دسته‌ای فایل‌های RTF از سامانهٔ مدیریت اسناد به PDF برای بایگانی + +## نکته‌ها + +- موتور LibreOffice یک بار بارگذاری و ذخیره می‌شود. اولین تبدیل در هر نشست چند ثانیه بیشتر طول می‌کشد و تبدیل‌های بعدی سریع‌ترند. +- فایل‌های RTF با اشیای OLE جاسازی‌شده ممکن است همهٔ اشیا را کاملاً درست نمایش ندهند. متن ساده، تصاویر و قالب‌بندی استاندارد به‌طور قابل اعتمادی تبدیل می‌شوند. +- اگر فایل‌های RTF شما با Microsoft Word ساخته شده‌اند، می‌توانید آن‌ها را مستقیماً با ابزار [Word به PDF](./word-to-pdf) هم تبدیل کنید که RTF را در کنار DOC و DOCX می‌پذیرد. + +## ابزارهای مرتبط + +- [Word به PDF](./word-to-pdf) +- [ODT به PDF](./odt-to-pdf) +- [متن به PDF](./txt-to-pdf) diff --git a/docs/fa/tools/sanitize-pdf.md b/docs/fa/tools/sanitize-pdf.md new file mode 100644 index 00000000..935b92be --- /dev/null +++ b/docs/fa/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: پاک‌سازی PDF +description: محتوای پنهان و بالقوه خطرناک PDF از جمله فراداده، JavaScript، فایل‌های جاسازی‌شده، حاشیه‌نویسی‌ها و لایه‌ها را حذف کنید. +--- + +# پاک‌سازی PDF + +PDFها می‌توانند بسیار بیشتر از آنچه روی صفحه می‌بینید در خود داشته باشند. فرادادهٔ پنهان، JavaScript جاسازی‌شده، فایل‌های پیوست، دادهٔ فرم و اطلاعات لایه‌ها می‌توانند داده‌های حساس را فاش کنند یا خطر امنیتی ایجاد کنند. پاک‌سازی همهٔ آن‌ها را حذف می‌کند و سندی تمیز و امن برای اشتراک عمومی باقی می‌گذارد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. عناصری را که باید حذف شوند از فهرست انتخاب کنید. +3. روی **پاک‌سازی PDF** کلیک کنید. +4. فایل پاک‌شده را دانلود کنید. + +## گزینه‌های پاک‌سازی + +همهٔ گزینه‌ها به‌طور پیش‌فرض فعال‌اند. هر کدام را که می‌خواهید حفظ شود از حالت انتخاب خارج کنید. + +| گزینه | چه چیزی را حذف می‌کند | +| --------------------------- | --------------------------------------------------------------------------- | +| **یکپارچه‌سازی فرم‌ها** | فیلدهای فرم تعاملی را به محتوای ثابت تبدیل می‌کند | +| **حذف فراداده** | نویسنده، عنوان، تاریخ ایجاد، اطلاعات نرم‌افزار و دادهٔ XMP را حذف می‌کند | +| **حذف حاشیه‌نویسی‌ها** | نظرها، هایلایت‌ها، یادداشت‌های چسبان و نشانه‌گذاری‌ها را پاک می‌کند | +| **حذف JavaScript** | اسکریپت‌های جاسازی‌شده‌ای را که ممکن است هنگام باز شدن اجرا شوند حذف می‌کند | +| **حذف فایل‌های جاسازی‌شده** | پیوست‌های جاسازی‌شده در PDF را حذف می‌کند | +| **حذف لایه‌ها (OCG)** | گروه‌های محتوای اختیاری را در یک لایه یکپارچه می‌کند | +| **حذف پیوندها** | ابرپیوندها و ارجاع‌های URL را حذف می‌کند | +| **حذف درخت ساختار** | ساختار سند مورد استفاده برای برچسب‌گذاری دسترس‌پذیری را حذف می‌کند | +| **حذف MarkInfo** | اطلاعات محتوای نشانه‌گذاری‌شده را حذف می‌کند | +| **حذف قلم‌ها** | دادهٔ قلم‌های جاسازی‌شده را حذف می‌کند (با احتیاط استفاده کنید) | + +## موارد استفاده + +- آماده‌سازی PDF برای انتشار عمومی با حذف فرادادهٔ داخلی (نام نویسندگان، نسخهٔ نرم‌افزار، تاریخچهٔ ویرایش) +- حذف JavaScript از PDF دریافتی از منبع نامطمئن پیش از باز کردن آن +- پاک‌سازی PDF پیش از ارسال برای مشتری‌ای که نباید نظرهای جاسازی‌شده یا نام فیلدهای فرم را ببیند +- حذف لایه‌های پنهان از نقشهٔ معماری پیش از اشتراک نسخهٔ نهایی +- رعایت الزامات کمینه‌سازی داده طبق مقررات حریم خصوصی + +## نکته‌ها + +- «حذف قلم‌ها» را علامت نزنید مگر اینکه مطمئن باشید PDF همچنان درست نمایش داده می‌شود. حذف قلم‌ها ممکن است متن را در برخی نمایشگرها نامرئی کند. +- اگر فقط لازم است فراداده را حذف کنید، ابزار اختصاصی حذف فراداده سریع‌تر و متمرکزتر است. +- پاک‌سازی برگشت‌ناپذیر است. فایل اصلی خود را نگه دارید. + +## ابزارهای مرتبط + +- [حذف فراداده](./remove-metadata): حذف فقط فراداده بدون دست زدن به محتوای دیگر +- [یکپارچه‌سازی PDF](./flatten-pdf): یکپارچه‌سازی ویژهٔ فرم‌ها و حاشیه‌نویسی‌ها +- [رمزگذاری PDF](./protect-pdf): افزودن محافظت با رمز عبور پس از پاک‌سازی +- [رستر کردن PDF](./rasterize-pdf): گزینهٔ نهایی: تبدیل به تصویر برای حذف همهٔ محتوای پنهان diff --git a/docs/fa/tools/scanner-effect.md b/docs/fa/tools/scanner-effect.md new file mode 100644 index 00000000..a4642f23 --- /dev/null +++ b/docs/fa/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: جلوهٔ اسکنر +description: PDF خود را با نویز، چرخش، تاری و جلوهٔ کهنگی کاغذ قابل تنظیم شبیه سند اسکن‌شده کنید. +--- + +# جلوهٔ اسکنر + +یک PDF دیجیتال تمیز را به چیزی تبدیل کنید که انگار از یک اسکنر تخت بیرون آمده است. ابزار نویز، چرخش جزئی، تاری، تغییر روشنایی و زردی اختیاری را به‌صورت قابل تنظیم اعمال می‌کند تا نقص‌های یک اسکن واقعی را شبیه‌سازی کند. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. ویرایشگر با پیش‌نمایش زندهٔ صفحهٔ اول در کنار پنل تنظیمات باز می‌شود. +3. پارامترهای جلوهٔ اسکن را با لغزنده‌ها و کلیدها تنظیم کنید. +4. با تغییر تنظیمات، پیش‌نمایش به‌صورت هم‌زمان به‌روز می‌شود. +5. روی **اعمال** کلیک کنید تا همهٔ صفحات پردازش و نتیجه دانلود شود. + +## گزینه‌ها + +- **فضای رنگی (کلید خاکستری)**: خروجی را برای ظاهر کلاسیک اسکن سیاه و سفید به خاکستری تبدیل می‌کند. +- **حاشیه**: یک حاشیهٔ تیرهٔ ملایم دور لبه‌های صفحه اضافه می‌کند تا آثار لبهٔ اسکنر را تقلید کند. +- **چرخش**: چرخش جزئی (۵- تا ۵+ درجه) برای شبیه‌سازی تغذیهٔ نامرتب کاغذ اعمال می‌کند. +- **تغییرات چرخش**: تغییر تصادفی به زاویهٔ چرخش اضافه می‌کند تا هر صفحه کمی متفاوت کج شود. +- **روشنایی**: روشنایی کلی را بالا یا پایین می‌برد. +- **کنتراست**: کنتراست را برای شبیه‌سازی تفاوت کیفیت تونر تنظیم می‌کند. +- **تاری**: تاری گاوسی اعمال می‌کند تا لبه‌های متن مانند یک اسکن کم‌کیفیت نرم شوند. +- **نویز**: نویز تصادفی پیکسلی برای شبیه‌سازی دانه‌دانگی حسگر اسکنر اضافه می‌کند. مقادیر بالاتر نتیجهٔ دانه‌دارتری می‌دهند. +- **زردی**: ته‌رنگ زرد گرمی برای شبیه‌سازی کاغذ کهنه یا بازیافتی اضافه می‌کند. +- **وضوح**: DPI خروجی را تعیین می‌کند. مقادیر پایین‌تر ظاهری پیکسلی‌تر و شبیه‌تر به اسکن ایجاد می‌کنند. +- **بازنشانی**: همهٔ تنظیمات را به حالت پیش‌فرض برمی‌گرداند. + +## ویژگی‌ها + +- پیش‌نمایش هم‌زمان که با تغییر هر پارامتر به‌روز می‌شود +- تغییر تصادفی چرخش برای هر صفحه جهت تنوع واقع‌گرایانه +- ده پارامتر قابل تنظیم مستقل +- حالت خاکستری برای خروجی اسکن سیاه و سفید واقعی +- کنترل وضوح از کیفیت فکس با DPI پایین تا کیفیت بایگانی با DPI بالا + +## موارد استفاده + +- اسکن‌شده و چاپ‌شده نشان دادن اسنادی که به‌صورت دیجیتال ساخته شده‌اند +- شبیه‌سازی کهنگی سند فیزیکی برای بازسازی اسناد تاریخی +- آزمایش نرم‌افزار OCR در برابر کیفیت اسکن پایین +- تولید اسنادی هم‌سبک با بایگانی‌های اسکن‌شدهٔ موجود + +## نکته‌ها + +- با مقادیر ملایم شروع کنید. نویز ۱۰ تا ۲۰، چرخش جزئی ۰٫۵ درجه و تاری کم همین حالا ظاهر اسکن متقاعدکننده‌ای ایجاد می‌کنند. +- حالت خاکستری را با کمی زردی ترکیب کنید تا جلوهٔ «فتوکپیِ فتوکپی» به دست آید. +- تنظیمات وضوح پایین‌تر (۱۰۰ تا ۱۵۰ DPI) واقعی‌ترین ظاهر دستگاه فکس را ایجاد می‌کنند. + +## ابزارهای مرتبط + +- [وارونه‌سازی رنگ‌ها](./invert-colors) +- [تنظیم رنگ‌ها](./adjust-colors) +- [رنگ پس‌زمینه](./background-color) diff --git a/docs/fa/tools/sign-pdf.md b/docs/fa/tools/sign-pdf.md new file mode 100644 index 00000000..483e7360 --- /dev/null +++ b/docs/fa/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: امضای PDF +description: امضا را بکشید، تایپ کنید یا بارگذاری کنید و آن را با نمایشگر یکپارچه روی صفحات PDF قرار دهید. +--- + +# امضای PDF + +امضای خود را به هر سند PDF اضافه کنید. این ابزار یک نمایشگر کامل PDF با ابزارهای امضای داخلی دارد که در آن می‌توانید امضا را با دست بکشید، نام خود را با قلم امضا تایپ کنید یا تصویر امضا بارگذاری کنید. امضاها را روی هر صفحه قرار دهید و اندازه‌شان را تغییر دهید، سپس سند امضاشده را ذخیره کنید. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. سند در یک نمایشگر PDF یکپارچه با ابزارهای حاشیه‌نویسی باز می‌شود. +3. با ابزار امضای نمایشگر، امضای خود را با کشیدن، تایپ کردن یا بارگذاری تصویر بسازید. +4. روی جایی از صفحه که می‌خواهید امضا قرار گیرد کلیک کنید و اندازه و موقعیت آن را تنظیم کنید. +5. در صورت تمایل **یکپارچه‌سازی PDF** را علامت بزنید تا امضا برای همیشه در سند جاسازی شود. +6. روی **ذخیره و دانلود PDF امضاشده** کلیک کنید تا فایل امضاشده را دریافت کنید. + +## گزینه‌ها + +- **یکپارچه‌سازی PDF**: وقتی علامت بخورد، امضا برای همیشه در محتوای صفحه جاسازی می‌شود. این کار از جابه‌جایی یا حذف امضا توسط دیگران جلوگیری می‌کند. وقتی علامت نخورد، امضا به‌صورت حاشیه‌نویسی باقی می‌ماند که در نمایشگرهای سازگار قابل ویرایش است. + +## ویژگی‌ها + +- سه روش ساخت امضا: کشیدن با دست، متن تایپی یا تصویر بارگذاری‌شده +- نمایشگر PDF یکپارچه برای قرار دادن دقیق +- کشیدن برای جابه‌جایی و تغییر اندازهٔ امضا روی هر صفحه +- یکپارچه‌سازی اختیاری برای جاسازی دائمی امضاها +- پشتیبانی از چند امضا در یک سند + +## موارد استفاده + +- امضای قراردادها، توافق‌نامه‌ها یا فرم‌های تأیید پیش از بازگرداندن آن‌ها +- افزودن امضا به اسناد مالیاتی، درخواست‌های بیمه یا فرم‌های دولتی +- گذاشتن حروف اول نام روی صفحات جداگانهٔ یک توافق‌نامهٔ چندصفحه‌ای +- امضای توافق‌نامه‌های عدم افشا یا اسناد منابع انسانی که به‌صورت پیوست PDF می‌رسند + +## نکته‌ها + +- اگر PDF امضاشده را برای کسی می‌فرستید که نباید بتواند امضای شما را حذف یا جابه‌جا کند، یکپارچه‌سازی را فعال کنید. +- برای امضاهای دیجیتال با اعتبار قانونی و تأیید مبتنی بر گواهی، BentoPDF ابزار جداگانهٔ امضای دیجیتال را هم ارائه می‌دهد. +- برای تمیزترین نتیجه، تصویر امضای PNG با پس‌زمینهٔ شفاف بارگذاری کنید. + +## ابزارهای مرتبط + +- [ویرایشگر PDF](./edit-pdf) +- [افزودن مهر](./add-stamps) +- [پرکنندهٔ فرم](./form-filler) diff --git a/docs/fa/tools/split-pdf.md b/docs/fa/tools/split-pdf.md new file mode 100644 index 00000000..7d4693de --- /dev/null +++ b/docs/fa/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: تقسیم PDF +description: PDF را بر اساس بازهٔ صفحات، انتخاب تصویری، نشانک‌ها، صفحات زوج/فرد یا فواصل ثابت به فایل‌های کوچک‌تر تقسیم کنید. +--- + +# تقسیم PDF + +یک PDF را با یکی از شش حالت تقسیم به اسناد کوچک‌تر بشکنید. از بازه‌های سادهٔ صفحات تا تقسیم بر اساس نشانک‌ها، این ابزار همهٔ سناریوهای تقسیم سند را پوشش می‌دهد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. یک حالت تقسیم از فهرست کشویی انتخاب کنید. +3. گزینه‌های ویژهٔ آن حالت را تنظیم کنید (بازه‌های صفحات، انتخاب‌ها و غیره). +4. روی دکمهٔ پردازش کلیک کنید. +5. نتیجه بسته به حالت و تنظیمات به‌صورت یک PDF یا یک بایگانی ZIP دانلود می‌شود. + +## حالت‌های تقسیم + +| حالت | توضیح | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------- | +| **بازه** | بازه‌هایی مانند `1-3, 5, 8-10` وارد کنید. چند بازه PDFهای جداگانه در یک ZIP تولید می‌کنند. یک بازه یک PDF تولید می‌کند. | +| **انتخاب تصویری** | تصاویر کوچک صفحات را مرور کنید و صفحات دلخواه را با کلیک انتخاب کنید. صفحات انتخاب‌شده در یک PDF جدید استخراج می‌شوند. | +| **زوج / فرد** | فقط صفحات زوج یا فرد را استخراج کنید. | +| **همهٔ صفحات** | هر صفحه را به یک فایل PDF جداگانه تقسیم کنید که به‌صورت ZIP دانلود می‌شود. | +| **نشانک‌ها** | در مرز نشانک‌ها تقسیم کنید. سطح نشانک را انتخاب کنید تا محل تقسیم‌ها مشخص شود. | +| **هر N صفحه** | به بخش‌های N صفحه‌ای تقسیم کنید (مثلاً هر ۵ صفحه). بخش آخر ممکن است صفحات کمتری داشته باشد. | + +## ویژگی‌ها + +- شش حالت تقسیم متمایز که تقریباً همهٔ موارد استفاده را پوشش می‌دهند +- انتخابگر تصویری صفحات با بارگذاری تنبل تصاویر کوچک +- تقسیم مبتنی بر نشانک با فیلتر سطح +- گزینهٔ خروجی ZIP برای حالت‌های بازه و تصویری +- پشتیبانی از بازه‌های صفحات با نحو ترکیبی (`1-3, 5, 8-10`) +- هشدار وقتی تقسیم N صفحه‌ای بخش‌های نابرابر ایجاد می‌کند + +## موارد استفاده + +- استخراج یک فصل یا بخش خاص از یک سند بزرگ +- جدا کردن صفحات فرد و زوج برای فرایندهای چاپ دورو +- شکستن PDF یک کتاب به فایل‌های جداگانهٔ فصل‌ها در مرز نشانک‌ها +- جدا کردن صفحات خاص (مانند صفحهٔ امضا) از یک قرارداد +- تقسیم یک گزارش گردآوری‌شده به فایل‌های جداگانهٔ هر بخش برای توزیع + +## نکته‌ها + +- چند بازهٔ صفحات که با کاما جدا شده‌اند (مثلاً `1-5, 10-15, 20-25`) PDFهای جداگانه تولید می‌کنند، یکی برای هر بازه، که در یک ZIP بسته‌بندی می‌شوند. +- حالت تقسیم با نشانک نیاز دارد PDF واقعاً نشانک داشته باشد. اگر هیچ نشانکی یافت نشود، پیام خطا دریافت می‌کنید. +- کادر «دانلود به‌صورت ZIP» در حالت‌های بازه و تصویری به شما امکان می‌دهد به‌جای یک فایل ترکیبی، برای هر صفحه یک PDF جداگانه بگیرید. + +## ابزارهای مرتبط + +- [ادغام PDF](./merge-pdf) +- [استخراج صفحات](./extract-pages) +- [حذف صفحات](./delete-pages) +- [ابزار چندکارهٔ PDF](./pdf-multi-tool) diff --git a/docs/fa/tools/svg-to-pdf.md b/docs/fa/tools/svg-to-pdf.md new file mode 100644 index 00000000..17e1e9a7 --- /dev/null +++ b/docs/fa/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG به PDF +description: گرافیک‌های برداری SVG را با کنترل کیفیت، کاملاً در مرورگر به PDF تبدیل کنید. +--- + +# SVG به PDF + +فایل‌های Scalable Vector Graphics (SVG) را به PDF تبدیل کنید. ابزار هر SVG را با موتور رندر مرورگر رستر می‌کند و سپس نتیجه را با وضوح اصلی آن جاسازی می‌کند. برای تبدیل آیکون‌های برداری، نمودارها و تصویرسازی‌ها به اسناد قابل حمل مفید است. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :------ | +| SVG | `.svg` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا یک یا چند فایل SVG را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی و مدیریت کنید. +3. یک سطح **کیفیت PDF** انتخاب کنید. +4. روی **تبدیل به PDF** کلیک کنید. نتیجه به‌صورت `from_svgs.pdf` دانلود می‌شود. + +هر SVG به‌صورت متن خوانده می‌شود، روی یک بوم با عرض و ارتفاع ذاتی خود رندر می‌شود (اگر ابعادی مشخص نشده باشد، پیش‌فرض 800x600 است) و به‌صورت PNG خروجی گرفته می‌شود. سپس آن PNG با pdf-lib در PDF جاسازی می‌شود. نواحی شفاف با پس‌زمینهٔ سفید پر می‌شوند. + +## گزینه‌ها + +**کیفیت PDF** فشرده‌سازی پس از رستر کردن را کنترل می‌کند: + +- **کیفیت بالا**: نزدیک‌ترین حالت به رندر اصلی. +- **کیفیت متوسط** (پیش‌فرض): تعادل خوب. +- **کیفیت پایین**: کوچک‌ترین فایل، با کمی افت جزئیات. + +## موارد استفاده + +- تبدیل نقشه‌های معماری یا مهندسی از SVG به PDF آمادهٔ چاپ +- بسته‌بندی مجموعه آیکون‌ها در یک PDF مرجع برای سیستم طراحی +- تبدیل مصورسازی‌های داده (خروجی D3.js و کتابخانه‌های نمودار) به PDF آماده برای گزارش +- ساخت نسخه‌های قابل چاپ از اینفوگرافیک‌های مبتنی بر SVG + +## نکته‌ها + +- فایل‌های SVG بدون ویژگی‌های صریح `width` و `height` با اندازهٔ 800x600 پیکسل رندر می‌شوند. برای بهترین نتیجه، پیش از تبدیل ابعاد را در کد SVG تعیین کنید. +- SVGهای پیچیده با ارجاع به قلم‌های خارجی یا تصاویر پیوندی ممکن است کاملاً درست رندر نشوند. برای خروجی قابل اعتماد، همهٔ منابع را درون SVG قرار دهید. +- چون SVG رستر می‌شود، PDF به‌جای مسیرهای برداری یک تصویر بیت‌مپ خواهد داشت. برای خروجی PDF برداری واقعی به ابزار برداری اختصاصی نیاز است. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [PNG به PDF](./png-to-pdf) +- [BMP به PDF](./bmp-to-pdf) diff --git a/docs/fa/tools/table-of-contents.md b/docs/fa/tools/table-of-contents.md new file mode 100644 index 00000000..1a8444ab --- /dev/null +++ b/docs/fa/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: فهرست مطالب +description: از نشانک‌های موجود PDF یک صفحهٔ فهرست مطالب قالب‌بندی‌شده بسازید. +--- + +# فهرست مطالب + +این ابزار نشانک‌های (طرح کلی) PDF شما را می‌خواند و یک صفحهٔ فهرست مطالب قالب‌بندی‌شده می‌سازد که به ابتدای سند افزوده می‌شود. اگر PDF شما نشانک دارد اما صفحهٔ فهرست مطالب قابل مشاهده ندارد، این ابزار به‌طور خودکار آن را می‌سازد. + +## نحوهٔ کار + +1. یک PDF دارای نشانک بارگذاری کنید. +2. عنوان، اندازهٔ قلم و خانوادهٔ قلم فهرست مطالب را سفارشی کنید. +3. در صورت تمایل **افزودن نشانک برای صفحهٔ فهرست مطالب** را علامت بزنید تا خود فهرست مطالب هم در درخت نشانک‌ها قرار گیرد. +4. برای پردازش فایل روی **ایجاد فهرست مطالب** کلیک کنید. +5. PDF به‌روزشده با صفحهٔ فهرست مطالب درج‌شده در ابتدا به‌طور خودکار دانلود می‌شود. + +## گزینه‌ها + +- **عنوان فهرست مطالب**: سرفصلی که بالای صفحهٔ ساخته‌شده نمایش داده می‌شود. پیش‌فرض «فهرست مطالب» است. +- **اندازهٔ قلم**: از 10pt تا 72pt انتخاب کنید. پیش‌فرض 12pt است. +- **خانوادهٔ قلم**: از گونه‌های Times Roman، Helvetica یا Courier (معمولی، پررنگ، کج، پررنگ کج) انتخاب کنید. پیش‌فرض Helvetica است. +- **افزودن نشانک برای صفحهٔ فهرست مطالب**: وقتی علامت بخورد، یک مدخل نشانک برای خود صفحهٔ فهرست مطالب به درخت طرح کلی PDF اضافه می‌شود. + +## ویژگی‌ها + +- خواندن کامل سلسله‌مراتب نشانک‌های PDF +- ساخت صفحهٔ فهرست مطالب با قالب‌بندی تمیز و ارجاع به شمارهٔ صفحات +- پشتیبانی از سطوح تودرتوی نشانک با تورفتگی +- انتخاب از میان ۱۲ قلم داخلی PDF +- نشانک اختیاری خودارجاع برای صفحهٔ فهرست مطالب + +## موارد استفاده + +- افزودن فهرست مطالب قابل چاپ به کتاب‌های الکترونیکی یا گزارش‌هایی که فقط نشانک دیجیتال دارند +- ساخت فهرست مطالب برای سند ادغام‌شده پس از ترکیب چند PDF +- ساخت صفحهٔ مرجع برای راهنماهای فنی طولانی +- آماده‌سازی اسناد برای چاپ جایی که فهرست مطالب قابل مشاهده انتظار می‌رود + +## نکته‌ها + +- اگر PDF شما نشانک ندارد، ابتدا با ابزار [ویرایش نشانک‌ها](./bookmark) آن‌ها را بسازید و سپس برای ساخت فهرست مطالب به اینجا برگردید. +- برای اسناد بزرگ، اندازهٔ قلم بزرگ‌تر مانند 14pt یا 16pt خوانایی را بهتر می‌کند. + +## ابزارهای مرتبط + +- [ویرایش نشانک‌ها](./bookmark) +- [شماره‌گذاری صفحات](./page-numbers) +- [سرصفحه و پاصفحه](./header-footer) diff --git a/docs/fa/tools/text-color.md b/docs/fa/tools/text-color.md new file mode 100644 index 00000000..da9c7f22 --- /dev/null +++ b/docs/fa/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: تغییر رنگ متن +description: رنگ همهٔ متن‌های PDF را به هر رنگی که می‌خواهید تغییر دهید. +--- + +# تغییر رنگ متن + +رنگ متن را در سراسر PDF جایگزین کنید. ابزار نواحی متنی هر صفحه را شناسایی کرده و آن‌ها را با رنگ انتخابی شما رنگ‌آمیزی می‌کند و چیدمان سند و محتوای غیرمتنی را حفظ می‌کند. + +## نحوهٔ کار + +1. فایل PDF خود را بارگذاری کنید. +2. با انتخابگر رنگ یک رنگ جدید برای متن انتخاب کنید. پیش‌فرض آبی (#0000FF) است. +3. برای پردازش روی **تغییر رنگ متن** کلیک کنید. +4. PDF رنگ‌آمیزی‌شده به‌طور خودکار دانلود می‌شود. یک نشانگر پیشرفت صفحهٔ در حال پردازش را نشان می‌دهد. + +## گزینه‌ها + +- **رنگ جدید متن**: انتخابگر رنگ برای انتخاب رنگ جایگزین همهٔ متن‌های سند. + +## ویژگی‌ها + +- رنگ‌آمیزی متن در همهٔ صفحات سند +- پردازش صفحه به صفحه با نمایش پیشرفت +- انتخابگر رنگ با پشتیبانی کامل از رنگ‌های hex +- حفظ چیدمان صفحه و عناصر غیرمتنی + +## موارد استفاده + +- تغییر متن سیاه به آبی تیره برای ظاهری نرم‌تر و امروزی‌تر +- رنگ‌آمیزی متن مطابق راهنمای برند پیش از توزیع اسناد +- تبدیل متن به رنگی خاص برای رعایت الزامات دسترس‌پذیری +- قابل مشاهده کردن متن روی رنگ پس‌زمینه‌ای که تازه اعمال شده است + +## نکته‌ها + +- این ابزار صفحات را برای کیفیت با مقیاس 2x رندر می‌کند و سپس PDF را بازسازی می‌کند. خروجی مبتنی بر تصویر است، بنابراین متن دیگر قابل انتخاب یا جست‌وجو نخواهد بود. +- برای اسنادی که باید متن قابل انتخاب داشته باشند، به‌جای آن ویرایش مستقیم PDF با [ویرایشگر PDF](./edit-pdf) را در نظر بگیرید. +- زمان پردازش با تعداد صفحات افزایش می‌یابد، زیرا هر صفحه جداگانه رندر می‌شود. + +## ابزارهای مرتبط + +- [رنگ پس‌زمینه](./background-color) +- [وارونه‌سازی رنگ‌ها](./invert-colors) +- [تنظیم رنگ‌ها](./adjust-colors) diff --git a/docs/fa/tools/tiff-to-pdf.md b/docs/fa/tools/tiff-to-pdf.md new file mode 100644 index 00000000..5a079cfe --- /dev/null +++ b/docs/fa/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF به PDF +description: تصاویر TIFF تک‌صفحه‌ای و چندصفحه‌ای را با پشتیبانی کامل از صفحات در مرورگر به PDF تبدیل کنید. +--- + +# TIFF به PDF + +فایل‌های TIFF، از جمله TIFFهای چندصفحه‌ای، را به PDF تبدیل کنید. هر صفحه (یا «IFD») در فایل TIFF به یک صفحهٔ جداگانه در PDF خروجی تبدیل می‌شود. این قابلیت به‌ویژه برای اسناد اسکن‌شده، فکس‌ها و تصاویر پزشکی که معمولاً به‌صورت TIFF چندصفحه‌ای ذخیره می‌شوند مفید است. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های TIFF را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی و در صورت نیاز مدیریت کنید. +3. روی **تبدیل به PDF** کلیک کنید. نتیجه به‌صورت `from_tiff.pdf` دانلود می‌شود. + +ابزار هر فایل TIFF را با یک رمزگشای TIFF در JavaScript رمزگشایی می‌کند و دادهٔ خام پیکسلی RGBA هر صفحه را استخراج می‌کند. هر صفحه روی یک بوم رندر، به‌صورت PNG خروجی گرفته و در PDF جاسازی می‌شود. ابعاد صفحات با صفحات اصلی TIFF مطابقت دارد. + +## گزینه‌ها + +این ابزار تنظیمات کیفیت اضافی ندارد. تصاویر با وضوح اصلی خود جاسازی می‌شوند. + +## موارد استفاده + +- تبدیل اسناد فکس چندصفحه‌ای (TIFF-F) به قالب قابل حمل‌تر PDF +- تبدیل بایگانی‌های اسناد اسکن‌شدهٔ ذخیره‌شده به‌صورت TIFF به PDFهای قابل جست‌وجو (پس از آن با ابزار OCR ترکیب کنید) +- پردازش فایل‌های تصویربرداری پزشکی (اسلایدهای آسیب‌شناسی، خروجی‌های رادیولوژی) که از TIFF استفاده می‌کنند +- تبدیل فایل‌های TIFF مربوط به GIS یا تصاویر ماهواره‌ای به اسناد قابل اشتراک + +## نکته‌ها + +- TIFFهای چندصفحه‌ای کاملاً پشتیبانی می‌شوند. یک TIFF ده‌صفحه‌ای یک PDF ده‌صفحه‌ای تولید می‌کند. نیازی نیست ابتدا TIFF را تقسیم کنید. +- پردازش فایل‌های TIFF بسیار بزرگ (صدها مگابایت) ممکن است بیشتر طول بکشد، زیرا کل فایل باید در حافظهٔ مرورگر رمزگشایی شود. +- اگر روی PDF حاصل به OCR نیاز دارید، پس از تبدیل آن را با ابزار [OCR روی PDF](./ocr-pdf) پردازش کنید. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [BMP به PDF](./bmp-to-pdf) +- [JPG به PDF](./jpg-to-pdf) diff --git a/docs/fa/tools/txt-to-pdf.md b/docs/fa/tools/txt-to-pdf.md new file mode 100644 index 00000000..1b0453da --- /dev/null +++ b/docs/fa/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: متن به PDF +description: فایل‌های متنی ساده یا متن تایپ‌شده را با قلم، رنگ و اندازهٔ صفحهٔ دلخواه به PDF تبدیل کنید. +--- + +# متن به PDF + +متن ساده را به یک PDF قالب‌بندی‌شده تبدیل کنید. می‌توانید فایل‌های `.txt` بارگذاری کنید یا مستقیماً در ویرایشگر متن داخلی تایپ کنید. ابزار از چند قلم، رنگ متن سفارشی و طیف گسترده‌ای از اندازه‌های صفحه پشتیبانی می‌کند: از A0 تا A10، به‌علاوهٔ US Letter، Legal و Tabloid. + +## قالب‌های پشتیبانی‌شده + +| ورودی | پسوندها | +| :----------------- | :-------------------------- | +| فایل‌های متنی ساده | `.txt` | +| ورود مستقیم متن | تایپ یا چسباندن در ویرایشگر | + +## نحوهٔ کار + +1. حالت ورودی را با کلید بالای صفحه انتخاب کنید: **بارگذاری فایل‌ها** یا **تایپ متن**. +2. اگر بارگذاری می‌کنید، یک یا چند فایل `.txt` را بکشید و رها کنید یا با کلیک انتخاب کنید. اگر تایپ می‌کنید، متن را مستقیماً در کادر متن وارد کنید. +3. گزینه‌های قالب‌بندی را تنظیم کنید: خانوادهٔ قلم، اندازهٔ قلم، رنگ متن و اندازهٔ صفحه. +4. روی **ایجاد PDF** کلیک کنید. خروجی به‌صورت `text_to_pdf.pdf` دانلود می‌شود. + +هنگام بارگذاری چند فایل، محتوای آن‌ها با خطوط خالی بینشان به هم پیوسته می‌شود. + +## گزینه‌ها + +| گزینه | مقادیر | پیش‌فرض | +| :--------------- | :------------------------------------------------------------------------- | :------------- | +| **خانوادهٔ قلم** | Helvetica (بدون گیره)، Tiro (گیره‌دار)، Courier (هم‌عرض)، Times (گیره‌دار) | Helvetica | +| **اندازهٔ قلم** | 6 تا 72 pt | 12 | +| **رنگ متن** | هر رنگی با انتخابگر رنگ | سیاه (#000000) | +| **اندازهٔ صفحه** | ISO A0–A10، B0–B10، C0–C10، US Letter، Legal، Tabloid، Ledger، 11x17 | A4 | + +زبان‌های راست‌به‌چپ (عربی، عبری، فارسی، اردو) به‌طور خودکار شناسایی می‌شوند. وقتی متن راست‌به‌چپ یافت شود، جهت و تراز متن متناسب با آن تغییر می‌کند. + +## موارد استفاده + +- تبدیل قطعه‌کدها یا فایل‌های لاگ به PDF قابل چاپ با قلم Courier +- ساخت سریع PDF از یادداشت‌های جلسه که همان لحظه تایپ شده‌اند +- قالب‌بندی یک دست‌نوشتهٔ متنی ساده با قلم و اندازهٔ صفحهٔ مشخص برای ارسال +- تهیهٔ نسخهٔ PDF از README یا changelog برای توزیع آفلاین + +## نکته‌ها + +- وقتی می‌خواهید محتوای کلیپ‌بورد را بدون ذخیره در فایل سریع تبدیل کنید، از حالت **تایپ متن** استفاده کنید. +- Courier (هم‌عرض) بهترین انتخاب قلم برای کد، لاگ یا هر محتوایی است که تراز ستونی در آن اهمیت دارد. +- حاشیه‌های صفحه در همهٔ طرف‌ها روی 72 پوینت (۱ اینچ) ثابت است. + +## ابزارهای مرتبط + +- [Markdown به PDF](./markdown-to-pdf) +- [CSV به PDF](./csv-to-pdf) +- [Word به PDF](./word-to-pdf) diff --git a/docs/fa/tools/unlock-pdf.md b/docs/fa/tools/unlock-pdf.md new file mode 100644 index 00000000..71fb5b12 --- /dev/null +++ b/docs/fa/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: باز کردن قفل PDF +description: محافظت رمز عبور را از PDFهای رمزگذاری‌شده حذف کنید. از رمزگشایی دسته‌ای چند فایل با یک رمز عبور پشتیبانی می‌کند. +--- + +# باز کردن قفل PDF + +اگر رمز عبور یک PDF رمزگذاری‌شده را دارید، این ابزار رمزگذاری را به‌طور کامل حذف می‌کند و نسخه‌ای باز تولید می‌کند که هر کسی بدون اعتبارنامه می‌تواند آن را باز کند. وقتی چند PDF رمز عبور یکسانی دارند، رمزگشایی دسته‌ای پشتیبانی می‌شود. + +## نحوهٔ کار + +1. یک یا چند فایل PDF رمزگذاری‌شده بارگذاری کنید. +2. **رمز عبوری** را که برای محافظت از فایل‌ها استفاده شده وارد کنید. +3. روی **رمزگشایی PDF** کلیک کنید. +4. یک فایل تکی مستقیماً دانلود می‌شود. چند فایل یک بایگانی ZIP شامل همهٔ PDFهای باز‌شده تولید می‌کنند. + +## ویژگی‌ها + +- رمزگشایی تک‌فایلی و دسته‌ای +- پشتیبانی از رمز عبور کاربر و رمز عبور مالک +- تولید خروجی کاملاً رمزگذاری‌نشده بدون هیچ محدودیت باقی‌مانده +- گزارش خطای واضح برای رمز عبور نادرست یا فایل‌های خراب +- پیگیری موفقیت یا شکست هر فایل در حالت دسته‌ای + +## تفاوت با حذف محدودیت‌ها + +**رمزگشایی PDF** به رمز عبور نیاز دارد و همهٔ رمزگذاری را حذف می‌کند. **حذف محدودیت‌ها** محدودیت‌های استفاده (چاپ، کپی، ویرایش) را هدف می‌گیرد و اگر فقط رمز عبور مالک تنظیم شده باشد ممکن است به رمز عبور نیازی نداشته باشد. وقتی PDF بدون رمز عبور اصلاً باز نمی‌شود، از رمزگشایی استفاده کنید. + +## موارد استفاده + +- باز کردن دائمی PDFهایی که قبلاً رمزگذاری کرده‌اید، وقتی دیگر به رمز عبور نیازی نیست +- حذف رمزگذاری از دسته‌ای از اسناد بایگانی‌شده برای دسترسی آسان‌تر در بلندمدت +- آماده‌سازی PDFهای محافظت‌شده برای سیستم مدیریت اسنادی که از فایل‌های رمزگذاری‌شده پشتیبانی نمی‌کند +- باز کردن PDFها پیش از ادغام با اسناد دیگر (بسیاری از ابزارهای ادغام نمی‌توانند ورودی رمزگذاری‌شده را پردازش کنند) + +## نکته‌ها + +- فیلد رمز عبور برای همهٔ فایل‌های بارگذاری‌شده اعمال می‌شود. اگر PDFهای شما رمزهای متفاوتی دارند، آن‌ها را در دسته‌های جداگانه پردازش کنید. +- اگر خطای «رمز عبور نادرست» دریافت کردید، فاصله‌های انتهایی یا روشن بودن Caps Lock را بررسی کنید. +- پس از رمزگشایی، خروجی هیچ امنیتی ندارد. اگر به رمز عبور جدید نیاز دارید، با رمزگذاری PDF دوباره آن را رمزگذاری کنید. + +## ابزارهای مرتبط + +- [رمزگذاری PDF](./protect-pdf): اعمال دوبارهٔ رمزگذاری با رمز عبور جدید +- [حذف محدودیت‌ها](./remove-restrictions): حذف محدودیت‌های استفاده بدون رمزگشایی کامل +- [تغییر مجوزها](./change-permissions): تغییر مجوزهای مشخص روی یک PDF رمزگذاری‌شده diff --git a/docs/fa/tools/validate-signature-pdf.md b/docs/fa/tools/validate-signature-pdf.md new file mode 100644 index 00000000..c449e55f --- /dev/null +++ b/docs/fa/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: اعتبارسنجی امضا +description: امضاهای دیجیتال در فایل‌های PDF را تأیید کنید. اعتبار گواهی، هویت امضاکننده، یکپارچگی سند و وضعیت زنجیرهٔ اعتماد را بررسی کنید. +--- + +# اعتبارسنجی امضا + +یک PDF امضاشده بارگذاری کنید تا این ابزار همهٔ امضاهای دیجیتال را استخراج کند، امضاکننده را شناسایی کند، اعتبار گواهی را بررسی کند و گزارش دهد که آیا سند پس از امضا تغییر کرده است یا نه. همچنین می‌توانید یک گواهی مورد اعتماد ارائه دهید تا زنجیرهٔ امضا تأیید شود. + +## نحوهٔ کار + +1. یک فایل PDF امضاشده بارگذاری کنید. اعتبارسنجی به‌طور خودکار آغاز می‌شود. +2. ابزار خلاصه‌ای نمایش می‌دهد: تعداد امضاهای یافت‌شده و تعداد امضاهای معتبر. +3. برای هر امضا یک کارت جزئیات با نام امضاکننده، صادرکننده، تاریخ‌ها و وضعیت نمایش داده می‌شود. +4. در صورت تمایل، یک **گواهی مورد اعتماد** (.pem، .crt، .cer، .der) بارگذاری کنید تا امضا در برابر یک لنگر اعتماد مشخص تأیید شود. اعتبارسنجی دوباره به‌طور خودکار اجرا می‌شود. + +## چه چیزهایی بررسی می‌شود + +### تجزیهٔ امضا + +ابزار اشیای امضای PKCS#7 را از PDF استخراج می‌کند، ساختار ASN.1 را رمزگشایی می‌کند و گواهی X.509 امضاکننده را همراه با هر زنجیرهٔ گواهی جاسازی‌شده در امضا بیرون می‌کشد. + +### اعتبار گواهی + +- **انقضا**: آیا گواهی در حال حاضر در بازهٔ تاریخ معتبر خود قرار دارد؟ +- **تشخیص خودامضا**: آیا گواهی صادرکنندهٔ خودش است؟ +- **زنجیرهٔ اعتماد**: وقتی گواهی مورد اعتماد ارائه شده باشد، آیا زنجیرهٔ گواهی امضاکننده به آن می‌رسد؟ + +### تأیید رمزنگاری + +- ابزار بایت‌های تحت پوشش `/ByteRange` امضا را بازسازی می‌کند، آن‌ها را با الگوریتمی که امضاکننده اعلام کرده هش می‌کند و نتیجه را با ویژگی `messageDigest` داخل امضا مقایسه می‌کند. +- سپس ویژگی‌های امضاشده را دوباره به‌صورت یک DER SET سریال‌سازی می‌کند و امضا را با کلید عمومی گواهی امضاکننده تأیید می‌کند. +- **یک امضا فقط وقتی معتبر گزارش می‌شود که همهٔ این مراحل موفق باشند.** اگر بایت‌های PDF پس از امضا تغییر کرده باشند یا امضای جاسازی‌شده با کلید امضاکننده مطابقت نداشته باشد، وضعیت «نامعتبر: تأیید رمزنگاری ناموفق بود» همراه با دلیل مشخص نمایش داده می‌شود. + +#### الگوریتم‌های امضای پشتیبانی‌شده + +| الگوریتم | مسیر تأیید | +| ----------------------- | ------------------------------------------------------------------------------ | +| RSA (PKCS#1 v1.5) | `publicKey.verify` در node-forge، با جایگزین Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` پس از تبدیل امضای DER به IEEE P1363 | + +اگر امضایی از الگوریتمی خارج از این فهرست استفاده کند (برای مثال Ed25519، SM2 یا RSA با OID چکیدهٔ غیرمعمول)، کارت وضعیت **«تأییدنشده: الگوریتم امضای پشتیبانی‌نشده»** را به رنگ زرد همراه با OID یا دلیل مشخص نشان می‌دهد. این یک تمایز سه‌حالته و عمدی است: + +- **معتبر**: امضا به‌صورت رمزنگاری با کلید عمومی امضاکننده تأیید شده است. +- **نامعتبر**: تأیید اجرا شد و نتیجهٔ منفی داد (بایت‌ها تغییر کرده‌اند یا کلید مطابقت ندارد). +- **تأییدنشده**: ابزار نتوانست تأیید را برای این الگوریتم اجرا کند. فرادادهٔ گواهی همچنان نمایش داده می‌شود، اما باید امضا را «نامشخص» در نظر بگیرید و آن را با Adobe Acrobat یا `openssl cms -verify` تأیید کنید. + +### الگوریتم‌های چکیدهٔ ناامن + +- امضاهایی که از **MD5 یا SHA-1** استفاده می‌کنند نامعتبر شمرده شده و با وضعیت «چکیدهٔ ناامن» علامت‌گذاری می‌شوند. برای هر دو الگوریتم حملات تصادم منتشر شده است، بنابراین امضا روی هش SHA-1 یا MD5 هیچ تضمینی برای یکپارچگی ندارد. +- SHA-224، SHA-256، SHA-384 و SHA-512 همگی پذیرفته می‌شوند. + +### پوشش سند + +- **پوشش کامل**: امضا کل فایل PDF را پوشش می‌دهد، یعنی پس از امضا هیچ بایتی اضافه یا تغییر داده نشده است. +- **پوشش جزئی**: امضا فقط بخشی از فایل را پوشش می‌دهد. این می‌تواند نشان دهد که پس از امضا تغییراتی انجام شده است (نه لزوماً مخرب، چون ذخیره‌سازی‌های افزایشی پوشش جزئی ایجاد می‌کنند). + +## جزئیات امضا + +هر کارت امضا موارد زیر را نشان می‌دهد: + +- **امضاشده توسط**: نام عمومی، سازمان و ایمیل از گواهی امضاکننده +- **صادرکننده**: مرجع صدور گواهی که گواهی امضاکننده را صادر کرده است +- **تاریخ امضا**: مهر زمانی جاسازی‌شده در امضا +- **معتبر از / معتبر تا**: دورهٔ اعتبار گواهی +- **دلیل**: دلیل امضای سند (در صورت ارائه) +- **مکان**: محل امضا (در صورت ارائه) +- **وضعیت پوشش**: کامل یا جزئی +- **نشان اعتماد**: مورد اعتماد یا خارج از زنجیرهٔ اعتماد (فقط وقتی گواهی سفارشی ارائه شده باشد) + +### جزئیات فنی + +بخش جزئیات فنی را برای موارد زیر باز کنید: + +- شمارهٔ سریال گواهی امضاکننده +- الگوریتم چکیده (SHA-256، SHA-512 و غیره) +- الگوریتم امضا (RSA با SHA-256، ECDSA با SHA-256 و غیره) +- پیام‌های خطا برای امضاهای نامعتبر + +## موارد استفاده + +- تأیید یک قرارداد امضاشدهٔ دیجیتال پیش از امضای متقابل +- ممیزی اسناد امضاشده برای اطمینان از اینکه دستکاری نشده‌اند +- بررسی اینکه آیا گواهی از زمان امضای سند منقضی شده است +- اعتبارسنجی امضاها در برابر گواهی ریشهٔ سازمان شما +- بررسی جزئیات امضای اسناد دولتی یا حقوقی + +## نکته‌ها + +- گواهی خودامضا به معنای نامعتبر بودن امضا نیست، بلکه یعنی هویت امضاکننده از طریق یک شخص ثالث مورد اعتماد قابل تأیید نیست. این برای اسناد داخلی رایج است. +- پوشش جزئی همیشه نشانهٔ دستکاری نیست. بسیاری از گردش‌کارهای PDF به‌روزرسانی‌های افزایشی (مانند امضای دوم) اضافه می‌کنند که پوشش جزئی ایجاد می‌کند. +- گواهی ریشه یا میانی سازمان خود را به‌عنوان گواهی مورد اعتماد بارگذاری کنید تا زنجیرهٔ اعتماد تأیید شود. + +## ابزارهای مرتبط + +- [امضای دیجیتال](./digital-sign-pdf): امضای PDFها با گواهی خودتان +- [مسطح‌سازی PDF](./flatten-pdf): مسطح‌سازی PDF پیش از امضا برای جلوگیری از تغییرات پس از امضا +- [حذف فراداده](./remove-metadata): پاک‌سازی PDF پیش از اعمال امضا diff --git a/docs/fa/tools/view-metadata.md b/docs/fa/tools/view-metadata.md new file mode 100644 index 00000000..69203897 --- /dev/null +++ b/docs/fa/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: مشاهدهٔ فراداده +description: همهٔ ویژگی‌های فرادادهٔ یک PDF از جمله اطلاعات سند، داده‌های XMP و جزئیات ساختاری را بررسی کنید. +--- + +# مشاهدهٔ فراداده + +ویژگی‌های پنهان جاسازی‌شده در یک فایل PDF را بررسی کنید. این ابزار اطلاعات سند (عنوان، نویسنده، تاریخ‌ها)، فرادادهٔ XMP، ابعاد صفحه و سایر داده‌های ساختاری را در قالبی خوانا نمایش می‌دهد. + +## نحوهٔ کار + +1. یک فایل PDF بارگذاری کنید. +2. ابزار بلافاصله فایل را تجزیه می‌کند و همهٔ فرادادهٔ موجود را در بخش‌های منظم نمایش می‌دهد. +3. دیکشنری اطلاعات سند، درخت فرادادهٔ XMP و ویژگی‌های ساختاری را مرور کنید. +4. به هیچ مرحلهٔ پردازشی نیاز نیست: فراداده به‌محض بارگذاری فایل نمایش داده می‌شود. + +## ویژگی‌ها + +- نمایش فیلدهای استاندارد اطلاعات سند: عنوان، نویسنده، موضوع، کلیدواژه‌ها، سازنده، تولیدکننده +- نمایش تاریخ‌های ایجاد و تغییر در قالبی خوانا برای انسان +- تجزیه و نمایش کامل درخت فرادادهٔ XMP با فضاهای نام تودرتو +- تبدیل قالب تاریخ PDF (`D:20240101120000Z`) به تاریخ‌های خوانا +- سازمان‌دهی در بخش‌های تاشو برای پیمایش آسان + +## بخش‌های فراداده + +| بخش | محتوا | +| ----------------- | -------------------------------------------------------------------------------- | +| **اطلاعات سند** | عنوان، نویسنده، موضوع، کلیدواژه‌ها، سازنده، تولیدکننده، تاریخ ایجاد، تاریخ تغییر | +| **فرادادهٔ XMP** | درخت کامل فرادادهٔ مبتنی بر XML با فضاهای نام Dublin Core، XAP، PDF و سفارشی | +| **ویژگی‌های سند** | تعداد صفحات، نسخهٔ PDF، اندازهٔ فایل، وضعیت رمزگذاری | + +## موارد استفاده + +- بررسی اینکه چه کسی PDF را نوشته و آخرین بار کی تغییر کرده است +- اطمینان از تنظیم درست فراداده پیش از انتشار سند +- ممیزی PDFها از نظر حریم خصوصی با بررسی اطلاعات شخصی جاسازی‌شده +- بررسی نرم‌افزاری که برای ایجاد یا تغییر PDF استفاده شده (از طریق فیلد Producer) +- مرور فرادادهٔ XMP برای انطباق با مدیریت دارایی‌های دیجیتال + +## نکته‌ها + +- رشته‌های تاریخ PDF که با `D:` شروع می‌شوند به‌طور خودکار به قالب منطقهٔ زمانی محلی شما تبدیل می‌شوند. +- اگر فیلدهای فراداده خالی به نظر می‌رسند، سازندهٔ PDF آن‌ها را تنظیم نکرده است. همهٔ PDFها فرادادهٔ غنی ندارند. +- برای تغییر فراداده پس از بررسی، از [ویرایش فراداده](./edit-metadata) استفاده کنید. برای حذف کامل آن، از حذف فراداده استفاده کنید. + +## ابزارهای مرتبط + +- [ویرایش فراداده](./edit-metadata) +- [لایه‌های OCG در PDF](./pdf-layers) +- [مقایسهٔ PDFها](./compare-pdfs) diff --git a/docs/fa/tools/vsd-to-pdf.md b/docs/fa/tools/vsd-to-pdf.md new file mode 100644 index 00000000..8badd702 --- /dev/null +++ b/docs/fa/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD به PDF +description: نمودارهای Microsoft Visio (VSD/VSDX) را در مرورگر به PDF تبدیل کنید. رایگان، خصوصی، بدون نیاز به Visio. +--- + +# VSD به PDF + +نمودارهای Microsoft Visio را بدون نصب Visio به PDF تبدیل کنید. فایل‌های VSD و VSDX شامل فلوچارت‌ها، نمودارهای سازمانی، نمودارهای شبکه و نقشه‌های طبقات هستند که بیشتر افراد نمی‌توانند آن‌ها را باز کنند. این ابزار آن‌ها را به PDFهای تمیزی تبدیل می‌کند که روی هر دستگاهی قابل مشاهده‌اند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :----------- | :------ | :--------------------------------------- | +| Visio Binary | `.vsd` | قالب قدیمی Visio (Visio 2003 و قدیمی‌تر) | +| Visio XML | `.vsdx` | قالب مدرن Visio (Visio 2013 به بعد) | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های VSD یا VSDX خود را بکشید و رها کنید. هر دو قالب را می‌توان در یک دسته ترکیب کرد. +2. فهرست فایل‌ها را بررسی کنید. موارد ناخواسته را با نماد سطل زباله حذف کنید یا با **افزودن فایل‌های بیشتر** نمودارهای بیشتری اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور مبتنی بر LibreOffice در مرورگر بارگذاری می‌شود و هر نمودار را با حفظ شکل‌ها، اتصال‌دهنده‌ها، برچسب‌ها و چیدمان صفحه به PDF تبدیل می‌کند. +4. یک نمودار تکی مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل یک بایگانی ZIP با نام `vsd-to-pdf.zip` تولید می‌کنند. + +## گزینه‌ها + +به هیچ پیکربندی نیازی نیست. مبدل اندازه و جهت صفحهٔ اصلی سند Visio را حفظ می‌کند. + +## موارد استفاده + +- مرور نمودارهای Visio یک همکار وقتی مجوز Visio ندارید +- قرار دادن نمودارهای شبکه یا معماری در مستندات پروژه به‌صورت PDF +- چاپ نمودارهای سازمانی یا جریان‌های فرایند برای جزوه‌های جلسه +- بایگانی فایل‌های VSD قدیمی از نسخه‌های قدیمی‌تر Visio در قالبی ماندگار + +## نکته‌ها + +- اسناد چندصفحه‌ای Visio به PDFهای چندصفحه‌ای تبدیل می‌شوند و هر صفحهٔ Visio به یک صفحهٔ PDF نگاشت می‌شود. +- فایل‌های VSDX (قالب مدرن مبتنی بر XML) معمولاً با دقت بالاتری نسبت به فایل‌های باینری قدیمی VSD تبدیل می‌شوند. +- موتور LibreOffice در هر نشست یک بار بارگذاری می‌شود. در اولین تبدیل انتظار کوتاهی خواهید داشت و فایل‌های بعدی سریع‌تر پردازش می‌شوند. + +## ابزارهای مرتبط + +- [ODG به PDF](./odg-to-pdf) +- [PUB به PDF](./pub-to-pdf) +- [PSD به PDF](./psd-to-pdf) diff --git a/docs/fa/tools/webp-to-pdf.md b/docs/fa/tools/webp-to-pdf.md new file mode 100644 index 00000000..bf161345 --- /dev/null +++ b/docs/fa/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP به PDF +description: تصاویر WebP را مستقیماً در مرورگر با کیفیت فشرده‌سازی قابل تنظیم به قالب PDF تبدیل کنید. +--- + +# WebP به PDF + +قالب تصویر WebP گوگل را به PDF تبدیل کنید. این ابزار به‌ویژه وقتی مفید است که تصاویری را از وب با قالب WebP دانلود کرده‌اید و برای چاپ یا اشتراک‌گذاری به قالبی پذیرفته‌شده‌تر نیاز دارید. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :--- | :------ | +| WebP | `.webp` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های WebP خود را بکشید و رها کنید. +2. فهرست فایل‌ها را بررسی کنید و فایل‌هایی را که لازم ندارید حذف کنید. +3. یک سطح **کیفیت PDF** انتخاب کنید. +4. روی **تبدیل به PDF** کلیک کنید. خروجی با نام `from_webps.pdf` دانلود می‌شود. + +در داخل، هر تصویر WebP از طریق API canvas مرورگر رمزگشایی می‌شود و سپس با pdf-lib در PDF جاسازی می‌شود. یعنی تبدیل در هر مرورگری که از رمزگشایی WebP پشتیبانی کند کار می‌کند (همهٔ مرورگرهای مدرن پشتیبانی می‌کنند). + +## گزینه‌ها + +**کیفیت PDF** فشرده‌سازی هنگام جاسازی تصاویر را کنترل می‌کند: + +- **کیفیت بالا**: بیشترین جزئیات را حفظ می‌کند. +- **کیفیت متوسط** (پیش‌فرض): خروجی متعادل. +- **کیفیت پایین**: کمترین حجم فایل. + +## موارد استفاده + +- تبدیل تصاویر دانلودشده از وب که به‌صورت WebP ذخیره شده‌اند به PDF قابل چاپ +- بسته‌بندی اسکرین‌شات‌های WebP از Chrome یا Edge در مستندات +- ساخت نمونه‌کار PDF از تصاویری که ابزارهای طراحی به‌طور پیش‌فرض با WebP صادر می‌کنند +- بایگانی تصاویر WebP در قالبی با خوانایی گسترده‌تر + +## نکته‌ها + +- WebP پیش از جاسازی در PDF در داخل به PNG رمزگشایی می‌شود، بنابراین تصاویر WebP بدون اتلاف در تنظیم کیفیت بالا کیفیت خود را حفظ می‌کنند. +- اگر ترکیبی از WebP و قالب‌های تصویری دیگر دارید، به‌جای آن از ابزار [تصاویر به PDF](./image-to-pdf) استفاده کنید، چون همه را یک‌جا می‌پذیرد. + +## ابزارهای مرتبط + +- [تصاویر به PDF](./image-to-pdf) +- [PNG به PDF](./png-to-pdf) +- [JPG به PDF](./jpg-to-pdf) diff --git a/docs/fa/tools/word-to-pdf.md b/docs/fa/tools/word-to-pdf.md new file mode 100644 index 00000000..14a8631f --- /dev/null +++ b/docs/fa/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word به PDF +description: اسناد Word (DOC، DOCX)، ODT و RTF را در مرورگر با حفظ کامل قالب‌بندی به PDF تبدیل کنید. +--- + +# Word به PDF + +اسناد Microsoft Word و قالب‌های سازگار را به PDF تبدیل کنید. این ابزار از موتور LibreOffice مبتنی بر مرورگر استفاده می‌کند که فایل‌های DOC، DOCX، ODT و RTF را پردازش می‌کند و قالب‌بندی، جدول‌ها، تصاویر، سرصفحه‌ها، پاصفحه‌ها و سبک‌ها را در خروجی حفظ می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوندها | +| :---------------- | :------ | +| Word (مدرن) | `.docx` | +| Word (قدیمی) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا اسناد Word خود را بکشید و رها کنید. می‌توانید چند فایل را هم‌زمان انتخاب کنید. +2. فهرست فایل‌ها را بررسی و مدیریت کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور LibreOffice در اولین استفاده بارگذاری می‌شود (یک نشانگر پیشرفت وضعیت راه‌اندازی را نشان می‌دهد) و سپس هر فایل تبدیل می‌شود. +4. یک فایل تکی مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در `word-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +این ابزار تنظیمات اضافی ندارد. موتور LibreOffice خروجی را با نمایهٔ پیش‌فرض صدور PDF خود تولید می‌کند. + +## خروجی + +| تعداد ورودی | خروجی | +| :-------------- | :---------------------------------------------------------- | +| ۱ فایل | دانلود یک PDF (نام فایل اصلی با پسوند `.pdf`) | +| ۲ فایل یا بیشتر | بایگانی ZIP (`word-converted.zip`) شامل یک PDF برای هر فایل | + +## موارد استفاده + +- تبدیل رزومه یا نامهٔ همراه از DOCX به PDF پیش از ارسال درخواست شغلی +- تبدیل دسته‌ای مجموعه‌ای از قراردادها یا پیشنهادها به PDF برای تحویل به مشتری +- تبدیل فایل‌های قدیمی `.doc` به PDFهای مدرن برای بایگانی بلندمدت +- تبدیل اسناد مشارکتی Google Docs (صادرشده به‌صورت DOCX) به PDF +- تولید PDFهای آمادهٔ چاپ از قالب‌های Word که در تولید خودکار اسناد استفاده می‌شوند + +## نکته‌ها + +- موتور LibreOffice در هر نشست یک بار دانلود و در حافظهٔ پنهان ذخیره می‌شود. در اولین تبدیل چند ثانیه زمان بارگذاری لازم است و تبدیل‌های بعدی بسیار سریع‌ترند. +- قالب‌بندی‌های پیچیده (ماکروها، کنترل‌های ActiveX، SmartArt پیشرفته) ممکن است کاملاً درست تبدیل نشوند. عناصر استاندارد سند (متن، جدول‌ها، تصاویر، سرصفحه‌ها، پانویس‌ها) به‌طور قابل اعتمادی تبدیل می‌شوند. +- چون این ابزار ODT و RTF را هم می‌پذیرد، می‌توانید از آن به‌عنوان مبدل یکپارچه برای همهٔ قالب‌های واژه‌پرداز استفاده کنید. + +## ابزارهای مرتبط + +- [ODT به PDF](./odt-to-pdf) +- [RTF به PDF](./rtf-to-pdf) +- [Excel به PDF](./excel-to-pdf) +- [PowerPoint به PDF](./powerpoint-to-pdf) diff --git a/docs/fa/tools/wpd-to-pdf.md b/docs/fa/tools/wpd-to-pdf.md new file mode 100644 index 00000000..a04be06f --- /dev/null +++ b/docs/fa/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD به PDF +description: اسناد WordPerfect (WPD) را با LibreOffice در مرورگر به PDF تبدیل کنید. رایگان و خصوصی. +--- + +# WPD به PDF + +اسناد Corel WordPerfect را به فایل‌های PDF تبدیل کنید. WPD زمانی قالب غالب واژه‌پردازی در دفاتر حقوقی و نهادهای دولتی بود. اگر فایل‌های قدیمی WordPerfect دارید که نرم‌افزارهای مدرن آن‌ها را باز نمی‌کنند، این ابزار آن‌ها را به‌صورت PDF استاندارد دوباره زنده می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :---------- | :----- | :----------------------------- | +| WordPerfect | `.wpd` | همهٔ نسخه‌های اصلی WordPerfect | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های WPD خود را بکشید و رها کنید. می‌توانید چند فایل را هم‌زمان انتخاب کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های ناخواسته را با نماد سطل زباله حذف کنید یا با **افزودن فایل‌های بیشتر** اسناد بیشتری اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. ابزار یک موتور تبدیل مبتنی بر LibreOffice را در مرورگر شما بارگذاری می‌کند که قالب WPD را تجزیه کرده و PDF تولید می‌کند. +4. یک فایل تکی مستقیماً به‌صورت PDF دانلود می‌شود. تبدیل‌های دسته‌ای یک بایگانی ZIP با نام `wpd-to-pdf.zip` تولید می‌کنند. + +## گزینه‌ها + +به هیچ پیکربندی نیازی نیست. موتور LibreOffice قالب‌بندی، فونت‌ها و چیدمان WPD را به‌طور خودکار مدیریت می‌کند. + +## موارد استفاده + +- باز کردن اسناد حقوقی چنددهه‌ای که با WordPerfect نوشته شده‌اند +- تبدیل پرونده‌های دولتی بایگانی‌شده از WPD به قالبی مدرن +- انتقال کتابخانهٔ اسناد قدیمی WordPerfect به PDF برای نگهداری بلندمدت +- اشتراک‌گذاری فایل‌های WPD با گیرندگانی که Corel WordPerfect نصب ندارند + +## نکته‌ها + +- موتور LibreOffice در اولین استفاده بارگذاری می‌شود که کمی زمان می‌برد. تبدیل‌های بعدی در همان نشست سریع‌ترند. +- ماکروهای پیچیدهٔ WPD و reveal codes حفظ نمی‌شوند، اما چیدمان بصری، محتوای متنی و قالب‌بندی پایه به PDF منتقل می‌شوند. + +## ابزارهای مرتبط + +- [WPS به PDF](./wps-to-pdf) +- [ODG به PDF](./odg-to-pdf) diff --git a/docs/fa/tools/wps-to-pdf.md b/docs/fa/tools/wps-to-pdf.md new file mode 100644 index 00000000..17e5c93c --- /dev/null +++ b/docs/fa/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS به PDF +description: اسناد Microsoft Works (WPS) را در مرورگر به PDF تبدیل کنید. رایگان، بدون ثبت‌نام، کاملاً خصوصی. +--- + +# WPS به PDF + +فایل‌های واژه‌پرداز Microsoft Works را به PDF تبدیل کنید. Microsoft Works در اواخر دههٔ ۱۹۹۰ و دههٔ ۲۰۰۰ همراه رایانه‌های شخصی عرضه می‌شد و هنوز فایل‌های WPS زیادی روی هارددیسک‌های قدیمی و بایگانی‌های ایمیل وجود دارند. این ابزار آن‌ها را در مرورگر باز می‌کند و PDFهای تمیز تولید می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :-------------- | :----- | :---------------------------------- | +| Microsoft Works | `.wps` | فایل‌های واژه‌پرداز Microsoft Works | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های WPS خود را بکشید و رها کنید. چند فایل پذیرفته می‌شود. +2. فهرست فایل‌ها را بررسی کنید. با نماد سطل زباله فایل‌ها را جداگانه حذف کنید یا روی **افزودن فایل‌های بیشتر** کلیک کنید تا دسته را گسترش دهید. +3. روی **تبدیل به PDF** کلیک کنید. یک موتور مبتنی بر LibreOffice در مرورگر بارگذاری می‌شود و هر سند WPS را به PDF تبدیل می‌کند. +4. یک فایل مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در یک بایگانی ZIP با نام `wps-to-pdf.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +به تنظیمات اضافی نیازی نیست. مبدل متن، قالب‌بندی پایه و تصاویر جاسازی‌شده در فایل WPS را پردازش می‌کند. + +## موارد استفاده + +- بازیابی اسناد قدیمی مدرسه یا کار که با قالب Microsoft Works ذخیره شده‌اند +- باز کردن پیوست‌های ایمیل WPS وقتی Microsoft Works نصب ندارید +- تبدیل بایگانی فایل‌های WPS برای انتقال به یک سیستم اسناد مدرن +- چاپ اسناد قدیمی که واژه‌پردازهای فعلی نمی‌توانند آن‌ها را باز کنند + +## نکته‌ها + +- فایل‌های `.wps` مربوط به Microsoft Works را با فایل‌های WPS Office اشتباه نگیرید. این ابزار مخصوص قالب قدیمی‌تر Microsoft Works است. +- بارگذاری موتور LibreOffice در اولین استفاده کمی زمان می‌برد. پس از بارگذاری، تبدیل‌های بعدی در همان نشست سریع‌تر اجرا می‌شوند. + +## ابزارهای مرتبط + +- [WPD به PDF](./wpd-to-pdf) +- [PUB به PDF](./pub-to-pdf) diff --git a/docs/fa/tools/xml-to-pdf.md b/docs/fa/tools/xml-to-pdf.md new file mode 100644 index 00000000..4574da44 --- /dev/null +++ b/docs/fa/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML به PDF +description: فایل‌های XML را در مرورگر به اسناد PDF ساختاریافته تبدیل کنید. رایگان، خصوصی، بدون پردازش روی سرور. +--- + +# XML به PDF + +فایل‌های دادهٔ XML را به اسناد PDF خوانا و ساختاریافته تبدیل کنید. XML خام قدرتمند است اما خواندن آن برای انسان دشوار است. این ابزار درخت XML را تجزیه می‌کند، ساختارهای دادهٔ تکرارشونده را شناسایی می‌کند و آن‌ها را به‌صورت جدول‌ها و بخش‌های قالب‌بندی‌شده در یک PDF افقی A4 نمایش می‌دهد. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :--- | :----- | :------------------ | +| XML | `.xml` | هر سند XML خوش‌ساخت | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های XML خود را بکشید و رها کنید. چند فایل را می‌توان در یک دسته پردازش کرد. +2. فهرست فایل‌ها را بررسی کنید. فایل‌های ناخواسته را با نماد سطل زباله حذف کنید یا روی **افزودن فایل‌های بیشتر** کلیک کنید. +3. روی **تبدیل به PDF** کلیک کنید. ابزار ساختار XML را با DOMParser داخلی مرورگر تجزیه می‌کند، سلسله‌مراتب داده را تحلیل می‌کند و آن را با jsPDF و قالب‌بندی auto-table به PDF تبدیل می‌کند. +4. یک فایل تکی به‌صورت PDF دانلود می‌شود. چند تبدیل در `xml-to-pdf.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +به پیکربندی دستی نیازی نیست. مبدل ساختار XML را به‌طور خودکار تشخیص می‌دهد و چیدمان‌های جدول مناسب را انتخاب می‌کند. خروجی از جهت افقی A4 استفاده می‌کند تا مجموعه‌داده‌های عریض جا شوند. + +## موارد استفاده + +- تبدیل خروجی‌های دادهٔ XML از پایگاه‌داده‌ها یا APIها به گزارش‌های قابل چاپ +- ساخت خلاصه‌های خوانا از فایل‌های پیکربندی XML +- تبدیل فاکتورها یا لاگ‌های تراکنش مبتنی بر XML به PDF برای نگهداری سوابق +- خوانا کردن نقشه‌های سایت XML یا خوراک‌های RSS در قالب سند + +## نکته‌ها + +- XML باید خوش‌ساخت باشد. اگر تجزیه‌گر با خطای نحوی روبه‌رو شود، تبدیل با یک پیام خطای توصیفی که به مشکل اشاره می‌کند ناموفق می‌شود. +- ساختارهای XML با تودرتویی عمیق به جدول‌ها تخت می‌شوند. برای بهترین نتیجه، داده باید عناصر هم‌سطح تکرارشونده با عناصر فرزند یکسان داشته باشد. +- در طول تبدیل، به‌روزرسانی‌های پیشرفت نمایش داده می‌شوند و هر مرحله را نشان می‌دهند: خواندن، تجزیه، تحلیل و رندر. + +## ابزارهای مرتبط + +- [FB2 به PDF](./fb2-to-pdf) +- [XPS به PDF](./xps-to-pdf) +- [ایمیل به PDF](./email-to-pdf) diff --git a/docs/fa/tools/xps-to-pdf.md b/docs/fa/tools/xps-to-pdf.md new file mode 100644 index 00000000..7e606357 --- /dev/null +++ b/docs/fa/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS به PDF +description: اسناد XPS و OXPS را در مرورگر به قالب PDF تبدیل کنید. بدون بارگذاری، بدون ثبت‌نام، کاملاً خصوصی. +--- + +# XPS به PDF + +اسناد Microsoft XPS و OXPS را به فایل‌های PDF استاندارد تبدیل کنید. XPS (XML Paper Specification) پاسخ Microsoft به PDF بود، اما پشتیبانی از آن در پلتفرم‌های مختلف کاهش یافته است. این ابزار این اسناد را دوباره برای همه خوانا می‌کند. + +## قالب‌های پشتیبانی‌شده + +| قالب | پسوند | توضیحات | +| :--- | :------ | :--------------------------------- | +| XPS | `.xps` | قالب اصلی Microsoft XPS | +| OXPS | `.oxps` | Open XPS، نسخهٔ استاندارد ECMA-388 | + +## نحوهٔ کار + +1. روی ناحیهٔ بارگذاری کلیک کنید یا فایل‌های XPS/OXPS خود را بکشید و رها کنید. می‌توانید چند فایل را هم‌زمان انتخاب کنید. +2. فهرست فایل‌ها را بررسی کنید. فایل‌ها را جداگانه با نماد سطل زباله حذف کنید یا روی **افزودن فایل‌های بیشتر** کلیک کنید تا اسناد دیگری اضافه کنید. +3. روی **تبدیل به PDF** کلیک کنید. موتور PyMuPDF هر سند را به‌صورت محلی در مرورگر شما پردازش می‌کند. +4. یک فایل تکی مستقیماً به‌صورت PDF دانلود می‌شود. چند فایل در یک بایگانی ZIP با نام `xps-converted.zip` بسته‌بندی می‌شوند. + +## گزینه‌ها + +این ابزار یک تبدیل مستقیم قالب را بدون پیکربندی اضافی انجام می‌دهد. خروجی ابعاد صفحه، گرافیک‌های برداری، فونت‌ها و تصاویر منبع XPS را حفظ می‌کند. + +## موارد استفاده + +- باز کردن فایل‌های XPS دریافتی از سیستم‌های قدیمی Windows که به‌طور پیش‌فرض از درایور چاپ XPS استفاده می‌کردند +- تبدیل اسناد OXPS از Windows 10/11 برای اشتراک‌گذاری با کاربران macOS یا Linux +- بایگانی فایل‌های قدیمی XPS در قالبی با پشتیبانی گسترده‌تر +- دسترس‌پذیر کردن اسناد دولتی یا سازمانی مبتنی بر XPS برای گیرندگان خارجی + +## نکته‌ها + +- هر دو پسوند `.xps` و `.oxps` به‌طور خودکار پردازش می‌شوند، بنابراین می‌توانید آن‌ها را در یک دسته ترکیب کنید. +- اگر فایل XPS اصلی با یک درایور چاپ با وضوح بالا ایجاد شده باشد، PDF حاصل همان کیفیت را حفظ می‌کند. هیچ نمونه‌برداری مجددی انجام نمی‌شود. + +## ابزارهای مرتبط + +- [Word به PDF](./word-to-pdf) +- [XML به PDF](./xml-to-pdf) diff --git a/docs/fr/contributing.md b/docs/fr/contributing.md new file mode 100644 index 00000000..047c7a46 --- /dev/null +++ b/docs/fr/contributing.md @@ -0,0 +1,136 @@ +# Contribuer + +Merci de votre intérêt pour la contribution à BentoPDF ! Ce guide vous aidera à démarrer. + +## Premiers pas + +### Prérequis + +- Node.js 18+ +- npm 9+ +- Git + +### Installation + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Structure du projet + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Ajouter un nouvel outil + +### Étape 1 : créer le fichier de logique + +Créez `src/js/logic/your-tool-page.ts` : + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Étape 2 : créer la page HTML + +Créez `src/pages/your-tool.html` en suivant les modèles d'outils existants. + +### Étape 3 : enregistrer l'outil + +Ajoutez dans `src/js/config/tools.ts` : + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Étape 4 : ajouter à la configuration de build + +Ajoutez la page dans `vite.config.ts` : + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Étape 5 : ajouter les traductions + +Ajoutez des entrées dans tous les fichiers de langue de `public/locales/` : + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Style de code + +- Utilisez TypeScript pour tout nouveau code +- Suivez les conventions existantes pour rester cohérent +- Exécutez `npm run format` avant de commiter +- Pas de commentaires dans le code de production (les commentaires sont supprimés lors du build) + +## Processus de pull request + +1. Créez une branche de fonctionnalité : `git checkout -b feature/your-feature` +2. Effectuez vos modifications +3. Testez soigneusement : `npm run build` +4. Soumettez une PR avec une description claire + +## Traduction + +Consultez [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) pour ajouter de nouvelles langues. + +## Contrat de licence de contributeur + +Avant que votre PR puisse être fusionnée, vous devrez signer notre CLA : + +- [CLA individuel (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA d'entreprise (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Obtenir de l'aide + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Communauté Discord](https://discord.gg/Bgq3Ay3f2w) + +## Licence + +BentoPDF est sous double licence : + +- **AGPL-3.0** pour les projets open source où vous partagez publiquement l'intégralité de votre code source +- **Licence commerciale** pour les applications propriétaires ou à code source fermé - [Obtenir la licence à vie pour 79 $](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +En contribuant, vous acceptez que vos contributions soient placées sous ces conditions de licence. diff --git a/docs/fr/getting-started.md b/docs/fr/getting-started.md new file mode 100644 index 00000000..a7dfcd9d --- /dev/null +++ b/docs/fr/getting-started.md @@ -0,0 +1,80 @@ +# Premiers pas + +Bienvenue sur BentoPDF ! Ce guide vous aidera à démarrer rapidement. + +## Qu'est-ce que BentoPDF ? + +BentoPDF est une boîte à outils PDF gratuite, open source et axée sur la confidentialité, qui fonctionne **entièrement dans votre navigateur**. Vos fichiers ne quittent jamais votre appareil : tout le traitement se fait en local grâce à la technologie WebAssembly (WASM). + +## Démarrage rapide + +### Option 1 : utiliser la version hébergée + +Rendez-vous sur [bentopdf.com](https://www.bentopdf.com) pour utiliser BentoPDF immédiatement, sans aucune installation. + +### Option 2 : auto-hébergement avec Docker + +> [!IMPORTANT] +> La conversion de fichiers Office nécessite `SharedArrayBuffer`, qui requiert à la fois : +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - un contexte sécurisé +> +> `http://localhost` fonctionne pour les tests locaux, car les navigateurs considèrent le bouclage local comme fiable. `http://192.168.x.x` ou d'autres adresses IP du réseau local ne le sont généralement pas, donc les conversions Word/Excel/PowerPoint nécessiteront HTTPS lorsqu'on y accède depuis d'autres appareils de votre réseau. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF est proposé en deux versions : la **version auto-hébergée** (`bentopdf-simple`, utilisée ci-dessus) pour les déploiements internes, d'équipe ou d'organisation, et la **version commerciale** (`bentopdf:latest`) utilisée par bentopdf.com lui-même et par les détenteurs d'une licence commerciale qui exploitent des déploiements publics. Les deux proposent les mêmes outils PDF : la version commerciale ajoute la section d'en-tête, la FAQ, les témoignages et le pied de page de bentopdf.com. En cas de doute, utilisez la version auto-hébergée. + +Ouvrez ensuite `http://localhost:3000` dans votre navigateur. + +> [!NOTE] +> Si vous préparez un déploiement OCR isolé du réseau (air-gapped), vous devez héberger en interne les polices de la couche de texte OCR, en plus du worker Tesseract, du runtime principal et des fichiers traineddata. La configuration complète est documentée dans [Auto-hébergement](/fr/self-hosting/), y compris `VITE_OCR_FONT_BASE_URL` et le dossier `ocr-fonts/` fourni. + +### Option 3 : compiler depuis les sources + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Aperçu des fonctionnalités + +| Catégorie | Outils | +| ------------------------ | -------------------------------------------------------------------------- | +| **Convertir en PDF** | Word, Excel, PowerPoint, images, Markdown, EPUB, MOBI et plus encore | +| **Convertir depuis PDF** | JPG, PNG, texte, Excel, SVG et plus encore | +| **Modifier et annoter** | Signer, surligner, caviarder, remplir des formulaires, ajouter des tampons | +| **Organiser** | Fusionner, diviser, pivoter, supprimer des pages, réorganiser | +| **Optimiser** | Compresser, réparer, aplatir, OCR | +| **Sécurité** | Chiffrer, déchiffrer, supprimer les restrictions | + +## Prise en charge des navigateurs + +BentoPDF fonctionne mieux sur les navigateurs modernes : + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Étapes suivantes + +- [Explorer tous les outils](/fr/tools/) +- [Auto-héberger BentoPDF](/fr/self-hosting/) +- [Contribuer au projet](/fr/contributing) diff --git a/docs/fr/index.md b/docs/fr/index.md new file mode 100644 index 00000000..2b2c896a --- /dev/null +++ b/docs/fr/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Outils PDF gratuits et open source' + tagline: Traitez vos PDF entièrement dans votre navigateur. Aucun envoi. Aucun serveur. Confidentialité totale. + actions: + - theme: brand + text: Commencer + link: /fr/getting-started + - theme: alt + text: Voir les outils + link: /fr/tools/ + - theme: alt + text: Auto-héberger + link: /fr/self-hosting/ + - theme: alt + text: Licence commerciale + link: /fr/licensing + +features: + - icon: 🔒 + title: 100 % privé + details: Vos fichiers ne quittent jamais votre appareil. Tout le traitement se fait en local dans votre navigateur grâce à WebAssembly. + - icon: ⚡ + title: Rapide et gratuit + details: Sans inscription, sans limites, sans filigranes. Traitez autant de PDF que vous voulez, gratuitement, pour toujours. + - icon: 🛠️ + title: Plus de 50 outils + details: Convertissez, modifiez, fusionnez, divisez, compressez, signez, appliquez l'OCR et bien plus. Tout ce dont vous avez besoin au même endroit. + + - icon: 🌐 + title: Auto-hébergeable + details: Déployez sur votre propre infrastructure. Docker, Vercel, Netlify, AWS, ou environnements totalement isolés du réseau avec workers OCR, données de langue et polices de couche de texte auto-hébergés. +--- + +## OCR hors ligne + +Si vous auto-hébergez BentoPDF dans un environnement isolé du réseau ou hors ligne, l'OCR nécessite plus que le worker Tesseract et les fichiers traineddata. La production de PDF avec texte recherchable exige aussi que les polices de la couche de texte OCR soient servies en interne. +Consultez [Auto-hébergement](/fr/self-hosting/) pour la configuration complète, y compris `VITE_OCR_FONT_BASE_URL`, le dossier `ocr-fonts/` fourni et le workflow isolé mis à jour. diff --git a/docs/fr/licensing.md b/docs/fr/licensing.md new file mode 100644 index 00000000..f19c81e3 --- /dev/null +++ b/docs/fr/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/fr/self-hosting/#configuration-wasm-composants-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/fr/self-hosting/apache.md b/docs/fr/self-hosting/apache.md new file mode 100644 index 00000000..5db56a34 --- /dev/null +++ b/docs/fr/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Déployer avec Apache + +Hébergez BentoPDF avec Apache HTTP Server. + +## Prérequis + +- Apache 2.4+ +- mod_rewrite activé +- Certificat SSL (recommandé) + +## Étape 1 : compiler le projet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Pour personnaliser l'image de marque, définissez des variables d'environnement avant la compilation : + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Étape 2 : copier les fichiers + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Étape 3 : configuration d'Apache + +Créez `/etc/apache2/sites-available/bentopdf.conf` : + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Étape 4 : .htaccess pour le routage + +Créez `/var/www/bentopdf/.htaccess` : + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Étape 5 : activer les modules requis + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Étape 6 : activer le site + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Déploiement dans un sous-répertoire + +Pour héberger sous `/pdf/` : + +1. Compilez avec l'URL de base : + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Mettez à jour `.htaccess` : + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Dépannage + +### Erreurs 404 sur les fichiers WASM + +Vérifiez que le type MIME est configuré : + +```apache +AddType application/wasm .wasm +``` + +### Signer un PDF ou le remplissage de formulaires affiche un visualiseur vide (erreur MIME `.mjs`) + +Si la console du navigateur affiche : + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…et que la requête en échec se termine par `.mjs`, il manque à votre configuration Apache l'association `.mjs → application/javascript`. Le visualiseur PDF fourni livre des modules ES avec l'extension `.mjs`, et le fichier `mime.types` standard d'Apache ne les inclut pas par défaut. + +Ajoutez à votre VirtualHost ou à `.htaccess` : + +```apache +AddType application/javascript .mjs +``` + +Rechargez ensuite Apache : + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Pour vérifier : dans les DevTools du navigateur → onglet Réseau, trouvez la requête `.mjs` en échec et consultez l'en-tête de réponse `Content-Type`. Il doit maintenant valoir `application/javascript`, et non `application/octet-stream`. + +### La réécriture ne fonctionne pas + +Vérifiez que mod_rewrite est activé : + +```bash +sudo a2enmod rewrite +``` + +### La conversion Word/ODT/Excel vers PDF ne fonctionne pas + +LibreOffice WASM nécessite `SharedArrayBuffer`, qui exige ces en-têtes : + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Un contexte sécurisé est également nécessaire. `http://localhost` fonctionne pour les tests locaux, mais `http://192.168.x.x` ou d'autres adresses IP du réseau local nécessitent généralement HTTPS. Si les en-têtes sont présents mais que `window.crossOriginIsolated` vaut toujours `false`, vérifiez si la page est ouverte en HTTP simple sur une origine autre que le bouclage local. + +Les fichiers précompressés `.wasm.gz` et `.data.gz` ont aussi besoin du bon `Content-Encoding` : + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Vérifiez que `mod_headers` est activé : `sudo a2enmod headers` + +### Permission refusée + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/fr/self-hosting/aws.md b/docs/fr/self-hosting/aws.md new file mode 100644 index 00000000..a7004065 --- /dev/null +++ b/docs/fr/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Déployer sur AWS S3 + CloudFront + +Hébergez BentoPDF sur AWS pour un contrôle et une évolutivité maximaux. + +## Architecture + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Étape 1 : créer le bucket S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Étape 2 : compiler et téléverser + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Étape 3 : créer la distribution CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Ou utilisez la console AWS : + +1. Allez dans CloudFront → Create distribution +2. Origin domain : sélectionnez votre bucket S3 +3. Activez « Origin Access Control » +4. Default root object : `index.html` +5. Créez la distribution + +## Étape 3b : politique d'en-têtes de réponse (requise pour LibreOffice WASM) + +Les conversions basées sur LibreOffice (Word, Excel, PowerPoint vers PDF) nécessitent `SharedArrayBuffer`, qui exige des en-têtes de réponse spécifiques. Créez une politique d'en-têtes de réponse CloudFront : + +1. Allez dans CloudFront → Policies → Response headers +2. Créez une politique personnalisée avec ces en-têtes : + +| Header | Value | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Associez la politique au comportement de cache par défaut de votre distribution + +Ou via la CLI : + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Étape 3c : métadonnées S3 pour les fichiers WASM précompressés + +Les fichiers WASM de LibreOffice sont précompressés (`.wasm.gz`, `.data.gz`). Définissez le bon Content-Type et le bon Content-Encoding pour que les navigateurs les décompressent : + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Important +Sans la politique d'en-têtes de réponse, `SharedArrayBuffer` n'est pas disponible et les conversions LibreOffice WASM resteront bloquées à environ 55 %. Sans le bon Content-Encoding sur les fichiers `.gz`, le navigateur reçoit des octets gzip bruts et la compilation WASM échoue. +::: + +## Étape 4 : politique du bucket S3 + +Autorisez CloudFront à accéder au bucket : + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Étape 5 : pages d'erreur personnalisées + +Configurez la 404 pour renvoyer `index.html` afin de gérer le routage SPA : + +1. CloudFront → Error pages +2. Créez une réponse d'erreur personnalisée : + - HTTP error code : 404 + - Response page path : `/index.html` + - HTTP response code : 200 + +## Estimation des coûts + +| Ressource | Coût estimé | +| ----------------------------- | ------------ | +| Stockage S3 (~500 Mo) | ~0,01 $/mois | +| CloudFront (1 To transféré) | ~85 $/mois | +| CloudFront (10 Go transférés) | ~0,85 $/mois | + +::: tip +Utilisez S3 Intelligent Tiering pour optimiser les coûts des fichiers rarement consultés. +::: + +## Automatisation avec Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/fr/self-hosting/cloudflare.md b/docs/fr/self-hosting/cloudflare.md new file mode 100644 index 00000000..47bfca85 --- /dev/null +++ b/docs/fr/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Déployer sur Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) propose un hébergement de sites statiques rapide et mondial, avec une bande passante illimitée. + +## Déploiement rapide + +1. Allez sur [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Cliquez sur « Create a project » +3. Connectez votre dépôt GitHub + +## Configuration du build + +| Paramètre | Valeur | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Variables d'environnement + +Ajoutez-les dans Settings → Environment variables : + +| Variable | Valeur | +| ----------------------- | ---------------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (facultatif) | +| `VITE_BRAND_NAME` | Nom de marque personnalisé (facultatif) | +| `VITE_BRAND_LOGO` | Chemin du logo relatif à `public/` (facultatif) | +| `VITE_FOOTER_TEXT` | Texte de pied de page/copyright personnalisé (facultatif) | +| `VITE_DEFAULT_LANGUAGE` | Langue par défaut de l'interface, p. ex. `fr` (facultatif) | + +## Fichier de configuration + +Créez `_headers` dans votre dossier `public` : + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Important +Les en-têtes `Cross-Origin-Embedder-Policy` et `Cross-Origin-Opener-Policy` sont requis pour les conversions Word/ODT/Excel/PowerPoint vers PDF. Sans eux, `SharedArrayBuffer` n'est pas disponible et le moteur LibreOffice WASM ne parviendra pas à s'initialiser. +::: + +Créez `_redirects` pour le routage SPA : + +``` +/* /index.html 200 +``` + +## Domaine personnalisé + +1. Ouvrez votre projet Pages +2. Cliquez sur « Custom domains » +3. Ajoutez votre domaine +4. Cloudflare configurera automatiquement le DNS si le domaine est chez Cloudflare + +## Avantages + +- **Bande passante illimitée et gratuite** +- **CDN mondial** avec plus de 300 points de présence +- **HTTPS automatique** +- **Déploiements de prévisualisation** pour les pull requests +- **Builds rapides** + +## Dépannage + +### Téléversement de gros fichiers + +Cloudflare Pages prend en charge les fichiers jusqu'à 25 Mo. Les modules WASM ne devraient pas poser de problème, mais si vous atteignez les limites, envisagez : + +```bash +# Split large files during build +npm run build +``` + +### Limites de taille des Workers + +Si vous utilisez Cloudflare Workers pour un routage avancé, notez la limite de 1 Mo des offres gratuites. + +## Worker proxy CORS (pour les signatures numériques) + +L'outil de signature numérique nécessite un proxy CORS pour récupérer les chaînes de certificats. Déployez le worker fourni : + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Fonctionnalités de sécurité + +| Fonctionnalité | Description | +| -------------------------- | --------------------------------------------- | +| **Restrictions d'URL** | Seules les URL de certificats sont autorisées | +| **Limite de taille** | 10 Mo max par requête | +| **Limitation de débit** | 60 req/IP/min (nécessite KV) | +| **Blocage des IP privées** | Bloque localhost et les IP internes | + +### Activer la limitation de débit + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Compiler avec l'URL du proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Ou avec Docker : + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Remarque :** Consultez le [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) pour la configuration de la signature HMAC. diff --git a/docs/fr/self-hosting/cors-proxy.md b/docs/fr/self-hosting/cors-proxy.md new file mode 100644 index 00000000..efc8d7ca --- /dev/null +++ b/docs/fr/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Proxy CORS pour la récupération des certificats + +L'outil de signature numérique utilise un proxy CORS pour récupérer les certificats des émetteurs auprès d'autorités de certification (AC) externes. C'est nécessaire, car de nombreux serveurs d'AC n'incluent pas d'en-têtes CORS dans leurs réponses, ce qui empêche la récupération directe depuis le navigateur. + +De plus, de nombreux serveurs d'AC diffusent leurs certificats en HTTP simple. Lorsque votre instance BentoPDF est servie en HTTPS, les navigateurs bloquent ces requêtes HTTP (politique de contenu mixte). Le proxy CORS résout ces deux problèmes en faisant transiter les requêtes par un point de terminaison HTTPS avec les bons en-têtes. + +## Fonctionnement + +Lors de la signature d'un PDF avec un certificat : + +1. La bibliothèque `zgapdfsigner` tente de construire une chaîne de certificats complète +2. Elle récupère les certificats des émetteurs à partir des URL intégrées à l'extension AIA (Authority Information Access) de votre certificat +3. Ces requêtes passent par un proxy CORS qui ajoute les en-têtes `Access-Control-Allow-Origin` nécessaires +4. Le proxy renvoie les données du certificat au navigateur + +## Auto-héberger le proxy CORS + +Si vous auto-hébergez BentoPDF, vous devrez déployer votre propre proxy CORS pour que les signatures numériques fonctionnent avec les certificats qui nécessitent la récupération de la chaîne. + +### Option 1 : Cloudflare Workers (recommandé) + +1. **Installez la CLI Wrangler** : + + ```bash + npm install -g wrangler + ``` + +2. **Connectez-vous à Cloudflare** : + + ```bash + wrangler login + ``` + +3. **Clonez BentoPDF et mettez à jour les origines autorisées** : + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Ouvrez `cors-proxy-worker.js` et remplacez le tableau `ALLOWED_ORIGINS` par votre domaine : + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Important + Sans cette modification, le proxy rejettera toutes les requêtes de votre site avec une erreur **403 Forbidden**. Par défaut, seules les requêtes provenant de `bentopdf.com` sont autorisées. + ::: + +4. **Déployez le proxy** : + + ```bash + wrangler deploy + ``` + + Notez l'URL de votre worker (p. ex. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Recompilez BentoPDF avec l'URL du proxy** : + + Avec Docker : + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Avec une compilation depuis les sources : + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Option 2 : proxy backend personnalisé + +Vous pouvez aussi créer votre propre point de terminaison proxy. Les exigences sont les suivantes : + +1. Accepter les requêtes GET avec un paramètre de requête `url` +2. Récupérer l'URL depuis votre serveur (aucune restriction CORS côté serveur) +3. Renvoyer la réponse avec ces en-têtes : + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Exemple d'implémentation avec Express.js : + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Considérations de sécurité + +Le Cloudflare Worker fourni intègre plusieurs mesures de sécurité : + +| Fonctionnalité | Description | +| --------------------------- | ----------------------------------------------------------------------------------------------- | +| **Validation de l'origine** | Autorise uniquement les requêtes des domaines listés dans `ALLOWED_ORIGINS` | +| **Restrictions d'URL** | Autorise uniquement les URL de certificats (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blocage des IP privées** | Bloque les plages privées IPv4/IPv6, link-local, bouclage, IP décimales et métadonnées cloud | +| **Sûreté du Content-Type** | Ne renvoie que des types MIME de certificat sûrs, bloque l'injection de content-type en amont | +| **Limite de taille** | Réponse en flux limitée à 10 Mo, interrompue en cours de téléchargement en cas de dépassement | +| **Limitation de débit** | 60 requêtes par minute par IP ou IPv6 /64 (nécessite KV, laisse passer en cas d'erreur KV) | +| **Signatures HMAC** | Signature côté client facultative (dissuade les abus occasionnels) | + +### DNS rebinding (auto-hébergement hors Cloudflare) + +Le worker rejette toute URL qui se résout vers une IP privée ou interne. Il ne peut pas utiliser une liste fixe d'hôtes autorisés, car les URL des chaînes de certificats pointent vers l'AC qui a émis le certificat (FNMT, AC d'entreprise, etc.), donc les destinations ne sont pas connues à l'avance. Il reste une petite fenêtre de rebinding : une personne qui gère le DNS de son propre domaine pourrait renvoyer une IP publique lors du contrôle de sécurité, puis une IP privée pour la vraie requête un instant plus tard. + +Sur Cloudflare, ce n'est pas exploitable : les Workers ne peuvent pas atteindre les IP privées ni le point de terminaison de métadonnées `169.254.169.254`, donc un rebinding n'aboutit à rien. Ne donnez simplement pas au worker de voie d'accès : n'associez ni Tunnel, ni Service, ni binding de réseau privé (il n'a besoin que de `RATE_LIMIT_KV`). + +Si vous l'exécutez hors de Cloudflare (workerd, Node, etc.) dans un VPC, le runtime _peut_ atteindre les IP internes. Placez un pare-feu de sortie devant lui et bloquez les plages privées : `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` et leurs équivalents IPv6. Le code de l'application ne peut pas l'imposer une fois hors de Cloudflare. + +## Désactiver le proxy + +Si vous ne souhaitez pas utiliser de proxy CORS, définissez la variable d'environnement sur une chaîne vide : + +``` +VITE_CORS_PROXY_URL= +``` + +**Remarque** : sans le proxy, la signature avec des certificats qui nécessitent la récupération externe de la chaîne (comme FNMT ou certaines AC d'entreprise) échouera avec une erreur « Failed to fetch ». + +## Dépannage + +### « Signing error: TypeError: Failed to fetch » + +Cela signifie généralement : + +1. **Aucun proxy CORS configuré** : définissez `VITE_CORS_PROXY_URL` et recompilez +2. **Contenu mixte bloqué** : votre site est en HTTPS mais l'URL de l'émetteur du certificat est en HTTP. Le proxy CORS résout ce problème. +3. **Le proxy CORS rejette votre origine** : vérifiez que votre domaine figure dans le tableau `ALLOWED_ORIGINS` de `cors-proxy-worker.js` + +### « 403 Forbidden » renvoyé par le proxy + +Votre domaine ne figure pas dans la liste `ALLOWED_ORIGINS`. Modifiez `cors-proxy-worker.js` : + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Redéployez ensuite : `npx wrangler deploy` + +### Tester le proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certificats qui fonctionnent sans proxy + +Certains certificats incluent la chaîne complète dans le fichier P12/PFX et ne nécessitent pas de récupération externe : + +- Certificats auto-signés +- Certaines AC commerciales qui regroupent les certificats intermédiaires +- Certificats que vous avez assemblés manuellement avec la chaîne complète diff --git a/docs/fr/self-hosting/docker.md b/docs/fr/self-hosting/docker.md new file mode 100644 index 00000000..3918b035 --- /dev/null +++ b/docs/fr/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Déployer avec Docker / Podman + +Le moyen le plus simple d'auto-héberger BentoPDF en production. + +> [!IMPORTANT] +> **En-têtes requis pour la conversion de fichiers Office** +> +> Les outils basés sur LibreOffice (conversion Word, Excel, PowerPoint) nécessitent ces en-têtes HTTP pour la prise en charge de `SharedArrayBuffer` : +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> La page doit aussi être servie depuis un contexte sécurisé. `http://localhost` fonctionne pour les tests locaux, mais `http://192.168.x.x` ou d'autres adresses IP du réseau local n'en font généralement pas partie : la conversion Office en HTTP simple échouera donc, même si les en-têtes sont présents. +> +> Les images de conteneur officielles incluent ces en-têtes. Si vous utilisez un reverse proxy (Traefik, Caddy, etc.), assurez-vous que ces en-têtes sont conservés ou ajoutés, et utilisez HTTPS pour tout accès hors bouclage local. + +> [!TIP] +> **Utilisateurs de Podman :** toutes les commandes `docker` fonctionnent avec Podman en remplaçant `docker` par `podman` et `docker-compose` par `podman-compose`. + +## Démarrage rapide + +> [!TIP] +> BentoPDF est proposé en deux versions : +> +> - **Version auto-hébergée** : `ghcr.io/alam00000/bentopdf-simple:latest`. Tous les outils PDF, **sans** l'habillage marketing (ni section d'en-tête, ni FAQ, ni témoignages, ni pied de page). À utiliser pour les déploiements internes, d'équipe ou d'organisation. Ce n'est **pas** une version « allégée » aux fonctionnalités réduites. +> - **Version commerciale** : `ghcr.io/alam00000/bentopdf:latest`. Le site marketing complet, utilisé par bentopdf.com lui-même et par les détenteurs d'une licence commerciale qui exploitent des déploiements publics. +> +> En cas de doute : récupérez la version auto-hébergée. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Créez `docker-compose.yml` : + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Exécutez : + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Construire votre propre image + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Construisez et exécutez : + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Variables d'environnement + +| Variable | Description | Par défaut | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Compile la variante auto-hébergée (masque l'habillage marketing de bentopdf.com : section d'en-tête, FAQ, témoignages, pied de page). Tous les outils PDF restent disponibles. | `false` | +| `BASE_URL` | Déployer dans un sous-répertoire | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL du module WASM PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL du module WASM Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL du module WASM CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL du script worker OCR | _(vide ; CDN par défaut de Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Dossier du runtime principal OCR | _(vide ; CDN par défaut de Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Dossier des fichiers traineddata OCR | _(vide ; CDN par défaut de Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Langues OCR séparées par des virgules affichées dans l'interface | _(vide ; catalogue complet affiché)_ | +| `VITE_OCR_FONT_BASE_URL` | Dossier des polices de la couche de texte OCR | _(vide ; URL de polices Noto distantes)_ | +| `VITE_DEFAULT_LANGUAGE` | Langue par défaut de l'interface | `en` | +| `VITE_BRAND_NAME` | Nom de marque personnalisé | `BentoPDF` | +| `VITE_BRAND_LOGO` | Chemin du logo relatif à `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Texte de pied de page/copyright personnalisé | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID d'outils séparés par des virgules à masquer | _(vide ; tous les outils activés)_ | +| `DISABLE_GITHUB_STARS` | Ignore la récupération du nombre d'étoiles GitHub au chargement de la page et retire `api.github.com` de la CSP. Les builds en Simple Mode l'ignorent toujours. | `false` | +| `SITE_URL` | URL publique écrite dans les liens canonical, hreflang et sitemap. Laissez la valeur par défaut, sauf si vous voulez que les moteurs de recherche traitent votre déploiement comme un site à part entière. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Avec un `SITE_URL` personnalisé, chaque page est marquée `noindex` pour que votre copie ne concurrence pas bentopdf.com dans les résultats de recherche. Définissez `true` pour autoriser l'indexation par les moteurs de recherche. | `false` | + +Les URL des modules WASM sont préconfigurées avec des valeurs CDN par défaut : toutes les fonctionnalités avancées fonctionnent sans configuration. Remplacez-les pour les déploiements isolés du réseau ou auto-hébergés. + +### Moteurs de recherche + +Par défaut, chaque page indique aux moteurs de recherche que bentopdf.com est l'original, afin que votre déploiement n'apparaisse pas comme un doublon. Vous n'avez rien à changer pour une instance privée ou interne. + +- **Exclure totalement votre instance des résultats de recherche :** lancez le conteneur avec `-e ROBOTS_NOINDEX=true`. Un simple redémarrage suffit, sans recompilation. +- **Faire de votre instance un site à part entière dans les résultats de recherche :** compilez avec `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Sans `ALLOW_INDEXING=true`, un `SITE_URL` personnalisé marque chaque page `noindex`. + +### Content-Security-Policy + +L'image nginx est livrée avec un en-tête `Content-Security-Policy` appliqué. Les directives `script-src`, `connect-src` et `font-src` de la CSP sont **générées à la compilation** à partir des variables d'URL `VITE_*` ci-dessus : tous les hôtes que vous passez via `--build-arg` sont automatiquement ajoutés à la politique. + +En conséquence : + +- Si vous remplacez `VITE_CORS_PROXY_URL` ou `VITE_WASM_*_URL` à la compilation, la CSP autorise automatiquement ces origines, sans configuration supplémentaire. +- Pour les URL sur `cdn.jsdelivr.net`, `script-src` n'autorise que le dossier exact du paquet versionné, par exemple `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, et non tout le CDN. jsDelivr sert n'importe quel paquet npm public ou dépôt GitHub : autoriser tout l'hôte permettrait à chacun de s'exécuter sur votre instance. Les URL sur tout autre hôte sont autorisées par origine. +- Si vous configurez des URL WASM personnalisées _à l'exécution_ via la page Paramètres avancés de l'application, ces origines ne figurent **pas** dans la CSP et le navigateur bloquera les requêtes vers elles. Cela s'applique aussi à une autre version du même paquet sur `cdn.jsdelivr.net`, car seule la version définie à la compilation est autorisée. La configuration à l'exécution est prévue pour l'expérimentation ; pour des URL personnalisées permanentes, définissez l'argument de build `VITE_*` correspondant. +- Dans les déploiements isolés du réseau qui remplacent les trois valeurs `VITE_WASM_*_URL`, ces dossiers de paquets `cdn.jsdelivr.net` sont aussi retirés de la CSP (chaque valeur par défaut est remplacée, pas complétée). Les valeurs par défaut de Tesseract OCR sur `cdn.jsdelivr.net` restent dans la politique tant que vous ne définissez pas aussi les trois valeurs `VITE_TESSERACT_*`. De même, définir `VITE_CORS_PROXY_URL` remplace la valeur publique par défaut `bentopdf-cors-proxy.bentopdf.workers.dev`. + +La CSP inclut `'unsafe-eval'` dans `script-src`, car le runtime LibreOffice WASM (utilisé par les outils de conversion Word/Excel/PowerPoint) et la bibliothèque d'images wasm-vips (utilisée par PDF vers TIFF) compilent du code de dispatch interne via `new Function()`. Le supprimer casserait ces outils. Si vous compilez en `SIMPLE_MODE` (sans LibreOffice) et n'avez pas besoin de PDF vers TIFF, vous pouvez modifier manuellement le fichier `security-headers.conf` généré pour retirer `'unsafe-eval'` et obtenir une politique plus stricte. + +Pour l'OCR, laissez les variables `VITE_TESSERACT_*` vides afin d'utiliser les ressources en ligne par défaut, ou définissez les trois ensemble pour un OCR auto-hébergé/hors ligne. Les remplacements OCR partiels sont refusés, car le worker, le runtime principal et le dossier traineddata doivent correspondre. Pour une production de PDF avec texte recherchable entièrement hors ligne, définissez aussi `VITE_OCR_FONT_BASE_URL` afin que les polices de la couche de texte OCR soient chargées depuis votre serveur interne plutôt que depuis les URL publiques des polices Noto. + +`VITE_DEFAULT_LANGUAGE` définit la langue de l'interface pour les nouveaux visiteurs. Valeurs prises en charge : `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Les utilisateurs peuvent toujours changer de langue : cela ne modifie que la valeur par défaut. + +Exemple : + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Image de marque personnalisée + +Remplacez le logo, le nom et le texte de pied de page par défaut de BentoPDF par les vôtres. Placez votre fichier de logo dans le dossier `public/` (ou utilisez une image existante), puis passez les variables de marque à la compilation : + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La personnalisation fonctionne en mode complet comme en Simple Mode, et peut se combiner avec toutes les autres options de compilation. + +### Désactiver des outils spécifiques + +Masquez des outils de l'interface pour des exigences de conformité ou de sécurité. Les outils désactivés sont retirés de la page d'accueil, des résultats de recherche, des raccourcis clavier et du créateur de workflows. L'accès direct par URL affiche une page « outil indisponible ». + +Les ID d'outils correspondent à l'URL de la page sans `.html`. Par exemple, si l'outil se trouve à `bentopdf.com/edit-pdf.html`, l'ID est `edit-pdf`. + +#### Trouver les ID d'outils + +Le plus simple : ouvrez n'importe quel outil dans BentoPDF et regardez l'URL. La dernière partie du chemin (sans `.html`) est l'ID de l'outil. + +
+Liste complète des ID d'outils + +**Éditer et annoter :** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Convertir en PDF :** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Convertir depuis PDF :** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organiser et gérer :** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimiser et réparer :** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Sécurité :** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Option 1 : à la compilation (argument de build Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Cela intègre la liste des outils désactivés dans le bundle JavaScript. Une recompilation est nécessaire pour la modifier. + +#### Option 2 : à l'exécution (config.json) + +Montez un fichier `config.json` dans le répertoire servi, sans recompilation : + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Ou avec Docker Compose : + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Les deux méthodes peuvent être combinées : les listes sont fusionnées. Si un outil figure dans l'une ou l'autre, il est désactivé. + +#### Désactiver des fonctionnalités de l'éditeur + +Vous pouvez aussi désactiver des fonctionnalités précises de l'éditeur PDF (p. ex. caviardage, annotations, formulaires) sans désactiver l'outil d'édition entier. Ajoutez `editorDisabledCategories` à votre `config.json` : + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Liste complète des catégories de l'éditeur + +**Zoom :** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Annotation :** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Formes :** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulaire :** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Caviardage :** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Document :** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Page :** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panneau :** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Outils :** `tools`, `pan`, `pointer`, `capture` + +**Sélection :** `selection`, `selection-copy` + +**Historique :** `history`, `history-undo`, `history-redo` + +
+ +Les catégories sont hiérarchiques : désactiver un parent (p. ex. `annotation`) désactive tous ses enfants. + +### Désactiver le compteur d'étoiles GitHub + +La barre de navigation affiche le nombre d'étoiles GitHub en direct, récupéré depuis `api.github.com` au chargement de la page. C'est la seule requête externe qui ne sert pas une fonctionnalité PDF. Désactivez-la à la compilation pour retirer le code de récupération du bundle et supprimer `api.github.com` de la Content-Security-Policy : + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Les builds en Simple Mode (`bentopdf-simple`) ignorent toujours le compteur d'étoiles : cette option n'est utile que pour la version commerciale ou les builds complets personnalisés. + +### URL WASM personnalisées (isolé du réseau / auto-hébergé) + +> [!IMPORTANT] +> Les URL WASM sont intégrées au JavaScript **à la compilation**. Les fichiers WASM sont téléchargés par le **navigateur de l'utilisateur** à l'exécution : Docker ne les télécharge pas pendant le build. Pour les réseaux isolés, vous devez héberger les fichiers WASM sur un serveur interne accessible aux navigateurs. + +**Workflow complet pour un réseau isolé :** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Utilisez pour `--ocr-languages` les codes affichés par `bash scripts/prepare-airgap.sh --list-ocr-languages`, ou cherchez par nom avec `bash scripts/prepare-airgap.sh --search-ocr-language `. Lorsque vous compilez avec un sous-ensemble OCR restreint, passez les mêmes codes à `VITE_TESSERACT_AVAILABLE_LANGUAGES` afin que l'application n'affiche que les langues incluses. Pour une sortie OCR entièrement hors ligne, hébergez aussi le dossier `ocr-fonts/` fourni et pointez `VITE_OCR_FONT_BASE_URL` vers lui. + +Définissez une variable sur une chaîne vide pour désactiver ce module (les utilisateurs devront le configurer manuellement via les Paramètres avancés). + +## Port personnalisé + +Par défaut, BentoPDF écoute sur le port `8080` à l'intérieur du conteneur. Pour le modifier, définissez la variable d'environnement `PORT` à l'exécution : + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variable | Description | Par défaut | +| -------- | ------------------------------------- | ---------- | +| `PORT` | Port d'écoute Nginx dans le conteneur | `8080` | + +Cela fonctionne avec le Dockerfile standard comme avec le Dockerfile nonroot. + +## ID utilisateur personnalisé (PUID/PGID) + +Pour les environnements qui exigent une exécution sous un utilisateur non root précis (NAS, Kubernetes avec contextes de sécurité, politiques d'organisation), BentoPDF fournit un Dockerfile distinct avec prise en charge PUID/PGID de style LSIO. + +### Construire et exécuter + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Variables d'environnement + +| Variable | Description | Par défaut | +| -------------- | -------------------------- | ---------- | +| `PUID` | ID utilisateur d'exécution | `1000` | +| `PGID` | ID de groupe d'exécution | `1000` | +| `PORT` | Port d'écoute Nginx | `8080` | +| `DISABLE_IPV6` | Désactiver l'écoute IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Fonctionnement + +Le conteneur démarre en root, crée un utilisateur avec le PUID/PGID indiqué, ajuste la propriété de tous les répertoires inscriptibles, puis abandonne ses privilèges avec `su-exec`. Le processus nginx s'exécute entièrement sous l'utilisateur que vous avez indiqué. + +> [!NOTE] +> Le `Dockerfile` standard utilise `nginx-unprivileged` (UID 101) et est recommandé pour la plupart des déploiements. N'utilisez `Dockerfile.nonroot` que si vous avez besoin d'un UID/GID précis. + +> [!WARNING] +> PUID/PGID ne peuvent pas valoir `0` (root). Le point d'entrée valide les valeurs et s'arrête avec une erreur si elles sont invalides. + +## Avec Traefik (reverse proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Avec Caddy (reverse proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile : + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Limites de ressources + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (intégration systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) permet d'exécuter des conteneurs Podman comme services systemd. C'est idéal pour les déploiements en production sur Linux. + +### Configuration Quadlet de base + +Créez un fichier d'unité de conteneur à `~/.config/containers/systemd/bentopdf.container` (utilisateur) ou `/etc/containers/systemd/bentopdf.container` (système) : + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Activer et démarrer + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Pour un déploiement à l'échelle du système, utilisez `systemctl` sans l'option `--user` et placez le fichier dans `/etc/containers/systemd/`. + +### Quadlet avec contrôle de santé + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Mise à jour automatique avec Quadlet + +Podman peut mettre à jour automatiquement les conteneurs lorsque de nouvelles images sont disponibles : + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Configuration réseau Quadlet + +Pour une configuration réseau personnalisée, créez un fichier réseau `bentopdf.network` : + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Référencez-le ensuite dans votre fichier de conteneur : + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Mise à jour + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/fr/self-hosting/hostinger.md b/docs/fr/self-hosting/hostinger.md new file mode 100644 index 00000000..6090686f --- /dev/null +++ b/docs/fr/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Déployer sur Hostinger + +[Hostinger](https://hostinger.com) est un hébergeur mutualisé très répandu. Ce guide explique comment déployer BentoPDF sur l'hébergement mutualisé de Hostinger. + +## Prérequis + +- Offre d'hébergement Hostinger avec accès au gestionnaire de fichiers +- Node.js installé en local pour la compilation + +## Étape 1 : compiler le projet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Les fichiers compilés se trouvent dans le dossier `dist`. + +## Étape 2 : téléverser sur Hostinger + +### Déploiement à la racine du domaine + +1. Connectez-vous à votre compte Hostinger +2. Allez dans **File Manager** → **public_html** +3. **Supprimez** tous les fichiers existants (faites une sauvegarde si nécessaire) +4. **Téléversez** tout le contenu de votre dossier local `dist` dans `public_html` + +### Déploiement dans un sous-répertoire + +Si vous déployez dans un sous-répertoire (p. ex. `yourdomain.com/pdf-tools/`) : + +1. Compilez avec la bonne URL de base : + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Créez le dossier dans Hostinger : + - Allez dans **File Manager** → **public_html** + - Créez un nouveau dossier : `pdf-tools` +3. Téléversez tout le contenu de `dist` dans `public_html/pdf-tools/` + +## Étape 3 : créer le fichier .htaccess + +Créez un fichier `.htaccess` à la racine de votre dossier de déploiement (`public_html` ou `public_html/pdf-tools/`) : + +::: warning Important +Pour un déploiement dans un sous-répertoire, remplacez `RewriteBase /` par `RewriteBase /pdf-tools/` (ou le nom de votre dossier). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Exemple de .htaccess pour un sous-répertoire + +Pour `yourdomain.com/pdf-tools/`, modifiez ces lignes : + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Dépannage + +### Les fichiers WASM ne se chargent pas + +Vérifiez que les types MIME sont correctement définis dans `.htaccess` : + +```apache +AddType application/wasm .wasm +``` + +### Les outils LibreOffice ne fonctionnent pas + +Les en-têtes de sécurité sont essentiels pour SharedArrayBuffer : + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Si les en-têtes ne sont pas appliqués, contactez le support Hostinger pour activer `mod_headers`. + +### Erreurs 404 lors de l'actualisation de la page + +Assurez-vous que la règle d'extension `.html` et les routes de langue sont correctement configurées. BentoPDF utilise des fichiers HTML statiques, pas un routage SPA : + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limites de téléversement + +Hostinger peut imposer des limites de taille de fichier. Téléversez les fichiers WASM séparément si le téléversement groupé échoue. diff --git a/docs/fr/self-hosting/index.md b/docs/fr/self-hosting/index.md new file mode 100644 index 00000000..1b019e46 --- /dev/null +++ b/docs/fr/self-hosting/index.md @@ -0,0 +1,538 @@ +# Guide d'auto-hébergement + +BentoPDF peut être auto-hébergé sur votre propre infrastructure. Ce guide présente différentes options de déploiement. + +## Démarrage rapide avec Docker / Podman + +Le moyen le plus rapide d'auto-héberger BentoPDF : + +> [!TIP] +> BentoPDF est disponible en deux versions : +> +> - **Version auto-hébergée** : `ghcr.io/alam00000/bentopdf-simple:latest`. Tous les outils PDF, **sans** l'habillage marketing (pas de section d'accueil, de FAQ, de témoignages ni de pied de page). À utiliser pour les déploiements internes, d'équipe ou d'organisation. Ce **n'est pas** une version « allégée » avec moins de fonctionnalités. +> - **Version commerciale** : `ghcr.io/alam00000/bentopdf:latest`. Le site marketing complet, utilisé par bentopdf.com lui-même et par les titulaires d'une licence commerciale qui exploitent des déploiements publics. +> +> Dans le doute : utilisez la version auto-hébergée. + +> [!IMPORTANT] +> La conversion de fichiers Office nécessite `SharedArrayBuffer`, ce qui impose que l'application soit à la fois isolée cross-origin et servie depuis un contexte sécurisé. L'image officielle envoie déjà les en-têtes COOP/COEP requis, mais les navigateurs désactivent quand même `SharedArrayBuffer` sur les origines HTTP simples du réseau local comme `http://192.168.x.x`. +> +> N'utilisez `http://localhost` que pour des tests sur le même appareil. Si les utilisateurs accèdent à BentoPDF via une IP ou un nom d'hôte du réseau local, terminez la connexion en HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Ou avec Docker Compose / Podman Compose : + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (systemd sous Linux) + +Exécutez BentoPDF comme service systemd. Créez `~/.config/containers/systemd/bentopdf.container` : + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Consultez le [guide de déploiement Docker](/fr/self-hosting/docker) pour la documentation complète de Quadlet. + +## Compiler depuis les sources + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Options de configuration + +### Version auto-hébergée (mode simple) + +La version auto-hébergée (l'image `bentopdf-simple`, aussi appelée mode simple) est **fonctionnellement identique** à la version commerciale : tous les outils PDF sont présents et se comportent de la même façon. Elle masque simplement l'habillage marketing qui n'a de sens que sur bentopdf.com ou sur un déploiement commercial public. **Ce n'est pas une version allégée avec moins de fonctionnalités.** + +**Ce que la version auto-hébergée masque** (purement cosmétique, aucune fonctionnalité PDF n'est retirée) : + +- Barre de navigation, section d'accueil, section des fonctionnalités, FAQ, témoignages, pied de page +- Remplace le titre de la page par « Outils PDF » + +**Ce que la version auto-hébergée conserve** (tout ce qui traite réellement les PDF) : + +- Tous les outils PDF (fusion, scission, édition, signature, OCR, conversion Office, etc.) +- La personnalisation de la marque et toute la configuration au build et à l'exécution + +La version commerciale (`ghcr.io/alam00000/bentopdf:latest`) est celle qui alimente bentopdf.com et qu'utilisent les titulaires d'une licence commerciale pour des déploiements publics : elle ajoute la section d'accueil, la FAQ, les témoignages et le pied de page qui n'auraient pas de sens sur un outil interne. + +Si vous auto-hébergez BentoPDF pour votre équipe, votre organisation ou comme outil interne, utilisez la version auto-hébergée : + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Consultez [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) pour tous les détails. + +### Version commerciale (déploiements publics sous votre propre marque) + +La version commerciale (l'image `bentopdf`, sans suffixe `-simple`) est celle qui alimente bentopdf.com. Elle inclut le site marketing complet (section d'accueil, fonctionnalités, FAQ, témoignages, pied de page) en plus de tous les outils PDF. Utilisez cette version si vous souhaitez **déployer BentoPDF comme service PDF public sous votre propre marque**, par exemple : + +- Vous exploitez BentoPDF comme service SaaS hébergé pour des utilisateurs finaux sur votre propre domaine +- Vous voulez l'expérience de la page d'accueil (sections marketing + outils), et pas seulement la surface brute des outils +- Vous êtes titulaire d'une licence commerciale et intégrez BentoPDF dans un produit commercial + +**Exécutez-la telle quelle** (marque BentoPDF, utile pour prévisualiser la version) : + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Compilez-la avec votre propre marque** (le flux commercial typique) : + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Toutes les autres options de build (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, remplacements d'URL WASM, etc.) fonctionnent comme sur la version auto-hébergée. + +::: warning Licence +L'exécution de la version commerciale est autorisée selon l'une des deux options de licence de BentoPDF : + +- **AGPL-3.0** (gratuite) : autorisée si votre déploiement publie l'intégralité de son code source sous AGPL, y compris les modifications de marque et la logique métier associée. +- **Licence commerciale** (79 $, à vie) : requise pour les déploiements propriétaires ou à code fermé où vous ne publiez pas votre fork de marque ni votre code métier. + +Consultez la [page Licence](https://www.bentopdf.com/licensing) pour la comparaison complète. Les modules WASM sous licence AGPL (PyMuPDF, Ghostscript, CoherentPDF) sont chargés depuis un CDN à l'exécution : ils n'entrent donc pas dans votre image et ne changent pas votre situation en matière de licence. +::: + +### URL de base + +Déployer dans un sous-répertoire : + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Marque personnalisée + +Remplacez le logo, le nom et le texte de pied de page par défaut de BentoPDF par les vôtres au moment du build : + +| Variable | Description | Valeur par défaut | +| ------------------ | ------------------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Nom de marque affiché dans l'en-tête et le pied de page | `BentoPDF` | +| `VITE_BRAND_LOGO` | Chemin du logo relatif à `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Texte personnalisé du pied de page/copyright | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Ou via Docker : + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La personnalisation de la marque fonctionne en mode complet comme en mode simple, et peut être combinée avec toutes les autres options de build (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Désactiver des outils précis + +Masquez des outils individuels pour des raisons de conformité ou de sécurité. Les outils désactivés sont retirés de la page d'accueil, de la recherche, des raccourcis, du constructeur de workflow et de l'accès direct par URL. + +Les identifiants d'outils correspondent à l'URL de la page sans `.html` : ouvrez un outil et regardez l'URL (par ex. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Au build** (intégré au bundle) : + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**À l'exécution** (sans reconstruire : montez un `config.json`) : + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Les deux méthodes peuvent être combinées : les listes sont fusionnées. + +Vous pouvez aussi désactiver des fonctionnalités précises de l'éditeur PDF (par ex. la rédaction) sans désactiver tout l'outil, en ajoutant `editorDisabledCategories` à `config.json`. Consultez le [guide Docker](/fr/self-hosting/docker#desactiver-des-fonctionnalites-de-l-editeur) pour la liste complète des catégories. + +## Guides de déploiement + +Choisissez votre plateforme : + +- [Vercel](/fr/self-hosting/vercel) +- [Netlify](/fr/self-hosting/netlify) +- [Cloudflare Pages](/fr/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/fr/self-hosting/aws) +- [Hostinger](/fr/self-hosting/hostinger) +- [Nginx](/fr/self-hosting/nginx) +- [Apache](/fr/self-hosting/apache) +- [Docker](/fr/self-hosting/docker) +- [Kubernetes](/fr/self-hosting/kubernetes) +- [Proxy CORS](/fr/self-hosting/cors-proxy) : requis pour les signatures numériques + +## Problèmes courants + +### La conversion Word / ODT / Excel / PowerPoint vers PDF se bloque (SharedArrayBuffer indisponible) + +**Symptôme** : les conversions de documents basées sur LibreOffice (Word, ODT, Excel, PowerPoint vers PDF) se bloquent à environ 55 % ou ne démarrent pas. La console du navigateur peut afficher : + +> `ReferenceError: SharedArrayBuffer is not defined` + +…ou `window.crossOriginIsolated` renvoie `false`, ou la compilation WASM signale `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Cause** : LibreOffice WASM nécessite `SharedArrayBuffer`, que le navigateur n'active que si la page est **isolée cross-origin** ET servie depuis un **contexte sécurisé**. Deux conditions doivent donc être remplies : + +1. Chaque réponse inclut les deux en-têtes : + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. La page est servie depuis `https://...` ou `http://localhost`. Le HTTP simple sur une IP du réseau local (par ex. `http://192.168.x.x`) n'est PAS considéré comme sécurisé : les navigateurs y désactivent `SharedArrayBuffer`. + +L'écart `00 61 73 6d / 1f 8b 08 08` est un sous-symptôme distinct : il manque l'en-tête de réponse `Content-Encoding: gzip` sur les fichiers précompressés `.wasm.gz` / `.data.gz`, si bien que le navigateur reçoit des octets gzip bruts au lieu du WASM décompressé. + +**Solution** : consultez le guide de déploiement de votre plateforme pour la configuration exacte : + +- [Nginx →](/fr/self-hosting/nginx#la-conversion-word-odt-excel-vers-pdf-ne-fonctionne-pas) +- [Apache →](/fr/self-hosting/apache#la-conversion-word-odt-excel-vers-pdf-ne-fonctionne-pas) +- [AWS S3 + CloudFront →](/fr/self-hosting/aws#etape-3b-politique-d-en-tetes-de-reponse-requise-pour-libreoffice-wasm) +- [Cloudflare Pages →](/fr/self-hosting/cloudflare#fichier-de-configuration) (`_headers` file) +- [Netlify →](/fr/self-hosting/netlify#la-conversion-word-odt-excel-vers-pdf-reste-bloquee-a-55) (`netlify.toml`) +- [Vercel →](/fr/self-hosting/vercel#la-conversion-word-odt-excel-vers-pdf-ne-fonctionne-pas) (`vercel.json`) +- [Hostinger →](/fr/self-hosting/hostinger#les-outils-libreoffice-ne-fonctionnent-pas) (`.htaccess`) +- [Kubernetes →](/fr/self-hosting/kubernetes#verifier-que-les-en-tetes-sharedarraybuffer-fonctionnent-toujours-ingress-gateway) +- **Docker** : géré automatiquement par la configuration nginx fournie, aucune action nécessaire. + +**Vérification** : ouvrez la console des DevTools sur n'importe quelle page BentoPDF et exécutez : + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Si la page est en HTTPS ou en `http://localhost` ET que les deux en-têtes COEP/COOP sont présents sur chaque réponse, les deux vérifications passent. Si vous êtes sur `http://192.168.x.x` ou une autre origine HTTP hors boucle locale, terminez la connexion en HTTPS : aucune correction par simples en-têtes n'existe. + +### Fichiers `.mjs` servis en `application/octet-stream` + +**Symptôme** : Signer un PDF, le remplissage de formulaire et certains autres outils affichent un lecteur vide ou ne se chargent pas. La console du navigateur signale : + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Cause** : votre serveur web ou reverse proxy n'a pas de correspondance de type MIME pour les fichiers `.mjs` (le lecteur PDF intégré fournit des modules ES avec cette extension). De nombreuses configurations de serveur par défaut utilisent `application/octet-stream` pour les extensions inconnues, ce que les navigateurs refusent d'exécuter comme modules ES. + +**Solution** : consultez le guide de déploiement de votre plateforme pour l'extrait exact : + +- [Nginx →](/fr/self-hosting/nginx#signer-un-pdf-ou-le-remplissage-de-formulaire-affiche-un-lecteur-vide-erreur-mime-mjs) +- [Apache →](/fr/self-hosting/apache#signer-un-pdf-ou-le-remplissage-de-formulaires-affiche-un-visualiseur-vide-erreur-mime-mjs) +- [AWS S3 + CloudFront →](/fr/self-hosting/aws#etape-2-compiler-et-televerser) (voir `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/fr/self-hosting/kubernetes#erreurs-de-type-mime-mjs-iframe-vide-dans-signer-un-pdf-remplissage-de-formulaire) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger** : géré automatiquement, aucune action nécessaire. + +**Vérification** : ouvrez les DevTools, onglet Network, repérez la requête `.mjs` en échec et vérifiez l'en-tête de réponse `Content-Type`. Il doit valoir `application/javascript`. S'il vaut toujours `application/octet-stream`, un reverse proxy ou un CDN en amont détecte peut-être à nouveau le type : vérifiez chaque couche de votre chaîne de diffusion. + +## Configuration WASM (composants AGPL) + +BentoPDF **n'intègre pas** de bibliothèques de traitement sous licence AGPL dans son code source, mais **préconfigure des URL de CDN** pour que toutes les fonctionnalités marchent immédiatement, sans configuration manuelle. + +::: tip Zéro configuration par défaut +Depuis la v2.0.0, les modules WASM sont préconfigurés pour se charger depuis le CDN jsDelivr via des variables d'environnement. Toutes les fonctionnalités avancées fonctionnent immédiatement, sans aucune configuration de l'utilisateur. +::: + +| Composant | Licence | Fonctionnalités | +| --------------- | -------- | ------------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Conversion EPUB/MOBI/FB2/XPS, extraction d'images, extraction de tableaux | +| **Ghostscript** | AGPL-3.0 | Conversion PDF/A, compression, redressement, rastérisation | +| **CoherentPDF** | AGPL-3.0 | Table des matières, pièces jointes, fusion de PDF avec signets | + +### Variables d'environnement par défaut + +Elles sont définies dans `.env.production` et intégrées au build : + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Remplacer les URL WASM + +Vous pouvez remplacer les valeurs par défaut au moment du build pour des déploiements personnalisés : + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Pour désactiver complètement un module (la configuration manuelle par l'utilisateur via les paramètres avancés devient alors nécessaire), définissez sa variable sur une chaîne vide. + +Pour l'OCR, laissez toutes les variables `VITE_TESSERACT_*` vides et conservez les ressources en ligne par défaut, ou définissez ensemble les URL worker/core/lang pour un OCR auto-hébergé ou hors ligne. Si vous n'intégrez que certaines langues d'OCR, définissez aussi `VITE_TESSERACT_AVAILABLE_LANGUAGES` avec les mêmes codes séparés par des virgules afin que l'interface ne propose que les langues installées et que les sélections non prises en charge échouent avec une erreur explicite. Pour une sortie PDF consultable entièrement hors ligne, définissez aussi `VITE_OCR_FONT_BASE_URL` sur le répertoire interne qui sert les polices OCR fournies. + +Les utilisateurs peuvent aussi remplacer ces valeurs à tout moment via les **paramètres avancés** de l'interface : les remplacements enregistrés dans le navigateur ont priorité sur les valeurs d'environnement par défaut. + +### Déploiement isolé du réseau / hors ligne + +Pour les réseaux sans accès à Internet (administrations, santé, finance, etc.). Les URL WASM sont intégrées au JavaScript **au moment du build** : les fichiers WASM eux-mêmes sont téléchargés par le **navigateur de l'utilisateur** à l'exécution. Vous devez donc tout préparer sur une machine connectée à Internet, puis transférer le résultat dans le réseau isolé. + +#### Script automatisé (recommandé) + +Le script `prepare-airgap.sh` fourni automatise tout le processus : téléchargement des paquets WASM, construction de l'image Docker et production d'un bundle autonome avec un script d'installation. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Cela produit un répertoire de bundle : + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Transférez le bundle dans le réseau isolé par clé USB, dépôt d'artefacts interne ou toute méthode approuvée. Exécutez ensuite le script d'installation fourni : + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Le script d'installation charge l'image Docker, extrait les fichiers WASM et démarre éventuellement le conteneur. + +**Options du script :** + +| Option | Description | Valeur par défaut | +| ------------------------------ | ------------------------------------------------------------- | ------------------------------------ | +| `--wasm-base-url ` | Emplacement où les WASM seront hébergés en interne | _(obligatoire, demandée si absente)_ | +| `--image-name ` | Tag de l'image Docker | `bentopdf` | +| `--output-dir ` | Répertoire de sortie du bundle | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Active le mode simple | désactivé | +| `--base-url ` | URL de base du sous-répertoire (par ex. `/pdf/`) | `/` | +| `--language ` | Langue par défaut de l'interface (par ex. `fr`, `de`) | _(aucune)_ | +| `--brand-name ` | Nom de marque personnalisé | _(aucun)_ | +| `--brand-logo ` | Chemin du logo relatif à `public/` | _(aucun)_ | +| `--footer-text ` | Texte de pied de page personnalisé | _(aucun)_ | +| `--ocr-languages ` | Langues d'OCR à intégrer, séparées par des virgules | `eng` | +| `--list-ocr-languages` | Affiche les codes et noms d'OCR pris en charge, puis quitte | désactivé | +| `--search-ocr-language ` | Recherche des codes d'OCR par nom ou abréviation | désactivé | +| `--dockerfile ` | Dockerfile à utiliser | `Dockerfile` | +| `--skip-docker` | Ignore la construction et l'export Docker | désactivé | +| `--skip-wasm` | Ignore le téléchargement WASM (réutilise les fichiers `.tgz`) | désactivé | + +L'invite interactive accepte aussi `list` pour afficher la liste complète des codes Tesseract pris en charge et `search ` pour trouver des correspondances, par exemple `search german` ou `search chi`. + +::: warning Exigence de même origine +Les fichiers WASM doivent être servis depuis la **même origine** que l'application BentoPDF. Les Web Workers utilisent `importScripts()`, qui ne peut pas charger de scripts cross-origin. Par exemple, si BentoPDF tourne sur `https://internal.example.com`, l'URL de base WASM doit aussi être `https://internal.example.com/wasm`. +::: + +#### Étapes manuelles + +
+Si vous préférez procéder manuellement, sans le script + +**Étape 1 : télécharger les paquets WASM et OCR** (sur une machine connectée à Internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Étape 2 : construire l'image Docker avec les URL internes** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Étape 3 : exporter l'image Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Étape 4 : transférer dans le réseau isolé** + +Copiez par clé USB, dépôt d'artefacts interne ou méthode de transfert approuvée : + +- `bentopdf.tar` : l'image Docker +- Les cinq paquets `.tgz` WASM/OCR de l'étape 1 +- Le répertoire `tesseract-langdata/` de l'étape 1 +- Le répertoire `ocr-fonts/` de l'étape 1 + +**Étape 5 : installer dans le réseau isolé** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Vérifiez que les fichiers sont accessibles aux URL configurées à l'étape 2, notamment `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` et `.../ocr/fonts`. + +
+ +::: info Compilation depuis les sources plutôt que Docker ? +Définissez les variables dans `.env.production` avant d'exécuter `npm run build` : + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Héberger votre propre proxy WASM + +Si vous devez servir des fichiers WASM AGPL avec les en-têtes CORS appropriés, vous pouvez déployer un proxy simple. Consultez le [guide du proxy WASM Cloudflare](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) pour un exemple d'implémentation. + +::: tip Pourquoi cette séparation ? +Cette séparation garantit : + +- Une conformité juridique claire pour les utilisateurs commerciaux +- Le cœur de BentoPDF reste sous sa double licence (AGPL-3.0 / commerciale) +- Les fichiers WASM sont chargés à l'exécution et non intégrés au code source + ::: + +## Configuration requise + +| Exigence | Minimum | +| -------- | ------------------------------------ | +| Stockage | ~100 Mo (cœur sans les modules AGPL) | +| RAM | 512 Mo | +| CPU | Tout processeur moderne | + +::: tip +BentoPDF est un site statique : aucune base de données ni serveur backend n'est nécessaire ! +::: diff --git a/docs/fr/self-hosting/kubernetes.md b/docs/fr/self-hosting/kubernetes.md new file mode 100644 index 00000000..c8d5d6fb --- /dev/null +++ b/docs/fr/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Déployer avec Kubernetes + +Kubernetes est peut-être excessif pour un site statique, mais il peut très bien convenir si vous standardisez déjà sur Helm + GitOps. + +> [!IMPORTANT] +> **En-têtes requis pour la conversion de fichiers Office** +> +> Les outils basés sur LibreOffice (conversion Word, Excel, PowerPoint) nécessitent ces en-têtes HTTP pour la prise en charge de `SharedArrayBuffer` : +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Les images nginx officielles de BentoPDF incluent ces en-têtes. Dans Kubernetes, **les contrôleurs Ingress/Gateway sont aussi des reverse proxies** : assurez-vous donc que ces en-têtes sont conservés (ou ajoutez-les en périphérie). + +## Prérequis + +- Un cluster Kubernetes +- Helm v3 +- Une image nginx BentoPDF (par ex. `ghcr.io/alam00000/bentopdf:`) qui sert sur le **port 8080** + +## Déployer avec Helm + +### Installer depuis ce dépôt (chart local) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Installer depuis GHCR (chart OCI) + +Si le chart est publié sur GHCR en tant qu'artefact OCI : + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## L'exposer + +### Port-forward (test rapide) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (facultatif) + +Activez Ingress (exemple pour nginx-ingress) : + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (facultatif) + +Ce chart prend en charge `Gateway` + `HTTPRoute` de Gateway API. + +Exemple (opérateur Gateway API de Cloudflare) : + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Vérifier que les en-têtes SharedArrayBuffer fonctionnent toujours (Ingress/Gateway) + +### Ce qui « devrait » se passer + +La configuration nginx de BentoPDF définit les en-têtes de réponse requis. La plupart des contrôleurs Ingress/Gateway **transmettent les en-têtes de réponse en amont sans les modifier**. + +### Ce qui peut tout casser + +- Une politique de contrôleur ou de périphérie qui **remplace** ou **supprime** les en-têtes de réponse +- Un middleware d'« en-têtes de sécurité » qui définit des valeurs COOP/COEP différentes + +### Comment vérifier + +Exécutez ceci sur votre point d'accès public : + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Vous devriez voir : + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Si votre contrôleur Ingress ne les conserve pas + +Ajoutez les en-têtes en périphérie (selon le contrôleur). Exemple pour **nginx-ingress** : + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Erreurs de type MIME `.mjs` (iframe vide dans Signer un PDF / remplissage de formulaire) + +Si la console du navigateur affiche `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` sur une requête `.mjs`, un contrôleur Ingress/Gateway placé devant le nginx de BentoPDF remplace l'en-tête `Content-Type` en amont par `application/octet-stream`. + +Le nginx de l'image BentoPDF sert déjà `.mjs` en `application/javascript`. La solution consiste à empêcher le contrôleur de le supprimer ou de le remplacer. Pour nginx-ingress : + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Ou utilisez un filtre `ResponseHeaderModifier` dans Gateway API pour définir `Content-Type: application/javascript` sur les chemins `.mjs`. Vérifiez avec les DevTools, onglet Network : la requête `.mjs` en échec doit maintenant afficher `content-type: application/javascript`. + +### Si vous utilisez Gateway API et voulez forcer l'ajout d'en-têtes + +Gateway API prend en charge un filtre `ResponseHeaderModifier`. Vous pouvez l'attacher dans `httpRoute.rules[*].filters` : + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +La prise en charge de filtres précis dépend de votre contrôleur Gateway ; si un filtre est ignoré, ajoutez plutôt les en-têtes au niveau de la périphérie ou du contrôleur. + +## Désactiver des outils précis + +Utilisez un ConfigMap pour désactiver des outils à l'exécution sans reconstruire l'image : + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Montez-le dans le répertoire servi : + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Les identifiants d'outils correspondent à l'URL de la page sans `.html` : ouvrez un outil et regardez l'URL (par ex. `edit-pdf`, `merge-pdf`, `compress-pdf`). Les outils désactivés sont masqués de la page d'accueil, de la recherche, des raccourcis, du constructeur de workflow et de l'accès direct par URL. Consultez le [guide Docker](/fr/self-hosting/docker#desactiver-des-outils-specifiques) pour la liste complète des options. diff --git a/docs/fr/self-hosting/netlify.md b/docs/fr/self-hosting/netlify.md new file mode 100644 index 00000000..50da1c0f --- /dev/null +++ b/docs/fr/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Déployer sur Netlify + +[Netlify](https://netlify.com) propose un excellent hébergement de sites statiques avec une offre gratuite généreuse. + +## Déploiement en un clic + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Déploiement manuel + +### Étape 1 : connecter le dépôt + +1. Connectez-vous à [Netlify](https://app.netlify.com) +2. Cliquez sur « Add new site » → « Import an existing project » +3. Connectez votre compte GitHub +4. Sélectionnez votre fork de BentoPDF + +### Étape 2 : configurer les paramètres de build + +| Paramètre | Valeur | +| ------------------------- | --------------- | +| Commande de build | `npm run build` | +| Répertoire de publication | `dist` | +| Version de Node | 18+ | + +### Étape 3 : déployer + +Cliquez sur « Deploy site » et attendez la fin du build. + +## Fichier de configuration + +Créez `netlify.toml` à la racine de votre projet : + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Important +Les en-têtes `Cross-Origin-Embedder-Policy` et `Cross-Origin-Opener-Policy` sont nécessaires pour les conversions Word/ODT/Excel/PowerPoint vers PDF. Sans eux, `SharedArrayBuffer` n'est pas disponible et le moteur LibreOffice WASM ne parviendra pas à s'initialiser. + +Les en-têtes `Content-Encoding: gzip` sur les fichiers `.wasm.gz` et `.data.gz` indiquent au navigateur de les décompresser automatiquement. Sans eux, le navigateur reçoit des octets gzip bruts et la compilation WASM échoue. +::: + +## Variables d'environnement + +Définissez-les dans Site settings → Environment variables : + +| Variable | Description | +| ----------------------- | ----------------------------------------------------------------- | +| `SIMPLE_MODE` | Mettre à `true` pour un build minimal | +| `VITE_BRAND_NAME` | Nom de marque personnalisé (remplace « BentoPDF ») | +| `VITE_BRAND_LOGO` | Chemin du logo relatif à `public/` (par ex. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Texte personnalisé du pied de page/copyright | +| `VITE_DEFAULT_LANGUAGE` | Langue par défaut de l'interface (par ex. `fr`, `de`, `es`) | + +## Domaine personnalisé + +1. Allez dans Site settings → Domain management +2. Cliquez sur « Add custom domain » +3. Suivez les instructions de configuration DNS + +## Large Media + +Pour les gros fichiers WASM, envisagez d'activer [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Dépannage + +### La conversion Word/ODT/Excel vers PDF reste bloquée à 55 % + +Si les conversions de documents restent bloquées à 55 %, ouvrez la console des DevTools et vérifiez : + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Si `crossOriginIsolated` vaut `false`, les en-têtes COEP/COOP de votre `netlify.toml` ne sont pas appliqués. Vérifiez que le fichier se trouve à la racine de votre projet et redéployez. + +Si vous voyez `expected magic word 00 61 73 6d, found 1f 8b 08 08` dans la console, il manque les en-têtes `Content-Encoding: gzip` sur les fichiers `.wasm.gz`. Assurez-vous que les blocs `[[headers]]` pour `soffice.wasm.gz` et `soffice.data.gz` figurent dans votre `netlify.toml`. + +### Échec du build + +Vérifiez la compatibilité de la version de Node : + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Chargement initial lent + +Activez l'optimisation des ressources dans Site settings → Build & deploy → Asset optimization. diff --git a/docs/fr/self-hosting/nginx.md b/docs/fr/self-hosting/nginx.md new file mode 100644 index 00000000..a0adb25e --- /dev/null +++ b/docs/fr/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Déployer avec Nginx + +Hébergez BentoPDF sur votre propre serveur avec Nginx. + +## Prérequis + +- Serveur Ubuntu/Debian +- Nginx installé +- Certificat SSL (recommandé : Let's Encrypt) + +## Étape 1 : construire le projet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Pour personnaliser l'image de marque, définissez des variables d'environnement avant le build : + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Étape 2 : copier les fichiers + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Étape 3 : configuration de Nginx + +Créez `/etc/nginx/sites-available/bentopdf` : + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Étape 4 : activer le site + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Étape 5 : SSL avec Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Déploiement dans un sous-répertoire + +Pour héberger sous `/pdf/` : + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Construisez avec : + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Optimisation des performances + +Ajoutez à `nginx.conf` : + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Dépannage + +### Le WASM ne se charge pas + +Vérifiez que le type MIME est défini : + +```nginx +types { + application/wasm wasm; +} +``` + +### Signer un PDF ou le remplissage de formulaire affiche un lecteur vide (erreur MIME `.mjs`) + +Si la console du navigateur affiche : + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…et que la requête en échec se termine par `.mjs`, il manque à votre nginx la correspondance `.mjs → application/javascript`. Le lecteur PDF intégré (utilisé par Signer un PDF, le remplissage de formulaire et quelques autres outils) fournit des modules ES avec l'extension `.mjs`, et le fichier `mime.types` par défaut de nginx ne les inclut pas. + +Corrigez-le en ajoutant `mjs` à la ligne `application/javascript` existante dans `/etc/nginx/mime.types` : + +```nginx +application/javascript js mjs; +``` + +> N'ajoutez PAS une _seconde_ ligne `application/javascript` : nginx analyse `mime.types` ligne par ligne et une seule correspondance type-extension l'emporte, donc une seconde ligne est ignorée silencieusement sur certaines versions. Modifiez la ligne existante pour ajouter `mjs` à côté de `js`. + +Ou redéfinissez-le localement dans votre bloc server (sans modifier le fichier global) : + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Rechargez nginx après la modification : + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Pour confirmer : dans les DevTools du navigateur, onglet Network, repérez la requête `.mjs` en échec et vérifiez l'en-tête de réponse `Content-Type`. Il doit maintenant valoir `application/javascript` et non `application/octet-stream`. + +### La conversion Word/ODT/Excel vers PDF ne fonctionne pas + +LibreOffice WASM nécessite `SharedArrayBuffer`, qui exige les en-têtes `Cross-Origin-Embedder-Policy` et `Cross-Origin-Opener-Policy`. Il faut aussi un contexte sécurisé : `http://localhost` fonctionne pour les tests locaux, mais `http://192.168.x.x` ou d'autres IP du réseau local nécessitent généralement HTTPS. Notez que les directives `add_header` d'un bloc `location` **remplacent** celles du niveau server, elles ne fusionnent pas. Chaque bloc `location` ayant son propre `add_header` doit inclure les en-têtes COEP/COOP. + +Vérifiez avec : + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Si vous utilisez un reverse proxy devant nginx, assurez-vous qu'il conserve ces en-têtes. + +### 502 Bad Gateway + +Consultez les journaux d'erreurs de Nginx : + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/fr/self-hosting/vercel.md b/docs/fr/self-hosting/vercel.md new file mode 100644 index 00000000..4ce84734 --- /dev/null +++ b/docs/fr/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Déployer sur Vercel + +[Vercel](https://vercel.com) offre l'expérience de déploiement la plus simple pour les sites statiques. + +## Déploiement en un clic + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Déploiement manuel + +### Étape 1 : forker le dépôt + +Forkez [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) vers votre compte GitHub. + +### Étape 2 : importer dans Vercel + +1. Rendez-vous sur [vercel.com/new](https://vercel.com/new) +2. Sélectionnez votre dépôt forké +3. Configurez le projet : + +| Paramètre | Valeur | +| ----------------------- | --------------- | +| Préréglage du framework | Vite | +| Commande de build | `npm run build` | +| Répertoire de sortie | `dist` | +| Commande d'installation | `npm install` | + +### Étape 3 : variables d'environnement (facultatif) + +Ajoutez-les si nécessaire : + +| Variable | Description | +| ----------------------- | ----------------------------------------------------------------- | +| `SIMPLE_MODE` | Mettre à `true` pour une interface minimale | +| `VITE_BRAND_NAME` | Nom de marque personnalisé (remplace « BentoPDF ») | +| `VITE_BRAND_LOGO` | Chemin du logo relatif à `public/` (par ex. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Texte personnalisé du pied de page/copyright | +| `VITE_DEFAULT_LANGUAGE` | Langue par défaut de l'interface (par ex. `fr`, `de`, `es`) | + +### Étape 4 : déployer + +Cliquez sur « Deploy » et attendez la fin du build. + +## Domaine personnalisé + +1. Ouvrez les paramètres de votre projet +2. Allez dans « Domains » +3. Ajoutez votre domaine personnalisé +4. Configurez le DNS comme indiqué + +## Limitations + +::: warning Fichiers volumineux +Les fonctions serverless de Vercel ont une limite de 50 Mo. BentoPDF étant un site statique, cela ne devrait pas vous concerner, mais les modules WASM sont volumineux (~100 Mo au total). Assurez-vous qu'ils sont servis depuis le dossier `/public`. +::: + +## Dépannage + +### Délai d'attente du build dépassé + +Si les builds dépassent le délai, essayez : + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Erreur 404 à l'actualisation + +Ajoutez un fichier `vercel.json` pour le routage SPA : + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### La conversion Word/ODT/Excel vers PDF ne fonctionne pas + +Les conversions LibreOffice WASM nécessitent `SharedArrayBuffer`, qui exige ces en-têtes de réponse sur toutes les pages : + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Les fichiers précompressés `.wasm.gz` et `.data.gz` ont aussi besoin de `Content-Encoding: gzip` pour que le navigateur les décompresse. + +Ajoutez-les à votre `vercel.json` : + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Pour vérifier, ouvrez la console des DevTools et exécutez `console.log(window.crossOriginIsolated)` : le résultat doit être `true`. diff --git a/docs/fr/tools/add-attachments.md b/docs/fr/tools/add-attachments.md new file mode 100644 index 00000000..7cc8991f --- /dev/null +++ b/docs/fr/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Ajouter des pièces jointes +description: Intégrez des fichiers de tout type dans un PDF, au niveau du document ou rattachés à des pages précises. +--- + +# Ajouter des pièces jointes + +Intégrez un ou plusieurs fichiers directement dans un document PDF. Les pièces jointes peuvent être ajoutées au niveau du document (visibles dans le panneau des pièces jointes de n'importe quel lecteur PDF) ou liées à des pages précises. + +## Fonctionnement + +1. Importez le PDF auquel vous souhaitez joindre des fichiers. +2. Utilisez la zone de dépôt des pièces jointes pour sélectionner les fichiers à intégrer (tout type de fichier). +3. Choisissez le niveau de la pièce jointe : **Document** (par défaut) ou **Page**. +4. Si vous choisissez le niveau Page, saisissez une plage de pages (par exemple `1-3` ou `5`). +5. Cliquez sur le bouton de traitement. Le PDF modifié est téléchargé avec vos fichiers intégrés. + +## Fonctionnalités + +- Joignez n'importe quel type de fichier : images, feuilles de calcul, archives, exécutables, tout est possible +- Placement des pièces jointes au niveau du document ou de la page +- Possibilité de joindre plusieurs fichiers en une seule opération +- Affichage du nom et de la taille de toutes les pièces jointes sélectionnées +- Le PDF de sortie conserve le contenu d'origine, avec les fichiers intégrés en plus + +## Options + +| Option | Description | +| ------------------- | --------------------------------------------------------------------------------------------- | +| **Niveau document** | Joint les fichiers au PDF dans son ensemble, accessibles depuis le panneau des pièces jointes | +| **Niveau page** | Joint les fichiers à des pages précises, indiquées par une plage de pages | + +## Cas d'usage + +- Regrouper des données sources (fichiers Excel, CSV) avec un rapport PDF +- Joindre les images originales à un portfolio photo au format PDF +- Intégrer des documents justificatifs dans un contrat ou une proposition +- Ajouter des documents complémentaires à des pages précises d'un manuel de formation + +## Astuces + +- Les pièces jointes au niveau du document sont les mieux prises en charge par les lecteurs PDF. Celles au niveau de la page peuvent ne pas être visibles dans tous les lecteurs. +- Il n'y a pas de limite de taille pour les pièces jointes, mais les fichiers intégrés très volumineux augmentent la taille du PDF d'autant. + +## Outils associés + +- [Extraire les pièces jointes](./extract-attachments) +- [Gérer les pièces jointes](./edit-attachments) +- [Fusionner des PDF](./merge-pdf) diff --git a/docs/fr/tools/add-blank-page.md b/docs/fr/tools/add-blank-page.md new file mode 100644 index 00000000..5b813bfe --- /dev/null +++ b/docs/fr/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Ajouter une page vierge +description: Insérez une ou plusieurs pages vierges à n'importe quelle position d'un document PDF. +--- + +# Ajouter une page vierge + +Insérez des pages vides dans un PDF à la position de votre choix. Vous contrôlez l'emplacement des pages vierges et leur nombre. + +## Fonctionnement + +1. Importez un fichier PDF. L'outil affiche le nombre de pages. +2. Saisissez la **position** où insérer les pages vierges. Utilisez `0` pour insérer au tout début, ou le nombre total de pages pour ajouter à la fin. +3. Saisissez le **nombre** de pages vierges à ajouter (1 par défaut). +4. Cliquez sur le bouton de traitement. Le PDF modifié est téléchargé avec les pages vierges insérées. + +## Fonctionnalités + +- Insertion à n'importe quelle position : début, milieu ou fin du document +- Ajout de plusieurs pages vierges en une seule opération +- L'indication de position se met à jour dynamiquement selon le nombre de pages du PDF importé +- Pages vierges au format A4 standard + +## Cas d'usage + +- Ajouter une page de séparation vierge entre les sections d'un document compilé +- Insérer des pages vierges pour l'alignement de l'impression recto verso +- Prévoir de l'espace pour des notes manuscrites dans un support d'étude imprimé +- Compléter un document pour atteindre un nombre minimal de pages + +## Astuces + +- La position `0` insère avant la première page. Une position égale au nombre total de pages ajoute après la dernière page. +- Si vous devez insérer du contenu (et pas seulement des pages vierges) à une position précise, utilisez [Outil PDF tout-en-un](./pdf-multi-tool) pour insérer un autre PDF après une page donnée. + +## Outils associés + +- [Dupliquer et organiser](./organize-pdf) +- [Outil PDF tout-en-un](./pdf-multi-tool) +- [Fusionner des PDF](./merge-pdf) diff --git a/docs/fr/tools/add-page-labels.md b/docs/fr/tools/add-page-labels.md new file mode 100644 index 00000000..c60535e8 --- /dev/null +++ b/docs/fr/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Ajouter des étiquettes de page +description: Ajoutez des étiquettes de page PDF avec chiffres romains, préfixes alphabétiques, numérotation personnalisée et plusieurs règles par document. +--- + +# Ajouter des étiquettes de page + +Les étiquettes de page déterminent l'affichage des numéros de page dans les lecteurs PDF (le numéro indiqué dans la barre d'outils, et non imprimé sur la page). Cet outil vous permet d'attribuer différents schémas d'étiquetage à différentes plages de pages : chiffres romains pour les pages liminaires, chiffres décimaux pour le corps du texte, annexes en lettres, et plus encore. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. Le panneau d'options apparaît avec une règle d'étiquetage par défaut. +3. Configurez chaque règle avec une plage de pages, un style, un préfixe facultatif et une valeur de départ. +4. Cliquez sur **Ajouter une règle** pour créer des règles supplémentaires pour d'autres sections. +5. Cliquez sur **Ajouter des étiquettes de page** pour appliquer toutes les règles et télécharger le résultat. + +## Options + +Chaque règle d'étiquetage dispose des paramètres suivants : + +- **Plage de pages** : les pages auxquelles la règle s'applique. Laissez vide pour toutes les pages. Accepte des plages comme `1-4`, `7`, `odd` ou `1-9,30-40`. +- **Style d'étiquette** : chiffres arabes décimaux, chiffres romains minuscules (i, ii, iii), chiffres romains majuscules (I, II, III), lettres minuscules (a, b, c), lettres majuscules (A, B, C), ou aucune étiquette (préfixe uniquement). +- **Préfixe d'étiquette** : texte facultatif ajouté devant chaque étiquette, par exemple « A- » pour obtenir des étiquettes comme A-1, A-2, A-3. +- **Valeur de départ** : le nombre à partir duquel commencer le décompte. 1 par défaut. Mettez 0 pour une numérotation commençant à zéro. +- **Poursuivre la numérotation sur des plages disjointes** : activez cette option lorsqu'une règle cible des pages non contiguës (comme `1-9,30-40` ou `odd`) et que vous souhaitez que la numérotation continue de façon séquentielle. +- **Supprimer les étiquettes de page existantes** : cochée par défaut. Efface les étiquettes précédentes avant d'appliquer vos nouvelles règles. + +## Fonctionnalités + +- Plusieurs règles d'étiquetage par document pour les schémas de numérotation complexes +- Six styles d'étiquettes couvrant tous les systèmes de numérotation courants +- Préfixe personnalisé pour un étiquetage par section +- Prise en charge des plages disjointes avec numérotation progressive +- Option pour conserver ou supprimer les étiquettes existantes + +## Cas d'usage + +- Définir des étiquettes en chiffres romains (i, ii, iii) pour la préface d'un livre et des étiquettes décimales pour le texte principal +- Étiqueter les pages d'annexe avec des préfixes alphabétiques comme « A-1 », « A-2 », « B-1 », « B-2 » +- Corriger les étiquettes de page d'un document numérisé dont les numéros de page physiques ne correspondent pas à l'ordre des pages du PDF +- Ajouter une numérotation commençant à zéro pour des documents techniques + +## Astuces + +- Les étiquettes de page sont des métadonnées que les lecteurs PDF affichent dans leur barre de navigation. Elles ne s'impriment pas sur la page. Pour des numéros visibles, utilisez [Numéros de page](./page-numbers). +- Cet outil nécessite que CoherentPDF (CPDF) soit configuré dans vos paramètres WASM. S'il ne l'est pas, il vous sera proposé de le configurer. + +## Outils associés + +- [Numéros de page](./page-numbers) +- [Numérotation Bates](./bates-numbering) +- [Modifier les signets](./bookmark) diff --git a/docs/fr/tools/add-stamps.md b/docs/fr/tools/add-stamps.md new file mode 100644 index 00000000..99be22ac --- /dev/null +++ b/docs/fr/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Ajouter des tampons +description: Ajoutez des tampons image à vos pages PDF grâce à une barre d'outils d'annotation intégrée avec attribution par nom d'utilisateur. +--- + +# Ajouter des tampons + +Placez des tampons image sur vos pages PDF à l'aide d'un lecteur intégré doté d'une barre d'outils d'annotation de tampons. Les tampons peuvent inclure votre nom pour l'attribution, ce qui est utile pour les circuits d'approbation, les processus de relecture et le marquage de documents. + +## Fonctionnement + +1. Saisissez votre nom dans le champ **Nom d'utilisateur du tampon**. Ce nom apparaîtra sur les tampons que vous créez. +2. Importez votre fichier PDF en cliquant ou en le glissant dans la zone de dépôt. +3. L'éditeur de tampons s'ouvre avec votre document chargé dans un lecteur. +4. Utilisez l'outil de tampon image de la barre d'outils pour sélectionner et placer des tampons sur n'importe quelle page. +5. Positionnez et redimensionnez les tampons selon vos besoins. +6. Cliquez sur **Enregistrer le PDF tamponné** pour télécharger le résultat. + +## Fonctionnalités + +- Lecteur PDF intégré avec une barre d'outils d'annotation dédiée aux tampons +- Attribution par nom d'utilisateur sur les tampons créés +- Placement de tampons image sur n'importe quelle page +- Positionnement et redimensionnement par glisser-déposer +- Dimensionnement automatique du lecteur selon le format de la page +- Affichage du fichier avec son nom et sa taille + +## Cas d'usage + +- Ajouter des tampons image « APPROUVÉ » ou « RELU » aux documents d'un circuit de relecture +- Placer le sceau d'une entreprise ou le cachet d'un notaire sur des documents officiels +- Marquer des pages avec des tampons « REÇU » incluant le nom du relecteur +- Ajouter des tampons de contrôle qualité à des rapports d'inspection + +## Astuces + +- Définissez le nom d'utilisateur du tampon avant d'importer le PDF. Le nom d'utilisateur est intégré aux métadonnées du tampon. +- Le lecteur ajuste sa hauteur selon le format de la première page du PDF pour un affichage optimal. +- Pour des filigranes textuels plutôt que des tampons image, utilisez l'outil [Ajouter un filigrane](./add-watermark). + +## Outils associés + +- [Signer un PDF](./sign-pdf) +- [Ajouter un filigrane](./add-watermark) +- [Éditeur PDF](./edit-pdf) diff --git a/docs/fr/tools/add-watermark.md b/docs/fr/tools/add-watermark.md new file mode 100644 index 00000000..8276824b --- /dev/null +++ b/docs/fr/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Ajouter un filigrane +description: Apposez des filigranes texte ou image sur les pages PDF avec un éditeur visuel par glisser-déposer et un aperçu en direct. +--- + +# Ajouter un filigrane + +Ajoutez des filigranes texte ou image à vos pages PDF grâce à un éditeur visuel. Vous pouvez positionner le filigrane en le faisant glisser directement sur l'aperçu, le redimensionner avec les poignées d'angle, et configurer l'opacité, la rotation, la police et la couleur. Chaque page peut avoir sa propre position de filigrane, ou vous pouvez appliquer le même filigrane à toutes les pages à la fois. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. L'éditeur s'ouvre avec un aperçu en direct de la première page et une superposition de filigrane déplaçable. +3. Choisissez entre le mode filigrane **Texte** ou **Image** avec les boutons de bascule. +4. Configurez les paramètres du filigrane dans le panneau latéral. +5. Faites glisser le filigrane sur l'aperçu pour le positionner exactement où vous le souhaitez. Utilisez les poignées d'angle pour le redimensionner. +6. Naviguez entre les pages pour définir des filigranes par page, ou laissez **Appliquer à toutes les pages** coché. +7. Cliquez sur **Ajouter un filigrane** pour traiter et télécharger. + +## Options + +**Paramètres du filigrane texte :** + +- **Texte** : le texte du filigrane (par exemple « CONFIDENTIEL », « BROUILLON »). +- **Taille de police** : de 10 à 200 points. 72 par défaut. +- **Couleur** : n'importe quelle couleur via le sélecteur de couleur. +- **Opacité** : contrôle la transparence, de totalement transparent à totalement opaque. +- **Rotation** : fait pivoter le texte du filigrane de -180 à 180 degrés. + +**Paramètres du filigrane image :** + +- **Import d'image** : importez un fichier PNG, JPG ou un autre format d'image à utiliser comme filigrane. +- **Opacité** : contrôle la transparence de l'image. +- **Échelle** : redimensionne le filigrane image. + +**Paramètres de disposition :** + +- **Unique** : un filigrane par page, positionné par glisser-déposer ou avec les positions prédéfinies. +- **En mosaïque** : répète le filigrane sur toute la page selon une grille diagonale qui suit l'angle de rotation, de sorte que la marque couvre le document d'un bord à l'autre. +- **Espacement horizontal** : espace entre les motifs le long de la direction du texte, en pourcentage de la largeur du filigrane (mode mosaïque uniquement). +- **Espacement vertical** : espace entre les rangées de motifs, en pourcentage de la hauteur du filigrane (mode mosaïque uniquement). + +**Paramètres généraux :** + +- **Appliquer à toutes les pages** : lorsque cette option est cochée, le même filigrane s'applique à chaque page. Décochez-la pour définir des filigranes individuels par page. +- **Plage de pages** : indiquez les pages qui reçoivent le filigrane (par exemple « 1-3, 5, 7-9 » ou « all »). + +## Fonctionnalités + +- Positionnement visuel par glisser-déposer sur un aperçu PDF en direct +- Filigrane redimensionnable avec des poignées d'angle +- Modes filigrane texte et image +- Disposition unique ou en mosaïque sur toute la page (répétée) avec espacement réglable +- Application par page ou globale du filigrane +- Navigation page par page dans l'aperçu +- Contrôles d'opacité et de rotation +- Filtrage par plage de pages + +## Cas d'usage + +- Marquer des brouillons avec « BROUILLON » avant de les diffuser pour relecture +- Ajouter des filigranes « CONFIDENTIEL » à des rapports financiers sensibles +- Personnaliser des documents avec un filigrane image représentant le logo d'une entreprise +- Apposer « EXEMPLE » sur la documentation produit partagée avec des prospects +- Ajouter des mentions de droit d'auteur aux documents PDF diffusés + +## Astuces + +- Pour des filigranes en diagonale sur la page, définissez une rotation d'environ 45 degrés et augmentez la taille de police. +- Le mode mosaïque rend un document beaucoup plus difficile à réutiliser après un rognage, car supprimer une marque en laisse des dizaines d'autres. Réduisez l'opacité en mosaïque pour que le texte sous-jacent reste lisible. +- Les filigranes image à fond transparent (format PNG) se fondent plus naturellement dans le contenu du document. +- Si vous avez besoin d'un texte de filigrane différent selon les pages, décochez « Appliquer à toutes les pages » et naviguez page par page. + +## Outils associés + +- [En-tête et pied de page](./header-footer) +- [Ajouter des tampons](./add-stamps) +- [Numérotation Bates](./bates-numbering) +- [Signer un PDF](./sign-pdf) diff --git a/docs/fr/tools/adjust-colors.md b/docs/fr/tools/adjust-colors.md new file mode 100644 index 00000000..e185b0be --- /dev/null +++ b/docs/fr/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Ajuster les couleurs +description: Affinez la luminosité, le contraste, la saturation, la teinte, la température, la nuance, le gamma et le sépia de votre PDF. +--- + +# Ajuster les couleurs + +Une boîte à outils complète d'étalonnage des couleurs pour les PDF. Réglez huit paramètres indépendants (luminosité, contraste, saturation, décalage de teinte, température, nuance, gamma et sépia) avec un aperçu en direct qui se met à jour à chaque mouvement de curseur. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. L'éditeur s'ouvre avec un aperçu de la première page et un panneau de réglages des couleurs. +3. Déplacez les curseurs pour ajuster chaque paramètre de couleur. L'aperçu se met à jour en temps réel. +4. Cliquez sur **Réinitialiser** pour remettre tous les curseurs à leur position par défaut. +5. Cliquez sur **Appliquer** pour traiter toutes les pages et télécharger le PDF ajusté. + +## Options + +- **Luminosité** : éclaircit ou assombrit toute la page (-100 à +100). +- **Contraste** : augmente ou diminue la différence entre les zones claires et sombres (-100 à +100). +- **Saturation** : renforce ou réduit l'intensité des couleurs (-100 à +100). Une valeur de -100 produit un résultat en niveaux de gris. +- **Décalage de teinte** : fait tourner la roue chromatique pour décaler toutes les couleurs de façon uniforme. +- **Température** : rend les couleurs plus chaudes (jaune/orange) ou plus froides (bleu). +- **Nuance** : ajoute une dominante verte ou magenta. +- **Gamma** : ajuste la luminosité des tons moyens à l'aide d'une courbe gamma. Les valeurs inférieures à 1,0 assombrissent les tons moyens, celles supérieures à 1,0 les éclaircissent. +- **Sépia** : applique un effet sépia classique. Plus la valeur est élevée, plus la teinte brune est marquée. + +## Fonctionnalités + +- Huit paramètres de couleur réglables indépendamment +- Aperçu en direct qui réagit immédiatement aux mouvements des curseurs +- Bouton de réinitialisation pour revenir rapidement aux valeurs par défaut +- Traitement de toutes les pages du document +- Fonctionne avec tout contenu PDF (texte, images, graphiques) + +## Cas d'usage + +- Éclaircir une numérisation sombre ou corriger des pages surexposées +- Désaturer un document très coloré pour réduire la consommation d'encre avant l'impression +- Appliquer un ton sépia pour donner un aspect ancien à des certificats ou des diplômes +- Corriger la température de couleur de photos intégrées à un PDF +- Renforcer le contraste de documents numérisés ternes ou de mauvaise qualité + +## Astuces + +- Pour une conversion rapide en niveaux de gris, faites glisser le curseur de saturation jusqu'à -100. +- Le curseur gamma est particulièrement utile pour améliorer la lisibilité des documents numérisés dont les tons moyens sont trop sombres ou trop clairs. +- Comme les autres outils d'effets d'image, celui-ci rastérise chaque page. Le résultat sera basé sur des images, le texte ne sera donc pas sélectionnable. + +## Outils associés + +- [Inverser les couleurs](./invert-colors) +- [Effet scanner](./scanner-effect) +- [Couleur de fond](./background-color) diff --git a/docs/fr/tools/alternate-merge.md b/docs/fr/tools/alternate-merge.md new file mode 100644 index 00000000..e1aaf462 --- /dev/null +++ b/docs/fr/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alterner et mélanger les pages +description: Fusionnez des PDF en entrelaçant les pages de chaque fichier en alternance, avec conservation des signets. +--- + +# Alterner et mélanger les pages + +Entrelacez les pages de plusieurs fichiers PDF pour que les pages alternent entre les documents. C'est l'outil à utiliser quand une fusion classique ne ferait que mettre les fichiers bout à bout, alors que vous voulez la page 1 du fichier A, puis la page 1 du fichier B, puis la page 2 du fichier A, et ainsi de suite. + +## Fonctionnement + +1. Importez au moins deux fichiers PDF à l'aide de la zone de dépôt. +2. L'outil affiche chaque fichier avec son nombre de pages et sa taille. +3. Faites glisser les poignées pour réordonner les fichiers dont les pages passent en premier dans la séquence d'entrelacement. +4. Cliquez sur **Mélanger les pages** pour produire le résultat entrelacé. +5. Le résultat est téléchargé sous le nom `alternated-mixed.pdf`. + +## Fonctionnalités + +- Entrelace les pages d'un nombre quelconque de PDF (deux minimum) +- Réorganisation des fichiers par glisser-déposer pour contrôler la priorité d'entrelacement +- Conserve les signets des documents sources +- Affiche le nombre de pages et la taille de chaque fichier importé +- Traitement dans un web worker dédié pour une interface réactive + +## Cas d'usage + +- Reconstituer des numérisations recto verso dont les pages impaires et paires ont été numérisées séparément +- Combiner des feuilles de questions avec leur corrigé pour que chaque question soit suivie de sa réponse +- Fusionner des documents bilingues page par page (par exemple, l'anglais d'un côté, la traduction sur la page suivante) +- Entrelacer les numérisations de recto et de verso issues d'un scanner à passage simple face + +## Astuces + +- Si vos PDF sources n'ont pas le même nombre de pages, les pages du document le plus court seront épuisées en premier et les pages restantes du document le plus long apparaîtront à la fin. +- L'ordre des fichiers compte : le premier fichier de la liste fournit la première page du résultat. Faites glisser pour réorganiser si nécessaire. + +## Outils associés + +- [Fusionner des PDF](./merge-pdf) +- [Dupliquer et organiser](./organize-pdf) +- [Scinder un PDF](./split-pdf) diff --git a/docs/fr/tools/background-color.md b/docs/fr/tools/background-color.md new file mode 100644 index 00000000..5f49c5f0 --- /dev/null +++ b/docs/fr/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Couleur de fond +description: Changez la couleur de fond de chaque page de votre PDF tout en conservant l'ensemble du contenu au-dessus. +--- + +# Couleur de fond + +Définissez une couleur de fond unie derrière tout le contenu existant de votre PDF. L'outil crée un rectangle coloré sur chaque page et superpose le contenu d'origine, de sorte que le texte, les images et les graphiques restent parfaitement visibles sur le nouveau fond. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. Choisissez une couleur de fond avec le sélecteur de couleur. La valeur par défaut est un jaune clair (#FFFFCC). +3. Cliquez sur **Changer la couleur de fond** pour lancer le traitement. +4. Le PDF mis à jour est téléchargé automatiquement. + +## Options + +- **Couleur de fond** : un sélecteur de couleur standard pour choisir n'importe quelle couleur unie. Jaune clair par défaut. + +## Fonctionnalités + +- Applique une couleur de fond uniforme à chaque page +- Conserve tout le contenu d'origine (texte, images, graphiques vectoriels) au-dessus de la couche colorée +- Conserve les dimensions d'origine des pages +- Fonctionne avec des documents de n'importe quel nombre de pages + +## Cas d'usage + +- Ajouter un fond crème ou ivoire clair pour donner aux documents un aspect plus doux, proche du papier +- Coder par couleur des ensembles de documents en appliquant des couleurs de fond différentes selon les catégories +- Créer des versions visuellement distinctes d'un même document pour différents publics +- Ajouter une légère teinte de fond pour améliorer la lisibilité lors de la projection de documents à l'écran + +## Astuces + +- Les couleurs claires et douces donnent les meilleurs résultats. Un fond très sombre peut rendre le texte difficile à lire, sauf si le texte est déjà de couleur claire. +- Si vous voulez changer à la fois la couleur de fond et celle du texte, appliquez d'abord la couleur de fond, puis utilisez [Changer la couleur du texte](./text-color) sur le résultat. +- Cet outil travaille au niveau de la structure du PDF (sans rastérisation), le texte reste donc sélectionnable et consultable par recherche dans le résultat. + +## Outils associés + +- [Changer la couleur du texte](./text-color) +- [Inverser les couleurs](./invert-colors) +- [Ajuster les couleurs](./adjust-colors) diff --git a/docs/fr/tools/bates-numbering.md b/docs/fr/tools/bates-numbering.md new file mode 100644 index 00000000..bb0e7082 --- /dev/null +++ b/docs/fr/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Numérotation Bates +description: Appliquez des numéros Bates à un ou plusieurs PDF avec des modèles personnalisables, du remplissage, des polices et un positionnement au choix. +--- + +# Numérotation Bates + +La numérotation Bates appose des identifiants séquentiels sur chaque page de vos PDF. C'est la méthode standard pour étiqueter les documents dans les procédures judiciaires, les audits et les processus de conformité. Cet outil prend en charge plusieurs fichiers et des modèles personnalisables, et produit des PDF numérotés individuellement ou une seule archive ZIP. + +## Fonctionnement + +1. Importez un ou plusieurs fichiers PDF. Vous pouvez glisser plusieurs fichiers à la fois. +2. Choisissez un style prédéfini ou créez un modèle personnalisé. +3. Configurez la position, la police, la taille, la couleur et les numéros de départ. +4. Cliquez sur **Appliquer les numéros Bates** pour lancer le traitement. +5. Un fichier unique est téléchargé directement. Plusieurs fichiers sont téléchargés sous forme d'archive ZIP. + +## Options + +- **Style prédéfini** : choisissez parmi les formats intégrés : + - Pièce + Dossier + Bates + Page (par exemple «Exhibit 1 Case XYZ 000001 Page 1») + - Pièce + Dossier + Bates (sans numéro de page) + - Dossier + Bates + - Numéro Bates uniquement (par exemple « 000001 ») + - Personnalisé (écrivez votre propre modèle) +- **Personnaliser le style** : une chaîne de modèle utilisant des variables : `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Remplissage Bates** : nombre de chiffres (3 à 6) des numéros Bates complétés par des zéros. Visible uniquement en mode personnalisé. +- **Position** : en-tête ou pied de page, à gauche, au centre ou à droite. +- **Les numéros Bates commencent à** : le premier numéro Bates. 1 par défaut. La numérotation se poursuit d'un fichier à l'autre. +- **Le compteur de fichiers commence à** : le numéro de départ de la variable `[FILE]`. +- **Police** : Helvetica, Times New Roman ou Courier. +- **Taille de police** : taille du texte apposé. +- **Couleur** : sélecteur de couleur pour le texte du numéro Bates. + +## Fonctionnalités + +- Aperçu en direct montrant l'apparence des numéros Bates sur tous les fichiers importés +- Prise en charge de plusieurs fichiers avec numérotation continue entre les documents +- Réorganisation des fichiers par glisser-déposer pour contrôler la séquence de numérotation +- Six positions possibles (en-tête/pied de page, gauche/centre/droite) +- Calcul adaptatif des marges qui respecte les différents formats de page +- Sortie ZIP pour les lots de plusieurs fichiers +- Variables de modèle pour une flexibilité maximale + +## Cas d'usage + +- Numéroter des documents de communication de pièces dans un litige avec des numéros de pièces séquentiels +- Numéroter des dossiers de preuves d'audit répartis sur des dizaines de fichiers +- Appliquer des numéros de référence réglementaires à la documentation de conformité +- Étiqueter les pièces d'une demande de brevet avec des identifiants propres au dossier + +## Astuces + +- Faites glisser les fichiers dans la liste pour les réordonner avant le traitement. La séquence de numérotation Bates suit cet ordre. +- Utilisez la variable `[FILENAME]` pour inclure le nom du fichier d'origine dans le tampon, ce qui aide à retrouver la source des pages. +- La zone d'aperçu se met à jour en temps réel lorsque vous modifiez les réglages, ce qui vous permet de vérifier le format avant le traitement. + +## Outils associés + +- [Numéros de page](./page-numbers) +- [Ajouter des étiquettes de page](./add-page-labels) +- [En-tête et pied de page](./header-footer) diff --git a/docs/fr/tools/bmp-to-pdf.md b/docs/fr/tools/bmp-to-pdf.md new file mode 100644 index 00000000..1289ac06 --- /dev/null +++ b/docs/fr/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP vers PDF +description: Convertissez des images bitmap BMP au format PDF directement dans votre navigateur, sans aucun envoi vers un serveur. +--- + +# BMP vers PDF + +Convertissez des fichiers Windows Bitmap (BMP) en PDF. Le BMP est un format d'image non compressé que l'on trouve encore dans les systèmes anciens, l'imagerie médicale et les scanners industriels. Cet outil les convertit en PDF sans rien installer. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :--------- | +| BMP | `.bmp` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers BMP. +2. Vérifiez la liste des fichiers. Ajoutez-en d'autres ou retirez ceux dont vous n'avez pas besoin. +3. Cliquez sur **Convertir en PDF**. Le résultat est téléchargé sous le nom `from_bmps.pdf`. + +Chaque BMP est dessiné sur un canvas, exporté en PNG, puis intégré au PDF avec pdf-lib. La taille de la page correspond aux dimensions de l'image d'origine. + +## Options + +Cet outil n'expose pas de réglages de qualité supplémentaires. Les images sont intégrées à leur résolution d'origine, en PNG sans perte, dans le PDF. + +## Cas d'usage + +- Convertir en PDF d'archivage des documents numérisés anciens stockés en BMP +- Transformer des captures d'écran BMP d'anciennes applications Windows en documents partageables +- Traiter les sorties de scanners médicaux ou industriels qui produisent du BMP par défaut +- Migrer d'anciennes archives d'images vers un format plus portable + +## Astuces + +- Les fichiers BMP ne sont pas compressés et sont donc souvent volumineux. Le PDF obtenu sera nettement plus léger, car les images sont réencodées en PNG en interne. +- Si vous avez des fichiers BMP à côté d'autres formats d'image, utilisez l'outil [Images vers PDF](./image-to-pdf) pour tout convertir en un seul lot. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [PNG vers PDF](./png-to-pdf) +- [TIFF vers PDF](./tiff-to-pdf) diff --git a/docs/fr/tools/bookmark.md b/docs/fr/tools/bookmark.md new file mode 100644 index 00000000..009f0ce2 --- /dev/null +++ b/docs/fr/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Modifier les signets +description: Ajoutez, modifiez, importez, exportez et supprimez les signets d'un PDF avec un éditeur visuel et la prise en charge de CSV/JSON. +--- + +# Modifier les signets + +L'éditeur de signets vous donne un contrôle total sur les signets de navigation d'un PDF (aussi appelés plan du document). Vous pouvez ajouter de nouveaux signets, modifier les existants, réorganiser la hiérarchie et importer ou exporter les données des signets aux formats CSV et JSON. + +## Fonctionnement + +1. Importez votre PDF en cliquant ou en glissant un fichier dans la zone de dépôt. +2. Cochez éventuellement **Extraire automatiquement les signets existants** pour récupérer l'arborescence de signets actuelle du document. +3. L'éditeur s'ouvre en vue partagée : visionneuse PDF à gauche, panneau des signets à droite. +4. Saisissez un titre de signet et cliquez sur **Ajouter à la page** pour créer un signet pointant vers la page actuelle. +5. Utilisez les boutons de la barre d'outils pour réorganiser, mettre en forme ou supprimer des signets. +6. Cliquez sur **Enregistrer le PDF avec les signets** pour télécharger le fichier mis à jour. + +## Fonctionnalités + +- Visionneuse PDF visuelle avec navigation entre les pages, commandes de zoom et saisie d'un numéro de page +- Ajout de signets sur n'importe quelle page en un clic +- Clic direct sur le PDF pour définir une destination précise du signet (mode sélection) +- Hiérarchie de signets imbriqués avec réorganisation par glisser-déposer +- Opérations par lots : sélectionnez plusieurs signets pour changer la couleur, le style ou les supprimer d'un coup +- Recherche de signets pour retrouver rapidement des entrées dans de grandes arborescences +- Annulation et rétablissement pour toutes les modifications +- Import de signets depuis des fichiers CSV (titre, page, niveau) ou JSON +- Export des signets en CSV ou JSON pour une modification externe +- Mise en forme des signets : couleur (rouge, bleu, vert, jaune, violet) et style de police (gras, italique, gras italique) +- Navigation rapide : parcourez les pages avec les touches Page précédente/suivante + +## Options + +- **Extraire automatiquement les signets existants** : lorsque cette option est cochée, l'outil lit et affiche les signets actuels du PDF au chargement. +- **Mode par lots** : activez-le pour sélectionner plusieurs signets et appliquer des changements de couleur, de style ou des suppressions en masse. +- **Tout développer/réduire** : affichez ou masquez rapidement les signets enfants imbriqués. + +## Cas d'usage + +- Ajouter une table des matières à un manuel ou un ouvrage qui n'a pas de signets +- Restructurer les signets d'un document numérisé après un traitement OCR +- Exporter les signets en CSV, les modifier dans un tableur, puis les réimporter +- Nettoyer des signets générés automatiquement dont les références de page sont incorrectes +- Ajouter des signets colorés pour repérer les sections importantes d'un mémoire juridique + +## Conseils + +- Utilisez l'import CSV pour créer des signets en masse. Le format est simple : `title,page,level`, où le niveau 1 correspond au premier niveau. +- Le mode sélection vous permet de cliquer sur un endroit précis de la page PDF pour définir la destination du signet, ce qui est plus précis que de cibler simplement un numéro de page. +- Exportez vos signets avant de faire des modifications importantes pour avoir une sauvegarde. + +## Outils associés + +- [Table des matières](./table-of-contents) +- [Éditeur PDF](./edit-pdf) +- [Ajouter des étiquettes de page](./add-page-labels) diff --git a/docs/fr/tools/cbz-to-pdf.md b/docs/fr/tools/cbz-to-pdf.md new file mode 100644 index 00000000..7e41ffe7 --- /dev/null +++ b/docs/fr/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ vers PDF +description: Convertissez des archives de bandes dessinées CBZ et CBR en PDF dans votre navigateur. Gratuit, privé, sans envoi de fichiers. +--- + +# CBZ vers PDF + +Transformez des archives de bandes dessinées en PDF. CBZ et CBR sont les formats standards des BD numériques : ce sont simplement des archives ZIP ou RAR remplies d'images. Cet outil extrait chaque page, conserve l'ordre de lecture et produit un PDF propre où chaque image devient une page en taille réelle. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----- | :-------- | :------------------------------------------------------------ | +| CBZ | `.cbz` | Archive de BD basée sur ZIP (traitée localement avec pdf-lib) | +| CBR | `.cbr` | Archive de BD basée sur RAR (traitée via le moteur PyMuPDF) | + +Le convertisseur CBZ reconnaît les images JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC et JXL contenues dans l'archive. Les formats non standard sont automatiquement convertis en PNG avant d'être intégrés. + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers CBZ ou CBR. Vous pouvez mélanger les deux formats dans un même lot. +2. Vérifiez la liste des fichiers. Retirez ceux dont vous n'avez pas besoin, ou cliquez sur **Ajouter d'autres fichiers** pour en ajouter. +3. Cliquez sur **Convertir en PDF**. Pour les fichiers CBZ, l'outil décompresse l'archive, trie les images par nom dans l'ordre naturel, détecte le format réel de chaque image et les intègre dans un PDF avec pdf-lib. Les fichiers CBR passent plutôt par le moteur PyMuPDF. +4. Un seul fichier est téléchargé sous forme de PDF. Plusieurs fichiers produisent une archive ZIP nommée `comic-converted.zip`. + +## Options + +Aucune configuration n'est nécessaire. Chaque image devient une page dont la taille correspond à ses dimensions d'origine : les doubles pages restent larges et les pages simples restent étroites. + +## Cas d'usage + +- Lire des BD sur une tablette ou une application mobile qui prend en charge le PDF mais pas CBZ/CBR +- Imprimer certaines pages d'une BD numérique +- Archiver une collection de BD dans un format que n'importe quel lecteur de fichiers peut ouvrir +- Partager une BD avec quelqu'un qui n'a pas de lecteur de BD dédié + +## Conseils + +- Les images de l'archive sont triées dans l'ordre naturel (ainsi `page2.jpg` vient avant `page10.jpg`). Nommez vos fichiers avec une numérotation cohérente pour obtenir le bon ordre des pages. +- Le convertisseur détecte les formats d'image grâce à leurs signatures binaires, pas à leurs extensions. Un PNG nommé par erreur `.jpg` sera quand même intégré correctement. +- Les fichiers CBZ sont traités entièrement dans le navigateur sans charger le moteur PyMuPDF, ils se convertissent donc plus vite que les fichiers CBR. + +## Outils associés + +- [EPUB vers PDF](./epub-to-pdf) +- [MOBI vers PDF](./mobi-to-pdf) +- [Images vers PDF](./image-to-pdf) diff --git a/docs/fr/tools/change-permissions.md b/docs/fr/tools/change-permissions.md new file mode 100644 index 00000000..525c5300 --- /dev/null +++ b/docs/fr/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Modifier les autorisations +description: Définissez ou modifiez les autorisations d'utilisation d'un PDF pour l'impression, la copie, la modification et l'annotation. Utilise le chiffrement AES 256 bits. +--- + +# Modifier les autorisations + +Réglez précisément ce que les destinataires peuvent faire avec votre PDF. Contrairement au chiffrement basique qui verrouille simplement le fichier derrière un mot de passe, cet outil vous permet d'autoriser ou d'interdire sélectivement l'impression, la copie, la modification, l'annotation, le remplissage de formulaires, l'assemblage de documents et l'extraction de pages, le tout appliqué par un chiffrement AES 256 bits. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Si le PDF est déjà chiffré, saisissez le **Mot de passe actuel**. +3. Définissez un **Nouveau mot de passe utilisateur** (requis pour ouvrir) et/ou un **Nouveau mot de passe propriétaire** (contrôle les autorisations). +4. Activez ou désactivez chaque autorisation avec les cases à cocher. +5. Cliquez sur **Modifier les autorisations**. +6. Téléchargez le PDF mis à jour. + +Si vous laissez vides les deux champs de nouveau mot de passe, l'outil déchiffre entièrement le PDF et supprime tout chiffrement et toute restriction. + +## Contrôles des autorisations + +| Autorisation | Ce qu'elle contrôle | +| ------------------------------------------- | ---------------------------------------------------------------- | +| **Autoriser l'impression** | Si le document peut être imprimé | +| **Autoriser la copie** | Si le texte et les images peuvent être sélectionnés et copiés | +| **Autoriser la modification** | Si le contenu du document peut être modifié | +| **Autoriser l'annotation** | Si des commentaires, surlignages et tampons peuvent être ajoutés | +| **Autoriser le remplissage de formulaires** | Si les champs de formulaire interactifs peuvent être remplis | +| **Autoriser l'assemblage du document** | Si des pages peuvent être insérées, supprimées ou pivotées | +| **Autoriser l'extraction de pages** | Si des pages individuelles peuvent être extraites | + +Toutes les autorisations nécessitent un mot de passe propriétaire pour être appliquées. Sans mot de passe propriétaire, les indicateurs d'autorisation sont ignorés par la plupart des lecteurs PDF. + +## Comment fonctionnent les autorisations dans un PDF + +Les autorisations PDF font partie de la spécification de chiffrement. Elles sont stockées sous forme d'indicateurs binaires dans le dictionnaire de chiffrement et appliquées par les lecteurs PDF conformes. La distinction essentielle : + +- **Mot de passe utilisateur** : requis pour ouvrir le fichier. +- **Mot de passe propriétaire** : requis pour modifier les autorisations ou lever les restrictions. Sans lui, les indicateurs d'autorisation déterminent les opérations que l'utilisateur peut effectuer. + +Si vous ne définissez qu'un mot de passe propriétaire (sans mot de passe utilisateur), tout le monde peut ouvrir le fichier, mais sera limité aux opérations autorisées. Si vous définissez les deux, le fichier exige un mot de passe pour être ouvert et reste restreint après l'authentification. + +## Cas d'usage + +- Distribuer un rapport qui peut être consulté et imprimé, mais pas modifié ni copié +- Partager un modèle de contrat que les destinataires peuvent remplir sans le modifier +- Publier un catalogue PDF dont la copie des images est désactivée +- Autoriser l'annotation d'un brouillon en relecture tout en empêchant les changements de structure + +## Conseils + +- Pour être efficace, définissez toujours un mot de passe propriétaire. Les autorisations sans mot de passe propriétaire ne peuvent pas être appliquées. +- Certains outils PDF tiers ignorent les indicateurs d'autorisation. Pour une protection plus solide, envisagez de rastériser le PDF ou d'utiliser un DRM. +- Utilisez cet outil pour faire passer d'anciens PDF chiffrés en RC4 à l'AES 256. + +## Outils associés + +- [Protéger un PDF](./protect-pdf) : protection simple par mot de passe, sans autorisations détaillées +- [Déverrouiller un PDF](./unlock-pdf) : supprime entièrement le chiffrement +- [Supprimer les restrictions](./remove-restrictions) : retire toutes les restrictions lorsque vous avez le mot de passe propriétaire diff --git a/docs/fr/tools/combine-single-page.md b/docs/fr/tools/combine-single-page.md new file mode 100644 index 00000000..1e4f72a0 --- /dev/null +++ b/docs/fr/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Combiner en une seule page +description: Assemblez toutes les pages d'un PDF en un seul défilement continu, vertical ou horizontal. +--- + +# Combiner en une seule page + +Fusionnez toutes les pages d'un PDF en une seule longue page. Les pages sont assemblées verticalement (comme un rouleau) ou horizontalement (côte à côte), pour produire une page continue en sortie. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Choisissez la direction de la mise en page : **Vertical** (pages empilées de haut en bas) ou **Horizontal** (pages placées côte à côte). +3. Définissez l'espacement entre les pages en points. +4. Choisissez une couleur de fond pour les espaces entre les pages. +5. Activez éventuellement les séparateurs (fines lignes entre les pages) et réglez leur épaisseur et leur couleur. +6. Cliquez sur le bouton de traitement. Le résultat est un PDF d'une seule page. + +## Fonctionnalités + +- Assemblage des pages à la verticale ou à l'horizontale +- Espacement configurable entre les pages +- Sélecteur de couleur de fond pour les zones d'espacement +- Lignes de séparation facultatives avec épaisseur et couleur réglables +- Rendu de chaque page d'origine en pleine résolution sur le canevas combiné + +## Options + +| Option | Description | +| --------------------------- | ------------------------------------------------- | +| **Sens de la mise en page** | Verticale (empilées) ou horizontale (côte à côte) | +| **Espacement des pages** | Écart entre les pages en points | +| **Couleur de fond** | Couleur de la zone entre les pages | +| **Ajouter un séparateur** | Active de fines lignes entre les pages | +| **Épaisseur du séparateur** | Épaisseur de la ligne en points | +| **Couleur du séparateur** | Couleur des lignes de séparation | + +## Cas d'usage + +- Créer une longue image unique à partir d'une maquette ou d'un wireframe de plusieurs pages +- Générer une vue défilante continue d'un document pour l'intégrer à un site web +- Assembler une BD ou un storyboard de plusieurs pages en une seule bande +- Produire une vue panoramique de pages successives pour une relecture + +## Conseils + +- L'orientation verticale convient mieux aux documents à pages en portrait. L'horizontale est préférable pour le contenu en paysage. +- Les documents volumineux comportant beaucoup de pages produiront un résultat très haut ou très large. Certaines visionneuses PDF peuvent avoir du mal avec des pages uniques extrêmement grandes. +- Ajouter des séparateurs d'une couleur contrastée permet de voir facilement où une page d'origine se termine et où la suivante commence. + +## Outils associés + +- [PDF N-up](./n-up-pdf) +- [Fusionner des PDF](./merge-pdf) +- [Diviser les pages](./divide-pages) diff --git a/docs/fr/tools/compare-pdfs.md b/docs/fr/tools/compare-pdfs.md new file mode 100644 index 00000000..a4210d1e --- /dev/null +++ b/docs/fr/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Comparer des PDF +description: Comparez deux documents PDF côte à côte ou en mode superposition, avec détection et classement détaillés des modifications. +--- + +# Comparer des PDF + +Importez deux PDF et voyez exactement ce qui a changé entre eux. L'outil associe intelligemment les pages, détecte les différences de texte, d'images, d'annotations, d'en-têtes et de mise en forme, puis les présente en vue côte à côte ou en superposition. + +## Fonctionnement + +1. Importez deux fichiers PDF : l'original (à gauche) et la version révisée (à droite). +2. L'outil associe les pages des deux documents à l'aide de signatures de contenu. +3. Choisissez un mode d'affichage : **Côte à côte** ou **Superposition**. +4. Naviguez entre les paires de pages avec les commandes de pagination. +5. Les différences sont surlignées et classées. Utilisez le panneau de filtres pour vous concentrer sur certains types de modifications. +6. Exportez éventuellement la comparaison sous forme de rapport PDF. + +## Fonctionnalités + +- Association automatique des pages selon la similarité du contenu +- Vues de comparaison côte à côte et en superposition +- Classement des modifications : texte, image, en-tête/pied de page, annotation, mise en forme, arrière-plan +- Filtres par catégorie pour afficher ou masquer certains types de modifications +- Recherche dans les modifications de texte avec filtrage par requête +- Prise en charge de l'OCR pour comparer des documents numérisés +- Commandes de zoom pour une inspection détaillée +- Défilement synchronisé entre les panneaux en mode côte à côte +- Export des résultats de la comparaison en PDF + +## Options + +| Option | Description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **Mode d'affichage** | Côte à côte ou superposition | +| **OCR** | Active/désactive l'OCR pour la comparaison de documents numérisés | +| **Langue de l'OCR** | Langue utilisée pour l'extraction du texte par OCR | +| **Filtres par catégorie** | Active ou masque l'affichage des modifications de texte, d'image, d'en-tête/pied de page, d'annotation, de mise en forme et d'arrière-plan | +| **Portée des modifications** | En mode superposition, filtre entre toutes les modifications ou le contenu uniquement | +| **Zoom** | Ajuste le niveau d'agrandissement pour une inspection détaillée | + +## Cas d'usage + +- Relire les révisions d'un contrat pour trouver exactement ce qui a changé entre deux versions +- Comparer des maquettes de design pour vérifier que les exports PDF correspondent aux attentes +- Auditer les modifications de documents dans des secteurs réglementés où chaque changement doit être tracé +- Vérifier qu'un processus de conversion PDF a fidèlement préservé le contenu d'origine +- Comparer des documents traduits à la source pour repérer les changements de mise en page + +## Conseils + +- La vue en superposition empile les deux documents l'un sur l'autre, ce qui rend immédiatement visibles les différences spatiales (éléments déplacés, images redimensionnées). +- Activez l'OCR pour comparer des documents numérisés sans couche de texte. Le moteur de comparaison extraira le texte des images de page. +- Utilisez les filtres par catégorie pour vous concentrer sur l'essentiel. Par exemple, masquez les changements de mise en forme si seules les différences de contenu textuel vous intéressent. + +## Outils associés + +- [Afficher les métadonnées](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Fusionner des PDF](./merge-pdf) diff --git a/docs/fr/tools/compress-pdf.md b/docs/fr/tools/compress-pdf.md new file mode 100644 index 00000000..3a172dd0 --- /dev/null +++ b/docs/fr/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Compresser un PDF +description: Réduisez la taille d'un PDF jusqu'à 90 % avec le moteur Hyper Compress. Prend en charge les tailles cibles, le traitement par lots et des réglages de qualité personnalisés. +--- + +# Compresser un PDF + +Réduisez le poids de vos fichiers PDF sans les abîmer. Compresser un PDF s'appuie sur [Hyper Compress](https://www.bentopdf.com/hyper-compress), le moteur de compression propre à BentoPDF. Il recompresse les images, crée des sous-ensembles de polices et les fusionne, et supprime le superflu comme les miniatures intégrées et les données privées d'applications. Le PDF reste pleinement fonctionnel : le texte reste sélectionnable, les liens et les champs de formulaire continuent de fonctionner. + +Hyper Compress est compilé en WebAssembly et livré avec BentoPDF, la compression fonctionne donc hors ligne et dans les déploiements isolés du réseau, sans configuration supplémentaire. + +## Fonctionnement + +1. Importez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. +2. Choisissez un **Niveau de compression** : Faible, Moyen, Élevé ou Sans perte. +3. Saisissez éventuellement une **Taille de fichier cible**, ou développez **Paramètres personnalisés** pour un contrôle précis, y compris **Convertir en niveaux de gris**. +4. Cliquez sur **Compresser un PDF**. Pour plusieurs fichiers, vous obtenez un seul téléchargement ZIP. + +## Documents particuliers + +- **Les PDF signés numériquement** sont renvoyés tels quels, car toute modification invaliderait la signature. Activez **Ignorer la protection du contenu** dans les paramètres personnalisés pour supprimer les signatures et les compresser ; la signature visible reste sur la page, mais le fichier n'est plus signé. +- **Les fichiers PDF/A** perdent leur étiquette PDF/A après la compression, afin que le fichier ne prétende jamais à une conformité qu'il ne respecte plus. Activez **Préserver le PDF/A** dans les paramètres personnalisés pour garder le fichier conforme. +- **Les PDF protégés par mot de passe** affichent un champ de mot de passe sur la carte de leur fichier. Saisissez-y le mot de passe et Hyper Compress ouvre lui-même le fichier, sans étape de déverrouillage séparée. Avec au moins deux fichiers verrouillés, un champ partagé déverrouille tous les fichiers qui utilisent le même mot de passe. La copie compressée n'a pas de mot de passe ; utilisez [Protéger un PDF](./protect-pdf) pour en ajouter un à nouveau. +- **Les scans sans couche de texte** peuvent être réduits davantage avec **Rastériser les pages** dans les paramètres personnalisés, qui remplace chaque page par une image optimisée. Cette option est ignorée pour tout document contenant du texte sélectionnable, y compris les scans traités par OCR, sauf si **Ignorer la protection du contenu** est activé. Les pages de texte deviennent alors aussi des images : le texte n'est plus sélectionnable et les liens ne fonctionnent plus. + +## Niveaux de compression + +| Niveau | Qualité d'image | Résolution max. | Idéal pour | +| -------------- | --------------- | --------------- | ------------------------------------------ | +| **Faible** | 80 | 200 DPI | Préserver la qualité visuelle | +| **Moyen** | 50 | 150 DPI | Documents courants | +| **Élevé** | 20 | 72 DPI | Pièces jointes d'e-mail, envois sur le web | +| **Sans perte** | Images intactes | Inchangée | Copies d'archivage | + +Le niveau Élevé retire aussi l'incorporation des 14 polices PDF standard, ainsi que des polices similaires comme Arial lorsque c'est sans risque. + +## Taille de fichier cible + +Saisissez une taille en Ko ou en Mo et Hyper Compress recherche la meilleure qualité d'image qui tienne encore dans cette taille, en partant du niveau choisi. Si le document ne peut pas devenir aussi petit, vous obtenez la plus petite version possible et un message vous l'indique. Les pages dédiées, comme [Compresser un PDF à 1 Mo](https://www.bentopdf.com/compress-pdf-to-1mb), s'ouvrent avec la cible déjà renseignée. + +## Paramètres personnalisés + +Développez le panneau Paramètres personnalisés pour régler directement Hyper Compress. Choisir un niveau de compression réinitialise ces paramètres aux valeurs de ce niveau, et en modifier un fait passer le niveau sur Personnalisé. + +- **Ignorer la protection du contenu** : par défaut, Hyper Compress laisse intacts les PDF signés et ne rastérise pas les pages contenant du texte. Activer cette option contourne les deux. Elle reste activée lorsque vous changez de niveau. + +- **Images** : qualité d'image, résolution maximale, rééchantillonnage forcé, réduction des couleurs, découpe des zones d'image invisibles, suppression des images alternatives, simplification des profils de couleur, JPEG 2000 et mode sans perte +- **Polices** : création de sous-ensembles, fusion des doublons et retrait de l'incorporation des polices standard et de leurs équivalents +- **Contenu** : aplatissement des annotations, des champs de formulaire ou des liens +- **Nettoyage** : suppression des miniatures, des données d'application, des fils d'articles, des informations de capture web, de l'arbre de structure ou des intentions de sortie +- **Rastérisation** : remplacement des pages par des images, pour les scans composés uniquement d'images ; ignorée lorsque le document contient du texte sélectionnable +- **Sortie** : Préserver le PDF/A, et compression Brotli pour les lecteurs PDF 2.0 qui la prennent en charge + +## Cas d'usage + +- Ramener un rapport de 50 Mo sous la limite de taille d'une pièce jointe d'e-mail +- Faire passer un scan sous la limite d'envoi stricte d'un portail grâce à une taille de fichier cible +- Optimiser des PDF marketing pour des téléchargements plus rapides sur un site web +- Archiver de gros ensembles de documents lorsque le coût de stockage compte +- Réduire la consommation de données mobiles lors du partage de PDF via des applications de messagerie + +## Conseils + +- Commencez par Moyen. Si le résultat est encore trop gros, définissez une taille de fichier cible ou passez à Élevé. +- Pour un scan sans couche de texte, activez Rastériser les pages dans les paramètres personnalisés. +- Convertir en niveaux de gris, dans les paramètres personnalisés, peut réduire la taille des documents très colorés. + +## Outils associés + +- [Optimiser pour le web](./linearize-pdf) : optimisez le PDF compressé pour un affichage web rapide +- [Rastériser le PDF](./rasterize-pdf) : convertissez les pages en images à un DPI précis, y compris les pages contenant du texte +- [Réparer un PDF](./repair-pdf) : réparez un PDF endommagé par une compression effectuée ailleurs +- [Supprimer les métadonnées](./remove-metadata) : supprimez les données cachées pour préserver la confidentialité diff --git a/docs/fr/tools/crop-pdf.md b/docs/fr/tools/crop-pdf.md new file mode 100644 index 00000000..a9eaf334 --- /dev/null +++ b/docs/fr/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Rogner un PDF +description: Rognez visuellement les pages d'un PDF en dessinant une zone de rognage sur chaque page avec un éditeur basé sur Cropper.js. +--- + +# Rogner un PDF + +Réduisez les marges de vos pages PDF grâce à une interface de rognage visuelle. Dessinez un rectangle de rognage directement sur chaque page, prévisualisez le résultat et appliquez le rognage. Vous pouvez définir des zones de rognage différentes selon les pages ou appliquer le même rognage à tout le document. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. L'éditeur de rognage s'ouvre et affiche la première page avec une superposition de rognage déplaçable. +3. Ajustez le rectangle de rognage en faisant glisser ses bords ou ses coins. +4. Utilisez les boutons de navigation pour passer d'une page à l'autre et définir la zone de rognage de chacune. +5. Cliquez sur **Rogner** pour appliquer le rognage et télécharger le résultat. + +## Fonctionnalités + +- Éditeur de rognage visuel basé sur Cropper.js, avec des poignées pour un réglage précis +- Navigation page par page pour définir des zones de rognage individuelles +- Mémorisation des réglages de rognage par page, pour définir des rognages différents selon les pages +- Aperçu en direct de la zone de rognage sélectionnée +- Prise en charge des PDF de toute taille de page ou orientation + +## Cas d'usage + +- Supprimer les larges marges de documents numérisés pour se concentrer sur la zone de contenu +- Retirer les traits de coupe ou les repères de calage des PDF de prépresse +- Rogner des diapositives de cours pour supprimer la zone des notes du présentateur +- Supprimer les en-têtes ou pieds de page de chaque page avant de partager un extrait de document +- Redimensionner des pages pour les adapter à un affichage ou une mise en page d'impression précis + +## Conseils + +- La superposition de rognage peut être librement redimensionnée et repositionnée. Faites glisser les coins pour un redimensionnement proportionnel ou les bords pour un ajustement sur un seul axe. +- Pour les documents dont chaque page nécessite le même rognage, définissez-le sur la première page : l'outil mémorise votre zone de rognage au fil de la navigation entre les pages. +- Si vous devez uniformiser la taille des pages plutôt que rogner visuellement, l'outil Uniformiser la taille des pages peut mieux convenir. + +## Outils associés + +- [Éditeur PDF](./edit-pdf) +- [Numéros de page](./page-numbers) +- [Supprimer les pages blanches](./remove-blank-pages) diff --git a/docs/fr/tools/csv-to-pdf.md b/docs/fr/tools/csv-to-pdf.md new file mode 100644 index 00000000..ff0f0d0c --- /dev/null +++ b/docs/fr/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV vers PDF +description: Convertissez des fichiers tableur CSV en tableaux PDF mis en forme, directement dans votre navigateur. +--- + +# CSV vers PDF + +Transformez des fichiers CSV en documents PDF propres et mis en forme. Chaque CSV est analysé et rendu sous forme de tableau dans le PDF obtenu. C'est utile lorsque vous devez imprimer ou partager des données tabulaires sans que le destinataire ait besoin d'un tableur. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :--------- | +| CSV | `.csv` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez un ou plusieurs fichiers CSV. +2. Vérifiez la liste des fichiers. Ajoutez-en d'autres ou retirez ceux dont vous ne voulez pas. +3. Cliquez sur **Convertir en PDF**. Un indicateur de progression affiche l'état de la conversion. +4. Un seul fichier est téléchargé directement sous forme de PDF. Plusieurs fichiers sont regroupés dans `csv-converted.zip`. + +## Options + +Cet outil n'a pas de configuration supplémentaire. Le CSV est automatiquement analysé et mis en forme sous forme de tableau. + +## Résultat + +| Nombre de fichiers | Résultat | +| :----------------- | :------------------------------------------------------------- | +| 1 fichier | Téléchargement d'un seul PDF (par ex. `data.pdf`) | +| 2 fichiers ou plus | Archive ZIP (`csv-converted.zip`) contenant un PDF par fichier | + +## Cas d'usage + +- Convertir des rapports de base de données exportés en tableaux PDF imprimables +- Partager des données financières ou des listes d'inventaire avec des personnes qui n'ont pas Excel +- Créer des versions PDF de fichiers journaux CSV pour la documentation de conformité +- Imprimer des listes d'adresses, des feuilles de notes ou toute donnée tabulaire stockée au format CSV + +## Conseils + +- Pour de meilleurs résultats, assurez-vous que votre CSV utilise des séparateurs virgule standard. L'outil suit les conventions courantes d'analyse des CSV. +- Si votre CSV comporte beaucoup de colonnes, le tableau peut être compressé pour tenir dans la largeur de la page. Pensez à diviser les jeux de données larges en plusieurs fichiers. +- Pour les fichiers Excel (`.xls`, `.xlsx`), utilisez l'outil [Excel vers PDF](./excel-to-pdf), qui préserve la mise en forme du tableur et les feuilles multiples. + +## Outils associés + +- [Excel vers PDF](./excel-to-pdf) +- [Texte vers PDF](./txt-to-pdf) +- [JSON vers PDF](./json-to-pdf) diff --git a/docs/fr/tools/delete-pages.md b/docs/fr/tools/delete-pages.md new file mode 100644 index 00000000..4648ec44 --- /dev/null +++ b/docs/fr/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Supprimer des pages +description: Supprimez des pages précises d'un PDF par numéro de page, plage ou sélection visuelle de miniatures. +--- + +# Supprimer des pages + +Retirez les pages indésirables d'un document PDF. Indiquez les pages à supprimer en saisissant des numéros ou des plages de pages, ou cliquez directement sur les miniatures pour les marquer en vue de la suppression. + +## Fonctionnement + +1. Importez un fichier PDF. L'outil affiche des miniatures de toutes les pages. +2. Saisissez les pages à supprimer dans le champ de texte avec la syntaxe de plages (par ex. `2, 5-8`), ou cliquez sur les miniatures pour les activer ou désactiver. +3. Les pages marquées sont mises en évidence pour que vous puissiez confirmer votre sélection. +4. Cliquez sur le bouton de traitement. Un nouveau PDF est créé sans les pages sélectionnées. + +## Fonctionnalités + +- Sélection des pages par texte avec la syntaxe de plages (`2, 5-8, 12`) +- Grille de miniatures pour une suppression par simple clic +- Surbrillance en temps réel des pages marquées pour la suppression +- Validation de la saisie par rapport au nombre réel de pages +- Conserve toutes les pages non supprimées dans leur ordre d'origine + +## Cas d'usage + +- Supprimer les pages blanches ou de remplissage d'un document numérisé +- Retirer les pages de couverture ou les annexes avant de partager un document +- Nettoyer les pages de brouillon laissées par erreur dans un PDF final +- Supprimer les pages contenant des informations sensibles avant diffusion + +## Conseils + +- Supprimer des pages n'affecte ni le contenu ni la mise en forme des pages restantes. Le résultat est une copie fidèle de l'original, moins les pages retirées. +- Si vous voulez conserver uniquement certaines pages plutôt que d'en retirer, [Extraire des pages](./extract-pages) convient mieux. +- L'affichage des miniatures se charge progressivement, ce qui garde les gros documents réactifs. + +## Outils associés + +- [Extraire des pages](./extract-pages) +- [Dupliquer et organiser](./organize-pdf) +- [Scinder un PDF](./split-pdf) diff --git a/docs/fr/tools/deskew-pdf.md b/docs/fr/tools/deskew-pdf.md new file mode 100644 index 00000000..e1a4f588 --- /dev/null +++ b/docs/fr/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Redresser un PDF +description: Redressez automatiquement les pages inclinées des PDF numérisés grâce à la détection d'inclinaison d'OpenCV. Seuil et DPI réglables. +--- + +# Redresser un PDF + +Les documents numérisés sont rarement parfaitement droits. Même une légère inclinaison réduit la précision de l'OCR et donne un aspect négligé à l'impression. Cet outil utilise les algorithmes de traitement d'image d'OpenCV pour détecter l'angle d'inclinaison de chaque page et la remettre d'aplomb. + +## Fonctionnement + +1. Importez un ou plusieurs PDF numérisés. +2. Définissez le **Seuil d'inclinaison** : les pages dont l'inclinaison détectée est inférieure à cette valeur ne sont pas modifiées. +3. Choisissez une **Qualité de traitement (DPI)** : un DPI plus élevé améliore la précision de la détection mais prend plus de temps. +4. Cliquez sur **Redresser un PDF**. +5. Après le traitement, un panneau de résultats affiche l'angle détecté pour chaque page et indique si elle a été corrigée. + +## Options + +| Paramètre | Valeurs | Par défaut | +| ----------------------- | ------------------------- | ---------- | +| **Seuil d'inclinaison** | 0,1, 0,5, 1,0, 2,0 degrés | 0,5 | +| **DPI de traitement** | 100, 150, 200, 300 | 150 | + +## Comment fonctionne la détection d'inclinaison + +L'outil rend chaque page sous forme d'image au DPI sélectionné, puis utilise OpenCV pour détecter les angles dominants des lignes du contenu. Si l'inclinaison détectée dépasse le seuil, la page est pivotée de l'angle inverse pour la redresser. Les pages en dessous du seuil sont transmises sans modification. + +## Cas d'usage + +- Nettoyer des contrats ou des documents juridiques numérisés par lots +- Préparer des reçus ou des factures numérisés pour un traitement OCR +- Redresser des pages issues d'un scanner à plat dont le placement du papier est irrégulier +- Améliorer la qualité visuelle de documents d'archives numérisés + +## Conseils + +- Abaissez le seuil à 0,1 degré si vous avez besoin d'un alignement parfait au pixel près pour l'OCR. +- 150 DPI est rapide et précis pour la plupart des documents. Utilisez 300 DPI pour du texte très petit ou des pages très détaillées. +- Le redressement fonctionne mieux sur les documents avec des lignes de texte horizontales nettes. Il peut avoir du mal avec les pages composées surtout d'images ou d'éléments de design en diagonale. + +## Outils associés + +- [Rastériser le PDF](./rasterize-pdf) : convertissez le résultat redressé en PDF à plat basé sur des images +- [Compresser un PDF](./compress-pdf) : réduisez la taille du fichier après le redressement +- [Réparer un PDF](./repair-pdf) : corrigez les problèmes de structure dans les PDF numérisés diff --git a/docs/fr/tools/digital-sign-pdf.md b/docs/fr/tools/digital-sign-pdf.md new file mode 100644 index 00000000..59cd6d78 --- /dev/null +++ b/docs/fr/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Signature numérique PDF +description: Ajoutez des signatures numériques cryptographiques aux PDF avec des certificats X.509. Prend en charge les formats PKCS#12 et PEM, avec options de signature visible. +--- + +# Signature numérique PDF + +Une signature numérique est la preuve cryptographique qu'une personne précise a signé un document et que ce dernier n'a pas été altéré depuis. Contrairement à une signature dessinée (qui n'est qu'une image), une signature numérique utilise des certificats X.509 et les standards PKCS#7 pour garantir une authenticité et une intégrité vérifiables. + +BentoPDF applique les signatures numériques entièrement dans votre navigateur. Votre clé privée ne quitte jamais votre appareil. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Importez votre fichier de certificat (.pfx, .p12 ou .pem). +3. Saisissez le mot de passe du certificat pour le déverrouiller. L'outil affiche le sujet du certificat, l'émetteur et la période de validité. +4. Configurez éventuellement les métadonnées de la signature (motif, lieu, coordonnées). +5. Activez éventuellement une **signature visible** avec personnalisation de la position, de la taille, de l'image et du texte. +6. Cliquez sur **Signer le PDF**. + +## Formats de certificat pris en charge + +| Format | Extensions | Description | +| ----------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Bundle standard du secteur contenant la clé privée et la chaîne de certificats. Format le plus courant. | +| **PEM** | .pem | Format texte. Doit contenir à la fois le certificat et la clé privée dans un seul fichier. Prend en charge les clés privées chiffrées. | + +## Options de signature visible + +Lorsqu'elle est activée, un bloc de signature visible est rendu sur la page du PDF : + +- **Position** : coordonnées X/Y et largeur/hauteur en points +- **Page** : première page, dernière page, toutes les pages ou un numéro de page précis +- **Image** : importez une image PNG, JPG ou WebP (votre signature manuscrite, le sceau de votre entreprise, etc.) +- **Texte** : texte personnalisé avec couleur et taille de police configurables. Si aucune image ni aucun texte n'est fourni, l'outil génère automatiquement un texte à partir du nom commun du certificat et de la date du jour. + +## Métadonnées de la signature + +- **Motif** : pourquoi le document a été signé (par ex. « Approuvé », « Relu ») +- **Lieu** : où la signature a eu lieu (par ex. « Paris ») +- **Coordonnées** : comment joindre le signataire (par ex. une adresse e-mail) + +## Remarque sur la connexion Internet + +La signature peut nécessiter une connexion Internet. La bibliothèque de signature récupère la chaîne de certificats à partir des URL intégrées dans l'extension Authority Information Access (AIA) de votre certificat. Si ces serveurs sont inaccessibles, la signature échouera pour les certificats qui exigent une validation de la chaîne. + +## Cas d'usage + +- Signer des contrats, des propositions et des accords avec des signatures numériques juridiquement contraignantes +- Certifier des documents officiels dans des flux de travail qui exigent une authentification basée sur une PKI +- Signer des factures PDF pour la conformité réglementaire (de nombreux pays de l'UE exigent des factures électroniques signées numériquement) +- Ajouter une approbation organisationnelle à des plans d'ingénierie ou à des documents qualité + +## Conseils + +- Les certificats auto-signés conviennent pour des tests, mais afficheront des avertissements dans Adobe Reader. Utilisez un certificat d'une autorité de certification de confiance pour les documents en production. +- La signature visible est purement visuelle. La signature cryptographique est intégrée que le bloc visible soit activé ou non. +- Vérifiez votre PDF signé avec l'outil Valider la signature PDF pour confirmer que la signature est intacte. + +## Outils associés + +- [Valider la signature PDF](./validate-signature-pdf) : vérifiez les signatures numériques des PDF signés +- [Aplatir le PDF](./flatten-pdf) : aplatissez les formulaires avant de signer pour empêcher les modifications +- [Protéger un PDF](./protect-pdf) : ajoutez une protection par mot de passe en plus de la signature numérique +- [Supprimer les métadonnées](./remove-metadata) : supprimez les métadonnées avant de signer diff --git a/docs/fr/tools/divide-pages.md b/docs/fr/tools/divide-pages.md new file mode 100644 index 00000000..ebac7b93 --- /dev/null +++ b/docs/fr/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Diviser les pages +description: Divisez les pages d'un PDF horizontalement ou verticalement en pages plus petites. +--- + +# Diviser les pages + +Coupez chaque page d'un PDF en deux moitiés, horizontalement ou verticalement. C'est utile lorsqu'une même page contient du contenu qui devrait être réparti sur des pages distinctes, par exemple une mise en page à deux colonnes numérisée comme une seule page large. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Choisissez la direction de la division : **Verticale** (moitiés gauche/droite) ou **Horizontale** (moitiés haut/bas). +3. Indiquez éventuellement une plage de pages pour limiter les pages à diviser. Laissez vide pour diviser toutes les pages. +4. Cliquez sur le bouton de traitement pour générer le PDF divisé. + +## Fonctionnalités + +- Division verticale : coupe chaque page en moitiés gauche et droite +- Division horizontale : coupe chaque page en moitiés haut et bas +- Filtre par plage de pages pour diviser uniquement certaines pages +- Les pages non ciblées passent sans modification +- Préserve la qualité du contenu sans nouveau rendu + +## Cas d'usage + +- Séparer des pages numérisées en deux par feuille (par ex. un scan de livre avec la page gauche et la page droite sur une même feuille) +- Diviser un PDF en paysage au contenu côte à côte en pages portrait individuelles +- Découper de grandes infographies ou affiches en sections haute et basse distinctes +- Préparer des documents grand format pour une impression sur papier standard + +## Conseils + +- Si le contenu de vos pages est réparti de façon inégale, la division se fait quand même exactement au milieu. Pour des divisions asymétriques, utilisez plutôt [Rogner un PDF](./crop-pdf). +- Combinez cet outil avec [Faire pivoter un PDF](./rotate-pdf) si vos pages doivent être pivotées avant ou après la division. + +## Outils associés + +- [Scinder un PDF](./split-pdf) +- [Rogner un PDF](./crop-pdf) +- [PDF N-up](./n-up-pdf) +- [Posteriser un PDF](./posterize-pdf) diff --git a/docs/fr/tools/duplex-collate.md b/docs/fr/tools/duplex-collate.md new file mode 100644 index 00000000..ef07693e --- /dev/null +++ b/docs/fr/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Assembler un scan recto/verso +description: Réordonnez les PDF de scans recto/verso dont les pages de recto et de verso sont dans des blocs séparés pour obtenir le bon ordre recto/verso. +--- + +# Assembler un scan recto/verso + +Assembler un scan recto/verso est conçu pour les flux de numérisation avec chargeur automatique de documents (ADF) où un PDF contient deux blocs de pages : + +- tous les rectos d'abord +- tous les versos ensuite + +Au lieu de scinder et de réassembler manuellement, cet outil entrelace les deux blocs dans l'ordre de lecture naturel : recto1, verso1, recto2, verso2, et ainsi de suite. + +## Fonctionnement + +1. Importez un seul PDF créé par une numérisation recto/verso d'une pile. +2. Définissez le point de séparation où le bloc des rectos se termine. +3. Choisissez le traitement du bloc des versos : + - **Inverser le bloc des versos** (fréquent lorsque la pile est retournée avant de numériser les versos) + - **Conserver le bloc des versos tel quel** +4. Cliquez sur **Assembler le PDF** pour télécharger le résultat réordonné. + +## Options + +- **Détection automatique de la séparation (moitié)** : place le point de séparation à `ceil(totalPages / 2)`. +- **Avertissement de page impaire** : avertit lorsque le nombre total de pages est impair (souvent un décalage de numérisation). +- **Confirmation de blocs inégaux** : demande une confirmation lorsque les blocs de rectos et de versos n'ont pas la même taille. +- **Export groupé** : scinde le résultat assemblé en PDF distincts selon le nombre de pages du document d'origine et le télécharge au format ZIP. + +## Comportement de sortie + +- **Par défaut** : un seul PDF en sortie (un PDF en entrée, un PDF en sortie). +- **Mode groupé** : la sortie est découpée selon votre valeur de pages par document ; si plusieurs morceaux sont produits, ils sont téléchargés dans un seul ZIP, sinon un seul PDF est téléchargé. + +Si les blocs sont de taille inégale, les pages appariées sont assemblées en premier, puis les pages restantes sans paire sont ajoutées à la fin. + +## Cas d'usage courants + +- Rétablir l'ordre après avoir numérisé une pile de formulaires recto verso en deux passes. +- Reconstituer des liasses recto/verso à partir de scanners de bureau qui produisent tous les rectos puis tous les versos. +- Post-traiter des numérisations d'archives avant de les scinder en fichiers par document. + +## Conseils + +- La plupart des lots recto/verso devraient avoir un nombre total de pages pair. +- Si les versos semblent inversés dans le résultat, basculez entre **Inverser le bloc des versos** et **Conserver le bloc des versos tel quel**. +- Pour des originaux de 2 pages (recto + verso), utilisez l'export groupé avec `2` pages par document. + +## Outils associés + +- [Alterner et mélanger les pages](./alternate-merge) +- [Scinder un PDF](./split-pdf) +- [Fusionner des PDF](./merge-pdf) +- [Dupliquer et organiser](./organize-pdf) diff --git a/docs/fr/tools/edit-attachments.md b/docs/fr/tools/edit-attachments.md new file mode 100644 index 00000000..58e0365d --- /dev/null +++ b/docs/fr/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Gérer les pièces jointes +description: Affichez et supprimez sélectivement les fichiers joints intégrés dans un document PDF. +--- + +# Gérer les pièces jointes + +Inspectez et gérez les fichiers joints d'un PDF. L'outil liste chaque fichier intégré avec son nom et son niveau de rattachement, puis vous permet de marquer des pièces jointes individuelles pour les supprimer ou de toutes les retirer d'un coup. + +## Fonctionnement + +1. Importez un fichier PDF. +2. L'outil recherche automatiquement les pièces jointes et les affiche dans une liste. +3. Chaque pièce jointe affiche son nom de fichier et indique s'il s'agit d'une pièce jointe au niveau du document ou de la page. +4. Cliquez sur l'icône de corbeille à côté d'une pièce jointe pour la marquer en vue de sa suppression (cliquez à nouveau pour annuler). +5. Utilisez le bouton **Supprimer toutes les pièces jointes** pour tout sélectionner d'un coup, ou **Tout désélectionner** pour effacer votre sélection. +6. Cliquez sur le bouton de traitement pour enregistrer un nouveau PDF sans les pièces jointes sélectionnées. + +## Fonctionnalités + +- Liste toutes les pièces jointes au niveau du document et de la page +- Suppression individuelle ou groupée des pièces jointes +- Sélection activable et désactivable avant de valider les modifications +- Texte barré et opacité réduite pour les éléments marqués en vue de leur suppression +- Télécharge le PDF modifié sans les pièces jointes sélectionnées + +## Cas d'usage + +- Supprimer des fichiers obsolètes ou incorrects intégrés dans un document avant sa redistribution +- Retirer des pièces jointes sensibles (données financières, informations personnelles) d'un PDF avant de le partager +- Réduire la taille d'un PDF en supprimant de gros fichiers intégrés devenus inutiles +- Auditer le contenu intégré et nettoyer un document avant de l'archiver + +## Conseils + +- Les pièces jointes marquées en vue de leur suppression sont affichées barrées. Vous pouvez annuler le marquage avant le traitement si vous changez d'avis. +- Si aucune pièce jointe n'est trouvée, l'outil affiche un message clair « Aucune pièce jointe trouvée » : le PDF ne contient simplement pas de fichiers intégrés. + +## Outils associés + +- [Ajouter des pièces jointes](./add-attachments) +- [Extraire les pièces jointes](./extract-attachments) +- [Afficher les métadonnées](./view-metadata) diff --git a/docs/fr/tools/edit-metadata.md b/docs/fr/tools/edit-metadata.md new file mode 100644 index 00000000..4c65c3ae --- /dev/null +++ b/docs/fr/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Modifier les métadonnées +description: Affichez et modifiez les champs de métadonnées d'un PDF, notamment le titre, l'auteur, les mots-clés, les dates et les propriétés personnalisées. +--- + +# Modifier les métadonnées + +Modifiez les métadonnées intégrées à un fichier PDF. L'outil pré-remplit un formulaire avec les métadonnées existantes du document, vous laisse modifier n'importe quel champ et enregistre les changements dans un nouveau PDF. + +## Fonctionnement + +1. Importez un fichier PDF. L'outil lit ses métadonnées actuelles et remplit le formulaire. +2. Modifiez n'importe quel champ standard : Titre, Auteur, Sujet, Mots-clés, Créateur, Producteur. +3. Ajustez la date de création et la date de modification avec les sélecteurs de date et d'heure. +4. Ajoutez des champs de métadonnées personnalisés en cliquant sur le bouton d'ajout et en saisissant une paire clé-valeur. +5. Cliquez sur le bouton de traitement pour enregistrer le PDF modifié. + +## Fonctionnalités + +- Pré-remplit toutes les métadonnées existantes du PDF importé +- Champs standard : Titre, Auteur, Sujet, Mots-clés, Créateur, Producteur +- Sélecteurs de date et d'heure pour la date de création et la date de modification +- Champs de métadonnées personnalisés clé-valeur pour des propriétés arbitraires +- Enregistre les changements directement dans le dictionnaire d'informations du document PDF + +## Champs modifiables + +| Champ | Description | +| ------------------------ | ------------------------------------------------------------------ | +| **Titre** | Le titre du document affiché dans les lecteurs PDF | +| **Auteur** | La personne ou l'organisation qui a créé le document | +| **Sujet** | Une brève description du thème du document | +| **Mots-clés** | Termes séparés par des virgules pour la recherche et le classement | +| **Créateur** | L'application qui a créé le contenu à l'origine | +| **Producteur** | L'application qui a généré le PDF | +| **Date de création** | Quand le document a été créé à l'origine | +| **Date de modification** | Quand le document a été modifié pour la dernière fois | +| **Champs personnalisés** | Toutes les paires clé-valeur supplémentaires que vous définissez | + +## Cas d'usage + +- Définir un titre et un auteur appropriés avant de publier un document +- Ajouter des mots-clés pour améliorer la recherche dans les systèmes de gestion documentaire +- Mettre à jour la date de modification pour refléter la révision en cours +- Ajouter des champs de métadonnées personnalisés comme Service, ID de projet ou Classification +- Nettoyer les métadonnées laissées par le logiciel de création d'origine + +## Conseils + +- Les champs personnalisés sont écrits directement dans le dictionnaire d'informations du PDF. Certains lecteurs PDF peuvent ne pas les afficher, mais ils sont conservés dans le fichier. +- Laissez un champ vide pour l'effacer des métadonnées. Le bouton de traitement enregistre tout ce qui se trouve dans le formulaire. +- Pour consulter les métadonnées sans les modifier, utilisez [Afficher les métadonnées](./view-metadata). Pour supprimer entièrement toutes les métadonnées, utilisez Supprimer les métadonnées. + +## Outils associés + +- [Afficher les métadonnées](./view-metadata) +- [Calques PDF (OCG)](./pdf-layers) +- [Compresser un PDF](./compress-pdf) diff --git a/docs/fr/tools/edit-pdf.md b/docs/fr/tools/edit-pdf.md new file mode 100644 index 00000000..a15ad005 --- /dev/null +++ b/docs/fr/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Éditeur PDF +description: Annotez, surlignez, caviardez, ajoutez des formes et des images, recherchez et affichez des PDF directement dans votre navigateur. +--- + +# Éditeur PDF + +L'éditeur PDF de BentoPDF vous permet d'annoter, surligner, caviarder, commenter, ajouter des formes et des images, et de faire des recherches dans vos PDF. Il charge un éditeur complet directement dans votre navigateur, sans aucun envoi vers un serveur. + +## Fonctionnement + +1. Importez votre PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. L'éditeur PDF intégré s'ouvre automatiquement avec votre document chargé. +3. Utilisez la barre d'outils pour annoter, surligner, caviarder, ajouter du texte, dessiner des formes ou insérer des images. +4. Cliquez sur **Télécharger le PDF modifié** pour enregistrer vos modifications. + +## Fonctionnalités + +- Barre d'outils d'annotation complète avec surlignage, soulignement, texte barré et dessin à main levée +- Insertion de texte et commentaires +- Outils de caviardage qui suppriment définitivement le contenu marqué une fois le caviardage appliqué. Si des marques n'ont pas été appliquées lorsque vous cliquez sur **Télécharger le PDF modifié**, l'éditeur propose de les appliquer d'abord. +- Outils de formes pour rectangles, cercles, lignes et flèches +- Insertion d'images sur les pages du PDF +- Recherche de texte intégrée dans tout le document +- Prise en charge de plusieurs documents avec des onglets (jusqu'à 10 documents ouverts simultanément) +- Chargement de fichiers par glisser-déposer + +## Cas d'usage + +- Relire des contrats et marquer les modifications avec des surlignages et des commentaires +- Caviarder des informations confidentielles comme des numéros de sécurité sociale ou des données financières avant de partager un document +- Ajouter des annotations à des plans d'architecture ou à des dessins techniques +- Insérer des logos ou des tampons d'entreprise sur les pages d'un document +- Rechercher des termes précis dans de longs documents juridiques + +## Conseils + +- Vous pouvez ouvrir plusieurs PDF à la fois et passer de l'un à l'autre avec la barre d'onglets en haut de l'éditeur. +- L'éditeur préserve la structure d'origine du PDF : les polices, les mises en page et les champs de formulaire restent intacts. +- Marquer du texte ou une zone pour le caviardage ne supprime rien tant que le caviardage n'est pas appliqué. Lorsque vous caviardez du texte sélectionné, ses copies dans les propriétés du fichier, les signets, les commentaires et les pièces jointes sont également supprimées du téléchargement, sauf si le fichier est chiffré. +- Pour ajouter un filigrane ou numéroter les pages en masse, utilisez plutôt les outils dédiés, qui offrent plus de contrôle sur la mise en forme. + +## Outils associés + +- [Ajouter un filigrane](./add-watermark) +- [Signer un PDF](./sign-pdf) +- [Ajouter des tampons](./add-stamps) +- [Supprimer les annotations](./remove-annotations) diff --git a/docs/fr/tools/email-to-pdf.md b/docs/fr/tools/email-to-pdf.md new file mode 100644 index 00000000..05f2c889 --- /dev/null +++ b/docs/fr/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email vers PDF +description: Convertissez des fichiers e-mail EML et MSG en PDF dans votre navigateur. Conserve les en-têtes, le corps et la liste des pièces jointes. +--- + +# Email vers PDF + +Convertissez des e-mails enregistrés en PDF propres et imprimables. L'outil analyse les fichiers EML et MSG, extrait le message complet (en-têtes, contenu du corps et métadonnées des pièces jointes) et restitue le tout dans un PDF structuré. Utile pour la découverte juridique, la conservation de documents, ou simplement pour imprimer un e-mail important. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----- | :-------- | :------------------------------------------------------------------------------- | +| EML | `.eml` | Format d'e-mail MIME standard (exporté par la plupart des clients de messagerie) | +| MSG | `.msg` | Format propriétaire de Microsoft Outlook | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers EML ou MSG. Vous pouvez mélanger les deux formats dans un même lot. +2. Vérifiez la liste des fichiers. Retirez les entrées indésirables avec l'icône de corbeille, ou cliquez sur **Ajouter d'autres fichiers** pour inclure d'autres e-mails. +3. Configurez les options de conversion (voir ci-dessous). +4. Cliquez sur **Convertir en PDF**. L'outil analyse chaque e-mail, restitue le contenu en HTML mis en forme et le convertit en PDF avec le moteur PyMuPDF. +5. Un seul e-mail est téléchargé directement en PDF. Plusieurs e-mails sont regroupés dans `emails-converted.zip`. + +## Options + +| Option | Par défaut | Description | +| :-------------------------------------- | :--------- | :------------------------------------------------------------------------------------------------------------------------------------ | +| **Taille de page** | A4 | Choisissez entre les dimensions A4, Letter ou Legal. | +| **Inclure Cc et Cci** | Activé | Lorsque cette option est activée, les listes de destinataires en Cc et Cci apparaissent dans la section d'en-tête de l'e-mail du PDF. | +| **Inclure la liste des pièces jointes** | Activé | Lorsque cette option est activée, une liste des pièces jointes de l'e-mail (avec noms de fichiers et tailles) apparaît dans le PDF. | + +## Cas d'usage + +- Archiver des échanges professionnels importants en PDF pour la conformité ou l'audit +- Imprimer des fils de discussion par e-mail pour des procédures judiciaires ou des demandes de communication de pièces +- Créer une trace permanente de confirmations de commande, de reçus ou de contrats reçus par e-mail +- Sauvegarder des fichiers Outlook MSG dans un format qui ne nécessite pas Outlook pour être lu +- Documenter des échanges avec le support client à partir de fichiers EML exportés + +## Conseils + +- Les fichiers EML (utilisés par Thunderbird, Apple Mail et la plupart des clients de messagerie) et les fichiers Outlook MSG sont tous deux pris en charge. Exportez les e-mails depuis votre client de messagerie et déposez-les directement dans l'outil. +- Les e-mails au format HTML conservent leur mise en forme dans le PDF. Les e-mails en texte brut sont restitués avec une mise en forme propre et lisible. +- La liste des pièces jointes affiche les noms de fichiers et les tailles, mais n'intègre pas les fichiers joints eux-mêmes dans le PDF. + +## Outils associés + +- [XML vers PDF](./xml-to-pdf) +- [XPS vers PDF](./xps-to-pdf) diff --git a/docs/fr/tools/epub-to-pdf.md b/docs/fr/tools/epub-to-pdf.md new file mode 100644 index 00000000..fc9b82e7 --- /dev/null +++ b/docs/fr/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB vers PDF +description: Convertissez des livres numériques EPUB en PDF dans votre navigateur. Gratuit, sans envoi de fichiers, conversion axée sur la confidentialité. +--- + +# EPUB vers PDF + +Convertissez des livres numériques EPUB en fichiers PDF sans quitter votre navigateur. EPUB est le standard ouvert des livres numériques, mais il arrive qu'il vous faille un PDF à mise en page fixe pour l'impression, l'annotation ou le partage avec des personnes qui n'ont pas de liseuse. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----- | :-------- | :------------------------ | +| EPUB | `.epub` | Fichiers EPUB 2 et EPUB 3 | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers EPUB. La sélection multiple est prise en charge. +2. Vérifiez les fichiers importés. Retirez les entrées indésirables avec l'icône de corbeille, ou cliquez sur **Ajouter d'autres fichiers** pour agrandir le lot. +3. Cliquez sur **Convertir en PDF**. Le moteur PyMuPDF restitue le contenu de l'EPUB (texte, images et mise en forme) dans un PDF paginé. +4. Un seul EPUB est téléchargé directement en PDF. Plusieurs fichiers sont regroupés dans une archive ZIP nommée `epub-converted.zip`. + +## Options + +La conversion s'exécute avec des valeurs par défaut adaptées et sans configuration obligatoire. Le texte se réorganise dans des dimensions de page standard, et les polices et images intégrées sont conservées dans le PDF. + +## Cas d'usage + +- Imprimer un livre numérique sans DRM pour le lire loin des écrans +- Soumettre un manuscrit EPUB sous forme de PDF à mise en page fixe pour relecture +- Archiver des livres numériques dans un format que tous les systèmes d'exploitation peuvent ouvrir nativement +- Partager un chapitre avec un collègue qui n'a pas de lecteur EPUB +- Convertir une documentation technique distribuée en EPUB en PDF annotables + +## Conseils + +- Les fonctionnalités d'EPUB 3 comme l'audio et la vidéo intégrés ne sont pas conservées dans le PDF, mais tout le texte, les images et les tableaux se convertissent correctement. +- Pour de meilleurs résultats avec des EPUB très stylisés, vérifiez les premières pages du résultat pour confirmer la fidélité de la mise en page. + +## Outils associés + +- [MOBI vers PDF](./mobi-to-pdf) +- [FB2 vers PDF](./fb2-to-pdf) +- [CBZ vers PDF](./cbz-to-pdf) diff --git a/docs/fr/tools/excel-to-pdf.md b/docs/fr/tools/excel-to-pdf.md new file mode 100644 index 00000000..bc9721bb --- /dev/null +++ b/docs/fr/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel vers PDF +description: Convertissez des feuilles de calcul Excel (XLS, XLSX), ODS et CSV en PDF en conservant la mise en forme. +--- + +# Excel vers PDF + +Convertissez des fichiers de tableur en PDF. L'outil prend en charge les fichiers Excel modernes, l'ancien format XLS, les feuilles de calcul OpenDocument et même le CSV, le tout rendu par un moteur LibreOffice exécuté dans le navigateur, qui préserve la mise en forme des cellules, les formules (sous forme de valeurs calculées), les graphiques et les mises en page multi-feuilles. + +## Formats pris en charge + +| Format | Extensions | +| :----------------------- | :--------- | +| Excel (moderne) | `.xlsx` | +| Excel (ancien) | `.xls` | +| OpenDocument Spreadsheet | `.ods` | +| CSV | `.csv` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers de tableur. +2. Vérifiez la liste des fichiers. Ajoutez-en d'autres ou retirez ceux dont vous ne voulez pas. +3. Cliquez sur **Convertir en PDF**. Le moteur LibreOffice s'initialise à la première utilisation, puis traite chaque fichier. +4. Un seul fichier est téléchargé directement en PDF. Plusieurs fichiers sont livrés sous la forme `excel-converted.zip`. + +## Options + +Cet outil n'a pas de configuration supplémentaire. Le moteur LibreOffice détermine la mise en page, la mise à l'échelle et la zone d'impression d'après les paramètres intégrés du tableur. + +## Résultat + +| Nombre de fichiers | Résultat | +| :----------------- | :------------------------------------------------------------------------------ | +| 1 fichier | Téléchargement d'un seul PDF (nom de fichier d'origine avec l'extension `.pdf`) | +| 2 fichiers ou plus | Archive ZIP (`excel-converted.zip`) contenant un PDF par fichier | + +## Cas d'usage + +- Convertir des rapports financiers ou des budgets Excel en PDF pour la diffusion +- Créer des PDF prêts à imprimer à partir de tableurs d'inventaire ou de catalogues de produits +- Partager des résultats d'analyse de données avec des parties prenantes qui n'ont pas Excel installé +- Archiver des rapports trimestriels dans un format non modifiable +- Convertir en PDF des fichiers ODS de LibreOffice Calc + +## Conseils + +- Les graphiques intégrés au tableur sont rendus dans le PDF. Vérifiez qu'ils s'affichent correctement dans le fichier source avant de convertir. +- Si votre tableur comporte plusieurs feuilles, toutes les feuilles sont incluses dans le PDF obtenu. +- Pour des données CSV simples sans mise en forme, l'outil [CSV vers PDF](./csv-to-pdf) offre une conversion plus légère. Utilisez Excel vers PDF lorsque vous devez conserver la mise en forme, les graphiques ou plusieurs feuilles. + +## Outils associés + +- [CSV vers PDF](./csv-to-pdf) +- [Word vers PDF](./word-to-pdf) +- [PowerPoint vers PDF](./powerpoint-to-pdf) diff --git a/docs/fr/tools/extract-attachments.md b/docs/fr/tools/extract-attachments.md new file mode 100644 index 00000000..9eb66ef1 --- /dev/null +++ b/docs/fr/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Extraire les pièces jointes +description: Extrayez tous les fichiers joints intégrés d'un ou plusieurs PDF et téléchargez-les dans une archive ZIP. +--- + +# Extraire les pièces jointes + +Récupérez chaque pièce jointe intégrée d'un ou plusieurs fichiers PDF. Tous les fichiers extraits sont regroupés dans une seule archive ZIP à télécharger. + +## Fonctionnement + +1. Importez un ou plusieurs fichiers PDF contenant des pièces jointes intégrées. +2. Cliquez sur **Extraire les pièces jointes**. +3. L'outil analyse chaque PDF à la recherche de pièces jointes au niveau du document et de la page. +4. Tous les fichiers trouvés sont regroupés dans une archive ZIP et téléchargés automatiquement. +5. Un message d'état confirme le nombre de pièces jointes trouvées et leur taille totale. + +## Fonctionnalités + +- Extraction par lots depuis plusieurs PDF à la fois +- Extrait les pièces jointes au niveau du document comme de la page +- Produit un seul fichier ZIP contenant tous les fichiers extraits +- Affiche le nombre total de pièces jointes et la taille cumulée des fichiers +- Messages d'état clairs si aucune pièce jointe n'est trouvée + +## Cas d'usage + +- Récupérer des fichiers de données intégrés dans un PDF de rapport +- Extraire des ressources d'images d'un portfolio ou d'un document de spécifications +- Extraire des documents complémentaires de PDF de formation ou de conformité +- Auditer les fichiers intégrés dans un lot de PDF + +## Conseils + +- Si l'outil ne signale aucune pièce jointe, le PDF peut contenir des images intégrées ou des données de formulaire à la place : ce ne sont pas des fichiers joints. Utilisez [Extraire les images](./extract-images) pour les images intégrées. +- Lors du traitement de plusieurs PDF, toutes les pièces jointes de chaque fichier se retrouvent dans un seul ZIP. Les noms de fichiers d'origine sont conservés. + +## Outils associés + +- [Ajouter des pièces jointes](./add-attachments) +- [Gérer les pièces jointes](./edit-attachments) +- [Extraire les images](./extract-images) diff --git a/docs/fr/tools/extract-images.md b/docs/fr/tools/extract-images.md new file mode 100644 index 00000000..1f25afbc --- /dev/null +++ b/docs/fr/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Extraire les images +description: Extrayez toutes les images intégrées de fichiers PDF. Prévisualisez-les dans une grille et téléchargez-les individuellement ou dans une archive ZIP. +--- + +# Extraire les images + +Récupère chaque image intégrée d'un ou plusieurs fichiers PDF. Les images extraites s'affichent dans une grille d'aperçu où vous pouvez les télécharger individuellement, ou toutes d'un coup dans un ZIP. Propulsé par PyMuPDF. + +## Fonctionnement + +1. Importez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. Ajoutez d'autres fichiers ou retirez-en au besoin. +2. Cliquez sur **Extraire** pour lancer le traitement. +3. L'outil analyse chaque page de chaque PDF importé, puis trouve et extrait les images intégrées. +4. Les images extraites apparaissent dans une grille de miniatures. Chaque image dispose d'un bouton de téléchargement. +5. Cliquez sur **Tout télécharger** pour tout enregistrer dans une archive ZIP. + +## Options + +Cet outil n'a aucune option configurable. Toutes les images intégrées sont extraites dans leur format d'origine (généralement PNG, JPEG, ou le format utilisé lors de l'intégration de l'image dans le PDF). + +## Format de sortie + +- Les images s'affichent dans une grille d'aperçu sous les noms `image_1.png`, `image_2.jpg`, etc. +- **Tout télécharger** produit `extracted-images.zip` contenant toutes les images. +- Les images peuvent être téléchargées une par une depuis la grille. + +## Cas d'usage + +- Récupérer des photos ou des graphiques d'un PDF pour les réutiliser dans un autre projet. +- Extraire des images de produits d'un PDF de catalogue pour une fiche e-commerce. +- Récupérer des schémas de documentation technique pour des présentations. +- Auditer les images intégrées à un document avant de le partager. + +## Conseils + +- L'outil extrait les images exactement telles qu'elles sont stockées dans le PDF. Il ne rend pas les pages sous forme d'images : pour cela, utilisez [PDF vers PNG](./pdf-to-png) ou [PDF vers JPG](./pdf-to-jpg). +- Si l'outil indique « Aucune image trouvée », le PDF utilise peut-être des graphiques vectoriels plutôt que des images matricielles intégrées, ou il s'agit d'un document numérisé dont chaque page est une seule grande image. +- Le traitement par lots fonctionne sur plusieurs PDF. Toutes les images de tous les fichiers sont réunies dans une seule grille et un seul ZIP. + +## Outils associés + +- [PDF vers PNG](./pdf-to-png) +- [PDF vers JPG](./pdf-to-jpg) +- [Constructeur de workflow PDF](./pdf-workflow) diff --git a/docs/fr/tools/extract-pages.md b/docs/fr/tools/extract-pages.md new file mode 100644 index 00000000..f04c567f --- /dev/null +++ b/docs/fr/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Extraire des pages +description: Enregistrez une plage précise de pages d'un PDF dans un nouveau document. +--- + +# Extraire des pages + +Récupérez un ensemble de pages d'un PDF et enregistrez-les dans un nouveau fichier. Indiquez exactement les pages souhaitées avec la syntaxe de plages, et l'outil crée un PDF propre contenant uniquement ces pages. + +## Fonctionnement + +1. Importez un fichier PDF. L'outil affiche le nom du fichier, sa taille et son nombre total de pages. +2. Saisissez les pages à extraire avec la syntaxe de plages (par ex. `1-5`, `3, 7, 10-12`). +3. Choisissez éventuellement de télécharger chaque plage sous forme de PDF distinct dans une archive ZIP. +4. Cliquez sur le bouton de traitement. Les pages extraites sont téléchargées sous forme d'un nouveau PDF (ou d'un ZIP). + +## Fonctionnalités + +- Syntaxe de plages flexible : pages individuelles, plages ou combinaisons séparées par des virgules +- Affiche le nombre total de pages après l'import pour s'y référer facilement +- Option de sortie en un seul PDF combiné ou en fichiers distincts dans un ZIP +- Préserve le contenu et la mise en forme d'origine des pages + +## Cas d'usage + +- Extraire le résumé exécutif (les premières pages) d'un long rapport +- Extraire un seul chapitre d'un manuel au format PDF +- Enregistrer des pages précises d'un dossier de formulaires sous forme de documents autonomes +- Créer un document d'exemple à partir de pages sélectionnées d'un fichier plus volumineux + +## Conseils + +- Les numéros de page commencent à 1. Utilisez `1` pour la première page, pas `0`. +- Pour supprimer des pages plutôt que les extraire, utilisez [Supprimer des pages](./delete-pages) : c'est l'opération inverse. +- Si vous avez besoin d'une sélection visuelle des pages avec des miniatures, utilisez [Scinder un PDF](./split-pdf) en mode Sélection visuelle. + +## Outils associés + +- [Scinder un PDF](./split-pdf) +- [Supprimer des pages](./delete-pages) +- [Fusionner des PDF](./merge-pdf) diff --git a/docs/fr/tools/extract-tables.md b/docs/fr/tools/extract-tables.md new file mode 100644 index 00000000..8e504a65 --- /dev/null +++ b/docs/fr/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Extraire les tableaux PDF +description: Détectez et extrayez les tableaux de documents PDF. Exportez en CSV, JSON ou Markdown, tableau par tableau. +--- + +# Extraire les tableaux PDF + +Détecte tous les tableaux d'un PDF et vous permet de les exporter au format de votre choix : CSV, JSON ou Markdown. Chaque tableau est extrait individuellement avec ses métadonnées de page et de position. Propulsé par le moteur de détection de tableaux de PyMuPDF. + +## Fonctionnement + +1. Importez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Sélectionnez votre **format d'export** préféré : CSV, JSON ou Markdown. +3. Cliquez sur **Extraire** pour lancer le traitement. +4. Si un seul tableau est trouvé, il est téléchargé sous forme d'un seul fichier. Plusieurs tableaux produisent une archive ZIP avec un fichier par tableau. + +## Options + +- **Format d'export** : choisissez entre : + - **CSV** : valeurs séparées par des virgules, avec des guillemets appropriés pour les champs contenant des virgules, des guillemets ou des sauts de ligne. Convient aux tableurs et aux bases de données. + - **JSON** : structure de tableaux de tableaux, mise en forme avec une indentation de 2 espaces. Convient à une exploitation par programme. + - **Markdown** : format de tableau délimité par des barres verticales, produit par PyMuPDF. Convient à la documentation et aux fichiers README. + +## Format de sortie + +- **Un seul tableau** : `filename_table.csv` (ou `.json` / `.md`) +- **Plusieurs tableaux** : `filename_tables.zip` contenant des fichiers nommés `table_1_page3.csv`, `table_2_page5.csv`, etc. + +## Cas d'usage + +- Extraire des tableaux précis de longs rapports PDF sans récupérer les données de tout le document. +- Obtenir des tableaux au format Markdown à coller directement dans des tickets GitHub, des wikis ou de la documentation. +- Récupérer des données JSON structurées à partir de tableaux PDF pour des intégrations d'API ou des scripts. +- Comparer des tableaux entre différentes versions de PDF en exportant les deux en CSV et en comparant les différences. + +## Conseils + +- Cet outil vous donne un contrôle tableau par tableau. Si vous voulez simplement tous les tableaux dans un seul CSV, utilisez [PDF vers CSV](./pdf-to-csv). Pour un classeur Excel complet, utilisez [PDF vers Excel](./pdf-to-excel). +- Les tableaux qui s'étendent sur plusieurs pages peuvent être détectés comme des tableaux distincts par page. Vous devrez peut-être les concaténer manuellement. +- Si aucun tableau n'est détecté, le PDF est peut-être une image numérisée. Passez-le d'abord par l'OCR pour ajouter une couche de texte. + +## Outils associés + +- [PDF vers CSV](./pdf-to-csv) +- [PDF vers Excel](./pdf-to-excel) +- [PDF vers texte](./pdf-to-text) diff --git a/docs/fr/tools/fb2-to-pdf.md b/docs/fr/tools/fb2-to-pdf.md new file mode 100644 index 00000000..fa82fbcb --- /dev/null +++ b/docs/fr/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 vers PDF +description: Convertissez des livres numériques FictionBook (FB2) en PDF dans votre navigateur. Gratuit, privé, sans envoi vers un serveur. +--- + +# FB2 vers PDF + +Convertissez des fichiers FictionBook 2 (FB2) en documents PDF. Le FB2 est un format de livre numérique basé sur XML, populaire en Russie et en Europe de l'Est. Bien pris en charge sur certaines plateformes, il est pratiquement inconnu sur d'autres : la conversion en PDF rend vos livres lisibles partout. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :------------ | :-------- | :------------------------------------- | +| FictionBook 2 | `.fb2` | Format de livre numérique basé sur XML | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers FB2. La sélection multiple est possible. +2. Vérifiez la liste des fichiers. Utilisez l'icône de corbeille pour retirer un fichier, ou **Ajouter d'autres fichiers** pour en inclure davantage. +3. Cliquez sur **Convertir en PDF**. Le moteur PyMuPDF analyse la structure XML du FB2 et la restitue en contenu PDF paginé. +4. Un seul fichier est téléchargé directement en PDF. Plusieurs conversions sont regroupées dans `fb2-converted.zip`. + +## Options + +Aucune configuration n'est nécessaire. Le convertisseur gère automatiquement la structure XML du FB2 et conserve les sauts de chapitre, la mise en forme et les images intégrées. + +## Cas d'usage + +- Lire des livres FB2 sur des appareils ou des applications qui ne prennent en charge que le PDF +- Imprimer de la littérature russe distribuée au format FB2 +- Archiver une bibliothèque FB2 dans un format universellement pris en charge +- Partager un livre avec quelqu'un dont la liseuse ne gère pas FictionBook + +## Astuces + +- Les fichiers FB2 sont du XML en texte brut : ils sont généralement légers et se convertissent rapidement, même dans le navigateur. +- Si vos fichiers FB2 sont compressés en `.fb2.zip`, extrayez-les avant de les envoyer. + +## Outils associés + +- [EPUB vers PDF](./epub-to-pdf) +- [MOBI vers PDF](./mobi-to-pdf) +- [XML vers PDF](./xml-to-pdf) diff --git a/docs/fr/tools/fix-page-size.md b/docs/fr/tools/fix-page-size.md new file mode 100644 index 00000000..2c273138 --- /dev/null +++ b/docs/fr/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Uniformiser la taille des pages +description: Uniformisez toutes les pages d'un PDF à une même taille. Choisissez un format de papier standard ou définissez des dimensions personnalisées. +--- + +# Uniformiser la taille des pages + +Les PDF assemblés à partir de plusieurs sources se retrouvent souvent avec des tailles de page différentes : certaines en Letter, d'autres en A4, d'autres totalement non standard. Cet outil impose une taille cible unique à chaque page, en ajustant ou en remplissant le contenu selon le besoin. + +## Fonctionnement + +1. Envoyez un fichier PDF. +2. Sélectionnez une **Taille de page cible** dans la liste déroulante (A4, Letter, Legal, A3, A5, Tabloid ou Personnalisée). +3. Choisissez une **Orientation** : Auto conserve l'orientation d'origine de chaque page, ou vous pouvez forcer Portrait ou Paysage. +4. Choisissez un mode de **Mise à l'échelle du contenu** : Ajuster (conserve tout le contenu, peut ajouter des marges) ou Remplir (remplit la page, peut rogner les bords). +5. Si besoin, définissez une **Couleur de fond** pour les marges ajoutées. +6. Cliquez sur **Uniformiser la taille des pages**. + +## Options + +- **Tailles standard** : A4, Letter, Legal, A3, A5, Tabloid +- **Dimensions personnalisées** : saisissez la largeur et la hauteur en pouces ou en millimètres +- **Orientation** : Auto, Portrait, Paysage +- **Mode de mise à l'échelle** : Ajuster ou Remplir (rogner) +- **Couleur de fond** : n'importe quelle couleur pour le remplissage des marges + +## Cas d'usage + +- Normaliser un PDF fusionné dont les pages proviennent de scanners différents +- Convertir un document US Letter en A4 pour une diffusion internationale +- Préparer des PDF prêts à imprimer qui exigent un format de coupe constant +- Corriger des pages légèrement hors norme (par ex. 8,49 x 11,02 pouces au lieu de 8,5 x 11) + +## Astuces + +- Utilisez le mode Ajuster pour garantir qu'aucun contenu n'est perdu. Le mode Remplir est plus propre visuellement mais peut couper les bords. +- Vérifiez le résultat avec l'outil Dimensions des pages pour confirmer que chaque page correspond à la cible. +- Le blanc est la couleur de fond par défaut ; choisissez une couleur sombre si votre document a des marges sombres. + +## Outils associés + +- [Dimensions des pages](./page-dimensions) : inspectez les tailles de page avant et après la correction +- [Compresser un PDF](./compress-pdf) : réduisez la taille du fichier après l'uniformisation +- [Rogner un PDF](./crop-pdf) : rognez les pages manuellement au lieu de les mettre à l'échelle automatiquement diff --git a/docs/fr/tools/flatten-pdf.md b/docs/fr/tools/flatten-pdf.md new file mode 100644 index 00000000..cd84d911 --- /dev/null +++ b/docs/fr/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Aplatir le PDF +description: Aplatissez les formulaires interactifs et les annotations en contenu statique. Rend les champs non modifiables et intègre les annotations à la page. +--- + +# Aplatir le PDF + +L'aplatissement fusionne les éléments interactifs (champs de formulaire, listes déroulantes, cases à cocher, annotations, surlignages, notes) directement dans le contenu de la page. L'apparence visuelle reste identique, mais plus rien n'est modifiable ni extractible. C'est l'équivalent PDF d'imprimer un formulaire rempli puis de le numériser, sauf que la qualité reste parfaite. + +## Fonctionnement + +1. Envoyez un ou plusieurs fichiers PDF. +2. Cliquez sur **Aplatir le PDF**. +3. Un seul fichier est téléchargé directement. Plusieurs fichiers produisent une archive ZIP. + +L'outil utilise pdf-lib pour aplatir les champs de formulaire (via `form.flatten()`) et un aplatisseur d'annotations dédié pour intégrer les annotations au flux de la page. Les deux opérations s'effectuent en une seule passe. + +## Ce qui est aplati + +- **Champs de formulaire** : saisies de texte, cases à cocher, boutons radio, listes déroulantes, champs de signature +- **Annotations** : commentaires, surlignages, texte barré, soulignements, notes, tampons, annotations manuscrites +- **Éléments interactifs** : boutons, déclencheurs d'actions + +## Ce qui reste inchangé + +- Le contenu textuel (reste sélectionnable et consultable) +- Les images et les graphiques +- La mise en page et les dimensions +- Les signets et la table des matières +- Les liens hypertextes (sauf ceux basés sur des annotations) + +## Cas d'usage + +- Verrouiller un formulaire rempli pour que les destinataires ne puissent pas modifier les réponses soumises +- Préparer un PDF pour l'archivage lorsque les éléments interactifs sont inutiles +- Corriger des problèmes d'affichage causés par des annotations rendues différemment selon les lecteurs +- S'assurer qu'un document signé ne peut plus être modifié après l'application de la signature +- Réduire la taille du fichier en éliminant les définitions de champs et les objets d'annotation + +## Astuces + +- Aplatissez une fois toutes les modifications terminées. Il n'est pas possible d'annuler l'aplatissement d'un PDF. +- Si vous devez aplatir et aussi supprimer les métadonnées, le JavaScript et les pièces jointes, utilisez plutôt l'outil Nettoyer un PDF, qui inclut l'aplatissement parmi ses options. +- Certains PDF affichent « aucun formulaire trouvé » : c'est normal si le document ne contient que des annotations et aucun champ de formulaire. + +## Outils associés + +- [Nettoyer un PDF](./sanitize-pdf) : aplatit les formulaires et supprime les métadonnées, les scripts, etc. +- [Rastériser le PDF](./rasterize-pdf) : convertit en PDF basé sur des images pour un aplatissement maximal +- [Polices en contours](./font-to-outline) : convertit les polices en tracés vectoriels +- [Protéger un PDF](./protect-pdf) : protégez le PDF aplati par un mot de passe diff --git a/docs/fr/tools/font-to-outline.md b/docs/fr/tools/font-to-outline.md new file mode 100644 index 00000000..f8937650 --- /dev/null +++ b/docs/fr/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Polices en contours +description: Convertissez toutes les polices d'un PDF en contours vectoriels pour un rendu identique sur tous les appareils. Élimine les problèmes de dépendance aux polices. +--- + +# Polices en contours + +Convertir les polices en contours transforme chaque caractère, d'un glyphe de police en un tracé vectoriel. Le PDF ne dépend plus d'aucune police installée : il s'affiche à l'identique sur chaque appareil, chaque système d'exploitation et chaque imprimante. C'est une étape standard des flux de prépresse. + +## Fonctionnement + +1. Envoyez un ou plusieurs fichiers PDF. +2. Cliquez sur **Convertir en contours**. +3. Ghostscript convertit tout le texte en tracés vectoriels. +4. Téléchargez le résultat. Plusieurs fichiers produisent une archive ZIP. + +Aucun réglage n'est à configurer. L'outil utilise Ghostscript (WebAssembly) pour convertir toutes les références de police en tracés dessinés, en une seule passe. + +## Ce qui change + +- Les caractères deviennent des courbes vectorielles (tracés de Bézier) +- L'incorporation des polices n'est plus nécessaire : le PDF est autonome au niveau des glyphes +- La taille du fichier peut augmenter, car les tracés vectoriels sont généralement plus lourds que les références de police +- L'apparence visuelle est conservée à l'identique + +## Ce que vous perdez + +- La sélection et le copier-coller du texte +- La recherche dans le texte (Ctrl+F ne fonctionne plus) +- La possibilité de modifier le contenu textuel +- L'accessibilité pour les lecteurs d'écran + +## Cas d'usage + +- Envoyer des PDF à un imprimeur qui exige des polices vectorisées +- Partager des documents qui utilisent des polices personnalisées ou sous licence avec des personnes qui ne les ont pas +- Éviter la substitution de polices qui change l'aspect de votre document sur d'autres systèmes +- Préparer des PDF pour la gravure laser ou la découpe CNC, qui exigent une source vectorielle +- S'assurer qu'un PDF riche en logos s'affiche correctement sur toutes les plateformes + +## Astuces + +- Conservez votre PDF d'origine. La conversion en contours est irréversible : il est impossible de retransformer les tracés en texte modifiable. +- Si le texte doit rester consultable, envisagez plutôt l'outil Rastériser le PDF suivi d'une OCR. +- Les PDF en contours sont généralement plus volumineux. Lancez ensuite Compresser un PDF si la taille compte. + +## Outils associés + +- [Aplatir le PDF](./flatten-pdf) : aplatit les formulaires et les annotations sans toucher aux polices +- [Rastériser le PDF](./rasterize-pdf) : convertit en PDF basé sur des images plutôt qu'en contours vectoriels +- [Compresser un PDF](./compress-pdf) : réduit la taille du fichier après la conversion en contours +- [PDF vers PDF/A](./pdf-to-pdfa) : convertissez pour l'archivage après avoir éliminé la dépendance aux polices diff --git a/docs/fr/tools/form-creator.md b/docs/fr/tools/form-creator.md new file mode 100644 index 00000000..3e2117ea --- /dev/null +++ b/docs/fr/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Créer un formulaire PDF +description: Créez des formulaires PDF remplissables avec des champs de texte, cases à cocher, listes déroulantes, boutons radio et plus encore, par glisser-déposer. +--- + +# Créer un formulaire PDF + +Concevez des formulaires PDF remplissables professionnels à partir de zéro ou en ajoutant des champs à un PDF existant. L'éditeur visuel vous permet de glisser-déposer des éléments de formulaire (champs de texte, cases à cocher, listes déroulantes, boutons radio, champs de signature, etc.) directement sur les aperçus de pages. Configurez les propriétés des champs, définissez des règles de visibilité conditionnelle et exportez un formulaire PDF entièrement interactif. + +## Fonctionnement + +1. Envoyez un PDF existant **ou** cliquez sur **Créer un PDF vierge** pour partir de zéro. +2. Pour un PDF vierge, sélectionnez une taille de page (Letter, A4, A5, Legal, Tabloid, A3 ou dimensions personnalisées). +3. L'éditeur de formulaire s'ouvre avec une barre d'outils des types de champs et une zone d'aperçu de la page. +4. Sélectionnez un type de champ dans la barre d'outils, puis cliquez sur la page pour le placer. +5. Faites glisser les champs pour les repositionner. Utilisez les poignées pour ajuster les dimensions. +6. Cliquez sur un champ pour ouvrir le panneau de propriétés, où vous pouvez définir le nom du champ, la valeur par défaut, la taille de police, l'alignement, etc. +7. Naviguez entre les pages avec les commandes de page. +8. Cliquez sur **Enregistrer** pour télécharger le PDF remplissable terminé. + +## Fonctionnalités + +- Placement des champs par glisser-déposer avec poignées visuelles de redimensionnement +- Types de champs : saisie de texte, texte multiligne, case à cocher, liste déroulante, bouton radio, signature, date, nombre et code-barres +- Panneau de propriétés pour configurer le nom, le libellé, la valeur par défaut, la taille de police, la couleur, l'alignement et la validation de chaque champ +- Actions sur les champs et règles de visibilité conditionnelle (afficher/masquer des champs selon la valeur d'autres champs) +- Navigation entre les pages pour les formulaires de plusieurs pages +- Extraction des champs existants : détecte et importe automatiquement les champs de formulaire des PDF envoyés +- Prise en charge des PDF envoyés comme des pages vierges en tant que support du formulaire +- Plusieurs tailles de page prédéfinies, ainsi que des dimensions personnalisées +- Génération de codes-barres grâce à bwip-js +- Gestion des groupes de boutons radio + +## Options + +**Tailles de page prédéfinies (pour les PDF vierges) :** + +- Letter (8,5" x 11") +- A4 (210 mm x 297 mm) +- A5 (148 mm x 210 mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297 mm x 420 mm) +- Personnalisée (précisez la largeur et la hauteur) + +**Propriétés des champs (variables selon le type de champ) :** + +- Nom, libellé et texte d'indication +- Valeur par défaut +- Famille, taille et couleur de la police +- Alignement du texte (gauche, centre, droite) +- Option champ obligatoire +- Option lecture seule +- Longueur maximale des champs de texte +- Liste d'options pour les listes déroulantes et les boutons radio +- Actions de visibilité conditionnelle + +## Cas d'usage + +- Créer des formulaires d'accueil d'employés avec des champs de texte pour les informations personnelles et des cases à cocher pour l'acceptation des règles +- Créer des questionnaires d'admission client avec des listes déroulantes pour le choix du service +- Concevoir des bons de commande avec des champs calculés et des identifiants en code-barres +- Créer des listes de contrôle d'inspection avec des boutons radio pour les notes réussi/échec +- Créer des formulaires d'enquête avec des questions de suivi conditionnelles qui apparaissent selon les réponses + +## Astuces + +- Si vous envoyez un PDF existant, l'outil tente d'extraire les champs de formulaire déjà présents, ce qui vous permet de les modifier ou d'en ajouter. +- Utilisez la fonction de groupe de boutons radio pour créer des choix mutuellement exclusifs. Les champs d'un même groupe partagent un nom de groupe. +- Testez votre formulaire en le téléchargeant puis en l'ouvrant dans le [Remplir un formulaire PDF](./form-filler) pour vérifier le comportement des champs. + +## Outils associés + +- [Remplir un formulaire PDF](./form-filler) +- [Signer un PDF](./sign-pdf) +- [Éditeur PDF](./edit-pdf) diff --git a/docs/fr/tools/form-filler.md b/docs/fr/tools/form-filler.md new file mode 100644 index 00000000..82cbea08 --- /dev/null +++ b/docs/fr/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Remplir un formulaire PDF +description: Remplissez des formulaires PDF, y compris les formulaires XFA, directement dans votre navigateur grâce à un lecteur intégré. +--- + +# Remplir un formulaire PDF + +Ouvrez un PDF contenant des champs de formulaire et remplissez-le directement dans un lecteur intégré. L'outil prend en charge les champs AcroForm standard ainsi que les formulaires XFA (XML Forms Architecture) hérités. Une fois le formulaire complété, téléchargez la version remplie en un clic. + +## Fonctionnement + +1. Envoyez un PDF contenant des champs de formulaire. +2. Le document s'ouvre dans un lecteur PDF intégré qui affiche les champs sous forme de saisies interactives. +3. Cliquez sur les champs de texte, cases à cocher, listes déroulantes et boutons radio pour les remplir. +4. Cliquez sur **Enregistrer et télécharger le formulaire rempli** pour obtenir le PDF complété. + +## Fonctionnalités + +- Lecteur PDF.js intégré avec interaction complète avec les champs de formulaire +- Prise en charge des champs AcroForm standard (saisies de texte, cases à cocher, listes déroulantes, boutons radio) +- Prise en charge des formulaires XFA, l'ancien format basé sur XML +- Dimensionnement automatique du lecteur selon les dimensions des pages +- Affichage du fichier avec son nom et sa taille + +## Options + +Il n'y a aucune option de configuration supplémentaire. Envoyez le formulaire, remplissez-le et téléchargez-le. + +## Cas d'usage + +- Remplir des formulaires fiscaux, des demandes d'assurance ou des documents administratifs +- Remplir des formulaires de candidature reçus en pièce jointe PDF +- Compléter des formulaires d'accueil de fournisseurs ou des questionnaires fournisseurs +- Valider des listes de conformité avec des cases à cocher +- Remplir des formulaires d'admission médicale avant un rendez-vous + +## Astuces + +- Les formulaires XFA sont un format hérité, pris en charge seulement par certains lecteurs PDF. Si vous ouvrez un PDF XFA dans Chrome ou la plupart des autres outils et voyez des pages blanches, c'est que ces lecteurs ne prennent pas en charge XFA. Le remplissage de formulaires de BentoPDF et Firefox gèrent tous deux correctement XFA. +- Pour les PDF sans champs de formulaire, utilisez d'abord l'outil [Créer un formulaire PDF](./form-creator) pour ajouter des champs, puis remplissez-les ici. +- Le lecteur ajuste automatiquement sa taille aux dimensions des pages du PDF. + +## Outils associés + +- [Créer un formulaire PDF](./form-creator) +- [Signer un PDF](./sign-pdf) +- [Éditeur PDF](./edit-pdf) diff --git a/docs/fr/tools/header-footer.md b/docs/fr/tools/header-footer.md new file mode 100644 index 00000000..e28cbce5 --- /dev/null +++ b/docs/fr/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: En-tête et pied de page +description: Ajoutez un texte d'en-tête et de pied de page personnalisable aux pages d'un PDF, avec des variables dynamiques de numéro de page. +--- + +# En-tête et pied de page + +Ajoutez du texte à six emplacements sur les pages de votre PDF : en-tête à gauche, au centre et à droite, pied de page à gauche, au centre et à droite. L'outil prend en charge des variables dynamiques pour le numéro de page et le nombre total de pages, ce qui permet de créer des modèles comme « Page 3 sur 10 » mis à jour automatiquement pour chaque page. + +## Fonctionnement + +1. Envoyez votre fichier PDF. +2. Le panneau d'options apparaît avec les commandes de mise en forme et six champs de texte. +3. Saisissez le texte souhaité dans n'importe quel emplacement d'en-tête ou de pied de page. +4. Utilisez les marqueurs `{page}` et `{total}` pour une numérotation dynamique. +5. Ajustez la taille et la couleur de la police, et limitez éventuellement à une plage de pages. +6. Cliquez sur **Ajouter en-tête et pied de page** pour traiter et télécharger. + +## Options + +- **Plage de pages** : limitez éventuellement les pages qui reçoivent un en-tête et un pied de page. Laissez vide pour toutes les pages. Format : « 1-3, 5 » (plages séparées par des virgules). +- **Taille de police** : entre 6 et 24 points. 10 par défaut. +- **Couleur de police** : choisissez n'importe quelle couleur avec le sélecteur de couleur. +- **En-tête gauche / centre / droite** : champs de texte pour le haut de chaque page. +- **Pied de page gauche / centre / droite** : champs de texte pour le bas de chaque page. + +## Fonctionnalités + +- Six emplacements de texte indépendants par page +- Variable dynamique `{page}` qui insère le numéro de la page courante +- Variable dynamique `{total}` qui insère le nombre total de pages +- Filtrage par plage de pages pour cibler des pages précises +- Taille et couleur de police personnalisables +- Police Helvetica pour un rendu net et professionnel + +## Cas d'usage + +- Ajouter « Page {page} sur {total} » au centre du pied de page d'un rapport +- Placer le nom d'une entreprise en en-tête à gauche et la date du document en en-tête à droite +- Ajouter des mentions de confidentialité au pied de page de documents juridiques +- Apposer des numéros de révision sur des plages de pages précises + +## Astuces + +- Combinez `{page}` et `{total}` dans un même champ pour des formats comme « Page {page} sur {total} » ou « {page}/{total} ». +- Vous pouvez laisser la plupart des champs vides et ne remplir que les emplacements dont vous avez besoin. Les champs vides sont simplement ignorés. +- Pour des en-têtes plus complexes avec des images ou des logos, envisagez l'outil [Ajouter un filigrane](./add-watermark) positionné en haut de la page. + +## Outils associés + +- [Numéros de page](./page-numbers) +- [Ajouter un filigrane](./add-watermark) +- [Numérotation Bates](./bates-numbering) diff --git a/docs/fr/tools/heic-to-pdf.md b/docs/fr/tools/heic-to-pdf.md new file mode 100644 index 00000000..967e27c8 --- /dev/null +++ b/docs/fr/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC vers PDF +description: Convertissez des images HEIC et HEIF d'iPhone et d'iPad en PDF directement dans votre navigateur. +--- + +# HEIC vers PDF + +Convertissez des images HEIC/HEIF en PDF. Le HEIC est le format de photo par défaut des iPhone et iPad depuis iOS 11. Cet outil vous permet de transformer ces photos en PDF sans installer de logiciel ni envoyer de fichiers vers un serveur. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :--------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers HEIC/HEIF. +2. Vérifiez la liste des fichiers et retirez ceux dont vous ne voulez pas. +3. Cliquez sur **Convertir en PDF**. Le résultat est téléchargé sous le nom `from_heic.pdf`. + +Chaque fichier HEIC est décodé avec la bibliothèque heic2any, qui le convertit en PNG avec une qualité de 92 %. Le PNG est ensuite intégré au PDF avec pdf-lib, chaque image occupant sa propre page en pleine résolution. + +## Options + +Cet outil n'expose aucun réglage supplémentaire. Les images HEIC sont converties en PNG en haute qualité (0,92) avant l'intégration. + +## Cas d'usage + +- Créer un PDF à partir de photos d'iPhone à joindre à une déclaration de sinistre ou à un rapport +- Convertir des photos HEIC pour une annonce immobilière en un seul document imprimable +- Transformer des captures d'écran d'iPad (format HEIF) en PDF partageable +- Convertir par lots des photos de vacances pour un carnet de voyage + +## Astuces + +- Le décodage HEIC s'effectue entièrement dans le navigateur avec WebAssembly. La première conversion peut prendre un moment, le temps de charger le décodeur. +- Si vous devez mélanger du HEIC avec d'autres formats d'image (JPG, PNG, etc.), utilisez l'outil [Images vers PDF](./image-to-pdf), qui gère le HEIC avec tous les autres formats. +- Les fichiers HEIC des iPhone contiennent souvent des données EXIF, notamment des coordonnées GPS. Le PDF produit ne conserve pas ces métadonnées. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [JPG vers PDF](./jpg-to-pdf) +- [PNG vers PDF](./png-to-pdf) diff --git a/docs/fr/tools/image-to-pdf.md b/docs/fr/tools/image-to-pdf.md new file mode 100644 index 00000000..4d766684 --- /dev/null +++ b/docs/fr/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Images vers PDF +description: Convertissez des images JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD et plus de 10 autres formats en un seul fichier PDF. +--- + +# Images vers PDF + +Le convertisseur d'images en PDF universel. Envoyez des images dans pratiquement n'importe quel format et combinez-les en un seul document PDF. Chaque image occupe sa propre page, à la taille de l'original. + +## Formats pris en charge + +| Format | Extensions | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +C'est la prise en charge de formats la plus large de tous les convertisseurs d'images de BentoPDF. Si vous n'avez besoin que d'un format précis, utilisez plutôt l'un des outils dédiés. + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers image. Vous pouvez en sélectionner plusieurs à la fois. +2. Vérifiez la liste des fichiers. Retirez les fichiers indésirables avec l'icône de corbeille, ou cliquez sur **Ajouter d'autres fichiers** pour inclure d'autres images. +3. Choisissez un niveau de **Qualité du PDF** dans la liste déroulante. +4. Cliquez sur **Convertir en PDF**. L'outil traite les images avec le moteur PyMuPDF et télécharge le résultat sous le nom `images_to_pdf.pdf`. + +## Options + +**Qualité du PDF** contrôle la compression appliquée aux images lors de leur intégration au PDF : + +- **Haute qualité** : compression minimale, fichier plus volumineux. Idéal pour l'impression ou l'archivage. +- **Qualité moyenne** (par défaut) : compression équilibrée. Convient à la plupart des usages. +- **Basse qualité** : compression agressive, fichier le plus léger. Adaptée à l'envoi par email ou au partage rapide. + +Les fichiers HEIC et WebP sont automatiquement convertis en PNG avant l'intégration. Cela se fait de façon transparente, sans étape supplémentaire. + +## Cas d'usage + +- Combiner en un seul PDF des reçus ou documents numérisés avec l'appareil photo d'un téléphone +- Créer un portfolio ou un lookbook à partir d'images de formats variés +- Convertir des photos d'iPhone (HEIC) en PDF partageable sans installer de logiciel +- Assembler des maquettes issues d'exports PSD et de captures d'écran en un livrable client +- Archiver un dossier d'anciens formats d'image (PNM, JXR, JP2) en un seul PDF + +## Astuces + +- L'ordre des images dans le PDF suit celui de la liste des fichiers. Envoyez-les dans la séquence souhaitée. +- Pour la taille de fichier la plus petite possible, choisissez Basse qualité. La différence visuelle est souvent négligeable pour les numérisations riches en texte. +- Si vous n'avez qu'un seul format d'image, les convertisseurs dédiés (JPG vers PDF, PNG vers PDF, etc.) donnent le même résultat avec une interface plus simple. + +## Outils associés + +- [JPG vers PDF](./jpg-to-pdf) +- [PNG vers PDF](./png-to-pdf) +- [HEIC vers PDF](./heic-to-pdf) +- [WebP vers PDF](./webp-to-pdf) diff --git a/docs/fr/tools/index.md b/docs/fr/tools/index.md new file mode 100644 index 00000000..7d7a6de1 --- /dev/null +++ b/docs/fr/tools/index.md @@ -0,0 +1,183 @@ +# Référence des outils + +BentoPDF propose **plus de 130 outils** pour travailler avec les PDF. Tous les outils s'exécutent entièrement dans votre navigateur : vos fichiers ne quittent jamais votre appareil. + +--- + +## Modifier et annoter + +Modifiez, annotez et enrichissez vos documents PDF avec une suite complète d'outils d'édition. + +
+ +- [**Éditeur PDF**](./edit-pdf) : annotez, surlignez, caviardez, commentez, ajoutez des formes ou des images, recherchez et consultez des PDF. +- [**Modifier les signets**](./bookmark) : ajoutez, modifiez, importez, supprimez et extrayez les signets d'un PDF. +- [**Table des matières**](./table-of-contents) : générez une page de table des matières à partir des signets du PDF. +- [**Numéros de page**](./page-numbers) : insérez des numéros de page dans votre document. +- [**Ajouter des étiquettes de page**](./add-page-labels) : appliquez des étiquettes de page PDF avec chiffres romains, préfixes et numéros de départ personnalisés. +- [**Numérotation Bates**](./bates-numbering) : ajoutez des numéros Bates séquentiels sur un ou plusieurs fichiers PDF. +- [**Ajouter un filigrane**](./add-watermark) : apposez du texte ou une image sur les pages de votre PDF. +- [**En-tête et pied de page**](./header-footer) : ajoutez du texte en haut et en bas des pages. +- [**Inverser les couleurs**](./invert-colors) : créez une version en mode sombre de votre PDF. +- [**Effet scanner**](./scanner-effect) : donnez à votre PDF l'apparence d'un document numérisé. +- [**Ajuster les couleurs**](./adjust-colors) : affinez la luminosité, le contraste, la saturation et plus encore. +- [**Couleur de fond**](./background-color) : changez la couleur de fond de votre PDF. +- [**Changer la couleur du texte**](./text-color) : changez la couleur du texte de votre PDF. +- [**Signer un PDF**](./sign-pdf) : dessinez, saisissez ou importez votre signature. +- [**Ajouter des tampons**](./add-stamps) : ajoutez des tampons image à votre PDF avec la barre d'outils d'annotation. +- [**Supprimer les annotations**](./remove-annotations) : supprimez les commentaires, surlignages et liens. +- [**Rogner un PDF**](./crop-pdf) : rognez les marges de chaque page de votre PDF. +- [**Remplir un formulaire PDF**](./form-filler) : remplissez des formulaires directement dans le navigateur. Prend aussi en charge les formulaires XFA. +- [**Créer un formulaire PDF**](./form-creator) : créez des formulaires PDF remplissables avec des champs de texte par glisser-déposer. +- [**Supprimer les pages blanches**](./remove-blank-pages) : détectez et supprimez automatiquement les pages blanches. + +
+ +--- + +## Convertir en PDF + +Transformez des images, documents, livres numériques et autres formats de fichiers en PDF. + +
+ +- [**Images vers PDF**](./image-to-pdf) : convertissez du JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP et plus en PDF. +- [**JPG vers PDF**](./jpg-to-pdf) : créez un PDF à partir d'une ou plusieurs images JPG. +- [**PNG vers PDF**](./png-to-pdf) : créez un PDF à partir d'une ou plusieurs images PNG. +- [**WebP vers PDF**](./webp-to-pdf) : créez un PDF à partir d'une ou plusieurs images WebP. +- [**SVG vers PDF**](./svg-to-pdf) : créez un PDF à partir d'une ou plusieurs images SVG. +- [**BMP vers PDF**](./bmp-to-pdf) : créez un PDF à partir d'une ou plusieurs images BMP. +- [**HEIC vers PDF**](./heic-to-pdf) : créez un PDF à partir d'une ou plusieurs images HEIC. +- [**TIFF vers PDF**](./tiff-to-pdf) : créez un PDF à partir d'une ou plusieurs images TIFF. +- [**Texte vers PDF**](./txt-to-pdf) : convertissez un fichier texte brut en PDF. +- [**Markdown vers PDF**](./markdown-to-pdf) : convertissez du Markdown en PDF avec aperçu en direct et coloration syntaxique. +- [**JSON vers PDF**](./json-to-pdf) : convertissez des fichiers JSON au format PDF. +- [**ODT vers PDF**](./odt-to-pdf) : convertissez des fichiers ODT (OpenDocument Text) en PDF. +- [**CSV vers PDF**](./csv-to-pdf) : convertissez des feuilles de calcul CSV en PDF. +- [**RTF vers PDF**](./rtf-to-pdf) : convertissez des documents RTF (Rich Text Format) en PDF. +- [**Word vers PDF**](./word-to-pdf) : convertissez des documents Word (DOCX, DOC, ODT) en PDF. +- [**Excel vers PDF**](./excel-to-pdf) : convertissez des feuilles de calcul Excel (XLSX, XLS, ODS) en PDF. +- [**PowerPoint vers PDF**](./powerpoint-to-pdf) : convertissez des présentations PowerPoint (PPTX, PPT, ODP) en PDF. +- [**XPS vers PDF**](./xps-to-pdf) : convertissez des documents XPS/OXPS en PDF. +- [**MOBI vers PDF**](./mobi-to-pdf) : convertissez des livres numériques MOBI en PDF. +- [**EPUB vers PDF**](./epub-to-pdf) : convertissez des livres numériques EPUB en PDF. +- [**FB2 vers PDF**](./fb2-to-pdf) : convertissez des livres numériques FictionBook (FB2) en PDF. +- [**CBZ vers PDF**](./cbz-to-pdf) : convertissez des archives de bandes dessinées (CBZ/CBR) en PDF. +- [**WPD vers PDF**](./wpd-to-pdf) : convertissez des documents WordPerfect (WPD) en PDF. +- [**WPS vers PDF**](./wps-to-pdf) : convertissez des documents WPS Office en PDF. +- [**XML vers PDF**](./xml-to-pdf) : convertissez des documents XML en PDF. +- [**ODG vers PDF**](./odg-to-pdf) : convertissez des fichiers OpenDocument Graphics (ODG) en PDF. +- [**ODS vers PDF**](./ods-to-pdf) : convertissez des feuilles de calcul OpenDocument (ODS) en PDF. +- [**ODP vers PDF**](./odp-to-pdf) : convertissez des présentations OpenDocument (ODP) en PDF. +- [**PUB vers PDF**](./pub-to-pdf) : convertissez des fichiers Microsoft Publisher (PUB) en PDF. +- [**VSD vers PDF**](./vsd-to-pdf) : convertissez des fichiers Microsoft Visio (VSD, VSDX) en PDF. +- [**PSD vers PDF**](./psd-to-pdf) : convertissez des fichiers Adobe Photoshop (PSD) en PDF. +- [**Email vers PDF**](./email-to-pdf) : convertissez des fichiers d'email (EML, MSG) au format PDF. + +
+ +--- + +## Convertir depuis un PDF + +Extrayez le contenu des PDF vers des images, des documents et des formats de données. + +
+ +- [**PDF vers JPG**](./pdf-to-jpg) : convertissez chaque page du PDF en image JPG. +- [**PDF vers PNG**](./pdf-to-png) : convertissez chaque page du PDF en image PNG. +- [**PDF vers WebP**](./pdf-to-webp) : convertissez chaque page du PDF en image WebP. +- [**PDF vers BMP**](./pdf-to-bmp) : convertissez chaque page du PDF en image BMP. +- [**PDF vers TIFF**](./pdf-to-tiff) : convertissez chaque page du PDF en image TIFF. +- [**PDF en CBZ**](./pdf-to-cbz) : convertissez un PDF en CBZ (archive de bande dessinée) pour les lecteurs de BD et Calibre. +- [**PDF vers SVG**](./pdf-to-svg) : convertissez chaque page du PDF en graphique vectoriel. +- [**PDF vers CSV**](./pdf-to-csv) : extrayez les tableaux d'un PDF et convertissez-les au format CSV. +- [**PDF vers Excel**](./pdf-to-excel) : extrayez les tableaux d'un PDF et convertissez-les en Excel (XLSX). +- [**PDF en niveaux de gris**](./pdf-to-greyscale) : convertissez toutes les couleurs en noir et blanc. +- [**PDF vers JSON**](./pdf-to-json) : convertissez des fichiers PDF au format JSON. +- [**PDF vers Word**](./pdf-to-word) : convertissez des fichiers PDF en documents Word modifiables. +- [**Extraire les images**](./extract-images) : extrayez toutes les images intégrées de vos fichiers PDF. +- [**PDF vers Markdown**](./pdf-to-markdown) : convertissez le texte et les tableaux d'un PDF au format Markdown. +- [**Préparer le PDF pour l'IA**](./prepare-pdf-for-ai) : extrayez le contenu d'un PDF en JSON LlamaIndex pour les pipelines RAG/LLM. +- [**PDF vers texte**](./pdf-to-text) : extrayez le texte de fichiers PDF et enregistrez-le en texte brut. +- [**Extraire les tableaux PDF**](./extract-tables) : extrayez les tableaux de PDF en CSV, JSON ou Markdown. + +
+ +--- + +## Organiser et gérer + +Réorganisez, combinez, scindez et gérez les pages et fichiers de vos PDF. + +
+ +- [**Constructeur de workflow PDF**](./pdf-workflow) : créez des pipelines de traitement PDF personnalisés avec un éditeur de nœuds visuel. +- [**Outil PDF tout-en-un**](./pdf-multi-tool) : éditeur PDF complet avec gestion des pages. +- [**OCR PDF**](./ocr-pdf) : rendez un PDF consultable et copiable. +- [**Fusionner des PDF**](./merge-pdf) : combinez plusieurs PDF en un seul fichier. +- [**Alterner et mélanger les pages**](./alternate-merge) : fusionnez des PDF en alternant les pages de chacun. +- [**Assembler un scan recto/verso**](./duplex-collate) : remettez dans l'ordre correct les blocs de numérisation recto et verso. +- [**Dupliquer et organiser**](./organize-pdf) : dupliquez, réordonnez et supprimez des pages. +- [**Ajouter des pièces jointes**](./add-attachments) : intégrez un ou plusieurs fichiers dans votre PDF. +- [**Extraire les pièces jointes**](./extract-attachments) : extrayez tous les fichiers intégrés d'un ou plusieurs PDF dans un ZIP. +- [**Gérer les pièces jointes**](./edit-attachments) : consultez ou supprimez les pièces jointes de votre PDF. +- [**Calques PDF (OCG)**](./pdf-layers) : affichez, activez, ajoutez et supprimez les calques OCG de votre PDF. +- [**Scinder un PDF**](./split-pdf) : extrayez une plage de pages dans un nouveau PDF. +- [**Diviser les pages**](./divide-pages) : divisez les pages horizontalement ou verticalement. +- [**Extraire des pages**](./extract-pages) : enregistrez une sélection de pages comme nouveaux fichiers. +- [**Supprimer des pages**](./delete-pages) : retirez des pages précises de votre document. +- [**Ajouter une page vierge**](./add-blank-page) : insérez une page vide n'importe où dans votre PDF. +- [**Inverser l'ordre des pages**](./reverse-pages) : inversez l'ordre de toutes les pages de votre document. +- [**Faire pivoter un PDF**](./rotate-pdf) : faites pivoter les pages par incréments de 90 degrés. +- [**Rotation par angle personnalisé**](./rotate-custom) : faites pivoter les pages selon n'importe quel angle. +- [**PDF N-up**](./n-up-pdf) : disposez plusieurs pages sur une même feuille. +- [**Livret PDF**](./pdf-booklet) : réorganisez les pages pour l'impression d'un livret recto verso. +- [**Combiner en une seule page**](./combine-single-page) : assemblez toutes les pages en un seul défilement continu. +- [**Afficher les métadonnées**](./view-metadata) : inspectez les propriétés cachées de votre PDF. +- [**Modifier les métadonnées**](./edit-metadata) : changez l'auteur, le titre et d'autres propriétés. +- [**PDF vers ZIP**](./pdf-to-zip) : regroupez plusieurs fichiers PDF dans une archive ZIP. +- [**Comparer des PDF**](./compare-pdfs) : comparez deux PDF côte à côte. +- [**Posteriser un PDF**](./posterize-pdf) : scindez une grande page en plusieurs pages plus petites. + +
+ +--- + +## Optimiser et réparer + +Compressez, corrigez et optimisez vos PDF pour de meilleures performances et une meilleure compatibilité. + +
+ +- [**Compresser un PDF**](./compress-pdf) : réduisez la taille de votre PDF. +- [**PDF vers PDF/A**](./pdf-to-pdfa) : convertissez un PDF en PDF/A pour l'archivage à long terme. +- [**Uniformiser la taille des pages**](./fix-page-size) : uniformisez toutes les pages à une même taille. +- [**Optimiser pour le web**](./linearize-pdf) : optimisez le PDF pour un affichage web rapide. +- [**Dimensions des pages**](./page-dimensions) : analysez la taille, l'orientation et les unités des pages. +- [**Supprimer les restrictions**](./remove-restrictions) : supprimez la protection par mot de passe et les restrictions de sécurité. +- [**Réparer un PDF**](./repair-pdf) : récupérez les données de fichiers PDF corrompus ou endommagés. +- [**Rastériser le PDF**](./rasterize-pdf) : convertissez un PDF en PDF basé sur des images. Aplatit les calques et supprime le texte sélectionnable. +- [**Redresser un PDF**](./deskew-pdf) : redressez automatiquement les pages numérisées inclinées avec OpenCV. +- [**Polices en contours**](./font-to-outline) : convertissez toutes les polices en contours vectoriels pour un rendu cohérent. + +
+ +--- + +## Sécuriser un PDF + +Protégez, chiffrez et contrôlez l'accès à vos documents PDF. + +
+ +- [**Protéger un PDF**](./protect-pdf) : verrouillez votre PDF en ajoutant un mot de passe. +- [**Nettoyer un PDF**](./sanitize-pdf) : supprimez les métadonnées, annotations, scripts et plus encore. +- [**Déverrouiller un PDF**](./unlock-pdf) : déverrouillez un PDF en supprimant la protection par mot de passe. +- [**Aplatir le PDF**](./flatten-pdf) : rendez les champs de formulaire et les annotations non modifiables. +- [**Supprimer les métadonnées**](./remove-metadata) : supprimez les données cachées de votre PDF. +- [**Modifier les autorisations**](./change-permissions) : définissez ou modifiez les autorisations utilisateur d'un PDF. +- [**Signature numérique PDF**](./digital-sign-pdf) : ajoutez une signature numérique cryptographique avec des certificats X.509. +- [**Valider la signature PDF**](./validate-signature-pdf) : vérifiez les signatures numériques et consultez les détails des certificats. + +
diff --git a/docs/fr/tools/invert-colors.md b/docs/fr/tools/invert-colors.md new file mode 100644 index 00000000..6fa43e46 --- /dev/null +++ b/docs/fr/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Inverser les couleurs +description: Inversez toutes les couleurs de votre PDF pour créer une version en mode sombre de n'importe quel document. +--- + +# Inverser les couleurs + +Remplacez chaque couleur de votre PDF par son inverse. Les fonds blancs deviennent noirs, le texte noir devient blanc, et toutes les autres couleurs passent à leur valeur complémentaire. C'est le moyen le plus rapide de créer une version « mode sombre » de n'importe quel PDF. + +## Fonctionnement + +1. Envoyez votre fichier PDF. +2. Cliquez sur **Inverser les couleurs** pour lancer le traitement. +3. Le PDF inversé se télécharge automatiquement. + +Il n'y a aucun réglage supplémentaire. L'outil rend chaque page sous forme d'image, inverse la couleur de tous les pixels et réassemble le résultat dans un nouveau PDF. + +## Fonctionnalités + +- Inversion des couleurs en un clic pour toutes les pages +- Traitement de chaque page du document +- Conservation des dimensions et de la mise en page d'origine +- Fonctionne avec n'importe quel PDF, quel que soit le type de contenu (texte, images, mixte) + +## Cas d'usage + +- Créer des versions en mode sombre de manuels ou de livres de cours pour lire confortablement la nuit +- Préparer des versions à fort contraste de documents pour l'accessibilité +- Inverser des documents numérisés avec une mauvaise exposition +- Générer des versions négatives de PDF riches en images pour une analyse visuelle + +## Astuces + +- L'outil rastérise les pages pour appliquer l'effet : le résultat est donc basé sur des images. Le texte ne sera plus sélectionnable ni consultable. Si vous voulez du texte consultable après l'inversion, passez le résultat dans un outil d'OCR. +- Pour des réglages de couleur plus fins (luminosité, contraste, saturation), utilisez plutôt l'outil [Ajuster les couleurs](./adjust-colors). +- Les PDF volumineux comptant beaucoup de pages peuvent prendre plus de temps, car chaque page est rendue et inversée individuellement. + +## Outils associés + +- [Ajuster les couleurs](./adjust-colors) +- [Couleur de fond](./background-color) +- [Effet scanner](./scanner-effect) diff --git a/docs/fr/tools/jpg-to-pdf.md b/docs/fr/tools/jpg-to-pdf.md new file mode 100644 index 00000000..37637bf9 --- /dev/null +++ b/docs/fr/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG vers PDF +description: Convertissez une ou plusieurs images JPG, JPEG et JPEG 2000 en un seul fichier PDF directement dans votre navigateur. +--- + +# JPG vers PDF + +Transformez des images JPG en un PDF propre. Envoyez un fichier ou plusieurs JPG à la fois : chaque image devient une page pleine taille du document final. + +## Formats pris en charge + +| Format | Extensions | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers JPG. La sélection multiple est prise en charge. +2. Vérifiez les fichiers envoyés. Utilisez l'icône de corbeille pour retirer un fichier, ou cliquez sur **Ajouter d'autres fichiers** pour en ajouter à la liste. +3. Sélectionnez un niveau de **Qualité du PDF**. +4. Cliquez sur **Convertir en PDF**. L'outil compresse les images selon votre réglage de qualité, les convertit avec le moteur PyMuPDF et télécharge `from_jpgs.pdf`. + +## Options + +**Qualité du PDF** ajuste la compression appliquée à chaque image avant son intégration au PDF : + +- **Haute qualité** : conserve un maximum de détails. À utiliser pour la photographie ou l'impression. +- **Qualité moyenne** (par défaut) : un bon équilibre entre netteté et taille de fichier. +- **Basse qualité** : compression agressive pour le fichier le plus léger. + +## Cas d'usage + +- Convertir des documents numérisés enregistrés en JPG en un seul PDF à soumettre +- Regrouper des photos de produits dans un catalogue pour des clients +- Transformer des images médicales ou satellites en JPEG 2000 en PDF portable +- Créer un album photo imprimable à partir d'exports d'appareil photo + +## Astuces + +- Les fichiers JPEG 2000 (`.jp2`, `.jpx`) sont entièrement pris en charge, pas seulement le JPEG standard. C'est utile pour l'imagerie médicale et les données géospatiales. +- Si vos JPG proviennent d'un appareil photo de téléphone, la qualité Moyenne produit généralement un fichier 40 à 60 % plus petit que la qualité Haute, sans différence visible à l'écran. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [PNG vers PDF](./png-to-pdf) +- [WebP vers PDF](./webp-to-pdf) diff --git a/docs/fr/tools/json-to-pdf.md b/docs/fr/tools/json-to-pdf.md new file mode 100644 index 00000000..cd148821 --- /dev/null +++ b/docs/fr/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON vers PDF +description: Reconstituez des fichiers PDF à partir du format JSON de BentoPDF. Reconvertissez des exports JSON en documents PDF d'origine. +--- + +# JSON vers PDF + +Reconstituez des documents PDF à partir de fichiers JSON créés au préalable par l'outil **PDF vers JSON** de BentoPDF. C'est un outil de conversion aller-retour : il prend la représentation JSON structurée d'un PDF et reconstruit le document d'origine. + +::: warning +Cet outil n'accepte que les fichiers JSON produits par le convertisseur PDF vers JSON de BentoPDF. Les fichiers JSON standard issus d'API, de bases de données ou d'autres outils ne sont pas pris en charge. +::: + +## Formats pris en charge + +| Entrée | Description | +| :------ | :----------------------------------------------------------- | +| `.json` | Fichiers JSON exportés par l'outil PDF vers JSON de BentoPDF | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez un ou plusieurs fichiers JSON. +2. La liste affiche chaque fichier sélectionné avec sa taille. +3. Cliquez sur **Convertir en PDF**. L'outil traite tous les fichiers avec un Web Worker et le moteur CPDF. +4. Le résultat est téléchargé sous le nom `jsons-to-pdf.zip`, contenant un PDF par fichier JSON d'entrée. + +La conversion s'exécute dans un Web Worker en arrière-plan, de sorte que l'interface reste réactive même avec de gros fichiers. + +## Options + +Cet outil n'a aucune option configurable. La structure du JSON détermine entièrement le PDF produit. + +## Résultat + +Lors de la conversion de plusieurs fichiers JSON, les résultats sont livrés dans une archive ZIP. Chaque PDF porte le nom de son fichier JSON source (par ex. `report.json` devient `report.pdf`). + +## Cas d'usage + +- Restaurer des PDF à partir d'une sauvegarde ou d'une chaîne d'archivage basée sur JSON +- Faire un aller-retour d'un PDF via JSON pour l'inspecter, puis le reconvertir en PDF +- Reconstruire des documents après des modifications programmatiques de la structure JSON +- Vérifier qu'un export PDF vers JSON a capturé tout le contenu du document en le reconvertissant + +## Astuces + +- Pour convertir des données JSON arbitraires (réponses d'API ou fichiers de configuration) en PDF mis en forme, l'outil [Texte vers PDF](./txt-to-pdf) est mieux adapté. Collez le JSON comme texte et il sera rendu avec une mise en forme correcte. +- Le moteur WebAssembly CPDF doit être disponible pour que cet outil fonctionne. Les instances auto-hébergées doivent avoir les fichiers WASM de CPDF configurés. + +## Outils associés + +- [Texte vers PDF](./txt-to-pdf) +- [Markdown vers PDF](./markdown-to-pdf) +- [CSV vers PDF](./csv-to-pdf) diff --git a/docs/fr/tools/linearize-pdf.md b/docs/fr/tools/linearize-pdf.md new file mode 100644 index 00000000..c2958558 --- /dev/null +++ b/docs/fr/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Optimiser pour le web +description: Optimisez les fichiers PDF pour un affichage web rapide avec chargement progressif. Aussi appelé optimisation « Fast Web View ». +--- + +# Optimiser pour le web + +La linéarisation restructure un PDF afin que la première page puisse s'afficher avant la fin du téléchargement du fichier complet. Adobe appelle cela « Fast Web View ». Si vous hébergez des PDF sur un site web ou les diffusez via un portail de documents, la linéarisation les rend nettement plus rapides à ouvrir. + +## Fonctionnement + +1. Envoyez un ou plusieurs fichiers PDF. +2. Cliquez sur **Linéariser le(s) PDF**. +3. Téléchargez les résultats sous forme d'archive ZIP contenant tous les fichiers linéarisés. + +Il n'y a aucun réglage à configurer. L'outil utilise l'option `--linearize` de QPDF, qui réorganise la structure interne du PDF sans modifier son contenu visuel. + +## Ce que fait la linéarisation + +- Réordonne les objets du PDF pour que les données de la première page se trouvent au début du fichier +- Ajoute un dictionnaire de linéarisation et des tables d'indices pour que les lecteurs sachent où trouver chaque page +- Permet les requêtes par plage d'octets : un navigateur peut récupérer uniquement la première page sans télécharger tout le fichier +- Nettoie la table de références croisées pour un accès aléatoire efficace + +## Fonctionnalités + +- Traitement par lots de plusieurs PDF en une seule opération +- Le résultat conserve tout le contenu, les polices, les images et les éléments interactifs +- Utilise QPDF (WebAssembly) pour une linéarisation fiable et conforme aux normes +- Les résultats sont regroupés dans un ZIP pour un téléchargement facile + +## Cas d'usage + +- Héberger des rapports PDF sur un site web où les utilisateurs attendent un affichage instantané +- Intégrer des PDF dans des applications web avec des lecteurs dans le navigateur +- Publier des catalogues ou des manuels PDF consultés sur des connexions mobiles lentes +- Préparer des documents pour des réseaux de diffusion de contenu (CDN) qui prennent en charge les plages d'octets + +## Astuces + +- Linéarisez une fois toutes les autres modifications terminées. Toute modification ultérieure (fusion, ajout de pages) casse la linéarisation. +- Combinez avec Compresser un PDF pour obtenir les PDF les plus légers et les plus rapides à charger. +- La linéarisation ajoute un léger surcoût à la taille du fichier (généralement moins de 1 %). + +## Outils associés + +- [Compresser un PDF](./compress-pdf) : réduisez la taille du fichier avant de le linéariser +- [Réparer un PDF](./repair-pdf) : corrigez les problèmes de structure qui empêchent la linéarisation +- [Supprimer les métadonnées](./remove-metadata) : retirez les métadonnées avant la publication en ligne diff --git a/docs/fr/tools/markdown-to-pdf.md b/docs/fr/tools/markdown-to-pdf.md new file mode 100644 index 00000000..b630acc2 --- /dev/null +++ b/docs/fr/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown vers PDF +description: Écrivez ou collez du Markdown et exportez-le en PDF professionnel avec aperçu en direct et coloration syntaxique. +--- + +# Markdown vers PDF + +Un éditeur Markdown complet avec aperçu en direct et export PDF en un clic. Écrivez de zéro, envoyez un fichier `.md` existant ou collez du contenu depuis le presse-papiers. L'éditeur affiche votre Markdown en temps réel et exporte un PDF mis en forme grâce au moteur d'impression intégré du navigateur. + +## Formats pris en charge + +| Entrée | Description | +| :------------- | :----------------------------- | +| Fichiers `.md` | Envoyés avec le bouton Envoyer | +| Saisie directe | Tapez ou collez dans l'éditeur | + +## Fonctionnement + +1. Ouvrez l'outil Markdown vers PDF. L'éditeur se charge en vue partagée : source Markdown à gauche, aperçu rendu à droite. +2. Écrivez votre Markdown, collez-le ou cliquez sur **Envoyer** pour charger un fichier `.md`. +3. Basculez entre les thèmes clair et sombre avec le curseur de thème de la barre d'outils. +4. Cliquez sur **Exporter en PDF** (ou appuyez sur `Ctrl/Cmd + S`) pour générer un PDF via la boîte de dialogue d'impression du navigateur. + +## Fonctionnalités + +L'éditeur prend en charge un large éventail de fonctionnalités Markdown au-delà des bases : + +- **Markdown standard** : titres, gras, italique, liens, images, listes, citations, filets horizontaux +- **Blocs de code** avec coloration syntaxique pour plus de 15 langages (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash, et plus) +- **Diagrammes Mermaid** : organigrammes, diagrammes de séquence, diagrammes ER et autres types de graphiques Mermaid s'affichent directement dans l'aperçu +- **Tableaux** avec la syntaxe de tableau Markdown standard +- **Listes de tâches** avec cases à cocher +- **Notes de bas de page**, **indices**, **exposants** +- **Listes de définitions**, **abréviations** +- Prise en charge des **emoji** (`:smile:` s'affiche comme l'emoji) +- **Surlignages** (`==marked text==`) et **insertions** (`++inserted text++`) +- **URL liées automatiquement** : les URL brutes sont converties en liens cliquables +- Génération de **table des matières** +- **Liens d'ancrage** sur les titres + +## Cas d'usage + +- Rédiger de la documentation de projet et exporter un PDF soigné pour les parties prenantes +- Créer des rapports techniques avec des exemples de code et des diagrammes d'architecture Mermaid +- Convertir un README GitHub en PDF pour une lecture hors ligne ou l'impression +- Rédiger une proposition ou une spécification avec des listes de tâches et des tableaux +- Générer un support mis en forme à partir de notes de cours écrites en Markdown + +## Astuces + +- Le PDF produit utilise la fonction d'impression en PDF du navigateur. Dans Chrome, vous pouvez personnaliser les marges et l'échelle dans la boîte de dialogue d'impression avant d'enregistrer. +- Les diagrammes Mermaid s'affichent dans l'aperçu mais peuvent nécessiter un instant d'initialisation à la première utilisation. +- Utilisez le raccourci `Ctrl/Cmd + S` pour exporter sans chercher le bouton. + +## Outils associés + +- [Texte vers PDF](./txt-to-pdf) +- [Word vers PDF](./word-to-pdf) +- [JSON vers PDF](./json-to-pdf) diff --git a/docs/fr/tools/merge-pdf.md b/docs/fr/tools/merge-pdf.md new file mode 100644 index 00000000..b8ea1982 --- /dev/null +++ b/docs/fr/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Fusionner des PDF +description: Combinez plusieurs fichiers PDF en un seul document, avec réorganisation par glisser-déposer et contrôle au niveau des pages. +--- + +# Fusionner des PDF + +Combinez plusieurs fichiers PDF en un seul document. Vous pouvez fusionner des fichiers entiers dans un ordre précis, ou passer en Mode Pages pour contrôler finement chaque page de tous les PDF envoyés. + +## Fonctionnement + +1. Envoyez au moins deux fichiers PDF en cliquant sur la zone de dépôt ou en les y glissant. +2. Choisissez entre le **Mode Fichiers** et le **Mode Pages** avec le commutateur en haut. +3. En Mode Fichiers, faites glisser les fichiers pour les réordonner et, si besoin, indiquez des plages de pages (par ex. `1-3, 5`) pour chaque fichier. Laissez la plage vide pour inclure toutes les pages. +4. En Mode Pages, glissez-déposez les miniatures de pages pour construire précisément votre séquence. +5. Cliquez sur **Fusionner les PDF** pour tout combiner en un seul fichier. Le PDF fusionné se télécharge automatiquement. + +## Fonctionnalités + +- Deux modes de fusion : le Mode Fichiers pour combiner rapidement des fichiers entiers, le Mode Pages pour un contrôle page par page +- Réorganisation par glisser-déposer dans les deux modes, avec des animations fluides +- La syntaxe de plages de pages (par ex. `1-3, 5, 8-10`) permet de choisir des pages sans passer en Mode Pages +- Les miniatures de pages chargées à la demande gardent l'interface réactive, même avec de gros documents +- Aucune limite sur le nombre de fichiers ou de pages au total +- Conserve la qualité d'origine du PDF, sans réencodage + +## Options + +| Option | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------- | +| **Mode Fichiers** | Fusionne des fichiers entiers dans un ordre personnalisé, avec des filtres de plages de pages optionnels par fichier | +| **Mode Pages** | Grille visuelle de toutes les pages de tous les fichiers : faites glisser les miniatures pour construire votre séquence | +| **Champ Pages** | Champ de texte par fichier acceptant des plages comme `1-3, 5` pour n'inclure que certaines pages | + +## Cas d'usage + +- Combiner des PDF de chapitres séparés en un seul livre ou rapport +- Fusionner une lettre de motivation et un CV en un seul dossier de candidature +- Extraire des pages précises de plusieurs documents sources dans un fichier consolidé +- Assembler des reçus ou factures numérisés en un seul PDF d'archive +- Créer un support de présentation à partir de diapositives de plusieurs présentations + +## Astuces + +- Utilisez le Mode Pages lorsque vous devez intercaler des pages de fichiers différents plutôt que d'ajouter un fichier après l'autre. +- Vous pouvez ajouter d'autres fichiers après l'envoi initial avec le bouton **Ajouter d'autres fichiers**, sans perdre votre organisation actuelle. +- Les plages de pages commencent à 1 : `1` désigne donc la première page du fichier. + +## Outils associés + +- [Scinder un PDF](./split-pdf) +- [Dupliquer et organiser](./organize-pdf) +- [Alterner et mélanger les pages](./alternate-merge) +- [Supprimer des pages](./delete-pages) diff --git a/docs/fr/tools/mobi-to-pdf.md b/docs/fr/tools/mobi-to-pdf.md new file mode 100644 index 00000000..204338ab --- /dev/null +++ b/docs/fr/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI vers PDF +description: Convertissez des livres numériques MOBI en PDF directement dans votre navigateur. Gratuit, privé, sans envoi de fichiers. +--- + +# MOBI vers PDF + +Convertissez des livres numériques MOBI d'Amazon Kindle en documents PDF. Les fichiers MOBI sont liés aux appareils et applications Kindle, ce qui les rend difficiles à lire ailleurs. La conversion en PDF vous donne une version portable que vous pouvez ouvrir sur n'importe quel appareil ou imprimer. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----- | :-------- | :-------------------------------------------- | +| MOBI | `.mobi` | Format de livre numérique Kindle (Mobipocket) | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez un ou plusieurs fichiers MOBI. +2. Vérifiez la liste des fichiers. Retirez les fichiers indésirables avec l'icône de corbeille, ou utilisez **Ajouter d'autres fichiers** pour inclure d'autres livres. +3. Cliquez sur **Convertir en PDF**. Le moteur PyMuPDF analyse la structure du MOBI et restitue chaque page en contenu PDF. +4. Un seul fichier est téléchargé en PDF. Pour plusieurs fichiers, vous obtenez une archive ZIP nommée `mobi-converted.zip`. + +## Options + +Aucun réglage supplémentaire n'est nécessaire. La conversion conserve le contenu textuel, la mise en forme et les images intégrées du fichier MOBI d'origine. + +## Cas d'usage + +- Lire du contenu acheté sur Kindle sur une liseuse non Kindle qui ne gère que le PDF +- Imprimer des chapitres d'un livre numérique pour étudier ou annoter hors ligne +- Archiver votre bibliothèque personnelle de livres numériques dans un format universel +- Partager des extraits avec quelqu'un qui n'a pas l'application Kindle + +## Astuces + +- Les fichiers MOBI protégés par DRM ne peuvent pas être convertis. L'outil ne fonctionne qu'avec des fichiers MOBI sans DRM. +- Les gros livres contenant beaucoup d'images intégrées peuvent prendre quelques secondes de plus, car tout se passe dans le navigateur. + +## Outils associés + +- [EPUB vers PDF](./epub-to-pdf) +- [FB2 vers PDF](./fb2-to-pdf) +- [CBZ vers PDF](./cbz-to-pdf) diff --git a/docs/fr/tools/n-up-pdf.md b/docs/fr/tools/n-up-pdf.md new file mode 100644 index 00000000..48960ce5 --- /dev/null +++ b/docs/fr/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF N-up +description: Disposez plusieurs pages PDF sur une même feuille en grille pour une impression compacte. +--- + +# PDF N-up + +Placez plusieurs pages sur une même feuille, en grille. Cela réduit le nombre de pages imprimées en faisant tenir 2, 4, 6, 8, 9 ou 16 pages par feuille. L'outil gère la mise à l'échelle, le positionnement et la configuration facultative de la taille de page. + +## Fonctionnement + +1. Envoyez un fichier PDF. +2. Sélectionnez le nombre de pages par feuille (la valeur « N ») : 2, 4, 6, 8, 9 ou 16. +3. Choisissez la taille de page de sortie (A4 par défaut) et l'orientation. +4. Configurez si besoin l'espacement, la couleur de bordure et la couleur de fond. +5. Cliquez sur le bouton de traitement. L'outil met chaque page à l'échelle et les juxtapose sur de nouvelles feuilles. + +## Fonctionnalités + +- Dispositions en grille : 2, 4, 6, 8, 9 et 16 pages par feuille +- Taille de page et orientation de sortie configurables +- Espacement facultatif entre les pages juxtaposées +- Réglages de couleur de fond et de bordure +- Conserve le rapport hauteur/largeur des pages d'origine lors de la mise à l'échelle + +## Options + +| Option | Description | +| ---------------------- | -------------------------------------------------------------------------------- | +| **Pages par feuille** | Nombre de pages d'origine à placer sur chaque page de sortie (2, 4, 6, 8, 9, 16) | +| **Taille de page** | Taille de la feuille de sortie (A4, Letter, Legal, etc.) | +| **Orientation** | Portrait ou Paysage pour la feuille de sortie | +| **Espacement** | Écart en points entre les pages juxtaposées | +| **Couleur de fond** | Couleur de remplissage du fond de la feuille de sortie | +| **Couleur de bordure** | Couleur des bordures autour de chaque page juxtaposée | + +## Cas d'usage + +- Imprimer des supports avec 4 diapositives par page pour économiser du papier +- Créer des fiches de révision avec plusieurs pages de référence sur une feuille +- Produire des archives de documents compactes pour le classement +- Générer des planches de vignettes donnant un aperçu d'un long document + +## Astuces + +- L'orientation paysage fonctionne souvent mieux pour les dispositions à 2 pages, tandis que le portrait convient généralement mieux à partir de 4 pages. +- Augmenter l'espacement améliore la lisibilité mais réduit la zone disponible pour chaque page juxtaposée. +- Pour l'opération inverse (scinder une page en plusieurs), consultez [Posteriser un PDF](./posterize-pdf). + +## Outils associés + +- [Posteriser un PDF](./posterize-pdf) +- [Livret PDF](./pdf-booklet) +- [Combiner en une seule page](./combine-single-page) diff --git a/docs/fr/tools/ocr-pdf.md b/docs/fr/tools/ocr-pdf.md new file mode 100644 index 00000000..e36e0bb8 --- /dev/null +++ b/docs/fr/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Rendez des PDF numérisés consultables et copiables avec l'OCR Tesseract, avec prise en charge multilingue et filtrage des caractères. +--- + +# OCR PDF + +Transformez des documents numérisés en PDF consultables et copiables. L'outil utilise l'OCR Tesseract pour reconnaître le texte dans les images et superpose une couche de texte invisible aux pages d'origine, ce qui préserve leur apparence tout en rendant le contenu entièrement consultable. + +## Fonctionnement + +1. Envoyez un PDF numérisé ou basé sur des images. +2. Sélectionnez une ou plusieurs langues présentes dans le document grâce à la liste de langues avec recherche. +3. Ajustez si besoin les réglages avancés (résolution, binarisation, liste blanche). +4. Cliquez sur **Lancer l'OCR** et suivez la progression sur la barre en temps réel. +5. Une fois terminé, vérifiez le texte extrait, puis téléchargez le PDF consultable ou un fichier `.txt` brut. + +## Fonctionnalités + +- OCR multilingue avec sélecteur de langue consultable +- La couche de texte invisible préserve l'apparence d'origine du document +- Barre de progression et journal en temps réel pendant le traitement +- Téléchargement des résultats en PDF consultable ou en fichier texte brut +- Copie du texte extrait directement dans le presse-papiers +- Trois niveaux de résolution pour équilibrer vitesse et précision + +## Options + +| Réglage | Valeurs | Par défaut | Objectif | +| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------- | +| **Résolution** | Standard (192 DPI), Élevée (288 DPI), Ultra (384 DPI) | Élevée | Une résolution plus élevée améliore la précision sur les petits textes mais prend plus de temps | +| **Binariser l'image** | Activé / Désactivé | Désactivé | Améliore le contraste des numérisations propres en les convertissant en noir et blanc | +| **Préréglage de liste blanche de caractères** | Aucun, Alphanumérique, Nombres + devises, Lettres uniquement, Nombres uniquement, Facture, Formulaires, Personnalisé | Aucun | Restreint les caractères reconnus pour améliorer la précision sur certains types de documents | +| **Liste blanche de caractères** | Texte libre | Vide | Jeu de caractères manuel lorsque le préréglage est sur Personnalisé | + +## Cas d'usage + +- Rendre des contrats et factures numérisés consultables pour pouvoir y chercher avec Ctrl+F +- Extraire le texte de documents photographiés ou d'anciens dossiers papier +- Traiter des reçus avec le préréglage Facture pour capturer précisément les montants et les dates +- Créer des PDF accessibles à partir de numérisations en image seule pour des exigences de conformité +- Extraire en lot le contenu textuel de livres ou de manuels numérisés + +## Astuces + +- Sélectionnez plusieurs langues si votre document mélange les langues (par ex. des titres en anglais avec un corps de texte en japonais). +- Utilisez l'option de binarisation pour les documents au texte pâle ou peu contrasté : elle peut nettement améliorer la précision de la reconnaissance. +- Les préréglages de liste blanche Facture et Formulaires réduisent fortement les faux positifs sur les documents structurés en ignorant les formes de caractères non pertinentes. + +## Outils associés + +- [Extraire les tableaux PDF](./extract-tables) +- [Fusionner des PDF](./merge-pdf) +- [Compresser un PDF](./compress-pdf) diff --git a/docs/fr/tools/odg-to-pdf.md b/docs/fr/tools/odg-to-pdf.md new file mode 100644 index 00000000..dd3eb96d --- /dev/null +++ b/docs/fr/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG vers PDF +description: Convertissez des fichiers LibreOffice Draw (ODG) en PDF dans votre navigateur. Gratuit, sans envoi, entièrement privé. +--- + +# ODG vers PDF + +Convertissez des fichiers OpenDocument Graphics en PDF. L'ODG est le format natif de LibreOffice Draw, utilisé pour les diagrammes, les organigrammes et les illustrations vectorielles. La conversion en PDF facilite le partage, l'impression et l'intégration de ces dessins dans d'autres documents. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :-------------------- | :-------- | :------------------------------------------ | +| OpenDocument Graphics | `.odg` | Fichiers LibreOffice Draw / OpenOffice Draw | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers ODG. Vous pouvez ajouter plusieurs fichiers à la fois. +2. Vérifiez la liste des fichiers. Retirez un fichier avec l'icône de corbeille, ou cliquez sur **Ajouter d'autres fichiers** pour ajouter d'autres dessins. +3. Cliquez sur **Convertir en PDF**. Un moteur basé sur LibreOffice se charge dans le navigateur et convertit chaque fichier ODG en conservant les graphiques vectoriels, les formes et le texte. +4. Un seul fichier est téléchargé directement en PDF. Plusieurs fichiers produisent une archive ZIP nommée `odg-to-pdf.zip`. + +## Options + +Aucun réglage supplémentaire n'est nécessaire. La conversion conserve les dimensions de page, les formes, les connecteurs et les zones de texte d'origine du fichier ODG. + +## Cas d'usage + +- Partager des diagrammes LibreOffice Draw avec des clients qui n'ont pas LibreOffice installé +- Imprimer des organigrammes et des schémas réseau créés dans Draw +- Inclure des illustrations ODG dans un rapport ou une présentation sous forme de PDF intégrés +- Archiver des dessins techniques dans un format qui restera lisible pendant des décennies + +## Astuces + +- Les éléments vectoriels restent vectoriels dans le PDF produit, le résultat s'adapte donc proprement à toute taille d'impression. +- Le moteur LibreOffice met un moment à s'initialiser à la première utilisation. Les conversions suivantes dans la même session sont plus rapides. + +## Outils associés + +- [ODS vers PDF](./ods-to-pdf) +- [ODP vers PDF](./odp-to-pdf) +- [VSD vers PDF](./vsd-to-pdf) diff --git a/docs/fr/tools/odp-to-pdf.md b/docs/fr/tools/odp-to-pdf.md new file mode 100644 index 00000000..a4df94ab --- /dev/null +++ b/docs/fr/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP vers PDF +description: Convertissez des présentations LibreOffice Impress (ODP) en PDF dans votre navigateur. Gratuit, privé, sans envoi. +--- + +# ODP vers PDF + +Convertissez des fichiers OpenDocument Presentation en PDF. L'ODP est le format natif de LibreOffice Impress et un export standard de Google Slides. Transformer des présentations en PDF permet à chacun de les consulter sans logiciel de présentation, et les diapositives s'impriment proprement. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :------------------------ | :-------- | :----------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / export Google Slides | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers ODP. Vous pouvez sélectionner plusieurs présentations à la fois. +2. Vérifiez la liste des fichiers. Retirez un fichier avec l'icône de corbeille, ou utilisez **Ajouter d'autres fichiers** pour inclure d'autres présentations. +3. Cliquez sur **Convertir en PDF**. Le moteur basé sur LibreOffice traite chaque présentation et produit un PDF où chaque diapositive devient une page. +4. Un seul fichier est téléchargé en PDF. Plusieurs fichiers sont livrés dans une archive ZIP nommée `odp-to-pdf.zip`. + +## Options + +Aucun réglage à configurer. Chaque diapositive est rendue à ses dimensions d'origine, en conservant le texte, les images, les formes et les arrière-plans. + +## Cas d'usage + +- Distribuer une présentation au public sous forme de support PDF +- Partager des exports Google Slides avec des personnes qui préfèrent le PDF à l'ODP +- Archiver des conférences et des cours dans un format en lecture seule +- Imprimer des présentations pour des ateliers en présentiel + +## Astuces + +- Les transitions et animations de diapositives sont des fonctions purement visuelles qui ne sont pas reprises dans le PDF, mais tout le contenu statique s'affiche correctement. +- Les notes de l'orateur ne sont pas incluses dans le PDF. Si vous en avez besoin, exportez-les séparément depuis votre logiciel de présentation. +- Comme les autres outils basés sur LibreOffice, le moteur se charge à la première utilisation et reste en cache pendant la session. + +## Outils associés + +- [ODG vers PDF](./odg-to-pdf) +- [ODS vers PDF](./ods-to-pdf) +- [PUB vers PDF](./pub-to-pdf) diff --git a/docs/fr/tools/ods-to-pdf.md b/docs/fr/tools/ods-to-pdf.md new file mode 100644 index 00000000..0a40d4d2 --- /dev/null +++ b/docs/fr/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS vers PDF +description: Convertissez des feuilles de calcul LibreOffice Calc (ODS) en PDF dans votre navigateur. Gratuit, privé, sans inscription. +--- + +# ODS vers PDF + +Convertissez des fichiers OpenDocument Spreadsheet en PDF. ODS est le format natif de LibreOffice Calc et un export courant de Google Sheets. Cet outil restitue les données, la mise en forme et les graphiques de votre feuille de calcul dans un PDF paginé, prêt à être imprimé ou partagé. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----------------------- | :-------- | :-------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Export LibreOffice Calc / Google Sheets | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez vos fichiers ODS. Plusieurs fichiers sont pris en charge. +2. Vérifiez la liste des fichiers. Utilisez l'icône de corbeille pour retirer des fichiers, ou cliquez sur **Ajouter des fichiers** pour agrandir le lot. +3. Cliquez sur **Convertir en PDF**. Le moteur basé sur LibreOffice se charge dans le navigateur et convertit chaque feuille de calcul en pages PDF. +4. Une seule feuille de calcul est téléchargée sous forme de PDF. Plusieurs fichiers sont regroupés dans `ods-to-pdf.zip`. + +## Options + +Aucune configuration n'est nécessaire. Le convertisseur applique au PDF la mise en page d'impression, la mise en forme des cellules et la largeur des colonnes de la feuille de calcul. + +## Cas d'usage + +- Partager un budget ou un rapport LibreOffice Calc avec quelqu'un qui n'accepte que des PDF +- Imprimer un export Google Sheets téléchargé au format ODS +- Archiver des documents financiers dans un format non modifiable +- Soumettre des formulaires ou feuilles de temps ODS sous forme de documents à mise en page fixe + +## Astuces + +- Si votre feuille de calcul contient plusieurs feuilles, toutes sont incluses dans le PDF. +- Les feuilles très larges peuvent s'étendre sur plusieurs pages PDF en largeur. Si la mise en page compte, ajustez la largeur des colonnes dans le fichier source avant la conversion. +- Le moteur LibreOffice s'initialise à la première utilisation. Les conversions suivantes de la même session sont plus rapides. + +## Outils associés + +- [ODG vers PDF](./odg-to-pdf) +- [ODP vers PDF](./odp-to-pdf) +- [XML vers PDF](./xml-to-pdf) diff --git a/docs/fr/tools/odt-to-pdf.md b/docs/fr/tools/odt-to-pdf.md new file mode 100644 index 00000000..f65f5ae0 --- /dev/null +++ b/docs/fr/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT vers PDF +description: Convertissez des fichiers OpenDocument Text (ODT) en PDF dans votre navigateur avec un moteur basé sur LibreOffice. +--- + +# ODT vers PDF + +Convertissez des fichiers OpenDocument Text en PDF. ODT est le format natif de LibreOffice Writer, d'Apache OpenOffice et d'autres traitements de texte open source. Cet outil utilise un moteur LibreOffice dans le navigateur pour produire des conversions fidèles qui préservent la mise en forme, les tableaux, les images et les styles. + +## Formats pris en charge + +| Format | Extensions | +| :---------------- | :--------- | +| OpenDocument Text | `.odt` | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez un ou plusieurs fichiers ODT. +2. Vérifiez la liste des fichiers. Ajoutez-en d'autres ou retirez ceux dont vous n'avez pas besoin. +3. Cliquez sur **Convertir en PDF**. Le moteur LibreOffice s'initialise (un indicateur de progression affiche l'état du chargement), puis chaque fichier est converti. +4. Un seul fichier est téléchargé directement sous forme de PDF. Plusieurs fichiers sont regroupés dans `odt-converted.zip`. + +## Options + +Cet outil n'a aucune configuration supplémentaire. La conversion préserve au plus près la mise en forme du document d'origine. + +## Résultat + +| Nombre de fichiers | Résultat | +| :----------------- | :------------------------------------------------------------- | +| 1 fichier | Téléchargement d'un seul PDF (par ex. `document.pdf`) | +| 2 fichiers ou plus | Archive ZIP (`odt-converted.zip`) contenant un PDF par fichier | + +## Cas d'usage + +- Convertir des documents LibreOffice Writer en PDF pour les partager avec des utilisateurs de Microsoft Office +- Produire des PDF prêts à imprimer à partir d'articles universitaires rédigés au format OpenDocument +- Convertir par lots un dossier de modèles ODT en PDF pour les distribuer +- Générer des PDF à partir de fichiers ODT créés par des systèmes automatisés de génération de documents + +## Astuces + +- Le moteur LibreOffice se charge à la première utilisation et reste en cache pour les conversions suivantes. Le premier chargement prend quelques secondes, ensuite les conversions sont rapides. +- Les documents complexes contenant des objets OLE intégrés ou des polices inhabituelles peuvent s'afficher légèrement différemment de LibreOffice sur ordinateur. Faites un essai avec un échantillon avant de convertir par lots. +- Pour les documents Word (`.doc`, `.docx`), utilisez plutôt l'outil [Word vers PDF](./word-to-pdf), qui utilise aussi le moteur LibreOffice mais accepte directement les formats Microsoft. + +## Outils associés + +- [Word vers PDF](./word-to-pdf) +- [RTF vers PDF](./rtf-to-pdf) +- [Texte vers PDF](./txt-to-pdf) diff --git a/docs/fr/tools/organize-pdf.md b/docs/fr/tools/organize-pdf.md new file mode 100644 index 00000000..c82e3333 --- /dev/null +++ b/docs/fr/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Dupliquer et organiser +description: Réorganisez, dupliquez et supprimez des pages PDF avec des miniatures en glisser-déposer et une saisie d'ordre de pages personnalisé. +--- + +# Dupliquer et organiser + +Réorganisez, dupliquez et supprimez des pages d'un PDF grâce à une interface visuelle en glisser-déposer. Chaque page apparaît sous forme de miniature que vous pouvez déplacer, cloner ou supprimer avant d'enregistrer le résultat dans un nouveau fichier. + +## Fonctionnement + +1. Envoyez un seul fichier PDF. +2. L'outil affiche une grille de miniatures présentant chaque page. +3. Faites glisser les miniatures pour réorganiser les pages, cliquez sur le bouton vert de duplication pour cloner une page, ou sur le bouton rouge de suppression pour en retirer une. +4. Vous pouvez aussi saisir un ordre de pages personnalisé dans le champ de texte (par ex. `3, 1, 2, 4`) et cliquer sur **Appliquer** pour réorganiser toutes les pages d'un coup. +5. Cliquez sur le bouton de traitement pour générer et télécharger le PDF réorganisé. + +## Fonctionnalités + +- Réorganisation des pages par glisser-déposer avec transitions animées +- Boutons de duplication et de suppression sur chaque page +- Saisie d'un ordre de pages personnalisé pour une réorganisation précise +- Numéros de page mis à jour automatiquement après chaque modification +- Impossible de supprimer la dernière page restante + +## Cas d'usage + +- Déplacer une page mal placée à la bonne position dans un rapport +- Dupliquer une page de formulaire pour obtenir plusieurs copies vierges dans un même fichier +- Retirer les pages de brouillon ou d'espace réservé avant de diffuser un document +- Inverser ou mélanger l'ordre des pages pour préparer l'impression +- Construire une séquence de pages personnalisée sans refusionner des fichiers séparés + +## Astuces + +- Le champ d'ordre de pages personnalisé attend des numéros de pages d'origine séparés par des virgules. Il doit inclure chaque page exactement une fois, sans omission ni doublon. +- Après la duplication d'une page, les deux copies font référence au même index de page d'origine. Réorganiser l'une ou l'autre fonctionne indépendamment. +- Pour des opérations en masse sur plusieurs fichiers ou des flux plus avancés, essayez plutôt l'[Outil PDF tout-en-un](./pdf-multi-tool). + +## Outils associés + +- [Fusionner des PDF](./merge-pdf) +- [Supprimer des pages](./delete-pages) +- [Outil PDF tout-en-un](./pdf-multi-tool) +- [Inverser l'ordre des pages](./reverse-pages) diff --git a/docs/fr/tools/page-dimensions.md b/docs/fr/tools/page-dimensions.md new file mode 100644 index 00000000..5f0624f5 --- /dev/null +++ b/docs/fr/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Dimensions des pages +description: Analysez les formats, orientations, proportions et rotations des pages PDF. Détectez les documents à formats mixtes et exportez les données en CSV. +--- + +# Dimensions des pages + +Un outil de diagnostic qui lit chaque page de votre PDF et indique ses dimensions exactes, son orientation, le nom de son format standard, ses proportions, sa surface et sa rotation. Utile pour repérer les pages de formats différents avant l'impression ou pour documenter les propriétés d'un PDF reçu. + +## Fonctionnement + +1. Envoyez un fichier PDF. L'analyse démarre automatiquement, sans bouton à cliquer. +2. Un panneau récapitulatif affiche le nombre total de pages, le nombre de formats uniques et indique si le document contient des formats mixtes. +3. Parcourez le tableau complet des résultats avec le détail de chaque page. +4. Changez l'unité d'affichage : points, pouces, millimètres ou pixels. +5. Cliquez sur **Exporter en CSV** pour enregistrer les données. + +## Champs indiqués + +| Colonne | Description | +| --------------- | -------------------------------------------------------- | +| N° de page | Numéro de page séquentiel | +| Dimensions | Largeur x Hauteur dans l'unité choisie | +| Format standard | Nom correspondant (A4, Letter, etc.) ou « Personnalisé » | +| Orientation | Portrait ou Paysage | +| Proportions | Rapport largeur/hauteur sous forme décimale | +| Surface | Surface de la page dans l'unité choisie, au carré | +| Rotation | Rotation de la page en degrés | + +## Fonctionnalités + +- Détection automatique des formats de papier standard (A3, A4, A5, Letter, Legal, Tabloid, etc.) +- Avertissement de formats mixtes avec le détail des formats présents et du nombre de pages pour chacun +- Conversion d'unités entre points, pouces, millimètres et pixels (à 96 PPI) +- Exportation au format CSV pour une utilisation dans des tableurs ou des systèmes de documentation + +## Cas d'usage + +- Vérifier que toutes les pages sont en A4 avant d'envoyer un document à un imprimeur +- Comprendre pourquoi un PDF fusionné s'imprime avec des marges inattendues sur certaines pages +- Documenter la mise en page d'une grande archive PDF pour des fiches de métadonnées +- Repérer les pages pivotées qui nécessitent une correction + +## Astuces + +- Si le récapitulatif indique « Formats mixtes », utilisez l'outil Uniformiser la taille des pages pour standardiser avant l'impression. +- Le champ de rotation aide à repérer les pages qui s'affichent correctement mais ont un attribut de rotation non nul, ce qui peut poser problème dans certains flux de travail. + +## Outils associés + +- [Uniformiser la taille des pages](./fix-page-size) : standardiser les pages après avoir repéré des formats mixtes +- [Compresser un PDF](./compress-pdf) : optimiser le PDF après avoir corrigé les pages +- [Faire pivoter un PDF](./rotate-pdf) : corriger les pages pivotées diff --git a/docs/fr/tools/page-numbers.md b/docs/fr/tools/page-numbers.md new file mode 100644 index 00000000..bfa973c8 --- /dev/null +++ b/docs/fr/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Numéros de page +description: Ajoutez des numéros de page personnalisables à n'importe quelle position sur vos pages PDF, avec police, taille et couleur configurables. +--- + +# Numéros de page + +Ajoutez des numéros de page visibles sur chaque page de votre PDF. Vous choisissez la position, le format, la taille de police et la couleur, l'outil s'occupe du reste. + +## Fonctionnement + +1. Envoyez votre fichier PDF. +2. Configurez les réglages de numérotation dans le panneau d'options qui apparaît. +3. Cliquez sur **Ajouter les numéros de page** pour lancer le traitement. +4. Le PDF numéroté est téléchargé automatiquement. + +## Options + +- **Position** : choisissez l'emplacement des numéros : Bas centre, Bas gauche, Bas droite, Haut centre, Haut gauche ou Haut droite. +- **Format** : choisissez entre une numérotation simple (1, 2, 3...) ou le format « page X sur Y » (1 / 5, 2 / 5...). +- **Taille de police** : définissez la taille du texte des numéros de page. 12 par défaut. +- **Couleur** : choisissez la couleur du texte des numéros de page avec le sélecteur de couleur. + +## Fonctionnalités + +- Six positions couvrant tous les coins et les centres +- Deux formats de numérotation : séquentielle simple ou « page X sur Y » +- Taille de police personnalisable de 6 à 72 points +- Sélecteur de couleur complet pour le texte +- Gestion automatique des marges qui garde les numéros dans les zones sûres quelle que soit la taille de la page + +## Cas d'usage + +- Préparer des documents à imprimer qui nécessitent des repères de page visibles +- Ajouter des numéros de page à un PDF fusionné créé à partir de plusieurs fichiers sources +- Numéroter des supports de présentation avant leur distribution +- Ajouter une numérotation séquentielle à des documents juridiques ou des contrats + +## Astuces + +- Le format « page X sur Y » est utile pour les documents où les lecteurs doivent connaître la longueur totale, comme les propositions commerciales ou les rapports. +- Si vous avez besoin de styles de numérotation différents selon les sections (par exemple des chiffres romains pour les pages liminaires), utilisez plutôt l'outil [Ajouter des étiquettes de page](./add-page-labels). + +## Outils associés + +- [Ajouter des étiquettes de page](./add-page-labels) +- [Numérotation Bates](./bates-numbering) +- [En-tête et pied de page](./header-footer) diff --git a/docs/fr/tools/pdf-booklet.md b/docs/fr/tools/pdf-booklet.md new file mode 100644 index 00000000..5d01e2f8 --- /dev/null +++ b/docs/fr/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Livret PDF +description: Réorganisez les pages d'un PDF dans l'ordre d'un livret (piqûre à cheval) pour le plier et l'agrafer en livret physique. +--- + +# Livret PDF + +Réorganisez les pages d'un PDF dans l'ordre d'imposition d'un livret. Imprimées en recto verso puis pliées en deux, les pages se retrouvent dans le bon ordre de lecture. C'est la mise en page utilisée pour les livrets brochés à cheval et les fanzines. + +## Fonctionnement + +1. Envoyez un fichier PDF. +2. Configurez les réglages du livret : format et orientation de la page de sortie. +3. Cliquez sur **Générer l'aperçu** pour voir comment les pages seront disposées sur chaque feuille. +4. Examinez l'aperçu, qui montre chaque feuille physique avec les pages affectées au recto et au verso. +5. Cliquez sur **Télécharger** pour enregistrer le PDF imposé en livret. + +## Fonctionnalités + +- Réorganisation automatique des pages pour une reliure à cheval +- Format de page de sortie configurable +- Aperçu visuel de la mise en page du livret avant le téléchargement +- Gestion des nombres de pages impairs par l'ajout de pages blanches si nécessaire +- Mise à l'échelle des pages sources pour s'adapter au format de la feuille du livret + +## Cas d'usage + +- Créer des livrets ou fanzines imprimables à partir d'un PDF ordinaire +- Préparer des programmes de conférence ou des guides d'événement pour une impression en interne +- Fabriquer des cartes de vœux pliées ou de petits catalogues +- Produire des recueils ou des plaquettes de poésie pour une reliure manuelle + +## Astuces + +- Idéalement, le nombre de pages de votre PDF source devrait être un multiple de 4 pour obtenir un livret propre. Sinon, des pages blanches sont ajoutées automatiquement pour compléter la dernière feuille. +- Imprimez le résultat en recto verso avec le réglage « retourner sur le petit côté » de votre imprimante, puis pliez toutes les feuilles ensemble et agrafez sur le dos. +- Pour simplement placer plusieurs pages sur une feuille sans l'ordre de livret, utilisez plutôt [PDF N-up](./n-up-pdf). + +## Outils associés + +- [PDF N-up](./n-up-pdf) +- [Faire pivoter un PDF](./rotate-pdf) +- [Ajouter une page vierge](./add-blank-page) diff --git a/docs/fr/tools/pdf-layers.md b/docs/fr/tools/pdf-layers.md new file mode 100644 index 00000000..32443bc5 --- /dev/null +++ b/docs/fr/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Calques OCG PDF +description: Affichez, activez, ajoutez et supprimez les calques OCG (Optional Content Group) d'un document PDF. +--- + +# Calques OCG PDF + +Gérez les groupes de contenu facultatif (OCG), communément appelés « calques », d'un PDF. Vous pouvez activer ou masquer des calques, en ajouter de nouveaux (y compris des calques enfants imbriqués), en supprimer et enregistrer le PDF modifié. + +## Fonctionnement + +1. Envoyez un fichier PDF. +2. Cliquez sur le bouton de traitement pour charger le document avec le moteur PyMuPDF. +3. L'outil affiche tous les calques existants avec leur état de visibilité, leur statut de verrouillage et leur hiérarchie d'imbrication. +4. Cochez ou décochez les cases pour afficher ou masquer les calques. Les calques verrouillés ne peuvent pas être modifiés. +5. Ajoutez de nouveaux calques de premier niveau en saisissant un nom puis en cliquant sur le bouton d'ajout, ou ajoutez des calques enfants sous un parent existant. +6. Supprimez les calques dont vous n'avez plus besoin. +7. Cliquez sur **Enregistrer** pour télécharger le PDF modifié avec vos changements de calques. + +## Fonctionnalités + +- Affiche la hiérarchie des calques avec une indentation adaptée aux calques imbriqués +- Activation ou désactivation de la visibilité des calques +- Indicateur de verrouillage qui évite les modifications accidentelles +- Ajout de calques de premier niveau ou enfants avec des noms personnalisés +- Suppression de calques individuels +- Enregistrement de toutes les modifications dans un nouveau fichier PDF + +## Cas d'usage + +- Activer ou masquer des calques d'annotation dans des plans d'architecture ou d'ingénierie +- Ajouter de nouveaux calques d'annotation à un document de conception multicalque +- Retirer les calques obsolètes d'un modèle avant de le distribuer +- Inspecter les calques présents dans un PDF complexe reçu d'un tiers + +## Astuces + +- Si le PDF n'a aucun calque, l'outil affiche un état vide invitant à en ajouter un. Tous les PDF n'utilisent pas de calques OCG : ils sont surtout courants dans les exports CAO et les fichiers de conception. +- Les calques enfants sont indentés sous leur parent. Vous pouvez imbriquer les calques à n'importe quelle profondeur. +- Les calques verrouillés sont affichés avec une icône de cadenas et leurs cases sont désactivées. Ces verrous sont définis par le créateur du PDF. + +## Outils associés + +- [Afficher les métadonnées](./view-metadata) +- [Modifier les métadonnées](./edit-metadata) +- [Dupliquer et organiser](./organize-pdf) diff --git a/docs/fr/tools/pdf-multi-tool.md b/docs/fr/tools/pdf-multi-tool.md new file mode 100644 index 00000000..fd1ee471 --- /dev/null +++ b/docs/fr/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Outil PDF tout-en-un +description: Un gestionnaire de pages tout-en-un pour fusionner, scinder, faire pivoter, dupliquer, supprimer et réorganiser les pages PDF. +--- + +# Outil PDF tout-en-un + +Un espace de travail unifié pour toutes les opérations au niveau des pages PDF. Envoyez un ou plusieurs PDF et travaillez sur toutes leurs pages dans une seule grille visuelle. Faites pivoter, réorganisez, dupliquez, supprimez, insérez de nouveaux PDF, ajoutez des pages vierges et scindez le résultat, sans quitter l'outil. + +## Fonctionnement + +1. Cliquez sur **Envoyer des PDF** ou glissez des fichiers sur la zone d'envoi. Plusieurs fichiers sont pris en charge. +2. Toutes les pages de chaque fichier envoyé apparaissent dans une grille défilante avec des miniatures. +3. Utilisez la barre d'outils ou les boutons d'action de chaque page pour manipuler les pages. +4. Sélectionnez des pages avec la case à cocher de chaque carte, puis appliquez des opérations groupées. +5. Marquez des points de scission avec l'icône de ciseaux pour diviser le résultat en plusieurs fichiers. +6. Cliquez sur **Exporter le PDF** pour télécharger le résultat final. S'il y a des marqueurs de scission, le résultat est un ZIP de plusieurs PDF. + +## Fonctionnalités + +- **Fusion** : envoyez plusieurs PDF et ils sont combinés automatiquement dans un seul espace de travail +- **Réorganisation** : faites glisser les cartes de pages pour modifier la séquence +- **Rotation** : rotation par page ou groupée par pas de 90 degrés (gauche ou droite) +- **Duplication** : clonez n'importe quelle page en un clic +- **Suppression** : retirez des pages individuelles ou supprimez en masse la sélection +- **Insérer un PDF** : ajoutez un nouveau PDF après une page précise +- **Ajouter une page vierge** : ajoutez une page A4 vierge à la fin +- **Scission** : placez des marqueurs de scission entre les pages, puis exportez un ZIP de PDF séparés +- **Tout sélectionner / Tout désélectionner** : sélection rapide pour les opérations groupées +- **Annuler / Rétablir** : historique complet d'annulation et de rétablissement pour chaque opération +- **Télécharger la sélection** : exportez uniquement les pages sélectionnées dans un PDF autonome +- Réparation automatique des PDF corrompus avant le chargement + +## Cas d'usage + +- Construire un document personnalisé à partir de pages de plusieurs PDF sources +- Nettoyer un document numérisé en supprimant les pages blanches, en redressant les scans couchés et en réordonnant les sections +- Scinder un gros PDF aux limites des chapitres grâce à des marqueurs de scission visuels +- Modifier rapidement des pages sans avoir besoin d'un éditeur PDF complet + +## Astuces + +- Le système d'annulation et de rétablissement suit chaque opération. Utilisez-le sans crainte : vous ne pouvez pas détruire votre travail par accident. +- Les marqueurs de scission apparaissent sous forme de lignes bleues en pointillés entre les pages. Placez-les visuellement là où vous voulez diviser le document, puis exportez pour obtenir un ZIP. +- Pour de simples tâches de fusion ou de scission, les outils dédiés [Fusionner des PDF](./merge-pdf) ou [Scinder un PDF](./split-pdf) peuvent être plus rapides. L'outil tout-en-un est idéal quand vous avez besoin de plusieurs opérations dans une même session. + +## Outils associés + +- [Fusionner des PDF](./merge-pdf) +- [Scinder un PDF](./split-pdf) +- [Dupliquer et organiser](./organize-pdf) +- [Faire pivoter un PDF](./rotate-pdf) diff --git a/docs/fr/tools/pdf-to-bmp.md b/docs/fr/tools/pdf-to-bmp.md new file mode 100644 index 00000000..ae286ca7 --- /dev/null +++ b/docs/fr/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF vers BMP +description: Convertissez des pages PDF en images BMP non compressées. Utile pour les systèmes anciens et les flux d'impression qui exigent une entrée bitmap. +--- + +# PDF vers BMP + +Convertit chaque page d'un PDF en image BMP (Bitmap). BMP est un format non compressé : le résultat est fidèle au pixel près, sans perte de qualité, mais les fichiers sont volumineux. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Cliquez sur **Convertir** pour lancer le traitement. +3. Un fichier `.bmp` unique ou une archive ZIP est téléchargé automatiquement. + +## Options + +Cet outil n'a aucune option configurable. Les pages sont rendues à une échelle fixe de 2x, ce qui produit des images d'environ le double des dimensions natives de la page PDF. + +## Format de sortie + +- **Une seule page** : `filename.bmp` +- **Plusieurs pages** : `filename_bmps.zip` contenant `page_1.bmp`, `page_2.bmp`, etc. + +## Cas d'usage + +- Alimenter des systèmes ou du matériel anciens qui n'acceptent que le BMP en entrée. +- Préparer des images non compressées pour certains flux d'impression. +- Utiliser une sortie bitmap comme entrée d'outils de traitement d'image qui exigent des données de pixels brutes. + +## Astuces + +- Les fichiers BMP sont très volumineux car ils stockent les pixels bruts sans compression. Dans la plupart des cas, [PDF vers PNG](./pdf-to-png) offre une qualité sans perte avec des fichiers bien plus petits. +- Si votre système cible accepte le PNG ou le TIFF, préférez ces formats pour économiser de l'espace disque. + +## Outils associés + +- [PDF vers PNG](./pdf-to-png) +- [PDF vers TIFF](./pdf-to-tiff) +- [PDF vers JPG](./pdf-to-jpg) diff --git a/docs/fr/tools/pdf-to-cbz.md b/docs/fr/tools/pdf-to-cbz.md new file mode 100644 index 00000000..70b2484f --- /dev/null +++ b/docs/fr/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF vers CBZ +description: Convertissez un PDF en fichier CBZ (Comic Book Archive) pour les lecteurs de bandes dessinées comme Komga, Kavita, CDisplayEx et Calibre. +--- + +# PDF vers CBZ + +Convertit un PDF en fichier CBZ (Comic Book ZIP), le format standard des bandes dessinées et mangas numériques. Chaque page du PDF devient une image dans l'archive. L'outil génère des métadonnées dans trois formats pour une compatibilité maximale : ComicInfo.xml, metadata.opf et ComicBookInfo JSON. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Choisissez le format d'image, la qualité, l'échelle et les métadonnées facultatives. +3. Cliquez sur **Convertir** pour générer le fichier CBZ. +4. Le fichier `.cbz` est téléchargé automatiquement. + +## Options + +| Option | Valeurs | Par défaut | Description | +| ----------------------- | ---------------- | ---------- | -------------------------------------------------------------------------------------------------------------- | +| Format d'image | JPEG, PNG, WebP | JPEG | JPEG pour les BD en couleur, PNG pour les mangas noir et blanc sans perte, WebP pour la meilleure compression. | +| Qualité | 50–100 % | 85 % | Contrôle la compression JPEG/WebP. Masquée pour le PNG (toujours sans perte). | +| Échelle | 1,0x–4,0x | 2,0x | Une échelle plus élevée produit des images plus nettes pour les écrans haute résolution. | +| Niveaux de gris | Activé/Désactivé | Désactivé | Convertit les pages en niveaux de gris. Réduit la taille des fichiers pour le contenu noir et blanc. | +| Mode manga | Activé/Désactivé | Désactivé | Définit le sens de lecture de droite à gauche dans les métadonnées. | +| Inclure les métadonnées | Activé/Désactivé | Activé | Intègre ComicInfo.xml, metadata.opf et ComicBookInfo JSON. | + +## Champs de métadonnées + +Quand les métadonnées sont activées, vous pouvez renseigner : + +- **Titre** : détecté automatiquement à partir du nom du fichier PDF. +- **Série** : le nom de la série (par ex. « Naruto »). +- **Numéro (n°)** : numéro du tome ou du numéro dans la série. +- **Volume (Vol.)** : numéro du volume. +- **Auteur(s)** : nom du scénariste ou du créateur. +- **Éditeur** : maison d'édition. +- **Tags / Genre** : tags séparés par des virgules (par ex. « Action, Aventure »). +- **Année de publication** : année de publication (1900–2100). +- **Note** : note de la communauté de 0 à 5. + +## Compatibilité des métadonnées + +L'outil écrit les métadonnées dans trois formats pour que chaque lecteur puisse les trouver : + +| Format | Emplacement | Pris en charge par | +| ------------------ | --------------------------- | ------------------------------------------- | +| ComicInfo.xml | Fichier dans le ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Fichier dans le ZIP | Calibre | +| ComicBookInfo JSON | Champ de commentaire du ZIP | Calibre (solution de repli) | + +## Format de sortie + +- `filename.cbz` : une archive ZIP contenant les images des pages numérotées et les fichiers de métadonnées. + +Les images des pages sont nommées avec des numéros complétés par des zéros (`01.jpg`, `02.jpg`, etc.) pour que les lecteurs les affichent dans le bon ordre. + +## Cas d'usage + +- Convertir des mangas ou des BD en PDF pour les utiliser avec des lecteurs de bandes dessinées. +- Constituer une bibliothèque de BD numériques dans Komga, Kavita ou Calibre. +- Convertir des bandes dessinées numérisées dans un format adapté aux lecteurs. +- Partager des BD dans un format qui préserve le sens de lecture et les métadonnées. + +## Astuces + +- Utilisez **JPEG** pour les BD en couleur et **PNG** pour les mangas en noir et blanc : le PNG compresse très efficacement le contenu noir et blanc. +- Activez **Niveaux de gris** pour les mangas afin de réduire nettement la taille des fichiers. +- Renseignez les champs **Série** et **Numéro** pour que les gestionnaires de bibliothèque (Komga, Calibre) organisent automatiquement votre collection. +- **WebP** offre la meilleure compression, mais les lecteurs de BD plus anciens peuvent ne pas le prendre en charge. + +## Outils associés + +- [PDF vers JPG](./pdf-to-jpg) +- [PDF vers PNG](./pdf-to-png) +- [PDF vers TIFF](./pdf-to-tiff) +- [Extraire les images](./extract-images) diff --git a/docs/fr/tools/pdf-to-csv.md b/docs/fr/tools/pdf-to-csv.md new file mode 100644 index 00000000..c216dbe0 --- /dev/null +++ b/docs/fr/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF vers CSV +description: Extrayez les tableaux de documents PDF et exportez-les dans un seul fichier CSV. Gère les PDF de plusieurs pages avec détection automatique des tableaux. +--- + +# PDF vers CSV + +Extrait les tableaux d'un PDF et les exporte dans un fichier CSV. L'outil analyse chaque page à la recherche de données tabulaires avec le moteur de détection de tableaux de PyMuPDF, puis écrit toutes les lignes trouvées dans une seule sortie séparée par des virgules. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Cliquez sur **Convertir** pour lancer l'extraction des tableaux. +3. L'outil analyse chaque page et identifie automatiquement les tableaux. +4. Un fichier `.csv` contenant toutes les données extraites est téléchargé. + +Les tableaux de pages différentes sont séparés par des lignes vides dans la sortie. Les cellules contenant des virgules, des guillemets ou des retours à la ligne sont correctement échappées selon la RFC 4180. + +## Options + +Cet outil n'a aucune option configurable. Tous les tableaux trouvés dans le document sont extraits et combinés dans un seul CSV. + +## Format de sortie + +- Un seul fichier `filename.csv` contenant tous les tableaux détectés. + +## Cas d'usage + +- Récupérer des données financières de relevés bancaires ou de factures PDF dans un tableur. +- Extraire des tableaux de prix de devis fournisseurs pour les comparer. +- Convertir des données de recherche tabulaires issues d'articles PDF dans un format adapté aux outils d'analyse. +- Migrer les données de rapports PDF anciens vers des bases de données. + +## Astuces + +- Si aucun tableau n'est trouvé, l'outil affiche un message « Aucun tableau trouvé ». Cela signifie généralement que le PDF utilise une mise en page de texte qui ressemble à un tableau sans en être un réellement structuré. +- Pour un meilleur contrôle sur chaque tableau, utilisez [Extraire les tableaux](./extract-tables), qui permet de choisir entre les formats de sortie CSV, JSON et Markdown. +- Si vous avez besoin des données au format Excel avec une feuille distincte par tableau, utilisez [PDF vers Excel](./pdf-to-excel). + +## Outils associés + +- [PDF vers Excel](./pdf-to-excel) +- [Extraire les tableaux](./extract-tables) +- [PDF vers texte](./pdf-to-text) diff --git a/docs/fr/tools/pdf-to-excel.md b/docs/fr/tools/pdf-to-excel.md new file mode 100644 index 00000000..5ab0c35a --- /dev/null +++ b/docs/fr/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF vers Excel +description: Extrayez les tableaux de documents PDF dans une feuille de calcul Excel. Chaque tableau a sa propre feuille avec une référence de page. +--- + +# PDF vers Excel + +Extrait les tableaux d'un PDF et les enregistre dans une feuille de calcul Excel (`.xlsx`). Chaque tableau détecté est placé dans sa propre feuille, nommée d'après son numéro de tableau et sa page source. Propulsé par PyMuPDF pour la détection des tableaux et par la bibliothèque SheetJS pour la génération Excel. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Cliquez sur **Convertir** pour lancer l'extraction des tableaux. +3. L'outil analyse chaque page à la recherche de tableaux, puis construit un classeur Excel. +4. Un fichier `.xlsx` est téléchargé avec une feuille par tableau. + +## Options + +Cet outil n'a aucune option configurable. Tous les tableaux détectés sont extraits automatiquement. + +## Format de sortie + +- Un seul fichier `filename.xlsx`. +- **Un tableau** : une seule feuille nommée « Table ». +- **Plusieurs tableaux** : des feuilles nommées « Table 1 (Page 3) », « Table 2 (Page 5) », etc. Les noms de feuille sont tronqués à 31 caractères (la limite d'Excel). + +## Cas d'usage + +- Convertir des rapports financiers PDF en feuilles de calcul modifiables pour une analyse approfondie. +- Extraire des tableaux d'inventaire ou de commandes de PDF de fournisseurs. +- Récupérer des données structurées de formulaires ou de catalogues PDF dans Excel pour les trier et les filtrer. +- Archiver des données tabulaires PDF dans un format avec lequel des collègues non techniques peuvent travailler. + +## Astuces + +- Si l'outil indique « Aucun tableau trouvé », le PDF utilise probablement une mise en page de texte libre plutôt que des tableaux structurés. Essayez [PDF vers texte](./pdf-to-text) pour récupérer le contenu brut. +- Pour un format plat plus simple, utilisez [PDF vers CSV](./pdf-to-csv). Pour télécharger chaque tableau dans plusieurs formats, utilisez [Extraire les tableaux](./extract-tables). +- Consultez les noms des feuilles pour identifier la page d'origine de chaque tableau. + +## Outils associés + +- [PDF vers CSV](./pdf-to-csv) +- [Extraire les tableaux](./extract-tables) +- [PDF vers texte](./pdf-to-text) diff --git a/docs/fr/tools/pdf-to-greyscale.md b/docs/fr/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..f013cca3 --- /dev/null +++ b/docs/fr/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF en niveaux de gris +description: Convertissez un PDF en couleur en version en niveaux de gris (noir et blanc). Produit un nouveau PDF sans aucune couleur sur chaque page. +--- + +# PDF en niveaux de gris + +Convertit un PDF en couleur en version en niveaux de gris. Chaque page est rendue, désaturée puis réintégrée sous forme d'image JPEG dans un nouveau PDF. Le résultat conserve les dimensions d'origine des pages. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Cliquez sur **Convertir** pour traiter le fichier. +3. Un nouveau fichier `greyscale.pdf` est téléchargé avec toutes les pages converties en noir et blanc. + +En coulisses, chaque page est rendue à l'échelle 2x, les données de pixels passent par un filtre de niveaux de gris, puis sont réencodées en JPEG à 90 % de qualité et placées dans un nouveau document PDF. + +## Options + +Cet outil n'a aucune option configurable. La conversion en niveaux de gris utilise une formule de luminance standard et la qualité JPEG est fixée à 90 %. + +## Format de sortie + +- Un seul fichier `greyscale.pdf` contenant toutes les pages sous forme d'images JPEG en niveaux de gris. + +## Cas d'usage + +- Préparer des documents pour une impression en noir et blanc afin d'économiser l'encre couleur. +- Respecter les exigences de dépôt de dossiers juridiques ou administratifs qui imposent les niveaux de gris. +- Réduire la taille de PDF très colorés (les images JPEG en niveaux de gris sont plus légères que celles en couleur). +- Créer un style visuel cohérent pour des documents mêlant pages en couleur et en noir et blanc. + +## Astuces + +- Comme chaque page est rastérisée puis réintégrée en JPEG, le résultat est basé sur des images. Le texte du PDF d'origine ne sera plus sélectionnable ni consultable. Si vous avez besoin d'un texte recherchable ensuite, passez le résultat dans l'outil OCR. +- Pour un meilleur contrôle des réglages de couleur (luminosité, contraste, saturation), consultez l'outil Ajuster les couleurs ou le nœud Niveaux de gris du [Créateur de flux PDF](./pdf-workflow). + +## Outils associés + +- [PDF vers JPG](./pdf-to-jpg) +- [PDF vers PNG](./pdf-to-png) +- [Créateur de flux PDF](./pdf-workflow) diff --git a/docs/fr/tools/pdf-to-jpg.md b/docs/fr/tools/pdf-to-jpg.md new file mode 100644 index 00000000..7f20bcf7 --- /dev/null +++ b/docs/fr/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF vers JPG +description: Convertissez des pages PDF en images JPG avec une qualité réglable. Les PDF d'une page se téléchargent directement, ceux de plusieurs pages sont exportés en ZIP. +--- + +# PDF vers JPG + +Convertit chaque page d'un PDF en image JPG. Les documents d'une seule page sont téléchargés sous forme d'un fichier `.jpg` autonome. Les PDF de plusieurs pages produisent une archive ZIP contenant un JPG par page. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. L'outil affiche le nom du fichier, sa taille et son nombre de pages. +2. Réglez le curseur **Qualité** pour contrôler la compression JPG. +3. Cliquez sur **Convertir** pour lancer le traitement. +4. Le résultat est téléchargé automatiquement : un seul JPG pour les PDF d'une page, ou un fichier ZIP pour les documents de plusieurs pages. + +## Options + +- **Qualité** : un curseur de 0 % à 100 % (90 % par défaut). Des valeurs plus élevées produisent des images plus nettes avec des fichiers plus volumineux. Des valeurs plus basses compressent plus fortement. + +Les pages sont rendues en interne à l'échelle 2x, la résolution de sortie est donc le double des dimensions de la page PDF. Une page au format Letter produit une image d'environ 1 224 x 1 584 pixels. + +## Format de sortie + +- **Une seule page** : `filename.jpg` +- **Plusieurs pages** : `filename_jpgs.zip` contenant `page_1.jpg`, `page_2.jpg`, etc. + +## Cas d'usage + +- Générer des miniatures d'aperçu pour un système de gestion documentaire. +- Partager une page d'un rapport dans un chat ou un e-mail qui ne prend pas en charge le PDF. +- Créer des ressources d'image à partir de schémas ou d'illustrations PDF. +- Archiver des documents numérisés sous forme d'images individuelles. + +## Astuces + +- Pour une sortie sans perte, utilisez plutôt [PDF vers PNG](./pdf-to-png). +- Un réglage de qualité de 80 à 90 % offre un bon équilibre entre taille de fichier et fidélité visuelle. +- Si vous avez besoin d'un format précis par page, essayez le [Créateur de flux PDF](./pdf-workflow), qui dispose d'un nœud de sortie PDF vers images. + +## Outils associés + +- [PDF vers PNG](./pdf-to-png) +- [PDF vers WebP](./pdf-to-webp) +- [PDF vers BMP](./pdf-to-bmp) +- [PDF vers TIFF](./pdf-to-tiff) diff --git a/docs/fr/tools/pdf-to-json.md b/docs/fr/tools/pdf-to-json.md new file mode 100644 index 00000000..2780f51c --- /dev/null +++ b/docs/fr/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF vers JSON +description: Convertissez des fichiers PDF en JSON structuré avec CPDF. Exporte la structure interne du PDF sous forme de données JSON lisibles par machine. +--- + +# PDF vers JSON + +Convertit un ou plusieurs fichiers PDF au format JSON. L'outil utilise CPDF (Coherent PDF) pour sérialiser la structure interne de chaque PDF en une représentation JSON lisible par machine. Le résultat est toujours livré sous forme d'archive ZIP. + +## Fonctionnement + +1. Sélectionnez un ou plusieurs fichiers PDF avec le sélecteur de fichiers. +2. Cliquez sur **Convertir** pour lancer le traitement. La conversion s'exécute dans un web worker en arrière-plan. +3. Une archive ZIP est téléchargée, contenant un fichier JSON pour chaque PDF d'entrée. + +La barre d'état indique la progression des étapes de conversion et de création du ZIP. + +## Options + +Cet outil n'a aucune option configurable. Chaque PDF est converti en sa représentation JSON complète. + +## Format de sortie + +- Un fichier `pdfs-to-json.zip` contenant `filename.json` pour chaque PDF d'entrée. + +La sortie JSON représente la structure interne des objets du PDF, y compris les arbres de pages, les références de polices, les métadonnées et les flux de contenu. + +## Cas d'usage + +- Inspecter la structure interne d'un PDF pour le débogage ou la validation. +- Extraire par programmation les métadonnées structurées et les propriétés des pages. +- Alimenter des chaînes de traitement personnalisées avec des données de structure PDF. +- Auditer la conformité de documents PDF en analysant leurs arbres d'objets. + +## Astuces + +- Cet outil produit la structure brute des objets du PDF, pas le texte extrait. Si vous avez besoin du texte des pages au format JSON, utilisez plutôt [Préparer un PDF pour l'IA](./prepare-pdf-for-ai). +- Pour une extraction de texte simple, [PDF vers texte](./pdf-to-text) est plus direct. +- Les gros PDF à la structure complexe produisent des fichiers JSON très volumineux. + +## Outils associés + +- [PDF vers texte](./pdf-to-text) +- [Préparer un PDF pour l'IA](./prepare-pdf-for-ai) +- [Extraire les tableaux](./extract-tables) diff --git a/docs/fr/tools/pdf-to-markdown.md b/docs/fr/tools/pdf-to-markdown.md new file mode 100644 index 00000000..a4dd78d0 --- /dev/null +++ b/docs/fr/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF vers Markdown +description: Convertissez des documents PDF au format Markdown avec extraction d'images facultative. Prend en charge la conversion par lots de plusieurs fichiers. +--- + +# PDF vers Markdown + +Convertit des fichiers PDF au format Markdown (`.md`) en préservant les titres, paragraphes, listes et la mise en forme de base. Peut aussi extraire et inclure les images intégrées. Prend en charge la conversion d'un seul fichier ou par lots. Propulsé par PyMuPDF. + +## Fonctionnement + +1. Envoyez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. +2. Activez éventuellement **Inclure les images** pour intégrer les images extraites dans la sortie Markdown. +3. Cliquez sur **Convertir** pour lancer le traitement. +4. Un seul fichier est téléchargé sous la forme `filename.md`. Plusieurs fichiers produisent un `markdown-files.zip`. + +## Options + +- **Inclure les images** : une fois cochée, les images intégrées au PDF sont extraites et référencées dans la sortie Markdown. Une fois décochée, seul le contenu textuel est converti. + +## Format de sortie + +- **Un seul fichier** : `filename.md` +- **Plusieurs fichiers** : `markdown-files.zip` contenant un `.md` par PDF d'entrée. + +## Cas d'usage + +- Convertir de la documentation PDF en Markdown pour un générateur de site statique comme VitePress, Hugo ou Jekyll. +- Transformer des articles de recherche PDF en Markdown modifiable pour des applications de prise de notes comme Obsidian. +- Migrer d'anciennes bases de connaissances PDF vers un format texte adapté à Git. +- Extraire le contenu structuré d'ebooks PDF pour le remettre en forme. + +## Astuces + +- L'option Inclure les images est utile quand le PDF contient des schémas ou des figures essentiels au contenu. Désactivez-la pour les documents riches en texte afin de garder une sortie propre. +- Les mises en page complexes avec barres latérales, notes de bas de page ou texte en plusieurs colonnes peuvent produire un Markdown imparfait. Relisez et ajustez la sortie si nécessaire. +- Pour du texte brut sans aucune mise en forme, utilisez plutôt [PDF vers texte](./pdf-to-text). + +## Outils associés + +- [PDF vers texte](./pdf-to-text) +- [PDF vers Word](./pdf-to-word) +- [Préparer un PDF pour l'IA](./prepare-pdf-for-ai) diff --git a/docs/fr/tools/pdf-to-pdfa.md b/docs/fr/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..d449a1e8 --- /dev/null +++ b/docs/fr/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF vers PDF/A +description: Convertissez des PDF standard au format PDF/A pour l'archivage à long terme. Prend en charge les niveaux de conformité PDF/A-1b, PDF/A-2b et PDF/A-3b. +--- + +# PDF vers PDF/A + +PDF/A est un sous-ensemble du PDF normalisé par l'ISO, conçu pour la conservation numérique à long terme. Cet outil convertit vos PDF standard en documents conformes PDF/A avec Ghostscript, qui s'exécute directement dans votre navigateur. + +## Fonctionnement + +1. Envoyez un ou plusieurs fichiers PDF. +2. Sélectionnez une **version PDF/A** dans la liste déroulante. +3. Activez éventuellement **Aplatir le PDF au préalable** pour les fichiers complexes qui échouent à la conversion normale. +4. Cliquez sur **Convertir en PDF/A**. Plusieurs fichiers produisent une archive ZIP. + +## Versions PDF/A + +| Version | Restrictions | Idéal pour | +| ------------ | ----------------------------------------------------- | ------------------------------------------------------------- | +| **PDF/A-1b** | La plus stricte. Ni transparence ni calques. | Compatibilité maximale avec les anciens systèmes d'archivage | +| **PDF/A-2b** | Autorise la transparence et JPEG2000. | Archivage généraliste (recommandé) | +| **PDF/A-3b** | Autorise les pièces jointes intégrées de tout format. | Archivage de documents avec leurs fichiers de données sources | + +PDF/A-2b est sélectionné par défaut et convient à la grande majorité des besoins d'archivage. + +## Option d'aplatissement préalable + +Certains PDF contiennent des éléments qui empêchent une conversion PDF/A propre : encodages de polices inhabituels, piles de transparence complexes ou structures internes endommagées. Activer **Aplatir au préalable** rastérise le PDF à 300 DPI avant la conversion, ce qui garantit la conformité au prix d'un texte non sélectionnable. Utilisez-la en solution de repli quand la conversion standard produit des erreurs. + +L'aplatissement préalable nécessite le moteur WASM PyMuPDF. + +## Cas d'usage + +- Répondre aux exigences d'archivage administratives ou juridiques (de nombreuses juridictions imposent le PDF/A pour les dépôts judiciaires) +- Soumettre des documents à des dépôts institutionnels ou à des bibliothèques numériques +- Conserver des documents d'entreprise alors que le logiciel d'origine pourrait ne plus exister dans dix ans +- Préparer des factures pour les normes de facturation électronique qui exigent du PDF/A-3b avec des pièces jointes XML + +## Astuces + +- Essayez d'abord la conversion sans aplatissement préalable. Ne l'activez qu'en cas d'erreur. +- Le PDF/A intègre toutes les polices, les fichiers de sortie sont donc souvent plus volumineux que les originaux. +- Validez le résultat dans un validateur PDF/A dédié si une conformité stricte est nécessaire pour votre flux de travail. + +## Outils associés + +- [Compresser un PDF](./compress-pdf) : réduire la taille du fichier après la conversion +- [Aplatir le PDF](./flatten-pdf) : aplatir les formulaires avant la conversion en PDF/A +- [Supprimer les métadonnées](./remove-metadata) : retirer les métadonnées avant l'archivage diff --git a/docs/fr/tools/pdf-to-png.md b/docs/fr/tools/pdf-to-png.md new file mode 100644 index 00000000..9e697cd0 --- /dev/null +++ b/docs/fr/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF vers PNG +description: Convertissez des pages PDF en images PNG sans perte avec une échelle réglable. Idéal pour des captures de haute qualité et des fonds transparents. +--- + +# PDF vers PNG + +Convertit chaque page d'un PDF en image PNG. Le PNG utilise une compression sans perte, le résultat conserve donc tous les détails de la page d'origine. Les PDF d'une page sont téléchargés sous forme de fichier `.png`, ceux de plusieurs pages produisent un ZIP. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Réglez le curseur **Échelle** pour contrôler la résolution de sortie. +3. Cliquez sur **Convertir** pour lancer le traitement. +4. Un PNG unique ou une archive ZIP est téléchargé automatiquement. + +## Options + +- **Échelle** : de 1,0x à 3,0x (2,0x par défaut). À 2,0x, une page au format Letter est rendue à environ 1 224 x 1 584 pixels. Des valeurs d'échelle plus élevées produisent des images plus grandes et plus nettes, au prix d'une taille de fichier et d'un temps de traitement accrus. + +## Format de sortie + +- **Une seule page** : `filename.png` +- **Plusieurs pages** : `filename_pngs.zip` contenant `page_1.png`, `page_2.png`, etc. + +## Cas d'usage + +- Capturer des images fidèles de pages PDF pour des présentations. +- Extraire des graphiques ou des schémas qui exigent des contours nets et aucun artefact de compression. +- Préparer des ressources pour le design web à partir de maquettes PDF. +- Créer des images de pages sans perte pour le prétraitement OCR. + +## Astuces + +- Les fichiers PNG sont nettement plus volumineux que les JPG. Si la taille compte plus que la qualité parfaite, utilisez [PDF vers JPG](./pdf-to-jpg) ou [PDF vers WebP](./pdf-to-webp). +- À l'échelle 1,0x, la sortie correspond à la résolution native du PDF. Passez à 3,0x pour des exports de qualité d'impression. + +## Outils associés + +- [PDF vers JPG](./pdf-to-jpg) +- [PDF vers WebP](./pdf-to-webp) +- [PDF vers SVG](./pdf-to-svg) diff --git a/docs/fr/tools/pdf-to-svg.md b/docs/fr/tools/pdf-to-svg.md new file mode 100644 index 00000000..8dbcb8c0 --- /dev/null +++ b/docs/fr/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF vers SVG +description: Convertissez des pages PDF en graphiques vectoriels SVG redimensionnables. Conserve le texte et les formes sous forme de tracés vectoriels pour un redimensionnement infini. +--- + +# PDF vers SVG + +Convertit chaque page d'un PDF en fichier SVG (Scalable Vector Graphics). Contrairement aux formats matriciels, le SVG conserve les tracés vectoriels, le texte et les formes, de sorte que le résultat s'adapte à n'importe quelle taille sans pixellisation. Propulsé par PyMuPDF. + +## Fonctionnement + +1. Envoyez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. Vous pouvez ajouter plusieurs fichiers et les gérer individuellement. +2. Cliquez sur **Convertir** pour traiter tous les fichiers envoyés. +3. Les conversions d'un seul fichier d'une seule page sont téléchargées sous forme d'un `.svg` autonome. Tous les autres cas sont téléchargés sous forme d'archive ZIP. + +## Options + +Cet outil n'a aucune option configurable. Chaque page est convertie en SVG avec l'export vectoriel natif de PyMuPDF. + +## Format de sortie + +- **Un fichier, une page** : `filename.svg` +- **Un fichier, plusieurs pages** : `filename_svg.zip` contenant `page_1.svg`, `page_2.svg`, etc. +- **Plusieurs fichiers** : `pdf_to_svg.zip` avec des fichiers organisés par nom de document source. + +## Cas d'usage + +- Extraire des schémas vectoriels, des graphiques ou des illustrations de rapports PDF pour les utiliser dans des pages web. +- Modifier le contenu de pages PDF dans un éditeur vectoriel comme Inkscape ou Illustrator. +- Intégrer des aperçus de pages redimensionnables dans des applications web adaptatives. +- Extraire des logos ou des graphismes de brochures PDF en conservant des contours nets. + +## Astuces + +- Le SVG fonctionne mieux avec les PDF qui contiennent du contenu vectoriel. Les documents numérisés ou riches en images produiront de gros fichiers SVG contenant des données matricielles intégrées. +- Pour une sortie matricielle de PDF riches en images, utilisez plutôt [PDF vers PNG](./pdf-to-png) ou [PDF vers JPG](./pdf-to-jpg). +- Cet outil prend en charge la conversion par lots : envoyez plusieurs PDF à la fois pour tous les convertir en une seule exécution. + +## Outils associés + +- [PDF vers PNG](./pdf-to-png) +- [PDF vers JPG](./pdf-to-jpg) +- [PDF vers Markdown](./pdf-to-markdown) diff --git a/docs/fr/tools/pdf-to-text.md b/docs/fr/tools/pdf-to-text.md new file mode 100644 index 00000000..7ad7a0f9 --- /dev/null +++ b/docs/fr/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF vers texte +description: Extrayez le texte brut de fichiers PDF. Prend en charge l'extraction par lots de plusieurs PDF avec des fichiers TXT en sortie. +--- + +# PDF vers texte + +Extrait tout le contenu textuel de fichiers PDF et l'enregistre dans des fichiers `.txt` bruts. Prend en charge le traitement par lots : envoyez plusieurs PDF et obtenez le texte de chacun en une seule opération. Propulsé par PyMuPDF. + +## Fonctionnement + +1. Envoyez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. Gérez votre liste de fichiers avec les boutons Ajouter et Effacer. +2. Cliquez sur **Extraire** pour lancer le traitement. +3. Un seul fichier est téléchargé sous la forme `filename.txt`. Plusieurs fichiers produisent une archive `pdf-to-text.zip`. + +## Options + +Cet outil n'a aucune option configurable. Tout le contenu textuel de chaque page est extrait dans l'ordre de lecture. + +## Format de sortie + +- **Un seul fichier** : `filename.txt` +- **Plusieurs fichiers** : `pdf-to-text.zip` contenant un `.txt` par PDF d'entrée. + +## Cas d'usage + +- Extraire le texte principal de rapports PDF pour l'indexation en texte intégral. +- Convertir des ebooks ou des articles PDF en texte brut pour les lire sur des liseuses à encre électronique. +- Récupérer le texte de contrats ou de documents juridiques pour une analyse par mots-clés. +- Retirer la mise en forme des PDF pour obtenir un texte propre destiné à des scripts de traitement de données. +- Préparer un corpus de texte à partir d'archives PDF pour le traitement automatique du langage. + +## Astuces + +- Les PDF numérisés (uniquement des images) produiront des fichiers texte vides, car il n'y a aucune couche de texte à extraire. Passez d'abord les documents numérisés dans l'OCR. +- La sortie conserve l'ordre de lecture tel qu'interprété par PyMuPDF, qui suit généralement de gauche à droite et de haut en bas. Les mises en page à plusieurs colonnes peuvent produire un texte entrelacé. +- Pour une sortie structurée avec titres et mise en forme, essayez [PDF vers Markdown](./pdf-to-markdown). Pour du JSON structuré prêt pour l'IA, utilisez [Préparer un PDF pour l'IA](./prepare-pdf-for-ai). + +## Outils associés + +- [PDF vers Markdown](./pdf-to-markdown) +- [Préparer un PDF pour l'IA](./prepare-pdf-for-ai) +- [PDF vers Word](./pdf-to-word) diff --git a/docs/fr/tools/pdf-to-tiff.md b/docs/fr/tools/pdf-to-tiff.md new file mode 100644 index 00000000..4879f04b --- /dev/null +++ b/docs/fr/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF vers TIFF +description: Convertissez des pages PDF en images TIFF, couramment utilisées dans l'impression, le fax et l'archivage. Bascule sur PNG si l'encodage échoue. +--- + +# PDF vers TIFF + +Convertit chaque page d'un PDF en image TIFF. Le TIFF est le format standard de la production d'impression, des systèmes de fax et de l'archivage de documents. L'outil utilise la compression PackBits pour l'encodage TIFF et bascule sur PNG si l'encodage d'une page échoue. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Cliquez sur **Convertir** pour traiter le fichier. +3. Un fichier TIFF unique ou une archive ZIP est téléchargé automatiquement. + +## Options + +Cet outil n'a aucune option configurable. Les pages sont rendues à une échelle fixe de 2x. + +## Format de sortie + +- **Une seule page** : `filename.tiff` +- **Plusieurs pages** : `filename_tiffs.zip` contenant `page_1.tiff`, `page_2.tiff`, etc. + +Si l'encodage TIFF échoue pour une page précise (à cause de problèmes de compression), cette page est enregistrée en fichier `.png` à la place. Le ZIP contiendra alors un mélange de fichiers TIFF et PNG. + +## Cas d'usage + +- Soumettre des documents à des administrations ou des systèmes juridiques qui exigent le format TIFF. +- Préparer des pages pour une transmission par fax via des services de fax numériques. +- Archiver des documents numérisés dans un format sans perte largement pris en charge. +- Alimenter des systèmes de gestion documentaire d'entreprise avec des pages. + +## Astuces + +- Les fichiers TIFF sont volumineux. Si vous n'avez besoin d'une qualité sans perte que pour le web ou l'écran, [PDF vers PNG](./pdf-to-png) est un meilleur choix. +- Vérifiez le contenu du ZIP si certaines pages ont nécessité le repli sur PNG : vous voudrez peut-être les convertir séparément. + +## Outils associés + +- [PDF vers PNG](./pdf-to-png) +- [PDF vers BMP](./pdf-to-bmp) +- [PDF vers JPG](./pdf-to-jpg) diff --git a/docs/fr/tools/pdf-to-webp.md b/docs/fr/tools/pdf-to-webp.md new file mode 100644 index 00000000..3dd0d93a --- /dev/null +++ b/docs/fr/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF vers WebP +description: Convertissez des pages PDF en images WebP avec une qualité réglable. Des fichiers plus petits que le JPG pour une qualité visuelle comparable. +--- + +# PDF vers WebP + +Convertit chaque page d'un PDF en image WebP. Le WebP produit généralement des fichiers 25 à 35 % plus petits que le JPG pour une qualité perçue identique, ce qui en fait un excellent choix pour le web. + +## Fonctionnement + +1. Envoyez un PDF en cliquant sur la zone de dépôt ou en y glissant un fichier. +2. Réglez le curseur **Qualité**. +3. Cliquez sur **Convertir** pour traiter le fichier. +4. Un fichier `.webp` unique ou une archive ZIP est téléchargé automatiquement. + +## Options + +- **Qualité** : un curseur de 0 % à 100 % (85 % par défaut). Contrôle le niveau de compression avec perte. Des valeurs plus élevées conservent plus de détails. + +Les pages sont rendues en interne à l'échelle 2x, ce qui produit des images d'environ le double des dimensions natives du PDF. + +## Format de sortie + +- **Une seule page** : `filename.webp` +- **Plusieurs pages** : `filename_webps.zip` contenant `page_1.webp`, `page_2.webp`, etc. + +## Cas d'usage + +- Préparer des aperçus de pages pour des sites web où la bande passante compte. +- Générer des versions d'image légères de flyers ou de brochures pour les réseaux sociaux. +- Convertir par lots des documents de plusieurs pages en un ensemble d'images optimisé pour le web. + +## Astuces + +- Le WebP est pris en charge par tous les navigateurs modernes. Pour la compatibilité avec les anciens, repliez-vous sur [PDF vers JPG](./pdf-to-jpg). +- Une qualité de 80 à 85 % est généralement indiscernable de l'original à l'écran tout en gardant des fichiers légers. + +## Outils associés + +- [PDF vers JPG](./pdf-to-jpg) +- [PDF vers PNG](./pdf-to-png) +- [PDF vers BMP](./pdf-to-bmp) diff --git a/docs/fr/tools/pdf-to-word.md b/docs/fr/tools/pdf-to-word.md new file mode 100644 index 00000000..8918b59f --- /dev/null +++ b/docs/fr/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF vers Word +description: Convertissez des fichiers PDF en documents Word (DOCX) modifiables. Prend en charge la conversion par lots de plusieurs PDF à la fois. +--- + +# PDF vers Word + +Convertit des fichiers PDF en documents Word (`.docx`) modifiables. L'outil utilise PyMuPDF pour reconstruire le contenu du document en préservant le texte, la mise en forme de base et la mise en page. Prend en charge la conversion d'un seul fichier ou par lots. + +## Fonctionnement + +1. Envoyez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. Vous pouvez ajouter d'autres fichiers ou retirer des fichiers de la liste. +2. Cliquez sur **Convertir** pour lancer le traitement. +3. Un seul fichier est téléchargé sous la forme `filename.docx`. Plusieurs fichiers sont regroupés dans `converted-documents.zip`. + +## Options + +Cet outil n'a aucune option configurable. Chaque PDF est converti en DOCX avec le moteur de conversion intégré de PyMuPDF. + +## Format de sortie + +- **Un seul fichier** : `filename.docx` +- **Plusieurs fichiers** : `converted-documents.zip` contenant un `.docx` par PDF d'entrée. + +## Cas d'usage + +- Modifier le texte d'un PDF reçu que vous devez retoucher. +- Convertir des rapports PDF archivés dans un format que des collègues peuvent modifier dans Microsoft Word ou Google Docs. +- Reprendre le contenu de contrats ou de propositions PDF dans Word pour le révisionner. +- Migrer d'anciennes documentations PDF vers un format modifiable. + +## Astuces + +- Les mises en page complexes avec texte en plusieurs colonnes, formulaires intégrés ou beaucoup de graphismes peuvent ne pas se convertir parfaitement. Relisez le résultat et ajustez la mise en forme dans votre traitement de texte. +- Les PDF numérisés (uniquement des images) produiront des fichiers DOCX vides ou presque. Passez-les d'abord dans l'OCR pour ajouter une couche de texte. +- Le mode par lots est efficace pour convertir des dossiers entiers de PDF : envoyez-les tous en une fois. + +## Outils associés + +- [PDF vers texte](./pdf-to-text) +- [PDF vers Markdown](./pdf-to-markdown) +- [Créateur de flux PDF](./pdf-workflow) diff --git a/docs/fr/tools/pdf-to-zip.md b/docs/fr/tools/pdf-to-zip.md new file mode 100644 index 00000000..0962704c --- /dev/null +++ b/docs/fr/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF vers ZIP +description: Regroupez plusieurs fichiers PDF dans une seule archive ZIP pour les partager et les stocker facilement. +--- + +# PDF vers ZIP + +Regroupez plusieurs fichiers PDF dans une seule archive ZIP. C'est un simple outil d'archivage : aucune conversion, compression ni modification des PDF eux-mêmes. + +## Fonctionnement + +1. Envoyez plusieurs fichiers PDF avec la zone de dépôt. +2. Vérifiez la liste des fichiers. Retirez ceux que vous ne souhaitez pas inclure. +3. Cliquez sur le bouton de traitement. +4. Une archive ZIP contenant tous les PDF envoyés est téléchargée immédiatement. + +## Fonctionnalités + +- Accepte un nombre quelconque de fichiers PDF +- Retrait de fichiers un par un avant la création de l'archive +- Conserve les noms de fichiers d'origine dans le ZIP +- Aucune modification du contenu des PDF : les fichiers sont archivés tels quels +- Affiche le nom et la taille de chaque PDF envoyé + +## Cas d'usage + +- Regrouper un ensemble de factures ou de reçus pour une pièce jointe d'e-mail +- Archiver les livrables d'un projet (plusieurs rapports PDF) pour une passation +- Créer un téléchargement unique pour une collection de formulaires ou de modèles +- Archiver un lot de documents dans un seul fichier compressé + +## Astuces + +- Le fichier ZIP utilise les noms de fichiers PDF d'origine. Si certains fichiers portent le même nom, renommez-les avant l'envoi pour éviter les conflits. +- Cet outil ne compresse pas les PDF eux-mêmes. Pour réduire leur taille, passez-les d'abord dans Compresser un PDF, puis regroupez-les avec cet outil. + +## Outils associés + +- [Fusionner des PDF](./merge-pdf) +- [Scinder un PDF](./split-pdf) +- [Compresser un PDF](./compress-pdf) diff --git a/docs/fr/tools/pdf-workflow.md b/docs/fr/tools/pdf-workflow.md new file mode 100644 index 00000000..758e238f --- /dev/null +++ b/docs/fr/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Constructeur de workflow PDF +description: Construisez visuellement des chaînes de traitement PDF personnalisées en reliant des nœuds sur un canevas. Enchaînez des opérations comme la fusion, la compression, le filigrane et l'export. +--- + +# Constructeur de workflow PDF + +Le Créateur de flux vous permet d'enchaîner plusieurs opérations PDF dans une seule chaîne automatisée. Au lieu d'exécuter les outils un par un, vous reliez un graphe visuel de nœuds (entrée, traitement, sortie) et exécutez le tout en un clic. Vos fichiers ne quittent jamais le navigateur. + +## Fonctionnement + +L'interface est divisée en trois panneaux : une **boîte à outils de nœuds** à gauche, le **canevas** au centre et un **panneau de réglages** à droite qui apparaît quand vous sélectionnez un nœud. + +1. **Ajoutez des nœuds** en cliquant dessus dans la barre latérale gauche, ou en les glissant directement sur le canevas. Utilisez la barre de recherche en haut de la boîte à outils pour filtrer par nom. +2. **Reliez les nœuds** en glissant d'une prise de sortie (en bas d'un nœud) vers une prise d'entrée (en haut d'un autre nœud). Les connexions vont de haut en bas. +3. **Configurez les réglages** en cliquant sur un nœud pour ouvrir son panneau de réglages à droite. Chaque type de nœud a ses propres options (plages de pages, curseurs de qualité, mots de passe, etc.). +4. **Exécutez le flux** en cliquant sur le bouton **Exécuter** de la barre d'outils. Le moteur exécute les nœuds dans l'ordre topologique, un par un. Une barre d'état en bas suit la progression. +5. **Téléchargez les résultats** : le nœud Télécharger final enregistre le PDF obtenu (ou un ZIP si plusieurs fichiers sont produits). + +## Catégories de nœuds + +Les nœuds sont organisés en six catégories, chacune d'une couleur différente sur le canevas : + +- **Entrée** (bleu) : Entrée PDF, Entrée image, Word/Excel/PowerPoint vers PDF et plus de 15 autres convertisseurs de formats qui alimentent la chaîne en fichiers. +- **Modifier et annoter** (indigo) : Rogner, Niveaux de gris, Inverser les couleurs, Filigrane, Numéros de page, En-tête et pied de page, Effet scanner, Ajuster les couleurs, Couleur de fond, Supprimer les pages blanches, Supprimer les annotations. +- **Organiser et gérer** (violet) : Fusionner, Scinder, Extraire des pages, Faire pivoter, Supprimer des pages, Inverser, Ajouter une page vierge, Diviser les pages, N-up, Uniformiser la taille des pages, Combiner en une seule page, Livret, Posteriser, Modifier les métadonnées, Table des matières, OCR. +- **Optimiser et réparer** (ambre) : Compresser, Rastériser, Linéariser, Redresser, PDF vers PDF/A, Police en contours, Réparer. +- **Sécuriser le PDF** (rose) : Chiffrer, Déchiffrer, Nettoyer, Aplatir, Signature numérique, Masquer. +- **Sortie** (turquoise) : Télécharger (détecte automatiquement PDF seul ou ZIP), PDF vers images, PDF vers texte, PDF vers DOCX, PDF vers XLSX, PDF vers CSV, PDF vers SVG, PDF vers Markdown, Extraire les images. + +## Enregistrer et charger des flux + +La barre d'outils propose quatre options de persistance : + +- **Enregistrer** : stocke le flux actuel comme modèle nommé dans le stockage local de votre navigateur. Vous pouvez enregistrer plusieurs modèles. +- **Charger** : ouvre une fenêtre listant tous les modèles enregistrés. Cliquez sur Charger pour en restaurer un, ou supprimez les modèles dont vous n'avez plus besoin. +- **Exporter** : télécharge le flux sous forme de fichier `.json` pour le partager ou le sauvegarder. +- **Importer** : charge un fichier de flux `.json` depuis le disque, en restaurant tous les nœuds, positions et connexions. + +Les modèles persistent d'une session à l'autre dans le stockage local. Les fichiers JSON exportés sont portables entre navigateurs et machines. + +## Modèle d'exécution + +Le moteur construit un graphe de dépendances à partir de vos connexions et exécute les nœuds dans l'ordre topologique. Si un nœud échoue, l'exécution s'arrête et le nœud en cause est marqué en rouge. Quelques règles à garder en tête : + +- Chaque flux nécessite au moins un nœud **Entrée** et un nœud **Sortie**. +- Le moteur détecte les dépendances circulaires et bloque l'exécution avec une erreur. +- Le nœud **Chiffrer** doit être la dernière étape de traitement avant le nœud de sortie. Le placer plus tôt déclenche un avertissement de validation, car les nœuds suivants ne peuvent pas traiter des données chiffrées. +- Les PDF protégés par mot de passe demandent un mot de passe pendant l'exécution. +- Les entrées multi-PDF sont prises en charge : le nœud Fusionner peut les combiner, ou les nœuds de traitement par lots traiteront chaque PDF individuellement. + +## Types de prises + +Les connexions utilisent des prises typées pour éviter les branchements invalides : + +- **PDF** (indigo) : un seul document PDF. +- **MultiPDF** (ambre) : plusieurs documents PDF regroupés. +- **Image** (vert) : un blob d'image. + +## Options + +Chaque nœud a sa propre configuration accessible via le panneau de réglages de droite. Parmi les cas courants : + +- **Plages de pages** sur les nœuds Scinder, Extraire des pages et Supprimer des pages +- **Curseurs de qualité** sur les nœuds de sortie de conversion d'images +- **Champs de mot de passe** sur les nœuds Chiffrer et Déchiffrer +- **Champs de texte** pour Filigrane, En-tête et pied de page, Modifier les métadonnées +- **Angles de rotation** sur le nœud Faire pivoter +- **Niveau de compression** sur le nœud Compresser +- **Choix de la langue OCR** sur le nœud OCR + +## Cas d'usage + +- **Chaîne de traitement de factures** : Entrée PDF -> OCR -> Extraire les tableaux -> Télécharger en CSV. +- **Standardisation de rapports** : Word vers PDF -> Uniformiser la taille des pages -> Ajouter les numéros de page -> Filigrane -> Compresser -> Télécharger. +- **Préparation à l'archivage** : Entrée PDF -> Réparer -> Aplatir -> Nettoyer -> PDF vers PDF/A -> Télécharger. +- **Extraction d'images par lots** : Entrée PDF (plusieurs fichiers) -> Extraire les images -> Télécharger le ZIP. +- **Livrets prêts à imprimer** : Entrée PDF -> Livret -> Rogner -> Compresser -> Télécharger. +- **Diffusion sécurisée** : Entrée PDF -> Masquer -> Supprimer les annotations -> Chiffrer -> Télécharger. + +## Astuces + +- Utilisez **Suppr** ou **Retour arrière** pour retirer le nœud sélectionné du canevas. +- Cliquez sur le bouton **X** de la barre d'état d'un nœud pour le supprimer directement. +- Déplacez le canevas en cliquant et en faisant glisser sur un espace vide. Le curseur devient une main pendant le déplacement. +- Sur mobile, utilisez le bouton **+** de la barre d'outils pour afficher ou masquer la boîte à outils de nœuds. +- Si votre flux produit plusieurs fichiers de sortie, le nœud Télécharger les regroupe automatiquement dans un ZIP. +- Commencez simplement : construisez et testez une chaîne de deux nœuds avant d'ajouter de la complexité. + +## Outils associés + +- [PDF vers texte](./pdf-to-text) +- [PDF vers Excel](./pdf-to-excel) +- [Extraire les images](./extract-images) +- [PDF vers Markdown](./pdf-to-markdown) diff --git a/docs/fr/tools/png-to-pdf.md b/docs/fr/tools/png-to-pdf.md new file mode 100644 index 00000000..65f9232f --- /dev/null +++ b/docs/fr/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG vers PDF +description: Convertissez une ou plusieurs images PNG en document PDF avec une qualité réglable, entièrement dans votre navigateur. +--- + +# PNG vers PDF + +Convertissez des images PNG en PDF en préservant leur pleine résolution. Chaque PNG devient sa propre page, à la taille de l'image d'origine. La transparence est gérée automatiquement. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :--------- | +| PNG | `.png` | + +## Fonctionnement + +1. Cliquez sur la zone d'envoi ou glissez-déposez des fichiers PNG. Vous pouvez en sélectionner plusieurs à la fois. +2. Gérez la liste des fichiers : retirez ceux dont vous n'avez pas besoin ou ajoutez-en d'autres. +3. Choisissez un niveau de **Qualité du PDF** dans la liste déroulante. +4. Cliquez sur **Convertir en PDF**. Le résultat est téléchargé sous le nom `from_jpgs.pdf`. + +L'outil utilise pdf-lib pour intégrer chaque image directement. Si un PNG ne peut pas être intégré nativement (par exemple à cause d'un profil colorimétrique inhabituel), il est rendu à nouveau via un canevas au format JPEG. + +## Options + +**Qualité du PDF** contrôle la compression appliquée avant l'intégration : + +- **Haute qualité** : compression minimale, taille de fichier maximale. +- **Qualité moyenne** (par défaut) : bon équilibre entre taille et netteté. +- **Basse qualité** : compression maximale, sortie la plus petite. + +## Cas d'usage + +- Convertir des captures d'écran en PDF de plusieurs pages pour des rapports de bug ou de la documentation +- Regrouper des exports de maquettes d'interface dans un seul fichier pour relecture +- Transformer des exports de diagrammes (draw.io, Excalidraw) en PDF partageable +- Assembler un ensemble d'images de graphiques en rapport + +## Astuces + +- Les fichiers PNG avec transparence reçoivent un fond blanc dans le PDF. Si vous avez besoin d'un autre fond, modifiez les images au préalable. +- Pour les captures d'écran et les schémas aux contours nets et au texte, la haute qualité évite les artefacts de compression JPEG. La qualité moyenne ou basse peut convertir en JPEG en interne. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [JPG vers PDF](./jpg-to-pdf) +- [SVG vers PDF](./svg-to-pdf) diff --git a/docs/fr/tools/posterize-pdf.md b/docs/fr/tools/posterize-pdf.md new file mode 100644 index 00000000..467f88ef --- /dev/null +++ b/docs/fr/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Posteriser un PDF +description: Découpez les pages d'un PDF en une grille de pages plus petites pour imprimer en grand format sur plusieurs feuilles. +--- + +# Posteriser un PDF + +Divisez chaque page d'un PDF en une grille de sous-pages plus petites. C'est l'outil idéal pour imprimer une seule page sur plusieurs feuilles de papier, que vous assemblez ensuite pour créer une grande affiche ou une bannière. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Définissez le nombre de **lignes** et de **colonnes** de la grille (par ex. 2 lignes x 2 colonnes divise chaque page en 4 sous-pages). +3. Indiquez éventuellement une plage de pages pour limiter les pages à posteriser. +4. Le canevas d'aperçu affiche une grille superposée à la page courante pour visualiser les découpes. +5. Naviguez entre les pages pour vérifier la grille sur d'autres pages. +6. Cliquez sur le bouton de traitement. Chaque cellule de la grille devient une page du PDF de sortie. + +## Fonctionnalités + +- Nombre de lignes et de colonnes configurable pour des grilles flexibles +- Aperçu en direct avec une grille indiquant exactement où les pages seront divisées +- Filtre de plage de pages pour ne posteriser que certaines pages +- Navigation page par page dans l'aperçu +- Instantanés de pages mis en cache pour une navigation rapide dans l'aperçu +- Des lignes de grille rouges en pointillés marquent clairement les limites de découpe + +## Options + +| Option | Description | +| ------------------ | ------------------------------------------------- | +| **Lignes** | Nombre de divisions horizontales (par défaut : 1) | +| **Colonnes** | Nombre de divisions verticales (par défaut : 1) | +| **Plage de pages** | Pages à posteriser (vide = toutes les pages) | + +## Cas d'usage + +- Imprimer un PDF au format affiche sur des feuilles A4 ou Letter standard à assembler sur un mur +- Créer de grandes bannières à partir d'un design PDF d'une seule page +- Découper des plans techniques surdimensionnés en tuiles imprimables +- Réaliser des impressions grand format sans accès à une imprimante grand format + +## Conseils + +- Une grille 2x2 transforme une page en 4 pages. Une grille 3x3 la transforme en 9. Planifiez votre grille selon la taille souhaitée de l'ensemble assemblé. +- L'aperçu avec grille vous aide à vérifier qu'aucun contenu important ne tombe sur une ligne de coupe. Ajustez les lignes et colonnes si nécessaire. +- Pour l'opération inverse (placer plusieurs pages sur une seule feuille), utilisez [PDF N-up](./n-up-pdf). + +## Outils associés + +- [PDF N-up](./n-up-pdf) +- [Diviser les pages](./divide-pages) +- [Scinder un PDF](./split-pdf) diff --git a/docs/fr/tools/powerpoint-to-pdf.md b/docs/fr/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..b2a97a57 --- /dev/null +++ b/docs/fr/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint vers PDF +description: Convertissez des présentations PowerPoint (PPT, PPTX) et des fichiers ODP en PDF en préservant la mise en forme des diapositives. +--- + +# PowerPoint vers PDF + +Convertissez des fichiers de présentation en PDF. Chaque diapositive devient une page du document de sortie, avec texte, images, formes et transitions rendus par un moteur LibreOffice exécuté dans le navigateur. Les formats PowerPoint modernes et anciens sont pris en charge, ainsi que le format OpenDocument Presentation. + +## Formats pris en charge + +| Format | Extensions | +| :------------------------ | :--------- | +| PowerPoint (moderne) | `.pptx` | +| PowerPoint (ancien) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers de présentation. +2. Vérifiez la liste des fichiers. Ajoutez-en ou retirez-en selon vos besoins. +3. Cliquez sur **Convertir en PDF**. Le moteur LibreOffice se charge à la première utilisation, puis convertit chaque fichier. +4. Un fichier unique est téléchargé directement en PDF. Plusieurs fichiers sont regroupés dans `powerpoint-converted.zip`. + +## Options + +Cet outil n'a aucun réglage supplémentaire. Les diapositives sont rendues à leurs dimensions d'origine. + +## Résultat + +| Nombre de fichiers | Résultat | +| :----------------- | :-------------------------------------------------------------------- | +| 1 fichier | Téléchargement d'un seul PDF (nom d'origine avec l'extension `.pdf`) | +| 2 fichiers ou plus | Archive ZIP (`powerpoint-converted.zip`) contenant un PDF par fichier | + +## Cas d'usage + +- Convertir une présentation en PDF avant de la partager avec un public qui n'a pas forcément PowerPoint +- Créer une version imprimable d'un diaporama pour une conférence ou un atelier +- Archiver des présentations dans un format qui s'affiche de façon identique sur tous les appareils +- Convertir par lots une bibliothèque de présentations ODP de LibreOffice Impress en PDF +- Produire une version PDF d'un pitch deck pour l'envoyer en pièce jointe + +## Conseils + +- Les animations et transitions des diapositives ne sont pas représentées dans le PDF. Chaque diapositive est capturée comme une page statique. +- Les vidéos intégrées n'apparaissent pas dans le résultat. Remplacez-les par une capture d'écran ou une image de substitution si nécessaire. +- Les notes du présentateur ne sont pas incluses dans l'export PDF par défaut. Si vous avez besoin des notes, exportez d'abord depuis la vue « Imprimer les notes » de PowerPoint. +- Le moteur LibreOffice reste en cache après le premier chargement, la conversion d'une deuxième présentation dans la même session est donc bien plus rapide. + +## Outils associés + +- [Word vers PDF](./word-to-pdf) +- [Excel vers PDF](./excel-to-pdf) +- [Images vers PDF](./image-to-pdf) diff --git a/docs/fr/tools/prepare-pdf-for-ai.md b/docs/fr/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..4bc8114c --- /dev/null +++ b/docs/fr/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Préparer le PDF pour l'IA +description: Extrayez le contenu d'un PDF en JSON structuré, optimisé pour les LLM et les pipelines d'IA comme LlamaIndex. Traitement par lots pris en charge. +--- + +# Préparer le PDF pour l'IA + +Extrait le contenu de fichiers PDF et le structure en JSON optimisé pour l'ingestion par les grands modèles de langage (LLM) et les frameworks d'IA comme LlamaIndex. Le contenu de chaque page est extrait et organisé dans un format structuré, prêt pour des pipelines RAG, des chatbots ou des systèmes de recherche sémantique. + +## Fonctionnement + +1. Importez un ou plusieurs PDF en cliquant sur la zone de dépôt ou en y glissant des fichiers. +2. Cliquez sur **Extraire** pour lancer le traitement. +3. Un fichier unique est téléchargé sous le nom `filename_llm.json`. Plusieurs fichiers produisent une archive `pdf-for-ai.zip`. + +L'outil utilise l'intégration LlamaIndex de PyMuPDF pour extraire le contenu page par page avec ses métadonnées, ce qui donne un résultat directement chargeable dans les frameworks d'IA. + +## Options + +Cet outil n'a aucune option configurable. Toutes les pages sont extraites avec le texte complet et les métadonnées. + +## Format de sortie + +- **Fichier unique** : `filename_llm.json` +- **Plusieurs fichiers** : `pdf-for-ai.zip` contenant un fichier `_llm.json` par PDF d'entrée. + +Le JSON respecte le schéma de document LlamaIndex, avec le texte de chaque page et des champs de métadonnées. + +## Cas d'usage + +- Préparer des documents PDF pour des pipelines de génération augmentée par récupération (RAG). +- Construire une base de connaissances interrogeable à partir d'archives PDF pour un chatbot IA. +- Alimenter des workflows d'analyse basés sur des LLM avec des rapports PDF. +- Prétraiter des articles de recherche pour des systèmes de recherche sémantique et de questions-réponses. +- Créer des données d'entraînement structurées à partir de collections de documents PDF. + +## Conseils + +- Pour une extraction de texte brut sans formatage propre à l'IA, utilisez [PDF vers texte](./pdf-to-text). +- Pour une sortie Markdown qui conserve les titres et la structure, utilisez [PDF vers Markdown](./pdf-to-markdown). +- Les PDF numérisés produiront un résultat vide ou minimal. Passez-les d'abord par l'OCR pour ajouter une couche de texte avant l'extraction. + +## Outils associés + +- [PDF vers texte](./pdf-to-text) +- [PDF vers Markdown](./pdf-to-markdown) +- [PDF vers JSON](./pdf-to-json) diff --git a/docs/fr/tools/protect-pdf.md b/docs/fr/tools/protect-pdf.md new file mode 100644 index 00000000..65ecc27a --- /dev/null +++ b/docs/fr/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Protéger un PDF +description: Protégez vos fichiers PDF par mot de passe avec un chiffrement AES 256 bits. Définissez des mots de passe utilisateur et propriétaire avec des restrictions d'usage configurables. +--- + +# Protéger un PDF + +Verrouillez votre PDF par un mot de passe pour que seules les personnes autorisées puissent l'ouvrir. BentoPDF utilise le chiffrement AES 256 bits, le même standard que celui des banques et des administrations, appliqué entièrement dans votre navigateur via QPDF. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Saisissez un **mot de passe utilisateur** (obligatoire). C'est le mot de passe nécessaire pour ouvrir le fichier. +3. Saisissez éventuellement un **mot de passe propriétaire**. Une fois défini, le PDF reçoit des restrictions d'usage qui empêchent l'impression, la modification, la copie et l'annotation. +4. Cliquez sur **Chiffrer le PDF**. +5. Téléchargez le fichier chiffré. + +## Types de mots de passe + +### Mot de passe utilisateur (obligatoire) + +Le mot de passe utilisateur est celui que les destinataires saisissent pour ouvrir le PDF. Sans lui, le document est totalement inaccessible. Tout PDF chiffré doit en avoir un. + +### Mot de passe propriétaire (facultatif) + +Le mot de passe propriétaire contrôle ce qu'un utilisateur autorisé peut faire après l'ouverture du fichier. Lorsque vous définissez un mot de passe propriétaire distinct, BentoPDF applique automatiquement le jeu de restrictions le plus strict : + +- Modification désactivée +- Extraction et copie désactivées +- Impression désactivée +- Annotation désactivée +- Remplissage de formulaires désactivé +- Assemblage du document désactivé + +Si vous laissez le mot de passe propriétaire vide, le PDF est chiffré (le mot de passe utilisateur reste requis pour l'ouvrir) mais n'a aucune restriction d'usage une fois ouvert. + +## Détails du chiffrement + +- **Algorithme** : AES-256 (Advanced Encryption Standard 256 bits) +- **Longueur de clé** : 256 bits +- **Standard** : chiffrement PDF 2.0 (implémentation QPDF) + +Avec la technologie actuelle, l'AES-256 est impossible à casser par force brute. La sécurité de votre PDF chiffré dépend entièrement de la robustesse de votre mot de passe. + +## Cas d'usage + +- Protéger des rapports financiers confidentiels avant de les envoyer par email +- Sécuriser des documents juridiques partagés avec la partie adverse +- Ajouter un mot de passe à des dossiers médicaux ou à des données personnelles identifiables +- Distribuer du contenu payant (e-books, rapports) avec contrôle d'accès +- Respecter des politiques de protection des données qui exigent le chiffrement au repos + +## Conseils + +- Utilisez un mot de passe fort et unique. Une phrase de passe d'au moins 12 caractères mêlant majuscules, minuscules, chiffres et symboles est idéale. +- Partagez le mot de passe par un canal distinct (téléphone, SMS), jamais dans le même email que le PDF. +- Si vous voulez seulement restreindre des actions (pas d'impression, pas de copie) sans exiger de mot de passe pour ouvrir le fichier, utilisez plutôt l'outil Modifier les autorisations. + +## Outils associés + +- [Déchiffrer un PDF](./unlock-pdf) : retirer le chiffrement quand vous connaissez le mot de passe +- [Modifier les autorisations](./change-permissions) : modifier des restrictions d'usage précises +- [Supprimer les restrictions](./remove-restrictions) : retirer toute la sécurité d'un PDF +- [Nettoyer un PDF](./sanitize-pdf) : supprimer le contenu masqué avant de chiffrer diff --git a/docs/fr/tools/psd-to-pdf.md b/docs/fr/tools/psd-to-pdf.md new file mode 100644 index 00000000..c11aac8d --- /dev/null +++ b/docs/fr/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD vers PDF +description: Convertissez des fichiers Photoshop (PSD) en PDF dans votre navigateur. Gratuit, privé, sans logiciel Adobe. +--- + +# PSD vers PDF + +Convertissez des fichiers Adobe Photoshop PSD en documents PDF. Le PSD est le format natif de Photoshop, et l'ouvrir nécessite normalement un logiciel Adobe coûteux. Cet outil restitue l'image composite aplatie de votre fichier PSD sous la forme d'une page PDF en pleine résolution. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :-------------- | :-------- | :--------------------------------- | +| Adobe Photoshop | `.psd` | Restitue l'image composite aplatie | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers PSD. Plusieurs fichiers sont pris en charge. +2. Vérifiez la liste des fichiers. Retirez les fichiers indésirables avec l'icône de corbeille, ou utilisez **Ajouter des fichiers** pour en inclure d'autres. +3. Cliquez sur **Convertir en PDF**. Le moteur PyMuPDF lit le fichier PSD et intègre l'image composite dans une page PDF à la résolution d'origine. +4. Un PSD unique produit un PDF. Si vous importez plusieurs fichiers PSD, ils sont combinés en un seul PDF de plusieurs pages nommé `psd_to_pdf.pdf`, chaque PSD devenant une page. + +## Options + +Aucun réglage n'est nécessaire. Le convertisseur utilise les données d'image aplaties du fichier PSD. + +## Cas d'usage + +- Prévisualiser des créations Photoshop sans ouvrir Photoshop +- Envoyer des épreuves de design à des clients qui n'ont pas Adobe Creative Suite +- Imprimer des visuels haute résolution à partir de fichiers PSD +- Créer un portfolio PDF à partir de plusieurs fichiers de design PSD : chacun devient une page d'un même document + +## Conseils + +- La conversion restitue la vue composite (aplatie) du PSD. Les calques individuels, les calques de réglage et les effets de calque ne sont pas conservés comme éléments séparés dans le PDF. +- Plusieurs fichiers PSD sont fusionnés en un seul PDF de plusieurs pages plutôt qu'en PDF individuels. C'est pratique pour constituer des portfolios ou des lookbooks. +- Les fichiers PSD de très haute résolution (fichiers d'impression à plus de 300 DPI) produisent de gros PDF. L'outil conserve la pleine résolution. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [PNG vers PDF](./png-to-pdf) +- [VSD vers PDF](./vsd-to-pdf) diff --git a/docs/fr/tools/pub-to-pdf.md b/docs/fr/tools/pub-to-pdf.md new file mode 100644 index 00000000..79eef363 --- /dev/null +++ b/docs/fr/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB vers PDF +description: Convertissez des fichiers Microsoft Publisher (PUB) en PDF dans votre navigateur. Gratuit, privé, sans logiciel à installer. +--- + +# PUB vers PDF + +Convertissez des fichiers Microsoft Publisher en PDF. Publisher est un outil de PAO fourni avec certaines éditions de Microsoft Office, mais la plupart des gens ne l'ont pas installé. Cet outil permet à tout le monde de convertir des fichiers PUB en PDF directement dans le navigateur, sans logiciel Microsoft. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :------------------ | :-------- | :----------------------------------------------- | +| Microsoft Publisher | `.pub` | Documents de publication assistée par ordinateur | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers PUB. Vous pouvez en importer plusieurs à la fois. +2. Vérifiez la liste des fichiers. Retirez les fichiers indésirables avec l'icône de corbeille, ou cliquez sur **Ajouter des fichiers** pour en ajouter. +3. Cliquez sur **Convertir en PDF**. Un moteur basé sur LibreOffice se charge dans le navigateur et convertit chaque fichier PUB en préservant la mise en page, les images et les zones de texte. +4. Un fichier unique est téléchargé directement en PDF. Plusieurs fichiers sont livrés dans une archive ZIP nommée `pub-to-pdf.zip`. + +## Options + +Aucune configuration supplémentaire n'est nécessaire. Le convertisseur gère automatiquement le moteur de mise en page PUB. + +## Cas d'usage + +- Ouvrir un flyer ou une newsletter PUB envoyé par un client sans acheter Microsoft Publisher +- Convertir des bulletins paroissiaux, des programmes d'événements ou des bulletins scolaires créés dans Publisher +- Archiver des supports marketing créés dans Publisher dans un format universellement accessible +- Imprimer des fichiers PUB sur un système où Publisher n'est pas installé + +## Conseils + +- Les mises en page Publisher complexes avec des zones de texte superposées et un positionnement précis peuvent se décaler légèrement pendant la conversion. Vérifiez le résultat si le positionnement exact est critique. +- Le moteur LibreOffice s'initialise une fois par session. La première conversion prend plus de temps, les suivantes sont plus rapides. +- Pour une conversion la plus fidèle possible des fichiers Publisher, assurez-vous que les polices personnalisées de l'original sont des polices système standard. + +## Outils associés + +- [VSD vers PDF](./vsd-to-pdf) +- [ODP vers PDF](./odp-to-pdf) diff --git a/docs/fr/tools/rasterize-pdf.md b/docs/fr/tools/rasterize-pdf.md new file mode 100644 index 00000000..155648c9 --- /dev/null +++ b/docs/fr/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rastériser le PDF +description: Convertissez les pages d'un PDF en PDF composé d'images. Aplatissez tous les calques, supprimez le texte sélectionnable et contrôlez le DPI et le format d'image. +--- + +# Rastériser le PDF + +La rastérisation convertit chaque page d'un PDF en image, puis réassemble ces images en PDF. Le résultat est identique à l'original à l'œil, mais ne contient ni texte sélectionnable, ni éléments interactifs, ni calques modifiables. C'est en quelque sorte une photocopie de haute qualité. + +## Fonctionnement + +1. Importez un ou plusieurs fichiers PDF. +2. Définissez le **DPI** (résolution) de la sortie rastérisée. +3. Choisissez un **format d'image** : PNG pour une qualité sans perte ou JPEG pour des fichiers plus légers. +4. Cochez éventuellement **Convertir en niveaux de gris**. +5. Cliquez sur **Rastériser le PDF**. Plusieurs fichiers sont téléchargés dans un ZIP. + +## Options + +| Réglage | Valeurs | Par défaut | +| ------------------- | ----------------------------------- | ---------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Format d'image** | PNG (sans perte), JPEG (plus léger) | PNG | +| **Niveaux de gris** | Oui/Non | Non | + +## Repères pour le DPI + +- **72** : affichage à l'écran uniquement, taille de fichier minimale +- **150** : bon compromis pour un usage général +- **200** : texte plus net, taille de fichier modérée +- **300** : qualité d'impression +- **600** : archivage de haute qualité ou impression professionnelle + +## Cas d'usage + +- Empêcher l'extraction du texte de documents confidentiels avant de les partager +- Éliminer les problèmes de dépendance aux polices en convertissant le texte en pixels +- Créer une version « à plat » d'un PDF aux calques ou transparences complexes qui s'affiche différemment selon les lecteurs +- Préparer un PDF pour un système qui n'accepte que des entrées sous forme d'images +- Supprimer le contenu masqué (comme les modifications suivies ou les données de formulaire) en réduisant le PDF à de simples images + +## Conseils + +- 150 DPI en PNG est un bon réglage par défaut. N'augmentez que si vous avez besoin d'une sortie imprimée ou de zoomer sur de fins détails. +- Le JPEG produit des fichiers nettement plus légers, mais introduit des artefacts de compression sur les bords nets du texte. +- La rastérisation est irréversible : conservez votre PDF d'origine si vous pourriez avoir besoin de texte modifiable plus tard. + +## Outils associés + +- [Compresser un PDF](./compress-pdf) : réduire la taille du PDF rastérisé +- [Redresser un PDF](./deskew-pdf) : redresser les pages avant de rastériser des documents numérisés +- [Polices en contours](./font-to-outline) : convertir les polices en tracés vectoriels pour conserver l'échelle +- [Aplatir le PDF](./flatten-pdf) : aplatir les formulaires sans convertir en images diff --git a/docs/fr/tools/remove-annotations.md b/docs/fr/tools/remove-annotations.md new file mode 100644 index 00000000..091bbf92 --- /dev/null +++ b/docs/fr/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Supprimer les annotations +description: Retirez en un clic tous les commentaires, surlignages, liens et autres annotations de votre PDF. +--- + +# Supprimer les annotations + +Nettoyez votre PDF en supprimant toutes les annotations : commentaires, surlignages, notes autocollantes, marquages de texte, liens, tampons et tout autre objet d'annotation intégré au document. Le contenu sous-jacent des pages (texte, images, graphiques) reste intact. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. L'outil détecte le nombre de pages du document et affiche les informations du fichier. +3. Cliquez sur **Supprimer les annotations** pour lancer le traitement. +4. Le PDF nettoyé est téléchargé automatiquement, sans aucune annotation. + +## Fonctionnalités + +- Supprime tous les types d'annotations : commentaires, surlignages, soulignements, textes barrés, notes autocollantes, tampons, liens et marquages de formulaire +- Traite chaque page du document +- Préserve tout le contenu qui n'est pas une annotation (texte, images, graphiques vectoriels, champs de formulaire) +- Affiche le nombre de pages et la taille du fichier avant le traitement + +## Cas d'usage + +- Nettoyer un document avant sa diffusion finale, après un cycle de relecture où plusieurs relecteurs ont ajouté des commentaires +- Retirer les surlignages et les notes autocollantes d'un guide d'étude partagé +- Supprimer les annotations de lien d'un document avant de l'archiver +- Préparer une version « propre » d'un document juridique très annoté pendant la négociation +- Retirer les commentaires des relecteurs d'un manuscrit avant l'envoi à l'impression + +## Conseils + +- Cet outil supprime les annotations au niveau de la structure du PDF : le résultat conserve le texte sélectionnable et la qualité d'origine, sans rastérisation. +- Si vous voulez ne supprimer que certaines annotations plutôt que toutes, utilisez l'[Éditeur PDF](./edit-pdf) pour supprimer des annotations une à une. +- Les annotations des PDF aplatis (où elles ont été fusionnées dans le contenu de la page) ne peuvent pas être supprimées, car ce ne sont plus des objets distincts. + +## Outils associés + +- [Éditeur PDF](./edit-pdf) +- [Ajouter un filigrane](./add-watermark) +- [Signer un PDF](./sign-pdf) diff --git a/docs/fr/tools/remove-blank-pages.md b/docs/fr/tools/remove-blank-pages.md new file mode 100644 index 00000000..8f127b3a --- /dev/null +++ b/docs/fr/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Supprimer les pages blanches +description: Détectez et supprimez automatiquement les pages blanches ou presque blanches de votre PDF grâce à une sensibilité réglable. +--- + +# Supprimer les pages blanches + +Analysez votre PDF pour repérer les pages blanches ou presque blanches et les supprimer automatiquement. L'outil restitue chaque page et analyse ses pixels pour déterminer si elle est blanche, puis vous laisse confirmer les pages à supprimer avant le traitement. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. Ajustez le curseur **Sensibilité** pour définir la rigueur avec laquelle une page est considérée comme « blanche ». +3. Cliquez sur **Détecter les pages blanches** pour analyser le document. +4. L'outil affiche des miniatures des pages blanches détectées pour que vous puissiez les vérifier. +5. Confirmez la sélection et téléchargez le PDF nettoyé, sans les pages blanches. + +## Options + +- **Sensibilité** : un curseur de 0 % à 100 % (80 % par défaut). Des valeurs élevées sont plus strictes et ne signalent que les pages totalement ou presque blanches. Des valeurs basses sont plus permissives et détectent aussi les pages au contenu minimal, comme un simple point ou un filigrane discret. + +## Fonctionnalités + +- Analyse au niveau du pixel de chaque page pour détecter le contenu vide +- Curseur de sensibilité réglable pour affiner la détection +- Aperçu en miniatures des pages blanches détectées pour une vérification manuelle +- Préserve exactement toutes les pages non blanches +- Gère les documents de toute taille ou de tout nombre de pages +- Indication de progression pendant l'analyse + +## Cas d'usage + +- Nettoyer des documents numérisés dont le scanner a capturé les versos vides d'originaux recto seul +- Retirer les pages de séparation de lots de documents numérisés en masse +- Supprimer les pages blanches insérées par des systèmes de gestion de documents +- Nettoyer des PDF exportés depuis des traitements de texte qui ajoutent parfois des pages blanches à la fin +- Réduire la taille du fichier en supprimant les pages vides inutiles + +## Conseils + +- Commencez avec la sensibilité par défaut de 80 % et ajustez ensuite. Si l'outil rate des pages qui vous semblent blanches, baissez la sensibilité. S'il signale des pages au contenu léger que vous voulez garder, augmentez-la. +- L'outil restitue chaque page pour analyser son contenu : le temps de traitement augmente donc avec le nombre de pages. Pour de très gros documents, prévoyez une courte attente. +- Vérifiez les pages blanches détectées dans l'aperçu en miniatures avant de confirmer la suppression. Les pages avec des en-têtes, pieds de page ou filigranes discrets peuvent être signalées selon la sensibilité. + +## Outils associés + +- [Rogner un PDF](./crop-pdf) +- [Éditeur PDF](./edit-pdf) +- [Numéros de page](./page-numbers) diff --git a/docs/fr/tools/remove-metadata.md b/docs/fr/tools/remove-metadata.md new file mode 100644 index 00000000..0ce379ca --- /dev/null +++ b/docs/fr/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Supprimer les métadonnées +description: 'Supprimez toutes les métadonnées cachées des fichiers PDF : auteur, titre, date de création, producteur, données XMP et identifiants de document.' +--- + +# Supprimer les métadonnées + +Chaque PDF porte des métadonnées qui peuvent révéler qui l'a créé, quel logiciel a été utilisé, quand il a été modifié pour la dernière fois, et plus encore. Cet outil supprime tout : le dictionnaire d'informations, les flux de métadonnées XMP, les identifiants de document et les données propres aux applications, pour obtenir un document propre qui ne garde aucune trace de son origine. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Cliquez sur **Supprimer les métadonnées**. +3. Téléchargez le fichier nettoyé. + +Aucune option à configurer. L'outil est volontairement exhaustif : il efface tout. + +## Ce qui est supprimé + +- **Champs du dictionnaire d'informations** : titre, auteur, sujet, mots-clés, créateur, producteur, date de création, date de modification +- **Flux de métadonnées XMP** : le bloc de métadonnées XML stocké dans le catalogue du document +- **Identifiants de document** : identifiants uniques dans le trailer du PDF, qui peuvent servir à suivre un document d'un système à l'autre +- **PieceInfo** : métadonnées propres aux applications, ajoutées par des programmes comme Illustrator ou InDesign + +## Ce qui est conservé + +- Tout le contenu visible des pages (texte, images, graphiques) +- Les champs de formulaire et les annotations +- Les signets et les liens +- La structure du document elle-même + +## Cas d'usage + +- Retirer votre nom et votre organisation d'un document avant de le publier anonymement +- Supprimer les horodatages de création qui révèlent quand un document a été préparé +- Nettoyer les chaînes de producteur qui identifient votre pile logicielle PDF +- Préparer des documents pour des dépôts réglementaires qui exigent des PDF sans métadonnées +- Effacer les traces d'historique de modification avant de partager un document à l'extérieur + +## Conseils + +- Utilisez d'abord l'outil Afficher les métadonnées pour voir exactement ce que contient votre PDF avant de les supprimer. +- Si vous devez supprimer les métadonnées _et_ le JavaScript, les annotations et les fichiers intégrés, utilisez Nettoyer un PDF pour un nettoyage plus complet. +- La suppression des métadonnées est définitive. Conservez votre original si vous pourriez avoir besoin de ces données plus tard. + +## Outils associés + +- [Nettoyer un PDF](./sanitize-pdf) : supprimer les métadonnées, mais aussi les scripts, les pièces jointes et plus encore +- [Protéger un PDF](./protect-pdf) : protéger le PDF nettoyé par un mot de passe +- [Compresser un PDF](./compress-pdf) : la suppression des métadonnées peut réduire légèrement la taille du fichier, la compression permet d'économiser davantage diff --git a/docs/fr/tools/remove-restrictions.md b/docs/fr/tools/remove-restrictions.md new file mode 100644 index 00000000..6b170812 --- /dev/null +++ b/docs/fr/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Supprimer les restrictions +description: Retirez la protection par mot de passe, les restrictions d'impression, les verrous de modification et les limites de copie des fichiers PDF. +--- + +# Supprimer les restrictions + +Un PDF peut porter deux types de mots de passe : un mot de passe utilisateur (nécessaire pour ouvrir le fichier) et un mot de passe propriétaire (qui contrôle ce que vous pouvez en faire). Cet outil supprime les deux, ainsi que toutes les restrictions associées : verrous d'impression, de modification, de copie et d'annotation. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Si le PDF a un mot de passe propriétaire, saisissez-le dans le champ **Mot de passe propriétaire**. Laissez-le vide si le PDF n'a que des restrictions d'usage sans mot de passe. +3. Cliquez sur **Supprimer les restrictions**. +4. Téléchargez le PDF sans restrictions. + +L'outil utilise les options `--decrypt` et `--remove-restrictions` de QPDF pour produire une copie propre et sans restrictions. + +## Ce qui est supprimé + +- La protection par mot de passe (utilisateur et propriétaire) +- Les restrictions d'impression +- Les restrictions de modification +- Les restrictions de copie du texte et des images +- Les restrictions d'annotation et de commentaire +- Toutes les autres limitations de sécurité encodées dans le PDF + +## Cas d'usage + +- Déverrouiller un PDF qui vous appartient mais dont vous avez défini le mot de passe il y a des années +- Retirer les restrictions d'impression d'un document auquel vous avez légitimement accès +- Activer le copier-coller sur des documents de référence pour la prise de notes +- Préparer des PDF pour des outils d'accessibilité qui ne gèrent pas les documents restreints + +## Conseils + +- Vous devez connaître le mot de passe propriétaire s'il y en a un. Cet outil ne casse pas et ne devine pas les mots de passe par force brute. +- Si vous voulez garder le fichier chiffré tout en modifiant certaines autorisations, utilisez plutôt l'outil Modifier les autorisations. +- Le fichier de sortie n'a aucun chiffrement : toute personne qui le reçoit peut l'ouvrir librement. + +## Outils associés + +- [Déchiffrer un PDF](./unlock-pdf) : déverrouiller un PDF quand vous connaissez le mot de passe utilisateur +- [Protéger un PDF](./protect-pdf) : réappliquer un chiffrement avec de nouveaux réglages +- [Modifier les autorisations](./change-permissions) : modifier de façon sélective les actions autorisées diff --git a/docs/fr/tools/repair-pdf.md b/docs/fr/tools/repair-pdf.md new file mode 100644 index 00000000..9deb625d --- /dev/null +++ b/docs/fr/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Réparer un PDF +description: Récupérez les données de fichiers PDF corrompus ou endommagés grâce au moteur de réparation de QPDF. Traitement par lots pris en charge. +--- + +# Réparer un PDF + +Quand un PDF refuse de s'ouvrir, affiche un contenu illisible ou provoque des erreurs dans votre lecteur, cet outil tente de reconstruire sa structure interne. Il utilise le moteur de réparation de QPDF, capable de récupérer des données après de nombreux types de corruption : tables de références croisées cassées, flux tronqués, références d'objets invalides, et plus encore. + +## Fonctionnement + +1. Importez un ou plusieurs fichiers PDF endommagés. +2. Cliquez sur **Réparer le PDF**. +3. Un fichier réparé unique est téléchargé directement. Plusieurs fichiers produisent une archive ZIP. + +L'outil fait passer chaque fichier dans QPDF avec l'option `--decrypt`, qui force QPDF à lire et réécrire toute la structure du PDF, en corrigeant au passage les problèmes récupérables. + +## Fonctionnalités + +- Réparation par lots de plusieurs PDF en une seule opération +- Détection automatique des fichiers récupérables et irrécupérables +- Rapport de réussite ou d'échec par fichier lors du traitement de plusieurs fichiers +- Utilise QPDF (WebAssembly), une bibliothèque de transformation de PDF éprouvée + +## Ce qu'il peut corriger + +- Tables de références croisées cassées ou manquantes +- Fins de fichier tronquées après un téléchargement incomplet +- Numérotation d'objets et longueurs de flux invalides +- Incohérences structurelles mineures causées par des générateurs de PDF défectueux +- Artefacts de chiffrement issus de tentatives de déchiffrement ayant échoué + +## Ce qu'il ne peut pas corriger + +- Fichiers fortement tronqués dont la majeure partie du contenu est manquante +- PDF chiffrés avec un mot de passe que vous n'avez pas +- Fichiers qui ne sont pas réellement des PDF (mauvaise extension) +- Corruption d'images dans le PDF (la structure est corrigée, mais les données de pixels ne sont pas régénérées) + +## Cas d'usage + +- Récupérer un PDF issu d'un téléchargement d'email raté +- Ouvrir des fichiers produits par des générateurs de PDF anciens ou non standard +- Corriger des PDF qui fonctionnent dans un lecteur mais pas dans un autre +- Préparer des documents d'archives endommagés pour un stockage à long terme + +## Conseils + +- Si la réparation échoue, essayez d'abord d'ouvrir le fichier dans un navigateur : les navigateurs ont leur propre logique de récupération et peuvent afficher assez de contenu pour permettre un nouvel enregistrement. +- Pour les PDF chiffrés dont la réparation échoue, essayez d'abord Déverrouiller un PDF, puis réparez le résultat déchiffré. + +## Outils associés + +- [Compresser un PDF](./compress-pdf) : nettoyer davantage la structure du PDF réparé +- [Linéariser un PDF](./linearize-pdf) : optimiser le fichier réparé pour une diffusion sur le web +- [Aplatir le PDF](./flatten-pdf) : aplatir les formulaires qui ont pu être endommagés diff --git a/docs/fr/tools/reverse-pages.md b/docs/fr/tools/reverse-pages.md new file mode 100644 index 00000000..ef1baf03 --- /dev/null +++ b/docs/fr/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Inverser l’ordre des pages +description: Inversez l'ordre des pages d'un ou plusieurs fichiers PDF pour que la dernière page devienne la première. +--- + +# Inverser l’ordre des pages + +Inversez l'ordre des pages d'un PDF pour que la dernière page devienne la première, l'avant-dernière la deuxième, et ainsi de suite. Le traitement par lots de plusieurs fichiers à la fois est pris en charge. + +## Fonctionnement + +1. Importez un ou plusieurs fichiers PDF. +2. Cliquez sur le bouton de traitement. +3. Chaque fichier est inversé indépendamment. Si vous avez importé plusieurs fichiers, le résultat est une archive ZIP contenant tous les PDF inversés. +4. Un fichier unique est téléchargé directement sous forme de PDF inversé. + +## Fonctionnalités + +- Traitement par lots : inversez plusieurs PDF en une seule opération +- Sortie en fichier unique pour un PDF, en ZIP pour plusieurs +- Boutons de suppression par fichier avant le traitement +- Préserve tout le contenu et la mise en forme des pages + +## Cas d'usage + +- Corriger un document numérisé dans l'ordre inverse +- Préparer un PDF de présentation à lire de la fin vers le début +- Inverser l'ordre des pages pour des flux d'impression qui alimentent les pages à l'envers +- Corriger un document dont les pages ont été assemblées à l'envers par erreur + +## Conseils + +- Chaque fichier d'un lot est inversé indépendamment : les fichiers eux-mêmes ne sont pas réordonnés les uns par rapport aux autres. +- Pour un réordonnancement plus fin des pages (pas seulement une inversion complète), utilisez [Dupliquer et organiser](./organize-pdf). + +## Outils associés + +- [Dupliquer et organiser](./organize-pdf) +- [Faire pivoter un PDF](./rotate-pdf) +- [Outil PDF tout-en-un](./pdf-multi-tool) diff --git a/docs/fr/tools/rotate-custom.md b/docs/fr/tools/rotate-custom.md new file mode 100644 index 00000000..81899ee5 --- /dev/null +++ b/docs/fr/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Rotation par angle personnalisé +description: Faites pivoter les pages d'un PDF selon n'importe quel angle, avec une saisie en degrés par page et des commandes de rotation par lots. +--- + +# Rotation par angle personnalisé + +Faites pivoter les pages d'un PDF selon un angle quelconque, pas seulement par incréments de 90 degrés. Chaque page dispose de son propre champ d'angle, et vous pouvez appliquer un même angle à toutes les pages à la fois grâce à la commande par lots. + +## Fonctionnement + +1. Importez un fichier PDF. Les miniatures de chaque page s'affichent. +2. Chaque page a un champ numérique indiquant son angle de rotation actuel. +3. Saisissez une valeur en degrés (positive ou négative) pour faire pivoter une page précise, ou utilisez les boutons gauche/droite de chaque page pour des ajustements rapides de 90 degrés. +4. Utilisez le champ d'**angle global** en haut pour définir une rotation uniforme pour toutes les pages. +5. Cliquez sur le bouton de traitement pour générer le PDF pivoté. + +## Fonctionnalités + +- Saisie libre des degrés par page (toute valeur entière) +- Commande d'angle global pour appliquer la même rotation à chaque page +- Aperçu de la rotation en temps réel dans les miniatures +- Boutons de rotation rapide par page par incréments de 90 degrés +- Miniatures chargées à la demande pour de bonnes performances sur les gros documents + +## Cas d'usage + +- Corriger de quelques degrés des numérisations légèrement inclinées +- Faire pivoter des pages pour respecter une exigence d'orientation non standard +- Appliquer des rotations précises à des pages individuelles dans un document au contenu mixte +- Affiner les angles des pages après une première rotation globale + +## Conseils + +- Les valeurs positives font pivoter dans le sens horaire, les valeurs négatives dans le sens antihoraire. +- Le champ d'angle global écrase tous les angles par page lorsqu'il est appliqué. Définissez les ajustements individuels après l'opération globale si nécessaire. +- Pour des rotations standard de 90/180/270 degrés avec une interface plus simple, utilisez [Faire pivoter un PDF](./rotate-pdf). + +## Outils associés + +- [Faire pivoter un PDF](./rotate-pdf) +- [Outil PDF tout-en-un](./pdf-multi-tool) +- [Dupliquer et organiser](./organize-pdf) diff --git a/docs/fr/tools/rotate-pdf.md b/docs/fr/tools/rotate-pdf.md new file mode 100644 index 00000000..235111ab --- /dev/null +++ b/docs/fr/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Faire pivoter un PDF +description: Faites pivoter des pages individuelles ou toutes les pages d'un PDF par incréments de 90 degrés grâce à une interface visuelle de miniatures. +--- + +# Faire pivoter un PDF + +Faites pivoter les pages d'un PDF de 90 degrés dans le sens horaire ou antihoraire. L'outil affiche un aperçu en miniature de chaque page, ce qui permet de les faire pivoter individuellement ou d'appliquer une rotation globale à tout le document. + +## Fonctionnement + +1. Importez un fichier PDF. Les miniatures de chaque page s'affichent en grille. +2. Utilisez les boutons de rotation gauche/droite sous chaque miniature pour faire pivoter cette page précise. +3. Utilisez les commandes de rotation globale en haut pour faire pivoter toutes les pages à la fois. +4. L'aperçu en miniature se met à jour en temps réel pour montrer la rotation. +5. Cliquez sur le bouton de traitement pour enregistrer le PDF pivoté. + +## Fonctionnalités + +- Rotation par page par incréments de 90 degrés (gauche ou droite) +- Rotation globale de toutes les pages simultanément +- Aperçu en miniature en temps réel avec transitions de rotation animées +- Miniatures chargées à la demande pour de bonnes performances sur les gros documents +- Préserve le contenu et la qualité d'origine des pages + +## Cas d'usage + +- Corriger des pages numérisées de travers ou à l'envers +- Faire passer des pages du mode paysage au mode portrait (ou l'inverse) +- Corriger un document d'orientation mixte dont certaines pages ont été numérisées sous le mauvais angle +- Préparer un document pour une orientation d'affichage précise + +## Conseils + +- Les rotations sont cumulatives. Cliquer deux fois sur le bouton horaire applique une rotation de 180 degrés. +- Pour des rotations qui ne sont pas des multiples de 90 degrés (par ex. 45 degrés pour corriger une numérisation légèrement inclinée), utilisez plutôt [Rotation par angle personnalisé](./rotate-custom). +- Les commandes de rotation globale affectent toutes les pages, pas seulement celles qui sont sélectionnées. Cet outil n'a pas de mécanisme de sélection : pour cela, utilisez l'[Outil PDF tout-en-un](./pdf-multi-tool). + +## Outils associés + +- [Rotation par angle personnalisé](./rotate-custom) +- [Outil PDF tout-en-un](./pdf-multi-tool) +- [Dupliquer et organiser](./organize-pdf) diff --git a/docs/fr/tools/rtf-to-pdf.md b/docs/fr/tools/rtf-to-pdf.md new file mode 100644 index 00000000..ff2c9d65 --- /dev/null +++ b/docs/fr/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF vers PDF +description: Convertissez des fichiers Rich Text Format (RTF) en PDF dans votre navigateur grâce à un moteur propulsé par LibreOffice. +--- + +# RTF vers PDF + +Convertissez des documents Rich Text Format en PDF. Le RTF est un format de document multiplateforme pris en charge par pratiquement tous les traitements de texte. Cet outil utilise un moteur LibreOffice exécuté dans le navigateur pour restituer les fichiers RTF en conservant leur mise en forme : gras, italique, tableaux et images intégrées sont tous repris dans le PDF. + +## Formats pris en charge + +| Format | Extensions | Types MIME | +| :----- | :--------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez un ou plusieurs fichiers RTF. +2. Vérifiez la liste des fichiers. Ajoutez-en ou retirez-en selon vos besoins. +3. Cliquez sur **Convertir en PDF**. Le moteur LibreOffice s'initialise à la première utilisation, puis traite chaque fichier. +4. Un fichier unique est téléchargé directement en PDF. Plusieurs fichiers sont livrés sous la forme `rtf-converted.zip`. + +## Options + +Cet outil n'a aucun réglage supplémentaire. La conversion préserve la mise en forme RTF d'origine. + +## Résultat + +| Nombre de fichiers | Résultat | +| :----------------- | :------------------------------------------------------------- | +| 1 fichier | Téléchargement d'un seul PDF (par ex. `letter.pdf`) | +| 2 fichiers ou plus | Archive ZIP (`rtf-converted.zip`) contenant un PDF par fichier | + +## Cas d'usage + +- Convertir en PDF modernes des documents RTF hérités d'anciens traitements de texte +- Transformer des modèles d'email RTF en aperçus PDF +- Traiter les sorties RTF de logiciels juridiques ou médicaux +- Convertir par lots des fichiers RTF d'un système de gestion documentaire en PDF pour l'archivage + +## Conseils + +- Le moteur LibreOffice est chargé une fois puis mis en cache. La première conversion d'une session prend quelques secondes de plus, les suivantes sont plus rapides. +- Les fichiers RTF contenant des objets OLE intégrés peuvent ne pas restituer parfaitement tous les objets. Le texte brut, les images et la mise en forme standard se convertissent de façon fiable. +- Si vos fichiers RTF ont été créés avec Microsoft Word, vous pouvez aussi les convertir directement avec l'outil [Word vers PDF](./word-to-pdf), qui accepte le RTF en plus du DOC et du DOCX. + +## Outils associés + +- [Word vers PDF](./word-to-pdf) +- [ODT vers PDF](./odt-to-pdf) +- [Texte vers PDF](./txt-to-pdf) diff --git a/docs/fr/tools/sanitize-pdf.md b/docs/fr/tools/sanitize-pdf.md new file mode 100644 index 00000000..81c28aa4 --- /dev/null +++ b/docs/fr/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Nettoyer un PDF +description: 'Supprimez le contenu masqué et potentiellement dangereux des PDF : métadonnées, JavaScript, fichiers intégrés, annotations et calques.' +--- + +# Nettoyer un PDF + +Un PDF peut contenir bien plus que ce que vous voyez à l'écran. Des métadonnées cachées, du JavaScript intégré, des pièces jointes, des données de formulaire et des informations de calques peuvent divulguer des données sensibles ou présenter des risques de sécurité. Le nettoyage supprime tout cela et vous laisse un document propre, sûr à partager publiquement. + +## Fonctionnement + +1. Importez un fichier PDF. +2. Sélectionnez dans la liste les éléments à supprimer. +3. Cliquez sur **Nettoyer le PDF**. +4. Téléchargez le fichier nettoyé. + +## Options de nettoyage + +Toutes les options sont activées par défaut. Décochez celles que vous voulez conserver. + +| Option | Ce qu'elle supprime | +| ----------------------------------- | -------------------------------------------------------------------------------- | +| **Aplatir les formulaires** | Convertit les champs de formulaire interactifs en contenu statique | +| **Supprimer les métadonnées** | Supprime l'auteur, le titre, la date de création, le logiciel et les données XMP | +| **Supprimer les annotations** | Supprime les commentaires, surlignages, notes autocollantes et marquages | +| **Supprimer le JavaScript** | Élimine les scripts intégrés qui pourraient s'exécuter à l'ouverture | +| **Supprimer les fichiers intégrés** | Supprime les pièces jointes intégrées au PDF | +| **Supprimer les calques (OCG)** | Aplatit les groupes de contenu optionnel en un seul calque | +| **Supprimer les liens** | Supprime les hyperliens et les références d'URL | +| **Supprimer l'arbre de structure** | Retire la structure du document utilisée pour le balisage d'accessibilité | +| **Supprimer MarkInfo** | Supprime les informations de contenu balisé | +| **Supprimer les polices** | Retire les données de polices intégrées (à utiliser avec prudence) | + +## Cas d'usage + +- Préparer un PDF pour une diffusion publique en supprimant les métadonnées internes (noms d'auteurs, versions de logiciels, historique de modification) +- Retirer le JavaScript d'un PDF reçu d'une source non fiable avant de l'ouvrir +- Nettoyer un PDF avant de l'envoyer à un client qui ne doit pas voir les commentaires intégrés ou les noms de champs de formulaire +- Supprimer les calques masqués d'un plan d'architecte avant de partager la version finale +- Respecter les exigences de minimisation des données des réglementations sur la vie privée + +## Conseils + +- Laissez « Supprimer les polices » décoché sauf si vous êtes certain que le PDF s'affichera correctement. Supprimer les polices peut rendre le texte invisible dans certains lecteurs. +- Si vous avez seulement besoin de supprimer les métadonnées, l'outil dédié Supprimer les métadonnées est plus rapide et plus ciblé. +- Le nettoyage est irréversible. Conservez votre fichier d'origine. + +## Outils associés + +- [Supprimer les métadonnées](./remove-metadata) : supprimer uniquement les métadonnées sans toucher au reste du contenu +- [Aplatir le PDF](./flatten-pdf) : aplatir spécifiquement les formulaires et les annotations +- [Protéger un PDF](./protect-pdf) : ajouter une protection par mot de passe après le nettoyage +- [Rastériser le PDF](./rasterize-pdf) : l'option radicale, convertir en images pour éliminer tout contenu masqué diff --git a/docs/fr/tools/scanner-effect.md b/docs/fr/tools/scanner-effect.md new file mode 100644 index 00000000..1676b5d4 --- /dev/null +++ b/docs/fr/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Effet scanner +description: Donnez à votre PDF l'aspect d'un document numérisé avec du bruit, une rotation, un flou et un vieillissement du papier réglables. +--- + +# Effet scanner + +Transformez un PDF numérique propre en document qui semble sorti d'un scanner à plat. L'outil applique du bruit configurable, une légère rotation, du flou, des variations de luminosité et un jaunissement facultatif pour simuler les imperfections d'une vraie numérisation. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. L'éditeur s'ouvre avec un aperçu en direct de la première page à côté d'un panneau de réglages. +3. Ajustez les paramètres de l'effet scanner avec les curseurs et les interrupteurs. +4. L'aperçu se met à jour en temps réel à chaque modification. +5. Cliquez sur **Appliquer** pour traiter toutes les pages et télécharger le résultat. + +## Options + +- **Espace colorimétrique (interrupteur Niveaux de gris)** : convertit la sortie en niveaux de gris pour un rendu de numérisation classique en noir et blanc. +- **Bordure** : ajoute une fine bordure sombre sur les bords de la page pour imiter les artefacts de bordure d'un scanner. +- **Rotation** : applique une légère rotation (de -5 à +5 degrés) pour simuler une alimentation du papier mal alignée. +- **Variance de rotation** : ajoute une variation aléatoire à l'angle de rotation pour que chaque page soit inclinée légèrement différemment. +- **Luminosité** : augmente ou diminue la luminosité globale. +- **Contraste** : ajuste le contraste pour simuler les variations de qualité du toner. +- **Flou** : applique un flou gaussien pour adoucir les bords du texte comme sur une numérisation de mauvaise qualité. +- **Bruit** : ajoute du bruit de pixels aléatoire pour simuler le grain du capteur du scanner. Des valeurs élevées donnent un résultat plus granuleux. +- **Jaunâtre** : ajoute une teinte jaune chaude pour simuler un papier vieilli ou recyclé. +- **Résolution** : définit le DPI de sortie. Des valeurs plus basses créent un aspect plus pixellisé, typique d'une numérisation. +- **Réinitialiser** : rétablit tous les réglages par défaut. + +## Fonctionnalités + +- Aperçu en temps réel qui se met à jour à chaque ajustement +- Variance de rotation aléatoire par page pour une variation réaliste +- Dix paramètres réglables indépendamment +- Mode niveaux de gris pour une sortie de numérisation en noir et blanc authentique +- Contrôle de la résolution, de la qualité d'un fax en faible DPI à celle d'une archive en haut DPI + +## Cas d'usage + +- Donner à des documents créés numériquement l'apparence d'avoir été imprimés puis numérisés +- Simuler le vieillissement physique d'un document pour recréer un document historique +- Tester un logiciel d'OCR face à une qualité de numérisation dégradée +- Produire des documents qui correspondent au style visuel d'archives numérisées existantes + +## Conseils + +- Commencez avec des valeurs subtiles. Un niveau de bruit de 10 à 20, une légère rotation de 0,5 degré et un flou minimal suffisent déjà à produire un rendu de numérisation convaincant. +- Combinez le mode niveaux de gris avec un léger jaunissement pour un effet « photocopie de photocopie ». +- Les réglages de résolution plus bas (100 à 150 DPI) donnent l'apparence de télécopieur la plus réaliste. + +## Outils associés + +- [Inverser les couleurs](./invert-colors) +- [Ajuster les couleurs](./adjust-colors) +- [Couleur de fond](./background-color) diff --git a/docs/fr/tools/sign-pdf.md b/docs/fr/tools/sign-pdf.md new file mode 100644 index 00000000..057eea69 --- /dev/null +++ b/docs/fr/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Signer un PDF +description: Dessinez, saisissez ou importez une signature et placez-la sur les pages de votre PDF grâce à une visionneuse intégrée. +--- + +# Signer un PDF + +Ajoutez votre signature à n'importe quel document PDF. L'outil intègre une visionneuse PDF complète avec des outils de signature : vous pouvez dessiner une signature à main levée, saisir votre nom dans une police de signature ou importer une image de signature. Placez et redimensionnez les signatures sur n'importe quelle page, puis enregistrez le document signé. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. Le document s'ouvre dans une visionneuse PDF intégrée dotée d'outils d'annotation. +3. Utilisez l'outil de signature de la visionneuse pour créer votre signature en la dessinant, en la saisissant ou en important une image. +4. Cliquez sur la page à l'endroit où placer la signature, puis ajustez sa taille et sa position. +5. Cochez éventuellement **Aplatir le PDF** pour intégrer définitivement la signature au document. +6. Cliquez sur **Enregistrer et télécharger le PDF signé** pour obtenir votre fichier signé. + +## Options + +- **Aplatir le PDF** : lorsque cette option est cochée, la signature est intégrée définitivement au contenu de la page. Elle ne peut alors plus être déplacée ou supprimée par d'autres personnes. Lorsqu'elle est décochée, la signature reste une annotation modifiable dans les visionneuses compatibles. + +## Fonctionnalités + +- Trois méthodes de création de signature : dessin à main levée, texte saisi ou image importée +- Visionneuse PDF intégrée pour un placement précis +- Glissez pour positionner et redimensionner les signatures sur n'importe quelle page +- Aplatissement facultatif pour intégrer définitivement les signatures +- Prise en charge de plusieurs signatures dans un même document + +## Cas d'usage + +- Signer des contrats, des accords ou des formulaires d'approbation avant de les renvoyer +- Ajouter votre signature à des documents fiscaux, des déclarations de sinistre ou des formulaires administratifs +- Apposer vos initiales sur chaque page d'un accord de plusieurs pages +- Signer des accords de confidentialité ou des documents RH reçus en pièces jointes PDF + +## Conseils + +- Activez l'aplatissement si vous envoyez le PDF signé à quelqu'un qui ne doit pas pouvoir retirer ou repositionner votre signature. +- Pour des signatures numériques juridiquement contraignantes avec vérification par certificat, BentoPDF propose aussi un outil distinct de signature numérique. +- Importez une image de signature PNG à fond transparent pour obtenir le résultat le plus propre. + +## Outils associés + +- [Éditeur PDF](./edit-pdf) +- [Ajouter des tampons](./add-stamps) +- [Remplir un formulaire PDF](./form-filler) diff --git a/docs/fr/tools/split-pdf.md b/docs/fr/tools/split-pdf.md new file mode 100644 index 00000000..963f5f7e --- /dev/null +++ b/docs/fr/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Scinder un PDF +description: Scindez un PDF en fichiers plus petits par plage de pages, sélection visuelle, signets, pages paires/impaires ou intervalles fixes. +--- + +# Scinder un PDF + +Découpez un PDF en documents plus petits grâce à l'un des six modes de scission. Des simples plages de pages à la scission par signets, cet outil couvre tous les cas de division d'un document. + +## Fonctionnement + +1. Importez un seul fichier PDF. +2. Choisissez un mode de scission dans la liste déroulante. +3. Configurez les options propres au mode (plages de pages, sélections, etc.). +4. Cliquez sur le bouton de traitement. +5. Le résultat est téléchargé sous forme d'un PDF unique ou d'une archive ZIP selon le mode et les réglages. + +## Modes de scission + +| Mode | Description | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| **Plage** | Saisissez des plages de pages comme `1-3, 5, 8-10`. Plusieurs plages produisent des PDF séparés dans un ZIP. Une seule plage produit un PDF. | +| **Sélection visuelle** | Parcourez les miniatures et cliquez pour sélectionner les pages voulues. Les pages sélectionnées sont extraites dans un nouveau PDF. | +| **Paires / impaires** | Extrait uniquement les pages paires ou les pages impaires. | +| **Toutes les pages** | Scinde chaque page en un fichier PDF individuel, téléchargé sous forme de ZIP. | +| **Signets** | Scinde aux limites des signets. Choisissez le niveau de signet pour contrôler où les coupures ont lieu. | +| **Toutes les N pages** | Scinde en blocs de N pages chacun (par ex. toutes les 5 pages). Le dernier bloc peut contenir moins de pages. | + +## Fonctionnalités + +- Six modes de scission distincts couvrant pratiquement tous les cas d'usage +- Sélecteur de pages visuel avec miniatures chargées à la demande +- Scission par signets avec filtrage par niveau +- Option de sortie ZIP pour les modes plage et sélection visuelle +- Gère les plages de pages à la syntaxe mixte (`1-3, 5, 8-10`) +- Avertissement lorsque les scissions par N pages donnent des blocs inégaux + +## Cas d'usage + +- Extraire un chapitre ou une section précise d'un gros document +- Séparer les pages paires et impaires pour des flux d'impression recto verso +- Découper un PDF de livre en fichiers de chapitres individuels aux limites des signets +- Isoler des pages précises (comme la page de signature) d'un contrat +- Scinder un rapport compilé en fichiers par section pour la distribution + +## Conseils + +- Plusieurs plages de pages séparées par des virgules (par ex. `1-5, 10-15, 20-25`) produisent des PDF séparés, un par plage, regroupés dans un ZIP. +- Le mode de scission par signets exige que le PDF contienne réellement des signets. Si aucun n'est trouvé, un message d'erreur s'affiche. +- La case « Télécharger en ZIP » des modes Plage et Sélection visuelle vous permet d'obtenir un PDF par page au lieu d'un fichier combiné. + +## Outils associés + +- [Fusionner des PDF](./merge-pdf) +- [Extraire des pages](./extract-pages) +- [Supprimer des pages](./delete-pages) +- [Outil PDF tout-en-un](./pdf-multi-tool) diff --git a/docs/fr/tools/svg-to-pdf.md b/docs/fr/tools/svg-to-pdf.md new file mode 100644 index 00000000..80cdaebc --- /dev/null +++ b/docs/fr/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG vers PDF +description: Convertissez des graphiques vectoriels SVG en PDF avec contrôle de la qualité, entièrement dans votre navigateur. +--- + +# SVG vers PDF + +Convertissez des fichiers Scalable Vector Graphics (SVG) en PDF. L'outil rastérise chaque SVG via le moteur de rendu du navigateur, puis intègre le résultat à sa résolution native. Pratique pour transformer des icônes vectorielles, des diagrammes et des illustrations en documents portables. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :--------- | +| SVG | `.svg` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez un ou plusieurs fichiers SVG. +2. Vérifiez et gérez la liste des fichiers. +3. Choisissez un niveau de **qualité PDF**. +4. Cliquez sur **Convertir en PDF**. Le résultat est téléchargé sous le nom `from_svgs.pdf`. + +Chaque SVG est lu comme du texte, restitué sur un canevas à sa largeur et sa hauteur intrinsèques (800x600 par défaut si aucune dimension n'est indiquée), puis exporté en PNG. Ce PNG est ensuite intégré au PDF avec pdf-lib. Les zones transparentes sont remplies d'un fond blanc. + +## Options + +La **qualité PDF** contrôle la compression après la rastérisation : + +- **Haute qualité** : au plus près du rendu d'origine. +- **Qualité moyenne** (par défaut) : bon compromis. +- **Basse qualité** : fichier le plus léger, avec une certaine perte de détails. + +## Cas d'usage + +- Convertir des diagrammes d'architecture ou d'ingénierie de SVG en PDF prêt à imprimer +- Regrouper des jeux d'icônes dans un PDF de référence pour un design system +- Transformer des visualisations de données (D3.js, exports de bibliothèques de graphiques) en PDF prêts pour un rapport +- Créer des versions imprimables d'infographies basées sur du SVG + +## Conseils + +- Les fichiers SVG sans attributs `width` et `height` explicites sont restitués en 800x600 pixels. Pour de meilleurs résultats, définissez les dimensions dans la source SVG avant de convertir. +- Les SVG complexes avec des références de polices externes ou des images liées peuvent ne pas s'afficher parfaitement. Intégrez toutes les ressources dans le SVG pour un résultat fiable. +- Comme le SVG est rastérisé, le PDF contiendra une image bitmap plutôt que des tracés vectoriels. Pour obtenir un vrai PDF vectoriel, il faut un outil vectoriel dédié. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [PNG vers PDF](./png-to-pdf) +- [BMP vers PDF](./bmp-to-pdf) diff --git a/docs/fr/tools/table-of-contents.md b/docs/fr/tools/table-of-contents.md new file mode 100644 index 00000000..3bffabc9 --- /dev/null +++ b/docs/fr/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Table des matières +description: Générez une page de table des matières mise en forme à partir des signets existants de votre PDF. +--- + +# Table des matières + +Cet outil lit les signets (plan) de votre PDF et génère une page de table des matières mise en forme, ajoutée au début du document. Si votre PDF contient déjà des signets mais pas de page de table des matières visible, cet outil en crée une automatiquement. + +## Fonctionnement + +1. Importez un PDF qui contient des signets. +2. Personnalisez le titre, la taille de police et la famille de police de la table des matières. +3. Cochez éventuellement **Ajouter un signet pour la page de table des matières** pour inclure la table des matières elle-même dans l'arborescence des signets. +4. Cliquez sur **Générer la table des matières** pour traiter le fichier. +5. Le PDF mis à jour est téléchargé automatiquement, avec la page de table des matières insérée au début. + +## Options + +- **Titre de la table des matières** : le titre affiché en haut de la page générée. Par défaut « Table des matières ». +- **Taille de police** : de 10 pt à 72 pt. La valeur par défaut est 12 pt. +- **Famille de police** : choisissez parmi les variantes Times Roman, Helvetica ou Courier (normal, gras, italique, gras italique). Helvetica par défaut. +- **Ajouter un signet pour la page de table des matières** : lorsque cette option est cochée, une entrée de signet pour la page de table des matières elle-même est ajoutée au plan du PDF. + +## Fonctionnalités + +- Lit toute la hiérarchie des signets du PDF +- Génère une page de table des matières proprement mise en forme avec les numéros de page +- Prend en charge les niveaux de signets imbriqués avec indentation +- Choix parmi 12 polices PDF intégrées +- Signet autoréférencé facultatif pour la page de table des matières + +## Cas d'usage + +- Ajouter une table des matières imprimable à des e-books ou des rapports qui n'ont que des signets numériques +- Créer une table des matières pour un document fusionné après l'assemblage de plusieurs PDF +- Générer une page de référence pour de longs manuels techniques +- Préparer des documents pour l'impression lorsqu'une table des matières visible est attendue + +## Conseils + +- Si votre PDF n'a pas de signets, utilisez d'abord l'outil [Modifier les signets](./bookmark) pour en créer, puis revenez ici pour générer la table des matières. +- Pour les gros documents, une taille de police plus grande, comme 14 pt ou 16 pt, améliore la lisibilité. + +## Outils associés + +- [Modifier les signets](./bookmark) +- [Numéros de page](./page-numbers) +- [En-tête et pied de page](./header-footer) diff --git a/docs/fr/tools/text-color.md b/docs/fr/tools/text-color.md new file mode 100644 index 00000000..710bf52d --- /dev/null +++ b/docs/fr/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Changer la couleur du texte +description: Changez la couleur de tout le texte de votre PDF pour la couleur de votre choix. +--- + +# Changer la couleur du texte + +Remplacez la couleur du texte dans tout votre PDF. L'outil repère les zones de texte de chaque page et les recolore avec la couleur choisie, en préservant la mise en page du document et le contenu non textuel. + +## Fonctionnement + +1. Importez votre fichier PDF. +2. Choisissez une nouvelle couleur de texte avec le sélecteur de couleur. La valeur par défaut est le bleu (#0000FF). +3. Cliquez sur **Changer la couleur du texte** pour lancer le traitement. +4. Le PDF recoloré est téléchargé automatiquement. Un indicateur de progression montre quelle page est en cours de traitement. + +## Options + +- **Nouvelle couleur du texte** : un sélecteur de couleur pour choisir la couleur de remplacement de tout le texte du document. + +## Fonctionnalités + +- Recolore le texte de chaque page du document +- Traitement page par page avec indication de progression +- Sélecteur de couleur avec prise en charge complète des couleurs hexadécimales +- Préserve la mise en page et les éléments non textuels + +## Cas d'usage + +- Passer du texte noir au bleu foncé pour un aspect de document plus doux et plus moderne +- Recolorer le texte pour respecter une charte graphique avant de diffuser des documents +- Convertir le texte en une couleur précise pour se conformer à des exigences d'accessibilité +- Rendre le texte visible sur une couleur de fond nouvellement appliquée + +## Conseils + +- Cet outil restitue les pages à l'échelle 2x pour la qualité, puis reconstruit le PDF. Le résultat est composé d'images : le texte ne sera donc plus sélectionnable ni consultable par recherche. +- Pour les documents dont vous devez conserver le texte sélectionnable, envisagez plutôt de modifier directement le PDF avec l'[Éditeur PDF](./edit-pdf). +- Le temps de traitement augmente avec le nombre de pages, car chaque page est restituée individuellement. + +## Outils associés + +- [Couleur de fond](./background-color) +- [Inverser les couleurs](./invert-colors) +- [Ajuster les couleurs](./adjust-colors) diff --git a/docs/fr/tools/tiff-to-pdf.md b/docs/fr/tools/tiff-to-pdf.md new file mode 100644 index 00000000..096adf9a --- /dev/null +++ b/docs/fr/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF vers PDF +description: Convertissez des images TIFF d'une ou plusieurs pages au format PDF dans votre navigateur, avec prise en charge complète des pages. +--- + +# TIFF vers PDF + +Convertissez des fichiers TIFF en PDF, y compris les TIFF de plusieurs pages. Chaque page (ou « IFD ») d'un fichier TIFF devient une page distincte du PDF de sortie. C'est particulièrement utile pour les documents numérisés, les fax et les images médicales, couramment stockés sous forme de TIFF de plusieurs pages. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Fonctionnement + +1. Cliquez sur la zone d'import ou glissez-déposez vos fichiers TIFF. +2. Vérifiez la liste des fichiers et gérez-la selon vos besoins. +3. Cliquez sur **Convertir en PDF**. Le résultat est téléchargé sous le nom `from_tiff.pdf`. + +L'outil décode chaque fichier TIFF avec un décodeur TIFF JavaScript et extrait les données de pixels RGBA brutes de chaque page. Chaque page est restituée sur un canevas, exportée en PNG et intégrée au PDF. Les dimensions des pages correspondent à celles des pages TIFF d'origine. + +## Options + +Cet outil n'expose aucun réglage de qualité supplémentaire. Les images sont intégrées à leur résolution native. + +## Cas d'usage + +- Convertir des documents fax de plusieurs pages (TIFF-F) en un format PDF plus portable +- Transformer des archives de documents numérisés stockées en TIFF en PDF interrogeables (à combiner ensuite avec l'outil OCR) +- Traiter des fichiers d'imagerie médicale (lames d'anatomopathologie, exports de radiologie) qui utilisent le TIFF +- Convertir des fichiers TIFF d'imagerie SIG ou satellite en documents partageables + +## Conseils + +- Les TIFF de plusieurs pages sont entièrement pris en charge. Un TIFF de 10 pages produira un PDF de 10 pages. Vous n'avez pas besoin de scinder le TIFF au préalable. +- Les très gros fichiers TIFF (plusieurs centaines de mégaoctets) peuvent prendre plus de temps à traiter, car le fichier entier doit être décodé dans la mémoire du navigateur. +- Si vous avez besoin d'OCR sur le PDF obtenu, passez-le dans l'outil [OCR PDF](./ocr-pdf) après la conversion. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [BMP vers PDF](./bmp-to-pdf) +- [JPG vers PDF](./jpg-to-pdf) diff --git a/docs/fr/tools/txt-to-pdf.md b/docs/fr/tools/txt-to-pdf.md new file mode 100644 index 00000000..bd773f9f --- /dev/null +++ b/docs/fr/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Texte vers PDF +description: Convertissez des fichiers texte brut ou du texte saisi en PDF avec des polices, des couleurs et des formats de page personnalisés. +--- + +# Texte vers PDF + +Convertissez du texte brut en PDF mis en forme. Vous pouvez importer des fichiers `.txt` ou saisir directement du texte dans l'éditeur intégré. L'outil prend en charge plusieurs polices, des couleurs de texte personnalisées et un large choix de formats de page, de A0 à A10, ainsi que US Letter, Legal et Tabloid. + +## Formats pris en charge + +| Entrée | Extensions | +| :---------------------- | :--------------------------------- | +| Fichiers texte brut | `.txt` | +| Saisie directe de texte | Saisissez ou collez dans l'éditeur | + +## Fonctionnement + +1. Choisissez votre mode de saisie avec l'interrupteur en haut : **Importer des fichiers** ou **Saisir du texte**. +2. Pour l'import, glissez-déposez ou cliquez pour sélectionner un ou plusieurs fichiers `.txt`. Pour la saisie, tapez votre texte directement dans la zone de texte. +3. Configurez les options de mise en forme : famille de police, taille de police, couleur du texte et format de page. +4. Cliquez sur **Créer le PDF**. Le résultat est téléchargé sous le nom `text_to_pdf.pdf`. + +Lorsque vous importez plusieurs fichiers, leurs contenus sont concaténés avec des lignes vides entre eux. + +## Options + +| Option | Valeurs | Par défaut | +| :-------------------- | :----------------------------------------------------------------------------- | :------------- | +| **Famille de police** | Helvetica (sans empattement), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Taille de police** | 6 à 72 pt | 12 | +| **Couleur du texte** | N'importe quelle couleur via le sélecteur | Noir (#000000) | +| **Format de page** | ISO A0 à A10, B0 à B10, C0 à C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Les langues écrites de droite à gauche (arabe, hébreu, persan, ourdou) sont détectées automatiquement. Lorsqu'un texte RTL est trouvé, la direction et l'alignement du texte s'adaptent en conséquence. + +## Cas d'usage + +- Convertir des extraits de code ou des fichiers de logs en PDF imprimable avec la police Courier +- Créer rapidement un PDF à partir de notes de réunion saisies sur le moment +- Mettre en forme un manuscrit en texte brut avec une police et un format de page précis pour une soumission +- Produire une version PDF d'un README ou d'un journal des modifications pour une distribution hors ligne + +## Conseils + +- Utilisez le mode **Saisir du texte** pour convertir rapidement le contenu du presse-papiers sans l'enregistrer d'abord dans un fichier. +- Courier (monospace) est le meilleur choix pour du code, des logs ou tout contenu où l'alignement des colonnes compte. +- Les marges de page sont fixées à 72 points (1 pouce) de chaque côté. + +## Outils associés + +- [Markdown vers PDF](./markdown-to-pdf) +- [CSV vers PDF](./csv-to-pdf) +- [Word vers PDF](./word-to-pdf) diff --git a/docs/fr/tools/unlock-pdf.md b/docs/fr/tools/unlock-pdf.md new file mode 100644 index 00000000..0e7ddc0b --- /dev/null +++ b/docs/fr/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Déverrouiller un PDF +description: Supprimez la protection par mot de passe des PDF chiffrés. Prend en charge le déchiffrement par lots avec un seul mot de passe pour plusieurs fichiers. +--- + +# Déverrouiller un PDF + +Si vous avez le mot de passe d'un PDF chiffré, cet outil supprime entièrement le chiffrement et produit une copie déverrouillée que tout le monde peut ouvrir sans identifiants. Il prend en charge le déchiffrement par lots lorsque plusieurs PDF partagent le même mot de passe. + +## Fonctionnement + +1. Importez un ou plusieurs fichiers PDF chiffrés. +2. Saisissez le **mot de passe** utilisé pour protéger les fichiers. +3. Cliquez sur **Déverrouiller un PDF**. +4. Un fichier unique est téléchargé directement. Plusieurs fichiers produisent une archive ZIP contenant tous les PDF déverrouillés. + +## Fonctionnalités + +- Déchiffrement d'un seul fichier ou par lots +- Gère les mots de passe utilisateur et les mots de passe propriétaire +- Produit un fichier de sortie totalement non chiffré, sans restriction résiduelle +- Messages d'erreur clairs en cas de mot de passe incorrect ou de fichier corrompu +- Suivi du succès ou de l'échec fichier par fichier en mode lot + +## Différence avec Supprimer les restrictions + +**Déverrouiller un PDF** exige le mot de passe et supprime tout le chiffrement. **Supprimer les restrictions** cible les restrictions d'usage (impression, copie, modification) et peut ne pas demander de mot de passe si seul un mot de passe propriétaire a été défini. Utilisez Déverrouiller lorsque le PDF ne s'ouvre pas du tout sans mot de passe. + +## Cas d'usage + +- Déverrouiller définitivement des PDF que vous avez chiffrés auparavant lorsque le mot de passe n'est plus nécessaire +- Supprimer le chiffrement d'un lot de documents archivés pour faciliter l'accès à long terme +- Préparer des PDF protégés par mot de passe pour un système de gestion documentaire qui ne prend pas en charge les fichiers chiffrés +- Déverrouiller des PDF avant de les fusionner avec d'autres documents (de nombreux outils de fusion ne savent pas traiter des fichiers chiffrés) + +## Conseils + +- Le champ du mot de passe s'applique à tous les fichiers importés. Si vos PDF ont des mots de passe différents, traitez-les par lots séparés. +- Si vous obtenez l'erreur « Mot de passe incorrect », vérifiez qu'il n'y a pas d'espaces à la fin et que le verrouillage des majuscules est désactivé. +- Après le déchiffrement, le fichier n'a plus aucune protection. Rechiffrez-le avec Protéger un PDF si vous devez appliquer un nouveau mot de passe. + +## Outils associés + +- [Protéger un PDF](./protect-pdf) : appliquer à nouveau un chiffrement avec un nouveau mot de passe +- [Supprimer les restrictions](./remove-restrictions) : supprimer les restrictions d'usage sans déchiffrement complet +- [Modifier les autorisations](./change-permissions) : modifier des autorisations précises sur un PDF chiffré diff --git a/docs/fr/tools/validate-signature-pdf.md b/docs/fr/tools/validate-signature-pdf.md new file mode 100644 index 00000000..0c1b32ec --- /dev/null +++ b/docs/fr/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Valider la signature +description: Vérifiez les signatures numériques des fichiers PDF. Contrôlez la validité du certificat, l'identité du signataire, l'intégrité du document et l'état de la chaîne de confiance. +--- + +# Valider la signature + +Importez un PDF signé : cet outil extrait chaque signature numérique, identifie le signataire, vérifie la validité du certificat et indique si le document a été modifié depuis la signature. Vous pouvez aussi fournir un certificat de confiance pour vérifier la chaîne de signature. + +## Fonctionnement + +1. Importez un fichier PDF signé. La validation démarre automatiquement. +2. L'outil affiche un résumé : nombre de signatures trouvées et nombre de signatures valides. +3. Chaque signature dispose d'une fiche détaillée indiquant le nom du signataire, l'émetteur, les dates et l'état. +4. Vous pouvez éventuellement importer un **certificat de confiance** (.pem, .crt, .cer, .der) pour vérifier la signature par rapport à une ancre de confiance précise. La revalidation s'exécute automatiquement. + +## Ce qui est vérifié + +### Analyse de la signature + +L'outil extrait les objets de signature PKCS#7 du PDF, décode la structure ASN.1 et récupère le certificat X.509 du signataire ainsi que toute chaîne de certificats intégrée à la signature. + +### Validité du certificat + +- **Expiration** : le certificat se trouve-t-il actuellement dans sa période de validité ? +- **Détection de l'auto-signature** : le certificat est-il son propre émetteur ? +- **Chaîne de confiance** : lorsqu'un certificat de confiance est fourni, le certificat du signataire remonte-t-il jusqu'à lui ? + +### Vérification cryptographique + +- L'outil reconstruit les octets couverts par le `/ByteRange` de la signature, les hache avec l'algorithme déclaré par le signataire et compare le résultat à l'attribut `messageDigest` contenu dans la signature. +- Il resérialise ensuite les attributs signés sous forme d'ensemble DER SET et vérifie la signature à l'aide de la clé publique du certificat du signataire. +- **Une signature n'est déclarée valide que si toutes ces vérifications réussissent.** Si les octets du PDF ont été modifiés après la signature, ou si la signature intégrée ne correspond pas à la clé du signataire, l'état affiche « Invalide : échec de la vérification cryptographique » avec la raison précise. + +#### Algorithmes de signature pris en charge + +| Algorithme | Chemin de vérification | +| ----------------------- | ----------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, avec repli sur Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` après conversion de signature DER → IEEE P1363 | + +Si une signature utilise un algorithme absent de cette liste (par exemple Ed25519, SM2 ou RSA avec un OID de condensat inhabituel), la fiche affiche **« Non vérifiée : algorithme de signature non pris en charge »** en jaune, avec l'OID ou la raison précise. Il s'agit d'une distinction volontaire à trois états : + +- **Valide** : la signature a été vérifiée cryptographiquement avec la clé publique du signataire. +- **Invalide** : la vérification a été exécutée et a donné un résultat négatif (octets modifiés, clé non correspondante). +- **Non vérifiée** : l'outil n'a pas pu exécuter la vérification pour cet algorithme. Les métadonnées du certificat sont toujours affichées, mais vous devez considérer la signature comme « inconnue » et la vérifier avec Adobe Acrobat ou `openssl cms -verify`. + +### Algorithmes de condensat non sûrs + +- Les signatures utilisant **MD5 ou SHA-1** sont rejetées comme invalides et signalées par l'état « Condensat non sûr ». Ces deux algorithmes ont fait l'objet d'attaques par collision publiées, donc une signature sur un condensat SHA-1 ou MD5 n'offre aucune garantie d'intégrité. +- SHA-224, SHA-256, SHA-384 et SHA-512 sont tous acceptés. + +### Couverture du document + +- **Couverture complète** : la signature couvre l'intégralité du fichier PDF, ce qui signifie qu'aucun octet n'a été ajouté ou modifié après la signature. +- **Couverture partielle** : la signature ne couvre qu'une partie du fichier. Cela peut indiquer des modifications effectuées après la signature (pas nécessairement malveillantes : les enregistrements incrémentiels produisent une couverture partielle). + +## Détails de la signature + +Chaque fiche de signature affiche : + +- **Signé par** : nom courant, organisation et e-mail provenant du certificat du signataire +- **Émetteur** : l'autorité de certification qui a émis le certificat du signataire +- **Signé le** : l'horodatage intégré à la signature +- **Valide du / Valide jusqu'au** : la période de validité du certificat +- **Motif** : la raison de la signature du document (si elle est fournie) +- **Lieu** : l'endroit où le document a été signé (s'il est fourni) +- **État de la couverture** : complète ou partielle +- **Badge de confiance** : approuvé ou hors de la chaîne de confiance (uniquement lorsqu'un certificat personnalisé est fourni) + +### Détails techniques + +Développez la section des détails techniques pour afficher : + +- Le numéro de série du certificat du signataire +- L'algorithme de condensat (SHA-256, SHA-512, etc.) +- L'algorithme de signature (RSA avec SHA-256, ECDSA avec SHA-256, etc.) +- Les messages d'erreur pour les signatures invalides + +## Cas d'usage + +- Vérifier un contrat signé numériquement avant de le contresigner +- Auditer des documents signés pour confirmer qu'ils n'ont pas été altérés +- Vérifier si un certificat a expiré depuis la signature du document +- Valider des signatures par rapport au certificat racine de votre organisation +- Examiner les détails de signature de documents administratifs ou juridiques + +## Conseils + +- Un certificat auto-signé ne signifie pas que la signature est invalide : cela signifie que l'identité du signataire ne peut pas être vérifiée par un tiers de confiance. C'est courant pour les documents internes. +- Une couverture partielle n'indique pas toujours une falsification. De nombreux flux de travail PDF ajoutent des mises à jour incrémentielles (comme une deuxième signature) qui créent une couverture partielle. +- Importez le certificat racine ou intermédiaire de votre organisation comme certificat de confiance pour obtenir la vérification de la chaîne de confiance. + +## Outils associés + +- [Signature numérique](./digital-sign-pdf) : signer des PDF avec votre propre certificat +- [Aplatir un PDF](./flatten-pdf) : aplatir un PDF avant la signature pour empêcher les modifications postérieures +- [Supprimer les métadonnées](./remove-metadata) : nettoyer un PDF avant d'appliquer une signature diff --git a/docs/fr/tools/view-metadata.md b/docs/fr/tools/view-metadata.md new file mode 100644 index 00000000..d87d4793 --- /dev/null +++ b/docs/fr/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Afficher les métadonnées +description: Inspectez toutes les propriétés de métadonnées d'un PDF, y compris les informations du document, les données XMP et les détails structurels. +--- + +# Afficher les métadonnées + +Examinez les propriétés cachées intégrées à un fichier PDF. L'outil affiche sous une forme lisible les informations du document (titre, auteur, dates), les métadonnées XMP, les dimensions des pages et d'autres données structurelles. + +## Fonctionnement + +1. Importez un fichier PDF. +2. L'outil analyse immédiatement le fichier et affiche toutes les métadonnées disponibles dans des sections organisées. +3. Consultez le dictionnaire d'informations du document, l'arborescence des métadonnées XMP et les propriétés structurelles. +4. Aucune étape de traitement n'est nécessaire : les métadonnées s'affichent dès le chargement du fichier. + +## Fonctionnalités + +- Affiche les champs d'information standard du document : Titre, Auteur, Sujet, Mots-clés, Créateur, Producteur +- Présente les dates de création et de modification dans un format lisible +- Analyse et affiche l'arborescence XMP complète avec ses espaces de noms imbriqués +- Convertit le format de date PDF (`D:20240101120000Z`) en dates lisibles +- Organisé en sections repliables pour faciliter la navigation + +## Sections de métadonnées + +| Section | Contenu | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------- | +| **Informations du document** | Titre, Auteur, Sujet, Mots-clés, Créateur, Producteur, Date de création, Date de modification | +| **Métadonnées XMP** | Arborescence complète de métadonnées au format XML, avec Dublin Core, XAP, PDF et espaces de noms personnalisés | +| **Propriétés du document** | Nombre de pages, version PDF, taille du fichier, état du chiffrement | + +## Cas d'usage + +- Vérifier qui est l'auteur d'un PDF et quand il a été modifié pour la dernière fois +- Vérifier que les métadonnées ont été correctement définies avant de publier un document +- Auditer des PDF du point de vue de la confidentialité en contrôlant les informations personnelles intégrées +- Identifier le logiciel utilisé pour créer ou modifier un PDF (via le champ Producteur) +- Examiner les métadonnées XMP pour la conformité de la gestion des actifs numériques + +## Conseils + +- Les chaînes de date PDF qui commencent par `D:` sont automatiquement converties au format de votre fuseau horaire local. +- Si des champs de métadonnées semblent vides, c'est que le créateur du PDF ne les a tout simplement pas renseignés. Tous les PDF ne contiennent pas de métadonnées riches. +- Pour modifier les métadonnées après les avoir inspectées, utilisez [Modifier les métadonnées](./edit-metadata). Pour les supprimer entièrement, utilisez Supprimer les métadonnées. + +## Outils associés + +- [Modifier les métadonnées](./edit-metadata) +- [Calques OCG du PDF](./pdf-layers) +- [Comparer des PDF](./compare-pdfs) diff --git a/docs/fr/tools/vsd-to-pdf.md b/docs/fr/tools/vsd-to-pdf.md new file mode 100644 index 00000000..356f31e4 --- /dev/null +++ b/docs/fr/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD vers PDF +description: Convertissez des diagrammes Microsoft Visio (VSD/VSDX) en PDF dans votre navigateur. Gratuit, privé, sans Visio. +--- + +# VSD vers PDF + +Convertissez des diagrammes Microsoft Visio en PDF sans installer Visio. Les fichiers VSD et VSDX contiennent des organigrammes, des diagrammes réseau et des plans d'étage que la plupart des gens ne peuvent pas ouvrir. Cet outil les restitue sous forme de PDF propres, lisibles sur n'importe quel appareil. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :------------ | :-------- | :-------------------------------------------- | +| Visio binaire | `.vsd` | Ancien format Visio (Visio 2003 et antérieur) | +| Visio XML | `.vsdx` | Format Visio moderne (Visio 2013 et suivants) | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos fichiers VSD ou VSDX. Les deux formats peuvent être mélangés dans un même lot. +2. Vérifiez la liste des fichiers. Supprimez les entrées indésirables avec l'icône de corbeille, ou utilisez **Ajouter des fichiers** pour ajouter d'autres diagrammes. +3. Cliquez sur **Convertir en PDF**. Le moteur basé sur LibreOffice se charge dans le navigateur et restitue chaque diagramme en PDF, en conservant les formes, les connecteurs, les étiquettes et la mise en page. +4. Un diagramme unique est téléchargé directement en PDF. Plusieurs fichiers produisent une archive ZIP nommée `vsd-to-pdf.zip`. + +## Options + +Aucune configuration n'est nécessaire. Le convertisseur respecte la taille et l'orientation de page d'origine du document Visio. + +## Cas d'usage + +- Consulter les diagrammes Visio d'un collègue lorsque vous n'avez pas de licence Visio +- Intégrer des diagrammes réseau ou d'architecture à la documentation d'un projet sous forme de PDF +- Imprimer des organigrammes ou des flux de processus comme supports de réunion +- Archiver d'anciens fichiers VSD issus de versions antérieures de Visio dans un format pérenne + +## Conseils + +- Les documents Visio de plusieurs pages produisent des PDF de plusieurs pages, chaque page Visio correspondant à une page PDF. +- Les fichiers VSDX (le format moderne basé sur XML) se convertissent généralement avec plus de fidélité que les anciens fichiers binaires VSD. +- Le moteur LibreOffice se charge une seule fois par session. Prévoyez une brève attente lors de la première conversion, puis des résultats plus rapides pour les fichiers suivants. + +## Outils associés + +- [ODG vers PDF](./odg-to-pdf) +- [PUB vers PDF](./pub-to-pdf) +- [PSD vers PDF](./psd-to-pdf) diff --git a/docs/fr/tools/webp-to-pdf.md b/docs/fr/tools/webp-to-pdf.md new file mode 100644 index 00000000..f4d314dc --- /dev/null +++ b/docs/fr/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP vers PDF +description: Convertissez des images WebP au format PDF directement dans votre navigateur, avec une qualité de compression réglable. +--- + +# WebP vers PDF + +Convertissez le format d'image WebP de Google en PDF. C'est particulièrement utile lorsque vous avez téléchargé depuis le web des images au format WebP et que vous en avez besoin dans un format plus universellement accepté pour l'impression ou le partage. + +## Formats pris en charge + +| Format | Extensions | +| :----- | :--------- | +| WebP | `.webp` | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos fichiers WebP. +2. Vérifiez la liste des fichiers et supprimez ceux dont vous n'avez pas besoin. +3. Sélectionnez un niveau de **qualité PDF**. +4. Cliquez sur **Convertir en PDF**. Le résultat est téléchargé sous le nom `from_webps.pdf`. + +En interne, chaque image WebP est décodée via l'API canvas du navigateur, puis intégrée au PDF avec pdf-lib. La conversion fonctionne donc sur tout navigateur qui prend en charge le décodage WebP (tous les navigateurs modernes). + +## Options + +**Qualité PDF** contrôle la compression lors de l'intégration des images : + +- **Haute qualité** : conserve le plus de détails. +- **Qualité moyenne** (par défaut) : résultat équilibré. +- **Basse qualité** : taille de fichier la plus petite. + +## Cas d'usage + +- Convertir en PDF imprimable des images téléchargées sur le web et enregistrées en WebP +- Regrouper dans une documentation des captures d'écran WebP issues de Chrome ou Edge +- Créer un portfolio PDF à partir d'images exportées par des outils de design qui utilisent WebP par défaut +- Archiver des images WebP dans un format lisible plus universellement + +## Conseils + +- Le WebP est décodé en PNG en interne avant l'intégration au PDF : les images WebP sans perte conservent donc leur qualité avec le réglage Haute qualité. +- Si vous avez un mélange de WebP et d'autres formats d'image, utilisez plutôt l'outil [Images vers PDF](./image-to-pdf), qui accepte tout en une seule fois. + +## Outils associés + +- [Images vers PDF](./image-to-pdf) +- [PNG vers PDF](./png-to-pdf) +- [JPG vers PDF](./jpg-to-pdf) diff --git a/docs/fr/tools/word-to-pdf.md b/docs/fr/tools/word-to-pdf.md new file mode 100644 index 00000000..e4acf6f5 --- /dev/null +++ b/docs/fr/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word vers PDF +description: Convertissez des documents Word (DOC, DOCX), ODT et RTF en PDF dans votre navigateur, avec conservation complète de la mise en forme. +--- + +# Word vers PDF + +Convertissez des documents Microsoft Word et des formats compatibles en PDF. L'outil utilise un moteur LibreOffice exécuté dans le navigateur, qui gère les fichiers DOC, DOCX, ODT et RTF et conserve la mise en forme, les tableaux, les images, les en-têtes, les pieds de page et les styles dans le fichier de sortie. + +## Formats pris en charge + +| Format | Extensions | +| :---------------- | :--------- | +| Word (moderne) | `.docx` | +| Word (ancien) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos documents Word. Vous pouvez sélectionner plusieurs fichiers à la fois. +2. Vérifiez et gérez la liste des fichiers. +3. Cliquez sur **Convertir en PDF**. Le moteur LibreOffice se charge à la première utilisation (un indicateur de progression montre l'état de l'initialisation), puis chaque fichier est converti. +4. Un fichier unique est téléchargé directement en PDF. Plusieurs fichiers sont regroupés dans `word-converted.zip`. + +## Options + +Cet outil n'a aucun réglage supplémentaire. Le moteur LibreOffice produit le résultat avec son profil d'export PDF par défaut. + +## Résultat + +| Nombre de fichiers | Résultat | +| :----------------- | :------------------------------------------------------------------- | +| 1 fichier | Téléchargement d'un seul PDF (nom d'origine avec l'extension `.pdf`) | +| 2 fichiers ou plus | Archive ZIP (`word-converted.zip`) contenant un PDF par fichier | + +## Cas d'usage + +- Convertir un CV ou une lettre de motivation de DOCX en PDF avant de postuler à un emploi +- Convertir par lots une série de contrats ou de propositions en PDF pour une livraison client +- Transformer d'anciens fichiers `.doc` en PDF modernes pour un archivage à long terme +- Convertir en PDF des documents collaboratifs issus de Google Docs (exportés en DOCX) +- Produire des PDF prêts à imprimer à partir de modèles Word utilisés pour la génération automatique de documents + +## Conseils + +- Le moteur LibreOffice est téléchargé une fois par session, puis mis en cache. Prévoyez quelques secondes de chargement lors de la première conversion, les suivantes étant beaucoup plus rapides. +- Les mises en forme complexes (macros, contrôles ActiveX, SmartArt avancés) peuvent ne pas être converties parfaitement. Les éléments standards d'un document (texte, tableaux, images, en-têtes, notes de bas de page) sont convertis de façon fiable. +- Comme cet outil accepte aussi l'ODT et le RTF, vous pouvez l'utiliser comme convertisseur unique pour tous les formats de traitement de texte. + +## Outils associés + +- [ODT vers PDF](./odt-to-pdf) +- [RTF vers PDF](./rtf-to-pdf) +- [Excel vers PDF](./excel-to-pdf) +- [PowerPoint vers PDF](./powerpoint-to-pdf) diff --git a/docs/fr/tools/wpd-to-pdf.md b/docs/fr/tools/wpd-to-pdf.md new file mode 100644 index 00000000..5be2e511 --- /dev/null +++ b/docs/fr/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD vers PDF +description: Convertissez des documents WordPerfect (WPD) en PDF dans votre navigateur avec LibreOffice. Gratuit et privé. +--- + +# WPD vers PDF + +Convertissez des documents Corel WordPerfect en fichiers PDF. Le WPD a longtemps été le format de traitement de texte dominant dans les cabinets juridiques et les administrations. Si vous avez d'anciens fichiers WordPerfect que les logiciels modernes refusent d'ouvrir, cet outil les ramène à la vie sous forme de PDF standards. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :---------- | :-------- | :--------------------------------------------- | +| WordPerfect | `.wpd` | Toutes les principales versions de WordPerfect | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos fichiers WPD. Vous pouvez sélectionner plusieurs fichiers à la fois. +2. Vérifiez la liste des fichiers. Supprimez les fichiers indésirables avec l'icône de corbeille, ou utilisez **Ajouter des fichiers** pour ajouter d'autres documents. +3. Cliquez sur **Convertir en PDF**. L'outil charge dans votre navigateur un moteur de conversion basé sur LibreOffice, qui analyse le format WPD et produit un PDF. +4. Un fichier unique est téléchargé directement en PDF. Les conversions par lots produisent une archive ZIP nommée `wpd-to-pdf.zip`. + +## Options + +Aucune configuration n'est nécessaire. Le moteur LibreOffice gère automatiquement la mise en forme, les polices et la mise en page WPD. + +## Cas d'usage + +- Ouvrir des documents juridiques vieux de plusieurs décennies rédigés dans WordPerfect +- Convertir des dossiers administratifs archivés du format WPD vers un format moderne +- Migrer une ancienne bibliothèque de documents WordPerfect vers le PDF pour un stockage à long terme +- Partager des fichiers WPD avec des destinataires qui n'ont pas Corel WordPerfect installé + +## Conseils + +- Le moteur LibreOffice se charge à la première utilisation, ce qui prend un moment. Les conversions suivantes de la même session sont plus rapides. +- Les macros WPD complexes et les codes révélés ne sont pas conservés, mais la mise en page visuelle, le contenu textuel et la mise en forme de base sont repris dans le PDF. + +## Outils associés + +- [WPS vers PDF](./wps-to-pdf) +- [ODG vers PDF](./odg-to-pdf) diff --git a/docs/fr/tools/wps-to-pdf.md b/docs/fr/tools/wps-to-pdf.md new file mode 100644 index 00000000..71c49b6b --- /dev/null +++ b/docs/fr/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS vers PDF +description: Convertissez des documents Microsoft Works (WPS) en PDF dans votre navigateur. Gratuit, sans inscription, entièrement privé. +--- + +# WPS vers PDF + +Convertissez des fichiers de traitement de texte Microsoft Works en PDF. Microsoft Works était fourni avec les PC grand public à la fin des années 1990 et dans les années 2000, et de nombreux fichiers WPS dorment encore sur d'anciens disques durs et dans des archives d'e-mails. Cet outil les ouvre dans le navigateur et produit des PDF propres. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :-------------- | :-------- | :------------------------------------------------- | +| Microsoft Works | `.wps` | Fichiers de traitement de texte de Microsoft Works | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos fichiers WPS. Plusieurs fichiers sont acceptés. +2. Vérifiez la liste des fichiers. Utilisez l'icône de corbeille pour supprimer des fichiers individuels, ou cliquez sur **Ajouter des fichiers** pour agrandir votre lot. +3. Cliquez sur **Convertir en PDF**. Un moteur basé sur LibreOffice se charge dans le navigateur et convertit chaque document WPS en PDF. +4. Un fichier unique est téléchargé directement en PDF. Plusieurs fichiers sont regroupés dans une archive ZIP nommée `wps-to-pdf.zip`. + +## Options + +Aucun réglage supplémentaire n'est nécessaire. Le convertisseur gère le texte, la mise en forme de base et les images intégrées du fichier WPS. + +## Cas d'usage + +- Récupérer d'anciens documents scolaires ou professionnels enregistrés au format Microsoft Works +- Ouvrir des pièces jointes WPS lorsque Microsoft Works n'est pas installé +- Convertir une archive de fichiers WPS pour la migrer vers un système documentaire moderne +- Imprimer d'anciens documents que les traitements de texte actuels ne savent pas ouvrir + +## Conseils + +- Ne confondez pas les fichiers `.wps` de Microsoft Works avec les fichiers WPS Office. Cet outil est destiné uniquement à l'ancien format Microsoft Works. +- Le moteur LibreOffice met un moment à se charger à la première utilisation. Une fois chargé, les conversions suivantes de la même session sont plus rapides. + +## Outils associés + +- [WPD vers PDF](./wpd-to-pdf) +- [PUB vers PDF](./pub-to-pdf) diff --git a/docs/fr/tools/xml-to-pdf.md b/docs/fr/tools/xml-to-pdf.md new file mode 100644 index 00000000..4dc74ac7 --- /dev/null +++ b/docs/fr/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML vers PDF +description: Convertissez des fichiers XML en documents PDF structurés dans votre navigateur. Gratuit, privé, sans traitement côté serveur. +--- + +# XML vers PDF + +Convertissez des fichiers de données XML en documents PDF lisibles et structurés. Le XML brut est puissant mais difficile à lire pour un humain. Cet outil analyse l'arborescence XML, repère les structures de données répétitives et les restitue sous forme de tableaux et de sections mis en forme dans un PDF A4 en paysage. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----- | :-------- | :--------------------------- | +| XML | `.xml` | Tout document XML bien formé | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos fichiers XML. Plusieurs fichiers peuvent être traités dans un même lot. +2. Vérifiez la liste des fichiers. Supprimez les fichiers indésirables avec l'icône de corbeille, ou cliquez sur **Ajouter des fichiers** pour en ajouter d'autres. +3. Cliquez sur **Convertir en PDF**. L'outil analyse la structure XML avec le DOMParser intégré au navigateur, étudie la hiérarchie des données et la restitue en PDF avec jsPDF et une mise en forme de tableaux automatique. +4. Un fichier unique est téléchargé en PDF. Plusieurs conversions sont regroupées dans `xml-to-pdf.zip`. + +## Options + +Aucune configuration manuelle n'est nécessaire. Le convertisseur détecte automatiquement la structure XML et choisit des mises en page de tableaux adaptées. Le résultat utilise l'orientation A4 paysage pour accueillir les jeux de données larges. + +## Cas d'usage + +- Transformer des exports de données XML issus de bases de données ou d'API en rapports imprimables +- Créer des résumés lisibles à partir de fichiers de configuration XML +- Convertir des factures ou des journaux de transactions XML en PDF pour la conservation +- Rendre lisibles sous forme de document des sitemaps XML ou des flux RSS + +## Conseils + +- Le XML doit être bien formé. Si l'analyseur rencontre des erreurs de syntaxe, la conversion échoue avec un message d'erreur descriptif indiquant le problème. +- Les structures XML profondément imbriquées sont aplaties en tableaux. Pour de meilleurs résultats, les données doivent comporter des éléments frères répétitifs avec des éléments enfants cohérents. +- Des mises à jour de progression s'affichent pendant la conversion et indiquent chaque phase : lecture, analyse, étude et rendu. + +## Outils associés + +- [FB2 vers PDF](./fb2-to-pdf) +- [XPS vers PDF](./xps-to-pdf) +- [E-mail vers PDF](./email-to-pdf) diff --git a/docs/fr/tools/xps-to-pdf.md b/docs/fr/tools/xps-to-pdf.md new file mode 100644 index 00000000..8911d433 --- /dev/null +++ b/docs/fr/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS vers PDF +description: Convertissez des documents XPS et OXPS au format PDF dans votre navigateur. Sans envoi de fichier, sans inscription, entièrement privé. +--- + +# XPS vers PDF + +Convertissez des documents Microsoft XPS et OXPS en fichiers PDF standards. XPS (XML Paper Specification) était la réponse de Microsoft au PDF, mais sa prise en charge a diminué sur les différentes plateformes. Cet outil rend à nouveau ces documents lisibles par tous. + +## Formats pris en charge + +| Format | Extension | Remarques | +| :----- | :-------- | :----------------------------------------- | +| XPS | `.xps` | Format XPS d'origine de Microsoft | +| OXPS | `.oxps` | Open XPS, la variante de la norme ECMA-388 | + +## Fonctionnement + +1. Cliquez sur la zone d'importation ou glissez-déposez vos fichiers XPS/OXPS. Vous pouvez sélectionner plusieurs fichiers à la fois. +2. Vérifiez la liste des fichiers. Supprimez des fichiers individuels avec l'icône de corbeille, ou cliquez sur **Ajouter des fichiers** pour ajouter d'autres documents. +3. Cliquez sur **Convertir en PDF**. Le moteur PyMuPDF traite chaque document localement dans votre navigateur. +4. Un fichier unique est téléchargé directement en PDF. Plusieurs fichiers sont regroupés dans une archive ZIP nommée `xps-converted.zip`. + +## Options + +Cet outil effectue une conversion de format directe, sans configuration supplémentaire. Le résultat conserve les dimensions de page d'origine, les graphiques vectoriels, les polices et les images de la source XPS. + +## Cas d'usage + +- Ouvrir des fichiers XPS reçus de systèmes Windows plus anciens qui utilisaient le pilote d'impression XPS par défaut +- Convertir des documents OXPS de Windows 10/11 pour les partager avec des utilisateurs de macOS ou de Linux +- Archiver d'anciens fichiers XPS dans un format plus largement pris en charge +- Rendre accessibles à des destinataires externes des documents administratifs ou d'entreprise au format XPS + +## Conseils + +- Les extensions `.xps` et `.oxps` sont gérées automatiquement : vous pouvez les mélanger dans un même lot. +- Si le fichier XPS d'origine a été créé avec un pilote d'impression haute résolution, le PDF obtenu conserve cette qualité. Aucun rééchantillonnage n'a lieu. + +## Outils associés + +- [Word vers PDF](./word-to-pdf) +- [XML vers PDF](./xml-to-pdf) diff --git a/docs/id/contributing.md b/docs/id/contributing.md new file mode 100644 index 00000000..19b118ba --- /dev/null +++ b/docs/id/contributing.md @@ -0,0 +1,136 @@ +# Berkontribusi + +Terima kasih atas minat Anda untuk berkontribusi pada BentoPDF! Panduan ini akan membantu Anda memulai. + +## Memulai + +### Prasyarat + +- Node.js 18+ +- npm 9+ +- Git + +### Penyiapan + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Struktur Proyek + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Menambahkan Alat Baru + +### Langkah 1: Buat File Logika + +Buat `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Langkah 2: Buat Halaman HTML + +Buat `src/pages/your-tool.html` dengan mengikuti templat alat yang sudah ada. + +### Langkah 3: Daftarkan Alat + +Tambahkan ke `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Langkah 4: Tambahkan ke Konfigurasi Build + +Tambahkan halaman ke `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Langkah 5: Tambahkan Terjemahan + +Tambahkan entri ke semua file locale di `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Gaya Kode + +- Gunakan TypeScript untuk semua kode baru +- Ikuti pola yang sudah ada agar tetap konsisten +- Jalankan `npm run format` sebelum commit +- Tanpa komentar di kode produksi (komentar dihapus saat build) + +## Proses Pull Request + +1. Buat branch fitur: `git checkout -b feature/your-feature` +2. Lakukan perubahan Anda +3. Uji secara menyeluruh: `npm run build` +4. Kirim PR dengan deskripsi yang jelas + +## Terjemahan + +Lihat [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) untuk menambahkan bahasa baru. + +## Perjanjian Lisensi Kontributor + +Sebelum PR Anda dapat digabungkan, Anda perlu menandatangani CLA kami: + +- [Individual CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Corporate CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Mendapatkan Bantuan + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Komunitas Discord](https://discord.gg/Bgq3Ay3f2w) + +## Lisensi + +BentoPDF berlisensi ganda: + +- **AGPL-3.0** untuk proyek sumber terbuka yang membagikan seluruh kode sumbernya secara publik +- **Lisensi Komersial** untuk aplikasi proprietari/sumber tertutup - [Dapatkan Lisensi Seumur Hidup seharga $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Dengan berkontribusi, Anda menyetujui bahwa kontribusi Anda dilisensikan berdasarkan ketentuan ini. diff --git a/docs/id/getting-started.md b/docs/id/getting-started.md new file mode 100644 index 00000000..90c1fe13 --- /dev/null +++ b/docs/id/getting-started.md @@ -0,0 +1,80 @@ +# Memulai + +Selamat datang di BentoPDF! Panduan ini akan membantu Anda mulai dengan cepat. + +## Apa itu BentoPDF? + +BentoPDF adalah toolkit PDF gratis, sumber terbuka, dan mengutamakan privasi yang berjalan **sepenuhnya di browser Anda**. File Anda tidak pernah meninggalkan perangkat Anda, semua pemrosesan terjadi secara lokal menggunakan teknologi WebAssembly (WASM). + +## Mulai Cepat + +### Opsi 1: Gunakan Versi Hosting + +Kunjungi [bentopdf.com](https://www.bentopdf.com) untuk langsung menggunakan BentoPDF, tanpa perlu instalasi. + +### Opsi 2: Hosting Mandiri dengan Docker + +> [!IMPORTANT] +> Konversi file Office memerlukan `SharedArrayBuffer`, yang membutuhkan keduanya: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - konteks aman (secure context) +> +> `http://localhost` berfungsi untuk pengujian lokal karena browser menganggap loopback tepercaya. `http://192.168.x.x` atau IP LAN lainnya biasanya tidak, sehingga konversi Word/Excel/PowerPoint memerlukan HTTPS saat diakses dari perangkat lain di jaringan Anda. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF tersedia dalam dua build: **Self-Hosted build** (`bentopdf-simple`, digunakan di atas) untuk penerapan internal/tim/organisasi, dan **Commercial build** (`bentopdf:latest`) yang digunakan oleh bentopdf.com sendiri dan oleh pemegang lisensi komersial yang menjalankan penerapan publik. Keduanya menyertakan alat PDF yang sama, Commercial build menambahkan hero, FAQ, testimoni, dan footer bentopdf.com. Jika ragu, gunakan Self-Hosted build. + +Lalu buka `http://localhost:3000` di browser Anda. + +> [!NOTE] +> Jika Anda menyiapkan penerapan OCR air-gapped, Anda harus menghosting font lapisan teks OCR secara internal, selain worker Tesseract, runtime inti, dan file traineddata. Penyiapan lengkapnya didokumentasikan di [Hosting Mandiri](/id/self-hosting/), termasuk `VITE_OCR_FONT_BASE_URL` dan direktori `ocr-fonts/` bawaan. + +### Opsi 3: Build dari Sumber + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Sekilas Fitur + +| Kategori | Alat | +| --------------------- | ------------------------------------------------------------------ | +| **Konversi ke PDF** | Word, Excel, PowerPoint, Gambar, Markdown, EPUB, MOBI, dan lainnya | +| **Konversi dari PDF** | JPG, PNG, Teks, Excel, SVG, dan lainnya | +| **Edit & Anotasi** | Tanda Tangan, Sorot, Redaksi, Isi Formulir, Tambah Stempel | +| **Atur** | Gabung, Pisah, Putar, Hapus Halaman, Urutkan Ulang | +| **Optimalkan** | Kompres, Perbaiki, Ratakan, OCR | +| **Keamanan** | Enkripsi, Dekripsi, Hapus Pembatasan | + +## Dukungan Browser + +BentoPDF bekerja paling baik di browser modern: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Langkah Selanjutnya + +- [Jelajahi semua alat](/id/tools/) +- [Hosting mandiri BentoPDF](/id/self-hosting/) +- [Berkontribusi pada proyek](/id/contributing) diff --git a/docs/id/index.md b/docs/id/index.md new file mode 100644 index 00000000..65d0bc72 --- /dev/null +++ b/docs/id/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Alat PDF Gratis dan Sumber Terbuka' + tagline: Proses PDF sepenuhnya di browser Anda. Tanpa unggahan. Tanpa server. Privasi penuh. + actions: + - theme: brand + text: Mulai + link: /id/getting-started + - theme: alt + text: Lihat Alat + link: /id/tools/ + - theme: alt + text: Hosting Mandiri + link: /id/self-hosting/ + - theme: alt + text: Lisensi Komersial + link: /id/licensing + +features: + - icon: 🔒 + title: 100% Privat + details: File Anda tidak pernah meninggalkan perangkat Anda. Semua pemrosesan terjadi secara lokal di browser Anda menggunakan WebAssembly. + - icon: ⚡ + title: Cepat & Gratis + details: Tanpa pendaftaran, tanpa batas, tanpa watermark. Proses PDF tanpa batas secara gratis, selamanya. + - icon: 🛠️ + title: 50+ Alat + details: Konversi, edit, gabung, pisah, kompres, tanda tangan, OCR, dan lainnya. Semua yang Anda butuhkan di satu tempat. + + - icon: 🌐 + title: Dapat Dihosting Sendiri + details: Terapkan di infrastruktur Anda sendiri. Docker, Vercel, Netlify, AWS, atau lingkungan air-gapped sepenuhnya dengan worker OCR, data bahasa, dan font lapisan teks yang dihosting sendiri. +--- + +## OCR Offline + +Jika Anda menghosting BentoPDF sendiri di lingkungan air-gapped atau offline, OCR membutuhkan lebih dari sekadar worker Tesseract dan file traineddata. Hasil PDF yang dapat dicari juga mengharuskan font lapisan teks OCR disajikan secara internal. +Lihat [Hosting Mandiri](/id/self-hosting/) untuk penyiapan lengkap, termasuk `VITE_OCR_FONT_BASE_URL`, direktori `ocr-fonts/` bawaan, dan alur kerja air-gap terbaru. diff --git a/docs/id/licensing.md b/docs/id/licensing.md new file mode 100644 index 00000000..368b97f4 --- /dev/null +++ b/docs/id/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/id/self-hosting/#konfigurasi-wasm-komponen-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/id/self-hosting/apache.md b/docs/id/self-hosting/apache.md new file mode 100644 index 00000000..773f607d --- /dev/null +++ b/docs/id/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Deploy dengan Apache + +Hosting BentoPDF menggunakan Apache HTTP Server. + +## Prasyarat + +- Apache 2.4+ +- mod_rewrite diaktifkan +- Sertifikat SSL (disarankan) + +## Langkah 1: Build Proyek + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Untuk menyesuaikan branding, atur environment variable sebelum build: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Langkah 2: Salin File + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Langkah 3: Konfigurasi Apache + +Buat `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Langkah 4: .htaccess untuk Routing + +Buat `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Langkah 5: Aktifkan Modul yang Diperlukan + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Langkah 6: Aktifkan Situs + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Deploy di Subdirektori + +Untuk hosting di `/pdf/`: + +1. Build dengan base URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Perbarui `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Pemecahan Masalah + +### Error WASM 404 + +Pastikan MIME type sudah dikonfigurasi: + +```apache +AddType application/wasm .wasm +``` + +### Tanda Tangani PDF atau Form Filler Menampilkan Penampil Kosong (error MIME `.mjs`) + +Jika konsol browser menampilkan: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +dan permintaan yang gagal berakhir dengan `.mjs`, konfigurasi Apache Anda tidak memiliki pemetaan `.mjs → application/javascript`. Viewer PDF bawaan menyertakan file ES module dengan ekstensi `.mjs`, dan `mime.types` bawaan Apache tidak memuatnya secara default. + +Tambahkan ke VirtualHost atau `.htaccess` Anda: + +```apache +AddType application/javascript .mjs +``` + +Lalu muat ulang Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Untuk memastikan: di DevTools browser → tab Network, temukan permintaan `.mjs` yang gagal dan periksa header respons `Content-Type`. Nilainya sekarang harus `application/javascript`, bukan `application/octet-stream`. + +### Rewrite Tidak Berfungsi + +Periksa bahwa mod_rewrite sudah diaktifkan: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel ke PDF Tidak Berfungsi + +LibreOffice WASM memerlukan `SharedArrayBuffer`, yang membutuhkan header berikut: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Ini juga memerlukan konteks aman (secure context). `http://localhost` berfungsi untuk pengujian lokal, tetapi `http://192.168.x.x` atau IP LAN lainnya biasanya memerlukan HTTPS. Jika header sudah ada tetapi `window.crossOriginIsolated` masih `false`, periksa apakah halaman dibuka melalui HTTP biasa pada origin non-loopback. + +File `.wasm.gz` dan `.data.gz` yang sudah terkompresi juga memerlukan `Content-Encoding` yang benar: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Pastikan `mod_headers` sudah diaktifkan: `sudo a2enmod headers` + +### Izin Ditolak + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/id/self-hosting/aws.md b/docs/id/self-hosting/aws.md new file mode 100644 index 00000000..1e89647c --- /dev/null +++ b/docs/id/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Deploy ke AWS S3 + CloudFront + +Hosting BentoPDF di AWS untuk kontrol dan skalabilitas maksimum. + +## Arsitektur + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Langkah 1: Buat Bucket S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Langkah 2: Build dan Unggah + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Langkah 3: Buat Distribusi CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Atau gunakan AWS Console: + +1. Buka CloudFront → Create distribution +2. Origin domain: pilih bucket S3 Anda +3. Aktifkan "Origin Access Control" +4. Default root object: `index.html` +5. Buat distribusi + +## Langkah 3b: Response Headers Policy (Diperlukan untuk LibreOffice WASM) + +Konversi berbasis LibreOffice (Word, Excel, PowerPoint ke PDF) memerlukan `SharedArrayBuffer`, yang membutuhkan header respons tertentu. Buat CloudFront Response Headers Policy: + +1. Buka CloudFront → Policies → Response headers +2. Buat kebijakan kustom dengan header berikut: + +| Header | Nilai | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Lampirkan kebijakan ke default cache behavior distribusi Anda + +Atau melalui CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Langkah 3c: Metadata S3 untuk File WASM yang Sudah Terkompresi + +File LibreOffice WASM sudah terkompresi (`.wasm.gz`, `.data.gz`). Atur Content-Type dan Content-Encoding yang benar agar browser dapat mendekompresinya: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Penting +Tanpa response headers policy, `SharedArrayBuffer` tidak tersedia dan konversi LibreOffice WASM akan macet di sekitar 55%. Tanpa Content-Encoding yang benar pada file `.gz`, browser menerima byte gzip mentah dan kompilasi WASM gagal. +::: + +## Langkah 4: Bucket Policy S3 + +Izinkan CloudFront mengakses bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Langkah 5: Halaman Error Kustom + +Konfigurasikan 404 agar mengembalikan `index.html` untuk routing SPA: + +1. CloudFront → Error pages +2. Buat custom error response: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Perkiraan Biaya + +| Sumber Daya | Perkiraan Biaya | +| -------------------------- | --------------- | +| S3 Storage (~500MB) | ~$0.01/bulan | +| CloudFront (1TB transfer) | ~$85/bulan | +| CloudFront (10GB transfer) | ~$0.85/bulan | + +::: tip +Gunakan S3 Intelligent Tiering untuk mengoptimalkan biaya pada file yang jarang diakses. +::: + +## Otomatisasi dengan Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/id/self-hosting/cloudflare.md b/docs/id/self-hosting/cloudflare.md new file mode 100644 index 00000000..9ea0ab6e --- /dev/null +++ b/docs/id/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Deploy ke Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) menawarkan hosting situs statis global yang cepat dengan bandwidth tak terbatas. + +## Deploy Cepat + +1. Buka [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Klik "Create a project" +3. Hubungkan repositori GitHub Anda + +## Konfigurasi Build + +| Pengaturan | Nilai | +| ---------------------- | --------------- | +| Framework preset | Tidak ada | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Environment Variable + +Tambahkan ini di Settings → Environment variables: + +| Variabel | Nilai | +| ----------------------- | ----------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (opsional) | +| `VITE_BRAND_NAME` | Nama merek kustom (opsional) | +| `VITE_BRAND_LOGO` | Path logo relatif terhadap `public/` (opsional) | +| `VITE_FOOTER_TEXT` | Teks footer/hak cipta kustom (opsional) | +| `VITE_DEFAULT_LANGUAGE` | Bahasa UI default, mis. `fr` (opsional) | + +## File Konfigurasi + +Buat `_headers` di folder `public` Anda: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Penting +Header `Cross-Origin-Embedder-Policy` dan `Cross-Origin-Opener-Policy` diperlukan untuk konversi Word/ODT/Excel/PowerPoint ke PDF. Tanpa keduanya, `SharedArrayBuffer` tidak tersedia dan mesin LibreOffice WASM gagal diinisialisasi. +::: + +Buat `_redirects` untuk routing SPA: + +``` +/* /index.html 200 +``` + +## Domain Kustom + +1. Buka proyek Pages Anda +2. Klik "Custom domains" +3. Tambahkan domain Anda +4. Cloudflare akan mengonfigurasi DNS secara otomatis jika domain berada di Cloudflare + +## Keunggulan + +- **Bandwidth tak terbatas gratis** +- **CDN global** dengan 300+ lokasi edge +- **HTTPS otomatis** +- **Deployment pratinjau** untuk pull request +- **Build cepat** + +## Pemecahan Masalah + +### Unggahan File Besar + +Cloudflare Pages mendukung file hingga 25 MB. Modul WASM seharusnya aman, tetapi jika Anda mencapai batas, pertimbangkan: + +```bash +# Split large files during build +npm run build +``` + +### Batas Ukuran Worker + +Jika menggunakan Cloudflare Workers untuk routing lanjutan, perhatikan batas 1 MB untuk paket gratis. + +## Worker CORS Proxy (Untuk Tanda Tangan Digital) + +Alat Tanda Tangan Digital memerlukan CORS proxy untuk mengambil rantai sertifikat. Deploy worker yang disertakan: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Fitur Keamanan + +| Fitur | Deskripsi | +| ------------------------- | ----------------------------------- | +| **Pembatasan URL** | Hanya URL sertifikat yang diizinkan | +| **Batas Ukuran File** | Maks 10MB per permintaan | +| **Pembatasan Laju** | 60 req/IP/menit (memerlukan KV) | +| **Pemblokiran IP Privat** | Memblokir localhost, IP internal | + +### Aktifkan Pembatasan Laju + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Build dengan URL Proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Atau dengan Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Catatan:** Lihat [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) untuk penyiapan tanda tangan HMAC. diff --git a/docs/id/self-hosting/cors-proxy.md b/docs/id/self-hosting/cors-proxy.md new file mode 100644 index 00000000..df1072bc --- /dev/null +++ b/docs/id/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS Proxy untuk Pengambilan Sertifikat + +Alat tanda tangan digital menggunakan CORS proxy untuk mengambil sertifikat penerbit dari Certificate Authority (CA) eksternal. Ini diperlukan karena banyak server CA tidak menyertakan header CORS dalam responsnya, sehingga pengambilan langsung dari browser tidak dapat dilakukan. + +Selain itu, banyak server CA menyajikan sertifikat melalui HTTP biasa. Saat instans BentoPDF Anda dihosting melalui HTTPS, browser memblokir permintaan HTTP ini (kebijakan mixed content). CORS proxy mengatasi kedua masalah tersebut dengan mengarahkan permintaan melalui endpoint HTTPS dengan header yang tepat. + +## Cara Kerjanya + +Saat menandatangani PDF dengan sertifikat: + +1. Pustaka `zgapdfsigner` mencoba membangun rantai sertifikat yang lengkap +2. Pustaka ini mengambil sertifikat penerbit dari URL yang tertanam di ekstensi AIA (Authority Information Access) sertifikat Anda +3. Permintaan ini diarahkan melalui CORS proxy yang menambahkan header `Access-Control-Allow-Origin` yang diperlukan +4. Proxy mengembalikan data sertifikat ke browser + +## Hosting Mandiri CORS Proxy + +Jika Anda menghosting BentoPDF sendiri, Anda perlu men-deploy CORS proxy sendiri agar tanda tangan digital dapat bekerja dengan sertifikat yang memerlukan pengambilan rantai. + +### Opsi 1: Cloudflare Workers (Disarankan) + +1. **Instal Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Login ke Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clone BentoPDF dan perbarui origin yang diizinkan**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Buka `cors-proxy-worker.js` dan ubah array `ALLOWED_ORIGINS` ke domain Anda: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Penting + Tanpa perubahan ini, proxy akan menolak semua permintaan dari situs Anda dengan error **403 Forbidden**. Secara default hanya permintaan dari `bentopdf.com` yang diizinkan. + ::: + +4. **Deploy proxy**: + + ```bash + wrangler deploy + ``` + + Catat URL worker Anda (mis., `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Build ulang BentoPDF dengan URL proxy**: + + Jika menggunakan Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Jika build dari sumber: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Opsi 2: Proxy Backend Kustom + +Anda juga dapat membuat endpoint proxy sendiri. Persyaratannya: + +1. Menerima permintaan GET dengan parameter query `url` +2. Mengambil URL tersebut dari server Anda (tanpa pembatasan CORS di sisi server) +3. Mengembalikan respons dengan header berikut: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Contoh implementasi Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Pertimbangan Keamanan + +Cloudflare Worker yang disertakan memiliki beberapa langkah keamanan: + +| Fitur | Deskripsi | +| ------------------------- | ------------------------------------------------------------------------------------------------ | +| **Validasi Origin** | Hanya mengizinkan permintaan dari domain yang tercantum di `ALLOWED_ORIGINS` | +| **Pembatasan URL** | Hanya mengizinkan URL sertifikat (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Pemblokiran IP Privat** | Memblokir rentang privat IPv4/IPv6, link-local, loopback, IP desimal, dan metadata cloud | +| **Keamanan Content-Type** | Hanya mengembalikan MIME type sertifikat yang aman, memblokir injeksi content-type dari upstream | +| **Batas Ukuran File** | Men-stream respons dengan batas 10MB, menghentikan unduhan jika terlampaui | +| **Pembatasan Laju** | 60 permintaan per menit per IP atau IPv6 /64 (memerlukan KV, tetap lolos saat KV error) | +| **Tanda Tangan HMAC** | Penandatanganan sisi klien opsional (mencegah penyalahgunaan biasa) | + +### DNS rebinding (hosting mandiri di luar Cloudflare) + +Worker menolak setiap URL yang me-resolve ke IP privat atau internal. Worker tidak dapat memakai allowlist host tetap, karena URL rantai sertifikat menunjuk ke CA mana pun yang menerbitkan sertifikat (FNMT, CA korporat, dan seterusnya), sehingga tujuannya tidak diketahui sebelumnya. Hal ini menyisakan celah rebinding kecil: seseorang yang menjalankan DNS untuk domainnya sendiri dapat memberikan IP publik pada pemeriksaan keamanan dan IP privat pada permintaan sebenarnya beberapa saat kemudian. + +Di Cloudflare hal ini tidak dapat dieksploitasi: Workers tidak dapat menjangkau IP privat atau endpoint metadata `169.254.169.254`, sehingga rebind tidak mengenai apa pun. Hanya saja, jangan beri worker jalan masuk: jangan pasang Tunnel, Service, atau binding jaringan privat (worker hanya memerlukan `RATE_LIMIT_KV`). + +Jika Anda menjalankannya di luar Cloudflare (workerd, Node, dan sejenisnya) di dalam VPC, runtime _dapat_ menjangkau IP internal. Pasang firewall egress di depannya dan blokir rentang privat: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16`, beserta padanan IPv6-nya. Kode aplikasi tidak dapat menegakkannya setelah Anda berada di luar Cloudflare. + +## Menonaktifkan Proxy + +Jika Anda tidak ingin menggunakan CORS proxy, atur environment variable ke string kosong: + +``` +VITE_CORS_PROXY_URL= +``` + +**Catatan**: Tanpa proxy, penandatanganan dengan sertifikat yang memerlukan pengambilan rantai eksternal (seperti FNMT atau beberapa CA korporat) akan gagal dengan error "Failed to fetch". + +## Pemecahan Masalah + +### "Signing error: TypeError: Failed to fetch" + +Ini biasanya berarti salah satu dari: + +1. **CORS proxy belum dikonfigurasi**: Atur `VITE_CORS_PROXY_URL` dan build ulang +2. **Mixed content diblokir**: Situs Anda HTTPS tetapi URL penerbit sertifikat adalah HTTP. CORS proxy mengatasi hal ini. +3. **CORS proxy menolak origin Anda**: Periksa apakah domain Anda ada di array `ALLOWED_ORIGINS` pada `cors-proxy-worker.js` + +### "403 Forbidden" dari proxy + +Domain Anda tidak ada di daftar `ALLOWED_ORIGINS`. Edit `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Lalu deploy ulang: `npx wrangler deploy` + +### Menguji proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Sertifikat yang Berfungsi Tanpa Proxy + +Beberapa sertifikat menyertakan rantai lengkap di file P12/PFX dan tidak memerlukan pengambilan eksternal: + +- Sertifikat self-signed +- Beberapa CA komersial yang menyertakan sertifikat perantara +- Sertifikat yang Anda rakit sendiri dengan rantai lengkap diff --git a/docs/id/self-hosting/docker.md b/docs/id/self-hosting/docker.md new file mode 100644 index 00000000..5430b1e4 --- /dev/null +++ b/docs/id/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Deploy dengan Docker / Podman + +Cara termudah untuk menghosting BentoPDF sendiri di lingkungan produksi. + +> [!IMPORTANT] +> **Header yang Diperlukan untuk Konversi File Office** +> +> Alat berbasis LibreOffice (konversi Word, Excel, PowerPoint) memerlukan header HTTP berikut untuk dukungan `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Halaman juga harus disajikan dari konteks aman (secure context). `http://localhost` berfungsi untuk pengujian lokal, tetapi `http://192.168.x.x` atau IP LAN lainnya biasanya tidak memenuhi syarat, sehingga konversi Office melalui HTTP biasa akan gagal meskipun header sudah ada. +> +> Image container resmi sudah menyertakan header ini. Jika menggunakan reverse proxy (Traefik, Caddy, dll.), pastikan header ini dipertahankan atau ditambahkan, dan gunakan HTTPS untuk akses non-loopback. + +> [!TIP] +> **Pengguna Podman:** Semua perintah `docker` dapat dipakai dengan Podman dengan mengganti `docker` menjadi `podman` dan `docker-compose` menjadi `podman-compose`. + +## Mulai Cepat + +> [!TIP] +> BentoPDF tersedia dalam dua build: +> +> - **Self-Hosted build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Semua alat PDF, **tanpa** elemen pemasaran (tanpa hero, FAQ, testimoni, footer). Gunakan ini untuk penerapan internal/tim/organisasi. Ini **bukan** versi "lite" dengan fitur yang dikurangi. +> - **Commercial build**: `ghcr.io/alam00000/bentopdf:latest`. Situs pemasaran lengkap, digunakan oleh bentopdf.com sendiri dan oleh pemegang lisensi komersial yang menjalankan penerapan publik. +> +> Jika ragu: gunakan Self-Hosted build. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Buat `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Jalankan: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Build Image Anda Sendiri + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Build dan jalankan: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Environment Variable + +| Variabel | Deskripsi | Default | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Build varian Self-Hosted (menyembunyikan elemen pemasaran bentopdf.com: hero, FAQ, testimoni, footer). Semua alat PDF tetap ada. | `false` | +| `BASE_URL` | Deploy ke subdirektori | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL modul WASM PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL modul WASM Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL modul WASM CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL skrip worker OCR | _(kosong; gunakan CDN default Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Direktori runtime inti OCR | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_LANG_URL` | Direktori traineddata OCR | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Bahasa OCR yang ditampilkan di UI, dipisahkan koma | _(kosong; tampilkan katalog lengkap)_ | +| `VITE_OCR_FONT_BASE_URL` | Direktori font lapisan teks OCR | _(kosong; gunakan URL font Noto jarak jauh)_ | +| `VITE_DEFAULT_LANGUAGE` | Bahasa UI default | `en` | +| `VITE_BRAND_NAME` | Nama merek kustom | `BentoPDF` | +| `VITE_BRAND_LOGO` | Path logo relatif terhadap `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Teks footer/hak cipta kustom | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID alat yang disembunyikan, dipisahkan koma | _(kosong; semua alat aktif)_ | +| `DISABLE_GITHUB_STARS` | Lewati pengambilan jumlah bintang GitHub saat halaman dimuat dan hapus `api.github.com` dari CSP. Build Simple Mode selalu melewatinya. | `false` | +| `SITE_URL` | URL publik yang ditulis ke tautan canonical, hreflang, dan sitemap. Biarkan default kecuali Anda ingin mesin pencari memperlakukan deployment Anda sebagai situs tersendiri. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Dengan `SITE_URL` kustom, setiap halaman ditandai `noindex` agar salinan Anda tidak bersaing dengan bentopdf.com di hasil pencarian. Atur ke `true` agar mesin pencari mengindeksnya. | `false` | + +URL modul WASM sudah dikonfigurasi dengan default CDN, sehingga semua fitur lanjutan langsung berfungsi. Timpa nilai ini untuk deployment air-gapped atau hosting mandiri. + +### Mesin pencari + +Secara default, setiap halaman mengarahkan mesin pencari ke bentopdf.com sebagai sumber aslinya, sehingga deployment Anda tidak muncul sebagai duplikat. Anda tidak perlu mengubah apa pun untuk instans privat atau internal. + +- **Sembunyikan instans Anda sepenuhnya dari hasil pencarian:** jalankan container dengan `-e ROBOTS_NOINDEX=true`. Ini hanya perlu restart, tidak perlu build ulang. +- **Jadikan instans Anda situs tersendiri di hasil pencarian:** build dengan `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Tanpa `ALLOW_INDEXING=true`, `SITE_URL` kustom menandai setiap halaman `noindex`. + +### Content-Security-Policy + +Image nginx dilengkapi header `Content-Security-Policy` yang ditegakkan. Direktif `script-src`, `connect-src`, dan `font-src` pada CSP **dibuat saat build** dari variabel URL `VITE_*` di atas, sehingga host apa pun yang Anda berikan melalui `--build-arg` otomatis ditambahkan ke kebijakan. + +Dengan demikian: + +- Jika Anda menimpa `VITE_CORS_PROXY_URL` atau `VITE_WASM_*_URL` saat build, CSP otomatis mengizinkan origin tersebut, tanpa konfigurasi tambahan. +- Untuk URL di `cdn.jsdelivr.net`, `script-src` hanya mengizinkan folder paket dengan versi yang tepat, misalnya `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, bukan seluruh CDN. jsDelivr menyajikan paket npm publik atau repositori GitHub mana pun, sehingga mengizinkan seluruh host berarti semuanya dapat berjalan di instans Anda. URL di host lain diizinkan berdasarkan origin. +- Jika Anda mengonfigurasi URL WASM kustom saat _runtime_ melalui halaman Pengaturan Lanjutan di aplikasi, origin tersebut **tidak** ada di CSP dan browser akan memblokir pengambilannya. Hal ini juga berlaku untuk versi lain dari paket yang sama di `cdn.jsdelivr.net`, karena hanya versi yang diatur saat build yang diizinkan. Konfigurasi runtime ditujukan untuk eksperimen; untuk URL kustom permanen, atur build arg `VITE_*` yang sesuai. +- Deployment air-gapped yang menimpa ketiga nilai `VITE_WASM_*_URL` juga menghapus folder paket `cdn.jsdelivr.net` tersebut dari CSP (setiap default diganti, bukan ditambahkan). Default Tesseract OCR di `cdn.jsdelivr.net` tetap ada di kebijakan sampai Anda juga mengatur ketiga nilai `VITE_TESSERACT_*`. Demikian pula, mengatur `VITE_CORS_PROXY_URL` menggantikan default publik `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP menyertakan `'unsafe-eval'` di `script-src` karena runtime LibreOffice WASM (digunakan alat konversi Word/Excel/PowerPoint) dan pustaka gambar wasm-vips (digunakan PDF ke TIFF) mengompilasi kode dispatch internal melalui `new Function()`. Menghapusnya akan merusak alat-alat tersebut. Jika Anda build dengan `SIMPLE_MODE` (tanpa LibreOffice) dan tidak memerlukan PDF ke TIFF, Anda dapat mengedit `security-headers.conf` yang dihasilkan secara manual untuk membuang `'unsafe-eval'` demi kebijakan yang lebih ketat. + +Untuk OCR, biarkan variabel `VITE_TESSERACT_*` kosong untuk memakai aset online default, atau atur ketiganya sekaligus untuk OCR hosting mandiri/offline. Penimpaan OCR sebagian ditolak karena worker, runtime inti, dan direktori traineddata harus cocok. Untuk keluaran PDF yang dapat dicari secara offline penuh, atur juga `VITE_OCR_FONT_BASE_URL` agar font lapisan teks OCR dimuat dari server internal Anda, bukan dari URL font Noto publik. + +`VITE_DEFAULT_LANGUAGE` menentukan bahasa UI untuk pengunjung pertama kali. Nilai yang didukung: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Pengguna tetap dapat berganti bahasa, ini hanya mengubah default. + +Contoh: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Branding Kustom + +Ganti logo, nama, dan teks footer BentoPDF default dengan milik Anda. Letakkan file logo di folder `public/` (atau gunakan gambar yang sudah ada), lalu berikan variabel branding saat build: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Branding berfungsi di mode penuh maupun Simple Mode, dan dapat dikombinasikan dengan semua opsi build lainnya. + +### Menonaktifkan Alat Tertentu + +Sembunyikan alat dari UI untuk kebutuhan kepatuhan atau keamanan. Alat yang dinonaktifkan dihapus dari beranda, hasil pencarian, pintasan keyboard, dan workflow builder. Akses URL langsung menampilkan halaman "alat tidak tersedia". + +ID alat adalah URL halaman tanpa `.html`. Misalnya, jika alat berada di `bentopdf.com/edit-pdf.html`, ID-nya adalah `edit-pdf`. + +#### Menemukan ID Alat + +Cara termudah: buka alat apa pun di BentoPDF dan lihat URL-nya. Bagian terakhir dari path (tanpa `.html`) adalah ID alat. + +
+Daftar lengkap ID alat + +**Edit & Anotasi:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Konversi ke PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Konversi dari PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Atur & Kelola:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimalkan & Perbaiki:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Keamanan:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Opsi 1: Saat build (Docker build arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Ini menanamkan daftar yang dinonaktifkan ke dalam bundel JavaScript. Perlu build ulang untuk mengubahnya. + +#### Opsi 2: Saat runtime (config.json) + +Mount file `config.json` ke direktori yang disajikan, tanpa perlu build ulang: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Atau dengan Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Kedua metode dapat digabungkan: daftarnya digabung. Jika sebuah alat muncul di salah satunya, alat itu dinonaktifkan. + +#### Menonaktifkan Fitur Editor + +Anda juga dapat menonaktifkan fitur tertentu di dalam Editor PDF (mis., redaksi, anotasi, formulir) tanpa menonaktifkan seluruh alat editor. Tambahkan `editorDisabledCategories` ke `config.json` Anda: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Daftar lengkap kategori editor + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Anotasi:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Bentuk:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulir:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Redaksi:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Dokumen:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Halaman:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Alat:** `tools`, `pan`, `pointer`, `capture` + +**Pilihan:** `selection`, `selection-copy` + +**Riwayat:** `history`, `history-undo`, `history-redo` + +
+ +Kategori bersifat hierarkis: menonaktifkan induk (mis., `annotation`) menonaktifkan semua turunannya. + +### Menonaktifkan Penghitung Bintang GitHub + +Navbar menampilkan jumlah bintang GitHub secara langsung, diambil dari `api.github.com` saat halaman dimuat. Ini satu-satunya permintaan eksternal yang tidak melayani fitur PDF. Nonaktifkan saat build untuk menghapus kode pengambilan dari bundel dan membuang `api.github.com` dari Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Build Simple Mode (`bentopdf-simple`) selalu melewati penghitung bintang, flag ini hanya diperlukan pada Commercial build atau build penuh kustom. + +### URL WASM Kustom (Air-Gapped / Hosting Mandiri) + +> [!IMPORTANT] +> URL WASM ditanamkan ke JavaScript saat **build**. File WASM diunduh oleh **browser pengguna** saat runtime, Docker tidak mengunduhnya selama build. Untuk jaringan air-gapped, Anda harus menghosting file WASM di server internal yang dapat dijangkau browser. + +**Alur kerja air-gapped lengkap:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Gunakan kode yang dicetak oleh `bash scripts/prepare-airgap.sh --list-ocr-languages`, atau cari berdasarkan nama dengan `bash scripts/prepare-airgap.sh --search-ocr-language `, untuk `--ocr-languages`. Saat build dengan subset OCR terbatas, berikan kode yang sama ke `VITE_TESSERACT_AVAILABLE_LANGUAGES` agar aplikasi hanya menampilkan bahasa yang disertakan. Untuk keluaran OCR offline penuh, hosting juga direktori `ocr-fonts/` bawaan dan arahkan `VITE_OCR_FONT_BASE_URL` ke sana. + +Atur variabel ke string kosong untuk menonaktifkan modul tersebut (pengguna harus mengonfigurasinya secara manual melalui Pengaturan Lanjutan). + +## Port Kustom + +Secara default, BentoPDF mendengarkan di port `8080` di dalam container. Untuk mengubahnya, atur environment variable `PORT` saat runtime: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variabel | Deskripsi | Default | +| -------- | ------------------------------ | ------- | +| `PORT` | Port listen Nginx di container | `8080` | + +Ini berfungsi dengan Dockerfile standar maupun nonroot. + +## User ID Kustom (PUID/PGID) + +Untuk lingkungan yang mengharuskan berjalan sebagai user non-root tertentu (perangkat NAS, Kubernetes dengan security context, kebijakan organisasi), BentoPDF menyediakan Dockerfile terpisah dengan dukungan PUID/PGID ala LSIO. + +### Build dan Jalankan + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Environment Variable + +| Variabel | Deskripsi | Default | +| -------------- | -------------------------- | ------- | +| `PUID` | User ID untuk menjalankan | `1000` | +| `PGID` | Group ID untuk menjalankan | `1000` | +| `PORT` | Port listen Nginx | `8080` | +| `DISABLE_IPV6` | Nonaktifkan listener IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Cara Kerjanya + +Container dimulai sebagai root, membuat user dengan PUID/PGID yang ditentukan, menyesuaikan kepemilikan pada semua direktori yang dapat ditulis, lalu menurunkan hak akses menggunakan `su-exec`. Proses nginx berjalan sepenuhnya sebagai user yang Anda tentukan. + +> [!NOTE] +> `Dockerfile` standar menggunakan `nginx-unprivileged` (UID 101) dan direkomendasikan untuk sebagian besar deployment. Gunakan `Dockerfile.nonroot` hanya jika Anda memerlukan UID/GID tertentu. + +> [!WARNING] +> PUID/PGID tidak boleh `0` (root). Entrypoint memvalidasi input dan akan keluar dengan error untuk nilai yang tidak valid. + +## Dengan Traefik (Reverse Proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Dengan Caddy (Reverse Proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Batas Sumber Daya + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (Systemd Integration) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) memungkinkan Anda menjalankan container Podman sebagai layanan systemd. Ini ideal untuk deployment produksi di sistem Linux. + +### Penyiapan Quadlet Dasar + +Buat file unit container di `~/.config/containers/systemd/bentopdf.container` (user) atau `/etc/containers/systemd/bentopdf.container` (sistem): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Aktifkan dan Mulai + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Untuk deployment tingkat sistem, gunakan `systemctl` tanpa flag `--user` dan letakkan file di `/etc/containers/systemd/`. + +### Quadlet dengan Health Check + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Auto-Update dengan Quadlet + +Podman dapat memperbarui container secara otomatis saat image baru tersedia: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Konfigurasi Jaringan Quadlet + +Untuk konfigurasi jaringan kustom, buat file jaringan `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Lalu referensikan di file container Anda: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Memperbarui + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/id/self-hosting/hostinger.md b/docs/id/self-hosting/hostinger.md new file mode 100644 index 00000000..c267f408 --- /dev/null +++ b/docs/id/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Deploy ke Hostinger + +[Hostinger](https://hostinger.com) adalah penyedia shared hosting yang populer. Panduan ini membahas cara men-deploy BentoPDF ke shared hosting Hostinger. + +## Prasyarat + +- Paket hosting Hostinger dengan akses file manager +- Node.js terinstal secara lokal untuk build + +## Langkah 1: Build Proyek + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +File hasil build akan berada di folder `dist`. + +## Langkah 2: Unggah ke Hostinger + +### Deploy di Domain Root + +1. Masuk ke akun Hostinger Anda +2. Buka **File Manager** → **public_html** +3. **Hapus** semua file yang ada (buat cadangan jika perlu) +4. **Unggah** seluruh isi folder `dist` lokal Anda ke `public_html` + +### Deploy di Subdirektori + +Jika men-deploy ke subdirektori (mis., `yourdomain.com/pdf-tools/`): + +1. Build dengan base URL yang benar: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Buat folder di Hostinger: + - Buka **File Manager** → **public_html** + - Buat folder baru: `pdf-tools` +3. Unggah seluruh isi `dist` ke `public_html/pdf-tools/` + +## Langkah 3: Buat File .htaccess + +Buat file `.htaccess` di root folder deployment Anda (`public_html` atau `public_html/pdf-tools/`): + +::: warning Penting +Untuk deploy di subdirektori, ubah `RewriteBase /` menjadi `RewriteBase /pdf-tools/` (atau nama folder Anda). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Contoh .htaccess untuk Subdirektori + +Untuk `yourdomain.com/pdf-tools/`, perbarui baris berikut: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Pemecahan Masalah + +### File WASM Tidak Dimuat + +Pastikan MIME type sudah diatur dengan benar di `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Alat LibreOffice Tidak Berfungsi + +Header keamanan sangat penting untuk SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Jika header tidak diterapkan, hubungi dukungan Hostinger untuk mengaktifkan `mod_headers`. + +### Error 404 Saat Halaman Dimuat Ulang + +Pastikan aturan ekstensi `.html` dan rute bahasa dikonfigurasi dengan benar. BentoPDF menggunakan file HTML statis, bukan routing SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Batas Unggahan File + +Hostinger mungkin memiliki batas ukuran file. Unggah file WASM secara terpisah jika unggahan massal gagal. diff --git a/docs/id/self-hosting/index.md b/docs/id/self-hosting/index.md new file mode 100644 index 00000000..a4844ec8 --- /dev/null +++ b/docs/id/self-hosting/index.md @@ -0,0 +1,538 @@ +# Panduan Self-Hosting + +BentoPDF dapat di-host sendiri pada infrastruktur Anda. Panduan ini mencakup berbagai opsi deployment. + +## Mulai Cepat dengan Docker / Podman + +Cara tercepat untuk self-host BentoPDF: + +> [!TIP] +> BentoPDF tersedia dalam dua build: +> +> - **Build Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Semua alat PDF, **tanpa** elemen pemasaran (tanpa hero, FAQ, testimoni, footer). Gunakan ini untuk deployment internal/tim/organisasi. Ini **bukan** versi "lite" dengan fitur yang dikurangi. +> - **Build Commercial**: `ghcr.io/alam00000/bentopdf:latest`. Situs pemasaran lengkap, dipakai oleh bentopdf.com sendiri dan oleh pemegang lisensi komersial yang menjalankan deployment publik. +> +> Jika ragu: gunakan build Self-Hosted. + +> [!IMPORTANT] +> Konversi file Office memerlukan `SharedArrayBuffer`, yang berarti aplikasi harus terisolasi lintas origin sekaligus dilayani dari konteks aman (secure context). Image resmi sudah mengirim header COOP/COEP yang diperlukan, tetapi browser tetap menonaktifkan `SharedArrayBuffer` pada origin jaringan lokal HTTP biasa seperti `http://192.168.x.x`. +> +> Gunakan `http://localhost` hanya untuk pengujian di perangkat yang sama. Jika pengguna mengakses BentoPDF melalui IP LAN atau hostname, akhiri koneksi dengan HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Atau dengan Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Jalankan BentoPDF sebagai layanan systemd. Buat `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Lihat [panduan deployment Docker](/id/self-hosting/docker) untuk dokumentasi Quadlet lengkap. + +## Build dari Source + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Opsi Konfigurasi + +### Build Self-Hosted (Simple Mode) + +Build Self-Hosted (image `bentopdf-simple`, juga disebut Simple Mode) **secara fungsional identik** dengan build Commercial: semua alat PDF tersedia dan berperilaku sama. Build ini hanya menyembunyikan elemen pemasaran yang hanya masuk akal di bentopdf.com sendiri atau pada deployment komersial yang terbuka untuk publik. **Ini bukan versi dengan fitur yang dikurangi atau "lite".** + +**Yang disembunyikan build Self-Hosted** (hanya kosmetik, tidak ada fitur PDF yang dihapus): + +- Bilah navigasi, bagian hero, bagian fitur, FAQ, testimoni, footer +- Mengubah judul halaman menjadi "Alat PDF" + +**Yang dipertahankan build Self-Hosted** (semua yang benar-benar mengerjakan PDF): + +- Semua alat PDF (gabung, pisah, edit, tanda tangan, OCR, konversi Office, dll.) +- Dukungan branding kustom, semua konfigurasi build-time dan runtime + +Build Commercial (`ghcr.io/alam00000/bentopdf:latest`) adalah yang menjalankan bentopdf.com sendiri dan dipakai oleh pemegang lisensi komersial yang menjalankan deployment publik. Build ini menambahkan hero, FAQ, testimoni, dan footer yang tidak masuk akal pada alat internal. + +Jika Anda self-host BentoPDF untuk tim, organisasi, atau sebagai alat internal, gunakan build Self-Hosted: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Lihat [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) untuk detail lengkap. + +### Build Commercial (deployment publik dengan merek Anda sendiri) + +Build Commercial (image `bentopdf`, tanpa akhiran `-simple`) adalah yang menjalankan bentopdf.com sendiri. Build ini menyertakan situs pemasaran lengkap (hero, fitur, FAQ, testimoni, footer) di atas semua alat PDF. Gunakan build ini saat Anda ingin **men-deploy BentoPDF sebagai layanan PDF publik dengan merek Anda sendiri**, misalnya: + +- Anda menjalankan BentoPDF sebagai SaaS terkelola untuk pengguna akhir di domain Anda sendiri +- Anda menginginkan pengalaman halaman landing (bagian pemasaran + alat), bukan hanya tampilan alat saja +- Anda pemegang lisensi komersial yang menyematkan BentoPDF ke dalam produk komersial + +**Jalankan apa adanya** (branding BentoPDF, berguna untuk melihat pratinjau build): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Build dengan merek Anda sendiri** (alur kerja komersial yang umum): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Setiap opsi build-time lainnya (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, override URL WASM, dll.) bekerja dengan cara yang sama seperti pada build Self-Hosted. + +::: warning Lisensi +Menjalankan build Commercial diizinkan di bawah salah satu dari dua opsi lisensi BentoPDF: + +- **AGPL-3.0** (gratis): diizinkan jika deployment Anda mempublikasikan seluruh source code di bawah AGPL, termasuk modifikasi branding dan logika bisnis di sekitarnya. +- **Lisensi komersial** ($79 seumur hidup): diperlukan untuk deployment sumber tertutup/berpemilik (closed-source/proprietary) di mana Anda tidak membuka source code fork branding atau kode bisnis Anda. + +Lihat [halaman Lisensi](https://www.bentopdf.com/licensing) untuk perbandingan lengkap. Modul WASM berlisensi AGPL (PyMuPDF, Ghostscript, CoherentPDF) dimuat dari CDN saat runtime, sehingga tidak masuk ke image Anda dan tidak mengubah posisi lisensi Anda. +::: + +### Base URL + +Deploy ke subdirektori: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Branding Kustom + +Ganti logo, nama, dan teks footer BentoPDF default dengan milik Anda saat build: + +| Variabel | Deskripsi | Default | +| ------------------ | ------------------------------------ | --------------------------------------- | +| `VITE_BRAND_NAME` | Nama merek di header dan footer | `BentoPDF` | +| `VITE_BRAND_LOGO` | Path logo relatif terhadap `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Teks footer/hak cipta kustom | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Atau melalui Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Branding berfungsi pada mode penuh maupun Simple Mode, dan dapat dikombinasikan dengan semua opsi build-time lainnya (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Menonaktifkan Alat Tertentu + +Sembunyikan alat tertentu demi kepatuhan atau keamanan. Alat yang dinonaktifkan dihapus dari beranda, pencarian, pintasan, pembuat alur kerja, dan akses URL langsung. + +ID alat adalah URL halaman tanpa `.html`: buka alat apa pun dan lihat URL-nya (misalnya `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Build-time** (tertanam dalam bundle): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Runtime** (tanpa build ulang, mount `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Kedua metode dapat dikombinasikan, daftarnya digabungkan. + +Anda juga dapat menonaktifkan fitur tertentu di dalam Editor PDF (misalnya redaksi) tanpa menonaktifkan seluruh alat dengan menambahkan `editorDisabledCategories` ke `config.json`. Lihat [panduan Docker](/id/self-hosting/docker#menonaktifkan-fitur-editor) untuk daftar lengkap kategori. + +## Panduan Deployment + +Pilih platform Anda: + +- [Vercel](/id/self-hosting/vercel) +- [Netlify](/id/self-hosting/netlify) +- [Cloudflare Pages](/id/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/id/self-hosting/aws) +- [Hostinger](/id/self-hosting/hostinger) +- [Nginx](/id/self-hosting/nginx) +- [Apache](/id/self-hosting/apache) +- [Docker](/id/self-hosting/docker) +- [Kubernetes](/id/self-hosting/kubernetes) +- [CORS Proxy](/id/self-hosting/cors-proxy) - Diperlukan untuk tanda tangan digital + +## Masalah Umum + +### Word / ODT / Excel / PowerPoint ke PDF Macet (SharedArrayBuffer Tidak Tersedia) + +**Gejala**: Konversi dokumen berbasis LibreOffice (Word, ODT, Excel, PowerPoint ke PDF) macet di ~55% atau gagal dimulai. Konsol browser mungkin menampilkan: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...atau `window.crossOriginIsolated` melaporkan `false`, atau kompilasi WASM melaporkan `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Penyebab**: LibreOffice WASM memerlukan `SharedArrayBuffer`, yang hanya diaktifkan browser ketika halaman **terisolasi lintas origin** DAN dilayani dari **konteks aman (secure context)**. Artinya dua hal harus terpenuhi: + +1. Setiap respons menyertakan kedua header berikut: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Halaman dilayani dari `https://...` atau `http://localhost`. HTTP biasa pada IP LAN (mis. `http://192.168.x.x`) TIDAK dianggap aman: browser menonaktifkan `SharedArrayBuffer` di sana. + +Ketidakcocokan `00 61 73 6d / 1f 8b 08 08` adalah sub-gejala tersendiri: file `.wasm.gz` / `.data.gz` yang sudah dikompresi tidak memiliki header respons `Content-Encoding: gzip`, sehingga browser menerima byte gzip mentah, bukan WASM yang sudah didekompresi. + +**Solusi**: lihat panduan deployment khusus platform Anda untuk konfigurasi yang tepat: + +- [Nginx →](/id/self-hosting/nginx#word-odt-excel-ke-pdf-tidak-berfungsi) +- [Apache →](/id/self-hosting/apache#word-odt-excel-ke-pdf-tidak-berfungsi) +- [AWS S3 + CloudFront →](/id/self-hosting/aws#langkah-3b-response-headers-policy-diperlukan-untuk-libreoffice-wasm) +- [Cloudflare Pages →](/id/self-hosting/cloudflare#file-konfigurasi) (`_headers` file) +- [Netlify →](/id/self-hosting/netlify#word-odt-excel-ke-pdf-macet-di-55) (`netlify.toml`) +- [Vercel →](/id/self-hosting/vercel#word-odt-excel-ke-pdf-tidak-berfungsi) (`vercel.json`) +- [Hostinger →](/id/self-hosting/hostinger#alat-libreoffice-tidak-berfungsi) (`.htaccess`) +- [Kubernetes →](/id/self-hosting/kubernetes#memastikan-header-sharedarraybuffer-tetap-berfungsi-ingress-gateway) +- **Docker**: ditangani otomatis oleh konfigurasi nginx bawaan, tidak perlu tindakan. + +**Verifikasi**: buka Konsol DevTools di halaman BentoPDF mana pun dan jalankan: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Jika halaman menggunakan HTTPS atau `http://localhost` DAN kedua header COEP/COOP ada pada setiap respons, kedua pemeriksaan lulus. Jika Anda berada di `http://192.168.x.x` atau origin HTTP non-loopback lainnya, akhiri koneksi dengan HTTPS: tidak ada solusi yang hanya berupa header. + +### File `.mjs` Dilayani sebagai `application/octet-stream` + +**Gejala**: Tanda Tangani PDF / Form Filler / beberapa alat lain menampilkan penampil kosong atau gagal dimuat. Konsol browser melaporkan: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Penyebab**: Web server atau reverse proxy Anda tidak memiliki pemetaan MIME-type untuk file `.mjs` (penampil PDF bawaan menyertakan modul ES dengan ekstensi itu). Banyak konfigurasi server bawaan menggunakan `application/octet-stream` untuk ekstensi yang tidak dikenali, yang menolak dieksekusi browser sebagai modul ES. + +**Solusi**: lihat panduan deployment khusus platform Anda untuk potongan konfigurasi yang tepat: + +- [Nginx →](/id/self-hosting/nginx#tanda-tangani-pdf-atau-form-filler-menampilkan-penampil-kosong-error-mime-mjs) +- [Apache →](/id/self-hosting/apache#tanda-tangani-pdf-atau-form-filler-menampilkan-penampil-kosong-error-mime-mjs) +- [AWS S3 + CloudFront →](/id/self-hosting/aws#langkah-2-build-dan-unggah) (lihat `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/id/self-hosting/kubernetes#error-mime-type-mjs-iframe-tanda-tangani-pdf-form-filler-kosong) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: ditangani otomatis, tidak perlu tindakan. + +**Verifikasi**: buka DevTools → tab Network, cari permintaan `.mjs` yang gagal, periksa header respons `Content-Type`. Seharusnya `application/javascript`. Jika masih `application/octet-stream`, reverse proxy atau CDN di luar mungkin mendeteksi ulang tipenya: periksa setiap lapisan dalam rantai layanan Anda. + +## Konfigurasi WASM (Komponen AGPL) + +BentoPDF **tidak menyertakan** pustaka pemrosesan berlisensi AGPL dalam source code-nya, tetapi **sudah mengonfigurasi URL CDN** sehingga semua fitur langsung berfungsi tanpa pengaturan manual. + +::: tip Tanpa Konfigurasi secara Default +Sejak v2.0.0, modul WASM sudah dikonfigurasi untuk dimuat dari CDN jsDelivr melalui variabel lingkungan. Semua fitur lanjutan langsung berfungsi tanpa konfigurasi pengguna. +::: + +| Komponen | Lisensi | Fitur | +| --------------- | -------- | ------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Konversi EPUB/MOBI/FB2/XPS, ekstraksi gambar, ekstraksi tabel | +| **Ghostscript** | AGPL-3.0 | Konversi PDF/A, kompresi, deskewing, rasterisasi | +| **CoherentPDF** | AGPL-3.0 | Daftar isi, lampiran, penggabungan PDF dengan bookmark | + +### Variabel Lingkungan Default + +Variabel ini diatur di `.env.production` dan tertanam dalam build: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Menimpa URL WASM + +Anda dapat menimpa nilai default saat build untuk deployment kustom: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Untuk menonaktifkan sebuah modul sepenuhnya (memerlukan konfigurasi manual pengguna melalui Pengaturan Lanjutan), atur variabelnya ke string kosong. + +Untuk OCR, biarkan semua variabel `VITE_TESSERACT_*` kosong dan gunakan aset online default, atau atur URL worker/core/lang bersamaan untuk OCR self-hosted/offline. Jika Anda hanya menyertakan bahasa OCR tertentu, atur juga `VITE_TESSERACT_AVAILABLE_LANGUAGES` dengan kode yang sama (dipisahkan koma) agar UI hanya menawarkan bahasa yang terpasang dan pilihan yang tidak didukung gagal dengan pesan error yang jelas. Untuk keluaran PDF yang dapat dicari sepenuhnya offline, atur juga `VITE_OCR_FONT_BASE_URL` ke direktori internal yang melayani font OCR bawaan. + +Pengguna juga dapat menimpa nilai default ini kapan saja melalui **Pengaturan Lanjutan** di UI. Penimpaan pengguna yang tersimpan di browser lebih diprioritaskan daripada default lingkungan. + +### Deployment Air-Gapped / Offline + +Untuk jaringan tanpa akses internet (pemerintah, kesehatan, keuangan, dll.). URL WASM tertanam ke dalam JavaScript pada **waktu build**, sedangkan file WASM sebenarnya diunduh oleh **browser pengguna** saat runtime. Jadi Anda perlu menyiapkan semuanya di mesin yang terhubung internet, lalu memindahkannya ke jaringan terisolasi. + +#### Skrip Otomatis (Disarankan) + +Skrip `prepare-airgap.sh` yang disertakan mengotomatiskan seluruh proses: mengunduh paket WASM, membangun image Docker, dan menghasilkan bundel mandiri beserta skrip setup. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Ini menghasilkan direktori bundel: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Pindahkan bundel ke jaringan air-gapped melalui USB, repositori artefak internal, atau metode yang disetujui. Lalu jalankan skrip setup yang disertakan: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Skrip setup memuat image Docker, mengekstrak file WASM, dan secara opsional memulai kontainer. + +**Opsi skrip:** + +| Flag | Deskripsi | Default | +| ------------------------------ | -------------------------------------------------- | --------------------------------- | +| `--wasm-base-url ` | Tempat WASM akan di-host secara internal | _(wajib, ditanyakan jika kosong)_ | +| `--image-name ` | Tag image Docker | `bentopdf` | +| `--output-dir ` | Direktori bundel keluaran | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Aktifkan Simple Mode | mati | +| `--base-url ` | Base URL subdirektori (mis. `/pdf/`) | `/` | +| `--language ` | Bahasa UI default (mis. `fr`, `de`) | _(tidak ada)_ | +| `--brand-name ` | Nama merek kustom | _(tidak ada)_ | +| `--brand-logo ` | Path logo relatif terhadap `public/` | _(tidak ada)_ | +| `--footer-text ` | Teks footer kustom | _(tidak ada)_ | +| `--ocr-languages ` | Bahasa OCR yang disertakan, dipisahkan koma | `eng` | +| `--list-ocr-languages` | Cetak kode dan nama OCR yang didukung, lalu keluar | mati | +| `--search-ocr-language ` | Cari kode OCR berdasarkan nama atau singkatan | mati | +| `--dockerfile ` | Dockerfile yang digunakan | `Dockerfile` | +| `--skip-docker` | Lewati build dan ekspor Docker | mati | +| `--skip-wasm` | Lewati unduhan WASM (pakai ulang file `.tgz`) | mati | + +Prompt interaktif juga menerima `list` untuk mencetak daftar lengkap kode Tesseract yang didukung dan `search ` untuk mencari kecocokan seperti `search german` atau `search chi`. + +::: warning Persyaratan Same-Origin +File WASM harus dilayani dari **origin yang sama** dengan aplikasi BentoPDF. Web Worker menggunakan `importScripts()` yang tidak dapat memuat skrip lintas origin. Misalnya, jika BentoPDF berjalan di `https://internal.example.com`, base URL WASM juga harus `https://internal.example.com/wasm`. +::: + +#### Langkah Manual + +
+Jika Anda lebih suka melakukannya secara manual tanpa skrip + +**Langkah 1: Unduh paket WASM dan OCR** (di mesin yang terhubung internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Langkah 2: Build image Docker dengan URL internal** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Langkah 3: Ekspor image Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Langkah 4: Pindahkan ke jaringan air-gapped** + +Salin melalui USB, repositori artefak internal, atau metode transfer yang disetujui: + +- `bentopdf.tar`: image Docker +- Kelima paket WASM/OCR `.tgz` dari Langkah 1 +- Direktori `tesseract-langdata/` dari Langkah 1 +- Direktori `ocr-fonts/` dari Langkah 1 + +**Langkah 5: Siapkan di dalam jaringan air-gapped** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Pastikan file dapat diakses pada URL yang Anda konfigurasikan di Langkah 2, termasuk `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data`, dan `.../ocr/fonts`. + +
+ +::: info Build dari source, bukan Docker? +Atur variabel di `.env.production` sebelum menjalankan `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Menjalankan Proxy WASM Sendiri + +Jika Anda perlu melayani file WASM AGPL dengan header CORS yang tepat, Anda dapat men-deploy proxy sederhana. Lihat [panduan Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) untuk contoh implementasi. + +::: tip Mengapa Dipisah? +Pemisahan ini memastikan: + +- Kepatuhan hukum yang jelas bagi pengguna komersial +- Inti BentoPDF tetap berada di bawah lisensi ganda (AGPL-3.0 / Commercial) +- File WASM dimuat saat runtime, tidak disertakan dalam source + ::: + +## Persyaratan Sistem + +| Persyaratan | Minimum | +| ----------- | ------------------------------- | +| Penyimpanan | ~100 MB (inti tanpa modul AGPL) | +| RAM | 512 MB | +| CPU | Prosesor modern apa pun | + +::: tip +BentoPDF adalah situs statis, tidak diperlukan database atau server backend! +::: diff --git a/docs/id/self-hosting/kubernetes.md b/docs/id/self-hosting/kubernetes.md new file mode 100644 index 00000000..8adbcf03 --- /dev/null +++ b/docs/id/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Deploy dengan Kubernetes + +Kubernetes mungkin berlebihan untuk situs statis, tetapi bisa sangat cocok jika Anda sudah menstandarkan Helm + GitOps. + +> [!IMPORTANT] +> **Header yang Diperlukan untuk Konversi File Office** +> +> Alat berbasis LibreOffice (konversi Word, Excel, PowerPoint) memerlukan header HTTP berikut untuk dukungan `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Image nginx resmi BentoPDF sudah menyertakan header ini. Di Kubernetes, **controller Ingress/Gateway juga merupakan reverse proxy**, jadi pastikan header ini tetap dipertahankan (atau tambahkan di edge). + +## Prasyarat + +- Klaster Kubernetes +- Helm v3 +- Image nginx BentoPDF (misalnya `ghcr.io/alam00000/bentopdf:`) yang melayani di **port 8080** + +## Deploy dengan Helm + +### Instal dari repo ini (chart lokal) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Instal dari GHCR (chart OCI) + +Jika chart dipublikasikan ke GHCR sebagai artefak OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Mengeksposnya + +### Port-forward (uji cepat) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (opsional) + +Aktifkan Ingress (contoh untuk nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (opsional) + +Chart ini mendukung Gateway API `Gateway` + `HTTPRoute`. + +Contoh (operator Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Memastikan header SharedArrayBuffer tetap berfungsi (Ingress/Gateway) + +### Apa yang "seharusnya" terjadi + +Konfigurasi nginx BentoPDF menetapkan header respons yang diperlukan. Sebagian besar controller Ingress/Gateway **meneruskan header respons upstream tanpa perubahan**. + +### Apa yang bisa merusaknya + +- Kebijakan controller/edge yang **menimpa** atau **menghapus** header respons +- Middleware "security headers" yang menetapkan nilai COOP/COEP yang berbeda + +### Cara memverifikasi + +Jalankan perintah ini pada endpoint publik Anda: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Anda seharusnya melihat: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Jika controller Ingress Anda tidak mempertahankannya + +Tambahkan header di edge (bergantung pada controller). Contoh untuk **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Error MIME-type `.mjs` (iframe Tanda Tangani PDF / Form Filler kosong) + +Jika konsol browser menampilkan `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` pada permintaan `.mjs`, berarti controller Ingress/Gateway di depan nginx BentoPDF mengganti header `Content-Type` upstream dengan `application/octet-stream`. + +Nginx pada image BentoPDF sudah melayani `.mjs` sebagai `application/javascript`. Solusinya adalah menghentikan controller dari menghapus/menggantinya. Untuk nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Atau gunakan filter `ResponseHeaderModifier` di Gateway API untuk menetapkan `Content-Type: application/javascript` pada path `.mjs`. Verifikasi dengan DevTools → tab Network: permintaan `.mjs` yang gagal seharusnya kini menampilkan `content-type: application/javascript`. + +### Jika Anda memakai Gateway API dan ingin menambahkan header secara paksa + +Gateway API mendukung filter `ResponseHeaderModifier`. Anda dapat memasangnya di `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Dukungan untuk filter tertentu bergantung pada controller Gateway Anda; jika sebuah filter diabaikan, tambahkan header di lapisan edge/controller. + +## Menonaktifkan Alat Tertentu + +Gunakan ConfigMap untuk menonaktifkan alat saat runtime tanpa membangun ulang image: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Mount ke direktori yang dilayani: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +ID alat adalah URL halaman tanpa `.html`: buka alat apa pun dan lihat URL-nya (misalnya `edit-pdf`, `merge-pdf`, `compress-pdf`). Alat yang dinonaktifkan disembunyikan dari beranda, pencarian, pintasan, pembuat alur kerja, dan akses URL langsung. Lihat [panduan Docker](/id/self-hosting/docker#menonaktifkan-alat-tertentu) untuk daftar lengkap opsi. diff --git a/docs/id/self-hosting/netlify.md b/docs/id/self-hosting/netlify.md new file mode 100644 index 00000000..018fe276 --- /dev/null +++ b/docs/id/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Deploy ke Netlify + +[Netlify](https://netlify.com) menyediakan hosting situs statis yang sangat baik dengan paket gratis yang lapang. + +## Deploy Sekali Klik + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Deploy Manual + +### Langkah 1: Hubungkan Repositori + +1. Masuk ke [Netlify](https://app.netlify.com) +2. Klik "Add new site" → "Import an existing project" +3. Hubungkan akun GitHub Anda +4. Pilih fork BentoPDF Anda + +### Langkah 2: Atur Pengaturan Build + +| Pengaturan | Nilai | +| ----------------- | --------------- | +| Perintah build | `npm run build` | +| Direktori publish | `dist` | +| Versi Node | 18+ | + +### Langkah 3: Deploy + +Klik "Deploy site" dan tunggu build selesai. + +## File Konfigurasi + +Buat `netlify.toml` di root proyek Anda: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Penting +Header `Cross-Origin-Embedder-Policy` dan `Cross-Origin-Opener-Policy` diperlukan untuk konversi Word/ODT/Excel/PowerPoint ke PDF. Tanpa keduanya, `SharedArrayBuffer` tidak tersedia dan mesin LibreOffice WASM gagal diinisialisasi. + +Header `Content-Encoding: gzip` pada file `.wasm.gz` dan `.data.gz` memberi tahu browser untuk mendekompresinya secara otomatis. Tanpa header ini, browser menerima byte gzip mentah dan kompilasi WASM gagal. +::: + +## Variabel Lingkungan + +Atur variabel ini di Site settings → Environment variables: + +| Variabel | Deskripsi | +| ----------------------- | ---------------------------------------------------------------- | +| `SIMPLE_MODE` | Atur ke `true` untuk build minimal | +| `VITE_BRAND_NAME` | Nama merek kustom (menggantikan "BentoPDF") | +| `VITE_BRAND_LOGO` | Path logo relatif terhadap `public/` (mis. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Teks footer/hak cipta kustom | +| `VITE_DEFAULT_LANGUAGE` | Bahasa UI default (mis. `fr`, `de`, `es`) | + +## Domain Kustom + +1. Buka Site settings → Domain management +2. Klik "Add custom domain" +3. Ikuti petunjuk konfigurasi DNS + +## Large Media + +Untuk file WASM berukuran besar, pertimbangkan mengaktifkan [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Pemecahan Masalah + +### Word/ODT/Excel ke PDF Macet di 55% + +Jika konversi dokumen macet di 55%, buka Konsol DevTools dan periksa: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Jika `crossOriginIsolated` bernilai `false`, header COEP/COOP dari `netlify.toml` Anda tidak diterapkan. Pastikan file berada di root proyek Anda lalu deploy ulang. + +Jika Anda melihat `expected magic word 00 61 73 6d, found 1f 8b 08 08` di konsol, berarti file `.wasm.gz` tidak memiliki header `Content-Encoding: gzip`. Pastikan blok `[[headers]]` untuk `soffice.wasm.gz` dan `soffice.data.gz` ada di `netlify.toml` Anda. + +### Build Gagal + +Periksa kompatibilitas versi Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Pemuatan Awal Lambat + +Aktifkan optimasi aset di Site settings → Build & deploy → Asset optimization. diff --git a/docs/id/self-hosting/nginx.md b/docs/id/self-hosting/nginx.md new file mode 100644 index 00000000..616135bb --- /dev/null +++ b/docs/id/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Deploy dengan Nginx + +Host BentoPDF di server Anda sendiri menggunakan Nginx. + +## Prasyarat + +- Server Ubuntu/Debian +- Nginx terinstal +- Sertifikat SSL (disarankan: Let's Encrypt) + +## Langkah 1: Build Proyek + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Untuk menyesuaikan branding, atur variabel lingkungan sebelum build: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Langkah 2: Salin File + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Langkah 3: Konfigurasi Nginx + +Buat `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Langkah 4: Aktifkan Situs + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Langkah 5: SSL dengan Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Deploy di Subdirektori + +Untuk hosting di `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Build dengan: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Penyetelan Performa + +Tambahkan ke `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Pemecahan Masalah + +### WASM Tidak Dimuat + +Pastikan MIME type sudah diatur: + +```nginx +types { + application/wasm wasm; +} +``` + +### Tanda Tangani PDF atau Form Filler Menampilkan Penampil Kosong (error MIME `.mjs`) + +Jika konsol browser menampilkan: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...dan permintaan yang gagal berakhir dengan `.mjs`, berarti nginx Anda tidak memiliki pemetaan `.mjs → application/javascript`. Penampil PDF bawaan (dipakai oleh Tanda Tangani PDF, Form Filler, dan beberapa alat lain) menyertakan file modul ES berekstensi `.mjs`, dan `mime.types` bawaan nginx tidak memuatnya secara default. + +Perbaiki dengan menambahkan `mjs` ke baris `application/javascript` yang sudah ada di `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> JANGAN menambahkan baris `application/javascript` _kedua_: nginx mem-parse `mime.types` baris demi baris dan hanya satu pemetaan tipe ke ekstensi yang berlaku, sehingga baris kedua diabaikan begitu saja pada beberapa versi. Edit baris yang sudah ada untuk menambahkan `mjs` di samping `js`. + +Atau timpa secara lokal di dalam blok server Anda (tanpa mengedit file global): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Muat ulang nginx setelah perubahan: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Untuk memastikan: di DevTools browser → tab Network, cari permintaan `.mjs` yang gagal dan periksa header respons `Content-Type`. Seharusnya kini `application/javascript`, bukan `application/octet-stream`. + +### Word/ODT/Excel ke PDF Tidak Berfungsi + +LibreOffice WASM memerlukan `SharedArrayBuffer`, yang membutuhkan header `Cross-Origin-Embedder-Policy` dan `Cross-Origin-Opener-Policy`. Ini juga membutuhkan secure context, sehingga `http://localhost` berfungsi untuk pengujian lokal, tetapi `http://192.168.x.x` atau IP LAN lain biasanya memerlukan HTTPS. Perhatikan bahwa direktif `add_header` nginx dalam blok `location` **menimpa** direktif `add_header` tingkat server, bukan menggabungkannya. Setiap blok `location` yang memiliki `add_header` sendiri harus menyertakan header COEP/COOP. + +Verifikasi dengan: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Jika memakai reverse proxy di depan nginx, pastikan header ini tetap dipertahankan. + +### 502 Bad Gateway + +Periksa log error Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/id/self-hosting/vercel.md b/docs/id/self-hosting/vercel.md new file mode 100644 index 00000000..edb62f53 --- /dev/null +++ b/docs/id/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Deploy ke Vercel + +[Vercel](https://vercel.com) menawarkan pengalaman deploy paling mudah untuk situs statis. + +## Deploy Sekali Klik + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Deploy Manual + +### Langkah 1: Fork Repositori + +Fork [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) ke akun GitHub Anda. + +### Langkah 2: Impor ke Vercel + +1. Buka [vercel.com/new](https://vercel.com/new) +2. Pilih repositori hasil fork Anda +3. Konfigurasikan proyek: + +| Pengaturan | Nilai | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Langkah 3: Variabel Lingkungan (Opsional) + +Tambahkan jika diperlukan: + +| Variabel | Deskripsi | +| ----------------------- | ---------------------------------------------------------------- | +| `SIMPLE_MODE` | Atur ke `true` untuk UI minimal | +| `VITE_BRAND_NAME` | Nama merek kustom (menggantikan "BentoPDF") | +| `VITE_BRAND_LOGO` | Path logo relatif terhadap `public/` (mis. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Teks footer/hak cipta kustom | +| `VITE_DEFAULT_LANGUAGE` | Bahasa UI default (mis. `fr`, `de`, `es`) | + +### Langkah 4: Deploy + +Klik "Deploy" dan tunggu build selesai. + +## Domain Kustom + +1. Buka pengaturan proyek Anda +2. Buka "Domains" +3. Tambahkan domain kustom Anda +4. Konfigurasikan DNS sesuai petunjuk + +## Batasan + +::: warning File Besar +Fungsi serverless Vercel memiliki batas 50MB. Karena BentoPDF adalah situs statis, ini seharusnya tidak memengaruhi Anda, tetapi modul WASM berukuran besar (total ~100MB). Pastikan modul tersebut dilayani dari folder `/public`. +::: + +## Pemecahan Masalah + +### Batas Waktu Build + +Jika build mengalami timeout, coba: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 Saat Refresh + +Tambahkan `vercel.json` untuk routing SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel ke PDF Tidak Berfungsi + +Konversi LibreOffice WASM memerlukan `SharedArrayBuffer`, yang membutuhkan header respons berikut pada semua halaman: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +File `.wasm.gz` dan `.data.gz` yang sudah dikompresi juga memerlukan `Content-Encoding: gzip` agar browser mendekompresinya. + +Tambahkan ini ke `vercel.json` Anda: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Untuk memverifikasi, buka Konsol DevTools dan jalankan `console.log(window.crossOriginIsolated)`, hasilnya seharusnya `true`. diff --git a/docs/id/tools/add-attachments.md b/docs/id/tools/add-attachments.md new file mode 100644 index 00000000..7c4283b1 --- /dev/null +++ b/docs/id/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Tambah Lampiran +description: Sematkan file dalam format apa pun ke dalam PDF pada tingkat dokumen atau pada halaman tertentu. +--- + +# Tambah Lampiran + +Sematkan satu atau beberapa file langsung ke dalam dokumen PDF. Lampiran dapat ditambahkan pada tingkat dokumen (terlihat di panel lampiran pembaca PDF mana pun) atau diikat ke halaman tertentu. + +## Cara Kerja + +1. Unggah PDF yang ingin Anda beri lampiran. +2. Gunakan area penyimpanan lampiran untuk memilih file yang ingin disematkan (format apa pun). +3. Pilih tingkat lampiran: **Dokumen** (default) atau **Halaman**. +4. Jika memilih tingkat Halaman, masukkan rentang halaman (misalnya `1-3` atau `5`). +5. Klik tombol proses. PDF yang telah diubah akan diunduh beserta file yang tersemat. + +## Fitur + +- Lampirkan file dalam format apa pun: gambar, spreadsheet, arsip, file eksekusi, apa saja +- Penempatan lampiran pada tingkat dokumen atau tingkat halaman +- Beberapa file dapat dilampirkan dalam satu operasi +- Menampilkan nama dan ukuran semua lampiran yang dipilih +- Hasil tetap mempertahankan isi PDF asli dengan file tersemat ditambahkan + +## Opsi + +| Opsi | Deskripsi | +| ------------------- | ------------------------------------------------------------------------------ | +| **Tingkat dokumen** | Melampirkan file ke PDF secara keseluruhan, dapat diakses dari panel lampiran | +| **Tingkat halaman** | Melampirkan file ke halaman tertentu, ditentukan melalui input rentang halaman | + +## Kasus Penggunaan + +- Menggabungkan data sumber (file Excel, CSV) dengan laporan PDF +- Melampirkan file gambar asli ke PDF portofolio fotografi +- Menyematkan dokumen pendukung di dalam kontrak atau proposal +- Menambahkan materi tambahan ke halaman tertentu pada buku panduan pelatihan + +## Tips + +- Lampiran tingkat dokumen paling didukung di berbagai pembaca PDF. Lampiran tingkat halaman mungkin tidak terlihat di semua penampil. +- Tidak ada batas ukuran file untuk lampiran, tetapi file tersemat yang sangat besar akan menambah ukuran PDF secara proporsional. + +## Alat Terkait + +- [Ekstrak Lampiran](./extract-attachments) +- [Edit Lampiran](./edit-attachments) +- [Gabung PDF](./merge-pdf) diff --git a/docs/id/tools/add-blank-page.md b/docs/id/tools/add-blank-page.md new file mode 100644 index 00000000..dfe0326d --- /dev/null +++ b/docs/id/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Tambah Halaman Kosong +description: Sisipkan satu atau beberapa halaman kosong di posisi mana pun dalam dokumen PDF. +--- + +# Tambah Halaman Kosong + +Sisipkan halaman kosong ke dalam PDF pada posisi yang Anda tentukan. Anda mengatur di mana halaman kosong ditempatkan dan berapa banyak yang ditambahkan. + +## Cara Kerja + +1. Unggah file PDF. Alat ini menampilkan jumlah halaman. +2. Masukkan **posisi** tempat halaman kosong akan disisipkan. Gunakan `0` untuk menyisipkan di bagian paling awal, atau jumlah total halaman untuk menambahkan di akhir. +3. Masukkan **jumlah** halaman kosong yang akan ditambahkan (default 1). +4. Klik tombol proses. PDF yang telah diubah akan diunduh dengan halaman kosong yang sudah disisipkan. + +## Fitur + +- Sisipkan di posisi mana pun: awal, tengah, atau akhir dokumen +- Tambahkan beberapa halaman kosong dalam satu operasi +- Petunjuk posisi diperbarui secara dinamis sesuai jumlah halaman PDF yang diunggah +- Halaman kosong berukuran A4 standar + +## Kasus Penggunaan + +- Menambahkan halaman pemisah kosong di antara bagian-bagian dokumen gabungan +- Menyisipkan halaman kosong agar sejajar untuk pencetakan bolak-balik +- Menambahkan ruang untuk catatan tulisan tangan di panduan belajar yang dicetak +- Menambah halaman agar dokumen memenuhi syarat jumlah halaman minimum + +## Tips + +- Posisi `0` menyisipkan sebelum halaman pertama. Posisi yang sama dengan jumlah total halaman menambahkan setelah halaman terakhir. +- Jika Anda perlu menyisipkan konten (bukan hanya halaman kosong) di posisi tertentu, gunakan [Alat Multi PDF](./pdf-multi-tool) untuk menyisipkan PDF lain setelah halaman tertentu. + +## Alat Terkait + +- [Atur & Duplikat](./organize-pdf) +- [Alat Multi PDF](./pdf-multi-tool) +- [Gabung PDF](./merge-pdf) diff --git a/docs/id/tools/add-page-labels.md b/docs/id/tools/add-page-labels.md new file mode 100644 index 00000000..f4025f6a --- /dev/null +++ b/docs/id/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Tambahkan label halaman +description: Tambahkan label halaman PDF dengan angka Romawi, awalan huruf, penomoran kustom, dan beberapa aturan per dokumen. +--- + +# Tambahkan label halaman + +Label halaman mengatur bagaimana nomor halaman ditampilkan di penampil PDF (nomor yang tampil di toolbar, bukan yang dicetak pada halaman). Alat ini memungkinkan Anda menetapkan skema pelabelan berbeda untuk rentang halaman yang berbeda: angka Romawi untuk bagian awal, angka desimal untuk isi, lampiran berhuruf, dan lainnya. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Panel opsi muncul dengan satu aturan label secara default. +3. Atur setiap aturan dengan rentang halaman, gaya, awalan opsional, dan nilai awal. +4. Klik **Tambah Aturan** untuk membuat aturan tambahan bagi bagian yang berbeda. +5. Klik **Tambahkan Label Halaman** untuk menerapkan semua aturan dan mengunduh hasilnya. + +## Opsi + +Setiap aturan label memiliki pengaturan berikut: + +- **Rentang Halaman** -- Halaman mana yang dikenai aturan. Biarkan kosong untuk semua halaman. Mendukung rentang seperti `1-4`, `7`, `odd`, atau `1-9,30-40`. +- **Gaya Label** -- Angka Arab desimal, Romawi huruf kecil (i, ii, iii), Romawi huruf besar (I, II, III), Huruf kecil (a, b, c), Huruf besar (A, B, C), atau Tanpa Label (hanya awalan). +- **Awalan Label** -- Teks opsional yang ditambahkan di depan setiap label, misalnya "A-" untuk membuat label seperti A-1, A-2, A-3. +- **Nilai Awal** -- Angka tempat mulai menghitung. Default 1. Atur ke 0 untuk penomoran berbasis nol. +- **Lanjutkan penomoran di rentang yang terpisah** -- Aktifkan ini saat aturan menargetkan halaman yang tidak berurutan (seperti `1-9,30-40` atau `odd`) dan Anda ingin penomoran tetap berlanjut secara berurutan. +- **Hapus label halaman yang ada** -- Dicentang secara default. Menghapus label sebelumnya sebelum menerapkan aturan baru Anda. + +## Fitur + +- Beberapa aturan label per dokumen untuk skema penomoran yang kompleks +- Enam gaya label yang mencakup semua sistem penomoran standar +- Dukungan awalan kustom untuk pelabelan per bagian +- Dukungan rentang terpisah dengan penomoran bertahap +- Opsi untuk mempertahankan atau menghapus label yang ada + +## Kasus Penggunaan + +- Mengatur label angka Romawi (i, ii, iii) untuk kata pengantar buku dan label desimal untuk isi utama +- Memberi label halaman lampiran dengan awalan huruf seperti "A-1", "A-2", "B-1", "B-2" +- Memperbaiki label halaman pada dokumen hasil pindai yang nomor halaman fisiknya tidak sesuai dengan urutan halaman PDF +- Menambahkan penomoran berbasis nol untuk dokumen teknis + +## Tips + +- Label halaman adalah metadata yang ditampilkan penampil PDF di toolbar navigasinya. Label tidak dicetak pada halaman. Untuk nomor yang terlihat, gunakan [Nomor Halaman](./page-numbers). +- Alat ini memerlukan CoherentPDF (CPDF) yang dikonfigurasi di Pengaturan WASM Anda. Jika belum diatur, Anda akan diminta untuk mengonfigurasinya. + +## Alat Terkait + +- [Nomor Halaman](./page-numbers) +- [Penomoran Bates](./bates-numbering) +- [Edit Bookmark](./bookmark) diff --git a/docs/id/tools/add-stamps.md b/docs/id/tools/add-stamps.md new file mode 100644 index 00000000..b3b14a83 --- /dev/null +++ b/docs/id/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Tambah Stempel +description: Tambahkan stempel gambar ke halaman PDF Anda menggunakan toolbar anotasi terpadu dengan atribusi nama pengguna. +--- + +# Tambah Stempel + +Tempatkan stempel gambar pada halaman PDF Anda menggunakan penampil tertanam dengan toolbar anotasi stempel. Stempel dapat menyertakan nama Anda sebagai atribusi, sehingga berguna untuk alur persetujuan, proses peninjauan, dan penandaan dokumen. + +## Cara Kerja + +1. Masukkan nama Anda di kolom **Nama Pengguna Stempel**. Nama ini akan muncul pada stempel yang Anda buat. +2. Unggah file PDF Anda dengan mengklik atau menyeretnya ke area unggah. +3. Editor stempel terbuka dengan dokumen Anda dimuat di penampil. +4. Gunakan alat stempel gambar di toolbar untuk memilih dan menempatkan stempel di halaman mana pun. +5. Atur posisi dan ubah ukuran stempel sesuai kebutuhan. +6. Klik **Simpan PDF Berstempel** untuk mengunduh hasilnya. + +## Fitur + +- Penampil PDF terpadu dengan toolbar anotasi khusus stempel +- Atribusi nama pengguna pada stempel yang dibuat +- Penempatan stempel gambar di halaman mana pun +- Pengaturan posisi dan ukuran dengan seret dan lepas +- Ukuran penampil otomatis berdasarkan rasio aspek halaman +- Tampilan file dengan informasi nama dan ukuran + +## Kasus Penggunaan + +- Menambahkan stempel gambar "APPROVED" atau "REVIEWED" pada dokumen dalam alur peninjauan +- Menempatkan gambar stempel perusahaan atau notaris pada dokumen resmi +- Menandai halaman dengan stempel "RECEIVED" yang menyertakan nama peninjau +- Menambahkan stempel kendali mutu pada laporan inspeksi + +## Tips + +- Atur nama pengguna stempel sebelum mengunggah PDF. Nama pengguna disematkan dalam metadata stempel. +- Penampil menyesuaikan tingginya berdasarkan rasio aspek halaman pertama PDF agar tampilan optimal. +- Untuk watermark berbasis teks alih-alih stempel gambar, gunakan alat [Tambah Watermark](./add-watermark). + +## Alat Terkait + +- [Tanda Tangani PDF](./sign-pdf) +- [Tambah Watermark](./add-watermark) +- [Editor PDF](./edit-pdf) diff --git a/docs/id/tools/add-watermark.md b/docs/id/tools/add-watermark.md new file mode 100644 index 00000000..6903f1f0 --- /dev/null +++ b/docs/id/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Tambah Watermark +description: Bubuhkan watermark teks atau gambar pada halaman PDF dengan editor visual seret dan lepas serta pratinjau langsung. +--- + +# Tambah Watermark + +Tambahkan watermark teks atau gambar ke halaman PDF Anda menggunakan editor visual. Anda dapat memosisikan watermark dengan menyeretnya langsung di pratinjau, mengubah ukurannya dengan pegangan sudut, dan mengatur opasitas, rotasi, font, dan warna. Setiap halaman dapat memiliki posisi watermark sendiri, atau Anda dapat menerapkan watermark yang sama ke semua halaman sekaligus. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Editor terbuka dengan pratinjau langsung halaman pertama dan overlay watermark yang dapat diseret. +3. Pilih mode watermark **Teks** atau **Gambar** menggunakan tombol pengalih. +4. Atur pengaturan watermark di panel samping. +5. Seret watermark di pratinjau untuk memosisikannya tepat di tempat yang Anda inginkan. Gunakan pegangan sudut untuk mengubah ukuran. +6. Berpindah antarhalaman untuk mengatur watermark per halaman, atau biarkan **Terapkan ke semua halaman** tetap dicentang. +7. Klik **Tambah Watermark** untuk memproses dan mengunduh. + +## Opsi + +**Pengaturan watermark teks:** + +- **Teks** -- Teks watermark (misalnya "RAHASIA", "DRAF"). +- **Ukuran Font** -- Dari 10 hingga 200 poin. Default 72. +- **Warna** -- Warna apa pun melalui pemilih warna. +- **Opasitas** -- Atur transparansi dari sepenuhnya transparan hingga sepenuhnya buram. +- **Rotasi** -- Putar teks watermark dari -180 hingga 180 derajat. + +**Pengaturan watermark gambar:** + +- **Unggah Gambar** -- Unggah file PNG, JPG, atau gambar lain untuk digunakan sebagai watermark. +- **Opasitas** -- Atur transparansi gambar. +- **Skala** -- Ubah ukuran watermark gambar. + +**Pengaturan tata letak:** + +- **Tunggal** -- Satu watermark per halaman, diposisikan dengan menyeret atau dengan preset posisi. +- **Ubin** -- Mengulang watermark di seluruh halaman dalam kisi diagonal yang mengikuti sudut rotasi, sehingga tanda menutupi dokumen dari tepi ke tepi. +- **Jarak horizontal** -- Jarak antarubin sepanjang arah teks, sebagai persentase lebar watermark (hanya mode ubin). +- **Jarak vertikal** -- Jarak antarbaris ubin, sebagai persentase tinggi watermark (hanya mode ubin). + +**Pengaturan umum:** + +- **Terapkan ke semua halaman** -- Jika dicentang, watermark yang sama berlaku untuk setiap halaman. Hapus centang untuk mengatur watermark individual per halaman. +- **Rentang Halaman** -- Tentukan halaman mana yang diberi watermark (misalnya "1-3, 5, 7-9" atau "all"). + +## Fitur + +- Pemosisian seret dan lepas visual pada pratinjau PDF langsung +- Watermark yang dapat diubah ukurannya dengan pegangan sudut +- Mode watermark teks dan gambar +- Tata letak tunggal atau ubin (berulang) seluruh halaman dengan jarak yang dapat diatur +- Penerapan watermark per halaman atau global +- Navigasi halaman demi halaman di pratinjau +- Kontrol opasitas dan rotasi +- Penyaringan rentang halaman + +## Kasus Penggunaan + +- Menandai dokumen draf dengan "DRAFT" sebelum diedarkan untuk ditinjau +- Menambahkan watermark "RAHASIA" pada laporan keuangan yang sensitif +- Memberi merek pada dokumen dengan watermark gambar logo perusahaan +- Membubuhkan "SAMPLE" pada dokumentasi produk yang dibagikan kepada calon pelanggan +- Menambahkan pemberitahuan hak cipta pada materi PDF yang didistribusikan + +## Tips + +- Untuk watermark diagonal di seluruh halaman, atur rotasi sekitar 45 derajat dan perbesar ukuran font. +- Mode ubin membuat dokumen jauh lebih sulit dipakai ulang setelah dipotong, karena menghapus satu tanda masih menyisakan puluhan lainnya. Turunkan opasitas saat memakai ubin agar teks di bawahnya tetap terbaca. +- Watermark gambar dengan latar belakang transparan (format PNG) menyatu lebih alami dengan isi dokumen. +- Jika Anda memerlukan teks watermark yang berbeda di halaman berbeda, hapus centang "Terapkan ke semua halaman" dan berpindah halaman satu per satu. + +## Alat Terkait + +- [Kepala & Kaki Halaman](./header-footer) +- [Tambah Stempel](./add-stamps) +- [Penomoran Bates](./bates-numbering) +- [Tanda Tangani PDF](./sign-pdf) diff --git a/docs/id/tools/adjust-colors.md b/docs/id/tools/adjust-colors.md new file mode 100644 index 00000000..9153f7b2 --- /dev/null +++ b/docs/id/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Sesuaikan Warna +description: Atur kecerahan, kontras, saturasi, rona, suhu, tint, gamma, dan sepia pada PDF Anda. +--- + +# Sesuaikan Warna + +Perangkat color grading lengkap untuk PDF. Atur delapan parameter independen (kecerahan, kontras, saturasi, pergeseran rona, suhu, tint, gamma, dan sepia) dengan pratinjau langsung yang diperbarui saat Anda menggeser setiap slider. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Editor terbuka menampilkan pratinjau halaman pertama dan panel pengaturan warna. +3. Geser slider untuk menyesuaikan setiap parameter warna. Pratinjau diperbarui secara real time. +4. Klik **Atur Ulang** untuk mengembalikan semua slider ke posisi default. +5. Klik **Terapkan** untuk memproses semua halaman dan mengunduh PDF yang telah disesuaikan. + +## Opsi + +- **Kecerahan** -- Terangkan atau gelapkan seluruh halaman (-100 hingga +100). +- **Kontras** -- Tingkatkan atau kurangi perbedaan antara area terang dan gelap (-100 hingga +100). +- **Saturasi** -- Tingkatkan atau kurangi intensitas warna (-100 hingga +100). Mengaturnya ke -100 menghasilkan skala abu-abu. +- **Pergeseran Rona** -- Putar roda warna untuk menggeser semua warna secara seragam. +- **Suhu** -- Geser warna menjadi lebih hangat (kuning/oranye) atau lebih dingin (biru). +- **Pewarnaan** -- Tambahkan nuansa hijau atau magenta. +- **Gamma** -- Atur kecerahan nada tengah menggunakan kurva gamma. Nilai di bawah 1,0 menggelapkan nada tengah; nilai di atas 1,0 menerangkannya. +- **Sepia** -- Terapkan efek nada sepia klasik. Nilai lebih tinggi menghasilkan rona cokelat yang lebih kuat. + +## Fitur + +- Delapan parameter warna yang dapat diatur secara independen +- Pratinjau langsung yang langsung merespons perubahan slider +- Tombol reset untuk kembali ke default dengan cepat +- Memproses semua halaman dalam dokumen +- Bekerja dengan konten PDF apa pun (teks, gambar, grafis) + +## Kasus Penggunaan + +- Mencerahkan hasil pindai yang gelap atau memperbaiki halaman yang terlalu terang +- Mengurangi saturasi dokumen berwarna untuk menghemat tinta sebelum dicetak +- Menerapkan nada sepia untuk tampilan antik pada sertifikat atau penghargaan +- Memperbaiki suhu warna pada foto yang tersemat di PDF +- Meningkatkan kontras pada dokumen pindaian yang pudar atau berkualitas rendah + +## Tips + +- Untuk konversi skala abu-abu yang cepat, seret slider saturasi sampai -100. +- Slider gamma sangat berguna untuk meningkatkan keterbacaan dokumen pindaian yang nada tengahnya terlalu gelap atau terlalu terang. +- Seperti alat efek gambar lainnya, alat ini merasterisasi setiap halaman. Hasilnya berbasis gambar, sehingga teks tidak dapat dipilih. + +## Alat Terkait + +- [Balikkan Warna](./invert-colors) +- [Efek Pemindai](./scanner-effect) +- [Warna Latar Belakang](./background-color) diff --git a/docs/id/tools/alternate-merge.md b/docs/id/tools/alternate-merge.md new file mode 100644 index 00000000..913f920b --- /dev/null +++ b/docs/id/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Selang-seling & Campur Halaman +description: Gabungkan PDF dengan menyisipkan halaman dari setiap file secara bergantian, dengan bookmark tetap dipertahankan. +--- + +# Selang-seling & Campur Halaman + +Selingi halaman dari beberapa file PDF sehingga halaman muncul bergantian antardokumen. Gunakan alat ini ketika penggabungan biasa hanya menyambung file ujung ke ujung, padahal Anda membutuhkan halaman 1 File A, lalu halaman 1 File B, lalu halaman 2 File A, dan seterusnya. + +## Cara Kerja + +1. Unggah setidaknya dua file PDF menggunakan area unggah. +2. Alat ini menampilkan setiap file beserta jumlah halaman dan ukuran filenya. +3. Seret pegangan untuk mengatur ulang halaman file mana yang tampil lebih dulu dalam urutan penyelingan. +4. Klik **Campur Halaman** untuk menghasilkan keluaran yang diselingi. +5. Hasilnya diunduh sebagai `alternated-mixed.pdf`. + +## Fitur + +- Menyelingi halaman dari sejumlah PDF (minimal dua) +- Pengaturan ulang urutan file dengan seret dan lepas untuk mengatur prioritas penyelingan +- Mempertahankan bookmark dari dokumen sumber +- Menampilkan jumlah halaman dan ukuran file untuk setiap file yang diunggah +- Diproses melalui web worker khusus agar UI tetap responsif + +## Kasus Penggunaan + +- Menyusun ulang hasil pindai bolak-balik ketika halaman ganjil dan genap dipindai secara terpisah +- Menggabungkan lembar soal dengan kunci jawaban sehingga setiap soal diikuti jawabannya +- Menggabungkan dokumen dua bahasa halaman demi halaman (misalnya bahasa Inggris di satu sisi, terjemahan di sisi berikutnya) +- Menyelingi pindaian depan dan belakang dari pemindai satu sisi + +## Tips + +- Jika PDF sumber Anda memiliki jumlah halaman berbeda, halaman dokumen yang lebih pendek akan habis lebih dulu dan sisa halaman dari dokumen yang lebih panjang akan muncul di bagian akhir. +- Urutan file penting: file pertama dalam daftar menyumbang halaman pertama pada hasil. Seret untuk mengatur ulang jika perlu. + +## Alat Terkait + +- [Gabung PDF](./merge-pdf) +- [Atur & Duplikat](./organize-pdf) +- [Pisah PDF](./split-pdf) diff --git a/docs/id/tools/background-color.md b/docs/id/tools/background-color.md new file mode 100644 index 00000000..ca621b20 --- /dev/null +++ b/docs/id/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Warna Latar Belakang +description: Ubah warna latar belakang setiap halaman PDF Anda sambil mempertahankan semua konten di atasnya. +--- + +# Warna Latar Belakang + +Atur warna latar belakang polos di belakang semua konten yang ada di PDF Anda. Alat ini membuat persegi panjang berwarna pada setiap halaman dan menempatkan konten asli di atasnya, sehingga teks, gambar, dan grafis tetap terlihat jelas pada latar belakang baru. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Pilih warna latar belakang menggunakan pemilih warna. Defaultnya kuning muda (#FFFFCC). +3. Klik **Ubah Warna Latar Belakang** untuk memproses. +4. PDF yang telah diperbarui diunduh secara otomatis. + +## Opsi + +- **Warna Latar Belakang** -- Pemilih warna standar untuk memilih warna polos apa pun. Defaultnya kuning muda. + +## Fitur + +- Menerapkan warna latar belakang seragam pada setiap halaman +- Mempertahankan semua konten asli (teks, gambar, grafis vektor) di atas lapisan berwarna +- Mempertahankan dimensi halaman asli +- Bekerja pada dokumen dengan jumlah halaman berapa pun + +## Kasus Penggunaan + +- Menambahkan latar krem atau gading muda agar dokumen tampak lebih lembut seperti kertas +- Memberi kode warna pada kumpulan dokumen dengan menerapkan warna latar berbeda untuk setiap kategori +- Membuat versi dokumen yang sama dengan tampilan berbeda untuk audiens yang berbeda +- Menambahkan rona latar yang terang untuk meningkatkan keterbacaan saat dokumen diproyeksikan ke layar + +## Tips + +- Warna terang dan lembut paling cocok. Latar belakang yang sangat gelap dapat membuat teks sulit dibaca kecuali teksnya sudah berwarna terang. +- Jika Anda ingin mengubah warna latar belakang sekaligus warna teks, terapkan warna latar belakang lebih dulu, lalu gunakan [Ubah Warna Teks](./text-color) pada hasilnya. +- Alat ini bekerja pada tingkat struktur PDF (bukan rasterisasi), sehingga teks tetap dapat dipilih dan dicari pada hasilnya. + +## Alat Terkait + +- [Ubah Warna Teks](./text-color) +- [Balikkan Warna](./invert-colors) +- [Sesuaikan Warna](./adjust-colors) diff --git a/docs/id/tools/bates-numbering.md b/docs/id/tools/bates-numbering.md new file mode 100644 index 00000000..2b87f861 --- /dev/null +++ b/docs/id/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Penomoran Bates +description: Terapkan nomor Bates ke satu atau beberapa PDF dengan templat, padding, font, dan posisi yang dapat disesuaikan. +--- + +# Penomoran Bates + +Penomoran Bates membubuhkan pengenal berurutan pada setiap halaman PDF Anda. Ini adalah metode standar untuk memberi label dokumen dalam proses hukum, audit, dan alur kerja kepatuhan. Alat ini mendukung banyak file, templat yang dapat disesuaikan, dan menghasilkan PDF bernomor terpisah atau satu arsip ZIP. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. Anda dapat menyeret banyak file sekaligus. +2. Pilih preset gaya atau buat templat kustom. +3. Atur posisi, font, ukuran, warna, dan nomor awal. +4. Klik **Terapkan Nomor Bates** untuk memproses. +5. Satu file diunduh langsung. Beberapa file diunduh sebagai arsip ZIP. + +## Opsi + +- **Preset Gaya** -- Pilih dari format bawaan: + - Exhibit + Case + Bates + Page (misalnya "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (tanpa nomor halaman) + - Case + Bates + - Hanya Nomor Bates (misalnya "000001") + - Kustom (tulis templat Anda sendiri) +- **Sesuaikan Gaya** -- String templat yang menggunakan placeholder: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Padding Bates** -- Jumlah digit (3 hingga 6) untuk nomor Bates yang diberi nol di depan. Hanya terlihat pada mode kustom. +- **Posisi** -- Header atau Footer, Kiri, Tengah, atau Kanan. +- **Bates Dimulai Dari** -- Nomor Bates pertama. Default 1. Penomoran berlanjut di seluruh file. +- **Penghitung File Dimulai Dari** -- Nomor awal untuk placeholder `[FILE]`. +- **Font** -- Helvetica, Times New Roman, atau Courier. +- **Ukuran Font** -- Ukuran teks yang dibubuhkan. +- **Warna** -- Pemilih warna untuk teks nomor Bates. + +## Fitur + +- Pratinjau langsung yang menunjukkan tampilan nomor Bates di semua file yang diunggah +- Dukungan banyak file dengan penomoran berkelanjutan di seluruh dokumen +- Pengaturan ulang urutan file dengan seret dan lepas untuk mengatur urutan penomoran +- Enam opsi posisi (header/footer, kiri/tengah/kanan) +- Perhitungan margin adaptif yang menyesuaikan ukuran halaman berbeda +- Keluaran ZIP untuk batch multi-file +- Placeholder templat untuk fleksibilitas maksimal + +## Kasus Penggunaan + +- Membubuhkan nomor exhibit berurutan pada dokumen discovery untuk litigasi +- Menomori paket bukti audit yang terdiri dari puluhan file +- Menerapkan nomor referensi regulasi pada dokumentasi kepatuhan +- Memberi label exhibit permohonan paten dengan pengenal khusus perkara + +## Tips + +- Seret file dalam daftar file untuk mengatur ulang urutannya sebelum diproses. Urutan penomoran Bates mengikuti urutan ini. +- Gunakan placeholder `[FILENAME]` untuk menyertakan nama file asli dalam stempel, yang membantu melacak halaman kembali ke dokumen sumber. +- Kotak pratinjau diperbarui secara real time saat Anda mengubah pengaturan, sehingga Anda dapat memeriksa format sebelum memproses. + +## Alat Terkait + +- [Nomor Halaman](./page-numbers) +- [Tambahkan Label Halaman](./add-page-labels) +- [Kepala & Kaki Halaman](./header-footer) diff --git a/docs/id/tools/bmp-to-pdf.md b/docs/id/tools/bmp-to-pdf.md new file mode 100644 index 00000000..b3959b64 --- /dev/null +++ b/docs/id/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP ke PDF +description: Ubah gambar bitmap BMP menjadi PDF langsung di browser Anda, tanpa unggahan ke server mana pun. +--- + +# BMP ke PDF + +Ubah file Windows Bitmap (BMP) menjadi PDF. BMP adalah format gambar tanpa kompresi yang masih ditemukan pada sistem lama, pencitraan medis, dan pemindai industri. Alat ini mengubahnya menjadi PDF tanpa perlu menginstal apa pun. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :------- | +| BMP | `.bmp` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file BMP Anda. +2. Tinjau daftar file. Tambahkan file lain atau hapus yang tidak diinginkan. +3. Klik **Konversi ke PDF**. Hasilnya diunduh sebagai `from_bmps.pdf`. + +Setiap BMP digambar pada canvas, diekspor sebagai PNG, lalu disematkan ke PDF menggunakan pdf-lib. Ukuran halaman sesuai dengan dimensi gambar asli. + +## Opsi + +Alat ini tidak menyediakan pengaturan kualitas tambahan. Gambar disematkan dalam resolusi aslinya sebagai PNG lossless di dalam PDF. + +## Kasus Penggunaan + +- Mengubah dokumen pindaian lama yang tersimpan sebagai BMP menjadi PDF arsip +- Mengubah tangkapan layar BMP dari aplikasi Windows lama menjadi dokumen yang mudah dibagikan +- Memproses keluaran pemindai medis atau industri yang secara default berformat BMP +- Memigrasikan arsip gambar lama ke format yang lebih portabel + +## Tips + +- File BMP tidak terkompresi, sehingga cenderung besar. PDF yang dihasilkan akan jauh lebih kecil karena gambar dienkode ulang sebagai PNG secara internal. +- Jika Anda memiliki file BMP bersama format gambar lain, gunakan alat [Gambar ke PDF](./image-to-pdf) untuk mengonversi semuanya dalam satu batch. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [PNG ke PDF](./png-to-pdf) +- [TIFF ke PDF](./tiff-to-pdf) diff --git a/docs/id/tools/bookmark.md b/docs/id/tools/bookmark.md new file mode 100644 index 00000000..b78f4e72 --- /dev/null +++ b/docs/id/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Edit Bookmark +description: Tambah, edit, impor, ekspor, dan hapus bookmark PDF dengan editor visual serta dukungan CSV/JSON. +--- + +# Edit Bookmark + +Editor bookmark memberi Anda kendali penuh atas bookmark navigasi PDF (disebut juga outline). Anda dapat menambah bookmark baru, mengedit yang sudah ada, menata ulang hierarki, serta mengimpor atau mengekspor data bookmark dalam format CSV dan JSON. + +## Cara Kerja + +1. Unggah PDF Anda dengan mengklik atau menyeret file ke area unggah. +2. Secara opsional, centang **Ekstrak otomatis bookmark yang ada** untuk memuat struktur bookmark yang sudah ada di dokumen. +3. Editor terbuka dengan tampilan terbagi: penampil PDF di kiri, panel bookmark di kanan. +4. Ketik judul bookmark lalu klik **Tambahkan ke Halaman** untuk membuat bookmark yang mengarah ke halaman saat ini. +5. Gunakan tombol di toolbar untuk menata ulang, memberi gaya, atau menghapus bookmark. +6. Klik **Simpan PDF dengan Bookmark** untuk mengunduh file yang sudah diperbarui. + +## Fitur + +- Penampil PDF visual dengan navigasi halaman, kontrol zoom, dan input pindah ke halaman +- Tambah bookmark ke halaman mana pun dengan satu klik +- Klik langsung pada PDF untuk menentukan tujuan bookmark secara presisi (mode pemilihan) +- Hierarki bookmark bertingkat dengan penataan ulang melalui seret dan lepas +- Operasi massal: pilih beberapa bookmark untuk mengubah warna, gaya, atau menghapusnya sekaligus +- Pencarian bookmark untuk menemukan entri dengan cepat di struktur yang besar +- Dukungan undo dan redo untuk semua perubahan +- Impor bookmark dari file CSV (judul, halaman, level) atau JSON +- Ekspor bookmark ke CSV atau JSON untuk diedit di luar +- Gaya bookmark: warna (merah, biru, hijau, kuning, ungu) dan gaya font (tebal, miring, tebal miring) +- Navigasi cepat: telusuri halaman dengan tombol page up/down + +## Opsi + +- **Ekstrak otomatis bookmark yang ada**: Jika dicentang, alat membaca dan menampilkan bookmark PDF yang ada saat dimuat. +- **Mode Massal**: Aktifkan untuk memilih beberapa bookmark dan menerapkan perubahan warna, gaya, atau penghapusan secara massal. +- **Luaskan Semua / Ciutkan Semua**: Tampilkan atau sembunyikan anak bookmark bertingkat dengan cepat. + +## Kasus Penggunaan + +- Menambahkan daftar isi ke buku teks atau manual yang belum memiliki bookmark +- Menyusun ulang bookmark pada dokumen hasil pindai setelah proses OCR +- Mengekspor bookmark ke CSV, mengeditnya di spreadsheet, lalu mengimpornya kembali +- Merapikan bookmark buatan otomatis yang memiliki referensi halaman keliru +- Menambahkan bookmark berwarna untuk menandai bagian penting dalam berkas hukum + +## Tips + +- Gunakan impor CSV untuk membuat banyak bookmark sekaligus. Formatnya sederhana: `title,page,level` dengan level 1 sebagai tingkat teratas. +- Mode pemilihan memungkinkan Anda mengklik titik tertentu di halaman PDF untuk menentukan tujuan bookmark, yang lebih presisi daripada hanya menargetkan nomor halaman. +- Ekspor bookmark Anda sebelum melakukan perubahan besar agar Anda memiliki cadangan. + +## Alat Terkait + +- [Daftar Isi](./table-of-contents) +- [Editor PDF](./edit-pdf) +- [Tambahkan label halaman](./add-page-labels) diff --git a/docs/id/tools/cbz-to-pdf.md b/docs/id/tools/cbz-to-pdf.md new file mode 100644 index 00000000..b00b3ea3 --- /dev/null +++ b/docs/id/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ ke PDF +description: Konversi arsip komik CBZ dan CBR ke PDF di browser Anda. Gratis, privat, tanpa unggahan. +--- + +# CBZ ke PDF + +Ubah file arsip komik menjadi PDF. CBZ dan CBR adalah format standar untuk komik digital, yaitu arsip ZIP atau RAR berisi gambar. Alat ini mengekstrak setiap halaman, mempertahankan urutan baca, dan menghasilkan PDF rapi di mana setiap gambar menjadi halaman berukuran penuh. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----- | :------- | :-------------------------------------------------------------- | +| CBZ | `.cbz` | Arsip komik berbasis ZIP (diproses secara lokal dengan pdf-lib) | +| CBR | `.cbr` | Arsip komik berbasis RAR (diproses melalui mesin PyMuPDF) | + +Konverter CBZ mengenali gambar JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC, dan JXL di dalam arsip. Format non-standar dikonversi otomatis ke PNG sebelum disematkan. + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file CBZ atau CBR Anda. Anda dapat mencampur kedua format dalam satu batch. +2. Tinjau file yang terdaftar. Hapus yang tidak Anda perlukan, atau klik **Tambah Lebih Banyak File** untuk menambah file. +3. Klik **Konversi ke PDF**. Untuk file CBZ, alat membuka arsip ZIP, mengurutkan file gambar menurut nama secara natural, mendeteksi format asli setiap gambar, lalu menyematkannya ke PDF menggunakan pdf-lib. File CBR diproses melalui mesin PyMuPDF. +4. Satu file diunduh sebagai PDF. Beberapa file menghasilkan arsip ZIP bernama `comic-converted.zip`. + +## Opsi + +Tidak diperlukan konfigurasi. Setiap gambar menjadi halaman yang ukurannya sama dengan dimensi aslinya, sehingga halaman ganda tetap lebar dan halaman tunggal tetap sempit. + +## Kasus Penggunaan + +- Membaca komik di tablet atau aplikasi ponsel yang mendukung PDF tetapi tidak CBZ/CBR +- Mencetak halaman tertentu dari komik digital +- Mengarsipkan koleksi komik ke format yang dapat dibuka penampil file apa pun +- Membagikan komik kepada orang yang tidak memiliki pembaca komik khusus + +## Tips + +- Gambar di dalam arsip diurutkan secara natural (jadi `page2.jpg` muncul sebelum `page10.jpg`). Beri nama file dengan penomoran yang konsisten agar urutan halaman benar. +- Konverter mendeteksi format gambar dari signature biner, bukan ekstensi file. PNG yang tidak sengaja diberi nama `.jpg` tetap akan tersemat dengan benar. +- File CBZ diproses sepenuhnya di browser tanpa memuat mesin PyMuPDF, sehingga konversinya lebih cepat daripada file CBR. + +## Alat Terkait + +- [EPUB ke PDF](./epub-to-pdf) +- [MOBI ke PDF](./mobi-to-pdf) +- [Gambar ke PDF](./image-to-pdf) diff --git a/docs/id/tools/change-permissions.md b/docs/id/tools/change-permissions.md new file mode 100644 index 00000000..c95900a5 --- /dev/null +++ b/docs/id/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Ubah Izin +description: Atur atau ubah izin penggunaan PDF untuk mencetak, menyalin, mengedit, dan memberi anotasi. Menggunakan enkripsi AES 256-bit. +--- + +# Ubah Izin + +Atur secara rinci apa yang dapat dilakukan penerima terhadap PDF Anda. Berbeda dengan enkripsi dasar yang hanya mengunci file dengan kata sandi, alat ini memungkinkan Anda mengizinkan atau melarang pencetakan, penyalinan, pengeditan, anotasi, pengisian formulir, perakitan dokumen, dan ekstraksi halaman secara selektif, semuanya diberlakukan melalui enkripsi AES 256-bit. + +## Cara Kerja + +1. Unggah file PDF. +2. Jika PDF sudah terenkripsi, masukkan **Kata Sandi Saat Ini**. +3. Tetapkan **Kata Sandi Pengguna Baru** (diperlukan untuk membuka) dan/atau **Kata Sandi Pemilik Baru** (mengatur izin). +4. Aktifkan atau nonaktifkan setiap izin menggunakan kotak centang. +5. Klik **Ubah Izin**. +6. Unduh PDF yang telah diperbarui. + +Jika Anda mengosongkan kedua kolom kata sandi baru, alat akan mendekripsi PDF sepenuhnya, menghapus semua enkripsi dan pembatasan. + +## Kontrol Izin + +| Izin | Yang Dikontrol | +| ------------------------------ | ------------------------------------------------------- | +| **Izinkan Pencetakan** | Apakah dokumen boleh dicetak | +| **Izinkan Menyalin Teks** | Apakah teks dan gambar boleh dipilih dan disalin | +| **Izinkan Pengubahan** | Apakah konten dokumen boleh diedit | +| **Izinkan Anotasi** | Apakah komentar, sorotan, dan stempel boleh ditambahkan | +| **Izinkan Pengisian Formulir** | Apakah kolom formulir interaktif boleh diisi | +| **Izinkan Penyusunan Dokumen** | Apakah halaman boleh disisipkan, dihapus, atau diputar | +| **Izinkan Ekstraksi Halaman** | Apakah halaman tertentu boleh diekstrak | + +Semua izin memerlukan kata sandi pemilik agar dapat diberlakukan. Tanpa kata sandi pemilik, flag izin diabaikan oleh sebagian besar pembaca PDF. + +## Cara Kerja Izin di PDF + +Izin PDF merupakan bagian dari spesifikasi enkripsi. Izin disimpan sebagai bit flag di dalam encryption dictionary dan diberlakukan oleh pembaca PDF yang patuh. Perbedaan utamanya: + +- **Kata sandi pengguna**: Diperlukan untuk membuka file sama sekali. +- **Kata sandi pemilik**: Diperlukan untuk mengubah izin atau menghapus pembatasan. Tanpanya, flag izin menentukan operasi apa yang boleh dilakukan pengguna. + +Jika Anda hanya menetapkan kata sandi pemilik (tanpa kata sandi pengguna), siapa pun dapat membuka file tetapi dibatasi pada operasi yang diizinkan. Jika Anda menetapkan keduanya, file memerlukan kata sandi untuk dibuka dan dibatasi setelah autentikasi. + +## Kasus Penggunaan + +- Mendistribusikan laporan yang dapat dilihat dan dicetak tetapi tidak dapat diedit atau disalin +- Membagikan templat kontrak yang dapat diisi penerima tetapi tidak dapat diubah +- Menerbitkan katalog PDF dengan penyalinan gambar dinonaktifkan +- Mengizinkan anotasi pada draf tinjauan sambil mencegah perubahan struktur + +## Tips + +- Agar efektif, selalu tetapkan kata sandi pemilik. Izin tanpa kata sandi pemilik tidak dapat ditegakkan. +- Beberapa alat PDF pihak ketiga mengabaikan flag izin. Untuk perlindungan lebih kuat, pertimbangkan merasterisasi PDF atau menggunakan DRM. +- Gunakan alat ini untuk meningkatkan PDF lama berenkripsi RC4 ke AES-256. + +## Alat Terkait + +- [Lindungi PDF](./protect-pdf): perlindungan kata sandi sederhana tanpa izin yang terperinci +- [Buka Kunci PDF](./unlock-pdf): hapus enkripsi sepenuhnya +- [Hapus Pembatasan](./remove-restrictions): hapus semua pembatasan jika Anda memiliki kata sandi pemilik diff --git a/docs/id/tools/combine-single-page.md b/docs/id/tools/combine-single-page.md new file mode 100644 index 00000000..095cd6a3 --- /dev/null +++ b/docs/id/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Gabung ke Halaman Tunggal +description: Rangkai semua halaman PDF menjadi satu gulungan vertikal atau horizontal yang berkesinambungan. +--- + +# Gabung ke Halaman Tunggal + +Gabungkan setiap halaman PDF menjadi satu halaman panjang. Halaman dirangkai secara vertikal (seperti gulungan) atau horizontal (berdampingan), menghasilkan satu halaman kontinu pada output. + +## Cara Kerja + +1. Unggah file PDF. +2. Pilih arah tata letak: **Vertikal** (halaman ditumpuk dari atas ke bawah) atau **Horizontal** (halaman diletakkan berdampingan). +3. Atur jarak antar halaman dalam satuan point. +4. Pilih warna latar untuk celah di antara halaman. +5. Secara opsional, aktifkan pemisah (garis tipis di antara halaman) dan atur ketebalan serta warnanya. +6. Klik tombol proses. Hasilnya adalah PDF satu halaman. + +## Fitur + +- Perangkaian halaman vertikal atau horizontal +- Jarak antar halaman yang dapat diatur +- Pemilih warna latar untuk area celah +- Garis pemisah opsional dengan ketebalan dan warna yang dapat disesuaikan +- Merender setiap halaman asli dengan resolusi penuh ke kanvas gabungan + +## Opsi + +| Opsi | Deskripsi | +| --------------------------- | --------------------------------------------------- | +| **Arah Tata Letak** | Vertical (bertumpuk) atau Horizontal (berdampingan) | +| **Jarak** | Celah antar halaman dalam point | +| **Warna Latar Belakang** | Warna area di antara halaman | +| **Tambahkan Garis Pemisah** | Aktifkan garis tipis di antara halaman | +| **Ketebalan Pemisah** | Ketebalan garis dalam point | +| **Warna Pemisah** | Warna garis pemisah | + +## Kasus Penggunaan + +- Membuat satu gambar panjang dari wireframe atau mockup desain multi-halaman +- Menghasilkan tampilan dokumen yang dapat digulir terus-menerus untuk disematkan di web +- Merangkai komik atau storyboard multi-halaman menjadi satu strip +- Membuat tampilan panorama halaman berurutan untuk ditinjau + +## Tips + +- Orientasi vertikal paling cocok untuk dokumen dengan halaman potret. Horizontal lebih baik untuk konten berorientasi lanskap. +- Dokumen besar dengan banyak halaman akan menghasilkan output yang sangat tinggi atau lebar. Beberapa penampil PDF mungkin kesulitan dengan halaman tunggal yang sangat besar. +- Menambahkan pemisah dengan warna kontras memudahkan Anda melihat di mana satu halaman asli berakhir dan halaman berikutnya dimulai. + +## Alat Terkait + +- [N-Up PDF](./n-up-pdf) +- [Gabung PDF](./merge-pdf) +- [Bagi Halaman](./divide-pages) diff --git a/docs/id/tools/compare-pdfs.md b/docs/id/tools/compare-pdfs.md new file mode 100644 index 00000000..7c55b1a2 --- /dev/null +++ b/docs/id/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Bandingkan PDF +description: Bandingkan dua dokumen PDF secara berdampingan atau dalam mode overlay dengan deteksi dan pengelompokan perubahan yang terperinci. +--- + +# Bandingkan PDF + +Unggah dua PDF dan lihat dengan tepat apa yang berubah di antara keduanya. Alat ini memasangkan halaman secara cerdas, mendeteksi perbedaan pada teks, gambar, anotasi, header, dan format, lalu menampilkannya dalam tampilan berdampingan atau overlay. + +## Cara Kerja + +1. Unggah dua file PDF: versi asli (kiri) dan versi revisi (kanan). +2. Alat memasangkan halaman antar dokumen menggunakan signature konten. +3. Pilih mode tampilan: **Berdampingan** atau **Tumpang Tindih**. +4. Berpindah antar pasangan halaman menggunakan kontrol paginasi. +5. Perbedaan disorot dan dikelompokkan. Gunakan panel filter untuk berfokus pada jenis perubahan tertentu. +6. Secara opsional, ekspor hasil perbandingan sebagai laporan PDF. + +## Fitur + +- Pemasangan halaman otomatis berdasarkan kemiripan konten +- Tampilan perbandingan berdampingan dan overlay +- Pengelompokan perubahan: teks, gambar, header/footer, anotasi, format, latar belakang +- Tombol filter per kategori untuk menampilkan atau menyembunyikan jenis perubahan tertentu +- Pencarian perubahan teks dengan filter kueri +- Dukungan OCR untuk membandingkan dokumen hasil pindai +- Kontrol zoom untuk pemeriksaan terperinci +- Pengguliran tersinkron antar panel pada mode berdampingan +- Ekspor hasil perbandingan sebagai PDF + +## Opsi + +| Opsi | Deskripsi | +| --------------------- | ------------------------------------------------------------------------------------------- | +| **Mode Tampilan** | Berdampingan atau Tumpang Tindih | +| **OCR** | Aktifkan/nonaktifkan OCR untuk perbandingan dokumen hasil pindai | +| **Bahasa OCR** | Bahasa untuk ekstraksi teks OCR | +| **Filter Kategori** | Atur visibilitas perubahan teks, gambar, header/footer, anotasi, format, dan latar belakang | +| **Cakupan Perubahan** | Pada mode tumpang tindih, filter antara semua perubahan atau hanya konten | +| **Zoom** | Atur tingkat pembesaran untuk pemeriksaan terperinci | + +## Kasus Penggunaan + +- Meninjau revisi kontrak untuk menemukan dengan tepat apa yang berubah antar versi +- Membandingkan mockup desain untuk memastikan ekspor PDF sesuai harapan +- Mengaudit perubahan dokumen di industri teregulasi yang mewajibkan setiap suntingan dicatat +- Memverifikasi bahwa proses konversi PDF mempertahankan konten asli dengan akurat +- Memeriksa dokumen terjemahan terhadap sumbernya untuk perubahan tata letak + +## Tips + +- Tampilan overlay menumpuk kedua dokumen sehingga perbedaan spasial (elemen bergeser, gambar berubah ukuran) langsung terlihat. +- Aktifkan OCR saat membandingkan dokumen hasil pindai yang tidak memiliki lapisan teks. Mesin perbandingan akan mengekstrak teks dari gambar halaman. +- Gunakan filter kategori untuk berfokus pada yang penting. Misalnya, sembunyikan perubahan format jika Anda hanya peduli pada perbedaan isi teks. + +## Alat Terkait + +- [Lihat Metadata](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Gabung PDF](./merge-pdf) diff --git a/docs/id/tools/compress-pdf.md b/docs/id/tools/compress-pdf.md new file mode 100644 index 00000000..2f2c66d9 --- /dev/null +++ b/docs/id/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Kompres PDF +description: Kurangi ukuran file PDF hingga 90% dengan mesin Hyper Compress. Mendukung ukuran file target, pemrosesan batch, dan pengaturan kualitas kustom. +--- + +# Kompres PDF + +Perkecil file PDF Anda tanpa merusaknya. Kompres PDF ditenagai oleh [Hyper Compress](https://www.bentopdf.com/hyper-compress), mesin kompresi milik BentoPDF sendiri. Mesin ini mengompresi ulang gambar, membuat subset dan menggabungkan font, serta membuang beban tak terpakai seperti thumbnail tersemat dan data aplikasi privat. PDF tetap berfungsi penuh: teks tetap dapat dipilih, tautan dan kolom formulir tetap bekerja. + +Hyper Compress dikompilasi ke WebAssembly dan disertakan bersama BentoPDF, sehingga kompresi berjalan offline dan di lingkungan air-gapped tanpa pengaturan tambahan. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik area unggah atau menyeret file ke dalamnya. +2. Pilih **Tingkat Kompresi**: Rendah, Sedang, Tinggi, atau Lossless. +3. Secara opsional, masukkan **Ukuran File Target**, atau buka **Pengaturan Kustom** untuk kontrol yang lebih rinci, termasuk **Konversi ke skala abu-abu**. +4. Klik **Kompres PDF**. Untuk beberapa file, Anda mendapatkan satu unduhan ZIP. + +## Dokumen Khusus + +- **PDF yang ditandatangani secara digital** dikembalikan tanpa perubahan, karena setiap perubahan akan membatalkan tanda tangan. Aktifkan **Abaikan perlindungan konten** di Pengaturan Kustom untuk menghapus tanda tangan dan mengompresnya; tanda tangan yang terlihat tetap ada di halaman, tetapi file tidak lagi bertanda tangan. +- **File PDF/A** kehilangan label PDF/A setelah kompresi, sehingga file tidak pernah mengklaim kesesuaian yang tidak lagi dipenuhi. Aktifkan **Pertahankan PDF/A** di Pengaturan Kustom untuk mempertahankan kesesuaian file. +- **PDF yang dilindungi kata sandi** mendapatkan kolom kata sandi pada kartu filenya. Masukkan kata sandi di sana dan Hyper Compress membuka file itu sendiri, tanpa langkah pembukaan kunci terpisah. Dengan dua file terkunci atau lebih, satu kolom bersama membuka semua file yang memakai kata sandi yang sama. Salinan terkompresi tidak memiliki kata sandi; gunakan [Lindungi PDF](./protect-pdf) untuk menambahkannya kembali. +- **Hasil pindai tanpa lapisan teks** dapat menyusut lebih jauh dengan **Rasterisasi halaman menjadi gambar** di Pengaturan Kustom, yang mengganti setiap halaman dengan satu gambar yang dioptimalkan. Opsi ini dilewati untuk dokumen yang memiliki teks yang dapat dipilih, termasuk hasil pindai ber-OCR, kecuali **Abaikan perlindungan konten** aktif. Dalam kasus itu halaman teks juga menjadi gambar, sehingga teks tidak lagi dapat dipilih dan tautan berhenti berfungsi. + +## Tingkat Kompresi + +| Tingkat | Kualitas Gambar | Resolusi Maks. | Paling Cocok Untuk | +| ------------ | ------------------- | -------------- | ------------------------------- | +| **Rendah** | 80 | 200 DPI | Menjaga kualitas visual | +| **Sedang** | 50 | 150 DPI | Dokumen sehari-hari | +| **Tinggi** | 20 | 72 DPI | Lampiran email, unggahan ke web | +| **Lossless** | Gambar tidak diubah | Tidak berubah | Salinan arsip | + +Tinggi juga melepas penyematan 14 font PDF standar, ditambah font yang mirip seperti Arial bila aman. + +## Ukuran File Target + +Masukkan ukuran dalam KB atau MB dan Hyper Compress mencari kualitas gambar terbaik yang masih muat, dimulai dari tingkat yang Anda pilih. Jika dokumen tidak dapat sekecil itu, Anda mendapatkan versi terkecil yang dapat dibuat beserta pesan yang menyatakannya. Halaman khusus seperti [Kompres PDF ke 1MB](https://www.bentopdf.com/compress-pdf-to-1mb) terbuka dengan target yang sudah terisi. + +## Pengaturan Kustom + +Buka panel Pengaturan Kustom untuk menyesuaikan Hyper Compress secara langsung. Memilih tingkat kompresi mengatur ulang pengaturan ini ke nilai tingkat tersebut, dan mengedit salah satunya mengubah tingkat menjadi Kustom. + +- **Abaikan perlindungan konten**: secara default Hyper Compress tidak menyentuh PDF bertanda tangan dan tidak merasterisasi halaman yang memiliki teks. Mengaktifkannya melewati keduanya. Pengaturan ini tetap aktif saat Anda mengubah tingkat. + +- **Gambar**: kualitas gambar, resolusi maksimum, resampling paksa, pengurangan warna, pemangkasan area gambar yang tidak terlihat, penghapusan gambar alternatif, penyederhanaan profil warna, JPEG 2000, dan mode lossless +- **Font**: pembuatan subset, penggabungan duplikat, dan pelepasan penyematan font standar serta font yang mirip +- **Konten**: perataan anotasi, kolom formulir, atau tautan +- **Pembersihan**: penghapusan thumbnail, data aplikasi, article thread, informasi web capture, structure tree, atau output intent +- **Rasterisasi**: mengganti halaman dengan gambar, untuk hasil pindai berupa gambar saja; dilewati jika dokumen memiliki teks yang dapat dipilih +- **Keluaran**: Pertahankan PDF/A, dan kompresi Brotli untuk pembaca PDF 2.0 yang mendukungnya + +## Kasus Penggunaan + +- Menurunkan laporan 50 MB agar di bawah batas lampiran email +- Membuat hasil pindai muat di bawah batas unggah ketat sebuah portal dengan ukuran file target +- Mengoptimalkan PDF pemasaran agar unduhan situs web lebih cepat +- Mengarsipkan kumpulan dokumen besar saat biaya penyimpanan menjadi pertimbangan +- Mengurangi penggunaan data seluler saat membagikan PDF melalui aplikasi perpesanan + +## Tips + +- Mulailah dengan Sedang. Jika hasilnya masih terlalu besar, tetapkan ukuran file target atau naikkan ke Tinggi. +- Untuk hasil pindai tanpa lapisan teks, aktifkan Rasterisasi halaman menjadi gambar di Pengaturan Kustom. +- Konversi ke skala abu-abu, di Pengaturan Kustom, dapat memangkas ukuran file untuk dokumen yang banyak warna. + +## Alat Terkait + +- [Linierisasi PDF](./linearize-pdf): optimalkan PDF terkompresi untuk tampilan web yang cepat +- [Rasterisasi PDF](./rasterize-pdf): ubah halaman menjadi gambar pada DPI tertentu, termasuk halaman bertulisan +- [Perbaiki PDF](./repair-pdf): perbaiki PDF yang rusak saat dikompresi di tempat lain +- [Hapus Metadata](./remove-metadata): buang data tersembunyi demi privasi diff --git a/docs/id/tools/crop-pdf.md b/docs/id/tools/crop-pdf.md new file mode 100644 index 00000000..0c4041a7 --- /dev/null +++ b/docs/id/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Potong PDF +description: Potong halaman PDF secara visual dengan menggambar area pemotongan pada setiap halaman menggunakan editor berbasis Cropper.js. +--- + +# Potong PDF + +Pangkas margin halaman PDF Anda dengan antarmuka pemotongan visual. Gambar persegi pemotongan langsung pada setiap halaman, pratinjau hasilnya, lalu terapkan. Anda dapat menetapkan area pemotongan berbeda untuk halaman berbeda atau menerapkan pemotongan yang sama ke seluruh dokumen. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Editor pemotong terbuka, menampilkan halaman pertama dengan overlay pemotongan yang dapat diseret. +3. Sesuaikan persegi pemotongan dengan menyeret tepi atau sudutnya. +4. Gunakan tombol navigasi halaman untuk berpindah antar halaman dan menetapkan area pemotongan untuk masing-masing. +5. Klik **Potong & Unduh** untuk menerapkan pemotongan dan mengunduh hasilnya. + +## Fitur + +- Editor pemotongan visual berbasis Cropper.js dengan handle untuk penyesuaian presisi +- Navigasi halaman demi halaman untuk menetapkan area pemotongan individual +- Menyimpan pengaturan pemotongan per halaman sehingga Anda dapat menentukan pemotongan berbeda untuk halaman berbeda +- Pratinjau langsung area pemotongan yang dipilih +- Mendukung PDF dengan ukuran atau orientasi halaman apa pun + +## Kasus Penggunaan + +- Menghapus margin lebar dari dokumen hasil pindai agar fokus pada area konten +- Memangkas tanda potong atau tanda registrasi printer dari PDF prepress +- Memotong slide kuliah untuk menghapus area catatan presenter +- Menghapus header atau footer dari setiap halaman sebelum membagikan kutipan dokumen +- Mengubah ukuran halaman agar sesuai dengan tampilan atau tata letak cetak tertentu + +## Tips + +- Overlay pemotongan dapat diubah ukuran dan dipindahkan secara bebas. Seret sudut untuk mengubah ukuran secara proporsional atau tepi untuk penyesuaian satu sumbu. +- Untuk dokumen yang setiap halamannya memerlukan pemotongan yang sama, atur di halaman pertama. Alat mengingat area pemotongan Anda saat Anda berpindah halaman. +- Jika Anda perlu menyeragamkan ukuran halaman alih-alih memotong secara visual, alat Perbaiki Ukuran Halaman mungkin lebih cocok. + +## Alat Terkait + +- [Editor PDF](./edit-pdf) +- [Nomor Halaman](./page-numbers) +- [Hapus Halaman Kosong](./remove-blank-pages) diff --git a/docs/id/tools/csv-to-pdf.md b/docs/id/tools/csv-to-pdf.md new file mode 100644 index 00000000..3dbc7d25 --- /dev/null +++ b/docs/id/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV ke PDF +description: Konversi file spreadsheet CSV menjadi tabel PDF terformat langsung di browser Anda. +--- + +# CSV ke PDF + +Ubah file CSV menjadi dokumen PDF yang rapi dan terformat. Setiap CSV diurai dan dirender sebagai tabel pada PDF hasil. Ini berguna saat Anda perlu mencetak atau membagikan data tabular tanpa mengharuskan penerima memiliki perangkat lunak spreadsheet. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :------- | +| CSV | `.csv` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas satu atau beberapa file CSV. +2. Tinjau daftar file. Tambahkan file lain atau hapus yang tidak diinginkan. +3. Klik **Konversi ke PDF**. Indikator progres menampilkan status konversi. +4. Satu file diunduh langsung sebagai PDF. Beberapa file dikemas menjadi `csv-converted.zip`. + +## Opsi + +Alat ini tidak memiliki konfigurasi tambahan. CSV diurai dan diformat otomatis sebagai tabel. + +## Output + +| Jumlah Input | Output | +| :----------- | :------------------------------------------------------- | +| 1 file | Satu unduhan PDF (mis., `data.pdf`) | +| 2+ file | Arsip ZIP (`csv-converted.zip`) berisi satu PDF per file | + +## Kasus Penggunaan + +- Mengonversi laporan database hasil ekspor menjadi tabel PDF yang siap cetak +- Membagikan data keuangan atau daftar inventaris kepada orang yang tidak memiliki Excel +- Membuat versi PDF dari file log CSV untuk dokumentasi kepatuhan +- Mencetak daftar alamat, lembar nilai, atau data tabular apa pun yang tersimpan sebagai CSV + +## Tips + +- Untuk hasil terbaik, pastikan CSV Anda memakai pemisah koma standar. Alat mengikuti konvensi penguraian CSV yang umum. +- Jika CSV Anda memiliki banyak kolom, tabel mungkin dipadatkan agar muat di lebar halaman. Pertimbangkan membagi dataset yang lebar menjadi beberapa file. +- Untuk file Excel (`.xls`, `.xlsx`), gunakan alat [Excel ke PDF](./excel-to-pdf), yang mempertahankan format spreadsheet dan beberapa sheet. + +## Alat Terkait + +- [Excel ke PDF](./excel-to-pdf) +- [Teks ke PDF](./txt-to-pdf) +- [JSON ke PDF](./json-to-pdf) diff --git a/docs/id/tools/delete-pages.md b/docs/id/tools/delete-pages.md new file mode 100644 index 00000000..8b3bbd77 --- /dev/null +++ b/docs/id/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Hapus Halaman +description: Hapus halaman tertentu dari PDF menurut nomor halaman, rentang, atau pemilihan thumbnail visual. +--- + +# Hapus Halaman + +Hapus halaman yang tidak diinginkan dari dokumen PDF. Tentukan halaman yang akan dihapus dengan mengetik nomor halaman atau rentang, atau klik langsung thumbnail halaman untuk menandainya. + +## Cara Kerja + +1. Unggah file PDF. Alat merender pratinjau thumbnail setiap halaman. +2. Masukkan halaman yang akan dihapus di kolom teks dengan sintaks rentang (mis., `2, 5-8`), atau klik thumbnail untuk mengaktifkan/menonaktifkannya. +3. Halaman yang ditandai disorot secara visual agar Anda dapat memastikan pilihan Anda. +4. Klik tombol proses. PDF baru dibuat tanpa halaman yang dipilih. + +## Fitur + +- Pemilihan halaman berbasis teks dengan sintaks rentang (`2, 5-8, 12`) +- Kisi thumbnail visual untuk penghapusan dengan klik +- Sorotan pratinjau real-time untuk halaman yang ditandai untuk dihapus +- Validasi input terhadap jumlah halaman sebenarnya +- Mempertahankan semua halaman yang tidak dihapus dalam urutan aslinya + +## Kasus Penggunaan + +- Menghapus halaman kosong atau halaman pengisi dari dokumen hasil pindai +- Membuang halaman sampul atau lampiran sebelum membagikan dokumen +- Membersihkan halaman draf yang tidak sengaja tertinggal di PDF final +- Menghapus halaman berisi informasi sensitif sebelum distribusi + +## Tips + +- Menghapus halaman tidak memengaruhi konten atau format halaman yang tersisa. Hasilnya adalah salinan setia dari aslinya dikurangi halaman yang dihapus. +- Jika Anda ingin mempertahankan halaman tertentu saja alih-alih menghapus halaman tertentu, [Ekstrak Halaman](./extract-pages) lebih cocok. +- Tampilan thumbnail dimuat secara lazy, sehingga dokumen besar tetap responsif. + +## Alat Terkait + +- [Ekstrak Halaman](./extract-pages) +- [Duplikat & Atur](./organize-pdf) +- [Pisah PDF](./split-pdf) diff --git a/docs/id/tools/deskew-pdf.md b/docs/id/tools/deskew-pdf.md new file mode 100644 index 00000000..82932f06 --- /dev/null +++ b/docs/id/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Luruskan PDF +description: Luruskan otomatis halaman miring pada PDF hasil pindai menggunakan deteksi kemiringan OpenCV. Ambang batas dan pengaturan DPI dapat disesuaikan. +--- + +# Luruskan PDF + +Dokumen hasil pindai jarang benar-benar lurus. Kemiringan sedikit saja membuat OCR kurang akurat dan hasil cetak tampak berantakan. Alat ini memakai algoritma pemrosesan gambar OpenCV untuk mendeteksi sudut kemiringan setiap halaman dan memutarnya kembali agar rata. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF hasil pindai. +2. Atur **Ambang Kemiringan**: halaman dengan kemiringan terdeteksi di bawah nilai ini dibiarkan apa adanya. +3. Pilih **Kualitas Pemrosesan (DPI)**: DPI lebih tinggi meningkatkan akurasi deteksi tetapi memakan waktu lebih lama. +4. Klik **Luruskan PDF**. +5. Setelah pemrosesan, panel hasil menampilkan sudut yang terdeteksi pada setiap halaman dan apakah halaman itu dikoreksi. + +## Opsi + +| Pengaturan | Nilai | Default | +| ----------------------------- | -------------------------- | ------- | +| **Ambang Kemiringan** | 0.1, 0.5, 1.0, 2.0 derajat | 0.5 | +| **Kualitas Pemrosesan (DPI)** | 100, 150, 200, 300 | 150 | + +## Cara Kerja Deteksi Kemiringan + +Alat merender setiap halaman menjadi gambar pada DPI yang dipilih, lalu memakai OpenCV untuk mendeteksi sudut garis dominan pada konten. Jika kemiringan yang terdeteksi melebihi ambang batas, halaman diputar dengan sudut kebalikannya agar lurus. Halaman di bawah ambang batas diteruskan tanpa perubahan. + +## Kasus Penggunaan + +- Merapikan kontrak atau dokumen hukum yang dipindai secara batch +- Menyiapkan struk atau faktur hasil pindai untuk pemrosesan OCR +- Meluruskan halaman dari pemindai flatbed dengan penempatan kertas yang tidak konsisten +- Meningkatkan kualitas visual materi arsip yang didigitalkan + +## Tips + +- Turunkan ambang batas ke 0.1 derajat jika Anda memerlukan keselarasan sempurna untuk OCR. +- 150 DPI cepat dan akurat untuk sebagian besar dokumen. Gunakan 300 DPI untuk teks yang sangat kecil atau halaman dengan detail halus. +- Deskew bekerja paling baik pada dokumen dengan garis teks horizontal yang jelas. Alat mungkin kesulitan pada halaman yang sebagian besar berupa gambar atau elemen desain diagonal. + +## Alat Terkait + +- [Rasterisasi PDF](./rasterize-pdf): ubah hasil yang sudah diluruskan menjadi PDF berbasis gambar datar +- [Kompres PDF](./compress-pdf): kurangi ukuran file setelah diluruskan +- [Perbaiki PDF](./repair-pdf): perbaiki masalah struktural pada PDF hasil pindai diff --git a/docs/id/tools/digital-sign-pdf.md b/docs/id/tools/digital-sign-pdf.md new file mode 100644 index 00000000..3f97af10 --- /dev/null +++ b/docs/id/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Tanda Tangan Digital +description: Tambahkan tanda tangan digital kriptografis ke PDF menggunakan sertifikat X.509. Mendukung format PKCS#12 dan PEM dengan opsi tanda tangan yang terlihat. +--- + +# Tanda Tangan Digital + +Tanda tangan digital adalah bukti kriptografis bahwa orang tertentu telah menandatangani dokumen dan dokumen tersebut tidak diubah sejak saat itu. Berbeda dengan tanda tangan gambar (yang hanya berupa gambar), tanda tangan digital menggunakan sertifikat X.509 dan standar PKCS#7 untuk memberikan keaslian dan integritas yang dapat diverifikasi. + +BentoPDF menerapkan tanda tangan digital sepenuhnya di browser Anda. Kunci privat Anda tidak pernah meninggalkan perangkat Anda. + +## Cara Kerja + +1. Unggah file PDF. +2. Unggah file sertifikat Anda (.pfx, .p12, atau .pem). +3. Masukkan kata sandi sertifikat untuk membukanya. Alat menampilkan subjek sertifikat, penerbit, dan masa berlaku. +4. Secara opsional, atur metadata tanda tangan (alasan, lokasi, info kontak). +5. Secara opsional, aktifkan **Tanda Tangan Terlihat** dengan kustomisasi posisi, ukuran, gambar, dan teks. +6. Klik **Tandatangani PDF**. + +## Format Sertifikat yang Didukung + +| Format | Ekstensi | Deskripsi | +| ----------- | ---------- | ------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Bundel standar industri yang berisi kunci privat dan rantai sertifikat. Format paling umum. | +| **PEM** | .pem | Format berbasis teks. Harus berisi sertifikat dan kunci privat dalam satu file. Mendukung kunci privat terenkripsi. | + +## Opsi Tanda Tangan yang Terlihat + +Jika diaktifkan, blok tanda tangan yang terlihat dirender pada halaman PDF: + +- **Posisi**: koordinat X/Y serta lebar/tinggi dalam point +- **Halaman**: halaman pertama, halaman terakhir, semua halaman, atau nomor halaman tertentu +- **Gambar**: unggah gambar PNG, JPG, atau WebP (tanda tangan tulisan tangan Anda, stempel perusahaan, dll.) +- **Teks**: teks kustom dengan warna dan ukuran font yang dapat diatur. Jika tidak ada gambar atau teks, alat membuat teks otomatis dari common name sertifikat dan tanggal saat ini. + +## Metadata Tanda Tangan + +- **Alasan**: Alasan dokumen ditandatangani (mis., "Disetujui", "Ditinjau") +- **Lokasi**: Tempat penandatanganan berlangsung (mis., "Jakarta") +- **Info Kontak**: Cara menghubungi penandatangan (mis., alamat email) + +## Catatan Koneksi Internet + +Penandatanganan mungkin memerlukan koneksi internet. Pustaka penandatanganan mengambil rantai sertifikat dari URL yang tertanam di ekstensi Authority Information Access (AIA) pada sertifikat Anda. Jika server tersebut tidak dapat dijangkau, penandatanganan akan gagal untuk sertifikat yang memerlukan validasi rantai. + +## Kasus Penggunaan + +- Menandatangani kontrak, proposal, dan perjanjian dengan tanda tangan digital yang mengikat secara hukum +- Mengesahkan dokumen resmi dalam alur kerja yang memerlukan autentikasi berbasis PKI +- Menandatangani faktur PDF untuk kepatuhan regulasi (banyak negara UE mewajibkan e-faktur bertanda tangan digital) +- Menambahkan persetujuan organisasi pada gambar teknik atau dokumen mutu + +## Tips + +- Sertifikat self-signed berfungsi untuk pengujian tetapi akan menampilkan peringatan di Adobe Reader. Gunakan sertifikat dari Certificate Authority tepercaya untuk dokumen produksi. +- Tanda tangan yang terlihat hanya bersifat visual. Tanda tangan kriptografis tertanam terlepas dari apakah blok yang terlihat diaktifkan. +- Verifikasi PDF yang sudah ditandatangani dengan alat Validasi Tanda Tangan untuk memastikan tanda tangan masih utuh. + +## Alat Terkait + +- [Validasi Tanda Tangan PDF](./validate-signature-pdf): verifikasi tanda tangan digital pada PDF yang ditandatangani +- [Ratakan PDF](./flatten-pdf): ratakan formulir sebelum menandatangani untuk mencegah modifikasi +- [Lindungi PDF](./protect-pdf): tambahkan perlindungan kata sandi di atas tanda tangan digital +- [Hapus Metadata](./remove-metadata): buang metadata sebelum menandatangani diff --git a/docs/id/tools/divide-pages.md b/docs/id/tools/divide-pages.md new file mode 100644 index 00000000..257df492 --- /dev/null +++ b/docs/id/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Bagi Halaman +description: Pisahkan halaman PDF secara horizontal atau vertikal menjadi sub-halaman yang lebih kecil. +--- + +# Bagi Halaman + +Potong setiap halaman PDF menjadi dua bagian dengan membaginya secara horizontal atau vertikal. Ini berguna saat satu halaman berisi konten yang sebaiknya dipisah menjadi halaman tersendiri, misalnya tata letak dua kolom yang dipindai sebagai satu halaman lebar. + +## Cara Kerja + +1. Unggah file PDF. +2. Pilih arah pembagian: **Vertikal** (bagian kiri/kanan) atau **Horizontal** (bagian atas/bawah). +3. Secara opsional, tentukan rentang halaman untuk membatasi halaman yang dibagi. Biarkan kosong untuk membagi semua halaman. +4. Klik tombol proses untuk menghasilkan PDF yang sudah dibagi. + +## Fitur + +- Pembagian vertikal: membagi setiap halaman menjadi bagian kiri dan kanan +- Pembagian horizontal: membagi setiap halaman menjadi bagian atas dan bawah +- Filter rentang halaman untuk membagi halaman tertentu saja +- Halaman yang tidak ditargetkan diteruskan tanpa perubahan +- Menjaga kualitas konten tanpa render ulang + +## Kasus Penggunaan + +- Memisahkan halaman pindaian dua-halaman (mis., pindaian buku dengan halaman kiri dan kanan dalam satu lembar) +- Membagi PDF lanskap dengan konten berdampingan menjadi halaman potret individual +- Membagi infografis atau poster yang tinggi menjadi bagian atas dan bawah yang terpisah +- Menyiapkan dokumen format lebar untuk dicetak di kertas standar + +## Tips + +- Jika distribusi konten pada halaman Anda tidak merata, pembagian tetap terjadi tepat di titik tengah. Untuk pembagian asimetris, pertimbangkan [Potong PDF](./crop-pdf). +- Gabungkan alat ini dengan [Putar PDF](./rotate-pdf) jika halaman Anda perlu diputar sebelum atau sesudah dibagi. + +## Alat Terkait + +- [Pisah PDF](./split-pdf) +- [Potong PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Posterisasi PDF](./posterize-pdf) diff --git a/docs/id/tools/duplex-collate.md b/docs/id/tools/duplex-collate.md new file mode 100644 index 00000000..f57945ab --- /dev/null +++ b/docs/id/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Susun Ulang Pindaian Dupleks +description: Susun ulang PDF pindaian dupleks yang berisi halaman depan dan halaman belakang dalam blok terpisah menjadi urutan halaman depan/belakang yang benar. +--- + +# Susun Ulang Pindaian Dupleks + +Susun Ulang Pindaian Dupleks dirancang untuk alur kerja pemindaian ADF di mana satu PDF berisi dua blok halaman: + +- semua sisi depan terlebih dahulu +- semua sisi belakang kemudian + +Alih-alih memisah dan merakit ulang secara manual, alat ini menyisipkan kedua blok menjadi urutan baca yang natural: depan1, belakang1, depan2, belakang2, dan seterusnya. + +## Cara Kerja + +1. Unggah satu PDF yang dibuat dari pemindaian tumpukan dupleks. +2. Tetapkan titik pemisah tempat blok depan berakhir. +3. Pilih penanganan blok belakang: + - **Balik blok halaman belakang** (umum saat tumpukan dibalik sebelum memindai sisi belakang) + - **Biarkan blok halaman belakang apa adanya** +4. Klik **Susun PDF** untuk mengunduh hasil yang sudah disusun ulang. + +## Opsi + +- **Deteksi pemisahan otomatis (setengah)**: menetapkan titik pemisah ke `ceil(totalPages / 2)`. +- **Peringatan halaman ganjil**: memberi peringatan saat total halaman ganjil (sering menandakan pindaian tidak cocok). +- **Konfirmasi blok tidak seimbang**: meminta konfirmasi saat ukuran blok depan/belakang berbeda. +- **Ekspor berkelompok**: pisahkan hasil susunan menjadi PDF terpisah berdasarkan jumlah halaman dokumen asli dan unduh sebagai ZIP. + +## Perilaku Output + +- **Bawaan**: satu PDF output (satu PDF masuk, satu PDF keluar). +- **Mode berkelompok**: output dipecah menurut nilai halaman-per-dokumen Anda; jika dihasilkan beberapa potongan, semuanya diunduh sebagai satu ZIP, jika tidak satu PDF diunduh. + +Jika ukuran blok tidak sama, halaman yang berpasangan disusun terlebih dahulu, dan sisa halaman tanpa pasangan ditambahkan di akhir. + +## Kasus Penggunaan Umum + +- Memulihkan urutan setelah memindai setumpuk formulir bolak-balik dalam dua kali proses. +- Membangun ulang paket depan/belakang dari pemindai kantor yang menghasilkan semua sisi depan lalu semua sisi belakang. +- Pascapemrosesan pindaian arsip sebelum dipecah menjadi file per dokumen. + +## Tips + +- Sebagian besar batch dupleks seharusnya memiliki jumlah halaman total yang genap. +- Jika sisi belakang tampak terbalik pada hasil, beralihlah antara **Balik blok halaman belakang** dan **Biarkan blok halaman belakang apa adanya**. +- Untuk dokumen asli 2 halaman (depan+belakang), gunakan ekspor berkelompok dengan `2` halaman per dokumen. + +## Alat Terkait + +- [Alternatif & Campur Halaman](./alternate-merge) +- [Pisah PDF](./split-pdf) +- [Gabung PDF](./merge-pdf) +- [Duplikat & Atur](./organize-pdf) diff --git a/docs/id/tools/edit-attachments.md b/docs/id/tools/edit-attachments.md new file mode 100644 index 00000000..e87a53cb --- /dev/null +++ b/docs/id/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Edit Lampiran +description: Lihat dan hapus secara selektif lampiran file yang tertanam di dokumen PDF. +--- + +# Edit Lampiran + +Periksa dan kelola lampiran file di dalam PDF. Alat ini mendaftar setiap file tertanam beserta nama dan tingkat lampirannya, lalu memungkinkan Anda menandai lampiran tertentu untuk dihapus atau menghapus semuanya sekaligus. + +## Cara Kerja + +1. Unggah file PDF. +2. Alat otomatis memindai lampiran dan menampilkannya dalam daftar. +3. Setiap lampiran menampilkan nama file dan apakah itu lampiran tingkat dokumen atau tingkat halaman. +4. Klik ikon tempat sampah di samping lampiran untuk menandainya untuk dihapus (klik lagi untuk membatalkan tanda). +5. Gunakan tombol **Hapus Semua Lampiran** untuk memilih semuanya sekaligus, atau **Batalkan Pilih Semua** untuk menghapus semua pilihan. +6. Klik tombol proses untuk menyimpan PDF baru dengan lampiran terpilih dihapus. + +## Fitur + +- Mendaftar semua lampiran tingkat dokumen dan tingkat halaman +- Penghapusan lampiran satu per satu atau massal +- Aktifkan dan nonaktifkan pilihan sebelum menerapkan perubahan +- Coretan visual dan perubahan opasitas pada item yang ditandai untuk dihapus +- Mengunduh PDF yang sudah dimodifikasi dengan lampiran terpilih dihapus + +## Kasus Penggunaan + +- Menghapus file usang atau salah yang tertanam di dokumen sebelum disebarkan ulang +- Membuang lampiran sensitif (data keuangan, info pribadi) dari PDF sebelum dibagikan +- Memperkecil ukuran file PDF dengan menghapus file tertanam besar yang tidak lagi diperlukan +- Mengaudit konten tertanam dan membersihkan dokumen sebelum diarsipkan + +## Tips + +- Lampiran yang ditandai untuk dihapus ditampilkan dengan coretan visual. Anda dapat membatalkan tanda sebelum memproses jika berubah pikiran. +- Jika tidak ada lampiran ditemukan, alat menampilkan pesan "Tidak ada lampiran di PDF ini" yang jelas. Artinya PDF memang tidak berisi file tertanam. + +## Alat Terkait + +- [Tambah Lampiran](./add-attachments) +- [Ekstrak Lampiran](./extract-attachments) +- [Lihat Metadata](./view-metadata) diff --git a/docs/id/tools/edit-metadata.md b/docs/id/tools/edit-metadata.md new file mode 100644 index 00000000..40b8a335 --- /dev/null +++ b/docs/id/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Edit Metadata +description: Lihat dan ubah kolom metadata PDF termasuk judul, penulis, kata kunci, tanggal, dan properti kustom. +--- + +# Edit Metadata + +Edit metadata yang tertanam di file PDF. Alat ini mengisi formulir dengan metadata dokumen yang ada, memungkinkan Anda mengubah kolom apa pun, dan menyimpan perubahan ke PDF baru. + +## Cara Kerja + +1. Unggah file PDF. Alat membaca metadata saat ini dan mengisi formulir. +2. Edit kolom standar apa pun: Judul, Penulis, Subjek, Kata Kunci, Pembuat, Produsen. +3. Sesuaikan Tanggal Pembuatan dan Tanggal Modifikasi menggunakan pemilih tanggal-waktu. +4. Tambahkan kolom metadata kustom dengan mengklik tombol tambah dan memasukkan pasangan kunci-nilai. +5. Klik tombol proses untuk menyimpan PDF yang sudah dimodifikasi. + +## Fitur + +- Mengisi otomatis semua metadata yang ada dari PDF yang diunggah +- Kolom standar: Judul, Penulis, Subjek, Kata Kunci, Pembuat, Produsen +- Pemilih tanggal-waktu untuk Tanggal Pembuatan dan Tanggal Modifikasi +- Kolom metadata kunci-nilai kustom untuk properti sembarang +- Menyimpan perubahan langsung ke document info dictionary milik PDF + +## Kolom yang Dapat Diedit + +| Kolom | Deskripsi | +| ---------------------- | ------------------------------------------------------ | +| **Judul** | Judul dokumen yang ditampilkan di pembaca PDF | +| **Penulis** | Orang atau organisasi yang membuat dokumen | +| **Subjek** | Deskripsi singkat topik dokumen | +| **Kata Kunci** | Istilah dipisah koma untuk pencarian dan pengategorian | +| **Pembuat** | Aplikasi yang pertama kali membuat konten | +| **Produsen** | Aplikasi yang menghasilkan PDF | +| **Tanggal Pembuatan** | Kapan dokumen pertama kali dibuat | +| **Tanggal Modifikasi** | Kapan dokumen terakhir diubah | +| **Kolom Kustom** | Pasangan kunci-nilai tambahan yang Anda tentukan | + +## Kasus Penggunaan + +- Menetapkan judul dan penulis yang tepat sebelum menerbitkan dokumen +- Menambahkan kata kunci untuk meningkatkan kemudahan pencarian di sistem manajemen dokumen +- Memperbarui tanggal modifikasi agar mencerminkan revisi terkini +- Menambahkan kolom metadata kustom seperti Department, Project ID, atau Classification +- Membersihkan metadata yang ditinggalkan perangkat lunak penyusun asli + +## Tips + +- Kolom kustom ditulis langsung ke info dictionary PDF. Beberapa pembaca PDF mungkin tidak menampilkan kolom kustom, tetapi kolom tersebut tetap tersimpan di file. +- Kosongkan sebuah kolom untuk menghapusnya dari metadata. Tombol proses menyimpan apa pun yang ada di formulir. +- Untuk melihat metadata tanpa mengedit, gunakan [Lihat Metadata](./view-metadata). Untuk menghapus seluruh metadata, gunakan Hapus Metadata. + +## Alat Terkait + +- [Lihat Metadata](./view-metadata) +- [Lapisan PDF (OCG)](./pdf-layers) +- [Kompres PDF](./compress-pdf) diff --git a/docs/id/tools/edit-pdf.md b/docs/id/tools/edit-pdf.md new file mode 100644 index 00000000..53957337 --- /dev/null +++ b/docs/id/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Editor PDF +description: Beri anotasi, sorot, redaksi, tambah bentuk dan gambar, cari, dan lihat PDF langsung di browser Anda. +--- + +# Editor PDF + +Editor PDF BentoPDF memungkinkan Anda memberi anotasi, menyorot, meredaksi, berkomentar, menambah bentuk dan gambar, serta mencari di dalam PDF Anda. Editor lengkap dimuat langsung di browser Anda tanpa unggahan ke server. + +## Cara Kerja + +1. Unggah PDF Anda dengan mengklik area unggah atau menyeret file ke dalamnya. +2. Editor PDF tertanam terbuka otomatis dengan dokumen Anda sudah dimuat. +3. Gunakan toolbar untuk memberi anotasi, menyorot, meredaksi, menambah teks, menggambar bentuk, atau menyisipkan gambar. +4. Klik **Unduh PDF yang Diedit** untuk menyimpan perubahan Anda. + +## Fitur + +- Toolbar anotasi lengkap dengan sorotan, garis bawah, coretan, dan gambar bebas +- Penyisipan teks dan komentar +- Alat redaksi yang menghapus konten bertanda secara permanen setelah Anda menerapkan redaksi. Jika ada tanda yang belum diterapkan saat Anda mengklik **Unduh PDF yang Diedit**, editor menawarkan untuk menerapkannya terlebih dahulu. +- Alat bentuk untuk persegi panjang, lingkaran, garis, dan panah +- Penyisipan gambar ke halaman PDF +- Pencarian teks bawaan di seluruh dokumen +- Dukungan multi-dokumen dengan tab (hingga 10 dokumen terbuka bersamaan) +- Pemuatan file dengan seret dan lepas + +## Kasus Penggunaan + +- Meninjau kontrak dan menandai perubahan dengan sorotan dan komentar +- Meredaksi informasi rahasia seperti nomor identitas atau data keuangan sebelum dibagikan +- Menambahkan anotasi pada denah arsitektur atau gambar teknik +- Menyisipkan logo atau stempel perusahaan ke halaman dokumen +- Mencari istilah tertentu di dokumen hukum yang panjang + +## Tips + +- Anda dapat membuka beberapa PDF sekaligus dan berpindah di antaranya menggunakan bilah tab di bagian atas editor. +- Editor mempertahankan struktur PDF asli, sehingga font, tata letak, dan kolom formulir tetap utuh. +- Menandai teks atau area untuk redaksi tidak menghapus apa pun sampai redaksi diterapkan. Saat Anda meredaksi teks terpilih, salinannya di properti file, bookmark, komentar, dan lampiran juga dihapus dari hasil unduhan, kecuali file terenkripsi. +- Untuk watermark massal atau penomoran halaman, gunakan alat khusus agar kontrol format lebih baik. + +## Alat Terkait + +- [Tambah Watermark](./add-watermark) +- [Tanda Tangan PDF](./sign-pdf) +- [Tambah Stempel](./add-stamps) +- [Hapus Anotasi](./remove-annotations) diff --git a/docs/id/tools/email-to-pdf.md b/docs/id/tools/email-to-pdf.md new file mode 100644 index 00000000..5a461ccd --- /dev/null +++ b/docs/id/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email ke PDF +description: Konversi file email EML dan MSG ke PDF di browser Anda. Mempertahankan header, isi, dan daftar lampiran. +--- + +# Email ke PDF + +Ubah file email tersimpan menjadi PDF yang rapi dan siap cetak. Alat ini mengurai file EML dan MSG, mengekstrak pesan secara utuh (header, isi, dan metadata lampiran), lalu merender semuanya ke PDF terstruktur. Berguna untuk discovery hukum, pencatatan arsip, atau sekadar mencetak email penting. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----- | :------- | :------------------------------------------------------------------- | +| EML | `.eml` | Format email MIME standar (diekspor dari sebagian besar klien email) | +| MSG | `.msg` | Format proprietari Microsoft Outlook | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file EML atau MSG Anda. Anda dapat mencampur kedua format dalam satu batch. +2. Tinjau daftar file. Hapus entri yang tidak diinginkan dengan ikon tempat sampah, atau klik **Tambah Lebih Banyak File** untuk menambah email. +3. Atur opsi konversi (lihat di bawah). +4. Klik **Konversi ke PDF**. Alat mengurai setiap email, merender konten sebagai HTML bergaya, dan mengonversinya ke PDF melalui mesin PyMuPDF. +5. Satu email diunduh langsung sebagai PDF. Beberapa email dikemas menjadi `emails-converted.zip`. + +## Opsi + +| Opsi | Default | Deskripsi | +| :----------------------------------------- | :------ | :----------------------------------------------------------------------------------- | +| **Ukuran Halaman** | A4 | Pilih antara dimensi halaman A4, Letter, atau Legal. | +| **Sertakan penerima CC dan BCC di header** | On | Jika aktif, daftar penerima CC dan BCC muncul di bagian header email pada PDF. | +| **Sertakan daftar lampiran email** | On | Jika aktif, daftar lampiran file email (beserta nama file dan ukuran) muncul di PDF. | + +## Kasus Penggunaan + +- Mengarsipkan korespondensi bisnis penting sebagai PDF untuk kepatuhan atau audit +- Mencetak rangkaian email untuk proses hukum atau permintaan discovery +- Membuat catatan permanen konfirmasi pesanan, tanda terima, atau kontrak yang diterima lewat email +- Mencadangkan file MSG Outlook dalam format yang tidak memerlukan Outlook untuk membacanya +- Mendokumentasikan interaksi dukungan pelanggan dari file EML hasil ekspor + +## Tips + +- EML (dipakai Thunderbird, Apple Mail, dan sebagian besar klien email) maupun file MSG Outlook didukung. Ekspor email dari klien email Anda dan jatuhkan langsung ke alat ini. +- Email berformat HTML mempertahankan gayanya di PDF. Email teks biasa dirender dengan format yang bersih dan mudah dibaca. +- Daftar lampiran menampilkan nama file dan ukuran tetapi tidak menyematkan file lampiran sebenarnya ke dalam PDF. + +## Alat Terkait + +- [XML ke PDF](./xml-to-pdf) +- [XPS ke PDF](./xps-to-pdf) diff --git a/docs/id/tools/epub-to-pdf.md b/docs/id/tools/epub-to-pdf.md new file mode 100644 index 00000000..af48c287 --- /dev/null +++ b/docs/id/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB ke PDF +description: Konversi ebook EPUB ke PDF di browser Anda. Gratis, tanpa unggahan, konversi mengutamakan privasi. +--- + +# EPUB ke PDF + +Konversi ebook EPUB menjadi file PDF tanpa meninggalkan browser Anda. EPUB adalah standar terbuka untuk buku digital, tetapi terkadang Anda membutuhkan PDF dengan tata letak tetap untuk dicetak, diberi anotasi, atau dibagikan kepada orang yang tidak memiliki pembaca ebook. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----- | :------- | :--------------------- | +| EPUB | `.epub` | File EPUB 2 dan EPUB 3 | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file EPUB Anda. Pemilihan banyak file didukung. +2. Tinjau file yang diunggah. Hapus entri yang tidak diinginkan dengan ikon tempat sampah, atau klik **Tambah Lebih Banyak File** untuk memperluas batch. +3. Klik **Konversi ke PDF**. Mesin PyMuPDF merender konten EPUB (teks, gambar, dan format) menjadi output PDF berhalaman. +4. Satu EPUB diunduh langsung sebagai PDF. Beberapa file dikemas menjadi arsip ZIP bernama `epub-converted.zip`. + +## Opsi + +Konversi berjalan dengan default yang masuk akal tanpa konfigurasi wajib. Teks mengalir ke dimensi halaman standar, dan font serta gambar tertanam dibawa ke PDF. + +## Kasus Penggunaan + +- Mencetak ebook bebas DRM untuk dibaca jauh dari layar +- Mengirim naskah EPUB sebagai PDF dengan tata letak tetap untuk ditinjau +- Mengarsipkan buku digital dalam format yang dapat dibuka secara native oleh setiap sistem operasi +- Membagikan satu bab kepada rekan yang tidak memiliki pembaca EPUB +- Mengonversi dokumentasi teknis yang didistribusikan sebagai EPUB menjadi PDF yang dapat diberi anotasi + +## Tips + +- Fitur EPUB 3 seperti audio dan video tertanam tidak akan terbawa ke PDF, tetapi semua teks, gambar, dan tabel terkonversi dengan baik. +- Untuk hasil terbaik pada EPUB dengan gaya yang rumit, periksa beberapa halaman pertama output untuk memastikan kesetiaan tata letak. + +## Alat Terkait + +- [MOBI ke PDF](./mobi-to-pdf) +- [FB2 ke PDF](./fb2-to-pdf) +- [CBZ ke PDF](./cbz-to-pdf) diff --git a/docs/id/tools/excel-to-pdf.md b/docs/id/tools/excel-to-pdf.md new file mode 100644 index 00000000..d23ad1b2 --- /dev/null +++ b/docs/id/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel ke PDF +description: Konversi spreadsheet Excel (XLS, XLSX), ODS, dan file CSV ke PDF dengan format yang terjaga. +--- + +# Excel ke PDF + +Konversi file spreadsheet ke PDF. Alat ini menangani file Excel modern, format XLS lama, OpenDocument Spreadsheet, bahkan CSV, semuanya dirender melalui mesin LibreOffice berbasis browser yang mempertahankan format sel, rumus (sebagai nilai hasil hitung), grafik, dan tata letak multi-sheet. + +## Format yang Didukung + +| Format | Ekstensi | +| :----------------------- | :------- | +| Excel (modern) | `.xlsx` | +| Excel (lama) | `.xls` | +| OpenDocument Spreadsheet | `.ods` | +| CSV | `.csv` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file spreadsheet Anda. +2. Tinjau daftar file. Tambahkan file lain atau hapus yang tidak diinginkan. +3. Klik **Konversi ke PDF**. Mesin LibreOffice diinisialisasi pada penggunaan pertama, lalu memproses setiap file. +4. Satu file diunduh langsung sebagai PDF. Beberapa file dikirim sebagai `excel-converted.zip`. + +## Opsi + +Alat ini tidak memiliki konfigurasi tambahan. Mesin LibreOffice menentukan tata letak halaman, skala, dan area cetak berdasarkan pengaturan bawaan spreadsheet. + +## Output + +| Jumlah Input | Output | +| :----------- | :--------------------------------------------------------- | +| 1 file | Satu unduhan PDF (nama file asli dengan ekstensi `.pdf`) | +| 2+ file | Arsip ZIP (`excel-converted.zip`) berisi satu PDF per file | + +## Kasus Penggunaan + +- Mengonversi laporan keuangan atau anggaran dari Excel ke PDF untuk distribusi +- Membuat PDF siap cetak dari spreadsheet inventaris atau katalog produk +- Membagikan hasil analisis data kepada pemangku kepentingan yang tidak memiliki Excel +- Mengarsipkan laporan kuartalan dalam format yang tidak dapat diedit +- Mengonversi file ODS dari LibreOffice Calc ke PDF + +## Tips + +- Grafik yang tertanam di spreadsheet dirender di PDF. Pastikan tampilannya benar di file sumber sebelum dikonversi. +- Jika spreadsheet Anda memiliki beberapa sheet, semua sheet disertakan dalam output PDF. +- Untuk data CSV sederhana tanpa format, alat [CSV ke PDF](./csv-to-pdf) menyediakan konversi yang lebih ringan. Gunakan Excel ke PDF saat Anda membutuhkan format, grafik, atau beberapa sheet tetap terjaga. + +## Alat Terkait + +- [CSV ke PDF](./csv-to-pdf) +- [Word ke PDF](./word-to-pdf) +- [PowerPoint ke PDF](./powerpoint-to-pdf) diff --git a/docs/id/tools/extract-attachments.md b/docs/id/tools/extract-attachments.md new file mode 100644 index 00000000..0263dae1 --- /dev/null +++ b/docs/id/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Ekstrak Lampiran +description: Ekstrak semua lampiran file tertanam dari satu atau beberapa PDF dan unduh sebagai arsip ZIP. +--- + +# Ekstrak Lampiran + +Keluarkan setiap lampiran tertanam dari satu atau beberapa file PDF. Semua file yang diekstrak dibundel dalam satu arsip ZIP untuk diunduh. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF yang berisi lampiran tertanam. +2. Klik **Ekstrak Lampiran**. +3. Alat memindai setiap PDF untuk lampiran tingkat dokumen dan tingkat halaman. +4. Semua file yang ditemukan dikemas ke arsip ZIP dan diunduh otomatis. +5. Pesan status mengonfirmasi berapa banyak lampiran yang ditemukan dan ukuran totalnya. + +## Fitur + +- Ekstraksi batch dari beberapa PDF sekaligus +- Mengekstrak lampiran tingkat dokumen maupun tingkat halaman +- Menghasilkan satu file ZIP berisi semua file yang diekstrak +- Menampilkan jumlah total lampiran dan gabungan ukuran file +- Pesan status yang jelas jika tidak ada lampiran ditemukan + +## Kasus Penggunaan + +- Memulihkan file data yang tertanam di PDF laporan +- Mengambil aset gambar dari portofolio atau dokumen spesifikasi +- Mengekstrak materi tambahan dari PDF pelatihan atau kepatuhan +- Mengaudit file apa saja yang tertanam di dalam sekumpulan PDF + +## Tips + +- Jika alat melaporkan tidak ada lampiran, PDF mungkin berisi gambar tertanam atau data formulir, yang bukan lampiran file. Gunakan [Ekstrak Gambar](./extract-images) untuk gambar tertanam. +- Saat memproses beberapa PDF, semua lampiran dari setiap file berakhir dalam satu ZIP. Nama file dipertahankan dari penyematan aslinya. + +## Alat Terkait + +- [Tambah Lampiran](./add-attachments) +- [Edit Lampiran](./edit-attachments) +- [Ekstrak Gambar](./extract-images) diff --git a/docs/id/tools/extract-images.md b/docs/id/tools/extract-images.md new file mode 100644 index 00000000..67c6cdb3 --- /dev/null +++ b/docs/id/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Ekstrak Gambar +description: Ekstrak semua gambar tertanam dari file PDF. Pratinjau dalam kisi dan unduh satu per satu atau sebagai arsip ZIP. +--- + +# Ekstrak Gambar + +Mengeluarkan setiap gambar tertanam dari satu atau beberapa file PDF. Gambar yang diekstrak ditampilkan dalam kisi pratinjau tempat Anda dapat mengunduhnya satu per satu, atau mengambil semuanya sekaligus sebagai ZIP. Ditenagai oleh PyMuPDF. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik area unggah atau menyeret file ke dalamnya. Tambahkan file lain atau hapus file tertentu sesuai kebutuhan. +2. Klik **Ekstrak Gambar** untuk memulai pemrosesan. +3. Alat memindai setiap halaman dari setiap PDF yang diunggah, menemukan dan mengekstrak gambar tertanam. +4. Gambar yang diekstrak muncul dalam kisi dengan thumbnail. Setiap gambar memiliki tombol unduh. +5. Klik **Unduh Semua** untuk menyimpan semuanya sebagai arsip ZIP. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat dikonfigurasi. Semua gambar tertanam diekstrak dalam format aslinya (biasanya PNG, JPEG, atau format apa pun yang dipakai saat gambar disematkan di PDF). + +## Format Output + +- Gambar ditampilkan dalam kisi pratinjau dengan nama `image_1.png`, `image_2.jpg`, dan seterusnya. +- **Unduh Semua** menghasilkan `extracted-images.zip` berisi semua gambar. +- Gambar individual dapat diunduh satu per satu dari kisi. + +## Kasus Penggunaan + +- Memulihkan foto atau grafik dari PDF untuk dipakai ulang di proyek lain. +- Mengekstrak gambar produk dari PDF katalog untuk listing e-commerce. +- Mengambil diagram dari dokumentasi teknis untuk dipakai di presentasi. +- Mengaudit gambar apa saja yang tertanam di dokumen sebelum dibagikan. + +## Tips + +- Alat mengekstrak gambar persis seperti yang tersimpan di PDF. Alat tidak merender halaman sebagai gambar. Untuk itu, gunakan [PDF ke PNG](./pdf-to-png) atau [PDF ke JPG](./pdf-to-jpg). +- Jika alat melaporkan "Gambar Tidak Ditemukan", PDF mungkin menggunakan grafik vektor alih-alih gambar raster tertanam, atau mungkin dokumen hasil pindai di mana seluruh halaman adalah satu gambar besar. +- Pemrosesan batch berlaku untuk beberapa PDF. Semua gambar dari semua file digabung dalam satu kisi dan ZIP. + +## Alat Terkait + +- [PDF ke PNG](./pdf-to-png) +- [PDF ke JPG](./pdf-to-jpg) +- [Pembangun Alur Kerja PDF](./pdf-workflow) diff --git a/docs/id/tools/extract-pages.md b/docs/id/tools/extract-pages.md new file mode 100644 index 00000000..15ddd1b1 --- /dev/null +++ b/docs/id/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Ekstrak Halaman +description: Simpan rentang halaman tertentu dari PDF sebagai dokumen baru. +--- + +# Ekstrak Halaman + +Keluarkan sekumpulan halaman dari PDF dan simpan sebagai file baru. Tentukan dengan tepat halaman yang Anda inginkan menggunakan sintaks rentang, dan alat membuat PDF bersih yang hanya berisi halaman tersebut. + +## Cara Kerja + +1. Unggah file PDF. Alat menampilkan nama file, ukuran, dan jumlah total halaman. +2. Masukkan halaman yang ingin diekstrak dengan sintaks rentang (mis., `1-5`, `3, 7, 10-12`). +3. Secara opsional, pilih untuk mengunduh setiap rentang sebagai PDF terpisah dalam arsip ZIP. +4. Klik tombol proses. Halaman yang diekstrak diunduh sebagai PDF baru (atau ZIP). + +## Fitur + +- Sintaks rentang halaman yang fleksibel: halaman individual, rentang, atau kombinasi dipisah koma +- Menampilkan jumlah total halaman setelah unggah sebagai acuan mudah +- Opsi output sebagai satu PDF gabungan atau file terpisah dalam ZIP +- Mempertahankan konten dan format halaman asli + +## Kasus Penggunaan + +- Mengambil ringkasan eksekutif (beberapa halaman pertama) dari laporan yang panjang +- Mengekstrak satu bab dari PDF buku teks +- Menyimpan halaman tertentu dari paket formulir sebagai dokumen mandiri +- Membuat dokumen contoh dari halaman terpilih pada file yang lebih besar + +## Tips + +- Nomor halaman dimulai dari 1. Gunakan `1` untuk halaman pertama, bukan `0`. +- Untuk menghapus halaman alih-alih mengekstraknya, gunakan [Hapus Halaman](./delete-pages), yang merupakan operasi kebalikannya. +- Jika Anda memerlukan pemilihan halaman visual dengan thumbnail, gunakan [Pisah PDF](./split-pdf) dalam mode Visual Select. + +## Alat Terkait + +- [Pisah PDF](./split-pdf) +- [Hapus Halaman](./delete-pages) +- [Gabung PDF](./merge-pdf) diff --git a/docs/id/tools/extract-tables.md b/docs/id/tools/extract-tables.md new file mode 100644 index 00000000..fba9e13e --- /dev/null +++ b/docs/id/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Ekstrak Tabel PDF +description: Deteksi dan ekstrak tabel dari dokumen PDF. Ekspor sebagai CSV, JSON, atau Markdown dengan granularitas per tabel. +--- + +# Ekstrak Tabel PDF + +Mendeteksi semua tabel di PDF dan memungkinkan Anda mengekspornya dalam format pilihan Anda: CSV, JSON, atau Markdown. Setiap tabel diekstrak secara individual dengan metadata halaman dan posisi. Ditenagai oleh mesin deteksi tabel PyMuPDF. + +## Cara Kerja + +1. Unggah PDF dengan mengklik area unggah atau menyeret file ke dalamnya. +2. Pilih **Format Ekspor** yang Anda inginkan: CSV, JSON, atau Markdown. +3. Klik **Ekstrak Tabel** untuk memulai pemrosesan. +4. Jika satu tabel ditemukan, tabel diunduh sebagai satu file. Beberapa tabel menghasilkan arsip ZIP dengan satu file per tabel. + +## Opsi + +- **Format Ekspor**: pilih antara: + - **CSV**: nilai dipisah koma dengan pengutipan yang benar untuk kolom yang berisi koma, tanda kutip, atau baris baru. Cocok untuk spreadsheet dan database. + - **JSON**: struktur array-of-arrays, dicetak rapi dengan indentasi 2 spasi. Cocok untuk dikonsumsi secara terprogram. + - **Markdown**: format tabel berpembatas pipa yang dirender oleh PyMuPDF. Cocok untuk dokumentasi dan file README. + +## Format Output + +- **Satu tabel**: `filename_table.csv` (atau `.json` / `.md`) +- **Beberapa tabel**: `filename_tables.zip` berisi file bernama `table_1_page3.csv`, `table_2_page5.csv`, dan seterusnya. + +## Kasus Penggunaan + +- Mengekstrak tabel tertentu dari laporan PDF yang panjang tanpa mengambil data seluruh dokumen. +- Mendapatkan tabel dalam format Markdown untuk ditempel langsung ke issue GitHub, wiki, atau dokumentasi. +- Mengambil data JSON terstruktur dari tabel PDF untuk integrasi API atau skrip. +- Membandingkan tabel antar versi PDF dengan mengekspor keduanya ke CSV dan melakukan diff. + +## Tips + +- Alat ini memberi Anda kendali per tabel. Jika Anda hanya ingin semua tabel dijadikan satu CSV, gunakan [PDF ke CSV](./pdf-to-csv). Untuk buku kerja Excel lengkap, gunakan [PDF ke Excel](./pdf-to-excel). +- Tabel yang membentang di beberapa halaman mungkin terdeteksi sebagai tabel terpisah per halaman. Anda mungkin perlu menggabungkannya secara manual. +- Jika tidak ada tabel terdeteksi, PDF mungkin berupa gambar hasil pindai. Jalankan OCR terlebih dahulu untuk menambahkan lapisan teks. + +## Alat Terkait + +- [PDF ke CSV](./pdf-to-csv) +- [PDF ke Excel](./pdf-to-excel) +- [PDF ke Teks](./pdf-to-text) diff --git a/docs/id/tools/fb2-to-pdf.md b/docs/id/tools/fb2-to-pdf.md new file mode 100644 index 00000000..fee2536d --- /dev/null +++ b/docs/id/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 ke PDF +description: Konversi file ebook FictionBook (FB2) ke PDF di browser Anda. Gratis, privat, tanpa unggah ke server. +--- + +# FB2 ke PDF + +Konversi file FictionBook 2 (FB2) menjadi dokumen PDF. FB2 adalah format ebook berbasis XML yang populer di Rusia dan Eropa Timur. Meski didukung dengan baik di beberapa platform, format ini hampir tidak dikenal di platform lain. Dengan mengonversinya ke PDF, buku Anda bisa dibaca di mana saja. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :------------ | :------- | :------------------------ | +| FictionBook 2 | `.fb2` | Format ebook berbasis XML | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file FB2 Anda. Pemilihan banyak file sekaligus didukung. +2. Periksa daftar file. Gunakan ikon tempat sampah untuk menghapus entri tertentu, atau **Tambah File Lagi** untuk menyertakan lebih banyak file. +3. Klik **Konversi ke PDF**. Mesin PyMuPDF mengurai struktur XML FB2 dan merendernya sebagai konten PDF berhalaman. +4. Satu file langsung diunduh sebagai PDF. Beberapa hasil konversi dikemas dalam `fb2-converted.zip`. + +## Opsi + +Tidak diperlukan konfigurasi. Konverter menangani struktur XML FB2 secara otomatis, dengan mempertahankan pemisah bab, pemformatan, dan gambar yang tertanam. + +## Kasus Penggunaan + +- Membaca ebook FB2 di perangkat atau aplikasi yang hanya mendukung PDF +- Mencetak literatur berbahasa Rusia yang didistribusikan dalam format FB2 +- Mengarsipkan pustaka FB2 ke format yang didukung secara universal +- Membagikan buku kepada orang yang pembacanya tidak mendukung FictionBook + +## Tips + +- File FB2 adalah XML biasa, sehingga ukurannya cenderung kecil dan cepat dikonversi bahkan di browser. +- Jika file FB2 Anda dikompresi sebagai `.fb2.zip`, ekstrak terlebih dahulu sebelum mengunggah. + +## Alat Terkait + +- [EPUB ke PDF](./epub-to-pdf) +- [MOBI ke PDF](./mobi-to-pdf) +- [XML ke PDF](./xml-to-pdf) diff --git a/docs/id/tools/fix-page-size.md b/docs/id/tools/fix-page-size.md new file mode 100644 index 00000000..09ffad8a --- /dev/null +++ b/docs/id/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Perbaiki Ukuran Halaman +description: Standarkan semua halaman dalam PDF ke ukuran yang seragam. Pilih ukuran kertas standar atau tentukan dimensi kustom. +--- + +# Perbaiki Ukuran Halaman + +PDF yang disusun dari beberapa sumber sering memiliki ukuran halaman yang tidak seragam: ada yang Letter, ada yang A4, ada yang sama sekali tidak standar. Alat ini memaksa setiap halaman ke satu ukuran target, dengan menskalakan konten agar pas atau memenuhi halaman sesuai kebutuhan. + +## Cara Kerja + +1. Unggah file PDF. +2. Pilih **Ukuran Halaman Target** dari menu tarik-turun (A4, Letter, Legal, A3, A5, Tabloid, atau Kustom). +3. Pilih **Orientasi**: Otomatis mempertahankan orientasi asli setiap halaman, atau Anda bisa memaksa Potret atau Lanskap. +4. Pilih mode **Penskalaan Konten**: Pas (mempertahankan semua konten, mungkin menambah margin) atau Penuh (memenuhi halaman, mungkin memotong tepi). +5. Secara opsional, atur **Warna Latar Belakang** untuk margin tambahan. +6. Klik **Perbaiki Ukuran Halaman**. + +## Opsi + +- **Ukuran standar**: A4, Letter, Legal, A3, A5, Tabloid +- **Dimensi kustom**: Masukkan lebar dan tinggi dalam inci atau milimeter +- **Orientasi**: Otomatis, Potret, Lanskap +- **Mode penskalaan**: Pas atau Penuh (Potong) +- **Warna latar belakang**: Warna apa pun untuk isian margin + +## Kasus Penggunaan + +- Menormalkan PDF gabungan yang halamannya berasal dari pemindai berbeda +- Mengonversi dokumen US Letter ke A4 untuk distribusi internasional +- Menyiapkan PDF siap cetak yang membutuhkan ukuran potong yang konsisten +- Memperbaiki halaman yang sedikit menyimpang dari standar (misalnya 8,49 x 11,02 inci, bukan 8,5 x 11) + +## Tips + +- Gunakan mode Pas untuk memastikan tidak ada konten yang hilang. Mode Penuh terlihat lebih rapi tetapi dapat memotong tepi. +- Periksa hasilnya dengan alat Dimensi Halaman untuk memastikan setiap halaman sesuai target. +- Putih adalah warna latar belakang default; ganti ke warna gelap jika dokumen Anda memiliki margin gelap. + +## Alat Terkait + +- [Dimensi Halaman](./page-dimensions): periksa ukuran halaman sebelum dan sesudah perbaikan +- [Kompres PDF](./compress-pdf): kurangi ukuran file setelah standarisasi +- [Potong PDF](./crop-pdf): potong halaman secara manual alih-alih penskalaan otomatis diff --git a/docs/id/tools/flatten-pdf.md b/docs/id/tools/flatten-pdf.md new file mode 100644 index 00000000..ff2c1b38 --- /dev/null +++ b/docs/id/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Ratakan PDF +description: Ratakan formulir interaktif dan anotasi menjadi konten statis. Membuat kolom formulir tidak dapat diedit dan menyatukan anotasi ke dalam halaman. +--- + +# Ratakan PDF + +Perataan menggabungkan elemen interaktif (kolom formulir, menu tarik-turun, kotak centang, anotasi, sorotan, catatan tempel) langsung ke dalam konten halaman. Tampilan visual tetap sama, tetapi tidak ada lagi yang dapat diedit atau diekstrak. Ini setara dengan mencetak formulir yang sudah diisi lalu memindainya kembali, hanya saja kualitasnya tetap sempurna. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. +2. Klik **Ratakan PDF**. +3. Satu file langsung diunduh. Beberapa file menghasilkan arsip ZIP. + +Alat ini menggunakan pdf-lib untuk meratakan kolom formulir (melalui `form.flatten()`) dan perata anotasi khusus untuk menyatukan anotasi ke dalam aliran halaman. Kedua operasi berjalan dalam satu proses. + +## Yang Diratakan + +- **Kolom formulir**: Input teks, kotak centang, tombol radio, menu tarik-turun, kolom tanda tangan +- **Anotasi**: Komentar, sorotan, coretan, garis bawah, catatan tempel, stempel, anotasi tinta +- **Elemen interaktif**: Tombol, pemicu aksi + +## Yang Tidak Berubah + +- Konten teks (tetap dapat dipilih dan dicari) +- Gambar dan grafik +- Tata letak dan dimensi halaman +- Bookmark dan daftar isi +- Hyperlink (kecuali yang berbasis anotasi) + +## Kasus Penggunaan + +- Mengunci formulir yang sudah diisi agar penerima tidak dapat mengubah jawaban yang dikirim +- Menyiapkan PDF untuk arsip yang tidak memerlukan elemen interaktif +- Memperbaiki masalah tampilan akibat anotasi yang dirender berbeda di berbagai penampil +- Memastikan dokumen yang sudah ditandatangani tidak dapat diubah setelah tanda tangan diterapkan +- Mengurangi ukuran file dengan menghilangkan definisi kolom formulir dan objek anotasi + +## Tips + +- Ratakan setelah semua pengeditan selesai. Tidak ada cara untuk membatalkan perataan PDF. +- Jika Anda perlu meratakan sekaligus menghapus metadata, JavaScript, dan lampiran, gunakan alat Sanitasi PDF, yang menyertakan perataan sebagai salah satu opsinya. +- Beberapa PDF melaporkan "tidak ada formulir ditemukan". Ini normal jika dokumen hanya memiliki anotasi dan tidak memiliki kolom formulir. + +## Alat Terkait + +- [Sanitasi PDF](./sanitize-pdf): ratakan formulir sekaligus hapus metadata, skrip, dan lainnya +- [Rasterisasi PDF](./rasterize-pdf): konversi ke PDF berbasis gambar untuk perataan maksimal +- [Font ke Garis Tepi](./font-to-outline): ratakan font menjadi jalur vektor +- [Lindungi PDF](./protect-pdf): kunci PDF yang sudah diratakan dengan kata sandi diff --git a/docs/id/tools/font-to-outline.md b/docs/id/tools/font-to-outline.md new file mode 100644 index 00000000..5daa7045 --- /dev/null +++ b/docs/id/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Font ke Garis Tepi +description: Konversi semua font PDF menjadi garis tepi vektor agar tampil konsisten di semua perangkat. Menghilangkan masalah ketergantungan font. +--- + +# Font ke Garis Tepi + +Mengonversi font menjadi garis tepi mengubah setiap karakter teks dari glif berbasis font menjadi jalur vektor. PDF tidak lagi bergantung pada font yang terpasang: tampilannya identik di setiap perangkat, sistem operasi, dan printer. Ini adalah langkah standar dalam alur kerja prepress. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. +2. Klik **Konversi ke Garis Tepi**. +3. Ghostscript mengubah semua teks menjadi jalur vektor. +4. Unduh hasilnya. Beberapa file menghasilkan arsip ZIP. + +Tidak ada pengaturan yang perlu dikonfigurasi. Alat ini menggunakan Ghostscript (WebAssembly) untuk mengubah semua referensi font menjadi jalur garis tepi dalam satu proses. + +## Yang Berubah + +- Karakter teks menjadi kurva vektor (jalur bezier) +- Penyematan font tidak lagi diperlukan: PDF mandiri pada tingkat glif +- Ukuran file dapat bertambah karena jalur vektor biasanya lebih besar daripada referensi font +- Tampilan visual dipertahankan persis sama + +## Yang Hilang + +- Pemilihan teks dan salin-tempel +- Kemampuan pencarian teks (Ctrl+F tidak lagi berfungsi) +- Kemampuan mengedit isi teks +- Aksesibilitas pembaca layar + +## Kasus Penggunaan + +- Mengirim PDF ke percetakan yang mewajibkan font dalam bentuk garis tepi +- Membagikan dokumen yang memakai font kustom atau berlisensi kepada orang yang tidak memiliki font tersebut +- Mencegah penggantian font yang mengubah tampilan dokumen Anda di sistem lain +- Menyiapkan PDF untuk alur kerja ukiran laser atau pemotongan CNC yang membutuhkan input vektor +- Memastikan PDF yang banyak berisi logo tampil benar di semua platform + +## Tips + +- Simpan PDF asli Anda. Pengubahan ke garis tepi tidak dapat dibatalkan: jalur tidak bisa dikonversi kembali menjadi teks yang dapat diedit. +- Jika teks perlu tetap dapat dicari, pertimbangkan alat Rasterisasi PDF dengan OCR sebagai langkah lanjutan. +- PDF dengan garis tepi cenderung lebih besar. Jalankan Kompres PDF setelahnya jika ukuran file penting. + +## Alat Terkait + +- [Ratakan PDF](./flatten-pdf): ratakan formulir dan anotasi tanpa menyentuh font +- [Rasterisasi PDF](./rasterize-pdf): konversi ke PDF berbasis gambar, bukan garis tepi vektor +- [Kompres PDF](./compress-pdf): kurangi ukuran file setelah diubah ke garis tepi +- [PDF ke PDF/A](./pdf-to-pdfa): konversi untuk arsip setelah memastikan kemandirian font diff --git a/docs/id/tools/form-creator.md b/docs/id/tools/form-creator.md new file mode 100644 index 00000000..f2a6e165 --- /dev/null +++ b/docs/id/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Buat Formulir PDF +description: Bangun formulir PDF yang dapat diisi dengan kolom teks, kotak centang, menu tarik-turun, tombol radio, dan lainnya melalui seret dan lepas. +--- + +# Buat Formulir PDF + +Rancang formulir PDF profesional yang dapat diisi dari awal atau dengan menambahkan kolom ke PDF yang sudah ada. Editor visual memungkinkan Anda menyeret dan melepas elemen formulir (kolom teks, kotak centang, menu tarik-turun, tombol radio, kolom tanda tangan, dan lainnya) langsung ke pratinjau halaman. Atur properti kolom, siapkan aturan visibilitas bersyarat, dan ekspor formulir PDF yang sepenuhnya interaktif. + +## Cara Kerja + +1. Unggah PDF yang sudah ada **atau** klik **Buat PDF Kosong** untuk memulai dari awal. +2. Jika membuat PDF kosong, pilih ukuran halaman (Letter, A4, A5, Legal, Tabloid, A3, atau dimensi kustom). +3. Editor formulir terbuka dengan toolbar jenis kolom dan area pratinjau halaman. +4. Pilih jenis kolom dari toolbar, lalu klik pada halaman untuk menempatkannya. +5. Seret kolom untuk memindahkannya. Gunakan gagang ubah ukuran untuk menyesuaikan dimensi. +6. Klik kolom untuk membuka panel properti tempat Anda dapat mengatur nama kolom, nilai default, ukuran font, perataan, dan lainnya. +7. Berpindah antarhalaman menggunakan kontrol halaman. +8. Klik **Simpan** untuk mengunduh PDF yang dapat diisi. + +## Fitur + +- Penempatan kolom dengan seret dan lepas serta gagang visual untuk mengubah ukuran +- Jenis kolom: input teks, teks multibaris, kotak centang, menu tarik-turun, tombol radio, tanda tangan, tanggal, angka, dan barcode +- Panel properti untuk mengatur nama, label, nilai default, ukuran font, warna, perataan, dan validasi setiap kolom +- Aksi kolom dan aturan visibilitas bersyarat (tampilkan/sembunyikan kolom berdasarkan nilai kolom lain) +- Navigasi halaman untuk formulir multihalaman +- Ekstraksi kolom yang ada: secara otomatis mendeteksi dan mengimpor kolom formulir dari PDF yang diunggah +- Dukungan untuk PDF yang diunggah maupun halaman kosong sebagai kanvas formulir +- Beberapa preset ukuran halaman plus dimensi kustom +- Pembuatan barcode didukung oleh bwip-js +- Pengelolaan grup tombol radio + +## Opsi + +**Preset ukuran halaman (untuk PDF kosong):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Kustom (tentukan lebar dan tinggi) + +**Properti kolom (bervariasi menurut jenis kolom):** + +- Nama, label, dan teks placeholder +- Nilai default +- Jenis font, ukuran, dan warna +- Perataan teks (kiri, tengah, kanan) +- Sakelar kolom wajib diisi +- Sakelar hanya-baca +- Panjang maksimum untuk kolom teks +- Daftar opsi untuk menu tarik-turun dan tombol radio +- Aksi visibilitas bersyarat + +## Kasus Penggunaan + +- Membuat formulir onboarding karyawan dengan kolom teks untuk informasi pribadi dan kotak centang untuk persetujuan kebijakan +- Membuat kuesioner penerimaan klien dengan menu tarik-turun untuk memilih layanan +- Merancang formulir pemesanan dengan kolom terhitung dan pengenal barcode +- Membuat daftar periksa inspeksi dengan tombol radio untuk penilaian lulus/gagal +- Membuat formulir survei dengan pertanyaan lanjutan bersyarat yang muncul berdasarkan jawaban + +## Tips + +- Jika Anda mengunggah PDF yang sudah ada, alat ini akan mencoba mengekstrak kolom formulir yang sudah ada sehingga Anda dapat mengedit atau menambahkannya. +- Gunakan fitur grup tombol radio untuk membuat pilihan yang saling eksklusif. Kolom dalam grup radio yang sama berbagi nama grup. +- Uji formulir Anda dengan mengunduhnya dan membukanya di [Pengisi Formulir PDF](./form-filler) untuk memverifikasi perilaku kolom. + +## Alat Terkait + +- [Pengisi Formulir PDF](./form-filler) +- [Tanda Tangan PDF](./sign-pdf) +- [Editor PDF](./edit-pdf) diff --git a/docs/id/tools/form-filler.md b/docs/id/tools/form-filler.md new file mode 100644 index 00000000..8f660f6d --- /dev/null +++ b/docs/id/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Pengisi Formulir PDF +description: Isi formulir PDF, termasuk formulir XFA, langsung di browser Anda dengan penampil tertanam. +--- + +# Pengisi Formulir PDF + +Buka PDF yang memiliki kolom formulir dan isi langsung di penampil tertanam. Alat ini mendukung kolom AcroForm standar maupun formulir XFA (XML Forms Architecture) lama. Setelah formulir selesai diisi, unduh versi yang sudah terisi dengan satu klik. + +## Cara Kerja + +1. Unggah PDF yang berisi kolom formulir. +2. Dokumen terbuka di penampil PDF terintegrasi yang merender kolom formulir sebagai input interaktif. +3. Klik kolom teks, kotak centang, menu tarik-turun, dan tombol radio untuk mengisinya. +4. Klik **Simpan & Unduh Formulir yang Terisi** untuk mendapatkan PDF yang sudah lengkap. + +## Fitur + +- Penampil PDF.js tertanam dengan interaksi penuh pada kolom formulir +- Dukungan untuk kolom AcroForm standar (input teks, kotak centang, menu tarik-turun, tombol radio) +- Dukungan formulir XFA untuk formulir lama berbasis XML +- Ukuran penampil otomatis menyesuaikan dimensi halaman +- Tampilan file dengan informasi nama dan ukuran + +## Opsi + +Tidak ada opsi konfigurasi tambahan. Unggah formulir, isi, lalu unduh. + +## Kasus Penggunaan + +- Mengisi formulir pajak, aplikasi asuransi, atau berkas pemerintahan +- Mengisi formulir lamaran kerja yang diterima sebagai lampiran PDF +- Mengisi formulir onboarding vendor atau kuesioner pemasok +- Menyetujui daftar periksa kepatuhan dengan kolom kotak centang +- Mengisi formulir penerimaan pasien sebelum janji temu + +## Tips + +- Formulir XFA adalah format lama yang hanya didukung oleh beberapa penampil PDF. Jika Anda membuka PDF XFA di Chrome atau sebagian besar alat lain dan melihat halaman kosong, artinya penampil tersebut tidak mendukung XFA. Pengisi Formulir BentoPDF dan Firefox sama-sama menangani XFA dengan baik. +- Untuk PDF tanpa kolom formulir, gunakan alat [Buat Formulir PDF](./form-creator) untuk menambahkan kolom terlebih dahulu, lalu isi di sini. +- Penampil secara otomatis menyesuaikan ukurannya dengan dimensi halaman PDF. + +## Alat Terkait + +- [Buat Formulir PDF](./form-creator) +- [Tanda Tangan PDF](./sign-pdf) +- [Editor PDF](./edit-pdf) diff --git a/docs/id/tools/header-footer.md b/docs/id/tools/header-footer.md new file mode 100644 index 00000000..2074a6bc --- /dev/null +++ b/docs/id/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Kepala & Kaki Halaman +description: Tambahkan teks header dan footer yang dapat disesuaikan ke halaman PDF dengan variabel nomor halaman dinamis. +--- + +# Kepala & Kaki Halaman + +Tambahkan teks ke enam posisi pada halaman PDF Anda: header kiri, header tengah, header kanan, footer kiri, footer tengah, dan footer kanan. Alat ini mendukung variabel dinamis untuk nomor halaman dan jumlah total halaman, sehingga Anda dapat membuat templat seperti "Halaman 3 dari 10" yang diperbarui otomatis di setiap halaman. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Panel opsi muncul menampilkan kontrol pemformatan dan enam kolom input teks. +3. Masukkan teks yang diinginkan pada posisi header/footer mana pun. +4. Gunakan placeholder `{page}` dan `{total}` untuk penomoran halaman dinamis. +5. Atur ukuran font, warna font, dan secara opsional batasi ke rentang halaman tertentu. +6. Klik **Tambah Kepala & Kaki Halaman** untuk memproses dan mengunduh. + +## Opsi + +- **Rentang Halaman**: Secara opsional batasi halaman yang mendapat header dan footer. Biarkan kosong untuk menerapkan ke semua halaman. Format: "1-3, 5" (rentang dipisahkan koma). +- **Ukuran Font**: Antara 6 dan 24 poin. Default 10. +- **Warna Font**: Pilih warna apa pun menggunakan pemilih warna. +- **Header Kiri / Tengah / Kanan**: Kolom teks untuk bagian atas setiap halaman. +- **Footer Kiri / Tengah / Kanan**: Kolom teks untuk bagian bawah setiap halaman. + +## Fitur + +- Enam posisi teks independen per halaman +- Variabel dinamis `{page}` yang menyisipkan nomor halaman saat ini +- Variabel dinamis `{total}` yang menyisipkan jumlah total halaman +- Penyaringan rentang halaman untuk menargetkan halaman tertentu +- Ukuran dan warna font yang dapat disesuaikan +- Font Helvetica untuk hasil yang bersih dan profesional + +## Kasus Penggunaan + +- Menambahkan "Halaman {page} dari {total}" di footer tengah sebuah laporan +- Menempatkan nama perusahaan di header kiri dan tanggal dokumen di header kanan +- Menambahkan pemberitahuan kerahasiaan di footer dokumen hukum +- Menstempel nomor revisi dokumen pada rentang halaman tertentu + +## Tips + +- Gabungkan `{page}` dan `{total}` dalam satu kolom untuk format seperti "Halaman {page} dari {total}" atau "{page}/{total}". +- Anda dapat mengosongkan sebagian besar kolom dan hanya mengisi posisi yang diperlukan. Kolom kosong akan dilewati. +- Untuk header yang lebih kompleks dengan gambar atau logo, pertimbangkan alat [Tambah Watermark](./add-watermark) yang diposisikan di bagian atas halaman. + +## Alat Terkait + +- [Nomor Halaman](./page-numbers) +- [Tambah Watermark](./add-watermark) +- [Penomoran Bates](./bates-numbering) diff --git a/docs/id/tools/heic-to-pdf.md b/docs/id/tools/heic-to-pdf.md new file mode 100644 index 00000000..60090c78 --- /dev/null +++ b/docs/id/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC ke PDF +description: Konversi gambar HEIC dan HEIF dari iPhone dan iPad ke format PDF langsung di browser Anda. +--- + +# HEIC ke PDF + +Konversi gambar HEIC/HEIF ke PDF. HEIC adalah format foto default di iPhone dan iPad sejak iOS 11. Alat ini memungkinkan Anda mengubah foto tersebut menjadi PDF tanpa memasang perangkat lunak desktop atau mengunggah file ke server. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file HEIC/HEIF Anda. +2. Periksa daftar file dan hapus file yang tidak diinginkan. +3. Klik **Konversi ke PDF**. Hasilnya diunduh sebagai `from_heic.pdf`. + +Setiap file HEIC didekode menggunakan pustaka heic2any, yang mengonversinya ke PNG dengan kualitas 92%. PNG tersebut kemudian disematkan ke PDF menggunakan pdf-lib, dengan setiap gambar di halamannya sendiri pada resolusi penuh. + +## Opsi + +Alat ini tidak menyediakan pengaturan tambahan. Gambar HEIC dikonversi dengan kualitas tinggi (0.92) ke PNG sebelum disematkan. + +## Kasus Penggunaan + +- Membuat PDF dari foto iPhone untuk dilampirkan pada klaim asuransi atau laporan +- Mengonversi foto HEIC untuk listing properti menjadi satu dokumen yang siap cetak +- Mengubah tangkapan layar iPad (format HEIF) menjadi PDF yang mudah dibagikan +- Mengonversi massal foto liburan untuk jurnal perjalanan + +## Tips + +- Dekode HEIC berlangsung sepenuhnya di browser menggunakan WebAssembly. Konversi pertama mungkin memerlukan waktu sebentar saat dekoder dimuat. +- Jika Anda perlu menggabungkan HEIC dengan format gambar lain (JPG, PNG, dll.), gunakan alat [Gambar ke PDF](./image-to-pdf), yang menangani HEIC bersama semua format lainnya. +- File HEIC dari iPhone sering berisi data EXIF termasuk koordinat GPS. Output PDF tidak membawa metadata ini. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [JPG ke PDF](./jpg-to-pdf) +- [PNG ke PDF](./png-to-pdf) diff --git a/docs/id/tools/image-to-pdf.md b/docs/id/tools/image-to-pdf.md new file mode 100644 index 00000000..90e113d2 --- /dev/null +++ b/docs/id/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Gambar ke PDF +description: Konversi JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD, dan 10+ format gambar lainnya menjadi satu file PDF. +--- + +# Gambar ke PDF + +Konverter gambar ke PDF universal. Unggah gambar dalam hampir semua format dan gabungkan menjadi satu dokumen PDF. Setiap gambar mendapat halamannya sendiri, dengan ukuran yang sesuai dimensi aslinya. + +## Format yang Didukung + +| Format | Ekstensi | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Ini adalah dukungan format terluas di antara semua konverter gambar BentoPDF. Jika Anda hanya membutuhkan satu format tertentu, gunakan alat khusus sebagai gantinya. + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file gambar Anda. Anda dapat memilih banyak file sekaligus. +2. Periksa daftar file. Hapus file yang tidak diinginkan dengan ikon tempat sampah, atau klik **Tambah File Lagi** untuk menyertakan gambar tambahan. +3. Pilih tingkat **Kualitas PDF** dari menu tarik-turun. +4. Klik **Konversi ke PDF**. Alat ini memproses gambar melalui mesin PyMuPDF dan mengunduh hasilnya sebagai `images_to_pdf.pdf`. + +## Opsi + +**Kualitas PDF** mengatur kompresi gambar yang diterapkan saat menyematkan gambar ke PDF: + +- **Kualitas Tinggi**: kompresi minimal, ukuran file lebih besar. Terbaik untuk cetak atau arsip. +- **Kualitas Sedang** (default): kompresi seimbang. Cocok untuk sebagian besar keperluan. +- **Kualitas Rendah**: kompresi agresif, ukuran file terkecil. Cocok untuk email atau berbagi cepat. + +File HEIC dan WebP otomatis dikonversi ke PNG sebelum disematkan. Ini terjadi secara transparan dan tidak memerlukan langkah tambahan. + +## Kasus Penggunaan + +- Menggabungkan struk atau dokumen hasil pindai dari kamera ponsel menjadi satu PDF +- Membuat portofolio foto atau lookbook dari gambar berbagai format +- Mengonversi foto iPhone (HEIC) menjadi PDF yang mudah dibagikan tanpa memasang perangkat lunak desktop +- Menyusun mockup desain dari ekspor PSD dan tangkapan layar menjadi hasil kerja untuk klien +- Mengarsipkan folder berisi format gambar lawas (PNM, JXR, JP2) sebagai satu PDF + +## Tips + +- Urutan gambar dalam PDF sesuai dengan urutannya di daftar file. Unggah sesuai urutan yang Anda inginkan. +- Untuk ukuran file sekecil mungkin, pilih Kualitas Rendah. Perbedaan visualnya sering kali dapat diabaikan untuk hasil pindai yang dominan teks. +- Jika Anda hanya memiliki satu format gambar, konverter khusus (JPG ke PDF, PNG ke PDF, dll.) memberikan hasil yang sama dengan antarmuka yang lebih sederhana. + +## Alat Terkait + +- [JPG ke PDF](./jpg-to-pdf) +- [PNG ke PDF](./png-to-pdf) +- [HEIC ke PDF](./heic-to-pdf) +- [WebP ke PDF](./webp-to-pdf) diff --git a/docs/id/tools/index.md b/docs/id/tools/index.md new file mode 100644 index 00000000..e0bc7778 --- /dev/null +++ b/docs/id/tools/index.md @@ -0,0 +1,183 @@ +# Referensi Alat + +BentoPDF menawarkan **130+ alat** untuk bekerja dengan PDF. Semua alat berjalan sepenuhnya di browser Anda: file Anda tidak pernah meninggalkan perangkat Anda. + +--- + +## Edit & Anotasi + +Ubah, tandai, dan tingkatkan dokumen PDF Anda dengan rangkaian alat pengeditan yang lengkap. + +
+ +- [**Editor PDF**](./edit-pdf): Beri anotasi, sorot, redaksi, komentar, tambahkan bentuk/gambar, cari, dan lihat PDF. +- [**Edit Bookmark**](./bookmark): Tambah, edit, impor, hapus, dan ekstrak bookmark PDF. +- [**Daftar Isi**](./table-of-contents): Buat halaman daftar isi dari bookmark PDF. +- [**Nomor Halaman**](./page-numbers): Sisipkan nomor halaman ke dokumen Anda. +- [**Tambahkan label halaman**](./add-page-labels): Terapkan label halaman PDF dengan angka Romawi, awalan, dan awal kustom. +- [**Penomoran Bates**](./bates-numbering): Tambahkan nomor Bates berurutan di satu atau beberapa file PDF. +- [**Tambah Watermark**](./add-watermark): Bubuhkan teks atau gambar di atas halaman PDF Anda. +- [**Kepala & Kaki Halaman**](./header-footer): Tambahkan teks di bagian atas dan bawah halaman. +- [**Balik Warna**](./invert-colors): Buat versi mode gelap dari PDF Anda. +- [**Efek Pemindai**](./scanner-effect): Buat PDF Anda tampak seperti dokumen hasil pindai. +- [**Sesuaikan Warna**](./adjust-colors): Atur kecerahan, kontras, saturasi, dan lainnya. +- [**Warna Latar Belakang**](./background-color): Ubah warna latar belakang PDF Anda. +- [**Ubah Warna Teks**](./text-color): Ubah warna teks dalam PDF Anda. +- [**Tanda Tangan PDF**](./sign-pdf): Gambar, ketik, atau unggah tanda tangan Anda. +- [**Tambah Stempel**](./add-stamps): Tambahkan stempel gambar ke PDF Anda menggunakan toolbar anotasi. +- [**Hapus Anotasi**](./remove-annotations): Hapus komentar, sorotan, dan tautan. +- [**Potong PDF**](./crop-pdf): Pangkas margin setiap halaman dalam PDF Anda. +- [**Pengisi Formulir PDF**](./form-filler): Isi formulir langsung di browser. Juga mendukung formulir XFA. +- [**Buat Formulir PDF**](./form-creator): Buat formulir PDF yang dapat diisi dengan kolom teks seret dan lepas. +- [**Hapus Halaman Kosong**](./remove-blank-pages): Deteksi dan hapus halaman kosong secara otomatis. + +
+ +--- + +## Konversi ke PDF + +Ubah gambar, dokumen, e-book, dan format file lain menjadi PDF. + +
+ +- [**Gambar ke PDF**](./image-to-pdf): Konversi JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, dan lainnya ke PDF. +- [**JPG ke PDF**](./jpg-to-pdf): Buat PDF dari satu atau beberapa gambar JPG. +- [**PNG ke PDF**](./png-to-pdf): Buat PDF dari satu atau beberapa gambar PNG. +- [**WebP ke PDF**](./webp-to-pdf): Buat PDF dari satu atau beberapa gambar WebP. +- [**SVG ke PDF**](./svg-to-pdf): Buat PDF dari satu atau beberapa gambar SVG. +- [**BMP ke PDF**](./bmp-to-pdf): Buat PDF dari satu atau beberapa gambar BMP. +- [**HEIC ke PDF**](./heic-to-pdf): Buat PDF dari satu atau beberapa gambar HEIC. +- [**TIFF ke PDF**](./tiff-to-pdf): Buat PDF dari satu atau beberapa gambar TIFF. +- [**Teks ke PDF**](./txt-to-pdf): Konversi file teks biasa menjadi PDF. +- [**Markdown ke PDF**](./markdown-to-pdf): Konversi Markdown ke PDF dengan pratinjau langsung dan penyorotan sintaks. +- [**JSON ke PDF**](./json-to-pdf): Konversi file JSON ke format PDF. +- [**ODT ke PDF**](./odt-to-pdf): Konversi file ODT (OpenDocument Text) ke PDF. +- [**CSV ke PDF**](./csv-to-pdf): Konversi spreadsheet CSV ke PDF. +- [**RTF ke PDF**](./rtf-to-pdf): Konversi dokumen RTF (Rich Text Format) ke PDF. +- [**Word ke PDF**](./word-to-pdf): Konversi dokumen Word (DOCX, DOC, ODT) ke PDF. +- [**Excel ke PDF**](./excel-to-pdf): Konversi spreadsheet Excel (XLSX, XLS, ODS) ke PDF. +- [**PowerPoint ke PDF**](./powerpoint-to-pdf): Konversi presentasi PowerPoint (PPTX, PPT, ODP) ke PDF. +- [**XPS ke PDF**](./xps-to-pdf): Konversi dokumen XPS/OXPS ke PDF. +- [**MOBI ke PDF**](./mobi-to-pdf): Konversi e-book MOBI ke PDF. +- [**EPUB ke PDF**](./epub-to-pdf): Konversi e-book EPUB ke PDF. +- [**FB2 ke PDF**](./fb2-to-pdf): Konversi e-book FictionBook (FB2) ke PDF. +- [**CBZ ke PDF**](./cbz-to-pdf): Konversi arsip komik (CBZ/CBR) ke PDF. +- [**WPD ke PDF**](./wpd-to-pdf): Konversi dokumen WordPerfect (WPD) ke PDF. +- [**WPS ke PDF**](./wps-to-pdf): Konversi dokumen WPS Office ke PDF. +- [**XML ke PDF**](./xml-to-pdf): Konversi dokumen XML ke PDF. +- [**ODG ke PDF**](./odg-to-pdf): Konversi OpenDocument Graphics (ODG) ke PDF. +- [**ODS ke PDF**](./ods-to-pdf): Konversi OpenDocument Spreadsheet (ODS) ke PDF. +- [**ODP ke PDF**](./odp-to-pdf): Konversi OpenDocument Presentation (ODP) ke PDF. +- [**PUB ke PDF**](./pub-to-pdf): Konversi Microsoft Publisher (PUB) ke PDF. +- [**VSD ke PDF**](./vsd-to-pdf): Konversi Microsoft Visio (VSD, VSDX) ke PDF. +- [**PSD ke PDF**](./psd-to-pdf): Konversi file Adobe Photoshop (PSD) ke PDF. +- [**Email ke PDF**](./email-to-pdf): Konversi file email (EML, MSG) ke format PDF. + +
+ +--- + +## Konversi dari PDF + +Ekstrak konten dari PDF ke gambar, dokumen, dan format data. + +
+ +- [**PDF ke JPG**](./pdf-to-jpg): Konversi setiap halaman PDF menjadi gambar JPG. +- [**PDF ke PNG**](./pdf-to-png): Konversi setiap halaman PDF menjadi gambar PNG. +- [**PDF ke WebP**](./pdf-to-webp): Konversi setiap halaman PDF menjadi gambar WebP. +- [**PDF ke BMP**](./pdf-to-bmp): Konversi setiap halaman PDF menjadi gambar BMP. +- [**PDF ke TIFF**](./pdf-to-tiff): Konversi setiap halaman PDF menjadi gambar TIFF. +- [**PDF ke CBZ**](./pdf-to-cbz): Konversi PDF menjadi CBZ (Comic Book Archive) untuk pembaca komik dan Calibre. +- [**PDF ke SVG**](./pdf-to-svg): Konversi setiap halaman PDF menjadi grafik vektor yang dapat diskalakan. +- [**PDF ke CSV**](./pdf-to-csv): Ekstrak tabel dari PDF dan konversi ke format CSV. +- [**PDF ke Excel**](./pdf-to-excel): Ekstrak tabel dari PDF dan konversi ke Excel (XLSX). +- [**PDF ke Skala Abu-abu**](./pdf-to-greyscale): Ubah semua warna menjadi hitam putih. +- [**PDF ke JSON**](./pdf-to-json): Konversi file PDF ke format JSON. +- [**PDF ke Word**](./pdf-to-word): Konversi file PDF menjadi dokumen Word yang dapat diedit. +- [**Ekstrak Gambar**](./extract-images): Ekstrak semua gambar tertanam dari file PDF Anda. +- [**PDF ke Markdown**](./pdf-to-markdown): Konversi teks dan tabel PDF ke format Markdown. +- [**Siapkan PDF untuk AI**](./prepare-pdf-for-ai): Ekstrak konten PDF sebagai JSON LlamaIndex untuk pipeline RAG/LLM. +- [**PDF ke Teks**](./pdf-to-text): Ekstrak teks dari file PDF dan simpan sebagai teks biasa. +- [**Ekstrak Tabel PDF**](./extract-tables): Ekstrak tabel dari PDF sebagai CSV, JSON, atau Markdown. + +
+ +--- + +## Atur & Kelola + +Susun ulang, gabungkan, pisahkan, dan kelola halaman serta file PDF Anda. + +
+ +- [**Pembangun Alur Kerja PDF**](./pdf-workflow): Bangun pipeline pemrosesan PDF kustom dengan editor node visual. +- [**Alat Multi PDF**](./pdf-multi-tool): Editor PDF lengkap dengan pengelolaan halaman. +- [**OCR PDF**](./ocr-pdf): Buat PDF dapat dicari dan disalin. +- [**Gabung PDF**](./merge-pdf): Gabungkan beberapa PDF menjadi satu file. +- [**Alternatif & Campur Halaman**](./alternate-merge): Gabungkan PDF dengan menyelang-nyelingkan halaman dari setiap PDF. +- [**Susun Ulang Pindaian Dupleks**](./duplex-collate): Urutkan ulang blok pindaian depan/belakang ke urutan halaman yang benar. +- [**Duplikat & Atur**](./organize-pdf): Duplikat, atur ulang urutan, dan hapus halaman. +- [**Tambah Lampiran**](./add-attachments): Sematkan satu atau beberapa file ke PDF Anda. +- [**Ekstrak Lampiran**](./extract-attachments): Ekstrak semua file tertanam dari PDF sebagai ZIP. +- [**Edit Lampiran**](./edit-attachments): Lihat atau hapus lampiran di PDF Anda. +- [**Lapisan PDF (OCG)**](./pdf-layers): Lihat, alihkan, tambah, dan hapus lapisan OCG di PDF Anda. +- [**Pisah PDF**](./split-pdf): Ekstrak rentang halaman ke PDF baru. +- [**Bagi Halaman**](./divide-pages): Bagi halaman secara horizontal atau vertikal. +- [**Ekstrak Halaman**](./extract-pages): Simpan pilihan halaman sebagai file baru. +- [**Hapus Halaman**](./delete-pages): Hapus halaman tertentu dari dokumen Anda. +- [**Tambah Halaman Kosong**](./add-blank-page): Sisipkan halaman kosong di mana saja dalam PDF Anda. +- [**Balik Halaman**](./reverse-pages): Balik urutan semua halaman dalam dokumen Anda. +- [**Putar PDF**](./rotate-pdf): Putar halaman dalam kelipatan 90 derajat. +- [**Putar dengan Derajat Kustom**](./rotate-custom): Putar halaman dengan sudut kustom apa pun. +- [**N-Up PDF**](./n-up-pdf): Susun beberapa halaman dalam satu lembar. +- [**Buku Kecil PDF**](./pdf-booklet): Susun ulang halaman untuk pencetakan buku kecil bolak-balik. +- [**Gabung ke Halaman Tunggal**](./combine-single-page): Rangkai semua halaman menjadi satu gulungan kontinu. +- [**Lihat Metadata**](./view-metadata): Periksa properti tersembunyi PDF Anda. +- [**Edit Metadata**](./edit-metadata): Ubah penulis, judul, dan properti lainnya. +- [**PDF ke ZIP**](./pdf-to-zip): Kemas beberapa file PDF ke dalam arsip ZIP. +- [**Bandingkan PDF**](./compare-pdfs): Bandingkan dua PDF secara berdampingan. +- [**Posterisasi PDF**](./posterize-pdf): Pecah satu halaman besar menjadi beberapa halaman yang lebih kecil. + +
+ +--- + +## Optimalkan & Perbaiki + +Kompres, perbaiki, dan optimalkan PDF Anda untuk kinerja dan kompatibilitas yang lebih baik. + +
+ +- [**Kompres PDF**](./compress-pdf): Kurangi ukuran file PDF Anda. +- [**PDF ke PDF/A**](./pdf-to-pdfa): Konversi PDF ke PDF/A untuk pengarsipan jangka panjang. +- [**Perbaiki Ukuran Halaman**](./fix-page-size): Standarkan semua halaman ke ukuran yang seragam. +- [**Linierisasi PDF**](./linearize-pdf): Optimalkan PDF untuk penayangan web yang cepat. +- [**Dimensi Halaman**](./page-dimensions): Analisis ukuran, orientasi, dan satuan halaman. +- [**Hapus Pembatasan**](./remove-restrictions): Hapus perlindungan kata sandi dan pembatasan keamanan. +- [**Perbaiki PDF**](./repair-pdf): Pulihkan data dari file PDF yang rusak atau korup. +- [**Rasterisasi PDF**](./rasterize-pdf): Konversi PDF menjadi PDF berbasis gambar. Ratakan lapisan dan hapus teks yang dapat dipilih. +- [**Luruskan PDF**](./deskew-pdf): Luruskan halaman pindaian yang miring secara otomatis menggunakan OpenCV. +- [**Font ke Garis Tepi**](./font-to-outline): Konversi semua font menjadi garis tepi vektor agar tampil konsisten. + +
+ +--- + +## Amankan PDF + +Lindungi, enkripsi, dan kendalikan akses ke dokumen PDF Anda. + +
+ +- [**Enkripsi PDF**](./protect-pdf): Kunci PDF Anda dengan menambahkan kata sandi. +- [**Sanitasi PDF**](./sanitize-pdf): Hapus metadata, anotasi, skrip, dan lainnya. +- [**Dekripsi PDF**](./unlock-pdf): Buka kunci PDF dengan menghapus perlindungan kata sandi. +- [**Ratakan PDF**](./flatten-pdf): Buat kolom formulir dan anotasi tidak dapat diedit. +- [**Hapus Metadata**](./remove-metadata): Hapus data tersembunyi dari PDF Anda. +- [**Ubah Izin**](./change-permissions): Atur atau ubah izin pengguna pada PDF. +- [**Tanda Tangan Digital**](./digital-sign-pdf): Tambahkan tanda tangan digital kriptografis menggunakan sertifikat X.509. +- [**Validasi Tanda Tangan**](./validate-signature-pdf): Verifikasi tanda tangan digital dan lihat detail sertifikat. + +
diff --git a/docs/id/tools/invert-colors.md b/docs/id/tools/invert-colors.md new file mode 100644 index 00000000..0085c5d9 --- /dev/null +++ b/docs/id/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Balik Warna +description: Balik semua warna dalam PDF Anda untuk membuat versi mode gelap dari dokumen apa pun. +--- + +# Balik Warna + +Balik setiap warna dalam PDF Anda ke kebalikannya. Latar putih menjadi hitam, teks hitam menjadi putih, dan semua warna lain bergeser ke nilai komplementernya. Ini cara tercepat untuk membuat versi "mode gelap" dari PDF apa pun. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Klik **Balik Warna** untuk memproses. +3. PDF yang sudah dibalik akan diunduh secara otomatis. + +Tidak ada pengaturan tambahan. Alat ini merender setiap halaman sebagai gambar, membalik semua warna piksel, lalu menyusun ulang hasilnya menjadi PDF baru. + +## Fitur + +- Pembalikan warna satu klik untuk semua halaman +- Memproses setiap halaman dalam dokumen +- Mempertahankan dimensi dan tata letak halaman asli +- Bekerja dengan PDF apa pun, apa pun jenis kontennya (teks, gambar, campuran) + +## Kasus Penggunaan + +- Membuat versi mode gelap dari buku teks atau manual untuk membaca malam hari dengan nyaman +- Menyiapkan versi kontras tinggi dari dokumen untuk keperluan aksesibilitas +- Membalik dokumen hasil pindai yang diambil dengan eksposur yang salah +- Membuat versi negatif dari PDF yang banyak berisi gambar untuk analisis visual + +## Tips + +- Karena alat ini merasterisasi halaman untuk menerapkan efeknya, hasilnya berbasis gambar. Teks tidak lagi dapat dipilih atau dicari. Jika Anda memerlukan teks yang dapat dicari setelah pembalikan, jalankan hasilnya melalui alat OCR. +- Untuk penyesuaian warna yang lebih terperinci (kecerahan, kontras, saturasi), gunakan alat [Sesuaikan Warna](./adjust-colors). +- PDF besar dengan banyak halaman mungkin membutuhkan waktu lebih lama karena setiap halaman dirender dan dibalik satu per satu. + +## Alat Terkait + +- [Sesuaikan Warna](./adjust-colors) +- [Warna Latar Belakang](./background-color) +- [Efek Pemindai](./scanner-effect) diff --git a/docs/id/tools/jpg-to-pdf.md b/docs/id/tools/jpg-to-pdf.md new file mode 100644 index 00000000..21be17ad --- /dev/null +++ b/docs/id/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG ke PDF +description: Konversi satu atau beberapa gambar JPG, JPEG, dan JPEG 2000 menjadi satu file PDF langsung di browser Anda. +--- + +# JPG ke PDF + +Ubah gambar JPG menjadi PDF yang rapi. Unggah satu file atau beberapa JPG sekaligus: setiap gambar menjadi satu halaman penuh di dokumen hasil. + +## Format yang Didukung + +| Format | Ekstensi | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file JPG Anda. Pemilihan banyak file didukung. +2. Periksa file yang diunggah. Gunakan ikon tempat sampah untuk menghapus file tertentu, atau klik **Tambah File Lagi** untuk menambahkannya ke daftar. +3. Pilih tingkat **Kualitas PDF**. +4. Klik **Konversi ke PDF**. Alat ini mengompresi gambar sesuai pengaturan kualitas Anda, mengonversinya melalui mesin PyMuPDF, dan mengunduh `from_jpgs.pdf`. + +## Opsi + +**Kualitas PDF** menyesuaikan kompresi yang diterapkan pada setiap gambar sebelum disematkan ke PDF: + +- **Kualitas Tinggi**: mempertahankan detail maksimal. Gunakan untuk fotografi atau cetak. +- **Kualitas Sedang** (default): keseimbangan yang baik antara kejernihan dan ukuran file. +- **Kualitas Rendah**: kompresi agresif untuk hasil terkecil. + +## Kasus Penggunaan + +- Mengonversi dokumen hasil pindai yang disimpan sebagai JPG menjadi satu PDF untuk diserahkan +- Mengemas foto produk menjadi katalog untuk klien +- Mengubah gambar medis atau satelit JPEG 2000 menjadi PDF portabel +- Membuat album foto yang dapat dicetak dari ekspor kamera + +## Tips + +- File JPEG 2000 (`.jp2`, `.jpx`) didukung sepenuhnya, bukan hanya JPEG standar. Ini berguna untuk pencitraan medis dan data geospasial. +- Jika JPG Anda berasal dari kamera ponsel, kualitas Sedang biasanya menghasilkan file yang 40-60% lebih kecil daripada Tinggi tanpa perbedaan yang terlihat di layar. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [PNG ke PDF](./png-to-pdf) +- [WebP ke PDF](./webp-to-pdf) diff --git a/docs/id/tools/json-to-pdf.md b/docs/id/tools/json-to-pdf.md new file mode 100644 index 00000000..236235e4 --- /dev/null +++ b/docs/id/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON ke PDF +description: Rekonstruksi file PDF dari format JSON BentoPDF. Konversi ekspor JSON kembali ke dokumen PDF aslinya. +--- + +# JSON ke PDF + +Rekonstruksi dokumen PDF dari file JSON yang sebelumnya dibuat oleh alat **PDF ke JSON** BentoPDF. Ini adalah alat konversi bolak-balik: alat ini mengambil representasi JSON terstruktur dari sebuah PDF dan membangun kembali dokumen aslinya. + +::: warning +Alat ini hanya menerima file JSON yang dihasilkan oleh konverter PDF ke JSON BentoPDF. File JSON standar dari API, basis data, atau alat lain tidak didukung. +::: + +## Format yang Didukung + +| Input | Deskripsi | +| :------ | :----------------------------------------------------- | +| `.json` | File JSON yang diekspor oleh alat PDF ke JSON BentoPDF | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas satu atau beberapa file JSON. +2. Daftar file menampilkan setiap file yang dipilih beserta ukurannya. +3. Klik **Konversi ke PDF**. Alat ini memproses semua file menggunakan Web Worker dan mesin CPDF. +4. Hasilnya diunduh sebagai `jsons-to-pdf.zip` yang berisi satu PDF untuk setiap file JSON input. + +Konversi berjalan di Web Worker latar belakang, sehingga antarmuka tetap responsif bahkan dengan file besar. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat dikonfigurasi. Struktur JSON sepenuhnya menentukan PDF hasil. + +## Output + +Saat mengonversi beberapa file JSON, hasilnya dikirim sebagai arsip ZIP. Setiap PDF dinamai sesuai file JSON sumbernya (misalnya, `report.json` menjadi `report.pdf`). + +## Kasus Penggunaan + +- Memulihkan PDF dari cadangan berbasis JSON atau pipeline arsip +- Melakukan konversi bolak-balik PDF melalui JSON untuk inspeksi lalu kembali ke PDF +- Membangun ulang dokumen setelah modifikasi struktur JSON secara terprogram +- Memverifikasi bahwa ekspor PDF ke JSON menangkap seluruh isi dokumen dengan mengonversinya kembali + +## Tips + +- Jika Anda perlu mengonversi data JSON sembarang (seperti respons API atau file konfigurasi) menjadi PDF yang terformat, alat [Teks ke PDF](./txt-to-pdf) lebih cocok. Tempel JSON sebagai teks dan akan dirender dengan format yang tepat. +- Mesin WebAssembly CPDF harus tersedia agar alat ini berfungsi. Instans yang dihosting sendiri memerlukan file WASM CPDF yang sudah dikonfigurasi. + +## Alat Terkait + +- [Teks ke PDF](./txt-to-pdf) +- [Markdown ke PDF](./markdown-to-pdf) +- [CSV ke PDF](./csv-to-pdf) diff --git a/docs/id/tools/linearize-pdf.md b/docs/id/tools/linearize-pdf.md new file mode 100644 index 00000000..9a1884c5 --- /dev/null +++ b/docs/id/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linierisasi PDF +description: Optimalkan file PDF untuk penayangan web yang cepat dengan pemuatan progresif. Juga dikenal sebagai optimasi "Fast Web View". +--- + +# Linierisasi PDF + +Linierisasi menyusun ulang struktur PDF sehingga halaman pertama dapat ditampilkan sebelum seluruh file selesai diunduh. Adobe menyebutnya "Fast Web View". Jika Anda menghosting PDF di situs web atau menyajikannya melalui portal dokumen, linierisasi membuatnya terasa jauh lebih cepat dibuka. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. +2. Klik **Linierisasi PDF**. +3. Unduh hasilnya sebagai arsip ZIP yang berisi semua file yang telah dilinierisasi. + +Tidak ada pengaturan yang perlu dikonfigurasi. Alat ini menggunakan flag `--linearize` dari QPDF, yang menyusun ulang struktur internal PDF tanpa mengubah konten visualnya. + +## Yang Dilakukan Linierisasi + +- Menyusun ulang objek PDF sehingga data halaman pertama berada di awal file +- Menambahkan kamus linierisasi dan tabel petunjuk agar penampil tahu di mana menemukan setiap halaman +- Mengaktifkan permintaan byte-range: browser dapat mengambil halaman pertama saja tanpa mengunduh seluruh file +- Merapikan tabel referensi silang untuk akses acak yang efisien + +## Fitur + +- Pemrosesan batch beberapa PDF dalam satu operasi +- Output mempertahankan semua konten, font, gambar, dan elemen interaktif +- Menggunakan QPDF (WebAssembly) untuk linierisasi yang andal dan sesuai standar +- Hasil dikemas dalam ZIP agar mudah diunduh + +## Kasus Penggunaan + +- Menghosting laporan PDF di situs web yang pengunjungnya mengharapkan halaman tampil seketika +- Menyematkan PDF di aplikasi web dengan penampil di dalam browser +- Menerbitkan katalog atau manual PDF yang diakses melalui koneksi seluler yang lambat +- Menyiapkan dokumen untuk content delivery network (CDN) yang mendukung penyajian byte-range + +## Tips + +- Lakukan linierisasi setelah semua pengeditan lain selesai. Modifikasi apa pun setelahnya (menggabungkan, menambah halaman) akan merusak linierisasi. +- Kombinasikan dengan Kompres PDF untuk PDF terkecil dan tercepat dimuat. +- Linierisasi menambah sedikit overhead pada ukuran file (biasanya di bawah 1%). + +## Alat Terkait + +- [Kompres PDF](./compress-pdf): kurangi ukuran file sebelum linierisasi +- [Perbaiki PDF](./repair-pdf): perbaiki masalah struktural yang menghalangi linierisasi +- [Hapus Metadata](./remove-metadata): hapus metadata sebelum dipublikasikan secara online diff --git a/docs/id/tools/markdown-to-pdf.md b/docs/id/tools/markdown-to-pdf.md new file mode 100644 index 00000000..4223a894 --- /dev/null +++ b/docs/id/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown ke PDF +description: Tulis atau tempel Markdown dan ekspor sebagai PDF berformat profesional dengan pratinjau langsung dan penyorotan sintaks. +--- + +# Markdown ke PDF + +Editor Markdown lengkap dengan pratinjau langsung dan ekspor PDF satu klik. Tulis dari awal, unggah file `.md` yang ada, atau tempel konten dari clipboard. Editor merender Markdown Anda secara real time dan mengekspor PDF bergaya menggunakan mesin cetak bawaan browser. + +## Format yang Didukung + +| Input | Deskripsi | +| :------------- | :--------------------------- | +| File `.md` | Unggah melalui tombol Unggah | +| Input langsung | Ketik atau tempel ke editor | + +## Cara Kerja + +1. Buka alat Markdown ke PDF. Editor dimuat dengan tampilan terbagi: sumber Markdown di kiri, pratinjau hasil render di kanan. +2. Tulis Markdown Anda, tempel, atau klik **Unggah** untuk memuat file `.md`. +3. Beralih antara tema terang dan gelap menggunakan penggeser tema di toolbar. +4. Klik **Ekspor PDF** (atau tekan `Ctrl/Cmd + S`) untuk membuat PDF melalui dialog cetak browser. + +## Fitur + +Editor mendukung serangkaian fitur Markdown yang luas di luar dasar-dasarnya: + +- **Markdown standar**: judul, tebal, miring, tautan, gambar, daftar, kutipan blok, garis horizontal +- **Blok kode** dengan penyorotan sintaks untuk 15+ bahasa (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash, dan lainnya) +- **Diagram Mermaid**: flowchart, diagram urutan, diagram ER, dan jenis bagan Mermaid lainnya dirender langsung di pratinjau +- **Tabel** dengan sintaks tabel Markdown standar +- **Daftar tugas** dengan kotak centang +- **Catatan kaki**, **subskrip**, **superskrip** +- **Daftar definisi**, **singkatan** +- Dukungan **Emoji** (`:smile:` dirender sebagai emoji) +- **Sorotan** (`==marked text==`) dan **sisipan** (`++inserted text++`) +- **URL tertaut otomatis**: URL biasa diubah menjadi tautan yang dapat diklik +- Pembuatan **daftar isi** +- **Tautan anchor** pada judul + +## Kasus Penggunaan + +- Menulis dokumentasi proyek dan mengekspor PDF yang rapi untuk pemangku kepentingan +- Membuat laporan teknis dengan contoh kode dan diagram arsitektur Mermaid +- Mengonversi README GitHub menjadi PDF untuk penggunaan offline atau pencetakan +- Menyusun proposal atau spesifikasi dengan daftar tugas dan tabel +- Membuat handout bergaya dari catatan kuliah yang ditulis dalam Markdown + +## Tips + +- Output PDF menggunakan fungsi cetak-ke-PDF browser. Di Chrome, Anda dapat menyesuaikan margin dan skala di dialog cetak sebelum menyimpan. +- Diagram Mermaid dirender di pratinjau tetapi mungkin memerlukan waktu sebentar untuk diinisialisasi pada penggunaan pertama. +- Gunakan `Ctrl/Cmd + S` sebagai pintasan keyboard untuk mengekspor tanpa perlu menekan tombol. + +## Alat Terkait + +- [Teks ke PDF](./txt-to-pdf) +- [Word ke PDF](./word-to-pdf) +- [JSON ke PDF](./json-to-pdf) diff --git a/docs/id/tools/merge-pdf.md b/docs/id/tools/merge-pdf.md new file mode 100644 index 00000000..4617a84c --- /dev/null +++ b/docs/id/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Gabung PDF +description: Gabungkan beberapa file PDF menjadi satu dokumen dengan pengurutan seret dan lepas serta kontrol tingkat halaman. +--- + +# Gabung PDF + +Gabungkan beberapa file PDF menjadi satu dokumen. Anda dapat menggabungkan seluruh file dalam urutan tertentu, atau beralih ke Mode Halaman untuk kontrol terperinci atas setiap halaman dari semua PDF yang diunggah. + +## Cara Kerja + +1. Unggah dua atau lebih file PDF dengan mengklik area lepas atau menyeretnya ke dalamnya. +2. Pilih antara **Mode File** dan **Mode Halaman** menggunakan sakelar di bagian atas. +3. Di Mode File, seret file untuk mengubah urutan dan secara opsional tentukan rentang halaman (misalnya `1-3, 5`) untuk setiap file. Biarkan rentang kosong untuk menyertakan semua halaman. +4. Di Mode Halaman, seret dan lepas thumbnail halaman satu per satu untuk menyusun urutan halaman yang Anda inginkan. +5. Klik **Gabung PDF** untuk menggabungkan semuanya menjadi satu file. PDF hasil gabungan diunduh secara otomatis. + +## Fitur + +- Dua mode penggabungan: Mode File untuk menggabungkan seluruh file dengan cepat, Mode Halaman untuk kontrol per halaman +- Pengurutan seret dan lepas di kedua mode dengan animasi yang mulus +- Sintaks rentang halaman (misalnya `1-3, 5, 8-10`) memungkinkan Anda memilih halaman tanpa beralih ke Mode Halaman +- Thumbnail halaman yang dimuat bertahap menjaga antarmuka tetap responsif bahkan dengan dokumen besar +- Tidak ada batas jumlah file atau total halaman +- Mempertahankan kualitas PDF asli tanpa pengodean ulang + +## Opsi + +| Opsi | Deskripsi | +| ----------------- | -------------------------------------------------------------------------------------------------- | +| **Mode File** | Gabungkan seluruh file dalam urutan kustom, dengan filter rentang halaman opsional per file | +| **Mode Halaman** | Kisi visual semua halaman dari semua file: seret thumbnail untuk menyusun urutan Anda | +| **Input halaman** | Kolom teks per file yang menerima rentang seperti `1-3, 5` untuk menyertakan halaman tertentu saja | + +## Kasus Penggunaan + +- Menggabungkan PDF bab terpisah menjadi satu buku atau laporan +- Menggabungkan surat lamaran dan resume menjadi satu dokumen lamaran +- Mengambil halaman tertentu dari beberapa dokumen sumber ke dalam satu file gabungan +- Menyusun struk atau faktur hasil pindai menjadi satu PDF arsip +- Membuat handout presentasi dari slide di beberapa deck + +## Tips + +- Gunakan Mode Halaman saat Anda perlu menyisipkan halaman dari file berbeda secara selang-seling, bukan menambahkan satu file setelah file lainnya. +- Anda dapat menambahkan file setelah unggahan awal menggunakan tombol **Tambah File Lagi** tanpa kehilangan susunan saat ini. +- Rentang halaman dimulai dari 1, jadi `1` merujuk ke halaman pertama file tersebut. + +## Alat Terkait + +- [Pisah PDF](./split-pdf) +- [Duplikat & Atur](./organize-pdf) +- [Alternatif & Campur Halaman](./alternate-merge) +- [Hapus Halaman](./delete-pages) diff --git a/docs/id/tools/mobi-to-pdf.md b/docs/id/tools/mobi-to-pdf.md new file mode 100644 index 00000000..1b5cb7fe --- /dev/null +++ b/docs/id/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI ke PDF +description: Konversi file ebook MOBI ke PDF langsung di browser Anda. Gratis, privat, tanpa unggah file. +--- + +# MOBI ke PDF + +Konversi ebook Amazon Kindle MOBI menjadi dokumen PDF. File MOBI terikat pada perangkat dan aplikasi Kindle sehingga sulit dibaca di tempat lain. Mengonversinya ke PDF memberi Anda versi portabel yang dapat dibuka di perangkat apa pun atau dicetak. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----- | :------- | :------------------------------- | +| MOBI | `.mobi` | Format ebook Kindle (Mobipocket) | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas satu atau beberapa file MOBI. +2. Periksa daftar file. Hapus file yang tidak diinginkan dengan ikon tempat sampah, atau gunakan **Tambah File Lagi** untuk menyertakan ebook tambahan. +3. Klik **Konversi ke PDF**. Mesin PyMuPDF mengurai struktur MOBI dan merender setiap halaman sebagai konten PDF. +4. Satu file diunduh sebagai PDF. Saat mengonversi beberapa file, Anda mendapatkan arsip ZIP bernama `mobi-converted.zip`. + +## Opsi + +Tidak diperlukan pengaturan tambahan. Konversi mempertahankan isi teks, pemformatan, dan gambar tertanam dari file MOBI asli. + +## Kasus Penggunaan + +- Membaca konten yang dibeli di Kindle pada e-reader non-Kindle yang hanya mendukung PDF +- Mencetak bab dari ebook untuk belajar atau memberi anotasi secara offline +- Mengarsipkan pustaka ebook pribadi Anda dalam format universal +- Membagikan kutipan kepada orang yang tidak memasang aplikasi Kindle + +## Tips + +- File MOBI yang dilindungi DRM tidak dapat dikonversi. Alat ini hanya bekerja dengan file MOBI bebas DRM. +- Ebook besar dengan banyak gambar tertanam mungkin membutuhkan beberapa detik lebih lama karena semuanya diproses di browser. + +## Alat Terkait + +- [EPUB ke PDF](./epub-to-pdf) +- [FB2 ke PDF](./fb2-to-pdf) +- [CBZ ke PDF](./cbz-to-pdf) diff --git a/docs/id/tools/n-up-pdf.md b/docs/id/tools/n-up-pdf.md new file mode 100644 index 00000000..5c6613eb --- /dev/null +++ b/docs/id/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Susun beberapa halaman PDF dalam satu lembar dengan tata letak kisi untuk pencetakan yang ringkas. +--- + +# N-Up PDF + +Tempatkan beberapa halaman dalam satu lembar dengan susunan kisi. Ini mengurangi jumlah halaman yang dicetak dengan memuat 2, 4, 6, 8, 9, atau 16 halaman per lembar. Alat ini menangani penskalaan, penempatan, dan konfigurasi ukuran halaman opsional. + +## Cara Kerja + +1. Unggah file PDF. +2. Pilih jumlah halaman per lembar (nilai "N"): 2, 4, 6, 8, 9, atau 16. +3. Pilih ukuran halaman output (default A4) dan orientasi. +4. Secara opsional atur jarak, warna garis tepi, dan warna latar belakang. +5. Klik tombol proses. Alat ini menskalakan setiap halaman dan menyusunnya pada lembar baru. + +## Fitur + +- Tata letak kisi: 2-up, 4-up, 6-up, 8-up, 9-up, dan 16-up +- Ukuran halaman dan orientasi output yang dapat dikonfigurasi +- Jarak opsional antarhalaman yang disusun +- Pengaturan warna latar belakang dan garis tepi +- Mempertahankan rasio aspek halaman asli saat menskalakan agar pas + +## Opsi + +| Opsi | Deskripsi | +| ------------------------ | ------------------------------------------------------------------------------ | +| **Halaman per lembar** | Jumlah halaman asli yang dimuat pada setiap halaman output (2, 4, 6, 8, 9, 16) | +| **Ukuran halaman** | Ukuran lembar output (A4, Letter, Legal, dll.) | +| **Orientasi** | Potret atau Lanskap untuk lembar output | +| **Jarak** | Celah dalam poin antarhalaman yang disusun | +| **Warna latar belakang** | Warna isian untuk latar belakang lembar output | +| **Warna garis tepi** | Warna untuk garis tepi di sekeliling setiap halaman yang disusun | + +## Kasus Penggunaan + +- Mencetak handout dengan 4 slide per halaman untuk menghemat kertas +- Membuat lembar belajar dengan beberapa halaman referensi dalam satu lembar +- Menghasilkan arsip dokumen yang ringkas untuk penyimpanan berkas +- Membuat lembar ikhtisar thumbnail dari dokumen yang panjang + +## Tips + +- Orientasi lanskap sering bekerja lebih baik untuk tata letak 2-up, sedangkan potret biasanya terbaik untuk 4-up ke atas. +- Menambah jarak membantu keterbacaan tetapi mengurangi area yang tersedia untuk setiap halaman yang disusun. +- Untuk operasi sebaliknya (memecah satu halaman menjadi beberapa), lihat [Posterisasi PDF](./posterize-pdf). + +## Alat Terkait + +- [Posterisasi PDF](./posterize-pdf) +- [Buku Kecil PDF](./pdf-booklet) +- [Gabung ke Halaman Tunggal](./combine-single-page) diff --git a/docs/id/tools/ocr-pdf.md b/docs/id/tools/ocr-pdf.md new file mode 100644 index 00000000..c64a0703 --- /dev/null +++ b/docs/id/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Buat PDF hasil pindai dapat dicari dan disalin menggunakan Tesseract OCR dengan dukungan multibahasa dan penyaringan karakter. +--- + +# OCR PDF + +Ubah dokumen hasil pindai menjadi PDF yang dapat dicari dan disalin. Alat ini menggunakan Tesseract OCR untuk mengenali teks pada gambar dan menempatkan lapisan teks tak terlihat di atas halaman asli, sehingga tampilan visualnya tetap terjaga sementara kontennya sepenuhnya dapat dicari. + +## Cara Kerja + +1. Unggah PDF hasil pindai atau PDF berbasis gambar. +2. Pilih satu atau beberapa bahasa yang ada dalam dokumen dari daftar bahasa yang dapat dicari. +3. Secara opsional sesuaikan pengaturan lanjutan (resolusi, binarisasi, daftar putih). +4. Klik **Mulai OCR** dan pantau kemajuan pada bilah kemajuan real-time. +5. Setelah selesai, periksa teks yang diekstrak, lalu unduh PDF yang dapat dicari atau file `.txt` biasa. + +## Fitur + +- OCR multibahasa dengan pemilih bahasa yang dapat dicari +- Lapisan teks tak terlihat mempertahankan tampilan dokumen asli +- Bilah kemajuan real-time dan keluaran log selama pemrosesan +- Unduh hasil sebagai PDF yang dapat dicari atau file teks biasa +- Salin teks yang diekstrak langsung ke clipboard +- Tiga tingkat resolusi untuk menyeimbangkan kecepatan dan akurasi + +## Opsi + +| Pengaturan | Nilai | Default | Tujuan | +| -------------------------------- | --------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------ | +| **Resolusi** | Standar (192 DPI), Tinggi (288 DPI), Ultra (384 DPI) | Tinggi | Resolusi lebih tinggi meningkatkan akurasi pada teks kecil tetapi lebih lama | +| **Binarisasi Gambar** | Aktif / Nonaktif | Nonaktif | Meningkatkan kontras untuk hasil pindai yang bersih dengan mengubahnya menjadi hitam putih | +| **Preset Daftar Putih Karakter** | Tidak Ada, Alfanumerik, Angka + Mata Uang, Hanya Huruf, Hanya Angka, Faktur, Formulir, Kustom | Tidak Ada | Membatasi karakter yang dikenali untuk meningkatkan akurasi pada jenis dokumen tertentu | +| **Daftar Putih Karakter** | Teks bebas | Kosong | Kumpulan karakter manual saat preset diatur ke Kustom | + +## Kasus Penggunaan + +- Membuat kontrak dan faktur hasil pindai dapat dicari sehingga Anda bisa menggunakan Ctrl+F di dalamnya +- Mengekstrak teks dari dokumen hasil foto atau arsip kertas lama +- Memproses struk dengan preset Faktur untuk menangkap jumlah uang dan tanggal secara akurat +- Membuat PDF yang aksesibel dari hasil pindai berupa gambar saja untuk kebutuhan kepatuhan +- Mengekstrak isi teks secara massal dari buku atau manual hasil pindai + +## Tips + +- Pilih beberapa bahasa jika dokumen Anda berisi konten campuran bahasa (misalnya, judul bahasa Inggris dengan isi bahasa Jepang). +- Gunakan opsi binarisasi untuk dokumen dengan teks pudar atau berkontras rendah: ini dapat meningkatkan akurasi pengenalan secara signifikan. +- Preset daftar putih Faktur dan Formulir sangat mengurangi positif palsu pada dokumen terstruktur dengan mengabaikan bentuk karakter yang tidak relevan. + +## Alat Terkait + +- [Ekstrak Tabel PDF](./extract-tables) +- [Gabung PDF](./merge-pdf) +- [Kompres PDF](./compress-pdf) diff --git a/docs/id/tools/odg-to-pdf.md b/docs/id/tools/odg-to-pdf.md new file mode 100644 index 00000000..a4f3739d --- /dev/null +++ b/docs/id/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG ke PDF +description: Konversi file LibreOffice Draw (ODG) ke PDF di browser Anda. Gratis, tanpa unggah, sepenuhnya privat. +--- + +# ODG ke PDF + +Konversi file OpenDocument Graphics menjadi PDF. ODG adalah format asli LibreOffice Draw dan digunakan untuk diagram, flowchart, dan ilustrasi vektor. Mengonversinya ke PDF membuat gambar-gambar ini mudah dibagikan, dicetak, dan disematkan di dokumen lain. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :-------------------- | :------- | :-------------------------------------- | +| OpenDocument Graphics | `.odg` | File LibreOffice Draw / OpenOffice Draw | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file ODG Anda. Beberapa file dapat ditambahkan sekaligus. +2. Periksa daftar file. Hapus entri tertentu dengan ikon tempat sampah, atau klik **Tambah File Lagi** untuk menambah gambar. +3. Klik **Konversi ke PDF**. Mesin berbasis LibreOffice dimuat di browser dan mengonversi setiap file ODG, dengan mempertahankan grafik vektor, bentuk, dan teks. +4. Satu file langsung diunduh sebagai PDF. Beberapa file menghasilkan arsip ZIP bernama `odg-to-pdf.zip`. + +## Opsi + +Tidak diperlukan pengaturan tambahan. Konversi mempertahankan dimensi halaman, bentuk, konektor, dan kotak teks asli dari sumber ODG. + +## Kasus Penggunaan + +- Membagikan diagram LibreOffice Draw kepada klien yang tidak memasang LibreOffice +- Mencetak flowchart dan diagram jaringan yang dibuat di Draw +- Menyertakan ilustrasi ODG dalam laporan atau presentasi sebagai PDF tersemat +- Mengarsipkan gambar teknis dalam format yang tetap terbaca selama puluhan tahun + +## Tips + +- Elemen vektor tetap berupa vektor di output PDF, sehingga hasilnya dapat diskalakan dengan bersih ke ukuran cetak apa pun. +- Mesin LibreOffice membutuhkan waktu sebentar untuk diinisialisasi pada penggunaan pertama. Konversi berikutnya dalam sesi yang sama lebih cepat. + +## Alat Terkait + +- [ODS ke PDF](./ods-to-pdf) +- [ODP ke PDF](./odp-to-pdf) +- [VSD ke PDF](./vsd-to-pdf) diff --git a/docs/id/tools/odp-to-pdf.md b/docs/id/tools/odp-to-pdf.md new file mode 100644 index 00000000..736f937c --- /dev/null +++ b/docs/id/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP ke PDF +description: Konversi presentasi LibreOffice Impress (ODP) ke PDF di browser Anda. Gratis, privat, tanpa unggah. +--- + +# ODP ke PDF + +Konversi file OpenDocument Presentation menjadi PDF. ODP adalah format asli LibreOffice Impress dan ekspor standar dari Google Slides. Mengubah presentasi menjadi PDF berarti siapa pun dapat melihatnya tanpa perangkat lunak presentasi, dan slide tercetak dengan rapi. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :------------------------ | :------- | :----------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / ekspor Google Slides | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file ODP Anda. Anda dapat memilih beberapa presentasi sekaligus. +2. Periksa daftar file. Hapus entri dengan ikon tempat sampah, atau gunakan **Tambah File Lagi** untuk menyertakan presentasi tambahan. +3. Klik **Konversi ke PDF**. Mesin berbasis LibreOffice memproses setiap presentasi dan menghasilkan PDF di mana setiap slide menjadi satu halaman. +4. Satu file diunduh sebagai PDF. Beberapa file dikirim dalam arsip ZIP bernama `odp-to-pdf.zip`. + +## Opsi + +Tidak ada pengaturan yang perlu dikonfigurasi. Setiap slide dirender pada dimensi aslinya, dengan mempertahankan teks, gambar, bentuk, dan latar belakang slide. + +## Kasus Penggunaan + +- Membagikan presentasi kepada audiens sebagai PDF handout +- Membagikan ekspor Google Slides kepada orang yang lebih suka PDF daripada ODP +- Mengarsipkan presentasi konferensi dan kuliah dalam format hanya-baca +- Mencetak slide deck untuk lokakarya tatap muka + +## Tips + +- Transisi dan animasi slide adalah fitur visual yang tidak terbawa ke PDF, tetapi semua konten statis dirender dengan benar. +- Catatan pembicara tidak disertakan dalam output PDF. Jika Anda memerlukan catatan, ekspor secara terpisah dari perangkat lunak presentasi Anda. +- Seperti alat berbasis LibreOffice lainnya, mesin dimuat pada penggunaan pertama dan tetap tersimpan di cache selama sesi. + +## Alat Terkait + +- [ODG ke PDF](./odg-to-pdf) +- [ODS ke PDF](./ods-to-pdf) +- [PUB ke PDF](./pub-to-pdf) diff --git a/docs/id/tools/ods-to-pdf.md b/docs/id/tools/ods-to-pdf.md new file mode 100644 index 00000000..c2f8473f --- /dev/null +++ b/docs/id/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS ke PDF +description: Konversi spreadsheet LibreOffice Calc (ODS) ke PDF di browser Anda. Gratis, privat, tanpa pendaftaran. +--- + +# ODS ke PDF + +Konversi file OpenDocument Spreadsheet menjadi PDF. ODS adalah format asli LibreOffice Calc dan format ekspor umum dari Google Sheets. Alat ini merender data, format, dan grafik spreadsheet Anda menjadi PDF berhalaman yang bisa dicetak atau dibagikan. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----------------------- | :------- | :-------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Ekspor LibreOffice Calc / Google Sheets | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file ODS Anda. Beberapa file sekaligus didukung. +2. Periksa daftar file. Gunakan ikon tempat sampah untuk menghapus file, atau klik **Tambah File Lagi** untuk memperbesar batch. +3. Klik **Konversi ke PDF**. Engine berbasis LibreOffice dimuat di browser dan merender setiap spreadsheet menjadi halaman PDF. +4. Satu spreadsheet diunduh sebagai PDF. Beberapa file dikemas menjadi `ods-to-pdf.zip`. + +## Opsi + +Tidak diperlukan konfigurasi. Konverter menerapkan tata letak cetak, format sel, dan lebar kolom yang sudah ada pada spreadsheet ke hasil PDF. + +## Kasus Penggunaan + +- Membagikan anggaran atau laporan LibreOffice Calc kepada orang yang hanya menerima PDF +- Mencetak ekspor Google Sheets yang diunduh sebagai ODS +- Mengarsipkan catatan keuangan dalam format yang tidak dapat diedit +- Mengirim formulir atau lembar waktu berbasis ODS sebagai dokumen dengan tata letak tetap + +## Tips + +- Jika spreadsheet Anda memiliki beberapa lembar, semua lembar disertakan dalam hasil PDF. +- Spreadsheet yang sangat lebar dapat terbagi ke beberapa halaman PDF secara horizontal. Pertimbangkan menyesuaikan lebar kolom di file sumber sebelum konversi jika tata letak penting. +- Engine LibreOffice diinisialisasi saat pertama digunakan. Konversi berikutnya dalam sesi yang sama lebih cepat. + +## Alat Terkait + +- [ODG ke PDF](./odg-to-pdf) +- [ODP ke PDF](./odp-to-pdf) +- [XML ke PDF](./xml-to-pdf) diff --git a/docs/id/tools/odt-to-pdf.md b/docs/id/tools/odt-to-pdf.md new file mode 100644 index 00000000..49a13a58 --- /dev/null +++ b/docs/id/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT ke PDF +description: Konversi file OpenDocument Text (ODT) ke format PDF di browser Anda menggunakan engine berbasis LibreOffice. +--- + +# ODT ke PDF + +Konversi file OpenDocument Text menjadi PDF. ODT adalah format asli LibreOffice Writer, Apache OpenOffice, dan pengolah kata sumber terbuka lainnya. Alat ini menggunakan engine LibreOffice berbasis browser untuk menghasilkan konversi akurat yang mempertahankan format, tabel, gambar, dan gaya. + +## Format yang Didukung + +| Format | Ekstensi | +| :---------------- | :------- | +| OpenDocument Text | `.odt` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas satu atau beberapa file ODT. +2. Periksa daftar file. Tambahkan file lain atau hapus yang tidak diinginkan. +3. Klik **Konversi ke PDF**. Engine LibreOffice diinisialisasi (indikator kemajuan menampilkan status pemuatan), lalu setiap file dikonversi. +4. Satu file diunduh langsung sebagai PDF. Beberapa file dikemas menjadi `odt-converted.zip`. + +## Opsi + +Alat ini tidak memiliki konfigurasi tambahan. Konversi mempertahankan format dokumen asli sedekat mungkin. + +## Hasil + +| Jumlah Input | Hasil | +| :----------- | :------------------------------------------------------- | +| 1 file | Satu PDF diunduh (mis., `document.pdf`) | +| 2+ file | Arsip ZIP (`odt-converted.zip`) berisi satu PDF per file | + +## Kasus Penggunaan + +- Mengonversi dokumen LibreOffice Writer ke PDF untuk dibagikan kepada pengguna Microsoft Office +- Membuat PDF siap cetak dari makalah akademik yang ditulis dalam format OpenDocument +- Mengonversi massal satu folder templat ODT menjadi PDF untuk distribusi +- Membuat PDF dari file ODT yang dihasilkan oleh sistem pembuatan dokumen otomatis + +## Tips + +- Engine LibreOffice dimuat saat pertama digunakan dan disimpan dalam cache untuk konversi berikutnya. Pemuatan awal memakan waktu beberapa detik; setelah itu, konversi berjalan cepat. +- Dokumen kompleks dengan objek OLE tersemat atau font tidak umum dapat dirender sedikit berbeda dari LibreOffice desktop. Uji dengan sampel sebelum konversi massal. +- Untuk dokumen Word (`.doc`, `.docx`), gunakan alat [Word ke PDF](./word-to-pdf), yang juga memakai engine LibreOffice tetapi menerima format Microsoft secara langsung. + +## Alat Terkait + +- [Word ke PDF](./word-to-pdf) +- [RTF ke PDF](./rtf-to-pdf) +- [Teks ke PDF](./txt-to-pdf) diff --git a/docs/id/tools/organize-pdf.md b/docs/id/tools/organize-pdf.md new file mode 100644 index 00000000..360bbfca --- /dev/null +++ b/docs/id/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Atur & Duplikat +description: Atur ulang urutan, duplikat, dan hapus halaman PDF dengan thumbnail seret dan lepas serta input urutan halaman kustom. +--- + +# Atur & Duplikat + +Susun ulang, duplikat, dan hapus halaman dari PDF menggunakan antarmuka visual seret dan lepas. Setiap halaman tampil sebagai thumbnail yang bisa dipindahkan, digandakan, atau dihapus sebelum hasilnya disimpan sebagai file baru. + +## Cara Kerja + +1. Unggah satu file PDF. +2. Alat ini merender kisi thumbnail yang menampilkan setiap halaman. +3. Seret thumbnail untuk mengatur ulang halaman, klik tombol duplikat hijau untuk menggandakan halaman, atau klik tombol hapus merah untuk menghapusnya. +4. Sebagai alternatif, masukkan urutan halaman kustom di kolom teks (mis., `3, 1, 2, 4`) lalu klik **Terapkan** untuk menyusun ulang semua halaman sekaligus. +5. Klik tombol proses untuk membuat dan mengunduh PDF yang sudah diatur ulang. + +## Fitur + +- Pengaturan ulang halaman dengan seret dan lepas disertai transisi animasi +- Tombol duplikat dan hapus per halaman +- Input urutan halaman kustom untuk penyusunan yang presisi +- Label nomor halaman yang diperbarui otomatis setelah setiap perubahan +- Mencegah penghapusan halaman terakhir yang tersisa + +## Kasus Penggunaan + +- Memindahkan halaman yang salah tempat ke posisi yang benar dalam laporan +- Menduplikat halaman formulir agar Anda memiliki beberapa salinan kosong dalam satu file +- Menghapus halaman draf atau placeholder sebelum dokumen dibagikan +- Membalik atau mengacak urutan halaman untuk persiapan cetak +- Membuat urutan halaman kustom tanpa menggabungkan ulang file terpisah + +## Tips + +- Kolom urutan halaman kustom menerima nomor halaman asli yang dipisahkan koma. Setiap halaman harus disertakan tepat satu kali, tanpa ada yang terlewat atau duplikat. +- Setelah menduplikat halaman, kedua salinan merujuk ke indeks halaman asli yang sama. Mengatur ulang salah satu salinan bekerja secara independen. +- Untuk operasi massal pada beberapa file atau alur kerja yang lebih lanjut, pertimbangkan [Alat Multi PDF](./pdf-multi-tool). + +## Alat Terkait + +- [Gabung PDF](./merge-pdf) +- [Hapus Halaman](./delete-pages) +- [Alat Multi PDF](./pdf-multi-tool) +- [Balik Halaman](./reverse-pages) diff --git a/docs/id/tools/page-dimensions.md b/docs/id/tools/page-dimensions.md new file mode 100644 index 00000000..dfdfda53 --- /dev/null +++ b/docs/id/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Dimensi Halaman +description: Analisis ukuran halaman PDF, orientasi, rasio aspek, dan rotasi. Deteksi dokumen berukuran campuran dan ekspor data ke CSV. +--- + +# Dimensi Halaman + +Alat diagnostik yang membaca setiap halaman di PDF Anda dan melaporkan dimensi tepatnya, orientasi, nama ukuran standar, rasio aspek, luas, dan rotasi. Berguna untuk menemukan halaman berukuran campuran sebelum mencetak atau untuk mendokumentasikan properti PDF yang Anda terima. + +## Cara Kerja + +1. Unggah file PDF. Analisis dimulai otomatis, tanpa tombol yang perlu ditekan. +2. Panel ringkasan menampilkan jumlah halaman, jumlah ukuran halaman unik, dan apakah dokumen memiliki ukuran campuran. +3. Telusuri tabel hasil lengkap dengan detail per halaman. +4. Ganti satuan tampilan antara Poin, Inci, Milimeter, atau Piksel. +5. Klik **Ekspor ke CSV** untuk menyimpan data. + +## Kolom yang Dilaporkan + +| Kolom | Deskripsi | +| -------------- | ------------------------------------------------ | +| Halaman # | Nomor halaman berurutan | +| Dimensi | Lebar x Tinggi dalam satuan yang dipilih | +| Ukuran Standar | Nama yang cocok (A4, Letter, dll.) atau "Kustom" | +| Orientasi | Potret atau Lanskap | +| Rasio Aspek | Rasio lebar terhadap tinggi dalam desimal | +| Luas | Luas halaman dalam satuan terpilih kuadrat | +| Rotasi | Rotasi halaman dalam derajat | + +## Fitur + +- Deteksi otomatis ukuran kertas standar (A3, A4, A5, Letter, Legal, Tabloid, dan lainnya) +- Peringatan dokumen berukuran campuran beserta rincian ukuran yang muncul dan jumlah halaman untuk tiap ukuran +- Konversi satuan antara poin, inci, milimeter, dan piksel (pada 96 PPI) +- Ekspor CSV untuk digunakan di spreadsheet atau sistem dokumentasi + +## Kasus Penggunaan + +- Memastikan semua halaman berukuran A4 sebelum mengirim dokumen ke percetakan +- Mendiagnosis mengapa PDF gabungan tercetak dengan margin tak terduga pada halaman tertentu +- Mendokumentasikan tata letak halaman arsip PDF besar untuk catatan metadata +- Mengidentifikasi halaman terputar yang perlu dikoreksi + +## Tips + +- Jika ringkasan menunjukkan "Ukuran Campuran", gunakan alat Perbaiki Ukuran Halaman untuk menyeragamkan sebelum mencetak. +- Kolom rotasi membantu mengidentifikasi halaman yang tampil benar tetapi memiliki atribut rotasi bukan nol, yang dapat menimbulkan masalah di beberapa alur kerja. + +## Alat Terkait + +- [Perbaiki Ukuran Halaman](./fix-page-size): seragamkan halaman setelah menemukan ukuran campuran +- [Kompres PDF](./compress-pdf): optimalkan PDF setelah memperbaiki masalah halaman +- [Putar PDF](./rotate-pdf): koreksi halaman yang terputar diff --git a/docs/id/tools/page-numbers.md b/docs/id/tools/page-numbers.md new file mode 100644 index 00000000..1e4da2d2 --- /dev/null +++ b/docs/id/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Nomor Halaman +description: Tambahkan nomor halaman yang dapat disesuaikan di posisi mana pun pada halaman PDF Anda dengan font, ukuran, dan warna yang dapat diatur. +--- + +# Nomor Halaman + +Tambahkan nomor halaman yang terlihat pada setiap halaman PDF Anda. Anda memilih posisi, format, ukuran font, dan warna, sisanya ditangani alat ini. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Atur pengaturan nomor halaman di panel opsi yang muncul. +3. Klik **Tambah Nomor Halaman** untuk memproses. +4. PDF bernomor diunduh secara otomatis. + +## Opsi + +- **Posisi**: Pilih tempat nomor halaman muncul: Bawah Tengah, Bawah Kiri, Bawah Kanan, Atas Tengah, Atas Kiri, atau Atas Kanan. +- **Format**: Pilih antara penomoran sederhana (1, 2, 3...) atau format "halaman X dari Y" (1 / 5, 2 / 5...). +- **Ukuran Font**: Atur ukuran teks nomor halaman. Default 12. +- **Warna**: Pilih warna apa pun untuk teks nomor halaman menggunakan pemilih warna. + +## Fitur + +- Enam pilihan posisi yang mencakup semua sudut dan posisi tengah +- Dua format penomoran: berurutan sederhana atau "halaman X dari Y" +- Ukuran font dapat diatur dari 6 hingga 72 poin +- Pemilih warna penuh untuk warna teks +- Penanganan margin otomatis yang menjaga nomor tetap di area aman pada ukuran halaman apa pun + +## Kasus Penggunaan + +- Menyiapkan dokumen cetak yang memerlukan rujukan halaman yang terlihat +- Menambahkan nomor halaman pada PDF gabungan dari beberapa file sumber +- Menomori handout presentasi sebelum dibagikan +- Menambahkan penomoran berurutan pada dokumen hukum atau kontrak + +## Tips + +- Format "halaman X dari Y" berguna untuk dokumen yang pembacanya perlu tahu total panjangnya, seperti proposal atau laporan. +- Jika Anda memerlukan gaya penomoran berbeda untuk bagian berbeda (seperti angka Romawi untuk bagian awal), gunakan alat [Tambahkan label halaman](./add-page-labels). + +## Alat Terkait + +- [Tambahkan label halaman](./add-page-labels) +- [Penomoran Bates](./bates-numbering) +- [Kepala & Kaki Halaman](./header-footer) diff --git a/docs/id/tools/pdf-booklet.md b/docs/id/tools/pdf-booklet.md new file mode 100644 index 00000000..18c61e34 --- /dev/null +++ b/docs/id/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Buku Kecil PDF +description: Susun ulang halaman PDF ke urutan buklet (saddle-stitch) untuk dilipat dan dijilid menjadi buklet fisik. +--- + +# Buku Kecil PDF + +Susun ulang halaman PDF ke urutan imposisi buklet. Saat dicetak bolak-balik dan dilipat dua, halaman akan berada dalam urutan baca yang benar. Ini adalah tata letak yang digunakan untuk buklet saddle-stitch dan zine. + +## Cara Kerja + +1. Unggah file PDF. +2. Atur pengaturan buklet: ukuran halaman dan orientasi hasil. +3. Klik **Buat Pratinjau** untuk melihat bagaimana halaman akan disusun di setiap lembar. +4. Periksa pratinjau, yang menampilkan setiap lembar fisik beserta penempatan halaman depan dan belakangnya. +5. Klik **Unduh** untuk menyimpan PDF hasil imposisi buklet. + +## Fitur + +- Pengurutan ulang halaman otomatis untuk penjilidan saddle-stitch +- Ukuran halaman hasil yang dapat diatur +- Pratinjau visual tata letak buklet sebelum mengunduh +- Menangani jumlah halaman ganjil dengan menyisipkan halaman kosong bila perlu +- Menyesuaikan skala halaman sumber agar pas dengan ukuran lembar buklet + +## Kasus Penggunaan + +- Membuat buklet atau zine yang bisa dicetak dari PDF biasa +- Menyiapkan program konferensi atau panduan acara untuk dicetak sendiri +- Membuat kartu ucapan lipat atau katalog kecil +- Menghasilkan chapbook atau kumpulan puisi untuk dijilid manual + +## Tips + +- Jumlah halaman PDF sumber idealnya kelipatan 4 agar buklet rapi. Jika tidak, halaman kosong ditambahkan otomatis untuk melengkapi lembar terakhir. +- Cetak hasilnya bolak-balik dengan pengaturan printer "balik pada tepi pendek" (flip on short edge), lalu lipat semua lembar bersama dan jepret di punggung buklet. +- Untuk sekadar menempatkan beberapa halaman dalam satu lembar tanpa urutan buklet, gunakan [N-Up PDF](./n-up-pdf). + +## Alat Terkait + +- [N-Up PDF](./n-up-pdf) +- [Putar PDF](./rotate-pdf) +- [Tambah Halaman Kosong](./add-blank-page) diff --git a/docs/id/tools/pdf-layers.md b/docs/id/tools/pdf-layers.md new file mode 100644 index 00000000..e2903183 --- /dev/null +++ b/docs/id/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Layer OCG PDF +description: Lihat, alihkan, tambah, dan hapus layer Optional Content Group (OCG) dalam dokumen PDF. +--- + +# Layer OCG PDF + +Kelola Optional Content Group (OCG), yang umum disebut "layer", di dalam PDF. Anda dapat mengalihkan visibilitas layer, menambah layer baru (termasuk layer anak bertingkat), menghapus layer, dan menyimpan PDF yang telah diubah. + +## Cara Kerja + +1. Unggah file PDF. +2. Klik tombol proses untuk memuat dokumen dengan engine PyMuPDF. +3. Alat ini menampilkan semua layer yang ada beserta status visibilitas, status kunci, dan hierarki bertingkatnya. +4. Centang atau hapus centang kotak untuk menampilkan atau menyembunyikan layer. Layer terkunci tidak dapat dialihkan. +5. Tambahkan layer tingkat atas dengan mengetik nama lalu mengklik tombol tambah, atau tambahkan layer anak di bawah induk yang ada. +6. Hapus layer yang tidak lagi Anda perlukan. +7. Klik **Simpan** untuk mengunduh PDF yang telah diubah dengan perubahan layer Anda. + +## Fitur + +- Menampilkan hierarki layer dengan indentasi yang tepat untuk layer bertingkat +- Mengalihkan visibilitas layer +- Indikator layer terkunci mencegah perubahan tidak sengaja +- Menambah layer tingkat atas atau layer anak dengan nama kustom +- Menghapus layer satu per satu +- Menyimpan semua perubahan ke file PDF baru + +## Kasus Penggunaan + +- Mengalihkan visibilitas layer markup pada gambar arsitektur atau teknik +- Menambah layer anotasi baru pada dokumen desain multi-layer +- Menghapus layer usang dari templat sebelum didistribusikan +- Memeriksa layer apa saja yang ada dalam PDF kompleks dari pihak ketiga + +## Tips + +- Jika PDF tidak memiliki layer, alat ini menampilkan tampilan kosong dengan ajakan untuk menambahkan satu. Tidak semua PDF menggunakan layer OCG, layer paling umum ada pada ekspor CAD dan file desain. +- Layer anak ditampilkan menjorok di bawah induknya. Anda dapat menumpuk layer hingga kedalaman berapa pun. +- Layer terkunci ditampilkan dengan ikon kunci dan kotak centangnya dinonaktifkan. Kunci ini diatur oleh pembuat PDF. + +## Alat Terkait + +- [Lihat Metadata](./view-metadata) +- [Edit Metadata](./edit-metadata) +- [Atur & Duplikat](./organize-pdf) diff --git a/docs/id/tools/pdf-multi-tool.md b/docs/id/tools/pdf-multi-tool.md new file mode 100644 index 00000000..2189ca31 --- /dev/null +++ b/docs/id/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Alat Multi PDF +description: Pengelola halaman serba guna untuk menggabung, memisah, memutar, menduplikat, menghapus, dan mengatur ulang halaman PDF. +--- + +# Alat Multi PDF + +Ruang kerja terpadu untuk setiap operasi tingkat halaman PDF. Unggah satu atau beberapa PDF dan kerjakan semua halamannya dalam satu kisi visual. Putar, atur ulang, duplikat, hapus, sisipkan PDF baru, tambah halaman kosong, dan pisahkan hasilnya, semuanya tanpa meninggalkan alat ini. + +## Cara Kerja + +1. Klik **Unggah PDF** atau seret file ke area unggah. Beberapa file didukung. +2. Semua halaman dari setiap file yang diunggah tampil dalam kisi yang bisa digulir dengan thumbnail. +3. Gunakan toolbar atau tombol aksi per halaman untuk memanipulasi halaman. +4. Pilih halaman dengan kotak centang pada setiap kartu, lalu terapkan operasi massal. +5. Tandai titik pisah dengan ikon gunting untuk membagi hasil menjadi file terpisah. +6. Klik **Ekspor PDF** untuk mengunduh hasil akhir. Jika ada penanda pisah, hasilnya berupa ZIP berisi beberapa PDF. + +## Fitur + +- **Gabung**: Unggah beberapa PDF dan semuanya otomatis digabung dalam satu ruang kerja +- **Atur ulang**: Seret dan lepas kartu halaman untuk menyusun ulang urutan +- **Putar**: Rotasi per halaman atau massal dalam kelipatan 90 derajat (kiri atau kanan) +- **Duplikat**: Gandakan halaman apa pun dengan satu klik +- **Hapus**: Hapus halaman satu per satu atau hapus massal halaman yang dipilih +- **Sisipkan PDF**: Tambahkan PDF baru setelah halaman tertentu +- **Tambah Halaman Kosong**: Tambahkan halaman A4 kosong di akhir +- **Pisah**: Letakkan penanda pisah di antara halaman, lalu ekspor sebagai ZIP berisi PDF terpisah +- **Pilih Semua / Batalkan Semua**: Pemilihan cepat untuk operasi massal +- **Urungkan / Ulangi**: Riwayat urungkan/ulangi penuh untuk setiap operasi +- **Unduh yang dipilih**: Ekspor hanya halaman terpilih sebagai PDF mandiri +- Memperbaiki PDF yang rusak secara otomatis sebelum dimuat + +## Kasus Penggunaan + +- Membuat dokumen kustom dari halaman-halaman beberapa PDF sumber +- Merapikan dokumen pindaian dengan menghapus halaman kosong, memutar pindaian yang miring, dan mengatur ulang bagian +- Memisah PDF besar pada batas bab menggunakan penanda pisah visual +- Penyuntingan tingkat halaman yang cepat tanpa memerlukan editor PDF lengkap + +## Tips + +- Sistem urungkan/ulangi melacak setiap operasi. Gunakan dengan bebas, Anda tidak bisa merusak pekerjaan Anda secara tidak sengaja. +- Penanda pisah tampil sebagai garis putus-putus biru di antara halaman. Letakkan secara visual di tempat dokumen ingin dibagi, lalu ekspor untuk mendapatkan ZIP. +- Untuk tugas gabung atau pisah sederhana, alat khusus [Gabung PDF](./merge-pdf) atau [Pisah PDF](./split-pdf) mungkin lebih cepat. Alat Multi unggul saat Anda memerlukan banyak operasi dalam satu sesi. + +## Alat Terkait + +- [Gabung PDF](./merge-pdf) +- [Pisah PDF](./split-pdf) +- [Atur & Duplikat](./organize-pdf) +- [Putar PDF](./rotate-pdf) diff --git a/docs/id/tools/pdf-to-bmp.md b/docs/id/tools/pdf-to-bmp.md new file mode 100644 index 00000000..0cb83323 --- /dev/null +++ b/docs/id/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF ke BMP +description: Konversi halaman PDF ke gambar BMP tanpa kompresi. Berguna untuk sistem lama dan alur kerja cetak yang memerlukan input bitmap. +--- + +# PDF ke BMP + +Mengonversi setiap halaman PDF menjadi gambar BMP (Bitmap). BMP adalah format tanpa kompresi, sehingga hasilnya sempurna per piksel tanpa kehilangan kualitas, tetapi ukuran filenya besar. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Klik **Konversi** untuk memproses file. +3. Satu file `.bmp` atau arsip ZIP diunduh secara otomatis. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Halaman dirender pada skala tetap 2x, menghasilkan gambar dengan dimensi sekitar dua kali dimensi asli halaman PDF. + +## Format Hasil + +- **Satu halaman**: `filename.bmp` +- **Beberapa halaman**: `filename_bmps.zip` berisi `page_1.bmp`, `page_2.bmp`, dan seterusnya. + +## Kasus Penggunaan + +- Memasukkan halaman PDF ke sistem lama atau perangkat keras yang hanya menerima input BMP. +- Menyiapkan gambar tanpa kompresi untuk alur kerja cetak tertentu. +- Menggunakan hasil bitmap sebagai input untuk alat pengolah gambar yang memerlukan data piksel mentah. + +## Tips + +- File BMP sangat besar karena menyimpan data piksel mentah tanpa kompresi. Untuk sebagian besar keperluan, [PDF ke PNG](./pdf-to-png) memberikan kualitas lossless dengan file yang jauh lebih kecil. +- Jika sistem tujuan Anda menerima PNG atau TIFF, pilih format tersebut untuk menghemat ruang disk. + +## Alat Terkait + +- [PDF ke PNG](./pdf-to-png) +- [PDF ke TIFF](./pdf-to-tiff) +- [PDF ke JPG](./pdf-to-jpg) diff --git a/docs/id/tools/pdf-to-cbz.md b/docs/id/tools/pdf-to-cbz.md new file mode 100644 index 00000000..63c1216f --- /dev/null +++ b/docs/id/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF ke CBZ +description: Konversi PDF menjadi file CBZ (Comic Book Archive) untuk pembaca komik seperti Komga, Kavita, CDisplayEx, dan Calibre. +--- + +# PDF ke CBZ + +Mengonversi PDF menjadi file CBZ (Comic Book ZIP), format standar untuk komik digital dan manga. Setiap halaman PDF menjadi satu gambar di dalam arsip. Alat ini membuat metadata dalam tiga format demi kompatibilitas maksimal: ComicInfo.xml, metadata.opf, dan ComicBookInfo JSON. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Pilih format gambar, kualitas, skala, dan metadata opsional. +3. Klik **Konversi** untuk membuat file CBZ. +4. File `.cbz` diunduh secara otomatis. + +## Opsi + +| Opsi | Nilai | Default | Deskripsi | +| ----------------- | --------------- | -------- | --------------------------------------------------------------------------------------------- | +| Format Gambar | JPEG, PNG, WebP | JPEG | JPEG untuk komik berwarna, PNG untuk manga hitam putih lossless, WebP untuk kompresi terbaik. | +| Kualitas | 50–100% | 85% | Mengatur kompresi JPEG/WebP. Disembunyikan untuk PNG (selalu lossless). | +| Skala | 1.0x–4.0x | 2.0x | Skala lebih tinggi menghasilkan gambar lebih tajam untuk layar resolusi tinggi. | +| Skala abu-abu | Aktif/Nonaktif | Nonaktif | Mengonversi halaman ke skala abu-abu. Mengurangi ukuran file untuk konten hitam putih. | +| Mode manga | Aktif/Nonaktif | Nonaktif | Menetapkan arah baca kanan ke kiri pada metadata. | +| Sertakan metadata | Aktif/Nonaktif | Aktif | Menyematkan ComicInfo.xml, metadata.opf, dan ComicBookInfo JSON. | + +## Kolom Metadata + +Saat metadata diaktifkan, Anda dapat mengisi: + +- **Judul**: Terdeteksi otomatis dari nama file PDF. +- **Seri**: Nama seri (mis., "Naruto"). +- **Nomor (#)**: Nomor edisi dalam seri. +- **Volume (Vol.)**: Nomor volume. +- **Penulis**: Nama penulis atau kreator. +- **Penerbit**: Perusahaan penerbit. +- **Tag / Genre**: Tag yang dipisahkan koma (mis., "Action, Adventure"). +- **Tahun Terbit**: Tahun publikasi (1900–2100). +- **Peringkat**: Rating komunitas dari 0 sampai 5. + +## Kompatibilitas Metadata + +Alat ini menulis metadata dalam tiga format agar setiap pembaca dapat menemukannya: + +| Format | Lokasi | Didukung oleh | +| ------------------ | ------------------ | ------------------------------------------- | +| ComicInfo.xml | File di dalam ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | File di dalam ZIP | Calibre | +| ComicBookInfo JSON | Kolom komentar ZIP | Calibre (cadangan) | + +## Format Hasil + +- `filename.cbz`: Arsip ZIP berisi gambar halaman bernomor dan file metadata. + +Gambar halaman diberi nama dengan nomor berawalan nol (`01.jpg`, `02.jpg`, dan seterusnya) agar pembaca menampilkannya dalam urutan yang benar. + +## Kasus Penggunaan + +- Mengonversi PDF manga atau komik untuk digunakan dengan pembaca komik. +- Membangun pustaka komik digital di Komga, Kavita, atau Calibre. +- Mengonversi komik hasil pindaian ke format yang ramah pembaca. +- Membagikan komik dalam format yang mempertahankan arah baca dan metadata. + +## Tips + +- Gunakan **JPEG** untuk komik berwarna dan **PNG** untuk manga hitam putih, karena PNG mengompres konten hitam putih dengan sangat efisien. +- Aktifkan **Skala abu-abu** untuk manga guna mengurangi ukuran file secara signifikan. +- Isi kolom **Seri** dan **Nomor** agar pengelola pustaka (Komga, Calibre) dapat mengatur koleksi Anda secara otomatis. +- **WebP** menawarkan kompresi terbaik tetapi pembaca komik yang lebih lama mungkin tidak mendukungnya. + +## Alat Terkait + +- [PDF ke JPG](./pdf-to-jpg) +- [PDF ke PNG](./pdf-to-png) +- [PDF ke TIFF](./pdf-to-tiff) +- [Ekstrak Gambar](./extract-images) diff --git a/docs/id/tools/pdf-to-csv.md b/docs/id/tools/pdf-to-csv.md new file mode 100644 index 00000000..e667d4f0 --- /dev/null +++ b/docs/id/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF ke CSV +description: Ekstrak tabel dari dokumen PDF dan ekspor sebagai satu file CSV. Mendukung PDF multi-halaman dengan deteksi tabel otomatis. +--- + +# PDF ke CSV + +Mengekstrak tabel dari PDF dan mengekspornya sebagai file CSV. Alat ini memindai setiap halaman untuk data tabel menggunakan mesin deteksi tabel PyMuPDF, lalu menulis semua baris yang ditemukan ke satu keluaran yang dipisahkan koma. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Klik **Konversi** untuk memulai ekstraksi tabel. +3. Alat ini memindai setiap halaman dan mengidentifikasi tabel secara otomatis. +4. File `.csv` diunduh dengan semua data tabel yang diekstrak. + +Tabel dari halaman berbeda dipisahkan oleh baris kosong pada hasil. Sel yang berisi koma, tanda kutip, atau baris baru di-escape dengan benar mengikuti RFC 4180. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Semua tabel yang ditemukan dalam dokumen diekstrak dan digabung menjadi satu CSV. + +## Format Hasil + +- Satu file `filename.csv` yang berisi semua tabel yang terdeteksi. + +## Kasus Penggunaan + +- Mengambil data keuangan dari rekening koran atau faktur PDF ke dalam spreadsheet. +- Mengekstrak tabel harga dari penawaran vendor untuk perbandingan. +- Mengonversi data penelitian tabular dari makalah PDF ke format yang cocok untuk alat analisis. +- Memigrasikan data dari laporan PDF lama ke database. + +## Tips + +- Jika tidak ada tabel ditemukan, alat ini menampilkan pesan "Tabel Tidak Ditemukan". Biasanya ini berarti PDF memakai tata letak teks yang tampak seperti tabel tetapi tidak terstruktur sebagai tabel sungguhan. +- Untuk kontrol lebih atas setiap tabel, gunakan [Ekstrak Tabel](./extract-tables) yang memungkinkan Anda memilih format hasil CSV, JSON, dan Markdown. +- Jika Anda memerlukan data dalam format Excel dengan lembar terpisah per tabel, gunakan [PDF ke Excel](./pdf-to-excel). + +## Alat Terkait + +- [PDF ke Excel](./pdf-to-excel) +- [Ekstrak Tabel](./extract-tables) +- [PDF ke Teks](./pdf-to-text) diff --git a/docs/id/tools/pdf-to-excel.md b/docs/id/tools/pdf-to-excel.md new file mode 100644 index 00000000..39bb946e --- /dev/null +++ b/docs/id/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF ke Excel +description: Ekstrak tabel dari dokumen PDF ke spreadsheet Excel. Setiap tabel mendapat lembar kerjanya sendiri dengan rujukan halaman. +--- + +# PDF ke Excel + +Mengekstrak tabel dari PDF dan menyimpannya sebagai spreadsheet Excel (`.xlsx`). Setiap tabel yang terdeteksi ditempatkan pada lembar kerjanya sendiri, diberi label nomor tabel dan halaman sumber. Ditenagai PyMuPDF untuk deteksi tabel dan pustaka SheetJS untuk pembuatan Excel. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Klik **Konversi** untuk memulai ekstraksi tabel. +3. Alat ini memindai setiap halaman untuk tabel, lalu membangun workbook Excel. +4. File `.xlsx` diunduh dengan satu lembar per tabel. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Semua tabel yang terdeteksi diekstrak secara otomatis. + +## Format Hasil + +- Satu file `filename.xlsx`. +- **Satu tabel**: satu lembar kerja bernama "Table". +- **Beberapa tabel**: lembar kerja bernama "Table 1 (Page 3)", "Table 2 (Page 5)", dan seterusnya. Nama lembar dipotong hingga 31 karakter (batas Excel). + +## Kasus Penggunaan + +- Mengonversi laporan keuangan PDF menjadi spreadsheet yang dapat diedit untuk analisis lebih lanjut. +- Mengekstrak tabel inventaris atau pesanan dari PDF pemasok. +- Mengambil data terstruktur dari formulir atau katalog PDF ke Excel untuk diurutkan dan difilter. +- Mengarsipkan data tabular PDF dalam format yang bisa dikerjakan rekan non-teknis. + +## Tips + +- Jika alat melaporkan "Tabel Tidak Ditemukan", PDF kemungkinan memakai tata letak teks bebas, bukan tabel terstruktur. Coba [PDF ke Teks](./pdf-to-text) untuk mengambil konten mentahnya. +- Untuk format datar yang lebih sederhana, gunakan [PDF ke CSV](./pdf-to-csv). Untuk unduhan per tabel dalam beberapa format, gunakan [Ekstrak Tabel](./extract-tables). +- Periksa nama lembar untuk mengetahui dari halaman mana setiap tabel berasal. + +## Alat Terkait + +- [PDF ke CSV](./pdf-to-csv) +- [Ekstrak Tabel](./extract-tables) +- [PDF ke Teks](./pdf-to-text) diff --git a/docs/id/tools/pdf-to-greyscale.md b/docs/id/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..9f689a30 --- /dev/null +++ b/docs/id/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF ke Skala Abu-abu +description: Konversi PDF berwarna menjadi versi skala abu-abu (hitam putih). Menghasilkan PDF baru tanpa warna pada setiap halaman. +--- + +# PDF ke Skala Abu-abu + +Mengonversi PDF berwarna menjadi versi skala abu-abu. Setiap halaman dirender, didesaturasi, dan disematkan ulang sebagai gambar JPEG dalam PDF baru. Hasilnya mempertahankan dimensi halaman asli. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Klik **Konversi** untuk memproses file. +3. File `greyscale.pdf` baru diunduh dengan semua halaman dikonversi menjadi hitam putih. + +Di balik layar, setiap halaman dirender pada skala 2x, data pikselnya dilewatkan melalui filter skala abu-abu, lalu dienkode ulang sebagai JPEG berkualitas 90% dan ditempatkan dalam dokumen PDF baru. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Konversi skala abu-abu memakai rumus luminansi standar dan kualitas JPEG ditetapkan 90%. + +## Format Hasil + +- Satu file `greyscale.pdf` berisi semua halaman sebagai gambar JPEG skala abu-abu. + +## Kasus Penggunaan + +- Menyiapkan dokumen untuk pencetakan hitam putih guna menghemat biaya tinta warna. +- Memenuhi persyaratan pengajuan untuk berkas hukum atau pemerintah yang mewajibkan skala abu-abu. +- Mengurangi ukuran file pada PDF yang banyak warna (gambar JPEG skala abu-abu lebih kecil daripada berwarna). +- Membuat gaya visual yang konsisten pada dokumen dengan halaman berwarna dan hitam putih. + +## Tips + +- Karena setiap halaman dirasterisasi dan disematkan ulang sebagai JPEG, hasilnya berbasis gambar. Teks pada PDF asli tidak lagi dapat dipilih atau dicari. Jika Anda memerlukan teks yang dapat dicari setelahnya, jalankan hasilnya melalui alat OCR. +- Untuk kontrol penyesuaian warna lebih lanjut (kecerahan, kontras, saturasi), lihat alat Sesuaikan Warna atau node Skala Abu-abu di [Pembangun Alur Kerja PDF](./pdf-workflow). + +## Alat Terkait + +- [PDF ke JPG](./pdf-to-jpg) +- [PDF ke PNG](./pdf-to-png) +- [Pembangun Alur Kerja PDF](./pdf-workflow) diff --git a/docs/id/tools/pdf-to-jpg.md b/docs/id/tools/pdf-to-jpg.md new file mode 100644 index 00000000..21054770 --- /dev/null +++ b/docs/id/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF ke JPG +description: Konversi halaman PDF ke gambar JPG dengan kualitas yang dapat diatur. PDF satu halaman diunduh langsung; PDF multi-halaman diekspor sebagai ZIP. +--- + +# PDF ke JPG + +Mengonversi setiap halaman PDF menjadi gambar JPG. Dokumen satu halaman diunduh sebagai file `.jpg` mandiri. PDF multi-halaman menghasilkan arsip ZIP berisi satu JPG per halaman. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. Alat ini menampilkan nama file, ukuran file, dan jumlah halaman. +2. Atur penggeser **Kualitas** untuk mengontrol kompresi JPG. +3. Klik **Konversi** untuk mulai memproses. +4. Hasil diunduh otomatis: satu JPG untuk PDF satu halaman, atau file ZIP untuk dokumen multi-halaman. + +## Opsi + +- **Kualitas**: penggeser dari 0% hingga 100% (default 90%). Nilai lebih tinggi menghasilkan gambar lebih tajam dengan ukuran file lebih besar. Nilai lebih rendah mengompres lebih agresif. + +Halaman dirender pada skala 2x secara internal, sehingga resolusi hasil dua kali dimensi halaman PDF. Halaman berukuran letter standar menghasilkan gambar sekitar 1.224 x 1.584 piksel. + +## Format Hasil + +- **Satu halaman**: `filename.jpg` +- **Beberapa halaman**: `filename_jpgs.zip` berisi `page_1.jpg`, `page_2.jpg`, dan seterusnya. + +## Kasus Penggunaan + +- Membuat thumbnail pratinjau untuk sistem manajemen dokumen. +- Membagikan satu halaman laporan lewat obrolan atau email yang tidak mendukung PDF. +- Membuat aset gambar dari diagram atau ilustrasi PDF. +- Mengarsipkan dokumen pindaian sebagai gambar terpisah. + +## Tips + +- Untuk hasil lossless, gunakan [PDF ke PNG](./pdf-to-png). +- Pengaturan kualitas 80-90% memberi keseimbangan yang baik antara ukuran file dan ketajaman visual. +- Jika Anda memerlukan format tertentu per halaman, pertimbangkan [Pembangun Alur Kerja PDF](./pdf-workflow) yang memiliki node keluaran PDF ke Gambar. + +## Alat Terkait + +- [PDF ke PNG](./pdf-to-png) +- [PDF ke WebP](./pdf-to-webp) +- [PDF ke BMP](./pdf-to-bmp) +- [PDF ke TIFF](./pdf-to-tiff) diff --git a/docs/id/tools/pdf-to-json.md b/docs/id/tools/pdf-to-json.md new file mode 100644 index 00000000..61f0cd12 --- /dev/null +++ b/docs/id/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF ke JSON +description: Konversi file PDF ke format JSON terstruktur menggunakan CPDF. Mengekspor struktur internal PDF sebagai data JSON yang dapat dibaca mesin. +--- + +# PDF ke JSON + +Mengonversi satu atau beberapa file PDF ke format JSON. Alat ini memakai CPDF (Coherent PDF) untuk menserialisasi struktur internal setiap PDF menjadi representasi JSON yang dapat dibaca mesin. Hasilnya selalu dikirim sebagai arsip ZIP. + +## Cara Kerja + +1. Pilih satu atau beberapa file PDF menggunakan pemilih file. +2. Klik **Konversi** untuk mulai memproses. Konversi berjalan di web worker latar belakang. +3. Arsip ZIP diunduh berisi satu file JSON untuk setiap PDF input. + +Bilah status menampilkan kemajuan melalui tahap konversi dan pembuatan ZIP. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Setiap PDF dikonversi ke representasi JSON lengkapnya. + +## Format Hasil + +- File `pdfs-to-json.zip` berisi `filename.json` untuk setiap PDF input. + +Hasil JSON merepresentasikan struktur objek internal PDF, termasuk pohon halaman, rujukan font, metadata, dan content stream. + +## Kasus Penggunaan + +- Memeriksa struktur internal PDF untuk debugging atau validasi. +- Mengekstrak metadata terstruktur dan properti halaman secara terprogram. +- Memasukkan data struktur PDF ke pipeline pemrosesan kustom. +- Mengaudit dokumen PDF untuk kepatuhan dengan menganalisis pohon objeknya. + +## Tips + +- Alat ini menghasilkan struktur objek PDF mentah, bukan isi teks yang diekstrak. Jika Anda memerlukan teks halaman dalam format JSON, gunakan [Siapkan PDF untuk AI](./prepare-pdf-for-ai). +- Untuk ekstraksi teks biasa, [PDF ke Teks](./pdf-to-text) lebih sederhana. +- PDF besar dengan struktur kompleks menghasilkan file JSON yang sangat besar. + +## Alat Terkait + +- [PDF ke Teks](./pdf-to-text) +- [Siapkan PDF untuk AI](./prepare-pdf-for-ai) +- [Ekstrak Tabel](./extract-tables) diff --git a/docs/id/tools/pdf-to-markdown.md b/docs/id/tools/pdf-to-markdown.md new file mode 100644 index 00000000..0c751977 --- /dev/null +++ b/docs/id/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF ke Markdown +description: Konversi dokumen PDF ke format Markdown dengan ekstraksi gambar opsional. Mendukung konversi massal beberapa file. +--- + +# PDF ke Markdown + +Mengonversi file PDF ke format Markdown (`.md`), mempertahankan judul, paragraf, daftar, dan format dasar. Secara opsional mengekstrak dan menyertakan gambar tersemat. Mendukung konversi tunggal dan massal. Ditenagai PyMuPDF. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Secara opsional aktifkan **Sertakan Gambar** untuk menyematkan gambar yang diekstrak ke hasil Markdown. +3. Klik **Konversi** untuk mulai memproses. +4. Satu file diunduh sebagai `filename.md`. Beberapa file menghasilkan `markdown-files.zip`. + +## Opsi + +- **Sertakan Gambar**: jika dicentang, gambar tersemat dari PDF diekstrak dan dirujuk di hasil Markdown. Jika tidak dicentang, hanya konten teks yang dikonversi. + +## Format Hasil + +- **Satu file**: `filename.md` +- **Beberapa file**: `markdown-files.zip` berisi satu `.md` per PDF input. + +## Kasus Penggunaan + +- Mengonversi dokumentasi PDF menjadi Markdown untuk generator situs statis seperti VitePress, Hugo, atau Jekyll. +- Mengubah makalah penelitian PDF menjadi Markdown yang dapat diedit untuk aplikasi catatan seperti Obsidian. +- Memigrasikan basis pengetahuan PDF lama ke format teks yang ramah Git. +- Mengekstrak konten terstruktur dari ebook PDF untuk diformat ulang. + +## Tips + +- Opsi Sertakan Gambar berguna saat PDF berisi diagram atau gambar yang penting bagi isinya. Nonaktifkan untuk dokumen yang didominasi teks agar hasilnya bersih. +- Tata letak kompleks dengan sidebar, catatan kaki, atau teks multi-kolom dapat menghasilkan Markdown yang kurang sempurna. Periksa dan sesuaikan hasilnya bila perlu. +- Untuk teks mentah tanpa format apa pun, gunakan [PDF ke Teks](./pdf-to-text). + +## Alat Terkait + +- [PDF ke Teks](./pdf-to-text) +- [PDF ke Word](./pdf-to-word) +- [Siapkan PDF untuk AI](./prepare-pdf-for-ai) diff --git a/docs/id/tools/pdf-to-pdfa.md b/docs/id/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..79db9962 --- /dev/null +++ b/docs/id/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF ke PDF/A +description: Konversi PDF standar ke format PDF/A untuk pengarsipan jangka panjang. Mendukung tingkat kesesuaian PDF/A-1b, PDF/A-2b, dan PDF/A-3b. +--- + +# PDF ke PDF/A + +PDF/A adalah subset PDF terstandar ISO yang dirancang untuk pelestarian digital jangka panjang. Alat ini mengonversi PDF standar Anda menjadi dokumen yang sesuai PDF/A menggunakan Ghostscript yang berjalan langsung di browser Anda. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. +2. Pilih **Versi PDF/A** dari menu tarik-turun. +3. Secara opsional aktifkan **Pra-ratakan PDF** untuk file kompleks yang gagal dikonversi secara normal. +4. Klik **Konversi ke PDF/A**. Beberapa file menghasilkan arsip ZIP. + +## Versi PDF/A + +| Versi | Pembatasan | Terbaik Untuk | +| ------------ | --------------------------------------------------- | ------------------------------------------------ | +| **PDF/A-1b** | Paling ketat. Tanpa transparansi, tanpa layer. | Kompatibilitas maksimal dengan sistem arsip lama | +| **PDF/A-2b** | Mengizinkan transparansi dan JPEG2000. | Pengarsipan serbaguna (direkomendasikan) | +| **PDF/A-3b** | Mengizinkan lampiran tersemat dalam format apa pun. | Mengarsipkan dokumen beserta file data sumber | + +PDF/A-2b dipilih secara default dan sesuai untuk sebagian besar kebutuhan pengarsipan. + +## Opsi Pra-ratakan + +Beberapa PDF memiliki fitur yang menghalangi konversi PDF/A yang bersih, seperti encoding font tidak umum, tumpukan transparansi kompleks, atau struktur internal yang rusak. Mengaktifkan **Pra-ratakan** merasterisasi PDF pada 300 DPI sebelum konversi, yang menjamin kesesuaian dengan konsekuensi teks tidak dapat dipilih. Gunakan sebagai cadangan saat konversi standar menghasilkan error. + +Pra-ratakan memerlukan engine WASM PyMuPDF. + +## Kasus Penggunaan + +- Memenuhi persyaratan pengarsipan pemerintah atau hukum (banyak yurisdiksi mewajibkan PDF/A untuk berkas pengadilan) +- Mengirim dokumen ke repositori institusi atau perpustakaan digital +- Melestarikan catatan bisnis yang perangkat lunak aslinya mungkin tidak ada lagi sepuluh tahun ke depan +- Menyiapkan faktur untuk standar e-invoicing yang memerlukan PDF/A-3b dengan lampiran XML + +## Tips + +- Coba konversi tanpa pra-ratakan terlebih dahulu. Aktifkan hanya jika muncul error. +- PDF/A menyematkan semua font, sehingga file hasil sering lebih besar daripada aslinya. +- Validasi hasilnya di validator PDF/A khusus jika alur kerja Anda memerlukan kesesuaian yang ketat. + +## Alat Terkait + +- [Kompres PDF](./compress-pdf): kecilkan ukuran file setelah konversi +- [Ratakan PDF](./flatten-pdf): ratakan formulir sebelum dikonversi ke PDF/A +- [Hapus Metadata](./remove-metadata): bersihkan metadata sebelum pengarsipan diff --git a/docs/id/tools/pdf-to-png.md b/docs/id/tools/pdf-to-png.md new file mode 100644 index 00000000..e8af352d --- /dev/null +++ b/docs/id/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF ke PNG +description: Konversi halaman PDF ke gambar PNG lossless dengan skala yang dapat diatur. Ideal untuk tangkapan layar berkualitas tinggi dan latar belakang transparan. +--- + +# PDF ke PNG + +Mengonversi setiap halaman PDF menjadi gambar PNG. PNG memakai kompresi lossless, sehingga hasilnya mempertahankan setiap detail halaman asli. PDF satu halaman diunduh sebagai file `.png`; PDF multi-halaman menghasilkan ZIP. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Atur penggeser **Skala** untuk mengontrol resolusi hasil. +3. Klik **Konversi** untuk mulai memproses. +4. Satu PNG atau arsip ZIP diunduh secara otomatis. + +## Opsi + +- **Skala**: berkisar dari 1.0x hingga 3.0x (default 2.0x). Pada 2.0x, halaman berukuran letter standar dirender sekitar 1.224 x 1.584 piksel. Nilai skala lebih tinggi menghasilkan gambar lebih besar dan tajam dengan konsekuensi ukuran file dan waktu pemrosesan. + +## Format Hasil + +- **Satu halaman**: `filename.png` +- **Beberapa halaman**: `filename_pngs.zip` berisi `page_1.png`, `page_2.png`, dan seterusnya. + +## Kasus Penggunaan + +- Mengambil tangkapan layar halaman PDF berfidelitas tinggi untuk presentasi. +- Mengekstrak grafik atau diagram yang memerlukan tepi tajam tanpa artefak kompresi. +- Menyiapkan aset desain web dari mockup PDF. +- Membuat gambar halaman lossless untuk pra-pemrosesan OCR. + +## Tips + +- File PNG jauh lebih besar daripada JPG. Jika ukuran file lebih penting daripada kualitas sempurna, gunakan [PDF ke JPG](./pdf-to-jpg) atau [PDF ke WebP](./pdf-to-webp). +- Pada skala 1.0x, hasil sesuai dengan resolusi asli PDF. Naikkan ke 3.0x untuk ekspor berkualitas cetak. + +## Alat Terkait + +- [PDF ke JPG](./pdf-to-jpg) +- [PDF ke WebP](./pdf-to-webp) +- [PDF ke SVG](./pdf-to-svg) diff --git a/docs/id/tools/pdf-to-svg.md b/docs/id/tools/pdf-to-svg.md new file mode 100644 index 00000000..e55f152c --- /dev/null +++ b/docs/id/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF ke SVG +description: Konversi halaman PDF ke grafik vektor SVG yang dapat diskalakan. Mempertahankan teks dan bentuk sebagai jalur vektor untuk penskalaan tanpa batas. +--- + +# PDF ke SVG + +Mengonversi setiap halaman PDF menjadi file SVG (Scalable Vector Graphics). Berbeda dengan format raster, SVG mempertahankan jalur vektor, teks, dan bentuk sehingga hasilnya dapat diskalakan ke ukuran apa pun tanpa pikselasi. Ditenagai PyMuPDF. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. Anda dapat menambahkan beberapa file dan mengelolanya satu per satu. +2. Klik **Konversi** untuk memproses semua file yang diunggah. +3. Konversi satu file satu halaman diunduh sebagai `.svg` mandiri. Selain itu, hasilnya diunduh sebagai arsip ZIP. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Setiap halaman dikonversi ke SVG menggunakan ekspor vektor bawaan PyMuPDF. + +## Format Hasil + +- **Satu file, satu halaman**: `filename.svg` +- **Satu file, beberapa halaman**: `filename_svg.zip` berisi `page_1.svg`, `page_2.svg`, dan seterusnya. +- **Beberapa file**: `pdf_to_svg.zip` dengan file diatur menurut nama dokumen sumber. + +## Kasus Penggunaan + +- Mengekstrak diagram vektor, grafik, atau ilustrasi dari laporan PDF untuk digunakan di halaman web. +- Mengedit konten halaman PDF di editor vektor seperti Inkscape atau Illustrator. +- Menyematkan pratinjau halaman yang dapat diskalakan di aplikasi web responsif. +- Mengekstrak logo atau grafik dari brosur PDF dengan tepi yang tetap tajam. + +## Tips + +- SVG paling cocok untuk PDF yang berisi konten vektor. Dokumen pindaian atau PDF yang banyak gambar akan menghasilkan file SVG besar dengan data raster tersemat. +- Untuk hasil raster dari PDF yang banyak gambar, gunakan [PDF ke PNG](./pdf-to-png) atau [PDF ke JPG](./pdf-to-jpg). +- Alat ini mendukung konversi massal: unggah beberapa PDF sekaligus untuk mengonversinya dalam satu kali proses. + +## Alat Terkait + +- [PDF ke PNG](./pdf-to-png) +- [PDF ke JPG](./pdf-to-jpg) +- [PDF ke Markdown](./pdf-to-markdown) diff --git a/docs/id/tools/pdf-to-text.md b/docs/id/tools/pdf-to-text.md new file mode 100644 index 00000000..753fedf5 --- /dev/null +++ b/docs/id/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF ke Teks +description: Ekstrak konten teks biasa dari file PDF. Mendukung ekstraksi massal beberapa PDF dengan hasil berupa file TXT. +--- + +# PDF ke Teks + +Mengekstrak semua konten teks dari file PDF dan menyimpannya sebagai file `.txt` biasa. Mendukung pemrosesan massal: unggah beberapa PDF dan teks masing-masing diekstrak dalam satu operasi. Ditenagai PyMuPDF. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. Kelola daftar file dengan tombol Tambah File Lagi dan Hapus Semua. +2. Klik **Ekstrak** untuk mulai memproses. +3. Satu file diunduh sebagai `filename.txt`. Beberapa file menghasilkan arsip `pdf-to-text.zip`. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Semua konten teks diekstrak dari setiap halaman sesuai urutan baca. + +## Format Hasil + +- **Satu file**: `filename.txt` +- **Beberapa file**: `pdf-to-text.zip` berisi satu `.txt` per PDF input. + +## Kasus Penggunaan + +- Mengekstrak teks isi dari laporan PDF untuk pengindeksan pencarian teks lengkap. +- Mengonversi ebook atau artikel PDF ke teks biasa untuk dibaca di perangkat e-ink. +- Mengambil teks dari kontrak atau dokumen hukum untuk analisis kata kunci. +- Menghapus format dari PDF untuk mendapatkan teks bersih bagi skrip pemrosesan data. +- Menyiapkan korpus teks dari arsip PDF untuk pemrosesan bahasa alami. + +## Tips + +- PDF hasil pindaian (hanya gambar) akan menghasilkan file teks kosong karena tidak ada lapisan teks untuk diekstrak. Jalankan dokumen pindaian melalui OCR terlebih dahulu. +- Hasilnya mempertahankan urutan baca sebagaimana ditafsirkan PyMuPDF, yang umumnya mengikuti kiri ke kanan, atas ke bawah. Tata letak multi-kolom dapat menghasilkan teks yang saling bercampur. +- Untuk hasil terstruktur dengan judul dan format, coba [PDF ke Markdown](./pdf-to-markdown). Untuk JSON terstruktur siap AI, gunakan [Siapkan PDF untuk AI](./prepare-pdf-for-ai). + +## Alat Terkait + +- [PDF ke Markdown](./pdf-to-markdown) +- [Siapkan PDF untuk AI](./prepare-pdf-for-ai) +- [PDF ke Word](./pdf-to-word) diff --git a/docs/id/tools/pdf-to-tiff.md b/docs/id/tools/pdf-to-tiff.md new file mode 100644 index 00000000..ea8f8d0c --- /dev/null +++ b/docs/id/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF ke TIFF +description: Konversi halaman PDF ke gambar TIFF, yang umum dipakai dalam alur kerja cetak, faks, dan arsip. Beralih ke PNG jika encoding gagal. +--- + +# PDF ke TIFF + +Mengonversi setiap halaman PDF menjadi gambar TIFF. TIFF adalah format standar untuk produksi cetak, sistem faks, dan pengarsipan dokumen. Alat ini memakai kompresi PackBits untuk encoding TIFF dan beralih ke PNG jika suatu halaman gagal di-encode. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Klik **Konversi** untuk memproses file. +3. Satu file TIFF atau arsip ZIP diunduh secara otomatis. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Halaman dirender pada skala tetap 2x. + +## Format Hasil + +- **Satu halaman**: `filename.tiff` +- **Beberapa halaman**: `filename_tiffs.zip` berisi `page_1.tiff`, `page_2.tiff`, dan seterusnya. + +Jika encoding TIFF gagal untuk halaman tertentu (karena masalah kompresi), halaman itu disimpan sebagai file `.png`. Dalam kasus itu, ZIP akan berisi campuran file TIFF dan PNG. + +## Kasus Penggunaan + +- Mengirim dokumen ke instansi pemerintah atau sistem hukum yang mewajibkan format TIFF. +- Menyiapkan halaman untuk pengiriman faks melalui layanan faks digital. +- Mengarsipkan dokumen pindaian dalam format lossless yang didukung luas. +- Memasukkan halaman ke sistem manajemen dokumen perusahaan. + +## Tips + +- File TIFF berukuran besar. Jika Anda hanya memerlukan kualitas lossless untuk web atau layar, [PDF ke PNG](./pdf-to-png) adalah pilihan yang lebih baik. +- Periksa isi ZIP jika beberapa halaman memakai cadangan PNG, Anda mungkin ingin mengonversinya secara terpisah. + +## Alat Terkait + +- [PDF ke PNG](./pdf-to-png) +- [PDF ke BMP](./pdf-to-bmp) +- [PDF ke JPG](./pdf-to-jpg) diff --git a/docs/id/tools/pdf-to-webp.md b/docs/id/tools/pdf-to-webp.md new file mode 100644 index 00000000..e2320a8f --- /dev/null +++ b/docs/id/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF ke WebP +description: Konversi halaman PDF ke gambar WebP dengan kualitas yang dapat diatur. Ukuran file lebih kecil daripada JPG pada kualitas visual yang sebanding. +--- + +# PDF ke WebP + +Mengonversi setiap halaman PDF menjadi gambar WebP. WebP biasanya menghasilkan file 25-35% lebih kecil daripada JPG pada kualitas yang tampak sama, sehingga menjadi pilihan kuat untuk penggunaan web. + +## Cara Kerja + +1. Unggah PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. +2. Atur penggeser **Kualitas**. +3. Klik **Konversi** untuk memproses file. +4. Satu file `.webp` atau arsip ZIP diunduh secara otomatis. + +## Opsi + +- **Kualitas**: penggeser dari 0% hingga 100% (default 85%). Mengontrol tingkat kompresi lossy. Nilai lebih tinggi mempertahankan lebih banyak detail. + +Halaman dirender pada skala 2x secara internal, menghasilkan gambar dengan dimensi sekitar dua kali dimensi asli PDF. + +## Format Hasil + +- **Satu halaman**: `filename.webp` +- **Beberapa halaman**: `filename_webps.zip` berisi `page_1.webp`, `page_2.webp`, dan seterusnya. + +## Kasus Penggunaan + +- Menyiapkan pratinjau halaman untuk situs web yang mementingkan bandwidth. +- Membuat versi gambar ringan dari flyer atau brosur untuk media sosial. +- Mengonversi massal dokumen multi-halaman menjadi kumpulan gambar yang dioptimalkan untuk web. + +## Tips + +- WebP didukung di semua browser modern. Untuk kompatibilitas lama, gunakan [PDF ke JPG](./pdf-to-jpg). +- Kualitas 80-85% biasanya tidak dapat dibedakan dari aslinya di layar sambil menjaga ukuran file tetap kecil. + +## Alat Terkait + +- [PDF ke JPG](./pdf-to-jpg) +- [PDF ke PNG](./pdf-to-png) +- [PDF ke BMP](./pdf-to-bmp) diff --git a/docs/id/tools/pdf-to-word.md b/docs/id/tools/pdf-to-word.md new file mode 100644 index 00000000..b7269027 --- /dev/null +++ b/docs/id/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF ke Word +description: Konversi file PDF ke dokumen Word (DOCX) yang dapat diedit. Mendukung konversi massal beberapa PDF sekaligus. +--- + +# PDF ke Word + +Mengonversi file PDF menjadi dokumen Word (`.docx`) yang dapat diedit. Alat ini memakai PyMuPDF untuk merekonstruksi isi dokumen, mempertahankan teks, format dasar, dan tata letak. Mendukung konversi tunggal dan massal. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik zona lepas atau menyeret file ke dalamnya. Anda dapat menambah file lain atau menghapus file tertentu dari daftar. +2. Klik **Konversi** untuk mulai memproses. +3. Satu file diunduh sebagai `filename.docx`. Beberapa file dikemas menjadi `converted-documents.zip`. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Setiap PDF dikonversi ke DOCX menggunakan engine konversi bawaan PyMuPDF. + +## Format Hasil + +- **Satu file**: `filename.docx` +- **Beberapa file**: `converted-documents.zip` berisi satu `.docx` per PDF input. + +## Kasus Penggunaan + +- Mengedit teks pada PDF yang Anda terima dan perlu diubah. +- Mengonversi laporan PDF yang diarsipkan ke format yang bisa diedit rekan di Microsoft Word atau Google Docs. +- Mengambil konten dari kontrak atau proposal PDF ke Word untuk revisi. +- Memigrasikan dokumentasi PDF lama ke format yang dapat diedit. + +## Tips + +- Tata letak kompleks dengan teks multi-kolom, formulir tersemat, atau grafik berat mungkin tidak terkonversi dengan sempurna. Periksa hasilnya dan sesuaikan format di pengolah kata Anda. +- PDF hasil pindaian (hanya gambar) akan menghasilkan file DOCX kosong atau minimal. Jalankan melalui OCR terlebih dahulu untuk menambahkan lapisan teks. +- Mode massal efisien untuk mengonversi seluruh folder PDF, unggah semuanya sekaligus. + +## Alat Terkait + +- [PDF ke Teks](./pdf-to-text) +- [PDF ke Markdown](./pdf-to-markdown) +- [Pembangun Alur Kerja PDF](./pdf-workflow) diff --git a/docs/id/tools/pdf-to-zip.md b/docs/id/tools/pdf-to-zip.md new file mode 100644 index 00000000..eb809c07 --- /dev/null +++ b/docs/id/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF ke ZIP +description: Kemas beberapa file PDF ke dalam satu arsip ZIP agar mudah dibagikan dan disimpan. +--- + +# PDF ke ZIP + +Gabungkan beberapa file PDF ke dalam satu arsip ZIP. Ini adalah alat pengemasan sederhana, tanpa konversi, kompresi, atau perubahan pada PDF itu sendiri. + +## Cara Kerja + +1. Unggah beberapa file PDF menggunakan zona lepas. +2. Periksa daftar file. Hapus yang tidak ingin disertakan. +3. Klik tombol proses. +4. Arsip ZIP berisi semua PDF yang diunggah langsung diunduh. + +## Fitur + +- Menerima file PDF dalam jumlah berapa pun +- Penghapusan per file sebelum membuat arsip +- Mempertahankan nama file asli di dalam ZIP +- Tidak mengubah konten PDF, file dikemas apa adanya +- Menampilkan nama dan ukuran file untuk setiap PDF yang diunggah + +## Kasus Penggunaan + +- Menggabungkan sekumpulan faktur atau tanda terima sebagai lampiran email +- Mengemas hasil proyek (beberapa laporan PDF) untuk serah terima +- Membuat satu unduhan untuk kumpulan formulir atau templat +- Mengarsipkan sekumpulan dokumen ke dalam satu file terkompresi + +## Tips + +- File ZIP memakai nama file PDF asli. Jika Anda memiliki file dengan nama yang sama, ubah namanya sebelum mengunggah untuk menghindari konflik. +- Alat ini tidak mengompres PDF itu sendiri. Untuk mengurangi ukuran file, jalankan melalui Kompres PDF terlebih dahulu, lalu kemas dengan alat ini. + +## Alat Terkait + +- [Gabung PDF](./merge-pdf) +- [Pisah PDF](./split-pdf) +- [Kompres PDF](./compress-pdf) diff --git a/docs/id/tools/pdf-workflow.md b/docs/id/tools/pdf-workflow.md new file mode 100644 index 00000000..f6f4c85a --- /dev/null +++ b/docs/id/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Pembangun Alur Kerja PDF +description: Bangun pipeline pemrosesan PDF kustom secara visual dengan menghubungkan node di kanvas. Rangkai operasi seperti gabung, kompres, watermark, dan ekspor. +--- + +# Pembangun Alur Kerja PDF + +Pembangun Alur Kerja memungkinkan Anda merangkai beberapa operasi PDF menjadi satu pipeline otomatis. Alih-alih menjalankan alat satu per satu, Anda menyusun grafik visual berisi node (input, pemrosesan, output) dan menjalankan semuanya dengan satu klik. File Anda tidak pernah meninggalkan browser. + +## Cara Kerja + +Antarmuka terbagi menjadi tiga panel: **kotak alat node** di kiri, **kanvas** di tengah, dan **panel pengaturan** di kanan yang muncul saat Anda memilih node. + +1. **Tambah node** dengan mengkliknya di sidebar kiri, atau seret langsung ke kanvas. Gunakan kolom pencarian di bagian atas kotak alat untuk memfilter menurut nama. +2. **Hubungkan node** dengan menyeret dari soket keluaran (bagian bawah node) ke soket masukan (bagian atas node lain). Koneksi mengalir dari atas ke bawah. +3. **Atur pengaturan** dengan mengklik node untuk membuka panel pengaturannya di kanan. Setiap jenis node memiliki opsinya sendiri (rentang halaman, penggeser kualitas, kata sandi, dll.). +4. **Jalankan alur kerja** dengan mengklik tombol **Jalankan** di toolbar. Engine mengeksekusi node dalam urutan topologis, memproses satu per satu. Bilah status di bawah melacak kemajuan. +5. **Unduh hasil**: node Unduh di ujung menyimpan PDF akhir (atau ZIP jika menghasilkan beberapa file). + +## Kategori Node + +Node diatur dalam enam kategori, masing-masing diberi kode warna di kanvas: + +- **Masukan** (biru): Input PDF, Input Gambar, Word/Excel/PowerPoint ke PDF, dan lebih dari 15 konverter format lain yang memasukkan file ke pipeline. +- **Edit & Anotasi** (indigo): Pangkas, Skala Abu-abu, Balik Warna, Watermark, Nomor Halaman, Kepala & Kaki Halaman, Efek Pemindai, Sesuaikan Warna, Warna Latar, Hapus Halaman Kosong, Hapus Anotasi. +- **Atur & Kelola** (violet): Gabung, Pisah, Ekstrak Halaman, Putar, Hapus Halaman, Balik, Tambah Halaman Kosong, Bagi Halaman, N-Up, Perbaiki Ukuran Halaman, Gabung ke Halaman Tunggal, Buklet, Posterisasi, Edit Metadata, Daftar Isi, OCR. +- **Optimalkan & Perbaiki** (kuning amber): Kompres, Rasterisasi, Linearisasi, Luruskan, PDF ke PDF/A, Font ke Outline, Perbaiki. +- **Amankan PDF** (mawar): Enkripsi, Dekripsi, Sanitasi, Ratakan, Tanda Tangan Digital, Redaksi. +- **Keluaran** (teal): Unduh (mendeteksi otomatis PDF tunggal atau ZIP), PDF ke Gambar, PDF ke Teks, PDF ke DOCX, PDF ke XLSX, PDF ke CSV, PDF ke SVG, PDF ke Markdown, Ekstrak Gambar. + +## Menyimpan dan Memuat Alur Kerja + +Toolbar menyediakan empat opsi penyimpanan: + +- **Simpan**: menyimpan alur kerja saat ini sebagai templat bernama di penyimpanan lokal browser Anda. Anda dapat menyimpan beberapa templat. +- **Muat**: membuka modal berisi semua templat tersimpan. Klik Muat untuk memulihkan satu, atau hapus templat yang tidak lagi Anda perlukan. +- **Ekspor**: mengunduh alur kerja sebagai file `.json` agar dapat dibagikan atau dicadangkan. +- **Impor**: memuat file alur kerja `.json` dari disk, memulihkan semua node, posisi, dan koneksi. + +Templat bertahan antar sesi di penyimpanan lokal. File JSON yang diekspor portabel antar browser dan mesin. + +## Model Eksekusi + +Engine membangun grafik dependensi dari koneksi Anda dan mengeksekusi node dalam urutan topologis. Jika ada node yang gagal, eksekusi berhenti dan node yang gagal ditandai merah. Beberapa aturan yang perlu diingat: + +- Setiap alur kerja memerlukan setidaknya satu node **Masukan** dan satu node **Keluaran**. +- Engine mendeteksi dependensi melingkar dan memblokir eksekusi dengan pesan error. +- Node **Enkripsi** harus menjadi langkah pemrosesan terakhir sebelum node output. Menempatkannya lebih awal akan memicu peringatan validasi karena node berikutnya tidak dapat beroperasi pada data terenkripsi. +- PDF yang dilindungi kata sandi akan meminta kata sandi saat eksekusi. +- Input multi-PDF didukung: node Gabung dapat menggabungkannya, atau node pemrosesan massal akan memproses tiap PDF secara terpisah. + +## Jenis Soket + +Koneksi memakai soket bertipe untuk mencegah sambungan yang tidak valid: + +- **PDF** (indigo): satu dokumen PDF. +- **MultiPDF** (amber): beberapa dokumen PDF yang dikelompokkan bersama. +- **Image** (hijau): sebuah blob gambar. + +## Opsi + +Setiap node memiliki konfigurasinya sendiri yang dapat diakses lewat panel pengaturan di kanan. Pola umumnya meliputi: + +- **Rentang halaman** pada node Pisah, Ekstrak Halaman, Hapus Halaman +- **Penggeser kualitas** pada node output konversi gambar +- **Kolom kata sandi** pada node Enkripsi dan Dekripsi +- **Input teks** untuk Watermark, Kepala & Kaki Halaman, Edit Metadata +- **Sudut rotasi** pada node Putar +- **Tingkat kompresi** pada node Kompres +- **Pilihan bahasa OCR** pada node OCR + +## Kasus Penggunaan + +- **Pipeline pemrosesan faktur**: Input PDF -> OCR -> Ekstrak Tabel -> Unduh sebagai CSV. +- **Standardisasi laporan**: Word ke PDF -> Perbaiki Ukuran Halaman -> Tambah Nomor Halaman -> Watermark -> Kompres -> Unduh. +- **Persiapan arsip**: Input PDF -> Perbaiki -> Ratakan -> Sanitasi -> PDF ke PDF/A -> Unduh. +- **Ekstraksi gambar massal**: Input PDF (beberapa file) -> Ekstrak Gambar -> Unduh ZIP. +- **Buklet siap cetak**: Input PDF -> Buklet -> Pangkas -> Kompres -> Unduh. +- **Distribusi aman**: Input PDF -> Redaksi -> Hapus Anotasi -> Enkripsi -> Unduh. + +## Tips + +- Gunakan **Delete** atau **Backspace** untuk menghapus node terpilih dari kanvas. +- Klik tombol **X** pada bilah status node untuk menghapusnya langsung. +- Geser kanvas dengan mengklik dan menyeret di ruang kosong. Kursor berubah menjadi ikon genggam saat menggeser. +- Di perangkat seluler, gunakan tombol **+** di toolbar untuk menampilkan atau menyembunyikan kotak alat node. +- Jika alur kerja Anda menghasilkan beberapa file output, node Unduh otomatis mengemasnya ke dalam ZIP. +- Mulailah dari yang sederhana: bangun dan uji pipeline dua node sebelum menambah kerumitan. + +## Alat Terkait + +- [PDF ke Teks](./pdf-to-text) +- [PDF ke Excel](./pdf-to-excel) +- [Ekstrak Gambar](./extract-images) +- [PDF ke Markdown](./pdf-to-markdown) diff --git a/docs/id/tools/png-to-pdf.md b/docs/id/tools/png-to-pdf.md new file mode 100644 index 00000000..818eeb48 --- /dev/null +++ b/docs/id/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG ke PDF +description: Konversi satu atau beberapa gambar PNG menjadi dokumen PDF dengan kualitas yang dapat diatur, sepenuhnya di browser Anda. +--- + +# PNG ke PDF + +Konversi gambar PNG ke PDF sambil mempertahankan resolusi penuhnya. Setiap PNG menjadi satu halaman, berukuran sesuai dimensi gambar asli. Transparansi ditangani secara otomatis. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :------- | +| PNG | `.png` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file PNG. Anda dapat memilih beberapa sekaligus. +2. Kelola daftar file: hapus file yang tidak diinginkan atau tambah lainnya. +3. Pilih tingkat **Kualitas PDF** dari menu tarik-turun. +4. Klik **Konversi ke PDF**. Hasilnya diunduh sebagai `from_jpgs.pdf`. + +Alat ini memakai pdf-lib untuk menyematkan setiap gambar secara langsung. Jika PNG tidak dapat disematkan secara native (mis., karena profil warna yang tidak umum), alat ini beralih dengan merender ulang melalui canvas sebagai JPEG. + +## Opsi + +**Kualitas PDF** mengontrol kompresi yang diterapkan sebelum penyematan: + +- **Kualitas Tinggi**: kompresi minimal, ukuran file terbesar. +- **Kualitas Sedang** (default): keseimbangan yang baik antara ukuran dan kejernihan. +- **Kualitas Rendah**: kompresi maksimal, hasil terkecil. + +## Kasus Penggunaan + +- Mengonversi tangkapan layar menjadi PDF multi-halaman untuk laporan bug atau dokumentasi +- Mengemas ekspor desain UI ke dalam satu file untuk ditinjau +- Mengubah ekspor diagram (draw.io, Excalidraw) menjadi PDF yang dapat dibagikan +- Menyusun sekumpulan gambar grafik menjadi laporan + +## Tips + +- File PNG dengan transparansi mendapat latar belakang putih di PDF. Jika Anda memerlukan latar belakang lain, edit gambarnya terlebih dahulu. +- Untuk tangkapan layar dan diagram dengan tepi tajam dan teks, kualitas Tinggi menghindari artefak kompresi JPEG. Kualitas Sedang atau Rendah dapat dikonversi ke JPEG secara internal. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [JPG ke PDF](./jpg-to-pdf) +- [SVG ke PDF](./svg-to-pdf) diff --git a/docs/id/tools/posterize-pdf.md b/docs/id/tools/posterize-pdf.md new file mode 100644 index 00000000..9a03c248 --- /dev/null +++ b/docs/id/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Posterisasi PDF +description: Pisahkan halaman PDF menjadi kisi halaman yang lebih kecil untuk pencetakan format besar di beberapa lembar. +--- + +# Posterisasi PDF + +Bagi setiap halaman PDF menjadi kisi sub-halaman yang lebih kecil. Alat ini cocok untuk mencetak satu halaman di beberapa lembar kertas, yang kemudian disusun bersama menjadi poster atau spanduk besar. + +## Cara Kerja + +1. Unggah file PDF. +2. Atur jumlah **baris** dan **kolom** untuk menentukan kisi (misalnya, 2 baris x 2 kolom membagi setiap halaman menjadi 4 sub-halaman). +3. Secara opsional, tentukan rentang halaman untuk membatasi halaman yang diposterisasi. +4. Kanvas pratinjau menampilkan lapisan kisi pada halaman saat ini sehingga Anda dapat melihat garis potongnya. +5. Berpindah antarhalaman untuk memeriksa lapisan kisi di halaman lain. +6. Klik tombol proses. Setiap sel kisi menjadi halaman tersendiri di PDF hasil. + +## Fitur + +- Jumlah baris dan kolom yang dapat diatur untuk ukuran kisi yang fleksibel +- Pratinjau langsung dengan lapisan kisi yang menunjukkan persis di mana halaman akan dibagi +- Filter rentang halaman untuk memposterisasi halaman tertentu saja +- Navigasi halaman demi halaman di pratinjau +- Cuplikan halaman yang di-cache untuk navigasi pratinjau yang cepat +- Garis kisi merah putus-putus menandai batas potongan dengan jelas + +## Opsi + +| Opsi | Deskripsi | +| ------------------- | --------------------------------------------------- | +| **Baris** | Jumlah pembagian horizontal (default: 1) | +| **Kolom** | Jumlah pembagian vertikal (default: 1) | +| **Rentang halaman** | Halaman yang diposterisasi (kosong = semua halaman) | + +## Kasus Penggunaan + +- Mencetak PDF berukuran poster di lembar A4 atau Letter standar untuk dirangkai di dinding +- Membuat spanduk besar dari desain PDF satu halaman +- Membagi gambar teknis berukuran besar menjadi potongan yang dapat dicetak +- Membuat cetakan format besar tanpa printer format lebar + +## Tips + +- Kisi 2x2 mengubah satu halaman menjadi 4 halaman. Kisi 3x3 mengubah satu halaman menjadi 9. Rencanakan kisi Anda berdasarkan seberapa besar hasil akhir yang diinginkan. +- Lapisan pratinjau membantu Anda memastikan konten penting tidak jatuh pada garis potong. Ubah baris/kolom jika perlu. +- Untuk operasi sebaliknya (memuat beberapa halaman dalam satu lembar), gunakan [N-Up PDF](./n-up-pdf). + +## Alat Terkait + +- [N-Up PDF](./n-up-pdf) +- [Bagi Halaman](./divide-pages) +- [Pisah PDF](./split-pdf) diff --git a/docs/id/tools/powerpoint-to-pdf.md b/docs/id/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..501bca31 --- /dev/null +++ b/docs/id/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint ke PDF +description: Konversi presentasi PowerPoint (PPT, PPTX) dan file ODP ke PDF dengan format slide tetap terjaga. +--- + +# PowerPoint ke PDF + +Konversi file presentasi ke PDF. Setiap slide menjadi satu halaman di dokumen hasil, dengan teks, gambar, bentuk, dan transisi dirender melalui mesin LibreOffice berbasis browser. Mendukung format PowerPoint modern dan lama, serta format OpenDocument Presentation. + +## Format yang Didukung + +| Format | Ekstensi | +| :------------------------ | :------- | +| PowerPoint (modern) | `.pptx` | +| PowerPoint (lama) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file presentasi Anda. +2. Periksa daftar file. Tambahkan atau hapus file sesuai kebutuhan. +3. Klik **Konversi ke PDF**. Mesin LibreOffice dimuat saat pertama kali digunakan, lalu mengonversi setiap file. +4. Satu file diunduh langsung sebagai PDF. Beberapa file dikemas dalam `powerpoint-converted.zip`. + +## Opsi + +Alat ini tidak memiliki pengaturan tambahan. Slide dirender pada dimensi aslinya. + +## Hasil + +| Jumlah Input | Hasil | +| :----------- | :-------------------------------------------------------------- | +| 1 file | Unduhan satu PDF (nama file asli dengan ekstensi `.pdf`) | +| 2+ file | Arsip ZIP (`powerpoint-converted.zip`) berisi satu PDF per file | + +## Kasus Penggunaan + +- Mengonversi presentasi ke PDF sebelum dibagikan kepada audiens yang mungkin tidak memiliki PowerPoint +- Membuat versi handout siap cetak dari slide deck untuk konferensi atau lokakarya +- Mengarsipkan presentasi dalam format yang tampil identik di setiap perangkat +- Mengonversi sekaligus pustaka presentasi ODP dari LibreOffice Impress ke PDF +- Membuat versi PDF dari pitch deck untuk lampiran email + +## Tips + +- Animasi dan transisi slide tidak ditampilkan di PDF. Setiap slide diambil sebagai halaman statis. +- Video yang disematkan tidak akan muncul di hasil. Gantikan dengan tangkapan layar atau gambar pengganti jika perlu. +- Catatan pembicara tidak disertakan dalam ekspor PDF default. Jika Anda memerlukan catatan, coba ekspor dari tampilan "Print Notes" bawaan PowerPoint terlebih dahulu. +- Mesin LibreOffice disimpan di cache setelah dimuat pertama kali, sehingga mengonversi presentasi kedua dalam sesi yang sama jauh lebih cepat. + +## Alat Terkait + +- [Word ke PDF](./word-to-pdf) +- [Excel ke PDF](./excel-to-pdf) +- [Gambar ke PDF](./image-to-pdf) diff --git a/docs/id/tools/prepare-pdf-for-ai.md b/docs/id/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..8b8e26e4 --- /dev/null +++ b/docs/id/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Siapkan PDF untuk AI +description: Ekstrak konten PDF menjadi JSON terstruktur yang dioptimalkan untuk LLM dan pipeline AI seperti LlamaIndex. Mendukung pemrosesan batch. +--- + +# Siapkan PDF untuk AI + +Mengekstrak konten dari file PDF dan menyusunnya sebagai JSON yang dioptimalkan untuk dimasukkan ke large language model (LLM) dan kerangka kerja AI seperti LlamaIndex. Konten setiap halaman diekstrak dan diorganisasi dalam format terstruktur yang siap untuk pipeline RAG, chatbot, atau sistem pencarian semantik. + +## Cara Kerja + +1. Unggah satu atau beberapa PDF dengan mengklik area drop atau menyeret file ke dalamnya. +2. Klik **Ekstrak** untuk memulai pemrosesan. +3. Satu file diunduh sebagai `filename_llm.json`. Beberapa file menghasilkan arsip `pdf-for-ai.zip`. + +Alat ini menggunakan integrasi LlamaIndex dari PyMuPDF untuk mengekstrak konten tingkat halaman beserta metadata, menghasilkan keluaran yang dapat langsung dimuat ke kerangka kerja AI. + +## Opsi + +Alat ini tidak memiliki opsi yang dapat diatur. Semua halaman diekstrak dengan teks lengkap dan metadata. + +## Format Keluaran + +- **Satu file**: `filename_llm.json` +- **Beberapa file**: `pdf-for-ai.zip` berisi satu `_llm.json` per PDF input. + +Keluaran JSON mengikuti skema dokumen LlamaIndex dengan konten teks per halaman dan bidang metadata. + +## Kasus Penggunaan + +- Menyiapkan dokumen PDF untuk pipeline retrieval-augmented generation (RAG). +- Membangun basis pengetahuan yang dapat dicari dari arsip PDF untuk chatbot AI. +- Memasukkan laporan PDF ke alur kerja analisis berbasis LLM. +- Memproses awal makalah penelitian untuk sistem pencarian semantik dan tanya jawab. +- Membuat data pelatihan terstruktur dari kumpulan dokumen PDF. + +## Tips + +- Untuk ekstraksi teks biasa tanpa format khusus AI, gunakan [PDF ke Teks](./pdf-to-text). +- Untuk keluaran Markdown yang mempertahankan judul dan struktur, gunakan [PDF ke Markdown](./pdf-to-markdown). +- PDF hasil pindai akan menghasilkan keluaran kosong atau minimal. Jalankan OCR terlebih dahulu untuk menambahkan lapisan teks sebelum ekstraksi. + +## Alat Terkait + +- [PDF ke Teks](./pdf-to-text) +- [PDF ke Markdown](./pdf-to-markdown) +- [PDF ke JSON](./pdf-to-json) diff --git a/docs/id/tools/protect-pdf.md b/docs/id/tools/protect-pdf.md new file mode 100644 index 00000000..89bceda4 --- /dev/null +++ b/docs/id/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Lindungi PDF +description: Lindungi file PDF dengan kata sandi menggunakan enkripsi AES 256-bit. Atur kata sandi pengguna dan pemilik dengan pembatasan penggunaan yang dapat dikonfigurasi. +--- + +# Lindungi PDF + +Kunci PDF Anda dengan kata sandi agar hanya orang yang berwenang yang dapat membukanya. BentoPDF menggunakan enkripsi AES 256-bit, standar yang sama dengan yang dipakai bank dan lembaga pemerintah, dan diterapkan sepenuhnya di browser Anda melalui QPDF. + +## Cara Kerja + +1. Unggah file PDF. +2. Masukkan **Kata Sandi Pengguna** (wajib). Ini adalah kata sandi yang diperlukan untuk membuka file. +3. Secara opsional, masukkan **Kata Sandi Pemilik**. Jika diatur, PDF mendapatkan pembatasan penggunaan yang mencegah pencetakan, pengeditan, penyalinan, dan pemberian anotasi. +4. Klik **Lindungi PDF**. +5. Unduh file terenkripsi. + +## Jenis Kata Sandi + +### Kata Sandi Pengguna (Wajib) + +Kata sandi pengguna adalah yang diketik penerima untuk membuka PDF. Tanpanya, dokumen sama sekali tidak dapat diakses. Setiap PDF terenkripsi harus memilikinya. + +### Kata Sandi Pemilik (Opsional) + +Kata sandi pemilik mengatur apa yang dapat dilakukan pengguna berwenang setelah membuka file. Saat Anda mengatur kata sandi pemilik yang berbeda, BentoPDF otomatis menerapkan set pembatasan paling ketat: + +- Modifikasi dinonaktifkan +- Ekstraksi/penyalinan dinonaktifkan +- Pencetakan dinonaktifkan +- Anotasi dinonaktifkan +- Pengisian formulir dinonaktifkan +- Perakitan dokumen dinonaktifkan + +Jika Anda mengosongkan kata sandi pemilik, PDF tetap dienkripsi (masih memerlukan kata sandi pengguna untuk dibuka) tetapi tidak memiliki pembatasan penggunaan setelah dibuka. + +## Detail Enkripsi + +- **Algoritma**: AES-256 (256-bit Advanced Encryption Standard) +- **Panjang kunci**: 256 bit +- **Standar**: Enkripsi PDF 2.0 (implementasi QPDF) + +AES-256 secara komputasi tidak mungkin ditembus dengan brute force menggunakan teknologi saat ini. Keamanan PDF terenkripsi Anda sepenuhnya bergantung pada kekuatan kata sandi Anda. + +## Kasus Penggunaan + +- Melindungi laporan keuangan rahasia sebelum dikirim lewat email +- Mengamankan dokumen hukum yang dibagikan kepada pihak lawan +- Menambahkan kata sandi pada rekam medis atau informasi identitas pribadi +- Mendistribusikan konten berbayar (e-book, laporan) dengan kontrol akses +- Memenuhi kebijakan perlindungan data yang mewajibkan enkripsi saat disimpan + +## Tips + +- Gunakan kata sandi yang kuat dan unik. Frasa sandi 12+ karakter dengan huruf besar dan kecil, angka, dan simbol adalah yang ideal. +- Bagikan kata sandi melalui saluran terpisah (telepon, pesan teks), jangan pernah di email yang sama dengan PDF. +- Jika Anda hanya perlu membatasi tindakan (tanpa pencetakan, tanpa penyalinan) tanpa mewajibkan kata sandi untuk membuka, gunakan alat Ubah Izin. + +## Alat Terkait + +- [Buka Kunci PDF](./unlock-pdf): hapus enkripsi saat Anda mengetahui kata sandinya +- [Ubah Izin](./change-permissions): ubah pembatasan penggunaan tertentu +- [Hapus Pembatasan](./remove-restrictions): hapus semua pengamanan dari PDF +- [Sanitasi PDF](./sanitize-pdf): hapus konten tersembunyi sebelum mengenkripsi diff --git a/docs/id/tools/psd-to-pdf.md b/docs/id/tools/psd-to-pdf.md new file mode 100644 index 00000000..7902e95e --- /dev/null +++ b/docs/id/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD ke PDF +description: Konversi file Photoshop (PSD) ke PDF di browser Anda. Gratis, privat, tanpa perangkat lunak Adobe. +--- + +# PSD ke PDF + +Konversi file Adobe Photoshop PSD menjadi dokumen PDF. PSD adalah format asli Photoshop, dan membukanya biasanya memerlukan perangkat lunak Adobe yang mahal. Alat ini merender komposit gabungan (flattened) dari file PSD Anda sebagai halaman PDF beresolusi penuh. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :-------------- | :------- | :------------------------------------------- | +| Adobe Photoshop | `.psd` | Merender gambar komposit yang sudah digabung | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file PSD Anda. Beberapa file didukung. +2. Periksa daftar file. Hapus file yang tidak diinginkan dengan ikon tempat sampah, atau gunakan **Tambah File Lainnya** untuk menambah file. +3. Klik **Konversi ke PDF**. Mesin PyMuPDF membaca file PSD dan menyematkan gambar komposit ke halaman PDF pada resolusi aslinya. +4. Satu PSD menghasilkan satu PDF. Saat Anda mengunggah beberapa file PSD, semuanya digabung menjadi satu PDF multi-halaman bernama `psd_to_pdf.pdf`, dengan setiap PSD menjadi satu halaman. + +## Opsi + +Tidak diperlukan pengaturan. Konverter menggunakan data gambar gabungan dari file PSD. + +## Kasus Penggunaan + +- Melihat pratinjau desain Photoshop tanpa membuka Photoshop +- Mengirim bukti desain kepada klien yang tidak memiliki Adobe Creative Suite +- Mencetak karya seni beresolusi tinggi dari file PSD +- Membuat portofolio PDF dari beberapa file desain PSD, masing-masing menjadi satu halaman dalam satu dokumen + +## Tips + +- Konversi merender tampilan komposit (gabungan) dari PSD. Layer individual, layer penyesuaian, dan efek layer tidak dipertahankan sebagai elemen terpisah di PDF. +- Beberapa file PSD digabung menjadi satu PDF multi-halaman, bukan PDF individual. Ini berguna untuk membuat portofolio atau lookbook. +- File PSD beresolusi sangat tinggi (file cetak 300+ DPI) akan menghasilkan PDF besar. Alat ini mempertahankan resolusi penuh. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [PNG ke PDF](./png-to-pdf) +- [VSD ke PDF](./vsd-to-pdf) diff --git a/docs/id/tools/pub-to-pdf.md b/docs/id/tools/pub-to-pdf.md new file mode 100644 index 00000000..e56fbd09 --- /dev/null +++ b/docs/id/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB ke PDF +description: Konversi file Microsoft Publisher (PUB) ke PDF di browser Anda. Gratis, privat, tanpa perangkat lunak tambahan. +--- + +# PUB ke PDF + +Konversi file Microsoft Publisher menjadi PDF. Publisher adalah alat desktop publishing yang disertakan dalam beberapa edisi Microsoft Office, tetapi kebanyakan orang tidak menginstalnya. Alat ini memungkinkan siapa pun mengonversi file PUB ke PDF langsung di browser, tanpa perangkat lunak Microsoft. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :------------------ | :------- | :------------------------- | +| Microsoft Publisher | `.pub` | Dokumen desktop publishing | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file PUB Anda. Beberapa file dapat diunggah sekaligus. +2. Periksa daftar file. Hapus file yang tidak diinginkan dengan ikon tempat sampah, atau klik **Tambah File Lainnya** untuk menambah file. +3. Klik **Konversi ke PDF**. Mesin berbasis LibreOffice dimuat di browser dan mengonversi setiap file PUB, dengan mempertahankan tata letak, gambar, dan kotak teks. +4. Satu file diunduh langsung sebagai PDF. Beberapa file dikirim dalam arsip ZIP bernama `pub-to-pdf.zip`. + +## Opsi + +Tidak diperlukan konfigurasi tambahan. Konverter menangani mesin tata letak PUB secara otomatis. + +## Kasus Penggunaan + +- Membuka flyer atau buletin PUB dari klien tanpa membeli Microsoft Publisher +- Mengonversi buletin gereja, program acara, atau buletin sekolah yang dibuat di Publisher +- Mengarsipkan materi pemasaran dari Publisher dalam format yang dapat diakses secara universal +- Mencetak file PUB di sistem yang tidak memiliki Publisher + +## Tips + +- Tata letak Publisher yang kompleks dengan kotak teks berlapis dan penempatan presisi dapat bergeser sedikit selama konversi. Periksa hasilnya jika posisi yang tepat sangat penting. +- Mesin LibreOffice diinisialisasi sekali per sesi. Konversi pertama memakan waktu lebih lama, konversi berikutnya lebih cepat. +- Untuk konversi file Publisher yang paling akurat, pastikan font khusus yang digunakan di file asli adalah font sistem standar. + +## Alat Terkait + +- [VSD ke PDF](./vsd-to-pdf) +- [ODP ke PDF](./odp-to-pdf) diff --git a/docs/id/tools/rasterize-pdf.md b/docs/id/tools/rasterize-pdf.md new file mode 100644 index 00000000..60e69ccb --- /dev/null +++ b/docs/id/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasterisasi PDF +description: Konversi halaman PDF menjadi PDF berbasis gambar. Ratakan semua layer, hapus teks yang dapat dipilih, dan atur DPI serta format gambar. +--- + +# Rasterisasi PDF + +Rasterisasi mengubah setiap halaman PDF menjadi gambar dan menyusun kembali gambar tersebut menjadi PDF. Hasilnya tampak identik dengan aslinya tetapi tidak berisi teks yang dapat dipilih, elemen interaktif, atau layer yang dapat diedit. Pada dasarnya ini adalah fotokopi berkualitas tinggi. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. +2. Atur **DPI** (resolusi) untuk hasil rasterisasi. +3. Pilih **Format Gambar**: PNG untuk kualitas tanpa kehilangan atau JPEG untuk file lebih kecil. +4. Secara opsional, centang **Konversi ke Skala Abu-abu**. +5. Klik **Rasterisasi PDF**. Beberapa file diunduh sebagai ZIP. + +## Opsi + +| Pengaturan | Nilai | Default | +| ----------------- | ------------------------------------------ | -------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Format Gambar** | PNG (tanpa kehilangan), JPEG (lebih kecil) | PNG | +| **Skala Abu-abu** | Aktif/Nonaktif | Nonaktif | + +## Panduan DPI + +- **72**: Hanya untuk dilihat di layar, ukuran file terkecil +- **150**: Keseimbangan yang baik untuk penggunaan umum +- **200**: Teks lebih tajam, ukuran file sedang +- **300**: Hasil berkualitas cetak +- **600**: Arsip berkualitas tinggi atau pencetakan profesional + +## Kasus Penggunaan + +- Mencegah ekstraksi teks dari dokumen rahasia sebelum dibagikan +- Menghilangkan masalah ketergantungan font dengan mengubah teks menjadi piksel +- Membuat versi "datar" dari PDF dengan layer atau transparansi kompleks yang dirender berbeda di berbagai penampil +- Menyiapkan PDF untuk sistem yang hanya menerima input berbasis gambar +- Menghapus konten tersembunyi (seperti perubahan terlacak atau data formulir) dengan mengubah PDF menjadi gambar murni + +## Tips + +- 150 DPI dengan PNG adalah default yang solid. Naikkan hanya jika Anda memerlukan hasil cetak atau perlu memperbesar detail halus. +- JPEG menghasilkan file yang jauh lebih kecil tetapi menimbulkan artefak kompresi pada tepi teks yang tajam. +- Rasterisasi tidak dapat dibatalkan, jadi simpan PDF asli Anda jika nanti mungkin memerlukan teks yang dapat diedit. + +## Alat Terkait + +- [Kompres PDF](./compress-pdf): kurangi ukuran file PDF hasil rasterisasi +- [Luruskan PDF](./deskew-pdf): luruskan halaman sebelum merasterisasi dokumen pindaian +- [Font ke Outline](./font-to-outline): ubah font menjadi jalur vektor jika Anda ingin tetap skalabel +- [Ratakan PDF](./flatten-pdf): ratakan formulir tanpa mengubahnya menjadi gambar diff --git a/docs/id/tools/remove-annotations.md b/docs/id/tools/remove-annotations.md new file mode 100644 index 00000000..5f014646 --- /dev/null +++ b/docs/id/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Hapus Anotasi +description: Hapus semua komentar, sorotan, tautan, dan anotasi lain dari PDF Anda dengan satu klik. +--- + +# Hapus Anotasi + +Bersihkan PDF Anda dengan menghapus semua anotasi: komentar, sorotan, catatan tempel, markup teks, tautan, stempel, dan objek anotasi lain yang tertanam di dokumen. Konten halaman di bawahnya (teks, gambar, grafik) tidak tersentuh. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Alat mendeteksi jumlah halaman dokumen dan menampilkan informasi file. +3. Klik **Hapus Anotasi** untuk memproses. +4. PDF yang sudah bersih diunduh otomatis tanpa anotasi apa pun. + +## Fitur + +- Menghapus semua jenis anotasi: komentar, sorotan, garis bawah, coretan, catatan tempel, stempel, tautan, dan markup formulir +- Bekerja pada setiap halaman di dokumen +- Mempertahankan semua konten non-anotasi (teks, gambar, grafik vektor, bidang formulir) +- Menampilkan jumlah halaman dan ukuran file sebelum diproses + +## Kasus Penggunaan + +- Membersihkan dokumen sebelum distribusi akhir setelah siklus peninjauan di mana beberapa peninjau menambahkan komentar +- Menghapus markup sorotan dan catatan tempel dari panduan belajar yang dibagikan +- Menghapus anotasi tautan dari dokumen sebelum diarsipkan +- Menyiapkan versi "bersih" dari dokumen hukum yang banyak dianotasi selama negosiasi +- Menghapus komentar peninjau dari naskah sebelum dikirim ke percetakan + +## Tips + +- Alat ini menghapus anotasi pada tingkat struktur PDF, sehingga hasilnya tetap memiliki teks yang dapat dipilih dan kualitas asli, tanpa rasterisasi. +- Jika Anda hanya ingin menghapus anotasi tertentu, bukan semuanya, gunakan [Editor PDF](./edit-pdf) untuk menghapus anotasi satu per satu. +- Anotasi di PDF yang sudah diratakan (di mana anotasi telah digabung ke konten halaman) tidak dapat dihapus karena sudah bukan objek terpisah. + +## Alat Terkait + +- [Editor PDF](./edit-pdf) +- [Tambah Watermark](./add-watermark) +- [Tanda Tangan PDF](./sign-pdf) diff --git a/docs/id/tools/remove-blank-pages.md b/docs/id/tools/remove-blank-pages.md new file mode 100644 index 00000000..09a469e1 --- /dev/null +++ b/docs/id/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Hapus Halaman Kosong +description: Deteksi dan hapus halaman kosong atau hampir kosong dari PDF Anda secara otomatis dengan sensitivitas yang dapat diatur. +--- + +# Hapus Halaman Kosong + +Pindai PDF Anda untuk menemukan halaman kosong atau hampir kosong dan hapus secara otomatis. Alat ini merender setiap halaman dan menganalisis isi pikselnya untuk menentukan apakah halaman kosong, lalu memungkinkan Anda mengonfirmasi halaman mana yang akan dihapus sebelum diproses. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Atur penggeser **Sensitivitas** untuk mengontrol seberapa ketat definisi "kosong". +3. Klik **Deteksi Halaman Kosong** untuk memindai dokumen. +4. Alat menampilkan thumbnail halaman kosong yang terdeteksi agar Anda dapat meninjaunya. +5. Konfirmasi pilihan dan unduh PDF bersih tanpa halaman kosong. + +## Opsi + +- **Sensitivitas**: Penggeser dari 0% hingga 100% (default 80%). Nilai lebih tinggi lebih ketat, hanya menandai halaman yang sepenuhnya atau hampir putih. Nilai lebih rendah lebih longgar, menangkap halaman dengan konten minimal seperti satu titik atau watermark samar. + +## Fitur + +- Analisis tingkat piksel pada setiap halaman untuk mendeteksi konten kosong +- Penggeser sensitivitas yang dapat diatur untuk penyempurnaan deteksi +- Pratinjau thumbnail halaman kosong yang terdeteksi untuk verifikasi manual +- Mempertahankan semua halaman tidak kosong persis seperti aslinya +- Menangani dokumen dengan ukuran atau jumlah halaman berapa pun +- Umpan balik kemajuan selama pemindaian + +## Kasus Penggunaan + +- Membersihkan dokumen hasil pindai di mana pemindai menangkap sisi belakang kosong dari dokumen asli satu sisi +- Menghapus halaman pemisah dari kumpulan dokumen yang dipindai massal +- Menghapus halaman kosong yang disisipkan oleh sistem manajemen dokumen +- Membersihkan PDF hasil ekspor dari pengolah kata yang terkadang menyertakan halaman kosong di akhir +- Mengurangi ukuran file dengan menghapus halaman kosong yang tidak perlu + +## Tips + +- Mulailah dengan sensitivitas default 80% lalu sesuaikan. Jika alat melewatkan halaman yang menurut Anda kosong, turunkan sensitivitas. Jika alat menandai halaman yang berisi konten ringan yang ingin Anda pertahankan, naikkan. +- Alat merender setiap halaman untuk menganalisis kontennya, sehingga waktu pemrosesan bergantung pada jumlah halaman. Untuk dokumen yang sangat besar, bersiaplah menunggu sebentar. +- Tinjau halaman kosong yang terdeteksi di pratinjau thumbnail sebelum mengonfirmasi penghapusan. Halaman dengan header, footer, atau watermark samar dapat ditandai tergantung pengaturan sensitivitas. + +## Alat Terkait + +- [Potong PDF](./crop-pdf) +- [Editor PDF](./edit-pdf) +- [Nomor Halaman](./page-numbers) diff --git a/docs/id/tools/remove-metadata.md b/docs/id/tools/remove-metadata.md new file mode 100644 index 00000000..9bc46b4a --- /dev/null +++ b/docs/id/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Hapus Metadata +description: Hapus semua metadata tersembunyi dari file PDF termasuk penulis, judul, tanggal pembuatan, produser, data XMP, dan ID dokumen. +--- + +# Hapus Metadata + +Setiap PDF membawa metadata yang dapat mengungkap siapa pembuatnya, perangkat lunak yang digunakan, kapan terakhir diubah, dan lainnya. Alat ini menghapus semuanya: info dictionary, aliran metadata XMP, ID dokumen, dan data khusus aplikasi, sehingga dokumen bersih tanpa jejak asalnya. + +## Cara Kerja + +1. Unggah file PDF. +2. Klik **Hapus Metadata**. +3. Unduh file yang sudah dibersihkan. + +Tidak ada opsi yang perlu diatur. Alat ini teliti secara desain: semuanya dibersihkan. + +## Yang Dihapus + +- **Bidang info dictionary**: Title, Author, Subject, Keywords, Creator, Producer, tanggal pembuatan, tanggal modifikasi +- **Aliran metadata XMP**: Blok metadata berbasis XML yang tersimpan di katalog dokumen +- **ID dokumen**: Pengenal unik di trailer PDF yang dapat digunakan untuk melacak dokumen lintas sistem +- **PieceInfo**: Metadata khusus aplikasi yang ditambahkan program seperti Illustrator atau InDesign + +## Yang Tetap Ada + +- Semua konten halaman yang terlihat (teks, gambar, grafik) +- Bidang formulir dan anotasi +- Bookmark dan tautan +- Struktur dokumen itu sendiri + +## Kasus Penggunaan + +- Menghapus nama dan organisasi Anda dari dokumen sebelum dipublikasikan secara anonim +- Menghapus stempel waktu pembuatan yang mengungkap kapan dokumen disiapkan +- Membersihkan string produser yang mengidentifikasi perangkat lunak PDF Anda +- Menyiapkan dokumen untuk pengajuan regulasi yang mewajibkan PDF tanpa metadata +- Menghapus jejak riwayat pengeditan sebelum membagikan dokumen ke pihak luar + +## Tips + +- Gunakan alat Lihat Metadata terlebih dahulu untuk melihat persis metadata apa yang ada di PDF Anda sebelum menghapusnya. +- Jika Anda perlu menghapus metadata _dan_ JavaScript, anotasi, serta file tertanam, gunakan Sanitasi PDF untuk pembersihan yang lebih menyeluruh. +- Penghapusan metadata bersifat permanen. Simpan file asli Anda jika nanti mungkin memerlukan data tersebut. + +## Alat Terkait + +- [Sanitasi PDF](./sanitize-pdf): hapus metadata beserta skrip, lampiran, dan lainnya +- [Lindungi PDF](./protect-pdf): lindungi PDF yang sudah dibersihkan dengan kata sandi +- [Kompres PDF](./compress-pdf): penghapusan metadata dapat sedikit mengurangi ukuran file, kompres untuk penghematan lebih besar diff --git a/docs/id/tools/remove-restrictions.md b/docs/id/tools/remove-restrictions.md new file mode 100644 index 00000000..b0e7ec50 --- /dev/null +++ b/docs/id/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Hapus Pembatasan +description: Hapus perlindungan kata sandi, pembatasan pencetakan, kunci pengeditan, dan batasan penyalinan dari file PDF. +--- + +# Hapus Pembatasan + +PDF dapat memiliki dua jenis kata sandi: kata sandi pengguna (diperlukan untuk membuka file) dan kata sandi pemilik (mengatur apa yang dapat Anda lakukan dengan file). Alat ini menghapus keduanya beserta semua pembatasan terkait: kunci pencetakan, pengeditan, penyalinan, dan anotasi. + +## Cara Kerja + +1. Unggah file PDF. +2. Jika PDF memiliki kata sandi pemilik, masukkan di kolom **Kata Sandi Pemilik**. Biarkan kosong jika PDF hanya memiliki pembatasan penggunaan tanpa kata sandi. +3. Klik **Hapus Pembatasan**. +4. Unduh PDF tanpa pembatasan. + +Alat ini menggunakan flag `--decrypt` dan `--remove-restrictions` dari QPDF untuk menghasilkan salinan yang bersih dan tanpa pembatasan. + +## Yang Dihapus + +- Perlindungan kata sandi (kata sandi pengguna dan pemilik) +- Pembatasan pencetakan +- Pembatasan pengeditan +- Pembatasan penyalinan teks dan gambar +- Pembatasan anotasi dan komentar +- Semua batasan keamanan lain yang dikodekan di PDF + +## Kasus Penggunaan + +- Membuka kunci PDF milik Anda yang kata sandinya Anda atur bertahun-tahun lalu +- Menghapus pembatasan cetak dari dokumen yang Anda akses secara sah +- Mengaktifkan salin-tempel pada materi referensi untuk mencatat +- Menyiapkan PDF untuk alat aksesibilitas yang tidak dapat menangani dokumen terbatas + +## Tips + +- Anda harus mengetahui kata sandi pemilik jika ada. Alat ini tidak memecahkan atau menebak kata sandi dengan brute force. +- Jika Anda perlu mempertahankan enkripsi tetapi mengubah izin tertentu, gunakan alat Ubah Izin. +- File hasil tidak memiliki enkripsi sama sekali, sehingga siapa pun yang menerimanya dapat membukanya dengan bebas. + +## Alat Terkait + +- [Buka Kunci PDF](./unlock-pdf): buka kunci PDF saat Anda mengetahui kata sandi pengguna +- [Lindungi PDF](./protect-pdf): terapkan kembali enkripsi dengan pengaturan baru +- [Ubah Izin](./change-permissions): ubah secara selektif tindakan yang diizinkan diff --git a/docs/id/tools/repair-pdf.md b/docs/id/tools/repair-pdf.md new file mode 100644 index 00000000..071a5519 --- /dev/null +++ b/docs/id/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Perbaiki PDF +description: Pulihkan data dari file PDF yang rusak atau korup menggunakan mesin perbaikan QPDF. Mendukung pemrosesan batch. +--- + +# Perbaiki PDF + +Saat PDF tidak mau terbuka, menampilkan konten acak, atau memicu error di penampil Anda, alat ini mencoba membangun ulang struktur internalnya. Alat ini menggunakan mesin perbaikan QPDF yang dapat memulihkan data dari berbagai jenis kerusakan: tabel referensi silang yang rusak, aliran yang terpotong, referensi objek yang tidak valid, dan lainnya. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF yang rusak. +2. Klik **Perbaiki PDF**. +3. Satu file yang diperbaiki diunduh langsung. Beberapa file menghasilkan arsip ZIP. + +Alat ini memproses setiap file melalui QPDF dengan flag `--decrypt`, yang memaksa QPDF membaca dan menulis ulang seluruh struktur PDF, memperbaiki masalah yang dapat dipulihkan. + +## Fitur + +- Perbaikan batch beberapa PDF dalam satu operasi +- Deteksi otomatis file yang dapat dipulihkan dan yang tidak +- Pelaporan berhasil/gagal per file saat memproses beberapa file +- Menggunakan QPDF (WebAssembly), pustaka transformasi PDF yang teruji + +## Yang Dapat Diperbaiki + +- Tabel referensi silang yang rusak atau hilang +- Akhir file yang terpotong akibat unduhan tidak lengkap +- Penomoran objek dan panjang aliran yang tidak valid +- Ketidakkonsistenan struktur kecil dari generator PDF yang bermasalah +- Artefak enkripsi dari upaya dekripsi yang gagal + +## Yang Tidak Dapat Diperbaiki + +- File yang sangat terpotong di mana sebagian besar data konten hilang +- PDF yang dienkripsi dengan kata sandi yang tidak Anda miliki +- File yang sebenarnya bukan PDF (ekstensi file salah) +- Kerusakan gambar di dalam PDF (strukturnya diperbaiki, tetapi data piksel tidak dibuat ulang) + +## Kasus Penggunaan + +- Memulihkan PDF dari unduhan email yang gagal +- Membuka file yang dihasilkan oleh generator PDF lama atau tidak standar +- Memperbaiki PDF yang berfungsi di satu penampil tetapi tidak di penampil lain +- Menyiapkan dokumen arsip yang rusak untuk penyimpanan jangka panjang + +## Tips + +- Jika perbaikan gagal, coba buka file di browser terlebih dahulu. Browser memiliki logika pemulihan sendiri dan mungkin merender cukup konten untuk disimpan ulang. +- Untuk PDF terenkripsi yang gagal diperbaiki, coba Buka Kunci PDF terlebih dahulu, lalu perbaiki hasil dekripsinya. + +## Alat Terkait + +- [Kompres PDF](./compress-pdf): rapikan lebih lanjut struktur PDF yang sudah diperbaiki +- [Linierisasi PDF](./linearize-pdf): optimalkan file yang diperbaiki untuk pengiriman web +- [Ratakan PDF](./flatten-pdf): ratakan formulir yang mungkin rusak diff --git a/docs/id/tools/reverse-pages.md b/docs/id/tools/reverse-pages.md new file mode 100644 index 00000000..41775443 --- /dev/null +++ b/docs/id/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Balik Halaman +description: Balik urutan halaman satu atau beberapa file PDF sehingga halaman terakhir menjadi yang pertama. +--- + +# Balik Halaman + +Balik urutan halaman PDF sehingga halaman terakhir menjadi yang pertama, halaman kedua dari belakang menjadi yang kedua, dan seterusnya. Mendukung pemrosesan batch beberapa file sekaligus. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF. +2. Klik tombol proses. +3. Setiap file dibalik secara independen. Jika Anda mengunggah beberapa file, hasilnya berupa arsip ZIP berisi semua PDF yang sudah dibalik. +4. Satu file diunduh langsung sebagai PDF yang sudah dibalik. + +## Fitur + +- Pemrosesan batch: balik beberapa PDF dalam satu operasi +- Keluaran satu file untuk satu PDF, keluaran ZIP untuk beberapa +- Tombol hapus per file sebelum diproses +- Mempertahankan semua konten dan format halaman + +## Kasus Penggunaan + +- Memperbaiki dokumen yang dipindai dengan urutan terbalik +- Menyiapkan PDF presentasi untuk dibaca dari belakang ke depan +- Membalik urutan halaman untuk alur kerja pencetakan tertentu yang memasukkan halaman secara terbalik +- Memperbaiki dokumen yang halamannya tidak sengaja tersusun terbalik + +## Tips + +- Setiap file dalam batch dibalik secara independen, urutan file satu sama lain tidak berubah. +- Untuk pengurutan ulang halaman yang lebih terperinci (bukan hanya pembalikan penuh), gunakan [Duplikat & Atur](./organize-pdf). + +## Alat Terkait + +- [Duplikat & Atur](./organize-pdf) +- [Putar PDF](./rotate-pdf) +- [Alat Multi PDF](./pdf-multi-tool) diff --git a/docs/id/tools/rotate-custom.md b/docs/id/tools/rotate-custom.md new file mode 100644 index 00000000..62016583 --- /dev/null +++ b/docs/id/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Putar dengan Derajat Kustom +description: Putar halaman PDF dengan sudut apa pun menggunakan input derajat per halaman dan kontrol rotasi batch. +--- + +# Putar dengan Derajat Kustom + +Putar halaman PDF dengan sudut sembarang, tidak hanya kelipatan 90 derajat. Setiap halaman memiliki input sudutnya sendiri, dan Anda dapat menerapkan satu sudut ke semua halaman sekaligus menggunakan kontrol batch. + +## Cara Kerja + +1. Unggah file PDF. Thumbnail dirender untuk setiap halaman. +2. Setiap halaman memiliki kolom input numerik yang menampilkan sudut rotasinya saat ini. +3. Ketik nilai derajat apa pun (positif atau negatif) untuk memutar halaman tertentu, atau gunakan tombol kiri/kanan per halaman untuk penyesuaian cepat 90 derajat. +4. Gunakan input **sudut batch** di bagian atas untuk mengatur rotasi seragam bagi semua halaman. +5. Klik tombol proses untuk menghasilkan PDF yang sudah diputar. + +## Fitur + +- Input derajat bebas per halaman (nilai bilangan bulat apa pun) +- Kontrol sudut batch untuk mengatur rotasi yang sama pada setiap halaman +- Pratinjau rotasi secara real-time di thumbnail +- Tombol putar cepat per halaman untuk kelipatan 90 derajat +- Thumbnail dimuat secara lazy untuk performa pada dokumen besar + +## Kasus Penggunaan + +- Memperbaiki pindaian yang sedikit miring beberapa derajat +- Memutar halaman agar sesuai dengan persyaratan orientasi non-standar +- Menerapkan rotasi presisi pada halaman tertentu dalam dokumen dengan konten campuran +- Menyempurnakan sudut halaman setelah rotasi massal awal + +## Tips + +- Nilai positif memutar searah jarum jam, nilai negatif memutar berlawanan arah jarum jam. +- Kolom sudut batch menimpa semua sudut per halaman saat diterapkan. Atur penyesuaian individual setelah operasi batch jika perlu. +- Untuk rotasi standar 90/180/270 derajat dengan antarmuka yang lebih sederhana, gunakan [Putar PDF](./rotate-pdf). + +## Alat Terkait + +- [Putar PDF](./rotate-pdf) +- [Alat Multi PDF](./pdf-multi-tool) +- [Duplikat & Atur](./organize-pdf) diff --git a/docs/id/tools/rotate-pdf.md b/docs/id/tools/rotate-pdf.md new file mode 100644 index 00000000..2df8505c --- /dev/null +++ b/docs/id/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Putar PDF +description: Putar halaman tertentu atau semua halaman PDF dengan kelipatan 90 derajat melalui antarmuka thumbnail visual. +--- + +# Putar PDF + +Putar halaman PDF 90 derajat searah atau berlawanan arah jarum jam. Alat ini menampilkan pratinjau thumbnail setiap halaman, sehingga Anda dapat memutarnya satu per satu atau menerapkan rotasi massal ke seluruh dokumen. + +## Cara Kerja + +1. Unggah file PDF. Thumbnail setiap halaman dirender dalam kisi. +2. Gunakan tombol rotasi kiri/kanan di bawah thumbnail setiap halaman untuk memutar halaman tersebut. +3. Gunakan kontrol rotasi massal di bagian atas untuk memutar semua halaman sekaligus. +4. Pratinjau thumbnail diperbarui secara real-time untuk menunjukkan rotasi. +5. Klik tombol proses untuk menyimpan PDF yang sudah diputar. + +## Fitur + +- Rotasi per halaman dengan kelipatan 90 derajat (kiri atau kanan) +- Rotasi massal untuk semua halaman sekaligus +- Pratinjau thumbnail real-time dengan transisi rotasi beranimasi +- Thumbnail dimuat secara lazy untuk performa mulus pada dokumen besar +- Mempertahankan konten dan kualitas halaman asli + +## Kasus Penggunaan + +- Memperbaiki halaman hasil pindai yang miring ke samping atau terbalik +- Memutar halaman lanskap ke orientasi potret (atau sebaliknya) +- Memperbaiki dokumen berorientasi campuran di mana beberapa halaman dipindai dengan sudut yang salah +- Menyiapkan dokumen untuk orientasi tampilan tertentu + +## Tips + +- Rotasi bersifat kumulatif. Mengklik tombol searah jarum jam dua kali menerapkan rotasi 180 derajat. +- Untuk rotasi non-90 derajat (misalnya, 45 derajat untuk memperbaiki pindaian yang sedikit miring), gunakan [Putar dengan Derajat Kustom](./rotate-custom). +- Kontrol rotasi massal memengaruhi semua halaman, bukan hanya yang dipilih. Alat ini tidak memiliki mekanisme pemilihan. Untuk itu, gunakan [Alat Multi PDF](./pdf-multi-tool). + +## Alat Terkait + +- [Putar dengan Derajat Kustom](./rotate-custom) +- [Alat Multi PDF](./pdf-multi-tool) +- [Duplikat & Atur](./organize-pdf) diff --git a/docs/id/tools/rtf-to-pdf.md b/docs/id/tools/rtf-to-pdf.md new file mode 100644 index 00000000..2daf427a --- /dev/null +++ b/docs/id/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF ke PDF +description: Konversi file Rich Text Format (RTF) ke PDF di browser Anda menggunakan mesin berbasis LibreOffice. +--- + +# RTF ke PDF + +Konversi dokumen Rich Text Format ke PDF. RTF adalah format dokumen lintas platform yang didukung hampir semua pengolah kata. Alat ini menggunakan mesin LibreOffice berbasis browser untuk merender file RTF dengan format yang tetap utuh: tebal, miring, tabel, dan gambar tertanam semuanya terbawa ke PDF. + +## Format yang Didukung + +| Format | Ekstensi | Tipe MIME | +| :----- | :------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas satu atau beberapa file RTF. +2. Periksa daftar file. Tambahkan atau hapus file sesuai kebutuhan. +3. Klik **Konversi ke PDF**. Mesin LibreOffice diinisialisasi saat pertama kali digunakan, lalu memproses setiap file. +4. Satu file diunduh langsung sebagai PDF. Beberapa file dikirim sebagai `rtf-converted.zip`. + +## Opsi + +Alat ini tidak memiliki pengaturan tambahan. Konversi mempertahankan format RTF asli. + +## Hasil + +| Jumlah Input | Hasil | +| :----------- | :------------------------------------------------------- | +| 1 file | Unduhan satu PDF (misalnya, `letter.pdf`) | +| 2+ file | Arsip ZIP (`rtf-converted.zip`) berisi satu PDF per file | + +## Kasus Penggunaan + +- Mengonversi dokumen RTF lama dari pengolah kata lawas ke PDF modern +- Mengubah templat email RTF menjadi pratinjau PDF +- Memproses keluaran RTF dari sistem perangkat lunak hukum atau medis +- Mengonversi sekaligus file RTF dari sistem manajemen dokumen ke PDF untuk arsip + +## Tips + +- Mesin LibreOffice dimuat sekali dan disimpan di cache. Konversi pertama dalam sesi memakan beberapa detik lebih lama, konversi berikutnya lebih cepat. +- File RTF dengan objek OLE tertanam mungkin tidak merender semua objek dengan sempurna. Teks biasa, gambar, dan format standar dikonversi dengan andal. +- Jika file RTF Anda dibuat oleh Microsoft Word, Anda juga dapat mengonversinya langsung dengan alat [Word ke PDF](./word-to-pdf), yang menerima RTF selain DOC dan DOCX. + +## Alat Terkait + +- [Word ke PDF](./word-to-pdf) +- [ODT ke PDF](./odt-to-pdf) +- [Teks ke PDF](./txt-to-pdf) diff --git a/docs/id/tools/sanitize-pdf.md b/docs/id/tools/sanitize-pdf.md new file mode 100644 index 00000000..224b9f42 --- /dev/null +++ b/docs/id/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Sanitasi PDF +description: Hapus konten tersembunyi dan berpotensi berbahaya dari PDF termasuk metadata, JavaScript, file tertanam, anotasi, dan layer. +--- + +# Sanitasi PDF + +PDF dapat membawa jauh lebih banyak daripada yang terlihat di layar. Metadata tersembunyi, JavaScript tertanam, lampiran file, data formulir, dan informasi layer dapat membocorkan data sensitif atau menimbulkan risiko keamanan. Sanitasi menghapus semuanya, sehingga Anda mendapatkan dokumen bersih yang aman dibagikan secara publik. + +## Cara Kerja + +1. Unggah file PDF. +2. Pilih elemen yang akan dihapus dari daftar centang. +3. Klik **Sanitasi PDF**. +4. Unduh file yang sudah dibersihkan. + +## Opsi Sanitasi + +Semua opsi aktif secara default. Hapus centang pada opsi yang ingin Anda pertahankan. + +| Opsi | Yang Dihapus | +| ------------------------ | ------------------------------------------------------------------------------- | +| **Ratakan Formulir** | Mengubah bidang formulir interaktif menjadi konten statis | +| **Hapus Metadata** | Menghapus penulis, judul, tanggal pembuatan, info perangkat lunak, dan data XMP | +| **Hapus Anotasi** | Menghapus komentar, sorotan, catatan tempel, dan markup | +| **Hapus JavaScript** | Menghilangkan skrip tertanam yang dapat berjalan saat dibuka | +| **Hapus File Tertanam** | Menghapus lampiran file yang tertanam di dalam PDF | +| **Hapus Layer (OCG)** | Meratakan grup konten opsional menjadi satu layer | +| **Hapus Tautan** | Menghapus hyperlink dan referensi URL | +| **Hapus Pohon Struktur** | Menghapus struktur dokumen yang digunakan untuk penandaan aksesibilitas | +| **Hapus MarkInfo** | Menghapus informasi konten bertanda | +| **Hapus Font** | Menghapus data font tertanam (gunakan dengan hati-hati) | + +## Kasus Penggunaan + +- Menyiapkan PDF untuk rilis publik dengan menghapus metadata internal (nama penulis, versi perangkat lunak, riwayat pengeditan) +- Menghapus JavaScript dari PDF yang diterima dari sumber tidak tepercaya sebelum membukanya +- Membersihkan PDF sebelum dikirim ke klien yang tidak boleh melihat komentar tertanam atau nama bidang formulir +- Menghapus layer tersembunyi dari gambar arsitektur sebelum membagikan versi final +- Memenuhi persyaratan minimisasi data berdasarkan regulasi privasi + +## Tips + +- Biarkan "Hapus Font" tidak dicentang kecuali Anda yakin PDF tetap dirender dengan benar. Menghapus font dapat membuat teks tidak terlihat di beberapa penampil. +- Jika Anda hanya perlu menghapus metadata, alat Hapus Metadata khusus lebih cepat dan lebih terfokus. +- Sanitasi tidak dapat dibatalkan. Simpan file asli Anda. + +## Alat Terkait + +- [Hapus Metadata](./remove-metadata): hapus metadata saja tanpa menyentuh konten lain +- [Ratakan PDF](./flatten-pdf): ratakan formulir dan anotasi secara khusus +- [Lindungi PDF](./protect-pdf): tambahkan perlindungan kata sandi setelah sanitasi +- [Rasterisasi PDF](./rasterize-pdf): opsi pamungkas, konversi ke gambar untuk menghilangkan semua konten tersembunyi diff --git a/docs/id/tools/scanner-effect.md b/docs/id/tools/scanner-effect.md new file mode 100644 index 00000000..89edc2e3 --- /dev/null +++ b/docs/id/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Efek Pemindai +description: Buat PDF Anda tampak seperti dokumen hasil pindai dengan efek derau, rotasi, blur, dan penuaan kertas yang dapat diatur. +--- + +# Efek Pemindai + +Ubah PDF digital yang bersih menjadi tampak seperti keluaran pemindai flatbed. Alat ini menerapkan derau, rotasi ringan, blur, pergeseran kecerahan, dan penguningan opsional yang dapat diatur untuk mensimulasikan ketidaksempurnaan pindaian fisik. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Editor terbuka dengan pratinjau langsung halaman pertama di samping panel pengaturan. +3. Sesuaikan parameter efek pindai menggunakan penggeser dan sakelar. +4. Pratinjau diperbarui secara real-time saat Anda mengubah pengaturan. +5. Klik **Terapkan** untuk memproses semua halaman dan mengunduh hasilnya. + +## Opsi + +- **Ruang warna (sakelar Skala Abu-abu)**: Ubah keluaran menjadi skala abu-abu untuk tampilan pindaian hitam putih klasik. +- **Batas**: Tambahkan border gelap tipis di tepi halaman untuk meniru artefak tepi pemindai. +- **Rotasi**: Terapkan rotasi ringan (-5 hingga +5 derajat) untuk mensimulasikan umpan kertas yang tidak sejajar. +- **Variasi Rotasi**: Tambahkan variasi acak pada sudut rotasi sehingga setiap halaman miring sedikit berbeda. +- **Kecerahan**: Geser kecerahan keseluruhan naik atau turun. +- **Kontras**: Atur kontras untuk mensimulasikan variasi kualitas toner. +- **Buram**: Terapkan blur Gaussian untuk melembutkan tepi teks seperti pindaian berkualitas rendah. +- **Derau**: Tambahkan derau piksel acak untuk mensimulasikan butiran sensor pemindai. Nilai lebih tinggi menghasilkan tampilan lebih berbutir. +- **Kekuningan**: Tambahkan rona kuning hangat untuk mensimulasikan kertas tua atau daur ulang. +- **Resolusi**: Atur DPI keluaran. Nilai lebih rendah menciptakan tampilan yang lebih berpiksel seperti pindaian. +- **Atur Ulang**: Kembalikan semua pengaturan ke default. + +## Fitur + +- Pratinjau real-time yang diperbarui saat Anda mengubah setiap parameter +- Variasi rotasi acak per halaman untuk variasi yang realistis +- Sepuluh parameter yang dapat diatur secara independen +- Mode skala abu-abu untuk keluaran pindaian hitam putih yang autentik +- Kontrol resolusi dari kualitas fax DPI rendah hingga kualitas arsip DPI tinggi + +## Kasus Penggunaan + +- Membuat dokumen buatan digital tampak seperti telah dipindai dan dicetak +- Mensimulasikan penuaan dokumen fisik untuk rekonstruksi dokumen bersejarah +- Menguji perangkat lunak OCR terhadap kualitas pindaian yang menurun +- Menghasilkan dokumen yang sesuai dengan gaya visual arsip hasil pindai yang ada + +## Tips + +- Mulailah dengan nilai yang halus. Tingkat derau 10-20, rotasi ringan 0,5 derajat, dan blur minimal sudah menghasilkan tampilan pindaian yang meyakinkan. +- Gabungkan mode skala abu-abu dengan sedikit penguningan untuk efek "fotokopi dari fotokopi". +- Pengaturan resolusi lebih rendah (100-150 DPI) menciptakan tampilan mesin fax yang paling realistis. + +## Alat Terkait + +- [Balik Warna](./invert-colors) +- [Sesuaikan Warna](./adjust-colors) +- [Warna Latar Belakang](./background-color) diff --git a/docs/id/tools/sign-pdf.md b/docs/id/tools/sign-pdf.md new file mode 100644 index 00000000..dd316597 --- /dev/null +++ b/docs/id/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Tanda Tangan PDF +description: Gambar, ketik, atau unggah tanda tangan dan tempatkan di halaman PDF Anda dengan penampil terintegrasi. +--- + +# Tanda Tangan PDF + +Tambahkan tanda tangan Anda ke dokumen PDF apa pun. Alat ini menyematkan penampil PDF lengkap dengan alat tanda tangan bawaan, tempat Anda dapat menggambar tanda tangan secara bebas, mengetik nama dengan font tanda tangan, atau mengunggah gambar tanda tangan. Tempatkan dan ubah ukuran tanda tangan di halaman mana pun, lalu simpan dokumen yang sudah ditandatangani. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Dokumen terbuka di penampil PDF terintegrasi dengan alat anotasi. +3. Gunakan alat tanda tangan penampil untuk membuat tanda tangan dengan menggambar, mengetik, atau mengunggah gambar. +4. Klik pada halaman tempat Anda ingin menempatkan tanda tangan, lalu sesuaikan ukuran dan posisinya. +5. Secara opsional, centang **Ratakan PDF** untuk menyematkan tanda tangan secara permanen ke dokumen. +6. Klik **Simpan & Unduh PDF yang Ditandatangani** untuk mendapatkan file yang sudah ditandatangani. + +## Opsi + +- **Ratakan PDF**: Jika dicentang, tanda tangan disematkan secara permanen ke konten halaman. Ini mencegah tanda tangan dipindahkan atau dihapus orang lain. Jika tidak dicentang, tanda tangan tetap berupa anotasi yang dapat diedit di penampil yang kompatibel. + +## Fitur + +- Tiga metode pembuatan tanda tangan: gambar bebas, teks ketikan, atau gambar yang diunggah +- Penampil PDF terintegrasi untuk penempatan yang akurat +- Seret untuk memosisikan dan mengubah ukuran tanda tangan di halaman mana pun +- Perataan opsional untuk menyematkan tanda tangan secara permanen +- Dukungan beberapa tanda tangan pada dokumen yang sama + +## Kasus Penggunaan + +- Menandatangani kontrak, perjanjian, atau formulir persetujuan sebelum dikirim kembali +- Menambahkan tanda tangan Anda pada dokumen pajak, klaim asuransi, atau formulir pemerintah +- Membubuhkan paraf di halaman tertentu dari perjanjian multi-halaman +- Menandatangani NDA atau dokumen HR yang datang sebagai lampiran PDF + +## Tips + +- Aktifkan perataan jika Anda mengirim PDF yang sudah ditandatangani kepada orang yang tidak boleh dapat menghapus atau memindahkan tanda tangan Anda. +- Untuk tanda tangan digital yang mengikat secara hukum dengan verifikasi berbasis sertifikat, BentoPDF juga menyediakan alat Tanda Tangan Digital terpisah. +- Unggah gambar tanda tangan PNG dengan latar belakang transparan untuk hasil yang paling bersih. + +## Alat Terkait + +- [Editor PDF](./edit-pdf) +- [Tambah Stempel](./add-stamps) +- [Pengisi Formulir](./form-filler) diff --git a/docs/id/tools/split-pdf.md b/docs/id/tools/split-pdf.md new file mode 100644 index 00000000..147d121c --- /dev/null +++ b/docs/id/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Pisah PDF +description: Pisahkan PDF menjadi file yang lebih kecil berdasarkan rentang halaman, pemilihan visual, bookmark, halaman genap/ganjil, atau interval tetap. +--- + +# Pisah PDF + +Pecah PDF menjadi dokumen yang lebih kecil dengan salah satu dari enam mode pemisahan. Dari rentang halaman sederhana hingga pemisahan berbasis bookmark, alat ini menangani setiap skenario pembagian dokumen. + +## Cara Kerja + +1. Unggah satu file PDF. +2. Pilih mode pemisahan dari dropdown. +3. Atur opsi khusus mode (rentang halaman, pilihan, dan sebagainya). +4. Klik tombol proses. +5. Hasilnya diunduh sebagai satu PDF atau arsip ZIP tergantung mode dan pengaturan. + +## Mode Pemisahan + +| Mode | Deskripsi | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **Rentang** | Masukkan rentang halaman seperti `1-3, 5, 8-10`. Beberapa rentang menghasilkan PDF terpisah dalam ZIP. Satu rentang menghasilkan satu PDF. | +| **Pilih Visual** | Telusuri thumbnail halaman dan klik untuk memilih halaman yang Anda inginkan. Halaman terpilih diekstrak ke PDF baru. | +| **Genap / Ganjil** | Ekstrak hanya halaman bernomor genap atau ganjil. | +| **Semua Halaman** | Pisahkan setiap halaman menjadi file PDF tersendiri, diunduh sebagai ZIP. | +| **Bookmark** | Pisahkan pada batas bookmark. Pilih tingkat bookmark untuk mengatur di mana pemisahan terjadi. | +| **Setiap N Halaman** | Pisahkan menjadi potongan masing-masing N halaman (misalnya, setiap 5 halaman). Potongan terakhir mungkin memiliki lebih sedikit halaman. | + +## Fitur + +- Enam mode pemisahan berbeda yang mencakup hampir semua kasus penggunaan +- Pemilih halaman visual dengan thumbnail yang dimuat secara lazy +- Pemisahan berbasis bookmark dengan filter tingkat +- Opsi keluaran ZIP untuk mode rentang dan visual +- Menangani rentang halaman dengan sintaks campuran (`1-3, 5, 8-10`) +- Peringatan saat pemisahan N halaman menghasilkan potongan yang tidak sama + +## Kasus Penggunaan + +- Mengekstrak bab atau bagian tertentu dari dokumen besar +- Memisahkan halaman ganjil dan genap untuk alur kerja pencetakan bolak-balik +- Memecah PDF buku menjadi file bab individual pada batas bookmark +- Mengisolasi halaman tertentu (seperti halaman tanda tangan) dari kontrak +- Memisahkan laporan gabungan menjadi file per bagian untuk distribusi + +## Tips + +- Beberapa rentang halaman yang dipisahkan koma (misalnya, `1-5, 10-15, 20-25`) menghasilkan PDF terpisah, satu per rentang, dikemas dalam ZIP. +- Mode pemisahan bookmark mengharuskan PDF benar-benar memiliki bookmark. Jika tidak ditemukan, Anda akan mendapatkan pesan error. +- Kotak centang "Unduh sebagai ZIP" pada mode Rentang dan Visual memungkinkan Anda mendapatkan PDF individual per halaman, bukan file gabungan. + +## Alat Terkait + +- [Gabung PDF](./merge-pdf) +- [Ekstrak Halaman](./extract-pages) +- [Hapus Halaman](./delete-pages) +- [Alat Multi PDF](./pdf-multi-tool) diff --git a/docs/id/tools/svg-to-pdf.md b/docs/id/tools/svg-to-pdf.md new file mode 100644 index 00000000..a7d8389c --- /dev/null +++ b/docs/id/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG ke PDF +description: Konversi grafik vektor SVG ke PDF dengan kontrol kualitas, sepenuhnya di browser Anda. +--- + +# SVG ke PDF + +Konversi file Scalable Vector Graphics (SVG) ke PDF. Alat ini merasterisasi setiap SVG melalui mesin rendering browser, lalu menyematkan hasilnya pada resolusi aslinya. Berguna untuk mengubah ikon vektor, diagram, dan ilustrasi menjadi dokumen portabel. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :------- | +| SVG | `.svg` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas satu atau beberapa file SVG. +2. Periksa dan kelola daftar file. +3. Pilih tingkat **Kualitas PDF**. +4. Klik **Konversi ke PDF**. Hasilnya diunduh sebagai `from_svgs.pdf`. + +Setiap SVG dibaca sebagai teks, dirender ke kanvas pada lebar dan tinggi intrinsiknya (default 800x600 jika tidak ada dimensi yang ditentukan), dan diekspor sebagai PNG. PNG tersebut kemudian disematkan ke PDF menggunakan pdf-lib. Area transparan diisi dengan latar belakang putih. + +## Opsi + +**Kualitas PDF** mengatur kompresi setelah rasterisasi: + +- **Kualitas Tinggi**: paling mendekati rendering asli. +- **Kualitas Sedang** (default): keseimbangan yang baik. +- **Kualitas Rendah**: file terkecil, sebagian detail hilang. + +## Kasus Penggunaan + +- Mengonversi diagram arsitektur atau teknik dari SVG ke PDF siap cetak +- Mengemas set ikon ke dalam PDF referensi untuk sistem desain +- Mengubah visualisasi data (D3.js, ekspor pustaka grafik) menjadi PDF siap laporan +- Membuat versi cetak dari infografis berbasis SVG + +## Tips + +- File SVG tanpa atribut `width` dan `height` eksplisit dirender pada 800x600 piksel. Untuk hasil terbaik, atur dimensi di sumber SVG sebelum mengonversi. +- SVG kompleks dengan referensi font eksternal atau gambar tertaut mungkin tidak dirender dengan sempurna. Sematkan semua aset di dalam SVG untuk hasil yang andal. +- Karena SVG dirasterisasi, PDF akan berisi gambar bitmap, bukan jalur vektor. Untuk keluaran PDF vektor sejati, diperlukan alat vektor khusus. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [PNG ke PDF](./png-to-pdf) +- [BMP ke PDF](./bmp-to-pdf) diff --git a/docs/id/tools/table-of-contents.md b/docs/id/tools/table-of-contents.md new file mode 100644 index 00000000..b0c5625a --- /dev/null +++ b/docs/id/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Daftar Isi +description: Buat halaman daftar isi yang terformat dari bookmark yang ada di PDF Anda. +--- + +# Daftar Isi + +Alat ini membaca bookmark (outline) di PDF Anda dan membuat halaman daftar isi terformat yang ditambahkan di awal dokumen. Jika PDF Anda sudah memiliki bookmark tetapi tidak memiliki halaman daftar isi yang terlihat, alat ini membuatnya secara otomatis. + +## Cara Kerja + +1. Unggah PDF yang berisi bookmark. +2. Sesuaikan judul daftar isi, ukuran font, dan jenis font. +3. Secara opsional, centang **Tambahkan bookmark untuk halaman daftar isi** agar daftar isi itu sendiri masuk ke pohon bookmark. +4. Klik **Buat Daftar Isi** untuk memproses file. +5. PDF yang diperbarui diunduh otomatis dengan halaman daftar isi disisipkan di awal. + +## Opsi + +- **Judul Daftar Isi**: Judul yang ditampilkan di bagian atas halaman yang dibuat. Default "Daftar Isi". +- **Ukuran Font**: Pilih dari 10pt hingga 72pt. Defaultnya 12pt. +- **Jenis Font**: Pilih dari varian Times Roman, Helvetica, atau Courier (reguler, tebal, miring, tebal miring). Default Helvetica. +- **Tambahkan bookmark untuk halaman daftar isi**: Jika dicentang, entri bookmark untuk halaman daftar isi itu sendiri ditambahkan ke pohon outline PDF. + +## Fitur + +- Membaca seluruh hierarki bookmark dari PDF +- Membuat halaman daftar isi yang terformat rapi dengan referensi nomor halaman +- Mendukung tingkat bookmark bertingkat dengan indentasi +- Pilihan 12 font PDF bawaan +- Bookmark opsional yang merujuk ke halaman daftar isi itu sendiri + +## Kasus Penggunaan + +- Menambahkan daftar isi yang dapat dicetak ke e-book atau laporan yang hanya memiliki bookmark digital +- Membuat daftar isi untuk dokumen gabungan setelah menggabungkan beberapa PDF +- Membuat halaman referensi untuk manual teknis yang panjang +- Menyiapkan dokumen untuk dicetak yang diharapkan memiliki daftar isi yang terlihat + +## Tips + +- Jika PDF Anda tidak memiliki bookmark, gunakan alat [Edit Bookmark](./bookmark) terlebih dahulu untuk membuatnya, lalu kembali ke sini untuk membuat daftar isi. +- Untuk dokumen besar, ukuran font lebih besar seperti 14pt atau 16pt meningkatkan keterbacaan. + +## Alat Terkait + +- [Edit Bookmark](./bookmark) +- [Nomor Halaman](./page-numbers) +- [Kepala & Kaki Halaman](./header-footer) diff --git a/docs/id/tools/text-color.md b/docs/id/tools/text-color.md new file mode 100644 index 00000000..a7de0c29 --- /dev/null +++ b/docs/id/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Ubah Warna Teks +description: Ubah warna semua teks di PDF Anda menjadi warna apa pun yang Anda pilih. +--- + +# Ubah Warna Teks + +Ganti warna teks di seluruh PDF Anda. Alat ini mengidentifikasi area teks di setiap halaman dan mewarnainya kembali dengan warna pilihan Anda sambil mempertahankan tata letak dokumen dan konten non-teks. + +## Cara Kerja + +1. Unggah file PDF Anda. +2. Pilih warna teks baru menggunakan pemilih warna. Defaultnya biru (#0000FF). +3. Klik **Ubah Warna Teks** untuk memproses. +4. PDF yang sudah diwarnai ulang diunduh otomatis. Indikator kemajuan menunjukkan halaman mana yang sedang diproses. + +## Opsi + +- **Warna Teks Baru**: Pemilih warna untuk memilih warna pengganti bagi semua teks di dokumen. + +## Fitur + +- Mewarnai ulang teks di setiap halaman dokumen +- Pemrosesan per halaman dengan umpan balik kemajuan +- Pemilih warna dengan dukungan penuh warna hex +- Mempertahankan tata letak halaman dan elemen non-teks + +## Kasus Penggunaan + +- Mengubah teks hitam menjadi biru tua untuk tampilan dokumen yang lebih lembut dan modern +- Mewarnai ulang teks agar sesuai dengan pedoman merek sebelum mendistribusikan dokumen +- Mengubah teks ke warna tertentu untuk kepatuhan aksesibilitas +- Membuat teks terlihat di atas warna latar belakang yang baru diterapkan + +## Tips + +- Alat ini merender halaman pada skala 2x untuk kualitas, lalu membangun ulang PDF. Hasilnya berbasis gambar, sehingga teks tidak lagi dapat dipilih atau dicari. +- Untuk dokumen di mana Anda perlu mempertahankan teks yang dapat dipilih, pertimbangkan untuk mengedit PDF langsung dengan [Editor PDF](./edit-pdf). +- Waktu pemrosesan bertambah seiring jumlah halaman karena setiap halaman dirender satu per satu. + +## Alat Terkait + +- [Warna Latar Belakang](./background-color) +- [Balik Warna](./invert-colors) +- [Sesuaikan Warna](./adjust-colors) diff --git a/docs/id/tools/tiff-to-pdf.md b/docs/id/tools/tiff-to-pdf.md new file mode 100644 index 00000000..33c2fe2a --- /dev/null +++ b/docs/id/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF ke PDF +description: Konversi gambar TIFF satu halaman dan multi-halaman ke format PDF di browser Anda dengan dukungan halaman penuh. +--- + +# TIFF ke PDF + +Konversi file TIFF ke PDF, termasuk TIFF multi-halaman. Setiap halaman (atau "IFD") dalam file TIFF menjadi halaman terpisah di PDF hasil. Ini sangat berguna untuk dokumen pindaian, fax, dan gambar medis yang umumnya disimpan sebagai TIFF multi-halaman. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file TIFF Anda. +2. Periksa daftar file dan kelola sesuai kebutuhan. +3. Klik **Konversi ke PDF**. Hasilnya diunduh sebagai `from_tiff.pdf`. + +Alat ini mendekode setiap file TIFF menggunakan dekoder TIFF JavaScript, mengekstrak data piksel RGBA mentah setiap halaman. Setiap halaman dirender ke kanvas, diekspor sebagai PNG, dan disematkan ke PDF. Dimensi halaman sesuai dengan halaman TIFF asli. + +## Opsi + +Alat ini tidak menyediakan pengaturan kualitas tambahan. Gambar disematkan pada resolusi aslinya. + +## Kasus Penggunaan + +- Mengonversi dokumen fax multi-halaman (TIFF-F) ke format PDF yang lebih portabel +- Mengubah arsip dokumen pindaian yang tersimpan sebagai TIFF menjadi PDF yang dapat dicari (gabungkan dengan alat OCR setelahnya) +- Memproses file pencitraan medis (slide patologi, ekspor radiologi) yang menggunakan TIFF +- Mengonversi file TIFF GIS atau citra satelit menjadi dokumen yang dapat dibagikan + +## Tips + +- TIFF multi-halaman didukung sepenuhnya. TIFF 10 halaman akan menghasilkan PDF 10 halaman. Anda tidak perlu memisahkan TIFF terlebih dahulu. +- File TIFF yang sangat besar (ratusan megabyte) mungkin memerlukan waktu lebih lama karena seluruh file harus didekode di memori browser. +- Jika Anda memerlukan OCR pada PDF hasil, jalankan melalui alat [OCR PDF](./ocr-pdf) setelah konversi. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [BMP ke PDF](./bmp-to-pdf) +- [JPG ke PDF](./jpg-to-pdf) diff --git a/docs/id/tools/txt-to-pdf.md b/docs/id/tools/txt-to-pdf.md new file mode 100644 index 00000000..ffe1738a --- /dev/null +++ b/docs/id/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Teks ke PDF +description: Konversi file teks biasa atau teks ketikan ke PDF dengan font, warna, dan ukuran halaman kustom. +--- + +# Teks ke PDF + +Konversi teks biasa menjadi PDF terformat. Anda dapat mengunggah file `.txt` atau mengetik langsung di editor teks bawaan. Alat ini mendukung beberapa font, warna teks kustom, dan beragam ukuran halaman, dari A0 hingga A10, ditambah US Letter, Legal, dan Tabloid. + +## Format yang Didukung + +| Input | Ekstensi | +| :------------------ | :-------------------------- | +| File teks biasa | `.txt` | +| Input teks langsung | Ketik atau tempel ke editor | + +## Cara Kerja + +1. Pilih mode input menggunakan sakelar di bagian atas: **Unggah File** atau **Ketik Teks**. +2. Jika mengunggah, seret dan lepas atau klik untuk memilih satu atau beberapa file `.txt`. Jika mengetik, masukkan teks Anda langsung di textarea. +3. Atur opsi format: jenis font, ukuran font, warna teks, dan ukuran halaman. +4. Klik **Buat PDF**. Hasilnya diunduh sebagai `text_to_pdf.pdf`. + +Saat mengunggah beberapa file, isinya digabungkan dengan baris kosong di antaranya. + +## Opsi + +| Opsi | Nilai | Default | +| :----------------- | :----------------------------------------------------------------------- | :-------------- | +| **Jenis Font** | Helvetica (sans-serif), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Ukuran Font** | 6 -- 72 pt | 12 | +| **Warna Teks** | Warna apa pun melalui pemilih warna | Hitam (#000000) | +| **Ukuran Halaman** | ISO A0--A10, B0--B10, C0--C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Bahasa RTL (Arab, Ibrani, Persia, Urdu) terdeteksi secara otomatis. Saat teks RTL ditemukan, arah teks dan perataan beralih sesuai. + +## Kasus Penggunaan + +- Mengonversi cuplikan kode atau file log menjadi PDF yang dapat dicetak dengan font Courier +- Membuat PDF cepat dari catatan rapat yang diketik langsung +- Memformat naskah teks biasa dengan font dan ukuran halaman tertentu untuk pengajuan +- Membuat versi PDF dari README atau changelog untuk distribusi offline + +## Tips + +- Gunakan mode **Ketik Teks** saat Anda ingin mengonversi isi clipboard dengan cepat tanpa menyimpannya sebagai file terlebih dahulu. +- Courier (monospace) adalah pilihan font terbaik untuk kode, log, atau konten apa pun yang memerlukan perataan kolom. +- Margin halaman ditetapkan 72 poin (1 inci) di semua sisi. + +## Alat Terkait + +- [Markdown ke PDF](./markdown-to-pdf) +- [CSV ke PDF](./csv-to-pdf) +- [Word ke PDF](./word-to-pdf) diff --git a/docs/id/tools/unlock-pdf.md b/docs/id/tools/unlock-pdf.md new file mode 100644 index 00000000..a214d1cb --- /dev/null +++ b/docs/id/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Buka Kunci PDF +description: Hapus perlindungan kata sandi dari PDF terenkripsi. Mendukung dekripsi massal dengan satu kata sandi untuk banyak file. +--- + +# Buka Kunci PDF + +Jika Anda memiliki kata sandi PDF terenkripsi, alat ini menghapus enkripsinya sepenuhnya dan menghasilkan salinan tanpa kunci yang bisa dibuka siapa saja tanpa kredensial. Alat ini mendukung dekripsi massal ketika beberapa PDF memakai kata sandi yang sama. + +## Cara Kerja + +1. Unggah satu atau beberapa file PDF terenkripsi. +2. Masukkan **kata sandi** yang digunakan untuk melindungi file. +3. Klik **Dekripsi PDF**. +4. Satu file akan langsung diunduh. Beberapa file menghasilkan arsip ZIP berisi semua PDF yang sudah dibuka kuncinya. + +## Fitur + +- Dekripsi satu file dan massal +- Mendukung kata sandi pengguna maupun kata sandi pemilik +- Menghasilkan keluaran tanpa enkripsi sama sekali dan tanpa sisa pembatasan +- Pelaporan error yang jelas untuk kata sandi salah atau file rusak +- Pelacakan berhasil/gagal per file dalam mode massal + +## Perbedaan dengan Hapus Pembatasan + +**Dekripsi PDF** memerlukan kata sandi dan menghapus seluruh enkripsi. **Hapus Pembatasan** menargetkan pembatasan penggunaan (cetak, salin, edit) dan mungkin tidak memerlukan kata sandi jika hanya kata sandi pemilik yang diatur. Gunakan Dekripsi jika PDF sama sekali tidak bisa dibuka tanpa kata sandi. + +## Kasus Penggunaan + +- Membuka kunci PDF yang dulu Anda enkripsi secara permanen ketika kata sandinya tidak lagi diperlukan +- Menghapus enkripsi dari sekumpulan dokumen arsip agar lebih mudah diakses dalam jangka panjang +- Menyiapkan PDF berkata sandi untuk sistem manajemen dokumen yang tidak mendukung file terenkripsi +- Membuka kunci PDF sebelum menggabungkannya dengan dokumen lain (banyak alat penggabung tidak bisa memproses masukan terenkripsi) + +## Tips + +- Kolom kata sandi berlaku untuk semua file yang diunggah. Jika PDF Anda memiliki kata sandi berbeda, proses dalam batch terpisah. +- Jika muncul error "Kata Sandi Salah", periksa kembali spasi di akhir atau caps lock. +- Setelah didekripsi, keluaran sama sekali tidak memiliki pengamanan. Enkripsi ulang dengan Enkripsi PDF jika Anda perlu menerapkan kata sandi baru. + +## Alat Terkait + +- [Lindungi PDF](./protect-pdf): terapkan kembali enkripsi dengan kata sandi baru +- [Hapus Pembatasan](./remove-restrictions): hapus pembatasan penggunaan tanpa dekripsi penuh +- [Ubah Izin](./change-permissions): ubah izin tertentu pada PDF terenkripsi diff --git a/docs/id/tools/validate-signature-pdf.md b/docs/id/tools/validate-signature-pdf.md new file mode 100644 index 00000000..82835a4d --- /dev/null +++ b/docs/id/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Validasi Tanda Tangan +description: Verifikasi tanda tangan digital pada file PDF. Periksa validitas sertifikat, identitas penanda tangan, integritas dokumen, dan status rantai kepercayaan. +--- + +# Validasi Tanda Tangan + +Unggah PDF yang sudah ditandatangani dan alat ini akan mengekstrak setiap tanda tangan digital, mengidentifikasi penanda tangan, memeriksa validitas sertifikat, dan melaporkan apakah dokumen diubah sejak ditandatangani. Anda juga dapat menyertakan sertifikat tepercaya untuk memverifikasi rantai tanda tangan. + +## Cara Kerja + +1. Unggah file PDF yang sudah ditandatangani. Validasi dimulai secara otomatis. +2. Alat menampilkan ringkasan: jumlah tanda tangan yang ditemukan dan berapa yang valid. +3. Setiap tanda tangan mendapat kartu rinci yang menampilkan nama penanda tangan, penerbit, tanggal, dan status. +4. Opsional, unggah **sertifikat tepercaya** (.pem, .crt, .cer, .der) untuk memverifikasi tanda tangan terhadap jangkar kepercayaan tertentu. Validasi ulang berjalan otomatis. + +## Yang Diperiksa + +### Penguraian Tanda Tangan + +Alat mengekstrak objek tanda tangan PKCS#7 dari PDF, mendekode struktur ASN.1, dan mengambil sertifikat X.509 penanda tangan beserta rantai sertifikat yang tertanam di dalam tanda tangan. + +### Validitas Sertifikat + +- **Kedaluwarsa**: Apakah sertifikat saat ini masih berada dalam rentang tanggal berlakunya? +- **Deteksi tanda tangan sendiri**: Apakah sertifikat adalah penerbitnya sendiri? +- **Rantai kepercayaan**: Jika sertifikat tepercaya diberikan, apakah sertifikat penanda tangan tersambung ke sertifikat tersebut? + +### Verifikasi Kriptografis + +- Alat merekonstruksi byte yang dicakup oleh `/ByteRange` tanda tangan, melakukan hash dengan algoritma yang dinyatakan penanda tangan, lalu membandingkan hasilnya dengan atribut `messageDigest` di dalam tanda tangan. +- Kemudian alat menserialisasi ulang atribut yang ditandatangani sebagai DER SET dan memverifikasi tanda tangan terhadap kunci publik sertifikat penanda tangan. +- **Tanda tangan dilaporkan valid hanya jika semua pemeriksaan ini lolos.** Jika byte PDF diubah setelah penandatanganan, atau tanda tangan yang tertanam tidak cocok dengan kunci penanda tangan, status menampilkan "Tidak valid: Verifikasi Kriptografi Gagal" beserta alasan spesifiknya. + +#### Algoritma Tanda Tangan yang Didukung + +| Algoritma | Jalur verifikasi | +| ----------------------- | ----------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, dengan cadangan Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` setelah konversi tanda tangan DER → IEEE P1363 | + +Jika tanda tangan memakai algoritma di luar daftar ini (misalnya Ed25519, SM2, atau RSA dengan OID digest yang tidak lazim), kartu menampilkan **"Tidak Terverifikasi: Algoritma Tanda Tangan Tidak Didukung"** dengan warna kuning, beserta OID atau alasan spesifiknya. Ini adalah pembedaan tiga status yang disengaja: + +- **Valid**: tanda tangan terverifikasi secara kriptografis terhadap kunci publik penanda tangan. +- **Tidak valid**: verifikasi berjalan dan menghasilkan hasil negatif (byte berubah, kunci tidak cocok). +- **Tidak terverifikasi**: alat tidak dapat menjalankan verifikasi untuk algoritma ini. Metadata sertifikat tetap ditampilkan, tetapi anggap tanda tangan sebagai "tidak diketahui" dan verifikasi dengan Adobe Acrobat atau `openssl cms -verify`. + +### Algoritma Digest yang Tidak Aman + +- Tanda tangan yang memakai **MD5 atau SHA-1** ditolak sebagai tidak valid dan ditandai dengan status "Digest Tidak Aman". Kedua algoritma ini memiliki serangan tabrakan yang sudah dipublikasikan, sehingga tanda tangan atas hash SHA-1 atau MD5 tidak memberikan jaminan integritas. +- SHA-224, SHA-256, SHA-384, dan SHA-512 semuanya diterima. + +### Cakupan Dokumen + +- **Cakupan penuh**: Tanda tangan mencakup seluruh file PDF, artinya tidak ada byte yang ditambahkan atau diubah setelah penandatanganan. +- **Cakupan sebagian**: Tanda tangan hanya mencakup sebagian file. Ini bisa menandakan adanya perubahan setelah penandatanganan (belum tentu berbahaya, karena penyimpanan inkremental menghasilkan cakupan sebagian). + +## Detail Tanda Tangan + +Setiap kartu tanda tangan menampilkan: + +- **Ditandatangani Oleh**: Nama umum, organisasi, dan email dari sertifikat penanda tangan +- **Penerbit**: Otoritas Sertifikat yang menerbitkan sertifikat penanda tangan +- **Ditandatangani Pada**: Cap waktu yang tertanam dalam tanda tangan +- **Berlaku Dari / Berlaku Hingga**: Masa berlaku sertifikat +- **Alasan**: Mengapa dokumen ditandatangani (jika diberikan) +- **Lokasi**: Di mana dokumen ditandatangani (jika diberikan) +- **Status Cakupan**: Penuh atau Sebagian +- **Lencana Kepercayaan**: Tepercaya atau Tidak dalam rantai kepercayaan (hanya jika sertifikat kustom diberikan) + +### Detail Teknis + +Perluas bagian detail teknis untuk melihat: + +- Nomor seri sertifikat penanda tangan +- Algoritma digest (SHA-256, SHA-512, dll.) +- Algoritma tanda tangan (RSA dengan SHA-256, ECDSA dengan SHA-256, dll.) +- Pesan error untuk tanda tangan yang tidak valid + +## Kasus Penggunaan + +- Memverifikasi kontrak bertanda tangan digital sebelum ikut menandatangani +- Mengaudit dokumen bertanda tangan untuk memastikan tidak dimanipulasi +- Memeriksa apakah sertifikat sudah kedaluwarsa sejak dokumen ditandatangani +- Memvalidasi tanda tangan terhadap sertifikat root organisasi Anda +- Memeriksa detail penandatanganan dokumen pemerintah atau hukum + +## Tips + +- Sertifikat yang ditandatangani sendiri tidak berarti tanda tangannya tidak valid, melainkan identitas penanda tangan tidak dapat diverifikasi lewat pihak ketiga tepercaya. Ini umum pada dokumen internal. +- Cakupan sebagian tidak selalu menandakan manipulasi. Banyak alur kerja PDF menambahkan pembaruan inkremental (seperti tanda tangan kedua) yang menghasilkan cakupan sebagian. +- Unggah sertifikat root atau intermediate organisasi Anda sebagai sertifikat tepercaya untuk mendapatkan verifikasi rantai kepercayaan. + +## Alat Terkait + +- [Tanda Tangan Digital PDF](./digital-sign-pdf): tandatangani PDF dengan sertifikat Anda sendiri +- [Ratakan PDF](./flatten-pdf): ratakan PDF sebelum ditandatangani untuk mencegah perubahan setelah penandatanganan +- [Hapus Metadata](./remove-metadata): bersihkan PDF sebelum menerapkan tanda tangan diff --git a/docs/id/tools/view-metadata.md b/docs/id/tools/view-metadata.md new file mode 100644 index 00000000..c436934a --- /dev/null +++ b/docs/id/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Lihat Metadata +description: Periksa semua properti metadata PDF termasuk info dokumen, data XMP, dan detail struktural. +--- + +# Lihat Metadata + +Periksa properti tersembunyi yang tertanam dalam file PDF. Alat ini menampilkan informasi dokumen (judul, penulis, tanggal), metadata XMP, dimensi halaman, dan data struktural lainnya dalam format yang mudah dibaca. + +## Cara Kerja + +1. Unggah file PDF. +2. Alat langsung mengurai file dan menampilkan semua metadata yang tersedia dalam bagian-bagian terorganisasi. +3. Tinjau kamus info dokumen, pohon metadata XMP, dan properti struktural. +4. Tidak perlu langkah pemrosesan: metadata ditampilkan segera setelah file dimuat. + +## Fitur + +- Menampilkan kolom info dokumen standar: Judul, Penulis, Subjek, Kata Kunci, Pembuat, Produsen +- Menampilkan tanggal pembuatan dan modifikasi dalam format yang mudah dibaca +- Mengurai dan merender seluruh pohon metadata XMP dengan namespace bersarang +- Mengonversi format tanggal PDF (`D:20240101120000Z`) menjadi tanggal yang mudah dibaca +- Disusun dalam bagian yang bisa dilipat agar mudah dinavigasi + +## Bagian Metadata + +| Bagian | Isi | +| -------------------- | -------------------------------------------------------------------------------------------- | +| **Info Dokumen** | Judul, Penulis, Subjek, Kata Kunci, Pembuat, Produsen, Tanggal Pembuatan, Tanggal Modifikasi | +| **Metadata XMP** | Pohon metadata berbasis XML lengkap dengan namespace Dublin Core, XAP, PDF, dan kustom | +| **Properti Dokumen** | Jumlah halaman, versi PDF, ukuran file, status enkripsi | + +## Kasus Penggunaan + +- Memeriksa siapa yang menulis PDF dan kapan terakhir diubah +- Memastikan metadata sudah diatur dengan benar sebelum menerbitkan dokumen +- Mengaudit PDF untuk privasi dengan memeriksa informasi pribadi apa yang tertanam +- Menyelidiki perangkat lunak yang dipakai untuk membuat atau mengubah PDF (lewat kolom Produsen) +- Meninjau metadata XMP untuk kepatuhan manajemen aset digital + +## Tips + +- String tanggal PDF yang diawali `D:` otomatis dikonversi ke format zona waktu lokal Anda. +- Jika kolom metadata tampak kosong, berarti pembuat PDF memang tidak mengisinya. Tidak semua PDF memiliki metadata yang kaya. +- Untuk mengubah metadata setelah memeriksanya, gunakan [Edit Metadata](./edit-metadata). Untuk menghapusnya sepenuhnya, gunakan Hapus Metadata. + +## Alat Terkait + +- [Edit Metadata](./edit-metadata) +- [Lapisan OCG PDF](./pdf-layers) +- [Bandingkan PDF](./compare-pdfs) diff --git a/docs/id/tools/vsd-to-pdf.md b/docs/id/tools/vsd-to-pdf.md new file mode 100644 index 00000000..5b3cd615 --- /dev/null +++ b/docs/id/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD ke PDF +description: Konversi diagram Microsoft Visio (VSD/VSDX) ke PDF di browser Anda. Gratis, privat, tanpa perlu Visio. +--- + +# VSD ke PDF + +Konversi diagram Microsoft Visio menjadi PDF tanpa menginstal Visio. File VSD dan VSDX berisi diagram alur, bagan organisasi, diagram jaringan, dan denah yang tidak bisa dibuka kebanyakan orang. Alat ini merendernya menjadi PDF bersih yang bisa dilihat di perangkat apa pun. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----------- | :------- | :-------------------------------------------- | +| Visio Binary | `.vsd` | Format Visio lama (Visio 2003 dan sebelumnya) | +| Visio XML | `.vsdx` | Format Visio modern (Visio 2013+) | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file VSD atau VSDX Anda. Kedua format bisa dicampur dalam satu batch. +2. Tinjau daftar file. Hapus entri yang tidak diinginkan dengan ikon tempat sampah, atau gunakan **Tambah Lebih Banyak File** untuk menambah diagram. +3. Klik **Konversi ke PDF**. Mesin berbasis LibreOffice dimuat di browser dan merender setiap diagram menjadi PDF, dengan mempertahankan bentuk, konektor, label, dan tata letak halaman. +4. Satu diagram langsung diunduh sebagai PDF. Beberapa file menghasilkan arsip ZIP bernama `vsd-to-pdf.zip`. + +## Opsi + +Tidak diperlukan konfigurasi. Konverter mengikuti ukuran dan orientasi halaman asli dari dokumen Visio. + +## Kasus Penggunaan + +- Meninjau diagram Visio dari rekan kerja saat Anda tidak punya lisensi Visio +- Menyertakan diagram jaringan atau arsitektur dalam dokumentasi proyek sebagai PDF +- Mencetak bagan organisasi atau alur proses sebagai handout rapat +- Mengarsipkan file VSD lama dari Visio versi lama dalam format yang tahan masa depan + +## Tips + +- Dokumen Visio multi-halaman menghasilkan PDF multi-halaman, dengan setiap halaman Visio menjadi satu halaman PDF. +- File VSDX (format modern berbasis XML) umumnya dikonversi dengan fidelitas lebih tinggi daripada file biner VSD yang lebih lama. +- Mesin LibreOffice dimuat sekali per sesi. Harap tunggu sebentar pada konversi pertama, dan file berikutnya akan lebih cepat. + +## Alat Terkait + +- [ODG ke PDF](./odg-to-pdf) +- [PUB ke PDF](./pub-to-pdf) +- [PSD ke PDF](./psd-to-pdf) diff --git a/docs/id/tools/webp-to-pdf.md b/docs/id/tools/webp-to-pdf.md new file mode 100644 index 00000000..e983bc90 --- /dev/null +++ b/docs/id/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP ke PDF +description: Konversi gambar WebP ke format PDF langsung di browser Anda dengan kualitas kompresi yang bisa diatur. +--- + +# WebP ke PDF + +Konversi format gambar WebP milik Google ke PDF. Ini sangat berguna ketika Anda mengunduh gambar dari web dalam format WebP dan memerlukannya dalam format yang lebih umum diterima untuk dicetak atau dibagikan. + +## Format yang Didukung + +| Format | Ekstensi | +| :----- | :------- | +| WebP | `.webp` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file WebP Anda. +2. Tinjau daftar file dan hapus file yang tidak diperlukan. +3. Pilih tingkat **Kualitas PDF**. +4. Klik **Konversi ke PDF**. Hasilnya diunduh sebagai `from_webps.pdf`. + +Secara internal, setiap gambar WebP didekode melalui API canvas browser, lalu disematkan ke PDF menggunakan pdf-lib. Artinya konversi berfungsi di browser mana pun yang mendukung dekode WebP (semua browser modern mendukungnya). + +## Opsi + +**Kualitas PDF** mengatur kompresi saat menyematkan gambar: + +- **Kualitas Tinggi**: mempertahankan detail terbanyak. +- **Kualitas Sedang** (default): hasil yang seimbang. +- **Kualitas Rendah**: ukuran file terkecil. + +## Kasus Penggunaan + +- Mengonversi gambar unduhan web yang tersimpan sebagai WebP menjadi PDF yang bisa dicetak +- Mengemas tangkapan layar WebP dari Chrome atau Edge ke dalam dokumentasi +- Membuat portofolio PDF dari gambar yang diekspor alat desain yang memakai WebP secara default +- Mengarsipkan gambar WebP dalam format yang lebih umum dibaca + +## Tips + +- WebP didekode ke PNG secara internal sebelum disematkan ke PDF, sehingga gambar WebP lossless mempertahankan kualitasnya pada pengaturan Tinggi. +- Jika Anda punya campuran WebP dan format gambar lain, gunakan alat [Gambar ke PDF](./image-to-pdf), yang menerima semuanya sekaligus. + +## Alat Terkait + +- [Gambar ke PDF](./image-to-pdf) +- [PNG ke PDF](./png-to-pdf) +- [JPG ke PDF](./jpg-to-pdf) diff --git a/docs/id/tools/word-to-pdf.md b/docs/id/tools/word-to-pdf.md new file mode 100644 index 00000000..b29123a3 --- /dev/null +++ b/docs/id/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word ke PDF +description: Konversi dokumen Word (DOC, DOCX), ODT, dan RTF ke PDF di browser Anda dengan format yang terjaga sepenuhnya. +--- + +# Word ke PDF + +Konversi dokumen Microsoft Word dan format yang kompatibel ke PDF. Alat ini memakai mesin LibreOffice berbasis browser yang menangani file DOC, DOCX, ODT, dan RTF, dengan mempertahankan format, tabel, gambar, header, footer, dan gaya pada hasil. + +## Format yang Didukung + +| Format | Ekstensi | +| :---------------- | :------- | +| Word (modern) | `.docx` | +| Word (lama) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas dokumen Word Anda. Beberapa file bisa dipilih sekaligus. +2. Tinjau dan kelola daftar file. +3. Klik **Konversi ke PDF**. Mesin LibreOffice dimuat saat pertama digunakan (indikator progres menampilkan status inisialisasi), lalu setiap file dikonversi. +4. Satu file langsung diunduh sebagai PDF. Beberapa file dikemas dalam `word-converted.zip`. + +## Opsi + +Alat ini tidak memiliki pengaturan tambahan. Mesin LibreOffice menghasilkan keluaran dengan profil ekspor PDF default-nya. + +## Keluaran + +| Jumlah Masukan | Keluaran | +| :------------- | :----------------------------------------------------------------- | +| 1 file | Satu PDF diunduh (nama file asli dengan ekstensi `.pdf`) | +| 2+ file | Arsip ZIP (`word-converted.zip`) berisi satu PDF untuk setiap file | + +## Kasus Penggunaan + +- Mengonversi resume atau surat lamaran dari DOCX ke PDF sebelum melamar kerja +- Mengonversi sekumpulan kontrak atau proposal ke PDF secara massal untuk dikirim ke klien +- Mengubah file `.doc` lama menjadi PDF modern untuk pengarsipan jangka panjang +- Mengonversi dokumen kolaboratif dari Google Docs (diekspor sebagai DOCX) ke PDF +- Membuat PDF siap cetak dari templat Word yang dipakai untuk pembuatan dokumen otomatis + +## Tips + +- Mesin LibreOffice diunduh sekali per sesi dan di-cache. Harap tunggu beberapa detik saat konversi pertama, dan konversi berikutnya jauh lebih cepat. +- Format yang kompleks (makro, kontrol ActiveX, SmartArt tingkat lanjut) mungkin tidak terkonversi dengan sempurna. Elemen dokumen standar (teks, tabel, gambar, header, catatan kaki) terkonversi dengan andal. +- Karena alat ini juga menerima ODT dan RTF, Anda bisa memakainya sebagai konverter serbaguna untuk semua format pengolah kata. + +## Alat Terkait + +- [ODT ke PDF](./odt-to-pdf) +- [RTF ke PDF](./rtf-to-pdf) +- [Excel ke PDF](./excel-to-pdf) +- [PowerPoint ke PDF](./powerpoint-to-pdf) diff --git a/docs/id/tools/wpd-to-pdf.md b/docs/id/tools/wpd-to-pdf.md new file mode 100644 index 00000000..42065ad2 --- /dev/null +++ b/docs/id/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD ke PDF +description: Konversi dokumen WordPerfect (WPD) ke PDF di browser Anda memakai LibreOffice. Gratis dan privat. +--- + +# WPD ke PDF + +Konversi dokumen Corel WordPerfect menjadi file PDF. WPD dulu adalah format pengolah kata dominan di kantor hukum dan instansi pemerintah. Jika Anda punya file WordPerfect lama yang tidak mau dibuka perangkat lunak modern, alat ini menghidupkannya kembali sebagai PDF standar. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :---------- | :------- | :---------------------------- | +| WordPerfect | `.wpd` | Semua versi WordPerfect utama | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file WPD Anda. Beberapa file bisa dipilih sekaligus. +2. Tinjau daftar file. Hapus file yang tidak diinginkan dengan ikon tempat sampah, atau gunakan **Tambah Lebih Banyak File** untuk menambah dokumen. +3. Klik **Konversi ke PDF**. Alat memuat mesin konversi berbasis LibreOffice di browser Anda, yang mengurai format WPD dan menghasilkan PDF. +4. Satu file langsung diunduh sebagai PDF. Konversi massal menghasilkan arsip ZIP bernama `wpd-to-pdf.zip`. + +## Opsi + +Tidak diperlukan konfigurasi. Mesin LibreOffice menangani format, font, dan tata letak WPD secara otomatis. + +## Kasus Penggunaan + +- Membuka dokumen hukum berusia puluhan tahun yang ditulis di WordPerfect +- Mengonversi arsip berkas pemerintah dari WPD ke format modern +- Memigrasikan pustaka dokumen WordPerfect lama ke PDF untuk penyimpanan jangka panjang +- Membagikan file WPD kepada penerima yang tidak memasang Corel WordPerfect + +## Tips + +- Mesin LibreOffice dimuat saat pertama digunakan, yang membutuhkan waktu sebentar. Konversi berikutnya dalam sesi yang sama lebih cepat. +- Makro WPD yang kompleks dan reveal codes tidak dipertahankan, tetapi tata letak visual, isi teks, dan format dasar terbawa ke PDF. + +## Alat Terkait + +- [WPS ke PDF](./wps-to-pdf) +- [ODG ke PDF](./odg-to-pdf) diff --git a/docs/id/tools/wps-to-pdf.md b/docs/id/tools/wps-to-pdf.md new file mode 100644 index 00000000..3b0f1cb3 --- /dev/null +++ b/docs/id/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS ke PDF +description: Konversi dokumen Microsoft Works (WPS) ke PDF di browser Anda. Gratis, tanpa daftar, sepenuhnya privat. +--- + +# WPS ke PDF + +Konversi file pengolah kata Microsoft Works menjadi PDF. Microsoft Works dulu disertakan pada PC konsumen sepanjang akhir 1990-an dan 2000-an, dan banyak file WPS masih tersimpan di hard drive dan arsip email lama. Alat ini membukanya di browser dan menghasilkan PDF yang bersih. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :-------------- | :------- | :-------------------------------------- | +| Microsoft Works | `.wps` | File pengolah kata dari Microsoft Works | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file WPS Anda. Beberapa file diterima. +2. Tinjau daftar file. Gunakan ikon tempat sampah untuk menghapus file tertentu, atau klik **Tambah Lebih Banyak File** untuk memperbesar batch. +3. Klik **Konversi ke PDF**. Mesin berbasis LibreOffice dimuat di browser dan mengonversi setiap dokumen WPS ke PDF. +4. Satu file langsung diunduh sebagai PDF. Beberapa file dikemas dalam arsip ZIP bernama `wps-to-pdf.zip`. + +## Opsi + +Tidak ada pengaturan tambahan. Konverter menangani teks, format dasar, dan gambar tertanam dari file WPS. + +## Kasus Penggunaan + +- Memulihkan dokumen sekolah atau kerja lama yang tersimpan dalam format Microsoft Works +- Membuka lampiran email WPS ketika Microsoft Works tidak terpasang +- Mengonversi arsip file WPS untuk migrasi ke sistem dokumen modern +- Mencetak dokumen lama yang tidak bisa dibuka pengolah kata saat ini + +## Tips + +- Jangan campuradukkan file `.wps` Microsoft Works dengan file WPS Office. Alat ini khusus untuk format Microsoft Works yang lebih lama. +- Mesin LibreOffice membutuhkan waktu sebentar untuk dimuat saat pertama digunakan. Setelah dimuat, konversi berikutnya dalam sesi yang sama berjalan lebih cepat. + +## Alat Terkait + +- [WPD ke PDF](./wpd-to-pdf) +- [PUB ke PDF](./pub-to-pdf) diff --git a/docs/id/tools/xml-to-pdf.md b/docs/id/tools/xml-to-pdf.md new file mode 100644 index 00000000..67b4b08e --- /dev/null +++ b/docs/id/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML ke PDF +description: Konversi file XML menjadi dokumen PDF terstruktur di browser Anda. Gratis, privat, tanpa pemrosesan di server. +--- + +# XML ke PDF + +Konversi file data XML menjadi dokumen PDF terstruktur yang mudah dibaca. XML mentah itu andal tetapi sulit dibaca manusia. Alat ini mengurai pohon XML, mengenali struktur data berulang, dan merendernya sebagai tabel dan bagian terformat dalam PDF A4 lanskap. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----- | :------- | :----------------------------------- | +| XML | `.xml` | Dokumen XML apa pun yang well-formed | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file XML Anda. Beberapa file bisa diproses dalam satu batch. +2. Tinjau daftar file. Hapus file yang tidak diinginkan dengan ikon tempat sampah, atau klik **Tambah Lebih Banyak File** untuk menambah file. +3. Klik **Konversi ke PDF**. Alat mengurai struktur XML memakai DOMParser bawaan browser, menganalisis hierarki data, dan merendernya ke PDF memakai jsPDF dengan pemformatan auto-table. +4. Satu file diunduh sebagai PDF. Beberapa hasil konversi dikemas dalam `xml-to-pdf.zip`. + +## Opsi + +Tidak diperlukan konfigurasi manual. Konverter mendeteksi struktur XML secara otomatis dan memilih tata letak tabel yang sesuai. Keluaran memakai orientasi A4 lanskap untuk menampung kumpulan data yang lebar. + +## Kasus Penggunaan + +- Mengubah ekspor data XML dari basis data atau API menjadi laporan yang bisa dicetak +- Membuat ringkasan yang mudah dibaca dari file konfigurasi XML +- Mengonversi faktur atau log transaksi berbasis XML menjadi PDF untuk pencatatan +- Membuat peta situs XML atau feed RSS mudah dibaca dalam bentuk dokumen + +## Tips + +- XML harus well-formed. Jika parser menemukan kesalahan sintaks, konversi akan gagal dengan pesan error deskriptif yang menunjuk masalahnya. +- Struktur XML yang bersarang dalam diratakan menjadi tabel. Untuk hasil terbaik, data sebaiknya memiliki elemen saudara berulang dengan elemen anak yang konsisten. +- Pembaruan progres muncul selama konversi, menampilkan setiap fase: membaca, mengurai, menganalisis, dan merender. + +## Alat Terkait + +- [FB2 ke PDF](./fb2-to-pdf) +- [XPS ke PDF](./xps-to-pdf) +- [Email ke PDF](./email-to-pdf) diff --git a/docs/id/tools/xps-to-pdf.md b/docs/id/tools/xps-to-pdf.md new file mode 100644 index 00000000..9d30ea32 --- /dev/null +++ b/docs/id/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS ke PDF +description: Konversi dokumen XPS dan OXPS ke format PDF di browser Anda. Tanpa unggah, tanpa daftar, sepenuhnya privat. +--- + +# XPS ke PDF + +Konversi dokumen Microsoft XPS dan OXPS menjadi file PDF standar. XPS (XML Paper Specification) adalah jawaban Microsoft atas PDF, tetapi dukungannya makin menyusut di berbagai platform. Alat ini membuat dokumen tersebut dapat dibaca secara universal lagi. + +## Format yang Didukung + +| Format | Ekstensi | Catatan | +| :----- | :------- | :-------------------------------- | +| XPS | `.xps` | Format XPS asli Microsoft | +| OXPS | `.oxps` | Open XPS, varian standar ECMA-388 | + +## Cara Kerja + +1. Klik area unggah atau seret dan lepas file XPS/OXPS Anda. Anda bisa memilih beberapa file sekaligus. +2. Tinjau daftar file. Hapus file tertentu dengan ikon tempat sampah, atau klik **Tambah Lebih Banyak File** untuk menambah dokumen. +3. Klik **Konversi ke PDF**. Mesin PyMuPDF memproses setiap dokumen secara lokal di browser Anda. +4. Satu file langsung diunduh sebagai PDF. Beberapa file dikemas dalam arsip ZIP bernama `xps-converted.zip`. + +## Opsi + +Alat ini melakukan konversi format langsung tanpa konfigurasi tambahan. Keluaran mempertahankan dimensi halaman, grafik vektor, font, dan gambar asli dari sumber XPS. + +## Kasus Penggunaan + +- Membuka file XPS dari sistem Windows lama yang memakai driver cetak XPS secara default +- Mengonversi dokumen OXPS dari Windows 10/11 untuk dibagikan ke pengguna macOS atau Linux +- Mengarsipkan file XPS lama ke format yang lebih luas didukung +- Membuat dokumen pemerintah atau perusahaan berbasis XPS dapat diakses oleh penerima eksternal + +## Tips + +- Ekstensi `.xps` dan `.oxps` ditangani otomatis, jadi Anda bisa mencampurnya dalam batch yang sama. +- Jika file XPS asli dibuat dari driver cetak beresolusi tinggi, PDF hasilnya mempertahankan kualitas itu. Tidak ada resampling. + +## Alat Terkait + +- [Word ke PDF](./word-to-pdf) +- [XML ke PDF](./xml-to-pdf) diff --git a/docs/it/contributing.md b/docs/it/contributing.md new file mode 100644 index 00000000..5672f4d2 --- /dev/null +++ b/docs/it/contributing.md @@ -0,0 +1,136 @@ +# Contribuire + +Grazie per l'interesse a contribuire a BentoPDF! Questa guida ti aiuterà a iniziare. + +## Per iniziare + +### Prerequisiti + +- Node.js 18+ +- npm 9+ +- Git + +### Configurazione + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Struttura del progetto + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Aggiungere un nuovo strumento + +### Passaggio 1: crea il file della logica + +Crea `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Passaggio 2: crea la pagina HTML + +Crea `src/pages/your-tool.html` seguendo i modelli degli strumenti esistenti. + +### Passaggio 3: registra lo strumento + +Aggiungi a `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Passaggio 4: aggiungi alla configurazione di build + +Aggiungi la pagina a `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Passaggio 5: aggiungi le traduzioni + +Aggiungi le voci a tutti i file delle lingue in `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Stile del codice + +- Usa TypeScript per tutto il nuovo codice +- Segui i pattern esistenti per coerenza +- Esegui `npm run format` prima del commit +- Nessun commento nel codice di produzione (i commenti vengono rimossi durante la build) + +## Processo delle pull request + +1. Crea un branch per la funzionalità: `git checkout -b feature/your-feature` +2. Apporta le tue modifiche +3. Testa con attenzione: `npm run build` +4. Invia una PR con una descrizione chiara + +## Traduzione + +Consulta [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) per aggiungere nuove lingue. + +## Contributor License Agreement + +Prima che la tua PR possa essere unita, dovrai firmare la nostra CLA: + +- [CLA individuale (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA aziendale (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Ottenere aiuto + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Community Discord](https://discord.gg/Bgq3Ay3f2w) + +## Licenza + +BentoPDF ha una doppia licenza: + +- **AGPL-3.0** per i progetti open source in cui condividi pubblicamente tutto il codice sorgente +- **Licenza commerciale** per le applicazioni proprietarie o closed source: [Ottieni la licenza a vita per $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Contribuendo, accetti che i tuoi contributi siano concessi in licenza secondo questi termini. diff --git a/docs/it/getting-started.md b/docs/it/getting-started.md new file mode 100644 index 00000000..efa3a064 --- /dev/null +++ b/docs/it/getting-started.md @@ -0,0 +1,80 @@ +# Per iniziare + +Benvenuto in BentoPDF! Questa guida ti aiuterà a metterti in funzione rapidamente. + +## Cos'è BentoPDF? + +BentoPDF è un kit di strumenti PDF gratuito, open source e pensato per la privacy, che funziona **interamente nel tuo browser**. I tuoi file non lasciano mai il dispositivo: tutta l'elaborazione avviene in locale grazie alla tecnologia WebAssembly (WASM). + +## Avvio rapido + +### Opzione 1: usa la versione ospitata + +Visita [bentopdf.com](https://www.bentopdf.com) per usare BentoPDF subito, senza installare nulla. + +### Opzione 2: self-hosting con Docker + +> [!IMPORTANT] +> La conversione dei file Office richiede `SharedArrayBuffer`, che necessita di entrambi: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - un contesto sicuro +> +> `http://localhost` funziona per i test in locale perché i browser considerano affidabile il loopback. `http://192.168.x.x` o altri IP di rete locale di solito no, quindi le conversioni di Word/Excel/PowerPoint richiederanno HTTPS quando si accede da altri dispositivi della tua rete. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF è disponibile in due build: la **build self-hosted** (`bentopdf-simple`, usata sopra) per installazioni interne, di team o di organizzazioni, e la **build commerciale** (`bentopdf:latest`) usata da bentopdf.com stesso e dai titolari di una licenza commerciale che gestiscono installazioni pubbliche. Entrambe includono gli stessi strumenti PDF: la build commerciale aggiunge hero, FAQ, testimonianze e footer di bentopdf.com. Se hai dubbi, usa la build self-hosted. + +Poi apri `http://localhost:3000` nel browser. + +> [!NOTE] +> Se stai preparando un'installazione OCR in ambiente air-gapped, devi ospitare internamente anche i font del livello di testo OCR, oltre al worker Tesseract, al runtime core e ai file traineddata. La configurazione completa è descritta in [Self-hosting](/it/self-hosting/), inclusi `VITE_OCR_FONT_BASE_URL` e la cartella inclusa `ocr-fonts/`. + +### Opzione 3: compila dai sorgenti + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funzionalità in sintesi + +| Categoria | Strumenti | +| --------------------- | --------------------------------------------------------------- | +| **Converti in PDF** | Word, Excel, PowerPoint, immagini, Markdown, EPUB, MOBI e altro | +| **Converti da PDF** | JPG, PNG, testo, Excel, SVG e altro | +| **Modifica e annota** | Firma, evidenzia, oscura, compila moduli, aggiungi timbri | +| **Organizza** | Unisci, dividi, ruota, elimina pagine, riordina | +| **Ottimizza** | Comprimi, ripara, appiattisci, OCR | +| **Sicurezza** | Cifra, decifra, rimuovi restrizioni | + +## Browser supportati + +BentoPDF funziona al meglio sui browser moderni: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Prossimi passi + +- [Esplora tutti gli strumenti](/it/tools/) +- [Installa BentoPDF sul tuo server](/it/self-hosting/) +- [Contribuisci al progetto](/it/contributing) diff --git a/docs/it/index.md b/docs/it/index.md new file mode 100644 index 00000000..0730a75a --- /dev/null +++ b/docs/it/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Strumenti PDF gratuiti e open source' + tagline: Elabora i PDF interamente nel tuo browser. Nessun caricamento. Nessun server. Privacy totale. + actions: + - theme: brand + text: Inizia + link: /it/getting-started + - theme: alt + text: Vedi gli strumenti + link: /it/tools/ + - theme: alt + text: Self-hosting + link: /it/self-hosting/ + - theme: alt + text: Licenza commerciale + link: /it/licensing + +features: + - icon: 🔒 + title: 100% privato + details: I tuoi file non lasciano mai il dispositivo. Tutta l'elaborazione avviene in locale nel browser grazie a WebAssembly. + - icon: ⚡ + title: Veloce e gratuito + details: Nessuna registrazione, nessun limite, nessuna filigrana. Elabora PDF senza limiti, gratis e per sempre. + - icon: 🛠️ + title: Oltre 50 strumenti + details: Converti, modifica, unisci, dividi, comprimi, firma, OCR e altro. Tutto ciò che ti serve in un unico posto. + + - icon: 🌐 + title: Installabile sul tuo server + details: Distribuiscilo sulla tua infrastruttura. Docker, Vercel, Netlify, AWS o ambienti completamente air-gapped con worker OCR, dati linguistici e font del livello di testo ospitati da te. +--- + +## OCR offline + +Se ospiti BentoPDF in un ambiente air-gapped o offline, l'OCR richiede più del worker Tesseract e dei file traineddata. Per ottenere PDF ricercabili, anche i font del livello di testo OCR devono essere serviti internamente. +Consulta [Self-hosting](/it/self-hosting/) per la configurazione completa, inclusi `VITE_OCR_FONT_BASE_URL`, la cartella inclusa `ocr-fonts/` e il flusso di lavoro air-gap aggiornato. diff --git a/docs/it/licensing.md b/docs/it/licensing.md new file mode 100644 index 00000000..9c36ff67 --- /dev/null +++ b/docs/it/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/it/self-hosting/#configurazione-wasm-componenti-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/it/self-hosting/apache.md b/docs/it/self-hosting/apache.md new file mode 100644 index 00000000..8d0d208b --- /dev/null +++ b/docs/it/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Distribuzione con Apache + +Ospita BentoPDF usando Apache HTTP Server. + +## Prerequisiti + +- Apache 2.4+ +- mod_rewrite abilitato +- Certificato SSL (consigliato) + +## Passaggio 1: compila il progetto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Per personalizzare il marchio, imposta le variabili d'ambiente prima della build: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Passaggio 2: copia i file + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Passaggio 3: configurazione di Apache + +Crea `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Passaggio 4: .htaccess per il routing + +Crea `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Passaggio 5: abilita i moduli necessari + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Passaggio 6: abilita il sito + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Distribuzione in una sottodirectory + +Per ospitarlo in `/pdf/`: + +1. Compila con l'URL di base: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Aggiorna `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Risoluzione dei problemi + +### Errori 404 sui file WASM + +Assicurati che il tipo MIME sia configurato: + +```apache +AddType application/wasm .wasm +``` + +### Firma PDF o Compilazione moduli mostra un visualizzatore vuoto (errore MIME `.mjs`) + +Se la console del browser mostra: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…e la richiesta che fallisce termina in `.mjs`, nella tua configurazione di Apache manca la mappatura `.mjs → application/javascript`. Il visualizzatore PDF incluso usa file ES module con estensione `.mjs`, che il `mime.types` predefinito di Apache non contiene. + +Aggiungi al tuo VirtualHost o a `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Poi ricarica Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Per verificare: negli DevTools del browser, scheda Network, trova la richiesta `.mjs` che falliva e controlla l'header di risposta `Content-Type`. Ora dovrebbe essere `application/javascript`, non `application/octet-stream`. + +### Le regole di rewrite non funzionano + +Verifica che mod_rewrite sia abilitato: + +```bash +sudo a2enmod rewrite +``` + +### La conversione da Word/ODT/Excel a PDF non funziona + +LibreOffice WASM richiede `SharedArrayBuffer`, che necessita di questi header: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Serve anche un contesto sicuro. `http://localhost` funziona per i test in locale, ma `http://192.168.x.x` o altri IP di rete locale di solito richiedono HTTPS. Se gli header sono presenti ma `window.crossOriginIsolated` è ancora `false`, controlla se la pagina viene aperta tramite HTTP semplice su un'origine diversa dal loopback. + +Anche i file precompressi `.wasm.gz` e `.data.gz` richiedono un `Content-Encoding` corretto: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Assicurati che `mod_headers` sia abilitato: `sudo a2enmod headers` + +### Permesso negato + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/it/self-hosting/aws.md b/docs/it/self-hosting/aws.md new file mode 100644 index 00000000..b3712b7e --- /dev/null +++ b/docs/it/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Distribuzione su AWS S3 + CloudFront + +Ospita BentoPDF su AWS per il massimo controllo e la massima scalabilità. + +## Architettura + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Passaggio 1: crea il bucket S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Passaggio 2: compila e carica + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Passaggio 3: crea la distribuzione CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Oppure usa la console AWS: + +1. Vai su CloudFront → Create distribution +2. Origin domain: seleziona il tuo bucket S3 +3. Abilita "Origin Access Control" +4. Default root object: `index.html` +5. Crea la distribuzione + +## Passaggio 3b: policy degli header di risposta (necessaria per LibreOffice WASM) + +Le conversioni basate su LibreOffice (da Word, Excel, PowerPoint a PDF) richiedono `SharedArrayBuffer`, che necessita di specifici header di risposta. Crea una Response Headers Policy di CloudFront: + +1. Vai su CloudFront → Policies → Response headers +2. Crea una policy personalizzata con questi header: + +| Header | Valore | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Associa la policy al default cache behavior della tua distribuzione + +Oppure tramite CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Passaggio 3c: metadati S3 per i file WASM precompressi + +I file WASM di LibreOffice sono precompressi (`.wasm.gz`, `.data.gz`). Imposta Content-Type e Content-Encoding corretti in modo che i browser li decomprimano: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Importante +Senza la policy degli header di risposta, `SharedArrayBuffer` non è disponibile e le conversioni LibreOffice WASM si bloccheranno intorno al 55%. Senza il Content-Encoding corretto sui file `.gz`, il browser riceve i byte gzip grezzi e la compilazione WASM fallisce. +::: + +## Passaggio 4: policy del bucket S3 + +Consenti a CloudFront di accedere al bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Passaggio 5: pagine di errore personalizzate + +Configura il 404 in modo che restituisca `index.html` per il routing SPA: + +1. CloudFront → Error pages +2. Crea una risposta di errore personalizzata: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Stima dei costi + +| Risorsa | Costo stimato | +| -------------------------- | ------------- | +| S3 Storage (~500MB) | ~$0,01/mese | +| CloudFront (1TB transfer) | ~$85/mese | +| CloudFront (10GB transfer) | ~$0,85/mese | + +::: tip +Usa S3 Intelligent Tiering per ottimizzare i costi dei file a cui si accede di rado. +::: + +## Automazione con Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/it/self-hosting/cloudflare.md b/docs/it/self-hosting/cloudflare.md new file mode 100644 index 00000000..ca2e035b --- /dev/null +++ b/docs/it/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Distribuzione su Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) offre hosting di siti statici veloce e globale con banda illimitata. + +## Distribuzione rapida + +1. Vai su [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Clicca su "Create a project" +3. Collega il tuo repository GitHub + +## Configurazione della build + +| Impostazione | Valore | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Variabili d'ambiente + +Aggiungile in Settings → Environment variables: + +| Variabile | Valore | +| ----------------------- | ----------------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (facoltativo) | +| `VITE_BRAND_NAME` | Nome del marchio personalizzato (facoltativo) | +| `VITE_BRAND_LOGO` | Percorso del logo relativo a `public/` (facoltativo) | +| `VITE_FOOTER_TEXT` | Testo personalizzato del footer/copyright (facoltativo) | +| `VITE_DEFAULT_LANGUAGE` | Lingua predefinita dell'interfaccia, es. `fr` (facoltativo) | + +## File di configurazione + +Crea `_headers` nella tua cartella `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Importante +Gli header `Cross-Origin-Embedder-Policy` e `Cross-Origin-Opener-Policy` sono necessari per le conversioni da Word/ODT/Excel/PowerPoint a PDF. Senza di essi, `SharedArrayBuffer` non è disponibile e il motore LibreOffice WASM non riesce a inizializzarsi. +::: + +Crea `_redirects` per il routing SPA: + +``` +/* /index.html 200 +``` + +## Dominio personalizzato + +1. Vai al tuo progetto Pages +2. Clicca su "Custom domains" +3. Aggiungi il tuo dominio +4. Cloudflare configurerà automaticamente il DNS se il dominio è su Cloudflare + +## Vantaggi + +- **Banda illimitata gratuita** +- **CDN globale** con oltre 300 sedi edge +- **HTTPS automatico** +- **Anteprime di distribuzione** per le pull request +- **Build veloci** + +## Risoluzione dei problemi + +### Caricamento di file di grandi dimensioni + +Cloudflare Pages supporta file fino a 25 MB. I moduli WASM dovrebbero andare bene, ma se raggiungi i limiti, valuta: + +```bash +# Split large files during build +npm run build +``` + +### Limiti di dimensione dei Worker + +Se usi Cloudflare Workers per un routing avanzato, tieni presente il limite di 1 MB dei piani gratuiti. + +## Worker proxy CORS (per le firme digitali) + +Lo strumento di firma digitale richiede un proxy CORS per recuperare le catene di certificati. Distribuisci il worker incluso: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Funzionalità di sicurezza + +| Funzionalità | Descrizione | +| ---------------------------- | ---------------------------------- | +| **Restrizioni sugli URL** | Consentiti solo URL di certificati | +| **Limite di dimensione** | Max 10MB per richiesta | +| **Limitazione di frequenza** | 60 richieste/IP/min (richiede KV) | +| **Blocco degli IP privati** | Blocca localhost e IP interni | + +### Abilitare la limitazione di frequenza + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Compilare con l'URL del proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Oppure con Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Nota:** consulta il [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) per la configurazione della firma HMAC. diff --git a/docs/it/self-hosting/cors-proxy.md b/docs/it/self-hosting/cors-proxy.md new file mode 100644 index 00000000..1634c602 --- /dev/null +++ b/docs/it/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Proxy CORS per il recupero dei certificati + +Lo strumento di firma digitale usa un proxy CORS per recuperare i certificati degli emittenti da Certificate Authority (CA) esterne. È necessario perché molti server delle CA non includono header CORS nelle risposte, il che impedisce il recupero diretto dal browser. + +Inoltre, molti server delle CA distribuiscono i certificati tramite HTTP semplice. Quando la tua istanza di BentoPDF è ospitata su HTTPS, i browser bloccano queste richieste HTTP (policy sui contenuti misti). Il proxy CORS risolve entrambi i problemi instradando le richieste attraverso un endpoint HTTPS con gli header corretti. + +## Come funziona + +Quando firmi un PDF con un certificato: + +1. La libreria `zgapdfsigner` cerca di costruire una catena di certificati completa +2. Recupera i certificati degli emittenti dagli URL incorporati nell'estensione AIA (Authority Information Access) del tuo certificato +3. Queste richieste passano attraverso un proxy CORS che aggiunge gli header `Access-Control-Allow-Origin` necessari +4. Il proxy restituisce al browser i dati del certificato + +## Self-hosting del proxy CORS + +Se ospiti BentoPDF in autonomia, dovrai distribuire un tuo proxy CORS affinché le firme digitali funzionino con i certificati che richiedono il recupero della catena. + +### Opzione 1: Cloudflare Workers (consigliata) + +1. **Installa la CLI di Wrangler**: + + ```bash + npm install -g wrangler + ``` + +2. **Accedi a Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clona BentoPDF e aggiorna le origini consentite**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Apri `cors-proxy-worker.js` e modifica l'array `ALLOWED_ORIGINS` con il tuo dominio: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Importante + Senza questa modifica, il proxy rifiuterà tutte le richieste dal tuo sito con un errore **403 Forbidden**. L'impostazione predefinita consente solo le richieste da `bentopdf.com`. + ::: + +4. **Distribuisci il proxy**: + + ```bash + wrangler deploy + ``` + + Annota l'URL del tuo worker (es. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Ricompila BentoPDF con l'URL del proxy**: + + Se usi Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Se compili dai sorgenti: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Opzione 2: proxy backend personalizzato + +Puoi anche creare un tuo endpoint proxy. I requisiti sono: + +1. Accettare richieste GET con un parametro di query `url` +2. Recuperare l'URL dal tuo server (nessuna restrizione CORS lato server) +3. Restituire la risposta con questi header: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Esempio di implementazione con Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Considerazioni sulla sicurezza + +Il Cloudflare Worker incluso adotta diverse misure di sicurezza: + +| Funzionalità | Descrizione | +| ------------------------------ | -------------------------------------------------------------------------------------------------- | +| **Convalida dell'origine** | Consente solo richieste dai domini elencati in `ALLOWED_ORIGINS` | +| **Restrizioni sugli URL** | Consente solo URL di certificati (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blocco degli IP privati** | Blocca intervalli privati IPv4/IPv6, link-local, loopback, IP decimali e metadati cloud | +| **Sicurezza del Content-Type** | Restituisce solo tipi MIME di certificati sicuri, blocca l'iniezione di content-type dall'upstream | +| **Limite di dimensione** | Trasmette la risposta in streaming con limite di 10MB, interrompe il download se superato | +| **Limitazione di frequenza** | 60 richieste al minuto per IP o IPv6 /64 (richiede KV, nessun blocco in caso di errori di KV) | +| **Firme HMAC** | Firma facoltativa lato client (scoraggia gli abusi occasionali) | + +### DNS rebinding (self-hosting fuori da Cloudflare) + +Il worker rifiuta qualsiasi URL che si risolve in un IP privato o interno. Non può usare un elenco fisso di host consentiti, perché gli URL della catena di certificati puntano a qualunque CA abbia emesso il certificato (FNMT, CA aziendali e così via), quindi le destinazioni non sono note in anticipo. Resta così una piccola finestra di rebinding: chi gestisce il DNS del proprio dominio potrebbe restituire un IP pubblico al controllo di sicurezza e uno privato alla richiesta vera e propria un istante dopo. + +Su Cloudflare non è sfruttabile: i Workers non possono raggiungere IP privati né l'endpoint di metadati `169.254.169.254`, quindi un rebind non porta a nulla. Basta non dare al worker una via d'accesso: non associare un Tunnel, un Service o un binding di rete privata (gli serve solo `RATE_LIMIT_KV`). + +Se lo esegui fuori da Cloudflare (workerd, Node e simili) all'interno di una VPC, il runtime _può_ raggiungere gli IP interni. Metti davanti un firewall in uscita e blocca gli intervalli privati: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` e i rispettivi equivalenti IPv6. Il codice dell'app non può imporlo una volta fuori da Cloudflare. + +## Disattivare il proxy + +Se non vuoi usare un proxy CORS, imposta la variabile d'ambiente su una stringa vuota: + +``` +VITE_CORS_PROXY_URL= +``` + +**Nota**: senza il proxy, la firma con certificati che richiedono il recupero esterno della catena (come FNMT o alcune CA aziendali) fallirà con l'errore "Failed to fetch". + +## Risoluzione dei problemi + +### "Signing error: TypeError: Failed to fetch" + +Di solito significa una di queste cose: + +1. **Nessun proxy CORS configurato**: imposta `VITE_CORS_PROXY_URL` e ricompila +2. **Contenuti misti bloccati**: il tuo sito è in HTTPS ma l'URL dell'emittente del certificato è in HTTP. Il proxy CORS risolve il problema. +3. **Il proxy CORS rifiuta la tua origine**: verifica che il tuo dominio sia nell'array `ALLOWED_ORIGINS` in `cors-proxy-worker.js` + +### "403 Forbidden" dal proxy + +Il tuo dominio non è nell'elenco `ALLOWED_ORIGINS`. Modifica `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Poi ridistribuisci: `npx wrangler deploy` + +### Testare il proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certificati che funzionano senza proxy + +Alcuni certificati includono la catena completa nel file P12/PFX e non richiedono recuperi esterni: + +- Certificati autofirmati +- Alcune CA commerciali che includono i certificati intermedi +- Certificati che hai assemblato manualmente con la catena completa diff --git a/docs/it/self-hosting/docker.md b/docs/it/self-hosting/docker.md new file mode 100644 index 00000000..c15d8622 --- /dev/null +++ b/docs/it/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Distribuzione con Docker / Podman + +Il modo più semplice per ospitare BentoPDF in autonomia in un ambiente di produzione. + +> [!IMPORTANT] +> **Header richiesti per la conversione dei file Office** +> +> Gli strumenti basati su LibreOffice (conversione di Word, Excel, PowerPoint) richiedono questi header HTTP per il supporto a `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> La pagina deve inoltre essere servita da un contesto sicuro. `http://localhost` funziona per i test in locale, ma `http://192.168.x.x` o altri IP di rete locale di solito non lo qualificano, quindi la conversione Office tramite HTTP semplice fallirà anche se gli header sono presenti. +> +> Le immagini container ufficiali includono questi header. Se usi un reverse proxy (Traefik, Caddy, ecc.), assicurati che gli header vengano mantenuti o aggiunti e usa HTTPS per gli accessi diversi dal loopback. + +> [!TIP] +> **Utenti Podman:** tutti i comandi `docker` funzionano con Podman sostituendo `docker` con `podman` e `docker-compose` con `podman-compose`. + +## Avvio rapido + +> [!TIP] +> BentoPDF è disponibile in due build: +> +> - **Build self-hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Tutti gli strumenti PDF, **senza** la parte di marketing (niente hero, FAQ, testimonianze, footer). Usala per installazioni interne, di team o di organizzazioni. **Non** è una versione "lite" con meno funzionalità. +> - **Build commerciale**: `ghcr.io/alam00000/bentopdf:latest`. Il sito di marketing completo, usato da bentopdf.com stesso e dai titolari di una licenza commerciale che gestiscono installazioni pubbliche. +> +> Se hai dubbi: scarica la build self-hosted. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Crea `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Esegui: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Crea la tua immagine + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Compila ed esegui: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Variabili d'ambiente + +| Variabile | Descrizione | Predefinito | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Compila la variante self-hosted (nasconde la parte di marketing di bentopdf.com: hero, FAQ, testimonianze, footer). Tutti gli strumenti PDF restano. | `false` | +| `BASE_URL` | Distribuzione in una sottodirectory | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL del modulo WASM di PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL del modulo WASM di Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL del modulo WASM di CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL dello script worker OCR | _(vuoto; usa la CDN predefinita di Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Directory del runtime core OCR | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_LANG_URL` | Directory dei traineddata OCR | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Lingue OCR separate da virgole mostrate nell'interfaccia | _(vuoto; mostra il catalogo completo)_ | +| `VITE_OCR_FONT_BASE_URL` | Directory dei font del livello di testo OCR | _(vuoto; usa gli URL remoti dei font Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Lingua predefinita dell'interfaccia | `en` | +| `VITE_BRAND_NAME` | Nome del marchio personalizzato | `BentoPDF` | +| `VITE_BRAND_LOGO` | Percorso del logo relativo a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Testo personalizzato del footer/copyright | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID degli strumenti da nascondere, separati da virgole | _(vuoto; tutti gli strumenti abilitati)_ | +| `DISABLE_GITHUB_STARS` | Salta il recupero del numero di stelle GitHub al caricamento della pagina e rimuove `api.github.com` dalla CSP. Le build in Simple Mode lo saltano sempre. | `false` | +| `SITE_URL` | URL pubblico scritto nei link canonical, hreflang e sitemap. Lascia il valore predefinito, a meno che tu non voglia che i motori di ricerca trattino la tua installazione come un sito a sé. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Con un `SITE_URL` personalizzato, ogni pagina è marcata `noindex` così la tua copia non compete con bentopdf.com nei risultati di ricerca. Imposta `true` per permettere ai motori di ricerca di indicizzarla. | `false` | + +Gli URL dei moduli WASM sono preconfigurati con i valori CDN predefiniti: tutte le funzionalità avanzate funzionano subito. Sostituiscili per installazioni air-gapped o self-hosted. + +### Motori di ricerca + +Per impostazione predefinita, ogni pagina indica ai motori di ricerca bentopdf.com come originale, così la tua installazione non appare come duplicato. Non devi cambiare nulla per un'istanza privata o interna. + +- **Tieni la tua istanza fuori dai risultati di ricerca:** esegui il container con `-e ROBOTS_NOINDEX=true`. Basta un riavvio, non serve ricompilare. +- **Rendi la tua istanza un sito a sé nei risultati di ricerca:** compila con `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Senza `ALLOW_INDEXING=true`, un `SITE_URL` personalizzato marca ogni pagina `noindex`. + +### Content-Security-Policy + +L'immagine nginx include un header `Content-Security-Policy` in modalità enforcing. Le direttive `script-src`, `connect-src` e `font-src` della CSP sono **generate in fase di build** a partire dalle variabili URL `VITE_*` qui sopra: tutti gli host che passi con `--build-arg` vengono aggiunti automaticamente alla policy. + +Di conseguenza: + +- Se sovrascrivi `VITE_CORS_PROXY_URL` o `VITE_WASM_*_URL` in fase di build, la CSP consente automaticamente quelle origini, senza configurazioni aggiuntive. +- Per gli URL su `cdn.jsdelivr.net`, `script-src` consente solo l'esatta cartella del pacchetto con versione, ad esempio `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, non l'intera CDN. jsDelivr serve qualsiasi pacchetto npm pubblico o repository GitHub, quindi consentire l'intero host permetterebbe a ciascuno di essi di essere eseguito sulla tua istanza. Gli URL su qualsiasi altro host sono consentiti per origine. +- Se configuri URL WASM personalizzati in _runtime_ dalla pagina Impostazioni avanzate dell'app, quelle origini **non** sono nella CSP e il browser bloccherà le richieste verso di esse. Vale anche per una versione diversa dello stesso pacchetto su `cdn.jsdelivr.net`, perché è consentita solo la versione impostata in fase di build. La configurazione in runtime serve per sperimentare; per URL personalizzati permanenti imposta il corrispondente build arg `VITE_*`. +- Nelle installazioni air-gapped che sovrascrivono tutti e tre i valori `VITE_WASM_*_URL`, anche le cartelle dei pacchetti su `cdn.jsdelivr.net` vengono rimosse dalla CSP (ogni valore predefinito viene sostituito, non aggiunto). I valori predefiniti di Tesseract OCR su `cdn.jsdelivr.net` restano nella policy finché non imposti anche i tre valori `VITE_TESSERACT_*`. Allo stesso modo, impostare `VITE_CORS_PROXY_URL` sostituisce il valore pubblico predefinito `bentopdf-cors-proxy.bentopdf.workers.dev`. + +La CSP include `'unsafe-eval'` in `script-src` perché il runtime LibreOffice WASM (usato dagli strumenti di conversione Word/Excel/PowerPoint) e la libreria di immagini wasm-vips (usata da PDF in TIFF) compilano codice di dispatch interno tramite `new Function()`. Rimuoverlo renderebbe inutilizzabili quegli strumenti. Se compili in `SIMPLE_MODE` (senza LibreOffice) e non ti serve PDF in TIFF, puoi modificare a mano il file generato `security-headers.conf` per eliminare `'unsafe-eval'` e ottenere una policy più restrittiva. + +Per l'OCR, lascia vuote le variabili `VITE_TESSERACT_*` per usare le risorse online predefinite, oppure impostale tutte e tre insieme per un OCR self-hosted/offline. Le sostituzioni parziali dell'OCR vengono rifiutate perché worker, runtime core e directory dei traineddata devono corrispondere. Per un output PDF ricercabile completamente offline, imposta anche `VITE_OCR_FONT_BASE_URL` in modo che i font del livello di testo OCR vengano caricati dal tuo server interno invece che dagli URL pubblici dei font Noto. + +`VITE_DEFAULT_LANGUAGE` imposta la lingua dell'interfaccia per i nuovi visitatori. Valori supportati: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Gli utenti possono comunque cambiare lingua: questo modifica solo il valore predefinito. + +Esempio: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Marchio personalizzato + +Sostituisci il logo, il nome e il testo del footer predefiniti di BentoPDF con i tuoi. Metti il file del logo nella cartella `public/` (o usa un'immagine esistente), poi passa le variabili del marchio in fase di build: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +La personalizzazione del marchio funziona sia in modalità completa sia in Simple Mode e si può combinare con tutte le altre opzioni di build. + +### Disattivare strumenti specifici + +Nascondi strumenti dall'interfaccia per esigenze di conformità o sicurezza. Gli strumenti disattivati vengono rimossi dalla homepage, dai risultati di ricerca, dalle scorciatoie da tastiera e dal workflow builder. L'accesso diretto tramite URL mostra una pagina "strumento non disponibile". + +Gli ID degli strumenti sono l'URL della pagina senza `.html`. Ad esempio, se lo strumento si trova in `bentopdf.com/edit-pdf.html`, l'ID è `edit-pdf`. + +#### Trovare gli ID degli strumenti + +Il modo più semplice: apri uno strumento qualsiasi in BentoPDF e guarda l'URL. L'ultima parte del percorso (senza `.html`) è l'ID dello strumento. + +
+Elenco completo degli ID degli strumenti + +**Modifica e annota:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Converti in PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Converti da PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organizza e gestisci:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Ottimizza e ripara:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Sicurezza:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Opzione 1: in fase di build (build arg di Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Questo incorpora l'elenco degli strumenti disattivati nel bundle JavaScript. Per modificarlo serve ricompilare. + +#### Opzione 2: in runtime (config.json) + +Monta un file `config.json` nella directory servita, senza bisogno di ricompilare: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Oppure con Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +I due metodi si possono combinare: gli elenchi vengono uniti. Se uno strumento compare in uno dei due, viene disattivato. + +#### Disattivare le funzionalità dell'editor + +Puoi anche disattivare funzionalità specifiche all'interno dell'editor PDF (ad es. oscuramento, annotazioni, moduli) senza disattivare l'intero strumento. Aggiungi `editorDisabledCategories` al tuo `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Elenco completo delle categorie dell'editor + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Annotazioni:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Forme:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Moduli:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Oscuramento:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Documento:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Pagina:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Pannelli:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Strumenti:** `tools`, `pan`, `pointer`, `capture` + +**Selezione:** `selection`, `selection-copy` + +**Cronologia:** `history`, `history-undo`, `history-redo` + +
+ +Le categorie sono gerarchiche: disattivando una categoria padre (ad es. `annotation`) si disattivano tutte le sue figlie. + +### Disattivare il contatore di stelle GitHub + +La barra di navigazione mostra il numero di stelle GitHub in tempo reale, recuperato da `api.github.com` al caricamento della pagina. È l'unica richiesta esterna che non serve a una funzionalità PDF. Disattivalo in fase di build per rimuovere il codice di recupero dal bundle ed eliminare `api.github.com` dalla Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Le build in Simple Mode (`bentopdf-simple`) saltano sempre il contatore di stelle: questo flag serve solo sulla build commerciale o sulle build complete personalizzate. + +### URL WASM personalizzati (air-gapped / self-hosted) + +> [!IMPORTANT] +> Gli URL WASM sono incorporati nel JavaScript in **fase di build**. I file WASM vengono scaricati dal **browser dell'utente** in runtime: Docker non li scarica durante la build. Per le reti air-gapped, devi ospitare i file WASM su un server interno raggiungibile dai browser. + +**Flusso di lavoro air-gapped completo:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Usa i codici stampati da `bash scripts/prepare-airgap.sh --list-ocr-languages`, oppure cercali per nome con `bash scripts/prepare-airgap.sh --search-ocr-language `, per `--ocr-languages`. Quando compili con un sottoinsieme limitato di lingue OCR, passa gli stessi codici a `VITE_TESSERACT_AVAILABLE_LANGUAGES` in modo che l'app mostri solo le lingue incluse. Per un output OCR completamente offline, ospita anche la cartella inclusa `ocr-fonts/` e punta `VITE_OCR_FONT_BASE_URL` verso di essa. + +Imposta una variabile su stringa vuota per disattivare quel modulo (gli utenti dovranno configurarlo manualmente da Impostazioni avanzate). + +## Porta personalizzata + +Per impostazione predefinita, BentoPDF è in ascolto sulla porta `8080` all'interno del container. Per cambiarla, imposta la variabile d'ambiente `PORT` in runtime: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variabile | Descrizione | Predefinito | +| --------- | --------------------------------------- | ----------- | +| `PORT` | Porta di ascolto di Nginx nel container | `8080` | + +Funziona sia con il Dockerfile standard sia con quello nonroot. + +## ID utente personalizzato (PUID/PGID) + +Per gli ambienti che richiedono l'esecuzione come utente non root specifico (dispositivi NAS, Kubernetes con security context, policy organizzative), BentoPDF fornisce un Dockerfile separato con supporto PUID/PGID in stile LSIO. + +### Compila ed esegui + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Variabili d'ambiente + +| Variabile | Descrizione | Predefinito | +| -------------- | -------------------------- | ----------- | +| `PUID` | ID utente con cui eseguire | `1000` | +| `PGID` | ID gruppo con cui eseguire | `1000` | +| `PORT` | Porta di ascolto di Nginx | `8080` | +| `DISABLE_IPV6` | Disattiva il listener IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Come funziona + +Il container si avvia come root, crea un utente con il PUID/PGID specificato, regola la proprietà di tutte le directory scrivibili e poi abbassa i privilegi con `su-exec`. Il processo nginx viene eseguito interamente come l'utente specificato. + +> [!NOTE] +> Il `Dockerfile` standard usa `nginx-unprivileged` (UID 101) ed è consigliato per la maggior parte delle installazioni. Usa `Dockerfile.nonroot` solo quando ti serve un UID/GID specifico. + +> [!WARNING] +> PUID/PGID non possono essere `0` (root). L'entrypoint convalida i valori e termina con un errore se non sono validi. + +## Con Traefik (reverse proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Con Caddy (reverse proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Limiti di risorse + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (integrazione con systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) permette di eseguire i container Podman come servizi systemd. È ideale per le installazioni di produzione su sistemi Linux. + +### Configurazione base di Quadlet + +Crea un file di unità container in `~/.config/containers/systemd/bentopdf.container` (utente) oppure `/etc/containers/systemd/bentopdf.container` (sistema): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Abilita e avvia + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Per un'installazione a livello di sistema, usa `systemctl` senza il flag `--user` e metti il file in `/etc/containers/systemd/`. + +### Quadlet con health check + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Aggiornamento automatico con Quadlet + +Podman può aggiornare automaticamente i container quando sono disponibili nuove immagini: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Configurazione di rete di Quadlet + +Per una configurazione di rete personalizzata, crea un file di rete `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Poi fai riferimento ad esso nel tuo file container: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Aggiornamento + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/it/self-hosting/hostinger.md b/docs/it/self-hosting/hostinger.md new file mode 100644 index 00000000..60d5d940 --- /dev/null +++ b/docs/it/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Distribuzione su Hostinger + +[Hostinger](https://hostinger.com) è un diffuso provider di hosting condiviso. Questa guida spiega come distribuire BentoPDF sull'hosting condiviso di Hostinger. + +## Prerequisiti + +- Piano di hosting Hostinger con accesso al file manager +- Node.js installato in locale per la build + +## Passaggio 1: compila il progetto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +I file compilati saranno nella cartella `dist`. + +## Passaggio 2: carica su Hostinger + +### Distribuzione sul dominio principale + +1. Accedi al tuo account Hostinger +2. Vai su **File Manager** → **public_html** +3. **Elimina** tutti i file esistenti (fai prima un backup se serve) +4. **Carica** tutto il contenuto della tua cartella locale `dist` in `public_html` + +### Distribuzione in una sottodirectory + +Se distribuisci in una sottodirectory (es. `yourdomain.com/pdf-tools/`): + +1. Compila con l'URL di base corretto: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Crea la cartella in Hostinger: + - Vai su **File Manager** → **public_html** + - Crea una nuova cartella: `pdf-tools` +3. Carica tutto il contenuto di `dist` in `public_html/pdf-tools/` + +## Passaggio 3: crea il file .htaccess + +Crea un file `.htaccess` nella radice della cartella di distribuzione (`public_html` o `public_html/pdf-tools/`): + +::: warning Importante +Per la distribuzione in una sottodirectory, cambia `RewriteBase /` in `RewriteBase /pdf-tools/` (o il nome della tua cartella). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Esempio di .htaccess per sottodirectory + +Per `yourdomain.com/pdf-tools/`, aggiorna queste righe: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Risoluzione dei problemi + +### I file WASM non si caricano + +Assicurati che i tipi MIME siano impostati correttamente in `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Gli strumenti LibreOffice non funzionano + +Gli header di sicurezza sono fondamentali per SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Se gli header non vengono applicati, contatta il supporto di Hostinger per abilitare `mod_headers`. + +### Errori 404 all'aggiornamento della pagina + +Verifica che la regola per l'estensione `.html` e le route delle lingue siano configurate correttamente. BentoPDF usa file HTML statici, non il routing SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limiti di caricamento dei file + +Hostinger può avere limiti sulla dimensione dei file. Carica i file WASM separatamente se il caricamento in blocco fallisce. diff --git a/docs/it/self-hosting/index.md b/docs/it/self-hosting/index.md new file mode 100644 index 00000000..b61f3ee2 --- /dev/null +++ b/docs/it/self-hosting/index.md @@ -0,0 +1,538 @@ +# Guida all'self-hosting + +BentoPDF può essere ospitato sulla tua infrastruttura. Questa guida illustra le varie opzioni di deploy. + +## Avvio rapido con Docker / Podman + +Il modo più rapido per ospitare BentoPDF: + +> [!TIP] +> BentoPDF è disponibile in due build: +> +> - **Build Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Tutti gli strumenti PDF, **senza** gli elementi di marketing (niente hero, FAQ, testimonianze, footer). Usala per deploy interni, di team o di organizzazione. **Non** è una versione "lite" con meno funzionalità. +> - **Build Commercial**: `ghcr.io/alam00000/bentopdf:latest`. Il sito di marketing completo, usato da bentopdf.com stesso e dai titolari di licenza commerciale che gestiscono deploy pubblici. +> +> Nel dubbio: scarica la build Self-Hosted. + +> [!IMPORTANT] +> La conversione dei file Office richiede `SharedArrayBuffer`, il che significa che l'app deve essere sia isolata cross-origin sia servita da un contesto sicuro. L'immagine ufficiale invia già gli header COOP/COEP necessari, ma i browser disabilitano comunque `SharedArrayBuffer` sulle origini HTTP semplici della rete locale, come `http://192.168.x.x`. +> +> Usa `http://localhost` solo per test sullo stesso dispositivo. Se gli utenti accedono a BentoPDF tramite un IP o un hostname della LAN, termina la connessione con HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Oppure con Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux systemd) + +Esegui BentoPDF come servizio systemd. Crea `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Consulta la [guida al deploy con Docker](/it/self-hosting/docker) per la documentazione completa di Quadlet. + +## Compilazione dal codice sorgente + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Opzioni di configurazione + +### Build Self-Hosted (Simple Mode) + +La build Self-Hosted (l'immagine `bentopdf-simple`, detta anche Simple Mode) è **funzionalmente identica** alla build Commercial: ogni strumento PDF è presente e si comporta allo stesso modo. Nasconde solo gli elementi di marketing che hanno senso soltanto su bentopdf.com o in un deploy commerciale pubblico. **Non è una versione "lite" con meno funzionalità.** + +**Cosa nasconde la build Self-Hosted** (solo aspetto estetico, nessuna funzionalità PDF viene rimossa): + +- Barra di navigazione, sezione hero, sezione delle funzionalità, FAQ, testimonianze, footer +- Aggiorna il titolo della pagina in "Strumenti PDF" + +**Cosa mantiene la build Self-Hosted** (tutto ciò che lavora davvero sui PDF): + +- Ogni strumento PDF (unione, divisione, modifica, firma, OCR, conversione Office, ecc.) +- Supporto al branding personalizzato, tutta la configurazione di build e di runtime + +La build Commercial (`ghcr.io/alam00000/bentopdf:latest`) è quella che alimenta bentopdf.com stesso ed è usata dai titolari di licenza commerciale che gestiscono deploy pubblici: aggiunge hero, FAQ, testimonianze e footer che non avrebbero senso in uno strumento interno. + +Se ospiti BentoPDF per il tuo team, la tua organizzazione o come strumento interno, scarica la build Self-Hosted: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Consulta [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) per tutti i dettagli. + +### Build Commercial (deploy pubblici con il tuo brand) + +La build Commercial (l'immagine `bentopdf`, senza il suffisso `-simple`) è quella che alimenta bentopdf.com stesso. Include il sito di marketing completo (hero, funzionalità, FAQ, testimonianze, footer) oltre a ogni strumento PDF. Usa questa build quando vuoi **distribuire BentoPDF come servizio PDF pubblico con il tuo brand**, ad esempio: + +- Gestisci BentoPDF come SaaS ospitato per gli utenti finali sul tuo dominio +- Vuoi l'esperienza della landing page (sezioni di marketing + strumenti), non solo l'interfaccia essenziale degli strumenti +- Sei un titolare di licenza commerciale e integri BentoPDF in un prodotto commerciale + +**Eseguila così com'è** (brand BentoPDF, utile per vedere un'anteprima della build): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Compila con il tuo brand** (il tipico flusso commerciale): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Ogni altra opzione di build (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, override degli URL WASM, ecc.) funziona come nella build Self-Hosted. + +::: warning Licenze +L'esecuzione della build Commercial è consentita con una qualsiasi delle due opzioni di licenza di BentoPDF: + +- **AGPL-3.0** (gratuita): consentita se il tuo deploy pubblica tutto il proprio codice sorgente sotto AGPL, comprese le modifiche al brand e la logica di business circostante. +- **Licenza commerciale** ($79 a vita): necessaria per deploy proprietari o a codice chiuso in cui non rendi open source il tuo fork di branding o il tuo codice di business. + +Consulta la [pagina delle licenze](https://www.bentopdf.com/licensing) per il confronto completo. I moduli WASM con licenza AGPL (PyMuPDF, Ghostscript, CoherentPDF) vengono caricati da una CDN a runtime, quindi non entrano nella tua immagine e non cambiano la tua situazione di licenza. +::: + +### Base URL + +Deploy in una sottodirectory: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Branding personalizzato + +Sostituisci il logo, il nome e il testo del footer predefiniti di BentoPDF con i tuoi durante la build: + +| Variabile | Descrizione | Predefinito | +| ------------------ | ------------------------------------------ | --------------------------------------- | +| `VITE_BRAND_NAME` | Nome del brand mostrato in header e footer | `BentoPDF` | +| `VITE_BRAND_LOGO` | Percorso del logo relativo a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Testo personalizzato del footer/copyright | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Oppure tramite Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Il branding funziona sia in modalità completa sia in Simple Mode e può essere combinato con tutte le altre opzioni di build (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Disabilitare strumenti specifici + +Nascondi singoli strumenti per motivi di conformità o sicurezza. Gli strumenti disabilitati vengono rimossi dalla homepage, dalla ricerca, dalle scorciatoie, dal workflow builder e dall'accesso diretto tramite URL. + +Gli ID degli strumenti sono l'URL della pagina senza `.html`: apri uno strumento qualsiasi e guarda l'URL (ad es. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**In fase di build** (incorporata nel bundle): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**A runtime** (nessuna ricompilazione necessaria: monta un `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +I due metodi possono essere combinati: gli elenchi vengono uniti. + +Puoi anche disabilitare funzionalità specifiche dell'Editor PDF (ad es. la redazione) senza disabilitare l'intero strumento, aggiungendo `editorDisabledCategories` a `config.json`. Consulta la [guida Docker](/it/self-hosting/docker#disattivare-le-funzionalita-dell-editor) per l'elenco completo delle categorie. + +## Guide al deploy + +Scegli la tua piattaforma: + +- [Vercel](/it/self-hosting/vercel) +- [Netlify](/it/self-hosting/netlify) +- [Cloudflare Pages](/it/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/it/self-hosting/aws) +- [Hostinger](/it/self-hosting/hostinger) +- [Nginx](/it/self-hosting/nginx) +- [Apache](/it/self-hosting/apache) +- [Docker](/it/self-hosting/docker) +- [Kubernetes](/it/self-hosting/kubernetes) +- [CORS Proxy](/it/self-hosting/cors-proxy) - Necessario per le firme digitali + +## Problemi comuni + +### La conversione da Word / ODT / Excel / PowerPoint a PDF si blocca (SharedArrayBuffer non disponibile) + +**Sintomo**: le conversioni di documenti basate su LibreOffice (da Word, ODT, Excel, PowerPoint a PDF) si bloccano intorno al 55% o non partono. La console del browser può mostrare: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…oppure `window.crossOriginIsolated` restituisce `false`, o la compilazione WASM segnala `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Causa**: LibreOffice WASM richiede `SharedArrayBuffer`, che il browser abilita solo quando la pagina è **isolata cross-origin** E servita da un **contesto sicuro**. Ciò significa che devono valere due condizioni: + +1. Ogni risposta include entrambi gli header: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. La pagina è servita da `https://...` o da `http://localhost`. Un semplice HTTP su un IP della LAN (ad es. `http://192.168.x.x`) NON conta come sicuro: i browser disabilitano lì `SharedArrayBuffer`. + +La discrepanza `00 61 73 6d / 1f 8b 08 08` è un sotto-sintomo distinto: ai file precompressi `.wasm.gz` / `.data.gz` manca l'header di risposta `Content-Encoding: gzip`, quindi il browser riceve byte gzip grezzi invece di WASM decompresso. + +**Soluzione**: consulta la guida al deploy specifica della tua piattaforma per la configurazione esatta: + +- [Nginx →](/it/self-hosting/nginx#conversione-da-word-odt-excel-a-pdf-non-funzionante) +- [Apache →](/it/self-hosting/apache#la-conversione-da-word-odt-excel-a-pdf-non-funziona) +- [AWS S3 + CloudFront →](/it/self-hosting/aws#passaggio-3b-policy-degli-header-di-risposta-necessaria-per-libreoffice-wasm) +- [Cloudflare Pages →](/it/self-hosting/cloudflare#file-di-configurazione) (`_headers` file) +- [Netlify →](/it/self-hosting/netlify#conversione-da-word-odt-excel-a-pdf-bloccata-al-55) (`netlify.toml`) +- [Vercel →](/it/self-hosting/vercel#conversione-da-word-odt-excel-a-pdf-non-funzionante) (`vercel.json`) +- [Hostinger →](/it/self-hosting/hostinger#gli-strumenti-libreoffice-non-funzionano) (`.htaccess`) +- [Kubernetes →](/it/self-hosting/kubernetes#verificare-che-gli-header-sharedarraybuffer-funzionino-ancora-ingress-gateway) +- **Docker**: gestito automaticamente dalla configurazione nginx inclusa, nessuna azione necessaria. + +**Verifica**: apri la Console di DevTools su una qualsiasi pagina di BentoPDF ed esegui: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Se la pagina è in HTTPS o su `http://localhost` E entrambi gli header COEP/COOP sono presenti in ogni risposta, entrambi i controlli passano. Se sei su `http://192.168.x.x` o su un'altra origine HTTP non di loopback, termina la connessione con HTTPS: non esiste una soluzione basata solo sugli header. + +### File `.mjs` serviti come `application/octet-stream` + +**Sintomo**: Firma PDF / Compilazione moduli / alcuni altri strumenti mostrano un visualizzatore vuoto o non si caricano. La console del browser segnala: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Causa**: il tuo web server o reverse proxy non ha una mappatura del tipo MIME per i file `.mjs` (il visualizzatore PDF incluso distribuisce ES module con quell'estensione). Molte configurazioni di server predefinite usano `application/octet-stream` per le estensioni non riconosciute, e i browser rifiutano di eseguirlo come ES module. + +**Soluzione**: consulta la guida al deploy specifica della tua piattaforma per lo snippet esatto: + +- [Nginx →](/it/self-hosting/nginx#firma-pdf-o-compilazione-moduli-mostra-un-visualizzatore-vuoto-errore-mime-mjs) +- [Apache →](/it/self-hosting/apache#firma-pdf-o-compilazione-moduli-mostra-un-visualizzatore-vuoto-errore-mime-mjs) +- [AWS S3 + CloudFront →](/it/self-hosting/aws#passaggio-2-compila-e-carica) (vedi `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/it/self-hosting/kubernetes#errori-di-tipo-mime-per-mjs-iframe-di-firma-pdf-compilazione-moduli-vuoto) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: gestito automaticamente, nessuna azione necessaria. + +**Verifica**: apri DevTools → scheda Network, trova la richiesta `.mjs` che fallisce e controlla l'header di risposta `Content-Type`. Dovrebbe essere `application/javascript`. Se è ancora `application/octet-stream`, un reverse proxy o una CDN esterna potrebbe riconoscere di nuovo il tipo: controlla ogni livello della catena di servizio. + +## Configurazione WASM (componenti AGPL) + +BentoPDF **non include** nel proprio codice sorgente le librerie di elaborazione con licenza AGPL, ma **preconfigura gli URL della CDN** in modo che tutte le funzionalità funzionino subito, senza alcuna configurazione manuale. + +::: tip Zero-config per impostazione predefinita +Dalla v2.0.0, i moduli WASM sono preconfigurati per caricarsi dalla CDN jsDelivr tramite variabili d'ambiente. Tutte le funzionalità avanzate funzionano subito senza alcuna configurazione da parte dell'utente. +::: + +| Componente | Licenza | Funzionalità | +| --------------- | -------- | ---------------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Conversione EPUB/MOBI/FB2/XPS, estrazione di immagini, estrazione di tabelle | +| **Ghostscript** | AGPL-3.0 | Conversione PDF/A, compressione, raddrizzamento, rasterizzazione | +| **CoherentPDF** | AGPL-3.0 | Indice, allegati, unione di PDF con segnalibri | + +### Variabili d'ambiente predefinite + +Sono impostate in `.env.production` e incorporate nella build: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Sovrascrivere gli URL WASM + +Puoi sovrascrivere i valori predefiniti in fase di build per deploy personalizzati: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Per disabilitare completamente un modulo (richiedendo la configurazione manuale dell'utente tramite le Impostazioni avanzate), imposta la sua variabile su una stringa vuota. + +Per l'OCR, lascia vuote tutte le variabili `VITE_TESSERACT_*` e mantieni gli asset online predefiniti, oppure imposta insieme gli URL di worker/core/lang per un OCR self-hosted/offline. Se includi solo alcune lingue OCR, imposta anche `VITE_TESSERACT_AVAILABLE_LANGUAGES` con gli stessi codici separati da virgola, così l'interfaccia offre solo le lingue installate e le selezioni non supportate falliscono con un errore descrittivo. Per un output PDF ricercabile completamente offline, imposta anche `VITE_OCR_FONT_BASE_URL` sulla directory interna che serve i font OCR inclusi. + +Gli utenti possono anche sovrascrivere questi valori predefiniti in qualsiasi momento tramite le **Impostazioni avanzate** nell'interfaccia: le sovrascritture dell'utente salvate nel browser hanno la priorità sui valori predefiniti dell'ambiente. + +### Deploy air-gapped / offline + +Per le reti senza accesso a internet (enti pubblici, sanità, finanza, ecc.). Gli URL WASM sono incorporati nel JavaScript **in fase di build**, mentre i file WASM veri e propri vengono scaricati dal **browser dell'utente** a runtime. Quindi devi preparare tutto su una macchina con accesso a internet e poi trasferirlo nella rete isolata. + +#### Script automatico (consigliato) + +Lo script `prepare-airgap.sh` incluso automatizza l'intero processo: scarica i pacchetti WASM, compila l'immagine Docker e produce un bundle autonomo con uno script di setup. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Questo produce una directory bundle: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Trasferisci il bundle nella rete air-gapped tramite USB, repository di artefatti interno o altro metodo approvato. Poi esegui lo script di setup incluso: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Lo script di setup carica l'immagine Docker, estrae i file WASM e, facoltativamente, avvia il container. + +**Opzioni dello script:** + +| Flag | Descrizione | Predefinito | +| ------------------------------ | ------------------------------------------------------- | ------------------------------------ | +| `--wasm-base-url ` | Dove verranno ospitati internamente i WASM | _(obbligatorio, richiesto se manca)_ | +| `--image-name ` | Tag dell'immagine Docker | `bentopdf` | +| `--output-dir ` | Directory di output del bundle | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Abilita Simple Mode | off | +| `--base-url ` | Base URL della sottodirectory (ad es. `/pdf/`) | `/` | +| `--language ` | Lingua predefinita dell'interfaccia (ad es. `fr`, `de`) | _(nessuno)_ | +| `--brand-name ` | Nome del brand personalizzato | _(nessuno)_ | +| `--brand-logo ` | Percorso del logo relativo a `public/` | _(nessuno)_ | +| `--footer-text ` | Testo personalizzato del piè di pagina | _(nessuno)_ | +| `--ocr-languages ` | Lingue OCR da includere, separate da virgola | `eng` | +| `--list-ocr-languages` | Stampa i codici e i nomi OCR supportati, poi esce | off | +| `--search-ocr-language ` | Cerca i codici OCR per nome o abbreviazione | off | +| `--dockerfile ` | Dockerfile da usare | `Dockerfile` | +| `--skip-docker` | Salta la build e l'esportazione di Docker | off | +| `--skip-wasm` | Salta il download WASM (riusa i file `.tgz` esistenti) | off | + +Il prompt interattivo accetta anche `list` per stampare l'elenco completo dei codici Tesseract supportati e `search ` per trovare corrispondenze come `search german` o `search chi`. + +::: warning Requisito di stessa origine +I file WASM devono essere serviti dalla **stessa origine** dell'app BentoPDF. I Web Worker usano `importScripts()`, che non può caricare script cross-origin. Ad esempio, se BentoPDF gira su `https://internal.example.com`, anche il base URL WASM deve essere `https://internal.example.com/wasm`. +::: + +#### Passaggi manuali + +
+Se preferisci procedere manualmente senza lo script + +**Passaggio 1: scarica i pacchetti WASM e OCR** (su una macchina con accesso a internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Passaggio 2: compila l'immagine Docker con gli URL interni** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Passaggio 3: esporta l'immagine Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Passaggio 4: trasferisci nella rete air-gapped** + +Copia tramite USB, repository di artefatti interno o altro metodo di trasferimento approvato: + +- `bentopdf.tar`: l'immagine Docker +- I cinque pacchetti `.tgz` WASM/OCR del Passaggio 1 +- La directory `tesseract-langdata/` del Passaggio 1 +- La directory `ocr-fonts/` del Passaggio 1 + +**Passaggio 5: configura all'interno della rete air-gapped** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Assicurati che i file siano accessibili agli URL configurati nel Passaggio 2, inclusi `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data`, and `.../ocr/fonts`. + +
+ +::: info Compili dal sorgente invece di usare Docker? +Imposta le variabili in `.env.production` prima di eseguire `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Ospitare il tuo proxy WASM + +Se devi servire i file WASM AGPL con gli header CORS corretti, puoi distribuire un semplice proxy. Consulta la [guida al proxy WASM di Cloudflare](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) per un esempio di implementazione. + +::: tip Perché separati? +Questa separazione garantisce: + +- Chiara conformità legale per gli utenti commerciali +- Il nucleo di BentoPDF resta sotto la sua doppia licenza (AGPL-3.0 / Commercial) +- I file WASM vengono caricati a runtime, non inclusi nel sorgente + ::: + +## Requisiti di sistema + +| Requisito | Minimo | +| --------- | ---------------------------------- | +| Spazio | ~100 MB (nucleo senza moduli AGPL) | +| RAM | 512 MB | +| CPU | Qualsiasi processore moderno | + +::: tip +BentoPDF è un sito statico: non servono database né server backend! +::: diff --git a/docs/it/self-hosting/kubernetes.md b/docs/it/self-hosting/kubernetes.md new file mode 100644 index 00000000..378051f6 --- /dev/null +++ b/docs/it/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Deploy con Kubernetes + +Kubernetes può essere eccessivo per un sito statico, ma è un'ottima scelta se usi già Helm + GitOps come standard. + +> [!IMPORTANT] +> **Header necessari per la conversione dei file Office** +> +> Gli strumenti basati su LibreOffice (conversione di Word, Excel, PowerPoint) richiedono questi header HTTP per il supporto a `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Le immagini nginx ufficiali di BentoPDF includono questi header. In Kubernetes, **anche i controller Ingress/Gateway sono reverse proxy**, quindi assicurati che questi header vengano preservati (oppure aggiungili al livello edge). + +## Prerequisiti + +- Cluster Kubernetes +- Helm v3 +- Un'immagine nginx di BentoPDF (ad es. `ghcr.io/alam00000/bentopdf:`) che serve sulla **porta 8080** + +## Deploy con Helm + +### Installazione da questo repository (chart locale) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Installazione da GHCR (chart OCI) + +Se il chart è pubblicato su GHCR come artefatto OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Esporre il servizio + +### Port-forward (test rapido) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (facoltativo) + +Abilita Ingress (esempio per nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (facoltativo) + +Questo chart supporta `Gateway` + `HTTPRoute` della Gateway API. + +Esempio (operatore Gateway API di Cloudflare): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Verificare che gli header SharedArrayBuffer funzionino ancora (Ingress/Gateway) + +### Cosa "dovrebbe" succedere + +La configurazione nginx di BentoPDF imposta gli header di risposta necessari. La maggior parte dei controller Ingress/Gateway **inoltra invariati gli header di risposta dell'upstream**. + +### Cosa può romperlo + +- Una policy del controller o dell'edge che **sovrascrive** o **rimuove** gli header di risposta +- Un middleware di "security headers" che imposta valori COOP/COEP diversi + +### Come verificare + +Esegui questo comando sul tuo endpoint pubblico: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Dovresti vedere: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Se il tuo controller Ingress non li preserva + +Aggiungi gli header al livello edge (dipende dal controller). Esempio per **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Errori di tipo MIME per `.mjs` (iframe di Firma PDF / Compilazione moduli vuoto) + +Se la console del browser mostra `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` su una richiesta `.mjs`, un controller Ingress/Gateway davanti all'nginx di BentoPDF sta sostituendo l'header `Content-Type` dell'upstream con `application/octet-stream`. + +L'nginx dell'immagine di BentoPDF serve già i file `.mjs` come `application/javascript`. La soluzione è impedire al controller di rimuoverlo o sostituirlo. Per nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Oppure usa un filtro `ResponseHeaderModifier` nella Gateway API per impostare `Content-Type: application/javascript` sui percorsi `.mjs`. Verifica con DevTools → scheda Network: la richiesta `.mjs` che falliva dovrebbe ora mostrare `content-type: application/javascript`. + +### Se usi la Gateway API e vuoi aggiungere gli header in modo forzato + +La Gateway API supporta un filtro `ResponseHeaderModifier`. Puoi associarlo in `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Il supporto per filtri specifici dipende dal tuo controller Gateway; se un filtro viene ignorato, aggiungi gli header al livello edge/controller. + +## Disabilitare strumenti specifici + +Usa una ConfigMap per disabilitare gli strumenti a runtime senza ricostruire l'immagine: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Montala nella directory servita: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Gli ID degli strumenti sono l'URL della pagina senza `.html`: apri uno strumento qualsiasi e guarda l'URL (ad es. `edit-pdf`, `merge-pdf`, `compress-pdf`). Gli strumenti disabilitati sono nascosti dalla homepage, dalla ricerca, dalle scorciatoie, dal workflow builder e dall'accesso diretto tramite URL. Consulta la [guida Docker](/it/self-hosting/docker#disattivare-strumenti-specifici) per l'elenco completo delle opzioni. diff --git a/docs/it/self-hosting/netlify.md b/docs/it/self-hosting/netlify.md new file mode 100644 index 00000000..84f1d2b4 --- /dev/null +++ b/docs/it/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Deploy su Netlify + +[Netlify](https://netlify.com) offre un ottimo hosting per siti statici con un generoso piano gratuito. + +## Deploy con un clic + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Deploy manuale + +### Passaggio 1: collega il repository + +1. Accedi a [Netlify](https://app.netlify.com) +2. Fai clic su "Add new site" → "Import an existing project" +3. Collega il tuo account GitHub +4. Seleziona il tuo fork di BentoPDF + +### Passaggio 2: configura le impostazioni di build + +| Impostazione | Valore | +| -------------------------- | --------------- | +| Comando di build | `npm run build` | +| Directory di pubblicazione | `dist` | +| Versione di Node | 18+ | + +### Passaggio 3: esegui il deploy + +Fai clic su "Deploy site" e attendi il completamento della build. + +## File di configurazione + +Crea `netlify.toml` nella radice del tuo progetto: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Importante +Gli header `Cross-Origin-Embedder-Policy` e `Cross-Origin-Opener-Policy` sono necessari per le conversioni da Word/ODT/Excel/PowerPoint a PDF. Senza di essi, `SharedArrayBuffer` non è disponibile e il motore WASM di LibreOffice non riesce a inizializzarsi. + +Gli header `Content-Encoding: gzip` sui file `.wasm.gz` e `.data.gz` indicano al browser di decomprimerli automaticamente. Senza di essi, il browser riceve byte gzip grezzi e la compilazione WASM fallisce. +::: + +## Variabili d'ambiente + +Impostale in Site settings → Environment variables: + +| Variabile | Descrizione | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Imposta su `true` per una build minimale | +| `VITE_BRAND_NAME` | Nome del brand personalizzato (sostituisce "BentoPDF") | +| `VITE_BRAND_LOGO` | Percorso del logo relativo a `public/` (ad es. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Testo personalizzato del footer/copyright | +| `VITE_DEFAULT_LANGUAGE` | Lingua predefinita dell'interfaccia (ad es. `fr`, `de`, `es`) | + +## Dominio personalizzato + +1. Vai su Site settings → Domain management +2. Fai clic su "Add custom domain" +3. Segui le istruzioni per la configurazione DNS + +## Large Media + +Per i file WASM di grandi dimensioni, valuta di abilitare [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Risoluzione dei problemi + +### Conversione da Word/ODT/Excel a PDF bloccata al 55% + +Se le conversioni dei documenti si bloccano al 55%, apri la Console di DevTools e controlla: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Se `crossOriginIsolated` è `false`, gli header COEP/COOP del tuo `netlify.toml` non vengono applicati. Assicurati che il file sia nella radice del progetto e ripeti il deploy. + +Se nella console vedi `expected magic word 00 61 73 6d, found 1f 8b 08 08`, ai file `.wasm.gz` mancano gli header `Content-Encoding: gzip`. Assicurati che i blocchi `[[headers]]` per `soffice.wasm.gz` e `soffice.data.gz` siano presenti nel tuo `netlify.toml`. + +### La build fallisce + +Controlla la compatibilità della versione di Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Caricamento iniziale lento + +Abilita l'ottimizzazione degli asset in Site settings → Build & deploy → Asset optimization. diff --git a/docs/it/self-hosting/nginx.md b/docs/it/self-hosting/nginx.md new file mode 100644 index 00000000..506289a7 --- /dev/null +++ b/docs/it/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Deploy con Nginx + +Ospita BentoPDF sul tuo server usando Nginx. + +## Prerequisiti + +- Server Ubuntu/Debian +- Nginx installato +- Certificato SSL (consigliato: Let's Encrypt) + +## Passaggio 1: compila il progetto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Per personalizzare il brand, imposta le variabili d'ambiente prima della build: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Passaggio 2: copia i file + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Passaggio 3: configurazione di Nginx + +Crea `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Passaggio 4: abilita il sito + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Passaggio 5: SSL con Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Deploy in una sottodirectory + +Per ospitarlo su `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Compila con: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Ottimizzazione delle prestazioni + +Aggiungi a `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Risoluzione dei problemi + +### WASM non si carica + +Assicurati che il tipo MIME sia impostato: + +```nginx +types { + application/wasm wasm; +} +``` + +### Firma PDF o Compilazione moduli mostra un visualizzatore vuoto (errore MIME `.mjs`) + +Se la console del browser mostra: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…e la richiesta che fallisce termina con `.mjs`, al tuo nginx manca la mappatura `.mjs → application/javascript`. Il visualizzatore PDF incluso (usato da Firma PDF, Compilazione moduli e altri strumenti) distribuisce file ES module con estensione `.mjs`, e il `mime.types` predefinito di nginx non li include. + +Risolvi aggiungendo `mjs` alla riga `application/javascript` esistente in `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> NON aggiungere una _seconda_ riga `application/javascript`: nginx legge `mime.types` riga per riga e vince una sola mappatura tipo-estensione, quindi una seconda riga viene ignorata in silenzio su alcune versioni. Modifica la riga esistente aggiungendo `mjs` accanto a `js`. + +Oppure sovrascrivi localmente nel tuo blocco server (senza modificare il file globale): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Ricarica nginx dopo la modifica: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Per confermare: in DevTools del browser → scheda Network, trova la richiesta `.mjs` che falliva e controlla l'header di risposta `Content-Type`. Ora dovrebbe essere `application/javascript`, non `application/octet-stream`. + +### Conversione da Word/ODT/Excel a PDF non funzionante + +LibreOffice WASM richiede `SharedArrayBuffer`, che necessita degli header `Cross-Origin-Embedder-Policy` e `Cross-Origin-Opener-Policy`. Serve anche un contesto sicuro: `http://localhost` funziona per i test in locale, ma `http://192.168.x.x` o altri IP della LAN di solito richiedono HTTPS. Nota che le direttive `add_header` di nginx in un blocco `location` **sovrascrivono** quelle a livello di server, non si uniscono. Ogni blocco `location` con il proprio `add_header` deve includere gli header COEP/COOP. + +Verifica con: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Se usi un reverse proxy davanti a nginx, assicurati che preservi questi header. + +### 502 Bad Gateway + +Controlla i log degli errori di Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/it/self-hosting/vercel.md b/docs/it/self-hosting/vercel.md new file mode 100644 index 00000000..4ebb5440 --- /dev/null +++ b/docs/it/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Deploy su Vercel + +[Vercel](https://vercel.com) offre l'esperienza di deploy più semplice per i siti statici. + +## Deploy con un clic + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Deploy manuale + +### Passaggio 1: fai il fork del repository + +Fai il fork di [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) sul tuo account GitHub. + +### Passaggio 2: importa su Vercel + +1. Vai su [vercel.com/new](https://vercel.com/new) +2. Seleziona il tuo repository forkato +3. Configura il progetto: + +| Impostazione | Valore | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Passaggio 3: variabili d'ambiente (facoltativo) + +Aggiungile se necessario: + +| Variabile | Descrizione | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Imposta su `true` per un'interfaccia minimale | +| `VITE_BRAND_NAME` | Nome del brand personalizzato (sostituisce "BentoPDF") | +| `VITE_BRAND_LOGO` | Percorso del logo relativo a `public/` (ad es. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Testo personalizzato del footer/copyright | +| `VITE_DEFAULT_LANGUAGE` | Lingua predefinita dell'interfaccia (ad es. `fr`, `de`, `es`) | + +### Passaggio 4: esegui il deploy + +Fai clic su "Deploy" e attendi il completamento della build. + +## Dominio personalizzato + +1. Vai alle impostazioni del progetto +2. Apri "Domains" +3. Aggiungi il tuo dominio personalizzato +4. Configura il DNS come indicato + +## Limitazioni + +::: warning File di grandi dimensioni +Le funzioni serverless di Vercel hanno un limite di 50MB. Poiché BentoPDF è un sito statico, questo non dovrebbe riguardarti, ma i moduli WASM sono grandi (~100MB in totale). Assicurati che vengano serviti dalla cartella `/public`. +::: + +## Risoluzione dei problemi + +### Timeout della build + +Se le build vanno in timeout, prova: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 al ricaricamento + +Aggiungi un `vercel.json` per il routing SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Conversione da Word/ODT/Excel a PDF non funzionante + +Le conversioni WASM di LibreOffice richiedono `SharedArrayBuffer`, che necessita di questi header di risposta su tutte le pagine: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Anche i file precompressi `.wasm.gz` e `.data.gz` richiedono `Content-Encoding: gzip`, così il browser li decomprime. + +Aggiungili al tuo `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Per verificare, apri la Console di DevTools ed esegui `console.log(window.crossOriginIsolated)`: dovrebbe restituire `true`. diff --git a/docs/it/tools/add-attachments.md b/docs/it/tools/add-attachments.md new file mode 100644 index 00000000..569fbc3a --- /dev/null +++ b/docs/it/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Aggiungi allegati +description: Incorpora file di qualsiasi tipo in un PDF a livello di documento o allegati a pagine specifiche. +--- + +# Aggiungi allegati + +Incorpora uno o più file direttamente all'interno di un documento PDF. Gli allegati possono essere aggiunti a livello di documento (visibili nel pannello degli allegati di qualsiasi lettore PDF) oppure associati a pagine specifiche. + +## Come funziona + +1. Carica il PDF a cui vuoi allegare i file. +2. Usa l'area di rilascio degli allegati per selezionare i file da incorporare (di qualsiasi tipo). +3. Scegli il livello dell'allegato: **Documento** (predefinito) o **Pagina**. +4. Se scegli il livello Pagina, inserisci un intervallo di pagine (ad es. `1-3` o `5`). +5. Fai clic sul pulsante di elaborazione. Il PDF modificato viene scaricato con i tuoi file incorporati. + +## Funzionalità + +- Allega qualsiasi tipo di file: immagini, fogli di calcolo, archivi, eseguibili, qualunque cosa +- Posizionamento dell'allegato a livello di documento o di pagina +- È possibile allegare più file in una sola operazione +- Mostra nomi e dimensioni di tutti gli allegati selezionati +- L'output conserva il contenuto originale del PDF con l'aggiunta dei file incorporati + +## Opzioni + +| Opzione | Descrizione | +| --------------------- | ----------------------------------------------------------------------------- | +| **Livello documento** | Allega i file al PDF nel suo insieme, accessibili dal pannello degli allegati | +| **Livello pagina** | Allega i file a pagine specifiche, indicate tramite un intervallo di pagine | + +## Casi d'uso + +- Unire i dati di origine (file Excel, CSV) a un report in PDF +- Allegare i file immagine originali al PDF del portfolio di un fotografo +- Incorporare documenti di supporto in un contratto o in una proposta +- Aggiungere materiali integrativi a pagine specifiche di un manuale di formazione + +## Suggerimenti + +- Gli allegati a livello di documento sono i più supportati dai lettori PDF. Gli allegati a livello di pagina potrebbero non essere visibili in tutti i visualizzatori. +- Non c'è un limite alla dimensione degli allegati, ma file incorporati molto grandi aumenteranno proporzionalmente le dimensioni del PDF. + +## Strumenti correlati + +- [Estrai Allegati](./extract-attachments) +- [Modifica Allegati](./edit-attachments) +- [Unisci PDF](./merge-pdf) diff --git a/docs/it/tools/add-blank-page.md b/docs/it/tools/add-blank-page.md new file mode 100644 index 00000000..6a69f8b5 --- /dev/null +++ b/docs/it/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Aggiungi pagina vuota +description: Inserisci una o più pagine vuote in qualsiasi posizione di un documento PDF. +--- + +# Aggiungi pagina vuota + +Inserisci pagine vuote in un PDF nella posizione che indichi. Decidi tu dove vanno le pagine vuote e quante aggiungerne. + +## Come funziona + +1. Carica un file PDF. Lo strumento mostra il numero di pagine. +2. Inserisci la **posizione** in cui inserire le pagine vuote. Usa `0` per inserirle all'inizio, oppure il numero totale di pagine per aggiungerle alla fine. +3. Inserisci il **numero** di pagine vuote da aggiungere (il valore predefinito è 1). +4. Fai clic sul pulsante di elaborazione. Il PDF modificato viene scaricato con le pagine vuote inserite. + +## Funzionalità + +- Inserimento in qualsiasi posizione: all'inizio, nel mezzo o alla fine del documento +- Aggiunta di più pagine vuote in una sola operazione +- Il suggerimento sulla posizione si aggiorna dinamicamente in base al numero di pagine del PDF caricato +- Pagine vuote in formato A4 standard + +## Casi d'uso + +- Aggiungere una pagina vuota di separazione tra le sezioni di un documento composito +- Inserire pagine vuote per allineare la stampa fronte/retro +- Lasciare spazio per appunti scritti a mano in una guida allo studio stampata +- Riempire un documento per raggiungere un numero minimo di pagine + +## Suggerimenti + +- La posizione `0` inserisce prima della prima pagina. Una posizione pari al numero totale di pagine aggiunge dopo l'ultima pagina. +- Se devi inserire contenuto (non solo pagine vuote) in una posizione specifica, usa [Strumento PDF multifunzione](./pdf-multi-tool) per inserire un altro PDF dopo una determinata pagina. + +## Strumenti correlati + +- [Duplica e Organizza](./organize-pdf) +- [Strumento PDF multifunzione](./pdf-multi-tool) +- [Unisci PDF](./merge-pdf) diff --git a/docs/it/tools/add-page-labels.md b/docs/it/tools/add-page-labels.md new file mode 100644 index 00000000..02c08f92 --- /dev/null +++ b/docs/it/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Aggiungi etichette di pagina +description: Aggiungi etichette di pagina PDF con numeri romani, prefissi alfabetici, numerazione personalizzata e più regole per documento. +--- + +# Aggiungi etichette di pagina + +Le etichette di pagina controllano come vengono mostrati i numeri di pagina nei visualizzatori PDF (il numero nella barra degli strumenti, non quello stampato sulla pagina). Questo strumento ti permette di assegnare schemi di etichettatura diversi a intervalli di pagine diversi: numeri romani per le pagine iniziali, numeri decimali per il corpo del testo, appendici con lettere e altro ancora. + +## Come funziona + +1. Carica il tuo file PDF. +2. Compare il pannello delle opzioni con una regola di etichetta predefinita. +3. Configura ogni regola con un intervallo di pagine, uno stile, un prefisso facoltativo e un valore iniziale. +4. Fai clic su **Aggiungi regola** per creare regole aggiuntive per sezioni diverse. +5. Fai clic su **Aggiungi Etichette di Pagina** per applicare tutte le regole e scaricare il risultato. + +## Opzioni + +Ogni regola di etichetta ha queste impostazioni: + +- **Intervallo di pagine**: le pagine a cui si applica la regola. Lascia vuoto per tutte le pagine. Supporta intervalli come `1-4`, `7`, `odd` o `1-9,30-40`. +- **Stile etichetta**: Arabo decimale, Romano minuscolo (i, ii, iii), Romano maiuscolo (I, II, III), Lettere minuscole (a, b, c), Lettere maiuscole (A, B, C) o Nessuna etichetta (solo prefisso). +- **Prefisso etichetta**: testo facoltativo anteposto a ogni etichetta, ad esempio "A-" per creare etichette come A-1, A-2, A-3. +- **Valore iniziale**: il numero da cui iniziare il conteggio. Il valore predefinito è 1. Imposta 0 per una numerazione che parte da zero. +- **Continua la numerazione tra intervalli non contigui**: attivalo quando una regola riguarda pagine non contigue (come `1-9,30-40` o `odd`) e vuoi che la numerazione prosegua in sequenza. +- **Rimuovi le etichette di pagina esistenti**: selezionato per impostazione predefinita. Cancella le etichette precedenti prima di applicare le nuove regole. + +## Funzionalità + +- Più regole di etichetta per documento, per schemi di numerazione complessi +- Sei stili di etichetta che coprono tutti i sistemi di numerazione standard +- Supporto di prefissi personalizzati per l'etichettatura per sezioni +- Supporto di intervalli non contigui con numerazione progressiva +- Possibilità di mantenere o rimuovere le etichette esistenti + +## Casi d'uso + +- Impostare etichette con numeri romani (i, ii, iii) per la prefazione di un libro e numeri decimali per il testo principale +- Etichettare le pagine delle appendici con prefissi alfabetici come "A-1", "A-2", "B-1", "B-2" +- Correggere le etichette di pagina in un documento scansionato in cui i numeri di pagina fisici non corrispondono all'ordine delle pagine del PDF +- Aggiungere una numerazione che parte da zero per documenti tecnici + +## Suggerimenti + +- Le etichette di pagina sono metadati che i visualizzatori PDF mostrano nella barra di navigazione. Non vengono stampate sulla pagina. Per numeri visibili, usa [Numeri di Pagina](./page-numbers). +- Questo strumento richiede che CoherentPDF (CPDF) sia configurato nelle tue Impostazioni WASM. Se non è configurato, ti verrà chiesto di farlo. + +## Strumenti correlati + +- [Numeri di Pagina](./page-numbers) +- [Numerazione Bates](./bates-numbering) +- [Modifica Segnalibri](./bookmark) diff --git a/docs/it/tools/add-stamps.md b/docs/it/tools/add-stamps.md new file mode 100644 index 00000000..c25c5120 --- /dev/null +++ b/docs/it/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Aggiungi timbri +description: Aggiungi timbri immagine alle pagine del tuo PDF con una barra degli strumenti di annotazione integrata e attribuzione con nome utente. +--- + +# Aggiungi timbri + +Applica timbri immagine alle pagine del tuo PDF usando un visualizzatore integrato con una barra degli strumenti di annotazione per timbri. I timbri possono includere il tuo nome come attribuzione, il che è utile per flussi di approvazione, processi di revisione e contrassegno dei documenti. + +## Come funziona + +1. Inserisci il tuo nome nel campo **Nome utente del timbro**. Questo nome comparirà sui timbri che crei. +2. Carica il tuo file PDF facendo clic o trascinandolo nell'area di rilascio. +3. L'editor dei timbri si apre con il tuo documento caricato in un visualizzatore. +4. Usa lo strumento timbro immagine della barra degli strumenti per selezionare e posizionare i timbri su qualsiasi pagina. +5. Posiziona e ridimensiona i timbri come necessario. +6. Fai clic su **Salva PDF con timbri** per scaricare il risultato. + +## Funzionalità + +- Visualizzatore PDF integrato con una barra degli strumenti di annotazione specifica per i timbri +- Attribuzione con nome utente sui timbri creati +- Posizionamento di timbri immagine su qualsiasi pagina +- Posizionamento e ridimensionamento con trascinamento +- Dimensionamento automatico del visualizzatore in base alle proporzioni della pagina +- Visualizzazione del file con nome e dimensioni + +## Casi d'uso + +- Aggiungere timbri immagine "APPROVATO" o "REVISIONATO" ai documenti in un flusso di revisione +- Applicare immagini di sigilli aziendali o timbri notarili su documenti ufficiali +- Contrassegnare le pagine con timbri "RICEVUTO" che includono il nome del revisore +- Aggiungere timbri di controllo qualità ai rapporti di ispezione + +## Suggerimenti + +- Imposta il nome utente del timbro prima di caricare il PDF. Il nome utente viene incorporato nei metadati del timbro. +- Il visualizzatore adatta la propria altezza alle proporzioni della prima pagina del PDF per una visualizzazione ottimale. +- Per filigrane testuali invece di timbri immagine, usa lo strumento [Aggiungi Filigrana](./add-watermark). + +## Strumenti correlati + +- [Firma PDF](./sign-pdf) +- [Aggiungi Filigrana](./add-watermark) +- [Editor PDF](./edit-pdf) diff --git a/docs/it/tools/add-watermark.md b/docs/it/tools/add-watermark.md new file mode 100644 index 00000000..d1e7ddf2 --- /dev/null +++ b/docs/it/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Aggiungi filigrana +description: Applica filigrane di testo o immagine alle pagine PDF con un editor visivo a trascinamento e anteprima in tempo reale. +--- + +# Aggiungi filigrana + +Aggiungi filigrane di testo o immagine alle pagine del tuo PDF usando un editor visivo. Puoi posizionare la filigrana trascinandola direttamente sull'anteprima, ridimensionarla con le maniglie agli angoli e configurare opacità, rotazione, font e colore. Ogni pagina può avere la propria posizione della filigrana, oppure puoi applicare la stessa filigrana a tutte le pagine in una volta. + +## Come funziona + +1. Carica il tuo file PDF. +2. L'editor si apre con un'anteprima in tempo reale della prima pagina e una filigrana sovrapposta trascinabile. +3. Scegli tra la modalità filigrana **Testo** o **Immagine** con i pulsanti di selezione. +4. Configura le impostazioni della filigrana nel pannello laterale. +5. Trascina la filigrana sull'anteprima per posizionarla esattamente dove vuoi. Usa le maniglie agli angoli per ridimensionarla. +6. Passa da una pagina all'altra per impostare filigrane per singola pagina, oppure lascia selezionato **Applica a tutte le pagine**. +7. Fai clic su **Aggiungi Filigrana** per elaborare e scaricare. + +## Opzioni + +**Impostazioni della filigrana di testo:** + +- **Testo**: il testo della filigrana (ad es. "RISERVATO", "BOZZA"). +- **Dimensione del font**: da 10 a 200 punti. Il valore predefinito è 72. +- **Colore**: qualsiasi colore tramite il selettore di colori. +- **Opacità**: controlla la trasparenza da completamente trasparente a completamente opaco. +- **Rotazione**: ruota il testo della filigrana da -180 a 180 gradi. + +**Impostazioni della filigrana immagine:** + +- **Caricamento immagine**: carica un file PNG, JPG o altra immagine da usare come filigrana. +- **Opacità**: controlla la trasparenza dell'immagine. +- **Scala**: ridimensiona la filigrana immagine. + +**Impostazioni di layout:** + +- **Singola**: una filigrana per pagina, posizionata trascinandola o con i preset di posizione. +- **A mosaico**: ripete la filigrana su tutta la pagina in una griglia diagonale che segue l'angolo di rotazione, in modo che il segno copra il documento da un bordo all'altro. +- **Spaziatura orizzontale**: spazio tra le tessere lungo la direzione del testo, come percentuale della larghezza della filigrana (solo in modalità a mosaico). +- **Spaziatura verticale**: spazio tra le righe di tessere, come percentuale dell'altezza della filigrana (solo in modalità a mosaico). + +**Impostazioni generali:** + +- **Applica a tutte le pagine**: quando è selezionato, la stessa filigrana viene applicata a ogni pagina. Deseleziona per impostare filigrane individuali per pagina. +- **Intervallo di pagine**: indica quali pagine ricevono la filigrana (ad es. "1-3, 5, 7-9" oppure "all"). + +## Funzionalità + +- Posizionamento visivo tramite trascinamento su un'anteprima PDF in tempo reale +- Filigrana ridimensionabile con maniglie agli angoli +- Modalità filigrana di testo e di immagine +- Layout singolo o a mosaico (ripetuto) su tutta la pagina con spaziatura regolabile +- Applicazione della filigrana per singola pagina o globale +- Navigazione pagina per pagina nell'anteprima +- Controlli di opacità e rotazione +- Filtro per intervallo di pagine + +## Casi d'uso + +- Contrassegnare i documenti in bozza con "BOZZA" prima di farli circolare per la revisione +- Aggiungere filigrane "RISERVATO" a report finanziari sensibili +- Personalizzare i documenti con una filigrana immagine del logo aziendale +- Applicare "CAMPIONE" alla documentazione di prodotto condivisa con potenziali clienti +- Aggiungere avvisi di copyright ai materiali PDF distribuiti + +## Suggerimenti + +- Per filigrane diagonali sulla pagina, imposta una rotazione di circa 45 gradi e aumenta la dimensione del font. +- La modalità a mosaico rende il documento molto più difficile da riutilizzare dopo un ritaglio, perché rimuovere un segno ne lascia comunque dozzine. Riduci l'opacità quando usi il mosaico, così il testo sottostante resta leggibile. +- Le filigrane immagine con sfondo trasparente (formato PNG) si fondono più naturalmente con il contenuto del documento. +- Se ti servono testi di filigrana diversi su pagine diverse, deseleziona "Applica a tutte le pagine" e passa da una pagina all'altra. + +## Strumenti correlati + +- [Intestazione e Piè di Pagina](./header-footer) +- [Aggiungi Timbri](./add-stamps) +- [Numerazione Bates](./bates-numbering) +- [Firma PDF](./sign-pdf) diff --git a/docs/it/tools/adjust-colors.md b/docs/it/tools/adjust-colors.md new file mode 100644 index 00000000..25c84ead --- /dev/null +++ b/docs/it/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Regola colori +description: Regola con precisione luminosità, contrasto, saturazione, tonalità, temperatura, tinta, gamma e seppia nel tuo PDF. +--- + +# Regola colori + +Un set completo di strumenti di color grading per i PDF. Regola otto parametri indipendenti (luminosità, contrasto, saturazione, variazione di tonalità, temperatura, tinta, gamma e seppia) con un'anteprima in tempo reale che si aggiorna mentre muovi ogni cursore. + +## Come funziona + +1. Carica il tuo file PDF. +2. L'editor si apre mostrando un'anteprima della prima pagina e un pannello delle impostazioni colore. +3. Muovi i cursori per regolare ogni parametro colore. L'anteprima si aggiorna in tempo reale. +4. Fai clic su **Reimposta** per riportare tutti i cursori alle posizioni predefinite. +5. Fai clic su **Applica** per elaborare tutte le pagine e scaricare il PDF regolato. + +## Opzioni + +- **Luminosità**: schiarisce o scurisce l'intera pagina (da -100 a +100). +- **Contrasto**: aumenta o riduce la differenza tra le aree chiare e scure (da -100 a +100). +- **Saturazione**: aumenta o riduce l'intensità dei colori (da -100 a +100). Impostando -100 si ottiene un risultato in scala di grigi. +- **Variazione di tonalità**: ruota la ruota dei colori per spostare uniformemente tutti i colori. +- **Temperatura**: sposta i colori verso toni più caldi (giallo/arancione) o più freddi (blu). +- **Tinta**: aggiunge una dominante verde o magenta. +- **Gamma**: regola la luminosità dei mezzitoni con una curva gamma. Valori inferiori a 1.0 scuriscono i mezzitoni, valori superiori a 1.0 li schiariscono. +- **Seppia**: applica il classico effetto seppia. Valori più alti producono una tinta marrone più intensa. + +## Funzionalità + +- Otto parametri colore regolabili in modo indipendente +- Anteprima in tempo reale che risponde subito alle modifiche dei cursori +- Pulsante di reimpostazione per tornare rapidamente ai valori predefiniti +- Elabora tutte le pagine del documento +- Funziona con qualsiasi contenuto PDF (testo, immagini, grafica) + +## Casi d'uso + +- Schiarire una scansione scura o correggere pagine sovraesposte +- Desaturare un documento colorato per ridurre il consumo di inchiostro prima della stampa +- Applicare un tono seppia per dare un aspetto antico a certificati o riconoscimenti +- Correggere la temperatura colore di foto incorporate in un PDF +- Aumentare il contrasto di documenti scansionati sbiaditi o di bassa qualità + +## Suggerimenti + +- Per una rapida conversione in scala di grigi, trascina il cursore della saturazione fino a -100. +- Il cursore gamma è particolarmente utile per migliorare la leggibilità dei documenti scansionati in cui i mezzitoni sono troppo scuri o troppo chiari. +- Come gli altri strumenti di effetti immagine, questo rasterizza ogni pagina. L'output sarà basato su immagini, quindi il testo non sarà selezionabile. + +## Strumenti correlati + +- [Inverti Colori](./invert-colors) +- [Effetto scanner](./scanner-effect) +- [Colore di Sfondo](./background-color) diff --git a/docs/it/tools/alternate-merge.md b/docs/it/tools/alternate-merge.md new file mode 100644 index 00000000..895943ca --- /dev/null +++ b/docs/it/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alterna e mescola pagine +description: Unisci i PDF alternando le pagine di ciascun file, con conservazione dei segnalibri. +--- + +# Alterna e mescola pagine + +Alterna le pagine di più file PDF in modo che si susseguano tra un documento e l'altro. È lo strumento giusto quando un'unione standard accoderebbe semplicemente i file uno dopo l'altro, ma a te serve la pagina 1 del File A, poi la pagina 1 del File B, poi la pagina 2 del File A, e così via. + +## Come funziona + +1. Carica almeno due file PDF usando l'area di rilascio. +2. Lo strumento mostra ogni file con il numero di pagine e la dimensione. +3. Trascina le maniglie per riordinare quale file fornisce per primo le pagine nella sequenza di alternanza. +4. Fai clic su **Mescola pagine** per produrre l'output alternato. +5. Il risultato viene scaricato come `alternated-mixed.pdf`. + +## Funzionalità + +- Alterna le pagine di un numero qualsiasi di PDF (minimo due) +- Riordino dei file con trascinamento per controllare la priorità di alternanza +- Conserva i segnalibri dei documenti di origine +- Mostra il numero di pagine e la dimensione di ogni file caricato +- Elaborazione tramite un web worker dedicato per un'interfaccia reattiva + +## Casi d'uso + +- Ricomporre scansioni fronte/retro in cui le pagine dispari e pari sono state scansionate separatamente +- Combinare fogli di domande con le chiavi di risposta, in modo che ogni domanda sia seguita dalla sua risposta +- Unire documenti bilingue pagina per pagina (ad es. inglese su un lato, traduzione sul successivo) +- Alternare le scansioni di fronte e retro ottenute da uno scanner a facciata singola + +## Suggerimenti + +- Se i PDF di origine hanno un numero di pagine diverso, le pagine del documento più corto finiranno per prime e le pagine rimanenti del documento più lungo appariranno alla fine. +- L'ordine dei file conta: il primo file dell'elenco fornisce la prima pagina dell'output. Trascina per riordinare se necessario. + +## Strumenti correlati + +- [Unisci PDF](./merge-pdf) +- [Duplica e Organizza](./organize-pdf) +- [Dividi PDF](./split-pdf) diff --git a/docs/it/tools/background-color.md b/docs/it/tools/background-color.md new file mode 100644 index 00000000..9eac83de --- /dev/null +++ b/docs/it/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Colore di sfondo +description: Cambia il colore di sfondo di ogni pagina del tuo PDF mantenendo tutto il contenuto in primo piano. +--- + +# Colore di sfondo + +Imposta un colore di sfondo uniforme dietro tutto il contenuto esistente del tuo PDF. Lo strumento crea un rettangolo colorato su ogni pagina e sovrappone il contenuto originale, così testo, immagini e grafica restano pienamente visibili sul nuovo sfondo. + +## Come funziona + +1. Carica il tuo file PDF. +2. Scegli un colore di sfondo con il selettore di colori. Il valore predefinito è un giallo chiaro (#FFFFCC). +3. Fai clic su **Cambia Colore di Sfondo** per elaborare. +4. Il PDF aggiornato viene scaricato automaticamente. + +## Opzioni + +- **Colore di Sfondo**: un selettore di colori standard per scegliere qualsiasi colore a tinta unita. Il valore predefinito è il giallo chiaro. + +## Funzionalità + +- Applica un colore di sfondo uniforme a ogni pagina +- Conserva tutto il contenuto originale (testo, immagini, grafica vettoriale) sopra lo strato colorato +- Mantiene le dimensioni originali delle pagine +- Funziona con documenti di qualsiasi numero di pagine + +## Casi d'uso + +- Aggiungere uno sfondo crema o avorio chiaro per dare ai documenti un aspetto più morbido, simile alla carta +- Codificare con i colori gruppi di documenti applicando sfondi diversi a categorie diverse +- Creare versioni visivamente distinte dello stesso documento per pubblici diversi +- Aggiungere una leggera tinta di sfondo per migliorare la leggibilità quando si proiettano i documenti sullo schermo + +## Suggerimenti + +- I colori chiari e tenui funzionano meglio. Uno sfondo molto scuro può rendere il testo difficile da leggere, a meno che il testo non sia già di colore chiaro. +- Se vuoi cambiare sia lo sfondo sia il colore del testo, applica prima il colore di sfondo, poi usa [Cambia Colore Testo](./text-color) sul risultato. +- Questo strumento lavora a livello strutturale del PDF (senza rasterizzazione), quindi il testo resta selezionabile e ricercabile nell'output. + +## Strumenti correlati + +- [Cambia Colore Testo](./text-color) +- [Inverti Colori](./invert-colors) +- [Regola colori](./adjust-colors) diff --git a/docs/it/tools/bates-numbering.md b/docs/it/tools/bates-numbering.md new file mode 100644 index 00000000..3243620a --- /dev/null +++ b/docs/it/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Numerazione Bates +description: Applica numeri Bates a uno o più PDF con modelli personalizzabili, riempimento, font e posizionamento. +--- + +# Numerazione Bates + +La numerazione Bates applica identificatori sequenziali a ogni pagina dei tuoi PDF. È il metodo standard per etichettare i documenti nei procedimenti legali, negli audit e nei flussi di conformità. Questo strumento supporta più file e modelli personalizzabili, e produce PDF numerati singolarmente oppure un unico archivio ZIP. + +## Come funziona + +1. Carica uno o più file PDF. Puoi trascinare più file contemporaneamente. +2. Scegli un preset di stile o crea un modello personalizzato. +3. Configura posizione, font, dimensione, colore e numeri iniziali. +4. Fai clic su **Applica Numeri Bates** per elaborare. +5. Un singolo file viene scaricato direttamente. Più file vengono scaricati come archivio ZIP. + +## Opzioni + +- **Preset di stile**: scegli tra i formati integrati: + - Esibito + Caso + Bates + Pagina (ad es. "Exhibit 1 Case XYZ 000001 Page 1") + - Esibito + Caso + Bates (senza numero di pagina) + - Caso + Bates + - Solo numero Bates (ad es. "000001") + - Personalizzato (scrivi il tuo modello) +- **Personalizza stile**: una stringa modello che usa i segnaposto: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Riempimento Bates**: numero di cifre (da 3 a 6) per i numeri Bates con zeri iniziali. Visibile solo in modalità personalizzata. +- **Posizione**: intestazione o piè di pagina, a sinistra, al centro o a destra. +- **Il Bates inizia da**: il primo numero Bates. Il valore predefinito è 1. La numerazione prosegue tra i file. +- **Il contatore file inizia da**: il numero iniziale per il segnaposto `[FILE]`. +- **Font**: Helvetica, Times New Roman o Courier. +- **Dimensione del font**: dimensione del testo applicato. +- **Colore**: selettore di colori per il testo del numero Bates. + +## Funzionalità + +- Anteprima in tempo reale che mostra come appariranno i numeri Bates in tutti i file caricati +- Supporto di più file con numerazione continua tra i documenti +- Riordino dei file con trascinamento per controllare la sequenza di numerazione +- Sei opzioni di posizione (intestazione/piè di pagina, sinistra/centro/destra) +- Calcolo adattivo dei margini che rispetta i diversi formati di pagina +- Output ZIP per lotti di più file +- Segnaposto nei modelli per la massima flessibilità + +## Casi d'uso + +- Applicare numeri di esibito sequenziali ai documenti di discovery per le cause legali +- Numerare pacchetti di prove di audit che comprendono decine di file +- Applicare numeri di riferimento normativi alla documentazione di conformità +- Etichettare gli allegati di una domanda di brevetto con identificatori specifici del caso + +## Suggerimenti + +- Trascina i file nell'elenco per riordinarli prima dell'elaborazione. La sequenza di numerazione Bates segue questo ordine. +- Usa il segnaposto `[FILENAME]` per includere il nome del file originale nel timbro, così è più facile risalire dalle pagine ai documenti di origine. +- Il riquadro di anteprima si aggiorna in tempo reale mentre cambi le impostazioni, così puoi verificare il formato prima di elaborare. + +## Strumenti correlati + +- [Numeri di Pagina](./page-numbers) +- [Aggiungi Etichette di Pagina](./add-page-labels) +- [Intestazione e Piè di Pagina](./header-footer) diff --git a/docs/it/tools/bmp-to-pdf.md b/docs/it/tools/bmp-to-pdf.md new file mode 100644 index 00000000..11836680 --- /dev/null +++ b/docs/it/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP in PDF +description: Converti le immagini bitmap BMP in formato PDF direttamente nel tuo browser, senza caricare nulla su alcun server. +--- + +# BMP in PDF + +Converti i file Windows Bitmap (BMP) in PDF. BMP è un formato immagine non compresso ancora presente nei sistemi legacy, nell'imaging medico e negli scanner industriali. Questo strumento li converte in PDF senza bisogno di installare nulla. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :--------- | +| BMP | `.bmp` | + +## Come funziona + +1. Fai clic sull'area di caricamento oppure trascina i tuoi file BMP. +2. Controlla l'elenco dei file. Aggiungi altri file o rimuovi quelli che non vuoi. +3. Fai clic su **Converti in PDF**. L'output viene scaricato come `from_bmps.pdf`. + +Ogni BMP viene disegnato su un canvas, esportato come PNG e poi incorporato nel PDF tramite pdf-lib. Le dimensioni della pagina corrispondono a quelle dell'immagine originale. + +## Opzioni + +Questo strumento non offre impostazioni di qualità aggiuntive. Le immagini vengono incorporate alla loro risoluzione originale come PNG senza perdita all'interno del PDF. + +## Casi d'uso + +- Convertire documenti scansionati legacy salvati come BMP in PDF per l'archiviazione +- Trasformare screenshot BMP di vecchie applicazioni Windows in documenti condivisibili +- Elaborare l'output di scanner medicali o industriali che usano BMP per impostazione predefinita +- Migrare vecchi archivi di immagini verso un formato più portabile + +## Suggerimenti + +- I file BMP non sono compressi, quindi tendono a essere grandi. Il PDF risultante sarà molto più piccolo, perché internamente le immagini vengono ricodificate come PNG. +- Se hai file BMP insieme ad altri formati di immagine, usa lo strumento [Immagini in PDF](./image-to-pdf) per convertire tutto in un unico lotto. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [PNG in PDF](./png-to-pdf) +- [TIFF in PDF](./tiff-to-pdf) diff --git a/docs/it/tools/bookmark.md b/docs/it/tools/bookmark.md new file mode 100644 index 00000000..fe6af782 --- /dev/null +++ b/docs/it/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Modifica segnalibri +description: Aggiungi, modifica, importa, esporta ed elimina i segnalibri dei PDF con un editor visuale e supporto CSV/JSON. +--- + +# Modifica segnalibri + +L'editor di segnalibri ti dà il pieno controllo sui segnalibri di navigazione del PDF (detti anche struttura o outline). Puoi aggiungere nuovi segnalibri, modificare quelli esistenti, riorganizzare la gerarchia e importare o esportare i dati dei segnalibri in formato CSV e JSON. + +## Come funziona + +1. Carica il tuo PDF facendo clic o trascinando un file nell'area di rilascio. +2. Facoltativamente, seleziona **Estrai automaticamente segnalibri esistenti** per importare l'albero dei segnalibri attuale del documento. +3. L'editor si apre con una vista divisa: il visualizzatore PDF a sinistra, il pannello dei segnalibri a destra. +4. Digita il titolo di un segnalibro e fai clic su **Aggiungi alla pagina** per crearne uno che punta alla pagina corrente. +5. Usa i pulsanti della barra degli strumenti per riordinare, formattare o eliminare i segnalibri. +6. Fai clic su **Salva PDF con segnalibri** per scaricare il file aggiornato. + +## Funzionalità + +- Visualizzatore PDF con navigazione tra le pagine, controlli dello zoom e campo per andare a una pagina +- Aggiungi segnalibri a qualsiasi pagina con un solo clic +- Fai clic direttamente sul PDF per impostare una destinazione precisa del segnalibro (modalità selezione) +- Gerarchia di segnalibri annidati con riordinamento tramite trascinamento +- Operazioni in blocco: seleziona più segnalibri per cambiarne colore e stile o eliminarli in una volta +- Ricerca dei segnalibri per trovare rapidamente le voci in alberi grandi +- Annulla e ripeti per tutte le modifiche +- Importa segnalibri da file CSV (titolo, pagina, livello) o JSON +- Esporta i segnalibri in CSV o JSON per modificarli all'esterno +- Stile dei segnalibri: colore (rosso, blu, verde, giallo, viola) e stile del carattere (grassetto, corsivo, grassetto corsivo) +- Navigazione rapida: scorri le pagine con i tasti Pag su/giù + +## Opzioni + +- **Estrai automaticamente segnalibri esistenti**: se selezionata, lo strumento legge e mostra i segnalibri attuali del PDF al caricamento. +- **Modalità batch**: attivala per selezionare più segnalibri e applicare in blocco colore, stile o eliminazione. +- **Espandi tutto / Comprimi tutto**: mostra o nascondi rapidamente i segnalibri figli annidati. + +## Casi d'uso + +- Aggiungere un indice a un manuale o a un libro di testo privo di segnalibri +- Ristrutturare i segnalibri in un documento scansionato dopo l'elaborazione OCR +- Esportare i segnalibri in CSV, modificarli in un foglio di calcolo e reimportarli +- Ripulire segnalibri generati automaticamente con riferimenti di pagina errati +- Aggiungere segnalibri colorati per evidenziare le sezioni importanti in una memoria legale + +## Suggerimenti + +- Usa l'importazione CSV per creare segnalibri in massa. Il formato è semplice: `title,page,level`, dove il livello 1 è il livello principale. +- La modalità selezione ti permette di fare clic su un punto esatto della pagina PDF per impostare la destinazione del segnalibro, in modo più preciso rispetto al solo numero di pagina. +- Esporta i segnalibri prima di apportare modifiche importanti, così avrai un backup. + +## Strumenti correlati + +- [Indice](./table-of-contents) +- [Editor PDF](./edit-pdf) +- [Aggiungi etichette di pagina](./add-page-labels) diff --git a/docs/it/tools/cbz-to-pdf.md b/docs/it/tools/cbz-to-pdf.md new file mode 100644 index 00000000..67f41990 --- /dev/null +++ b/docs/it/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ in PDF +description: Converti gli archivi di fumetti CBZ e CBR in PDF nel tuo browser. Gratuito, privato, senza caricamenti. +--- + +# CBZ in PDF + +Trasforma gli archivi di fumetti in PDF. CBZ e CBR sono i formati standard per i fumetti digitali: sono semplici archivi ZIP o RAR pieni di immagini. Questo strumento estrae ogni pagina, mantiene l'ordine di lettura e produce un PDF pulito in cui ogni immagine diventa una pagina a dimensione intera. + +## Formati supportati + +| Formato | Estensione | Note | +| :------ | :--------- | :---------------------------------------------------------------------- | +| CBZ | `.cbz` | Archivio di fumetti basato su ZIP (elaborato in locale con pdf-lib) | +| CBR | `.cbr` | Archivio di fumetti basato su RAR (elaborato tramite il motore PyMuPDF) | + +Il convertitore CBZ riconosce le immagini JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC e JXL contenute nell'archivio. I formati non standard vengono convertiti automaticamente in PNG prima di essere incorporati. + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file CBZ o CBR. Puoi mescolare entrambi i formati in un unico lotto. +2. Controlla i file elencati. Rimuovi quelli che non ti servono oppure fai clic su **Aggiungi altri file** per aggiungerne altri. +3. Fai clic su **Converti in PDF**. Per i file CBZ, lo strumento decomprime l'archivio, ordina le immagini per nome in ordine naturale, rileva il formato reale di ogni immagine e le incorpora in un PDF con pdf-lib. I file CBR passano invece dal motore PyMuPDF. +4. Un singolo file viene scaricato come PDF. Più file producono un archivio ZIP chiamato `comic-converted.zip`. + +## Opzioni + +Non serve alcuna configurazione. Ogni immagine diventa una pagina con le stesse dimensioni dell'originale, quindi le doppie pagine restano larghe e le pagine singole restano strette. + +## Casi d'uso + +- Leggere i fumetti su un tablet o su un'app per smartphone che supporta il PDF ma non CBZ/CBR +- Stampare pagine specifiche da un fumetto digitale +- Archiviare una collezione di fumetti in un formato che qualsiasi visualizzatore di file può aprire +- Condividere un fumetto con chi non ha un lettore di fumetti dedicato + +## Suggerimenti + +- Le immagini all'interno dell'archivio sono ordinate in ordine naturale (quindi `page2.jpg` viene prima di `page10.jpg`). Assegna ai file una numerazione coerente per ottenere la sequenza di pagine corretta. +- Il convertitore rileva i formati delle immagini dalle firme binarie, non dalle estensioni dei file. Un PNG chiamato per errore `.jpg` verrà comunque incorporato correttamente. +- I file CBZ vengono elaborati interamente nel browser senza caricare il motore PyMuPDF, quindi si convertono più velocemente dei file CBR. + +## Strumenti correlati + +- [EPUB in PDF](./epub-to-pdf) +- [MOBI in PDF](./mobi-to-pdf) +- [Immagini in PDF](./image-to-pdf) diff --git a/docs/it/tools/change-permissions.md b/docs/it/tools/change-permissions.md new file mode 100644 index 00000000..4233e842 --- /dev/null +++ b/docs/it/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Modifica permessi +description: Imposta o modifica i permessi di utilizzo del PDF per stampa, copia, modifica e annotazione. Usa la crittografia AES a 256 bit. +--- + +# Modifica permessi + +Definisci con precisione cosa possono fare i destinatari con il tuo PDF. A differenza della semplice crittografia che si limita a bloccare il file con una password, questo strumento ti permette di consentire o negare selettivamente stampa, copia, modifica, annotazione, compilazione dei moduli, assemblaggio del documento ed estrazione delle pagine, il tutto applicato tramite crittografia AES a 256 bit. + +## Come funziona + +1. Carica un file PDF. +2. Se il PDF è già crittografato, inserisci la **Password attuale**. +3. Imposta una **Nuova password utente** (necessaria per aprire il file) e/o una **Nuova password proprietario** (controlla i permessi). +4. Attiva o disattiva i singoli permessi con le caselle di controllo. +5. Fai clic su **Modifica permessi**. +6. Scarica il PDF aggiornato. + +Se lasci vuoti entrambi i campi delle nuove password, lo strumento decrittografa completamente il PDF, rimuovendo ogni crittografia e restrizione. + +## Controlli dei permessi + +| Permesso | Cosa controlla | +| ----------------------------------------- | ------------------------------------------------------------ | +| **Consenti la stampa** | Se il documento può essere stampato | +| **Consenti la copia del testo** | Se testo e immagini possono essere selezionati e copiati | +| **Consenti la modifica** | Se il contenuto del documento può essere modificato | +| **Consenti le annotazioni** | Se possono essere aggiunti commenti, evidenziazioni e timbri | +| **Consenti la compilazione dei moduli** | Se i campi modulo interattivi possono essere compilati | +| **Consenti l'assemblaggio del documento** | Se le pagine possono essere inserite, eliminate o ruotate | +| **Consenti l'estrazione di pagine** | Se le singole pagine possono essere estratte | + +Tutti i permessi richiedono una password del proprietario per essere applicati. Senza una password del proprietario, i flag dei permessi vengono ignorati dalla maggior parte dei lettori PDF. + +## Come funzionano i permessi nel PDF + +I permessi del PDF fanno parte della specifica di crittografia. Sono memorizzati come flag di bit nel dizionario di crittografia e applicati dai lettori PDF conformi. La distinzione fondamentale: + +- **Password utente**: necessaria per aprire il file. +- **Password del proprietario**: necessaria per cambiare i permessi o rimuovere le restrizioni. Senza di essa, i flag dei permessi controllano quali operazioni può eseguire l'utente. + +Se imposti solo una password del proprietario (senza password utente), chiunque può aprire il file ma è limitato alle operazioni consentite. Se le imposti entrambe, il file richiede una password per essere aperto ed è limitato dopo l'autenticazione. + +## Casi d'uso + +- Distribuire un report che può essere visualizzato e stampato ma non modificato né copiato +- Condividere un modello di contratto che i destinatari possono compilare ma non modificare +- Pubblicare un catalogo PDF in cui la copia delle immagini è disabilitata +- Consentire le annotazioni su una bozza in revisione impedendo modifiche strutturali + +## Suggerimenti + +- Per essere efficace, imposta sempre una password del proprietario. I permessi senza password del proprietario non possono essere fatti rispettare. +- Alcuni strumenti PDF di terze parti ignorano i flag dei permessi. Per una protezione più forte, valuta di rasterizzare il PDF o di usare il DRM. +- Usa questo strumento per aggiornare i vecchi PDF crittografati con RC4 ad AES-256. + +## Strumenti correlati + +- [Proteggi PDF](./protect-pdf): protezione semplice con password, senza permessi granulari +- [Sblocca PDF](./unlock-pdf): rimuove completamente la crittografia +- [Rimuovi Restrizioni](./remove-restrictions): elimina tutte le restrizioni quando hai la password del proprietario diff --git a/docs/it/tools/combine-single-page.md b/docs/it/tools/combine-single-page.md new file mode 100644 index 00000000..d712f89f --- /dev/null +++ b/docs/it/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Combina in una pagina +description: Unisci tutte le pagine di un PDF in un unico scorrimento continuo verticale o orizzontale. +--- + +# Combina in una pagina + +Unisci ogni pagina di un PDF in un'unica pagina lunga. Le pagine vengono affiancate in verticale (come un rotolo) o in orizzontale (una accanto all'altra), producendo una sola pagina continua in uscita. + +## Come funziona + +1. Carica un file PDF. +2. Seleziona la direzione del layout: **Verticale** (pagine impilate dall'alto in basso) oppure **Orizzontale** (pagine affiancate). +3. Imposta la spaziatura tra le pagine in punti. +4. Scegli un colore di sfondo per gli spazi tra le pagine. +5. Facoltativamente, attiva i separatori (linee sottili tra le pagine) e configurane spessore e colore. +6. Fai clic sul pulsante di elaborazione. Il risultato è un PDF di una sola pagina. + +## Funzionalità + +- Unione delle pagine in verticale o in orizzontale +- Spaziatura configurabile tra le pagine +- Selettore del colore di sfondo per le aree di spazio +- Linee di separazione facoltative con spessore e colore regolabili +- Rende ogni pagina originale a piena risoluzione sul canvas combinato + +## Opzioni + +| Opzione | Descrizione | +| --------------------------------- | ----------------------------------------------- | +| **Direzione del layout** | Verticale (impilate) o orizzontale (affiancate) | +| **Spaziatura** | Spazio tra le pagine in punti | +| **Colore di sfondo** | Colore dell'area tra le pagine | +| **Aggiungi linee di separazione** | Attiva le linee sottili tra le pagine | +| **Spessore del separatore** | Spessore della linea in punti | +| **Colore del separatore** | Colore delle linee di separazione | + +## Casi d'uso + +- Creare un'unica immagine lunga da un wireframe o un mockup di design su più pagine +- Generare una vista continua e scorrevole di un documento da incorporare nel web +- Unire un fumetto o uno storyboard di più pagine in un'unica striscia +- Produrre una vista panoramica di pagine in sequenza per la revisione + +## Suggerimenti + +- L'orientamento verticale funziona meglio per i documenti con pagine verticali. Quello orizzontale è migliore per i contenuti in formato orizzontale. +- I documenti grandi con molte pagine producono un risultato molto alto o molto largo. Alcuni visualizzatori PDF potrebbero avere difficoltà con pagine singole estremamente grandi. +- Aggiungere separatori di un colore a contrasto rende facile capire dove finisce una pagina originale e inizia la successiva. + +## Strumenti correlati + +- [N-Up PDF](./n-up-pdf) +- [Unisci PDF](./merge-pdf) +- [Dividi Pagine](./divide-pages) diff --git a/docs/it/tools/compare-pdfs.md b/docs/it/tools/compare-pdfs.md new file mode 100644 index 00000000..324c9bc9 --- /dev/null +++ b/docs/it/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Confronta PDF +description: Confronta due documenti PDF affiancati o in modalità sovrapposizione, con rilevamento e classificazione dettagliati delle modifiche. +--- + +# Confronta PDF + +Carica due PDF e scopri esattamente cosa è cambiato tra l'uno e l'altro. Lo strumento abbina le pagine in modo intelligente, rileva le differenze in testo, immagini, annotazioni, intestazioni e formattazione e le presenta in una vista affiancata o sovrapposta. + +## Come funziona + +1. Carica due file PDF: l'originale (a sinistra) e la versione rivista (a destra). +2. Lo strumento abbina le pagine tra i documenti usando le firme del contenuto. +3. Seleziona una modalità di visualizzazione: **Fianco a fianco** oppure **Sovrapposizione**. +4. Spostati tra le coppie di pagine con i controlli di paginazione. +5. Le differenze vengono evidenziate e classificate. Usa il pannello dei filtri per concentrarti su tipi di modifica specifici. +6. Facoltativamente, esporta il confronto come report PDF. + +## Funzionalità + +- Abbinamento automatico delle pagine in base alla somiglianza del contenuto +- Viste di confronto affiancata e sovrapposta +- Classificazione delle modifiche: testo, immagine, intestazione/piè di pagina, annotazione, formattazione, sfondo +- Filtri per categoria per mostrare o nascondere tipi di modifica specifici +- Ricerca nelle modifiche di testo con filtro per query +- Supporto OCR per confrontare documenti scansionati +- Controlli dello zoom per un'ispezione dettagliata +- Scorrimento sincronizzato tra i pannelli nella vista affiancata +- Esporta i risultati del confronto come PDF + +## Opzioni + +| Opzione | Descrizione | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| **Modalità di visualizzazione** | Fianco a fianco o Sovrapposizione | +| **OCR** | Attiva/disattiva l'OCR per il confronto di documenti scansionati | +| **Lingua OCR** | Lingua per l'estrazione del testo con OCR | +| **Filtri per categoria** | Attiva o disattiva la visibilità delle modifiche a testo, immagini, intestazioni/piè di pagina, annotazioni, formattazione e sfondo | +| **Ambito delle modifiche** | Nella modalità sovrapposizione, filtra tra tutte le modifiche o solo il contenuto | +| **Zoom** | Regola il livello di ingrandimento per un'ispezione dettagliata | + +## Casi d'uso + +- Rivedere le revisioni di un contratto per trovare esattamente cosa è cambiato tra le versioni +- Confrontare mockup di design per verificare che le esportazioni PDF corrispondano alle aspettative +- Verificare le modifiche ai documenti nei settori regolamentati, dove ogni modifica deve essere tracciata +- Controllare che un processo di conversione PDF abbia preservato fedelmente il contenuto originale +- Confrontare i documenti tradotti con l'originale per individuare cambiamenti di layout + +## Suggerimenti + +- La vista sovrapposta impila i due documenti uno sull'altro, rendendo subito visibili le differenze spaziali (elementi spostati, immagini ridimensionate). +- Attiva l'OCR quando confronti documenti scansionati privi di livello di testo. Il motore di confronto estrarrà il testo dalle immagini delle pagine. +- Usa i filtri per categoria per concentrarti su ciò che conta. Ad esempio, nascondi le modifiche di formattazione quando ti interessano solo le differenze di testo. + +## Strumenti correlati + +- [Visualizza Metadati](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Unisci PDF](./merge-pdf) diff --git a/docs/it/tools/compress-pdf.md b/docs/it/tools/compress-pdf.md new file mode 100644 index 00000000..51d2c499 --- /dev/null +++ b/docs/it/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Comprimi PDF +description: Riduci le dimensioni dei PDF fino al 90% con il motore Hyper Compress. Supporta dimensioni di destinazione, elaborazione in blocco e impostazioni di qualità personalizzate. +--- + +# Comprimi PDF + +Riduci i tuoi file PDF senza rovinarli. Comprimi PDF è basato su [Hyper Compress](https://www.bentopdf.com/hyper-compress), il motore di compressione di BentoPDF. Ricomprime le immagini, crea sottoinsiemi e unisce i font ed elimina il peso inutile, come le miniature incorporate e i dati privati delle applicazioni. Il PDF resta pienamente funzionante: il testo rimane selezionabile, i link e i campi modulo continuano a funzionare. + +Hyper Compress è compilato in WebAssembly e viene distribuito con BentoPDF, quindi la compressione funziona offline e nelle installazioni isolate dalla rete (air-gapped), senza alcuna configurazione aggiuntiva. + +## Come funziona + +1. Carica uno o più PDF facendo clic sull'area di rilascio o trascinando i file. +2. Scegli un **Livello di compressione**: Basso, Medio, Alto o Senza perdita. +3. Facoltativamente, inserisci una **Dimensione file di destinazione**, oppure espandi **Impostazioni personalizzate** per un controllo più preciso, inclusa l'opzione **Converti in scala di grigi**. +4. Fai clic su **Comprimi PDF**. Con più file, ottieni un unico download ZIP. + +## Documenti particolari + +- **I PDF firmati digitalmente** vengono restituiti invariati, perché qualsiasi modifica invaliderebbe la firma. Attiva **Ignora la protezione dei contenuti** in Impostazioni personalizzate per rimuovere le firme e comprimerli; la firma visibile resta sulla pagina, ma il file non è più firmato. +- **I file PDF/A** perdono l'etichetta PDF/A dopo la compressione, così il file non dichiara mai una conformità che non rispetta più. Attiva **Mantieni PDF/A** in Impostazioni personalizzate per mantenere invece la conformità del file. +- **I PDF protetti da password** mostrano un campo password nella scheda del file. Inserisci lì la password e Hyper Compress apre il file da solo, senza un passaggio di sblocco separato. Con due o più file bloccati, un unico campo condiviso sblocca tutti i file che usano la stessa password. La copia compressa non ha password; usa [Proteggi PDF](./protect-pdf) per aggiungerne di nuovo una. +- **Le scansioni senza livello di testo** possono ridursi ulteriormente con **Rasterizza le pagine in immagini** in Impostazioni personalizzate, che sostituisce ogni pagina con un'unica immagine ottimizzata. Viene saltata per qualsiasi documento con testo selezionabile, comprese le scansioni con OCR, a meno che **Ignora la protezione dei contenuti** non sia attivo. In tal caso anche le pagine di testo diventano immagini, quindi il testo non è più selezionabile e i link smettono di funzionare. + +## Livelli di compressione + +| Livello | Qualità immagine | Risoluzione max | Ideale per | +| ----------------- | ---------------- | --------------- | ----------------------------------- | +| **Basso** | 80 | 200 DPI | Preservare la qualità visiva | +| **Medio** | 50 | 150 DPI | Documenti di uso quotidiano | +| **Alto** | 20 | 72 DPI | Allegati email, caricamenti sul web | +| **Senza perdita** | Immagini intatte | Invariata | Copie d'archivio | + +Alto rimuove anche l'incorporamento dei 14 font PDF standard, oltre a quelli simili come Arial quando è sicuro farlo. + +## Dimensione di destinazione + +Inserisci una dimensione in KB o MB e Hyper Compress cerca la migliore qualità d'immagine che rientri comunque nel limite, partendo dal livello che hai scelto. Se il documento non può diventare così piccolo, ottieni la versione più piccola possibile e un messaggio che lo segnala. Le pagine dedicate, come [Comprimi PDF a 1MB](https://www.bentopdf.com/compress-pdf-to-1mb), si aprono con la dimensione di destinazione già compilata. + +## Impostazioni personalizzate + +Espandi il pannello Impostazioni personalizzate per regolare direttamente Hyper Compress. Scegliere un livello di compressione ripristina questi valori a quelli del livello, e modificarne uno qualsiasi porta il livello su Personalizzato. + +- **Ignora la protezione dei contenuti**: per impostazione predefinita Hyper Compress lascia intatti i PDF firmati e non rasterizza le pagine che contengono testo. Attivandola, aggira entrambi i controlli. Resta attiva quando cambi livello. + +- **Immagini**: qualità dell'immagine, risoluzione massima, ricampionamento forzato, riduzione dei colori, ritaglio delle aree invisibili delle immagini, rimozione delle immagini alternative, semplificazione dei profili colore, JPEG 2000 e modalità lossless +- **Font**: creazione di sottoinsiemi, unione dei duplicati e rimozione dell'incorporamento dei font standard e di quelli simili +- **Contenuto**: appiattimento di annotazioni, campi modulo o link +- **Pulizia**: rimozione di miniature, dati delle applicazioni, article thread, informazioni di acquisizione web, albero della struttura o output intent +- **Rasterizza**: sostituzione delle pagine con immagini, per scansioni solo immagine; viene saltata quando il documento ha testo selezionabile +- **Output**: Mantieni PDF/A e compressione Brotli per i lettori PDF 2.0 che la supportano + +## Casi d'uso + +- Portare un report da 50 MB sotto il limite degli allegati email +- Far rientrare una scansione nel rigido limite di caricamento di un portale con una dimensione di destinazione +- Ottimizzare i PDF di marketing per download più rapidi dal sito web +- Archiviare grandi insiemi di documenti quando i costi di archiviazione contano +- Ridurre il consumo di dati mobili condividendo PDF tramite app di messaggistica + +## Suggerimenti + +- Inizia con Medio. Se il risultato è ancora troppo grande, imposta una dimensione di destinazione o passa ad Alto. +- Per una scansione senza livello di testo, attiva Rasterizza le pagine in immagini in Impostazioni personalizzate. +- Converti in scala di grigi, in Impostazioni personalizzate, può ridurre le dimensioni dei documenti ricchi di colore. + +## Strumenti correlati + +- [Linearizza PDF](./linearize-pdf): ottimizza il PDF compresso per una visualizzazione web veloce +- [Rasterizza PDF](./rasterize-pdf): converte le pagine in immagini a un DPI specifico, comprese le pagine con testo +- [Ripara PDF](./repair-pdf): ripara un PDF danneggiato da una compressione eseguita altrove +- [Rimuovi Metadati](./remove-metadata): elimina i dati nascosti per la privacy diff --git a/docs/it/tools/crop-pdf.md b/docs/it/tools/crop-pdf.md new file mode 100644 index 00000000..b067639a --- /dev/null +++ b/docs/it/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Ritaglia PDF +description: Ritaglia visivamente le pagine PDF disegnando un'area di ritaglio su ciascuna pagina con un editor basato su Cropper.js. +--- + +# Ritaglia PDF + +Rifila i margini delle pagine PDF con un'interfaccia di ritaglio visuale. Disegna un rettangolo di ritaglio direttamente su ogni pagina, controlla l'anteprima e applica il ritaglio. Puoi impostare aree di ritaglio diverse per pagine diverse oppure applicare lo stesso ritaglio all'intero documento. + +## Come funziona + +1. Carica il tuo file PDF. +2. Si apre l'editor di ritaglio, che mostra la prima pagina con una sovrapposizione di ritaglio trascinabile. +3. Regola il rettangolo di ritaglio trascinandone i bordi o gli angoli. +4. Usa i pulsanti di navigazione tra le pagine per spostarti e impostare le aree di ritaglio di ognuna. +5. Fai clic su **Ritaglia e scarica** per applicare il ritaglio e scaricare il risultato. + +## Funzionalità + +- Editor di ritaglio visuale basato su Cropper.js, con maniglie per una regolazione precisa +- Navigazione pagina per pagina per impostare aree di ritaglio individuali +- Memorizza le impostazioni di ritaglio per pagina, così puoi definire ritagli diversi per pagine diverse +- Anteprima in tempo reale dell'area di ritaglio selezionata +- Supporta PDF di qualsiasi dimensione o orientamento di pagina + +## Casi d'uso + +- Rimuovere i margini ampi dai documenti scansionati per concentrarsi sull'area del contenuto +- Eliminare i crocini di taglio o i segni di registro dai PDF di prestampa +- Ritagliare le slide di una lezione per eliminare l'area delle note del relatore +- Rimuovere intestazioni o piè di pagina da ogni pagina prima di condividere un estratto del documento +- Ridimensionare le pagine per adattarle a uno specifico display o layout di stampa + +## Suggerimenti + +- La sovrapposizione di ritaglio può essere ridimensionata e riposizionata liberamente. Trascina gli angoli per un ridimensionamento proporzionale o i bordi per una regolazione su un solo asse. +- Per i documenti in cui ogni pagina richiede lo stesso ritaglio, impostalo sulla prima pagina: lo strumento ricorda l'area di ritaglio mentre ti sposti tra le pagine. +- Se devi uniformare le dimensioni delle pagine anziché ritagliarle visivamente, lo strumento Correggi dimensione pagina potrebbe essere più adatto. + +## Strumenti correlati + +- [Editor PDF](./edit-pdf) +- [Numeri di Pagina](./page-numbers) +- [Rimuovi Pagine Vuote](./remove-blank-pages) diff --git a/docs/it/tools/csv-to-pdf.md b/docs/it/tools/csv-to-pdf.md new file mode 100644 index 00000000..28649e96 --- /dev/null +++ b/docs/it/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV in PDF +description: Converti i file di foglio di calcolo CSV in tabelle PDF formattate direttamente nel tuo browser. +--- + +# CSV in PDF + +Trasforma i file CSV in documenti PDF puliti e formattati. Ogni CSV viene analizzato e reso come tabella nel PDF di output. È utile quando devi stampare o condividere dati tabellari senza richiedere al destinatario un software per fogli di calcolo. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :--------- | +| CSV | `.csv` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina uno o più file CSV. +2. Controlla l'elenco dei file. Aggiungine altri o rimuovi quelli indesiderati. +3. Fai clic su **Converti in PDF**. Un indicatore di avanzamento mostra lo stato della conversione. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono raccolti in `csv-converted.zip`. + +## Opzioni + +Questo strumento non ha configurazioni aggiuntive. Il CSV viene analizzato e formattato automaticamente come tabella. + +## Output + +| Numero di input | Output | +| :-------------- | :---------------------------------------------------------- | +| 1 file | Download di un singolo PDF (ad es. `data.pdf`) | +| 2+ file | Archivio ZIP (`csv-converted.zip`) con un PDF per ogni file | + +## Casi d'uso + +- Convertire i report esportati da database in tabelle PDF stampabili +- Condividere dati finanziari o elenchi di inventario con chi non ha Excel +- Creare versioni PDF dei file di log CSV per la documentazione di conformità +- Stampare elenchi di indirizzi, registri dei voti o qualsiasi dato tabellare salvato come CSV + +## Suggerimenti + +- Per risultati ottimali, assicurati che il CSV usi i delimitatori standard a virgola. Lo strumento segue le convenzioni comuni di analisi dei CSV. +- Se il CSV ha molte colonne, la tabella potrebbe essere compressa per adattarsi alla larghezza della pagina. Valuta di dividere i set di dati molto larghi in più file. +- Per i file Excel (`.xls`, `.xlsx`), usa lo strumento [Excel in PDF](./excel-to-pdf), che preserva la formattazione del foglio di calcolo e i fogli multipli. + +## Strumenti correlati + +- [Excel in PDF](./excel-to-pdf) +- [Testo in PDF](./txt-to-pdf) +- [JSON in PDF](./json-to-pdf) diff --git a/docs/it/tools/delete-pages.md b/docs/it/tools/delete-pages.md new file mode 100644 index 00000000..f2a00e07 --- /dev/null +++ b/docs/it/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Elimina pagine +description: Rimuovi pagine specifiche da un PDF per numero di pagina, intervallo o selezione visuale tramite miniature. +--- + +# Elimina pagine + +Rimuovi le pagine indesiderate da un documento PDF. Indica le pagine da eliminare digitando numeri di pagina o intervalli, oppure fai clic direttamente sulle miniature per contrassegnarle per la rimozione. + +## Come funziona + +1. Carica un file PDF. Lo strumento genera le anteprime in miniatura di ogni pagina. +2. Inserisci nel campo di testo le pagine da eliminare usando la sintassi degli intervalli (ad es. `2, 5-8`), oppure fai clic sulle miniature per selezionarle o deselezionarle. +3. Le pagine contrassegnate vengono evidenziate visivamente, così puoi confermare la selezione. +4. Fai clic sul pulsante di elaborazione. Viene creato un nuovo PDF senza le pagine selezionate. + +## Funzionalità + +- Selezione delle pagine tramite testo con sintassi degli intervalli (`2, 5-8, 12`) +- Griglia di miniature per eliminare con un clic +- Evidenziazione in tempo reale delle pagine contrassegnate per l'eliminazione +- Validazione dell'input rispetto al numero effettivo di pagine +- Mantiene tutte le pagine non eliminate nel loro ordine originale + +## Casi d'uso + +- Rimuovere pagine vuote o di riempimento da un documento scansionato +- Eliminare copertine o appendici prima di condividere un documento +- Ripulire pagine di bozza rimaste per errore in un PDF finale +- Rimuovere le pagine con informazioni sensibili prima della distribuzione + +## Suggerimenti + +- Eliminare le pagine non influisce sul contenuto o sulla formattazione di quelle rimanenti. Il risultato è una copia fedele dell'originale meno le pagine rimosse. +- Se vuoi conservare solo determinate pagine anziché rimuoverne alcune, [Estrai Pagine](./extract-pages) è la scelta migliore. +- La vista a miniature si carica in modo progressivo, quindi i documenti grandi restano reattivi. + +## Strumenti correlati + +- [Estrai Pagine](./extract-pages) +- [Duplica e Organizza](./organize-pdf) +- [Dividi PDF](./split-pdf) diff --git a/docs/it/tools/deskew-pdf.md b/docs/it/tools/deskew-pdf.md new file mode 100644 index 00000000..22153a2e --- /dev/null +++ b/docs/it/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Raddrizza PDF +description: Raddrizza automaticamente le pagine inclinate dei PDF scansionati con il rilevamento dell'inclinazione di OpenCV. Soglia e DPI regolabili. +--- + +# Raddrizza PDF + +I documenti scansionati raramente sono perfettamente dritti. Anche una leggera inclinazione rende l'OCR meno accurato e la stampa poco curata. Questo strumento usa gli algoritmi di elaborazione delle immagini di OpenCV per rilevare l'angolo di inclinazione di ogni pagina e ruotarla fino a riportarla in piano. + +## Come funziona + +1. Carica uno o più PDF scansionati. +2. Imposta la **Soglia di inclinazione**: le pagine con un'inclinazione rilevata inferiore a questo valore restano invariate. +3. Scegli una **Qualità di elaborazione (DPI)**: un DPI più alto migliora la precisione del rilevamento ma richiede più tempo. +4. Fai clic su **Raddrizza PDF**. +5. Al termine dell'elaborazione, un pannello dei risultati mostra l'angolo rilevato per ogni pagina e se è stata corretta. + +## Opzioni + +| Impostazione | Valori | Predefinito | +| --------------------------------- | ------------------------ | ----------- | +| **Soglia di inclinazione** | 0.1, 0.5, 1.0, 2.0 gradi | 0.5 | +| **Qualità di elaborazione (DPI)** | 100, 150, 200, 300 | 150 | + +## Come funziona il rilevamento dell'inclinazione + +Lo strumento rende ogni pagina come immagine al DPI selezionato, poi usa OpenCV per rilevare gli angoli delle linee dominanti nel contenuto. Se l'inclinazione rilevata supera la soglia, la pagina viene ruotata dell'angolo inverso per raddrizzarla. Le pagine sotto la soglia passano invariate. + +## Casi d'uso + +- Ripulire contratti o documenti legali scansionati in blocco +- Preparare ricevute o fatture scansionate per l'elaborazione OCR +- Raddrizzare le pagine di uno scanner piano con posizionamento della carta irregolare +- Migliorare la qualità visiva di materiali d'archivio digitalizzati + +## Suggerimenti + +- Abbassa la soglia a 0.1 gradi se ti serve un allineamento perfetto al pixel per l'OCR. +- 150 DPI è veloce e preciso per la maggior parte dei documenti. Usa 300 DPI per testo molto piccolo o pagine con dettagli fini. +- Il raddrizzamento funziona meglio sui documenti con linee di testo orizzontali nitide. Può avere difficoltà con pagine composte soprattutto da immagini o con elementi di design diagonali. + +## Strumenti correlati + +- [Rasterizza PDF](./rasterize-pdf): converte il risultato raddrizzato in un PDF piatto basato su immagini +- [Comprimi PDF](./compress-pdf): riduce le dimensioni del file dopo il raddrizzamento +- [Ripara PDF](./repair-pdf): risolve problemi strutturali nei PDF scansionati diff --git a/docs/it/tools/digital-sign-pdf.md b/docs/it/tools/digital-sign-pdf.md new file mode 100644 index 00000000..11103bbb --- /dev/null +++ b/docs/it/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Firma Digitale +description: Aggiungi firme digitali crittografiche ai PDF usando certificati X.509. Supporta i formati PKCS#12 e PEM con opzioni di firma visibile. +--- + +# Firma Digitale + +Una firma digitale è una prova crittografica che una persona specifica ha firmato un documento e che il documento non è stato alterato da allora. A differenza di una firma disegnata (che è solo un'immagine), una firma digitale usa certificati X.509 e gli standard PKCS#7 per garantire autenticità e integrità verificabili. + +BentoPDF applica le firme digitali interamente nel tuo browser. La tua chiave privata non lascia mai il tuo dispositivo. + +## Come funziona + +1. Carica un file PDF. +2. Carica il file del tuo certificato (.pfx, .p12 o .pem). +3. Inserisci la password del certificato per sbloccarlo. Lo strumento mostra il soggetto, l'emittente e il periodo di validità del certificato. +4. Facoltativamente, configura i metadati della firma (motivo, luogo, contatti). +5. Facoltativamente, attiva una **firma visibile** con personalizzazione di posizione, dimensioni, immagine e testo. +6. Fai clic su **Firma PDF**. + +## Formati di certificato supportati + +| Formato | Estensioni | Descrizione | +| ----------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Pacchetto standard del settore che contiene la chiave privata e la catena di certificati. È il formato più comune. | +| **PEM** | .pem | Formato testuale. Deve contenere sia il certificato sia la chiave privata in un unico file. Supporta chiavi private crittografate. | + +## Opzioni della firma visibile + +Quando è attiva, sulla pagina PDF viene reso un blocco di firma visibile: + +- **Posizione**: coordinate X/Y e larghezza/altezza in punti +- **Pagina**: prima pagina, ultima pagina, tutte le pagine o un numero di pagina specifico +- **Immagine**: carica un'immagine PNG, JPG o WebP (la tua firma autografa, il sigillo aziendale, ecc.) +- **Testo**: testo personalizzato con colore e dimensione del carattere configurabili. Se non vengono forniti né immagine né testo, lo strumento genera automaticamente il testo dal nome comune del certificato e dalla data corrente. + +## Metadati della firma + +- **Motivo**: perché il documento è stato firmato (ad es. "Approvato", "Rivisto") +- **Luogo**: dove è avvenuta la firma (ad es. "New York, NY") +- **Contatti**: come raggiungere il firmatario (ad es. indirizzo email) + +## Nota sulla connessione a Internet + +La firma può richiedere una connessione a Internet. La libreria di firma recupera la catena di certificati dagli URL incorporati nell'estensione Authority Information Access (AIA) del tuo certificato. Se quei server non sono raggiungibili, la firma fallirà per i certificati che richiedono la validazione della catena. + +## Casi d'uso + +- Firmare contratti, proposte e accordi con firme digitali giuridicamente vincolanti +- Certificare documenti ufficiali in flussi di lavoro che richiedono l'autenticazione basata su PKI +- Firmare fatture PDF per la conformità normativa (molti paesi dell'UE richiedono e-fatture firmate digitalmente) +- Aggiungere l'approvazione organizzativa a disegni tecnici o documenti di qualità + +## Suggerimenti + +- I certificati autofirmati vanno bene per i test, ma mostreranno avvisi in Adobe Reader. Per i documenti di produzione usa un certificato di un'autorità di certificazione attendibile. +- La firma visibile è puramente grafica. La firma crittografica viene incorporata indipendentemente dal fatto che il blocco visibile sia attivo. +- Verifica il PDF firmato con lo strumento Convalida Firma per confermare che la firma sia integra. + +## Strumenti correlati + +- [Convalida Firma](./validate-signature-pdf): verifica le firme digitali nei PDF firmati +- [Appiattisci PDF](./flatten-pdf): appiattisci i moduli prima della firma per impedire modifiche +- [Proteggi PDF](./protect-pdf): aggiungi la protezione con password sopra la firma digitale +- [Rimuovi Metadati](./remove-metadata): elimina i metadati prima di firmare diff --git a/docs/it/tools/divide-pages.md b/docs/it/tools/divide-pages.md new file mode 100644 index 00000000..91ba0b07 --- /dev/null +++ b/docs/it/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Dividi pagine +description: Dividi le pagine PDF in orizzontale o in verticale in sotto-pagine più piccole. +--- + +# Dividi pagine + +Taglia le singole pagine PDF a metà dividendole in orizzontale o in verticale. È utile quando una singola pagina contiene contenuti che dovrebbero stare in pagine distinte, ad esempio un layout a due colonne scansionato come un'unica pagina larga. + +## Come funziona + +1. Carica un file PDF. +2. Seleziona la direzione di divisione: **Verticale** (metà sinistra/destra) oppure **Orizzontale** (metà superiore/inferiore). +3. Facoltativamente, specifica un intervallo di pagine per limitare quali pagine vengono divise. Lascia vuoto per dividere tutte le pagine. +4. Fai clic sul pulsante di elaborazione per generare il PDF diviso. + +## Funzionalità + +- Divisione verticale: divide ogni pagina in metà sinistra e destra +- Divisione orizzontale: divide ogni pagina in metà superiore e inferiore +- Filtro per intervallo di pagine per dividere solo pagine specifiche +- Le pagine non selezionate passano invariate +- Preserva la qualità del contenuto senza ripetere il rendering + +## Casi d'uso + +- Separare pagine scansionate affiancate (ad es. la scansione di un libro con pagina sinistra e destra su un unico foglio) +- Dividere un PDF orizzontale con contenuti affiancati in singole pagine verticali +- Dividere infografiche o poster alti in sezioni superiore e inferiore separate +- Preparare documenti in formato largo per la stampa su carta standard + +## Suggerimenti + +- Se le pagine hanno un contenuto distribuito in modo non uniforme, la divisione avviene comunque nel punto esatto di metà. Per divisioni asimmetriche, usa piuttosto [Ritaglia PDF](./crop-pdf). +- Combina questo strumento con [Ruota PDF](./rotate-pdf) se le pagine devono essere ruotate prima o dopo la divisione. + +## Strumenti correlati + +- [Dividi PDF](./split-pdf) +- [Ritaglia PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Posterizza PDF](./posterize-pdf) diff --git a/docs/it/tools/duplex-collate.md b/docs/it/tools/duplex-collate.md new file mode 100644 index 00000000..ba1df82d --- /dev/null +++ b/docs/it/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Fascicola scansione fronte/retro +description: Riordina i PDF scansionati in fronte/retro che contengono le pagine anteriori e posteriori in blocchi separati, mettendole nell'ordine corretto. +--- + +# Fascicola scansione fronte/retro + +Fascicola Fronte/Retro è pensato per i flussi di scansione con alimentatore automatico (ADF) in cui un PDF contiene due blocchi di pagine: + +- prima tutti i fronti +- poi tutti i retro + +Invece di dividere e riassemblare a mano, questo strumento intercala i due blocchi nel naturale ordine di lettura: fronte1, retro1, fronte2, retro2 e così via. + +## Come funziona + +1. Carica un singolo PDF creato dalla scansione di una pila fronte/retro. +2. Imposta il punto di divisione in cui termina il blocco dei fronti. +3. Scegli come gestire il blocco dei retro: + - **Inverti il blocco dei retri** (comune quando la pila viene capovolta prima di scansionare i retro) + - **Mantieni il blocco dei retri così com'è** +4. Fai clic su **Fascicola PDF** per scaricare il risultato riordinato. + +## Opzioni + +- **Rileva divisione automaticamente (metà)**: imposta il punto di divisione a `ceil(totalPages / 2)`. +- **Avviso pagine dispari**: avvisa quando il totale delle pagine è dispari (spesso indica una scansione non corrispondente). +- **Conferma blocchi non uniformi**: chiede conferma quando le dimensioni dei blocchi fronte/retro differiscono. +- **Esportazione raggruppata**: divide l'output fascicolato in PDF separati in base al numero di pagine del documento originale e li scarica come ZIP. + +## Comportamento dell'output + +- **Predefinito**: un solo PDF in uscita (un PDF in ingresso, un PDF in uscita). +- **Modalità raggruppata**: l'output viene suddiviso in base al valore di pagine per documento; se vengono prodotti più blocchi, vengono scaricati come un unico ZIP, altrimenti viene scaricato un singolo PDF. + +Se le dimensioni dei blocchi sono diverse, le pagine in coppia vengono fascicolate per prime e le pagine rimaste senza coppia vengono aggiunte in fondo. + +## Casi d'uso comuni + +- Ripristinare l'ordine dopo aver scansionato una pila di moduli fronte/retro in due passate. +- Ricostruire i fascicoli fronte/retro da scanner d'ufficio che restituiscono prima tutti i fronti e poi tutti i retro. +- Post-elaborare le scansioni d'archivio prima di dividerle in file per documento. + +## Suggerimenti + +- La maggior parte dei lotti fronte/retro dovrebbe avere un numero totale di pagine pari. +- Se i retro risultano invertiti, passa da **Inverti il blocco dei retri** a **Mantieni il blocco dei retri così com'è** o viceversa. +- Per originali di 2 pagine (fronte+retro), usa l'esportazione raggruppata con `2` pagine per documento. + +## Strumenti correlati + +- [Alterna e Riordina Pagine](./alternate-merge) +- [Dividi PDF](./split-pdf) +- [Unisci PDF](./merge-pdf) +- [Duplica e Organizza](./organize-pdf) diff --git a/docs/it/tools/edit-attachments.md b/docs/it/tools/edit-attachments.md new file mode 100644 index 00000000..d4248e37 --- /dev/null +++ b/docs/it/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Modifica allegati +description: Visualizza e rimuovi in modo selettivo i file allegati incorporati in un documento PDF. +--- + +# Modifica allegati + +Ispeziona e gestisci i file allegati all'interno di un PDF. Lo strumento elenca ogni file incorporato con il suo nome e il livello di allegato, poi ti permette di contrassegnare singoli allegati per la rimozione o di eliminarli tutti in una volta. + +## Come funziona + +1. Carica un file PDF. +2. Lo strumento cerca automaticamente gli allegati e li mostra in un elenco. +3. Ogni allegato mostra il nome del file e se è un allegato a livello di documento o di pagina. +4. Fai clic sull'icona del cestino accanto a un allegato per contrassegnarlo per la rimozione (fai di nuovo clic per annullare). +5. Usa il pulsante **Rimuovi tutti gli allegati** per selezionare tutto in una volta, oppure **Deseleziona tutto** per azzerare le selezioni. +6. Fai clic sul pulsante di elaborazione per salvare un nuovo PDF senza gli allegati selezionati. + +## Funzionalità + +- Elenca tutti gli allegati a livello di documento e di pagina +- Rimozione singola o in blocco degli allegati +- Selezione attivabile e disattivabile prima di confermare le modifiche +- Testo barrato e opacità ridotta sugli elementi contrassegnati per la rimozione +- Scarica il PDF modificato senza gli allegati selezionati + +## Casi d'uso + +- Rimuovere file obsoleti o errati incorporati in un documento prima di ridistribuirlo +- Eliminare allegati sensibili (dati finanziari, informazioni personali) da un PDF prima di condividerlo +- Ridurre le dimensioni del PDF rimuovendo grandi file incorporati non più necessari +- Verificare i contenuti incorporati e ripulire un documento prima di archiviarlo + +## Suggerimenti + +- Gli allegati contrassegnati per la rimozione vengono mostrati barrati. Puoi riattivarli prima dell'elaborazione se cambi idea. +- Se non vengono trovati allegati, lo strumento mostra un chiaro messaggio "Nessun allegato trovato": il PDF semplicemente non contiene file incorporati. + +## Strumenti correlati + +- [Aggiungi Allegati](./add-attachments) +- [Estrai Allegati](./extract-attachments) +- [Visualizza Metadati](./view-metadata) diff --git a/docs/it/tools/edit-metadata.md b/docs/it/tools/edit-metadata.md new file mode 100644 index 00000000..a36eec0e --- /dev/null +++ b/docs/it/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Modifica metadati +description: Visualizza e modifica i campi dei metadati del PDF, tra cui titolo, autore, parole chiave, date e proprietà personalizzate. +--- + +# Modifica metadati + +Modifica i metadati incorporati in un file PDF. Lo strumento precompila un modulo con i metadati esistenti del documento, ti permette di modificare qualsiasi campo e salva le modifiche in un nuovo PDF. + +## Come funziona + +1. Carica un file PDF. Lo strumento legge i metadati attuali e compila il modulo. +2. Modifica uno qualsiasi dei campi standard: Titolo, Autore, Oggetto, Parole chiave, Creatore, Produttore. +3. Regola Data di creazione e Data di modifica con i selettori di data e ora. +4. Aggiungi campi di metadati personalizzati facendo clic sul pulsante di aggiunta e inserendo una coppia chiave-valore. +5. Fai clic sul pulsante di elaborazione per salvare il PDF modificato. + +## Funzionalità + +- Precompila tutti i metadati esistenti del PDF caricato +- Campi standard: Titolo, Autore, Oggetto, Parole chiave, Creatore, Produttore +- Selettori di data e ora per Data di creazione e Data di modifica +- Campi di metadati personalizzati chiave-valore per proprietà arbitrarie +- Salva le modifiche direttamente nel dizionario delle informazioni del documento PDF + +## Campi modificabili + +| Campo | Descrizione | +| ------------------------ | ---------------------------------------------------------------- | +| **Titolo** | Il titolo del documento mostrato nei lettori PDF | +| **Autore** | La persona o l'organizzazione che ha creato il documento | +| **Oggetto** | Una breve descrizione dell'argomento del documento | +| **Parole chiave** | Termini separati da virgole per la ricerca e la categorizzazione | +| **Creatore** | L'applicazione che ha creato originariamente il contenuto | +| **Produttore** | L'applicazione che ha generato il PDF | +| **Data di creazione** | Quando il documento è stato creato originariamente | +| **Data di modifica** | Quando il documento è stato modificato l'ultima volta | +| **Campi personalizzati** | Qualsiasi coppia chiave-valore aggiuntiva che definisci | + +## Casi d'uso + +- Impostare un titolo e un autore corretti prima di pubblicare un documento +- Aggiungere parole chiave per migliorare la reperibilità nei sistemi di gestione documentale +- Aggiornare la data di modifica per riflettere la revisione corrente +- Aggiungere campi di metadati personalizzati come Reparto, ID progetto o Classificazione +- Ripulire i metadati lasciati dal software di creazione originale + +## Suggerimenti + +- I campi personalizzati vengono scritti direttamente nel dizionario delle informazioni del PDF. Alcuni lettori PDF potrebbero non mostrarli, ma vengono conservati nel file. +- Lascia un campo vuoto per cancellarlo dai metadati. Il pulsante di elaborazione salva ciò che si trova nel modulo. +- Per visualizzare i metadati senza modificarli, usa [Visualizza Metadati](./view-metadata). Per rimuovere del tutto i metadati, usa Rimuovi Metadati. + +## Strumenti correlati + +- [Visualizza Metadati](./view-metadata) +- [Livelli OCG del PDF](./pdf-layers) +- [Comprimi PDF](./compress-pdf) diff --git a/docs/it/tools/edit-pdf.md b/docs/it/tools/edit-pdf.md new file mode 100644 index 00000000..982ee572 --- /dev/null +++ b/docs/it/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Editor PDF +description: Annota, evidenzia, oscura, aggiungi forme e immagini, cerca e visualizza i PDF direttamente nel tuo browser. +--- + +# Editor PDF + +L'Editor PDF di BentoPDF ti permette di annotare, evidenziare, oscurare, commentare, aggiungere forme e immagini e cercare nei tuoi PDF. Carica un editor completo direttamente nel browser, senza alcun caricamento su server. + +## Come funziona + +1. Carica il tuo PDF facendo clic sull'area di rilascio o trascinandoci sopra un file. +2. L'editor PDF integrato si apre automaticamente con il documento caricato. +3. Usa la barra degli strumenti per annotare, evidenziare, oscurare, aggiungere testo, disegnare forme o inserire immagini. +4. Fai clic su **Scarica il PDF modificato** per salvare le modifiche. + +## Funzionalità + +- Barra degli strumenti di annotazione completa con evidenziazione, sottolineatura, testo barrato e disegno a mano libera +- Inserimento di testo e commenti +- Strumenti di oscuramento che rimuovono definitivamente il contenuto contrassegnato una volta applicato l'oscuramento. Se alcuni contrassegni non sono stati applicati quando fai clic su **Scarica il PDF modificato**, l'editor ti propone di applicarli prima. +- Strumenti per forme: rettangoli, cerchi, linee e frecce +- Inserimento di immagini nelle pagine PDF +- Ricerca del testo integrata in tutto il documento +- Supporto multi-documento con schede (fino a 10 documenti aperti contemporaneamente) +- Caricamento dei file tramite trascinamento + +## Casi d'uso + +- Rivedere contratti e segnare le modifiche con evidenziazioni e commenti +- Oscurare informazioni riservate come codici fiscali o dati finanziari prima della condivisione +- Aggiungere annotazioni a piante architettoniche o disegni tecnici +- Inserire loghi aziendali o timbri nelle pagine del documento +- Cercare termini specifici in lunghi documenti legali + +## Suggerimenti + +- Puoi aprire più PDF contemporaneamente e passare dall'uno all'altro con la barra delle schede in alto nell'editor. +- L'editor preserva la struttura originale del PDF, quindi font, layout e campi modulo restano intatti. +- Contrassegnare un testo o un'area per l'oscuramento non rimuove nulla finché l'oscuramento non viene applicato. Quando oscuri un testo selezionato, vengono rimosse dal download anche le sue copie nelle proprietà del file, nei segnalibri, nei commenti e negli allegati, a meno che il file non sia crittografato. +- Per filigrane o numerazione di pagina in blocco, usa gli strumenti dedicati, che offrono più controllo sulla formattazione. + +## Strumenti correlati + +- [Aggiungi Filigrana](./add-watermark) +- [Firma PDF](./sign-pdf) +- [Aggiungi Timbri](./add-stamps) +- [Rimuovi Annotazioni](./remove-annotations) diff --git a/docs/it/tools/email-to-pdf.md b/docs/it/tools/email-to-pdf.md new file mode 100644 index 00000000..93f4404e --- /dev/null +++ b/docs/it/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email in PDF +description: Converti i file email EML e MSG in PDF nel tuo browser. Preserva intestazioni, corpo ed elenco degli allegati. +--- + +# Email in PDF + +Converti le email salvate in PDF puliti e stampabili. Lo strumento analizza i file EML e MSG, estrae il messaggio completo (intestazioni, corpo e metadati degli allegati) e rende tutto in un PDF strutturato. Utile per la raccolta di prove legali, l'archiviazione o semplicemente per stampare un'email importante. + +## Formati supportati + +| Formato | Estensione | Note | +| :------ | :--------- | :------------------------------------------------------------------------------ | +| EML | `.eml` | Formato email MIME standard (esportato dalla maggior parte dei client di posta) | +| MSG | `.msg` | Formato proprietario di Microsoft Outlook | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file EML o MSG. Puoi mescolare entrambi i formati in un unico lotto. +2. Controlla l'elenco dei file. Rimuovi le voci indesiderate con l'icona del cestino, oppure fai clic su **Aggiungi altri file** per includere altre email. +3. Configura le opzioni di conversione (vedi sotto). +4. Fai clic su **Converti in PDF**. Lo strumento analizza ogni email, rende il contenuto come HTML formattato e lo converte in PDF tramite il motore PyMuPDF. +5. Una singola email viene scaricata direttamente come PDF. Più email vengono raccolte in `emails-converted.zip`. + +## Opzioni + +| Opzione | Predefinito | Descrizione | +| :--------------------------------------------------- | :---------- | :------------------------------------------------------------------------------------------------------- | +| **Formato pagina** | A4 | Scegli tra le dimensioni di pagina A4, Letter o Legal. | +| **Includi i destinatari CC e CCN nell'intestazione** | Attivo | Se attiva, gli elenchi dei destinatari CC e CCN compaiono nella sezione intestazione dell'email nel PDF. | +| **Includi l'elenco degli allegati dell'email** | Attivo | Se attiva, nel PDF compare l'elenco degli allegati dell'email (con nomi dei file e dimensioni). | + +## Casi d'uso + +- Archiviare in PDF la corrispondenza aziendale importante per conformità o audit +- Stampare conversazioni email per procedimenti legali o richieste di produzione di documenti +- Creare una registrazione permanente di conferme d'ordine, ricevute o contratti ricevuti via email +- Fare il backup dei file MSG di Outlook in un formato che non richiede Outlook per essere letto +- Documentare le interazioni con l'assistenza clienti a partire da file EML esportati + +## Suggerimenti + +- Sono supportati sia i file EML (usati da Thunderbird, Apple Mail e dalla maggior parte dei client di posta) sia i file MSG di Outlook. Esporta le email dal tuo client e trascinale direttamente nello strumento. +- Le email in formato HTML mantengono lo stile nel PDF. Le email in testo semplice vengono rese con una formattazione pulita e leggibile. +- L'elenco degli allegati mostra nomi e dimensioni dei file ma non incorpora i file allegati veri e propri nel PDF. + +## Strumenti correlati + +- [XML in PDF](./xml-to-pdf) +- [XPS in PDF](./xps-to-pdf) diff --git a/docs/it/tools/epub-to-pdf.md b/docs/it/tools/epub-to-pdf.md new file mode 100644 index 00000000..fa4ae6ec --- /dev/null +++ b/docs/it/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB in PDF +description: Converti gli ebook EPUB in PDF nel tuo browser. Gratuito, senza caricamenti, conversione orientata alla privacy. +--- + +# EPUB in PDF + +Converti gli ebook EPUB in file PDF senza uscire dal browser. EPUB è lo standard aperto per i libri digitali, ma a volte serve un PDF a layout fisso per stampare, annotare o condividere con chi non ha un lettore di ebook. + +## Formati supportati + +| Formato | Estensione | Note | +| :------ | :--------- | :-------------------- | +| EPUB | `.epub` | File EPUB 2 ed EPUB 3 | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file EPUB. È supportata la selezione multipla. +2. Controlla i file caricati. Rimuovi le voci indesiderate con l'icona del cestino, oppure fai clic su **Aggiungi altri file** per ampliare il lotto. +3. Fai clic su **Converti in PDF**. Il motore PyMuPDF rende il contenuto dell'EPUB (testo, immagini e formattazione) in un PDF impaginato. +4. Un singolo EPUB viene scaricato direttamente come PDF. Più file vengono raccolti in un archivio ZIP chiamato `epub-converted.zip`. + +## Opzioni + +La conversione usa impostazioni predefinite sensate e non richiede alcuna configurazione. Il testo si adatta alle dimensioni di pagina standard, mentre font e immagini incorporati vengono mantenuti nel PDF. + +## Casi d'uso + +- Stampare un ebook privo di DRM per leggerlo lontano dagli schermi +- Inviare un manoscritto EPUB come PDF a layout fisso per la revisione +- Archiviare libri digitali in un formato che ogni sistema operativo può aprire in modo nativo +- Condividere un capitolo con un collega che non ha un lettore EPUB +- Convertire la documentazione tecnica distribuita in EPUB in PDF annotabili + +## Suggerimenti + +- Le funzionalità di EPUB 3 come audio e video incorporati non vengono trasferite nel PDF, ma tutto il testo, le immagini e le tabelle si convertono correttamente. +- Per ottenere i migliori risultati con EPUB molto stilizzati, controlla le prime pagine dell'output per verificare la fedeltà del layout. + +## Strumenti correlati + +- [MOBI in PDF](./mobi-to-pdf) +- [FB2 in PDF](./fb2-to-pdf) +- [CBZ in PDF](./cbz-to-pdf) diff --git a/docs/it/tools/excel-to-pdf.md b/docs/it/tools/excel-to-pdf.md new file mode 100644 index 00000000..b8adb99e --- /dev/null +++ b/docs/it/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel in PDF +description: Converti fogli di calcolo Excel (XLS, XLSX), ODS e file CSV in PDF preservando la formattazione. +--- + +# Excel in PDF + +Converti i file di fogli di calcolo in PDF. Lo strumento gestisce i file Excel moderni, il vecchio formato XLS, i fogli di calcolo OpenDocument e persino i CSV, il tutto reso tramite un motore LibreOffice nel browser che preserva la formattazione delle celle, le formule (come valori calcolati), i grafici e i layout a più fogli. + +## Formati supportati + +| Formato | Estensioni | +| :----------------------- | :--------- | +| Excel (moderno) | `.xlsx` | +| Excel (legacy) | `.xls` | +| OpenDocument Spreadsheet | `.ods` | +| CSV | `.csv` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file di fogli di calcolo. +2. Controlla l'elenco dei file. Aggiungine altri o rimuovi quelli indesiderati. +3. Fai clic su **Converti in PDF**. Il motore LibreOffice si inizializza al primo utilizzo, poi elabora ogni file. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono consegnati come `excel-converted.zip`. + +## Opzioni + +Questo strumento non ha configurazioni aggiuntive. Il motore LibreOffice determina layout di pagina, scala e area di stampa in base alle impostazioni integrate del foglio di calcolo. + +## Output + +| Numero di input | Output | +| :-------------- | :--------------------------------------------------------------------- | +| 1 file | Download di un singolo PDF (nome file originale con estensione `.pdf`) | +| 2+ file | Archivio ZIP (`excel-converted.zip`) con un PDF per ogni file | + +## Casi d'uso + +- Convertire report finanziari o budget da Excel a PDF per la distribuzione +- Creare PDF pronti per la stampa da fogli di calcolo di inventario o cataloghi prodotti +- Condividere i risultati di analisi dei dati con persone che non hanno Excel installato +- Archiviare i report trimestrali in un formato non modificabile +- Convertire in PDF i file ODS di LibreOffice Calc + +## Suggerimenti + +- I grafici incorporati nel foglio di calcolo vengono resi nel PDF. Assicurati che siano corretti nel file di origine prima di convertire. +- Se il foglio di calcolo ha più fogli, tutti i fogli sono inclusi nel PDF di output. +- Per semplici dati CSV senza formattazione, lo strumento [CSV in PDF](./csv-to-pdf) offre una conversione più leggera. Usa Excel in PDF quando ti serve preservare formattazione, grafici o più fogli. + +## Strumenti correlati + +- [CSV in PDF](./csv-to-pdf) +- [Word in PDF](./word-to-pdf) +- [PowerPoint in PDF](./powerpoint-to-pdf) diff --git a/docs/it/tools/extract-attachments.md b/docs/it/tools/extract-attachments.md new file mode 100644 index 00000000..b0f89146 --- /dev/null +++ b/docs/it/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Estrai allegati +description: Estrai tutti gli allegati incorporati da uno o più PDF e scaricali come archivio ZIP. +--- + +# Estrai allegati + +Estrai ogni allegato incorporato da uno o più file PDF. Tutti i file estratti vengono raccolti in un unico archivio ZIP da scaricare. + +## Come funziona + +1. Carica uno o più file PDF che contengono allegati incorporati. +2. Fai clic su **Estrai allegati**. +3. Lo strumento analizza ogni PDF alla ricerca di allegati a livello di documento e di pagina. +4. Tutti i file trovati vengono inseriti in un archivio ZIP e scaricati automaticamente. +5. Un messaggio di stato conferma quanti allegati sono stati trovati e la loro dimensione totale. + +## Funzionalità + +- Estrazione in blocco da più PDF contemporaneamente +- Estrae sia gli allegati a livello di documento sia quelli a livello di pagina +- Produce un unico file ZIP con tutti i file estratti +- Mostra il numero totale di allegati e la dimensione complessiva dei file +- Messaggi di stato chiari se non viene trovato alcun allegato + +## Casi d'uso + +- Recuperare file di dati incorporati in un PDF di report +- Estrarre risorse di immagini da un portfolio o da un documento di specifiche +- Estrarre materiali supplementari da PDF di formazione o conformità +- Verificare quali file sono incorporati in un lotto di PDF + +## Suggerimenti + +- Se lo strumento segnala che non ci sono allegati, il PDF potrebbe contenere immagini incorporate o dati di moduli, che non sono allegati di file. Usa [Estrai Immagini](./extract-images) per le immagini incorporate. +- Quando elabori più PDF, tutti gli allegati di ogni file finiscono in un unico ZIP. I nomi dei file originali vengono mantenuti. + +## Strumenti correlati + +- [Aggiungi Allegati](./add-attachments) +- [Modifica Allegati](./edit-attachments) +- [Estrai Immagini](./extract-images) diff --git a/docs/it/tools/extract-images.md b/docs/it/tools/extract-images.md new file mode 100644 index 00000000..8d37ef82 --- /dev/null +++ b/docs/it/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Estrai immagini +description: Estrai tutte le immagini incorporate dai file PDF. Visualizzale in anteprima in una griglia e scaricale singolarmente o come archivio ZIP. +--- + +# Estrai immagini + +Estrae ogni immagine incorporata da uno o più file PDF. Le immagini estratte vengono mostrate in una griglia di anteprima dove puoi scaricarle singolarmente oppure prenderle tutte insieme in un ZIP. Basato su PyMuPDF. + +## Come funziona + +1. Carica uno o più PDF facendo clic sull'area di rilascio o trascinandoci sopra i file. Aggiungi altri file o rimuovi quelli singoli secondo necessità. +2. Fai clic su **Estrai immagini** per avviare l'elaborazione. +3. Lo strumento analizza ogni pagina di ogni PDF caricato, trovando ed estraendo le immagini incorporate. +4. Le immagini estratte appaiono in una griglia con le miniature. Ogni immagine ha un pulsante di download. +5. Fai clic su **Scarica tutto** per salvare tutto come archivio ZIP. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Tutte le immagini incorporate vengono estratte nel loro formato originale (in genere PNG, JPEG o qualunque formato fosse usato quando l'immagine è stata incorporata nel PDF). + +## Formato di output + +- Le immagini nella griglia di anteprima hanno nomi come `image_1.png`, `image_2.jpg`, ecc. +- **Scarica tutto** produce `extracted-images.zip` con tutte le immagini. +- Le singole immagini possono essere scaricate una alla volta dalla griglia. + +## Casi d'uso + +- Recuperare foto o grafiche da un PDF per riutilizzarle in un altro progetto. +- Estrarre le immagini dei prodotti da un catalogo PDF per un annuncio di e-commerce. +- Prendere diagrammi dalla documentazione tecnica da usare nelle presentazioni. +- Verificare quali immagini sono incorporate in un documento prima di condividerlo. + +## Suggerimenti + +- Lo strumento estrae le immagini esattamente come sono memorizzate nel PDF. Non esegue il rendering delle pagine come immagini: per quello usa [PDF in PNG](./pdf-to-png) o [PDF in JPG](./pdf-to-jpg). +- Se lo strumento segnala "Nessuna immagine trovata", il PDF potrebbe usare grafica vettoriale anziché immagini raster incorporate, oppure potrebbe essere un documento scansionato in cui l'intera pagina è una grande immagine. +- L'elaborazione in blocco funziona su più PDF. Tutte le immagini di tutti i file vengono riunite in un'unica griglia e in un unico ZIP. + +## Strumenti correlati + +- [PDF in PNG](./pdf-to-png) +- [PDF in JPG](./pdf-to-jpg) +- [Workflow Builder PDF](./pdf-workflow) diff --git a/docs/it/tools/extract-pages.md b/docs/it/tools/extract-pages.md new file mode 100644 index 00000000..e530579a --- /dev/null +++ b/docs/it/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Estrai pagine +description: Salva un intervallo specifico di pagine di un PDF come nuovo documento. +--- + +# Estrai pagine + +Estrai un insieme di pagine da un PDF e salvale come nuovo file. Indica esattamente quali pagine vuoi usando la sintassi degli intervalli e lo strumento crea un PDF pulito contenente solo quelle pagine. + +## Come funziona + +1. Carica un file PDF. Lo strumento mostra il nome del file, la dimensione e il numero totale di pagine. +2. Inserisci le pagine da estrarre usando la sintassi degli intervalli (ad es. `1-5`, `3, 7, 10-12`). +3. Facoltativamente, scegli di scaricare ogni intervallo come PDF separato in un archivio ZIP. +4. Fai clic sul pulsante di elaborazione. Le pagine estratte vengono scaricate come nuovo PDF (o ZIP). + +## Funzionalità + +- Sintassi flessibile degli intervalli: pagine singole, intervalli o combinazioni separate da virgole +- Mostra il numero totale di pagine dopo il caricamento per un facile riferimento +- Opzione per ottenere un unico PDF combinato o file separati in un ZIP +- Preserva il contenuto e la formattazione originali delle pagine + +## Casi d'uso + +- Estrarre il riepilogo esecutivo (le prime pagine) da un report lungo +- Estrarre un singolo capitolo da un PDF di un libro di testo +- Salvare pagine specifiche di un pacchetto di moduli come documenti autonomi +- Creare un documento di esempio da pagine selezionate di un file più grande + +## Suggerimenti + +- I numeri di pagina partono da 1. Usa `1` per la prima pagina, non `0`. +- Per rimuovere pagine anziché estrarle, usa [Elimina Pagine](./delete-pages): è l'operazione inversa. +- Se ti serve la selezione visuale delle pagine con le miniature, usa [Dividi PDF](./split-pdf) nella modalità Visual Select. + +## Strumenti correlati + +- [Dividi PDF](./split-pdf) +- [Elimina Pagine](./delete-pages) +- [Unisci PDF](./merge-pdf) diff --git a/docs/it/tools/extract-tables.md b/docs/it/tools/extract-tables.md new file mode 100644 index 00000000..42e99d2c --- /dev/null +++ b/docs/it/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Estrai Tabelle +description: Rileva ed estrai le tabelle dai documenti PDF. Esporta in CSV, JSON o Markdown con granularità per singola tabella. +--- + +# Estrai Tabelle + +Rileva tutte le tabelle in un PDF e ti permette di esportarle nel formato che preferisci: CSV, JSON o Markdown. Ogni tabella viene estratta singolarmente con metadati di pagina e posizione. Basato sul motore di rilevamento delle tabelle di PyMuPDF. + +## Come funziona + +1. Carica un PDF facendo clic sull'area di rilascio o trascinandoci sopra un file. +2. Seleziona il **formato di esportazione** preferito: CSV, JSON o Markdown. +3. Fai clic su **Estrai tabelle** per avviare l'elaborazione. +4. Se viene trovata una sola tabella, viene scaricata come singolo file. Più tabelle producono un archivio ZIP con un file per tabella. + +## Opzioni + +- **Formato di esportazione**: scegli tra: + - **CSV**: valori separati da virgole con le corrette virgolette per i campi che contengono virgole, virgolette o a capo. Adatto a fogli di calcolo e database. + - **JSON**: struttura ad array di array, formattata con indentazione di 2 spazi. Adatto all'uso programmatico. + - **Markdown**: formato di tabella delimitato da barre verticali, generato da PyMuPDF. Adatto a documentazione e file README. + +## Formato di output + +- **Tabella singola**: `filename_table.csv` (oppure `.json` / `.md`) +- **Più tabelle**: `filename_tables.zip` con file chiamati `table_1_page3.csv`, `table_2_page5.csv`, ecc. + +## Casi d'uso + +- Estrarre tabelle specifiche da report PDF lunghi senza prelevare i dati dell'intero documento. +- Ottenere le tabelle in formato Markdown da incollare direttamente in issue di GitHub, wiki o documentazione. +- Ricavare dati JSON strutturati dalle tabelle PDF per integrazioni API o script. +- Confrontare le tabelle di versioni PDF diverse esportando entrambe in CSV e confrontandole con un diff. + +## Suggerimenti + +- Questo strumento offre il controllo per singola tabella. Se vuoi tutte le tabelle in un unico CSV, usa [PDF in CSV](./pdf-to-csv). Per una cartella di lavoro Excel completa, usa [PDF in Excel](./pdf-to-excel). +- Le tabelle che si estendono su più pagine potrebbero essere rilevate come tabelle separate per ogni pagina. Potrebbe essere necessario concatenarle manualmente. +- Se non vengono rilevate tabelle, il PDF potrebbe essere un'immagine scansionata. Esegui prima l'OCR per aggiungere un livello di testo. + +## Strumenti correlati + +- [PDF in CSV](./pdf-to-csv) +- [PDF in Excel](./pdf-to-excel) +- [PDF in Testo](./pdf-to-text) diff --git a/docs/it/tools/fb2-to-pdf.md b/docs/it/tools/fb2-to-pdf.md new file mode 100644 index 00000000..7ac4d539 --- /dev/null +++ b/docs/it/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 in PDF +description: Converti gli ebook FictionBook (FB2) in PDF direttamente nel browser. Gratis, privato, senza caricamento su server. +--- + +# FB2 in PDF + +Converti i file FictionBook 2 (FB2) in documenti PDF. FB2 è un formato di ebook basato su XML, popolare in Russia e nell'Europa orientale. Mentre su alcune piattaforme è ben supportato, su altre è praticamente sconosciuto: convertirlo in PDF rende i tuoi libri leggibili ovunque. + +## Formati supportati + +| Formato | Estensione | Note | +| :------------ | :--------- | :-------------------------- | +| FictionBook 2 | `.fb2` | Formato ebook basato su XML | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file FB2. La selezione multipla è supportata. +2. Controlla l'elenco dei file. Usa l'icona del cestino per rimuovere singole voci, oppure **Aggiungi altri file** per includerne altri. +3. Clicca su **Converti in PDF**. Il motore PyMuPDF analizza la struttura XML dell'FB2 e la rende come contenuto PDF paginato. +4. Un singolo file viene scaricato direttamente come PDF. Più conversioni vengono raggruppate in `fb2-converted.zip`. + +## Opzioni + +Non serve alcuna configurazione. Il convertitore gestisce automaticamente la struttura XML dell'FB2, conservando interruzioni di capitolo, formattazione e immagini incorporate. + +## Casi d'uso + +- Leggere ebook FB2 su dispositivi o app che supportano solo il PDF +- Stampare letteratura in lingua russa distribuita in formato FB2 +- Archiviare una libreria FB2 in un formato supportato universalmente +- Condividere un libro con chi ha un lettore che non supporta FictionBook + +## Suggerimenti + +- I file FB2 sono semplice XML, quindi tendono a essere piccoli e a convertirsi in fretta anche nel browser. +- Se i tuoi file FB2 sono compressi come `.fb2.zip`, estraili prima di caricarli. + +## Strumenti correlati + +- [EPUB in PDF](./epub-to-pdf) +- [MOBI in PDF](./mobi-to-pdf) +- [XML in PDF](./xml-to-pdf) diff --git a/docs/it/tools/fix-page-size.md b/docs/it/tools/fix-page-size.md new file mode 100644 index 00000000..31a7fcb9 --- /dev/null +++ b/docs/it/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Correggi dimensione pagina +description: Uniforma tutte le pagine di un PDF alla stessa dimensione. Scegli tra i formati carta standard o imposta dimensioni personalizzate. +--- + +# Correggi dimensione pagina + +I PDF assemblati da più fonti hanno spesso pagine di dimensioni diverse: alcune Letter, altre A4, altre del tutto non standard. Questo strumento porta ogni pagina a un'unica dimensione di destinazione, scalando il contenuto per adattarlo o riempire la pagina. + +## Come funziona + +1. Carica un file PDF. +2. Seleziona una **Dimensione pagina di destinazione** dal menu a tendina (A4, Letter, Legal, A3, A5, Tabloid o Personalizzata). +3. Scegli un **Orientamento**: Automatico mantiene l'orientamento originale di ogni pagina, oppure puoi forzare Verticale o Orizzontale. +4. Scegli una modalità di **Scala del contenuto**: Adatta (conserva tutto il contenuto, può aggiungere margini) o Riempi (riempie la pagina, può tagliare i bordi). +5. Facoltativamente, imposta un **Colore di sfondo** per gli eventuali margini aggiunti. +6. Clicca su **Correggi Dimensione Pagina**. + +## Opzioni + +- **Dimensioni standard**: A4, Letter, Legal, A3, A5, Tabloid +- **Dimensioni personalizzate**: inserisci larghezza e altezza in pollici o millimetri +- **Orientamento**: Automatico, Verticale, Orizzontale +- **Modalità di scala**: Adatta o Riempi (Ritaglia) +- **Colore di sfondo**: qualsiasi colore per i margini aggiunti + +## Casi d'uso + +- Normalizzare un PDF unito in cui le pagine provengono da scanner diversi +- Convertire un documento US Letter in A4 per la distribuzione internazionale +- Preparare PDF pronti per la stampa che richiedono un formato di taglio coerente +- Correggere pagine leggermente fuori standard (ad es. 8,49 x 11,02 pollici invece di 8,5 x 11) + +## Suggerimenti + +- Usa la modalità Adatta per essere certo di non perdere contenuto. La modalità Riempi ha un aspetto più pulito ma può tagliare i bordi. +- Controlla il risultato con lo strumento Dimensioni Pagina per verificare che ogni pagina corrisponda alla dimensione di destinazione. +- Il bianco è il colore di sfondo predefinito; passa a un colore scuro se il tuo documento ha margini scuri. + +## Strumenti correlati + +- [Dimensioni Pagina](./page-dimensions): controlla le dimensioni delle pagine prima e dopo la correzione +- [Comprimi PDF](./compress-pdf): riduci la dimensione del file dopo l'uniformazione +- [Ritaglia PDF](./crop-pdf): ritaglia le pagine manualmente invece di scalarle automaticamente diff --git a/docs/it/tools/flatten-pdf.md b/docs/it/tools/flatten-pdf.md new file mode 100644 index 00000000..79daaa5c --- /dev/null +++ b/docs/it/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Appiattisci PDF +description: Appiattisci moduli interattivi e annotazioni in contenuto statico. Rende i campi dei moduli non modificabili e fonde le annotazioni nella pagina. +--- + +# Appiattisci PDF + +L'appiattimento fonde gli elementi interattivi (campi dei moduli, menu a tendina, caselle di controllo, annotazioni, evidenziazioni, note adesive) direttamente nel contenuto della pagina. L'aspetto visivo resta lo stesso, ma nulla è più modificabile o estraibile. È l'equivalente PDF di stampare un modulo compilato e scansionarlo di nuovo, con la differenza che la qualità resta perfetta. + +## Come funziona + +1. Carica uno o più file PDF. +2. Clicca su **Appiattisci PDF**. +3. Un singolo file viene scaricato direttamente. Più file producono un archivio ZIP. + +Lo strumento usa pdf-lib per appiattire i campi dei moduli (tramite `form.flatten()`) e un apposito appiattitore di annotazioni per fondere le annotazioni nel flusso della pagina. Entrambe le operazioni avvengono in un unico passaggio. + +## Cosa viene appiattito + +- **Campi dei moduli**: campi di testo, caselle di controllo, pulsanti di opzione, menu a tendina, campi firma +- **Annotazioni**: commenti, evidenziazioni, testo barrato, sottolineato, note adesive, timbri, annotazioni a mano libera +- **Elementi interattivi**: pulsanti, azioni attivabili + +## Cosa resta invariato + +- Il contenuto testuale (resta selezionabile e ricercabile) +- Immagini e grafica +- Layout e dimensioni delle pagine +- Segnalibri e indice +- Collegamenti ipertestuali (a meno che non siano basati su annotazioni) + +## Casi d'uso + +- Bloccare un modulo compilato in modo che i destinatari non possano modificare le risposte inviate +- Preparare un PDF per l'archiviazione dove gli elementi interattivi non servono +- Risolvere problemi di visualizzazione causati da annotazioni rese in modo diverso dai vari lettori +- Garantire che un documento firmato non possa essere modificato dopo l'applicazione della firma +- Ridurre la dimensione del file eliminando le definizioni dei campi e gli oggetti annotazione + +## Suggerimenti + +- Appiattisci dopo aver completato tutte le modifiche. Non c'è modo di annullare l'appiattimento di un PDF. +- Se devi appiattire e anche rimuovere metadati, JavaScript e allegati, usa invece lo strumento Sanitizza PDF, che include l'appiattimento tra le sue opzioni. +- Alcuni PDF segnalano "nessun modulo trovato": è normale se il documento ha solo annotazioni e nessun campo di modulo. + +## Strumenti correlati + +- [Sanitizza PDF](./sanitize-pdf): appiattisci i moduli e rimuovi metadati, script e altro +- [Rasterizza PDF](./rasterize-pdf): converti in un PDF basato su immagini per il massimo appiattimento +- [Font in Contorni](./font-to-outline): appiattisci i font in tracciati vettoriali +- [Cripta PDF](./protect-pdf): proteggi con password il PDF appiattito diff --git a/docs/it/tools/font-to-outline.md b/docs/it/tools/font-to-outline.md new file mode 100644 index 00000000..bab82262 --- /dev/null +++ b/docs/it/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Font in contorni +description: Converti tutti i font del PDF in contorni vettoriali per una resa coerente su ogni dispositivo. Elimina i problemi di dipendenza dai font. +--- + +# Font in contorni + +Convertire i font in contorni trasforma ogni carattere di testo da glifo basato su font a tracciato vettoriale. Il PDF non dipende più da alcun font installato: si visualizza in modo identico su ogni dispositivo, ogni sistema operativo e ogni stampante. È un passaggio standard nei flussi di prestampa. + +## Come funziona + +1. Carica uno o più file PDF. +2. Clicca su **Converti in Contorni**. +3. Ghostscript converte tutto il testo in tracciati vettoriali. +4. Scarica il risultato. Più file producono un archivio ZIP. + +Non ci sono impostazioni da configurare. Lo strumento usa Ghostscript (WebAssembly) per convertire tutti i riferimenti ai font in tracciati a contorno in un unico passaggio. + +## Cosa cambia + +- I caratteri di testo diventano curve vettoriali (tracciati bezier) +- L'incorporamento dei font non è più necessario: il PDF è autosufficiente a livello di glifo +- La dimensione del file può aumentare perché i tracciati vettoriali sono in genere più grandi dei riferimenti ai font +- L'aspetto visivo viene preservato esattamente + +## Cosa perdi + +- Selezione e copia-incolla del testo +- Ricercabilità del testo (Ctrl+F smette di funzionare) +- La possibilità di modificare il contenuto testuale +- Accessibilità per i lettori di schermo + +## Casi d'uso + +- Inviare PDF a una tipografia che richiede font convertiti in contorni +- Condividere documenti che usano font personalizzati o con licenza con persone che non hanno quei font +- Evitare la sostituzione dei font che cambia l'aspetto del documento su altri sistemi +- Preparare PDF per flussi di incisione laser o taglio CNC che richiedono input vettoriale +- Garantire che un PDF ricco di loghi si visualizzi correttamente su tutte le piattaforme + +## Suggerimenti + +- Conserva il PDF originale. La conversione in contorni è irreversibile: non puoi riconvertire i tracciati in testo modificabile. +- Se hai bisogno che il testo resti ricercabile, valuta invece lo strumento Rasterizza PDF seguito dall'OCR. +- I PDF con contorni tendono a essere più grandi. Esegui Comprimi PDF in seguito se la dimensione conta. + +## Strumenti correlati + +- [Appiattisci PDF](./flatten-pdf): appiattisci moduli e annotazioni senza toccare i font +- [Rasterizza PDF](./rasterize-pdf): converti in un PDF basato su immagini invece che in contorni vettoriali +- [Comprimi PDF](./compress-pdf): riduci la dimensione del file dopo la conversione in contorni +- [PDF in PDF/A](./pdf-to-pdfa): converti per l'archiviazione dopo aver garantito l'indipendenza dai font diff --git a/docs/it/tools/form-creator.md b/docs/it/tools/form-creator.md new file mode 100644 index 00000000..4f704438 --- /dev/null +++ b/docs/it/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Crea modulo PDF +description: Crea moduli PDF compilabili con campi di testo, caselle di controllo, menu a tendina, pulsanti di opzione e altro, con il trascinamento. +--- + +# Crea modulo PDF + +Progetta moduli PDF compilabili professionali da zero o aggiungendo campi a un PDF esistente. L'editor visuale ti permette di trascinare gli elementi del modulo (campi di testo, caselle di controllo, menu a tendina, pulsanti di opzione, campi firma e altro) direttamente sulle anteprime delle pagine. Configura le proprietà dei campi, imposta regole di visibilità condizionale ed esporta un modulo PDF completamente interattivo. + +## Come funziona + +1. Carica un PDF esistente **oppure** clicca su **Crea PDF vuoto** per iniziare da zero. +2. Se crei un PDF vuoto, seleziona un formato di pagina (Letter, A4, A5, Legal, Tabloid, A3 o dimensioni personalizzate). +3. Si apre l'editor del modulo con una barra degli strumenti dei tipi di campo e un'area di anteprima della pagina. +4. Seleziona un tipo di campo dalla barra degli strumenti, poi clicca sulla pagina per posizionarlo. +5. Trascina i campi per riposizionarli. Usa le maniglie di ridimensionamento per regolare le dimensioni. +6. Clicca su un campo per aprire il pannello delle proprietà, dove puoi impostare nome del campo, valore predefinito, dimensione del carattere, allineamento e altro. +7. Naviga tra le pagine con i controlli di pagina. +8. Clicca su **Salva** per scaricare il PDF compilabile finito. + +## Funzionalità + +- Posizionamento dei campi con trascinamento e maniglie visive per il ridimensionamento +- Tipi di campo: input di testo, testo su più righe, casella di controllo, menu a tendina, pulsante di opzione, firma, data, numero e codice a barre +- Pannello delle proprietà per configurare nome, etichetta, valore predefinito, dimensione del carattere, colore, allineamento e validazione di ogni campo +- Azioni sui campi e regole di visibilità condizionale (mostra/nascondi campi in base ai valori di altri campi) +- Navigazione tra le pagine per moduli su più pagine +- Estrazione dei campi esistenti: rileva e importa automaticamente i campi dei moduli dai PDF caricati +- Supporto sia per PDF caricati sia per pagine vuote come tela del modulo +- Diversi formati di pagina predefiniti più dimensioni personalizzate +- Generazione di codici a barre con bwip-js +- Gestione dei gruppi di pulsanti di opzione + +## Opzioni + +**Formati di pagina predefiniti (per PDF vuoti):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Personalizzato (specifica larghezza e altezza) + +**Proprietà dei campi (variano in base al tipo di campo):** + +- Nome, etichetta e testo segnaposto +- Valore predefinito +- Famiglia, dimensione e colore del carattere +- Allineamento del testo (sinistra, centro, destra) +- Interruttore campo obbligatorio +- Interruttore sola lettura +- Lunghezza massima per i campi di testo +- Elenco di opzioni per menu a tendina e pulsanti di opzione +- Azioni di visibilità condizionale + +## Casi d'uso + +- Creare moduli di inserimento dei dipendenti con campi di testo per i dati personali e caselle di controllo per l'accettazione delle policy +- Creare questionari di accoglienza clienti con menu a tendina per la scelta del servizio +- Progettare moduli d'ordine con campi calcolati e identificatori a codice a barre +- Creare checklist di ispezione con pulsanti di opzione per le valutazioni superato/non superato +- Creare moduli di sondaggio con domande di approfondimento condizionali che compaiono in base alle risposte + +## Suggerimenti + +- Se carichi un PDF esistente, lo strumento tenta di estrarre i campi del modulo già presenti, così puoi modificarli o aggiungerne altri. +- Usa la funzione dei gruppi di pulsanti di opzione per creare selezioni mutuamente esclusive. I campi dello stesso gruppo condividono un nome di gruppo. +- Testa il tuo modulo scaricandolo e aprendolo nel [Compilatore Moduli PDF](./form-filler) per verificare il comportamento dei campi. + +## Strumenti correlati + +- [Compilatore Moduli PDF](./form-filler) +- [Firma PDF](./sign-pdf) +- [Editor PDF](./edit-pdf) diff --git a/docs/it/tools/form-filler.md b/docs/it/tools/form-filler.md new file mode 100644 index 00000000..ada93cf0 --- /dev/null +++ b/docs/it/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Compilatore moduli PDF +description: Compila moduli PDF, inclusi i moduli XFA, direttamente nel browser con un visualizzatore integrato. +--- + +# Compilatore moduli PDF + +Apri un PDF con campi di modulo e compilalo direttamente in un visualizzatore integrato. Lo strumento supporta sia i campi AcroForm standard sia i moduli XFA (XML Forms Architecture) legacy. Una volta completato il modulo, scarica la versione compilata con un solo clic. + +## Come funziona + +1. Carica un PDF che contiene campi di modulo. +2. Il documento si apre in un visualizzatore PDF integrato che mostra i campi del modulo come input interattivi. +3. Clicca su campi di testo, caselle di controllo, menu a tendina e pulsanti di opzione per compilarli. +4. Clicca su **Salva e scarica il modulo compilato** per ottenere il PDF completato. + +## Funzionalità + +- Visualizzatore PDF.js integrato con piena interazione con i campi del modulo +- Supporto per i campi AcroForm standard (input di testo, caselle di controllo, menu a tendina, pulsanti di opzione) +- Supporto dei moduli XFA per i moduli legacy basati su XML +- Dimensionamento automatico del visualizzatore in base alle dimensioni della pagina +- Visualizzazione del file con nome e dimensione + +## Opzioni + +Non ci sono opzioni di configurazione aggiuntive. Carica il modulo, compilalo e scaricalo. + +## Casi d'uso + +- Compilare moduli fiscali, richieste assicurative o pratiche burocratiche +- Compilare moduli di candidatura ricevuti come allegati PDF +- Completare moduli di inserimento fornitori o questionari per fornitori +- Approvare checklist di conformità con campi a casella di controllo +- Compilare moduli di accettazione medica prima di un appuntamento + +## Suggerimenti + +- I moduli XFA sono un formato legacy supportato solo da alcuni visualizzatori PDF. Se apri un PDF XFA in Chrome o nella maggior parte degli altri strumenti e vedi pagine vuote, significa che quei visualizzatori non supportano XFA. Il Compilatore Moduli di BentoPDF e Firefox gestiscono correttamente XFA. +- Per i PDF senza campi di modulo esistenti, usa lo strumento [Crea Modulo PDF](./form-creator) per aggiungere prima i campi, poi compilali qui. +- Il visualizzatore adatta automaticamente le proprie dimensioni a quelle della pagina del PDF. + +## Strumenti correlati + +- [Crea Modulo PDF](./form-creator) +- [Firma PDF](./sign-pdf) +- [Editor PDF](./edit-pdf) diff --git a/docs/it/tools/header-footer.md b/docs/it/tools/header-footer.md new file mode 100644 index 00000000..1fbe5787 --- /dev/null +++ b/docs/it/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Intestazione e piè di pagina +description: Aggiungi testo personalizzabile di intestazione e piè di pagina alle pagine PDF con variabili dinamiche per i numeri di pagina. +--- + +# Intestazione e piè di pagina + +Aggiungi testo in sei posizioni delle pagine del tuo PDF: intestazione a sinistra, al centro e a destra, piè di pagina a sinistra, al centro e a destra. Lo strumento supporta variabili dinamiche per il numero di pagina e il totale delle pagine, così puoi creare modelli come "Pagina 3 di 10" che si aggiornano automaticamente per ogni pagina. + +## Come funziona + +1. Carica il tuo file PDF. +2. Compare il pannello delle opzioni con i controlli di formattazione e sei campi di testo. +3. Inserisci il testo desiderato in una qualsiasi posizione di intestazione o piè di pagina. +4. Usa i segnaposto `{page}` e `{total}` per la numerazione dinamica. +5. Regola dimensione e colore del carattere e, se vuoi, limita l'operazione a un intervallo di pagine. +6. Clicca su **Aggiungi Intestazione e Piè di Pagina** per elaborare e scaricare. + +## Opzioni + +- **Intervallo di pagine**: limita facoltativamente le pagine che ricevono intestazioni e piè di pagina. Lascia vuoto per applicarlo a tutte le pagine. Formato: "1-3, 5" (intervalli separati da virgole). +- **Dimensione del carattere**: tra 6 e 24 punti. Il valore predefinito è 10. +- **Colore del carattere**: scegli qualsiasi colore con il selettore di colore. +- **Intestazione sinistra / centro / destra**: campi di testo per la parte alta di ogni pagina. +- **Piè di pagina sinistra / centro / destra**: campi di testo per la parte bassa di ogni pagina. + +## Funzionalità + +- Sei posizioni di testo indipendenti per pagina +- Variabile dinamica `{page}` che inserisce il numero della pagina corrente +- Variabile dinamica `{total}` che inserisce il numero totale di pagine +- Filtro per intervallo di pagine per scegliere pagine specifiche +- Dimensione e colore del carattere personalizzabili +- Font Helvetica per un risultato pulito e professionale + +## Casi d'uso + +- Aggiungere "Pagina {page} di {total}" al centro del piè di pagina di una relazione +- Inserire il nome dell'azienda nell'intestazione a sinistra e la data del documento nell'intestazione a destra +- Aggiungere avvisi di riservatezza al piè di pagina dei documenti legali +- Applicare i numeri di revisione del documento a specifici intervalli di pagine + +## Suggerimenti + +- Combina `{page}` e `{total}` in un unico campo per formati come "Pagina {page} di {total}" o "{page}/{total}". +- Puoi lasciare vuota la maggior parte dei campi e compilare solo le posizioni che ti servono. I campi vuoti vengono semplicemente ignorati. +- Per intestazioni più complesse con immagini o loghi, valuta lo strumento [Aggiungi Filigrana](./add-watermark) posizionato nella parte alta della pagina. + +## Strumenti correlati + +- [Numeri di Pagina](./page-numbers) +- [Aggiungi Filigrana](./add-watermark) +- [Numerazione Bates](./bates-numbering) diff --git a/docs/it/tools/heic-to-pdf.md b/docs/it/tools/heic-to-pdf.md new file mode 100644 index 00000000..65be8c00 --- /dev/null +++ b/docs/it/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC in PDF +description: Converti le immagini HEIC e HEIF di iPhone e iPad in PDF direttamente nel browser. +--- + +# HEIC in PDF + +Converti le immagini HEIC/HEIF in PDF. HEIC è il formato foto predefinito di iPhone e iPad da iOS 11. Questo strumento ti permette di trasformare quelle foto in PDF senza installare software desktop né caricare file su un server. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :--------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file HEIC/HEIF. +2. Controlla l'elenco dei file e rimuovi quelli che non ti servono. +3. Clicca su **Converti in PDF**. Il risultato viene scaricato come `from_heic.pdf`. + +Ogni file HEIC viene decodificato con la libreria heic2any, che lo converte in PNG con qualità al 92%. Il PNG viene poi incorporato nel PDF con pdf-lib, con ogni immagine su una pagina a sé alla risoluzione piena. + +## Opzioni + +Questo strumento non offre impostazioni aggiuntive. Le immagini HEIC vengono convertite in PNG ad alta qualità (0,92) prima dell'incorporamento. + +## Casi d'uso + +- Creare un PDF dalle foto dell'iPhone da allegare a una richiesta di risarcimento assicurativo o a una relazione +- Convertire le foto HEIC per un annuncio immobiliare in un unico documento stampabile +- Trasformare gli screenshot dell'iPad (formato HEIF) in un PDF condivisibile +- Convertire in blocco le foto delle vacanze per un diario di viaggio + +## Suggerimenti + +- La decodifica HEIC avviene interamente nel browser con WebAssembly. La prima conversione può richiedere un momento mentre il decodificatore si carica. +- Se devi mescolare HEIC con altri formati di immagine (JPG, PNG, ecc.), usa lo strumento [Immagini in PDF](./image-to-pdf), che gestisce HEIC insieme a tutti gli altri formati. +- I file HEIC degli iPhone contengono spesso dati EXIF, comprese le coordinate GPS. Il PDF risultante non conserva questi metadati. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [JPG in PDF](./jpg-to-pdf) +- [PNG in PDF](./png-to-pdf) diff --git a/docs/it/tools/image-to-pdf.md b/docs/it/tools/image-to-pdf.md new file mode 100644 index 00000000..a8f52a20 --- /dev/null +++ b/docs/it/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Immagini in PDF +description: Converti JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD e più di 10 altri formati di immagine in un unico file PDF. +--- + +# Immagini in PDF + +Il convertitore universale da immagini a PDF. Carica immagini in praticamente qualsiasi formato e uniscile in un unico documento PDF. Ogni immagine ottiene una pagina propria, delle stesse dimensioni dell'originale. + +## Formati supportati + +| Formato | Estensioni | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +È il supporto di formati più ampio tra tutti i convertitori di immagini di BentoPDF. Se ti serve un solo formato, usa invece uno degli strumenti dedicati. + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file immagine. Puoi selezionare più file contemporaneamente. +2. Controlla l'elenco dei file. Rimuovi quelli che non ti servono con l'icona del cestino, oppure clicca su **Aggiungi altri file** per includere altre immagini. +3. Scegli un livello di **Qualità PDF** dal menu a tendina. +4. Clicca su **Converti in PDF**. Lo strumento elabora le immagini con il motore PyMuPDF e scarica il risultato come `images_to_pdf.pdf`. + +## Opzioni + +**Qualità PDF** controlla la compressione applicata alle immagini quando vengono incorporate nel PDF: + +- **Alta qualità**: compressione minima, file più grande. Ideale per la stampa o l'archiviazione. +- **Qualità media** (predefinita): compressione bilanciata. Va bene per la maggior parte degli usi. +- **Bassa qualità**: compressione aggressiva, file più piccolo. Adatta a email o condivisioni rapide. + +I file HEIC e WebP vengono convertiti automaticamente in PNG prima dell'incorporamento. Questo avviene in modo trasparente e non richiede passaggi extra. + +## Casi d'uso + +- Unire in un unico PDF ricevute o documenti scansionati con la fotocamera del telefono +- Creare un portfolio fotografico o un lookbook da immagini in formati misti +- Convertire le foto dell'iPhone (HEIC) in un PDF condivisibile senza installare software desktop +- Assemblare mockup di design da esportazioni PSD e screenshot in un documento da consegnare al cliente +- Archiviare una cartella di formati di immagine datati (PNM, JXR, JP2) come un unico PDF + +## Suggerimenti + +- L'ordine delle immagini nel PDF corrisponde all'ordine in cui compaiono nell'elenco dei file. Caricale nella sequenza che desideri. +- Per ottenere il file più piccolo possibile, scegli Bassa qualità. La differenza visiva è spesso trascurabile per scansioni ricche di testo. +- Se hai un solo formato di immagine, i convertitori dedicati (JPG in PDF, PNG in PDF, ecc.) offrono lo stesso risultato con un'interfaccia più semplice. + +## Strumenti correlati + +- [JPG in PDF](./jpg-to-pdf) +- [PNG in PDF](./png-to-pdf) +- [HEIC in PDF](./heic-to-pdf) +- [WebP in PDF](./webp-to-pdf) diff --git a/docs/it/tools/index.md b/docs/it/tools/index.md new file mode 100644 index 00000000..ddf79e25 --- /dev/null +++ b/docs/it/tools/index.md @@ -0,0 +1,183 @@ +# Riferimento degli strumenti + +BentoPDF offre **più di 130 strumenti** per lavorare con i PDF. Tutti gli strumenti vengono eseguiti interamente nel tuo browser: i tuoi file non lasciano mai il dispositivo. + +--- + +## Modifica e annota + +Modifica, annota e migliora i tuoi documenti PDF con un'ampia suite di strumenti di modifica. + +
+ +- [**Editor PDF**](./edit-pdf): annota, evidenzia, oscura, commenta, aggiungi forme/immagini, cerca e visualizza i PDF. +- [**Modifica Segnalibri**](./bookmark): aggiungi, modifica, importa, elimina ed estrai i segnalibri del PDF. +- [**Indice**](./table-of-contents): genera una pagina di indice dai segnalibri del PDF. +- [**Numeri di Pagina**](./page-numbers): inserisci i numeri di pagina nel documento. +- [**Aggiungi etichette di pagina**](./add-page-labels): applica etichette di pagina PDF con numeri romani, prefissi e inizi personalizzati. +- [**Numerazione Bates**](./bates-numbering): aggiungi numeri Bates sequenziali su uno o più file PDF. +- [**Aggiungi Filigrana**](./add-watermark): sovrapponi testo o un'immagine alle pagine del PDF. +- [**Intestazione e Piè di Pagina**](./header-footer): aggiungi testo nella parte alta e bassa delle pagine. +- [**Inverti Colori**](./invert-colors): crea una versione in modalità scura del tuo PDF. +- [**Effetto scanner**](./scanner-effect): fai sembrare il tuo PDF un documento scansionato. +- [**Regola colori**](./adjust-colors): regola con precisione luminosità, contrasto, saturazione e altro. +- [**Colore di Sfondo**](./background-color): cambia il colore di sfondo del tuo PDF. +- [**Cambia Colore Testo**](./text-color): cambia il colore del testo nel tuo PDF. +- [**Firma PDF**](./sign-pdf): disegna, digita o carica la tua firma. +- [**Aggiungi Timbri**](./add-stamps): aggiungi timbri immagine al tuo PDF con la barra degli strumenti delle annotazioni. +- [**Rimuovi Annotazioni**](./remove-annotations): elimina commenti, evidenziazioni e link. +- [**Ritaglia PDF**](./crop-pdf): rifila i margini di ogni pagina del tuo PDF. +- [**Compilatore Moduli PDF**](./form-filler): compila i moduli direttamente nel browser. Supporta anche i moduli XFA. +- [**Crea Modulo PDF**](./form-creator): crea moduli PDF compilabili con campi di testo trascinabili. +- [**Rimuovi Pagine Vuote**](./remove-blank-pages): rileva ed elimina automaticamente le pagine vuote. + +
+ +--- + +## Converti in PDF + +Trasforma immagini, documenti, e-book e altri formati di file in PDF. + +
+ +- [**Immagini in PDF**](./image-to-pdf): converti JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP e altri in PDF. +- [**JPG in PDF**](./jpg-to-pdf): crea un PDF da una o più immagini JPG. +- [**PNG in PDF**](./png-to-pdf): crea un PDF da una o più immagini PNG. +- [**WebP in PDF**](./webp-to-pdf): crea un PDF da una o più immagini WebP. +- [**SVG in PDF**](./svg-to-pdf): crea un PDF da una o più immagini SVG. +- [**BMP in PDF**](./bmp-to-pdf): crea un PDF da una o più immagini BMP. +- [**HEIC in PDF**](./heic-to-pdf): crea un PDF da una o più immagini HEIC. +- [**TIFF in PDF**](./tiff-to-pdf): crea un PDF da una o più immagini TIFF. +- [**Testo in PDF**](./txt-to-pdf): converti un file di testo semplice in PDF. +- [**Markdown in PDF**](./markdown-to-pdf): converti Markdown in PDF con anteprima dal vivo ed evidenziazione della sintassi. +- [**JSON in PDF**](./json-to-pdf): converti file JSON in formato PDF. +- [**ODT in PDF**](./odt-to-pdf): converti file ODT (OpenDocument Text) in PDF. +- [**CSV in PDF**](./csv-to-pdf): converti fogli di calcolo CSV in PDF. +- [**RTF in PDF**](./rtf-to-pdf): converti documenti RTF (Rich Text Format) in PDF. +- [**Word in PDF**](./word-to-pdf): converti documenti Word (DOCX, DOC, ODT) in PDF. +- [**Excel in PDF**](./excel-to-pdf): converti fogli di calcolo Excel (XLSX, XLS, ODS) in PDF. +- [**PowerPoint in PDF**](./powerpoint-to-pdf): converti presentazioni PowerPoint (PPTX, PPT, ODP) in PDF. +- [**XPS in PDF**](./xps-to-pdf): converti documenti XPS/OXPS in PDF. +- [**MOBI in PDF**](./mobi-to-pdf): converti e-book MOBI in PDF. +- [**EPUB in PDF**](./epub-to-pdf): converti e-book EPUB in PDF. +- [**FB2 in PDF**](./fb2-to-pdf): converti e-book FictionBook (FB2) in PDF. +- [**CBZ in PDF**](./cbz-to-pdf): converti archivi di fumetti (CBZ/CBR) in PDF. +- [**WPD in PDF**](./wpd-to-pdf): converti documenti WordPerfect (WPD) in PDF. +- [**WPS in PDF**](./wps-to-pdf): converti documenti WPS Office in PDF. +- [**XML in PDF**](./xml-to-pdf): converti documenti XML in PDF. +- [**ODG in PDF**](./odg-to-pdf): converti OpenDocument Graphics (ODG) in PDF. +- [**ODS in PDF**](./ods-to-pdf): converti OpenDocument Spreadsheet (ODS) in PDF. +- [**ODP in PDF**](./odp-to-pdf): converti OpenDocument Presentation (ODP) in PDF. +- [**PUB in PDF**](./pub-to-pdf): converti Microsoft Publisher (PUB) in PDF. +- [**VSD in PDF**](./vsd-to-pdf): converti Microsoft Visio (VSD, VSDX) in PDF. +- [**PSD in PDF**](./psd-to-pdf): converti file Adobe Photoshop (PSD) in PDF. +- [**Email in PDF**](./email-to-pdf): converti file email (EML, MSG) in formato PDF. + +
+ +--- + +## Converti da PDF + +Estrai il contenuto dei PDF in immagini, documenti e formati di dati. + +
+ +- [**PDF in JPG**](./pdf-to-jpg): converti ogni pagina del PDF in un'immagine JPG. +- [**PDF in PNG**](./pdf-to-png): converti ogni pagina del PDF in un'immagine PNG. +- [**PDF in WebP**](./pdf-to-webp): converti ogni pagina del PDF in un'immagine WebP. +- [**PDF in BMP**](./pdf-to-bmp): converti ogni pagina del PDF in un'immagine BMP. +- [**PDF in TIFF**](./pdf-to-tiff): converti ogni pagina del PDF in un'immagine TIFF. +- [**PDF in CBZ**](./pdf-to-cbz): converti un PDF in un CBZ (archivio di fumetti) per lettori di fumetti e Calibre. +- [**PDF in SVG**](./pdf-to-svg): converti ogni pagina del PDF in una grafica vettoriale scalabile. +- [**PDF in CSV**](./pdf-to-csv): estrai le tabelle dal PDF e convertile in formato CSV. +- [**PDF in Excel**](./pdf-to-excel): estrai le tabelle dal PDF e convertile in Excel (XLSX). +- [**PDF in scala di grigi**](./pdf-to-greyscale): converti tutti i colori in bianco e nero. +- [**PDF in JSON**](./pdf-to-json): converti file PDF in formato JSON. +- [**PDF in Word**](./pdf-to-word): converti file PDF in documenti Word modificabili. +- [**Estrai immagini**](./extract-images): estrai tutte le immagini incorporate dai tuoi file PDF. +- [**PDF in Markdown**](./pdf-to-markdown): converti testo e tabelle del PDF in formato Markdown. +- [**Prepara PDF per IA**](./prepare-pdf-for-ai): estrai il contenuto del PDF come JSON LlamaIndex per pipeline RAG/LLM. +- [**PDF in Testo**](./pdf-to-text): estrai il testo dai file PDF e salvalo come testo semplice. +- [**Estrai tabelle PDF**](./extract-tables): estrai le tabelle dai PDF come CSV, JSON o Markdown. + +
+ +--- + +## Organizza e gestisci + +Riorganizza, combina, dividi e gestisci le pagine e i file PDF. + +
+ +- [**Costruttore di workflow PDF**](./pdf-workflow): crea pipeline di elaborazione PDF personalizzate con un editor visuale a nodi. +- [**Strumento PDF multifunzione**](./pdf-multi-tool): editor PDF completo con gestione delle pagine. +- [**OCR PDF**](./ocr-pdf): rendi un PDF ricercabile e copiabile. +- [**Unisci PDF**](./merge-pdf): combina più PDF in un unico file. +- [**Alterna e Riordina Pagine**](./alternate-merge): unisci i PDF alternando le pagine di ciascuno. +- [**Fascicola scansione fronte/retro**](./duplex-collate): riordina i blocchi di scansione fronte/retro nella sequenza di pagine corretta. +- [**Duplica e Organizza**](./organize-pdf): duplica, riordina ed elimina pagine. +- [**Aggiungi Allegati**](./add-attachments): incorpora uno o più file nel tuo PDF. +- [**Estrai Allegati**](./extract-attachments): estrai tutti i file incorporati dai PDF come ZIP. +- [**Modifica Allegati**](./edit-attachments): visualizza o rimuovi gli allegati nel tuo PDF. +- [**Livelli PDF (OCG)**](./pdf-layers): visualizza, attiva/disattiva, aggiungi ed elimina i livelli OCG nel tuo PDF. +- [**Dividi PDF**](./split-pdf): estrai un intervallo di pagine in un nuovo PDF. +- [**Dividi Pagine**](./divide-pages): dividi le pagine in orizzontale o in verticale. +- [**Estrai Pagine**](./extract-pages): salva una selezione di pagine come nuovi file. +- [**Elimina Pagine**](./delete-pages): rimuovi pagine specifiche dal documento. +- [**Aggiungi Pagina Vuota**](./add-blank-page): inserisci una pagina vuota in qualsiasi punto del tuo PDF. +- [**Inverti Pagine**](./reverse-pages): inverti l'ordine di tutte le pagine del documento. +- [**Ruota PDF**](./rotate-pdf): ruota le pagine a incrementi di 90 gradi. +- [**Ruota di Gradi Personalizzati**](./rotate-custom): ruota le pagine di qualsiasi angolo personalizzato. +- [**N-Up PDF**](./n-up-pdf): disponi più pagine su un unico foglio. +- [**Opuscolo PDF**](./pdf-booklet): riordina le pagine per la stampa di opuscoli fronte/retro. +- [**Combina in Una Pagina**](./combine-single-page): unisci tutte le pagine in un unico scorrimento continuo. +- [**Visualizza Metadati**](./view-metadata): ispeziona le proprietà nascoste del tuo PDF. +- [**Modifica Metadati**](./edit-metadata): cambia autore, titolo e altre proprietà. +- [**PDF in ZIP**](./pdf-to-zip): raggruppa più file PDF in un archivio ZIP. +- [**Confronta PDF**](./compare-pdfs): confronta due PDF affiancati. +- [**Posterizza PDF**](./posterize-pdf): dividi una pagina grande in più pagine più piccole. + +
+ +--- + +## Ottimizza e ripara + +Comprimi, correggi e ottimizza i tuoi PDF per prestazioni e compatibilità migliori. + +
+ +- [**Comprimi PDF**](./compress-pdf): riduci la dimensione del file del tuo PDF. +- [**PDF in PDF/A**](./pdf-to-pdfa): converti il PDF in PDF/A per l'archiviazione a lungo termine. +- [**Correggi Dimensione Pagina**](./fix-page-size): uniforma tutte le pagine a una dimensione comune. +- [**Linearizza PDF**](./linearize-pdf): ottimizza il PDF per una visualizzazione web rapida. +- [**Dimensioni Pagina**](./page-dimensions): analizza dimensione, orientamento e unità della pagina. +- [**Rimuovi Restrizioni**](./remove-restrictions): rimuovi la protezione con password e le restrizioni di sicurezza. +- [**Ripara PDF**](./repair-pdf): recupera i dati da file PDF corrotti o danneggiati. +- [**Rasterizza PDF**](./rasterize-pdf): converti il PDF in un PDF basato su immagini. Appiattisci i livelli e rimuovi il testo selezionabile. +- [**Raddrizza PDF**](./deskew-pdf): raddrizza automaticamente le pagine scansionate inclinate con OpenCV. +- [**Font in Contorni**](./font-to-outline): converti tutti i font in contorni vettoriali per una resa coerente. + +
+ +--- + +## Proteggi il PDF + +Proteggi, cripta e controlla l'accesso ai tuoi documenti PDF. + +
+ +- [**Cripta PDF**](./protect-pdf): proteggi il tuo PDF aggiungendo una password. +- [**Sanitizza PDF**](./sanitize-pdf): rimuovi metadati, annotazioni, script e altro. +- [**Decrittografa PDF**](./unlock-pdf): sblocca il PDF rimuovendo la protezione con password. +- [**Appiattisci PDF**](./flatten-pdf): rendi non modificabili i campi dei moduli e le annotazioni. +- [**Rimuovi metadati**](./remove-metadata): elimina i dati nascosti dal tuo PDF. +- [**Modifica permessi**](./change-permissions): imposta o cambia i permessi utente su un PDF. +- [**Firma digitale PDF**](./digital-sign-pdf): aggiungi una firma digitale crittografica con certificati X.509. +- [**Verifica firma PDF**](./validate-signature-pdf): verifica le firme digitali e visualizza i dettagli del certificato. + +
diff --git a/docs/it/tools/invert-colors.md b/docs/it/tools/invert-colors.md new file mode 100644 index 00000000..5b99d69c --- /dev/null +++ b/docs/it/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Inverti colori +description: Inverti tutti i colori del tuo PDF per creare una versione in modalità scura di qualsiasi documento. +--- + +# Inverti colori + +Trasforma ogni colore del tuo PDF nel suo inverso. Gli sfondi bianchi diventano neri, il testo nero diventa bianco e tutti gli altri colori passano ai rispettivi complementari. È il modo più rapido per creare una versione "modalità scura" di qualsiasi PDF. + +## Come funziona + +1. Carica il tuo file PDF. +2. Clicca su **Inverti Colori** per elaborare. +3. Il PDF invertito viene scaricato automaticamente. + +Non ci sono impostazioni aggiuntive. Lo strumento renderizza ogni pagina come immagine, inverte tutti i colori dei pixel e riassembla il risultato in un nuovo PDF. + +## Funzionalità + +- Inversione dei colori con un clic per tutte le pagine +- Elabora ogni pagina del documento +- Mantiene dimensioni e layout originali delle pagine +- Funziona con qualsiasi PDF, indipendentemente dal contenuto (testo, immagini, misto) + +## Casi d'uso + +- Creare versioni in modalità scura di libri di testo o manuali per una lettura notturna più comoda +- Preparare versioni ad alto contrasto dei documenti per scopi di accessibilità +- Invertire documenti scansionati acquisiti con un'esposizione errata +- Generare versioni in negativo di PDF ricchi di immagini per l'analisi visiva + +## Suggerimenti + +- Poiché lo strumento rasterizza le pagine per applicare l'effetto, il risultato è basato su immagini. Il testo non sarà più selezionabile né ricercabile. Se ti serve testo ricercabile dopo l'inversione, passa il risultato in uno strumento OCR. +- Per regolazioni dei colori più precise (luminosità, contrasto, saturazione), usa invece lo strumento [Regola Colori](./adjust-colors). +- I PDF grandi con molte pagine possono richiedere più tempo, perché ogni pagina viene renderizzata e invertita singolarmente. + +## Strumenti correlati + +- [Regola Colori](./adjust-colors) +- [Colore di Sfondo](./background-color) +- [Effetto Scanner](./scanner-effect) diff --git a/docs/it/tools/jpg-to-pdf.md b/docs/it/tools/jpg-to-pdf.md new file mode 100644 index 00000000..06c839bd --- /dev/null +++ b/docs/it/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG in PDF +description: Converti una o più immagini JPG, JPEG e JPEG 2000 in un unico file PDF direttamente nel browser. +--- + +# JPG in PDF + +Trasforma le immagini JPG in un PDF pulito. Carica un file o più JPG insieme: ogni immagine diventa una pagina a dimensione piena nel documento finale. + +## Formati supportati + +| Formato | Estensioni | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file JPG. La selezione multipla è supportata. +2. Controlla i file caricati. Usa l'icona del cestino per rimuovere singoli file, oppure clicca su **Aggiungi altri file** per aggiungerne all'elenco. +3. Seleziona un livello di **Qualità PDF**. +4. Clicca su **Converti in PDF**. Lo strumento comprime le immagini in base all'impostazione di qualità, le converte con il motore PyMuPDF e scarica `from_jpgs.pdf`. + +## Opzioni + +**Qualità PDF** regola la compressione applicata a ogni immagine prima che venga incorporata nel PDF: + +- **Alta qualità**: conserva il massimo dettaglio. Da usare per fotografia o stampa. +- **Qualità media** (predefinita): un buon equilibrio tra nitidezza e dimensione del file. +- **Bassa qualità**: compressione aggressiva per il file più piccolo. + +## Casi d'uso + +- Convertire documenti scansionati salvati come JPG in un unico PDF da inviare +- Raccogliere foto di prodotto in un catalogo per i clienti +- Trasformare immagini mediche o satellitari JPEG 2000 in un PDF portabile +- Creare un album fotografico stampabile dalle esportazioni della fotocamera + +## Suggerimenti + +- I file JPEG 2000 (`.jp2`, `.jpx`) sono pienamente supportati, non solo il JPEG standard. È utile per l'imaging medico e i dati geospaziali. +- Se i tuoi JPG provengono dalla fotocamera di un telefono, la qualità Media di solito produce un file più piccolo del 40-60% rispetto ad Alta, senza differenze visibili a schermo. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [PNG in PDF](./png-to-pdf) +- [WebP in PDF](./webp-to-pdf) diff --git a/docs/it/tools/json-to-pdf.md b/docs/it/tools/json-to-pdf.md new file mode 100644 index 00000000..33adfac9 --- /dev/null +++ b/docs/it/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON in PDF +description: Ricostruisci i file PDF dal formato JSON di BentoPDF. Riconverti le esportazioni JSON nei documenti PDF originali. +--- + +# JSON in PDF + +Ricostruisci documenti PDF a partire da file JSON creati in precedenza con lo strumento **PDF in JSON** di BentoPDF. È uno strumento di conversione di andata e ritorno: prende la rappresentazione strutturata in JSON di un PDF e ricostruisce il documento originale. + +::: warning +Questo strumento accetta solo file JSON prodotti dal convertitore PDF in JSON di BentoPDF. I file JSON standard provenienti da API, database o altri strumenti non sono supportati. +::: + +## Formati supportati + +| Input | Descrizione | +| :------ | :---------------------------------------------------------- | +| `.json` | File JSON esportati dallo strumento PDF in JSON di BentoPDF | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina uno o più file JSON. +2. L'elenco dei file mostra ogni file selezionato con la sua dimensione. +3. Clicca su **Converti in PDF**. Lo strumento elabora tutti i file con un Web Worker e il motore CPDF. +4. Il risultato viene scaricato come `jsons-to-pdf.zip`, contenente un PDF per ogni file JSON in ingresso. + +La conversione viene eseguita in un Web Worker in background, quindi l'interfaccia resta reattiva anche con file di grandi dimensioni. + +## Opzioni + +Questo strumento non ha opzioni configurabili. La struttura del JSON determina interamente il PDF risultante. + +## Output + +Quando converti più file JSON, i risultati vengono consegnati come archivio ZIP. Ogni PDF prende il nome del file JSON di origine (ad es. `report.json` diventa `report.pdf`). + +## Casi d'uso + +- Ripristinare PDF da un backup o da una pipeline di archiviazione basati su JSON +- Far passare un PDF attraverso il JSON per ispezionarlo e poi riconvertirlo in PDF +- Ricostruire documenti dopo modifiche programmatiche alla struttura JSON +- Verificare che un'esportazione da PDF a JSON abbia catturato tutto il contenuto del documento riconvertendola + +## Suggerimenti + +- Se devi convertire dati JSON arbitrari (come risposte di API o file di configurazione) in un PDF formattato, lo strumento [Testo in PDF](./txt-to-pdf) è più adatto. Incolla il JSON come testo e verrà reso con una formattazione adeguata. +- Il motore WebAssembly CPDF deve essere disponibile perché questo strumento funzioni. Le istanze self-hosted richiedono la configurazione dei file WASM di CPDF. + +## Strumenti correlati + +- [Testo in PDF](./txt-to-pdf) +- [Markdown in PDF](./markdown-to-pdf) +- [CSV in PDF](./csv-to-pdf) diff --git a/docs/it/tools/linearize-pdf.md b/docs/it/tools/linearize-pdf.md new file mode 100644 index 00000000..6d727623 --- /dev/null +++ b/docs/it/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linearizza PDF +description: Ottimizza i file PDF per una visualizzazione web rapida con caricamento progressivo. Noto anche come ottimizzazione "Fast Web View". +--- + +# Linearizza PDF + +La linearizzazione ristruttura un PDF in modo che la prima pagina possa essere mostrata prima che l'intero file sia stato scaricato. Adobe la chiama "Fast Web View". Se ospiti PDF su un sito web o li servi tramite un portale documentale, la linearizzazione li fa aprire in modo molto più rapido. + +## Come funziona + +1. Carica uno o più file PDF. +2. Clicca su **Linearizza PDF**. +3. Scarica i risultati come archivio ZIP contenente tutti i file linearizzati. + +Non ci sono impostazioni da configurare. Lo strumento usa il flag `--linearize` di QPDF, che riorganizza la struttura interna del PDF senza alterarne il contenuto visivo. + +## Cosa fa la linearizzazione + +- Riordina gli oggetti del PDF in modo che i dati della prima pagina compaiano all'inizio del file +- Aggiunge un dizionario di linearizzazione e tabelle di suggerimento, così i visualizzatori sanno dove trovare ogni pagina +- Abilita le richieste byte-range: un browser può scaricare solo la prima pagina senza scaricare l'intero file +- Ripulisce la tabella dei riferimenti incrociati per un accesso casuale efficiente + +## Funzionalità + +- Elaborazione in blocco di più PDF in una sola operazione +- Il risultato conserva tutti i contenuti, i font, le immagini e gli elementi interattivi +- Usa QPDF (WebAssembly) per una linearizzazione affidabile e conforme agli standard +- I risultati vengono raggruppati in un file ZIP per un download comodo + +## Casi d'uso + +- Ospitare report PDF su un sito web dove gli utenti si aspettano la visualizzazione immediata delle pagine +- Incorporare PDF in applicazioni web con visualizzatori nel browser +- Pubblicare cataloghi o manuali PDF consultati su connessioni mobili lente +- Preparare documenti per le reti di distribuzione dei contenuti (CDN) che supportano il servizio byte-range + +## Suggerimenti + +- Linearizza dopo aver completato tutte le altre modifiche. Qualsiasi modifica successiva (unione, aggiunta di pagine) interrompe la linearizzazione. +- Combinala con Comprimi PDF per ottenere PDF il più piccoli e veloci da caricare possibile. +- La linearizzazione aggiunge un piccolo sovraccarico alla dimensione del file (in genere meno dell'1%). + +## Strumenti correlati + +- [Comprimi PDF](./compress-pdf): riduci la dimensione del file prima di linearizzare +- [Ripara PDF](./repair-pdf): correggi i problemi strutturali che impediscono la linearizzazione +- [Rimuovi Metadati](./remove-metadata): elimina i metadati prima di pubblicare online diff --git a/docs/it/tools/markdown-to-pdf.md b/docs/it/tools/markdown-to-pdf.md new file mode 100644 index 00000000..f1ebfe06 --- /dev/null +++ b/docs/it/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown in PDF +description: Scrivi o incolla Markdown ed esportalo come PDF formattato in modo professionale, con anteprima dal vivo ed evidenziazione della sintassi. +--- + +# Markdown in PDF + +Un editor Markdown completo con anteprima dal vivo ed esportazione in PDF con un clic. Scrivi da zero, carica un file `.md` esistente o incolla il contenuto dagli appunti. L'editor rende il tuo Markdown in tempo reale ed esporta un PDF con stile usando il motore di stampa integrato nel browser. + +## Formati supportati + +| Input | Descrizione | +| :------------ | :------------------------------ | +| File `.md` | Caricali con il pulsante Carica | +| Input diretto | Scrivi o incolla nell'editor | + +## Come funziona + +1. Apri lo strumento Markdown in PDF. L'editor si carica con una vista divisa: sorgente Markdown a sinistra, anteprima renderizzata a destra. +2. Scrivi il tuo Markdown, incollalo oppure clicca su **Carica** per caricare un file `.md`. +3. Passa dal tema chiaro a quello scuro con il cursore del tema nella barra degli strumenti. +4. Clicca su **Esporta PDF** (oppure premi `Ctrl/Cmd + S`) per generare un PDF tramite la finestra di stampa del browser. + +## Funzionalità + +L'editor supporta un ampio insieme di funzionalità Markdown oltre alle basi: + +- **Markdown standard**: titoli, grassetto, corsivo, link, immagini, elenchi, citazioni, linee orizzontali +- **Blocchi di codice** con evidenziazione della sintassi per più di 15 linguaggi (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash e altri) +- **Diagrammi Mermaid**: diagrammi di flusso, diagrammi di sequenza, diagrammi ER e altri tipi di grafici Mermaid vengono resi direttamente nell'anteprima +- **Tabelle** con la sintassi standard delle tabelle Markdown +- **Elenchi di attività** con caselle di controllo +- **Note a piè di pagina**, **pedici**, **apici** +- **Elenchi di definizioni**, **abbreviazioni** +- Supporto per le **emoji** (`:smile:` viene reso come emoji) +- **Evidenziazioni** (`==marked text==`) e **inserimenti** (`++inserted text++`) +- **URL con link automatico**: gli URL semplici vengono convertiti in link cliccabili +- Generazione dell'**indice** +- **Link di ancoraggio** sui titoli + +## Casi d'uso + +- Scrivere la documentazione di un progetto ed esportare un PDF curato per gli stakeholder +- Creare report tecnici con esempi di codice e diagrammi di architettura Mermaid +- Convertire un README di GitHub in PDF per l'uso offline o la stampa +- Redigere una proposta o una specifica con elenchi di attività e tabelle +- Generare una dispensa con stile a partire da appunti di lezione scritti in Markdown + +## Suggerimenti + +- L'output PDF usa la funzione di stampa in PDF del browser. In Chrome puoi personalizzare margini e scala nella finestra di stampa prima di salvare. +- I diagrammi Mermaid vengono resi nell'anteprima, ma al primo utilizzo possono richiedere un momento per inizializzarsi. +- Usa `Ctrl/Cmd + S` come scorciatoia da tastiera per esportare senza cercare il pulsante. + +## Strumenti correlati + +- [Testo in PDF](./txt-to-pdf) +- [Word in PDF](./word-to-pdf) +- [JSON in PDF](./json-to-pdf) diff --git a/docs/it/tools/merge-pdf.md b/docs/it/tools/merge-pdf.md new file mode 100644 index 00000000..e0a44012 --- /dev/null +++ b/docs/it/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Unisci PDF +description: Combina più file PDF in un unico documento con riordinamento tramite trascinamento e controllo a livello di pagina. +--- + +# Unisci PDF + +Combina più file PDF in un unico documento. Puoi unire file interi in un ordine specifico, oppure passare alla Modalità Pagina per avere un controllo preciso sulle singole pagine di ogni PDF caricato. + +## Come funziona + +1. Carica due o più file PDF cliccando sull'area di rilascio o trascinandoli. +2. Scegli tra **Modalità File** e **Modalità Pagina** con l'interruttore in alto. +3. In Modalità File, trascina i file per riordinarli e, se vuoi, specifica gli intervalli di pagine (ad es. `1-3, 5`) per ciascun file. Lascia l'intervallo vuoto per includere tutte le pagine. +4. In Modalità Pagina, trascina le miniature delle singole pagine per costruire l'esatta sequenza di pagine. +5. Clicca su **Unisci PDF** per combinare tutto in un unico file. Il PDF unito viene scaricato automaticamente. + +## Funzionalità + +- Due modalità di unione: Modalità File per combinare rapidamente file interi, Modalità Pagina per il controllo pagina per pagina +- Riordinamento con trascinamento in entrambe le modalità, con animazioni fluide +- La sintassi degli intervalli di pagine (ad es. `1-3, 5, 8-10`) permette di scegliere le pagine senza passare alla Modalità Pagina +- Le miniature delle pagine vengono caricate al bisogno, così l'interfaccia resta reattiva anche con documenti grandi +- Nessun limite al numero di file o al totale delle pagine +- Conserva la qualità originale del PDF senza ricodifica + +## Opzioni + +| Opzione | Descrizione | +| ------------------- | --------------------------------------------------------------------------------------------------------- | +| **Modalità File** | Unisci file interi in un ordine personalizzato, con filtri facoltativi per intervallo di pagine per file | +| **Modalità Pagina** | Griglia visiva di tutte le pagine di tutti i file: trascina le miniature per costruire la sequenza esatta | +| **Campo Pagine** | Campo di testo per file che accetta intervalli come `1-3, 5` per includere solo pagine specifiche | + +## Casi d'uso + +- Combinare PDF di capitoli separati in un unico libro o relazione +- Unire una lettera di presentazione e un curriculum in un unico documento di candidatura +- Estrarre pagine specifiche da più documenti di origine in un file consolidato +- Raccogliere ricevute o fatture scansionate in un unico PDF d'archivio +- Creare una dispensa di presentazione con diapositive provenienti da più presentazioni + +## Suggerimenti + +- Usa la Modalità Pagina quando devi alternare pagine di file diversi invece di accodare un file dopo l'altro. +- Puoi aggiungere altri file dopo il caricamento iniziale con il pulsante **Aggiungi altri file** senza perdere la disposizione attuale. +- Gli intervalli di pagine partono da 1, quindi `1` indica la prima pagina di quel file. + +## Strumenti correlati + +- [Dividi PDF](./split-pdf) +- [Duplica e Organizza](./organize-pdf) +- [Alterna e Riordina Pagine](./alternate-merge) +- [Elimina Pagine](./delete-pages) diff --git a/docs/it/tools/mobi-to-pdf.md b/docs/it/tools/mobi-to-pdf.md new file mode 100644 index 00000000..4e7a0d55 --- /dev/null +++ b/docs/it/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI in PDF +description: Converti i file ebook MOBI in PDF direttamente nel browser. Gratis, privato, senza caricamento di file. +--- + +# MOBI in PDF + +Converti gli ebook MOBI di Amazon Kindle in documenti PDF. I file MOBI sono legati ai dispositivi e alle app Kindle, quindi è difficile leggerli altrove. Convertirli in PDF ti dà una versione portabile che puoi aprire su qualsiasi dispositivo o stampare. + +## Formati supportati + +| Formato | Estensione | Note | +| :------ | :--------- | :-------------------------------- | +| MOBI | `.mobi` | Formato ebook Kindle (Mobipocket) | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina uno o più file MOBI. +2. Controlla l'elenco dei file. Rimuovi quelli che non ti servono con l'icona del cestino, oppure usa **Aggiungi altri file** per includere altri ebook. +3. Clicca su **Converti in PDF**. Il motore PyMuPDF analizza la struttura del MOBI e rende ogni pagina come contenuto PDF. +4. Un singolo file viene scaricato come PDF. Se converti più file, ottieni un archivio ZIP chiamato `mobi-converted.zip`. + +## Opzioni + +Non servono impostazioni aggiuntive. La conversione conserva il contenuto testuale, la formattazione e le immagini incorporate del file MOBI originale. + +## Casi d'uso + +- Leggere contenuti acquistati su Kindle su un e-reader non Kindle che supporta solo il PDF +- Stampare capitoli di un ebook per lo studio o le annotazioni offline +- Archiviare la tua libreria personale di ebook in un formato universale +- Condividere estratti con chi non ha l'app Kindle installata + +## Suggerimenti + +- I file MOBI protetti da DRM non possono essere convertiti. Lo strumento funziona solo con file MOBI senza DRM. +- Gli ebook grandi con molte immagini incorporate possono richiedere qualche secondo in più, perché tutto avviene nel browser. + +## Strumenti correlati + +- [EPUB in PDF](./epub-to-pdf) +- [FB2 in PDF](./fb2-to-pdf) +- [CBZ in PDF](./cbz-to-pdf) diff --git a/docs/it/tools/n-up-pdf.md b/docs/it/tools/n-up-pdf.md new file mode 100644 index 00000000..15d3a173 --- /dev/null +++ b/docs/it/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Disponi più pagine PDF su un unico foglio in una griglia per una stampa compatta. +--- + +# N-Up PDF + +Posiziona più pagine su un unico foglio in una disposizione a griglia. Questo riduce il numero di pagine stampate inserendo 2, 4, 6, 8, 9 o 16 pagine per foglio. Lo strumento gestisce scala, posizionamento e configurazione facoltativa del formato di pagina. + +## Come funziona + +1. Carica un file PDF. +2. Seleziona il numero di pagine per foglio (il valore "N"): 2, 4, 6, 8, 9 o 16. +3. Scegli il formato della pagina di output (il predefinito è A4) e l'orientamento. +4. Facoltativamente, configura spaziatura, colore del bordo e colore di sfondo. +5. Clicca sul pulsante di elaborazione. Lo strumento scala ogni pagina e le dispone a mosaico su nuovi fogli. + +## Funzionalità + +- Disposizioni a griglia: 2-up, 4-up, 6-up, 8-up, 9-up e 16-up +- Formato e orientamento della pagina di output configurabili +- Spaziatura facoltativa tra le pagine affiancate +- Impostazioni di colore di sfondo e bordo +- Mantiene le proporzioni delle pagine originali durante il ridimensionamento + +## Opzioni + +| Opzione | Descrizione | +| --------------------- | ----------------------------------------------------------------------------------- | +| **Pagine per foglio** | Numero di pagine originali da inserire in ogni pagina di output (2, 4, 6, 8, 9, 16) | +| **Formato pagina** | Dimensione del foglio di output (A4, Letter, Legal, ecc.) | +| **Orientamento** | Verticale o Orizzontale per il foglio di output | +| **Spaziatura** | Distanza in punti tra le pagine affiancate | +| **Colore di sfondo** | Colore di riempimento dello sfondo del foglio di output | +| **Colore del bordo** | Colore dei bordi attorno a ogni pagina affiancata | + +## Casi d'uso + +- Stampare dispense con 4 diapositive per pagina per risparmiare carta +- Creare fogli di studio con più pagine di riferimento su un solo foglio +- Produrre archivi di documenti compatti da archiviare +- Generare fogli panoramici con miniature di un documento lungo + +## Suggerimenti + +- L'orientamento orizzontale funziona spesso meglio per le disposizioni 2-up, mentre quello verticale è di solito ideale da 4-up in su. +- Aumentare la spaziatura migliora la leggibilità ma riduce l'area disponibile per ogni pagina affiancata. +- Per l'operazione inversa (dividere una pagina in più pagine), vedi [Posterizza PDF](./posterize-pdf). + +## Strumenti correlati + +- [Posterizza PDF](./posterize-pdf) +- [Opuscolo PDF](./pdf-booklet) +- [Combina in Una Pagina](./combine-single-page) diff --git a/docs/it/tools/ocr-pdf.md b/docs/it/tools/ocr-pdf.md new file mode 100644 index 00000000..491f29c4 --- /dev/null +++ b/docs/it/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Rendi ricercabili e copiabili i PDF scansionati con Tesseract OCR, con supporto multilingue e filtro dei caratteri. +--- + +# OCR PDF + +Trasforma i documenti scansionati in PDF ricercabili e copiabili. Lo strumento usa Tesseract OCR per riconoscere il testo nelle immagini e sovrappone un livello di testo invisibile alle pagine originali, preservandone l'aspetto visivo e rendendo il contenuto completamente ricercabile. + +## Come funziona + +1. Carica un PDF scansionato o basato su immagini. +2. Seleziona una o più lingue presenti nel documento dall'elenco delle lingue con ricerca. +3. Facoltativamente, regola le impostazioni avanzate (risoluzione, binarizzazione, whitelist). +4. Clicca su **Avvia OCR** e segui l'avanzamento nella barra di progresso in tempo reale. +5. Al termine, controlla il testo estratto, poi scarica il PDF ricercabile o un semplice file `.txt`. + +## Funzionalità + +- OCR multilingue con selettore di lingua ricercabile +- Il livello di testo invisibile preserva l'aspetto originale del documento +- Barra di progresso e log in tempo reale durante l'elaborazione +- Scarica i risultati come PDF ricercabile o file di testo semplice +- Copia il testo estratto direttamente negli appunti +- Tre livelli di risoluzione per bilanciare velocità e precisione + +## Opzioni + +| Impostazione | Valori | Predefinito | Scopo | +| ---------------------------------- | -------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------- | +| **Risoluzione** | Standard (192 DPI), Alta (288 DPI), Ultra (384 DPI) | Alta | Una risoluzione maggiore migliora la precisione sul testo piccolo ma richiede più tempo | +| **Binarizza immagine** | Sì / No | No | Migliora il contrasto per scansioni pulite convertendo in bianco e nero | +| **Preset whitelist dei caratteri** | Nessuno, Alfanumerico, Numeri + Valuta, Solo lettere, Solo numeri, Fattura, Moduli, Personalizzato | Nessuno | Limita i caratteri riconosciuti per migliorare la precisione su tipi di documento specifici | +| **Whitelist dei caratteri** | Testo libero | Vuoto | Insieme di caratteri manuale quando il preset è impostato su Personalizzato | + +## Casi d'uso + +- Rendere ricercabili contratti e fatture scansionati, così puoi usare Ctrl+F al loro interno +- Estrarre il testo da documenti fotografati o vecchie carte +- Elaborare ricevute con il preset Fattura per catturare con precisione importi e date +- Creare PDF accessibili da scansioni di sole immagini per requisiti di conformità +- Estrarre in blocco il contenuto testuale da libri o manuali scansionati + +## Suggerimenti + +- Seleziona più lingue se il documento contiene testo in lingue miste (ad es. intestazioni in inglese con testo in giapponese). +- Usa l'opzione di binarizzazione per documenti con testo sbiadito o a basso contrasto: può migliorare in modo significativo la precisione del riconoscimento. +- I preset di whitelist Fattura e Moduli riducono drasticamente i falsi positivi sui documenti strutturati ignorando le forme di caratteri irrilevanti. + +## Strumenti correlati + +- [Estrai tabelle PDF](./extract-tables) +- [Unisci PDF](./merge-pdf) +- [Comprimi PDF](./compress-pdf) diff --git a/docs/it/tools/odg-to-pdf.md b/docs/it/tools/odg-to-pdf.md new file mode 100644 index 00000000..18ac4a49 --- /dev/null +++ b/docs/it/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG in PDF +description: Converti i file LibreOffice Draw (ODG) in PDF nel browser. Gratis, senza caricamento, completamente privato. +--- + +# ODG in PDF + +Converti i file OpenDocument Graphics in PDF. ODG è il formato nativo di LibreOffice Draw ed è usato per diagrammi, diagrammi di flusso e illustrazioni vettoriali. Convertire in PDF rende questi disegni facili da condividere, stampare e incorporare in altri documenti. + +## Formati supportati + +| Formato | Estensione | Note | +| :-------------------- | :--------- | :----------------------------------------- | +| OpenDocument Graphics | `.odg` | File di LibreOffice Draw / OpenOffice Draw | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file ODG. Puoi aggiungere più file contemporaneamente. +2. Controlla l'elenco dei file. Rimuovi singole voci con l'icona del cestino, oppure clicca su **Aggiungi altri file** per aggiungere altri disegni. +3. Clicca su **Converti in PDF**. Un motore basato su LibreOffice si carica nel browser e converte ogni file ODG, preservando grafica vettoriale, forme e testo. +4. Un singolo file viene scaricato direttamente come PDF. Più file producono un archivio ZIP chiamato `odg-to-pdf.zip`. + +## Opzioni + +Non sono richieste impostazioni aggiuntive. La conversione preserva le dimensioni originali della pagina, le forme, i connettori e le caselle di testo del sorgente ODG. + +## Casi d'uso + +- Condividere diagrammi di LibreOffice Draw con clienti che non hanno LibreOffice installato +- Stampare diagrammi di flusso e diagrammi di rete creati in Draw +- Includere illustrazioni ODG in una relazione o presentazione come PDF incorporati +- Archiviare disegni tecnici in un formato che resterà leggibile per decenni + +## Suggerimenti + +- Gli elementi vettoriali restano vettoriali nel PDF risultante, quindi il risultato si scala in modo pulito a qualsiasi dimensione di stampa. +- Il motore LibreOffice richiede un momento per inizializzarsi al primo utilizzo. Le conversioni successive nella stessa sessione sono più rapide. + +## Strumenti correlati + +- [ODS in PDF](./ods-to-pdf) +- [ODP in PDF](./odp-to-pdf) +- [VSD in PDF](./vsd-to-pdf) diff --git a/docs/it/tools/odp-to-pdf.md b/docs/it/tools/odp-to-pdf.md new file mode 100644 index 00000000..59188e72 --- /dev/null +++ b/docs/it/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP in PDF +description: Converti le presentazioni LibreOffice Impress (ODP) in PDF nel browser. Gratis, privato, senza caricamento. +--- + +# ODP in PDF + +Converti i file OpenDocument Presentation in PDF. ODP è il formato nativo di LibreOffice Impress ed è un'esportazione standard di Google Slides. Trasformare le presentazioni in PDF permette a chiunque di visualizzarle senza software di presentazione, e le diapositive si stampano in modo pulito. + +## Formati supportati + +| Formato | Estensione | Note | +| :------------------------ | :--------- | :-------------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / esportazione di Google Slides | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file ODP. Puoi selezionare più presentazioni contemporaneamente. +2. Controlla l'elenco dei file. Rimuovi le voci con l'icona del cestino, oppure usa **Aggiungi altri file** per includere altre presentazioni. +3. Clicca su **Converti in PDF**. Il motore basato su LibreOffice elabora ogni presentazione e produce un PDF in cui ogni diapositiva diventa una pagina. +4. Un singolo file viene scaricato come PDF. Più file vengono consegnati in un archivio ZIP chiamato `odp-to-pdf.zip`. + +## Opzioni + +Nessuna impostazione da configurare. Ogni diapositiva viene resa alle sue dimensioni originali, preservando testo, immagini, forme e sfondi. + +## Casi d'uso + +- Distribuire una presentazione al pubblico come dispensa in PDF +- Condividere le esportazioni di Google Slides con chi preferisce il PDF all'ODP +- Archiviare interventi a conferenze e lezioni in un formato di sola lettura +- Stampare presentazioni per workshop in presenza + +## Suggerimenti + +- Le transizioni e le animazioni delle diapositive sono funzioni solo visive che non passano nel PDF, ma tutto il contenuto statico viene reso correttamente. +- Le note del relatore non sono incluse nel PDF. Se ti servono le note, esportale separatamente dal tuo software di presentazione. +- Come gli altri strumenti basati su LibreOffice, il motore si carica al primo utilizzo e resta in cache per la sessione. + +## Strumenti correlati + +- [ODG in PDF](./odg-to-pdf) +- [ODS in PDF](./ods-to-pdf) +- [PUB in PDF](./pub-to-pdf) diff --git a/docs/it/tools/ods-to-pdf.md b/docs/it/tools/ods-to-pdf.md new file mode 100644 index 00000000..765234ca --- /dev/null +++ b/docs/it/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS in PDF +description: Converti i fogli di calcolo LibreOffice Calc (ODS) in PDF nel browser. Gratis, privato, senza registrazione. +--- + +# ODS in PDF + +Converti i file OpenDocument Spreadsheet in PDF. ODS è il formato nativo di LibreOffice Calc e un'esportazione comune di Google Sheets. Questo strumento trasforma i dati, la formattazione e i grafici del tuo foglio di calcolo in un PDF impaginato, pronto da stampare o condividere. + +## Formati supportati + +| Formato | Estensione | Note | +| :----------------------- | :--------- | :----------------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Esportazione da LibreOffice Calc / Google Sheets | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i tuoi file ODS. Sono supportati più file. +2. Controlla l'elenco dei file. Usa l'icona del cestino per rimuovere i file, oppure clicca su **Aggiungi altri file** per ampliare il gruppo. +3. Clicca su **Converti in PDF**. Il motore basato su LibreOffice si carica nel browser e trasforma ogni foglio di calcolo in pagine PDF. +4. Un singolo foglio di calcolo viene scaricato come PDF. Più file vengono raccolti in `ods-to-pdf.zip`. + +## Opzioni + +Non è richiesta alcuna configurazione. Il convertitore applica al PDF il layout di stampa, la formattazione delle celle e la larghezza delle colonne già presenti nel foglio di calcolo. + +## Casi d'uso + +- Condividere un budget o un report di LibreOffice Calc con chi accetta solo PDF +- Stampare un'esportazione di Google Sheets scaricata come ODS +- Archiviare documenti finanziari in un formato non modificabile +- Inviare moduli o fogli presenze in formato ODS come documenti a layout fisso + +## Suggerimenti + +- Se il foglio di calcolo contiene più fogli, tutti vengono inclusi nel PDF. +- I fogli di calcolo molto larghi possono estendersi su più pagine PDF in orizzontale. Se il layout è importante, valuta di regolare la larghezza delle colonne nel file di origine prima di convertire. +- Il motore LibreOffice si inizializza al primo utilizzo. Le conversioni successive nella stessa sessione sono più veloci. + +## Strumenti correlati + +- [ODG in PDF](./odg-to-pdf) +- [ODP in PDF](./odp-to-pdf) +- [XML in PDF](./xml-to-pdf) diff --git a/docs/it/tools/odt-to-pdf.md b/docs/it/tools/odt-to-pdf.md new file mode 100644 index 00000000..dcdcf448 --- /dev/null +++ b/docs/it/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT in PDF +description: Converti i file OpenDocument Text (ODT) in PDF nel browser con un motore basato su LibreOffice. +--- + +# ODT in PDF + +Converti i file OpenDocument Text in PDF. ODT è il formato nativo di LibreOffice Writer, Apache OpenOffice e di altri elaboratori di testo open source. Questo strumento usa un motore LibreOffice che gira nel browser per ottenere conversioni accurate, che mantengono formattazione, tabelle, immagini e stili. + +## Formati supportati + +| Formato | Estensioni | +| :---------------- | :--------- | +| OpenDocument Text | `.odt` | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina uno o più file ODT. +2. Controlla l'elenco dei file. Aggiungi altri file o rimuovi quelli indesiderati. +3. Clicca su **Converti in PDF**. Il motore LibreOffice si inizializza (un indicatore di avanzamento mostra lo stato del caricamento), poi ogni file viene convertito. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono raccolti in `odt-converted.zip`. + +## Opzioni + +Questo strumento non ha configurazioni aggiuntive. La conversione mantiene la formattazione del documento originale il più fedelmente possibile. + +## Output + +| Numero di file | Output | +| :------------- | :---------------------------------------------------------- | +| 1 file | Download di un singolo PDF (ad es. `document.pdf`) | +| 2 o più file | Archivio ZIP (`odt-converted.zip`) con un PDF per ogni file | + +## Casi d'uso + +- Convertire documenti di LibreOffice Writer in PDF da condividere con chi usa Microsoft Office +- Produrre PDF pronti per la stampa da articoli accademici scritti in formato OpenDocument +- Convertire in blocco una cartella di modelli ODT in PDF da distribuire +- Generare PDF da file ODT creati da sistemi automatici di generazione di documenti + +## Suggerimenti + +- Il motore LibreOffice si carica al primo utilizzo e viene memorizzato nella cache per le conversioni successive. Il primo caricamento richiede alcuni secondi, poi le conversioni sono veloci. +- I documenti complessi con oggetti OLE incorporati o font insoliti possono apparire in modo leggermente diverso rispetto a LibreOffice desktop. Prova con un campione prima di convertire in blocco. +- Per i documenti Word (`.doc`, `.docx`), usa invece lo strumento [Word in PDF](./word-to-pdf), che usa lo stesso motore LibreOffice ma accetta direttamente i formati Microsoft. + +## Strumenti correlati + +- [Word in PDF](./word-to-pdf) +- [RTF in PDF](./rtf-to-pdf) +- [Testo in PDF](./txt-to-pdf) diff --git a/docs/it/tools/organize-pdf.md b/docs/it/tools/organize-pdf.md new file mode 100644 index 00000000..85468f3a --- /dev/null +++ b/docs/it/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplica e Organizza +description: Riordina, duplica ed elimina le pagine PDF con miniature trascinabili e un ordine pagine personalizzato. +--- + +# Duplica e Organizza + +Riorganizza, duplica e rimuovi le pagine di un PDF con un'interfaccia visiva a trascinamento. Ogni pagina appare come una miniatura che puoi spostare, clonare o eliminare prima di salvare il risultato come nuovo file. + +## Come funziona + +1. Carica un singolo file PDF. +2. Lo strumento mostra una griglia di miniature con tutte le pagine. +3. Trascina le miniature per riordinare le pagine, clicca sul pulsante verde di duplicazione per clonare una pagina o sul pulsante rosso di eliminazione per rimuoverla. +4. In alternativa, inserisci un ordine di pagine personalizzato nel campo di testo (ad es. `3, 1, 2, 4`) e clicca su **Applica** per riorganizzare tutte le pagine in una volta. +5. Clicca sul pulsante di elaborazione per creare e scaricare il PDF riorganizzato. + +## Funzionalità + +- Riordino delle pagine con trascinamento e transizioni animate +- Pulsanti di duplicazione ed eliminazione per ogni pagina +- Ordine di pagine personalizzato per una disposizione precisa +- Etichette con il numero di pagina che si aggiornano automaticamente dopo ogni modifica +- Impedisce di eliminare l'ultima pagina rimasta + +## Casi d'uso + +- Spostare nella posizione corretta una pagina fuori posto in un report +- Duplicare la pagina di un modulo per avere più copie vuote in un unico file +- Rimuovere pagine di bozza o segnaposto prima di distribuire un documento +- Invertire o rimescolare l'ordine delle pagine per preparare la stampa +- Creare una sequenza di pagine personalizzata senza dover unire di nuovo file separati + +## Suggerimenti + +- Il campo dell'ordine personalizzato richiede i numeri delle pagine originali separati da virgole. Deve includere ogni pagina esattamente una volta: nessuna omissione e nessun duplicato. +- Dopo aver duplicato una pagina, entrambe le copie fanno riferimento allo stesso indice di pagina originale. Puoi riordinare ciascuna copia in modo indipendente. +- Per operazioni in blocco su più file o flussi di lavoro più avanzati, valuta lo [Strumento PDF multifunzione](./pdf-multi-tool). + +## Strumenti correlati + +- [Unisci PDF](./merge-pdf) +- [Elimina Pagine](./delete-pages) +- [Strumento PDF multifunzione](./pdf-multi-tool) +- [Inverti Pagine](./reverse-pages) diff --git a/docs/it/tools/page-dimensions.md b/docs/it/tools/page-dimensions.md new file mode 100644 index 00000000..43f14a5b --- /dev/null +++ b/docs/it/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Dimensioni pagina +description: Analizza dimensioni, orientamento, proporzioni e rotazione delle pagine PDF. Rileva i documenti con pagine di formati diversi ed esporta i dati in CSV. +--- + +# Dimensioni pagina + +Uno strumento diagnostico che legge ogni pagina del tuo PDF e ne riporta le dimensioni esatte, l'orientamento, il nome del formato standard, le proporzioni, l'area e la rotazione. Utile per individuare pagine di formati diversi prima della stampa o per documentare le proprietà di un PDF ricevuto. + +## Come funziona + +1. Carica un file PDF. L'analisi parte automaticamente: non c'è nessun pulsante da premere. +2. Un riquadro di riepilogo mostra il totale delle pagine, il numero di formati di pagina unici e se il documento contiene formati misti. +3. Consulta la tabella completa dei risultati con i dettagli di ogni pagina. +4. Cambia l'unità di misura tra punti, pollici, millimetri o pixel. +5. Clicca su **Esporta in CSV** per salvare i dati. + +## Campi riportati + +| Colonna | Descrizione | +| ---------------- | --------------------------------------------------------- | +| N. pagina | Numero progressivo della pagina | +| Dimensioni | Larghezza x Altezza nell'unità selezionata | +| Formato standard | Nome corrispondente (A4, Letter, ecc.) o "Personalizzato" | +| Orientamento | Verticale o Orizzontale | +| Proporzioni | Rapporto larghezza/altezza in formato decimale | +| Area | Area della pagina nell'unità selezionata al quadrato | +| Rotazione | Rotazione della pagina in gradi | + +## Funzionalità + +- Rilevamento automatico dei formati di carta standard (A3, A4, A5, Letter, Legal, Tabloid e altri) +- Avviso per documenti con formati misti, con il dettaglio dei formati presenti e di quante pagine usano ciascuno +- Conversione tra punti, pollici, millimetri e pixel (a 96 PPI) +- Esportazione in CSV da usare in fogli di calcolo o sistemi di documentazione + +## Casi d'uso + +- Verificare che tutte le pagine siano A4 prima di inviare un documento a una tipografia +- Capire perché un PDF unito viene stampato con margini inattesi su alcune pagine +- Documentare il layout delle pagine di un grande archivio PDF per i record di metadati +- Individuare le pagine ruotate che richiedono una correzione + +## Suggerimenti + +- Se il riepilogo mostra "Formati misti", usa lo strumento Correggi Dimensione Pagina per uniformare prima di stampare. +- Il campo della rotazione aiuta a individuare le pagine che si vedono correttamente ma hanno un attributo di rotazione diverso da zero, cosa che può causare problemi in alcuni flussi di lavoro. + +## Strumenti correlati + +- [Correggi Dimensione Pagina](./fix-page-size): uniforma le pagine dopo aver individuato i formati misti +- [Comprimi PDF](./compress-pdf): ottimizza il PDF dopo aver corretto i problemi delle pagine +- [Ruota PDF](./rotate-pdf): correggi le pagine ruotate diff --git a/docs/it/tools/page-numbers.md b/docs/it/tools/page-numbers.md new file mode 100644 index 00000000..2a7c2e9b --- /dev/null +++ b/docs/it/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Numeri di pagina +description: Aggiungi numeri di pagina personalizzabili in qualsiasi posizione delle pagine PDF, con font, dimensione e colore configurabili. +--- + +# Numeri di pagina + +Aggiungi numeri di pagina visibili a ogni pagina del tuo PDF. Scegli tu posizione, formato, dimensione del carattere e colore: al resto pensa lo strumento. + +## Come funziona + +1. Carica il tuo file PDF. +2. Configura le impostazioni dei numeri di pagina nel pannello delle opzioni che compare. +3. Clicca su **Aggiungi numeri di pagina** per elaborare. +4. Il PDF numerato viene scaricato automaticamente. + +## Opzioni + +- **Posizione**: scegli dove compaiono i numeri di pagina: in basso al centro, in basso a sinistra, in basso a destra, in alto al centro, in alto a sinistra o in alto a destra. +- **Formato**: scegli tra la numerazione semplice (1, 2, 3...) e il formato "pagina X di Y" (1 / 5, 2 / 5...). +- **Dimensione del carattere**: imposta la dimensione del testo del numero di pagina. Il valore predefinito è 12. +- **Colore**: scegli qualsiasi colore per il testo del numero di pagina con il selettore colore. + +## Funzionalità + +- Sei posizioni disponibili, che coprono tutti gli angoli e le posizioni centrali +- Due formati di numerazione: sequenziale semplice o "pagina X di Y" +- Dimensione del carattere personalizzabile da 6 a 72 punti +- Selettore colore completo per il colore del testo +- Gestione automatica dei margini che mantiene i numeri in aree sicure, qualunque sia la dimensione della pagina + +## Casi d'uso + +- Preparare per la stampa documenti che richiedono riferimenti di pagina visibili +- Aggiungere i numeri di pagina a un PDF unito da più file di origine +- Numerare le dispense di una presentazione prima di distribuirle +- Aggiungere una numerazione progressiva a documenti legali o contratti + +## Suggerimenti + +- Il formato "pagina X di Y" è utile per i documenti in cui i lettori devono conoscere la lunghezza totale, come proposte o report. +- Se hai bisogno di stili di numerazione diversi per sezioni diverse (ad esempio numeri romani per le pagine iniziali), usa invece lo strumento [Aggiungi etichette di pagina](./add-page-labels). + +## Strumenti correlati + +- [Aggiungi etichette di pagina](./add-page-labels) +- [Numerazione Bates](./bates-numbering) +- [Intestazione e Piè di Pagina](./header-footer) diff --git a/docs/it/tools/pdf-booklet.md b/docs/it/tools/pdf-booklet.md new file mode 100644 index 00000000..71bb88a2 --- /dev/null +++ b/docs/it/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Opuscolo PDF +description: Riorganizza le pagine PDF nell'ordine da opuscolo (con graffatura a sella) per piegarle e pinzarle in un opuscolo fisico. +--- + +# Opuscolo PDF + +Riorganizza le pagine di un PDF nell'ordine di imposizione da opuscolo. Stampate fronte e retro e piegate a metà, le pagine risulteranno nella sequenza di lettura corretta. È il layout usato per opuscoli con graffatura a sella e zine. + +## Come funziona + +1. Carica un file PDF. +2. Configura le impostazioni dell'opuscolo: dimensione e orientamento della pagina di output. +3. Clicca su **Genera anteprima** per vedere come verranno disposte le pagine su ogni foglio. +4. Controlla l'anteprima, che mostra ogni foglio fisico con l'assegnazione delle pagine di fronte e retro. +5. Clicca su **Scarica** per salvare il PDF con l'imposizione da opuscolo. + +## Funzionalità + +- Riordino automatico delle pagine per la legatura a sella +- Dimensione della pagina di output configurabile +- Anteprima visiva del layout dell'opuscolo prima del download +- Gestisce un numero dispari di pagine inserendo pagine vuote dove serve +- Adatta le pagine di origine alla dimensione del foglio dell'opuscolo + +## Casi d'uso + +- Creare opuscoli o zine stampabili da un normale PDF +- Preparare programmi di conferenze o guide di eventi per la stampa interna +- Realizzare biglietti d'auguri piegati o piccoli cataloghi +- Produrre plaquette o raccolte di poesie da rilegare a mano + +## Suggerimenti + +- Il numero di pagine del PDF di origine dovrebbe idealmente essere un multiplo di 4 per ottenere un opuscolo ordinato. In caso contrario, vengono aggiunte automaticamente pagine vuote per completare l'ultimo foglio. +- Stampa l'output fronte e retro con l'impostazione "capovolgi sul lato corto" della stampante, poi piega tutti i fogli insieme e pinza sul dorso. +- Per disporre più pagine su un foglio senza l'ordine da opuscolo, usa invece [N-Up PDF](./n-up-pdf). + +## Strumenti correlati + +- [N-Up PDF](./n-up-pdf) +- [Ruota PDF](./rotate-pdf) +- [Aggiungi Pagina Vuota](./add-blank-page) diff --git a/docs/it/tools/pdf-layers.md b/docs/it/tools/pdf-layers.md new file mode 100644 index 00000000..7265da89 --- /dev/null +++ b/docs/it/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Livelli PDF (OCG) +description: Visualizza, attiva o disattiva, aggiungi ed elimina i livelli Optional Content Group (OCG) in un documento PDF. +--- + +# Livelli PDF (OCG) + +Gestisci gli Optional Content Group (OCG), comunemente chiamati "livelli", all'interno di un PDF. Puoi attivare o disattivare la visibilità dei livelli, aggiungere nuovi livelli (anche livelli figli annidati), eliminare livelli e salvare il PDF modificato. + +## Come funziona + +1. Carica un file PDF. +2. Clicca sul pulsante di elaborazione per caricare il documento con il motore PyMuPDF. +3. Lo strumento mostra tutti i livelli esistenti con il loro stato di visibilità, lo stato di blocco e la gerarchia di annidamento. +4. Usa le caselle di controllo per mostrare o nascondere i livelli. I livelli bloccati non possono essere attivati o disattivati. +5. Aggiungi nuovi livelli di primo livello digitando un nome e cliccando sul pulsante di aggiunta, oppure aggiungi livelli figli sotto un livello padre esistente. +6. Elimina i livelli che non ti servono più. +7. Clicca su **Salva** per scaricare il PDF modificato con le modifiche ai livelli applicate. + +## Funzionalità + +- Mostra la gerarchia dei livelli con la giusta rientranza per i livelli annidati +- Attiva o disattiva la visibilità dei livelli +- L'indicatore di livello bloccato evita modifiche accidentali +- Aggiungi livelli di primo livello o figli con nomi personalizzati +- Elimina i singoli livelli +- Salva tutte le modifiche in un nuovo file PDF + +## Casi d'uso + +- Attivare o disattivare la visibilità dei livelli di annotazione in disegni architettonici o tecnici +- Aggiungere nuovi livelli di annotazione a un documento di progettazione a più livelli +- Rimuovere i livelli obsoleti da un modello prima di distribuirlo +- Controllare quali livelli esistono in un PDF complesso ricevuto da terzi + +## Suggerimenti + +- Se il PDF non ha livelli, lo strumento mostra uno stato vuoto con l'invito ad aggiungerne uno. Non tutti i PDF usano i livelli OCG: sono più comuni nelle esportazioni CAD e nei file di progettazione. +- I livelli figli sono visivamente rientrati sotto il loro padre. Puoi annidare i livelli a qualsiasi profondità. +- I livelli bloccati sono mostrati con un'icona di lucchetto e le loro caselle di controllo sono disabilitate. Questi blocchi sono impostati dal creatore del PDF. + +## Strumenti correlati + +- [Visualizza Metadati](./view-metadata) +- [Modifica Metadati](./edit-metadata) +- [Duplica e Organizza](./organize-pdf) diff --git a/docs/it/tools/pdf-multi-tool.md b/docs/it/tools/pdf-multi-tool.md new file mode 100644 index 00000000..a8d37b3b --- /dev/null +++ b/docs/it/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Strumento PDF multifunzione +description: Un gestore di pagine tutto in uno per unire, dividere, ruotare, duplicare, eliminare e riordinare le pagine PDF. +--- + +# Strumento PDF multifunzione + +Uno spazio di lavoro unificato per ogni operazione sulle pagine di un PDF. Carica uno o più PDF e lavora con tutte le loro pagine in un'unica griglia visiva. Ruota, riordina, duplica, elimina, inserisci nuovi PDF, aggiungi pagine vuote e dividi il risultato, il tutto senza uscire dallo strumento. + +## Come funziona + +1. Clicca su **Carica PDF** o trascina i file sull'area di caricamento. Sono supportati più file. +2. Tutte le pagine di ogni file caricato compaiono in una griglia scorrevole con le miniature. +3. Usa la barra degli strumenti o i pulsanti di azione di ogni pagina per modificare le pagine. +4. Seleziona le pagine con la casella di controllo su ogni scheda, poi applica le operazioni in blocco. +5. Segna i punti di divisione con l'icona delle forbici per suddividere l'output in file separati. +6. Clicca su **Esporta PDF** per scaricare il risultato finale. Se sono presenti segni di divisione, l'output è uno ZIP con più PDF. + +## Funzionalità + +- **Unisci**: carica più PDF e vengono combinati automaticamente in un unico spazio di lavoro +- **Riordina**: trascina le schede delle pagine per cambiare la sequenza +- **Ruota**: rotazione per pagina o in blocco a passi di 90 gradi (a sinistra o a destra) +- **Duplica**: clona qualsiasi pagina con un clic +- **Elimina**: rimuovi singole pagine o elimina in blocco quelle selezionate +- **Inserisci PDF**: aggiungi un nuovo PDF dopo una pagina specifica +- **Aggiungi pagina vuota**: aggiungi in fondo una pagina A4 vuota +- **Dividi**: posiziona segni di divisione tra le pagine, poi esporta come ZIP di PDF separati +- **Seleziona tutto / Deseleziona tutto**: selezione rapida per le operazioni in blocco +- **Annulla / Ripeti**: cronologia completa di annullamento e ripristino per ogni operazione +- **Scarica selezionate**: esporta solo le pagine selezionate come PDF autonomo +- Ripara automaticamente i PDF danneggiati prima del caricamento + +## Casi d'uso + +- Creare un documento personalizzato con pagine prese da più PDF di origine +- Ripulire un documento scansionato eliminando le pagine vuote, ruotando le scansioni di lato e riordinando le sezioni +- Dividere un PDF di grandi dimensioni ai confini dei capitoli con segni di divisione visivi +- Modificare rapidamente le pagine senza bisogno di un editor PDF completo + +## Suggerimenti + +- Il sistema di annullamento e ripristino tiene traccia di ogni operazione. Usalo liberamente: non puoi distruggere il tuo lavoro per sbaglio. +- I segni di divisione appaiono come linee blu tratteggiate tra le pagine. Posizionali visivamente dove vuoi dividere il documento, poi esporta per ottenere uno ZIP. +- Per semplici operazioni di unione o divisione, gli strumenti dedicati [Unisci PDF](./merge-pdf) o [Dividi PDF](./split-pdf) possono essere più rapidi. Lo strumento multifunzione dà il meglio quando servono più operazioni in una sola sessione. + +## Strumenti correlati + +- [Unisci PDF](./merge-pdf) +- [Dividi PDF](./split-pdf) +- [Duplica e Organizza](./organize-pdf) +- [Ruota PDF](./rotate-pdf) diff --git a/docs/it/tools/pdf-to-bmp.md b/docs/it/tools/pdf-to-bmp.md new file mode 100644 index 00000000..2bd0ed42 --- /dev/null +++ b/docs/it/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF in BMP +description: Converti le pagine PDF in immagini BMP non compresse. Utile per sistemi legacy e flussi di stampa che richiedono input bitmap. +--- + +# PDF in BMP + +Converte ogni pagina di un PDF in un'immagine BMP (Bitmap). BMP è un formato non compresso, quindi l'output è perfetto al pixel e senza perdita di qualità, ma i file sono pesanti. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Clicca su **Converti** per elaborare il file. +3. Un singolo file `.bmp` o un archivio ZIP viene scaricato automaticamente. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Le pagine vengono renderizzate a una scala fissa di 2x, producendo immagini di circa il doppio delle dimensioni native della pagina PDF. + +## Formato di output + +- **Pagina singola**: `filename.bmp` +- **Più pagine**: `filename_bmps.zip` contenente `page_1.bmp`, `page_2.bmp`, ecc. + +## Casi d'uso + +- Passare le pagine PDF a sistemi legacy o hardware che accettano solo input BMP. +- Preparare immagini non compresse per specifici flussi di stampa. +- Usare l'output bitmap come input per strumenti di elaborazione delle immagini che richiedono dati pixel grezzi. + +## Suggerimenti + +- I file BMP sono molto grandi perché memorizzano dati pixel grezzi senza compressione. Per la maggior parte degli usi, [PDF in PNG](./pdf-to-png) offre una qualità senza perdita con file molto più piccoli. +- Se il sistema di destinazione accetta PNG o TIFF, preferisci questi formati per risparmiare spazio su disco. + +## Strumenti correlati + +- [PDF in PNG](./pdf-to-png) +- [PDF in TIFF](./pdf-to-tiff) +- [PDF in JPG](./pdf-to-jpg) diff --git a/docs/it/tools/pdf-to-cbz.md b/docs/it/tools/pdf-to-cbz.md new file mode 100644 index 00000000..e08262cd --- /dev/null +++ b/docs/it/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF in CBZ +description: Converti un PDF in un file CBZ (Comic Book Archive) per lettori di fumetti come Komga, Kavita, CDisplayEx e Calibre. +--- + +# PDF in CBZ + +Converte un PDF in un file CBZ (Comic Book ZIP), il formato standard per fumetti e manga digitali. Ogni pagina del PDF diventa un'immagine all'interno dell'archivio. Lo strumento genera i metadati in tre formati per la massima compatibilità: ComicInfo.xml, metadata.opf e ComicBookInfo JSON. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Scegli formato immagine, qualità, scala ed eventuali metadati. +3. Clicca su **Converti** per generare il file CBZ. +4. Il file `.cbz` viene scaricato automaticamente. + +## Opzioni + +| Opzione | Valori | Predefinito | Descrizione | +| ---------------- | --------------- | ----------- | ----------------------------------------------------------------------------------------------------------- | +| Formato immagine | JPEG, PNG, WebP | JPEG | JPEG per fumetti a colori, PNG per manga in bianco e nero senza perdita, WebP per la migliore compressione. | +| Qualità | 50–100% | 85% | Controlla la compressione JPEG/WebP. Nascosta per PNG (sempre senza perdita). | +| Scala | 1.0x–4.0x | 2.0x | Una scala maggiore produce immagini più nitide per schermi ad alta risoluzione. | +| Scala di grigi | Sì/No | No | Converte le pagine in scala di grigi. Riduce le dimensioni del file per i contenuti in bianco e nero. | +| Modalità manga | Sì/No | No | Imposta nei metadati la direzione di lettura da destra a sinistra. | +| Includi metadati | Sì/No | Sì | Incorpora ComicInfo.xml, metadata.opf e ComicBookInfo JSON. | + +## Campi dei metadati + +Quando i metadati sono attivi, puoi compilare: + +- **Titolo**: rilevato automaticamente dal nome del file PDF. +- **Serie**: il nome della serie (ad es. "Naruto"). +- **Numero (#)**: numero dell'albo all'interno della serie. +- **Volume (Vol.)**: numero del volume. +- **Autore/i**: nome dello scrittore o del creatore. +- **Editore**: casa editrice. +- **Tag / Genere**: tag separati da virgole (ad es. "Azione, Avventura"). +- **Anno di pubblicazione**: anno di pubblicazione (1900–2100). +- **Valutazione**: valutazione della community da 0 a 5. + +## Compatibilità dei metadati + +Lo strumento scrive i metadati in tre formati, così ogni lettore può trovarli: + +| Formato | Posizione | Supportato da | +| ------------------ | -------------------------- | ------------------------------------------- | +| ComicInfo.xml | File all'interno dello ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | File all'interno dello ZIP | Calibre | +| ComicBookInfo JSON | Campo commento dello ZIP | Calibre (alternativa) | + +## Formato di output + +- `filename.cbz`: un archivio ZIP contenente le immagini delle pagine numerate e i file dei metadati. + +Le immagini delle pagine sono nominate con numeri riempiti con zeri (`01.jpg`, `02.jpg`, ecc.) in modo che i lettori le mostrino nell'ordine corretto. + +## Casi d'uso + +- Convertire PDF di manga o fumetti da usare con i lettori di fumetti. +- Creare una libreria di fumetti digitali in Komga, Kavita o Calibre. +- Convertire fumetti scansionati in un formato adatto ai lettori. +- Condividere fumetti in un formato che conserva direzione di lettura e metadati. + +## Suggerimenti + +- Usa **JPEG** per i fumetti a colori e **PNG** per i manga in bianco e nero: PNG comprime in modo molto efficiente i contenuti in bianco e nero. +- Attiva **Scala di grigi** per i manga per ridurre in modo significativo le dimensioni del file. +- Compila i campi **Serie** e **Numero** così i gestori di librerie (Komga, Calibre) possono organizzare automaticamente la tua collezione. +- **WebP** offre la migliore compressione, ma i lettori di fumetti più vecchi potrebbero non supportarlo. + +## Strumenti correlati + +- [PDF in JPG](./pdf-to-jpg) +- [PDF in PNG](./pdf-to-png) +- [PDF in TIFF](./pdf-to-tiff) +- [Estrai immagini](./extract-images) diff --git a/docs/it/tools/pdf-to-csv.md b/docs/it/tools/pdf-to-csv.md new file mode 100644 index 00000000..f991bdb2 --- /dev/null +++ b/docs/it/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF in CSV +description: Estrai le tabelle dai documenti PDF ed esportale in un unico file CSV. Gestisce i PDF multipagina con rilevamento automatico delle tabelle. +--- + +# PDF in CSV + +Estrae le tabelle da un PDF e le esporta come file CSV. Lo strumento analizza ogni pagina alla ricerca di dati tabulari con il motore di rilevamento delle tabelle di PyMuPDF, poi scrive tutte le righe trovate in un unico output separato da virgole. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Clicca su **Converti** per avviare l'estrazione delle tabelle. +3. Lo strumento analizza ogni pagina e identifica automaticamente le tabelle. +4. Viene scaricato un file `.csv` con tutti i dati delle tabelle estratte. + +Le tabelle di pagine diverse sono separate da righe vuote nell'output. Le celle che contengono virgole, virgolette o ritorni a capo vengono correttamente protette secondo la RFC 4180. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Tutte le tabelle trovate nel documento vengono estratte e combinate in un unico CSV. + +## Formato di output + +- Un unico file `filename.csv` contenente tutte le tabelle rilevate. + +## Casi d'uso + +- Portare in un foglio di calcolo i dati finanziari di estratti conto o fatture in PDF. +- Estrarre le tabelle dei prezzi dai preventivi dei fornitori per confrontarli. +- Convertire dati di ricerca tabulari da articoli in PDF in un formato adatto agli strumenti di analisi. +- Migrare in database i dati di vecchi report in PDF. + +## Suggerimenti + +- Se non vengono trovate tabelle, lo strumento mostra il messaggio "Nessuna tabella trovata". Di solito significa che il PDF usa un layout di testo che sembra tabulare ma non è strutturato come una vera tabella. +- Per un controllo maggiore sulle singole tabelle, usa [Estrai tabelle PDF](./extract-tables), che permette di scegliere tra i formati di output CSV, JSON e Markdown. +- Se ti servono i dati in formato Excel con fogli separati per ogni tabella, usa [PDF in Excel](./pdf-to-excel). + +## Strumenti correlati + +- [PDF in Excel](./pdf-to-excel) +- [Estrai tabelle PDF](./extract-tables) +- [PDF in Testo](./pdf-to-text) diff --git a/docs/it/tools/pdf-to-excel.md b/docs/it/tools/pdf-to-excel.md new file mode 100644 index 00000000..2fd8bbd1 --- /dev/null +++ b/docs/it/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF in Excel +description: Estrai le tabelle dai documenti PDF in un foglio di calcolo Excel. Ogni tabella ha il suo foglio di lavoro con i riferimenti alla pagina. +--- + +# PDF in Excel + +Estrae le tabelle da un PDF e le salva come foglio di calcolo Excel (`.xlsx`). Ogni tabella rilevata viene collocata in un foglio di lavoro dedicato, con il numero della tabella e la pagina di origine. Usa PyMuPDF per il rilevamento delle tabelle e la libreria SheetJS per generare il file Excel. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Clicca su **Converti** per avviare l'estrazione delle tabelle. +3. Lo strumento analizza ogni pagina alla ricerca di tabelle, poi costruisce una cartella di lavoro Excel. +4. Viene scaricato un file `.xlsx` con un foglio per ogni tabella. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Tutte le tabelle rilevate vengono estratte automaticamente. + +## Formato di output + +- Un unico file `filename.xlsx`. +- **Una tabella**: un solo foglio di lavoro chiamato "Table". +- **Più tabelle**: fogli di lavoro chiamati "Table 1 (Page 3)", "Table 2 (Page 5)", ecc. I nomi dei fogli vengono troncati a 31 caratteri (il limite di Excel). + +## Casi d'uso + +- Convertire report finanziari in PDF in fogli di calcolo modificabili per ulteriori analisi. +- Estrarre tabelle di inventario o ordini dai PDF dei fornitori. +- Portare in Excel dati strutturati di moduli o cataloghi PDF per ordinarli e filtrarli. +- Archiviare dati tabulari di PDF in un formato con cui possono lavorare anche i colleghi non tecnici. + +## Suggerimenti + +- Se lo strumento segnala "Nessuna tabella trovata", il PDF probabilmente usa un layout di testo libero invece di tabelle strutturate. Prova [PDF in Testo](./pdf-to-text) per ottenere invece il contenuto grezzo. +- Per un formato piatto più semplice, usa [PDF in CSV](./pdf-to-csv). Per scaricare ogni tabella in più formati, usa [Estrai tabelle PDF](./extract-tables). +- Controlla i nomi dei fogli per capire da quale pagina proviene ogni tabella. + +## Strumenti correlati + +- [PDF in CSV](./pdf-to-csv) +- [Estrai tabelle PDF](./extract-tables) +- [PDF in Testo](./pdf-to-text) diff --git a/docs/it/tools/pdf-to-greyscale.md b/docs/it/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..dd270863 --- /dev/null +++ b/docs/it/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF in scala di grigi +description: Converti un PDF a colori in una versione in scala di grigi (bianco e nero). Produce un nuovo PDF con tutti i colori rimossi da ogni pagina. +--- + +# PDF in scala di grigi + +Converte un PDF a colori in una versione in scala di grigi. Ogni pagina viene renderizzata, desaturata e reincorporata come immagine JPEG in un nuovo PDF. L'output mantiene le dimensioni originali delle pagine. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Clicca su **Converti** per elaborare il file. +3. Viene scaricato un nuovo `greyscale.pdf` con tutte le pagine convertite in bianco e nero. + +Dietro le quinte, ogni pagina viene renderizzata a scala 2x, i dati dei pixel passano attraverso un filtro in scala di grigi, poi vengono ricodificati come JPEG al 90% di qualità e inseriti in un nuovo documento PDF. + +## Opzioni + +Questo strumento non ha opzioni configurabili. La conversione in scala di grigi usa una formula di luminanza standard e la qualità JPEG è fissata al 90%. + +## Formato di output + +- Un unico file `greyscale.pdf` contenente tutte le pagine come immagini JPEG in scala di grigi. + +## Casi d'uso + +- Preparare documenti per la stampa in bianco e nero e risparmiare sui costi dell'inchiostro a colori. +- Rispettare i requisiti di invio di pratiche legali o governative che richiedono la scala di grigi. +- Ridurre le dimensioni dei PDF molto colorati (le immagini JPEG in scala di grigi sono più piccole di quelle a colori). +- Creare uno stile visivo coerente in documenti con pagine miste a colori e in bianco e nero. + +## Suggerimenti + +- Poiché ogni pagina viene rasterizzata e reincorporata come JPEG, l'output è basato su immagini. Il testo del PDF originale non sarà più selezionabile né ricercabile. Se in seguito ti serve testo ricercabile, passa l'output nello strumento OCR. +- Per un controllo maggiore sulle regolazioni del colore (luminosità, contrasto, saturazione), guarda lo strumento Regola colori o il nodo Scala di grigi nel [Costruttore di workflow PDF](./pdf-workflow). + +## Strumenti correlati + +- [PDF in JPG](./pdf-to-jpg) +- [PDF in PNG](./pdf-to-png) +- [Costruttore di workflow PDF](./pdf-workflow) diff --git a/docs/it/tools/pdf-to-jpg.md b/docs/it/tools/pdf-to-jpg.md new file mode 100644 index 00000000..f041ac60 --- /dev/null +++ b/docs/it/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF in JPG +description: Converti le pagine PDF in immagini JPG con qualità regolabile. I PDF di una pagina vengono scaricati direttamente, quelli multipagina come ZIP. +--- + +# PDF in JPG + +Converte ogni pagina di un PDF in un'immagine JPG. I documenti di una sola pagina vengono scaricati come singolo file `.jpg`. I PDF multipagina producono un archivio ZIP con un JPG per pagina. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. Lo strumento mostra il nome del file, la dimensione e il numero di pagine. +2. Regola il cursore **Qualità** per controllare la compressione JPG. +3. Clicca su **Converti** per avviare l'elaborazione. +4. Il risultato viene scaricato automaticamente: un singolo JPG per i PDF di una pagina, oppure un file ZIP per i documenti multipagina. + +## Opzioni + +- **Qualità**: un cursore da 0% a 100% (predefinito 90%). Valori più alti producono immagini più nitide con file più grandi. Valori più bassi comprimono in modo più aggressivo. + +Le pagine vengono renderizzate internamente a scala 2x, quindi la risoluzione di output è il doppio delle dimensioni della pagina PDF. Una pagina standard in formato Letter produce un'immagine di circa 1.224 x 1.584 pixel. + +## Formato di output + +- **Pagina singola**: `filename.jpg` +- **Più pagine**: `filename_jpgs.zip` contenente `page_1.jpg`, `page_2.jpg`, ecc. + +## Casi d'uso + +- Generare miniature di anteprima per un sistema di gestione documentale. +- Condividere una pagina di un report in una chat o in un'email che non supporta i PDF. +- Creare risorse grafiche da diagrammi o illustrazioni in PDF. +- Archiviare documenti scansionati come singole immagini. + +## Suggerimenti + +- Per un output senza perdita, usa invece [PDF in PNG](./pdf-to-png). +- Un valore di qualità tra 80 e 90% offre un buon equilibrio tra dimensione del file e fedeltà visiva. +- Se ti serve un formato specifico per ogni pagina, valuta il [Costruttore di workflow PDF](./pdf-workflow), che ha un nodo di output PDF in immagini. + +## Strumenti correlati + +- [PDF in PNG](./pdf-to-png) +- [PDF in WebP](./pdf-to-webp) +- [PDF in BMP](./pdf-to-bmp) +- [PDF in TIFF](./pdf-to-tiff) diff --git a/docs/it/tools/pdf-to-json.md b/docs/it/tools/pdf-to-json.md new file mode 100644 index 00000000..b9ca5378 --- /dev/null +++ b/docs/it/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF in JSON +description: Converti i file PDF in formato JSON strutturato con CPDF. Esporta la struttura interna del PDF come dati JSON leggibili da macchina. +--- + +# PDF in JSON + +Converte uno o più file PDF in formato JSON. Lo strumento usa CPDF (Coherent PDF) per serializzare la struttura interna di ogni PDF in una rappresentazione JSON leggibile da macchina. L'output viene sempre consegnato come archivio ZIP. + +## Come funziona + +1. Seleziona uno o più file PDF con il selettore di file. +2. Clicca su **Converti** per avviare l'elaborazione. La conversione gira in un web worker in background. +3. Viene scaricato un archivio ZIP contenente un file JSON per ogni PDF in ingresso. + +La barra di stato mostra l'avanzamento delle fasi di conversione e di creazione dello ZIP. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Ogni PDF viene convertito nella sua rappresentazione JSON completa. + +## Formato di output + +- Un file `pdfs-to-json.zip` contenente `filename.json` per ogni PDF in ingresso. + +L'output JSON rappresenta la struttura interna degli oggetti del PDF, inclusi alberi delle pagine, riferimenti ai font, metadati e flussi di contenuto. + +## Casi d'uso + +- Ispezionare la struttura interna di un PDF per il debug o la convalida. +- Estrarre in modo programmatico metadati strutturati e proprietà delle pagine. +- Passare i dati sulla struttura del PDF a pipeline di elaborazione personalizzate. +- Verificare la conformità dei documenti PDF analizzando i loro alberi di oggetti. + +## Suggerimenti + +- Questo strumento produce la struttura grezza degli oggetti del PDF, non il testo estratto. Se ti serve il testo delle pagine in formato JSON, usa invece [Prepara PDF per IA](./prepare-pdf-for-ai). +- Per l'estrazione del solo testo, [PDF in Testo](./pdf-to-text) è più diretto. +- I PDF grandi con strutture complesse producono file JSON molto grandi. + +## Strumenti correlati + +- [PDF in Testo](./pdf-to-text) +- [Prepara PDF per IA](./prepare-pdf-for-ai) +- [Estrai tabelle PDF](./extract-tables) diff --git a/docs/it/tools/pdf-to-markdown.md b/docs/it/tools/pdf-to-markdown.md new file mode 100644 index 00000000..64d21ad2 --- /dev/null +++ b/docs/it/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF in Markdown +description: Converti i documenti PDF in formato Markdown con estrazione opzionale delle immagini. Supporta la conversione in blocco di più file. +--- + +# PDF in Markdown + +Converte i file PDF in formato Markdown (`.md`), mantenendo titoli, paragrafi, elenchi e formattazione di base. Può estrarre e includere le immagini incorporate. Supporta la conversione di singoli file e in blocco. Usa PyMuPDF. + +## Come funziona + +1. Carica uno o più PDF cliccando sull'area di rilascio o trascinandovi sopra i file. +2. Se vuoi, attiva **Includi immagini** per incorporare le immagini estratte nell'output Markdown. +3. Clicca su **Converti** per avviare l'elaborazione. +4. Un singolo file viene scaricato come `filename.md`. Più file producono un `markdown-files.zip`. + +## Opzioni + +- **Includi immagini**: se selezionata, le immagini incorporate nel PDF vengono estratte e referenziate nell'output Markdown. Se deselezionata, viene convertito solo il contenuto testuale. + +## Formato di output + +- **File singolo**: `filename.md` +- **Più file**: `markdown-files.zip` contenente un `.md` per ogni PDF in ingresso. + +## Casi d'uso + +- Convertire la documentazione PDF in Markdown per un generatore di siti statici come VitePress, Hugo o Jekyll. +- Trasformare articoli di ricerca in PDF in Markdown modificabile per app di appunti come Obsidian. +- Migrare vecchie basi di conoscenza in PDF in un formato di testo adatto a Git. +- Estrarre contenuti strutturati da ebook in PDF per riformattarli. + +## Suggerimenti + +- L'opzione Includi immagini è utile quando il PDF contiene diagrammi o figure essenziali per il contenuto. Disattivala per i documenti ricchi di testo, per mantenere l'output pulito. +- I layout complessi con barre laterali, note a piè di pagina o testo su più colonne possono produrre un Markdown imperfetto. Controlla e correggi l'output se necessario. +- Per il testo grezzo senza alcuna formattazione, usa invece [PDF in Testo](./pdf-to-text). + +## Strumenti correlati + +- [PDF in Testo](./pdf-to-text) +- [PDF in Word](./pdf-to-word) +- [Prepara PDF per IA](./prepare-pdf-for-ai) diff --git a/docs/it/tools/pdf-to-pdfa.md b/docs/it/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..f65b705b --- /dev/null +++ b/docs/it/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF in PDF/A +description: Converti i PDF standard in formato PDF/A per l'archiviazione a lungo termine. Supporta i livelli di conformità PDF/A-1b, PDF/A-2b e PDF/A-3b. +--- + +# PDF in PDF/A + +PDF/A è un sottoinsieme del PDF standardizzato ISO, pensato per la conservazione digitale a lungo termine. Questo strumento converte i tuoi PDF standard in documenti conformi a PDF/A usando Ghostscript direttamente nel tuo browser. + +## Come funziona + +1. Carica uno o più file PDF. +2. Seleziona una **Versione PDF/A** dal menu a tendina. +3. Se vuoi, attiva **Appiattisci PDF prima** per i file complessi che falliscono con la conversione normale. +4. Clicca su **Converti in PDF/A**. Più file producono un archivio ZIP. + +## Versioni PDF/A + +| Versione | Restrizioni | Ideale per | +| ------------ | --------------------------------------------------- | ----------------------------------------------------------- | +| **PDF/A-1b** | La più rigida. Nessuna trasparenza, nessun livello. | Massima compatibilità con i vecchi sistemi di archiviazione | +| **PDF/A-2b** | Consente trasparenza e JPEG2000. | Archiviazione generica (consigliata) | +| **PDF/A-3b** | Consente allegati incorporati di qualsiasi formato. | Archiviare documenti con i relativi file di dati di origine | + +PDF/A-2b è selezionata per impostazione predefinita e soddisfa la grande maggioranza delle esigenze di archiviazione. + +## Opzione di appiattimento preliminare + +Alcuni PDF contengono elementi che impediscono una conversione pulita in PDF/A: codifiche di font insolite, complesse pile di trasparenze o strutture interne danneggiate. Attivando **Appiattisci PDF prima**, il PDF viene rasterizzato a 300 DPI prima della conversione: questo garantisce la conformità al prezzo di rendere il testo non selezionabile. Usala come soluzione di riserva quando la conversione standard produce errori. + +L'appiattimento preliminare richiede il motore PyMuPDF WASM. + +## Casi d'uso + +- Rispettare i requisiti di archiviazione governativi o legali (molte giurisdizioni impongono PDF/A per gli atti giudiziari) +- Inviare documenti a archivi istituzionali o biblioteche digitali +- Conservare documenti aziendali il cui software originale potrebbe non esistere più tra dieci anni +- Preparare fatture per gli standard di fatturazione elettronica che richiedono PDF/A-3b con allegati XML + +## Suggerimenti + +- Prova prima la conversione senza appiattimento preliminare. Attivalo solo se ottieni un errore. +- PDF/A incorpora tutti i font, quindi i file di output sono spesso più grandi degli originali. +- Convalida l'output con un validatore PDF/A dedicato se il tuo flusso di lavoro richiede una conformità rigorosa. + +## Strumenti correlati + +- [Comprimi PDF](./compress-pdf): riduci le dimensioni del file dopo la conversione +- [Appiattisci PDF](./flatten-pdf): appiattisci i moduli prima di convertire in PDF/A +- [Rimuovi metadati](./remove-metadata): elimina i metadati prima di archiviare diff --git a/docs/it/tools/pdf-to-png.md b/docs/it/tools/pdf-to-png.md new file mode 100644 index 00000000..6397f445 --- /dev/null +++ b/docs/it/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF in PNG +description: Converti le pagine PDF in immagini PNG senza perdita con scala regolabile. Ideale per schermate di alta qualità e sfondi trasparenti. +--- + +# PDF in PNG + +Converte ogni pagina di un PDF in un'immagine PNG. PNG usa una compressione senza perdita, quindi l'output conserva ogni dettaglio della pagina originale. I PDF di una pagina vengono scaricati come file `.png`; i PDF multipagina producono uno ZIP. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Imposta il cursore **Scala** per controllare la risoluzione di output. +3. Clicca su **Converti** per avviare l'elaborazione. +4. Un singolo PNG o un archivio ZIP viene scaricato automaticamente. + +## Opzioni + +- **Scala**: da 1.0x a 3.0x (predefinito 2.0x). A 2.0x, una pagina standard in formato Letter viene renderizzata a circa 1.224 x 1.584 pixel. Valori di scala più alti producono immagini più grandi e nitide, a scapito di dimensione del file e tempo di elaborazione. + +## Formato di output + +- **Pagina singola**: `filename.png` +- **Più pagine**: `filename_pngs.zip` contenente `page_1.png`, `page_2.png`, ecc. + +## Casi d'uso + +- Catturare schermate ad alta fedeltà delle pagine PDF per le presentazioni. +- Estrarre grafici o diagrammi che richiedono bordi nitidi e nessun artefatto di compressione. +- Preparare risorse per il web design a partire da mockup in PDF. +- Creare immagini di pagina senza perdita per la pre-elaborazione OCR. + +## Suggerimenti + +- I file PNG sono molto più grandi dei JPG. Se la dimensione del file conta più della qualità perfetta, usa [PDF in JPG](./pdf-to-jpg) o [PDF in WebP](./pdf-to-webp). +- A scala 1.0x l'output corrisponde alla risoluzione nativa del PDF. Porta a 3.0x per esportazioni di qualità da stampa. + +## Strumenti correlati + +- [PDF in JPG](./pdf-to-jpg) +- [PDF in WebP](./pdf-to-webp) +- [PDF in SVG](./pdf-to-svg) diff --git a/docs/it/tools/pdf-to-svg.md b/docs/it/tools/pdf-to-svg.md new file mode 100644 index 00000000..0b8f6a7b --- /dev/null +++ b/docs/it/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF in SVG +description: Converti le pagine PDF in grafica vettoriale SVG scalabile. Mantiene testo e forme come tracciati vettoriali per una scalabilità infinita. +--- + +# PDF in SVG + +Converte ogni pagina di un PDF in un file SVG (Scalable Vector Graphics). A differenza dei formati raster, SVG conserva tracciati vettoriali, testo e forme, quindi l'output si adatta a qualsiasi dimensione senza pixelazione. Usa PyMuPDF. + +## Come funziona + +1. Carica uno o più PDF cliccando sull'area di rilascio o trascinandovi sopra i file. Puoi aggiungere più file e gestirli singolarmente. +2. Clicca su **Converti** per elaborare tutti i file caricati. +3. Le conversioni di un solo file con una sola pagina vengono scaricate come `.svg` singolo. Tutto il resto viene scaricato come archivio ZIP. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Ogni pagina viene convertita in SVG con l'esportazione vettoriale nativa di PyMuPDF. + +## Formato di output + +- **Un file, una pagina**: `filename.svg` +- **Un file, più pagine**: `filename_svg.zip` contenente `page_1.svg`, `page_2.svg`, ecc. +- **Più file**: `pdf_to_svg.zip` con i file organizzati per nome del documento di origine. + +## Casi d'uso + +- Estrarre diagrammi vettoriali, grafici o illustrazioni da report PDF da usare in pagine web. +- Modificare il contenuto delle pagine PDF in un editor vettoriale come Inkscape o Illustrator. +- Incorporare anteprime di pagina scalabili in applicazioni web responsive. +- Estrarre loghi o grafica da brochure PDF mantenendo i bordi nitidi. + +## Suggerimenti + +- SVG funziona al meglio con i PDF che contengono contenuto vettoriale. I documenti scansionati o i PDF ricchi di immagini producono file SVG grandi con dati raster incorporati. +- Per un output raster di PDF ricchi di immagini, usa invece [PDF in PNG](./pdf-to-png) o [PDF in JPG](./pdf-to-jpg). +- Questo strumento supporta la conversione in blocco: carica più PDF insieme per convertirli tutti in una sola esecuzione. + +## Strumenti correlati + +- [PDF in PNG](./pdf-to-png) +- [PDF in JPG](./pdf-to-jpg) +- [PDF in Markdown](./pdf-to-markdown) diff --git a/docs/it/tools/pdf-to-text.md b/docs/it/tools/pdf-to-text.md new file mode 100644 index 00000000..374d7f54 --- /dev/null +++ b/docs/it/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF in Testo +description: Estrai il testo semplice dai file PDF. Supporta l'estrazione in blocco di più PDF con output in file TXT. +--- + +# PDF in Testo + +Estrae tutto il contenuto testuale dai file PDF e lo salva come semplici file `.txt`. Supporta l'elaborazione in blocco: carica più PDF e ottieni il testo di ciascuno in una sola operazione. Usa PyMuPDF. + +## Come funziona + +1. Carica uno o più PDF cliccando sull'area di rilascio o trascinandovi sopra i file. Gestisci l'elenco dei file con i pulsanti Aggiungi altri e Cancella. +2. Clicca su **Estrai** per avviare l'elaborazione. +3. Un singolo file viene scaricato come `filename.txt`. Più file producono un archivio `pdf-to-text.zip`. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Tutto il testo viene estratto da ogni pagina nell'ordine di lettura. + +## Formato di output + +- **File singolo**: `filename.txt` +- **Più file**: `pdf-to-text.zip` contenente un `.txt` per ogni PDF in ingresso. + +## Casi d'uso + +- Estrarre il testo principale dai report PDF per l'indicizzazione della ricerca full-text. +- Convertire ebook o articoli PDF in testo semplice da leggere su dispositivi e-ink. +- Ricavare il testo da contratti o documenti legali per l'analisi delle parole chiave. +- Eliminare la formattazione dai PDF per ottenere testo pulito per script di elaborazione dati. +- Preparare un corpus di testo da archivi PDF per l'elaborazione del linguaggio naturale. + +## Suggerimenti + +- I PDF scansionati (solo immagine) producono file di testo vuoti perché non c'è alcun livello di testo da estrarre. Passa prima i documenti scansionati attraverso l'OCR. +- L'output mantiene l'ordine di lettura interpretato da PyMuPDF, che in genere procede da sinistra a destra e dall'alto in basso. I layout a più colonne possono produrre testo intercalato. +- Per un output strutturato con titoli e formattazione, prova [PDF in Markdown](./pdf-to-markdown). Per JSON strutturato pronto per l'IA, usa [Prepara PDF per IA](./prepare-pdf-for-ai). + +## Strumenti correlati + +- [PDF in Markdown](./pdf-to-markdown) +- [Prepara PDF per IA](./prepare-pdf-for-ai) +- [PDF in Word](./pdf-to-word) diff --git a/docs/it/tools/pdf-to-tiff.md b/docs/it/tools/pdf-to-tiff.md new file mode 100644 index 00000000..0c470e58 --- /dev/null +++ b/docs/it/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF in TIFF +description: Converti le pagine PDF in immagini TIFF, comunemente usate nei flussi di stampa, fax e archiviazione. Ripiega su PNG se la codifica fallisce. +--- + +# PDF in TIFF + +Converte ogni pagina di un PDF in un'immagine TIFF. TIFF è il formato standard per la produzione di stampa, i sistemi fax e l'archiviazione documentale. Lo strumento usa la compressione PackBits per la codifica TIFF e ripiega su PNG se una pagina non riesce a essere codificata. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Clicca su **Converti** per elaborare il file. +3. Un singolo file TIFF o un archivio ZIP viene scaricato automaticamente. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Le pagine vengono renderizzate a una scala fissa di 2x. + +## Formato di output + +- **Pagina singola**: `filename.tiff` +- **Più pagine**: `filename_tiffs.zip` contenente `page_1.tiff`, `page_2.tiff`, ecc. + +Se la codifica TIFF fallisce per una pagina specifica (per problemi di compressione), quella pagina viene salvata come file `.png`. In tal caso lo ZIP conterrà un mix di file TIFF e PNG. + +## Casi d'uso + +- Inviare documenti a enti governativi o sistemi legali che richiedono il formato TIFF. +- Preparare pagine per la trasmissione fax tramite servizi di fax digitali. +- Archiviare documenti scansionati in un formato senza perdita ampiamente supportato. +- Passare pagine a sistemi aziendali di gestione documentale. + +## Suggerimenti + +- I file TIFF sono grandi. Se ti serve la qualità senza perdita solo per uso web o a schermo, [PDF in PNG](./pdf-to-png) è una scelta migliore. +- Controlla il contenuto dello ZIP se alcune pagine hanno richiesto il ripiego su PNG: potresti volerle convertire separatamente. + +## Strumenti correlati + +- [PDF in PNG](./pdf-to-png) +- [PDF in BMP](./pdf-to-bmp) +- [PDF in JPG](./pdf-to-jpg) diff --git a/docs/it/tools/pdf-to-webp.md b/docs/it/tools/pdf-to-webp.md new file mode 100644 index 00000000..98cb01db --- /dev/null +++ b/docs/it/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF in WebP +description: Converti le pagine PDF in immagini WebP con qualità regolabile. File più piccoli del JPG a parità di qualità visiva. +--- + +# PDF in WebP + +Converte ogni pagina di un PDF in un'immagine WebP. WebP produce in genere file più piccoli del 25-35% rispetto al JPG a parità di qualità percepita, il che lo rende una scelta valida per l'uso sul web. + +## Come funziona + +1. Carica un PDF cliccando sull'area di rilascio o trascinandovi sopra un file. +2. Regola il cursore **Qualità**. +3. Clicca su **Converti** per elaborare il file. +4. Un singolo file `.webp` o un archivio ZIP viene scaricato automaticamente. + +## Opzioni + +- **Qualità**: un cursore da 0% a 100% (predefinito 85%). Controlla il livello di compressione con perdita. Valori più alti conservano più dettagli. + +Le pagine vengono renderizzate internamente a scala 2x, producendo immagini di circa il doppio delle dimensioni native del PDF. + +## Formato di output + +- **Pagina singola**: `filename.webp` +- **Più pagine**: `filename_webps.zip` contenente `page_1.webp`, `page_2.webp`, ecc. + +## Casi d'uso + +- Preparare anteprime di pagina per siti web in cui la banda conta. +- Generare versioni di immagine leggere di volantini o brochure per i social media. +- Convertire in blocco documenti multipagina in un insieme di immagini ottimizzate per il web. + +## Suggerimenti + +- WebP è supportato da tutti i browser moderni. Per la compatibilità con i sistemi più vecchi, ripiega su [PDF in JPG](./pdf-to-jpg). +- Una qualità dell'80-85% di solito è indistinguibile dall'originale a schermo, mantenendo piccole le dimensioni dei file. + +## Strumenti correlati + +- [PDF in JPG](./pdf-to-jpg) +- [PDF in PNG](./pdf-to-png) +- [PDF in BMP](./pdf-to-bmp) diff --git a/docs/it/tools/pdf-to-word.md b/docs/it/tools/pdf-to-word.md new file mode 100644 index 00000000..4cdcfabe --- /dev/null +++ b/docs/it/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF in Word +description: Converti i file PDF in documenti Word (DOCX) modificabili. Supporta la conversione in blocco di più PDF contemporaneamente. +--- + +# PDF in Word + +Converte i file PDF in documenti Word (`.docx`) modificabili. Lo strumento usa PyMuPDF per ricostruire il contenuto del documento, mantenendo testo, formattazione di base e layout. Supporta la conversione di singoli file e in blocco. + +## Come funziona + +1. Carica uno o più PDF cliccando sull'area di rilascio o trascinandovi sopra i file. Puoi aggiungere altri file o rimuovere singoli file dall'elenco. +2. Clicca su **Converti** per avviare l'elaborazione. +3. Un singolo file viene scaricato come `filename.docx`. Più file vengono raccolti in `converted-documents.zip`. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Ogni PDF viene convertito in DOCX con il motore di conversione integrato di PyMuPDF. + +## Formato di output + +- **File singolo**: `filename.docx` +- **Più file**: `converted-documents.zip` contenente un `.docx` per ogni PDF in ingresso. + +## Casi d'uso + +- Modificare il testo di un PDF ricevuto che devi correggere. +- Convertire report PDF archiviati in un formato che i colleghi possono modificare in Microsoft Word o Google Docs. +- Portare in Word il contenuto di contratti o proposte in PDF per le revisioni. +- Migrare vecchia documentazione PDF in un formato modificabile. + +## Suggerimenti + +- I layout complessi con testo su più colonne, moduli incorporati o molta grafica potrebbero non essere convertiti perfettamente. Controlla l'output e correggi la formattazione nel tuo elaboratore di testi. +- I PDF scansionati (solo immagine) producono file DOCX vuoti o quasi. Passali prima attraverso l'OCR per aggiungere un livello di testo. +- La modalità in blocco è efficiente per convertire intere cartelle di PDF: caricali tutti insieme. + +## Strumenti correlati + +- [PDF in Testo](./pdf-to-text) +- [PDF in Markdown](./pdf-to-markdown) +- [Costruttore di workflow PDF](./pdf-workflow) diff --git a/docs/it/tools/pdf-to-zip.md b/docs/it/tools/pdf-to-zip.md new file mode 100644 index 00000000..0d414456 --- /dev/null +++ b/docs/it/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF in ZIP +description: Raccogli più file PDF in un unico archivio ZIP per condividerli e archiviarli facilmente. +--- + +# PDF in ZIP + +Raccogli più file PDF in un unico archivio ZIP. È un semplice strumento di impacchettamento: nessuna conversione, compressione o modifica dei PDF stessi. + +## Come funziona + +1. Carica più file PDF usando l'area di rilascio. +2. Controlla l'elenco dei file. Rimuovi quelli che non vuoi includere. +3. Clicca sul pulsante di elaborazione. +4. Un archivio ZIP contenente tutti i PDF caricati viene scaricato subito. + +## Funzionalità + +- Accetta qualsiasi numero di file PDF +- Rimozione dei singoli file prima di creare l'archivio +- Mantiene i nomi originali dei file all'interno dello ZIP +- Nessuna modifica al contenuto dei PDF: i file vengono impacchettati così come sono +- Mostra nome e dimensione di ogni PDF caricato + +## Casi d'uso + +- Raccogliere un insieme di fatture o ricevute da allegare a un'email +- Impacchettare i deliverable di un progetto (più report PDF) per la consegna +- Creare un unico download per una raccolta di moduli o modelli +- Archiviare un gruppo di documenti in un unico file compresso + +## Suggerimenti + +- Il file ZIP usa i nomi originali dei PDF. Se hai file con lo stesso nome, rinominali prima del caricamento per evitare conflitti. +- Questo strumento non comprime i PDF stessi. Per ridurre le dimensioni dei file, passali prima da Comprimi PDF, poi impacchettali con questo strumento. + +## Strumenti correlati + +- [Unisci PDF](./merge-pdf) +- [Dividi PDF](./split-pdf) +- [Comprimi PDF](./compress-pdf) diff --git a/docs/it/tools/pdf-workflow.md b/docs/it/tools/pdf-workflow.md new file mode 100644 index 00000000..beae0f19 --- /dev/null +++ b/docs/it/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Costruttore di workflow PDF +description: Crea visivamente pipeline di elaborazione PDF personalizzate collegando nodi su una tela. Concatena operazioni come unione, compressione, filigrana ed esportazione. +--- + +# Costruttore di workflow PDF + +Il Costruttore di workflow ti permette di concatenare più operazioni PDF in un'unica pipeline automatizzata. Invece di eseguire gli strumenti uno alla volta, colleghi un grafo visivo di nodi (input, elaborazione, output) ed esegui tutto con un clic. I tuoi file non lasciano mai il browser. + +## Come funziona + +L'interfaccia è divisa in tre pannelli: una **casella dei nodi** a sinistra, la **tela** al centro e un **pannello delle impostazioni** a destra che compare quando selezioni un nodo. + +1. **Aggiungi nodi** cliccandoli nella barra laterale sinistra, oppure trascinandoli direttamente sulla tela. Usa la barra di ricerca in cima alla casella dei nodi per filtrare per nome. +2. **Collega i nodi** trascinando da un socket di output (in basso in un nodo) a un socket di input (in alto in un altro nodo). Le connessioni scorrono dall'alto verso il basso. +3. **Configura le impostazioni** cliccando un nodo per aprire il suo pannello delle impostazioni a destra. Ogni tipo di nodo ha le proprie opzioni (intervalli di pagine, cursori di qualità, password, ecc.). +4. **Esegui il workflow** cliccando sul pulsante **Esegui** nella barra degli strumenti. Il motore esegue i nodi in ordine topologico, elaborandoli uno dopo l'altro. Una barra di stato in basso mostra l'avanzamento. +5. **Scarica i risultati**: il nodo Download finale salva il PDF risultante (o uno ZIP se vengono prodotti più file). + +## Categorie di nodi + +I nodi sono organizzati in sei categorie, ciascuna con un colore sulla tela: + +- **Input** (blu): Input PDF, Immagine di input, Word/Excel/PowerPoint in PDF e oltre 15 altri convertitori di formato che portano i file nella pipeline. +- **Modifica e annotazione** (indaco): Ritaglia, Scala di grigi, Inverti colori, Filigrana, Numeri di pagina, Intestazione e piè di pagina, Effetto scanner, Regola colori, Colore di sfondo, Rimuovi pagine vuote, Rimuovi annotazioni. +- **Organizza e gestisci** (viola): Unisci, Dividi, Estrai pagine, Ruota, Elimina pagine, Inverti, Aggiungi pagina vuota, Dividi pagine, N-Up, Correggi dimensione pagina, Combina in una sola pagina, Opuscolo, Posterizza, Modifica metadati, Indice, OCR. +- **Ottimizza e ripara** (ambra): Comprimi, Rasterizza, Linearizza, Raddrizza, PDF in PDF/A, Font in contorni, Ripara. +- **Proteggi PDF** (rosa): Cripta, Decripta, Sanifica, Appiattisci, Firma digitale, Oscura. +- **Output** (verde acqua): Download (rileva automaticamente PDF singolo o ZIP), PDF in immagini, PDF in testo, PDF in DOCX, PDF in XLSX, PDF in CSV, PDF in SVG, PDF in Markdown, Estrai immagini. + +## Salvare e caricare i workflow + +La barra degli strumenti offre quattro opzioni di persistenza: + +- **Salva**: memorizza il workflow corrente come modello con nome nella memoria locale del browser. Puoi salvare più modelli. +- **Carica**: apre una finestra con l'elenco di tutti i modelli salvati. Clicca su Carica per ripristinarne uno, oppure elimina i modelli che non ti servono più. +- **Esporta**: scarica il workflow come file `.json` per condividerlo o farne un backup. +- **Importa**: carica un file di workflow `.json` dal disco, ripristinando tutti i nodi, le posizioni e le connessioni. + +I modelli persistono tra le sessioni nella memoria locale. I file JSON esportati sono portabili tra browser e computer. + +## Modello di esecuzione + +Il motore costruisce un grafo di dipendenze dalle tue connessioni ed esegue i nodi in ordine topologico. Se un nodo fallisce, l'esecuzione si interrompe e il nodo in errore viene segnato in rosso. Alcune regole da ricordare: + +- Ogni workflow richiede almeno un nodo **Input** e un nodo **Output**. +- Il motore rileva le dipendenze circolari e blocca l'esecuzione con un errore. +- Il nodo **Cripta** deve essere l'ultimo passo di elaborazione prima del nodo di output. Collocarlo prima genera un avviso di convalida, perché i nodi a valle non possono operare su dati cifrati. +- I PDF protetti da password chiedono una password durante l'esecuzione. +- Sono supportati input con più PDF: il nodo Unisci può combinarli, oppure i nodi di elaborazione in blocco elaboreranno ogni PDF singolarmente. + +## Tipi di socket + +Le connessioni usano socket tipizzati per evitare collegamenti non validi: + +- **PDF** (indaco): un singolo documento PDF. +- **MultiPDF** (ambra): più documenti PDF raggruppati insieme. +- **Image** (verde): un blob di immagine. + +## Opzioni + +Ogni nodo ha una propria configurazione accessibile dal pannello delle impostazioni a destra. Gli schemi comuni includono: + +- **Intervalli di pagine** nei nodi Dividi, Estrai pagine, Elimina pagine +- **Cursori di qualità** nei nodi di output per la conversione in immagini +- **Campi password** nei nodi Cripta e Decripta +- **Campi di testo** per Filigrana, Intestazione e piè di pagina, Modifica metadati +- **Angoli di rotazione** nel nodo Ruota +- **Livello di compressione** nel nodo Comprimi +- **Selezione della lingua OCR** nel nodo OCR + +## Casi d'uso + +- **Pipeline di elaborazione fatture**: Input PDF -> OCR -> Estrai tabelle -> Download come CSV. +- **Standardizzazione dei report**: Word in PDF -> Correggi dimensione pagina -> Aggiungi numeri di pagina -> Filigrana -> Comprimi -> Download. +- **Preparazione all'archiviazione**: Input PDF -> Ripara -> Appiattisci -> Sanifica -> PDF in PDF/A -> Download. +- **Estrazione di immagini in blocco**: Input PDF (più file) -> Estrai immagini -> Download ZIP. +- **Opuscoli pronti per la stampa**: Input PDF -> Opuscolo -> Ritaglia -> Comprimi -> Download. +- **Distribuzione sicura**: Input PDF -> Oscura -> Rimuovi annotazioni -> Cripta -> Download. + +## Suggerimenti + +- Usa **Canc** o **Backspace** per rimuovere dalla tela il nodo selezionato. +- Clicca sul pulsante **X** nella barra di stato di un nodo per eliminarlo direttamente. +- Sposta la tela cliccando e trascinando in uno spazio vuoto. Il cursore diventa una mano mentre trascini. +- Su dispositivi mobili, usa il pulsante **+** nella barra degli strumenti per mostrare o nascondere la casella dei nodi. +- Se il tuo workflow produce più file di output, il nodo Download li raccoglie automaticamente in uno ZIP. +- Inizia in modo semplice: crea e prova una pipeline di due nodi prima di aggiungere complessità. + +## Strumenti correlati + +- [PDF in Testo](./pdf-to-text) +- [PDF in Excel](./pdf-to-excel) +- [Estrai immagini](./extract-images) +- [PDF in Markdown](./pdf-to-markdown) diff --git a/docs/it/tools/png-to-pdf.md b/docs/it/tools/png-to-pdf.md new file mode 100644 index 00000000..5f23510b --- /dev/null +++ b/docs/it/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG in PDF +description: Converti una o più immagini PNG in un documento PDF con qualità regolabile, interamente nel tuo browser. +--- + +# PNG in PDF + +Converti le immagini PNG in PDF mantenendo la loro piena risoluzione. Ogni PNG diventa una pagina a sé, delle stesse dimensioni dell'immagine originale. La trasparenza viene gestita automaticamente. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :--------- | +| PNG | `.png` | + +## Come funziona + +1. Clicca sull'area di caricamento o trascina i file PNG. Puoi selezionarne più di uno alla volta. +2. Gestisci l'elenco dei file: rimuovi quelli indesiderati o aggiungine altri. +3. Scegli un livello di **Qualità PDF** dal menu a tendina. +4. Clicca su **Converti in PDF**. L'output viene scaricato come `from_jpgs.pdf`. + +Lo strumento usa pdf-lib per incorporare direttamente ogni immagine. Se un PNG non può essere incorporato in modo nativo (ad es. per un profilo colore insolito), ripiega sul ridisegno tramite canvas come JPEG. + +## Opzioni + +**Qualità PDF** controlla la compressione applicata prima dell'incorporamento: + +- **Alta qualità**: compressione minima, dimensione del file maggiore. +- **Media qualità** (predefinita): buon equilibrio tra dimensione e nitidezza. +- **Bassa qualità**: compressione massima, output più piccolo. + +## Casi d'uso + +- Convertire schermate in un PDF multipagina per segnalazioni di bug o documentazione +- Impacchettare le esportazioni di design dell'interfaccia in un unico file da rivedere +- Trasformare le esportazioni di diagrammi (draw.io, Excalidraw) in un PDF condivisibile +- Assemblare un insieme di immagini di grafici in un report + +## Suggerimenti + +- I file PNG con trasparenza ottengono uno sfondo bianco nel PDF. Se ti serve uno sfondo diverso, modifica prima le immagini. +- Per schermate e diagrammi con bordi netti e testo, l'alta qualità evita gli artefatti di compressione JPEG. La qualità media o bassa può convertire internamente in JPEG. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [JPG in PDF](./jpg-to-pdf) +- [SVG in PDF](./svg-to-pdf) diff --git a/docs/it/tools/posterize-pdf.md b/docs/it/tools/posterize-pdf.md new file mode 100644 index 00000000..202e126f --- /dev/null +++ b/docs/it/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Posterizza PDF +description: Dividi le pagine di un PDF in una griglia di pagine più piccole per la stampa in grande formato su più fogli. +--- + +# Posterizza PDF + +Dividi ogni pagina di un PDF in una griglia di sottopagine più piccole. È lo strumento giusto per stampare una singola pagina su più fogli di carta, da affiancare poi per creare un grande poster o striscione. + +## Come funziona + +1. Carica un file PDF. +2. Imposta il numero di **righe** e **colonne** per definire la griglia (ad es. 2 righe x 2 colonne divide ogni pagina in 4 sottopagine). +3. Se vuoi, specifica un intervallo di pagine per limitare le pagine da posterizzare. +4. L'anteprima mostra una griglia sovrapposta alla pagina corrente, così puoi vedere dove avverranno i tagli. +5. Scorri le pagine per controllare la griglia anche sulle altre. +6. Fai clic sul pulsante di elaborazione. Ogni cella della griglia diventa una pagina a sé nel PDF di output. + +## Funzionalità + +- Numero di righe e colonne configurabile per griglie di qualsiasi dimensione +- Anteprima in tempo reale con griglia sovrapposta che mostra esattamente dove verranno divise le pagine +- Filtro per intervallo di pagine per posterizzare solo alcune pagine +- Navigazione pagina per pagina nell'anteprima +- Istantanee delle pagine in cache per scorrere l'anteprima più velocemente +- Linee rosse tratteggiate che indicano chiaramente i bordi di taglio + +## Opzioni + +| Opzione | Descrizione | +| ------------------------ | ------------------------------------------------ | +| **Righe** | Numero di divisioni orizzontali (predefinito: 1) | +| **Colonne** | Numero di divisioni verticali (predefinito: 1) | +| **Intervallo di pagine** | Pagine da posterizzare (vuoto = tutte le pagine) | + +## Casi d'uso + +- Stampare un PDF in formato poster su normali fogli A4 o Letter da montare a parete +- Creare grandi striscioni a partire da un progetto di una sola pagina +- Dividere in riquadri stampabili disegni tecnici di grandi dimensioni +- Realizzare stampe in grande formato senza una stampante per grandi formati + +## Suggerimenti + +- Una griglia 2x2 trasforma una pagina in 4 pagine. Una griglia 3x3 la trasforma in 9. Scegli la griglia in base alle dimensioni finali che vuoi ottenere. +- L'anteprima con la griglia ti aiuta a verificare che i contenuti importanti non cadano su una linea di taglio. Se serve, modifica righe e colonne. +- Per l'operazione inversa (disporre più pagine su un solo foglio), usa [N-Up PDF](./n-up-pdf). + +## Strumenti correlati + +- [N-Up PDF](./n-up-pdf) +- [Dividi Pagine](./divide-pages) +- [Dividi PDF](./split-pdf) diff --git a/docs/it/tools/powerpoint-to-pdf.md b/docs/it/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..bb0f5faf --- /dev/null +++ b/docs/it/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint in PDF +description: Converti presentazioni PowerPoint (PPT, PPTX) e file ODP in PDF mantenendo la formattazione delle diapositive. +--- + +# PowerPoint in PDF + +Converti file di presentazione in PDF. Ogni diapositiva diventa una pagina del documento di output, con testo, immagini, forme e transizioni elaborati da un motore LibreOffice che gira nel browser. Supporta i formati PowerPoint moderni e legacy, oltre al formato OpenDocument Presentation. + +## Formati supportati + +| Formato | Estensioni | +| :------------------------ | :--------- | +| PowerPoint (moderno) | `.pptx` | +| PowerPoint (legacy) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i file delle presentazioni. +2. Controlla l'elenco dei file. Aggiungine altri o rimuovi quelli che non servono. +3. Fai clic su **Converti in PDF**. Il motore LibreOffice si carica al primo utilizzo, poi converte ogni file. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono raccolti in `powerpoint-converted.zip`. + +## Opzioni + +Questo strumento non ha impostazioni aggiuntive. Le diapositive vengono elaborate nelle loro dimensioni originali. + +## Output + +| Numero di file | Output | +| :------------- | :--------------------------------------------------------------------- | +| 1 file | Download di un singolo PDF (nome file originale con estensione `.pdf`) | +| 2+ file | Archivio ZIP (`powerpoint-converted.zip`) con un PDF per file | + +## Casi d'uso + +- Convertire una presentazione in PDF prima di condividerla con un pubblico che potrebbe non avere PowerPoint +- Creare una versione stampabile di una presentazione come dispensa per una conferenza o un workshop +- Archiviare le presentazioni in un formato che appare identico su ogni dispositivo +- Convertire in blocco una raccolta di presentazioni ODP di LibreOffice Impress in PDF +- Produrre una versione PDF di una presentazione commerciale da allegare a un'email + +## Suggerimenti + +- Animazioni e transizioni delle diapositive non sono rappresentate nel PDF. Ogni diapositiva viene acquisita come pagina statica. +- I video incorporati non compaiono nell'output. Se serve, sostituiscili con uno screenshot o un'immagine segnaposto. +- Le note del relatore non sono incluse nell'esportazione PDF predefinita. Se ti servono, esporta prima dalla vista "Stampa note" di PowerPoint. +- Il motore LibreOffice resta in cache dopo il primo caricamento, quindi convertire una seconda presentazione nella stessa sessione è molto più veloce. + +## Strumenti correlati + +- [Word in PDF](./word-to-pdf) +- [Excel in PDF](./excel-to-pdf) +- [Immagini in PDF](./image-to-pdf) diff --git a/docs/it/tools/prepare-pdf-for-ai.md b/docs/it/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..964bb723 --- /dev/null +++ b/docs/it/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Prepara PDF per IA +description: Estrai il contenuto dei PDF in JSON strutturato, ottimizzato per LLM e pipeline di IA come LlamaIndex. Supporta l'elaborazione in batch. +--- + +# Prepara PDF per IA + +Estrae il contenuto dei file PDF e lo struttura in JSON ottimizzato per l'importazione in modelli linguistici di grandi dimensioni (LLM) e framework di IA come LlamaIndex. Il contenuto di ogni pagina viene estratto e organizzato in un formato strutturato, pronto per pipeline RAG, chatbot o sistemi di ricerca semantica. + +## Come funziona + +1. Carica uno o più PDF facendo clic sull'area di rilascio o trascinandovi i file. +2. Fai clic su **Estrai** per avviare l'elaborazione. +3. Un singolo file viene scaricato come `filename_llm.json`. Più file producono un archivio `pdf-for-ai.zip`. + +Lo strumento usa l'integrazione LlamaIndex di PyMuPDF per estrarre il contenuto a livello di pagina insieme ai metadati, producendo un output che può essere caricato direttamente nei framework di IA. + +## Opzioni + +Questo strumento non ha opzioni configurabili. Tutte le pagine vengono estratte con testo completo e metadati. + +## Formato di output + +- **File singolo**: `filename_llm.json` +- **File multipli**: `pdf-for-ai.zip` con un `_llm.json` per ogni PDF di input. + +L'output JSON segue lo schema dei documenti di LlamaIndex, con il testo di ogni pagina e i campi dei metadati. + +## Casi d'uso + +- Preparare documenti PDF per pipeline di retrieval-augmented generation (RAG). +- Creare una base di conoscenza consultabile da archivi PDF per un chatbot di IA. +- Fornire report PDF a flussi di analisi basati su LLM. +- Pre-elaborare articoli scientifici per sistemi di ricerca semantica e di domande e risposte. +- Creare dati di addestramento strutturati da raccolte di documenti PDF. + +## Suggerimenti + +- Per l'estrazione di solo testo, senza formattazione specifica per l'IA, usa [PDF in Testo](./pdf-to-text). +- Per un output Markdown che conservi titoli e struttura, usa [PDF in Markdown](./pdf-to-markdown). +- I PDF scansionati producono un output vuoto o minimo. Passali prima dall'OCR per aggiungere un livello di testo prima dell'estrazione. + +## Strumenti correlati + +- [PDF in Testo](./pdf-to-text) +- [PDF in Markdown](./pdf-to-markdown) +- [PDF in JSON](./pdf-to-json) diff --git a/docs/it/tools/protect-pdf.md b/docs/it/tools/protect-pdf.md new file mode 100644 index 00000000..4a9bee1e --- /dev/null +++ b/docs/it/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Proteggi PDF +description: Proteggi i file PDF con una password usando la crittografia AES a 256 bit. Imposta password utente e proprietario con restrizioni d'uso configurabili. +--- + +# Proteggi PDF + +Blocca il tuo PDF con una password, così solo le persone autorizzate potranno aprirlo. BentoPDF usa la crittografia AES a 256 bit, lo stesso standard usato da banche e agenzie governative, applicata interamente nel tuo browser tramite QPDF. + +## Come funziona + +1. Carica un file PDF. +2. Inserisci una **Password utente** (obbligatoria). È la password che serve per aprire il file. +3. Se vuoi, inserisci una **Password proprietario**. Se impostata, il PDF ottiene restrizioni d'uso che impediscono di stampare, modificare, copiare e annotare. +4. Fai clic su **Cripta PDF**. +5. Scarica il file criptato. + +## Tipi di password + +### Password utente (obbligatoria) + +La password utente è quella che i destinatari digitano per aprire il PDF. Senza di essa il documento è completamente inaccessibile. Ogni PDF criptato deve averne una. + +### Password proprietario (facoltativa) + +La password proprietario controlla cosa può fare un utente autorizzato dopo aver aperto il file. Quando imposti una password proprietario distinta, BentoPDF applica automaticamente il set di restrizioni più severo: + +- Modifica disabilitata +- Estrazione/copia disabilitata +- Stampa disabilitata +- Annotazione disabilitata +- Compilazione dei moduli disabilitata +- Assemblaggio del documento disabilitato + +Se lasci vuota la password proprietario, il PDF viene criptato (per aprirlo serve comunque la password utente) ma, una volta aperto, non ha restrizioni d'uso. + +## Dettagli sulla crittografia + +- **Algoritmo**: AES-256 (Advanced Encryption Standard a 256 bit) +- **Lunghezza della chiave**: 256 bit +- **Standard**: crittografia PDF 2.0 (implementazione QPDF) + +Con la tecnologia attuale, AES-256 non è violabile con un attacco a forza bruta. La sicurezza del tuo PDF criptato dipende interamente dalla robustezza della password. + +## Casi d'uso + +- Proteggere report finanziari riservati prima di inviarli per email +- Mettere al sicuro documenti legali condivisi con la controparte +- Aggiungere una password a cartelle cliniche o a dati personali identificabili +- Distribuire contenuti a pagamento (e-book, report) con controllo degli accessi +- Rispettare le policy di protezione dei dati che richiedono la crittografia dei dati archiviati + +## Suggerimenti + +- Usa una password forte e univoca. Una passphrase di almeno 12 caratteri con maiuscole, minuscole, numeri e simboli è l'ideale. +- Condividi la password attraverso un canale separato (telefono, messaggio di testo), mai nella stessa email del PDF. +- Se ti serve solo limitare alcune azioni (niente stampa, niente copia) senza richiedere una password per aprire il file, usa invece lo strumento Modifica permessi. + +## Strumenti correlati + +- [Decrittografa PDF](./unlock-pdf): rimuovi la crittografia quando conosci la password +- [Modifica permessi](./change-permissions): modifica restrizioni d'uso specifiche +- [Rimuovi Restrizioni](./remove-restrictions): elimina ogni protezione da un PDF +- [Sanitizza PDF](./sanitize-pdf): rimuovi i contenuti nascosti prima di criptare diff --git a/docs/it/tools/psd-to-pdf.md b/docs/it/tools/psd-to-pdf.md new file mode 100644 index 00000000..b58fff8e --- /dev/null +++ b/docs/it/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD in PDF +description: Converti i file Photoshop (PSD) in PDF nel tuo browser. Gratis, privato, senza bisogno di software Adobe. +--- + +# PSD in PDF + +Converti i file Adobe Photoshop PSD in documenti PDF. PSD è il formato nativo di Photoshop e aprirlo di solito richiede costosi software Adobe. Questo strumento elabora l'immagine composita appiattita del tuo file PSD come pagina PDF a piena risoluzione. + +## Formati supportati + +| Formato | Estensione | Note | +| :-------------- | :--------- | :-------------------------------------- | +| Adobe Photoshop | `.psd` | Elabora l'immagine composita appiattita | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file PSD. Sono supportati più file. +2. Controlla l'elenco dei file. Rimuovi quelli che non vuoi con l'icona del cestino oppure usa **Aggiungi altri file** per includerne altri. +3. Fai clic su **Converti in PDF**. Il motore PyMuPDF legge il file PSD e incorpora l'immagine composita in una pagina PDF alla risoluzione originale. +4. Un singolo PSD produce un PDF. Se carichi più file PSD, vengono uniti in un unico PDF multipagina chiamato `psd_to_pdf.pdf`, in cui ogni PSD diventa una pagina. + +## Opzioni + +Non servono impostazioni. Il convertitore usa i dati immagine appiattiti del file PSD. + +## Casi d'uso + +- Visualizzare in anteprima i progetti Photoshop senza aprire Photoshop +- Inviare bozze di design a clienti che non hanno Adobe Creative Suite +- Stampare illustrazioni ad alta risoluzione da file PSD +- Creare un portfolio PDF da più file di design PSD: ognuno diventa una pagina di un unico documento + +## Suggerimenti + +- La conversione elabora la vista composita (appiattita) del PSD. I singoli livelli, i livelli di regolazione e gli effetti di livello non vengono conservati come elementi separati nel PDF. +- Più file PSD vengono uniti in un unico PDF multipagina anziché in PDF separati. È utile per creare portfolio o lookbook. +- I file PSD ad altissima risoluzione (file di stampa a 300+ DPI) producono PDF di grandi dimensioni. Lo strumento mantiene la risoluzione completa. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [PNG in PDF](./png-to-pdf) +- [VSD in PDF](./vsd-to-pdf) diff --git a/docs/it/tools/pub-to-pdf.md b/docs/it/tools/pub-to-pdf.md new file mode 100644 index 00000000..eb830f72 --- /dev/null +++ b/docs/it/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB in PDF +description: Converti i file Microsoft Publisher (PUB) in PDF nel tuo browser. Gratis, privato, senza bisogno di software. +--- + +# PUB in PDF + +Converti i file Microsoft Publisher in PDF. Publisher è uno strumento di desktop publishing incluso in alcune edizioni di Microsoft Office, ma la maggior parte delle persone non lo ha installato. Questo strumento permette a chiunque di convertire i file PUB in PDF direttamente nel browser, senza software Microsoft. + +## Formati supportati + +| Formato | Estensione | Note | +| :------------------ | :--------- | :------------------------------ | +| Microsoft Publisher | `.pub` | Documenti di desktop publishing | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file PUB. Puoi caricare più file contemporaneamente. +2. Controlla l'elenco dei file. Rimuovi quelli che non vuoi con l'icona del cestino oppure fai clic su **Aggiungi altri file** per aggiungerne altri. +3. Fai clic su **Converti in PDF**. Un motore basato su LibreOffice si carica nel browser e converte ogni file PUB, mantenendo layout, immagini e caselle di testo. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono consegnati in un archivio ZIP chiamato `pub-to-pdf.zip`. + +## Opzioni + +Non serve alcuna configurazione aggiuntiva. Il convertitore gestisce automaticamente il layout PUB. + +## Casi d'uso + +- Aprire un volantino o una newsletter PUB ricevuti da un cliente senza acquistare Microsoft Publisher +- Convertire bollettini parrocchiali, programmi di eventi o newsletter scolastiche creati con Publisher +- Archiviare materiali di marketing creati in Publisher in un formato accessibile a tutti +- Stampare file PUB su un sistema che non ha Publisher installato + +## Suggerimenti + +- I layout complessi di Publisher, con caselle di testo sovrapposte e posizionamento preciso, possono spostarsi leggermente durante la conversione. Controlla l'output se la posizione esatta è importante. +- Il motore LibreOffice si avvia una sola volta per sessione. La prima conversione richiede più tempo, le successive sono più veloci. +- Per una conversione il più fedele possibile dei file Publisher, assicurati che gli eventuali font personalizzati usati nell'originale siano font di sistema standard. + +## Strumenti correlati + +- [VSD in PDF](./vsd-to-pdf) +- [ODP in PDF](./odp-to-pdf) diff --git a/docs/it/tools/rasterize-pdf.md b/docs/it/tools/rasterize-pdf.md new file mode 100644 index 00000000..9bbb1907 --- /dev/null +++ b/docs/it/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasterizza PDF +description: Converti le pagine PDF in un PDF basato su immagini. Appiattisci tutti i livelli, rimuovi il testo selezionabile e controlla DPI e formato immagine. +--- + +# Rasterizza PDF + +La rasterizzazione converte ogni pagina di un PDF in un'immagine e riassembla queste immagini in un PDF. Il risultato appare identico all'originale ma non contiene testo selezionabile, elementi interattivi né livelli modificabili. È di fatto una fotocopia di alta qualità. + +## Come funziona + +1. Carica uno o più file PDF. +2. Imposta i **DPI** (risoluzione) dell'output rasterizzato. +3. Scegli un **Formato immagine**: PNG per una qualità senza perdita o JPEG per file più piccoli. +4. Se vuoi, seleziona **Converti in scala di grigi**. +5. Fai clic su **Rasterizza PDF**. Più file vengono scaricati in un archivio ZIP. + +## Opzioni + +| Impostazione | Valori | Predefinito | +| -------------------- | --------------------------------------- | ----------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Formato immagine** | PNG (senza perdita), JPEG (più leggero) | PNG | +| **Scala di grigi** | Sì/No | No | + +## Indicazioni sui DPI + +- **72**: solo visualizzazione a schermo, dimensione file minima +- **150**: buon equilibrio per l'uso generale +- **200**: testo più nitido, dimensione file moderata +- **300**: output di qualità per la stampa +- **600**: archiviazione di alta qualità o stampa professionale + +## Casi d'uso + +- Impedire l'estrazione del testo da documenti riservati prima di condividerli +- Eliminare i problemi di dipendenza dai font convertendo il testo in pixel +- Creare una versione "piatta" di un PDF con livelli o trasparenze complessi che appare diversa nei vari visualizzatori +- Preparare un PDF per un sistema che accetta solo input basato su immagini +- Eliminare i contenuti nascosti (come le modifiche tracciate o i dati dei moduli) riducendo il PDF a sole immagini + +## Suggerimenti + +- 150 DPI in PNG è un'ottima impostazione predefinita. Aumenta solo se ti serve un output per la stampa o devi ingrandire dettagli sottili. +- JPEG produce file sensibilmente più piccoli ma introduce artefatti di compressione sui bordi nitidi del testo. +- La rasterizzazione è irreversibile: conserva il PDF originale se potresti aver bisogno del testo modificabile in futuro. + +## Strumenti correlati + +- [Comprimi PDF](./compress-pdf): riduci la dimensione del PDF rasterizzato +- [Raddrizza PDF](./deskew-pdf): raddrizza le pagine prima di rasterizzare documenti scansionati +- [Font in Contorni](./font-to-outline): converti i font in tracciati vettoriali se vuoi mantenere la scalabilità +- [Appiattisci PDF](./flatten-pdf): appiattisci i moduli senza convertire in immagini diff --git a/docs/it/tools/remove-annotations.md b/docs/it/tools/remove-annotations.md new file mode 100644 index 00000000..cff5b586 --- /dev/null +++ b/docs/it/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Rimuovi annotazioni +description: Elimina con un clic tutti i commenti, le evidenziazioni, i collegamenti e le altre annotazioni dal tuo PDF. +--- + +# Rimuovi annotazioni + +Ripulisci il tuo PDF rimuovendo tutte le annotazioni: commenti, evidenziazioni, note adesive, markup del testo, collegamenti, timbri e qualsiasi altro oggetto di annotazione incorporato nel documento. Il contenuto sottostante delle pagine (testo, immagini, grafica) resta intatto. + +## Come funziona + +1. Carica il tuo file PDF. +2. Lo strumento rileva il numero di pagine del documento e mostra le informazioni sul file. +3. Fai clic su **Rimuovi Annotazioni** per elaborare. +4. Il PDF ripulito viene scaricato automaticamente senza alcuna annotazione. + +## Funzionalità + +- Rimuove tutti i tipi di annotazione: commenti, evidenziazioni, sottolineature, testo barrato, note adesive, timbri, collegamenti e markup dei moduli +- Agisce su ogni pagina del documento +- Conserva tutti i contenuti che non sono annotazioni (testo, immagini, grafica vettoriale, campi modulo) +- Mostra il numero di pagine e la dimensione del file prima dell'elaborazione + +## Casi d'uso + +- Ripulire un documento prima della distribuzione finale dopo un ciclo di revisione in cui più revisori hanno aggiunto commenti +- Rimuovere evidenziazioni e note adesive da una guida di studio condivisa +- Eliminare le annotazioni di collegamento da un documento prima di archiviarlo +- Preparare una versione "pulita" di un documento legale molto annotato durante la negoziazione +- Rimuovere i commenti dei revisori da un manoscritto prima di mandarlo in stampa + +## Suggerimenti + +- Questo strumento rimuove le annotazioni a livello di struttura del PDF, quindi il risultato mantiene il testo selezionabile e la qualità originale, senza alcuna rasterizzazione. +- Se vuoi rimuovere solo alcune annotazioni e non tutte, usa l'[Editor PDF](./edit-pdf) per eliminare selettivamente le singole annotazioni. +- Le annotazioni nei PDF appiattiti (in cui le annotazioni sono state unite al contenuto della pagina) non possono essere rimosse perché non sono più oggetti separati. + +## Strumenti correlati + +- [Editor PDF](./edit-pdf) +- [Aggiungi Filigrana](./add-watermark) +- [Firma PDF](./sign-pdf) diff --git a/docs/it/tools/remove-blank-pages.md b/docs/it/tools/remove-blank-pages.md new file mode 100644 index 00000000..aabbf57d --- /dev/null +++ b/docs/it/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Rimuovi pagine vuote +description: Rileva e rimuovi automaticamente le pagine vuote o quasi vuote dal tuo PDF con sensibilità regolabile. +--- + +# Rimuovi pagine vuote + +Analizza il tuo PDF alla ricerca di pagine vuote o quasi vuote e rimuovile automaticamente. Lo strumento elabora ogni pagina e ne analizza i pixel per stabilire se è vuota, poi ti permette di confermare quali pagine rimuovere prima dell'elaborazione. + +## Come funziona + +1. Carica il tuo file PDF. +2. Regola il cursore **Sensibilità** per controllare quanto rigorosamente viene definita una pagina "vuota". +3. Fai clic su **Rileva pagine vuote** per analizzare il documento. +4. Lo strumento mostra le miniature delle pagine vuote rilevate, così puoi controllarle. +5. Conferma la selezione e scarica il PDF ripulito senza le pagine vuote. + +## Opzioni + +- **Sensibilità**: un cursore da 0% a 100% (predefinito 80%). Valori più alti sono più rigorosi e segnalano solo le pagine completamente o quasi completamente bianche. Valori più bassi sono più permissivi e individuano anche pagine con contenuto minimo, come un singolo punto o una filigrana tenue. + +## Funzionalità + +- Analisi a livello di pixel di ogni pagina per rilevare i contenuti vuoti +- Cursore di sensibilità regolabile per affinare il rilevamento +- Anteprima a miniature delle pagine vuote rilevate per la verifica manuale +- Conserva esattamente tutte le pagine non vuote +- Gestisce documenti di qualsiasi dimensione o numero di pagine +- Indicazione dell'avanzamento durante l'analisi + +## Casi d'uso + +- Ripulire documenti scansionati in cui lo scanner ha acquisito i retri vuoti di originali stampati su un solo lato +- Rimuovere le pagine separatrici da lotti di documenti scansionati in blocco +- Eliminare le pagine vuote inserite dai sistemi di gestione documentale +- Ripulire PDF esportati da elaboratori di testi che a volte includono pagine vuote finali +- Ridurre la dimensione del file eliminando pagine vuote inutili + +## Suggerimenti + +- Parti dalla sensibilità predefinita dell'80% e regola da lì. Se lo strumento non rileva pagine che a te sembrano vuote, abbassa la sensibilità. Se segnala pagine con un contenuto leggero che vuoi mantenere, alzala. +- Lo strumento elabora ogni pagina per analizzarne il contenuto, quindi il tempo di elaborazione cresce con il numero di pagine. Per documenti molto grandi, mettiti in conto una breve attesa. +- Controlla le pagine vuote rilevate nell'anteprima a miniature prima di confermare la rimozione. Le pagine con intestazioni, piè di pagina o filigrane tenui potrebbero essere segnalate a seconda della sensibilità impostata. + +## Strumenti correlati + +- [Ritaglia PDF](./crop-pdf) +- [Editor PDF](./edit-pdf) +- [Numeri di Pagina](./page-numbers) diff --git a/docs/it/tools/remove-metadata.md b/docs/it/tools/remove-metadata.md new file mode 100644 index 00000000..d8c245f5 --- /dev/null +++ b/docs/it/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Rimuovi metadati +description: Elimina tutti i metadati nascosti dai file PDF, tra cui autore, titolo, data di creazione, produttore, dati XMP e ID del documento. +--- + +# Rimuovi metadati + +Ogni PDF contiene metadati che possono rivelare chi lo ha creato, quale software è stato usato, quando è stato modificato l'ultima volta e altro ancora. Questo strumento li elimina tutti: il dizionario info, i flussi di metadati XMP, gli ID del documento e i dati specifici delle applicazioni, lasciando un documento pulito, senza alcuna traccia della sua origine. + +## Come funziona + +1. Carica un file PDF. +2. Fai clic su **Rimuovi metadati**. +3. Scarica il file ripulito. + +Nessuna opzione da configurare. Lo strumento è accurato per scelta: cancella tutto. + +## Cosa viene rimosso + +- **Campi del dizionario info**: Titolo, Autore, Oggetto, Parole chiave, Creatore, Produttore, data di creazione, data di modifica +- **Flusso di metadati XMP**: il blocco di metadati basato su XML memorizzato nel catalogo del documento +- **ID del documento**: identificatori univoci nel trailer del PDF che possono servire a tracciare un documento tra sistemi diversi +- **PieceInfo**: metadati specifici delle applicazioni aggiunti da programmi come Illustrator o InDesign + +## Cosa resta + +- Tutto il contenuto visibile delle pagine (testo, immagini, grafica) +- Campi modulo e annotazioni +- Segnalibri e collegamenti +- La struttura del documento stesso + +## Casi d'uso + +- Rimuovere il tuo nome e la tua organizzazione da un documento prima di pubblicarlo in forma anonima +- Eliminare i timestamp di creazione che rivelano quando è stato preparato un documento +- Ripulire le stringhe del produttore che identificano il software PDF che usi +- Preparare documenti per invii normativi che richiedono PDF privi di metadati +- Rimuovere le tracce della cronologia delle modifiche prima di condividere un documento all'esterno + +## Suggerimenti + +- Usa prima lo strumento Visualizza Metadati per vedere esattamente quali metadati contiene il tuo PDF prima di eliminarli. +- Se devi rimuovere i metadati _e_ anche JavaScript, annotazioni e file incorporati, usa Sanitizza PDF per una pulizia più completa. +- La rimozione dei metadati è permanente. Conserva l'originale se potresti aver bisogno di quei dati in futuro. + +## Strumenti correlati + +- [Sanitizza PDF](./sanitize-pdf): rimuovi i metadati insieme a script, allegati e altro +- [Cripta PDF](./protect-pdf): proteggi con una password il PDF ripulito +- [Comprimi PDF](./compress-pdf): rimuovere i metadati può ridurre leggermente la dimensione del file, comprimi per risparmiare di più diff --git a/docs/it/tools/remove-restrictions.md b/docs/it/tools/remove-restrictions.md new file mode 100644 index 00000000..e7696e01 --- /dev/null +++ b/docs/it/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Rimuovi restrizioni +description: Rimuovi la protezione con password, le restrizioni di stampa, i blocchi di modifica e i limiti di copia dai file PDF. +--- + +# Rimuovi restrizioni + +I PDF possono avere due tipi di password: una password utente (necessaria per aprire il file) e una password proprietario (controlla cosa puoi farci). Questo strumento elimina entrambe, insieme a tutte le restrizioni associate: blocchi di stampa, modifica, copia e annotazione. + +## Come funziona + +1. Carica un file PDF. +2. Se il PDF ha una password proprietario, inseriscila nel campo **Password proprietario**. Lascialo vuoto se il PDF ha solo restrizioni d'uso senza password. +3. Fai clic su **Rimuovi Restrizioni**. +4. Scarica il PDF senza restrizioni. + +Lo strumento usa i flag `--decrypt` e `--remove-restrictions` di QPDF per produrre una copia pulita e senza restrizioni. + +## Cosa viene rimosso + +- Protezione con password (sia utente che proprietario) +- Restrizioni di stampa +- Restrizioni di modifica +- Restrizioni di copia di testo e immagini +- Restrizioni di annotazione e commento +- Tutte le altre limitazioni di sicurezza codificate nel PDF + +## Casi d'uso + +- Sbloccare un PDF di tua proprietà di cui hai impostato la password anni fa +- Rimuovere le restrizioni di stampa da un documento a cui hai legittimamente accesso +- Abilitare il copia e incolla su materiali di consultazione per prendere appunti +- Preparare PDF per strumenti di accessibilità che non gestiscono i documenti con restrizioni + +## Suggerimenti + +- Se ne è impostata una, devi conoscere la password proprietario. Questo strumento non decifra né forza le password. +- Se vuoi mantenere il file criptato ma cambiare alcuni permessi, usa invece lo strumento Modifica permessi. +- Il file di output non ha alcuna crittografia: chiunque lo riceva può aprirlo liberamente. + +## Strumenti correlati + +- [Decrittografa PDF](./unlock-pdf): sblocca un PDF quando conosci la password utente +- [Cripta PDF](./protect-pdf): applica di nuovo la crittografia con nuove impostazioni +- [Modifica permessi](./change-permissions): modifica in modo selettivo le azioni consentite diff --git a/docs/it/tools/repair-pdf.md b/docs/it/tools/repair-pdf.md new file mode 100644 index 00000000..45e534f1 --- /dev/null +++ b/docs/it/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Ripara PDF +description: Recupera i dati da file PDF corrotti o danneggiati con il motore di riparazione di QPDF. Supporta l'elaborazione in batch. +--- + +# Ripara PDF + +Quando un PDF non si apre, mostra contenuti illeggibili o genera errori nel tuo visualizzatore, questo strumento tenta di ricostruirne la struttura interna. Usa il motore di riparazione di QPDF, in grado di recuperare i dati da molti tipi di corruzione: tabelle di riferimenti incrociati danneggiate, stream troncati, riferimenti a oggetti non validi e altro ancora. + +## Come funziona + +1. Carica uno o più file PDF danneggiati. +2. Fai clic su **Ripara PDF**. +3. Un singolo file riparato viene scaricato direttamente. Più file producono un archivio ZIP. + +Lo strumento fa passare ogni file da QPDF con il flag `--decrypt`, che costringe QPDF a leggere e riscrivere l'intera struttura del PDF, correggendo lungo il percorso i problemi recuperabili. + +## Funzionalità + +- Riparazione in batch di più PDF in una sola operazione +- Rilevamento automatico dei file recuperabili e di quelli irrecuperabili +- Report di successo/errore per ogni file quando ne elabori più di uno +- Usa QPDF (WebAssembly), una libreria di trasformazione PDF collaudata + +## Cosa può correggere + +- Tabelle di riferimenti incrociati danneggiate o mancanti +- Finali di file troncati da download incompleti +- Numerazione degli oggetti e lunghezze degli stream non valide +- Piccole incoerenze strutturali dovute a generatori PDF difettosi +- Artefatti di crittografia dovuti a tentativi di decrittografia falliti + +## Cosa non può correggere + +- File gravemente troncati in cui manca la maggior parte dei dati +- PDF criptati con una password che non hai +- File che in realtà non sono PDF (estensione sbagliata) +- Corruzione delle immagini all'interno del PDF (la struttura viene corretta, ma i dati dei pixel non vengono rigenerati) + +## Casi d'uso + +- Recuperare un PDF da un download via email non riuscito +- Aprire file prodotti da generatori PDF datati o non standard +- Correggere PDF che funzionano in un visualizzatore ma non in un altro +- Preparare documenti d'archivio danneggiati per la conservazione a lungo termine + +## Suggerimenti + +- Se la riparazione fallisce, prova prima ad aprire il file in un browser: i browser hanno una propria logica di recupero e potrebbero mostrare abbastanza contenuto da poterlo salvare di nuovo. +- Per i PDF criptati che non si riescono a riparare, prova prima Decrittografa PDF, poi ripara l'output decrittografato. + +## Strumenti correlati + +- [Comprimi PDF](./compress-pdf): pulisci ulteriormente la struttura del PDF riparato +- [Linearizza PDF](./linearize-pdf): ottimizza il file riparato per la distribuzione sul web +- [Appiattisci PDF](./flatten-pdf): appiattisci i moduli che potrebbero essere stati danneggiati diff --git a/docs/it/tools/reverse-pages.md b/docs/it/tools/reverse-pages.md new file mode 100644 index 00000000..21808f13 --- /dev/null +++ b/docs/it/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Inverti pagine +description: Inverti l'ordine delle pagine di uno o più file PDF in modo che l'ultima pagina diventi la prima. +--- + +# Inverti pagine + +Inverti l'ordine delle pagine di un PDF in modo che l'ultima pagina diventi la prima, la penultima diventi la seconda e così via. Supporta l'elaborazione in batch di più file contemporaneamente. + +## Come funziona + +1. Carica uno o più file PDF. +2. Fai clic sul pulsante di elaborazione. +3. Ogni file viene invertito in modo indipendente. Se hai caricato più file, l'output è un archivio ZIP con tutti i PDF invertiti. +4. Un singolo file viene scaricato direttamente come PDF invertito. + +## Funzionalità + +- Elaborazione in batch: inverti più PDF in una sola operazione +- Output di un singolo file per un PDF, ZIP per più file +- Pulsanti per rimuovere i singoli file prima dell'elaborazione +- Conserva tutto il contenuto e la formattazione delle pagine + +## Casi d'uso + +- Correggere un documento scansionato in ordine inverso +- Preparare un PDF di presentazione da leggere dall'ultima alla prima pagina +- Invertire l'ordine delle pagine per flussi di stampa che alimentano le pagine al contrario +- Correggere un documento le cui pagine sono state assemblate per errore al contrario + +## Suggerimenti + +- Ogni file di un batch viene invertito in modo indipendente: i file stessi non vengono riordinati tra loro. +- Per un riordino delle pagine più preciso (non solo un'inversione completa), usa [Duplica e Organizza](./organize-pdf). + +## Strumenti correlati + +- [Duplica e Organizza](./organize-pdf) +- [Ruota PDF](./rotate-pdf) +- [Strumento PDF multifunzione](./pdf-multi-tool) diff --git a/docs/it/tools/rotate-custom.md b/docs/it/tools/rotate-custom.md new file mode 100644 index 00000000..bb05363c --- /dev/null +++ b/docs/it/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Ruota di gradi personalizzati +description: Ruota le pagine PDF di qualsiasi angolo, con campi per i gradi di ogni pagina e controlli di rotazione in blocco. +--- + +# Ruota di gradi personalizzati + +Ruota le pagine PDF di un angolo qualsiasi, non solo a multipli di 90 gradi. Ogni pagina ha il proprio campo per l'angolo e puoi applicare un unico angolo a tutte le pagine in una volta con il controllo in blocco. + +## Come funziona + +1. Carica un file PDF. Vengono generate le miniature di tutte le pagine. +2. Ogni pagina ha un campo numerico che mostra l'angolo di rotazione attuale. +3. Digita un valore in gradi (positivo o negativo) per ruotare una pagina specifica, oppure usa i pulsanti sinistra/destra di ogni pagina per regolazioni rapide di 90 gradi. +4. Usa il campo **angolo in blocco** in alto per impostare una rotazione uniforme su tutte le pagine. +5. Fai clic sul pulsante di elaborazione per generare il PDF ruotato. + +## Funzionalità + +- Inserimento libero dei gradi per ogni pagina (qualsiasi valore intero) +- Controllo dell'angolo in blocco per impostare la stessa rotazione su ogni pagina +- Anteprima della rotazione in tempo reale nelle miniature +- Pulsanti di rotazione rapida per ogni pagina a passi di 90 gradi +- Miniature caricate in modo differito per prestazioni migliori sui documenti grandi + +## Casi d'uso + +- Correggere di qualche grado scansioni leggermente inclinate +- Ruotare le pagine per rispettare un requisito di orientamento non standard +- Applicare rotazioni precise a singole pagine in un documento con contenuti misti +- Rifinire gli angoli delle pagine dopo una prima rotazione in blocco + +## Suggerimenti + +- I valori positivi ruotano in senso orario, quelli negativi in senso antiorario. +- Il campo dell'angolo in blocco sovrascrive tutti gli angoli delle singole pagine quando viene applicato. Se serve, imposta le regolazioni singole dopo l'operazione in blocco. +- Per le rotazioni standard di 90/180/270 gradi con un'interfaccia più semplice, usa [Ruota PDF](./rotate-pdf). + +## Strumenti correlati + +- [Ruota PDF](./rotate-pdf) +- [Strumento PDF multifunzione](./pdf-multi-tool) +- [Duplica e Organizza](./organize-pdf) diff --git a/docs/it/tools/rotate-pdf.md b/docs/it/tools/rotate-pdf.md new file mode 100644 index 00000000..3a21a198 --- /dev/null +++ b/docs/it/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Ruota PDF +description: Ruota singole pagine o tutte le pagine di un PDF a passi di 90 gradi con un'interfaccia visiva a miniature. +--- + +# Ruota PDF + +Ruota le pagine di un PDF di 90 gradi in senso orario o antiorario. Lo strumento mostra le anteprime di ogni pagina e ti permette di ruotarle singolarmente oppure di applicare una rotazione in blocco a tutto il documento. + +## Come funziona + +1. Carica un file PDF. Le miniature di tutte le pagine vengono mostrate in una griglia. +2. Usa i pulsanti di rotazione sinistra/destra sotto la miniatura di ogni pagina per ruotare quella pagina. +3. Usa i controlli di rotazione in blocco in alto per ruotare tutte le pagine insieme. +4. L'anteprima delle miniature si aggiorna in tempo reale per mostrare la rotazione. +5. Fai clic sul pulsante di elaborazione per salvare il PDF ruotato. + +## Funzionalità + +- Rotazione per ogni pagina a passi di 90 gradi (a sinistra o a destra) +- Rotazione in blocco di tutte le pagine contemporaneamente +- Anteprima delle miniature in tempo reale con transizioni di rotazione animate +- Miniature caricate in modo differito per prestazioni fluide sui documenti grandi +- Conserva il contenuto e la qualità originali delle pagine + +## Casi d'uso + +- Correggere pagine scansionate di lato o capovolte +- Ruotare le pagine orizzontali in verticale (o viceversa) +- Correggere un documento con orientamenti misti in cui alcune pagine sono state scansionate con l'angolo sbagliato +- Preparare un documento per uno specifico orientamento di visualizzazione + +## Suggerimenti + +- Le rotazioni sono cumulative. Fare clic due volte sul pulsante orario applica una rotazione di 180 gradi. +- Per rotazioni diverse da 90 gradi (ad es. 45 gradi per correggere una scansione leggermente inclinata), usa invece [Ruota di Gradi Personalizzati](./rotate-custom). +- I controlli di rotazione in blocco agiscono su tutte le pagine, non solo su quelle selezionate. In questo strumento non esiste la selezione: per quella, usa lo [Strumento PDF multifunzione](./pdf-multi-tool). + +## Strumenti correlati + +- [Ruota di Gradi Personalizzati](./rotate-custom) +- [Strumento PDF multifunzione](./pdf-multi-tool) +- [Duplica e Organizza](./organize-pdf) diff --git a/docs/it/tools/rtf-to-pdf.md b/docs/it/tools/rtf-to-pdf.md new file mode 100644 index 00000000..0419e9bb --- /dev/null +++ b/docs/it/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF in PDF +description: Converti i file Rich Text Format (RTF) in PDF nel tuo browser con un motore basato su LibreOffice. +--- + +# RTF in PDF + +Converti i documenti Rich Text Format in PDF. RTF è un formato di documento multipiattaforma supportato praticamente da ogni elaboratore di testi. Questo strumento usa un motore LibreOffice nel browser per elaborare i file RTF mantenendo la formattazione: grassetto, corsivo, tabelle e immagini incorporate vengono tutti riportati nel PDF. + +## Formati supportati + +| Formato | Estensioni | Tipi MIME | +| :------ | :--------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina uno o più file RTF. +2. Controlla l'elenco dei file. Aggiungine altri o rimuovi quelli che non servono. +3. Fai clic su **Converti in PDF**. Il motore LibreOffice si avvia al primo utilizzo, poi elabora ogni file. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono consegnati come `rtf-converted.zip`. + +## Opzioni + +Questo strumento non ha impostazioni aggiuntive. La conversione conserva la formattazione RTF originale. + +## Output + +| Numero di file | Output | +| :------------- | :----------------------------------------------------- | +| 1 file | Download di un singolo PDF (ad es. `letter.pdf`) | +| 2+ file | Archivio ZIP (`rtf-converted.zip`) con un PDF per file | + +## Casi d'uso + +- Convertire in PDF moderni i documenti RTF di vecchi elaboratori di testi +- Trasformare modelli di email RTF in anteprime PDF +- Elaborare l'output RTF di sistemi software legali o medici +- Convertire in blocco file RTF di un sistema di gestione documentale in PDF per l'archiviazione + +## Suggerimenti + +- Il motore LibreOffice viene caricato una sola volta e messo in cache. La prima conversione di una sessione richiede qualche secondo in più, le successive sono più veloci. +- I file RTF con oggetti OLE incorporati potrebbero non mostrare perfettamente tutti gli oggetti. Testo semplice, immagini e formattazione standard vengono convertiti in modo affidabile. +- Se i tuoi file RTF sono stati creati con Microsoft Word, puoi convertirli direttamente anche con lo strumento [Word in PDF](./word-to-pdf), che accetta RTF oltre a DOC e DOCX. + +## Strumenti correlati + +- [Word in PDF](./word-to-pdf) +- [ODT in PDF](./odt-to-pdf) +- [Testo in PDF](./txt-to-pdf) diff --git a/docs/it/tools/sanitize-pdf.md b/docs/it/tools/sanitize-pdf.md new file mode 100644 index 00000000..2d388230 --- /dev/null +++ b/docs/it/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Sanitizza PDF +description: Rimuovi dai PDF i contenuti nascosti e potenzialmente pericolosi, tra cui metadati, JavaScript, file incorporati, annotazioni e livelli. +--- + +# Sanitizza PDF + +I PDF possono contenere molto più di ciò che vedi sullo schermo. Metadati nascosti, JavaScript incorporato, allegati, dati dei moduli e informazioni sui livelli possono far trapelare dati sensibili o rappresentare rischi per la sicurezza. La sanitizzazione elimina tutto questo e ti lascia un documento pulito, sicuro da condividere pubblicamente. + +## Come funziona + +1. Carica un file PDF. +2. Seleziona dall'elenco gli elementi da rimuovere. +3. Fai clic su **Sanitizza PDF**. +4. Scarica il file ripulito. + +## Opzioni di sanitizzazione + +Tutte le opzioni sono attive per impostazione predefinita. Deseleziona quelle che vuoi conservare. + +| Opzione | Cosa rimuove | +| ---------------------------------- | ------------------------------------------------------------------------------- | +| **Appiattisci moduli** | Converte i campi modulo interattivi in contenuto statico | +| **Rimuovi metadati** | Elimina autore, titolo, data di creazione, informazioni sul software e dati XMP | +| **Rimuovi annotazioni** | Elimina commenti, evidenziazioni, note adesive e markup | +| **Rimuovi JavaScript** | Elimina gli script incorporati che potrebbero essere eseguiti all'apertura | +| **Rimuovi file incorporati** | Elimina gli allegati incorporati nel PDF | +| **Rimuovi livelli (OCG)** | Appiattisce i gruppi di contenuto opzionale in un unico livello | +| **Rimuovi collegamenti** | Elimina i collegamenti ipertestuali e i riferimenti a URL | +| **Rimuovi albero della struttura** | Rimuove la struttura del documento usata per i tag di accessibilità | +| **Rimuovi MarkInfo** | Elimina le informazioni sul contenuto contrassegnato | +| **Rimuovi font** | Rimuove i dati dei font incorporati (da usare con cautela) | + +## Casi d'uso + +- Preparare un PDF per la pubblicazione eliminando i metadati interni (nomi degli autori, versioni del software, cronologia delle modifiche) +- Rimuovere JavaScript da un PDF ricevuto da una fonte non attendibile prima di aprirlo +- Ripulire un PDF prima di inviarlo a un cliente che non deve vedere commenti incorporati o nomi dei campi modulo +- Eliminare i livelli nascosti da un disegno architettonico prima di condividere la versione finale +- Rispettare i requisiti di minimizzazione dei dati previsti dalle normative sulla privacy + +## Suggerimenti + +- Lascia deselezionato "Rimuovi font" a meno che tu non sia certo che il PDF verrà comunque visualizzato correttamente. Rimuovere i font può rendere il testo invisibile in alcuni visualizzatori. +- Se ti serve solo eliminare i metadati, lo strumento dedicato Rimuovi metadati è più rapido e mirato. +- La sanitizzazione è irreversibile. Conserva il file originale. + +## Strumenti correlati + +- [Rimuovi metadati](./remove-metadata): elimina solo i metadati senza toccare il resto del contenuto +- [Appiattisci PDF](./flatten-pdf): appiattisci in particolare moduli e annotazioni +- [Cripta PDF](./protect-pdf): aggiungi la protezione con password dopo la sanitizzazione +- [Rasterizza PDF](./rasterize-pdf): l'opzione drastica, converte in immagini per eliminare ogni contenuto nascosto diff --git a/docs/it/tools/scanner-effect.md b/docs/it/tools/scanner-effect.md new file mode 100644 index 00000000..477d797d --- /dev/null +++ b/docs/it/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Effetto scanner +description: Fai sembrare il tuo PDF un documento scansionato con rumore, rotazione, sfocatura e invecchiamento della carta regolabili. +--- + +# Effetto scanner + +Trasforma un PDF digitale pulito in qualcosa che sembra uscito da uno scanner piano. Lo strumento applica rumore, leggera rotazione, sfocatura, variazioni di luminosità e un ingiallimento facoltativo configurabili, per simulare le imperfezioni di una scansione fisica. + +## Come funziona + +1. Carica il tuo file PDF. +2. L'editor si apre con un'anteprima in tempo reale della prima pagina accanto a un pannello delle impostazioni. +3. Regola i parametri dell'effetto scansione con i cursori e gli interruttori. +4. L'anteprima si aggiorna in tempo reale mentre modifichi le impostazioni. +5. Fai clic su **Applica** per elaborare tutte le pagine e scaricare il risultato. + +## Opzioni + +- **Spazio colore (interruttore Scala di grigi)**: converte l'output in scala di grigi per il classico aspetto di una scansione in bianco e nero. +- **Bordo**: aggiunge un sottile bordo scuro attorno ai margini della pagina per imitare gli artefatti di bordo dello scanner. +- **Rotazione**: applica una leggera rotazione (da -5 a +5 gradi) per simulare un'alimentazione della carta non allineata. +- **Variazione della rotazione**: aggiunge una variazione casuale all'angolo di rotazione, così ogni pagina si inclina in modo leggermente diverso. +- **Luminosità**: sposta la luminosità complessiva verso l'alto o verso il basso. +- **Contrasto**: regola il contrasto per simulare le variazioni di qualità del toner. +- **Sfocatura**: applica una sfocatura gaussiana per ammorbidire i bordi del testo come in una scansione di bassa qualità. +- **Rumore**: aggiunge rumore casuale ai pixel per simulare la grana del sensore dello scanner. Valori più alti producono un risultato più granuloso. +- **Ingiallimento**: aggiunge una tinta gialla calda per simulare carta invecchiata o riciclata. +- **Risoluzione**: imposta i DPI dell'output. Valori più bassi creano un aspetto più pixelato, tipico di una scansione. +- **Reimposta**: ripristina tutte le impostazioni ai valori predefiniti. + +## Funzionalità + +- Anteprima in tempo reale che si aggiorna a ogni modifica dei parametri +- Variazione casuale della rotazione per ogni pagina, per un risultato realistico +- Dieci parametri regolabili in modo indipendente +- Modalità scala di grigi per un autentico output di scansione in bianco e nero +- Controllo della risoluzione, dalla qualità di un fax a bassi DPI a quella di un archivio ad alti DPI + +## Casi d'uso + +- Far sembrare scansionati e stampati dei documenti creati in digitale +- Simulare l'invecchiamento fisico dei documenti per ricreare documenti storici +- Mettere alla prova i software OCR con scansioni di qualità degradata +- Produrre documenti che corrispondano allo stile visivo di archivi di scansioni esistenti + +## Suggerimenti + +- Parti da valori leggeri. Un livello di rumore di 10-20, una leggera rotazione di 0,5 gradi e una sfocatura minima bastano già per un aspetto da scansione convincente. +- Combina la modalità scala di grigi con un leggero ingiallimento per l'effetto "fotocopia di una fotocopia". +- Le risoluzioni più basse (100-150 DPI) creano l'aspetto più realistico da fax. + +## Strumenti correlati + +- [Inverti Colori](./invert-colors) +- [Regola colori](./adjust-colors) +- [Colore di Sfondo](./background-color) diff --git a/docs/it/tools/sign-pdf.md b/docs/it/tools/sign-pdf.md new file mode 100644 index 00000000..e82f58c2 --- /dev/null +++ b/docs/it/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Firma PDF +description: Disegna, digita o carica una firma e posizionala sulle pagine del tuo PDF con un visualizzatore integrato. +--- + +# Firma PDF + +Aggiungi la tua firma a qualsiasi documento PDF. Lo strumento incorpora un visualizzatore PDF completo con strumenti di firma integrati: puoi disegnare la firma a mano libera, digitare il tuo nome con un carattere da firma o caricare l'immagine di una firma. Posiziona e ridimensiona le firme su qualsiasi pagina, poi salva il documento firmato. + +## Come funziona + +1. Carica il tuo file PDF. +2. Il documento si apre in un visualizzatore PDF integrato con strumenti di annotazione. +3. Usa lo strumento firma del visualizzatore per creare la tua firma disegnandola, digitandola o caricando un'immagine. +4. Fai clic sulla pagina nel punto in cui vuoi inserire la firma e regolane dimensioni e posizione. +5. Se vuoi, seleziona **Appiattisci PDF** per incorporare in modo permanente la firma nel documento. +6. Fai clic su **Salva e scarica il PDF firmato** per ottenere il file firmato. + +## Opzioni + +- **Appiattisci PDF**: se selezionata, la firma viene incorporata in modo permanente nel contenuto della pagina. Questo impedisce ad altri di spostarla o eliminarla. Se deselezionata, la firma resta un'annotazione modificabile nei visualizzatori compatibili. + +## Funzionalità + +- Tre metodi per creare la firma: disegno a mano libera, testo digitato o immagine caricata +- Visualizzatore PDF integrato per un posizionamento preciso +- Trascina per posizionare e ridimensionare le firme su qualsiasi pagina +- Appiattimento facoltativo per incorporare le firme in modo permanente +- Supporto per più firme nello stesso documento + +## Casi d'uso + +- Firmare contratti, accordi o moduli di approvazione prima di rimandarli indietro +- Aggiungere la tua firma a documenti fiscali, richieste di risarcimento assicurative o moduli della pubblica amministrazione +- Apporre le sigle sulle singole pagine di un accordo di più pagine +- Firmare NDA o documenti delle risorse umane che arrivano come allegati PDF + +## Suggerimenti + +- Attiva l'appiattimento se invii il PDF firmato a qualcuno che non deve poter rimuovere o spostare la tua firma. +- Per le firme digitali legalmente vincolanti con verifica basata su certificato, BentoPDF offre anche uno strumento separato, Firma digitale PDF. +- Carica un'immagine PNG della firma con sfondo trasparente per il risultato più pulito. + +## Strumenti correlati + +- [Editor PDF](./edit-pdf) +- [Aggiungi Timbri](./add-stamps) +- [Compilatore Moduli PDF](./form-filler) diff --git a/docs/it/tools/split-pdf.md b/docs/it/tools/split-pdf.md new file mode 100644 index 00000000..f425905f --- /dev/null +++ b/docs/it/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Dividi PDF +description: Dividi un PDF in file più piccoli per intervallo di pagine, selezione visiva, segnalibri, pagine pari/dispari o intervalli fissi. +--- + +# Dividi PDF + +Suddividi un PDF in documenti più piccoli con una delle sei modalità di divisione. Dai semplici intervalli di pagine alla divisione basata sui segnalibri, questo strumento copre ogni scenario per dividere un documento. + +## Come funziona + +1. Carica un singolo file PDF. +2. Scegli una modalità di divisione dal menu a discesa. +3. Configura le opzioni specifiche della modalità (intervalli di pagine, selezioni e così via). +4. Fai clic sul pulsante di elaborazione. +5. Il risultato viene scaricato come singolo PDF o come archivio ZIP, a seconda della modalità e delle impostazioni. + +## Modalità di divisione + +| Modalità | Descrizione | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Intervallo** | Inserisci intervalli di pagine come `1-3, 5, 8-10`. Più intervalli producono PDF separati in uno ZIP. Un singolo intervallo produce un solo PDF. | +| **Selezione visiva** | Sfoglia le miniature delle pagine e fai clic per selezionare quelle che vuoi. Le pagine selezionate vengono estratte in un nuovo PDF. | +| **Pari / Dispari** | Estrae solo le pagine con numero pari o dispari. | +| **Tutte le pagine** | Divide ogni pagina in un file PDF a sé, scaricato come ZIP. | +| **Segnalibri** | Divide ai confini dei segnalibri. Scegli il livello dei segnalibri per controllare dove avvengono le divisioni. | +| **Ogni N pagine** | Divide in blocchi di N pagine ciascuno (ad es. ogni 5 pagine). L'ultimo blocco può avere meno pagine. | + +## Funzionalità + +- Sei modalità di divisione distinte che coprono praticamente ogni caso d'uso +- Selettore visivo delle pagine con miniature caricate in modo differito +- Divisione basata sui segnalibri con filtro per livello +- Opzione di output ZIP per le modalità Intervallo e Selezione visiva +- Gestisce intervalli di pagine con sintassi mista (`1-3, 5, 8-10`) +- Avviso quando la divisione per N pagine produce blocchi non uniformi + +## Casi d'uso + +- Estrarre un capitolo o una sezione specifica da un documento di grandi dimensioni +- Separare le pagine pari e dispari per i flussi di stampa fronte/retro +- Suddividere il PDF di un libro in file dei singoli capitoli ai confini dei segnalibri +- Isolare pagine specifiche (come la pagina delle firme) da un contratto +- Dividere un report compilato in file per sezione da distribuire + +## Suggerimenti + +- Più intervalli di pagine separati da virgole (ad es. `1-5, 10-15, 20-25`) producono PDF separati, uno per intervallo, raccolti in uno ZIP. +- La modalità di divisione per segnalibri richiede che il PDF contenga effettivamente dei segnalibri. Se non ne vengono trovati, riceverai un messaggio di errore. +- La casella "Scarica come ZIP" nelle modalità Intervallo e Selezione visiva ti permette di ottenere un PDF per ogni pagina anziché un file combinato. + +## Strumenti correlati + +- [Unisci PDF](./merge-pdf) +- [Estrai Pagine](./extract-pages) +- [Elimina Pagine](./delete-pages) +- [Strumento PDF multifunzione](./pdf-multi-tool) diff --git a/docs/it/tools/svg-to-pdf.md b/docs/it/tools/svg-to-pdf.md new file mode 100644 index 00000000..c77a2404 --- /dev/null +++ b/docs/it/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG in PDF +description: Converti la grafica vettoriale SVG in PDF con controllo della qualità, interamente nel tuo browser. +--- + +# SVG in PDF + +Converti i file Scalable Vector Graphics (SVG) in PDF. Lo strumento rasterizza ogni SVG con il motore di rendering del browser, poi incorpora il risultato alla sua risoluzione nativa. È utile per trasformare icone vettoriali, diagrammi e illustrazioni in documenti portabili. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :--------- | +| SVG | `.svg` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina uno o più file SVG. +2. Controlla e gestisci l'elenco dei file. +3. Scegli un livello di **Qualità PDF**. +4. Fai clic su **Converti in PDF**. Il risultato viene scaricato come `from_svgs.pdf`. + +Ogni SVG viene letto come testo, disegnato su un canvas con la sua larghezza e altezza intrinseche (800x600 se non sono specificate dimensioni) ed esportato come PNG. Quel PNG viene poi incorporato nel PDF con pdf-lib. Le aree trasparenti vengono riempite con uno sfondo bianco. + +## Opzioni + +**Qualità PDF** controlla la compressione dopo la rasterizzazione: + +- **Qualità alta**: il più vicino possibile al rendering originale. +- **Qualità media** (predefinita): buon equilibrio. +- **Qualità bassa**: file più piccolo, con una certa perdita di dettaglio. + +## Casi d'uso + +- Convertire diagrammi di architettura o ingegneria da SVG a un PDF pronto per la stampa +- Raccogliere set di icone in un PDF di riferimento per un design system +- Trasformare visualizzazioni di dati (D3.js, esportazioni di librerie di grafici) in PDF pronti per i report +- Creare versioni stampabili di infografiche basate su SVG + +## Suggerimenti + +- I file SVG senza attributi `width` e `height` espliciti vengono elaborati a 800x600 pixel. Per risultati migliori, imposta le dimensioni nel sorgente SVG prima della conversione. +- Gli SVG complessi con riferimenti a font esterni o immagini collegate potrebbero non essere elaborati perfettamente. Incorpora tutte le risorse nell'SVG per un output affidabile. +- Poiché l'SVG viene rasterizzato, il PDF conterrà un'immagine bitmap anziché tracciati vettoriali. Per un vero output PDF vettoriale serve uno strumento vettoriale dedicato. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [PNG in PDF](./png-to-pdf) +- [BMP in PDF](./bmp-to-pdf) diff --git a/docs/it/tools/table-of-contents.md b/docs/it/tools/table-of-contents.md new file mode 100644 index 00000000..fc2af27d --- /dev/null +++ b/docs/it/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Indice +description: Genera una pagina di indice formattata a partire dai segnalibri esistenti del tuo PDF. +--- + +# Indice + +Questo strumento legge i segnalibri (struttura) del tuo PDF e genera una pagina di indice formattata che viene anteposta al documento. Se il tuo PDF ha già dei segnalibri ma non una pagina di indice visibile, questo strumento ne crea una automaticamente. + +## Come funziona + +1. Carica un PDF che contiene segnalibri. +2. Personalizza il titolo dell'indice, la dimensione e la famiglia del carattere. +3. Se vuoi, seleziona **Aggiungi segnalibro per la pagina dell'indice** per includere l'indice stesso nell'albero dei segnalibri. +4. Fai clic su **Genera indice** per elaborare il file. +5. Il PDF aggiornato viene scaricato automaticamente con la pagina dell'indice inserita all'inizio. + +## Opzioni + +- **Titolo dell'indice**: l'intestazione mostrata in cima alla pagina generata. Il valore predefinito è "Indice". +- **Dimensione del carattere**: da 10 pt a 72 pt. Il valore predefinito è 12 pt. +- **Famiglia di caratteri**: scegli tra le varianti Times Roman, Helvetica o Courier (normale, grassetto, corsivo, grassetto corsivo). Il valore predefinito è Helvetica. +- **Aggiungi segnalibro per la pagina dell'indice**: se selezionata, nell'albero della struttura del PDF viene aggiunta una voce di segnalibro per la pagina dell'indice stessa. + +## Funzionalità + +- Legge l'intera gerarchia dei segnalibri del PDF +- Genera una pagina di indice ben formattata con i riferimenti ai numeri di pagina +- Supporta livelli di segnalibri annidati con rientri +- Scelta tra 12 font PDF integrati +- Segnalibro autoreferenziale facoltativo per la pagina dell'indice + +## Casi d'uso + +- Aggiungere un indice stampabile a e-book o report che hanno solo segnalibri digitali +- Creare un indice per un documento unito dopo aver combinato più PDF +- Generare una pagina di riferimento per lunghi manuali tecnici +- Preparare documenti per la stampa in cui è previsto un indice visibile + +## Suggerimenti + +- Se il tuo PDF non ha segnalibri, usa prima lo strumento [Modifica Segnalibri](./bookmark) per crearli, poi torna qui per generare l'indice. +- Per i documenti grandi, una dimensione del carattere maggiore, come 14 pt o 16 pt, migliora la leggibilità. + +## Strumenti correlati + +- [Modifica Segnalibri](./bookmark) +- [Numeri di Pagina](./page-numbers) +- [Intestazione e Piè di Pagina](./header-footer) diff --git a/docs/it/tools/text-color.md b/docs/it/tools/text-color.md new file mode 100644 index 00000000..c2585618 --- /dev/null +++ b/docs/it/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Cambia colore testo +description: Cambia il colore di tutto il testo del tuo PDF con qualsiasi colore a tua scelta. +--- + +# Cambia colore testo + +Sostituisci il colore del testo in tutto il tuo PDF. Lo strumento individua le aree di testo in ogni pagina e le ricolora con il colore scelto, mantenendo il layout del documento e i contenuti che non sono testo. + +## Come funziona + +1. Carica il tuo file PDF. +2. Scegli un nuovo colore del testo con il selettore di colore. Il valore predefinito è il blu (#0000FF). +3. Fai clic su **Cambia Colore Testo** per elaborare. +4. Il PDF ricolorato viene scaricato automaticamente. Un indicatore di avanzamento mostra quale pagina è in elaborazione. + +## Opzioni + +- **Nuovo colore del testo**: un selettore di colore per scegliere il colore che sostituirà quello di tutto il testo del documento. + +## Funzionalità + +- Ricolora il testo di ogni pagina del documento +- Elaborazione pagina per pagina con indicazione dell'avanzamento +- Selettore di colore con pieno supporto dei colori esadecimali +- Conserva il layout della pagina e gli elementi che non sono testo + +## Casi d'uso + +- Cambiare il testo nero in blu scuro per un aspetto del documento più morbido e moderno +- Ricolorare il testo per rispettare le linee guida del marchio prima di distribuire i documenti +- Convertire il testo in un colore specifico per la conformità all'accessibilità +- Rendere visibile il testo su un colore di sfondo appena applicato + +## Suggerimenti + +- Questo strumento elabora le pagine a scala 2x per mantenere la qualità, poi ricostruisce il PDF. L'output è basato su immagini, quindi il testo non sarà più selezionabile né ricercabile. +- Per i documenti in cui devi mantenere il testo selezionabile, valuta di modificare direttamente il PDF con l'[Editor PDF](./edit-pdf). +- Il tempo di elaborazione aumenta con il numero di pagine, perché ogni pagina viene elaborata singolarmente. + +## Strumenti correlati + +- [Colore di Sfondo](./background-color) +- [Inverti Colori](./invert-colors) +- [Regola colori](./adjust-colors) diff --git a/docs/it/tools/tiff-to-pdf.md b/docs/it/tools/tiff-to-pdf.md new file mode 100644 index 00000000..832980c7 --- /dev/null +++ b/docs/it/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF in PDF +description: Converti immagini TIFF singole e multipagina in formato PDF nel tuo browser, con supporto completo delle pagine. +--- + +# TIFF in PDF + +Converti i file TIFF in PDF, inclusi i TIFF multipagina. Ogni pagina (o "IFD") di un file TIFF diventa una pagina separata nel PDF di output. È particolarmente utile per documenti scansionati, fax e immagini mediche, che sono spesso archiviati come TIFF multipagina. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file TIFF. +2. Controlla l'elenco dei file e gestiscilo come preferisci. +3. Fai clic su **Converti in PDF**. Il risultato viene scaricato come `from_tiff.pdf`. + +Lo strumento decodifica ogni file TIFF con un decodificatore TIFF in JavaScript, estraendo i dati grezzi dei pixel RGBA di ogni pagina. Ogni pagina viene disegnata su un canvas, esportata come PNG e incorporata nel PDF. Le dimensioni delle pagine corrispondono a quelle delle pagine TIFF originali. + +## Opzioni + +Questo strumento non offre impostazioni di qualità aggiuntive. Le immagini vengono incorporate alla loro risoluzione nativa. + +## Casi d'uso + +- Convertire documenti fax multipagina (TIFF-F) in un formato PDF più portabile +- Trasformare archivi di documenti scansionati, conservati come TIFF, in PDF ricercabili (combinando poi lo strumento OCR) +- Elaborare file di imaging medico (vetrini di patologia, esportazioni di radiologia) in formato TIFF +- Convertire immagini TIFF GIS o satellitari in documenti condivisibili + +## Suggerimenti + +- I TIFF multipagina sono pienamente supportati. Un TIFF di 10 pagine produce un PDF di 10 pagine. Non serve dividere prima il TIFF. +- I file TIFF molto grandi (centinaia di megabyte) possono richiedere più tempo, perché l'intero file deve essere decodificato nella memoria del browser. +- Se ti serve l'OCR sul PDF risultante, passalo dallo strumento [OCR PDF](./ocr-pdf) dopo la conversione. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [BMP in PDF](./bmp-to-pdf) +- [JPG in PDF](./jpg-to-pdf) diff --git a/docs/it/tools/txt-to-pdf.md b/docs/it/tools/txt-to-pdf.md new file mode 100644 index 00000000..5a5fd1e2 --- /dev/null +++ b/docs/it/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Testo in PDF +description: Converti file di testo semplice o testo digitato in PDF con font, colori e formati di pagina personalizzati. +--- + +# Testo in PDF + +Converti il testo semplice in un PDF formattato. Puoi caricare file `.txt` oppure digitare direttamente nell'editor di testo integrato. Lo strumento supporta più font, colori del testo personalizzati e un'ampia gamma di formati di pagina, da A0 fino ad A10, oltre a US Letter, Legal e Tabloid. + +## Formati supportati + +| Input | Estensioni | +| :--------------------- | :--------------------------- | +| File di testo semplice | `.txt` | +| Inserimento diretto | Digita o incolla nell'editor | + +## Come funziona + +1. Scegli la modalità di input con l'interruttore in alto: **Carica file** o **Digita testo**. +2. Se carichi file, trascinali oppure fai clic per selezionare uno o più file `.txt`. Se digiti, inserisci il testo direttamente nell'area di testo. +3. Configura le opzioni di formattazione: famiglia di caratteri, dimensione del carattere, colore del testo e formato di pagina. +4. Fai clic su **Crea PDF**. L'output viene scaricato come `text_to_pdf.pdf`. + +Quando carichi più file, i loro contenuti vengono concatenati con righe vuote in mezzo. + +## Opzioni + +| Opzione | Valori | Predefinito | +| :------------------------ | :----------------------------------------------------------------------- | :------------- | +| **Famiglia di caratteri** | Helvetica (sans-serif), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Dimensione carattere** | 6 - 72 pt | 12 | +| **Colore del testo** | Qualsiasi colore tramite il selettore | Nero (#000000) | +| **Formato di pagina** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Le lingue RTL (arabo, ebraico, persiano, urdu) vengono rilevate automaticamente. Quando viene trovato testo RTL, la direzione e l'allineamento del testo cambiano di conseguenza. + +## Casi d'uso + +- Convertire frammenti di codice o file di log in un PDF stampabile con il font Courier +- Creare al volo un PDF da appunti di una riunione digitati sul momento +- Formattare un manoscritto in testo semplice con un font e un formato di pagina specifici per l'invio +- Produrre una versione PDF di un README o di un changelog per la distribuzione offline + +## Suggerimenti + +- Usa la modalità **Digita testo** quando vuoi convertire rapidamente il contenuto degli appunti senza salvarlo prima in un file. +- Courier (monospace) è la scelta migliore per codice, log o qualsiasi contenuto in cui conta l'allineamento delle colonne. +- I margini della pagina sono fissi a 72 punti (1 pollice) su tutti i lati. + +## Strumenti correlati + +- [Markdown in PDF](./markdown-to-pdf) +- [CSV in PDF](./csv-to-pdf) +- [Word in PDF](./word-to-pdf) diff --git a/docs/it/tools/unlock-pdf.md b/docs/it/tools/unlock-pdf.md new file mode 100644 index 00000000..75863d00 --- /dev/null +++ b/docs/it/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Sblocca PDF +description: Rimuovi la protezione con password dai PDF crittografati. Supporta la decrittografia in batch con un'unica password per più file. +--- + +# Sblocca PDF + +Se conosci la password di un PDF crittografato, questo strumento rimuove completamente la crittografia e produce una copia sbloccata che chiunque può aprire senza credenziali. Supporta la decrittografia in batch quando più PDF condividono la stessa password. + +## Come funziona + +1. Carica uno o più file PDF crittografati. +2. Inserisci la **password** usata per proteggere i file. +3. Fai clic su **Decrittografa PDF**. +4. Un singolo file viene scaricato direttamente. Più file producono un archivio ZIP con tutti i PDF sbloccati. + +## Funzionalità + +- Decrittografia di singoli file e in batch +- Gestisce sia le password utente sia quelle del proprietario +- Produce un output completamente non crittografato, senza restrizioni residue +- Segnalazione chiara degli errori per password errate o file danneggiati +- Monitoraggio di successo/errore per ogni file in modalità batch + +## Differenze rispetto a Rimuovi Restrizioni + +**Decrittografa PDF** richiede la password e rimuove tutta la crittografia. **Rimuovi Restrizioni** agisce sulle restrizioni d'uso (stampa, copia, modifica) e potrebbe non richiedere una password se è stata impostata solo una password del proprietario. Usa Decrittografa quando il PDF non si apre affatto senza password. + +## Casi d'uso + +- Sbloccare in modo permanente PDF che avevi crittografato in precedenza quando la password non serve più +- Rimuovere la crittografia da un gruppo di documenti archiviati per un accesso più semplice nel lungo periodo +- Preparare PDF protetti da password per un sistema di gestione documentale che non supporta i file crittografati +- Sbloccare i PDF prima di unirli ad altri documenti (molti strumenti di unione non riescono a elaborare input crittografati) + +## Suggerimenti + +- Il campo password si applica a tutti i file caricati. Se i tuoi PDF hanno password diverse, elaborali in batch separati. +- Se ricevi l'errore "Password errata", controlla di non aver inserito spazi finali e che il blocco maiuscole non sia attivo. +- Dopo la decrittografia, l'output non ha alcuna protezione. Ricrittografa con Cripta PDF se vuoi applicare una nuova password. + +## Strumenti correlati + +- [Cripta PDF](./protect-pdf): applica di nuovo la crittografia con una nuova password +- [Rimuovi Restrizioni](./remove-restrictions): rimuovi le restrizioni d'uso senza decrittografare del tutto +- [Modifica permessi](./change-permissions): modifica permessi specifici di un PDF crittografato diff --git a/docs/it/tools/validate-signature-pdf.md b/docs/it/tools/validate-signature-pdf.md new file mode 100644 index 00000000..dbb45cd3 --- /dev/null +++ b/docs/it/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Verifica firma PDF +description: Verifica le firme digitali nei file PDF. Controlla validità del certificato, identità del firmatario, integrità del documento e stato della catena di fiducia. +--- + +# Verifica firma PDF + +Carica un PDF firmato e questo strumento estrae ogni firma digitale, identifica il firmatario, controlla la validità del certificato e indica se il documento è stato modificato dopo la firma. Puoi anche fornire un certificato attendibile per verificare la catena della firma. + +## Come funziona + +1. Carica un file PDF firmato. La verifica parte automaticamente. +2. Lo strumento mostra un riepilogo: numero di firme trovate e quante sono valide. +3. Ogni firma ha una scheda dettagliata con nome del firmatario, emittente, date e stato. +4. Se vuoi, carica un **certificato attendibile** (.pem, .crt, .cer, .der) per verificare la firma rispetto a una specifica radice di fiducia. La nuova verifica parte automaticamente. + +## Cosa viene controllato + +### Analisi della firma + +Lo strumento estrae gli oggetti firma PKCS#7 dal PDF, decodifica la struttura ASN.1 e ricava il certificato X.509 del firmatario insieme all'eventuale catena di certificati incorporata nella firma. + +### Validità del certificato + +- **Scadenza**: il certificato è attualmente entro il suo periodo di validità? +- **Rilevamento di autofirma**: il certificato è emesso da sé stesso? +- **Catena di fiducia**: quando viene fornito un certificato attendibile, il certificato del firmatario risale fino a esso? + +### Verifica crittografica + +- Lo strumento ricostruisce i byte coperti dal `/ByteRange` della firma, ne calcola l'hash con l'algoritmo dichiarato dal firmatario e confronta il risultato con l'attributo `messageDigest` all'interno della firma. +- Poi serializza di nuovo gli attributi firmati come DER SET e verifica la firma rispetto alla chiave pubblica del certificato del firmatario. +- **Una firma è segnalata come valida solo se tutti questi controlli vanno a buon fine.** Se i byte del PDF sono stati modificati dopo la firma, o la firma incorporata non corrisponde alla chiave del firmatario, lo stato mostra "Non valida: verifica crittografica non riuscita" con il motivo specifico. + +#### Algoritmi di firma supportati + +| Algoritmo | Percorso di verifica | +| ----------------------- | ---------------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, con fallback su Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` dopo la conversione della firma da DER a IEEE P1363 | + +Se una firma usa un algoritmo non presente in questo elenco (ad esempio Ed25519, SM2 o RSA con un OID di digest insolito), la scheda mostra in giallo **"Non verificata: algoritmo di firma non supportato"**, insieme all'OID o al motivo specifico. Si tratta di una distinzione volutamente a tre stati: + +- **Valida**: firma verificata crittograficamente rispetto alla chiave pubblica del firmatario. +- **Non valida**: la verifica è stata eseguita e ha dato esito negativo (byte modificati, chiave non corrispondente). +- **Non verificata**: lo strumento non ha potuto eseguire la verifica per questo algoritmo. I metadati del certificato vengono comunque mostrati, ma considera la firma come "sconosciuta" e verificala con Adobe Acrobat o `openssl cms -verify`. + +### Algoritmi di digest non sicuri + +- Le firme che usano **MD5 o SHA-1** sono rifiutate come non valide e contrassegnate con lo stato "Digest non sicuro". Entrambi gli algoritmi hanno attacchi di collisione noti, quindi una firma su un hash SHA-1 o MD5 non offre alcuna garanzia di integrità. +- SHA-224, SHA-256, SHA-384 e SHA-512 sono tutti accettati. + +### Copertura del documento + +- **Copertura completa**: la firma copre l'intero file PDF, quindi nessun byte è stato aggiunto o modificato dopo la firma. +- **Copertura parziale**: la firma copre solo una parte del file. Può indicare modifiche successive alla firma (non necessariamente dolose: i salvataggi incrementali producono una copertura parziale). + +## Dettagli della firma + +Ogni scheda di firma mostra: + +- **Firmato da**: nome comune, organizzazione ed email dal certificato del firmatario +- **Emittente**: l'autorità di certificazione che ha emesso il certificato del firmatario +- **Firmato il**: il timestamp incorporato nella firma +- **Valido dal / Valido fino al**: il periodo di validità del certificato +- **Motivo**: perché il documento è stato firmato (se indicato) +- **Luogo**: dove è stato firmato (se indicato) +- **Stato della copertura**: completa o parziale +- **Badge di fiducia**: Attendibile oppure Non nella catena di fiducia (solo quando viene fornito un certificato personalizzato) + +### Dettagli tecnici + +Espandi la sezione dei dettagli tecnici per vedere: + +- Numero di serie del certificato del firmatario +- Algoritmo di digest (SHA-256, SHA-512, ecc.) +- Algoritmo di firma (RSA con SHA-256, ECDSA con SHA-256, ecc.) +- Messaggi di errore per le firme non valide + +## Casi d'uso + +- Verificare un contratto firmato digitalmente prima di controfirmarlo +- Controllare i documenti firmati per confermare che non siano stati manomessi +- Verificare se un certificato è scaduto dopo la firma del documento +- Convalidare le firme rispetto al certificato radice della tua organizzazione +- Ispezionare i dettagli di firma di documenti governativi o legali + +## Suggerimenti + +- Un certificato autofirmato non significa che la firma non sia valida: significa che l'identità del firmatario non può essere verificata tramite una terza parte attendibile. È comune per i documenti interni. +- La copertura parziale non indica sempre una manomissione. Molti flussi di lavoro PDF aggiungono aggiornamenti incrementali (come una seconda firma) che creano una copertura parziale. +- Carica il certificato radice o intermedio della tua organizzazione come certificato attendibile per ottenere la verifica della catena di fiducia. + +## Strumenti correlati + +- [Firma digitale](./digital-sign-pdf): firma i PDF con il tuo certificato +- [Appiattisci PDF](./flatten-pdf): appiattisci un PDF prima di firmarlo per impedire modifiche successive alla firma +- [Rimuovi metadati](./remove-metadata): ripulisci un PDF prima di applicare una firma diff --git a/docs/it/tools/view-metadata.md b/docs/it/tools/view-metadata.md new file mode 100644 index 00000000..73481595 --- /dev/null +++ b/docs/it/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Visualizza metadati +description: Ispeziona tutte le proprietà dei metadati di un PDF, comprese informazioni del documento, dati XMP e dettagli strutturali. +--- + +# Visualizza metadati + +Esamina le proprietà nascoste incorporate in un file PDF. Lo strumento mostra le informazioni del documento (titolo, autore, date), i metadati XMP, le dimensioni delle pagine e altri dati strutturali in un formato leggibile. + +## Come funziona + +1. Carica un file PDF. +2. Lo strumento analizza subito il file e mostra tutti i metadati disponibili in sezioni organizzate. +3. Consulta il dizionario delle informazioni del documento, l'albero dei metadati XMP e le proprietà strutturali. +4. Non serve alcuna fase di elaborazione: i metadati vengono mostrati appena il file è caricato. + +## Funzionalità + +- Mostra i campi standard delle informazioni del documento: Titolo, Autore, Oggetto, Parole chiave, Creatore, Produttore +- Mostra le date di creazione e modifica in un formato leggibile +- Analizza e visualizza l'intero albero dei metadati XMP con namespace annidati +- Converte il formato data PDF (`D:20240101120000Z`) in date leggibili +- Organizzato in sezioni comprimibili per una navigazione più semplice + +## Sezioni dei metadati + +| Sezione | Contenuto | +| -------------------------- | ------------------------------------------------------------------------------------------------- | +| **Informazioni documento** | Titolo, Autore, Oggetto, Parole chiave, Creatore, Produttore, Data di creazione, Data di modifica | +| **Metadati XMP** | Albero completo dei metadati in formato XML con namespace Dublin Core, XAP, PDF e personalizzati | +| **Proprietà documento** | Numero di pagine, versione PDF, dimensione del file, stato della crittografia | + +## Casi d'uso + +- Controllare chi ha creato un PDF e quando è stato modificato l'ultima volta +- Verificare che i metadati siano impostati correttamente prima di pubblicare un documento +- Controllare la privacy dei PDF verificando quali informazioni personali sono incorporate +- Indagare sul software usato per creare o modificare un PDF (tramite il campo Produttore) +- Rivedere i metadati XMP per la conformità nella gestione delle risorse digitali + +## Suggerimenti + +- Le stringhe di data PDF che iniziano con `D:` vengono convertite automaticamente nel formato del tuo fuso orario locale. +- Se i campi dei metadati appaiono vuoti, significa semplicemente che chi ha creato il PDF non li ha impostati. Non tutti i PDF contengono metadati ricchi. +- Per modificare i metadati dopo averli ispezionati, usa [Modifica Metadati](./edit-metadata). Per rimuoverli del tutto, usa Rimuovi metadati. + +## Strumenti correlati + +- [Modifica Metadati](./edit-metadata) +- [Livelli OCG del PDF](./pdf-layers) +- [Confronta PDF](./compare-pdfs) diff --git a/docs/it/tools/vsd-to-pdf.md b/docs/it/tools/vsd-to-pdf.md new file mode 100644 index 00000000..d71fd862 --- /dev/null +++ b/docs/it/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD in PDF +description: Converti i diagrammi Microsoft Visio (VSD/VSDX) in PDF nel browser. Gratis, privato, senza bisogno di Visio. +--- + +# VSD in PDF + +Converti i diagrammi Microsoft Visio in PDF senza installare Visio. I file VSD e VSDX contengono diagrammi di flusso, organigrammi, diagrammi di rete e planimetrie che la maggior parte delle persone non riesce ad aprire. Questo strumento li trasforma in PDF puliti, visualizzabili su qualsiasi dispositivo. + +## Formati supportati + +| Formato | Estensione | Note | +| :------------ | :--------- | :--------------------------------------------- | +| Visio binario | `.vsd` | Formato Visio legacy (Visio 2003 e precedenti) | +| Visio XML | `.vsdx` | Formato Visio moderno (Visio 2013+) | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file VSD o VSDX. Puoi mescolare i due formati nello stesso batch. +2. Controlla l'elenco dei file. Rimuovi le voci indesiderate con l'icona del cestino, oppure usa **Aggiungi altri file** per aggiungere altri diagrammi. +3. Fai clic su **Converti in PDF**. Il motore basato su LibreOffice si carica nel browser e trasforma ogni diagramma in un PDF, mantenendo forme, connettori, etichette e layout di pagina. +4. Un singolo diagramma viene scaricato direttamente come PDF. Più file producono un archivio ZIP chiamato `vsd-to-pdf.zip`. + +## Opzioni + +Non è richiesta alcuna configurazione. Il convertitore rispetta le dimensioni e l'orientamento di pagina originali del documento Visio. + +## Casi d'uso + +- Consultare i diagrammi Visio di un collega quando non hai una licenza Visio +- Includere diagrammi di rete o di architettura nella documentazione di progetto come PDF +- Stampare organigrammi o flussi di processo come dispense per le riunioni +- Archiviare vecchi file VSD delle versioni precedenti di Visio in un formato destinato a durare + +## Suggerimenti + +- I documenti Visio con più pagine producono PDF con più pagine, con ogni pagina Visio associata a una pagina PDF. +- I file VSDX (il formato moderno basato su XML) in genere vengono convertiti con maggiore fedeltà rispetto ai vecchi file binari VSD. +- Il motore LibreOffice viene caricato una sola volta per sessione. Aspettati una breve attesa alla prima conversione, con risultati più rapidi sui file successivi. + +## Strumenti correlati + +- [ODG in PDF](./odg-to-pdf) +- [PUB in PDF](./pub-to-pdf) +- [PSD in PDF](./psd-to-pdf) diff --git a/docs/it/tools/webp-to-pdf.md b/docs/it/tools/webp-to-pdf.md new file mode 100644 index 00000000..111db146 --- /dev/null +++ b/docs/it/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP in PDF +description: Converti le immagini WebP in PDF direttamente nel browser con qualità di compressione regolabile. +--- + +# WebP in PDF + +Converti il formato immagine WebP di Google in PDF. È particolarmente utile quando hai scaricato dal web immagini in formato WebP e ti servono in un formato più universale per stamparle o condividerle. + +## Formati supportati + +| Formato | Estensioni | +| :------ | :--------- | +| WebP | `.webp` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file WebP. +2. Controlla l'elenco dei file e rimuovi quelli che non ti servono. +3. Seleziona un livello di **Qualità PDF**. +4. Fai clic su **Converti in PDF**. L'output viene scaricato come `from_webps.pdf`. + +Internamente, ogni immagine WebP viene decodificata tramite l'API canvas del browser e poi incorporata nel PDF con pdf-lib. Questo significa che la conversione funziona su qualsiasi browser che supporti la decodifica WebP (tutti i browser moderni lo fanno). + +## Opzioni + +**Qualità PDF** controlla la compressione durante l'inserimento delle immagini: + +- **Alta qualità**: conserva il massimo dettaglio. +- **Qualità media** (predefinita): output bilanciato. +- **Bassa qualità**: dimensione del file più piccola. + +## Casi d'uso + +- Convertire in un PDF stampabile le immagini scaricate dal web e salvate come WebP +- Raccogliere in una documentazione gli screenshot WebP di Chrome o Edge +- Creare un portfolio PDF da immagini esportate da strumenti di design che usano WebP per impostazione predefinita +- Archiviare le immagini WebP in un formato leggibile più universalmente + +## Suggerimenti + +- WebP viene decodificato internamente in PNG prima dell'inserimento nel PDF, quindi le immagini WebP lossless mantengono la loro qualità con l'impostazione Alta. +- Se hai un mix di WebP e altri formati di immagine, usa invece lo strumento [Immagini in PDF](./image-to-pdf): accetta tutto in un colpo solo. + +## Strumenti correlati + +- [Immagini in PDF](./image-to-pdf) +- [PNG in PDF](./png-to-pdf) +- [JPG in PDF](./jpg-to-pdf) diff --git a/docs/it/tools/word-to-pdf.md b/docs/it/tools/word-to-pdf.md new file mode 100644 index 00000000..984cd67b --- /dev/null +++ b/docs/it/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word in PDF +description: Converti documenti Word (DOC, DOCX), ODT e RTF in PDF nel browser, conservando tutta la formattazione. +--- + +# Word in PDF + +Converti i documenti Microsoft Word e i formati compatibili in PDF. Lo strumento usa un motore LibreOffice nel browser che gestisce file DOC, DOCX, ODT e RTF, mantenendo nell'output formattazione, tabelle, immagini, intestazioni, piè di pagina e stili. + +## Formati supportati + +| Formato | Estensioni | +| :---------------- | :--------- | +| Word (moderno) | `.docx` | +| Word (legacy) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi documenti Word. Puoi selezionare più file contemporaneamente. +2. Controlla e gestisci l'elenco dei file. +3. Fai clic su **Converti in PDF**. Il motore LibreOffice si carica al primo utilizzo (un indicatore di avanzamento mostra lo stato dell'inizializzazione), poi ogni file viene convertito. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono raccolti in `word-converted.zip`. + +## Opzioni + +Questo strumento non ha impostazioni aggiuntive. Il motore LibreOffice genera l'output con il suo profilo di esportazione PDF predefinito. + +## Output + +| Numero di input | Output | +| :-------------- | :---------------------------------------------------------------- | +| 1 file | Download di un singolo PDF (nome originale con estensione `.pdf`) | +| 2+ file | Archivio ZIP (`word-converted.zip`) con un PDF per ogni file | + +## Casi d'uso + +- Convertire un curriculum o una lettera di presentazione da DOCX a PDF prima di inviare una candidatura +- Convertire in batch una serie di contratti o proposte in PDF per la consegna a un cliente +- Trasformare vecchi file `.doc` in PDF moderni per l'archiviazione a lungo termine +- Convertire in PDF documenti collaborativi di Google Docs (esportati come DOCX) +- Produrre PDF pronti per la stampa da modelli Word usati per la generazione automatica di documenti + +## Suggerimenti + +- Il motore LibreOffice viene scaricato una volta per sessione e memorizzato nella cache. Aspettati qualche secondo di caricamento alla prima conversione, mentre le successive sono molto più rapide. +- La formattazione complessa (macro, controlli ActiveX, SmartArt avanzati) potrebbe non essere convertita perfettamente. Gli elementi standard di un documento (testo, tabelle, immagini, intestazioni, note a piè di pagina) vengono convertiti in modo affidabile. +- Poiché questo strumento accetta anche ODT e RTF, puoi usarlo come convertitore unico per tutti i formati di elaborazione testi. + +## Strumenti correlati + +- [ODT in PDF](./odt-to-pdf) +- [RTF in PDF](./rtf-to-pdf) +- [Excel in PDF](./excel-to-pdf) +- [PowerPoint in PDF](./powerpoint-to-pdf) diff --git a/docs/it/tools/wpd-to-pdf.md b/docs/it/tools/wpd-to-pdf.md new file mode 100644 index 00000000..c41ac429 --- /dev/null +++ b/docs/it/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD in PDF +description: Converti i documenti WordPerfect (WPD) in PDF nel browser con LibreOffice. Gratis e privato. +--- + +# WPD in PDF + +Converti i documenti Corel WordPerfect in file PDF. WPD è stato per anni il formato di elaborazione testi dominante negli studi legali e negli enti pubblici. Se hai vecchi file WordPerfect che i software moderni non riescono ad aprire, questo strumento li riporta in vita come PDF standard. + +## Formati supportati + +| Formato | Estensione | Note | +| :---------- | :--------- | :------------------------------------------ | +| WordPerfect | `.wpd` | Tutte le principali versioni di WordPerfect | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file WPD. Puoi selezionare più file contemporaneamente. +2. Controlla l'elenco dei file. Rimuovi i file indesiderati con l'icona del cestino, oppure usa **Aggiungi altri file** per aggiungere altri documenti. +3. Fai clic su **Converti in PDF**. Lo strumento carica nel browser un motore di conversione basato su LibreOffice, che analizza il formato WPD e produce il PDF. +4. Un singolo file viene scaricato direttamente come PDF. Le conversioni in batch producono un archivio ZIP chiamato `wpd-to-pdf.zip`. + +## Opzioni + +Non è richiesta alcuna configurazione. Il motore LibreOffice gestisce automaticamente formattazione, font e layout WPD. + +## Casi d'uso + +- Aprire documenti legali vecchi di decenni scritti in WordPerfect +- Convertire pratiche governative archiviate da WPD a un formato moderno +- Migrare una vecchia libreria di documenti WordPerfect in PDF per l'archiviazione a lungo termine +- Condividere file WPD con destinatari che non hanno Corel WordPerfect installato + +## Suggerimenti + +- Il motore LibreOffice si carica al primo utilizzo, e ci vuole un momento. Le conversioni successive nella stessa sessione sono più rapide. +- Le macro WPD complesse e i codici rivelati non vengono mantenuti, ma layout visivo, contenuto testuale e formattazione di base passano nel PDF. + +## Strumenti correlati + +- [WPS in PDF](./wps-to-pdf) +- [ODG in PDF](./odg-to-pdf) diff --git a/docs/it/tools/wps-to-pdf.md b/docs/it/tools/wps-to-pdf.md new file mode 100644 index 00000000..17626271 --- /dev/null +++ b/docs/it/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS in PDF +description: Converti i documenti Microsoft Works (WPS) in PDF nel browser. Gratis, senza registrazione, completamente privato. +--- + +# WPS in PDF + +Converti i file di elaborazione testi di Microsoft Works in PDF. Microsoft Works era incluso nei PC di largo consumo tra la fine degli anni '90 e gli anni 2000, e molti file WPS si trovano ancora su vecchi dischi rigidi e archivi di posta. Questo strumento li apre nel browser e produce PDF puliti. + +## Formati supportati + +| Formato | Estensione | Note | +| :-------------- | :--------- | :-------------------------------------------- | +| Microsoft Works | `.wps` | File di elaborazione testi di Microsoft Works | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file WPS. Sono accettati più file. +2. Controlla l'elenco dei file. Usa l'icona del cestino per rimuovere singoli file, oppure fai clic su **Aggiungi altri file** per ampliare il batch. +3. Fai clic su **Converti in PDF**. Un motore basato su LibreOffice si carica nel browser e converte ogni documento WPS in PDF. +4. Un file viene scaricato direttamente come PDF. Più file vengono raccolti in un archivio ZIP chiamato `wps-to-pdf.zip`. + +## Opzioni + +Non servono impostazioni aggiuntive. Il convertitore gestisce testo, formattazione di base e immagini incorporate del file WPS. + +## Casi d'uso + +- Recuperare vecchi documenti di scuola o lavoro salvati in formato Microsoft Works +- Aprire allegati WPS ricevuti via email quando non hai Microsoft Works installato +- Convertire un archivio di file WPS per migrarlo a un moderno sistema documentale +- Stampare documenti legacy che gli attuali programmi di elaborazione testi non riescono ad aprire + +## Suggerimenti + +- Non confondere i file `.wps` di Microsoft Works con i file di WPS Office. Questo strumento è pensato specificamente per il vecchio formato Microsoft Works. +- Il motore LibreOffice impiega un momento a caricarsi al primo utilizzo. Una volta caricato, le conversioni successive nella stessa sessione sono più rapide. + +## Strumenti correlati + +- [WPD in PDF](./wpd-to-pdf) +- [PUB in PDF](./pub-to-pdf) diff --git a/docs/it/tools/xml-to-pdf.md b/docs/it/tools/xml-to-pdf.md new file mode 100644 index 00000000..b628a78c --- /dev/null +++ b/docs/it/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML in PDF +description: Converti i file XML in documenti PDF strutturati nel browser. Gratis, privato, nessuna elaborazione sul server. +--- + +# XML in PDF + +Converti i file di dati XML in documenti PDF leggibili e strutturati. L'XML grezzo è potente ma difficile da leggere per le persone. Questo strumento analizza l'albero XML, individua le strutture di dati ripetute e le trasforma in tabelle e sezioni formattate in un PDF A4 orizzontale. + +## Formati supportati + +| Formato | Estensione | Note | +| :------ | :--------- | :----------------------------- | +| XML | `.xml` | Qualsiasi documento XML valido | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file XML. Puoi elaborare più file in un unico batch. +2. Controlla l'elenco dei file. Rimuovi i file indesiderati con l'icona del cestino, oppure fai clic su **Aggiungi altri file** per includerne altri. +3. Fai clic su **Converti in PDF**. Lo strumento analizza la struttura XML con il DOMParser integrato nel browser, esamina la gerarchia dei dati e la trasforma in un PDF usando jsPDF con formattazione auto-table. +4. Un singolo file viene scaricato come PDF. Più conversioni vengono raccolte in `xml-to-pdf.zip`. + +## Opzioni + +Non è richiesta alcuna configurazione manuale. Il convertitore rileva automaticamente la struttura XML e sceglie layout di tabella adatti. L'output usa l'orientamento A4 orizzontale per ospitare insiemi di dati ampi. + +## Casi d'uso + +- Trasformare esportazioni di dati XML da database o API in report stampabili +- Creare riepiloghi leggibili da file di configurazione XML +- Convertire fatture o registri di transazioni in formato XML in PDF da conservare +- Rendere leggibili in forma di documento sitemap XML o feed RSS + +## Suggerimenti + +- L'XML deve essere ben formato. Se il parser incontra errori di sintassi, la conversione non riesce e mostra un messaggio d'errore descrittivo che indica il problema. +- Le strutture XML con annidamento profondo vengono appiattite in tabelle. Per ottenere i risultati migliori, i dati dovrebbero avere elementi fratelli ripetuti con elementi figli coerenti. +- Durante la conversione compaiono aggiornamenti di avanzamento che mostrano ogni fase: lettura, analisi, esame e rendering. + +## Strumenti correlati + +- [FB2 in PDF](./fb2-to-pdf) +- [XPS in PDF](./xps-to-pdf) +- [Email in PDF](./email-to-pdf) diff --git a/docs/it/tools/xps-to-pdf.md b/docs/it/tools/xps-to-pdf.md new file mode 100644 index 00000000..d99175d9 --- /dev/null +++ b/docs/it/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS in PDF +description: Converti i documenti XPS e OXPS in PDF nel browser. Nessun caricamento, nessuna registrazione, completamente privato. +--- + +# XPS in PDF + +Converti i documenti Microsoft XPS e OXPS in normali file PDF. XPS (XML Paper Specification) era la risposta di Microsoft al PDF, ma il suo supporto è diminuito su tutte le piattaforme. Questo strumento rende di nuovo questi documenti leggibili da chiunque. + +## Formati supportati + +| Formato | Estensione | Note | +| :------ | :--------- | :-------------------------------------------- | +| XPS | `.xps` | Formato XPS originale di Microsoft | +| OXPS | `.oxps` | Open XPS, la variante dello standard ECMA-388 | + +## Come funziona + +1. Fai clic sull'area di caricamento o trascina i tuoi file XPS/OXPS. Puoi selezionare più file contemporaneamente. +2. Controlla l'elenco dei file. Rimuovi i singoli file con l'icona del cestino, oppure fai clic su **Aggiungi altri file** per accodare altri documenti. +3. Fai clic su **Converti in PDF**. Il motore PyMuPDF elabora ogni documento localmente nel tuo browser. +4. Un singolo file viene scaricato direttamente come PDF. Più file vengono raccolti in un archivio ZIP chiamato `xps-converted.zip`. + +## Opzioni + +Questo strumento esegue una conversione diretta del formato, senza configurazione aggiuntiva. L'output conserva dimensioni di pagina, grafica vettoriale, font e immagini originali della sorgente XPS. + +## Casi d'uso + +- Aprire file XPS ricevuti da vecchi sistemi Windows che usavano il driver di stampa XPS come predefinito +- Convertire documenti OXPS di Windows 10/11 per condividerli con utenti macOS o Linux +- Archiviare vecchi file XPS in un formato supportato più ampiamente +- Rendere accessibili a destinatari esterni documenti governativi o aziendali basati su XPS + +## Suggerimenti + +- Le estensioni `.xps` e `.oxps` vengono gestite entrambe automaticamente: puoi mescolarle nello stesso batch. +- Se il file XPS originale è stato creato con un driver di stampa ad alta risoluzione, il PDF risultante mantiene quella qualità. Non avviene alcun ricampionamento. + +## Strumenti correlati + +- [Word in PDF](./word-to-pdf) +- [XML in PDF](./xml-to-pdf) diff --git a/docs/ja/contributing.md b/docs/ja/contributing.md new file mode 100644 index 00000000..c6bf8a5a --- /dev/null +++ b/docs/ja/contributing.md @@ -0,0 +1,136 @@ +# コントリビュート + +BentoPDFへのコントリビュートにご関心をお寄せいただきありがとうございます。このガイドで始め方を説明します。 + +## はじめに + +### 前提条件 + +- Node.js 18+ +- npm 9+ +- Git + +### セットアップ + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## プロジェクト構成 + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## 新しいツールの追加 + +### ステップ1:ロジックファイルを作成する + +`src/js/logic/your-tool-page.ts` を作成します。 + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### ステップ2:HTMLページを作成する + +既存のツールテンプレートに倣って `src/pages/your-tool.html` を作成します。 + +### ステップ3:ツールを登録する + +`src/js/config/tools.ts` に次を追加します。 + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### ステップ4:ビルド設定に追加する + +`vite.config.ts` にページを追加します。 + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### ステップ5:翻訳を追加する + +`public/locales/` 内のすべてのロケールファイルにエントリを追加します。 + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## コードスタイル + +- 新しいコードにはすべてTypeScriptを使用する +- 一貫性のため既存のパターンに従う +- コミット前に `npm run format` を実行する +- 本番コードにコメントは書かない(コメントはビルド時に削除されます) + +## プルリクエストの手順 + +1. 機能ブランチを作成します:`git checkout -b feature/your-feature` +2. 変更を加えます +3. 十分にテストします:`npm run build` +4. 内容が明確にわかる説明を添えてPRを送信します + +## 翻訳 + +新しい言語の追加については [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) を参照してください。 + +## コントリビューターライセンス契約 + +PRをマージする前に、CLAへの署名が必要です。 + +- [個人向けCLA(ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [法人向けCLA(CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## ヘルプ + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discordコミュニティ](https://discord.gg/Bgq3Ay3f2w) + +## ライセンス + +BentoPDFはデュアルライセンスです。 + +- **AGPL-3.0**:ソースコード全体を公開するオープンソースプロジェクト向け +- **商用ライセンス**:プロプライエタリ/クローズドソースのアプリケーション向け - [$79で永久ライセンスを購入](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +コントリビュートすることで、あなたの貢献がこれらの条件でライセンスされることに同意したものとみなされます。 diff --git a/docs/ja/getting-started.md b/docs/ja/getting-started.md new file mode 100644 index 00000000..8c7623b9 --- /dev/null +++ b/docs/ja/getting-started.md @@ -0,0 +1,80 @@ +# はじめに + +BentoPDFへようこそ。このガイドですぐに使い始められます。 + +## BentoPDFとは? + +BentoPDFは、無料でオープンソースの、プライバシーを第一に考えたPDFツールキットで、**すべてブラウザ内で**動作します。ファイルがデバイスの外に出ることはなく、処理はすべてWebAssembly(WASM)技術を使ってローカルで行われます。 + +## クイックスタート + +### オプション1:ホスト版を使う + +[bentopdf.com](https://www.bentopdf.com) にアクセスすればすぐに使えます。インストールは不要です。 + +### オプション2:Dockerでセルフホストする + +> [!IMPORTANT] +> Officeファイルの変換には `SharedArrayBuffer` が必要で、次の両方が求められます。 +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - セキュアコンテキスト +> +> ブラウザはループバックを信頼できるものとして扱うため、ローカルでのテストでは `http://localhost` が使えます。`http://192.168.x.x` などのLAN IPは通常これに該当しないため、ネットワーク内の他のデバイスからアクセスする場合、Word/Excel/PowerPointの変換にはHTTPSが必要になります。 + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDFには2つのビルドがあります。社内・チーム・組織向けのデプロイ用の**セルフホスト版ビルド**(`bentopdf-simple`、上で使用)と、bentopdf.com自体や、公開向けにデプロイする商用ライセンス保持者が使う**商用版ビルド**(`bentopdf:latest`)です。どちらも同じPDFツールを備えており、商用版ビルドにはbentopdf.comのヒーロー、FAQ、お客様の声、フッターが加わります。迷ったらセルフホスト版ビルドを使ってください。 + +その後、ブラウザで `http://localhost:3000` を開きます。 + +> [!NOTE] +> エアギャップ環境でOCRをデプロイする場合は、Tesseractのワーカー、コアランタイム、traineddataファイルに加えて、OCRテキストレイヤー用フォントも社内でホストする必要があります。`VITE_OCR_FONT_BASE_URL` や同梱の `ocr-fonts/` ディレクトリを含む完全な手順は[セルフホスティング](/ja/self-hosting/)に記載されています。 + +### オプション3:ソースからビルドする + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 機能一覧 + +| カテゴリ | ツール | +| ---------------- | ------------------------------------------------------- | +| **PDFに変換** | Word、Excel、PowerPoint、画像、Markdown、EPUB、MOBIなど | +| **PDFから変換** | JPG、PNG、テキスト、Excel、SVGなど | +| **編集と注釈** | 署名、ハイライト、墨消し、フォーム入力、スタンプ追加 | +| **整理** | 結合、分割、回転、ページ削除、並べ替え | +| **最適化** | 圧縮、修復、フラット化、OCR | +| **セキュリティ** | 暗号化、復号、制限の解除 | + +## 対応ブラウザ + +BentoPDFは最新のブラウザで最適に動作します。 + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## 次のステップ + +- [すべてのツールを見る](/ja/tools/) +- [BentoPDFをセルフホストする](/ja/self-hosting/) +- [プロジェクトにコントリビュートする](/ja/contributing) diff --git a/docs/ja/index.md b/docs/ja/index.md new file mode 100644 index 00000000..9fb92be1 --- /dev/null +++ b/docs/ja/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: '無料のオープンソースPDFツール' + tagline: PDFの処理はすべてブラウザ内で。アップロードなし。サーバーなし。完全なプライバシー。 + actions: + - theme: brand + text: はじめに + link: /ja/getting-started + - theme: alt + text: ツールを見る + link: /ja/tools/ + - theme: alt + text: セルフホスト + link: /ja/self-hosting/ + - theme: alt + text: 商用ライセンス + link: /ja/licensing + +features: + - icon: 🔒 + title: 100%プライベート + details: ファイルがデバイスの外に出ることはありません。処理はすべてWebAssemblyを使ってブラウザ内でローカルに行われます。 + - icon: ⚡ + title: 高速で無料 + details: 登録不要、制限なし、透かしなし。無制限のPDF処理をずっと無料で。 + - icon: 🛠️ + title: 50以上のツール + details: 変換、編集、結合、分割、圧縮、署名、OCRなど。必要なものがすべて1か所に。 + + - icon: 🌐 + title: セルフホスト可能 + details: 自社のインフラにデプロイできます。Docker、Vercel、Netlify、AWS、さらにセルフホストのOCRワーカー、言語データ、テキストレイヤー用フォントを備えた完全エアギャップ環境にも対応。 +--- + +## オフラインOCR + +エアギャップ環境やオフライン環境にBentoPDFをセルフホストする場合、OCRにはTesseractのワーカーとtraineddataファイルだけでなく、検索可能なPDFの出力に必要なOCRテキストレイヤー用フォントも社内で配信する必要があります。 +`VITE_OCR_FONT_BASE_URL`、同梱の `ocr-fonts/` ディレクトリ、更新されたエアギャップ向けワークフローを含む完全な手順は[セルフホスティング](/ja/self-hosting/)を参照してください。 diff --git a/docs/ja/licensing.md b/docs/ja/licensing.md new file mode 100644 index 00000000..027b5580 --- /dev/null +++ b/docs/ja/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/ja/self-hosting/#wasm-の設定-agpl-コンポーネント) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/ja/self-hosting/apache.md b/docs/ja/self-hosting/apache.md new file mode 100644 index 00000000..69bbd342 --- /dev/null +++ b/docs/ja/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Apacheでデプロイする + +Apache HTTP Serverを使ってBentoPDFをホストします。 + +## 前提条件 + +- Apache 2.4+ +- mod_rewriteが有効 +- SSL証明書(推奨) + +## ステップ1:プロジェクトをビルドする + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +ブランディングをカスタマイズするには、ビルド前に環境変数を設定します。 + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## ステップ2:ファイルをコピーする + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## ステップ3:Apacheの設定 + +`/etc/apache2/sites-available/bentopdf.conf` を作成します。 + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## ステップ4:ルーティング用の.htaccess + +`/var/www/bentopdf/.htaccess` を作成します。 + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## ステップ5:必要なモジュールを有効にする + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## ステップ6:サイトを有効にする + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## サブディレクトリへのデプロイ + +`/pdf/` でホストするには: + +1. ベースURLを指定してビルドします。 + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. `.htaccess` を更新します。 + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## トラブルシューティング + +### WASMの404エラー + +MIMEタイプが設定されていることを確認してください。 + +```apache +AddType application/wasm .wasm +``` + +### PDFへ署名またはフォーム入力で空白のビューアが表示される(`.mjs` のMIMEエラー) + +ブラウザのコンソールに次のように表示される場合: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…かつ失敗しているリクエストが `.mjs` で終わる場合、Apacheの設定に `.mjs → application/javascript` の対応付けがありません。同梱のPDFビューアは拡張子 `.mjs` のESモジュールファイルを配布していますが、Apache標準の `mime.types` にはデフォルトで含まれていません。 + +VirtualHostまたは `.htaccess` に追加します。 + +```apache +AddType application/javascript .mjs +``` + +続いてApacheをリロードします。 + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +確認するには、ブラウザのDevToolsの「Network」タブで失敗している `.mjs` のリクエストを探し、レスポンスヘッダー `Content-Type` を確認します。`application/octet-stream` ではなく `application/javascript` になっているはずです。 + +### リライトが動作しない + +mod_rewriteが有効になっているか確認してください。 + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/ExcelからPDFへの変換が動作しない + +LibreOffice WASMには `SharedArrayBuffer` が必要で、次のヘッダーが求められます。 + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +セキュアコンテキストも必要です。ローカルでのテストでは `http://localhost` が使えますが、`http://192.168.x.x` などのLAN IPでは通常HTTPSが必要です。ヘッダーが設定されているのに `window.crossOriginIsolated` が `false` のままの場合は、ループバック以外のオリジンでページがプレーンなHTTPで開かれていないか確認してください。 + +事前圧縮された `.wasm.gz` と `.data.gz` ファイルにも、正しい `Content-Encoding` が必要です。 + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +`mod_headers` が有効になっていることを確認してください:`sudo a2enmod headers` + +### パーミッションエラー + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/ja/self-hosting/aws.md b/docs/ja/self-hosting/aws.md new file mode 100644 index 00000000..aa3cdd42 --- /dev/null +++ b/docs/ja/self-hosting/aws.md @@ -0,0 +1,200 @@ +# AWS S3 + CloudFrontにデプロイする + +最大限の制御とスケーラビリティを求めて、AWS上にBentoPDFをホストします。 + +## アーキテクチャ + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## ステップ1:S3バケットを作成する + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## ステップ2:ビルドしてアップロードする + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## ステップ3:CloudFrontディストリビューションを作成する + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +またはAWSコンソールを使います。 + +1. CloudFront → ディストリビューションを作成 に移動します +2. オリジンドメイン:S3バケットを選択します +3. 「Origin Access Control」を有効にします +4. デフォルトルートオブジェクト:`index.html` +5. ディストリビューションを作成します + +## ステップ3b:レスポンスヘッダーポリシー(LibreOffice WASMに必須) + +LibreOfficeベースの変換(Word、Excel、PowerPointからPDFへ)には `SharedArrayBuffer` が必要で、特定のレスポンスヘッダーが求められます。CloudFrontのレスポンスヘッダーポリシーを作成します。 + +1. CloudFront → ポリシー → レスポンスヘッダー に移動します +2. 次のヘッダーでカスタムポリシーを作成します。 + +| ヘッダー | 値 | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. ポリシーをディストリビューションのデフォルトキャッシュビヘイビアにアタッチします + +CLIを使う場合: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## ステップ3c:事前圧縮されたWASMファイルのS3メタデータ + +LibreOffice WASMファイルは事前圧縮されています(`.wasm.gz`、`.data.gz`)。ブラウザが展開できるように、正しいContent-TypeとContent-Encodingを設定します。 + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning 重要 +レスポンスヘッダーポリシーがないと `SharedArrayBuffer` が使えず、LibreOffice WASMの変換は約55%で止まります。`.gz` ファイルに正しいContent-Encodingがないと、ブラウザは生のgzipバイトを受け取り、WASMのコンパイルに失敗します。 +::: + +## ステップ4:S3バケットポリシー + +CloudFrontがバケットにアクセスできるようにします。 + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## ステップ5:カスタムエラーページ + +SPAのルーティングのため、404で `index.html` を返すように設定します。 + +1. CloudFront → エラーページ +2. カスタムエラーレスポンスを作成します。 + - HTTPエラーコード:404 + - レスポンスページのパス:`/index.html` + - HTTPレスポンスコード:200 + +## コストの目安 + +| リソース | 概算コスト | +| ----------------------- | ---------- | +| S3ストレージ(約500MB) | 約$0.01/月 | +| CloudFront(1TB転送) | 約$85/月 | +| CloudFront(10GB転送) | 約$0.85/月 | + +::: tip +アクセス頻度の低いファイルには、S3 Intelligent-Tieringを使うとコストを最適化できます。 +::: + +## Terraformによる自動化 + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/ja/self-hosting/cloudflare.md b/docs/ja/self-hosting/cloudflare.md new file mode 100644 index 00000000..345978c2 --- /dev/null +++ b/docs/ja/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Cloudflare Pagesにデプロイする + +[Cloudflare Pages](https://pages.cloudflare.com)は、帯域幅無制限で高速なグローバル静的サイトホスティングを提供します。 + +## クイックデプロイ + +1. [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages)に移動します +2. 「Create a project」をクリックします +3. GitHubリポジトリを接続します + +## ビルド設定 + +| 設定 | 値 | +| ------------------------ | --------------- | +| フレームワークプリセット | None | +| ビルドコマンド | `npm run build` | +| ビルド出力ディレクトリ | `dist` | +| ルートディレクトリ | `/` | + +## 環境変数 + +設定 → 環境変数 で次を追加します。 + +| 変数 | 値 | +| ----------------------- | ------------------------------------------ | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false`(任意) | +| `VITE_BRAND_NAME` | カスタムブランド名(任意) | +| `VITE_BRAND_LOGO` | `public/` からの相対ロゴパス(任意) | +| `VITE_FOOTER_TEXT` | カスタムのフッター/著作権テキスト(任意) | +| `VITE_DEFAULT_LANGUAGE` | デフォルトのUI言語、例:`fr`(任意) | + +## 設定ファイル + +`public` フォルダに `_headers` を作成します。 + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning 重要 +Word/ODT/Excel/PowerPointからPDFへの変換には、`Cross-Origin-Embedder-Policy` ヘッダーと `Cross-Origin-Opener-Policy` ヘッダーが必要です。これらがないと `SharedArrayBuffer` が使えず、LibreOffice WASMエンジンの初期化に失敗します。 +::: + +SPAのルーティング用に `_redirects` を作成します。 + +``` +/* /index.html 200 +``` + +## カスタムドメイン + +1. Pagesプロジェクトに移動します +2. 「Custom domains」をクリックします +3. ドメインを追加します +4. ドメインがCloudflareにある場合、CloudflareがDNSを自動設定します + +## メリット + +- **帯域幅無制限で無料** +- 300以上のエッジロケーションを持つ**グローバルCDN** +- **自動HTTPS** +- プルリクエストの**プレビューデプロイ** +- **高速なビルド** + +## トラブルシューティング + +### 大きなファイルのアップロード + +Cloudflare Pagesは最大25 MBのファイルに対応しています。WASMモジュールは問題ないはずですが、上限に達した場合は次を検討してください。 + +```bash +# Split large files during build +npm run build +``` + +### Workerのサイズ制限 + +高度なルーティングにCloudflare Workersを使う場合は、無料プランでは1 MBの制限がある点に注意してください。 + +## CORSプロキシWorker(デジタル署名用) + +デジタル署名ツールが証明書チェーンを取得するには、CORSプロキシが必要です。同梱のWorkerをデプロイします。 + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### セキュリティ機能 + +| 機能 | 説明 | +| ---------------------------- | ------------------------------ | +| **URL制限** | 証明書のURLのみ許可 | +| **ファイルサイズ制限** | 1リクエストあたり最大10MB | +| **レート制限** | 60リクエスト/IP/分(KVが必要) | +| **プライベートIPのブロック** | localhostと内部IPをブロック | + +### レート制限を有効にする + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### プロキシURLを指定してビルドする + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Dockerを使う場合: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **注:** HMAC署名の設定については[README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required)を参照してください。 diff --git a/docs/ja/self-hosting/cors-proxy.md b/docs/ja/self-hosting/cors-proxy.md new file mode 100644 index 00000000..2a72a55a --- /dev/null +++ b/docs/ja/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# 証明書取得用のCORSプロキシ + +デジタル署名ツールは、外部の認証局(CA)から発行者証明書を取得するためにCORSプロキシを使います。多くのCAサーバーはレスポンスにCORSヘッダーを含めないため、ブラウザから直接取得することができません。 + +さらに、多くのCAサーバーはプレーンなHTTPで証明書を提供しています。BentoPDFのインスタンスをHTTPSでホストしている場合、ブラウザはこれらのHTTPリクエストをブロックします(混合コンテンツポリシー)。CORSプロキシは、適切なヘッダーを付けたHTTPSエンドポイント経由でリクエストを中継することで、この2つの問題を解決します。 + +## 仕組み + +証明書でPDFに署名するとき: + +1. `zgapdfsigner` ライブラリが完全な証明書チェーンの構築を試みます +2. 証明書のAIA(Authority Information Access)拡張に埋め込まれたURLから、発行者証明書を取得します +3. これらのリクエストは、必要な `Access-Control-Allow-Origin` ヘッダーを追加するCORSプロキシ経由で送られます +4. プロキシが証明書データをブラウザに返します + +## CORSプロキシのセルフホスト + +BentoPDFをセルフホストしている場合、チェーンの取得が必要な証明書でデジタル署名を使うには、独自のCORSプロキシをデプロイする必要があります。 + +### オプション1:Cloudflare Workers(推奨) + +1. **Wrangler CLIをインストールする**: + + ```bash + npm install -g wrangler + ``` + +2. **Cloudflareにログインする**: + + ```bash + wrangler login + ``` + +3. **BentoPDFをクローンし、許可するオリジンを更新する**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + `cors-proxy-worker.js` を開き、`ALLOWED_ORIGINS` 配列を自分のドメインに変更します。 + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning 重要 + この変更をしないと、プロキシはサイトからのすべてのリクエストを **403 Forbidden** エラーで拒否します。デフォルトでは `bentopdf.com` からのリクエストのみ許可されています。 + ::: + +4. **プロキシをデプロイする**: + + ```bash + wrangler deploy + ``` + + WorkerのURL(例:`https://bentopdf-cors-proxy.your-subdomain.workers.dev`)を控えておきます。 + +5. **プロキシURLを指定してBentoPDFを再ビルドする**: + + Dockerを使う場合: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + ソースからビルドする場合: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### オプション2:独自のバックエンドプロキシ + +独自のプロキシエンドポイントを作ることもできます。要件は次のとおりです。 + +1. `url` クエリパラメータ付きのGETリクエストを受け付ける +2. サーバーからそのURLを取得する(サーバー側ではCORSの制限はありません) +3. 次のヘッダーを付けてレスポンスを返す: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Express.jsでの実装例: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## セキュリティ上の考慮事項 + +同梱のCloudflare Workerには、いくつかのセキュリティ対策があります。 + +| 機能 | 説明 | +| ---------------------------- | ------------------------------------------------------------------------------------------------- | +| **オリジン検証** | `ALLOWED_ORIGINS` に記載されたドメインからのリクエストのみ許可 | +| **URL制限** | 証明書のURL(`.crt`、`.cer`、`.pem`、`/certs/`、`/ocsp`、`/crl`)のみ許可 | +| **プライベートIPのブロック** | IPv4/IPv6のプライベート範囲、リンクローカル、ループバック、10進数IP、クラウドメタデータをブロック | +| **Content-Typeの安全性** | 安全な証明書のMIMEタイプのみ返し、上流のcontent-typeインジェクションをブロック | +| **ファイルサイズ制限** | レスポンスを10MBの上限でストリーミングし、超過するとダウンロード途中で中断 | +| **レート制限** | IPまたはIPv6 /64ごとに1分あたり60リクエスト(KVが必要、KVエラー時はフェイルオープン) | +| **HMAC署名** | 任意のクライアント側署名(気軽な悪用の抑止) | + +### DNSリバインディング(Cloudflare以外でのセルフホスト) + +このWorkerは、プライベートまたは内部のIPに解決されるURLをすべて拒否します。証明書チェーンのURLは、その証明書を発行したCA(FNMT、企業のCAなど)を指すため、ホストの固定許可リストは使えず、宛先を事前に把握できません。そのため、リバインディングの小さな隙が残ります。自分のドメインのDNSを運用する人が、安全性チェックには公開IPを、その直後の実際のリクエストにはプライベートIPを返す可能性があります。 + +Cloudflare上では、WorkersがプライベートIPや `169.254.169.254` のメタデータエンドポイントに到達できないため、悪用はできません。リバインドしても何にも届きません。ただし、Workerに侵入経路を与えないでください。Tunnel、Service、プライベートネットワークのバインディングはアタッチしないでください(必要なのは `RATE_LIMIT_KV` だけです)。 + +VPC内でCloudflare以外(workerdやNodeなど)で実行する場合、ランタイムは内部IPに到達*できてしまいます*。前段にエグレスファイアウォールを置き、プライベート範囲(`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`、`127.0.0.0/8`、`169.254.0.0/16`、およびそのIPv6相当)をブロックしてください。Cloudflareを離れると、アプリケーションコードではこれを強制できません。 + +## プロキシを無効にする + +CORSプロキシを使いたくない場合は、環境変数を空文字列に設定します。 + +``` +VITE_CORS_PROXY_URL= +``` + +**注**:プロキシがないと、外部からのチェーン取得が必要な証明書(FNMTや一部の企業CAなど)での署名は、「Failed to fetch」エラーで失敗します。 + +## トラブルシューティング + +### 「Signing error: TypeError: Failed to fetch」 + +通常は、次のいずれかを意味します。 + +1. **CORSプロキシが未設定**:`VITE_CORS_PROXY_URL` を設定して再ビルドしてください +2. **混合コンテンツがブロックされている**:サイトはHTTPSですが、証明書の発行者URLはHTTPです。CORSプロキシで解決できます。 +3. **CORSプロキシがオリジンを拒否している**:`cors-proxy-worker.js` の `ALLOWED_ORIGINS` 配列にドメインが含まれているか確認してください + +### プロキシからの「403 Forbidden」 + +ドメインが `ALLOWED_ORIGINS` リストに含まれていません。`cors-proxy-worker.js` を編集します。 + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +その後、再デプロイします:`npx wrangler deploy` + +### プロキシのテスト + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### プロキシなしで動作する証明書 + +一部の証明書はP12/PFXファイルに完全なチェーンを含んでおり、外部からの取得を必要としません。 + +- 自己署名証明書 +- 中間証明書をバンドルしている一部の商用CA +- 完全なチェーンを手動で組み立てた証明書 diff --git a/docs/ja/self-hosting/docker.md b/docs/ja/self-hosting/docker.md new file mode 100644 index 00000000..6777363e --- /dev/null +++ b/docs/ja/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Docker / Podmanでデプロイする + +本番環境でBentoPDFをセルフホストする最も簡単な方法です。 + +> [!IMPORTANT] +> **Officeファイル変換に必要なヘッダー** +> +> LibreOfficeベースのツール(Word、Excel、PowerPointの変換)が `SharedArrayBuffer` を使うには、次のHTTPヘッダーが必要です。 +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> ページはセキュアコンテキストから配信される必要もあります。ローカルでのテストでは `http://localhost` が使えますが、`http://192.168.x.x` などのLAN IPは通常これに該当しないため、ヘッダーが設定されていてもプレーンなHTTPではOffice変換が失敗します。 +> +> 公式のコンテナイメージにはこれらのヘッダーが含まれています。リバースプロキシ(Traefik、Caddyなど)を使う場合は、これらのヘッダーが保持されるか追加されるようにし、ループバック以外からのアクセスにはHTTPSを使ってください。 + +> [!TIP] +> **Podmanユーザー:** すべての `docker` コマンドは、`docker` を `podman` に、`docker-compose` を `podman-compose` に置き換えればPodmanでも動作します。 + +## クイックスタート + +> [!TIP] +> BentoPDFには2つのビルドがあります。 +> +> - **セルフホスト版ビルド**:`ghcr.io/alam00000/bentopdf-simple:latest`。マーケティング用の要素(ヒーロー、FAQ、お客様の声、フッター)**なし**で、すべてのPDFツールを備えています。社内・チーム・組織向けのデプロイに使います。機能を減らした「ライト」版では**ありません**。 +> - **商用版ビルド**:`ghcr.io/alam00000/bentopdf:latest`。マーケティングサイト全体を含み、bentopdf.com自体や、公開向けにデプロイする商用ライセンス保持者が使います。 +> +> 迷ったらセルフホスト版ビルドを取得してください。 + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +`docker-compose.yml` を作成します。 + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +実行します。 + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## 独自イメージをビルドする + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +ビルドして実行します。 + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## 環境変数 + +| 変数 | 説明 | デフォルト | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | セルフホスト版をビルドします(bentopdf.com のマーケティング要素であるヒーロー、FAQ、お客様の声、フッターを非表示にします)。すべてのPDFツールは残ります。 | `false` | +| `BASE_URL` | サブディレクトリへのデプロイ | `/` | +| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASMモジュールのURL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Ghostscript WASMモジュールのURL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | CoherentPDF WASMモジュールのURL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | OCRワーカースクリプトのURL | _(空。Tesseract.jsのデフォルトCDNを使用)_ | +| `VITE_TESSERACT_CORE_URL` | OCRコアランタイムのディレクトリ | _(空。Tesseract.jsのデフォルトCDNを使用)_ | +| `VITE_TESSERACT_LANG_URL` | OCR traineddataのディレクトリ | _(空。Tesseract.jsのデフォルトCDNを使用)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | UIに表示するOCR言語(カンマ区切り) | _(空。全カタログを表示)_ | +| `VITE_OCR_FONT_BASE_URL` | OCRテキストレイヤー用フォントのディレクトリ | _(空。リモートのNotoフォントURLを使用)_ | +| `VITE_DEFAULT_LANGUAGE` | デフォルトのUI言語 | `en` | +| `VITE_BRAND_NAME` | カスタムブランド名 | `BentoPDF` | +| `VITE_BRAND_LOGO` | `public/` からの相対ロゴパス | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | カスタムのフッター/著作権テキスト | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | 非表示にするツールID(カンマ区切り) | _(空。すべてのツールが有効)_ | +| `DISABLE_GITHUB_STARS` | ページ読み込み時のGitHubスター数の取得をスキップし、CSPから `api.github.com` を除外します。Simple Modeのビルドでは常にスキップされます。 | `false` | +| `SITE_URL` | canonical、hreflang、サイトマップのリンクに書き込まれる公開URL。検索エンジンにデプロイ先を独立したサイトとして扱わせたい場合を除き、デフォルトのままにしてください。 | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | カスタムの `SITE_URL` を使う場合、検索結果でbentopdf.comと競合しないよう、すべてのページが `noindex` になります。検索エンジンにインデックスさせるには `true` に設定します。 | `false` | + +WASMモジュールのURLには、CDNのデフォルトがあらかじめ設定されているため、高度な機能はすべてそのまま動作します。エアギャップ環境やセルフホスト環境では、これらを上書きしてください。 + +### 検索エンジン + +デフォルトでは、すべてのページが元のページとしてbentopdf.comを検索エンジンに示すため、デプロイ先が重複ページとして表示されることはありません。プライベートな環境や社内のインスタンスでは、何も変更する必要はありません。 + +- **インスタンスを検索結果にまったく表示させない:** コンテナを `-e ROBOTS_NOINDEX=true` で実行します。再起動だけで済み、再ビルドは不要です。 +- **インスタンスを検索結果で独立したサイトにする:** `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true` を付けてビルドします。`ALLOW_INDEXING=true` がないと、カスタムの `SITE_URL` ではすべてのページが `noindex` になります。 + +### Content-Security-Policy + +nginxイメージには、強制モードの `Content-Security-Policy` ヘッダーが含まれています。CSPの `script-src`、`connect-src`、`font-src` ディレクティブは、上記の `VITE_*` URL変数から**ビルド時に生成**されます。`--build-arg` で渡したホストは自動的にポリシーに追加されます。 + +そのため: + +- ビルド時に `VITE_CORS_PROXY_URL` や `VITE_WASM_*_URL` を上書きすると、CSPがそれらのオリジンを自動的に許可します。追加の設定は不要です。 +- `cdn.jsdelivr.net` 上のURLでは、`script-src` はCDN全体ではなく、バージョンまで含む正確なパッケージフォルダ(例:`https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`)だけを許可します。jsDelivrは公開されているあらゆるnpmパッケージやGitHubリポジトリを配信するため、ホスト全体を許可すると、そのどれもがインスタンス上で実行できてしまうからです。それ以外のホスト上のURLは、オリジン単位で許可されます。 +- アプリ内の詳細設定ページで、_実行時_ にカスタムのWASM URLを設定した場合、それらのオリジンはCSPに含まれないため、ブラウザはそれらへのフェッチをブロックします。ビルド時に設定したバージョンのみが許可されるため、`cdn.jsdelivr.net` 上の同じパッケージの別バージョンにも当てはまります。実行時の設定は試験用です。恒久的なカスタムURLには、対応する `VITE_*` のビルド引数を設定してください。 +- 3つの `VITE_WASM_*_URL` をすべて上書きしたエアギャップ環境のデプロイでは、それらの `cdn.jsdelivr.net` パッケージフォルダもCSPから削除されます(各デフォルトは追加ではなく置換されます)。`cdn.jsdelivr.net` 上のTesseract OCRのデフォルトは、3つの `VITE_TESSERACT_*` も設定するまでポリシーに残ります。同様に、`VITE_CORS_PROXY_URL` を設定すると、公開の `bentopdf-cors-proxy.bentopdf.workers.dev` というデフォルトが置き換えられます。 + +CSPの `script-src` に `'unsafe-eval'` が含まれているのは、LibreOffice WASMランタイム(Word/Excel/PowerPoint変換ツールで使用)とwasm-vips画像ライブラリ(PDFからTIFFで使用)が、`new Function()` で内部のディスパッチコードをコンパイルするためです。これを削除するとそれらのツールが動作しなくなります。`SIMPLE_MODE`(LibreOfficeなし)でビルドし、PDFからTIFFが不要な場合は、生成された `security-headers.conf` を手動で編集して `'unsafe-eval'` を外すことで、より厳格なポリシーにできます。 + +OCRでは、`VITE_TESSERACT_*` 変数を空のままにするとデフォルトのオンラインアセットを使い、セルフホスト/オフラインのOCRでは3つすべてを一緒に設定します。ワーカー、コアランタイム、traineddataディレクトリは対応している必要があるため、一部だけの上書きは拒否されます。完全オフラインで検索可能なPDFを出力するには、`VITE_OCR_FONT_BASE_URL` も設定して、OCRテキストレイヤー用フォントを公開のNotoフォントURLではなく社内サーバーから読み込むようにします。 + +`VITE_DEFAULT_LANGUAGE` は、初めて訪れたユーザーのUI言語を設定します。サポートされる値:`en`、`ar`、`be`、`fr`、`de`、`es`、`zh`、`zh-TW`、`vi`、`tr`、`id`、`it`、`pt`、`nl`、`da`。ユーザーは引き続き言語を切り替えられ、これは既定値を変えるだけです。 + +例: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### カスタムブランディング + +デフォルトのBentoPDFのロゴ、名前、フッターテキストを独自のものに置き換えます。ロゴファイルを `public/` フォルダに置く(または既存の画像を使う)、ビルド時にブランディング用の変数を渡します。 + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +ブランディングはフルモードとSimple Modeの両方で動作し、他のすべてのビルド時オプションと組み合わせられます。 + +### 特定のツールを無効にする + +コンプライアンスやセキュリティ要件に応じて、UIからツールを非表示にします。無効にしたツールは、ホームページ、検索結果、キーボードショートカット、ワークフロービルダーから削除されます。URLに直接アクセスすると「ツールは利用できません」ページが表示されます。 + +ツールIDは、ページURLから `.html` を除いたものです。たとえばツールが `bentopdf.com/edit-pdf.html` にある場合、IDは `edit-pdf` です。 + +#### ツールIDの調べ方 + +最も簡単な方法:BentoPDFで任意のツールを開き、URLを見ます。パスの最後の部分(`.html` を除く)がツールIDです。 + +
+ツールIDの完全な一覧 + +**編集と注釈:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**PDFに変換:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**PDFから変換:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**整理と管理:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**最適化と修復:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**セキュリティ:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### オプション1:ビルド時(Dockerのビルド引数) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +これにより、無効化リストがJavaScriptバンドルに組み込まれます。変更するには再ビルドが必要です。 + +#### オプション2:実行時(config.json) + +`config.json` ファイルを配信ディレクトリにマウントします。再ビルドは不要です。 + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Docker Composeを使う場合: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +両方の方法を組み合わせることもでき、その場合はリストが統合されます。どちらかに含まれるツールは無効になります。 + +#### エディタ機能を無効にする + +エディタツール全体を無効にせずに、PDFエディタ内の特定の機能(墨消し、注釈、フォームなど)だけを無効にすることもできます。`config.json` に `editorDisabledCategories` を追加します。 + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+エディタカテゴリの完全な一覧 + +**ズーム:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**注釈:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**図形:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**フォーム:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**墨消し:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**ドキュメント:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**ページ:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**パネル:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**ツール:** `tools`, `pan`, `pointer`, `capture` + +**選択:** `selection`, `selection-copy` + +**履歴:** `history`, `history-undo`, `history-redo` + +
+ +カテゴリは階層構造になっており、親(例:`annotation`)を無効にすると、その子もすべて無効になります。 + +### GitHubスターカウンターを無効にする + +ナビゲーションバーには、ページ読み込み時に `api.github.com` から取得するGitHubスター数のライブ表示があります。これはPDF機能とは無関係な、唯一の外部リクエストです。ビルド時に無効にすると、フェッチのコードがバンドルから取り除かれ、Content-Security-Policyから `api.github.com` も除外されます。 + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Modeのビルド(`bentopdf-simple`)では常にスターカウンターをスキップします。このフラグが必要なのは、商用版ビルドまたはカスタムのフルビルドの場合だけです。 + +### カスタムWASM URL(エアギャップ/セルフホスト) + +> [!IMPORTANT] +> WASMのURLは**ビルド時**にJavaScriptへ組み込まれます。WASMファイルは実行時に**ユーザーのブラウザ**がダウンロードするもので、Dockerはビルド中にダウンロードしません。エアギャップのネットワークでは、ブラウザから到達できる社内サーバーでWASMファイルをホストする必要があります。 + +**エアギャップ環境の完全なワークフロー:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +`bash scripts/prepare-airgap.sh --list-ocr-languages` で表示されるコード、または `bash scripts/prepare-airgap.sh --search-ocr-language ` で名前から検索したコードを、`--ocr-languages` に使います。OCR言語のサブセットを制限してビルドする場合は、同じコードを `VITE_TESSERACT_AVAILABLE_LANGUAGES` に渡し、アプリにバンドルされた言語だけが表示されるようにします。完全オフラインのOCR出力には、同梱の `ocr-fonts/` ディレクトリもホストし、`VITE_OCR_FONT_BASE_URL` をそこに向けてください。 + +変数を空文字列に設定すると、そのモジュールが無効になります(ユーザーは詳細設定から手動で設定する必要があります)。 + +## カスタムポート + +デフォルトでは、BentoPDFはコンテナ内のポート `8080` で待ち受けます。変更するには、実行時に `PORT` 環境変数を設定します。 + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| 変数 | 説明 | デフォルト | +| ------ | --------------------------------- | ---------- | +| `PORT` | コンテナ内のNginxの待ち受けポート | `8080` | + +これは標準のDockerfileとnonrootのDockerfileの両方で動作します。 + +## カスタムユーザーID(PUID/PGID) + +特定の非rootユーザーでの実行が必要な環境(NASデバイス、セキュリティコンテキストを使うKubernetes、組織のポリシーなど)向けに、BentoPDFはLSIO形式のPUID/PGIDに対応した別のDockerfileを提供しています。 + +### ビルドと実行 + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### 環境変数 + +| 変数 | 説明 | デフォルト | +| -------------- | ------------------------ | ---------- | +| `PUID` | 実行するユーザーID | `1000` | +| `PGID` | 実行するグループID | `1000` | +| `PORT` | Nginxの待ち受けポート | `8080` | +| `DISABLE_IPV6` | IPv6リスナーを無効にする | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### 仕組み + +コンテナはrootで起動し、指定されたPUID/PGIDでユーザーを作成して、書き込み可能なすべてのディレクトリの所有権を調整し、`su-exec` で権限を落とします。nginxプロセスは、指定したユーザーとして完全に実行されます。 + +> [!NOTE] +> 標準の `Dockerfile` は `nginx-unprivileged`(UID 101)を使い、ほとんどのデプロイで推奨されます。`Dockerfile.nonroot` は、特定のUID/GIDが必要な場合にのみ使ってください。 + +> [!WARNING] +> PUID/PGIDは `0`(root)にできません。エントリポイントが入力を検証し、無効な値の場合はエラーで終了します。 + +## Traefik(リバースプロキシ)との併用 + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Caddy(リバースプロキシ)との併用 + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## リソース制限 + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet(Systemd連携) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html)を使うと、Podmanコンテナをsystemdサービスとして実行できます。Linuxシステムでの本番デプロイに最適です。 + +### 基本的なQuadletのセットアップ + +コンテナユニットファイルを `~/.config/containers/systemd/bentopdf.container`(ユーザー)または `/etc/containers/systemd/bentopdf.container`(システム)に作成します。 + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### 有効化と起動 + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> システム全体にデプロイする場合は、`--user` フラグなしで `systemctl` を使い、ファイルを `/etc/containers/systemd/` に置いてください。 + +### ヘルスチェック付きのQuadlet + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Quadletによる自動更新 + +Podmanは、新しいイメージが利用可能になると、コンテナを自動的に更新できます。 + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadletのネットワーク設定 + +カスタムのネットワーク設定には、ネットワークファイル `bentopdf.network` を作成します。 + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +続いて、コンテナファイルでそれを参照します。 + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## 更新 + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/ja/self-hosting/hostinger.md b/docs/ja/self-hosting/hostinger.md new file mode 100644 index 00000000..d6ee5562 --- /dev/null +++ b/docs/ja/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Hostingerにデプロイする + +[Hostinger](https://hostinger.com)は人気のある共有ホスティングプロバイダーです。このガイドでは、Hostingerの共有ホスティングにBentoPDFをデプロイする方法を説明します。 + +## 前提条件 + +- ファイルマネージャーにアクセスできるHostingerのホスティングプラン +- ビルド用にローカルにインストールされたNode.js + +## ステップ1:プロジェクトをビルドする + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +ビルドされたファイルは `dist` フォルダに出力されます。 + +## ステップ2:Hostingerにアップロードする + +### ルートドメインへのデプロイ + +1. Hostingerのアカウントにログインします +2. **ファイルマネージャー** → **public_html** に移動します +3. 既存のファイルをすべて**削除**します(必要ならバックアップしてください) +4. ローカルの `dist` フォルダの中身をすべて `public_html` に**アップロード**します + +### サブディレクトリへのデプロイ + +サブディレクトリ(例:`yourdomain.com/pdf-tools/`)にデプロイする場合: + +1. 正しいベースURLを指定してビルドします。 + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Hostingerにフォルダを作成します。 + - **ファイルマネージャー** → **public_html** に移動します + - 新しいフォルダ `pdf-tools` を作成します +3. `dist` の中身をすべて `public_html/pdf-tools/` にアップロードします + +## ステップ3:.htaccessファイルを作成する + +デプロイ先フォルダのルート(`public_html` または `public_html/pdf-tools/`)に `.htaccess` ファイルを作成します。 + +::: warning 重要 +サブディレクトリにデプロイする場合は、`RewriteBase /` を `RewriteBase /pdf-tools/`(またはフォルダ名)に変更してください。 +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## サブディレクトリ用の.htaccessの例 + +`yourdomain.com/pdf-tools/` の場合は、次の行を更新します。 + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## トラブルシューティング + +### WASMファイルが読み込まれない + +`.htaccess` でMIMEタイプが正しく設定されていることを確認してください。 + +```apache +AddType application/wasm .wasm +``` + +### LibreOfficeツールが動作しない + +SharedArrayBufferにはセキュリティヘッダーが不可欠です。 + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +ヘッダーが適用されない場合は、Hostingerのサポートに連絡して `mod_headers` を有効にしてもらってください。 + +### ページを更新すると404エラーになる + +`.html` 拡張子のルールと言語ルートが正しく設定されていることを確認してください。BentoPDFはSPAのルーティングではなく、静的なHTMLファイルを使います。 + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### ファイルアップロードの上限 + +Hostingerにはファイルサイズの上限がある場合があります。一括アップロードに失敗する場合は、WASMファイルを別途アップロードしてください。 diff --git a/docs/ja/self-hosting/index.md b/docs/ja/self-hosting/index.md new file mode 100644 index 00000000..969e9ccf --- /dev/null +++ b/docs/ja/self-hosting/index.md @@ -0,0 +1,538 @@ +# セルフホスティングガイド + +BentoPDF は、自分のインフラでセルフホストできます。このガイドでは、さまざまなデプロイ方法を紹介します。 + +## Docker / Podman でクイックスタート + +BentoPDF をセルフホストする最も手早い方法です。 + +> [!TIP] +> BentoPDF には 2 種類のビルドがあります。 +> +> - **セルフホスト版ビルド**: `ghcr.io/alam00000/bentopdf-simple:latest`。マーケティング用の要素(ヒーロー、FAQ、お客様の声、フッター)**なし**で、すべての PDF ツールを利用できます。社内、チーム、組織向けのデプロイにはこちらを使ってください。機能を削減した「ライト」版では**ありません**。 +> - **商用版ビルド**: `ghcr.io/alam00000/bentopdf:latest`。マーケティングサイト全体を含み、bentopdf.com 自体や、一般公開向けのデプロイを行う商用ライセンス保有者が使用します。 +> +> 迷った場合は、セルフホスト版ビルドを取得してください。 + +> [!IMPORTANT] +> Office ファイルの変換には `SharedArrayBuffer` が必要です。そのため、アプリはクロスオリジン分離され、かつセキュアコンテキストから配信される必要があります。公式イメージは必要な COOP/COEP ヘッダーをすでに送信していますが、`http://192.168.x.x` のようなプレーン HTTP のローカルネットワークオリジンでは、ブラウザーが `SharedArrayBuffer` を無効にします。 +> +> `http://localhost` は、同じデバイス上でのテストにのみ使用してください。ユーザーが LAN の IP やホスト名で BentoPDF にアクセスする場合は、HTTPS で終端してください。 + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +または、Docker Compose / Podman Compose を使います。 + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet(Linux Systemd) + +BentoPDF を systemd サービスとして実行します。`~/.config/containers/systemd/bentopdf.container` を作成します。 + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Quadlet の詳しいドキュメントは、[Docker デプロイガイド](/ja/self-hosting/docker)を参照してください。 + +## ソースからビルドする + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## 設定オプション + +### セルフホスト版ビルド(シンプルモード) + +セルフホスト版ビルド(`bentopdf-simple` イメージ。シンプルモードとも呼ばれます)は、商用版ビルドと**機能的に同一**です。すべての PDF ツールが含まれ、同じように動作します。bentopdf.com 自体や、商用の一般公開向けデプロイでのみ意味を持つマーケティング用の要素を非表示にしているだけです。**機能を削減した「ライト」版ではありません。** + +**セルフホスト版ビルドで非表示になるもの**(見た目のみで、PDF 機能は削除されません): + +- ナビゲーションバー、ヒーローセクション、機能セクション、FAQ、お客様の声、フッター +- ページタイトルが「PDFツール」に更新されます + +**セルフホスト版ビルドで維持されるもの**(実際に PDF の処理を行うすべて): + +- すべての PDF ツール(結合、分割、編集、署名、OCR、Office 変換など) +- カスタムブランディングのサポート、すべてのビルド時および実行時の設定 + +商用版ビルド(`ghcr.io/alam00000/bentopdf:latest`)は bentopdf.com 自体を動かしているもので、一般公開向けのデプロイを行う商用ライセンス保有者が使用します。社内ツールでは意味をなさない、ヒーロー、FAQ、お客様の声、フッターが追加されています。 + +チーム、組織、または社内ツールとして BentoPDF をセルフホストする場合は、セルフホスト版ビルドを取得してください。 + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +詳細は [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) を参照してください。 + +### 商用版ビルド(独自ブランドでの一般公開向けデプロイ) + +商用版ビルド(`bentopdf` イメージ。`-simple` サフィックスなし)は、bentopdf.com 自体を動かしているものです。すべての PDF ツールに加えて、マーケティングサイト全体(ヒーロー、機能、FAQ、お客様の声、フッター)が含まれます。**BentoPDF を独自ブランドの一般公開向け PDF サービスとしてデプロイ**したい場合に、このビルドを使用します。たとえば次のようなケースです。 + +- 自分のドメインで、エンドユーザー向けのホスト型 SaaS として BentoPDF を運用する +- ツールだけでなく、ランディングページの体験(マーケティングセクション + ツール)が欲しい +- 商用ライセンス保有者として、商用製品に BentoPDF を組み込む + +**そのまま実行する**(BentoPDF のブランディングのまま。ビルドのプレビューに便利です): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**独自のブランドでビルドする**(典型的な商用ワークフロー): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +その他のビルド時オプション(`BASE_URL`、`VITE_DEFAULT_LANGUAGE`、`DISABLE_TOOLS`、WASM URL の上書きなど)も、セルフホスト版ビルドと同じように使えます。 + +::: warning ライセンス +商用版ビルドの実行は、BentoPDF の 2 つのライセンスオプションのどちらでも許可されています。 + +- **AGPL-3.0**(無料): ブランディングの変更や周辺のビジネスロジックを含め、デプロイのソースコード全体を AGPL の下で公開する場合に許可されます。 +- **商用ライセンス**($79 の買い切り): ブランディングのフォークやビジネスコードをオープンソース化しない、クローズドソース/プロプライエタリなデプロイに必要です。 + +詳しい比較は[ライセンスのページ](https://www.bentopdf.com/licensing)を参照してください。AGPL ライセンスの WASM モジュール(PyMuPDF、Ghostscript、CoherentPDF)は実行時に CDN から読み込まれるため、イメージには含まれず、ライセンス上の立場も変わりません。 +::: + +### ベース URL + +サブディレクトリにデプロイします。 + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### カスタムブランディング + +デフォルトの BentoPDF のロゴ、名前、フッターテキストを、ビルド時に独自のものへ置き換えます。 + +| 変数 | 説明 | デフォルト | +| ------------------ | ---------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | ヘッダーとフッターに表示されるブランド名 | `BentoPDF` | +| `VITE_BRAND_LOGO` | `public/` からの相対ロゴパス | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | カスタムのフッター/著作権テキスト | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +または Docker を使います。 + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +ブランディングはフルモードとシンプルモードの両方で機能し、他のすべてのビルド時オプション(`BASE_URL`、`SIMPLE_MODE`、`VITE_DEFAULT_LANGUAGE`)と組み合わせられます。 + +### 特定のツールを無効にする + +コンプライアンスやセキュリティのために、個別のツールを非表示にします。無効にしたツールは、ホームページ、検索、ショートカット、ワークフロービルダー、直接の URL アクセスから削除されます。 + +ツール ID は、`.html` を除いたページの URL です。任意のツールを開いて URL を確認してください(例: `edit-pdf`、`sign-pdf`、`encrypt-pdf`)。 + +**ビルド時**(バンドルに組み込まれます): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**実行時**(再ビルド不要。`config.json` をマウントします): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +両方の方法を組み合わせることもできます。リストはマージされます。 + +PDF エディタ内の特定の機能(例: 墨消し)だけを、ツール全体を無効にせずに無効にすることもできます。`config.json` に `editorDisabledCategories` を追加します。カテゴリーの一覧は [Docker ガイド](/ja/self-hosting/docker#エディタ機能を無効にする)を参照してください。 + +## デプロイガイド + +プラットフォームを選んでください。 + +- [Vercel](/ja/self-hosting/vercel) +- [Netlify](/ja/self-hosting/netlify) +- [Cloudflare Pages](/ja/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/ja/self-hosting/aws) +- [Hostinger](/ja/self-hosting/hostinger) +- [Nginx](/ja/self-hosting/nginx) +- [Apache](/ja/self-hosting/apache) +- [Docker](/ja/self-hosting/docker) +- [Kubernetes](/ja/self-hosting/kubernetes) +- [CORS Proxy](/ja/self-hosting/cors-proxy) - デジタル署名に必要です + +## よくある問題 + +### Word / ODT / Excel / PowerPoint から PDF への変換がハングする(SharedArrayBuffer が利用できない) + +**症状**: LibreOffice ベースの文書変換(Word、ODT、Excel、PowerPoint から PDF)が約 55% で止まる、または開始できません。ブラウザーのコンソールに次のように表示されることがあります。 + +> `ReferenceError: SharedArrayBuffer is not defined` + +…または、`window.crossOriginIsolated` が `false` を返す、あるいは WASM のコンパイルで `expected magic word 00 61 73 6d, found 1f 8b 08 08` と報告されます。 + +**原因**: LibreOffice WASM には `SharedArrayBuffer` が必要で、ブラウザーはページが**クロスオリジン分離**され、かつ**セキュアコンテキスト**から配信されている場合にのみ、これを有効にします。つまり、次の 2 つの条件を満たす必要があります。 + +1. すべてのレスポンスに、次の両方のヘッダーが含まれていること。 + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. ページが `https://...` または `http://localhost` から配信されていること。LAN IP(例: `http://192.168.x.x`)上のプレーン HTTP はセキュアとは見なされず、ブラウザーはそこで `SharedArrayBuffer` を無効にします。 + +`00 61 73 6d / 1f 8b 08 08` の不一致は別のサブ症状です。事前圧縮された `.wasm.gz` / `.data.gz` ファイルに `Content-Encoding: gzip` レスポンスヘッダーがないため、ブラウザーは展開された WASM ではなく、生の gzip バイト列を受け取っています。 + +**対処法**: 正確な設定は、各プラットフォームのデプロイガイドを参照してください。 + +- [Nginx →](/ja/self-hosting/nginx#word-odt-excel-から-pdf-への変換が動作しない) +- [Apache →](/ja/self-hosting/apache#word-odt-excelからpdfへの変換が動作しない) +- [AWS S3 + CloudFront →](/ja/self-hosting/aws#ステップ3b-レスポンスヘッダーポリシー-libreoffice-wasmに必須) +- [Cloudflare Pages →](/ja/self-hosting/cloudflare#設定ファイル)(`_headers` ファイル) +- [Netlify →](/ja/self-hosting/netlify#word-odt-excel-から-pdf-への変換が-55-で止まる)(`netlify.toml`) +- [Vercel →](/ja/self-hosting/vercel#word-odt-excel-から-pdf-への変換が動作しない)(`vercel.json`) +- [Hostinger →](/ja/self-hosting/hostinger#libreofficeツールが動作しない)(`.htaccess`) +- [Kubernetes →](/ja/self-hosting/kubernetes#sharedarraybuffer-ヘッダーが引き続き機能することを確認する-ingress-gateway) +- **Docker**: 同梱の nginx 設定によって自動的に処理されるため、操作は不要です。 + +**確認**: 任意の BentoPDF ページで DevTools のコンソールを開き、次を実行します。 + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +ページが HTTPS または `http://localhost` で、かつすべてのレスポンスに COEP/COOP ヘッダーが含まれていれば、両方のチェックに合格します。`http://192.168.x.x` などのループバック以外の HTTP オリジンを使っている場合は、HTTPS で終端してください。ヘッダーだけで解決する方法はありません。 + +### `.mjs` ファイルが `application/octet-stream` として配信される + +**症状**: PDFへ署名 / Form Filler など一部のツールで、ビューアが空白になる、または読み込みに失敗します。ブラウザーのコンソールに次のように表示されます。 + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**原因**: Web サーバーまたはリバースプロキシに、`.mjs` ファイル(内蔵の PDF ビューアは、この拡張子で ES モジュールを同梱しています)の MIME タイプのマッピングがありません。多くの標準的なサーバー設定では、認識できない拡張子はデフォルトで `application/octet-stream` になり、ブラウザーはそれを ES モジュールとして実行することを拒否します。 + +**対処法**: 正確なスニペットは、各プラットフォームのデプロイガイドを参照してください。 + +- [Nginx →](/ja/self-hosting/nginx#pdfへ署名-または-form-filler-で空白のビューアが表示される-mjs-の-mime-エラー) +- [Apache →](/ja/self-hosting/apache#pdfへ署名またはフォーム入力で空白のビューアが表示される-mjs-のmimeエラー) +- [AWS S3 + CloudFront →](/ja/self-hosting/aws#ステップ2-ビルドしてアップロードする)(`aws s3 cp ... --include "*.mjs"` を参照) +- [Kubernetes →](/ja/self-hosting/kubernetes#mjs-の-mime-タイプエラー-pdfへ署名-form-filler-の-iframe-が空白になる) +- **Docker、Vercel、Netlify、Cloudflare Pages、Hostinger**: 自動的に処理されるため、操作は不要です。 + +**確認**: DevTools → Network タブを開き、失敗している `.mjs` リクエストを見つけて、`Content-Type` レスポンスヘッダーを確認します。`application/javascript` になっているはずです。それでも `application/octet-stream` の場合は、外側のリバースプロキシや CDN がタイプを再判定している可能性があります。配信経路の各層を確認してください。 + +## WASM の設定(AGPL コンポーネント) + +BentoPDF は、AGPL ライセンスの処理ライブラリをソースコードに**同梱していません**が、すべての機能がそのまま動作するよう、CDN の URL を**あらかじめ設定**しています。手動での設定は不要です。 + +::: tip デフォルトでゼロコンフィグ +v2.0.0 以降、WASM モジュールは環境変数によって jsDelivr CDN から読み込まれるようあらかじめ設定されています。すべての高度な機能は、ユーザーが何も設定しなくてもすぐに使えます。 +::: + +| コンポーネント | ライセンス | 機能 | +| --------------- | ---------- | ---------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS の変換、画像の抽出、表の抽出 | +| **Ghostscript** | AGPL-3.0 | PDF/A 変換、圧縮、傾き補正、ラスタライズ | +| **CoherentPDF** | AGPL-3.0 | 目次、添付ファイル、しおり付きの PDF 結合 | + +### デフォルトの環境変数 + +これらは `.env.production` に設定され、ビルドに組み込まれます。 + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### WASM URL を上書きする + +カスタムデプロイでは、ビルド時にデフォルトを上書きできます。 + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +モジュールを完全に無効にするには(詳細設定からユーザーが手動で設定する必要があります)、その変数を空文字列に設定します。 + +OCR の場合は、すべての `VITE_TESSERACT_*` 変数を空のままにしてデフォルトのオンラインアセットを使うか、セルフホスト/オフライン OCR 用に worker/core/lang の URL をまとめて設定します。特定の OCR 言語のみをバンドルする場合は、`VITE_TESSERACT_AVAILABLE_LANGUAGES` にも同じカンマ区切りのコードを設定してください。これにより、UI にはインストール済みの言語のみが表示され、サポートされていない選択は説明付きのエラーで失敗します。完全オフラインで検索可能な PDF を出力するには、バンドルされた OCR フォントを配信する社内ディレクトリを `VITE_OCR_FONT_BASE_URL` にも設定してください。 + +ユーザーは、UI の **詳細設定** からいつでもこれらのデフォルトを上書きできます。ブラウザーに保存されたユーザーの上書き設定は、環境のデフォルトより優先されます。 + +### エアギャップ / オフラインデプロイ + +インターネットにアクセスできないネットワーク(政府、医療、金融など)向けです。WASM の URL は**ビルド時に** JavaScript へ組み込まれ、実際の WASM ファイルは実行時に**ユーザーのブラウザー**がダウンロードします。そのため、インターネットに接続できるマシンですべてを準備してから、隔離されたネットワークへ転送する必要があります。 + +#### 自動化スクリプト(推奨) + +付属の `prepare-airgap.sh` スクリプトが、WASM パッケージのダウンロード、Docker イメージのビルド、セットアップスクリプト付きの自己完結型バンドルの作成まで、プロセス全体を自動化します。 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +これにより、次のバンドルディレクトリが作成されます。 + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +USB、社内のアーティファクトリポジトリ、または承認された方法で、バンドルをエアギャップネットワークに転送します。その後、付属のセットアップスクリプトを実行します。 + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +セットアップスクリプトは、Docker イメージの読み込み、WASM ファイルの展開を行い、必要に応じてコンテナーを起動します。 + +**スクリプトのオプション:** + +| フラグ | 説明 | デフォルト | +| ------------------------------ | ------------------------------------------------------------------- | ---------------------------------------------- | +| `--wasm-base-url ` | WASM を社内でホストする場所 | _(必須。指定がない場合は入力を求められます)_ | +| `--image-name ` | Docker イメージのタグ | `bentopdf` | +| `--output-dir ` | 出力するバンドルのディレクトリ | `./bentopdf-airgap-bundle` | +| `--simple-mode` | シンプルモードを有効にする | オフ | +| `--base-url ` | サブディレクトリのベース URL(例: `/pdf/`) | `/` | +| `--language ` | デフォルトの UI 言語(例: `fr`、`de`) | _(なし)_ | +| `--brand-name ` | カスタムのブランド名 | _(なし)_ | +| `--brand-logo ` | `public/` からの相対ロゴパス | _(なし)_ | +| `--footer-text ` | カスタムのフッターテキスト | _(なし)_ | +| `--ocr-languages ` | バンドルする OCR 言語(カンマ区切り) | `eng` | +| `--list-ocr-languages` | サポートされている OCR コードと名前を表示して終了する | オフ | +| `--search-ocr-language ` | 名前または略称で OCR コードを検索する | オフ | +| `--dockerfile ` | 使用する Dockerfile | `Dockerfile` | +| `--skip-docker` | Docker のビルドとエクスポートをスキップする | オフ | +| `--skip-wasm` | WASM のダウンロードをスキップする(既存の `.tgz` ファイルを再利用) | オフ | + +対話式のプロンプトでは `list` と入力すると、サポートされているすべての Tesseract コードの一覧を表示でき、`search ` で一致するコードを検索できます(例: `search german`、`search chi`)。 + +::: warning 同一オリジンの要件 +WASM ファイルは、BentoPDF アプリと**同じオリジン**から配信する必要があります。Web ワーカーは `importScripts()` を使用しますが、これはスクリプトをクロスオリジンで読み込めません。たとえば、BentoPDF が `https://internal.example.com` で動作している場合、WASM のベース URL も `https://internal.example.com/wasm` にする必要があります。 +::: + +#### 手動の手順 + +
+スクリプトを使わずに手動で行う場合 + +**ステップ 1: WASM と OCR のパッケージをダウンロードする**(インターネットに接続できるマシンで) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**ステップ 2: 社内 URL を指定して Docker イメージをビルドする** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**ステップ 3: Docker イメージをエクスポートする** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**ステップ 4: エアギャップネットワークへ転送する** + +USB、社内のアーティファクトリポジトリ、または承認された転送方法でコピーします。 + +- `bentopdf.tar`: Docker イメージ +- ステップ 1 の 5 つの `.tgz` WASM/OCR パッケージ +- ステップ 1 の `tesseract-langdata/` ディレクトリ +- ステップ 1 の `ocr-fonts/` ディレクトリ + +**ステップ 5: エアギャップネットワーク内でセットアップする** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +ステップ 2 で設定した URL でファイルにアクセスできることを確認してください。`.../ocr/worker.min.js`、`.../ocr/core`、`.../ocr/lang-data`、`.../ocr/fonts` も含まれます。 + +
+ +::: info Docker ではなくソースからビルドする場合 +`npm run build` を実行する前に、`.env.production` に変数を設定します。 + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### 独自の WASM プロキシをホストする + +AGPL の WASM ファイルを適切な CORS ヘッダー付きで配信する必要がある場合は、シンプルなプロキシをデプロイできます。実装例は [Cloudflare WASM Proxy ガイド](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md)を参照してください。 + +::: tip なぜ分離しているのか +この分離により、次のことが保証されます。 + +- 商用ユーザーにとって明確な法令遵守 +- BentoPDF のコアがデュアルライセンス(AGPL-3.0 / 商用)のまま維持されること +- WASM ファイルはソースにバンドルされるのではなく、実行時に読み込まれること + ::: + +## システム要件 + +| 要件 | 最小 | +| ---------- | -------------------------------------- | +| ストレージ | 約 100 MB(AGPL モジュールを除くコア) | +| RAM | 512 MB | +| CPU | 最近のプロセッサー | + +::: tip +BentoPDF は静的サイトです。データベースやバックエンドサーバーは不要です! +::: diff --git a/docs/ja/self-hosting/kubernetes.md b/docs/ja/self-hosting/kubernetes.md new file mode 100644 index 00000000..48cb7be5 --- /dev/null +++ b/docs/ja/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Kubernetes でデプロイする + +静的サイトに Kubernetes は大げさかもしれませんが、すでに Helm + GitOps で標準化している場合には最適な選択肢になり得ます。 + +> [!IMPORTANT] +> **Office ファイル変換に必要なヘッダー** +> +> LibreOffice ベースのツール(Word、Excel、PowerPoint の変換)には、`SharedArrayBuffer` を使うために次の HTTP ヘッダーが必要です。 +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 公式の BentoPDF nginx イメージにはこれらのヘッダーが含まれています。Kubernetes では **Ingress/Gateway コントローラーもリバースプロキシ**であるため、これらのヘッダーが保持されるようにするか、エッジで追加してください。 + +## 前提条件 + +- Kubernetes クラスター +- Helm v3 +- **ポート 8080** で配信する BentoPDF の nginx イメージ(例: `ghcr.io/alam00000/bentopdf:`) + +## Helm でデプロイする + +### このリポジトリからインストールする(ローカルチャート) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### GHCR からインストールする(OCI チャート) + +チャートが OCI アーティファクトとして GHCR に公開されている場合: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## 公開する + +### ポートフォワード(簡易テスト) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress(任意) + +Ingress を有効にします(nginx-ingress の例)。 + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API(任意) + +このチャートは、Gateway API の `Gateway` と `HTTPRoute` に対応しています。 + +例(Cloudflare Gateway API operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## SharedArrayBuffer ヘッダーが引き続き機能することを確認する(Ingress/Gateway) + +### 本来の動作 + +BentoPDF の nginx 設定が、必要なレスポンスヘッダーを設定します。ほとんどの Ingress/Gateway コントローラーは、**アップストリームのレスポンスヘッダーをそのまま通過させます**。 + +### 動作しなくなる原因 + +- レスポンスヘッダーを**上書き**または**削除**するコントローラー/エッジのポリシー +- 異なる COOP/COEP の値を設定する「セキュリティヘッダー」ミドルウェア + +### 確認方法 + +公開エンドポイントに対して次を実行します。 + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +次のように表示されるはずです。 + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Ingress コントローラーがヘッダーを保持しない場合 + +エッジ(コントローラー固有の方法)でヘッダーを追加します。**nginx-ingress** の例: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` の MIME タイプエラー(PDFへ署名 / Form Filler の iframe が空白になる) + +ブラウザーのコンソールに、`.mjs` リクエストに対して `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` と表示される場合、BentoPDF の nginx の前段にある Ingress/Gateway コントローラーが、アップストリームの `Content-Type` ヘッダーを `application/octet-stream` に置き換えています。 + +BentoPDF イメージの nginx は、すでに `.mjs` を `application/javascript` として配信しています。修正方法は、コントローラーによる削除や置き換えを止めることです。nginx-ingress の場合: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +または、Gateway API の `ResponseHeaderModifier` フィルターを使って、`.mjs` パスに `Content-Type: application/javascript` を設定します。DevTools → Network タブで確認してください。失敗していた `.mjs` リクエストに `content-type: application/javascript` と表示されるはずです。 + +### Gateway API を使っていて、ヘッダーを強制的に追加したい場合 + +Gateway API は `ResponseHeaderModifier` フィルターに対応しています。`httpRoute.rules[*].filters` に追加できます。 + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +対応するフィルターは Gateway コントローラーによって異なります。フィルターが無視される場合は、代わりにエッジ/コントローラー層でヘッダーを追加してください。 + +## 特定のツールを無効にする + +ConfigMap を使うと、イメージを再ビルドせずに、実行時にツールを無効にできます。 + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +配信されるディレクトリにマウントします。 + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +ツール ID は、`.html` を除いたページの URL です。任意のツールを開いて URL を確認してください(例: `edit-pdf`、`merge-pdf`、`compress-pdf`)。無効にしたツールは、ホームページ、検索、ショートカット、ワークフロービルダー、直接の URL アクセスから非表示になります。すべてのオプションについては、[Docker ガイド](/ja/self-hosting/docker#特定のツールを無効にする)を参照してください。 diff --git a/docs/ja/self-hosting/netlify.md b/docs/ja/self-hosting/netlify.md new file mode 100644 index 00000000..2fca1ddf --- /dev/null +++ b/docs/ja/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Netlify にデプロイする + +[Netlify](https://netlify.com) は、手厚い無料枠を備えた優れた静的サイトホスティングを提供しています。 + +## ワンクリックデプロイ + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## 手動デプロイ + +### ステップ 1: リポジトリを接続する + +1. [Netlify](https://app.netlify.com) にログインします +2. 「Add new site」→「Import an existing project」をクリックします +3. GitHub アカウントを接続します +4. BentoPDF のフォークを選択します + +### ステップ 2: ビルド設定を行う + +| 設定 | 値 | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### ステップ 3: デプロイする + +「Deploy site」をクリックして、ビルドが完了するのを待ちます。 + +## 設定ファイル + +プロジェクトのルートに `netlify.toml` を作成します。 + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning 重要 +Word/ODT/Excel/PowerPoint から PDF への変換には、`Cross-Origin-Embedder-Policy` と `Cross-Origin-Opener-Policy` ヘッダーが必要です。これらがないと `SharedArrayBuffer` が使えず、LibreOffice WASM エンジンの初期化に失敗します。 + +`.wasm.gz` と `.data.gz` ファイルの `Content-Encoding: gzip` ヘッダーは、ブラウザーにそれらを自動的に展開させるためのものです。これがないと、ブラウザーは生の gzip バイト列を受け取り、WASM のコンパイルに失敗します。 +::: + +## 環境変数 + +Site settings → Environment variables で設定します。 + +| 変数 | 説明 | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | 最小構成のビルドにするには `true` を設定します | +| `VITE_BRAND_NAME` | カスタムブランド名("BentoPDF" を置き換えます) | +| `VITE_BRAND_LOGO` | `public/` からの相対ロゴパス(例: `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | カスタムのフッター/著作権テキスト | +| `VITE_DEFAULT_LANGUAGE` | デフォルトの UI 言語(例: `fr`、`de`、`es`) | + +## カスタムドメイン + +1. Site settings → Domain management に移動します +2. 「Add custom domain」をクリックします +3. 表示される DNS の設定手順に従います + +## ラージメディア + +大きな WASM ファイルには、[Netlify Large Media](https://docs.netlify.com/large-media/overview/) の有効化を検討してください。 + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## トラブルシューティング + +### Word/ODT/Excel から PDF への変換が 55% で止まる + +文書の変換が 55% で止まる場合は、DevTools のコンソールを開いて次を確認します。 + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +`crossOriginIsolated` が `false` の場合、`netlify.toml` の COEP/COOP ヘッダーが適用されていません。ファイルがプロジェクトのルートにあることを確認して、再デプロイしてください。 + +コンソールに `expected magic word 00 61 73 6d, found 1f 8b 08 08` と表示される場合は、`.wasm.gz` ファイルに `Content-Encoding: gzip` ヘッダーがありません。`soffice.wasm.gz` と `soffice.data.gz` 用の `[[headers]]` ブロックが `netlify.toml` に含まれていることを確認してください。 + +### ビルドが失敗する + +Node のバージョンの互換性を確認します。 + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### 初回の読み込みが遅い + +Site settings → Build & deploy → Asset optimization で、アセットの最適化を有効にします。 diff --git a/docs/ja/self-hosting/nginx.md b/docs/ja/self-hosting/nginx.md new file mode 100644 index 00000000..d1820c00 --- /dev/null +++ b/docs/ja/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Nginx でデプロイする + +Nginx を使って、BentoPDF を自分のサーバーでホストします。 + +## 前提条件 + +- Ubuntu/Debian サーバー +- Nginx がインストール済みであること +- SSL 証明書(推奨: Let's Encrypt) + +## ステップ 1: プロジェクトをビルドする + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +ブランディングをカスタマイズするには、ビルド前に環境変数を設定します。 + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## ステップ 2: ファイルをコピーする + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## ステップ 3: Nginx の設定 + +`/etc/nginx/sites-available/bentopdf` を作成します。 + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## ステップ 4: サイトを有効にする + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## ステップ 5: Let's Encrypt による SSL + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## サブディレクトリへのデプロイ + +`/pdf/` でホストするには、次のようにします。 + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +ビルドは次のコマンドで行います。 + +```bash +BASE_URL=/pdf/ npm run build +``` + +## パフォーマンスチューニング + +`nginx.conf` に追加します。 + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## トラブルシューティング + +### WASM が読み込まれない + +MIME タイプが設定されていることを確認します。 + +```nginx +types { + application/wasm wasm; +} +``` + +### PDFへ署名 または Form Filler で空白のビューアが表示される(`.mjs` の MIME エラー) + +ブラウザーのコンソールに次のように表示される場合: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…かつ失敗しているリクエストが `.mjs` で終わっている場合、お使いの nginx に `.mjs → application/javascript` のマッピングがありません。内蔵の PDF ビューア(PDFへ署名、Form Filler、その他いくつかのツールで使用)は `.mjs` 拡張子の ES モジュールファイルを同梱していますが、nginx の標準の `mime.types` にはデフォルトで含まれていません。 + +`/etc/nginx/mime.types` にある既存の `application/javascript` の行に `mjs` を追加して修正します。 + +```nginx +application/javascript js mjs; +``` + +> `application/javascript` の行を*もう 1 行*追加しないでください。nginx は `mime.types` を 1 行ずつ解析し、拡張子との対応付けは 1 つの型につき 1 つしか有効にならないため、バージョンによっては 2 行目が黙って無視されます。既存の行を編集して、`js` の隣に `mjs` を追加してください。 + +または、server ブロック内でローカルに上書きします(グローバルなファイルの編集は不要です)。 + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +変更後に nginx をリロードします。 + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +確認するには、ブラウザーの DevTools → Network タブで失敗している `.mjs` リクエストを見つけ、`Content-Type` レスポンスヘッダーを確認します。`application/octet-stream` ではなく `application/javascript` になっているはずです。 + +### Word/ODT/Excel から PDF への変換が動作しない + +LibreOffice WASM には `SharedArrayBuffer` が必要で、そのためには `Cross-Origin-Embedder-Policy` と `Cross-Origin-Opener-Policy` ヘッダーが必要です。セキュアコンテキストも必要なため、`http://localhost` はローカルでのテストには使えますが、`http://192.168.x.x` などの LAN IP では通常 HTTPS が必要です。なお、`location` ブロック内の nginx の `add_header` ディレクティブは、server レベルの `add_header` ディレクティブを**上書き**します。マージはされません。独自の `add_header` を持つすべての `location` ブロックに、COEP/COOP ヘッダーを含める必要があります。 + +次のコマンドで確認します。 + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +nginx の前段にリバースプロキシがある場合は、それらのヘッダーが保持されていることを確認してください。 + +### 502 Bad Gateway + +Nginx のエラーログを確認します。 + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/ja/self-hosting/vercel.md b/docs/ja/self-hosting/vercel.md new file mode 100644 index 00000000..308cd694 --- /dev/null +++ b/docs/ja/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Vercel にデプロイする + +[Vercel](https://vercel.com) は、静的サイトを最も簡単にデプロイできるサービスです。 + +## ワンクリックデプロイ + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## 手動デプロイ + +### ステップ 1: リポジトリをフォークする + +[bentopdf/bentopdf](https://github.com/alam00000/bentopdf) を自分の GitHub アカウントにフォークします。 + +### ステップ 2: Vercel にインポートする + +1. [vercel.com/new](https://vercel.com/new) にアクセスします +2. フォークしたリポジトリを選択します +3. プロジェクトを設定します。 + +| 設定 | 値 | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### ステップ 3: 環境変数(任意) + +必要に応じて、次の変数を追加します。 + +| 変数 | 説明 | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | 最小限の UI にするには `true` を設定します | +| `VITE_BRAND_NAME` | カスタムブランド名("BentoPDF" を置き換えます) | +| `VITE_BRAND_LOGO` | `public/` からの相対ロゴパス(例: `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | カスタムのフッター/著作権テキスト | +| `VITE_DEFAULT_LANGUAGE` | デフォルトの UI 言語(例: `fr`、`de`、`es`) | + +### ステップ 4: デプロイする + +「Deploy」をクリックして、ビルドが完了するのを待ちます。 + +## カスタムドメイン + +1. プロジェクトの設定を開きます +2. 「Domains」に移動します +3. カスタムドメインを追加します +4. 指示に従って DNS を設定します + +## 制限事項 + +::: warning 大きなファイル +Vercel のサーバーレス関数には 50MB の制限があります。BentoPDF は静的サイトなので影響はないはずですが、WASM モジュールは大きく(合計で約 100MB)、`/public` フォルダーから配信されるようにしてください。 +::: + +## トラブルシューティング + +### ビルドのタイムアウト + +ビルドがタイムアウトする場合は、次を試してください。 + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 更新すると 404 になる + +SPA のルーティング用に `vercel.json` を追加します。 + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel から PDF への変換が動作しない + +LibreOffice WASM による変換には `SharedArrayBuffer` が必要で、すべてのページで次のレスポンスヘッダーが必要です。 + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +事前圧縮された `.wasm.gz` と `.data.gz` ファイルにも、ブラウザーが展開できるよう `Content-Encoding: gzip` が必要です。 + +これらを `vercel.json` に追加します。 + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +確認するには、DevTools のコンソールを開いて `console.log(window.crossOriginIsolated)` を実行します。`true` が返れば正常です。 diff --git a/docs/ja/tools/add-attachments.md b/docs/ja/tools/add-attachments.md new file mode 100644 index 00000000..d19b5100 --- /dev/null +++ b/docs/ja/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: 添付ファイルの追加 +description: あらゆる種類のファイルを、文書レベルまたは特定のページに紐づけて PDF に埋め込みます。 +--- + +# 添付ファイルの追加 + +1 つまたは複数のファイルを PDF 文書の中に直接埋め込みます。添付ファイルは文書レベル(あらゆる PDF リーダーの添付ファイルパネルに表示されます)で追加することも、特定のページに紐づけることもできます。 + +## 使い方 + +1. ファイルを添付したい PDF をアップロードします。 +2. 添付ファイルのドロップゾーンで、埋め込みたいファイル(どんな種類でも可)を選択します。 +3. 添付レベルを選択します。**文書**(デフォルト)または**ページ**です。 +4. ページレベルを選んだ場合は、ページ範囲(例: `1-3` や `5`)を入力します。 +5. 処理ボタンをクリックします。ファイルが埋め込まれた PDF がダウンロードされます。 + +## 機能 + +- あらゆる種類のファイルを添付可能。画像、スプレッドシート、アーカイブ、実行ファイルなど何でも対応 +- 文書レベルまたはページレベルで添付位置を指定 +- 1 回の操作で複数のファイルを添付可能 +- 選択したすべての添付ファイルのファイル名とサイズを表示 +- 出力では元の PDF の内容を保持したまま、埋め込みファイルを追加 + +## オプション + +| オプション | 説明 | +| ---------------- | ---------------------------------------------------------------------- | +| **文書レベル** | PDF 全体にファイルを添付します。添付ファイルパネルからアクセスできます | +| **ページレベル** | ページ範囲の入力で指定した特定のページにファイルを添付します | + +## ユースケース + +- PDF レポートにソースデータ(Excel ファイルや CSV)を同梱する +- 写真ポートフォリオ PDF に元の画像ファイルを添付する +- 契約書や提案書に関連書類を埋め込む +- 研修マニュアルの特定のページに補足資料を追加する + +## ヒント + +- 文書レベルの添付ファイルは、PDF リーダー全般で最も広くサポートされています。ページレベルの添付ファイルは、すべてのビューアで表示されるとは限りません。 +- 添付ファイルのサイズに上限はありませんが、非常に大きなファイルを埋め込むと、それに比例して PDF のサイズも大きくなります。 + +## 関連ツール + +- [添付ファイルの抽出](./extract-attachments) +- [添付ファイルの編集](./edit-attachments) +- [PDFの結合](./merge-pdf) diff --git a/docs/ja/tools/add-blank-page.md b/docs/ja/tools/add-blank-page.md new file mode 100644 index 00000000..7840dfd5 --- /dev/null +++ b/docs/ja/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: 空白ページの追加 +description: PDF 文書の任意の位置に、1 ページ以上の空白ページを挿入します。 +--- + +# 空白ページの追加 + +指定した位置に空のページを PDF へ挿入します。空白ページを入れる場所と枚数を自由に指定できます。 + +## 使い方 + +1. PDF ファイルをアップロードします。ツールにページ数が表示されます。 +2. 空白ページを挿入する**位置**を入力します。先頭に挿入するには `0`、末尾に追加するには総ページ数を指定します。 +3. 追加する空白ページの**枚数**を入力します(デフォルトは 1)。 +4. 処理ボタンをクリックします。空白ページが挿入された PDF がダウンロードされます。 + +## 機能 + +- 先頭、途中、末尾など、任意の位置に挿入可能 +- 1 回の操作で複数の空白ページを追加可能 +- アップロードした PDF のページ数に応じて、位置のヒントが動的に更新 +- 標準的な A4 サイズの空白ページ + +## ユースケース + +- まとめた文書のセクション間に、区切り用の空白ページを追加する +- 両面印刷の位置合わせのために空白ページを挿入する +- 印刷した学習ガイドに手書きメモ用のスペースを追加する +- 最低ページ数の要件を満たすために文書のページ数を調整する + +## ヒント + +- 位置 `0` は最初のページの前に挿入します。総ページ数と同じ位置を指定すると、最後のページの後ろに追加されます。 +- 空白ではなく内容のあるページを特定の位置に挿入したい場合は、[PDFマルチツール](./pdf-multi-tool) を使って、指定したページの後ろに別の PDF を挿入してください。 + +## 関連ツール + +- [Organize & Duplicate](./organize-pdf) +- [PDFマルチツール](./pdf-multi-tool) +- [PDFの結合](./merge-pdf) diff --git a/docs/ja/tools/add-page-labels.md b/docs/ja/tools/add-page-labels.md new file mode 100644 index 00000000..3797a94b --- /dev/null +++ b/docs/ja/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: ページラベルの追加 +description: ローマ数字、英字のプレフィックス、カスタム番号付けに対応し、1 つの文書に複数のルールを設定できる PDF ページラベルを追加します。 +--- + +# ページラベルの追加 + +ページラベルは、PDF ビューアでのページ番号の表示方法を決めるものです(ツールバーに表示される番号であり、ページ上には印刷されません)。このツールでは、ページ範囲ごとに異なるラベル方式を割り当てられます。たとえば、前付にはローマ数字、本文には算用数字、付録にはアルファベットといった設定ができます。 + +## 使い方 + +1. PDF ファイルをアップロードします。 +2. オプションパネルが表示され、デフォルトで 1 つのラベルルールが用意されています。 +3. 各ルールにページ範囲、スタイル、任意のプレフィックス、開始値を設定します。 +4. **ルールを追加**をクリックすると、別のセクション用のルールを追加できます。 +5. **ページラベルを追加**をクリックして、すべてのルールを適用し、結果をダウンロードします。 + +## オプション + +各ラベルルールには次の設定があります。 + +- **ページ範囲** -- ルールを適用するページです。空欄にするとすべてのページが対象になります。`1-4`、`7`、`odd`、`1-9,30-40` などの指定に対応しています。 +- **ラベルスタイル** -- 算用数字、小文字のローマ数字(i, ii, iii)、大文字のローマ数字(I, II, III)、小文字の英字(a, b, c)、大文字の英字(A, B, C)、ラベルなし(プレフィックスのみ)から選べます。 +- **ラベルプレフィックス** -- 各ラベルの先頭に付ける任意のテキストです。たとえば "A-" を指定すると、A-1、A-2、A-3 のようなラベルになります。 +- **開始値** -- 数え始める数字です。デフォルトは 1 です。0 から始める番号付けにしたい場合は 0 を設定します。 +- **離れた範囲でも番号を継続する** -- ルールの対象が連続しないページ(`1-9,30-40` や `odd` など)で、番号を連続させたい場合に有効にします。 +- **既存のページラベルを削除** -- デフォルトでオンです。新しいルールを適用する前に、以前のラベルをすべて消去します。 + +## 機能 + +- 複雑な番号付けスキームに対応する、1 つの文書内の複数のラベルルール +- あらゆる標準的な番号体系をカバーする 6 種類のラベルスタイル +- セクションごとのラベル付けに使えるカスタムプレフィックス +- 離れた範囲に対応し、番号を連続させることが可能 +- 既存のラベルを残すか削除するかを選択可能 + +## ユースケース + +- 書籍の序文にはローマ数字(i, ii, iii)、本文には算用数字のラベルを設定する +- 付録ページに "A-1"、"A-2"、"B-1"、"B-2" のようなアルファベットのプレフィックスを付ける +- 実際のページ番号と PDF のページ順が一致しないスキャン文書のページラベルを修正する +- 技術文書向けに 0 から始まる番号付けを追加する + +## ヒント + +- ページラベルは、PDF ビューアのナビゲーションツールバーに表示されるメタデータです。実際のページには印刷されません。目に見える番号が必要な場合は、[ページ番号](./page-numbers) を使用してください。 +- このツールを使うには、WASM 設定で CoherentPDF (CPDF) を設定しておく必要があります。未設定の場合は、設定を促すメッセージが表示されます。 + +## 関連ツール + +- [ページ番号](./page-numbers) +- [通し番号付け](./bates-numbering) +- [しおりの編集](./bookmark) diff --git a/docs/ja/tools/add-stamps.md b/docs/ja/tools/add-stamps.md new file mode 100644 index 00000000..da0bf0b2 --- /dev/null +++ b/docs/ja/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: スタンプの追加 +description: ユーザー名による帰属表示に対応した統合アノテーションツールバーを使って、PDF のページに画像スタンプを追加します。 +--- + +# スタンプの追加 + +スタンプ用アノテーションツールバーを備えた埋め込みビューアを使って、PDF のページに画像スタンプを配置します。スタンプには自分の名前を含めて帰属を示せるため、承認ワークフロー、レビュー作業、文書への押印に便利です。 + +## 使い方 + +1. **スタンプのユーザー名**欄に名前を入力します。この名前は、作成するスタンプに表示されます。 +2. PDF ファイルをクリックするか、ドロップゾーンにドラッグしてアップロードします。 +3. 文書がビューアに読み込まれた状態で、スタンプエディタが開きます。 +4. ツールバーの画像スタンプツールを使って、任意のページにスタンプを選択して配置します。 +5. 必要に応じて、スタンプの位置とサイズを調整します。 +6. **スタンプ済み PDF を保存**をクリックして、結果をダウンロードします。 + +## 機能 + +- スタンプ専用のアノテーションツールバーを備えた統合 PDF ビューア +- 作成したスタンプにユーザー名を表示 +- 任意のページに画像スタンプを配置可能 +- ドラッグ&ドロップによる位置調整とサイズ変更 +- ページの縦横比に応じたビューアの自動サイズ調整 +- ファイル名とサイズ情報の表示 + +## ユースケース + +- レビューワークフローで、文書に「承認済み」や「確認済み」の画像スタンプを追加する +- 公式文書に会社の社印や公証人の印影画像を配置する +- 確認者の名前入りの「受領」スタンプをページに押す +- 検査報告書に品質管理スタンプを追加する + +## ヒント + +- PDF をアップロードする前に、スタンプのユーザー名を設定してください。ユーザー名はスタンプのメタデータに埋め込まれます。 +- ビューアの高さは、PDF の最初のページの縦横比に合わせて調整され、見やすい表示になります。 +- 画像スタンプではなく、テキストベースの透かしを入れたい場合は、[透かしの追加](./add-watermark) ツールを使用してください。 + +## 関連ツール + +- [PDFへ署名](./sign-pdf) +- [透かしの追加](./add-watermark) +- [PDFエディター](./edit-pdf) diff --git a/docs/ja/tools/add-watermark.md b/docs/ja/tools/add-watermark.md new file mode 100644 index 00000000..427bcdbc --- /dev/null +++ b/docs/ja/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: 透かしの追加 +description: ビジュアルなドラッグ&ドロップエディタとライブプレビューで、PDF のページにテキストまたは画像の透かしを入れます。 +--- + +# 透かしの追加 + +ビジュアルエディタを使って、PDF のページにテキストまたは画像の透かしを追加します。プレビュー上で透かしを直接ドラッグして位置を決め、角のハンドルでサイズを変更し、不透明度、回転、フォント、色を設定できます。ページごとに透かしの位置を変えることも、すべてのページに同じ透かしを一括で適用することもできます。 + +## 使い方 + +1. PDF ファイルをアップロードします。 +2. 最初のページのライブプレビューと、ドラッグ可能な透かしのオーバーレイが表示されたエディタが開きます。 +3. 切り替えボタンで、**テキスト**または**画像**の透かしモードを選びます。 +4. サイドバーのパネルで透かしの設定を行います。 +5. プレビュー上で透かしをドラッグして、好みの位置に正確に配置します。サイズを変えるには、角のハンドルを使います。 +6. ページを移動してページごとの透かしを設定するか、**すべてのページに適用**をオンのままにします。 +7. **透かしを追加**をクリックして、処理とダウンロードを行います。 + +## オプション + +**テキスト透かしの設定:** + +- **テキスト** -- 透かしの文字列です(例: "CONFIDENTIAL"、"DRAFT")。 +- **フォントサイズ** -- 10 ~ 200 ポイントです。デフォルトは 72 です。 +- **色** -- カラーピッカーで好きな色を選べます。 +- **不透明度** -- 完全な透明から完全な不透明まで、透明度を調整できます。 +- **回転** -- 透かしの文字を -180 度から 180 度の範囲で回転できます。 + +**画像透かしの設定:** + +- **画像のアップロード** -- 透かしとして使う PNG、JPG などの画像ファイルをアップロードします。 +- **不透明度** -- 画像の透明度を調整します。 +- **スケール** -- 画像透かしのサイズを変更します。 + +**レイアウトの設定:** + +- **単一** -- 1 ページに透かしを 1 つ配置します。ドラッグするか、位置のプリセットで位置を決めます。 +- **タイル** -- 回転角度に沿った斜めのグリッド状に、ページ全体へ透かしを繰り返し配置します。これにより、透かしが文書の端から端までを覆います。 +- **水平方向の間隔** -- 文字方向に沿ったタイル間の間隔です。透かしの幅に対する割合(パーセント)で指定します(タイルモードのみ)。 +- **垂直方向の間隔** -- タイルの行間の間隔です。透かしの高さに対する割合(パーセント)で指定します(タイルモードのみ)。 + +**一般設定:** + +- **すべてのページに適用** -- オンにすると、すべてのページに同じ透かしが適用されます。オフにすると、ページごとに個別の透かしを設定できます。 +- **ページ範囲** -- 透かしを入れるページを指定します(例: "1-3, 5, 7-9" や "all")。 + +## 機能 + +- ライブ PDF プレビュー上での、ビジュアルなドラッグ&ドロップによる位置決め +- 角のハンドルでサイズ変更できる透かし +- テキストと画像の透かしモード +- 間隔を調整できる、単一配置またはページ全体のタイル(繰り返し)レイアウト +- ページごと、または全体への透かしの適用 +- プレビューでのページ単位の移動 +- 不透明度と回転のコントロール +- ページ範囲によるフィルタリング + +## ユースケース + +- レビュー用に回覧する前に、下書き文書へ "DRAFT" の透かしを入れる +- 機密性の高い財務レポートに "CONFIDENTIAL" の透かしを追加する +- 会社のロゴ画像の透かしで文書にブランドを付ける +- 見込み客と共有する製品ドキュメントに "SAMPLE" と押印する +- 配布する PDF 資料に著作権表示を追加する + +## ヒント + +- ページを斜めに横切る透かしにするには、回転を約 45 度に設定し、フォントサイズを大きくします。 +- タイルモードにすると、トリミングしても透かしが何十個も残るため、文書の再利用がはるかに難しくなります。タイルにする場合は、下の文字が読めるように不透明度を下げてください。 +- 背景が透明な画像透かし(PNG 形式)は、文書の内容とより自然になじみます。 +- ページごとに異なる透かしテキストが必要な場合は、「すべてのページに適用」をオフにして、ページごとに移動しながら設定してください。 + +## 関連ツール + +- [ヘッダーとフッター](./header-footer) +- [スタンプの追加](./add-stamps) +- [通し番号付け](./bates-numbering) +- [PDFへ署名](./sign-pdf) diff --git a/docs/ja/tools/adjust-colors.md b/docs/ja/tools/adjust-colors.md new file mode 100644 index 00000000..0b4465aa --- /dev/null +++ b/docs/ja/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: 色の調整 +description: PDF の明るさ、コントラスト、彩度、色相、色温度、色合い、ガンマ、セピアを細かく調整します。 +--- + +# 色の調整 + +PDF 向けの本格的なカラーグレーディングツールキットです。明るさ、コントラスト、彩度、色相シフト、色温度、色合い、ガンマ、セピアの 8 つのパラメータを独立して調整でき、スライダーを動かすたびにライブプレビューが更新されます。 + +## 使い方 + +1. PDF ファイルをアップロードします。 +2. 最初のページのプレビューと色設定パネルが表示されたエディタが開きます。 +3. スライダーを動かして、各カラーパラメータを調整します。プレビューはリアルタイムで更新されます。 +4. **リセット**をクリックすると、すべてのスライダーがデフォルトの位置に戻ります。 +5. **適用**をクリックすると、すべてのページを処理して、調整後の PDF をダウンロードします。 + +## オプション + +- **明るさ** -- ページ全体を明るくまたは暗くします(-100 ~ +100)。 +- **コントラスト** -- 明るい部分と暗い部分の差を大きくまたは小さくします(-100 ~ +100)。 +- **彩度** -- 色の鮮やかさを上げ下げします(-100 ~ +100)。-100 にするとグレースケールになります。 +- **色相シフト** -- 色相環を回転させて、すべての色を一様にずらします。 +- **色温度** -- 色を暖色系(黄色やオレンジ)または寒色系(青)にずらします。 +- **色合い** -- 緑またはマゼンタの色かぶりを加えます。 +- **ガンマ** -- ガンマカーブを使って中間調の明るさを調整します。1.0 未満の値では中間調が暗くなり、1.0 を超える値では明るくなります。 +- **セピア** -- クラシックなセピア調の効果を適用します。値が大きいほど、茶色の色味が強くなります。 + +## 機能 + +- 独立して調整できる 8 つのカラーパラメータ +- スライダーの変更に即座に反応するライブプレビュー +- すぐにデフォルトへ戻せるリセットボタン +- 文書内のすべてのページを処理 +- あらゆる PDF の内容(テキスト、画像、グラフィック)に対応 + +## ユースケース + +- 暗いスキャンを明るくしたり、露出オーバーのページを補正したりする +- カラフルな文書の彩度を下げて、印刷時のインク使用量を減らす +- セピア調を適用して、証明書や賞状にアンティークな雰囲気を出す +- PDF に埋め込まれた写真の色温度を補正する +- 色あせたスキャン文書や低品質なスキャン文書のコントラストを上げる + +## ヒント + +- 手早くグレースケールに変換するには、彩度のスライダーを -100 まで動かします。 +- ガンマのスライダーは、中間調が暗すぎる、または明るすぎるスキャン文書の読みやすさを改善するのに特に役立ちます。 +- 他の画像エフェクト系ツールと同様に、このツールは各ページをラスタライズします。出力は画像ベースになるため、テキストは選択できなくなります。 + +## 関連ツール + +- [色の反転](./invert-colors) +- [スキャナー効果](./scanner-effect) +- [背景色](./background-color) diff --git a/docs/ja/tools/alternate-merge.md b/docs/ja/tools/alternate-merge.md new file mode 100644 index 00000000..69aa11bf --- /dev/null +++ b/docs/ja/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: ページの交互結合と混合 +description: 各ファイルのページを交互に差し込んで PDF を結合し、しおりも保持します。 +--- + +# ページの交互結合と混合 + +複数の PDF ファイルのページを交互に差し込んで、文書間でページが入れ替わるようにします。通常の結合ではファイルが単に端から端へつながるだけですが、ファイル A の 1 ページ目、ファイル B の 1 ページ目、ファイル A の 2 ページ目、というように並べたいときに使うツールです。 + +## 使い方 + +1. ドロップゾーンを使って、2 つ以上の PDF ファイルをアップロードします。 +2. ツールに、各ファイルのページ数とファイルサイズが表示されます。 +3. グリップハンドルをドラッグして、差し込みの順序でどのファイルのページを先に置くかを並べ替えます。 +4. **ページを混合**をクリックして、交互に差し込んだ出力を作成します。 +5. 結果は `alternated-mixed.pdf` としてダウンロードされます。 + +## 機能 + +- 任意の数の PDF(最低 2 つ)にわたってページを交互に差し込み +- ファイルをドラッグ&ドロップで並べ替えて、差し込みの優先順位を制御 +- 元の文書のしおりを保持 +- アップロードした各ファイルのページ数とファイルサイズを表示 +- 専用の Web ワーカーで処理するため、UI の応答性を維持 + +## ユースケース + +- 奇数ページと偶数ページを別々にスキャンした両面スキャンを組み直す +- 問題用紙と解答集を組み合わせて、各問題の直後に解答が来るようにする +- 2 言語の文書をページごとに結合する(例: 片面に英語、次の面に翻訳) +- 片面スキャナーで読み取った表と裏のスキャンを交互に差し込む + +## ヒント + +- 元の PDF のページ数が異なる場合は、短い文書のページが先になくなり、長い文書の残りのページは末尾にまとめて配置されます。 +- ファイルの順序は重要です。リストの先頭のファイルが、出力の最初のページになります。必要に応じてドラッグして並べ替えてください。 + +## 関連ツール + +- [PDFの結合](./merge-pdf) +- [Organize & Duplicate](./organize-pdf) +- [PDFの分割](./split-pdf) diff --git a/docs/ja/tools/background-color.md b/docs/ja/tools/background-color.md new file mode 100644 index 00000000..2d622da8 --- /dev/null +++ b/docs/ja/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: 背景色 +description: PDF のすべてのページの背景色を、上にある内容をそのまま保ったまま変更します。 +--- + +# 背景色 + +PDF の既存の内容の背後に、単色の背景色を設定します。このツールは各ページに色付きの長方形を作成し、その上に元の内容を重ねるため、テキスト、画像、グラフィックは新しい背景の上でもすべてはっきり見えます。 + +## 使い方 + +1. PDF ファイルをアップロードします。 +2. カラーセレクターで背景色を選びます。デフォルトは明るい黄色(#FFFFCC)です。 +3. **背景色を変更**をクリックして処理します。 +4. 更新された PDF が自動的にダウンロードされます。 + +## オプション + +- **背景色** -- 好きな単色を選べる標準のカラーピッカーです。デフォルトは明るい黄色です。 + +## 機能 + +- すべてのページに均一な背景色を適用 +- 元の内容(テキスト、画像、ベクターグラフィック)を色付きレイヤーの上にすべて保持 +- 元のページサイズを維持 +- ページ数に関係なく利用可能 + +## ユースケース + +- 明るいクリーム色やアイボリーの背景を付けて、文書に紙のような柔らかい印象を与える +- カテゴリーごとに異なる背景色を適用して、文書セットを色分けする +- 同じ文書を、読者に応じて見た目の異なるバージョンにする +- 文書を画面に映すときに、明るい背景の色味を加えて読みやすくする + +## ヒント + +- 明るく落ち着いた色が最適です。テキストがすでに明るい色でない限り、非常に暗い背景ではテキストが読みにくくなることがあります。 +- 背景色とテキストの色の両方を変えたい場合は、先に背景色を適用してから、その結果に対して [テキストの色の変更](./text-color) を使用してください。 +- このツールは PDF の構造レベルで動作し(ラスタライズではありません)、出力でもテキストを選択、検索できます。 + +## 関連ツール + +- [テキストの色の変更](./text-color) +- [色の反転](./invert-colors) +- [色の調整](./adjust-colors) diff --git a/docs/ja/tools/bates-numbering.md b/docs/ja/tools/bates-numbering.md new file mode 100644 index 00000000..a4cadf96 --- /dev/null +++ b/docs/ja/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: 通し番号付け +description: カスタマイズ可能なテンプレート、桁数、フォント、位置を使って、1 つまたは複数の PDF にベイツ番号を付けます。 +--- + +# 通し番号付け + +ベイツ番号は、PDF のすべてのページに連続した識別子を押印する方式です。法的手続き、監査、コンプライアンス業務で文書にラベルを付ける際の標準的な方法です。このツールは複数のファイル、カスタマイズ可能なテンプレートに対応し、個別に番号を付けた PDF、または 1 つの ZIP アーカイブとして出力します。 + +## 使い方 + +1. 1 つ以上の PDF ファイルをアップロードします。複数のファイルを一度にドラッグできます。 +2. スタイルのプリセットを選ぶか、カスタムテンプレートを作成します。 +3. 位置、フォント、サイズ、色、開始番号を設定します。 +4. **ベイツ番号を適用**をクリックして処理します。 +5. ファイルが 1 つの場合は直接ダウンロードされます。複数のファイルは ZIP アーカイブとしてダウンロードされます。 + +## オプション + +- **スタイルプリセット** -- 組み込みの形式から選択します。 + - 証拠 + 事件 + ベイツ + ページ(例: "Exhibit 1 Case XYZ 000001 Page 1") + - 証拠 + 事件 + ベイツ(ページ番号なし) + - 事件 + ベイツ + - ベイツ番号のみ(例: "000001") + - カスタム(独自のテンプレートを作成) +- **スタイルのカスタマイズ** -- プレースホルダー `[BATES]`、`[PAGE]`、`[FILE]`、`[FILENAME]` を使ったテンプレート文字列です。 +- **ベイツ番号の桁数** -- ゼロ埋めするベイツ番号の桁数(3 ~ 6)です。カスタムモードでのみ表示されます。 +- **位置** -- ヘッダーまたはフッター、左、中央、右から選びます。 +- **ベイツ開始番号** -- 最初のベイツ番号です。デフォルトは 1 です。番号はファイルをまたいで続きます。 +- **ファイルカウンターの開始番号** -- `[FILE]` プレースホルダーの開始番号です。 +- **フォント** -- Helvetica、Times New Roman、Courier から選びます。 +- **フォントサイズ** -- 押印するテキストのサイズです。 +- **色** -- ベイツ番号のテキストの色を選ぶカラーピッカーです。 + +## 機能 + +- アップロードしたすべてのファイルでベイツ番号がどう表示されるかを確認できるライブプレビュー +- 文書をまたいで連続した番号を付けられる複数ファイル対応 +- ファイルをドラッグ&ドロップで並べ替えて、番号付けの順序を制御 +- 6 通りの位置指定(ヘッダー/フッター、左/中央/右) +- ページサイズの違いに対応する、適応型の余白計算 +- 複数ファイルのバッチ向け ZIP 出力 +- 高い柔軟性を実現するテンプレートプレースホルダー + +## ユースケース + +- 訴訟の証拠開示文書に、連続した証拠番号を押印する +- 数十のファイルにまたがる監査証拠パッケージに番号を付ける +- コンプライアンス文書に規制の参照番号を付与する +- 特許出願の添付資料に、事件固有の識別子を付ける + +## ヒント + +- 処理する前に、ファイルリストでファイルをドラッグして並べ替えてください。ベイツ番号の順序は、この並び順に従います。 +- `[FILENAME]` プレースホルダーを使うと、元のファイル名を押印に含められるため、ページを元の文書までたどりやすくなります。 +- プレビューボックスは設定を変更するとリアルタイムで更新されるので、処理する前に形式を確認できます。 + +## 関連ツール + +- [ページ番号](./page-numbers) +- [ページラベルの追加](./add-page-labels) +- [ヘッダーとフッター](./header-footer) diff --git a/docs/ja/tools/bmp-to-pdf.md b/docs/ja/tools/bmp-to-pdf.md new file mode 100644 index 00000000..5388de2e --- /dev/null +++ b/docs/ja/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMPからPDF +description: BMP ビットマップ画像を、サーバーにアップロードすることなく、ブラウザ上で直接 PDF 形式に変換します。 +--- + +# BMPからPDF + +Windows ビットマップ(BMP)ファイルを PDF に変換します。BMP は非圧縮の画像形式で、レガシーシステム、医用画像、産業用スキャナーなどで今も使われています。このツールなら、何もインストールせずに PDF へ変換できます。 + +## 対応形式 + +| 形式 | 拡張子 | +| :--- | :----- | +| BMP | `.bmp` | + +## 使い方 + +1. アップロード領域をクリックするか、BMP ファイルをドラッグ&ドロップします。 +2. ファイルリストを確認します。ファイルを追加したり、不要なファイルを削除したりできます。 +3. **PDF に変換**をクリックします。出力は `from_bmps.pdf` としてダウンロードされます。 + +各 BMP はキャンバスに描画されて PNG として書き出され、その後 pdf-lib を使って PDF に埋め込まれます。ページサイズは元の画像のサイズと一致します。 + +## オプション + +このツールには、追加の品質設定はありません。画像は元の解像度のまま、ロスレスの PNG として PDF に埋め込まれます。 + +## ユースケース + +- BMP で保存されたレガシーなスキャン文書を、アーカイブ用の PDF に変換する +- 古い Windows アプリケーションの BMP スクリーンショットを、共有しやすい文書にする +- 既定で BMP を出力する医療用や産業用のスキャナーの出力を処理する +- 古い画像アーカイブを、より持ち運びやすい形式へ移行する + +## ヒント + +- BMP ファイルは非圧縮のため、サイズが大きくなりがちです。画像は内部で PNG に再エンコードされるため、できあがる PDF は大幅に小さくなります。 +- BMP ファイルと他の画像形式が混在している場合は、[画像からPDF](./image-to-pdf) ツールを使えば、すべてを 1 回のバッチで変換できます。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [PNGからPDF](./png-to-pdf) +- [TIFFからPDF](./tiff-to-pdf) diff --git a/docs/ja/tools/bookmark.md b/docs/ja/tools/bookmark.md new file mode 100644 index 00000000..8e1969ec --- /dev/null +++ b/docs/ja/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: しおりの編集 +description: ビジュアルエディターとCSV/JSON対応で、PDFのしおりを追加、編集、インポート、エクスポート、削除できます。 +--- + +# しおりの編集 + +しおりエディターを使えば、PDFのナビゲーション用しおり(アウトラインとも呼ばれます)を自在に管理できます。新しいしおりの追加、既存のしおりの編集、階層の整理、CSVやJSON形式でのしおりデータのインポートとエクスポートができます。 + +## 使い方 + +1. クリックするか、ドロップゾーンにファイルをドラッグしてPDFをアップロードします。 +2. 必要に応じて **既存のしおりを自動抽出** にチェックを入れると、文書にある現在のしおりツリーを読み込みます。 +3. エディターが分割表示で開きます。左にPDFビューアー、右にしおりパネルが表示されます。 +4. しおりのタイトルを入力し、**ページに追加** をクリックすると、現在のページを指す新しいしおりが作成されます。 +5. ツールバーのボタンでしおりの並べ替え、スタイル設定、削除ができます。 +6. **しおり付きでPDFを保存** をクリックして、更新したファイルをダウンロードします。 + +## 機能 + +- ページ移動、ズーム操作、ページ指定入力を備えたビジュアルPDFビューアー +- ワンクリックで任意のページにしおりを追加 +- PDF上を直接クリックして、しおりの移動先を正確に指定(ピックモード) +- ドラッグ&ドロップで並べ替えできる階層構造のしおり +- 一括操作:複数のしおりを選択して、色やスタイルの変更、削除をまとめて実行 +- 大きなツリーでもすばやく見つけられるしおり検索 +- すべての変更に対応した元に戻す、やり直す +- CSV(タイトル、ページ、レベル)またはJSONファイルからしおりをインポート +- 外部での編集用に、しおりをCSVまたはJSONでエクスポート +- しおりのスタイル設定:色(赤、青、緑、黄、紫)とフォントスタイル(太字、斜体、太字斜体) +- クイックナビゲーション:Page Up/Page Downキーでページをスクロール + +## オプション + +- **既存のしおりを自動抽出**: チェックすると、読み込み時にPDFの現在のしおりを読み取って表示します。 +- **一括モード**: 切り替えて複数のしおりを選択し、色、スタイル、削除をまとめて適用します。 +- **すべて展開/折りたたむ**: 入れ子になった子しおりをすばやく表示または非表示にします。 + +## 活用例 + +- しおりのない教科書やマニュアルに目次を追加する +- OCR処理後のスキャン文書でしおりの構成を整える +- しおりをCSVにエクスポートし、表計算ソフトで編集してから再インポートする +- ページ参照が間違っている自動生成のしおりを修正する +- 法律文書の重要な箇所に色付きのしおりを付ける + +## ヒント + +- 大量のしおりを作るにはCSVインポートが便利です。形式は簡単で、`title,page,level` と書き、レベル1が最上位です。 +- ピックモードでは、PDFページ上の正確な位置をクリックして移動先を指定できるため、ページ番号だけを指定するより精密です。 +- 大きな変更を行う前に、バックアップとしてしおりをエクスポートしておきましょう。 + +## 関連ツール + +- [目次](./table-of-contents) +- [PDFエディター](./edit-pdf) +- [ページラベルの追加](./add-page-labels) diff --git a/docs/ja/tools/cbz-to-pdf.md b/docs/ja/tools/cbz-to-pdf.md new file mode 100644 index 00000000..33dee37c --- /dev/null +++ b/docs/ja/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZからPDF +description: CBZおよびCBRのコミックアーカイブをブラウザでPDFに変換します。無料、プライベート、アップロード不要。 +--- + +# CBZからPDF + +コミックアーカイブファイルをPDFに変換します。CBZとCBRはデジタルコミックの標準形式で、実体は画像を詰め込んだZIPまたはRARアーカイブです。このツールは各ページを取り出し、読む順番を保ったまま、すべての画像を原寸大のページにしたすっきりしたPDFを作成します。 + +## 対応形式 + +| 形式 | 拡張子 | 備考 | +| :--- | :----- | :----------------------------------------------------- | +| CBZ | `.cbz` | ZIPベースのコミックアーカイブ(pdf-libでローカル処理) | +| CBR | `.cbr` | RARベースのコミックアーカイブ(PyMuPDFエンジンで処理) | + +CBZコンバーターは、アーカイブ内のJPEG、PNG、GIF、BMP、WebP、AVIF、TIFF、HEIC、JXL画像を認識します。標準外の形式は、埋め込む前に自動でPNGに変換されます。 + +## 使い方 + +1. アップロード領域をクリックするか、CBZまたはCBRファイルをドラッグ&ドロップします。両方の形式を1回のバッチに混在させることもできます。 +2. 一覧に表示されたファイルを確認します。不要なものは削除し、**ファイルを追加** をクリックしてさらに追加できます。 +3. **PDFに変換** をクリックします。CBZファイルの場合、ツールはアーカイブを展開し、画像ファイルを名前の自然順で並べ、各画像の実際の形式を判定して、pdf-libでPDFに埋め込みます。CBRファイルは代わりにPyMuPDFエンジンで処理されます。 +4. 1ファイルの場合はPDFとしてダウンロードされます。複数ファイルの場合は `comic-converted.zip` という名前のZIPアーカイブになります。 + +## オプション + +設定は不要です。各画像は元のサイズに合わせたページになるため、見開きは横長のまま、単ページは縦長のままになります。 + +## 活用例 + +- PDFには対応していてもCBZ/CBRには対応していないタブレットやスマートフォンのアプリでコミックを読む +- デジタルコミックの特定のページを印刷する +- コミックのコレクションを、どのファイルビューアーでも開ける形式で保管する +- 専用のコミックリーダーを持っていない人にコミックを共有する + +## ヒント + +- アーカイブ内の画像は自然順で並べ替えられます(そのため `page2.jpg` は `page10.jpg` より前になります)。正しいページ順にするため、ファイル名には一貫した番号を付けてください。 +- コンバーターは、ファイル拡張子ではなくバイナリシグネチャで画像形式を判定します。誤って `.jpg` と名付けられたPNGでも正しく埋め込まれます。 +- CBZファイルはPyMuPDFエンジンを読み込まずにブラウザ内ですべて処理されるため、CBRファイルより高速に変換できます。 + +## 関連ツール + +- [EPUBからPDF](./epub-to-pdf) +- [MOBIからPDFへの変換](./mobi-to-pdf) +- [画像からPDF](./image-to-pdf) diff --git a/docs/ja/tools/change-permissions.md b/docs/ja/tools/change-permissions.md new file mode 100644 index 00000000..ff6aed9d --- /dev/null +++ b/docs/ja/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: 権限の変更 +description: 印刷、コピー、編集、注釈に関するPDFの利用権限を設定または変更します。256ビットAES暗号化を使用します。 +--- + +# 権限の変更 + +受け取った人がPDFで何をできるかを細かく調整します。ファイルをパスワードで保護するだけの基本的な暗号化とは異なり、このツールでは、印刷、コピー、編集、注釈、フォーム入力、文書の組み立て、ページの抽出を個別に許可または禁止でき、そのすべてが256ビットAES暗号化によって適用されます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. PDFがすでに暗号化されている場合は、**現在のパスワード** を入力します。 +3. **新しいユーザーパスワード**(開くために必要)や **新しいオーナーパスワード**(権限を管理)を設定します。 +4. チェックボックスで、個々の権限のオンとオフを切り替えます。 +5. **権限の変更** をクリックします。 +6. 更新されたPDFをダウンロードします。 + +新しいパスワード欄を両方とも空にすると、ツールはPDFを完全に復号し、すべての暗号化と制限を解除します。 + +## 権限の設定項目 + +| 権限 | 制御する内容 | +| ------------------------ | -------------------------------------------------------- | +| **印刷を許可** | 文書を印刷できるかどうか | +| **コピーを許可** | テキストや画像を選択してコピーできるかどうか | +| **変更を許可** | 文書の内容を編集できるかどうか | +| **注釈を許可** | コメント、ハイライト、スタンプを追加できるかどうか | +| **フォーム入力を許可** | インタラクティブなフォームフィールドに入力できるかどうか | +| **文書の組み立てを許可** | ページの挿入、削除、回転ができるかどうか | +| **ページの抽出を許可** | 個々のページを抽出できるかどうか | + +すべての権限は、適用するためにオーナーパスワードが必要です。オーナーパスワードがないと、権限フラグはほとんどのPDFリーダーで無視されます。 + +## PDFにおける権限のしくみ + +PDFの権限は暗号化仕様の一部です。暗号化辞書にビットフラグとして保存され、準拠したPDFリーダーによって適用されます。重要な違いは次のとおりです。 + +- **ユーザーパスワード**: ファイルを開くために必要です。 +- **オーナーパスワード**: 権限の変更や制限の解除に必要です。これがない場合、権限フラグによってユーザーが実行できる操作が制御されます。 + +オーナーパスワードだけを設定した場合(ユーザーパスワードなし)、誰でもファイルを開けますが、許可された操作に制限されます。両方を設定した場合は、開くのにパスワードが必要で、認証後も制限が適用されます。 + +## 活用例 + +- 閲覧と印刷はできても、編集やコピーはできないレポートを配布する +- 受け取った人が記入はできても変更はできない契約書テンプレートを共有する +- 画像のコピーを無効にしたPDFカタログを公開する +- 構造の変更は防ぎつつ、レビュー用の下書きには注釈を許可する + +## ヒント + +- 効果を出すには、必ずオーナーパスワードを設定してください。オーナーパスワードのない権限は強制できません。 +- 一部のサードパーティ製PDFツールは権限フラグを無視します。より強力に保護したい場合は、PDFを画像化するか、DRMの利用を検討してください。 +- このツールを使うと、古いRC4暗号化のPDFをAES-256にアップグレードできます。 + +## 関連ツール + +- [PDFの暗号化](./protect-pdf): 細かな権限設定を伴わない、シンプルなパスワード保護 +- [PDFの復号化](./unlock-pdf): 暗号化を完全に解除 +- [制限の解除](./remove-restrictions): オーナーパスワードがある場合に、すべての制限を取り除く diff --git a/docs/ja/tools/combine-single-page.md b/docs/ja/tools/combine-single-page.md new file mode 100644 index 00000000..02b2f99d --- /dev/null +++ b/docs/ja/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: 単一ページに結合 +description: PDFのすべてのページを、1つの連続した縦または横のスクロールページにつなぎ合わせます。 +--- + +# 単一ページに結合 + +PDFのすべてのページを、1枚の長いページに結合します。ページは縦(スクロールのよう)または横(並べて)につなぎ合わされ、出力は連続した1ページになります。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. レイアウトの方向を選びます。**縦**(ページを上から下に積み重ねる)または **横**(ページを横に並べる)です。 +3. ページ間の間隔をポイント単位で設定します。 +4. ページ間の隙間の背景色を選びます。 +5. 必要に応じて、区切り線(ページ間の細い線)を有効にし、太さと色を設定します。 +6. 処理ボタンをクリックします。出力は1ページのPDFになります。 + +## 機能 + +- ページを縦または横につなぎ合わせ +- ページ間隔を設定可能 +- 隙間部分の背景色ピッカー +- 太さと色を調整できる区切り線(任意) +- 元の各ページを、結合したキャンバスに原寸の解像度で描画 + +## オプション + +| オプション | 説明 | +| ------------------ | -------------------------------- | +| **向き** | 縦(積み重ね)または横(並べる) | +| **ページ間隔** | ページ間の隙間(ポイント単位) | +| **背景色** | ページ間の領域の色 | +| **区切り線を追加** | ページ間の細い線のオン/オフ | +| **区切り線の太さ** | 線の太さ(ポイント単位) | +| **区切り線の色** | 区切り線の色 | + +## 活用例 + +- 複数ページのワイヤーフレームやデザインモックアップから、1枚の長い画像を作る +- Webへの埋め込み用に、文書を連続してスクロールできる表示にする +- 複数ページのコミックやストーリーボードを1本の帯につなぎ合わせる +- 連続したページを、レビュー用にパノラマ表示にする + +## ヒント + +- 縦向きは縦長ページの文書に最適です。横向きは横長のコンテンツに向いています。 +- ページ数の多い文書は、非常に縦長または横長の出力になります。極端に大きな単一ページは、一部のPDFビューアーでは扱いにくい場合があります。 +- コントラストのある色の区切り線を追加すると、元のページの終わりと次のページの始まりがわかりやすくなります。 + +## 関連ツール + +- [N-Up PDF](./n-up-pdf) +- [PDFの結合](./merge-pdf) +- [ページの分割](./divide-pages) diff --git a/docs/ja/tools/compare-pdfs.md b/docs/ja/tools/compare-pdfs.md new file mode 100644 index 00000000..c7f64f2f --- /dev/null +++ b/docs/ja/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: PDFの比較 +description: 2つのPDF文書を、並べて表示またはオーバーレイモードで比較し、変更を詳細に検出して分類します。 +--- + +# PDFの比較 + +2つのPDFをアップロードすると、その間で何が変わったのかが正確にわかります。このツールはページを賢く対応付け、テキスト、画像、注釈、ヘッダー、書式の違いを検出して、並べて表示またはオーバーレイ表示で示します。 + +## 使い方 + +1. 2つのPDFファイルをアップロードします。元のファイル(左)と改訂版(右)です。 +2. ツールが、内容のシグネチャを使って文書間のページを対応付けます。 +3. 表示モードを選びます。**並べて表示** または **オーバーレイ** です。 +4. ページネーションのコントロールで、ページの組を移動します。 +5. 違いはハイライトされ、分類されます。フィルターパネルを使って、特定の変更タイプに絞り込めます。 +6. 必要に応じて、比較結果をPDFレポートとしてエクスポートします。 + +## 機能 + +- 内容の類似度に基づく自動ページ対応付け +- 並べて表示とオーバーレイの比較ビュー +- 変更の分類:テキスト、画像、ヘッダー/フッター、注釈、書式、背景 +- カテゴリごとのフィルター切り替えで、特定の変更タイプを表示または非表示 +- クエリで絞り込めるテキスト変更の検索 +- スキャン文書を比較するためのOCR対応 +- 詳細確認用のズーム操作 +- 並べて表示モードでのパネル間の同期スクロール +- 比較結果をPDFとしてエクスポート + +## オプション + +| オプション | 説明 | +| ---------------------- | --------------------------------------------------------------------------- | +| **表示モード** | 並べて表示またはオーバーレイ | +| **OCR** | スキャン文書の比較用にOCRを有効/無効にする | +| **OCR言語** | OCRによるテキスト抽出の言語 | +| **カテゴリフィルター** | テキスト、画像、ヘッダー/フッター、注釈、書式、背景の変更の表示を切り替える | +| **変更の範囲** | オーバーレイモードで、すべての変更とコンテンツのみを切り替える | +| **ズーム** | 詳細確認のための拡大率を調整する | + +## 活用例 + +- 契約書の改訂版を確認し、版の間で何が変わったかを正確に見つける +- デザインのモックアップを比較し、PDFへのエクスポート結果が期待どおりか確認する +- すべての編集を追跡する必要がある規制対象の業界で、文書の変更を監査する +- PDFの変換処理で、元の内容が正確に保たれたかを検証する +- 翻訳文書を原文と照らし合わせ、レイアウトの変化を確認する + +## ヒント + +- オーバーレイ表示は、2つの文書を重ねて表示するため、位置のずれや画像のサイズ変更といった空間的な違いがすぐにわかります。 +- テキストレイヤーのないスキャン文書を比較するときは、OCRを有効にしてください。比較エンジンがページ画像からテキストを抽出します。 +- カテゴリフィルターで重要なものに集中しましょう。たとえば、テキスト内容の違いだけが気になるときは、書式の変更を非表示にします。 + +## 関連ツール + +- [メタデータの表示](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [PDFの結合](./merge-pdf) diff --git a/docs/ja/tools/compress-pdf.md b/docs/ja/tools/compress-pdf.md new file mode 100644 index 00000000..39927f2b --- /dev/null +++ b/docs/ja/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: PDFの圧縮 +description: Hyper Compressエンジンで、PDFのファイルサイズを最大90%削減します。目標ファイルサイズ、バッチ処理、カスタム品質設定に対応。 +--- + +# PDFの圧縮 + +PDFファイルを壊さずに小さくします。PDFの圧縮は、BentoPDF独自の圧縮エンジンである [Hyper Compress](https://www.bentopdf.com/hyper-compress) を使用しています。画像の再圧縮、フォントのサブセット化と統合、埋め込みサムネイルやアプリケーション固有の非公開データなど不要なデータの削除を行います。PDFの機能は完全に保たれ、テキストは選択でき、リンクやフォームフィールドも動作します。 + +Hyper CompressはWebAssemblyにコンパイルされてBentoPDFに同梱されているため、追加のセットアップなしで、オフラインやエアギャップ環境でも圧縮できます。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、1つ以上のPDFをアップロードします。 +2. **圧縮レベル** を選びます。低、中、高、ロスレスのいずれかです。 +3. 必要に応じて **目標ファイルサイズ** を入力するか、**詳細設定** を開いて、**グレースケールに変換** を含むきめ細かな設定をします。 +4. **PDFを圧縮** をクリックします。複数のファイルの場合は、1つのZIPとしてダウンロードされます。 + +## 特殊な文書 + +- **デジタル署名付きPDF** は、変更すると署名が無効になるため、そのまま返されます。詳細設定で **コンテンツ保護を上書き** をオンにすると、署名が削除されて圧縮されます。見える署名はページに残りますが、ファイルは署名済みではなくなります。 +- **PDF/Aファイル** は、圧縮後にPDF/Aのラベルを失います。これは、もはや満たしていない準拠を主張しないようにするためです。代わりにファイルの準拠を保ちたい場合は、詳細設定で **PDF/Aを維持** をオンにします。 +- **パスワード保護されたPDF** には、ファイルカードにパスワード欄が表示されます。そこにパスワードを入力すると、Hyper Compressがファイルを自分で開くため、別途ロック解除の手順は不要です。ロックされたファイルが2つ以上ある場合は、同じパスワードを使うすべてのファイルを、共有の1つの欄でロック解除できます。圧縮後のコピーにはパスワードがありません。再度設定するには [PDFの暗号化](./protect-pdf) を使用してください。 +- **テキストレイヤーのないスキャン** は、詳細設定の **ページを画像化** を使うと、さらに小さくできます。これは各ページを1枚の最適化された画像に置き換えます。OCR済みのスキャンを含め、選択可能なテキストを持つ文書では、**コンテンツ保護を上書き** がオンでない限りスキップされます。オンにした場合は、テキストのページも画像になるため、テキストは選択できなくなり、リンクも動作しなくなります。 + +## 圧縮レベル + +| レベル | 画像品質 | 最大解像度 | 最適な用途 | +| ------------ | -------------- | ---------- | --------------------------------- | +| **低** | 80 | 200 DPI | 見た目の品質を保ちたいとき | +| **中** | 50 | 150 DPI | 日常的な文書 | +| **高** | 20 | 72 DPI | メールの添付、Webへのアップロード | +| **ロスレス** | 画像はそのまま | 変更なし | アーカイブ用のコピー | + +高では、標準の14種類のPDFフォントに加え、安全な場合はArialなどの類似フォントも埋め込みを解除します。 + +## 目標ファイルサイズ + +KBまたはMBでサイズを入力すると、Hyper Compressは、選んだレベルから始めて、そのサイズに収まる最良の画像品質を探します。文書がそこまで小さくならない場合は、作成できる最小のバージョンが出力され、その旨のメッセージが表示されます。[PDFを1MBに圧縮](https://www.bentopdf.com/compress-pdf-to-1mb) のような専用ページは、目標があらかじめ入力された状態で開きます。 + +## 詳細設定 + +詳細設定パネルを開くと、Hyper Compressを直接調整できます。圧縮レベルを選ぶと、これらはそのレベルの値にリセットされ、どれかを編集すると、レベルはカスタムに切り替わります。 + +- **コンテンツ保護を上書き**: デフォルトでは、Hyper Compressは署名付きPDFには手を加えず、テキストのあるページを画像化しません。これをオンにすると、その両方を回避します。レベルを変更してもオンのままです。 + +- **画像**: 画像品質、最大解像度、強制的な再サンプリング、色の削減、見えない画像領域のクリッピング、代替画像の削除、カラープロファイルの簡素化、JPEG 2000、ロスレスモード +- **フォント**: サブセット化、重複の統合、標準フォントとその類似フォントの埋め込み解除 +- **コンテンツ**: 注釈、フォームフィールド、リンクの平坦化 +- **クリーンアップ**: サムネイル、アプリケーションデータ、記事スレッド、Webキャプチャ情報、構造ツリー、出力インテントの削除 +- **画像化**: 画像のみのスキャンで、ページを画像に置き換える。選択可能なテキストがある文書ではスキップ +- **出力**: PDF/Aを維持、およびBrotli圧縮に対応するPDF 2.0リーダー向けのBrotli圧縮 + +## 活用例 + +- 50 MBのレポートを、メールの添付ファイルの上限以下にする +- 目標ファイルサイズを使って、スキャンをポータルの厳しいアップロード上限以下にする +- マーケティング用PDFを最適化して、Webサイトでのダウンロードを速くする +- ストレージコストが問題になる大量の文書セットをアーカイブする +- メッセージアプリでPDFを共有するときのモバイルデータ使用量を減らす + +## ヒント + +- まずは中から始めましょう。それでも大きすぎる場合は、目標ファイルサイズを設定するか、高に上げてください。 +- テキストレイヤーのないスキャンには、詳細設定の「ページを画像化」をオンにします。 +- 詳細設定の「グレースケールに変換」は、カラーが多い文書のファイルサイズを減らせます。 + +## 関連ツール + +- [PDFの線形化](./linearize-pdf): 圧縮したPDFをWebでの高速表示向けに最適化 +- [PDFの画像化](./rasterize-pdf): テキストのあるページを含め、特定のDPIでページを画像に変換 +- [PDFの修復](./repair-pdf): 他の場所での圧縮で壊れたPDFを修復 +- [メタデータの削除](./remove-metadata): プライバシーのために隠れたデータを削除 diff --git a/docs/ja/tools/crop-pdf.md b/docs/ja/tools/crop-pdf.md new file mode 100644 index 00000000..bc652cb7 --- /dev/null +++ b/docs/ja/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: PDFのトリミング +description: Cropper.jsを使ったエディターで、各ページにトリミング領域を描いて、PDFのページを視覚的にトリミングします。 +--- + +# PDFのトリミング + +視覚的なトリミング画面で、PDFページの余白を切り取ります。各ページ上に直接トリミング用の長方形を描き、結果をプレビューして、トリミングを適用します。ページごとに異なるトリミング領域を設定することも、文書全体に同じトリミングを適用することもできます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. トリミングエディターが開き、ドラッグできるトリミングのオーバーレイが付いた最初のページが表示されます。 +3. 辺や角をドラッグして、トリミングの長方形を調整します。 +4. ページ移動ボタンでページを切り替え、それぞれのトリミング領域を設定します。 +5. **トリミング** をクリックして適用し、結果をダウンロードします。 + +## 機能 + +- 精密な調整用のハンドルを備えた、Cropper.js搭載のビジュアルトリミングエディター +- ページごとに移動して、個別のトリミング領域を設定 +- トリミング設定をページごとに保存するため、ページによって異なるトリミングを定義可能 +- 選択したトリミング領域のライブプレビュー +- あらゆるページサイズや向きのPDFに対応 + +## 活用例 + +- スキャン文書の広い余白を取り除いて、内容の領域に集中させる +- プリプレス用PDFから、プリンターのトンボや見当マークを切り取る +- 講義スライドから、発表者ノートの領域を取り除く +- 文書の抜粋を共有する前に、すべてのページからヘッダーやフッターを取り除く +- 特定の画面や印刷レイアウトに合わせて、ページのサイズを変更する + +## ヒント + +- トリミングのオーバーレイは、自由にサイズ変更や移動ができます。角をドラッグすると縦横比を保ったまま、辺をドラッグすると1方向だけ調整できます。 +- すべてのページに同じトリミングが必要な文書では、最初のページで設定してください。ページを移動しても、ツールがトリミング領域を記憶しています。 +- 視覚的にトリミングするのではなく、ページサイズを統一したい場合は、ページサイズを固定ツールのほうが適していることがあります。 + +## 関連ツール + +- [PDFエディター](./edit-pdf) +- [ページ番号](./page-numbers) +- [空白ページの削除](./remove-blank-pages) diff --git a/docs/ja/tools/csv-to-pdf.md b/docs/ja/tools/csv-to-pdf.md new file mode 100644 index 00000000..c9a005ab --- /dev/null +++ b/docs/ja/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSVからPDF +description: CSVの表計算ファイルを、ブラウザ上で書式の整ったPDFの表に直接変換します。 +--- + +# CSVからPDF + +CSVファイルを、すっきりとした書式のPDF文書に変換します。各CSVは解析され、出力PDFの中で表として描画されます。受け取る人が表計算ソフトを持っていなくても、表形式のデータを印刷したり共有したりしたいときに便利です。 + +## 対応形式 + +| 形式 | 拡張子 | +| :--- | :----- | +| CSV | `.csv` | + +## 使い方 + +1. アップロード領域をクリックするか、1つ以上のCSVファイルをドラッグ&ドロップします。 +2. ファイル一覧を確認します。ファイルを追加したり、不要なものを削除したりできます。 +3. **PDFに変換** をクリックします。進行状況インジケーターが変換の状態を示します。 +4. 1ファイルの場合は、PDFとして直接ダウンロードされます。複数ファイルの場合は `csv-converted.zip` にまとめられます。 + +## オプション + +このツールに追加の設定はありません。CSVは自動的に解析され、表として整形されます。 + +## 出力 + +| 入力数 | 出力 | +| :------------ | :------------------------------------------------------------------- | +| 1ファイル | 単一のPDFをダウンロード(例: `data.pdf`) | +| 2ファイル以上 | ZIPアーカイブ(`csv-converted.zip`)に、ファイルごとに1つのPDFを格納 | + +## 活用例 + +- エクスポートしたデータベースのレポートを、印刷できるPDFの表に変換する +- Excelを持っていない人に、財務データや在庫リストを共有する +- コンプライアンス文書用に、CSVのログファイルのPDF版を作成する +- CSVで保存されている住所録、成績表、その他の表形式データを印刷する + +## ヒント + +- 最良の結果を得るには、CSVが標準的なカンマ区切りであることを確認してください。ツールは一般的なCSVの解析規則に従います。 +- CSVの列が多い場合、表はページの幅に収まるように圧縮されることがあります。幅の広いデータセットは、複数のファイルに分割することを検討してください。 +- Excelファイル(`.xls`、`.xlsx`)には、表計算の書式や複数のシートを保持する [ExcelからPDF](./excel-to-pdf) ツールを使ってください。 + +## 関連ツール + +- [ExcelからPDF](./excel-to-pdf) +- [テキストからPDF](./txt-to-pdf) +- [JSONからPDF](./json-to-pdf) diff --git a/docs/ja/tools/delete-pages.md b/docs/ja/tools/delete-pages.md new file mode 100644 index 00000000..09f7bfaa --- /dev/null +++ b/docs/ja/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: ページの削除 +description: ページ番号、範囲、またはサムネイルの視覚的な選択で、PDFから特定のページを削除します。 +--- + +# ページの削除 + +PDF文書から不要なページを削除します。削除するページは、ページ番号や範囲を入力して指定するか、ページのサムネイルを直接クリックして削除対象に設定します。 + +## 使い方 + +1. PDFファイルをアップロードします。ツールがすべてのページのサムネイルプレビューを表示します。 +2. テキスト欄に、範囲の構文(例: `2, 5-8`)で削除するページを入力するか、サムネイルをクリックして切り替えます。 +3. 選択したページはハイライト表示されるので、選択内容を確認できます。 +4. 処理ボタンをクリックします。選択したページを取り除いた新しいPDFが作成されます。 + +## 機能 + +- 範囲の構文(`2, 5-8, 12`)によるテキストでのページ選択 +- クリックで選択して削除できる、ビジュアルなサムネイルグリッド +- 削除対象のページをリアルタイムでハイライトするプレビュー +- 実際のページ数に対する入力の検証 +- 削除しなかったすべてのページを元の順序で保持 + +## 活用例 + +- スキャン文書から、白紙や穴埋め用のページを削除する +- 文書を共有する前に、表紙や付録を取り除く +- 最終版のPDFに誤って残った下書きのページを整理する +- 配布前に、機密情報を含むページを削除する + +## ヒント + +- ページを削除しても、残りのページの内容や書式には影響しません。出力は、削除したページを除いた元の文書の忠実なコピーです。 +- 特定のページを削除するのではなく、特定のページだけを残したい場合は、[ページの抽出](./extract-pages) のほうが適しています。 +- サムネイル表示は遅延読み込みされるため、大きな文書でも操作が軽快です。 + +## 関連ツール + +- [ページの抽出](./extract-pages) +- [複製と整理](./organize-pdf) +- [PDFの分割](./split-pdf) diff --git a/docs/ja/tools/deskew-pdf.md b/docs/ja/tools/deskew-pdf.md new file mode 100644 index 00000000..d5fbc408 --- /dev/null +++ b/docs/ja/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDFの傾き補正 +description: OpenCVの傾き検出を使って、スキャンしたPDFの傾いたページを自動で補正します。しきい値とDPIを調整できます。 +--- + +# PDFの傾き補正 + +スキャンした文書が完全にまっすぐなことはまれです。わずかな傾きでも、OCRの精度が下がり、印刷の見た目も雑になります。このツールはOpenCVの画像処理アルゴリズムを使って各ページの傾きの角度を検出し、水平に戻すよう回転させます。 + +## 使い方 + +1. スキャンしたPDFを1つ以上アップロードします。 +2. **傾きのしきい値** を設定します。検出された傾きがこの値を下回るページには、手を加えません。 +3. **処理品質(DPI)** を選びます。DPIが高いほど検出精度は上がりますが、時間がかかります。 +4. **PDFの傾き補正** をクリックします。 +5. 処理が終わると、結果パネルに各ページの検出された角度と、補正されたかどうかが表示されます。 + +## オプション + +| 設定 | 値 | デフォルト | +| ------------------ | -------------------- | ---------- | +| **傾きのしきい値** | 0.1、0.5、1.0、2.0度 | 0.5 | +| **処理DPI** | 100、150、200、300 | 150 | + +## 傾き検出のしくみ + +ツールは各ページを選択したDPIで画像に描画し、OpenCVを使ってコンテンツ内の主要な線の角度を検出します。検出された傾きがしきい値を超える場合、ページは逆の角度で回転されてまっすぐになります。しきい値を下回るページは、そのまま通過します。 + +## 活用例 + +- 一括スキャンした契約書や法的文書を整える +- スキャンしたレシートや請求書を、OCR処理用に準備する +- 紙の置き方が一定でないフラットベッドスキャナーのページをまっすぐにする +- デジタル化した資料の見た目の品質を向上させる + +## ヒント + +- OCR向けにピクセル単位の正確な位置合わせが必要な場合は、しきい値を0.1度に下げてください。 +- 150 DPIは、ほとんどの文書で高速かつ正確です。非常に小さな文字や細部の多いページには、300 DPIを使ってください。 +- 傾き補正は、はっきりした水平のテキスト行がある文書で最もよく機能します。ほとんどが画像のページや、斜めのデザイン要素があるページでは、うまくいかないことがあります。 + +## 関連ツール + +- [PDFの画像化](./rasterize-pdf): 傾きを補正した出力を、平坦な画像ベースのPDFに変換 +- [PDFの圧縮](./compress-pdf): 傾き補正後にファイルサイズを削減 +- [PDFの修復](./repair-pdf): スキャンしたPDFの構造上の問題を修復 diff --git a/docs/ja/tools/digital-sign-pdf.md b/docs/ja/tools/digital-sign-pdf.md new file mode 100644 index 00000000..e304fc19 --- /dev/null +++ b/docs/ja/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: 電子署名 +description: X.509証明書を使って、PDFに暗号化による電子署名を追加します。PKCS#12とPEM形式、可視署名オプションに対応。 +--- + +# 電子署名 + +電子署名は、特定の人物が文書に署名したこと、そして署名後に文書が改変されていないことの、暗号による証明です。手書きの署名(単なる画像)とは異なり、電子署名はX.509証明書とPKCS#7標準を使って、検証可能な真正性と完全性を提供します。 + +BentoPDFは電子署名をすべてブラウザ内で適用します。秘密鍵がお使いのデバイスから出ることはありません。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 証明書ファイル(.pfx、.p12、または.pem)をアップロードします。 +3. 証明書のパスワードを入力してロックを解除します。ツールに、証明書のサブジェクト、発行者、有効期間が表示されます。 +4. 必要に応じて、署名のメタデータ(理由、場所、連絡先)を設定します。 +5. 必要に応じて、位置、サイズ、画像、テキストをカスタマイズできる **可視署名** を有効にします。 +6. **PDFに署名** をクリックします。 + +## 対応する証明書形式 + +| 形式 | 拡張子 | 説明 | +| ----------- | ---------- | ------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx、.p12 | 秘密鍵と証明書チェーンを含む、業界標準のバンドル。最も一般的な形式。 | +| **PEM** | .pem | テキストベースの形式。証明書と秘密鍵の両方を1つのファイルに含める必要があります。暗号化された秘密鍵にも対応。 | + +## 可視署名のオプション + +有効にすると、PDFのページに可視の署名ブロックが描画されます。 + +- **位置**: X/Y座標と、幅/高さ(ポイント単位) +- **ページ**: 最初のページ、最後のページ、すべてのページ、または特定のページ番号 +- **画像**: PNG、JPG、WebPの画像をアップロード(手書きの署名、社印など) +- **テキスト**: 色とフォントサイズを設定できるカスタムテキスト。画像もテキストも指定しない場合、ツールは証明書のコモンネームと現在の日付からテキストを自動生成します。 + +## 署名のメタデータ + +- **理由**: 文書に署名した理由(例: 「承認済み」、「確認済み」) +- **場所**: 署名を行った場所(例: 「New York, NY」) +- **連絡先**: 署名者への連絡方法(例: メールアドレス) + +## インターネット接続について + +署名にはインターネット接続が必要な場合があります。署名ライブラリは、証明書の認証局情報アクセス(AIA)拡張に埋め込まれたURLから、証明書チェーンを取得します。それらのサーバーに到達できない場合、チェーンの検証が必要な証明書では署名に失敗します。 + +## 活用例 + +- 契約書、提案書、合意書に、法的拘束力のある電子署名で署名する +- PKIベースの認証が必要なワークフローで、公式文書を認証する +- 規制対応のためにPDFの請求書に署名する(EU諸国の多くが、電子署名付きの電子請求書を求めています) +- 設計図や品質文書に、組織としての承認を加える + +## ヒント + +- 自己署名証明書はテストには使えますが、Adobe Readerでは警告が表示されます。本番の文書には、信頼できる認証局の証明書を使ってください。 +- 可視署名は見た目だけのものです。暗号署名は、可視ブロックを有効にしているかどうかにかかわらず埋め込まれます。 +- 署名済みPDFを署名の検証ツールで確認し、署名が損なわれていないことを確かめましょう。 + +## 関連ツール + +- [PDF署名を検証する](./validate-signature-pdf): 署名済みPDFの電子署名を検証 +- [PDFの平坦化](./flatten-pdf): 署名前にフォームを平坦化して、改変を防止 +- [PDFの暗号化](./protect-pdf): 電子署名に加えてパスワード保護を追加 +- [メタデータの削除](./remove-metadata): 署名前にメタデータを削除 diff --git a/docs/ja/tools/divide-pages.md b/docs/ja/tools/divide-pages.md new file mode 100644 index 00000000..e840fd1e --- /dev/null +++ b/docs/ja/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: ページの分割 +description: PDFのページを、横または縦に、より小さなサブページに分割します。 +--- + +# ページの分割 + +PDFの各ページを、横または縦に分割して半分に切ります。1ページに入っている内容を別々のページに分けたいときに便利です。たとえば、2段組みのレイアウトを1枚の横長ページとしてスキャンした場合などです。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 分割の方向を選びます。**縦**(左右の半分)または **横**(上下の半分)です。 +3. 必要に応じて、分割するページを限定するページ範囲を指定します。空欄にすると、すべてのページが分割されます。 +4. 処理ボタンをクリックして、分割したPDFを生成します。 + +## 機能 + +- 縦の分割:各ページを左右の半分に分割 +- 横の分割:各ページを上下の半分に分割 +- 特定のページだけを分割するページ範囲フィルター +- 対象外のページは、そのまま通過 +- 再描画せずに、内容の品質を保持 + +## 活用例 + +- 2ページ分を1枚にスキャンしたページを分ける(例: 1枚に左右のページが写った本のスキャン) +- 内容が左右に並んだ横向きのPDFを、個別の縦向きページに分割する +- 縦長のインフォグラフィックやポスターを、上下の別々のセクションに分割する +- 大判の文書を、標準サイズの用紙に印刷できるよう準備する + +## ヒント + +- ページ内の内容の配分が偏っていても、分割は正確に中央で行われます。左右非対称に分割したい場合は、代わりに [PDFのトリミング](./crop-pdf) を検討してください。 +- 分割の前後でページの回転が必要な場合は、このツールを [PDFの回転](./rotate-pdf) と組み合わせてください。 + +## 関連ツール + +- [PDFの分割](./split-pdf) +- [PDFのトリミング](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [PDFのポスタライズ](./posterize-pdf) diff --git a/docs/ja/tools/duplex-collate.md b/docs/ja/tools/duplex-collate.md new file mode 100644 index 00000000..15e48871 --- /dev/null +++ b/docs/ja/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: 両面スキャンの並べ替え +description: 表面のページと裏面のページが別々のブロックに分かれた両面スキャンのPDFを、正しい表裏の順序に並べ替えます。 +--- + +# 両面スキャンの並べ替え + +両面スキャンの並べ替えは、1つのPDFに2つのページブロックが含まれるADFスキャンのワークフロー向けに作られています。 + +- 最初にすべての表面 +- 次にすべての裏面 + +手作業で分割して組み直す代わりに、このツールは2つのブロックを自然な読み順に交互に並べます。表1、裏1、表2、裏2、というようにです。 + +## 使い方 + +1. 両面の束をスキャンして作成した、1つのPDFをアップロードします。 +2. 表面のブロックが終わる分割位置を設定します。 +3. 裏面のブロックの扱いを選びます。 + - **裏面ブロックを反転**(裏面をスキャンする前に束をひっくり返した場合に一般的) + - **裏面ブロックをそのまま維持** +4. **PDFを並べ替え** をクリックして、並べ替えた結果をダウンロードします。 + +## オプション + +- **分割位置を自動検出(半分)**: 分割位置を `ceil(totalPages / 2)` に設定します。 +- **奇数ページの警告**: 総ページ数が奇数の場合に警告します(スキャンの不一致であることが多いです)。 +- **ブロックサイズ不一致の確認**: 表面と裏面のブロックのサイズが異なる場合に、確認を求めます。 +- **グループ別エクスポート**: 並べ替えた出力を、元の文書のページ数に基づいて個別のPDFに分割し、ZIPとしてダウンロードします。 + +## 出力の動作 + +- **デフォルト**: 1つの出力PDF(入力PDF1つに対して、出力PDF1つ)。 +- **グループモード**: 出力は、指定した文書あたりのページ数で分割されます。複数のまとまりができた場合は1つのZIPとして、そうでない場合は単一のPDFとしてダウンロードされます。 + +ブロックのサイズが揃っていない場合は、対になるページが先に並べ替えられ、残った対のないページは最後に追加されます。 + +## よくある活用例 + +- 両面印刷のフォームの束を2回に分けてスキャンした後、順序を元に戻す +- すべての表面の後にすべての裏面を出力するオフィス用スキャナーから、表裏のセットを組み直す +- アーカイブ用のスキャンを、文書ごとのファイルに分割する前に後処理する + +## ヒント + +- ほとんどの両面バッチでは、総ページ数は偶数になるはずです。 +- 裏面の向きが逆に見える場合は、**裏面ブロックを反転** と **裏面ブロックをそのまま維持** を切り替えてください。 +- 2ページの原本(表と裏)には、文書あたり `2` ページでグループ別エクスポートを使用します。 + +## 関連ツール + +- [代替ページと混合ページ](./alternate-merge) +- [PDFの分割](./split-pdf) +- [PDFの結合](./merge-pdf) +- [複製と整理](./organize-pdf) diff --git a/docs/ja/tools/edit-attachments.md b/docs/ja/tools/edit-attachments.md new file mode 100644 index 00000000..65e56fbf --- /dev/null +++ b/docs/ja/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: 添付ファイルの編集 +description: PDF文書に埋め込まれたファイル添付を表示し、選択して削除します。 +--- + +# 添付ファイルの編集 + +PDF内のファイル添付を調べて管理します。このツールは、埋め込まれたすべてのファイルを、名前と添付レベルとともに一覧表示し、個々の添付ファイルを削除対象にするか、すべてをまとめて取り除くことができます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. ツールが自動的に添付ファイルをスキャンし、一覧に表示します。 +3. 各添付ファイルには、ファイル名と、文書レベルかページレベルの添付かが表示されます。 +4. 添付ファイルの横にあるゴミ箱アイコンをクリックすると、削除対象になります(もう一度クリックすると解除されます)。 +5. **すべての添付ファイルを削除** ボタンですべてを一度に選択するか、**すべて選択解除** で選択を解除します。 +6. 処理ボタンをクリックして、選択した添付ファイルを取り除いた新しいPDFを保存します。 + +## 機能 + +- 文書レベルとページレベルのすべての添付ファイルを一覧表示 +- 個別または一括での添付ファイルの削除 +- 確定する前に、選択のオンとオフを切り替え可能 +- 削除対象の項目に、取り消し線と不透明度の変化を視覚的に表示 +- 選択した添付ファイルを取り除いた、変更後のPDFをダウンロード + +## 活用例 + +- 再配布の前に、文書に埋め込まれた古い、または誤ったファイルを削除する +- 共有の前に、PDFから機密性の高い添付ファイル(財務データ、個人情報)を取り除く +- 不要になった大きな埋め込みファイルを削除して、PDFのファイルサイズを減らす +- 埋め込まれたコンテンツを監査し、アーカイブの前に文書を整理する + +## ヒント + +- 削除対象の添付ファイルは、取り消し線付きで表示されます。気が変わった場合は、処理の前に元に戻せます。 +- 添付ファイルが見つからない場合、ツールは「添付ファイルが見つかりません」というメッセージを表示します。そのPDFには埋め込みファイルが含まれていないということです。 + +## 関連ツール + +- [添付ファイルの追加](./add-attachments) +- [添付ファイルの抽出](./extract-attachments) +- [メタデータの表示](./view-metadata) diff --git a/docs/ja/tools/edit-metadata.md b/docs/ja/tools/edit-metadata.md new file mode 100644 index 00000000..1c1cc926 --- /dev/null +++ b/docs/ja/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: メタデータの編集 +description: タイトル、作成者、キーワード、日付、カスタムプロパティなど、PDFのメタデータフィールドを表示して変更します。 +--- + +# メタデータの編集 + +PDFファイルに埋め込まれたメタデータを編集します。ツールは、文書の既存のメタデータをフォームにあらかじめ入力し、任意のフィールドを変更でき、変更を新しいPDFに保存します。 + +## 使い方 + +1. PDFファイルをアップロードします。ツールが現在のメタデータを読み取り、フォームに入力します。 +2. 標準フィールド(タイトル、作成者、サブジェクト、キーワード、作成アプリケーション、PDF変換)を編集します。 +3. 日時ピッカーで、作成日と更新日を調整します。 +4. 追加ボタンをクリックし、キーと値のペアを入力して、カスタムメタデータフィールドを追加します。 +5. 処理ボタンをクリックして、変更したPDFを保存します。 + +## 機能 + +- アップロードしたPDFの既存のメタデータをすべて自動入力 +- 標準フィールド:タイトル、作成者、サブジェクト、キーワード、作成アプリケーション、PDF変換 +- 作成日と更新日の日時ピッカー +- 任意のプロパティのための、キーと値によるカスタムメタデータフィールド +- 変更をPDFの文書情報辞書に直接保存 + +## 編集できるフィールド + +| フィールド | 説明 | +| ------------------------ | ------------------------------------------ | +| **タイトル** | PDFリーダーに表示される文書のタイトル | +| **作成者** | 文書を作成した個人または組織 | +| **サブジェクト** | 文書のトピックの簡単な説明 | +| **キーワード** | 検索や分類のための、カンマ区切りの用語 | +| **作成アプリケーション** | コンテンツを最初に作成したアプリケーション | +| **PDF変換** | PDFを生成したアプリケーション | +| **作成日** | 文書が最初に作成された日時 | +| **更新日** | 文書が最後に変更された日時 | +| **カスタムフィールド** | 独自に定義する追加のキーと値のペア | + +## 活用例 + +- 文書を公開する前に、適切なタイトルと作成者を設定する +- 文書管理システムでの検索性を高めるために、キーワードを追加する +- 現在の改訂を反映するように、更新日を更新する +- 部署、プロジェクトID、分類などのカスタムメタデータフィールドを追加する +- 元の作成ソフトが残したメタデータを整理する + +## ヒント + +- カスタムフィールドは、PDFの情報辞書に直接書き込まれます。一部のPDFリーダーではカスタムフィールドが表示されないことがありますが、ファイルには保持されます。 +- フィールドを空欄にすると、メタデータから消去されます。処理ボタンは、フォームに入っている内容をそのまま保存します。 +- 編集せずにメタデータを表示するには、[メタデータの表示](./view-metadata) を使ってください。メタデータをすべて削除するには、メタデータの削除を使います。 + +## 関連ツール + +- [メタデータの表示](./view-metadata) +- [PDF OCG](./pdf-layers) +- [PDFの圧縮](./compress-pdf) diff --git a/docs/ja/tools/edit-pdf.md b/docs/ja/tools/edit-pdf.md new file mode 100644 index 00000000..c2363756 --- /dev/null +++ b/docs/ja/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDFエディター +description: ブラウザ上で直接、PDFに注釈を付け、ハイライトし、墨消しし、図形や画像を追加し、検索し、表示します。 +--- + +# PDFエディター + +BentoPDFのPDFエディターを使うと、PDFに注釈を付け、ハイライトし、墨消しし、コメントし、図形や画像を追加し、検索できます。高機能なエディターがブラウザ上で直接読み込まれ、サーバーへのアップロードは不要です。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. 埋め込みのPDFエディターが自動的に開き、文書が読み込まれます。 +3. ツールバーを使って、注釈、ハイライト、墨消し、テキストの追加、図形の描画、画像の挿入ができます。 +4. **編集したPDFをダウンロード** をクリックして、変更を保存します。 + +## 機能 + +- ハイライト、下線、取り消し線、フリーハンド描画を備えた、フル機能の注釈ツールバー +- テキストの挿入とコメント +- 墨消しを適用すると、マークした内容を完全に削除する墨消しツール。**編集したPDFをダウンロード** をクリックしたときに適用されていないマークがある場合、エディターは先にそれらを適用するか確認します。 +- 長方形、円、線、矢印の図形ツール +- PDFのページへの画像の挿入 +- 文書全体を対象とした、内蔵のテキスト検索 +- タブによる複数文書のサポート(最大10個の文書を同時に開けます) +- ドラッグ&ドロップによるファイルの読み込み + +## 活用例 + +- 契約書を確認し、ハイライトやコメントで変更箇所に印を付ける +- 共有の前に、社会保障番号や財務データなどの機密情報を墨消しする +- 建築図面や設計図に注釈を追加する +- 会社のロゴやスタンプを文書のページに挿入する +- 長い法的文書から、特定の用語を検索する + +## ヒント + +- 複数のPDFを同時に開き、エディター上部のタブバーで切り替えられます。 +- エディターは元のPDFの構造を保持するため、フォント、レイアウト、フォームフィールドはそのまま維持されます。 +- テキストや領域を墨消し対象にマークしただけでは、墨消しを適用するまで何も削除されません。選択したテキストを墨消しすると、ファイルのプロパティ、しおり、コメント、添付ファイルにあるそのコピーも、ダウンロードから削除されます(ファイルが暗号化されている場合を除く)。 +- 一括の透かしやページ番号の追加には、書式をより細かく制御できる専用ツールを使ってください。 + +## 関連ツール + +- [透かしの追加](./add-watermark) +- [PDFへ署名](./sign-pdf) +- [スタンプの追加](./add-stamps) +- [注釈の削除](./remove-annotations) diff --git a/docs/ja/tools/email-to-pdf.md b/docs/ja/tools/email-to-pdf.md new file mode 100644 index 00000000..371f8a53 --- /dev/null +++ b/docs/ja/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: 電子メールからPDF +description: EMLおよびMSGのメールファイルをブラウザでPDFに変換します。ヘッダー、本文、添付ファイルの一覧を保持します。 +--- + +# 電子メールからPDF + +保存したメールファイルを、すっきりした印刷可能なPDFに変換します。このツールはEMLとMSGのファイルを解析し、ヘッダー、本文、添付ファイルのメタデータを含むメッセージ全体を取り出して、構造化されたPDFに描画します。法的な証拠開示、記録の保管、あるいは大事なメールを印刷したいときに役立ちます。 + +## 対応形式 + +| 形式 | 拡張子 | 備考 | +| :--- | :----- | :----------------------------------------------------------------------- | +| EML | `.eml` | 標準的なMIME形式のメール(ほとんどのメールクライアントからエクスポート) | +| MSG | `.msg` | Microsoft Outlookの独自形式 | + +## 使い方 + +1. アップロード領域をクリックするか、EMLまたはMSGファイルをドラッグ&ドロップします。両方の形式を1回のバッチに混在させることもできます。 +2. ファイル一覧を確認します。不要な項目はゴミ箱アイコンで削除するか、**ファイルを追加** をクリックして、さらにメールを追加します。 +3. 変換オプションを設定します(下記参照)。 +4. **PDFに変換** をクリックします。ツールは各メールを解析し、内容をスタイル付きHTMLとして描画して、PyMuPDFエンジンでPDFに変換します。 +5. 1通のメールの場合は、PDFとして直接ダウンロードされます。複数のメールの場合は `emails-converted.zip` にまとめられます。 + +## オプション + +| オプション | デフォルト | 説明 | +| :--------------------------- | :--------- | :-------------------------------------------------------------------------------------- | +| **ページサイズ** | A4 | A4、Letter、Legalのページ寸法から選択します。 | +| **CCとBCCを含める** | オン | 有効にすると、CCとBCCの宛先リストが、PDFのメールヘッダー部分に表示されます。 | +| **添付ファイル一覧を含める** | オン | 有効にすると、メールのファイル添付の一覧(ファイル名とサイズ付き)がPDFに表示されます。 | + +## 活用例 + +- コンプライアンスや監査のために、重要なビジネス上のやり取りをPDFとして保管する +- 法的手続きや証拠開示の要求のために、メールのスレッドを印刷する +- メールで受け取った注文確認、領収書、契約書の恒久的な記録を作成する +- Outlookがなくても読める形式で、OutlookのMSGファイルをバックアップする +- エクスポートしたEMLファイルから、カスタマーサポートのやり取りを記録する + +## ヒント + +- EML(Thunderbird、Apple Mail、ほとんどのメールクライアントで使われます)とOutlookのMSGファイルの両方に対応しています。メールクライアントからメールをエクスポートして、そのままツールにドロップしてください。 +- HTML形式のメールは、PDFでもスタイルが保たれます。プレーンテキストのメールは、すっきりした読みやすい書式で描画されます。 +- 添付ファイルの一覧にはファイル名とサイズが表示されますが、実際の添付ファイルがPDFに埋め込まれることはありません。 + +## 関連ツール + +- [XMLからPDF](./xml-to-pdf) +- [XPSからPDF](./xps-to-pdf) diff --git a/docs/ja/tools/epub-to-pdf.md b/docs/ja/tools/epub-to-pdf.md new file mode 100644 index 00000000..ddd3fc71 --- /dev/null +++ b/docs/ja/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUBからPDF +description: EPUB電子書籍をブラウザでPDFに変換します。無料、アップロード不要、プライバシー第一の変換です。 +--- + +# EPUBからPDF + +EPUBの電子書籍を、ブラウザから離れることなくPDFファイルに変換します。EPUBはデジタル書籍のオープンスタンダードですが、印刷、注釈の追加、電子書籍リーダーを持っていない人との共有のために、レイアウト固定のPDFが必要になることがあります。 + +## 対応形式 + +| 形式 | 拡張子 | 備考 | +| :--- | :------ | :----------------------- | +| EPUB | `.epub` | EPUB 2とEPUB 3のファイル | + +## 使い方 + +1. アップロード領域をクリックするか、EPUBファイルをドラッグ&ドロップします。複数選択に対応しています。 +2. アップロードしたファイルを確認します。不要な項目はゴミ箱アイコンで削除するか、**ファイルを追加** をクリックして、バッチを広げます。 +3. **PDFに変換** をクリックします。PyMuPDFエンジンが、EPUBの内容(テキスト、画像、書式)をページ分割されたPDF出力に描画します。 +4. 1つのEPUBの場合は、PDFとして直接ダウンロードされます。複数ファイルの場合は、`epub-converted.zip` という名前のZIPアーカイブにまとめられます。 + +## オプション + +変換は妥当なデフォルト設定で実行され、必須の設定はありません。テキストは標準のページ寸法に再配置され、埋め込みフォントと画像はPDFに引き継がれます。 + +## 活用例 + +- DRMフリーの電子書籍を印刷して、画面から離れて読む +- EPUBの原稿を、レビュー用にレイアウト固定のPDFとして提出する +- デジタル書籍を、どのOSでも標準で開ける形式でアーカイブする +- EPUBリーダーを持っていない同僚に、1つの章を共有する +- EPUBで配布されている技術文書を、注釈を付けられるPDFに変換する + +## ヒント + +- 埋め込み音声や動画といったEPUB 3の機能はPDFに引き継がれませんが、テキスト、画像、表はすべてきれいに変換されます。 +- スタイルが多用されたEPUBで最良の結果を得るには、出力の最初の数ページを確認して、レイアウトが忠実か確かめてください。 + +## 関連ツール + +- [MOBIからPDFへの変換](./mobi-to-pdf) +- [FB2からPDF](./fb2-to-pdf) +- [CBZからPDF](./cbz-to-pdf) diff --git a/docs/ja/tools/excel-to-pdf.md b/docs/ja/tools/excel-to-pdf.md new file mode 100644 index 00000000..cd5dd92d --- /dev/null +++ b/docs/ja/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: ExcelからPDF +description: Excelスプレッドシート(XLS、XLSX)、ODS、CSVファイルを、書式を保ったままPDFに変換します。 +--- + +# ExcelからPDF + +表計算ファイルをPDFに変換します。このツールは、最新のExcelファイル、従来のXLS形式、OpenDocumentスプレッドシート、さらにCSVにも対応しており、そのすべてがブラウザ上のLibreOfficeエンジンで描画されるため、セルの書式、数式(計算された値として)、グラフ、複数シートのレイアウトが保たれます。 + +## 対応形式 + +| 形式 | 拡張子 | +| :--------------------------- | :------ | +| Excel(最新) | `.xlsx` | +| Excel(従来) | `.xls` | +| OpenDocumentスプレッドシート | `.ods` | +| CSV | `.csv` | + +## 使い方 + +1. アップロード領域をクリックするか、表計算ファイルをドラッグ&ドロップします。 +2. ファイル一覧を確認します。ファイルを追加したり、不要なものを削除したりできます。 +3. **PDFに変換** をクリックします。LibreOfficeエンジンは初回の使用時に初期化され、その後で各ファイルを処理します。 +4. 1ファイルの場合は、PDFとして直接ダウンロードされます。複数ファイルの場合は `excel-converted.zip` として提供されます。 + +## オプション + +このツールに追加の設定はありません。ページレイアウト、拡大縮小、印刷範囲は、スプレッドシートに組み込まれた設定に基づいて、LibreOfficeエンジンが決定します。 + +## 出力 + +| 入力数 | 出力 | +| :------------ | :--------------------------------------------------------------------- | +| 1ファイル | 単一のPDFをダウンロード(元のファイル名に `.pdf` 拡張子) | +| 2ファイル以上 | ZIPアーカイブ(`excel-converted.zip`)に、ファイルごとに1つのPDFを格納 | + +## 活用例 + +- 配布用に、財務レポートや予算表をExcelからPDFに変換する +- 在庫表や商品カタログのスプレッドシートから、印刷用のPDFを作成する +- Excelがインストールされていない関係者に、データ分析の結果を共有する +- 四半期レポートを、編集できない形式でアーカイブする +- LibreOffice CalcのODSファイルをPDFに変換する + +## ヒント + +- スプレッドシートに埋め込まれたグラフはPDFに描画されます。変換する前に、元のファイルで正しく見えることを確認してください。 +- スプレッドシートに複数のシートがある場合、すべてのシートがPDFの出力に含まれます。 +- 書式のない単純なCSVデータには、[CSVからPDF](./csv-to-pdf) ツールのほうが軽量な変換になります。書式、グラフ、複数シートを保持したい場合は、ExcelからPDFを使ってください。 + +## 関連ツール + +- [CSVからPDF](./csv-to-pdf) +- [WordからPDF](./word-to-pdf) +- [PowerPointからPDF](./powerpoint-to-pdf) diff --git a/docs/ja/tools/extract-attachments.md b/docs/ja/tools/extract-attachments.md new file mode 100644 index 00000000..579a0f68 --- /dev/null +++ b/docs/ja/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: 添付ファイルの抽出 +description: 1つ以上のPDFから、埋め込まれたファイル添付をすべて抽出し、ZIPアーカイブとしてダウンロードします。 +--- + +# 添付ファイルの抽出 + +1つ以上のPDFファイルから、埋め込まれたすべての添付ファイルを取り出します。抽出されたファイルは、ダウンロード用に1つのZIPアーカイブにまとめられます。 + +## 使い方 + +1. 埋め込まれた添付ファイルを含む、1つ以上のPDFファイルをアップロードします。 +2. **添付ファイルを抽出** をクリックします。 +3. ツールが、各PDFの文書レベルとページレベルの添付ファイルをスキャンします。 +4. 見つかったすべてのファイルがZIPアーカイブにまとめられ、自動的にダウンロードされます。 +5. ステータスメッセージで、見つかった添付ファイルの数と合計サイズを確認できます。 + +## 機能 + +- 複数のPDFからの一括抽出 +- 文書レベルとページレベルの両方の添付ファイルを抽出 +- 抽出したすべてのファイルを含む、1つのZIPファイルを出力 +- 添付ファイルの合計数と合計ファイルサイズを表示 +- 添付ファイルが見つからない場合は、わかりやすいステータスメッセージを表示 + +## 活用例 + +- レポートのPDFに埋め込まれたデータファイルを復元する +- ポートフォリオや仕様書から、画像素材を取り出す +- 研修やコンプライアンス用のPDFから、補足資料を抽出する +- 一連のPDFにどのファイルが埋め込まれているかを監査する + +## ヒント + +- ツールが添付ファイルなしと報告した場合、PDFには、ファイル添付ではなく、埋め込み画像やフォームデータが含まれている可能性があります。それらはファイル添付ではありません。埋め込み画像には [画像の抽出](./extract-images) を使ってください。 +- 複数のPDFを処理すると、すべてのファイルの添付ファイルが1つのZIPにまとめられます。ファイル名は、元の埋め込み時のものが保持されます。 + +## 関連ツール + +- [添付ファイルの追加](./add-attachments) +- [添付ファイルの編集](./edit-attachments) +- [画像の抽出](./extract-images) diff --git a/docs/ja/tools/extract-images.md b/docs/ja/tools/extract-images.md new file mode 100644 index 00000000..667ad9e4 --- /dev/null +++ b/docs/ja/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: 画像の抽出 +description: PDFファイルから、埋め込まれたすべての画像を抽出します。グリッドでプレビューし、個別に、またはZIPアーカイブとしてダウンロードできます。 +--- + +# 画像の抽出 + +1つ以上のPDFファイルから、埋め込まれたすべての画像を取り出します。抽出された画像はプレビューグリッドに表示され、個別にダウンロードすることも、ZIPとしてすべてを一度に取得することもできます。PyMuPDFを搭載しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、1つ以上のPDFをアップロードします。必要に応じてファイルを追加したり、個別に削除したりできます。 +2. **抽出** をクリックして、処理を開始します。 +3. ツールが、アップロードされたすべてのPDFのすべてのページをスキャンし、埋め込まれた画像を見つけて抽出します。 +4. 抽出された画像がサムネイル付きのグリッドに表示されます。各画像にはダウンロードボタンがあります。 +5. **すべてダウンロード** をクリックして、すべてをZIPアーカイブとして保存します。 + +## オプション + +このツールに設定可能なオプションはありません。埋め込まれたすべての画像は、元の形式(通常はPNG、JPEG、またはPDFに埋め込まれたときに使われた形式)で抽出されます。 + +## 出力形式 + +- 画像は、`image_1.png`、`image_2.jpg` のような名前でプレビューグリッドに表示されます。 +- **すべてダウンロード** は、すべての画像を含む `extracted-images.zip` を生成します。 +- 個々の画像は、グリッドから1つずつダウンロードできます。 + +## 活用例 + +- PDFから写真やグラフィックを取り出して、別のプロジェクトで再利用する。 +- ECサイトの掲載用に、カタログのPDFから商品画像を抽出する。 +- プレゼンテーションで使うために、技術文書から図を取り出す。 +- 共有する前に、文書にどの画像が埋め込まれているかを監査する。 + +## ヒント + +- このツールは、PDFに保存されているとおりの画像を抽出します。ページを画像として再描画することはありません。それには、[PDFからPNG](./pdf-to-png) や [PDFからJPG](./pdf-to-jpg) を使ってください。 +- ツールが「画像が見つかりません」と報告した場合、PDFが埋め込みのラスター画像ではなくベクターグラフィックを使っているか、ページ全体が1枚の大きな画像になっているスキャン文書である可能性があります。 +- バッチ処理は、複数のPDFにまたがって機能します。すべてのファイルのすべての画像が、1つのグリッドと1つのZIPにまとめられます。 + +## 関連ツール + +- [PDFからPNG](./pdf-to-png) +- [PDFからJPG](./pdf-to-jpg) +- [PDFワークフロービルダー](./pdf-workflow) diff --git a/docs/ja/tools/extract-pages.md b/docs/ja/tools/extract-pages.md new file mode 100644 index 00000000..7917e674 --- /dev/null +++ b/docs/ja/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: ページの抽出 +description: PDFから特定のページ範囲を、新しい文書として保存します。 +--- + +# ページの抽出 + +PDFから複数のページを取り出して、新しいファイルとして保存します。範囲の構文で必要なページを正確に指定すると、ツールがそれらのページだけを含むすっきりしたPDFを作成します。 + +## 使い方 + +1. PDFファイルをアップロードします。ツールにファイル名、サイズ、総ページ数が表示されます。 +2. 範囲の構文(例: `1-5`、`3, 7, 10-12`)で、抽出したいページを入力します。 +3. 必要に応じて、各範囲を別々のPDFとしてZIPアーカイブでダウンロードするよう選択します。 +4. 処理ボタンをクリックします。抽出されたページが、新しいPDF(またはZIP)としてダウンロードされます。 + +## 機能 + +- 柔軟なページ範囲の構文:個別のページ、範囲、またはカンマ区切りの組み合わせ +- アップロード後に総ページ数を表示し、参照しやすく +- 1つにまとめたPDF、またはZIP内の別々のファイルとして出力するオプション +- 元のページの内容と書式を保持 + +## 活用例 + +- 長いレポートから、エグゼクティブサマリー(最初の数ページ)を取り出す +- 教科書のPDFから、1つの章を抽出する +- 書類一式から特定のページを、独立した文書として保存する +- 大きなファイルの選択したページから、サンプル文書を作成する + +## ヒント + +- ページ番号は1から始まります。最初のページには `0` ではなく `1` を使ってください。 +- ページを抽出するのではなく取り除きたい場合は、逆の操作にあたる [ページの削除](./delete-pages) を使ってください。 +- サムネイルでページを視覚的に選択したい場合は、[PDFの分割](./split-pdf) をビジュアル選択モードで使ってください。 + +## 関連ツール + +- [PDFの分割](./split-pdf) +- [ページの削除](./delete-pages) +- [PDFの結合](./merge-pdf) diff --git a/docs/ja/tools/extract-tables.md b/docs/ja/tools/extract-tables.md new file mode 100644 index 00000000..a3aa678f --- /dev/null +++ b/docs/ja/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: PDFテーブルの抽出 +description: PDF文書から表を検出して抽出します。表ごとに、CSV、JSON、Markdownとしてエクスポートできます。 +--- + +# PDFテーブルの抽出 + +PDF内のすべての表を検出し、CSV、JSON、Markdownのお好みの形式でエクスポートできます。各表は、ページと位置のメタデータとともに個別に抽出されます。PyMuPDFの表検出エンジンを搭載しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. お好みの **エクスポート形式** を選びます。CSV、JSON、Markdownのいずれかです。 +3. **抽出** をクリックして、処理を開始します。 +4. 表が1つ見つかった場合は、単一のファイルとしてダウンロードされます。複数の表がある場合は、表ごとに1ファイルのZIPアーカイブになります。 + +## オプション + +- **エクスポート形式**: 次から選べます。 + - **CSV**: カンマ、引用符、改行を含むフィールドを適切に引用符で囲んだ、カンマ区切りの値。表計算ソフトやデータベースに適しています。 + - **JSON**: 配列の配列の構造で、2スペースのインデントで整形されます。プログラムでの利用に適しています。 + - **Markdown**: PyMuPDFが描画する、パイプ区切りの表形式。ドキュメントやREADMEファイルに適しています。 + +## 出力形式 + +- **表が1つ**: `filename_table.csv`(または `.json` / `.md`) +- **複数の表**: `table_1_page3.csv`、`table_2_page5.csv` のような名前のファイルを含む `filename_tables.zip` + +## 活用例 + +- 長いPDFレポートから、文書全体のデータを取り出さずに、特定の表だけを抽出する。 +- GitHubのIssue、Wiki、ドキュメントに直接貼り付けるために、表をMarkdown形式で取得する。 +- APIの連携やスクリプトのために、PDFの表から構造化されたJSONデータを取り出す。 +- 異なるバージョンのPDFの表を、両方をCSVにエクスポートして差分を取って比較する。 + +## ヒント + +- このツールでは表ごとに制御できます。すべての表を1つのCSVにまとめて出力するだけなら、[PDFからCSV](./pdf-to-csv) を使ってください。Excelのブック全体が必要な場合は、[PDFからExcel](./pdf-to-excel) を使ってください。 +- 複数のページにまたがる表は、ページごとに別々の表として検出されることがあります。手動で連結する必要があるかもしれません。 +- 表が検出されない場合、PDFはスキャン画像かもしれません。先にOCRを実行して、テキストレイヤーを追加してください。 + +## 関連ツール + +- [PDFからCSV](./pdf-to-csv) +- [PDFからExcel](./pdf-to-excel) +- [PDFからテキスト](./pdf-to-text) diff --git a/docs/ja/tools/fb2-to-pdf.md b/docs/ja/tools/fb2-to-pdf.md new file mode 100644 index 00000000..1e63817c --- /dev/null +++ b/docs/ja/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2からPDF +description: FictionBook(FB2)形式の電子書籍をブラウザー上でPDFに変換します。無料でプライベート、サーバーへのアップロードは不要です。 +--- + +# FB2からPDF + +FictionBook 2(FB2)ファイルをPDFドキュメントに変換します。FB2はXMLベースの電子書籍フォーマットで、ロシアや東欧で広く使われています。一部のプラットフォームでは対応していますが、ほとんどの環境ではほぼ知られていません。PDFに変換すれば、どこでも本を読めるようになります。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :------------ | :----- | :---------------------- | +| FictionBook 2 | `.fb2` | XMLベースの電子書籍形式 | + +## 使い方 + +1. アップロードエリアをクリックするか、FB2ファイルをドラッグ&ドロップします。複数ファイルの一括選択も可能です。 +2. ファイル一覧を確認します。ゴミ箱アイコンで個別に削除でき、**ファイルを追加**でさらに追加できます。 +3. **PDFに変換**をクリックします。PyMuPDFエンジンがFB2のXML構造を解析し、ページ分割されたPDFとして出力します。 +4. ファイルが1つの場合はPDFが直接ダウンロードされます。複数の場合は`fb2-converted.zip`にまとめられます。 + +## オプション + +設定は不要です。コンバーターがFB2のXML構造を自動で処理し、章の区切り、書式、埋め込み画像を保持します。 + +## 活用例 + +- PDFにしか対応していない端末やアプリでFB2の電子書籍を読む +- FB2形式で配布されているロシア語文学を印刷する +- FB2ライブラリを、どこでも使える形式でアーカイブする +- FictionBookに対応していないリーダーを使っている相手に本を共有する + +## ヒント + +- FB2ファイルはプレーンなXMLなので、サイズが小さく、ブラウザー上でも素早く変換できます。 +- FB2ファイルが`.fb2.zip`として圧縮されている場合は、先に展開してからアップロードしてください。 + +## 関連ツール + +- [EPUBからPDF](./epub-to-pdf) +- [MOBIからPDFへの変換](./mobi-to-pdf) +- [XMLからPDF](./xml-to-pdf) diff --git a/docs/ja/tools/fix-page-size.md b/docs/ja/tools/fix-page-size.md new file mode 100644 index 00000000..b39cee0c --- /dev/null +++ b/docs/ja/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: ページサイズを固定 +description: PDF内のすべてのページを同じサイズに統一します。標準の用紙サイズから選ぶか、任意のサイズを指定できます。 +--- + +# ページサイズを固定 + +複数の出典から組み立てたPDFでは、LetterとA4が混在したり、規格外のサイズが混ざったりして、ページサイズがそろわないことがあります。このツールはすべてのページを1つのサイズに揃え、必要に応じて内容を拡大縮小して収めたり埋めたりします。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. ドロップダウンから**ターゲットページサイズ**を選びます(A4、Letter、Legal、A3、A5、Tabloid、カスタム)。 +3. **向き**を選びます。自動なら各ページの元の向きを保ち、縦または横に固定することもできます。 +4. **コンテンツのスケーリング**モードを選びます。フィット(内容をすべて保持、余白が付く場合あり)またはフィル(ページを埋める、端が切れる場合あり)です。 +5. 必要に応じて、追加される余白の**背景色**を設定します。 +6. **ページサイズを固定**をクリックします。 + +## オプション + +- **標準サイズ**: A4、Letter、Legal、A3、A5、Tabloid +- **カスタムサイズ**: 幅と高さをインチまたはミリメートルで入力 +- **向き**: 自動、縦、横 +- **スケーリングモード**: フィットまたはフィル(トリミング) +- **背景色**: 余白部分に使う任意の色 + +## 活用例 + +- 別々のスキャナーで取り込んだページを結合したPDFを統一する +- USレターの文書を海外向けにA4へ変換する +- 一定の仕上がりサイズが必要な印刷用PDFを準備する +- 標準からわずかにずれたページ(例: 8.5 x 11ではなく8.49 x 11.02インチ)を修正する + +## ヒント + +- 内容を失いたくない場合はフィットモードを使います。フィルモードは見た目がすっきりしますが、端が切れることがあります。 +- 出力は「ページ寸法」ツールで確認すると、すべてのページが目標サイズに一致しているか分かります。 +- 背景色の初期値は白です。文書の余白が暗い場合は暗い色に切り替えてください。 + +## 関連ツール + +- [ページ寸法](./page-dimensions): 修正の前後でページサイズを確認 +- [PDFの圧縮](./compress-pdf): 統一後にファイルサイズを削減 +- [PDFのトリミング](./crop-pdf): 自動スケーリングの代わりに手動でトリミング diff --git a/docs/ja/tools/flatten-pdf.md b/docs/ja/tools/flatten-pdf.md new file mode 100644 index 00000000..011818c9 --- /dev/null +++ b/docs/ja/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: PDFの平坦化 +description: インタラクティブなフォームと注釈を静的なコンテンツに平坦化します。フォームフィールドは編集不可になり、注釈はページに焼き付けられます。 +--- + +# PDFの平坦化 + +平坦化では、フォームフィールド、ドロップダウン、チェックボックス、注釈、ハイライト、付箋などのインタラクティブな要素をページの内容に直接統合します。見た目は変わりませんが、編集も抽出もできなくなります。入力済みのフォームを印刷してスキャンし直すのと同じ効果ですが、画質は完全に保たれます。 + +## 使い方 + +1. 1つ以上のPDFファイルをアップロードします。 +2. **PDFを平坦化**をクリックします。 +3. ファイルが1つの場合は直接ダウンロードされ、複数の場合はZIPアーカイブになります。 + +このツールはpdf-libでフォームフィールドを平坦化し(`form.flatten()`経由)、専用の注釈フラットナーで注釈をページストリームに焼き付けます。どちらの処理も1回のパスで行われます。 + +## 平坦化されるもの + +- **フォームフィールド**: テキスト入力、チェックボックス、ラジオボタン、ドロップダウン、署名フィールド +- **注釈**: コメント、ハイライト、取り消し線、下線、付箋、スタンプ、インク注釈 +- **インタラクティブ要素**: ボタン、アクショントリガー + +## 変更されないもの + +- テキストの内容(選択や検索は引き続き可能) +- 画像とグラフィック +- ページのレイアウトと寸法 +- しおりと目次 +- ハイパーリンク(注釈ベースのものを除く) + +## 活用例 + +- 入力済みのフォームをロックし、受取人が提出内容を変更できないようにする +- インタラクティブ要素が不要なアーカイブ用にPDFを準備する +- ビューアーごとに注釈の表示が異なる問題を解消する +- 署名済みの文書が署名後に変更されないようにする +- フォームフィールドの定義と注釈オブジェクトを除去してファイルサイズを減らす + +## ヒント + +- すべての編集が終わってから平坦化してください。平坦化したPDFを元に戻す方法はありません。 +- 平坦化に加えてメタデータ、JavaScript、添付ファイルも削除したい場合は、代わりに「PDFをサニタイズ」ツールを使ってください。平坦化もオプションの1つとして含まれています。 +- 「フォームが見つかりません」と表示されるPDFがありますが、文書に注釈のみでフォームフィールドがない場合は正常です。 + +## 関連ツール + +- [PDFをサニタイズ](./sanitize-pdf): フォームの平坦化に加え、メタデータやスクリプトなども削除 +- [PDFの画像化](./rasterize-pdf): 画像ベースのPDFに変換して最大限に平坦化 +- [フォントをアウトライン化](./font-to-outline): フォントをベクターパスに平坦化 +- [PDFの暗号化](./protect-pdf): 平坦化したPDFをパスワードでロック diff --git a/docs/ja/tools/font-to-outline.md b/docs/ja/tools/font-to-outline.md new file mode 100644 index 00000000..73bb3478 --- /dev/null +++ b/docs/ja/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: フォントをアウトライン化 +description: PDFのすべてのフォントをベクターアウトラインに変換し、どのデバイスでも同じ表示にします。フォント依存の問題を解消します。 +--- + +# フォントをアウトライン化 + +フォントをアウトライン化すると、すべての文字がフォントのグリフからベクターパスに変換されます。PDFはインストール済みのフォントに依存しなくなり、あらゆるデバイス、OS、プリンターで同じように表示されます。これは印刷前工程(プリプレス)の標準的な手順です。 + +## 使い方 + +1. 1つ以上のPDFファイルをアップロードします。 +2. **アウトラインに変換**をクリックします。 +3. Ghostscriptがすべてのテキストをベクターパスに変換します。 +4. 結果をダウンロードします。複数ファイルの場合はZIPアーカイブになります。 + +設定項目はありません。このツールはGhostscript(WebAssembly)を使い、すべてのフォント参照を1回のパスでアウトライン化したパスに変換します。 + +## 変わること + +- 文字がベクター曲線(ベジェパス)になる +- フォントの埋め込みが不要になり、PDFはグリフレベルで自己完結する +- ベクターパスは通常フォント参照より大きいため、ファイルサイズが増える場合がある +- 見た目は完全に保たれる + +## 失われるもの + +- テキストの選択とコピー&ペースト +- テキスト検索(Ctrl+Fが使えなくなる) +- テキスト内容の編集 +- スクリーンリーダーによるアクセシビリティ + +## 活用例 + +- アウトライン化したフォントを要求する印刷所にPDFを送る +- カスタムフォントやライセンスフォントを使った文書を、そのフォントを持たない相手と共有する +- 他のシステムでフォントが置き換わって見た目が変わるのを防ぐ +- ベクター入力が必要なレーザー彫刻やCNCカットの工程用にPDFを準備する +- ロゴを多く含むPDFをすべてのプラットフォームで正しく表示させる + +## ヒント + +- 元のPDFは必ず保管してください。アウトライン化は元に戻せず、パスを編集可能なテキストに戻すことはできません。 +- テキストを検索可能なままにしたい場合は、代わりに「PDFの画像化」ツールを使い、その後にOCRを行うことを検討してください。 +- アウトライン化したPDFは大きくなりがちです。ファイルサイズが気になる場合は、後から「PDFの圧縮」を実行してください。 + +## 関連ツール + +- [PDFの平坦化](./flatten-pdf): フォントには触れずにフォームと注釈を平坦化 +- [PDFの画像化](./rasterize-pdf): ベクターアウトラインの代わりに画像ベースのPDFに変換 +- [PDFの圧縮](./compress-pdf): アウトライン化後にファイルサイズを削減 +- [PDFからPDF/A](./pdf-to-pdfa): フォント非依存にしたうえで、アーカイブ用に変換 diff --git a/docs/ja/tools/form-creator.md b/docs/ja/tools/form-creator.md new file mode 100644 index 00000000..ae2f58fa --- /dev/null +++ b/docs/ja/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: PDFフォームの作成 +description: テキストフィールド、チェックボックス、ドロップダウン、ラジオボタンなどをドラッグ&ドロップして、入力可能なPDFフォームを作成します。 +--- + +# PDFフォームの作成 + +入力可能なPDFフォームを、ゼロから、または既存のPDFにフィールドを追加して作成できます。ビジュアルエディターで、テキストフィールド、チェックボックス、ドロップダウン、ラジオボタン、署名フィールドなどのフォーム要素をページプレビューに直接ドラッグ&ドロップできます。フィールドのプロパティを設定し、条件付き表示ルールを組んで、完全にインタラクティブなPDFフォームとして書き出せます。 + +## 使い方 + +1. 既存のPDFをアップロードするか、**空白のPDFを作成**をクリックしてゼロから始めます。 +2. 空白のPDFを作成する場合は、ページサイズ(Letter、A4、A5、Legal、Tabloid、A3、またはカスタム寸法)を選びます。 +3. フィールドの種類を並べたツールバーとページプレビューのあるフォームエディターが開きます。 +4. ツールバーからフィールドの種類を選び、ページ上をクリックして配置します。 +5. フィールドをドラッグして位置を変え、リサイズハンドルでサイズを調整します。 +6. フィールドをクリックするとプロパティパネルが開き、フィールド名、初期値、フォントサイズ、配置などを設定できます。 +7. ページ操作でページ間を移動します。 +8. **保存**をクリックして、完成した入力可能なPDFをダウンロードします。 + +## 機能 + +- ドラッグ&ドロップでのフィールド配置と、リサイズ用のビジュアルハンドル +- フィールドの種類: テキスト入力、複数行テキスト、チェックボックス、ドロップダウン、ラジオボタン、署名、日付、数値、バーコード +- 各フィールドの名前、ラベル、初期値、フォントサイズ、色、配置、検証を設定するプロパティパネル +- フィールドアクションと条件付き表示ルール(他のフィールドの値に応じてフィールドを表示/非表示) +- 複数ページのフォームに対応したページ移動 +- 既存フィールドの抽出: アップロードしたPDFからフォームフィールドを自動で検出して取り込み +- アップロードしたPDFと空白ページの両方をフォームのキャンバスとして利用可能 +- 複数のページサイズプリセットとカスタム寸法 +- bwip-jsによるバーコード生成 +- ラジオボタングループの管理 + +## オプション + +**ページサイズのプリセット(空白のPDF用):** + +- Letter(8.5" x 11") +- A4(210mm x 297mm) +- A5(148mm x 210mm) +- Legal(8.5" x 14") +- Tabloid(11" x 17") +- A3(297mm x 420mm) +- カスタム(幅と高さを指定) + +**フィールドのプロパティ(フィールドの種類により異なります):** + +- 名前、ラベル、プレースホルダーテキスト +- 初期値 +- フォントファミリー、サイズ、色 +- テキストの配置(左、中央、右) +- 必須フィールドの切り替え +- 読み取り専用の切り替え +- テキストフィールドの最大文字数 +- ドロップダウンとラジオボタンの選択肢リスト +- 条件付き表示アクション + +## 活用例 + +- 個人情報用のテキストフィールドと、規定への同意用のチェックボックスを備えた入社手続きフォームを作る +- サービス選択用のドロップダウンを備えた顧客向けヒアリングシートを作る +- 計算フィールドとバーコード識別子を備えた注文書を設計する +- 合格/不合格を選ぶラジオボタンを使った点検チェックリストを作る +- 回答に応じて追加の質問が表示される条件付きのアンケートフォームを作る + +## ヒント + +- 既存のPDFをアップロードすると、すでにあるフォームフィールドの抽出を試み、編集や追加ができるようになります。 +- 排他的な選択肢にはラジオボタングループ機能を使います。同じラジオグループのフィールドはグループ名を共有します。 +- フォームをダウンロードして[PDFフォーム入力機能](./form-filler)で開き、フィールドの動作を確認してください。 + +## 関連ツール + +- [PDFフォーム入力機能](./form-filler) +- [PDFへ署名](./sign-pdf) +- [PDFエディター](./edit-pdf) diff --git a/docs/ja/tools/form-filler.md b/docs/ja/tools/form-filler.md new file mode 100644 index 00000000..8427e424 --- /dev/null +++ b/docs/ja/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDFフォーム入力機能 +description: XFAフォームを含むPDFフォームを、埋め込みビューアーでブラウザー上で直接入力します。 +--- + +# PDFフォーム入力機能 + +フォームフィールドのあるPDFを開き、埋め込みビューアーで直接入力できます。標準のAcroFormフィールドと、従来のXFA(XML Forms Architecture)フォームの両方に対応しています。入力が終わったら、ワンクリックで記入済みのPDFをダウンロードできます。 + +## 使い方 + +1. フォームフィールドを含むPDFをアップロードします。 +2. 文書が統合PDFビューアーで開き、フォームフィールドがインタラクティブな入力欄として表示されます。 +3. テキストフィールド、チェックボックス、ドロップダウン、ラジオボタンをクリックして入力します。 +4. **保存してダウンロード**をクリックすると、記入済みのPDFが取得できます。 + +## 機能 + +- フォームフィールドを操作できる、PDF.jsの埋め込みビューアー +- 標準のAcroFormフィールド(テキスト入力、チェックボックス、ドロップダウン、ラジオボタン)に対応 +- 従来のXMLベースのフォーム向けにXFAフォームに対応 +- ページ寸法に合わせたビューアーサイズの自動調整 +- ファイル名とサイズの表示 + +## オプション + +追加の設定項目はありません。フォームをアップロードして入力し、ダウンロードするだけです。 + +## 活用例 + +- 税務書類、保険の申込書、役所の書類に記入する +- PDFの添付ファイルで届いた求人応募フォームに記入する +- 取引先登録フォームやサプライヤー向けアンケートに記入する +- チェックボックスのフィールドでコンプライアンスのチェックリストを承認する +- 診察前に問診票に記入する + +## ヒント + +- XFAフォームは従来の形式で、一部のPDFビューアーでしか対応していません。XFAのPDFをChromeやほとんどのツールで開いて空白ページが表示される場合、それらのビューアーがXFAに対応していないためです。BentoPDFのフォーム入力機能とFirefoxはXFAを正しく処理できます。 +- 既存のフォームフィールドがないPDFは、まず[PDFフォームの作成](./form-creator)ツールでフィールドを追加してから、ここで入力してください。 +- ビューアーはPDFのページ寸法に合わせて自動でサイズが調整されます。 + +## 関連ツール + +- [PDFフォームの作成](./form-creator) +- [PDFへ署名](./sign-pdf) +- [PDFエディター](./edit-pdf) diff --git a/docs/ja/tools/header-footer.md b/docs/ja/tools/header-footer.md new file mode 100644 index 00000000..23a689ca --- /dev/null +++ b/docs/ja/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: ヘッダーとフッター +description: ページ番号の動的変数を使って、PDFのページにカスタマイズ可能なヘッダーとフッターのテキストを追加します。 +--- + +# ヘッダーとフッター + +PDFのページの6か所(ヘッダー左、ヘッダー中央、ヘッダー右、フッター左、フッター中央、フッター右)にテキストを追加します。ページ番号と総ページ数の動的変数に対応しているので、「10ページ中3ページ」のようなテンプレートを作れば、ページごとに自動で更新されます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 書式設定のコントロールと6つのテキスト入力欄を含むオプションパネルが表示されます。 +3. ヘッダー/フッターの任意の位置に、表示したいテキストを入力します。 +4. 動的なページ番号には`{page}`と`{total}`のプレースホルダーを使います。 +5. フォントサイズと文字色を調整し、必要に応じて特定のページ範囲に限定します。 +6. **ヘッダーとフッターを追加**をクリックして処理し、ダウンロードします。 + +## オプション + +- **ページ範囲**: ヘッダーとフッターを付けるページを限定できます(任意)。空欄にするとすべてのページに適用されます。形式は「1-3, 5」(カンマ区切りの範囲)です。 +- **フォントサイズ**: 6〜24ポイント。初期値は10です。 +- **文字色**: カラーセレクターで好きな色を選べます。 +- **ヘッダー左 / 中央 / 右**: 各ページ上部のテキスト欄です。 +- **フッター左 / 中央 / 右**: 各ページ下部のテキスト欄です。 + +## 機能 + +- 1ページにつき、独立した6つのテキスト位置 +- 現在のページ番号を挿入する動的な`{page}`変数 +- 総ページ数を挿入する動的な`{total}`変数 +- 特定のページを対象にするページ範囲フィルター +- フォントサイズと色のカスタマイズ +- すっきりとしたプロフェッショナルな仕上がりのHelveticaフォント + +## 活用例 + +- レポートのフッター中央に「{total} ページ中 {page} ページ」を追加する +- ヘッダー左に会社名、ヘッダー右に文書の日付を配置する +- 法律文書のフッターに機密保持の注意書きを追加する +- 特定のページ範囲に文書の改訂番号を入れる + +## ヒント + +- `{page}`と`{total}`を1つの欄に組み合わせて、「{total} ページ中 {page} ページ」や「{page}/{total}」のような形式にできます。 +- 必要な位置だけ入力し、ほとんどの欄を空のままにできます。空の欄は単にスキップされます。 +- 画像やロゴを含むより複雑なヘッダーには、ページ上部に配置した[透かしの追加](./add-watermark)ツールの利用を検討してください。 + +## 関連ツール + +- [ページ番号](./page-numbers) +- [透かしの追加](./add-watermark) +- [通し番号付け](./bates-numbering) diff --git a/docs/ja/tools/heic-to-pdf.md b/docs/ja/tools/heic-to-pdf.md new file mode 100644 index 00000000..7173a379 --- /dev/null +++ b/docs/ja/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEICからPDF +description: iPhoneやiPadのHEIC/HEIF画像を、ブラウザー上で直接PDFに変換します。 +--- + +# HEICからPDF + +HEIC/HEIF画像をPDFに変換します。HEICはiOS 11以降のiPhoneとiPadで標準の写真フォーマットです。このツールを使えば、デスクトップソフトをインストールしたりファイルをサーバーにアップロードしたりせずに、写真をPDFにできます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :----------- | :------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## 使い方 + +1. アップロードエリアをクリックするか、HEIC/HEIFファイルをドラッグ&ドロップします。 +2. ファイル一覧を確認し、不要なファイルを削除します。 +3. **PDFに変換**をクリックします。結果は`from_heic.pdf`としてダウンロードされます。 + +各HEICファイルはheic2anyライブラリでデコードされ、品質92%のPNGに変換されます。そのPNGはpdf-libでPDFに埋め込まれ、1枚の画像が1ページに、フル解像度で配置されます。 + +## オプション + +このツールに追加の設定はありません。HEIC画像は高品質(0.92)でPNGに変換されてから埋め込まれます。 + +## 活用例 + +- 保険請求やレポートに添付するため、iPhoneの写真からPDFを作る +- 不動産掲載用のHEIC写真を、印刷可能な1つの文書にまとめる +- iPadのスクリーンショット(HEIF形式)を共有しやすいPDFにする +- 旅行記用に、旅行の写真を一括で変換する + +## ヒント + +- HEICのデコードはWebAssemblyを使ってすべてブラウザー内で行われます。デコーダーの読み込み中は、最初の変換に少し時間がかかる場合があります。 +- HEICを他の画像形式(JPG、PNGなど)と混ぜたい場合は、HEICを含むすべての形式を扱える[画像からPDF](./image-to-pdf)ツールを使ってください。 +- iPhoneのHEICファイルには、GPS座標を含むEXIFデータが含まれていることがよくあります。PDFの出力にはこのメタデータは引き継がれません。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [JPGからPDF](./jpg-to-pdf) +- [PNGからPDF](./png-to-pdf) diff --git a/docs/ja/tools/image-to-pdf.md b/docs/ja/tools/image-to-pdf.md new file mode 100644 index 00000000..7be4f6ba --- /dev/null +++ b/docs/ja/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: 画像からPDF +description: JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP、PSDなど10種類以上の画像フォーマットを、1つのPDFファイルに変換します。 +--- + +# 画像からPDF + +あらゆる画像に対応したユニバーサルな画像PDFコンバーターです。ほぼどんな形式の画像でもアップロードして、1つのPDF文書にまとめられます。各画像は元の寸法に合わせたサイズで、1枚につき1ページになります。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +BentoPDFの画像コンバーターの中で、最も幅広い形式に対応しています。特定の形式だけが必要な場合は、専用のツールを使うこともできます。 + +## 使い方 + +1. アップロードエリアをクリックするか、画像ファイルをドラッグ&ドロップします。複数のファイルを同時に選択できます。 +2. ファイル一覧を確認します。不要なファイルはゴミ箱アイコンで削除でき、**ファイルを追加**で画像を追加できます。 +3. ドロップダウンから**PDFの品質**を選びます。 +4. **PDFに変換**をクリックします。ツールはPyMuPDFエンジンで画像を処理し、結果を`images_to_pdf.pdf`としてダウンロードします。 + +## オプション + +**PDFの品質**は、画像をPDFに埋め込むときの圧縮を調整します。 + +- **高品質**: 圧縮を最小限に抑え、ファイルサイズは大きくなります。印刷やアーカイブに最適です。 +- **中品質**(初期値): バランスの取れた圧縮です。ほとんどの用途に適しています。 +- **低品質**: 強力に圧縮し、ファイルサイズを最小にします。メールや簡単な共有に向いています。 + +HEICとWebPファイルは、埋め込み前に自動でPNGに変換されます。これは自動的に行われ、追加の操作は不要です。 + +## 活用例 + +- スマートフォンのカメラで撮ったレシートや書類のスキャンを1つのPDFにまとめる +- 形式が混在した画像から、フォトポートフォリオやルックブックを作る +- デスクトップソフトをインストールせずに、iPhoneの写真(HEIC)を共有しやすいPDFに変換する +- PSDの書き出しとスクリーンショットから、クライアント向けのデザインモックアップ資料を作る +- 古い形式(PNM、JXR、JP2)の画像が入ったフォルダーを、1つのPDFとしてアーカイブする + +## ヒント + +- PDF内の画像の順序は、ファイル一覧の並び順と一致します。希望する順番でアップロードしてください。 +- ファイルサイズを最小にしたい場合は低品質を選びます。文字中心のスキャンでは、見た目の差はたいてい気になりません。 +- 画像形式が1種類だけなら、専用コンバーター(JPGからPDF、PNGからPDFなど)でも同じ結果が、よりシンプルな画面で得られます。 + +## 関連ツール + +- [JPGからPDF](./jpg-to-pdf) +- [PNGからPDF](./png-to-pdf) +- [HEICからPDF](./heic-to-pdf) +- [WebPからPDF](./webp-to-pdf) diff --git a/docs/ja/tools/index.md b/docs/ja/tools/index.md new file mode 100644 index 00000000..54fdebf7 --- /dev/null +++ b/docs/ja/tools/index.md @@ -0,0 +1,183 @@ +# ツールリファレンス + +BentoPDFには、PDFを扱う**130以上のツール**があります。すべてのツールはブラウザー内で完結して動作し、ファイルがお使いのデバイスの外に出ることはありません。 + +--- + +## 編集と注釈 + +充実した編集ツールで、PDF文書を修正、マークアップ、強化できます。 + +
+ +- [**PDFエディター**](./edit-pdf): 注釈、ハイライト、墨消し、コメント、図形や画像の追加、検索、PDFの閲覧ができます。 +- [**しおりの編集**](./bookmark): PDFのしおりを追加、編集、インポート、削除、抽出できます。 +- [**目次**](./table-of-contents): PDFのしおりから目次ページを生成します。 +- [**ページ番号**](./page-numbers): 文書にページ番号を挿入します。 +- [**ページラベルの追加**](./add-page-labels): ローマ数字、接頭辞、任意の開始番号でPDFのページラベルを設定します。 +- [**通し番号付け**](./bates-numbering): 1つ以上のPDFファイルにまたがって、連続したBates番号を追加します。 +- [**透かしの追加**](./add-watermark): PDFのページにテキストや画像を重ねて押印します。 +- [**ヘッダーとフッター**](./header-footer): ページの上部と下部にテキストを追加します。 +- [**色の反転**](./invert-colors): PDFのダークモード版を作成します。 +- [**スキャナー効果**](./scanner-effect): PDFをスキャンした文書のように見せます。 +- [**色の調整**](./adjust-colors): 明るさ、コントラスト、彩度などを細かく調整します。 +- [**背景色**](./background-color): PDFの背景色を変更します。 +- [**テキストの色の変更**](./text-color): PDF内のテキストの色を変更します。 +- [**PDFへ署名**](./sign-pdf): 署名を手書き、入力、またはアップロードで追加します。 +- [**スタンプの追加**](./add-stamps): 注釈ツールバーを使って、PDFに画像スタンプを追加します。 +- [**注釈の削除**](./remove-annotations): コメント、ハイライト、リンクを取り除きます。 +- [**PDFのトリミング**](./crop-pdf): PDFのすべてのページの余白を切り取ります。 +- [**PDFフォーム入力機能**](./form-filler): ブラウザー上で直接フォームに入力します。XFAフォームにも対応しています。 +- [**PDFフォームの作成**](./form-creator): ドラッグ&ドロップのテキストフィールドで、入力可能なPDFフォームを作成します。 +- [**空白ページの削除**](./remove-blank-pages): 空白ページを自動で検出して削除します。 + +
+ +--- + +## PDFへの変換 + +画像、文書、電子書籍、その他のファイル形式をPDFに変換します。 + +
+ +- [**画像からPDF**](./image-to-pdf): JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebPなどをPDFに変換します。 +- [**JPGからPDF**](./jpg-to-pdf): 1つ以上のJPG画像からPDFを作成します。 +- [**PNGからPDF**](./png-to-pdf): 1つ以上のPNG画像からPDFを作成します。 +- [**WebPからPDF**](./webp-to-pdf): 1つ以上のWebP画像からPDFを作成します。 +- [**SVGからPDF**](./svg-to-pdf): 1つ以上のSVG画像からPDFを作成します。 +- [**BMPからPDF**](./bmp-to-pdf): 1つ以上のBMP画像からPDFを作成します。 +- [**HEICからPDF**](./heic-to-pdf): 1つ以上のHEIC画像からPDFを作成します。 +- [**TIFFからPDFへ**](./tiff-to-pdf): 1つ以上のTIFF画像からPDFを作成します。 +- [**テキストからPDF**](./txt-to-pdf): プレーンテキストファイルをPDFに変換します。 +- [**マークダウンからPDF**](./markdown-to-pdf): ライブプレビューとシンタックスハイライト付きで、MarkdownをPDFに変換します。 +- [**JSONからPDF**](./json-to-pdf): JSONファイルをPDF形式に変換します。 +- [**ODTからPDF**](./odt-to-pdf): ODT(OpenDocument Text)ファイルをPDFに変換します。 +- [**CSVからPDF**](./csv-to-pdf): CSVのスプレッドシートをPDFに変換します。 +- [**RTFからPDF**](./rtf-to-pdf): RTF(リッチテキスト形式)の文書をPDFに変換します。 +- [**WordからPDF**](./word-to-pdf): Word文書(DOCX、DOC、ODT)をPDFに変換します。 +- [**ExcelからPDF**](./excel-to-pdf): Excelのスプレッドシート(XLSX、XLS、ODS)をPDFに変換します。 +- [**PowerPointからPDF**](./powerpoint-to-pdf): PowerPointのプレゼンテーション(PPTX、PPT、ODP)をPDFに変換します。 +- [**XPSからPDF**](./xps-to-pdf): XPS/OXPS文書をPDFに変換します。 +- [**MOBIからPDFへの変換**](./mobi-to-pdf): MOBI形式の電子書籍をPDFに変換します。 +- [**EPUBからPDF**](./epub-to-pdf): EPUB形式の電子書籍をPDFに変換します。 +- [**FB2からPDF**](./fb2-to-pdf): FictionBook(FB2)形式の電子書籍をPDFに変換します。 +- [**CBZからPDF**](./cbz-to-pdf): コミックブックのアーカイブ(CBZ/CBR)をPDFに変換します。 +- [**WPDからPDF**](./wpd-to-pdf): WordPerfectの文書(WPD)をPDFに変換します。 +- [**WPSからPDF**](./wps-to-pdf): WPS Officeの文書をPDFに変換します。 +- [**XMLからPDF**](./xml-to-pdf): XML文書をPDFに変換します。 +- [**ODGからPDF**](./odg-to-pdf): OpenDocument Graphics(ODG)をPDFに変換します。 +- [**ODSからPDF**](./ods-to-pdf): OpenDocument Spreadsheet(ODS)をPDFに変換します。 +- [**ODPからPDF**](./odp-to-pdf): OpenDocument Presentation(ODP)をPDFに変換します。 +- [**PUBからPDF**](./pub-to-pdf): Microsoft Publisher(PUB)をPDFに変換します。 +- [**VSDからPDFへのファイル変換**](./vsd-to-pdf): Microsoft Visio(VSD、VSDX)をPDFに変換します。 +- [**PSDからPDF**](./psd-to-pdf): Adobe Photoshop(PSD)ファイルをPDFに変換します。 +- [**電子メールからPDF**](./email-to-pdf): メールファイル(EML、MSG)をPDF形式に変換します。 + +
+ +--- + +## PDFからの変換 + +PDFの内容を、画像、文書、データ形式に取り出します。 + +
+ +- [**PDFからJPG**](./pdf-to-jpg): PDFの各ページをJPG画像に変換します。 +- [**PDFからPNG**](./pdf-to-png): PDFの各ページをPNG画像に変換します。 +- [**PDFからWebP**](./pdf-to-webp): PDFの各ページをWebP画像に変換します。 +- [**PDFからBMP**](./pdf-to-bmp): PDFの各ページをBMP画像に変換します。 +- [**PDFからTIFF**](./pdf-to-tiff): PDFの各ページをTIFF画像に変換します。 +- [**PDFからCBZへ**](./pdf-to-cbz): コミックリーダーやCalibre向けに、PDFをCBZ(コミックブックアーカイブ)に変換します。 +- [**PDFからSVG**](./pdf-to-svg): PDFの各ページを拡大縮小可能なベクターグラフィックに変換します。 +- [**PDFからCSV**](./pdf-to-csv): PDFから表を抽出して、CSV形式に変換します。 +- [**PDFからExcel**](./pdf-to-excel): PDFから表を抽出して、Excel(XLSX)に変換します。 +- [**PDFのグレースケール化**](./pdf-to-greyscale): すべての色を白黒に変換します。 +- [**PDFからJSON**](./pdf-to-json): PDFファイルをJSON形式に変換します。 +- [**PDFからWord**](./pdf-to-word): PDFファイルを編集可能なWord文書に変換します。 +- [**画像の抽出**](./extract-images): PDFファイルに埋め込まれたすべての画像を抽出します。 +- [**PDFからマークダウン**](./pdf-to-markdown): PDFのテキストと表をMarkdown形式に変換します。 +- [**AI用のPDFを準備する**](./prepare-pdf-for-ai): RAG/LLMパイプライン向けに、PDFの内容をLlamaIndex JSONとして抽出します。 +- [**PDFからテキスト**](./pdf-to-text): PDFファイルからテキストを抽出して、プレーンテキストとして保存します。 +- [**PDFテーブルの抽出**](./extract-tables): PDFから表をCSV、JSON、Markdownとして抽出します。 + +
+ +--- + +## 整理と管理 + +PDFのページやファイルを並べ替え、結合、分割、管理します。 + +
+ +- [**PDFワークフロービルダー**](./pdf-workflow): ビジュアルなノードエディターで、独自のPDF処理パイプラインを構築します。 +- [**PDFマルチツール**](./pdf-multi-tool): ページ管理に対応した、フル機能のPDFエディターです。 +- [**OCR PDF**](./ocr-pdf): PDFを検索やコピーができるようにします。 +- [**PDFの結合**](./merge-pdf): 複数のPDFを1つのファイルにまとめます。 +- [**代替ページと混合ページ**](./alternate-merge): 各PDFのページを交互に並べて、PDFを結合します。 +- [**両面スキャンの並べ替え**](./duplex-collate): 表面と裏面のスキャンのまとまりを、正しいページ順に並べ替えます。 +- [**複製と整理**](./organize-pdf): ページの複製、並べ替え、削除を行います。 +- [**添付ファイルの追加**](./add-attachments): 1つ以上のファイルをPDFに埋め込みます。 +- [**添付ファイルの抽出**](./extract-attachments): PDFに埋め込まれたすべてのファイルをZIPとして抽出します。 +- [**添付ファイルの編集**](./edit-attachments): PDF内の添付ファイルを表示または削除します。 +- [**PDF OCG**](./pdf-layers): PDF内のOCGレイヤーを表示、切り替え、追加、削除します。 +- [**PDFの分割**](./split-pdf): ページ範囲を新しいPDFとして取り出します。 +- [**ページの分割**](./divide-pages): ページを水平方向または垂直方向に分割します。 +- [**ページの抽出**](./extract-pages): 選択したページを新しいファイルとして保存します。 +- [**ページの削除**](./delete-pages): 文書から特定のページを削除します。 +- [**空白ページの追加**](./add-blank-page): PDFの任意の位置に空のページを挿入します。 +- [**ページの反転**](./reverse-pages): 文書のすべてのページの順序を逆にします。 +- [**PDFの回転**](./rotate-pdf): ページを90度単位で回転します。 +- [**任意の角度で回転**](./rotate-custom): ページを任意の角度で回転します。 +- [**N-Up PDF**](./n-up-pdf): 複数のページを1枚のシートに配置します。 +- [**PDFブックレット**](./pdf-booklet): 両面のブックレット印刷用に、ページを並べ替えます。 +- [**単一ページに結合**](./combine-single-page): すべてのページを、1つの連続したスクロールページにつなぎ合わせます。 +- [**メタデータの表示**](./view-metadata): PDFの隠れたプロパティを確認します。 +- [**メタデータの編集**](./edit-metadata): 作成者、タイトル、その他のプロパティを変更します。 +- [**PDFからZIP**](./pdf-to-zip): 複数のPDFファイルをZIPアーカイブにまとめます。 +- [**PDFの比較**](./compare-pdfs): 2つのPDFを並べて比較します。 +- [**PDFのポスタライズ**](./posterize-pdf): 大きなページを、複数の小さなページに分割します。 + +
+ +--- + +## 最適化と修復 + +PDFを圧縮、修正、最適化して、パフォーマンスと互換性を高めます。 + +
+ +- [**PDFの圧縮**](./compress-pdf): PDFのファイルサイズを小さくします。 +- [**PDFからPDF/A**](./pdf-to-pdfa): 長期保存用に、PDFをPDF/Aに変換します。 +- [**ページサイズを固定**](./fix-page-size): すべてのページを同じサイズに統一します。 +- [**PDFの線形化**](./linearize-pdf): PDFをWebでの高速表示向けに最適化します。 +- [**ページ寸法**](./page-dimensions): ページのサイズ、向き、単位を分析します。 +- [**制限の解除**](./remove-restrictions): パスワード保護とセキュリティ制限を解除します。 +- [**PDFの修復**](./repair-pdf): 破損したPDFファイルからデータを復元します。 +- [**PDFの画像化**](./rasterize-pdf): PDFを画像ベースのPDFに変換します。レイヤーを平坦化し、選択可能なテキストを取り除きます。 +- [**PDFの傾き補正**](./deskew-pdf): OpenCVを使って、傾いたスキャンページを自動で水平に補正します。 +- [**フォントをアウトライン化**](./font-to-outline): 表示を一定にするため、すべてのフォントをベクターアウトラインに変換します。 + +
+ +--- + +## PDFのセキュリティ + +PDF文書を保護、暗号化し、アクセスを制御します。 + +
+ +- [**PDFの暗号化**](./protect-pdf): パスワードを追加して、PDFをロックします。 +- [**PDFをサニタイズ**](./sanitize-pdf): メタデータ、注釈、スクリプトなどを削除します。 +- [**PDFの復号化**](./unlock-pdf): パスワード保護を解除して、PDFのロックを外します。 +- [**PDFの平坦化**](./flatten-pdf): フォームフィールドと注釈を編集不可にします。 +- [**メタデータの削除**](./remove-metadata): PDFから隠れたデータを取り除きます。 +- [**権限の変更**](./change-permissions): PDFのユーザー権限を設定または変更します。 +- [**PDFへの電子署名**](./digital-sign-pdf): X.509証明書を使って、暗号化された電子署名を追加します。 +- [**署名の検証**](./validate-signature-pdf): 電子署名を検証し、証明書の詳細を表示します。 + +
diff --git a/docs/ja/tools/invert-colors.md b/docs/ja/tools/invert-colors.md new file mode 100644 index 00000000..6d65bc75 --- /dev/null +++ b/docs/ja/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: 色の反転 +description: PDFのすべての色を反転して、どんな文書もダークモード版にします。 +--- + +# 色の反転 + +PDFのすべての色を反転色にします。白い背景は黒に、黒い文字は白に、その他の色は補色に変わります。どんなPDFでも「ダークモード」版を作る最も手軽な方法です。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. **色の反転**をクリックして処理します。 +3. 反転したPDFが自動でダウンロードされます。 + +追加の設定はありません。このツールは各ページを画像としてレンダリングし、すべてのピクセルの色を反転して、結果を新しいPDFに組み直します。 + +## 機能 + +- すべてのページの色をワンクリックで反転 +- 文書内のすべてのページを処理 +- 元のページ寸法とレイアウトを維持 +- 内容の種類(テキスト、画像、混在)を問わずあらゆるPDFで動作 + +## 活用例 + +- 夜間でも読みやすいように、教科書やマニュアルのダークモード版を作る +- アクセシビリティのために、文書の高コントラスト版を用意する +- 露出が正しくない状態で取り込んだスキャン文書を反転する +- 画像の多いPDFのネガ版を作って、視覚的に分析する + +## ヒント + +- このツールは効果を適用するためにページを画像化するため、出力は画像ベースになります。テキストは選択も検索もできなくなります。反転後に検索可能なテキストが必要な場合は、出力をOCRツールにかけてください。 +- 明るさ、コントラスト、彩度などをより細かく調整したい場合は、代わりに[色の調整](./adjust-colors)ツールを使ってください。 +- ページ数の多い大きなPDFは、各ページを個別にレンダリングして反転するため、処理に時間がかかる場合があります。 + +## 関連ツール + +- [色の調整](./adjust-colors) +- [背景色](./background-color) +- [スキャナー効果](./scanner-effect) diff --git a/docs/ja/tools/jpg-to-pdf.md b/docs/ja/tools/jpg-to-pdf.md new file mode 100644 index 00000000..1f35d294 --- /dev/null +++ b/docs/ja/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPGからPDF +description: 1つ以上のJPG、JPEG、JPEG 2000画像を、ブラウザー上で直接1つのPDFファイルに変換します。 +--- + +# JPGからPDF + +JPG画像をきれいなPDFにします。ファイルを1つだけ、または複数のJPGをまとめてアップロードでき、各画像が出力文書のフルサイズの1ページになります。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :----------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## 使い方 + +1. アップロードエリアをクリックするか、JPGファイルをドラッグ&ドロップします。複数選択に対応しています。 +2. アップロードしたファイルを確認します。ゴミ箱アイコンで個別に削除でき、**ファイルを追加**で一覧に追加できます。 +3. **PDFの品質**を選びます。 +4. **PDFに変換**をクリックします。ツールは品質設定に応じて画像を圧縮し、PyMuPDFエンジンで変換して、`from_jpgs.pdf`をダウンロードします。 + +## オプション + +**PDFの品質**は、PDFに埋め込む前に各画像へ適用する圧縮を調整します。 + +- **高品質**: 細部を最大限に保ちます。写真や印刷向けです。 +- **中品質**(初期値): 鮮明さとファイルサイズのバランスが良い設定です。 +- **低品質**: 強力に圧縮して、出力を最小にします。 + +## 活用例 + +- JPGで保存したスキャン文書を、提出用の1つのPDFにまとめる +- 顧客向けに、商品写真をカタログとしてまとめる +- 医療や衛星のJPEG 2000画像を、持ち運びしやすいPDFにする +- カメラから書き出した写真で、印刷用のフォトアルバムを作る + +## ヒント + +- 標準のJPEGだけでなく、JPEG 2000ファイル(`.jp2`、`.jpx`)にも完全に対応しています。医療画像や地理空間データに便利です。 +- スマートフォンのカメラで撮ったJPGなら、中品質にすると、画面上では違いが見えないまま、高品質よりファイルが40〜60%小さくなることが多いです。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [PNGからPDF](./png-to-pdf) +- [WebPからPDF](./webp-to-pdf) diff --git a/docs/ja/tools/json-to-pdf.md b/docs/ja/tools/json-to-pdf.md new file mode 100644 index 00000000..08f449ca --- /dev/null +++ b/docs/ja/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSONからPDF +description: BentoPDFのJSON形式からPDFファイルを再構築します。JSONで書き出したデータを、元のPDF文書に戻します。 +--- + +# JSONからPDF + +BentoPDFの**PDFからJSON**ツールで作成したJSONファイルから、PDF文書を再構築します。これは往復変換のためのツールで、PDFの構造化されたJSON表現を受け取り、元の文書を組み立て直します。 + +::: warning +このツールが受け付けるのは、BentoPDFのPDFからJSONコンバーターで作成したJSONファイルのみです。APIやデータベース、他のツールが出力する一般的なJSONファイルには対応していません。 +::: + +## 対応フォーマット + +| 入力 | 説明 | +| :------ | :---------------------------------------------------- | +| `.json` | BentoPDFのPDFからJSONツールで書き出されたJSONファイル | + +## 使い方 + +1. アップロードエリアをクリックするか、1つ以上のJSONファイルをドラッグ&ドロップします。 +2. ファイル一覧に、選択した各ファイルとそのサイズが表示されます。 +3. **PDFに変換**をクリックします。ツールはWeb WorkerとCPDFエンジンですべてのファイルを処理します。 +4. 出力は`jsons-to-pdf.zip`としてダウンロードされ、入力した各JSONファイルにつき1つのPDFが含まれます。 + +変換はバックグラウンドのWeb Workerで実行されるため、大きなファイルでもUIは応答し続けます。 + +## オプション + +このツールに設定可能なオプションはありません。出力されるPDFは、JSONの構造によって完全に決まります。 + +## 出力 + +複数のJSONファイルを変換した場合、結果はZIPアーカイブで提供されます。各PDFは元のJSONファイルの名前が付きます(例: `report.json`は`report.pdf`になります)。 + +## 活用例 + +- JSONベースのバックアップやアーカイブのパイプラインからPDFを復元する +- PDFをJSONに変換して中身を確認し、再びPDFに戻す +- JSON構造をプログラムで変更した後に、文書を再構築する +- PDFからJSONへの書き出しがすべての文書内容を取得できているか、変換し直して確認する + +## ヒント + +- 任意のJSONデータ(APIのレスポンスや設定ファイルなど)を整形したPDFに変換したい場合は、[テキストからPDF](./txt-to-pdf)ツールのほうが向いています。JSONをテキストとして貼り付けると、適切な書式でレンダリングされます。 +- このツールを使うには、CPDF WebAssemblyエンジンが利用可能である必要があります。セルフホスト環境では、CPDFのWASMファイルを設定してください。 + +## 関連ツール + +- [テキストからPDF](./txt-to-pdf) +- [マークダウンからPDF](./markdown-to-pdf) +- [CSVからPDF](./csv-to-pdf) diff --git a/docs/ja/tools/linearize-pdf.md b/docs/ja/tools/linearize-pdf.md new file mode 100644 index 00000000..a8412921 --- /dev/null +++ b/docs/ja/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: PDFの線形化 +description: プログレッシブ読み込みに対応して、PDFをWebでの高速表示向けに最適化します。「Fast Web View」最適化とも呼ばれます。 +--- + +# PDFの線形化 + +線形化はPDFの構造を組み替えて、ファイル全体のダウンロードが終わる前に最初のページを表示できるようにします。Adobeはこれを「Fast Web View」と呼んでいます。PDFをWebサイトで公開したり、ドキュメントポータルで提供したりしている場合、線形化すると開くときの体感速度が大きく向上します。 + +## 使い方 + +1. 1つ以上のPDFファイルをアップロードします。 +2. **PDFを線形化**をクリックします。 +3. すべての線形化済みファイルを含むZIPアーカイブとして、結果をダウンロードします。 + +設定項目はありません。このツールはQPDFの`--linearize`フラグを使い、見た目の内容を変えずにPDFの内部構造を並べ替えます。 + +## 線形化で行われること + +- 最初のページのデータがファイルの先頭に来るよう、PDFオブジェクトを並べ替える +- ビューアーが各ページの場所を把握できるよう、線形化ディクショナリとヒントテーブルを追加する +- バイトレンジリクエストを有効にし、ブラウザーがファイル全体をダウンロードせずに最初のページだけを取得できるようにする +- ランダムアクセスを効率化するため、相互参照テーブルを整理する + +## 機能 + +- 複数のPDFを1回の操作でバッチ処理 +- 出力はすべてのコンテンツ、フォント、画像、インタラクティブ要素を保持 +- 確実で標準に準拠した線形化のためにQPDF(WebAssembly)を使用 +- 結果は簡単にダウンロードできるようZIPにまとめられる + +## 活用例 + +- ユーザーが即座にページ表示されることを期待するWebサイトで、PDFレポートを公開する +- ブラウザー内ビューアーを備えたWebアプリケーションにPDFを埋め込む +- 低速なモバイル回線でアクセスされるPDFのカタログやマニュアルを公開する +- バイトレンジ配信に対応したコンテンツ配信ネットワーク(CDN)向けに文書を準備する + +## ヒント + +- 線形化は、ほかの編集がすべて終わってから行ってください。その後に変更(結合やページの追加など)を加えると、線形化が解除されます。 +- 「PDFの圧縮」と組み合わせると、最小で最速に読み込めるPDFになります。 +- 線形化によってファイルサイズがわずかに増えます(通常は1%未満)。 + +## 関連ツール + +- [PDFの圧縮](./compress-pdf): 線形化の前にファイルサイズを削減 +- [PDFの修復](./repair-pdf): 線形化を妨げる構造上の問題を修正 +- [メタデータの削除](./remove-metadata): オンライン公開の前にメタデータを削除 diff --git a/docs/ja/tools/markdown-to-pdf.md b/docs/ja/tools/markdown-to-pdf.md new file mode 100644 index 00000000..753d6c16 --- /dev/null +++ b/docs/ja/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: マークダウンからPDF +description: Markdownを書くか貼り付けて、ライブプレビューとシンタックスハイライト付きで、整ったPDFとして書き出します。 +--- + +# マークダウンからPDF + +ライブプレビューとワンクリックのPDF書き出しを備えた、高機能なMarkdownエディターです。ゼロから書く、既存の`.md`ファイルをアップロードする、クリップボードから貼り付けるのいずれも可能です。エディターはMarkdownをリアルタイムでレンダリングし、ブラウザー内蔵の印刷エンジンでスタイル付きのPDFを書き出します。 + +## 対応フォーマット + +| 入力 | 説明 | +| :------------ | :--------------------------------- | +| `.md`ファイル | アップロードボタンからアップロード | +| 直接入力 | エディターに入力または貼り付け | + +## 使い方 + +1. マークダウンからPDFツールを開きます。エディターは分割ビューで読み込まれ、左にMarkdownのソース、右にレンダリングされたプレビューが表示されます。 +2. Markdownを書くか貼り付けるか、**アップロード**をクリックして`.md`ファイルを読み込みます。 +3. ツールバーのテーマスライダーで、ライトテーマとダークテーマを切り替えます。 +4. **PDFを書き出し**をクリックするか`Ctrl/Cmd + S`を押すと、ブラウザーの印刷ダイアログ経由でPDFが生成されます。 + +## 機能 + +このエディターは、基本を超えた豊富なMarkdown機能に対応しています。 + +- **標準のMarkdown**: 見出し、太字、斜体、リンク、画像、リスト、引用、水平線 +- 15以上の言語(JavaScript、TypeScript、Python、Go、Rust、SQL、Java、C#、C++、YAML、Bashなど)に対応した、シンタックスハイライト付きの**コードブロック** +- **Mermaid図**: フローチャート、シーケンス図、ER図などのMermaidチャートがプレビュー上で直接表示されます +- 標準のMarkdown記法による**表** +- チェックボックス付きの**タスクリスト** +- **脚注**、**下付き文字**、**上付き文字** +- **定義リスト**、**略語** +- **絵文字**に対応(`:smile:`が絵文字として表示されます) +- **ハイライト**(`==marked text==`)と**挿入**(`++inserted text++`) +- **URLの自動リンク化**: プレーンなURLがクリック可能なリンクに変換されます +- **目次**の生成 +- 見出しへの**アンカーリンク** + +## 活用例 + +- プロジェクトのドキュメントを書き、関係者向けに整ったPDFとして書き出す +- コードサンプルやMermaidのアーキテクチャ図を含む技術レポートを作る +- GitHubのREADMEを、オフラインでの閲覧や印刷用にPDFへ変換する +- タスクリストや表を使って、提案書や仕様書の下書きを作る +- Markdownで書いた講義ノートから、スタイル付きの配布資料を作る + +## ヒント + +- PDFの出力にはブラウザーの「PDFに印刷」機能を使います。Chromeでは、保存前に印刷ダイアログで余白や拡大率を調整できます。 +- Mermaid図はプレビューに表示されますが、初回は初期化に少し時間がかかる場合があります。 +- ボタンに手を伸ばさず書き出すには、キーボードショートカットの`Ctrl/Cmd + S`を使ってください。 + +## 関連ツール + +- [テキストからPDF](./txt-to-pdf) +- [WordからPDF](./word-to-pdf) +- [JSONからPDF](./json-to-pdf) diff --git a/docs/ja/tools/merge-pdf.md b/docs/ja/tools/merge-pdf.md new file mode 100644 index 00000000..e839bafe --- /dev/null +++ b/docs/ja/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDFの結合 +description: ドラッグ&ドロップでの並べ替えとページ単位の制御で、複数のPDFファイルを1つの文書に結合します。 +--- + +# PDFの結合 + +複数のPDFファイルを1つの文書に結合します。ファイル全体を指定した順序で結合することも、ページモードに切り替えて、アップロードしたすべてのPDFの個々のページを細かく制御することもできます。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ドラッグして、2つ以上のPDFファイルをアップロードします。 +2. 上部の切り替えで、**ファイルモード**と**ページモード**のどちらかを選びます。 +3. ファイルモードでは、ファイルをドラッグして並べ替え、必要に応じて各ファイルのページ範囲(例: `1-3, 5`)を指定します。範囲を空欄にすると、すべてのページが含まれます。 +4. ページモードでは、個々のページのサムネイルをドラッグ&ドロップして、思い通りのページ順を作ります。 +5. **PDFを結合**をクリックすると、すべてが1つのファイルにまとめられます。結合したPDFは自動でダウンロードされます。 + +## 機能 + +- 2つの結合モード: ファイル全体をすばやく結合するファイルモードと、ページ単位で制御するページモード +- どちらのモードでも、滑らかなアニメーションでドラッグ&ドロップによる並べ替えが可能 +- ページ範囲の記法(例: `1-3, 5, 8-10`)で、ページモードに切り替えずに必要なページだけを選べる +- サムネイルを遅延読み込みするため、大きな文書でもUIが軽快に動作 +- ファイル数や合計ページ数に制限なし +- 再エンコードせず、元のPDFの品質を維持 + +## オプション + +| オプション | 説明 | +| ------------------ | ---------------------------------------------------------------------------------------- | +| **ファイルモード** | ファイル全体を好きな順序で結合。ファイルごとにページ範囲のフィルターも指定可能 | +| **ページモード** | すべてのファイルのすべてのページを一覧表示。サムネイルをドラッグして思い通りの順序を作成 | +| **ページ入力** | ファイルごとのテキスト欄。`1-3, 5`のような範囲を指定して、特定のページだけを含める | + +## 活用例 + +- 章ごとに分かれたPDFを、1冊の本やレポートにまとめる +- 送付状と履歴書を、1つの応募書類に結合する +- 複数の元文書から特定のページを取り出して、1つのファイルにまとめる +- スキャンしたレシートや請求書を、1つのアーカイブPDFにまとめる +- 複数のスライド資料から、プレゼンテーションの配布資料を作る + +## ヒント + +- ファイルを次々に追加するのではなく、異なるファイルのページを交互に挟み込みたい場合は、ページモードを使ってください。 +- 最初のアップロード後でも、**ファイルを追加**ボタンでファイルを追加できます。現在の並びは失われません。 +- ページ範囲は1始まりなので、`1`はそのファイルの最初のページを指します。 + +## 関連ツール + +- [PDFの分割](./split-pdf) +- [複製と整理](./organize-pdf) +- [代替ページと混合ページ](./alternate-merge) +- [ページの削除](./delete-pages) diff --git a/docs/ja/tools/mobi-to-pdf.md b/docs/ja/tools/mobi-to-pdf.md new file mode 100644 index 00000000..53e0a336 --- /dev/null +++ b/docs/ja/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBIからPDF +description: MOBI形式の電子書籍ファイルを、ブラウザー上で直接PDFに変換します。無料でプライベート、ファイルのアップロードは不要です。 +--- + +# MOBIからPDF + +Amazon KindleのMOBI形式の電子書籍を、PDF文書に変換します。MOBIファイルはKindleの端末やアプリに依存しているため、ほかの環境では読みにくいことがあります。PDFに変換すれば、どんなデバイスでも開いたり印刷したりできる、持ち運びしやすい版が手に入ります。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :----------- | :------ | :--------------------------------- | +| MOBI | `.mobi` | Kindleの電子書籍形式(Mobipocket) | + +## 使い方 + +1. アップロードエリアをクリックするか、1つ以上のMOBIファイルをドラッグ&ドロップします。 +2. ファイル一覧を確認します。不要なファイルはゴミ箱アイコンで削除でき、**ファイルを追加**で電子書籍を追加できます。 +3. **PDFに変換**をクリックします。PyMuPDFエンジンがMOBIの構造を解析し、各ページをPDFの内容としてレンダリングします。 +4. ファイルが1つの場合はPDFとしてダウンロードされます。複数ファイルを変換した場合は、`mobi-converted.zip`という名前のZIPアーカイブが得られます。 + +## オプション + +追加の設定は不要です。変換では、元のMOBIファイルのテキスト、書式、埋め込み画像が保持されます。 + +## 活用例 + +- PDFにしか対応していない、Kindle以外の電子書籍リーダーで、Kindleで購入したコンテンツを読む +- オフラインでの学習や書き込みのために、電子書籍の章を印刷する +- 個人の電子書籍ライブラリを、汎用的な形式でアーカイブする +- Kindleアプリを持っていない相手に、抜粋を共有する + +## ヒント + +- DRM保護されたMOBIファイルは変換できません。このツールが扱えるのはDRMフリーのMOBIファイルのみです。 +- すべてがブラウザー内で処理されるため、画像が多く埋め込まれた大きな電子書籍は、処理に数秒長くかかる場合があります。 + +## 関連ツール + +- [EPUBからPDF](./epub-to-pdf) +- [FB2からPDF](./fb2-to-pdf) +- [CBZからPDF](./cbz-to-pdf) diff --git a/docs/ja/tools/n-up-pdf.md b/docs/ja/tools/n-up-pdf.md new file mode 100644 index 00000000..ec3fd82f --- /dev/null +++ b/docs/ja/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: 複数のPDFページを1枚のシートにグリッド状に配置し、コンパクトに印刷します。 +--- + +# N-Up PDF + +複数のページを、グリッド状に1枚のシートに配置します。1枚に2、4、6、8、9、16ページを収めることで、印刷枚数を減らせます。拡大縮小、配置、必要に応じたページサイズの設定は、ツールが処理します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 1枚あたりのページ数(「N」の値)を選びます: 2、4、6、8、9、16。 +3. 出力するページサイズ(初期値はA4)と向きを選びます。 +4. 必要に応じて、間隔、枠線の色、背景色を設定します。 +5. 処理ボタンをクリックします。ツールが各ページを拡大縮小し、新しいシートに並べます。 + +## 機能 + +- グリッドレイアウト: 2-up、4-up、6-up、8-up、9-up、16-up +- 出力ページサイズと向きを設定可能 +- 並べたページ間の間隔を任意で設定可能 +- 背景色と枠線の色の設定 +- 元のページの縦横比を保ったまま、収まるように拡大縮小 + +## オプション + +| オプション | 説明 | +| ----------------------- | ------------------------------------------------------ | +| **1枚あたりのページ数** | 出力ページ1枚に収める元のページ数(2、4、6、8、9、16) | +| **ページサイズ** | 出力シートのサイズ(A4、Letter、Legalなど) | +| **向き** | 出力シートの縦または横 | +| **間隔** | 並べたページ間のすき間(ポイント単位) | +| **背景色** | 出力シートの背景の塗りつぶし色 | +| **枠線の色** | 並べた各ページの周囲の枠線の色 | + +## 活用例 + +- 紙を節約するため、1ページにスライド4枚を載せた配布資料を印刷する +- 複数の参考ページを1枚にまとめた学習用シートを作る +- ファイリング用に、コンパクトな文書アーカイブを作る +- 長い文書のサムネイル一覧シートを作る + +## ヒント + +- 2-upのレイアウトには横向きが適していることが多く、4-up以上では通常は縦向きが最適です。 +- 間隔を広げると読みやすくなりますが、並べた各ページに使える面積が小さくなります。 +- 逆の操作(1ページを複数に分割する)については、[PDFのポスタライズ](./posterize-pdf)をご覧ください。 + +## 関連ツール + +- [PDFのポスタライズ](./posterize-pdf) +- [PDFブックレット](./pdf-booklet) +- [単一ページに結合](./combine-single-page) diff --git a/docs/ja/tools/ocr-pdf.md b/docs/ja/tools/ocr-pdf.md new file mode 100644 index 00000000..0e053e3f --- /dev/null +++ b/docs/ja/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Tesseract OCRを使い、多言語と文字フィルターに対応して、スキャンしたPDFを検索・コピー可能にします。 +--- + +# OCR PDF + +スキャンした文書を、検索やコピーができるPDFに変えます。このツールはTesseract OCRで画像内のテキストを認識し、元のページの上に不可視のテキストレイヤーを重ねます。見た目はそのままで、内容を完全に検索できるようになります。 + +## 使い方 + +1. スキャンしたPDF、または画像ベースのPDFファイルをアップロードします。 +2. 検索できる言語リストから、文書に含まれる言語を1つ以上選びます。 +3. 必要に応じて、詳細設定(解像度、二値化、ホワイトリスト)を調整します。 +4. **OCRを開始**をクリックし、リアルタイムの進行状況バーで進み具合を確認します。 +5. 完了したら、抽出されたテキストを確認し、検索可能なPDFまたはプレーンな`.txt`ファイルをダウンロードします。 + +## 機能 + +- 検索可能な言語セレクターによる、多言語OCR +- 不可視のテキストレイヤーで、元の文書の見た目を維持 +- 処理中のリアルタイムな進行状況バーとログ出力 +- 検索可能なPDFまたはプレーンテキストファイルとして結果をダウンロード +- 抽出したテキストをクリップボードに直接コピー +- 速度と精度のバランスを取る、3段階の解像度 + +## オプション + +| 設定 | 値 | 初期値 | 目的 | +| ---------------------------------- | ------------------------------------------------------------------------ | ------ | ---------------------------------------------------------------------- | +| **解像度** | 標準(192 DPI)、高(288 DPI)、超高(384 DPI) | 高 | 解像度を上げると小さな文字の精度が向上しますが、処理に時間がかかります | +| **画像を二値化** | オン / オフ | オフ | 白黒に変換して、きれいなスキャンのコントラストを高めます | +| **文字ホワイトリストのプリセット** | なし、英数字、数字と通貨、文字のみ、数字のみ、請求書、フォーム、カスタム | なし | 認識する文字を制限して、特定の種類の文書での精度を高めます | +| **文字ホワイトリスト** | 自由入力 | 空 | プリセットがカスタムのときに使う、手動の文字セット | + +## 活用例 + +- スキャンした契約書や請求書を検索可能にして、Ctrl+Fで探せるようにする +- 撮影した文書や古い紙の記録からテキストを抽出する +- 請求書プリセットでレシートを処理し、金額や日付を正確に取り込む +- コンプライアンス要件のために、画像のみのスキャンからアクセシブルなPDFを作る +- スキャンした書籍やマニュアルのテキストを一括で抽出する + +## ヒント + +- 文書に複数の言語が混在している場合(例: 英語の見出しと日本語の本文)は、複数の言語を選択してください。 +- 文字がかすれていたりコントラストが低い文書には、二値化オプションを使ってください。認識精度が大きく向上することがあります。 +- 請求書とフォームのホワイトリストプリセットは、無関係な文字の形を無視するため、構造化された文書での誤認識を大幅に減らします。 + +## 関連ツール + +- [PDFテーブルの抽出](./extract-tables) +- [PDFの結合](./merge-pdf) +- [PDFの圧縮](./compress-pdf) diff --git a/docs/ja/tools/odg-to-pdf.md b/docs/ja/tools/odg-to-pdf.md new file mode 100644 index 00000000..ef926c13 --- /dev/null +++ b/docs/ja/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODGからPDF +description: LibreOffice Draw(ODG)ファイルを、ブラウザー上でPDFに変換します。無料で、アップロード不要、完全にプライベートです。 +--- + +# ODGからPDF + +OpenDocument GraphicsファイルをPDFに変換します。ODGはLibreOffice Drawのネイティブ形式で、図表、フローチャート、ベクターイラストに使われます。PDFに変換すると、これらの図を共有、印刷、ほかの文書への埋め込みがしやすくなります。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :-------------------- | :----- | :------------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Drawのファイル | + +## 使い方 + +1. アップロードエリアをクリックするか、ODGファイルをドラッグ&ドロップします。複数のファイルを一度に追加できます。 +2. ファイル一覧を確認します。ゴミ箱アイコンで個別に削除でき、**ファイルを追加**でさらに図面を追加できます。 +3. **PDFに変換**をクリックします。LibreOfficeベースのエンジンがブラウザー内で読み込まれ、ベクターグラフィック、図形、テキストを保持したまま各ODGファイルを変換します。 +4. ファイルが1つの場合はPDFが直接ダウンロードされます。複数の場合は、`odg-to-pdf.zip`という名前のZIPアーカイブになります。 + +## オプション + +追加の設定は不要です。変換では、ODGソースの元のページ寸法、図形、コネクター、テキストボックスが保持されます。 + +## 活用例 + +- LibreOfficeをインストールしていない取引先と、LibreOffice Drawの図を共有する +- Drawで作成したフローチャートやネットワーク図を印刷する +- ODGのイラストを、PDFとしてレポートやプレゼンテーションに埋め込む +- 技術図面を、数十年先でも読める形式でアーカイブする + +## ヒント + +- ベクター要素はPDF出力でもベクターのまま保たれるため、どんな印刷サイズにもきれいに拡大縮小できます。 +- LibreOfficeエンジンは初回の使用時に初期化に少し時間がかかります。その後、同じセッション内の変換はより速くなります。 + +## 関連ツール + +- [ODSからPDF](./ods-to-pdf) +- [ODPからPDF](./odp-to-pdf) +- [VSDからPDFへのファイル変換](./vsd-to-pdf) diff --git a/docs/ja/tools/odp-to-pdf.md b/docs/ja/tools/odp-to-pdf.md new file mode 100644 index 00000000..e53d2390 --- /dev/null +++ b/docs/ja/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODPからPDF +description: LibreOffice Impress(ODP)のプレゼンテーションを、ブラウザー上でPDFに変換します。無料でプライベート、アップロード不要です。 +--- + +# ODPからPDF + +OpenDocument PresentationファイルをPDFに変換します。ODPはLibreOffice Impressのネイティブ形式で、Googleスライドの標準的な書き出し形式でもあります。プレゼンテーションをPDFにすれば、誰でもプレゼンテーションソフトなしで閲覧でき、スライドもきれいに印刷できます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :------------------------ | :----- | :--------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Googleスライドの書き出し | + +## 使い方 + +1. アップロードエリアをクリックするか、ODPファイルをドラッグ&ドロップします。複数のプレゼンテーションを一度に選択できます。 +2. ファイル一覧を確認します。ゴミ箱アイコンで削除でき、**ファイルを追加**でプレゼンテーションを追加できます。 +3. **PDFに変換**をクリックします。LibreOfficeベースのエンジンが各プレゼンテーションを処理し、スライドが1枚ずつ1ページになったPDFを作成します。 +4. ファイルが1つの場合はPDFとしてダウンロードされます。複数ファイルの場合は、`odp-to-pdf.zip`という名前のZIPアーカイブで提供されます。 + +## オプション + +設定する項目はありません。各スライドは元の寸法でレンダリングされ、テキスト、画像、図形、スライドの背景が保持されます。 + +## 活用例 + +- 配布資料のPDFとして、プレゼンテーションを参加者に配布する +- ODPよりPDFを好む相手に、Googleスライドの書き出しを共有する +- カンファレンスの講演や講義を、読み取り専用の形式でアーカイブする +- 対面のワークショップ用に、スライド資料を印刷する + +## ヒント + +- スライドの切り替え効果やアニメーションは視覚効果のみでPDFには引き継がれませんが、静的なコンテンツはすべて正しくレンダリングされます。 +- スピーカーノートはPDFの出力に含まれません。ノートが必要な場合は、プレゼンテーションソフトから別途書き出してください。 +- ほかのLibreOfficeベースのツールと同様に、エンジンは初回の使用時に読み込まれ、セッション中はキャッシュされたままになります。 + +## 関連ツール + +- [ODGからPDF](./odg-to-pdf) +- [ODSからPDF](./ods-to-pdf) +- [PUBからPDF](./pub-to-pdf) diff --git a/docs/ja/tools/ods-to-pdf.md b/docs/ja/tools/ods-to-pdf.md new file mode 100644 index 00000000..1d1a4b67 --- /dev/null +++ b/docs/ja/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODSからPDF +description: LibreOffice Calc (ODS) のスプレッドシートをブラウザ上でPDFに変換します。無料、プライベート、登録不要。 +--- + +# ODSからPDF + +OpenDocumentスプレッドシートファイルをPDFに変換します。ODSはLibreOffice Calcのネイティブ形式で、Google Sheetsからよくエクスポートされる形式でもあります。このツールは、スプレッドシートのデータ、書式、グラフをページ分割されたPDFにレンダリングし、印刷や共有に使えるようにします。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :----------------------- | :----- | :--------------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / Google Sheetsのエクスポート | + +## 使い方 + +1. アップロード領域をクリックするか、ODSファイルをドラッグ&ドロップします。複数のファイルに対応しています。 +2. ファイル一覧を確認します。ごみ箱アイコンでファイルを削除するか、**ファイルを追加**をクリックしてバッチを増やせます。 +3. **PDFに変換**をクリックします。LibreOfficeベースのエンジンがブラウザに読み込まれ、各スプレッドシートをPDFページにレンダリングします。 +4. 1つのスプレッドシートはPDFとしてダウンロードされます。複数のファイルは`ods-to-pdf.zip`にまとめられます。 + +## オプション + +設定は不要です。コンバーターは、スプレッドシートに設定済みの印刷レイアウト、セルの書式、列幅をそのままPDF出力に適用します。 + +## ユースケース + +- PDFしか受け付けない相手にLibreOffice Calcの予算表やレポートを共有する +- ODSとしてダウンロードしたGoogle Sheetsのエクスポートを印刷する +- 財務記録を編集できない形式で保管する +- ODSベースのフォームやタイムシートをレイアウト固定の文書として提出する + +## ヒント + +- スプレッドシートに複数のシートがある場合、すべてのシートがPDF出力に含まれます。 +- 非常に幅の広いスプレッドシートは、PDFの複数ページに横方向で分割されることがあります。レイアウトが重要な場合は、変換前に元ファイルで列幅を調整してください。 +- LibreOfficeエンジンは初回使用時に初期化されます。同じセッション内の2回目以降の変換は高速です。 + +## 関連ツール + +- [ODGからPDF](./odg-to-pdf) +- [ODPからPDF](./odp-to-pdf) +- [XMLからPDF](./xml-to-pdf) diff --git a/docs/ja/tools/odt-to-pdf.md b/docs/ja/tools/odt-to-pdf.md new file mode 100644 index 00000000..57c59cf7 --- /dev/null +++ b/docs/ja/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODTからPDF +description: LibreOfficeベースのエンジンを使い、OpenDocument Text (ODT) ファイルをブラウザ上でPDF形式に変換します。 +--- + +# ODTからPDF + +OpenDocument TextファイルをPDFに変換します。ODTはLibreOffice Writer、Apache OpenOffice、その他のオープンソースワープロのネイティブ形式です。このツールはブラウザ上のLibreOfficeエンジンを使い、書式、表、画像、スタイルを保持した正確な変換を行います。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :---------------- | :----- | +| OpenDocument Text | `.odt` | + +## 使い方 + +1. アップロード領域をクリックするか、1つ以上のODTファイルをドラッグ&ドロップします。 +2. ファイル一覧を確認します。ファイルの追加や不要なファイルの削除ができます。 +3. **PDFに変換**をクリックします。LibreOfficeエンジンが初期化され (進行状況インジケーターに読み込み状況が表示されます)、その後各ファイルが変換されます。 +4. 1つのファイルはPDFとして直接ダウンロードされます。複数のファイルは`odt-converted.zip`にまとめられます。 + +## オプション + +このツールに追加の設定はありません。変換では、元の文書の書式をできるだけ忠実に保持します。 + +## 出力 + +| 入力数 | 出力 | +| :------------ | :-------------------------------------------------------------------- | +| 1ファイル | 単一のPDFをダウンロード (例: `document.pdf`) | +| 2ファイル以上 | ZIPアーカイブ (`odt-converted.zip`)。ファイルごとに1つのPDFを含みます | + +## ユースケース + +- LibreOffice Writerの文書をPDFに変換し、Microsoft Officeユーザーと共有する +- OpenDocument形式で書かれた学術論文から印刷用PDFを作成する +- ODTテンプレートのフォルダをまとめてPDFに変換して配布する +- 自動文書生成システムが作成したODTファイルからPDFを生成する + +## ヒント + +- LibreOfficeエンジンは初回使用時に読み込まれ、以降の変換のためにキャッシュされます。初回の読み込みには数秒かかりますが、その後の変換は高速です。 +- 埋め込みOLEオブジェクトや特殊なフォントを含む複雑な文書は、デスクトップ版LibreOfficeとわずかに異なる表示になることがあります。一括変換の前にサンプルで試してください。 +- Word文書 (`.doc`, `.docx`) には、代わりに[WordからPDF](./word-to-pdf)ツールを使ってください。同じLibreOfficeエンジンを使い、Microsoft形式を直接受け付けます。 + +## 関連ツール + +- [WordからPDF](./word-to-pdf) +- [RTFからPDF](./rtf-to-pdf) +- [テキストからPDF](./txt-to-pdf) diff --git a/docs/ja/tools/organize-pdf.md b/docs/ja/tools/organize-pdf.md new file mode 100644 index 00000000..a8516b9c --- /dev/null +++ b/docs/ja/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: 複製と整理 +description: ドラッグ&ドロップのサムネイルとカスタムページ順入力で、PDFのページを並べ替え、複製、削除します。 +--- + +# 複製と整理 + +視覚的なドラッグ&ドロップ操作で、PDFのページを並べ替え、複製、削除します。各ページはサムネイルとして表示され、移動、複製、削除をしてから新しいファイルとして保存できます。 + +## 使い方 + +1. PDFファイルを1つアップロードします。 +2. すべてのページを示すサムネイルグリッドが表示されます。 +3. サムネイルをドラッグしてページを並べ替えます。緑の複製ボタンでページを複製し、赤の削除ボタンでページを削除します。 +4. または、テキストフィールドにカスタムページ順 (例: `3, 1, 2, 4`) を入力して**適用**をクリックすると、すべてのページを一度に並べ替えられます。 +5. 処理ボタンをクリックして、整理したPDFを作成しダウンロードします。 + +## 機能 + +- アニメーション付きのドラッグ&ドロップによるページの並べ替え +- ページごとの複製ボタンと削除ボタン +- 正確な並べ替えのためのカスタムページ順入力 +- 変更のたびに自動更新されるページ番号ラベル +- 最後に残った1ページは削除できません + +## ユースケース + +- レポートの中で位置がずれたページを正しい位置に移動する +- フォームのページを複製し、1つのファイルに複数の空白コピーを作る +- 文書を配布する前に、下書きやプレースホルダーのページを削除する +- 印刷準備のためにページ順を逆にしたり入れ替えたりする +- 別々のファイルを再結合せずに、独自のページ順序を作る + +## ヒント + +- カスタムページ順のフィールドには、元のページ番号をカンマ区切りで入力します。すべてのページをちょうど1回ずつ含める必要があり、抜けや重複は使えません。 +- ページを複製すると、2つのコピーは同じ元のページインデックスを参照します。どちらのコピーも独立して並べ替えられます。 +- 複数ファイルにまたがる一括操作やより高度なワークフローには、代わりに[PDFマルチツール](./pdf-multi-tool)をご検討ください。 + +## 関連ツール + +- [PDFの結合](./merge-pdf) +- [ページの削除](./delete-pages) +- [PDFマルチツール](./pdf-multi-tool) +- [ページの反転](./reverse-pages) diff --git a/docs/ja/tools/page-dimensions.md b/docs/ja/tools/page-dimensions.md new file mode 100644 index 00000000..51ba7e14 --- /dev/null +++ b/docs/ja/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: ページ寸法 +description: PDFのページサイズ、向き、縦横比、回転を分析します。サイズが混在した文書を検出し、データをCSVにエクスポートできます。 +--- + +# ページ寸法 + +PDFのすべてのページを読み取り、正確な寸法、向き、標準サイズ名、縦横比、面積、回転を報告する診断ツールです。印刷前にサイズが混在したページを見つけたり、受け取ったPDFのプロパティを記録したりするのに便利です。 + +## 使い方 + +1. PDFファイルをアップロードします。分析は自動的に始まり、押すボタンはありません。 +2. サマリーパネルに、総ページ数、異なるページサイズの数、サイズが混在しているかどうかが表示されます。 +3. ページごとの詳細を含む結果テーブル全体を確認します。 +4. 表示単位をポイント、インチ、ミリメートル、ピクセルから切り替えられます。 +5. **CSVにエクスポート**をクリックしてデータを保存します。 + +## 報告される項目 + +| 列 | 説明 | +| ---------- | ------------------------------------------------- | +| ページ番号 | 連番のページ番号 | +| 寸法 | 選択した単位での幅 x 高さ | +| 標準サイズ | 一致した名前 (A4、Letterなど)、または「カスタム」 | +| 向き | 縦または横 | +| 縦横比 | 幅と高さの比 (小数) | +| 面積 | 選択した単位の2乗でのページ面積 | +| 回転 | ページの回転角度 (度) | + +## 機能 + +- 標準の用紙サイズ (A3、A4、A5、Letter、Legal、Tabloidなど) の自動検出 +- サイズ混在の警告。どのサイズが何ページで使われているかの内訳も表示 +- ポイント、インチ、ミリメートル、ピクセル (96 PPI) の間の単位変換 +- スプレッドシートやドキュメント管理システムで使えるCSVエクスポート + +## ユースケース + +- 印刷会社に文書を提出する前に、すべてのページがA4であることを確認する +- 結合したPDFで特定のページだけ余白が想定外になる原因を調べる +- 大量のPDFアーカイブのページレイアウトをメタデータ記録として文書化する +- 修正が必要な回転済みページを見つける + +## ヒント + +- サマリーに「サイズ混在」と表示された場合は、印刷前にページサイズを固定ツールで統一してください。 +- 回転フィールドを見ると、正しく表示されていても回転属性が0以外のページを特定できます。これは一部のワークフローで問題の原因になることがあります。 + +## 関連ツール + +- [ページサイズを固定](./fix-page-size): サイズが混在していると分かったページを統一します +- [PDFの圧縮](./compress-pdf): ページの問題を修正した後にPDFを最適化します +- [PDFの回転](./rotate-pdf): 回転しているページを修正します diff --git a/docs/ja/tools/page-numbers.md b/docs/ja/tools/page-numbers.md new file mode 100644 index 00000000..d9726441 --- /dev/null +++ b/docs/ja/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: ページ番号 +description: フォント、サイズ、色を設定して、PDFページの好きな位置にカスタマイズ可能なページ番号を追加します。 +--- + +# ページ番号 + +PDFのすべてのページに、見えるページ番号を追加します。位置、形式、フォントサイズ、色を選ぶだけで、あとはツールが処理します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 表示されるオプションパネルでページ番号の設定を行います。 +3. **ページ番号を追加**をクリックして処理します。 +4. 番号付きのPDFが自動的にダウンロードされます。 + +## オプション + +- **位置**: ページ番号を表示する場所を選びます。下中央、左下、右下、上中央、左上、右上から選べます。 +- **形式**: 単純な連番 (1, 2, 3...) か、「全Yページ中Xページ」形式 (1 / 5, 2 / 5...) を選びます。 +- **フォントサイズ**: ページ番号のテキストサイズを設定します。デフォルトは12です。 +- **色**: カラーピッカーでページ番号のテキストの色を自由に選べます。 + +## 機能 + +- 四隅と中央をカバーする6種類の配置オプション +- 2種類の番号形式: 単純な連番、または「全Yページ中Xページ」 +- 6〜72ポイントで調整できるフォントサイズ +- テキストの色を選べるフルカラーピッカー +- ページサイズに関係なく、番号を安全な領域内に収める自動余白処理 + +## ユースケース + +- ページ参照が必要な文書を印刷用に準備する +- 複数のファイルから作った結合PDFにページ番号を追加する +- 配布前のプレゼン資料にページ番号を振る +- 法律文書や契約書に連番を追加する + +## ヒント + +- 「全Yページ中Xページ」形式は、提案書やレポートなど、読み手が全体の長さを知る必要がある文書に便利です。 +- 前付けにローマ数字を使うなど、セクションごとに異なる番号スタイルが必要な場合は、代わりに[ページラベルの追加](./add-page-labels)ツールを使ってください。 + +## 関連ツール + +- [ページラベルの追加](./add-page-labels) +- [通し番号付け](./bates-numbering) +- [ヘッダーとフッター](./header-footer) diff --git a/docs/ja/tools/pdf-booklet.md b/docs/ja/tools/pdf-booklet.md new file mode 100644 index 00000000..69425c4a --- /dev/null +++ b/docs/ja/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDFブックレット +description: PDFのページを、折って綴じて冊子にするための中綴じ(ブックレット)順に並べ替えます。 +--- + +# PDFブックレット + +PDFのページをブックレットの面付け順に並べ替えます。両面印刷して半分に折ると、ページが正しい読み順になります。中綴じの冊子やジンで使われるレイアウトです。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. ブックレットの設定を行います。出力ページサイズと向きを選びます。 +3. **プレビューを生成**をクリックして、各シートでのページの配置を確認します。 +4. プレビューを確認します。各用紙の表面と裏面に割り当てられたページが表示されます。 +5. **ダウンロード**をクリックして、面付け済みのブックレットPDFを保存します。 + +## 機能 + +- 中綴じ製本のための自動ページ並べ替え +- 出力ページサイズの設定 +- ダウンロード前にブックレットのレイアウトを視覚的にプレビュー +- ページ数が奇数の場合は必要に応じて空白ページを挿入 +- 元のページをブックレットの用紙サイズに合わせて拡大縮小 + +## ユースケース + +- 通常のPDFから印刷できるブックレットやジンを作る +- 社内印刷用にカンファレンスのプログラムやイベントガイドを準備する +- 二つ折りのグリーティングカードや小さなカタログを作る +- 手製本用の小冊子や詩集を作る + +## ヒント + +- きれいなブックレットにするには、元のPDFのページ数が4の倍数であることが理想です。そうでない場合は、最後の用紙を埋めるため空白ページが自動的に追加されます。 +- 出力は、プリンターの「短辺とじ」で両面印刷し、すべての用紙を重ねて折り、背をホチキスで留めてください。 +- ブックレット順にせず、単に複数のページを1枚の用紙に並べたい場合は、代わりに[N-Up PDF](./n-up-pdf)を使ってください。 + +## 関連ツール + +- [N-Up PDF](./n-up-pdf) +- [PDFの回転](./rotate-pdf) +- [空白ページの追加](./add-blank-page) diff --git a/docs/ja/tools/pdf-layers.md b/docs/ja/tools/pdf-layers.md new file mode 100644 index 00000000..0707230d --- /dev/null +++ b/docs/ja/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCGレイヤー +description: PDF文書内のオプショナルコンテンツグループ (OCG) レイヤーを表示、切り替え、追加、削除します。 +--- + +# PDF OCGレイヤー + +PDF内のオプショナルコンテンツグループ (OCG)、一般に「レイヤー」と呼ばれるものを管理します。レイヤーの表示切り替え、新しいレイヤー (入れ子の子レイヤーを含む) の追加、レイヤーの削除を行い、変更したPDFを保存できます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 処理ボタンをクリックして、PyMuPDFエンジンで文書を読み込みます。 +3. 既存のすべてのレイヤーが、表示状態、ロック状態、入れ子の階層とともに表示されます。 +4. チェックボックスでレイヤーの表示と非表示を切り替えます。ロックされたレイヤーは切り替えられません。 +5. 名前を入力して追加ボタンをクリックすると新しいトップレベルのレイヤーを追加でき、既存の親レイヤーの下に子レイヤーも追加できます。 +6. 不要になったレイヤーを削除します。 +7. **保存**をクリックして、レイヤーの変更を反映したPDFをダウンロードします。 + +## 機能 + +- 入れ子のレイヤーを適切なインデントで階層表示 +- レイヤーの表示と非表示の切り替え +- ロックされたレイヤーの表示により、誤った変更を防止 +- 任意の名前でトップレベルまたは子レイヤーを追加 +- 個別のレイヤーを削除 +- すべての変更を新しいPDFファイルに保存 + +## ユースケース + +- 建築や設計図面で、マークアップレイヤーの表示を切り替える +- 複数レイヤーのデザイン文書に新しい注釈レイヤーを追加する +- テンプレートを配布する前に、不要になったレイヤーを削除する +- 第三者から受け取った複雑なPDFにどのレイヤーがあるか調べる + +## ヒント + +- PDFにレイヤーがない場合、ツールは空の状態を表示し、レイヤーの追加を促します。すべてのPDFがOCGレイヤーを使っているわけではなく、CAD出力やデザインファイルで最もよく使われます。 +- 子レイヤーは親の下にインデントして表示されます。レイヤーは任意の深さまで入れ子にできます。 +- ロックされたレイヤーにはロックアイコンが表示され、チェックボックスは無効になります。このロックはPDFの作成者が設定したものです。 + +## 関連ツール + +- [メタデータの表示](./view-metadata) +- [メタデータの編集](./edit-metadata) +- [複製と整理](./organize-pdf) diff --git a/docs/ja/tools/pdf-multi-tool.md b/docs/ja/tools/pdf-multi-tool.md new file mode 100644 index 00000000..20a21eb6 --- /dev/null +++ b/docs/ja/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDFマルチツール +description: PDFページの結合、分割、回転、複製、削除、並べ替えができるオールインワンのページ管理ツールです。 +--- + +# PDFマルチツール + +ページ単位のあらゆるPDF操作をまとめた統合ワークスペースです。1つ以上のPDFをアップロードすると、すべてのページを1つの視覚的なグリッドで扱えます。回転、並べ替え、複製、削除、新しいPDFの挿入、空白ページの追加、結果の分割まで、ツールを離れずに行えます。 + +## 使い方 + +1. **PDFをアップロード**をクリックするか、アップロード領域にファイルをドラッグします。複数のファイルに対応しています。 +2. アップロードしたすべてのファイルのページが、サムネイル付きのスクロール可能なグリッドに表示されます。 +3. ツールバーまたはページごとの操作ボタンでページを操作します。 +4. 各カードのチェックボックスでページを選択し、一括操作を適用します。 +5. はさみアイコンで分割位置を指定すると、出力が複数のファイルに分割されます。 +6. **PDFをエクスポート**をクリックして最終結果をダウンロードします。分割マーカーがある場合、出力は複数のPDFを含むZIPになります。 + +## 機能 + +- **結合**: 複数のPDFをアップロードすると、自動的に1つのワークスペースにまとまります +- **並べ替え**: ページカードをドラッグ&ドロップして順序を変更します +- **回転**: ページごと、または一括で、90度単位 (左または右) に回転します +- **複製**: ワンクリックで任意のページを複製します +- **削除**: 個別のページ、または選択したページをまとめて削除します +- **PDFの挿入**: 指定したページの後ろに新しいPDFを追加します +- **空白ページの追加**: 末尾に空白のA4ページを追加します +- **分割**: ページの間に分割マーカーを置き、別々のPDFのZIPとしてエクスポートします +- **すべて選択 / 選択解除**: 一括操作のための素早い選択 +- **元に戻す / やり直し**: すべての操作に対応した完全な履歴 +- **選択したページをダウンロード**: 選択したページだけを独立したPDFとしてエクスポートします +- 破損したPDFは読み込み前に自動修復します + +## ユースケース + +- 複数の元PDFのページから独自の文書を作る +- スキャン文書の空白ページを削除し、横向きのスキャンを回転し、セクションを並べ替えて整える +- 視覚的な分割マーカーで、大きなPDFを章の区切りで分割する +- 本格的なPDFエディターを使わずに、手早くページ単位で編集する + +## ヒント + +- 元に戻す/やり直しはすべての操作を記録します。作業が誤って失われることはないので、気軽に使ってください。 +- 分割マーカーはページ間の青い破線として表示されます。文書を分けたい位置に視覚的に置いてからエクスポートすると、ZIPが得られます。 +- 単純な結合や分割には、専用の[PDFの結合](./merge-pdf)または[PDFの分割](./split-pdf)ツールのほうが速い場合があります。マルチツールは、1回のセッションで複数の操作が必要なときに力を発揮します。 + +## 関連ツール + +- [PDFの結合](./merge-pdf) +- [PDFの分割](./split-pdf) +- [複製と整理](./organize-pdf) +- [PDFの回転](./rotate-pdf) diff --git a/docs/ja/tools/pdf-to-bmp.md b/docs/ja/tools/pdf-to-bmp.md new file mode 100644 index 00000000..8a6557ee --- /dev/null +++ b/docs/ja/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDFからBMP +description: PDFのページを非圧縮のBMP画像に変換します。ビットマップ入力が必要なレガシーシステムや印刷ワークフローに便利です。 +--- + +# PDFからBMP + +PDFの各ページをBMP (ビットマップ) 画像に変換します。BMPは非圧縮形式なので、出力は画質の劣化がなくピクセル単位で正確ですが、ファイルは大きくなります。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **変換**をクリックしてファイルを処理します。 +3. 1つの`.bmp`ファイル、またはZIPアーカイブが自動的にダウンロードされます。 + +## オプション + +このツールに設定可能なオプションはありません。ページは固定の2倍スケールでレンダリングされ、PDF本来のページ寸法のおよそ2倍の画像になります。 + +## 出力形式 + +- **1ページ**: `filename.bmp` +- **複数ページ**: `filename_bmps.zip`。`page_1.bmp`、`page_2.bmp`などを含みます。 + +## ユースケース + +- BMP入力しか受け付けないレガシーシステムやハードウェアにPDFのページを渡す。 +- 特定の印刷ワークフロー向けに非圧縮画像を準備する。 +- 生のピクセルデータが必要な画像処理ツールの入力としてビットマップ出力を使う。 + +## ヒント + +- BMPファイルは圧縮なしで生のピクセルデータを保存するため、非常に大きくなります。ほとんどの用途では、[PDFからPNG](./pdf-to-png)のほうがロスレスの画質を保ちながらファイルがはるかに小さくなります。 +- 対象のシステムがPNGやTIFFに対応しているなら、ディスク容量を節約するためそれらの形式を優先してください。 + +## 関連ツール + +- [PDFからPNG](./pdf-to-png) +- [PDFからTIFF](./pdf-to-tiff) +- [PDFからJPG](./pdf-to-jpg) diff --git a/docs/ja/tools/pdf-to-cbz.md b/docs/ja/tools/pdf-to-cbz.md new file mode 100644 index 00000000..bb65e6ca --- /dev/null +++ b/docs/ja/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDFからCBZ +description: PDFを、Komga、Kavita、CDisplayEx、Calibreなどのコミックリーダー向けのCBZ (コミックブックアーカイブ) ファイルに変換します。 +--- + +# PDFからCBZ + +PDFをCBZ (Comic Book ZIP) ファイルに変換します。デジタルコミックやマンガの標準形式です。PDFの各ページはアーカイブ内の画像になります。最大限の互換性のため、メタデータはComicInfo.xml、metadata.opf、ComicBookInfo JSONの3つの形式で生成されます。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. 画像形式、品質、スケール、任意のメタデータを選びます。 +3. **変換**をクリックしてCBZファイルを生成します。 +4. `.cbz`ファイルが自動的にダウンロードされます。 + +## オプション + +| オプション | 値 | デフォルト | 説明 | +| ------------------ | --------------- | ---------- | ---------------------------------------------------------------------------------------- | +| 画像形式 | JPEG, PNG, WebP | JPEG | カラーのコミックにはJPEG、ロスレスの白黒マンガにはPNG、最高の圧縮にはWebP。 | +| 品質 | 50–100% | 85% | JPEG/WebPの圧縮を制御します。PNG (常にロスレス) では非表示です。 | +| スケール | 1.0x–4.0x | 2.0x | スケールを上げると、高解像度の画面向けにより鮮明な画像になります。 | +| グレースケール | オン/オフ | オフ | ページをグレースケールに変換します。白黒のコンテンツではファイルサイズが小さくなります。 | +| マンガモード | オン/オフ | オフ | メタデータに右から左への読み方向を設定します。 | +| メタデータを含める | オン/オフ | オン | ComicInfo.xml、metadata.opf、ComicBookInfo JSONを埋め込みます。 | + +## メタデータ項目 + +メタデータを有効にすると、次の項目を入力できます。 + +- **タイトル**: PDFのファイル名から自動検出されます。 +- **シリーズ**: シリーズ名 (例: 「Naruto」)。 +- **番号 (#)**: シリーズ内の号数。 +- **巻 (Vol.)**: 巻数。 +- **著者**: 作者または制作者の名前。 +- **出版社**: 出版会社。 +- **タグ / ジャンル**: カンマ区切りのタグ (例: 「Action, Adventure」)。 +- **出版年**: 出版された年 (1900〜2100)。 +- **評価**: 0から5のコミュニティ評価。 + +## メタデータの互換性 + +このツールは、どのリーダーでも見つけられるよう、3つの形式でメタデータを書き込みます。 + +| 形式 | 場所 | 対応するリーダー | +| ------------------ | --------------- | ------------------------------------------- | +| ComicInfo.xml | ZIP内のファイル | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | ZIP内のファイル | Calibre | +| ComicBookInfo JSON | ZIPのコメント欄 | Calibre (フォールバック) | + +## 出力形式 + +- `filename.cbz`: 番号付きのページ画像とメタデータファイルを含むZIPアーカイブ。 + +ページ画像には、リーダーが正しい順序で表示できるよう、ゼロ埋めした番号 (`01.jpg`、`02.jpg`など) が付けられます。 + +## ユースケース + +- マンガやコミックのPDFを、コミックリーダーで使えるように変換する。 +- Komga、Kavita、Calibreでデジタルコミックのライブラリを構築する。 +- スキャンしたコミックを、リーダーで読みやすい形式に変換する。 +- 読み方向とメタデータを保持した形式でコミックを共有する。 + +## ヒント + +- カラーのコミックには**JPEG**、白黒のマンガには**PNG**を使ってください。PNGは白黒のコンテンツを非常に効率よく圧縮します。 +- マンガでは**グレースケール**を有効にすると、ファイルサイズを大幅に減らせます。 +- ライブラリ管理ツール (Komga、Calibre) がコレクションを自動的に整理できるよう、**シリーズ**と**番号**を入力してください。 +- **WebP**は最高の圧縮率ですが、古いコミックリーダーは対応していない場合があります。 + +## 関連ツール + +- [PDFからJPG](./pdf-to-jpg) +- [PDFからPNG](./pdf-to-png) +- [PDFからTIFF](./pdf-to-tiff) +- [画像の抽出](./extract-images) diff --git a/docs/ja/tools/pdf-to-csv.md b/docs/ja/tools/pdf-to-csv.md new file mode 100644 index 00000000..2e6c05e4 --- /dev/null +++ b/docs/ja/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDFからCSV +description: PDF文書から表を抽出し、1つのCSVファイルとしてエクスポートします。自動表検出で複数ページのPDFにも対応します。 +--- + +# PDFからCSV + +PDFから表を抽出し、CSVファイルとしてエクスポートします。このツールはPyMuPDFの表検出エンジンですべてのページから表形式のデータを探し、見つかったすべての行を1つのカンマ区切りの出力に書き込みます。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **変換**をクリックして表の抽出を開始します。 +3. ツールが各ページをスキャンし、表を自動的に識別します。 +4. 抽出されたすべての表データを含む`.csv`ファイルがダウンロードされます。 + +異なるページの表は、出力内で空白行によって区切られます。カンマ、引用符、改行を含むセルは、RFC 4180に従って適切にエスケープされます。 + +## オプション + +このツールに設定可能なオプションはありません。文書内で見つかったすべての表が抽出され、1つのCSVにまとめられます。 + +## 出力形式 + +- 検出されたすべての表を含む、単一の`filename.csv`ファイル。 + +## ユースケース + +- PDFの銀行明細や請求書の財務データをスプレッドシートに取り込む。 +- 業者の見積書から価格表を抽出して比較する。 +- PDF論文の表形式の研究データを、分析ツールに適した形式に変換する。 +- 古いPDFレポートのデータをデータベースに移行する。 + +## ヒント + +- 表が見つからない場合、ツールは「表が見つかりません」というメッセージを表示します。これは通常、PDFのテキストレイアウトが表のように見えても、実際の表として構造化されていないことを意味します。 +- 個々の表をより細かく制御したい場合は、CSV、JSON、Markdownの出力形式から選べる[PDFテーブルの抽出](./extract-tables)を使ってください。 +- 表ごとにシートを分けたExcel形式でデータが必要な場合は、[PDFからExcel](./pdf-to-excel)を使ってください。 + +## 関連ツール + +- [PDFからExcel](./pdf-to-excel) +- [PDFテーブルの抽出](./extract-tables) +- [PDFからテキスト](./pdf-to-text) diff --git a/docs/ja/tools/pdf-to-excel.md b/docs/ja/tools/pdf-to-excel.md new file mode 100644 index 00000000..fb3e71e0 --- /dev/null +++ b/docs/ja/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDFからExcel +description: PDF文書から表を抽出してExcelスプレッドシートにします。各表は、ページ参照付きの専用ワークシートに配置されます。 +--- + +# PDFからExcel + +PDFから表を抽出し、Excel (`.xlsx`) スプレッドシートとして保存します。検出された各表は、表番号と元のページが付いた専用のワークシートに配置されます。表の検出にはPyMuPDF、Excelの生成にはSheetJSライブラリを使用しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **変換**をクリックして表の抽出を開始します。 +3. ツールがすべてのページから表をスキャンし、Excelブックを作成します。 +4. 表ごとに1シートを持つ`.xlsx`ファイルがダウンロードされます。 + +## オプション + +このツールに設定可能なオプションはありません。検出されたすべての表が自動的に抽出されます。 + +## 出力形式 + +- 単一の`filename.xlsx`ファイル。 +- **表が1つの場合**: 「Table」という名前のワークシートが1つ。 +- **表が複数の場合**: 「Table 1 (Page 3)」、「Table 2 (Page 5)」などの名前のワークシート。シート名はExcelの上限である31文字に切り詰められます。 + +## ユースケース + +- PDFの財務レポートを、さらに分析するための編集可能なスプレッドシートに変換する。 +- 仕入先のPDFから在庫表や注文表を抽出する。 +- PDFのフォームやカタログの構造化データをExcelに取り込み、並べ替えやフィルターを行う。 +- 表形式のPDFデータを、専門外の同僚でも扱える形式で保管する。 + +## ヒント + +- ツールが「表が見つかりません」と報告する場合、そのPDFは構造化された表ではなく、自由なテキストレイアウトを使っている可能性があります。代わりに[PDFからテキスト](./pdf-to-text)で生のコンテンツを取得してみてください。 +- よりシンプルなフラット形式には[PDFからCSV](./pdf-to-csv)を使ってください。表ごとに複数の形式でダウンロードしたい場合は、[PDFテーブルの抽出](./extract-tables)を使ってください。 +- シート名を確認すると、各表がどのページのものか分かります。 + +## 関連ツール + +- [PDFからCSV](./pdf-to-csv) +- [PDFテーブルの抽出](./extract-tables) +- [PDFからテキスト](./pdf-to-text) diff --git a/docs/ja/tools/pdf-to-greyscale.md b/docs/ja/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..3a11c46f --- /dev/null +++ b/docs/ja/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDFのグレースケール化 +description: カラーのPDFをグレースケール (白黒) 版に変換します。すべてのページから色を除いた新しいPDFを作成します。 +--- + +# PDFのグレースケール化 + +カラーのPDFをグレースケール版に変換します。各ページはレンダリングされ、彩度を落とした後、JPEG画像として新しいPDFに再埋め込みされます。出力は元のページ寸法を保持します。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **変換**をクリックしてファイルを処理します。 +3. すべてのページが白黒に変換された新しい`greyscale.pdf`がダウンロードされます。 + +内部的には、各ページが2倍スケールでレンダリングされ、ピクセルデータにグレースケールフィルターが適用され、品質90%のJPEGとして再エンコードされて、新しいPDF文書に配置されます。 + +## オプション + +このツールに設定可能なオプションはありません。グレースケール変換には標準の輝度計算式を使い、JPEG品質は90%に固定されています。 + +## 出力形式 + +- すべてのページをグレースケールのJPEG画像として含む、単一の`greyscale.pdf`ファイル。 + +## ユースケース + +- カラーインクのコストを節約するため、白黒印刷用に文書を準備する。 +- グレースケールを義務付ける法的または行政の提出要件を満たす。 +- カラーが多いPDFのファイルサイズを減らす (グレースケールのJPEG画像はカラーより小さくなります)。 +- カラーと白黒のページが混在する文書で、見た目を統一する。 + +## ヒント + +- 各ページがラスタライズされJPEGとして再埋め込みされるため、出力は画像ベースになります。元のPDFのテキストは選択も検索もできなくなります。後で検索可能なテキストが必要な場合は、出力をOCRツールにかけてください。 +- 明るさ、コントラスト、彩度などの色調整をより細かく行いたい場合は、色の調整ツールや、[PDFワークフロービルダー](./pdf-workflow)のグレースケールノードをご覧ください。 + +## 関連ツール + +- [PDFからJPG](./pdf-to-jpg) +- [PDFからPNG](./pdf-to-png) +- [PDFワークフロービルダー](./pdf-workflow) diff --git a/docs/ja/tools/pdf-to-jpg.md b/docs/ja/tools/pdf-to-jpg.md new file mode 100644 index 00000000..c20b8f1e --- /dev/null +++ b/docs/ja/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDFからJPG +description: PDFのページを、品質を調整できるJPG画像に変換します。1ページのPDFは直接ダウンロードされ、複数ページのPDFはZIPとしてエクスポートされます。 +--- + +# PDFからJPG + +PDFの各ページをJPG画像に変換します。1ページの文書は単独の`.jpg`ファイルとしてダウンロードされます。複数ページのPDFは、1ページにつき1つのJPGを含むZIPアーカイブになります。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。ツールにファイル名、ファイルサイズ、ページ数が表示されます。 +2. **品質**スライダーを調整して、JPGの圧縮を制御します。 +3. **変換**をクリックして処理を開始します。 +4. 結果は自動的にダウンロードされます。1ページのPDFなら1つのJPG、複数ページの文書ならZIPファイルです。 + +## オプション + +- **品質**: 0%から100% (デフォルトは90%) のスライダー。値を高くすると、ファイルサイズは大きくなりますが、より鮮明な画像になります。値を低くすると、より強く圧縮されます。 + +ページは内部で2倍スケールでレンダリングされるため、出力解像度はPDFのページ寸法の2倍になります。標準のレターサイズのページでは、約1,224 x 1,584ピクセルの画像になります。 + +## 出力形式 + +- **1ページ**: `filename.jpg` +- **複数ページ**: `filename_jpgs.zip`。`page_1.jpg`、`page_2.jpg`などを含みます。 + +## ユースケース + +- 文書管理システム用のプレビューサムネイルを生成する。 +- PDFに対応していないチャットやメールで、レポートの1ページを共有する。 +- PDFの図やイラストから画像素材を作る。 +- スキャンした文書を個別の画像として保管する。 + +## ヒント + +- ロスレスの出力が必要な場合は、代わりに[PDFからPNG](./pdf-to-png)を使ってください。 +- 品質を80〜90%に設定すると、ファイルサイズと見た目の忠実度のバランスがよくなります。 +- ページごとに特定の形式が必要な場合は、PDFから画像への出力ノードを持つ[PDFワークフロービルダー](./pdf-workflow)をご検討ください。 + +## 関連ツール + +- [PDFからPNG](./pdf-to-png) +- [PDFからWebP](./pdf-to-webp) +- [PDFからBMP](./pdf-to-bmp) +- [PDFからTIFF](./pdf-to-tiff) diff --git a/docs/ja/tools/pdf-to-json.md b/docs/ja/tools/pdf-to-json.md new file mode 100644 index 00000000..3780ebbf --- /dev/null +++ b/docs/ja/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDFからJSON +description: CPDFを使ってPDFファイルを構造化JSON形式に変換します。PDFの内部構造を機械可読なJSONデータとしてエクスポートします。 +--- + +# PDFからJSON + +1つ以上のPDFファイルをJSON形式に変換します。このツールはCPDF (Coherent PDF) を使い、各PDFの内部構造を機械可読なJSON表現にシリアライズします。出力は常にZIPアーカイブとして提供されます。 + +## 使い方 + +1. ファイルピッカーで1つ以上のPDFファイルを選択します。 +2. **変換**をクリックして処理を開始します。変換はバックグラウンドのWebワーカーで実行されます。 +3. 入力したPDFごとに1つのJSONファイルを含むZIPアーカイブがダウンロードされます。 + +ステータスバーに、変換とZIP作成の各段階の進行状況が表示されます。 + +## オプション + +このツールに設定可能なオプションはありません。各PDFは完全なJSON表現に変換されます。 + +## 出力形式 + +- 入力したPDFごとの`filename.json`を含む`pdfs-to-json.zip`ファイル。 + +JSON出力は、ページツリー、フォント参照、メタデータ、コンテンツストリームなど、PDFの内部オブジェクト構造を表します。 + +## ユースケース + +- デバッグや検証のために、PDFの内部構造を調べる。 +- 構造化されたメタデータやページのプロパティをプログラムで抽出する。 +- PDFの構造データを独自の処理パイプラインに渡す。 +- オブジェクトツリーを分析して、PDF文書のコンプライアンスを監査する。 + +## ヒント + +- このツールが出力するのは生のPDFオブジェクト構造で、抽出したテキストコンテンツではありません。ページのテキストをJSON形式で取得したい場合は、代わりに[AI用のPDFを準備する](./prepare-pdf-for-ai)を使ってください。 +- プレーンテキストの抽出には、[PDFからテキスト](./pdf-to-text)のほうが簡単です。 +- 構造が複雑な大きなPDFは、非常に大きなJSONファイルになります。 + +## 関連ツール + +- [PDFからテキスト](./pdf-to-text) +- [AI用のPDFを準備する](./prepare-pdf-for-ai) +- [PDFテーブルの抽出](./extract-tables) diff --git a/docs/ja/tools/pdf-to-markdown.md b/docs/ja/tools/pdf-to-markdown.md new file mode 100644 index 00000000..3f96e5b8 --- /dev/null +++ b/docs/ja/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDFからマークダウン +description: PDF文書をMarkdown形式に変換します。画像の抽出も任意で行え、複数ファイルの一括変換に対応しています。 +--- + +# PDFからマークダウン + +PDFファイルをMarkdown (`.md`) 形式に変換し、見出し、段落、リスト、基本的な書式を保持します。埋め込み画像の抽出と取り込みも任意で行えます。単一ファイルと一括変換に対応しています。PyMuPDFを使用しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、1つ以上のPDFをアップロードします。 +2. 必要に応じて**画像を含める**を切り替え、抽出した画像をMarkdown出力に埋め込みます。 +3. **変換**をクリックして処理を開始します。 +4. 1つのファイルは`filename.md`としてダウンロードされます。複数のファイルは`markdown-files.zip`になります。 + +## オプション + +- **画像を含める**: チェックすると、PDFの埋め込み画像が抽出され、Markdown出力から参照されます。チェックしない場合は、テキストコンテンツのみが変換されます。 + +## 出力形式 + +- **単一ファイル**: `filename.md` +- **複数ファイル**: 入力したPDFごとに1つの`.md`を含む`markdown-files.zip`。 + +## ユースケース + +- PDFのドキュメントを、VitePress、Hugo、Jekyllなどの静的サイトジェネレーター向けにMarkdownへ変換する。 +- PDFの研究論文を、Obsidianなどのノートアプリ向けに編集可能なMarkdownにする。 +- 古いPDFのナレッジベースを、Gitと相性のよいテキスト形式に移行する。 +- PDFの電子書籍から構造化されたコンテンツを抽出し、再フォーマットする。 + +## ヒント + +- 画像を含めるオプションは、PDFにコンテンツに不可欠な図や表が含まれている場合に便利です。テキスト中心の文書では、出力をすっきり保つために無効にしてください。 +- サイドバー、脚注、複数段組みのテキストを含む複雑なレイアウトでは、Markdownが完全にならないことがあります。必要に応じて出力を確認し、調整してください。 +- 書式のない生のテキストが必要な場合は、代わりに[PDFからテキスト](./pdf-to-text)を使ってください。 + +## 関連ツール + +- [PDFからテキスト](./pdf-to-text) +- [PDFからWord](./pdf-to-word) +- [AI用のPDFを準備する](./prepare-pdf-for-ai) diff --git a/docs/ja/tools/pdf-to-pdfa.md b/docs/ja/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..af4dd426 --- /dev/null +++ b/docs/ja/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDFからPDF/A +description: 標準のPDFを長期保存用のPDF/A形式に変換します。PDF/A-1b、PDF/A-2b、PDF/A-3bの準拠レベルに対応しています。 +--- + +# PDFからPDF/A + +PDF/Aは、デジタルデータの長期保存のために設計された、PDFのISO標準サブセットです。このツールは、ブラウザ内で直接動作するGhostscriptを使い、標準のPDFをPDF/A準拠の文書に変換します。 + +## 使い方 + +1. 1つ以上のPDFファイルをアップロードします。 +2. ドロップダウンから**PDF/Aバージョン**を選びます。 +3. 通常の変換に失敗する複雑なファイルでは、必要に応じて**事前に平坦化**を有効にします。 +4. **PDF/Aに変換**をクリックします。複数のファイルはZIPアーカイブになります。 + +## PDF/Aのバージョン + +| バージョン | 制限 | 適した用途 | +| ------------ | ------------------------------------------ | ---------------------------------- | +| **PDF/A-1b** | 最も厳格。透明効果とレイヤーは使用不可。 | 古い保管システムとの最大限の互換性 | +| **PDF/A-2b** | 透明効果とJPEG2000を許可。 | 汎用的な保管 (推奨) | +| **PDF/A-3b** | あらゆる形式の埋め込み添付ファイルを許可。 | 元のデータファイルを含む文書の保管 | + +デフォルトではPDF/A-2bが選択されており、ほとんどの保管ニーズに対応できます。 + +## 事前平坦化オプション + +PDFによっては、特殊なフォントエンコーディング、複雑な透明効果の重なり、壊れた内部構造など、PDF/Aへのきれいな変換を妨げる機能が含まれていることがあります。**事前に平坦化**を有効にすると、変換前にPDFを300 DPIでラスタライズします。これにより準拠が保証されますが、テキストは選択できなくなります。標準の変換でエラーが出る場合のフォールバックとして使ってください。 + +事前平坦化にはPyMuPDF WASMエンジンが必要です。 + +## ユースケース + +- 政府や法的な保管要件を満たす (多くの法域で、裁判所への提出書類にPDF/Aが義務付けられています) +- 機関リポジトリやデジタルライブラリに文書を提出する +- 元のソフトウェアが10年後には存在しないかもしれない業務記録を保存する +- XML添付ファイル付きのPDF/A-3bを必要とする電子請求書の規格向けに請求書を準備する + +## ヒント + +- まず事前平坦化なしで変換を試してください。エラーが出た場合にのみ有効にします。 +- PDF/Aはすべてのフォントを埋め込むため、出力ファイルは元のファイルより大きくなることがよくあります。 +- ワークフローで厳密な準拠が必要な場合は、専用のPDF/A検証ツールで出力を検証してください。 + +## 関連ツール + +- [PDFの圧縮](./compress-pdf): 変換後にファイルサイズを減らします +- [PDFの平坦化](./flatten-pdf): PDF/Aに変換する前にフォームを平坦化します +- [メタデータの削除](./remove-metadata): 保管前にメタデータを取り除きます diff --git a/docs/ja/tools/pdf-to-png.md b/docs/ja/tools/pdf-to-png.md new file mode 100644 index 00000000..5f50cf6a --- /dev/null +++ b/docs/ja/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDFからPNG +description: PDFのページを、スケールを調整できるロスレスのPNG画像に変換します。高品質なスクリーンショットや透明な背景に最適です。 +--- + +# PDFからPNG + +PDFの各ページをPNG画像に変換します。PNGはロスレス圧縮を使うため、出力は元のページのあらゆるディテールを保持します。1ページのPDFは`.png`ファイルとしてダウンロードされ、複数ページのPDFはZIPになります。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **スケール**スライダーを設定して、出力解像度を制御します。 +3. **変換**をクリックして処理を開始します。 +4. 1つのPNG、またはZIPアーカイブが自動的にダウンロードされます。 + +## オプション + +- **スケール**: 1.0xから3.0x (デフォルトは2.0x)。2.0xでは、標準のレターサイズのページが約1,224 x 1,584ピクセルでレンダリングされます。スケールを上げると、より大きく鮮明な画像になりますが、ファイルサイズと処理時間が増えます。 + +## 出力形式 + +- **1ページ**: `filename.png` +- **複数ページ**: `filename_pngs.zip`。`page_1.png`、`page_2.png`などを含みます。 + +## ユースケース + +- プレゼン用に、PDFページの高精細なスクリーンショットを取得する。 +- 輪郭がくっきりして圧縮ノイズのない、グラフや図を抽出する。 +- PDFのモックアップから、Webデザイン用の素材を準備する。 +- OCRの前処理用に、ロスレスのページ画像を作る。 + +## ヒント + +- PNGファイルはJPGよりかなり大きくなります。完璧な品質よりファイルサイズが重要な場合は、[PDFからJPG](./pdf-to-jpg)または[PDFからWebP](./pdf-to-webp)を使ってください。 +- スケール1.0xでは、出力はPDF本来の解像度と一致します。印刷品質で書き出すには3.0xに上げてください。 + +## 関連ツール + +- [PDFからJPG](./pdf-to-jpg) +- [PDFからWebP](./pdf-to-webp) +- [PDFからSVG](./pdf-to-svg) diff --git a/docs/ja/tools/pdf-to-svg.md b/docs/ja/tools/pdf-to-svg.md new file mode 100644 index 00000000..37da412c --- /dev/null +++ b/docs/ja/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDFからSVG +description: PDFのページをスケーラブルなSVGベクターグラフィックスに変換します。テキストと図形をベクターパスとして保持し、無限に拡大できます。 +--- + +# PDFからSVG + +PDFの各ページをSVG (Scalable Vector Graphics) ファイルに変換します。ラスター形式と違い、SVGはベクターパス、テキスト、図形を保持するため、出力はピクセル化せずに任意のサイズへ拡大できます。PyMuPDFを使用しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、1つ以上のPDFをアップロードします。複数のファイルを追加し、個別に管理できます。 +2. **変換**をクリックして、アップロードしたすべてのファイルを処理します。 +3. 1ファイル1ページの変換は、単独の`.svg`としてダウンロードされます。それ以外はZIPアーカイブとしてダウンロードされます。 + +## オプション + +このツールに設定可能なオプションはありません。各ページは、PyMuPDFのネイティブなベクターエクスポートでSVGに変換されます。 + +## 出力形式 + +- **単一ファイル、単一ページ**: `filename.svg` +- **単一ファイル、複数ページ**: `filename_svg.zip`。`page_1.svg`、`page_2.svg`などを含みます。 +- **複数ファイル**: 元の文書名ごとに整理されたファイルを含む`pdf_to_svg.zip`。 + +## ユースケース + +- PDFレポートからベクターの図、グラフ、イラストを抽出し、Webページで使う。 +- InkscapeやIllustratorなどのベクターエディターで、PDFページの内容を編集する。 +- レスポンシブなWebアプリケーションに、拡大縮小できるページプレビューを埋め込む。 +- PDFのパンフレットから、輪郭を保ったままロゴやグラフィックを抽出する。 + +## ヒント + +- SVGは、ベクターコンテンツを含むPDFで最も効果を発揮します。スキャンした文書や画像の多いPDFは、ラスターデータが埋め込まれた大きなSVGファイルになります。 +- 画像の多いPDFをラスター形式で出力するには、代わりに[PDFからPNG](./pdf-to-png)または[PDFからJPG](./pdf-to-jpg)を使ってください。 +- このツールは一括変換に対応しています。複数のPDFを一度にアップロードして、1回の実行ですべて変換できます。 + +## 関連ツール + +- [PDFからPNG](./pdf-to-png) +- [PDFからJPG](./pdf-to-jpg) +- [PDFからマークダウン](./pdf-to-markdown) diff --git a/docs/ja/tools/pdf-to-text.md b/docs/ja/tools/pdf-to-text.md new file mode 100644 index 00000000..87e8e37a --- /dev/null +++ b/docs/ja/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDFからテキスト +description: PDFファイルからプレーンテキストを抽出します。複数のPDFを一括で抽出でき、TXTファイルとして出力します。 +--- + +# PDFからテキスト + +PDFファイルからすべてのテキストコンテンツを抽出し、プレーンな`.txt`ファイルとして保存します。一括処理に対応しており、複数のPDFをアップロードすると、1回の操作でそれぞれのテキストを抽出できます。PyMuPDFを使用しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、1つ以上のPDFをアップロードします。ファイルリストは、追加ボタンとクリアボタンで管理できます。 +2. **抽出**をクリックして処理を開始します。 +3. 1つのファイルは`filename.txt`としてダウンロードされます。複数のファイルは`pdf-to-text.zip`アーカイブになります。 + +## オプション + +このツールに設定可能なオプションはありません。すべてのページのテキストコンテンツが、読み順に抽出されます。 + +## 出力形式 + +- **単一ファイル**: `filename.txt` +- **複数ファイル**: 入力したPDFごとに1つの`.txt`を含む`pdf-to-text.zip`。 + +## ユースケース + +- 全文検索のインデックス作成のために、PDFレポートから本文を抽出する。 +- PDFの電子書籍や記事を、電子ペーパー端末で読めるプレーンテキストに変換する。 +- キーワード分析のために、契約書や法的文書からテキストを取り出す。 +- データ処理スクリプト用に、PDFから書式を取り除いてきれいなテキストにする。 +- 自然言語処理のために、PDFアーカイブからテキストコーパスを準備する。 + +## ヒント + +- スキャンされたPDF (画像のみ) は、抽出できるテキストレイヤーがないため、空のテキストファイルになります。スキャンした文書は、先にOCRにかけてください。 +- 出力は、PyMuPDFが解釈した読み順を保持します。一般的には左から右、上から下の順です。複数段組みのレイアウトでは、テキストが入り混じることがあります。 +- 見出しや書式を含む構造化された出力には、[PDFからマークダウン](./pdf-to-markdown)をお試しください。AI向けの構造化JSONには、[AI用のPDFを準備する](./prepare-pdf-for-ai)を使ってください。 + +## 関連ツール + +- [PDFからマークダウン](./pdf-to-markdown) +- [AI用のPDFを準備する](./prepare-pdf-for-ai) +- [PDFからWord](./pdf-to-word) diff --git a/docs/ja/tools/pdf-to-tiff.md b/docs/ja/tools/pdf-to-tiff.md new file mode 100644 index 00000000..64b1b460 --- /dev/null +++ b/docs/ja/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDFからTIFF +description: PDFのページを、印刷、ファクス、アーカイブのワークフローでよく使われるTIFF画像に変換します。エンコードに失敗した場合はPNGにフォールバックします。 +--- + +# PDFからTIFF + +PDFの各ページをTIFF画像に変換します。TIFFは、印刷製版、ファクスシステム、文書アーカイブの標準形式です。このツールはTIFFのエンコードにPackBits圧縮を使い、ページのエンコードに失敗した場合はPNGにフォールバックします。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **変換**をクリックしてファイルを処理します。 +3. 1つのTIFFファイル、またはZIPアーカイブが自動的にダウンロードされます。 + +## オプション + +このツールに設定可能なオプションはありません。ページは固定の2倍スケールでレンダリングされます。 + +## 出力形式 + +- **1ページ**: `filename.tiff` +- **複数ページ**: `filename_tiffs.zip`。`page_1.tiff`、`page_2.tiff`などを含みます。 + +特定のページでTIFFのエンコードに失敗した場合 (圧縮の問題による)、そのページは代わりに`.png`ファイルとして保存されます。その場合、ZIPにはTIFFとPNGのファイルが混在します。 + +## ユースケース + +- TIFF形式を必須とする行政機関や法的システムに文書を提出する。 +- デジタルファクスサービスで送信するためのページを準備する。 +- スキャンした文書を、広くサポートされているロスレス形式で保管する。 +- 企業の文書管理システムにページを渡す。 + +## ヒント + +- TIFFファイルは大きくなります。Webや画面での利用でロスレスの品質だけが必要な場合は、[PDFからPNG](./pdf-to-png)のほうが適しています。 +- 一部のページでPNGへのフォールバックが発生した場合は、ZIPの中身を確認してください。それらのページは別途変換し直したほうがよいかもしれません。 + +## 関連ツール + +- [PDFからPNG](./pdf-to-png) +- [PDFからBMP](./pdf-to-bmp) +- [PDFからJPG](./pdf-to-jpg) diff --git a/docs/ja/tools/pdf-to-webp.md b/docs/ja/tools/pdf-to-webp.md new file mode 100644 index 00000000..9bd402d4 --- /dev/null +++ b/docs/ja/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDFからWebP +description: PDFのページを、品質を調整できるWebP画像に変換します。同程度の画質でJPGよりファイルサイズが小さくなります。 +--- + +# PDFからWebP + +PDFの各ページをWebP画像に変換します。WebPは、同じ体感品質でJPGより25〜35%小さいファイルになるのが一般的で、Web用途に適しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、PDFをアップロードします。 +2. **品質**スライダーを調整します。 +3. **変換**をクリックしてファイルを処理します。 +4. 1つの`.webp`ファイル、またはZIPアーカイブが自動的にダウンロードされます。 + +## オプション + +- **品質**: 0%から100% (デフォルトは85%) のスライダー。非可逆圧縮のレベルを制御します。値を高くすると、より多くのディテールが保持されます。 + +ページは内部で2倍スケールでレンダリングされ、PDF本来の寸法のおよそ2倍の画像になります。 + +## 出力形式 + +- **1ページ**: `filename.webp` +- **複数ページ**: `filename_webps.zip`。`page_1.webp`、`page_2.webp`などを含みます。 + +## ユースケース + +- 帯域幅が重要なWebサイト向けに、ページのプレビューを準備する。 +- ソーシャルメディア向けに、チラシやパンフレットの軽量な画像版を生成する。 +- 複数ページの文書を、Web向けに最適化した画像セットに一括変換する。 + +## ヒント + +- WebPはすべてのモダンブラウザでサポートされています。古い環境との互換性が必要な場合は、[PDFからJPG](./pdf-to-jpg)を使ってください。 +- 品質80〜85%なら、画面上では通常元の画像と見分けがつかず、ファイルサイズも小さく保てます。 + +## 関連ツール + +- [PDFからJPG](./pdf-to-jpg) +- [PDFからPNG](./pdf-to-png) +- [PDFからBMP](./pdf-to-bmp) diff --git a/docs/ja/tools/pdf-to-word.md b/docs/ja/tools/pdf-to-word.md new file mode 100644 index 00000000..5a7a3faf --- /dev/null +++ b/docs/ja/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDFからWord +description: PDFファイルを編集可能なWord (DOCX) 文書に変換します。複数のPDFの一括変換に対応しています。 +--- + +# PDFからWord + +PDFファイルを編集可能なWord (`.docx`) 文書に変換します。このツールはPyMuPDFを使って文書の内容を再構築し、テキスト、基本的な書式、レイアウトを保持します。単一ファイルと一括変換に対応しています。 + +## 使い方 + +1. ドロップゾーンをクリックするか、ファイルをドラッグして、1つ以上のPDFをアップロードします。ファイルを追加したり、リストから個別に削除したりできます。 +2. **変換**をクリックして処理を開始します。 +3. 1つのファイルは`filename.docx`としてダウンロードされます。複数のファイルは`converted-documents.zip`にまとめられます。 + +## オプション + +このツールに設定可能なオプションはありません。各PDFは、PyMuPDFの組み込み変換エンジンでDOCXに変換されます。 + +## 出力形式 + +- **単一ファイル**: `filename.docx` +- **複数ファイル**: 入力したPDFごとに1つの`.docx`を含む`converted-documents.zip`。 + +## ユースケース + +- 受け取ったPDFのテキストを、修正のために編集する。 +- 保管してあるPDFレポートを、同僚がMicrosoft WordやGoogle Docsで編集できる形式に変換する。 +- PDFの契約書や提案書の内容をWordに取り込み、修正履歴を付けて校正する。 +- 古いPDFドキュメントを、編集可能な形式に移行する。 + +## ヒント + +- 複数段組みのテキスト、埋め込みフォーム、多くのグラフィックを含む複雑なレイアウトは、完全には変換されないことがあります。出力を確認し、ワープロで書式を調整してください。 +- スキャンされたPDF (画像のみ) は、空または最小限のDOCXファイルになります。先にOCRにかけてテキストレイヤーを追加してください。 +- 一括モードは、フォルダ全体のPDFを変換するのに効率的です。まとめてアップロードしてください。 + +## 関連ツール + +- [PDFからテキスト](./pdf-to-text) +- [PDFからマークダウン](./pdf-to-markdown) +- [PDFワークフロービルダー](./pdf-workflow) diff --git a/docs/ja/tools/pdf-to-zip.md b/docs/ja/tools/pdf-to-zip.md new file mode 100644 index 00000000..f8906bdf --- /dev/null +++ b/docs/ja/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDFからZIP +description: 複数のPDFファイルを1つのZIPアーカイブにまとめ、共有や保管をしやすくします。 +--- + +# PDFからZIP + +複数のPDFファイルを1つのZIPアーカイブにまとめます。シンプルなパッケージツールで、PDF自体の変換、圧縮、変更は行いません。 + +## 使い方 + +1. ドロップゾーンを使って、複数のPDFファイルをアップロードします。 +2. ファイルの一覧を確認します。含めたくないものは削除します。 +3. 処理ボタンをクリックします。 +4. アップロードしたすべてのPDFを含むZIPアーカイブがすぐにダウンロードされます。 + +## 機能 + +- 任意の数のPDFファイルに対応 +- アーカイブ作成前にファイルごとに削除可能 +- ZIP内で元のファイル名を保持 +- PDFの内容は変更せず、ファイルはそのままパッケージ化 +- アップロードした各PDFのファイル名とサイズを表示 + +## ユースケース + +- メールに添付するため、請求書や領収書をまとめる +- 引き継ぎのために、プロジェクトの成果物 (複数のPDFレポート) をまとめる +- フォームやテンプレートのコレクションを、1回でダウンロードできるようにする +- 一連の文書を1つの圧縮ファイルに保管する + +## ヒント + +- ZIPファイルには元のPDFのファイル名が使われます。同じ名前のファイルがある場合は、競合を避けるためアップロード前に名前を変更してください。 +- このツールはPDF自体を圧縮しません。ファイルサイズを減らしたい場合は、先にPDFの圧縮を通してから、このツールでまとめてください。 + +## 関連ツール + +- [PDFの結合](./merge-pdf) +- [PDFの分割](./split-pdf) +- [PDFの圧縮](./compress-pdf) diff --git a/docs/ja/tools/pdf-workflow.md b/docs/ja/tools/pdf-workflow.md new file mode 100644 index 00000000..0def9405 --- /dev/null +++ b/docs/ja/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDFワークフロービルダー +description: キャンバス上でノードを接続して、独自のPDF処理パイプラインを視覚的に構築します。結合、圧縮、透かし、エクスポートなどの操作をつなげられます。 +--- + +# PDFワークフロービルダー + +ワークフロービルダーを使うと、複数のPDF操作を1つの自動化パイプラインにつなげられます。ツールを1つずつ実行する代わりに、入力、処理、出力のノードを視覚的なグラフとしてつなぎ、ワンクリックですべてを実行します。ファイルがブラウザの外に出ることはありません。 + +## 使い方 + +画面は3つのパネルに分かれています。左の**ノードツールボックス**、中央の**キャンバス**、ノードを選択すると右に表示される**設定パネル**です。 + +1. **ノードを追加**するには、左のサイドバーでクリックするか、キャンバスに直接ドラッグします。ツールボックス上部の検索バーで名前による絞り込みができます。 +2. **ノードを接続**するには、出力ソケット (ノードの下側) から別のノードの入力ソケット (上側) へドラッグします。接続は上から下へ流れます。 +3. **設定する**には、ノードをクリックして右側の設定パネルを開きます。ノードの種類ごとに独自のオプション (ページ範囲、品質スライダー、パスワードなど) があります。 +4. **ワークフローを実行**するには、ツールバーの**実行**ボタンをクリックします。エンジンはノードをトポロジカル順に実行し、1つずつ処理します。下部のステータスバーで進行状況を確認できます。 +5. **結果をダウンロード**するには、最後のダウンロードノードが最終的なPDF (複数ファイルが生成された場合はZIP) を保存します。 + +## ノードのカテゴリ + +ノードは6つのカテゴリに整理されており、キャンバス上で色分けされています。 + +- **入力** (青): PDF入力、画像入力、Word/Excel/PowerPointからPDF、およびパイプラインにファイルを渡す15種類以上のその他の形式コンバーター。 +- **編集と注釈** (インディゴ): トリミング、グレースケール、色の反転、透かし、ページ番号、ヘッダーとフッター、スキャナー効果、色の調整、背景色、空白ページの削除、注釈の削除。 +- **整理と管理** (紫): 結合、分割、ページの抽出、回転、ページの削除、反転、空白ページの追加、ページの分割、N-Up、ページサイズの固定、単一ページに結合、ブックレット、ポスター化、メタデータの編集、目次、OCR。 +- **最適化と修復** (琥珀): 圧縮、ラスタライズ、リニアライズ、傾き補正、PDFからPDF/A、フォントのアウトライン化、修復。 +- **PDFの保護** (ローズ): 暗号化、復号、サニタイズ、平坦化、電子署名、墨消し。 +- **出力** (ティール): ダウンロード (単一のPDFかZIPかを自動判別)、PDFから画像、PDFからテキスト、PDFからDOCX、PDFからXLSX、PDFからCSV、PDFからSVG、PDFからMarkdown、画像の抽出。 + +## ワークフローの保存と読み込み + +ツールバーには4つの保存オプションがあります。 + +- **保存**: 現在のワークフローを、名前付きテンプレートとしてブラウザのローカルストレージに保存します。複数のテンプレートを保存できます。 +- **読み込み**: 保存済みのテンプレートをすべて一覧表示するモーダルを開きます。読み込みをクリックして復元するか、不要になったテンプレートを削除できます。 +- **エクスポート**: ワークフローを`.json`ファイルとしてダウンロードし、共有やバックアップに使えます。 +- **インポート**: ディスクから`.json`のワークフローファイルを読み込み、すべてのノード、位置、接続を復元します。 + +テンプレートはローカルストレージにセッションをまたいで保持されます。エクスポートしたJSONファイルは、ブラウザやマシンの間で持ち運べます。 + +## 実行モデル + +エンジンは接続から依存関係グラフを作成し、ノードをトポロジカル順に実行します。いずれかのノードが失敗すると実行は停止し、失敗したノードが赤く表示されます。次のルールに注意してください。 + +- すべてのワークフローには、少なくとも1つの**入力**ノードと1つの**出力**ノードが必要です。 +- エンジンは循環依存を検出し、エラーを出して実行をブロックします。 +- **暗号化**ノードは、出力ノードの直前の最後の処理ステップにする必要があります。それより前に置くと、下流のノードは暗号化されたデータを扱えないため、検証の警告が出ます。 +- パスワード保護されたPDFは、実行中にパスワードの入力を求められます。 +- 複数のPDF入力に対応しています。結合ノードでまとめることも、一括処理ノードで各PDFを個別に処理することもできます。 + +## ソケットの種類 + +接続には型付きのソケットが使われ、無効な配線を防ぎます。 + +- **PDF** (インディゴ): 1つのPDF文書。 +- **MultiPDF** (琥珀): まとめられた複数のPDF文書。 +- **画像** (緑): 画像のBlob。 + +## オプション + +各ノードには、右側の設定パネルから行える独自の設定があります。よくあるパターンは次のとおりです。 + +- 分割、ページの抽出、ページの削除ノードの**ページ範囲** +- 画像変換の出力ノードの**品質スライダー** +- 暗号化と復号ノードの**パスワード欄** +- 透かし、ヘッダーとフッター、メタデータの編集の**テキスト入力** +- 回転ノードの**回転角度** +- 圧縮ノードの**圧縮レベル** +- OCRノードの**OCR言語の選択** + +## ユースケース + +- **請求書処理パイプライン**: PDF入力 -> OCR -> 表の抽出 -> CSVとしてダウンロード。 +- **レポートの標準化**: WordからPDF -> ページサイズの固定 -> ページ番号の追加 -> 透かし -> 圧縮 -> ダウンロード。 +- **保管の準備**: PDF入力 -> 修復 -> 平坦化 -> サニタイズ -> PDFからPDF/A -> ダウンロード。 +- **画像の一括抽出**: PDF入力 (複数ファイル) -> 画像の抽出 -> ZIPをダウンロード。 +- **印刷用ブックレット**: PDF入力 -> ブックレット -> トリミング -> 圧縮 -> ダウンロード。 +- **安全な配布**: PDF入力 -> 墨消し -> 注釈の削除 -> 暗号化 -> ダウンロード。 + +## ヒント + +- **Delete**または**Backspace**を使うと、選択したノードをキャンバスから削除できます。 +- ノードのステータスバーにある**X**ボタンをクリックすると、そのノードを直接削除できます。 +- 何もない場所をクリックしてドラッグすると、キャンバスを移動できます。移動中はカーソルがつかむアイコンに変わります。 +- モバイルでは、ツールバーの+ボタンでノードツールボックスを切り替えます。 +- ワークフローが複数の出力ファイルを生成する場合、ダウンロードノードが自動的にZIPにまとめます。 +- まずはシンプルに、2ノードのパイプラインを作ってテストしてから、複雑にしていきましょう。 + +## 関連ツール + +- [PDFからテキスト](./pdf-to-text) +- [PDFからExcel](./pdf-to-excel) +- [画像の抽出](./extract-images) +- [PDFからマークダウン](./pdf-to-markdown) diff --git a/docs/ja/tools/png-to-pdf.md b/docs/ja/tools/png-to-pdf.md new file mode 100644 index 00000000..f518a6ee --- /dev/null +++ b/docs/ja/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNGからPDF +description: 1つ以上のPNG画像を、品質を調整できるPDF文書に、すべてブラウザ上で変換します。 +--- + +# PNGからPDF + +PNG画像を、フル解像度を保ったままPDFに変換します。各PNGは、元の画像サイズに合わせた1ページになります。透明部分は自動的に処理されます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :----------- | :----- | +| PNG | `.png` | + +## 使い方 + +1. アップロード領域をクリックするか、PNGファイルをドラッグ&ドロップします。複数を同時に選択できます。 +2. ファイルリストを管理します。不要なファイルを削除したり、追加したりできます。 +3. ドロップダウンから**PDF品質**のレベルを選びます。 +4. **PDFに変換**をクリックします。出力は`from_jpgs.pdf`としてダウンロードされます。 + +このツールはpdf-libを使って各画像を直接埋め込みます。PNGをネイティブに埋め込めない場合 (たとえば特殊なカラープロファイルのため) は、キャンバス経由でJPEGとして再レンダリングするフォールバックが働きます。 + +## オプション + +**PDF品質**は、埋め込み前に適用される圧縮を制御します。 + +- **高品質**: 圧縮を最小限にし、ファイルサイズは最大になります。 +- **中品質** (デフォルト): サイズと鮮明さのバランスがよい設定です。 +- **低品質**: 圧縮を最大にし、出力は最小になります。 + +## ユースケース + +- スクリーンショットを、バグレポートやドキュメント用の複数ページPDFに変換する +- UIデザインのエクスポートを、レビュー用に1つのファイルにまとめる +- 図のエクスポート (draw.io、Excalidraw) を、共有できるPDFにする +- 一連のグラフ画像を、レポートとしてまとめる + +## ヒント + +- 透明部分を含むPNGは、PDFでは白い背景になります。別の背景が必要な場合は、事前に画像を編集してください。 +- 輪郭やテキストがくっきりしたスクリーンショットや図では、高品質を選ぶとJPEG圧縮のノイズを避けられます。中品質や低品質では、内部的にJPEGへ変換されることがあります。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [JPGからPDF](./jpg-to-pdf) +- [SVGからPDF](./svg-to-pdf) diff --git a/docs/ja/tools/posterize-pdf.md b/docs/ja/tools/posterize-pdf.md new file mode 100644 index 00000000..66c45291 --- /dev/null +++ b/docs/ja/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDFのポスタライズ +description: PDFのページを小さなページのグリッドに分割し、複数枚の用紙にまたがる大判印刷に対応します。 +--- + +# PDFのポスタライズ + +PDFの各ページを、小さなサブページのグリッドに分割します。1ページを複数枚の用紙に印刷し、それらをつなぎ合わせて大きなポスターやバナーを作るためのツールです。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. **行**と**列**の数を設定してグリッドを決めます(例:2行 x 2列なら各ページが4つのサブページに分割されます)。 +3. 必要に応じて、ポスタライズするページ範囲を指定します。 +4. プレビューキャンバスには現在のページにグリッドが重ねて表示されるため、切り取り位置を確認できます。 +5. ページを切り替えて、他のページのオーバーレイも確認します。 +6. 処理ボタンをクリックします。グリッドの各セルが、出力PDFの1ページになります。 + +## 機能 + +- 行数と列数を自由に設定でき、柔軟なグリッドサイズに対応 +- ページが分割される位置を正確に示すグリッドオーバーレイ付きのライブプレビュー +- 特定のページだけをポスタライズするページ範囲フィルター +- プレビューでのページ単位の移動 +- ページのスナップショットをキャッシュし、プレビューの移動を高速化 +- 赤い破線のグリッド線で切り取りの境界を明確に表示 + +## オプション + +| オプション | 説明 | +| -------------- | -------------------------------------------- | +| **行** | 横方向の分割数(デフォルト:1) | +| **列** | 縦方向の分割数(デフォルト:1) | +| **ページ範囲** | ポスタライズするページ(空欄の場合はすべて) | + +## 活用例 + +- ポスターサイズのPDFを標準のA4またはレターサイズの用紙に印刷し、壁の上で組み立てる +- 1ページのPDFデザインから大きなバナーを作る +- 大きすぎる技術図面を印刷可能なタイルに分割する +- 大判プリンターがなくても大判印刷を行う + +## ヒント + +- 2x2のグリッドは1ページを4ページに、3x3のグリッドは1ページを9ページにします。組み立てた後の大きさに合わせてグリッドを計画してください。 +- プレビューのオーバーレイで、重要な内容が切り取り線にかからないか確認できます。必要に応じて行や列を調整してください。 +- 逆の操作(複数のページを1枚にまとめる)には、[N-Up PDF](./n-up-pdf)を使用します。 + +## 関連ツール + +- [N-Up PDF](./n-up-pdf) +- [ページの分割](./divide-pages) +- [PDFの分割](./split-pdf) diff --git a/docs/ja/tools/powerpoint-to-pdf.md b/docs/ja/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..f2229bd9 --- /dev/null +++ b/docs/ja/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPointからPDF +description: PowerPointプレゼンテーション(PPT、PPTX)とODPファイルを、スライドの書式を保ったままPDFに変換します。 +--- + +# PowerPointからPDF + +プレゼンテーションファイルをPDFに変換します。各スライドが出力ドキュメントの1ページになり、テキスト、画像、図形、トランジションがブラウザ上のLibreOfficeエンジンで描画されます。新しい形式と古い形式のPowerPoint、さらにOpenDocument Presentation形式に対応しています。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :------------------------ | :------ | +| PowerPoint(新形式) | `.pptx` | +| PowerPoint(旧形式) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## 使い方 + +1. アップロード領域をクリックするか、プレゼンテーションファイルをドラッグアンドドロップします。 +2. ファイル一覧を確認します。必要に応じてファイルを追加または削除します。 +3. **PDFに変換**をクリックします。LibreOfficeエンジンは初回使用時に読み込まれ、その後各ファイルが変換されます。 +4. ファイルが1つの場合はPDFとして直接ダウンロードされます。複数の場合は`powerpoint-converted.zip`にまとめられます。 + +## オプション + +このツールに追加の設定はありません。スライドは元のサイズで描画されます。 + +## 出力 + +| 入力数 | 出力 | +| :------------ | :-------------------------------------------------------------------------- | +| 1ファイル | PDFを1つダウンロード(元のファイル名に`.pdf`拡張子) | +| 2ファイル以上 | ZIPアーカイブ(`powerpoint-converted.zip`)に、ファイルごとに1つのPDFを格納 | + +## 活用例 + +- PowerPointを持っていない相手に共有する前に、プレゼンテーションをPDFに変換する +- 会議やワークショップ向けに、スライドの印刷用配布資料を作成する +- どの端末でも同じように表示される形式でプレゼンテーションを保管する +- LibreOffice ImpressのODPプレゼンテーションをまとめてPDFに変換する +- メールに添付するために、ピッチデッキのPDF版を作成する + +## ヒント + +- スライドのアニメーションやトランジションはPDFには反映されません。各スライドは静止したページとして取り込まれます。 +- 埋め込まれた動画は出力に表示されません。必要に応じて、スクリーンショットやプレースホルダー画像に置き換えてください。 +- スピーカーノートは、デフォルトのPDF出力には含まれません。ノートが必要な場合は、先にPowerPoint標準の「ノートの印刷」ビューから書き出すことを検討してください。 +- LibreOfficeエンジンは初回の読み込み後にキャッシュされるため、同じセッションで2つ目のプレゼンテーションを変換するときははるかに高速です。 + +## 関連ツール + +- [WordからPDF](./word-to-pdf) +- [ExcelからPDF](./excel-to-pdf) +- [画像からPDF](./image-to-pdf) diff --git a/docs/ja/tools/prepare-pdf-for-ai.md b/docs/ja/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..6ebd7110 --- /dev/null +++ b/docs/ja/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: AI用のPDFを準備する +description: PDFの内容を、LLMやLlamaIndexなどのAIパイプラインに最適化された構造化JSONとして抽出します。一括処理に対応しています。 +--- + +# AI用のPDFを準備する + +PDFファイルから内容を抽出し、大規模言語モデル(LLM)やLlamaIndexなどのAIフレームワークに取り込みやすいJSONとして構造化します。各ページの内容が抽出され、RAGパイプライン、チャットボット、セマンティック検索システムにそのまま使える形式に整理されます。 + +## 使い方 + +1. ドロップゾーンをクリックするかファイルをドラッグして、1つ以上のPDFをアップロードします。 +2. **抽出**をクリックして処理を開始します。 +3. ファイルが1つの場合は`filename_llm.json`としてダウンロードされます。複数の場合は`pdf-for-ai.zip`アーカイブになります。 + +このツールはPyMuPDFのLlamaIndex連携を使用して、ページ単位の内容をメタデータ付きで抽出し、AIフレームワークに直接読み込める出力を生成します。 + +## オプション + +このツールに設定可能なオプションはありません。すべてのページがテキスト全体とメタデータとともに抽出されます。 + +## 出力形式 + +- **1ファイル**:`filename_llm.json` +- **複数ファイル**:入力PDFごとに1つの`_llm.json`を含む`pdf-for-ai.zip`。 + +JSON出力はLlamaIndexのドキュメントスキーマに従い、ページごとのテキスト内容とメタデータフィールドを持ちます。 + +## 活用例 + +- 検索拡張生成(RAG)パイプライン向けにPDFドキュメントを準備する。 +- AIチャットボット向けに、PDFアーカイブから検索可能なナレッジベースを構築する。 +- PDFレポートをLLMベースの分析ワークフローに取り込む。 +- セマンティック検索や質問応答システム向けに、研究論文を前処理する。 +- PDFドキュメントのコレクションから構造化された学習データを作成する。 + +## ヒント + +- AI向けの整形をしないプレーンテキストの抽出には、[PDFからテキスト](./pdf-to-text)を使用します。 +- 見出しや構造を保ったMarkdown出力には、[PDFからMarkdown](./pdf-to-markdown)を使用します。 +- スキャンされたPDFでは、出力が空になるか、ごくわずかになります。抽出の前にOCRを実行して、テキストレイヤーを追加してください。 + +## 関連ツール + +- [PDFからテキスト](./pdf-to-text) +- [PDFからMarkdown](./pdf-to-markdown) +- [PDFからJSON](./pdf-to-json) diff --git a/docs/ja/tools/protect-pdf.md b/docs/ja/tools/protect-pdf.md new file mode 100644 index 00000000..fe06b279 --- /dev/null +++ b/docs/ja/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: PDFの保護 +description: 256ビットAES暗号化でPDFファイルをパスワード保護します。ユーザーパスワードと所有者パスワードを設定し、利用制限を構成できます。 +--- + +# PDFの保護 + +PDFをパスワードでロックし、許可された人だけが開けるようにします。BentoPDFは、銀行や政府機関でも使われている標準と同じ256ビットAES暗号化を、QPDFを通じてすべてブラウザ上で適用します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. **ユーザーパスワード**を入力します(必須)。ファイルを開くために必要なパスワードです。 +3. 必要に応じて**所有者パスワード**を入力します。設定すると、印刷、編集、コピー、注釈の追加を禁止する利用制限がPDFに適用されます。 +4. **PDFを暗号化**をクリックします。 +5. 暗号化されたファイルをダウンロードします。 + +## パスワードの種類 + +### ユーザーパスワード(必須) + +ユーザーパスワードは、受信者がPDFを開くときに入力するものです。これがなければ、ドキュメントにはまったくアクセスできません。暗号化されたPDFには必ず1つ設定します。 + +### 所有者パスワード(任意) + +所有者パスワードは、許可されたユーザーがファイルを開いた後にできることを制御します。ユーザーパスワードと異なる所有者パスワードを設定すると、BentoPDFは最も厳しい制限を自動的に適用します。 + +- 変更を無効化 +- 抽出とコピーを無効化 +- 印刷を無効化 +- 注釈を無効化 +- フォーム入力を無効化 +- ドキュメントの組み立てを無効化 + +所有者パスワードを空欄にした場合、PDFは暗号化されます(開くにはユーザーパスワードが必要です)が、開いた後の利用制限はありません。 + +## 暗号化の詳細 + +- **アルゴリズム**:AES-256(256ビット Advanced Encryption Standard) +- **鍵長**:256ビット +- **規格**:PDF 2.0暗号化(QPDF実装) + +AES-256は、現在の技術ではブルートフォースで破ることが計算上不可能です。暗号化したPDFの安全性は、パスワードの強度にかかっています。 + +## 活用例 + +- 機密性の高い財務レポートをメールで送る前に保護する +- 相手方の弁護士と共有する法的文書を保護する +- 医療記録や個人を特定できる情報にパスワードを設定する +- 有料コンテンツ(電子書籍やレポート)をアクセス制御付きで配布する +- 保存時の暗号化を求めるデータ保護ポリシーに準拠する + +## ヒント + +- 強力で一意なパスワードを使用してください。大文字小文字、数字、記号を混ぜた12文字以上のパスフレーズが理想的です。 +- パスワードは、PDFと同じメールではなく、電話やテキストメッセージなど別の経路で共有してください。 +- 開くときのパスワードは不要で、操作(印刷不可、コピー不可など)だけを制限したい場合は、代わりに権限の変更ツールを使用してください。 + +## 関連ツール + +- [PDFの復号化](./unlock-pdf):パスワードがわかっている場合に暗号化を解除 +- [権限の変更](./change-permissions):特定の利用制限を変更 +- [制限の解除](./remove-restrictions):PDFからすべてのセキュリティを削除 +- [PDFのサニタイズ](./sanitize-pdf):暗号化する前に隠れたコンテンツを削除 diff --git a/docs/ja/tools/psd-to-pdf.md b/docs/ja/tools/psd-to-pdf.md new file mode 100644 index 00000000..f27138da --- /dev/null +++ b/docs/ja/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSDからPDF +description: Photoshop(PSD)ファイルをブラウザ上でPDFに変換します。無料でプライバシーも安心、Adobeソフトウェアは不要です。 +--- + +# PSDからPDF + +Adobe PhotoshopのPSDファイルをPDFドキュメントに変換します。PSDはPhotoshopのネイティブ形式で、通常は高価なAdobeソフトウェアがないと開けません。このツールは、PSDファイルの統合済みの合成画像を、フル解像度のPDFページとして描画します。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :-------------- | :----- | :----------------------------- | +| Adobe Photoshop | `.psd` | 統合済みの合成画像を描画します | + +## 使い方 + +1. アップロード領域をクリックするか、PSDファイルをドラッグアンドドロップします。複数のファイルに対応しています。 +2. ファイル一覧を確認します。不要なファイルはゴミ箱アイコンで削除するか、**ファイルを追加**でさらに追加します。 +3. **PDFに変換**をクリックします。PyMuPDFエンジンがPSDファイルを読み込み、合成画像を元の解像度でPDFのページに埋め込みます。 +4. PSDが1つの場合はPDFが1つ生成されます。複数のPSDファイルをアップロードした場合は、`psd_to_pdf.pdf`という名前の1つの複数ページPDFにまとめられ、各PSDが1ページになります。 + +## オプション + +設定は不要です。コンバーターはPSDファイルの統合済み画像データを使用します。 + +## 活用例 + +- Photoshopを開かずにデザインをプレビューする +- Adobe Creative Suiteを持っていないクライアントにデザインの校正を送る +- PSDファイルの高解像度アートワークを印刷する +- 複数のPSDデザインファイルからPDFポートフォリオを作成する(それぞれが1つのドキュメント内の1ページになります) + +## ヒント + +- 変換では、PSDの合成(統合済み)ビューが描画されます。個々のレイヤー、調整レイヤー、レイヤー効果は、PDFの中で別々の要素としては保持されません。 +- 複数のPSDファイルは、個別のPDFではなく1つの複数ページPDFに結合されます。ポートフォリオやルックブックの作成に便利です。 +- 解像度が非常に高いPSDファイル(300 DPI以上の印刷用ファイル)は、大きなPDFになります。このツールはフル解像度を保持します。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [PNGからPDF](./png-to-pdf) +- [VSDからPDF](./vsd-to-pdf) diff --git a/docs/ja/tools/pub-to-pdf.md b/docs/ja/tools/pub-to-pdf.md new file mode 100644 index 00000000..5890e808 --- /dev/null +++ b/docs/ja/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUBからPDF +description: Microsoft Publisher(PUB)ファイルをブラウザ上でPDFに変換します。無料でプライバシーも安心、ソフトウェアは不要です。 +--- + +# PUBからPDF + +Microsoft PublisherファイルをPDFに変換します。PublisherはMicrosoft Officeの一部のエディションに含まれるデスクトップパブリッシングツールですが、インストールしている人は多くありません。このツールを使えば、Microsoftのソフトウェアなしで、ブラウザ上で直接PUBファイルをPDFに変換できます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :------------------ | :----- | :----------------------------- | +| Microsoft Publisher | `.pub` | デスクトップパブリッシング文書 | + +## 使い方 + +1. アップロード領域をクリックするか、PUBファイルをドラッグアンドドロップします。複数のファイルを一度にアップロードできます。 +2. ファイル一覧を確認します。不要なファイルはゴミ箱アイコンで削除するか、**ファイルを追加**をクリックしてさらに追加します。 +3. **PDFに変換**をクリックします。LibreOfficeベースのエンジンがブラウザに読み込まれ、レイアウト、画像、テキストボックスを保ったまま各PUBファイルを変換します。 +4. ファイルが1つの場合はPDFとして直接ダウンロードされます。複数の場合は、`pub-to-pdf.zip`という名前のZIPアーカイブで届きます。 + +## オプション + +追加の設定は不要です。コンバーターがPUBのレイアウトエンジンを自動的に処理します。 + +## 活用例 + +- Microsoft Publisherを購入せずに、クライアントから受け取ったPUBのチラシやニュースレターを開く +- Publisherで作成した教会の会報、イベントプログラム、学校のニュースレターを変換する +- Publisherのマーケティング資料を、誰でも開ける形式で保管する +- Publisherがインストールされていないシステムで、PUBファイルを印刷する + +## ヒント + +- テキストボックスが重なり、位置が細かく指定された複雑なPublisherレイアウトは、変換時に少しずれることがあります。正確な位置が重要な場合は、出力を確認してください。 +- LibreOfficeエンジンはセッションごとに1回初期化されます。最初の変換には時間がかかり、2回目以降は高速です。 +- Publisherファイルを最も忠実に変換するには、元のファイルで使用しているカスタムフォントが標準のシステムフォントであることを確認してください。 + +## 関連ツール + +- [VSDからPDF](./vsd-to-pdf) +- [ODPからPDF](./odp-to-pdf) diff --git a/docs/ja/tools/rasterize-pdf.md b/docs/ja/tools/rasterize-pdf.md new file mode 100644 index 00000000..878dcea0 --- /dev/null +++ b/docs/ja/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDFの画像化 +description: PDFのページを画像ベースのPDFに変換します。すべてのレイヤーを統合し、選択可能なテキストを削除し、DPIと画像形式を指定できます。 +--- + +# PDFの画像化 + +ラスタライズは、PDFの各ページを画像に変換し、それらの画像をPDFに組み直す処理です。見た目は元のPDFと同じですが、選択可能なテキスト、インタラクティブな要素、編集可能なレイヤーは含まれません。いわば高品質なコピーです。 + +## 使い方 + +1. 1つ以上のPDFファイルをアップロードします。 +2. ラスタライズ出力の**DPI**(解像度)を設定します。 +3. **画像形式**を選択します。可逆圧縮の高品質ならPNG、ファイルを小さくするならJPEGです。 +4. 必要に応じて**グレースケールに変換**をオンにします。 +5. **PDFをラスタライズ**をクリックします。複数のファイルはZIPでダウンロードされます。 + +## オプション + +| 設定 | 値 | デフォルト | +| ------------------ | ----------------------------------- | ---------- | +| **DPI** | 72、150、200、300、600 | 150 | +| **画像形式** | PNG(可逆圧縮)、JPEG(より小さい) | PNG | +| **グレースケール** | オン/オフ | オフ | + +## DPIの目安 + +- **72**:画面での閲覧のみ。ファイルサイズが最小 +- **150**:一般的な用途に適したバランス +- **200**:テキストがより鮮明で、ファイルサイズは中程度 +- **300**:印刷品質の出力 +- **600**:高品質のアーカイブやプロ向けの印刷 + +## 活用例 + +- 機密文書を共有する前に、テキストの抽出を防ぐ +- テキストをピクセルに変換して、フォントの依存関係の問題をなくす +- ビューアーによって表示が異なる、複雑なレイヤーや透明効果を含むPDFの「フラット」版を作成する +- 画像ベースの入力しか受け付けないシステム向けにPDFを準備する +- PDFを画像だけにして、隠れたコンテンツ(変更履歴やフォームデータなど)を取り除く + +## ヒント + +- PNGで150 DPIは、安心できるデフォルトです。印刷出力が必要な場合や細部を拡大したい場合にのみ、それより高くしてください。 +- JPEGはファイルがかなり小さくなりますが、鮮明なテキストの縁に圧縮ノイズが出ます。 +- ラスタライズは元に戻せません。後で編集可能なテキストが必要になる可能性がある場合は、元のPDFを保管してください。 + +## 関連ツール + +- [PDFの圧縮](./compress-pdf):ラスタライズしたPDFのファイルサイズを削減 +- [PDFの傾き補正](./deskew-pdf):スキャンした文書をラスタライズする前にページをまっすぐに補正 +- [フォントのアウトライン化](./font-to-outline):拡大縮小性を保ちたい場合に、フォントをベクターパスに変換 +- [PDFのフラット化](./flatten-pdf):画像に変換せずにフォームをフラット化 diff --git a/docs/ja/tools/remove-annotations.md b/docs/ja/tools/remove-annotations.md new file mode 100644 index 00000000..543e2649 --- /dev/null +++ b/docs/ja/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: 注釈の削除 +description: コメント、ハイライト、リンクなどのすべての注釈を、ワンクリックでPDFから取り除きます。 +--- + +# 注釈の削除 + +コメント、ハイライト、付箋、テキストマークアップ、リンク、スタンプなど、ドキュメントに埋め込まれたすべての注釈オブジェクトを削除して、PDFをきれいにします。ページの本来の内容(テキスト、画像、グラフィック)はそのまま残ります。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. ツールがドキュメントのページ数を検出し、ファイル情報を表示します。 +3. **注釈を削除**をクリックして処理します。 +4. すべての注釈が取り除かれたPDFが自動的にダウンロードされます。 + +## 機能 + +- すべての種類の注釈を削除:コメント、ハイライト、下線、取り消し線、付箋、スタンプ、リンク、フォームマークアップ +- ドキュメントのすべてのページが対象 +- 注釈以外の内容(テキスト、画像、ベクターグラフィック、フォームフィールド)はすべて保持 +- 処理前にページ数とファイルサイズを表示 + +## 活用例 + +- 複数のレビュアーがコメントを付けたレビューの後、最終配布の前にドキュメントを整理する +- 共有している学習ガイドから、ハイライトと付箋を削除する +- アーカイブの前に、ドキュメントからリンク注釈を取り除く +- 交渉中に大量の注釈が付いた法的文書の「クリーン」版を用意する +- 印刷に送る前に、原稿からレビュアーのコメントを削除する + +## ヒント + +- このツールはPDFの構造レベルで注釈を削除するため、結果は選択可能なテキストと元の品質を保ちます。ラスタライズは行われません。 +- すべてではなく特定の注釈だけを削除したい場合は、[PDFエディター](./edit-pdf)を使って個々の注釈を選んで削除してください。 +- フラット化されたPDF(注釈がページの内容に統合されたもの)の注釈は、もう独立したオブジェクトではないため削除できません。 + +## 関連ツール + +- [PDFエディター](./edit-pdf) +- [透かしの追加](./add-watermark) +- [PDFへ署名](./sign-pdf) diff --git a/docs/ja/tools/remove-blank-pages.md b/docs/ja/tools/remove-blank-pages.md new file mode 100644 index 00000000..49e77507 --- /dev/null +++ b/docs/ja/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: 空白ページの削除 +description: PDFから空白またはほぼ空白のページを、調整可能な感度で自動的に検出して削除します。 +--- + +# 空白ページの削除 + +PDFをスキャンして、空白またはほぼ空白のページを自動的に削除します。このツールは各ページを描画してピクセルの内容を分析し、空白かどうかを判定した上で、処理の前にどのページを削除するか確認できます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. **感度**スライダーを調整して、「空白」の判定の厳しさを決めます。 +3. **空白ページを検出**をクリックして、ドキュメントをスキャンします。 +4. 検出された空白ページのサムネイルが表示されるので、確認します。 +5. 選択を確定して、空白ページを削除したPDFをダウンロードします。 + +## オプション + +- **感度**:0%から100%までのスライダー(デフォルトは80%)。値が高いほど厳しくなり、完全にまたはほぼ白いページだけを対象にします。値が低いほど寛容になり、1つの点やかすかな透かしのような、わずかな内容を含むページも検出します。 + +## 機能 + +- ページごとのピクセルレベル分析で空白の内容を検出 +- 検出を細かく調整できる感度スライダー +- 検出された空白ページを目視で確認できるページサムネイルのプレビュー +- 空白でないページはそのまま保持 +- どんなサイズやページ数のドキュメントにも対応 +- スキャン中の進捗表示 + +## 活用例 + +- 片面の原稿をスキャンしたときに取り込まれた、空の裏面を取り除く +- 一括スキャンした文書の束から、区切りのページを削除する +- 文書管理システムが挿入した空白ページを取り除く +- ワープロから書き出したPDFに含まれることがある、末尾の空白ページを取り除く +- 不要な空ページを削除して、ファイルサイズを小さくする + +## ヒント + +- まずデフォルトの感度80%で試し、そこから調整してください。空白に見えるページを見逃す場合は感度を下げ、残したい薄い内容のページが検出される場合は感度を上げます。 +- このツールは内容を分析するために各ページを描画するため、処理時間はページ数に比例します。非常に大きなドキュメントでは、少し待つことになります。 +- 削除を確定する前に、サムネイルのプレビューで検出された空白ページを確認してください。かすかなヘッダー、フッター、透かしのあるページは、感度の設定によっては検出されることがあります。 + +## 関連ツール + +- [PDFのトリミング](./crop-pdf) +- [PDFエディター](./edit-pdf) +- [ページ番号](./page-numbers) diff --git a/docs/ja/tools/remove-metadata.md b/docs/ja/tools/remove-metadata.md new file mode 100644 index 00000000..91d8a127 --- /dev/null +++ b/docs/ja/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: メタデータの削除 +description: 作成者、タイトル、作成日、作成ソフト、XMPデータ、ドキュメントIDなど、PDFファイルに含まれる隠れたメタデータをすべて取り除きます。 +--- + +# メタデータの削除 + +すべてのPDFには、誰が作成したか、どのソフトウェアを使ったか、最後にいつ変更されたかなどを明らかにするメタデータが含まれています。このツールは、情報辞書、XMPメタデータストリーム、ドキュメントID、アプリケーション固有のデータをすべて取り除き、作成元の痕跡がないクリーンなドキュメントにします。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. **メタデータを削除**をクリックします。 +3. クリーンになったファイルをダウンロードします。 + +設定するオプションはありません。このツールはすべてを消去する、徹底した設計になっています。 + +## 削除されるもの + +- **情報辞書のフィールド**:タイトル、作成者、サブジェクト、キーワード、作成アプリケーション、PDF変換ソフト、作成日、更新日 +- **XMPメタデータストリーム**:ドキュメントカタログに保存されているXMLベースのメタデータブロック +- **ドキュメントID**:PDFトレーラー内の一意の識別子で、システムをまたいでドキュメントを追跡するのに使われることがあります +- **PieceInfo**:IllustratorやInDesignなどのプログラムが追加するアプリケーション固有のメタデータ + +## 残るもの + +- 表示されるすべてのページ内容(テキスト、画像、グラフィック) +- フォームフィールドと注釈 +- しおりとリンク +- ドキュメントの構造そのもの + +## 活用例 + +- 匿名で公開する前に、ドキュメントから自分の名前と組織名を削除する +- ドキュメントがいつ準備されたかを示す作成タイムスタンプを取り除く +- 使用しているPDFソフトウェアの構成がわかるプロデューサー文字列を消去する +- メタデータのないPDFを求める規制当局への提出書類を準備する +- 外部に共有する前に、編集履歴の痕跡を削除する + +## ヒント + +- 取り除く前に、まずメタデータの表示ツールで、PDFにどんなメタデータが含まれているかを正確に確認してください。 +- メタデータに加えて、JavaScript、注釈、埋め込みファイルも削除する必要がある場合は、より徹底的なクリーニングができるPDFをサニタイズを使用してください。 +- メタデータの削除は元に戻せません。後でそのデータが必要になる可能性がある場合は、元のファイルを保管してください。 + +## 関連ツール + +- [PDFをサニタイズ](./sanitize-pdf):メタデータに加えて、スクリプトや添付ファイルなどを削除 +- [PDFの暗号化](./protect-pdf):クリーンになったPDFをパスワードで保護 +- [PDFの圧縮](./compress-pdf):メタデータの削除でファイルサイズがわずかに小さくなります。さらに小さくするには圧縮してください diff --git a/docs/ja/tools/remove-restrictions.md b/docs/ja/tools/remove-restrictions.md new file mode 100644 index 00000000..d36ec50b --- /dev/null +++ b/docs/ja/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: 制限の解除 +description: PDFファイルから、パスワード保護、印刷制限、編集ロック、コピー制限を取り除きます。 +--- + +# 制限の解除 + +PDFには2種類のパスワードを設定できます。ユーザーパスワード(ファイルを開くために必要)と、所有者パスワード(ファイルに対してできることを制御)です。このツールは、その両方に加えて、印刷、編集、コピー、注釈のロックといった関連するすべての制限を取り除きます。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. PDFに所有者パスワードが設定されている場合は、**所有者パスワード**欄に入力します。パスワードがなく利用制限だけがある場合は、空欄のままにします。 +3. **制限を解除**をクリックします。 +4. 制限のないPDFをダウンロードします。 + +このツールはQPDFの`--decrypt`フラグと`--remove-restrictions`フラグを使用して、クリーンで制限のないコピーを生成します。 + +## 削除されるもの + +- パスワード保護(ユーザーパスワードと所有者パスワードの両方) +- 印刷の制限 +- 編集の制限 +- テキストと画像のコピー制限 +- 注釈とコメントの制限 +- PDFに設定されているその他すべてのセキュリティ制限 + +## 活用例 + +- 自分のPDFだが、何年も前に設定したパスワードのロックを解除する +- 正当にアクセスできるドキュメントから、印刷制限を取り除く +- メモを取るために、参考資料でコピーアンドペーストを有効にする +- 制限付きのドキュメントを扱えないアクセシビリティツール向けにPDFを準備する + +## ヒント + +- 所有者パスワードが設定されている場合は、それを知っている必要があります。このツールはパスワードの解読やブルートフォースは行いません。 +- ファイルを暗号化したまま特定の権限だけを変更したい場合は、代わりに権限の変更ツールを使用してください。 +- 出力ファイルは暗号化されていません。受け取った人は誰でも自由に開けます。 + +## 関連ツール + +- [PDFの復号化](./unlock-pdf):ユーザーパスワードがわかっている場合にPDFのロックを解除 +- [PDFの暗号化](./protect-pdf):新しい設定で暗号化を再適用 +- [権限の変更](./change-permissions):許可する操作を個別に変更 diff --git a/docs/ja/tools/repair-pdf.md b/docs/ja/tools/repair-pdf.md new file mode 100644 index 00000000..c1f24996 --- /dev/null +++ b/docs/ja/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: PDFの修復 +description: QPDFの修復エンジンを使って、破損または損傷したPDFファイルからデータを復元します。一括処理に対応しています。 +--- + +# PDFの修復 + +PDFが開かない、内容が文字化けする、ビューアーでエラーが出るといったときに、このツールが内部構造の再構築を試みます。QPDFの修復エンジンを使用しており、壊れた相互参照テーブル、途切れたストリーム、無効なオブジェクト参照など、さまざまな種類の破損からデータを復元できます。 + +## 使い方 + +1. 損傷した1つ以上のPDFファイルをアップロードします。 +2. **PDFを修復**をクリックします。 +3. ファイルが1つの場合は、修復されたファイルが直接ダウンロードされます。複数の場合はZIPアーカイブになります。 + +このツールは、各ファイルを`--decrypt`フラグ付きでQPDFに通します。これにより、QPDFはPDF構造全体を読み込んで書き直し、その過程で修復可能な問題を修正します。 + +## 機能 + +- 複数のPDFを1回の操作でまとめて修復 +- 復元可能なファイルと不可能なファイルを自動判別 +- 複数のファイルを処理するとき、ファイルごとに成功/失敗を報告 +- 実績のあるPDF変換ライブラリであるQPDF(WebAssembly)を使用 + +## 修復できるもの + +- 壊れた、または欠けている相互参照テーブル +- ダウンロードが中断されたことによるファイル末尾の欠落 +- 無効なオブジェクト番号とストリーム長 +- 不具合のあるPDFジェネレーターによる軽微な構造の不整合 +- 復号化に失敗したことで生じた暗号化の残骸 + +## 修復できないもの + +- 内容データのほとんどが失われた、大きく途切れたファイル +- 持っていないパスワードで暗号化されたPDF +- 実際にはPDFではないファイル(拡張子が間違っている) +- PDF内の画像の破損(構造は修復されますが、ピクセルデータは再生成されません) + +## 活用例 + +- メールのダウンロードに失敗したPDFを復元する +- 古い、または標準に沿わないPDFジェネレーターで作成されたファイルを開く +- あるビューアーでは開けるが、別のビューアーでは開けないPDFを修正する +- 損傷したアーカイブ文書を長期保存用に準備する + +## ヒント + +- 修復に失敗した場合は、まずブラウザでファイルを開いてみてください。ブラウザには独自の復元ロジックがあり、再保存できる程度に内容を表示できることがあります。 +- 修復に失敗する暗号化されたPDFは、まずPDFの復号化を試し、その後で復号化した出力を修復してください。 + +## 関連ツール + +- [PDFの圧縮](./compress-pdf):修復したPDFの構造をさらに整理 +- [PDFの最適化](./linearize-pdf):修復したファイルをWeb配信用に最適化 +- [PDFのフラット化](./flatten-pdf):損傷した可能性のあるフォームをフラット化 diff --git a/docs/ja/tools/reverse-pages.md b/docs/ja/tools/reverse-pages.md new file mode 100644 index 00000000..2cf8394c --- /dev/null +++ b/docs/ja/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: ページの反転 +description: 1つ以上のPDFファイルのページ順を反転させ、最後のページを最初のページにします。 +--- + +# ページの反転 + +PDFのページ順を反転させ、最後のページを最初に、最後から2番目のページを2番目にというように並べ替えます。複数のファイルの一括処理に対応しています。 + +## 使い方 + +1. 1つ以上のPDFファイルをアップロードします。 +2. 処理ボタンをクリックします。 +3. 各ファイルは個別に反転されます。複数のファイルをアップロードした場合、出力は反転されたすべてのPDFを含むZIPアーカイブになります。 +4. ファイルが1つの場合は、反転されたPDFとして直接ダウンロードされます。 + +## 機能 + +- 一括処理:複数のPDFを1回の操作で反転 +- PDFが1つなら単一ファイルで出力、複数ならZIPで出力 +- 処理前にファイルごとの削除ボタンで取り除ける +- すべてのページ内容と書式を保持 + +## 活用例 + +- 逆順にスキャンされてしまったドキュメントを修正する +- プレゼンテーションPDFを後ろから前へ読めるように準備する +- ページを逆順で給紙する特定の印刷ワークフロー向けに、ページ順を反転する +- 誤って逆向きに組み立てられたドキュメントを修正する + +## ヒント + +- バッチ内の各ファイルは個別に反転されます。ファイル同士の順序が入れ替わるわけではありません。 +- 全体の反転だけでなく、より細かくページを並べ替えたい場合は、[複製と整理](./organize-pdf)を使用してください。 + +## 関連ツール + +- [複製と整理](./organize-pdf) +- [PDFの回転](./rotate-pdf) +- [PDFマルチツール](./pdf-multi-tool) diff --git a/docs/ja/tools/rotate-custom.md b/docs/ja/tools/rotate-custom.md new file mode 100644 index 00000000..bceff37f --- /dev/null +++ b/docs/ja/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: 任意の角度で回転 +description: ページごとの角度入力と一括回転のコントロールで、PDFのページを任意の角度で回転します。 +--- + +# 任意の角度で回転 + +PDFのページを、90度単位に限らず任意の角度で回転します。各ページに個別の角度入力欄があり、一括コントロールを使って、すべてのページに同じ角度を一度に適用することもできます。 + +## 使い方 + +1. PDFファイルをアップロードします。すべてのページのサムネイルが描画されます。 +2. 各ページには、現在の回転角度を示す数値入力欄があります。 +3. 特定のページを回転するには、任意の角度(正または負)を入力します。90度単位ですばやく調整するには、ページごとの左/右ボタンを使用します。 +4. 上部の**一括角度**入力欄で、すべてのページに共通の回転を設定します。 +5. 処理ボタンをクリックして、回転したPDFを生成します。 + +## 機能 + +- ページごとの自由な角度入力(任意の整数値) +- すべてのページに同じ回転を設定する一括角度コントロール +- サムネイルでの回転のリアルタイムプレビュー +- 90度単位のページごとのクイック回転ボタン +- 大きなドキュメントでも快適に動作する、サムネイルの遅延読み込み + +## 活用例 + +- 数度だけ傾いたスキャンを補正する +- 標準的でない向きの要件に合わせてページを回転する +- 内容が混在するドキュメントの個々のページに、正確な回転を適用する +- 最初に一括回転した後で、ページの角度を微調整する + +## ヒント + +- 正の値は時計回り、負の値は反時計回りに回転します。 +- 一括角度欄を適用すると、ページごとの角度がすべて上書きされます。個別の調整が必要な場合は、一括操作の後で行ってください。 +- 90/180/270度の標準的な回転をより簡単な画面で行うには、[PDFの回転](./rotate-pdf)を使用してください。 + +## 関連ツール + +- [PDFの回転](./rotate-pdf) +- [PDFマルチツール](./pdf-multi-tool) +- [複製と整理](./organize-pdf) diff --git a/docs/ja/tools/rotate-pdf.md b/docs/ja/tools/rotate-pdf.md new file mode 100644 index 00000000..02dfc4b0 --- /dev/null +++ b/docs/ja/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: PDFの回転 +description: サムネイルを使った視覚的な画面で、PDFの個別のページまたはすべてのページを90度単位で回転します。 +--- + +# PDFの回転 + +PDFのページを時計回りまたは反時計回りに90度回転します。すべてのページのサムネイルプレビューが表示され、個別に回転することも、ドキュメント全体を一括で回転することもできます。 + +## 使い方 + +1. PDFファイルをアップロードします。すべてのページのサムネイルがグリッドに表示されます。 +2. 各ページのサムネイルの下にある左/右の回転ボタンで、そのページを回転します。 +3. 上部の一括回転コントロールで、すべてのページを一度に回転します。 +4. サムネイルのプレビューがリアルタイムで更新され、回転の状態が表示されます。 +5. 処理ボタンをクリックして、回転したPDFを保存します。 + +## 機能 + +- 90度単位のページごとの回転(左または右) +- すべてのページを同時に回転する一括回転 +- アニメーション付きの回転トランジションを備えた、リアルタイムのサムネイルプレビュー +- 大きなドキュメントでも滑らかに動作する、サムネイルの遅延読み込み +- 元のページ内容と品質を保持 + +## 活用例 + +- 横向きや上下逆さまにスキャンされたページを修正する +- 横向きのページを縦向きに回転する(またはその逆) +- 一部のページが誤った角度でスキャンされた、向きが混在するドキュメントを修正する +- 特定の表示の向きに合わせてドキュメントを準備する + +## ヒント + +- 回転は累積されます。時計回りのボタンを2回クリックすると、180度回転します。 +- 90度以外の回転(例:わずかに傾いたスキャンを直す45度)には、代わりに[任意の角度で回転](./rotate-custom)を使用してください。 +- 一括回転コントロールは、選択したページだけでなくすべてのページに作用します。このツールには選択機能がありません。選択が必要な場合は、[PDFマルチツール](./pdf-multi-tool)を使用してください。 + +## 関連ツール + +- [任意の角度で回転](./rotate-custom) +- [PDFマルチツール](./pdf-multi-tool) +- [複製と整理](./organize-pdf) diff --git a/docs/ja/tools/rtf-to-pdf.md b/docs/ja/tools/rtf-to-pdf.md new file mode 100644 index 00000000..0e055ae8 --- /dev/null +++ b/docs/ja/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTFからPDF +description: LibreOfficeベースのエンジンを使って、リッチテキスト形式(RTF)のファイルをブラウザ上でPDFに変換します。 +--- + +# RTFからPDF + +リッチテキスト形式のドキュメントをPDFに変換します。RTFは、ほぼすべてのワープロでサポートされているクロスプラットフォームのドキュメント形式です。このツールはブラウザ上のLibreOfficeエンジンを使って、書式を保ったままRTFファイルを描画します。太字、斜体、表、埋め込み画像もすべてPDFに引き継がれます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | MIMEタイプ | +| :----------- | :----- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## 使い方 + +1. アップロード領域をクリックするか、1つ以上のRTFファイルをドラッグアンドドロップします。 +2. ファイル一覧を確認します。必要に応じてファイルを追加または削除します。 +3. **PDFに変換**をクリックします。LibreOfficeエンジンは初回使用時に初期化され、その後各ファイルが処理されます。 +4. ファイルが1つの場合はPDFとして直接ダウンロードされます。複数の場合は`rtf-converted.zip`として届きます。 + +## オプション + +このツールに追加の設定はありません。変換では元のRTFの書式が保持されます。 + +## 出力 + +| 入力数 | 出力 | +| :------------ | :------------------------------------------------------------------- | +| 1ファイル | PDFを1つダウンロード(例:`letter.pdf`) | +| 2ファイル以上 | ZIPアーカイブ(`rtf-converted.zip`)に、ファイルごとに1つのPDFを格納 | + +## 活用例 + +- 古いワープロで作成したレガシーなRTFドキュメントを、現在のPDFに変換する +- RTFのメールテンプレートをPDFのプレビューにする +- 法務や医療のソフトウェアシステムが出力するRTFを処理する +- 文書管理システムのRTFファイルを、アーカイブ用にまとめてPDFに変換する + +## ヒント + +- LibreOfficeエンジンは一度読み込まれてキャッシュされます。セッション内の最初の変換は数秒余分にかかり、2回目以降は高速です。 +- 埋め込みOLEオブジェクトを含むRTFファイルでは、すべてのオブジェクトが完全に描画されない場合があります。プレーンテキスト、画像、標準的な書式は確実に変換されます。 +- RTFファイルがMicrosoft Wordで作成された場合は、DOCやDOCXと並んでRTFも受け付ける[WordからPDF](./word-to-pdf)ツールで直接変換することもできます。 + +## 関連ツール + +- [WordからPDF](./word-to-pdf) +- [ODTからPDF](./odt-to-pdf) +- [テキストからPDF](./txt-to-pdf) diff --git a/docs/ja/tools/sanitize-pdf.md b/docs/ja/tools/sanitize-pdf.md new file mode 100644 index 00000000..6cbcff2d --- /dev/null +++ b/docs/ja/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDFをサニタイズ +description: メタデータ、JavaScript、埋め込みファイル、注釈、レイヤーなど、PDFに含まれる隠れた、潜在的に危険なコンテンツを取り除きます。 +--- + +# PDFをサニタイズ + +PDFには、画面に表示されるもの以外にも多くのものが含まれていることがあります。隠れたメタデータ、埋め込みのJavaScript、添付ファイル、フォームデータ、レイヤー情報は、機密データを漏らしたり、セキュリティ上のリスクになったりすることがあります。サニタイズはそれらをすべて取り除き、公開しても安全なクリーンなドキュメントにします。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. チェックリストから、削除する要素を選択します。 +3. **PDFをサニタイズ**をクリックします。 +4. クリーンになったファイルをダウンロードします。 + +## サニタイズのオプション + +すべてのオプションはデフォルトで有効です。残したいものはチェックを外してください。 + +| オプション | 削除されるもの | +| -------------------------- | ------------------------------------------------------------ | +| **フォームをフラット化** | インタラクティブなフォームフィールドを静的な内容に変換 | +| **メタデータを削除** | 作成者、タイトル、作成日、ソフトウェア情報、XMPデータを削除 | +| **注釈を削除** | コメント、ハイライト、付箋、マークアップを削除 | +| **JavaScriptを削除** | 開いたときに実行される可能性のある埋め込みスクリプトを除去 | +| **埋め込みファイルを削除** | PDFに埋め込まれた添付ファイルを削除 | +| **レイヤー(OCG)を削除** | オプションコンテンツグループを1つのレイヤーにフラット化 | +| **リンクを削除** | ハイパーリンクとURL参照を削除 | +| **構造ツリーを削除** | アクセシビリティのタグ付けに使われるドキュメント構造を削除 | +| **MarkInfoを削除** | マークされたコンテンツ情報を削除 | +| **フォントを削除** | 埋め込まれたフォントデータを削除(注意して使用してください) | + +## 活用例 + +- 内部のメタデータ(作成者名、ソフトウェアのバージョン、編集履歴)を取り除いて、PDFを一般公開用に準備する +- 信頼できない送信元から受け取ったPDFを開く前に、JavaScriptを削除する +- 埋め込みコメントやフォームフィールド名を見せたくないクライアントにPDFを送る前に整理する +- 建築図面から隠れたレイヤーを取り除いてから、最終版を共有する +- プライバシー規制のデータ最小化の要件に準拠する + +## ヒント + +- PDFが正しく表示されることが確実でない限り、「フォントを削除」のチェックは外したままにしてください。フォントを削除すると、ビューアーによってはテキストが見えなくなることがあります。 +- メタデータだけを取り除きたい場合は、専用のメタデータの削除ツールのほうが速く、目的に合っています。 +- サニタイズは元に戻せません。元のファイルを保管してください。 + +## 関連ツール + +- [メタデータの削除](./remove-metadata):ほかの内容には触れず、メタデータだけを削除 +- [PDFのフラット化](./flatten-pdf):フォームと注釈を特にフラット化 +- [PDFの暗号化](./protect-pdf):サニタイズの後にパスワード保護を追加 +- [PDFのラスタライズ](./rasterize-pdf):最終手段として、画像に変換して隠れたコンテンツをすべて排除 diff --git a/docs/ja/tools/scanner-effect.md b/docs/ja/tools/scanner-effect.md new file mode 100644 index 00000000..15b69965 --- /dev/null +++ b/docs/ja/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: スキャナー効果 +description: ノイズ、回転、ぼかし、紙の経年変化の効果を調整して、PDFをスキャンした文書のように見せます。 +--- + +# スキャナー効果 + +きれいなデジタルPDFを、フラットベッドスキャナーから出てきたかのような見た目に変換します。ノイズ、わずかな回転、ぼかし、明るさの変化、任意の黄ばみを設定して適用し、物理的なスキャンの不完全さを再現します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. 1ページ目のライブプレビューと設定パネルが並んだエディターが開きます。 +3. スライダーとトグルを使って、スキャン効果のパラメーターを調整します。 +4. 設定を変更するたびに、プレビューがリアルタイムで更新されます。 +5. **適用**をクリックして、すべてのページを処理し、結果をダウンロードします。 + +## オプション + +- **カラースペース(グレースケールのトグル)**:出力をグレースケールに変換し、昔ながらの白黒スキャンの見た目にします。 +- **枠線**:ページの端に目立たない暗い枠線を追加し、スキャナーの縁のアーティファクトを再現します。 +- **回転**:わずかな回転(-5度から+5度)を適用し、紙のずれた給紙を再現します。 +- **回転のばらつき**:回転角度にランダムなばらつきを加え、ページごとに少しずつ違う傾きにします。 +- **明るさ**:全体の明るさを上げ下げします。 +- **コントラスト**:コントラストを調整し、トナー品質の違いを再現します。 +- **ぼかし**:ガウスぼかしを適用し、低品質のスキャンのようにテキストの縁をやわらげます。 +- **ノイズ**:ランダムなピクセルノイズを加え、スキャナーセンサーの粒状感を再現します。値が高いほど粒子が粗くなります。 +- **黄ばみ**:温かみのある黄色の色合いを加え、古い紙や再生紙を再現します。 +- **解像度**:出力のDPIを設定します。値が低いほど、ピクセルが粗いスキャンらしい見た目になります。 +- **リセット**:すべての設定をデフォルトに戻します。 + +## 機能 + +- 各パラメーターを調整するたびに更新されるリアルタイムプレビュー +- リアルな変化を出すための、ページごとのランダムな回転のばらつき +- 独立して調整できる10個のパラメーター +- 本物らしい白黒スキャンの出力に対応するグレースケールモード +- 低DPIのFAX品質から高DPIのアーカイブ品質まで対応する解像度の調整 + +## 活用例 + +- デジタルで作成したドキュメントを、スキャンして印刷したもののように見せる +- 歴史的な文書の再現のために、物理的な文書の経年劣化をシミュレートする +- 劣化したスキャン品質に対して、OCRソフトウェアをテストする +- 既存のスキャンされたアーカイブの見た目に合ったドキュメントを作成する + +## ヒント + +- 控えめな値から始めてください。ノイズレベル10から20、0.5度のわずかな回転、最小限のぼかしでも、十分にスキャンらしい見た目になります。 +- グレースケールモードとわずかな黄ばみを組み合わせると、「コピーのコピー」のような効果になります。 +- 低めの解像度設定(100から150 DPI)にすると、最もリアルなFAX機の見た目になります。 + +## 関連ツール + +- [色の反転](./invert-colors) +- [色の調整](./adjust-colors) +- [背景色](./background-color) diff --git a/docs/ja/tools/sign-pdf.md b/docs/ja/tools/sign-pdf.md new file mode 100644 index 00000000..8259a2ce --- /dev/null +++ b/docs/ja/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDFへ署名 +description: 署名を手書き、入力、またはアップロードして、内蔵のビューアーでPDFのページに配置します。 +--- + +# PDFへ署名 + +あらゆるPDFドキュメントに署名を追加します。このツールには、署名ツールを備えたPDFビューアーが組み込まれており、署名を手書きしたり、署名用フォントで名前を入力したり、署名画像をアップロードしたりできます。署名は任意のページに配置してサイズを変更し、署名済みのドキュメントを保存します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. ドキュメントが、注釈ツールを備えた統合PDFビューアーで開きます。 +3. ビューアーの署名ツールで、手書き、入力、または画像のアップロードによって署名を作成します。 +4. 署名を配置したいページをクリックし、サイズと位置を調整します。 +5. 必要に応じて、**PDFをフラット化**にチェックを入れ、署名をドキュメントに完全に埋め込みます。 +6. **署名済みPDFを保存してダウンロード**をクリックして、署名済みのファイルを入手します。 + +## オプション + +- **PDFをフラット化**:チェックを入れると、署名がページの内容に完全に埋め込まれます。これにより、他の人が署名を移動したり削除したりできなくなります。チェックを外すと、署名は注釈のままで、対応するビューアーで編集できます。 + +## 機能 + +- 3つの署名作成方法:手書き、入力したテキスト、アップロードした画像 +- 正確に配置できる統合PDFビューアー +- 任意のページで署名をドラッグして配置し、サイズを変更 +- 署名を完全に埋め込む、任意のフラット化 +- 同じドキュメントに複数の署名を追加可能 + +## 活用例 + +- 契約書、合意書、承認フォームに署名して返送する +- 税務書類、保険の請求書、行政の書類に署名を追加する +- 複数ページの合意書の各ページにイニシャルを入れる +- PDFの添付ファイルとして届いたNDAや人事書類に署名する + +## ヒント + +- 署名済みのPDFを、署名を削除したり位置を変更したりできないようにしたい相手に送る場合は、フラット化を有効にしてください。 +- 証明書ベースの検証を伴う、法的拘束力のあるデジタル署名には、BentoPDFに別途用意されているデジタル署名ツールを使用できます。 +- 最もきれいな結果を得るには、背景が透明なPNGの署名画像をアップロードしてください。 + +## 関連ツール + +- [PDFエディター](./edit-pdf) +- [スタンプの追加](./add-stamps) +- [フォーム入力](./form-filler) diff --git a/docs/ja/tools/split-pdf.md b/docs/ja/tools/split-pdf.md new file mode 100644 index 00000000..bcc22357 --- /dev/null +++ b/docs/ja/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: PDFの分割 +description: ページ範囲、視覚的な選択、しおり、偶数/奇数ページ、一定の間隔で、PDFを小さなファイルに分割します。 +--- + +# PDFの分割 + +6つの分割モードのいずれかを使って、PDFを小さなドキュメントに分けます。単純なページ範囲からしおりによる分割まで、ドキュメントを分けるあらゆる場面に対応します。 + +## 使い方 + +1. PDFファイルを1つアップロードします。 +2. ドロップダウンから分割モードを選択します。 +3. モードごとのオプション(ページ範囲、選択など)を設定します。 +4. 処理ボタンをクリックします。 +5. 結果は、モードと設定に応じて、単一のPDFまたはZIPアーカイブとしてダウンロードされます。 + +## 分割モード + +| モード | 説明 | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | +| **範囲** | `1-3, 5, 8-10`のようにページ範囲を入力します。複数の範囲を指定すると、別々のPDFがZIPで生成されます。範囲が1つなら、PDFが1つ生成されます。 | +| **視覚的に選択** | ページのサムネイルを見ながら、クリックして必要なページを選択します。選択したページが新しいPDFに抽出されます。 | +| **偶数 / 奇数** | 偶数ページまたは奇数ページだけを抽出します。 | +| **すべてのページ** | すべてのページを個別のPDFファイルに分割し、ZIPでダウンロードします。 | +| **しおり** | しおりの境界で分割します。しおりのレベルを選んで、分割する位置を制御します。 | +| **Nページごと** | Nページずつのまとまりに分割します(例:5ページごと)。最後のまとまりはページ数が少なくなる場合があります。 | + +## 機能 + +- ほぼすべての用途をカバーする6つの分割モード +- 遅延読み込みのサムネイルによる視覚的なページ選択 +- レベルで絞り込めるしおり対応の分割 +- 範囲モードと視覚的選択モードでのZIP出力オプション +- 混在した記法のページ範囲(`1-3, 5, 8-10`)に対応 +- Nページごとの分割で、まとまりが不均等になる場合の警告 + +## 活用例 + +- 大きなドキュメントから特定の章やセクションを抽出する +- 両面印刷のワークフロー向けに、奇数ページと偶数ページを分ける +- 書籍のPDFを、しおりの境界で章ごとのファイルに分割する +- 契約書から、署名ページなどの特定のページを取り出す +- まとめられたレポートを、配布用にセクションごとのファイルに分割する + +## ヒント + +- カンマで区切った複数のページ範囲(例:`1-5, 10-15, 20-25`)を指定すると、範囲ごとに別々のPDFが生成され、ZIPにまとめられます。 +- しおりによる分割モードには、PDFに実際にしおりが含まれている必要があります。見つからない場合はエラーメッセージが表示されます。 +- 範囲モードと視覚的選択モードの「ZIPとしてダウンロード」チェックボックスを使うと、結合したファイルではなく、ページごとの個別のPDFを入手できます。 + +## 関連ツール + +- [PDFの結合](./merge-pdf) +- [ページの抽出](./extract-pages) +- [ページの削除](./delete-pages) +- [PDFマルチツール](./pdf-multi-tool) diff --git a/docs/ja/tools/svg-to-pdf.md b/docs/ja/tools/svg-to-pdf.md new file mode 100644 index 00000000..d5408c6b --- /dev/null +++ b/docs/ja/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVGからPDF +description: SVGベクターグラフィックスを、品質を調整しながらPDFに変換します。すべてブラウザ上で完結します。 +--- + +# SVGからPDF + +Scalable Vector Graphics(SVG)ファイルをPDFに変換します。このツールは各SVGをブラウザの描画エンジンでラスタライズし、その結果を元の解像度で埋め込みます。ベクターのアイコン、図、イラストを持ち運びやすいドキュメントにするのに便利です。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :----------- | :----- | +| SVG | `.svg` | + +## 使い方 + +1. アップロード領域をクリックするか、1つ以上のSVGファイルをドラッグアンドドロップします。 +2. ファイル一覧を確認して管理します。 +3. **PDF品質**のレベルを選択します。 +4. **PDFに変換**をクリックします。結果は`from_svgs.pdf`としてダウンロードされます。 + +各SVGはテキストとして読み込まれ、本来の幅と高さ(サイズの指定がない場合は800x600がデフォルト)でキャンバスに描画され、PNGとして書き出されます。そのPNGがpdf-libを使ってPDFに埋め込まれます。透明な部分は白い背景で塗りつぶされます。 + +## オプション + +**PDF品質**は、ラスタライズ後の圧縮を制御します。 + +- **高品質**:元の描画に最も近くなります。 +- **中品質**(デフォルト):バランスが良い設定です。 +- **低品質**:ファイルが最小になりますが、細部が失われます。 + +## 活用例 + +- 建築やエンジニアリングの図を、SVGから印刷用のPDFに変換する +- アイコンセットを、デザインシステムのリファレンスPDFにまとめる +- データの可視化(D3.jsやチャートライブラリの出力)を、レポートに使えるPDFにする +- SVGベースのインフォグラフィックの印刷用バージョンを作成する + +## ヒント + +- `width`と`height`属性が明示されていないSVGファイルは、800x600ピクセルで描画されます。最良の結果を得るには、変換する前にSVGのソースでサイズを設定してください。 +- 外部フォントの参照やリンクされた画像を含む複雑なSVGは、完全には描画されない場合があります。確実な出力のために、すべてのアセットをSVG内にインライン化してください。 +- SVGはラスタライズされるため、PDFにはベクターパスではなくビットマップ画像が含まれます。真のベクターPDF出力には、専用のベクターツールが必要です。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [PNGからPDF](./png-to-pdf) +- [BMPからPDF](./bmp-to-pdf) diff --git a/docs/ja/tools/table-of-contents.md b/docs/ja/tools/table-of-contents.md new file mode 100644 index 00000000..73e0900b --- /dev/null +++ b/docs/ja/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: 目次 +description: PDFにある既存のしおりから、書式設定された目次ページを生成します。 +--- + +# 目次 + +このツールは、PDF内のしおり(アウトライン)を読み取り、書式設定された目次ページを生成してドキュメントの先頭に追加します。PDFにしおりはあるものの、目に見える目次ページがない場合に、自動的に作成します。 + +## 使い方 + +1. しおりを含むPDFをアップロードします。 +2. 目次のタイトル、フォントサイズ、フォントファミリーをカスタマイズします。 +3. 必要に応じて**目次ページのしおりを追加**にチェックを入れ、目次自体もしおりツリーに含めます。 +4. **目次を生成**をクリックして、ファイルを処理します。 +5. 先頭に目次ページが挿入されたPDFが、自動的にダウンロードされます。 + +## オプション + +- **目次のタイトル**:生成されるページの上部に表示される見出しです。デフォルトは「目次」です。 +- **フォントサイズ**:10ptから72ptまで選べます。デフォルトは12ptです。 +- **フォントファミリー**:Times Roman、Helvetica、Courierのバリエーション(標準、太字、斜体、太字斜体)から選択します。デフォルトはHelveticaです。 +- **目次ページのしおりを追加**:チェックを入れると、目次ページ自体のしおり項目がPDFのアウトラインツリーに追加されます。 + +## 機能 + +- PDFのしおりの階層全体を読み取り +- ページ番号の参照付きで、きれいに整形された目次ページを生成 +- 入れ子になったしおりのレベルを、インデントでサポート +- 12種類の内蔵PDFフォントから選択可能 +- 目次ページ自体を指すしおりを、任意で追加 + +## 活用例 + +- デジタルのしおりしかない電子書籍やレポートに、印刷可能な目次を追加する +- 複数のPDFを結合した後のドキュメントに、目次を作成する +- 長い技術マニュアルの参照ページを生成する +- 目に見える目次が求められる印刷用のドキュメントを準備する + +## ヒント + +- PDFにしおりがない場合は、先に[しおりの編集](./bookmark)ツールでしおりを作成してから、ここに戻って目次を生成してください。 +- 大きなドキュメントでは、14ptや16ptなど大きめのフォントサイズにすると読みやすくなります。 + +## 関連ツール + +- [しおりの編集](./bookmark) +- [ページ番号](./page-numbers) +- [ヘッダーとフッター](./header-footer) diff --git a/docs/ja/tools/text-color.md b/docs/ja/tools/text-color.md new file mode 100644 index 00000000..f6a6f4d6 --- /dev/null +++ b/docs/ja/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: テキストの色の変更 +description: PDF内のすべてのテキストの色を、好きな色に変更します。 +--- + +# テキストの色の変更 + +PDF全体のテキストの色を置き換えます。このツールは各ページのテキスト領域を識別して選択した色に変更し、ドキュメントのレイアウトとテキスト以外の内容は保持します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. カラーセレクターで新しいテキストの色を選びます。デフォルトは青(#0000FF)です。 +3. **テキストの色を変更**をクリックして処理します。 +4. 色が変更されたPDFが自動的にダウンロードされます。進捗インジケーターに、処理中のページが表示されます。 + +## オプション + +- **新しいテキストの色**:ドキュメント内のすべてのテキストの置き換え後の色を選ぶカラーピッカーです。 + +## 機能 + +- ドキュメントのすべてのページのテキストの色を変更 +- 進捗表示付きのページごとの処理 +- 16進数カラーに完全対応したカラーピッカー +- ページのレイアウトとテキスト以外の要素を保持 + +## 活用例 + +- 黒いテキストを濃い青に変えて、より柔らかく現代的なドキュメントの印象にする +- ドキュメントを配布する前に、ブランドガイドラインに合わせてテキストの色を変更する +- アクセシビリティ要件への準拠のために、テキストを特定の色にする +- 新しく適用した背景色に対して、テキストが見えるようにする + +## ヒント + +- このツールは品質を保つためにページを2倍のスケールで描画し、PDFを再構築します。出力は画像ベースになるため、テキストは選択も検索もできなくなります。 +- 選択可能なテキストを保ちたいドキュメントでは、代わりに[PDFエディター](./edit-pdf)でPDFを直接編集することを検討してください。 +- 各ページが個別に描画されるため、処理時間はページ数に応じて長くなります。 + +## 関連ツール + +- [背景色](./background-color) +- [色の反転](./invert-colors) +- [色の調整](./adjust-colors) diff --git a/docs/ja/tools/tiff-to-pdf.md b/docs/ja/tools/tiff-to-pdf.md new file mode 100644 index 00000000..1444ce97 --- /dev/null +++ b/docs/ja/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFFからPDF +description: 単一ページおよび複数ページのTIFF画像を、すべてのページに対応してブラウザ上でPDF形式に変換します。 +--- + +# TIFFからPDF + +複数ページのTIFFを含め、TIFFファイルをPDFに変換します。TIFFファイル内の各ページ(「IFD」)が、出力PDFの別々のページになります。複数ページのTIFFとして保存されることが多い、スキャン文書、FAX、医療画像に特に便利です。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :----------- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## 使い方 + +1. アップロード領域をクリックするか、TIFFファイルをドラッグアンドドロップします。 +2. ファイル一覧を確認し、必要に応じて管理します。 +3. **PDFに変換**をクリックします。結果は`from_tiff.pdf`としてダウンロードされます。 + +このツールは、JavaScriptのTIFFデコーダーで各TIFFファイルをデコードし、すべてのページの生のRGBAピクセルデータを抽出します。各ページはキャンバスに描画され、PNGとして書き出されてPDFに埋め込まれます。ページのサイズは元のTIFFのページと一致します。 + +## オプション + +このツールには、品質に関する追加の設定はありません。画像は元の解像度で埋め込まれます。 + +## 活用例 + +- 複数ページのFAX文書(TIFF-F)を、より持ち運びやすいPDF形式に変換する +- TIFFで保存されたスキャン文書のアーカイブを、検索可能なPDFにする(その後OCRツールと組み合わせます) +- TIFFを使用する医療画像ファイル(病理スライド、放射線画像の出力)を処理する +- GISや衛星画像のTIFFファイルを、共有できるドキュメントに変換する + +## ヒント + +- 複数ページのTIFFに完全対応しています。10ページのTIFFからは10ページのPDFが生成されます。先にTIFFを分割する必要はありません。 +- 非常に大きなTIFFファイル(数百メガバイト)は、ファイル全体をブラウザのメモリ内でデコードする必要があるため、処理に時間がかかることがあります。 +- 生成されたPDFにOCRが必要な場合は、変換後に[OCR PDF](./ocr-pdf)ツールを実行してください。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [BMPからPDF](./bmp-to-pdf) +- [JPGからPDF](./jpg-to-pdf) diff --git a/docs/ja/tools/txt-to-pdf.md b/docs/ja/tools/txt-to-pdf.md new file mode 100644 index 00000000..03270fae --- /dev/null +++ b/docs/ja/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: テキストからPDF +description: プレーンテキストファイルまたは入力したテキストを、フォント、色、ページサイズを指定してPDFに変換します。 +--- + +# テキストからPDF + +プレーンテキストを、書式設定されたPDFに変換します。`.txt`ファイルをアップロードするか、内蔵のテキストエディターに直接入力できます。複数のフォント、テキストの色の指定、A0からA10に加えてUSレター、リーガル、タブロイドまで、幅広いページサイズに対応しています。 + +## 対応フォーマット + +| 入力 | 拡張子 | +| :----------------------- | :----------------------------- | +| プレーンテキストファイル | `.txt` | +| テキストの直接入力 | エディターに入力または貼り付け | + +## 使い方 + +1. 上部のトグルで入力モードを選択します。**ファイルをアップロード**または**テキストを入力**です。 +2. アップロードする場合は、1つ以上の`.txt`ファイルをドラッグアンドドロップするか、クリックして選択します。入力する場合は、テキストエリアに直接テキストを入力します。 +3. 書式のオプションを設定します。フォントファミリー、フォントサイズ、テキストの色、ページサイズです。 +4. **PDFを作成**をクリックします。出力は`text_to_pdf.pdf`としてダウンロードされます。 + +複数のファイルをアップロードした場合、それらの内容は間に空行を挟んで連結されます。 + +## オプション + +| オプション | 値 | デフォルト | +| :--------------------- | :----------------------------------------------------------------------------------- | :------------ | +| **フォントファミリー** | Helvetica(サンセリフ)、Tiro(セリフ)、Courier(等幅)、Times(セリフ) | Helvetica | +| **フォントサイズ** | 6 - 72 pt | 12 | +| **テキストの色** | カラーピッカーで任意の色 | 黒(#000000) | +| **ページサイズ** | ISO A0からA10、B0からB10、C0からC10、USレター、リーガル、タブロイド、レジャー、11x17 | A4 | + +RTL言語(アラビア語、ヘブライ語、ペルシア語、ウルドゥー語)は自動的に検出されます。RTLのテキストが見つかると、テキストの方向と配置がそれに応じて切り替わります。 + +## 活用例 + +- コードスニペットやログファイルを、Courierフォントの印刷可能なPDFに変換する +- その場で入力した会議メモから、すばやくPDFを作成する +- プレーンテキストの原稿を、提出用に特定のフォントとページサイズで整形する +- READMEや変更履歴のPDF版を、オフライン配布用に作成する + +## ヒント + +- クリップボードの内容を、ファイルとして保存せずにすばやく変換したい場合は、**テキストを入力**モードを使用してください。 +- Courier(等幅)は、コードやログ、列の揃いが重要な内容に最適なフォントです。 +- ページの余白は、四辺とも72ポイント(1インチ)に固定されています。 + +## 関連ツール + +- [MarkdownからPDF](./markdown-to-pdf) +- [CSVからPDF](./csv-to-pdf) +- [WordからPDF](./word-to-pdf) diff --git a/docs/ja/tools/unlock-pdf.md b/docs/ja/tools/unlock-pdf.md new file mode 100644 index 00000000..07b5ab5f --- /dev/null +++ b/docs/ja/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDFのロック解除 +description: 暗号化されたPDFのパスワード保護を解除します。1つのパスワードで複数ファイルをまとめて復号化できます。 +--- + +# PDFのロック解除 + +暗号化されたPDFのパスワードがわかっている場合、このツールで暗号化を完全に解除し、パスワードなしで誰でも開けるコピーを作成できます。複数のPDFが同じパスワードを共有している場合は、一括で復号化できます。 + +## 使い方 + +1. 暗号化されたPDFファイルを1つまたは複数アップロードします。 +2. ファイルの保護に使用した**パスワード**を入力します。 +3. **PDFの復号化**をクリックします。 +4. 1ファイルの場合はそのままダウンロードされます。複数ファイルの場合は、ロック解除済みのPDFをすべて含むZIPアーカイブが作成されます。 + +## 機能 + +- 単一ファイルの復号化と一括復号化 +- ユーザーパスワードと所有者パスワードの両方に対応 +- 制限が一切残らない、完全に暗号化されていない出力 +- パスワードの誤りや破損ファイルを明確に報告 +- 一括モードではファイルごとの成功/失敗を追跡 + +## 制限の解除との違い + +**PDFの復号化**はパスワードが必要で、すべての暗号化を解除します。**制限を解除**は使用制限(印刷、コピー、編集)を対象とし、所有者パスワードのみが設定されている場合はパスワードが不要なことがあります。パスワードなしではPDFをまったく開けない場合は、Decryptを使用してください。 + +## 活用例 + +- 以前に暗号化したPDFで、パスワードが不要になったものを恒久的にロック解除する +- 保管済みの文書をまとめて暗号化解除し、長期的にアクセスしやすくする +- 暗号化ファイルに対応していない文書管理システム向けに、パスワード保護されたPDFを準備する +- 他の文書と結合する前にPDFのロックを解除する(多くの結合ツールは暗号化された入力を処理できません) + +## ヒント + +- パスワード欄はアップロードしたすべてのファイルに適用されます。PDFごとにパスワードが異なる場合は、別々のバッチで処理してください。 +- 「パスワードが正しくありません」エラーが出る場合は、末尾の空白やCaps Lockを確認してください。 +- 復号化後の出力にはセキュリティがまったくありません。新しいパスワードを設定したい場合は、PDFの暗号化で再び暗号化してください。 + +## 関連ツール + +- [PDFの暗号化](./protect-pdf): 新しいパスワードで暗号化を再適用します +- [制限の解除](./remove-restrictions): 完全に復号化せずに使用制限を解除します +- [権限の変更](./change-permissions): 暗号化されたPDFの特定の権限を変更します diff --git a/docs/ja/tools/validate-signature-pdf.md b/docs/ja/tools/validate-signature-pdf.md new file mode 100644 index 00000000..b4b8e9af --- /dev/null +++ b/docs/ja/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: PDF署名を検証する +description: PDFファイルの電子署名を検証します。証明書の有効性、署名者の身元、文書の完全性、信頼チェーンの状態を確認できます。 +--- + +# PDF署名を検証する + +署名済みPDFをアップロードすると、このツールがすべての電子署名を抽出し、署名者を特定し、証明書の有効性を確認し、署名後に文書が変更されたかどうかを報告します。信頼する証明書を指定して、署名チェーンを検証することもできます。 + +## 使い方 + +1. 署名済みPDFファイルをアップロードします。検証は自動的に始まります。 +2. ツールが概要(見つかった署名の数と、そのうち有効なものの数)を表示します。 +3. 各署名について、署名者名、発行者、日付、状態を示す詳細カードが表示されます。 +4. 必要に応じて、**信頼する証明書**(.pem、.crt、.cer、.der)をアップロードすると、特定のトラストアンカーに対して署名を検証できます。再検証は自動的に実行されます。 + +## チェック内容 + +### 署名の解析 + +ツールはPDFからPKCS#7署名オブジェクトを抽出してASN.1構造をデコードし、署名者のX.509証明書と、署名に埋め込まれた証明書チェーンを取り出します。 + +### 証明書の有効性 + +- **有効期限**: 証明書は現在、有効期間内ですか。 +- **自己署名の検出**: 証明書は自身の発行者ですか。 +- **信頼チェーン**: 信頼する証明書が指定された場合、署名者の証明書はそこまでチェーンがつながっていますか。 + +### 暗号による検証 + +- ツールは署名の`/ByteRange`が対象とするバイト列を再構築し、署名者が宣言したアルゴリズムでハッシュ化して、署名内の`messageDigest`属性と結果を比較します。 +- 次に、署名済み属性をDERのSETとして再シリアライズし、署名者証明書の公開鍵に対して署名を検証します。 +- **署名は、これらすべてに合格した場合にのみ有効と報告されます。** 署名後にPDFのバイト列が変更された場合、または埋め込まれた署名が署名者の鍵と一致しない場合、ステータスには具体的な理由とともに「無効: 暗号化検証に失敗しました」と表示されます。 + +#### 対応する署名アルゴリズム + +| アルゴリズム | 検証方法 | +| ----------------------- | ------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`、Web Cryptoへのフォールバックあり | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | DERからIEEE P1363形式への署名変換後、Web Crypto `verify({name: 'ECDSA', hash})` | + +署名がこの一覧にないアルゴリズム(たとえばEd25519、SM2、特殊なダイジェストOIDを使ったRSAなど)を使用している場合、カードには黄色で「未検証: 未対応の署名アルゴリズム」と、具体的なOIDまたは理由が表示されます。これは意図的な3段階の区別です。 + +- **有効**: 署名者の公開鍵に対して、署名が暗号的に検証されました。 +- **無効**: 検証が実行され、否定的な結果になりました(バイト列の変更、鍵の不一致)。 +- **未検証**: このアルゴリズムについては検証を実行できませんでした。証明書のメタデータは表示されますが、署名は「不明」として扱い、Adobe Acrobatまたは`openssl cms -verify`で検証してください。 + +### 安全でないダイジェストアルゴリズム + +- **MD5またはSHA-1**を使用した署名は無効として拒否され、「安全でないダイジェスト」ステータスが付きます。どちらのアルゴリズムにも衝突攻撃が公開されているため、SHA-1やMD5のハッシュに対する署名では完全性は保証されません。 +- SHA-224、SHA-256、SHA-384、SHA-512はすべて受け入れられます。 + +### 文書のカバー範囲 + +- **完全カバー**: 署名がPDFファイル全体をカバーしており、署名後にバイトが追加・変更されていないことを意味します。 +- **部分カバー**: 署名がファイルの一部のみをカバーしています。署名後に変更が加えられた可能性を示しますが、悪意があるとは限りません(増分保存でも部分カバーになります)。 + +## 署名の詳細 + +各署名カードには次の情報が表示されます。 + +- **署名者**: 署名者の証明書に含まれる共通名、組織、メールアドレス +- **発行者**: 署名者の証明書を発行した認証局 +- **署名日時**: 署名に埋め込まれたタイムスタンプ +- **有効開始日 / 有効期限**: 証明書の有効期間 +- **理由**: 文書に署名した理由(指定されている場合) +- **場所**: 署名した場所(指定されている場合) +- **カバー状況**: 完全または部分 +- **信頼バッジ**: 信頼済み、または信頼チェーンにないことを示します(カスタム証明書を指定した場合のみ) + +### 技術的な詳細 + +技術的な詳細セクションを展開すると、次の情報が表示されます。 + +- 署名者の証明書のシリアル番号 +- ダイジェストアルゴリズム(SHA-256、SHA-512など) +- 署名アルゴリズム(RSA with SHA-256、ECDSA with SHA-256など) +- 無効な署名のエラーメッセージ + +## 活用例 + +- 副署する前に、電子署名された契約書を検証する +- 署名済み文書を監査し、改ざんされていないことを確認する +- 文書に署名した後に証明書の有効期限が切れていないかを確認する +- 組織のルート証明書に対して署名を検証する +- 政府文書や法的文書の署名の詳細を確認する + +## ヒント + +- 自己署名証明書だからといって署名が無効というわけではありません。信頼できる第三者を通じて署名者の身元を確認できない、という意味です。社内文書ではよくあることです。 +- 部分カバーは、必ずしも改ざんを示すものではありません。多くのPDFワークフローでは、増分更新(2つ目の署名など)が追加され、部分カバーになります。 +- 信頼チェーンの検証を行うには、組織のルート証明書または中間証明書を信頼する証明書としてアップロードしてください。 + +## 関連ツール + +- [PDFへの電子署名](./digital-sign-pdf): 自分の証明書でPDFに署名します +- [PDFの平坦化](./flatten-pdf): 署名前にPDFをフラット化し、署名後の変更を防ぎます +- [メタデータの削除](./remove-metadata): 署名を適用する前にPDFをクリーンアップします diff --git a/docs/ja/tools/view-metadata.md b/docs/ja/tools/view-metadata.md new file mode 100644 index 00000000..e9ec25a1 --- /dev/null +++ b/docs/ja/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: メタデータの表示 +description: ドキュメント情報、XMPデータ、構造の詳細など、PDFのすべてのメタデータプロパティを確認します。 +--- + +# メタデータの表示 + +PDFファイルに埋め込まれた隠れたプロパティを調べます。このツールは、ドキュメント情報(タイトル、作成者、日付)、XMPメタデータ、ページサイズなどの構造データを、読みやすい形式で表示します。 + +## 使い方 + +1. PDFファイルをアップロードします。 +2. ツールがすぐにファイルを解析し、利用可能なすべてのメタデータを整理されたセクションに表示します。 +3. ドキュメント情報ディクショナリ、XMPメタデータツリー、構造プロパティを確認します。 +4. 処理の手順は不要です。ファイルが読み込まれるとすぐにメタデータが表示されます。 + +## 機能 + +- 標準のドキュメント情報フィールドを表示: タイトル、作成者、サブジェクト、キーワード、作成アプリケーション、PDF変換 +- 作成日と更新日を読みやすい形式で表示 +- ネストされた名前空間を含む、XMPメタデータツリー全体を解析して表示 +- PDFの日付形式(`D:20240101120000Z`)を読みやすい日付に変換 +- 折りたたみ可能なセクションに整理され、移動しやすい + +## メタデータのセクション + +| セクション | 内容 | +| ---------------------------- | ----------------------------------------------------------------------------------------- | +| **ドキュメント情報** | タイトル、作成者、サブジェクト、キーワード、作成アプリケーション、PDF変換、作成日、更新日 | +| **XMPメタデータ** | Dublin Core、XAP、PDF、カスタム名前空間を含む、XMLベースのメタデータツリー全体 | +| **ドキュメントのプロパティ** | ページ数、PDFバージョン、ファイルサイズ、暗号化の状態 | + +## 活用例 + +- PDFの作成者と最終更新日を確認する +- 文書を公開する前に、メタデータが正しく設定されているか確認する +- 埋め込まれている個人情報を調べ、プライバシーの観点からPDFを監査する +- PDFの作成や変更に使われたソフトウェアを調べる(Producerフィールドから) +- デジタルアセット管理のコンプライアンスのためにXMPメタデータを確認する + +## ヒント + +- `D:`で始まるPDFの日付文字列は、自動的にお使いのローカルタイムゾーンの形式に変換されます。 +- メタデータのフィールドが空の場合は、PDFの作成者が設定しなかっただけです。すべてのPDFに豊富なメタデータが含まれているわけではありません。 +- 確認したメタデータを変更するには[メタデータの編集](./edit-metadata)を、完全に削除するにはメタデータの削除を使用してください。 + +## 関連ツール + +- [メタデータの編集](./edit-metadata) +- [PDF OCG Layers](./pdf-layers) +- [PDFの比較](./compare-pdfs) diff --git a/docs/ja/tools/vsd-to-pdf.md b/docs/ja/tools/vsd-to-pdf.md new file mode 100644 index 00000000..5c26fe89 --- /dev/null +++ b/docs/ja/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSDからPDF +description: Microsoft Visio(VSD/VSDX)の図をブラウザ上でPDFに変換します。無料でプライベート、Visioは不要です。 +--- + +# VSDからPDF + +Visioをインストールせずに、Microsoft VisioのダイアグラムをPDFに変換します。VSDファイルとVSDXファイルには、フローチャート、組織図、ネットワーク図、間取り図などが含まれていますが、多くの人は開けません。このツールは、それらをどのデバイスでも見られるきれいなPDFとして出力します。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :------------ | :------ | :------------------------------ | +| Visioバイナリ | `.vsd` | 従来のVisio形式(Visio 2003以前) | +| Visio XML | `.vsdx` | 現在のVisio形式(Visio 2013以降) | + +## 使い方 + +1. アップロード領域をクリックするか、VSDまたはVSDXファイルをドラッグ&ドロップします。両方の形式を1つのバッチに混在させることができます。 +2. ファイル一覧を確認します。不要な項目はゴミ箱アイコンで削除するか、**さらにファイルを追加する**でダイアグラムを追加します。 +3. **PDFに変換**をクリックします。LibreOfficeベースのエンジンがブラウザに読み込まれ、図形、コネクタ、ラベル、ページレイアウトを維持したまま各ダイアグラムをPDFにレンダリングします。 +4. 1つのダイアグラムはそのままPDFとしてダウンロードされます。複数ファイルの場合は、`vsd-to-pdf.zip`という名前のZIPアーカイブが作成されます。 + +## オプション + +設定は不要です。コンバーターは、Visio文書の元のページサイズと向きを尊重します。 + +## 活用例 + +- Visioのライセンスがなくても、同僚のVisio図を確認する +- ネットワーク図やアーキテクチャ図を、プロジェクトのドキュメントにPDFとして含める +- 会議の配布資料として、組織図やプロセスフローを印刷する +- 古いバージョンのVisioで作られたVSDファイルを、将来も使える形式で保管する + +## ヒント + +- 複数ページのVisio文書は複数ページのPDFになり、Visioの各ページがPDFの各ページに対応します。 +- VSDXファイル(現在のXMLベースの形式)は、古いVSDバイナリファイルよりも高い再現度で変換されるのが一般的です。 +- LibreOfficeエンジンはセッションごとに1回読み込まれます。最初の変換では少し待ち時間がありますが、以降のファイルはより速く処理されます。 + +## 関連ツール + +- [ODGからPDF](./odg-to-pdf) +- [PUBからPDF](./pub-to-pdf) +- [PSDからPDF](./psd-to-pdf) diff --git a/docs/ja/tools/webp-to-pdf.md b/docs/ja/tools/webp-to-pdf.md new file mode 100644 index 00000000..7f1d060a --- /dev/null +++ b/docs/ja/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebPからPDF +description: WebP画像をブラウザ上でPDF形式に変換します。圧縮品質を調整できます。 +--- + +# WebPからPDF + +GoogleのWebP画像形式をPDFに変換します。Webからダウンロードした画像がWebP形式で、印刷や共有のためにより広く対応された形式が必要な場合に特に便利です。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :----------- | :------ | +| WebP | `.webp` | + +## 使い方 + +1. アップロード領域をクリックするか、WebPファイルをドラッグ&ドロップします。 +2. ファイル一覧を確認し、不要なファイルを削除します。 +3. **PDFの品質**のレベルを選択します。 +4. **PDFに変換**をクリックします。出力は`from_webps.pdf`としてダウンロードされます。 + +内部では、各WebP画像がブラウザのcanvas APIでデコードされ、pdf-libを使ってPDFに埋め込まれます。そのため、WebPのデコードに対応しているブラウザ(最近のブラウザはすべて対応)であれば変換できます。 + +## オプション + +**PDFの品質**は、画像を埋め込む際の圧縮を制御します。 + +- **高画質(ファイルサイズ大)**: 最も多くの細部を維持します。 +- **中画質(バランス)**(デフォルト): バランスの取れた出力です。 +- **低画質(ファイルサイズ小)**: ファイルサイズが最小になります。 + +## 活用例 + +- Webからダウンロードして保存したWebP画像を、印刷可能なPDFに変換する +- ChromeやEdgeで撮影したWebPのスクリーンショットをドキュメントにまとめる +- WebPが既定のデザインツールから書き出した画像で、PDFポートフォリオを作成する +- WebP画像を、より広く読める形式で保管する + +## ヒント + +- WebPはPDFに埋め込む前に内部でPNGにデコードされるため、ロスレスのWebP画像はHigh設定で品質が維持されます。 +- WebPとほかの画像形式が混在している場合は、代わりに[画像からPDF](./image-to-pdf)ツールを使用してください。すべてをまとめて受け付けます。 + +## 関連ツール + +- [画像からPDF](./image-to-pdf) +- [PNGからPDF](./png-to-pdf) +- [JPGからPDF](./jpg-to-pdf) diff --git a/docs/ja/tools/word-to-pdf.md b/docs/ja/tools/word-to-pdf.md new file mode 100644 index 00000000..d116f0d0 --- /dev/null +++ b/docs/ja/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: WordからPDF +description: Word文書(DOC、DOCX)、ODT、RTFファイルを、書式を完全に保ったままブラウザ上でPDFに変換します。 +--- + +# WordからPDF + +Microsoft Word文書と互換形式をPDFに変換します。このツールはブラウザベースのLibreOfficeエンジンを使用し、DOC、DOCX、ODT、RTFファイルを処理して、書式、表、画像、ヘッダー、フッター、スタイルを出力に維持します。 + +## 対応フォーマット + +| フォーマット | 拡張子 | +| :------------------- | :------ | +| Word(現行) | `.docx` | +| Word(旧形式) | `.doc` | +| OpenDocumentテキスト | `.odt` | +| リッチテキスト形式 | `.rtf` | + +## 使い方 + +1. アップロード領域をクリックするか、Word文書をドラッグ&ドロップします。複数のファイルを一度に選択できます。 +2. ファイル一覧を確認して整理します。 +3. **PDFに変換**をクリックします。LibreOfficeエンジンは初回の使用時に読み込まれ(進行状況インジケーターに初期化の状態が表示されます)、その後、各ファイルが変換されます。 +4. 1ファイルの場合は、そのままPDFとしてダウンロードされます。複数ファイルの場合は、`word-converted.zip`にまとめられます。 + +## オプション + +このツールに追加の設定はありません。LibreOfficeエンジンが、デフォルトのPDFエクスポートプロファイルで出力を生成します。 + +## 出力 + +| 入力数 | 出力 | +| :------------ | :------------------------------------------------------------------ | +| 1ファイル | 単一のPDFをダウンロード(元のファイル名に`.pdf`拡張子) | +| 2ファイル以上 | ZIPアーカイブ(`word-converted.zip`)に、ファイルごとに1つのPDFを格納 | + +## 活用例 + +- 就職応募の前に、履歴書やカバーレターをDOCXからPDFに変換する +- 顧客への納品用に、契約書や提案書のセットをまとめてPDFに変換する +- 旧形式の`.doc`ファイルを、長期保管用の最新のPDFに変換する +- Google Docsで共同編集した文書(DOCXとしてエクスポート)をPDFに変換する +- 自動文書生成で使われるWordテンプレートから、印刷用のPDFを作成する + +## ヒント + +- LibreOfficeエンジンはセッションごとに1回ダウンロードされ、キャッシュされます。最初の変換では数秒の読み込み時間がかかりますが、以降の変換ははるかに速くなります。 +- 複雑な書式(マクロ、ActiveXコントロール、高度なSmartArt)は、完全には変換されない場合があります。テキスト、表、画像、ヘッダー、脚注といった標準的な文書要素は、確実に変換されます。 +- このツールはODTとRTFにも対応しているため、あらゆるワープロ形式をまとめて変換できるツールとして使えます。 + +## 関連ツール + +- [ODTからPDF](./odt-to-pdf) +- [RTFからPDF](./rtf-to-pdf) +- [ExcelからPDF](./excel-to-pdf) +- [PowerPointからPDF](./powerpoint-to-pdf) diff --git a/docs/ja/tools/wpd-to-pdf.md b/docs/ja/tools/wpd-to-pdf.md new file mode 100644 index 00000000..27dd3110 --- /dev/null +++ b/docs/ja/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPDからPDF +description: LibreOfficeを使って、WordPerfect(WPD)文書をブラウザ上でPDFに変換します。無料でプライベートです。 +--- + +# WPDからPDF + +Corel WordPerfectの文書をPDFファイルに変換します。WPDは、かつて法律事務所や政府機関で主流だったワープロ形式でした。最近のソフトウェアでは開けない古いWordPerfectファイルを、標準的なPDFとしてよみがえらせることができます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :----------- | :----- | :---------------------------------- | +| WordPerfect | `.wpd` | WordPerfectの主要なバージョンすべて | + +## 使い方 + +1. アップロード領域をクリックするか、WPDファイルをドラッグ&ドロップします。複数のファイルを一度に選択できます。 +2. ファイル一覧を確認します。不要なファイルはゴミ箱アイコンで削除するか、**さらにファイルを追加する**で文書を追加します。 +3. **PDFに変換**をクリックします。ツールがLibreOfficeベースの変換エンジンをブラウザに読み込み、WPD形式を解析してPDFを出力します。 +4. 1ファイルの場合は、そのままPDFとしてダウンロードされます。一括変換の場合は、`wpd-to-pdf.zip`という名前のZIPアーカイブが作成されます。 + +## オプション + +設定は不要です。LibreOfficeエンジンが、WPDの書式、フォント、レイアウトを自動的に処理します。 + +## 活用例 + +- WordPerfectで書かれた数十年前の法的文書を開く +- 保管されている政府の提出書類をWPDから最新の形式に変換する +- 従来のWordPerfect文書ライブラリを、長期保存用にPDFへ移行する +- Corel WordPerfectをインストールしていない相手と、WPDファイルを共有する + +## ヒント + +- LibreOfficeエンジンは初回の使用時に読み込まれるため、少し時間がかかります。同じセッション内の以降の変換は、より速くなります。 +- 複雑なWPDのマクロやコード表示は保持されませんが、見た目のレイアウト、テキスト内容、基本的な書式はPDFに引き継がれます。 + +## 関連ツール + +- [WPSからPDF](./wps-to-pdf) +- [ODGからPDF](./odg-to-pdf) diff --git a/docs/ja/tools/wps-to-pdf.md b/docs/ja/tools/wps-to-pdf.md new file mode 100644 index 00000000..2caef01f --- /dev/null +++ b/docs/ja/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPSからPDF +description: Microsoft Works(WPS)文書をブラウザ上でPDFに変換します。無料、登録不要、完全にプライベートです。 +--- + +# WPSからPDF + +Microsoft Worksのワープロファイルを、PDFに変換します。Microsoft Worksは1990年代後半から2000年代にかけて、家庭向けPCにバンドルされており、多くのWPSファイルが今も古いハードディスクやメールのアーカイブに残っています。このツールは、それらをブラウザ上で開き、きれいなPDFを作成します。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :-------------- | :----- | :-------------------------------- | +| Microsoft Works | `.wps` | Microsoft Worksのワープロファイル | + +## 使い方 + +1. アップロード領域をクリックするか、WPSファイルをドラッグ&ドロップします。複数のファイルを受け付けます。 +2. ファイル一覧を確認します。ゴミ箱アイコンで個別のファイルを削除するか、**さらにファイルを追加する**をクリックしてバッチを広げます。 +3. **PDFに変換**をクリックします。LibreOfficeベースのエンジンがブラウザに読み込まれ、各WPS文書をPDFに変換します。 +4. 1ファイルの場合は、そのままPDFとしてダウンロードされます。複数ファイルの場合は、`wps-to-pdf.zip`という名前のZIPアーカイブにまとめられます。 + +## オプション + +追加の設定は不要です。コンバーターは、WPSファイルのテキスト、基本的な書式、埋め込み画像を処理します。 + +## 活用例 + +- Microsoft Works形式で保存された、古い学校や仕事の文書を復元する +- Microsoft Worksをインストールしていなくても、メールに添付されたWPSファイルを開く +- WPSファイルのアーカイブを、最新の文書システムへ移行するために変換する +- 現在のワープロでは開けない古い文書を印刷する + +## ヒント + +- Microsoft Worksの`.wps`ファイルを、WPS Officeのファイルと混同しないでください。このツールは、古いMicrosoft Works形式専用です。 +- LibreOfficeエンジンは初回の使用時に読み込みに少し時間がかかります。読み込み後は、同じセッション内の追加の変換がより速く実行されます。 + +## 関連ツール + +- [WPDからPDF](./wpd-to-pdf) +- [PUBからPDF](./pub-to-pdf) diff --git a/docs/ja/tools/xml-to-pdf.md b/docs/ja/tools/xml-to-pdf.md new file mode 100644 index 00000000..358255d0 --- /dev/null +++ b/docs/ja/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XMLからPDF +description: XMLファイルを、構造化されたPDF文書にブラウザ上で変換します。無料でプライベート、サーバー処理はありません。 +--- + +# XMLからPDF + +XMLデータファイルを、読みやすく構造化されたPDF文書に変換します。生のXMLは強力ですが、人間には読みにくいものです。このツールはXMLツリーを解析し、繰り返されるデータ構造を見つけて、横向きのA4 PDFに整形された表とセクションとしてレンダリングします。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :----------- | :----- | :---------------------------- | +| XML | `.xml` | 整形式のXML文書であれば何でも | + +## 使い方 + +1. アップロード領域をクリックするか、XMLファイルをドラッグ&ドロップします。複数のファイルを1つのバッチで処理できます。 +2. ファイル一覧を確認します。不要なファイルはゴミ箱アイコンで削除するか、**さらにファイルを追加する**をクリックしてファイルを追加します。 +3. **PDFに変換**をクリックします。ツールはブラウザ組み込みのDOMParserでXML構造を解析し、データ階層を分析して、jsPDFのauto-table書式でPDFにレンダリングします。 +4. 1ファイルの場合は、PDFとしてダウンロードされます。複数の変換結果は`xml-to-pdf.zip`にまとめられます。 + +## オプション + +手動の設定は不要です。コンバーターはXML構造を自動的に検出し、適切な表のレイアウトを選択します。出力は、横幅の広いデータセットに対応するため、横向きのA4になります。 + +## 活用例 + +- データベースやAPIから書き出したXMLデータを、印刷可能なレポートにする +- XML設定ファイルから、読みやすい概要を作成する +- XMLベースの請求書や取引ログを、記録保管用のPDFに変換する +- XMLサイトマップやRSSフィードを、文書の形で読みやすくする + +## ヒント + +- XMLは整形式である必要があります。パーサーが構文エラーを検出した場合、問題箇所を示す具体的なエラーメッセージとともに変換が失敗します。 +- 深くネストされたXML構造は、表に平坦化されます。最良の結果を得るには、データに、一貫した子要素を持つ繰り返しの兄弟要素が含まれているようにしてください。 +- 変換中は、読み込み、解析、分析、レンダリングという各段階を示す進行状況が表示されます。 + +## 関連ツール + +- [FB2からPDF](./fb2-to-pdf) +- [XPSからPDF](./xps-to-pdf) +- [電子メールからPDF](./email-to-pdf) diff --git a/docs/ja/tools/xps-to-pdf.md b/docs/ja/tools/xps-to-pdf.md new file mode 100644 index 00000000..4d312949 --- /dev/null +++ b/docs/ja/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPSからPDF +description: XPSとOXPS文書をブラウザ上でPDF形式に変換します。アップロード不要、登録不要、完全にプライベートです。 +--- + +# XPSからPDF + +Microsoft XPSおよびOXPS文書を、標準的なPDFファイルに変換します。XPS(XML Paper Specification)はPDFに対抗するMicrosoftの規格でしたが、対応するプラットフォームは減っています。このツールを使えば、そうした文書をふたたび誰でも読めるようにできます。 + +## 対応フォーマット + +| フォーマット | 拡張子 | 備考 | +| :----------- | :------ | :--------------------------------- | +| XPS | `.xps` | Microsoft独自の元のXPS形式 | +| OXPS | `.oxps` | Open XPS、ECMA-388標準のバリアント | + +## 使い方 + +1. アップロード領域をクリックするか、XPS/OXPSファイルをドラッグ&ドロップします。複数のファイルを一度に選択できます。 +2. ファイル一覧を確認します。個別のファイルはゴミ箱アイコンで削除するか、**さらにファイルを追加する**をクリックして文書を追加します。 +3. **PDFに変換**をクリックします。PyMuPDFエンジンが、各文書をブラウザ内でローカルに処理します。 +4. 1ファイルの場合は、そのままPDFとしてダウンロードされます。複数ファイルの場合は、`xps-converted.zip`という名前のZIPアーカイブにまとめられます。 + +## オプション + +このツールは、追加の設定なしで直接フォーマットを変換します。出力では、XPS元データのページサイズ、ベクターグラフィックス、フォント、画像が維持されます。 + +## 活用例 + +- XPS印刷ドライバーが既定だった古いWindowsシステムから受け取ったXPSファイルを開く +- Windows 10/11のOXPS文書を、macOSやLinuxのユーザーと共有できるように変換する +- 古いXPSファイルを、より広く対応された形式で保管する +- XPSベースの政府文書や企業文書を、外部の受取人が利用できるようにする + +## ヒント + +- `.xps`と`.oxps`の両方の拡張子が自動的に処理されるため、同じバッチに混在させることができます。 +- 元のXPSファイルが高解像度の印刷ドライバーで作成されていた場合、生成されるPDFもその品質を維持します。再サンプリングは行われません。 + +## 関連ツール + +- [WordからPDF](./word-to-pdf) +- [XMLからPDF](./xml-to-pdf) diff --git a/docs/ko/contributing.md b/docs/ko/contributing.md new file mode 100644 index 00000000..d6045265 --- /dev/null +++ b/docs/ko/contributing.md @@ -0,0 +1,136 @@ +# 기여하기 + +BentoPDF에 기여해 주셔서 감사합니다! 이 가이드를 따라 쉽게 시작해 보세요. + +## 시작하기 + +### 사전 요구 사항 + +- Node.js 18+ +- npm 9+ +- Git + +### 설정 + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 프로젝트 구조 + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## 새 도구 추가하기 + +### 1단계: 로직 파일 만들기 + +`src/js/logic/your-tool-page.ts`를 만드세요: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### 2단계: HTML 페이지 만들기 + +기존 도구 템플릿을 참고하여 `src/pages/your-tool.html`을 만드세요. + +### 3단계: 도구 등록하기 + +`src/js/config/tools.ts`에 다음을 추가하세요: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### 4단계: 빌드 설정에 추가하기 + +`vite.config.ts`에 페이지를 추가하세요: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### 5단계: 번역 추가하기 + +`public/locales/`의 모든 로케일 파일에 항목을 추가하세요: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## 코드 스타일 + +- 모든 새 코드는 TypeScript로 작성하세요 +- 일관성을 위해 기존 패턴을 따르세요 +- 커밋하기 전에 `npm run format`을 실행하세요 +- 프로덕션 코드에는 주석을 넣지 마세요 (주석은 빌드 중에 제거됩니다) + +## 풀 리퀘스트 절차 + +1. 기능 브랜치를 만드세요: `git checkout -b feature/your-feature` +2. 변경 사항을 작성하세요 +3. 꼼꼼히 테스트하세요: `npm run build` +4. 변경 내용을 명확히 설명하여 PR을 제출하세요 + +## 번역 + +새 언어를 추가하는 방법은 [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md)를 참고하세요. + +## 기여자 라이선스 계약 + +PR이 병합되기 전에 CLA에 서명해야 합니다: + +- [개인 CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [법인 CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## 도움 받기 + +- [GitHub 이슈](https://github.com/alam00000/bentopdf/issues) +- [Discord 커뮤니티](https://discord.gg/Bgq3Ay3f2w) + +## 라이선스 + +BentoPDF는 듀얼 라이선스로 제공됩니다: + +- **AGPL-3.0**: 전체 소스 코드를 공개적으로 공유하는 오픈소스 프로젝트용 +- **상용 라이선스**: 독점/비공개 소스 애플리케이션용 - [평생 라이선스 $79에 구매하기](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +기여하면 기여한 내용이 위 조건에 따라 라이선스된다는 데 동의하는 것으로 간주됩니다. diff --git a/docs/ko/getting-started.md b/docs/ko/getting-started.md new file mode 100644 index 00000000..66ca312b --- /dev/null +++ b/docs/ko/getting-started.md @@ -0,0 +1,80 @@ +# 시작하기 + +BentoPDF에 오신 것을 환영합니다! 이 가이드로 빠르게 시작해 보세요. + +## BentoPDF란? + +BentoPDF는 **브라우저에서 전부 실행되는** 무료 오픈소스 개인정보 보호 중심 PDF 도구 모음입니다. 파일이 기기 밖으로 나가지 않으며, 모든 처리는 WebAssembly(WASM) 기술로 로컬에서 이루어집니다. + +## 빠른 시작 + +### 옵션 1: 호스팅 버전 사용하기 + +[bentopdf.com](https://www.bentopdf.com)에 접속하면 설치 없이 바로 BentoPDF를 사용할 수 있습니다. + +### 옵션 2: Docker로 직접 호스팅하기 + +> [!IMPORTANT] +> Office 파일 변환에는 `SharedArrayBuffer`가 필요하며, 다음이 모두 충족되어야 합니다: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - 보안 컨텍스트 +> +> `http://localhost`는 브라우저가 루프백을 신뢰할 수 있는 주소로 취급하므로 로컬 테스트에서 작동합니다. `http://192.168.x.x` 같은 LAN IP는 대체로 그렇지 않으므로, 네트워크의 다른 기기에서 접속할 때 Word/Excel/PowerPoint 변환에는 HTTPS가 필요합니다. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF는 두 가지 빌드로 제공됩니다. 위에서 사용한 **셀프 호스팅 빌드**(`bentopdf-simple`)는 내부/팀/조직 배포용이고, **상용 빌드**(`bentopdf:latest`)는 bentopdf.com 자체와 공개 서비스를 운영하는 상용 라이선스 보유자가 사용합니다. 두 빌드 모두 같은 PDF 도구를 제공하며, 상용 빌드에는 bentopdf.com의 히어로, FAQ, 후기, 푸터가 추가됩니다. 잘 모르겠다면 셀프 호스팅 빌드를 사용하세요. + +그런 다음 브라우저에서 `http://localhost:3000`을 여세요. + +> [!NOTE] +> 폐쇄망 OCR 배포를 준비한다면 Tesseract 워커, 코어 런타임, traineddata 파일 외에 OCR 텍스트 레이어 글꼴도 내부에서 호스팅해야 합니다. `VITE_OCR_FONT_BASE_URL`과 번들된 `ocr-fonts/` 디렉터리를 포함한 전체 설정은 [셀프 호스팅](/ko/self-hosting/)에 문서화되어 있습니다. + +### 옵션 3: 소스에서 빌드하기 + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 한눈에 보는 기능 + +| 카테고리 | 도구 | +| ---------------- | -------------------------------------------------------- | +| **PDF로 변환** | Word, Excel, PowerPoint, 이미지, Markdown, EPUB, MOBI 등 | +| **PDF에서 변환** | JPG, PNG, 텍스트, Excel, SVG 등 | +| **편집 및 주석** | 서명, 하이라이트, 민감 정보 삭제, 양식 작성, 스탬프 추가 | +| **정리** | 병합, 분할, 회전, 페이지 삭제, 순서 변경 | +| **최적화** | 압축, 복구, 평탄화, OCR | +| **보안** | 암호화, 복호화, 제한 해제 | + +## 브라우저 지원 + +BentoPDF는 최신 브라우저에서 가장 잘 작동합니다: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## 다음 단계 + +- [모든 도구 살펴보기](/ko/tools/) +- [BentoPDF 직접 호스팅하기](/ko/self-hosting/) +- [프로젝트에 기여하기](/ko/contributing) diff --git a/docs/ko/index.md b/docs/ko/index.md new file mode 100644 index 00000000..69316e84 --- /dev/null +++ b/docs/ko/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: '무료 오픈소스 PDF 도구' + tagline: 브라우저에서 PDF를 전부 처리하세요. 업로드 없음. 서버 없음. 완벽한 개인정보 보호. + actions: + - theme: brand + text: 시작하기 + link: /ko/getting-started + - theme: alt + text: 도구 보기 + link: /ko/tools/ + - theme: alt + text: 직접 호스팅 + link: /ko/self-hosting/ + - theme: alt + text: 상용 라이선스 + link: /ko/licensing + +features: + - icon: 🔒 + title: 100% 개인정보 보호 + details: 파일이 기기 밖으로 나가지 않습니다. 모든 처리는 WebAssembly를 사용해 브라우저에서 로컬로 이루어집니다. + - icon: ⚡ + title: 빠르고 무료 + details: 회원가입, 제한, 워터마크가 없습니다. 무제한으로 PDF를 영원히 무료로 처리하세요. + - icon: 🛠️ + title: 50개 이상의 도구 + details: 변환, 편집, 병합, 분할, 압축, 서명, OCR 등. 필요한 모든 것을 한곳에서. + + - icon: 🌐 + title: 직접 호스팅 가능 + details: 자체 인프라에 배포하세요. Docker, Vercel, Netlify, AWS는 물론, 셀프 호스팅 OCR 워커, 언어 데이터, 텍스트 레이어 글꼴을 갖춘 완전 폐쇄망 환경까지 지원합니다. +--- + +## 오프라인 OCR + +폐쇄망이나 오프라인 환경에서 BentoPDF를 직접 호스팅하는 경우, OCR에는 Tesseract 워커와 traineddata 파일 외에도 필요한 것이 있습니다. 검색 가능한 PDF를 만들려면 OCR 텍스트 레이어 글꼴도 내부에서 제공해야 합니다. +`VITE_OCR_FONT_BASE_URL`, 번들된 `ocr-fonts/` 디렉터리, 업데이트된 폐쇄망 워크플로를 포함한 전체 설정은 [셀프 호스팅](/ko/self-hosting/)을 참고하세요. diff --git a/docs/ko/licensing.md b/docs/ko/licensing.md new file mode 100644 index 00000000..45002120 --- /dev/null +++ b/docs/ko/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/ko/self-hosting/#wasm-구성-agpl-구성-요소) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/ko/self-hosting/apache.md b/docs/ko/self-hosting/apache.md new file mode 100644 index 00000000..e1e81a6a --- /dev/null +++ b/docs/ko/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Apache로 배포하기 + +Apache HTTP Server로 BentoPDF를 호스팅하세요. + +## 사전 요구 사항 + +- Apache 2.4+ +- mod_rewrite 활성화 +- SSL 인증서 (권장) + +## 1단계: 프로젝트 빌드 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +브랜딩을 변경하려면 빌드하기 전에 환경 변수를 설정하세요: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## 2단계: 파일 복사 + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## 3단계: Apache 설정 + +`/etc/apache2/sites-available/bentopdf.conf`를 만드세요: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## 4단계: 라우팅용 .htaccess + +`/var/www/bentopdf/.htaccess`를 만드세요: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## 5단계: 필요한 모듈 활성화 + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## 6단계: 사이트 활성화 + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## 하위 디렉터리 배포 + +`/pdf/`에 호스팅하려면: + +1. 기본 URL을 지정하여 빌드하세요: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. `.htaccess`를 업데이트하세요: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## 문제 해결 + +### WASM 404 오류 + +MIME 타입이 설정되어 있는지 확인하세요: + +```apache +AddType application/wasm .wasm +``` + +### PDF 서명 또는 Form Filler에 빈 뷰어가 표시됨 (`.mjs` MIME 오류) + +브라우저 콘솔에 다음과 같은 메시지가 표시되는 경우: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…그리고 실패한 요청이 `.mjs`로 끝난다면, Apache 설정에 `.mjs → application/javascript` 매핑이 없는 것입니다. 번들된 PDF 뷰어는 `.mjs` 확장자의 ES 모듈 파일을 포함하며, Apache 기본 `mime.types`에는 이 확장자가 들어 있지 않습니다. + +VirtualHost 또는 `.htaccess`에 다음을 추가하세요: + +```apache +AddType application/javascript .mjs +``` + +그런 다음 Apache를 다시 로드하세요: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +확인하려면 브라우저 DevTools의 Network 탭에서 실패한 `.mjs` 요청을 찾아 `Content-Type` 응답 헤더를 확인하세요. 이제 `application/octet-stream`이 아니라 `application/javascript`여야 합니다. + +### Rewrite가 작동하지 않음 + +mod_rewrite가 활성화되어 있는지 확인하세요: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel을 PDF로 변환이 작동하지 않음 + +LibreOffice WASM에는 `SharedArrayBuffer`가 필요하며, 이를 위해 다음 헤더가 필요합니다: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +보안 컨텍스트도 필요합니다. `http://localhost`는 로컬 테스트에서 작동하지만, `http://192.168.x.x` 같은 LAN IP는 대체로 HTTPS가 필요합니다. 헤더가 있는데도 `window.crossOriginIsolated`가 계속 `false`라면, 페이지가 루프백이 아닌 origin에서 일반 HTTP로 열려 있는지 확인하세요. + +미리 압축된 `.wasm.gz` 및 `.data.gz` 파일에도 올바른 `Content-Encoding`이 필요합니다: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +`mod_headers`가 활성화되어 있는지 확인하세요: `sudo a2enmod headers` + +### 권한 거부 + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/ko/self-hosting/aws.md b/docs/ko/self-hosting/aws.md new file mode 100644 index 00000000..2c43dea1 --- /dev/null +++ b/docs/ko/self-hosting/aws.md @@ -0,0 +1,200 @@ +# AWS S3 + CloudFront에 배포하기 + +최대한의 제어와 확장성을 위해 AWS에서 BentoPDF를 호스팅하세요. + +## 아키텍처 + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## 1단계: S3 버킷 만들기 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## 2단계: 빌드 및 업로드 + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## 3단계: CloudFront 배포 만들기 + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +또는 AWS 콘솔을 사용하세요: + +1. CloudFront → Create distribution으로 이동합니다 +2. Origin domain: S3 버킷을 선택합니다 +3. "Origin Access Control"을 활성화합니다 +4. Default root object: `index.html` +5. 배포를 만듭니다 + +## 3b단계: 응답 헤더 정책 (LibreOffice WASM에 필수) + +LibreOffice 기반 변환(Word, Excel, PowerPoint를 PDF로)에는 `SharedArrayBuffer`가 필요하며, 이를 위해 특정 응답 헤더가 필요합니다. CloudFront 응답 헤더 정책을 만드세요: + +1. CloudFront → Policies → Response headers로 이동합니다 +2. 다음 헤더로 사용자 지정 정책을 만듭니다: + +| 헤더 | 값 | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. 정책을 배포의 기본 캐시 동작에 연결합니다 + +또는 CLI로: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## 3c단계: 미리 압축된 WASM 파일의 S3 메타데이터 + +LibreOffice WASM 파일은 미리 압축되어 있습니다 (`.wasm.gz`, `.data.gz`). 브라우저가 압축을 풀 수 있도록 올바른 Content-Type과 Content-Encoding을 설정하세요: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning 중요 +응답 헤더 정책이 없으면 `SharedArrayBuffer`를 사용할 수 없고 LibreOffice WASM 변환이 약 55%에서 멈춥니다. `.gz` 파일에 올바른 Content-Encoding이 없으면 브라우저가 원시 gzip 바이트를 받게 되어 WASM 컴파일이 실패합니다. +::: + +## 4단계: S3 버킷 정책 + +CloudFront가 버킷에 접근할 수 있도록 허용합니다: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## 5단계: 사용자 지정 오류 페이지 + +SPA 라우팅을 위해 404가 `index.html`을 반환하도록 설정하세요: + +1. CloudFront → Error pages +2. 사용자 지정 오류 응답을 만듭니다: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## 비용 예상 + +| 리소스 | 예상 비용 | +| ---------------------- | --------- | +| S3 스토리지 (~500MB) | ~$0.01/월 | +| CloudFront (1TB 전송) | ~$85/월 | +| CloudFront (10GB 전송) | ~$0.85/월 | + +::: tip +자주 접근하지 않는 파일의 비용을 최적화하려면 S3 Intelligent Tiering을 사용하세요. +::: + +## Terraform으로 자동화 + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/ko/self-hosting/cloudflare.md b/docs/ko/self-hosting/cloudflare.md new file mode 100644 index 00000000..824c955f --- /dev/null +++ b/docs/ko/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Cloudflare Pages에 배포하기 + +[Cloudflare Pages](https://pages.cloudflare.com)는 대역폭 제한 없이 빠른 글로벌 정적 사이트 호스팅을 제공합니다. + +## 빠른 배포 + +1. [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages)로 이동합니다 +2. "Create a project"를 클릭합니다 +3. GitHub 저장소를 연결합니다 + +## 빌드 설정 + +| 설정 | 값 | +| ------------------ | --------------- | +| 프레임워크 프리셋 | None | +| 빌드 명령어 | `npm run build` | +| 빌드 출력 디렉터리 | `dist` | +| 루트 디렉터리 | `/` | + +## 환경 변수 + +Settings → Environment variables에서 다음을 추가하세요: + +| 변수 | 값 | +| ----------------------- | ------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (선택) | +| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 (선택) | +| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 (선택) | +| `VITE_FOOTER_TEXT` | 사용자 지정 푸터/저작권 텍스트 (선택) | +| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어, 예: `fr` (선택) | + +## 설정 파일 + +`public` 폴더에 `_headers`를 만드세요: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning 중요 +Word/ODT/Excel/PowerPoint를 PDF로 변환하려면 `Cross-Origin-Embedder-Policy` 및 `Cross-Origin-Opener-Policy` 헤더가 필요합니다. 이 헤더가 없으면 `SharedArrayBuffer`를 사용할 수 없고 LibreOffice WASM 엔진이 초기화되지 못합니다. +::: + +SPA 라우팅을 위해 `_redirects`를 만드세요: + +``` +/* /index.html 200 +``` + +## 사용자 지정 도메인 + +1. Pages 프로젝트로 이동합니다 +2. "Custom domains"를 클릭합니다 +3. 도메인을 추가합니다 +4. 도메인이 Cloudflare에 있으면 Cloudflare가 DNS를 자동으로 설정합니다 + +## 장점 + +- **무료 무제한 대역폭** +- 300개 이상의 엣지 로케이션을 갖춘 **글로벌 CDN** +- **자동 HTTPS** +- 풀 리퀘스트용 **미리보기 배포** +- **빠른 빌드** + +## 문제 해결 + +### 대용량 파일 업로드 + +Cloudflare Pages는 최대 25MB 파일을 지원합니다. WASM 모듈은 문제없겠지만 제한에 걸린다면 다음을 고려하세요: + +```bash +# Split large files during build +npm run build +``` + +### Worker 크기 제한 + +고급 라우팅에 Cloudflare Workers를 사용하는 경우, 무료 플랜에는 1MB 제한이 있다는 점에 유의하세요. + +## CORS 프록시 Worker (디지털 서명용) + +디지털 서명 도구는 인증서 체인을 가져오기 위해 CORS 프록시가 필요합니다. 포함된 worker를 배포하세요: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### 보안 기능 + +| 기능 | 설명 | +| ------------------ | ------------------------ | +| **URL 제한** | 인증서 URL만 허용 | +| **파일 크기 제한** | 요청당 최대 10MB | +| **속도 제한** | IP당 분당 60회 (KV 필요) | +| **사설 IP 차단** | localhost, 내부 IP 차단 | + +### 속도 제한 활성화 + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### 프록시 URL로 빌드 + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +또는 Docker로: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **참고:** HMAC 서명 설정은 [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required)를 참고하세요. diff --git a/docs/ko/self-hosting/cors-proxy.md b/docs/ko/self-hosting/cors-proxy.md new file mode 100644 index 00000000..4be25dcd --- /dev/null +++ b/docs/ko/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# 인증서 가져오기용 CORS 프록시 + +디지털 서명 도구는 CORS 프록시를 사용해 외부 인증 기관(CA)에서 발급자 인증서를 가져옵니다. 많은 CA 서버가 응답에 CORS 헤더를 포함하지 않아 브라우저에서 직접 가져올 수 없기 때문입니다. + +또한 많은 CA 서버가 일반 HTTP로 인증서를 제공합니다. BentoPDF 인스턴스가 HTTPS로 호스팅되면 브라우저가 이러한 HTTP 요청을 차단합니다(혼합 콘텐츠 정책). CORS 프록시는 적절한 헤더를 붙인 HTTPS 엔드포인트를 거쳐 요청을 전달하여 두 문제를 모두 해결합니다. + +## 작동 방식 + +인증서로 PDF에 서명할 때: + +1. `zgapdfsigner` 라이브러리가 전체 인증서 체인을 구성하려고 시도합니다 +2. 인증서의 AIA(Authority Information Access) 확장에 포함된 URL에서 발급자 인증서를 가져옵니다 +3. 이 요청은 필요한 `Access-Control-Allow-Origin` 헤더를 추가하는 CORS 프록시를 거칩니다 +4. 프록시가 인증서 데이터를 브라우저에 반환합니다 + +## CORS 프록시 직접 호스팅하기 + +BentoPDF를 직접 호스팅한다면, 체인 가져오기가 필요한 인증서로 디지털 서명이 작동하도록 자체 CORS 프록시를 배포해야 합니다. + +### 옵션 1: Cloudflare Workers (권장) + +1. **Wrangler CLI 설치**: + + ```bash + npm install -g wrangler + ``` + +2. **Cloudflare에 로그인**: + + ```bash + wrangler login + ``` + +3. **BentoPDF를 클론하고 허용 origin 업데이트**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + `cors-proxy-worker.js`를 열고 `ALLOWED_ORIGINS` 배열을 사용자의 도메인으로 변경하세요: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning 중요 + 이 변경이 없으면 프록시가 사이트의 모든 요청을 **403 Forbidden** 오류로 거부합니다. 기본값은 `bentopdf.com`의 요청만 허용합니다. + ::: + +4. **프록시 배포**: + + ```bash + wrangler deploy + ``` + + worker URL을 메모해 두세요 (예: `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **프록시 URL로 BentoPDF 다시 빌드**: + + Docker를 사용하는 경우: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + 소스에서 빌드하는 경우: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### 옵션 2: 사용자 지정 백엔드 프록시 + +자체 프록시 엔드포인트를 만들 수도 있습니다. 요구 사항은 다음과 같습니다: + +1. `url` 쿼리 매개변수가 있는 GET 요청을 받습니다 +2. 서버에서 해당 URL을 가져옵니다 (서버 측에는 CORS 제한이 없습니다) +3. 다음 헤더와 함께 응답을 반환합니다: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Express.js 구현 예시: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## 보안 고려 사항 + +포함된 Cloudflare Worker에는 여러 보안 장치가 있습니다: + +| 기능 | 설명 | +| ----------------------- | --------------------------------------------------------------------------- | +| **Origin 검증** | `ALLOWED_ORIGINS`에 나열된 도메인의 요청만 허용 | +| **URL 제한** | 인증서 URL만 허용 (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **사설 IP 차단** | IPv4/IPv6 사설 대역, 링크 로컬, 루프백, 십진수 IP, 클라우드 메타데이터 차단 | +| **Content-Type 안전성** | 안전한 인증서 MIME 타입만 반환하고, 업스트림 content-type 주입 차단 | +| **파일 크기 제한** | 응답을 10MB 제한으로 스트리밍하며, 초과하면 다운로드 도중 중단 | +| **속도 제한** | IP 또는 IPv6 /64당 분당 60회 (KV 필요, KV 오류 시 fail open) | +| **HMAC 서명** | 선택적 클라이언트 측 서명 (단순한 악용 억제) | + +### DNS 리바인딩 (Cloudflare 외부에서 직접 호스팅하는 경우) + +worker는 사설 또는 내부 IP로 확인되는 모든 URL을 거부합니다. 인증서 체인 URL은 인증서를 발급한 CA(FNMT, 기업 CA 등)가 가리키는 곳 어디든 될 수 있어 미리 정해진 호스트 허용 목록을 쓸 수 없고, 목적지를 사전에 알 수 없습니다. 그래서 작은 리바인딩 틈이 남습니다. 자기 도메인의 DNS를 운영하는 누군가가 안전 검사에는 공개 IP를, 잠시 후의 실제 요청에는 사설 IP를 돌려줄 수 있습니다. + +Cloudflare에서는 악용할 수 없습니다. Workers는 사설 IP나 `169.254.169.254` 메타데이터 엔드포인트에 접근할 수 없으므로 리바인딩해도 아무것도 닿지 않습니다. 다만 worker에 진입 경로를 만들지 마세요. Tunnel, Service, 사설 네트워크 바인딩을 연결하지 마세요 (필요한 것은 `RATE_LIMIT_KV`뿐입니다). + +VPC 안에서 Cloudflare 외부(workerd, Node 등)로 실행하면 런타임이 내부 IP에 _접근할 수 있습니다_. 앞단에 송신 방화벽을 두고 사설 대역(`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` 및 해당 IPv6 대역)을 차단하세요. Cloudflare를 벗어나면 앱 코드로는 이를 강제할 수 없습니다. + +## 프록시 비활성화 + +CORS 프록시를 사용하고 싶지 않다면 환경 변수를 빈 문자열로 설정하세요: + +``` +VITE_CORS_PROXY_URL= +``` + +**참고**: 프록시가 없으면 외부 체인 가져오기가 필요한 인증서(FNMT 또는 일부 기업 CA 등)로 서명할 때 "Failed to fetch" 오류가 발생합니다. + +## 문제 해결 + +### "Signing error: TypeError: Failed to fetch" + +보통 다음 중 하나를 의미합니다: + +1. **CORS 프록시가 설정되지 않음**: `VITE_CORS_PROXY_URL`을 설정하고 다시 빌드하세요 +2. **혼합 콘텐츠 차단됨**: 사이트는 HTTPS인데 인증서의 발급자 URL은 HTTP입니다. CORS 프록시가 이를 해결합니다. +3. **CORS 프록시가 origin을 거부함**: `cors-proxy-worker.js`의 `ALLOWED_ORIGINS` 배열에 도메인이 있는지 확인하세요 + +### 프록시에서 "403 Forbidden" + +도메인이 `ALLOWED_ORIGINS` 목록에 없습니다. `cors-proxy-worker.js`를 수정하세요: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +그런 다음 다시 배포하세요: `npx wrangler deploy` + +### 프록시 테스트 + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### 프록시 없이 작동하는 인증서 + +일부 인증서는 P12/PFX 파일에 전체 체인이 포함되어 있어 외부 가져오기가 필요하지 않습니다: + +- 자체 서명 인증서 +- 중간 인증서를 번들하는 일부 상용 CA +- 전체 체인을 직접 조립한 인증서 diff --git a/docs/ko/self-hosting/docker.md b/docs/ko/self-hosting/docker.md new file mode 100644 index 00000000..fbb34d7e --- /dev/null +++ b/docs/ko/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Docker / Podman으로 배포하기 + +프로덕션 환경에서 BentoPDF를 직접 호스팅하는 가장 쉬운 방법입니다. + +> [!IMPORTANT] +> **Office 파일 변환에 필요한 헤더** +> +> LibreOffice 기반 도구(Word, Excel, PowerPoint 변환)는 `SharedArrayBuffer` 지원을 위해 다음 HTTP 헤더가 필요합니다: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 페이지는 보안 컨텍스트에서 제공되어야 합니다. `http://localhost`는 로컬 테스트에서 작동하지만, `http://192.168.x.x` 같은 LAN IP는 대체로 해당되지 않으므로 헤더가 있어도 일반 HTTP로는 Office 변환이 실패합니다. +> +> 공식 컨테이너 이미지에는 이 헤더가 포함되어 있습니다. 리버스 프록시(Traefik, Caddy 등)를 사용한다면 이 헤더가 유지되거나 추가되도록 하고, 루프백이 아닌 접근에는 HTTPS를 사용하세요. + +> [!TIP] +> **Podman 사용자:** 모든 `docker` 명령은 `docker`를 `podman`으로, `docker-compose`를 `podman-compose`로 바꾸면 Podman에서도 작동합니다. + +## 빠른 시작 + +> [!TIP] +> BentoPDF는 두 가지 빌드로 제공됩니다: +> +> - **셀프 호스팅 빌드**: `ghcr.io/alam00000/bentopdf-simple:latest`. 마케팅 요소(히어로, FAQ, 후기, 푸터)를 **제외한** 모든 PDF 도구를 제공합니다. 내부/팀/조직 배포에 사용하세요. 기능이 줄어든 "라이트" 버전이 **아닙니다**. +> - **상용 빌드**: `ghcr.io/alam00000/bentopdf:latest`. 전체 마케팅 사이트이며, bentopdf.com 자체와 공개 서비스를 운영하는 상용 라이선스 보유자가 사용합니다. +> +> 잘 모르겠다면 셀프 호스팅 빌드를 받으세요. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +`docker-compose.yml`을 만드세요: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +실행: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## 직접 이미지 빌드하기 + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +빌드 및 실행: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## 환경 변수 + +| 변수 | 설명 | 기본값 | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | 셀프 호스팅 변형을 빌드합니다 (bentopdf.com 마케팅 요소인 히어로, FAQ, 후기, 푸터를 숨깁니다). 모든 PDF 도구는 유지됩니다. | `false` | +| `BASE_URL` | 하위 디렉터리에 배포 | `/` | +| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM 모듈 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Ghostscript WASM 모듈 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | CoherentPDF WASM 모듈 URL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | OCR 워커 스크립트 URL | _(비어 있음, Tesseract.js 기본 CDN 사용)_ | +| `VITE_TESSERACT_CORE_URL` | OCR 코어 런타임 디렉터리 | _(비어 있음, Tesseract.js 기본 CDN 사용)_ | +| `VITE_TESSERACT_LANG_URL` | OCR traineddata 디렉터리 | _(비어 있음, Tesseract.js 기본 CDN 사용)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | UI에 표시할 OCR 언어 (쉼표로 구분) | _(비어 있음, 전체 목록 표시)_ | +| `VITE_OCR_FONT_BASE_URL` | OCR 텍스트 레이어 글꼴 디렉터리 | _(비어 있음, 원격 Noto 글꼴 URL 사용)_ | +| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어 | `en` | +| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 | `BentoPDF` | +| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | 사용자 지정 푸터/저작권 텍스트 | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | 숨길 도구 ID (쉼표로 구분) | _(비어 있음, 모든 도구 활성화)_ | +| `DISABLE_GITHUB_STARS` | 페이지 로드 시 GitHub 스타 수 가져오기를 건너뛰고 CSP에서 `api.github.com`을 제거합니다. Simple Mode 빌드는 항상 건너뜁니다. | `false` | +| `SITE_URL` | canonical, hreflang, 사이트맵 링크에 기록되는 공개 URL입니다. 검색 엔진이 사용자의 배포를 독립된 사이트로 취급하길 원하지 않는다면 기본값으로 두세요. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | 사용자 지정 `SITE_URL`을 사용하면 모든 페이지가 `noindex`로 표시되어 사용자의 사본이 검색 결과에서 bentopdf.com과 경쟁하지 않습니다. 검색 엔진이 색인하도록 하려면 `true`로 설정하세요. | `false` | + +WASM 모듈 URL에는 CDN 기본값이 미리 설정되어 있어 모든 고급 기능이 별도 설정 없이 작동합니다. 폐쇄망이나 직접 호스팅하는 배포에서는 이 값을 덮어쓰세요. + +### 검색 엔진 + +기본적으로 모든 페이지는 검색 엔진이 bentopdf.com을 원본으로 인식하도록 하므로 사용자의 배포가 중복으로 표시되지 않습니다. 비공개 또는 내부 인스턴스라면 아무것도 바꿀 필요가 없습니다. + +- **인스턴스를 검색 결과에서 완전히 제외하기:** `-e ROBOTS_NOINDEX=true`로 컨테이너를 실행하세요. 재시작만 하면 되며 다시 빌드할 필요는 없습니다. +- **인스턴스를 검색 결과에서 독립된 사이트로 만들기:** `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`로 빌드하세요. `ALLOW_INDEXING=true`가 없으면 사용자 지정 `SITE_URL`은 모든 페이지를 `noindex`로 표시합니다. + +### Content-Security-Policy + +nginx 이미지에는 적용(enforcing) 모드의 `Content-Security-Policy` 헤더가 포함되어 있습니다. CSP의 `script-src`, `connect-src`, `font-src` 지시어는 위의 `VITE_*` URL 변수로부터 **빌드 시점에 생성**됩니다. `--build-arg`로 전달하는 호스트는 자동으로 정책에 추가됩니다. + +그 결과: + +- 빌드 시 `VITE_CORS_PROXY_URL` 또는 `VITE_WASM_*_URL`을 덮어쓰면 CSP가 해당 origin을 자동으로 허용합니다. 별도 설정이 필요 없습니다. +- `cdn.jsdelivr.net`의 URL에 대해 `script-src`는 전체 CDN이 아니라 버전이 명시된 정확한 패키지 폴더만 허용합니다. 예: `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`. jsDelivr는 모든 공개 npm 패키지와 GitHub 저장소를 제공하므로 호스트 전체를 허용하면 그 어떤 것도 사용자의 인스턴스에서 실행될 수 있기 때문입니다. 다른 호스트의 URL은 origin 단위로 허용됩니다. +- 앱 내 고급 설정 페이지에서 _런타임에_ 사용자 지정 WASM URL을 설정하면 해당 origin은 CSP에 **포함되지 않으며** 브라우저가 해당 가져오기를 차단합니다. `cdn.jsdelivr.net`의 같은 패키지라도 다른 버전이면 마찬가지인데, 빌드 시 설정한 버전만 허용되기 때문입니다. 런타임 설정은 실험용입니다. 영구적인 사용자 지정 URL은 해당 `VITE_*` 빌드 인수를 설정하세요. +- 세 가지 `VITE_WASM_*_URL` 값을 모두 덮어쓰는 폐쇄망 배포는 해당 `cdn.jsdelivr.net` 패키지 폴더도 CSP에서 제거됩니다 (각 기본값은 추가되는 것이 아니라 대체됩니다). `cdn.jsdelivr.net`의 Tesseract OCR 기본값은 `VITE_TESSERACT_*` 세 값도 설정하기 전까지 정책에 남습니다. 마찬가지로 `VITE_CORS_PROXY_URL`을 설정하면 공개 `bentopdf-cors-proxy.bentopdf.workers.dev` 기본값이 대체됩니다. + +CSP의 `script-src`에는 `'unsafe-eval'`이 포함되어 있습니다. LibreOffice WASM 런타임(Word/Excel/PowerPoint 변환 도구에서 사용)과 wasm-vips 이미지 라이브러리(PDF를 TIFF로 도구에서 사용)가 `new Function()`으로 내부 디스패치 코드를 컴파일하기 때문입니다. 이를 제거하면 해당 도구가 작동하지 않습니다. `SIMPLE_MODE`(LibreOffice 없음)로 빌드하고 PDF를 TIFF로 도구가 필요 없다면, 생성된 `security-headers.conf`에서 `'unsafe-eval'`을 직접 제거하여 더 엄격한 정책을 적용할 수 있습니다. + +OCR의 경우 `VITE_TESSERACT_*` 변수를 비워 두면 기본 온라인 에셋을 사용하고, 직접 호스팅하거나 오프라인 OCR을 쓰려면 세 가지를 함께 설정하세요. 워커, 코어 런타임, traineddata 디렉터리가 서로 일치해야 하므로 일부만 덮어쓰는 것은 거부됩니다. 완전히 오프라인으로 검색 가능한 PDF를 만들려면 `VITE_OCR_FONT_BASE_URL`도 설정하여 OCR 텍스트 레이어 글꼴을 공개 Noto 글꼴 URL 대신 내부 서버에서 불러오도록 하세요. + +`VITE_DEFAULT_LANGUAGE`는 처음 방문하는 사용자의 UI 언어를 설정합니다. 지원되는 값: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. 사용자는 언제든 언어를 바꿀 수 있으며, 이 값은 기본값만 바꿉니다. + +예시: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### 사용자 지정 브랜딩 + +기본 BentoPDF 로고, 이름, 푸터 텍스트를 직접 만든 것으로 바꾸세요. 로고 파일을 `public/` 폴더에 두거나(또는 기존 이미지를 사용하고) 빌드 시 브랜딩 변수를 전달하세요: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +브랜딩은 전체 모드와 Simple Mode 모두에서 작동하며 다른 모든 빌드 시점 옵션과 함께 사용할 수 있습니다. + +### 특정 도구 비활성화 + +규정 준수나 보안 요구 사항에 따라 UI에서 도구를 숨길 수 있습니다. 비활성화된 도구는 홈페이지, 검색 결과, 키보드 단축키, 워크플로 빌더에서 제거됩니다. URL로 직접 접근하면 "도구를 사용할 수 없음" 페이지가 표시됩니다. + +도구 ID는 `.html`을 뺀 페이지 URL입니다. 예를 들어 도구가 `bentopdf.com/edit-pdf.html`에 있다면 ID는 `edit-pdf`입니다. + +#### 도구 ID 찾기 + +가장 쉬운 방법: BentoPDF에서 아무 도구나 열고 URL을 보세요. 경로의 마지막 부분(`.html` 제외)이 도구 ID입니다. + +
+전체 도구 ID 목록 + +**편집 및 주석:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**PDF로 변환:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**PDF에서 변환:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**정리 및 관리:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**최적화 및 복구:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**보안:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### 옵션 1: 빌드 시점 (Docker 빌드 인수) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +비활성화 목록이 JavaScript 번들에 포함됩니다. 변경하려면 다시 빌드해야 합니다. + +#### 옵션 2: 런타임 (config.json) + +제공되는 디렉터리에 `config.json` 파일을 마운트하세요. 다시 빌드할 필요가 없습니다: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +또는 Docker Compose로: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +두 방법을 함께 사용할 수 있으며, 목록은 병합됩니다. 둘 중 하나에 있는 도구는 비활성화됩니다. + +#### 에디터 기능 비활성화 + +전체 에디터 도구를 비활성화하지 않고 PDF 에디터 내부의 특정 기능(예: 교정, 주석, 양식)만 비활성화할 수도 있습니다. `config.json`에 `editorDisabledCategories`를 추가하세요: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+전체 에디터 카테고리 목록 + +**확대/축소:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**주석:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**도형:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**양식:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**교정(Redaction):** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**문서:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**페이지:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**패널:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**도구:** `tools`, `pan`, `pointer`, `capture` + +**선택:** `selection`, `selection-copy` + +**기록:** `history`, `history-undo`, `history-redo` + +
+ +카테고리는 계층 구조입니다. 상위 항목(예: `annotation`)을 비활성화하면 모든 하위 항목도 비활성화됩니다. + +### GitHub 스타 카운터 비활성화 + +내비게이션 바에는 페이지 로드 시 `api.github.com`에서 가져오는 실시간 GitHub 스타 수가 표시됩니다. PDF 기능과 무관한 유일한 외부 요청입니다. 빌드 시 비활성화하면 번들에서 가져오기 코드가 제거되고 Content-Security-Policy에서 `api.github.com`이 제거됩니다: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Mode 빌드(`bentopdf-simple`)는 항상 스타 카운터를 건너뜁니다. 이 플래그는 상용 빌드나 사용자 지정 전체 빌드에서만 필요합니다. + +### 사용자 지정 WASM URL (폐쇄망 / 직접 호스팅) + +> [!IMPORTANT] +> WASM URL은 **빌드 시점**에 JavaScript에 포함됩니다. WASM 파일은 런타임에 **사용자의 브라우저**가 다운로드하며, 빌드 중에 Docker가 다운로드하지 않습니다. 폐쇄망에서는 브라우저가 접근할 수 있는 내부 서버에 WASM 파일을 호스팅해야 합니다. + +**전체 폐쇄망 워크플로:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +`--ocr-languages`에는 `bash scripts/prepare-airgap.sh --list-ocr-languages`가 출력하는 코드를 사용하거나, `bash scripts/prepare-airgap.sh --search-ocr-language `으로 이름을 검색하세요. 제한된 OCR 언어 하위 집합으로 빌드할 때는 같은 코드를 `VITE_TESSERACT_AVAILABLE_LANGUAGES`에 전달하여 앱이 번들된 언어만 표시하도록 하세요. 완전한 오프라인 OCR 출력을 위해서는 번들된 `ocr-fonts/` 디렉터리도 호스팅하고 `VITE_OCR_FONT_BASE_URL`이 이를 가리키게 하세요. + +변수를 빈 문자열로 설정하면 해당 모듈이 비활성화됩니다 (사용자가 고급 설정에서 직접 구성해야 합니다). + +## 사용자 지정 포트 + +기본적으로 BentoPDF는 컨테이너 내부에서 `8080` 포트로 수신합니다. 변경하려면 런타임에 `PORT` 환경 변수를 설정하세요: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| 변수 | 설명 | 기본값 | +| ------ | --------------------------- | ------ | +| `PORT` | 컨테이너 내 Nginx 수신 포트 | `8080` | + +표준 Dockerfile과 nonroot Dockerfile 모두에서 작동합니다. + +## 사용자 지정 사용자 ID (PUID/PGID) + +특정 비루트 사용자로 실행해야 하는 환경(NAS 기기, 보안 컨텍스트가 있는 Kubernetes, 조직 정책 등)을 위해 BentoPDF는 LSIO 방식의 PUID/PGID를 지원하는 별도의 Dockerfile을 제공합니다. + +### 빌드 및 실행 + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### 환경 변수 + +| 변수 | 설명 | 기본값 | +| -------------- | -------------------- | ------- | +| `PUID` | 실행할 사용자 ID | `1000` | +| `PGID` | 실행할 그룹 ID | `1000` | +| `PORT` | Nginx 수신 포트 | `8080` | +| `DISABLE_IPV6` | IPv6 리스너 비활성화 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### 작동 방식 + +컨테이너는 root로 시작하여 지정된 PUID/PGID로 사용자를 만들고, 쓰기 가능한 모든 디렉터리의 소유권을 조정한 다음 `su-exec`로 권한을 낮춥니다. nginx 프로세스는 전적으로 지정한 사용자로 실행됩니다. + +> [!NOTE] +> 표준 `Dockerfile`은 `nginx-unprivileged`(UID 101)를 사용하며 대부분의 배포에 권장됩니다. 특정 UID/GID가 필요할 때만 `Dockerfile.nonroot`를 사용하세요. + +> [!WARNING] +> PUID/PGID는 `0`(root)일 수 없습니다. 엔트리포인트가 입력을 검증하고 잘못된 값이면 오류와 함께 종료합니다. + +## Traefik과 함께 사용 (리버스 프록시) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Caddy와 함께 사용 (리버스 프록시) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## 리소스 제한 + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (Systemd 통합) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html)을 사용하면 Podman 컨테이너를 systemd 서비스로 실행할 수 있습니다. Linux 시스템의 프로덕션 배포에 이상적입니다. + +### 기본 Quadlet 설정 + +`~/.config/containers/systemd/bentopdf.container`(사용자) 또는 `/etc/containers/systemd/bentopdf.container`(시스템)에 컨테이너 유닛 파일을 만드세요: + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### 활성화 및 시작 + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> 시스템 전체 배포에는 `--user` 플래그 없이 `systemctl`을 사용하고 파일을 `/etc/containers/systemd/`에 두세요. + +### 헬스 체크가 있는 Quadlet + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Quadlet 자동 업데이트 + +Podman은 새 이미지가 있으면 컨테이너를 자동으로 업데이트할 수 있습니다: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadlet 네트워크 설정 + +사용자 지정 네트워크 설정을 위해 네트워크 파일 `bentopdf.network`를 만드세요: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +그런 다음 컨테이너 파일에서 참조하세요: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## 업데이트 + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/ko/self-hosting/hostinger.md b/docs/ko/self-hosting/hostinger.md new file mode 100644 index 00000000..3ab1c70d --- /dev/null +++ b/docs/ko/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Hostinger에 배포하기 + +[Hostinger](https://hostinger.com)는 인기 있는 공유 호스팅 제공업체입니다. 이 가이드는 Hostinger 공유 호스팅에 BentoPDF를 배포하는 방법을 다룹니다. + +## 사전 요구 사항 + +- 파일 관리자에 접근할 수 있는 Hostinger 호스팅 플랜 +- 빌드를 위해 로컬에 설치된 Node.js + +## 1단계: 프로젝트 빌드 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +빌드된 파일은 `dist` 폴더에 있습니다. + +## 2단계: Hostinger에 업로드 + +### 루트 도메인 배포 + +1. Hostinger 계정에 로그인합니다 +2. **File Manager** → **public_html**로 이동합니다 +3. 기존 파일을 모두 **삭제**합니다 (필요하면 백업하세요) +4. 로컬 `dist` 폴더의 모든 내용을 `public_html`에 **업로드**합니다 + +### 하위 디렉터리 배포 + +하위 디렉터리(예: `yourdomain.com/pdf-tools/`)에 배포하는 경우: + +1. 올바른 기본 URL로 빌드합니다: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Hostinger에서 폴더를 만듭니다: + - **File Manager** → **public_html**로 이동합니다 + - 새 폴더를 만듭니다: `pdf-tools` +3. `dist`의 모든 내용을 `public_html/pdf-tools/`에 업로드합니다 + +## 3단계: .htaccess 파일 만들기 + +배포 폴더의 루트(`public_html` 또는 `public_html/pdf-tools/`)에 `.htaccess` 파일을 만드세요: + +::: warning 중요 +하위 디렉터리에 배포하는 경우 `RewriteBase /`를 `RewriteBase /pdf-tools/`(또는 사용하는 폴더 이름)로 변경하세요. +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## 하위 디렉터리 .htaccess 예시 + +`yourdomain.com/pdf-tools/`의 경우 다음 줄을 업데이트하세요: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## 문제 해결 + +### WASM 파일이 로드되지 않음 + +`.htaccess`에 MIME 타입이 올바르게 설정되어 있는지 확인하세요: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice 도구가 작동하지 않음 + +보안 헤더는 SharedArrayBuffer에 필수입니다: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +헤더가 적용되지 않으면 Hostinger 지원팀에 `mod_headers` 활성화를 요청하세요. + +### 페이지 새로고침 시 404 오류 + +`.html` 확장자 규칙과 언어 라우트가 올바르게 설정되어 있는지 확인하세요. BentoPDF는 SPA 라우팅이 아니라 정적 HTML 파일을 사용합니다: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### 파일 업로드 제한 + +Hostinger에는 파일 크기 제한이 있을 수 있습니다. 일괄 업로드가 실패하면 WASM 파일을 따로 업로드하세요. diff --git a/docs/ko/self-hosting/index.md b/docs/ko/self-hosting/index.md new file mode 100644 index 00000000..d942ee68 --- /dev/null +++ b/docs/ko/self-hosting/index.md @@ -0,0 +1,538 @@ +# 셀프 호스팅 가이드 + +BentoPDF는 자체 인프라에서 셀프 호스팅할 수 있습니다. 이 가이드는 다양한 배포 옵션을 다룹니다. + +## Docker / Podman으로 빠르게 시작하기 + +BentoPDF를 셀프 호스팅하는 가장 빠른 방법입니다. + +> [!TIP] +> BentoPDF는 두 가지 빌드로 제공됩니다. +> +> - **셀프 호스팅 빌드**: `ghcr.io/alam00000/bentopdf-simple:latest`. 마케팅 요소(히어로, FAQ, 후기, 푸터)를 **제외한** 모든 PDF 도구를 제공합니다. 내부/팀/조직 배포에 사용하세요. 기능이 줄어든 "라이트" 버전이 **아닙니다**. +> - **상업용 빌드**: `ghcr.io/alam00000/bentopdf:latest`. 전체 마케팅 사이트를 포함하며 bentopdf.com 자체와, 공개 서비스를 운영하는 상업용 라이선스 보유자가 사용합니다. +> +> 잘 모르겠다면 셀프 호스팅 빌드를 받으세요. + +> [!IMPORTANT] +> Office 파일 변환에는 `SharedArrayBuffer`가 필요하며, 이를 위해 앱이 교차 출처 격리되어 있고 보안 컨텍스트에서 제공되어야 합니다. 공식 이미지는 필요한 COOP/COEP 헤더를 이미 전송하지만, `http://192.168.x.x` 같은 일반 HTTP 로컬 네트워크 출처에서는 브라우저가 여전히 `SharedArrayBuffer`를 비활성화합니다. +> +> `http://localhost`는 같은 기기에서 테스트할 때만 사용하세요. 사용자가 LAN IP나 호스트 이름으로 BentoPDF에 접속한다면 HTTPS로 종단 처리하세요. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +또는 Docker Compose / Podman Compose로: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +BentoPDF를 systemd 서비스로 실행합니다. `~/.config/containers/systemd/bentopdf.container`를 만듭니다. + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Quadlet 전체 문서는 [Docker 배포 가이드](/ko/self-hosting/docker)를 참고하세요. + +## 소스에서 빌드하기 + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## 구성 옵션 + +### 셀프 호스팅 빌드 (Simple Mode) + +셀프 호스팅 빌드(`bentopdf-simple` 이미지, Simple Mode라고도 함)는 상업용 빌드와 **기능이 동일**합니다. 모든 PDF 도구가 들어 있고 똑같이 작동합니다. bentopdf.com 자체나 공개 서비스를 운영하는 상업용 배포에서만 의미가 있는 마케팅 요소만 숨깁니다. **기능이 줄어든 "라이트" 버전이 아닙니다.** + +**셀프 호스팅 빌드가 숨기는 것** (외관상 변경일 뿐이며 PDF 기능은 제거되지 않습니다): + +- 탐색 모음, 히어로 섹션, 기능 섹션, FAQ, 후기, 푸터 +- 페이지 제목을 "PDF 도구"로 변경 + +**셀프 호스팅 빌드가 유지하는 것** (실제 PDF 작업을 수행하는 모든 것): + +- 모든 PDF 도구 (병합, 분할, 편집, 서명, OCR, Office 변환 등) +- 사용자 지정 브랜딩 지원, 모든 빌드 시점 및 런타임 구성 + +상업용 빌드(`ghcr.io/alam00000/bentopdf:latest`)는 bentopdf.com 자체를 구동하며 공개 서비스를 운영하는 상업용 라이선스 보유자가 사용합니다. 내부 도구에는 어울리지 않는 히어로, FAQ, 후기, 푸터가 추가됩니다. + +팀, 조직 또는 내부 도구로 BentoPDF를 셀프 호스팅한다면 셀프 호스팅 빌드를 받으세요. + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +자세한 내용은 [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md)를 참고하세요. + +### 상업용 빌드 (자체 브랜드의 공개 배포) + +상업용 빌드(`bentopdf` 이미지, `-simple` 접미사 없음)는 bentopdf.com 자체를 구동합니다. 모든 PDF 도구에 더해 전체 마케팅 사이트(히어로, 기능, FAQ, 후기, 푸터)를 포함합니다. **자체 브랜드로 BentoPDF를 공개 PDF 서비스로 배포**하려는 경우에 이 빌드를 사용하세요. 예를 들면 다음과 같습니다. + +- 자체 도메인에서 최종 사용자를 위한 호스팅 SaaS로 BentoPDF를 운영하는 경우 +- 도구 화면만이 아니라 랜딩 페이지 경험(마케팅 섹션 + 도구)을 원하는 경우 +- BentoPDF를 상용 제품에 포함하는 상업용 라이선스 보유자인 경우 + +**그대로 실행** (BentoPDF 브랜딩, 빌드를 미리 확인할 때 유용): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**자체 브랜드로 빌드** (일반적인 상업용 워크플로): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +다른 모든 빌드 시점 옵션(`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, WASM URL 재정의 등)은 셀프 호스팅 빌드와 같은 방식으로 작동합니다. + +::: warning 라이선스 +상업용 빌드는 BentoPDF의 두 가지 라이선스 옵션 중 어느 쪽으로든 실행할 수 있습니다. + +- **AGPL-3.0** (무료): 브랜딩 수정과 주변 비즈니스 로직을 포함한 전체 소스 코드를 AGPL로 공개하는 배포에서 허용됩니다. +- **상업용 라이선스** ($79 평생): 브랜딩 포크나 비즈니스 코드를 오픈소스로 공개하지 않는 비공개/독점 배포에 필요합니다. + +전체 비교는 [라이선스 페이지](https://www.bentopdf.com/licensing)를 참고하세요. AGPL 라이선스의 WASM 모듈(PyMuPDF, Ghostscript, CoherentPDF)은 런타임에 CDN에서 로드되므로 이미지에 포함되지 않으며 라이선스 상태에 영향을 주지 않습니다. +::: + +### Base URL + +하위 디렉터리에 배포합니다. + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### 사용자 지정 브랜딩 + +기본 BentoPDF 로고, 이름, 푸터 텍스트를 빌드 시점에 직접 만든 것으로 바꿉니다. + +| 변수 | 설명 | 기본값 | +| ------------------ | ---------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | 헤더와 푸터에 표시되는 브랜드 이름 | `BentoPDF` | +| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | 사용자 지정 푸터/저작권 텍스트 | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +또는 Docker로: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +브랜딩은 전체 모드와 Simple Mode 모두에서 작동하며, 다른 모든 빌드 시점 옵션(`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`)과 함께 사용할 수 있습니다. + +### 특정 도구 비활성화 + +규정 준수나 보안을 위해 개별 도구를 숨깁니다. 비활성화된 도구는 홈페이지, 검색, 단축키, 워크플로 빌더, 직접 URL 접근에서 제거됩니다. + +도구 ID는 `.html`을 뺀 페이지 URL입니다. 아무 도구나 열어 URL을 확인하세요(예: `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**빌드 시점** (번들에 포함됨): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**런타임** (재빌드 불필요, `config.json`을 마운트): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +두 방법을 함께 사용할 수 있으며 목록이 병합됩니다. + +`config.json`에 `editorDisabledCategories`를 추가하면 도구 전체를 비활성화하지 않고 PDF 편집기 내부의 특정 기능(예: 교정)만 비활성화할 수도 있습니다. 전체 카테고리 목록은 [Docker 가이드](/ko/self-hosting/docker#에디터-기능-비활성화)를 참고하세요. + +## 배포 가이드 + +플랫폼을 선택하세요. + +- [Vercel](/ko/self-hosting/vercel) +- [Netlify](/ko/self-hosting/netlify) +- [Cloudflare Pages](/ko/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/ko/self-hosting/aws) +- [Hostinger](/ko/self-hosting/hostinger) +- [Nginx](/ko/self-hosting/nginx) +- [Apache](/ko/self-hosting/apache) +- [Docker](/ko/self-hosting/docker) +- [Kubernetes](/ko/self-hosting/kubernetes) +- [CORS 프록시](/ko/self-hosting/cors-proxy) - 디지털 서명에 필요 + +## 자주 발생하는 문제 + +### Word / ODT / Excel / PowerPoint를 PDF로 변환이 멈춤 (SharedArrayBuffer 사용 불가) + +**증상**: LibreOffice 기반 문서 변환(Word, ODT, Excel, PowerPoint를 PDF로)이 약 55%에서 멈추거나 시작되지 않습니다. 브라우저 콘솔에 다음이 표시될 수 있습니다. + +> `ReferenceError: SharedArrayBuffer is not defined` + +...또는 `window.crossOriginIsolated`가 `false`로 보고되거나, WASM 컴파일이 `expected magic word 00 61 73 6d, found 1f 8b 08 08`을 보고합니다. + +**원인**: LibreOffice WASM에는 `SharedArrayBuffer`가 필요하며, 브라우저는 페이지가 **교차 출처 격리**되어 있고 **보안 컨텍스트**에서 제공될 때만 이를 활성화합니다. 즉 두 가지가 모두 충족되어야 합니다. + +1. 모든 응답에 다음 두 헤더가 포함되어야 합니다. + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. 페이지가 `https://...` 또는 `http://localhost`에서 제공되어야 합니다. LAN IP의 일반 HTTP(예: `http://192.168.x.x`)는 보안 컨텍스트로 인정되지 않으며, 브라우저가 `SharedArrayBuffer`를 비활성화합니다. + +`00 61 73 6d / 1f 8b 08 08` 불일치는 별도의 하위 증상입니다. 미리 압축된 `.wasm.gz` / `.data.gz` 파일에 `Content-Encoding: gzip` 응답 헤더가 없어서 브라우저가 압축 해제된 WASM이 아닌 원시 gzip 바이트를 받는 것입니다. + +**해결**: 정확한 설정은 플랫폼별 배포 가이드를 참고하세요. + +- [Nginx →](/ko/self-hosting/nginx#word-odt-excel을-pdf로-변환이-작동하지-않음) +- [Apache →](/ko/self-hosting/apache#word-odt-excel을-pdf로-변환이-작동하지-않음) +- [AWS S3 + CloudFront →](/ko/self-hosting/aws#_3b단계-응답-헤더-정책-libreoffice-wasm에-필수) +- [Cloudflare Pages →](/ko/self-hosting/cloudflare#설정-파일) (`_headers` 파일) +- [Netlify →](/ko/self-hosting/netlify#word-odt-excel을-pdf로-변환이-55-에서-멈춤) (`netlify.toml`) +- [Vercel →](/ko/self-hosting/vercel#word-odt-excel을-pdf로-변환이-작동하지-않음) (`vercel.json`) +- [Hostinger →](/ko/self-hosting/hostinger#libreoffice-도구가-작동하지-않음) (`.htaccess`) +- [Kubernetes →](/ko/self-hosting/kubernetes#sharedarraybuffer-헤더가-계속-작동하는지-확인-ingress-gateway) +- **Docker**: 번들된 nginx 설정이 자동으로 처리하므로 별도 조치가 필요 없습니다. + +**확인**: 아무 BentoPDF 페이지에서 DevTools 콘솔을 열고 다음을 실행하세요. + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +페이지가 HTTPS 또는 `http://localhost`이고 모든 응답에 COEP/COOP 헤더가 모두 있으면 두 검사 모두 통과합니다. `http://192.168.x.x` 같은 루프백이 아닌 HTTP 출처라면 HTTPS로 종단 처리하세요. 헤더만으로 해결할 방법은 없습니다. + +### `.mjs` 파일이 `application/octet-stream`으로 제공됨 + +**증상**: PDF 서명 / 양식 작성기 / 일부 다른 도구에서 뷰어가 비어 있거나 로드에 실패합니다. 브라우저 콘솔에 다음이 보고됩니다. + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**원인**: 웹 서버나 리버스 프록시에 `.mjs` 파일의 MIME 타입 매핑이 없습니다(내장 PDF 뷰어는 이 확장자의 ES 모듈을 포함합니다). 많은 기본 서버 설정은 인식하지 못하는 확장자를 `application/octet-stream`으로 처리하며, 브라우저는 이를 ES 모듈로 실행하지 않습니다. + +**해결**: 정확한 스니펫은 플랫폼별 배포 가이드를 참고하세요. + +- [Nginx →](/ko/self-hosting/nginx#pdf-서명-또는-양식-작성기에-빈-뷰어가-표시됨-mjs-mime-오류) +- [Apache →](/ko/self-hosting/apache#pdf-서명-또는-form-filler에-빈-뷰어가-표시됨-mjs-mime-오류) +- [AWS S3 + CloudFront →](/ko/self-hosting/aws#_2단계-빌드-및-업로드) (`aws s3 cp ... --include "*.mjs"` 참고) +- [Kubernetes →](/ko/self-hosting/kubernetes#mjs-mime-타입-오류-pdf-서명-양식-작성기-iframe이-비어-있음) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: 자동으로 처리되므로 별도 조치가 필요 없습니다. + +**확인**: DevTools → Network 탭을 열어 실패한 `.mjs` 요청을 찾고 `Content-Type` 응답 헤더를 확인하세요. `application/javascript`여야 합니다. 여전히 `application/octet-stream`이라면 바깥쪽 리버스 프록시나 CDN이 타입을 다시 판별하고 있을 수 있으니, 서비스 경로의 각 계층을 확인하세요. + +## WASM 구성 (AGPL 구성 요소) + +BentoPDF는 AGPL 라이선스 처리 라이브러리를 소스 코드에 **번들하지 않지만**, 모든 기능이 바로 작동하도록 **CDN URL을 미리 구성**해 둡니다. 수동 설정이 필요 없습니다. + +::: tip 기본 제로 설정 +v2.0.0부터 WASM 모듈은 환경 변수를 통해 jsDelivr CDN에서 로드되도록 미리 구성되어 있습니다. 모든 고급 기능이 사용자 설정 없이 바로 작동합니다. +::: + +| 구성 요소 | 라이선스 | 기능 | +| --------------- | -------- | -------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS 변환, 이미지 추출, 표 추출 | +| **Ghostscript** | AGPL-3.0 | PDF/A 변환, 압축, 기울기 보정, 래스터화 | +| **CoherentPDF** | AGPL-3.0 | 목차, 첨부파일, 북마크를 유지한 PDF 병합 | + +### 기본 환경 변수 + +이 값은 `.env.production`에 설정되어 빌드에 포함됩니다. + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### WASM URL 재정의 + +사용자 지정 배포를 위해 빌드 시점에 기본값을 재정의할 수 있습니다. + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +모듈을 완전히 비활성화하려면(고급 설정에서 사용자가 직접 구성해야 함) 해당 변수를 빈 문자열로 설정하세요. + +OCR의 경우 모든 `VITE_TESSERACT_*` 변수를 비워 두고 기본 온라인 에셋을 사용하거나, 셀프 호스팅/오프라인 OCR을 위해 worker/core/lang URL을 함께 설정하세요. 특정 OCR 언어만 번들한다면 `VITE_TESSERACT_AVAILABLE_LANGUAGES`에도 같은 쉼표 구분 코드를 설정하세요. 그러면 UI가 설치된 언어만 제공하고, 지원되지 않는 선택은 설명이 포함된 오류로 실패합니다. 완전 오프라인으로 검색 가능한 PDF를 출력하려면 번들된 OCR 글꼴을 제공하는 내부 디렉터리를 `VITE_OCR_FONT_BASE_URL`로 설정하세요. + +사용자는 UI의 **고급 설정**에서 언제든지 이 기본값을 재정의할 수도 있습니다. 브라우저에 저장된 사용자 재정의가 환경 기본값보다 우선합니다. + +### 폐쇄망 / 오프라인 배포 + +인터넷에 접속할 수 없는 네트워크(정부, 의료, 금융 등)를 위한 방법입니다. WASM URL은 **빌드 시점**에 JavaScript에 포함되고, 실제 WASM 파일은 런타임에 **사용자의 브라우저**가 다운로드합니다. 따라서 인터넷이 되는 컴퓨터에서 모든 것을 준비한 뒤 격리된 네트워크로 옮겨야 합니다. + +#### 자동화 스크립트 (권장) + +포함된 `prepare-airgap.sh` 스크립트가 WASM 패키지 다운로드, Docker 이미지 빌드, 설정 스크립트가 포함된 독립 실행형 번들 생성까지 전체 과정을 자동화합니다. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +다음과 같은 번들 디렉터리가 만들어집니다. + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +USB, 내부 아티팩트 저장소 또는 승인된 방법으로 번들을 폐쇄망에 옮깁니다. 그런 다음 포함된 설정 스크립트를 실행합니다. + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +설정 스크립트는 Docker 이미지를 로드하고 WASM 파일을 추출하며, 선택적으로 컨테이너를 시작합니다. + +**스크립트 옵션:** + +| 플래그 | 설명 | 기본값 | +| ------------------------------ | ------------------------------------------------ | -------------------------- | +| `--wasm-base-url ` | WASM을 내부적으로 호스팅할 위치 | _(필수, 없으면 입력 요청)_ | +| `--image-name ` | Docker 이미지 태그 | `bentopdf` | +| `--output-dir ` | 출력 번들 디렉터리 | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Simple Mode 활성화 | off | +| `--base-url ` | 하위 디렉터리 기본 URL (예: `/pdf/`) | `/` | +| `--language ` | 기본 UI 언어 (예: `fr`, `de`) | _(없음)_ | +| `--brand-name ` | 사용자 지정 브랜드 이름 | _(없음)_ | +| `--brand-logo ` | `public/` 기준 로고 경로 | _(없음)_ | +| `--footer-text ` | 사용자 지정 푸터 텍스트 | _(없음)_ | +| `--ocr-languages ` | 번들할 OCR 언어(쉼표로 구분) | `eng` | +| `--list-ocr-languages` | 지원되는 OCR 코드와 이름을 출력하고 종료 | off | +| `--search-ocr-language ` | 이름이나 약어로 OCR 코드 검색 | off | +| `--dockerfile ` | 사용할 Dockerfile | `Dockerfile` | +| `--skip-docker` | Docker 빌드와 내보내기 건너뛰기 | off | +| `--skip-wasm` | WASM 다운로드 건너뛰기 (기존 `.tgz` 파일 재사용) | off | + +대화형 프롬프트에서도 `list`를 입력하면 지원되는 전체 Tesseract 코드 목록을 출력하고, `search `을 입력하면 `search german`이나 `search chi` 같은 일치 항목을 찾을 수 있습니다. + +::: warning 동일 출처 요구 사항 +WASM 파일은 BentoPDF 앱과 **같은 출처**에서 제공되어야 합니다. 웹 워커는 다른 출처의 스크립트를 로드할 수 없는 `importScripts()`를 사용합니다. 예를 들어 BentoPDF가 `https://internal.example.com`에서 실행된다면 WASM 기본 URL도 `https://internal.example.com/wasm`이어야 합니다. +::: + +#### 수동 단계 + +
+스크립트 없이 직접 진행하려는 경우 + +**1단계: WASM 및 OCR 패키지 다운로드** (인터넷이 되는 컴퓨터에서) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**2단계: 내부 URL로 Docker 이미지 빌드** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**3단계: Docker 이미지 내보내기** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**4단계: 폐쇄망으로 전송** + +USB, 내부 아티팩트 저장소 또는 승인된 전송 방법으로 다음을 복사합니다. + +- `bentopdf.tar`: Docker 이미지 +- 1단계의 `.tgz` WASM/OCR 패키지 다섯 개 +- 1단계의 `tesseract-langdata/` 디렉터리 +- 1단계의 `ocr-fonts/` 디렉터리 + +**5단계: 폐쇄망 안에서 설정** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +`.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data`, `.../ocr/fonts`를 포함해 2단계에서 구성한 URL로 파일에 접근할 수 있는지 확인하세요. + +
+ +::: info Docker 대신 소스에서 빌드하나요? +`npm run build`를 실행하기 전에 `.env.production`에 변수를 설정하세요. + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### 자체 WASM 프록시 호스팅 + +적절한 CORS 헤더와 함께 AGPL WASM 파일을 제공해야 한다면 간단한 프록시를 배포할 수 있습니다. 구현 예시는 [Cloudflare WASM Proxy 가이드](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md)를 참고하세요. + +::: tip 왜 분리했나요? +이렇게 분리하면 다음이 보장됩니다. + +- 상업용 사용자를 위한 명확한 법적 준수 +- BentoPDF 코어가 듀얼 라이선스(AGPL-3.0 / 상업용)를 유지 +- WASM 파일은 소스에 번들되지 않고 런타임에 로드됨 + ::: + +## 시스템 요구 사항 + +| 요구 사항 | 최소 사양 | +| --------- | ------------------------------- | +| 저장 공간 | 약 100 MB (AGPL 모듈 제외 코어) | +| RAM | 512 MB | +| CPU | 최신 프로세서 아무거나 | + +::: tip +BentoPDF는 정적 사이트이므로 데이터베이스나 백엔드 서버가 필요 없습니다! +::: diff --git a/docs/ko/self-hosting/kubernetes.md b/docs/ko/self-hosting/kubernetes.md new file mode 100644 index 00000000..3ce90fed --- /dev/null +++ b/docs/ko/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Kubernetes로 배포하기 + +정적 사이트에 Kubernetes는 과할 수 있지만, 이미 Helm + GitOps를 표준으로 사용하고 있다면 잘 맞을 수 있습니다. + +> [!IMPORTANT] +> **Office 파일 변환에 필요한 헤더** +> +> LibreOffice 기반 도구(Word, Excel, PowerPoint 변환)에는 `SharedArrayBuffer` 지원을 위해 다음 HTTP 헤더가 필요합니다. +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 공식 BentoPDF nginx 이미지에는 이 헤더가 포함되어 있습니다. Kubernetes에서는 **Ingress/Gateway 컨트롤러도 리버스 프록시**이므로 이 헤더가 유지되는지 확인하거나 엣지에서 추가하세요. + +## 사전 준비 + +- Kubernetes 클러스터 +- Helm v3 +- **8080 포트**로 서비스하는 BentoPDF nginx 이미지 (예: `ghcr.io/alam00000/bentopdf:`) + +## Helm으로 배포 + +### 이 저장소에서 설치 (로컬 차트) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### GHCR에서 설치 (OCI 차트) + +차트가 OCI 아티팩트로 GHCR에 게시된 경우: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## 외부에 노출하기 + +### 포트 포워딩 (빠른 테스트) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (선택 사항) + +Ingress를 활성화합니다 (nginx-ingress 예시). + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (선택 사항) + +이 차트는 Gateway API의 `Gateway`와 `HTTPRoute`를 지원합니다. + +예시 (Cloudflare Gateway API 오퍼레이터): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## SharedArrayBuffer 헤더가 계속 작동하는지 확인 (Ingress/Gateway) + +### 정상적으로 일어나야 하는 일 + +BentoPDF의 nginx 설정이 필요한 응답 헤더를 설정합니다. 대부분의 Ingress/Gateway 컨트롤러는 **업스트림 응답 헤더를 그대로 전달**합니다. + +### 문제가 생길 수 있는 경우 + +- 응답 헤더를 **덮어쓰거나** **제거**하는 컨트롤러/엣지 정책 +- 다른 COOP/COEP 값을 설정하는 "보안 헤더" 미들웨어 + +### 확인 방법 + +공개 엔드포인트에 대해 다음을 실행합니다. + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +다음이 표시되어야 합니다. + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Ingress 컨트롤러가 헤더를 유지하지 않는 경우 + +엣지에서 헤더를 추가합니다(컨트롤러마다 다름). **nginx-ingress** 예시: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` MIME 타입 오류 (PDF 서명 / 양식 작성기 iframe이 비어 있음) + +브라우저 콘솔에 `.mjs` 요청에 대해 `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"`이 표시되면, BentoPDF nginx 앞단의 Ingress/Gateway 컨트롤러가 업스트림 `Content-Type` 헤더를 `application/octet-stream`으로 바꾸고 있는 것입니다. + +BentoPDF 이미지의 nginx는 이미 `.mjs`를 `application/javascript`로 제공합니다. 해결 방법은 컨트롤러가 이를 제거하거나 바꾸지 못하게 하는 것입니다. nginx-ingress의 경우: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +또는 Gateway API의 `ResponseHeaderModifier` 필터를 사용해 `.mjs` 경로에 `Content-Type: application/javascript`를 설정할 수 있습니다. DevTools → Network 탭에서 확인하세요. 실패했던 `.mjs` 요청에 `content-type: application/javascript`가 표시되어야 합니다. + +### Gateway API를 사용하며 헤더를 강제로 추가하려는 경우 + +Gateway API는 `ResponseHeaderModifier` 필터를 지원합니다. `httpRoute.rules[*].filters`에 연결할 수 있습니다. + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +특정 필터의 지원 여부는 Gateway 컨트롤러에 따라 다릅니다. 필터가 무시되면 엣지/컨트롤러 계층에서 헤더를 추가하세요. + +## 특정 도구 비활성화 + +이미지를 다시 빌드하지 않고 ConfigMap으로 런타임에 도구를 비활성화합니다. + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +서비스되는 디렉터리에 마운트합니다. + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +도구 ID는 `.html`을 뺀 페이지 URL입니다. 아무 도구나 열어 URL을 확인하세요(예: `edit-pdf`, `merge-pdf`, `compress-pdf`). 비활성화된 도구는 홈페이지, 검색, 단축키, 워크플로 빌더, 직접 URL 접근에서 숨겨집니다. 전체 옵션 목록은 [Docker 가이드](/ko/self-hosting/docker#특정-도구-비활성화)를 참고하세요. diff --git a/docs/ko/self-hosting/netlify.md b/docs/ko/self-hosting/netlify.md new file mode 100644 index 00000000..5d928f1d --- /dev/null +++ b/docs/ko/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Netlify에 배포하기 + +[Netlify](https://netlify.com)는 넉넉한 무료 요금제와 함께 훌륭한 정적 사이트 호스팅을 제공합니다. + +## 원클릭 배포 + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## 수동 배포 + +### 1단계: 저장소 연결 + +1. [Netlify](https://app.netlify.com)에 로그인합니다 +2. "Add new site" → "Import an existing project"를 클릭합니다 +3. GitHub 계정을 연결합니다 +4. BentoPDF 포크를 선택합니다 + +### 2단계: 빌드 설정 구성 + +| 설정 | 값 | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### 3단계: 배포 + +"Deploy site"를 클릭하고 빌드가 끝날 때까지 기다립니다. + +## 설정 파일 + +프로젝트 루트에 `netlify.toml`을 만듭니다. + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning 중요 +Word/ODT/Excel/PowerPoint를 PDF로 변환하려면 `Cross-Origin-Embedder-Policy` 및 `Cross-Origin-Opener-Policy` 헤더가 필요합니다. 이 헤더가 없으면 `SharedArrayBuffer`를 사용할 수 없어 LibreOffice WASM 엔진이 초기화되지 못합니다. + +`.wasm.gz` 및 `.data.gz` 파일의 `Content-Encoding: gzip` 헤더는 브라우저가 자동으로 압축을 풀도록 알려 줍니다. 이 헤더가 없으면 브라우저가 원시 gzip 바이트를 받아 WASM 컴파일이 실패합니다. +::: + +## 환경 변수 + +Site settings → Environment variables에서 설정합니다. + +| 변수 | 설명 | +| ----------------------- | --------------------------------------------------- | +| `SIMPLE_MODE` | 최소 빌드를 사용하려면 `true`로 설정 | +| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 ("BentoPDF" 대체) | +| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 (예: `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | 사용자 지정 바닥글/저작권 텍스트 | +| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어 (예: `fr`, `de`, `es`) | + +## 사용자 지정 도메인 + +1. Site settings → Domain management로 이동합니다 +2. "Add custom domain"을 클릭합니다 +3. DNS 구성 안내를 따릅니다 + +## 대용량 미디어 + +큰 WASM 파일에는 [Netlify Large Media](https://docs.netlify.com/large-media/overview/) 사용을 고려해 보세요. + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## 문제 해결 + +### Word/ODT/Excel을 PDF로 변환이 55%에서 멈춤 + +문서 변환이 55%에서 멈추면 DevTools 콘솔을 열고 다음을 확인하세요. + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +`crossOriginIsolated`가 `false`이면 `netlify.toml`의 COEP/COOP 헤더가 적용되지 않은 것입니다. 파일이 프로젝트 루트에 있는지 확인하고 다시 배포하세요. + +콘솔에 `expected magic word 00 61 73 6d, found 1f 8b 08 08`이 표시되면 `.wasm.gz` 파일에 `Content-Encoding: gzip` 헤더가 빠진 것입니다. `soffice.wasm.gz`와 `soffice.data.gz`용 `[[headers]]` 블록이 `netlify.toml`에 있는지 확인하세요. + +### 빌드 실패 + +Node 버전 호환성을 확인하세요. + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### 첫 로딩이 느림 + +Site settings → Build & deploy → Asset optimization에서 에셋 최적화를 활성화하세요. diff --git a/docs/ko/self-hosting/nginx.md b/docs/ko/self-hosting/nginx.md new file mode 100644 index 00000000..cd49f823 --- /dev/null +++ b/docs/ko/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Nginx로 배포하기 + +Nginx를 사용해 자체 서버에서 BentoPDF를 호스팅합니다. + +## 사전 요구 사항 + +- Ubuntu/Debian 서버 +- Nginx 설치 +- SSL 인증서 (권장: Let's Encrypt) + +## 1단계: 프로젝트 빌드 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +브랜딩을 사용자 지정하려면 빌드하기 전에 환경 변수를 설정합니다. + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## 2단계: 파일 복사 + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## 3단계: Nginx 설정 + +`/etc/nginx/sites-available/bentopdf`를 만듭니다. + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## 4단계: 사이트 활성화 + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## 5단계: Let's Encrypt로 SSL 설정 + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## 하위 디렉터리 배포 + +`/pdf/`에 호스팅하려면: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +다음과 같이 빌드합니다. + +```bash +BASE_URL=/pdf/ npm run build +``` + +## 성능 튜닝 + +`nginx.conf`에 추가합니다. + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## 문제 해결 + +### WASM이 로드되지 않음 + +MIME 타입이 설정되어 있는지 확인합니다. + +```nginx +types { + application/wasm wasm; +} +``` + +### PDF 서명 또는 양식 작성기에 빈 뷰어가 표시됨 (`.mjs` MIME 오류) + +브라우저 콘솔에 다음이 표시되는 경우: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...그리고 실패한 요청이 `.mjs`로 끝난다면, nginx에 `.mjs → application/javascript` 매핑이 빠져 있는 것입니다. 내장 PDF 뷰어(PDF 서명, 양식 작성기 및 일부 다른 도구에서 사용)는 `.mjs` 확장자의 ES 모듈 파일을 포함하는데, nginx의 기본 `mime.types`에는 이 확장자가 들어 있지 않습니다. + +`/etc/nginx/mime.types`의 기존 `application/javascript` 줄에 `mjs`를 추가해 해결합니다. + +```nginx +application/javascript js mjs; +``` + +> `application/javascript` 줄을 _두 번째로_ 추가하지 마세요. nginx는 `mime.types`를 한 줄씩 파싱하며 타입과 확장자의 매핑은 하나만 적용되므로, 일부 버전에서는 두 번째 줄이 조용히 무시됩니다. 기존 줄을 수정해 `js` 옆에 `mjs`를 추가하세요. + +또는 server 블록 안에서 로컬로 재정의할 수 있습니다(전역 파일 수정 불필요). + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +변경 후 nginx를 다시 로드합니다. + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +확인하려면 브라우저 DevTools → Network 탭에서 실패했던 `.mjs` 요청을 찾아 `Content-Type` 응답 헤더를 확인하세요. 이제 `application/octet-stream`이 아니라 `application/javascript`여야 합니다. + +### Word/ODT/Excel을 PDF로 변환이 작동하지 않음 + +LibreOffice WASM에는 `SharedArrayBuffer`가 필요하며, 이를 위해 `Cross-Origin-Embedder-Policy` 및 `Cross-Origin-Opener-Policy` 헤더가 필요합니다. 보안 컨텍스트도 필요하므로 `http://localhost`는 로컬 테스트에서 작동하지만 `http://192.168.x.x` 같은 LAN IP는 보통 HTTPS가 필요합니다. `location` 블록의 nginx `add_header` 지시문은 server 수준 `add_header` 지시문을 병합하지 않고 **덮어씁니다**. 자체 `add_header`가 있는 모든 `location` 블록에는 COEP/COOP 헤더가 포함되어야 합니다. + +다음으로 확인합니다. + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +nginx 앞에 리버스 프록시를 사용하는 경우 이 헤더가 유지되는지 확인하세요. + +### 502 Bad Gateway + +Nginx 오류 로그를 확인합니다. + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/ko/self-hosting/vercel.md b/docs/ko/self-hosting/vercel.md new file mode 100644 index 00000000..b613afdd --- /dev/null +++ b/docs/ko/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Vercel에 배포하기 + +[Vercel](https://vercel.com)은 정적 사이트를 가장 쉽게 배포할 수 있는 환경을 제공합니다. + +## 원클릭 배포 + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## 수동 배포 + +### 1단계: 저장소 포크 + +[bentopdf/bentopdf](https://github.com/alam00000/bentopdf)를 GitHub 계정으로 포크합니다. + +### 2단계: Vercel로 가져오기 + +1. [vercel.com/new](https://vercel.com/new)로 이동합니다 +2. 포크한 저장소를 선택합니다 +3. 프로젝트를 구성합니다. + +| 설정 | 값 | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### 3단계: 환경 변수 (선택 사항) + +필요한 경우 다음을 추가합니다. + +| 변수 | 설명 | +| ----------------------- | --------------------------------------------------- | +| `SIMPLE_MODE` | 최소 UI를 사용하려면 `true`로 설정 | +| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 ("BentoPDF" 대체) | +| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 (예: `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | 사용자 지정 바닥글/저작권 텍스트 | +| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어 (예: `fr`, `de`, `es`) | + +### 4단계: 배포 + +"Deploy"를 클릭하고 빌드가 끝날 때까지 기다립니다. + +## 사용자 지정 도메인 + +1. 프로젝트 설정으로 이동합니다 +2. "Domains"로 이동합니다 +3. 사용자 지정 도메인을 추가합니다 +4. 안내에 따라 DNS를 구성합니다 + +## 제한 사항 + +::: warning 대용량 파일 +Vercel의 서버리스 함수에는 50MB 제한이 있습니다. BentoPDF는 정적 사이트이므로 영향을 받지 않아야 하지만, WASM 모듈은 용량이 큽니다(총 약 100MB). `/public` 폴더에서 제공되도록 하세요. +::: + +## 문제 해결 + +### 빌드 시간 초과 + +빌드 시간이 초과되면 다음을 시도해 보세요. + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 새로고침 시 404 + +SPA 라우팅을 위해 `vercel.json`을 추가합니다. + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel을 PDF로 변환이 작동하지 않음 + +LibreOffice WASM 변환에는 `SharedArrayBuffer`가 필요하며, 이를 위해 모든 페이지에 다음 응답 헤더가 있어야 합니다. + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +미리 압축된 `.wasm.gz` 및 `.data.gz` 파일도 브라우저가 압축을 풀 수 있도록 `Content-Encoding: gzip`이 필요합니다. + +`vercel.json`에 다음을 추가합니다. + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +확인하려면 DevTools 콘솔을 열고 `console.log(window.crossOriginIsolated)`를 실행하세요. `true`가 반환되어야 합니다. diff --git a/docs/ko/tools/add-attachments.md b/docs/ko/tools/add-attachments.md new file mode 100644 index 00000000..04837836 --- /dev/null +++ b/docs/ko/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: 첨부파일 추가 +description: 모든 형식의 파일을 문서 수준 또는 특정 페이지에 연결하여 PDF에 삽입합니다. +--- + +# 첨부파일 추가 + +하나 이상의 파일을 PDF 문서 안에 직접 삽입합니다. 첨부파일은 문서 수준(모든 PDF 리더의 첨부파일 패널에서 확인 가능)으로 추가하거나 특정 페이지에 연결할 수 있습니다. + +## 사용 방법 + +1. 파일을 첨부할 PDF를 업로드합니다. +2. 첨부파일 드롭 영역에서 삽입할 파일(모든 형식)을 선택합니다. +3. 첨부 수준을 선택합니다. **문서**(기본값) 또는 **페이지**입니다. +4. 페이지 수준을 선택한 경우 페이지 범위(예: `1-3` 또는 `5`)를 입력합니다. +5. 처리 버튼을 클릭합니다. 파일이 삽입된 PDF가 다운로드됩니다. + +## 기능 + +- 모든 파일 형식 첨부 가능 -- 이미지, 스프레드시트, 압축 파일, 실행 파일 등 무엇이든 가능 +- 문서 수준 또는 페이지 수준으로 첨부 위치 지정 +- 한 번에 여러 파일 첨부 가능 +- 선택한 모든 첨부파일의 이름과 크기 표시 +- 원본 PDF 내용은 그대로 유지하고 삽입된 파일만 추가 + +## 옵션 + +| 옵션 | 설명 | +| --------------- | ---------------------------------------------------------------- | +| **문서 수준** | PDF 전체에 파일을 첨부하며, 첨부파일 패널에서 접근할 수 있습니다 | +| **페이지 수준** | 페이지 범위 입력으로 지정한 특정 페이지에 파일을 첨부합니다 | + +## 활용 사례 + +- PDF 보고서에 원본 데이터(Excel 파일, CSV)를 함께 묶기 +- 사진 포트폴리오 PDF에 원본 이미지 파일 첨부 +- 계약서나 제안서 안에 증빙 자료 삽입 +- 교육 매뉴얼의 특정 페이지에 보충 자료 추가 + +## 팁 + +- 문서 수준 첨부파일은 PDF 리더에서 가장 폭넓게 지원됩니다. 페이지 수준 첨부파일은 일부 뷰어에서 보이지 않을 수 있습니다. +- 첨부파일 크기에는 제한이 없지만, 매우 큰 파일을 삽입하면 PDF 크기도 그만큼 커집니다. + +## 관련 도구 + +- [첨부파일 추출](./extract-attachments) +- [첨부파일 편집](./edit-attachments) +- [PDF 병합](./merge-pdf) diff --git a/docs/ko/tools/add-blank-page.md b/docs/ko/tools/add-blank-page.md new file mode 100644 index 00000000..c46f87d9 --- /dev/null +++ b/docs/ko/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: 빈 페이지 추가 +description: PDF 문서의 원하는 위치에 빈 페이지를 하나 이상 삽입합니다. +--- + +# 빈 페이지 추가 + +지정한 위치에 빈 페이지를 PDF에 삽입합니다. 빈 페이지를 넣을 위치와 개수를 직접 정할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 도구에 페이지 수가 표시됩니다. +2. 빈 페이지를 삽입할 **위치**를 입력합니다. 맨 앞에 삽입하려면 `0`을, 맨 끝에 추가하려면 전체 페이지 수를 입력합니다. +3. 추가할 빈 페이지의 **개수**를 입력합니다(기본값은 1). +4. 처리 버튼을 클릭합니다. 빈 페이지가 삽입된 PDF가 다운로드됩니다. + +## 기능 + +- 문서의 처음, 중간, 끝 등 원하는 위치에 삽입 +- 한 번에 여러 개의 빈 페이지 추가 +- 업로드한 PDF의 페이지 수에 따라 위치 안내가 동적으로 갱신 +- 표준 A4 크기의 빈 페이지 + +## 활용 사례 + +- 합쳐진 문서의 섹션 사이에 빈 구분 페이지 추가 +- 양면 인쇄 정렬을 위한 빈 페이지 삽입 +- 인쇄한 학습 자료에 손글씨 메모 공간 확보 +- 최소 페이지 수 요건을 맞추기 위한 페이지 채우기 + +## 팁 + +- 위치 `0`은 첫 페이지 앞에 삽입하고, 전체 페이지 수와 같은 위치는 마지막 페이지 뒤에 추가합니다. +- 빈 페이지가 아니라 내용을 특정 위치에 삽입해야 한다면 [PDF 멀티 도구](./pdf-multi-tool)로 지정한 페이지 뒤에 다른 PDF를 삽입하세요. + +## 관련 도구 + +- [정리 및 복제](./organize-pdf) +- [PDF 멀티 도구](./pdf-multi-tool) +- [PDF 병합](./merge-pdf) diff --git a/docs/ko/tools/add-page-labels.md b/docs/ko/tools/add-page-labels.md new file mode 100644 index 00000000..1afc2124 --- /dev/null +++ b/docs/ko/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: 페이지 레이블 추가 +description: 로마 숫자, 문자 접두사, 사용자 지정 번호 매기기와 문서당 여러 규칙을 지원하는 PDF 페이지 레이블을 추가합니다. +--- + +# 페이지 레이블 추가 + +페이지 레이블은 PDF 뷰어에 표시되는 페이지 번호(페이지에 인쇄된 번호가 아니라 도구 모음에 표시되는 번호)를 제어합니다. 이 도구로 페이지 범위마다 다른 레이블 방식을 지정할 수 있습니다 -- 앞부분에는 로마 숫자, 본문에는 십진수, 부록에는 문자 등입니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 옵션 패널이 나타나며 기본으로 레이블 규칙이 하나 있습니다. +3. 각 규칙에 페이지 범위, 스타일, 선택 사항인 접두사, 시작 값을 설정합니다. +4. **규칙 추가**를 클릭하여 다른 구간에 쓸 규칙을 더 만듭니다. +5. **페이지 레이블 추가**를 클릭하여 모든 규칙을 적용하고 결과를 다운로드합니다. + +## 옵션 + +각 레이블 규칙에는 다음 설정이 있습니다. + +- **페이지 범위** -- 규칙을 적용할 페이지입니다. 비워 두면 모든 페이지에 적용됩니다. `1-4`, `7`, `odd`, `1-9,30-40` 같은 범위를 지원합니다. +- **레이블 스타일** -- 아라비아 숫자, 소문자 로마 숫자(i, ii, iii), 대문자 로마 숫자(I, II, III), 소문자 알파벳(a, b, c), 대문자 알파벳(A, B, C), 레이블 없음(접두사만) 중에서 선택합니다. +- **레이블 접두사** -- 각 레이블 앞에 붙는 선택적 텍스트입니다. 예를 들어 "A-"를 입력하면 A-1, A-2, A-3 같은 레이블이 만들어집니다. +- **시작 값** -- 번호를 매기기 시작할 숫자입니다. 기본값은 1입니다. 0부터 시작하려면 0으로 설정합니다. +- **떨어진 범위에서 번호 이어가기** -- 규칙이 연속되지 않은 페이지(`1-9,30-40` 또는 `odd` 등)를 대상으로 하며 번호를 순서대로 이어가고 싶을 때 켭니다. +- **기존 페이지 레이블 제거** -- 기본으로 선택되어 있습니다. 새 규칙을 적용하기 전에 이전 레이블을 모두 지웁니다. + +## 기능 + +- 복잡한 번호 체계를 위한 문서당 다중 레이블 규칙 +- 모든 표준 번호 체계를 포괄하는 여섯 가지 레이블 스타일 +- 섹션별 레이블을 위한 사용자 지정 접두사 지원 +- 떨어진 범위에서 이어지는 번호 매기기 지원 +- 기존 레이블 유지 또는 제거 옵션 + +## 활용 사례 + +- 책의 머리말에는 로마 숫자(i, ii, iii), 본문에는 십진수 레이블 설정 +- 부록 페이지에 "A-1", "A-2", "B-1", "B-2" 같은 문자 접두사 레이블 지정 +- 실제 페이지 번호가 PDF 페이지 순서와 맞지 않는 스캔 문서의 페이지 레이블 수정 +- 기술 문서에 0부터 시작하는 번호 매기기 적용 + +## 팁 + +- 페이지 레이블은 PDF 뷰어가 탐색 도구 모음에 표시하는 메타데이터입니다. 실제 페이지에는 인쇄되지 않습니다. 눈에 보이는 번호가 필요하면 [페이지 번호](./page-numbers)를 사용하세요. +- 이 도구를 사용하려면 WASM 설정에서 CoherentPDF(CPDF)를 구성해야 합니다. 설정되어 있지 않으면 구성하라는 안내가 표시됩니다. + +## 관련 도구 + +- [페이지 번호](./page-numbers) +- [베이츠 번호 매기기](./bates-numbering) +- [북마크 편집](./bookmark) diff --git a/docs/ko/tools/add-stamps.md b/docs/ko/tools/add-stamps.md new file mode 100644 index 00000000..1a8231dc --- /dev/null +++ b/docs/ko/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: 도장 추가 +description: 사용자 이름 표기가 가능한 통합 주석 도구 모음으로 PDF 페이지에 이미지 도장을 추가합니다. +--- + +# 도장 추가 + +도장 주석 도구 모음이 있는 내장 뷰어를 사용해 PDF 페이지에 이미지 도장을 찍습니다. 도장에 이름을 넣어 작성자를 표시할 수 있어 승인 절차, 검토 과정, 문서 표시에 유용합니다. + +## 사용 방법 + +1. **도장 사용자 이름** 필드에 이름을 입력합니다. 이 이름이 만든 도장에 표시됩니다. +2. PDF 파일을 클릭하거나 드롭 영역으로 끌어다 놓아 업로드합니다. +3. 문서가 불러와진 뷰어와 함께 도장 편집기가 열립니다. +4. 도구 모음의 이미지 도장 도구로 도장을 선택하여 원하는 페이지에 놓습니다. +5. 필요에 따라 도장의 위치와 크기를 조정합니다. +6. **도장 찍은 PDF 저장**을 클릭하여 결과를 다운로드합니다. + +## 기능 + +- 도장 전용 주석 도구 모음이 있는 통합 PDF 뷰어 +- 만든 도장에 사용자 이름 표기 +- 모든 페이지에 이미지 도장 배치 +- 끌어서 놓기로 위치 지정 및 크기 조절 +- 페이지 가로세로 비율에 따른 뷰어 크기 자동 조정 +- 이름과 크기 정보가 있는 파일 표시 + +## 활용 사례 + +- 검토 과정에서 문서에 "APPROVED" 또는 "REVIEWED" 이미지 도장 찍기 +- 공문서에 회사 직인이나 공증 도장 이미지 배치 +- 검토자 이름이 포함된 "RECEIVED" 도장으로 페이지 표시 +- 검사 보고서에 품질 관리 도장 추가 + +## 팁 + +- PDF를 업로드하기 전에 도장 사용자 이름을 설정하세요. 사용자 이름은 도장 메타데이터에 포함됩니다. +- 뷰어는 PDF 첫 페이지의 가로세로 비율에 맞춰 높이를 조정하여 보기 좋게 표시합니다. +- 이미지 도장 대신 텍스트 기반 워터마크가 필요하면 [워터마크 추가](./add-watermark) 도구를 사용하세요. + +## 관련 도구 + +- [PDF 서명](./sign-pdf) +- [워터마크 추가](./add-watermark) +- [PDF 편집기](./edit-pdf) diff --git a/docs/ko/tools/add-watermark.md b/docs/ko/tools/add-watermark.md new file mode 100644 index 00000000..217099eb --- /dev/null +++ b/docs/ko/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: 워터마크 추가 +description: 시각적 끌어서 놓기 편집기와 실시간 미리보기로 PDF 페이지에 텍스트 또는 이미지 워터마크를 찍습니다. +--- + +# 워터마크 추가 + +시각적 편집기를 사용해 PDF 페이지에 텍스트 또는 이미지 워터마크를 추가합니다. 미리보기에서 워터마크를 직접 끌어 위치를 정하고, 모서리 핸들로 크기를 조절하며, 불투명도, 회전, 글꼴, 색상을 설정할 수 있습니다. 페이지마다 워터마크 위치를 따로 지정하거나 모든 페이지에 같은 워터마크를 한 번에 적용할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 첫 페이지의 실시간 미리보기와 끌 수 있는 워터마크 오버레이가 있는 편집기가 열립니다. +3. 토글 버튼으로 **텍스트** 또는 **이미지** 워터마크 모드를 선택합니다. +4. 사이드바 패널에서 워터마크 설정을 구성합니다. +5. 미리보기에서 워터마크를 끌어 원하는 위치에 놓습니다. 모서리 핸들로 크기를 조절합니다. +6. 페이지별 워터마크를 설정하려면 페이지를 넘겨 가며 지정하고, 아니면 **모든 페이지에 적용**을 선택한 상태로 둡니다. +7. **워터마크 추가**를 클릭하여 처리하고 다운로드합니다. + +## 옵션 + +**텍스트 워터마크 설정:** + +- **텍스트** -- 워터마크 문구입니다(예: "CONFIDENTIAL", "DRAFT"). +- **글꼴 크기** -- 10에서 200포인트입니다. 기본값은 72입니다. +- **색상** -- 색상 선택기로 원하는 색을 고릅니다. +- **불투명도** -- 완전 투명에서 완전 불투명까지 투명도를 조절합니다. +- **회전** -- 워터마크 텍스트를 -180도에서 180도까지 회전합니다. + +**이미지 워터마크 설정:** + +- **이미지 업로드** -- 워터마크로 사용할 PNG, JPG 등의 이미지 파일을 업로드합니다. +- **불투명도** -- 이미지 투명도를 조절합니다. +- **배율** -- 이미지 워터마크의 크기를 조정합니다. + +**레이아웃 설정:** + +- **단일** -- 페이지당 워터마크 하나를 끌어서 또는 위치 프리셋으로 배치합니다. +- **타일** -- 회전 각도를 따르는 대각선 격자로 페이지 전체에 워터마크를 반복하여 문서를 가장자리까지 덮습니다. +- **가로 간격** -- 텍스트 방향을 따른 타일 사이의 간격으로, 워터마크 너비에 대한 백분율입니다(타일 모드에서만 해당). +- **세로 간격** -- 타일 행 사이의 간격으로, 워터마크 높이에 대한 백분율입니다(타일 모드에서만 해당). + +**일반 설정:** + +- **모든 페이지에 적용** -- 선택하면 모든 페이지에 같은 워터마크가 적용됩니다. 선택을 해제하면 페이지별로 워터마크를 설정할 수 있습니다. +- **페이지 범위** -- 워터마크를 넣을 페이지를 지정합니다(예: "1-3, 5, 7-9" 또는 "all"). + +## 기능 + +- 실시간 PDF 미리보기에서 끌어서 놓는 시각적 위치 지정 +- 모서리 핸들로 크기를 조절할 수 있는 워터마크 +- 텍스트 및 이미지 워터마크 모드 +- 간격을 조절할 수 있는 단일 또는 전체 페이지 타일(반복) 레이아웃 +- 페이지별 또는 전체 워터마크 적용 +- 미리보기에서 페이지 단위 탐색 +- 불투명도 및 회전 조절 +- 페이지 범위 필터링 + +## 활용 사례 + +- 검토용으로 배포하기 전에 초안 문서에 "DRAFT" 표시 +- 민감한 재무 보고서에 "CONFIDENTIAL" 워터마크 추가 +- 회사 로고 이미지 워터마크로 문서 브랜딩 +- 잠재 고객에게 공유하는 제품 문서에 "SAMPLE" 찍기 +- 배포용 PDF 자료에 저작권 고지 추가 + +## 팁 + +- 페이지를 대각선으로 가로지르는 워터마크는 회전을 약 45도로 설정하고 글꼴 크기를 키우세요. +- 타일 모드는 하나를 지워도 수십 개가 남기 때문에 잘라내기 후 문서를 재사용하기가 훨씬 어려워집니다. 타일을 쓸 때는 아래 텍스트가 읽히도록 불투명도를 낮추세요. +- 배경이 투명한 이미지 워터마크(PNG 형식)가 문서 내용과 더 자연스럽게 어우러집니다. +- 페이지마다 다른 워터마크 텍스트가 필요하면 "모든 페이지에 적용"을 해제하고 페이지별로 이동하며 설정하세요. + +## 관련 도구 + +- [머리글 및 바닥글](./header-footer) +- [도장 추가](./add-stamps) +- [베이츠 번호 매기기](./bates-numbering) +- [PDF 서명](./sign-pdf) diff --git a/docs/ko/tools/adjust-colors.md b/docs/ko/tools/adjust-colors.md new file mode 100644 index 00000000..16f8242f --- /dev/null +++ b/docs/ko/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: 색상 조정 +description: PDF의 밝기, 대비, 채도, 색조, 색온도, 틴트, 감마, 세피아를 세밀하게 조정합니다. +--- + +# 색상 조정 + +PDF를 위한 본격적인 색 보정 도구입니다. 밝기, 대비, 채도, 색조 이동, 색온도, 틴트, 감마, 세피아의 여덟 가지 매개변수를 각각 독립적으로 조정할 수 있으며, 슬라이더를 움직일 때마다 미리보기가 실시간으로 갱신됩니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 첫 페이지 미리보기와 색상 설정 패널이 있는 편집기가 열립니다. +3. 슬라이더를 움직여 각 색상 매개변수를 조정합니다. 미리보기가 실시간으로 갱신됩니다. +4. **초기화**를 클릭하면 모든 슬라이더가 기본 위치로 돌아갑니다. +5. **적용**을 클릭하여 모든 페이지를 처리하고 조정된 PDF를 다운로드합니다. + +## 옵션 + +- **밝기** -- 페이지 전체를 밝게 하거나 어둡게 합니다(-100에서 +100). +- **대비** -- 밝은 영역과 어두운 영역의 차이를 키우거나 줄입니다(-100에서 +100). +- **채도** -- 색의 강도를 높이거나 낮춥니다(-100에서 +100). -100으로 설정하면 회색조 결과가 나옵니다. +- **색조 이동** -- 색상환을 회전하여 모든 색을 일괄적으로 이동합니다. +- **색온도** -- 색을 따뜻하게(노랑/주황) 또는 차갑게(파랑) 이동합니다. +- **틴트** -- 녹색 또는 마젠타 색조를 더합니다. +- **감마** -- 감마 곡선으로 중간 톤의 밝기를 조정합니다. 1.0 미만이면 중간 톤이 어두워지고, 1.0 초과면 밝아집니다. +- **세피아** -- 고전적인 세피아 톤 효과를 적용합니다. 값이 높을수록 갈색이 더 강해집니다. + +## 기능 + +- 독립적으로 조정 가능한 여덟 가지 색상 매개변수 +- 슬라이더 변경에 즉시 반응하는 실시간 미리보기 +- 기본값으로 빠르게 되돌리는 초기화 버튼 +- 문서의 모든 페이지 처리 +- 텍스트, 이미지, 그래픽 등 모든 PDF 콘텐츠에 사용 가능 + +## 활용 사례 + +- 어두운 스캔본을 밝게 하거나 과다 노출된 페이지 보정 +- 인쇄 전에 컬러 문서의 채도를 낮춰 잉크 사용량 절감 +- 증명서나 상장에 세피아 톤을 적용해 고풍스러운 느낌 연출 +- PDF에 삽입된 사진의 색온도 보정 +- 바래거나 품질이 낮은 스캔 문서의 대비 강화 + +## 팁 + +- 빠르게 회색조로 변환하려면 채도 슬라이더를 -100까지 끝까지 끌어 내리세요. +- 감마 슬라이더는 중간 톤이 너무 어둡거나 밝은 스캔 문서의 가독성을 개선하는 데 특히 유용합니다. +- 다른 이미지 효과 도구와 마찬가지로 각 페이지를 래스터화합니다. 출력은 이미지 기반이 되므로 텍스트를 선택할 수 없습니다. + +## 관련 도구 + +- [색상 반전](./invert-colors) +- [스캔 효과](./scanner-effect) +- [배경색 변경](./background-color) diff --git a/docs/ko/tools/alternate-merge.md b/docs/ko/tools/alternate-merge.md new file mode 100644 index 00000000..a4b2d118 --- /dev/null +++ b/docs/ko/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: 페이지 교차 병합 +description: 각 파일의 페이지를 번갈아 끼워 넣어 PDF를 병합하며, 북마크를 유지합니다. +--- + +# 페이지 교차 병합 + +여러 PDF 파일의 페이지를 문서 간에 번갈아 가며 끼워 넣습니다. 일반 병합은 파일을 단순히 이어 붙이지만, 파일 A의 1페이지, 파일 B의 1페이지, 파일 A의 2페이지 순으로 배치해야 할 때 사용하는 도구입니다. + +## 사용 방법 + +1. 드롭 영역을 사용해 PDF 파일을 두 개 이상 업로드합니다. +2. 도구에 각 파일의 페이지 수와 파일 크기가 표시됩니다. +3. 손잡이를 끌어 교차 순서에서 어느 파일의 페이지가 먼저 오는지 바꿉니다. +4. **페이지 섞기**를 클릭하여 교차 출력을 만듭니다. +5. 결과가 `alternated-mixed.pdf`로 다운로드됩니다. + +## 기능 + +- 개수에 상관없이(최소 두 개) 여러 PDF의 페이지를 교차 배치 +- 끌어서 놓기로 파일 순서를 바꿔 교차 우선순위 조절 +- 원본 문서의 북마크 유지 +- 업로드한 각 파일의 페이지 수와 파일 크기 표시 +- 전용 웹 워커로 처리하여 반응성이 좋은 UI + +## 활용 사례 + +- 홀수 페이지와 짝수 페이지를 따로 스캔한 양면 스캔본 재조립 +- 문제지와 답안지를 합쳐 각 문제 뒤에 답이 오도록 구성 +- 두 언어 문서를 페이지 단위로 병합(예: 한쪽은 영어, 다음 쪽은 번역) +- 단면 스캐너로 스캔한 앞면과 뒷면 교차 배치 + +## 팁 + +- 원본 PDF의 페이지 수가 다르면 짧은 문서의 페이지가 먼저 소진되고, 긴 문서의 남은 페이지가 끝에 나옵니다. +- 파일 순서가 중요합니다 -- 목록의 첫 번째 파일이 출력의 첫 페이지를 제공합니다. 필요하면 끌어서 순서를 바꾸세요. + +## 관련 도구 + +- [PDF 병합](./merge-pdf) +- [정리 및 복제](./organize-pdf) +- [PDF 분할](./split-pdf) diff --git a/docs/ko/tools/background-color.md b/docs/ko/tools/background-color.md new file mode 100644 index 00000000..6a3aef24 --- /dev/null +++ b/docs/ko/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: 배경색 변경 +description: PDF 모든 페이지의 배경색을 바꾸면서 위에 있는 내용은 그대로 유지합니다. +--- + +# 배경색 변경 + +PDF의 기존 내용 뒤에 단색 배경을 설정합니다. 각 페이지에 색 사각형을 만들고 원본 내용을 그 위에 겹치므로, 텍스트, 이미지, 그래픽이 새 배경 위에서도 완전히 보입니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 색상 선택기로 배경색을 고릅니다. 기본값은 연한 노랑(#FFFFCC)입니다. +3. **배경색 변경**을 클릭하여 처리합니다. +4. 업데이트된 PDF가 자동으로 다운로드됩니다. + +## 옵션 + +- **배경색** -- 원하는 단색을 고르는 표준 색상 선택기입니다. 기본값은 연한 노랑입니다. + +## 기능 + +- 모든 페이지에 균일한 배경색 적용 +- 색 레이어 위에 모든 원본 내용(텍스트, 이미지, 벡터 그래픽) 유지 +- 원본 페이지 크기 유지 +- 페이지 수에 상관없이 사용 가능 + +## 활용 사례 + +- 연한 크림색이나 아이보리 배경으로 문서에 종이 같은 부드러운 느낌 부여 +- 분류별로 다른 배경색을 적용해 문서 세트를 색으로 구분 +- 대상 독자별로 시각적으로 구분되는 같은 문서의 버전 만들기 +- 화면에 문서를 띄울 때 가독성을 높이기 위해 연한 배경 색조 추가 + +## 팁 + +- 연하고 차분한 색이 가장 잘 어울립니다. 텍스트가 이미 밝은 색이 아니라면 매우 어두운 배경은 글자를 읽기 어렵게 만들 수 있습니다. +- 배경과 텍스트 색을 모두 바꾸려면 먼저 배경색을 적용한 뒤 결과물에 [텍스트 색상 변경](./text-color)을 사용하세요. +- 이 도구는 래스터화가 아닌 PDF 구조 수준에서 작동하므로 출력에서도 텍스트를 선택하고 검색할 수 있습니다. + +## 관련 도구 + +- [텍스트 색상 변경](./text-color) +- [색상 반전](./invert-colors) +- [색상 조정](./adjust-colors) diff --git a/docs/ko/tools/bates-numbering.md b/docs/ko/tools/bates-numbering.md new file mode 100644 index 00000000..a85c6d8a --- /dev/null +++ b/docs/ko/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: 베이츠 번호 매기기 +description: 사용자 지정 템플릿, 자릿수 채우기, 글꼴, 위치를 설정하여 하나 또는 여러 PDF에 베이츠 번호를 적용합니다. +--- + +# 베이츠 번호 매기기 + +베이츠 번호 매기기는 PDF의 모든 페이지에 순차적인 식별 번호를 찍는 방식입니다. 법적 절차, 감사, 규정 준수 업무에서 문서에 번호를 붙이는 표준 방법입니다. 이 도구는 여러 파일, 사용자 지정 템플릿을 지원하며 번호가 매겨진 PDF를 개별 파일이나 하나의 ZIP 아카이브로 만듭니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드합니다. 여러 파일을 한 번에 끌어다 놓을 수 있습니다. +2. 스타일 프리셋을 고르거나 사용자 지정 템플릿을 만듭니다. +3. 위치, 글꼴, 크기, 색상, 시작 번호를 설정합니다. +4. **베이츠 번호 적용**을 클릭하여 처리합니다. +5. 파일이 하나면 바로 다운로드되고, 여러 개면 ZIP 아카이브로 다운로드됩니다. + +## 옵션 + +- **스타일 프리셋** -- 기본 제공 형식 중에서 선택합니다. + - 증거 + 사건 + Bates + 페이지 (예: "Exhibit 1 Case XYZ 000001 Page 1") + - 증거 + 사건 + Bates (페이지 번호 없음) + - 사건 + Bates + - Bates 번호만 (예: "000001") + - 사용자 지정 (직접 템플릿 작성) +- **스타일 사용자 지정** -- 자리 표시자 `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`을 사용하는 템플릿 문자열입니다. +- **베이츠 자릿수** -- 0으로 채운 베이츠 번호의 자릿수(3에서 6)입니다. 사용자 지정 모드에서만 표시됩니다. +- **위치** -- 머리글 또는 바닥글, 그리고 왼쪽, 가운데, 오른쪽입니다. +- **베이츠 시작 번호** -- 첫 번째 베이츠 번호입니다. 기본값은 1입니다. 번호는 파일을 넘어 이어집니다. +- **파일 카운터 시작 번호** -- `[FILE]` 자리 표시자의 시작 번호입니다. +- **글꼴** -- Helvetica, Times New Roman 또는 Courier입니다. +- **글꼴 크기** -- 찍히는 텍스트의 크기입니다. +- **색상** -- 베이츠 번호 텍스트의 색상 선택기입니다. + +## 기능 + +- 업로드한 모든 파일에 베이츠 번호가 어떻게 표시될지 보여 주는 실시간 미리보기 +- 문서 간에 번호가 이어지는 다중 파일 지원 +- 끌어서 놓기로 파일 순서를 바꿔 번호 순서 제어 +- 여섯 가지 위치 옵션(머리글/바닥글, 왼쪽/가운데/오른쪽) +- 페이지 크기에 따라 달라지는 여백을 고려한 적응형 여백 계산 +- 여러 파일 일괄 처리 시 ZIP 출력 +- 최대한의 유연성을 위한 템플릿 자리 표시자 + +## 활용 사례 + +- 소송 증거 개시 문서에 순차적인 증거 번호 찍기 +- 수십 개 파일에 걸친 감사 증빙 패키지에 번호 매기기 +- 규정 준수 문서에 규제 참조 번호 적용 +- 특허 출원 첨부 자료에 사건별 식별자 붙이기 + +## 팁 + +- 처리하기 전에 파일 목록에서 파일을 끌어 순서를 바꾸세요. 베이츠 번호 순서는 이 순서를 따릅니다. +- `[FILENAME]` 자리 표시자를 사용하면 원본 파일 이름이 도장에 들어가 페이지를 원본 문서로 추적하는 데 도움이 됩니다. +- 설정을 바꾸면 미리보기 상자가 실시간으로 갱신되므로 처리하기 전에 형식을 확인할 수 있습니다. + +## 관련 도구 + +- [페이지 번호](./page-numbers) +- [페이지 레이블 추가](./add-page-labels) +- [머리글 및 바닥글](./header-footer) diff --git a/docs/ko/tools/bmp-to-pdf.md b/docs/ko/tools/bmp-to-pdf.md new file mode 100644 index 00000000..a33246d5 --- /dev/null +++ b/docs/ko/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP를 PDF로 +description: 서버로 업로드하지 않고 브라우저에서 바로 BMP 비트맵 이미지를 PDF 형식으로 변환합니다. +--- + +# BMP를 PDF로 + +Windows 비트맵(BMP) 파일을 PDF로 변환합니다. BMP는 압축되지 않은 이미지 형식으로, 오래된 시스템, 의료 영상, 산업용 스캐너에서 여전히 볼 수 있습니다. 이 도구는 아무것도 설치하지 않고도 이를 PDF로 변환합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :----- | +| BMP | `.bmp` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 BMP 파일을 끌어다 놓습니다. +2. 파일 목록을 확인합니다. 파일을 더 추가하거나 불필요한 파일을 제거합니다. +3. **PDF로 변환**을 클릭합니다. 출력은 `from_bmps.pdf`로 다운로드됩니다. + +각 BMP는 캔버스에 그려져 PNG로 내보내진 뒤 pdf-lib를 사용해 PDF에 삽입됩니다. 페이지 크기는 원본 이미지 크기와 같습니다. + +## 옵션 + +이 도구는 별도의 품질 설정을 제공하지 않습니다. 이미지는 PDF 안에 원본 해상도의 무손실 PNG로 삽입됩니다. + +## 활용 사례 + +- BMP로 저장된 오래된 스캔 문서를 보관용 PDF로 변환 +- 구형 Windows 응용 프로그램의 BMP 스크린샷을 공유 가능한 문서로 변환 +- 기본 출력이 BMP인 의료 또는 산업용 스캐너 결과물 처리 +- 오래된 이미지 아카이브를 이식성이 더 좋은 형식으로 이전 + +## 팁 + +- BMP 파일은 압축되지 않아 용량이 큰 편입니다. 이미지가 내부적으로 PNG로 다시 인코딩되므로 결과 PDF는 훨씬 작아집니다. +- BMP 파일과 다른 이미지 형식이 섞여 있다면 [이미지를 PDF로](./image-to-pdf) 도구로 한 번에 일괄 변환하세요. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [PNG를 PDF로](./png-to-pdf) +- [TIFF를 PDF로](./tiff-to-pdf) diff --git a/docs/ko/tools/bookmark.md b/docs/ko/tools/bookmark.md new file mode 100644 index 00000000..0c38b236 --- /dev/null +++ b/docs/ko/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: 북마크 편집 +description: 시각적 편집기와 CSV/JSON 지원으로 PDF 북마크를 추가, 편집, 가져오기, 내보내기, 삭제합니다. +--- + +# 북마크 편집 + +북마크 편집기를 사용하면 PDF 탐색 북마크(개요라고도 합니다)를 완전히 제어할 수 있습니다. 새 북마크를 추가하고, 기존 북마크를 편집하고, 계층 구조를 재구성하고, 북마크 데이터를 CSV 및 JSON 형식으로 가져오거나 내보낼 수 있습니다. + +## 사용 방법 + +1. 클릭하거나 파일을 드롭 영역으로 끌어다 놓아 PDF를 업로드합니다. +2. 필요하면 **기존 북마크 자동 추출**을 선택하여 문서의 현재 북마크 트리를 불러옵니다. +3. 편집기가 분할 보기로 열립니다. 왼쪽에는 PDF 뷰어, 오른쪽에는 북마크 패널이 표시됩니다. +4. 북마크 제목을 입력하고 **페이지에 추가**를 클릭하면 현재 페이지를 가리키는 새 북마크가 만들어집니다. +5. 도구 모음 버튼으로 북마크를 재정렬하거나, 스타일을 지정하거나, 삭제합니다. +6. **북마크 포함하여 PDF 저장**을 클릭하여 업데이트된 파일을 다운로드합니다. + +## 기능 + +- 페이지 이동, 확대/축소 컨트롤, 페이지 이동 입력란이 있는 시각적 PDF 뷰어 +- 한 번의 클릭으로 모든 페이지에 북마크 추가 +- PDF를 직접 클릭하여 정확한 북마크 위치 지정(지정 모드) +- 드래그 앤 드롭으로 순서를 바꿀 수 있는 중첩 북마크 계층 구조 +- 일괄 작업: 여러 북마크를 선택하여 색상, 스타일 변경 또는 삭제를 한 번에 처리 +- 큰 트리에서 항목을 빠르게 찾는 북마크 검색 +- 모든 변경 사항에 대한 실행 취소 및 다시 실행 지원 +- CSV(제목, 페이지, 수준) 또는 JSON 파일에서 북마크 가져오기 +- 외부 편집을 위해 북마크를 CSV 또는 JSON으로 내보내기 +- 북마크 스타일: 색상(빨강, 파랑, 초록, 노랑, 보라)과 글꼴 스타일(굵게, 기울임, 굵은 기울임) +- 빠른 탐색: 페이지 위/아래 키로 페이지 스크롤 + +## 옵션 + +- **기존 북마크 자동 추출**: 선택하면 로드할 때 PDF의 현재 북마크를 읽어 표시합니다. +- **일괄 모드**: 여러 북마크를 선택하여 색상, 스타일 또는 삭제 작업을 한꺼번에 적용합니다. +- **모두 펼치기/접기**: 중첩된 하위 북마크를 빠르게 표시하거나 숨깁니다. + +## 사용 사례 + +- 북마크가 없는 교재나 매뉴얼에 목차 추가 +- OCR 처리 후 스캔 문서의 북마크 구조 재정비 +- 북마크를 CSV로 내보내 스프레드시트에서 편집한 뒤 다시 가져오기 +- 페이지 참조가 잘못된 자동 생성 북마크 정리 +- 법률 준비서면의 중요한 섹션을 표시하기 위해 색상 북마크 추가 + +## 팁 + +- 대량으로 북마크를 만들 때는 CSV 가져오기를 사용하세요. 형식은 간단합니다. `title,page,level`이며 level 1이 최상위입니다. +- 지정 모드에서는 PDF 페이지의 정확한 위치를 클릭하여 북마크 대상을 지정할 수 있어, 페이지 번호만 지정하는 것보다 정밀합니다. +- 큰 변경을 하기 전에 북마크를 내보내 백업해 두세요. + +## 관련 도구 + +- [목차](./table-of-contents) +- [PDF 편집기](./edit-pdf) +- [페이지 레이블 추가](./add-page-labels) diff --git a/docs/ko/tools/cbz-to-pdf.md b/docs/ko/tools/cbz-to-pdf.md new file mode 100644 index 00000000..3cf64fb9 --- /dev/null +++ b/docs/ko/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ를 PDF로 +description: 브라우저에서 CBZ 및 CBR 만화책 아카이브를 PDF로 변환합니다. 무료이며 비공개이고 업로드가 필요 없습니다. +--- + +# CBZ를 PDF로 + +만화책 아카이브 파일을 PDF로 변환합니다. CBZ와 CBR은 디지털 만화의 표준 형식으로, 이미지로 채워진 ZIP 또는 RAR 아카이브일 뿐입니다. 이 도구는 각 페이지를 추출하고 읽는 순서를 유지하며, 모든 이미지가 전체 크기 페이지가 되는 깔끔한 PDF를 만듭니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :--- | :----- | :----------------------------------------------- | +| CBZ | `.cbz` | ZIP 기반 만화 아카이브 (pdf-lib로 로컬에서 처리) | +| CBR | `.cbr` | RAR 기반 만화 아카이브 (PyMuPDF 엔진으로 처리) | + +CBZ 변환기는 아카이브 안의 JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC, JXL 이미지를 인식합니다. 비표준 형식은 삽입 전에 자동으로 PNG로 변환됩니다. + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 CBZ 또는 CBR 파일을 끌어다 놓습니다. 두 형식을 한 번에 섞어서 처리할 수 있습니다. +2. 나열된 파일을 확인합니다. 필요 없는 파일은 제거하고, 더 추가하려면 **파일 더 추가**를 클릭합니다. +3. **PDF로 변환**을 클릭합니다. CBZ 파일은 아카이브를 풀고, 이미지 파일을 이름의 자연스러운 순서로 정렬하고, 각 이미지의 실제 형식을 감지한 다음 pdf-lib로 PDF에 삽입합니다. CBR 파일은 대신 PyMuPDF 엔진으로 처리됩니다. +4. 파일이 하나면 PDF로 다운로드됩니다. 여러 파일이면 `comic-converted.zip`이라는 ZIP 아카이브가 만들어집니다. + +## 옵션 + +별도의 설정이 필요 없습니다. 각 이미지는 원본 크기에 맞춰 한 페이지가 되므로, 두 페이지에 걸친 펼침면은 넓게, 한 페이지짜리는 좁게 유지됩니다. + +## 사용 사례 + +- PDF는 지원하지만 CBZ/CBR은 지원하지 않는 태블릿이나 휴대폰 앱에서 만화 읽기 +- 디지털 만화의 특정 페이지 인쇄 +- 만화 컬렉션을 어떤 파일 뷰어로도 열 수 있는 형식으로 보관 +- 전용 만화 리더가 없는 사람과 만화 공유 + +## 팁 + +- 아카이브 안의 이미지는 자연스러운 순서로 정렬됩니다(`page2.jpg`가 `page10.jpg`보다 먼저 옵니다). 올바른 페이지 순서를 위해 파일 이름에 일관된 번호를 붙이세요. +- 변환기는 파일 확장자가 아니라 바이너리 시그니처로 이미지 형식을 감지합니다. 실수로 `.jpg`라는 이름이 붙은 PNG도 올바르게 삽입됩니다. +- CBZ 파일은 PyMuPDF 엔진을 불러오지 않고 브라우저에서 전부 처리되므로 CBR 파일보다 빠르게 변환됩니다. + +## 관련 도구 + +- [EPUB를 PDF로](./epub-to-pdf) +- [MOBI를 PDF로](./mobi-to-pdf) +- [이미지를 PDF로](./image-to-pdf) diff --git a/docs/ko/tools/change-permissions.md b/docs/ko/tools/change-permissions.md new file mode 100644 index 00000000..08f78681 --- /dev/null +++ b/docs/ko/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: 권한 변경 +description: 인쇄, 복사, 편집, 주석에 대한 PDF 사용 권한을 설정하거나 수정합니다. 256비트 AES 암호화를 사용합니다. +--- + +# 권한 변경 + +받는 사람이 PDF로 할 수 있는 일을 세밀하게 조정합니다. 파일을 비밀번호로 잠그기만 하는 기본 암호화와 달리, 이 도구는 인쇄, 복사, 편집, 주석, 양식 작성, 문서 조합, 페이지 추출을 선택적으로 허용하거나 거부할 수 있으며, 모두 256비트 AES 암호화로 적용됩니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. PDF가 이미 암호화되어 있다면 **현재 비밀번호**를 입력합니다. +3. **새 사용자 비밀번호**(열 때 필요)와 **새 소유자 비밀번호**(권한 제어) 중 하나 또는 둘 다 설정합니다. +4. 체크박스로 개별 권한을 켜거나 끕니다. +5. **권한 변경**을 클릭합니다. +6. 업데이트된 PDF를 다운로드합니다. + +새 비밀번호 필드를 둘 다 비워 두면 도구가 PDF를 완전히 복호화하여 모든 암호화와 제한을 제거합니다. + +## 권한 제어 + +| 권한 | 제어 대상 | +| -------------------- | ------------------------------------------------ | +| **인쇄 허용** | 문서를 인쇄할 수 있는지 여부 | +| **복사 허용** | 텍스트와 이미지를 선택하고 복사할 수 있는지 여부 | +| **수정 허용** | 문서 내용을 편집할 수 있는지 여부 | +| **주석 허용** | 댓글, 강조 표시, 스탬프를 추가할 수 있는지 여부 | +| **양식 작성 허용** | 대화형 양식 필드를 작성할 수 있는지 여부 | +| **문서 조합 허용** | 페이지를 삽입, 삭제, 회전할 수 있는지 여부 | +| **페이지 추출 허용** | 개별 페이지를 추출할 수 있는지 여부 | + +모든 권한이 적용되려면 소유자 비밀번호가 필요합니다. 소유자 비밀번호가 없으면 대부분의 PDF 리더가 권한 플래그를 무시합니다. + +## PDF의 권한 작동 방식 + +PDF 권한은 암호화 사양의 일부입니다. 암호화 딕셔너리에 비트 플래그로 저장되며 규격을 준수하는 PDF 리더가 이를 적용합니다. 핵심적인 차이는 다음과 같습니다. + +- **사용자 비밀번호**: 파일을 여는 데 필요합니다. +- **소유자 비밀번호**: 권한을 변경하거나 제한을 제거하는 데 필요합니다. 이 비밀번호가 없으면 권한 플래그가 사용자가 수행할 수 있는 작업을 제어합니다. + +소유자 비밀번호만 설정하면(사용자 비밀번호 없음) 누구나 파일을 열 수 있지만 허용된 작업으로만 제한됩니다. 둘 다 설정하면 파일을 열 때 비밀번호가 필요하고 인증 후에도 제한이 적용됩니다. + +## 사용 사례 + +- 보기와 인쇄는 가능하지만 편집이나 복사는 할 수 없는 보고서 배포 +- 받는 사람이 작성할 수는 있지만 수정할 수는 없는 계약서 템플릿 공유 +- 이미지 복사를 비활성화한 PDF 카탈로그 게시 +- 구조 변경은 막으면서 검토용 초안에 주석은 허용 + +## 팁 + +- 효과를 내려면 항상 소유자 비밀번호를 설정하세요. 소유자 비밀번호가 없는 권한은 강제할 수 없습니다. +- 일부 서드파티 PDF 도구는 권한 플래그를 무시합니다. 더 강력한 보호가 필요하면 PDF를 래스터화하거나 DRM 사용을 고려하세요. +- 이 도구로 오래된 RC4 암호화 PDF를 AES-256으로 업그레이드할 수 있습니다. + +## 관련 도구 + +- [PDF 보호](./protect-pdf): 세부 권한 없이 간단한 비밀번호 보호 +- [PDF 잠금 해제](./unlock-pdf): 암호화를 완전히 제거 +- [제한 제거](./remove-restrictions): 소유자 비밀번호가 있을 때 모든 제한 제거 diff --git a/docs/ko/tools/combine-single-page.md b/docs/ko/tools/combine-single-page.md new file mode 100644 index 00000000..432102c6 --- /dev/null +++ b/docs/ko/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: 한 페이지로 합치기 +description: PDF의 모든 페이지를 세로 또는 가로로 이어지는 하나의 연속된 스크롤로 이어 붙입니다. +--- + +# 한 페이지로 합치기 + +PDF의 모든 페이지를 하나의 긴 페이지로 합칩니다. 페이지를 세로(스크롤처럼) 또는 가로(나란히)로 이어 붙여 출력에 연속된 한 페이지를 만듭니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 배치 방향을 선택합니다. **세로**(페이지를 위에서 아래로 쌓음) 또는 **가로**(페이지를 나란히 배치). +3. 페이지 사이 간격을 포인트 단위로 설정합니다. +4. 페이지 사이 빈 공간의 배경색을 선택합니다. +5. 필요하면 구분선(페이지 사이의 가는 선)을 켜고 두께와 색상을 설정합니다. +6. 처리 버튼을 클릭합니다. 출력은 한 페이지짜리 PDF입니다. + +## 기능 + +- 세로 또는 가로 페이지 이어 붙이기 +- 페이지 사이 간격 설정 가능 +- 빈 공간용 배경색 선택기 +- 두께와 색상을 조절할 수 있는 선택적 구분선 +- 원본 페이지를 각각 전체 해상도로 합친 캔버스에 렌더링 + +## 옵션 + +| 옵션 | 설명 | +| --------------- | ----------------------------- | +| **방향** | 세로(쌓기) 또는 가로(나란히) | +| **페이지 간격** | 페이지 사이 간격(포인트) | +| **배경색** | 페이지 사이 영역의 색상 | +| **구분선 추가** | 페이지 사이 가는 선 켜기/끄기 | +| **구분선 두께** | 선 두께(포인트) | +| **구분선 색상** | 구분선의 색상 | + +## 사용 사례 + +- 여러 페이지의 와이어프레임이나 디자인 목업으로 긴 이미지 하나 만들기 +- 웹에 삽입할 수 있도록 문서의 연속 스크롤 보기 생성 +- 여러 페이지의 만화나 스토리보드를 하나의 띠로 이어 붙이기 +- 검토를 위해 연속된 페이지의 파노라마 보기 만들기 + +## 팁 + +- 세로 방향은 세로형 페이지 문서에 가장 적합합니다. 가로 방향은 가로형 콘텐츠에 더 적합합니다. +- 페이지가 많은 문서는 매우 길거나 넓은 출력이 만들어집니다. 일부 PDF 뷰어는 아주 큰 단일 페이지를 처리하지 못할 수 있습니다. +- 대비되는 색상의 구분선을 추가하면 원본 페이지가 어디서 끝나고 다음 페이지가 어디서 시작하는지 쉽게 알 수 있습니다. + +## 관련 도구 + +- [N-Up PDF](./n-up-pdf) +- [PDF 병합](./merge-pdf) +- [페이지 나누기](./divide-pages) diff --git a/docs/ko/tools/compare-pdfs.md b/docs/ko/tools/compare-pdfs.md new file mode 100644 index 00000000..0b25b349 --- /dev/null +++ b/docs/ko/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: PDF 비교 +description: 두 PDF 문서를 나란히 또는 오버레이 모드로 비교하며 변경 사항을 상세하게 감지하고 분류합니다. +--- + +# PDF 비교 + +두 개의 PDF를 업로드하면 무엇이 달라졌는지 정확히 확인할 수 있습니다. 이 도구는 페이지를 똑똑하게 짝지어 텍스트, 이미지, 주석, 머리글, 서식의 차이를 감지하고 나란히 보기 또는 오버레이 보기로 표시합니다. + +## 사용 방법 + +1. PDF 파일 두 개를 업로드합니다. 원본(왼쪽)과 수정본(오른쪽)입니다. +2. 도구가 콘텐츠 시그니처를 사용해 문서 간 페이지를 짝짓습니다. +3. 보기 모드를 선택합니다. **나란히 보기** 또는 **오버레이**. +4. 페이지 이동 컨트롤로 페이지 쌍 사이를 이동합니다. +5. 차이점이 강조되고 분류됩니다. 필터 패널로 특정 변경 유형에 집중할 수 있습니다. +6. 필요하면 비교 결과를 PDF 보고서로 내보냅니다. + +## 기능 + +- 콘텐츠 유사도 기반 자동 페이지 짝짓기 +- 나란히 보기와 오버레이 비교 보기 +- 변경 분류: 텍스트, 이미지, 머리글/바닥글, 주석, 서식, 배경 +- 특정 변경 유형을 표시하거나 숨기는 분류별 필터 토글 +- 쿼리 필터링을 지원하는 텍스트 변경 검색 +- 스캔 문서 비교를 위한 OCR 지원 +- 세부 검사를 위한 확대/축소 컨트롤 +- 나란히 보기에서 패널 간 동기화 스크롤 +- 비교 결과를 PDF로 내보내기 + +## 옵션 + +| 옵션 | 설명 | +| ------------- | --------------------------------------------------------------------- | +| **보기 모드** | 나란히 보기 또는 오버레이 | +| **OCR** | 스캔 문서 비교를 위한 OCR 사용/사용 안 함 | +| **OCR 언어** | OCR 텍스트 추출에 사용할 언어 | +| **분류 필터** | 텍스트, 이미지, 머리글/바닥글, 주석, 서식, 배경 변경의 표시 여부 전환 | +| **변경 범위** | 오버레이 모드에서 모든 변경 또는 콘텐츠만 필터링 | +| **확대/축소** | 세부 검사를 위한 배율 조정 | + +## 사용 사례 + +- 계약서 개정본을 검토하여 버전 간 정확히 무엇이 바뀌었는지 확인 +- 디자인 목업을 비교하여 PDF 내보내기가 기대와 일치하는지 확인 +- 모든 수정 사항을 추적해야 하는 규제 산업에서 문서 변경 감사 +- PDF 변환 과정이 원본 내용을 정확히 보존했는지 확인 +- 번역 문서를 원본과 비교하여 레이아웃 변경 확인 + +## 팁 + +- 오버레이 보기는 두 문서를 겹쳐 놓기 때문에 위치가 달라진 요소나 크기가 바뀐 이미지 같은 공간적 차이가 바로 눈에 띕니다. +- 텍스트 레이어가 없는 스캔 문서를 비교할 때는 OCR을 켜세요. 비교 엔진이 페이지 이미지에서 텍스트를 추출합니다. +- 분류 필터를 사용해 중요한 것에 집중하세요. 예를 들어 텍스트 내용의 차이만 필요하다면 서식 변경을 숨기세요. + +## 관련 도구 + +- [메타데이터 보기](./view-metadata) +- [PDF OCR](./ocr-pdf) +- [PDF 병합](./merge-pdf) diff --git a/docs/ko/tools/compress-pdf.md b/docs/ko/tools/compress-pdf.md new file mode 100644 index 00000000..f88fc8f4 --- /dev/null +++ b/docs/ko/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: PDF 압축 +description: Hyper Compress 엔진으로 PDF 파일 크기를 최대 90%까지 줄입니다. 목표 파일 크기, 일괄 처리, 사용자 지정 품질 설정을 지원합니다. +--- + +# PDF 압축 + +PDF 파일을 망가뜨리지 않고 줄입니다. PDF 압축은 BentoPDF의 자체 압축 엔진인 [Hyper Compress](https://www.bentopdf.com/hyper-compress)로 구동됩니다. 이미지를 다시 압축하고, 글꼴을 서브셋으로 만들어 병합하며, 내장 썸네일과 비공개 애플리케이션 데이터 같은 불필요한 용량을 제거합니다. PDF는 완전히 기능을 유지합니다. 텍스트는 계속 선택할 수 있고 링크와 양식 필드도 계속 작동합니다. + +Hyper Compress는 WebAssembly로 컴파일되어 BentoPDF에 포함되어 있으므로 별도 설정 없이 오프라인과 외부와 단절된 환경에서도 압축이 작동합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. +2. **압축 수준**을 선택합니다. 낮음, 중간, 높음 또는 무손실. +3. 필요하면 **목표 파일 크기**를 입력하거나, **사용자 지정 설정**을 펼쳐 **회색조로 변환**을 포함한 세부 설정을 조정합니다. +4. **PDF 압축**을 클릭합니다. 파일이 여러 개이면 하나의 ZIP으로 다운로드됩니다. + +## 특수 문서 + +- **디지털 서명된 PDF**는 변경하면 서명이 무효가 되므로 그대로 반환됩니다. 사용자 지정 설정에서 **콘텐츠 보호 재정의**를 켜면 서명을 제거하고 압축합니다. 화면에 보이는 서명은 페이지에 남지만 파일은 더 이상 서명된 상태가 아닙니다. +- **PDF/A 파일**은 압축 후 PDF/A 표시를 잃습니다. 더 이상 충족하지 못하는 준수 상태를 파일이 주장하지 않도록 하기 위해서입니다. 대신 파일의 준수 상태를 유지하려면 사용자 지정 설정에서 **PDF/A 유지**를 켜세요. +- **비밀번호로 보호된 PDF**는 파일 카드에 비밀번호 필드가 표시됩니다. 여기에 비밀번호를 입력하면 Hyper Compress가 별도의 잠금 해제 단계 없이 파일을 직접 엽니다. 잠긴 파일이 둘 이상이면 하나의 공유 필드가 같은 비밀번호를 쓰는 모든 파일의 잠금을 해제합니다. 압축된 사본에는 비밀번호가 없으므로, 다시 설정하려면 [PDF 보호](./protect-pdf)를 사용하세요. +- **텍스트 레이어가 없는 스캔본**은 사용자 지정 설정의 **페이지 래스터화**로 더 줄일 수 있습니다. 이 옵션은 각 페이지를 최적화된 이미지 하나로 바꿉니다. OCR 처리된 스캔본을 포함해 선택 가능한 텍스트가 있는 문서에서는 **콘텐츠 보호 재정의**를 켜지 않는 한 건너뜁니다. 켜면 텍스트 페이지도 이미지가 되어 텍스트를 선택할 수 없고 링크도 작동하지 않습니다. + +## 압축 수준 + +| 수준 | 이미지 품질 | 최대 해상도 | 적합한 용도 | +| ---------- | ---------------- | ----------- | ---------------------- | +| **낮음** | 80 | 200 DPI | 시각적 품질 보존 | +| **중간** | 50 | 150 DPI | 일반 문서 | +| **높음** | 20 | 72 DPI | 이메일 첨부, 웹 업로드 | +| **무손실** | 이미지 변경 없음 | 변경 없음 | 보관용 사본 | + +높음은 14개의 표준 PDF 글꼴과, 안전한 경우 Arial 같은 유사 글꼴의 내장도 해제합니다. + +## 목표 파일 크기 + +KB 또는 MB 단위로 크기를 입력하면 Hyper Compress가 선택한 수준에서 시작하여 그 크기에 맞는 최선의 이미지 품질을 찾습니다. 문서가 그만큼 작아질 수 없으면 만들 수 있는 가장 작은 버전과 함께 그 사실을 알리는 메시지가 표시됩니다. [PDF를 1MB로 압축](https://www.bentopdf.com/compress-pdf-to-1mb) 같은 전용 페이지는 목표가 이미 입력된 상태로 열립니다. + +## 사용자 지정 설정 + +사용자 지정 설정 패널을 펼쳐 Hyper Compress를 직접 조정합니다. 압축 수준을 선택하면 이 값들이 해당 수준의 값으로 초기화되고, 하나라도 수정하면 수준이 사용자 지정으로 바뀝니다. + +- **콘텐츠 보호 재정의**: 기본적으로 Hyper Compress는 서명된 PDF를 건드리지 않고 텍스트가 있는 페이지를 래스터화하지 않습니다. 이 옵션을 켜면 둘 다 우회합니다. 수준을 바꿔도 켜진 상태로 유지됩니다. + +- **이미지**: 이미지 품질, 최대 해상도, 강제 리샘플링, 색상 감소, 보이지 않는 이미지 영역 잘라내기, 대체 이미지 제거, 색상 프로필 단순화, JPEG 2000, 무손실 모드 +- **글꼴**: 서브셋 생성, 중복 병합, 표준 글꼴과 유사 글꼴의 내장 해제 +- **콘텐츠**: 주석, 양식 필드, 링크 평면화 +- **정리**: 썸네일, 애플리케이션 데이터, 아티클 스레드, 웹 캡처 정보, 구조 트리, 출력 인텐트 제거 +- **래스터화**: 이미지만 있는 스캔본을 위해 페이지를 이미지로 교체. 문서에 선택 가능한 텍스트가 있으면 건너뜀 +- **출력**: PDF/A 유지, 지원하는 PDF 2.0 리더를 위한 Brotli 압축 + +## 사용 사례 + +- 50MB 보고서를 이메일 첨부 한도 이하로 줄이기 +- 목표 파일 크기로 스캔본을 포털의 엄격한 업로드 한도 이하로 맞추기 +- 웹사이트 다운로드를 빠르게 하기 위해 마케팅 PDF 최적화 +- 저장 비용이 중요한 대규모 문서 세트 보관 +- 메신저 앱으로 PDF를 공유할 때 모바일 데이터 사용량 절감 + +## 팁 + +- 중간으로 시작하세요. 결과가 여전히 크면 목표 파일 크기를 설정하거나 높음으로 올리세요. +- 텍스트 레이어가 없는 스캔본은 사용자 지정 설정에서 페이지 래스터화를 켜세요. +- 사용자 지정 설정의 회색조로 변환은 색상이 많은 문서의 파일 크기를 줄일 수 있습니다. + +## 관련 도구 + +- [PDF 선형화](./linearize-pdf): 압축한 PDF를 빠른 웹 보기에 맞게 최적화 +- [PDF 래스터화](./rasterize-pdf): 텍스트가 있는 페이지를 포함해 특정 DPI의 이미지로 페이지 변환 +- [PDF 복구](./repair-pdf): 다른 곳에서 압축하다 손상된 PDF 수정 +- [메타데이터 제거](./remove-metadata): 개인정보 보호를 위해 숨겨진 데이터 제거 diff --git a/docs/ko/tools/crop-pdf.md b/docs/ko/tools/crop-pdf.md new file mode 100644 index 00000000..8c53134b --- /dev/null +++ b/docs/ko/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: PDF 자르기 +description: Cropper.js 기반 편집기로 각 페이지에 자르기 영역을 그려 PDF 페이지를 시각적으로 자릅니다. +--- + +# PDF 자르기 + +시각적인 자르기 인터페이스로 PDF 페이지의 여백을 다듬습니다. 각 페이지에 직접 자르기 사각형을 그리고, 결과를 미리 보고, 자르기를 적용하세요. 페이지마다 다른 자르기 영역을 지정하거나 문서 전체에 같은 자르기를 적용할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 자르기 편집기가 열리고 드래그할 수 있는 자르기 오버레이와 함께 첫 페이지가 표시됩니다. +3. 가장자리나 모서리를 끌어 자르기 사각형을 조정합니다. +4. 페이지 이동 버튼으로 페이지 사이를 이동하며 각 페이지의 자르기 영역을 설정합니다. +5. **자르기**를 클릭하여 자르기를 적용하고 결과를 다운로드합니다. + +## 기능 + +- 정밀 조정용 핸들이 있는 Cropper.js 기반 시각적 자르기 편집기 +- 페이지별로 이동하며 개별 자르기 영역 설정 +- 페이지마다 자르기 설정을 저장하므로 페이지별로 다른 자르기 지정 가능 +- 선택한 자르기 영역의 실시간 미리 보기 +- 모든 페이지 크기와 방향의 PDF 지원 + +## 사용 사례 + +- 스캔 문서의 넓은 여백을 제거하여 콘텐츠 영역에 집중 +- 인쇄 전 PDF에서 프린터 자르기 표시나 등록 표시 제거 +- 강의 슬라이드에서 발표자 노트 영역 자르기 +- 문서 발췌본을 공유하기 전에 모든 페이지의 머리글이나 바닥글 제거 +- 특정 화면이나 인쇄 레이아웃에 맞게 페이지 크기 조정 + +## 팁 + +- 자르기 오버레이는 자유롭게 크기를 조정하고 위치를 옮길 수 있습니다. 모서리를 끌면 비율을 유지하며 크기가 바뀌고, 가장자리를 끌면 한 축으로만 조정됩니다. +- 모든 페이지에 같은 자르기가 필요한 문서라면 첫 페이지에서 설정하세요. 페이지를 이동해도 도구가 자르기 영역을 기억합니다. +- 시각적으로 자르는 대신 페이지 크기를 통일하려면 페이지 크기 수정 도구가 더 적합할 수 있습니다. + +## 관련 도구 + +- [PDF 편집기](./edit-pdf) +- [페이지 번호](./page-numbers) +- [빈 페이지 제거](./remove-blank-pages) diff --git a/docs/ko/tools/csv-to-pdf.md b/docs/ko/tools/csv-to-pdf.md new file mode 100644 index 00000000..4e790637 --- /dev/null +++ b/docs/ko/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV를 PDF로 +description: CSV 스프레드시트 파일을 브라우저에서 바로 서식이 적용된 PDF 표로 변환합니다. +--- + +# CSV를 PDF로 + +CSV 파일을 깔끔하게 서식이 적용된 PDF 문서로 변환합니다. 각 CSV를 구문 분석하여 출력 PDF에 표로 렌더링합니다. 받는 사람이 스프레드시트 소프트웨어 없이도 표 형식의 데이터를 인쇄하거나 공유해야 할 때 유용합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :----- | +| CSV | `.csv` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 CSV 파일을 하나 이상 끌어다 놓습니다. +2. 파일 목록을 확인합니다. 파일을 더 추가하거나 필요 없는 파일을 제거합니다. +3. **PDF로 변환**을 클릭합니다. 진행 표시기가 변환 상태를 보여 줍니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일이면 `csv-converted.zip`으로 묶입니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. CSV는 자동으로 구문 분석되어 표로 서식이 적용됩니다. + +## 출력 + +| 입력 수 | 출력 | +| :------------ | :-------------------------------------------------------- | +| 파일 1개 | PDF 한 개 다운로드 (예: `data.pdf`) | +| 파일 2개 이상 | 파일당 PDF 하나를 담은 ZIP 아카이브 (`csv-converted.zip`) | + +## 사용 사례 + +- 내보낸 데이터베이스 보고서를 인쇄 가능한 PDF 표로 변환 +- Excel이 없는 사람과 재무 데이터나 재고 목록 공유 +- 규정 준수 문서화를 위해 CSV 로그 파일의 PDF 버전 만들기 +- CSV로 저장된 주소 목록, 성적표 등 표 형식 데이터 인쇄 + +## 팁 + +- 최상의 결과를 위해 CSV가 표준 쉼표 구분자를 사용하는지 확인하세요. 이 도구는 일반적인 CSV 구문 분석 규칙을 따릅니다. +- CSV에 열이 많으면 표가 페이지 너비에 맞게 압축될 수 있습니다. 넓은 데이터 세트는 여러 파일로 나누는 것을 고려하세요. +- Excel 파일(`.xls`, `.xlsx`)은 스프레드시트 서식과 여러 시트를 유지하는 [Excel을 PDF로](./excel-to-pdf) 도구를 사용하세요. + +## 관련 도구 + +- [Excel을 PDF로](./excel-to-pdf) +- [텍스트를 PDF로](./txt-to-pdf) +- [JSON을 PDF로](./json-to-pdf) diff --git a/docs/ko/tools/delete-pages.md b/docs/ko/tools/delete-pages.md new file mode 100644 index 00000000..e2db2bbb --- /dev/null +++ b/docs/ko/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: 페이지 삭제 +description: 페이지 번호, 범위 또는 시각적 썸네일 선택으로 PDF에서 특정 페이지를 제거합니다. +--- + +# 페이지 삭제 + +PDF 문서에서 불필요한 페이지를 제거합니다. 페이지 번호나 범위를 입력하여 삭제할 페이지를 지정하거나, 페이지 썸네일을 직접 클릭하여 제거할 페이지로 표시하세요. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 도구가 모든 페이지의 썸네일 미리 보기를 렌더링합니다. +2. 텍스트 필드에 범위 구문(예: `2, 5-8`)으로 삭제할 페이지를 입력하거나, 썸네일을 클릭하여 선택을 전환합니다. +3. 표시된 페이지는 시각적으로 강조되어 선택 내용을 확인할 수 있습니다. +4. 처리 버튼을 클릭합니다. 선택한 페이지가 제거된 새 PDF가 만들어집니다. + +## 기능 + +- 범위 구문(`2, 5-8, 12`)을 사용한 텍스트 기반 페이지 선택 +- 클릭으로 삭제할 페이지를 선택하는 시각적 썸네일 그리드 +- 삭제로 표시된 페이지의 실시간 미리 보기 강조 +- 실제 페이지 수에 대한 입력 검증 +- 삭제하지 않은 모든 페이지를 원래 순서대로 유지 + +## 사용 사례 + +- 스캔 문서에서 빈 페이지나 불필요한 페이지 제거 +- 문서를 공유하기 전에 표지나 부록 제거 +- 최종 PDF에 실수로 남은 초안 페이지 정리 +- 배포 전에 민감한 정보가 있는 페이지 제거 + +## 팁 + +- 페이지를 삭제해도 나머지 페이지의 내용이나 서식에는 영향이 없습니다. 출력은 제거된 페이지를 뺀 원본의 충실한 사본입니다. +- 특정 페이지를 제거하는 대신 특정 페이지만 남기려면 [페이지 추출](./extract-pages)이 더 적합합니다. +- 썸네일 보기는 지연 로딩되므로 큰 문서에서도 반응성이 유지됩니다. + +## 관련 도구 + +- [페이지 추출](./extract-pages) +- [정리 및 복제](./organize-pdf) +- [PDF 분할](./split-pdf) diff --git a/docs/ko/tools/deskew-pdf.md b/docs/ko/tools/deskew-pdf.md new file mode 100644 index 00000000..401acb54 --- /dev/null +++ b/docs/ko/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF 기울기 보정 +description: OpenCV 기울기 감지로 스캔한 PDF의 기울어진 페이지를 자동으로 바로잡습니다. 임계값과 DPI를 조정할 수 있습니다. +--- + +# PDF 기울기 보정 + +스캔한 문서가 완벽하게 반듯한 경우는 드뭅니다. 약간만 기울어도 OCR 정확도가 떨어지고 인쇄물이 어수선해 보입니다. 이 도구는 OpenCV의 이미지 처리 알고리즘으로 각 페이지의 기울기 각도를 감지하고 수평으로 다시 돌려 놓습니다. + +## 사용 방법 + +1. 스캔한 PDF를 하나 이상 업로드합니다. +2. **기울기 임계값**을 설정합니다. 감지된 기울기가 이 값보다 작은 페이지는 그대로 둡니다. +3. 처리 품질(DPI)을 선택합니다. DPI가 높을수록 감지 정확도가 올라가지만 시간이 더 걸립니다. +4. **PDF 기울기 보정**을 클릭합니다. +5. 처리가 끝나면 결과 패널에 각 페이지의 감지된 각도와 보정 여부가 표시됩니다. + +## 옵션 + +| 설정 | 값 | 기본값 | +| ----------------- | -------------------- | ------ | +| **기울기 임계값** | 0.1, 0.5, 1.0, 2.0도 | 0.5 | +| **처리 DPI** | 100, 150, 200, 300 | 150 | + +## 기울기 감지 방식 + +도구는 선택한 DPI로 각 페이지를 이미지로 렌더링한 다음 OpenCV로 콘텐츠의 주된 선 각도를 감지합니다. 감지된 기울기가 임계값을 넘으면 페이지를 반대 각도로 회전시켜 바로잡습니다. 임계값 미만의 페이지는 그대로 통과합니다. + +## 사용 사례 + +- 일괄 스캔한 계약서나 법률 문서 정리 +- OCR 처리를 위한 스캔 영수증이나 청구서 준비 +- 용지 놓는 위치가 일정하지 않은 평판 스캐너로 스캔한 페이지 바로잡기 +- 디지털화한 보관 자료의 시각적 품질 향상 + +## 팁 + +- OCR을 위해 픽셀 단위의 정렬이 필요하다면 임계값을 0.1도로 낮추세요. +- 150 DPI는 대부분의 문서에서 빠르고 정확합니다. 아주 작은 텍스트나 세밀한 페이지에는 300 DPI를 사용하세요. +- 기울기 보정은 가로 텍스트 줄이 뚜렷한 문서에서 가장 잘 작동합니다. 대부분 이미지이거나 대각선 디자인 요소가 있는 페이지에서는 어려울 수 있습니다. + +## 관련 도구 + +- [PDF 래스터화](./rasterize-pdf): 보정된 출력을 평면 이미지 기반 PDF로 변환 +- [PDF 압축](./compress-pdf): 기울기 보정 후 파일 크기 축소 +- [PDF 복구](./repair-pdf): 스캔한 PDF의 구조 문제 수정 diff --git a/docs/ko/tools/digital-sign-pdf.md b/docs/ko/tools/digital-sign-pdf.md new file mode 100644 index 00000000..05d37a74 --- /dev/null +++ b/docs/ko/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: 디지털 서명 +description: X.509 인증서로 PDF에 암호화 디지털 서명을 추가합니다. PKCS#12 및 PEM 형식과 보이는 서명 옵션을 지원합니다. +--- + +# 디지털 서명 + +디지털 서명은 특정 사람이 문서에 서명했고 그 이후 문서가 변경되지 않았음을 보여 주는 암호학적 증거입니다. 단순한 이미지일 뿐인 그려 넣은 서명과 달리, 디지털 서명은 X.509 인증서와 PKCS#7 표준을 사용하여 검증 가능한 진위성과 무결성을 제공합니다. + +BentoPDF는 디지털 서명을 전부 브라우저에서 적용합니다. 개인 키는 기기 밖으로 나가지 않습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 인증서 파일(.pfx, .p12 또는 .pem)을 업로드합니다. +3. 인증서 비밀번호를 입력하여 잠금을 해제합니다. 도구가 인증서의 주체, 발급자, 유효 기간을 표시합니다. +4. 필요하면 서명 메타데이터(사유, 위치, 연락처)를 설정합니다. +5. 필요하면 위치, 크기, 이미지, 텍스트를 사용자 지정할 수 있는 **보이는 서명**을 켭니다. +6. **PDF 서명**을 클릭합니다. + +## 지원하는 인증서 형식 + +| 형식 | 확장자 | 설명 | +| ----------- | ---------- | ------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | 개인 키와 인증서 체인을 담은 업계 표준 번들입니다. 가장 일반적인 형식입니다. | +| **PEM** | .pem | 텍스트 기반 형식입니다. 인증서와 개인 키가 한 파일에 모두 있어야 합니다. 암호화된 개인 키를 지원합니다. | + +## 보이는 서명 옵션 + +켜면 PDF 페이지에 보이는 서명 블록이 렌더링됩니다. + +- **위치**: X/Y 좌표와 너비/높이(포인트) +- **페이지**: 첫 페이지, 마지막 페이지, 모든 페이지 또는 특정 페이지 번호 +- **이미지**: PNG, JPG 또는 WebP 이미지 업로드(손글씨 서명, 회사 직인 등) +- **텍스트**: 색상과 글꼴 크기를 설정할 수 있는 사용자 지정 텍스트. 이미지나 텍스트를 제공하지 않으면 도구가 인증서의 일반 이름(common name)과 현재 날짜로 텍스트를 자동 생성합니다. + +## 서명 메타데이터 + +- **사유**: 문서에 서명한 이유(예: "승인됨", "검토됨") +- **위치**: 서명이 이루어진 장소(예: "New York, NY") +- **연락처**: 서명자에게 연락하는 방법(예: 이메일 주소) + +## 인터넷 연결 참고 + +서명에는 인터넷 연결이 필요할 수 있습니다. 서명 라이브러리가 인증서의 AIA(Authority Information Access) 확장에 포함된 URL에서 인증서 체인을 가져옵니다. 해당 서버에 접속할 수 없으면 체인 검증이 필요한 인증서의 서명이 실패합니다. + +## 사용 사례 + +- 법적 효력이 있는 디지털 서명으로 계약서, 제안서, 합의서 서명 +- PKI 기반 인증이 필요한 워크플로에서 공식 문서 인증 +- 규정 준수를 위한 PDF 청구서 서명(많은 EU 국가가 디지털 서명된 전자 청구서를 요구합니다) +- 엔지니어링 도면이나 품질 문서에 조직의 승인 추가 + +## 팁 + +- 자체 서명 인증서는 테스트에는 쓸 수 있지만 Adobe Reader에서 경고가 표시됩니다. 실제 운영 문서에는 신뢰할 수 있는 인증 기관의 인증서를 사용하세요. +- 보이는 서명은 순전히 시각적인 것입니다. 보이는 블록을 켜든 켜지 않든 암호화 서명은 포함됩니다. +- 서명 검증 도구로 서명된 PDF를 확인하여 서명이 온전한지 검증하세요. + +## 관련 도구 + +- [서명 검증](./validate-signature-pdf): 서명된 PDF의 디지털 서명 확인 +- [PDF 평면화](./flatten-pdf): 서명 전에 양식을 평면화하여 수정 방지 +- [PDF 보호](./protect-pdf): 디지털 서명 위에 비밀번호 보호 추가 +- [메타데이터 제거](./remove-metadata): 서명 전에 메타데이터 제거 diff --git a/docs/ko/tools/divide-pages.md b/docs/ko/tools/divide-pages.md new file mode 100644 index 00000000..5b6d3f90 --- /dev/null +++ b/docs/ko/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: 페이지 분할 +description: PDF 페이지를 가로 또는 세로로 더 작은 하위 페이지로 나눕니다. +--- + +# 페이지 분할 + +개별 PDF 페이지를 가로 또는 세로로 잘라 반으로 나눕니다. 한 페이지에 별도의 페이지로 분리해야 할 내용이 들어 있을 때 유용합니다. 예를 들어 2단 레이아웃이 넓은 한 페이지로 스캔된 경우입니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 나누기 방향을 선택합니다. **세로**(왼쪽/오른쪽 절반) 또는 **가로**(위/아래 절반). +3. 필요하면 나눌 페이지를 제한하는 페이지 범위를 지정합니다. 비워 두면 모든 페이지를 나눕니다. +4. 처리 버튼을 클릭하여 나눈 PDF를 생성합니다. + +## 기능 + +- 세로 나누기: 각 페이지를 왼쪽과 오른쪽 절반으로 나눔 +- 가로 나누기: 각 페이지를 위쪽과 아래쪽 절반으로 나눔 +- 특정 페이지만 선택적으로 나누는 페이지 범위 필터 +- 대상이 아닌 페이지는 그대로 통과 +- 다시 렌더링하지 않고 콘텐츠 품질 유지 + +## 사용 사례 + +- 2쪽씩 스캔된 페이지 분리(예: 한 장에 왼쪽과 오른쪽 페이지가 함께 있는 책 스캔) +- 내용이 나란히 있는 가로형 PDF를 개별 세로형 페이지로 나누기 +- 긴 인포그래픽이나 포스터를 위쪽과 아래쪽 섹션으로 나누기 +- 와이드 포맷 문서를 표준 용지 인쇄용으로 준비 + +## 팁 + +- 페이지의 콘텐츠 분포가 고르지 않아도 나누기는 정확히 중간 지점에서 이루어집니다. 비대칭으로 나누려면 [PDF 자르기](./crop-pdf)를 대신 고려하세요. +- 나누기 전이나 후에 페이지를 회전해야 한다면 이 도구를 [PDF 회전](./rotate-pdf)과 함께 사용하세요. + +## 관련 도구 + +- [PDF 분할](./split-pdf) +- [PDF 자르기](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [PDF 포스터화](./posterize-pdf) diff --git a/docs/ko/tools/duplex-collate.md b/docs/ko/tools/duplex-collate.md new file mode 100644 index 00000000..ef53ece1 --- /dev/null +++ b/docs/ko/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: 양면 스캔 정렬 +description: 앞면 페이지와 뒷면 페이지가 별도 블록으로 들어 있는 양면 스캔 PDF를 올바른 앞면/뒷면 순서로 재정렬합니다. +--- + +# 양면 스캔 정렬 + +양면 스캔 정렬은 하나의 PDF에 두 개의 페이지 블록이 들어 있는 ADF 스캔 워크플로를 위해 설계되었습니다. + +- 모든 앞면이 먼저 +- 모든 뒷면이 그다음 + +수동으로 나누고 다시 조립하는 대신, 이 도구가 두 블록을 자연스러운 읽기 순서(앞면1, 뒷면1, 앞면2, 뒷면2 등)로 교차 배열합니다. + +## 사용 방법 + +1. 양면 스택 스캔으로 만든 PDF 하나를 업로드합니다. +2. 앞면 블록이 끝나는 분할 지점을 설정합니다. +3. 뒷면 블록 처리 방식을 선택합니다. + - **뒷면 블록 뒤집기** (뒷면을 스캔하기 전에 스택을 뒤집은 경우 일반적) + - **뒷면 블록 그대로 유지** +4. **PDF 정렬**을 클릭하여 재정렬된 결과를 다운로드합니다. + +## 옵션 + +- **분할 지점 자동 감지(절반)**: 분할 지점을 `ceil(totalPages / 2)`로 설정합니다. +- **홀수 페이지 경고**: 전체 페이지 수가 홀수이면 경고합니다(스캔 불일치인 경우가 많습니다). +- **불균등 블록 확인**: 앞면/뒷면 블록 크기가 다르면 확인을 요청합니다. +- **그룹 내보내기**: 정렬된 출력을 원본 문서의 페이지 수에 따라 별도의 PDF로 나누고 ZIP으로 다운로드합니다. + +## 출력 동작 + +- **기본**: 출력 PDF 하나(입력 PDF 하나에 출력 PDF 하나). +- **그룹 모드**: 문서당 페이지 수 값에 따라 출력을 나눕니다. 여러 덩어리가 만들어지면 하나의 ZIP으로 다운로드되고, 그렇지 않으면 PDF 하나가 다운로드됩니다. + +블록 크기가 다르면 짝이 맞는 페이지를 먼저 정렬하고, 짝이 없는 나머지 페이지는 끝에 덧붙입니다. + +## 일반적인 사용 사례 + +- 양면 양식 더미를 두 번에 나누어 스캔한 후 순서 복원 +- 모든 앞면을 먼저, 모든 뒷면을 나중에 출력하는 사무용 스캐너의 앞면/뒷면 묶음 재구성 +- 문서별 파일로 나누기 전 보관용 스캔 후처리 + +## 팁 + +- 대부분의 양면 배치는 전체 페이지 수가 짝수여야 합니다. +- 뒷면이 거꾸로 보이면 **뒷면 블록 뒤집기**와 **뒷면 블록 그대로 유지** 사이를 전환해 보세요. +- 2페이지짜리 원본(앞면+뒷면)에는 문서당 페이지 수를 `2`로 하여 그룹 내보내기를 사용하세요. + +## 관련 도구 + +- [페이지 교차 병합](./alternate-merge) +- [PDF 분할](./split-pdf) +- [PDF 병합](./merge-pdf) +- [정리 및 복제](./organize-pdf) diff --git a/docs/ko/tools/edit-attachments.md b/docs/ko/tools/edit-attachments.md new file mode 100644 index 00000000..f53612b4 --- /dev/null +++ b/docs/ko/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: 첨부파일 편집 +description: PDF 문서에 포함된 파일 첨부를 확인하고 선택적으로 제거합니다. +--- + +# 첨부파일 편집 + +PDF 안의 파일 첨부를 확인하고 관리합니다. 도구가 포함된 모든 파일을 이름과 첨부 수준과 함께 나열하며, 개별 첨부파일을 제거 대상으로 표시하거나 한꺼번에 모두 제거할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 도구가 자동으로 첨부파일을 검색하여 목록으로 표시합니다. +3. 각 첨부파일에 파일 이름과 문서 수준인지 페이지 수준인지가 표시됩니다. +4. 첨부파일 옆의 휴지통 아이콘을 클릭하면 제거 대상으로 표시됩니다(다시 클릭하면 표시가 해제됩니다). +5. **모든 첨부파일 제거** 버튼으로 전체를 한 번에 선택하거나, **모두 선택 해제**로 선택을 지웁니다. +6. 처리 버튼을 클릭하면 선택한 첨부파일이 제거된 새 PDF가 저장됩니다. + +## 기능 + +- 모든 문서 수준 및 페이지 수준 첨부파일 나열 +- 개별 또는 일괄 첨부파일 제거 +- 변경을 확정하기 전에 선택을 켜고 끄기 +- 제거 대상으로 표시된 항목에 취소선과 투명도 변경 적용 +- 선택한 첨부파일이 제거된 수정된 PDF 다운로드 + +## 사용 사례 + +- 문서를 재배포하기 전에 오래되었거나 잘못된 포함 파일 제거 +- 공유하기 전에 PDF에서 민감한 첨부파일(재무 데이터, 개인 정보) 제거 +- 더 이상 필요 없는 큰 포함 파일을 제거하여 PDF 파일 크기 줄이기 +- 포함된 콘텐츠를 점검하고 보관하기 전에 문서 정리 + +## 팁 + +- 제거 대상으로 표시된 첨부파일은 취소선으로 표시됩니다. 마음이 바뀌면 처리하기 전에 표시를 되돌릴 수 있습니다. +- 첨부파일이 없으면 도구에 "첨부파일을 찾을 수 없습니다"라는 메시지가 표시됩니다. PDF에 포함된 파일이 없다는 뜻입니다. + +## 관련 도구 + +- [첨부파일 추가](./add-attachments) +- [첨부파일 추출](./extract-attachments) +- [메타데이터 보기](./view-metadata) diff --git a/docs/ko/tools/edit-metadata.md b/docs/ko/tools/edit-metadata.md new file mode 100644 index 00000000..42740212 --- /dev/null +++ b/docs/ko/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: 메타데이터 편집 +description: 제목, 작성자, 키워드, 날짜, 사용자 지정 속성을 포함한 PDF 메타데이터 필드를 확인하고 수정합니다. +--- + +# 메타데이터 편집 + +PDF 파일에 포함된 메타데이터를 편집합니다. 도구가 문서의 기존 메타데이터로 양식을 미리 채우고, 원하는 필드를 수정한 뒤 변경 사항을 새 PDF에 저장합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 도구가 현재 메타데이터를 읽어 양식에 채웁니다. +2. 표준 필드(제목, 작성자, 주제, 키워드, 작성 프로그램, PDF 생성기)를 편집합니다. +3. 날짜/시간 선택기로 작성일과 수정일을 조정합니다. +4. 추가 버튼을 클릭하고 키-값 쌍을 입력하여 사용자 지정 메타데이터 필드를 추가합니다. +5. 처리 버튼을 클릭하여 수정된 PDF를 저장합니다. + +## 기능 + +- 업로드한 PDF의 기존 메타데이터를 모두 미리 채움 +- 표준 필드: 제목, 작성자, 주제, 키워드, 작성 프로그램, PDF 생성기 +- 작성일과 수정일용 날짜/시간 선택기 +- 임의 속성을 위한 사용자 지정 키-값 메타데이터 필드 +- 변경 사항을 PDF의 문서 정보 딕셔너리에 직접 저장 + +## 편집 가능한 필드 + +| 필드 | 설명 | +| -------------------- | ------------------------------------- | +| **제목** | PDF 리더에 표시되는 문서 제목 | +| **작성자** | 문서를 만든 사람 또는 조직 | +| **주제** | 문서 주제에 대한 간단한 설명 | +| **키워드** | 검색과 분류를 위한 쉼표로 구분된 용어 | +| **작성 프로그램** | 콘텐츠를 처음 만든 애플리케이션 | +| **PDF 생성기** | PDF를 생성한 애플리케이션 | +| **작성일** | 문서가 처음 만들어진 시점 | +| **수정일** | 문서가 마지막으로 수정된 시점 | +| **사용자 지정 필드** | 직접 정의하는 추가 키-값 쌍 | + +## 사용 사례 + +- 문서를 게시하기 전에 적절한 제목과 작성자 설정 +- 문서 관리 시스템에서 검색성을 높이기 위해 키워드 추가 +- 현재 개정을 반영하도록 수정일 업데이트 +- 부서, 프로젝트 ID, 분류 같은 사용자 지정 메타데이터 필드 추가 +- 원래 작성 소프트웨어가 남긴 메타데이터 정리 + +## 팁 + +- 사용자 지정 필드는 PDF의 정보 딕셔너리에 직접 기록됩니다. 일부 PDF 리더는 사용자 지정 필드를 표시하지 않을 수 있지만 파일에는 보존됩니다. +- 필드를 비워 두면 메타데이터에서 해당 값이 지워집니다. 처리 버튼은 양식에 있는 내용을 그대로 저장합니다. +- 편집 없이 메타데이터를 보려면 [메타데이터 보기](./view-metadata)를 사용하세요. 모든 메타데이터를 완전히 제거하려면 메타데이터 제거를 사용하세요. + +## 관련 도구 + +- [메타데이터 보기](./view-metadata) +- [PDF OCG 레이어](./pdf-layers) +- [PDF 압축](./compress-pdf) diff --git a/docs/ko/tools/edit-pdf.md b/docs/ko/tools/edit-pdf.md new file mode 100644 index 00000000..42726299 --- /dev/null +++ b/docs/ko/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF 편집기 +description: 브라우저에서 바로 PDF에 주석을 달고, 강조하고, 가리고, 도형과 이미지를 추가하고, 검색하고, 봅니다. +--- + +# PDF 편집기 + +BentoPDF의 PDF 편집기로 PDF에 주석을 달고, 강조하고, 가리고(교정), 댓글을 남기고, 도형과 이미지를 추가하고, 내용을 검색할 수 있습니다. 서버 업로드 없이 브라우저에서 바로 모든 기능을 갖춘 편집기를 불러옵니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. 문서가 로드된 상태로 내장 PDF 편집기가 자동으로 열립니다. +3. 도구 모음으로 주석, 강조, 가리기, 텍스트 추가, 도형 그리기, 이미지 삽입을 합니다. +4. **편집된 PDF 다운로드**를 클릭하여 변경 사항을 저장합니다. + +## 기능 + +- 강조, 밑줄, 취소선, 자유 그리기를 포함한 전체 주석 도구 모음 +- 텍스트 삽입 및 댓글 +- 가리기를 적용하면 표시한 콘텐츠를 영구적으로 제거하는 가리기(교정) 도구. **편집된 PDF 다운로드**를 클릭할 때 적용되지 않은 표시가 있으면 편집기가 먼저 적용할지 묻습니다. +- 사각형, 원, 선, 화살표용 도형 도구 +- PDF 페이지에 이미지 삽입 +- 문서 전체를 대상으로 한 내장 텍스트 검색 +- 탭을 사용한 다중 문서 지원(최대 10개 문서 동시 열기) +- 드래그 앤 드롭 파일 불러오기 + +## 사용 사례 + +- 계약서를 검토하며 강조와 댓글로 변경 사항 표시 +- 공유하기 전에 주민등록번호나 재무 데이터 같은 기밀 정보 가리기 +- 건축 도면이나 엔지니어링 도면에 주석 추가 +- 문서 페이지에 회사 로고나 스탬프 삽입 +- 긴 법률 문서에서 특정 용어 검색 + +## 팁 + +- 여러 PDF를 동시에 열고 편집기 상단의 탭 막대로 전환할 수 있습니다. +- 편집기는 원본 PDF 구조를 유지하므로 글꼴, 레이아웃, 양식 필드가 그대로 보존됩니다. +- 가리기 대상으로 텍스트나 영역을 표시해도 가리기를 적용하기 전에는 아무것도 제거되지 않습니다. 선택한 텍스트를 가리면 파일 속성, 북마크, 댓글, 첨부파일에 있는 해당 텍스트의 사본도 다운로드에서 제거됩니다(파일이 암호화되어 있지 않은 경우). +- 일괄 워터마크나 페이지 번호 작업에는 서식을 더 세밀하게 제어할 수 있는 전용 도구를 사용하세요. + +## 관련 도구 + +- [워터마크 추가](./add-watermark) +- [PDF 서명](./sign-pdf) +- [스탬프 추가](./add-stamps) +- [주석 제거](./remove-annotations) diff --git a/docs/ko/tools/email-to-pdf.md b/docs/ko/tools/email-to-pdf.md new file mode 100644 index 00000000..59bb7055 --- /dev/null +++ b/docs/ko/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: 이메일을 PDF로 +description: 브라우저에서 EML 및 MSG 이메일 파일을 PDF로 변환합니다. 헤더, 본문, 첨부파일 목록이 유지됩니다. +--- + +# 이메일을 PDF로 + +저장된 이메일 파일을 깔끔하고 인쇄 가능한 PDF로 변환합니다. 도구가 EML 및 MSG 파일을 구문 분석하여 헤더, 본문 내용, 첨부파일 메타데이터까지 전체 메시지를 추출하고 구조화된 PDF로 렌더링합니다. 법적 증거 개시, 기록 보관, 또는 중요한 이메일을 인쇄할 때 유용합니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :--- | :----- | :-------------------------------------------------------------- | +| EML | `.eml` | 표준 MIME 이메일 형식 (대부분의 이메일 클라이언트에서 내보내기) | +| MSG | `.msg` | Microsoft Outlook 전용 형식 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 EML 또는 MSG 파일을 끌어다 놓습니다. 두 형식을 한 번에 섞어서 처리할 수 있습니다. +2. 파일 목록을 확인합니다. 필요 없는 항목은 휴지통 아이콘으로 제거하고, 이메일을 더 추가하려면 **파일 더 추가**를 클릭합니다. +3. 변환 옵션을 설정합니다(아래 참조). +4. **PDF로 변환**을 클릭합니다. 도구가 각 이메일을 구문 분석하고, 콘텐츠를 스타일이 적용된 HTML로 렌더링한 뒤, PyMuPDF 엔진으로 PDF로 변환합니다. +5. 이메일이 하나면 PDF로 바로 다운로드됩니다. 여러 이메일이면 `emails-converted.zip`으로 묶입니다. + +## 옵션 + +| 옵션 | 기본값 | 설명 | +| :------------------------- | :----- | :-------------------------------------------------------------------------------- | +| **페이지 크기** | A4 | A4, Letter, Legal 중에서 선택합니다. | +| **참조 및 숨은 참조 포함** | 켜짐 | 켜면 참조(CC)와 숨은 참조(BCC) 수신자 목록이 PDF의 이메일 헤더 섹션에 표시됩니다. | +| **첨부파일 목록 포함** | 켜짐 | 켜면 이메일의 첨부파일 목록(파일 이름과 크기)이 PDF에 표시됩니다. | + +## 사용 사례 + +- 규정 준수나 감사를 위해 중요한 업무 서신을 PDF로 보관 +- 법적 절차나 증거 개시 요청을 위한 이메일 스레드 인쇄 +- 이메일로 받은 주문 확인서, 영수증, 계약서의 영구 기록 만들기 +- Outlook이 없어도 읽을 수 있는 형식으로 Outlook MSG 파일 백업 +- 내보낸 EML 파일로 고객 지원 대화 기록 + +## 팁 + +- Thunderbird, Apple Mail 등 대부분의 이메일 클라이언트에서 쓰는 EML과 Outlook MSG 파일을 모두 지원합니다. 이메일 클라이언트에서 이메일을 내보내 도구에 바로 끌어다 놓으세요. +- HTML 형식의 이메일은 PDF에서도 스타일이 유지됩니다. 일반 텍스트 이메일은 깔끔하고 읽기 쉬운 서식으로 렌더링됩니다. +- 첨부파일 목록에는 파일 이름과 크기가 표시되지만 실제 첨부파일이 PDF에 포함되지는 않습니다. + +## 관련 도구 + +- [XML을 PDF로](./xml-to-pdf) +- [XPS를 PDF로](./xps-to-pdf) diff --git a/docs/ko/tools/epub-to-pdf.md b/docs/ko/tools/epub-to-pdf.md new file mode 100644 index 00000000..85de89cb --- /dev/null +++ b/docs/ko/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB를 PDF로 +description: 브라우저에서 EPUB 전자책을 PDF로 변환합니다. 무료이며 업로드가 필요 없는 개인정보 보호 우선 변환입니다. +--- + +# EPUB를 PDF로 + +브라우저를 벗어나지 않고 EPUB 전자책을 PDF 파일로 변환합니다. EPUB는 디지털 도서의 개방형 표준이지만, 인쇄, 주석 작성 또는 전자책 리더가 없는 사람과의 공유를 위해 고정 레이아웃 PDF가 필요할 때가 있습니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :--- | :------ | :-------------------- | +| EPUB | `.epub` | EPUB 2 및 EPUB 3 파일 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 EPUB 파일을 끌어다 놓습니다. 여러 파일 선택을 지원합니다. +2. 업로드한 파일을 확인합니다. 필요 없는 항목은 휴지통 아이콘으로 제거하고, 배치를 늘리려면 **파일 더 추가**를 클릭합니다. +3. **PDF로 변환**을 클릭합니다. PyMuPDF 엔진이 EPUB 콘텐츠(텍스트, 이미지, 서식)를 페이지가 나뉜 PDF 출력으로 렌더링합니다. +4. EPUB가 하나면 PDF로 바로 다운로드됩니다. 여러 파일이면 `epub-converted.zip`이라는 ZIP 아카이브로 묶입니다. + +## 옵션 + +변환은 필수 설정 없이 합리적인 기본값으로 실행됩니다. 텍스트는 표준 페이지 크기에 맞게 재배치되며, 포함된 글꼴과 이미지는 PDF로 이어집니다. + +## 사용 사례 + +- 화면을 벗어나 읽기 위해 DRM이 없는 전자책 인쇄 +- 검토용으로 EPUB 원고를 고정 레이아웃 PDF로 제출 +- 모든 운영 체제에서 기본으로 열 수 있는 형식으로 디지털 도서 보관 +- EPUB 리더가 없는 동료와 한 챕터 공유 +- EPUB로 배포된 기술 문서를 주석을 달 수 있는 PDF로 변환 + +## 팁 + +- 내장 오디오와 비디오 같은 EPUB 3 기능은 PDF로 이어지지 않지만, 모든 텍스트, 이미지, 표는 깔끔하게 변환됩니다. +- 스타일이 많이 적용된 EPUB는 출력의 처음 몇 페이지를 확인하여 레이아웃이 충실한지 점검하세요. + +## 관련 도구 + +- [MOBI를 PDF로](./mobi-to-pdf) +- [FB2를 PDF로](./fb2-to-pdf) +- [CBZ를 PDF로](./cbz-to-pdf) diff --git a/docs/ko/tools/excel-to-pdf.md b/docs/ko/tools/excel-to-pdf.md new file mode 100644 index 00000000..dd4a722f --- /dev/null +++ b/docs/ko/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel을 PDF로 +description: Excel 스프레드시트(XLS, XLSX), ODS, CSV 파일을 서식을 유지한 채 PDF로 변환합니다. +--- + +# Excel을 PDF로 + +스프레드시트 파일을 PDF로 변환합니다. 이 도구는 최신 Excel 파일, 구형 XLS 형식, OpenDocument 스프레드시트, 심지어 CSV까지 처리하며, 모두 셀 서식, 수식(계산된 값으로), 차트, 여러 시트 레이아웃을 유지하는 브라우저 기반 LibreOffice 엔진으로 렌더링됩니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :------------------------ | :------ | +| Excel (최신) | `.xlsx` | +| Excel (구형) | `.xls` | +| OpenDocument 스프레드시트 | `.ods` | +| CSV | `.csv` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 스프레드시트 파일을 끌어다 놓습니다. +2. 파일 목록을 확인합니다. 파일을 더 추가하거나 필요 없는 파일을 제거합니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 엔진이 처음 사용할 때 초기화된 후 각 파일을 처리합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일이면 `excel-converted.zip`으로 제공됩니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. LibreOffice 엔진이 스프레드시트에 내장된 설정을 기준으로 페이지 레이아웃, 배율, 인쇄 영역을 결정합니다. + +## 출력 + +| 입력 수 | 출력 | +| :------------ | :---------------------------------------------------------- | +| 파일 1개 | PDF 한 개 다운로드 (원래 파일 이름에 `.pdf` 확장자) | +| 파일 2개 이상 | 파일당 PDF 하나를 담은 ZIP 아카이브 (`excel-converted.zip`) | + +## 사용 사례 + +- 배포를 위해 재무 보고서나 예산을 Excel에서 PDF로 변환 +- 재고나 제품 카탈로그 스프레드시트로 인쇄용 PDF 만들기 +- Excel이 설치되지 않은 이해관계자와 데이터 분석 결과 공유 +- 분기 보고서를 편집할 수 없는 형식으로 보관 +- LibreOffice Calc의 ODS 파일을 PDF로 변환 + +## 팁 + +- 스프레드시트에 포함된 차트는 PDF에 렌더링됩니다. 변환하기 전에 원본 파일에서 올바르게 보이는지 확인하세요. +- 스프레드시트에 시트가 여러 개이면 모든 시트가 PDF 출력에 포함됩니다. +- 서식이 없는 단순한 CSV 데이터는 [CSV를 PDF로](./csv-to-pdf) 도구가 더 가벼운 변환을 제공합니다. 서식, 차트, 여러 시트를 유지해야 할 때는 Excel을 PDF로를 사용하세요. + +## 관련 도구 + +- [CSV를 PDF로](./csv-to-pdf) +- [Word를 PDF로](./word-to-pdf) +- [PowerPoint를 PDF로](./powerpoint-to-pdf) diff --git a/docs/ko/tools/extract-attachments.md b/docs/ko/tools/extract-attachments.md new file mode 100644 index 00000000..459750fa --- /dev/null +++ b/docs/ko/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: 첨부파일 추출 +description: 하나 이상의 PDF에서 포함된 모든 파일 첨부를 추출하여 ZIP 아카이브로 다운로드합니다. +--- + +# 첨부파일 추출 + +하나 이상의 PDF 파일에서 포함된 모든 첨부파일을 꺼냅니다. 추출된 모든 파일은 다운로드용 하나의 ZIP 아카이브로 묶입니다. + +## 사용 방법 + +1. 첨부파일이 포함된 PDF 파일을 하나 이상 업로드합니다. +2. **첨부파일 추출**을 클릭합니다. +3. 도구가 각 PDF에서 문서 수준 및 페이지 수준 첨부파일을 검색합니다. +4. 찾은 모든 파일이 ZIP 아카이브로 묶여 자동으로 다운로드됩니다. +5. 상태 메시지가 찾은 첨부파일 수와 전체 크기를 알려 줍니다. + +## 기능 + +- 여러 PDF에서 한 번에 일괄 추출 +- 문서 수준과 페이지 수준 첨부파일을 모두 추출 +- 추출된 모든 파일을 담은 ZIP 파일 하나를 출력 +- 전체 첨부파일 수와 합계 파일 크기 표시 +- 첨부파일이 없을 때 명확한 상태 메시지 표시 + +## 사용 사례 + +- 보고서 PDF에 포함된 데이터 파일 복구 +- 포트폴리오나 사양 문서에서 이미지 자산 꺼내기 +- 교육이나 규정 준수 PDF에서 보충 자료 추출 +- PDF 묶음에 어떤 파일이 포함되어 있는지 점검 + +## 팁 + +- 도구가 첨부파일이 없다고 알려 주면, PDF에는 파일 첨부가 아닌 포함된 이미지나 양식 데이터가 들어 있을 수 있습니다. 포함된 이미지는 [이미지 추출](./extract-images)을 사용하세요. +- 여러 PDF를 처리하면 모든 파일의 첨부파일이 하나의 ZIP에 담깁니다. 파일 이름은 원래 포함된 이름이 그대로 유지됩니다. + +## 관련 도구 + +- [첨부파일 추가](./add-attachments) +- [첨부파일 편집](./edit-attachments) +- [이미지 추출](./extract-images) diff --git a/docs/ko/tools/extract-images.md b/docs/ko/tools/extract-images.md new file mode 100644 index 00000000..240bfc6b --- /dev/null +++ b/docs/ko/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: 이미지 추출 +description: PDF 파일에 포함된 모든 이미지를 추출합니다. 그리드로 미리 보고 개별적으로 또는 ZIP 아카이브로 다운로드합니다. +--- + +# 이미지 추출 + +하나 이상의 PDF 파일에 포함된 모든 이미지를 꺼냅니다. 추출된 이미지는 미리 보기 그리드에 표시되며 개별적으로 다운로드하거나 ZIP으로 한꺼번에 받을 수 있습니다. PyMuPDF로 구동됩니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. 필요에 따라 파일을 더 추가하거나 개별 파일을 제거합니다. +2. **추출**을 클릭하여 처리를 시작합니다. +3. 도구가 업로드한 모든 PDF의 모든 페이지를 검색하여 포함된 이미지를 찾아 추출합니다. +4. 추출된 이미지가 썸네일과 함께 그리드에 표시됩니다. 각 이미지에는 다운로드 버튼이 있습니다. +5. **모두 다운로드**를 클릭하여 전체를 ZIP 아카이브로 저장합니다. + +## 옵션 + +이 도구에는 설정할 수 있는 옵션이 없습니다. 포함된 모든 이미지는 원래 형식(일반적으로 PNG, JPEG 또는 PDF에 이미지를 포함할 때 사용된 형식)으로 추출됩니다. + +## 출력 형식 + +- 이미지는 `image_1.png`, `image_2.jpg` 같은 이름으로 미리 보기 그리드에 표시됩니다. +- **모두 다운로드**는 모든 이미지를 담은 `extracted-images.zip`을 만듭니다. +- 그리드에서 이미지를 하나씩 개별적으로 다운로드할 수 있습니다. + +## 사용 사례 + +- 다른 프로젝트에서 재사용하기 위해 PDF에서 사진이나 그래픽 복구 +- 전자상거래 목록을 위해 카탈로그 PDF에서 제품 이미지 추출 +- 발표 자료에 쓰기 위해 기술 문서에서 다이어그램 꺼내기 +- 문서를 공유하기 전에 어떤 이미지가 포함되어 있는지 점검 + +## 팁 + +- 도구는 PDF에 저장된 그대로 이미지를 추출합니다. 페이지를 이미지로 다시 렌더링하지는 않습니다. 그럴 때는 [PDF를 PNG로](./pdf-to-png) 또는 [PDF를 JPG로](./pdf-to-jpg)를 사용하세요. +- 도구가 "이미지를 찾을 수 없습니다"라고 알려 주면, PDF가 포함된 래스터 이미지가 아닌 벡터 그래픽을 사용하거나 페이지 전체가 하나의 큰 이미지인 스캔 문서일 수 있습니다. +- 일괄 처리는 여러 PDF에 걸쳐 작동합니다. 모든 파일의 모든 이미지가 하나의 그리드와 ZIP으로 합쳐집니다. + +## 관련 도구 + +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 JPG로](./pdf-to-jpg) +- [PDF 워크플로 빌더](./pdf-workflow) diff --git a/docs/ko/tools/extract-pages.md b/docs/ko/tools/extract-pages.md new file mode 100644 index 00000000..dad1a43a --- /dev/null +++ b/docs/ko/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: 페이지 추출 +description: PDF에서 특정 범위의 페이지를 새 문서로 저장합니다. +--- + +# 페이지 추출 + +PDF에서 여러 페이지를 꺼내 새 파일로 저장합니다. 범위 구문으로 원하는 페이지를 정확히 지정하면 도구가 해당 페이지만 담은 깔끔한 PDF를 만듭니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 도구가 파일 이름, 크기, 전체 페이지 수를 표시합니다. +2. 범위 구문(예: `1-5`, `3, 7, 10-12`)으로 추출할 페이지를 입력합니다. +3. 필요하면 각 범위를 ZIP 아카이브 안의 별도 PDF로 다운로드하도록 선택합니다. +4. 처리 버튼을 클릭합니다. 추출된 페이지가 새 PDF(또는 ZIP)로 다운로드됩니다. + +## 기능 + +- 유연한 페이지 범위 구문: 개별 페이지, 범위, 쉼표로 구분한 조합 +- 업로드 후 전체 페이지 수를 표시하여 쉽게 참조 +- 하나로 합친 PDF 또는 ZIP 안의 개별 파일로 출력하는 옵션 +- 원본 페이지 내용과 서식 유지 + +## 사용 사례 + +- 긴 보고서에서 요약(처음 몇 페이지) 꺼내기 +- 교재 PDF에서 한 챕터 추출 +- 양식 묶음에서 특정 페이지를 독립된 문서로 저장 +- 큰 파일에서 선택한 페이지로 샘플 문서 만들기 + +## 팁 + +- 페이지 번호는 1부터 시작합니다. 첫 페이지는 `0`이 아니라 `1`을 사용하세요. +- 페이지를 추출하는 대신 제거하려면 반대 작업인 [페이지 삭제](./delete-pages)를 사용하세요. +- 썸네일로 페이지를 시각적으로 선택하려면 [PDF 분할](./split-pdf)의 시각적 선택 모드를 사용하세요. + +## 관련 도구 + +- [PDF 분할](./split-pdf) +- [페이지 삭제](./delete-pages) +- [PDF 병합](./merge-pdf) diff --git a/docs/ko/tools/extract-tables.md b/docs/ko/tools/extract-tables.md new file mode 100644 index 00000000..fb4dd0de --- /dev/null +++ b/docs/ko/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: PDF 표 추출 +description: PDF 문서에서 표를 감지하고 추출합니다. 표 단위로 CSV, JSON 또는 Markdown으로 내보냅니다. +--- + +# PDF 표 추출 + +PDF의 모든 표를 감지하여 CSV, JSON, Markdown 중 원하는 형식으로 내보낼 수 있게 해 줍니다. 각 표는 페이지와 위치 메타데이터와 함께 개별적으로 추출됩니다. PyMuPDF의 표 감지 엔진으로 구동됩니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. 원하는 **내보내기 형식**을 선택합니다. CSV, JSON 또는 Markdown. +3. **추출**을 클릭하여 처리를 시작합니다. +4. 표가 하나면 파일 하나로 다운로드됩니다. 표가 여러 개이면 표당 파일 하나를 담은 ZIP 아카이브가 만들어집니다. + +## 옵션 + +- **내보내기 형식**: 다음 중에서 선택합니다. + - **CSV**: 쉼표, 따옴표 또는 줄바꿈이 포함된 필드를 올바르게 따옴표 처리한 쉼표로 구분된 값. 스프레드시트와 데이터베이스에 적합합니다. + - **JSON**: 배열의 배열 구조이며 2칸 들여쓰기로 보기 좋게 출력됩니다. 프로그램에서 사용하기에 적합합니다. + - **Markdown**: PyMuPDF가 렌더링하는 파이프 구분 표 형식. 문서와 README 파일에 적합합니다. + +## 출력 형식 + +- **표 하나**: `filename_table.csv` (또는 `.json` / `.md`) +- **표 여러 개**: `table_1_page3.csv`, `table_2_page5.csv` 같은 이름의 파일을 담은 `filename_tables.zip` + +## 사용 사례 + +- 문서 전체의 데이터를 가져오지 않고 긴 PDF 보고서에서 특정 표만 추출 +- GitHub 이슈, 위키 또는 문서에 바로 붙여 넣을 수 있도록 Markdown 형식으로 표 가져오기 +- API 연동이나 스크립트를 위해 PDF 표에서 구조화된 JSON 데이터 가져오기 +- 두 버전을 모두 CSV로 내보내 diff하여 서로 다른 PDF 버전의 표 비교 + +## 팁 + +- 이 도구는 표 단위로 제어할 수 있습니다. 모든 표를 하나의 CSV에 담기만 하면 된다면 [PDF를 CSV로](./pdf-to-csv)를 사용하세요. 전체 Excel 통합 문서가 필요하면 [PDF를 Excel로](./pdf-to-excel)를 사용하세요. +- 여러 페이지에 걸친 표는 페이지별로 별개의 표로 감지될 수 있습니다. 직접 이어 붙여야 할 수 있습니다. +- 표가 감지되지 않으면 PDF가 스캔 이미지일 수 있습니다. 먼저 OCR을 실행하여 텍스트 레이어를 추가하세요. + +## 관련 도구 + +- [PDF를 CSV로](./pdf-to-csv) +- [PDF를 Excel로](./pdf-to-excel) +- [PDF를 텍스트로](./pdf-to-text) diff --git a/docs/ko/tools/fb2-to-pdf.md b/docs/ko/tools/fb2-to-pdf.md new file mode 100644 index 00000000..d5f15fc7 --- /dev/null +++ b/docs/ko/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2를 PDF로 +description: FictionBook(FB2) 전자책 파일을 브라우저에서 PDF로 변환합니다. 무료, 개인정보 보호, 서버 업로드 없음. +--- + +# FB2를 PDF로 + +FictionBook 2(FB2) 파일을 PDF 문서로 변환합니다. FB2는 러시아와 동유럽에서 널리 쓰이는 XML 기반 전자책 형식입니다. 일부 플랫폼에서는 잘 지원되지만 다른 곳에서는 거의 알려져 있지 않으므로, PDF로 변환하면 어디서나 책을 읽을 수 있습니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :------------ | :----- | :------------------- | +| FictionBook 2 | `.fb2` | XML 기반 전자책 형식 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 FB2 파일을 끌어다 놓으세요. 여러 파일을 한꺼번에 선택할 수 있습니다. +2. 파일 목록을 확인하세요. 휴지통 아이콘으로 개별 항목을 제거하거나 **파일 더 추가**로 파일을 더 넣을 수 있습니다. +3. **PDF로 변환**을 클릭하세요. PyMuPDF 엔진이 FB2 XML 구조를 분석하여 페이지가 나뉜 PDF 콘텐츠로 렌더링합니다. +4. 파일 하나는 PDF로 바로 다운로드됩니다. 여러 파일을 변환하면 `fb2-converted.zip`으로 묶여 다운로드됩니다. + +## 옵션 + +별도 설정이 필요하지 않습니다. 변환기가 FB2 XML 구조를 자동으로 처리하며 장 구분, 서식, 포함된 이미지를 그대로 유지합니다. + +## 활용 사례 + +- PDF만 지원하는 기기나 앱에서 FB2 전자책 읽기 +- FB2 형식으로 배포된 러시아어 문학 작품 인쇄하기 +- FB2 라이브러리를 범용 형식으로 보관하기 +- FictionBook을 지원하지 않는 리더를 쓰는 사람에게 책 공유하기 + +## 팁 + +- FB2 파일은 일반 XML이라 용량이 작고 브라우저에서도 빠르게 변환됩니다. +- FB2 파일이 `.fb2.zip`으로 압축되어 있다면 먼저 압축을 풀고 업로드하세요. + +## 관련 도구 + +- [EPUB를 PDF로](./epub-to-pdf) +- [MOBI를 PDF로](./mobi-to-pdf) +- [XML을 PDF로](./xml-to-pdf) diff --git a/docs/ko/tools/fix-page-size.md b/docs/ko/tools/fix-page-size.md new file mode 100644 index 00000000..a099f54d --- /dev/null +++ b/docs/ko/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: 페이지 크기 통일 +description: PDF의 모든 페이지를 동일한 크기로 맞춥니다. 표준 용지 크기를 선택하거나 사용자 지정 크기를 설정할 수 있습니다. +--- + +# 페이지 크기 통일 + +여러 출처의 파일을 합친 PDF는 페이지 크기가 제각각인 경우가 많습니다. Letter와 A4가 섞여 있거나 표준에서 완전히 벗어난 크기가 있기도 합니다. 이 도구는 모든 페이지를 하나의 목표 크기로 맞추고, 필요에 따라 콘텐츠를 맞춤 또는 채움 방식으로 조정합니다. + +## 사용 방법 + +1. PDF 파일을 업로드하세요. +2. 드롭다운에서 **목표 페이지 크기**를 선택하세요(A4, Letter, Legal, A3, A5, Tabloid 또는 사용자 지정). +3. **방향**을 선택하세요. 자동은 각 페이지의 원래 방향을 유지하며, 세로 또는 가로로 고정할 수도 있습니다. +4. **콘텐츠 배율** 모드를 고르세요. 맞춤은 모든 콘텐츠를 보존하며 여백이 생길 수 있고, 채움은 페이지를 가득 채우며 가장자리가 잘릴 수 있습니다. +5. 필요하면 추가된 여백에 적용할 **배경색**을 설정하세요. +6. **페이지 크기 통일**을 클릭하세요. + +## 옵션 + +- **표준 크기**: A4, Letter, Legal, A3, A5, Tabloid +- **사용자 지정 크기**: 너비와 높이를 인치 또는 밀리미터로 입력 +- **방향**: 자동, 세로, 가로 +- **배율 모드**: 맞춤 또는 채움(자르기) +- **배경색**: 여백을 채울 아무 색상 + +## 활용 사례 + +- 서로 다른 스캐너에서 가져온 페이지가 섞인 병합 PDF 정리하기 +- 미국 Letter 문서를 해외 배포용 A4로 변환하기 +- 일정한 재단 크기가 필요한 인쇄용 PDF 준비하기 +- 표준에서 약간 벗어난 페이지 바로잡기(예: 8.5 x 11 대신 8.49 x 11.02 인치) + +## 팁 + +- 콘텐츠 손실이 없어야 한다면 맞춤 모드를 사용하세요. 채움 모드는 더 깔끔해 보이지만 가장자리가 잘릴 수 있습니다. +- 페이지 크기 정보 도구로 결과를 확인하여 모든 페이지가 목표 크기와 일치하는지 점검하세요. +- 기본 배경색은 흰색입니다. 문서에 어두운 여백이 있다면 어두운 색으로 바꾸세요. + +## 관련 도구 + +- [페이지 크기 정보](./page-dimensions): 수정 전후의 페이지 크기 확인 +- [PDF 압축](./compress-pdf): 크기 통일 후 파일 용량 줄이기 +- [PDF 자르기](./crop-pdf): 자동 배율 조정 대신 직접 페이지 자르기 diff --git a/docs/ko/tools/flatten-pdf.md b/docs/ko/tools/flatten-pdf.md new file mode 100644 index 00000000..baa06daf --- /dev/null +++ b/docs/ko/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: PDF 평탄화 +description: 대화형 양식과 주석을 정적 콘텐츠로 평탄화합니다. 양식 필드를 편집할 수 없게 만들고 주석을 페이지에 합칩니다. +--- + +# PDF 평탄화 + +평탄화는 양식 필드, 드롭다운, 체크박스, 주석, 하이라이트, 스티커 메모 같은 대화형 요소를 페이지 콘텐츠에 직접 합칩니다. 겉모습은 그대로지만 더 이상 편집하거나 추출할 수 없습니다. 작성한 양식을 인쇄한 뒤 다시 스캔하는 것과 같지만, 품질은 완벽하게 유지됩니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드하세요. +2. **PDF 평탄화**를 클릭하세요. +3. 파일 하나는 바로 다운로드되고, 여러 파일은 ZIP 아카이브로 제공됩니다. + +이 도구는 pdf-lib로 양식 필드를 평탄화하고(`form.flatten()` 사용), 전용 주석 평탄화기로 주석을 페이지 스트림에 합칩니다. 두 작업은 한 번에 처리됩니다. + +## 평탄화되는 항목 + +- **양식 필드**: 텍스트 입력, 체크박스, 라디오 버튼, 드롭다운, 서명 필드 +- **주석**: 댓글, 하이라이트, 취소선, 밑줄, 스티커 메모, 도장, 잉크 주석 +- **대화형 요소**: 버튼, 동작 트리거 + +## 그대로 유지되는 항목 + +- 텍스트 콘텐츠(선택 및 검색 가능) +- 이미지와 그래픽 +- 페이지 레이아웃과 크기 +- 북마크와 목차 +- 하이퍼링크(주석 기반이 아닌 경우) + +## 활용 사례 + +- 작성을 마친 양식을 잠가 수신자가 제출된 답변을 바꾸지 못하게 하기 +- 대화형 요소가 필요 없는 보관용 PDF 준비하기 +- 뷰어마다 주석이 다르게 표시되는 문제 해결하기 +- 서명된 문서가 서명 후 수정되지 않도록 보장하기 +- 양식 필드 정의와 주석 객체를 제거하여 파일 크기 줄이기 + +## 팁 + +- 모든 편집이 끝난 뒤에 평탄화하세요. 평탄화를 되돌릴 방법은 없습니다. +- 평탄화와 함께 메타데이터, JavaScript, 첨부파일까지 제거해야 한다면 PDF 정리 도구를 사용하세요. 평탄화도 옵션에 포함되어 있습니다. +- 일부 PDF에서 "양식을 찾을 수 없음"이 표시될 수 있습니다. 문서에 주석만 있고 양식 필드가 없다면 정상입니다. + +## 관련 도구 + +- [PDF 정리](./sanitize-pdf): 양식 평탄화와 함께 메타데이터, 스크립트 등 제거 +- [PDF 래스터화](./rasterize-pdf): 이미지 기반 PDF로 변환하여 완전히 평탄화 +- [폰트 윤곽선 변환](./font-to-outline): 폰트를 벡터 경로로 평탄화 +- [PDF 보호](./protect-pdf): 평탄화한 PDF를 비밀번호로 잠그기 diff --git a/docs/ko/tools/font-to-outline.md b/docs/ko/tools/font-to-outline.md new file mode 100644 index 00000000..78218441 --- /dev/null +++ b/docs/ko/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: 폰트 윤곽선 변환 +description: PDF의 모든 폰트를 벡터 윤곽선으로 변환하여 기기에 관계없이 동일하게 표시합니다. 폰트 의존성 문제를 없애줍니다. +--- + +# 폰트 윤곽선 변환 + +폰트를 윤곽선으로 변환하면 모든 텍스트 문자가 폰트 기반 글리프에서 벡터 경로로 바뀝니다. PDF가 설치된 폰트에 더 이상 의존하지 않으므로 모든 기기, 운영체제, 프린터에서 똑같이 표시됩니다. 인쇄 전 작업(프리프레스)의 표준 단계입니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드하세요. +2. **윤곽선으로 변환**을 클릭하세요. +3. Ghostscript가 모든 텍스트를 벡터 경로로 변환합니다. +4. 결과를 다운로드하세요. 여러 파일은 ZIP 아카이브로 제공됩니다. + +설정할 항목은 없습니다. 이 도구는 Ghostscript(WebAssembly)를 사용하여 모든 폰트 참조를 한 번에 윤곽선 경로로 변환합니다. + +## 변경되는 점 + +- 텍스트 문자가 벡터 곡선(베지어 경로)이 됩니다 +- 폰트를 포함할 필요가 없어집니다. PDF가 글리프 수준에서 독립적으로 완성됩니다 +- 벡터 경로가 폰트 참조보다 일반적으로 크기 때문에 파일 크기가 늘어날 수 있습니다 +- 겉모습은 그대로 보존됩니다 + +## 잃게 되는 것 + +- 텍스트 선택과 복사 및 붙여넣기 +- 텍스트 검색(Ctrl+F가 작동하지 않음) +- 텍스트 내용 편집 기능 +- 스크린 리더 접근성 + +## 활용 사례 + +- 윤곽선 처리된 폰트를 요구하는 인쇄소에 PDF 보내기 +- 사용자 지정 폰트나 라이선스 폰트를 쓴 문서를 해당 폰트가 없는 사람과 공유하기 +- 다른 시스템에서 폰트가 대체되어 문서 모양이 달라지는 것 방지하기 +- 벡터 입력이 필요한 레이저 각인 또는 CNC 절단 작업용 PDF 준비하기 +- 로고가 많은 PDF가 모든 플랫폼에서 올바르게 표시되도록 하기 + +## 팁 + +- 원본 PDF를 보관하세요. 윤곽선 변환은 되돌릴 수 없으며 경로를 편집 가능한 텍스트로 되돌릴 수 없습니다. +- 텍스트를 계속 검색할 수 있어야 한다면, 대신 PDF 래스터화 도구로 변환한 뒤 OCR을 적용하는 방법을 고려하세요. +- 윤곽선 처리된 PDF는 대체로 용량이 큽니다. 파일 크기가 중요하다면 이후에 PDF 압축을 실행하세요. + +## 관련 도구 + +- [PDF 평탄화](./flatten-pdf): 폰트는 건드리지 않고 양식과 주석 평탄화 +- [PDF 래스터화](./rasterize-pdf): 벡터 윤곽선 대신 이미지 기반 PDF로 변환 +- [PDF 압축](./compress-pdf): 윤곽선 변환 후 파일 용량 줄이기 +- [PDF를 PDF/A로](./pdf-to-pdfa): 폰트 독립성을 확보한 뒤 보관용으로 변환 diff --git a/docs/ko/tools/form-creator.md b/docs/ko/tools/form-creator.md new file mode 100644 index 00000000..811d418b --- /dev/null +++ b/docs/ko/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: PDF 양식 만들기 +description: 드래그 앤 드롭으로 텍스트 필드, 체크박스, 드롭다운, 라디오 버튼 등을 배치해 작성 가능한 PDF 양식을 만듭니다. +--- + +# PDF 양식 만들기 + +처음부터 전문적인 작성 가능 PDF 양식을 설계하거나 기존 PDF에 필드를 추가하세요. 시각적 편집기에서 텍스트 필드, 체크박스, 드롭다운, 라디오 버튼, 서명 필드 등 양식 요소를 페이지 미리보기 위로 바로 끌어다 놓을 수 있습니다. 필드 속성을 설정하고 조건부 표시 규칙을 만든 뒤, 완전한 대화형 PDF 양식으로 내보내세요. + +## 사용 방법 + +1. 기존 PDF를 업로드하거나 **빈 PDF 만들기**를 클릭해 처음부터 시작하세요. +2. 빈 PDF를 만드는 경우 페이지 크기를 선택하세요(Letter, A4, A5, Legal, Tabloid, A3 또는 사용자 지정 크기). +3. 필드 유형 도구 모음과 페이지 미리보기 영역이 있는 양식 편집기가 열립니다. +4. 도구 모음에서 필드 유형을 선택한 다음 페이지를 클릭해 배치하세요. +5. 필드를 끌어 위치를 옮기고 크기 조절 핸들로 크기를 조정하세요. +6. 필드를 클릭하면 속성 패널이 열려 필드 이름, 기본값, 글꼴 크기, 정렬 등을 설정할 수 있습니다. +7. 페이지 컨트롤로 페이지 사이를 이동하세요. +8. **저장**을 클릭해 완성된 작성 가능 PDF를 다운로드하세요. + +## 기능 + +- 크기 조절 핸들이 있는 드래그 앤 드롭 필드 배치 +- 필드 유형: 텍스트 입력, 여러 줄 텍스트, 체크박스, 드롭다운, 라디오 버튼, 서명, 날짜, 숫자, 바코드 +- 각 필드의 이름, 레이블, 기본값, 글꼴 크기, 색상, 정렬, 유효성 검사를 설정하는 속성 패널 +- 필드 동작과 조건부 표시 규칙(다른 필드 값에 따라 필드 표시/숨김) +- 여러 페이지 양식을 위한 페이지 탐색 +- 기존 필드 추출: 업로드한 PDF의 양식 필드를 자동으로 감지해 가져옴 +- 업로드한 PDF와 빈 페이지 모두 양식 캔버스로 사용 가능 +- 여러 페이지 크기 프리셋과 사용자 지정 크기 +- bwip-js 기반 바코드 생성 +- 라디오 버튼 그룹 관리 + +## 옵션 + +**페이지 크기 프리셋(빈 PDF용):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- 사용자 지정(너비와 높이 지정) + +**필드 속성(필드 유형에 따라 다름):** + +- 이름, 레이블, 자리 표시자 텍스트 +- 기본값 +- 글꼴, 크기, 색상 +- 텍스트 정렬(왼쪽, 가운데, 오른쪽) +- 필수 필드 전환 +- 읽기 전용 전환 +- 텍스트 필드 최대 길이 +- 드롭다운과 라디오 버튼의 옵션 목록 +- 조건부 표시 동작 + +## 활용 사례 + +- 개인 정보용 텍스트 필드와 정책 동의용 체크박스가 있는 신규 직원 온보딩 양식 만들기 +- 서비스 선택용 드롭다운이 있는 고객 접수 설문지 만들기 +- 계산 필드와 바코드 식별자가 있는 주문서 설계하기 +- 합격/불합격 평가용 라디오 버튼이 있는 점검 체크리스트 만들기 +- 응답에 따라 후속 질문이 나타나는 조건부 설문 양식 만들기 + +## 팁 + +- 기존 PDF를 업로드하면 이미 있는 양식 필드를 추출하려고 시도하므로 해당 필드를 편집하거나 추가할 수 있습니다. +- 라디오 버튼 그룹 기능으로 상호 배타적인 선택지를 만드세요. 같은 라디오 그룹의 필드는 그룹 이름을 공유합니다. +- 양식을 다운로드하여 [PDF 양식 작성](./form-filler)에서 열어 필드가 올바르게 동작하는지 테스트하세요. + +## 관련 도구 + +- [PDF 양식 작성](./form-filler) +- [PDF 서명](./sign-pdf) +- [PDF 편집기](./edit-pdf) diff --git a/docs/ko/tools/form-filler.md b/docs/ko/tools/form-filler.md new file mode 100644 index 00000000..203d4b80 --- /dev/null +++ b/docs/ko/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF 양식 작성 +description: XFA 양식을 포함한 PDF 양식을 내장 뷰어로 브라우저에서 바로 작성합니다. +--- + +# PDF 양식 작성 + +양식 필드가 있는 PDF를 열어 내장 뷰어에서 바로 작성하세요. 표준 AcroForm 필드와 레거시 XFA(XML Forms Architecture) 양식을 모두 지원합니다. 양식 작성을 마치면 클릭 한 번으로 작성된 버전을 다운로드할 수 있습니다. + +## 사용 방법 + +1. 양식 필드가 있는 PDF를 업로드하세요. +2. 문서가 통합 PDF 뷰어에서 열리고 양식 필드가 대화형 입력란으로 표시됩니다. +3. 텍스트 필드, 체크박스, 드롭다운, 라디오 버튼을 클릭해 내용을 입력하세요. +4. **저장 및 작성된 양식 다운로드**를 클릭하면 완성된 PDF를 받을 수 있습니다. + +## 기능 + +- 양식 필드를 완전히 조작할 수 있는 내장 PDF.js 뷰어 +- 표준 AcroForm 필드 지원(텍스트 입력, 체크박스, 드롭다운, 라디오 버튼) +- XML 기반 레거시 양식을 위한 XFA 양식 지원 +- 페이지 크기에 맞춘 뷰어 자동 크기 조정 +- 이름과 크기 정보가 있는 파일 표시 + +## 옵션 + +추가 설정 옵션은 없습니다. 양식을 업로드하고 작성한 뒤 다운로드하면 됩니다. + +## 활용 사례 + +- 세금 양식, 보험 신청서, 관공서 서류 작성하기 +- PDF 첨부파일로 받은 입사 지원서 작성하기 +- 거래처 온보딩 양식이나 공급업체 설문지 작성하기 +- 체크박스 필드가 있는 규정 준수 체크리스트 승인하기 +- 진료 예약 전 문진표 작성하기 + +## 팁 + +- XFA 양식은 일부 PDF 뷰어에서만 지원되는 레거시 형식입니다. XFA PDF를 Chrome이나 대부분의 다른 도구에서 열었을 때 빈 페이지가 보인다면 해당 뷰어가 XFA를 지원하지 않기 때문입니다. BentoPDF의 양식 작성 도구와 Firefox는 XFA를 제대로 처리합니다. +- 양식 필드가 없는 PDF는 먼저 [PDF 양식 만들기](./form-creator) 도구로 필드를 추가한 뒤 여기서 작성하세요. +- 뷰어는 PDF의 페이지 크기에 맞게 자동으로 크기를 조정합니다. + +## 관련 도구 + +- [PDF 양식 만들기](./form-creator) +- [PDF 서명](./sign-pdf) +- [PDF 편집기](./edit-pdf) diff --git a/docs/ko/tools/header-footer.md b/docs/ko/tools/header-footer.md new file mode 100644 index 00000000..9fa974c9 --- /dev/null +++ b/docs/ko/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: 머리글 및 바닥글 +description: 페이지 번호 변수를 지원하는 사용자 지정 머리글과 바닥글 텍스트를 PDF 페이지에 추가합니다. +--- + +# 머리글 및 바닥글 + +PDF 페이지의 여섯 위치(머리글 왼쪽, 가운데, 오른쪽, 바닥글 왼쪽, 가운데, 오른쪽)에 텍스트를 추가하세요. 페이지 번호와 전체 페이지 수를 나타내는 동적 변수를 지원하므로 "10페이지 중 3페이지"처럼 페이지마다 자동으로 바뀌는 템플릿을 만들 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드하세요. +2. 서식 컨트롤과 여섯 개의 텍스트 입력란이 있는 옵션 패널이 나타납니다. +3. 원하는 머리글/바닥글 위치에 텍스트를 입력하세요. +4. 동적 페이지 번호에는 `{page}`와 `{total}` 자리 표시자를 사용하세요. +5. 글꼴 크기와 글꼴 색상을 조정하고, 필요하면 특정 페이지 범위로 제한하세요. +6. **머리글 및 바닥글 추가**를 클릭해 처리하고 다운로드하세요. + +## 옵션 + +- **페이지 범위**: 머리글과 바닥글을 넣을 페이지를 제한할 수 있습니다. 비워 두면 모든 페이지에 적용됩니다. 형식: "1-3, 5"(쉼표로 구분한 범위). +- **글꼴 크기**: 6~24포인트. 기본값은 10입니다. +- **글꼴 색상**: 색상 선택기로 원하는 색을 고르세요. +- **머리글 왼쪽 / 가운데 / 오른쪽**: 각 페이지 상단의 텍스트 필드. +- **바닥글 왼쪽 / 가운데 / 오른쪽**: 각 페이지 하단의 텍스트 필드. + +## 기능 + +- 페이지당 독립적인 여섯 개의 텍스트 위치 +- 현재 페이지 번호를 넣는 동적 `{page}` 변수 +- 전체 페이지 수를 넣는 동적 `{total}` 변수 +- 특정 페이지를 대상으로 하는 페이지 범위 필터링 +- 글꼴 크기와 색상 사용자 지정 +- 깔끔하고 전문적인 결과를 위한 Helvetica 글꼴 + +## 활용 사례 + +- 보고서 바닥글 가운데에 "{total}페이지 중 {page}페이지" 추가하기 +- 머리글 왼쪽에 회사 이름, 머리글 오른쪽에 문서 날짜 넣기 +- 법률 문서 바닥글에 기밀 유지 고지 추가하기 +- 특정 페이지 범위에 문서 개정 번호 찍기 + +## 팁 + +- `{page}`와 `{total}`을 한 필드에 함께 써서 "{total}페이지 중 {page}페이지"나 "{page}/{total}" 같은 형식을 만들 수 있습니다. +- 필요한 위치만 채우고 나머지는 비워 두어도 됩니다. 빈 필드는 건너뜁니다. +- 이미지나 로고가 들어가는 복잡한 머리글이 필요하면 페이지 상단에 배치한 [워터마크 추가](./add-watermark) 도구를 고려하세요. + +## 관련 도구 + +- [페이지 번호](./page-numbers) +- [워터마크 추가](./add-watermark) +- [베이츠 번호 매기기](./bates-numbering) diff --git a/docs/ko/tools/heic-to-pdf.md b/docs/ko/tools/heic-to-pdf.md new file mode 100644 index 00000000..f361e8f5 --- /dev/null +++ b/docs/ko/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC를 PDF로 +description: iPhone과 iPad의 HEIC 및 HEIF 이미지를 브라우저에서 바로 PDF로 변환합니다. +--- + +# HEIC를 PDF로 + +HEIC/HEIF 이미지를 PDF로 변환합니다. HEIC는 iOS 11 이후 iPhone과 iPad의 기본 사진 형식입니다. 이 도구를 사용하면 데스크톱 소프트웨어를 설치하거나 서버에 파일을 업로드하지 않고도 사진을 PDF로 만들 수 있습니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 HEIC/HEIF 파일을 끌어다 놓으세요. +2. 파일 목록을 확인하고 필요 없는 파일을 제거하세요. +3. **PDF로 변환**을 클릭하세요. 결과는 `from_heic.pdf`로 다운로드됩니다. + +각 HEIC 파일은 heic2any 라이브러리로 디코딩되어 품질 92%의 PNG로 변환됩니다. 이후 PNG는 pdf-lib를 통해 PDF에 삽입되며, 각 이미지는 원본 해상도 그대로 별도 페이지에 들어갑니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. HEIC 이미지는 삽입 전에 높은 품질(0.92)의 PNG로 변환됩니다. + +## 활용 사례 + +- 보험 청구서나 보고서에 첨부할 iPhone 사진으로 PDF 만들기 +- 부동산 매물용 HEIC 사진을 인쇄 가능한 문서 하나로 변환하기 +- iPad 스크린샷(HEIF 형식)을 공유 가능한 PDF로 만들기 +- 여행 일기용 휴가 사진 일괄 변환하기 + +## 팁 + +- HEIC 디코딩은 WebAssembly를 사용하여 전적으로 브라우저에서 이루어집니다. 디코더를 불러오는 동안 첫 변환은 시간이 조금 걸릴 수 있습니다. +- HEIC를 다른 이미지 형식(JPG, PNG 등)과 함께 사용해야 한다면 HEIC를 포함한 모든 형식을 처리하는 [이미지를 PDF로](./image-to-pdf) 도구를 사용하세요. +- iPhone의 HEIC 파일에는 GPS 좌표를 포함한 EXIF 데이터가 들어 있는 경우가 많습니다. PDF 출력에는 이 메타데이터가 전달되지 않습니다. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [JPG를 PDF로](./jpg-to-pdf) +- [PNG를 PDF로](./png-to-pdf) diff --git a/docs/ko/tools/image-to-pdf.md b/docs/ko/tools/image-to-pdf.md new file mode 100644 index 00000000..8c267ceb --- /dev/null +++ b/docs/ko/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: 이미지를 PDF로 +description: JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD 등 10개 이상의 이미지 형식을 하나의 PDF 파일로 변환합니다. +--- + +# 이미지를 PDF로 + +범용 이미지 PDF 변환기입니다. 거의 모든 형식의 이미지를 업로드해 하나의 PDF 문서로 합칠 수 있습니다. 각 이미지는 원본 크기에 맞춘 별도 페이지가 됩니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +BentoPDF의 이미지 변환기 중 가장 폭넓은 형식을 지원합니다. 특정 형식만 필요하다면 해당 전용 도구를 사용하세요. + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 이미지 파일을 끌어다 놓으세요. 여러 파일을 한 번에 선택할 수 있습니다. +2. 파일 목록을 확인하세요. 휴지통 아이콘으로 불필요한 파일을 제거하거나 **파일 더 추가**를 클릭해 이미지를 더 추가할 수 있습니다. +3. 드롭다운에서 **PDF 품질** 수준을 선택하세요. +4. **PDF로 변환**을 클릭하세요. 도구가 PyMuPDF 엔진으로 이미지를 처리하고 결과를 `images_to_pdf.pdf`로 다운로드합니다. + +## 옵션 + +**PDF 품질**은 이미지를 PDF에 삽입할 때 적용하는 압축을 조절합니다. + +- **고품질**: 압축을 최소화하며 파일 크기가 커집니다. 인쇄나 보관용에 적합합니다. +- **중간 품질**(기본값): 균형 잡힌 압축입니다. 대부분의 용도에 알맞습니다. +- **저품질**: 강한 압축으로 파일 크기가 가장 작습니다. 이메일이나 빠른 공유에 적합합니다. + +HEIC와 WebP 파일은 삽입 전에 자동으로 PNG로 변환됩니다. 이 과정은 투명하게 이루어지며 추가 작업이 필요하지 않습니다. + +## 활용 사례 + +- 휴대폰 카메라로 찍은 스캔 영수증이나 문서를 하나의 PDF로 합치기 +- 여러 형식의 이미지로 포토 포트폴리오나 룩북 만들기 +- 데스크톱 소프트웨어 설치 없이 iPhone 사진(HEIC)을 공유 가능한 PDF로 변환하기 +- PSD 내보내기 파일과 스크린샷으로 클라이언트 전달용 디자인 시안 모음 만들기 +- 오래된 이미지 형식(PNM, JXR, JP2) 폴더를 PDF 하나로 보관하기 + +## 팁 + +- PDF 속 이미지 순서는 파일 목록의 순서와 같습니다. 원하는 순서대로 업로드하세요. +- 파일 크기를 가장 작게 하려면 저품질을 선택하세요. 텍스트 위주의 스캔본은 시각적 차이가 거의 없는 경우가 많습니다. +- 이미지 형식이 하나뿐이라면 전용 변환기(JPG를 PDF로, PNG를 PDF로 등)가 더 간단한 인터페이스로 같은 결과를 제공합니다. + +## 관련 도구 + +- [JPG를 PDF로](./jpg-to-pdf) +- [PNG를 PDF로](./png-to-pdf) +- [HEIC를 PDF로](./heic-to-pdf) +- [WebP를 PDF로](./webp-to-pdf) diff --git a/docs/ko/tools/index.md b/docs/ko/tools/index.md new file mode 100644 index 00000000..6f224f3d --- /dev/null +++ b/docs/ko/tools/index.md @@ -0,0 +1,183 @@ +# 도구 안내 + +BentoPDF는 PDF 작업을 위한 **130개 이상의 도구**를 제공합니다. 모든 도구는 전적으로 브라우저에서 실행되므로 파일이 기기 밖으로 나가지 않습니다. + +--- + +## 편집 및 주석 + +다양한 편집 도구로 PDF 문서를 수정하고, 표시하고, 보강하세요. + +
+ +- [**PDF 편집기**](./edit-pdf): 주석, 하이라이트, 교정(가리기), 댓글, 도형/이미지 추가, 검색, PDF 보기. +- [**북마크 편집**](./bookmark): PDF 북마크를 추가, 편집, 가져오기, 삭제, 추출합니다. +- [**목차 생성**](./table-of-contents): PDF 북마크로 목차 페이지를 생성합니다. +- [**페이지 번호**](./page-numbers): 문서에 페이지 번호를 삽입합니다. +- [**페이지 레이블 추가**](./add-page-labels): 로마 숫자, 접두사, 사용자 지정 시작 번호로 PDF 페이지 레이블을 적용합니다. +- [**베이츠 번호 매기기**](./bates-numbering): 하나 이상의 PDF 파일에 연속된 베이츠 번호를 추가합니다. +- [**워터마크 추가**](./add-watermark): PDF 페이지 위에 텍스트나 이미지를 찍습니다. +- [**머리글 및 바닥글**](./header-footer): 페이지 위쪽과 아래쪽에 텍스트를 추가합니다. +- [**색상 반전**](./invert-colors): PDF의 다크 모드 버전을 만듭니다. +- [**스캔 효과**](./scanner-effect): PDF를 스캔한 문서처럼 보이게 합니다. +- [**색상 조정**](./adjust-colors): 밝기, 대비, 채도 등을 세밀하게 조정합니다. +- [**배경색 변경**](./background-color): PDF의 배경색을 바꿉니다. +- [**텍스트 색상 변경**](./text-color): PDF 텍스트의 색상을 바꿉니다. +- [**PDF 서명**](./sign-pdf): 서명을 그리거나, 입력하거나, 업로드합니다. +- [**도장 추가**](./add-stamps): 주석 도구 모음으로 PDF에 이미지 도장을 추가합니다. +- [**주석 제거**](./remove-annotations): 댓글, 하이라이트, 링크를 제거합니다. +- [**PDF 자르기**](./crop-pdf): PDF 모든 페이지의 여백을 다듬습니다. +- [**PDF 양식 작성**](./form-filler): 브라우저에서 바로 양식을 작성합니다. XFA 양식도 지원합니다. +- [**PDF 양식 만들기**](./form-creator): 드래그 앤 드롭 텍스트 필드로 작성 가능한 PDF 양식을 만듭니다. +- [**빈 페이지 제거**](./remove-blank-pages): 빈 페이지를 자동으로 감지해 삭제합니다. + +
+ +--- + +## PDF로 변환 + +이미지, 문서, 전자책 및 기타 파일 형식을 PDF로 바꿉니다. + +
+ +- [**이미지를 PDF로**](./image-to-pdf): JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP 등을 PDF로 변환합니다. +- [**JPG를 PDF로**](./jpg-to-pdf): 하나 이상의 JPG 이미지로 PDF를 만듭니다. +- [**PNG를 PDF로**](./png-to-pdf): 하나 이상의 PNG 이미지로 PDF를 만듭니다. +- [**WebP를 PDF로**](./webp-to-pdf): 하나 이상의 WebP 이미지로 PDF를 만듭니다. +- [**SVG를 PDF로**](./svg-to-pdf): 하나 이상의 SVG 이미지로 PDF를 만듭니다. +- [**BMP를 PDF로**](./bmp-to-pdf): 하나 이상의 BMP 이미지로 PDF를 만듭니다. +- [**HEIC를 PDF로**](./heic-to-pdf): 하나 이상의 HEIC 이미지로 PDF를 만듭니다. +- [**TIFF를 PDF로**](./tiff-to-pdf): 하나 이상의 TIFF 이미지로 PDF를 만듭니다. +- [**텍스트를 PDF로**](./txt-to-pdf): 일반 텍스트 파일을 PDF로 변환합니다. +- [**Markdown을 PDF로**](./markdown-to-pdf): 실시간 미리보기와 구문 강조로 Markdown을 PDF로 변환합니다. +- [**JSON을 PDF로**](./json-to-pdf): JSON 파일을 PDF 형식으로 변환합니다. +- [**ODT를 PDF로**](./odt-to-pdf): ODT(OpenDocument Text) 파일을 PDF로 변환합니다. +- [**CSV를 PDF로**](./csv-to-pdf): CSV 스프레드시트를 PDF로 변환합니다. +- [**RTF를 PDF로**](./rtf-to-pdf): RTF(Rich Text Format) 문서를 PDF로 변환합니다. +- [**Word를 PDF로**](./word-to-pdf): Word 문서(DOCX, DOC, ODT)를 PDF로 변환합니다. +- [**Excel을 PDF로**](./excel-to-pdf): Excel 스프레드시트(XLSX, XLS, ODS)를 PDF로 변환합니다. +- [**PowerPoint를 PDF로**](./powerpoint-to-pdf): PowerPoint 프레젠테이션(PPTX, PPT, ODP)을 PDF로 변환합니다. +- [**XPS를 PDF로**](./xps-to-pdf): XPS/OXPS 문서를 PDF로 변환합니다. +- [**MOBI를 PDF로**](./mobi-to-pdf): MOBI 전자책을 PDF로 변환합니다. +- [**EPUB를 PDF로**](./epub-to-pdf): EPUB 전자책을 PDF로 변환합니다. +- [**FB2를 PDF로**](./fb2-to-pdf): FictionBook(FB2) 전자책을 PDF로 변환합니다. +- [**CBZ를 PDF로**](./cbz-to-pdf): 만화책 아카이브(CBZ/CBR)를 PDF로 변환합니다. +- [**WPD를 PDF로**](./wpd-to-pdf): WordPerfect 문서(WPD)를 PDF로 변환합니다. +- [**WPS를 PDF로**](./wps-to-pdf): WPS Office 문서를 PDF로 변환합니다. +- [**XML을 PDF로**](./xml-to-pdf): XML 문서를 PDF로 변환합니다. +- [**ODG를 PDF로**](./odg-to-pdf): OpenDocument Graphics(ODG)를 PDF로 변환합니다. +- [**ODS를 PDF로**](./ods-to-pdf): OpenDocument Spreadsheet(ODS)를 PDF로 변환합니다. +- [**ODP를 PDF로**](./odp-to-pdf): OpenDocument Presentation(ODP)을 PDF로 변환합니다. +- [**PUB를 PDF로**](./pub-to-pdf): Microsoft Publisher(PUB)를 PDF로 변환합니다. +- [**VSD를 PDF로**](./vsd-to-pdf): Microsoft Visio(VSD, VSDX)를 PDF로 변환합니다. +- [**PSD를 PDF로**](./psd-to-pdf): Adobe Photoshop(PSD) 파일을 PDF로 변환합니다. +- [**이메일을 PDF로**](./email-to-pdf): 이메일 파일(EML, MSG)을 PDF 형식으로 변환합니다. + +
+ +--- + +## PDF에서 변환 + +PDF의 내용을 이미지, 문서, 데이터 형식으로 추출합니다. + +
+ +- [**PDF를 JPG로**](./pdf-to-jpg): PDF의 각 페이지를 JPG 이미지로 변환합니다. +- [**PDF를 PNG로**](./pdf-to-png): PDF의 각 페이지를 PNG 이미지로 변환합니다. +- [**PDF를 WebP로**](./pdf-to-webp): PDF의 각 페이지를 WebP 이미지로 변환합니다. +- [**PDF를 BMP로**](./pdf-to-bmp): PDF의 각 페이지를 BMP 이미지로 변환합니다. +- [**PDF를 TIFF로**](./pdf-to-tiff): PDF의 각 페이지를 TIFF 이미지로 변환합니다. +- [**PDF를 CBZ로**](./pdf-to-cbz): 만화 리더와 Calibre용으로 PDF를 CBZ(만화책 아카이브)로 변환합니다. +- [**PDF를 SVG로**](./pdf-to-svg): PDF의 각 페이지를 확장 가능한 벡터 그래픽으로 변환합니다. +- [**PDF를 CSV로**](./pdf-to-csv): PDF에서 표를 추출해 CSV 형식으로 변환합니다. +- [**PDF를 Excel로**](./pdf-to-excel): PDF에서 표를 추출해 Excel(XLSX)로 변환합니다. +- [**PDF 흑백 변환**](./pdf-to-greyscale): 모든 색상을 흑백으로 변환합니다. +- [**PDF를 JSON으로**](./pdf-to-json): PDF 파일을 JSON 형식으로 변환합니다. +- [**PDF를 Word로**](./pdf-to-word): PDF 파일을 편집 가능한 Word 문서로 변환합니다. +- [**이미지 추출**](./extract-images): PDF 파일에 포함된 모든 이미지를 추출합니다. +- [**PDF를 Markdown으로**](./pdf-to-markdown): PDF 텍스트와 표를 Markdown 형식으로 변환합니다. +- [**AI용 PDF 준비**](./prepare-pdf-for-ai): RAG/LLM 파이프라인용으로 PDF 내용을 LlamaIndex JSON으로 추출합니다. +- [**PDF를 텍스트로**](./pdf-to-text): PDF 파일에서 텍스트를 추출해 일반 텍스트로 저장합니다. +- [**PDF 표 추출**](./extract-tables): PDF의 표를 CSV, JSON, Markdown으로 추출합니다. + +
+ +--- + +## 정리 및 관리 + +PDF 페이지와 파일을 재배치, 병합, 분할, 관리합니다. + +
+ +- [**PDF 워크플로우 빌더**](./pdf-workflow): 시각적 노드 편집기로 맞춤형 PDF 처리 파이프라인을 만듭니다. +- [**PDF 멀티 도구**](./pdf-multi-tool): 페이지 관리 기능을 갖춘 다기능 PDF 편집기입니다. +- [**OCR PDF**](./ocr-pdf): PDF를 검색하고 복사할 수 있게 만듭니다. +- [**PDF 병합**](./merge-pdf): 여러 PDF를 하나의 파일로 합칩니다. +- [**페이지 교차 병합**](./alternate-merge): 각 PDF의 페이지를 번갈아 가며 PDF를 병합합니다. +- [**양면 스캔 정렬**](./duplex-collate): 앞면/뒷면 스캔 블록을 올바른 페이지 순서로 재정렬합니다. +- [**복제 및 정리**](./organize-pdf): 페이지를 복제, 재정렬, 삭제합니다. +- [**첨부파일 추가**](./add-attachments): 하나 이상의 파일을 PDF에 포함합니다. +- [**첨부파일 추출**](./extract-attachments): PDF에 포함된 모든 파일을 ZIP으로 추출합니다. +- [**첨부파일 편집**](./edit-attachments): PDF의 첨부파일을 확인하거나 제거합니다. +- [**PDF OCG**](./pdf-layers): PDF의 OCG 레이어를 보고, 전환하고, 추가하고, 삭제합니다. +- [**PDF 분할**](./split-pdf): 페이지 범위를 새 PDF로 추출합니다. +- [**페이지 분할**](./divide-pages): 페이지를 가로 또는 세로로 나눕니다. +- [**페이지 추출**](./extract-pages): 선택한 페이지를 새 파일로 저장합니다. +- [**페이지 삭제**](./delete-pages): 문서에서 특정 페이지를 제거합니다. +- [**빈 페이지 추가**](./add-blank-page): PDF의 원하는 위치에 빈 페이지를 삽입합니다. +- [**페이지 역순 정렬**](./reverse-pages): 문서의 모든 페이지 순서를 뒤집습니다. +- [**PDF 회전**](./rotate-pdf): 페이지를 90도 단위로 돌립니다. +- [**사용자 지정 각도 회전**](./rotate-custom): 원하는 각도로 페이지를 회전합니다. +- [**N-Up PDF**](./n-up-pdf): 여러 페이지를 한 장에 배치합니다. +- [**PDF 소책자**](./pdf-booklet): 양면 소책자 인쇄에 맞게 페이지를 재배열합니다. +- [**한 페이지로 합치기**](./combine-single-page): 모든 페이지를 이어진 하나의 스크롤로 연결합니다. +- [**메타데이터 보기**](./view-metadata): PDF의 숨겨진 속성을 확인합니다. +- [**메타데이터 편집**](./edit-metadata): 작성자, 제목 및 기타 속성을 변경합니다. +- [**PDF를 ZIP으로**](./pdf-to-zip): 여러 PDF 파일을 ZIP 아카이브로 묶습니다. +- [**PDF 비교**](./compare-pdfs): 두 PDF를 나란히 비교합니다. +- [**PDF 포스터화**](./posterize-pdf): 큰 페이지를 여러 개의 작은 페이지로 나눕니다. + +
+ +--- + +## 최적화 및 복구 + +더 나은 성능과 호환성을 위해 PDF를 압축, 수정, 최적화합니다. + +
+ +- [**PDF 압축**](./compress-pdf): PDF의 파일 크기를 줄입니다. +- [**PDF를 PDF/A로**](./pdf-to-pdfa): 장기 보관을 위해 PDF를 PDF/A로 변환합니다. +- [**페이지 크기 통일**](./fix-page-size): 모든 페이지를 동일한 크기로 맞춥니다. +- [**PDF 선형화**](./linearize-pdf): 빠른 웹 보기를 위해 PDF를 최적화합니다. +- [**페이지 크기 정보**](./page-dimensions): 페이지 크기, 방향, 단위를 분석합니다. +- [**제한 해제**](./remove-restrictions): 비밀번호 보호와 보안 제한을 제거합니다. +- [**PDF 복구**](./repair-pdf): 손상된 PDF 파일에서 데이터를 복구합니다. +- [**PDF 래스터화**](./rasterize-pdf): PDF를 이미지 기반 PDF로 변환합니다. 레이어를 평탄화하고 선택 가능한 텍스트를 제거합니다. +- [**PDF 기울기 보정**](./deskew-pdf): OpenCV로 기울어진 스캔 페이지를 자동으로 바로잡습니다. +- [**폰트 윤곽선 변환**](./font-to-outline): 일관된 렌더링을 위해 모든 폰트를 벡터 윤곽선으로 변환합니다. + +
+ +--- + +## PDF 보안 + +PDF 문서를 보호하고, 암호화하고, 접근을 제어합니다. + +
+ +- [**PDF 암호화**](./protect-pdf): 비밀번호를 추가해 PDF를 잠급니다. +- [**PDF 정리**](./sanitize-pdf): 메타데이터, 주석, 스크립트 등을 제거합니다. +- [**PDF 복호화**](./unlock-pdf): 비밀번호 보호를 제거하여 PDF 잠금을 해제합니다. +- [**PDF 평탄화**](./flatten-pdf): 양식 필드와 주석을 편집할 수 없게 만듭니다. +- [**메타데이터 제거**](./remove-metadata): PDF에서 숨겨진 데이터를 제거합니다. +- [**권한 변경**](./change-permissions): PDF의 사용자 권한을 설정하거나 변경합니다. +- [**PDF 디지털 서명**](./digital-sign-pdf): X.509 인증서로 암호화 디지털 서명을 추가합니다. +- [**PDF 서명 검증**](./validate-signature-pdf): 디지털 서명을 확인하고 인증서 세부 정보를 봅니다. + +
diff --git a/docs/ko/tools/invert-colors.md b/docs/ko/tools/invert-colors.md new file mode 100644 index 00000000..c86959b5 --- /dev/null +++ b/docs/ko/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: 색상 반전 +description: PDF의 모든 색상을 반전하여 어떤 문서든 다크 모드 버전으로 만듭니다. +--- + +# 색상 반전 + +PDF의 모든 색상을 반대 색으로 뒤집습니다. 흰색 배경은 검은색이 되고, 검은색 텍스트는 흰색이 되며, 나머지 색상은 보색으로 바뀝니다. 어떤 PDF든 "다크 모드" 버전으로 만드는 가장 빠른 방법입니다. + +## 사용 방법 + +1. PDF 파일을 업로드하세요. +2. **색상 반전**을 클릭해 처리하세요. +3. 반전된 PDF가 자동으로 다운로드됩니다. + +추가 설정은 없습니다. 이 도구는 각 페이지를 이미지로 렌더링하고 모든 픽셀 색상을 반전한 뒤 결과를 새 PDF로 다시 조립합니다. + +## 기능 + +- 모든 페이지를 한 번에 색상 반전 +- 문서의 모든 페이지 처리 +- 원래 페이지 크기와 레이아웃 유지 +- 텍스트, 이미지, 혼합 등 콘텐츠 유형에 관계없이 모든 PDF에서 작동 + +## 활용 사례 + +- 밤에 편하게 읽을 수 있도록 교재나 매뉴얼의 다크 모드 버전 만들기 +- 접근성을 위해 고대비 문서 버전 준비하기 +- 노출이 잘못 촬영된 스캔 문서 반전하기 +- 시각 분석용으로 이미지가 많은 PDF의 네거티브 버전 만들기 + +## 팁 + +- 이 도구는 효과를 적용하기 위해 페이지를 래스터화하므로 결과물은 이미지 기반입니다. 텍스트를 더 이상 선택하거나 검색할 수 없습니다. 반전 후에도 검색 가능한 텍스트가 필요하면 결과물을 OCR 도구로 처리하세요. +- 밝기, 대비, 채도 등 더 세밀한 색상 조정이 필요하면 [색상 조정](./adjust-colors) 도구를 사용하세요. +- 페이지가 많은 큰 PDF는 각 페이지를 개별적으로 렌더링하고 반전하므로 처리 시간이 더 걸릴 수 있습니다. + +## 관련 도구 + +- [색상 조정](./adjust-colors) +- [배경색 변경](./background-color) +- [스캔 효과](./scanner-effect) diff --git a/docs/ko/tools/jpg-to-pdf.md b/docs/ko/tools/jpg-to-pdf.md new file mode 100644 index 00000000..b214d702 --- /dev/null +++ b/docs/ko/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG를 PDF로 +description: 하나 이상의 JPG, JPEG, JPEG 2000 이미지를 브라우저에서 바로 PDF 파일 하나로 변환합니다. +--- + +# JPG를 PDF로 + +JPG 이미지를 깔끔한 PDF로 만드세요. 파일 하나를 올리거나 여러 JPG를 한꺼번에 묶을 수 있으며, 각 이미지는 출력 문서에서 전체 크기 페이지가 됩니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 JPG 파일을 끌어다 놓으세요. 여러 파일을 선택할 수 있습니다. +2. 업로드한 파일을 확인하세요. 휴지통 아이콘으로 개별 파일을 제거하거나 **파일 더 추가**를 클릭해 목록에 추가하세요. +3. **PDF 품질** 수준을 선택하세요. +4. **PDF로 변환**을 클릭하세요. 도구가 품질 설정에 따라 이미지를 압축하고 PyMuPDF 엔진으로 변환한 뒤 `from_jpgs.pdf`를 다운로드합니다. + +## 옵션 + +**PDF 품질**은 이미지를 PDF에 삽입하기 전에 적용하는 압축을 조절합니다. + +- **고품질**: 최대한의 디테일을 보존합니다. 사진이나 인쇄용에 사용하세요. +- **중간 품질**(기본값): 선명도와 파일 크기 사이의 균형이 좋습니다. +- **저품질**: 가장 작은 결과물을 위한 강한 압축입니다. + +## 활용 사례 + +- JPG로 저장된 스캔 문서를 제출용 PDF 하나로 변환하기 +- 고객용 카탈로그로 제품 사진 묶기 +- JPEG 2000 의료 또는 위성 이미지를 휴대 가능한 PDF로 만들기 +- 카메라에서 내보낸 사진으로 인쇄 가능한 포토 앨범 만들기 + +## 팁 + +- 표준 JPEG뿐 아니라 JPEG 2000 파일(`.jp2`, `.jpx`)도 완전히 지원합니다. 의료 영상과 지리 공간 데이터에 유용합니다. +- 휴대폰 카메라로 찍은 JPG라면 중간 품질이 고품질보다 40~60% 작은 파일을 만들면서 화면에서는 눈에 띄는 차이가 없는 경우가 많습니다. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [PNG를 PDF로](./png-to-pdf) +- [WebP를 PDF로](./webp-to-pdf) diff --git a/docs/ko/tools/json-to-pdf.md b/docs/ko/tools/json-to-pdf.md new file mode 100644 index 00000000..75eb8d5b --- /dev/null +++ b/docs/ko/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON을 PDF로 +description: BentoPDF의 JSON 형식에서 PDF 파일을 복원합니다. JSON으로 내보낸 파일을 원래 PDF 문서로 되돌립니다. +--- + +# JSON을 PDF로 + +BentoPDF의 **PDF를 JSON으로** 도구로 이전에 만든 JSON 파일에서 PDF 문서를 복원합니다. PDF의 구조화된 JSON 표현을 받아 원래 문서를 다시 만드는 왕복 변환 도구입니다. + +::: warning +이 도구는 BentoPDF의 PDF를 JSON으로 변환기가 만든 JSON 파일만 허용합니다. API, 데이터베이스, 다른 도구에서 가져온 일반 JSON 파일은 지원되지 않습니다. +::: + +## 지원 형식 + +| 입력 | 설명 | +| :------ | :------------------------------------------------ | +| `.json` | BentoPDF의 PDF를 JSON으로 도구로 내보낸 JSON 파일 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 JSON 파일을 하나 이상 끌어다 놓으세요. +2. 파일 목록에 선택한 각 파일이 크기와 함께 표시됩니다. +3. **PDF로 변환**을 클릭하세요. 도구가 Web Worker와 CPDF 엔진으로 모든 파일을 처리합니다. +4. 결과는 입력한 JSON 파일마다 PDF 하나씩을 담은 `jsons-to-pdf.zip`으로 다운로드됩니다. + +변환은 백그라운드 Web Worker에서 실행되므로 큰 파일에서도 UI가 계속 반응합니다. + +## 옵션 + +이 도구에는 설정할 수 있는 옵션이 없습니다. JSON 구조가 출력 PDF를 완전히 결정합니다. + +## 출력 + +여러 JSON 파일을 변환하면 결과가 ZIP 아카이브로 제공됩니다. 각 PDF는 원본 JSON 파일 이름을 따릅니다(예: `report.json`은 `report.pdf`가 됨). + +## 활용 사례 + +- JSON 기반 백업 또는 보관 파이프라인에서 PDF 복원하기 +- PDF를 JSON으로 변환해 확인한 뒤 다시 PDF로 되돌리기 +- JSON 구조를 프로그램으로 수정한 후 문서 다시 만들기 +- PDF를 JSON으로 내보낸 결과가 문서 내용을 모두 담았는지 다시 변환해 검증하기 + +## 팁 + +- API 응답이나 설정 파일 같은 임의의 JSON 데이터를 서식 있는 PDF로 변환하려면 [텍스트를 PDF로](./txt-to-pdf) 도구가 더 적합합니다. JSON을 텍스트로 붙여넣으면 적절한 서식으로 렌더링됩니다. +- 이 도구가 작동하려면 CPDF WebAssembly 엔진을 사용할 수 있어야 합니다. 직접 호스팅하는 인스턴스는 CPDF WASM 파일을 설정해야 합니다. + +## 관련 도구 + +- [텍스트를 PDF로](./txt-to-pdf) +- [Markdown을 PDF로](./markdown-to-pdf) +- [CSV를 PDF로](./csv-to-pdf) diff --git a/docs/ko/tools/linearize-pdf.md b/docs/ko/tools/linearize-pdf.md new file mode 100644 index 00000000..f6382f03 --- /dev/null +++ b/docs/ko/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: PDF 선형화 +description: 점진적 로딩으로 빠르게 웹에서 볼 수 있도록 PDF 파일을 최적화합니다. "빠른 웹 보기" 최적화라고도 합니다. +--- + +# PDF 선형화 + +선형화는 파일 전체를 다운로드하기 전에 첫 페이지를 표시할 수 있도록 PDF를 재구성합니다. Adobe는 이를 "빠른 웹 보기"라고 부릅니다. 웹사이트에 PDF를 올리거나 문서 포털로 제공한다면 선형화로 훨씬 빠르게 열리는 느낌을 줄 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드하세요. +2. **PDF 선형화**를 클릭하세요. +3. 선형화된 모든 파일이 담긴 ZIP 아카이브로 결과를 다운로드하세요. + +설정할 항목은 없습니다. 이 도구는 QPDF의 `--linearize` 플래그를 사용하며, 시각적 콘텐츠는 바꾸지 않고 PDF의 내부 구조만 재배열합니다. + +## 선형화가 하는 일 + +- 첫 페이지의 데이터가 파일 맨 앞에 오도록 PDF 객체 순서를 재정렬 +- 뷰어가 각 페이지의 위치를 알 수 있도록 선형화 사전과 힌트 테이블 추가 +- 바이트 범위 요청 지원: 브라우저가 파일 전체를 받지 않고 첫 페이지만 가져올 수 있음 +- 효율적인 임의 접근을 위해 상호 참조 테이블 정리 + +## 기능 + +- 한 번의 작업으로 여러 PDF 일괄 처리 +- 출력물이 모든 콘텐츠, 폰트, 이미지, 대화형 요소를 보존 +- 안정적이고 표준을 준수하는 선형화를 위해 QPDF(WebAssembly) 사용 +- 쉬운 다운로드를 위해 결과를 ZIP으로 묶음 + +## 활용 사례 + +- 사용자가 즉시 페이지가 표시되길 기대하는 웹사이트에 PDF 보고서 올리기 +- 브라우저 내 뷰어가 있는 웹 애플리케이션에 PDF 삽입하기 +- 느린 모바일 연결로 접근하는 PDF 카탈로그나 매뉴얼 게시하기 +- 바이트 범위 제공을 지원하는 콘텐츠 전송 네트워크(CDN)용 문서 준비하기 + +## 팁 + +- 다른 모든 편집이 끝난 뒤에 선형화하세요. 이후 수정(병합, 페이지 추가 등)을 하면 선형화가 깨집니다. +- PDF 압축과 함께 사용하면 가장 작고 가장 빠르게 로드되는 PDF를 만들 수 있습니다. +- 선형화로 파일 크기가 약간 늘어납니다(보통 1% 미만). + +## 관련 도구 + +- [PDF 압축](./compress-pdf): 선형화 전에 파일 크기 줄이기 +- [PDF 복구](./repair-pdf): 선형화를 막는 구조적 문제 해결 +- [메타데이터 제거](./remove-metadata): 온라인 게시 전에 메타데이터 제거 diff --git a/docs/ko/tools/markdown-to-pdf.md b/docs/ko/tools/markdown-to-pdf.md new file mode 100644 index 00000000..923b8328 --- /dev/null +++ b/docs/ko/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown을 PDF로 +description: Markdown을 작성하거나 붙여넣고 실시간 미리보기와 구문 강조가 적용된 전문적인 서식의 PDF로 내보냅니다. +--- + +# Markdown을 PDF로 + +실시간 미리보기와 원클릭 PDF 내보내기를 갖춘 다기능 Markdown 편집기입니다. 처음부터 작성하거나 기존 `.md` 파일을 업로드하거나 클립보드의 내용을 붙여넣을 수 있습니다. 편집기는 Markdown을 실시간으로 렌더링하고 브라우저의 내장 인쇄 엔진으로 스타일이 적용된 PDF를 내보냅니다. + +## 지원 형식 + +| 입력 | 설명 | +| :--------- | :--------------------------- | +| `.md` 파일 | 업로드 버튼으로 업로드 | +| 직접 입력 | 편집기에 입력하거나 붙여넣기 | + +## 사용 방법 + +1. Markdown을 PDF로 도구를 여세요. 편집기가 분할 보기로 열리며 왼쪽에는 Markdown 소스, 오른쪽에는 렌더링된 미리보기가 표시됩니다. +2. Markdown을 작성하거나 붙여넣거나 **업로드**를 클릭해 `.md` 파일을 불러오세요. +3. 도구 모음의 테마 슬라이더로 라이트와 다크 테마를 전환하세요. +4. **PDF 내보내기**를 클릭하거나 `Ctrl/Cmd + S`를 눌러 브라우저의 인쇄 대화상자로 PDF를 생성하세요. + +## 기능 + +편집기는 기본 기능 외에도 폭넓은 Markdown 기능을 지원합니다. + +- **표준 Markdown**: 제목, 굵게, 기울임, 링크, 이미지, 목록, 인용문, 가로줄 +- 15개 이상의 언어(JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash 등)에 대한 구문 강조가 적용되는 **코드 블록** +- **Mermaid 다이어그램**: 순서도, 시퀀스 다이어그램, ER 다이어그램 등 Mermaid 차트 유형이 미리보기에 바로 렌더링됩니다 +- 표준 Markdown 표 문법을 사용하는 **표** +- 체크박스가 있는 **작업 목록** +- **각주**, **아래 첨자**, **위 첨자** +- **정의 목록**, **약어** +- **이모지** 지원(`:smile:`이 이모지로 렌더링됨) +- **하이라이트**(`==marked text==`)와 **삽입**(`++inserted text++`) +- **URL 자동 링크**: 일반 URL이 클릭 가능한 링크로 변환됩니다 +- **목차** 생성 +- 제목의 **앵커 링크** + +## 활용 사례 + +- 프로젝트 문서를 작성하고 이해관계자용으로 다듬어진 PDF 내보내기 +- 코드 샘플과 Mermaid 아키텍처 다이어그램이 있는 기술 보고서 만들기 +- GitHub README를 오프라인 사용이나 인쇄용 PDF로 변환하기 +- 작업 목록과 표를 사용해 제안서나 명세서 초안 작성하기 +- Markdown으로 쓴 강의 노트로 스타일이 적용된 유인물 만들기 + +## 팁 + +- PDF 출력은 브라우저의 PDF로 인쇄 기능을 사용합니다. Chrome에서는 저장하기 전에 인쇄 대화상자에서 여백과 배율을 조정할 수 있습니다. +- Mermaid 다이어그램은 미리보기에 렌더링되지만 처음 사용할 때는 초기화에 잠시 시간이 걸릴 수 있습니다. +- 버튼을 누르지 않고 내보내려면 `Ctrl/Cmd + S` 단축키를 사용하세요. + +## 관련 도구 + +- [텍스트를 PDF로](./txt-to-pdf) +- [Word를 PDF로](./word-to-pdf) +- [JSON을 PDF로](./json-to-pdf) diff --git a/docs/ko/tools/merge-pdf.md b/docs/ko/tools/merge-pdf.md new file mode 100644 index 00000000..d4623e04 --- /dev/null +++ b/docs/ko/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF 병합 +description: 드래그 앤 드롭 순서 변경과 페이지 단위 제어로 여러 PDF 파일을 하나의 문서로 합칩니다. +--- + +# PDF 병합 + +여러 PDF 파일을 하나의 문서로 합칩니다. 전체 파일을 원하는 순서로 병합하거나, 페이지 모드로 전환해 업로드한 모든 PDF의 개별 페이지를 세밀하게 제어할 수 있습니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 PDF 파일 두 개 이상을 끌어다 놓아 업로드하세요. +2. 상단의 토글로 **파일 모드**와 **페이지 모드** 중 하나를 선택하세요. +3. 파일 모드에서는 파일을 끌어 순서를 바꾸고, 필요하면 파일별로 페이지 범위(예: `1-3, 5`)를 지정하세요. 범위를 비워 두면 모든 페이지가 포함됩니다. +4. 페이지 모드에서는 개별 페이지 썸네일을 끌어다 놓아 원하는 페이지 순서를 구성하세요. +5. **PDF 병합**을 클릭하면 모든 내용이 하나의 파일로 합쳐지고, 병합된 PDF가 자동으로 다운로드됩니다. + +## 기능 + +- 두 가지 병합 모드: 전체 파일을 빠르게 합치는 파일 모드, 페이지 단위로 제어하는 페이지 모드 +- 두 모드 모두 부드러운 애니메이션과 함께 드래그 앤 드롭으로 순서 변경 +- 페이지 범위 문법(예: `1-3, 5, 8-10`)으로 페이지 모드로 전환하지 않고도 원하는 페이지만 선택 +- 지연 로딩되는 페이지 썸네일로 큰 문서에서도 UI가 원활하게 동작 +- 파일 수나 전체 페이지 수에 제한 없음 +- 재인코딩 없이 원본 PDF 품질 유지 + +## 옵션 + +| 옵션 | 설명 | +| --------------- | ------------------------------------------------------------------------------------ | +| **파일 모드** | 전체 파일을 원하는 순서로 병합하며, 파일별 페이지 범위 필터를 선택적으로 사용 | +| **페이지 모드** | 모든 파일의 모든 페이지를 보여주는 시각적 그리드로, 썸네일을 끌어 원하는 순서를 구성 | +| **페이지 입력** | `1-3, 5` 같은 범위를 받아 특정 페이지만 포함하는 파일별 텍스트 필드 | + +## 활용 사례 + +- 장별로 나뉜 PDF를 책이나 보고서 하나로 합치기 +- 자기소개서와 이력서를 지원서 문서 하나로 병합하기 +- 여러 원본 문서에서 특정 페이지만 뽑아 하나의 파일로 통합하기 +- 스캔한 영수증이나 청구서를 보관용 PDF 하나로 모으기 +- 여러 슬라이드 덱의 슬라이드로 발표 유인물 만들기 + +## 팁 + +- 파일을 차례로 이어 붙이는 대신 서로 다른 파일의 페이지를 교차로 배치해야 한다면 페이지 모드를 사용하세요. +- **파일 더 추가** 버튼으로 처음 업로드한 후에도 현재 배치를 잃지 않고 파일을 더 추가할 수 있습니다. +- 페이지 범위는 1부터 시작하므로 `1`은 해당 파일의 첫 페이지를 뜻합니다. + +## 관련 도구 + +- [PDF 분할](./split-pdf) +- [복제 및 정리](./organize-pdf) +- [페이지 교차 병합](./alternate-merge) +- [페이지 삭제](./delete-pages) diff --git a/docs/ko/tools/mobi-to-pdf.md b/docs/ko/tools/mobi-to-pdf.md new file mode 100644 index 00000000..30296446 --- /dev/null +++ b/docs/ko/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI를 PDF로 +description: MOBI 전자책 파일을 브라우저에서 바로 PDF로 변환합니다. 무료, 개인정보 보호, 파일 업로드 없음. +--- + +# MOBI를 PDF로 + +Amazon Kindle MOBI 전자책을 PDF 문서로 변환합니다. MOBI 파일은 Kindle 기기와 앱에 묶여 있어 다른 곳에서 읽기 어렵습니다. PDF로 변환하면 어떤 기기에서든 열거나 인쇄할 수 있는 휴대용 버전을 얻게 됩니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :--- | :------ | :----------------------------- | +| MOBI | `.mobi` | Kindle 전자책 형식(Mobipocket) | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 MOBI 파일을 하나 이상 끌어다 놓으세요. +2. 파일 목록을 확인하세요. 휴지통 아이콘으로 불필요한 파일을 제거하거나 **파일 더 추가**로 전자책을 더 넣을 수 있습니다. +3. **PDF로 변환**을 클릭하세요. PyMuPDF 엔진이 MOBI 구조를 분석하고 각 페이지를 PDF 콘텐츠로 렌더링합니다. +4. 파일 하나는 PDF로 다운로드됩니다. 여러 파일을 변환하면 `mobi-converted.zip`이라는 ZIP 아카이브를 받게 됩니다. + +## 옵션 + +추가 설정은 필요하지 않습니다. 변환은 원본 MOBI 파일의 텍스트 콘텐츠, 서식, 포함된 이미지를 그대로 보존합니다. + +## 활용 사례 + +- PDF만 지원하는 Kindle 외 전자책 리더에서 Kindle에서 구매한 콘텐츠 읽기 +- 오프라인 학습이나 주석 작성을 위해 전자책의 일부 장 인쇄하기 +- 개인 전자책 라이브러리를 범용 형식으로 보관하기 +- Kindle 앱이 없는 사람과 발췌본 공유하기 + +## 팁 + +- DRM으로 보호된 MOBI 파일은 변환할 수 없습니다. 이 도구는 DRM이 없는 MOBI 파일에서만 작동합니다. +- 이미지가 많이 포함된 큰 전자책은 모든 작업이 브라우저에서 이루어지므로 처리에 몇 초 더 걸릴 수 있습니다. + +## 관련 도구 + +- [EPUB를 PDF로](./epub-to-pdf) +- [FB2를 PDF로](./fb2-to-pdf) +- [CBZ를 PDF로](./cbz-to-pdf) diff --git a/docs/ko/tools/n-up-pdf.md b/docs/ko/tools/n-up-pdf.md new file mode 100644 index 00000000..74c7e90e --- /dev/null +++ b/docs/ko/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: 여러 PDF 페이지를 한 장에 격자 형태로 배치하여 간결하게 인쇄합니다. +--- + +# N-Up PDF + +여러 페이지를 한 장에 격자 형태로 배치합니다. 한 장에 2, 4, 6, 8, 9 또는 16페이지를 넣어 인쇄 매수를 줄입니다. 이 도구가 배율 조정, 위치 지정, 선택적인 페이지 크기 설정을 처리합니다. + +## 사용 방법 + +1. PDF 파일을 업로드하세요. +2. 한 장에 넣을 페이지 수("N" 값)를 선택하세요: 2, 4, 6, 8, 9 또는 16. +3. 출력 페이지 크기(기본값은 A4)와 방향을 선택하세요. +4. 필요하면 간격, 테두리 색상, 배경색을 설정하세요. +5. 처리 버튼을 클릭하세요. 도구가 각 페이지의 배율을 조정해 새 시트에 타일처럼 배치합니다. + +## 기능 + +- 격자 레이아웃: 2-up, 4-up, 6-up, 8-up, 9-up, 16-up +- 출력 페이지 크기와 방향 설정 가능 +- 배치된 페이지 사이의 간격 선택 가능 +- 배경색과 테두리 색상 설정 +- 맞추어 배율을 조정하면서도 원본 페이지의 가로세로 비율 유지 + +## 옵션 + +| 옵션 | 설명 | +| --------------- | ---------------------------------------------------------- | +| **장당 페이지** | 출력 페이지 한 장에 넣을 원본 페이지 수(2, 4, 6, 8, 9, 16) | +| **페이지 크기** | 출력 시트 크기(A4, Letter, Legal 등) | +| **방향** | 출력 시트의 세로 또는 가로 방향 | +| **간격** | 배치된 페이지 사이의 간격(포인트 단위) | +| **배경색** | 출력 시트 배경을 채우는 색상 | +| **테두리 색상** | 배치된 각 페이지를 둘러싸는 테두리의 색상 | + +## 활용 사례 + +- 용지를 아끼기 위해 한 장에 슬라이드 4개씩 넣어 유인물 인쇄하기 +- 한 장에 여러 참고 페이지를 담은 학습 자료 만들기 +- 서류 정리를 위한 간결한 문서 보관본 만들기 +- 긴 문서의 썸네일 개요 시트 생성하기 + +## 팁 + +- 2-up 레이아웃에는 가로 방향이 더 잘 맞는 경우가 많고, 4-up 이상에는 대개 세로 방향이 가장 좋습니다. +- 간격을 늘리면 가독성은 좋아지지만 배치된 각 페이지에 쓸 수 있는 영역이 줄어듭니다. +- 반대 작업(페이지 하나를 여러 장으로 나누기)은 [PDF 포스터화](./posterize-pdf)를 참고하세요. + +## 관련 도구 + +- [PDF 포스터화](./posterize-pdf) +- [PDF 소책자](./pdf-booklet) +- [한 페이지로 합치기](./combine-single-page) diff --git a/docs/ko/tools/ocr-pdf.md b/docs/ko/tools/ocr-pdf.md new file mode 100644 index 00000000..cae567dd --- /dev/null +++ b/docs/ko/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Tesseract OCR로 스캔한 PDF를 검색하고 복사할 수 있게 만듭니다. 다국어 지원과 문자 필터링을 제공합니다. +--- + +# OCR PDF + +스캔한 문서를 검색하고 복사할 수 있는 PDF로 바꾸세요. 이 도구는 Tesseract OCR로 이미지 속 텍스트를 인식하고 원본 페이지 위에 보이지 않는 텍스트 레이어를 덧씌웁니다. 시각적 모습은 그대로 유지하면서 내용을 완전히 검색할 수 있게 됩니다. + +## 사용 방법 + +1. 스캔한 PDF 또는 이미지 기반 PDF 파일을 업로드하세요. +2. 검색 가능한 언어 목록에서 문서에 포함된 언어를 하나 이상 선택하세요. +3. 필요하면 고급 설정(해상도, 이진화, 화이트리스트)을 조정하세요. +4. **OCR 시작**을 클릭하고 실시간 진행률 표시줄로 진행 상황을 확인하세요. +5. 완료되면 추출된 텍스트를 확인한 뒤 검색 가능한 PDF 또는 일반 `.txt` 파일을 다운로드하세요. + +## 기능 + +- 검색 가능한 언어 선택기를 갖춘 다국어 OCR +- 보이지 않는 텍스트 레이어로 원본 문서의 모습 유지 +- 처리 중 실시간 진행률 표시줄과 로그 출력 +- 검색 가능한 PDF 또는 일반 텍스트 파일로 결과 다운로드 +- 추출된 텍스트를 클립보드로 바로 복사 +- 속도와 정확도의 균형을 맞추는 세 가지 해상도 단계 + +## 옵션 + +| 설정 | 값 | 기본값 | 용도 | +| ---------------------------- | -------------------------------------------------------------------- | --------- | -------------------------------------------------------------------- | +| **해상도** | 표준(192 DPI), 높음(288 DPI), 최고(384 DPI) | 높음 | 해상도가 높을수록 작은 글자의 정확도가 향상되지만 시간이 더 걸립니다 | +| **이미지 이진화** | 켜기 / 끄기 | 끄기 | 흑백으로 변환하여 깨끗한 스캔본의 대비를 높입니다 | +| **문자 화이트리스트 프리셋** | 없음, 영숫자, 숫자 + 통화, 문자만, 숫자만, 청구서, 양식, 사용자 지정 | 없음 | 인식할 문자를 제한하여 특정 문서 유형의 정확도를 높입니다 | +| **문자 화이트리스트** | 자유 텍스트 | 비어 있음 | 프리셋이 사용자 지정일 때 직접 입력하는 문자 집합 | + +## 활용 사례 + +- 스캔한 계약서와 청구서를 Ctrl+F로 검색할 수 있게 만들기 +- 사진으로 찍은 문서나 오래된 종이 기록에서 텍스트 추출하기 +- 청구서 프리셋으로 영수증을 처리하여 금액과 날짜를 정확하게 인식하기 +- 규정 준수를 위해 이미지만 있는 스캔본으로 접근 가능한 PDF 만들기 +- 스캔한 책이나 매뉴얼에서 텍스트 콘텐츠를 일괄 추출하기 + +## 팁 + +- 문서에 여러 언어가 섞여 있다면(예: 영어 제목과 일본어 본문) 언어를 여러 개 선택하세요. +- 글자가 흐리거나 대비가 낮은 문서에는 이진화 옵션을 사용하세요. 인식 정확도가 크게 향상될 수 있습니다. +- 청구서와 양식 화이트리스트 프리셋은 관련 없는 문자 모양을 무시하여 구조화된 문서의 오인식을 크게 줄여줍니다. + +## 관련 도구 + +- [PDF 표 추출](./extract-tables) +- [PDF 병합](./merge-pdf) +- [PDF 압축](./compress-pdf) diff --git a/docs/ko/tools/odg-to-pdf.md b/docs/ko/tools/odg-to-pdf.md new file mode 100644 index 00000000..12a9f3a4 --- /dev/null +++ b/docs/ko/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG를 PDF로 +description: LibreOffice Draw(ODG) 파일을 브라우저에서 PDF로 변환합니다. 무료, 업로드 없음, 완전한 개인정보 보호. +--- + +# ODG를 PDF로 + +OpenDocument Graphics 파일을 PDF로 변환합니다. ODG는 LibreOffice Draw의 기본 형식으로 다이어그램, 순서도, 벡터 일러스트에 쓰입니다. PDF로 변환하면 이런 그림을 쉽게 공유하고, 인쇄하고, 다른 문서에 삽입할 수 있습니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :-------------------- | :----- | :-------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw 파일 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 ODG 파일을 끌어다 놓으세요. 여러 파일을 한 번에 추가할 수 있습니다. +2. 파일 목록을 확인하세요. 휴지통 아이콘으로 개별 항목을 제거하거나 **파일 더 추가**를 클릭해 그림을 더 추가하세요. +3. **PDF로 변환**을 클릭하세요. LibreOffice 기반 엔진이 브라우저에 로드되어 각 ODG 파일을 변환하며 벡터 그래픽, 도형, 텍스트를 보존합니다. +4. 파일 하나는 PDF로 바로 다운로드됩니다. 여러 파일은 `odg-to-pdf.zip`이라는 ZIP 아카이브로 제공됩니다. + +## 옵션 + +추가 설정은 필요하지 않습니다. 변환은 ODG 원본의 페이지 크기, 도형, 커넥터, 텍스트 상자를 그대로 보존합니다. + +## 활용 사례 + +- LibreOffice가 설치되어 있지 않은 고객과 LibreOffice Draw 다이어그램 공유하기 +- Draw에서 만든 순서도와 네트워크 다이어그램 인쇄하기 +- ODG 일러스트를 임베디드 PDF로 보고서나 프레젠테이션에 포함하기 +- 수십 년간 읽을 수 있는 형식으로 기술 도면 보관하기 + +## 팁 + +- 벡터 요소는 PDF 출력에서도 벡터로 유지되므로 어떤 인쇄 크기로도 깔끔하게 확대할 수 있습니다. +- LibreOffice 엔진은 처음 사용할 때 초기화에 잠시 시간이 걸립니다. 같은 세션에서 그다음부터는 변환이 더 빠릅니다. + +## 관련 도구 + +- [ODS를 PDF로](./ods-to-pdf) +- [ODP를 PDF로](./odp-to-pdf) +- [VSD를 PDF로](./vsd-to-pdf) diff --git a/docs/ko/tools/odp-to-pdf.md b/docs/ko/tools/odp-to-pdf.md new file mode 100644 index 00000000..dfb00982 --- /dev/null +++ b/docs/ko/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP를 PDF로 +description: LibreOffice Impress(ODP) 프레젠테이션을 브라우저에서 PDF로 변환합니다. 무료, 개인정보 보호, 업로드 없음. +--- + +# ODP를 PDF로 + +OpenDocument Presentation 파일을 PDF로 변환합니다. ODP는 LibreOffice Impress의 기본 형식이며 Google Slides의 표준 내보내기 형식이기도 합니다. 프레젠테이션을 PDF로 만들면 누구나 프레젠테이션 소프트웨어 없이 볼 수 있고 슬라이드도 깔끔하게 인쇄됩니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :------------------------ | :----- | :------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides 내보내기 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 ODP 파일을 끌어다 놓으세요. 여러 프레젠테이션을 한 번에 선택할 수 있습니다. +2. 파일 목록을 확인하세요. 휴지통 아이콘으로 항목을 제거하거나 **파일 더 추가**로 프레젠테이션을 더 넣으세요. +3. **PDF로 변환**을 클릭하세요. LibreOffice 기반 엔진이 각 프레젠테이션을 처리하여 슬라이드마다 한 페이지가 되는 PDF를 만듭니다. +4. 파일 하나는 PDF로 다운로드됩니다. 여러 파일은 `odp-to-pdf.zip`이라는 ZIP 아카이브로 제공됩니다. + +## 옵션 + +설정할 항목은 없습니다. 각 슬라이드는 원래 크기로 렌더링되며 텍스트, 이미지, 도형, 슬라이드 배경이 보존됩니다. + +## 활용 사례 + +- 청중에게 유인물 PDF로 프레젠테이션 배포하기 +- ODP보다 PDF를 선호하는 사람들과 Google Slides 내보내기 공유하기 +- 학회 발표와 강의를 읽기 전용 형식으로 보관하기 +- 대면 워크숍용 슬라이드 덱 인쇄하기 + +## 팁 + +- 슬라이드 전환과 애니메이션은 시각 효과 전용 기능이라 PDF로 옮겨지지 않지만 모든 정적 콘텐츠는 올바르게 렌더링됩니다. +- 발표자 노트는 PDF 출력에 포함되지 않습니다. 노트가 필요하면 프레젠테이션 소프트웨어에서 따로 내보내세요. +- 다른 LibreOffice 기반 도구와 마찬가지로 엔진은 처음 사용할 때 로드되며 세션 동안 캐시된 상태로 유지됩니다. + +## 관련 도구 + +- [ODG를 PDF로](./odg-to-pdf) +- [ODS를 PDF로](./ods-to-pdf) +- [PUB를 PDF로](./pub-to-pdf) diff --git a/docs/ko/tools/ods-to-pdf.md b/docs/ko/tools/ods-to-pdf.md new file mode 100644 index 00000000..744d2b78 --- /dev/null +++ b/docs/ko/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS를 PDF로 +description: LibreOffice Calc(ODS) 스프레드시트를 브라우저에서 PDF로 변환합니다. 무료, 개인정보 보호, 회원가입 불필요. +--- + +# ODS를 PDF로 + +OpenDocument Spreadsheet 파일을 PDF로 변환합니다. ODS는 LibreOffice Calc의 기본 형식이며 Google Sheets에서도 흔히 내보내는 형식입니다. 이 도구는 스프레드시트의 데이터, 서식, 차트를 페이지로 나뉜 PDF로 렌더링하여 인쇄하거나 공유할 수 있게 해줍니다. + +## 지원 형식 + +| 형식 | 확장자 | 비고 | +| :----------------------- | :----- | :---------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / Google Sheets 내보내기 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 ODS 파일을 끌어다 놓습니다. 여러 파일을 지원합니다. +2. 파일 목록을 확인합니다. 휴지통 아이콘으로 파일을 제거하거나 **파일 더 추가**를 클릭해 일괄 작업을 확장할 수 있습니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 기반 엔진이 브라우저에 로드되어 각 스프레드시트를 PDF 페이지로 렌더링합니다. +4. 스프레드시트 하나는 PDF로 다운로드됩니다. 여러 파일은 `ods-to-pdf.zip`으로 묶입니다. + +## 옵션 + +별도 설정은 필요하지 않습니다. 변환기는 스프레드시트의 기존 인쇄 레이아웃, 셀 서식, 열 너비를 PDF 출력에 그대로 적용합니다. + +## 활용 사례 + +- PDF만 받는 상대에게 LibreOffice Calc 예산표나 보고서 공유하기 +- ODS로 내려받은 Google Sheets 내보내기 파일 인쇄하기 +- 재무 기록을 편집할 수 없는 형식으로 보관하기 +- ODS 기반 양식이나 근무 시간표를 고정 레이아웃 문서로 제출하기 + +## 팁 + +- 스프레드시트에 시트가 여러 개 있으면 모든 시트가 PDF 출력에 포함됩니다. +- 매우 넓은 스프레드시트는 PDF에서 가로로 여러 페이지에 걸칠 수 있습니다. 레이아웃이 중요하다면 변환 전에 원본 파일의 열 너비를 조정하세요. +- LibreOffice 엔진은 처음 사용할 때 초기화됩니다. 같은 세션에서 이후 변환은 더 빠릅니다. + +## 관련 도구 + +- [ODG를 PDF로](./odg-to-pdf) +- [ODP를 PDF로](./odp-to-pdf) +- [XML을 PDF로](./xml-to-pdf) diff --git a/docs/ko/tools/odt-to-pdf.md b/docs/ko/tools/odt-to-pdf.md new file mode 100644 index 00000000..476adccd --- /dev/null +++ b/docs/ko/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT를 PDF로 +description: LibreOffice 기반 엔진으로 OpenDocument Text(ODT) 파일을 브라우저에서 PDF로 변환합니다. +--- + +# ODT를 PDF로 + +OpenDocument Text 파일을 PDF로 변환합니다. ODT는 LibreOffice Writer, Apache OpenOffice 및 기타 오픈소스 워드 프로세서의 기본 형식입니다. 이 도구는 브라우저 기반 LibreOffice 엔진을 사용해 서식, 표, 이미지, 스타일을 그대로 유지하는 정확한 변환을 제공합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :---------------- | :----- | +| OpenDocument Text | `.odt` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 ODT 파일을 하나 이상 끌어다 놓습니다. +2. 파일 목록을 확인합니다. 파일을 더 추가하거나 필요 없는 파일을 제거할 수 있습니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 엔진이 초기화되고(진행 표시기에 로드 상태가 표시됩니다) 각 파일이 변환됩니다. +4. 파일 하나는 PDF로 바로 다운로드됩니다. 여러 파일은 `odt-converted.zip`으로 묶입니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. 변환 시 원본 문서의 서식을 최대한 그대로 유지합니다. + +## 출력 + +| 입력 수 | 출력 | +| :------------ | :-------------------------------------------------------- | +| 파일 1개 | PDF 한 개 다운로드 (예: `document.pdf`) | +| 파일 2개 이상 | 파일당 PDF 하나가 담긴 ZIP 압축 파일(`odt-converted.zip`) | + +## 활용 사례 + +- LibreOffice Writer 문서를 Microsoft Office 사용자와 공유하기 위해 PDF로 변환하기 +- OpenDocument 형식으로 작성한 학술 논문에서 인쇄용 PDF 만들기 +- ODT 템플릿 폴더를 배포용 PDF로 일괄 변환하기 +- 자동 문서 생성 시스템이 만든 ODT 파일에서 PDF 생성하기 + +## 팁 + +- LibreOffice 엔진은 처음 사용할 때 로드되고 이후 변환을 위해 캐시됩니다. 처음 로드에는 몇 초가 걸리지만 그 후에는 변환이 빠릅니다. +- 포함된 OLE 개체나 특이한 글꼴이 있는 복잡한 문서는 데스크톱 LibreOffice와 약간 다르게 렌더링될 수 있습니다. 일괄 변환 전에 샘플로 테스트하세요. +- Word 문서(`.doc`, `.docx`)에는 [Word를 PDF로](./word-to-pdf) 도구를 사용하세요. 이 도구도 LibreOffice 엔진을 쓰지만 Microsoft 형식을 직접 받습니다. + +## 관련 도구 + +- [Word를 PDF로](./word-to-pdf) +- [RTF를 PDF로](./rtf-to-pdf) +- [텍스트를 PDF로](./txt-to-pdf) diff --git a/docs/ko/tools/organize-pdf.md b/docs/ko/tools/organize-pdf.md new file mode 100644 index 00000000..38636712 --- /dev/null +++ b/docs/ko/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: 복제 및 정리 +description: 드래그 앤 드롭 미리보기와 사용자 지정 페이지 순서 입력으로 PDF 페이지를 재정렬, 복제, 삭제합니다. +--- + +# 복제 및 정리 + +시각적인 드래그 앤 드롭 인터페이스로 PDF의 페이지를 재배열, 복제, 제거합니다. 각 페이지가 미리보기로 표시되며, 새 파일로 저장하기 전에 이동, 복제, 삭제할 수 있습니다. + +## 사용 방법 + +1. PDF 파일 하나를 업로드합니다. +2. 도구가 모든 페이지의 미리보기 그리드를 렌더링합니다. +3. 미리보기를 끌어 순서를 바꾸고, 초록색 복제 버튼으로 페이지를 복제하고, 빨간색 삭제 버튼으로 페이지를 제거합니다. +4. 또는 텍스트 필드에 사용자 지정 페이지 순서(예: `3, 1, 2, 4`)를 입력하고 **적용**을 클릭하면 모든 페이지가 한 번에 재배열됩니다. +5. 처리 버튼을 클릭해 재구성된 PDF를 만들고 다운로드합니다. + +## 기능 + +- 애니메이션 전환이 있는 드래그 앤 드롭 페이지 재정렬 +- 페이지별 복제 및 삭제 버튼 +- 정밀한 재배열을 위한 사용자 지정 페이지 순서 입력 +- 변경할 때마다 자동으로 갱신되는 페이지 번호 레이블 +- 마지막 남은 페이지 삭제 방지 + +## 활용 사례 + +- 보고서에서 잘못 놓인 페이지를 올바른 위치로 옮기기 +- 양식 페이지를 복제해 한 파일에 빈 사본 여러 개 만들기 +- 문서를 배포하기 전에 초안이나 임시 페이지 제거하기 +- 인쇄 준비를 위해 페이지 순서 뒤집기 또는 섞기 +- 별도 파일을 다시 병합하지 않고 사용자 지정 페이지 순서 만들기 + +## 팁 + +- 사용자 지정 페이지 순서 필드에는 쉼표로 구분한 원래 페이지 번호를 입력해야 합니다. 모든 페이지가 정확히 한 번씩 포함되어야 하며, 누락이나 중복은 허용되지 않습니다. +- 페이지를 복제하면 두 사본이 같은 원본 페이지 인덱스를 참조합니다. 어느 사본이든 순서 변경은 독립적으로 작동합니다. +- 여러 파일에 걸친 대량 작업이나 더 고급 워크플로우에는 [PDF 멀티 도구](./pdf-multi-tool)를 사용해 보세요. + +## 관련 도구 + +- [PDF 병합](./merge-pdf) +- [페이지 삭제](./delete-pages) +- [PDF 멀티 도구](./pdf-multi-tool) +- [페이지 역순 정렬](./reverse-pages) diff --git a/docs/ko/tools/page-dimensions.md b/docs/ko/tools/page-dimensions.md new file mode 100644 index 00000000..a95d89ee --- /dev/null +++ b/docs/ko/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: 페이지 크기 정보 +description: PDF 페이지 크기, 방향, 가로세로 비율, 회전을 분석합니다. 크기가 섞인 문서를 감지하고 데이터를 CSV로 내보냅니다. +--- + +# 페이지 크기 정보 + +PDF의 모든 페이지를 읽어 정확한 크기, 방향, 표준 용지 이름, 가로세로 비율, 면적, 회전을 보고하는 진단 도구입니다. 인쇄 전에 크기가 섞인 페이지를 찾아내거나 받은 PDF의 속성을 문서화할 때 유용합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 분석이 자동으로 시작되므로 누를 버튼이 없습니다. +2. 요약 패널에 전체 페이지 수, 고유한 페이지 크기 수, 문서에 크기가 섞여 있는지 여부가 표시됩니다. +3. 페이지별 세부 정보가 담긴 전체 결과 표를 살펴봅니다. +4. 표시 단위를 포인트, 인치, 밀리미터, 픽셀 중에서 전환합니다. +5. **CSV로 내보내기**를 클릭해 데이터를 저장합니다. + +## 보고 항목 + +| 열 | 설명 | +| ------------- | ----------------------------------------------- | +| 페이지 # | 순차 페이지 번호 | +| 크기 | 선택한 단위의 너비 x 높이 | +| 표준 크기 | 일치하는 이름(A4, Letter 등) 또는 "사용자 지정" | +| 방향 | 세로 또는 가로 | +| 가로세로 비율 | 너비 대 높이 비율(소수) | +| 면적 | 선택한 단위의 제곱으로 나타낸 페이지 면적 | +| 회전 | 페이지 회전 각도(도) | + +## 기능 + +- 표준 용지 크기(A3, A4, A5, Letter, Legal, Tabloid 등) 자동 감지 +- 어떤 크기가 몇 페이지에 쓰였는지 보여주는 크기 혼합 문서 경고 +- 포인트, 인치, 밀리미터, 픽셀(96 PPI 기준) 간 단위 변환 +- 스프레드시트나 문서 관리 시스템에서 쓸 수 있는 CSV 내보내기 + +## 활용 사례 + +- 인쇄소에 문서를 제출하기 전에 모든 페이지가 A4인지 확인하기 +- 병합한 PDF가 특정 페이지에서 예상치 못한 여백으로 인쇄되는 원인 진단하기 +- 대규모 PDF 보관소의 페이지 레이아웃을 메타데이터 기록으로 문서화하기 +- 보정이 필요한 회전된 페이지 찾기 + +## 팁 + +- 요약에 "크기 혼합"이 표시되면 인쇄 전에 페이지 크기 통일 도구로 크기를 맞추세요. +- 회전 필드는 올바르게 표시되지만 회전 속성이 0이 아닌 페이지를 찾는 데 도움이 되며, 이런 페이지는 일부 워크플로우에서 문제를 일으킬 수 있습니다. + +## 관련 도구 + +- [페이지 크기 통일](./fix-page-size): 크기가 섞인 페이지를 찾은 뒤 표준화 +- [PDF 압축](./compress-pdf): 페이지 문제를 해결한 뒤 PDF 최적화 +- [PDF 회전](./rotate-pdf): 회전된 페이지 보정 diff --git a/docs/ko/tools/page-numbers.md b/docs/ko/tools/page-numbers.md new file mode 100644 index 00000000..38b53257 --- /dev/null +++ b/docs/ko/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: 페이지 번호 +description: 글꼴, 크기, 색상을 설정하여 PDF 페이지의 원하는 위치에 사용자 지정 페이지 번호를 추가합니다. +--- + +# 페이지 번호 + +PDF의 모든 페이지에 보이는 페이지 번호를 추가합니다. 위치, 형식, 글꼴 크기, 색상을 선택하면 나머지는 도구가 처리합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 나타나는 옵션 패널에서 페이지 번호 설정을 지정합니다. +3. **페이지 번호 추가**를 클릭해 처리합니다. +4. 번호가 매겨진 PDF가 자동으로 다운로드됩니다. + +## 옵션 + +- **위치**: 페이지 번호가 표시될 위치를 선택합니다. 하단 가운데, 하단 왼쪽, 하단 오른쪽, 상단 가운데, 상단 왼쪽, 상단 오른쪽 중에서 고릅니다. +- **형식**: 단순 번호(1, 2, 3...) 또는 "X / Y 페이지" 형식(1 / 5, 2 / 5...) 중에서 선택합니다. +- **글꼴 크기**: 페이지 번호 텍스트의 크기를 설정합니다. 기본값은 12입니다. +- **색상**: 색상 선택기로 페이지 번호 텍스트의 색상을 자유롭게 고릅니다. + +## 기능 + +- 모든 모서리와 가운데 위치를 포함한 여섯 가지 위치 옵션 +- 단순 순차 번호 또는 "X / Y 페이지"의 두 가지 번호 형식 +- 6~72포인트 범위의 글꼴 크기 설정 +- 텍스트 색상을 위한 전체 색상 선택기 +- 페이지 크기와 관계없이 번호가 안전 영역 안에 머물도록 여백을 자동 처리 + +## 활용 사례 + +- 페이지 참조가 필요한 인쇄용 문서 준비하기 +- 여러 원본 파일로 만든 병합 PDF에 페이지 번호 추가하기 +- 배포 전에 프레젠테이션 유인물에 번호 매기기 +- 법률 문서나 계약서에 순차 번호 추가하기 + +## 팁 + +- "X / Y 페이지" 형식은 제안서나 보고서처럼 독자가 전체 분량을 알아야 하는 문서에 유용합니다. +- 앞부분에 로마 숫자를 쓰는 것처럼 섹션마다 다른 번호 스타일이 필요하다면 [페이지 레이블 추가](./add-page-labels) 도구를 사용하세요. + +## 관련 도구 + +- [페이지 레이블 추가](./add-page-labels) +- [베이츠 번호 매기기](./bates-numbering) +- [머리글 및 바닥글](./header-footer) diff --git a/docs/ko/tools/pdf-booklet.md b/docs/ko/tools/pdf-booklet.md new file mode 100644 index 00000000..df4dafb6 --- /dev/null +++ b/docs/ko/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF 소책자 +description: 접고 스테이플로 고정해 실제 소책자를 만들 수 있도록 PDF 페이지를 소책자(중철) 순서로 재배열합니다. +--- + +# PDF 소책자 + +PDF 페이지를 소책자 면부착 순서로 재배열합니다. 양면 인쇄 후 반으로 접으면 페이지가 올바른 읽기 순서가 됩니다. 중철 소책자와 진(zine)에 쓰이는 레이아웃입니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 소책자 설정을 지정합니다. 출력 페이지 크기와 방향을 선택합니다. +3. **미리보기 생성**을 클릭해 각 용지에 페이지가 어떻게 배치되는지 확인합니다. +4. 각 실물 용지의 앞면과 뒷면 페이지 배정을 보여주는 미리보기를 검토합니다. +5. **다운로드**를 클릭해 소책자 순서로 재배열된 PDF를 저장합니다. + +## 기능 + +- 중철 제본을 위한 자동 페이지 재정렬 +- 출력 페이지 크기 설정 가능 +- 다운로드 전에 소책자 레이아웃을 시각적으로 미리보기 +- 페이지 수가 홀수이면 필요한 곳에 빈 페이지 삽입 +- 원본 페이지를 소책자 용지 크기에 맞게 크기 조정 + +## 활용 사례 + +- 일반 PDF로 인쇄 가능한 소책자나 진 만들기 +- 사내 인쇄용 학회 프로그램이나 행사 안내서 준비하기 +- 접이식 카드나 작은 카탈로그 만들기 +- 수제본용 소형 책자나 시집 제작하기 + +## 팁 + +- 깔끔한 소책자를 위해 원본 PDF의 페이지 수는 4의 배수가 이상적입니다. 그렇지 않으면 마지막 용지를 채우기 위해 빈 페이지가 자동으로 추가됩니다. +- 프린터의 "짧은 가장자리 넘김" 설정으로 양면 인쇄한 뒤, 모든 용지를 함께 접어 책등에 스테이플러로 고정하세요. +- 소책자 순서 없이 한 용지에 여러 페이지만 배치하려면 [N-Up PDF](./n-up-pdf)를 사용하세요. + +## 관련 도구 + +- [N-Up PDF](./n-up-pdf) +- [PDF 회전](./rotate-pdf) +- [빈 페이지 추가](./add-blank-page) diff --git a/docs/ko/tools/pdf-layers.md b/docs/ko/tools/pdf-layers.md new file mode 100644 index 00000000..aaa20e17 --- /dev/null +++ b/docs/ko/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCG 레이어 +description: PDF 문서의 선택적 콘텐츠 그룹(OCG) 레이어를 보고, 전환하고, 추가하고, 삭제합니다. +--- + +# PDF OCG 레이어 + +PDF 안의 선택적 콘텐츠 그룹(OCG), 흔히 "레이어"라고 부르는 항목을 관리합니다. 레이어 표시 여부를 전환하고, 새 레이어(중첩된 하위 레이어 포함)를 추가하고, 레이어를 삭제한 뒤 수정된 PDF를 저장할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 처리 버튼을 클릭해 PyMuPDF 엔진으로 문서를 불러옵니다. +3. 도구가 기존 레이어를 표시 상태, 잠금 상태, 중첩 계층과 함께 보여줍니다. +4. 체크박스를 전환해 레이어를 표시하거나 숨깁니다. 잠긴 레이어는 전환할 수 없습니다. +5. 이름을 입력하고 추가 버튼을 클릭해 새 최상위 레이어를 추가하거나, 기존 상위 레이어 아래에 하위 레이어를 추가합니다. +6. 더 이상 필요 없는 레이어를 삭제합니다. +7. **저장**을 클릭해 레이어 변경 사항이 적용된 PDF를 다운로드합니다. + +## 기능 + +- 중첩된 레이어를 올바른 들여쓰기로 계층 구조 표시 +- 레이어 표시 켜기/끄기 전환 +- 실수로 변경하는 것을 막아주는 잠금 레이어 표시 +- 사용자 지정 이름으로 최상위 또는 하위 레이어 추가 +- 개별 레이어 삭제 +- 모든 변경 사항을 새 PDF 파일로 저장 + +## 활용 사례 + +- 건축 또는 엔지니어링 도면에서 마크업 레이어 표시 전환하기 +- 여러 레이어로 된 디자인 문서에 새 주석 레이어 추가하기 +- 템플릿을 배포하기 전에 더 이상 쓰지 않는 레이어 제거하기 +- 외부에서 받은 복잡한 PDF에 어떤 레이어가 있는지 확인하기 + +## 팁 + +- PDF에 레이어가 없으면 도구가 빈 상태와 함께 레이어 추가 안내를 표시합니다. 모든 PDF가 OCG 레이어를 사용하는 것은 아니며, CAD 내보내기와 디자인 파일에서 가장 흔합니다. +- 하위 레이어는 상위 레이어 아래에 들여쓰기되어 표시됩니다. 레이어는 원하는 깊이까지 중첩할 수 있습니다. +- 잠긴 레이어는 잠금 아이콘과 함께 표시되며 체크박스가 비활성화됩니다. 이 잠금은 PDF 작성자가 설정한 것입니다. + +## 관련 도구 + +- [메타데이터 보기](./view-metadata) +- [메타데이터 편집](./edit-metadata) +- [복제 및 정리](./organize-pdf) diff --git a/docs/ko/tools/pdf-multi-tool.md b/docs/ko/tools/pdf-multi-tool.md new file mode 100644 index 00000000..d186eb1a --- /dev/null +++ b/docs/ko/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF 멀티 도구 +description: PDF 페이지의 병합, 분할, 회전, 복제, 삭제, 재정렬을 한곳에서 처리하는 올인원 페이지 관리 도구입니다. +--- + +# PDF 멀티 도구 + +모든 페이지 단위 PDF 작업을 위한 통합 작업 공간입니다. PDF를 하나 이상 업로드하면 모든 페이지를 하나의 시각적 그리드에서 다룰 수 있습니다. 회전, 재정렬, 복제, 삭제, 새 PDF 삽입, 빈 페이지 추가, 결과 분할까지 도구를 벗어나지 않고 모두 처리합니다. + +## 사용 방법 + +1. **PDF 업로드**를 클릭하거나 업로드 영역에 파일을 끌어다 놓습니다. 여러 파일을 지원합니다. +2. 업로드한 모든 파일의 페이지가 미리보기와 함께 스크롤 가능한 그리드에 표시됩니다. +3. 도구 모음이나 페이지별 작업 버튼으로 페이지를 조작합니다. +4. 각 카드의 체크박스로 페이지를 선택한 뒤 일괄 작업을 적용합니다. +5. 가위 아이콘으로 분할 지점을 표시해 출력을 여러 파일로 나눕니다. +6. **PDF 내보내기**를 클릭해 최종 결과를 다운로드합니다. 분할 표시가 있으면 출력은 여러 PDF가 담긴 ZIP입니다. + +## 기능 + +- **병합**: 여러 PDF를 업로드하면 하나의 작업 공간으로 자동 결합됩니다 +- **재정렬**: 페이지 카드를 끌어다 놓아 순서를 바꿉니다 +- **회전**: 페이지별 또는 일괄로 90도 단위(왼쪽 또는 오른쪽) 회전 +- **복제**: 클릭 한 번으로 페이지 복제 +- **삭제**: 개별 페이지를 제거하거나 선택한 페이지를 일괄 삭제 +- **PDF 삽입**: 원하는 페이지 뒤에 새 PDF 추가 +- **빈 페이지 추가**: 끝에 빈 A4 페이지 추가 +- **분할**: 페이지 사이에 분할 표시를 놓은 뒤 별도 PDF가 담긴 ZIP으로 내보내기 +- **모두 선택 / 모두 선택 해제**: 일괄 작업을 위한 빠른 선택 +- **실행 취소 / 다시 실행**: 모든 작업에 대한 전체 실행 취소/다시 실행 기록 +- **선택 항목 다운로드**: 선택한 페이지만 독립된 PDF로 내보내기 +- 불러오기 전에 손상된 PDF를 자동 복구 + +## 활용 사례 + +- 여러 원본 PDF의 페이지로 사용자 지정 문서 만들기 +- 빈 페이지 삭제, 옆으로 누운 스캔 회전, 섹션 재정렬로 스캔 문서 정리하기 +- 시각적 분할 표시로 큰 PDF를 챕터 경계에서 분할하기 +- 전체 PDF 편집기 없이 빠르게 페이지 단위 편집하기 + +## 팁 + +- 실행 취소/다시 실행 시스템은 모든 작업을 추적합니다. 마음껏 사용하세요. 작업 내용을 실수로 잃을 일은 없습니다. +- 분할 표시는 페이지 사이에 파란색 점선으로 나타납니다. 문서를 나누고 싶은 위치에 시각적으로 놓은 뒤 내보내면 ZIP을 받을 수 있습니다. +- 단순한 병합이나 분할 작업에는 전용 [PDF 병합](./merge-pdf) 또는 [PDF 분할](./split-pdf) 도구가 더 빠를 수 있습니다. 멀티 도구는 한 세션에서 여러 작업이 필요할 때 빛을 발합니다. + +## 관련 도구 + +- [PDF 병합](./merge-pdf) +- [PDF 분할](./split-pdf) +- [복제 및 정리](./organize-pdf) +- [PDF 회전](./rotate-pdf) diff --git a/docs/ko/tools/pdf-to-bmp.md b/docs/ko/tools/pdf-to-bmp.md new file mode 100644 index 00000000..cc5fa013 --- /dev/null +++ b/docs/ko/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF를 BMP로 +description: PDF 페이지를 비압축 BMP 이미지로 변환합니다. 비트맵 입력이 필요한 레거시 시스템과 인쇄 워크플로우에 유용합니다. +--- + +# PDF를 BMP로 + +PDF의 각 페이지를 BMP(비트맵) 이미지로 변환합니다. BMP는 비압축 형식이므로 품질 손실 없이 픽셀 단위로 정확한 결과를 얻을 수 있지만 파일 크기가 큽니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **변환**을 클릭해 파일을 처리합니다. +3. `.bmp` 파일 하나 또는 ZIP 압축 파일이 자동으로 다운로드됩니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 페이지는 고정된 2배 배율로 렌더링되어, PDF 원래 페이지 크기의 약 두 배인 이미지가 만들어집니다. + +## 출력 형식 + +- **한 페이지**: `filename.bmp` +- **여러 페이지**: `page_1.bmp`, `page_2.bmp` 등이 담긴 `filename_bmps.zip` + +## 활용 사례 + +- BMP 입력만 받는 레거시 시스템이나 장비에 PDF 페이지 전달하기 +- 특정 인쇄 워크플로우를 위한 비압축 이미지 준비하기 +- 원시 픽셀 데이터가 필요한 이미지 처리 도구의 입력으로 비트맵 출력 사용하기 + +## 팁 + +- BMP 파일은 압축 없이 원시 픽셀 데이터를 저장하므로 매우 큽니다. 대부분의 용도에서는 [PDF를 PNG로](./pdf-to-png)가 무손실 품질에 훨씬 작은 파일을 제공합니다. +- 대상 시스템이 PNG나 TIFF를 받는다면 디스크 공간을 아끼기 위해 해당 형식을 선택하세요. + +## 관련 도구 + +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 TIFF로](./pdf-to-tiff) +- [PDF를 JPG로](./pdf-to-jpg) diff --git a/docs/ko/tools/pdf-to-cbz.md b/docs/ko/tools/pdf-to-cbz.md new file mode 100644 index 00000000..4491071e --- /dev/null +++ b/docs/ko/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF를 CBZ로 +description: PDF를 Komga, Kavita, CDisplayEx, Calibre 같은 만화 리더용 CBZ(만화책 아카이브) 파일로 변환합니다. +--- + +# PDF를 CBZ로 + +PDF를 디지털 만화와 망가의 표준 형식인 CBZ(Comic Book ZIP) 파일로 변환합니다. PDF의 각 페이지가 아카이브 안의 이미지가 됩니다. 최대한의 호환성을 위해 ComicInfo.xml, metadata.opf, ComicBookInfo JSON 세 가지 형식으로 메타데이터를 생성합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. 이미지 형식, 품질, 배율, 선택적 메타데이터를 지정합니다. +3. **변환**을 클릭해 CBZ 파일을 생성합니다. +4. `.cbz` 파일이 자동으로 다운로드됩니다. + +## 옵션 + +| 옵션 | 값 | 기본값 | 설명 | +| --------------- | --------------- | ------ | --------------------------------------------------------------------- | +| 이미지 형식 | JPEG, PNG, WebP | JPEG | 컬러 만화는 JPEG, 무손실 흑백 망가는 PNG, 최고 압축률은 WebP입니다. | +| 품질 | 50–100% | 85% | JPEG/WebP 압축을 조절합니다. PNG는 항상 무손실이므로 숨겨집니다. | +| 배율 | 1.0x–4.0x | 2.0x | 배율이 높을수록 고해상도 화면에 맞는 더 선명한 이미지가 만들어집니다. | +| 흑백 | 켜짐/꺼짐 | 꺼짐 | 페이지를 흑백으로 변환합니다. 흑백 콘텐츠의 파일 크기를 줄여줍니다. | +| 망가 모드 | 켜짐/꺼짐 | 꺼짐 | 메타데이터에 오른쪽에서 왼쪽으로 읽는 방향을 설정합니다. | +| 메타데이터 포함 | 켜짐/꺼짐 | 켜짐 | ComicInfo.xml, metadata.opf, ComicBookInfo JSON을 포함합니다. | + +## 메타데이터 필드 + +메타데이터를 켜면 다음 항목을 입력할 수 있습니다. + +- **제목**: PDF 파일 이름에서 자동으로 감지됩니다. +- **시리즈**: 시리즈 이름(예: "Naruto"). +- **번호(#)**: 시리즈 내 권호 번호. +- **권(Vol.)**: 권 번호. +- **작가**: 작가 또는 제작자 이름. +- **출판사**: 출판사 이름. +- **태그 / 장르**: 쉼표로 구분한 태그(예: "Action, Adventure"). +- **출판 연도**: 출판 연도(1900–2100). +- **평점**: 0부터 5까지의 커뮤니티 평점. + +## 메타데이터 호환성 + +모든 리더가 메타데이터를 찾을 수 있도록 세 가지 형식으로 기록합니다. + +| 형식 | 위치 | 지원 프로그램 | +| ------------------ | ------------- | ------------------------------------------- | +| ComicInfo.xml | ZIP 내부 파일 | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | ZIP 내부 파일 | Calibre | +| ComicBookInfo JSON | ZIP 주석 필드 | Calibre (대체) | + +## 출력 형식 + +- `filename.cbz`: 번호가 매겨진 페이지 이미지와 메타데이터 파일이 담긴 ZIP 압축 파일입니다. + +페이지 이미지는 0으로 채운 번호(`01.jpg`, `02.jpg` 등)로 이름이 지정되어 리더가 올바른 순서로 표시합니다. + +## 활용 사례 + +- 망가나 만화 PDF를 만화책 리더에서 쓸 수 있게 변환하기 +- Komga, Kavita, Calibre에서 디지털 만화 라이브러리 만들기 +- 스캔한 만화책을 리더에 맞는 형식으로 변환하기 +- 읽기 방향과 메타데이터를 유지하는 형식으로 만화 공유하기 + +## 팁 + +- 컬러 만화에는 **JPEG**, 흑백 망가에는 **PNG**를 사용하세요. PNG는 흑백 콘텐츠를 매우 효율적으로 압축합니다. +- 망가에는 **흑백**을 켜면 파일 크기가 크게 줄어듭니다. +- 라이브러리 관리자(Komga, Calibre)가 컬렉션을 자동으로 정리할 수 있도록 **시리즈**와 **번호** 필드를 입력하세요. +- **WebP**는 압축률이 가장 좋지만 오래된 만화 리더는 지원하지 않을 수 있습니다. + +## 관련 도구 + +- [PDF를 JPG로](./pdf-to-jpg) +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 TIFF로](./pdf-to-tiff) +- [이미지 추출](./extract-images) diff --git a/docs/ko/tools/pdf-to-csv.md b/docs/ko/tools/pdf-to-csv.md new file mode 100644 index 00000000..5bc199f8 --- /dev/null +++ b/docs/ko/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF를 CSV로 +description: PDF 문서에서 표를 추출해 하나의 CSV 파일로 내보냅니다. 자동 표 감지로 여러 페이지 PDF도 처리합니다. +--- + +# PDF를 CSV로 + +PDF에서 표를 추출해 CSV 파일로 내보냅니다. PyMuPDF의 표 감지 엔진으로 모든 페이지에서 표 형태의 데이터를 찾고, 발견한 모든 행을 하나의 쉼표로 구분된 출력에 기록합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **변환**을 클릭해 표 추출을 시작합니다. +3. 도구가 각 페이지를 스캔하여 표를 자동으로 식별합니다. +4. 추출한 모든 표 데이터가 담긴 `.csv` 파일이 다운로드됩니다. + +서로 다른 페이지의 표는 출력에서 빈 행으로 구분됩니다. 쉼표, 따옴표, 줄바꿈이 포함된 셀은 RFC 4180에 따라 올바르게 이스케이프됩니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 문서에서 발견된 모든 표가 추출되어 하나의 CSV로 합쳐집니다. + +## 출력 형식 + +- 감지된 모든 표가 담긴 `filename.csv` 파일 하나. + +## 활용 사례 + +- PDF 은행 명세서나 청구서의 재무 데이터를 스프레드시트로 가져오기 +- 공급업체 견적서의 가격표를 추출해 비교하기 +- PDF 논문의 표 형태 연구 데이터를 분석 도구에 맞는 형식으로 변환하기 +- 레거시 PDF 보고서의 데이터를 데이터베이스로 이전하기 + +## 팁 + +- 표를 찾지 못하면 도구가 "표를 찾을 수 없음" 메시지를 표시합니다. 보통 PDF가 표처럼 보이지만 실제 표로 구조화되지 않은 텍스트 레이아웃을 사용한다는 뜻입니다. +- 개별 표를 더 세밀하게 제어하려면 CSV, JSON, Markdown 출력 형식 중에서 고를 수 있는 [PDF 표 추출](./extract-tables)을 사용하세요. +- 표마다 별도 시트가 있는 Excel 형식이 필요하다면 [PDF를 Excel로](./pdf-to-excel)를 사용하세요. + +## 관련 도구 + +- [PDF를 Excel로](./pdf-to-excel) +- [PDF 표 추출](./extract-tables) +- [PDF를 텍스트로](./pdf-to-text) diff --git a/docs/ko/tools/pdf-to-excel.md b/docs/ko/tools/pdf-to-excel.md new file mode 100644 index 00000000..3aea39a2 --- /dev/null +++ b/docs/ko/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF를 Excel로 +description: PDF 문서의 표를 Excel 스프레드시트로 추출합니다. 각 표는 페이지 정보가 포함된 별도의 워크시트가 됩니다. +--- + +# PDF를 Excel로 + +PDF에서 표를 추출해 Excel(`.xlsx`) 스프레드시트로 저장합니다. 감지된 각 표는 표 번호와 원본 페이지가 표시된 별도의 워크시트에 배치됩니다. 표 감지는 PyMuPDF가, Excel 생성은 SheetJS 라이브러리가 담당합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **변환**을 클릭해 표 추출을 시작합니다. +3. 도구가 모든 페이지에서 표를 스캔한 뒤 Excel 통합 문서를 만듭니다. +4. 표당 시트 하나가 있는 `.xlsx` 파일이 다운로드됩니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 감지된 모든 표가 자동으로 추출됩니다. + +## 출력 형식 + +- `filename.xlsx` 파일 하나. +- **표 하나**: "Table"이라는 이름의 워크시트 하나. +- **표 여러 개**: "Table 1 (Page 3)", "Table 2 (Page 5)" 등의 이름이 붙은 워크시트. 시트 이름은 Excel 제한인 31자로 잘립니다. + +## 활용 사례 + +- PDF 재무 보고서를 추가 분석을 위한 편집 가능한 스프레드시트로 변환하기 +- 공급업체 PDF에서 재고나 주문 표 추출하기 +- PDF 양식이나 카탈로그의 구조화된 데이터를 정렬과 필터링을 위해 Excel로 가져오기 +- 표 형태의 PDF 데이터를 비전문가 동료도 다룰 수 있는 형식으로 보관하기 + +## 팁 + +- 도구가 "표를 찾을 수 없음"이라고 알려준다면 PDF가 구조화된 표가 아닌 자유로운 텍스트 레이아웃을 사용했을 가능성이 높습니다. 대신 [PDF를 텍스트로](./pdf-to-text)로 원본 내용을 가져와 보세요. +- 더 단순한 평면 형식은 [PDF를 CSV로](./pdf-to-csv)를 사용하세요. 여러 형식으로 표별 다운로드가 필요하면 [PDF 표 추출](./extract-tables)을 사용하세요. +- 시트 이름을 보면 각 표가 어느 페이지에서 왔는지 알 수 있습니다. + +## 관련 도구 + +- [PDF를 CSV로](./pdf-to-csv) +- [PDF 표 추출](./extract-tables) +- [PDF를 텍스트로](./pdf-to-text) diff --git a/docs/ko/tools/pdf-to-greyscale.md b/docs/ko/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..a9ecab00 --- /dev/null +++ b/docs/ko/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF 흑백 변환 +description: 컬러 PDF를 흑백 버전으로 변환합니다. 모든 페이지에서 색상이 제거된 새 PDF를 만듭니다. +--- + +# PDF 흑백 변환 + +컬러 PDF를 흑백 버전으로 변환합니다. 각 페이지를 렌더링하고 채도를 제거한 뒤 JPEG 이미지로 새 PDF에 다시 삽입합니다. 출력은 원래 페이지 크기를 유지합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **변환**을 클릭해 파일을 처리합니다. +3. 모든 페이지가 흑백으로 변환된 새 `greyscale.pdf`가 다운로드됩니다. + +내부적으로 각 페이지를 2배 배율로 렌더링하고, 픽셀 데이터에 흑백 필터를 적용한 뒤, 품질 90%의 JPEG로 다시 인코딩하여 새 PDF 문서에 배치합니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 흑백 변환은 표준 휘도 공식을 사용하며 JPEG 품질은 90%로 고정되어 있습니다. + +## 출력 형식 + +- 모든 페이지가 흑백 JPEG 이미지로 들어 있는 `greyscale.pdf` 파일 하나. + +## 활용 사례 + +- 컬러 잉크 비용을 아끼기 위해 흑백 인쇄용 문서 준비하기 +- 흑백을 요구하는 법률 또는 정부 제출 요건 충족하기 +- 컬러 비중이 큰 PDF의 파일 크기 줄이기(흑백 JPEG 이미지는 컬러보다 작습니다) +- 컬러와 흑백 페이지가 섞인 문서들의 시각적 스타일 통일하기 + +## 팁 + +- 각 페이지가 래스터화되어 JPEG로 다시 삽입되므로 출력은 이미지 기반입니다. 원본 PDF의 텍스트는 더 이상 선택하거나 검색할 수 없습니다. 이후 검색 가능한 텍스트가 필요하면 출력을 OCR 도구에 넣어 처리하세요. +- 색상 조정(밝기, 대비, 채도)을 더 세밀하게 제어하려면 색상 조정 도구나 [PDF 워크플로우 빌더](./pdf-workflow)의 흑백 노드를 살펴보세요. + +## 관련 도구 + +- [PDF를 JPG로](./pdf-to-jpg) +- [PDF를 PNG로](./pdf-to-png) +- [PDF 워크플로우 빌더](./pdf-workflow) diff --git a/docs/ko/tools/pdf-to-jpg.md b/docs/ko/tools/pdf-to-jpg.md new file mode 100644 index 00000000..928b3238 --- /dev/null +++ b/docs/ko/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF를 JPG로 +description: 품질을 조절하여 PDF 페이지를 JPG 이미지로 변환합니다. 한 페이지 PDF는 바로 다운로드되고 여러 페이지 PDF는 ZIP으로 내보냅니다. +--- + +# PDF를 JPG로 + +PDF의 각 페이지를 JPG 이미지로 변환합니다. 한 페이지 문서는 독립된 `.jpg` 파일로 다운로드됩니다. 여러 페이지 PDF는 페이지당 JPG 하나가 담긴 ZIP 압축 파일이 만들어집니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. 도구에 파일 이름, 파일 크기, 페이지 수가 표시됩니다. +2. **품질** 슬라이더로 JPG 압축을 조절합니다. +3. **변환**을 클릭해 처리를 시작합니다. +4. 결과가 자동으로 다운로드됩니다. 한 페이지 PDF는 JPG 하나, 여러 페이지 문서는 ZIP 파일입니다. + +## 옵션 + +- **품질**: 0%에서 100%까지의 슬라이더(기본값 90%). 값이 높을수록 이미지가 선명하고 파일이 커집니다. 값이 낮을수록 더 강하게 압축됩니다. + +페이지는 내부적으로 2배 배율로 렌더링되므로 출력 해상도는 PDF 페이지 크기의 두 배입니다. 표준 Letter 크기 페이지는 약 1,224 x 1,584 픽셀 이미지가 됩니다. + +## 출력 형식 + +- **한 페이지**: `filename.jpg` +- **여러 페이지**: `page_1.jpg`, `page_2.jpg` 등이 담긴 `filename_jpgs.zip` + +## 활용 사례 + +- 문서 관리 시스템용 미리보기 썸네일 생성하기 +- PDF를 지원하지 않는 채팅이나 이메일로 보고서의 한 페이지 공유하기 +- PDF 다이어그램이나 일러스트에서 이미지 자산 만들기 +- 스캔한 문서를 개별 이미지로 보관하기 + +## 팁 + +- 무손실 출력이 필요하면 [PDF를 PNG로](./pdf-to-png)를 대신 사용하세요. +- 품질 80-90% 설정이 파일 크기와 시각적 충실도 사이의 좋은 균형입니다. +- 페이지마다 특정 형식이 필요하면 PDF를 이미지로 내보내는 출력 노드가 있는 [PDF 워크플로우 빌더](./pdf-workflow)를 고려해 보세요. + +## 관련 도구 + +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 WebP로](./pdf-to-webp) +- [PDF를 BMP로](./pdf-to-bmp) +- [PDF를 TIFF로](./pdf-to-tiff) diff --git a/docs/ko/tools/pdf-to-json.md b/docs/ko/tools/pdf-to-json.md new file mode 100644 index 00000000..b6839f58 --- /dev/null +++ b/docs/ko/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF를 JSON으로 +description: CPDF를 사용해 PDF 파일을 구조화된 JSON 형식으로 변환합니다. PDF 내부 구조를 기계가 읽을 수 있는 JSON 데이터로 내보냅니다. +--- + +# PDF를 JSON으로 + +PDF 파일을 하나 이상 JSON 형식으로 변환합니다. 이 도구는 CPDF(Coherent PDF)를 사용해 각 PDF의 내부 구조를 기계가 읽을 수 있는 JSON 표현으로 직렬화합니다. 출력은 항상 ZIP 압축 파일로 제공됩니다. + +## 사용 방법 + +1. 파일 선택기로 PDF 파일을 하나 이상 선택합니다. +2. **변환**을 클릭해 처리를 시작합니다. 변환은 백그라운드 웹 워커에서 실행됩니다. +3. 입력한 PDF마다 JSON 파일 하나가 담긴 ZIP 압축 파일이 다운로드됩니다. + +상태 표시줄에 변환과 ZIP 생성 단계의 진행 상황이 표시됩니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 각 PDF는 전체 JSON 표현으로 변환됩니다. + +## 출력 형식 + +- 입력한 PDF마다 `filename.json`이 담긴 `pdfs-to-json.zip` 파일. + +JSON 출력은 페이지 트리, 글꼴 참조, 메타데이터, 콘텐츠 스트림을 포함한 PDF의 내부 개체 구조를 나타냅니다. + +## 활용 사례 + +- 디버깅이나 검증을 위해 PDF의 내부 구조 살펴보기 +- 구조화된 메타데이터와 페이지 속성을 프로그래밍 방식으로 추출하기 +- PDF 구조 데이터를 맞춤형 처리 파이프라인에 전달하기 +- 개체 트리를 분석해 규정 준수를 위한 PDF 문서 감사하기 + +## 팁 + +- 이 도구는 추출된 텍스트 콘텐츠가 아닌 원시 PDF 개체 구조를 출력합니다. 페이지 텍스트를 JSON 형식으로 원한다면 [AI용 PDF 준비](./prepare-pdf-for-ai)를 사용하세요. +- 일반 텍스트 추출에는 [PDF를 텍스트로](./pdf-to-text)가 더 간단합니다. +- 구조가 복잡한 큰 PDF는 매우 큰 JSON 파일을 만듭니다. + +## 관련 도구 + +- [PDF를 텍스트로](./pdf-to-text) +- [AI용 PDF 준비](./prepare-pdf-for-ai) +- [PDF 표 추출](./extract-tables) diff --git a/docs/ko/tools/pdf-to-markdown.md b/docs/ko/tools/pdf-to-markdown.md new file mode 100644 index 00000000..7de9f39d --- /dev/null +++ b/docs/ko/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF를 Markdown으로 +description: PDF 문서를 선택적 이미지 추출과 함께 Markdown 형식으로 변환합니다. 여러 파일 일괄 변환을 지원합니다. +--- + +# PDF를 Markdown으로 + +PDF 파일을 제목, 문단, 목록, 기본 서식을 유지하며 Markdown(`.md`) 형식으로 변환합니다. 포함된 이미지를 추출해 함께 넣을 수도 있습니다. 단일 변환과 일괄 변환을 지원하며 PyMuPDF를 기반으로 합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. +2. 필요하면 **이미지 포함**을 켜서 추출한 이미지를 Markdown 출력에 포함합니다. +3. **변환**을 클릭해 처리를 시작합니다. +4. 파일 하나는 `filename.md`로 다운로드됩니다. 여러 파일은 `markdown-files.zip`이 만들어집니다. + +## 옵션 + +- **이미지 포함**: 체크하면 PDF에 포함된 이미지가 추출되어 Markdown 출력에서 참조됩니다. 체크를 해제하면 텍스트 콘텐츠만 변환됩니다. + +## 출력 형식 + +- **파일 하나**: `filename.md` +- **파일 여러 개**: 입력한 PDF마다 `.md` 하나가 담긴 `markdown-files.zip` + +## 활용 사례 + +- PDF 문서를 VitePress, Hugo, Jekyll 같은 정적 사이트 생성기용 Markdown으로 변환하기 +- PDF 연구 논문을 Obsidian 같은 노트 앱에서 쓸 수 있는 편집 가능한 Markdown으로 바꾸기 +- 레거시 PDF 지식 베이스를 Git 친화적인 텍스트 형식으로 이전하기 +- PDF 전자책에서 구조화된 콘텐츠를 추출해 다시 편집하기 + +## 팁 + +- 이미지 포함 옵션은 PDF에 콘텐츠에 필수적인 다이어그램이나 그림이 있을 때 유용합니다. 텍스트 위주 문서에서는 출력을 깔끔하게 유지하려면 끄세요. +- 사이드바, 각주, 다단 텍스트가 있는 복잡한 레이아웃은 Markdown이 완벽하지 않을 수 있습니다. 필요에 따라 출력을 검토하고 수정하세요. +- 서식이 전혀 없는 원시 텍스트가 필요하면 [PDF를 텍스트로](./pdf-to-text)를 대신 사용하세요. + +## 관련 도구 + +- [PDF를 텍스트로](./pdf-to-text) +- [PDF를 Word로](./pdf-to-word) +- [AI용 PDF 준비](./prepare-pdf-for-ai) diff --git a/docs/ko/tools/pdf-to-pdfa.md b/docs/ko/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..8260eca1 --- /dev/null +++ b/docs/ko/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF를 PDF/A로 +description: 일반 PDF를 장기 보관용 PDF/A 형식으로 변환합니다. PDF/A-1b, PDF/A-2b, PDF/A-3b 준수 수준을 지원합니다. +--- + +# PDF를 PDF/A로 + +PDF/A는 장기 디지털 보존을 위해 설계된 ISO 표준 PDF 하위 집합입니다. 이 도구는 브라우저에서 직접 실행되는 Ghostscript로 일반 PDF를 PDF/A 규격 문서로 변환합니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드합니다. +2. 드롭다운에서 **PDF/A 버전**을 선택합니다. +3. 일반 변환이 실패하는 복잡한 파일이라면 **사전 평탄화**를 선택적으로 켭니다. +4. **PDF/A로 변환**을 클릭합니다. 여러 파일은 ZIP 압축 파일로 만들어집니다. + +## PDF/A 버전 + +| 버전 | 제한 사항 | 적합한 용도 | +| ------------ | ---------------------------------------------- | -------------------------------------- | +| **PDF/A-1b** | 가장 엄격함. 투명도와 레이어를 사용할 수 없음. | 오래된 보관 시스템과의 최대 호환성 | +| **PDF/A-2b** | 투명도와 JPEG2000을 허용. | 범용 보관 (권장) | +| **PDF/A-3b** | 모든 형식의 첨부 파일 포함을 허용. | 원본 데이터 파일이 함께 있는 문서 보관 | + +PDF/A-2b가 기본으로 선택되어 있으며 대부분의 보관 요구를 충족합니다. + +## 사전 평탄화 옵션 + +일부 PDF에는 특이한 글꼴 인코딩, 복잡한 투명도 스택, 손상된 내부 구조처럼 깔끔한 PDF/A 변환을 방해하는 요소가 있습니다. **사전 평탄화**를 켜면 변환 전에 PDF를 300 DPI로 래스터화하여 규정 준수를 보장하지만, 대신 텍스트를 선택할 수 없게 됩니다. 표준 변환에서 오류가 발생할 때의 대안으로 사용하세요. + +사전 평탄화에는 PyMuPDF WASM 엔진이 필요합니다. + +## 활용 사례 + +- 정부 또는 법률 보관 요건 충족하기 (많은 관할권이 법원 제출 문서에 PDF/A를 의무화합니다) +- 기관 저장소나 디지털 도서관에 문서 제출하기 +- 10년 뒤에는 원본 소프트웨어가 없을 수 있는 업무 기록 보존하기 +- XML 첨부가 있는 PDF/A-3b를 요구하는 전자 청구서 표준에 맞춰 청구서 준비하기 + +## 팁 + +- 먼저 사전 평탄화 없이 변환을 시도하세요. 오류가 발생할 때만 켜세요. +- PDF/A는 모든 글꼴을 포함하므로 출력 파일이 원본보다 큰 경우가 많습니다. +- 워크플로우에서 엄격한 준수가 필요하다면 전용 PDF/A 검증기로 출력을 검증하세요. + +## 관련 도구 + +- [PDF 압축](./compress-pdf): 변환 후 파일 크기 줄이기 +- [PDF 평탄화](./flatten-pdf): PDF/A로 변환하기 전에 양식 평탄화 +- [메타데이터 제거](./remove-metadata): 보관 전에 메타데이터 제거 diff --git a/docs/ko/tools/pdf-to-png.md b/docs/ko/tools/pdf-to-png.md new file mode 100644 index 00000000..18469ad5 --- /dev/null +++ b/docs/ko/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF를 PNG로 +description: 배율을 조절하여 PDF 페이지를 무손실 PNG 이미지로 변환합니다. 고품질 스크린샷과 투명 배경에 적합합니다. +--- + +# PDF를 PNG로 + +PDF의 각 페이지를 PNG 이미지로 변환합니다. PNG는 무손실 압축을 사용하므로 출력이 원본 페이지의 모든 세부 사항을 유지합니다. 한 페이지 PDF는 `.png` 파일로 다운로드되고 여러 페이지 PDF는 ZIP이 만들어집니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **배율** 슬라이더로 출력 해상도를 설정합니다. +3. **변환**을 클릭해 처리를 시작합니다. +4. PNG 하나 또는 ZIP 압축 파일이 자동으로 다운로드됩니다. + +## 옵션 + +- **배율**: 1.0x에서 3.0x까지(기본값 2.0x). 2.0x에서는 표준 Letter 크기 페이지가 약 1,224 x 1,584 픽셀로 렌더링됩니다. 배율이 높을수록 이미지가 더 크고 선명해지지만 파일 크기와 처리 시간이 늘어납니다. + +## 출력 형식 + +- **한 페이지**: `filename.png` +- **여러 페이지**: `page_1.png`, `page_2.png` 등이 담긴 `filename_pngs.zip` + +## 활용 사례 + +- 프레젠테이션용으로 PDF 페이지의 고화질 스크린샷 캡처하기 +- 선명한 가장자리와 압축 흔적이 없어야 하는 차트나 다이어그램 추출하기 +- PDF 목업에서 웹 디자인용 자산 준비하기 +- OCR 전처리를 위한 무손실 페이지 이미지 만들기 + +## 팁 + +- PNG 파일은 JPG보다 훨씬 큽니다. 완벽한 품질보다 파일 크기가 중요하다면 [PDF를 JPG로](./pdf-to-jpg) 또는 [PDF를 WebP로](./pdf-to-webp)를 사용하세요. +- 배율 1.0x에서는 출력이 PDF의 원래 해상도와 일치합니다. 인쇄 품질로 내보내려면 3.0x로 올리세요. + +## 관련 도구 + +- [PDF를 JPG로](./pdf-to-jpg) +- [PDF를 WebP로](./pdf-to-webp) +- [PDF를 SVG로](./pdf-to-svg) diff --git a/docs/ko/tools/pdf-to-svg.md b/docs/ko/tools/pdf-to-svg.md new file mode 100644 index 00000000..a8c016d1 --- /dev/null +++ b/docs/ko/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF를 SVG로 +description: PDF 페이지를 확장 가능한 SVG 벡터 그래픽으로 변환합니다. 텍스트와 도형을 벡터 경로로 유지하여 무한히 확대할 수 있습니다. +--- + +# PDF를 SVG로 + +PDF의 각 페이지를 SVG(Scalable Vector Graphics) 파일로 변환합니다. 래스터 형식과 달리 SVG는 벡터 경로, 텍스트, 도형을 유지하므로 출력이 어떤 크기로 확대해도 깨지지 않습니다. PyMuPDF를 기반으로 합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. 여러 파일을 추가하고 개별적으로 관리할 수 있습니다. +2. **변환**을 클릭해 업로드한 모든 파일을 처리합니다. +3. 파일 하나에 페이지 하나인 변환은 독립된 `.svg`로 다운로드됩니다. 그 외에는 ZIP 압축 파일로 다운로드됩니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 각 페이지는 PyMuPDF의 기본 벡터 내보내기로 SVG로 변환됩니다. + +## 출력 형식 + +- **파일 하나, 페이지 하나**: `filename.svg` +- **파일 하나, 페이지 여러 개**: `page_1.svg`, `page_2.svg` 등이 담긴 `filename_svg.zip` +- **파일 여러 개**: 원본 문서 이름별로 정리된 파일이 담긴 `pdf_to_svg.zip` + +## 활용 사례 + +- PDF 보고서의 벡터 다이어그램, 차트, 일러스트를 웹 페이지용으로 추출하기 +- Inkscape나 Illustrator 같은 벡터 편집기에서 PDF 페이지 콘텐츠 편집하기 +- 반응형 웹 애플리케이션에 확장 가능한 페이지 미리보기 삽입하기 +- PDF 브로슈어에서 선명한 가장자리를 유지한 채 로고나 그래픽 추출하기 + +## 팁 + +- SVG는 벡터 콘텐츠가 있는 PDF에서 가장 잘 작동합니다. 스캔 문서나 이미지가 많은 PDF는 래스터 데이터가 포함된 큰 SVG 파일을 만듭니다. +- 이미지가 많은 PDF의 래스터 출력에는 [PDF를 PNG로](./pdf-to-png) 또는 [PDF를 JPG로](./pdf-to-jpg)를 대신 사용하세요. +- 이 도구는 일괄 변환을 지원합니다. 여러 PDF를 한 번에 업로드해 한꺼번에 변환하세요. + +## 관련 도구 + +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 JPG로](./pdf-to-jpg) +- [PDF를 Markdown으로](./pdf-to-markdown) diff --git a/docs/ko/tools/pdf-to-text.md b/docs/ko/tools/pdf-to-text.md new file mode 100644 index 00000000..364decf7 --- /dev/null +++ b/docs/ko/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF를 텍스트로 +description: PDF 파일에서 일반 텍스트를 추출합니다. 여러 PDF의 일괄 추출을 지원하며 TXT 파일로 출력합니다. +--- + +# PDF를 텍스트로 + +PDF 파일의 모든 텍스트 콘텐츠를 추출해 일반 `.txt` 파일로 저장합니다. 일괄 처리를 지원하므로 PDF 여러 개를 업로드하면 한 번에 각각의 텍스트가 추출됩니다. PyMuPDF를 기반으로 합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. 더 추가 및 지우기 버튼으로 파일 목록을 관리하세요. +2. **추출**을 클릭해 처리를 시작합니다. +3. 파일 하나는 `filename.txt`로 다운로드됩니다. 여러 파일은 `pdf-to-text.zip` 압축 파일이 만들어집니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 모든 페이지의 텍스트 콘텐츠가 읽기 순서대로 추출됩니다. + +## 출력 형식 + +- **파일 하나**: `filename.txt` +- **파일 여러 개**: 입력한 PDF마다 `.txt` 하나가 담긴 `pdf-to-text.zip` + +## 활용 사례 + +- 전체 텍스트 검색 색인용으로 PDF 보고서의 본문 추출하기 +- 전자잉크 기기에서 읽을 수 있도록 PDF 전자책이나 기사를 일반 텍스트로 변환하기 +- 키워드 분석을 위해 계약서나 법률 문서에서 텍스트 가져오기 +- 데이터 처리 스크립트용으로 PDF의 서식을 제거해 깨끗한 텍스트 얻기 +- PDF 보관소에서 자연어 처리용 텍스트 말뭉치 준비하기 + +## 팁 + +- 스캔한 PDF(이미지만 있는 경우)는 추출할 텍스트 레이어가 없으므로 빈 텍스트 파일이 만들어집니다. 스캔 문서는 먼저 OCR을 거치세요. +- 출력은 PyMuPDF가 해석한 읽기 순서를 유지하며, 일반적으로 왼쪽에서 오른쪽, 위에서 아래로 따릅니다. 다단 레이아웃은 텍스트가 뒤섞일 수 있습니다. +- 제목과 서식이 있는 구조화된 출력은 [PDF를 Markdown으로](./pdf-to-markdown)를 사용해 보세요. AI에 바로 쓸 수 있는 구조화된 JSON은 [AI용 PDF 준비](./prepare-pdf-for-ai)를 사용하세요. + +## 관련 도구 + +- [PDF를 Markdown으로](./pdf-to-markdown) +- [AI용 PDF 준비](./prepare-pdf-for-ai) +- [PDF를 Word로](./pdf-to-word) diff --git a/docs/ko/tools/pdf-to-tiff.md b/docs/ko/tools/pdf-to-tiff.md new file mode 100644 index 00000000..1b7459f7 --- /dev/null +++ b/docs/ko/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF를 TIFF로 +description: 인쇄, 팩스, 보관 워크플로우에서 흔히 쓰는 TIFF 이미지로 PDF 페이지를 변환합니다. 인코딩에 실패하면 PNG로 대체됩니다. +--- + +# PDF를 TIFF로 + +PDF의 각 페이지를 TIFF 이미지로 변환합니다. TIFF는 인쇄 제작, 팩스 시스템, 문서 보관의 표준 형식입니다. 이 도구는 TIFF 인코딩에 PackBits 압축을 사용하며, 페이지 인코딩에 실패하면 PNG로 대체합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **변환**을 클릭해 파일을 처리합니다. +3. TIFF 파일 하나 또는 ZIP 압축 파일이 자동으로 다운로드됩니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 페이지는 고정된 2배 배율로 렌더링됩니다. + +## 출력 형식 + +- **한 페이지**: `filename.tiff` +- **여러 페이지**: `page_1.tiff`, `page_2.tiff` 등이 담긴 `filename_tiffs.zip` + +특정 페이지의 TIFF 인코딩이 실패하면(압축 문제 등) 해당 페이지는 대신 `.png` 파일로 저장됩니다. 이 경우 ZIP에는 TIFF와 PNG 파일이 섞여 있습니다. + +## 활용 사례 + +- TIFF 형식을 요구하는 정부 기관이나 법률 시스템에 문서 제출하기 +- 디지털 팩스 서비스를 통한 팩스 전송용 페이지 준비하기 +- 스캔 문서를 널리 지원되는 무손실 형식으로 보관하기 +- 기업 문서 관리 시스템에 페이지 전달하기 + +## 팁 + +- TIFF 파일은 큽니다. 웹이나 화면용으로만 무손실 품질이 필요하다면 [PDF를 PNG로](./pdf-to-png)가 더 좋은 선택입니다. +- 일부 페이지가 PNG 대체를 사용했다면 ZIP 내용을 확인하세요. 해당 페이지는 따로 변환하는 것이 좋을 수 있습니다. + +## 관련 도구 + +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 BMP로](./pdf-to-bmp) +- [PDF를 JPG로](./pdf-to-jpg) diff --git a/docs/ko/tools/pdf-to-webp.md b/docs/ko/tools/pdf-to-webp.md new file mode 100644 index 00000000..7036311f --- /dev/null +++ b/docs/ko/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF를 WebP로 +description: 품질을 조절하여 PDF 페이지를 WebP 이미지로 변환합니다. 비슷한 화질에서 JPG보다 파일 크기가 작습니다. +--- + +# PDF를 WebP로 + +PDF의 각 페이지를 WebP 이미지로 변환합니다. WebP는 같은 체감 화질에서 보통 JPG보다 파일이 25-35% 작아 웹 용도에 좋은 선택입니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. +2. **품질** 슬라이더를 조절합니다. +3. **변환**을 클릭해 파일을 처리합니다. +4. `.webp` 파일 하나 또는 ZIP 압축 파일이 자동으로 다운로드됩니다. + +## 옵션 + +- **품질**: 0%에서 100%까지의 슬라이더(기본값 85%). 손실 압축 수준을 조절합니다. 값이 높을수록 더 많은 세부 사항이 유지됩니다. + +페이지는 내부적으로 2배 배율로 렌더링되어 PDF 원래 크기의 약 두 배인 이미지가 만들어집니다. + +## 출력 형식 + +- **한 페이지**: `filename.webp` +- **여러 페이지**: `page_1.webp`, `page_2.webp` 등이 담긴 `filename_webps.zip` + +## 활용 사례 + +- 대역폭이 중요한 웹사이트용 페이지 미리보기 준비하기 +- 소셜 미디어용으로 전단지나 브로슈어의 가벼운 이미지 버전 만들기 +- 여러 페이지 문서를 웹에 최적화된 이미지 세트로 일괄 변환하기 + +## 팁 + +- WebP는 모든 최신 브라우저에서 지원됩니다. 레거시 호환이 필요하면 [PDF를 JPG로](./pdf-to-jpg)를 사용하세요. +- 품질 80-85%는 보통 화면에서 원본과 구분되지 않으면서 파일 크기를 작게 유지합니다. + +## 관련 도구 + +- [PDF를 JPG로](./pdf-to-jpg) +- [PDF를 PNG로](./pdf-to-png) +- [PDF를 BMP로](./pdf-to-bmp) diff --git a/docs/ko/tools/pdf-to-word.md b/docs/ko/tools/pdf-to-word.md new file mode 100644 index 00000000..dfd31ba6 --- /dev/null +++ b/docs/ko/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF를 Word로 +description: PDF 파일을 편집 가능한 Word(DOCX) 문서로 변환합니다. 여러 PDF의 일괄 변환을 지원합니다. +--- + +# PDF를 Word로 + +PDF 파일을 편집 가능한 Word(`.docx`) 문서로 변환합니다. 이 도구는 PyMuPDF로 문서 내용을 재구성하여 텍스트, 기본 서식, 레이아웃을 유지합니다. 단일 변환과 일괄 변환을 지원합니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. 목록에서 파일을 더 추가하거나 개별 파일을 제거할 수 있습니다. +2. **변환**을 클릭해 처리를 시작합니다. +3. 파일 하나는 `filename.docx`로 다운로드됩니다. 여러 파일은 `converted-documents.zip`으로 묶입니다. + +## 옵션 + +이 도구에는 설정 가능한 옵션이 없습니다. 각 PDF는 PyMuPDF의 내장 변환 엔진으로 DOCX로 변환됩니다. + +## 출력 형식 + +- **파일 하나**: `filename.docx` +- **파일 여러 개**: 입력한 PDF마다 `.docx` 하나가 담긴 `converted-documents.zip` + +## 활용 사례 + +- 받은 PDF에서 수정이 필요한 텍스트 편집하기 +- 보관된 PDF 보고서를 동료가 Microsoft Word나 Google Docs에서 편집할 수 있는 형식으로 변환하기 +- PDF 계약서나 제안서의 내용을 수정 표시용으로 Word로 가져오기 +- 레거시 PDF 문서를 편집 가능한 형식으로 이전하기 + +## 팁 + +- 다단 텍스트, 포함된 양식, 그래픽이 많은 복잡한 레이아웃은 완벽하게 변환되지 않을 수 있습니다. 출력을 검토하고 워드 프로세서에서 서식을 조정하세요. +- 스캔한 PDF(이미지만 있는 경우)는 비어 있거나 내용이 거의 없는 DOCX 파일이 만들어집니다. 먼저 OCR로 텍스트 레이어를 추가하세요. +- 일괄 모드는 폴더 전체의 PDF를 변환할 때 효율적입니다. 한 번에 모두 업로드하세요. + +## 관련 도구 + +- [PDF를 텍스트로](./pdf-to-text) +- [PDF를 Markdown으로](./pdf-to-markdown) +- [PDF 워크플로우 빌더](./pdf-workflow) diff --git a/docs/ko/tools/pdf-to-zip.md b/docs/ko/tools/pdf-to-zip.md new file mode 100644 index 00000000..1edc53bc --- /dev/null +++ b/docs/ko/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF를 ZIP으로 +description: 여러 PDF 파일을 하나의 ZIP 압축 파일로 묶어 쉽게 공유하고 보관합니다. +--- + +# PDF를 ZIP으로 + +여러 PDF 파일을 하나의 ZIP 압축 파일로 묶습니다. PDF 자체를 변환, 압축, 수정하지 않는 단순한 묶음 도구입니다. + +## 사용 방법 + +1. 드롭 영역으로 PDF 파일을 여러 개 업로드합니다. +2. 파일 목록을 확인합니다. 포함하고 싶지 않은 파일은 제거합니다. +3. 처리 버튼을 클릭합니다. +4. 업로드한 모든 PDF가 담긴 ZIP 압축 파일이 바로 다운로드됩니다. + +## 기능 + +- 개수 제한 없이 PDF 파일 허용 +- 압축 파일을 만들기 전에 파일별 제거 +- ZIP 안에서 원래 파일 이름 유지 +- PDF 내용은 수정하지 않고 파일을 그대로 묶음 +- 업로드한 각 PDF의 파일 이름과 크기 표시 + +## 활용 사례 + +- 이메일 첨부를 위해 청구서나 영수증 묶음 만들기 +- 인수인계를 위해 프로젝트 산출물(PDF 보고서 여러 개) 묶기 +- 양식이나 템플릿 모음을 한 번에 내려받을 수 있게 만들기 +- 문서 묶음을 하나의 압축 파일로 보관하기 + +## 팁 + +- ZIP 파일은 원래 PDF 파일 이름을 사용합니다. 이름이 같은 파일이 있으면 충돌을 피하기 위해 업로드 전에 이름을 바꾸세요. +- 이 도구는 PDF 자체를 압축하지 않습니다. 파일 크기를 줄이려면 먼저 PDF 압축을 거친 뒤 이 도구로 묶으세요. + +## 관련 도구 + +- [PDF 병합](./merge-pdf) +- [PDF 분할](./split-pdf) +- [PDF 압축](./compress-pdf) diff --git a/docs/ko/tools/pdf-workflow.md b/docs/ko/tools/pdf-workflow.md new file mode 100644 index 00000000..607907b5 --- /dev/null +++ b/docs/ko/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF 워크플로우 빌더 +description: 캔버스에서 노드를 연결해 사용자 지정 PDF 처리 파이프라인을 시각적으로 만듭니다. 병합, 압축, 워터마크, 내보내기 같은 작업을 연결합니다. +--- + +# PDF 워크플로우 빌더 + +워크플로우 빌더를 사용하면 여러 PDF 작업을 하나의 자동화된 파이프라인으로 연결할 수 있습니다. 도구를 하나씩 실행하는 대신 입력, 처리, 출력 노드로 이루어진 시각적 그래프를 구성하고 클릭 한 번으로 모두 실행합니다. 파일은 브라우저 밖으로 나가지 않습니다. + +## 사용 방법 + +인터페이스는 왼쪽의 **노드 도구 상자**, 가운데의 **캔버스**, 노드를 선택하면 오른쪽에 나타나는 **설정 패널**의 세 패널로 나뉩니다. + +1. 왼쪽 사이드바에서 노드를 클릭하거나 캔버스로 직접 끌어다 놓아 **노드를 추가**합니다. 도구 상자 상단의 검색창으로 이름을 필터링할 수 있습니다. +2. 출력 소켓(노드 아래쪽)에서 다른 노드의 입력 소켓(위쪽)으로 끌어 **노드를 연결**합니다. 연결은 위에서 아래로 흐릅니다. +3. 노드를 클릭해 오른쪽에 설정 패널을 열어 **설정을 구성**합니다. 노드 유형마다 고유한 옵션(페이지 범위, 품질 슬라이더, 비밀번호 등)이 있습니다. +4. 도구 모음의 **실행** 버튼을 클릭해 **워크플로우를 실행**합니다. 엔진이 노드를 위상 순서로 실행하며 하나씩 순서대로 처리합니다. 하단의 상태 표시줄에서 진행 상황을 확인할 수 있습니다. +5. **결과 다운로드**: 마지막 다운로드 노드가 최종 PDF(여러 파일이 만들어지면 ZIP)를 저장합니다. + +## 노드 카테고리 + +노드는 여섯 개의 카테고리로 구성되며 캔버스에서 각각 색상으로 구분됩니다. + +- **입력** (파랑): PDF 입력, 이미지 입력, Word/Excel/PowerPoint를 PDF로, 그리고 파이프라인에 파일을 공급하는 15개 이상의 다른 형식 변환기. +- **편집 및 주석** (남색): 자르기, 흑백, 색상 반전, 워터마크, 페이지 번호, 머리글 및 바닥글, 스캔 효과, 색상 조정, 배경색, 빈 페이지 제거, 주석 제거. +- **정리 및 관리** (보라): 병합, 분할, 페이지 추출, 회전, 페이지 삭제, 역순, 빈 페이지 추가, 페이지 분할, N-Up, 페이지 크기 통일, 한 페이지로 합치기, 소책자, 포스터화, 메타데이터 편집, 목차, OCR. +- **최적화 및 복구** (호박색): 압축, 래스터화, 선형화, 기울기 보정, PDF를 PDF/A로, 폰트 윤곽선 변환, 복구. +- **PDF 보안** (장미색): 암호화, 복호화, 정리, 평탄화, 디지털 서명, 교정(Redact). +- **출력** (청록): 다운로드(단일 PDF와 ZIP을 자동 감지), PDF를 이미지로, PDF를 텍스트로, PDF를 DOCX로, PDF를 XLSX로, PDF를 CSV로, PDF를 SVG로, PDF를 Markdown으로, 이미지 추출. + +## 워크플로우 저장 및 불러오기 + +도구 모음은 네 가지 보존 옵션을 제공합니다. + +- **저장**: 현재 워크플로우를 브라우저의 로컬 저장소에 이름이 있는 템플릿으로 저장합니다. 여러 템플릿을 저장할 수 있습니다. +- **불러오기**: 저장된 모든 템플릿이 나열된 모달을 엽니다. 불러오기를 클릭해 복원하거나, 더 이상 필요 없는 템플릿을 삭제합니다. +- **내보내기**: 공유하거나 백업할 수 있도록 워크플로우를 `.json` 파일로 다운로드합니다. +- **가져오기**: 디스크의 `.json` 워크플로우 파일을 불러와 모든 노드, 위치, 연결을 복원합니다. + +템플릿은 세션이 바뀌어도 로컬 저장소에 유지됩니다. 내보낸 JSON 파일은 브라우저와 기기 간에 이동할 수 있습니다. + +## 실행 모델 + +엔진은 연결로부터 종속성 그래프를 만들고 노드를 위상 순서로 실행합니다. 노드가 하나라도 실패하면 실행이 중단되고 실패한 노드는 빨간색으로 표시됩니다. 알아둘 규칙은 다음과 같습니다. + +- 모든 워크플로우에는 **입력** 노드와 **출력** 노드가 각각 최소 하나 필요합니다. +- 엔진은 순환 종속성을 감지하고 오류와 함께 실행을 차단합니다. +- **암호화** 노드는 출력 노드 직전의 마지막 처리 단계여야 합니다. 더 앞에 배치하면 하위 노드가 암호화된 데이터를 처리할 수 없으므로 검증 경고가 표시됩니다. +- 비밀번호로 보호된 PDF는 실행 중에 비밀번호를 요청합니다. +- 여러 PDF 입력을 지원합니다. 병합 노드로 합치거나, 일괄 처리 노드가 각 PDF를 개별로 처리합니다. + +## 소켓 유형 + +연결은 잘못된 배선을 막기 위해 유형이 있는 소켓을 사용합니다. + +- **PDF** (남색): PDF 문서 하나. +- **MultiPDF** (호박색): 함께 묶인 여러 PDF 문서. +- **Image** (초록): 이미지 blob. + +## 옵션 + +모든 노드에는 오른쪽 설정 패널로 접근하는 고유한 설정이 있습니다. 흔한 예는 다음과 같습니다. + +- 분할, 페이지 추출, 페이지 삭제 노드의 **페이지 범위** +- 이미지 변환 출력 노드의 **품질 슬라이더** +- 암호화 및 복호화 노드의 **비밀번호 필드** +- 워터마크, 머리글 및 바닥글, 메타데이터 편집의 **텍스트 입력** +- 회전 노드의 **회전 각도** +- 압축 노드의 **압축 수준** +- OCR 노드의 **OCR 언어 선택** + +## 활용 사례 + +- **청구서 처리 파이프라인**: PDF 입력 -> OCR -> 표 추출 -> CSV로 다운로드. +- **보고서 표준화**: Word를 PDF로 -> 페이지 크기 통일 -> 페이지 번호 추가 -> 워터마크 -> 압축 -> 다운로드. +- **보관 준비**: PDF 입력 -> 복구 -> 평탄화 -> 정리 -> PDF를 PDF/A로 -> 다운로드. +- **일괄 이미지 추출**: PDF 입력(여러 파일) -> 이미지 추출 -> ZIP 다운로드. +- **인쇄용 소책자**: PDF 입력 -> 소책자 -> 자르기 -> 압축 -> 다운로드. +- **안전한 배포**: PDF 입력 -> 교정 -> 주석 제거 -> 암호화 -> 다운로드. + +## 팁 + +- 선택한 노드를 캔버스에서 제거하려면 **Delete** 또는 **Backspace**를 사용하세요. +- 노드 상태 표시줄의 **X** 버튼을 클릭하면 바로 삭제할 수 있습니다. +- 빈 공간을 클릭하고 끌어 캔버스를 이동하세요. 이동하는 동안 커서가 손바닥 아이콘으로 바뀝니다. +- 모바일에서는 도구 모음의 **+** 버튼으로 노드 도구 상자를 전환하세요. +- 워크플로우가 여러 출력 파일을 만들면 다운로드 노드가 자동으로 ZIP으로 묶습니다. +- 간단하게 시작하세요. 복잡도를 더하기 전에 노드 두 개짜리 파이프라인을 만들고 테스트해 보세요. + +## 관련 도구 + +- [PDF를 텍스트로](./pdf-to-text) +- [PDF를 Excel로](./pdf-to-excel) +- [이미지 추출](./extract-images) +- [PDF를 Markdown으로](./pdf-to-markdown) diff --git a/docs/ko/tools/png-to-pdf.md b/docs/ko/tools/png-to-pdf.md new file mode 100644 index 00000000..b93895d8 --- /dev/null +++ b/docs/ko/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG를 PDF로 +description: PNG 이미지를 하나 이상 선택해 품질을 조절하며 브라우저에서 PDF 문서로 변환합니다. +--- + +# PNG를 PDF로 + +PNG 이미지를 원본 해상도를 유지한 채 PDF로 변환합니다. 각 PNG는 원본 이미지 크기에 맞춰진 별도의 페이지가 됩니다. 투명도는 자동으로 처리됩니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :----- | +| PNG | `.png` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 PNG 파일을 끌어다 놓습니다. 여러 개를 한 번에 선택할 수 있습니다. +2. 파일 목록을 관리합니다. 필요 없는 파일은 제거하고 더 추가할 수 있습니다. +3. 드롭다운에서 **PDF 품질** 수준을 선택합니다. +4. **PDF로 변환**을 클릭합니다. 출력은 `from_jpgs.pdf`로 다운로드됩니다. + +이 도구는 pdf-lib로 각 이미지를 직접 포함합니다. PNG를 기본 방식으로 포함할 수 없는 경우(예: 특이한 색상 프로필) 캔버스를 통해 JPEG로 다시 렌더링하는 방식으로 대체합니다. + +## 옵션 + +**PDF 품질**은 포함하기 전에 적용되는 압축을 조절합니다. + +- **높은 품질**: 최소 압축, 가장 큰 파일 크기. +- **중간 품질** (기본값): 크기와 선명도의 좋은 균형. +- **낮은 품질**: 최대 압축, 가장 작은 출력. + +## 활용 사례 + +- 버그 보고서나 문서화를 위해 스크린샷을 여러 페이지 PDF로 변환하기 +- UI 디자인 내보내기 파일을 검토용 단일 파일로 묶기 +- 다이어그램 내보내기(draw.io, Excalidraw)를 공유 가능한 PDF로 만들기 +- 차트 이미지 모음을 보고서로 구성하기 + +## 팁 + +- 투명도가 있는 PNG 파일은 PDF에서 흰색 배경이 적용됩니다. 다른 배경이 필요하면 미리 이미지를 편집하세요. +- 선명한 가장자리와 텍스트가 있는 스크린샷과 다이어그램은 높은 품질을 사용하면 JPEG 압축 흔적을 피할 수 있습니다. 중간 또는 낮은 품질은 내부적으로 JPEG로 변환될 수 있습니다. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [JPG를 PDF로](./jpg-to-pdf) +- [SVG를 PDF로](./svg-to-pdf) diff --git a/docs/ko/tools/posterize-pdf.md b/docs/ko/tools/posterize-pdf.md new file mode 100644 index 00000000..6e56c5fd --- /dev/null +++ b/docs/ko/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF 포스터화 +description: PDF 페이지를 격자 형태의 작은 페이지로 나누어 여러 장에 걸쳐 대형 인쇄를 할 수 있습니다. +--- + +# PDF 포스터화 + +PDF의 각 페이지를 격자 형태의 작은 하위 페이지로 나눕니다. 한 페이지를 여러 장의 용지에 나누어 인쇄한 뒤 이어 붙여 대형 포스터나 현수막을 만들 때 사용하는 도구입니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. **행**과 **열** 수를 설정하여 격자를 정합니다(예: 2행 x 2열이면 각 페이지가 4개의 하위 페이지로 나뉩니다). +3. 필요하면 페이지 범위를 지정하여 포스터화할 페이지를 제한합니다. +4. 미리보기 캔버스에 현재 페이지 위로 격자 오버레이가 표시되어 자르는 위치를 확인할 수 있습니다. +5. 페이지를 넘기며 다른 페이지의 오버레이도 확인합니다. +6. 처리 버튼을 클릭합니다. 격자의 각 칸이 출력 PDF의 개별 페이지가 됩니다. + +## 기능 + +- 행과 열 수를 자유롭게 설정하여 다양한 격자 크기 지원 +- 페이지가 나뉘는 위치를 정확히 보여주는 격자 오버레이 실시간 미리보기 +- 특정 페이지만 포스터화하는 페이지 범위 필터 +- 미리보기에서 페이지별 탐색 +- 빠른 미리보기 탐색을 위한 페이지 스냅샷 캐시 +- 빨간 점선 격자선으로 자르는 경계를 명확하게 표시 + +## 옵션 + +| 옵션 | 설명 | +| --------------- | ----------------------------------------- | +| **행** | 가로 분할 수 (기본값: 1) | +| **열** | 세로 분할 수 (기본값: 1) | +| **페이지 범위** | 포스터화할 페이지 (비워 두면 모든 페이지) | + +## 활용 사례 + +- 포스터 크기의 PDF를 일반 A4 또는 Letter 용지에 나누어 인쇄하여 벽에 붙이기 +- 한 페이지짜리 PDF 디자인으로 대형 현수막 만들기 +- 큰 기술 도면을 인쇄 가능한 조각으로 나누기 +- 대형 프린터 없이 대형 인쇄물 만들기 + +## 팁 + +- 2x2 격자는 한 페이지를 4페이지로, 3x3 격자는 9페이지로 만듭니다. 최종적으로 이어 붙인 결과물의 크기에 맞춰 격자를 계획하세요. +- 미리보기 오버레이로 중요한 내용이 자르는 선에 걸치지 않는지 확인할 수 있습니다. 필요하면 행/열을 조정하세요. +- 반대 작업(여러 페이지를 한 장에 맞추기)에는 [N-Up PDF](./n-up-pdf)를 사용하세요. + +## 관련 도구 + +- [N-Up PDF](./n-up-pdf) +- [페이지 분할](./divide-pages) +- [PDF 분할](./split-pdf) diff --git a/docs/ko/tools/powerpoint-to-pdf.md b/docs/ko/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..e6f73f29 --- /dev/null +++ b/docs/ko/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint를 PDF로 +description: PowerPoint 프레젠테이션(PPT, PPTX)과 ODP 파일을 슬라이드 서식을 유지한 채 PDF로 변환합니다. +--- + +# PowerPoint를 PDF로 + +프레젠테이션 파일을 PDF로 변환합니다. 각 슬라이드가 출력 문서의 한 페이지가 되며, 텍스트, 이미지, 도형, 전환 효과는 브라우저 기반 LibreOffice 엔진으로 렌더링됩니다. 최신 및 구형 PowerPoint 형식과 OpenDocument Presentation 형식을 모두 지원합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :------------------------ | :------ | +| PowerPoint (최신) | `.pptx` | +| PowerPoint (구형) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 프레젠테이션 파일을 끌어다 놓습니다. +2. 파일 목록을 확인합니다. 필요에 따라 파일을 추가하거나 제거합니다. +3. **PDF로 변환**을 클릭합니다. 처음 사용할 때 LibreOffice 엔진이 로드된 후 각 파일을 변환합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `powerpoint-converted.zip`으로 묶여 다운로드됩니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. 슬라이드는 원래 크기 그대로 렌더링됩니다. + +## 출력 + +| 입력 수 | 출력 | +| :------------ | :---------------------------------------------------------------- | +| 파일 1개 | PDF 한 개 다운로드 (원본 파일명에 `.pdf` 확장자) | +| 파일 2개 이상 | 파일당 PDF 하나를 담은 ZIP 압축 파일 (`powerpoint-converted.zip`) | + +## 활용 사례 + +- PowerPoint가 없을 수 있는 대상에게 공유하기 전에 프레젠테이션을 PDF로 변환 +- 컨퍼런스나 워크숍용 슬라이드 인쇄 자료 만들기 +- 모든 기기에서 동일하게 보이는 형식으로 프레젠테이션 보관 +- LibreOffice Impress의 ODP 프레젠테이션을 일괄 PDF로 변환 +- 이메일 첨부용 피치 덱 PDF 만들기 + +## 팁 + +- 슬라이드 애니메이션과 전환 효과는 PDF에 반영되지 않습니다. 각 슬라이드는 정적인 페이지로 저장됩니다. +- 삽입된 동영상은 출력에 나타나지 않습니다. 필요하면 스크린샷이나 대체 이미지로 바꾸세요. +- 발표자 노트는 기본 PDF 내보내기에 포함되지 않습니다. 노트가 필요하면 먼저 PowerPoint 자체의 "노트 인쇄" 보기에서 내보내는 것을 고려하세요. +- LibreOffice 엔진은 처음 로드한 뒤 캐시되므로 같은 세션에서 두 번째 프레젠테이션을 변환하면 훨씬 빠릅니다. + +## 관련 도구 + +- [Word를 PDF로](./word-to-pdf) +- [Excel을 PDF로](./excel-to-pdf) +- [이미지를 PDF로](./image-to-pdf) diff --git a/docs/ko/tools/prepare-pdf-for-ai.md b/docs/ko/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..a23846ca --- /dev/null +++ b/docs/ko/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: AI용 PDF 준비 +description: PDF 내용을 LLM과 LlamaIndex 같은 AI 파이프라인에 최적화된 구조화 JSON으로 추출합니다. 일괄 처리를 지원합니다. +--- + +# AI용 PDF 준비 + +PDF 파일에서 내용을 추출하여 대규모 언어 모델(LLM)과 LlamaIndex 같은 AI 프레임워크에서 사용하기 좋은 JSON으로 구조화합니다. 각 페이지의 내용이 추출되어 RAG 파이프라인, 챗봇, 시맨틱 검색 시스템에 바로 쓸 수 있는 구조화된 형식으로 정리됩니다. + +## 사용 방법 + +1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. +2. **추출**을 클릭하여 처리를 시작합니다. +3. 파일이 하나면 `filename_llm.json`으로 다운로드됩니다. 여러 파일은 `pdf-for-ai.zip` 압축 파일로 생성됩니다. + +이 도구는 PyMuPDF의 LlamaIndex 통합 기능을 사용하여 메타데이터가 포함된 페이지 단위 내용을 추출하며, 결과물은 AI 프레임워크에 바로 불러올 수 있습니다. + +## 옵션 + +이 도구에는 설정할 수 있는 옵션이 없습니다. 모든 페이지가 전체 텍스트와 메타데이터와 함께 추출됩니다. + +## 출력 형식 + +- **파일 하나**: `filename_llm.json` +- **여러 파일**: 입력 PDF마다 `_llm.json` 하나씩을 담은 `pdf-for-ai.zip`. + +JSON 출력은 페이지별 텍스트 내용과 메타데이터 필드를 가진 LlamaIndex 문서 스키마를 따릅니다. + +## 활용 사례 + +- 검색 증강 생성(RAG) 파이프라인용 PDF 문서 준비 +- PDF 아카이브로 AI 챗봇용 검색 가능한 지식 베이스 구축 +- PDF 보고서를 LLM 기반 분석 워크플로에 입력 +- 시맨틱 검색 및 질의응답 시스템을 위한 연구 논문 전처리 +- PDF 문서 모음에서 구조화된 학습 데이터 생성 + +## 팁 + +- AI 전용 형식이 필요 없는 일반 텍스트 추출에는 [PDF를 텍스트로](./pdf-to-text)를 사용하세요. +- 제목과 구조를 유지하는 Markdown 출력에는 [PDF를 Markdown으로](./pdf-to-markdown)를 사용하세요. +- 스캔한 PDF는 출력이 비어 있거나 거의 없습니다. 추출 전에 OCR로 텍스트 레이어를 먼저 추가하세요. + +## 관련 도구 + +- [PDF를 텍스트로](./pdf-to-text) +- [PDF를 Markdown으로](./pdf-to-markdown) +- [PDF를 JSON으로](./pdf-to-json) diff --git a/docs/ko/tools/protect-pdf.md b/docs/ko/tools/protect-pdf.md new file mode 100644 index 00000000..183478a6 --- /dev/null +++ b/docs/ko/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: PDF 보호 +description: 256비트 AES 암호화로 PDF 파일을 비밀번호로 보호합니다. 사용자 및 소유자 비밀번호와 사용 제한을 설정할 수 있습니다. +--- + +# PDF 보호 + +PDF를 비밀번호로 잠가 권한이 있는 사람만 열 수 있게 합니다. BentoPDF는 은행과 정부 기관에서 사용하는 것과 같은 표준인 256비트 AES 암호화를 QPDF를 통해 브라우저 안에서 모두 처리합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. **사용자 비밀번호**를 입력합니다(필수). 파일을 열 때 필요한 비밀번호입니다. +3. 필요하면 **소유자 비밀번호**를 입력합니다. 설정하면 PDF에 인쇄, 편집, 복사, 주석 달기를 막는 사용 제한이 적용됩니다. +4. **PDF 암호화**를 클릭합니다. +5. 암호화된 파일을 다운로드합니다. + +## 비밀번호 종류 + +### 사용자 비밀번호 (필수) + +사용자 비밀번호는 받는 사람이 PDF를 열 때 입력하는 비밀번호입니다. 이 비밀번호가 없으면 문서에 전혀 접근할 수 없습니다. 암호화된 모든 PDF에는 반드시 있어야 합니다. + +### 소유자 비밀번호 (선택) + +소유자 비밀번호는 권한이 있는 사용자가 파일을 연 후 할 수 있는 작업을 제어합니다. 별도의 소유자 비밀번호를 설정하면 BentoPDF가 가장 엄격한 제한 설정을 자동으로 적용합니다. + +- 수정 비활성화 +- 추출/복사 비활성화 +- 인쇄 비활성화 +- 주석 비활성화 +- 양식 작성 비활성화 +- 문서 조립 비활성화 + +소유자 비밀번호를 비워 두면 PDF는 암호화되어 열 때 사용자 비밀번호가 필요하지만, 일단 열고 나면 사용 제한이 없습니다. + +## 암호화 세부 정보 + +- **알고리즘**: AES-256 (256비트 Advanced Encryption Standard) +- **키 길이**: 256비트 +- **표준**: PDF 2.0 암호화 (QPDF 구현) + +AES-256은 현재 기술로는 무차별 대입으로 뚫는 것이 계산상 불가능합니다. 암호화된 PDF의 보안은 전적으로 비밀번호의 강도에 달려 있습니다. + +## 활용 사례 + +- 기밀 재무 보고서를 이메일로 보내기 전에 보호 +- 상대측 변호인과 공유하는 법률 문서 보안 +- 의료 기록이나 개인 식별 정보에 비밀번호 추가 +- 유료 콘텐츠(전자책, 보고서)를 접근 제어와 함께 배포 +- 저장 데이터 암호화를 요구하는 데이터 보호 정책 준수 + +## 팁 + +- 강력하고 고유한 비밀번호를 사용하세요. 대소문자, 숫자, 기호를 섞은 12자 이상의 암호 문구가 이상적입니다. +- 비밀번호는 별도의 경로(전화, 문자 메시지)로 전달하고, PDF를 보내는 이메일에는 절대 함께 적지 마세요. +- 열 때 비밀번호를 요구하지 않고 동작(인쇄 금지, 복사 금지)만 제한하려면 권한 변경 도구를 대신 사용하세요. + +## 관련 도구 + +- [PDF 잠금 해제](./unlock-pdf): 비밀번호를 알고 있을 때 암호화 해제 +- [권한 변경](./change-permissions): 특정 사용 제한 수정 +- [제한 해제](./remove-restrictions): PDF의 모든 보안 제거 +- [PDF 정리](./sanitize-pdf): 암호화 전에 숨겨진 내용 제거 diff --git a/docs/ko/tools/psd-to-pdf.md b/docs/ko/tools/psd-to-pdf.md new file mode 100644 index 00000000..ae1cabc1 --- /dev/null +++ b/docs/ko/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD를 PDF로 +description: Photoshop(PSD) 파일을 브라우저에서 PDF로 변환합니다. 무료이며 개인정보가 보호되고 Adobe 소프트웨어가 필요 없습니다. +--- + +# PSD를 PDF로 + +Adobe Photoshop PSD 파일을 PDF 문서로 변환합니다. PSD는 Photoshop의 기본 형식이라 보통 값비싼 Adobe 소프트웨어가 있어야 열 수 있습니다. 이 도구는 PSD 파일의 병합된 합성 이미지를 원본 해상도 그대로 PDF 페이지로 렌더링합니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :-------------- | :----- | :-------------------------- | +| Adobe Photoshop | `.psd` | 병합된 합성 이미지를 렌더링 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 PSD 파일을 끌어다 놓습니다. 여러 파일을 지원합니다. +2. 파일 목록을 확인합니다. 원하지 않는 파일은 휴지통 아이콘으로 제거하거나 **파일 더 추가**로 더 포함합니다. +3. **PDF로 변환**을 클릭합니다. PyMuPDF 엔진이 PSD 파일을 읽고 합성 이미지를 원본 해상도로 PDF 페이지에 삽입합니다. +4. PSD 하나는 PDF 하나가 됩니다. 여러 PSD 파일을 업로드하면 `psd_to_pdf.pdf`라는 이름의 여러 페이지짜리 PDF 하나로 합쳐지며, 각 PSD가 한 페이지가 됩니다. + +## 옵션 + +설정이 필요 없습니다. 변환기는 PSD 파일의 병합된 이미지 데이터를 사용합니다. + +## 활용 사례 + +- Photoshop을 열지 않고 디자인 미리보기 +- Adobe Creative Suite가 없는 고객에게 디자인 시안 전달 +- PSD 파일의 고해상도 아트워크 인쇄 +- 여러 PSD 디자인 파일로 PDF 포트폴리오 만들기: 각 파일이 하나의 문서 안에서 한 페이지가 됩니다 + +## 팁 + +- 변환은 PSD의 합성(병합된) 보기를 렌더링합니다. 개별 레이어, 조정 레이어, 레이어 효과는 PDF에서 별도 요소로 유지되지 않습니다. +- 여러 PSD 파일은 개별 PDF가 아니라 여러 페이지짜리 PDF 하나로 합쳐집니다. 포트폴리오나 룩북을 만들 때 유용합니다. +- 해상도가 매우 높은 PSD 파일(300 DPI 이상의 인쇄용 파일)은 PDF 크기가 커집니다. 이 도구는 전체 해상도를 유지합니다. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [PNG를 PDF로](./png-to-pdf) +- [VSD를 PDF로](./vsd-to-pdf) diff --git a/docs/ko/tools/pub-to-pdf.md b/docs/ko/tools/pub-to-pdf.md new file mode 100644 index 00000000..73006ba5 --- /dev/null +++ b/docs/ko/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB를 PDF로 +description: Microsoft Publisher(PUB) 파일을 브라우저에서 PDF로 변환합니다. 무료이며 개인정보가 보호되고 별도 소프트웨어가 필요 없습니다. +--- + +# PUB를 PDF로 + +Microsoft Publisher 파일을 PDF로 변환합니다. Publisher는 일부 Microsoft Office 에디션에 포함된 데스크톱 출판 도구이지만 대부분의 사람들은 설치하지 않았습니다. 이 도구로 누구나 Microsoft 소프트웨어 없이 브라우저에서 바로 PUB 파일을 PDF로 변환할 수 있습니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :------------------ | :----- | :----------------- | +| Microsoft Publisher | `.pub` | 데스크톱 출판 문서 | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 PUB 파일을 끌어다 놓습니다. 여러 파일을 한 번에 업로드할 수 있습니다. +2. 파일 목록을 확인합니다. 원하지 않는 파일은 휴지통 아이콘으로 제거하거나 **파일 더 추가**를 클릭해 더 추가합니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 기반 엔진이 브라우저에 로드되어 레이아웃, 이미지, 텍스트 상자를 유지한 채 각 PUB 파일을 변환합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `pub-to-pdf.zip`이라는 ZIP 압축 파일로 제공됩니다. + +## 옵션 + +추가 설정이 필요 없습니다. 변환기가 PUB 레이아웃 엔진을 자동으로 처리합니다. + +## 활용 사례 + +- Microsoft Publisher를 구매하지 않고 고객이 보낸 PUB 전단지나 소식지 열기 +- Publisher로 만든 교회 주보, 행사 프로그램, 학교 소식지 변환 +- Publisher의 마케팅 자료를 누구나 열 수 있는 형식으로 보관 +- Publisher가 설치되지 않은 시스템에서 PUB 파일 인쇄 + +## 팁 + +- 텍스트 상자가 겹쳐 있고 위치가 정밀한 복잡한 Publisher 레이아웃은 변환 중 약간 어긋날 수 있습니다. 정확한 위치가 중요하다면 결과를 확인하세요. +- LibreOffice 엔진은 세션당 한 번 초기화됩니다. 첫 변환은 시간이 더 걸리고 이후는 더 빠릅니다. +- Publisher 파일을 가장 충실하게 변환하려면 원본에 사용된 사용자 지정 글꼴이 표준 시스템 글꼴인지 확인하세요. + +## 관련 도구 + +- [VSD를 PDF로](./vsd-to-pdf) +- [ODP를 PDF로](./odp-to-pdf) diff --git a/docs/ko/tools/rasterize-pdf.md b/docs/ko/tools/rasterize-pdf.md new file mode 100644 index 00000000..122c96a4 --- /dev/null +++ b/docs/ko/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF 래스터화 +description: PDF 페이지를 이미지 기반 PDF로 변환합니다. 모든 레이어를 평탄화하고 선택 가능한 텍스트를 제거하며 DPI와 이미지 형식을 조절할 수 있습니다. +--- + +# PDF 래스터화 + +래스터화는 PDF의 각 페이지를 이미지로 변환한 뒤 그 이미지들을 다시 PDF로 조립합니다. 결과물은 원본과 똑같아 보이지만 선택 가능한 텍스트, 상호작용 요소, 편집 가능한 레이어가 없습니다. 사실상 고품질 복사본입니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드합니다. +2. 래스터화 출력의 **DPI**(해상도)를 설정합니다. +3. **이미지 형식**을 선택합니다. 무손실 품질은 PNG, 더 작은 파일은 JPEG입니다. +4. 필요하면 **흑백으로 변환**을 선택합니다. +5. **PDF 래스터화**를 클릭합니다. 여러 파일은 ZIP으로 다운로드됩니다. + +## 옵션 + +| 설정 | 값 | 기본값 | +| --------------- | ---------------------------- | ------ | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **이미지 형식** | PNG (무손실), JPEG (더 작음) | PNG | +| **흑백** | 켜기/끄기 | 끄기 | + +## DPI 가이드 + +- **72**: 화면에서만 볼 때, 가장 작은 파일 크기 +- **150**: 일반 용도에 적합한 균형 +- **200**: 더 선명한 텍스트, 보통 파일 크기 +- **300**: 인쇄 품질 출력 +- **600**: 고품질 보관 또는 전문 인쇄 + +## 활용 사례 + +- 공유 전에 기밀 문서의 텍스트 추출 방지 +- 텍스트를 픽셀로 변환하여 글꼴 의존 문제 해결 +- 복잡한 레이어나 투명도 때문에 뷰어마다 다르게 보이는 PDF의 "평면" 버전 만들기 +- 이미지 기반 입력만 받는 시스템용 PDF 준비 +- PDF를 순수 이미지로 줄여 숨겨진 내용(변경 내역이나 양식 데이터 등) 제거 + +## 팁 + +- PNG 150 DPI가 안정적인 기본값입니다. 인쇄용 출력이 필요하거나 세부를 확대해야 할 때만 더 높이세요. +- JPEG는 파일이 눈에 띄게 작아지지만 선명한 텍스트 가장자리에 압축 노이즈가 생깁니다. +- 래스터화는 되돌릴 수 없습니다. 나중에 편집 가능한 텍스트가 필요할 수 있다면 원본 PDF를 보관하세요. + +## 관련 도구 + +- [PDF 압축](./compress-pdf): 래스터화된 PDF의 파일 크기 줄이기 +- [PDF 기울기 보정](./deskew-pdf): 스캔 문서를 래스터화하기 전에 페이지 바로잡기 +- [폰트 윤곽선 변환](./font-to-outline): 확대 축소 품질을 유지하려면 글꼴을 벡터 경로로 변환 +- [PDF 평탄화](./flatten-pdf): 이미지로 변환하지 않고 양식 평탄화 diff --git a/docs/ko/tools/remove-annotations.md b/docs/ko/tools/remove-annotations.md new file mode 100644 index 00000000..68c4393c --- /dev/null +++ b/docs/ko/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: 주석 제거 +description: PDF에서 모든 댓글, 강조 표시, 링크 및 기타 주석을 한 번에 제거합니다. +--- + +# 주석 제거 + +모든 주석을 제거하여 PDF를 깔끔하게 만듭니다. 댓글, 강조 표시, 스티커 메모, 텍스트 마크업, 링크, 도장 등 문서에 삽입된 모든 주석 개체가 대상입니다. 페이지의 기본 내용(텍스트, 이미지, 그래픽)은 그대로 유지됩니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 도구가 문서의 페이지 수를 확인하고 파일 정보를 표시합니다. +3. **주석 제거**를 클릭하여 처리합니다. +4. 모든 주석이 제거된 PDF가 자동으로 다운로드됩니다. + +## 기능 + +- 모든 주석 유형 제거: 댓글, 강조 표시, 밑줄, 취소선, 스티커 메모, 도장, 링크, 양식 마크업 +- 문서의 모든 페이지에 적용 +- 주석이 아닌 모든 내용(텍스트, 이미지, 벡터 그래픽, 양식 필드) 유지 +- 처리 전에 페이지 수와 파일 크기 표시 + +## 활용 사례 + +- 여러 검토자가 댓글을 남긴 검토 과정 후 최종 배포 전에 문서 정리 +- 공유한 학습 자료에서 강조 표시와 스티커 메모 제거 +- 보관 전에 문서에서 링크 주석 제거 +- 협상 중 주석이 많이 달린 법률 문서의 "깨끗한" 버전 준비 +- 인쇄 전에 원고에서 검토자 댓글 제거 + +## 팁 + +- 이 도구는 PDF 구조 수준에서 주석을 제거하므로 결과물은 선택 가능한 텍스트와 원본 품질을 유지합니다. 래스터화는 사용하지 않습니다. +- 모든 주석이 아니라 특정 주석만 제거하려면 [PDF 편집기](./edit-pdf)로 개별 주석을 선택하여 삭제하세요. +- 평탄화된 PDF(주석이 페이지 내용에 병합된 경우)의 주석은 더 이상 별도 개체가 아니므로 제거할 수 없습니다. + +## 관련 도구 + +- [PDF 편집기](./edit-pdf) +- [워터마크 추가](./add-watermark) +- [PDF 서명](./sign-pdf) diff --git a/docs/ko/tools/remove-blank-pages.md b/docs/ko/tools/remove-blank-pages.md new file mode 100644 index 00000000..ab89336a --- /dev/null +++ b/docs/ko/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: 빈 페이지 제거 +description: PDF에서 빈 페이지 또는 거의 빈 페이지를 민감도를 조절하여 자동으로 감지하고 제거합니다. +--- + +# 빈 페이지 제거 + +PDF에서 빈 페이지나 거의 빈 페이지를 찾아 자동으로 제거합니다. 각 페이지를 렌더링하여 픽셀 내용을 분석해 빈 페이지인지 판단하고, 처리 전에 제거할 페이지를 확인할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. **민감도** 슬라이더로 "빈 페이지"의 기준을 얼마나 엄격하게 할지 조절합니다. +3. **빈 페이지 감지**를 클릭하여 문서를 스캔합니다. +4. 감지된 빈 페이지의 썸네일이 표시되어 검토할 수 있습니다. +5. 선택을 확인하고 빈 페이지가 제거된 PDF를 다운로드합니다. + +## 옵션 + +- **민감도**: 0%에서 100%까지의 슬라이더(기본값 80%). 값이 높을수록 엄격하여 완전히 또는 거의 흰색인 페이지만 표시합니다. 값이 낮을수록 관대하여 점 하나나 희미한 워터마크처럼 내용이 거의 없는 페이지도 잡아냅니다. + +## 기능 + +- 각 페이지의 픽셀 수준 분석으로 빈 내용 감지 +- 감지를 세밀하게 조정하는 민감도 슬라이더 +- 수동 확인을 위한 감지된 빈 페이지 썸네일 미리보기 +- 빈 페이지가 아닌 모든 페이지를 그대로 유지 +- 문서 크기와 페이지 수에 제한 없음 +- 스캔 중 진행 상황 표시 + +## 활용 사례 + +- 단면 원본의 빈 뒷면까지 스캔된 문서 정리 +- 대량 스캔한 문서 묶음에서 구분용 페이지 제거 +- 문서 관리 시스템이 삽입한 빈 페이지 제거 +- 워드 프로세서에서 내보낸 PDF 끝에 가끔 포함되는 빈 페이지 정리 +- 불필요한 빈 페이지를 제거하여 파일 크기 줄이기 + +## 팁 + +- 기본 민감도 80%로 시작하여 조절하세요. 빈 페이지처럼 보이는데 도구가 놓치면 민감도를 낮추고, 남기고 싶은 옅은 내용이 있는 페이지가 표시되면 높이세요. +- 내용을 분석하기 위해 각 페이지를 렌더링하므로 처리 시간은 페이지 수에 비례합니다. 매우 큰 문서는 잠시 기다려야 할 수 있습니다. +- 제거를 확인하기 전에 썸네일 미리보기에서 감지된 빈 페이지를 검토하세요. 희미한 머리글, 바닥글, 워터마크가 있는 페이지는 민감도 설정에 따라 표시될 수 있습니다. + +## 관련 도구 + +- [PDF 자르기](./crop-pdf) +- [PDF 편집기](./edit-pdf) +- [페이지 번호](./page-numbers) diff --git a/docs/ko/tools/remove-metadata.md b/docs/ko/tools/remove-metadata.md new file mode 100644 index 00000000..6ecdcdf6 --- /dev/null +++ b/docs/ko/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: 메타데이터 제거 +description: 작성자, 제목, 생성일, 생성 프로그램, XMP 데이터, 문서 ID를 포함한 PDF의 모든 숨겨진 메타데이터를 제거합니다. +--- + +# 메타데이터 제거 + +모든 PDF에는 누가 만들었는지, 어떤 소프트웨어를 사용했는지, 마지막으로 언제 수정했는지 등을 알려줄 수 있는 메타데이터가 들어 있습니다. 이 도구는 정보 사전, XMP 메타데이터 스트림, 문서 ID, 애플리케이션 고유 데이터를 모두 제거하여 출처의 흔적이 없는 깨끗한 문서를 만듭니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. **메타데이터 제거**를 클릭합니다. +3. 정리된 파일을 다운로드합니다. + +설정할 옵션이 없습니다. 이 도구는 모든 것을 지우도록 철저하게 설계되었습니다. + +## 제거되는 항목 + +- **정보 사전 필드**: 제목, 작성자, 주제, 키워드, 생성 프로그램(Creator), 변환 프로그램(Producer), 생성일, 수정일 +- **XMP 메타데이터 스트림**: 문서 카탈로그에 저장된 XML 기반 메타데이터 블록 +- **문서 ID**: 시스템 간에 문서를 추적하는 데 사용될 수 있는 PDF 트레일러의 고유 식별자 +- **PieceInfo**: Illustrator나 InDesign 같은 프로그램이 추가한 애플리케이션 고유 메타데이터 + +## 유지되는 항목 + +- 눈에 보이는 모든 페이지 내용(텍스트, 이미지, 그래픽) +- 양식 필드와 주석 +- 북마크와 링크 +- 문서 구조 자체 + +## 활용 사례 + +- 익명으로 게시하기 전에 문서에서 이름과 소속 제거 +- 문서를 준비한 시점이 드러나는 생성 타임스탬프 제거 +- 사용 중인 PDF 소프트웨어를 알려주는 Producer 문자열 정리 +- 메타데이터 없는 PDF를 요구하는 규제 제출용 문서 준비 +- 외부 공유 전에 편집 이력 흔적 제거 + +## 팁 + +- 제거하기 전에 메타데이터 보기 도구로 PDF에 어떤 메타데이터가 있는지 먼저 확인하세요. +- 메타데이터와 함께 JavaScript, 주석, 첨부 파일까지 제거해야 한다면 PDF 정리를 사용하여 더 철저히 정리하세요. +- 메타데이터 제거는 되돌릴 수 없습니다. 나중에 그 데이터가 필요할 수 있다면 원본을 보관하세요. + +## 관련 도구 + +- [PDF 정리](./sanitize-pdf): 메타데이터와 함께 스크립트, 첨부 파일 등 제거 +- [PDF 보호](./protect-pdf): 정리된 PDF를 비밀번호로 보호 +- [PDF 압축](./compress-pdf): 메타데이터를 제거하면 파일 크기가 약간 줄 수 있으며, 압축하면 더 많이 줄일 수 있습니다 diff --git a/docs/ko/tools/remove-restrictions.md b/docs/ko/tools/remove-restrictions.md new file mode 100644 index 00000000..25a283f0 --- /dev/null +++ b/docs/ko/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: 제한 해제 +description: PDF 파일의 비밀번호 보호, 인쇄 제한, 편집 잠금, 복사 제한을 제거합니다. +--- + +# 제한 해제 + +PDF에는 두 가지 비밀번호가 있을 수 있습니다. 사용자 비밀번호(파일을 열 때 필요)와 소유자 비밀번호(파일로 할 수 있는 작업을 제어)입니다. 이 도구는 둘 다 제거하고 인쇄, 편집, 복사, 주석 잠금 같은 관련 제한도 모두 해제합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. PDF에 소유자 비밀번호가 있으면 **소유자 비밀번호** 필드에 입력합니다. 비밀번호 없이 사용 제한만 있는 경우에는 비워 둡니다. +3. **제한 해제**를 클릭합니다. +4. 제한이 없는 PDF를 다운로드합니다. + +이 도구는 QPDF의 `--decrypt` 및 `--remove-restrictions` 플래그를 사용하여 제한 없는 깨끗한 사본을 만듭니다. + +## 제거되는 항목 + +- 비밀번호 보호(사용자 및 소유자 비밀번호 모두) +- 인쇄 제한 +- 편집 제한 +- 텍스트 및 이미지 복사 제한 +- 주석 및 댓글 제한 +- PDF에 인코딩된 그 밖의 모든 보안 제한 + +## 활용 사례 + +- 직접 소유한 PDF인데 몇 년 전에 설정한 비밀번호가 기억나지 않을 때 잠금 해제 +- 정당하게 접근할 수 있는 문서의 인쇄 제한 제거 +- 노트 작성을 위해 참고 자료에서 복사 및 붙여넣기 활성화 +- 제한된 문서를 처리하지 못하는 접근성 도구용 PDF 준비 + +## 팁 + +- 소유자 비밀번호가 설정되어 있다면 그 비밀번호를 알아야 합니다. 이 도구는 비밀번호를 해독하거나 무차별 대입하지 않습니다. +- 파일을 암호화한 상태로 유지하면서 특정 권한만 바꾸려면 권한 변경 도구를 대신 사용하세요. +- 출력 파일에는 암호화가 전혀 없습니다. 파일을 받는 사람은 누구나 자유롭게 열 수 있습니다. + +## 관련 도구 + +- [PDF 잠금 해제](./unlock-pdf): 사용자 비밀번호를 알 때 PDF 잠금 해제 +- [PDF 보호](./protect-pdf): 새 설정으로 암호화 다시 적용 +- [권한 변경](./change-permissions): 허용되는 작업을 선택적으로 수정 diff --git a/docs/ko/tools/repair-pdf.md b/docs/ko/tools/repair-pdf.md new file mode 100644 index 00000000..47103a04 --- /dev/null +++ b/docs/ko/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: PDF 복구 +description: QPDF의 복구 엔진으로 손상되거나 깨진 PDF 파일의 데이터를 복구합니다. 일괄 처리를 지원합니다. +--- + +# PDF 복구 + +PDF가 열리지 않거나 내용이 깨져 보이거나 뷰어에서 오류가 발생할 때, 이 도구가 내부 구조를 다시 구성하려고 시도합니다. QPDF의 복구 엔진을 사용하며, 손상된 상호 참조 테이블, 잘린 스트림, 잘못된 개체 참조 등 다양한 유형의 손상에서 데이터를 복구할 수 있습니다. + +## 사용 방법 + +1. 손상된 PDF 파일을 하나 이상 업로드합니다. +2. **PDF 복구**를 클릭합니다. +3. 파일이 하나면 복구된 파일이 바로 다운로드됩니다. 여러 파일은 ZIP 압축 파일로 생성됩니다. + +이 도구는 각 파일을 `--decrypt` 플래그와 함께 QPDF에 통과시켜 PDF 전체 구조를 강제로 읽고 다시 쓰며, 그 과정에서 복구 가능한 문제를 수정합니다. + +## 기능 + +- 한 번의 작업으로 여러 PDF 일괄 복구 +- 복구 가능한 파일과 불가능한 파일 자동 감지 +- 여러 파일 처리 시 파일별 성공/실패 보고 +- 검증된 PDF 변환 라이브러리인 QPDF(WebAssembly) 사용 + +## 복구할 수 있는 문제 + +- 손상되었거나 누락된 상호 참조 테이블 +- 불완전한 다운로드로 잘린 파일 끝부분 +- 잘못된 개체 번호와 스트림 길이 +- 버그가 있는 PDF 생성기가 만든 경미한 구조적 불일치 +- 실패한 복호화 시도로 생긴 암호화 흔적 + +## 복구할 수 없는 문제 + +- 대부분의 내용 데이터가 없는 심하게 잘린 파일 +- 알지 못하는 비밀번호로 암호화된 PDF +- 실제로는 PDF가 아닌 파일(잘못된 파일 확장자) +- PDF 내부의 이미지 손상(구조는 수정되지만 픽셀 데이터는 다시 생성되지 않음) + +## 활용 사례 + +- 이메일 다운로드 실패로 손상된 PDF 복구 +- 구형이거나 비표준 PDF 생성기가 만든 파일 열기 +- 한 뷰어에서는 되지만 다른 뷰어에서는 안 되는 PDF 수정 +- 손상된 보관 문서를 장기 보관용으로 준비 + +## 팁 + +- 복구에 실패하면 먼저 브라우저에서 파일을 열어 보세요. 브라우저에는 자체 복구 로직이 있어 다시 저장할 수 있을 만큼 내용을 표시할 수도 있습니다. +- 암호화된 PDF의 복구가 실패하면 먼저 PDF 잠금 해제를 한 뒤 복호화된 출력을 복구하세요. + +## 관련 도구 + +- [PDF 압축](./compress-pdf): 복구된 PDF의 구조를 더 정리 +- [PDF 선형화](./linearize-pdf): 복구된 파일을 웹 전송에 맞게 최적화 +- [PDF 평탄화](./flatten-pdf): 손상되었을 수 있는 양식 평탄화 diff --git a/docs/ko/tools/reverse-pages.md b/docs/ko/tools/reverse-pages.md new file mode 100644 index 00000000..2c9314d4 --- /dev/null +++ b/docs/ko/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: 페이지 역순 정렬 +description: 하나 이상의 PDF 파일의 페이지 순서를 뒤집어 마지막 페이지가 첫 페이지가 되게 합니다. +--- + +# 페이지 역순 정렬 + +PDF의 페이지 순서를 뒤집어 마지막 페이지가 첫 페이지, 끝에서 두 번째 페이지가 두 번째 페이지가 되도록 합니다. 여러 파일을 한 번에 일괄 처리할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 하나 이상 업로드합니다. +2. 처리 버튼을 클릭합니다. +3. 각 파일은 독립적으로 역순 정렬됩니다. 여러 파일을 업로드했다면 역순으로 정렬된 모든 PDF가 담긴 ZIP 압축 파일이 출력됩니다. +4. 파일이 하나면 역순 정렬된 PDF가 바로 다운로드됩니다. + +## 기능 + +- 일괄 처리: 한 번의 작업으로 여러 PDF 역순 정렬 +- PDF 하나는 단일 파일로, 여러 개는 ZIP으로 출력 +- 처리 전에 파일별 제거 버튼 제공 +- 모든 페이지 내용과 서식 유지 + +## 활용 사례 + +- 거꾸로 된 순서로 스캔된 문서 수정 +- 뒤에서 앞으로 읽도록 프레젠테이션 PDF 준비 +- 페이지를 역순으로 공급하는 특정 인쇄 작업 준비 +- 실수로 거꾸로 조립된 문서 바로잡기 + +## 팁 + +- 일괄 처리에서 각 파일은 독립적으로 역순 정렬됩니다. 파일끼리의 순서는 바뀌지 않습니다. +- 전체 역순이 아닌 더 세밀한 페이지 순서 변경에는 [복제 및 정리](./organize-pdf)를 사용하세요. + +## 관련 도구 + +- [복제 및 정리](./organize-pdf) +- [PDF 회전](./rotate-pdf) +- [PDF 멀티 도구](./pdf-multi-tool) diff --git a/docs/ko/tools/rotate-custom.md b/docs/ko/tools/rotate-custom.md new file mode 100644 index 00000000..f2a1ca18 --- /dev/null +++ b/docs/ko/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: 사용자 지정 각도 회전 +description: 페이지별 각도 입력과 일괄 회전 제어로 PDF 페이지를 원하는 각도로 회전합니다. +--- + +# 사용자 지정 각도 회전 + +90도 단위뿐 아니라 임의의 각도로 PDF 페이지를 회전합니다. 각 페이지마다 각도를 입력할 수 있고, 일괄 제어로 모든 페이지에 같은 각도를 한 번에 적용할 수도 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 모든 페이지의 썸네일이 렌더링됩니다. +2. 각 페이지에는 현재 회전 각도를 보여주는 숫자 입력 필드가 있습니다. +3. 특정 페이지를 회전하려면 원하는 각도 값(양수 또는 음수)을 입력하거나, 페이지별 왼쪽/오른쪽 버튼으로 90도씩 빠르게 조정합니다. +4. 상단의 **일괄 각도** 입력으로 모든 페이지에 동일한 회전을 설정합니다. +5. 처리 버튼을 클릭하여 회전된 PDF를 생성합니다. + +## 기능 + +- 페이지별 자유 각도 입력(임의의 정수 값) +- 모든 페이지에 같은 회전을 설정하는 일괄 각도 제어 +- 썸네일에서 회전을 실시간으로 미리보기 +- 90도 단위로 빠르게 회전하는 페이지별 버튼 +- 큰 문서에서도 성능이 좋은 지연 로딩 썸네일 + +## 활용 사례 + +- 몇 도 기울어진 스캔본 바로잡기 +- 비표준 방향 요구사항에 맞게 페이지 회전 +- 여러 내용이 섞인 문서에서 개별 페이지를 정밀하게 회전 +- 처음 일괄 회전한 후 페이지 각도 미세 조정 + +## 팁 + +- 양수 값은 시계 방향, 음수 값은 시계 반대 방향으로 회전합니다. +- 일괄 각도 필드를 적용하면 페이지별 각도가 모두 덮어쓰기됩니다. 필요하면 일괄 작업 후에 개별 조정을 하세요. +- 표준 90/180/270도 회전을 더 간단한 인터페이스로 하려면 [PDF 회전](./rotate-pdf)을 사용하세요. + +## 관련 도구 + +- [PDF 회전](./rotate-pdf) +- [PDF 멀티 도구](./pdf-multi-tool) +- [복제 및 정리](./organize-pdf) diff --git a/docs/ko/tools/rotate-pdf.md b/docs/ko/tools/rotate-pdf.md new file mode 100644 index 00000000..0d10e7df --- /dev/null +++ b/docs/ko/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: PDF 회전 +description: 시각적 썸네일 인터페이스로 PDF의 개별 페이지 또는 모든 페이지를 90도 단위로 회전합니다. +--- + +# PDF 회전 + +PDF의 페이지를 시계 방향 또는 시계 반대 방향으로 90도 회전합니다. 모든 페이지의 썸네일 미리보기가 표시되어 페이지별로 회전하거나 문서 전체에 일괄 회전을 적용할 수 있습니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. 모든 페이지의 썸네일이 격자로 렌더링됩니다. +2. 각 페이지 썸네일 아래의 왼쪽/오른쪽 회전 버튼으로 해당 페이지를 회전합니다. +3. 상단의 일괄 회전 제어로 모든 페이지를 한 번에 회전합니다. +4. 썸네일 미리보기가 실시간으로 업데이트되어 회전 결과를 보여줍니다. +5. 처리 버튼을 클릭하여 회전된 PDF를 저장합니다. + +## 기능 + +- 90도 단위의 페이지별 회전(왼쪽 또는 오른쪽) +- 모든 페이지를 동시에 회전하는 일괄 회전 +- 회전 전환 애니메이션이 있는 실시간 썸네일 미리보기 +- 큰 문서에서도 부드러운 성능을 위한 지연 로딩 썸네일 +- 원본 페이지 내용과 품질 유지 + +## 활용 사례 + +- 옆으로 누워 있거나 거꾸로 스캔된 페이지 수정 +- 가로 페이지를 세로로(또는 그 반대로) 회전 +- 일부 페이지가 잘못된 각도로 스캔된 방향이 섞인 문서 바로잡기 +- 특정 표시 방향에 맞게 문서 준비 + +## 팁 + +- 회전은 누적됩니다. 시계 방향 버튼을 두 번 클릭하면 180도 회전이 적용됩니다. +- 90도 단위가 아닌 회전(예: 약간 기울어진 스캔을 바로잡기 위한 45도)에는 [사용자 지정 각도 회전](./rotate-custom)을 사용하세요. +- 일괄 회전 제어는 선택한 페이지가 아니라 모든 페이지에 적용됩니다. 이 도구에는 선택 기능이 없으며, 선택이 필요하면 [PDF 멀티 도구](./pdf-multi-tool)를 사용하세요. + +## 관련 도구 + +- [사용자 지정 각도 회전](./rotate-custom) +- [PDF 멀티 도구](./pdf-multi-tool) +- [복제 및 정리](./organize-pdf) diff --git a/docs/ko/tools/rtf-to-pdf.md b/docs/ko/tools/rtf-to-pdf.md new file mode 100644 index 00000000..ee72e132 --- /dev/null +++ b/docs/ko/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF를 PDF로 +description: LibreOffice 기반 엔진으로 RTF(Rich Text Format) 파일을 브라우저에서 PDF로 변환합니다. +--- + +# RTF를 PDF로 + +Rich Text Format 문서를 PDF로 변환합니다. RTF는 거의 모든 워드 프로세서에서 지원하는 크로스 플랫폼 문서 형식입니다. 이 도구는 브라우저 기반 LibreOffice 엔진으로 RTF 파일을 서식 그대로 렌더링하며, 굵게, 기울임, 표, 삽입된 이미지가 모두 PDF에 반영됩니다. + +## 지원 형식 + +| 형식 | 확장자 | MIME 유형 | +| :--- | :----- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 RTF 파일을 하나 이상 끌어다 놓습니다. +2. 파일 목록을 확인합니다. 필요에 따라 파일을 추가하거나 제거합니다. +3. **PDF로 변환**을 클릭합니다. 처음 사용할 때 LibreOffice 엔진이 초기화된 후 각 파일을 처리합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `rtf-converted.zip`으로 제공됩니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. 변환 시 원본 RTF 서식이 유지됩니다. + +## 출력 + +| 입력 수 | 출력 | +| :------------ | :--------------------------------------------------------- | +| 파일 1개 | PDF 한 개 다운로드 (예: `letter.pdf`) | +| 파일 2개 이상 | 파일당 PDF 하나를 담은 ZIP 압축 파일 (`rtf-converted.zip`) | + +## 활용 사례 + +- 오래된 워드 프로세서의 RTF 문서를 최신 PDF로 변환 +- RTF 이메일 템플릿을 PDF 미리보기로 변환 +- 법률 또는 의료 소프트웨어 시스템에서 나온 RTF 출력 처리 +- 문서 관리 시스템의 RTF 파일을 보관용 PDF로 일괄 변환 + +## 팁 + +- LibreOffice 엔진은 한 번 로드된 후 캐시됩니다. 세션의 첫 변환은 몇 초 더 걸리고 이후는 더 빠릅니다. +- OLE 개체가 삽입된 RTF 파일은 모든 개체가 완벽하게 렌더링되지 않을 수 있습니다. 일반 텍스트, 이미지, 표준 서식은 안정적으로 변환됩니다. +- RTF 파일을 Microsoft Word로 만들었다면 DOC, DOCX와 함께 RTF도 지원하는 [Word를 PDF로](./word-to-pdf) 도구로 바로 변환할 수도 있습니다. + +## 관련 도구 + +- [Word를 PDF로](./word-to-pdf) +- [ODT를 PDF로](./odt-to-pdf) +- [텍스트를 PDF로](./txt-to-pdf) diff --git a/docs/ko/tools/sanitize-pdf.md b/docs/ko/tools/sanitize-pdf.md new file mode 100644 index 00000000..3c9b4309 --- /dev/null +++ b/docs/ko/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF 정리 +description: 메타데이터, JavaScript, 첨부 파일, 주석, 레이어 등 PDF의 숨겨진 위험 요소를 제거합니다. +--- + +# PDF 정리 + +PDF에는 화면에 보이는 것보다 훨씬 많은 정보가 들어 있을 수 있습니다. 숨겨진 메타데이터, 삽입된 JavaScript, 파일 첨부, 양식 데이터, 레이어 정보는 민감한 데이터를 유출하거나 보안 위험이 될 수 있습니다. 정리 기능은 이 모든 것을 제거하여 공개적으로 공유해도 안전한 깨끗한 문서를 만들어 줍니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 체크리스트에서 제거할 요소를 선택합니다. +3. **PDF 정리**를 클릭합니다. +4. 정리된 파일을 다운로드합니다. + +## 정리 옵션 + +모든 옵션은 기본적으로 활성화되어 있습니다. 유지하려는 항목은 선택을 해제하세요. + +| 옵션 | 제거되는 항목 | +| -------------------- | ------------------------------------------------------ | +| **양식 평탄화** | 상호작용 양식 필드를 정적 내용으로 변환 | +| **메타데이터 제거** | 작성자, 제목, 생성일, 소프트웨어 정보, XMP 데이터 제거 | +| **주석 제거** | 댓글, 강조 표시, 스티커 메모, 마크업 삭제 | +| **JavaScript 제거** | 열 때 실행될 수 있는 삽입된 스크립트 제거 | +| **첨부 파일 제거** | PDF에 삽입된 파일 첨부 제거 | +| **레이어(OCG) 제거** | 선택적 콘텐츠 그룹을 하나의 레이어로 평탄화 | +| **링크 제거** | 하이퍼링크와 URL 참조 제거 | +| **구조 트리 제거** | 접근성 태그에 사용되는 문서 구조 제거 | +| **MarkInfo 제거** | 표시된 콘텐츠 정보 제거 | +| **글꼴 제거** | 삽입된 글꼴 데이터 제거 (주의해서 사용) | + +## 활용 사례 + +- 내부 메타데이터(작성자 이름, 소프트웨어 버전, 편집 이력)를 제거하여 PDF를 공개 배포용으로 준비 +- 신뢰할 수 없는 출처에서 받은 PDF를 열기 전에 JavaScript 제거 +- 삽입된 댓글이나 양식 필드 이름을 보면 안 되는 고객에게 보내기 전에 PDF 정리 +- 최종본을 공유하기 전에 건축 도면의 숨겨진 레이어 제거 +- 개인정보 보호 규정의 데이터 최소화 요구사항 준수 + +## 팁 + +- PDF가 제대로 렌더링될 것이 확실하지 않다면 "글꼴 제거"는 선택하지 마세요. 글꼴을 제거하면 일부 뷰어에서 텍스트가 보이지 않을 수 있습니다. +- 메타데이터만 제거하면 된다면 전용 메타데이터 제거 도구가 더 빠르고 목적에 맞습니다. +- 정리는 되돌릴 수 없습니다. 원본 파일을 보관하세요. + +## 관련 도구 + +- [메타데이터 제거](./remove-metadata): 다른 내용은 건드리지 않고 메타데이터만 제거 +- [PDF 평탄화](./flatten-pdf): 양식과 주석만 평탄화 +- [PDF 보호](./protect-pdf): 정리 후 비밀번호 보호 추가 +- [PDF 래스터화](./rasterize-pdf): 최후의 수단으로, 이미지로 변환하여 숨겨진 모든 내용 제거 diff --git a/docs/ko/tools/scanner-effect.md b/docs/ko/tools/scanner-effect.md new file mode 100644 index 00000000..bef58a74 --- /dev/null +++ b/docs/ko/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: 스캔 효과 +description: 노이즈, 회전, 흐림, 종이 노화 효과를 조절하여 PDF를 스캔한 문서처럼 보이게 합니다. +--- + +# 스캔 효과 + +깨끗한 디지털 PDF를 평판 스캐너에서 나온 것처럼 보이게 바꿉니다. 노이즈, 미세한 회전, 흐림, 밝기 변화, 선택적인 누렇게 변색 효과를 조절하여 실제 스캔의 불완전함을 재현합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 설정 패널과 함께 첫 페이지의 실시간 미리보기가 있는 편집기가 열립니다. +3. 슬라이더와 토글로 스캔 효과 매개변수를 조절합니다. +4. 설정을 바꾸면 미리보기가 실시간으로 업데이트됩니다. +5. **적용**을 클릭하여 모든 페이지를 처리하고 결과를 다운로드합니다. + +## 옵션 + +- **색 공간(흑백 토글)**: 출력을 흑백으로 변환하여 전형적인 흑백 스캔 느낌을 냅니다. +- **테두리**: 스캐너 테두리 흔적을 흉내 내어 페이지 가장자리에 은은한 어두운 테두리를 추가합니다. +- **회전**: 종이가 어긋나게 급지된 것을 흉내 내어 미세한 회전(-5도에서 +5도)을 적용합니다. +- **회전 변동**: 회전 각도에 무작위 변화를 더해 페이지마다 조금씩 다르게 기울어지게 합니다. +- **밝기**: 전체 밝기를 높이거나 낮춥니다. +- **대비**: 토너 품질 차이를 흉내 내어 대비를 조절합니다. +- **흐림**: 저품질 스캔처럼 텍스트 가장자리가 부드러워지도록 가우시안 블러를 적용합니다. +- **노이즈**: 스캐너 센서의 입자감을 흉내 내어 무작위 픽셀 노이즈를 추가합니다. 값이 높을수록 더 거칠어집니다. +- **누런 색조**: 오래되었거나 재활용된 종이를 흉내 내어 따뜻한 노란 색조를 추가합니다. +- **해상도**: 출력 DPI를 설정합니다. 값이 낮을수록 더 픽셀이 보이는 스캔 같은 모습이 됩니다. +- **초기화**: 모든 설정을 기본값으로 되돌립니다. + +## 기능 + +- 각 매개변수를 조정할 때마다 업데이트되는 실시간 미리보기 +- 현실감 있는 변화를 위한 페이지별 무작위 회전 변동 +- 독립적으로 조절 가능한 10개의 매개변수 +- 진짜 같은 흑백 스캔 출력을 위한 흑백 모드 +- 저해상도 팩스 품질부터 고해상도 보관 품질까지 해상도 조절 + +## 활용 사례 + +- 디지털로 만든 문서를 스캔하여 인쇄한 것처럼 보이게 만들기 +- 역사 문서 재현을 위해 실제 문서의 노화 모사 +- 품질이 저하된 스캔에 대한 OCR 소프트웨어 테스트 +- 기존 스캔 보관 자료와 시각적 스타일이 일치하는 문서 제작 + +## 팁 + +- 약한 값으로 시작하세요. 노이즈 10-20, 0.5도의 미세한 회전, 최소한의 흐림만으로도 충분히 그럴듯한 스캔 느낌이 납니다. +- 흑백 모드와 약간의 누런 색조를 함께 쓰면 "복사본의 복사본" 효과가 납니다. +- 낮은 해상도 설정(100-150 DPI)이 가장 현실적인 팩스 느낌을 줍니다. + +## 관련 도구 + +- [색상 반전](./invert-colors) +- [색상 조정](./adjust-colors) +- [배경색 변경](./background-color) diff --git a/docs/ko/tools/sign-pdf.md b/docs/ko/tools/sign-pdf.md new file mode 100644 index 00000000..27d371be --- /dev/null +++ b/docs/ko/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF 서명 +description: 서명을 그리거나 입력하거나 업로드하여 통합 뷰어에서 PDF 페이지에 배치합니다. +--- + +# PDF 서명 + +모든 PDF 문서에 서명을 추가합니다. 이 도구는 서명 도구가 내장된 PDF 뷰어를 포함하고 있어 서명을 손으로 그리거나, 서명 글꼴로 이름을 입력하거나, 서명 이미지를 업로드할 수 있습니다. 어느 페이지에든 서명을 배치하고 크기를 조절한 뒤 서명된 문서를 저장합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 문서가 주석 도구가 있는 통합 PDF 뷰어에서 열립니다. +3. 뷰어의 서명 도구로 그리기, 입력, 이미지 업로드 중 하나로 서명을 만듭니다. +4. 서명을 놓을 페이지 위치를 클릭하고 크기와 위치를 조절합니다. +5. 필요하면 **PDF 평탄화**를 선택하여 서명을 문서에 영구적으로 삽입합니다. +6. **저장 및 서명된 PDF 다운로드**를 클릭하여 서명된 파일을 받습니다. + +## 옵션 + +- **PDF 평탄화**: 선택하면 서명이 페이지 내용에 영구적으로 삽입됩니다. 다른 사람이 서명을 이동하거나 삭제할 수 없습니다. 선택하지 않으면 서명은 호환되는 뷰어에서 편집할 수 있는 주석으로 남습니다. + +## 기능 + +- 세 가지 서명 생성 방법: 손으로 그리기, 텍스트 입력, 이미지 업로드 +- 정확한 배치를 위한 통합 PDF 뷰어 +- 어느 페이지에서든 서명을 드래그하여 배치하고 크기 조절 +- 서명을 영구적으로 삽입하는 선택적 평탄화 +- 한 문서에 여러 서명 지원 + +## 활용 사례 + +- 계약서, 합의서, 승인 양식에 서명하여 회신 +- 세금 문서, 보험 청구서, 정부 양식에 서명 추가 +- 여러 페이지로 된 합의서의 개별 페이지에 이니셜 넣기 +- PDF 첨부 파일로 도착한 NDA나 인사 문서에 서명 + +## 팁 + +- 서명된 PDF를 받는 사람이 서명을 제거하거나 위치를 바꾸면 안 되는 경우 평탄화를 켜세요. +- 인증서 기반 검증이 가능한 법적 효력이 있는 디지털 서명이 필요하면 BentoPDF의 별도 디지털 서명 도구를 사용할 수 있습니다. +- 배경이 투명한 PNG 서명 이미지를 업로드하면 가장 깔끔한 결과를 얻을 수 있습니다. + +## 관련 도구 + +- [PDF 편집기](./edit-pdf) +- [도장 추가](./add-stamps) +- [PDF 양식 작성](./form-filler) diff --git a/docs/ko/tools/split-pdf.md b/docs/ko/tools/split-pdf.md new file mode 100644 index 00000000..60bcf840 --- /dev/null +++ b/docs/ko/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: PDF 분할 +description: 페이지 범위, 시각적 선택, 북마크, 짝수/홀수 페이지 또는 고정 간격으로 PDF를 더 작은 파일로 분할합니다. +--- + +# PDF 분할 + +여섯 가지 분할 모드 중 하나로 PDF를 더 작은 문서로 나눕니다. 간단한 페이지 범위부터 북마크 기반 분할까지, 문서를 나누는 모든 상황을 처리합니다. + +## 사용 방법 + +1. PDF 파일 하나를 업로드합니다. +2. 드롭다운에서 분할 모드를 선택합니다. +3. 모드별 옵션(페이지 범위, 선택 등)을 설정합니다. +4. 처리 버튼을 클릭합니다. +5. 모드와 설정에 따라 결과가 PDF 하나 또는 ZIP 압축 파일로 다운로드됩니다. + +## 분할 모드 + +| 모드 | 설명 | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| **범위** | `1-3, 5, 8-10`처럼 페이지 범위를 입력합니다. 범위가 여러 개면 ZIP 안에 각각의 PDF가 만들어지고, 범위가 하나면 PDF 하나가 만들어집니다. | +| **시각적 선택** | 페이지 썸네일을 보면서 클릭하여 원하는 페이지를 선택합니다. 선택한 페이지가 새 PDF로 추출됩니다. | +| **짝수 / 홀수** | 짝수 번호 또는 홀수 번호 페이지만 추출합니다. | +| **모든 페이지** | 모든 페이지를 각각의 PDF 파일로 분할하여 ZIP으로 다운로드합니다. | +| **북마크** | 북마크 경계에서 분할합니다. 북마크 수준을 선택하여 분할 위치를 제어합니다. | +| **N페이지마다** | N페이지씩(예: 5페이지마다) 묶음으로 분할합니다. 마지막 묶음은 페이지가 더 적을 수 있습니다. | + +## 기능 + +- 거의 모든 사용 사례를 아우르는 여섯 가지 분할 모드 +- 지연 로딩 썸네일이 있는 시각적 페이지 선택기 +- 수준 필터링이 가능한 북마크 기반 분할 +- 범위 및 시각적 모드의 ZIP 출력 옵션 +- 혼합 구문(`1-3, 5, 8-10`)의 페이지 범위 처리 +- N페이지 분할로 묶음 크기가 고르지 않을 때 경고 표시 + +## 활용 사례 + +- 큰 문서에서 특정 장이나 섹션 추출 +- 양면 인쇄 작업을 위해 홀수 페이지와 짝수 페이지 분리 +- 책 PDF를 북마크 경계에서 장별 파일로 분할 +- 계약서에서 서명 페이지 같은 특정 페이지 분리 +- 편집된 보고서를 배포용으로 섹션별 파일로 분할 + +## 팁 + +- 쉼표로 구분한 여러 페이지 범위(예: `1-5, 10-15, 20-25`)는 범위마다 별도의 PDF를 만들어 ZIP으로 묶습니다. +- 북마크 분할 모드는 PDF에 실제로 북마크가 있어야 합니다. 북마크가 없으면 오류 메시지가 표시됩니다. +- 범위 및 시각적 모드의 "ZIP으로 다운로드" 체크박스를 사용하면 합친 파일 대신 페이지별 개별 PDF를 받을 수 있습니다. + +## 관련 도구 + +- [PDF 병합](./merge-pdf) +- [페이지 추출](./extract-pages) +- [페이지 삭제](./delete-pages) +- [PDF 멀티 도구](./pdf-multi-tool) diff --git a/docs/ko/tools/svg-to-pdf.md b/docs/ko/tools/svg-to-pdf.md new file mode 100644 index 00000000..4be1ec35 --- /dev/null +++ b/docs/ko/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG를 PDF로 +description: SVG 벡터 그래픽을 품질을 조절하여 브라우저에서 PDF로 변환합니다. +--- + +# SVG를 PDF로 + +Scalable Vector Graphics(SVG) 파일을 PDF로 변환합니다. 이 도구는 브라우저의 렌더링 엔진으로 각 SVG를 래스터화한 뒤 원래 해상도로 삽입합니다. 벡터 아이콘, 다이어그램, 일러스트를 휴대 가능한 문서로 만들 때 유용합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :----- | +| SVG | `.svg` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 SVG 파일을 하나 이상 끌어다 놓습니다. +2. 파일 목록을 확인하고 관리합니다. +3. **PDF 품질** 수준을 선택합니다. +4. **PDF로 변환**을 클릭합니다. 결과는 `from_svgs.pdf`로 다운로드됩니다. + +각 SVG는 텍스트로 읽혀 고유한 너비와 높이(크기가 지정되지 않으면 기본 800x600)로 캔버스에 렌더링된 후 PNG로 내보내집니다. 그 PNG가 pdf-lib로 PDF에 삽입됩니다. 투명한 영역은 흰색 배경으로 채워집니다. + +## 옵션 + +**PDF 품질**은 래스터화 후의 압축을 제어합니다. + +- **높은 품질**: 원본 렌더링에 가장 가까움 +- **중간 품질** (기본값): 좋은 균형 +- **낮은 품질**: 가장 작은 파일, 세부 정보 일부 손실 + +## 활용 사례 + +- 건축 또는 공학 다이어그램을 SVG에서 인쇄용 PDF로 변환 +- 디자인 시스템 참고용으로 아이콘 세트를 PDF로 묶기 +- 데이터 시각화(D3.js, 차트 라이브러리 내보내기)를 보고서용 PDF로 변환 +- SVG 기반 인포그래픽의 인쇄용 버전 만들기 + +## 팁 + +- 명시적인 `width`와 `height` 속성이 없는 SVG 파일은 800x600 픽셀로 렌더링됩니다. 최상의 결과를 위해 변환 전에 SVG 소스에 크기를 지정하세요. +- 외부 글꼴 참조나 링크된 이미지가 있는 복잡한 SVG는 완벽하게 렌더링되지 않을 수 있습니다. 안정적인 출력을 위해 모든 에셋을 SVG 안에 포함하세요. +- SVG가 래스터화되므로 PDF에는 벡터 경로가 아닌 비트맵 이미지가 포함됩니다. 진정한 벡터 PDF 출력에는 전용 벡터 도구가 필요합니다. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [PNG를 PDF로](./png-to-pdf) +- [BMP를 PDF로](./bmp-to-pdf) diff --git a/docs/ko/tools/table-of-contents.md b/docs/ko/tools/table-of-contents.md new file mode 100644 index 00000000..92a3a7cf --- /dev/null +++ b/docs/ko/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: 목차 생성 +description: PDF에 있는 북마크로 서식이 적용된 목차 페이지를 생성합니다. +--- + +# 목차 생성 + +이 도구는 PDF의 북마크(개요)를 읽어 서식이 적용된 목차 페이지를 만들어 문서 맨 앞에 추가합니다. PDF에 북마크는 있지만 보이는 목차 페이지가 없다면 이 도구가 자동으로 만들어 줍니다. + +## 사용 방법 + +1. 북마크가 있는 PDF를 업로드합니다. +2. 목차 제목, 글꼴 크기, 글꼴 모음을 설정합니다. +3. 필요하면 **목차 페이지용 북마크 추가**를 선택하여 목차 자체를 북마크 트리에 포함합니다. +4. **목차 생성**을 클릭하여 파일을 처리합니다. +5. 목차 페이지가 맨 앞에 삽입된 PDF가 자동으로 다운로드됩니다. + +## 옵션 + +- **목차 제목**: 생성된 페이지 상단에 표시되는 제목입니다. 기본값은 "목차"입니다. +- **글꼴 크기**: 10pt에서 72pt까지 선택합니다. 기본값은 12pt입니다. +- **글꼴 모음**: Times Roman, Helvetica, Courier 변형(보통, 굵게, 기울임, 굵은 기울임) 중에서 선택합니다. 기본값은 Helvetica입니다. +- **목차 페이지용 북마크 추가**: 선택하면 목차 페이지 자체에 대한 북마크 항목이 PDF의 개요 트리에 추가됩니다. + +## 기능 + +- PDF의 전체 북마크 계층 구조 읽기 +- 페이지 번호 참조가 있는 깔끔한 서식의 목차 페이지 생성 +- 들여쓰기로 중첩된 북마크 수준 지원 +- 12가지 내장 PDF 글꼴 중 선택 +- 목차 페이지를 가리키는 선택적 북마크 + +## 활용 사례 + +- 디지털 북마크만 있는 전자책이나 보고서에 인쇄 가능한 목차 추가 +- 여러 PDF를 합친 후 병합된 문서의 목차 만들기 +- 긴 기술 매뉴얼의 참조 페이지 생성 +- 눈에 보이는 목차가 기대되는 인쇄용 문서 준비 + +## 팁 + +- PDF에 북마크가 없다면 먼저 [북마크 편집](./bookmark) 도구로 북마크를 만든 뒤 여기로 돌아와 목차를 생성하세요. +- 큰 문서에서는 14pt나 16pt 같은 더 큰 글꼴 크기가 가독성을 높여 줍니다. + +## 관련 도구 + +- [북마크 편집](./bookmark) +- [페이지 번호](./page-numbers) +- [머리글 및 바닥글](./header-footer) diff --git a/docs/ko/tools/text-color.md b/docs/ko/tools/text-color.md new file mode 100644 index 00000000..a153270e --- /dev/null +++ b/docs/ko/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: 텍스트 색상 변경 +description: PDF의 모든 텍스트 색상을 원하는 색으로 변경합니다. +--- + +# 텍스트 색상 변경 + +PDF 전체의 텍스트 색상을 바꿉니다. 이 도구는 각 페이지의 텍스트 영역을 식별하여 선택한 색으로 다시 칠하며, 문서 레이아웃과 텍스트가 아닌 내용은 그대로 유지합니다. + +## 사용 방법 + +1. PDF 파일을 업로드합니다. +2. 색상 선택기로 새 텍스트 색상을 고릅니다. 기본값은 파란색(#0000FF)입니다. +3. **텍스트 색상 변경**을 클릭하여 처리합니다. +4. 색상이 바뀐 PDF가 자동으로 다운로드됩니다. 진행 표시기에 처리 중인 페이지가 표시됩니다. + +## 옵션 + +- **새 텍스트 색상**: 문서의 모든 텍스트를 대체할 색상을 고르는 색상 선택기입니다. + +## 기능 + +- 문서의 모든 페이지에서 텍스트 색상 변경 +- 진행 상황을 보여주는 페이지별 처리 +- 16진수 색상 코드를 완전히 지원하는 색상 선택기 +- 페이지 레이아웃과 텍스트가 아닌 요소 유지 + +## 활용 사례 + +- 더 부드럽고 현대적인 문서 느낌을 위해 검은색 텍스트를 진한 파란색으로 변경 +- 문서를 배포하기 전에 브랜드 가이드라인에 맞게 텍스트 색상 변경 +- 접근성 준수를 위해 텍스트를 특정 색으로 변환 +- 새로 적용한 배경색 위에서 텍스트가 잘 보이게 만들기 + +## 팁 + +- 이 도구는 품질을 위해 페이지를 2배 배율로 렌더링한 뒤 PDF를 다시 구성합니다. 출력은 이미지 기반이므로 텍스트를 더 이상 선택하거나 검색할 수 없습니다. +- 선택 가능한 텍스트를 유지해야 하는 문서라면 [PDF 편집기](./edit-pdf)로 PDF를 직접 편집하는 것을 고려하세요. +- 각 페이지를 개별적으로 렌더링하므로 페이지 수가 많을수록 처리 시간이 늘어납니다. + +## 관련 도구 + +- [배경색 변경](./background-color) +- [색상 반전](./invert-colors) +- [색상 조정](./adjust-colors) diff --git a/docs/ko/tools/tiff-to-pdf.md b/docs/ko/tools/tiff-to-pdf.md new file mode 100644 index 00000000..dbe6b43c --- /dev/null +++ b/docs/ko/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF를 PDF로 +description: 단일 및 다중 페이지 TIFF 이미지를 모든 페이지를 지원하며 브라우저에서 PDF로 변환합니다. +--- + +# TIFF를 PDF로 + +다중 페이지 TIFF를 포함한 TIFF 파일을 PDF로 변환합니다. TIFF 파일의 각 페이지(또는 "IFD")가 출력 PDF의 개별 페이지가 됩니다. 다중 페이지 TIFF로 흔히 저장되는 스캔 문서, 팩스, 의료 영상에 특히 유용합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## 사용 방법 + +1. 업로드 영역을 클릭하거나 TIFF 파일을 끌어다 놓습니다. +2. 파일 목록을 확인하고 필요에 따라 관리합니다. +3. **PDF로 변환**을 클릭합니다. 결과는 `from_tiff.pdf`로 다운로드됩니다. + +이 도구는 JavaScript TIFF 디코더로 각 TIFF 파일을 디코딩하여 모든 페이지의 원시 RGBA 픽셀 데이터를 추출합니다. 각 페이지는 캔버스에 렌더링되어 PNG로 내보내진 뒤 PDF에 삽입됩니다. 페이지 크기는 원본 TIFF 페이지와 같습니다. + +## 옵션 + +이 도구는 추가 품질 설정을 제공하지 않습니다. 이미지는 원래 해상도로 삽입됩니다. + +## 활용 사례 + +- 다중 페이지 팩스 문서(TIFF-F)를 더 휴대하기 좋은 PDF 형식으로 변환 +- TIFF로 저장된 스캔 문서 보관 자료를 검색 가능한 PDF로 변환(이후 OCR 도구와 함께 사용) +- TIFF를 사용하는 의료 영상 파일(병리 슬라이드, 방사선 내보내기) 처리 +- GIS 또는 위성 영상 TIFF 파일을 공유 가능한 문서로 변환 + +## 팁 + +- 다중 페이지 TIFF를 완전히 지원합니다. 10페이지 TIFF는 10페이지 PDF가 됩니다. TIFF를 먼저 분할할 필요가 없습니다. +- 매우 큰 TIFF 파일(수백 메가바이트)은 전체 파일을 브라우저 메모리에서 디코딩해야 하므로 처리 시간이 더 걸릴 수 있습니다. +- 결과 PDF에 OCR이 필요하면 변환 후 [OCR PDF](./ocr-pdf) 도구로 처리하세요. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [BMP를 PDF로](./bmp-to-pdf) +- [JPG를 PDF로](./jpg-to-pdf) diff --git a/docs/ko/tools/txt-to-pdf.md b/docs/ko/tools/txt-to-pdf.md new file mode 100644 index 00000000..ccf9a436 --- /dev/null +++ b/docs/ko/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: 텍스트를 PDF로 +description: 일반 텍스트 파일이나 직접 입력한 텍스트를 사용자 지정 글꼴, 색상, 페이지 크기로 PDF로 변환합니다. +--- + +# 텍스트를 PDF로 + +일반 텍스트를 서식이 적용된 PDF로 변환합니다. `.txt` 파일을 업로드하거나 내장 텍스트 편집기에 직접 입력할 수 있습니다. 여러 글꼴, 사용자 지정 텍스트 색상, A0부터 A10까지의 다양한 페이지 크기와 US Letter, Legal, Tabloid를 지원합니다. + +## 지원 형식 + +| 입력 | 확장자 | +| :--------------- | :--------------------------- | +| 일반 텍스트 파일 | `.txt` | +| 직접 텍스트 입력 | 편집기에 입력하거나 붙여넣기 | + +## 사용 방법 + +1. 상단 토글로 입력 모드를 선택합니다: **파일 업로드** 또는 **텍스트 입력**. +2. 업로드하는 경우 `.txt` 파일을 하나 이상 끌어다 놓거나 클릭하여 선택합니다. 입력하는 경우 텍스트 영역에 직접 입력합니다. +3. 서식 옵션(글꼴 모음, 글꼴 크기, 텍스트 색상, 페이지 크기)을 설정합니다. +4. **PDF 만들기**를 클릭합니다. 출력은 `text_to_pdf.pdf`로 다운로드됩니다. + +여러 파일을 업로드하면 내용이 사이에 빈 줄을 두고 이어 붙여집니다. + +## 옵션 + +| 옵션 | 값 | 기본값 | +| :-------------- | :-------------------------------------------------------------------- | :------------- | +| **글꼴 모음** | Helvetica (산세리프), Tiro (세리프), Courier (고정폭), Times (세리프) | Helvetica | +| **글꼴 크기** | 6 - 72 pt | 12 | +| **텍스트 색상** | 색상 선택기로 선택한 모든 색 | 검정 (#000000) | +| **페이지 크기** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +RTL 언어(아랍어, 히브리어, 페르시아어, 우르두어)는 자동으로 감지됩니다. RTL 텍스트가 발견되면 텍스트 방향과 정렬이 그에 맞게 전환됩니다. + +## 활용 사례 + +- 코드 조각이나 로그 파일을 Courier 글꼴의 인쇄 가능한 PDF로 변환 +- 즉석에서 입력한 회의 메모로 빠르게 PDF 만들기 +- 제출용으로 일반 텍스트 원고를 특정 글꼴과 페이지 크기로 서식 지정 +- 오프라인 배포를 위해 README나 변경 로그의 PDF 버전 만들기 + +## 팁 + +- 클립보드 내용을 파일로 저장하지 않고 빠르게 변환하려면 **텍스트 입력** 모드를 사용하세요. +- 코드, 로그 또는 열 정렬이 중요한 내용에는 Courier(고정폭)가 가장 좋은 글꼴입니다. +- 페이지 여백은 모든 면에서 72포인트(1인치)로 고정되어 있습니다. + +## 관련 도구 + +- [Markdown을 PDF로](./markdown-to-pdf) +- [CSV를 PDF로](./csv-to-pdf) +- [Word를 PDF로](./word-to-pdf) diff --git a/docs/ko/tools/unlock-pdf.md b/docs/ko/tools/unlock-pdf.md new file mode 100644 index 00000000..f57363f6 --- /dev/null +++ b/docs/ko/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF 잠금 해제 +description: 암호화된 PDF에서 비밀번호 보호를 제거합니다. 하나의 비밀번호로 여러 파일을 일괄 복호화할 수 있습니다. +--- + +# PDF 잠금 해제 + +암호화된 PDF의 비밀번호를 알고 있다면, 이 도구로 암호화를 완전히 제거해 누구나 비밀번호 없이 열 수 있는 잠금 해제 사본을 만들 수 있습니다. 여러 PDF가 같은 비밀번호를 사용하는 경우 일괄 복호화도 지원합니다. + +## 작동 방식 + +1. 암호화된 PDF 파일을 하나 이상 업로드합니다. +2. 파일 보호에 사용된 **비밀번호**를 입력합니다. +3. **PDF 복호화**를 클릭합니다. +4. 파일이 하나면 바로 다운로드됩니다. 여러 파일이면 잠금이 해제된 모든 PDF가 담긴 ZIP 압축 파일이 만들어집니다. + +## 기능 + +- 단일 파일 및 일괄 복호화 +- 사용자 비밀번호와 소유자 비밀번호 모두 처리 +- 남아 있는 제한 없이 완전히 암호화되지 않은 결과물 생성 +- 잘못된 비밀번호나 손상된 파일에 대한 명확한 오류 보고 +- 일괄 모드에서 파일별 성공/실패 추적 + +## 제한 해제와의 차이 + +**PDF 복호화**는 비밀번호가 필요하며 모든 암호화를 제거합니다. **제한 해제**는 사용 제한(인쇄, 복사, 편집)을 대상으로 하며, 소유자 비밀번호만 설정된 경우에는 비밀번호가 필요하지 않을 수 있습니다. 비밀번호 없이는 PDF가 아예 열리지 않을 때 복호화를 사용하세요. + +## 사용 사례 + +- 이전에 직접 암호화했지만 더 이상 비밀번호가 필요 없는 PDF의 잠금을 영구적으로 해제 +- 보관 중인 문서를 장기적으로 쉽게 열람할 수 있도록 일괄 암호화 해제 +- 암호화된 파일을 지원하지 않는 문서 관리 시스템에 사용할 비밀번호 보호 PDF 준비 +- 다른 문서와 병합하기 전에 PDF 잠금 해제 (많은 병합 도구가 암호화된 입력을 처리하지 못합니다) + +## 팁 + +- 비밀번호 입력란은 업로드한 모든 파일에 적용됩니다. PDF마다 비밀번호가 다르면 별도의 묶음으로 처리하세요. +- "잘못된 비밀번호" 오류가 나면 끝에 공백이 있거나 Caps Lock이 켜져 있지 않은지 확인하세요. +- 복호화 후의 결과물에는 보안이 전혀 없습니다. 새 비밀번호를 적용하려면 PDF 암호화로 다시 암호화하세요. + +## 관련 도구 + +- [PDF 보호](./protect-pdf): 새 비밀번호로 암호화를 다시 적용 +- [제한 해제](./remove-restrictions): 완전한 복호화 없이 사용 제한 제거 +- [권한 변경](./change-permissions): 암호화된 PDF의 특정 권한 수정 diff --git a/docs/ko/tools/validate-signature-pdf.md b/docs/ko/tools/validate-signature-pdf.md new file mode 100644 index 00000000..792706d8 --- /dev/null +++ b/docs/ko/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: 서명 검증 +description: PDF 파일의 디지털 서명을 검증합니다. 인증서 유효성, 서명자 신원, 문서 무결성, 신뢰 체인 상태를 확인합니다. +--- + +# 서명 검증 + +서명된 PDF를 업로드하면 이 도구가 모든 디지털 서명을 추출하고, 서명자를 식별하고, 인증서 유효성을 확인하며, 서명 이후 문서가 수정되었는지 알려 줍니다. 신뢰할 수 있는 인증서를 제공해 서명 체인을 검증할 수도 있습니다. + +## 작동 방식 + +1. 서명된 PDF 파일을 업로드합니다. 검증이 자동으로 시작됩니다. +2. 도구가 요약을 표시합니다. 발견된 서명 수와 그중 유효한 서명 수가 나옵니다. +3. 각 서명마다 서명자 이름, 발급자, 날짜, 상태를 보여 주는 상세 카드가 표시됩니다. +4. 선택적으로 **신뢰할 수 있는 인증서**(.pem, .crt, .cer, .der)를 업로드하면 특정 신뢰 앵커를 기준으로 서명을 검증할 수 있습니다. 재검증은 자동으로 실행됩니다. + +## 확인 항목 + +### 서명 파싱 + +도구는 PDF에서 PKCS#7 서명 객체를 추출하고 ASN.1 구조를 디코딩하여, 서명자의 X.509 인증서와 서명에 포함된 인증서 체인을 가져옵니다. + +### 인증서 유효성 + +- **만료**: 인증서가 현재 유효 기간 내에 있습니까? +- **자체 서명 감지**: 인증서가 스스로를 발급했습니까? +- **신뢰 체인**: 신뢰할 수 있는 인증서가 제공된 경우, 서명자의 인증서가 그 인증서까지 이어집니까? + +### 암호화 검증 + +- 도구는 서명의 `/ByteRange`가 포함하는 바이트를 재구성하고, 서명자가 선언한 알고리즘으로 해시한 뒤, 그 결과를 서명 내부의 `messageDigest` 속성과 비교합니다. +- 그런 다음 서명된 속성을 DER SET으로 다시 직렬화하고, 서명자 인증서의 공개 키로 서명을 검증합니다. +- **이 모든 검사를 통과한 경우에만 서명이 유효한 것으로 보고됩니다.** 서명 후 PDF 바이트가 수정되었거나 내장된 서명이 서명자의 키와 일치하지 않으면, 상태에 구체적인 사유와 함께 "유효하지 않음: 암호화 검증 실패"가 표시됩니다. + +#### 지원하는 서명 알고리즘 + +| 알고리즘 | 검증 경로 | +| ----------------------- | ------------------------------------------------------------------------ | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, Web Crypto 폴백 포함 | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | DER → IEEE P1363 서명 변환 후 Web Crypto `verify({name: 'ECDSA', hash})` | + +서명이 이 목록에 없는 알고리즘(예: Ed25519, SM2 또는 특이한 다이제스트 OID를 쓰는 RSA)을 사용하면, 카드에 구체적인 OID나 사유와 함께 노란색으로 "미검증: 지원되지 않는 서명 알고리즘"이 표시됩니다. 이는 의도적인 3단계 구분입니다. + +- **유효**: 서명자의 공개 키로 서명이 암호학적으로 검증되었습니다. +- **유효하지 않음**: 검증이 실행되었고 부정적인 결과가 나왔습니다(바이트 변경, 키 불일치). +- **미검증**: 이 알고리즘에 대해서는 도구가 검증을 실행할 수 없었습니다. 인증서 메타데이터는 계속 표시되지만, 서명을 "알 수 없음"으로 간주하고 Adobe Acrobat이나 `openssl cms -verify`로 검증해야 합니다. + +### 안전하지 않은 다이제스트 알고리즘 + +- **MD5 또는 SHA-1**을 사용하는 서명은 유효하지 않은 것으로 거부되며 "안전하지 않은 다이제스트" 상태로 표시됩니다. 두 알고리즘 모두 충돌 공격이 공개되어 있으므로, SHA-1이나 MD5 해시에 대한 서명은 무결성을 보장하지 않습니다. +- SHA-224, SHA-256, SHA-384, SHA-512는 모두 허용됩니다. + +### 문서 적용 범위 + +- **전체 적용**: 서명이 PDF 파일 전체를 포함하므로, 서명 후 추가되거나 변경된 바이트가 없습니다. +- **부분 적용**: 서명이 파일의 일부만 포함합니다. 서명 후 수정이 이루어졌음을 나타낼 수 있습니다(반드시 악의적인 것은 아니며, 증분 저장도 부분 적용을 만듭니다). + +## 서명 상세 정보 + +각 서명 카드에는 다음이 표시됩니다. + +- **서명자**: 서명자 인증서의 공통 이름, 조직, 이메일 +- **발급자**: 서명자 인증서를 발급한 인증 기관 +- **서명 일시**: 서명에 포함된 타임스탬프 +- **유효 시작 / 유효 종료**: 인증서의 유효 기간 +- **사유**: 문서에 서명한 이유 (제공된 경우) +- **위치**: 서명한 장소 (제공된 경우) +- **적용 범위 상태**: 전체 또는 부분 +- **신뢰 배지**: 신뢰함 또는 신뢰 체인에 없음 (사용자 지정 인증서가 제공된 경우에만) + +### 기술 세부 정보 + +기술 세부 정보 섹션을 펼치면 다음을 볼 수 있습니다. + +- 서명자 인증서의 일련 번호 +- 다이제스트 알고리즘 (SHA-256, SHA-512 등) +- 서명 알고리즘 (SHA-256을 사용하는 RSA, SHA-256을 사용하는 ECDSA 등) +- 유효하지 않은 서명의 오류 메시지 + +## 사용 사례 + +- 추가 서명하기 전에 디지털 서명된 계약서 검증 +- 서명된 문서가 변조되지 않았는지 감사 +- 문서 서명 이후 인증서가 만료되었는지 확인 +- 조직의 루트 인증서를 기준으로 서명 검증 +- 정부 또는 법률 문서의 서명 세부 정보 조회 + +## 팁 + +- 자체 서명 인증서라고 해서 서명이 유효하지 않은 것은 아닙니다. 신뢰할 수 있는 제3자를 통해 서명자의 신원을 확인할 수 없다는 뜻이며, 내부 문서에서는 흔한 일입니다. +- 부분 적용이 항상 변조를 의미하는 것은 아닙니다. 많은 PDF 워크플로가 증분 업데이트(예: 두 번째 서명)를 추가해 부분 적용이 생깁니다. +- 조직의 루트 또는 중간 인증서를 신뢰할 수 있는 인증서로 업로드하면 신뢰 체인 검증을 받을 수 있습니다. + +## 관련 도구 + +- [디지털 서명](./digital-sign-pdf): 자신의 인증서로 PDF에 서명 +- [PDF 평면화](./flatten-pdf): 서명 후 수정을 막기 위해 서명 전에 PDF를 평면화 +- [메타데이터 제거](./remove-metadata): 서명을 적용하기 전에 PDF 정리 diff --git a/docs/ko/tools/view-metadata.md b/docs/ko/tools/view-metadata.md new file mode 100644 index 00000000..409adf73 --- /dev/null +++ b/docs/ko/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: 메타데이터 보기 +description: 문서 정보, XMP 데이터, 구조 세부 정보를 포함한 PDF의 모든 메타데이터 속성을 조회합니다. +--- + +# 메타데이터 보기 + +PDF 파일에 숨겨진 속성을 살펴보세요. 이 도구는 문서 정보(제목, 작성자, 날짜), XMP 메타데이터, 페이지 크기 및 기타 구조 데이터를 읽기 쉬운 형태로 보여 줍니다. + +## 작동 방식 + +1. PDF 파일을 업로드합니다. +2. 도구가 즉시 파일을 분석해 사용 가능한 모든 메타데이터를 구분된 섹션으로 표시합니다. +3. 문서 정보 사전, XMP 메타데이터 트리, 구조 속성을 검토합니다. +4. 별도의 처리 단계는 없습니다. 파일이 로드되자마자 메타데이터가 표시됩니다. + +## 기능 + +- 표준 문서 정보 필드 표시: 제목, 작성자, 주제, 키워드, 작성 프로그램, 생성 프로그램 +- 생성 및 수정 날짜를 사람이 읽기 쉬운 형식으로 표시 +- 중첩된 네임스페이스를 포함한 전체 XMP 메타데이터 트리를 분석하고 렌더링 +- PDF 날짜 형식(`D:20240101120000Z`)을 읽기 쉬운 날짜로 변환 +- 쉽게 탐색할 수 있도록 접을 수 있는 섹션으로 구성 + +## 메타데이터 섹션 + +| 섹션 | 내용 | +| ------------------ | ---------------------------------------------------------------------------------------- | +| **문서 정보** | 제목, 작성자, 주제, 키워드, 작성 프로그램, 생성 프로그램, 생성 날짜, 수정 날짜 | +| **XMP 메타데이터** | Dublin Core, XAP, PDF 및 사용자 지정 네임스페이스를 포함한 전체 XML 기반 메타데이터 트리 | +| **문서 속성** | 페이지 수, PDF 버전, 파일 크기, 암호화 상태 | + +## 사용 사례 + +- PDF의 작성자와 마지막 수정 시점 확인 +- 문서를 게시하기 전에 메타데이터가 올바르게 설정되었는지 확인 +- 어떤 개인 정보가 포함되어 있는지 확인해 PDF의 개인정보 보호 감사 +- 생성 프로그램 필드를 통해 PDF를 만들거나 수정한 소프트웨어 조사 +- 디지털 자산 관리 규정 준수를 위한 XMP 메타데이터 검토 + +## 팁 + +- `D:`로 시작하는 PDF 날짜 문자열은 자동으로 현지 시간대 형식으로 변환됩니다. +- 메타데이터 필드가 비어 있다면 PDF 작성자가 설정하지 않은 것뿐입니다. 모든 PDF에 풍부한 메타데이터가 있는 것은 아닙니다. +- 확인한 메타데이터를 수정하려면 [메타데이터 편집](./edit-metadata)을 사용하세요. 모두 제거하려면 메타데이터 제거를 사용하세요. + +## 관련 도구 + +- [메타데이터 편집](./edit-metadata) +- [PDF OCG 레이어](./pdf-layers) +- [PDF 비교](./compare-pdfs) diff --git a/docs/ko/tools/vsd-to-pdf.md b/docs/ko/tools/vsd-to-pdf.md new file mode 100644 index 00000000..f757542e --- /dev/null +++ b/docs/ko/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD를 PDF로 +description: Microsoft Visio(VSD/VSDX) 다이어그램을 브라우저에서 PDF로 변환합니다. 무료, 비공개, Visio 불필요. +--- + +# VSD를 PDF로 + +Visio를 설치하지 않고 Microsoft Visio 다이어그램을 PDF로 변환합니다. VSD와 VSDX 파일에는 대부분의 사람이 열 수 없는 순서도, 조직도, 네트워크 다이어그램, 평면도가 들어 있습니다. 이 도구는 이를 어떤 기기에서나 볼 수 있는 깔끔한 PDF로 렌더링합니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :------------- | :------ | :------------------------------------------ | +| Visio 바이너리 | `.vsd` | 레거시 Visio 형식 (Visio 2003 및 이전 버전) | +| Visio XML | `.vsdx` | 최신 Visio 형식 (Visio 2013 이상) | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 VSD 또는 VSDX 파일을 끌어다 놓습니다. 두 형식을 한 번에 섞어서 올릴 수 있습니다. +2. 파일 목록을 확인합니다. 휴지통 아이콘으로 원하지 않는 항목을 제거하거나, **파일 더 추가**로 다이어그램을 더 추가합니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 기반 엔진이 브라우저에 로드되어 각 다이어그램을 도형, 연결선, 레이블, 페이지 레이아웃을 유지한 채 PDF로 렌더링합니다. +4. 다이어그램이 하나면 PDF로 바로 다운로드됩니다. 여러 파일이면 `vsd-to-pdf.zip`이라는 ZIP 압축 파일이 만들어집니다. + +## 옵션 + +별도의 설정은 필요하지 않습니다. 변환기는 Visio 문서의 원래 페이지 크기와 방향을 따릅니다. + +## 사용 사례 + +- Visio 라이선스가 없을 때 동료가 보낸 Visio 다이어그램 검토 +- 프로젝트 문서에 네트워크 또는 아키텍처 다이어그램을 PDF로 포함 +- 회의 자료용으로 조직도나 프로세스 흐름도 인쇄 +- 이전 Visio 버전의 레거시 VSD 파일을 장기 보존 가능한 형식으로 보관 + +## 팁 + +- 여러 페이지로 된 Visio 문서는 여러 페이지의 PDF가 되며, 각 Visio 페이지가 PDF 페이지에 대응됩니다. +- VSDX 파일(최신 XML 기반 형식)은 일반적으로 이전 VSD 바이너리 파일보다 충실도가 높게 변환됩니다. +- LibreOffice 엔진은 세션당 한 번 로드됩니다. 첫 변환에는 잠시 기다려야 하지만 이후 파일은 더 빠르게 처리됩니다. + +## 관련 도구 + +- [ODG를 PDF로](./odg-to-pdf) +- [PUB를 PDF로](./pub-to-pdf) +- [PSD를 PDF로](./psd-to-pdf) diff --git a/docs/ko/tools/webp-to-pdf.md b/docs/ko/tools/webp-to-pdf.md new file mode 100644 index 00000000..f4273640 --- /dev/null +++ b/docs/ko/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP를 PDF로 +description: WebP 이미지를 브라우저에서 바로 PDF로 변환하며 압축 품질을 조절할 수 있습니다. +--- + +# WebP를 PDF로 + +Google의 WebP 이미지 형식을 PDF로 변환합니다. 웹에서 내려받은 이미지가 WebP 형식이라 인쇄나 공유를 위해 더 널리 쓰이는 형식이 필요할 때 특히 유용합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :--- | :------ | +| WebP | `.webp` | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 WebP 파일을 끌어다 놓습니다. +2. 파일 목록을 확인하고 필요 없는 파일을 제거합니다. +3. **PDF 품질** 수준을 선택합니다. +4. **PDF로 변환**을 클릭합니다. 결과물은 `from_webps.pdf`로 다운로드됩니다. + +내부적으로 각 WebP 이미지는 브라우저의 canvas API로 디코딩된 다음 pdf-lib를 사용해 PDF에 삽입됩니다. 따라서 WebP 디코딩을 지원하는 모든 브라우저(최신 브라우저는 모두 해당)에서 변환이 작동합니다. + +## 옵션 + +**PDF 품질**은 이미지를 삽입할 때의 압축을 조절합니다. + +- **높은 품질**: 가장 많은 디테일을 유지합니다. +- **중간 품질**(기본값): 균형 잡힌 결과물. +- **낮은 품질**: 가장 작은 파일 크기. + +## 사용 사례 + +- 웹에서 내려받아 WebP로 저장된 이미지를 인쇄 가능한 PDF로 변환 +- Chrome이나 Edge의 WebP 스크린샷을 문서로 묶기 +- 기본값이 WebP인 디자인 도구에서 내보낸 이미지로 PDF 포트폴리오 만들기 +- WebP 이미지를 더 널리 읽을 수 있는 형식으로 보관 + +## 팁 + +- WebP는 PDF에 삽입되기 전에 내부적으로 PNG로 디코딩되므로, 무손실 WebP 이미지는 높은 품질 설정에서 품질이 유지됩니다. +- WebP와 다른 이미지 형식이 섞여 있다면 대신 [이미지를 PDF로](./image-to-pdf) 도구를 사용하세요. 모든 형식을 한 번에 받습니다. + +## 관련 도구 + +- [이미지를 PDF로](./image-to-pdf) +- [PNG를 PDF로](./png-to-pdf) +- [JPG를 PDF로](./jpg-to-pdf) diff --git a/docs/ko/tools/word-to-pdf.md b/docs/ko/tools/word-to-pdf.md new file mode 100644 index 00000000..e65527fa --- /dev/null +++ b/docs/ko/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word를 PDF로 +description: Word 문서(DOC, DOCX), ODT, RTF 파일을 서식을 그대로 유지한 채 브라우저에서 PDF로 변환합니다. +--- + +# Word를 PDF로 + +Microsoft Word 문서와 호환 형식을 PDF로 변환합니다. 이 도구는 브라우저 기반 LibreOffice 엔진을 사용해 DOC, DOCX, ODT, RTF 파일을 처리하며, 서식, 표, 이미지, 머리글, 바닥글, 스타일을 결과물에 그대로 유지합니다. + +## 지원 형식 + +| 형식 | 확장자 | +| :------------------ | :------ | +| Word (최신) | `.docx` | +| Word (레거시) | `.doc` | +| OpenDocument 텍스트 | `.odt` | +| 서식 있는 텍스트 | `.rtf` | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 Word 문서를 끌어다 놓습니다. 여러 파일을 한 번에 선택할 수 있습니다. +2. 파일 목록을 확인하고 관리합니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 엔진은 처음 사용할 때 로드되며(진행 표시기에 초기화 상태가 나타남), 이후 각 파일이 변환됩니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `word-converted.zip`으로 묶입니다. + +## 옵션 + +이 도구에는 추가 설정이 없습니다. LibreOffice 엔진이 기본 PDF 내보내기 프로필로 결과물을 만듭니다. + +## 출력 + +| 입력 개수 | 출력 | +| :------------ | :---------------------------------------------------------- | +| 파일 1개 | PDF 한 개 다운로드 (원래 파일명에 `.pdf` 확장자) | +| 파일 2개 이상 | ZIP 압축 파일(`word-converted.zip`), 파일마다 PDF 하나 포함 | + +## 사용 사례 + +- 입사 지원서를 제출하기 전에 이력서나 자기소개서를 DOCX에서 PDF로 변환 +- 고객에게 전달할 계약서나 제안서 묶음을 PDF로 일괄 변환 +- 장기 보관을 위해 레거시 `.doc` 파일을 최신 PDF로 변환 +- Google Docs에서 DOCX로 내보낸 공동 작업 문서를 PDF로 변환 +- 자동 문서 생성에 쓰는 Word 템플릿에서 인쇄용 PDF 생성 + +## 팁 + +- LibreOffice 엔진은 세션당 한 번 다운로드되어 캐시됩니다. 첫 변환에는 로딩에 몇 초가 걸리지만 이후 변환은 훨씬 빠릅니다. +- 복잡한 서식(매크로, ActiveX 컨트롤, 고급 SmartArt)은 완벽하게 변환되지 않을 수 있습니다. 텍스트, 표, 이미지, 머리글, 각주 같은 표준 문서 요소는 안정적으로 변환됩니다. +- 이 도구는 ODT와 RTF도 받으므로 모든 워드 프로세서 형식을 위한 통합 변환기로 사용할 수 있습니다. + +## 관련 도구 + +- [ODT를 PDF로](./odt-to-pdf) +- [RTF를 PDF로](./rtf-to-pdf) +- [Excel을 PDF로](./excel-to-pdf) +- [PowerPoint를 PDF로](./powerpoint-to-pdf) diff --git a/docs/ko/tools/wpd-to-pdf.md b/docs/ko/tools/wpd-to-pdf.md new file mode 100644 index 00000000..27f4367b --- /dev/null +++ b/docs/ko/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD를 PDF로 +description: WordPerfect(WPD) 문서를 LibreOffice를 사용해 브라우저에서 PDF로 변환합니다. 무료이며 비공개입니다. +--- + +# WPD를 PDF로 + +Corel WordPerfect 문서를 PDF 파일로 변환합니다. WPD는 한때 법률 사무소와 정부 기관에서 지배적인 워드 프로세서 형식이었습니다. 최신 소프트웨어가 열어 주지 않는 오래된 WordPerfect 파일이 있다면, 이 도구로 표준 PDF로 되살릴 수 있습니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :---------- | :----- | :------------------------- | +| WordPerfect | `.wpd` | 모든 주요 WordPerfect 버전 | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 WPD 파일을 끌어다 놓습니다. 여러 파일을 한 번에 선택할 수 있습니다. +2. 파일 목록을 확인합니다. 휴지통 아이콘으로 원하지 않는 파일을 제거하거나, **파일 더 추가**로 문서를 더 추가합니다. +3. **PDF로 변환**을 클릭합니다. 도구가 브라우저에 LibreOffice 기반 변환 엔진을 로드해 WPD 형식을 분석하고 PDF로 출력합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 일괄 변환은 `wpd-to-pdf.zip`이라는 ZIP 압축 파일로 만들어집니다. + +## 옵션 + +별도의 설정은 필요하지 않습니다. LibreOffice 엔진이 WPD의 서식, 글꼴, 레이아웃을 자동으로 처리합니다. + +## 사용 사례 + +- 수십 년 전 WordPerfect로 작성한 법률 문서 열기 +- 보관된 정부 제출 서류를 WPD에서 최신 형식으로 변환 +- 장기 보관을 위해 레거시 WordPerfect 문서 라이브러리를 PDF로 이전 +- Corel WordPerfect가 설치되지 않은 수신자와 WPD 파일 공유 + +## 팁 + +- LibreOffice 엔진은 처음 사용할 때 로드되므로 잠시 걸립니다. 같은 세션의 이후 변환은 더 빠릅니다. +- 복잡한 WPD 매크로와 코드 표시는 유지되지 않지만, 시각적 레이아웃, 텍스트 내용, 기본 서식은 PDF로 그대로 옮겨집니다. + +## 관련 도구 + +- [WPS를 PDF로](./wps-to-pdf) +- [ODG를 PDF로](./odg-to-pdf) diff --git a/docs/ko/tools/wps-to-pdf.md b/docs/ko/tools/wps-to-pdf.md new file mode 100644 index 00000000..6580eecd --- /dev/null +++ b/docs/ko/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS를 PDF로 +description: Microsoft Works(WPS) 문서를 브라우저에서 PDF로 변환합니다. 무료, 회원가입 불필요, 완전한 비공개. +--- + +# WPS를 PDF로 + +Microsoft Works 워드 프로세서 파일을 PDF로 변환합니다. Microsoft Works는 1990년대 후반부터 2000년대까지 가정용 PC에 기본 포함되었고, 지금도 오래된 하드 드라이브와 이메일 보관함에 많은 WPS 파일이 남아 있습니다. 이 도구는 브라우저에서 이를 열어 깔끔한 PDF로 만들어 줍니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :-------------- | :----- | :----------------------------------- | +| Microsoft Works | `.wps` | Microsoft Works의 워드 프로세서 파일 | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 WPS 파일을 끌어다 놓습니다. 여러 파일을 받을 수 있습니다. +2. 파일 목록을 확인합니다. 휴지통 아이콘으로 개별 파일을 제거하거나, **파일 더 추가**를 클릭해 묶음을 늘립니다. +3. **PDF로 변환**을 클릭합니다. LibreOffice 기반 엔진이 브라우저에 로드되어 각 WPS 문서를 PDF로 변환합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `wps-to-pdf.zip`이라는 ZIP 압축 파일로 묶입니다. + +## 옵션 + +추가 설정은 필요하지 않습니다. 변환기는 WPS 파일의 텍스트, 기본 서식, 삽입된 이미지를 처리합니다. + +## 사용 사례 + +- Microsoft Works 형식으로 저장된 옛 학교 또는 업무 문서 복구 +- Microsoft Works가 설치되지 않은 상태에서 WPS 이메일 첨부 파일 열기 +- 최신 문서 시스템으로 이전하기 위해 WPS 파일 보관본 변환 +- 현재의 워드 프로세서가 열지 못하는 레거시 문서 인쇄 + +## 팁 + +- Microsoft Works의 `.wps` 파일과 WPS Office 파일을 혼동하지 마세요. 이 도구는 오래된 Microsoft Works 형식 전용입니다. +- LibreOffice 엔진은 처음 사용할 때 로드되는 데 잠시 걸립니다. 로드된 후에는 같은 세션의 추가 변환이 더 빠르게 실행됩니다. + +## 관련 도구 + +- [WPD를 PDF로](./wpd-to-pdf) +- [PUB를 PDF로](./pub-to-pdf) diff --git a/docs/ko/tools/xml-to-pdf.md b/docs/ko/tools/xml-to-pdf.md new file mode 100644 index 00000000..747987b7 --- /dev/null +++ b/docs/ko/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML을 PDF로 +description: XML 파일을 구조화된 PDF 문서로 브라우저에서 변환합니다. 무료, 비공개, 서버 처리 없음. +--- + +# XML을 PDF로 + +XML 데이터 파일을 읽기 쉬운 구조화된 PDF 문서로 변환합니다. 원시 XML은 강력하지만 사람이 읽기에는 어렵습니다. 이 도구는 XML 트리를 분석해 반복되는 데이터 구조를 찾아내고, 가로 방향 A4 PDF에 서식이 있는 표와 섹션으로 렌더링합니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :--- | :----- | :-------------------------- | +| XML | `.xml` | 올바른 형식의 모든 XML 문서 | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 XML 파일을 끌어다 놓습니다. 여러 파일을 한 번에 처리할 수 있습니다. +2. 파일 목록을 확인합니다. 휴지통 아이콘으로 원하지 않는 파일을 제거하거나, **파일 더 추가**를 클릭해 더 포함합니다. +3. **PDF로 변환**을 클릭합니다. 도구가 브라우저 내장 DOMParser로 XML 구조를 분석하고, 데이터 계층을 파악한 뒤, jsPDF와 자동 표 서식을 사용해 PDF로 렌더링합니다. +4. 파일이 하나면 PDF로 다운로드됩니다. 여러 변환 결과는 `xml-to-pdf.zip`으로 묶입니다. + +## 옵션 + +수동 설정은 필요하지 않습니다. 변환기가 XML 구조를 자동으로 감지해 적절한 표 레이아웃을 선택합니다. 넓은 데이터 세트를 담기 위해 결과물은 가로 방향 A4를 사용합니다. + +## 사용 사례 + +- 데이터베이스나 API에서 내보낸 XML 데이터를 인쇄 가능한 보고서로 변환 +- XML 구성 파일에서 읽기 쉬운 요약 만들기 +- XML 기반 청구서나 거래 로그를 기록 보관용 PDF로 변환 +- XML 사이트맵이나 RSS 피드를 문서 형태로 읽기 쉽게 만들기 + +## 팁 + +- XML은 올바른 형식이어야 합니다. 파서가 구문 오류를 발견하면 문제 위치를 알려 주는 오류 메시지와 함께 변환이 실패합니다. +- 깊게 중첩된 XML 구조는 표로 평면화됩니다. 최상의 결과를 위해 데이터에는 일관된 하위 요소를 가진 반복 형제 요소가 있어야 합니다. +- 변환 중에는 읽기, 분석, 구조 파악, 렌더링의 각 단계를 보여 주는 진행 상황이 표시됩니다. + +## 관련 도구 + +- [FB2를 PDF로](./fb2-to-pdf) +- [XPS를 PDF로](./xps-to-pdf) +- [이메일을 PDF로](./email-to-pdf) diff --git a/docs/ko/tools/xps-to-pdf.md b/docs/ko/tools/xps-to-pdf.md new file mode 100644 index 00000000..9b167991 --- /dev/null +++ b/docs/ko/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS를 PDF로 +description: XPS 및 OXPS 문서를 브라우저에서 PDF 형식으로 변환합니다. 업로드 없음, 회원가입 불필요, 완전한 비공개. +--- + +# XPS를 PDF로 + +Microsoft XPS 및 OXPS 문서를 표준 PDF 파일로 변환합니다. XPS(XML Paper Specification)는 PDF에 대한 Microsoft의 대답이었지만, 여러 플랫폼에서 지원이 줄어들었습니다. 이 도구는 그런 문서를 다시 누구나 읽을 수 있게 만들어 줍니다. + +## 지원 형식 + +| 형식 | 확장자 | 참고 | +| :--- | :------ | :--------------------------- | +| XPS | `.xps` | 원래의 Microsoft XPS 형식 | +| OXPS | `.oxps` | Open XPS, ECMA-388 표준 변형 | + +## 작동 방식 + +1. 업로드 영역을 클릭하거나 XPS/OXPS 파일을 끌어다 놓습니다. 여러 파일을 한 번에 선택할 수 있습니다. +2. 파일 목록을 확인합니다. 휴지통 아이콘으로 개별 파일을 제거하거나, **파일 더 추가**를 클릭해 문서를 더 추가합니다. +3. **PDF로 변환**을 클릭합니다. PyMuPDF 엔진이 브라우저에서 각 문서를 로컬로 처리합니다. +4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `xps-converted.zip`이라는 ZIP 압축 파일로 묶입니다. + +## 옵션 + +이 도구는 추가 설정 없이 형식을 직접 변환합니다. 결과물은 XPS 원본의 페이지 크기, 벡터 그래픽, 글꼴, 이미지를 그대로 유지합니다. + +## 사용 사례 + +- XPS 인쇄 드라이버를 기본으로 쓰던 오래된 Windows 시스템에서 받은 XPS 파일 열기 +- macOS나 Linux 사용자와 공유하기 위해 Windows 10/11의 OXPS 문서 변환 +- 레거시 XPS 파일을 더 널리 지원되는 형식으로 보관 +- XPS 기반 정부 또는 기업 문서를 외부 수신자가 열람할 수 있게 하기 + +## 팁 + +- `.xps`와 `.oxps` 확장자 모두 자동으로 처리되므로 같은 묶음에 섞어서 올릴 수 있습니다. +- 원래 XPS 파일이 고해상도 인쇄 드라이버로 만들어졌다면 결과 PDF도 그 품질을 유지합니다. 리샘플링은 일어나지 않습니다. + +## 관련 도구 + +- [Word를 PDF로](./word-to-pdf) +- [XML을 PDF로](./xml-to-pdf) diff --git a/docs/nl/contributing.md b/docs/nl/contributing.md new file mode 100644 index 00000000..f92c4175 --- /dev/null +++ b/docs/nl/contributing.md @@ -0,0 +1,136 @@ +# Bijdragen + +Bedankt voor je interesse in een bijdrage aan BentoPDF! Deze gids helpt je op weg. + +## Aan de slag + +### Vereisten + +- Node.js 18+ +- npm 9+ +- Git + +### Installatie + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Projectstructuur + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Een nieuwe tool toevoegen + +### Stap 1: Maak het logicabestand + +Maak `src/js/logic/your-tool-page.ts` aan: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Stap 2: Maak de HTML-pagina + +Maak `src/pages/your-tool.html` aan volgens de bestaande tooltemplates. + +### Stap 3: Registreer de tool + +Voeg toe aan `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Stap 4: Voeg toe aan de buildconfiguratie + +Voeg de pagina toe aan `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Stap 5: Voeg vertalingen toe + +Voeg items toe aan alle localebestanden in `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Codestijl + +- Gebruik TypeScript voor alle nieuwe code +- Volg bestaande patronen voor consistentie +- Voer `npm run format` uit voordat je commit +- Geen opmerkingen in productiecode (opmerkingen worden tijdens de build verwijderd) + +## Pull request-proces + +1. Maak een featurebranch: `git checkout -b feature/your-feature` +2. Breng je wijzigingen aan +3. Test grondig: `npm run build` +4. Dien een PR in met een duidelijke beschrijving + +## Vertalen + +Zie [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) voor het toevoegen van nieuwe talen. + +## Contributor License Agreement + +Voordat je PR kan worden samengevoegd, moet je onze CLA ondertekenen: + +- [Individual CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Corporate CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Hulp krijgen + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord-community](https://discord.gg/Bgq3Ay3f2w) + +## Licentie + +BentoPDF heeft een dubbele licentie: + +- **AGPL-3.0** voor open-sourceprojecten waarbij je je volledige broncode openbaar deelt +- **Commerciële licentie** voor propriëtaire/closed-source toepassingen - [Levenslange licentie voor $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Door bij te dragen ga je ermee akkoord dat je bijdragen onder deze voorwaarden worden gelicentieerd. diff --git a/docs/nl/getting-started.md b/docs/nl/getting-started.md new file mode 100644 index 00000000..061507f3 --- /dev/null +++ b/docs/nl/getting-started.md @@ -0,0 +1,80 @@ +# Aan de slag + +Welkom bij BentoPDF! Deze gids helpt je snel op weg. + +## Wat is BentoPDF? + +BentoPDF is een gratis, open-source, privacygerichte PDF-toolkit die **volledig in je browser** draait. Je bestanden verlaten je apparaat nooit: alle verwerking gebeurt lokaal met WebAssembly (WASM). + +## Snelstart + +### Optie 1: Gebruik de gehoste versie + +Ga naar [bentopdf.com](https://www.bentopdf.com) om BentoPDF direct te gebruiken, zonder installatie. + +### Optie 2: Zelf hosten met Docker + +> [!IMPORTANT] +> Conversie van Office-bestanden vereist `SharedArrayBuffer`, waarvoor beide nodig zijn: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - een beveiligde context +> +> `http://localhost` werkt voor lokaal testen, omdat browsers loopback vertrouwen. `http://192.168.x.x` of andere LAN-IP's doen dat meestal niet, dus voor Word/Excel/PowerPoint-conversies is HTTPS nodig wanneer je ze vanaf andere apparaten in je netwerk opent. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF wordt in twee builds geleverd: de **zelfgehoste build** (`bentopdf-simple`, hierboven gebruikt) voor interne implementaties van teams of organisaties, en de **commerciële build** (`bentopdf:latest`) die bentopdf.com zelf gebruikt en die bedoeld is voor houders van een commerciële licentie met openbare implementaties. Beide bevatten dezelfde PDF-tools. De commerciële build voegt de hero, FAQ, testimonials en footer van bentopdf.com toe. Twijfel je, gebruik dan de zelfgehoste build. + +Open daarna `http://localhost:3000` in je browser. + +> [!NOTE] +> Als je een air-gapped OCR-implementatie voorbereidt, moet je naast de Tesseract-worker, de core-runtime en de traineddata-bestanden ook de OCR-tekstlaaglettertypen intern hosten. De volledige installatie staat in [Zelf hosten](/nl/self-hosting/), inclusief `VITE_OCR_FONT_BASE_URL` en de meegeleverde map `ocr-fonts/`. + +### Optie 3: Bouwen vanuit de broncode + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Functies in het kort + +| Categorie | Tools | +| ------------------------- | --------------------------------------------------------------------------- | +| **Naar PDF converteren** | Word, Excel, PowerPoint, afbeeldingen, Markdown, EPUB, MOBI en meer | +| **Van PDF converteren** | JPG, PNG, tekst, Excel, SVG en meer | +| **Bewerken en annoteren** | Ondertekenen, markeren, redigeren, formulieren invullen, stempels toevoegen | +| **Organiseren** | Samenvoegen, splitsen, roteren, pagina's verwijderen, herordenen | +| **Optimaliseren** | Comprimeren, repareren, platmaken, OCR | +| **Beveiliging** | Versleutelen, ontsleutelen, beperkingen verwijderen | + +## Browserondersteuning + +BentoPDF werkt het best op moderne browsers: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Volgende stappen + +- [Alle tools verkennen](/nl/tools/) +- [BentoPDF zelf hosten](/nl/self-hosting/) +- [Bijdragen aan het project](/nl/contributing) diff --git a/docs/nl/index.md b/docs/nl/index.md new file mode 100644 index 00000000..c057dcc8 --- /dev/null +++ b/docs/nl/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Gratis, open-source PDF-tools' + tagline: Verwerk PDF's volledig in je browser. Geen uploads. Geen servers. Complete privacy. + actions: + - theme: brand + text: Aan de slag + link: /nl/getting-started + - theme: alt + text: Tools bekijken + link: /nl/tools/ + - theme: alt + text: Zelf hosten + link: /nl/self-hosting/ + - theme: alt + text: Commerciële licentie + link: /nl/licensing + +features: + - icon: 🔒 + title: 100% privé + details: Je bestanden verlaten je apparaat nooit. Alle verwerking gebeurt lokaal in je browser met WebAssembly. + - icon: ⚡ + title: Snel en gratis + details: Geen aanmelding, geen limieten, geen watermerken. Verwerk onbeperkt PDF's, voor altijd gratis. + - icon: 🛠️ + title: 50+ tools + details: Converteren, bewerken, samenvoegen, splitsen, comprimeren, ondertekenen, OCR en meer. Alles wat je nodig hebt op één plek. + + - icon: 🌐 + title: Zelf te hosten + details: Implementeer op je eigen infrastructuur. Docker, Vercel, Netlify, AWS of volledig air-gapped omgevingen met zelfgehoste OCR-workers, taaldata en tekstlaaglettertypen. +--- + +## Offline OCR + +Als je BentoPDF zelf host in een air-gapped of offline omgeving, heeft OCR meer nodig dan de Tesseract-worker en traineddata-bestanden. Voor doorzoekbare PDF-uitvoer moeten ook de OCR-tekstlaaglettertypen intern worden aangeboden. +Zie [Zelf hosten](/nl/self-hosting/) voor de volledige installatie, inclusief `VITE_OCR_FONT_BASE_URL`, de meegeleverde map `ocr-fonts/` en de bijgewerkte air-gap-werkwijze. diff --git a/docs/nl/licensing.md b/docs/nl/licensing.md new file mode 100644 index 00000000..93b682a3 --- /dev/null +++ b/docs/nl/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/nl/self-hosting/#wasm-configuratie-agpl-componenten) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/nl/self-hosting/apache.md b/docs/nl/self-hosting/apache.md new file mode 100644 index 00000000..541be7bb --- /dev/null +++ b/docs/nl/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Implementeren met Apache + +Host BentoPDF met Apache HTTP Server. + +## Vereisten + +- Apache 2.4+ +- mod_rewrite ingeschakeld +- SSL-certificaat (aanbevolen) + +## Stap 1: Bouw het project + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Wil je de huisstijl aanpassen, stel dan omgevingsvariabelen in voordat je bouwt: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Stap 2: Kopieer de bestanden + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Stap 3: Apache-configuratie + +Maak `/etc/apache2/sites-available/bentopdf.conf` aan: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Stap 4: .htaccess voor routing + +Maak `/var/www/bentopdf/.htaccess` aan: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Stap 5: Schakel de vereiste modules in + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Stap 6: Schakel de site in + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Implementatie in een submap + +Om te hosten op `/pdf/`: + +1. Bouw met de basis-URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Werk `.htaccess` bij: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Probleemoplossing + +### WASM 404-fouten + +Controleer of het MIME-type is geconfigureerd: + +```apache +AddType application/wasm .wasm +``` + +### PDF ondertekenen of formulierinvuller toont een leeg weergavevenster (`.mjs` MIME-fout) + +Als de browserconsole dit toont: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...en het mislukte verzoek eindigt op `.mjs`, ontbreekt in je Apache-configuratie de koppeling `.mjs → application/javascript`. De meegeleverde PDF-viewer bevat ES-modulebestanden met de extensie `.mjs`, en de standaard `mime.types` van Apache bevat die niet. + +Voeg toe aan je VirtualHost of `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Laad Apache daarna opnieuw: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Controleren: zoek in de browser-DevTools op het tabblad Network het mislukte `.mjs`-verzoek en bekijk de responsheader `Content-Type`. Die moet nu `application/javascript` zijn, niet `application/octet-stream`. + +### Rewrite werkt niet + +Controleer of mod_rewrite is ingeschakeld: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel naar PDF werkt niet + +LibreOffice WASM vereist `SharedArrayBuffer`, waarvoor deze headers nodig zijn: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Daarnaast is een beveiligde context nodig. `http://localhost` werkt voor lokaal testen, maar `http://192.168.x.x` of andere LAN-IP's vereisen meestal HTTPS. Als de headers aanwezig zijn maar `window.crossOriginIsolated` nog steeds `false` is, controleer dan of de pagina via gewoon HTTP wordt geopend op een origin die geen loopback is. + +De vooraf gecomprimeerde bestanden `.wasm.gz` en `.data.gz` hebben ook de juiste `Content-Encoding` nodig: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Zorg dat `mod_headers` is ingeschakeld: `sudo a2enmod headers` + +### Toegang geweigerd + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/nl/self-hosting/aws.md b/docs/nl/self-hosting/aws.md new file mode 100644 index 00000000..0bd8c834 --- /dev/null +++ b/docs/nl/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Implementeren op AWS S3 + CloudFront + +Host BentoPDF op AWS voor maximale controle en schaalbaarheid. + +## Architectuur + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Stap 1: Maak een S3-bucket + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Stap 2: Bouwen en uploaden + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Stap 3: Maak een CloudFront-distributie + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Of gebruik de AWS Console: + +1. Ga naar CloudFront → Create distribution +2. Origin domain: selecteer je S3-bucket +3. Schakel "Origin Access Control" in +4. Default root object: `index.html` +5. Maak de distributie aan + +## Stap 3b: Response Headers Policy (vereist voor LibreOffice WASM) + +Conversies met LibreOffice (Word, Excel, PowerPoint naar PDF) vereisen `SharedArrayBuffer`, waarvoor specifieke responsheaders nodig zijn. Maak een CloudFront Response Headers Policy aan: + +1. Ga naar CloudFront → Policies → Response headers +2. Maak een aangepaste policy met deze headers: + +| Header | Waarde | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Koppel de policy aan het standaard cachegedrag van je distributie + +Of via de CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Stap 3c: S3-metadata voor vooraf gecomprimeerde WASM-bestanden + +De LibreOffice WASM-bestanden zijn vooraf gecomprimeerd (`.wasm.gz`, `.data.gz`). Stel de juiste Content-Type en Content-Encoding in, zodat browsers ze decomprimeren: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Belangrijk +Zonder de response headers policy is `SharedArrayBuffer` niet beschikbaar en blijven LibreOffice WASM-conversies hangen op ~55%. Zonder de juiste Content-Encoding op de `.gz`-bestanden ontvangt de browser onbewerkte gzip-bytes en mislukt de WASM-compilatie. +::: + +## Stap 4: S3-bucketbeleid + +Geef CloudFront toegang tot de bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Stap 5: Aangepaste foutpagina's + +Configureer 404 zo dat `index.html` wordt geretourneerd voor SPA-routing: + +1. CloudFront → Error pages +2. Maak een aangepaste foutrespons: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Kostenraming + +| Resource | Geschatte kosten | +| -------------------------- | ---------------- | +| S3-opslag (~500MB) | ~$0,01/maand | +| CloudFront (1TB transfer) | ~$85/maand | +| CloudFront (10GB transfer) | ~$0,85/maand | + +::: tip +Gebruik S3 Intelligent Tiering voor kostenoptimalisatie bij bestanden die zelden worden geopend. +::: + +## Automatisering met Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/nl/self-hosting/cloudflare.md b/docs/nl/self-hosting/cloudflare.md new file mode 100644 index 00000000..1b6d9dbc --- /dev/null +++ b/docs/nl/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Implementeren op Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) biedt snelle, wereldwijde hosting van statische sites met onbeperkte bandbreedte. + +## Snel implementeren + +1. Ga naar [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Klik op "Create a project" +3. Koppel je GitHub-repository + +## Buildconfiguratie + +| Instelling | Waarde | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Omgevingsvariabelen + +Voeg deze toe onder Settings → Environment variables: + +| Variabele | Waarde | +| ----------------------- | ------------------------------------------------------ | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (optioneel) | +| `VITE_BRAND_NAME` | Aangepaste merknaam (optioneel) | +| `VITE_BRAND_LOGO` | Logopad relatief aan `public/` (optioneel) | +| `VITE_FOOTER_TEXT` | Aangepaste footer-/copyrighttekst (optioneel) | +| `VITE_DEFAULT_LANGUAGE` | Standaardtaal van de interface, bijv. `fr` (optioneel) | + +## Configuratiebestand + +Maak `_headers` aan in je map `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Belangrijk +De headers `Cross-Origin-Embedder-Policy` en `Cross-Origin-Opener-Policy` zijn vereist voor conversies van Word/ODT/Excel/PowerPoint naar PDF. Zonder deze headers is `SharedArrayBuffer` niet beschikbaar en kan de LibreOffice WASM-engine niet starten. +::: + +Maak `_redirects` aan voor SPA-routing: + +``` +/* /index.html 200 +``` + +## Eigen domein + +1. Ga naar je Pages-project +2. Klik op "Custom domains" +3. Voeg je domein toe +4. Cloudflare configureert DNS automatisch als het domein bij Cloudflare staat + +## Voordelen + +- **Gratis onbeperkte bandbreedte** +- **Wereldwijd CDN** met 300+ edge-locaties +- **Automatische HTTPS** +- **Previewimplementaties** voor pull requests +- **Snelle builds** + +## Probleemoplossing + +### Uploads van grote bestanden + +Cloudflare Pages ondersteunt bestanden tot 25 MB. WASM-modules zouden geen probleem moeten zijn, maar als je tegen limieten aanloopt, overweeg dan: + +```bash +# Split large files during build +npm run build +``` + +### Groottelimieten van Workers + +Gebruik je Cloudflare Workers voor geavanceerde routing, let dan op de limiet van 1 MB voor gratis abonnementen. + +## CORS-proxyworker (voor digitale handtekeningen) + +De tool voor digitale handtekeningen vereist een CORS-proxy om certificaatketens op te halen. Implementeer de meegeleverde worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Beveiligingsfuncties + +| Functie | Beschrijving | +| ------------------------- | ----------------------------------- | +| **URL-beperkingen** | Alleen certificaat-URL's toegestaan | +| **Bestandsgroottelimiet** | Max 10MB per verzoek | +| **Rate limiting** | 60 verzoeken/IP/min (vereist KV) | +| **Blokkering privé-IP's** | Blokkeert localhost en interne IP's | + +### Rate limiting inschakelen + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Bouwen met proxy-URL + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Of met Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Opmerking:** Zie de [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) voor de installatie van de HMAC-handtekening. diff --git a/docs/nl/self-hosting/cors-proxy.md b/docs/nl/self-hosting/cors-proxy.md new file mode 100644 index 00000000..69304ae1 --- /dev/null +++ b/docs/nl/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-proxy voor het ophalen van certificaten + +De tool voor digitale handtekeningen gebruikt een CORS-proxy om uitgevers-certificaten op te halen bij externe certificeringsinstanties (CA's). Dat is nodig omdat veel CA-servers geen CORS-headers in hun antwoorden opnemen, waardoor rechtstreeks ophalen vanuit de browser niet lukt. + +Bovendien leveren veel CA-servers certificaten via gewoon HTTP. Wanneer je BentoPDF-instantie via HTTPS wordt gehost, blokkeren browsers deze HTTP-verzoeken (mixed content-beleid). De CORS-proxy lost beide problemen op door verzoeken via een HTTPS-eindpunt met de juiste headers te routeren. + +## Hoe het werkt + +Bij het ondertekenen van een PDF met een certificaat: + +1. De bibliotheek `zgapdfsigner` probeert een volledige certificaatketen op te bouwen +2. Ze haalt uitgevers-certificaten op via URL's in de AIA-extensie (Authority Information Access) van je certificaat +3. Deze verzoeken lopen via een CORS-proxy die de benodigde `Access-Control-Allow-Origin`-headers toevoegt +4. De proxy stuurt de certificaatgegevens terug naar de browser + +## De CORS-proxy zelf hosten + +Host je BentoPDF zelf, dan moet je een eigen CORS-proxy implementeren, zodat digitale handtekeningen werken met certificaten waarvoor de keten moet worden opgehaald. + +### Optie 1: Cloudflare Workers (aanbevolen) + +1. **Installeer de Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Log in bij Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clone BentoPDF en pas de toegestane origins aan**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Open `cors-proxy-worker.js` en verander de array `ALLOWED_ORIGINS` naar je eigen domein: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Belangrijk + Zonder deze wijziging weigert de proxy alle verzoeken van je site met een **403 Forbidden**-fout. Standaard worden alleen verzoeken van `bentopdf.com` toegestaan. + ::: + +4. **Implementeer de proxy**: + + ```bash + wrangler deploy + ``` + + Noteer de URL van je worker (bijv. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Bouw BentoPDF opnieuw met de proxy-URL**: + + Met Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Bouwen vanuit de broncode: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Optie 2: Eigen backendproxy + +Je kunt ook je eigen proxy-eindpunt maken. De vereisten zijn: + +1. Accepteer GET-verzoeken met een queryparameter `url` +2. Haal de URL op vanaf je server (aan de serverkant gelden geen CORS-beperkingen) +3. Retourneer het antwoord met deze headers: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Voorbeeldimplementatie met Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Beveiligingsoverwegingen + +De meegeleverde Cloudflare Worker heeft diverse beveiligingsmaatregelen: + +| Functie | Beschrijving | +| --------------------------- | ------------------------------------------------------------------------------------------------------- | +| **Origin-validatie** | Staat alleen verzoeken toe van domeinen in `ALLOWED_ORIGINS` | +| **URL-beperkingen** | Staat alleen certificaat-URL's toe (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blokkering privé-IP's** | Blokkeert privébereiken van IPv4/IPv6, link-local, loopback, decimale IP's en cloud-metadata | +| **Content-Type-veiligheid** | Retourneert alleen veilige MIME-typen voor certificaten en blokkeert injectie van upstream content-type | +| **Bestandsgroottelimiet** | Streamt het antwoord met een limiet van 10MB en breekt halverwege de download af bij overschrijding | +| **Rate limiting** | 60 verzoeken per minuut per IP of IPv6 /64 (vereist KV, laat verkeer door bij KV-fouten) | +| **HMAC-handtekeningen** | Optionele ondertekening aan de clientzijde (ontmoedigt gelegenheidsmisbruik) | + +### DNS-rebinding (zelf hosten buiten Cloudflare) + +De worker weigert elke URL die naar een privé- of intern IP verwijst. Een vaste allowlist van hosts is niet mogelijk, omdat URL's in certificaatketens verwijzen naar de CA die het certificaat heeft uitgegeven (FNMT, bedrijfs-CA's enzovoort), dus de bestemmingen zijn vooraf niet bekend. Daardoor blijft een klein rebinding-venster over: wie de DNS van een eigen domein beheert, kan de veiligheidscontrole een publiek IP geven en het echte verzoek even later een privé-IP. + +Op Cloudflare is dit niet te misbruiken: Workers kunnen geen privé-IP's of het metadata-eindpunt `169.254.169.254` bereiken, dus een rebind komt nergens uit. Geef de worker alleen geen toegang naar binnen: koppel geen Tunnel, Service of privénetwerkbinding (hij heeft alleen `RATE_LIMIT_KV` nodig). + +Draai je dit buiten Cloudflare (workerd, Node en dergelijke) in een VPC, dan _kan_ de runtime interne IP's bereiken. Zet er een egress-firewall voor en blokkeer de privébereiken: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` en hun IPv6-equivalenten. Applicatiecode kan dat niet afdwingen zodra je buiten Cloudflare draait. + +## De proxy uitschakelen + +Wil je geen CORS-proxy gebruiken, stel de omgevingsvariabele dan in op een lege string: + +``` +VITE_CORS_PROXY_URL= +``` + +**Opmerking**: Zonder de proxy mislukt het ondertekenen met certificaten waarvoor de keten extern moet worden opgehaald (zoals FNMT of sommige bedrijfs-CA's) met de foutmelding "Failed to fetch". + +## Probleemoplossing + +### "Signing error: TypeError: Failed to fetch" + +Dit betekent meestal een van deze dingen: + +1. **Geen CORS-proxy geconfigureerd**: stel `VITE_CORS_PROXY_URL` in en bouw opnieuw +2. **Mixed content geblokkeerd**: je site is HTTPS, maar de uitgevers-URL van het certificaat is HTTP. De CORS-proxy lost dit op. +3. **CORS-proxy weigert je origin**: controleer of je domein in de array `ALLOWED_ORIGINS` in `cors-proxy-worker.js` staat + +### "403 Forbidden" van de proxy + +Je domein staat niet in de lijst `ALLOWED_ORIGINS`. Bewerk `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Implementeer daarna opnieuw: `npx wrangler deploy` + +### De proxy testen + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certificaten die zonder proxy werken + +Sommige certificaten bevatten de volledige keten in het P12/PFX-bestand en hoeven niets extern op te halen: + +- Zelfondertekende certificaten +- Sommige commerciële CA's die tussencertificaten meeleveren +- Certificaten die je handmatig met de volledige keten hebt samengesteld diff --git a/docs/nl/self-hosting/docker.md b/docs/nl/self-hosting/docker.md new file mode 100644 index 00000000..89052d81 --- /dev/null +++ b/docs/nl/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Implementeren met Docker / Podman + +De eenvoudigste manier om BentoPDF zelf te hosten in een productieomgeving. + +> [!IMPORTANT] +> **Vereiste headers voor conversie van Office-bestanden** +> +> Op LibreOffice gebaseerde tools (conversie van Word, Excel en PowerPoint) hebben deze HTTP-headers nodig voor `SharedArrayBuffer`-ondersteuning: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> De pagina moet ook vanuit een beveiligde context worden aangeboden. `http://localhost` werkt voor lokaal testen, maar `http://192.168.x.x` of andere LAN-IP's komen meestal niet in aanmerking, dus Office-conversie via gewoon HTTP mislukt ook als de headers aanwezig zijn. +> +> De officiële containerimages bevatten deze headers. Gebruik je een reverse proxy (Traefik, Caddy enzovoort), zorg dan dat deze headers behouden blijven of worden toegevoegd, en gebruik HTTPS voor toegang buiten loopback. + +> [!TIP] +> **Podman-gebruikers:** Alle `docker`-opdrachten werken met Podman door `docker` te vervangen door `podman` en `docker-compose` door `podman-compose`. + +## Snelstart + +> [!TIP] +> BentoPDF wordt in twee builds geleverd: +> +> - **Zelfgehoste build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Alle PDF-tools, **zonder** de marketingelementen (geen hero, FAQ, testimonials, footer). Gebruik deze voor interne implementaties van teams of organisaties. Het is **geen** "lite"-versie met minder functies. +> - **Commerciële build**: `ghcr.io/alam00000/bentopdf:latest`. De volledige marketingsite, gebruikt door bentopdf.com zelf en door houders van een commerciële licentie met openbare implementaties. +> +> Twijfel je, haal dan de zelfgehoste build op. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Maak `docker-compose.yml` aan: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Uitvoeren: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Bouw je eigen image + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Bouwen en uitvoeren: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Omgevingsvariabelen + +| Variable | Description | Default | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Bouw de zelfgehoste variant (verbergt de marketingelementen van bentopdf.com: hero, FAQ, testimonials, footer). Alle PDF-tools blijven beschikbaar. | `false` | +| `BASE_URL` | Implementeren in een submap | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL van de PyMuPDF WASM-module | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL van de Ghostscript WASM-module | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL van de CoherentPDF WASM-module | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL van het OCR-workerscript | _(leeg; gebruik de standaard-CDN van Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Map met de OCR-core-runtime | _(leeg; gebruik de standaard-CDN van Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Map met OCR-traineddata | _(leeg; gebruik de standaard-CDN van Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | OCR-talen in de interface, gescheiden door komma's | _(leeg; toon de volledige catalogus)_ | +| `VITE_OCR_FONT_BASE_URL` | Map met OCR-tekstlaaglettertypen | _(leeg; gebruik externe Noto-lettertype-URL's)_ | +| `VITE_DEFAULT_LANGUAGE` | Standaardtaal van de interface | `en` | +| `VITE_BRAND_NAME` | Aangepaste merknaam | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logopad relatief aan `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Aangepaste footer-/copyrighttekst | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Tool-ID's om te verbergen, gescheiden door komma's | _(leeg; alle tools ingeschakeld)_ | +| `DISABLE_GITHUB_STARS` | Sla het ophalen van het aantal GitHub-sterren bij het laden van de pagina over en haal `api.github.com` uit de CSP. Builds in Simple Mode slaan het altijd over. | `false` | +| `SITE_URL` | Openbare URL die in canonical-, hreflang- en sitemaplinks wordt geschreven. Laat de standaardwaarde staan, tenzij zoekmachines je implementatie als eigen site moeten zien. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Bij een aangepaste `SITE_URL` krijgt elke pagina `noindex`, zodat je kopie niet concurreert met bentopdf.com in zoekresultaten. Zet op `true` om indexering toe te staan. | `false` | + +WASM-module-URL's zijn vooraf geconfigureerd met CDN-standaardwaarden, dus alle geavanceerde functies werken direct. Overschrijf ze voor air-gapped of zelfgehoste implementaties. + +### Zoekmachines + +Standaard verwijst elke pagina zoekmachines naar bentopdf.com als origineel, zodat je implementatie niet als duplicaat verschijnt. Voor een privé- of interne instantie hoef je niets te wijzigen. + +- **Houd je instantie helemaal uit zoekresultaten:** start de container met `-e ROBOTS_NOINDEX=true`. Hiervoor is alleen een herstart nodig, geen nieuwe build. +- **Maak van je instantie een eigen site in zoekresultaten:** bouw met `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Zonder `ALLOW_INDEXING=true` markeert een aangepaste `SITE_URL` elke pagina als `noindex`. + +### Content-Security-Policy + +De nginx-image wordt geleverd met een afdwingende `Content-Security-Policy`-header. De richtlijnen `script-src`, `connect-src` en `font-src` van de CSP worden **tijdens de build gegenereerd** uit de bovenstaande `VITE_*`-URL-variabelen: alle hosts die je via `--build-arg` meegeeft, worden automatisch aan het beleid toegevoegd. + +Daardoor geldt: + +- Overschrijf je `VITE_CORS_PROXY_URL` of `VITE_WASM_*_URL` tijdens de build, dan staat de CSP die origins automatisch toe, zonder extra configuratie. +- Voor URL's op `cdn.jsdelivr.net` staat `script-src` alleen de exacte map van het versiegebonden pakket toe, bijvoorbeeld `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, niet de hele CDN. jsDelivr serveert elk openbaar npm-pakket of GitHub-repository, dus het toestaan van de hele host zou elk daarvan op je instantie laten draaien. URL's op andere hosts worden op origin toegestaan. +- Configureer je aangepaste WASM-URL's tijdens _runtime_ via de pagina Geavanceerde instellingen in de app, dan staan die origins **niet** in de CSP en blokkeert de browser het ophalen ervan. Dit geldt ook voor een andere versie van hetzelfde pakket op `cdn.jsdelivr.net`, omdat alleen de tijdens de build ingestelde versie is toegestaan. Runtimeconfiguratie is bedoeld om mee te experimenteren; stel voor permanente aangepaste URL's het bijbehorende `VITE_*`-buildargument in. +- Air-gapped implementaties die alle drie de `VITE_WASM_*_URL`-waarden overschrijven, verwijderen ook die `cdn.jsdelivr.net`-pakketmappen uit de CSP (elke standaardwaarde wordt vervangen, niet aangevuld). De Tesseract OCR-standaardwaarden op `cdn.jsdelivr.net` blijven in het beleid staan totdat je ook de drie `VITE_TESSERACT_*`-waarden instelt. Zo vervangt het instellen van `VITE_CORS_PROXY_URL` ook de openbare standaardwaarde `bentopdf-cors-proxy.bentopdf.workers.dev`. + +De CSP bevat `'unsafe-eval'` in `script-src`, omdat de LibreOffice WASM-runtime (gebruikt door de conversietools voor Word/Excel/PowerPoint) en de afbeeldingsbibliotheek wasm-vips (gebruikt door PDF naar TIFF) interne dispatch-code compileren via `new Function()`. Zonder dit werken die tools niet meer. Bouw je in `SIMPLE_MODE` (zonder LibreOffice) en heb je PDF naar TIFF niet nodig, dan kun je het gegenereerde `security-headers.conf` handmatig bewerken om `'unsafe-eval'` te verwijderen voor een strenger beleid. + +Laat voor OCR de `VITE_TESSERACT_*`-variabelen leeg om de standaard online assets te gebruiken, of stel alle drie samen in voor zelfgehoste/offline OCR. Gedeeltelijke OCR-overschrijvingen worden geweigerd, omdat de worker, de core-runtime en de traineddata-map bij elkaar moeten passen. Stel voor volledig offline doorzoekbare PDF-uitvoer ook `VITE_OCR_FONT_BASE_URL` in, zodat de OCR-tekstlaaglettertypen van je interne server worden geladen in plaats van van de openbare Noto-lettertype-URL's. + +`VITE_DEFAULT_LANGUAGE` stelt de interfacetaal in voor nieuwe bezoekers. Ondersteunde waarden: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Gebruikers kunnen nog steeds van taal wisselen: dit verandert alleen de standaardtaal. + +Voorbeeld: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Eigen huisstijl + +Vervang het standaardlogo, de naam en de footertekst van BentoPDF door je eigen. Plaats je logobestand in de map `public/` (of gebruik een bestaande afbeelding) en geef de huisstijlvariabelen tijdens de build mee: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Huisstijl werkt in zowel de volledige modus als Simple Mode en kan worden gecombineerd met alle andere buildopties. + +### Specifieke tools uitschakelen + +Verberg tools in de interface voor compliance- of beveiligingseisen. Uitgeschakelde tools verdwijnen van de startpagina, uit zoekresultaten, sneltoetsen en de workflowbouwer. Rechtstreekse toegang via de URL toont een pagina "tool niet beschikbaar". + +Tool-ID's zijn de pagina-URL zonder `.html`. Staat een tool bijvoorbeeld op `bentopdf.com/edit-pdf.html`, dan is de ID `edit-pdf`. + +#### Tool-ID's vinden + +Het makkelijkst: open een tool in BentoPDF en kijk naar de URL. Het laatste deel van het pad (zonder `.html`) is de tool-ID. + +
+Volledige lijst met tool-ID's + +**Bewerken en annoteren:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Naar PDF converteren:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Van PDF converteren:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organiseren en beheren:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimaliseren en repareren:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Beveiliging:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Optie 1: Tijdens de build (Docker-buildargument) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Hiermee wordt de lijst met uitgeschakelde tools in de JavaScript-bundel ingebakken. Wijzigen vereist een nieuwe build. + +#### Optie 2: Tijdens runtime (config.json) + +Koppel een bestand `config.json` in de aangeboden map, zonder nieuwe build: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Of met Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Beide methoden kunnen worden gecombineerd: de lijsten worden samengevoegd. Staat een tool in een van beide, dan is hij uitgeschakeld. + +#### Editorfuncties uitschakelen + +Je kunt ook specifieke functies in de PDF-editor (bijv. redactie, annotaties, formulieren) uitschakelen zonder de hele editortool uit te schakelen. Voeg `editorDisabledCategories` toe aan je `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Volledige lijst met editorcategorieën + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Annotatie:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Vormen:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulier:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Redactie:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Document:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Pagina:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Paneel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Tools:** `tools`, `pan`, `pointer`, `capture` + +**Selectie:** `selection`, `selection-copy` + +**Geschiedenis:** `history`, `history-undo`, `history-redo` + +
+ +Categorieën zijn hiërarchisch: het uitschakelen van een bovenliggende categorie (bijv. `annotation`) schakelt alle onderliggende uit. + +### De GitHub-sterrenteller uitschakelen + +De navigatiebalk toont een live aantal GitHub-sterren, bij het laden van de pagina opgehaald van `api.github.com`. Het is het enige externe verzoek dat geen PDF-functie dient. Schakel het uit tijdens de build om de ophaalcode uit de bundel te verwijderen en `api.github.com` uit de Content-Security-Policy te halen: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Builds in Simple Mode (`bentopdf-simple`) slaan de sterrenteller altijd over: deze vlag is alleen nodig voor de commerciële build of aangepaste volledige builds. + +### Aangepaste WASM-URL's (air-gapped / zelfgehost) + +> [!IMPORTANT] +> WASM-URL's worden tijdens de **build** in de JavaScript ingebakken. De WASM-bestanden worden tijdens runtime door de **browser van de gebruiker** gedownload: Docker downloadt ze niet tijdens de build. Voor air-gapped netwerken moet je de WASM-bestanden hosten op een interne server die browsers kunnen bereiken. + +**Volledige air-gapped werkwijze:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Gebruik de codes die `bash scripts/prepare-airgap.sh --list-ocr-languages` toont, of zoek op naam met `bash scripts/prepare-airgap.sh --search-ocr-language `, voor `--ocr-languages`. Bouw je met een beperkte OCR-subset, geef dan dezelfde codes door aan `VITE_TESSERACT_AVAILABLE_LANGUAGES`, zodat de app alleen meegeleverde talen toont. Host voor volledig offline OCR-uitvoer ook de meegeleverde map `ocr-fonts/` en laat `VITE_OCR_FONT_BASE_URL` ernaar verwijzen. + +Stel een variabele in op een lege string om die module uit te schakelen (gebruikers moeten dan handmatig configureren via Geavanceerde instellingen). + +## Aangepaste poort + +Standaard luistert BentoPDF op poort `8080` in de container. Om dit te wijzigen, stel je tijdens runtime de omgevingsvariabele `PORT` in: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variable | Description | Default | +| -------- | ---------------------------------- | ------- | +| `PORT` | Nginx-luisterpoort in de container | `8080` | + +Dit werkt met zowel de standaard als de nonroot Dockerfile. + +## Aangepaste gebruikers-ID (PUID/PGID) + +Voor omgevingen die als een specifieke niet-rootgebruiker moeten draaien (NAS-apparaten, Kubernetes met security contexts, organisatiebeleid) biedt BentoPDF een aparte Dockerfile met PUID/PGID-ondersteuning in LSIO-stijl. + +### Bouwen en uitvoeren + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Omgevingsvariabelen + +| Variable | Description | Default | +| -------------- | ------------------------------- | ------- | +| `PUID` | Gebruikers-ID om mee te draaien | `1000` | +| `PGID` | Groeps-ID om mee te draaien | `1000` | +| `PORT` | Nginx-luisterpoort | `8080` | +| `DISABLE_IPV6` | IPv6-listener uitschakelen | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Hoe het werkt + +De container start als root, maakt een gebruiker aan met de opgegeven PUID/PGID, past het eigendom van alle beschrijfbare mappen aan en laat daarna rechten vallen met `su-exec`. Het nginx-proces draait volledig als de door jou opgegeven gebruiker. + +> [!NOTE] +> De standaard `Dockerfile` gebruikt `nginx-unprivileged` (UID 101) en wordt aanbevolen voor de meeste implementaties. Gebruik `Dockerfile.nonroot` alleen als je een specifieke UID/GID nodig hebt. + +> [!WARNING] +> PUID/PGID mag niet `0` (root) zijn. De entrypoint valideert de invoer en stopt met een foutmelding bij ongeldige waarden. + +## Met Traefik (reverse proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Met Caddy (reverse proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Resourcelimieten + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (systemd-integratie) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) laat je Podman-containers als systemd-services draaien. Dit is ideaal voor productie-implementaties op Linux-systemen. + +### Basisinstallatie van Quadlet + +Maak een containerunitbestand aan op `~/.config/containers/systemd/bentopdf.container` (gebruiker) of `/etc/containers/systemd/bentopdf.container` (systeem): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Inschakelen en starten + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Gebruik voor een systeembrede implementatie `systemctl` zonder de vlag `--user` en plaats het bestand in `/etc/containers/systemd/`. + +### Quadlet met health check + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Automatisch bijwerken met Quadlet + +Podman kan containers automatisch bijwerken wanneer nieuwe images beschikbaar zijn: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Netwerkconfiguratie van Quadlet + +Maak voor een aangepaste netwerkconfiguratie een netwerkbestand `bentopdf.network` aan: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Verwijs er daarna naar in je containerbestand: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Bijwerken + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/nl/self-hosting/hostinger.md b/docs/nl/self-hosting/hostinger.md new file mode 100644 index 00000000..1835a1e2 --- /dev/null +++ b/docs/nl/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Implementeren op Hostinger + +[Hostinger](https://hostinger.com) is een populaire aanbieder van shared hosting. Deze gids behandelt het implementeren van BentoPDF op de shared hosting van Hostinger. + +## Vereisten + +- Hostinger-hostingpakket met toegang tot de bestandsbeheerder +- Lokaal geïnstalleerde Node.js om te bouwen + +## Stap 1: Bouw het project + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +De gebouwde bestanden staan in de map `dist`. + +## Stap 2: Uploaden naar Hostinger + +### Implementatie op het hoofddomein + +1. Log in op je Hostinger-account +2. Ga naar **File Manager** → **public_html** +3. **Verwijder** bestaande bestanden (maak zo nodig een back-up) +4. **Upload** de volledige inhoud van je lokale map `dist` naar `public_html` + +### Implementatie in een submap + +Bij implementatie in een submap (bijv. `yourdomain.com/pdf-tools/`): + +1. Bouw met de juiste basis-URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Maak de map aan in Hostinger: + - Ga naar **File Manager** → **public_html** + - Maak een nieuwe map: `pdf-tools` +3. Upload de volledige inhoud van `dist` naar `public_html/pdf-tools/` + +## Stap 3: Maak het .htaccess-bestand aan + +Maak een bestand `.htaccess` aan in de hoofdmap van je implementatiemap (`public_html` of `public_html/pdf-tools/`): + +::: warning Belangrijk +Wijzig bij implementatie in een submap `RewriteBase /` naar `RewriteBase /pdf-tools/` (of de naam van je map). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Voorbeeld van .htaccess voor een submap + +Pas voor `yourdomain.com/pdf-tools/` deze regels aan: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Probleemoplossing + +### WASM-bestanden worden niet geladen + +Controleer of de MIME-typen correct zijn ingesteld in `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice-tools werken niet + +De beveiligingsheaders zijn cruciaal voor SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Als de headers niet worden toegepast, neem dan contact op met de support van Hostinger om `mod_headers` in te schakelen. + +### 404-fouten bij het vernieuwen van de pagina + +Controleer of de regel voor de extensie `.html` en de taalroutes correct zijn geconfigureerd. BentoPDF gebruikt statische HTML-bestanden, geen SPA-routing: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limieten voor bestandsuploads + +Hostinger kan limieten voor bestandsgrootte hebben. Upload WASM-bestanden afzonderlijk als de bulkupload mislukt. diff --git a/docs/nl/self-hosting/index.md b/docs/nl/self-hosting/index.md new file mode 100644 index 00000000..1bbf8de4 --- /dev/null +++ b/docs/nl/self-hosting/index.md @@ -0,0 +1,538 @@ +# Zelf hosten + +BentoPDF kun je op je eigen infrastructuur zelf hosten. Deze gids behandelt verschillende implementatiemogelijkheden. + +## Snel aan de slag met Docker / Podman + +De snelste manier om BentoPDF zelf te hosten: + +> [!TIP] +> BentoPDF wordt in twee builds geleverd: +> +> - **Self-Hosted build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Alle PDF-tools, **zonder** de marketingelementen (geen hero, FAQ, testimonials, footer). Gebruik dit voor interne implementaties voor teams of organisaties. Het is **geen** versie met minder functies of een "lite"-versie. +> - **Commercial build**: `ghcr.io/alam00000/bentopdf:latest`. De volledige marketingsite, gebruikt door bentopdf.com zelf en door commerciële licentiehouders met openbare implementaties. +> +> Twijfel je? Haal dan de Self-Hosted build op. + +> [!IMPORTANT] +> Voor het converteren van Office-bestanden is `SharedArrayBuffer` nodig. De app moet daarvoor zowel cross-origin geïsoleerd zijn als vanuit een veilige context worden aangeboden. De officiële image stuurt de vereiste COOP/COEP-headers al mee, maar browsers schakelen `SharedArrayBuffer` nog steeds uit op gewone HTTP-origins in een lokaal netwerk, zoals `http://192.168.x.x`. +> +> Gebruik `http://localhost` alleen voor tests op hetzelfde apparaat. Als gebruikers BentoPDF via een LAN-IP of hostnaam openen, zorg dan voor HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Of met Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Draai BentoPDF als systemd-service. Maak `~/.config/containers/systemd/bentopdf.container` aan: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Zie de [Docker-implementatiegids](/nl/self-hosting/docker) voor de volledige Quadlet-documentatie. + +## Bouwen vanuit de broncode + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Configuratieopties + +### Self-Hosted build (Simple Mode) + +De Self-Hosted build (de `bentopdf-simple` image, ook wel Simple Mode genoemd) is **functioneel identiek** aan de Commercial build: alle PDF-tools zijn aanwezig en werken hetzelfde. Hij verbergt alleen de marketingelementen die uitsluitend zinvol zijn op bentopdf.com zelf of bij een commerciële, openbare implementatie. **Het is geen versie met minder functies of een "lite"-versie.** + +**Wat de Self-Hosted build verbergt** (alleen cosmetisch, er worden geen PDF-functies verwijderd): + +- Navigatiebalk, hero-sectie, functiesectie, FAQ, testimonials, footer +- Wijzigt de paginatitel in "PDF-tools" + +**Wat de Self-Hosted build behoudt** (alles wat daadwerkelijk PDF-werk doet): + +- Alle PDF-tools (samenvoegen, splitsen, bewerken, ondertekenen, OCR, Office-conversie, enz.) +- Ondersteuning voor eigen huisstijl, alle configuratie tijdens het bouwen en tijdens runtime + +De Commercial build (`ghcr.io/alam00000/bentopdf:latest`) is wat bentopdf.com zelf draait en wordt gebruikt door commerciële licentiehouders met openbare implementaties. Hij voegt de hero, FAQ, testimonials en footer toe die op een interne tool niet zinvol zouden zijn. + +Host je BentoPDF zelf voor je team, organisatie of als interne tool, haal dan de Self-Hosted build op: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Zie [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) voor alle details. + +### Commercial build (openbare implementaties met je eigen merk) + +De Commercial build (de `bentopdf` image, zonder het achtervoegsel `-simple`) is wat bentopdf.com zelf draait. Hij bevat de volledige marketingsite (hero, functies, FAQ, testimonials, footer) bovenop alle PDF-tools. Gebruik deze build als je **BentoPDF wilt implementeren als openbare PDF-dienst onder je eigen merk**, bijvoorbeeld: + +- Je draait BentoPDF als gehoste SaaS voor eindgebruikers op je eigen domein +- Je wilt de ervaring van de landingspagina (marketingsecties plus tools), niet alleen de kale toolomgeving +- Je bent commercieel licentiehouder en verwerkt BentoPDF in een commercieel product + +**Draai hem ongewijzigd** (met BentoPDF-huisstijl, handig om de build te bekijken): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Bouw met je eigen merk** (de gebruikelijke commerciële werkwijze): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Elke andere buildoptie (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, WASM-URL-overschrijvingen, enz.) werkt op dezelfde manier als bij de Self-Hosted build. + +::: warning Licenties +De Commercial build draaien is toegestaan onder een van de twee licentieopties van BentoPDF: + +- **AGPL-3.0** (gratis): toegestaan als je implementatie de volledige broncode onder AGPL publiceert, inclusief aanpassingen aan de huisstijl en de omringende bedrijfslogica. +- **Commerciële licentie** ($79 eenmalig): vereist voor closed-source / propriëtaire implementaties waarbij je je huisstijlfork of bedrijfscode niet open source maakt. + +Zie de [Licentiepagina](https://www.bentopdf.com/licensing) voor de volledige vergelijking. AGPL-gelicentieerde WASM-modules (PyMuPDF, Ghostscript, CoherentPDF) worden tijdens runtime vanaf een CDN geladen, dus ze komen niet in je image terecht en veranderen je licentiepositie niet. +::: + +### Basis-URL + +Implementeren in een submap: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Eigen huisstijl + +Vervang tijdens het bouwen het standaard BentoPDF-logo, de naam en de voettekst door je eigen: + +| Variabele | Beschrijving | Standaard | +| ------------------ | ------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Merknaam in de header en footer | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logopad relatief ten opzichte van `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Eigen footer-/copyrighttekst | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Of via Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Eigen huisstijl werkt in zowel de volledige modus als Simple Mode en kan worden gecombineerd met alle andere buildopties (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Specifieke tools uitschakelen + +Verberg afzonderlijke tools voor compliance of beveiliging. Uitgeschakelde tools worden verwijderd van de startpagina, uit zoeken, sneltoetsen, de workflowbouwer en directe URL-toegang. + +Tool-ID's zijn de pagina-URL zonder `.html`: open een tool en kijk naar de URL (bijv. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Tijdens het bouwen** (ingebakken in de bundel): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Tijdens runtime** (geen nieuwe build nodig: koppel een `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Beide methoden kunnen worden gecombineerd: de lijsten worden samengevoegd. + +Je kunt ook specifieke functies in de PDF-editor (bijv. redactie) uitschakelen zonder de hele tool uit te schakelen door `editorDisabledCategories` toe te voegen aan `config.json`. Zie de [Docker-gids](/nl/self-hosting/docker#editorfuncties-uitschakelen) voor de volledige lijst met categorieën. + +## Implementatiegidsen + +Kies je platform: + +- [Vercel](/nl/self-hosting/vercel) +- [Netlify](/nl/self-hosting/netlify) +- [Cloudflare Pages](/nl/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/nl/self-hosting/aws) +- [Hostinger](/nl/self-hosting/hostinger) +- [Nginx](/nl/self-hosting/nginx) +- [Apache](/nl/self-hosting/apache) +- [Docker](/nl/self-hosting/docker) +- [Kubernetes](/nl/self-hosting/kubernetes) +- [CORS Proxy](/nl/self-hosting/cors-proxy) - Vereist voor digitale handtekeningen + +## Veelvoorkomende problemen + +### Word / ODT / Excel / PowerPoint naar PDF blijft hangen (SharedArrayBuffer niet beschikbaar) + +**Symptoom**: Documentconversies op basis van LibreOffice (Word, ODT, Excel, PowerPoint naar PDF) blijven hangen bij ~55% of starten niet. De browserconsole toont mogelijk: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...of `window.crossOriginIsolated` meldt `false`, of de WASM-compilatie meldt `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Oorzaak**: LibreOffice WASM vereist `SharedArrayBuffer`, dat de browser alleen inschakelt wanneer de pagina **cross-origin geïsoleerd** is EN vanuit een **veilige context** wordt aangeboden. Dat betekent dat twee dingen moeten kloppen: + +1. Elke respons bevat beide headers: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. De pagina wordt aangeboden vanaf `https://...` of `http://localhost`. Gewone HTTP op een LAN-IP (bijv. `http://192.168.x.x`) telt NIET als veilig: browsers schakelen `SharedArrayBuffer` daar uit. + +Het verschil tussen `00 61 73 6d / 1f 8b 08 08` is een apart subsymptoom: bij de vooraf gecomprimeerde `.wasm.gz` / `.data.gz`-bestanden ontbreekt de responsheader `Content-Encoding: gzip`, waardoor de browser ruwe gzip-bytes ontvangt in plaats van gedecomprimeerde WASM. + +**Oplossing**: zie de platformspecifieke implementatiegids voor de exacte configuratie: + +- [Nginx →](/nl/self-hosting/nginx#pdf-ondertekenen-of-formulierinvuller-toont-een-lege-viewer-mjs-mime-fout) +- [Apache →](/nl/self-hosting/apache#pdf-ondertekenen-of-formulierinvuller-toont-een-leeg-weergavevenster-mjs-mime-fout) +- [AWS S3 + CloudFront →](/nl/self-hosting/aws#stap-3b-response-headers-policy-vereist-voor-libreoffice-wasm) +- [Cloudflare Pages →](/nl/self-hosting/cloudflare#configuratiebestand) (`_headers`-bestand) +- [Netlify →](/nl/self-hosting/netlify#word-odt-excel-naar-pdf-blijft-hangen-op-55) (`netlify.toml`) +- [Vercel →](/nl/self-hosting/vercel#word-odt-excel-naar-pdf-werkt-niet) (`vercel.json`) +- [Hostinger →](/nl/self-hosting/hostinger#libreoffice-tools-werken-niet) (`.htaccess`) +- [Kubernetes →](/nl/self-hosting/kubernetes#mjs-mime-typefouten-iframe-van-pdf-ondertekenen-pdf-formulier-invullen-leeg) +- **Docker**: wordt automatisch afgehandeld door de meegeleverde nginx-configuratie, geen actie nodig. + +**Controleren**: open de DevTools-console op een willekeurige BentoPDF-pagina en voer uit: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Als de pagina HTTPS of `http://localhost` gebruikt EN beide COEP/COOP-headers op elke respons aanwezig zijn, slagen beide controles. Zit je op `http://192.168.x.x` of een andere niet-loopback HTTP-origin, zorg dan voor HTTPS: een oplossing met alleen headers bestaat niet. + +### `.mjs`-bestanden geleverd als `application/octet-stream` + +**Symptoom**: PDF ondertekenen / PDF-formulier invullen / enkele andere tools tonen een lege viewer of laden niet. De browserconsole meldt: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Oorzaak**: Je webserver of reverse proxy heeft geen MIME-type-koppeling voor `.mjs`-bestanden (de meegeleverde PDF-viewer gebruikt ES-modules met die extensie). Veel standaard serverconfiguraties gebruiken voor onbekende extensies `application/octet-stream`, wat browsers weigeren uit te voeren als ES-modules. + +**Oplossing**: zie de platformspecifieke implementatiegids voor het exacte fragment: + +- [Nginx →](/nl/self-hosting/nginx#pdf-ondertekenen-of-formulierinvuller-toont-een-lege-viewer-mjs-mime-fout) +- [Apache →](/nl/self-hosting/apache#pdf-ondertekenen-of-formulierinvuller-toont-een-leeg-weergavevenster-mjs-mime-fout) +- [AWS S3 + CloudFront →](/nl/self-hosting/aws#stap-2-bouwen-en-uploaden) (zie `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/nl/self-hosting/kubernetes#mjs-mime-typefouten-iframe-van-pdf-ondertekenen-pdf-formulier-invullen-leeg) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: worden automatisch afgehandeld, geen actie nodig. + +**Controleren**: open DevTools → tabblad Netwerk, zoek het mislukte `.mjs`-verzoek en bekijk de responsheader `Content-Type`. Die hoort `application/javascript` te zijn. Is het nog steeds `application/octet-stream`, dan bepaalt een externe reverse proxy of CDN het type mogelijk opnieuw: controleer elke laag in je serveringsketen. + +## WASM-configuratie (AGPL-componenten) + +BentoPDF **bundelt geen** AGPL-gelicentieerde verwerkingsbibliotheken in de broncode, maar **stelt CDN-URL's vooraf in** zodat alle functies direct werken, zonder handmatige configuratie. + +::: tip Standaard zonder configuratie +Sinds v2.0.0 zijn WASM-modules via omgevingsvariabelen vooraf ingesteld om vanaf de jsDelivr CDN te laden. Alle geavanceerde functies werken direct zonder configuratie door de gebruiker. +::: + +| Component | Licentie | Functies | +| --------------- | -------- | ----------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS-conversie, afbeeldingsextractie, tabelextractie | +| **Ghostscript** | AGPL-3.0 | PDF/A-conversie, compressie, rechtzetten, rasteren | +| **CoherentPDF** | AGPL-3.0 | Inhoudsopgave, bijlagen, PDF samenvoegen met bladwijzers | + +### Standaard omgevingsvariabelen + +Deze staan in `.env.production` en worden in de build ingebakken: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### WASM-URL's overschrijven + +Je kunt de standaardwaarden tijdens het bouwen overschrijven voor aangepaste implementaties: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Om een module helemaal uit te schakelen (handmatige configuratie door de gebruiker via Geavanceerde instellingen is dan vereist), stel je de variabele in op een lege tekenreeks. + +Laat voor OCR alle `VITE_TESSERACT_*`-variabelen leeg en gebruik de standaard online bronnen, of stel de worker-, core- en lang-URL's samen in voor zelf gehoste/offline OCR. Bundel je alleen specifieke OCR-talen, stel dan ook `VITE_TESSERACT_AVAILABLE_LANGUAGES` in op dezelfde kommagescheiden codes, zodat de interface alleen geïnstalleerde talen aanbiedt en niet-ondersteunde selecties mislukken met een duidelijke foutmelding. Stel voor volledig offline doorzoekbare PDF-uitvoer ook `VITE_OCR_FONT_BASE_URL` in op de interne map waarin de meegeleverde OCR-lettertypen worden aangeboden. + +Gebruikers kunnen deze standaardwaarden ook op elk moment overschrijven via **Geavanceerde instellingen** in de interface. Overschrijvingen van gebruikers die in de browser zijn opgeslagen, hebben voorrang op de standaardwaarden uit de omgeving. + +### Air-gapped / offline implementatie + +Voor netwerken zonder internettoegang (overheid, zorg, financiële sector, enz.). De WASM-URL's worden tijdens het **bouwen** in de JavaScript ingebakken: de eigenlijke WASM-bestanden worden tijdens runtime door de **browser van de gebruiker** gedownload. Je moet dus alles voorbereiden op een machine met internet en het daarna overbrengen naar het geïsoleerde netwerk. + +#### Geautomatiseerd script (aanbevolen) + +Het meegeleverde script `prepare-airgap.sh` automatiseert het hele proces: het downloadt WASM-pakketten, bouwt de Docker-image en maakt een zelfstandige bundel met een installatiescript. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Dit levert een bundelmap op: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Breng de bundel via USB, een interne artefactrepository of een goedgekeurde methode over naar het air-gapped netwerk. Voer daarna het meegeleverde installatiescript uit: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Het installatiescript laadt de Docker-image, pakt de WASM-bestanden uit en start optioneel de container. + +**Scriptopties:** + +| Vlag | Beschrijving | Standaard | +| ------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------- | +| `--wasm-base-url ` | Waar de WASM's intern worden gehost | _(vereist, wordt gevraagd indien niet opgegeven)_ | +| `--image-name ` | Docker-imagetag | `bentopdf` | +| `--output-dir ` | Uitvoermap voor de bundel | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Simple Mode inschakelen | uit | +| `--base-url ` | Basis-URL van submap (bijv. `/pdf/`) | `/` | +| `--language ` | Standaardtaal van de interface (bijv. `fr`, `de`) | _(geen)_ | +| `--brand-name ` | Eigen merknaam | _(geen)_ | +| `--brand-logo ` | Logopad relatief ten opzichte van `public/` | _(geen)_ | +| `--footer-text ` | Eigen voettekst | _(geen)_ | +| `--ocr-languages ` | Kommagescheiden OCR-talen om te bundelen | `eng` | +| `--list-ocr-languages` | Toon ondersteunde OCR-codes en namen en stop | uit | +| `--search-ocr-language ` | Zoek OCR-codes op naam of afkorting | uit | +| `--dockerfile ` | Te gebruiken Dockerfile | `Dockerfile` | +| `--skip-docker` | Docker-build en export overslaan | uit | +| `--skip-wasm` | WASM-download overslaan (bestaande `.tgz`-bestanden hergebruiken) | uit | + +De interactieve prompt accepteert ook `list` om de volledige lijst met ondersteunde Tesseract-codes te tonen en `search ` om resultaten te vinden, zoals `search german` of `search chi`. + +::: warning Vereiste van dezelfde origin +WASM-bestanden moeten worden aangeboden vanaf dezelfde **origin** als de BentoPDF-app. Web Workers gebruiken `importScripts()`, dat geen scripts cross-origin kan laden. Draait BentoPDF bijvoorbeeld op `https://internal.example.com`, dan moet de WASM-basis-URL ook `https://internal.example.com/wasm` zijn. +::: + +#### Handmatige stappen + +
+Als je het liever handmatig doet, zonder het script + +**Stap 1: Download de WASM- en OCR-pakketten** (op een machine met internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Stap 2: Bouw de Docker-image met interne URL's** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Stap 3: Exporteer de Docker-image** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Stap 4: Breng alles over naar het air-gapped netwerk** + +Kopieer via USB, een interne artefactrepository of een goedgekeurde overdrachtsmethode: + +- `bentopdf.tar`: de Docker-image +- De vijf `.tgz` WASM-/OCR-pakketten uit stap 1 +- De map `tesseract-langdata/` uit stap 1 +- De map `ocr-fonts/` uit stap 1 + +**Stap 5: Installeer binnen het air-gapped netwerk** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Zorg dat de bestanden bereikbaar zijn op de URL's die je in stap 2 hebt ingesteld, waaronder `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` en `.../ocr/fonts`. + +
+ +::: info Bouwen vanuit de broncode in plaats van Docker? +Stel de variabelen in `.env.production` in voordat je `npm run build` uitvoert: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Je eigen WASM-proxy hosten + +Als je AGPL-WASM-bestanden met de juiste CORS-headers wilt aanbieden, kun je een eenvoudige proxy implementeren. Zie de [Cloudflare WASM Proxy-gids](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) voor een voorbeeldimplementatie. + +::: tip Waarom gescheiden? +Deze scheiding zorgt voor: + +- Duidelijke juridische naleving voor commerciële gebruikers +- De kern van BentoPDF blijft onder de dubbele licentie (AGPL-3.0 / Commercieel) +- WASM-bestanden worden tijdens runtime geladen en niet in de broncode gebundeld + ::: + +## Systeemvereisten + +| Vereiste | Minimum | +| -------- | ---------------------------------- | +| Opslag | ~100 MB (kern zonder AGPL-modules) | +| RAM | 512 MB | +| CPU | Elke moderne processor | + +::: tip +BentoPDF is een statische site: er is geen database of backendserver nodig! +::: diff --git a/docs/nl/self-hosting/kubernetes.md b/docs/nl/self-hosting/kubernetes.md new file mode 100644 index 00000000..5ce62052 --- /dev/null +++ b/docs/nl/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Implementeren met Kubernetes + +Kubernetes is misschien overdreven voor een statische site, maar het kan een goede keuze zijn als je al standaardiseert op Helm + GitOps. + +> [!IMPORTANT] +> **Vereiste headers voor Office-bestandsconversie** +> +> Tools op basis van LibreOffice (conversie van Word, Excel, PowerPoint) vereisen deze HTTP-headers voor `SharedArrayBuffer`-ondersteuning: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> De officiële BentoPDF nginx-images bevatten deze headers. In Kubernetes zijn **Ingress-/Gateway-controllers ook reverse proxies**, dus zorg dat deze headers behouden blijven (of voeg ze toe aan de edge). + +## Vereisten + +- Kubernetes-cluster +- Helm v3 +- Een BentoPDF nginx-image (bijv. `ghcr.io/alam00000/bentopdf:`) die op **poort 8080** draait + +## Implementeren met Helm + +### Installeren vanuit deze repo (lokale chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Installeren vanuit GHCR (OCI-chart) + +Als de chart als OCI-artefact op GHCR is gepubliceerd: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Beschikbaar maken + +### Port-forward (snelle test) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (optioneel) + +Schakel Ingress in (voorbeeld voor nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (optioneel) + +Deze chart ondersteunt Gateway API `Gateway` + `HTTPRoute`. + +Voorbeeld (Cloudflare Gateway API-operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Zorgen dat de SharedArrayBuffer-headers blijven werken (Ingress/Gateway) + +### Wat er hoort te gebeuren + +De nginx-configuratie van BentoPDF stelt de vereiste responsheaders in. De meeste Ingress-/Gateway-controllers **laten responsheaders van de upstream ongewijzigd door**. + +### Wat het kan breken + +- Een controller- of edge-beleid dat responsheaders **overschrijft** of **verwijdert** +- Een "security headers"-middleware die andere COOP/COEP-waarden instelt + +### Hoe te controleren + +Voer dit uit tegen je openbare endpoint: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Je zou moeten zien: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Als je Ingress-controller ze niet behoudt + +Voeg de headers toe aan de edge (afhankelijk van de controller). Voorbeeld voor **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` MIME-typefouten (iframe van PDF ondertekenen / PDF-formulier invullen leeg) + +Als de browserconsole `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` toont bij een `.mjs`-verzoek, vervangt een Ingress-/Gateway-controller vóór de BentoPDF nginx de upstream `Content-Type`-header door `application/octet-stream`. + +De nginx van de BentoPDF-image levert `.mjs` al als `application/javascript`. De oplossing is te voorkomen dat de controller de header verwijdert of vervangt. Voor nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Of gebruik een `ResponseHeaderModifier`-filter in Gateway API om `Content-Type: application/javascript` in te stellen voor `.mjs`-paden. Controleer met DevTools → tabblad Netwerk: het mislukte `.mjs`-verzoek zou nu `content-type: application/javascript` moeten tonen. + +### Gebruik je Gateway API en wil je headers afdwingen + +Gateway API ondersteunt een `ResponseHeaderModifier`-filter. Je kunt dit koppelen in `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Ondersteuning voor specifieke filters hangt af van je Gateway-controller. Wordt een filter genegeerd, voeg de headers dan toe aan de edge of controllerlaag. + +## Specifieke tools uitschakelen + +Gebruik een ConfigMap om tools tijdens runtime uit te schakelen zonder de image opnieuw te bouwen: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Koppel het in de aangeboden map: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Tool-ID's zijn de pagina-URL zonder `.html`: open een tool en kijk naar de URL (bijv. `edit-pdf`, `merge-pdf`, `compress-pdf`). Uitgeschakelde tools worden verborgen op de startpagina, in zoeken, sneltoetsen, de workflowbouwer en bij directe URL-toegang. Zie de [Docker-gids](/nl/self-hosting/docker#specifieke-tools-uitschakelen) voor de volledige lijst met opties. diff --git a/docs/nl/self-hosting/netlify.md b/docs/nl/self-hosting/netlify.md new file mode 100644 index 00000000..0bb65ebd --- /dev/null +++ b/docs/nl/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Implementeren op Netlify + +[Netlify](https://netlify.com) biedt uitstekende hosting voor statische sites met een royale gratis laag. + +## Implementeren met één klik + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Handmatig implementeren + +### Stap 1: Repository koppelen + +1. Log in bij [Netlify](https://app.netlify.com) +2. Klik op "Add new site" → "Import an existing project" +3. Koppel je GitHub-account +4. Selecteer je BentoPDF-fork + +### Stap 2: Buildinstellingen configureren + +| Instelling | Waarde | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Stap 3: Implementeren + +Klik op "Deploy site" en wacht tot de build klaar is. + +## Configuratiebestand + +Maak `netlify.toml` aan in de hoofdmap van je project: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Belangrijk +De headers `Cross-Origin-Embedder-Policy` en `Cross-Origin-Opener-Policy` zijn vereist voor conversies van Word/ODT/Excel/PowerPoint naar PDF. Zonder deze headers is `SharedArrayBuffer` niet beschikbaar en kan de LibreOffice WASM-engine niet worden geïnitialiseerd. + +De `Content-Encoding: gzip`-headers op de bestanden `.wasm.gz` en `.data.gz` zorgen ervoor dat de browser ze automatisch decomprimeert. Zonder deze headers ontvangt de browser ruwe gzip-bytes en mislukt de WASM-compilatie. +::: + +## Omgevingsvariabelen + +Stel deze in via Site settings → Environment variables: + +| Variabele | Beschrijving | +| ----------------------- | ------------------------------------------------------------------------ | +| `SIMPLE_MODE` | Stel in op `true` voor een minimale build | +| `VITE_BRAND_NAME` | Eigen merknaam (vervangt "BentoPDF") | +| `VITE_BRAND_LOGO` | Logopad relatief ten opzichte van `public/` (bijv. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Eigen footer-/copyrighttekst | +| `VITE_DEFAULT_LANGUAGE` | Standaardtaal van de interface (bijv. `fr`, `de`, `es`) | + +## Eigen domein + +1. Ga naar Site settings → Domain management +2. Klik op "Add custom domain" +3. Volg de DNS-configuratie-instructies + +## Grote media + +Overweeg voor grote WASM-bestanden [Netlify Large Media](https://docs.netlify.com/large-media/overview/) in te schakelen: + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Probleemoplossing + +### Word/ODT/Excel naar PDF blijft hangen op 55% + +Als documentconversies blijven hangen op 55%, open dan de DevTools-console en controleer: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Als `crossOriginIsolated` `false` is, worden de COEP/COOP-headers uit je `netlify.toml` niet toegepast. Zorg dat het bestand in de hoofdmap van je project staat en implementeer opnieuw. + +Als je `expected magic word 00 61 73 6d, found 1f 8b 08 08` in de console ziet, ontbreken bij de `.wasm.gz`-bestanden de `Content-Encoding: gzip`-headers. Zorg dat de `[[headers]]`-blokken voor `soffice.wasm.gz` en `soffice.data.gz` in je `netlify.toml` staan. + +### Build mislukt + +Controleer de compatibiliteit van de Node-versie: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Trage eerste lading + +Schakel assetoptimalisatie in via Site settings → Build & deploy → Asset optimization. diff --git a/docs/nl/self-hosting/nginx.md b/docs/nl/self-hosting/nginx.md new file mode 100644 index 00000000..6c735860 --- /dev/null +++ b/docs/nl/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Implementeren met Nginx + +Host BentoPDF op je eigen server met Nginx. + +## Vereisten + +- Ubuntu/Debian-server +- Nginx geïnstalleerd +- SSL-certificaat (aanbevolen: Let's Encrypt) + +## Stap 1: Bouw het project + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Om de huisstijl aan te passen, stel je omgevingsvariabelen in vóór het bouwen: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Stap 2: Bestanden kopiëren + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Stap 3: Nginx-configuratie + +Maak `/etc/nginx/sites-available/bentopdf` aan: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Stap 4: De site inschakelen + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Stap 5: SSL met Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Implementatie in een submap + +Om te hosten op `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Bouw met: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Prestaties afstellen + +Voeg toe aan `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Probleemoplossing + +### WASM wordt niet geladen + +Zorg dat het MIME-type is ingesteld: + +```nginx +types { + application/wasm wasm; +} +``` + +### PDF ondertekenen of formulierinvuller toont een lege viewer (`.mjs` MIME-fout) + +Als de browserconsole het volgende toont: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...en het mislukte verzoek eindigt op `.mjs`, dan mist in je nginx de koppeling `.mjs → application/javascript`. De meegeleverde PDF-viewer (gebruikt door PDF ondertekenen, PDF-formulier invullen en een paar andere tools) levert ES-modulebestanden met de extensie `.mjs`, en de standaard `mime.types` van nginx bevat die niet. + +Los dit op door `mjs` toe te voegen aan de bestaande regel `application/javascript` in `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> Voeg GEEN _tweede_ regel `application/javascript` toe: nginx leest `mime.types` regel voor regel en slechts één koppeling van type naar extensie wint, dus een tweede regel wordt op sommige versies stilzwijgend genegeerd. Pas de bestaande regel aan door `mjs` naast `js` toe te voegen. + +Of overschrijf het lokaal in je serverblok (geen globale bestandswijziging): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Laad nginx opnieuw na de wijziging: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Om te bevestigen: zoek in browser DevTools → tabblad Netwerk het mislukte `.mjs`-verzoek en controleer de responsheader `Content-Type`. Die moet nu `application/javascript` zijn, niet `application/octet-stream`. + +### Word/ODT/Excel naar PDF werkt niet + +LibreOffice WASM vereist `SharedArrayBuffer`, waarvoor de headers `Cross-Origin-Embedder-Policy` en `Cross-Origin-Opener-Policy` nodig zijn. Ook is een veilige context nodig, dus `http://localhost` werkt voor lokaal testen, maar `http://192.168.x.x` of andere LAN-IP's vereisen meestal HTTPS. Let op: nginx `add_header`-directives in een `location`-blok **overschrijven** `add_header`-directives op serverniveau, ze worden niet samengevoegd. Elk `location`-blok met eigen `add_header` moet de COEP/COOP-headers bevatten. + +Controleren met: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Gebruik je een reverse proxy vóór nginx, zorg dan dat die deze headers behoudt. + +### 502 Bad Gateway + +Controleer de Nginx-foutlogboeken: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/nl/self-hosting/vercel.md b/docs/nl/self-hosting/vercel.md new file mode 100644 index 00000000..f080e0cb --- /dev/null +++ b/docs/nl/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Implementeren op Vercel + +[Vercel](https://vercel.com) biedt de eenvoudigste implementatie-ervaring voor statische sites. + +## Implementeren met één klik + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Handmatig implementeren + +### Stap 1: Fork de repository + +Fork [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) naar je GitHub-account. + +### Stap 2: Importeren in Vercel + +1. Ga naar [vercel.com/new](https://vercel.com/new) +2. Selecteer je geforkte repository +3. Configureer het project: + +| Instelling | Waarde | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Stap 3: Omgevingsvariabelen (optioneel) + +Voeg deze toe indien nodig: + +| Variabele | Beschrijving | +| ----------------------- | ------------------------------------------------------------------------ | +| `SIMPLE_MODE` | Stel in op `true` voor een minimale interface | +| `VITE_BRAND_NAME` | Eigen merknaam (vervangt "BentoPDF") | +| `VITE_BRAND_LOGO` | Logopad relatief ten opzichte van `public/` (bijv. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Eigen footer-/copyrighttekst | +| `VITE_DEFAULT_LANGUAGE` | Standaardtaal van de interface (bijv. `fr`, `de`, `es`) | + +### Stap 4: Implementeren + +Klik op "Deploy" en wacht tot de build klaar is. + +## Eigen domein + +1. Ga naar de projectinstellingen +2. Ga naar "Domains" +3. Voeg je eigen domein toe +4. Configureer DNS zoals aangegeven + +## Beperkingen + +::: warning Grote bestanden +De serverless functions van Vercel hebben een limiet van 50 MB. Omdat BentoPDF een statische site is, zou dit je niet moeten raken, maar WASM-modules zijn groot (~100 MB in totaal). Zorg dat ze worden aangeboden vanuit de map `/public`. +::: + +## Probleemoplossing + +### Build-timeout + +Als builds een timeout geven, probeer dan: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 bij vernieuwen + +Voeg een `vercel.json` toe voor SPA-routing: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel naar PDF werkt niet + +LibreOffice WASM-conversies vereisen `SharedArrayBuffer`, waarvoor deze responsheaders op alle pagina's nodig zijn: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +De vooraf gecomprimeerde bestanden `.wasm.gz` en `.data.gz` hebben ook `Content-Encoding: gzip` nodig, zodat de browser ze decomprimeert. + +Voeg deze toe aan je `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Controleer dit door de DevTools-console te openen en `console.log(window.crossOriginIsolated)` uit te voeren: het moet `true` teruggeven. diff --git a/docs/nl/tools/add-attachments.md b/docs/nl/tools/add-attachments.md new file mode 100644 index 00000000..feb8eeeb --- /dev/null +++ b/docs/nl/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Bijlagen toevoegen +description: Sluit bestanden van elk type in een PDF in, op documentniveau of gekoppeld aan specifieke pagina's. +--- + +# Bijlagen toevoegen + +Sluit een of meer bestanden rechtstreeks in een PDF-document in. Bijlagen kunnen op documentniveau worden toegevoegd (zichtbaar in het bijlagenpaneel van elke PDF-lezer) of aan specifieke pagina's worden gekoppeld. + +## Hoe het werkt + +1. Upload de PDF waaraan je bestanden wilt toevoegen. +2. Selecteer via de uploadzone de bestanden die je wilt insluiten (elk bestandstype). +3. Kies het bijlageniveau: **Document** (standaard) of **Pagina**. +4. Kies je Pagina-niveau, voer dan een paginabereik in (bijv. `1-3` of `5`). +5. Klik op de verwerkknop. De aangepaste PDF wordt gedownload met je bestanden ingesloten. + +## Functies + +- Voeg elk bestandstype toe: afbeeldingen, spreadsheets, archieven, uitvoerbare bestanden, alles +- Bijlagen op documentniveau of paginaniveau +- Meerdere bestanden in één bewerking toevoegen +- Toont bestandsnamen en groottes van alle geselecteerde bijlagen +- De uitvoer behoudt de originele PDF-inhoud met de ingesloten bestanden erbij + +## Opties + +| Optie | Beschrijving | +| ------------------ | ------------------------------------------------------------------------------ | +| **Documentniveau** | Voegt bestanden toe aan de PDF als geheel, toegankelijk via het bijlagenpaneel | +| **Paginaniveau** | Voegt bestanden toe aan specifieke pagina's, opgegeven via een paginabereik | + +## Toepassingen + +- Brondata (Excel-bestanden, CSV's) bundelen met een PDF-rapport +- Originele afbeeldingsbestanden toevoegen aan een PDF met een fotografieportfolio +- Ondersteunende documenten insluiten in een contract of voorstel +- Aanvullend materiaal toevoegen aan specifieke pagina's van een trainingshandleiding + +## Tips + +- Bijlagen op documentniveau worden door de meeste PDF-lezers ondersteund. Bijlagen op paginaniveau zijn mogelijk niet in alle viewers zichtbaar. +- Er is geen limiet voor de bestandsgrootte van bijlagen, maar zeer grote ingesloten bestanden vergroten de PDF evenredig. + +## Gerelateerde tools + +- [Bijlagen Uitpakken](./extract-attachments) +- [Bijlagen bewerken](./edit-attachments) +- [PDF samenvoegen](./merge-pdf) diff --git a/docs/nl/tools/add-blank-page.md b/docs/nl/tools/add-blank-page.md new file mode 100644 index 00000000..5a6b04fc --- /dev/null +++ b/docs/nl/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Blanco pagina toevoegen +description: Voeg een of meer blanco pagina's op elke gewenste positie in een PDF-document in. +--- + +# Blanco pagina toevoegen + +Voeg lege pagina's in een PDF in op een positie die je zelf opgeeft. Jij bepaalt waar de blanco pagina's komen en hoeveel er worden toegevoegd. + +## Hoe het werkt + +1. Upload een PDF-bestand. De tool toont het aantal pagina's. +2. Voer de **positie** in waar de blanco pagina's moeten komen. Gebruik `0` om helemaal vooraan in te voegen, of het totale aantal pagina's om aan het einde toe te voegen. +3. Voer het **aantal** blanco pagina's in dat je wilt toevoegen (standaard 1). +4. Klik op de verwerkknop. De aangepaste PDF wordt gedownload met de blanco pagina's erin. + +## Functies + +- Voeg in op elke positie: begin, midden of einde van het document +- Meerdere blanco pagina's in één bewerking toevoegen +- De positiehint wordt dynamisch bijgewerkt op basis van het aantal pagina's van de geüploade PDF +- Blanco pagina's in standaard A4-formaat + +## Toepassingen + +- Een blanco scheidingspagina toevoegen tussen de onderdelen van een samengesteld document +- Blanco pagina's invoegen voor een goede uitlijning bij dubbelzijdig printen +- Ruimte toevoegen voor handgeschreven notities in een geprinte studiegids +- Een document aanvullen om aan een minimaal aantal pagina's te voldoen + +## Tips + +- Positie `0` voegt in vóór de eerste pagina. Een positie gelijk aan het totale aantal pagina's voegt toe na de laatste pagina. +- Wil je inhoud (niet alleen blanco pagina's) op een specifieke positie invoegen, gebruik dan [PDF Multitool](./pdf-multi-tool) om een andere PDF na een bepaalde pagina in te voegen. + +## Gerelateerde tools + +- [Ordenen & Dupliceren](./organize-pdf) +- [PDF Multitool](./pdf-multi-tool) +- [PDF samenvoegen](./merge-pdf) diff --git a/docs/nl/tools/add-page-labels.md b/docs/nl/tools/add-page-labels.md new file mode 100644 index 00000000..fcdf7d61 --- /dev/null +++ b/docs/nl/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Paginalabels toevoegen +description: Voeg PDF-paginalabels toe met Romeinse cijfers, letter-voorvoegsels, aangepaste nummering en meerdere regels per document. +--- + +# Paginalabels toevoegen + +Paginalabels bepalen hoe paginanummers in PDF-viewers worden weergegeven (het nummer in de werkbalk, niet op de pagina zelf gedrukt). Met deze tool wijs je verschillende labelschema's toe aan verschillende paginabereiken: Romeinse cijfers voor de inleiding, gewone cijfers voor de hoofdtekst, bijlagen met letters en meer. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. Het optiespaneel verschijnt met standaard één labelregel. +3. Stel elke regel in met een paginabereik, stijl, optioneel voorvoegsel en startwaarde. +4. Klik op **Regel toevoegen** om extra regels voor andere secties te maken. +5. Klik op **Paginalabels toevoegen** om alle regels toe te passen en het resultaat te downloaden. + +## Opties + +Elke labelregel heeft deze instellingen: + +- **Paginabereik** -- Op welke pagina's de regel van toepassing is. Laat leeg voor alle pagina's. Ondersteunt bereiken zoals `1-4`, `7`, `odd` of `1-9,30-40`. +- **Labelstijl** -- Decimaal Arabisch, Romeinse kleine letters (i, ii, iii), Romeinse hoofdletters (I, II, III), kleine letters (a, b, c), hoofdletters (A, B, C) of Geen label (alleen voorvoegsel). +- **Labelvoorvoegsel** -- Optionele tekst vóór elk label, zoals "A-" voor labels als A-1, A-2, A-3. +- **Startwaarde** -- Het getal waarmee het tellen begint. Standaard 1. Stel in op 0 voor nummering vanaf nul. +- **Nummering voortzetten over losse bereiken** -- Schakel dit in als een regel niet-aaneengesloten pagina's omvat (zoals `1-9,30-40` of `odd`) en je wilt dat de nummering doorloopt. +- **Bestaande paginalabels verwijderen** -- Standaard aangevinkt. Wist eventuele eerdere labels voordat je nieuwe regels worden toegepast. + +## Functies + +- Meerdere labelregels per document voor complexe nummeringsschema's +- Zes labelstijlen die alle gangbare nummeringssystemen dekken +- Ondersteuning voor eigen voorvoegsels voor labels per sectie +- Ondersteuning voor losse bereiken met doorlopende nummering +- Optie om bestaande labels te behouden of te verwijderen + +## Toepassingen + +- Romeinse cijfers (i, ii, iii) instellen voor het voorwoord van een boek en gewone cijfers voor de hoofdtekst +- Bijlagepagina's labelen met letter-voorvoegsels zoals "A-1", "A-2", "B-1", "B-2" +- Paginalabels corrigeren in een gescand document waarvan de fysieke paginanummers niet overeenkomen met de PDF-paginavolgorde +- Nummering vanaf nul toevoegen voor technische documenten + +## Tips + +- Paginalabels zijn metadata die PDF-viewers in hun navigatiewerkbalk tonen. Ze worden niet op de pagina zelf afgedrukt. Gebruik voor zichtbare nummers [Paginanummers](./page-numbers). +- Voor deze tool moet CoherentPDF (CPDF) zijn ingesteld in je WASM-instellingen. Is dat niet het geval, dan word je gevraagd het in te stellen. + +## Gerelateerde tools + +- [Paginanummers](./page-numbers) +- [Bates-nummering](./bates-numbering) +- [Bladwijzers bewerken](./bookmark) diff --git a/docs/nl/tools/add-stamps.md b/docs/nl/tools/add-stamps.md new file mode 100644 index 00000000..14752590 --- /dev/null +++ b/docs/nl/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Stempels toevoegen +description: Voeg afbeeldingsstempels toe aan je PDF-pagina's met een geïntegreerde annotatiewerkbalk en vermelding van de gebruikersnaam. +--- + +# Stempels toevoegen + +Plaats afbeeldingsstempels op je PDF-pagina's met een ingebouwde viewer met een stempelwerkbalk voor annotaties. Stempels kunnen je naam bevatten, handig voor goedkeuringsprocessen, beoordelingen en het markeren van documenten. + +## Hoe het werkt + +1. Voer je naam in bij het veld **Stempelgebruikersnaam**. Deze naam verschijnt op de stempels die je maakt. +2. Upload je PDF-bestand door te klikken of het naar de uploadzone te slepen. +3. De stempeleditor opent met je document geladen in een viewer. +4. Gebruik het afbeeldingsstempel-gereedschap in de werkbalk om stempels te kiezen en op elke pagina te plaatsen. +5. Verplaats en vergroot of verklein de stempels naar wens. +6. Klik op **Gestempelde PDF opslaan** om het resultaat te downloaden. + +## Functies + +- Geïntegreerde PDF-viewer met een stempelspecifieke annotatiewerkbalk +- Vermelding van de gebruikersnaam op gemaakte stempels +- Afbeeldingsstempels plaatsen op elke pagina +- Positioneren en formaat wijzigen met slepen +- Automatische viewergrootte op basis van de beeldverhouding van de pagina +- Bestandsweergave met naam en grootte + +## Toepassingen + +- "APPROVED"- of "REVIEWED"-afbeeldingsstempels toevoegen aan documenten in een beoordelingsproces +- Bedrijfszegels of notarisstempels als afbeelding op officiële documenten plaatsen +- Pagina's markeren met "RECEIVED"-stempels inclusief de naam van de beoordelaar +- Kwaliteitscontrolestempels toevoegen aan inspectierapporten + +## Tips + +- Stel je stempelgebruikersnaam in voordat je de PDF uploadt. De gebruikersnaam wordt in de metadata van de stempel opgenomen. +- De viewer past zijn hoogte aan op basis van de beeldverhouding van de eerste pagina van de PDF, voor optimale weergave. +- Voor tekstwatermerken in plaats van afbeeldingsstempels gebruik je de tool [Watermerk toevoegen](./add-watermark). + +## Gerelateerde tools + +- [PDF ondertekenen](./sign-pdf) +- [Watermerk toevoegen](./add-watermark) +- [PDF-editor](./edit-pdf) diff --git a/docs/nl/tools/add-watermark.md b/docs/nl/tools/add-watermark.md new file mode 100644 index 00000000..d45b8a27 --- /dev/null +++ b/docs/nl/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Watermerk toevoegen +description: Stempel tekst- of afbeeldingswatermerken op PDF-pagina's met een visuele sleep-en-neerzet-editor en live voorbeeld. +--- + +# Watermerk toevoegen + +Voeg tekst- of afbeeldingswatermerken toe aan je PDF-pagina's met een visuele editor. Je positioneert het watermerk door het direct in het voorbeeld te slepen, past het formaat aan met de hoekgrepen en stelt dekking, rotatie, lettertype en kleur in. Elke pagina kan een eigen watermerkpositie hebben, of je past hetzelfde watermerk in één keer op alle pagina's toe. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. De editor opent met een live voorbeeld van de eerste pagina en een versleepbare watermerklaag. +3. Kies met de schakelknoppen tussen de modus **Tekst** of **Afbeelding**. +4. Stel het watermerk in via het zijpaneel. +5. Sleep het watermerk in het voorbeeld naar de gewenste plek. Gebruik de hoekgrepen om het formaat te wijzigen. +6. Blader tussen pagina's om watermerken per pagina in te stellen, of laat **Op alle pagina's toepassen** aangevinkt. +7. Klik op **Watermerk toevoegen** om te verwerken en te downloaden. + +## Opties + +**Instellingen voor tekstwatermerk:** + +- **Tekst** -- De tekst van het watermerk (bijv. "VERTROUWELIJK", "CONCEPT"). +- **Lettergrootte** -- Van 10 tot 200 punten. Standaard 72. +- **Kleur** -- Elke kleur via de kleurkiezer. +- **Dekking** -- Regel de transparantie van volledig transparant tot volledig dekkend. +- **Rotatie** -- Draai de watermerktekst van -180 tot 180 graden. + +**Instellingen voor afbeeldingswatermerk:** + +- **Afbeelding uploaden** -- Upload een PNG, JPG of ander afbeeldingsbestand om als watermerk te gebruiken. +- **Dekking** -- Regel de transparantie van de afbeelding. +- **Schaal** -- Wijzig het formaat van het afbeeldingswatermerk. + +**Lay-outinstellingen:** + +- **Enkel** -- Eén watermerk per pagina, gepositioneerd door te slepen of met de positievoorinstellingen. +- **Getegeld** -- Herhaalt het watermerk over de hele pagina in een diagonaal raster dat de rotatiehoek volgt, zodat het merk het document van rand tot rand bedekt. +- **Horizontale ruimte** -- Afstand tussen tegels in de tekstrichting, als percentage van de breedte van het watermerk (alleen in getegelde modus). +- **Verticale ruimte** -- Afstand tussen tegelrijen, als percentage van de hoogte van het watermerk (alleen in getegelde modus). + +**Algemene instellingen:** + +- **Op alle pagina's toepassen** -- Indien aangevinkt, geldt hetzelfde watermerk voor elke pagina. Schakel uit om per pagina afzonderlijke watermerken in te stellen. +- **Paginabereik** -- Geef aan welke pagina's het watermerk krijgen (bijv. "1-3, 5, 7-9" of "all"). + +## Functies + +- Visueel positioneren met slepen in een live PDF-voorbeeld +- Watermerk met aanpasbaar formaat via hoekgrepen +- Tekst- en afbeeldingsmodus voor watermerken +- Enkele of paginavullende getegelde (herhalende) lay-out met instelbare tussenruimte +- Watermerk per pagina of globaal toepassen +- Pagina voor pagina bladeren in het voorbeeld +- Bediening voor dekking en rotatie +- Filteren op paginabereik + +## Toepassingen + +- Conceptdocumenten markeren met "CONCEPT" voordat ze ter beoordeling worden rondgestuurd +- "VERTROUWELIJK"-watermerken toevoegen aan gevoelige financiële rapporten +- Documenten voorzien van een bedrijfslogo als afbeeldingswatermerk +- "SAMPLE" stempelen op productdocumentatie die met prospects wordt gedeeld +- Auteursrechtvermeldingen toevoegen aan verspreid PDF-materiaal + +## Tips + +- Voor diagonale watermerken over de pagina stel je een rotatie van ongeveer 45 graden in en vergroot je de lettergrootte. +- Getegelde modus maakt een document veel lastiger te hergebruiken na bijsnijden, omdat het verwijderen van één merk tientallen andere laat staan. Verlaag de dekking bij tegelen zodat de onderliggende tekst leesbaar blijft. +- Afbeeldingswatermerken met transparante achtergrond (PNG-formaat) gaan natuurlijker op in de inhoud van het document. +- Heb je op verschillende pagina's een andere watermerktekst nodig, schakel dan "Op alle pagina's toepassen" uit en blader pagina voor pagina. + +## Gerelateerde tools + +- [Koptekst en voettekst](./header-footer) +- [Stempels toevoegen](./add-stamps) +- [Bates-nummering](./bates-numbering) +- [PDF ondertekenen](./sign-pdf) diff --git a/docs/nl/tools/adjust-colors.md b/docs/nl/tools/adjust-colors.md new file mode 100644 index 00000000..0500b08f --- /dev/null +++ b/docs/nl/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Kleuren aanpassen +description: Stem helderheid, contrast, verzadiging, tint, temperatuur, kleurzweem, gamma en sepia in je PDF fijn af. +--- + +# Kleuren aanpassen + +Een complete toolkit voor kleurcorrectie van PDF's. Pas acht onafhankelijke parameters aan -- helderheid, contrast, verzadiging, tintverschuiving, temperatuur, kleurzweem, gamma en sepia -- met een live voorbeeld dat meebeweegt terwijl je elke schuifregelaar verplaatst. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. De editor opent met een voorbeeld van de eerste pagina en een paneel met kleurinstellingen. +3. Beweeg de schuifregelaars om elke kleurparameter aan te passen. Het voorbeeld wordt in realtime bijgewerkt. +4. Klik op **Herstellen** om alle schuifregelaars terug te zetten naar hun standaardpositie. +5. Klik op **Toepassen** om alle pagina's te verwerken en de aangepaste PDF te downloaden. + +## Opties + +- **Helderheid** -- Maak de hele pagina lichter of donkerder (-100 tot +100). +- **Contrast** -- Vergroot of verklein het verschil tussen lichte en donkere gebieden (-100 tot +100). +- **Verzadiging** -- Versterk of verminder de kleurintensiteit (-100 tot +100). Bij -100 is het resultaat grijswaarden. +- **Tintverschuiving** -- Draai het kleurenwiel om alle kleuren gelijkmatig te verschuiven. +- **Temperatuur** -- Verschuif kleuren naar warmer (geel/oranje) of koeler (blauw). +- **Kleurzweem** -- Voeg een groene of magenta zweem toe. +- **Gamma** -- Pas de helderheid van de middentonen aan met een gammacurve. Waarden onder 1,0 maken middentonen donkerder; waarden boven 1,0 maken ze lichter. +- **Sepia** -- Pas een klassiek sepia-effect toe. Hogere waarden geven een sterkere bruine tint. + +## Functies + +- Acht onafhankelijk instelbare kleurparameters +- Live voorbeeld dat direct reageert op wijzigingen aan de schuifregelaars +- Herstelknop om snel terug te gaan naar de standaardwaarden +- Verwerkt alle pagina's in het document +- Werkt met elke PDF-inhoud (tekst, afbeeldingen, graphics) + +## Toepassingen + +- Een donkere scan opfleuren of overbelichte pagina's corrigeren +- Een kleurrijk document ontdoen van kleur om inkt te besparen voor het printen +- Een sepiatint toepassen voor een antieke uitstraling van certificaten of onderscheidingen +- De kleurtemperatuur corrigeren van foto's die in een PDF zijn ingesloten +- Het contrast verhogen van vervaagde of gescande documenten van lage kwaliteit + +## Tips + +- Voor een snelle conversie naar grijswaarden sleep je de verzadigingsregelaar helemaal naar -100. +- De gammaregelaar is vooral handig om de leesbaarheid van gescande documenten te verbeteren waarbij de middentonen te donker of te licht zijn. +- Net als de andere beeldeffecttools rastert deze tool elke pagina. De uitvoer is afbeeldingsgebaseerd, dus tekst is niet selecteerbaar. + +## Gerelateerde tools + +- [Kleuren omkeren](./invert-colors) +- [Scannereffect](./scanner-effect) +- [Achtergrondkleur](./background-color) diff --git a/docs/nl/tools/alternate-merge.md b/docs/nl/tools/alternate-merge.md new file mode 100644 index 00000000..91cff1f2 --- /dev/null +++ b/docs/nl/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Pagina's afwisselen en mixen +description: Voeg PDF's samen door pagina's van elk bestand afwisselend te mixen, met behoud van bladwijzers. +--- + +# Pagina's afwisselen en mixen + +Meng pagina's van meerdere PDF-bestanden zodat ze elkaar afwisselen. Dit is de tool voor als een gewone samenvoeging bestanden gewoon achter elkaar zou plakken, maar je pagina 1 van bestand A wilt, dan pagina 1 van bestand B, dan pagina 2 van bestand A, enzovoort. + +## Hoe het werkt + +1. Upload minstens twee PDF-bestanden via de uploadzone. +2. De tool toont elk bestand met het aantal pagina's en de bestandsgrootte. +3. Sleep de grepen om te bepalen van welk bestand de pagina's als eerste komen in de afwisselende volgorde. +4. Klik op **Pagina's Mixen** om de gemengde uitvoer te maken. +5. Het resultaat wordt gedownload als `alternated-mixed.pdf`. + +## Functies + +- Wisselt pagina's af over een willekeurig aantal PDF's (minimaal twee) +- Bestanden herordenen met slepen om de afwisselingsvolgorde te bepalen +- Behoudt bladwijzers uit de brondocumenten +- Toont het aantal pagina's en de bestandsgrootte van elk geüpload bestand +- Verwerkt via een eigen web worker voor een responsieve interface + +## Toepassingen + +- Dubbelzijdige scans weer in elkaar zetten wanneer oneven en even pagina's apart zijn gescand +- Vragenbladen combineren met antwoordsleutels zodat elke vraag door het antwoord wordt gevolgd +- Tweetalige documenten pagina voor pagina samenvoegen (bijv. Engels op de ene kant, vertaling op de volgende) +- Voor- en achterkant van een enkelzijdige scanner afwisselend samenvoegen + +## Tips + +- Hebben je bron-PDF's een verschillend aantal pagina's, dan zijn de pagina's van het kortere document als eerste op en komen de resterende pagina's van het langere document aan het einde. +- De bestandsvolgorde is belangrijk -- het eerste bestand in de lijst levert de eerste pagina van de uitvoer. Sleep om te herschikken indien nodig. + +## Gerelateerde tools + +- [PDF samenvoegen](./merge-pdf) +- [Ordenen & Dupliceren](./organize-pdf) +- [PDF splitsen](./split-pdf) diff --git a/docs/nl/tools/background-color.md b/docs/nl/tools/background-color.md new file mode 100644 index 00000000..2473ff4a --- /dev/null +++ b/docs/nl/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Achtergrondkleur +description: Wijzig de achtergrondkleur van elke pagina in je PDF en behoud alle inhoud erboven. +--- + +# Achtergrondkleur + +Stel een effen achtergrondkleur in achter alle bestaande inhoud van je PDF. De tool maakt op elke pagina een gekleurde rechthoek en legt de originele inhoud erbovenop, zodat tekst, afbeeldingen en graphics volledig zichtbaar blijven tegen de nieuwe achtergrond. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. Kies een achtergrondkleur met de kleurkiezer. De standaard is lichtgeel (#FFFFCC). +3. Klik op **Achtergrondkleur wijzigen** om te verwerken. +4. De bijgewerkte PDF wordt automatisch gedownload. + +## Opties + +- **Achtergrondkleur** -- Een standaard kleurkiezer voor elke effen kleur. Standaard lichtgeel. + +## Functies + +- Past een uniforme achtergrondkleur toe op elke pagina +- Behoudt alle originele inhoud (tekst, afbeeldingen, vectorgraphics) bovenop de gekleurde laag +- Behoudt de originele paginaafmetingen +- Werkt met documenten van elk aantal pagina's + +## Toepassingen + +- Een lichte crème- of ivoorkleurige achtergrond toevoegen voor een zachtere, papierachtige uitstraling +- Documentsets met kleuren indelen door verschillende achtergrondkleuren per categorie toe te passen +- Visueel onderscheidende versies van hetzelfde document maken voor verschillende doelgroepen +- Een lichte achtergrondtint toevoegen om de leesbaarheid te verbeteren bij het projecteren van documenten op een scherm + +## Tips + +- Lichte, gedempte kleuren werken het best. Een zeer donkere achtergrond maakt tekst moeilijk leesbaar, tenzij de tekst al lichtgekleurd is. +- Wil je zowel de achtergrond- als de tekstkleur wijzigen, pas dan eerst de achtergrondkleur toe en gebruik daarna [Tekstkleur Wijzigen](./text-color) op het resultaat. +- Deze tool werkt op het structurele niveau van de PDF (geen rasterisatie), dus tekst blijft selecteerbaar en doorzoekbaar in de uitvoer. + +## Gerelateerde tools + +- [Tekstkleur Wijzigen](./text-color) +- [Kleuren omkeren](./invert-colors) +- [Kleuren aanpassen](./adjust-colors) diff --git a/docs/nl/tools/bates-numbering.md b/docs/nl/tools/bates-numbering.md new file mode 100644 index 00000000..8787dadc --- /dev/null +++ b/docs/nl/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates-nummering +description: Pas Bates-nummers toe op een of meer PDF's met aanpasbare sjablonen, opvulling, lettertypen en positionering. +--- + +# Bates-nummering + +Bates-nummering stempelt opeenvolgende identificatiecodes op elke pagina van je PDF's. Het is de standaardmethode om documenten te labelen in rechtszaken, audits en compliance-processen. Deze tool ondersteunt meerdere bestanden en aanpasbare sjablonen, en levert afzonderlijk genummerde PDF's of één ZIP-archief. + +## Hoe het werkt + +1. Upload een of meer PDF-bestanden. Je kunt meerdere bestanden tegelijk slepen. +2. Kies een stijlvoorinstelling of maak een eigen sjabloon. +3. Stel de positie, het lettertype, de grootte, de kleur en de startnummers in. +4. Klik op **Bates-nummers toepassen** om te verwerken. +5. Een enkel bestand wordt direct gedownload. Meerdere bestanden worden als ZIP-archief gedownload. + +## Opties + +- **Stijlvoorinstelling** -- Kies uit ingebouwde indelingen: + - Exhibit + Case + Bates + Page (bijv. "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (zonder paginanummer) + - Case + Bates + - Alleen Bates-nummer (bijv. "000001") + - Aangepast (schrijf je eigen sjabloon) +- **Stijl aanpassen** -- Een sjabloontekenreeks met plaatshouders: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Bates-opvulling** -- Aantal cijfers (3 tot 6) voor Bates-nummers met voorloopnullen. Alleen zichtbaar in de aangepaste modus. +- **Positie** -- Koptekst of voettekst, links, midden of rechts. +- **Bates begint bij** -- Het eerste Bates-nummer. Standaard 1. De nummering loopt door over bestanden heen. +- **Bestandsteller begint bij** -- Het startnummer voor de plaatshouder `[FILE]`. +- **Lettertype** -- Helvetica, Times New Roman of Courier. +- **Lettergrootte** -- Grootte van de gestempelde tekst. +- **Kleur** -- Kleurkiezer voor de tekst van het Bates-nummer. + +## Functies + +- Live voorbeeld dat toont hoe Bates-nummers over alle geüploade bestanden verschijnen +- Ondersteuning voor meerdere bestanden met doorlopende nummering over documenten heen +- Bestanden herordenen met slepen om de nummeringsvolgorde te bepalen +- Zes positieopties (koptekst/voettekst, links/midden/rechts) +- Adaptieve margeberekening die rekening houdt met verschillende paginaformaten +- ZIP-uitvoer voor reeksen met meerdere bestanden +- Sjabloonplaatshouders voor maximale flexibiliteit + +## Toepassingen + +- Discoverydocumenten voor een rechtszaak stempelen met opeenvolgende exhibitnummers +- Auditbewijspakketten nummeren die tientallen bestanden beslaan +- Regelgevende referentienummers toepassen op compliancedocumentatie +- Bijlagen bij octrooiaanvragen labelen met zaakspecifieke identificatiecodes + +## Tips + +- Sleep bestanden in de bestandslijst om ze te herordenen voordat je verwerkt. De Bates-nummering volgt deze volgorde. +- Gebruik de plaatshouder `[FILENAME]` om de originele bestandsnaam in de stempel op te nemen, zodat je pagina's makkelijker naar de brondocumenten kunt herleiden. +- Het voorbeeldvak wordt in realtime bijgewerkt terwijl je instellingen wijzigt, zodat je de indeling kunt controleren voordat je verwerkt. + +## Gerelateerde tools + +- [Paginanummers](./page-numbers) +- [Paginalabels toevoegen](./add-page-labels) +- [Koptekst en voettekst](./header-footer) diff --git a/docs/nl/tools/bmp-to-pdf.md b/docs/nl/tools/bmp-to-pdf.md new file mode 100644 index 00000000..a086676e --- /dev/null +++ b/docs/nl/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP naar PDF +description: Zet BMP-bitmapafbeeldingen direct in je browser om naar PDF, zonder upload naar een server. +--- + +# BMP naar PDF + +Zet Windows Bitmap-bestanden (BMP) om naar PDF. BMP is een ongecomprimeerd afbeeldingsformaat dat nog voorkomt in oudere systemen, medische beeldvorming en industriële scanners. Deze tool zet ze om naar PDF zonder dat je iets hoeft te installeren. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------- | +| BMP | `.bmp` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je BMP-bestanden erheen. +2. Bekijk de bestandslijst. Voeg meer bestanden toe of verwijder ongewenste bestanden. +3. Klik op **Converteren naar PDF**. De uitvoer wordt gedownload als `from_bmps.pdf`. + +Elke BMP wordt op een canvas getekend, als PNG geëxporteerd en vervolgens met pdf-lib in de PDF ingesloten. Het paginaformaat komt overeen met de originele afbeeldingsafmetingen. + +## Opties + +Deze tool biedt geen extra kwaliteitsinstellingen. Afbeeldingen worden op hun originele resolutie ingesloten als verliesvrije PNG in de PDF. + +## Toepassingen + +- Oude gescande documenten die als BMP zijn opgeslagen omzetten naar archiefwaardige PDF's +- BMP-schermafbeeldingen uit oudere Windows-toepassingen omzetten naar deelbare documenten +- Uitvoer van medische of industriële scanners verwerken die standaard BMP gebruikt +- Oude afbeeldingsarchieven migreren naar een beter overdraagbaar formaat + +## Tips + +- BMP-bestanden zijn ongecomprimeerd en daardoor vaak groot. De resulterende PDF is aanzienlijk kleiner omdat de afbeeldingen intern opnieuw als PNG worden gecodeerd. +- Heb je BMP-bestanden naast andere afbeeldingsformaten, gebruik dan de tool [Afbeeldingen naar PDF](./image-to-pdf) om alles in één keer te converteren. + +## Gerelateerde tools + +- [Afbeeldingen naar PDF](./image-to-pdf) +- [PNG naar PDF](./png-to-pdf) +- [TIFF naar PDF](./tiff-to-pdf) diff --git a/docs/nl/tools/bookmark.md b/docs/nl/tools/bookmark.md new file mode 100644 index 00000000..222436c7 --- /dev/null +++ b/docs/nl/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Bladwijzers bewerken +description: Voeg PDF-bladwijzers toe, bewerk, importeer, exporteer en verwijder ze met een visuele editor en ondersteuning voor CSV/JSON. +--- + +# Bladwijzers bewerken + +Met de bladwijzereditor heb je volledige controle over de navigatiebladwijzers van een PDF (ook wel overzicht genoemd). Je kunt nieuwe bladwijzers toevoegen, bestaande bewerken, de hiërarchie herschikken en bladwijzergegevens importeren of exporteren in CSV- en JSON-formaat. + +## Zo werkt het + +1. Upload je PDF door te klikken of een bestand naar het uploadvak te slepen. +2. Vink eventueel **Bestaande bladwijzers automatisch extraheren** aan om de huidige bladwijzerstructuur van het document over te nemen. +3. De editor opent in een gesplitste weergave: de PDF-viewer links, het bladwijzerpaneel rechts. +4. Typ een bladwijzertitel en klik op **Toevoegen aan pagina** om een nieuwe bladwijzer naar de huidige pagina te maken. +5. Gebruik de knoppen in de werkbalk om bladwijzers te herschikken, op te maken of te verwijderen. +6. Klik op **PDF met bladwijzers opslaan** om het bijgewerkte bestand te downloaden. + +## Functies + +- Visuele PDF-viewer met paginanavigatie, zoomopties en een veld om naar een pagina te gaan +- Voeg met één klik bladwijzers toe aan elke pagina +- Klik direct op de PDF om een nauwkeurige bestemming voor de bladwijzer in te stellen (kiesmodus) +- Geneste bladwijzerhiërarchie met herschikken via slepen en neerzetten +- Bewerkingen in bulk: selecteer meerdere bladwijzers om de kleur of stijl te wijzigen of ze in één keer te verwijderen +- Zoeken in bladwijzers om snel items te vinden in grote structuren +- Ongedaan maken en opnieuw uitvoeren voor alle wijzigingen +- Bladwijzers importeren uit CSV (titel, pagina, niveau) of JSON-bestanden +- Bladwijzers exporteren naar CSV of JSON voor bewerking in een ander programma +- Opmaak van bladwijzers: kleur (rood, blauw, groen, geel, paars) en lettertype (vet, cursief, vet cursief) +- Snel navigeren: blader door de pagina's met de toetsen Page Up en Page Down + +## Opties + +- **Bestaande bladwijzers automatisch extraheren**: als dit is aangevinkt, leest de tool de huidige bladwijzers van de PDF en toont ze bij het laden. +- **Bulkmodus**: schakel in om meerdere bladwijzers te selecteren en kleur, stijl of verwijderen in bulk toe te passen. +- **Alles uitvouwen/samenvouwen**: toon of verberg snel de onderliggende bladwijzers. + +## Toepassingen + +- Een inhoudsopgave toevoegen aan een studieboek of handleiding zonder bladwijzers +- Bladwijzers herstructureren in een gescand document na OCR-verwerking +- Bladwijzers exporteren naar CSV, bewerken in een spreadsheet en opnieuw importeren +- Automatisch gegenereerde bladwijzers met onjuiste paginaverwijzingen opschonen +- Gekleurde bladwijzers toevoegen om belangrijke onderdelen in een juridisch dossier te markeren + +## Tips + +- Gebruik CSV-import om in één keer veel bladwijzers aan te maken. Het formaat is eenvoudig: `title,page,level`, waarbij niveau 1 het hoogste niveau is. +- Met de kiesmodus klik je op een exacte plek op de PDF-pagina om de bestemming van de bladwijzer in te stellen. Dat is nauwkeuriger dan alleen een paginanummer opgeven. +- Exporteer je bladwijzers voordat je grote wijzigingen doorvoert, zodat je een back-up hebt. + +## Gerelateerde tools + +- [Inhoudsopgave](./table-of-contents) +- [PDF-editor](./edit-pdf) +- [Paginalabels toevoegen](./add-page-labels) diff --git a/docs/nl/tools/cbz-to-pdf.md b/docs/nl/tools/cbz-to-pdf.md new file mode 100644 index 00000000..c830463f --- /dev/null +++ b/docs/nl/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ naar PDF +description: Zet CBZ- en CBR-stripboekarchieven om naar PDF in je browser. Gratis, privé, zonder upload. +--- + +# CBZ naar PDF + +Zet stripboekarchieven om naar PDF's. CBZ en CBR zijn de standaardformaten voor digitale strips: het zijn gewoon ZIP- of RAR-archieven vol afbeeldingen. Deze tool haalt elke pagina eruit, behoudt de leesvolgorde en maakt een nette PDF waarin elke afbeelding een pagina op volledige grootte wordt. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------ | :------- | :------------------------------------------------------------- | +| CBZ | `.cbz` | Op ZIP gebaseerd striparchief (lokaal verwerkt met pdf-lib) | +| CBR | `.cbr` | Op RAR gebaseerd striparchief (verwerkt via de PyMuPDF-engine) | + +De CBZ-converter herkent JPEG-, PNG-, GIF-, BMP-, WebP-, AVIF-, TIFF-, HEIC- en JXL-afbeeldingen in het archief. Niet-standaardformaten worden vóór het insluiten automatisch naar PNG geconverteerd. + +## Zo werkt het + +1. Klik op het uploadvak of sleep je CBZ- of CBR-bestanden erheen. Je kunt beide formaten in één reeks combineren. +2. Bekijk de lijst met bestanden. Verwijder wat je niet nodig hebt, of klik op **Meer bestanden toevoegen** om er meer toe te voegen. +3. Klik op **Converteren naar PDF**. Bij CBZ-bestanden pakt de tool het archief uit, sorteert de afbeeldingen op naam in natuurlijke volgorde, detecteert het werkelijke formaat van elke afbeelding en sluit ze met pdf-lib in een PDF in. CBR-bestanden gaan in plaats daarvan via de PyMuPDF-engine. +4. Eén bestand wordt als PDF gedownload. Bij meerdere bestanden krijg je een ZIP-archief met de naam `comic-converted.zip`. + +## Opties + +Er is geen configuratie nodig. Elke afbeelding wordt een pagina met dezelfde afmetingen als het origineel, zodat dubbele pagina's breed blijven en enkele pagina's smal. + +## Toepassingen + +- Strips lezen op een tablet of in een telefoon-app die wel PDF maar geen CBZ/CBR ondersteunt +- Specifieke pagina's van een digitale strip afdrukken +- Een stripcollectie archiveren in een formaat dat elke bestandsviewer kan openen +- Een strip delen met iemand die geen speciale stripreader heeft + +## Tips + +- Afbeeldingen in het archief worden in natuurlijke volgorde gesorteerd (dus `page2.jpg` komt vóór `page10.jpg`). Geef je bestanden een consistente nummering voor de juiste paginavolgorde. +- De converter herkent afbeeldingsformaten aan hun binaire handtekening, niet aan de bestandsextensie. Een PNG die per ongeluk `.jpg` heet, wordt toch correct ingesloten. +- CBZ-bestanden worden volledig in de browser verwerkt zonder de PyMuPDF-engine te laden, dus ze worden sneller geconverteerd dan CBR-bestanden. + +## Gerelateerde tools + +- [EPUB naar PDF](./epub-to-pdf) +- [MOBI naar PDF](./mobi-to-pdf) +- [Afbeelding naar PDF](./image-to-pdf) diff --git a/docs/nl/tools/change-permissions.md b/docs/nl/tools/change-permissions.md new file mode 100644 index 00000000..e2284a5a --- /dev/null +++ b/docs/nl/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Rechten aanpassen +description: Stel gebruiksrechten van een PDF in of wijzig ze voor afdrukken, kopiëren, bewerken en annoteren. Gebruikt 256-bits AES-versleuteling. +--- + +# Rechten aanpassen + +Bepaal precies wat ontvangers met je PDF mogen doen. Anders dan eenvoudige versleuteling, die het bestand alleen achter een wachtwoord zet, kun je met deze tool afdrukken, kopiëren, bewerken, annoteren, formulieren invullen, documentsamenstelling en pagina-extractie selectief toestaan of weigeren, allemaal afgedwongen met 256-bits AES-versleuteling. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. Als de PDF al versleuteld is, voer je het **Huidige wachtwoord** in. +3. Stel een **Nieuw gebruikerswachtwoord** in (vereist om te openen) en/of een **Nieuw eigenaarswachtwoord** (bepaalt de rechten). +4. Zet afzonderlijke rechten aan of uit met de selectievakjes. +5. Klik op **Rechten aanpassen**. +6. Download de bijgewerkte PDF. + +Als je beide velden voor een nieuw wachtwoord leeg laat, ontsleutelt de tool de PDF volledig en verwijdert alle versleuteling en beperkingen. + +## Rechtenbeheer + +| Recht | Wat het regelt | +| ---------------------------------- | ---------------------------------------------------------------- | +| **Afdrukken toestaan** | Of het document mag worden afgedrukt | +| **Kopiëren toestaan** | Of tekst en afbeeldingen mogen worden geselecteerd en gekopieerd | +| **Wijzigen toestaan** | Of de inhoud van het document mag worden bewerkt | +| **Annoteren toestaan** | Of opmerkingen, markeringen en stempels mogen worden toegevoegd | +| **Formulieren invullen toestaan** | Of interactieve formuliervelden mogen worden ingevuld | +| **Documentsamenstelling toestaan** | Of pagina's mogen worden ingevoegd, verwijderd of gedraaid | +| **Pagina-extractie toestaan** | Of afzonderlijke pagina's mogen worden geëxtraheerd | + +Voor alle rechten is een eigenaarswachtwoord nodig om ze af te dwingen. Zonder eigenaarswachtwoord worden de rechtenvlaggen door de meeste PDF-lezers genegeerd. + +## Hoe rechten werken in PDF + +PDF-rechten maken deel uit van de versleutelingsspecificatie. Ze worden als bitvlaggen opgeslagen in het versleutelingswoordenboek en afgedwongen door conforme PDF-lezers. Het belangrijkste verschil: + +- **Gebruikerswachtwoord**: nodig om het bestand überhaupt te openen. +- **Eigenaarswachtwoord**: nodig om rechten te wijzigen of beperkingen te verwijderen. Zonder dit wachtwoord bepalen de rechtenvlaggen welke handelingen de gebruiker mag uitvoeren. + +Als je alleen een eigenaarswachtwoord instelt (geen gebruikerswachtwoord), kan iedereen het bestand openen, maar is hij beperkt tot de toegestane handelingen. Als je beide instelt, is voor het openen een wachtwoord nodig en gelden de beperkingen na verificatie. + +## Toepassingen + +- Een rapport verspreiden dat kan worden bekeken en afgedrukt, maar niet bewerkt of gekopieerd +- Een contractsjabloon delen die ontvangers kunnen invullen maar niet wijzigen +- Een PDF-catalogus publiceren waarin het kopiëren van afbeeldingen is uitgeschakeld +- Annotaties toestaan in een conceptversie ter beoordeling, terwijl structurele wijzigingen worden voorkomen + +## Tips + +- Stel altijd een eigenaarswachtwoord in, anders werkt het niet. Rechten zonder eigenaarswachtwoord zijn niet af te dwingen. +- Sommige PDF-tools van derden negeren rechtenvlaggen. Overweeg voor sterkere bescherming de PDF te rasteriseren of DRM te gebruiken. +- Gebruik deze tool om oude met RC4 versleutelde PDF's te upgraden naar AES-256. + +## Gerelateerde tools + +- [PDF versleutelen](./protect-pdf): eenvoudige wachtwoordbeveiliging zonder gedetailleerde rechten +- [PDF ontsleutelen](./unlock-pdf): versleuteling volledig verwijderen +- [Beperkingen verwijderen](./remove-restrictions): alle beperkingen verwijderen als je het eigenaarswachtwoord hebt diff --git a/docs/nl/tools/combine-single-page.md b/docs/nl/tools/combine-single-page.md new file mode 100644 index 00000000..633cd7fe --- /dev/null +++ b/docs/nl/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Combineren tot één pagina +description: Plak alle pagina's van een PDF aan elkaar tot één doorlopende verticale of horizontale pagina. +--- + +# Combineren tot één pagina + +Voeg alle pagina's van een PDF samen tot één lange pagina. De pagina's worden verticaal (als een rol) of horizontaal (naast elkaar) aan elkaar geplakt, zodat de uitvoer uit één doorlopende pagina bestaat. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. Kies de richting van de indeling: **Verticaal** (pagina's van boven naar beneden gestapeld) of **Horizontaal** (pagina's naast elkaar). +3. Stel de ruimte tussen de pagina's in punten in. +4. Kies een achtergrondkleur voor de tussenruimtes. +5. Schakel eventueel scheidingslijnen (dunne lijnen tussen pagina's) in en stel de dikte en kleur in. +6. Klik op de verwerkingsknop. De uitvoer is een PDF met één pagina. + +## Functies + +- Pagina's verticaal of horizontaal aan elkaar plakken +- Instelbare ruimte tussen pagina's +- Kleurkiezer voor de achtergrond van de tussenruimtes +- Optionele scheidingslijnen met instelbare dikte en kleur +- Geeft elke originele pagina op volledige resolutie weer op het gecombineerde canvas + +## Opties + +| Optie | Beschrijving | +| ---------------------------- | --------------------------------------------------- | +| **Oriëntatie** | Verticaal (gestapeld) of Horizontaal (naast elkaar) | +| **Paginaruimte** | Ruimte tussen pagina's in punten | +| **Achtergrondkleur** | Kleur van het gebied tussen de pagina's | +| **Scheidingslijn toevoegen** | Dunne lijnen tussen pagina's in- of uitschakelen | +| **Dikte scheidingslijn** | Lijndikte in punten | +| **Kleur scheidingslijn** | Kleur van de scheidingslijnen | + +## Toepassingen + +- Een lange afbeelding maken van een wireframe of ontwerpmodel met meerdere pagina's +- Een doorlopende, scrolbare weergave van een document maken voor insluiting op het web +- Een stripverhaal of storyboard van meerdere pagina's aan elkaar plakken tot één strook +- Een panoramaweergave van opeenvolgende pagina's maken voor beoordeling + +## Tips + +- Verticale oriëntatie werkt het best voor documenten met staande pagina's. Horizontaal is beter voor inhoud in liggende stand. +- Grote documenten met veel pagina's leveren een zeer hoge of brede uitvoer op. Sommige PDF-viewers hebben moeite met extreem grote enkele pagina's. +- Met scheidingslijnen in een contrasterende kleur zie je makkelijk waar een originele pagina eindigt en de volgende begint. + +## Gerelateerde tools + +- [N-up PDF](./n-up-pdf) +- [PDF samenvoegen](./merge-pdf) +- [Pagina's opdelen](./divide-pages) diff --git a/docs/nl/tools/compare-pdfs.md b/docs/nl/tools/compare-pdfs.md new file mode 100644 index 00000000..76253be2 --- /dev/null +++ b/docs/nl/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: PDF's vergelijken +description: Vergelijk twee PDF-documenten naast elkaar of in overlaymodus, met gedetailleerde detectie en indeling van wijzigingen. +--- + +# PDF's vergelijken + +Upload twee PDF's en zie precies wat er tussen beide is veranderd. De tool koppelt pagina's op slimme wijze, detecteert verschillen in tekst, afbeeldingen, annotaties, kop- en voetteksten en opmaak, en toont ze in een weergave naast elkaar of als overlay. + +## Zo werkt het + +1. Upload twee PDF-bestanden: het origineel (links) en de herziene versie (rechts). +2. De tool koppelt pagina's tussen de documenten op basis van inhoudskenmerken. +3. Kies een weergavemodus: **Naast elkaar** of **Overlay**. +4. Navigeer tussen paginaparen met de paginabesturing. +5. Verschillen worden gemarkeerd en ingedeeld. Gebruik het filterpaneel om je op specifieke soorten wijzigingen te richten. +6. Exporteer de vergelijking eventueel als PDF-rapport. + +## Functies + +- Automatische paginakoppeling op basis van inhoudelijke overeenkomst +- Vergelijkingsweergaven naast elkaar en als overlay +- Indeling van wijzigingen: tekst, afbeelding, kop-/voettekst, annotatie, opmaak, achtergrond +- Filterschakelaars per categorie om bepaalde soorten wijzigingen te tonen of te verbergen +- Zoeken in tekstwijzigingen met een zoekopdracht +- OCR-ondersteuning voor het vergelijken van gescande documenten +- Zoomopties voor gedetailleerde inspectie +- Gesynchroniseerd scrollen tussen de panelen in de weergave naast elkaar +- Vergelijkingsresultaten exporteren als PDF + +## Opties + +| Optie | Beschrijving | +| -------------------- | ------------------------------------------------------------------------------------------------------- | +| **Weergavemodus** | Naast elkaar of Overlay | +| **OCR** | OCR in- of uitschakelen voor het vergelijken van gescande documenten | +| **OCR-taal** | Taal voor het extraheren van OCR-tekst | +| **Categoriefilters** | Zichtbaarheid van wijzigingen in tekst, afbeeldingen, kop-/voettekst, annotaties, opmaak en achtergrond | +| **Wijzigingsbereik** | In overlaymodus: filteren tussen alle wijzigingen of alleen inhoud | +| **Zoom** | Het vergrotingsniveau aanpassen voor gedetailleerde inspectie | + +## Toepassingen + +- Contractwijzigingen beoordelen om precies te zien wat er tussen versies is veranderd +- Ontwerpmodellen vergelijken om te controleren of PDF-exports aan de verwachtingen voldoen +- Documentwijzigingen controleren in gereguleerde sectoren waar elke bewerking moet worden bijgehouden +- Controleren of een PDF-conversie de originele inhoud nauwkeurig heeft behouden +- Vertaalde documenten naast de bron leggen om opmaakwijzigingen te controleren + +## Tips + +- De overlayweergave legt beide documenten over elkaar, zodat verschillen in positie (verschoven elementen, aangepaste afbeeldingsgrootte) direct zichtbaar zijn. +- Schakel OCR in bij het vergelijken van gescande documenten zonder tekstlaag. De vergelijkingsengine haalt de tekst dan uit de pagina-afbeeldingen. +- Gebruik categoriefilters om je te richten op wat telt. Verberg bijvoorbeeld opmaakwijzigingen als je alleen om verschillen in de tekstinhoud geeft. + +## Gerelateerde tools + +- [Metadata weergeven](./view-metadata) +- [PDF OCR](./ocr-pdf) +- [PDF samenvoegen](./merge-pdf) diff --git a/docs/nl/tools/compress-pdf.md b/docs/nl/tools/compress-pdf.md new file mode 100644 index 00000000..4bc3843b --- /dev/null +++ b/docs/nl/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: PDF comprimeren +description: Verklein de bestandsgrootte van een PDF tot wel 90% met de Hyper Compress-engine. Ondersteunt doelbestandsgroottes, bewerking in reeksen en eigen kwaliteitsinstellingen. +--- + +# PDF comprimeren + +Maak je PDF-bestanden kleiner zonder ze te beschadigen. PDF comprimeren draait op [Hyper Compress](https://www.bentopdf.com/hyper-compress), de eigen compressie-engine van BentoPDF. Die comprimeert afbeeldingen opnieuw, maakt subsets van lettertypen en voegt ze samen, en verwijdert overbodige onderdelen zoals ingesloten miniaturen en privé-toepassingsgegevens. De PDF blijft volledig functioneel: tekst blijft selecteerbaar en koppelingen en formuliervelden blijven werken. + +Hyper Compress is gecompileerd naar WebAssembly en wordt met BentoPDF meegeleverd, dus compressie werkt offline en in air-gapped omgevingen zonder extra installatie. + +## Zo werkt het + +1. Upload een of meer PDF's door op het uploadvak te klikken of bestanden erheen te slepen. +2. Kies een **Compressieniveau**: Laag, Gemiddeld, Hoog of Verliesvrij. +3. Voer eventueel een **Doelbestandsgrootte** in, of vouw **Aangepaste instellingen** uit voor fijnere controle, inclusief **Converteren naar grijstinten**. +4. Klik op **PDF comprimeren**. Bij meerdere bestanden krijg je één ZIP-download. + +## Speciale documenten + +- **Digitaal ondertekende PDF's** worden ongewijzigd teruggegeven, omdat elke wijziging de handtekening ongeldig zou maken. Schakel onder Aangepaste instellingen **Inhoudsbescherming negeren** in om de handtekeningen te verwijderen en toch te comprimeren. De zichtbare handtekening blijft op de pagina staan, maar het bestand is niet langer ondertekend. +- **PDF/A-bestanden** verliezen na compressie hun PDF/A-label, zodat het bestand nooit een conformiteit claimt waaraan het niet meer voldoet. Schakel onder Aangepaste instellingen **PDF/A behouden** in om het bestand juist conform te houden. +- **Met een wachtwoord beveiligde PDF's** krijgen een wachtwoordveld op hun bestandskaart. Voer daar het wachtwoord in en Hyper Compress opent het bestand zelf, zonder aparte ontgrendelstap. Bij twee of meer vergrendelde bestanden ontgrendelt één gedeeld veld alle bestanden met hetzelfde wachtwoord. De gecomprimeerde kopie heeft geen wachtwoord; gebruik [PDF versleutelen](./protect-pdf) om er opnieuw een toe te voegen. +- **Scans zonder tekstlaag** kunnen nog verder krimpen met **Pagina's rasteriseren** onder Aangepaste instellingen, waarmee elke pagina wordt vervangen door één geoptimaliseerde afbeelding. Dit wordt overgeslagen voor elk document met selecteerbare tekst, inclusief scans met OCR, tenzij **Inhoudsbescherming negeren** aanstaat. Dan worden ook tekstpagina's afbeeldingen, zodat tekst niet meer selecteerbaar is en koppelingen niet meer werken. + +## Compressieniveaus + +| Niveau | Afbeeldingskwaliteit | Max. resolutie | Het best voor | +| --------------- | ------------------------ | -------------- | ------------------------------------ | +| **Laag** | 80 | 200 DPI | Visuele kwaliteit behouden | +| **Gemiddeld** | 50 | 150 DPI | Alledaagse documenten | +| **Hoog** | 20 | 72 DPI | E-mailbijlagen, uploads naar het web | +| **Verliesvrij** | Afbeeldingen onaangetast | Ongewijzigd | Archiefkopieën | + +Hoog haalt ook de 14 standaard-PDF-lettertypen uit het bestand, plus lookalikes zoals Arial wanneer dat veilig kan. + +## Doelbestandsgrootte + +Voer een grootte in KB of MB in en Hyper Compress zoekt de beste afbeeldingskwaliteit die nog binnen die grootte past, uitgaand van het gekozen niveau. Als het document niet zo klein kan worden, krijg je de kleinste versie die mogelijk is, met een melding daarover. De speciale pagina's, zoals [PDF comprimeren tot 1 MB](https://www.bentopdf.com/compress-pdf-to-1mb), openen met het doel al ingevuld. + +## Aangepaste instellingen + +Vouw het paneel Aangepaste instellingen uit om Hyper Compress rechtstreeks af te stemmen. Als je een compressieniveau kiest, worden deze instellingen teruggezet naar de waarden van dat niveau, en zodra je er een wijzigt, schakelt het niveau over naar Aangepast. + +- **Inhoudsbescherming negeren**: standaard laat Hyper Compress ondertekende PDF's ongemoeid en rasteriseert het geen pagina's met tekst. Als je dit inschakelt, worden beide omzeild. De instelling blijft aan als je het niveau wijzigt. + +- **Afbeeldingen**: afbeeldingskwaliteit, maximale resolutie, geforceerd opnieuw samplen, kleurreductie, onzichtbare afbeeldingsgebieden wegsnijden, alternatieve afbeeldingen verwijderen, kleurprofielen vereenvoudigen, JPEG 2000 en verliesvrije modus +- **Lettertypen**: subsets maken, duplicaten samenvoegen en standaardlettertypen en hun lookalikes niet insluiten +- **Inhoud**: annotaties, formuliervelden of koppelingen platmaken +- **Opschonen**: miniaturen, toepassingsgegevens, artikelreeksen, webopnamegegevens, de structuurboom of uitvoerintenties verwijderen +- **Rasteriseren**: pagina's vervangen door afbeeldingen, voor scans met alleen afbeeldingen; wordt overgeslagen als het document selecteerbare tekst heeft +- **Uitvoer**: PDF/A behouden en Brotli-compressie voor PDF 2.0-lezers die dit ondersteunen + +## Toepassingen + +- Een rapport van 50 MB onder de limiet voor e-mailbijlagen brengen +- Een scan onder de strikte uploadlimiet van een portaal krijgen met een doelbestandsgrootte +- PDF's voor marketing optimaliseren voor snellere downloads van een website +- Grote documentenverzamelingen archiveren waarbij opslagkosten ertoe doen +- Het mobiele datagebruik verminderen bij het delen van PDF's via berichtenapps + +## Tips + +- Begin met Gemiddeld. Is het resultaat nog te groot, stel dan een doelbestandsgrootte in of ga naar Hoog. +- Zet voor een scan zonder tekstlaag **Pagina's rasteriseren** aan onder Aangepaste instellingen. +- Converteren naar grijstinten, onder Aangepaste instellingen, kan de bestandsgrootte van kleurrijke documenten flink verkleinen. + +## Gerelateerde tools + +- [PDF lineariseren](./linearize-pdf): optimaliseer de gecomprimeerde PDF voor snel bekijken op het web +- [PDF rasteriseren](./rasterize-pdf): zet pagina's om naar afbeeldingen met een bepaalde DPI, ook pagina's met tekst +- [PDF repareren](./repair-pdf): herstel een PDF die elders tijdens het comprimeren is beschadigd +- [Metadata verwijderen](./remove-metadata): verwijder verborgen gegevens voor je privacy diff --git a/docs/nl/tools/crop-pdf.md b/docs/nl/tools/crop-pdf.md new file mode 100644 index 00000000..967f9bc0 --- /dev/null +++ b/docs/nl/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: PDF bijsnijden +description: Snij PDF-pagina's visueel bij door op elke pagina een uitsnedegebied te tekenen met een editor op basis van Cropper.js. +--- + +# PDF bijsnijden + +Snij de marges van je PDF-pagina's weg met een visuele bijsnij-interface. Teken een bijsnijrechthoek direct op elke pagina, bekijk het resultaat en pas het bijsnijden toe. Je kunt voor verschillende pagina's verschillende gebieden instellen of dezelfde uitsnede op het hele document toepassen. + +## Zo werkt het + +1. Upload je PDF-bestand. +2. De bijsnij-editor opent en toont de eerste pagina met een versleepbare bijsnij-overlay. +3. Pas de bijsnijrechthoek aan door aan de randen of hoeken te slepen. +4. Gebruik de paginanavigatieknoppen om tussen pagina's te wisselen en voor elke pagina een gebied in te stellen. +5. Klik op **Bijsnijden** om de uitsnede toe te passen en het resultaat te downloaden. + +## Functies + +- Visuele bijsnij-editor op basis van Cropper.js met handvatten voor nauwkeurige aanpassing +- Navigatie per pagina om afzonderlijke bijsnijgebieden in te stellen +- Slaat de bijsnij-instellingen per pagina op, zodat je voor verschillende pagina's een andere uitsnede kunt bepalen +- Live voorbeeld van het geselecteerde bijsnijgebied +- Ondersteunt PDF's met elk paginaformaat of elke oriëntatie + +## Toepassingen + +- Brede marges van gescande documenten verwijderen om je op het inhoudsgebied te richten +- Snijmarkeringen of registratiemarkeringen van drukklare PDF's verwijderen +- Collegesheets bijsnijden om het gebied met spreeknotities te verwijderen +- Kop- of voetteksten van elke pagina verwijderen voordat je een uittreksel van een document deelt +- Pagina's aanpassen aan een specifieke weergave of afdrukindeling + +## Tips + +- De bijsnij-overlay kan vrij worden vergroot, verkleind en verplaatst. Sleep de hoeken voor proportioneel schalen of de randen voor aanpassing in één richting. +- Als elke pagina dezelfde uitsnede nodig heeft, stel die dan in op de eerste pagina: de tool onthoudt je bijsnijgebied terwijl je door de pagina's navigeert. +- Als je paginaformaten wilt standaardiseren in plaats van visueel bij te snijden, past de tool Paginaformaat corrigeren mogelijk beter. + +## Gerelateerde tools + +- [PDF-editor](./edit-pdf) +- [Paginanummers](./page-numbers) +- [Lege pagina's verwijderen](./remove-blank-pages) diff --git a/docs/nl/tools/csv-to-pdf.md b/docs/nl/tools/csv-to-pdf.md new file mode 100644 index 00000000..f108ecd1 --- /dev/null +++ b/docs/nl/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV naar PDF +description: Zet CSV-spreadsheetbestanden direct in je browser om naar opgemaakte PDF-tabellen. +--- + +# CSV naar PDF + +Zet CSV-bestanden om naar nette, opgemaakte PDF-documenten. Elke CSV wordt verwerkt en als tabel weergegeven in de PDF. Handig als je tabelgegevens wilt afdrukken of delen zonder dat de ontvanger spreadsheetsoftware nodig heeft. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------- | +| CSV | `.csv` | + +## Zo werkt het + +1. Klik op het uploadvak of sleep een of meer CSV-bestanden erheen. +2. Bekijk de bestandslijst. Voeg meer bestanden toe of verwijder ongewenste bestanden. +3. Klik op **Converteren naar PDF**. Een voortgangsindicator toont de status van de conversie. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden worden verpakt in `csv-converted.zip`. + +## Opties + +Deze tool heeft geen extra configuratie. De CSV wordt automatisch verwerkt en als tabel opgemaakt. + +## Uitvoer + +| Aantal invoerbestanden | Uitvoer | +| :--------------------- | :-------------------------------------------------------- | +| 1 bestand | Eén PDF-download (bijv. `data.pdf`) | +| 2+ bestanden | ZIP-archief (`csv-converted.zip`) met één PDF per bestand | + +## Toepassingen + +- Geëxporteerde databaserapporten omzetten naar afdrukbare PDF-tabellen +- Financiële gegevens of voorraadlijsten delen met mensen zonder Excel +- PDF-versies maken van CSV-logbestanden voor compliancedocumentatie +- Adreslijsten, cijferlijsten of andere tabelgegevens in CSV afdrukken + +## Tips + +- Zorg voor het beste resultaat dat je CSV standaard komma's als scheidingsteken gebruikt. De tool volgt gangbare CSV-conventies. +- Als je CSV veel kolommen heeft, kan de tabel worden samengedrukt om op de paginabreedte te passen. Overweeg brede datasets in meerdere bestanden te splitsen. +- Gebruik voor Excel-bestanden (`.xls`, `.xlsx`) de tool [Excel naar PDF](./excel-to-pdf), die de opmaak van de spreadsheet en meerdere bladen behoudt. + +## Gerelateerde tools + +- [Excel naar PDF](./excel-to-pdf) +- [Tekst naar PDF](./txt-to-pdf) +- [JSON naar PDF](./json-to-pdf) diff --git a/docs/nl/tools/delete-pages.md b/docs/nl/tools/delete-pages.md new file mode 100644 index 00000000..4945ff5a --- /dev/null +++ b/docs/nl/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Pagina's verwijderen +description: Verwijder specifieke pagina's uit een PDF op paginanummer, bereik of door visuele selectie van miniaturen. +--- + +# Pagina's verwijderen + +Verwijder ongewenste pagina's uit een PDF-document. Geef de te verwijderen pagina's op door paginanummers of bereiken te typen, of klik direct op miniaturen om ze voor verwijdering te markeren. + +## Zo werkt het + +1. Upload een PDF-bestand. De tool toont miniaturen van elke pagina. +2. Voer de te verwijderen pagina's in het tekstveld in met bereiksyntaxis (bijv. `2, 5-8`), of klik op miniaturen om ze te selecteren. +3. Gemarkeerde pagina's worden visueel benadrukt, zodat je je selectie kunt controleren. +4. Klik op de verwerkingsknop. Er wordt een nieuwe PDF gemaakt zonder de geselecteerde pagina's. + +## Functies + +- Paginaselectie met tekst en bereiksyntaxis (`2, 5-8, 12`) +- Visueel miniaturenraster om pagina's door te klikken te selecteren voor verwijdering +- Realtime markering van pagina's die voor verwijdering zijn gemarkeerd +- Invoercontrole op het werkelijke aantal pagina's +- Behoudt alle niet-verwijderde pagina's in hun oorspronkelijke volgorde + +## Toepassingen + +- Lege pagina's of opvulpagina's uit een gescand document verwijderen +- Voorbladen of bijlagen verwijderen voordat je een document deelt +- Conceptpagina's opruimen die per ongeluk in een definitieve PDF zijn blijven staan +- Pagina's met gevoelige informatie verwijderen voor verspreiding + +## Tips + +- Het verwijderen van pagina's heeft geen invloed op de inhoud of opmaak van de overige pagina's. De uitvoer is een getrouwe kopie van het origineel minus de verwijderde pagina's. +- Als je liever alleen bepaalde pagina's wilt behouden dan bepaalde pagina's te verwijderen, is [Pagina's extraheren](./extract-pages) een betere keuze. +- De miniaturenweergave laadt geleidelijk, zodat grote documenten vlot blijven. + +## Gerelateerde tools + +- [Pagina's extraheren](./extract-pages) +- [Ordenen en dupliceren](./organize-pdf) +- [PDF splitsen](./split-pdf) diff --git a/docs/nl/tools/deskew-pdf.md b/docs/nl/tools/deskew-pdf.md new file mode 100644 index 00000000..20edc318 --- /dev/null +++ b/docs/nl/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF rechttrekken +description: Trek scheve pagina's in gescande PDF's automatisch recht met scheefstandsdetectie van OpenCV. Instelbare drempel en DPI. +--- + +# PDF rechttrekken + +Gescande documenten liggen zelden perfect recht. Zelfs een lichte scheefstand maakt OCR minder nauwkeurig en afdrukken slordig. Deze tool gebruikt de beeldverwerkingsalgoritmen van OpenCV om de scheefstandshoek van elke pagina te detecteren en de pagina weer recht te draaien. + +## Zo werkt het + +1. Upload een of meer gescande PDF's. +2. Stel de **Scheefstandsdrempel** in: pagina's met een gedetecteerde scheefstand onder deze waarde blijven ongemoeid. +3. Kies een **Verwerkingskwaliteit (DPI)**: een hogere DPI verbetert de detectienauwkeurigheid, maar duurt langer. +4. Klik op **PDF rechttrekken**. +5. Na de verwerking toont een resultatenpaneel per pagina de gedetecteerde hoek en of die is gecorrigeerd. + +## Opties + +| Instelling | Waarden | Standaard | +| ----------------------- | ------------------------- | --------- | +| **Scheefstandsdrempel** | 0,1, 0,5, 1,0, 2,0 graden | 0,5 | +| **Verwerkings-DPI** | 100, 150, 200, 300 | 150 | + +## Hoe scheefstandsdetectie werkt + +De tool geeft elke pagina weer als afbeelding met de gekozen DPI en gebruikt vervolgens OpenCV om de dominante lijnhoeken in de inhoud te detecteren. Als de gedetecteerde scheefstand de drempel overschrijdt, wordt de pagina met de omgekeerde hoek gedraaid om hem recht te trekken. Pagina's onder de drempel worden ongewijzigd doorgegeven. + +## Toepassingen + +- Contracten of juridische documenten die in bulk zijn gescand opschonen +- Gescande bonnetjes of facturen voorbereiden op OCR-verwerking +- Pagina's van een flatbedscanner rechttrekken wanneer het papier telkens anders ligt +- De visuele kwaliteit van gedigitaliseerd archiefmateriaal verbeteren + +## Tips + +- Verlaag de drempel naar 0,1 graad als je pixelnauwkeurige uitlijning voor OCR nodig hebt. +- 150 DPI is snel en nauwkeurig voor de meeste documenten. Gebruik 300 DPI voor zeer kleine tekst of pagina's met fijne details. +- Rechttrekken werkt het best bij documenten met duidelijke horizontale tekstregels. Het kan moeite hebben met pagina's die vooral uit afbeeldingen of diagonale ontwerpelementen bestaan. + +## Gerelateerde tools + +- [PDF rasteriseren](./rasterize-pdf): zet de rechtgetrokken uitvoer om naar een vlakke PDF op basis van afbeeldingen +- [PDF comprimeren](./compress-pdf): verklein de bestandsgrootte na het rechttrekken +- [PDF repareren](./repair-pdf): herstel structurele problemen in gescande PDF's diff --git a/docs/nl/tools/digital-sign-pdf.md b/docs/nl/tools/digital-sign-pdf.md new file mode 100644 index 00000000..542ea107 --- /dev/null +++ b/docs/nl/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Digitale handtekening +description: Voeg cryptografische digitale handtekeningen toe aan PDF's met X.509-certificaten. Ondersteunt PKCS#12- en PEM-formaten met opties voor zichtbare handtekeningen. +--- + +# Digitale handtekening + +Een digitale handtekening is cryptografisch bewijs dat een bepaald persoon een document heeft ondertekend en dat het document sindsdien niet is gewijzigd. Anders dan een getekende handtekening (die slechts een afbeelding is) gebruikt een digitale handtekening X.509-certificaten en PKCS#7-standaarden voor controleerbare authenticiteit en integriteit. + +BentoPDF past digitale handtekeningen volledig in je browser toe. Je privésleutel verlaat je apparaat nooit. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. Upload je certificaatbestand (.pfx, .p12 of .pem). +3. Voer het certificaatwachtwoord in om het te ontgrendelen. De tool toont de certificaathouder, de uitgever en de geldigheidsperiode. +4. Configureer eventueel de metadata van de handtekening (reden, locatie, contactgegevens). +5. Schakel eventueel een **zichtbare handtekening** in met aanpassingen voor positie, grootte, afbeelding en tekst. +6. Klik op **PDF ondertekenen**. + +## Ondersteunde certificaatformaten + +| Formaat | Extensies | Beschrijving | +| ----------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Standaardbundel in de branche met de privésleutel en de certificaatketen. Het meest gebruikte formaat. | +| **PEM** | .pem | Op tekst gebaseerd formaat. Moet zowel het certificaat als de privésleutel in één bestand bevatten. Ondersteunt versleutelde privésleutels. | + +## Opties voor zichtbare handtekening + +Als deze optie is ingeschakeld, wordt een zichtbaar handtekeningblok op de PDF-pagina weergegeven: + +- **Positie**: X/Y-coördinaten en breedte/hoogte in punten +- **Pagina**: eerste pagina, laatste pagina, alle pagina's of een specifiek paginanummer +- **Afbeelding**: upload een PNG-, JPG- of WebP-afbeelding (je handgeschreven handtekening, bedrijfszegel enz.) +- **Tekst**: eigen tekst met instelbare kleur en lettergrootte. Als er geen afbeelding of tekst is opgegeven, genereert de tool automatisch tekst uit de common name van het certificaat en de huidige datum. + +## Metadata van de handtekening + +- **Reden**: waarom het document is ondertekend (bijv. "Goedgekeurd", "Beoordeeld") +- **Locatie**: waar de ondertekening plaatsvond (bijv. "Amsterdam") +- **Contactgegevens**: hoe de ondertekenaar bereikbaar is (bijv. e-mailadres) + +## Opmerking over internetverbinding + +Ondertekenen kan een internetverbinding vereisen. De ondertekenbibliotheek haalt de certificaatketen op via URL's die in de extensie Authority Information Access (AIA) van je certificaat staan. Als die servers onbereikbaar zijn, mislukt het ondertekenen voor certificaten die ketenvalidatie vereisen. + +## Toepassingen + +- Contracten, offertes en overeenkomsten ondertekenen met juridisch bindende digitale handtekeningen +- Officiële documenten certificeren in workflows die authenticatie op basis van PKI vereisen +- PDF-facturen ondertekenen voor naleving van regelgeving (veel EU-landen eisen digitaal ondertekende e-facturen) +- Organisatorische goedkeuring toevoegen aan technische tekeningen of kwaliteitsdocumenten + +## Tips + +- Zelfondertekende certificaten werken om te testen, maar tonen waarschuwingen in Adobe Reader. Gebruik voor productiedocumenten een certificaat van een vertrouwde certificeringsinstantie. +- De zichtbare handtekening is puur visueel. De cryptografische handtekening wordt altijd ingesloten, ook als het zichtbare blok niet is ingeschakeld. +- Controleer je ondertekende PDF met de tool Handtekening valideren om te bevestigen dat de handtekening intact is. + +## Gerelateerde tools + +- [Handtekening valideren](./validate-signature-pdf): controleer digitale handtekeningen in ondertekende PDF's +- [PDF platmaken](./flatten-pdf): maak formulieren plat vóór het ondertekenen om wijzigingen te voorkomen +- [PDF versleutelen](./protect-pdf): voeg wachtwoordbeveiliging toe bovenop de digitale handtekening +- [Metadata verwijderen](./remove-metadata): verwijder metadata vóór het ondertekenen diff --git a/docs/nl/tools/divide-pages.md b/docs/nl/tools/divide-pages.md new file mode 100644 index 00000000..aa9651a1 --- /dev/null +++ b/docs/nl/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Pagina's opdelen +description: Splits PDF-pagina's horizontaal of verticaal in kleinere deelpagina's. +--- + +# Pagina's opdelen + +Snijd afzonderlijke PDF-pagina's doormidden door ze horizontaal of verticaal te splitsen. Handig als één pagina inhoud bevat die over aparte pagina's verdeeld moet worden, bijvoorbeeld een indeling met twee kolommen die als één brede pagina is gescand. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. Kies de splitsrichting: **Verticaal** (linker- en rechterhelft) of **Horizontaal** (boven- en onderhelft). +3. Geef eventueel een paginabereik op om te beperken welke pagina's worden opgedeeld. Laat leeg om alle pagina's op te delen. +4. Klik op de verwerkingsknop om de opgedeelde PDF te genereren. + +## Functies + +- Verticaal splitsen: deelt elke pagina in een linker- en rechterhelft +- Horizontaal splitsen: deelt elke pagina in een boven- en onderhelft +- Paginabereikfilter om specifieke pagina's selectief op te delen +- Pagina's die niet zijn geselecteerd, blijven ongewijzigd +- Behoudt de kwaliteit van de inhoud zonder opnieuw te renderen + +## Toepassingen + +- Gescande pagina's met twee naast elkaar scheiden (bijv. een boekscan met linker- en rechterpagina op één vel) +- Een liggende PDF met inhoud naast elkaar splitsen in afzonderlijke staande pagina's +- Hoge infographics of posters verdelen in aparte boven- en ondersecties +- Documenten in breed formaat voorbereiden op afdrukken op standaardpapier + +## Tips + +- Als de inhoud op je pagina's ongelijk is verdeeld, gebeurt de splitsing toch op het exacte midden. Overweeg voor asymmetrische splitsingen in plaats daarvan [PDF bijsnijden](./crop-pdf). +- Combineer deze tool met [PDF roteren](./rotate-pdf) als je pagina's vóór of na het opdelen gedraaid moeten worden. + +## Gerelateerde tools + +- [PDF splitsen](./split-pdf) +- [PDF bijsnijden](./crop-pdf) +- [N-up PDF](./n-up-pdf) +- [PDF posteriseren](./posterize-pdf) diff --git a/docs/nl/tools/duplex-collate.md b/docs/nl/tools/duplex-collate.md new file mode 100644 index 00000000..0a33e535 --- /dev/null +++ b/docs/nl/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Dubbelzijdige scan sorteren +description: Herorden dubbelzijdige scan-PDF's met voorzijden en achterzijden in aparte blokken naar de juiste volgorde van voor- en achterzijde. +--- + +# Dubbelzijdige scan sorteren + +Dubbelzijdige scan sorteren is bedoeld voor ADF-scanworkflows waarbij één PDF twee blokken pagina's bevat: + +- eerst alle voorzijden +- daarna alle achterzijden + +In plaats van handmatig splitsen en opnieuw samenstellen voegt deze tool de twee blokken samen in de natuurlijke leesvolgorde: voorzijde1, achterzijde1, voorzijde2, achterzijde2, enzovoort. + +## Zo werkt het + +1. Upload één PDF die is gemaakt met het scannen van een dubbelzijdige stapel. +2. Stel het splitspunt in waar het blok met voorzijden eindigt. +3. Kies hoe het blok met achterzijden wordt verwerkt: + - **Achterzijdeblok omkeren** (gebruikelijk als de stapel wordt omgedraaid voordat de achterzijden worden gescand) + - **Achterzijdeblok behouden zoals het is** +4. Klik op **PDF sorteren** om het opnieuw geordende resultaat te downloaden. + +## Opties + +- **Splitsing automatisch detecteren (helft)**: stelt het splitspunt in op `ceil(totalPages / 2)`. +- **Waarschuwing oneven pagina's**: waarschuwt als het totale aantal pagina's oneven is (vaak een scanfout). +- **Bevestiging ongelijke blokken**: vraagt om bevestiging als de blokken met voor- en achterzijden verschillen in grootte. +- **Gegroepeerde export**: splitst de gesorteerde uitvoer in aparte PDF's op basis van het oorspronkelijke aantal pagina's per document en downloadt ze als ZIP. + +## Uitvoergedrag + +- **Standaard**: één uitvoer-PDF (één invoer-PDF in, één uitvoer-PDF uit). +- **Gegroepeerde modus**: de uitvoer wordt verdeeld op basis van je waarde voor pagina's per document; als er meerdere delen ontstaan, worden ze als één ZIP gedownload, anders wordt één PDF gedownload. + +Als de blokken ongelijk van grootte zijn, worden eerst de gepaarde pagina's gesorteerd en worden de overgebleven ongepaarde pagina's achteraan toegevoegd. + +## Veelvoorkomende toepassingen + +- De volgorde herstellen na het scannen van een stapel dubbelzijdige formulieren in twee rondes. +- Pakketten met voor- en achterzijden opnieuw opbouwen van kantoorscanners die eerst alle voorzijden en dan alle achterzijden uitvoeren. +- Archiefscans nabewerken voordat ze in bestanden per document worden gesplitst. + +## Tips + +- De meeste dubbelzijdige reeksen moeten een even totaal aantal pagina's hebben. +- Als de achterzijden omgekeerd lijken, wissel dan tussen **Achterzijdeblok omkeren** en **Achterzijdeblok behouden zoals het is**. +- Gebruik voor originelen van 2 pagina's (voor- en achterzijde) gegroepeerde export met `2` pagina's per document. + +## Gerelateerde tools + +- [Pagina's afwisselen en mixen](./alternate-merge) +- [PDF splitsen](./split-pdf) +- [PDF samenvoegen](./merge-pdf) +- [Ordenen en dupliceren](./organize-pdf) diff --git a/docs/nl/tools/edit-attachments.md b/docs/nl/tools/edit-attachments.md new file mode 100644 index 00000000..0a7848a4 --- /dev/null +++ b/docs/nl/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Bijlagen bewerken +description: Bekijk bijgesloten bestanden in een PDF-document en verwijder ze selectief. +--- + +# Bijlagen bewerken + +Bekijk en beheer de bijgesloten bestanden in een PDF. De tool toont alle ingesloten bestanden met hun naam en bijlageniveau, en laat je afzonderlijke bijlagen voor verwijdering markeren of ze allemaal in één keer verwijderen. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. De tool zoekt automatisch naar bijlagen en toont ze in een lijst. +3. Bij elke bijlage staan de bestandsnaam en of het een bijlage op documentniveau of paginaniveau is. +4. Klik op het prullenbakpictogram naast een bijlage om hem voor verwijdering te markeren (klik opnieuw om de markering op te heffen). +5. Gebruik de knop **Alle bijlagen verwijderen** om alles in één keer te selecteren, of **Alles deselecteren** om je selectie te wissen. +6. Klik op de verwerkingsknop om een nieuwe PDF op te slaan zonder de geselecteerde bijlagen. + +## Functies + +- Toont alle bijlagen op documentniveau en paginaniveau +- Bijlagen afzonderlijk of in bulk verwijderen +- Selectie aan- en uitzetten voordat je de wijzigingen doorvoert +- Visuele doorhaling en verminderde dekking bij items die voor verwijdering zijn gemarkeerd +- Downloadt de gewijzigde PDF zonder de geselecteerde bijlagen + +## Toepassingen + +- Verouderde of onjuiste bijgesloten bestanden uit een document verwijderen voordat je het opnieuw verspreidt +- Gevoelige bijlagen (financiële gegevens, persoonlijke informatie) uit een PDF verwijderen voordat je hem deelt +- De bestandsgrootte van een PDF verkleinen door grote bijgesloten bestanden te verwijderen die niet meer nodig zijn +- Ingesloten inhoud controleren en een document opschonen vóór archivering + +## Tips + +- Bijlagen die voor verwijdering zijn gemarkeerd, worden doorgehaald weergegeven. Je kunt de markering vóór de verwerking nog ongedaan maken als je van gedachten verandert. +- Als er geen bijlagen zijn, toont de tool een duidelijke melding "Geen bijlagen gevonden": de PDF bevat dan gewoon geen ingesloten bestanden. + +## Gerelateerde tools + +- [Bijlagen toevoegen](./add-attachments) +- [Bijlagen extraheren](./extract-attachments) +- [Metadata weergeven](./view-metadata) diff --git a/docs/nl/tools/edit-metadata.md b/docs/nl/tools/edit-metadata.md new file mode 100644 index 00000000..8313c76d --- /dev/null +++ b/docs/nl/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Metadata bewerken +description: Bekijk en wijzig PDF-metadatavelden, waaronder titel, auteur, trefwoorden, datums en aangepaste eigenschappen. +--- + +# Metadata bewerken + +Bewerk de metadata die in een PDF-bestand is ingesloten. De tool vult een formulier vooraf met de bestaande metadata van het document, laat je elk veld wijzigen en slaat de wijzigingen op in een nieuwe PDF. + +## Zo werkt het + +1. Upload een PDF-bestand. De tool leest de huidige metadata en vult het formulier. +2. Bewerk een van de standaardvelden: Titel, Auteur, Onderwerp, Trefwoorden, Maker, Producent. +3. Pas de aanmaakdatum en de wijzigingsdatum aan met de datum-tijdkiezers. +4. Voeg aangepaste metadatavelden toe door op de toevoegknop te klikken en een sleutel-waardepaar in te voeren. +5. Klik op de verwerkingsknop om de gewijzigde PDF op te slaan. + +## Functies + +- Vult alle bestaande metadata van de geüploade PDF vooraf in +- Standaardvelden: Titel, Auteur, Onderwerp, Trefwoorden, Maker, Producent +- Datum-tijdkiezers voor de aanmaakdatum en de wijzigingsdatum +- Aangepaste sleutel-waardevelden voor willekeurige eigenschappen +- Slaat wijzigingen direct op in het documentinformatiewoordenboek van de PDF + +## Bewerkbare velden + +| Veld | Beschrijving | +| --------------------- | --------------------------------------------------------- | +| **Titel** | De documenttitel die in PDF-lezers wordt getoond | +| **Auteur** | De persoon of organisatie die het document heeft gemaakt | +| **Onderwerp** | Een korte beschrijving van het onderwerp van het document | +| **Trefwoorden** | Door komma's gescheiden termen voor zoeken en indelen | +| **Maker** | De toepassing waarmee de inhoud oorspronkelijk is gemaakt | +| **Producent** | De toepassing die de PDF heeft gegenereerd | +| **Aanmaakdatum** | Wanneer het document oorspronkelijk is gemaakt | +| **Wijzigingsdatum** | Wanneer het document voor het laatst is gewijzigd | +| **Aangepaste velden** | Alle extra sleutel-waardeparen die je zelf definieert | + +## Toepassingen + +- Een juiste titel en auteur instellen voordat je een document publiceert +- Trefwoorden toevoegen om de vindbaarheid in documentbeheersystemen te verbeteren +- De wijzigingsdatum bijwerken zodat die de huidige revisie weergeeft +- Aangepaste metadatavelden toevoegen, zoals Afdeling, Project-ID of Classificatie +- Metadata opschonen die door de oorspronkelijke authoringsoftware is achtergelaten + +## Tips + +- Aangepaste velden worden rechtstreeks in het informatiewoordenboek van de PDF geschreven. Sommige PDF-lezers tonen aangepaste velden mogelijk niet, maar ze blijven in het bestand bewaard. +- Laat een veld leeg om het uit de metadata te wissen. De verwerkingsknop slaat op wat er in het formulier staat. +- Gebruik [Metadata weergeven](./view-metadata) om metadata te bekijken zonder te bewerken. Gebruik Metadata verwijderen om alle metadata volledig te verwijderen. + +## Gerelateerde tools + +- [Metadata weergeven](./view-metadata) +- [PDF OCG-lagen](./pdf-layers) +- [PDF comprimeren](./compress-pdf) diff --git a/docs/nl/tools/edit-pdf.md b/docs/nl/tools/edit-pdf.md new file mode 100644 index 00000000..921bcbfd --- /dev/null +++ b/docs/nl/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF bewerken +description: Annoteer, markeer, redigeer, voeg vormen en afbeeldingen toe, zoek en bekijk PDF's direct in je browser. +--- + +# PDF bewerken + +Met de PDF-editor van BentoPDF kun je je PDF's annoteren, markeren, redigeren, van opmerkingen voorzien, vormen en afbeeldingen toevoegen en doorzoeken. Er laadt een volledige editor direct in je browser, zonder uploads naar een server. + +## Zo werkt het + +1. Upload je PDF door op het uploadvak te klikken of een bestand erheen te slepen. +2. De ingebouwde PDF-editor opent automatisch met je document geladen. +3. Gebruik de werkbalk om te annoteren, markeren, redigeren, tekst toe te voegen, vormen te tekenen of afbeeldingen in te voegen. +4. Klik op **Bewerkte PDF downloaden** om je wijzigingen op te slaan. + +## Functies + +- Volledige annotatiewerkbalk met markeren, onderstrepen, doorhalen en vrij tekenen +- Tekst invoegen en opmerkingen plaatsen +- Redactiehulpmiddelen die gemarkeerde inhoud permanent verwijderen zodra je de redactie toepast. Als er nog markeringen niet zijn toegepast wanneer je op **Bewerkte PDF downloaden** klikt, biedt de editor aan ze eerst toe te passen. +- Vormhulpmiddelen voor rechthoeken, cirkels, lijnen en pijlen +- Afbeeldingen invoegen op PDF-pagina's +- Ingebouwd zoeken naar tekst in het document +- Ondersteuning voor meerdere documenten met tabbladen (tot 10 tegelijk geopende documenten) +- Bestanden laden via slepen en neerzetten + +## Toepassingen + +- Contracten beoordelen en wijzigingen markeren met markeringen en opmerkingen +- Vertrouwelijke informatie zoals burgerservicenummers of financiële gegevens redigeren voordat je ze deelt +- Annotaties toevoegen aan bouwplannen of technische tekeningen +- Bedrijfslogo's of stempels op documentpagina's plaatsen +- Lange juridische documenten doorzoeken op specifieke termen + +## Tips + +- Je kunt meerdere PDF's tegelijk openen en ertussen wisselen met de tabbalk bovenaan de editor. +- De editor behoudt de oorspronkelijke PDF-structuur, dus lettertypen, indelingen en formuliervelden blijven intact. +- Het markeren van tekst of een gebied voor redactie verwijdert nog niets zolang de redactie niet is toegepast. Als je geselecteerde tekst redigeert, worden kopieën ervan in de bestandseigenschappen, bladwijzers, opmerkingen en bijlagen ook uit de download verwijderd, tenzij het bestand is versleuteld. +- Gebruik voor het in bulk toevoegen van watermerken of paginanummers liever de speciale tools, voor meer controle over de opmaak. + +## Gerelateerde tools + +- [Watermerk toevoegen](./add-watermark) +- [PDF ondertekenen](./sign-pdf) +- [Stempels toevoegen](./add-stamps) +- [Annotaties verwijderen](./remove-annotations) diff --git a/docs/nl/tools/email-to-pdf.md b/docs/nl/tools/email-to-pdf.md new file mode 100644 index 00000000..cf5bdc72 --- /dev/null +++ b/docs/nl/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-mail naar PDF +description: Zet EML- en MSG-e-mailbestanden in je browser om naar PDF. Behoudt headers, berichttekst en de lijst met bijlagen. +--- + +# E-mail naar PDF + +Zet opgeslagen e-mailbestanden om naar nette, afdrukbare PDF's. De tool verwerkt EML- en MSG-bestanden, haalt het volledige bericht eruit (headers, berichttekst en metadata van bijlagen) en geeft alles weer in een gestructureerde PDF. Handig voor juridisch onderzoek, archivering of gewoon om een belangrijke e-mail af te drukken. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------ | :------- | :-------------------------------------------------------------------------- | +| EML | `.eml` | Standaard MIME-e-mailformaat (geëxporteerd uit de meeste e-mailprogramma's) | +| MSG | `.msg` | Eigen formaat van Microsoft Outlook | + +## Zo werkt het + +1. Klik op het uploadvak of sleep je EML- of MSG-bestanden erheen. Je kunt beide formaten in één reeks combineren. +2. Bekijk de bestandslijst. Verwijder ongewenste items met het prullenbakpictogram, of klik op **Meer bestanden toevoegen** om meer e-mails toe te voegen. +3. Stel de conversieopties in (zie hieronder). +4. Klik op **Converteren naar PDF**. De tool verwerkt elke e-mail, geeft de inhoud weer als opgemaakte HTML en zet die via de PyMuPDF-engine om naar PDF. +5. Eén e-mail wordt direct als PDF gedownload. Meerdere e-mails worden verpakt in `emails-converted.zip`. + +## Opties + +| Optie | Standaard | Beschrijving | +| :----------------------------- | :-------- | :--------------------------------------------------------------------------------------------------------------------- | +| **Paginaformaat** | A4 | Kies tussen de paginaformaten A4, Letter of Legal. | +| **CC en BCC opnemen** | Aan | Als dit is ingeschakeld, verschijnen de ontvangerslijsten voor CC en BCC in het headergedeelte van de PDF. | +| **Lijst met bijlagen opnemen** | Aan | Als dit is ingeschakeld, verschijnt een lijst met de bijlagen van de e-mail (met bestandsnamen en groottes) in de PDF. | + +## Toepassingen + +- Belangrijke zakelijke correspondentie als PDF archiveren voor compliance of controle +- E-mailconversaties afdrukken voor rechtszaken of verzoeken om gegevensverstrekking +- Een blijvend overzicht maken van orderbevestigingen, bonnen of contracten die per e-mail zijn ontvangen +- Outlook MSG-bestanden back-uppen in een formaat waarvoor Outlook niet nodig is +- Klantenservicegesprekken documenteren aan de hand van geëxporteerde EML-bestanden + +## Tips + +- Zowel EML (gebruikt door Thunderbird, Apple Mail en de meeste e-mailprogramma's) als Outlook MSG-bestanden worden ondersteund. Exporteer e-mails uit je e-mailprogramma en zet ze direct in de tool. +- E-mails met HTML-opmaak behouden hun stijl in de PDF. E-mails met platte tekst worden netjes en leesbaar weergegeven. +- De lijst met bijlagen toont bestandsnamen en groottes, maar sluit de bijlagen zelf niet in de PDF in. + +## Gerelateerde tools + +- [XML naar PDF](./xml-to-pdf) +- [XPS naar PDF](./xps-to-pdf) diff --git a/docs/nl/tools/epub-to-pdf.md b/docs/nl/tools/epub-to-pdf.md new file mode 100644 index 00000000..ca67dfd3 --- /dev/null +++ b/docs/nl/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB naar PDF +description: Zet EPUB-e-boeken in je browser om naar PDF. Gratis, zonder upload, conversie met privacy voorop. +--- + +# EPUB naar PDF + +Zet EPUB-e-boeken om naar PDF-bestanden zonder je browser te verlaten. EPUB is de open standaard voor digitale boeken, maar soms heb je een PDF met vaste opmaak nodig om af te drukken, te annoteren of te delen met mensen zonder e-reader. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------ | :------- | :-------------------------- | +| EPUB | `.epub` | EPUB 2- en EPUB 3-bestanden | + +## Zo werkt het + +1. Klik op het uploadvak of sleep je EPUB-bestanden erheen. Meerdere bestanden selecteren kan. +2. Bekijk de geüploade bestanden. Verwijder ongewenste items met het prullenbakpictogram, of klik op **Meer bestanden toevoegen** om de reeks uit te breiden. +3. Klik op **Converteren naar PDF**. De PyMuPDF-engine geeft de EPUB-inhoud (tekst, afbeeldingen en opmaak) weer als gepagineerde PDF-uitvoer. +4. Eén EPUB wordt direct als PDF gedownload. Meerdere bestanden worden verpakt in een ZIP-archief met de naam `epub-converted.zip`. + +## Opties + +De conversie draait met verstandige standaardinstellingen en vereist geen configuratie. Tekst wordt herschikt naar standaardpaginaformaten en ingesloten lettertypen en afbeeldingen worden overgenomen in de PDF. + +## Toepassingen + +- Een e-boek zonder DRM afdrukken om buiten het scherm te lezen +- Een EPUB-manuscript indienen als PDF met vaste opmaak ter beoordeling +- Digitale boeken archiveren in een formaat dat elk besturingssysteem native kan openen +- Een hoofdstuk delen met een collega die geen EPUB-lezer heeft +- Technische documentatie die als EPUB wordt verspreid omzetten naar PDF's die je kunt annoteren + +## Tips + +- Functies van EPUB 3, zoals ingesloten audio en video, worden niet overgenomen in de PDF, maar alle tekst, afbeeldingen en tabellen worden netjes geconverteerd. +- Controleer bij EPUB's met veel opmaak de eerste pagina's van de uitvoer om te bevestigen dat de opmaak klopt. + +## Gerelateerde tools + +- [MOBI naar PDF](./mobi-to-pdf) +- [FB2 naar PDF](./fb2-to-pdf) +- [CBZ naar PDF](./cbz-to-pdf) diff --git a/docs/nl/tools/excel-to-pdf.md b/docs/nl/tools/excel-to-pdf.md new file mode 100644 index 00000000..5b1d73dc --- /dev/null +++ b/docs/nl/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel naar PDF +description: Zet Excel-spreadsheets (XLS, XLSX), ODS- en CSV-bestanden om naar PDF met behoud van de opmaak. +--- + +# Excel naar PDF + +Zet spreadsheetbestanden om naar PDF. De tool verwerkt moderne Excel-bestanden, het oudere XLS-formaat, OpenDocument-spreadsheets en zelfs CSV. Alles wordt weergegeven door een LibreOffice-engine in de browser, die celopmaak, formules (als berekende waarden), grafieken en indelingen met meerdere bladen behoudt. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :----------------------- | :-------- | +| Excel (modern) | `.xlsx` | +| Excel (verouderd) | `.xls` | +| OpenDocument-spreadsheet | `.ods` | +| CSV | `.csv` | + +## Zo werkt het + +1. Klik op het uploadvak of sleep je spreadsheetbestanden erheen. +2. Bekijk de bestandslijst. Voeg meer bestanden toe of verwijder ongewenste bestanden. +3. Klik op **Converteren naar PDF**. De LibreOffice-engine wordt bij het eerste gebruik gestart en verwerkt daarna elk bestand. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden worden geleverd als `excel-converted.zip`. + +## Opties + +Deze tool heeft geen extra configuratie. De LibreOffice-engine bepaalt de paginaindeling, schaling en het afdrukbereik op basis van de ingebouwde instellingen van de spreadsheet. + +## Uitvoer + +| Aantal invoerbestanden | Uitvoer | +| :--------------------- | :------------------------------------------------------------------ | +| 1 bestand | Eén PDF-download (oorspronkelijke bestandsnaam met extensie `.pdf`) | +| 2+ bestanden | ZIP-archief (`excel-converted.zip`) met één PDF per bestand | + +## Toepassingen + +- Financiële rapporten of begrotingen uit Excel omzetten naar PDF voor verspreiding +- Drukklare PDF's maken van voorraad- of productcatalogusspreadsheets +- Resultaten van data-analyse delen met belanghebbenden die geen Excel hebben geïnstalleerd +- Kwartaalrapporten archiveren in een niet-bewerkbaar formaat +- ODS-bestanden uit LibreOffice Calc omzetten naar PDF + +## Tips + +- Grafieken in de spreadsheet worden weergegeven in de PDF. Controleer of ze in het bronbestand goed zijn voordat je converteert. +- Als je spreadsheet meerdere bladen heeft, worden alle bladen opgenomen in de PDF-uitvoer. +- Voor eenvoudige CSV-gegevens zonder opmaak biedt de tool [CSV naar PDF](./csv-to-pdf) een lichtere conversie. Gebruik Excel naar PDF wanneer je opmaak, grafieken of meerdere bladen wilt behouden. + +## Gerelateerde tools + +- [CSV naar PDF](./csv-to-pdf) +- [Word naar PDF](./word-to-pdf) +- [PowerPoint naar PDF](./powerpoint-to-pdf) diff --git a/docs/nl/tools/extract-attachments.md b/docs/nl/tools/extract-attachments.md new file mode 100644 index 00000000..12ede1f2 --- /dev/null +++ b/docs/nl/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Bijlagen extraheren +description: Haal alle ingesloten bijlagen uit een of meer PDF's en download ze als ZIP-archief. +--- + +# Bijlagen extraheren + +Haal alle ingesloten bijlagen uit een of meer PDF-bestanden. Alle geëxtraheerde bestanden worden gebundeld in één ZIP-archief om te downloaden. + +## Zo werkt het + +1. Upload een of meer PDF-bestanden met ingesloten bijlagen. +2. Klik op **Bijlagen extraheren**. +3. De tool doorzoekt elke PDF op bijlagen op documentniveau en paginaniveau. +4. Alle gevonden bestanden worden verpakt in een ZIP-archief en automatisch gedownload. +5. Een statusmelding bevestigt hoeveel bijlagen zijn gevonden en wat hun totale grootte is. + +## Functies + +- Extractie in bulk uit meerdere PDF's tegelijk +- Extraheert bijlagen op zowel documentniveau als paginaniveau +- Levert één ZIP-bestand met alle geëxtraheerde bestanden +- Toont het totale aantal bijlagen en de gecombineerde bestandsgrootte +- Duidelijke statusmeldingen als er geen bijlagen zijn gevonden + +## Toepassingen + +- Gegevensbestanden terughalen die in een rapport-PDF zijn ingesloten +- Afbeeldingsbestanden uit een portfolio of specificatiedocument halen +- Aanvullend materiaal extraheren uit PDF's voor training of compliance +- Controleren welke bestanden in een reeks PDF's zijn ingesloten + +## Tips + +- Als de tool meldt dat er geen bijlagen zijn, bevat de PDF mogelijk ingesloten afbeeldingen of formuliergegevens: dat zijn geen bijgesloten bestanden. Gebruik [Afbeeldingen extraheren](./extract-images) voor ingesloten afbeeldingen. +- Bij het verwerken van meerdere PDF's komen alle bijlagen van elk bestand in één ZIP terecht. De bestandsnamen blijven zoals ze oorspronkelijk waren ingesloten. + +## Gerelateerde tools + +- [Bijlagen toevoegen](./add-attachments) +- [Bijlagen bewerken](./edit-attachments) +- [Afbeeldingen extraheren](./extract-images) diff --git a/docs/nl/tools/extract-images.md b/docs/nl/tools/extract-images.md new file mode 100644 index 00000000..ca793a24 --- /dev/null +++ b/docs/nl/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Afbeeldingen extraheren +description: Haal alle ingesloten afbeeldingen uit PDF-bestanden. Bekijk ze in een raster en download ze afzonderlijk of als ZIP-archief. +--- + +# Afbeeldingen extraheren + +Haalt alle ingesloten afbeeldingen uit een of meer PDF-bestanden. De geëxtraheerde afbeeldingen worden getoond in een voorbeeldraster, waar je ze afzonderlijk kunt downloaden of alles in één keer als ZIP kunt ophalen. Mogelijk gemaakt door PyMuPDF. + +## Zo werkt het + +1. Upload een of meer PDF's door op het uploadvak te klikken of bestanden erheen te slepen. Voeg zo nodig meer bestanden toe of verwijder afzonderlijke bestanden. +2. Klik op **Extraheren** om de verwerking te starten. +3. De tool doorzoekt elke pagina van elke geüploade PDF en extraheert de ingesloten afbeeldingen. +4. De geëxtraheerde afbeeldingen verschijnen in een raster met miniaturen. Elke afbeelding heeft een downloadknop. +5. Klik op **Alles downloaden** om alles als ZIP-archief op te slaan. + +## Opties + +Deze tool heeft geen instelbare opties. Alle ingesloten afbeeldingen worden geëxtraheerd in hun oorspronkelijke formaat (meestal PNG, JPEG of het formaat dat is gebruikt toen de afbeelding in de PDF werd ingesloten). + +## Uitvoerformaat + +- Afbeeldingen worden in een voorbeeldraster getoond onder de namen `image_1.png`, `image_2.jpg`, enzovoort. +- **Alles downloaden** levert `extracted-images.zip` met alle afbeeldingen. +- Afzonderlijke afbeeldingen kun je een voor een downloaden uit het raster. + +## Toepassingen + +- Foto's of afbeeldingen uit een PDF terughalen om in een ander project te hergebruiken. +- Productafbeeldingen uit een catalogus-PDF extraheren voor een webwinkelvermelding. +- Diagrammen uit technische documentatie halen voor gebruik in presentaties. +- Controleren welke afbeeldingen in een document zijn ingesloten voordat je het deelt. + +## Tips + +- De tool extraheert afbeeldingen precies zoals ze in de PDF zijn opgeslagen. Pagina's worden niet opnieuw als afbeelding weergegeven. Gebruik daarvoor [PDF naar PNG](./pdf-to-png) of [PDF naar JPG](./pdf-to-jpg). +- Als de tool "Geen afbeeldingen gevonden" meldt, gebruikt de PDF mogelijk vectorafbeeldingen in plaats van ingesloten rasterafbeeldingen, of is het een gescand document waarbij de hele pagina één grote afbeelding is. +- Verwerking in bulk werkt voor meerdere PDF's. Alle afbeeldingen uit alle bestanden worden gecombineerd in één raster en één ZIP. + +## Gerelateerde tools + +- [PDF naar PNG](./pdf-to-png) +- [PDF naar JPG](./pdf-to-jpg) +- [PDF-workflowbouwer](./pdf-workflow) diff --git a/docs/nl/tools/extract-pages.md b/docs/nl/tools/extract-pages.md new file mode 100644 index 00000000..8d7b6ab0 --- /dev/null +++ b/docs/nl/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Pagina's extraheren +description: Sla een specifiek bereik pagina's uit een PDF op als nieuw document. +--- + +# Pagina's extraheren + +Haal een aantal pagina's uit een PDF en sla ze op als nieuw bestand. Geef met bereiksyntaxis precies op welke pagina's je wilt, en de tool maakt een nette PDF met alleen die pagina's. + +## Zo werkt het + +1. Upload een PDF-bestand. De tool toont de bestandsnaam, de grootte en het totale aantal pagina's. +2. Voer de te extraheren pagina's in met bereiksyntaxis (bijv. `1-5`, `3, 7, 10-12`). +3. Kies eventueel om elk bereik als aparte PDF in een ZIP-archief te downloaden. +4. Klik op de verwerkingsknop. De geëxtraheerde pagina's worden gedownload als nieuwe PDF (of ZIP). + +## Functies + +- Flexibele syntaxis voor paginabereiken: afzonderlijke pagina's, bereiken of combinaties gescheiden door komma's +- Toont na het uploaden het totale aantal pagina's als referentie +- Optie om uit te voeren als één gecombineerde PDF of als afzonderlijke bestanden in een ZIP +- Behoudt de oorspronkelijke inhoud en opmaak van de pagina's + +## Toepassingen + +- De samenvatting (de eerste paar pagina's) uit een lang rapport halen +- Een enkel hoofdstuk uit een studieboek-PDF extraheren +- Specifieke pagina's uit een formulierenpakket opslaan als losse documenten +- Een voorbeelddocument maken van geselecteerde pagina's uit een groter bestand + +## Tips + +- Paginanummers beginnen bij 1. Gebruik `1` voor de eerste pagina, niet `0`. +- Gebruik [Pagina's verwijderen](./delete-pages) als je pagina's wilt verwijderen in plaats van extraheren: dat is de omgekeerde bewerking. +- Als je pagina's visueel met miniaturen wilt selecteren, gebruik dan [PDF splitsen](./split-pdf) in de modus Visueel selecteren. + +## Gerelateerde tools + +- [PDF splitsen](./split-pdf) +- [Pagina's verwijderen](./delete-pages) +- [PDF samenvoegen](./merge-pdf) diff --git a/docs/nl/tools/extract-tables.md b/docs/nl/tools/extract-tables.md new file mode 100644 index 00000000..7e33b107 --- /dev/null +++ b/docs/nl/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Tabellen extraheren +description: Detecteer en extraheer tabellen uit PDF-documenten. Exporteer als CSV, JSON of Markdown, per tabel. +--- + +# Tabellen extraheren + +Detecteert alle tabellen in een PDF en laat je ze exporteren in het formaat van je keuze: CSV, JSON of Markdown. Elke tabel wordt afzonderlijk geëxtraheerd met metadata over pagina en positie. Mogelijk gemaakt door de tabeldetectie-engine van PyMuPDF. + +## Zo werkt het + +1. Upload een PDF door op het uploadvak te klikken of een bestand erheen te slepen. +2. Kies je gewenste **exportformaat**: CSV, JSON of Markdown. +3. Klik op **Extraheren** om de verwerking te starten. +4. Als er één tabel is gevonden, wordt die als enkel bestand gedownload. Bij meerdere tabellen krijg je een ZIP-archief met één bestand per tabel. + +## Opties + +- **Exportformaat**: kies tussen: + - **CSV**: door komma's gescheiden waarden, met correcte aanhalingstekens voor velden met komma's, aanhalingstekens of regeleinden. Geschikt voor spreadsheets en databases. + - **JSON**: structuur van arrays in arrays, opgemaakt met inspringing van 2 spaties. Geschikt voor verwerking door programma's. + - **Markdown**: tabelformaat met verticale streepjes, weergegeven door PyMuPDF. Geschikt voor documentatie en README-bestanden. + +## Uitvoerformaat + +- **Eén tabel**: `filename_table.csv` (of `.json` / `.md`) +- **Meerdere tabellen**: `filename_tables.zip` met bestanden met namen als `table_1_page3.csv`, `table_2_page5.csv`, enzovoort. + +## Toepassingen + +- Specifieke tabellen uit lange PDF-rapporten extraheren zonder de gegevens van het hele document op te halen. +- Tabellen in Markdown-formaat ophalen om direct in GitHub-issues, wiki's of documentatie te plakken. +- Gestructureerde JSON-gegevens uit PDF-tabellen halen voor API-integraties of scripts. +- Tabellen in verschillende PDF-versies vergelijken door beide naar CSV te exporteren en de verschillen te bekijken. + +## Tips + +- Met deze tool heb je controle per tabel. Als je alle tabellen gewoon in één CSV wilt hebben, gebruik dan [PDF naar CSV](./pdf-to-csv). Voor een volledige Excel-werkmap gebruik je [PDF naar Excel](./pdf-to-excel). +- Tabellen die over meerdere pagina's lopen, worden mogelijk per pagina als aparte tabel gedetecteerd. Je moet ze dan misschien handmatig samenvoegen. +- Als er geen tabellen worden gedetecteerd, is de PDF mogelijk een gescande afbeelding. Voer er eerst OCR op uit om een tekstlaag toe te voegen. + +## Gerelateerde tools + +- [PDF naar CSV](./pdf-to-csv) +- [PDF naar Excel](./pdf-to-excel) +- [PDF naar tekst](./pdf-to-text) diff --git a/docs/nl/tools/fb2-to-pdf.md b/docs/nl/tools/fb2-to-pdf.md new file mode 100644 index 00000000..7a06b1a5 --- /dev/null +++ b/docs/nl/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 naar PDF +description: Zet FictionBook (FB2) e-books om naar PDF in je browser. Gratis, privé, geen upload naar een server. +--- + +# FB2 naar PDF + +Zet FictionBook 2 (FB2) bestanden om naar PDF-documenten. FB2 is een op XML gebaseerd e-bookformaat dat populair is in Rusland en Oost-Europa. Op sommige platforms wordt het goed ondersteund, op andere is het vrijwel onbekend. Door het om te zetten naar PDF zijn je boeken overal leesbaar. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------------ | :------- | :------------------------- | +| FictionBook 2 | `.fb2` | E-bookformaat op XML-basis | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep je FB2-bestanden erheen. Je kunt meerdere bestanden tegelijk selecteren. +2. Bekijk de bestandslijst. Gebruik het prullenbakpictogram om bestanden te verwijderen, of **Meer bestanden toevoegen** om er meer bij te zetten. +3. Klik op **Converteren naar PDF**. De PyMuPDF-engine leest de FB2 XML-structuur en geeft die weer als PDF-inhoud met pagina's. +4. Eén bestand wordt direct als PDF gedownload. Meerdere conversies worden gebundeld in `fb2-converted.zip`. + +## Opties + +Configuratie is niet nodig. De converter verwerkt de FB2 XML-structuur automatisch en behoudt hoofdstukeinden, opmaak en ingesloten afbeeldingen. + +## Toepassingen + +- FB2 e-books lezen op apparaten of apps die alleen PDF ondersteunen +- Russischtalige literatuur afdrukken die in FB2-formaat wordt verspreid +- Een FB2-bibliotheek archiveren in een formaat dat overal wordt ondersteund +- Een boek delen met iemand wiens lezer FictionBook niet ondersteunt + +## Tips + +- FB2-bestanden zijn gewone XML, dus ze zijn meestal klein en worden snel geconverteerd, zelfs in de browser. +- Als je FB2-bestanden zijn gecomprimeerd als `.fb2.zip`, pak ze dan eerst uit voordat je ze uploadt. + +## Gerelateerde tools + +- [EPUB naar PDF](./epub-to-pdf) +- [MOBI naar PDF](./mobi-to-pdf) +- [XML naar PDF](./xml-to-pdf) diff --git a/docs/nl/tools/fix-page-size.md b/docs/nl/tools/fix-page-size.md new file mode 100644 index 00000000..4d3028a3 --- /dev/null +++ b/docs/nl/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Paginagrootte corrigeren +description: Breng alle pagina's van een PDF terug naar één uniform formaat. Kies een standaard papierformaat of stel eigen afmetingen in. +--- + +# Paginagrootte corrigeren + +PDF's die uit meerdere bronnen zijn samengesteld hebben vaak pagina's van verschillend formaat: sommige Letter, sommige A4, sommige helemaal niet standaard. Deze tool dwingt elke pagina naar één doelformaat en schaalt de inhoud zo nodig passend of vullend. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. Kies een **Doelpaginaformaat** in de keuzelijst (A4, Letter, Legal, A3, A5, Tabloid of Aangepast). +3. Kies een **Oriëntatie**: Automatisch behoudt de oorspronkelijke oriëntatie van elke pagina, of je dwingt Staand of Liggend af. +4. Kies een modus voor **Inhoud schalen**: Passend (behoudt alle inhoud, kan marges toevoegen) of Vullend (vult de pagina, kan randen afsnijden). +5. Stel optioneel een **Achtergrondkleur** in voor eventueel toegevoegde marges. +6. Klik op **Paginaformaat corrigeren**. + +## Opties + +- **Standaardformaten**: A4, Letter, Legal, A3, A5, Tabloid +- **Aangepaste afmetingen**: Voer breedte en hoogte in inches of millimeters in +- **Oriëntatie**: Automatisch, Staand, Liggend +- **Schaalmodus**: Passend of Vullend (bijsnijden) +- **Achtergrondkleur**: Elke kleur voor de opvulling van marges + +## Toepassingen + +- Een samengevoegde PDF normaliseren waarvan de pagina's van verschillende scanners komen +- Een US Letter-document omzetten naar A4 voor internationale verspreiding +- Drukklare PDF's voorbereiden die een consistent afsnijformaat vereisen +- Pagina's corrigeren die licht van de standaard afwijken (bijvoorbeeld 8,49 x 11,02 inch in plaats van 8,5 x 11) + +## Tips + +- Gebruik de modus Passend om zeker te zijn dat er geen inhoud verloren gaat. De modus Vullend ziet er netter uit, maar kan randen afsnijden. +- Controleer het resultaat met de tool Pagina-afmetingen om te bevestigen dat elke pagina overeenkomt met het doelformaat. +- Wit is de standaard achtergrondkleur. Kies een donkere kleur als je document donkere marges heeft. + +## Gerelateerde tools + +- [Pagina-afmetingen](./page-dimensions): controleer paginaformaten voor en na het corrigeren +- [PDF comprimeren](./compress-pdf): verklein het bestand na het standaardiseren +- [PDF bijsnijden](./crop-pdf): snijd pagina's handmatig bij in plaats van automatisch te schalen diff --git a/docs/nl/tools/flatten-pdf.md b/docs/nl/tools/flatten-pdf.md new file mode 100644 index 00000000..91ae2c52 --- /dev/null +++ b/docs/nl/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: PDF platmaken +description: Maak interactieve formulieren en aantekeningen plat tot statische inhoud. Formuliervelden worden niet-bewerkbaar en aantekeningen worden in de pagina ingebakken. +--- + +# PDF platmaken + +Platmaken voegt interactieve elementen, zoals formuliervelden, keuzelijsten, selectievakjes, aantekeningen, markeringen en plaknotities, rechtstreeks samen met de pagina-inhoud. Het uiterlijk blijft gelijk, maar niets is nog bewerkbaar of uitleesbaar. Het is het PDF-equivalent van een ingevuld formulier afdrukken en weer inscannen, alleen blijft de kwaliteit perfect. + +## Zo werkt het + +1. Upload een of meer PDF-bestanden. +2. Klik op **PDF platmaken**. +3. Eén bestand wordt direct gedownload. Meerdere bestanden leveren een ZIP-archief op. + +De tool gebruikt pdf-lib om formuliervelden plat te maken (via `form.flatten()`) en een aparte aantekeningenverwerker om aantekeningen in de paginastroom in te bakken. Beide bewerkingen gebeuren in één keer. + +## Wat wordt platgemaakt + +- **Formuliervelden**: Tekstvelden, selectievakjes, keuzerondjes, keuzelijsten, handtekeningvelden +- **Aantekeningen**: Opmerkingen, markeringen, doorhalingen, onderstrepingen, plaknotities, stempels, inktaantekeningen +- **Interactieve elementen**: Knoppen, actietriggers + +## Wat ongewijzigd blijft + +- Tekstinhoud (blijft selecteerbaar en doorzoekbaar) +- Afbeeldingen en afbeeldingselementen +- Pagina-indeling en afmetingen +- Bladwijzers en inhoudsopgave +- Hyperlinks (tenzij ze op aantekeningen zijn gebaseerd) + +## Toepassingen + +- Een ingevuld formulier vergrendelen zodat ontvangers de ingediende antwoorden niet kunnen wijzigen +- Een PDF voorbereiden voor archivering waarbij interactieve elementen niet nodig zijn +- Weergaveproblemen oplossen doordat aantekeningen in verschillende viewers anders worden getoond +- Zorgen dat een ondertekend document na het plaatsen van de handtekening niet meer kan worden gewijzigd +- De bestandsgrootte verkleinen door formulierveldedefinities en aantekeningobjecten te verwijderen + +## Tips + +- Maak pas plat als alle bewerkingen klaar zijn. Platmaken is niet ongedaan te maken. +- Wil je platmaken en ook metadata, JavaScript en bijlagen verwijderen, gebruik dan de tool PDF opschonen: platmaken zit daar als optie in. +- Sommige PDF's melden "geen formulier gevonden". Dat is normaal als het document alleen aantekeningen en geen formuliervelden heeft. + +## Gerelateerde tools + +- [PDF opschonen](./sanitize-pdf): formulieren platmaken plus metadata, scripts en meer verwijderen +- [PDF rasteriseren](./rasterize-pdf): omzetten naar een PDF op afbeeldingsbasis voor maximaal platmaken +- [Lettertype naar contour](./font-to-outline): lettertypen omzetten naar vectorpaden +- [PDF versleutelen](./protect-pdf): beveilig de platgemaakte PDF met een wachtwoord diff --git a/docs/nl/tools/font-to-outline.md b/docs/nl/tools/font-to-outline.md new file mode 100644 index 00000000..35563328 --- /dev/null +++ b/docs/nl/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Lettertype naar contouren +description: Zet alle PDF-lettertypen om naar vectorcontouren voor consistente weergave op alle apparaten. Voorkomt problemen met ontbrekende lettertypen. +--- + +# Lettertype naar contouren + +Lettertypen naar contouren omzetten verandert elk teken van een lettertypeglyph in een vectorpad. De PDF is dan niet meer afhankelijk van geïnstalleerde lettertypen en wordt op elk apparaat, elk besturingssysteem en elke printer identiek weergegeven. Dit is een standaardstap in prepress-workflows. + +## Zo werkt het + +1. Upload een of meer PDF-bestanden. +2. Klik op **Converteren naar contouren**. +3. Ghostscript zet alle tekst om naar vectorpaden. +4. Download het resultaat. Meerdere bestanden leveren een ZIP-archief op. + +Er zijn geen instellingen. De tool gebruikt Ghostscript (WebAssembly) om alle lettertypeverwijzingen in één keer om te zetten naar contourpaden. + +## Wat er verandert + +- Tekens worden vectorkrommen (bezierpaden) +- Het insluiten van lettertypen is niet meer nodig: de PDF is op glyphniveau zelfvoorzienend +- De bestandsgrootte kan toenemen, omdat vectorpaden meestal groter zijn dan lettertypeverwijzingen +- Het uiterlijk blijft exact behouden + +## Wat je kwijtraakt + +- Tekst selecteren en kopiëren en plakken +- Doorzoekbaarheid van tekst (Ctrl+F werkt niet meer) +- De mogelijkheid om tekstinhoud te bewerken +- Toegankelijkheid voor schermlezers + +## Toepassingen + +- PDF's sturen naar een drukkerij die lettertypen als contouren vereist +- Documenten delen die aangepaste of gelicentieerde lettertypen gebruiken met mensen die die lettertypen niet hebben +- Lettertypevervanging voorkomen die het uiterlijk van je document op andere systemen verandert +- PDF's voorbereiden voor lasergraveer- of CNC-workflows die vectorinvoer vereisen +- Zorgen dat een PDF met veel logo's op alle platforms goed wordt weergegeven + +## Tips + +- Bewaar je originele PDF. Omzetten naar contouren is onomkeerbaar: je kunt paden niet terugzetten naar bewerkbare tekst. +- Moet de tekst doorzoekbaar blijven, gebruik dan liever de tool PDF rasteriseren met OCR als vervolgstap. +- PDF's met contouren zijn meestal groter. Voer daarna PDF comprimeren uit als de bestandsgrootte belangrijk is. + +## Gerelateerde tools + +- [PDF platmaken](./flatten-pdf): maak formulieren en aantekeningen plat zonder lettertypen aan te raken +- [PDF rasteriseren](./rasterize-pdf): omzetten naar een PDF op afbeeldingsbasis in plaats van vectorcontouren +- [PDF comprimeren](./compress-pdf): verklein het bestand na het omzetten naar contouren +- [PDF naar PDF/A](./pdf-to-pdfa): converteer voor archivering nadat de lettertypeonafhankelijkheid is gewaarborgd diff --git a/docs/nl/tools/form-creator.md b/docs/nl/tools/form-creator.md new file mode 100644 index 00000000..602184ae --- /dev/null +++ b/docs/nl/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: PDF-formulier aanmaken +description: Bouw invulbare PDF-formulieren met tekstvelden, selectievakjes, keuzelijsten, keuzerondjes en meer via slepen en neerzetten. +--- + +# PDF-formulier aanmaken + +Ontwerp professionele invulbare PDF-formulieren vanaf nul of door velden toe te voegen aan een bestaande PDF. In de visuele editor sleep je formulierelementen, zoals tekstvelden, selectievakjes, keuzelijsten, keuzerondjes en handtekeningvelden, rechtstreeks op de paginavoorbeelden. Stel veldeigenschappen in, maak regels voor voorwaardelijke zichtbaarheid en exporteer een volledig interactief PDF-formulier. + +## Zo werkt het + +1. Upload een bestaande PDF **of** klik op **Lege PDF maken** om helemaal opnieuw te beginnen. +2. Kies bij een lege PDF een paginaformaat (Letter, A4, A5, Legal, Tabloid, A3 of eigen afmetingen). +3. De formuliereditor opent met een werkbalk met veldtypen en een voorbeeldgebied van de pagina. +4. Kies een veldtype in de werkbalk en klik op de pagina om het te plaatsen. +5. Sleep velden om ze te verplaatsen. Gebruik de formaathandvatten om de afmetingen aan te passen. +6. Klik op een veld om het eigenschappenpaneel te openen, waar je de veldnaam, standaardwaarde, lettergrootte, uitlijning en meer instelt. +7. Navigeer tussen pagina's met de paginabesturing. +8. Klik op **Opslaan** om de voltooide invulbare PDF te downloaden. + +## Functies + +- Velden plaatsen met slepen en neerzetten, met visuele handvatten voor het aanpassen van het formaat +- Veldtypen: tekstinvoer, tekst met meerdere regels, selectievakje, keuzelijst, keuzerondje, handtekening, datum, getal en streepjescode +- Eigenschappenpaneel voor naam, label, standaardwaarde, lettergrootte, kleur, uitlijning en validatie van elk veld +- Veldacties en regels voor voorwaardelijke zichtbaarheid (velden tonen of verbergen op basis van andere veldwaarden) +- Paginanavigatie voor formulieren met meerdere pagina's +- Extractie van bestaande velden: formuliervelden in geüploade PDF's worden automatisch gedetecteerd en geïmporteerd +- Ondersteuning voor zowel geüploade PDF's als lege pagina's als formulierondergrond +- Meerdere paginaformaatvoorinstellingen plus eigen afmetingen +- Streepjescodes genereren met bwip-js +- Beheer van groepen keuzerondjes + +## Opties + +**Voorinstellingen voor paginaformaat (voor lege PDF's):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Aangepast (geef breedte en hoogte op) + +**Veldeigenschappen (verschillen per veldtype):** + +- Naam, label en plaatshoudertekst +- Standaardwaarde +- Lettertype, grootte en kleur +- Tekstuitlijning (links, gecentreerd, rechts) +- Schakelaar voor verplicht veld +- Schakelaar voor alleen-lezen +- Maximale lengte voor tekstvelden +- Optielijst voor keuzelijsten en keuzerondjes +- Acties voor voorwaardelijke zichtbaarheid + +## Toepassingen + +- Onboardingformulieren voor medewerkers bouwen met tekstvelden voor persoonlijke gegevens en selectievakjes voor het accepteren van beleid +- Intakevragenlijsten voor klanten maken met keuzelijsten voor dienstselectie +- Bestelformulieren ontwerpen met berekende velden en streepjescode-identificatie +- Inspectiechecklists bouwen met keuzerondjes voor goed/fout-beoordelingen +- Enquêteformulieren maken met voorwaardelijke vervolgvragen die verschijnen op basis van antwoorden + +## Tips + +- Als je een bestaande PDF uploadt, probeert de tool de aanwezige formuliervelden te extraheren, zodat je ze kunt bewerken of aanvullen. +- Gebruik de groepsfunctie voor keuzerondjes om elkaar uitsluitende keuzes te maken. Velden in dezelfde groep delen een groepsnaam. +- Test je formulier door het te downloaden en te openen in de [Formulier invullen](./form-filler)-tool om het gedrag van de velden te controleren. + +## Gerelateerde tools + +- [Formulier invullen](./form-filler) +- [PDF ondertekenen](./sign-pdf) +- [PDF-editor](./edit-pdf) diff --git a/docs/nl/tools/form-filler.md b/docs/nl/tools/form-filler.md new file mode 100644 index 00000000..c7419ed3 --- /dev/null +++ b/docs/nl/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF-formulier invullen +description: Vul PDF-formulieren in, ook XFA-formulieren, rechtstreeks in je browser met een ingebouwde viewer. +--- + +# PDF-formulier invullen + +Open een PDF met formuliervelden en vul die direct in een ingebouwde viewer in. De tool ondersteunt zowel standaard AcroForm-velden als oudere XFA-formulieren (XML Forms Architecture). Als je het formulier hebt ingevuld, download je de ingevulde versie met één klik. + +## Zo werkt het + +1. Upload een PDF met formuliervelden. +2. Het document opent in een geïntegreerde PDF-viewer die formuliervelden als interactieve invoer weergeeft. +3. Klik op tekstvelden, selectievakjes, keuzelijsten en keuzerondjes om ze in te vullen. +4. Klik op **Opslaan en ingevuld formulier downloaden** om de voltooide PDF te krijgen. + +## Functies + +- Ingebouwde PDF.js-viewer met volledige interactie met formuliervelden +- Ondersteuning voor standaard AcroForm-velden (tekstinvoer, selectievakjes, keuzelijsten, keuzerondjes) +- XFA-ondersteuning voor oudere formulieren op XML-basis +- Automatisch aanpassen van het viewerformaat aan de paginaafmetingen +- Bestandsweergave met naam en grootte + +## Opties + +Er zijn geen extra configuratieopties. Upload het formulier, vul het in en download het. + +## Toepassingen + +- Belastingformulieren, verzekeringsaanvragen of overheidspapieren invullen +- Sollicitatieformulieren invullen die je als PDF-bijlage ontvangt +- Onboardingformulieren voor leveranciers of leveranciersvragenlijsten invullen +- Compliancechecklists afvinken met selectievakjes +- Medische intakeformulieren invullen voor een afspraak + +## Tips + +- XFA-formulieren zijn een verouderd formaat dat maar door sommige PDF-viewers wordt ondersteund. Als je een XFA-PDF in Chrome of de meeste andere tools opent en lege pagina's ziet, ontbreekt daar XFA-ondersteuning. De Formulier invullen-tool van BentoPDF en Firefox verwerken XFA wel goed. +- Gebruik voor PDF's zonder formuliervelden eerst de tool [PDF-formulier maken](./form-creator) om velden toe te voegen en vul ze daarna hier in. +- De viewer past zijn formaat automatisch aan de paginaafmetingen van de PDF aan. + +## Gerelateerde tools + +- [PDF-formulier maken](./form-creator) +- [PDF ondertekenen](./sign-pdf) +- [PDF-editor](./edit-pdf) diff --git a/docs/nl/tools/header-footer.md b/docs/nl/tools/header-footer.md new file mode 100644 index 00000000..e076e257 --- /dev/null +++ b/docs/nl/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Koptekst en voettekst +description: Voeg aanpasbare koptekst en voettekst toe aan PDF-pagina's met dynamische variabelen voor paginanummers. +--- + +# Koptekst en voettekst + +Voeg tekst toe op zes posities op je PDF-pagina's: koptekst links, midden en rechts, en voettekst links, midden en rechts. De tool ondersteunt dynamische variabelen voor paginanummers en het totale aantal pagina's, zodat je sjablonen als "Pagina 3 van 10" kunt maken die per pagina automatisch worden bijgewerkt. + +## Zo werkt het + +1. Upload je PDF-bestand. +2. Het optiepaneel verschijnt met opmaakinstellingen en zes tekstvelden. +3. Voer je gewenste tekst in op een van de posities voor koptekst of voettekst. +4. Gebruik de plaatshouders `{page}` en `{total}` voor dynamische paginanummering. +5. Pas lettergrootte en letterkleur aan en beperk het eventueel tot een bepaald paginabereik. +6. Klik op **Koptekst en voettekst toevoegen** om te verwerken en te downloaden. + +## Opties + +- **Paginabereik**: Beperk optioneel welke pagina's een koptekst en voettekst krijgen. Laat leeg om op alle pagina's toe te passen. Notatie: "1-3, 5" (bereiken gescheiden door komma's). +- **Lettergrootte**: Tussen 6 en 24 punten. Standaard 10. +- **Letterkleur**: Kies een willekeurige kleur met de kleurkiezer. +- **Koptekst links / midden / rechts**: Tekstvelden voor de bovenkant van elke pagina. +- **Voettekst links / midden / rechts**: Tekstvelden voor de onderkant van elke pagina. + +## Functies + +- Zes onafhankelijke tekstposities per pagina +- Dynamische variabele `{page}` die het huidige paginanummer invoegt +- Dynamische variabele `{total}` die het totale aantal pagina's invoegt +- Filteren op paginabereik om specifieke pagina's te kiezen +- Aanpasbare lettergrootte en kleur +- Helvetica-lettertype voor een verzorgd, professioneel resultaat + +## Toepassingen + +- "Pagina {page} van {total}" toevoegen in het midden van de voettekst van een rapport +- Een bedrijfsnaam links in de koptekst en een documentdatum rechts in de koptekst plaatsen +- Vertrouwelijkheidsverklaringen toevoegen aan de voettekst van juridische documenten +- Revisienummers van documenten stempelen op specifieke paginabereiken + +## Tips + +- Combineer `{page}` en `{total}` in één veld voor notaties als "Pagina {page} van {total}" of "{page}/{total}". +- Je kunt de meeste velden leeg laten en alleen de posities invullen die je nodig hebt. Lege velden worden gewoon overgeslagen. +- Voor complexere kopteksten met afbeeldingen of logo's kun je de tool [Watermerk toevoegen](./add-watermark) gebruiken, bovenaan de pagina geplaatst. + +## Gerelateerde tools + +- [Paginanummers](./page-numbers) +- [Watermerk toevoegen](./add-watermark) +- [Bates-nummering](./bates-numbering) diff --git a/docs/nl/tools/heic-to-pdf.md b/docs/nl/tools/heic-to-pdf.md new file mode 100644 index 00000000..2b5f01f3 --- /dev/null +++ b/docs/nl/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC naar PDF +description: Zet HEIC- en HEIF-afbeeldingen van iPhones en iPads om naar PDF, rechtstreeks in je browser. +--- + +# HEIC naar PDF + +Zet HEIC/HEIF-afbeeldingen om naar PDF. HEIC is sinds iOS 11 het standaard fotoformaat op iPhones en iPads. Met deze tool maak je van die foto's PDF's zonder desktopsoftware te installeren of bestanden naar een server te uploaden. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep je HEIC/HEIF-bestanden erheen. +2. Bekijk de bestandslijst en verwijder ongewenste bestanden. +3. Klik op **Converteren naar PDF**. Het resultaat wordt gedownload als `from_heic.pdf`. + +Elk HEIC-bestand wordt gedecodeerd met de bibliotheek heic2any, die het met 92% kwaliteit omzet naar PNG. De PNG wordt daarna met pdf-lib in de PDF ingesloten, met elke afbeelding op een eigen pagina op volledige resolutie. + +## Opties + +Deze tool heeft geen extra instellingen. HEIC-afbeeldingen worden met hoge kwaliteit (0.92) naar PNG omgezet voordat ze worden ingesloten. + +## Toepassingen + +- Een PDF maken van iPhone-foto's om bij te voegen aan een verzekeringsclaim of rapport +- HEIC-foto's voor een woningadvertentie omzetten naar één afdrukbaar document +- iPad-schermafbeeldingen (HEIF-formaat) omzetten naar een deelbare PDF +- Vakantiefoto's voor een reisdagboek in één keer omzetten + +## Tips + +- HEIC-decodering gebeurt volledig in de browser met WebAssembly. De eerste conversie kan even duren terwijl de decoder wordt geladen. +- Wil je HEIC combineren met andere afbeeldingsformaten (JPG, PNG, enz.), gebruik dan de tool [Afbeeldingen naar PDF](./image-to-pdf), die HEIC naast alle andere formaten aankan. +- HEIC-bestanden van iPhones bevatten vaak EXIF-gegevens, waaronder GPS-coördinaten. De PDF-uitvoer neemt deze metadata niet over. + +## Gerelateerde tools + +- [Afbeeldingen naar PDF](./image-to-pdf) +- [JPG naar PDF](./jpg-to-pdf) +- [PNG naar PDF](./png-to-pdf) diff --git a/docs/nl/tools/image-to-pdf.md b/docs/nl/tools/image-to-pdf.md new file mode 100644 index 00000000..beebcd7d --- /dev/null +++ b/docs/nl/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Afbeelding naar PDF +description: Zet JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD en meer dan 10 andere afbeeldingsformaten om naar één PDF-bestand. +--- + +# Afbeelding naar PDF + +De universele converter van afbeeldingen naar PDF. Upload afbeeldingen in vrijwel elk formaat en combineer ze tot één PDF-document. Elke afbeelding krijgt een eigen pagina, met het formaat van het origineel. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Dit is de breedste formaatondersteuning van alle afbeeldingsconverters in BentoPDF. Heb je maar één specifiek formaat nodig, gebruik dan liever de bijbehorende aparte tool. + +## Zo werkt het + +1. Klik op het uploadgebied of sleep je afbeeldingsbestanden erheen. Je kunt meerdere bestanden tegelijk selecteren. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram, of klik op **Meer bestanden toevoegen** om extra afbeeldingen toe te voegen. +3. Kies een **PDF-kwaliteit** in de keuzelijst. +4. Klik op **Converteren naar PDF**. De tool verwerkt de afbeeldingen met de PyMuPDF-engine en downloadt het resultaat als `images_to_pdf.pdf`. + +## Opties + +**PDF-kwaliteit** bepaalt de beeldcompressie bij het insluiten van afbeeldingen in de PDF: + +- **Hoge kwaliteit**: minimale compressie, groter bestand. Het beste voor drukwerk of archivering. +- **Gemiddelde kwaliteit** (standaard): gebalanceerde compressie. Geschikt voor de meeste doeleinden. +- **Lage kwaliteit**: sterke compressie, kleinste bestand. Geschikt voor e-mail of snel delen. + +HEIC- en WebP-bestanden worden automatisch omgezet naar PNG voordat ze worden ingesloten. Dit gebeurt vanzelf en vergt geen extra stappen. + +## Toepassingen + +- Gescande bonnetjes of documenten van een telefooncamera combineren tot één PDF +- Een fotoportfolio of lookbook maken van afbeeldingen in verschillende formaten +- iPhone-foto's (HEIC) omzetten naar een deelbare PDF zonder desktopsoftware te installeren +- Ontwerpmockups uit PSD-exports en schermafbeeldingen samenstellen tot een oplevering voor een klant +- Een map met oudere afbeeldingsformaten (PNM, JXR, JP2) archiveren als één PDF + +## Tips + +- De volgorde van de afbeeldingen in de PDF komt overeen met de volgorde in de bestandslijst. Upload ze dus in de gewenste volgorde. +- Kies Lage kwaliteit voor het kleinst mogelijke bestand. Het zichtbare verschil is bij scans met veel tekst vaak verwaarloosbaar. +- Heb je maar één afbeeldingsformaat, dan geven de aparte converters (JPG naar PDF, PNG naar PDF, enz.) hetzelfde resultaat met een eenvoudigere interface. + +## Gerelateerde tools + +- [JPG naar PDF](./jpg-to-pdf) +- [PNG naar PDF](./png-to-pdf) +- [HEIC naar PDF](./heic-to-pdf) +- [WebP naar PDF](./webp-to-pdf) diff --git a/docs/nl/tools/index.md b/docs/nl/tools/index.md new file mode 100644 index 00000000..d94bf5f3 --- /dev/null +++ b/docs/nl/tools/index.md @@ -0,0 +1,183 @@ +# Overzicht van tools + +BentoPDF biedt **meer dan 130 tools** om met PDF's te werken. Alle tools draaien volledig in je browser, je bestanden verlaten je apparaat nooit. + +--- + +## Bewerken en annoteren + +Wijzig, markeer en verbeter je PDF-documenten met een complete set bewerkingstools. + +
+ +- [**PDF-editor**](./edit-pdf): Annoteer, markeer, redigeer, geef commentaar, voeg vormen en afbeeldingen toe, zoek en bekijk PDF's. +- [**Bladwijzers bewerken**](./bookmark): Voeg PDF-bladwijzers toe, bewerk, importeer, verwijder en extraheer ze. +- [**Inhoudsopgave**](./table-of-contents): Genereer een inhoudsopgavepagina uit PDF-bladwijzers. +- [**Paginanummers**](./page-numbers): Voeg paginanummers toe aan je document. +- [**Paginalabels toevoegen**](./add-page-labels): Pas PDF-paginalabels toe met Romeinse cijfers, voorvoegsels en eigen beginwaarden. +- [**Bates-nummering**](./bates-numbering): Voeg opeenvolgende Bates-nummers toe aan een of meer PDF-bestanden. +- [**Watermerk toevoegen**](./add-watermark): Plaats tekst of een afbeelding over je PDF-pagina's. +- [**Koptekst en voettekst**](./header-footer): Voeg tekst toe aan de boven- en onderkant van pagina's. +- [**Kleuren omkeren**](./invert-colors): Maak een donkere modus-versie van je PDF. +- [**Scannereffect**](./scanner-effect): Laat je PDF eruitzien als een gescand document. +- [**Kleuren aanpassen**](./adjust-colors): Stel helderheid, contrast, verzadiging en meer fijn af. +- [**Achtergrondkleur**](./background-color): Wijzig de achtergrondkleur van je PDF. +- [**Tekstkleur wijzigen**](./text-color): Wijzig de kleur van tekst in je PDF. +- [**PDF ondertekenen**](./sign-pdf): Teken, typ of upload je handtekening. +- [**Stempels toevoegen**](./add-stamps): Voeg afbeeldingsstempels toe aan je PDF met de annotatiewerkbalk. +- [**Aantekeningen verwijderen**](./remove-annotations): Verwijder opmerkingen, markeringen en links. +- [**PDF bijsnijden**](./crop-pdf): Snijd de marges van elke pagina in je PDF bij. +- [**PDF-formulier invullen**](./form-filler): Vul formulieren direct in de browser in. Ondersteunt ook XFA-formulieren. +- [**PDF-formulier maken**](./form-creator): Maak invulbare PDF-formulieren met tekstvelden via slepen en neerzetten. +- [**Lege pagina's verwijderen**](./remove-blank-pages): Detecteer en verwijder automatisch lege pagina's. + +
+ +--- + +## Converteren naar PDF + +Zet afbeeldingen, documenten, e-books en andere bestandsformaten om naar PDF. + +
+ +- [**Afbeeldingen naar PDF**](./image-to-pdf): Zet JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP en meer om naar PDF. +- [**JPG naar PDF**](./jpg-to-pdf): Maak een PDF van een of meer JPG-afbeeldingen. +- [**PNG naar PDF**](./png-to-pdf): Maak een PDF van een of meer PNG-afbeeldingen. +- [**WebP naar PDF**](./webp-to-pdf): Maak een PDF van een of meer WebP-afbeeldingen. +- [**SVG naar PDF**](./svg-to-pdf): Maak een PDF van een of meer SVG-afbeeldingen. +- [**BMP naar PDF**](./bmp-to-pdf): Maak een PDF van een of meer BMP-afbeeldingen. +- [**HEIC naar PDF**](./heic-to-pdf): Maak een PDF van een of meer HEIC-afbeeldingen. +- [**TIFF naar PDF**](./tiff-to-pdf): Maak een PDF van een of meer TIFF-afbeeldingen. +- [**Tekst naar PDF**](./txt-to-pdf): Zet een tekstbestand om naar een PDF. +- [**Markdown naar PDF**](./markdown-to-pdf): Zet Markdown om naar PDF met livevoorbeeld en syntaxisaccentuering. +- [**JSON naar PDF**](./json-to-pdf): Zet JSON-bestanden om naar PDF. +- [**ODT naar PDF**](./odt-to-pdf): Zet ODT-bestanden (OpenDocument Text) om naar PDF. +- [**CSV naar PDF**](./csv-to-pdf): Zet CSV-spreadsheets om naar PDF. +- [**RTF naar PDF**](./rtf-to-pdf): Zet RTF-documenten (Rich Text Format) om naar PDF. +- [**Word naar PDF**](./word-to-pdf): Zet Word-documenten (DOCX, DOC, ODT) om naar PDF. +- [**Excel naar PDF**](./excel-to-pdf): Zet Excel-spreadsheets (XLSX, XLS, ODS) om naar PDF. +- [**PowerPoint naar PDF**](./powerpoint-to-pdf): Zet PowerPoint-presentaties (PPTX, PPT, ODP) om naar PDF. +- [**XPS naar PDF**](./xps-to-pdf): Zet XPS/OXPS-documenten om naar PDF. +- [**MOBI naar PDF**](./mobi-to-pdf): Zet MOBI e-books om naar PDF. +- [**EPUB naar PDF**](./epub-to-pdf): Zet EPUB e-books om naar PDF. +- [**FB2 naar PDF**](./fb2-to-pdf): Zet FictionBook (FB2) e-books om naar PDF. +- [**CBZ naar PDF**](./cbz-to-pdf): Zet stripboekarchieven (CBZ/CBR) om naar PDF. +- [**WPD naar PDF**](./wpd-to-pdf): Zet WordPerfect-documenten (WPD) om naar PDF. +- [**WPS naar PDF**](./wps-to-pdf): Zet WPS Office-documenten om naar PDF. +- [**XML naar PDF**](./xml-to-pdf): Zet XML-documenten om naar PDF. +- [**ODG naar PDF**](./odg-to-pdf): Zet OpenDocument Graphics (ODG) om naar PDF. +- [**ODS naar PDF**](./ods-to-pdf): Zet OpenDocument Spreadsheet (ODS) om naar PDF. +- [**ODP naar PDF**](./odp-to-pdf): Zet OpenDocument Presentation (ODP) om naar PDF. +- [**PUB naar PDF**](./pub-to-pdf): Zet Microsoft Publisher (PUB) om naar PDF. +- [**VSD naar PDF**](./vsd-to-pdf): Zet Microsoft Visio (VSD, VSDX) om naar PDF. +- [**PSD naar PDF**](./psd-to-pdf): Zet Adobe Photoshop-bestanden (PSD) om naar PDF. +- [**E-mail naar PDF**](./email-to-pdf): Zet e-mailbestanden (EML, MSG) om naar PDF. + +
+ +--- + +## Converteren vanuit PDF + +Haal inhoud uit PDF's en zet die om naar afbeeldingen, documenten en gegevensformaten. + +
+ +- [**PDF naar JPG**](./pdf-to-jpg): Zet elke PDF-pagina om naar een JPG-afbeelding. +- [**PDF naar PNG**](./pdf-to-png): Zet elke PDF-pagina om naar een PNG-afbeelding. +- [**PDF naar WebP**](./pdf-to-webp): Zet elke PDF-pagina om naar een WebP-afbeelding. +- [**PDF naar BMP**](./pdf-to-bmp): Zet elke PDF-pagina om naar een BMP-afbeelding. +- [**PDF naar TIFF**](./pdf-to-tiff): Zet elke PDF-pagina om naar een TIFF-afbeelding. +- [**PDF naar CBZ**](./pdf-to-cbz): Zet een PDF om naar een CBZ (stripboekarchief) voor stripreaders en Calibre. +- [**PDF naar SVG**](./pdf-to-svg): Zet elke PDF-pagina om naar een schaalbare vectorafbeelding. +- [**PDF naar CSV**](./pdf-to-csv): Haal tabellen uit een PDF en zet ze om naar CSV. +- [**PDF naar Excel**](./pdf-to-excel): Haal tabellen uit een PDF en zet ze om naar Excel (XLSX). +- [**PDF naar grijstinten**](./pdf-to-greyscale): Zet alle kleuren om naar zwart-wit. +- [**PDF naar JSON**](./pdf-to-json): Zet PDF-bestanden om naar JSON. +- [**PDF naar Word**](./pdf-to-word): Zet PDF-bestanden om naar bewerkbare Word-documenten. +- [**Afbeeldingen extraheren**](./extract-images): Haal alle ingesloten afbeeldingen uit je PDF-bestanden. +- [**PDF naar Markdown**](./pdf-to-markdown): Zet PDF-tekst en tabellen om naar Markdown. +- [**PDF voorbereiden voor AI**](./prepare-pdf-for-ai): Haal PDF-inhoud op als LlamaIndex JSON voor RAG/LLM-pipelines. +- [**PDF naar tekst**](./pdf-to-text): Haal tekst uit PDF-bestanden en sla die op als platte tekst. +- [**Tabellen extraheren**](./extract-tables): Haal tabellen uit PDF's als CSV, JSON of Markdown. + +
+ +--- + +## Ordenen en beheren + +Herschik, combineer, splits en beheer je PDF-pagina's en -bestanden. + +
+ +- [**PDF-workflowbouwer**](./pdf-workflow): Bouw eigen PDF-verwerkingsketens met een visuele knooppunteneditor. +- [**PDF-multitool**](./pdf-multi-tool): Volwaardige PDF-editor met paginabeheer. +- [**PDF OCR**](./ocr-pdf): Maak een PDF doorzoekbaar en kopieerbaar. +- [**PDF samenvoegen**](./merge-pdf): Combineer meerdere PDF's tot één bestand. +- [**Pagina's afwisselen en mixen**](./alternate-merge): Voeg PDF's samen door pagina's van elke PDF af te wisselen. +- [**Duplex samenvoegen**](./duplex-collate): Zet blokken voor- en achterzijdescans in de juiste paginavolgorde. +- [**Ordenen en dupliceren**](./organize-pdf): Dupliceer, herschik en verwijder pagina's. +- [**Bijlagen toevoegen**](./add-attachments): Sluit een of meer bestanden in je PDF in. +- [**Bijlagen extraheren**](./extract-attachments): Haal alle ingesloten bestanden uit PDF('s) als ZIP. +- [**Bijlagen bewerken**](./edit-attachments): Bekijk of verwijder bijlagen in je PDF. +- [**PDF-lagen (OCG)**](./pdf-layers): Bekijk, schakel, voeg toe en verwijder OCG-lagen in je PDF. +- [**PDF splitsen**](./split-pdf): Haal een paginabereik uit een PDF naar een nieuwe PDF. +- [**Pagina's verdelen**](./divide-pages): Verdeel pagina's horizontaal of verticaal. +- [**Pagina's extraheren**](./extract-pages): Sla een selectie pagina's op als nieuwe bestanden. +- [**Pagina's verwijderen**](./delete-pages): Verwijder specifieke pagina's uit je document. +- [**Lege pagina toevoegen**](./add-blank-page): Voeg een lege pagina toe waar je maar wilt in je PDF. +- [**Pagina's omkeren**](./reverse-pages): Draai de volgorde van alle pagina's in je document om. +- [**PDF roteren**](./rotate-pdf): Draai pagina's in stappen van 90 graden. +- [**Roteren met eigen graden**](./rotate-custom): Draai pagina's met een willekeurige hoek. +- [**N-up PDF**](./n-up-pdf): Plaats meerdere pagina's op één vel. +- [**PDF-boekje**](./pdf-booklet): Herschik pagina's voor dubbelzijdig boekjesdrukwerk. +- [**Combineren tot één pagina**](./combine-single-page): Plak alle pagina's aan elkaar tot één doorlopende rol. +- [**Metadata bekijken**](./view-metadata): Bekijk de verborgen eigenschappen van je PDF. +- [**Metadata bewerken**](./edit-metadata): Wijzig de auteur, titel en andere eigenschappen. +- [**PDF's naar ZIP**](./pdf-to-zip): Verpak meerdere PDF-bestanden in een ZIP-archief. +- [**PDF's vergelijken**](./compare-pdfs): Vergelijk twee PDF's naast elkaar. +- [**PDF posteriseren**](./posterize-pdf): Splits een grote pagina in meerdere kleinere pagina's. + +
+ +--- + +## Optimaliseren en herstellen + +Comprimeer, repareer en optimaliseer je PDF's voor betere prestaties en compatibiliteit. + +
+ +- [**PDF comprimeren**](./compress-pdf): Verklein de bestandsgrootte van je PDF. +- [**PDF naar PDF/A**](./pdf-to-pdfa): Zet PDF om naar PDF/A voor langetermijnarchivering. +- [**Paginaformaat corrigeren**](./fix-page-size): Breng alle pagina's naar een uniform formaat. +- [**PDF lineariseren**](./linearize-pdf): Optimaliseer de PDF voor snel bekijken op het web. +- [**Pagina-afmetingen**](./page-dimensions): Analyseer paginaformaat, oriëntatie en eenheden. +- [**Beperkingen verwijderen**](./remove-restrictions): Verwijder wachtwoordbeveiliging en beveiligingsbeperkingen. +- [**PDF repareren**](./repair-pdf): Herstel gegevens uit beschadigde of corrupte PDF-bestanden. +- [**PDF rasteriseren**](./rasterize-pdf): Zet PDF om naar een PDF op afbeeldingsbasis. Maakt lagen plat en verwijdert selecteerbare tekst. +- [**PDF rechtzetten**](./deskew-pdf): Zet scheve gescande pagina's automatisch recht met OpenCV. +- [**Lettertype naar contour**](./font-to-outline): Zet alle lettertypen om naar vectorcontouren voor consistente weergave. + +
+ +--- + +## PDF beveiligen + +Bescherm, versleutel en beheer de toegang tot je PDF-documenten. + +
+ +- [**PDF versleutelen**](./protect-pdf): Vergrendel je PDF met een wachtwoord. +- [**PDF opschonen**](./sanitize-pdf): Verwijder metadata, aantekeningen, scripts en meer. +- [**PDF ontsleutelen**](./unlock-pdf): Ontgrendel een PDF door de wachtwoordbeveiliging te verwijderen. +- [**PDF platmaken**](./flatten-pdf): Maak formuliervelden en aantekeningen niet-bewerkbaar. +- [**Metadata verwijderen**](./remove-metadata): Verwijder verborgen gegevens uit je PDF. +- [**Rechten wijzigen**](./change-permissions): Stel gebruikersrechten voor een PDF in of wijzig ze. +- [**Digitale handtekening**](./digital-sign-pdf): Voeg een cryptografische digitale handtekening toe met X.509-certificaten. +- [**Handtekening valideren**](./validate-signature-pdf): Controleer digitale handtekeningen en bekijk certificaatgegevens. + +
diff --git a/docs/nl/tools/invert-colors.md b/docs/nl/tools/invert-colors.md new file mode 100644 index 00000000..16ffe62a --- /dev/null +++ b/docs/nl/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Kleuren omkeren +description: Keer alle kleuren in je PDF om en maak een donkere modus-versie van elk document. +--- + +# Kleuren omkeren + +Keer elke kleur in je PDF om naar het tegengestelde. Witte achtergronden worden zwart, zwarte tekst wordt wit en alle andere kleuren verschuiven naar hun complementaire waarden. Dit is de snelste manier om een "donkere modus"-versie van elke PDF te maken. + +## Zo werkt het + +1. Upload je PDF-bestand. +2. Klik op **Kleuren omkeren** om te verwerken. +3. De omgekeerde PDF wordt automatisch gedownload. + +Er zijn geen extra instellingen. De tool rendert elke pagina als afbeelding, keert alle pixelkleuren om en zet het resultaat weer samen tot een nieuwe PDF. + +## Functies + +- Kleuren omkeren met één klik voor alle pagina's +- Verwerkt elke pagina in het document +- Behoudt de oorspronkelijke paginaafmetingen en indeling +- Werkt met elke PDF, ongeacht het type inhoud (tekst, afbeeldingen, gemengd) + +## Toepassingen + +- Donkere versies van studieboeken of handleidingen maken voor prettig lezen 's avonds +- Contrastrijke versies van documenten voorbereiden voor toegankelijkheid +- Gescande documenten omkeren die met verkeerde belichting zijn opgenomen +- Negatieven maken van PDF's met veel afbeeldingen voor visuele analyse + +## Tips + +- Omdat de tool pagina's rastert om het effect toe te passen, is de uitvoer op afbeeldingen gebaseerd. Tekst is dan niet meer selecteerbaar of doorzoekbaar. Heb je na het omkeren doorzoekbare tekst nodig, haal het resultaat dan door een OCR-tool. +- Gebruik voor fijnere kleurinstellingen (helderheid, contrast, verzadiging) liever de tool [Kleuren aanpassen](./adjust-colors). +- Grote PDF's met veel pagina's kunnen langer duren, omdat elke pagina afzonderlijk wordt gerenderd en omgekeerd. + +## Gerelateerde tools + +- [Kleuren aanpassen](./adjust-colors) +- [Achtergrondkleur](./background-color) +- [Scannereffect](./scanner-effect) diff --git a/docs/nl/tools/jpg-to-pdf.md b/docs/nl/tools/jpg-to-pdf.md new file mode 100644 index 00000000..f0c849ef --- /dev/null +++ b/docs/nl/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG naar PDF +description: Zet een of meer JPG-, JPEG- en JPEG 2000-afbeeldingen om naar één PDF-bestand, rechtstreeks in je browser. +--- + +# JPG naar PDF + +Maak van JPG-afbeeldingen een nette PDF. Upload één bestand of meerdere JPG's tegelijk. Elke afbeelding wordt een pagina op volledige grootte in het uitvoerdocument. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep je JPG-bestanden erheen. Je kunt meerdere bestanden selecteren. +2. Bekijk de geüploade bestanden. Gebruik het prullenbakpictogram om bestanden te verwijderen, of klik op **Meer bestanden toevoegen** om de lijst aan te vullen. +3. Kies een **PDF-kwaliteit**. +4. Klik op **Converteren naar PDF**. De tool comprimeert de afbeeldingen volgens je kwaliteitsinstelling, zet ze om met de PyMuPDF-engine en downloadt `from_jpgs.pdf`. + +## Opties + +**PDF-kwaliteit** bepaalt de compressie die op elke afbeelding wordt toegepast voordat die in de PDF wordt ingesloten: + +- **Hoge kwaliteit**: behoudt maximaal detail. Gebruik dit voor fotografie of drukwerk. +- **Gemiddelde kwaliteit** (standaard): een goede balans tussen scherpte en bestandsgrootte. +- **Lage kwaliteit**: sterke compressie voor de kleinste uitvoer. + +## Toepassingen + +- Gescande documenten die als JPG zijn opgeslagen omzetten naar één PDF voor indiening +- Productfoto's bundelen in een catalogus voor klanten +- Medische of satellietbeelden in JPEG 2000 omzetten naar een draagbare PDF +- Een afdrukbaar fotoalbum maken van camera-exports + +## Tips + +- JPEG 2000-bestanden (`.jp2`, `.jpx`) worden volledig ondersteund, niet alleen standaard JPEG. Dat is handig voor medische beeldvorming en geodata. +- Als je JPG's van een telefooncamera komen, levert Gemiddelde kwaliteit meestal een bestand op dat 40-60% kleiner is dan Hoge kwaliteit, zonder zichtbaar verschil op het scherm. + +## Gerelateerde tools + +- [Afbeeldingen naar PDF](./image-to-pdf) +- [PNG naar PDF](./png-to-pdf) +- [WebP naar PDF](./webp-to-pdf) diff --git a/docs/nl/tools/json-to-pdf.md b/docs/nl/tools/json-to-pdf.md new file mode 100644 index 00000000..2e4759fa --- /dev/null +++ b/docs/nl/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON naar PDF +description: Reconstrueer PDF-bestanden uit het JSON-formaat van BentoPDF. Zet JSON-exports terug om naar hun oorspronkelijke PDF-documenten. +--- + +# JSON naar PDF + +Reconstrueer PDF-documenten uit JSON-bestanden die eerder zijn gemaakt met de tool **PDF naar JSON** van BentoPDF. Dit is een tool voor heen-en-terug-conversie: ze neemt de gestructureerde JSON-weergave van een PDF en bouwt het oorspronkelijke document opnieuw op. + +::: warning +Deze tool accepteert alleen JSON-bestanden die door de PDF naar JSON-converter van BentoPDF zijn gemaakt. Standaard JSON-bestanden uit API's, databases of andere tools worden niet ondersteund. +::: + +## Ondersteunde formaten + +| Invoer | Beschrijving | +| :------ | :----------------------------------------------------------------- | +| `.json` | JSON-bestanden geëxporteerd met de tool PDF naar JSON van BentoPDF | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep een of meer JSON-bestanden erheen. +2. De bestandslijst toont elk geselecteerd bestand met zijn grootte. +3. Klik op **Converteren naar PDF**. De tool verwerkt alle bestanden met een Web Worker en de CPDF-engine. +4. De uitvoer wordt gedownload als `jsons-to-pdf.zip`, met één PDF per JSON-invoerbestand. + +De conversie draait in een Web Worker op de achtergrond, dus de interface blijft soepel werken, ook met grote bestanden. + +## Opties + +Deze tool heeft geen instelbare opties. De JSON-structuur bepaalt volledig de uitvoer-PDF. + +## Uitvoer + +Bij het converteren van meerdere JSON-bestanden worden de resultaten als ZIP-archief geleverd. Elke PDF heeft de naam van het bijbehorende JSON-bronbestand (bijvoorbeeld `report.json` wordt `report.pdf`). + +## Toepassingen + +- PDF's herstellen uit een back-up of archiefketen op JSON-basis +- Een PDF via JSON laten gaan om te inspecteren en daarna weer naar PDF +- Documenten opnieuw opbouwen na programmatische wijzigingen in de JSON-structuur +- Controleren of een PDF naar JSON-export alle documentinhoud heeft vastgelegd door het terug om te zetten + +## Tips + +- Wil je willekeurige JSON-gegevens (zoals API-antwoorden of configuratiebestanden) omzetten naar een opgemaakte PDF, dan is de tool [Tekst naar PDF](./txt-to-pdf) een betere keuze. Plak de JSON als tekst en die wordt netjes opgemaakt weergegeven. +- De CPDF WebAssembly-engine moet beschikbaar zijn om deze tool te laten werken. Zelfgehoste instanties hebben de CPDF WASM-bestanden nodig. + +## Gerelateerde tools + +- [Tekst naar PDF](./txt-to-pdf) +- [Markdown naar PDF](./markdown-to-pdf) +- [CSV naar PDF](./csv-to-pdf) diff --git a/docs/nl/tools/linearize-pdf.md b/docs/nl/tools/linearize-pdf.md new file mode 100644 index 00000000..d378352f --- /dev/null +++ b/docs/nl/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: PDF lineariseren +description: Optimaliseer PDF-bestanden voor snel bekijken op het web met progressief laden. Ook bekend als "Fast Web View"-optimalisatie. +--- + +# PDF lineariseren + +Lineariseren herstructureert een PDF zodat de eerste pagina kan worden getoond voordat het hele bestand is gedownload. Adobe noemt dit "Fast Web View". Als je PDF's op een website host of via een documentenportaal aanbiedt, voelt openen door lineariseren merkbaar sneller. + +## Zo werkt het + +1. Upload een of meer PDF-bestanden. +2. Klik op **PDF('s) lineariseren**. +3. Download de resultaten als ZIP-archief met alle gelineariseerde bestanden. + +Er zijn geen instellingen. De tool gebruikt de vlag `--linearize` van QPDF, die de interne structuur van de PDF herordent zonder de visuele inhoud te wijzigen. + +## Wat lineariseren doet + +- Herordent PDF-objecten zodat de gegevens van de eerste pagina aan het begin van het bestand staan +- Voegt een lineariseringswoordenboek en hinttabellen toe, zodat viewers weten waar elke pagina staat +- Maakt byte-range-verzoeken mogelijk: een browser kan alleen de eerste pagina ophalen zonder het hele bestand te downloaden +- Ruimt de kruisverwijzingstabel op voor efficiënte willekeurige toegang + +## Functies + +- Meerdere PDF's in één keer verwerken +- De uitvoer behoudt alle inhoud, lettertypen, afbeeldingen en interactieve elementen +- Gebruikt QPDF (WebAssembly) voor betrouwbare, standaardconforme linearisering +- Resultaten worden voor gemakkelijk downloaden in een ZIP verpakt + +## Toepassingen + +- PDF-rapporten hosten op een website waar gebruikers directe paginaweergave verwachten +- PDF's insluiten in webapplicaties met viewers in de browser +- PDF-catalogi of handleidingen publiceren die via trage mobiele verbindingen worden geopend +- Documenten voorbereiden voor content delivery networks (CDN's) die byte-range-aanvragen ondersteunen + +## Tips + +- Lineariseer pas nadat alle andere bewerkingen klaar zijn. Elke latere wijziging (samenvoegen, pagina's toevoegen) heft de linearisering op. +- Combineer met PDF comprimeren voor de kleinste en snelst ladende PDF's. +- Lineariseren voegt een kleine hoeveelheid overhead toe aan de bestandsgrootte (meestal minder dan 1%). + +## Gerelateerde tools + +- [PDF comprimeren](./compress-pdf): verklein het bestand voordat je lineariseert +- [PDF repareren](./repair-pdf): los structurele problemen op die lineariseren verhinderen +- [Metadata verwijderen](./remove-metadata): verwijder metadata voordat je online publiceert diff --git a/docs/nl/tools/markdown-to-pdf.md b/docs/nl/tools/markdown-to-pdf.md new file mode 100644 index 00000000..bddcbae8 --- /dev/null +++ b/docs/nl/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown naar PDF +description: Schrijf of plak Markdown en exporteer het als professioneel opgemaakte PDF met livevoorbeeld en syntaxisaccentuering. +--- + +# Markdown naar PDF + +Een volwaardige Markdown-editor met livevoorbeeld en PDF-export met één klik. Schrijf helemaal opnieuw, upload een bestaand `.md`-bestand of plak inhoud vanaf het klembord. De editor geeft je Markdown in realtime weer en exporteert een opgemaakte PDF met de ingebouwde afdrukengine van de browser. + +## Ondersteunde formaten + +| Invoer | Beschrijving | +| :-------------- | :---------------------------- | +| `.md`-bestanden | Uploaden met de knop Uploaden | +| Directe invoer | Typ of plak in de editor | + +## Zo werkt het + +1. Open de tool Markdown naar PDF. De editor laadt met een gesplitste weergave: Markdown-bron links, weergegeven voorbeeld rechts. +2. Schrijf je Markdown, plak die in of klik op **Uploaden** om een `.md`-bestand te laden. +3. Schakel tussen lichte en donkere thema's met de themaschuif in de werkbalk. +4. Klik op **PDF exporteren** (of druk op `Ctrl/Cmd + S`) om via het afdrukvenster van de browser een PDF te genereren. + +## Functies + +De editor ondersteunt een uitgebreide set Markdown-functies, meer dan alleen de basis: + +- **Standaard Markdown**: koppen, vet, cursief, links, afbeeldingen, lijsten, citaten, horizontale lijnen +- **Codeblokken** met syntaxisaccentuering voor meer dan 15 talen (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash en meer) +- **Mermaid-diagrammen**: stroomschema's, sequentiediagrammen, ER-diagrammen en andere Mermaid-diagramtypen worden direct in het voorbeeld weergegeven +- **Tabellen** met standaard Markdown-tabelsyntaxis +- **Takenlijsten** met selectievakjes +- **Voetnoten**, **subscript**, **superscript** +- **Definitielijsten**, **afkortingen** +- Ondersteuning voor **emoji** (`:smile:` wordt als emoji weergegeven) +- **Markeringen** (`==marked text==`) en **invoegingen** (`++inserted text++`) +- **Automatische links**: gewone URL's worden omgezet in klikbare links +- Genereren van een **inhoudsopgave** +- **Ankerlinks** bij koppen + +## Toepassingen + +- Projectdocumentatie schrijven en een verzorgde PDF exporteren voor belanghebbenden +- Technische rapporten maken met codevoorbeelden en Mermaid-architectuurdiagrammen +- Een GitHub-README omzetten naar PDF voor offline gebruik of afdrukken +- Een voorstel of specificatie opstellen met takenlijsten en tabellen +- Een opgemaakte handout genereren uit collegeaantekeningen in Markdown + +## Tips + +- De PDF-uitvoer gebruikt de functie Afdrukken naar PDF van de browser. In Chrome kun je marges en schaal aanpassen in het afdrukvenster voordat je opslaat. +- Mermaid-diagrammen worden in het voorbeeld weergegeven, maar hebben bij eerste gebruik soms even nodig om te starten. +- Gebruik `Ctrl/Cmd + S` als sneltoets om te exporteren zonder naar de knop te hoeven grijpen. + +## Gerelateerde tools + +- [Tekst naar PDF](./txt-to-pdf) +- [Word naar PDF](./word-to-pdf) +- [JSON naar PDF](./json-to-pdf) diff --git a/docs/nl/tools/merge-pdf.md b/docs/nl/tools/merge-pdf.md new file mode 100644 index 00000000..549b9ceb --- /dev/null +++ b/docs/nl/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF samenvoegen +description: Combineer meerdere PDF-bestanden tot één document met herschikken via slepen en neerzetten en controle op paginaniveau. +--- + +# PDF samenvoegen + +Combineer meerdere PDF-bestanden tot één document. Je kunt hele bestanden in een bepaalde volgorde samenvoegen, of overschakelen naar de Paginamodus voor gedetailleerde controle over afzonderlijke pagina's van elke geüploade PDF. + +## Zo werkt het + +1. Upload twee of meer PDF-bestanden door op het uploadgebied te klikken of ze erheen te slepen. +2. Kies met de schakelaar bovenaan tussen **Bestandsmodus** en **Paginamodus**. +3. Sleep in de Bestandsmodus bestanden om ze te herschikken en geef eventueel paginabereiken (bijvoorbeeld `1-3, 5`) op per bestand. Laat het bereik leeg om alle pagina's op te nemen. +4. Sleep in de Paginamodus afzonderlijke paginaminiaturen om je exacte paginavolgorde op te bouwen. +5. Klik op **PDF's samenvoegen** om alles in één bestand te combineren. De samengevoegde PDF wordt automatisch gedownload. + +## Functies + +- Twee samenvoegmodi: Bestandsmodus om snel hele bestanden te combineren, Paginamodus voor controle per pagina +- Herschikken via slepen en neerzetten in beide modi met vloeiende animaties +- Met de syntaxis voor paginabereiken (bijvoorbeeld `1-3, 5, 8-10`) kies je pagina's zonder naar de Paginamodus over te schakelen +- Paginaminiaturen worden pas geladen als ze nodig zijn, zodat de interface soepel blijft, ook bij grote documenten +- Geen limiet op het aantal bestanden of het totale aantal pagina's +- Behoudt de oorspronkelijke PDF-kwaliteit zonder hercodering + +## Opties + +| Optie | Beschrijving | +| ----------------- | -------------------------------------------------------------------------------------------------------- | +| **Bestandsmodus** | Voeg hele bestanden samen in een eigen volgorde, met optionele paginabereikfilters per bestand | +| **Paginamodus** | Visueel raster van alle pagina's van alle bestanden: sleep miniaturen om je exacte volgorde op te bouwen | +| **Paginainvoer** | Tekstveld per bestand dat bereiken als `1-3, 5` accepteert om alleen specifieke pagina's op te nemen | + +## Toepassingen + +- Aparte hoofdstuk-PDF's combineren tot één boek of rapport +- Een motivatiebrief en cv samenvoegen tot één sollicitatiedocument +- Specifieke pagina's uit meerdere brondocumenten samenbrengen in één bestand +- Gescande bonnetjes of facturen samenvoegen tot één archief-PDF +- Een presentatiehandout maken van slides uit meerdere presentaties + +## Tips + +- Gebruik de Paginamodus als je pagina's van verschillende bestanden door elkaar wilt plaatsen in plaats van het ene bestand na het andere toe te voegen. +- Je kunt na de eerste upload meer bestanden toevoegen met de knop **Meer bestanden toevoegen** zonder je huidige indeling kwijt te raken. +- Paginabereiken beginnen bij 1, dus `1` verwijst naar de eerste pagina van dat bestand. + +## Gerelateerde tools + +- [PDF splitsen](./split-pdf) +- [Ordenen en dupliceren](./organize-pdf) +- [Pagina's afwisselen en mixen](./alternate-merge) +- [Pagina's verwijderen](./delete-pages) diff --git a/docs/nl/tools/mobi-to-pdf.md b/docs/nl/tools/mobi-to-pdf.md new file mode 100644 index 00000000..1aef9dc2 --- /dev/null +++ b/docs/nl/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI naar PDF +description: Zet MOBI e-bookbestanden om naar PDF, rechtstreeks in je browser. Gratis, privé, zonder bestandsuploads. +--- + +# MOBI naar PDF + +Zet Amazon Kindle MOBI e-books om naar PDF-documenten. MOBI-bestanden zijn gebonden aan Kindle-apparaten en -apps, waardoor ze elders lastig te lezen zijn. Door naar PDF om te zetten krijg je een draagbare versie die je op elk apparaat kunt openen of afdrukken. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------ | :------- | :-------------------------------- | +| MOBI | `.mobi` | Kindle e-bookformaat (Mobipocket) | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep een of meer MOBI-bestanden erheen. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram, of gebruik **Meer bestanden toevoegen** om extra e-books toe te voegen. +3. Klik op **Converteren naar PDF**. De PyMuPDF-engine leest de MOBI-structuur en geeft elke pagina weer als PDF-inhoud. +4. Eén bestand wordt als PDF gedownload. Bij meerdere bestanden krijg je een ZIP-archief met de naam `mobi-converted.zip`. + +## Opties + +Er zijn geen extra instellingen nodig. De conversie behoudt de tekstinhoud, opmaak en ingesloten afbeeldingen van het oorspronkelijke MOBI-bestand. + +## Toepassingen + +- Op Kindle gekochte inhoud lezen op een e-reader zonder Kindle die alleen PDF ondersteunt +- Hoofdstukken uit een e-book afdrukken voor offline studie of aantekeningen +- Je persoonlijke e-bookbibliotheek archiveren in een universeel formaat +- Fragmenten delen met iemand die de Kindle-app niet heeft + +## Tips + +- MOBI-bestanden met DRM-beveiliging kunnen niet worden geconverteerd. De tool werkt alleen met MOBI-bestanden zonder DRM. +- Grote e-books met veel ingesloten afbeeldingen kunnen een paar seconden langer duren, omdat alles in de browser gebeurt. + +## Gerelateerde tools + +- [EPUB naar PDF](./epub-to-pdf) +- [FB2 naar PDF](./fb2-to-pdf) +- [CBZ naar PDF](./cbz-to-pdf) diff --git a/docs/nl/tools/n-up-pdf.md b/docs/nl/tools/n-up-pdf.md new file mode 100644 index 00000000..0d752232 --- /dev/null +++ b/docs/nl/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-up PDF +description: Plaats meerdere PDF-pagina's in een rasterindeling op één vel voor compact afdrukken. +--- + +# N-up PDF + +Plaats meerdere pagina's in een rasterindeling op één vel. Dit vermindert het aantal afgedrukte pagina's door 2, 4, 6, 8, 9 of 16 pagina's per vel te plaatsen. De tool regelt het schalen, de positionering en het optioneel instellen van het paginaformaat. + +## Zo werkt het + +1. Upload een PDF-bestand. +2. Kies het aantal pagina's per vel (de "N"-waarde): 2, 4, 6, 8, 9 of 16. +3. Kies het uitvoerpaginaformaat (standaard A4) en de oriëntatie. +4. Stel optioneel de tussenruimte, randkleur en achtergrondkleur in. +5. Klik op de verwerkingsknop. De tool schaalt elke pagina en plaatst ze naast elkaar op nieuwe vellen. + +## Functies + +- Rasterindelingen: 2-up, 4-up, 6-up, 8-up, 9-up en 16-up +- Instelbaar uitvoerpaginaformaat en oriëntatie +- Optionele tussenruimte tussen de pagina's +- Instellingen voor achtergrond- en randkleur +- Behoudt de beeldverhouding van de oorspronkelijke pagina's bij het schalen + +## Opties + +| Optie | Beschrijving | +| -------------------- | --------------------------------------------------------------------- | +| **Pagina's per vel** | Aantal oorspronkelijke pagina's per uitvoerpagina (2, 4, 6, 8, 9, 16) | +| **Paginaformaat** | Formaat van het uitvoervel (A4, Letter, Legal, enz.) | +| **Oriëntatie** | Staand of liggend voor het uitvoervel | +| **Tussenruimte** | Ruimte in punten tussen de pagina's | +| **Achtergrondkleur** | Vulkleur voor de achtergrond van het uitvoervel | +| **Randkleur** | Kleur voor de randen rond elke pagina | + +## Toepassingen + +- Handouts afdrukken met 4 slides per pagina om papier te besparen +- Studieoverzichten maken met meerdere naslagpagina's op één vel +- Compacte documentarchieven maken om weg te leggen +- Miniatuuroverzichten van een lang document genereren + +## Tips + +- Liggend werkt vaak beter voor 2-up-indelingen, terwijl staand meestal het beste is voor 4-up en hoger. +- Meer tussenruimte verbetert de leesbaarheid, maar verkleint de beschikbare ruimte voor elke pagina. +- Voor de omgekeerde bewerking (één pagina splitsen in meerdere) zie [PDF posteriseren](./posterize-pdf). + +## Gerelateerde tools + +- [PDF posteriseren](./posterize-pdf) +- [PDF-boekje](./pdf-booklet) +- [Combineren tot één pagina](./combine-single-page) diff --git a/docs/nl/tools/ocr-pdf.md b/docs/nl/tools/ocr-pdf.md new file mode 100644 index 00000000..ab98f21b --- /dev/null +++ b/docs/nl/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF OCR +description: Maak gescande PDF's doorzoekbaar en kopieerbaar met Tesseract OCR, met ondersteuning voor meerdere talen en tekenfiltering. +--- + +# PDF OCR + +Maak van gescande documenten doorzoekbare, kopieerbare PDF's. De tool gebruikt Tesseract OCR om tekst in afbeeldingen te herkennen en legt een onzichtbare tekstlaag over de oorspronkelijke pagina's, zodat het uiterlijk behouden blijft en de inhoud volledig doorzoekbaar wordt. + +## Zo werkt het + +1. Upload een gescande PDF of een PDF op afbeeldingsbasis. +2. Kies een of meer talen uit het document in de doorzoekbare talenlijst. +3. Pas optioneel de geavanceerde instellingen aan (resolutie, binarisatie, whitelist). +4. Klik op **OCR starten** en volg de voortgang in de realtime voortgangsbalk. +5. Bekijk na afloop de geëxtraheerde tekst en download de doorzoekbare PDF of een gewoon `.txt`-bestand. + +## Functies + +- OCR in meerdere talen met een doorzoekbare taalkiezer +- Onzichtbare tekstlaag behoudt het oorspronkelijke uiterlijk van het document +- Realtime voortgangsbalk en logweergave tijdens het verwerken +- Resultaten downloaden als doorzoekbare PDF of als tekstbestand +- Geëxtraheerde tekst direct naar het klembord kopiëren +- Drie resolutieniveaus om snelheid en nauwkeurigheid af te wegen + +## Opties + +| Instelling | Waarden | Standaard | Doel | +| --------------------------------- | ------------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------- | +| **Resolutie** | Standaard (192 DPI), Hoog (288 DPI), Ultra (384 DPI) | Hoog | Hogere resolutie verbetert de nauwkeurigheid bij kleine tekst, maar duurt langer | +| **Afbeelding binariseren** | Aan / Uit | Uit | Verbetert het contrast van nette scans door om te zetten naar zwart-wit | +| **Voorinstelling tekenwhitelist** | Geen, Alfanumeriek, Getallen + valuta, Alleen letters, Alleen getallen, Factuur, Formulieren, Aangepast | Geen | Beperkt de herkende tekens om de nauwkeurigheid voor specifieke documenttypen te verbeteren | +| **Tekenwhitelist** | Vrije tekst | Leeg | Handmatige tekenset wanneer de voorinstelling op Aangepast staat | + +## Toepassingen + +- Gescande contracten en facturen doorzoekbaar maken zodat je er met Ctrl+F in kunt zoeken +- Tekst halen uit gefotografeerde documenten of oude papieren archieven +- Bonnetjes verwerken met de voorinstelling Factuur om bedragen en datums nauwkeurig vast te leggen +- Toegankelijke PDF's maken van scans die alleen uit afbeeldingen bestaan, voor naleving van eisen +- Tekstinhoud in bulk halen uit gescande boeken of handleidingen + +## Tips + +- Kies meerdere talen als je document gemengde talen bevat (bijvoorbeeld Engelse koppen met Japanse lopende tekst). +- Gebruik de binarisatie-optie voor documenten met vervaagde tekst of weinig contrast: dit kan de herkenning flink verbeteren. +- De whitelist-voorinstellingen Factuur en Formulieren verminderen valse herkenningen bij gestructureerde documenten sterk doordat irrelevante tekenvormen worden genegeerd. + +## Gerelateerde tools + +- [Tabellen extraheren](./extract-tables) +- [PDF samenvoegen](./merge-pdf) +- [PDF comprimeren](./compress-pdf) diff --git a/docs/nl/tools/odg-to-pdf.md b/docs/nl/tools/odg-to-pdf.md new file mode 100644 index 00000000..6037fbf9 --- /dev/null +++ b/docs/nl/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG naar PDF +description: Zet LibreOffice Draw-bestanden (ODG) om naar PDF in je browser. Gratis, zonder upload, volledig privé. +--- + +# ODG naar PDF + +Zet OpenDocument Graphics-bestanden om naar PDF. ODG is het eigen formaat van LibreOffice Draw en wordt gebruikt voor diagrammen, stroomschema's en vectorillustraties. Door naar PDF om te zetten zijn deze tekeningen gemakkelijk te delen, af te drukken en in andere documenten in te sluiten. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :-------------------- | :------- | :------------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw-bestanden | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep je ODG-bestanden erheen. Je kunt meerdere bestanden tegelijk toevoegen. +2. Bekijk de bestandslijst. Verwijder bestanden met het prullenbakpictogram, of klik op **Meer bestanden toevoegen** om meer tekeningen toe te voegen. +3. Klik op **Converteren naar PDF**. Een engine op basis van LibreOffice laadt in de browser en converteert elk ODG-bestand, met behoud van vectorafbeeldingen, vormen en tekst. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden leveren een ZIP-archief op met de naam `odg-to-pdf.zip`. + +## Opties + +Er zijn geen extra instellingen nodig. De conversie behoudt de oorspronkelijke paginaafmetingen, vormen, verbindingslijnen en tekstvakken uit de ODG-bron. + +## Toepassingen + +- LibreOffice Draw-diagrammen delen met klanten die LibreOffice niet hebben geïnstalleerd +- Stroomschema's en netwerkdiagrammen afdrukken die in Draw zijn gemaakt +- ODG-illustraties als ingesloten PDF opnemen in een rapport of presentatie +- Technische tekeningen archiveren in een formaat dat tientallen jaren leesbaar blijft + +## Tips + +- Vectorelementen blijven vectoren in de PDF-uitvoer, dus het resultaat schaalt netjes naar elk afdrukformaat. +- De LibreOffice-engine heeft bij eerste gebruik even nodig om te starten. Conversies daarna in dezelfde sessie gaan sneller. + +## Gerelateerde tools + +- [ODS naar PDF](./ods-to-pdf) +- [ODP naar PDF](./odp-to-pdf) +- [VSD naar PDF](./vsd-to-pdf) diff --git a/docs/nl/tools/odp-to-pdf.md b/docs/nl/tools/odp-to-pdf.md new file mode 100644 index 00000000..5326267b --- /dev/null +++ b/docs/nl/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP naar PDF +description: Zet LibreOffice Impress-presentaties (ODP) om naar PDF in je browser. Gratis, privé, zonder upload. +--- + +# ODP naar PDF + +Zet OpenDocument Presentation-bestanden om naar PDF. ODP is het eigen formaat van LibreOffice Impress en een standaardexport uit Google Slides. Presentaties omzetten naar PDF betekent dat iedereen ze kan bekijken zonder presentatiesoftware, en de slides worden netjes afgedrukt. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------------------------ | :------- | :----------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides-export | + +## Zo werkt het + +1. Klik op het uploadgebied of sleep je ODP-bestanden erheen. Je kunt meerdere presentaties tegelijk selecteren. +2. Bekijk de bestandslijst. Verwijder bestanden met het prullenbakpictogram, of gebruik **Meer bestanden toevoegen** om extra presentaties toe te voegen. +3. Klik op **Converteren naar PDF**. De engine op basis van LibreOffice verwerkt elke presentatie en maakt een PDF waarin elke slide een pagina wordt. +4. Eén bestand wordt als PDF gedownload. Meerdere bestanden worden geleverd in een ZIP-archief met de naam `odp-to-pdf.zip`. + +## Opties + +Er zijn geen instellingen. Elke slide wordt weergegeven op zijn oorspronkelijke afmetingen, met behoud van tekst, afbeeldingen, vormen en slideachtergronden. + +## Toepassingen + +- Een presentatie als handout-PDF onder het publiek verspreiden +- Google Slides-exports delen met mensen die liever PDF dan ODP gebruiken +- Conferentiepresentaties en colleges archiveren in een alleen-lezenformaat +- Slidepresentaties afdrukken voor workshops op locatie + +## Tips + +- Slideovergangen en animaties zijn alleen visuele functies en gaan niet mee naar PDF, maar alle statische inhoud wordt correct weergegeven. +- Sprekersnotities zijn niet opgenomen in de PDF-uitvoer. Heb je notities nodig, exporteer ze dan apart vanuit je presentatiesoftware. +- Net als de andere tools op basis van LibreOffice wordt de engine bij eerste gebruik geladen en blijft die voor de sessie in de cache. + +## Gerelateerde tools + +- [ODG naar PDF](./odg-to-pdf) +- [ODS naar PDF](./ods-to-pdf) +- [PUB naar PDF](./pub-to-pdf) diff --git a/docs/nl/tools/ods-to-pdf.md b/docs/nl/tools/ods-to-pdf.md new file mode 100644 index 00000000..ebebe5c8 --- /dev/null +++ b/docs/nl/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS naar PDF +description: Zet LibreOffice Calc-spreadsheets (ODS) in je browser om naar PDF. Gratis, privé, zonder aanmelding. +--- + +# ODS naar PDF + +Zet OpenDocument Spreadsheet-bestanden om naar PDF. ODS is het eigen formaat van LibreOffice Calc en een veelgebruikte export uit Google Sheets. Deze tool zet je spreadsheetgegevens, opmaak en grafieken om in een gepagineerde PDF die je kunt afdrukken of delen. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :----------------------- | :------- | :------------------------------------------ | +| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / export uit Google Sheets | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je ODS-bestanden erheen. Meerdere bestanden worden ondersteund. +2. Controleer de bestandslijst. Gebruik het prullenbakpictogram om bestanden te verwijderen, of klik op **Meer bestanden toevoegen** om de reeks uit te breiden. +3. Klik op **Converteren naar PDF**. De op LibreOffice gebaseerde engine wordt in de browser geladen en zet elke spreadsheet om in PDF-pagina's. +4. Een enkele spreadsheet wordt gedownload als PDF. Meerdere bestanden worden gebundeld in `ods-to-pdf.zip`. + +## Opties + +Er is geen configuratie nodig. De converter past de bestaande afdrukindeling, celopmaak en kolombreedtes van de spreadsheet toe op de PDF-uitvoer. + +## Toepassingen + +- Een budget of rapport uit LibreOffice Calc delen met iemand die alleen PDF's accepteert +- Een als ODS gedownloade export uit Google Sheets afdrukken +- Financiële gegevens archiveren in een niet-bewerkbaar formaat +- Formulieren of urenstaten op ODS-basis indienen als documenten met vaste opmaak + +## Tips + +- Als je spreadsheet meerdere bladen heeft, worden alle bladen in de PDF opgenomen. +- Zeer brede spreadsheets kunnen horizontaal over meerdere PDF-pagina's lopen. Pas de kolombreedtes in het bronbestand aan voordat je converteert als de indeling belangrijk is. +- De LibreOffice-engine wordt bij het eerste gebruik geïnitialiseerd. Volgende conversies in dezelfde sessie gaan sneller. + +## Gerelateerde tools + +- [ODG naar PDF](./odg-to-pdf) +- [ODP naar PDF](./odp-to-pdf) +- [XML naar PDF](./xml-to-pdf) diff --git a/docs/nl/tools/odt-to-pdf.md b/docs/nl/tools/odt-to-pdf.md new file mode 100644 index 00000000..c6372e64 --- /dev/null +++ b/docs/nl/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT naar PDF +description: Zet OpenDocument Text-bestanden (ODT) in je browser om naar PDF met een engine op basis van LibreOffice. +--- + +# ODT naar PDF + +Zet OpenDocument Text-bestanden om naar PDF. ODT is het eigen formaat van LibreOffice Writer, Apache OpenOffice en andere open-source tekstverwerkers. Deze tool gebruikt een LibreOffice-engine in de browser voor nauwkeurige conversies die opmaak, tabellen, afbeeldingen en stijlen behouden. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :---------------- | :-------- | +| OpenDocument Text | `.odt` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep een of meer ODT-bestanden erheen. +2. Controleer de bestandslijst. Voeg meer bestanden toe of verwijder ongewenste bestanden. +3. Klik op **Converteren naar PDF**. De LibreOffice-engine wordt geïnitialiseerd (een voortgangsindicator toont de laadstatus), waarna elk bestand wordt geconverteerd. +4. Een enkel bestand wordt direct als PDF gedownload. Meerdere bestanden worden gebundeld in `odt-converted.zip`. + +## Opties + +Deze tool heeft geen extra configuratie. De conversie behoudt de opmaak van het oorspronkelijke document zo goed mogelijk. + +## Uitvoer + +| Aantal invoerbestanden | Uitvoer | +| :--------------------- | :-------------------------------------------------------- | +| 1 bestand | Eén PDF-download (bijv. `document.pdf`) | +| 2+ bestanden | ZIP-archief (`odt-converted.zip`) met één PDF per bestand | + +## Toepassingen + +- LibreOffice Writer-documenten omzetten naar PDF om te delen met Microsoft Office-gebruikers +- Afdrukklare PDF's maken van wetenschappelijke artikelen in OpenDocument-formaat +- Een map met ODT-sjablonen in één keer omzetten naar PDF's voor distributie +- PDF's genereren uit ODT-bestanden die door geautomatiseerde documentsystemen zijn gemaakt + +## Tips + +- De LibreOffice-engine wordt bij het eerste gebruik geladen en bewaard voor volgende conversies. Het eerste laden duurt enkele seconden, daarna gaan conversies snel. +- Complexe documenten met ingebedde OLE-objecten of ongebruikelijke lettertypen kunnen iets anders worden weergegeven dan in LibreOffice op de desktop. Test met een voorbeeld voordat je een hele reeks converteert. +- Gebruik voor Word-documenten (`.doc`, `.docx`) liever de tool [Word naar PDF](./word-to-pdf), die ook de LibreOffice-engine gebruikt maar Microsoft-formaten rechtstreeks accepteert. + +## Gerelateerde tools + +- [Word naar PDF](./word-to-pdf) +- [RTF naar PDF](./rtf-to-pdf) +- [Tekst naar PDF](./txt-to-pdf) diff --git a/docs/nl/tools/organize-pdf.md b/docs/nl/tools/organize-pdf.md new file mode 100644 index 00000000..9e64291c --- /dev/null +++ b/docs/nl/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Dupliceren & Organiseren +description: Wijzig de volgorde van PDF-pagina's, dupliceer en verwijder ze met miniaturen die je kunt slepen en een eigen invoer voor de paginavolgorde. +--- + +# Dupliceren & Organiseren + +Herschik, dupliceer en verwijder pagina's van een PDF met een visuele sleep-en-neerzetinterface. Elke pagina verschijnt als miniatuur die je kunt verplaatsen, klonen of verwijderen voordat je het resultaat als nieuw bestand opslaat. + +## Hoe het werkt + +1. Upload één PDF-bestand. +2. De tool toont een raster met miniaturen van elke pagina. +3. Sleep miniaturen om pagina's te herschikken, klik op de groene dupliceerknop om een pagina te klonen, of klik op de rode verwijderknop om er een te verwijderen. +4. Je kunt ook een eigen paginavolgorde invoeren in het tekstveld (bijv. `3, 1, 2, 4`) en op **Toepassen** klikken om alle pagina's in één keer te herschikken. +5. Klik op de verwerkknop om de gereorganiseerde PDF te maken en te downloaden. + +## Functies + +- Pagina's herschikken met slepen en neerzetten, met geanimeerde overgangen +- Dupliceer- en verwijderknoppen per pagina +- Eigen invoer voor de paginavolgorde voor nauwkeurig herschikken +- Paginanummers die na elke wijziging automatisch worden bijgewerkt +- Voorkomt dat de laatste resterende pagina wordt verwijderd + +## Toepassingen + +- Een verkeerd geplaatste pagina in een rapport naar de juiste plek verplaatsen +- Een formulierpagina dupliceren zodat je meerdere blanco exemplaren in één bestand hebt +- Concept- of plaatshouderpagina's verwijderen voordat je een document verspreidt +- De paginavolgorde omkeren of door elkaar halen om af te drukken +- Een eigen paginavolgorde samenstellen zonder losse bestanden opnieuw samen te voegen + +## Tips + +- Het veld voor de eigen paginavolgorde verwacht oorspronkelijke paginanummers gescheiden door komma's. Elke pagina moet precies één keer voorkomen: geen weglatingen of dubbelen. +- Na het dupliceren van een pagina verwijzen beide kopieën naar dezelfde oorspronkelijke pagina-index. Elke kopie kun je los van de andere herschikken. +- Voor bulkbewerkingen over meerdere bestanden of geavanceerdere werkwijzen kun je beter de [PDF-multitool](./pdf-multi-tool) gebruiken. + +## Gerelateerde tools + +- [PDF samenvoegen](./merge-pdf) +- [Pagina's verwijderen](./delete-pages) +- [PDF-multitool](./pdf-multi-tool) +- [Paginavolgorde omkeren](./reverse-pages) diff --git a/docs/nl/tools/page-dimensions.md b/docs/nl/tools/page-dimensions.md new file mode 100644 index 00000000..37c16fa7 --- /dev/null +++ b/docs/nl/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Paginaafmetingen +description: Analyseer paginaformaten, oriëntaties, beeldverhoudingen en rotatie van PDF's. Herken documenten met gemengde formaten en exporteer de gegevens naar CSV. +--- + +# Paginaafmetingen + +Een diagnosetool die elke pagina van je PDF leest en de exacte afmetingen, oriëntatie, standaardformaatnaam, beeldverhouding, oppervlakte en rotatie weergeeft. Handig om pagina's met gemengde formaten op te sporen vóór het afdrukken, of om de eigenschappen van een ontvangen PDF vast te leggen. + +## Hoe het werkt + +1. Upload een PDF-bestand. De analyse start automatisch, er hoeft geen knop te worden ingedrukt. +2. Een overzichtspaneel toont het totaal aantal pagina's, het aantal unieke paginaformaten en of het document gemengde formaten bevat. +3. Bekijk de volledige resultatentabel met details per pagina. +4. Schakel de weergave-eenheden om tussen punten, inches, millimeters of pixels. +5. Klik op **Exporteren naar CSV** om de gegevens op te slaan. + +## Gerapporteerde velden + +| Kolom | Beschrijving | +| ---------------- | ------------------------------------------------------- | +| Pagina # | Opeenvolgend paginanummer | +| Afmetingen | Breedte x hoogte in de gekozen eenheid | +| Standaardformaat | Gevonden naam (A4, Letter, enz.) of "Aangepast" | +| Oriëntatie | Staand of liggend | +| Beeldverhouding | Verhouding tussen breedte en hoogte als decimaal | +| Oppervlakte | Paginaoppervlakte in de gekozen eenheid in het kwadraat | +| Rotatie | Paginarotatie in graden | + +## Functies + +- Automatische herkenning van standaard papierformaten (A3, A4, A5, Letter, Legal, Tabloid en meer) +- Waarschuwing bij documenten met gemengde formaten, met een overzicht van welke formaten voorkomen en hoeveel pagina's elk gebruikt +- Eenheden omrekenen tussen punten, inches, millimeters en pixels (bij 96 PPI) +- CSV-export voor gebruik in spreadsheets of documentatiesystemen + +## Toepassingen + +- Controleren of alle pagina's A4 zijn voordat je een document naar een drukkerij stuurt +- Uitzoeken waarom een samengevoegde PDF op bepaalde pagina's met onverwachte marges wordt afgedrukt +- De paginaindeling van een groot PDF-archief vastleggen voor metadata +- Geroteerde pagina's opsporen die gecorrigeerd moeten worden + +## Tips + +- Als het overzicht "Gemengde formaten" toont, gebruik dan de tool Paginagrootte Fiksen om te standaardiseren voordat je afdrukt. +- Het rotatieveld helpt pagina's te herkennen die correct worden weergegeven maar een rotatiekenmerk hebben dat niet nul is, wat in sommige werkwijzen problemen kan geven. + +## Gerelateerde tools + +- [Paginagrootte corrigeren](./fix-page-size): pagina's standaardiseren na het opsporen van gemengde formaten +- [PDF comprimeren](./compress-pdf): de PDF optimaliseren nadat paginaproblemen zijn opgelost +- [PDF roteren](./rotate-pdf): geroteerde pagina's corrigeren diff --git a/docs/nl/tools/page-numbers.md b/docs/nl/tools/page-numbers.md new file mode 100644 index 00000000..c5f053da --- /dev/null +++ b/docs/nl/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Paginanummers +description: Voeg aanpasbare paginanummers toe op elke positie van je PDF-pagina's, met instelbaar lettertype, formaat en kleur. +--- + +# Paginanummers + +Voeg zichtbare paginanummers toe aan elke pagina van je PDF. Jij kiest de positie, notatie, lettergrootte en kleur, de rest doet de tool. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. Stel de paginanummers in via het optiepaneel dat verschijnt. +3. Klik op **Paginanummers toevoegen** om te verwerken. +4. De genummerde PDF wordt automatisch gedownload. + +## Opties + +- **Positie**: kies waar de paginanummers verschijnen: onder midden, linksonder, rechtsonder, boven midden, linksboven of rechtsboven. +- **Notatie**: kies tussen eenvoudige nummering (1, 2, 3...) of de notatie "pagina X van Y" (1 / 5, 2 / 5...). +- **Lettergrootte**: stel de grootte van de tekst van het paginanummer in. Standaard 12. +- **Kleur**: kies met de kleurkiezer een willekeurige kleur voor de tekst van het paginanummer. + +## Functies + +- Zes positieopties die alle hoeken en middenposities dekken +- Twee nummeringsnotaties: eenvoudig opeenvolgend of "pagina X van Y" +- Aanpasbare lettergrootte van 6 tot 72 punten +- Volledige kleurkiezer voor de tekstkleur +- Automatische marge-afhandeling die de nummers binnen veilige zones houdt, ongeacht het paginaformaat + +## Toepassingen + +- Documenten voorbereiden voor druk die zichtbare paginaverwijzingen nodig hebben +- Paginanummers toevoegen aan een samengevoegde PDF uit meerdere bronbestanden +- Handouts van presentaties nummeren voordat je ze verspreidt +- Opeenvolgende nummering toevoegen aan juridische documenten of contracten + +## Tips + +- De notatie "pagina X van Y" is handig voor documenten waarbij lezers de totale lengte moeten weten, zoals voorstellen of rapporten. +- Als je verschillende nummeringsstijlen nodig hebt voor verschillende secties (zoals Romeinse cijfers voor voorwerk), gebruik dan de tool [Paginalabels toevoegen](./add-page-labels). + +## Gerelateerde tools + +- [Paginalabels toevoegen](./add-page-labels) +- [Bates-nummering](./bates-numbering) +- [Koptekst en voettekst](./header-footer) diff --git a/docs/nl/tools/pdf-booklet.md b/docs/nl/tools/pdf-booklet.md new file mode 100644 index 00000000..0ca67d58 --- /dev/null +++ b/docs/nl/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF-boekje +description: Herschik PDF-pagina's in boekjesvolgorde (nietjesband) om te vouwen en te nieten tot een fysiek boekje. +--- + +# PDF-boekje + +Herschik de pagina's van een PDF in de volgorde voor een boekje. Als je dubbelzijdig afdrukt en de vellen doormidden vouwt, staan de pagina's in de juiste leesvolgorde. Dit is de indeling voor boekjes met nietjesband en zines. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Stel het boekje in: uitvoerpaginaformaat en oriëntatie. +3. Klik op **Voorbeeld genereren** om te zien hoe de pagina's op elk vel worden geplaatst. +4. Bekijk het voorbeeld, dat elk fysiek vel toont met de voor- en achterzijde. +5. Klik op **Downloaden** om de PDF in boekjesvolgorde op te slaan. + +## Functies + +- Automatisch herordenen van pagina's voor nietjesband +- Instelbaar uitvoerpaginaformaat +- Visueel voorbeeld van de boekjesindeling vóór het downloaden +- Verwerkt een oneven aantal pagina's door waar nodig blanco pagina's in te voegen +- Schaalt de bronpagina's naar het formaat van het boekjesvel + +## Toepassingen + +- Afdrukbare boekjes of zines maken van een gewone PDF +- Congresprogramma's of evenementgidsen voorbereiden voor intern afdrukken +- Gevouwen wenskaarten of kleine catalogi maken +- Dichtbundels of kleine uitgaven voorbereiden om met de hand te binden + +## Tips + +- Het aantal pagina's van je bron-PDF is idealiter een veelvoud van 4 voor een net boekje. Is dat niet zo, dan worden automatisch blanco pagina's toegevoegd om het laatste vel te vullen. +- Druk de uitvoer dubbelzijdig af met de printerinstelling "omslaan over korte zijde", vouw dan alle vellen samen en niet ze op de rug. +- Als je alleen meerdere pagina's op één vel wilt plaatsen zonder boekjesvolgorde, gebruik dan [N-up PDF](./n-up-pdf). + +## Gerelateerde tools + +- [N-up PDF](./n-up-pdf) +- [PDF roteren](./rotate-pdf) +- [Blanco pagina toevoegen](./add-blank-page) diff --git a/docs/nl/tools/pdf-layers.md b/docs/nl/tools/pdf-layers.md new file mode 100644 index 00000000..bb3280f6 --- /dev/null +++ b/docs/nl/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCG-lagen +description: Bekijk, schakel, voeg toe en verwijder Optional Content Group-lagen (OCG) in een PDF-document. +--- + +# PDF OCG-lagen + +Beheer de Optional Content Groups (OCG), vaak "lagen" genoemd, in een PDF. Je kunt de zichtbaarheid van lagen schakelen, nieuwe lagen toevoegen (ook geneste onderliggende lagen), lagen verwijderen en de gewijzigde PDF opslaan. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Klik op de verwerkknop om het document met de PyMuPDF-engine te laden. +3. De tool toont alle bestaande lagen met hun zichtbaarheid, vergrendelingsstatus en nestinghiërarchie. +4. Schakel de selectievakjes om lagen te tonen of te verbergen. Vergrendelde lagen kunnen niet worden geschakeld. +5. Voeg nieuwe lagen op het hoogste niveau toe door een naam te typen en op de toevoegknop te klikken, of voeg onderliggende lagen toe onder een bestaande bovenliggende laag. +6. Verwijder lagen die je niet meer nodig hebt. +7. Klik op **Opslaan** om de gewijzigde PDF met je laagwijzigingen te downloaden. + +## Functies + +- Toont de laaghiërarchie met de juiste inspringing voor geneste lagen +- Zichtbaarheid van lagen aan of uit schakelen +- Indicator voor vergrendelde lagen voorkomt onbedoelde wijzigingen +- Lagen op het hoogste niveau of onderliggende lagen toevoegen met eigen namen +- Afzonderlijke lagen verwijderen +- Slaat alle wijzigingen op in een nieuw PDF-bestand + +## Toepassingen + +- De zichtbaarheid van markeringslagen in architectuur- of engineeringtekeningen schakelen +- Nieuwe annotatielagen toevoegen aan een ontwerpdocument met meerdere lagen +- Verouderde lagen uit een sjabloon verwijderen voordat je het verspreidt +- Nagaan welke lagen er in een complexe PDF van een derde zitten + +## Tips + +- Als de PDF geen lagen heeft, toont de tool een lege weergave met een uitnodiging om er een toe te voegen. Niet alle PDF's gebruiken OCG-lagen: ze komen het meest voor in CAD-exports en ontwerpbestanden. +- Onderliggende lagen worden visueel ingesprongen onder hun bovenliggende laag. Je kunt lagen op elke diepte nesten. +- Vergrendelde lagen worden getoond met een slotpictogram en hun selectievakjes zijn uitgeschakeld. Deze vergrendelingen zijn ingesteld door de maker van de PDF. + +## Gerelateerde tools + +- [Metadata weergeven](./view-metadata) +- [Metadata bewerken](./edit-metadata) +- [Dupliceren en organiseren](./organize-pdf) diff --git a/docs/nl/tools/pdf-multi-tool.md b/docs/nl/tools/pdf-multi-tool.md new file mode 100644 index 00000000..d74f1524 --- /dev/null +++ b/docs/nl/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF-multitool +description: Een alles-in-één paginabeheerder om PDF-pagina's samen te voegen, te splitsen, te roteren, te dupliceren, te verwijderen en te herschikken. +--- + +# PDF-multitool + +Een gezamenlijke werkruimte voor elke bewerking op paginaniveau. Upload een of meer PDF's en werk met al hun pagina's in één visueel raster. Roteer, herschik, dupliceer, verwijder, voeg nieuwe PDF's in, voeg blanco pagina's toe en splits het resultaat, allemaal zonder de tool te verlaten. + +## Hoe het werkt + +1. Klik op **PDF's uploaden** of sleep bestanden naar het uploadgebied. Meerdere bestanden worden ondersteund. +2. Alle pagina's van elk geüpload bestand verschijnen met miniaturen in een scrollbaar raster. +3. Gebruik de werkbalk of de actieknoppen per pagina om pagina's te bewerken. +4. Selecteer pagina's met het selectievakje op elke kaart en pas daarna bulkbewerkingen toe. +5. Markeer splitspunten met het schaarpictogram om de uitvoer in aparte bestanden te verdelen. +6. Klik op **PDF exporteren** om het eindresultaat te downloaden. Als er splitsmarkeringen zijn, is de uitvoer een ZIP met meerdere PDF's. + +## Functies + +- **Samenvoegen**: upload meerdere PDF's en ze worden automatisch in één werkruimte gecombineerd +- **Herschikken**: sleep paginakaarten om de volgorde te wijzigen +- **Roteren**: rotatie per pagina of in bulk in stappen van 90 graden (links of rechts) +- **Dupliceren**: kloon elke pagina met één klik +- **Verwijderen**: verwijder afzonderlijke pagina's of de geselecteerde pagina's in bulk +- **PDF invoegen**: voeg een nieuwe PDF toe na een bepaalde pagina +- **Blanco pagina toevoegen**: voeg aan het einde een blanco A4-pagina toe +- **Splitsen**: plaats splitsmarkeringen tussen pagina's en exporteer als ZIP met aparte PDF's +- **Alles selecteren / Selectie opheffen**: snel selecteren voor bulkbewerkingen +- **Ongedaan maken / Opnieuw**: volledige geschiedenis voor elke bewerking +- **Selectie downloaden**: exporteer alleen de geselecteerde pagina's als losse PDF +- Herstelt beschadigde PDF's automatisch vóór het laden + +## Toepassingen + +- Een eigen document samenstellen uit pagina's van meerdere bron-PDF's +- Een gescand document opschonen door blanco pagina's te verwijderen, zijwaarts gescande pagina's te roteren en secties te herschikken +- Een grote PDF bij hoofdstukgrenzen splitsen met visuele splitsmarkeringen +- Snel bewerken op paginaniveau zonder een volledige PDF-editor nodig te hebben + +## Tips + +- Het systeem voor ongedaan maken en opnieuw volgt elke bewerking. Gebruik het gerust: je kunt je werk niet per ongeluk vernietigen. +- Splitsmarkeringen verschijnen als blauwe stippellijnen tussen pagina's. Plaats ze visueel waar je het document wilt verdelen en exporteer dan om een ZIP te krijgen. +- Voor eenvoudige taken met samenvoegen of splitsen zijn de aparte tools [PDF samenvoegen](./merge-pdf) of [PDF splitsen](./split-pdf) misschien sneller. De Multi-tool komt tot zijn recht wanneer je in één sessie meerdere bewerkingen nodig hebt. + +## Gerelateerde tools + +- [PDF samenvoegen](./merge-pdf) +- [PDF splitsen](./split-pdf) +- [Dupliceren en organiseren](./organize-pdf) +- [PDF roteren](./rotate-pdf) diff --git a/docs/nl/tools/pdf-to-bmp.md b/docs/nl/tools/pdf-to-bmp.md new file mode 100644 index 00000000..578a47fc --- /dev/null +++ b/docs/nl/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF naar BMP +description: Zet PDF-pagina's om naar ongecomprimeerde BMP-afbeeldingen. Handig voor verouderde systemen en drukwerkprocessen die bitmapinvoer vereisen. +--- + +# PDF naar BMP + +Zet elke pagina van een PDF om in een BMP-afbeelding (Bitmap). BMP is een ongecomprimeerd formaat, dus de uitvoer is pixelperfect zonder kwaliteitsverlies, maar de bestanden zijn groot. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Klik op **Converteren** om het bestand te verwerken. +3. Een enkel `.bmp`-bestand of een ZIP-archief wordt automatisch gedownload. + +## Opties + +Deze tool heeft geen instelbare opties. Pagina's worden met een vaste schaal van 2x weergegeven, wat afbeeldingen oplevert met ongeveer dubbele afmetingen van de oorspronkelijke PDF-pagina. + +## Uitvoerformaat + +- **Eén pagina**: `filename.bmp` +- **Meerdere pagina's**: `filename_bmps.zip` met `page_1.bmp`, `page_2.bmp`, enz. + +## Toepassingen + +- PDF-pagina's aanleveren aan verouderde systemen of apparaten die alleen BMP accepteren. +- Ongecomprimeerde afbeeldingen voorbereiden voor specifieke drukwerkprocessen. +- Bitmapuitvoer gebruiken als invoer voor beeldverwerkingstools die ruwe pixelgegevens nodig hebben. + +## Tips + +- BMP-bestanden zijn erg groot omdat ze ruwe pixelgegevens zonder compressie opslaan. Voor de meeste toepassingen geeft [PDF naar PNG](./pdf-to-png) verliesvrije kwaliteit met veel kleinere bestanden. +- Als je doelsysteem PNG of TIFF accepteert, geef dan de voorkeur aan die formaten om schijfruimte te besparen. + +## Gerelateerde tools + +- [PDF naar PNG](./pdf-to-png) +- [PDF naar TIFF](./pdf-to-tiff) +- [PDF naar JPG](./pdf-to-jpg) diff --git a/docs/nl/tools/pdf-to-cbz.md b/docs/nl/tools/pdf-to-cbz.md new file mode 100644 index 00000000..273f9b8c --- /dev/null +++ b/docs/nl/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF naar CBZ +description: Zet een PDF om naar een CBZ-bestand (Comic Book Archive) voor stripreaders zoals Komga, Kavita, CDisplayEx en Calibre. +--- + +# PDF naar CBZ + +Zet een PDF om naar een CBZ-bestand (Comic Book ZIP), het standaardformaat voor digitale strips en manga. Elke PDF-pagina wordt een afbeelding in het archief. De tool genereert metadata in drie formaten voor maximale compatibiliteit: ComicInfo.xml, metadata.opf en ComicBookInfo JSON. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Kies afbeeldingsformaat, kwaliteit, schaal en optionele metadata. +3. Klik op **Converteren** om het CBZ-bestand te genereren. +4. Het `.cbz`-bestand wordt automatisch gedownload. + +## Opties + +| Optie | Waarden | Standaard | Beschrijving | +| ------------------ | --------------- | --------- | ---------------------------------------------------------------------------------------------- | +| Afbeeldingsformaat | JPEG, PNG, WebP | JPEG | JPEG voor kleurenstrips, PNG voor verliesvrije zwart-wit manga, WebP voor de beste compressie. | +| Kwaliteit | 50–100% | 85% | Bepaalt de JPEG/WebP-compressie. Verborgen voor PNG (altijd verliesvrij). | +| Schaal | 1.0x–4.0x | 2.0x | Een hogere schaal geeft scherpere afbeeldingen voor schermen met hoge resolutie. | +| Grijswaarden | Aan/Uit | Uit | Zet pagina's om naar grijswaarden. Verkleint het bestand bij zwart-wit inhoud. | +| Manga-modus | Aan/Uit | Uit | Stelt in de metadata de leesrichting van rechts naar links in. | +| Metadata opnemen | Aan/Uit | Aan | Sluit ComicInfo.xml, metadata.opf en ComicBookInfo JSON in. | + +## Metadatavelden + +Als metadata is ingeschakeld, kun je invullen: + +- **Titel**: automatisch herkend uit de PDF-bestandsnaam. +- **Serie**: de naam van de serie (bijv. "Naruto"). +- **Nummer (#)**: deelnummer binnen de serie. +- **Volume (Vol.)**: volumenummer. +- **Auteur(s)**: naam van de schrijver of maker. +- **Uitgever**: uitgeverij. +- **Labels / Genre**: tags gescheiden door komma's (bijv. "Actie, Avontuur"). +- **Publicatiejaar**: jaar van publicatie (1900–2100). +- **Beoordeling**: beoordeling door de community van 0 tot 5. + +## Metadatacompatibiliteit + +De tool schrijft metadata in drie formaten zodat elke reader ze kan vinden: + +| Formaat | Locatie | Ondersteund door | +| ------------------ | ------------------- | ------------------------------------------- | +| ComicInfo.xml | Bestand in de ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Bestand in de ZIP | Calibre | +| ComicBookInfo JSON | ZIP-opmerkingenveld | Calibre (terugvaloptie) | + +## Uitvoerformaat + +- `filename.cbz`: een ZIP-archief met genummerde pagina-afbeeldingen en metadatabestanden. + +Pagina-afbeeldingen krijgen namen met nullen aangevuld (`01.jpg`, `02.jpg`, enz.) zodat readers ze in de juiste volgorde tonen. + +## Toepassingen + +- Manga- of strip-PDF's omzetten voor gebruik met stripreaders. +- Een digitale stripbibliotheek opbouwen in Komga, Kavita of Calibre. +- Gescande stripboeken omzetten naar een formaat dat prettig leest in een reader. +- Strips delen in een formaat dat leesrichting en metadata behoudt. + +## Tips + +- Gebruik **JPEG** voor kleurenstrips en **PNG** voor zwart-wit manga: PNG comprimeert zwart-wit inhoud heel efficiënt. +- Schakel **Grijswaarden** in voor manga om de bestandsgrootte aanzienlijk te verkleinen. +- Vul de velden **Serie** en **Nummer** in zodat bibliotheekbeheerders (Komga, Calibre) je verzameling automatisch kunnen ordenen. +- **WebP** biedt de beste compressie, maar oudere stripreaders ondersteunen het mogelijk niet. + +## Gerelateerde tools + +- [PDF naar JPG](./pdf-to-jpg) +- [PDF naar PNG](./pdf-to-png) +- [PDF naar TIFF](./pdf-to-tiff) +- [Afbeeldingen extraheren](./extract-images) diff --git a/docs/nl/tools/pdf-to-csv.md b/docs/nl/tools/pdf-to-csv.md new file mode 100644 index 00000000..676f0df9 --- /dev/null +++ b/docs/nl/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF naar CSV +description: Haal tabellen uit PDF-documenten en exporteer ze als één CSV-bestand. Verwerkt PDF's met meerdere pagina's met automatische tabeldetectie. +--- + +# PDF naar CSV + +Haalt tabellen uit een PDF en exporteert ze als CSV-bestand. De tool doorzoekt elke pagina op tabelgegevens met de tabeldetectie-engine van PyMuPDF en schrijft alle gevonden rijen naar één door komma's gescheiden uitvoer. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Klik op **Converteren** om de tabelextractie te starten. +3. De tool scant elke pagina en herkent tabellen automatisch. +4. Een `.csv`-bestand met alle geëxtraheerde tabelgegevens wordt gedownload. + +Tabellen van verschillende pagina's worden in de uitvoer gescheiden door lege rijen. Cellen met komma's, aanhalingstekens of regeleinden worden correct ge-escaped volgens RFC 4180. + +## Opties + +Deze tool heeft geen instelbare opties. Alle tabellen in het document worden geëxtraheerd en gecombineerd in één CSV. + +## Uitvoerformaat + +- Eén `filename.csv`-bestand met alle gedetecteerde tabellen. + +## Toepassingen + +- Financiële gegevens uit PDF-bankafschriften of facturen in een spreadsheet halen. +- Prijstabellen uit offertes van leveranciers extraheren om te vergelijken. +- Tabelgegevens uit PDF-onderzoeksartikelen omzetten naar een formaat dat geschikt is voor analysetools. +- Gegevens uit oude PDF-rapporten migreren naar databases. + +## Tips + +- Als er geen tabellen worden gevonden, toont de tool de melding "Geen tabellen gevonden". Meestal betekent dit dat de PDF een tekstindeling gebruikt die op een tabel lijkt maar niet als echte tabel is opgebouwd. +- Voor meer controle over afzonderlijke tabellen gebruik je [PDF-tabellen extraheren](./extract-tables), waarmee je kunt kiezen tussen CSV, JSON en Markdown als uitvoerformaat. +- Als je de gegevens in Excel-formaat wilt, met aparte bladen per tabel, gebruik dan [PDF naar Excel](./pdf-to-excel). + +## Gerelateerde tools + +- [PDF naar Excel](./pdf-to-excel) +- [PDF-tabellen extraheren](./extract-tables) +- [PDF naar tekst](./pdf-to-text) diff --git a/docs/nl/tools/pdf-to-excel.md b/docs/nl/tools/pdf-to-excel.md new file mode 100644 index 00000000..92462236 --- /dev/null +++ b/docs/nl/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF naar Excel +description: Haal tabellen uit PDF-documenten naar een Excel-spreadsheet. Elke tabel krijgt een eigen werkblad met paginaverwijzing. +--- + +# PDF naar Excel + +Haalt tabellen uit een PDF en slaat ze op als Excel-spreadsheet (`.xlsx`). Elke gedetecteerde tabel komt op een eigen werkblad, met het tabelnummer en de bronpagina als label. Gebruikt PyMuPDF voor tabeldetectie en de SheetJS-bibliotheek voor het maken van Excel-bestanden. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Klik op **Converteren** om de tabelextractie te starten. +3. De tool scant elke pagina op tabellen en bouwt daarna een Excel-werkmap. +4. Een `.xlsx`-bestand met één blad per tabel wordt gedownload. + +## Opties + +Deze tool heeft geen instelbare opties. Alle gedetecteerde tabellen worden automatisch geëxtraheerd. + +## Uitvoerformaat + +- Eén `filename.xlsx`-bestand. +- **Eén tabel**: een enkel werkblad met de naam "Table". +- **Meerdere tabellen**: werkbladen met de namen "Table 1 (Page 3)", "Table 2 (Page 5)", enz. Bladnamen worden afgekapt tot 31 tekens (de limiet van Excel). + +## Toepassingen + +- PDF-financiële rapporten omzetten naar bewerkbare spreadsheets voor verdere analyse. +- Voorraad- of ordertabellen uit PDF's van leveranciers halen. +- Gestructureerde gegevens uit PDF-formulieren of catalogi naar Excel halen om te sorteren en te filteren. +- Tabelgegevens uit PDF's archiveren in een formaat waarmee niet-technische collega's kunnen werken. + +## Tips + +- Als de tool "Geen tabellen gevonden" meldt, gebruikt de PDF waarschijnlijk een vrije tekstindeling in plaats van gestructureerde tabellen. Probeer [PDF naar tekst](./pdf-to-text) om in plaats daarvan de ruwe inhoud te pakken. +- Voor een eenvoudiger plat formaat gebruik je [PDF naar CSV](./pdf-to-csv). Voor downloads per tabel in meerdere formaten gebruik je [PDF-tabellen extraheren](./extract-tables). +- Bekijk de bladnamen om te zien van welke pagina elke tabel afkomstig is. + +## Gerelateerde tools + +- [PDF naar CSV](./pdf-to-csv) +- [PDF-tabellen extraheren](./extract-tables) +- [PDF naar tekst](./pdf-to-text) diff --git a/docs/nl/tools/pdf-to-greyscale.md b/docs/nl/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..b2b87dcb --- /dev/null +++ b/docs/nl/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF naar grijswaarden +description: Zet een kleuren-PDF om naar een versie in grijswaarden (zwart-wit). Maakt een nieuwe PDF waarin alle kleur van elke pagina is verwijderd. +--- + +# PDF naar grijswaarden + +Zet een kleuren-PDF om naar een versie in grijswaarden. Elke pagina wordt weergegeven, ontdaan van kleurverzadiging en als JPEG-afbeelding opnieuw ingebed in een nieuwe PDF. De uitvoer behoudt de oorspronkelijke paginaafmetingen. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Klik op **Converteren** om het bestand te verwerken. +3. Een nieuwe `greyscale.pdf` wordt gedownload met alle pagina's omgezet naar zwart-wit. + +Achter de schermen wordt elke pagina op schaal 2x weergegeven, gaan de pixelgegevens door een grijswaardenfilter en worden ze opnieuw gecodeerd als JPEG met 90% kwaliteit en in een nieuw PDF-document geplaatst. + +## Opties + +Deze tool heeft geen instelbare opties. De omzetting naar grijswaarden gebruikt een standaard luminantieformule en de JPEG-kwaliteit staat vast op 90%. + +## Uitvoerformaat + +- Eén `greyscale.pdf`-bestand met alle pagina's als JPEG-afbeeldingen in grijswaarden. + +## Toepassingen + +- Documenten voorbereiden voor zwart-wit afdrukken om kleurinkt te besparen. +- Voldoen aan indieningsvereisten voor juridische of overheidsdocumenten waarvoor grijswaarden verplicht zijn. +- De bestandsgrootte verkleinen van PDF's met veel kleur (JPEG-afbeeldingen in grijswaarden zijn kleiner dan kleurenafbeeldingen). +- Een consistente visuele stijl creëren voor documenten met gemengde kleuren- en zwart-witpagina's. + +## Tips + +- Omdat elke pagina wordt gerasterd en als JPEG opnieuw wordt ingebed, is de uitvoer afbeeldingsgebaseerd. Tekst uit de oorspronkelijke PDF is dan niet meer selecteerbaar of doorzoekbaar. Als je daarna doorzoekbare tekst nodig hebt, haal de uitvoer dan door de OCR-tool. +- Voor meer controle over kleuraanpassingen (helderheid, contrast, verzadiging) kun je de tool Kleuren aanpassen of het Grijswaarden-knooppunt in de [PDF-workflowbouwer](./pdf-workflow) bekijken. + +## Gerelateerde tools + +- [PDF naar JPG](./pdf-to-jpg) +- [PDF naar PNG](./pdf-to-png) +- [PDF-workflowbouwer](./pdf-workflow) diff --git a/docs/nl/tools/pdf-to-jpg.md b/docs/nl/tools/pdf-to-jpg.md new file mode 100644 index 00000000..a52401dd --- /dev/null +++ b/docs/nl/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF naar JPG +description: Zet PDF-pagina's om naar JPG-afbeeldingen met instelbare kwaliteit. PDF's van één pagina worden direct gedownload, PDF's met meerdere pagina's als ZIP. +--- + +# PDF naar JPG + +Zet elke pagina van een PDF om in een JPG-afbeelding. Documenten van één pagina worden gedownload als los `.jpg`-bestand. PDF's met meerdere pagina's leveren een ZIP-archief op met één JPG per pagina. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. De tool toont de bestandsnaam, de bestandsgrootte en het aantal pagina's. +2. Pas de schuifregelaar **Kwaliteit** aan om de JPG-compressie te bepalen. +3. Klik op **Converteren** om de verwerking te starten. +4. Het resultaat wordt automatisch gedownload: een enkele JPG voor PDF's van één pagina, of een ZIP-bestand voor documenten met meerdere pagina's. + +## Opties + +- **Kwaliteit**: een schuifregelaar van 0% tot 100% (standaard 90%). Hogere waarden geven scherpere afbeeldingen met grotere bestanden. Lagere waarden comprimeren sterker. + +Pagina's worden intern op schaal 2x weergegeven, dus de uitvoerresolutie is het dubbele van de PDF-paginaafmetingen. Een standaard pagina van Letter-formaat levert een afbeelding op van ongeveer 1.224 x 1.584 pixels. + +## Uitvoerformaat + +- **Eén pagina**: `filename.jpg` +- **Meerdere pagina's**: `filename_jpgs.zip` met `page_1.jpg`, `page_2.jpg`, enz. + +## Toepassingen + +- Voorbeeldminiaturen genereren voor een documentbeheersysteem. +- Een pagina uit een rapport delen in een chat of e-mail die geen PDF ondersteunt. +- Afbeeldingen maken van diagrammen of illustraties uit PDF's. +- Gescande documenten archiveren als afzonderlijke afbeeldingen. + +## Tips + +- Gebruik voor verliesvrije uitvoer liever [PDF naar PNG](./pdf-to-png). +- Een kwaliteitsinstelling van 80-90% biedt een goede balans tussen bestandsgrootte en beeldkwaliteit. +- Als je per pagina een specifiek formaat nodig hebt, bekijk dan de [PDF-workflowbouwer](./pdf-workflow), die een uitvoerknooppunt PDF naar afbeeldingen heeft. + +## Gerelateerde tools + +- [PDF naar PNG](./pdf-to-png) +- [PDF naar WebP](./pdf-to-webp) +- [PDF naar BMP](./pdf-to-bmp) +- [PDF naar TIFF](./pdf-to-tiff) diff --git a/docs/nl/tools/pdf-to-json.md b/docs/nl/tools/pdf-to-json.md new file mode 100644 index 00000000..cef5b6e4 --- /dev/null +++ b/docs/nl/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF naar JSON +description: Zet PDF-bestanden om naar gestructureerd JSON-formaat met CPDF. Exporteert de interne structuur van de PDF als machineleesbare JSON-gegevens. +--- + +# PDF naar JSON + +Zet een of meer PDF-bestanden om naar JSON-formaat. De tool gebruikt CPDF (Coherent PDF) om de interne structuur van elke PDF te serialiseren naar een machineleesbare JSON-weergave. De uitvoer wordt altijd als ZIP-archief geleverd. + +## Hoe het werkt + +1. Selecteer een of meer PDF-bestanden met de bestandskiezer. +2. Klik op **Converteren** om de verwerking te starten. De conversie draait in een webworker op de achtergrond. +3. Een ZIP-archief wordt gedownload met één JSON-bestand voor elke invoer-PDF. + +De statusbalk toont de voortgang van de conversie en het maken van de ZIP. + +## Opties + +Deze tool heeft geen instelbare opties. Elke PDF wordt omgezet naar de volledige JSON-weergave. + +## Uitvoerformaat + +- Een `pdfs-to-json.zip`-bestand met `filename.json` voor elke invoer-PDF. + +De JSON-uitvoer geeft de interne objectstructuur van de PDF weer, inclusief paginabomen, lettertypeverwijzingen, metadata en inhoudsstromen. + +## Toepassingen + +- De interne structuur van een PDF inspecteren voor foutopsporing of validatie. +- Gestructureerde metadata en pagina-eigenschappen programmatisch extraheren. +- PDF-structuurgegevens aanleveren aan eigen verwerkingsketens. +- PDF-documenten controleren op naleving door hun objectbomen te analyseren. + +## Tips + +- Deze tool geeft de ruwe PDF-objectstructuur weer, niet de geëxtraheerde tekstinhoud. Als je paginatekst in JSON-formaat nodig hebt, gebruik dan [PDF voorbereiden voor AI](./prepare-pdf-for-ai). +- Voor het extraheren van platte tekst is [PDF naar tekst](./pdf-to-text) eenvoudiger. +- Grote PDF's met complexe structuren geven zeer grote JSON-bestanden. + +## Gerelateerde tools + +- [PDF naar tekst](./pdf-to-text) +- [PDF voorbereiden voor AI](./prepare-pdf-for-ai) +- [PDF-tabellen extraheren](./extract-tables) diff --git a/docs/nl/tools/pdf-to-markdown.md b/docs/nl/tools/pdf-to-markdown.md new file mode 100644 index 00000000..c73878df --- /dev/null +++ b/docs/nl/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF naar Markdown +description: Zet PDF-documenten om naar Markdown met optionele extractie van afbeeldingen. Ondersteunt het converteren van meerdere bestanden tegelijk. +--- + +# PDF naar Markdown + +Zet PDF-bestanden om naar Markdown (`.md`), met behoud van koppen, alinea's, lijsten en basisopmaak. Haalt optioneel ingebedde afbeeldingen eruit en neemt ze op. Ondersteunt enkele en gebundelde conversie. Gebruikt PyMuPDF. + +## Hoe het werkt + +1. Upload een of meer PDF's door op het neerzetgebied te klikken of bestanden erheen te slepen. +2. Schakel optioneel **Afbeeldingen opnemen** in om geëxtraheerde afbeeldingen in de Markdown-uitvoer in te sluiten. +3. Klik op **Converteren** om de verwerking te starten. +4. Een enkel bestand wordt gedownload als `filename.md`. Meerdere bestanden geven een `markdown-files.zip`. + +## Opties + +- **Afbeeldingen opnemen**: als dit is aangevinkt, worden ingebedde afbeeldingen uit de PDF geëxtraheerd en in de Markdown-uitvoer opgenomen. Als het niet is aangevinkt, wordt alleen de tekstinhoud omgezet. + +## Uitvoerformaat + +- **Eén bestand**: `filename.md` +- **Meerdere bestanden**: `markdown-files.zip` met één `.md` per invoer-PDF. + +## Toepassingen + +- PDF-documentatie omzetten naar Markdown voor een generator voor statische sites zoals VitePress, Hugo of Jekyll. +- PDF-onderzoeksartikelen omzetten naar bewerkbare Markdown voor notitie-apps zoals Obsidian. +- Oude PDF-kennisbanken migreren naar een tekstformaat dat bij Git past. +- Gestructureerde inhoud uit PDF-e-books halen om opnieuw op te maken. + +## Tips + +- De optie Afbeeldingen opnemen is handig als de PDF diagrammen of figuren bevat die essentieel zijn voor de inhoud. Schakel haar uit voor tekstrijke documenten om de uitvoer overzichtelijk te houden. +- Complexe indelingen met zijbalken, voetnoten of tekst in meerdere kolommen kunnen onvolmaakte Markdown opleveren. Controleer de uitvoer en pas hem zo nodig aan. +- Gebruik voor ruwe tekst zonder opmaak liever [PDF naar tekst](./pdf-to-text). + +## Gerelateerde tools + +- [PDF naar tekst](./pdf-to-text) +- [PDF naar Word](./pdf-to-word) +- [PDF voorbereiden voor AI](./prepare-pdf-for-ai) diff --git a/docs/nl/tools/pdf-to-pdfa.md b/docs/nl/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..47f7bd3d --- /dev/null +++ b/docs/nl/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF naar PDF/A +description: Zet standaard PDF's om naar PDF/A-formaat voor langdurige archivering. Ondersteunt de conformiteitsniveaus PDF/A-1b, PDF/A-2b en PDF/A-3b. +--- + +# PDF naar PDF/A + +PDF/A is een door ISO gestandaardiseerde subset van PDF, bedoeld voor langdurige digitale bewaring. Deze tool zet je standaard PDF's om naar PDF/A-conforme documenten met Ghostscript dat rechtstreeks in je browser draait. + +## Hoe het werkt + +1. Upload een of meer PDF-bestanden. +2. Kies een **PDF/A-versie** in de keuzelijst. +3. Schakel optioneel **PDF vooraf platmaken** in voor complexe bestanden waarbij de normale conversie mislukt. +4. Klik op **Converteren naar PDF/A**. Meerdere bestanden geven een ZIP-archief. + +## PDF/A-versies + +| Versie | Beperkingen | Het best voor | +| ------------ | -------------------------------------------- | ---------------------------------------------------- | +| **PDF/A-1b** | Strengst. Geen transparantie, geen lagen. | Maximale compatibiliteit met oudere archiefsystemen | +| **PDF/A-2b** | Staat transparantie en JPEG2000 toe. | Archivering voor algemeen gebruik (aanbevolen) | +| **PDF/A-3b** | Staat ingebedde bijlagen in elk formaat toe. | Documenten archiveren met bronbestanden met gegevens | + +PDF/A-2b is standaard geselecteerd en voldoet voor de overgrote meerderheid van archiveringsbehoeften. + +## Optie Vooraf platmaken + +Sommige PDF's bevatten kenmerken die een zuivere PDF/A-conversie verhinderen: ongebruikelijke lettertypecoderingen, complexe transparantiestapels of beschadigde interne structuren. Als je **Vooraf platmaken** inschakelt, wordt de PDF vóór de conversie op 300 DPI gerasterd. Dat garandeert conformiteit, ten koste van tekst die niet meer selecteerbaar is. Gebruik het als terugvaloptie wanneer de standaardconversie fouten geeft. + +Vooraf platmaken vereist de PyMuPDF WASM-engine. + +## Toepassingen + +- Voldoen aan archiveringseisen van overheden of de rechtspraak (in veel rechtsgebieden is PDF/A verplicht voor processtukken) +- Documenten indienen bij institutionele repositories of digitale bibliotheken +- Bedrijfsgegevens bewaren waarvan de oorspronkelijke software over tien jaar mogelijk niet meer bestaat +- Facturen voorbereiden voor e-facturatiestandaarden die PDF/A-3b met XML-bijlagen vereisen + +## Tips + +- Probeer de conversie eerst zonder vooraf platmaken. Schakel het alleen in als je een foutmelding krijgt. +- PDF/A sluit alle lettertypen in, dus uitvoerbestanden zijn vaak groter dan de originelen. +- Valideer de uitvoer in een speciale PDF/A-validator als strikte conformiteit vereist is voor je werkwijze. + +## Gerelateerde tools + +- [PDF comprimeren](./compress-pdf): verklein het bestand na de conversie +- [PDF platmaken](./flatten-pdf): maak formulieren plat voordat je naar PDF/A converteert +- [Metadata verwijderen](./remove-metadata): verwijder metadata vóór archivering diff --git a/docs/nl/tools/pdf-to-png.md b/docs/nl/tools/pdf-to-png.md new file mode 100644 index 00000000..b697442b --- /dev/null +++ b/docs/nl/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF naar PNG +description: Zet PDF-pagina's om naar verliesvrije PNG-afbeeldingen met instelbare schaal. Ideaal voor schermafbeeldingen van hoge kwaliteit en transparante achtergronden. +--- + +# PDF naar PNG + +Zet elke pagina van een PDF om in een PNG-afbeelding. PNG gebruikt verliesvrije compressie, dus de uitvoer behoudt elk detail van de oorspronkelijke pagina. PDF's van één pagina worden gedownload als `.png`-bestand, PDF's met meerdere pagina's geven een ZIP. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Stel de schuifregelaar **Schaal** in om de uitvoerresolutie te bepalen. +3. Klik op **Converteren** om de verwerking te starten. +4. Een enkele PNG of een ZIP-archief wordt automatisch gedownload. + +## Opties + +- **Schaal**: van 1.0x tot 3.0x (standaard 2.0x). Bij 2.0x wordt een standaard pagina van Letter-formaat weergegeven met ongeveer 1.224 x 1.584 pixels. Hogere schaalwaarden geven grotere, scherpere afbeeldingen ten koste van bestandsgrootte en verwerkingstijd. + +## Uitvoerformaat + +- **Eén pagina**: `filename.png` +- **Meerdere pagina's**: `filename_pngs.zip` met `page_1.png`, `page_2.png`, enz. + +## Toepassingen + +- Schermafbeeldingen van hoge kwaliteit van PDF-pagina's maken voor presentaties. +- Grafieken of diagrammen extraheren die scherpe randen en geen compressieartefacten nodig hebben. +- Materiaal voor webdesign voorbereiden vanuit PDF-mockups. +- Verliesvrije paginabeelden maken voor OCR-voorbewerking. + +## Tips + +- PNG-bestanden zijn aanzienlijk groter dan JPG. Als bestandsgrootte belangrijker is dan perfecte kwaliteit, gebruik dan [PDF naar JPG](./pdf-to-jpg) of [PDF naar WebP](./pdf-to-webp). +- Bij schaal 1.0x komt de uitvoer overeen met de oorspronkelijke resolutie van de PDF. Ga naar 3.0x voor exports in drukkwaliteit. + +## Gerelateerde tools + +- [PDF naar JPG](./pdf-to-jpg) +- [PDF naar WebP](./pdf-to-webp) +- [PDF naar SVG](./pdf-to-svg) diff --git a/docs/nl/tools/pdf-to-svg.md b/docs/nl/tools/pdf-to-svg.md new file mode 100644 index 00000000..b54a9afe --- /dev/null +++ b/docs/nl/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF naar SVG +description: Zet PDF-pagina's om naar schaalbare SVG-vectorafbeeldingen. Behoudt tekst en vormen als vectorpaden voor oneindig schalen. +--- + +# PDF naar SVG + +Zet elke pagina van een PDF om in een SVG-bestand (Scalable Vector Graphics). In tegenstelling tot rasterformaten behoudt SVG vectorpaden, tekst en vormen, zodat de uitvoer op elke grootte kan worden geschaald zonder pixelvorming. Gebruikt PyMuPDF. + +## Hoe het werkt + +1. Upload een of meer PDF's door op het neerzetgebied te klikken of bestanden erheen te slepen. Je kunt meerdere bestanden toevoegen en ze afzonderlijk beheren. +2. Klik op **Converteren** om alle geüploade bestanden te verwerken. +3. Conversies van één bestand met één pagina worden gedownload als los `.svg`-bestand. Al het andere wordt gedownload als ZIP-archief. + +## Opties + +Deze tool heeft geen instelbare opties. Elke pagina wordt naar SVG omgezet met de eigen vectorexport van PyMuPDF. + +## Uitvoerformaat + +- **Eén bestand, één pagina**: `filename.svg` +- **Eén bestand, meerdere pagina's**: `filename_svg.zip` met `page_1.svg`, `page_2.svg`, enz. +- **Meerdere bestanden**: `pdf_to_svg.zip` met bestanden geordend op de naam van het brondocument. + +## Toepassingen + +- Vectordiagrammen, grafieken of illustraties uit PDF-rapporten halen voor gebruik op webpagina's. +- De inhoud van PDF-pagina's bewerken in een vectoreditor zoals Inkscape of Illustrator. +- Schaalbare paginavoorbeelden insluiten in responsieve webapplicaties. +- Logo's of afbeeldingen uit PDF-brochures halen met behoud van scherpe randen. + +## Tips + +- SVG werkt het best met PDF's die vectorinhoud bevatten. Gescande documenten of PDF's met veel afbeeldingen geven grote SVG-bestanden met ingebedde rastergegevens. +- Gebruik voor rasteruitvoer van PDF's met veel afbeeldingen liever [PDF naar PNG](./pdf-to-png) of [PDF naar JPG](./pdf-to-jpg). +- Deze tool ondersteunt gebundelde conversie: upload meerdere PDF's tegelijk om ze allemaal in één keer om te zetten. + +## Gerelateerde tools + +- [PDF naar PNG](./pdf-to-png) +- [PDF naar JPG](./pdf-to-jpg) +- [PDF naar Markdown](./pdf-to-markdown) diff --git a/docs/nl/tools/pdf-to-text.md b/docs/nl/tools/pdf-to-text.md new file mode 100644 index 00000000..6f44412d --- /dev/null +++ b/docs/nl/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF naar tekst +description: Haal platte tekst uit PDF-bestanden. Ondersteunt het in één keer extraheren van meerdere PDF's, met TXT-bestanden als uitvoer. +--- + +# PDF naar tekst + +Haalt alle tekstinhoud uit PDF-bestanden en slaat die op als gewone `.txt`-bestanden. Ondersteunt gebundelde verwerking: upload meerdere PDF's en haal de tekst van elk in één bewerking eruit. Gebruikt PyMuPDF. + +## Hoe het werkt + +1. Upload een of meer PDF's door op het neerzetgebied te klikken of bestanden erheen te slepen. Beheer je bestandslijst met de knoppen Meer toevoegen en Wissen. +2. Klik op **Extraheren** om de verwerking te starten. +3. Een enkel bestand wordt gedownload als `filename.txt`. Meerdere bestanden geven een `pdf-to-text.zip`-archief. + +## Opties + +Deze tool heeft geen instelbare opties. Alle tekstinhoud van elke pagina wordt in leesvolgorde geëxtraheerd. + +## Uitvoerformaat + +- **Eén bestand**: `filename.txt` +- **Meerdere bestanden**: `pdf-to-text.zip` met één `.txt` per invoer-PDF. + +## Toepassingen + +- Lopende tekst uit PDF-rapporten halen voor volledige tekstindexering. +- PDF-e-books of artikelen omzetten naar platte tekst om te lezen op e-inkapparaten. +- Tekst uit contracten of juridische documenten halen voor trefwoordanalyse. +- Opmaak uit PDF's verwijderen om schone tekst te krijgen voor gegevensverwerkingsscripts. +- Een tekstcorpus samenstellen uit PDF-archieven voor natuurlijke taalverwerking. + +## Tips + +- Gescande PDF's (alleen afbeeldingen) geven lege tekstbestanden omdat er geen tekstlaag is om te extraheren. Haal gescande documenten eerst door OCR. +- De uitvoer behoudt de leesvolgorde zoals PyMuPDF die interpreteert, wat over het algemeen van links naar rechts en van boven naar beneden loopt. Indelingen met meerdere kolommen kunnen door elkaar lopende tekst geven. +- Probeer voor gestructureerde uitvoer met koppen en opmaak [PDF naar Markdown](./pdf-to-markdown). Gebruik voor AI-klare gestructureerde JSON [PDF voorbereiden voor AI](./prepare-pdf-for-ai). + +## Gerelateerde tools + +- [PDF naar Markdown](./pdf-to-markdown) +- [PDF voorbereiden voor AI](./prepare-pdf-for-ai) +- [PDF naar Word](./pdf-to-word) diff --git a/docs/nl/tools/pdf-to-tiff.md b/docs/nl/tools/pdf-to-tiff.md new file mode 100644 index 00000000..03ebb36c --- /dev/null +++ b/docs/nl/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF naar TIFF +description: Zet PDF-pagina's om naar TIFF-afbeeldingen, veel gebruikt in drukwerk-, fax- en archiefprocessen. Valt terug op PNG als het coderen mislukt. +--- + +# PDF naar TIFF + +Zet elke pagina van een PDF om in een TIFF-afbeelding. TIFF is het standaardformaat voor drukwerkproductie, faxsystemen en documentarchivering. De tool gebruikt PackBits-compressie voor TIFF-codering en valt terug op PNG als het coderen van een pagina mislukt. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Klik op **Converteren** om het bestand te verwerken. +3. Een enkel TIFF-bestand of een ZIP-archief wordt automatisch gedownload. + +## Opties + +Deze tool heeft geen instelbare opties. Pagina's worden met een vaste schaal van 2x weergegeven. + +## Uitvoerformaat + +- **Eén pagina**: `filename.tiff` +- **Meerdere pagina's**: `filename_tiffs.zip` met `page_1.tiff`, `page_2.tiff`, enz. + +Als het TIFF-coderen van een bepaalde pagina mislukt (door compressieproblemen), wordt die pagina in plaats daarvan als `.png`-bestand opgeslagen. De ZIP bevat dan een mix van TIFF- en PNG-bestanden. + +## Toepassingen + +- Documenten indienen bij overheidsinstanties of juridische systemen die het TIFF-formaat vereisen. +- Pagina's voorbereiden voor faxverzending via digitale faxdiensten. +- Gescande documenten archiveren in een breed ondersteund verliesvrij formaat. +- Pagina's aanleveren aan documentbeheersystemen voor bedrijven. + +## Tips + +- TIFF-bestanden zijn groot. Als je alleen verliesvrije kwaliteit nodig hebt voor web of scherm, is [PDF naar PNG](./pdf-to-png) een betere keuze. +- Controleer de inhoud van de ZIP als sommige pagina's de PNG-terugval nodig hadden: misschien wil je die apart converteren. + +## Gerelateerde tools + +- [PDF naar PNG](./pdf-to-png) +- [PDF naar BMP](./pdf-to-bmp) +- [PDF naar JPG](./pdf-to-jpg) diff --git a/docs/nl/tools/pdf-to-webp.md b/docs/nl/tools/pdf-to-webp.md new file mode 100644 index 00000000..a01b764a --- /dev/null +++ b/docs/nl/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF naar WebP +description: Zet PDF-pagina's om naar WebP-afbeeldingen met instelbare kwaliteit. Kleinere bestanden dan JPG bij vergelijkbare beeldkwaliteit. +--- + +# PDF naar WebP + +Zet elke pagina van een PDF om in een WebP-afbeelding. WebP geeft bij dezelfde waargenomen kwaliteit doorgaans 25-35% kleinere bestanden dan JPG, wat het een sterke keuze maakt voor gebruik op het web. + +## Hoe het werkt + +1. Upload een PDF door op het neerzetgebied te klikken of een bestand erheen te slepen. +2. Pas de schuifregelaar **Kwaliteit** aan. +3. Klik op **Converteren** om het bestand te verwerken. +4. Een enkel `.webp`-bestand of een ZIP-archief wordt automatisch gedownload. + +## Opties + +- **Kwaliteit**: een schuifregelaar van 0% tot 100% (standaard 85%). Bepaalt het niveau van verlieslatende compressie. Hogere waarden behouden meer detail. + +Pagina's worden intern op schaal 2x weergegeven, wat afbeeldingen oplevert met ongeveer dubbele afmetingen van de oorspronkelijke PDF. + +## Uitvoerformaat + +- **Eén pagina**: `filename.webp` +- **Meerdere pagina's**: `filename_webps.zip` met `page_1.webp`, `page_2.webp`, enz. + +## Toepassingen + +- Paginavoorbeelden voorbereiden voor websites waar bandbreedte telt. +- Lichte afbeeldingsversies van flyers of brochures maken voor sociale media. +- Documenten met meerdere pagina's in één keer omzetten naar een voor het web geoptimaliseerde set afbeeldingen. + +## Tips + +- WebP wordt ondersteund in alle moderne browsers. Gebruik voor compatibiliteit met oudere systemen [PDF naar JPG](./pdf-to-jpg) als terugvaloptie. +- Een kwaliteit van 80-85% is op het scherm meestal niet van het origineel te onderscheiden en houdt de bestanden toch klein. + +## Gerelateerde tools + +- [PDF naar JPG](./pdf-to-jpg) +- [PDF naar PNG](./pdf-to-png) +- [PDF naar BMP](./pdf-to-bmp) diff --git a/docs/nl/tools/pdf-to-word.md b/docs/nl/tools/pdf-to-word.md new file mode 100644 index 00000000..8e3ce2b8 --- /dev/null +++ b/docs/nl/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF naar Word +description: Zet PDF-bestanden om naar bewerkbare Word-documenten (DOCX). Ondersteunt het in één keer converteren van meerdere PDF's. +--- + +# PDF naar Word + +Zet PDF-bestanden om naar bewerkbare Word-documenten (`.docx`). De tool gebruikt PyMuPDF om de inhoud van het document te reconstrueren, met behoud van tekst, basisopmaak en indeling. Ondersteunt enkele en gebundelde conversie. + +## Hoe het werkt + +1. Upload een of meer PDF's door op het neerzetgebied te klikken of bestanden erheen te slepen. Je kunt meer bestanden toevoegen of afzonderlijke bestanden uit de lijst verwijderen. +2. Klik op **Converteren** om de verwerking te starten. +3. Een enkel bestand wordt gedownload als `filename.docx`. Meerdere bestanden worden gebundeld in `converted-documents.zip`. + +## Opties + +Deze tool heeft geen instelbare opties. Elke PDF wordt naar DOCX omgezet met de ingebouwde conversie-engine van PyMuPDF. + +## Uitvoerformaat + +- **Eén bestand**: `filename.docx` +- **Meerdere bestanden**: `converted-documents.zip` met één `.docx` per invoer-PDF. + +## Toepassingen + +- Tekst bewerken in een ontvangen PDF die je moet aanpassen. +- Gearchiveerde PDF-rapporten omzetten naar een formaat dat collega's kunnen bewerken in Microsoft Word of Google Docs. +- Inhoud uit PDF-contracten of voorstellen naar Word halen om wijzigingen bij te houden. +- Oude PDF-documentatie migreren naar een bewerkbaar formaat. + +## Tips + +- Complexe indelingen met tekst in meerdere kolommen, ingebedde formulieren of veel afbeeldingen worden mogelijk niet perfect omgezet. Controleer de uitvoer en pas de opmaak aan in je tekstverwerker. +- Gescande PDF's (alleen afbeeldingen) geven lege of minimale DOCX-bestanden. Haal ze eerst door OCR om een tekstlaag toe te voegen. +- De bundelmodus is efficiënt om hele mappen met PDF's te converteren: upload ze allemaal tegelijk. + +## Gerelateerde tools + +- [PDF naar tekst](./pdf-to-text) +- [PDF naar Markdown](./pdf-to-markdown) +- [PDF-workflowbouwer](./pdf-workflow) diff --git a/docs/nl/tools/pdf-to-zip.md b/docs/nl/tools/pdf-to-zip.md new file mode 100644 index 00000000..33092195 --- /dev/null +++ b/docs/nl/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF's naar ZIP +description: Verpak meerdere PDF-bestanden in één ZIP-archief om ze gemakkelijk te delen en op te slaan. +--- + +# PDF's naar ZIP + +Bundel meerdere PDF-bestanden in één ZIP-archief. Dit is een eenvoudige verpakkingstool: de PDF's zelf worden niet geconverteerd, gecomprimeerd of gewijzigd. + +## Hoe het werkt + +1. Upload meerdere PDF-bestanden via het neerzetgebied. +2. Bekijk de lijst met bestanden. Verwijder de bestanden die je er niet in wilt hebben. +3. Klik op de verwerkknop. +4. Een ZIP-archief met alle geüploade PDF's wordt direct gedownload. + +## Functies + +- Accepteert een willekeurig aantal PDF-bestanden +- Bestanden per stuk verwijderen voordat het archief wordt gemaakt +- Behoudt de oorspronkelijke bestandsnamen in de ZIP +- Geen wijziging van de PDF-inhoud: bestanden worden ongewijzigd verpakt +- Toont de bestandsnaam en grootte van elke geüploade PDF + +## Toepassingen + +- Een reeks facturen of bonnetjes bundelen als e-mailbijlage +- Projectopleveringen (meerdere PDF-rapporten) verpakken voor overdracht +- Eén download maken voor een verzameling formulieren of sjablonen +- Een reeks documenten archiveren in één gecomprimeerd bestand + +## Tips + +- De ZIP gebruikt de oorspronkelijke PDF-bestandsnamen. Als je bestanden met dezelfde naam hebt, hernoem ze dan vóór het uploaden om conflicten te voorkomen. +- Deze tool comprimeert de PDF's zelf niet. Om de bestandsgrootte te verkleinen, haal je ze eerst door PDF Comprimeren en verpak je ze daarna met deze tool. + +## Gerelateerde tools + +- [PDF samenvoegen](./merge-pdf) +- [PDF splitsen](./split-pdf) +- [PDF comprimeren](./compress-pdf) diff --git a/docs/nl/tools/pdf-workflow.md b/docs/nl/tools/pdf-workflow.md new file mode 100644 index 00000000..6fc91098 --- /dev/null +++ b/docs/nl/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF-workflowbouwer +description: Bouw visueel eigen PDF-verwerkingsketens door knooppunten op een canvas te verbinden. Koppel bewerkingen als samenvoegen, comprimeren, watermerk en exporteren. +--- + +# PDF-workflowbouwer + +Met de workflowbouwer koppel je meerdere PDF-bewerkingen aan elkaar tot één geautomatiseerde keten. In plaats van tools een voor een uit te voeren, verbind je een visuele graaf van knooppunten (invoer, verwerking, uitvoer) en voer je alles uit met één klik. Je bestanden verlaten de browser nooit. + +## Hoe het werkt + +De interface bestaat uit drie panelen: een **knooppuntenwerkset** links, het **canvas** in het midden en een **instellingenpaneel** rechts dat verschijnt wanneer je een knooppunt selecteert. + +1. **Voeg knooppunten toe** door ze in de linkerzijbalk aan te klikken, of sleep ze rechtstreeks op het canvas. Gebruik de zoekbalk bovenaan de werkset om op naam te filteren. +2. **Verbind knooppunten** door te slepen van een uitvoeraansluiting (onderkant van een knooppunt) naar een invoeraansluiting (bovenkant van een ander knooppunt). Verbindingen lopen van boven naar beneden. +3. **Configureer instellingen** door op een knooppunt te klikken om het instellingenpaneel rechts te openen. Elk type knooppunt heeft eigen opties (paginabereiken, kwaliteitsschuifregelaars, wachtwoorden, enz.). +4. **Voer het werkproces uit** door in de werkbalk op de knop **Uitvoeren** te klikken. De engine voert de knooppunten uit in topologische volgorde en verwerkt ze een voor een. Een statusbalk onderaan toont de voortgang. +5. **Download de resultaten**: het afsluitende knooppunt Downloaden slaat de uiteindelijke PDF op (of een ZIP als er meerdere bestanden ontstaan). + +## Categorieën knooppunten + +Knooppunten zijn ingedeeld in zes categorieën, elk met een eigen kleur op het canvas: + +- **Invoer** (blauw): PDF-invoer, afbeeldingsinvoer, Word/Excel/PowerPoint naar PDF en meer dan 15 andere formaatconverters die bestanden in de keten brengen. +- **Bewerken & Annoteren** (indigo): Bijsnijden, Grijswaarden, Kleuren Omkeren, Watermerk, Paginanummers, Koptekst & Voettekst, Scannereffect, Kleuren Aanpassen, Achtergrondkleur, Blanco pagina's Verwijderen, Annotaties Verwijderen. +- **Organiseren & Beheren** (violet): Samenvoegen, Splitsen, Pagina's Extraheren, Roteren, Pagina's Verwijderen, Omkeren, Blanco pagina Toevoegen, Pagina's Opdelen, N+, Paginagrootte Fiksen, Combineren tot Enkele pagina, Boekje, PDF-Poster, Metadata Bewerken, Inhoudsopgave, OCR. +- **Optimaliseren & Repareren** (amber): Comprimeren, Rasteren, Lineariseren, Rechttrekken, PDF naar PDF/A, Lettertype naar Contour, Repareren. +- **PDF Beveiligen** (rozerood): Versleutelen, Ontgrendelen, Opschonen, Platmaken, Digitale handtekening, Redigeren. +- **Uitvoer** (blauwgroen): Downloaden (herkent automatisch een enkele PDF of ZIP), PDF naar afbeeldingen, PDF naar Text, PDF naar DOCX, PDF naar XLSX, PDF naar CSV, PDF naar SVG, PDF naar Markdown, Afbeeldingen extraheren. + +## Werkprocessen opslaan en laden + +De werkbalk biedt vier opties voor bewaren: + +- **Opslaan**: slaat het huidige werkproces op als benoemd sjabloon in de lokale opslag van je browser. Je kunt meerdere sjablonen opslaan. +- **Laden**: opent een venster met alle opgeslagen sjablonen. Klik op Laden om er een te herstellen, of verwijder sjablonen die je niet meer nodig hebt. +- **Exporteren**: downloadt het werkproces als `.json`-bestand zodat je het kunt delen of er een back-up van kunt maken. +- **Importeren**: laadt een `.json`-werkprocesbestand van schijf en herstelt alle knooppunten, posities en verbindingen. + +Sjablonen blijven tussen sessies bewaard in de lokale opslag. Geëxporteerde JSON-bestanden zijn overdraagbaar tussen browsers en machines. + +## Uitvoeringsmodel + +De engine bouwt een afhankelijkheidsgraaf op uit je verbindingen en voert knooppunten uit in topologische volgorde. Als een knooppunt faalt, stopt de uitvoering en wordt het falende knooppunt rood gemarkeerd. Enkele regels om te onthouden: + +- Elk werkproces heeft minstens één **Invoer**-knooppunt en één **Uitvoer**-knooppunt nodig. +- De engine detecteert circulaire afhankelijkheden en blokkeert de uitvoering met een foutmelding. +- Het knooppunt **Versleutelen** moet de laatste verwerkingsstap vóór het uitvoerknooppunt zijn. Eerder plaatsen geeft een validatiewaarschuwing, omdat volgende knooppunten niet met versleutelde gegevens kunnen werken. +- Met een wachtwoord beveiligde PDF's vragen tijdens de uitvoering om een wachtwoord. +- Invoer met meerdere PDF's wordt ondersteund: het knooppunt Samenvoegen kan ze combineren, of knooppunten voor gebundelde verwerking verwerken elke PDF afzonderlijk. + +## Typen aansluitingen + +Verbindingen gebruiken getypeerde aansluitingen om ongeldige koppelingen te voorkomen: + +- **PDF** (indigo): één PDF-document. +- **MultiPDF** (amber): meerdere gebundelde PDF-documenten. +- **Afbeelding** (groen): een afbeeldingsblob. + +## Opties + +Elk knooppunt heeft een eigen configuratie die je opent via het instellingenpaneel rechts. Veelvoorkomende patronen zijn: + +- **Paginabereiken** bij de knooppunten Splitsen, Pagina's Extraheren en Pagina's Verwijderen +- **Kwaliteitsschuifregelaars** bij uitvoerknooppunten voor afbeeldingsconversie +- **Wachtwoordvelden** bij de knooppunten Versleutelen en Ontgrendelen +- **Tekstinvoer** voor Watermerk, Koptekst & Voettekst en Metadata Bewerken +- **Rotatiehoeken** bij het knooppunt Roteren +- **Compressieniveau** bij het knooppunt Comprimeren +- **Keuze van OCR-taal** bij het knooppunt OCR + +## Toepassingen + +- **Keten voor factuurverwerking**: PDF-invoer -> OCR -> PDF-tabellen Extraheren -> Downloaden als CSV. +- **Standaardisatie van rapporten**: Word naar PDF -> Paginagrootte Fiksen -> Paginanummers toevoegen -> Watermerk -> Comprimeren -> Downloaden. +- **Voorbereiding voor archivering**: PDF-invoer -> Repareren -> Platmaken -> Opschonen -> PDF naar PDF/A -> Downloaden. +- **Afbeeldingen in bulk extraheren**: PDF-invoer (meerdere bestanden) -> Afbeeldingen extraheren -> ZIP downloaden. +- **Afdrukklare boekjes**: PDF-invoer -> Boekje -> Bijsnijden -> Comprimeren -> Downloaden. +- **Beveiligde verspreiding**: PDF-invoer -> Redigeren -> Annotaties Verwijderen -> Versleutelen -> Downloaden. + +## Tips + +- Gebruik **Delete** of **Backspace** om het geselecteerde knooppunt van het canvas te verwijderen. +- Klik op de knop **X** in de statusbalk van een knooppunt om het rechtstreeks te verwijderen. +- Verschuif het canvas door op lege ruimte te klikken en te slepen. De cursor verandert tijdens het verschuiven in een grijppictogram. +- Gebruik op mobiel de knop **+** in de werkbalk om de knooppuntenwerkset te tonen of te verbergen. +- Als je werkproces meerdere uitvoerbestanden oplevert, bundelt het knooppunt Downloaden ze automatisch in een ZIP. +- Begin eenvoudig: bouw en test een keten van twee knooppunten voordat je complexiteit toevoegt. + +## Gerelateerde tools + +- [PDF naar tekst](./pdf-to-text) +- [PDF naar Excel](./pdf-to-excel) +- [Afbeeldingen extraheren](./extract-images) +- [PDF naar Markdown](./pdf-to-markdown) diff --git a/docs/nl/tools/png-to-pdf.md b/docs/nl/tools/png-to-pdf.md new file mode 100644 index 00000000..3fc960af --- /dev/null +++ b/docs/nl/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG naar PDF +description: Zet een of meer PNG-afbeeldingen om naar een PDF-document met instelbare kwaliteit, volledig in je browser. +--- + +# PNG naar PDF + +Zet PNG-afbeeldingen om naar PDF met behoud van hun volledige resolutie. Elke PNG wordt een eigen pagina, afgestemd op de afmetingen van de oorspronkelijke afbeelding. Transparantie wordt automatisch afgehandeld. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------- | +| PNG | `.png` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep PNG-bestanden erheen. Je kunt er meerdere tegelijk selecteren. +2. Beheer de bestandslijst: verwijder ongewenste bestanden of voeg er meer toe. +3. Kies een niveau voor **PDF-kwaliteit** in de keuzelijst. +4. Klik op **Converteren naar PDF**. De uitvoer wordt gedownload als `from_jpgs.pdf`. + +De tool gebruikt pdf-lib om elke afbeelding rechtstreeks in te sluiten. Als een PNG niet native kan worden ingesloten (bijv. door een ongebruikelijk kleurprofiel), valt de tool terug op opnieuw weergeven via een canvas als JPEG. + +## Opties + +**PDF-kwaliteit** bepaalt de compressie die vóór het insluiten wordt toegepast: + +- **Hoge kwaliteit**: minimale compressie, grootste bestand. +- **Gemiddelde kwaliteit** (standaard): goede balans tussen grootte en helderheid. +- **Lage kwaliteit**: maximale compressie, kleinste uitvoer. + +## Toepassingen + +- Schermafbeeldingen omzetten naar een PDF met meerdere pagina's voor bugrapporten of documentatie +- UI-ontwerpexports verpakken in één bestand ter beoordeling +- Diagramexports (draw.io, Excalidraw) omzetten naar een deelbare PDF +- Een reeks grafiekafbeeldingen samenvoegen tot een rapport + +## Tips + +- PNG-bestanden met transparantie krijgen een witte achtergrond in de PDF. Als je een andere achtergrond nodig hebt, bewerk de afbeeldingen dan vooraf. +- Bij schermafbeeldingen en diagrammen met scherpe randen en tekst voorkomt Hoge kwaliteit JPEG-compressieartefacten. Gemiddeld of Laag kan intern naar JPEG omzetten. + +## Gerelateerde tools + +- [Afbeelding naar PDF](./image-to-pdf) +- [JPG naar PDF](./jpg-to-pdf) +- [SVG naar PDF](./svg-to-pdf) diff --git a/docs/nl/tools/posterize-pdf.md b/docs/nl/tools/posterize-pdf.md new file mode 100644 index 00000000..ec7122df --- /dev/null +++ b/docs/nl/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF-poster +description: Splits PDF-pagina's op in een raster van kleinere pagina's voor grootformaat afdrukken over meerdere vellen. +--- + +# PDF-poster + +Verdeel elke pagina van een PDF in een raster van kleinere deelpagina's. Hiermee druk je één pagina af over meerdere vellen papier, die je aan elkaar legt tot een grote poster of banner. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Stel het aantal **rijen** en **kolommen** in om het raster te bepalen (bijvoorbeeld 2 rijen x 2 kolommen splitst elke pagina in 4 deelpagina's). +3. Geef optioneel een paginabereik op om te beperken welke pagina's worden opgedeeld. +4. Het voorbeeld toont een rasteroverlay op de huidige pagina, zodat je de sneden kunt zien. +5. Blader door de pagina's om de overlay op andere pagina's te controleren. +6. Klik op de verwerkknop. Elke rastercel wordt een eigen pagina in de uitvoer-PDF. + +## Functies + +- Instelbaar aantal rijen en kolommen voor flexibele rastergroottes +- Live voorbeeld met rasteroverlay die precies laat zien waar pagina's worden verdeeld +- Paginabereikfilter om alleen specifieke pagina's op te delen +- Pagina voor pagina bladeren in het voorbeeld +- Gecachete paginamomentopnamen voor snel bladeren +- Gestippelde rode rasterlijnen markeren duidelijk de snijgrenzen + +## Opties + +| Optie | Beschrijving | +| ---------------- | ------------------------------------------------------ | +| **Rijen** | Aantal horizontale verdelingen (standaard: 1) | +| **Kolommen** | Aantal verticale verdelingen (standaard: 1) | +| **Paginabereik** | Welke pagina's worden opgedeeld (leeg = alle pagina's) | + +## Toepassingen + +- Een PDF op postergrootte afdrukken over standaard A4- of Letter-vellen om aan een muur te monteren +- Grote banners maken van een ontwerp van één pagina +- Te grote technische tekeningen opsplitsen in afdrukbare delen +- Grootformaat afdrukken zonder toegang tot een breedformaatprinter + +## Tips + +- Een raster van 2x2 maakt van één pagina 4 pagina's. Een raster van 3x3 maakt er 9. Kies het raster op basis van hoe groot het samengestelde eindresultaat moet worden. +- Met de voorbeeldoverlay controleer je of belangrijke inhoud niet op een snijlijn valt. Pas indien nodig rijen en kolommen aan. +- Voor de omgekeerde bewerking (meerdere pagina's op één vel plaatsen) gebruik je [N-up PDF](./n-up-pdf). + +## Gerelateerde tools + +- [N-up PDF](./n-up-pdf) +- [Pagina's opdelen](./divide-pages) +- [PDF splitsen](./split-pdf) diff --git a/docs/nl/tools/powerpoint-to-pdf.md b/docs/nl/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..314db2b4 --- /dev/null +++ b/docs/nl/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint naar PDF +description: Zet PowerPoint-presentaties (PPT, PPTX) en ODP-bestanden om naar PDF met behoud van de opmaak van de dia's. +--- + +# PowerPoint naar PDF + +Zet presentatiebestanden om naar PDF. Elke dia wordt een pagina in het uitvoerdocument, met tekst, afbeeldingen, vormen en overgangen weergegeven via een LibreOffice-engine in de browser. Ondersteunt zowel moderne als oudere PowerPoint-formaten, plus het OpenDocument Presentation-formaat. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------------------------ | :-------- | +| PowerPoint (modern) | `.pptx` | +| PowerPoint (ouder) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je presentatiebestanden erheen. +2. Bekijk de bestandslijst. Voeg meer bestanden toe of verwijder ze naar wens. +3. Klik op **Converteren naar PDF**. De LibreOffice-engine wordt bij het eerste gebruik geladen en converteert daarna elk bestand. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden worden samengevoegd in `powerpoint-converted.zip`. + +## Opties + +Deze tool heeft geen extra instellingen. Dia's worden weergegeven op hun oorspronkelijke afmetingen. + +## Uitvoer + +| Aantal bestanden | Uitvoer | +| :--------------- | :------------------------------------------------------------------ | +| 1 bestand | Eén PDF-download (oorspronkelijke bestandsnaam met extensie `.pdf`) | +| 2+ bestanden | ZIP-archief (`powerpoint-converted.zip`) met één PDF per bestand | + +## Toepassingen + +- Een presentatie naar PDF omzetten voordat je die deelt met een publiek dat mogelijk geen PowerPoint heeft +- Een afdrukbare handout van een diaserie maken voor een congres of workshop +- Presentaties archiveren in een formaat dat op elk apparaat identiek wordt weergegeven +- Een bibliotheek ODP-presentaties van LibreOffice Impress in bulk naar PDF converteren +- Een PDF-versie van een pitchdeck maken als e-mailbijlage + +## Tips + +- Diaanimaties en overgangen worden niet in de PDF weergegeven. Elke dia wordt vastgelegd als statische pagina. +- Ingesloten video's verschijnen niet in de uitvoer. Vervang ze indien nodig door een schermafbeelding of tijdelijke afbeelding. +- Spreekopmerkingen worden niet meegenomen in de standaard PDF-export. Heb je ze nodig, exporteer dan eerst vanuit de eigen weergave "Notities afdrukken" van PowerPoint. +- De LibreOffice-engine wordt na het eerste laden gecachet, dus een tweede presentatie in dezelfde sessie wordt veel sneller geconverteerd. + +## Gerelateerde tools + +- [Word naar PDF](./word-to-pdf) +- [Excel naar PDF](./excel-to-pdf) +- [Afbeelding naar PDF](./image-to-pdf) diff --git a/docs/nl/tools/prepare-pdf-for-ai.md b/docs/nl/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..6736ea24 --- /dev/null +++ b/docs/nl/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: PDF voorbereiden voor AI +description: Haal PDF-inhoud op als gestructureerde JSON, geoptimaliseerd voor LLM's en AI-pijplijnen zoals LlamaIndex. Ondersteunt batchverwerking. +--- + +# PDF voorbereiden voor AI + +Haalt inhoud uit PDF-bestanden en structureert die als JSON, geoptimaliseerd voor invoer in grote taalmodellen (LLM's) en AI-frameworks zoals LlamaIndex. De inhoud van elke pagina wordt opgehaald en georganiseerd in een gestructureerd formaat, klaar voor RAG-pijplijnen, chatbots of semantische zoeksystemen. + +## Hoe het werkt + +1. Upload een of meer PDF's door op het sleepgebied te klikken of bestanden erheen te slepen. +2. Klik op **Extraheren** om de verwerking te starten. +3. Eén bestand wordt gedownload als `filename_llm.json`. Meerdere bestanden leveren een `pdf-for-ai.zip`-archief op. + +De tool gebruikt de LlamaIndex-integratie van PyMuPDF om inhoud per pagina met metadata op te halen. De uitvoer kan direct in AI-frameworks worden geladen. + +## Opties + +Deze tool heeft geen instelbare opties. Alle pagina's worden opgehaald met volledige tekst en metadata. + +## Uitvoerformaat + +- **Eén bestand**: `filename_llm.json` +- **Meerdere bestanden**: `pdf-for-ai.zip` met één `_llm.json` per invoer-PDF. + +De JSON-uitvoer volgt het LlamaIndex-documentschema met tekstinhoud per pagina en metadatavelden. + +## Toepassingen + +- PDF-documenten voorbereiden voor retrieval-augmented generation (RAG)-pijplijnen. +- Een doorzoekbare kennisbank opbouwen uit PDF-archieven voor een AI-chatbot. +- PDF-rapporten invoeren in op LLM's gebaseerde analyseprocessen. +- Onderzoeksartikelen voorverwerken voor semantisch zoeken en vraag-en-antwoordsystemen. +- Gestructureerde trainingsdata maken uit verzamelingen PDF-documenten. + +## Tips + +- Voor platte tekstextractie zonder AI-specifieke opmaak gebruik je [PDF naar tekst](./pdf-to-text). +- Voor Markdown-uitvoer die koppen en structuur behoudt gebruik je [PDF naar Markdown](./pdf-to-markdown). +- Gescande PDF's leveren lege of minimale uitvoer op. Voer ze eerst door OCR om een tekstlaag toe te voegen voordat je ze extraheert. + +## Gerelateerde tools + +- [PDF naar tekst](./pdf-to-text) +- [PDF naar Markdown](./pdf-to-markdown) +- [PDF naar JSON](./pdf-to-json) diff --git a/docs/nl/tools/protect-pdf.md b/docs/nl/tools/protect-pdf.md new file mode 100644 index 00000000..cb1cc68b --- /dev/null +++ b/docs/nl/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: PDF beveiligen +description: Beveilig PDF-bestanden met een wachtwoord en 256-bit AES-versleuteling. Stel gebruikers- en eigenaarswachtwoorden in met instelbare gebruiksbeperkingen. +--- + +# PDF beveiligen + +Vergrendel je PDF met een wachtwoord, zodat alleen bevoegde personen het bestand kunnen openen. BentoPDF gebruikt 256-bit AES-versleuteling (dezelfde standaard als banken en overheidsinstanties), volledig in je browser toegepast via QPDF. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Voer een **gebruikerswachtwoord** in (verplicht). Dit wachtwoord hebben mensen nodig om het bestand te openen. +3. Voer optioneel een **eigenaarswachtwoord** in. Als dit is ingesteld, krijgt de PDF gebruiksbeperkingen die afdrukken, bewerken, kopiëren en annoteren voorkomen. +4. Klik op **PDF versleutelen**. +5. Download het versleutelde bestand. + +## Wachtwoordtypen + +### Gebruikerswachtwoord (verplicht) + +Het gebruikerswachtwoord typen ontvangers om de PDF te openen. Zonder dit wachtwoord is het document volledig ontoegankelijk. Elke versleutelde PDF moet er een hebben. + +### Eigenaarswachtwoord (optioneel) + +Het eigenaarswachtwoord bepaalt wat een bevoegde gebruiker kan doen nadat het bestand is geopend. Als je een afwijkend eigenaarswachtwoord instelt, past BentoPDF automatisch de strengste set beperkingen toe: + +- Wijzigen uitgeschakeld +- Extraheren/kopiëren uitgeschakeld +- Afdrukken uitgeschakeld +- Annoteren uitgeschakeld +- Formulieren invullen uitgeschakeld +- Documentsamenstelling uitgeschakeld + +Als je het eigenaarswachtwoord leeg laat, wordt de PDF wel versleuteld (het gebruikerswachtwoord is nog steeds nodig om te openen), maar zijn er geen gebruiksbeperkingen na het openen. + +## Versleutelingsdetails + +- **Algoritme**: AES-256 (256-bit Advanced Encryption Standard) +- **Sleutellengte**: 256 bits +- **Standaard**: PDF 2.0-versleuteling (QPDF-implementatie) + +AES-256 is met de huidige technologie rekenkundig onhaalbaar te kraken met brute kracht. De beveiliging van je versleutelde PDF hangt volledig af van de sterkte van je wachtwoord. + +## Toepassingen + +- Vertrouwelijke financiële rapporten beschermen voordat je ze e-mailt +- Juridische documenten beveiligen die met de wederpartij worden gedeeld +- Een wachtwoord toevoegen aan medische dossiers of persoonsgegevens +- Betaalde content (e-books, rapporten) verspreiden met toegangscontrole +- Voldoen aan gegevensbeschermingsbeleid dat versleuteling van opgeslagen gegevens vereist + +## Tips + +- Gebruik een sterk, uniek wachtwoord. Een wachtzin van 12+ tekens met hoofdletters, kleine letters, cijfers en symbolen is ideaal. +- Deel het wachtwoord via een apart kanaal (telefoon, sms), nooit in dezelfde e-mail als de PDF. +- Als je alleen acties wilt beperken (niet afdrukken, niet kopiëren) zonder dat een wachtwoord nodig is om te openen, gebruik dan de tool Rechten Aanpassen. + +## Gerelateerde tools + +- [PDF ontgrendelen](./unlock-pdf): verwijder de versleuteling als je het wachtwoord kent +- [Rechten aanpassen](./change-permissions): wijzig specifieke gebruiksbeperkingen +- [Beperkingen verwijderen](./remove-restrictions): haal alle beveiliging uit een PDF +- [PDF opschonen](./sanitize-pdf): verwijder verborgen inhoud voordat je versleutelt diff --git a/docs/nl/tools/psd-to-pdf.md b/docs/nl/tools/psd-to-pdf.md new file mode 100644 index 00000000..15a9d658 --- /dev/null +++ b/docs/nl/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD naar PDF +description: Zet Photoshop-bestanden (PSD) om naar PDF in je browser. Gratis, privé, geen Adobe-software nodig. +--- + +# PSD naar PDF + +Zet Adobe Photoshop PSD-bestanden om naar PDF-documenten. PSD is het eigen formaat van Photoshop en om het te openen is normaal gesproken dure Adobe-software nodig. Deze tool geeft de samengevoegde afbeelding van je PSD-bestand weer als PDF-pagina op volledige resolutie. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :-------------- | :------- | :------------------------------------- | +| Adobe Photoshop | `.psd` | Geeft de samengevoegde afbeelding weer | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je PSD-bestanden erheen. Meerdere bestanden worden ondersteund. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram of gebruik **Meer bestanden toevoegen** om er meer toe te voegen. +3. Klik op **Converteren naar PDF**. De PyMuPDF-engine leest het PSD-bestand en sluit de samengevoegde afbeelding op de oorspronkelijke resolutie in een PDF-pagina in. +4. Eén PSD levert één PDF op. Als je meerdere PSD-bestanden uploadt, worden ze gecombineerd tot één PDF met meerdere pagina's met de naam `psd_to_pdf.pdf`, waarbij elke PSD één pagina wordt. + +## Opties + +Er zijn geen instellingen nodig. De converter gebruikt de samengevoegde afbeeldingsgegevens uit het PSD-bestand. + +## Toepassingen + +- Photoshop-ontwerpen bekijken zonder Photoshop te openen +- Ontwerpproeven sturen naar klanten zonder Adobe Creative Suite +- Artwork met hoge resolutie afdrukken vanuit PSD-bestanden +- Een PDF-portfolio maken van meerdere PSD-ontwerpbestanden, waarbij elk een pagina in één document wordt + +## Tips + +- De conversie geeft de samengevoegde weergave van de PSD weer. Afzonderlijke lagen, aanpassingslagen en laageffecten blijven niet als aparte elementen in de PDF behouden. +- Meerdere PSD-bestanden worden samengevoegd tot één PDF met meerdere pagina's in plaats van afzonderlijke PDF's. Dat is handig voor portfolio's of lookbooks. +- PSD-bestanden met zeer hoge resolutie (printbestanden van 300+ DPI) leveren grote PDF's op. De tool behoudt de volledige resolutie. + +## Gerelateerde tools + +- [Afbeelding naar PDF](./image-to-pdf) +- [PNG naar PDF](./png-to-pdf) +- [VSD naar PDF](./vsd-to-pdf) diff --git a/docs/nl/tools/pub-to-pdf.md b/docs/nl/tools/pub-to-pdf.md new file mode 100644 index 00000000..cce3e0f3 --- /dev/null +++ b/docs/nl/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB naar PDF +description: Zet Microsoft Publisher-bestanden (PUB) om naar PDF in je browser. Gratis, privé, geen software nodig. +--- + +# PUB naar PDF + +Zet Microsoft Publisher-bestanden om naar PDF. Publisher is een desktoppublishingprogramma dat bij sommige edities van Microsoft Office zit, maar de meeste mensen hebben het niet geïnstalleerd. Met deze tool kan iedereen PUB-bestanden direct in de browser naar PDF converteren, zonder Microsoft-software. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------------------ | :------- | :--------------------------- | +| Microsoft Publisher | `.pub` | Desktoppublishing-documenten | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je PUB-bestanden erheen. Je kunt meerdere bestanden tegelijk uploaden. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram of klik op **Meer bestanden toevoegen** om er meer toe te voegen. +3. Klik op **Converteren naar PDF**. Een op LibreOffice gebaseerde engine wordt in de browser geladen en converteert elk PUB-bestand, met behoud van lay-out, afbeeldingen en tekstvakken. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden worden geleverd in een ZIP-archief met de naam `pub-to-pdf.zip`. + +## Opties + +Er is geen extra configuratie nodig. De converter regelt de PUB-lay-outengine automatisch. + +## Toepassingen + +- Een PUB-flyer of nieuwsbrief van een klant openen zonder Microsoft Publisher te kopen +- Kerkbulletins, evenementprogramma's of schoolnieuwsbrieven omzetten die in Publisher zijn gemaakt +- Marketingmateriaal uit Publisher archiveren in een universeel toegankelijk formaat +- PUB-bestanden afdrukken op een systeem zonder Publisher + +## Tips + +- Complexe Publisher-lay-outs met gelaagde tekstvakken en nauwkeurige positionering kunnen tijdens de conversie licht verschuiven. Controleer de uitvoer als exacte positionering belangrijk is. +- De LibreOffice-engine wordt eenmaal per sessie geïnitialiseerd. De eerste conversie duurt langer, de volgende zijn sneller. +- Voor de meest getrouwe conversie van Publisher-bestanden moeten eventuele aangepaste lettertypen uit het origineel standaard systeemlettertypen zijn. + +## Gerelateerde tools + +- [VSD naar PDF](./vsd-to-pdf) +- [ODP naar PDF](./odp-to-pdf) diff --git a/docs/nl/tools/rasterize-pdf.md b/docs/nl/tools/rasterize-pdf.md new file mode 100644 index 00000000..26ab7fac --- /dev/null +++ b/docs/nl/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF rasteren +description: Zet PDF-pagina's om naar een afbeeldingsgebaseerde PDF. Voeg alle lagen samen, verwijder selecteerbare tekst en bepaal DPI en afbeeldingsformaat. +--- + +# PDF rasteren + +Rasteren zet elke pagina van een PDF om in een afbeelding en voegt die afbeeldingen weer samen tot een PDF. Het resultaat ziet er identiek uit als het origineel, maar bevat geen selecteerbare tekst, geen interactieve elementen en geen bewerkbare lagen. Het is in feite een fotokopie van hoge kwaliteit. + +## Hoe het werkt + +1. Upload een of meer PDF-bestanden. +2. Stel de **DPI** (resolutie) in voor de gerasterde uitvoer. +3. Kies een **afbeeldingsformaat**: PNG voor verliesvrije kwaliteit of JPEG voor kleinere bestanden. +4. Vink optioneel **Converteren naar grijswaarden** aan. +5. Klik op **PDF rasteren**. Meerdere bestanden worden als ZIP gedownload. + +## Opties + +| Instelling | Waarden | Standaard | +| ---------------------- | --------------------------------- | --------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Afbeeldingsformaat** | PNG (verliesvrij), JPEG (kleiner) | PNG | +| **Grijswaarden** | Aan/Uit | Uit | + +## DPI-richtlijnen + +- **72**: alleen voor weergave op het scherm, kleinste bestandsgrootte +- **150**: goede balans voor algemeen gebruik +- **200**: scherpere tekst, gemiddelde bestandsgrootte +- **300**: uitvoer van afdrukkwaliteit +- **600**: hoogwaardige archivering of professioneel afdrukken + +## Toepassingen + +- Tekstextractie voorkomen bij vertrouwelijke documenten voordat je ze deelt +- Problemen met ontbrekende lettertypen voorkomen door tekst om te zetten in pixels +- Een "platte" versie maken van een PDF met complexe lagen of transparantie die in verschillende viewers anders wordt weergegeven +- Een PDF voorbereiden voor een systeem dat alleen afbeeldingsinvoer accepteert +- Verborgen inhoud (zoals bijgehouden wijzigingen of formuliergegevens) verwijderen door de PDF tot pure afbeeldingen terug te brengen + +## Tips + +- 150 DPI met PNG is een solide standaard. Ga alleen hoger als je afdrukuitvoer nodig hebt of moet inzoomen op fijne details. +- JPEG levert merkbaar kleinere bestanden op, maar geeft compressieartefacten op scherpe tekstranden. +- Rasteren is onomkeerbaar: bewaar je originele PDF als je later bewerkbare tekst nodig kunt hebben. + +## Gerelateerde tools + +- [PDF comprimeren](./compress-pdf): verklein de bestandsgrootte van de gerasterde PDF +- [PDF rechttrekken](./deskew-pdf): trek pagina's recht voordat je gescande documenten rastert +- [Lettertype naar contouren](./font-to-outline): zet lettertypen om in vectorpaden als je schaalbaarheid wilt behouden +- [PDF platmaken](./flatten-pdf): maak formulieren plat zonder ze naar afbeeldingen om te zetten diff --git a/docs/nl/tools/remove-annotations.md b/docs/nl/tools/remove-annotations.md new file mode 100644 index 00000000..4e79765c --- /dev/null +++ b/docs/nl/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Annotaties verwijderen +description: Verwijder met één klik alle opmerkingen, markeringen, links en andere annotaties uit je PDF. +--- + +# Annotaties verwijderen + +Maak je PDF schoon door alle annotaties te verwijderen: opmerkingen, markeringen, plaknotities, tekstopmaak, links, stempels en alle andere annotatieobjecten in het document. De onderliggende pagina-inhoud (tekst, afbeeldingen, graphics) blijft ongewijzigd. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. De tool detecteert het aantal pagina's van het document en toont bestandsinformatie. +3. Klik op **Annotaties verwijderen** om te verwerken. +4. De opgeschoonde PDF wordt automatisch gedownload, zonder annotaties. + +## Functies + +- Verwijdert alle annotatietypen: opmerkingen, markeringen, onderstrepingen, doorhalingen, plaknotities, stempels, links en formulieropmaak +- Werkt op elke pagina in het document +- Behoudt alle inhoud die geen annotatie is (tekst, afbeeldingen, vectorgraphics, formuliervelden) +- Toont het aantal pagina's en de bestandsgrootte voor de verwerking + +## Toepassingen + +- Een document opschonen voor de definitieve verspreiding na een beoordelingsronde waarin meerdere reviewers opmerkingen hebben toegevoegd +- Markeringen en plaknotities verwijderen uit een gedeelde studiegids +- Linkannotaties verwijderen uit een document voordat je het archiveert +- Een "schone" versie maken van een juridisch document dat tijdens onderhandelingen veel annotaties kreeg +- Opmerkingen van reviewers verwijderen uit een manuscript voordat het naar de drukker gaat + +## Tips + +- Deze tool verwijdert annotaties op het niveau van de PDF-structuur, dus het resultaat behoudt selecteerbare tekst en de oorspronkelijke kwaliteit. Er komt geen rasteren aan te pas. +- Als je alleen specifieke annotaties wilt verwijderen in plaats van alle, gebruik dan de [PDF bewerken](./edit-pdf) om afzonderlijke annotaties gericht te verwijderen. +- Annotaties in platgemaakte PDF's (waarin annotaties zijn samengevoegd met de pagina-inhoud) kunnen niet worden verwijderd, omdat het geen aparte objecten meer zijn. + +## Gerelateerde tools + +- [PDF bewerken](./edit-pdf) +- [Watermerk toevoegen](./add-watermark) +- [PDF ondertekenen](./sign-pdf) diff --git a/docs/nl/tools/remove-blank-pages.md b/docs/nl/tools/remove-blank-pages.md new file mode 100644 index 00000000..4f2e0a80 --- /dev/null +++ b/docs/nl/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Blanco pagina's verwijderen +description: Detecteer en verwijder automatisch blanco of bijna blanco pagina's uit je PDF met instelbare gevoeligheid. +--- + +# Blanco pagina's verwijderen + +Scan je PDF op blanco of bijna blanco pagina's en verwijder ze automatisch. De tool rendert elke pagina en analyseert de pixelinhoud om te bepalen of die blanco is. Daarna bevestig je welke pagina's worden verwijderd voordat de verwerking start. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. Pas de schuifregelaar **Gevoeligheid** aan om te bepalen hoe strikt "blanco" wordt gedefinieerd. +3. Klik op **Blanco pagina's detecteren** om het document te scannen. +4. De tool toont miniaturen van gedetecteerde blanco pagina's, zodat je ze kunt controleren. +5. Bevestig de selectie en download de opgeschoonde PDF zonder blanco pagina's. + +## Opties + +- **Gevoeligheid**: een schuifregelaar van 0% tot 100% (standaard 80%). Hogere waarden zijn strenger en markeren alleen pagina's die volledig of bijna wit zijn. Lagere waarden zijn toleranter en vangen ook pagina's met minimale inhoud, zoals één stipje of een vaag watermerk. + +## Functies + +- Analyse op pixelniveau van elke pagina om blanco inhoud te detecteren +- Instelbare gevoeligheid voor fijnafstemming van de detectie +- Miniatuurvoorbeeld van gedetecteerde blanco pagina's voor handmatige controle +- Behoudt alle niet-blanco pagina's precies zoals ze zijn +- Verwerkt documenten van elke grootte of elk aantal pagina's +- Voortgangsinformatie tijdens het scannen + +## Toepassingen + +- Gescande documenten opschonen waarbij de scanner lege achterkanten van enkelzijdige originelen heeft vastgelegd +- Scheidingspagina's verwijderen uit in bulk gescande documentbatches +- Blanco pagina's verwijderen die door documentbeheersystemen zijn toegevoegd +- PDF's opschonen die uit tekstverwerkers zijn geëxporteerd en soms blanco pagina's aan het einde bevatten +- De bestandsgrootte verkleinen door onnodige lege pagina's te verwijderen + +## Tips + +- Begin met de standaardgevoeligheid van 80% en pas die daarna aan. Als de tool pagina's mist die er voor jou blanco uitzien, verlaag dan de gevoeligheid. Als hij pagina's markeert met lichte inhoud die je wilt houden, verhoog je die. +- De tool rendert elke pagina om de inhoud te analyseren, dus de verwerkingstijd schaalt met het aantal pagina's. Bij zeer grote documenten kun je een korte wachttijd verwachten. +- Controleer de gedetecteerde blanco pagina's in het miniatuurvoorbeeld voordat je de verwijdering bevestigt. Pagina's met vage kopteksten, voetteksten of watermerken kunnen worden gemarkeerd, afhankelijk van de gevoeligheid. + +## Gerelateerde tools + +- [PDF bijsnijden](./crop-pdf) +- [PDF bewerken](./edit-pdf) +- [Paginanummers](./page-numbers) diff --git a/docs/nl/tools/remove-metadata.md b/docs/nl/tools/remove-metadata.md new file mode 100644 index 00000000..ebbdfa03 --- /dev/null +++ b/docs/nl/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Metadata verwijderen +description: Verwijder alle verborgen metadata uit PDF-bestanden, waaronder auteur, titel, aanmaakdatum, producent, XMP-gegevens en document-ID's. +--- + +# Metadata verwijderen + +Elke PDF bevat metadata die kan onthullen wie het bestand heeft gemaakt, welke software is gebruikt, wanneer het voor het laatst is gewijzigd en meer. Deze tool verwijdert dat alles: het infowoordenboek, XMP-metadatastreams, document-ID's en toepassingsspecifieke gegevens. Het resultaat is een schoon document zonder spoor van de herkomst. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Klik op **Metadata verwijderen**. +3. Download het opgeschoonde bestand. + +Er zijn geen opties om in te stellen. De tool is bewust grondig: hij wist alles. + +## Wat wordt verwijderd + +- **Velden van het infowoordenboek**: titel, auteur, onderwerp, trefwoorden, maker, producent, aanmaakdatum, wijzigingsdatum +- **XMP-metadatastream**: het op XML gebaseerde metadatablok in de documentcatalogus +- **Document-ID's**: unieke identificatiecodes in de PDF-trailer waarmee een document tussen systemen kan worden gevolgd +- **PieceInfo**: toepassingsspecifieke metadata die door programma's als Illustrator of InDesign wordt toegevoegd + +## Wat blijft + +- Alle zichtbare pagina-inhoud (tekst, afbeeldingen, graphics) +- Formuliervelden en annotaties +- Bladwijzers en links +- De documentstructuur zelf + +## Toepassingen + +- Je naam en organisatie uit een document verwijderen voordat je het anoniem publiceert +- Aanmaaktijdstempels verwijderen die verraden wanneer een document is opgesteld +- Producentstrings opschonen die je PDF-softwarestack verraden +- Documenten voorbereiden voor officiële indieningen die PDF's zonder metadata vereisen +- Sporen van de bewerkingsgeschiedenis verwijderen voordat je een document extern deelt + +## Tips + +- Gebruik eerst de tool Metadata Weergeven om precies te zien welke metadata je PDF bevat voordat je die verwijdert. +- Als je naast metadata ook JavaScript, annotaties en ingesloten bestanden wilt verwijderen, gebruik dan PDF Opschonen voor een grondigere schoonmaak. +- Het verwijderen van metadata is permanent. Bewaar je origineel als je die gegevens later nog nodig kunt hebben. + +## Gerelateerde tools + +- [PDF opschonen](./sanitize-pdf): verwijder metadata plus scripts, bijlagen en meer +- [PDF versleutelen](./protect-pdf): beveilig de opgeschoonde PDF met een wachtwoord +- [PDF comprimeren](./compress-pdf): het verwijderen van metadata kan het bestand iets verkleinen, comprimeer voor meer besparing diff --git a/docs/nl/tools/remove-restrictions.md b/docs/nl/tools/remove-restrictions.md new file mode 100644 index 00000000..452f8f82 --- /dev/null +++ b/docs/nl/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Beperkingen verwijderen +description: Verwijder wachtwoordbeveiliging, afdrukbeperkingen, bewerkingsvergrendelingen en kopieerbeperkingen uit PDF-bestanden. +--- + +# Beperkingen verwijderen + +PDF's kunnen twee soorten wachtwoorden hebben: een gebruikerswachtwoord (nodig om het bestand te openen) en een eigenaarswachtwoord (bepaalt wat je ermee mag doen). Deze tool verwijdert beide, samen met alle bijbehorende beperkingen: afdrukken, bewerken, kopiëren en annotatievergrendelingen. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Als de PDF een eigenaarswachtwoord heeft, voer je dat in bij het veld **Eigenaarswachtwoord**. Laat het leeg als de PDF alleen gebruiksbeperkingen zonder wachtwoord heeft. +3. Klik op **Beperkingen verwijderen**. +4. Download de PDF zonder beperkingen. + +De tool gebruikt de vlaggen `--decrypt` en `--remove-restrictions` van QPDF om een schone kopie zonder beperkingen te maken. + +## Wat wordt verwijderd + +- Wachtwoordbeveiliging (zowel gebruikers- als eigenaarswachtwoorden) +- Afdrukbeperkingen +- Bewerkingsbeperkingen +- Beperkingen op het kopiëren van tekst en afbeeldingen +- Beperkingen op annotaties en opmerkingen +- Alle andere beveiligingsbeperkingen die in de PDF zijn vastgelegd + +## Toepassingen + +- Een PDF ontgrendelen die van jou is, maar waarvan je het wachtwoord jaren geleden hebt ingesteld +- Afdrukbeperkingen verwijderen uit een document waartoe je legitiem toegang hebt +- Kopiëren en plakken mogelijk maken in naslagmateriaal om aantekeningen te maken +- PDF's voorbereiden voor toegankelijkheidstools die geen beperkte documenten aankunnen + +## Tips + +- Je moet het eigenaarswachtwoord kennen als er een is ingesteld. Deze tool kraakt of brute-forcet geen wachtwoorden. +- Als je het bestand versleuteld wilt houden maar specifieke rechten wilt wijzigen, gebruik dan de tool Rechten Aanpassen. +- Het uitvoerbestand heeft geen enkele versleuteling: iedereen die het ontvangt kan het vrij openen. + +## Gerelateerde tools + +- [PDF ontgrendelen](./unlock-pdf): ontgrendel een PDF als je het gebruikerswachtwoord kent +- [PDF versleutelen](./protect-pdf): pas de versleuteling opnieuw toe met nieuwe instellingen +- [Rechten aanpassen](./change-permissions): wijzig selectief welke acties zijn toegestaan diff --git a/docs/nl/tools/repair-pdf.md b/docs/nl/tools/repair-pdf.md new file mode 100644 index 00000000..5ba0c2db --- /dev/null +++ b/docs/nl/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: PDF repareren +description: Herstel gegevens uit corrupte of beschadigde PDF-bestanden met de reparatie-engine van QPDF. Ondersteunt batchverwerking. +--- + +# PDF repareren + +Als een PDF niet opent, onleesbare inhoud toont of fouten veroorzaakt in je viewer, probeert deze tool de interne structuur opnieuw op te bouwen. Hij gebruikt de reparatie-engine van QPDF, die gegevens kan herstellen bij veel soorten corruptie: kapotte kruisverwijzingstabellen, afgekapte streams, ongeldige objectverwijzingen en meer. + +## Hoe het werkt + +1. Upload een of meer beschadigde PDF-bestanden. +2. Klik op **PDF repareren**. +3. Eén gerepareerd bestand wordt direct gedownload. Meerdere bestanden leveren een ZIP-archief op. + +De tool voert elk bestand door QPDF met de vlag `--decrypt`, waardoor QPDF de volledige PDF-structuur leest en herschrijft en herstelbare problemen onderweg oplost. + +## Functies + +- Batchreparatie van meerdere PDF's in één bewerking +- Automatische detectie van herstelbare en onherstelbare bestanden +- Succes- en foutmelding per bestand bij verwerking van meerdere bestanden +- Gebruikt QPDF (WebAssembly), een beproefde bibliotheek voor PDF-transformaties + +## Wat het kan oplossen + +- Kapotte of ontbrekende kruisverwijzingstabellen +- Afgekapte bestandseinden door onvolledige downloads +- Ongeldige objectnummering en streamlengtes +- Kleine structurele inconsistenties door foutieve PDF-generatoren +- Versleutelingsartefacten van mislukte pogingen tot ontsleuteling + +## Wat het niet kan oplossen + +- Ernstig afgekapte bestanden waarin het grootste deel van de inhoud ontbreekt +- PDF's die zijn versleuteld met een wachtwoord dat je niet hebt +- Bestanden die eigenlijk geen PDF zijn (verkeerde bestandsextensie) +- Afbeeldingscorruptie in de PDF (de structuur wordt hersteld, maar pixelgegevens worden niet opnieuw gegenereerd) + +## Toepassingen + +- Een PDF herstellen na een mislukte e-maildownload +- Bestanden openen die door oudere of niet-standaard PDF-generatoren zijn gemaakt +- PDF's repareren die in de ene viewer werken maar in de andere niet +- Beschadigde archiefdocumenten voorbereiden voor langdurige opslag + +## Tips + +- Als de reparatie mislukt, probeer het bestand dan eerst in een browser te openen. Browsers hebben eigen herstellogica en kunnen genoeg inhoud weergeven om opnieuw op te slaan. +- Als een versleutelde PDF de reparatie niet doorstaat, probeer dan eerst PDF ontgrendelen en repareer daarna de ontgrendelde uitvoer. + +## Gerelateerde tools + +- [PDF comprimeren](./compress-pdf): maak de structuur van de gerepareerde PDF verder schoon +- [PDF lineariseren](./linearize-pdf): optimaliseer het gerepareerde bestand voor weblevering +- [PDF platmaken](./flatten-pdf): maak formulieren plat die mogelijk beschadigd zijn diff --git a/docs/nl/tools/reverse-pages.md b/docs/nl/tools/reverse-pages.md new file mode 100644 index 00000000..cb6451f4 --- /dev/null +++ b/docs/nl/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Paginavolgorde omkeren +description: Keer de paginavolgorde van een of meer PDF-bestanden om, zodat de laatste pagina de eerste wordt. +--- + +# Paginavolgorde omkeren + +Keer de paginavolgorde van een PDF om, zodat de laatste pagina de eerste wordt, de voorlaatste de tweede, enzovoort. Ondersteunt batchverwerking van meerdere bestanden tegelijk. + +## Hoe het werkt + +1. Upload een of meer PDF-bestanden. +2. Klik op de verwerkknop. +3. Elk bestand wordt afzonderlijk omgekeerd. Als je meerdere bestanden hebt geüpload, is de uitvoer een ZIP-archief met alle omgekeerde PDF's. +4. Eén bestand wordt direct gedownload als omgekeerde PDF. + +## Functies + +- Batchverwerking: keer meerdere PDF's om in één bewerking +- Eén uitvoerbestand voor één PDF, ZIP-uitvoer voor meerdere +- Verwijderknoppen per bestand voor de verwerking +- Behoudt alle pagina-inhoud en opmaak + +## Toepassingen + +- Een document corrigeren dat in omgekeerde volgorde is gescand +- Een presentatie-PDF voorbereiden om van achteren naar voren te lezen +- De paginavolgorde omkeren voor afdrukprocessen waarbij pagina's omgekeerd worden ingevoerd +- Een document herstellen waarvan de pagina's per ongeluk achterstevoren zijn samengesteld + +## Tips + +- Elk bestand in een batch wordt afzonderlijk omgekeerd: de bestanden zelf worden niet ten opzichte van elkaar herschikt. +- Voor gedetailleerdere herordening van pagina's (niet alleen volledig omkeren) gebruik je [Dupliceren en organiseren](./organize-pdf). + +## Gerelateerde tools + +- [Dupliceren en organiseren](./organize-pdf) +- [PDF roteren](./rotate-pdf) +- [PDF-multitool](./pdf-multi-tool) diff --git a/docs/nl/tools/rotate-custom.md b/docs/nl/tools/rotate-custom.md new file mode 100644 index 00000000..ab5a92be --- /dev/null +++ b/docs/nl/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Roteren met aangepaste hoek +description: Roteer PDF-pagina's met elke hoek, met gradeninvoer per pagina en batchrotatiebesturing. +--- + +# Roteren met aangepaste hoek + +Roteer PDF-pagina's met een willekeurige hoek, niet alleen in stappen van 90 graden. Elke pagina heeft een eigen hoekinvoer, en met de batchbesturing pas je in één keer dezelfde hoek toe op alle pagina's. + +## Hoe het werkt + +1. Upload een PDF-bestand. Van elke pagina worden miniaturen weergegeven. +2. Elke pagina heeft een numeriek invoerveld met de huidige rotatiehoek. +3. Typ een willekeurige gradenwaarde (positief of negatief) om een specifieke pagina te roteren, of gebruik de links/rechts-knoppen per pagina voor snelle aanpassingen van 90 graden. +4. Gebruik de invoer **batchhoek** bovenaan om één uniforme rotatie voor alle pagina's in te stellen. +5. Klik op de verwerkknop om de geroteerde PDF te genereren. + +## Functies + +- Vrije gradeninvoer per pagina (elke geheel getal) +- Batchhoekbesturing om dezelfde rotatie op elke pagina in te stellen +- Realtime voorbeeld van de rotatie in miniaturen +- Snelknoppen per pagina voor stappen van 90 graden +- Miniaturen worden pas geladen wanneer nodig, voor goede prestaties bij grote documenten + +## Toepassingen + +- Enigszins scheve scans met een paar graden corrigeren +- Pagina's roteren om aan een niet-standaard oriëntatievereiste te voldoen +- Nauwkeurige rotaties toepassen op afzonderlijke pagina's in een document met gemengde inhoud +- Paginahoeken verfijnen na een eerste bulkrotatie + +## Tips + +- Positieve waarden roteren met de klok mee, negatieve waarden tegen de klok in. +- Het veld voor de batchhoek overschrijft alle hoeken per pagina wanneer het wordt toegepast. Stel afzonderlijke aanpassingen in na de batchbewerking als dat nodig is. +- Voor standaardrotaties van 90/180/270 graden met een eenvoudigere interface gebruik je [PDF roteren](./rotate-pdf). + +## Gerelateerde tools + +- [PDF roteren](./rotate-pdf) +- [PDF-multitool](./pdf-multi-tool) +- [Dupliceren en organiseren](./organize-pdf) diff --git a/docs/nl/tools/rotate-pdf.md b/docs/nl/tools/rotate-pdf.md new file mode 100644 index 00000000..b534bfc9 --- /dev/null +++ b/docs/nl/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: PDF roteren +description: Roteer afzonderlijke pagina's of alle pagina's in een PDF in stappen van 90 graden met een visuele miniatuurinterface. +--- + +# PDF roteren + +Roteer pagina's in een PDF 90 graden met de klok mee of ertegenin. De tool toont miniatuurvoorbeelden van elke pagina, zodat je ze afzonderlijk kunt roteren of een bulkrotatie op het hele document kunt toepassen. + +## Hoe het werkt + +1. Upload een PDF-bestand. Miniaturen van elke pagina worden in een raster weergegeven. +2. Gebruik de links/rechts-rotatieknoppen onder elke paginaminiatuur om die specifieke pagina te roteren. +3. Gebruik de bulkrotatiebesturing bovenaan om alle pagina's tegelijk te roteren. +4. Het miniatuurvoorbeeld wordt in realtime bijgewerkt om de rotatie te tonen. +5. Klik op de verwerkknop om de geroteerde PDF op te slaan. + +## Functies + +- Rotatie per pagina in stappen van 90 graden (links of rechts) +- Bulkrotatie voor alle pagina's tegelijk +- Realtime miniatuurvoorbeeld met geanimeerde rotatieovergangen +- Miniaturen worden pas geladen wanneer nodig, voor vlotte prestaties bij grote documenten +- Behoudt de oorspronkelijke pagina-inhoud en kwaliteit + +## Toepassingen + +- Zijwaarts of ondersteboven gescande pagina's corrigeren +- Liggende pagina's naar staande oriëntatie roteren (of andersom) +- Een document met gemengde oriëntatie corrigeren waarin sommige pagina's onder de verkeerde hoek zijn gescand +- Een document voorbereiden voor een specifieke weergaveoriëntatie + +## Tips + +- Rotaties zijn cumulatief. Twee keer op de knop met de klok mee klikken geeft een rotatie van 180 graden. +- Voor rotaties die geen veelvoud van 90 graden zijn (bijvoorbeeld 45 graden om een licht scheve scan te corrigeren) gebruik je [Roteren met aangepaste hoek](./rotate-custom). +- De bulkrotatiebesturing werkt op alle pagina's, niet alleen op geselecteerde. Deze tool heeft geen selectiemechanisme. Gebruik daarvoor de [PDF-multitool](./pdf-multi-tool). + +## Gerelateerde tools + +- [Roteren met aangepaste hoek](./rotate-custom) +- [PDF-multitool](./pdf-multi-tool) +- [Dupliceren en organiseren](./organize-pdf) diff --git a/docs/nl/tools/rtf-to-pdf.md b/docs/nl/tools/rtf-to-pdf.md new file mode 100644 index 00000000..eefa2093 --- /dev/null +++ b/docs/nl/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF naar PDF +description: Zet Rich Text Format-bestanden (RTF) om naar PDF in je browser met een engine op basis van LibreOffice. +--- + +# RTF naar PDF + +Zet Rich Text Format-documenten om naar PDF. RTF is een platformonafhankelijk documentformaat dat vrijwel elke tekstverwerker ondersteunt. Deze tool gebruikt een LibreOffice-engine in de browser om RTF-bestanden met behoud van opmaak weer te geven: vet, cursief, tabellen en ingesloten afbeeldingen komen allemaal mee in de PDF. + +## Ondersteunde formaten + +| Formaat | Extensies | MIME-types | +| :------ | :-------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep een of meer RTF-bestanden erheen. +2. Bekijk de bestandslijst. Voeg meer bestanden toe of verwijder ze naar wens. +3. Klik op **Converteren naar PDF**. De LibreOffice-engine wordt bij het eerste gebruik geïnitialiseerd en verwerkt daarna elk bestand. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden worden geleverd als `rtf-converted.zip`. + +## Opties + +Deze tool heeft geen extra instellingen. De conversie behoudt de oorspronkelijke RTF-opmaak. + +## Uitvoer + +| Aantal bestanden | Uitvoer | +| :--------------- | :-------------------------------------------------------- | +| 1 bestand | Eén PDF-download (bijvoorbeeld `letter.pdf`) | +| 2+ bestanden | ZIP-archief (`rtf-converted.zip`) met één PDF per bestand | + +## Toepassingen + +- Oude RTF-documenten van oudere tekstverwerkers omzetten naar moderne PDF's +- RTF-e-mailsjablonen omzetten naar PDF-voorbeelden +- RTF-uitvoer van juridische of medische softwaresystemen verwerken +- RTF-bestanden uit een documentbeheersysteem in bulk naar PDF converteren voor archivering + +## Tips + +- De LibreOffice-engine wordt eenmaal geladen en gecachet. De eerste conversie in een sessie duurt een paar seconden langer, de volgende zijn sneller. +- RTF-bestanden met ingesloten OLE-objecten worden mogelijk niet alle perfect weergegeven. Platte tekst, afbeeldingen en standaardopmaak worden betrouwbaar geconverteerd. +- Als je RTF-bestanden met Microsoft Word zijn gemaakt, kun je ze ook direct converteren met de tool [Word naar PDF](./word-to-pdf), die RTF naast DOC en DOCX accepteert. + +## Gerelateerde tools + +- [Word naar PDF](./word-to-pdf) +- [ODT naar PDF](./odt-to-pdf) +- [Tekst naar PDF](./txt-to-pdf) diff --git a/docs/nl/tools/sanitize-pdf.md b/docs/nl/tools/sanitize-pdf.md new file mode 100644 index 00000000..0f9b9bd6 --- /dev/null +++ b/docs/nl/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF opschonen +description: Verwijder verborgen en mogelijk gevaarlijke inhoud uit PDF's, waaronder metadata, JavaScript, ingesloten bestanden, annotaties en lagen. +--- + +# PDF opschonen + +PDF's kunnen veel meer bevatten dan je op het scherm ziet. Verborgen metadata, ingesloten JavaScript, bestandsbijlagen, formuliergegevens en laaginformatie kunnen gevoelige gegevens lekken of beveiligingsrisico's vormen. Opschonen verwijdert dit alles en laat een schoon document over dat veilig openbaar gedeeld kan worden. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. Selecteer in de checklist welke elementen moeten worden verwijderd. +3. Klik op **PDF opschonen**. +4. Download het opgeschoonde bestand. + +## Opschoonopties + +Alle opties staan standaard aan. Haal het vinkje weg bij opties die je wilt behouden. + +| Optie | Wat het verwijdert | +| ------------------------------------ | -------------------------------------------------------------------------------- | +| **Formulieren platmaken** | Zet interactieve formuliervelden om in statische inhoud | +| **Metadata verwijderen** | Verwijdert auteur, titel, aanmaakdatum, software-info en XMP-gegevens | +| **Annotaties verwijderen** | Verwijdert opmerkingen, markeringen, plaknotities en opmaak | +| **JavaScript verwijderen** | Verwijdert ingesloten scripts die bij het openen kunnen worden uitgevoerd | +| **Ingesloten bestanden verwijderen** | Verwijdert bestandsbijlagen die in de PDF zijn ingesloten | +| **Lagen verwijderen (OCG)** | Voegt optionele inhoudsgroepen samen tot één laag | +| **Links verwijderen** | Verwijdert hyperlinks en URL-verwijzingen | +| **Structuurboom verwijderen** | Verwijdert de documentstructuur die voor toegankelijkheidstagging wordt gebruikt | +| **MarkInfo verwijderen** | Verwijdert informatie over gemarkeerde inhoud | +| **Lettertypen verwijderen** | Verwijdert ingesloten lettertypegegevens (met voorzichtigheid gebruiken) | + +## Toepassingen + +- Een PDF voorbereiden voor openbare publicatie door interne metadata (auteursnamen, softwareversies, bewerkingsgeschiedenis) te verwijderen +- JavaScript verwijderen uit een PDF van een onvertrouwde bron voordat je die opent +- Een PDF opschonen voordat je die naar een klant stuurt die geen ingesloten opmerkingen of namen van formuliervelden hoeft te zien +- Verborgen lagen verwijderen uit een architectuurtekening voordat je de definitieve versie deelt +- Voldoen aan eisen voor gegevensminimalisatie volgens privacywetgeving + +## Tips + +- Laat "Lettertypen verwijderen" uitgevinkt, tenzij je zeker weet dat de PDF daarna nog correct wordt weergegeven. Het verwijderen van lettertypen kan tekst in sommige viewers onzichtbaar maken. +- Als je alleen metadata wilt verwijderen, is de speciale tool Metadata Verwijderen sneller en gerichter. +- Opschonen is onomkeerbaar. Bewaar je originele bestand. + +## Gerelateerde tools + +- [Metadata verwijderen](./remove-metadata): verwijder alleen metadata zonder andere inhoud aan te raken +- [PDF platmaken](./flatten-pdf): maak specifiek formulieren en annotaties plat +- [PDF versleutelen](./protect-pdf): voeg wachtwoordbeveiliging toe na het opschonen +- [PDF rasteren](./rasterize-pdf): de nucleaire optie, zet om naar afbeeldingen om alle verborgen inhoud te elimineren diff --git a/docs/nl/tools/scanner-effect.md b/docs/nl/tools/scanner-effect.md new file mode 100644 index 00000000..147ccc75 --- /dev/null +++ b/docs/nl/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Scannereffect +description: Laat je PDF eruitzien als een gescand document met instelbare ruis, rotatie, vervaging en papierveroudering. +--- + +# Scannereffect + +Verander een schone digitale PDF in iets dat eruitziet alsof het uit een flatbedscanner komt. De tool past instelbare ruis, lichte rotatie, vervaging, helderheidsverschuivingen en optionele vergeling toe om de imperfecties van een fysieke scan te simuleren. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. De editor opent met een live voorbeeld van de eerste pagina naast een instellingenpaneel. +3. Pas de parameters van het scaneffect aan met de schuifregelaars en schakelaars. +4. Het voorbeeld wordt in realtime bijgewerkt terwijl je instellingen wijzigt. +5. Klik op **Toepassen** om alle pagina's te verwerken en het resultaat te downloaden. + +## Opties + +- **Kleurruimte (schakelaar voor grijswaarden)**: zet de uitvoer om naar grijswaarden voor een klassieke zwart-witscan. +- **Rand**: voeg een subtiele donkere rand rond de paginarand toe om artefacten van scannerranden na te bootsen. +- **Roteren**: pas een lichte rotatie toe (-5 tot +5 graden) om scheef ingevoerd papier te simuleren. +- **Rotatievariatie**: voeg willekeurige variatie aan de rotatiehoek toe, zodat elke pagina iets anders scheef staat. +- **Helderheid**: verschuif de algehele helderheid omhoog of omlaag. +- **Contrast**: pas het contrast aan om variaties in tonerkwaliteit te simuleren. +- **Vervagen**: pas Gaussiaanse vervaging toe om tekstranden zachter te maken, zoals bij een scan van lage kwaliteit. +- **Ruis**: voeg willekeurige pixelruis toe om korrel van de scannersensor te simuleren. Hogere waarden geven een korreliger resultaat. +- **Vergeeld**: voeg een warme gele tint toe om verouderd of gerecycled papier te simuleren. +- **Resolutie**: stel de DPI van de uitvoer in. Lagere waarden geven een meer gepixeld, scanachtig uiterlijk. +- **Resetten**: zet alle instellingen terug naar de standaardwaarden. + +## Functies + +- Realtime voorbeeld dat wordt bijgewerkt terwijl je elke parameter aanpast +- Willekeurige rotatievariatie per pagina voor realistische afwisseling +- Tien onafhankelijk instelbare parameters +- Grijswaardenmodus voor authentieke zwart-witscanuitvoer +- Resolutiebesturing van faxkwaliteit met lage DPI tot archiefkwaliteit met hoge DPI + +## Toepassingen + +- Digitaal gemaakte documenten eruit laten zien alsof ze zijn gescand en afgedrukt +- Fysieke documentveroudering simuleren voor het nabootsen van historische documenten +- OCR-software testen met verslechterde scankwaliteit +- Documenten maken die aansluiten bij de visuele stijl van bestaande gescande archieven + +## Tips + +- Begin met subtiele waarden. Een ruisniveau van 10-20, een lichte rotatie van 0,5 graad en minimale vervaging geven al een overtuigende scanlook. +- Combineer de grijswaardenmodus met lichte vergeling voor een "kopie van een kopie"-effect. +- Lagere resolutie-instellingen (100-150 DPI) geven het meest realistische uiterlijk van een faxapparaat. + +## Gerelateerde tools + +- [Kleuren omkeren](./invert-colors) +- [Kleuren aanpassen](./adjust-colors) +- [Achtergrondkleur](./background-color) diff --git a/docs/nl/tools/sign-pdf.md b/docs/nl/tools/sign-pdf.md new file mode 100644 index 00000000..572779cb --- /dev/null +++ b/docs/nl/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF ondertekenen +description: Teken, typ of upload een handtekening en plaats die op je PDF-pagina's met een geïntegreerde viewer. +--- + +# PDF ondertekenen + +Voeg je handtekening toe aan elk PDF-document. De tool bevat een volledige PDF-viewer met ingebouwde handtekeningtools waarmee je een handtekening uit de vrije hand kunt tekenen, je naam in een handtekeninglettertype kunt typen of een afbeelding van een handtekening kunt uploaden. Plaats handtekeningen op elke pagina en pas het formaat aan, en sla daarna het ondertekende document op. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. Het document opent in een geïntegreerde PDF-viewer met annotatietools. +3. Gebruik de handtekeningtool van de viewer om je handtekening te maken door te tekenen, te typen of een afbeelding te uploaden. +4. Klik op de pagina waar je de handtekening wilt plaatsen en pas het formaat en de positie aan. +5. Vink optioneel **PDF platmaken** aan om de handtekening permanent in het document in te sluiten. +6. Klik op **Opslaan en ondertekende PDF downloaden** om je ondertekende bestand te krijgen. + +## Opties + +- **PDF platmaken**: als dit is aangevinkt, wordt de handtekening permanent in de pagina-inhoud ingesloten. Dit voorkomt dat anderen de handtekening verplaatsen of verwijderen. Als het niet is aangevinkt, blijft de handtekening een annotatie die in compatibele viewers kan worden bewerkt. + +## Functies + +- Drie manieren om een handtekening te maken: tekenen uit de vrije hand, getypte tekst of geüploade afbeelding +- Geïntegreerde PDF-viewer voor nauwkeurige plaatsing +- Slepen om handtekeningen op elke pagina te positioneren en het formaat aan te passen +- Optioneel platmaken om handtekeningen permanent in te sluiten +- Ondersteuning voor meerdere handtekeningen in hetzelfde document + +## Toepassingen + +- Contracten, overeenkomsten of goedkeuringsformulieren ondertekenen voordat je ze terugstuurt +- Je handtekening toevoegen aan belastingdocumenten, verzekeringsclaims of overheidsformulieren +- Paraafjes plaatsen op afzonderlijke pagina's van een overeenkomst met meerdere pagina's +- NDA's of HR-documenten ondertekenen die als PDF-bijlage binnenkomen + +## Tips + +- Schakel platmaken in als je de ondertekende PDF stuurt naar iemand die je handtekening niet mag kunnen verwijderen of verplaatsen. +- Voor juridisch bindende digitale handtekeningen met verificatie op basis van certificaten biedt BentoPDF ook een aparte tool Digitale handtekening. +- Upload een PNG-afbeelding van je handtekening met een transparante achtergrond voor het schoonste resultaat. + +## Gerelateerde tools + +- [PDF bewerken](./edit-pdf) +- [Stempels toevoegen](./add-stamps) +- [PDF-formulier invullen](./form-filler) diff --git a/docs/nl/tools/split-pdf.md b/docs/nl/tools/split-pdf.md new file mode 100644 index 00000000..62fdd810 --- /dev/null +++ b/docs/nl/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: PDF splitsen +description: Splits een PDF in kleinere bestanden op paginabereik, visuele selectie, bladwijzers, even/oneven pagina's of vaste intervallen. +--- + +# PDF splitsen + +Verdeel een PDF in kleinere documenten met een van de zes splitsmodi. Van eenvoudige paginabereiken tot splitsen op basis van bladwijzers: deze tool dekt elk scenario om een document te verdelen. + +## Hoe het werkt + +1. Upload één PDF-bestand. +2. Kies een splitsmodus in de keuzelijst. +3. Configureer de opties van de modus (paginabereiken, selecties, enzovoort). +4. Klik op de verwerkknop. +5. Het resultaat wordt gedownload als één PDF of als ZIP-archief, afhankelijk van de modus en instellingen. + +## Splitsmodi + +| Modus | Beschrijving | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| **Bereik** | Voer paginabereiken in zoals `1-3, 5, 8-10`. Meerdere bereiken leveren aparte PDF's in een ZIP op. Eén bereik levert één PDF op. | +| **Visuele selectie** | Blader door paginaminiaturen en klik om de gewenste pagina's te selecteren. Geselecteerde pagina's worden geëxtraheerd naar een nieuwe PDF. | +| **Even / Oneven** | Extraheer alleen even of alleen oneven pagina's. | +| **Alle pagina's** | Splits elke pagina in een eigen PDF-bestand, gedownload als ZIP. | +| **Bladwijzers** | Splits op de grenzen van bladwijzers. Kies het bladwijzerniveau om te bepalen waar wordt gesplitst. | +| **Elke N pagina's** | Splits in blokken van N pagina's (bijvoorbeeld elke 5 pagina's). Het laatste blok kan minder pagina's hebben. | + +## Functies + +- Zes verschillende splitsmodi die vrijwel elk gebruiksscenario dekken +- Visuele paginaselectie met miniaturen die pas worden geladen wanneer nodig +- Splitsen op bladwijzers met niveaufiltering +- ZIP-uitvoer als optie voor de modi Bereik en Visuele selectie +- Verwerkt paginabereiken met gemengde syntaxis (`1-3, 5, 8-10`) +- Waarschuwing wanneer splitsen per N pagina's ongelijke blokken oplevert + +## Toepassingen + +- Een specifiek hoofdstuk of onderdeel uit een groot document halen +- Oneven en even pagina's scheiden voor dubbelzijdig afdrukken +- Een boek-PDF op de grenzen van bladwijzers opdelen in afzonderlijke hoofdstukbestanden +- Specifieke pagina's (zoals een handtekeningpagina) uit een contract isoleren +- Een samengesteld rapport splitsen in bestanden per onderdeel voor distributie + +## Tips + +- Meerdere paginabereiken gescheiden door komma's (bijvoorbeeld `1-5, 10-15, 20-25`) leveren aparte PDF's op, één per bereik, gebundeld in een ZIP. +- De modus Bladwijzers vereist dat de PDF daadwerkelijk bladwijzers bevat. Als er geen worden gevonden, krijg je een foutmelding. +- Met het selectievakje "Downloaden als ZIP" in de modi Bereik en Visuele selectie krijg je afzonderlijke PDF's per pagina in plaats van één gecombineerd bestand. + +## Gerelateerde tools + +- [PDF samenvoegen](./merge-pdf) +- [Pagina's extraheren](./extract-pages) +- [Pagina's verwijderen](./delete-pages) +- [PDF-multitool](./pdf-multi-tool) diff --git a/docs/nl/tools/svg-to-pdf.md b/docs/nl/tools/svg-to-pdf.md new file mode 100644 index 00000000..d4c39a50 --- /dev/null +++ b/docs/nl/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG naar PDF +description: Zet SVG-vectorafbeeldingen om naar PDF met kwaliteitsinstelling, volledig in je browser. +--- + +# SVG naar PDF + +Zet Scalable Vector Graphics-bestanden (SVG) om naar PDF. De tool rastert elke SVG via de renderengine van de browser en sluit het resultaat in op de oorspronkelijke resolutie. Handig om vectorpictogrammen, diagrammen en illustraties om te zetten in draagbare documenten. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------- | +| SVG | `.svg` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep een of meer SVG-bestanden erheen. +2. Bekijk en beheer de bestandslijst. +3. Kies een niveau voor **PDF-kwaliteit**. +4. Klik op **Converteren naar PDF**. Het resultaat wordt gedownload als `from_svgs.pdf`. + +Elke SVG wordt als tekst gelezen, op een canvas weergegeven met de eigen breedte en hoogte (standaard 800x600 als er geen afmetingen zijn opgegeven) en geëxporteerd als PNG. Die PNG wordt vervolgens met pdf-lib in de PDF ingesloten. Transparante gebieden worden met een witte achtergrond gevuld. + +## Opties + +**PDF-kwaliteit** bepaalt de compressie na het rasteren: + +- **Hoge kwaliteit**: het dichtst bij de oorspronkelijke weergave. +- **Gemiddelde kwaliteit** (standaard): goede balans. +- **Lage kwaliteit**: kleinste bestand, enig detailverlies. + +## Toepassingen + +- Architectuur- of technische diagrammen van SVG omzetten naar een drukklare PDF +- Pictogramsets bundelen in een naslag-PDF voor een designsysteem +- Datavisualisaties (D3.js, exports van grafiekbibliotheken) omzetten in rapportklare PDF's +- Afdrukbare versies maken van infographics op basis van SVG + +## Tips + +- SVG-bestanden zonder expliciete attributen `width` en `height` worden weergegeven op 800x600 pixels. Stel voor het beste resultaat de afmetingen in de SVG-bron in voordat je converteert. +- Complexe SVG's met verwijzingen naar externe lettertypen of gekoppelde afbeeldingen worden mogelijk niet perfect weergegeven. Sluit alle assets in de SVG zelf in voor betrouwbare uitvoer. +- Omdat de SVG wordt gerasterd, bevat de PDF een bitmapafbeelding in plaats van vectorpaden. Voor echte vector-PDF-uitvoer is een speciale vectortool nodig. + +## Gerelateerde tools + +- [Afbeelding naar PDF](./image-to-pdf) +- [PNG naar PDF](./png-to-pdf) +- [BMP naar PDF](./bmp-to-pdf) diff --git a/docs/nl/tools/table-of-contents.md b/docs/nl/tools/table-of-contents.md new file mode 100644 index 00000000..6505148f --- /dev/null +++ b/docs/nl/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Inhoudsopgave +description: Genereer een opgemaakte inhoudsopgavepagina op basis van de bestaande bladwijzers van je PDF. +--- + +# Inhoudsopgave + +Deze tool leest de bladwijzers (overzichten) in je PDF en genereert een opgemaakte inhoudsopgavepagina die vooraan in het document wordt geplaatst. Als je PDF al bladwijzers heeft maar geen zichtbare inhoudsopgave, maakt deze tool er automatisch een. + +## Hoe het werkt + +1. Upload een PDF met bladwijzers. +2. Pas de titel, de lettergrootte en het lettertype van de inhoudsopgave aan. +3. Vink optioneel **Bladwijzer voor inhoudsopgavepagina toevoegen** aan om de inhoudsopgave zelf in de bladwijzerstructuur op te nemen. +4. Klik op **Inhoudsopgave genereren** om het bestand te verwerken. +5. De bijgewerkte PDF wordt automatisch gedownload, met de inhoudsopgavepagina vooraan ingevoegd. + +## Opties + +- **Titel van inhoudsopgave**: de kop bovenaan de gegenereerde pagina. Standaard "Inhoudsopgave". +- **Lettergrootte**: kies van 10pt tot 72pt. De standaard is 12pt. +- **Lettertype**: kies uit varianten van Times Roman, Helvetica of Courier (normaal, vet, cursief, vet cursief). Standaard Helvetica. +- **Bladwijzer voor inhoudsopgavepagina toevoegen**: als dit is aangevinkt, wordt een bladwijzer voor de inhoudsopgavepagina zelf aan de overzichtsboom van de PDF toegevoegd. + +## Functies + +- Leest de volledige bladwijzerhiërarchie uit de PDF +- Genereert een netjes opgemaakte inhoudsopgavepagina met paginaverwijzingen +- Ondersteunt geneste bladwijzerniveaus met inspringing +- Keuze uit 12 ingebouwde PDF-lettertypen +- Optionele bladwijzer die naar de inhoudsopgavepagina zelf verwijst + +## Toepassingen + +- Een afdrukbare inhoudsopgave toevoegen aan e-books of rapporten die alleen digitale bladwijzers hebben +- Een inhoudsopgave maken voor een samengevoegd document na het combineren van meerdere PDF's +- Een verwijspagina genereren voor lange technische handleidingen +- Documenten voorbereiden voor druk waarbij een zichtbare inhoudsopgave wordt verwacht + +## Tips + +- Als je PDF geen bladwijzers heeft, gebruik dan eerst de tool [Bladwijzers bewerken](./bookmark) om ze te maken en kom daarna hier terug om de inhoudsopgave te genereren. +- Voor grote documenten verbetert een grotere lettergrootte zoals 14pt of 16pt de leesbaarheid. + +## Gerelateerde tools + +- [Bladwijzers bewerken](./bookmark) +- [Paginanummers](./page-numbers) +- [Koptekst en voettekst](./header-footer) diff --git a/docs/nl/tools/text-color.md b/docs/nl/tools/text-color.md new file mode 100644 index 00000000..2ecbb32f --- /dev/null +++ b/docs/nl/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Tekstkleur +description: Wijzig de kleur van alle tekst in je PDF naar een kleur naar keuze. +--- + +# Tekstkleur + +Vervang de kleur van tekst in je hele PDF. De tool herkent tekstgebieden op elke pagina en geeft ze de gekozen kleur, met behoud van de documentlay-out en de inhoud die geen tekst is. + +## Hoe het werkt + +1. Upload je PDF-bestand. +2. Kies een nieuwe tekstkleur met de kleurkiezer. De standaard is blauw (#0000FF). +3. Klik op **Tekstkleur** om te verwerken. +4. De opnieuw ingekleurde PDF wordt automatisch gedownload. Een voortgangsindicator toont welke pagina wordt verwerkt. + +## Opties + +- **Nieuwe tekstkleur**: een kleurkiezer om de vervangende kleur voor alle tekst in het document te selecteren. + +## Functies + +- Kleurt tekst op elke pagina van het document opnieuw +- Verwerking per pagina met voortgangsinformatie +- Kleurkiezer met volledige ondersteuning voor hexkleuren +- Behoudt de paginalay-out en elementen die geen tekst zijn + +## Toepassingen + +- Zwarte tekst wijzigen in donkerblauw voor een zachter, moderner uiterlijk van het document +- Tekst opnieuw inkleuren volgens huisstijlrichtlijnen voordat je documenten verspreidt +- Tekst naar een specifieke kleur omzetten voor naleving van toegankelijkheidseisen +- Tekst zichtbaar maken tegen een nieuw toegepaste achtergrondkleur + +## Tips + +- Deze tool rendert pagina's op 2x schaal voor kwaliteit en bouwt daarna de PDF opnieuw op. De uitvoer is afbeeldingsgebaseerd, dus tekst is niet meer selecteerbaar of doorzoekbaar. +- Voor documenten waarvan je selecteerbare tekst wilt behouden, kun je de PDF beter direct bewerken met de [PDF bewerken](./edit-pdf). +- De verwerkingstijd neemt toe met het aantal pagina's, omdat elke pagina afzonderlijk wordt gerenderd. + +## Gerelateerde tools + +- [Achtergrondkleur](./background-color) +- [Kleuren omkeren](./invert-colors) +- [Kleuren aanpassen](./adjust-colors) diff --git a/docs/nl/tools/tiff-to-pdf.md b/docs/nl/tools/tiff-to-pdf.md new file mode 100644 index 00000000..d6ef9c88 --- /dev/null +++ b/docs/nl/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF naar PDF +description: Zet TIFF-afbeeldingen met een of meer pagina's om naar PDF in je browser, met volledige ondersteuning voor pagina's. +--- + +# TIFF naar PDF + +Zet TIFF-bestanden om naar PDF, ook TIFF's met meerdere pagina's. Elke pagina (of "IFD") in een TIFF-bestand wordt een aparte pagina in de uitvoer-PDF. Dit is vooral handig voor gescande documenten, faxen en medische beelden die vaak als TIFF met meerdere pagina's worden opgeslagen. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je TIFF-bestanden erheen. +2. Bekijk de bestandslijst en beheer die naar wens. +3. Klik op **Converteren naar PDF**. Het resultaat wordt gedownload als `from_tiff.pdf`. + +De tool decodeert elk TIFF-bestand met een JavaScript-TIFF-decoder en haalt de ruwe RGBA-pixelgegevens van elke pagina op. Elke pagina wordt op een canvas weergegeven, als PNG geëxporteerd en in de PDF ingesloten. De paginaafmetingen komen overeen met de oorspronkelijke TIFF-pagina's. + +## Opties + +Deze tool biedt geen extra kwaliteitsinstellingen. Afbeeldingen worden ingesloten op hun oorspronkelijke resolutie. + +## Toepassingen + +- Faxdocumenten met meerdere pagina's (TIFF-F) omzetten naar een draagbaarder PDF-formaat +- Gescande documentarchieven die als TIFF zijn opgeslagen omzetten in doorzoekbare PDF's (combineer daarna met de OCR-tool) +- Medische beeldbestanden verwerken (pathologiepreparaten, radiologie-exports) die TIFF gebruiken +- GIS- of satellietbeelden in TIFF omzetten in deelbare documenten + +## Tips + +- TIFF's met meerdere pagina's worden volledig ondersteund. Een TIFF van 10 pagina's levert een PDF van 10 pagina's op. Je hoeft de TIFF niet eerst te splitsen. +- Zeer grote TIFF-bestanden (honderden megabytes) kunnen langer duren omdat het hele bestand in het browsergeheugen moet worden gedecodeerd. +- Als je OCR op de resulterende PDF nodig hebt, voer je die na de conversie door de tool [PDF OCR](./ocr-pdf). + +## Gerelateerde tools + +- [Afbeelding naar PDF](./image-to-pdf) +- [BMP naar PDF](./bmp-to-pdf) +- [JPG naar PDF](./jpg-to-pdf) diff --git a/docs/nl/tools/txt-to-pdf.md b/docs/nl/tools/txt-to-pdf.md new file mode 100644 index 00000000..1e1a6858 --- /dev/null +++ b/docs/nl/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Tekst naar PDF +description: Zet platte tekstbestanden of getypte tekst om naar PDF met aangepaste lettertypen, kleuren en paginaformaten. +--- + +# Tekst naar PDF + +Zet platte tekst om in een opgemaakte PDF. Je kunt `.txt`-bestanden uploaden of direct typen in de ingebouwde teksteditor. De tool ondersteunt meerdere lettertypen, aangepaste tekstkleuren en een breed scala aan paginaformaten: van A0 tot A10, plus US Letter, Legal en Tabloid. + +## Ondersteunde formaten + +| Invoer | Extensies | +| :-------------------- | :----------------------- | +| Platte tekstbestanden | `.txt` | +| Directe tekstinvoer | Typ of plak in de editor | + +## Hoe het werkt + +1. Kies je invoermodus met de schakelaar bovenaan: **Bestanden uploaden** of **Tekst typen**. +2. Bij uploaden sleep je een of meer `.txt`-bestanden erheen of klik je om ze te selecteren. Bij typen voer je je tekst direct in het tekstvak in. +3. Configureer de opmaakopties: lettertype, lettergrootte, tekstkleur en paginaformaat. +4. Klik op **PDF maken**. De uitvoer wordt gedownload als `text_to_pdf.pdf`. + +Bij het uploaden van meerdere bestanden worden de inhouden aaneengevoegd met lege regels ertussen. + +## Opties + +| Optie | Waarden | Standaard | +| :---------------- | :------------------------------------------------------------------------------------ | :-------------- | +| **Lettertype** | Helvetica (schreefloos), Tiro (met schreef), Courier (monospace), Times (met schreef) | Helvetica | +| **Lettergrootte** | 6 -- 72 pt | 12 | +| **Tekstkleur** | Elke kleur via kleurkiezer | Zwart (#000000) | +| **Paginaformaat** | ISO A0--A10, B0--B10, C0--C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +RTL-talen (Arabisch, Hebreeuws, Perzisch, Urdu) worden automatisch herkend. Als RTL-tekst wordt gevonden, schakelen de tekstrichting en uitlijning dienovereenkomstig om. + +## Toepassingen + +- Codefragmenten of logbestanden omzetten in een afdrukbare PDF met het lettertype Courier +- Snel een PDF maken van ter plekke getypte vergadernotities +- Een manuscript in platte tekst opmaken met een specifiek lettertype en paginaformaat voor inzending +- Een PDF-versie maken van een README of changelog voor offline distributie + +## Tips + +- Gebruik de modus **Tekst typen** als je snel klembordinhoud wilt converteren zonder het eerst als bestand op te slaan. +- Courier (monospace) is de beste keuze voor code, logs of elke inhoud waarbij uitlijning van kolommen telt. +- De paginamarges zijn vast ingesteld op 72 punten (1 inch) aan alle kanten. + +## Gerelateerde tools + +- [Markdown naar PDF](./markdown-to-pdf) +- [CSV naar PDF](./csv-to-pdf) +- [Word naar PDF](./word-to-pdf) diff --git a/docs/nl/tools/unlock-pdf.md b/docs/nl/tools/unlock-pdf.md new file mode 100644 index 00000000..4fb70d59 --- /dev/null +++ b/docs/nl/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF ontgrendelen +description: Verwijder wachtwoordbeveiliging van versleutelde PDF's. Ondersteunt het ontsleutelen van meerdere bestanden met één wachtwoord. +--- + +# PDF ontgrendelen + +Als je het wachtwoord van een versleutelde PDF hebt, verwijdert deze tool de versleuteling volledig. Je krijgt een ontgrendelde kopie die iedereen zonder wachtwoord kan openen. Meerdere PDF's met hetzelfde wachtwoord ontsleutel je in één keer. + +## Hoe het werkt + +1. Upload een of meer versleutelde PDF-bestanden. +2. Voer het **wachtwoord** in waarmee de bestanden zijn beveiligd. +3. Klik op **PDF ontsleutelen**. +4. Een enkel bestand wordt direct gedownload. Bij meerdere bestanden krijg je een ZIP-archief met alle ontgrendelde PDF's. + +## Functies + +- Ontsleutelen van losse bestanden en van reeksen +- Werkt met zowel gebruikerswachtwoorden als eigenaarswachtwoorden +- Levert een volledig onversleutelde uitvoer zonder overgebleven beperkingen +- Duidelijke foutmeldingen bij onjuiste wachtwoorden of beschadigde bestanden +- Succes of mislukking per bestand bij reeksverwerking + +## Verschil met Beperkingen verwijderen + +**PDF ontsleutelen** vereist het wachtwoord en verwijdert alle versleuteling. **Beperkingen verwijderen** richt zich op gebruiksbeperkingen (afdrukken, kopiëren, bewerken) en heeft mogelijk geen wachtwoord nodig als alleen een eigenaarswachtwoord is ingesteld. Gebruik Ontsleutelen als de PDF zonder wachtwoord helemaal niet opent. + +## Toepassingen + +- PDF's die je eerder hebt versleuteld definitief ontgrendelen als het wachtwoord niet meer nodig is +- Versleuteling verwijderen van een reeks gearchiveerde documenten voor eenvoudiger toegang op de lange termijn +- Met een wachtwoord beveiligde PDF's voorbereiden voor een documentbeheersysteem dat geen versleutelde bestanden ondersteunt +- PDF's ontgrendelen voordat je ze samenvoegt met andere documenten (veel samenvoegtools kunnen versleutelde invoer niet verwerken) + +## Tips + +- Het wachtwoordveld geldt voor alle geüploade bestanden. Hebben je PDF's verschillende wachtwoorden, verwerk ze dan in aparte reeksen. +- Krijg je de melding "Onjuist wachtwoord", controleer dan op spaties aan het eind of op Caps Lock. +- Na het ontsleutelen heeft de uitvoer geen enkele beveiliging meer. Versleutel opnieuw met PDF versleutelen als je een nieuw wachtwoord wilt instellen. + +## Gerelateerde tools + +- [PDF versleutelen](./protect-pdf): versleutel opnieuw met een nieuw wachtwoord +- [Beperkingen verwijderen](./remove-restrictions): verwijder gebruiksbeperkingen zonder volledig te ontsleutelen +- [Rechten aanpassen](./change-permissions): wijzig specifieke rechten van een versleutelde PDF diff --git a/docs/nl/tools/validate-signature-pdf.md b/docs/nl/tools/validate-signature-pdf.md new file mode 100644 index 00000000..06e62cd5 --- /dev/null +++ b/docs/nl/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Handtekening valideren +description: Controleer digitale handtekeningen in PDF-bestanden. Controleer de geldigheid van certificaten, de identiteit van de ondertekenaar, de integriteit van het document en de status van de vertrouwensketen. +--- + +# Handtekening valideren + +Upload een ondertekende PDF en deze tool haalt elke digitale handtekening eruit, identificeert de ondertekenaar, controleert de geldigheid van het certificaat en meldt of het document na het ondertekenen is gewijzigd. Je kunt ook een vertrouwd certificaat opgeven om de handtekeningketen te controleren. + +## Hoe het werkt + +1. Upload een ondertekend PDF-bestand. De validatie start automatisch. +2. De tool toont een samenvatting: het aantal gevonden handtekeningen en hoeveel daarvan geldig zijn. +3. Elke handtekening krijgt een gedetailleerde kaart met naam van de ondertekenaar, uitgever, datums en status. +4. Upload optioneel een **vertrouwd certificaat** (.pem, .crt, .cer, .der) om de handtekening te controleren tegen een specifiek vertrouwensanker. De hervalidatie start automatisch. + +## Wat er wordt gecontroleerd + +### Handtekening uitlezen + +De tool haalt PKCS#7-handtekeningobjecten uit de PDF, decodeert de ASN.1-structuur en leest het X.509-certificaat van de ondertekenaar uit, samen met eventuele certificaatketens die in de handtekening zijn ingebed. + +### Geldigheid van het certificaat + +- **Vervaldatum**: valt het certificaat nu binnen de geldigheidsperiode? +- **Zelfondertekend**: is het certificaat zijn eigen uitgever? +- **Vertrouwensketen**: leidt het certificaat van de ondertekenaar, als een vertrouwd certificaat is opgegeven, terug naar dat certificaat? + +### Cryptografische controle + +- De tool reconstrueert de bytes die door de `/ByteRange` van de handtekening worden gedekt, berekent er een hash van met het algoritme dat de ondertekenaar heeft opgegeven en vergelijkt het resultaat met het attribuut `messageDigest` in de handtekening. +- Daarna serialiseert de tool de ondertekende attributen opnieuw als een DER SET en controleert de handtekening met de publieke sleutel van het certificaat van de ondertekenaar. +- **Een handtekening wordt alleen als geldig gemeld als al deze controles slagen.** Als de PDF-bytes na het ondertekenen zijn gewijzigd, of de ingebedde handtekening niet bij de sleutel van de ondertekenaar past, toont de status "Ongeldig: cryptografische controle mislukt" met de specifieke reden. + +#### Ondersteunde handtekeningalgoritmen + +| Algoritme | Controlepad | +| ----------------------- | -------------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, met Web Crypto als terugval | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` na conversie van DER naar IEEE P1363-handtekening | + +Gebruikt een handtekening een algoritme buiten deze lijst (bijvoorbeeld Ed25519, SM2 of RSA met een ongebruikelijke digest-OID), dan toont de kaart in geel **"Niet geverifieerd: niet-ondersteund handtekeningalgoritme"**, samen met de specifieke OID of reden. Dit is een bewust onderscheid in drie statussen: + +- **Geldig**: de handtekening is cryptografisch geverifieerd met de publieke sleutel van de ondertekenaar. +- **Ongeldig**: de controle is uitgevoerd en gaf een negatief resultaat (bytes gewijzigd, sleutel komt niet overeen). +- **Niet geverifieerd**: de tool kon voor dit algoritme geen controle uitvoeren. De certificaatmetadata wordt nog steeds getoond, maar beschouw de handtekening als "onbekend" en controleer hem met Adobe Acrobat of `openssl cms -verify`. + +### Onveilige digest-algoritmen + +- Handtekeningen met **MD5 of SHA-1** worden als ongeldig afgewezen en gemarkeerd met de status "Onveilige digest". Voor beide algoritmen zijn collision-aanvallen gepubliceerd, dus een handtekening over een SHA-1- of MD5-hash biedt geen garantie voor integriteit. +- SHA-224, SHA-256, SHA-384 en SHA-512 worden allemaal geaccepteerd. + +### Dekking van het document + +- **Volledige dekking**: de handtekening dekt het hele PDF-bestand, dus er zijn na het ondertekenen geen bytes toegevoegd of gewijzigd. +- **Gedeeltelijke dekking**: de handtekening dekt slechts een deel van het bestand. Dit kan erop wijzen dat er na het ondertekenen wijzigingen zijn aangebracht (niet per se kwaadwillend, want incrementeel opslaan geeft gedeeltelijke dekking). + +## Handtekeningdetails + +Elke handtekeningkaart toont: + +- **Ondertekend door**: algemene naam, organisatie en e-mailadres uit het certificaat van de ondertekenaar +- **Uitgever**: de certificeringsinstantie die het certificaat van de ondertekenaar heeft uitgegeven +- **Ondertekend op**: het tijdstempel dat in de handtekening is ingebed +- **Geldig vanaf / Geldig tot**: de geldigheidsperiode van het certificaat +- **Reden**: waarom het document is ondertekend (indien opgegeven) +- **Locatie**: waar het is ondertekend (indien opgegeven) +- **Dekkingsstatus**: volledig of gedeeltelijk +- **Vertrouwensbadge**: vertrouwd of niet in de vertrouwensketen (alleen als een eigen certificaat is opgegeven) + +### Technische details + +Klap het gedeelte met technische details uit voor: + +- Serienummer van het certificaat van de ondertekenaar +- Digest-algoritme (SHA-256, SHA-512, enz.) +- Handtekeningalgoritme (RSA met SHA-256, ECDSA met SHA-256, enz.) +- Foutmeldingen voor ongeldige handtekeningen + +## Toepassingen + +- Een digitaal ondertekend contract controleren voordat je mede-ondertekent +- Ondertekende documenten controleren om te bevestigen dat er niet mee is geknoeid +- Nagaan of een certificaat is verlopen sinds het document is ondertekend +- Handtekeningen valideren tegen het basiscertificaat van je organisatie +- De ondertekeningsdetails van overheids- of juridische documenten inspecteren + +## Tips + +- Een zelfondertekend certificaat betekent niet dat de handtekening ongeldig is. Het betekent dat de identiteit van de ondertekenaar niet via een vertrouwde derde partij kan worden geverifieerd. Dit komt vaak voor bij interne documenten. +- Gedeeltelijke dekking wijst niet altijd op knoeien. Veel PDF-workflows voegen incrementele updates toe (zoals een tweede handtekening) die gedeeltelijke dekking veroorzaken. +- Upload het basis- of tussencertificaat van je organisatie als vertrouwd certificaat om de vertrouwensketen te laten controleren. + +## Gerelateerde tools + +- [Digitale handtekening](./digital-sign-pdf): onderteken PDF's met je eigen certificaat +- [PDF platmaken](./flatten-pdf): maak een PDF plat voor het ondertekenen om wijzigingen na de handtekening te voorkomen +- [Metadata verwijderen](./remove-metadata): maak een PDF schoon voordat je een handtekening toevoegt diff --git a/docs/nl/tools/view-metadata.md b/docs/nl/tools/view-metadata.md new file mode 100644 index 00000000..c1d915b6 --- /dev/null +++ b/docs/nl/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Metadata weergeven +description: Bekijk alle metadata-eigenschappen van een PDF, waaronder documentinformatie, XMP-gegevens en structurele details. +--- + +# Metadata weergeven + +Bekijk de verborgen eigenschappen die in een PDF-bestand zijn ingebed. De tool toont documentinformatie (titel, auteur, datums), XMP-metadata, paginaafmetingen en andere structurele gegevens in een leesbaar formaat. + +## Hoe het werkt + +1. Upload een PDF-bestand. +2. De tool leest het bestand direct in en toont alle beschikbare metadata in overzichtelijke secties. +3. Bekijk het documentinfo-woordenboek, de XMP-metadataboom en de structurele eigenschappen. +4. Een verwerkingsstap is niet nodig: de metadata verschijnt zodra het bestand is geladen. + +## Functies + +- Toont de standaardvelden van de documentinformatie: titel, auteur, onderwerp, trefwoorden, maker, producent +- Toont aanmaak- en wijzigingsdatums in een leesbare notatie +- Leest de volledige XMP-metadataboom in en toont die, inclusief geneste naamruimten +- Zet het PDF-datumformaat (`D:20240101120000Z`) om naar leesbare datums +- Ingedeeld in inklapbare secties voor eenvoudige navigatie + +## Metadatasecties + +| Sectie | Inhoud | +| ------------------------- | -------------------------------------------------------------------------------------- | +| **Documentinformatie** | Titel, auteur, onderwerp, trefwoorden, maker, producent, aanmaakdatum, wijzigingsdatum | +| **XMP-metadata** | Volledige XML-metadataboom met Dublin Core-, XAP-, PDF- en eigen naamruimten | +| **Documenteigenschappen** | Aantal pagina's, PDF-versie, bestandsgrootte, versleutelingsstatus | + +## Toepassingen + +- Nagaan wie een PDF heeft gemaakt en wanneer hij voor het laatst is gewijzigd +- Controleren of de metadata goed is ingesteld voordat je een document publiceert +- PDF's controleren op privacy door te kijken welke persoonlijke gegevens erin zijn ingebed +- Onderzoeken welke software een PDF heeft gemaakt of gewijzigd (via het veld Producent) +- XMP-metadata bekijken voor naleving van digitaal assetbeheer + +## Tips + +- PDF-datumstrings die met `D:` beginnen, worden automatisch omgezet naar de notatie van je lokale tijdzone. +- Als metadatavelden leeg lijken, heeft de maker van de PDF ze simpelweg niet ingesteld. Niet alle PDF's bevatten uitgebreide metadata. +- Gebruik [Metadata bewerken](./edit-metadata) om metadata te wijzigen nadat je die hebt bekeken. Gebruik Metadata verwijderen om alles te wissen. + +## Gerelateerde tools + +- [Metadata bewerken](./edit-metadata) +- [PDF OCG-lagen](./pdf-layers) +- [PDF's vergelijken](./compare-pdfs) diff --git a/docs/nl/tools/vsd-to-pdf.md b/docs/nl/tools/vsd-to-pdf.md new file mode 100644 index 00000000..5c6a644d --- /dev/null +++ b/docs/nl/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD naar PDF +description: Zet Microsoft Visio-diagrammen (VSD/VSDX) in je browser om naar PDF. Gratis, privé, geen Visio nodig. +--- + +# VSD naar PDF + +Zet Microsoft Visio-diagrammen om naar PDF zonder Visio te installeren. VSD- en VSDX-bestanden bevatten stroomdiagrammen, organogrammen, netwerkdiagrammen en plattegronden die de meeste mensen niet kunnen openen. Deze tool maakt er nette PDF's van die op elk apparaat te bekijken zijn. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :----------- | :------- | :--------------------------------------------- | +| Visio binair | `.vsd` | Verouderd Visio-formaat (Visio 2003 en eerder) | +| Visio XML | `.vsdx` | Modern Visio-formaat (Visio 2013+) | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je VSD- of VSDX-bestanden erheen. Beide formaten kunnen in één reeks door elkaar staan. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram, of gebruik **Meer bestanden toevoegen** om meer diagrammen toe te voegen. +3. Klik op **Converteren naar PDF**. De op LibreOffice gebaseerde engine wordt in de browser geladen en zet elk diagram om naar een PDF, met behoud van vormen, connectoren, labels en pagina-indeling. +4. Een enkel diagram wordt direct als PDF gedownload. Bij meerdere bestanden krijg je een ZIP-archief met de naam `vsd-to-pdf.zip`. + +## Opties + +Er is geen configuratie nodig. De converter respecteert het oorspronkelijke paginaformaat en de oriëntatie van het Visio-document. + +## Toepassingen + +- Visio-diagrammen van een collega bekijken als je geen Visio-licentie hebt +- Netwerk- of architectuurdiagrammen als PDF in projectdocumentatie opnemen +- Organogrammen of processchema's afdrukken als handout voor vergaderingen +- Oude VSD-bestanden van eerdere Visio-versies archiveren in een toekomstbestendig formaat + +## Tips + +- Visio-documenten met meerdere pagina's leveren PDF's met meerdere pagina's op, waarbij elke Visio-pagina overeenkomt met een PDF-pagina. +- VSDX-bestanden (het moderne, op XML gebaseerde formaat) worden over het algemeen nauwkeuriger omgezet dan oudere binaire VSD-bestanden. +- De LibreOffice-engine wordt eenmaal per sessie geladen. Verwacht een korte wachttijd bij de eerste conversie en snellere resultaten bij volgende bestanden. + +## Gerelateerde tools + +- [ODG naar PDF](./odg-to-pdf) +- [PUB naar PDF](./pub-to-pdf) +- [PSD naar PDF](./psd-to-pdf) diff --git a/docs/nl/tools/webp-to-pdf.md b/docs/nl/tools/webp-to-pdf.md new file mode 100644 index 00000000..134540ef --- /dev/null +++ b/docs/nl/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP naar PDF +description: Zet WebP-afbeeldingen rechtstreeks in je browser om naar PDF, met instelbare compressiekwaliteit. +--- + +# WebP naar PDF + +Zet het WebP-afbeeldingsformaat van Google om naar PDF. Dit is vooral handig als je afbeeldingen van het web hebt gedownload die in WebP staan en je ze in een breder geaccepteerd formaat nodig hebt om af te drukken of te delen. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :------ | :-------- | +| WebP | `.webp` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je WebP-bestanden erheen. +2. Bekijk de bestandslijst en verwijder bestanden die je niet nodig hebt. +3. Kies een niveau voor **PDF-kwaliteit**. +4. Klik op **Converteren naar PDF**. De uitvoer wordt gedownload als `from_webps.pdf`. + +Intern wordt elke WebP-afbeelding gedecodeerd via de canvas-API van de browser en daarna met pdf-lib in de PDF ingebed. Dit betekent dat de conversie werkt in elke browser die WebP-decodering ondersteunt (alle moderne browsers doen dat). + +## Opties + +**PDF-kwaliteit** bepaalt de compressie bij het inbedden van afbeeldingen: + +- **Hoge kwaliteit**: behoudt de meeste details. +- **Gemiddelde kwaliteit** (standaard): gebalanceerde uitvoer. +- **Lage kwaliteit**: kleinste bestandsgrootte. + +## Toepassingen + +- Van het web gedownloade afbeeldingen die als WebP zijn opgeslagen omzetten naar een afdrukbare PDF +- WebP-schermafbeeldingen uit Chrome of Edge bundelen in documentatie +- Een PDF-portfolio maken van afbeeldingen die door ontwerptools standaard als WebP zijn geëxporteerd +- WebP-afbeeldingen archiveren in een breder leesbaar formaat + +## Tips + +- WebP wordt intern naar PNG gedecodeerd voordat het in de PDF wordt ingebed, dus lossless WebP-afbeeldingen behouden hun kwaliteit bij de instelling Hoog. +- Heb je een mix van WebP en andere afbeeldingsformaten, gebruik dan de tool [Afbeelding naar PDF](./image-to-pdf): die accepteert alles in één keer. + +## Gerelateerde tools + +- [Afbeelding naar PDF](./image-to-pdf) +- [PNG naar PDF](./png-to-pdf) +- [JPG naar PDF](./jpg-to-pdf) diff --git a/docs/nl/tools/word-to-pdf.md b/docs/nl/tools/word-to-pdf.md new file mode 100644 index 00000000..cd8e3e3f --- /dev/null +++ b/docs/nl/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word naar PDF +description: Zet Word-documenten (DOC, DOCX), ODT- en RTF-bestanden in je browser om naar PDF met behoud van de volledige opmaak. +--- + +# Word naar PDF + +Zet Microsoft Word-documenten en compatibele formaten om naar PDF. De tool gebruikt een LibreOffice-engine in de browser die DOC-, DOCX-, ODT- en RTF-bestanden verwerkt en opmaak, tabellen, afbeeldingen, kopteksten, voetteksten en stijlen in de uitvoer behoudt. + +## Ondersteunde formaten + +| Formaat | Extensies | +| :---------------- | :-------- | +| Word (modern) | `.docx` | +| Word (verouderd) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je Word-documenten erheen. Je kunt meerdere bestanden tegelijk selecteren. +2. Bekijk en beheer de bestandslijst. +3. Klik op **Converteren naar PDF**. De LibreOffice-engine wordt bij het eerste gebruik geladen (een voortgangsindicator toont de status van de initialisatie), daarna wordt elk bestand omgezet. +4. Een enkel bestand wordt direct als PDF gedownload. Meerdere bestanden worden samengebundeld in `word-converted.zip`. + +## Opties + +Deze tool heeft geen extra instellingen. De LibreOffice-engine maakt de uitvoer met het standaard PDF-exportprofiel. + +## Uitvoer + +| Aantal bestanden | Uitvoer | +| :--------------- | :--------------------------------------------------------------------- | +| 1 bestand | Enkele PDF-download (oorspronkelijke bestandsnaam met extensie `.pdf`) | +| 2+ bestanden | ZIP-archief (`word-converted.zip`) met één PDF per bestand | + +## Toepassingen + +- Een cv of sollicitatiebrief van DOCX naar PDF omzetten voordat je solliciteert +- Een reeks contracten of offertes in één keer naar PDF omzetten voor oplevering aan een klant +- Oude `.doc`-bestanden omzetten naar moderne PDF's voor archivering op de lange termijn +- Gezamenlijke documenten uit Google Docs (geëxporteerd als DOCX) naar PDF omzetten +- Drukklare PDF's maken van Word-sjablonen die bij geautomatiseerde documentgeneratie worden gebruikt + +## Tips + +- De LibreOffice-engine wordt eenmaal per sessie gedownload en in de cache bewaard. Verwacht een paar seconden laadtijd bij de eerste conversie, daarna gaat het veel sneller. +- Complexe opmaak (macro's, ActiveX-besturingselementen, geavanceerde SmartArt) wordt mogelijk niet perfect omgezet. Standaard documentelementen (tekst, tabellen, afbeeldingen, kopteksten, voetnoten) worden betrouwbaar omgezet. +- Omdat deze tool ook ODT en RTF accepteert, kun je hem gebruiken als alles-in-één converter voor alle tekstverwerkingsformaten. + +## Gerelateerde tools + +- [ODT naar PDF](./odt-to-pdf) +- [RTF naar PDF](./rtf-to-pdf) +- [Excel naar PDF](./excel-to-pdf) +- [PowerPoint naar PDF](./powerpoint-to-pdf) diff --git a/docs/nl/tools/wpd-to-pdf.md b/docs/nl/tools/wpd-to-pdf.md new file mode 100644 index 00000000..b573be96 --- /dev/null +++ b/docs/nl/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD naar PDF +description: Zet WordPerfect-documenten (WPD) in je browser met LibreOffice om naar PDF. Gratis en privé. +--- + +# WPD naar PDF + +Zet Corel WordPerfect-documenten om naar PDF-bestanden. WPD was ooit het dominante tekstverwerkingsformaat bij advocatenkantoren en overheidsinstanties. Heb je oude WordPerfect-bestanden die moderne software niet wil openen, dan maakt deze tool er weer standaard PDF's van. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :---------- | :------- | :----------------------------------- | +| WordPerfect | `.wpd` | Alle belangrijke WordPerfect-versies | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je WPD-bestanden erheen. Je kunt meerdere bestanden tegelijk selecteren. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram, of gebruik **Meer bestanden toevoegen** om meer documenten toe te voegen. +3. Klik op **Converteren naar PDF**. De tool laadt een op LibreOffice gebaseerde conversie-engine in je browser, die het WPD-formaat uitleest en PDF uitvoert. +4. Een enkel bestand wordt direct als PDF gedownload. Bij reeksconversies krijg je een ZIP-archief met de naam `wpd-to-pdf.zip`. + +## Opties + +Er is geen configuratie nodig. De LibreOffice-engine verwerkt de WPD-opmaak, lettertypen en indeling automatisch. + +## Toepassingen + +- Tientallen jaren oude juridische documenten openen die in WordPerfect zijn geschreven +- Gearchiveerde overheidsdossiers van WPD omzetten naar een modern formaat +- Een oude WordPerfect-documentbibliotheek migreren naar PDF voor opslag op de lange termijn +- WPD-bestanden delen met ontvangers die Corel WordPerfect niet hebben geïnstalleerd + +## Tips + +- De LibreOffice-engine wordt bij het eerste gebruik geladen, wat even duurt. Volgende conversies in dezelfde sessie gaan sneller. +- Complexe WPD-macro's en reveal codes blijven niet behouden, maar de visuele indeling, de tekstinhoud en de basisopmaak komen wel mee naar de PDF. + +## Gerelateerde tools + +- [WPS naar PDF](./wps-to-pdf) +- [ODG naar PDF](./odg-to-pdf) diff --git a/docs/nl/tools/wps-to-pdf.md b/docs/nl/tools/wps-to-pdf.md new file mode 100644 index 00000000..d50fe89c --- /dev/null +++ b/docs/nl/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS naar PDF +description: Zet Microsoft Works-documenten (WPS) in je browser om naar PDF. Gratis, zonder aanmelding en volledig privé. +--- + +# WPS naar PDF + +Zet tekstverwerkerbestanden van Microsoft Works om naar PDF. Microsoft Works werd eind jaren 90 en in de jaren 2000 met consumenten-pc's meegeleverd, en veel WPS-bestanden staan nog op oude harde schijven en in e-mailarchieven. Deze tool opent ze in de browser en maakt er nette PDF's van. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :-------------- | :------- | :------------------------------------------ | +| Microsoft Works | `.wps` | Tekstverwerkerbestanden van Microsoft Works | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je WPS-bestanden erheen. Meerdere bestanden worden geaccepteerd. +2. Bekijk de bestandslijst. Gebruik het prullenbakpictogram om losse bestanden te verwijderen, of klik op **Meer bestanden toevoegen** om je reeks uit te breiden. +3. Klik op **Converteren naar PDF**. Een op LibreOffice gebaseerde engine wordt in de browser geladen en zet elk WPS-document om naar PDF. +4. Eén bestand wordt direct als PDF gedownload. Meerdere bestanden worden gebundeld in een ZIP-archief met de naam `wps-to-pdf.zip`. + +## Opties + +Er zijn geen extra instellingen nodig. De converter verwerkt tekst, basisopmaak en ingebedde afbeeldingen uit het WPS-bestand. + +## Toepassingen + +- Oude school- of werkdocumenten terughalen die in het Microsoft Works-formaat zijn opgeslagen +- WPS-bijlagen in e-mails openen als je Microsoft Works niet hebt geïnstalleerd +- Een archief met WPS-bestanden omzetten voor migratie naar een modern documentsysteem +- Oude documenten afdrukken die huidige tekstverwerkers niet kunnen openen + +## Tips + +- Verwar `.wps`-bestanden van Microsoft Works niet met bestanden van WPS Office. Deze tool is specifiek bedoeld voor het oudere Microsoft Works-formaat. +- De LibreOffice-engine heeft even tijd nodig om bij het eerste gebruik te laden. Eenmaal geladen gaan extra conversies in dezelfde sessie sneller. + +## Gerelateerde tools + +- [WPD naar PDF](./wpd-to-pdf) +- [PUB naar PDF](./pub-to-pdf) diff --git a/docs/nl/tools/xml-to-pdf.md b/docs/nl/tools/xml-to-pdf.md new file mode 100644 index 00000000..44f5aa0e --- /dev/null +++ b/docs/nl/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML naar PDF +description: Zet XML-bestanden in je browser om naar gestructureerde PDF-documenten. Gratis, privé, geen verwerking op een server. +--- + +# XML naar PDF + +Zet XML-gegevensbestanden om naar leesbare, gestructureerde PDF-documenten. Ruwe XML is krachtig maar voor mensen lastig te lezen. Deze tool leest de XML-boom in, herkent terugkerende gegevensstructuren en toont ze als opgemaakte tabellen en secties in een liggende A4-PDF. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------ | :------- | :--------------------------- | +| XML | `.xml` | Elk goedgevormd XML-document | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je XML-bestanden erheen. Meerdere bestanden kunnen in één reeks worden verwerkt. +2. Bekijk de bestandslijst. Verwijder ongewenste bestanden met het prullenbakpictogram, of klik op **Meer bestanden toevoegen** om er meer toe te voegen. +3. Klik op **Converteren naar PDF**. De tool leest de XML-structuur in met de ingebouwde DOMParser van de browser, analyseert de gegevenshiërarchie en zet die met jsPDF en auto-table-opmaak om naar een PDF. +4. Een enkel bestand wordt als PDF gedownload. Meerdere conversies worden gebundeld in `xml-to-pdf.zip`. + +## Opties + +Handmatige configuratie is niet nodig. De converter herkent de XML-structuur automatisch en kiest passende tabelindelingen. De uitvoer gebruikt een liggende A4-oriëntatie voor brede gegevenssets. + +## Toepassingen + +- XML-gegevensexports uit databases of API's omzetten naar afdrukbare rapporten +- Leesbare samenvattingen maken van XML-configuratiebestanden +- XML-facturen of transactielogboeken omzetten naar PDF's voor de administratie +- XML-sitemaps of RSS-feeds leesbaar maken in documentvorm + +## Tips + +- De XML moet goedgevormd zijn. Als de parser syntaxisfouten tegenkomt, mislukt de conversie met een duidelijke foutmelding die naar het probleem wijst. +- Diep geneste XML-structuren worden afgevlakt tot tabellen. De beste resultaten krijg je als de gegevens terugkerende elementen op hetzelfde niveau hebben met consistente onderliggende elementen. +- Tijdens de conversie verschijnen voortgangsmeldingen voor elke fase: lezen, inlezen, analyseren en renderen. + +## Gerelateerde tools + +- [FB2 naar PDF](./fb2-to-pdf) +- [XPS naar PDF](./xps-to-pdf) +- [E-mail naar PDF](./email-to-pdf) diff --git a/docs/nl/tools/xps-to-pdf.md b/docs/nl/tools/xps-to-pdf.md new file mode 100644 index 00000000..31402977 --- /dev/null +++ b/docs/nl/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS naar PDF +description: Zet XPS- en OXPS-documenten in je browser om naar PDF. Geen upload, geen aanmelding, volledig privé. +--- + +# XPS naar PDF + +Zet Microsoft XPS- en OXPS-documenten om naar standaard PDF-bestanden. XPS (XML Paper Specification) was het antwoord van Microsoft op PDF, maar de ondersteuning ervan is op steeds meer platforms verdwenen. Deze tool maakt die documenten weer voor iedereen leesbaar. + +## Ondersteunde formaten + +| Formaat | Extensie | Opmerkingen | +| :------ | :------- | :------------------------------------------------- | +| XPS | `.xps` | Oorspronkelijk Microsoft XPS-formaat | +| OXPS | `.oxps` | Open XPS, de variant volgens de ECMA-388-standaard | + +## Hoe het werkt + +1. Klik op het uploadgebied of sleep je XPS-/OXPS-bestanden erheen. Je kunt meerdere bestanden tegelijk selecteren. +2. Bekijk de bestandslijst. Verwijder losse bestanden met het prullenbakpictogram, of klik op **Meer bestanden toevoegen** om extra documenten toe te voegen. +3. Klik op **Converteren naar PDF**. De PyMuPDF-engine verwerkt elk document lokaal in je browser. +4. Een enkel bestand wordt direct als PDF gedownload. Meerdere bestanden worden gebundeld in een ZIP-archief met de naam `xps-converted.zip`. + +## Opties + +Deze tool voert een directe formaatconversie uit zonder extra configuratie. De uitvoer behoudt de oorspronkelijke paginaafmetingen, vectorafbeeldingen, lettertypen en afbeeldingen uit de XPS-bron. + +## Toepassingen + +- XPS-bestanden openen die je van oudere Windows-systemen hebt gekregen waar het XPS-printerstuurprogramma de standaard was +- OXPS-documenten uit Windows 10/11 omzetten om te delen met macOS- of Linux-gebruikers +- Oude XPS-bestanden archiveren in een breder ondersteund formaat +- XPS-documenten van overheden of bedrijven toegankelijk maken voor externe ontvangers + +## Tips + +- Zowel `.xps`- als `.oxps`-extensies worden automatisch herkend, dus je kunt ze in dezelfde reeks combineren. +- Is het oorspronkelijke XPS-bestand gemaakt met een printerstuurprogramma met hoge resolutie, dan behoudt de resulterende PDF die kwaliteit. Er vindt geen herbemonstering plaats. + +## Gerelateerde tools + +- [Word naar PDF](./word-to-pdf) +- [XML naar PDF](./xml-to-pdf) diff --git a/docs/pl/contributing.md b/docs/pl/contributing.md new file mode 100644 index 00000000..ef173324 --- /dev/null +++ b/docs/pl/contributing.md @@ -0,0 +1,136 @@ +# Współtworzenie + +Dziękujemy za zainteresowanie współtworzeniem BentoPDF! Ten przewodnik pomoże Ci zacząć. + +## Pierwsze kroki + +### Wymagania wstępne + +- Node.js 18+ +- npm 9+ +- Git + +### Konfiguracja + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Struktura projektu + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Dodawanie nowego narzędzia + +### Krok 1: Utwórz plik z logiką + +Utwórz `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Krok 2: Utwórz stronę HTML + +Utwórz `src/pages/your-tool.html` według istniejących szablonów narzędzi. + +### Krok 3: Zarejestruj narzędzie + +Dodaj do `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Krok 4: Dodaj do konfiguracji budowania + +Dodaj stronę do `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Krok 5: Dodaj tłumaczenia + +Dodaj wpisy do wszystkich plików językowych w `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Styl kodu + +- Używaj TypeScript w całym nowym kodzie +- Trzymaj się istniejących wzorców, aby zachować spójność +- Uruchom `npm run format` przed zatwierdzeniem zmian +- Bez komentarzy w kodzie produkcyjnym (komentarze są usuwane podczas budowania) + +## Proces Pull Requestów + +1. Utwórz gałąź funkcji: `git checkout -b feature/your-feature` +2. Wprowadź zmiany +3. Dokładnie przetestuj: `npm run build` +4. Wyślij PR z czytelnym opisem + +## Tłumaczenia + +Zobacz [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md), aby dowiedzieć się, jak dodawać nowe języki. + +## Umowa licencyjna współtwórcy + +Zanim Twój PR zostanie scalony, musisz podpisać naszą umowę CLA: + +- [Indywidualna CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Korporacyjna CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Pomoc + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Społeczność na Discordzie](https://discord.gg/Bgq3Ay3f2w) + +## Licencja + +BentoPDF jest dostępny na dwóch licencjach: + +- **AGPL-3.0** dla projektów open source, w których publicznie udostępniasz cały kod źródłowy +- **Licencja komercyjna** dla aplikacji własnościowych i zamkniętych: [Kup licencję dożywotnią za 79 USD](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Współtworząc projekt, zgadzasz się, że Twój wkład będzie objęty tymi warunkami licencji. diff --git a/docs/pl/getting-started.md b/docs/pl/getting-started.md new file mode 100644 index 00000000..f9a828d5 --- /dev/null +++ b/docs/pl/getting-started.md @@ -0,0 +1,80 @@ +# Pierwsze kroki + +Witaj w BentoPDF! Ten przewodnik pomoże Ci szybko zacząć. + +## Czym jest BentoPDF? + +BentoPDF to darmowy zestaw narzędzi PDF o otwartym kodzie, stworzony z myślą o prywatności, który działa **w całości w przeglądarce**. Twoje pliki nigdy nie opuszczają urządzenia: całe przetwarzanie odbywa się lokalnie dzięki technologii WebAssembly (WASM). + +## Szybki start + +### Opcja 1: Użyj wersji hostowanej + +Odwiedź [bentopdf.com](https://www.bentopdf.com), aby od razu korzystać z BentoPDF, bez instalacji. + +### Opcja 2: Samodzielny hosting z Dockerem + +> [!IMPORTANT] +> Konwersja plików Office wymaga `SharedArrayBuffer`, a do tego potrzebne są oba nagłówki: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - bezpieczny kontekst +> +> `http://localhost` działa do testów lokalnych, ponieważ przeglądarki traktują adres pętli zwrotnej jako zaufany. `http://192.168.x.x` i inne adresy LAN zwykle nie są traktowane jako zaufane, więc konwersje Word/Excel/PowerPoint będą wymagały HTTPS przy dostępie z innych urządzeń w sieci. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF jest dostępny w dwóch wersjach: **wersja do samodzielnego hostingu** (`bentopdf-simple`, użyta powyżej) do wdrożeń wewnętrznych, zespołowych i organizacyjnych oraz **wersja komercyjna** (`bentopdf:latest`), używana przez samo bentopdf.com i przez posiadaczy licencji komercyjnej z publicznymi wdrożeniami. Obie zawierają te same narzędzia PDF, a wersja komercyjna dodaje sekcję hero, FAQ, opinie i stopkę z bentopdf.com. W razie wątpliwości użyj wersji do samodzielnego hostingu. + +Następnie otwórz `http://localhost:3000` w przeglądarce. + +> [!NOTE] +> Jeśli przygotowujesz wdrożenie OCR w środowisku odciętym od sieci (air-gapped), oprócz workera Tesseract, środowiska uruchomieniowego i plików traineddata musisz hostować wewnętrznie także czcionki warstwy tekstowej OCR. Pełna konfiguracja jest opisana w [Samodzielny hosting](/pl/self-hosting/), wraz z `VITE_OCR_FONT_BASE_URL` i dołączonym katalogiem `ocr-fonts/`. + +### Opcja 3: Zbuduj ze źródeł + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funkcje w skrócie + +| Kategoria | Narzędzia | +| ---------------------- | ----------------------------------------------------------------------------------- | +| **Konwersja do PDF** | Word, Excel, PowerPoint, obrazy, Markdown, EPUB, MOBI i więcej | +| **Konwersja z PDF** | JPG, PNG, tekst, Excel, SVG i więcej | +| **Edycja i adnotacje** | Podpisywanie, zakreślanie, redagowanie, wypełnianie formularzy, dodawanie pieczątek | +| **Organizacja** | Łączenie, dzielenie, obracanie, usuwanie stron, zmiana kolejności | +| **Optymalizacja** | Kompresja, naprawa, spłaszczanie, OCR | +| **Bezpieczeństwo** | Szyfrowanie, odszyfrowywanie, usuwanie ograniczeń | + +## Obsługiwane przeglądarki + +BentoPDF działa najlepiej w nowoczesnych przeglądarkach: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Dalsze kroki + +- [Poznaj wszystkie narzędzia](/pl/tools/) +- [Hostuj BentoPDF samodzielnie](/pl/self-hosting/) +- [Współtwórz projekt](/pl/contributing) diff --git a/docs/pl/index.md b/docs/pl/index.md new file mode 100644 index 00000000..773ee029 --- /dev/null +++ b/docs/pl/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Darmowe narzędzia PDF o otwartym kodzie' + tagline: Przetwarzaj pliki PDF w całości w przeglądarce. Bez wysyłania na serwer. Bez serwerów. Pełna prywatność. + actions: + - theme: brand + text: Zacznij + link: /pl/getting-started + - theme: alt + text: Zobacz narzędzia + link: /pl/tools/ + - theme: alt + text: Własny hosting + link: /pl/self-hosting/ + - theme: alt + text: Licencja komercyjna + link: /pl/licensing + +features: + - icon: 🔒 + title: W 100% prywatnie + details: Twoje pliki nigdy nie opuszczają urządzenia. Całe przetwarzanie odbywa się lokalnie w przeglądarce dzięki WebAssembly. + - icon: ⚡ + title: Szybko i za darmo + details: Bez rejestracji, bez limitów, bez znaków wodnych. Przetwarzaj dowolną liczbę plików PDF za darmo, na zawsze. + - icon: 🛠️ + title: Ponad 50 narzędzi + details: Konwertuj, edytuj, łącz, dziel, kompresuj, podpisuj, rozpoznawaj tekst (OCR) i więcej. Wszystko, czego potrzebujesz, w jednym miejscu. + + - icon: 🌐 + title: Własny hosting + details: Wdrażaj na własnej infrastrukturze. Docker, Vercel, Netlify, AWS lub w pełni odcięte od sieci środowiska z własnymi workerami OCR, danymi językowymi i czcionkami warstwy tekstowej. +--- + +## OCR offline + +Jeśli hostujesz BentoPDF samodzielnie w środowisku odciętym od sieci lub offline, OCR potrzebuje czegoś więcej niż worker Tesseract i pliki traineddata. Aby uzyskać przeszukiwalny plik PDF, czcionki warstwy tekstowej OCR muszą być serwowane wewnętrznie. +Pełna konfiguracja, w tym `VITE_OCR_FONT_BASE_URL`, dołączony katalog `ocr-fonts/` i zaktualizowany proces dla środowisk air-gapped, jest w [Samodzielny hosting](/pl/self-hosting/). diff --git a/docs/pl/licensing.md b/docs/pl/licensing.md new file mode 100644 index 00000000..00aab9c3 --- /dev/null +++ b/docs/pl/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/pl/self-hosting/#konfiguracja-wasm-komponenty-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/pl/self-hosting/apache.md b/docs/pl/self-hosting/apache.md new file mode 100644 index 00000000..06066744 --- /dev/null +++ b/docs/pl/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Wdrożenie z Apache + +Hostuj BentoPDF za pomocą serwera Apache HTTP Server. + +## Wymagania wstępne + +- Apache 2.4+ +- Włączony mod_rewrite +- Certyfikat SSL (zalecany) + +## Krok 1: Zbuduj projekt + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Aby dostosować branding, ustaw zmienne środowiskowe przed budowaniem: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Krok 2: Skopiuj pliki + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Krok 3: Konfiguracja Apache + +Utwórz `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Krok 4: .htaccess do routingu + +Utwórz `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Krok 5: Włącz wymagane moduły + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Krok 6: Włącz witrynę + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Wdrożenie w podkatalogu + +Aby hostować pod adresem `/pdf/`: + +1. Zbuduj z bazowym adresem URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Zaktualizuj `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Rozwiązywanie problemów + +### Błędy 404 dla WASM + +Upewnij się, że typ MIME jest skonfigurowany: + +```apache +AddType application/wasm .wasm +``` + +### Podpisywanie PDF lub wypełnianie formularzy pokazuje pustą przeglądarkę (błąd MIME `.mjs`) + +Jeśli konsola przeglądarki pokazuje: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…a żądanie, które się nie powiodło, kończy się na `.mjs`, w konfiguracji Apache brakuje mapowania `.mjs → application/javascript`. Dołączona przeglądarka PDF zawiera moduły ES z rozszerzeniem `.mjs`, a standardowy plik `mime.types` w Apache domyślnie ich nie obejmuje. + +Dodaj do VirtualHost lub `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Następnie przeładuj Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Aby to potwierdzić: w narzędziach deweloperskich przeglądarki → karta Network znajdź nieudane żądanie `.mjs` i sprawdź nagłówek odpowiedzi `Content-Type`. Powinien mieć wartość `application/javascript`, a nie `application/octet-stream`. + +### Rewrite nie działa + +Sprawdź, czy mod_rewrite jest włączony: + +```bash +sudo a2enmod rewrite +``` + +### Konwersja Word/ODT/Excel do PDF nie działa + +LibreOffice WASM wymaga `SharedArrayBuffer`, a do tego potrzebne są te nagłówki: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Potrzebny jest też bezpieczny kontekst. `http://localhost` działa do testów lokalnych, ale `http://192.168.x.x` i inne adresy LAN zwykle wymagają HTTPS. Jeśli nagłówki są obecne, a `window.crossOriginIsolated` nadal ma wartość `false`, sprawdź, czy strona nie jest otwierana przez zwykłe HTTP z adresu innego niż pętla zwrotna. + +Wstępnie skompresowane pliki `.wasm.gz` i `.data.gz` wymagają też poprawnego `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Upewnij się, że `mod_headers` jest włączony: `sudo a2enmod headers` + +### Odmowa dostępu + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/pl/self-hosting/aws.md b/docs/pl/self-hosting/aws.md new file mode 100644 index 00000000..e2baab61 --- /dev/null +++ b/docs/pl/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Wdrożenie na AWS S3 + CloudFront + +Hostuj BentoPDF na AWS, aby uzyskać maksymalną kontrolę i skalowalność. + +## Architektura + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Krok 1: Utwórz bucket S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Krok 2: Zbuduj i wyślij + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Krok 3: Utwórz dystrybucję CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Albo użyj konsoli AWS: + +1. Przejdź do CloudFront → Create distribution +2. Origin domain: wybierz swój bucket S3 +3. Włącz „Origin Access Control” +4. Default root object: `index.html` +5. Utwórz dystrybucję + +## Krok 3b: Polityka nagłówków odpowiedzi (wymagana dla LibreOffice WASM) + +Konwersje oparte na LibreOffice (Word, Excel, PowerPoint do PDF) wymagają `SharedArrayBuffer`, a to wymaga określonych nagłówków odpowiedzi. Utwórz politykę nagłówków odpowiedzi CloudFront (Response Headers Policy): + +1. Przejdź do CloudFront → Policies → Response headers +2. Utwórz własną politykę z tymi nagłówkami: + +| Nagłówek | Wartość | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Dołącz politykę do domyślnego zachowania pamięci podręcznej (default cache behavior) swojej dystrybucji + +Albo przez CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Krok 3c: Metadane S3 dla wstępnie skompresowanych plików WASM + +Pliki LibreOffice WASM są wstępnie skompresowane (`.wasm.gz`, `.data.gz`). Ustaw poprawny Content-Type i Content-Encoding, aby przeglądarki je rozpakowywały: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Ważne +Bez polityki nagłówków odpowiedzi `SharedArrayBuffer` jest niedostępny, a konwersje LibreOffice WASM zawieszą się na ok. 55%. Bez poprawnego Content-Encoding dla plików `.gz` przeglądarka otrzymuje surowe bajty gzip i kompilacja WASM kończy się błędem. +::: + +## Krok 4: Polityka bucketu S3 + +Zezwól CloudFront na dostęp do bucketu: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Krok 5: Własne strony błędów + +Skonfiguruj 404 tak, aby zwracał `index.html` na potrzeby routingu SPA: + +1. CloudFront → Error pages +2. Utwórz własną odpowiedź błędu: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Szacunkowe koszty + +| Zasób | Szacunkowy koszt | +| --------------------------- | ---------------- | +| Magazyn S3 (~500MB) | ~$0.01/mies. | +| CloudFront (1TB transferu) | ~$85/mies. | +| CloudFront (10GB transferu) | ~$0.85/mies. | + +::: tip +Użyj S3 Intelligent Tiering, aby obniżyć koszty plików rzadko używanych. +::: + +## Automatyzacja z Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/pl/self-hosting/cloudflare.md b/docs/pl/self-hosting/cloudflare.md new file mode 100644 index 00000000..d60eb62b --- /dev/null +++ b/docs/pl/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Wdrożenie na Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) oferuje szybki, globalny hosting stron statycznych z nielimitowaną przepustowością. + +## Szybkie wdrożenie + +1. Przejdź do [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Kliknij „Create a project” +3. Połącz swoje repozytorium GitHub + +## Konfiguracja budowania + +| Ustawienie | Wartość | +| ------------------- | --------------- | +| Framework preset | Brak | +| Polecenie budowania | `npm run build` | +| Katalog wyjściowy | `dist` | +| Katalog główny | `/` | + +## Zmienne środowiskowe + +Dodaj je w Settings → Environment variables: + +| Zmienna | Wartość | +| ----------------------- | ------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (opcjonalnie) | +| `VITE_BRAND_NAME` | Własna nazwa marki (opcjonalnie) | +| `VITE_BRAND_LOGO` | Ścieżka logo względem `public/` (opcjonalnie) | +| `VITE_FOOTER_TEXT` | Własny tekst stopki/praw autorskich (opcjonalnie) | +| `VITE_DEFAULT_LANGUAGE` | Domyślny język interfejsu, np. `fr` (opcjonalnie) | + +## Plik konfiguracji + +Utwórz `_headers` w folderze `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Ważne +Nagłówki `Cross-Origin-Embedder-Policy` i `Cross-Origin-Opener-Policy` są wymagane do konwersji Word/ODT/Excel/PowerPoint do PDF. Bez nich `SharedArrayBuffer` jest niedostępny, a silnik LibreOffice WASM nie zainicjuje się. +::: + +Utwórz `_redirects` na potrzeby routingu SPA: + +``` +/* /index.html 200 +``` + +## Własna domena + +1. Przejdź do swojego projektu Pages +2. Kliknij „Custom domains” +3. Dodaj swoją domenę +4. Cloudflare automatycznie skonfiguruje DNS, jeśli domena jest w Cloudflare + +## Zalety + +- **Darmowa, nielimitowana przepustowość** +- **Globalny CDN** z ponad 300 lokalizacjami brzegowymi +- **Automatyczne HTTPS** +- **Wdrożenia podglądowe** dla pull requestów +- **Szybkie budowanie** + +## Rozwiązywanie problemów + +### Wysyłanie dużych plików + +Cloudflare Pages obsługuje pliki do 25 MB. Moduły WASM powinny się zmieścić, ale jeśli natrafisz na limity, rozważ: + +```bash +# Split large files during build +npm run build +``` + +### Limity rozmiaru Workera + +Jeśli używasz Cloudflare Workers do zaawansowanego routingu, pamiętaj o limicie 1 MB w planach darmowych. + +## Worker proxy CORS (dla podpisów cyfrowych) + +Narzędzie podpisu cyfrowego wymaga proxy CORS do pobierania łańcuchów certyfikatów. Wdróż dołączony worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Funkcje bezpieczeństwa + +| Funkcja | Opis | +| ------------------------- | ------------------------------------- | +| **Ograniczenia URL** | Dozwolone tylko adresy certyfikatów | +| **Limit rozmiaru pliku** | Maks. 10MB na żądanie | +| **Limit żądań** | 60 żądań/IP/min (wymaga KV) | +| **Blokada prywatnych IP** | Blokuje localhost i adresy wewnętrzne | + +### Włącz limit żądań + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Zbuduj z adresem URL proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Albo z Dockerem: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Uwaga:** Konfigurację podpisu HMAC znajdziesz w [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required). diff --git a/docs/pl/self-hosting/cors-proxy.md b/docs/pl/self-hosting/cors-proxy.md new file mode 100644 index 00000000..a1bd6d14 --- /dev/null +++ b/docs/pl/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Proxy CORS do pobierania certyfikatów + +Narzędzie podpisu cyfrowego używa proxy CORS do pobierania certyfikatów wystawców z zewnętrznych urzędów certyfikacji (CA). Jest to konieczne, ponieważ wiele serwerów CA nie dołącza nagłówków CORS do odpowiedzi, co uniemożliwia bezpośrednie pobieranie z poziomu przeglądarki. + +Ponadto wiele serwerów CA udostępnia certyfikaty przez zwykłe HTTP. Gdy Twoja instancja BentoPDF jest hostowana przez HTTPS, przeglądarki blokują takie żądania HTTP (zasada mixed content). Proxy CORS rozwiązuje oba problemy, kierując żądania przez punkt końcowy HTTPS z odpowiednimi nagłówkami. + +## Jak to działa + +Podczas podpisywania pliku PDF certyfikatem: + +1. Biblioteka `zgapdfsigner` próbuje zbudować pełny łańcuch certyfikatów +2. Pobiera certyfikaty wystawców z adresów URL zapisanych w rozszerzeniu AIA (Authority Information Access) Twojego certyfikatu +3. Te żądania są kierowane przez proxy CORS, które dodaje wymagane nagłówki `Access-Control-Allow-Origin` +4. Proxy zwraca dane certyfikatu do przeglądarki + +## Samodzielny hosting proxy CORS + +Jeśli hostujesz BentoPDF samodzielnie, musisz wdrożyć własne proxy CORS, aby podpisy cyfrowe działały z certyfikatami wymagającymi pobrania łańcucha. + +### Opcja 1: Cloudflare Workers (zalecana) + +1. **Zainstaluj Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Zaloguj się do Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Sklonuj BentoPDF i zaktualizuj dozwolone źródła**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Otwórz `cors-proxy-worker.js` i zmień tablicę `ALLOWED_ORIGINS` na swoją domenę: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Ważne + Bez tej zmiany proxy odrzuci wszystkie żądania z Twojej witryny z błędem **403 Forbidden**. Domyślnie dozwolone są tylko żądania z `bentopdf.com`. + ::: + +4. **Wdróż proxy**: + + ```bash + wrangler deploy + ``` + + Zapisz adres URL swojego workera (np. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Zbuduj BentoPDF ponownie z adresem URL proxy**: + + Jeśli używasz Dockera: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Jeśli budujesz ze źródeł: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Opcja 2: Własne proxy backendowe + +Możesz też utworzyć własny punkt końcowy proxy. Wymagania: + +1. Przyjmuj żądania GET z parametrem zapytania `url` +2. Pobieraj adres URL ze swojego serwera (po stronie serwera nie ma ograniczeń CORS) +3. Zwracaj odpowiedź z tymi nagłówkami: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Przykładowa implementacja w Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Kwestie bezpieczeństwa + +Dołączony Cloudflare Worker ma kilka zabezpieczeń: + +| Funkcja | Opis | +| ------------------------------- | ---------------------------------------------------------------------------------------------- | +| **Walidacja źródła** | Zezwala tylko na żądania z domen z listy `ALLOWED_ORIGINS` | +| **Ograniczenia URL** | Zezwala tylko na adresy certyfikatów (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blokada prywatnych IP** | Blokuje prywatne zakresy IPv4/IPv6, link-local, loopback, adresy dziesiętne i metadane chmury | +| **Bezpieczeństwo Content-Type** | Zwraca tylko bezpieczne typy MIME certyfikatów, blokuje wstrzykiwanie content-type z upstreamu | +| **Limit rozmiaru pliku** | Strumieniuje odpowiedź z limitem 10MB, przerywa pobieranie w trakcie po jego przekroczeniu | +| **Limit żądań** | 60 żądań na minutę na IP lub IPv6 /64 (wymaga KV, przy błędach KV przepuszcza ruch) | +| **Podpisy HMAC** | Opcjonalne podpisywanie po stronie klienta (zniechęca do przypadkowych nadużyć) | + +### DNS rebinding (hosting poza Cloudflare) + +Worker odrzuca każdy adres URL, który wskazuje na prywatny lub wewnętrzny adres IP. Nie może użyć stałej listy dozwolonych hostów, ponieważ adresy łańcucha certyfikatów wskazują na dowolne CA, które wystawiło certyfikat (FNMT, korporacyjne CA itd.), więc miejsca docelowe nie są znane z góry. Zostaje małe okno na rebinding: osoba zarządzająca DNS własnej domeny mogłaby podać publiczny adres IP przy sprawdzaniu bezpieczeństwa, a chwilę później prywatny przy właściwym żądaniu. + +W Cloudflare nie da się tego wykorzystać: Workers nie mają dostępu do prywatnych adresów IP ani do punktu metadanych `169.254.169.254`, więc rebinding trafia w pustkę. Nie dawaj tylko workerowi drogi do środka: nie podłączaj Tunnel, Service ani powiązania z siecią prywatną (potrzebuje wyłącznie `RATE_LIMIT_KV`). + +Jeśli uruchamiasz to poza Cloudflare (workerd, Node itp.) wewnątrz VPC, środowisko _może_ docierać do adresów wewnętrznych. Postaw przed nim zaporę ruchu wychodzącego i zablokuj zakresy prywatne: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` oraz ich odpowiedniki IPv6. Kod aplikacji nie wymusi tego poza Cloudflare. + +## Wyłączanie proxy + +Jeśli nie chcesz używać proxy CORS, ustaw zmienną środowiskową na pusty ciąg: + +``` +VITE_CORS_PROXY_URL= +``` + +**Uwaga**: Bez proxy podpisywanie certyfikatami wymagającymi zewnętrznego pobrania łańcucha (jak FNMT lub niektóre korporacyjne CA) zakończy się błędem „Failed to fetch”. + +## Rozwiązywanie problemów + +### "Signing error: TypeError: Failed to fetch" + +Zwykle oznacza to jedno z poniższych: + +1. **Nie skonfigurowano proxy CORS**: ustaw `VITE_CORS_PROXY_URL` i zbuduj ponownie +2. **Zablokowana zawartość mieszana**: Twoja witryna używa HTTPS, a adres wystawcy certyfikatu to HTTP. Proxy CORS to rozwiązuje. +3. **Proxy CORS odrzuca Twoje źródło**: sprawdź, czy Twoja domena jest w tablicy `ALLOWED_ORIGINS` w `cors-proxy-worker.js` + +### Błąd "403 Forbidden" z proxy + +Twojej domeny nie ma na liście `ALLOWED_ORIGINS`. Edytuj `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Następnie wdróż ponownie: `npx wrangler deploy` + +### Testowanie proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certyfikaty działające bez proxy + +Niektóre certyfikaty zawierają pełny łańcuch w pliku P12/PFX i nie wymagają zewnętrznego pobierania: + +- Certyfikaty z podpisem własnym +- Niektóre komercyjne CA dołączające certyfikaty pośrednie +- Certyfikaty, w których ręcznie złożyłeś pełny łańcuch diff --git a/docs/pl/self-hosting/docker.md b/docs/pl/self-hosting/docker.md new file mode 100644 index 00000000..313a0e9e --- /dev/null +++ b/docs/pl/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Wdrożenie z Dockerem / Podmanem + +Najłatwiejszy sposób samodzielnego hostingu BentoPDF w środowisku produkcyjnym. + +> [!IMPORTANT] +> **Wymagane nagłówki do konwersji plików Office** +> +> Narzędzia oparte na LibreOffice (konwersja Word, Excel, PowerPoint) wymagają tych nagłówków HTTP do obsługi `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Strona musi być też serwowana z bezpiecznego kontekstu. `http://localhost` działa do testów lokalnych, ale `http://192.168.x.x` i inne adresy LAN zwykle go nie spełniają, więc konwersja Office przez zwykłe HTTP nie zadziała, nawet jeśli nagłówki są obecne. +> +> Oficjalne obrazy kontenerów zawierają te nagłówki. Jeśli używasz reverse proxy (Traefik, Caddy itp.), upewnij się, że nagłówki są zachowywane lub dodawane, i używaj HTTPS przy dostępie spoza pętli zwrotnej. + +> [!TIP] +> **Użytkownicy Podmana:** Wszystkie polecenia `docker` działają z Podmanem po zastąpieniu `docker` przez `podman` i `docker-compose` przez `podman-compose`. + +## Szybki start + +> [!TIP] +> BentoPDF jest dostępny w dwóch wersjach: +> +> - **Wersja do samodzielnego hostingu**: `ghcr.io/alam00000/bentopdf-simple:latest`. Wszystkie narzędzia PDF, **bez** warstwy marketingowej (bez hero, FAQ, opinii i stopki). Użyj jej do wdrożeń wewnętrznych, zespołowych i organizacyjnych. To **nie** jest okrojona wersja „lite”. +> - **Wersja komercyjna**: `ghcr.io/alam00000/bentopdf:latest`. Pełna witryna marketingowa, używana przez samo bentopdf.com i przez posiadaczy licencji komercyjnej z publicznymi wdrożeniami. +> +> W razie wątpliwości pobierz wersję do samodzielnego hostingu. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Utwórz `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Uruchom: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Zbuduj własny obraz + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Zbuduj i uruchom: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Zmienne środowiskowe + +| Zmienna | Opis | Domyślnie | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Zbuduj wariant do samodzielnego hostingu (ukrywa warstwę marketingową bentopdf.com: hero, FAQ, opinie, stopkę). Wszystkie narzędzia PDF pozostają. | `false` | +| `BASE_URL` | Wdrożenie w podkatalogu | `/` | +| `VITE_WASM_PYMUPDF_URL` | Adres URL modułu PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Adres URL modułu Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | Adres URL modułu CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | Adres URL skryptu workera OCR | _(puste; domyślny CDN Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Katalog środowiska uruchomieniowego OCR | _(puste; domyślny CDN Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Katalog traineddata OCR | _(puste; domyślny CDN Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Języki OCR rozdzielone przecinkami, widoczne w interfejsie | _(puste; pełny katalog)_ | +| `VITE_OCR_FONT_BASE_URL` | Katalog czcionek warstwy tekstowej OCR | _(puste; zdalne adresy czcionek Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Domyślny język interfejsu | `en` | +| `VITE_BRAND_NAME` | Własna nazwa marki | `BentoPDF` | +| `VITE_BRAND_LOGO` | Ścieżka logo względem `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Własny tekst stopki/praw autorskich | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Identyfikatory narzędzi do ukrycia, rozdzielone przecinkami | _(puste; wszystkie narzędzia włączone)_ | +| `DISABLE_GITHUB_STARS` | Pomija pobieranie liczby gwiazdek GitHub przy ładowaniu strony i usuwa `api.github.com` z CSP. Buildy Simple Mode zawsze to pomijają. | `false` | +| `SITE_URL` | Publiczny adres URL zapisywany w linkach canonical, hreflang i mapy witryny. Zostaw domyślny, chyba że chcesz, aby wyszukiwarki traktowały Twoje wdrożenie jako osobną witrynę. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Przy własnym `SITE_URL` każda strona jest oznaczana jako `noindex`, aby Twoja kopia nie konkurowała z bentopdf.com w wynikach wyszukiwania. Ustaw `true`, aby pozwolić wyszukiwarkom ją indeksować. | `false` | + +Adresy URL modułów WASM są wstępnie skonfigurowane z domyślnymi CDN, więc wszystkie zaawansowane funkcje działają od razu. Zmień je w środowiskach odciętych od sieci lub przy samodzielnym hostingu. + +### Wyszukiwarki + +Domyślnie każda strona wskazuje wyszukiwarkom bentopdf.com jako oryginał, więc Twoje wdrożenie nie jest widoczne jako duplikat. W prywatnej lub wewnętrznej instancji nie musisz niczego zmieniać. + +- **Całkowicie ukryj swoją instancję w wynikach wyszukiwania:** uruchom kontener z `-e ROBOTS_NOINDEX=true`. Wystarczy restart, bez ponownego budowania. +- **Uczyń swoją instancję osobną witryną w wynikach wyszukiwania:** zbuduj z `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Bez `ALLOW_INDEXING=true` własny `SITE_URL` oznacza każdą stronę jako `noindex`. + +### Content-Security-Policy + +Obraz nginx zawiera egzekwowany nagłówek `Content-Security-Policy`. Dyrektywy CSP `script-src`, `connect-src` i `font-src` są **generowane podczas budowania** na podstawie powyższych zmiennych URL `VITE_*`: wszystkie hosty przekazane przez `--build-arg` są automatycznie dodawane do polityki. + +W rezultacie: + +- Jeśli podczas budowania zmienisz `VITE_CORS_PROXY_URL` lub `VITE_WASM_*_URL`, CSP automatycznie zezwoli na te źródła, bez dodatkowej konfiguracji. +- Dla adresów na `cdn.jsdelivr.net` `script-src` zezwala tylko na dokładny folder pakietu z wersją, na przykład `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, a nie na cały CDN. jsDelivr udostępnia każdy publiczny pakiet npm i repozytorium GitHub, więc zezwolenie na cały host pozwoliłoby uruchomić którykolwiek z nich w Twojej instancji. Adresy na każdym innym hoście są dozwolone według źródła (origin). +- Jeśli własne adresy WASM ustawisz _w czasie działania_ na stronie Ustawienia zaawansowane w aplikacji, te źródła **nie** są w CSP i przeglądarka zablokuje pobieranie z nich. Dotyczy to także innej wersji tego samego pakietu na `cdn.jsdelivr.net`, ponieważ dozwolona jest tylko wersja ustawiona podczas budowania. Konfiguracja w czasie działania służy do eksperymentów; dla trwałych własnych adresów ustaw odpowiedni argument budowania `VITE_*`. +- We wdrożeniach odciętych od sieci, które zmieniają wszystkie trzy wartości `VITE_WASM_*_URL`, foldery pakietów `cdn.jsdelivr.net` są też usuwane z CSP (każda wartość domyślna jest zastępowana, a nie uzupełniana). Domyślne adresy Tesseract OCR na `cdn.jsdelivr.net` zostają w polityce, dopóki nie ustawisz także trzech wartości `VITE_TESSERACT_*`. Podobnie ustawienie `VITE_CORS_PROXY_URL` zastępuje publiczną wartość domyślną `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP zawiera `'unsafe-eval'` w `script-src`, ponieważ środowisko LibreOffice WASM (używane przez narzędzia konwersji Word/Excel/PowerPoint) i biblioteka obrazów wasm-vips (używana przez PDF do TIFF) kompilują wewnętrzny kod dispatch przez `new Function()`. Usunięcie tej wartości zepsułoby te narzędzia. Jeśli budujesz w `SIMPLE_MODE` (bez LibreOffice) i nie potrzebujesz PDF do TIFF, możesz ręcznie edytować wygenerowany `security-headers.conf`, aby usunąć `'unsafe-eval'` i uzyskać ostrzejszą politykę. + +W przypadku OCR zostaw zmienne `VITE_TESSERACT_*` puste, aby używać domyślnych zasobów online, albo ustaw wszystkie trzy razem dla OCR hostowanego samodzielnie lub offline. Częściowe nadpisania OCR są odrzucane, ponieważ worker, środowisko uruchomieniowe i katalog traineddata muszą do siebie pasować. Aby uzyskać w pełni offline przeszukiwalny plik PDF, ustaw też `VITE_OCR_FONT_BASE_URL`, aby czcionki warstwy tekstowej OCR były ładowane z Twojego wewnętrznego serwera, a nie z publicznych adresów czcionek Noto. + +`VITE_DEFAULT_LANGUAGE` ustawia język interfejsu dla nowych odwiedzających. Obsługiwane wartości: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Użytkownicy nadal mogą zmienić język: to zmienia tylko wartość domyślną. + +Przykład: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Własny branding + +Zastąp domyślne logo, nazwę i tekst stopki BentoPDF własnymi. Umieść plik logo w folderze `public/` (lub użyj istniejącego obrazu), a następnie przekaż zmienne brandingu podczas budowania: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Branding działa zarówno w trybie pełnym, jak i w Simple Mode i można go łączyć ze wszystkimi innymi opcjami czasu budowania. + +### Wyłączanie wybranych narzędzi + +Ukryj narzędzia w interfejsie ze względu na wymogi zgodności lub bezpieczeństwa. Wyłączone narzędzia są usuwane ze strony głównej, wyników wyszukiwania, skrótów klawiszowych i kreatora przepływów pracy. Bezpośredni dostęp przez adres URL pokazuje stronę „narzędzie niedostępne”. + +Identyfikatory narzędzi to adres URL strony bez `.html`. Na przykład jeśli narzędzie znajduje się pod `bentopdf.com/edit-pdf.html`, jego identyfikator to `edit-pdf`. + +#### Jak znaleźć identyfikatory narzędzi + +Najłatwiej: otwórz dowolne narzędzie w BentoPDF i spójrz na adres URL. Ostatnia część ścieżki (bez `.html`) to identyfikator narzędzia. + +
+Pełna lista identyfikatorów narzędzi + +**Edycja i adnotacje:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Konwersja do PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Konwersja z PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organizacja i zarządzanie:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optymalizacja i naprawa:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Bezpieczeństwo:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Opcja 1: Podczas budowania (argument budowania Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Lista wyłączonych narzędzi jest wbudowywana w pakiet JavaScript. Zmiana wymaga ponownego zbudowania. + +#### Opcja 2: W czasie działania (config.json) + +Zamontuj plik `config.json` w serwowanym katalogu, bez ponownego budowania: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Albo z Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Obie metody można łączyć: listy są scalane. Jeśli narzędzie występuje w którejkolwiek, jest wyłączone. + +#### Wyłączanie funkcji edytora + +Możesz też wyłączyć wybrane funkcje wewnątrz edytora PDF (np. redagowanie, adnotacje, formularze) bez wyłączania całego edytora. Dodaj `editorDisabledCategories` do swojego `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Pełna lista kategorii edytora + +**Powiększenie:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Adnotacje:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Kształty:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formularze:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Redagowanie:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Dokument:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Strona:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Narzędzia:** `tools`, `pan`, `pointer`, `capture` + +**Zaznaczenie:** `selection`, `selection-copy` + +**Historia:** `history`, `history-undo`, `history-redo` + +
+ +Kategorie są hierarchiczne: wyłączenie kategorii nadrzędnej (np. `annotation`) wyłącza wszystkie jej podkategorie. + +### Wyłączanie licznika gwiazdek GitHub + +Pasek nawigacji pokazuje aktualną liczbę gwiazdek GitHub, pobieraną z `api.github.com` przy ładowaniu strony. To jedyne zewnętrzne żądanie, które nie obsługuje funkcji PDF. Wyłącz je podczas budowania, aby usunąć kod pobierania z pakietu i `api.github.com` z Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Buildy Simple Mode (`bentopdf-simple`) zawsze pomijają licznik gwiazdek: ta flaga jest potrzebna tylko w wersji komercyjnej lub własnych pełnych buildach. + +### Własne adresy WASM (środowiska odcięte od sieci / samodzielny hosting) + +> [!IMPORTANT] +> Adresy WASM są wbudowywane w JavaScript **podczas budowania**. Pliki WASM pobiera **przeglądarka użytkownika** w czasie działania: Docker nie pobiera ich podczas budowania. W sieciach odciętych od internetu musisz hostować pliki WASM na wewnętrznym serwerze dostępnym dla przeglądarek. + +**Pełny proces dla środowiska odciętego od sieci:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Użyj kodów wypisanych przez `bash scripts/prepare-airgap.sh --list-ocr-languages` lub wyszukaj po nazwie za pomocą `bash scripts/prepare-airgap.sh --search-ocr-language ` dla `--ocr-languages`. Gdy budujesz z ograniczonym podzbiorem OCR, przekaż te same kody do `VITE_TESSERACT_AVAILABLE_LANGUAGES`, aby aplikacja pokazywała tylko dołączone języki. Dla pełnego OCR offline hostuj też dołączony katalog `ocr-fonts/` i wskaż go w `VITE_OCR_FONT_BASE_URL`. + +Ustaw zmienną na pusty ciąg, aby wyłączyć dany moduł (użytkownicy muszą wtedy skonfigurować go ręcznie w Ustawieniach zaawansowanych). + +## Własny port + +Domyślnie BentoPDF nasłuchuje na porcie `8080` wewnątrz kontenera. Aby to zmienić, ustaw zmienną środowiskową `PORT` w czasie uruchamiania: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Zmienna | Opis | Domyślnie | +| ------- | ------------------------------------- | --------- | +| `PORT` | Port nasłuchiwania Nginx w kontenerze | `8080` | + +Działa to zarówno ze standardowym Dockerfile, jak i z wersją nonroot. + +## Własny identyfikator użytkownika (PUID/PGID) + +Dla środowisk wymagających uruchamiania jako konkretny użytkownik inny niż root (urządzenia NAS, Kubernetes z kontekstami bezpieczeństwa, zasady organizacji) BentoPDF udostępnia osobny Dockerfile z obsługą PUID/PGID w stylu LSIO. + +### Budowanie i uruchamianie + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Zmienne środowiskowe + +| Zmienna | Opis | Domyślnie | +| -------------- | -------------------------------------------- | --------- | +| `PUID` | Identyfikator użytkownika, jako który działa | `1000` | +| `PGID` | Identyfikator grupy, jako która działa | `1000` | +| `PORT` | Port nasłuchiwania Nginx | `8080` | +| `DISABLE_IPV6` | Wyłącz nasłuchiwanie IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Jak to działa + +Kontener startuje jako root, tworzy użytkownika o podanym PUID/PGID, dostosowuje własność wszystkich katalogów z możliwością zapisu, a następnie obniża uprawnienia za pomocą `su-exec`. Proces nginx działa w całości jako wskazany użytkownik. + +> [!NOTE] +> Standardowy `Dockerfile` używa `nginx-unprivileged` (UID 101) i jest zalecany w większości wdrożeń. Używaj `Dockerfile.nonroot` tylko wtedy, gdy potrzebujesz konkretnego UID/GID. + +> [!WARNING] +> PUID/PGID nie mogą mieć wartości `0` (root). Punkt wejścia waliduje dane i kończy się błędem przy nieprawidłowych wartościach. + +## Z Traefik (reverse proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Z Caddy (reverse proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Plik Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Limity zasobów + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (integracja z systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) pozwala uruchamiać kontenery Podman jako usługi systemd. To idealne rozwiązanie dla wdrożeń produkcyjnych w systemach Linux. + +### Podstawowa konfiguracja Quadlet + +Utwórz plik jednostki kontenera w `~/.config/containers/systemd/bentopdf.container` (użytkownik) lub `/etc/containers/systemd/bentopdf.container` (system): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Włączanie i uruchamianie + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Dla wdrożenia ogólnosystemowego użyj `systemctl` bez flagi `--user` i umieść plik w `/etc/containers/systemd/`. + +### Quadlet z kontrolą stanu + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Automatyczna aktualizacja z Quadlet + +Podman może automatycznie aktualizować kontenery, gdy pojawią się nowe obrazy: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Konfiguracja sieci Quadlet + +Aby skonfigurować własną sieć, utwórz plik sieci `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Następnie odwołaj się do niego w pliku kontenera: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Aktualizacja + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/pl/self-hosting/hostinger.md b/docs/pl/self-hosting/hostinger.md new file mode 100644 index 00000000..42770427 --- /dev/null +++ b/docs/pl/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Wdrożenie na Hostinger + +[Hostinger](https://hostinger.com) to popularny dostawca hostingu współdzielonego. Ten przewodnik opisuje wdrożenie BentoPDF na hostingu współdzielonym Hostinger. + +## Wymagania wstępne + +- Plan hostingowy Hostinger z dostępem do menedżera plików +- Node.js zainstalowany lokalnie do budowania + +## Krok 1: Zbuduj projekt + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Zbudowane pliki znajdą się w folderze `dist`. + +## Krok 2: Wyślij na Hostinger + +### Wdrożenie w domenie głównej + +1. Zaloguj się na swoje konto Hostinger +2. Przejdź do **File Manager** → **public_html** +3. **Usuń** istniejące pliki (w razie potrzeby zrób kopię zapasową) +4. **Wyślij** całą zawartość lokalnego folderu `dist` do `public_html` + +### Wdrożenie w podkatalogu + +Jeśli wdrażasz do podkatalogu (np. `yourdomain.com/pdf-tools/`): + +1. Zbuduj z poprawnym bazowym adresem URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Utwórz folder w Hostinger: + - Przejdź do **File Manager** → **public_html** + - Utwórz nowy folder: `pdf-tools` +3. Wyślij całą zawartość `dist` do `public_html/pdf-tools/` + +## Krok 3: Utwórz plik .htaccess + +Utwórz plik `.htaccess` w katalogu głównym folderu wdrożenia (`public_html` lub `public_html/pdf-tools/`): + +::: warning Ważne +Przy wdrożeniu w podkatalogu zmień `RewriteBase /` na `RewriteBase /pdf-tools/` (lub nazwę swojego folderu). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Przykład .htaccess dla podkatalogu + +Dla `yourdomain.com/pdf-tools/` zaktualizuj te linie: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Rozwiązywanie problemów + +### Pliki WASM się nie ładują + +Upewnij się, że typy MIME są poprawnie ustawione w `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Narzędzia LibreOffice nie działają + +Nagłówki bezpieczeństwa są kluczowe dla SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Jeśli nagłówki nie są stosowane, skontaktuj się z pomocą techniczną Hostinger, aby włączyła `mod_headers`. + +### Błędy 404 po odświeżeniu strony + +Upewnij się, że reguła rozszerzenia `.html` i trasy językowe są poprawnie skonfigurowane. BentoPDF używa statycznych plików HTML, a nie routingu SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limity wysyłania plików + +Hostinger może mieć limity rozmiaru plików. Jeśli wysyłanie zbiorcze zawodzi, wyślij pliki WASM osobno. diff --git a/docs/pl/self-hosting/index.md b/docs/pl/self-hosting/index.md new file mode 100644 index 00000000..a596ac0d --- /dev/null +++ b/docs/pl/self-hosting/index.md @@ -0,0 +1,538 @@ +# Przewodnik self-hostingu + +BentoPDF można hostować na własnej infrastrukturze. Ten przewodnik omawia różne opcje wdrożenia. + +## Szybki start z Docker / Podman + +Najszybszy sposób na self-hosting BentoPDF: + +> [!TIP] +> BentoPDF jest dostępny w dwóch wersjach: +> +> - **Wersja Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Wszystkie narzędzia PDF, **bez** elementów marketingowych (bez hero, FAQ, opinii, stopki). Użyj jej do wdrożeń wewnętrznych, zespołowych i w organizacjach. To **nie** jest okrojona wersja "lite". +> - **Wersja komercyjna**: `ghcr.io/alam00000/bentopdf:latest`. Pełna strona marketingowa, używana przez samo bentopdf.com i przez posiadaczy licencji komercyjnej uruchamiających publiczne wdrożenia. +> +> W razie wątpliwości: pobierz wersję Self-Hosted. + +> [!IMPORTANT] +> Konwersja plików Office wymaga `SharedArrayBuffer`, co oznacza, że aplikacja musi być jednocześnie odizolowana cross-origin i serwowana z bezpiecznego kontekstu. Oficjalny obraz już wysyła wymagane nagłówki COOP/COEP, ale przeglądarki nadal wyłączają `SharedArrayBuffer` na zwykłych adresach HTTP w sieci lokalnej, takich jak `http://192.168.x.x`. +> +> Używaj `http://localhost` tylko do testów na tym samym urządzeniu. Jeśli użytkownicy łączą się z BentoPDF przez adres IP w sieci LAN lub nazwę hosta, zakończ połączenie przez HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Lub z Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Uruchom BentoPDF jako usługę systemd. Utwórz `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Pełną dokumentację Quadlet znajdziesz w [przewodniku wdrożenia Docker](/pl/self-hosting/docker). + +## Budowanie ze źródeł + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Opcje konfiguracji + +### Wersja Self-Hosted (Simple Mode) + +Wersja Self-Hosted (obraz `bentopdf-simple`, zwana też Simple Mode) jest **funkcjonalnie identyczna** z wersją komercyjną: każde narzędzie PDF jest obecne i działa tak samo. Ukrywa tylko elementy marketingowe, które mają sens wyłącznie na samym bentopdf.com lub w komercyjnym, publicznym wdrożeniu. **To nie jest okrojona wersja "lite".** + +**Co ukrywa wersja Self-Hosted** (tylko kosmetycznie, żadne funkcje PDF nie są usuwane): + +- Pasek nawigacji, sekcja hero, sekcja funkcji, FAQ, opinie, stopka +- Zmienia tytuł strony na "Narzędzia PDF" + +**Co zachowuje wersja Self-Hosted** (wszystko, co faktycznie pracuje na PDF): + +- Każde narzędzie PDF (łączenie, dzielenie, edycja, podpisywanie, OCR, konwersja Office itd.) +- Obsługa własnego brandingu, cała konfiguracja czasu budowania i działania + +Wersja komercyjna (`ghcr.io/alam00000/bentopdf:latest`) napędza samo bentopdf.com i jest używana przez posiadaczy licencji komercyjnej uruchamiających publiczne wdrożenia. Dodaje hero, FAQ, opinie i stopkę, które nie miałyby sensu w narzędziu wewnętrznym. + +Jeśli hostujesz BentoPDF dla swojego zespołu, organizacji lub jako narzędzie wewnętrzne, pobierz wersję Self-Hosted: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Szczegóły znajdziesz w [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md). + +### Wersja komercyjna (publiczne wdrożenia z własną marką) + +Wersja komercyjna (obraz `bentopdf`, bez sufiksu `-simple`) napędza samo bentopdf.com. Zawiera pełną stronę marketingową (hero, funkcje, FAQ, opinie, stopka) oraz każde narzędzie PDF. Użyj tej wersji, gdy chcesz **wdrożyć BentoPDF jako publiczną usługę PDF pod własną marką**, na przykład: + +- Uruchamiasz BentoPDF jako hostowaną usługę SaaS dla użytkowników końcowych na własnej domenie +- Chcesz doświadczenia strony docelowej (sekcje marketingowe + narzędzia), a nie samą powierzchnię narzędzi +- Jesteś posiadaczem licencji komercyjnej i osadzasz BentoPDF w komercyjnym produkcie + +**Uruchom bez zmian** (z brandingiem BentoPDF, przydatne do podglądu buildu): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Zbuduj z własną marką** (typowy przepływ komercyjny): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Każda inna opcja czasu budowania (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, nadpisania adresów WASM itd.) działa tak samo jak w wersji Self-Hosted. + +::: warning Licencjonowanie +Uruchamianie wersji komercyjnej jest dozwolone w ramach jednej z dwóch opcji licencyjnych BentoPDF: + +- **AGPL-3.0** (darmowa): dozwolone, jeśli Twoje wdrożenie publikuje cały kod źródłowy na licencji AGPL, w tym modyfikacje brandingu i otaczającą logikę biznesową. +- **Licencja komercyjna** (79 USD dożywotnio): wymagana dla wdrożeń z zamkniętym kodem / własnościowych, w których nie udostępniasz otwarcie forka brandingu ani kodu biznesowego. + +Pełne porównanie znajdziesz na [stronie Licencjonowanie](https://www.bentopdf.com/licensing). Moduły WASM na licencji AGPL (PyMuPDF, Ghostscript, CoherentPDF) ładują się z CDN w czasie działania, więc nie trafiają do Twojego obrazu i nie zmieniają Twojej sytuacji licencyjnej. +::: + +### Base URL + +Wdrożenie w podkatalogu: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Własny branding + +Zastąp domyślne logo BentoPDF, nazwę i tekst stopki własnymi podczas budowania: + +| Zmienna | Opis | Domyślnie | +| ------------------ | ----------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Nazwa marki w nagłówku i stopce | `BentoPDF` | +| `VITE_BRAND_LOGO` | Ścieżka do logo względem `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Własny tekst stopki/praw autorskich | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Lub przez Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Branding działa zarówno w trybie pełnym, jak i Simple Mode, i można go łączyć ze wszystkimi innymi opcjami czasu budowania (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Wyłączanie wybranych narzędzi + +Ukryj wybrane narzędzia ze względów zgodności lub bezpieczeństwa. Wyłączone narzędzia są usuwane ze strony głównej, wyszukiwarki, skrótów, kreatora przepływów i bezpośredniego dostępu przez URL. + +Identyfikatory narzędzi to adres strony bez `.html`. Otwórz dowolne narzędzie i spójrz na adres URL (np. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Czas budowania** (wbudowane w bundle): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Czas działania** (bez przebudowywania, zamontuj `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Obie metody można łączyć, a listy są scalane. + +Możesz też wyłączyć wybrane funkcje w Edytorze PDF (np. redakcję) bez wyłączania całego narzędzia, dodając `editorDisabledCategories` do `config.json`. Pełną listę kategorii znajdziesz w [przewodniku Docker](/pl/self-hosting/docker#wyłaczanie-funkcji-edytora). + +## Przewodniki wdrożenia + +Wybierz swoją platformę: + +- [Vercel](/pl/self-hosting/vercel) +- [Netlify](/pl/self-hosting/netlify) +- [Cloudflare Pages](/pl/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/pl/self-hosting/aws) +- [Hostinger](/pl/self-hosting/hostinger) +- [Nginx](/pl/self-hosting/nginx) +- [Apache](/pl/self-hosting/apache) +- [Docker](/pl/self-hosting/docker) +- [Kubernetes](/pl/self-hosting/kubernetes) +- [CORS Proxy](/pl/self-hosting/cors-proxy) - wymagany dla podpisów cyfrowych + +## Typowe problemy + +### Konwersja Word / ODT / Excel / PowerPoint na PDF zawiesza się (SharedArrayBuffer niedostępny) + +**Objaw**: konwersje dokumentów oparte na LibreOffice (Word, ODT, Excel, PowerPoint na PDF) zawieszają się na ok. 55% lub nie startują. Konsola przeglądarki może pokazywać: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…albo `window.crossOriginIsolated` zwraca `false`, albo kompilacja WASM zgłasza `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Przyczyna**: LibreOffice WASM wymaga `SharedArrayBuffer`, który przeglądarka włącza tylko wtedy, gdy strona jest **odizolowana cross-origin** ORAZ serwowana z **bezpiecznego kontekstu**. Oznacza to, że muszą być spełnione dwa warunki: + +1. Każda odpowiedź zawiera oba nagłówki: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Strona jest serwowana z `https://...` lub `http://localhost`. Zwykły HTTP na adresie IP w sieci LAN (np. `http://192.168.x.x`) NIE jest uznawany za bezpieczny, a przeglądarki wyłączają tam `SharedArrayBuffer`. + +Niezgodność `00 61 73 6d / 1f 8b 08 08` to osobny podobjaw: wstępnie skompresowane pliki `.wasm.gz` / `.data.gz` nie mają nagłówka odpowiedzi `Content-Encoding: gzip`, więc przeglądarka dostaje surowe bajty gzip zamiast rozpakowanego WASM. + +**Rozwiązanie**: dokładną konfigurację znajdziesz w przewodniku dla swojej platformy: + +- [Nginx →](/pl/self-hosting/nginx#podpisz-pdf-lub-wypełnianie-formularzy-pdf-pokazuje-pusty-podglad-bład-mime-mjs) +- [Apache →](/pl/self-hosting/apache#podpisywanie-pdf-lub-wypełnianie-formularzy-pokazuje-pusta-przegladarke-bład-mime-mjs) +- [AWS S3 + CloudFront →](/pl/self-hosting/aws#krok-3b-polityka-nagłowkow-odpowiedzi-wymagana-dla-libreoffice-wasm) +- [Cloudflare Pages →](/pl/self-hosting/cloudflare#plik-konfiguracji) (plik `_headers`) +- [Netlify →](/pl/self-hosting/netlify#konwersja-word-odt-excel-na-pdf-zawiesza-sie-na-55) (`netlify.toml`) +- [Vercel →](/pl/self-hosting/vercel#konwersja-word-odt-excel-na-pdf-nie-działa) (`vercel.json`) +- [Hostinger →](/pl/self-hosting/hostinger#narzedzia-libreoffice-nie-działaja) (`.htaccess`) +- [Kubernetes →](/pl/self-hosting/kubernetes#błedy-typu-mime-dla-mjs-pusty-iframe-podpisz-pdf-wypełnianie-formularzy-pdf) +- **Docker**: obsługiwane automatycznie przez wbudowaną konfigurację nginx, nie trzeba nic robić. + +**Weryfikacja**: otwórz konsolę DevTools na dowolnej stronie BentoPDF i uruchom: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Jeśli strona działa przez HTTPS lub `http://localhost` ORAZ oba nagłówki COEP/COOP są obecne w każdej odpowiedzi, oba testy przejdą. Jeśli jesteś na `http://192.168.x.x` lub innym adresie HTTP spoza pętli zwrotnej, zakończ połączenie przez HTTPS. Nie ma rozwiązania opartego wyłącznie na nagłówkach. + +### Pliki `.mjs` serwowane jako `application/octet-stream` + +**Objaw**: Podpisz PDF / Wypełnianie formularzy PDF / niektóre inne narzędzia pokazują pusty podgląd lub nie ładują się. Konsola przeglądarki zgłasza: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Przyczyna**: Twój serwer WWW lub reverse proxy nie ma mapowania typu MIME dla plików `.mjs` (wbudowana przeglądarka PDF dostarcza moduły ES z tym rozszerzeniem). Wiele standardowych konfiguracji serwerów domyślnie używa `application/octet-stream` dla nierozpoznanych rozszerzeń, a przeglądarki odmawiają wykonania takich plików jako modułów ES. + +**Rozwiązanie**: dokładny fragment znajdziesz w przewodniku dla swojej platformy: + +- [Nginx →](/pl/self-hosting/nginx#podpisz-pdf-lub-wypełnianie-formularzy-pdf-pokazuje-pusty-podglad-bład-mime-mjs) +- [Apache →](/pl/self-hosting/apache#podpisywanie-pdf-lub-wypełnianie-formularzy-pokazuje-pusta-przegladarke-bład-mime-mjs) +- [AWS S3 + CloudFront →](/pl/self-hosting/aws#krok-2-zbuduj-i-wyslij) (zobacz `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/pl/self-hosting/kubernetes#błedy-typu-mime-dla-mjs-pusty-iframe-podpisz-pdf-wypełnianie-formularzy-pdf) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: obsługiwane automatycznie, nie trzeba nic robić. + +**Weryfikacja**: otwórz DevTools → karta Network, znajdź nieudane żądanie `.mjs` i sprawdź nagłówek odpowiedzi `Content-Type`. Powinien mieć wartość `application/javascript`. Jeśli nadal jest `application/octet-stream`, zewnętrzny reverse proxy lub CDN może ponownie wykrywać typ, więc sprawdź każdą warstwę w łańcuchu serwowania. + +## Konfiguracja WASM (komponenty AGPL) + +BentoPDF **nie dołącza** bibliotek przetwarzania na licencji AGPL do swojego kodu źródłowego, ale **wstępnie konfiguruje adresy CDN**, więc wszystkie funkcje działają od razu, bez ręcznej konfiguracji. + +::: tip Domyślnie bez konfiguracji +Od wersji v2.0.0 moduły WASM są wstępnie skonfigurowane do ładowania z CDN jsDelivr przez zmienne środowiskowe. Wszystkie zaawansowane funkcje działają od razu, bez żadnej konfiguracji użytkownika. +::: + +| Komponent | Licencja | Funkcje | +| --------------- | -------- | --------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Konwersja EPUB/MOBI/FB2/XPS, wyodrębnianie obrazów i tabel | +| **Ghostscript** | AGPL-3.0 | Konwersja do PDF/A, kompresja, prostowanie skanów, rasteryzacja | +| **CoherentPDF** | AGPL-3.0 | Spis treści, załączniki, łączenie PDF z zakładkami | + +### Domyślne zmienne środowiskowe + +Są ustawione w `.env.production` i wbudowane w build: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Nadpisywanie adresów WASM + +Możesz nadpisać wartości domyślne podczas budowania dla własnych wdrożeń: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Aby całkowicie wyłączyć moduł (wymagając ręcznej konfiguracji przez użytkownika w Ustawieniach zaawansowanych), ustaw jego zmienną na pusty ciąg. + +Dla OCR albo zostaw wszystkie zmienne `VITE_TESSERACT_*` puste i korzystaj z domyślnych zasobów online, albo ustaw razem adresy worker/core/lang dla self-hostowanego/offline OCR. Jeśli dołączasz tylko wybrane języki OCR, ustaw też `VITE_TESSERACT_AVAILABLE_LANGUAGES` na te same kody oddzielone przecinkami, aby interfejs oferował tylko zainstalowane języki, a nieobsługiwane wybory kończyły się opisowym błędem. Dla w pełni offline'owego wyniku przeszukiwalnego PDF ustaw też `VITE_OCR_FONT_BASE_URL` na wewnętrzny katalog serwujący dołączone czcionki OCR. + +Użytkownicy mogą też w dowolnej chwili nadpisać te wartości w **Ustawieniach zaawansowanych** w interfejsie. Nadpisania zapisane w przeglądarce mają pierwszeństwo przed domyślnymi wartościami środowiska. + +### Wdrożenie w sieci izolowanej / offline + +Dla sieci bez dostępu do internetu (administracja, ochrona zdrowia, finanse itd.). Adresy WASM są wbudowane w JavaScript podczas **budowania**, a same pliki WASM pobiera **przeglądarka użytkownika** w czasie działania. Dlatego wszystko trzeba przygotować na maszynie z internetem, a potem przenieść do izolowanej sieci. + +#### Skrypt automatyczny (zalecany) + +Dołączony skrypt `prepare-airgap.sh` automatyzuje cały proces: pobiera pakiety WASM, buduje obraz Docker i tworzy samodzielny pakiet ze skryptem instalacyjnym. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Powstaje katalog pakietu: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Przenieś pakiet do izolowanej sieci przez USB, wewnętrzne repozytorium artefaktów lub zatwierdzoną metodę. Następnie uruchom dołączony skrypt instalacyjny: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Skrypt instalacyjny wczytuje obraz Docker, wypakowuje pliki WASM i opcjonalnie uruchamia kontener. + +**Opcje skryptu:** + +| Flaga | Opis | Domyślnie | +| ------------------------------ | -------------------------------------------------------- | -------------------------------- | +| `--wasm-base-url ` | Gdzie pliki WASM będą hostowane wewnętrznie | _(wymagane, pytanie jeśli brak)_ | +| `--image-name ` | Tag obrazu Docker | `bentopdf` | +| `--output-dir ` | Katalog wyjściowy pakietu | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Włącz Simple Mode | wyłączone | +| `--base-url ` | Bazowy URL podkatalogu (np. `/pdf/`) | `/` | +| `--language ` | Domyślny język interfejsu (np. `fr`, `de`) | _(brak)_ | +| `--brand-name ` | Własna nazwa marki | _(brak)_ | +| `--brand-logo ` | Ścieżka do logo względem `public/` | _(brak)_ | +| `--footer-text ` | Własny tekst stopki | _(brak)_ | +| `--ocr-languages ` | Języki OCR do dołączenia, oddzielone przecinkami | `eng` | +| `--list-ocr-languages` | Wypisz obsługiwane kody i nazwy OCR, a następnie zakończ | wyłączone | +| `--search-ocr-language ` | Szukaj kodów OCR po nazwie lub skrócie | wyłączone | +| `--dockerfile ` | Używany Dockerfile | `Dockerfile` | +| `--skip-docker` | Pomiń budowanie i eksport Docker | wyłączone | +| `--skip-wasm` | Pomiń pobieranie WASM (użyj istniejących plików `.tgz`) | wyłączone | + +Interaktywny monit akceptuje też `list`, aby wypisać pełną listę obsługiwanych kodów Tesseract, oraz `search `, aby znaleźć dopasowania, np. `search german` lub `search chi`. + +::: warning Wymóg tego samego źródła +Pliki WASM muszą być serwowane z **tego samego źródła (origin)** co aplikacja BentoPDF. Web Workery używają `importScripts()`, które nie może ładować skryptów cross-origin. Na przykład, jeśli BentoPDF działa pod `https://internal.example.com`, bazowy adres WASM powinien być również `https://internal.example.com/wasm`. +::: + +#### Kroki ręczne + +
+Jeśli wolisz zrobić to ręcznie, bez skryptu + +**Krok 1: Pobierz pakiety WASM i OCR** (na maszynie z internetem) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Krok 2: Zbuduj obraz Docker z wewnętrznymi adresami** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Krok 3: Wyeksportuj obraz Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Krok 4: Przenieś do izolowanej sieci** + +Skopiuj przez USB, wewnętrzne repozytorium artefaktów lub zatwierdzoną metodę transferu: + +- `bentopdf.tar`: obraz Docker +- Pięć pakietów `.tgz` WASM/OCR z kroku 1 +- Katalog `tesseract-langdata/` z kroku 1 +- Katalog `ocr-fonts/` z kroku 1 + +**Krok 5: Skonfiguruj wewnątrz izolowanej sieci** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Upewnij się, że pliki są dostępne pod adresami skonfigurowanymi w kroku 2, w tym `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` i `.../ocr/fonts`. + +
+ +::: info Budujesz ze źródeł zamiast w Dockerze? +Ustaw zmienne w `.env.production` przed uruchomieniem `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Hostowanie własnego proxy WASM + +Jeśli musisz serwować pliki WASM na licencji AGPL z odpowiednimi nagłówkami CORS, możesz wdrożyć proste proxy. Przykładową implementację znajdziesz w [przewodniku Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md). + +::: tip Dlaczego osobno? +To rozdzielenie zapewnia: + +- Jasną zgodność prawną dla użytkowników komercyjnych +- Rdzeń BentoPDF pozostaje na podwójnej licencji (AGPL-3.0 / komercyjna) +- Pliki WASM są ładowane w czasie działania, a nie dołączane do źródeł + ::: + +## Wymagania systemowe + +| Wymaganie | Minimum | +| --------- | ----------------------------------- | +| Miejsce | ok. 100 MB (rdzeń bez modułów AGPL) | +| RAM | 512 MB | +| CPU | Dowolny nowoczesny procesor | + +::: tip +BentoPDF to statyczna strona, więc nie jest potrzebna baza danych ani serwer backendowy! +::: diff --git a/docs/pl/self-hosting/kubernetes.md b/docs/pl/self-hosting/kubernetes.md new file mode 100644 index 00000000..42982a68 --- /dev/null +++ b/docs/pl/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Wdrożenie na Kubernetes + +Kubernetes może być przesadą dla statycznej strony, ale świetnie sprawdzi się, jeśli standaryzujesz wszystko na Helm + GitOps. + +> [!IMPORTANT] +> **Wymagane nagłówki dla konwersji plików Office** +> +> Narzędzia oparte na LibreOffice (konwersja Word, Excel, PowerPoint) wymagają tych nagłówków HTTP dla obsługi `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Oficjalne obrazy nginx BentoPDF zawierają te nagłówki. W Kubernetes **kontrolery Ingress/Gateway także są reverse proxy**, więc upewnij się, że nagłówki są zachowywane (lub dodaj je na brzegu). + +## Wymagania wstępne + +- Klaster Kubernetes +- Helm v3 +- Obraz nginx BentoPDF (np. `ghcr.io/alam00000/bentopdf:`) serwujący na **porcie 8080** + +## Wdrożenie z Helm + +### Instalacja z tego repozytorium (lokalny chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Instalacja z GHCR (chart OCI) + +Jeśli chart jest opublikowany w GHCR jako artefakt OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Udostępnianie + +### Port-forward (szybki test) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (opcjonalnie) + +Włącz Ingress (przykład dla nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (opcjonalnie) + +Ten chart obsługuje Gateway API `Gateway` + `HTTPRoute`. + +Przykład (operator Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Upewnianie się, że nagłówki SharedArrayBuffer nadal działają (Ingress/Gateway) + +### Co "powinno" się dziać + +Konfiguracja nginx BentoPDF ustawia wymagane nagłówki odpowiedzi. Większość kontrolerów Ingress/Gateway **przekazuje nagłówki odpowiedzi z upstreamu bez zmian**. + +### Co może to zepsuć + +- Polityka kontrolera lub brzegu, która **nadpisuje** lub **usuwa** nagłówki odpowiedzi +- Middleware "security headers", które ustawia inne wartości COOP/COEP + +### Jak sprawdzić + +Uruchom to na swoim publicznym adresie: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Powinieneś zobaczyć: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Jeśli Twój kontroler Ingress ich nie zachowuje + +Dodaj nagłówki na brzegu (zależnie od kontrolera). Przykład dla **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Błędy typu MIME dla `.mjs` (pusty iframe Podpisz PDF / Wypełnianie formularzy PDF) + +Jeśli konsola przeglądarki pokazuje `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` przy żądaniu `.mjs`, kontroler Ingress/Gateway przed nginx BentoPDF zastępuje nagłówek `Content-Type` z upstreamu wartością `application/octet-stream`. + +Nginx w obrazie BentoPDF już serwuje `.mjs` jako `application/javascript`. Rozwiązaniem jest powstrzymanie kontrolera przed usuwaniem lub zastępowaniem tego nagłówka. Dla nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Możesz też użyć filtra `ResponseHeaderModifier` w Gateway API, aby ustawić `Content-Type: application/javascript` dla ścieżek `.mjs`. Zweryfikuj w DevTools → karta Network: nieudane żądanie `.mjs` powinno teraz pokazywać `content-type: application/javascript`. + +### Jeśli używasz Gateway API i chcesz wymusić dodanie nagłówków + +Gateway API obsługuje filtr `ResponseHeaderModifier`. Możesz go dołączyć w `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Obsługa konkretnych filtrów zależy od Twojego kontrolera Gateway. Jeśli filtr jest ignorowany, dodaj nagłówki na warstwie brzegu/kontrolera. + +## Wyłączanie wybranych narzędzi + +Użyj ConfigMap, aby wyłączyć narzędzia w czasie działania, bez przebudowywania obrazu: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Zamontuj go w serwowanym katalogu: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Identyfikatory narzędzi to adres strony bez `.html`. Otwórz dowolne narzędzie i spójrz na adres URL (np. `edit-pdf`, `merge-pdf`, `compress-pdf`). Wyłączone narzędzia są ukryte na stronie głównej, w wyszukiwarce, skrótach, kreatorze przepływów i przy bezpośrednim dostępie przez URL. Pełną listę opcji znajdziesz w [przewodniku Docker](/pl/self-hosting/docker#wyłaczanie-wybranych-narzedzi). diff --git a/docs/pl/self-hosting/netlify.md b/docs/pl/self-hosting/netlify.md new file mode 100644 index 00000000..bdeb0632 --- /dev/null +++ b/docs/pl/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Wdrożenie na Netlify + +[Netlify](https://netlify.com) zapewnia świetny hosting statycznych stron z hojnym darmowym planem. + +## Wdrożenie jednym kliknięciem + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Wdrożenie ręczne + +### Krok 1: Połącz repozytorium + +1. Zaloguj się do [Netlify](https://app.netlify.com) +2. Kliknij "Add new site" → "Import an existing project" +3. Połącz swoje konto GitHub +4. Wybierz swój fork BentoPDF + +### Krok 2: Skonfiguruj ustawienia budowania + +| Ustawienie | Wartość | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Krok 3: Wdróż + +Kliknij "Deploy site" i poczekaj na zakończenie budowania. + +## Plik konfiguracyjny + +Utwórz `netlify.toml` w katalogu głównym projektu: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Ważne +Nagłówki `Cross-Origin-Embedder-Policy` i `Cross-Origin-Opener-Policy` są wymagane do konwersji Word/ODT/Excel/PowerPoint na PDF. Bez nich `SharedArrayBuffer` jest niedostępny, a silnik LibreOffice WASM nie uruchomi się. + +Nagłówki `Content-Encoding: gzip` przy plikach `.wasm.gz` i `.data.gz` informują przeglądarkę, że ma je automatycznie rozpakować. Bez nich przeglądarka otrzymuje surowe bajty gzip, a kompilacja WASM kończy się błędem. +::: + +## Zmienne środowiskowe + +Ustaw je w Site settings → Environment variables: + +| Zmienna | Opis | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Ustaw na `true` dla minimalnego builda | +| `VITE_BRAND_NAME` | Własna nazwa marki (zastępuje "BentoPDF") | +| `VITE_BRAND_LOGO` | Ścieżka do logo względem `public/` (np. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Własny tekst stopki/praw autorskich | +| `VITE_DEFAULT_LANGUAGE` | Domyślny język interfejsu (np. `fr`, `de`, `es`) | + +## Własna domena + +1. Przejdź do Site settings → Domain management +2. Kliknij "Add custom domain" +3. Postępuj zgodnie z instrukcjami konfiguracji DNS + +## Duże pliki multimedialne + +Dla dużych plików WASM rozważ włączenie [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Rozwiązywanie problemów + +### Konwersja Word/ODT/Excel na PDF zawiesza się na 55% + +Jeśli konwersje dokumentów zawieszają się na 55%, otwórz konsolę DevTools i sprawdź: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Jeśli `crossOriginIsolated` ma wartość `false`, nagłówki COEP/COOP z Twojego `netlify.toml` nie są stosowane. Upewnij się, że plik jest w katalogu głównym projektu, i wdróż ponownie. + +Jeśli w konsoli widzisz `expected magic word 00 61 73 6d, found 1f 8b 08 08`, pliki `.wasm.gz` nie mają nagłówków `Content-Encoding: gzip`. Upewnij się, że bloki `[[headers]]` dla `soffice.wasm.gz` i `soffice.data.gz` znajdują się w Twoim `netlify.toml`. + +### Budowanie kończy się błędem + +Sprawdź zgodność wersji Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Wolne pierwsze ładowanie + +Włącz optymalizację zasobów w Site settings → Build & deploy → Asset optimization. diff --git a/docs/pl/self-hosting/nginx.md b/docs/pl/self-hosting/nginx.md new file mode 100644 index 00000000..3d437664 --- /dev/null +++ b/docs/pl/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Wdrożenie z Nginx + +Hostuj BentoPDF na własnym serwerze za pomocą Nginx. + +## Wymagania wstępne + +- Serwer Ubuntu/Debian +- Zainstalowany Nginx +- Certyfikat SSL (zalecany: Let's Encrypt) + +## Krok 1: Zbuduj projekt + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Aby dostosować branding, ustaw zmienne środowiskowe przed budowaniem: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Krok 2: Skopiuj pliki + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Krok 3: Konfiguracja Nginx + +Utwórz `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Krok 4: Włącz witrynę + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Krok 5: SSL z Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Wdrożenie w podkatalogu + +Aby hostować pod `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Zbuduj z: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Dostrajanie wydajności + +Dodaj do `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Rozwiązywanie problemów + +### WASM się nie ładuje + +Upewnij się, że typ MIME jest ustawiony: + +```nginx +types { + application/wasm wasm; +} +``` + +### Podpisz PDF lub Wypełnianie formularzy PDF pokazuje pusty podgląd (błąd MIME `.mjs`) + +Jeśli konsola przeglądarki pokazuje: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…a nieudane żądanie kończy się na `.mjs`, w Twoim nginx brakuje mapowania `.mjs → application/javascript`. Wbudowana przeglądarka PDF (używana przez Podpisz PDF, Wypełnianie formularzy PDF i kilka innych narzędzi) dostarcza moduły ES z rozszerzeniem `.mjs`, a standardowy `mime.types` w nginx domyślnie ich nie zawiera. + +Napraw to, dodając `mjs` do istniejącej linii `application/javascript` w `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> NIE dodawaj _drugiej_ linii `application/javascript`. Nginx parsuje `mime.types` linia po linii i działa tylko jedno mapowanie typu na rozszerzenie, więc druga linia jest w niektórych wersjach po cichu ignorowana. Edytuj istniejącą linię, dodając `mjs` obok `js`. + +Możesz też nadpisać to lokalnie w bloku server (bez edycji pliku globalnego): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Po zmianie przeładuj nginx: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Aby potwierdzić: w DevTools → karta Network znajdź nieudane żądanie `.mjs` i sprawdź nagłówek odpowiedzi `Content-Type`. Powinien mieć teraz wartość `application/javascript`, a nie `application/octet-stream`. + +### Konwersja Word/ODT/Excel na PDF nie działa + +LibreOffice WASM wymaga `SharedArrayBuffer`, a to wymaga nagłówków `Cross-Origin-Embedder-Policy` i `Cross-Origin-Opener-Policy`. Potrzebny jest też bezpieczny kontekst, więc `http://localhost` działa w lokalnych testach, ale `http://192.168.x.x` i inne adresy IP w sieci LAN zwykle wymagają HTTPS. Pamiętaj, że dyrektywy nginx `add_header` w bloku `location` **nadpisują** dyrektywy `add_header` z poziomu serwera, a nie łączą się z nimi. Każdy blok `location` z własnym `add_header` musi zawierać nagłówki COEP/COOP. + +Zweryfikuj poleceniem: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Jeśli przed nginx stoi reverse proxy, upewnij się, że zachowuje te nagłówki. + +### 502 Bad Gateway + +Sprawdź logi błędów Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/pl/self-hosting/vercel.md b/docs/pl/self-hosting/vercel.md new file mode 100644 index 00000000..2346bda9 --- /dev/null +++ b/docs/pl/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Wdrożenie na Vercel + +[Vercel](https://vercel.com) oferuje najprostszy sposób wdrażania statycznych stron. + +## Wdrożenie jednym kliknięciem + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Wdrożenie ręczne + +### Krok 1: Zrób fork repozytorium + +Zrób fork [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) na swoje konto GitHub. + +### Krok 2: Zaimportuj do Vercel + +1. Przejdź do [vercel.com/new](https://vercel.com/new) +2. Wybierz swój fork repozytorium +3. Skonfiguruj projekt: + +| Ustawienie | Wartość | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Krok 3: Zmienne środowiskowe (opcjonalnie) + +Dodaj je, jeśli są potrzebne: + +| Zmienna | Opis | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Ustaw na `true` dla minimalnego interfejsu | +| `VITE_BRAND_NAME` | Własna nazwa marki (zastępuje "BentoPDF") | +| `VITE_BRAND_LOGO` | Ścieżka do logo względem `public/` (np. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Własny tekst stopki/praw autorskich | +| `VITE_DEFAULT_LANGUAGE` | Domyślny język interfejsu (np. `fr`, `de`, `es`) | + +### Krok 4: Wdróż + +Kliknij "Deploy" i poczekaj na zakończenie budowania. + +## Własna domena + +1. Przejdź do ustawień projektu +2. Otwórz "Domains" +3. Dodaj swoją domenę +4. Skonfiguruj DNS zgodnie z instrukcjami + +## Ograniczenia + +::: warning Duże pliki +Funkcje serverless Vercel mają limit 50 MB. Ponieważ BentoPDF jest statyczną stroną, nie powinno to na Ciebie wpłynąć, ale moduły WASM są duże (łącznie ok. 100 MB). Upewnij się, że są serwowane z folderu `/public`. +::: + +## Rozwiązywanie problemów + +### Przekroczenie czasu budowania + +Jeśli budowanie przekracza limit czasu, spróbuj: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Błąd 404 po odświeżeniu + +Dodaj plik `vercel.json` dla routingu SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Konwersja Word/ODT/Excel na PDF nie działa + +Konwersje LibreOffice WASM wymagają `SharedArrayBuffer`, a to wymaga tych nagłówków odpowiedzi na wszystkich stronach: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Wstępnie skompresowane pliki `.wasm.gz` i `.data.gz` potrzebują też nagłówka `Content-Encoding: gzip`, aby przeglądarka je rozpakowała. + +Dodaj je do swojego `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Aby to zweryfikować, otwórz konsolę DevTools i uruchom `console.log(window.crossOriginIsolated)`. Powinno zwrócić `true`. diff --git a/docs/pl/tools/add-attachments.md b/docs/pl/tools/add-attachments.md new file mode 100644 index 00000000..55c2222a --- /dev/null +++ b/docs/pl/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Dodaj załączniki +description: Osadzaj pliki dowolnego typu w PDF na poziomie dokumentu lub dołączone do wybranych stron. +--- + +# Dodaj załączniki + +Osadź jeden lub więcej plików bezpośrednio w dokumencie PDF. Załączniki można dodać na poziomie dokumentu (widoczne w panelu załączników każdej przeglądarki PDF) lub powiązać z wybranymi stronami. + +## Jak to działa + +1. Wgraj plik PDF, do którego chcesz dołączyć pliki. +2. W strefie upuszczania załączników wybierz pliki do osadzenia (dowolnego typu). +3. Wybierz poziom załącznika: **Dokument** (domyślnie) lub **Strona**. +4. Jeśli wybierzesz poziom strony, wpisz zakres stron (np. `1-3` lub `5`). +5. Kliknij przycisk przetwarzania. Zmodyfikowany PDF zostanie pobrany z osadzonymi plikami. + +## Funkcje + +- Załączaj pliki dowolnego typu: obrazy, arkusze kalkulacyjne, archiwa, pliki wykonywalne, cokolwiek +- Umieszczanie załączników na poziomie dokumentu lub strony +- Wiele plików w jednej operacji +- Wyświetla nazwy i rozmiary wszystkich wybranych załączników +- Wynik zachowuje oryginalną zawartość PDF z dodanymi osadzonymi plikami + +## Opcje + +| Opcja | Opis | +| -------------------- | ---------------------------------------------------------------- | +| **Poziom dokumentu** | Dołącza pliki do całego PDF, dostępne w panelu załączników | +| **Poziom strony** | Dołącza pliki do wybranych stron, określonych przez zakres stron | + +## Przypadki użycia + +- Dołączanie danych źródłowych (pliki Excel, CSV) do raportu PDF +- Załączanie oryginalnych plików obrazów do portfolio fotograficznego w PDF +- Osadzanie dokumentów pomocniczych w umowie lub ofercie +- Dodawanie materiałów uzupełniających do wybranych stron podręcznika szkoleniowego + +## Wskazówki + +- Załączniki na poziomie dokumentu są najszerzej obsługiwane przez przeglądarki PDF. Załączniki na poziomie strony mogą nie być widoczne we wszystkich przeglądarkach. +- Nie ma limitu rozmiaru załączników, ale bardzo duże osadzone pliki proporcjonalnie zwiększą rozmiar PDF. + +## Powiązane narzędzia + +- [Wyodrębnij załączniki](./extract-attachments) +- [Edytuj załączniki](./edit-attachments) +- [Połącz PDF](./merge-pdf) diff --git a/docs/pl/tools/add-blank-page.md b/docs/pl/tools/add-blank-page.md new file mode 100644 index 00000000..70cc16ee --- /dev/null +++ b/docs/pl/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Dodaj pustą stronę +description: Wstaw jedną lub więcej pustych stron w dowolnym miejscu dokumentu PDF. +--- + +# Dodaj pustą stronę + +Wstaw puste strony do PDF w wybranym miejscu. Sam decydujesz, gdzie trafią puste strony i ile ich dodać. + +## Jak to działa + +1. Wgraj plik PDF. Narzędzie wyświetli liczbę stron. +2. Wpisz **pozycję**, w której mają zostać wstawione puste strony. Użyj `0`, aby wstawić na samym początku, lub łącznej liczby stron, aby dodać na końcu. +3. Wpisz **liczbę** pustych stron do dodania (domyślnie 1). +4. Kliknij przycisk przetwarzania. Zmodyfikowany PDF zostanie pobrany z wstawionymi pustymi stronami. + +## Funkcje + +- Wstawianie w dowolnym miejscu: na początku, w środku lub na końcu dokumentu +- Dodawanie wielu pustych stron w jednej operacji +- Podpowiedź pozycji aktualizuje się dynamicznie na podstawie liczby stron wgranego PDF +- Puste strony w standardowym rozmiarze A4 + +## Przypadki użycia + +- Dodawanie pustej strony rozdzielającej sekcje w złożonym dokumencie +- Wstawianie pustych stron dla wyrównania przy druku dwustronnym +- Dodawanie miejsca na odręczne notatki w drukowanym przewodniku do nauki +- Dopełnianie dokumentu do wymaganej minimalnej liczby stron + +## Wskazówki + +- Pozycja `0` wstawia przed pierwszą stroną. Pozycja równa łącznej liczbie stron dodaje po ostatniej stronie. +- Jeśli chcesz wstawić zawartość (a nie tylko puste strony) w określonym miejscu, użyj [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool), aby wstawić inny PDF po wybranej stronie. + +## Powiązane narzędzia + +- [Duplikuj i organizuj](./organize-pdf) +- [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool) +- [Połącz PDF](./merge-pdf) diff --git a/docs/pl/tools/add-page-labels.md b/docs/pl/tools/add-page-labels.md new file mode 100644 index 00000000..8b049bc1 --- /dev/null +++ b/docs/pl/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Dodaj etykiety stron +description: Dodawaj etykiety stron PDF z cyframi rzymskimi, prefiksami literowymi, własną numeracją i wieloma regułami na dokument. +--- + +# Dodaj etykiety stron + +Etykiety stron określają, jak numery stron są wyświetlane w przeglądarkach PDF (numer widoczny na pasku narzędzi, a nie wydrukowany na stronie). To narzędzie pozwala przypisać różne schematy etykietowania różnym zakresom stron: cyfry rzymskie dla części wstępnej, liczby dziesiętne dla treści głównej, aneksy oznaczone literami i więcej. + +## Jak to działa + +1. Wgraj plik PDF. +2. Pojawi się panel opcji z jedną domyślną regułą etykiet. +3. Skonfiguruj każdą regułę: zakres stron, styl, opcjonalny prefiks i wartość początkowa. +4. Kliknij **Dodaj regułę**, aby utworzyć kolejne reguły dla różnych sekcji. +5. Kliknij **Dodaj etykiety stron**, aby zastosować wszystkie reguły i pobrać wynik. + +## Opcje + +Każda reguła etykiet ma te ustawienia: + +- **Zakres stron**: strony, których dotyczy reguła. Zostaw puste dla wszystkich stron. Obsługuje zakresy takie jak `1-4`, `7`, `odd` lub `1-9,30-40`. +- **Styl etykiety**: dziesiętne arabskie, małe cyfry rzymskie (i, ii, iii), wielkie cyfry rzymskie (I, II, III), małe litery (a, b, c), wielkie litery (A, B, C) lub brak etykiety (tylko prefiks). +- **Prefiks etykiety**: opcjonalny tekst dodawany przed każdą etykietą, np. "A-", aby uzyskać etykiety A-1, A-2, A-3. +- **Wartość początkowa**: liczba, od której zaczyna się numeracja. Domyślnie 1. Ustaw 0 dla numeracji od zera. +- **Kontynuuj numerację w rozłącznych zakresach**: włącz, gdy reguła obejmuje strony nieciągłe (jak `1-9,30-40` lub `odd`), a chcesz, by numeracja biegła dalej po kolei. +- **Usuń istniejące etykiety stron**: domyślnie zaznaczone. Czyści wszelkie poprzednie etykiety przed zastosowaniem nowych reguł. + +## Funkcje + +- Wiele reguł etykiet na dokument dla złożonych schematów numeracji +- Sześć stylów etykiet obejmujących wszystkie standardowe systemy numeracji +- Własny prefiks do etykietowania według sekcji +- Obsługa rozłącznych zakresów z numeracją ciągłą +- Możliwość zachowania lub usunięcia istniejących etykiet + +## Przypadki użycia + +- Ustawianie etykiet cyframi rzymskimi (i, ii, iii) dla przedmowy książki i dziesiętnych dla tekstu głównego +- Etykietowanie stron aneksów prefiksami literowymi, takimi jak "A-1", "A-2", "B-1", "B-2" +- Poprawianie etykiet stron w zeskanowanym dokumencie, w którym fizyczne numery stron nie zgadzają się z kolejnością stron PDF +- Dodawanie numeracji od zera w dokumentach technicznych + +## Wskazówki + +- Etykiety stron to metadane, które przeglądarki PDF wyświetlają na pasku nawigacji. Nie są drukowane na samej stronie. Dla widocznych numerów użyj narzędzia [Numery stron](./page-numbers). +- To narzędzie wymaga skonfigurowania CoherentPDF (CPDF) w ustawieniach WASM. Jeśli nie jest skonfigurowany, zostaniesz poproszony o konfigurację. + +## Powiązane narzędzia + +- [Numery stron](./page-numbers) +- [Numeracja Batesa](./bates-numbering) +- [Edytuj zakładki](./bookmark) diff --git a/docs/pl/tools/add-stamps.md b/docs/pl/tools/add-stamps.md new file mode 100644 index 00000000..a28427aa --- /dev/null +++ b/docs/pl/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Dodaj pieczątki +description: Dodawaj pieczątki z obrazów do stron PDF za pomocą zintegrowanego paska adnotacji z podpisem użytkownika. +--- + +# Dodaj pieczątki + +Umieszczaj pieczątki z obrazów na stronach PDF za pomocą wbudowanej przeglądarki z paskiem adnotacji pieczątek. Pieczątki mogą zawierać Twoje imię i nazwisko jako autorstwo, co przydaje się w procesach zatwierdzania, recenzji i oznaczania dokumentów. + +## Jak to działa + +1. Wpisz swoje imię i nazwisko w polu **Nazwa użytkownika pieczątki**. Ta nazwa pojawi się na tworzonych przez Ciebie pieczątkach. +2. Wgraj plik PDF, klikając lub przeciągając go do strefy upuszczania. +3. Otworzy się edytor pieczątek z załadowanym dokumentem w przeglądarce. +4. Użyj narzędzia pieczątki z obrazu na pasku narzędzi, aby wybrać i umieścić pieczątki na dowolnej stronie. +5. Ustaw pozycję i zmień rozmiar pieczątek według potrzeb. +6. Kliknij **Zapisz PDF z pieczątkami**, aby pobrać wynik. + +## Funkcje + +- Zintegrowana przeglądarka PDF z paskiem adnotacji dla pieczątek +- Podpis użytkownika na tworzonych pieczątkach +- Umieszczanie pieczątek z obrazów na dowolnej stronie +- Pozycjonowanie i zmiana rozmiaru metodą przeciągnij i upuść +- Automatyczne dopasowanie rozmiaru przeglądarki do proporcji strony +- Wyświetlanie nazwy i rozmiaru pliku + +## Przypadki użycia + +- Dodawanie pieczątek "ZATWIERDZONO" lub "ZRECENZOWANO" z obrazów do dokumentów w procesie recenzji +- Umieszczanie obrazów pieczęci firmowej lub notarialnej na oficjalnych dokumentach +- Oznaczanie stron pieczątkami "OTRZYMANO" z imieniem i nazwiskiem recenzenta +- Dodawanie pieczątek kontroli jakości do raportów z inspekcji + +## Wskazówki + +- Ustaw nazwę użytkownika pieczątki przed wgraniem PDF. Nazwa jest osadzana w metadanych pieczątki. +- Przeglądarka dopasowuje wysokość do proporcji pierwszej strony PDF, aby zapewnić optymalny podgląd. +- Jeśli zamiast pieczątek z obrazów potrzebujesz znaków wodnych z tekstem, użyj narzędzia [Dodaj znak wodny](./add-watermark). + +## Powiązane narzędzia + +- [Podpisz PDF](./sign-pdf) +- [Dodaj znak wodny](./add-watermark) +- [Edytor PDF](./edit-pdf) diff --git a/docs/pl/tools/add-watermark.md b/docs/pl/tools/add-watermark.md new file mode 100644 index 00000000..0846b7f3 --- /dev/null +++ b/docs/pl/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Dodaj znak wodny +description: Nanoś tekstowe lub obrazowe znaki wodne na strony PDF w wizualnym edytorze przeciągnij i upuść z podglądem na żywo. +--- + +# Dodaj znak wodny + +Dodawaj tekstowe lub obrazowe znaki wodne do stron PDF za pomocą wizualnego edytora. Możesz ustawić pozycję znaku wodnego, przeciągając go bezpośrednio na podglądzie, zmieniać rozmiar uchwytami w rogach oraz konfigurować krycie, obrót, czcionkę i kolor. Każda strona może mieć własną pozycję znaku wodnego albo możesz zastosować ten sam znak wodny do wszystkich stron naraz. + +## Jak to działa + +1. Wgraj plik PDF. +2. Otworzy się edytor z podglądem pierwszej strony na żywo i przeciągalną nakładką znaku wodnego. +3. Wybierz tryb znaku wodnego **Tekst** lub **Obraz** przyciskami przełącznika. +4. Skonfiguruj ustawienia znaku wodnego w panelu bocznym. +5. Przeciągnij znak wodny na podglądzie dokładnie tam, gdzie chcesz. Użyj uchwytów w rogach, aby zmienić rozmiar. +6. Przechodź między stronami, aby ustawić znaki wodne dla poszczególnych stron, lub pozostaw zaznaczone **Zastosuj do wszystkich stron**. +7. Kliknij **Dodaj znak wodny**, aby przetworzyć i pobrać. + +## Opcje + +**Ustawienia tekstowego znaku wodnego:** + +- **Tekst**: tekst znaku wodnego (np. "POUFNE", "WERSJA ROBOCZA"). +- **Rozmiar czcionki**: od 10 do 200 punktów. Domyślnie 72. +- **Kolor**: dowolny kolor z próbnika kolorów. +- **Krycie**: steruj przezroczystością od całkowicie przezroczystego do w pełni kryjącego. +- **Obrót**: obracaj tekst znaku wodnego od -180 do 180 stopni. + +**Ustawienia obrazowego znaku wodnego:** + +- **Wgranie obrazu**: wgraj plik PNG, JPG lub inny obraz, który posłuży jako znak wodny. +- **Krycie**: steruj przezroczystością obrazu. +- **Skala**: zmieniaj rozmiar obrazowego znaku wodnego. + +**Ustawienia układu:** + +- **Pojedynczy**: jeden znak wodny na stronę, ustawiany przeciąganiem lub gotowymi pozycjami. +- **Kafelki**: powtarza znak wodny na całej stronie w ukośnej siatce zgodnej z kątem obrotu, dzięki czemu znak pokrywa dokument od krawędzi do krawędzi. +- **Odstęp poziomy**: odstęp między kafelkami wzdłuż kierunku tekstu, jako procent szerokości znaku wodnego (tylko tryb kafelków). +- **Odstęp pionowy**: odstęp między rzędami kafelków, jako procent wysokości znaku wodnego (tylko tryb kafelków). + +**Ustawienia ogólne:** + +- **Zastosuj do wszystkich stron**: gdy zaznaczone, ten sam znak wodny trafia na każdą stronę. Odznacz, aby ustawić osobne znaki wodne dla poszczególnych stron. +- **Zakres stron**: określ, które strony dostaną znak wodny (np. "1-3, 5, 7-9" lub "all"). + +## Funkcje + +- Wizualne pozycjonowanie metodą przeciągnij i upuść na podglądzie PDF na żywo +- Znak wodny ze zmianą rozmiaru uchwytami w rogach +- Tryby tekstowego i obrazowego znaku wodnego +- Układ pojedynczy lub kafelkowy (powtarzany) na całej stronie z regulowanym odstępem +- Znak wodny dla poszczególnych stron lub globalny +- Nawigacja strona po stronie w podglądzie +- Sterowanie kryciem i obrotem +- Filtrowanie według zakresu stron + +## Przypadki użycia + +- Oznaczanie dokumentów roboczych napisem "WERSJA ROBOCZA" przed rozesłaniem do recenzji +- Dodawanie znaków wodnych "POUFNE" do wrażliwych raportów finansowych +- Brandowanie dokumentów obrazowym znakiem wodnym z logo firmy +- Nanoszenie napisu "PRÓBKA" na dokumentację produktów udostępnianą potencjalnym klientom +- Dodawanie informacji o prawach autorskich do rozpowszechnianych materiałów PDF + +## Wskazówki + +- Dla ukośnych znaków wodnych na całej stronie ustaw obrót około 45 stopni i zwiększ rozmiar czcionki. +- Tryb kafelków znacznie utrudnia ponowne wykorzystanie dokumentu po przycięciu, ponieważ usunięcie jednego znaku wciąż zostawia dziesiątki kolejnych. Zmniejsz krycie przy kafelkowaniu, aby tekst pod spodem pozostał czytelny. +- Obrazowe znaki wodne z przezroczystym tłem (format PNG) wtapiają się w treść dokumentu bardziej naturalnie. +- Jeśli potrzebujesz innego tekstu znaku wodnego na różnych stronach, odznacz "Zastosuj do wszystkich stron" i przechodź strona po stronie. + +## Powiązane narzędzia + +- [Nagłówek i Stopka](./header-footer) +- [Dodaj pieczątki](./add-stamps) +- [Numeracja Batesa](./bates-numbering) +- [Podpisz PDF](./sign-pdf) diff --git a/docs/pl/tools/adjust-colors.md b/docs/pl/tools/adjust-colors.md new file mode 100644 index 00000000..9a9a4eb7 --- /dev/null +++ b/docs/pl/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Dostosuj kolory +description: Dopracuj jasność, kontrast, nasycenie, odcień, temperaturę, tint, gamma i sepię w swoim PDF. +--- + +# Dostosuj kolory + +Pełny zestaw narzędzi do korekcji kolorów w PDF. Reguluj osiem niezależnych parametrów (jasność, kontrast, nasycenie, przesunięcie odcienia, temperaturę, tint, gamma i sepię) z podglądem na żywo aktualizowanym przy każdym ruchu suwaka. + +## Jak to działa + +1. Wgraj plik PDF. +2. Otworzy się edytor z podglądem pierwszej strony i panelem ustawień kolorów. +3. Przesuwaj suwaki, aby dostosować każdy parametr koloru. Podgląd aktualizuje się w czasie rzeczywistym. +4. Kliknij **Resetuj**, aby przywrócić wszystkie suwaki do pozycji domyślnych. +5. Kliknij **Zastosuj**, aby przetworzyć wszystkie strony i pobrać dostosowany PDF. + +## Opcje + +- **Jasność**: rozjaśnij lub przyciemnij całą stronę (od -100 do +100). +- **Kontrast**: zwiększ lub zmniejsz różnicę między jasnymi i ciemnymi obszarami (od -100 do +100). +- **Nasycenie**: wzmocnij lub osłab intensywność kolorów (od -100 do +100). Ustawienie -100 daje skalę szarości. +- **Przesunięcie odcienia**: obróć koło kolorów, aby jednolicie przesunąć wszystkie kolory. +- **Temperatura**: przesuń kolory w stronę cieplejszych (żółty/pomarańczowy) lub chłodniejszych (niebieski). +- **Odcień (Tint)**: dodaj zielony lub magentowy odcień. +- **Gamma**: dostosuj jasność półcieni za pomocą krzywej gamma. Wartości poniżej 1.0 przyciemniają półcienie, a powyżej 1.0 je rozjaśniają. +- **Sepia**: zastosuj klasyczny efekt sepii. Wyższe wartości dają mocniejszy brązowy odcień. + +## Funkcje + +- Osiem niezależnie regulowanych parametrów koloru +- Podgląd na żywo reagujący natychmiast na zmiany suwaków +- Przycisk resetu do szybkiego powrotu do ustawień domyślnych +- Przetwarza wszystkie strony dokumentu +- Działa z dowolną zawartością PDF (tekst, obrazy, grafika) + +## Przypadki użycia + +- Rozjaśnianie ciemnego skanu lub korygowanie prześwietlonych stron +- Odbarwianie kolorowego dokumentu, aby zmniejszyć zużycie tuszu przed drukiem +- Nakładanie sepii dla antycznego wyglądu certyfikatów lub dyplomów +- Korygowanie temperatury barwowej zdjęć osadzonych w PDF +- Zwiększanie kontrastu wyblakłych lub niskiej jakości zeskanowanych dokumentów + +## Wskazówki + +- Aby szybko uzyskać skalę szarości, przeciągnij suwak nasycenia do końca na -100. +- Suwak gamma jest szczególnie przydatny do poprawy czytelności zeskanowanych dokumentów, w których półcienie są zbyt ciemne lub zbyt jasne. +- Podobnie jak inne narzędzia efektów obrazu, to narzędzie rasteryzuje każdą stronę. Wynik będzie oparty na obrazach, więc tekst nie będzie zaznaczalny. + +## Powiązane narzędzia + +- [Odwróć kolory](./invert-colors) +- [Efekt skanera](./scanner-effect) +- [Kolor tła](./background-color) diff --git a/docs/pl/tools/alternate-merge.md b/docs/pl/tools/alternate-merge.md new file mode 100644 index 00000000..e9da1418 --- /dev/null +++ b/docs/pl/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Naprzemienne i mieszane strony +description: Łącz pliki PDF, przeplatając strony z każdego pliku w naprzemiennej kolejności, z zachowaniem zakładek. +--- + +# Naprzemienne i mieszane strony + +Przeplataj strony z wielu plików PDF tak, aby strony występowały naprzemiennie między dokumentami. To narzędzie wybierzesz, gdy zwykłe łączenie dokleiłoby pliki jeden za drugim, a potrzebujesz strony 1 z pliku A, potem strony 1 z pliku B, potem strony 2 z pliku A i tak dalej. + +## Jak to działa + +1. Wgraj co najmniej dwa pliki PDF za pomocą strefy upuszczania. +2. Narzędzie wyświetli każdy plik z liczbą stron i rozmiarem. +3. Przeciągaj uchwyty, aby zmienić kolejność, czyj plik zaczyna sekwencję przeplatania. +4. Kliknij **Wymieszaj strony**, aby utworzyć przeplatany wynik. +5. Wynik zostanie pobrany jako `alternated-mixed.pdf`. + +## Funkcje + +- Przeplata strony z dowolnej liczby plików PDF (minimum dwa) +- Zmiana kolejności plików metodą przeciągnij i upuść, aby sterować priorytetem przeplatania +- Zachowuje zakładki z dokumentów źródłowych +- Wyświetla liczbę stron i rozmiar każdego wgranego pliku +- Przetwarza w dedykowanym web workerze, dzięki czemu interfejs pozostaje responsywny + +## Przypadki użycia + +- Składanie skanów dwustronnych, gdy strony nieparzyste i parzyste zeskanowano osobno +- Łączenie arkuszy z pytaniami z kluczami odpowiedzi, tak by po każdym pytaniu następowała odpowiedź +- Łączenie dokumentów w dwóch językach strona po stronie (np. angielski po jednej stronie, tłumaczenie na następnej) +- Przeplatanie skanów awersu i rewersu z skanera jednostronnego + +## Wskazówki + +- Jeśli źródłowe pliki PDF mają różną liczbę stron, strony krótszego dokumentu skończą się pierwsze, a pozostałe strony dłuższego pojawią się na końcu. +- Kolejność plików ma znaczenie: pierwszy plik na liście wnosi pierwszą stronę wyniku. W razie potrzeby przeciągnij, aby zmienić kolejność. + +## Powiązane narzędzia + +- [Połącz PDF](./merge-pdf) +- [Duplikuj i organizuj](./organize-pdf) +- [Podziel PDF](./split-pdf) diff --git a/docs/pl/tools/background-color.md b/docs/pl/tools/background-color.md new file mode 100644 index 00000000..43299098 --- /dev/null +++ b/docs/pl/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Kolor tła +description: Zmień kolor tła każdej strony PDF, zachowując całą zawartość na wierzchu. +--- + +# Kolor tła + +Ustaw jednolity kolor tła pod całą istniejącą zawartością PDF. Narzędzie tworzy kolorowy prostokąt na każdej stronie i nakłada na niego oryginalną zawartość, dzięki czemu tekst, obrazy i grafika pozostają w pełni widoczne na nowym tle. + +## Jak to działa + +1. Wgraj plik PDF. +2. Wybierz kolor tła za pomocą próbnika kolorów. Domyślny to jasnożółty (#FFFFCC). +3. Kliknij **Zmień kolor tła**, aby przetworzyć. +4. Zaktualizowany PDF pobierze się automatycznie. + +## Opcje + +- **Kolor tła**: standardowy próbnik do wyboru dowolnego jednolitego koloru. Domyślnie jasnożółty. + +## Funkcje + +- Stosuje jednolity kolor tła na każdej stronie +- Zachowuje całą oryginalną zawartość (tekst, obrazy, grafikę wektorową) nad kolorową warstwą +- Zachowuje oryginalne wymiary stron +- Działa z dokumentami o dowolnej liczbie stron + +## Przypadki użycia + +- Dodawanie jasnokremowego lub kości słoniowej tła, aby dokumenty wyglądały łagodniej, jak papier +- Kodowanie kolorami zestawów dokumentów przez nakładanie różnych kolorów tła dla różnych kategorii +- Tworzenie wizualnie odmiennych wersji tego samego dokumentu dla różnych odbiorców +- Dodawanie jasnego odcienia tła, aby poprawić czytelność przy wyświetlaniu dokumentów na ekranie + +## Wskazówki + +- Najlepiej sprawdzają się jasne, stonowane kolory. Bardzo ciemne tło może utrudniać czytanie tekstu, chyba że tekst jest już jasny. +- Jeśli chcesz zmienić zarówno tło, jak i kolor tekstu, najpierw zastosuj kolor tła, a potem użyj [Zmień kolor tekstu](./text-color) na wyniku. +- To narzędzie działa na poziomie struktury PDF (bez rasteryzacji), więc tekst pozostaje zaznaczalny i przeszukiwalny w wyniku. + +## Powiązane narzędzia + +- [Zmień kolor tekstu](./text-color) +- [Odwróć kolory](./invert-colors) +- [Dostosuj kolory](./adjust-colors) diff --git a/docs/pl/tools/bates-numbering.md b/docs/pl/tools/bates-numbering.md new file mode 100644 index 00000000..84da6536 --- /dev/null +++ b/docs/pl/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Numeracja Batesa +description: Nanoś numery Batesa na jeden lub wiele plików PDF z konfigurowalnymi szablonami, dopełnieniem, czcionkami i pozycją. +--- + +# Numeracja Batesa + +Numeracja Batesa nanosi kolejne identyfikatory na każdą stronę Twoich plików PDF. To standardowa metoda oznaczania dokumentów w postępowaniach prawnych, audytach i procesach zgodności. To narzędzie obsługuje wiele plików, konfigurowalne szablony i tworzy osobno ponumerowane pliki PDF lub jedno archiwum ZIP. + +## Jak to działa + +1. Wgraj jeden lub więcej plików PDF. Możesz przeciągnąć wiele plików naraz. +2. Wybierz gotowy styl lub utwórz własny szablon. +3. Skonfiguruj pozycję, czcionkę, rozmiar, kolor i numery początkowe. +4. Kliknij **Zastosuj numery Batesa**, aby przetworzyć. +5. Pojedynczy plik pobierze się bezpośrednio. Wiele plików pobierze się jako archiwum ZIP. + +## Opcje + +- **Gotowy styl**: wybierz jeden z wbudowanych formatów: + - Exhibit + Case + Bates + Page (np. "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (bez numeru strony) + - Case + Bates + - Tylko numer Batesa (np. "000001") + - Własny (napisz własny szablon) +- **Dostosuj styl**: ciąg szablonu z symbolami zastępczymi: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Dopełnienie numeru Batesa**: liczba cyfr (od 3 do 6) dla numerów Batesa dopełnionych zerami. Widoczne tylko w trybie własnym. +- **Pozycja**: nagłówek lub stopka, lewo, środek lub prawo. +- **Numer Batesa zaczyna się od**: pierwszy numer Batesa. Domyślnie 1. Numeracja jest kontynuowana między plikami. +- **Licznik plików zaczyna się od**: numer początkowy dla symbolu `[FILE]`. +- **Czcionka**: Helvetica, Times New Roman lub Courier. +- **Rozmiar czcionki**: rozmiar nanoszonego tekstu. +- **Kolor**: próbnik koloru dla tekstu numeru Batesa. + +## Funkcje + +- Podgląd na żywo pokazujący, jak numery Batesa pojawią się we wszystkich wgranych plikach +- Obsługa wielu plików z ciągłą numeracją między dokumentami +- Zmiana kolejności plików metodą przeciągnij i upuść, aby sterować sekwencją numeracji +- Sześć opcji pozycji (nagłówek/stopka, lewo/środek/prawo) +- Adaptacyjne obliczanie marginesów uwzględniające różne rozmiary stron +- Wynik ZIP dla partii wielu plików +- Symbole zastępcze w szablonie dla maksymalnej elastyczności + +## Przypadki użycia + +- Numerowanie dokumentów ujawnienia w sporach sądowych kolejnymi numerami dowodów +- Numerowanie pakietów dowodów z audytu obejmujących dziesiątki plików +- Nanoszenie numerów referencyjnych na dokumentację zgodności +- Etykietowanie załączników do zgłoszeń patentowych identyfikatorami przypisanymi do sprawy + +## Wskazówki + +- Przeciągnij pliki na liście, aby zmienić ich kolejność przed przetwarzaniem. Sekwencja numeracji Batesa podąża za tą kolejnością. +- Użyj symbolu `[FILENAME]`, aby dołączyć oryginalną nazwę pliku do nanoszonego tekstu, co pomaga powiązać strony z dokumentami źródłowymi. +- Pole podglądu aktualizuje się w czasie rzeczywistym przy zmianie ustawień, więc możesz sprawdzić format przed przetwarzaniem. + +## Powiązane narzędzia + +- [Numery stron](./page-numbers) +- [Dodaj etykiety stron](./add-page-labels) +- [Nagłówek i Stopka](./header-footer) diff --git a/docs/pl/tools/bmp-to-pdf.md b/docs/pl/tools/bmp-to-pdf.md new file mode 100644 index 00000000..04c6b694 --- /dev/null +++ b/docs/pl/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP na PDF +description: Konwertuj obrazy bitmapowe BMP na PDF bezpośrednio w przeglądarce, bez wysyłania na żaden serwer. +--- + +# BMP na PDF + +Konwertuj pliki Windows Bitmap (BMP) na PDF. BMP to nieskompresowany format obrazu, wciąż spotykany w starszych systemach, obrazowaniu medycznym i skanerach przemysłowych. To narzędzie konwertuje je do PDF bez potrzeby instalowania czegokolwiek. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :----------- | +| BMP | `.bmp` | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść pliki BMP. +2. Przejrzyj listę plików. Dodaj więcej plików lub usuń niechciane. +3. Kliknij **Konwertuj na PDF**. Wynik pobierze się jako `from_bmps.pdf`. + +Każdy BMP jest rysowany na canvas, eksportowany jako PNG, a następnie osadzany w PDF za pomocą pdf-lib. Rozmiar strony odpowiada wymiarom oryginalnego obrazu. + +## Opcje + +To narzędzie nie udostępnia dodatkowych ustawień jakości. Obrazy są osadzane w oryginalnej rozdzielczości jako bezstratny PNG w PDF. + +## Przypadki użycia + +- Konwertowanie starszych zeskanowanych dokumentów zapisanych jako BMP na archiwalne pliki PDF +- Zamiana zrzutów ekranu BMP z dawnych aplikacji Windows na dokumenty do udostępniania +- Przetwarzanie wyników ze skanerów medycznych lub przemysłowych, które domyślnie zapisują BMP +- Migracja starych archiwów obrazów do bardziej przenośnego formatu + +## Wskazówki + +- Pliki BMP są nieskompresowane, więc zwykle są duże. Powstały PDF będzie znacznie mniejszy, ponieważ obrazy są wewnętrznie ponownie kodowane jako PNG. +- Jeśli masz pliki BMP razem z innymi formatami obrazów, użyj narzędzia [Obrazy do PDF](./image-to-pdf), aby przekonwertować wszystko w jednej partii. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [PNG na PDF](./png-to-pdf) +- [TIFF na PDF](./tiff-to-pdf) diff --git a/docs/pl/tools/bookmark.md b/docs/pl/tools/bookmark.md new file mode 100644 index 00000000..297e8c8a --- /dev/null +++ b/docs/pl/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Edytuj zakładki +description: Dodawaj, edytuj, importuj, eksportuj i usuwaj zakładki PDF w edytorze wizualnym z obsługą CSV i JSON. +--- + +# Edytuj zakładki + +Edytor zakładek daje pełną kontrolę nad zakładkami nawigacyjnymi PDF (nazywanymi też konspektem). Możesz dodawać nowe zakładki, edytować istniejące, zmieniać hierarchię oraz importować i eksportować dane zakładek w formatach CSV i JSON. + +## Jak to działa + +1. Prześlij plik PDF, klikając lub przeciągając go do strefy upuszczania. +2. Opcjonalnie zaznacz **Automatycznie wyodrębnij istniejące zakładki**, aby wczytać bieżące drzewo zakładek dokumentu. +3. Edytor otworzy się w widoku podzielonym: przeglądarka PDF po lewej, panel zakładek po prawej. +4. Wpisz tytuł zakładki i kliknij **Dodaj do strony**, aby utworzyć zakładkę wskazującą bieżącą stronę. +5. Użyj przycisków na pasku narzędzi, aby zmieniać kolejność, stylizować lub usuwać zakładki. +6. Kliknij **Zapisz PDF z zakładkami**, aby pobrać zaktualizowany plik. + +## Funkcje + +- Wizualna przeglądarka PDF z nawigacją po stronach, sterowaniem powiększeniem i polem przejścia do strony +- Dodawanie zakładek do dowolnej strony jednym kliknięciem +- Kliknięcie bezpośrednio na PDF, aby ustawić dokładne miejsce docelowe zakładki (tryb wskazywania) +- Zagnieżdżona hierarchia zakładek ze zmianą kolejności przez przeciąganie +- Operacje zbiorcze: zaznacz wiele zakładek, aby zmienić kolor, styl lub usunąć je naraz +- Wyszukiwanie zakładek do szybkiego znajdowania wpisów w dużych drzewach +- Cofanie i ponawianie wszystkich zmian +- Import zakładek z plików CSV (tytuł, strona, poziom) lub JSON +- Eksport zakładek do CSV lub JSON w celu edycji zewnętrznej +- Stylizacja zakładek: kolor (czerwony, niebieski, zielony, żółty, fioletowy) i styl czcionki (pogrubiony, kursywa, pogrubiona kursywa) +- Szybka nawigacja: przewijanie stron klawiszami Page Up/Page Down + +## Opcje + +- **Automatycznie wyodrębnij istniejące zakładki**: po zaznaczeniu narzędzie odczytuje i wyświetla bieżące zakładki PDF po wczytaniu. +- **Tryb wsadowy**: przełącz, aby zaznaczyć wiele zakładek i zastosować zbiorczo kolor, styl lub usuwanie. +- **Rozwiń/zwiń wszystko**: szybko pokazuje lub ukrywa zagnieżdżone zakładki podrzędne. + +## Zastosowania + +- Dodawanie spisu treści do podręcznika lub instrukcji bez zakładek +- Przebudowa zakładek w zeskanowanym dokumencie po OCR +- Eksport zakładek do CSV, edycja w arkuszu kalkulacyjnym i ponowny import +- Porządkowanie automatycznie wygenerowanych zakładek z błędnymi odwołaniami do stron +- Dodawanie kolorowych zakładek oznaczających ważne sekcje w piśmie prawnym + +## Wskazówki + +- Użyj importu CSV do masowego tworzenia zakładek. Format jest prosty: `title,page,level`, gdzie poziom 1 oznacza najwyższy poziom. +- Tryb wskazywania pozwala kliknąć dokładne miejsce na stronie PDF jako cel zakładki, co jest precyzyjniejsze niż samo wskazanie numeru strony. +- Wyeksportuj zakładki przed większymi zmianami, aby mieć kopię zapasową. + +## Powiązane narzędzia + +- [Spis treści](./table-of-contents) +- [Edytor PDF](./edit-pdf) +- [Dodaj etykiety stron](./add-page-labels) diff --git a/docs/pl/tools/cbz-to-pdf.md b/docs/pl/tools/cbz-to-pdf.md new file mode 100644 index 00000000..0664129f --- /dev/null +++ b/docs/pl/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ na PDF +description: Konwertuj archiwa komiksów CBZ i CBR na PDF w przeglądarce. Za darmo, prywatnie, bez wysyłania plików. +--- + +# CBZ na PDF + +Zamień archiwa komiksów na pliki PDF. CBZ i CBR to standardowe formaty komiksów cyfrowych: są to po prostu archiwa ZIP lub RAR wypełnione obrazami. To narzędzie wyodrębnia każdą stronę, zachowuje kolejność czytania i tworzy czysty PDF, w którym każdy obraz staje się stroną w pełnym rozmiarze. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----- | :----------- | :------------------------------------------------------------------- | +| CBZ | `.cbz` | Archiwum komiksu oparte na ZIP (przetwarzane lokalnie przez pdf-lib) | +| CBR | `.cbr` | Archiwum komiksu oparte na RAR (przetwarzane przez silnik PyMuPDF) | + +Konwerter CBZ rozpoznaje obrazy JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC i JXL w archiwum. Niestandardowe formaty są automatycznie konwertowane do PNG przed osadzeniem. + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki CBZ lub CBR. W jednej partii możesz mieszać oba formaty. +2. Przejrzyj listę plików. Usuń zbędne lub kliknij **Dodaj więcej plików**, aby dodać kolejne. +3. Kliknij **Konwertuj na PDF**. W przypadku plików CBZ narzędzie rozpakowuje archiwum, sortuje pliki obrazów po nazwie w porządku naturalnym, wykrywa rzeczywisty format każdego obrazu i osadza je w PDF za pomocą pdf-lib. Pliki CBR są zamiast tego przetwarzane przez silnik PyMuPDF. +4. Pojedynczy plik pobiera się jako PDF. Wiele plików daje archiwum ZIP o nazwie `comic-converted.zip`. + +## Opcje + +Nie jest wymagana żadna konfiguracja. Każdy obraz staje się stroną dopasowaną do oryginalnych wymiarów, więc rozkładówki pozostają szerokie, a pojedyncze strony wąskie. + +## Zastosowania + +- Czytanie komiksów na tablecie lub w aplikacji na telefonie, która obsługuje PDF, ale nie CBZ/CBR +- Drukowanie wybranych stron komiksu cyfrowego +- Archiwizacja kolekcji komiksów w formacie, który otworzy każda przeglądarka plików +- Udostępnianie komiksu osobie, która nie ma dedykowanego czytnika komiksów + +## Wskazówki + +- Obrazy w archiwum są sortowane w porządku naturalnym (więc `page2.jpg` jest przed `page10.jpg`). Nazywaj pliki ze spójną numeracją, aby kolejność stron była prawidłowa. +- Konwerter wykrywa formaty obrazów po sygnaturach binarnych, a nie po rozszerzeniach plików. PNG omyłkowo nazwany `.jpg` zostanie osadzony poprawnie. +- Pliki CBZ są przetwarzane w całości w przeglądarce bez ładowania silnika PyMuPDF, więc konwertują się szybciej niż pliki CBR. + +## Powiązane narzędzia + +- [EPUB na PDF](./epub-to-pdf) +- [MOBI na PDF](./mobi-to-pdf) +- [Obrazy do PDF](./image-to-pdf) diff --git a/docs/pl/tools/change-permissions.md b/docs/pl/tools/change-permissions.md new file mode 100644 index 00000000..f86c5527 --- /dev/null +++ b/docs/pl/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Zmień uprawnienia +description: Ustaw lub zmień uprawnienia PDF dotyczące drukowania, kopiowania, edycji i adnotacji. Używa 256-bitowego szyfrowania AES. +--- + +# Zmień uprawnienia + +Precyzyjnie określ, co odbiorcy mogą robić z Twoim PDF. W przeciwieństwie do podstawowego szyfrowania, które tylko blokuje plik hasłem, to narzędzie pozwala selektywnie zezwalać na drukowanie, kopiowanie, edycję, dodawanie adnotacji, wypełnianie formularzy, składanie dokumentu i wyodrębnianie stron lub je blokować, a wszystko egzekwowane przez 256-bitowe szyfrowanie AES. + +## Jak to działa + +1. Prześlij plik PDF. +2. Jeśli PDF jest już zaszyfrowany, wpisz **Aktualne hasło**. +3. Ustaw **Nowe hasło użytkownika** (wymagane do otwarcia) i/lub **Nowe hasło właściciela** (kontroluje uprawnienia). +4. Włączaj i wyłączaj poszczególne uprawnienia za pomocą pól wyboru. +5. Kliknij **Zmień uprawnienia**. +6. Pobierz zaktualizowany PDF. + +Jeśli oba pola nowych haseł zostawisz puste, narzędzie całkowicie odszyfruje PDF, usuwając całe szyfrowanie i wszystkie ograniczenia. + +## Kontrola uprawnień + +| Uprawnienie | Co kontroluje | +| ------------------------------------ | ----------------------------------------------------- | +| **Zezwól na drukowanie** | Czy dokument można drukować | +| **Zezwól na kopiowanie** | Czy tekst i obrazy można zaznaczać i kopiować | +| **Zezwól na modyfikowanie** | Czy treść dokumentu można edytować | +| **Zezwól na adnotacje** | Czy można dodawać komentarze, zakreślenia i pieczątki | +| **Zezwól na wypełnianie formularzy** | Czy można wypełniać interaktywne pola formularzy | +| **Zezwól na składanie dokumentu** | Czy można wstawiać, usuwać lub obracać strony | +| **Zezwól na wyodrębnianie stron** | Czy można wyodrębniać pojedyncze strony | + +Wszystkie uprawnienia wymagają hasła właściciela, aby były egzekwowane. Bez hasła właściciela flagi uprawnień są ignorowane przez większość czytników PDF. + +## Jak działają uprawnienia w PDF + +Uprawnienia PDF są częścią specyfikacji szyfrowania. Są zapisane jako flagi bitowe w słowniku szyfrowania i egzekwowane przez zgodne czytniki PDF. Kluczowa różnica: + +- **Hasło użytkownika**: wymagane do w ogóle otwarcia pliku. +- **Hasło właściciela**: wymagane do zmiany uprawnień lub usunięcia ograniczeń. Bez niego flagi uprawnień określają, jakie operacje może wykonywać użytkownik. + +Jeśli ustawisz tylko hasło właściciela (bez hasła użytkownika), każdy może otworzyć plik, ale ma dostęp tylko do dozwolonych operacji. Jeśli ustawisz oba, plik wymaga hasła do otwarcia, a po uwierzytelnieniu obowiązują ograniczenia. + +## Zastosowania + +- Rozpowszechnianie raportu, który można przeglądać i drukować, ale nie edytować ani kopiować +- Udostępnianie wzoru umowy, który odbiorcy mogą wypełnić, ale nie zmodyfikować +- Publikowanie katalogu PDF z wyłączonym kopiowaniem obrazów +- Zezwalanie na adnotacje w wersji roboczej do recenzji przy jednoczesnym blokowaniu zmian strukturalnych + +## Wskazówki + +- Aby ochrona była skuteczna, zawsze ustawiaj hasło właściciela. Uprawnień bez hasła właściciela nie da się egzekwować. +- Niektóre zewnętrzne narzędzia PDF ignorują flagi uprawnień. Dla silniejszej ochrony rozważ rasteryzację PDF lub użycie DRM. +- Użyj tego narzędzia, aby zaktualizować stare pliki PDF zaszyfrowane RC4 do AES-256. + +## Powiązane narzędzia + +- [Szyfruj PDF](./protect-pdf): proste zabezpieczenie hasłem bez szczegółowych uprawnień +- [Odszyfruj PDF](./unlock-pdf): całkowite usunięcie szyfrowania +- [Usuń restrykcje](./remove-restrictions): usuń wszystkie ograniczenia, gdy znasz hasło właściciela diff --git a/docs/pl/tools/combine-single-page.md b/docs/pl/tools/combine-single-page.md new file mode 100644 index 00000000..0368c343 --- /dev/null +++ b/docs/pl/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Połącz w jedną stronę +description: Zszyj wszystkie strony PDF w jedną ciągłą stronę przewijaną w pionie lub w poziomie. +--- + +# Połącz w jedną stronę + +Połącz wszystkie strony PDF w jedną, długą stronę. Strony są zszywane w pionie (jak zwój) lub w poziomie (obok siebie), dając w wyniku jedną ciągłą stronę. + +## Jak to działa + +1. Prześlij plik PDF. +2. Wybierz kierunek układu: **Pionowo** (strony jedna pod drugą) lub **Poziomo** (strony obok siebie). +3. Ustaw odstęp między stronami w punktach. +4. Wybierz kolor tła dla przerw między stronami. +5. Opcjonalnie włącz separatory (cienkie linie między stronami) i skonfiguruj ich grubość i kolor. +6. Kliknij przycisk przetwarzania. Wynikiem jest jednostronicowy PDF. + +## Funkcje + +- Zszywanie stron w pionie lub w poziomie +- Konfigurowalny odstęp między stronami +- Wybór koloru tła obszarów między stronami +- Opcjonalne linie separatorów z regulowaną grubością i kolorem +- Renderuje każdą oryginalną stronę w pełnej rozdzielczości na połączonym płótnie + +## Opcje + +| Opcja | Opis | +| -------------------------- | --------------------------------------------------- | +| **Orientacja** | Pionowo (jedna pod drugą) lub poziomo (obok siebie) | +| **Odstęp między stronami** | Przerwa między stronami w punktach | +| **Kolor tła** | Kolor obszaru między stronami | +| **Dodaj separator** | Włącza cienkie linie między stronami | +| **Grubość separatora** | Grubość linii w punktach | +| **Kolor separatora** | Kolor linii separatorów | + +## Zastosowania + +- Tworzenie jednego długiego obrazu z wielostronicowego szkieletu lub makiety projektu +- Generowanie ciągłego, przewijanego widoku dokumentu do osadzenia w sieci +- Zszywanie wielostronicowego komiksu lub storyboardu w jeden pasek +- Tworzenie panoramicznego widoku kolejnych stron do recenzji + +## Wskazówki + +- Układ pionowy najlepiej sprawdza się w dokumentach ze stronami pionowymi. Poziomy jest lepszy dla treści w orientacji poziomej. +- Duże dokumenty z wieloma stronami dadzą bardzo wysoki lub szeroki wynik. Niektóre przeglądarki PDF mogą mieć problem z ekstremalnie dużymi pojedynczymi stronami. +- Dodanie separatorów w kontrastowym kolorze ułatwia zobaczenie, gdzie kończy się jedna oryginalna strona, a zaczyna następna. + +## Powiązane narzędzia + +- [PDF N-Up](./n-up-pdf) +- [Połącz PDF](./merge-pdf) +- [Podziel strony](./divide-pages) diff --git a/docs/pl/tools/compare-pdfs.md b/docs/pl/tools/compare-pdfs.md new file mode 100644 index 00000000..a488e022 --- /dev/null +++ b/docs/pl/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Porównaj PDF +description: Porównaj dwa dokumenty PDF obok siebie lub w trybie nakładki, ze szczegółowym wykrywaniem i kategoryzacją zmian. +--- + +# Porównaj PDF + +Prześlij dwa pliki PDF i zobacz dokładnie, co się między nimi zmieniło. Narzędzie inteligentnie łączy strony w pary, wykrywa różnice w tekście, obrazach, adnotacjach, nagłówkach i formatowaniu oraz przedstawia je w widoku obok siebie lub w nakładce. + +## Jak to działa + +1. Prześlij dwa pliki PDF: oryginał (po lewej) i wersję poprawioną (po prawej). +2. Narzędzie łączy strony obu dokumentów w pary na podstawie sygnatur treści. +3. Wybierz tryb widoku: **Obok siebie** lub **Nakładka**. +4. Przechodź między parami stron za pomocą kontrolek stronicowania. +5. Różnice są podświetlane i kategoryzowane. Użyj panelu filtrów, aby skupić się na wybranych typach zmian. +6. Opcjonalnie wyeksportuj porównanie jako raport PDF. + +## Funkcje + +- Automatyczne parowanie stron na podstawie podobieństwa treści +- Widoki porównania obok siebie i w nakładce +- Kategoryzacja zmian: tekst, obraz, nagłówek/stopka, adnotacja, formatowanie, tło +- Przełączniki filtrów dla każdej kategorii, aby pokazywać lub ukrywać wybrane typy zmian +- Wyszukiwanie zmian w tekście z filtrowaniem zapytaniem +- Obsługa OCR do porównywania zeskanowanych dokumentów +- Kontrolki powiększenia do dokładnej inspekcji +- Zsynchronizowane przewijanie paneli w trybie obok siebie +- Eksport wyników porównania jako PDF + +## Opcje + +| Opcja | Opis | +| -------------------- | ----------------------------------------------------------------------------------------- | +| **Tryb widoku** | Obok siebie lub nakładka | +| **OCR** | Włącz/wyłącz OCR do porównywania zeskanowanych dokumentów | +| **Język OCR** | Język wyodrębniania tekstu przez OCR | +| **Filtry kategorii** | Przełącz widoczność zmian tekstu, obrazów, nagłówka/stopki, adnotacji, formatowania i tła | +| **Zakres zmian** | W trybie nakładki przełącza między wszystkimi zmianami a samą treścią | +| **Powiększenie** | Dostosuj poziom powiększenia do dokładnej inspekcji | + +## Zastosowania + +- Przeglądanie poprawek umowy, aby znaleźć dokładnie to, co zmieniło się między wersjami +- Porównywanie makiet projektów, aby sprawdzić, czy eksporty PDF odpowiadają oczekiwaniom +- Audyt zmian w dokumentach w branżach regulowanych, gdzie każda edycja musi być śledzona +- Weryfikacja, czy proces konwersji PDF dokładnie zachował oryginalną treść +- Sprawdzanie dokumentów tłumaczeń względem źródła pod kątem zmian układu + +## Wskazówki + +- Widok nakładki układa oba dokumenty jeden na drugim, dzięki czemu różnice przestrzenne (przesunięte elementy, zmienione rozmiary obrazów) są od razu widoczne. +- Włącz OCR, porównując zeskanowane dokumenty bez warstwy tekstowej. Silnik porównania wyodrębni tekst z obrazów stron. +- Używaj filtrów kategorii, aby skupić się na tym, co ważne. Na przykład ukryj zmiany formatowania, gdy zależy Ci tylko na różnicach w treści tekstu. + +## Powiązane narzędzia + +- [Wyświetl metadane](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Połącz PDF](./merge-pdf) diff --git a/docs/pl/tools/compress-pdf.md b/docs/pl/tools/compress-pdf.md new file mode 100644 index 00000000..15d1deae --- /dev/null +++ b/docs/pl/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Kompresuj PDF +description: Zmniejsz rozmiar pliku PDF nawet o 90% dzięki silnikowi Hyper Compress. Obsługuje docelowe rozmiary plików, przetwarzanie wsadowe i własne ustawienia jakości. +--- + +# Kompresuj PDF + +Zmniejsz pliki PDF bez ich niszczenia. Kompresuj PDF działa na [Hyper Compress](https://www.bentopdf.com/hyper-compress), własnym silniku kompresji BentoPDF. Ponownie kompresuje obrazy, tworzy podzbiory i scala czcionki oraz usuwa zbędny balast, taki jak osadzone miniatury i prywatne dane aplikacji. PDF pozostaje w pełni funkcjonalny: tekst można nadal zaznaczać, a linki i pola formularzy działają. + +Hyper Compress jest skompilowany do WebAssembly i dostarczany z BentoPDF, więc kompresja działa offline i we wdrożeniach odciętych od sieci, bez dodatkowej konfiguracji. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając do niej pliki. +2. Wybierz **Poziom kompresji**: Niski, Średni, Wysoki lub Bezstratny. +3. Opcjonalnie wpisz **Docelowy rozmiar pliku** lub rozwiń **Ustawienia niestandardowe**, aby uzyskać szczegółową kontrolę, w tym **Konwertuj na odcienie szarości**. +4. Kliknij **Kompresuj PDF**. W przypadku wielu plików otrzymasz jedno pobranie ZIP. + +## Dokumenty specjalne + +- **Podpisane cyfrowo pliki PDF** są zwracane bez zmian, ponieważ każda zmiana unieważniłaby podpis. Włącz **Zastąp ochronę treści** w Ustawieniach niestandardowych, aby usunąć podpisy i skompresować plik. Widoczny podpis pozostaje na stronie, ale plik nie jest już podpisany. +- **Pliki PDF/A** tracą po kompresji oznaczenie PDF/A, aby plik nigdy nie deklarował zgodności, której już nie spełnia. Włącz **Zachowaj PDF/A** w Ustawieniach niestandardowych, aby zamiast tego zachować zgodność pliku. +- **Pliki PDF chronione hasłem** mają pole hasła na karcie pliku. Wpisz tam hasło, a Hyper Compress sam otworzy plik, bez osobnego kroku odblokowania. Przy dwóch lub więcej zablokowanych plikach jedno wspólne pole odblokowuje każdy plik z tym samym hasłem. Skompresowana kopia nie ma hasła; użyj [Szyfruj PDF](./protect-pdf), aby dodać je ponownie. +- **Skany bez warstwy tekstowej** można jeszcze bardziej zmniejszyć za pomocą **Rasteryzuj strony** w Ustawieniach niestandardowych, co zastępuje każdą stronę jednym zoptymalizowanym obrazem. Opcja jest pomijana dla każdego dokumentu z zaznaczalnym tekstem, w tym dla skanów po OCR, chyba że włączono **Zastąp ochronę treści**. Wtedy strony z tekstem też stają się obrazami, więc tekst przestaje być zaznaczalny, a linki przestają działać. + +## Poziomy kompresji + +| Poziom | Jakość obrazu | Maks. rozdzielczość | Najlepsze do | +| -------------- | ----------------- | ------------------- | -------------------------------------- | +| **Niski** | 80 | 200 DPI | Zachowania jakości wizualnej | +| **Średni** | 50 | 150 DPI | Codziennych dokumentów | +| **Wysoki** | 20 | 72 DPI | Załączników e-mail, wysyłania do sieci | +| **Bezstratny** | Obrazy nietknięte | Bez zmian | Kopii archiwalnych | + +Poziom Wysoki usuwa też osadzenie 14 standardowych czcionek PDF oraz ich odpowiedników, takich jak Arial, gdy jest to bezpieczne. + +## Docelowy rozmiar pliku + +Wpisz rozmiar w KB lub MB, a Hyper Compress poszuka najlepszej jakości obrazu, która jeszcze się mieści, zaczynając od wybranego poziomu. Jeśli dokument nie może być aż tak mały, otrzymasz najmniejszą możliwą wersję oraz komunikat o tym. Dedykowane strony, takie jak [Kompresuj PDF do 1MB](https://www.bentopdf.com/compress-pdf-to-1mb), otwierają się z już wypełnionym celem. + +## Ustawienia niestandardowe + +Rozwiń panel Ustawienia niestandardowe, aby bezpośrednio dostosować Hyper Compress. Wybór poziomu kompresji resetuje te ustawienia do wartości tego poziomu, a edycja któregokolwiek z nich przełącza poziom na Niestandardowy. + +- **Zastąp ochronę treści**: domyślnie Hyper Compress pozostawia podpisane pliki PDF nietknięte i nie rasteryzuje stron z tekstem. Włączenie tej opcji omija oba zabezpieczenia. Pozostaje włączona po zmianie poziomu. + +- **Obrazy**: jakość obrazu, maksymalna rozdzielczość, wymuszone ponowne próbkowanie, redukcja kolorów, przycinanie niewidocznych obszarów obrazów, usuwanie obrazów alternatywnych, upraszczanie profili kolorów, JPEG 2000 i tryb bezstratny +- **Czcionki**: tworzenie podzbiorów, scalanie duplikatów oraz usuwanie osadzenia standardowych czcionek i ich odpowiedników +- **Treść**: spłaszczanie adnotacji, pól formularzy lub linków +- **Czyszczenie**: usuwanie miniatur, danych aplikacji, wątków artykułów, informacji o przechwytywaniu stron WWW, drzewa struktury lub intencji wyjściowych +- **Rasteryzacja**: zastępowanie stron obrazami, dla skanów składających się wyłącznie z obrazów; pomijana, gdy dokument ma zaznaczalny tekst +- **Wyjście**: Zachowaj PDF/A oraz kompresja Brotli dla czytników PDF 2.0, które ją obsługują + +## Zastosowania + +- Zmniejszenie 50-megabajtowego raportu poniżej limitu załącznika e-mail +- Zmieszczenie skanu w ścisłym limicie wysyłania portalu dzięki docelowemu rozmiarowi pliku +- Optymalizacja PDF marketingowych pod szybsze pobieranie ze strony +- Archiwizacja dużych zbiorów dokumentów, gdy liczą się koszty przechowywania +- Zmniejszenie zużycia danych mobilnych przy udostępnianiu PDF w komunikatorach + +## Wskazówki + +- Zacznij od poziomu Średni. Jeśli wynik jest nadal za duży, ustaw docelowy rozmiar pliku lub przejdź na Wysoki. +- Dla skanu bez warstwy tekstowej włącz Rasteryzuj strony w Ustawieniach niestandardowych. +- Konwertuj na odcienie szarości, w Ustawieniach niestandardowych, może zmniejszyć rozmiar dokumentów z dużą ilością kolorów. + +## Powiązane narzędzia + +- [Linearyzuj PDF](./linearize-pdf): zoptymalizuj skompresowany PDF pod szybkie wyświetlanie w sieci +- [Rasteryzuj PDF](./rasterize-pdf): zamień strony na obrazy w określonym DPI, także strony z tekstem +- [Napraw PDF](./repair-pdf): napraw PDF uszkodzony podczas kompresji gdzie indziej +- [Usuń metadane](./remove-metadata): usuń ukryte dane dla prywatności diff --git a/docs/pl/tools/crop-pdf.md b/docs/pl/tools/crop-pdf.md new file mode 100644 index 00000000..95e0a1bb --- /dev/null +++ b/docs/pl/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Przytnij PDF +description: Wizualnie przycinaj strony PDF, rysując obszar przycięcia na każdej stronie w edytorze opartym na Cropper.js. +--- + +# Przytnij PDF + +Przytnij marginesy stron PDF w wizualnym interfejsie przycinania. Narysuj prostokąt przycięcia bezpośrednio na każdej stronie, wyświetl podgląd wyniku i zastosuj przycięcie. Możesz ustawić różne obszary przycięcia dla różnych stron lub zastosować to samo przycięcie do całego dokumentu. + +## Jak to działa + +1. Prześlij plik PDF. +2. Otworzy się edytor przycinania z pierwszą stroną i przeciąganą nakładką przycięcia. +3. Dostosuj prostokąt przycięcia, przeciągając jego krawędzie lub rogi. +4. Użyj przycisków nawigacji po stronach, aby przechodzić między stronami i ustawiać obszary przycięcia dla każdej z nich. +5. Kliknij **Przytnij**, aby zastosować przycięcie i pobrać wynik. + +## Funkcje + +- Wizualny edytor przycinania oparty na Cropper.js z uchwytami do precyzyjnych korekt +- Nawigacja strona po stronie do ustawiania indywidualnych obszarów przycięcia +- Zapamiętuje ustawienia przycięcia dla każdej strony, więc możesz zdefiniować różne przycięcia dla różnych stron +- Podgląd na żywo wybranego obszaru przycięcia +- Obsługuje pliki PDF o dowolnym rozmiarze i orientacji stron + +## Zastosowania + +- Usuwanie szerokich marginesów ze zeskanowanych dokumentów, aby skupić się na obszarze treści +- Usuwanie znaczników cięcia lub pasowania z plików PDF do przygotowalni +- Przycinanie slajdów wykładowych, aby usunąć obszar notatek prelegenta +- Usuwanie nagłówków lub stopek ze wszystkich stron przed udostępnieniem fragmentu dokumentu +- Zmiana rozmiaru stron do określonego wyświetlacza lub układu wydruku + +## Wskazówki + +- Nakładkę przycięcia można dowolnie zmieniać i przesuwać. Przeciągaj rogi, aby zmieniać rozmiar proporcjonalnie, lub krawędzie, aby dostosować tylko jedną oś. +- Jeśli każda strona wymaga tego samego przycięcia, ustaw je na pierwszej stronie: narzędzie zapamiętuje obszar przycięcia podczas przechodzenia między stronami. +- Jeśli chcesz ujednolicić rozmiary stron zamiast wizualnie przycinać, lepszym wyborem może być narzędzie Napraw rozmiar strony. + +## Powiązane narzędzia + +- [Edytor PDF](./edit-pdf) +- [Numery stron](./page-numbers) +- [Usuń puste strony](./remove-blank-pages) diff --git a/docs/pl/tools/csv-to-pdf.md b/docs/pl/tools/csv-to-pdf.md new file mode 100644 index 00000000..9cfb2793 --- /dev/null +++ b/docs/pl/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV na PDF +description: Konwertuj arkusze CSV na sformatowane tabele PDF bezpośrednio w przeglądarce. +--- + +# CSV na PDF + +Zamień pliki CSV na czyste, sformatowane dokumenty PDF. Każdy plik CSV jest parsowany i renderowany jako tabela w wynikowym PDF. Przydaje się, gdy chcesz wydrukować lub udostępnić dane tabelaryczne bez wymagania od odbiorcy oprogramowania do arkuszy kalkulacyjnych. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :----------- | +| CSV | `.csv` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść jeden lub więcej plików CSV. +2. Przejrzyj listę plików. Dodaj kolejne pliki lub usuń niechciane. +3. Kliknij **Konwertuj na PDF**. Wskaźnik postępu pokazuje stan konwersji. +4. Pojedynczy plik pobiera się bezpośrednio jako PDF. Wiele plików jest pakowanych do `csv-converted.zip`. + +## Opcje + +To narzędzie nie ma dodatkowej konfiguracji. Plik CSV jest automatycznie parsowany i formatowany jako tabela. + +## Wynik + +| Liczba plików wejściowych | Wynik | +| :------------------------ | :------------------------------------------------------------ | +| 1 plik | Pobranie jednego PDF (np. `data.pdf`) | +| 2+ pliki | Archiwum ZIP (`csv-converted.zip`) z jednym PDF na każdy plik | + +## Zastosowania + +- Konwersja wyeksportowanych raportów z bazy danych na drukowalne tabele PDF +- Udostępnianie danych finansowych lub list inwentarzowych osobom bez Excela +- Tworzenie wersji PDF plików dziennika CSV do dokumentacji zgodności +- Drukowanie list adresowych, arkuszy ocen i innych danych tabelarycznych zapisanych jako CSV + +## Wskazówki + +- Aby uzyskać najlepsze wyniki, upewnij się, że plik CSV używa standardowych separatorów w postaci przecinków. Narzędzie stosuje powszechne konwencje parsowania CSV. +- Jeśli plik CSV ma wiele kolumn, tabela może zostać ściśnięta, aby zmieścić się na szerokości strony. Rozważ podzielenie szerokich zbiorów danych na kilka plików. +- Dla plików Excel (`.xls`, `.xlsx`) użyj narzędzia [Excel na PDF](./excel-to-pdf), które zachowuje formatowanie arkusza i wiele arkuszy. + +## Powiązane narzędzia + +- [Excel na PDF](./excel-to-pdf) +- [Tekst na PDF](./txt-to-pdf) +- [JSON na PDF](./json-to-pdf) diff --git a/docs/pl/tools/delete-pages.md b/docs/pl/tools/delete-pages.md new file mode 100644 index 00000000..77c9c078 --- /dev/null +++ b/docs/pl/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Usuń strony +description: Usuń wybrane strony z PDF według numeru strony, zakresu lub wizualnego wyboru miniatur. +--- + +# Usuń strony + +Usuń niechciane strony z dokumentu PDF. Określ strony do usunięcia, wpisując numery stron lub zakresy, albo kliknij bezpośrednio miniatury stron, aby oznaczyć je do usunięcia. + +## Jak to działa + +1. Prześlij plik PDF. Narzędzie renderuje miniatury podglądu każdej strony. +2. Wpisz strony do usunięcia w polu tekstowym, używając składni zakresów (np. `2, 5-8`), lub klikaj miniatury, aby je przełączać. +3. Oznaczone strony są wizualnie podświetlone, abyś mógł potwierdzić wybór. +4. Kliknij przycisk przetwarzania. Zostanie utworzony nowy PDF bez wybranych stron. + +## Funkcje + +- Wybór stron tekstem ze składnią zakresów (`2, 5-8, 12`) +- Wizualna siatka miniatur do usuwania przez kliknięcie +- Podgląd na żywo z podświetleniem stron oznaczonych do usunięcia +- Walidacja danych wejściowych względem rzeczywistej liczby stron +- Zachowuje wszystkie nieusunięte strony w oryginalnej kolejności + +## Zastosowania + +- Usuwanie pustych lub wypełniających stron ze zeskanowanego dokumentu +- Usuwanie stron tytułowych lub załączników przed udostępnieniem dokumentu +- Czyszczenie stron roboczych przypadkowo pozostawionych w końcowym PDF +- Usuwanie stron z wrażliwymi informacjami przed dystrybucją + +## Wskazówki + +- Usunięcie stron nie wpływa na treść ani formatowanie pozostałych stron. Wynik jest wierną kopią oryginału pomniejszoną o usunięte strony. +- Jeśli chcesz zachować tylko wybrane strony zamiast usuwać wybrane, lepszym wyborem jest [Wyodrębnij strony](./extract-pages). +- Widok miniatur ładuje się leniwie, więc duże dokumenty pozostają responsywne. + +## Powiązane narzędzia + +- [Wyodrębnij strony](./extract-pages) +- [Duplikuj i organizuj](./organize-pdf) +- [Podziel PDF](./split-pdf) diff --git a/docs/pl/tools/deskew-pdf.md b/docs/pl/tools/deskew-pdf.md new file mode 100644 index 00000000..3948d029 --- /dev/null +++ b/docs/pl/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Wyprostuj PDF +description: Automatycznie prostuj przekrzywione strony w zeskanowanych plikach PDF dzięki wykrywaniu pochylenia OpenCV. Regulowany próg i ustawienia DPI. +--- + +# Wyprostuj PDF + +Zeskanowane dokumenty rzadko są idealnie proste. Nawet niewielkie przekrzywienie pogarsza dokładność OCR i sprawia, że wydruk wygląda niedbale. To narzędzie używa algorytmów przetwarzania obrazu OpenCV, aby wykryć kąt pochylenia każdej strony i obrócić ją z powrotem do poziomu. + +## Jak to działa + +1. Prześlij jeden lub więcej zeskanowanych plików PDF. +2. Ustaw **Próg pochylenia**: strony z wykrytym pochyleniem poniżej tej wartości pozostają nietknięte. +3. Wybierz **Jakość przetwarzania (DPI)**: wyższe DPI poprawia dokładność wykrywania, ale trwa dłużej. +4. Kliknij **Wyprostuj PDF**. +5. Po przetworzeniu panel wyników pokazuje wykryty kąt każdej strony i informację, czy została skorygowana. + +## Opcje + +| Ustawienie | Wartości | Domyślnie | +| --------------------- | -------------------------- | --------- | +| **Próg pochylenia** | 0,1, 0,5, 1,0, 2,0 stopnia | 0,5 | +| **DPI przetwarzania** | 100, 150, 200, 300 | 150 | + +## Jak działa wykrywanie pochylenia + +Narzędzie renderuje każdą stronę do obrazu w wybranym DPI, a następnie używa OpenCV do wykrycia dominujących kątów linii w treści. Jeśli wykryte pochylenie przekracza próg, strona jest obracana o kąt przeciwny, aby ją wyprostować. Strony poniżej progu są przekazywane bez zmian. + +## Zastosowania + +- Porządkowanie hurtowo skanowanych umów lub dokumentów prawnych +- Przygotowanie zeskanowanych paragonów lub faktur do przetwarzania OCR +- Prostowanie stron ze skanera płaskiego przy niespójnym układaniu papieru +- Poprawa jakości wizualnej zdigitalizowanych materiałów archiwalnych + +## Wskazówki + +- Obniż próg do 0,1 stopnia, jeśli potrzebujesz idealnego wyrównania do OCR. +- 150 DPI jest szybkie i dokładne dla większości dokumentów. Użyj 300 DPI dla bardzo małego tekstu lub stron z drobnymi detalami. +- Prostowanie działa najlepiej na dokumentach z wyraźnymi poziomymi liniami tekstu. Może sobie nie radzić ze stronami złożonymi głównie z obrazów lub ukośnych elementów projektu. + +## Powiązane narzędzia + +- [Rasteryzuj PDF](./rasterize-pdf): zamień wyprostowany wynik na płaski PDF oparty na obrazach +- [Kompresuj PDF](./compress-pdf): zmniejsz rozmiar pliku po prostowaniu +- [Napraw PDF](./repair-pdf): napraw problemy strukturalne w zeskanowanych plikach PDF diff --git a/docs/pl/tools/digital-sign-pdf.md b/docs/pl/tools/digital-sign-pdf.md new file mode 100644 index 00000000..f9950b5f --- /dev/null +++ b/docs/pl/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Podpis cyfrowy +description: Dodawaj kryptograficzne podpisy cyfrowe do plików PDF za pomocą certyfikatów X.509. Obsługuje formaty PKCS#12 i PEM oraz opcje widocznego podpisu. +--- + +# Podpis cyfrowy + +Podpis cyfrowy to kryptograficzny dowód, że konkretna osoba podpisała dokument i że dokument nie został zmieniony od tego czasu. W przeciwieństwie do narysowanego podpisu (który jest tylko obrazem) podpis cyfrowy używa certyfikatów X.509 i standardów PKCS#7, aby zapewnić weryfikowalną autentyczność i integralność. + +BentoPDF nakłada podpisy cyfrowe w całości w Twojej przeglądarce. Twój klucz prywatny nigdy nie opuszcza urządzenia. + +## Jak to działa + +1. Prześlij plik PDF. +2. Prześlij plik certyfikatu (.pfx, .p12 lub .pem). +3. Wpisz hasło certyfikatu, aby go odblokować. Narzędzie wyświetli podmiot certyfikatu, wystawcę i okres ważności. +4. Opcjonalnie skonfiguruj metadane podpisu (powód, lokalizacja, dane kontaktowe). +5. Opcjonalnie włącz **widoczny podpis** z dostosowaniem pozycji, rozmiaru, obrazu i tekstu. +6. Kliknij **Podpisz PDF**. + +## Obsługiwane formaty certyfikatów + +| Format | Rozszerzenia | Opis | +| ----------- | ------------ | ------------------------------------------------------------------------------------------------------------------ | +| **PKCS#12** | .pfx, .p12 | Standardowy w branży pakiet zawierający klucz prywatny i łańcuch certyfikatów. Najpopularniejszy format. | +| **PEM** | .pem | Format tekstowy. Musi zawierać certyfikat i klucz prywatny w jednym pliku. Obsługuje zaszyfrowane klucze prywatne. | + +## Opcje widocznego podpisu + +Po włączeniu na stronie PDF renderowany jest widoczny blok podpisu: + +- **Pozycja**: współrzędne X/Y oraz szerokość/wysokość w punktach +- **Strona**: pierwsza strona, ostatnia strona, wszystkie strony lub konkretny numer strony +- **Obraz**: prześlij obraz PNG, JPG lub WebP (Twój odręczny podpis, pieczęć firmy itp.) +- **Tekst**: własny tekst z konfigurowalnym kolorem i rozmiarem czcionki. Jeśli nie podano obrazu ani tekstu, narzędzie automatycznie generuje tekst z nazwy pospolitej certyfikatu (common name) i bieżącej daty. + +## Metadane podpisu + +- **Powód**: dlaczego dokument został podpisany (np. "Zatwierdzono", "Przejrzano") +- **Lokalizacja**: gdzie odbyło się podpisywanie (np. "Nowy Jork, NY") +- **Dane kontaktowe**: jak skontaktować się z podpisującym (np. adres e-mail) + +## Uwaga o połączeniu z internetem + +Podpisywanie może wymagać połączenia z internetem. Biblioteka podpisująca pobiera łańcuch certyfikatów z adresów URL zapisanych w rozszerzeniu Authority Information Access (AIA) Twojego certyfikatu. Jeśli te serwery są nieosiągalne, podpisywanie nie powiedzie się dla certyfikatów wymagających walidacji łańcucha. + +## Zastosowania + +- Podpisywanie umów, ofert i porozumień prawnie wiążącymi podpisami cyfrowymi +- Poświadczanie oficjalnych dokumentów w procesach wymagających uwierzytelniania opartego na PKI +- Podpisywanie faktur PDF dla zgodności z przepisami (wiele krajów UE wymaga podpisanych cyfrowo e-faktur) +- Dodawanie organizacyjnego zatwierdzenia do rysunków technicznych lub dokumentów jakościowych + +## Wskazówki + +- Certyfikaty samopodpisane nadają się do testów, ale w Adobe Reader pokażą ostrzeżenia. W dokumentach produkcyjnych używaj certyfikatu od zaufanego urzędu certyfikacji. +- Widoczny podpis jest wyłącznie wizualny. Podpis kryptograficzny jest osadzany niezależnie od tego, czy widoczny blok jest włączony. +- Zweryfikuj podpisany PDF narzędziem Zweryfikuj podpis PDF, aby potwierdzić, że podpis jest nienaruszony. + +## Powiązane narzędzia + +- [Zweryfikuj podpis PDF](./validate-signature-pdf): weryfikuj podpisy cyfrowe w podpisanych plikach PDF +- [Spłaszcz PDF](./flatten-pdf): spłaszcz formularze przed podpisaniem, aby zapobiec modyfikacjom +- [Szyfruj PDF](./protect-pdf): dodaj ochronę hasłem na wierzch podpisu cyfrowego +- [Usuń metadane](./remove-metadata): usuń metadane przed podpisaniem diff --git a/docs/pl/tools/divide-pages.md b/docs/pl/tools/divide-pages.md new file mode 100644 index 00000000..c7ceadc3 --- /dev/null +++ b/docs/pl/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Podziel strony +description: Dziel strony PDF w poziomie lub w pionie na mniejsze podstrony. +--- + +# Podziel strony + +Przetnij pojedyncze strony PDF na połowy, dzieląc je w poziomie lub w pionie. Przydaje się, gdy jedna strona zawiera treść, którą należy rozdzielić na osobne strony, na przykład układ dwukolumnowy zeskanowany jako jedna szeroka strona. + +## Jak to działa + +1. Prześlij plik PDF. +2. Wybierz kierunek podziału: **Pionowo** (połowy lewa/prawa) lub **Poziomo** (połowy górna/dolna). +3. Opcjonalnie podaj zakres stron, aby ograniczyć, które strony zostaną podzielone. Zostaw puste, aby podzielić wszystkie strony. +4. Kliknij przycisk przetwarzania, aby wygenerować podzielony PDF. + +## Funkcje + +- Podział pionowy: dzieli każdą stronę na lewą i prawą połowę +- Podział poziomy: dzieli każdą stronę na górną i dolną połowę +- Filtr zakresu stron do selektywnego dzielenia wybranych stron +- Strony spoza zakresu są przekazywane bez zmian +- Zachowuje jakość treści bez ponownego renderowania + +## Zastosowania + +- Rozdzielanie zeskanowanych stron typu two-up (np. skan książki z lewą i prawą stroną na jednej kartce) +- Dzielenie poziomego PDF z treścią obok siebie na osobne strony pionowe +- Dzielenie wysokich infografik lub plakatów na osobne sekcje górną i dolną +- Przygotowanie dokumentów szerokoformatowych do druku na standardowym papierze + +## Wskazówki + +- Jeśli treść na stronach jest rozłożona nierówno, podział i tak następuje w dokładnym środku. Do podziałów asymetrycznych rozważ zamiast tego [Przytnij PDF](./crop-pdf). +- Połącz to narzędzie z [Obróć PDF](./rotate-pdf), jeśli strony wymagają obrotu przed podziałem lub po nim. + +## Powiązane narzędzia + +- [Podziel PDF](./split-pdf) +- [Przytnij PDF](./crop-pdf) +- [PDF N-Up](./n-up-pdf) +- [Plakatowanie PDF](./posterize-pdf) diff --git a/docs/pl/tools/duplex-collate.md b/docs/pl/tools/duplex-collate.md new file mode 100644 index 00000000..4f676cef --- /dev/null +++ b/docs/pl/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Sortowanie skanu dwustronnego +description: Zmień kolejność skanów dwustronnych PDF, w których strony przednie i tylne są w osobnych blokach, na właściwą kolejność przód/tył. +--- + +# Sortowanie skanu dwustronnego + +Sortowanie skanu dwustronnego jest przeznaczone do skanowania z podajnika ADF, gdzie jeden PDF zawiera dwa bloki stron: + +- najpierw wszystkie przednie strony +- potem wszystkie tylne strony + +Zamiast ręcznie dzielić i składać plik, to narzędzie przeplata oba bloki w naturalną kolejność czytania: przód1, tył1, przód2, tył2 i tak dalej. + +## Jak to działa + +1. Prześlij jeden PDF utworzony ze skanowania dwustronnego stosu. +2. Ustaw punkt podziału, w którym kończy się blok przodów. +3. Wybierz obsługę bloku tyłów: + - **Odwróć blok tyłów** (częste, gdy stos jest odwracany przed skanowaniem tyłów) + - **Zachowaj blok tyłów bez zmian** +4. Kliknij **Scal PDF**, aby pobrać wynik w nowej kolejności. + +## Opcje + +- **Automatyczne wykrycie podziału (połowa)**: ustawia punkt podziału na `ceil(totalPages / 2)`. +- **Ostrzeżenie o nieparzystej liczbie stron**: ostrzega, gdy łączna liczba stron jest nieparzysta (często oznacza niezgodność skanu). +- **Potwierdzenie nierównych bloków**: prosi o potwierdzenie, gdy rozmiary bloków przodów i tyłów się różnią. +- **Eksport grupowany**: dzieli scalony wynik na osobne pliki PDF według liczby stron oryginalnego dokumentu i pobiera je jako ZIP. + +## Zachowanie wyniku + +- **Domyślnie**: jeden wynikowy PDF (jeden PDF na wejściu, jeden PDF na wyjściu). +- **Tryb grupowany**: wynik jest dzielony na części według podanej liczby stron na dokument; jeśli powstanie kilka części, są pobierane jako jeden ZIP, w przeciwnym razie pobierany jest pojedynczy PDF. + +Jeśli rozmiary bloków są nierówne, sparowane strony są scalane najpierw, a pozostałe niesparowane strony są dołączane na końcu. + +## Typowe zastosowania + +- Przywracanie kolejności po skanowaniu stosu dwustronnych formularzy w dwóch przebiegach. +- Odtwarzanie kompletów przód/tył ze skanerów biurowych, które zwracają najpierw wszystkie przody, a potem wszystkie tyły. +- Obróbka końcowa skanów archiwalnych przed podziałem na pliki dla poszczególnych dokumentów. + +## Wskazówki + +- Większość partii dwustronnych powinna mieć parzystą łączną liczbę stron. +- Jeśli tyły wyglądają na odwrócone, przełącz między **Odwróć blok tyłów** a **Zachowaj blok tyłów bez zmian**. +- Dla dwustronicowych oryginałów (przód + tył) użyj eksportu grupowanego z `2` stronami na dokument. + +## Powiązane narzędzia + +- [Naprzemienne i mieszane strony](./alternate-merge) +- [Podziel PDF](./split-pdf) +- [Połącz PDF](./merge-pdf) +- [Duplikuj i organizuj](./organize-pdf) diff --git a/docs/pl/tools/edit-attachments.md b/docs/pl/tools/edit-attachments.md new file mode 100644 index 00000000..9c4d63a4 --- /dev/null +++ b/docs/pl/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Edytuj załączniki +description: Przeglądaj i selektywnie usuwaj pliki załączników osadzone w dokumencie PDF. +--- + +# Edytuj załączniki + +Sprawdzaj załączniki wewnątrz PDF i zarządzaj nimi. Narzędzie wyświetla każdy osadzony plik wraz z nazwą i poziomem załącznika, a następnie pozwala oznaczyć pojedyncze załączniki do usunięcia lub usunąć wszystkie naraz. + +## Jak to działa + +1. Prześlij plik PDF. +2. Narzędzie automatycznie skanuje załączniki i wyświetla je na liście. +3. Każdy załącznik pokazuje nazwę pliku i informację, czy jest załącznikiem na poziomie dokumentu, czy strony. +4. Kliknij ikonę kosza obok załącznika, aby oznaczyć go do usunięcia (kliknij ponownie, aby cofnąć oznaczenie). +5. Użyj przycisku **Usuń wszystkie załączniki**, aby zaznaczyć wszystko naraz, lub **Odznacz wszystko**, aby wyczyścić zaznaczenia. +6. Kliknij przycisk przetwarzania, aby zapisać nowy PDF bez wybranych załączników. + +## Funkcje + +- Wyświetla wszystkie załączniki na poziomie dokumentu i strony +- Usuwanie pojedyncze lub zbiorcze +- Włączanie i wyłączanie zaznaczenia przed zatwierdzeniem zmian +- Wizualne przekreślenie i zmiana przezroczystości elementów oznaczonych do usunięcia +- Pobiera zmodyfikowany PDF bez wybranych załączników + +## Zastosowania + +- Usuwanie nieaktualnych lub błędnych plików osadzonych w dokumencie przed jego rozpowszechnieniem +- Usuwanie wrażliwych załączników (dane finansowe, dane osobowe) z PDF przed udostępnieniem +- Zmniejszanie rozmiaru PDF przez usunięcie dużych osadzonych plików, które nie są już potrzebne +- Audyt osadzonej zawartości i porządkowanie dokumentu przed archiwizacją + +## Wskazówki + +- Załączniki oznaczone do usunięcia są pokazywane z wizualnym przekreśleniem. Możesz je przywrócić przed przetwarzaniem, jeśli zmienisz zdanie. +- Jeśli nie znaleziono żadnych załączników, narzędzie wyświetla wyraźny komunikat "Nie znaleziono załączników": PDF po prostu nie zawiera osadzonych plików. + +## Powiązane narzędzia + +- [Dodaj załączniki](./add-attachments) +- [Wyodrębnij załączniki](./extract-attachments) +- [Wyświetl metadane](./view-metadata) diff --git a/docs/pl/tools/edit-metadata.md b/docs/pl/tools/edit-metadata.md new file mode 100644 index 00000000..4236cc57 --- /dev/null +++ b/docs/pl/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Edytuj metadane +description: Przeglądaj i zmieniaj pola metadanych PDF, w tym tytuł, autora, słowa kluczowe, daty i właściwości niestandardowe. +--- + +# Edytuj metadane + +Edytuj metadane osadzone w pliku PDF. Narzędzie wstępnie wypełnia formularz istniejącymi metadanymi dokumentu, pozwala zmienić dowolne pole i zapisuje zmiany w nowym PDF. + +## Jak to działa + +1. Prześlij plik PDF. Narzędzie odczytuje jego bieżące metadane i wypełnia formularz. +2. Edytuj dowolne ze standardowych pól: Tytuł, Autor, Temat, Słowa kluczowe, Twórca, Producent. +3. Dostosuj Datę utworzenia i Datę modyfikacji za pomocą selektorów daty i godziny. +4. Dodaj własne pola metadanych, klikając przycisk dodawania i wpisując parę klucz-wartość. +5. Kliknij przycisk przetwarzania, aby zapisać zmodyfikowany PDF. + +## Funkcje + +- Wstępnie wypełnia wszystkie istniejące metadane z przesłanego PDF +- Pola standardowe: Tytuł, Autor, Temat, Słowa kluczowe, Twórca, Producent +- Selektory daty i godziny dla Daty utworzenia i Daty modyfikacji +- Własne pola metadanych klucz-wartość dla dowolnych właściwości +- Zapisuje zmiany bezpośrednio w słowniku informacji o dokumencie PDF + +## Edytowalne pola + +| Pole | Opis | +| ----------------------- | -------------------------------------------------------------- | +| **Tytuł** | Tytuł dokumentu wyświetlany w czytnikach PDF | +| **Autor** | Osoba lub organizacja, która utworzyła dokument | +| **Temat** | Krótki opis tematu dokumentu | +| **Słowa kluczowe** | Terminy oddzielone przecinkami do wyszukiwania i kategoryzacji | +| **Twórca** | Aplikacja, która pierwotnie utworzyła treść | +| **Producent** | Aplikacja, która wygenerowała PDF | +| **Data utworzenia** | Kiedy dokument został pierwotnie utworzony | +| **Data modyfikacji** | Kiedy dokument został ostatnio zmodyfikowany | +| **Pola niestandardowe** | Wszelkie dodatkowe pary klucz-wartość, które zdefiniujesz | + +## Zastosowania + +- Ustawienie właściwego tytułu i autora przed publikacją dokumentu +- Dodawanie słów kluczowych, aby poprawić wyszukiwalność w systemach zarządzania dokumentami +- Aktualizacja daty modyfikacji, aby odzwierciedlała bieżącą wersję +- Dodawanie własnych pól metadanych, takich jak Dział, ID projektu lub Klasyfikacja +- Czyszczenie metadanych pozostawionych przez oryginalne oprogramowanie autorskie + +## Wskazówki + +- Pola niestandardowe są zapisywane bezpośrednio w słowniku informacji PDF. Niektóre czytniki PDF mogą ich nie wyświetlać, ale są zachowane w pliku. +- Zostaw pole puste, aby usunąć je z metadanych. Przycisk przetwarzania zapisuje wszystko, co jest w formularzu. +- Aby wyświetlić metadane bez edycji, użyj [Wyświetl metadane](./view-metadata). Aby całkowicie usunąć wszystkie metadane, użyj Usuń metadane. + +## Powiązane narzędzia + +- [Wyświetl metadane](./view-metadata) +- [Warstwy PDF (OCG)](./pdf-layers) +- [Kompresuj PDF](./compress-pdf) diff --git a/docs/pl/tools/edit-pdf.md b/docs/pl/tools/edit-pdf.md new file mode 100644 index 00000000..4d821e4c --- /dev/null +++ b/docs/pl/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Edytor PDF +description: Dodawaj adnotacje, zakreślaj, redaguj (zaczerniaj), dodawaj kształty i obrazy, wyszukuj i przeglądaj pliki PDF bezpośrednio w przeglądarce. +--- + +# Edytor PDF + +Edytor PDF w BentoPDF pozwala dodawać adnotacje, zakreślać, redagować (zaczerniać), komentować, dodawać kształty i obrazy oraz przeszukiwać pliki PDF. Ładuje w pełni funkcjonalny edytor bezpośrednio w przeglądarce, bez wysyłania plików na serwer. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając do niej plik. +2. Wbudowany edytor PDF otworzy się automatycznie z załadowanym dokumentem. +3. Użyj paska narzędzi, aby dodawać adnotacje, zakreślać, redagować, dodawać tekst, rysować kształty lub wstawiać obrazy. +4. Kliknij **Pobierz edytowany PDF**, aby zapisać zmiany. + +## Funkcje + +- Pełny pasek narzędzi adnotacji z zakreślaniem, podkreślaniem, przekreślaniem i rysowaniem odręcznym +- Wstawianie tekstu i komentowanie +- Narzędzia redakcji, które trwale usuwają oznaczoną treść po zastosowaniu redakcji. Jeśli jakieś oznaczenia nie zostały zastosowane po kliknięciu **Pobierz edytowany PDF**, edytor zaproponuje ich wcześniejsze zastosowanie. +- Narzędzia kształtów: prostokąty, okręgi, linie i strzałki +- Wstawianie obrazów na strony PDF +- Wbudowane wyszukiwanie tekstu w dokumencie +- Obsługa wielu dokumentów z kartami (do 10 jednocześnie otwartych dokumentów) +- Wczytywanie plików przez przeciągnij i upuść + +## Zastosowania + +- Przeglądanie umów i oznaczanie zmian zakreśleniami i komentarzami +- Redagowanie poufnych informacji, takich jak numery PESEL lub dane finansowe, przed udostępnieniem +- Dodawanie adnotacji do planów architektonicznych lub rysunków technicznych +- Wstawianie logo firmy lub pieczątek na strony dokumentu +- Przeszukiwanie długich dokumentów prawnych w poszukiwaniu określonych terminów + +## Wskazówki + +- Możesz otworzyć wiele plików PDF naraz i przełączać się między nimi za pomocą paska kart u góry edytora. +- Edytor zachowuje oryginalną strukturę PDF, więc czcionki, układy i pola formularzy pozostają nienaruszone. +- Oznaczenie tekstu lub obszaru do redakcji niczego nie usuwa, dopóki redakcja nie zostanie zastosowana. Gdy redagujesz zaznaczony tekst, jego kopie we właściwościach pliku, zakładkach, komentarzach i załącznikach są również usuwane z pobranego pliku, chyba że plik jest zaszyfrowany. +- Do zbiorczego dodawania znaków wodnych lub numeracji stron użyj dedykowanych narzędzi, które dają większą kontrolę nad formatowaniem. + +## Powiązane narzędzia + +- [Dodaj znak wodny](./add-watermark) +- [Podpisz PDF](./sign-pdf) +- [Dodaj pieczątki](./add-stamps) +- [Usuń adnotacje](./remove-annotations) diff --git a/docs/pl/tools/email-to-pdf.md b/docs/pl/tools/email-to-pdf.md new file mode 100644 index 00000000..f85c29ec --- /dev/null +++ b/docs/pl/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-mail na PDF +description: Konwertuj pliki e-mail EML i MSG na PDF w przeglądarce. Zachowuje nagłówki, treść i listę załączników. +--- + +# E-mail na PDF + +Zamień zapisane pliki e-mail na czyste, nadające się do druku pliki PDF. Narzędzie parsuje pliki EML i MSG, wyodrębnia całą wiadomość (nagłówki, treść i metadane załączników) i renderuje wszystko w uporządkowany PDF. Przydaje się do e-discovery, prowadzenia dokumentacji lub zwykłego wydrukowania ważnego e-maila. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----- | :----------- | :------------------------------------------------------------------------- | +| EML | `.eml` | Standardowy format e-mail MIME (eksportowany z większości klientów poczty) | +| MSG | `.msg` | Własnościowy format Microsoft Outlook | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki EML lub MSG. W jednej partii możesz mieszać oba formaty. +2. Przejrzyj listę plików. Usuń niechciane pozycje ikoną kosza lub kliknij **Dodaj więcej plików**, aby dołączyć kolejne e-maile. +3. Skonfiguruj opcje konwersji (patrz niżej). +4. Kliknij **Konwertuj na PDF**. Narzędzie parsuje każdy e-mail, renderuje treść jako stylizowany HTML i konwertuje ją na PDF przez silnik PyMuPDF. +5. Pojedynczy e-mail pobiera się bezpośrednio jako PDF. Wiele e-maili jest pakowanych do `emails-converted.zip`. + +## Opcje + +| Opcja | Domyślnie | Opis | +| :--------------------------- | :-------- | :---------------------------------------------------------------------------------------- | +| **Rozmiar strony** | A4 | Wybierz wymiary strony: A4, Letter lub Legal. | +| **Dołącz DW i UDW** | Włączone | Po włączeniu listy odbiorców DW i UDW pojawiają się w sekcji nagłówka e-maila w PDF. | +| **Dołącz listę załączników** | Włączone | Po włączeniu w PDF pojawia się lista załączników e-maila (z nazwami plików i rozmiarami). | + +## Zastosowania + +- Archiwizacja ważnej korespondencji biznesowej jako PDF na potrzeby zgodności lub audytu +- Drukowanie wątków e-mail na potrzeby postępowań prawnych lub wniosków o ujawnienie dokumentów +- Tworzenie trwałego zapisu potwierdzeń zamówień, paragonów lub umów otrzymanych e-mailem +- Tworzenie kopii zapasowych plików MSG z Outlooka w formacie, który nie wymaga Outlooka do odczytu +- Dokumentowanie kontaktów z obsługą klienta na podstawie wyeksportowanych plików EML + +## Wskazówki + +- Obsługiwane są zarówno pliki EML (używane przez Thunderbirda, Apple Mail i większość klientów poczty), jak i pliki MSG z Outlooka. Wyeksportuj e-maile z klienta poczty i upuść je bezpośrednio w narzędziu. +- E-maile w formacie HTML zachowują swoją stylizację w PDF. E-maile w czystym tekście są renderowane z czytelnym, przejrzystym formatowaniem. +- Lista załączników pokazuje nazwy plików i rozmiary, ale nie osadza samych plików załączników w PDF. + +## Powiązane narzędzia + +- [XML na PDF](./xml-to-pdf) +- [XPS na PDF](./xps-to-pdf) diff --git a/docs/pl/tools/epub-to-pdf.md b/docs/pl/tools/epub-to-pdf.md new file mode 100644 index 00000000..a97dc428 --- /dev/null +++ b/docs/pl/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB na PDF +description: Konwertuj e-booki EPUB na PDF w przeglądarce. Za darmo, bez wysyłania plików, konwersja z myślą o prywatności. +--- + +# EPUB na PDF + +Konwertuj e-booki EPUB na pliki PDF bez opuszczania przeglądarki. EPUB to otwarty standard książek cyfrowych, ale czasem potrzebny jest PDF o stałym układzie do druku, dodawania adnotacji lub udostępniania osobom bez czytnika e-booków. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----- | :----------- | :-------------------- | +| EPUB | `.epub` | Pliki EPUB 2 i EPUB 3 | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki EPUB. Obsługiwane jest zaznaczanie wielu plików. +2. Przejrzyj przesłane pliki. Usuń niechciane pozycje ikoną kosza lub kliknij **Dodaj więcej plików**, aby rozszerzyć partię. +3. Kliknij **Konwertuj na PDF**. Silnik PyMuPDF renderuje zawartość EPUB (tekst, obrazy i formatowanie) do podzielonego na strony PDF. +4. Pojedynczy plik EPUB pobiera się bezpośrednio jako PDF. Wiele plików jest pakowanych do archiwum ZIP o nazwie `epub-converted.zip`. + +## Opcje + +Konwersja działa z rozsądnymi ustawieniami domyślnymi i nie wymaga konfiguracji. Tekst jest układany na nowo w standardowych wymiarach strony, a osadzone czcionki i obrazy są przenoszone do PDF. + +## Zastosowania + +- Drukowanie e-booka bez DRM do czytania z dala od ekranów +- Przesyłanie manuskryptu EPUB jako PDF o stałym układzie do recenzji +- Archiwizacja książek cyfrowych w formacie, który otworzy natywnie każdy system operacyjny +- Udostępnienie rozdziału współpracownikowi, który nie ma czytnika EPUB +- Konwersja dokumentacji technicznej dystrybuowanej jako EPUB na pliki PDF z możliwością adnotacji + +## Wskazówki + +- Funkcje EPUB 3, takie jak osadzone audio i wideo, nie zostaną przeniesione do PDF, ale cały tekst, obrazy i tabele konwertują się poprawnie. +- Aby uzyskać najlepsze wyniki z mocno stylizowanymi plikami EPUB, sprawdź kilka pierwszych stron wyniku, aby potwierdzić wierność układu. + +## Powiązane narzędzia + +- [MOBI na PDF](./mobi-to-pdf) +- [FB2 na PDF](./fb2-to-pdf) +- [CBZ na PDF](./cbz-to-pdf) diff --git a/docs/pl/tools/excel-to-pdf.md b/docs/pl/tools/excel-to-pdf.md new file mode 100644 index 00000000..d3e67b16 --- /dev/null +++ b/docs/pl/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel na PDF +description: Konwertuj arkusze Excel (XLS, XLSX), ODS i pliki CSV na PDF z zachowaniem formatowania. +--- + +# Excel na PDF + +Konwertuj pliki arkuszy kalkulacyjnych na PDF. Narzędzie obsługuje nowoczesne pliki Excel, starszy format XLS, arkusze OpenDocument, a nawet CSV, wszystko renderowane przez działający w przeglądarce silnik LibreOffice, który zachowuje formatowanie komórek, formuły (jako obliczone wartości), wykresy i układy wielu arkuszy. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :------------------ | :----------- | +| Excel (nowoczesny) | `.xlsx` | +| Excel (starszy) | `.xls` | +| Arkusz OpenDocument | `.ods` | +| CSV | `.csv` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki arkuszy kalkulacyjnych. +2. Przejrzyj listę plików. Dodaj kolejne pliki lub usuń niechciane. +3. Kliknij **Konwertuj na PDF**. Silnik LibreOffice inicjalizuje się przy pierwszym użyciu, a następnie przetwarza każdy plik. +4. Pojedynczy plik pobiera się bezpośrednio jako PDF. Wiele plików jest dostarczanych jako `excel-converted.zip`. + +## Opcje + +To narzędzie nie ma dodatkowej konfiguracji. Silnik LibreOffice określa układ strony, skalowanie i obszar wydruku na podstawie wbudowanych ustawień arkusza. + +## Wynik + +| Liczba plików wejściowych | Wynik | +| :------------------------ | :------------------------------------------------------------------- | +| 1 plik | Pobranie jednego PDF (oryginalna nazwa pliku z rozszerzeniem `.pdf`) | +| 2+ pliki | Archiwum ZIP (`excel-converted.zip`) z jednym PDF na każdy plik | + +## Zastosowania + +- Konwersja raportów finansowych lub budżetów z Excela na PDF do dystrybucji +- Tworzenie gotowych do druku plików PDF z arkuszy inwentarza lub katalogu produktów +- Udostępnianie wyników analizy danych interesariuszom, którzy nie mają zainstalowanego Excela +- Archiwizacja raportów kwartalnych w formacie bez możliwości edycji +- Konwersja plików ODS z LibreOffice Calc na PDF + +## Wskazówki + +- Wykresy osadzone w arkuszu są renderowane w PDF. Przed konwersją upewnij się, że wyglądają poprawnie w pliku źródłowym. +- Jeśli arkusz ma wiele arkuszy (kart), wszystkie są uwzględniane w wynikowym PDF. +- Dla prostych danych CSV bez formatowania narzędzie [CSV na PDF](./csv-to-pdf) zapewnia lżejszą konwersję. Użyj Excel na PDF, gdy potrzebujesz zachować formatowanie, wykresy lub wiele arkuszy. + +## Powiązane narzędzia + +- [CSV na PDF](./csv-to-pdf) +- [Word na PDF](./word-to-pdf) +- [PowerPoint na PDF](./powerpoint-to-pdf) diff --git a/docs/pl/tools/extract-attachments.md b/docs/pl/tools/extract-attachments.md new file mode 100644 index 00000000..f003eeb2 --- /dev/null +++ b/docs/pl/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Wyodrębnij załączniki +description: Wyodrębnij wszystkie osadzone pliki załączników z jednego lub wielu plików PDF i pobierz je jako archiwum ZIP. +--- + +# Wyodrębnij załączniki + +Wyciągnij każdy osadzony załącznik z jednego lub wielu plików PDF. Wszystkie wyodrębnione pliki są pakowane do jednego archiwum ZIP do pobrania. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF zawierających osadzone załączniki. +2. Kliknij **Wyodrębnij załączniki**. +3. Narzędzie skanuje każdy PDF pod kątem załączników na poziomie dokumentu i strony. +4. Wszystkie znalezione pliki są pakowane do archiwum ZIP i pobierane automatycznie. +5. Komunikat o stanie potwierdza, ile załączników znaleziono i jaki jest ich łączny rozmiar. + +## Funkcje + +- Wyodrębnianie wsadowe z wielu plików PDF naraz +- Wyodrębnia załączniki na poziomie dokumentu i strony +- Zwraca jeden plik ZIP ze wszystkimi wyodrębnionymi plikami +- Wyświetla łączną liczbę załączników i łączny rozmiar plików +- Czytelne komunikaty, jeśli nie znaleziono załączników + +## Zastosowania + +- Odzyskiwanie plików danych osadzonych w raporcie PDF +- Wyciąganie zasobów graficznych z portfolio lub dokumentu specyfikacji +- Wyodrębnianie materiałów dodatkowych z plików PDF szkoleniowych lub dotyczących zgodności +- Audyt plików osadzonych w partii plików PDF + +## Wskazówki + +- Jeśli narzędzie zgłasza brak załączników, PDF może zawierać osadzone obrazy lub dane formularzy, które nie są załącznikami plikowymi. Dla osadzonych obrazów użyj [Wyodrębnij obrazy](./extract-images). +- Przy przetwarzaniu wielu plików PDF wszystkie załączniki ze wszystkich plików trafiają do jednego ZIP. Nazwy plików są zachowywane z oryginalnych osadzeń. + +## Powiązane narzędzia + +- [Dodaj załączniki](./add-attachments) +- [Edytuj załączniki](./edit-attachments) +- [Wyodrębnij obrazy](./extract-images) diff --git a/docs/pl/tools/extract-images.md b/docs/pl/tools/extract-images.md new file mode 100644 index 00000000..c47a7478 --- /dev/null +++ b/docs/pl/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Wyodrębnij obrazy +description: Wyodrębnij wszystkie osadzone obrazy z plików PDF. Przeglądaj je w siatce i pobieraj pojedynczo lub jako archiwum ZIP. +--- + +# Wyodrębnij obrazy + +Wyciąga wszystkie osadzone obrazy z jednego lub wielu plików PDF. Wyodrębnione obrazy są wyświetlane w siatce podglądu, gdzie możesz pobierać je pojedynczo lub wszystkie naraz jako ZIP. Działa na PyMuPDF. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając na nią pliki. W razie potrzeby dodaj więcej plików lub usuń pojedyncze. +2. Kliknij **Wyodrębnij**, aby rozpocząć przetwarzanie. +3. Narzędzie skanuje każdą stronę każdego przesłanego PDF, znajdując i wyodrębniając osadzone obrazy. +4. Wyodrębnione obrazy pojawiają się w siatce z miniaturami. Każdy obraz ma przycisk pobierania. +5. Kliknij **Pobierz wszystko**, aby zapisać całość jako archiwum ZIP. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Wszystkie osadzone obrazy są wyodrębniane w natywnym formacie (zwykle PNG, JPEG lub w formacie użytym przy osadzaniu obrazu w PDF). + +## Format wyniku + +- Obrazy są wyświetlane w siatce podglądu pod nazwami `image_1.png`, `image_2.jpg` itd. +- **Pobierz wszystko** tworzy `extracted-images.zip` ze wszystkimi obrazami. +- Pojedyncze obrazy można pobierać po jednym z siatki. + +## Zastosowania + +- Odzyskiwanie zdjęć lub grafik z PDF do ponownego użycia w innym projekcie. +- Wyodrębnianie zdjęć produktów z katalogu PDF do oferty w sklepie internetowym. +- Wyciąganie diagramów z dokumentacji technicznej do prezentacji. +- Audyt obrazów osadzonych w dokumencie przed jego udostępnieniem. + +## Wskazówki + +- Narzędzie wyodrębnia obrazy dokładnie tak, jak są zapisane w PDF. Nie renderuje stron jako obrazów. Do tego użyj [PDF na PNG](./pdf-to-png) lub [PDF na JPG](./pdf-to-jpg). +- Jeśli narzędzie zgłasza "Nie znaleziono obrazów", PDF może używać grafiki wektorowej zamiast osadzonych obrazów rastrowych lub może być zeskanowanym dokumentem, w którym cała strona jest jednym dużym obrazem. +- Przetwarzanie wsadowe działa na wielu plikach PDF. Wszystkie obrazy ze wszystkich plików są łączone w jedną siatkę i jeden ZIP. + +## Powiązane narzędzia + +- [PDF na PNG](./pdf-to-png) +- [PDF na JPG](./pdf-to-jpg) +- [Kreator przepływów PDF](./pdf-workflow) diff --git a/docs/pl/tools/extract-pages.md b/docs/pl/tools/extract-pages.md new file mode 100644 index 00000000..62a95c78 --- /dev/null +++ b/docs/pl/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Wyodrębnij strony +description: Zapisz wybrany zakres stron z PDF jako nowy dokument. +--- + +# Wyodrębnij strony + +Wyciągnij zestaw stron z PDF i zapisz je jako nowy plik. Podaj dokładnie, które strony chcesz, używając składni zakresów, a narzędzie utworzy czysty PDF zawierający tylko te strony. + +## Jak to działa + +1. Prześlij plik PDF. Narzędzie wyświetla nazwę pliku, rozmiar i łączną liczbę stron. +2. Wpisz strony do wyodrębnienia, używając składni zakresów (np. `1-5`, `3, 7, 10-12`). +3. Opcjonalnie wybierz pobieranie każdego zakresu jako osobnego PDF w archiwum ZIP. +4. Kliknij przycisk przetwarzania. Wyodrębnione strony zostaną pobrane jako nowy PDF (lub ZIP). + +## Funkcje + +- Elastyczna składnia zakresów stron: pojedyncze strony, zakresy lub kombinacje oddzielone przecinkami +- Wyświetla łączną liczbę stron po przesłaniu dla łatwego odniesienia +- Możliwość zwrócenia jednego połączonego PDF lub osobnych plików w ZIP +- Zachowuje oryginalną treść i formatowanie stron + +## Zastosowania + +- Wyciąganie streszczenia dla zarządu (kilka pierwszych stron) z długiego raportu +- Wyodrębnianie pojedynczego rozdziału z podręcznika w PDF +- Zapisywanie wybranych stron z pakietu formularzy jako samodzielnych dokumentów +- Tworzenie przykładowego dokumentu z wybranych stron większego pliku + +## Wskazówki + +- Numery stron liczone są od 1. Użyj `1` dla pierwszej strony, nie `0`. +- Do usuwania stron zamiast ich wyodrębniania użyj [Usuń strony](./delete-pages): to operacja odwrotna. +- Jeśli potrzebujesz wizualnego wyboru stron z miniaturami, użyj [Podziel PDF](./split-pdf) w trybie Wizualny wybór. + +## Powiązane narzędzia + +- [Podziel PDF](./split-pdf) +- [Usuń strony](./delete-pages) +- [Połącz PDF](./merge-pdf) diff --git a/docs/pl/tools/extract-tables.md b/docs/pl/tools/extract-tables.md new file mode 100644 index 00000000..d7539e0f --- /dev/null +++ b/docs/pl/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Wyodrębnij tabele PDF +description: Wykrywaj i wyodrębniaj tabele z dokumentów PDF. Eksportuj jako CSV, JSON lub Markdown z dokładnością do pojedynczej tabeli. +--- + +# Wyodrębnij tabele PDF + +Wykrywa wszystkie tabele w PDF i pozwala wyeksportować je w wybranym formacie: CSV, JSON lub Markdown. Każda tabela jest wyodrębniana osobno wraz z metadanymi strony i położenia. Działa na silniku wykrywania tabel PyMuPDF. + +## Jak to działa + +1. Prześlij PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Wybierz preferowany **format eksportu**: CSV, JSON lub Markdown. +3. Kliknij **Wyodrębnij**, aby rozpocząć przetwarzanie. +4. Jeśli znaleziono jedną tabelę, pobiera się ją jako pojedynczy plik. Wiele tabel daje archiwum ZIP z jednym plikiem na tabelę. + +## Opcje + +- **Format eksportu**: wybierz spośród: + - **CSV**: wartości oddzielone przecinkami z prawidłowym cytowaniem pól zawierających przecinki, cudzysłowy lub znaki nowej linii. Odpowiedni dla arkuszy kalkulacyjnych i baz danych. + - **JSON**: struktura tablicy tablic, sformatowana z wcięciem 2 spacji. Odpowiedni do przetwarzania programowego. + - **Markdown**: format tabeli rozdzielanej znakami pionowej kreski, renderowany przez PyMuPDF. Odpowiedni dla dokumentacji i plików README. + +## Format wyniku + +- **Pojedyncza tabela**: `filename_table.csv` (lub `.json` / `.md`) +- **Wiele tabel**: `filename_tables.zip` zawierający pliki o nazwach `table_1_page3.csv`, `table_2_page5.csv` itd. + +## Zastosowania + +- Wyodrębnianie wybranych tabel z długich raportów PDF bez pobierania danych z całego dokumentu. +- Uzyskiwanie tabel w formacie Markdown do wklejania bezpośrednio w zgłoszenia GitHub, wiki lub dokumentację. +- Pobieranie ustrukturyzowanych danych JSON z tabel PDF do integracji API lub skryptów. +- Porównywanie tabel między różnymi wersjami PDF przez wyeksportowanie obu do CSV i porównanie różnic. + +## Wskazówki + +- To narzędzie daje kontrolę nad każdą tabelą osobno. Jeśli chcesz po prostu wrzucić wszystkie tabele do jednego pliku CSV, użyj [PDF na CSV](./pdf-to-csv). Dla pełnego skoroszytu Excel użyj [PDF na Excel](./pdf-to-excel). +- Tabele obejmujące wiele stron mogą zostać wykryte jako osobne tabele na każdej stronie. Może być konieczne ręczne ich połączenie. +- Jeśli nie wykryto żadnych tabel, PDF może być zeskanowanym obrazem. Najpierw uruchom na nim OCR, aby dodać warstwę tekstową. + +## Powiązane narzędzia + +- [PDF na CSV](./pdf-to-csv) +- [PDF na Excel](./pdf-to-excel) +- [PDF na Tekst](./pdf-to-text) diff --git a/docs/pl/tools/fb2-to-pdf.md b/docs/pl/tools/fb2-to-pdf.md new file mode 100644 index 00000000..d722681d --- /dev/null +++ b/docs/pl/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 na PDF +description: Konwertuj e-booki FictionBook (FB2) na PDF w przeglądarce. Za darmo, prywatnie, bez wysyłania na serwer. +--- + +# FB2 na PDF + +Konwertuj pliki FictionBook 2 (FB2) na dokumenty PDF. FB2 to oparty na XML format e-booków, popularny w Rosji i Europie Wschodniej. Na jednych platformach jest dobrze obsługiwany, a na innych praktycznie nieznany, więc konwersja do PDF sprawia, że książki da się czytać wszędzie. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :------------ | :----------- | :---------------------------- | +| FictionBook 2 | `.fb2` | Format e-booków oparty na XML | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki FB2. Możesz wybrać wiele plików naraz. +2. Sprawdź listę plików. Ikoną kosza usuniesz pojedyncze pozycje, a przyciskiem **Dodaj więcej plików** dodasz kolejne. +3. Kliknij **Konwertuj na PDF**. Silnik PyMuPDF analizuje strukturę XML pliku FB2 i renderuje ją jako stronicowaną zawartość PDF. +4. Pojedynczy plik pobierze się bezpośrednio jako PDF. Wiele konwersji zostanie spakowanych do `fb2-converted.zip`. + +## Opcje + +Nie jest potrzebna żadna konfiguracja. Konwerter automatycznie obsługuje strukturę XML FB2, zachowując podziały rozdziałów, formatowanie i osadzone obrazy. + +## Zastosowania + +- Czytanie e-booków FB2 na urządzeniach lub w aplikacjach, które obsługują tylko PDF +- Drukowanie literatury rosyjskojęzycznej rozpowszechnianej w formacie FB2 +- Archiwizowanie biblioteki FB2 w powszechnie obsługiwanym formacie +- Udostępnianie książki osobie, której czytnik nie obsługuje FictionBook + +## Wskazówki + +- Pliki FB2 to zwykły XML, więc zwykle są małe i konwertują się szybko nawet w przeglądarce. +- Jeśli pliki FB2 są skompresowane jako `.fb2.zip`, najpierw je rozpakuj, a dopiero potem prześlij. + +## Powiązane narzędzia + +- [EPUB na PDF](./epub-to-pdf) +- [MOBI na PDF](./mobi-to-pdf) +- [XML na PDF](./xml-to-pdf) diff --git a/docs/pl/tools/fix-page-size.md b/docs/pl/tools/fix-page-size.md new file mode 100644 index 00000000..20a9ad28 --- /dev/null +++ b/docs/pl/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Napraw rozmiar strony +description: Ujednolić wszystkie strony PDF do jednego rozmiaru. Wybierz standardowy format papieru lub ustaw własne wymiary. +--- + +# Napraw rozmiar strony + +PDF-y złożone z wielu źródeł często mają strony o różnych rozmiarach: jedne w formacie Letter, inne A4, a jeszcze inne zupełnie niestandardowe. To narzędzie wymusza jeden docelowy rozmiar dla każdej strony, skalując zawartość tak, aby pasowała lub wypełniała stronę. + +## Jak to działa + +1. Prześlij plik PDF. +2. Wybierz **Docelowy rozmiar strony** z listy rozwijanej (A4, Letter, Legal, A3, A5, Tabloid lub Niestandardowy). +3. Wybierz **Orientację**: Auto zachowuje oryginalną orientację każdej strony, ale możesz też wymusić pionową lub poziomą. +4. Wybierz tryb **Skalowania zawartości**: Dopasuj (zachowuje całą zawartość, może dodać marginesy) lub Wypełnij (wypełnia stronę, może przyciąć krawędzie). +5. Opcjonalnie ustaw **Kolor tła** dla dodanych marginesów. +6. Kliknij **Napraw rozmiar strony**. + +## Opcje + +- **Standardowe rozmiary**: A4, Letter, Legal, A3, A5, Tabloid +- **Własne wymiary**: Podaj szerokość i wysokość w calach lub milimetrach +- **Orientacja**: Auto, pionowa, pozioma +- **Tryb skalowania**: Dopasuj lub Wypełnij (z przycięciem) +- **Kolor tła**: Dowolny kolor wypełnienia marginesów + +## Zastosowania + +- Ujednolicanie połączonego PDF-a, którego strony pochodziły z różnych skanerów +- Konwersja dokumentu w formacie US Letter na A4 na potrzeby międzynarodowej dystrybucji +- Przygotowanie PDF-ów do druku, które wymagają stałego rozmiaru po przycięciu +- Naprawa stron o lekko niestandardowych wymiarach (np. 8,49 x 11,02 cala zamiast 8,5 x 11) + +## Wskazówki + +- Użyj trybu Dopasuj, aby mieć pewność, że żadna zawartość nie zginie. Tryb Wypełnij wygląda czyściej, ale może przyciąć krawędzie. +- Sprawdź wynik narzędziem Wymiary strony, aby upewnić się, że każda strona odpowiada rozmiarowi docelowemu. +- Domyślny kolor tła to biały. Przełącz na ciemny, jeśli dokument ma ciemne marginesy. + +## Powiązane narzędzia + +- [Wymiary strony](./page-dimensions): sprawdź rozmiary stron przed naprawą i po niej +- [Kompresuj PDF](./compress-pdf): zmniejsz rozmiar pliku po ujednoliceniu +- [Przytnij PDF](./crop-pdf): przytnij strony ręcznie zamiast skalować automatycznie diff --git a/docs/pl/tools/flatten-pdf.md b/docs/pl/tools/flatten-pdf.md new file mode 100644 index 00000000..304925cc --- /dev/null +++ b/docs/pl/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Spłaszcz PDF +description: Spłaszcz interaktywne formularze i adnotacje do statycznej zawartości. Pola formularza przestają być edytowalne, a adnotacje zostają wtopione w stronę. +--- + +# Spłaszcz PDF + +Spłaszczanie wtapia elementy interaktywne (pola formularzy, listy rozwijane, pola wyboru, adnotacje, podświetlenia, karteczki) bezpośrednio w zawartość strony. Wygląd pozostaje taki sam, ale nic nie da się już edytować ani wyodrębnić. To odpowiednik wydrukowania wypełnionego formularza i zeskanowania go z powrotem, tyle że jakość pozostaje idealna. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF. +2. Kliknij **Spłaszcz PDF**. +3. Pojedynczy plik pobierze się bezpośrednio. Wiele plików da archiwum ZIP. + +Narzędzie używa pdf-lib do spłaszczania pól formularzy (przez `form.flatten()`) oraz dedykowanego mechanizmu do wtapiania adnotacji w strumień strony. Obie operacje odbywają się w jednym przebiegu. + +## Co zostaje spłaszczone + +- **Pola formularzy**: pola tekstowe, pola wyboru, przyciski opcji, listy rozwijane, pola podpisu +- **Adnotacje**: komentarze, podświetlenia, przekreślenia, podkreślenia, karteczki, pieczątki, adnotacje odręczne +- **Elementy interaktywne**: przyciski, wyzwalacze akcji + +## Co pozostaje bez zmian + +- Zawartość tekstowa (nadal można ją zaznaczać i przeszukiwać) +- Obrazy i grafiki +- Układ i wymiary stron +- Zakładki i spis treści +- Hiperłącza (chyba że są oparte na adnotacjach) + +## Zastosowania + +- Zablokowanie wypełnionego formularza, aby odbiorcy nie mogli zmienić przesłanych odpowiedzi +- Przygotowanie PDF-a do archiwizacji, gdzie elementy interaktywne są zbędne +- Naprawa problemów z wyświetlaniem, gdy adnotacje renderują się inaczej w różnych przeglądarkach PDF +- Upewnienie się, że podpisanego dokumentu nie da się zmodyfikować po złożeniu podpisu +- Zmniejszenie rozmiaru pliku przez usunięcie definicji pól formularzy i obiektów adnotacji + +## Wskazówki + +- Spłaszczaj dopiero po zakończeniu wszystkich edycji. Nie da się cofnąć spłaszczenia PDF-a. +- Jeśli oprócz spłaszczenia chcesz usunąć metadane, JavaScript i załączniki, użyj zamiast tego narzędzia Sanityzuj PDF, które ma spłaszczanie wśród swoich opcji. +- Niektóre PDF-y zgłaszają "nie znaleziono formularza". To normalne, jeśli dokument ma tylko adnotacje i nie ma pól formularza. + +## Powiązane narzędzia + +- [Sanityzuj PDF](./sanitize-pdf): spłaszcz formularze i usuń metadane, skrypty i więcej +- [Rasteryzuj PDF](./rasterize-pdf): zamień na PDF oparty na obrazach, aby spłaszczyć maksymalnie +- [Czcionka na krzywe](./font-to-outline): zamień czcionki na ścieżki wektorowe +- [Szyfruj PDF](./protect-pdf): zablokuj spłaszczony PDF hasłem diff --git a/docs/pl/tools/font-to-outline.md b/docs/pl/tools/font-to-outline.md new file mode 100644 index 00000000..bdbc1a44 --- /dev/null +++ b/docs/pl/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Czcionka na krzywe +description: Zamień wszystkie czcionki PDF na kontury wektorowe, aby dokument wyglądał tak samo na każdym urządzeniu. Eliminuje problemy z zależnością od czcionek. +--- + +# Czcionka na krzywe + +Zamiana czcionek na krzywe przekształca każdy znak tekstu z glifu opartego na czcionce w ścieżkę wektorową. PDF przestaje zależeć od zainstalowanych czcionek: wygląda identycznie na każdym urządzeniu, w każdym systemie operacyjnym i na każdej drukarce. To standardowy krok w pracy przedprodukcyjnej (prepress). + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF. +2. Kliknij **Konwertuj na krzywe**. +3. Ghostscript zamienia cały tekst na ścieżki wektorowe. +4. Pobierz wynik. Wiele plików da archiwum ZIP. + +Nie ma żadnych ustawień do skonfigurowania. Narzędzie używa Ghostscript (WebAssembly), aby w jednym przebiegu zamienić wszystkie odwołania do czcionek na ścieżki konturowe. + +## Co się zmienia + +- Znaki tekstu stają się krzywymi wektorowymi (ścieżkami béziera) +- Osadzanie czcionek nie jest już potrzebne, a PDF jest samowystarczalny na poziomie glifów +- Rozmiar pliku może wzrosnąć, ponieważ ścieżki wektorowe są zwykle większe niż odwołania do czcionek +- Wygląd wizualny zostaje zachowany co do joty + +## Co tracisz + +- Zaznaczanie tekstu i kopiowanie +- Możliwość przeszukiwania tekstu (Ctrl+F przestaje działać) +- Możliwość edycji treści tekstu +- Dostępność dla czytników ekranu + +## Zastosowania + +- Wysyłanie PDF-ów do drukarni, która wymaga czcionek zamienionych na krzywe +- Udostępnianie dokumentów z własnymi lub licencjonowanymi czcionkami osobom, które ich nie mają +- Zapobieganie podmianie czcionek, która zmienia wygląd dokumentu w innych systemach +- Przygotowanie PDF-ów do grawerowania laserowego lub cięcia CNC, które wymagają wejścia wektorowego +- Zapewnienie, że PDF z wieloma logotypami wyświetla się poprawnie na wszystkich platformach + +## Wskazówki + +- Zachowaj oryginalny PDF. Zamiana na krzywe jest nieodwracalna, nie da się zamienić ścieżek z powrotem na edytowalny tekst. +- Jeśli tekst ma pozostać przeszukiwalny, rozważ zamiast tego narzędzie Rasteryzuj PDF, a następnie OCR. +- PDF-y z krzywymi bywają większe. Jeśli rozmiar pliku ma znaczenie, uruchom potem Kompresuj PDF. + +## Powiązane narzędzia + +- [Spłaszcz PDF](./flatten-pdf): spłaszcz formularze i adnotacje bez ruszania czcionek +- [Rasteryzuj PDF](./rasterize-pdf): zamień na PDF oparty na obrazach zamiast konturów wektorowych +- [Kompresuj PDF](./compress-pdf): zmniejsz rozmiar pliku po zamianie na krzywe +- [PDF na PDF/A](./pdf-to-pdfa): konwertuj do archiwizacji po zapewnieniu niezależności od czcionek diff --git a/docs/pl/tools/form-creator.md b/docs/pl/tools/form-creator.md new file mode 100644 index 00000000..14f07650 --- /dev/null +++ b/docs/pl/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Utwórz formularz PDF +description: Twórz wypełnialne formularze PDF z polami tekstowymi, polami wyboru, listami rozwijanymi, przyciskami opcji i innymi elementami, przeciągając je i upuszczając. +--- + +# Utwórz formularz PDF + +Projektuj profesjonalne, wypełnialne formularze PDF od zera lub dodając pola do istniejącego PDF-a. Edytor wizualny pozwala przeciągać i upuszczać elementy formularza (pola tekstowe, pola wyboru, listy rozwijane, przyciski opcji, pola podpisu i inne) bezpośrednio na podglądy stron. Skonfiguruj właściwości pól, ustaw reguły warunkowej widoczności i wyeksportuj w pełni interaktywny formularz PDF. + +## Jak to działa + +1. Prześlij istniejący PDF **lub** kliknij **Utwórz pusty PDF**, aby zacząć od zera. +2. Jeśli tworzysz pusty PDF, wybierz rozmiar strony (Letter, A4, A5, Legal, Tabloid, A3 lub własne wymiary). +3. Otworzy się edytor formularzy z paskiem narzędzi z typami pól i obszarem podglądu strony. +4. Wybierz typ pola na pasku narzędzi, a następnie kliknij stronę, aby je umieścić. +5. Przeciągaj pola, aby zmienić ich położenie. Uchwytami zmiany rozmiaru dostosuj wymiary. +6. Kliknij pole, aby otworzyć panel właściwości, w którym ustawisz nazwę pola, wartość domyślną, rozmiar czcionki, wyrównanie i więcej. +7. Przechodź między stronami za pomocą kontrolek stron. +8. Kliknij **Zapisz**, aby pobrać gotowy, wypełnialny PDF. + +## Funkcje + +- Umieszczanie pól metodą przeciągnij i upuść, z uchwytami do zmiany rozmiaru +- Typy pól: pole tekstowe, wielowierszowe pole tekstowe, pole wyboru, lista rozwijana, przycisk opcji, podpis, data, liczba i kod kreskowy +- Panel właściwości do konfigurowania nazwy, etykiety, wartości domyślnej, rozmiaru czcionki, koloru, wyrównania i walidacji każdego pola +- Akcje pól i reguły warunkowej widoczności (pokazywanie lub ukrywanie pól na podstawie wartości innych pól) +- Nawigacja po stronach w formularzach wielostronicowych +- Wyodrębnianie istniejących pól: automatycznie wykrywa i importuje pola formularza z przesłanych PDF-ów +- Obsługa zarówno przesłanych PDF-ów, jak i pustych stron jako podkładu formularza +- Wiele gotowych rozmiarów stron oraz własne wymiary +- Generowanie kodów kreskowych oparte na bwip-js +- Zarządzanie grupami przycisków opcji + +## Opcje + +**Gotowe rozmiary stron (dla pustych PDF-ów):** + +- Letter (8,5" x 11") +- A4 (210 mm x 297 mm) +- A5 (148 mm x 210 mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297 mm x 420 mm) +- Własny (podaj szerokość i wysokość) + +**Właściwości pól (zależą od typu pola):** + +- Nazwa, etykieta i tekst zastępczy +- Wartość domyślna +- Rodzina, rozmiar i kolor czcionki +- Wyrównanie tekstu (do lewej, do środka, do prawej) +- Przełącznik pola wymaganego +- Przełącznik tylko do odczytu +- Maksymalna długość pól tekstowych +- Lista opcji dla list rozwijanych i przycisków opcji +- Akcje warunkowej widoczności + +## Zastosowania + +- Budowanie formularzy wdrożeniowych dla pracowników z polami tekstowymi na dane osobowe i polami wyboru do potwierdzenia zapoznania się z zasadami +- Tworzenie kwestionariuszy przyjęcia klienta z listami rozwijanymi do wyboru usługi +- Projektowanie formularzy zamówień z polami obliczanymi i identyfikatorami w postaci kodów kreskowych +- Budowanie list kontrolnych inspekcji z przyciskami opcji do ocen zaliczone/niezaliczone +- Tworzenie ankiet z warunkowymi pytaniami uzupełniającymi, które pojawiają się zależnie od odpowiedzi + +## Wskazówki + +- Jeśli prześlesz istniejący PDF, narzędzie spróbuje wyodrębnić obecne w nim pola formularza, abyś mógł je edytować lub dodawać kolejne. +- Użyj grupy przycisków opcji, aby tworzyć wzajemnie wykluczające się wybory. Pola w tej samej grupie opcji mają wspólną nazwę grupy. +- Przetestuj formularz, pobierając go i otwierając w narzędziu [Wypełnianie formularzy PDF](./form-filler), aby sprawdzić zachowanie pól. + +## Powiązane narzędzia + +- [Wypełnianie formularzy PDF](./form-filler) +- [Podpisz PDF](./sign-pdf) +- [Edytor PDF](./edit-pdf) diff --git a/docs/pl/tools/form-filler.md b/docs/pl/tools/form-filler.md new file mode 100644 index 00000000..5f981a3e --- /dev/null +++ b/docs/pl/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Wypełnianie formularzy PDF +description: Wypełniaj formularze PDF, także formularze XFA, bezpośrednio w przeglądarce za pomocą wbudowanej przeglądarki. +--- + +# Wypełnianie formularzy PDF + +Otwórz PDF z polami formularza i wypełnij go bezpośrednio we wbudowanej przeglądarce. Narzędzie obsługuje zarówno standardowe pola AcroForm, jak i starsze formularze XFA (XML Forms Architecture). Po wypełnieniu formularza pobierz gotową wersję jednym kliknięciem. + +## Jak to działa + +1. Prześlij PDF zawierający pola formularza. +2. Dokument otworzy się w zintegrowanej przeglądarce PDF, która renderuje pola formularza jako interaktywne elementy. +3. Klikaj pola tekstowe, pola wyboru, listy rozwijane i przyciski opcji, aby je wypełnić. +4. Kliknij **Zapisz i pobierz wypełniony formularz**, aby otrzymać gotowy PDF. + +## Funkcje + +- Wbudowana przeglądarka PDF.js z pełną obsługą interakcji z polami formularza +- Obsługa standardowych pól AcroForm (pola tekstowe, pola wyboru, listy rozwijane, przyciski opcji) +- Obsługa formularzy XFA, czyli starszych formularzy opartych na XML +- Automatyczne dopasowanie rozmiaru przeglądarki do wymiarów strony +- Wyświetlanie nazwy i rozmiaru pliku + +## Opcje + +Nie ma dodatkowych opcji konfiguracji. Prześlij formularz, wypełnij go i pobierz. + +## Zastosowania + +- Wypełnianie formularzy podatkowych, wniosków ubezpieczeniowych i dokumentów urzędowych +- Wypełnianie formularzy aplikacyjnych otrzymanych jako załączniki PDF +- Wypełnianie formularzy wdrożeniowych dostawców i kwestionariuszy dla dostawców +- Potwierdzanie list kontrolnych zgodności za pomocą pól wyboru +- Wypełnianie formularzy medycznych przed wizytą + +## Wskazówki + +- XFA to starszy format obsługiwany tylko przez niektóre przeglądarki PDF. Jeśli otworzysz PDF z XFA w Chrome lub w większości innych narzędzi i zobaczysz puste strony, oznacza to, że te przeglądarki nie obsługują XFA. Wypełnianie formularzy w BentoPDF i Firefox obsługują XFA poprawnie. +- W przypadku PDF-ów bez istniejących pól formularza najpierw dodaj pola narzędziem [Utwórz formularz PDF](./form-creator), a potem wypełnij je tutaj. +- Przeglądarka automatycznie dopasowuje swój rozmiar do wymiarów strony PDF. + +## Powiązane narzędzia + +- [Utwórz formularz PDF](./form-creator) +- [Podpisz PDF](./sign-pdf) +- [Edytor PDF](./edit-pdf) diff --git a/docs/pl/tools/header-footer.md b/docs/pl/tools/header-footer.md new file mode 100644 index 00000000..f944de0f --- /dev/null +++ b/docs/pl/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Nagłówek i stopka +description: Dodawaj własny tekst nagłówka i stopki na stronach PDF z dynamicznymi zmiennymi numeru strony. +--- + +# Nagłówek i stopka + +Dodaj tekst w sześciu miejscach na stronach PDF: nagłówek po lewej, nagłówek na środku, nagłówek po prawej, stopka po lewej, stopka na środku i stopka po prawej. Narzędzie obsługuje dynamiczne zmienne numeru strony i łącznej liczby stron, więc możesz tworzyć szablony typu "Strona 3 z 10", które aktualizują się automatycznie na każdej stronie. + +## Jak to działa + +1. Prześlij plik PDF. +2. Pojawi się panel opcji z kontrolkami formatowania i sześcioma polami tekstowymi. +3. Wpisz żądany tekst w dowolnym miejscu nagłówka lub stopki. +4. Użyj symboli zastępczych `{page}` i `{total}` do dynamicznej numeracji stron. +5. Dostosuj rozmiar i kolor czcionki oraz opcjonalnie ogranicz zakres do określonych stron. +6. Kliknij **Dodaj nagłówek i stopkę**, aby przetworzyć i pobrać plik. + +## Opcje + +- **Zakres stron**: opcjonalnie ogranicz, które strony dostają nagłówki i stopki. Zostaw puste, aby zastosować do wszystkich stron. Format: "1-3, 5" (zakresy oddzielone przecinkami). +- **Rozmiar czcionki**: od 6 do 24 punktów. Domyślnie 10. +- **Kolor czcionki**: wybierz dowolny kolor selektorem kolorów. +- **Nagłówek po lewej / na środku / po prawej**: pola tekstowe dla górnej części każdej strony. +- **Stopka po lewej / na środku / po prawej**: pola tekstowe dla dolnej części każdej strony. + +## Funkcje + +- Sześć niezależnych miejsc na tekst na każdej stronie +- Dynamiczna zmienna `{page}` wstawiająca numer bieżącej strony +- Dynamiczna zmienna `{total}` wstawiająca łączną liczbę stron +- Filtrowanie zakresu stron, aby objąć tylko wybrane strony +- Własny rozmiar i kolor czcionki +- Czcionka Helvetica dla czystego, profesjonalnego wyglądu + +## Zastosowania + +- Dodanie "Strona {page} z {total}" na środku stopki raportu +- Umieszczenie nazwy firmy w nagłówku po lewej i daty dokumentu w nagłówku po prawej +- Dodawanie klauzul poufności w stopce dokumentów prawnych +- Oznaczanie numerów rewizji dokumentu na wybranych zakresach stron + +## Wskazówki + +- Połącz `{page}` i `{total}` w jednym polu, aby uzyskać formaty takie jak "Strona {page} z {total}" lub "{page}/{total}". +- Większość pól możesz zostawić pustych i wypełnić tylko potrzebne miejsca. Puste pola są po prostu pomijane. +- W przypadku bardziej złożonych nagłówków z obrazami lub logo rozważ użycie narzędzia [Dodaj znak wodny](./add-watermark) ustawionego u góry strony. + +## Powiązane narzędzia + +- [Numery stron](./page-numbers) +- [Dodaj znak wodny](./add-watermark) +- [Numeracja Batesa](./bates-numbering) diff --git a/docs/pl/tools/heic-to-pdf.md b/docs/pl/tools/heic-to-pdf.md new file mode 100644 index 00000000..97f57ab1 --- /dev/null +++ b/docs/pl/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC na PDF +description: Konwertuj obrazy HEIC i HEIF z iPhone'ów i iPadów na PDF bezpośrednio w przeglądarce. +--- + +# HEIC na PDF + +Konwertuj obrazy HEIC/HEIF na PDF. HEIC to domyślny format zdjęć na iPhone'ach i iPadach od iOS 11. To narzędzie pozwala zamienić te zdjęcia w PDF-y bez instalowania programów na komputerze i bez wysyłania plików na serwer. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :----------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki HEIC/HEIF. +2. Sprawdź listę plików i usuń niepotrzebne. +3. Kliknij **Konwertuj na PDF**. Wynik zostanie pobrany jako `from_heic.pdf`. + +Każdy plik HEIC jest dekodowany biblioteką heic2any, która konwertuje go do PNG w jakości 92%. Następnie PNG jest osadzany w PDF za pomocą pdf-lib, a każdy obraz trafia na osobną stronę w pełnej rozdzielczości. + +## Opcje + +To narzędzie nie udostępnia dodatkowych ustawień. Obrazy HEIC są przed osadzeniem konwertowane do PNG w wysokiej jakości (0,92). + +## Zastosowania + +- Tworzenie PDF-a ze zdjęć z iPhone'a do załączenia do zgłoszenia ubezpieczeniowego lub raportu +- Zamiana zdjęć HEIC z oferty nieruchomości w jeden dokument do wydruku +- Zamiana zrzutów ekranu z iPada (format HEIF) w PDF do udostępnienia +- Zbiorcza konwersja zdjęć z wakacji do dziennika podróży + +## Wskazówki + +- Dekodowanie HEIC odbywa się w całości w przeglądarce przy użyciu WebAssembly. Pierwsza konwersja może chwilę potrwać, gdy ładuje się dekoder. +- Jeśli chcesz połączyć HEIC z innymi formatami obrazów (JPG, PNG itd.), użyj narzędzia [Obrazy do PDF](./image-to-pdf), które obsługuje HEIC razem ze wszystkimi innymi formatami. +- Pliki HEIC z iPhone'ów często zawierają dane EXIF, w tym współrzędne GPS. Wynikowy PDF nie przenosi tych metadanych. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [JPG na PDF](./jpg-to-pdf) +- [PNG na PDF](./png-to-pdf) diff --git a/docs/pl/tools/image-to-pdf.md b/docs/pl/tools/image-to-pdf.md new file mode 100644 index 00000000..b8d5d56b --- /dev/null +++ b/docs/pl/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Obrazy do PDF +description: Konwertuj JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD i ponad 10 innych formatów obrazów w jeden plik PDF. +--- + +# Obrazy do PDF + +Uniwersalny konwerter obrazów na PDF. Prześlij obrazy w praktycznie dowolnym formacie i połącz je w jeden dokument PDF. Każdy obraz trafia na osobną stronę, o rozmiarze odpowiadającym oryginalnym wymiarom. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +To najszersza obsługa formatów spośród wszystkich konwerterów obrazów w BentoPDF. Jeśli potrzebujesz tylko jednego konkretnego formatu, użyj zamiast tego dedykowanego narzędzia. + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki obrazów. Możesz wybrać wiele plików naraz. +2. Sprawdź listę plików. Usuń niepotrzebne ikoną kosza lub kliknij **Dodaj więcej plików**, aby dołączyć kolejne obrazy. +3. Wybierz poziom **Jakości PDF** z listy rozwijanej. +4. Kliknij **Konwertuj na PDF**. Narzędzie przetwarza obrazy silnikiem PyMuPDF i pobiera wynik jako `images_to_pdf.pdf`. + +## Opcje + +**Jakość PDF** określa kompresję obrazów stosowaną podczas osadzania ich w PDF: + +- **Wysoka jakość**: minimalna kompresja, większy plik. Najlepsza do druku lub archiwizacji. +- **Średnia jakość** (domyślnie): zrównoważona kompresja. Dobra do większości zastosowań. +- **Niska jakość**: agresywna kompresja, najmniejszy plik. Nadaje się do e-maila lub szybkiego udostępniania. + +Pliki HEIC i WebP są przed osadzeniem automatycznie konwertowane do PNG. Dzieje się to w tle i nie wymaga żadnych dodatkowych kroków. + +## Zastosowania + +- Łączenie zeskanowanych paragonów lub dokumentów z aparatu telefonu w jeden PDF +- Tworzenie portfolio zdjęć lub lookbooka z obrazów w różnych formatach +- Konwersja zdjęć z iPhone'a (HEIC) na PDF do udostępnienia bez instalowania programów na komputerze +- Składanie makiet projektów z eksportów PSD i zrzutów ekranu w materiał dla klienta +- Archiwizowanie folderu starszych formatów obrazów (PNM, JXR, JP2) jako jednego PDF-a + +## Wskazówki + +- Kolejność obrazów w PDF odpowiada ich kolejności na liście plików. Prześlij je w żądanej sekwencji. +- Aby uzyskać jak najmniejszy plik, wybierz niską jakość. Różnica wizualna jest często pomijalna w skanach z dużą ilością tekstu. +- Jeśli masz tylko jeden format obrazów, dedykowane konwertery (JPG na PDF, PNG na PDF itd.) dają ten sam wynik w prostszym interfejsie. + +## Powiązane narzędzia + +- [JPG na PDF](./jpg-to-pdf) +- [PNG na PDF](./png-to-pdf) +- [HEIC na PDF](./heic-to-pdf) +- [WebP na PDF](./webp-to-pdf) diff --git a/docs/pl/tools/index.md b/docs/pl/tools/index.md new file mode 100644 index 00000000..55a606f4 --- /dev/null +++ b/docs/pl/tools/index.md @@ -0,0 +1,183 @@ +# Przegląd narzędzi + +BentoPDF oferuje **ponad 130 narzędzi** do pracy z PDF-ami. Wszystkie narzędzia działają w całości w przeglądarce: Twoje pliki nigdy nie opuszczają urządzenia. + +--- + +## Edycja i adnotacje + +Modyfikuj, oznaczaj i ulepszaj dokumenty PDF za pomocą pełnego zestawu narzędzi do edycji. + +
+ +- [**Edytor PDF**](./edit-pdf): dodawaj adnotacje, podświetlenia, zaczernienia, komentarze, kształty i obrazy, przeszukuj i przeglądaj PDF-y. +- [**Edytuj zakładki**](./bookmark): dodawaj, edytuj, importuj, usuwaj i wyodrębniaj zakładki PDF. +- [**Spis treści**](./table-of-contents): wygeneruj stronę spisu treści z zakładek PDF. +- [**Numery stron**](./page-numbers): wstaw numery stron do dokumentu. +- [**Dodaj etykiety stron**](./add-page-labels): zastosuj etykiety stron PDF z cyframi rzymskimi, prefiksami i własnym początkiem numeracji. +- [**Numeracja Batesa**](./bates-numbering): dodaj kolejne numery Batesa w jednym lub wielu plikach PDF. +- [**Dodaj znak wodny**](./add-watermark): nałóż tekst lub obraz na strony PDF. +- [**Nagłówek i Stopka**](./header-footer): dodaj tekst u góry i u dołu stron. +- [**Odwróć kolory**](./invert-colors): stwórz wersję PDF-a w trybie ciemnym. +- [**Efekt skanera**](./scanner-effect): spraw, by PDF wyglądał jak zeskanowany dokument. +- [**Dostosuj kolory**](./adjust-colors): dopracuj jasność, kontrast, nasycenie i więcej. +- [**Kolor tła**](./background-color): zmień kolor tła PDF-a. +- [**Zmień kolor tekstu**](./text-color): zmień kolor tekstu w PDF-ie. +- [**Podpisz PDF**](./sign-pdf): narysuj, wpisz lub prześlij swój podpis. +- [**Dodaj pieczątki**](./add-stamps): dodaj pieczątki graficzne do PDF-a za pomocą paska narzędzi adnotacji. +- [**Usuń adnotacje**](./remove-annotations): usuń komentarze, podświetlenia i linki. +- [**Przytnij PDF**](./crop-pdf): przytnij marginesy każdej strony PDF-a. +- [**Wypełnianie formularzy PDF**](./form-filler): wypełniaj formularze bezpośrednio w przeglądarce. Obsługuje też formularze XFA. +- [**Utwórz formularz PDF**](./form-creator): twórz wypełnialne formularze PDF z polami tekstowymi przeciąganymi i upuszczanymi na stronę. +- [**Usuń puste strony**](./remove-blank-pages): automatycznie wykrywaj i usuwaj puste strony. + +
+ +--- + +## Konwersja na PDF + +Zamieniaj obrazy, dokumenty, e-booki i inne formaty plików na PDF. + +
+ +- [**Obrazy do PDF**](./image-to-pdf): konwertuj JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP i inne na PDF. +- [**JPG na PDF**](./jpg-to-pdf): utwórz PDF z jednego lub więcej obrazów JPG. +- [**PNG na PDF**](./png-to-pdf): utwórz PDF z jednego lub więcej obrazów PNG. +- [**WebP na PDF**](./webp-to-pdf): utwórz PDF z jednego lub więcej obrazów WebP. +- [**SVG na PDF**](./svg-to-pdf): utwórz PDF z jednego lub więcej obrazów SVG. +- [**BMP na PDF**](./bmp-to-pdf): utwórz PDF z jednego lub więcej obrazów BMP. +- [**HEIC na PDF**](./heic-to-pdf): utwórz PDF z jednego lub więcej obrazów HEIC. +- [**TIFF na PDF**](./tiff-to-pdf): utwórz PDF z jednego lub więcej obrazów TIFF. +- [**Tekst na PDF**](./txt-to-pdf): zamień zwykły plik tekstowy na PDF. +- [**Markdown na PDF**](./markdown-to-pdf): konwertuj Markdown na PDF z podglądem na żywo i podświetlaniem składni. +- [**JSON na PDF**](./json-to-pdf): konwertuj pliki JSON na format PDF. +- [**ODT na PDF**](./odt-to-pdf): konwertuj pliki ODT (OpenDocument Text) na PDF. +- [**CSV na PDF**](./csv-to-pdf): konwertuj arkusze CSV na PDF. +- [**RTF na PDF**](./rtf-to-pdf): konwertuj dokumenty RTF (Rich Text Format) na PDF. +- [**Word na PDF**](./word-to-pdf): konwertuj dokumenty Word (DOCX, DOC, ODT) na PDF. +- [**Excel na PDF**](./excel-to-pdf): konwertuj arkusze Excel (XLSX, XLS, ODS) na PDF. +- [**PowerPoint na PDF**](./powerpoint-to-pdf): konwertuj prezentacje PowerPoint (PPTX, PPT, ODP) na PDF. +- [**XPS na PDF**](./xps-to-pdf): konwertuj dokumenty XPS/OXPS na PDF. +- [**MOBI na PDF**](./mobi-to-pdf): konwertuj e-booki MOBI na PDF. +- [**EPUB na PDF**](./epub-to-pdf): konwertuj e-booki EPUB na PDF. +- [**FB2 na PDF**](./fb2-to-pdf): konwertuj e-booki FictionBook (FB2) na PDF. +- [**CBZ na PDF**](./cbz-to-pdf): konwertuj archiwa komiksów (CBZ/CBR) na PDF. +- [**WPD na PDF**](./wpd-to-pdf): konwertuj dokumenty WordPerfect (WPD) na PDF. +- [**WPS na PDF**](./wps-to-pdf): konwertuj dokumenty WPS Office na PDF. +- [**XML na PDF**](./xml-to-pdf): konwertuj dokumenty XML na PDF. +- [**ODG na PDF**](./odg-to-pdf): konwertuj OpenDocument Graphics (ODG) na PDF. +- [**ODS na PDF**](./ods-to-pdf): konwertuj OpenDocument Spreadsheet (ODS) na PDF. +- [**ODP na PDF**](./odp-to-pdf): konwertuj OpenDocument Presentation (ODP) na PDF. +- [**PUB na PDF**](./pub-to-pdf): konwertuj Microsoft Publisher (PUB) na PDF. +- [**VSD na PDF**](./vsd-to-pdf): konwertuj Microsoft Visio (VSD, VSDX) na PDF. +- [**PSD na PDF**](./psd-to-pdf): konwertuj pliki Adobe Photoshop (PSD) na PDF. +- [**E-mail na PDF**](./email-to-pdf): konwertuj pliki e-mail (EML, MSG) na format PDF. + +
+ +--- + +## Konwersja z PDF + +Wyodrębniaj zawartość PDF-ów do obrazów, dokumentów i formatów danych. + +
+ +- [**PDF na JPG**](./pdf-to-jpg): zamień każdą stronę PDF na obraz JPG. +- [**PDF na PNG**](./pdf-to-png): zamień każdą stronę PDF na obraz PNG. +- [**PDF na WebP**](./pdf-to-webp): zamień każdą stronę PDF na obraz WebP. +- [**PDF na BMP**](./pdf-to-bmp): zamień każdą stronę PDF na obraz BMP. +- [**PDF na TIFF**](./pdf-to-tiff): zamień każdą stronę PDF na obraz TIFF. +- [**PDF na CBZ**](./pdf-to-cbz): zamień PDF na CBZ (archiwum komiksów) dla czytników komiksów i Calibre. +- [**PDF na SVG**](./pdf-to-svg): zamień każdą stronę PDF na skalowalną grafikę wektorową. +- [**PDF na CSV**](./pdf-to-csv): wyodrębnij tabele z PDF i zamień na format CSV. +- [**PDF na Excel**](./pdf-to-excel): wyodrębnij tabele z PDF i zamień na Excel (XLSX). +- [**PDF na odcienie szarości**](./pdf-to-greyscale): zamień wszystkie kolory na czerń i biel. +- [**PDF na JSON**](./pdf-to-json): konwertuj pliki PDF na format JSON. +- [**PDF na Word**](./pdf-to-word): konwertuj pliki PDF na edytowalne dokumenty Word. +- [**Wyodrębnij obrazy**](./extract-images): wyodrębnij wszystkie osadzone obrazy z plików PDF. +- [**PDF na Markdown**](./pdf-to-markdown): konwertuj tekst i tabele PDF na format Markdown. +- [**Przygotuj PDF dla AI**](./prepare-pdf-for-ai): wyodrębnij zawartość PDF jako JSON LlamaIndex dla potoków RAG/LLM. +- [**PDF na Tekst**](./pdf-to-text): wyodrębnij tekst z plików PDF i zapisz jako zwykły tekst. +- [**Wyodrębnij tabele PDF**](./extract-tables): wyodrębnij tabele z PDF-ów jako CSV, JSON lub Markdown. + +
+ +--- + +## Organizacja i zarządzanie + +Zmieniaj kolejność, łącz, dziel i zarządzaj stronami i plikami PDF. + +
+ +- [**Kreator przepływów PDF**](./pdf-workflow): twórz własne potoki przetwarzania PDF w wizualnym edytorze węzłów. +- [**Wielofunkcyjne narzędzie PDF**](./pdf-multi-tool): w pełni funkcjonalny edytor PDF z zarządzaniem stronami. +- [**OCR PDF**](./ocr-pdf): spraw, by PDF był przeszukiwalny i kopiowalny. +- [**Połącz PDF**](./merge-pdf): połącz wiele PDF-ów w jeden plik. +- [**Naprzemienne i mieszane strony**](./alternate-merge): łącz PDF-y, przeplatając strony z każdego z nich. +- [**Sortowanie skanu dwustronnego**](./duplex-collate): ułóż bloki skanów przodu i tyłu w poprawnej kolejności stron. +- [**Duplikuj i organizuj**](./organize-pdf): duplikuj, zmieniaj kolejność i usuwaj strony. +- [**Dodaj załączniki**](./add-attachments): osadź jeden lub więcej plików w PDF-ie. +- [**Wyodrębnij załączniki**](./extract-attachments): wyodrębnij wszystkie osadzone pliki z PDF-ów jako ZIP. +- [**Edytuj załączniki**](./edit-attachments): wyświetl lub usuń załączniki w PDF-ie. +- [**Warstwy PDF (OCG)**](./pdf-layers): wyświetlaj, przełączaj, dodawaj i usuwaj warstwy OCG w PDF-ie. +- [**Podziel PDF**](./split-pdf): wyodrębnij zakres stron do nowego PDF-a. +- [**Podziel strony**](./divide-pages): dziel strony poziomo lub pionowo. +- [**Wyodrębnij strony**](./extract-pages): zapisz wybrane strony jako nowe pliki. +- [**Usuń strony**](./delete-pages): usuń wybrane strony z dokumentu. +- [**Dodaj pustą stronę**](./add-blank-page): wstaw pustą stronę w dowolnym miejscu PDF-a. +- [**Odwróć strony**](./reverse-pages): odwróć kolejność wszystkich stron dokumentu. +- [**Obróć PDF**](./rotate-pdf): obracaj strony co 90 stopni. +- [**Obróć o niestandardowy kąt**](./rotate-custom): obracaj strony o dowolny kąt. +- [**PDF N-Up**](./n-up-pdf): ułóż wiele stron na jednym arkuszu. +- [**Broszura PDF**](./pdf-booklet): przestaw strony do dwustronnego druku broszury. +- [**Połącz w jedną stronę**](./combine-single-page): zszyj wszystkie strony w jedną ciągłą przewijaną stronę. +- [**Wyświetl metadane**](./view-metadata): sprawdź ukryte właściwości PDF-a. +- [**Edytuj metadane**](./edit-metadata): zmień autora, tytuł i inne właściwości. +- [**PDF na ZIP**](./pdf-to-zip): spakuj wiele plików PDF do archiwum ZIP. +- [**Porównaj PDF**](./compare-pdfs): porównaj dwa PDF-y obok siebie. +- [**Plakatowanie PDF**](./posterize-pdf): podziel dużą stronę na wiele mniejszych stron. + +
+ +--- + +## Optymalizacja i naprawa + +Kompresuj, naprawiaj i optymalizuj PDF-y pod kątem wydajności i zgodności. + +
+ +- [**Kompresuj PDF**](./compress-pdf): zmniejsz rozmiar pliku PDF. +- [**PDF na PDF/A**](./pdf-to-pdfa): konwertuj PDF na PDF/A do długoterminowej archiwizacji. +- [**Napraw rozmiar strony**](./fix-page-size): ujednolić wszystkie strony do jednego rozmiaru. +- [**Linearyzuj PDF**](./linearize-pdf): zoptymalizuj PDF pod kątem szybkiego wyświetlania w sieci. +- [**Wymiary strony**](./page-dimensions): analizuj rozmiar strony, orientację i jednostki. +- [**Usuń restrykcje**](./remove-restrictions): usuń ochronę hasłem i ograniczenia zabezpieczeń. +- [**Napraw PDF**](./repair-pdf): odzyskaj dane z uszkodzonych plików PDF. +- [**Rasteryzuj PDF**](./rasterize-pdf): zamień PDF na PDF oparty na obrazach. Spłaszcza warstwy i usuwa zaznaczalny tekst. +- [**Wyprostuj PDF**](./deskew-pdf): automatycznie prostuj przekrzywione zeskanowane strony za pomocą OpenCV. +- [**Czcionka na krzywe**](./font-to-outline): zamień wszystkie czcionki na kontury wektorowe dla spójnego renderowania. + +
+ +--- + +## Zabezpieczanie PDF + +Chroń, szyfruj i kontroluj dostęp do dokumentów PDF. + +
+ +- [**Szyfruj PDF**](./protect-pdf): zablokuj PDF, dodając hasło. +- [**Sanityzuj PDF**](./sanitize-pdf): usuń metadane, adnotacje, skrypty i więcej. +- [**Odszyfruj PDF**](./unlock-pdf): odblokuj PDF, usuwając ochronę hasłem. +- [**Spłaszcz PDF**](./flatten-pdf): spraw, by pola formularzy i adnotacje nie były edytowalne. +- [**Usuń metadane**](./remove-metadata): usuń ukryte dane z PDF-a. +- [**Zmień uprawnienia**](./change-permissions): ustaw lub zmień uprawnienia użytkownika w PDF-ie. +- [**Podpis cyfrowy PDF**](./digital-sign-pdf): dodaj kryptograficzny podpis cyfrowy z użyciem certyfikatów X.509. +- [**Zweryfikuj podpis PDF**](./validate-signature-pdf): weryfikuj podpisy cyfrowe i wyświetlaj szczegóły certyfikatu. + +
diff --git a/docs/pl/tools/invert-colors.md b/docs/pl/tools/invert-colors.md new file mode 100644 index 00000000..d6011b66 --- /dev/null +++ b/docs/pl/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Odwróć kolory +description: Odwróć wszystkie kolory w PDF, aby stworzyć ciemną wersję dowolnego dokumentu. +--- + +# Odwróć kolory + +Zamień każdy kolor w PDF na jego odwrotność. Białe tła stają się czarne, czarny tekst staje się biały, a wszystkie pozostałe kolory przechodzą na wartości dopełniające. To najszybszy sposób na stworzenie wersji "w trybie ciemnym" dowolnego PDF-a. + +## Jak to działa + +1. Prześlij plik PDF. +2. Kliknij **Odwróć kolory**, aby przetworzyć. +3. Odwrócony PDF zostanie pobrany automatycznie. + +Nie ma dodatkowych ustawień. Narzędzie renderuje każdą stronę jako obraz, odwraca kolory wszystkich pikseli i składa wynik w nowy PDF. + +## Funkcje + +- Odwracanie kolorów wszystkich stron jednym kliknięciem +- Przetwarzanie każdej strony dokumentu +- Zachowanie oryginalnych wymiarów i układu stron +- Działa z dowolnym PDF-em, niezależnie od typu zawartości (tekst, obrazy, mieszana) + +## Zastosowania + +- Tworzenie wersji w trybie ciemnym podręczników lub instrukcji do wygodnego czytania wieczorem +- Przygotowywanie wysokokontrastowych wersji dokumentów na potrzeby dostępności +- Odwracanie zeskanowanych dokumentów, które zostały zeskanowane z błędną ekspozycją +- Generowanie negatywów PDF-ów z dużą ilością obrazów do analizy wizualnej + +## Wskazówki + +- Ponieważ narzędzie rasteryzuje strony, aby zastosować efekt, wynik jest oparty na obrazach. Tekst nie będzie już zaznaczalny ani przeszukiwalny. Jeśli po odwróceniu potrzebujesz przeszukiwalnego tekstu, przepuść wynik przez narzędzie OCR. +- Do bardziej szczegółowych korekt kolorów (jasność, kontrast, nasycenie) użyj zamiast tego narzędzia [Dostosuj kolory](./adjust-colors). +- Duże PDF-y z wieloma stronami mogą być przetwarzane dłużej, ponieważ każda strona jest osobno renderowana i odwracana. + +## Powiązane narzędzia + +- [Dostosuj kolory](./adjust-colors) +- [Kolor tła](./background-color) +- [Efekt skanera](./scanner-effect) diff --git a/docs/pl/tools/jpg-to-pdf.md b/docs/pl/tools/jpg-to-pdf.md new file mode 100644 index 00000000..d45a715c --- /dev/null +++ b/docs/pl/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG na PDF +description: Konwertuj jeden lub więcej obrazów JPG, JPEG i JPEG 2000 w jeden plik PDF bezpośrednio w przeglądarce. +--- + +# JPG na PDF + +Zamień obrazy JPG w czysty PDF. Prześlij jeden plik lub wiele JPG-ów naraz: każdy obraz staje się pełnowymiarową stroną dokumentu wynikowego. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki JPG. Możesz wybrać wiele plików. +2. Sprawdź przesłane pliki. Ikoną kosza usuniesz pojedyncze pliki, a przyciskiem **Dodaj więcej plików** dopiszesz kolejne do listy. +3. Wybierz poziom **Jakości PDF**. +4. Kliknij **Konwertuj na PDF**. Narzędzie kompresuje obrazy zgodnie z wybraną jakością, konwertuje je silnikiem PyMuPDF i pobiera plik `from_jpgs.pdf`. + +## Opcje + +**Jakość PDF** reguluje kompresję stosowaną do każdego obrazu przed osadzeniem w PDF: + +- **Wysoka jakość**: zachowuje maksimum szczegółów. Użyj do fotografii lub druku. +- **Średnia jakość** (domyślnie): dobra równowaga między wyrazistością a rozmiarem pliku. +- **Niska jakość**: agresywna kompresja dla najmniejszego pliku wynikowego. + +## Zastosowania + +- Konwersja zeskanowanych dokumentów zapisanych jako JPG w jeden PDF do złożenia +- Pakowanie zdjęć produktów w katalog dla klientów +- Zamiana obrazów medycznych lub satelitarnych JPEG 2000 w przenośny PDF +- Tworzenie albumu zdjęć do druku z eksportów z aparatu + +## Wskazówki + +- Pliki JPEG 2000 (`.jp2`, `.jpx`) są w pełni obsługiwane, nie tylko standardowy JPEG. Przydaje się to w obrazowaniu medycznym i danych geoprzestrzennych. +- Jeśli Twoje JPG-i pochodzą z aparatu telefonu, jakość średnia zwykle daje plik o 40-60% mniejszy niż wysoka, bez widocznej różnicy na ekranie. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [PNG na PDF](./png-to-pdf) +- [WebP na PDF](./webp-to-pdf) diff --git a/docs/pl/tools/json-to-pdf.md b/docs/pl/tools/json-to-pdf.md new file mode 100644 index 00000000..faa008c4 --- /dev/null +++ b/docs/pl/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON na PDF +description: Odtwarzaj pliki PDF z formatu JSON używanego przez BentoPDF. Konwertuj eksporty JSON z powrotem na oryginalne dokumenty PDF. +--- + +# JSON na PDF + +Odtwarzaj dokumenty PDF z plików JSON utworzonych wcześniej narzędziem **PDF na JSON** w BentoPDF. To narzędzie do konwersji w obie strony: bierze ustrukturyzowaną reprezentację JSON dokumentu PDF i odbudowuje oryginalny dokument. + +::: warning +To narzędzie przyjmuje tylko pliki JSON utworzone przez konwerter PDF na JSON w BentoPDF. Standardowe pliki JSON z API, baz danych lub innych narzędzi nie są obsługiwane. +::: + +## Obsługiwane formaty + +| Wejście | Opis | +| :------ | :---------------------------------------------------------- | +| `.json` | Pliki JSON wyeksportowane narzędziem PDF na JSON z BentoPDF | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść jeden lub więcej plików JSON. +2. Lista plików pokazuje każdy wybrany plik wraz z jego rozmiarem. +3. Kliknij **Konwertuj na PDF**. Narzędzie przetwarza wszystkie pliki za pomocą Web Workera i silnika CPDF. +4. Wynik zostanie pobrany jako `jsons-to-pdf.zip`, zawierający po jednym PDF-ie na każdy plik JSON. + +Konwersja działa w tle w Web Workerze, więc interfejs pozostaje responsywny nawet przy dużych plikach. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Struktura JSON w pełni określa wynikowy PDF. + +## Wynik + +Przy konwersji wielu plików JSON wyniki są dostarczane jako archiwum ZIP. Każdy PDF ma nazwę pliku źródłowego JSON (np. `report.json` zmienia się w `report.pdf`). + +## Zastosowania + +- Odtwarzanie PDF-ów z kopii zapasowej lub archiwum opartego na JSON +- Przepuszczenie PDF-a przez JSON w celu inspekcji, a potem z powrotem do PDF +- Odbudowa dokumentów po programowych modyfikacjach struktury JSON +- Sprawdzenie, czy eksport PDF na JSON uchwycił całą zawartość dokumentu, przez przekonwertowanie go z powrotem + +## Wskazówki + +- Jeśli chcesz zamienić dowolne dane JSON (np. odpowiedzi API lub pliki konfiguracyjne) na sformatowany PDF, lepiej sprawdzi się narzędzie [Tekst na PDF](./txt-to-pdf). Wklej JSON jako tekst, a zostanie wyrenderowany z odpowiednim formatowaniem. +- Aby to narzędzie działało, silnik CPDF WebAssembly musi być dostępny. Instancje self-hosted wymagają skonfigurowanych plików CPDF WASM. + +## Powiązane narzędzia + +- [Tekst na PDF](./txt-to-pdf) +- [Markdown na PDF](./markdown-to-pdf) +- [CSV na PDF](./csv-to-pdf) diff --git a/docs/pl/tools/linearize-pdf.md b/docs/pl/tools/linearize-pdf.md new file mode 100644 index 00000000..e1e143ed --- /dev/null +++ b/docs/pl/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linearyzuj PDF +description: Optymalizuj pliki PDF pod kątem szybkiego wyświetlania w sieci dzięki stopniowemu ładowaniu. Znane też jako optymalizacja "Szybki podgląd w sieci Web". +--- + +# Linearyzuj PDF + +Linearyzacja zmienia strukturę PDF-a tak, aby pierwszą stronę można było wyświetlić, zanim cały plik zostanie pobrany. Adobe nazywa to "Szybkim podglądem w sieci Web". Jeśli udostępniasz PDF-y na stronie internetowej lub przez portal dokumentów, linearyzacja sprawia, że otwierają się wyraźnie szybciej. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF. +2. Kliknij **Linearyzuj PDF-y**. +3. Pobierz wyniki jako archiwum ZIP zawierające wszystkie zlinearyzowane pliki. + +Nie ma ustawień do skonfigurowania. Narzędzie używa flagi `--linearize` programu QPDF, która porządkuje wewnętrzną strukturę PDF-a bez zmiany jego zawartości wizualnej. + +## Co robi linearyzacja + +- Zmienia kolejność obiektów PDF tak, aby dane pierwszej strony znalazły się na początku pliku +- Dodaje słownik linearyzacji i tablice wskazówek, aby przeglądarki wiedziały, gdzie znaleźć każdą stronę +- Umożliwia żądania zakresów bajtów: przeglądarka może pobrać tylko pierwszą stronę bez pobierania całego pliku +- Porządkuje tablicę odwołań krzyżowych dla wydajnego dostępu swobodnego + +## Funkcje + +- Wsadowe przetwarzanie wielu PDF-ów w jednej operacji +- Wynik zachowuje całą zawartość, czcionki, obrazy i elementy interaktywne +- Używa QPDF (WebAssembly) do niezawodnej linearyzacji zgodnej ze standardami +- Wyniki są pakowane do ZIP dla wygodnego pobrania + +## Zastosowania + +- Udostępnianie raportów PDF na stronie, gdzie użytkownicy oczekują natychmiastowego wyświetlenia strony +- Osadzanie PDF-ów w aplikacjach webowych z przeglądarkami w przeglądarce +- Publikowanie katalogów lub instrukcji PDF dostępnych przez wolne łącza mobilne +- Przygotowanie dokumentów dla sieci dostarczania treści (CDN), które obsługują zakresy bajtów + +## Wskazówki + +- Linearyzuj po zakończeniu wszystkich innych edycji. Każda późniejsza modyfikacja (łączenie, dodawanie stron) zepsuje linearyzację. +- Połącz z narzędziem Kompresuj PDF, aby uzyskać najmniejsze i najszybciej ładujące się PDF-y. +- Linearyzacja dodaje niewielki narzut do rozmiaru pliku (zwykle poniżej 1%). + +## Powiązane narzędzia + +- [Kompresuj PDF](./compress-pdf): zmniejsz rozmiar pliku przed linearyzacją +- [Napraw PDF](./repair-pdf): napraw problemy strukturalne uniemożliwiające linearyzację +- [Usuń metadane](./remove-metadata): usuń metadane przed publikacją w sieci diff --git a/docs/pl/tools/markdown-to-pdf.md b/docs/pl/tools/markdown-to-pdf.md new file mode 100644 index 00000000..a7470265 --- /dev/null +++ b/docs/pl/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown na PDF +description: Pisz lub wklej Markdown i wyeksportuj go jako profesjonalnie sformatowany PDF z podglądem na żywo i podświetlaniem składni. +--- + +# Markdown na PDF + +W pełni funkcjonalny edytor Markdown z podglądem na żywo i eksportem do PDF jednym kliknięciem. Pisz od zera, prześlij istniejący plik `.md` lub wklej treść ze schowka. Edytor renderuje Markdown w czasie rzeczywistym i eksportuje sformatowany PDF za pomocą wbudowanego silnika drukowania przeglądarki. + +## Obsługiwane formaty + +| Wejście | Opis | +| :------------------------ | :---------------------------- | +| Pliki `.md` | Prześlij przyciskiem Prześlij | +| Bezpośrednie wprowadzanie | Wpisz lub wklej w edytorze | + +## Jak to działa + +1. Otwórz narzędzie Markdown na PDF. Edytor ładuje się z widokiem podzielonym: źródło Markdown po lewej, wyrenderowany podgląd po prawej. +2. Napisz Markdown, wklej go lub kliknij **Prześlij**, aby wczytać plik `.md`. +3. Przełączaj motyw jasny i ciemny suwakiem motywu na pasku narzędzi. +4. Kliknij **Eksportuj PDF** (lub naciśnij `Ctrl/Cmd + S`), aby wygenerować PDF przez okno drukowania przeglądarki. + +## Funkcje + +Edytor obsługuje szeroki zestaw funkcji Markdown wykraczający poza podstawy: + +- **Standardowy Markdown**: nagłówki, pogrubienie, kursywa, linki, obrazy, listy, cytaty, linie poziome +- **Bloki kodu** z podświetlaniem składni dla ponad 15 języków (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash i inne) +- **Diagramy Mermaid**: schematy blokowe, diagramy sekwencji, diagramy ER i inne typy wykresów Mermaid renderują się bezpośrednio w podglądzie +- **Tabele** w standardowej składni tabel Markdown +- **Listy zadań** z polami wyboru +- **Przypisy**, **indeks dolny**, **indeks górny** +- **Listy definicji**, **skróty** +- Obsługa **emoji** (`:smile:` renderuje się jako emoji) +- **Wyróżnienia** (`==marked text==`) i **wstawienia** (`++inserted text++`) +- **Automatyczne linki**: zwykłe adresy URL są zamieniane na klikalne linki +- Generowanie **spisu treści** +- **Linki kotwic** w nagłówkach + +## Zastosowania + +- Pisanie dokumentacji projektu i eksport dopracowanego PDF-a dla interesariuszy +- Tworzenie raportów technicznych z przykładami kodu i diagramami architektury Mermaid +- Konwersja README z GitHub do PDF na potrzeby użycia offline lub druku +- Przygotowywanie propozycji lub specyfikacji z listami zadań i tabelami +- Generowanie stylizowanych materiałów dla uczestników z notatek z wykładu napisanych w Markdown + +## Wskazówki + +- PDF powstaje za pomocą funkcji drukowania do PDF w przeglądarce. W Chrome możesz dostosować marginesy i skalę w oknie drukowania przed zapisem. +- Diagramy Mermaid renderują się w podglądzie, ale przy pierwszym użyciu może minąć chwila, zanim się zainicjalizują. +- Użyj skrótu `Ctrl/Cmd + S`, aby wyeksportować bez sięgania po przycisk. + +## Powiązane narzędzia + +- [Tekst na PDF](./txt-to-pdf) +- [Word na PDF](./word-to-pdf) +- [JSON na PDF](./json-to-pdf) diff --git a/docs/pl/tools/merge-pdf.md b/docs/pl/tools/merge-pdf.md new file mode 100644 index 00000000..50b838d1 --- /dev/null +++ b/docs/pl/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Połącz PDF +description: Połącz wiele plików PDF w jeden dokument z zmianą kolejności metodą przeciągnij i upuść oraz kontrolą na poziomie stron. +--- + +# Połącz PDF + +Połącz wiele plików PDF w jeden dokument. Możesz scalać całe pliki w wybranej kolejności albo przełączyć się na Tryb stron, aby mieć szczegółową kontrolę nad pojedynczymi stronami z każdego przesłanego PDF-a. + +## Jak to działa + +1. Prześlij dwa lub więcej plików PDF, klikając strefę upuszczania lub przeciągając je do niej. +2. Wybierz między **Trybem plików** a **Trybem stron** przełącznikiem u góry. +3. W Trybie plików przeciągaj pliki, aby zmienić ich kolejność, i opcjonalnie podaj zakresy stron (np. `1-3, 5`) dla każdego pliku. Zostaw zakres pusty, aby uwzględnić wszystkie strony. +4. W Trybie stron przeciągaj miniatury pojedynczych stron, aby ułożyć dokładną sekwencję stron. +5. Kliknij **Połącz PDF-y**, aby połączyć wszystko w jeden plik. Połączony PDF zostanie pobrany automatycznie. + +## Funkcje + +- Dwa tryby łączenia: Tryb plików do szybkiego łączenia całych plików, Tryb stron do kontroli nad każdą stroną +- Zmiana kolejności metodą przeciągnij i upuść w obu trybach, z płynnymi animacjami +- Składnia zakresów stron (np. `1-3, 5, 8-10`) pozwala wybierać strony bez przełączania na Tryb stron +- Miniatury stron ładowane na żądanie utrzymują responsywność interfejsu nawet przy dużych dokumentach +- Brak limitu liczby plików ani łącznej liczby stron +- Zachowuje oryginalną jakość PDF bez ponownego kodowania + +## Opcje + +| Opcja | Opis | +| --------------- | ---------------------------------------------------------------------------------------------------------- | +| **Tryb plików** | Łącz całe pliki w wybranej kolejności, z opcjonalnymi filtrami zakresu stron dla każdego pliku | +| **Tryb stron** | Wizualna siatka wszystkich stron ze wszystkich plików: przeciągaj miniatury, aby ułożyć dokładną sekwencję | +| **Pole stron** | Pole tekstowe dla każdego pliku przyjmujące zakresy jak `1-3, 5`, aby uwzględnić tylko wybrane strony | + +## Zastosowania + +- Łączenie osobnych PDF-ów z rozdziałami w jedną książkę lub raport +- Łączenie listu motywacyjnego i CV w jeden dokument aplikacyjny +- Pobieranie wybranych stron z wielu dokumentów źródłowych do jednego pliku zbiorczego +- Składanie zeskanowanych paragonów lub faktur w jeden PDF archiwalny +- Tworzenie materiałów do prezentacji ze slajdów z wielu pokazów + +## Wskazówki + +- Użyj Trybu stron, gdy chcesz przeplatać strony z różnych plików zamiast dopisywać jeden plik po drugim. +- Możesz dodać więcej plików po pierwszym przesłaniu przyciskiem **Dodaj więcej plików**, bez utraty bieżącego układu. +- Zakresy stron są numerowane od 1, więc `1` oznacza pierwszą stronę danego pliku. + +## Powiązane narzędzia + +- [Podziel PDF](./split-pdf) +- [Duplikuj i organizuj](./organize-pdf) +- [Naprzemienne i mieszane strony](./alternate-merge) +- [Usuń strony](./delete-pages) diff --git a/docs/pl/tools/mobi-to-pdf.md b/docs/pl/tools/mobi-to-pdf.md new file mode 100644 index 00000000..07f19c47 --- /dev/null +++ b/docs/pl/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI na PDF +description: Konwertuj e-booki MOBI na PDF bezpośrednio w przeglądarce. Za darmo, prywatnie, bez wysyłania plików. +--- + +# MOBI na PDF + +Konwertuj e-booki Amazon Kindle MOBI na dokumenty PDF. Pliki MOBI są związane z urządzeniami i aplikacjami Kindle, przez co trudno je czytać gdzie indziej. Konwersja do PDF daje przenośną wersję, którą otworzysz na dowolnym urządzeniu lub wydrukujesz. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----- | :----------- | :---------------------------------- | +| MOBI | `.mobi` | Format e-booków Kindle (Mobipocket) | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść jeden lub więcej plików MOBI. +2. Sprawdź listę plików. Usuń niepotrzebne ikoną kosza lub użyj **Dodaj więcej plików**, aby dołączyć kolejne e-booki. +3. Kliknij **Konwertuj na PDF**. Silnik PyMuPDF analizuje strukturę MOBI i renderuje każdą stronę jako zawartość PDF. +4. Pojedynczy plik zostanie pobrany jako PDF. Przy konwersji wielu plików otrzymasz archiwum ZIP o nazwie `mobi-converted.zip`. + +## Opcje + +Nie są potrzebne żadne dodatkowe ustawienia. Konwersja zachowuje treść tekstową, formatowanie i osadzone obrazy z oryginalnego pliku MOBI. + +## Zastosowania + +- Czytanie treści kupionych w Kindle na czytniku innym niż Kindle, który obsługuje tylko PDF +- Drukowanie rozdziałów e-booka do nauki lub adnotacji offline +- Archiwizowanie osobistej biblioteki e-booków w uniwersalnym formacie +- Udostępnianie fragmentów osobie, która nie ma aplikacji Kindle + +## Wskazówki + +- Plików MOBI chronionych DRM nie można konwertować. Narzędzie działa tylko z plikami MOBI bez DRM. +- Duże e-booki z wieloma osadzonymi obrazami mogą być przetwarzane o kilka sekund dłużej, ponieważ wszystko dzieje się w przeglądarce. + +## Powiązane narzędzia + +- [EPUB na PDF](./epub-to-pdf) +- [FB2 na PDF](./fb2-to-pdf) +- [CBZ na PDF](./cbz-to-pdf) diff --git a/docs/pl/tools/n-up-pdf.md b/docs/pl/tools/n-up-pdf.md new file mode 100644 index 00000000..727de7c1 --- /dev/null +++ b/docs/pl/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF N-Up +description: Ułóż wiele stron PDF na jednym arkuszu w siatce, aby drukować oszczędnie. +--- + +# PDF N-Up + +Umieść wiele stron na jednym arkuszu w układzie siatki. Zmniejsza to liczbę drukowanych stron, mieszcząc 2, 4, 6, 8, 9 lub 16 stron na arkusz. Narzędzie zajmuje się skalowaniem, pozycjonowaniem i opcjonalną konfiguracją rozmiaru strony. + +## Jak to działa + +1. Prześlij plik PDF. +2. Wybierz liczbę stron na arkusz (wartość "N"): 2, 4, 6, 8, 9 lub 16. +3. Wybierz rozmiar strony wyjściowej (domyślnie A4) i orientację. +4. Opcjonalnie skonfiguruj odstępy, kolor obramowania i kolor tła. +5. Kliknij przycisk przetwarzania. Narzędzie skaluje każdą stronę i układa je na nowych arkuszach. + +## Funkcje + +- Układy siatki: 2-up, 4-up, 6-up, 8-up, 9-up i 16-up +- Konfigurowalny rozmiar i orientacja strony wyjściowej +- Opcjonalne odstępy między ułożonymi stronami +- Ustawienia koloru tła i obramowania +- Zachowuje proporcje oryginalnych stron podczas skalowania do dopasowania + +## Opcje + +| Opcja | Opis | +| --------------------- | ------------------------------------------------------------------------------------------- | +| **Stron na arkusz** | Liczba oryginalnych stron mieszczących się na każdej stronie wyjściowej (2, 4, 6, 8, 9, 16) | +| **Rozmiar strony** | Rozmiar arkusza wyjściowego (A4, Letter, Legal itd.) | +| **Orientacja** | Pionowa lub pozioma dla arkusza wyjściowego | +| **Odstępy** | Przerwa w punktach między ułożonymi stronami | +| **Kolor tła** | Kolor wypełnienia tła arkusza wyjściowego | +| **Kolor obramowania** | Kolor obramowań wokół każdej ułożonej strony | + +## Zastosowania + +- Drukowanie materiałów z 4 slajdami na stronie, aby oszczędzać papier +- Tworzenie arkuszy do nauki z wieloma stronami referencyjnymi na jednym arkuszu +- Wytwarzanie zwartych archiwów dokumentów do segregowania +- Generowanie arkuszy z miniaturami przeglądowymi długiego dokumentu + +## Wskazówki + +- Orientacja pozioma często lepiej sprawdza się w układach 2-up, a pionowa zwykle najlepiej w układach 4-up i większych. +- Zwiększenie odstępów poprawia czytelność, ale zmniejsza dostępny obszar dla każdej ułożonej strony. +- Operację odwrotną (podział jednej strony na wiele) znajdziesz w narzędziu [Plakatowanie PDF](./posterize-pdf). + +## Powiązane narzędzia + +- [Plakatowanie PDF](./posterize-pdf) +- [Broszura PDF](./pdf-booklet) +- [Połącz w jedną stronę](./combine-single-page) diff --git a/docs/pl/tools/ocr-pdf.md b/docs/pl/tools/ocr-pdf.md new file mode 100644 index 00000000..003a2c49 --- /dev/null +++ b/docs/pl/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Spraw, by zeskanowane PDF-y były przeszukiwalne i kopiowalne dzięki Tesseract OCR z obsługą wielu języków i filtrowaniem znaków. +--- + +# OCR PDF + +Zamień zeskanowane dokumenty w przeszukiwalne, kopiowalne PDF-y. Narzędzie używa Tesseract OCR do rozpoznawania tekstu na obrazach i nakłada niewidoczną warstwę tekstową na oryginalne strony, zachowując ich wygląd i czyniąc zawartość w pełni przeszukiwalną. + +## Jak to działa + +1. Prześlij zeskanowany PDF lub PDF oparty na obrazach. +2. Wybierz z przeszukiwalnej listy jeden lub więcej języków występujących w dokumencie. +3. Opcjonalnie dostosuj ustawienia zaawansowane (rozdzielczość, binaryzacja, biała lista). +4. Kliknij **Rozpocznij OCR** i śledź postęp na pasku postępu w czasie rzeczywistym. +5. Po zakończeniu przejrzyj wyodrębniony tekst, a następnie pobierz przeszukiwalny PDF lub zwykły plik `.txt`. + +## Funkcje + +- OCR w wielu językach z przeszukiwalnym selektorem języka +- Niewidoczna warstwa tekstowa zachowuje oryginalny wygląd dokumentu +- Pasek postępu i dziennik w czasie rzeczywistym podczas przetwarzania +- Pobieranie wyników jako przeszukiwalny PDF lub zwykły plik tekstowy +- Kopiowanie wyodrębnionego tekstu bezpośrednio do schowka +- Trzy poziomy rozdzielczości do balansowania szybkości i dokładności + +## Opcje + +| Ustawienie | Wartości | Domyślnie | Cel | +| ----------------------------- | ---------------------------------------------------------------------------------------------- | --------- | -------------------------------------------------------------------------------------- | +| **Rozdzielczość** | Standardowa (192 DPI), Wysoka (288 DPI), Ultra (384 DPI) | Wysoka | Wyższa rozdzielczość poprawia dokładność przy małym tekście, ale trwa dłużej | +| **Binaryzacja obrazu** | Włączona / Wyłączona | Wyłączona | Zwiększa kontrast czystych skanów przez konwersję do czerni i bieli | +| **Gotowa biała lista znaków** | Brak, Alfanumeryczne, Liczby + waluta, Tylko litery, Tylko liczby, Faktura, Formularze, Własna | Brak | Ogranicza rozpoznawane znaki, aby poprawić dokładność dla określonych typów dokumentów | +| **Biała lista znaków** | Dowolny tekst | Pusta | Ręczny zestaw znaków, gdy gotowa lista jest ustawiona na Własna | + +## Zastosowania + +- Uczynienie zeskanowanych umów i faktur przeszukiwalnymi, aby móc je przeglądać przez Ctrl+F +- Wyodrębnianie tekstu z sfotografowanych dokumentów lub starych papierowych zapisów +- Przetwarzanie paragonów z gotową listą Faktura, aby dokładnie wychwycić kwoty i daty +- Tworzenie dostępnych PDF-ów ze skanów zawierających tylko obrazy, aby spełnić wymogi zgodności +- Zbiorcze wyodrębnianie tekstu ze zeskanowanych książek lub instrukcji + +## Wskazówki + +- Wybierz kilka języków, jeśli dokument zawiera treść w mieszanych językach (np. angielskie nagłówki z japońskim tekstem głównym). +- Użyj binaryzacji dla dokumentów z wyblakłym lub niskokontrastowym tekstem: może znacząco poprawić dokładność rozpoznawania. +- Gotowe listy Faktura i Formularze radykalnie zmniejszają liczbę fałszywych trafień w dokumentach ustrukturyzowanych, ignorując nieistotne kształty znaków. + +## Powiązane narzędzia + +- [Wyodrębnij tabele PDF](./extract-tables) +- [Połącz PDF](./merge-pdf) +- [Kompresuj PDF](./compress-pdf) diff --git a/docs/pl/tools/odg-to-pdf.md b/docs/pl/tools/odg-to-pdf.md new file mode 100644 index 00000000..8a9b8aca --- /dev/null +++ b/docs/pl/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG na PDF +description: Konwertuj pliki LibreOffice Draw (ODG) na PDF w przeglądarce. Za darmo, bez wysyłania, w pełni prywatnie. +--- + +# ODG na PDF + +Konwertuj pliki OpenDocument Graphics na PDF. ODG to natywny format LibreOffice Draw, używany do diagramów, schematów blokowych i ilustracji wektorowych. Konwersja do PDF ułatwia udostępnianie, drukowanie i osadzanie tych rysunków w innych dokumentach. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :-------------------- | :----------- | :--------------------------------------- | +| OpenDocument Graphics | `.odg` | Pliki LibreOffice Draw / OpenOffice Draw | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki ODG. Możesz dodać wiele plików naraz. +2. Sprawdź listę plików. Usuń pojedyncze pozycje ikoną kosza lub kliknij **Dodaj więcej plików**, aby dodać kolejne rysunki. +3. Kliknij **Konwertuj na PDF**. Silnik oparty na LibreOffice ładuje się w przeglądarce i konwertuje każdy plik ODG, zachowując grafikę wektorową, kształty i tekst. +4. Pojedynczy plik zostanie pobrany bezpośrednio jako PDF. Wiele plików da archiwum ZIP o nazwie `odg-to-pdf.zip`. + +## Opcje + +Nie są wymagane żadne dodatkowe ustawienia. Konwersja zachowuje oryginalne wymiary strony, kształty, łączniki i pola tekstowe ze źródła ODG. + +## Zastosowania + +- Udostępnianie diagramów LibreOffice Draw klientom, którzy nie mają zainstalowanego LibreOffice +- Drukowanie schematów blokowych i diagramów sieciowych utworzonych w Draw +- Dołączanie ilustracji ODG do raportu lub prezentacji jako osadzonych PDF-ów +- Archiwizowanie rysunków technicznych w formacie, który pozostanie czytelny przez dziesięciolecia + +## Wskazówki + +- Elementy wektorowe pozostają wektorami w wynikowym PDF-ie, więc wynik skaluje się czysto do dowolnego rozmiaru wydruku. +- Silnik LibreOffice potrzebuje chwili na inicjalizację przy pierwszym użyciu. Kolejne konwersje w tej samej sesji są szybsze. + +## Powiązane narzędzia + +- [ODS na PDF](./ods-to-pdf) +- [ODP na PDF](./odp-to-pdf) +- [VSD na PDF](./vsd-to-pdf) diff --git a/docs/pl/tools/odp-to-pdf.md b/docs/pl/tools/odp-to-pdf.md new file mode 100644 index 00000000..7f33a60b --- /dev/null +++ b/docs/pl/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP na PDF +description: Konwertuj prezentacje LibreOffice Impress (ODP) na PDF w przeglądarce. Za darmo, prywatnie, bez wysyłania. +--- + +# ODP na PDF + +Konwertuj pliki OpenDocument Presentation na PDF. ODP to natywny format LibreOffice Impress i standardowy eksport z Prezentacji Google. Zamiana prezentacji na PDF-y sprawia, że każdy może je obejrzeć bez programu do prezentacji, a slajdy drukują się czysto. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :------------------------ | :----------- | :------------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / eksport z Prezentacji Google | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki ODP. Możesz wybrać wiele prezentacji naraz. +2. Sprawdź listę plików. Usuń pozycje ikoną kosza lub użyj **Dodaj więcej plików**, aby dołączyć kolejne prezentacje. +3. Kliknij **Konwertuj na PDF**. Silnik oparty na LibreOffice przetwarza każdą prezentację i tworzy PDF, w którym każdy slajd staje się stroną. +4. Pojedynczy plik zostanie pobrany jako PDF. Wiele plików jest dostarczanych w archiwum ZIP o nazwie `odp-to-pdf.zip`. + +## Opcje + +Nie ma ustawień do skonfigurowania. Każdy slajd jest renderowany w oryginalnych wymiarach, z zachowaniem tekstu, obrazów, kształtów i teł slajdów. + +## Zastosowania + +- Rozdawanie prezentacji odbiorcom jako PDF z materiałami +- Udostępnianie eksportów z Prezentacji Google osobom, które wolą PDF od ODP +- Archiwizowanie wystąpień konferencyjnych i wykładów w formacie tylko do odczytu +- Drukowanie pokazów slajdów na warsztaty stacjonarne + +## Wskazówki + +- Przejścia i animacje slajdów to funkcje wyłącznie wizualne, które nie przechodzą do PDF, ale cała statyczna zawartość renderuje się poprawnie. +- Notatki prelegenta nie są dołączane do wynikowego PDF-a. Jeśli potrzebujesz notatek, wyeksportuj je osobno z programu do prezentacji. +- Tak jak inne narzędzia oparte na LibreOffice, silnik ładuje się przy pierwszym użyciu i pozostaje w pamięci podręcznej na czas sesji. + +## Powiązane narzędzia + +- [ODG na PDF](./odg-to-pdf) +- [ODS na PDF](./ods-to-pdf) +- [PUB na PDF](./pub-to-pdf) diff --git a/docs/pl/tools/ods-to-pdf.md b/docs/pl/tools/ods-to-pdf.md new file mode 100644 index 00000000..8da353e9 --- /dev/null +++ b/docs/pl/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS na PDF +description: Konwertuj arkusze LibreOffice Calc (ODS) na PDF w przeglądarce. Za darmo, prywatnie, bez rejestracji. +--- + +# ODS na PDF + +Konwertuj pliki OpenDocument Spreadsheet na PDF. ODS to natywny format LibreOffice Calc i częsty format eksportu z Arkuszy Google. To narzędzie renderuje dane, formatowanie i wykresy z arkusza do podzielonego na strony pliku PDF, który możesz wydrukować lub udostępnić. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----------------------- | :----------- | :------------------------------------------ | +| OpenDocument Spreadsheet | `.ods` | Eksport z LibreOffice Calc / Arkuszy Google | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki ODS. Obsługiwanych jest wiele plików. +2. Przejrzyj listę plików. Użyj ikony kosza, aby usunąć pliki, lub kliknij **Dodaj więcej plików**, aby powiększyć partię. +3. Kliknij **Konwertuj na PDF**. Silnik oparty na LibreOffice ładuje się w przeglądarce i renderuje każdy arkusz do stron PDF. +4. Pojedynczy arkusz pobiera się jako PDF. Wiele plików jest pakowanych do `ods-to-pdf.zip`. + +## Opcje + +Nie jest wymagana żadna konfiguracja. Konwerter stosuje w pliku PDF istniejący układ wydruku arkusza, formatowanie komórek i szerokości kolumn. + +## Przypadki użycia + +- Udostępnianie budżetu lub raportu z LibreOffice Calc osobie, która przyjmuje tylko pliki PDF +- Drukowanie eksportu z Arkuszy Google pobranego jako ODS +- Archiwizowanie dokumentów finansowych w formie, której nie można edytować +- Przesyłanie formularzy lub ewidencji czasu pracy opartych na ODS jako dokumentów o stałym układzie + +## Wskazówki + +- Jeśli arkusz zawiera wiele arkuszy, wszystkie trafią do pliku PDF. +- Bardzo szerokie arkusze mogą być rozłożone poziomo na kilka stron PDF. Jeśli układ jest ważny, przed konwersją rozważ dostosowanie szerokości kolumn w pliku źródłowym. +- Silnik LibreOffice inicjalizuje się przy pierwszym użyciu. Kolejne konwersje w tej samej sesji są szybsze. + +## Powiązane narzędzia + +- [ODG na PDF](./odg-to-pdf) +- [ODP na PDF](./odp-to-pdf) +- [XML na PDF](./xml-to-pdf) diff --git a/docs/pl/tools/odt-to-pdf.md b/docs/pl/tools/odt-to-pdf.md new file mode 100644 index 00000000..67a4da39 --- /dev/null +++ b/docs/pl/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT na PDF +description: Konwertuj pliki OpenDocument Text (ODT) na PDF w przeglądarce za pomocą silnika opartego na LibreOffice. +--- + +# ODT na PDF + +Konwertuj pliki OpenDocument Text na PDF. ODT to natywny format LibreOffice Writer, Apache OpenOffice i innych otwartych edytorów tekstu. To narzędzie używa działającego w przeglądarce silnika LibreOffice, aby uzyskać dokładne konwersje zachowujące formatowanie, tabele, obrazy i style. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :---------------- | :----------- | +| OpenDocument Text | `.odt` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść jeden lub więcej plików ODT. +2. Przejrzyj listę plików. Dodaj kolejne pliki lub usuń niepotrzebne. +3. Kliknij **Konwertuj na PDF**. Silnik LibreOffice inicjalizuje się (wskaźnik postępu pokazuje stan ładowania), a następnie każdy plik jest konwertowany. +4. Pojedynczy plik pobiera się bezpośrednio jako PDF. Wiele plików jest pakowanych do `odt-converted.zip`. + +## Opcje + +To narzędzie nie ma dodatkowej konfiguracji. Konwersja zachowuje formatowanie oryginalnego dokumentu możliwie wiernie. + +## Wynik + +| Liczba plików | Wynik | +| :------------ | :---------------------------------------------------------------- | +| 1 plik | Pobranie pojedynczego PDF (np. `document.pdf`) | +| 2+ plików | Archiwum ZIP (`odt-converted.zip`) z jednym PDF dla każdego pliku | + +## Przypadki użycia + +- Konwertowanie dokumentów z LibreOffice Writer na PDF w celu udostępnienia użytkownikom Microsoft Office +- Tworzenie gotowych do druku plików PDF z prac naukowych napisanych w formacie OpenDocument +- Zbiorcza konwersja folderu szablonów ODT na pliki PDF do dystrybucji +- Generowanie plików PDF z plików ODT tworzonych przez zautomatyzowane systemy generowania dokumentów + +## Wskazówki + +- Silnik LibreOffice ładuje się przy pierwszym użyciu i jest buforowany dla kolejnych konwersji. Pierwsze ładowanie trwa kilka sekund, potem konwersje są szybkie. +- Złożone dokumenty z osadzonymi obiektami OLE lub nietypowymi czcionkami mogą wyglądać nieco inaczej niż w LibreOffice na komputerze. Przed konwersją zbiorczą przetestuj próbkę. +- W przypadku dokumentów Word (`.doc`, `.docx`) użyj zamiast tego narzędzia [Word na PDF](./word-to-pdf), które również korzysta z silnika LibreOffice, ale bezpośrednio przyjmuje formaty Microsoft. + +## Powiązane narzędzia + +- [Word na PDF](./word-to-pdf) +- [RTF na PDF](./rtf-to-pdf) +- [Tekst na PDF](./txt-to-pdf) diff --git a/docs/pl/tools/organize-pdf.md b/docs/pl/tools/organize-pdf.md new file mode 100644 index 00000000..9479bf9d --- /dev/null +++ b/docs/pl/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplikuj i organizuj +description: Zmieniaj kolejność, duplikuj i usuwaj strony PDF za pomocą miniatur przeciąganych myszą oraz własnej kolejności stron. +--- + +# Duplikuj i organizuj + +Zmieniaj układ, duplikuj i usuwaj strony PDF w wizualnym interfejsie z przeciąganiem. Każda strona jest miniaturą, którą możesz przesunąć, sklonować lub usunąć przed zapisaniem wyniku jako nowego pliku. + +## Jak to działa + +1. Prześlij pojedynczy plik PDF. +2. Narzędzie renderuje siatkę miniatur pokazującą każdą stronę. +3. Przeciągaj miniatury, aby zmienić kolejność stron, kliknij zielony przycisk duplikowania, aby sklonować stronę, lub czerwony przycisk usuwania, aby ją usunąć. +4. Możesz też wpisać własną kolejność stron w polu tekstowym (np. `3, 1, 2, 4`) i kliknąć **Zastosuj**, aby przestawić wszystkie strony naraz. +5. Kliknij przycisk przetwarzania, aby zbudować i pobrać przeorganizowany plik PDF. + +## Funkcje + +- Zmiana kolejności stron przez przeciąganie z animowanymi przejściami +- Przyciski duplikowania i usuwania przy każdej stronie +- Pole własnej kolejności stron do precyzyjnego przestawiania +- Numery stron aktualizujące się automatycznie po każdej zmianie +- Blokada usunięcia ostatniej pozostałej strony + +## Przypadki użycia + +- Przeniesienie źle umieszczonej strony na właściwe miejsce w raporcie +- Zduplikowanie strony formularza, aby mieć wiele pustych kopii w jednym pliku +- Usunięcie stron roboczych lub zastępczych przed dystrybucją dokumentu +- Odwrócenie lub przetasowanie kolejności stron na potrzeby przygotowania do druku +- Zbudowanie własnej sekwencji stron bez ponownego łączenia osobnych plików + +## Wskazówki + +- Pole własnej kolejności stron oczekuje oryginalnych numerów stron oddzielonych przecinkami. Musi zawierać każdą stronę dokładnie raz, bez pominięć i duplikatów. +- Po zduplikowaniu strony obie kopie odwołują się do tego samego oryginalnego indeksu strony. Zmiana kolejności każdej z kopii działa niezależnie. +- Do operacji zbiorczych na wielu plikach lub bardziej zaawansowanych przepływów rozważ zamiast tego [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool). + +## Powiązane narzędzia + +- [Połącz PDF](./merge-pdf) +- [Usuń strony](./delete-pages) +- [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool) +- [Odwróć strony](./reverse-pages) diff --git a/docs/pl/tools/page-dimensions.md b/docs/pl/tools/page-dimensions.md new file mode 100644 index 00000000..50cdc137 --- /dev/null +++ b/docs/pl/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Wymiary strony +description: Analizuj rozmiary stron PDF, orientację, proporcje i obrót. Wykrywaj dokumenty z mieszanymi rozmiarami i eksportuj dane do CSV. +--- + +# Wymiary strony + +Narzędzie diagnostyczne, które odczytuje każdą stronę PDF i podaje jej dokładne wymiary, orientację, nazwę standardowego rozmiaru, proporcje, powierzchnię i obrót. Przydatne do wychwytywania stron o różnych rozmiarach przed drukiem lub do udokumentowania właściwości otrzymanego pliku PDF. + +## Jak to działa + +1. Prześlij plik PDF. Analiza rusza automatycznie, bez przycisku. +2. Panel podsumowania pokazuje łączną liczbę stron, liczbę unikalnych rozmiarów stron oraz informację, czy dokument ma mieszane rozmiary. +3. Przeglądaj pełną tabelę wyników ze szczegółami dla każdej strony. +4. Przełączaj jednostki wyświetlania między punktami, calami, milimetrami i pikselami. +5. Kliknij **Eksportuj do CSV**, aby zapisać dane. + +## Raportowane pola + +| Kolumna | Opis | +| ------------------- | ------------------------------------------------------- | +| Nr strony | Kolejny numer strony | +| Wymiary | Szerokość x Wysokość w wybranej jednostce | +| Standardowy rozmiar | Dopasowana nazwa (A4, Letter itp.) lub "Niestandardowy" | +| Orientacja | Pionowa lub pozioma | +| Proporcje | Stosunek szerokości do wysokości jako liczba dziesiętna | +| Powierzchnia | Powierzchnia strony w wybranej jednostce do kwadratu | +| Obrót | Obrót strony w stopniach | + +## Funkcje + +- Automatyczne wykrywanie standardowych rozmiarów papieru (A3, A4, A5, Letter, Legal, Tabloid i innych) +- Ostrzeżenie o mieszanych rozmiarach z zestawieniem, jakie rozmiary występują i ile stron z nich korzysta +- Przeliczanie jednostek między punktami, calami, milimetrami i pikselami (przy 96 PPI) +- Eksport do CSV do użycia w arkuszach kalkulacyjnych lub systemach dokumentacji + +## Przypadki użycia + +- Sprawdzenie, czy wszystkie strony mają format A4, przed wysłaniem dokumentu do drukarni +- Diagnozowanie, dlaczego połączony PDF drukuje się z nieoczekiwanymi marginesami na niektórych stronach +- Dokumentowanie układu stron dużego archiwum PDF na potrzeby rekordów metadanych +- Wskazywanie obróconych stron wymagających korekty + +## Wskazówki + +- Jeśli podsumowanie pokazuje "Różne rozmiary", użyj narzędzia Napraw rozmiar strony, aby ujednolicić rozmiary przed drukiem. +- Pole obrotu pomaga zidentyfikować strony, które wyświetlają się poprawnie, ale mają niezerowy atrybut obrotu, co może powodować problemy w niektórych przepływach pracy. + +## Powiązane narzędzia + +- [Napraw rozmiar strony](./fix-page-size): ujednolicenie stron po wykryciu mieszanych rozmiarów +- [Kompresuj PDF](./compress-pdf): optymalizacja PDF po naprawie problemów ze stronami +- [Obróć PDF](./rotate-pdf): korekta obróconych stron diff --git a/docs/pl/tools/page-numbers.md b/docs/pl/tools/page-numbers.md new file mode 100644 index 00000000..2eecce93 --- /dev/null +++ b/docs/pl/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Numery stron +description: Dodaj konfigurowalne numery stron w dowolnym miejscu stron PDF z wybraną czcionką, rozmiarem i kolorem. +--- + +# Numery stron + +Dodaj widoczne numery stron do każdej strony PDF. Wybierasz pozycję, format, rozmiar czcionki i kolor, a resztą zajmuje się narzędzie. + +## Jak to działa + +1. Prześlij plik PDF. +2. Skonfiguruj ustawienia numerów stron w panelu opcji, który się pojawi. +3. Kliknij **Dodaj numery stron**, aby przetworzyć plik. +4. PDF z numerami pobiera się automatycznie. + +## Opcje + +- **Pozycja**: wybierz, gdzie pojawią się numery stron: u dołu pośrodku, u dołu po lewej, u dołu po prawej, u góry pośrodku, u góry po lewej lub u góry po prawej. +- **Format**: wybierz prostą numerację (1, 2, 3...) lub format "strona X z Y" (1 / 5, 2 / 5...). +- **Rozmiar czcionki**: ustaw rozmiar tekstu numeru strony. Domyślnie 12. +- **Kolor**: wybierz dowolny kolor tekstu numeru strony za pomocą próbnika kolorów. + +## Funkcje + +- Sześć opcji pozycji obejmujących wszystkie rogi i pozycje środkowe +- Dwa formaty numeracji: prosty kolejny lub "strona X z Y" +- Konfigurowalny rozmiar czcionki od 6 do 72 punktów +- Pełny próbnik kolorów dla tekstu +- Automatyczna obsługa marginesów, która utrzymuje numery w bezpiecznych obszarach niezależnie od rozmiaru strony + +## Przypadki użycia + +- Przygotowywanie dokumentów do druku, które wymagają widocznych odniesień do stron +- Dodawanie numerów stron do połączonego PDF utworzonego z wielu plików źródłowych +- Numerowanie materiałów z prezentacji przed ich rozdaniem +- Dodawanie kolejnej numeracji do dokumentów prawnych lub umów + +## Wskazówki + +- Format "strona X z Y" jest przydatny w dokumentach, w których czytelnicy powinni znać całkowitą długość, np. w ofertach lub raportach. +- Jeśli potrzebujesz różnych stylów numeracji dla różnych sekcji (np. cyfr rzymskich dla części wstępnej), użyj zamiast tego narzędzia [Dodaj etykiety stron](./add-page-labels). + +## Powiązane narzędzia + +- [Dodaj etykiety stron](./add-page-labels) +- [Numeracja Batesa](./bates-numbering) +- [Nagłówek i Stopka](./header-footer) diff --git a/docs/pl/tools/pdf-booklet.md b/docs/pl/tools/pdf-booklet.md new file mode 100644 index 00000000..1cc36f95 --- /dev/null +++ b/docs/pl/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Broszura PDF +description: Przestaw strony PDF w kolejność broszury (szytej zszywkami), aby złożyć i zszyć ją w fizyczną broszurę. +--- + +# Broszura PDF + +Przestaw strony PDF w kolejność impozycji broszury. Po wydrukowaniu dwustronnym i złożeniu na pół strony będą w prawidłowej kolejności czytania. To układ używany w broszurach szytych zszywkami i zinach. + +## Jak to działa + +1. Prześlij plik PDF. +2. Skonfiguruj ustawienia broszury: rozmiar i orientację strony wyjściowej. +3. Kliknij **Generuj podgląd**, aby zobaczyć, jak strony zostaną ułożone na każdym arkuszu. +4. Przejrzyj podgląd, który pokazuje każdy fizyczny arkusz wraz z przypisaniem stron na awersie i rewersie. +5. Kliknij **Pobierz**, aby zapisać PDF z impozycją broszury. + +## Funkcje + +- Automatyczna zmiana kolejności stron do oprawy szytej zszywkami +- Konfigurowalny rozmiar strony wyjściowej +- Wizualny podgląd układu broszury przed pobraniem +- Obsługa nieparzystej liczby stron przez wstawianie pustych stron tam, gdzie trzeba +- Skalowanie stron źródłowych do rozmiaru arkusza broszury + +## Przypadki użycia + +- Tworzenie drukowalnych broszur lub zinów ze zwykłego PDF +- Przygotowywanie programów konferencji lub przewodników po wydarzeniach do druku we własnym zakresie +- Wykonywanie składanych kartek okolicznościowych lub małych katalogów +- Tworzenie tomików poezji lub zbiorów do ręcznej oprawy + +## Wskazówki + +- Liczba stron źródłowego PDF powinna być najlepiej wielokrotnością 4, aby broszura wyszła czysto. Jeśli tak nie jest, puste strony są dodawane automatycznie, aby uzupełnić ostatni arkusz. +- Drukuj wynik dwustronnie z ustawieniem drukarki "odwracanie wzdłuż krótszej krawędzi", następnie złóż wszystkie arkusze razem i zszyj na grzbiecie. +- Do samego umieszczania wielu stron na jednym arkuszu bez kolejności broszury użyj zamiast tego [PDF N-Up](./n-up-pdf). + +## Powiązane narzędzia + +- [PDF N-Up](./n-up-pdf) +- [Obróć PDF](./rotate-pdf) +- [Dodaj pustą stronę](./add-blank-page) diff --git a/docs/pl/tools/pdf-layers.md b/docs/pl/tools/pdf-layers.md new file mode 100644 index 00000000..26cfda55 --- /dev/null +++ b/docs/pl/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Warstwy PDF (OCG) +description: Wyświetlaj, przełączaj, dodawaj i usuwaj warstwy Optional Content Group (OCG) w dokumencie PDF. +--- + +# Warstwy PDF (OCG) + +Zarządzaj grupami treści opcjonalnej (Optional Content Groups, OCG), zwanymi potocznie "warstwami", wewnątrz pliku PDF. Możesz przełączać widoczność warstw, dodawać nowe warstwy (także zagnieżdżone warstwy podrzędne), usuwać warstwy i zapisywać zmodyfikowany PDF. + +## Jak to działa + +1. Prześlij plik PDF. +2. Kliknij przycisk przetwarzania, aby załadować dokument za pomocą silnika PyMuPDF. +3. Narzędzie wyświetla wszystkie istniejące warstwy wraz ze stanem widoczności, blokadą i hierarchią zagnieżdżenia. +4. Zaznaczaj pola wyboru, aby pokazać lub ukryć warstwy. Zablokowanych warstw nie można przełączać. +5. Dodawaj nowe warstwy najwyższego poziomu, wpisując nazwę i klikając przycisk dodawania, lub dodawaj warstwy podrzędne pod istniejącą warstwą nadrzędną. +6. Usuń warstwy, których już nie potrzebujesz. +7. Kliknij **Zapisz**, aby pobrać zmodyfikowany PDF z zastosowanymi zmianami warstw. + +## Funkcje + +- Wyświetla hierarchię warstw z odpowiednimi wcięciami dla warstw zagnieżdżonych +- Włączanie i wyłączanie widoczności warstwy +- Wskaźnik zablokowanej warstwy zapobiega przypadkowym zmianom +- Dodawanie warstw najwyższego poziomu lub podrzędnych z własnymi nazwami +- Usuwanie pojedynczych warstw +- Zapisuje wszystkie zmiany w nowym pliku PDF + +## Przypadki użycia + +- Przełączanie widoczności warstw oznaczeń w rysunkach architektonicznych lub inżynierskich +- Dodawanie nowych warstw adnotacji do wielowarstwowego dokumentu projektowego +- Usuwanie przestarzałych warstw z szablonu przed jego dystrybucją +- Sprawdzanie, jakie warstwy istnieją w złożonym PDF otrzymanym od strony trzeciej + +## Wskazówki + +- Jeśli PDF nie ma warstw, narzędzie pokazuje pusty stan z propozycją dodania warstwy. Nie wszystkie pliki PDF używają warstw OCG, są one najczęstsze w eksportach CAD i plikach projektowych. +- Warstwy podrzędne są wizualnie wcięte pod warstwą nadrzędną. Warstwy można zagnieżdżać na dowolną głębokość. +- Zablokowane warstwy są wyświetlane z ikoną kłódki, a ich pola wyboru są wyłączone. Te blokady ustawia twórca pliku PDF. + +## Powiązane narzędzia + +- [Wyświetl metadane](./view-metadata) +- [Edytuj metadane](./edit-metadata) +- [Duplikuj i organizuj](./organize-pdf) diff --git a/docs/pl/tools/pdf-multi-tool.md b/docs/pl/tools/pdf-multi-tool.md new file mode 100644 index 00000000..f025df5f --- /dev/null +++ b/docs/pl/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Wielofunkcyjne narzędzie PDF +description: Uniwersalny menedżer stron do łączenia, dzielenia, obracania, duplikowania, usuwania i zmiany kolejności stron PDF. +--- + +# Wielofunkcyjne narzędzie PDF + +Jedno miejsce pracy dla każdej operacji na stronach PDF. Prześlij jeden lub więcej plików PDF i pracuj na wszystkich ich stronach w jednej wizualnej siatce. Obracaj, zmieniaj kolejność, duplikuj, usuwaj, wstawiaj nowe pliki PDF, dodawaj puste strony i dziel wynik, a wszystko bez opuszczania narzędzia. + +## Jak to działa + +1. Kliknij **Prześlij PDF** lub przeciągnij pliki na obszar przesyłania. Obsługiwanych jest wiele plików. +2. Wszystkie strony z każdego przesłanego pliku pojawiają się w przewijanej siatce z miniaturami. +3. Użyj paska narzędzi lub przycisków akcji przy każdej stronie, aby manipulować stronami. +4. Zaznaczaj strony polem wyboru na każdej karcie, a następnie stosuj operacje zbiorcze. +5. Oznacz punkty podziału ikoną nożyczek, aby podzielić wynik na osobne pliki. +6. Kliknij **Eksportuj PDF**, aby pobrać końcowy wynik. Jeśli są znaczniki podziału, wynikiem jest archiwum ZIP z wieloma plikami PDF. + +## Funkcje + +- **Łączenie**: prześlij wiele plików PDF, a automatycznie połączą się w jednym obszarze roboczym +- **Zmiana kolejności**: przeciągaj i upuszczaj karty stron, aby zmienić sekwencję +- **Obracanie**: obrót pojedynczych stron lub zbiorczy, co 90 stopni (w lewo lub w prawo) +- **Duplikowanie**: sklonuj dowolną stronę jednym kliknięciem +- **Usuwanie**: usuwaj pojedyncze strony lub zbiorczo zaznaczone +- **Wstaw PDF**: dodaj nowy plik PDF po dowolnej wybranej stronie +- **Dodaj pustą stronę**: dołącz pustą stronę A4 na końcu +- **Podział**: umieść znaczniki podziału między stronami, a następnie wyeksportuj jako ZIP z osobnymi plikami PDF +- **Zaznacz wszystko / Odznacz wszystko**: szybkie zaznaczanie do operacji zbiorczych +- **Cofnij / Ponów**: pełna historia cofania i ponawiania każdej operacji +- **Pobierz zaznaczone**: wyeksportuj tylko zaznaczone strony jako samodzielny PDF +- Automatycznie naprawia uszkodzone pliki PDF przed załadowaniem + +## Przypadki użycia + +- Budowanie własnego dokumentu ze stron z wielu źródłowych plików PDF +- Porządkowanie zeskanowanego dokumentu przez usuwanie pustych stron, obracanie skanów ułożonych bokiem i zmianę kolejności sekcji +- Dzielenie dużego PDF na granicach rozdziałów za pomocą wizualnych znaczników podziału +- Szybka edycja na poziomie stron bez potrzeby używania pełnego edytora PDF + +## Wskazówki + +- System cofania i ponawiania śledzi każdą operację. Korzystaj z niego swobodnie, nie możesz przypadkowo zniszczyć swojej pracy. +- Znaczniki podziału pojawiają się jako niebieskie przerywane linie między stronami. Umieść je wizualnie tam, gdzie chcesz podzielić dokument, a następnie wyeksportuj, aby otrzymać ZIP. +- Do prostych zadań łączenia lub dzielenia dedykowane narzędzia [Połącz PDF](./merge-pdf) lub [Podziel PDF](./split-pdf) mogą być szybsze. Wielofunkcyjne narzędzie sprawdza się, gdy potrzebujesz wielu operacji w jednej sesji. + +## Powiązane narzędzia + +- [Połącz PDF](./merge-pdf) +- [Podziel PDF](./split-pdf) +- [Duplikuj i organizuj](./organize-pdf) +- [Obróć PDF](./rotate-pdf) diff --git a/docs/pl/tools/pdf-to-bmp.md b/docs/pl/tools/pdf-to-bmp.md new file mode 100644 index 00000000..ce36db6b --- /dev/null +++ b/docs/pl/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF na BMP +description: Konwertuj strony PDF na nieskompresowane obrazy BMP. Przydatne w starszych systemach i procesach drukarskich wymagających bitmap. +--- + +# PDF na BMP + +Konwertuje każdą stronę PDF na obraz BMP (bitmapa). BMP to format nieskompresowany, więc wynik jest dokładny co do piksela i bez utraty jakości, ale pliki są duże. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Kliknij **Konwertuj**, aby przetworzyć plik. +3. Pojedynczy plik `.bmp` lub archiwum ZIP pobiera się automatycznie. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Strony są renderowane w stałej skali 2x, co daje obrazy o wymiarach w przybliżeniu dwukrotnie większych niż natywne wymiary strony PDF. + +## Format wyjściowy + +- **Jedna strona**: `filename.bmp` +- **Wiele stron**: `filename_bmps.zip` zawierający `page_1.bmp`, `page_2.bmp` itd. + +## Przypadki użycia + +- Przekazywanie stron PDF do starszych systemów lub urządzeń, które przyjmują tylko BMP. +- Przygotowywanie nieskompresowanych obrazów do określonych procesów drukarskich. +- Używanie wyniku bitmapowego jako wejścia do narzędzi do przetwarzania obrazów, które wymagają surowych danych pikseli. + +## Wskazówki + +- Pliki BMP są bardzo duże, ponieważ przechowują surowe dane pikseli bez kompresji. W większości zastosowań [PDF na PNG](./pdf-to-png) daje jakość bez strat i znacznie mniejsze pliki. +- Jeśli system docelowy przyjmuje PNG lub TIFF, wybierz te formaty, aby oszczędzić miejsce na dysku. + +## Powiązane narzędzia + +- [PDF na PNG](./pdf-to-png) +- [PDF na TIFF](./pdf-to-tiff) +- [PDF na JPG](./pdf-to-jpg) diff --git a/docs/pl/tools/pdf-to-cbz.md b/docs/pl/tools/pdf-to-cbz.md new file mode 100644 index 00000000..05ca7dc5 --- /dev/null +++ b/docs/pl/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF na CBZ +description: Konwertuj PDF na plik CBZ (Comic Book Archive) dla czytników komiksów, takich jak Komga, Kavita, CDisplayEx i Calibre. +--- + +# PDF na CBZ + +Konwertuje PDF na plik CBZ (Comic Book ZIP), standardowy format cyfrowych komiksów i mangi. Każda strona PDF staje się obrazem w archiwum. Narzędzie generuje metadane w trzech formatach dla maksymalnej zgodności: ComicInfo.xml, metadata.opf i ComicBookInfo JSON. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Wybierz format obrazu, jakość, skalę i opcjonalne metadane. +3. Kliknij **Konwertuj**, aby wygenerować plik CBZ. +4. Plik `.cbz` pobiera się automatycznie. + +## Opcje + +| Opcja | Wartości | Domyślnie | Opis | +| --------------- | --------------- | --------- | --------------------------------------------------------------------------------------------------- | +| Format obrazu | JPEG, PNG, WebP | JPEG | JPEG dla kolorowych komiksów, PNG dla czarno-białej mangi bez strat, WebP dla najlepszej kompresji. | +| Jakość | 50–100% | 85% | Steruje kompresją JPEG/WebP. Ukryta dla PNG (zawsze bez strat). | +| Skala | 1.0x–4.0x | 2.0x | Wyższa skala daje ostrzejsze obrazy na ekranach o wysokiej rozdzielczości. | +| Skala szarości | Wł./Wył. | Wył. | Konwertuje strony na skalę szarości. Zmniejsza rozmiar pliku dla treści czarno-białych. | +| Tryb mangi | Wł./Wył. | Wył. | Ustawia w metadanych kierunek czytania od prawej do lewej. | +| Dołącz metadane | Wł./Wył. | Wł. | Osadza ComicInfo.xml, metadata.opf i ComicBookInfo JSON. | + +## Pola metadanych + +Gdy metadane są włączone, możesz wypełnić: + +- **Tytuł**: wykrywany automatycznie z nazwy pliku PDF. +- **Seria**: nazwa serii (np. "Naruto"). +- **Numer (#)**: numer wydania w serii. +- **Tom (Vol.)**: numer tomu. +- **Autor(zy)**: nazwa scenarzysty lub twórcy. +- **Wydawca**: firma wydawnicza. +- **Tagi / Gatunek**: tagi oddzielone przecinkami (np. "Akcja, Przygoda"). +- **Rok wydania**: rok publikacji (1900–2100). +- **Ocena**: ocena społeczności od 0 do 5. + +## Zgodność metadanych + +Narzędzie zapisuje metadane w trzech formatach, aby każdy czytnik mógł je znaleźć: + +| Format | Lokalizacja | Obsługiwany przez | +| ------------------ | ------------------- | ------------------------------------------- | +| ComicInfo.xml | Plik wewnątrz ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Plik wewnątrz ZIP | Calibre | +| ComicBookInfo JSON | Pole komentarza ZIP | Calibre (zapasowo) | + +## Format wyjściowy + +- `filename.cbz`: archiwum ZIP zawierające ponumerowane obrazy stron i pliki metadanych. + +Obrazy stron mają nazwy z numerami uzupełnionymi zerami (`01.jpg`, `02.jpg` itd.), aby czytniki wyświetlały je we właściwej kolejności. + +## Przypadki użycia + +- Konwertowanie PDF z mangą lub komiksami do użytku w czytnikach komiksów. +- Budowanie cyfrowej biblioteki komiksów w Komga, Kavita lub Calibre. +- Konwertowanie zeskanowanych komiksów do formatu przyjaznego czytnikom. +- Udostępnianie komiksów w formacie zachowującym kierunek czytania i metadane. + +## Wskazówki + +- Użyj **JPEG** dla kolorowych komiksów i **PNG** dla czarno-białej mangi, ponieważ PNG bardzo efektywnie kompresuje treści czarno-białe. +- Włącz **Skalę szarości** dla mangi, aby znacząco zmniejszyć rozmiar pliku. +- Wypełnij pola **Seria** i **Numer**, aby menedżery bibliotek (Komga, Calibre) mogły automatycznie uporządkować Twoją kolekcję. +- **WebP** oferuje najlepszą kompresję, ale starsze czytniki komiksów mogą go nie obsługiwać. + +## Powiązane narzędzia + +- [PDF na JPG](./pdf-to-jpg) +- [PDF na PNG](./pdf-to-png) +- [PDF na TIFF](./pdf-to-tiff) +- [Wyodrębnij obrazy](./extract-images) diff --git a/docs/pl/tools/pdf-to-csv.md b/docs/pl/tools/pdf-to-csv.md new file mode 100644 index 00000000..c1e55f1f --- /dev/null +++ b/docs/pl/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF na CSV +description: Wyodrębnij tabele z dokumentów PDF i wyeksportuj je do jednego pliku CSV. Obsługuje wielostronicowe PDF z automatycznym wykrywaniem tabel. +--- + +# PDF na CSV + +Wyodrębnia tabele z PDF i eksportuje je jako plik CSV. Narzędzie skanuje każdą stronę w poszukiwaniu danych tabelarycznych za pomocą silnika wykrywania tabel PyMuPDF, a następnie zapisuje wszystkie znalezione wiersze w jednym wyniku rozdzielanym przecinkami. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Kliknij **Konwertuj**, aby rozpocząć wyodrębnianie tabel. +3. Narzędzie skanuje każdą stronę i automatycznie identyfikuje tabele. +4. Plik `.csv` pobiera się ze wszystkimi wyodrębnionymi danymi tabel. + +Tabele z różnych stron są oddzielone w wyniku pustymi wierszami. Komórki zawierające przecinki, cudzysłowy lub nowe wiersze są prawidłowo poprzedzane znakami ucieczki zgodnie z RFC 4180. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Wszystkie tabele znalezione w dokumencie są wyodrębniane i łączone w jeden plik CSV. + +## Format wyjściowy + +- Pojedynczy plik `filename.csv` zawierający wszystkie wykryte tabele. + +## Przypadki użycia + +- Przenoszenie danych finansowych z wyciągów bankowych lub faktur w PDF do arkusza kalkulacyjnego. +- Wyodrębnianie tabel cenowych z ofert dostawców w celu porównania. +- Konwertowanie tabelarycznych danych badawczych z artykułów PDF do formatu odpowiedniego dla narzędzi analitycznych. +- Migrowanie danych ze starszych raportów PDF do baz danych. + +## Wskazówki + +- Jeśli nie znaleziono tabel, narzędzie wyświetla komunikat "Nie znaleziono tabel". Zwykle oznacza to, że PDF używa układu tekstu, który wygląda jak tabela, ale nie jest zbudowany jako prawdziwa tabela. +- Aby mieć większą kontrolę nad pojedynczymi tabelami, użyj [Wyodrębnij tabele PDF](./extract-tables), które pozwala wybrać format wyjściowy CSV, JSON lub Markdown. +- Jeśli potrzebujesz danych w formacie Excel z osobnymi arkuszami dla każdej tabeli, użyj [PDF na Excel](./pdf-to-excel). + +## Powiązane narzędzia + +- [PDF na Excel](./pdf-to-excel) +- [Wyodrębnij tabele PDF](./extract-tables) +- [PDF na Tekst](./pdf-to-text) diff --git a/docs/pl/tools/pdf-to-excel.md b/docs/pl/tools/pdf-to-excel.md new file mode 100644 index 00000000..357495f2 --- /dev/null +++ b/docs/pl/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF na Excel +description: Wyodrębnij tabele z dokumentów PDF do arkusza Excel. Każda tabela trafia do osobnego arkusza z odwołaniem do strony. +--- + +# PDF na Excel + +Wyodrębnia tabele z PDF i zapisuje je jako arkusz kalkulacyjny Excel (`.xlsx`). Każda wykryta tabela trafia do osobnego arkusza, oznaczonego numerem tabeli i stroną źródłową. Wykorzystuje PyMuPDF do wykrywania tabel i bibliotekę SheetJS do generowania plików Excel. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Kliknij **Konwertuj**, aby rozpocząć wyodrębnianie tabel. +3. Narzędzie skanuje każdą stronę w poszukiwaniu tabel, a następnie buduje skoroszyt Excel. +4. Plik `.xlsx` pobiera się z jednym arkuszem na tabelę. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Wszystkie wykryte tabele są wyodrębniane automatycznie. + +## Format wyjściowy + +- Pojedynczy plik `filename.xlsx`. +- **Jedna tabela**: jeden arkusz o nazwie "Table". +- **Wiele tabel**: arkusze o nazwach "Table 1 (Page 3)", "Table 2 (Page 5)" itd. Nazwy arkuszy są skracane do 31 znaków (limit Excela). + +## Przypadki użycia + +- Konwertowanie raportów finansowych w PDF na edytowalne arkusze do dalszej analizy. +- Wyodrębnianie tabel zapasów lub zamówień z plików PDF od dostawców. +- Przenoszenie danych strukturalnych z formularzy lub katalogów PDF do Excela w celu sortowania i filtrowania. +- Archiwizowanie tabelarycznych danych z PDF w formacie, z którym mogą pracować mniej techniczni współpracownicy. + +## Wskazówki + +- Jeśli narzędzie zgłasza "Nie znaleziono tabel", PDF prawdopodobnie używa swobodnego układu tekstu zamiast uporządkowanych tabel. Spróbuj zamiast tego [PDF na Tekst](./pdf-to-text), aby pobrać surową zawartość. +- Dla prostszego płaskiego formatu użyj [PDF na CSV](./pdf-to-csv). Do pobierania poszczególnych tabel w wielu formatach użyj [Wyodrębnij tabele PDF](./extract-tables). +- Sprawdź nazwy arkuszy, aby zidentyfikować, z której strony pochodzi każda tabela. + +## Powiązane narzędzia + +- [PDF na CSV](./pdf-to-csv) +- [Wyodrębnij tabele PDF](./extract-tables) +- [PDF na Tekst](./pdf-to-text) diff --git a/docs/pl/tools/pdf-to-greyscale.md b/docs/pl/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..1468edb1 --- /dev/null +++ b/docs/pl/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF na odcienie szarości +description: Konwertuj kolorowy PDF na wersję w odcieniach szarości (czarno-białą). Tworzy nowy PDF ze wszystkimi kolorami usuniętymi z każdej strony. +--- + +# PDF na odcienie szarości + +Konwertuje kolorowy PDF na wersję w odcieniach szarości. Każda strona jest renderowana, pozbawiana nasycenia i osadzana ponownie jako obraz JPEG w nowym PDF. Wynik zachowuje oryginalne wymiary stron. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Kliknij **Konwertuj**, aby przetworzyć plik. +3. Nowy plik `greyscale.pdf` pobiera się ze wszystkimi stronami przekonwertowanymi na czarno-białe. + +Pod spodem każda strona jest renderowana w skali 2x, dane pikseli przechodzą przez filtr odcieni szarości, następnie są ponownie kodowane jako JPEG o jakości 90% i umieszczane w nowym dokumencie PDF. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Konwersja do odcieni szarości używa standardowego wzoru luminancji, a jakość JPEG jest stała i wynosi 90%. + +## Format wyjściowy + +- Pojedynczy plik `greyscale.pdf` zawierający wszystkie strony jako obrazy JPEG w odcieniach szarości. + +## Przypadki użycia + +- Przygotowywanie dokumentów do druku czarno-białego, aby oszczędzić na kolorowym tuszu. +- Spełnianie wymogów dotyczących składania dokumentów prawnych lub urzędowych, które wymagają odcieni szarości. +- Zmniejszanie rozmiaru plików PDF z dużą ilością koloru (obrazy JPEG w odcieniach szarości są mniejsze niż kolorowe). +- Tworzenie spójnego stylu wizualnego dokumentów z mieszanymi stronami kolorowymi i czarno-białymi. + +## Wskazówki + +- Ponieważ każda strona jest rasteryzowana i osadzana ponownie jako JPEG, wynik jest oparty na obrazach. Tekst z oryginalnego PDF nie będzie już zaznaczalny ani przeszukiwalny. Jeśli potrzebujesz potem przeszukiwalnego tekstu, przepuść wynik przez narzędzie OCR. +- Aby mieć większą kontrolę nad korektą kolorów (jasność, kontrast, nasycenie), skorzystaj z narzędzia Dostosuj kolory lub węzła Greyscale w [Kreator przepływów PDF](./pdf-workflow). + +## Powiązane narzędzia + +- [PDF na JPG](./pdf-to-jpg) +- [PDF na PNG](./pdf-to-png) +- [Kreator przepływów PDF](./pdf-workflow) diff --git a/docs/pl/tools/pdf-to-jpg.md b/docs/pl/tools/pdf-to-jpg.md new file mode 100644 index 00000000..a4163a2e --- /dev/null +++ b/docs/pl/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF na JPG +description: Konwertuj strony PDF na obrazy JPG z regulowaną jakością. Jednostronicowe PDF pobierają się bezpośrednio, wielostronicowe jako ZIP. +--- + +# PDF na JPG + +Konwertuje każdą stronę PDF na obraz JPG. Dokumenty jednostronicowe pobierają się jako samodzielny plik `.jpg`. Wielostronicowe pliki PDF dają archiwum ZIP z jednym plikiem JPG na stronę. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. Narzędzie wyświetla nazwę pliku, jego rozmiar i liczbę stron. +2. Dostosuj suwak **Jakość**, aby sterować kompresją JPG. +3. Kliknij **Konwertuj**, aby rozpocząć przetwarzanie. +4. Wynik pobiera się automatycznie: pojedynczy JPG dla jednostronicowych PDF lub plik ZIP dla dokumentów wielostronicowych. + +## Opcje + +- **Jakość**: suwak od 0% do 100% (domyślnie 90%). Wyższe wartości dają ostrzejsze obrazy i większe pliki. Niższe wartości kompresują mocniej. + +Strony są wewnętrznie renderowane w skali 2x, więc rozdzielczość wyniku jest dwukrotnie większa niż wymiary strony PDF. Standardowa strona w formacie Letter daje obraz o rozmiarze około 1 224 x 1 584 pikseli. + +## Format wyjściowy + +- **Jedna strona**: `filename.jpg` +- **Wiele stron**: `filename_jpgs.zip` zawierający `page_1.jpg`, `page_2.jpg` itd. + +## Przypadki użycia + +- Generowanie miniatur podglądu dla systemu zarządzania dokumentami. +- Udostępnianie strony z raportu w czacie lub e-mailu, które nie obsługują PDF. +- Tworzenie zasobów graficznych z diagramów lub ilustracji w PDF. +- Archiwizowanie zeskanowanych dokumentów jako pojedynczych obrazów. + +## Wskazówki + +- Aby uzyskać wynik bez strat, użyj zamiast tego [PDF na PNG](./pdf-to-png). +- Ustawienie jakości 80-90% daje dobry kompromis między rozmiarem pliku a wiernością obrazu. +- Jeśli potrzebujesz określonego formatu dla każdej strony, rozważ [Kreator przepływów PDF](./pdf-workflow), który ma węzeł wyjściowy PDF na obrazy. + +## Powiązane narzędzia + +- [PDF na PNG](./pdf-to-png) +- [PDF na WebP](./pdf-to-webp) +- [PDF na BMP](./pdf-to-bmp) +- [PDF na TIFF](./pdf-to-tiff) diff --git a/docs/pl/tools/pdf-to-json.md b/docs/pl/tools/pdf-to-json.md new file mode 100644 index 00000000..b0e9918e --- /dev/null +++ b/docs/pl/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF na JSON +description: Konwertuj pliki PDF na ustrukturyzowany format JSON za pomocą CPDF. Eksportuje wewnętrzną strukturę PDF jako dane JSON czytelne dla maszyn. +--- + +# PDF na JSON + +Konwertuje jeden lub więcej plików PDF na format JSON. Narzędzie używa CPDF (Coherent PDF) do serializacji wewnętrznej struktury każdego PDF do czytelnej dla maszyn reprezentacji JSON. Wynik jest zawsze dostarczany jako archiwum ZIP. + +## Jak to działa + +1. Wybierz jeden lub więcej plików PDF za pomocą selektora plików. +2. Kliknij **Konwertuj**, aby rozpocząć przetwarzanie. Konwersja działa w tle w web workerze. +3. Pobiera się archiwum ZIP zawierające jeden plik JSON dla każdego wejściowego PDF. + +Pasek stanu pokazuje postęp etapów konwersji i tworzenia archiwum ZIP. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Każdy PDF jest konwertowany do pełnej reprezentacji JSON. + +## Format wyjściowy + +- Plik `pdfs-to-json.zip` zawierający `filename.json` dla każdego wejściowego PDF. + +Wynik JSON przedstawia wewnętrzną strukturę obiektów PDF, w tym drzewa stron, odwołania do czcionek, metadane i strumienie zawartości. + +## Przypadki użycia + +- Sprawdzanie wewnętrznej struktury PDF w celu debugowania lub walidacji. +- Programowe wyodrębnianie ustrukturyzowanych metadanych i właściwości stron. +- Przekazywanie danych o strukturze PDF do własnych potoków przetwarzania. +- Audytowanie dokumentów PDF pod kątem zgodności przez analizę ich drzew obiektów. + +## Wskazówki + +- To narzędzie zwraca surową strukturę obiektów PDF, a nie wyodrębniony tekst. Jeśli potrzebujesz tekstu stron w formacie JSON, użyj zamiast tego [Przygotuj PDF dla AI](./prepare-pdf-for-ai). +- Do zwykłego wyodrębniania tekstu prostszy jest [PDF na Tekst](./pdf-to-text). +- Duże pliki PDF o złożonej strukturze dają bardzo duże pliki JSON. + +## Powiązane narzędzia + +- [PDF na Tekst](./pdf-to-text) +- [Przygotuj PDF dla AI](./prepare-pdf-for-ai) +- [Wyodrębnij tabele PDF](./extract-tables) diff --git a/docs/pl/tools/pdf-to-markdown.md b/docs/pl/tools/pdf-to-markdown.md new file mode 100644 index 00000000..8f6c6686 --- /dev/null +++ b/docs/pl/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF na Markdown +description: Konwertuj dokumenty PDF na format Markdown z opcjonalnym wyodrębnianiem obrazów. Obsługuje zbiorczą konwersję wielu plików. +--- + +# PDF na Markdown + +Konwertuje pliki PDF na format Markdown (`.md`), zachowując nagłówki, akapity, listy i podstawowe formatowanie. Opcjonalnie wyodrębnia i dołącza osadzone obrazy. Obsługuje konwersję pojedynczą i zbiorczą. Wykorzystuje PyMuPDF. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając na nią pliki. +2. Opcjonalnie przełącz **Dołącz obrazy**, aby osadzić wyodrębnione obrazy w wyniku Markdown. +3. Kliknij **Konwertuj**, aby rozpocząć przetwarzanie. +4. Pojedynczy plik pobiera się jako `filename.md`. Wiele plików daje `markdown-files.zip`. + +## Opcje + +- **Dołącz obrazy**: po zaznaczeniu osadzone obrazy z PDF są wyodrębniane i przywoływane w wyniku Markdown. Po odznaczeniu konwertowana jest tylko treść tekstowa. + +## Format wyjściowy + +- **Jeden plik**: `filename.md` +- **Wiele plików**: `markdown-files.zip` zawierający jeden plik `.md` dla każdego wejściowego PDF. + +## Przypadki użycia + +- Konwertowanie dokumentacji PDF na Markdown dla generatora stron statycznych, takiego jak VitePress, Hugo lub Jekyll. +- Zamienianie artykułów naukowych w PDF na edytowalny Markdown dla aplikacji do notatek, takich jak Obsidian. +- Migrowanie starszych baz wiedzy w PDF do formatu tekstowego przyjaznego dla Gita. +- Wyodrębnianie ustrukturyzowanej treści z e-booków PDF w celu ponownego sformatowania. + +## Wskazówki + +- Opcja Dołącz obrazy jest przydatna, gdy PDF zawiera diagramy lub rysunki istotne dla treści. Wyłącz ją dla dokumentów z dużą ilością tekstu, aby wynik był czysty. +- Złożone układy z paskami bocznymi, przypisami lub tekstem w wielu kolumnach mogą dawać niedoskonały Markdown. Przejrzyj wynik i w razie potrzeby popraw. +- Aby uzyskać surowy tekst bez formatowania, użyj zamiast tego [PDF na Tekst](./pdf-to-text). + +## Powiązane narzędzia + +- [PDF na Tekst](./pdf-to-text) +- [PDF na Word](./pdf-to-word) +- [Przygotuj PDF dla AI](./prepare-pdf-for-ai) diff --git a/docs/pl/tools/pdf-to-pdfa.md b/docs/pl/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..8e743276 --- /dev/null +++ b/docs/pl/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF na PDF/A +description: Konwertuj standardowe pliki PDF na format PDF/A do długoterminowej archiwizacji. Obsługuje poziomy zgodności PDF/A-1b, PDF/A-2b i PDF/A-3b. +--- + +# PDF na PDF/A + +PDF/A to ustandaryzowany przez ISO podzbiór PDF zaprojektowany do długoterminowego przechowywania cyfrowego. To narzędzie konwertuje standardowe pliki PDF na dokumenty zgodne z PDF/A za pomocą Ghostscript działającego bezpośrednio w przeglądarce. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF. +2. Wybierz **Wersję PDF/A** z listy rozwijanej. +3. Opcjonalnie włącz **Wstępne spłaszczenie PDF** dla złożonych plików, w których zwykła konwersja kończy się błędem. +4. Kliknij **Konwertuj na PDF/A**. Wiele plików daje archiwum ZIP. + +## Wersje PDF/A + +| Wersja | Ograniczenia | Najlepsze do | +| ------------ | -------------------------------------------------------- | --------------------------------------------------------- | +| **PDF/A-1b** | Najbardziej restrykcyjna. Bez przezroczystości i warstw. | Maksymalnej zgodności ze starszymi systemami archiwizacji | +| **PDF/A-2b** | Dopuszcza przezroczystość i JPEG2000. | Archiwizacji ogólnego przeznaczenia (zalecana) | +| **PDF/A-3b** | Dopuszcza osadzone załączniki w dowolnym formacie. | Archiwizacji dokumentów wraz z plikami danych źródłowych | + +PDF/A-2b jest wybrana domyślnie i sprawdza się w zdecydowanej większości zastosowań archiwizacyjnych. + +## Opcja wstępnego spłaszczenia + +Niektóre pliki PDF zawierają elementy uniemożliwiające czystą konwersję do PDF/A: nietypowe kodowania czcionek, złożone stosy przezroczystości lub uszkodzone struktury wewnętrzne. Włączenie opcji **Wstępne spłaszczenie** rasteryzuje PDF w 300 DPI przed konwersją, co gwarantuje zgodność kosztem tego, że tekst przestaje być zaznaczalny. Użyj jej jako rozwiązania awaryjnego, gdy standardowa konwersja zgłasza błędy. + +Wstępne spłaszczenie wymaga silnika PyMuPDF WASM. + +## Przypadki użycia + +- Spełnianie wymogów archiwizacyjnych urzędów lub sądów (w wielu jurysdykcjach PDF/A jest obowiązkowy w dokumentach sądowych) +- Składanie dokumentów do repozytoriów instytucjonalnych lub bibliotek cyfrowych +- Zachowywanie dokumentów biznesowych, dla których oryginalne oprogramowanie może nie istnieć za dziesięć lat +- Przygotowywanie faktur zgodnie ze standardami e-fakturowania wymagającymi PDF/A-3b z załącznikami XML + +## Wskazówki + +- Najpierw spróbuj konwersji bez wstępnego spłaszczenia. Włącz je tylko wtedy, gdy pojawi się błąd. +- PDF/A osadza wszystkie czcionki, więc pliki wynikowe są często większe niż oryginały. +- Jeśli w Twoim procesie wymagana jest ścisła zgodność, zweryfikuj wynik w dedykowanym walidatorze PDF/A. + +## Powiązane narzędzia + +- [Kompresuj PDF](./compress-pdf): zmniejsz rozmiar pliku po konwersji +- [Spłaszcz PDF](./flatten-pdf): spłaszcz formularze przed konwersją do PDF/A +- [Usuń metadane](./remove-metadata): usuń metadane przed archiwizacją diff --git a/docs/pl/tools/pdf-to-png.md b/docs/pl/tools/pdf-to-png.md new file mode 100644 index 00000000..73873c28 --- /dev/null +++ b/docs/pl/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF na PNG +description: Konwertuj strony PDF na obrazy PNG bez strat z regulowaną skalą. Idealne do wysokiej jakości zrzutów i przezroczystych teł. +--- + +# PDF na PNG + +Konwertuje każdą stronę PDF na obraz PNG. PNG używa kompresji bezstratnej, więc wynik zachowuje każdy szczegół oryginalnej strony. Jednostronicowe PDF pobierają się jako plik `.png`, wielostronicowe jako ZIP. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Ustaw suwak **Skala**, aby sterować rozdzielczością wyniku. +3. Kliknij **Konwertuj**, aby rozpocząć przetwarzanie. +4. Pojedynczy plik PNG lub archiwum ZIP pobiera się automatycznie. + +## Opcje + +- **Skala**: od 1.0x do 3.0x (domyślnie 2.0x). Przy 2.0x standardowa strona w formacie Letter jest renderowana w rozmiarze około 1 224 x 1 584 pikseli. Wyższe wartości skali dają większe, ostrzejsze obrazy kosztem rozmiaru pliku i czasu przetwarzania. + +## Format wyjściowy + +- **Jedna strona**: `filename.png` +- **Wiele stron**: `filename_pngs.zip` zawierający `page_1.png`, `page_2.png` itd. + +## Przypadki użycia + +- Wykonywanie wysokiej wierności zrzutów stron PDF do prezentacji. +- Wyodrębnianie wykresów lub diagramów, które wymagają wyraźnych krawędzi i braku artefaktów kompresji. +- Przygotowywanie zasobów do projektowania stron WWW z makiet w PDF. +- Tworzenie obrazów stron bez strat do wstępnego przetwarzania OCR. + +## Wskazówki + +- Pliki PNG są znacznie większe niż JPG. Jeśli rozmiar pliku jest ważniejszy niż idealna jakość, użyj [PDF na JPG](./pdf-to-jpg) lub [PDF na WebP](./pdf-to-webp). +- Przy skali 1.0x wynik odpowiada natywnej rozdzielczości PDF. Zwiększ do 3.0x dla eksportów w jakości do druku. + +## Powiązane narzędzia + +- [PDF na JPG](./pdf-to-jpg) +- [PDF na WebP](./pdf-to-webp) +- [PDF na SVG](./pdf-to-svg) diff --git a/docs/pl/tools/pdf-to-svg.md b/docs/pl/tools/pdf-to-svg.md new file mode 100644 index 00000000..5e767473 --- /dev/null +++ b/docs/pl/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF na SVG +description: Konwertuj strony PDF na skalowalną grafikę wektorową SVG. Zachowuje tekst i kształty jako ścieżki wektorowe do nieograniczonego skalowania. +--- + +# PDF na SVG + +Konwertuje każdą stronę PDF na plik SVG (Scalable Vector Graphics). W przeciwieństwie do formatów rastrowych SVG zachowuje ścieżki wektorowe, tekst i kształty, więc wynik skaluje się do dowolnego rozmiaru bez pikselizacji. Wykorzystuje PyMuPDF. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając na nią pliki. Możesz dodać wiele plików i zarządzać nimi pojedynczo. +2. Kliknij **Konwertuj**, aby przetworzyć wszystkie przesłane pliki. +3. Konwersje pojedynczego jednostronicowego pliku pobierają się jako samodzielny `.svg`. Wszystko inne pobiera się jako archiwum ZIP. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Każda strona jest konwertowana na SVG za pomocą natywnego eksportu wektorowego PyMuPDF. + +## Format wyjściowy + +- **Jeden plik, jedna strona**: `filename.svg` +- **Jeden plik, wiele stron**: `filename_svg.zip` zawierający `page_1.svg`, `page_2.svg` itd. +- **Wiele plików**: `pdf_to_svg.zip` z plikami uporządkowanymi według nazwy dokumentu źródłowego. + +## Przypadki użycia + +- Wyodrębnianie wektorowych diagramów, wykresów lub ilustracji z raportów PDF do użycia na stronach WWW. +- Edytowanie zawartości stron PDF w edytorze wektorowym, takim jak Inkscape lub Illustrator. +- Osadzanie skalowalnych podglądów stron w responsywnych aplikacjach webowych. +- Wyodrębnianie logo lub grafik z broszur PDF z zachowaniem ostrych krawędzi. + +## Wskazówki + +- SVG działa najlepiej z plikami PDF zawierającymi treści wektorowe. Zeskanowane dokumenty lub PDF z dużą liczbą obrazów dadzą duże pliki SVG z osadzonymi danymi rastrowymi. +- Dla rastrowego wyniku z PDF bogatych w obrazy użyj zamiast tego [PDF na PNG](./pdf-to-png) lub [PDF na JPG](./pdf-to-jpg). +- To narzędzie obsługuje konwersję zbiorczą: prześlij wiele plików PDF naraz, aby przekonwertować je wszystkie jednym przebiegiem. + +## Powiązane narzędzia + +- [PDF na PNG](./pdf-to-png) +- [PDF na JPG](./pdf-to-jpg) +- [PDF na Markdown](./pdf-to-markdown) diff --git a/docs/pl/tools/pdf-to-text.md b/docs/pl/tools/pdf-to-text.md new file mode 100644 index 00000000..de63eb16 --- /dev/null +++ b/docs/pl/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF na tekst +description: Wyodrębnij zwykły tekst z plików PDF. Obsługuje zbiorcze wyodrębnianie z wielu plików PDF z wynikiem w plikach TXT. +--- + +# PDF na tekst + +Wyodrębnia całą zawartość tekstową z plików PDF i zapisuje ją jako zwykłe pliki `.txt`. Obsługuje przetwarzanie zbiorcze: prześlij wiele plików PDF i wyodrębnij tekst każdego z nich w jednej operacji. Wykorzystuje PyMuPDF. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając na nią pliki. Zarządzaj listą plików za pomocą przycisków Dodaj więcej i Wyczyść. +2. Kliknij **Wyodrębnij**, aby rozpocząć przetwarzanie. +3. Pojedynczy plik pobiera się jako `filename.txt`. Wiele plików daje archiwum `pdf-to-text.zip`. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Cały tekst jest wyodrębniany z każdej strony w kolejności czytania. + +## Format wyjściowy + +- **Jeden plik**: `filename.txt` +- **Wiele plików**: `pdf-to-text.zip` zawierający jeden plik `.txt` dla każdego wejściowego PDF. + +## Przypadki użycia + +- Wyodrębnianie tekstu głównego z raportów PDF do indeksowania pełnotekstowego. +- Konwertowanie e-booków lub artykułów PDF na zwykły tekst do czytania na urządzeniach z e-papierem. +- Pobieranie tekstu z umów lub dokumentów prawnych do analizy słów kluczowych. +- Usuwanie formatowania z plików PDF, aby uzyskać czysty tekst dla skryptów przetwarzania danych. +- Przygotowywanie korpusu tekstowego z archiwów PDF do przetwarzania języka naturalnego. + +## Wskazówki + +- Zeskanowane pliki PDF (tylko obraz) dadzą puste pliki tekstowe, ponieważ nie ma warstwy tekstowej do wyodrębnienia. Najpierw przepuść zeskanowane dokumenty przez OCR. +- Wynik zachowuje kolejność czytania zinterpretowaną przez PyMuPDF, która zazwyczaj biegnie od lewej do prawej i z góry na dół. Układy wielokolumnowe mogą dać przeplatany tekst. +- Aby uzyskać ustrukturyzowany wynik z nagłówkami i formatowaniem, wypróbuj [PDF na Markdown](./pdf-to-markdown). Dla ustrukturyzowanego JSON gotowego dla AI użyj [Przygotuj PDF dla AI](./prepare-pdf-for-ai). + +## Powiązane narzędzia + +- [PDF na Markdown](./pdf-to-markdown) +- [Przygotuj PDF dla AI](./prepare-pdf-for-ai) +- [PDF na Word](./pdf-to-word) diff --git a/docs/pl/tools/pdf-to-tiff.md b/docs/pl/tools/pdf-to-tiff.md new file mode 100644 index 00000000..a38e93db --- /dev/null +++ b/docs/pl/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF na TIFF +description: Konwertuj strony PDF na obrazy TIFF, powszechnie używane w druku, faksie i archiwizacji. W razie błędu kodowania wraca do PNG. +--- + +# PDF na TIFF + +Konwertuje każdą stronę PDF na obraz TIFF. TIFF to standardowy format w produkcji poligraficznej, systemach faksowych i archiwizacji dokumentów. Narzędzie używa kompresji PackBits do kodowania TIFF i wraca do PNG, jeśli kodowanie strony się nie powiedzie. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Kliknij **Konwertuj**, aby przetworzyć plik. +3. Pojedynczy plik TIFF lub archiwum ZIP pobiera się automatycznie. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Strony są renderowane w stałej skali 2x. + +## Format wyjściowy + +- **Jedna strona**: `filename.tiff` +- **Wiele stron**: `filename_tiffs.zip` zawierający `page_1.tiff`, `page_2.tiff` itd. + +Jeśli kodowanie TIFF dla danej strony się nie powiedzie (z powodu problemów z kompresją), ta strona zostanie zapisana jako plik `.png`. W takim przypadku ZIP będzie zawierał mieszankę plików TIFF i PNG. + +## Przypadki użycia + +- Składanie dokumentów w urzędach lub systemach prawnych, które wymagają formatu TIFF. +- Przygotowywanie stron do wysyłki faksem przez cyfrowe usługi faksowe. +- Archiwizowanie zeskanowanych dokumentów w powszechnie obsługiwanym formacie bezstratnym. +- Przekazywanie stron do korporacyjnych systemów zarządzania dokumentami. + +## Wskazówki + +- Pliki TIFF są duże. Jeśli jakość bez strat potrzebna jest tylko do użytku w sieci lub na ekranie, lepszym wyborem jest [PDF na PNG](./pdf-to-png). +- Sprawdź zawartość ZIP, jeśli niektóre strony wymagały zapasowego formatu PNG, bo możesz chcieć przekonwertować je osobno. + +## Powiązane narzędzia + +- [PDF na PNG](./pdf-to-png) +- [PDF na BMP](./pdf-to-bmp) +- [PDF na JPG](./pdf-to-jpg) diff --git a/docs/pl/tools/pdf-to-webp.md b/docs/pl/tools/pdf-to-webp.md new file mode 100644 index 00000000..aca8b288 --- /dev/null +++ b/docs/pl/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF na WebP +description: Konwertuj strony PDF na obrazy WebP z regulowaną jakością. Mniejsze pliki niż JPG przy porównywalnej jakości obrazu. +--- + +# PDF na WebP + +Konwertuje każdą stronę PDF na obraz WebP. WebP zwykle daje pliki o 25-35% mniejsze niż JPG przy tej samej postrzeganej jakości, co czyni go dobrym wyborem do użytku w sieci. + +## Jak to działa + +1. Prześlij plik PDF, klikając strefę upuszczania lub przeciągając na nią plik. +2. Dostosuj suwak **Jakość**. +3. Kliknij **Konwertuj**, aby przetworzyć plik. +4. Pojedynczy plik `.webp` lub archiwum ZIP pobiera się automatycznie. + +## Opcje + +- **Jakość**: suwak od 0% do 100% (domyślnie 85%). Steruje poziomem kompresji stratnej. Wyższe wartości zachowują więcej szczegółów. + +Strony są wewnętrznie renderowane w skali 2x, co daje obrazy o wymiarach mniej więcej dwukrotnie większych niż natywne wymiary PDF. + +## Format wyjściowy + +- **Jedna strona**: `filename.webp` +- **Wiele stron**: `filename_webps.zip` zawierający `page_1.webp`, `page_2.webp` itd. + +## Przypadki użycia + +- Przygotowywanie podglądów stron dla witryn, gdzie liczy się przepustowość. +- Generowanie lekkich wersji obrazkowych ulotek lub broszur do mediów społecznościowych. +- Zbiorcza konwersja wielostronicowych dokumentów na zestaw obrazów zoptymalizowanych dla sieci. + +## Wskazówki + +- WebP jest obsługiwany we wszystkich nowoczesnych przeglądarkach. Dla zgodności ze starszymi środowiskami użyj [PDF na JPG](./pdf-to-jpg). +- Jakość 80-85% jest zwykle nieodróżnialna od oryginału na ekranie, a pliki pozostają małe. + +## Powiązane narzędzia + +- [PDF na JPG](./pdf-to-jpg) +- [PDF na PNG](./pdf-to-png) +- [PDF na BMP](./pdf-to-bmp) diff --git a/docs/pl/tools/pdf-to-word.md b/docs/pl/tools/pdf-to-word.md new file mode 100644 index 00000000..f19b29d8 --- /dev/null +++ b/docs/pl/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF na Word +description: Konwertuj pliki PDF na edytowalne dokumenty Word (DOCX). Obsługuje zbiorczą konwersję wielu plików PDF naraz. +--- + +# PDF na Word + +Konwertuje pliki PDF na edytowalne dokumenty Word (`.docx`). Narzędzie używa PyMuPDF do odtworzenia zawartości dokumentu, zachowując tekst, podstawowe formatowanie i układ. Obsługuje konwersję pojedynczą i zbiorczą. + +## Jak to działa + +1. Prześlij jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając na nią pliki. Możesz dodać więcej plików lub usunąć pojedyncze z listy. +2. Kliknij **Konwertuj**, aby rozpocząć przetwarzanie. +3. Pojedynczy plik pobiera się jako `filename.docx`. Wiele plików jest pakowanych do `converted-documents.zip`. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Każdy PDF jest konwertowany na DOCX za pomocą wbudowanego silnika konwersji PyMuPDF. + +## Format wyjściowy + +- **Jeden plik**: `filename.docx` +- **Wiele plików**: `converted-documents.zip` zawierający jeden plik `.docx` dla każdego wejściowego PDF. + +## Przypadki użycia + +- Edytowanie tekstu w otrzymanym pliku PDF, który trzeba zmodyfikować. +- Konwertowanie zarchiwizowanych raportów PDF do formatu, który współpracownicy mogą edytować w Microsoft Word lub Dokumentach Google. +- Przenoszenie treści z umów lub ofert w PDF do Worda w celu nanoszenia poprawek. +- Migrowanie starszej dokumentacji PDF do formatu edytowalnego. + +## Wskazówki + +- Złożone układy z tekstem w wielu kolumnach, osadzonymi formularzami lub dużą ilością grafiki mogą nie przekonwertować się idealnie. Przejrzyj wynik i dostosuj formatowanie w edytorze tekstu. +- Zeskanowane pliki PDF (tylko obraz) dadzą puste lub minimalne pliki DOCX. Najpierw przepuść je przez OCR, aby dodać warstwę tekstową. +- Tryb zbiorczy jest wydajny przy konwertowaniu całych folderów plików PDF: prześlij je wszystkie naraz. + +## Powiązane narzędzia + +- [PDF na Tekst](./pdf-to-text) +- [PDF na Markdown](./pdf-to-markdown) +- [Kreator przepływów PDF](./pdf-workflow) diff --git a/docs/pl/tools/pdf-to-zip.md b/docs/pl/tools/pdf-to-zip.md new file mode 100644 index 00000000..5f7cb586 --- /dev/null +++ b/docs/pl/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF na ZIP +description: Spakuj wiele plików PDF w jedno archiwum ZIP, aby łatwo je udostępniać i przechowywać. +--- + +# PDF na ZIP + +Spakuj wiele plików PDF w jedno archiwum ZIP. To proste narzędzie do pakowania: bez konwersji, kompresji ani modyfikacji samych plików PDF. + +## Jak to działa + +1. Prześlij wiele plików PDF za pomocą strefy upuszczania. +2. Przejrzyj listę plików. Usuń te, których nie chcesz dołączać. +3. Kliknij przycisk przetwarzania. +4. Archiwum ZIP zawierające wszystkie przesłane pliki PDF pobiera się natychmiast. + +## Funkcje + +- Przyjmuje dowolną liczbę plików PDF +- Usuwanie pojedynczych plików przed utworzeniem archiwum +- Zachowuje oryginalne nazwy plików wewnątrz ZIP +- Brak modyfikacji zawartości PDF: pliki są pakowane bez zmian +- Wyświetla nazwę i rozmiar każdego przesłanego pliku PDF + +## Przypadki użycia + +- Pakowanie zestawu faktur lub paragonów jako załącznika e-mail +- Pakowanie rezultatów projektu (wielu raportów PDF) do przekazania +- Tworzenie jednego pliku do pobrania dla kolekcji formularzy lub szablonów +- Archiwizowanie partii dokumentów w jednym skompresowanym pliku + +## Wskazówki + +- Archiwum ZIP używa oryginalnych nazw plików PDF. Jeśli masz pliki o tej samej nazwie, zmień je przed przesłaniem, aby uniknąć konfliktów. +- To narzędzie nie kompresuje samych plików PDF. Aby zmniejszyć rozmiar, najpierw przepuść je przez Kompresuj PDF, a potem spakuj tym narzędziem. + +## Powiązane narzędzia + +- [Połącz PDF](./merge-pdf) +- [Podziel PDF](./split-pdf) +- [Kompresuj PDF](./compress-pdf) diff --git a/docs/pl/tools/pdf-workflow.md b/docs/pl/tools/pdf-workflow.md new file mode 100644 index 00000000..44e53299 --- /dev/null +++ b/docs/pl/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Kreator przepływów PDF +description: Buduj własne potoki przetwarzania PDF wizualnie, łącząc węzły na kanwie. Łącz operacje takie jak scalanie, kompresja, znak wodny i eksport. +--- + +# Kreator przepływów PDF + +Kreator przepływów pozwala połączyć wiele operacji na PDF w jeden zautomatyzowany potok. Zamiast uruchamiać narzędzia po kolei, łączysz wizualny graf węzłów (wejście, przetwarzanie, wyjście) i wykonujesz wszystko jednym kliknięciem. Twoje pliki nigdy nie opuszczają przeglądarki. + +## Jak to działa + +Interfejs jest podzielony na trzy panele: **przybornik węzłów** po lewej, **kanwę** pośrodku i **panel ustawień** po prawej, który pojawia się po zaznaczeniu węzła. + +1. **Dodawaj węzły**, klikając je na lewym pasku bocznym lub przeciągając bezpośrednio na kanwę. Użyj paska wyszukiwania u góry przybornika, aby filtrować według nazwy. +2. **Łącz węzły**, przeciągając z gniazda wyjściowego (dół węzła) do gniazda wejściowego (góra innego węzła). Połączenia biegną od góry do dołu. +3. **Konfiguruj ustawienia**, klikając węzeł, aby otworzyć jego panel ustawień po prawej. Każdy typ węzła ma własne opcje (zakresy stron, suwaki jakości, hasła itd.). +4. **Uruchom przepływ**, klikając przycisk **Uruchom** na pasku narzędzi. Silnik wykonuje węzły w porządku topologicznym, przetwarzając każdy po kolei. Pasek stanu na dole śledzi postęp. +5. **Pobierz wyniki**: końcowy węzeł Pobierz zapisuje końcowy PDF (lub ZIP, jeśli powstaje wiele plików). + +## Kategorie węzłów + +Węzły są podzielone na sześć kategorii, każda oznaczona kolorem na kanwie: + +- **Wejście** (niebieski): Wejście PDF, Wejście obrazów, Word/Excel/PowerPoint na PDF oraz ponad 15 innych konwerterów formatów, które dostarczają pliki do potoku. +- **Edycja i adnotacje** (indygo): Przytnij, Greyscale, Odwróć kolory, Znak wodny, Numery stron, Nagłówek i Stopka, Efekt skanera, Dostosuj kolory, Kolor tła, Usuń puste strony, Usuń adnotacje. +- **Organizacja i zarządzanie** (fiolet): Połącz, Podziel, Wyodrębnij strony, Obróć, Usuń strony, Odwróć, Dodaj pustą stronę, Podziel strony, N-Up, Napraw rozmiar strony, Połącz w jedną stronę, Broszura, Plakatowanie, Edytuj metadane, Spis treści, OCR. +- **Optymalizacja i naprawa** (bursztyn): Kompresuj, Rasteryzuj, Linearyzuj, Wyprostuj, PDF na PDF/A, Czcionka na krzywe, Napraw. +- **Zabezpieczanie PDF** (róż): Szyfruj, Odszyfruj, Sanityzuj, Spłaszcz, Podpis cyfrowy, Redaguj. +- **Wyjście** (morski): Pobierz (automatycznie wykrywa pojedynczy PDF lub ZIP), PDF na obrazy, PDF na tekst, PDF na DOCX, PDF na XLSX, PDF na CSV, PDF na SVG, PDF na Markdown, Wyodrębnij obrazy. + +## Zapisywanie i wczytywanie przepływów + +Pasek narzędzi udostępnia cztery opcje trwałego zapisu: + +- **Zapisz**: zapisuje bieżący przepływ jako nazwany szablon w pamięci lokalnej przeglądarki. Możesz zapisać wiele szablonów. +- **Wczytaj**: otwiera okno z listą wszystkich zapisanych szablonów. Kliknij Wczytaj, aby przywrócić szablon, lub usuń te, których już nie potrzebujesz. +- **Eksportuj**: pobiera przepływ jako plik `.json`, aby można go było udostępnić lub zachować jako kopię zapasową. +- **Importuj**: wczytuje z dysku plik przepływu `.json`, przywracając wszystkie węzły, pozycje i połączenia. + +Szablony są zachowywane między sesjami w pamięci lokalnej. Wyeksportowane pliki JSON są przenośne między przeglądarkami i urządzeniami. + +## Model wykonania + +Silnik buduje graf zależności z Twoich połączeń i wykonuje węzły w porządku topologicznym. Jeśli którykolwiek węzeł zawiedzie, wykonanie zostaje wstrzymane, a niepowodzenie oznaczone na czerwono. Kilka zasad, o których warto pamiętać: + +- Każdy przepływ potrzebuje co najmniej jednego węzła **Wejście** i jednego węzła **Wyjście**. +- Silnik wykrywa zależności cykliczne i blokuje wykonanie z błędem. +- Węzeł **Szyfruj** musi być ostatnim krokiem przetwarzania przed węzłem wyjściowym. Umieszczenie go wcześniej wywoła ostrzeżenie walidacji, ponieważ kolejne węzły nie mogą operować na zaszyfrowanych danych. +- Pliki PDF chronione hasłem proszą o hasło podczas wykonania. +- Obsługiwane są wejścia z wieloma plikami PDF: węzeł Połącz może je scalić, a węzły przetwarzania zbiorczego przetworzą każdy PDF osobno. + +## Typy gniazd + +Połączenia używają typowanych gniazd, aby zapobiegać nieprawidłowemu łączeniu: + +- **PDF** (indygo): pojedynczy dokument PDF. +- **MultiPDF** (bursztyn): wiele dokumentów PDF zebranych razem. +- **Image** (zielony): obraz binarny. + +## Opcje + +Każdy węzeł ma własną konfigurację dostępną w prawym panelu ustawień. Typowe wzorce to: + +- **Zakresy stron** w węzłach Podziel, Wyodrębnij strony, Usuń strony +- **Suwaki jakości** w węzłach wyjściowych konwersji obrazów +- **Pola haseł** w węzłach Szyfruj i Odszyfruj +- **Pola tekstowe** dla Znaku wodnego, Nagłówka i Stopki, Edycji metadanych +- **Kąty obrotu** w węźle Obróć +- **Poziom kompresji** w węźle Kompresuj +- **Wybór języka OCR** w węźle OCR + +## Przypadki użycia + +- **Potok przetwarzania faktur**: Wejście PDF -> OCR -> Wyodrębnij tabele -> Pobierz jako CSV. +- **Standaryzacja raportów**: Word na PDF -> Napraw rozmiar strony -> Dodaj numery stron -> Znak wodny -> Kompresuj -> Pobierz. +- **Przygotowanie do archiwizacji**: Wejście PDF -> Napraw -> Spłaszcz -> Sanityzuj -> PDF na PDF/A -> Pobierz. +- **Zbiorcze wyodrębnianie obrazów**: Wejście PDF (wiele plików) -> Wyodrębnij obrazy -> Pobierz ZIP. +- **Broszury gotowe do druku**: Wejście PDF -> Broszura -> Przytnij -> Kompresuj -> Pobierz. +- **Bezpieczna dystrybucja**: Wejście PDF -> Redaguj -> Usuń adnotacje -> Szyfruj -> Pobierz. + +## Wskazówki + +- Użyj klawisza **Delete** lub **Backspace**, aby usunąć zaznaczony węzeł z kanwy. +- Kliknij przycisk **X** na pasku stanu węzła, aby usunąć go bezpośrednio. +- Przesuwaj kanwę, klikając i przeciągając puste miejsce. Podczas przesuwania kursor zmienia się w ikonę chwytania. +- Na urządzeniach mobilnych użyj przycisku **+** na pasku narzędzi, aby przełączyć przybornik węzłów. +- Jeśli przepływ tworzy wiele plików wyjściowych, węzeł Pobierz automatycznie pakuje je do ZIP. +- Zacznij prosto: zbuduj i przetestuj potok z dwóch węzłów, zanim dodasz złożoność. + +## Powiązane narzędzia + +- [PDF na Tekst](./pdf-to-text) +- [PDF na Excel](./pdf-to-excel) +- [Wyodrębnij obrazy](./extract-images) +- [PDF na Markdown](./pdf-to-markdown) diff --git a/docs/pl/tools/png-to-pdf.md b/docs/pl/tools/png-to-pdf.md new file mode 100644 index 00000000..6b70c5f6 --- /dev/null +++ b/docs/pl/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG na PDF +description: Konwertuj jeden lub więcej obrazów PNG na dokument PDF z regulowaną jakością, w całości w przeglądarce. +--- + +# PNG na PDF + +Konwertuj obrazy PNG na PDF z zachowaniem pełnej rozdzielczości. Każdy plik PNG staje się osobną stroną, dopasowaną do wymiarów oryginalnego obrazu. Przezroczystość jest obsługiwana automatycznie. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :----------- | +| PNG | `.png` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki PNG. Możesz wybrać kilka naraz. +2. Zarządzaj listą plików: usuń niepotrzebne lub dodaj kolejne. +3. Wybierz poziom **Jakości PDF** z listy rozwijanej. +4. Kliknij **Konwertuj na PDF**. Wynik pobiera się jako `from_jpgs.pdf`. + +Narzędzie używa pdf-lib do bezpośredniego osadzania każdego obrazu. Jeśli PNG nie może zostać osadzony natywnie (np. z powodu nietypowego profilu kolorów), narzędzie wraca do ponownego renderowania przez canvas jako JPEG. + +## Opcje + +**Jakość PDF** steruje kompresją stosowaną przed osadzeniem: + +- **Wysoka jakość**: minimalna kompresja, największy rozmiar pliku. +- **Średnia jakość** (domyślnie): dobry kompromis między rozmiarem a wyrazistością. +- **Niska jakość**: maksymalna kompresja, najmniejszy wynik. + +## Przypadki użycia + +- Konwertowanie zrzutów ekranu na wielostronicowy PDF do zgłoszeń błędów lub dokumentacji +- Pakowanie eksportów projektów interfejsu w jeden plik do recenzji +- Zamienianie eksportów diagramów (draw.io, Excalidraw) w PDF do udostępniania +- Składanie zestawu obrazów wykresów w raport + +## Wskazówki + +- Pliki PNG z przezroczystością dostają w PDF białe tło. Jeśli potrzebujesz innego tła, edytuj obrazy wcześniej. +- Dla zrzutów ekranu i diagramów z ostrymi krawędziami i tekstem wysoka jakość pozwala uniknąć artefaktów kompresji JPEG. Średnia lub niska może wewnętrznie konwertować do JPEG. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [JPG na PDF](./jpg-to-pdf) +- [SVG na PDF](./svg-to-pdf) diff --git a/docs/pl/tools/posterize-pdf.md b/docs/pl/tools/posterize-pdf.md new file mode 100644 index 00000000..e29da746 --- /dev/null +++ b/docs/pl/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Plakatowanie PDF +description: Podziel strony PDF na siatkę mniejszych stron, aby wydrukować duży format na wielu arkuszach. +--- + +# Plakatowanie PDF + +Podziel każdą stronę PDF na siatkę mniejszych podstron. To narzędzie do drukowania jednej strony na wielu arkuszach papieru, które następnie składasz razem w duży plakat lub baner. + +## Jak to działa + +1. Wgraj plik PDF. +2. Ustaw liczbę **wierszy** i **kolumn**, aby określić siatkę (np. 2 wiersze x 2 kolumny dzielą każdą stronę na 4 podstrony). +3. Opcjonalnie podaj zakres stron, aby ograniczyć plakatowanie do wybranych stron. +4. Podgląd pokazuje nakładkę siatki na bieżącej stronie, dzięki czemu widzisz, gdzie nastąpią cięcia. +5. Przechodź między stronami, aby sprawdzić nakładkę na innych stronach. +6. Kliknij przycisk przetwarzania. Każda komórka siatki staje się osobną stroną w wynikowym PDF. + +## Funkcje + +- Konfigurowalna liczba wierszy i kolumn dla elastycznych rozmiarów siatki +- Podgląd na żywo z nakładką siatki pokazującą dokładnie, gdzie strony zostaną podzielone +- Filtr zakresu stron do plakatowania tylko wybranych stron +- Nawigacja strona po stronie w podglądzie +- Buforowane migawki stron dla szybkiej nawigacji w podglądzie +- Czerwone przerywane linie siatki wyraźnie oznaczają granice cięć + +## Opcje + +| Opcja | Opis | +| ---------------- | ----------------------------------------------------------- | +| **Wiersze** | Liczba podziałów poziomych (domyślnie: 1) | +| **Kolumny** | Liczba podziałów pionowych (domyślnie: 1) | +| **Zakres stron** | Które strony poddać plakatowaniu (puste = wszystkie strony) | + +## Zastosowania + +- Drukowanie PDF o rozmiarze plakatu na standardowych arkuszach A4 lub Letter, które złożysz na ścianie +- Tworzenie dużych banerów z jednostronicowego projektu PDF +- Dzielenie wielkoformatowych rysunków technicznych na drukowalne kafelki +- Drukowanie wielkoformatowe bez dostępu do drukarki szerokoformatowej + +## Wskazówki + +- Siatka 2x2 zamienia jedną stronę w 4 strony. Siatka 3x3 zamienia jedną stronę w 9. Zaplanuj siatkę zależnie od tego, jak duży ma być końcowy złożony wydruk. +- Nakładka w podglądzie pomaga sprawdzić, czy ważna treść nie wypada na linii cięcia. W razie potrzeby zmień wiersze/kolumny. +- Do operacji odwrotnej (umieszczenia wielu stron na jednym arkuszu) użyj narzędzia [PDF N-Up](./n-up-pdf). + +## Powiązane narzędzia + +- [PDF N-Up](./n-up-pdf) +- [Podziel strony](./divide-pages) +- [Podziel PDF](./split-pdf) diff --git a/docs/pl/tools/powerpoint-to-pdf.md b/docs/pl/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..0bd018c6 --- /dev/null +++ b/docs/pl/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint na PDF +description: Konwertuj prezentacje PowerPoint (PPT, PPTX) i pliki ODP na PDF z zachowaniem formatowania slajdów. +--- + +# PowerPoint na PDF + +Konwertuj pliki prezentacji na PDF. Każdy slajd staje się stroną w dokumencie wynikowym, a tekst, obrazy, kształty i przejścia są renderowane przez działający w przeglądarce silnik LibreOffice. Obsługiwane są zarówno nowe, jak i starsze formaty PowerPoint oraz format OpenDocument Presentation. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :------------------------ | :----------- | +| PowerPoint (nowy) | `.pptx` | +| PowerPoint (starszy) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść pliki prezentacji. +2. Przejrzyj listę plików. Dodaj kolejne lub usuń zbędne. +3. Kliknij **Konwertuj na PDF**. Silnik LibreOffice ładuje się przy pierwszym użyciu, a następnie konwertuje każdy plik. +4. Pojedynczy plik pobiera się bezpośrednio jako PDF. Wiele plików jest pakowanych do `powerpoint-converted.zip`. + +## Opcje + +To narzędzie nie ma dodatkowych ustawień. Slajdy są renderowane w swoich natywnych wymiarach. + +## Wynik + +| Liczba plików | Wynik | +| :------------ | :------------------------------------------------------------------------ | +| 1 plik | Pobranie pojedynczego PDF (oryginalna nazwa pliku z rozszerzeniem `.pdf`) | +| 2+ pliki | Archiwum ZIP (`powerpoint-converted.zip`) zawierające jeden PDF na plik | + +## Zastosowania + +- Konwersja prezentacji na PDF przed udostępnieniem odbiorcom, którzy mogą nie mieć PowerPointa +- Tworzenie drukowalnej wersji slajdów jako materiału na konferencję lub warsztaty +- Archiwizowanie prezentacji w formacie wyglądającym identycznie na każdym urządzeniu +- Wsadowa konwersja biblioteki prezentacji ODP z LibreOffice Impress na PDF +- Przygotowanie wersji PDF prezentacji dla inwestorów jako załącznika do e-maila + +## Wskazówki + +- Animacje i przejścia slajdów nie są odwzorowywane w PDF. Każdy slajd jest zapisywany jako statyczna strona. +- Osadzone filmy nie pojawią się w wyniku. W razie potrzeby zastąp je zrzutem ekranu lub obrazem zastępczym. +- Notatki prelegenta nie są uwzględniane w domyślnym eksporcie PDF. Jeśli potrzebujesz notatek, najpierw wyeksportuj plik z natywnego widoku "Drukuj notatki" w PowerPoincie. +- Silnik LibreOffice jest buforowany po pierwszym załadowaniu, więc konwersja drugiej prezentacji w tej samej sesji jest znacznie szybsza. + +## Powiązane narzędzia + +- [Word na PDF](./word-to-pdf) +- [Excel na PDF](./excel-to-pdf) +- [Obrazy do PDF](./image-to-pdf) diff --git a/docs/pl/tools/prepare-pdf-for-ai.md b/docs/pl/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..f920490c --- /dev/null +++ b/docs/pl/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Przygotuj PDF dla AI +description: Wyodrębnij zawartość PDF do ustrukturyzowanego JSON zoptymalizowanego dla LLM i potoków AI, takich jak LlamaIndex. Obsługuje przetwarzanie wsadowe. +--- + +# Przygotuj PDF dla AI + +Wyodrębnia zawartość plików PDF i strukturyzuje ją jako JSON zoptymalizowany pod kątem wczytywania przez duże modele językowe (LLM) i frameworki AI, takie jak LlamaIndex. Zawartość każdej strony jest wyodrębniana i porządkowana w ustrukturyzowanym formacie gotowym dla potoków RAG, chatbotów lub systemów wyszukiwania semantycznego. + +## Jak to działa + +1. Wgraj jeden lub więcej plików PDF, klikając strefę upuszczania lub przeciągając na nią pliki. +2. Kliknij **Wyodrębnij**, aby rozpocząć przetwarzanie. +3. Pojedynczy plik pobiera się jako `filename_llm.json`. Wiele plików daje archiwum `pdf-for-ai.zip`. + +Narzędzie korzysta z integracji PyMuPDF z LlamaIndex, aby wyodrębnić zawartość na poziomie stron wraz z metadanymi, tworząc wynik, który można bezpośrednio wczytać do frameworków AI. + +## Opcje + +To narzędzie nie ma konfigurowalnych opcji. Wszystkie strony są wyodrębniane z pełnym tekstem i metadanymi. + +## Format wyniku + +- **Pojedynczy plik**: `filename_llm.json` +- **Wiele plików**: `pdf-for-ai.zip` zawierający jeden `_llm.json` na każdy wejściowy PDF. + +Wynik JSON jest zgodny ze schematem dokumentu LlamaIndex, z tekstem poszczególnych stron i polami metadanych. + +## Zastosowania + +- Przygotowywanie dokumentów PDF dla potoków generowania wspomaganego wyszukiwaniem (RAG). +- Budowanie przeszukiwalnej bazy wiedzy z archiwów PDF dla chatbota AI. +- Przekazywanie raportów PDF do przepływów analizy opartych na LLM. +- Wstępne przetwarzanie prac naukowych dla systemów wyszukiwania semantycznego i odpowiadania na pytania. +- Tworzenie ustrukturyzowanych danych treningowych z kolekcji dokumentów PDF. + +## Wskazówki + +- Do zwykłego wyodrębniania tekstu bez formatowania pod AI użyj [PDF na Tekst](./pdf-to-text). +- Do wyniku w Markdown zachowującego nagłówki i strukturę użyj [PDF na Markdown](./pdf-to-markdown). +- Zeskanowane pliki PDF dadzą pusty lub minimalny wynik. Najpierw uruchom na nich OCR, aby dodać warstwę tekstową przed wyodrębnieniem. + +## Powiązane narzędzia + +- [PDF na Tekst](./pdf-to-text) +- [PDF na Markdown](./pdf-to-markdown) +- [PDF na JSON](./pdf-to-json) diff --git a/docs/pl/tools/protect-pdf.md b/docs/pl/tools/protect-pdf.md new file mode 100644 index 00000000..af62c8dc --- /dev/null +++ b/docs/pl/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Zabezpiecz PDF +description: Zabezpiecz pliki PDF hasłem za pomocą 256-bitowego szyfrowania AES. Ustaw hasła użytkownika i właściciela z konfigurowalnymi ograniczeniami użycia. +--- + +# Zabezpiecz PDF + +Zablokuj PDF hasłem, aby otworzyć go mogły tylko upoważnione osoby. BentoPDF używa 256-bitowego szyfrowania AES, tego samego standardu, którego używają banki i agencje rządowe, stosowanego w całości w przeglądarce przez QPDF. + +## Jak to działa + +1. Wgraj plik PDF. +2. Wpisz **hasło użytkownika** (wymagane). To hasło, którego potrzebują osoby otwierające plik. +3. Opcjonalnie wpisz **hasło właściciela**. Po jego ustawieniu PDF zyskuje ograniczenia użycia, które blokują drukowanie, edycję, kopiowanie i adnotacje. +4. Kliknij **Szyfruj PDF**. +5. Pobierz zaszyfrowany plik. + +## Rodzaje haseł + +### Hasło użytkownika (wymagane) + +Hasło użytkownika to to, co odbiorcy wpisują, aby otworzyć PDF. Bez niego dokument jest całkowicie niedostępny. Każdy zaszyfrowany PDF musi je mieć. + +### Hasło właściciela (opcjonalne) + +Hasło właściciela kontroluje, co upoważniony użytkownik może zrobić po otwarciu pliku. Gdy ustawisz odrębne hasło właściciela, BentoPDF automatycznie stosuje najsurowszy zestaw ograniczeń: + +- Modyfikacja wyłączona +- Wyodrębnianie/kopiowanie wyłączone +- Drukowanie wyłączone +- Adnotacje wyłączone +- Wypełnianie formularzy wyłączone +- Składanie dokumentu wyłączone + +Jeśli pozostawisz hasło właściciela puste, PDF jest zaszyfrowany (nadal wymaga hasła użytkownika do otwarcia), ale po otwarciu nie ma ograniczeń użycia. + +## Szczegóły szyfrowania + +- **Algorytm**: AES-256 (256-bitowy Advanced Encryption Standard) +- **Długość klucza**: 256 bitów +- **Standard**: szyfrowanie PDF 2.0 (implementacja QPDF) + +Złamanie AES-256 metodą siłową jest przy obecnej technologii obliczeniowo niewykonalne. Bezpieczeństwo zaszyfrowanego PDF zależy wyłącznie od siły hasła. + +## Zastosowania + +- Ochrona poufnych raportów finansowych przed wysłaniem e-mailem +- Zabezpieczanie dokumentów prawnych udostępnianych drugiej stronie sporu +- Dodawanie hasła do dokumentacji medycznej lub danych osobowych +- Dystrybucja płatnych treści (e-booków, raportów) z kontrolą dostępu +- Zgodność z politykami ochrony danych wymagającymi szyfrowania danych w spoczynku + +## Wskazówki + +- Użyj silnego, unikalnego hasła. Idealna jest fraza hasła z co najmniej 12 znaków, z wielkimi i małymi literami, cyframi i symbolami. +- Przekaż hasło innym kanałem (telefon, SMS), nigdy w tym samym e-mailu co PDF. +- Jeśli chcesz tylko ograniczyć działania (bez drukowania, bez kopiowania) bez wymagania hasła do otwarcia, użyj zamiast tego narzędzia Zmień uprawnienia. + +## Powiązane narzędzia + +- [Odszyfruj PDF](./unlock-pdf): usuń szyfrowanie, gdy znasz hasło +- [Zmień uprawnienia](./change-permissions): zmień wybrane ograniczenia użycia +- [Usuń restrykcje](./remove-restrictions): usuń wszystkie zabezpieczenia z PDF +- [Sanityzuj PDF](./sanitize-pdf): usuń ukrytą zawartość przed szyfrowaniem diff --git a/docs/pl/tools/psd-to-pdf.md b/docs/pl/tools/psd-to-pdf.md new file mode 100644 index 00000000..18d92e5d --- /dev/null +++ b/docs/pl/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD na PDF +description: Konwertuj pliki Photoshop (PSD) na PDF w przeglądarce. Za darmo, prywatnie, bez oprogramowania Adobe. +--- + +# PSD na PDF + +Konwertuj pliki Adobe Photoshop PSD na dokumenty PDF. PSD to natywny format Photoshopa, a jego otwarcie zwykle wymaga drogiego oprogramowania Adobe. To narzędzie renderuje spłaszczony obraz złożony z pliku PSD jako stronę PDF w pełnej rozdzielczości. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :-------------- | :----------- | :---------------------------------- | +| Adobe Photoshop | `.psd` | Renderuje spłaszczony obraz złożony | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść pliki PSD. Obsługiwanych jest wiele plików. +2. Przejrzyj listę plików. Usuń niechciane pliki ikoną kosza lub użyj **Dodaj więcej plików**, aby dodać kolejne. +3. Kliknij **Konwertuj na PDF**. Silnik PyMuPDF odczytuje plik PSD i osadza obraz złożony na stronie PDF w oryginalnej rozdzielczości. +4. Pojedynczy PSD daje jeden PDF. Gdy wgrasz wiele plików PSD, zostaną połączone w jeden wielostronicowy PDF o nazwie `psd_to_pdf.pdf`, w którym każdy PSD stanowi jedną stronę. + +## Opcje + +Nie są potrzebne żadne ustawienia. Konwerter używa spłaszczonych danych obrazu z pliku PSD. + +## Zastosowania + +- Podgląd projektów Photoshopa bez otwierania Photoshopa +- Wysyłanie wersji roboczych projektów klientom, którzy nie mają Adobe Creative Suite +- Drukowanie grafik w wysokiej rozdzielczości z plików PSD +- Tworzenie portfolio PDF z wielu plików projektów PSD, gdzie każdy staje się stroną jednego dokumentu + +## Wskazówki + +- Konwersja renderuje złożony (spłaszczony) widok PSD. Poszczególne warstwy, warstwy dopasowania i efekty warstw nie są zachowywane jako osobne elementy w PDF. +- Wiele plików PSD jest łączonych w jeden wielostronicowy PDF zamiast osobnych plików PDF. Przydaje się to do budowania portfolio lub lookbooków. +- Pliki PSD o bardzo wysokiej rozdzielczości (pliki do druku 300+ DPI) dadzą duże pliki PDF. Narzędzie zachowuje pełną rozdzielczość. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [PNG na PDF](./png-to-pdf) +- [VSD na PDF](./vsd-to-pdf) diff --git a/docs/pl/tools/pub-to-pdf.md b/docs/pl/tools/pub-to-pdf.md new file mode 100644 index 00000000..776a8307 --- /dev/null +++ b/docs/pl/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB na PDF +description: Konwertuj pliki Microsoft Publisher (PUB) na PDF w przeglądarce. Za darmo, prywatnie, bez instalowania oprogramowania. +--- + +# PUB na PDF + +Konwertuj pliki Microsoft Publisher na PDF. Publisher to program do składu dołączany do niektórych wydań Microsoft Office, ale większość osób go nie ma. To narzędzie pozwala każdemu konwertować pliki PUB na PDF bezpośrednio w przeglądarce, bez oprogramowania Microsoftu. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :------------------ | :----------- | :---------------------- | +| Microsoft Publisher | `.pub` | Dokumenty do składu DTP | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść pliki PUB. Można wgrać wiele plików naraz. +2. Przejrzyj listę plików. Usuń niechciane pliki ikoną kosza lub kliknij **Dodaj więcej plików**, aby dodać kolejne. +3. Kliknij **Konwertuj na PDF**. Silnik oparty na LibreOffice ładuje się w przeglądarce i konwertuje każdy plik PUB, zachowując układ, obrazy i pola tekstowe. +4. Pojedynczy plik pobiera się bezpośrednio jako PDF. Wiele plików jest dostarczanych w archiwum ZIP o nazwie `pub-to-pdf.zip`. + +## Opcje + +Nie jest potrzebna dodatkowa konfiguracja. Konwerter automatycznie obsługuje układ PUB. + +## Zastosowania + +- Otwieranie ulotki lub biuletynu PUB od klienta bez kupowania Microsoft Publisher +- Konwersja biuletynów parafialnych, programów wydarzeń lub szkolnych gazetek utworzonych w Publisherze +- Archiwizowanie materiałów marketingowych z Publishera w powszechnie dostępnym formacie +- Drukowanie plików PUB w systemie bez zainstalowanego Publishera + +## Wskazówki + +- Złożone układy Publishera z nakładającymi się polami tekstowymi i precyzyjnym pozycjonowaniem mogą nieco się przesunąć podczas konwersji. Sprawdź wynik, jeśli dokładne położenie jest krytyczne. +- Silnik LibreOffice inicjalizuje się raz na sesję. Pierwsza konwersja trwa dłużej, kolejne są szybsze. +- Aby konwersja plików Publishera była jak najwierniejsza, upewnij się, że niestandardowe czcionki użyte w oryginale są standardowymi czcionkami systemowymi. + +## Powiązane narzędzia + +- [VSD na PDF](./vsd-to-pdf) +- [ODP na PDF](./odp-to-pdf) diff --git a/docs/pl/tools/rasterize-pdf.md b/docs/pl/tools/rasterize-pdf.md new file mode 100644 index 00000000..e715959e --- /dev/null +++ b/docs/pl/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasteryzuj PDF +description: Konwertuj strony PDF na PDF oparty na obrazach. Spłaszcz wszystkie warstwy, usuń zaznaczalny tekst i kontroluj DPI oraz format obrazu. +--- + +# Rasteryzuj PDF + +Rasteryzacja zamienia każdą stronę PDF w obraz i składa te obrazy z powrotem w PDF. Wynik wygląda identycznie jak oryginał, ale nie zawiera zaznaczalnego tekstu, elementów interaktywnych ani edytowalnych warstw. To w praktyce wysokiej jakości fotokopia. + +## Jak to działa + +1. Wgraj jeden lub więcej plików PDF. +2. Ustaw **DPI** (rozdzielczość) wyniku rasteryzacji. +3. Wybierz **format obrazu**: PNG dla jakości bezstratnej lub JPEG dla mniejszych plików. +4. Opcjonalnie zaznacz **Konwertuj na odcienie szarości**. +5. Kliknij **Rasteryzuj PDF**. Wiele plików pobiera się jako ZIP. + +## Opcje + +| Ustawienie | Wartości | Domyślnie | +| --------------------- | --------------------------------- | --------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Format obrazu** | PNG (bezstratny), JPEG (mniejszy) | PNG | +| **Odcienie szarości** | Wł./Wył. | Wył. | + +## Wskazówki dotyczące DPI + +- **72**: tylko do oglądania na ekranie, najmniejszy rozmiar pliku +- **150**: dobry kompromis do ogólnego użytku +- **200**: wyraźniejszy tekst, umiarkowany rozmiar pliku +- **300**: jakość do druku +- **600**: wysokiej jakości archiwizacja lub druk profesjonalny + +## Zastosowania + +- Uniemożliwienie wyodrębnienia tekstu z poufnych dokumentów przed udostępnieniem +- Eliminowanie problemów z zależnością od czcionek przez zamianę tekstu na piksele +- Tworzenie "płaskiej" wersji PDF ze złożonymi warstwami lub przezroczystością, które wyglądają inaczej w różnych przeglądarkach +- Przygotowanie PDF dla systemu, który przyjmuje tylko dane wejściowe w postaci obrazów +- Usuwanie ukrytej zawartości (jak śledzone zmiany lub dane formularzy) przez sprowadzenie PDF do samych obrazów + +## Wskazówki + +- 150 DPI w PNG to solidne ustawienie domyślne. Wybieraj więcej tylko do druku lub gdy musisz powiększać drobne szczegóły. +- JPEG daje wyraźnie mniejsze pliki, ale wprowadza artefakty kompresji na ostrych krawędziach tekstu. +- Rasteryzacja jest nieodwracalna, więc zachowaj oryginalny PDF, jeśli możesz później potrzebować edytowalnego tekstu. + +## Powiązane narzędzia + +- [Kompresuj PDF](./compress-pdf): zmniejsz rozmiar zrasteryzowanego PDF +- [Wyprostuj PDF](./deskew-pdf): wyprostuj strony przed rasteryzacją zeskanowanych dokumentów +- [Czcionka na krzywe](./font-to-outline): zamień czcionki na ścieżki wektorowe, jeśli chcesz zachować skalowalność +- [Spłaszcz PDF](./flatten-pdf): spłaszcz formularze bez konwersji na obrazy diff --git a/docs/pl/tools/remove-annotations.md b/docs/pl/tools/remove-annotations.md new file mode 100644 index 00000000..54dad9e6 --- /dev/null +++ b/docs/pl/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Usuń adnotacje +description: Usuń z PDF wszystkie komentarze, wyróżnienia, łącza i inne adnotacje jednym kliknięciem. +--- + +# Usuń adnotacje + +Oczyść PDF, usuwając wszystkie adnotacje: komentarze, wyróżnienia, karteczki, znaczniki tekstu, łącza, pieczęcie i wszelkie inne obiekty adnotacji osadzone w dokumencie. Treść stron (tekst, obrazy, grafika) pozostaje nietknięta. + +## Jak to działa + +1. Wgraj plik PDF. +2. Narzędzie wykrywa liczbę stron dokumentu i wyświetla informacje o pliku. +3. Kliknij **Usuń adnotacje**, aby przetworzyć. +4. Oczyszczony PDF pobiera się automatycznie, bez żadnych adnotacji. + +## Funkcje + +- Usuwa wszystkie typy adnotacji: komentarze, wyróżnienia, podkreślenia, przekreślenia, karteczki, pieczęcie, łącza i znaczniki formularzy +- Działa na każdej stronie dokumentu +- Zachowuje całą zawartość inną niż adnotacje (tekst, obrazy, grafikę wektorową, pola formularzy) +- Wyświetla liczbę stron i rozmiar pliku przed przetwarzaniem + +## Zastosowania + +- Porządkowanie dokumentu przed ostateczną dystrybucją po cyklu recenzji, w którym wiele osób dodało komentarze +- Usuwanie wyróżnień i karteczek z udostępnionego materiału do nauki +- Usuwanie adnotacji łączy z dokumentu przed archiwizacją +- Przygotowanie "czystej" wersji dokumentu prawnego, który był mocno adnotowany podczas negocjacji +- Usuwanie komentarzy recenzentów z manuskryptu przed wysłaniem do druku + +## Wskazówki + +- To narzędzie usuwa adnotacje na poziomie struktury PDF, więc wynik zachowuje zaznaczalny tekst i oryginalną jakość, bez rasteryzacji. +- Jeśli chcesz usunąć tylko wybrane adnotacje zamiast wszystkich, użyj [Edytora PDF](./edit-pdf), aby selektywnie usuwać pojedyncze adnotacje. +- Adnotacji w spłaszczonych plikach PDF (gdzie adnotacje zostały scalone z treścią strony) nie można usunąć, ponieważ nie są już osobnymi obiektami. + +## Powiązane narzędzia + +- [Edytor PDF](./edit-pdf) +- [Dodaj znak wodny](./add-watermark) +- [Podpisz PDF](./sign-pdf) diff --git a/docs/pl/tools/remove-blank-pages.md b/docs/pl/tools/remove-blank-pages.md new file mode 100644 index 00000000..f6fb8ba7 --- /dev/null +++ b/docs/pl/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Usuń puste strony +description: Automatycznie wykrywaj i usuwaj puste lub prawie puste strony z PDF z regulowaną czułością. +--- + +# Usuń puste strony + +Przeskanuj PDF w poszukiwaniu pustych lub prawie pustych stron i usuń je automatycznie. Narzędzie renderuje każdą stronę i analizuje zawartość pikseli, aby ustalić, czy jest pusta, a następnie pozwala potwierdzić, które strony usunąć, przed przetwarzaniem. + +## Jak to działa + +1. Wgraj plik PDF. +2. Dostosuj suwak **Czułość**, aby określić, jak ściśle definiowana jest "pustość". +3. Kliknij **Wykryj puste strony**, aby przeskanować dokument. +4. Narzędzie pokazuje miniatury wykrytych pustych stron do przejrzenia. +5. Potwierdź wybór i pobierz oczyszczony PDF bez pustych stron. + +## Opcje + +- **Czułość**: suwak od 0% do 100% (domyślnie 80%). Wyższe wartości są bardziej rygorystyczne i oznaczają tylko strony całkowicie lub prawie białe. Niższe wartości są bardziej tolerancyjne i wychwytują strony z minimalną zawartością, jak pojedyncza kropka lub blady znak wodny. + +## Funkcje + +- Analiza każdej strony na poziomie pikseli w celu wykrycia pustej zawartości +- Regulowany suwak czułości do precyzyjnego dostrojenia wykrywania +- Podgląd miniatur wykrytych pustych stron do ręcznej weryfikacji +- Zachowuje wszystkie niepuste strony dokładnie w niezmienionej postaci +- Obsługuje dokumenty o dowolnym rozmiarze i liczbie stron +- Informacja o postępie podczas skanowania + +## Zastosowania + +- Porządkowanie zeskanowanych dokumentów, w których skaner uchwycił puste odwrotki jednostronnych oryginałów +- Usuwanie stron rozdzielających z masowo skanowanych partii dokumentów +- Usuwanie pustych stron wstawianych przez systemy zarządzania dokumentami +- Porządkowanie PDF eksportowanych z edytorów tekstu, które czasem dodają puste strony na końcu +- Zmniejszanie rozmiaru pliku przez usunięcie niepotrzebnych pustych stron + +## Wskazówki + +- Zacznij od domyślnej czułości 80% i dostosowuj ją stąd. Jeśli narzędzie pomija strony, które wyglądają na puste, obniż czułość. Jeśli oznacza strony z lekką zawartością, którą chcesz zachować, podnieś ją. +- Narzędzie renderuje każdą stronę, aby przeanalizować jej zawartość, więc czas przetwarzania rośnie wraz z liczbą stron. Przy bardzo dużych dokumentach spodziewaj się krótkiego oczekiwania. +- Przejrzyj wykryte puste strony w podglądzie miniatur przed potwierdzeniem usunięcia. Strony z bladymi nagłówkami, stopkami lub znakami wodnymi mogą zostać oznaczone, zależnie od ustawień czułości. + +## Powiązane narzędzia + +- [Przytnij PDF](./crop-pdf) +- [Edytor PDF](./edit-pdf) +- [Numery stron](./page-numbers) diff --git a/docs/pl/tools/remove-metadata.md b/docs/pl/tools/remove-metadata.md new file mode 100644 index 00000000..7b56266d --- /dev/null +++ b/docs/pl/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Usuń metadane +description: Usuń wszystkie ukryte metadane z plików PDF, w tym autora, tytuł, datę utworzenia, producenta, dane XMP i identyfikatory dokumentu. +--- + +# Usuń metadane + +Każdy PDF zawiera metadane, które mogą ujawniać, kto go utworzył, jakiego oprogramowania użyto, kiedy ostatnio go zmodyfikowano i nie tylko. To narzędzie usuwa to wszystko: słownik informacji, strumienie metadanych XMP, identyfikatory dokumentu i dane specyficzne dla aplikacji, pozostawiając czysty dokument bez śladu pochodzenia. + +## Jak to działa + +1. Wgraj plik PDF. +2. Kliknij **Usuń metadane**. +3. Pobierz oczyszczony plik. + +Brak opcji do skonfigurowania. Narzędzie jest z założenia dokładne: czyści wszystko. + +## Co zostaje usunięte + +- **Pola słownika informacji**: tytuł, autor, temat, słowa kluczowe, twórca, producent, data utworzenia, data modyfikacji +- **Strumień metadanych XMP**: blok metadanych oparty na XML, przechowywany w katalogu dokumentu +- **Identyfikatory dokumentu**: unikalne identyfikatory w trailerze PDF, które mogą służyć do śledzenia dokumentu między systemami +- **PieceInfo**: metadane specyficzne dla aplikacji, dodawane przez programy takie jak Illustrator czy InDesign + +## Co zostaje + +- Cała widoczna zawartość stron (tekst, obrazy, grafika) +- Pola formularzy i adnotacje +- Zakładki i łącza +- Sama struktura dokumentu + +## Zastosowania + +- Usuwanie imienia i nazwy organizacji z dokumentu przed anonimową publikacją +- Usuwanie znaczników czasu utworzenia, które ujawniają, kiedy dokument przygotowano +- Czyszczenie ciągów producenta, które identyfikują stos oprogramowania PDF +- Przygotowanie dokumentów do zgłoszeń regulacyjnych wymagających PDF bez metadanych +- Usuwanie śladów historii edycji przed udostępnieniem dokumentu na zewnątrz + +## Wskazówki + +- Najpierw użyj narzędzia Wyświetl metadane, aby zobaczyć dokładnie, jakie metadane zawiera Twój PDF, zanim je usuniesz. +- Jeśli musisz usunąć metadane _oraz_ JavaScript, adnotacje i osadzone pliki, użyj Sanityzuj PDF dla dokładniejszego czyszczenia. +- Usunięcie metadanych jest trwałe. Zachowaj oryginał, jeśli możesz później potrzebować tych danych. + +## Powiązane narzędzia + +- [Sanityzuj PDF](./sanitize-pdf): usuń metadane oraz skrypty, załączniki i więcej +- [Szyfruj PDF](./protect-pdf): zabezpiecz oczyszczony PDF hasłem +- [Kompresuj PDF](./compress-pdf): usunięcie metadanych może nieznacznie zmniejszyć rozmiar pliku; skompresuj, aby zaoszczędzić więcej diff --git a/docs/pl/tools/remove-restrictions.md b/docs/pl/tools/remove-restrictions.md new file mode 100644 index 00000000..b1ebd570 --- /dev/null +++ b/docs/pl/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Usuń restrykcje +description: Usuń ochronę hasłem, ograniczenia drukowania, blokady edycji i limity kopiowania z plików PDF. +--- + +# Usuń restrykcje + +PDF może mieć dwa rodzaje haseł: hasło użytkownika (wymagane do otwarcia pliku) i hasło właściciela (określa, co można z nim robić). To narzędzie usuwa oba, wraz ze wszystkimi powiązanymi ograniczeniami: blokadami drukowania, edycji, kopiowania i adnotacji. + +## Jak to działa + +1. Wgraj plik PDF. +2. Jeśli PDF ma hasło właściciela, wpisz je w polu **Hasło właściciela**. Pozostaw puste, jeśli PDF ma tylko ograniczenia użycia bez hasła. +3. Kliknij **Usuń restrykcje**. +4. Pobierz PDF bez ograniczeń. + +Narzędzie używa flag QPDF `--decrypt` i `--remove-restrictions`, aby utworzyć czystą kopię bez ograniczeń. + +## Co zostaje usunięte + +- Ochrona hasłem (zarówno hasło użytkownika, jak i właściciela) +- Ograniczenia drukowania +- Ograniczenia edycji +- Ograniczenia kopiowania tekstu i obrazów +- Ograniczenia adnotacji i komentowania +- Wszystkie inne ograniczenia bezpieczeństwa zapisane w PDF + +## Zastosowania + +- Odblokowanie własnego PDF, którego hasło ustawiono lata temu +- Usuwanie ograniczeń drukowania z dokumentu, do którego masz legalny dostęp +- Włączenie kopiowania i wklejania w materiałach źródłowych do robienia notatek +- Przygotowanie plików PDF dla narzędzi dostępności, które nie radzą sobie z dokumentami z ograniczeniami + +## Wskazówki + +- Jeśli hasło właściciela jest ustawione, musisz je znać. To narzędzie nie łamie ani nie zgaduje haseł. +- Jeśli chcesz zachować szyfrowanie pliku, ale zmienić wybrane uprawnienia, użyj zamiast tego narzędzia Zmień uprawnienia. +- Plik wynikowy nie ma żadnego szyfrowania, więc każdy, kto go otrzyma, może go swobodnie otworzyć. + +## Powiązane narzędzia + +- [Odszyfruj PDF](./unlock-pdf): odblokuj PDF, gdy znasz hasło użytkownika +- [Szyfruj PDF](./protect-pdf): zastosuj ponownie szyfrowanie z nowymi ustawieniami +- [Zmień uprawnienia](./change-permissions): selektywnie zmień, które działania są dozwolone diff --git a/docs/pl/tools/repair-pdf.md b/docs/pl/tools/repair-pdf.md new file mode 100644 index 00000000..50cd1a31 --- /dev/null +++ b/docs/pl/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Napraw PDF +description: Odzyskaj dane z uszkodzonych plików PDF za pomocą silnika naprawy QPDF. Obsługuje przetwarzanie wsadowe. +--- + +# Napraw PDF + +Gdy PDF nie chce się otworzyć, wyświetla zniekształconą zawartość lub powoduje błędy w przeglądarce, to narzędzie próbuje odbudować jego wewnętrzną strukturę. Używa silnika naprawy QPDF, który potrafi odzyskać dane po wielu rodzajach uszkodzeń: zepsutych tablicach odwołań krzyżowych, ściętych strumieniach, nieprawidłowych odwołaniach do obiektów i innych. + +## Jak to działa + +1. Wgraj jeden lub więcej uszkodzonych plików PDF. +2. Kliknij **Napraw PDF**. +3. Pojedynczy naprawiony plik pobiera się bezpośrednio. Wiele plików daje archiwum ZIP. + +Narzędzie przepuszcza każdy plik przez QPDF z flagą `--decrypt`, która wymusza odczytanie i ponowne zapisanie całej struktury PDF, naprawiając po drodze możliwe do odzyskania problemy. + +## Funkcje + +- Wsadowa naprawa wielu plików PDF w jednej operacji +- Automatyczne rozpoznawanie plików możliwych i niemożliwych do odzyskania +- Raport sukcesu/porażki dla każdego pliku przy przetwarzaniu wielu plików +- Używa QPDF (WebAssembly), sprawdzonej biblioteki do przekształcania PDF + +## Co może naprawić + +- Zepsute lub brakujące tablice odwołań krzyżowych +- Ucięte końcówki plików po niekompletnych pobraniach +- Nieprawidłowe numerowanie obiektów i długości strumieni +- Drobne niespójności strukturalne z błędnych generatorów PDF +- Artefakty szyfrowania po nieudanych próbach odszyfrowania + +## Czego nie może naprawić + +- Mocno ściętych plików, w których brakuje większości danych +- Plików PDF zaszyfrowanych hasłem, którego nie masz +- Plików, które w rzeczywistości nie są PDF (złe rozszerzenie) +- Uszkodzeń obrazów w PDF (struktura zostanie naprawiona, ale dane pikseli nie są odtwarzane) + +## Zastosowania + +- Odzyskanie PDF po nieudanym pobraniu z e-maila +- Otwieranie plików utworzonych przez starsze lub niestandardowe generatory PDF +- Naprawa plików PDF, które działają w jednej przeglądarce, a w innej nie +- Przygotowanie uszkodzonych dokumentów archiwalnych do długoterminowego przechowywania + +## Wskazówki + +- Jeśli naprawa się nie powiedzie, spróbuj najpierw otworzyć plik w przeglądarce internetowej. Przeglądarki mają własną logikę odzyskiwania i mogą wyrenderować wystarczająco dużo zawartości, by zapisać plik ponownie. +- W przypadku zaszyfrowanych plików PDF, których naprawa się nie udaje, najpierw użyj Odszyfruj PDF, a potem napraw odszyfrowany wynik. + +## Powiązane narzędzia + +- [Kompresuj PDF](./compress-pdf): dodatkowo uporządkuj strukturę naprawionego PDF +- [Linearyzuj PDF](./linearize-pdf): zoptymalizuj naprawiony plik do dostarczania przez sieć +- [Spłaszcz PDF](./flatten-pdf): spłaszcz formularze, które mogły zostać uszkodzone diff --git a/docs/pl/tools/reverse-pages.md b/docs/pl/tools/reverse-pages.md new file mode 100644 index 00000000..2aa644a3 --- /dev/null +++ b/docs/pl/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Odwróć strony +description: Odwróć kolejność stron w jednym lub wielu plikach PDF, tak aby ostatnia strona stała się pierwszą. +--- + +# Odwróć strony + +Odwróć kolejność stron w PDF, tak aby ostatnia strona stała się pierwszą, przedostatnia drugą i tak dalej. Obsługuje wsadowe przetwarzanie wielu plików naraz. + +## Jak to działa + +1. Wgraj jeden lub więcej plików PDF. +2. Kliknij przycisk przetwarzania. +3. Każdy plik jest odwracany niezależnie. Jeśli wgrano wiele plików, wynikiem jest archiwum ZIP zawierające wszystkie odwrócone pliki PDF. +4. Pojedynczy plik pobiera się bezpośrednio jako odwrócony PDF. + +## Funkcje + +- Przetwarzanie wsadowe: odwracanie wielu plików PDF w jednej operacji +- Wynik w postaci pojedynczego pliku dla jednego PDF, ZIP dla wielu +- Przyciski usuwania poszczególnych plików przed przetwarzaniem +- Zachowuje całą zawartość stron i formatowanie + +## Zastosowania + +- Naprawa dokumentu zeskanowanego w odwrotnej kolejności +- Przygotowanie prezentacji PDF do czytania od tyłu do przodu +- Odwrócenie kolejności stron dla procesów drukowania, które podają strony od tyłu +- Poprawienie dokumentu, w którym strony przypadkowo złożono od końca + +## Wskazówki + +- Każdy plik w partii jest odwracany niezależnie, a same pliki nie zmieniają kolejności względem siebie. +- Do bardziej szczegółowej zmiany kolejności stron (nie tylko pełnego odwrócenia) użyj [Duplikuj i organizuj](./organize-pdf). + +## Powiązane narzędzia + +- [Duplikuj i organizuj](./organize-pdf) +- [Obróć PDF](./rotate-pdf) +- [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool) diff --git a/docs/pl/tools/rotate-custom.md b/docs/pl/tools/rotate-custom.md new file mode 100644 index 00000000..065e87d9 --- /dev/null +++ b/docs/pl/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Obróć o niestandardowy kąt +description: Obracaj strony PDF o dowolny kąt dzięki polom kąta dla każdej strony i zbiorczemu sterowaniu obrotem. +--- + +# Obróć o niestandardowy kąt + +Obracaj strony PDF o dowolny kąt, nie tylko o wielokrotności 90 stopni. Każda strona ma własne pole kąta, a jednym kątem możesz objąć wszystkie strony naraz za pomocą kontrolki zbiorczej. + +## Jak to działa + +1. Wgraj plik PDF. Miniatury renderują się dla każdej strony. +2. Każda strona ma pole liczbowe pokazujące jej bieżący kąt obrotu. +3. Wpisz dowolną wartość w stopniach (dodatnią lub ujemną), aby obrócić daną stronę, lub użyj przycisków w lewo/w prawo przy stronie do szybkich obrotów o 90 stopni. +4. Użyj pola **kąta zbiorczego** u góry, aby ustawić jednakowy obrót dla wszystkich stron. +5. Kliknij przycisk przetwarzania, aby wygenerować obrócony PDF. + +## Funkcje + +- Dowolna wartość w stopniach dla każdej strony (dowolna liczba całkowita) +- Zbiorcza kontrolka kąta do ustawienia tego samego obrotu na każdej stronie +- Podgląd obrotu w miniaturach w czasie rzeczywistym +- Przyciski szybkiego obrotu o 90 stopni dla każdej strony +- Miniatury ładowane leniwie dla wydajności przy dużych dokumentach + +## Zastosowania + +- Poprawianie lekko przechylonych skanów o kilka stopni +- Obracanie stron zgodnie z niestandardowym wymogiem orientacji +- Stosowanie precyzyjnych obrotów do poszczególnych stron w dokumencie o mieszanej zawartości +- Dostrajanie kątów stron po wstępnym obrocie zbiorczym + +## Wskazówki + +- Wartości dodatnie obracają zgodnie z ruchem wskazówek zegara, ujemne przeciwnie. +- Pole kąta zbiorczego po zastosowaniu nadpisuje wszystkie kąty poszczególnych stron. W razie potrzeby ustaw indywidualne korekty po operacji zbiorczej. +- Do standardowych obrotów o 90/180/270 stopni z prostszym interfejsem użyj [Obróć PDF](./rotate-pdf). + +## Powiązane narzędzia + +- [Obróć PDF](./rotate-pdf) +- [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool) +- [Duplikuj i organizuj](./organize-pdf) diff --git a/docs/pl/tools/rotate-pdf.md b/docs/pl/tools/rotate-pdf.md new file mode 100644 index 00000000..ea9dfad8 --- /dev/null +++ b/docs/pl/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Obróć PDF +description: Obracaj pojedyncze strony lub wszystkie strony PDF co 90 stopni za pomocą wizualnego interfejsu miniatur. +--- + +# Obróć PDF + +Obracaj strony PDF o 90 stopni zgodnie z ruchem wskazówek zegara lub przeciwnie. Narzędzie pokazuje podglądy miniatur każdej strony, pozwalając obracać je pojedynczo lub zastosować obrót zbiorczy do całego dokumentu. + +## Jak to działa + +1. Wgraj plik PDF. Miniatury wszystkich stron renderują się w siatce. +2. Użyj przycisków obrotu w lewo/w prawo pod miniaturą strony, aby obrócić tę konkretną stronę. +3. Użyj kontrolek obrotu zbiorczego u góry, aby obrócić wszystkie strony naraz. +4. Podgląd miniatur aktualizuje się w czasie rzeczywistym, pokazując obrót. +5. Kliknij przycisk przetwarzania, aby zapisać obrócony PDF. + +## Funkcje + +- Obrót poszczególnych stron co 90 stopni (w lewo lub w prawo) +- Obrót zbiorczy wszystkich stron jednocześnie +- Podgląd miniatur w czasie rzeczywistym z animowanymi przejściami obrotu +- Miniatury ładowane leniwie dla płynnego działania przy dużych dokumentach +- Zachowuje oryginalną zawartość i jakość stron + +## Zastosowania + +- Naprawa zeskanowanych stron ułożonych bokiem lub do góry nogami +- Obracanie stron poziomych do orientacji pionowej (lub odwrotnie) +- Poprawianie dokumentu o mieszanej orientacji, w którym niektóre strony zeskanowano pod złym kątem +- Przygotowanie dokumentu do określonej orientacji wyświetlania + +## Wskazówki + +- Obroty kumulują się. Dwukrotne kliknięcie przycisku w prawo daje obrót o 180 stopni. +- Do obrotów innych niż 90 stopni (np. 45 stopni, aby poprawić lekko przechylony skan) użyj zamiast tego [Obróć o niestandardowy kąt](./rotate-custom). +- Kontrolki obrotu zbiorczego działają na wszystkie strony, nie tylko na wybrane. To narzędzie nie ma mechanizmu zaznaczania. Do tego użyj [Wielofunkcyjnego narzędzia PDF](./pdf-multi-tool). + +## Powiązane narzędzia + +- [Obróć o niestandardowy kąt](./rotate-custom) +- [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool) +- [Duplikuj i organizuj](./organize-pdf) diff --git a/docs/pl/tools/rtf-to-pdf.md b/docs/pl/tools/rtf-to-pdf.md new file mode 100644 index 00000000..d184c645 --- /dev/null +++ b/docs/pl/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF na PDF +description: Konwertuj pliki Rich Text Format (RTF) na PDF w przeglądarce za pomocą silnika opartego na LibreOffice. +--- + +# RTF na PDF + +Konwertuj dokumenty Rich Text Format na PDF. RTF to wieloplatformowy format dokumentów obsługiwany przez praktycznie każdy edytor tekstu. To narzędzie używa działającego w przeglądarce silnika LibreOffice do renderowania plików RTF z zachowaniem formatowania: pogrubienie, kursywa, tabele i osadzone obrazy trafiają do PDF. + +## Obsługiwane formaty + +| Format | Rozszerzenia | Typy MIME | +| :----- | :----------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść jeden lub więcej plików RTF. +2. Przejrzyj listę plików. Dodaj kolejne lub usuń zbędne. +3. Kliknij **Konwertuj na PDF**. Silnik LibreOffice inicjalizuje się przy pierwszym użyciu, a następnie przetwarza każdy plik. +4. Pojedynczy plik pobiera się bezpośrednio jako PDF. Wiele plików jest dostarczanych jako `rtf-converted.zip`. + +## Opcje + +To narzędzie nie ma dodatkowych ustawień. Konwersja zachowuje oryginalne formatowanie RTF. + +## Wynik + +| Liczba plików | Wynik | +| :------------ | :--------------------------------------------------------------- | +| 1 plik | Pobranie pojedynczego PDF (np. `letter.pdf`) | +| 2+ pliki | Archiwum ZIP (`rtf-converted.zip`) zawierające jeden PDF na plik | + +## Zastosowania + +- Konwersja starszych dokumentów RTF z dawnych edytorów tekstu na nowoczesne PDF +- Zamiana szablonów e-maili RTF na podglądy PDF +- Przetwarzanie wyników RTF z oprogramowania prawniczego lub medycznego +- Wsadowa konwersja plików RTF z systemu zarządzania dokumentami na PDF do archiwizacji + +## Wskazówki + +- Silnik LibreOffice jest ładowany raz i buforowany. Pierwsza konwersja w sesji trwa kilka sekund dłużej, kolejne są szybsze. +- Pliki RTF z osadzonymi obiektami OLE mogą nie renderować wszystkich obiektów idealnie. Zwykły tekst, obrazy i standardowe formatowanie konwertują się niezawodnie. +- Jeśli pliki RTF utworzono w Microsoft Word, możesz też skonwertować je bezpośrednio narzędziem [Word na PDF](./word-to-pdf), które przyjmuje RTF obok DOC i DOCX. + +## Powiązane narzędzia + +- [Word na PDF](./word-to-pdf) +- [ODT na PDF](./odt-to-pdf) +- [Tekst na PDF](./txt-to-pdf) diff --git a/docs/pl/tools/sanitize-pdf.md b/docs/pl/tools/sanitize-pdf.md new file mode 100644 index 00000000..5c8c389c --- /dev/null +++ b/docs/pl/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Sanityzuj PDF +description: Usuń ukrytą i potencjalnie niebezpieczną zawartość z plików PDF, w tym metadane, JavaScript, osadzone pliki, adnotacje i warstwy. +--- + +# Sanityzuj PDF + +PDF może zawierać znacznie więcej, niż widać na ekranie. Ukryte metadane, osadzony JavaScript, załączniki, dane formularzy i informacje o warstwach mogą ujawniać wrażliwe dane lub stwarzać zagrożenia. Sanityzacja usuwa to wszystko, zostawiając czysty dokument bezpieczny do publicznego udostępnienia. + +## Jak to działa + +1. Wgraj plik PDF. +2. Wybierz z listy, które elementy usunąć. +3. Kliknij **Sanityzuj PDF**. +4. Pobierz oczyszczony plik. + +## Opcje sanityzacji + +Wszystkie opcje są domyślnie włączone. Odznacz te, które chcesz zachować. + +| Opcja | Co usuwa | +| ------------------------- | ---------------------------------------------------------------------------- | +| **Spłaszcz formularze** | Zamienia interaktywne pola formularzy na statyczną zawartość | +| **Usuń metadane** | Usuwa autora, tytuł, datę utworzenia, informacje o oprogramowaniu i dane XMP | +| **Usuń adnotacje** | Usuwa komentarze, wyróżnienia, karteczki i znaczniki | +| **Usuń JavaScript** | Eliminuje osadzone skrypty, które mogłyby uruchomić się przy otwarciu | +| **Usuń osadzone pliki** | Usuwa załączniki osadzone w PDF | +| **Usuń warstwy (OCG)** | Spłaszcza grupy zawartości opcjonalnej do jednej warstwy | +| **Usuń łącza** | Usuwa hiperłącza i odwołania do adresów URL | +| **Usuń drzewo struktury** | Usuwa strukturę dokumentu używaną do tagowania dostępności | +| **Usuń MarkInfo** | Usuwa informacje o oznaczonej zawartości | +| **Usuń czcionki** | Usuwa osadzone dane czcionek (używaj ostrożnie) | + +## Zastosowania + +- Przygotowanie PDF do publicznego wydania przez usunięcie wewnętrznych metadanych (nazwisk autorów, wersji oprogramowania, historii edycji) +- Usunięcie JavaScriptu z PDF otrzymanego z niezaufanego źródła przed jego otwarciem +- Oczyszczenie PDF przed wysłaniem klientowi, który nie powinien widzieć osadzonych komentarzy ani nazw pól formularzy +- Usunięcie ukrytych warstw z rysunku architektonicznego przed udostępnieniem wersji końcowej +- Zgodność z wymogami minimalizacji danych wynikającymi z przepisów o ochronie prywatności + +## Wskazówki + +- Pozostaw opcję "Usuń czcionki" odznaczoną, chyba że masz pewność, że PDF nadal wyrenderuje się poprawnie. Usunięcie czcionek może sprawić, że tekst będzie niewidoczny w niektórych przeglądarkach. +- Jeśli potrzebujesz tylko usunąć metadane, dedykowane narzędzie Usuń metadane jest szybsze i bardziej wyspecjalizowane. +- Sanityzacja jest nieodwracalna. Zachowaj oryginalny plik. + +## Powiązane narzędzia + +- [Usuń metadane](./remove-metadata): usuń tylko metadane, nie dotykając pozostałej zawartości +- [Spłaszcz PDF](./flatten-pdf): spłaszcz konkretnie formularze i adnotacje +- [Szyfruj PDF](./protect-pdf): dodaj ochronę hasłem po sanityzacji +- [Rasteryzuj PDF](./rasterize-pdf): opcja ostateczna, konwersja na obrazy eliminująca całą ukrytą zawartość diff --git a/docs/pl/tools/scanner-effect.md b/docs/pl/tools/scanner-effect.md new file mode 100644 index 00000000..b1bb7bad --- /dev/null +++ b/docs/pl/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Efekt skanera +description: Spraw, by PDF wyglądał jak zeskanowany dokument, z regulowanym szumem, obrotem, rozmyciem i efektami starzenia papieru. +--- + +# Efekt skanera + +Zamień czysty cyfrowy PDF w coś, co wygląda, jakby wyszło ze skanera płaskiego. Narzędzie stosuje konfigurowalny szum, lekki obrót, rozmycie, zmiany jasności i opcjonalne zażółcenie, aby symulować niedoskonałości fizycznego skanu. + +## Jak to działa + +1. Wgraj plik PDF. +2. Edytor otwiera się z podglądem na żywo pierwszej strony obok panelu ustawień. +3. Dostosuj parametry efektu skanowania za pomocą suwaków i przełączników. +4. Podgląd aktualizuje się w czasie rzeczywistym podczas zmiany ustawień. +5. Kliknij **Zastosuj**, aby przetworzyć wszystkie strony i pobrać wynik. + +## Opcje + +- **Przestrzeń barw (przełącznik odcieni szarości)**: konwertuje wynik na odcienie szarości dla klasycznego czarno-białego skanu. +- **Obramowanie**: dodaje subtelne ciemne obramowanie wokół krawędzi strony, imitując artefakty brzegowe skanera. +- **Obrót**: stosuje lekki obrót (od -5 do +5 stopni), symulując krzywe podanie papieru. +- **Zmienność obrotu**: dodaje losową zmienność kąta obrotu, tak aby każda strona była przechylona nieco inaczej. +- **Jasność**: przesuwa ogólną jasność w górę lub w dół. +- **Kontrast**: reguluje kontrast, symulując różnice w jakości tonera. +- **Rozmycie**: stosuje rozmycie Gaussa, aby zmiękczyć krawędzie tekstu jak w skanie niskiej jakości. +- **Szum**: dodaje losowy szum pikseli, symulując ziarno czujnika skanera. Wyższe wartości dają bardziej ziarnisty efekt. +- **Zażółcenie**: dodaje ciepły żółty odcień, symulując stary lub z recyklingu papier. +- **Rozdzielczość**: ustawia DPI wyniku. Niższe wartości dają bardziej spikselowany, skanopodobny wygląd. +- **Resetuj**: przywraca wszystkie ustawienia domyślne. + +## Funkcje + +- Podgląd w czasie rzeczywistym, aktualizowany przy każdej zmianie parametru +- Losowa zmienność obrotu dla każdej strony, dla realistycznych różnic +- Dziesięć niezależnie regulowanych parametrów +- Tryb odcieni szarości dla autentycznego czarno-białego skanu +- Kontrola rozdzielczości od jakości faksu o niskim DPI po jakość archiwalną o wysokim DPI + +## Zastosowania + +- Sprawianie, by cyfrowo utworzone dokumenty wyglądały, jakby zostały zeskanowane i wydrukowane +- Symulowanie fizycznego starzenia dokumentów przy odtwarzaniu dokumentów historycznych +- Testowanie oprogramowania OCR na skanach o pogorszonej jakości +- Tworzenie dokumentów pasujących stylem do istniejących zeskanowanych archiwów + +## Wskazówki + +- Zacznij od subtelnych wartości. Szum na poziomie 10-20, lekki obrót o 0,5 stopnia i minimalne rozmycie dają już przekonujący wygląd skanu. +- Połącz tryb odcieni szarości z lekkim zażółceniem, aby uzyskać efekt "kserokopii kserokopii". +- Niższe ustawienia rozdzielczości (100-150 DPI) dają najbardziej realistyczny wygląd faksu. + +## Powiązane narzędzia + +- [Odwróć kolory](./invert-colors) +- [Dostosuj kolory](./adjust-colors) +- [Kolor tła](./background-color) diff --git a/docs/pl/tools/sign-pdf.md b/docs/pl/tools/sign-pdf.md new file mode 100644 index 00000000..95738670 --- /dev/null +++ b/docs/pl/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Podpisz PDF +description: Narysuj, wpisz lub wgraj podpis i umieść go na stronach PDF za pomocą zintegrowanej przeglądarki. +--- + +# Podpisz PDF + +Dodaj swój podpis do dowolnego dokumentu PDF. Narzędzie osadza pełną przeglądarkę PDF z wbudowanymi narzędziami podpisu, w której możesz narysować podpis odręcznie, wpisać imię i nazwisko czcionką podpisową lub wgrać obraz podpisu. Umieść podpis na dowolnej stronie, zmień jego rozmiar, a następnie zapisz podpisany dokument. + +## Jak to działa + +1. Wgraj plik PDF. +2. Dokument otwiera się w zintegrowanej przeglądarce PDF z narzędziami adnotacji. +3. Użyj narzędzia podpisu w przeglądarce, aby utworzyć podpis przez rysowanie, wpisanie lub wgranie obrazu. +4. Kliknij miejsce na stronie, w którym chcesz umieścić podpis, i dostosuj jego rozmiar oraz położenie. +5. Opcjonalnie zaznacz **Spłaszcz PDF**, aby trwale osadzić podpis w dokumencie. +6. Kliknij **Zapisz i pobierz podpisany PDF**, aby otrzymać podpisany plik. + +## Opcje + +- **Spłaszcz PDF**: po zaznaczeniu podpis jest trwale osadzany w zawartości strony. Zapobiega to przesunięciu lub usunięciu podpisu przez inne osoby. Gdy opcja jest odznaczona, podpis pozostaje adnotacją, którą można edytować w zgodnych przeglądarkach. + +## Funkcje + +- Trzy metody tworzenia podpisu: rysowanie odręczne, wpisany tekst lub wgrany obraz +- Zintegrowana przeglądarka PDF do dokładnego umieszczania +- Przeciąganie w celu ustawienia położenia i zmiany rozmiaru podpisów na dowolnej stronie +- Opcjonalne spłaszczanie do trwałego osadzenia podpisów +- Obsługa wielu podpisów w tym samym dokumencie + +## Zastosowania + +- Podpisywanie umów, porozumień lub formularzy zatwierdzeń przed odesłaniem +- Dodawanie podpisu do dokumentów podatkowych, wniosków ubezpieczeniowych lub formularzy urzędowych +- Umieszczanie parafek na poszczególnych stronach wielostronicowej umowy +- Podpisywanie NDA lub dokumentów kadrowych, które przychodzą jako załączniki PDF + +## Wskazówki + +- Włącz spłaszczanie, jeśli wysyłasz podpisany PDF komuś, kto nie powinien móc usunąć ani przesunąć Twojego podpisu. +- Do prawnie wiążących podpisów cyfrowych z weryfikacją opartą na certyfikatach BentoPDF oferuje również osobne narzędzie Podpis cyfrowy PDF. +- Wgraj obraz podpisu w PNG z przezroczystym tłem, aby uzyskać najczystszy wynik. + +## Powiązane narzędzia + +- [Edytor PDF](./edit-pdf) +- [Dodaj pieczątki](./add-stamps) +- [Wypełnianie formularzy PDF](./form-filler) diff --git a/docs/pl/tools/split-pdf.md b/docs/pl/tools/split-pdf.md new file mode 100644 index 00000000..40cf7ea1 --- /dev/null +++ b/docs/pl/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Podziel PDF +description: Podziel PDF na mniejsze pliki według zakresu stron, wyboru wizualnego, zakładek, stron parzystych/nieparzystych lub stałych odstępów. +--- + +# Podziel PDF + +Podziel PDF na mniejsze dokumenty w jednym z sześciu trybów dzielenia. Od prostych zakresów stron po dzielenie według zakładek, to narzędzie obsługuje każdy scenariusz podziału dokumentu. + +## Jak to działa + +1. Wgraj pojedynczy plik PDF. +2. Wybierz tryb podziału z listy rozwijanej. +3. Skonfiguruj opcje specyficzne dla trybu (zakresy stron, wybór itp.). +4. Kliknij przycisk przetwarzania. +5. Wynik pobiera się jako pojedynczy PDF lub archiwum ZIP, zależnie od trybu i ustawień. + +## Tryby podziału + +| Tryb | Opis | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| **Zakres** | Wpisz zakresy stron, np. `1-3, 5, 8-10`. Wiele zakresów daje osobne pliki PDF w ZIP. Pojedynczy zakres daje jeden PDF. | +| **Wybór wizualny** | Przeglądaj miniatury stron i klikaj, aby wybrać potrzebne strony. Wybrane strony są wyodrębniane do nowego PDF. | +| **Parzyste / nieparzyste** | Wyodrębnij tylko strony parzyste lub nieparzyste. | +| **Wszystkie strony** | Podziel każdą stronę na osobny plik PDF, pobierany jako ZIP. | +| **Zakładki** | Podziel na granicach zakładek. Wybierz poziom zakładek, aby kontrolować, gdzie następują podziały. | +| **Co N stron** | Podziel na fragmenty po N stron (np. co 5 stron). Ostatni fragment może mieć mniej stron. | + +## Funkcje + +- Sześć odrębnych trybów dzielenia obejmujących praktycznie każde zastosowanie +- Wizualny wybór stron z miniaturami ładowanymi leniwie +- Dzielenie według zakładek z filtrowaniem poziomów +- Opcja wyniku ZIP w trybach zakresu i wyboru wizualnego +- Obsługa zakresów stron o mieszanej składni (`1-3, 5, 8-10`) +- Ostrzeżenie, gdy podział co N stron daje nierówne fragmenty + +## Zastosowania + +- Wyodrębnienie konkretnego rozdziału lub sekcji z dużego dokumentu +- Rozdzielenie stron nieparzystych i parzystych na potrzeby druku dwustronnego +- Rozbicie PDF książki na pliki poszczególnych rozdziałów na granicach zakładek +- Wyodrębnienie wybranych stron (np. strony z podpisem) z umowy +- Podział zbiorczego raportu na pliki poszczególnych sekcji do dystrybucji + +## Wskazówki + +- Wiele zakresów stron oddzielonych przecinkami (np. `1-5, 10-15, 20-25`) daje osobne pliki PDF, po jednym na zakres, spakowane w ZIP. +- Tryb podziału według zakładek wymaga, aby PDF faktycznie zawierał zakładki. Jeśli ich nie ma, zobaczysz komunikat o błędzie. +- Pole wyboru "Pobierz jako ZIP" w trybach Zakres i Wybór wizualny pozwala otrzymać osobne pliki PDF dla każdej strony zamiast pliku połączonego. + +## Powiązane narzędzia + +- [Połącz PDF](./merge-pdf) +- [Wyodrębnij strony](./extract-pages) +- [Usuń strony](./delete-pages) +- [Wielofunkcyjne narzędzie PDF](./pdf-multi-tool) diff --git a/docs/pl/tools/svg-to-pdf.md b/docs/pl/tools/svg-to-pdf.md new file mode 100644 index 00000000..de53b1a4 --- /dev/null +++ b/docs/pl/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG na PDF +description: Konwertuj grafiki wektorowe SVG na PDF z kontrolą jakości, w całości w przeglądarce. +--- + +# SVG na PDF + +Konwertuj pliki Scalable Vector Graphics (SVG) na PDF. Narzędzie rasteryzuje każdy SVG za pomocą silnika renderowania przeglądarki, a następnie osadza wynik w jego natywnej rozdzielczości. Przydatne do zamiany ikon wektorowych, diagramów i ilustracji w przenośne dokumenty. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :----------- | +| SVG | `.svg` | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść jeden lub więcej plików SVG. +2. Przejrzyj listę plików i zarządzaj nią. +3. Wybierz poziom **jakości PDF**. +4. Kliknij **Konwertuj na PDF**. Wynik pobiera się jako `from_svgs.pdf`. + +Każdy SVG jest odczytywany jako tekst, renderowany na kanwie w swojej wewnętrznej szerokości i wysokości (domyślnie 800x600, jeśli nie podano wymiarów) i eksportowany jako PNG. Ten PNG jest następnie osadzany w PDF za pomocą pdf-lib. Przezroczyste obszary są wypełniane białym tłem. + +## Opcje + +**Jakość PDF** kontroluje kompresję po rasteryzacji: + +- **Wysoka jakość**: najbliższa oryginalnemu renderowaniu. +- **Średnia jakość** (domyślnie): dobry kompromis. +- **Niska jakość**: najmniejszy plik, pewna utrata szczegółów. + +## Zastosowania + +- Konwersja diagramów architektonicznych lub inżynieryjnych z SVG na PDF gotowy do druku +- Pakowanie zestawów ikon w referencyjny PDF dla systemu projektowego +- Zamiana wizualizacji danych (D3.js, eksporty bibliotek wykresów) na PDF gotowe do raportu +- Tworzenie drukowalnych wersji infografik opartych na SVG + +## Wskazówki + +- Pliki SVG bez jawnych atrybutów `width` i `height` renderują się w 800x600 pikseli. Aby uzyskać najlepsze wyniki, ustaw wymiary w źródle SVG przed konwersją. +- Złożone pliki SVG z zewnętrznymi odwołaniami do czcionek lub połączonymi obrazami mogą nie renderować się idealnie. Osadź wszystkie zasoby w SVG, aby uzyskać niezawodny wynik. +- Ponieważ SVG jest rasteryzowany, PDF będzie zawierał obraz bitmapowy zamiast ścieżek wektorowych. Do prawdziwie wektorowego PDF potrzebne jest dedykowane narzędzie wektorowe. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [PNG na PDF](./png-to-pdf) +- [BMP na PDF](./bmp-to-pdf) diff --git a/docs/pl/tools/table-of-contents.md b/docs/pl/tools/table-of-contents.md new file mode 100644 index 00000000..1ee7f7c2 --- /dev/null +++ b/docs/pl/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Spis treści +description: Wygeneruj sformatowaną stronę spisu treści na podstawie istniejących zakładek PDF. +--- + +# Spis treści + +To narzędzie odczytuje zakładki (konspekty) w PDF i generuje sformatowaną stronę spisu treści, która jest dodawana na początku dokumentu. Jeśli Twój PDF ma już zakładki, ale brakuje w nim widocznej strony spisu treści, to narzędzie tworzy ją automatycznie. + +## Jak to działa + +1. Wgraj PDF zawierający zakładki. +2. Dostosuj tytuł spisu treści, rozmiar czcionki i rodzinę czcionek. +3. Opcjonalnie zaznacz **Dodaj zakładkę dla strony spisu treści**, aby uwzględnić sam spis w drzewie zakładek. +4. Kliknij **Generuj spis treści**, aby przetworzyć plik. +5. Zaktualizowany PDF pobiera się automatycznie, ze stroną spisu treści wstawioną na początku. + +## Opcje + +- **Tytuł spisu treści**: nagłówek wyświetlany na górze wygenerowanej strony. Domyślnie "Spis treści". +- **Rozmiar czcionki**: wybierz od 10 pt do 72 pt. Domyślnie 12 pt. +- **Rodzina czcionek**: wybierz spośród wariantów Times Roman, Helvetica lub Courier (zwykły, pogrubiony, kursywa, pogrubiona kursywa). Domyślnie Helvetica. +- **Dodaj zakładkę dla strony spisu treści**: po zaznaczeniu do drzewa konspektu PDF dodawany jest wpis zakładki dla samej strony spisu. + +## Funkcje + +- Odczytuje pełną hierarchię zakładek z PDF +- Generuje czysto sformatowaną stronę spisu z odwołaniami do numerów stron +- Obsługuje zagnieżdżone poziomy zakładek z wcięciami +- Wybór spośród 12 wbudowanych czcionek PDF +- Opcjonalna zakładka odwołująca się do samej strony spisu + +## Zastosowania + +- Dodanie drukowalnego spisu treści do e-booków lub raportów, które mają tylko cyfrowe zakładki +- Utworzenie spisu treści dla połączonego dokumentu po scaleniu wielu plików PDF +- Generowanie strony referencyjnej dla długich podręczników technicznych +- Przygotowanie dokumentów do druku, w których oczekiwany jest widoczny spis treści + +## Wskazówki + +- Jeśli Twój PDF nie ma zakładek, najpierw użyj narzędzia [Edytuj zakładki](./bookmark), aby je utworzyć, a potem wróć tutaj wygenerować spis treści. +- Przy dużych dokumentach większy rozmiar czcionki, jak 14 pt lub 16 pt, poprawia czytelność. + +## Powiązane narzędzia + +- [Edytuj zakładki](./bookmark) +- [Numery stron](./page-numbers) +- [Nagłówek i Stopka](./header-footer) diff --git a/docs/pl/tools/text-color.md b/docs/pl/tools/text-color.md new file mode 100644 index 00000000..3c47fc5e --- /dev/null +++ b/docs/pl/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Zmień kolor tekstu +description: Zmień kolor całego tekstu w PDF na dowolnie wybrany kolor. +--- + +# Zmień kolor tekstu + +Zastąp kolor tekstu w całym PDF. Narzędzie rozpoznaje obszary tekstu na każdej stronie i przekolorowuje je na wybrany kolor, zachowując układ dokumentu i elementy nietekstowe. + +## Jak to działa + +1. Wgraj plik PDF. +2. Wybierz nowy kolor tekstu za pomocą selektora kolorów. Domyślny to niebieski (#0000FF). +3. Kliknij **Zmień kolor tekstu**, aby przetworzyć. +4. Przekolorowany PDF pobiera się automatycznie. Wskaźnik postępu pokazuje, która strona jest przetwarzana. + +## Opcje + +- **Nowy kolor tekstu**: selektor koloru do wyboru koloru zastępującego dla całego tekstu w dokumencie. + +## Funkcje + +- Przekolorowuje tekst na każdej stronie dokumentu +- Przetwarzanie strona po stronie z informacją o postępie +- Selektor kolorów z pełną obsługą kolorów szesnastkowych +- Zachowuje układ strony i elementy nietekstowe + +## Zastosowania + +- Zmiana czarnego tekstu na ciemnoniebieski dla łagodniejszego, bardziej nowoczesnego wyglądu dokumentu +- Przekolorowanie tekstu zgodnie z wytycznymi marki przed dystrybucją dokumentów +- Zamiana tekstu na określony kolor ze względu na zgodność z wymogami dostępności +- Uczynienie tekstu widocznym na nowo zastosowanym kolorze tła + +## Wskazówki + +- To narzędzie renderuje strony w skali 2x dla jakości, a następnie odbudowuje PDF. Wynik jest oparty na obrazach, więc tekst nie będzie już zaznaczalny ani wyszukiwalny. +- W przypadku dokumentów, w których musisz zachować zaznaczalny tekst, rozważ bezpośrednią edycję PDF w [Edytorze PDF](./edit-pdf). +- Czas przetwarzania rośnie wraz z liczbą stron, ponieważ każda strona jest renderowana osobno. + +## Powiązane narzędzia + +- [Kolor tła](./background-color) +- [Odwróć kolory](./invert-colors) +- [Dostosuj kolory](./adjust-colors) diff --git a/docs/pl/tools/tiff-to-pdf.md b/docs/pl/tools/tiff-to-pdf.md new file mode 100644 index 00000000..2eb703be --- /dev/null +++ b/docs/pl/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF na PDF +description: Konwertuj jedno- i wielostronicowe obrazy TIFF na format PDF w przeglądarce z pełną obsługą stron. +--- + +# TIFF na PDF + +Konwertuj pliki TIFF na PDF, w tym wielostronicowe TIFF. Każda strona (lub "IFD") w pliku TIFF staje się osobną stroną w wynikowym PDF. Jest to szczególnie przydatne dla zeskanowanych dokumentów, faksów i obrazów medycznych, które często są przechowywane jako wielostronicowe pliki TIFF. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Jak to działa + +1. Kliknij obszar wgrywania lub przeciągnij i upuść pliki TIFF. +2. Przejrzyj listę plików i zarządzaj nią według potrzeb. +3. Kliknij **Konwertuj na PDF**. Wynik pobiera się jako `from_tiff.pdf`. + +Narzędzie dekoduje każdy plik TIFF za pomocą dekodera TIFF w JavaScript, wyodrębniając surowe dane pikseli RGBA każdej strony. Każda strona jest renderowana na kanwie, eksportowana jako PNG i osadzana w PDF. Wymiary stron odpowiadają oryginalnym stronom TIFF. + +## Opcje + +To narzędzie nie udostępnia dodatkowych ustawień jakości. Obrazy są osadzane w natywnej rozdzielczości. + +## Zastosowania + +- Konwersja wielostronicowych dokumentów faksowych (TIFF-F) na bardziej przenośny format PDF +- Zamiana archiwów zeskanowanych dokumentów przechowywanych jako TIFF na przeszukiwalne PDF (następnie połącz z narzędziem OCR) +- Przetwarzanie plików obrazowania medycznego (preparaty patologiczne, eksporty radiologiczne), które używają TIFF +- Konwersja plików TIFF z danymi GIS lub obrazami satelitarnymi na dokumenty do udostępniania + +## Wskazówki + +- Wielostronicowe pliki TIFF są w pełni obsługiwane. 10-stronicowy TIFF da 10-stronicowy PDF. Nie musisz najpierw dzielić pliku TIFF. +- Bardzo duże pliki TIFF (setki megabajtów) mogą przetwarzać się dłużej, ponieważ cały plik musi zostać zdekodowany w pamięci przeglądarki. +- Jeśli potrzebujesz OCR na powstałym PDF, uruchom po konwersji narzędzie [OCR PDF](./ocr-pdf). + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [BMP na PDF](./bmp-to-pdf) +- [JPG na PDF](./jpg-to-pdf) diff --git a/docs/pl/tools/txt-to-pdf.md b/docs/pl/tools/txt-to-pdf.md new file mode 100644 index 00000000..8bc7f381 --- /dev/null +++ b/docs/pl/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Tekst na PDF +description: Konwertuj zwykłe pliki tekstowe lub wpisany tekst na PDF z własnymi czcionkami, kolorami i rozmiarami stron. +--- + +# Tekst na PDF + +Konwertuj zwykły tekst na sformatowany PDF. Możesz wgrać pliki `.txt` lub wpisywać bezpośrednio we wbudowanym edytorze tekstu. Narzędzie obsługuje wiele czcionek, własne kolory tekstu i szeroki wybór rozmiarów stron: od A0 do A10, a także US Letter, Legal i Tabloid. + +## Obsługiwane formaty + +| Dane wejściowe | Rozszerzenia | +| :-------------------- | :------------------------- | +| Zwykłe pliki tekstowe | `.txt` | +| Bezpośrednie wpisanie | Wpisz lub wklej w edytorze | + +## Jak to działa + +1. Wybierz tryb wprowadzania przełącznikiem u góry: **Wgraj pliki** lub **Wpisz tekst**. +2. Jeśli wgrywasz, przeciągnij i upuść lub kliknij, aby wybrać jeden lub więcej plików `.txt`. Jeśli wpisujesz, wprowadź tekst bezpośrednio w polu tekstowym. +3. Skonfiguruj opcje formatowania: rodzinę czcionek, rozmiar czcionki, kolor tekstu i rozmiar strony. +4. Kliknij **Utwórz PDF**. Wynik pobiera się jako `text_to_pdf.pdf`. + +Przy wgrywaniu wielu plików ich zawartość jest łączona z pustymi wierszami między nimi. + +## Opcje + +| Opcja | Wartości | Domyślnie | +| :------------------- | :----------------------------------------------------------------------------------------- | :--------------- | +| **Rodzina czcionek** | Helvetica (bezszeryfowa), Tiro (szeryfowa), Courier (stałej szerokości), Times (szeryfowa) | Helvetica | +| **Rozmiar czcionki** | 6 -- 72 pt | 12 | +| **Kolor tekstu** | Dowolny kolor z selektora | Czarny (#000000) | +| **Rozmiar strony** | ISO A0--A10, B0--B10, C0--C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Języki pisane od prawej do lewej (arabski, hebrajski, perski, urdu) są wykrywane automatycznie. Po wykryciu tekstu RTL kierunek tekstu i wyrównanie zmieniają się odpowiednio. + +## Zastosowania + +- Konwersja fragmentów kodu lub plików dziennika na drukowalny PDF czcionką Courier +- Szybkie utworzenie PDF z notatek ze spotkania wpisanych na bieżąco +- Formatowanie manuskryptu w zwykłym tekście określoną czcionką i rozmiarem strony do zgłoszenia +- Przygotowanie wersji PDF pliku README lub dziennika zmian do dystrybucji offline + +## Wskazówki + +- Użyj trybu **Wpisz tekst**, gdy chcesz szybko skonwertować zawartość schowka bez wcześniejszego zapisywania jej jako pliku. +- Courier (stałej szerokości) to najlepszy wybór czcionki dla kodu, dzienników lub dowolnej zawartości, w której ważne jest wyrównanie kolumn. +- Marginesy strony są stałe i wynoszą 72 punkty (1 cal) z każdej strony. + +## Powiązane narzędzia + +- [Markdown na PDF](./markdown-to-pdf) +- [CSV na PDF](./csv-to-pdf) +- [Word na PDF](./word-to-pdf) diff --git a/docs/pl/tools/unlock-pdf.md b/docs/pl/tools/unlock-pdf.md new file mode 100644 index 00000000..f5de1159 --- /dev/null +++ b/docs/pl/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Odblokuj PDF +description: Usuń ochronę hasłem z zaszyfrowanych plików PDF. Obsługuje wsadowe odszyfrowanie wielu plików jednym hasłem. +--- + +# Odblokuj PDF + +Jeśli znasz hasło do zaszyfrowanego pliku PDF, to narzędzie całkowicie usuwa szyfrowanie i tworzy odblokowaną kopię, którą każdy może otworzyć bez podawania hasła. Obsługuje wsadowe odszyfrowanie, gdy wiele plików PDF ma to samo hasło. + +## Jak to działa + +1. Prześlij jeden lub więcej zaszyfrowanych plików PDF. +2. Wpisz **hasło** użyte do ochrony plików. +3. Kliknij **Odszyfruj PDF**. +4. Pojedynczy plik zostanie pobrany bezpośrednio. Wiele plików da archiwum ZIP ze wszystkimi odblokowanymi plikami PDF. + +## Funkcje + +- Odszyfrowanie pojedynczych plików i wsadowe +- Obsługa haseł użytkownika i haseł właściciela +- Całkowicie niezaszyfrowany wynik bez pozostałych ograniczeń +- Czytelne komunikaty o błędach przy niepoprawnym haśle lub uszkodzonych plikach +- Śledzenie powodzenia lub niepowodzenia dla każdego pliku w trybie wsadowym + +## Czym różni się od usuwania ograniczeń + +**Odszyfruj PDF** wymaga hasła i usuwa całe szyfrowanie. **Usuń ograniczenia** dotyczy ograniczeń użycia (drukowanie, kopiowanie, edycja) i może nie wymagać hasła, jeśli ustawiono tylko hasło właściciela. Użyj odszyfrowania, gdy plik PDF w ogóle nie otwiera się bez hasła. + +## Zastosowania + +- Trwałe odblokowanie plików PDF zaszyfrowanych wcześniej, gdy hasło nie jest już potrzebne +- Usunięcie szyfrowania z partii zarchiwizowanych dokumentów dla łatwiejszego długoterminowego dostępu +- Przygotowanie plików PDF chronionych hasłem dla systemu zarządzania dokumentami, który nie obsługuje plików zaszyfrowanych +- Odblokowanie plików PDF przed połączeniem z innymi dokumentami (wiele narzędzi do łączenia nie przetwarza zaszyfrowanych danych) + +## Wskazówki + +- Pole hasła dotyczy wszystkich przesłanych plików. Jeśli pliki PDF mają różne hasła, przetwarzaj je w osobnych partiach. +- Jeśli pojawi się błąd "Nieprawidłowe hasło", sprawdź, czy nie ma spacji na końcu i czy nie jest włączony Caps Lock. +- Po odszyfrowaniu wynik nie ma żadnych zabezpieczeń. Jeśli chcesz ustawić nowe hasło, zaszyfruj plik ponownie za pomocą Szyfruj PDF. + +## Powiązane narzędzia + +- [Szyfruj PDF](./protect-pdf): ponowne zaszyfrowanie nowym hasłem +- [Usuń ograniczenia](./remove-restrictions): usunięcie ograniczeń użycia bez pełnego odszyfrowania +- [Zmień uprawnienia](./change-permissions): zmiana wybranych uprawnień zaszyfrowanego pliku PDF diff --git a/docs/pl/tools/validate-signature-pdf.md b/docs/pl/tools/validate-signature-pdf.md new file mode 100644 index 00000000..8b653b6d --- /dev/null +++ b/docs/pl/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Zweryfikuj podpis +description: Weryfikuj podpisy cyfrowe w plikach PDF. Sprawdź ważność certyfikatu, tożsamość podpisującego, integralność dokumentu i status łańcucha zaufania. +--- + +# Zweryfikuj podpis + +Prześlij podpisany plik PDF, a narzędzie wyodrębni każdy podpis cyfrowy, zidentyfikuje podpisującego, sprawdzi ważność certyfikatu i poinformuje, czy dokument został zmodyfikowany po podpisaniu. Możesz też podać zaufany certyfikat, aby zweryfikować łańcuch podpisu. + +## Jak to działa + +1. Prześlij podpisany plik PDF. Weryfikacja rozpocznie się automatycznie. +2. Narzędzie wyświetli podsumowanie: liczbę znalezionych podpisów i ile z nich jest ważnych. +3. Każdy podpis ma osobną kartę ze szczegółami: podpisujący, wystawca, daty i status. +4. Opcjonalnie prześlij **zaufany certyfikat** (.pem, .crt, .cer, .der), aby zweryfikować podpis względem konkretnego punktu zaufania. Ponowna weryfikacja uruchomi się automatycznie. + +## Co jest sprawdzane + +### Analiza podpisu + +Narzędzie wyodrębnia z pliku PDF obiekty podpisu PKCS#7, dekoduje strukturę ASN.1 i pobiera certyfikat X.509 podpisującego wraz z ewentualnym łańcuchem certyfikatów osadzonym w podpisie. + +### Ważność certyfikatu + +- **Wygaśnięcie**: czy certyfikat mieści się obecnie w okresie ważności? +- **Wykrywanie samopodpisanych**: czy certyfikat jest własnym wystawcą? +- **Łańcuch zaufania**: gdy podano zaufany certyfikat, czy certyfikat podpisującego prowadzi do niego łańcuchem? + +### Weryfikacja kryptograficzna + +- Narzędzie odtwarza bajty objęte `/ByteRange` podpisu, haszuje je algorytmem zadeklarowanym przez podpisującego i porównuje wynik z atrybutem `messageDigest` wewnątrz podpisu. +- Następnie ponownie serializuje podpisane atrybuty jako DER SET i weryfikuje podpis kluczem publicznym certyfikatu podpisującego. +- **Podpis jest uznawany za ważny tylko wtedy, gdy wszystkie te kroki zakończą się powodzeniem.** Jeśli bajty pliku PDF zmieniono po podpisaniu lub osadzony podpis nie pasuje do klucza podpisującego, status pokaże "Nieprawidłowy: weryfikacja kryptograficzna nie powiodła się" wraz z konkretnym powodem. + +#### Obsługiwane algorytmy podpisu + +| Algorytm | Ścieżka weryfikacji | +| ----------------------- | -------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, z awaryjnym użyciem Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` po konwersji podpisu DER → IEEE P1363 | + +Jeśli podpis używa algorytmu spoza tej listy (na przykład Ed25519, SM2 lub RSA z nietypowym OID skrótu), karta pokazuje na żółto **"Niezweryfikowany: nieobsługiwany algorytm podpisu"** wraz z konkretnym OID lub powodem. To celowe rozróżnienie trzech stanów: + +- **Prawidłowy**: podpis został kryptograficznie zweryfikowany kluczem publicznym podpisującego. +- **Nieprawidłowy**: weryfikacja się odbyła i dała wynik negatywny (zmienione bajty, niezgodność klucza). +- **Niezweryfikowany**: narzędzie nie mogło przeprowadzić weryfikacji dla tego algorytmu. Metadane certyfikatu są nadal wyświetlane, ale podpis należy traktować jako "nieznany" i zweryfikować go w Adobe Acrobat lub za pomocą `openssl cms -verify`. + +### Niebezpieczne algorytmy skrótu + +- Podpisy używające **MD5 lub SHA-1** są odrzucane jako nieważne i oznaczane statusem "Niebezpieczny skrót". Oba algorytmy mają opublikowane ataki kolizyjne, więc podpis złożony na skrócie SHA-1 lub MD5 nie gwarantuje integralności. +- SHA-224, SHA-256, SHA-384 i SHA-512 są akceptowane. + +### Zakres pokrycia dokumentu + +- **Pełne pokrycie**: podpis obejmuje cały plik PDF, czyli po podpisaniu nie dodano ani nie zmieniono żadnych bajtów. +- **Częściowe pokrycie**: podpis obejmuje tylko część pliku. Może to oznaczać modyfikacje po podpisaniu (niekoniecznie złośliwe, bo zapisy przyrostowe dają częściowe pokrycie). + +## Szczegóły podpisu + +Każda karta podpisu pokazuje: + +- **Podpisał**: nazwę zwykłą, organizację i adres e-mail z certyfikatu podpisującego +- **Wystawca**: urząd certyfikacji, który wystawił certyfikat podpisującego +- **Data podpisu**: znacznik czasu osadzony w podpisie +- **Ważny od / Ważny do**: okres ważności certyfikatu +- **Powód**: powód podpisania dokumentu (jeśli podano) +- **Lokalizacja**: miejsce podpisania (jeśli podano) +- **Status pokrycia**: pełne lub częściowe +- **Odznaka zaufania**: zaufany lub spoza łańcucha zaufania (tylko gdy podano własny certyfikat) + +### Szczegóły techniczne + +Rozwiń sekcję szczegółów technicznych, aby zobaczyć: + +- Numer seryjny certyfikatu podpisującego +- Algorytm skrótu (SHA-256, SHA-512 itd.) +- Algorytm podpisu (RSA z SHA-256, ECDSA z SHA-256 itd.) +- Komunikaty o błędach dla nieważnych podpisów + +## Zastosowania + +- Weryfikacja podpisanej cyfrowo umowy przed kontrasygnatą +- Audyt podpisanych dokumentów w celu potwierdzenia, że nie zostały zmienione +- Sprawdzenie, czy certyfikat wygasł od czasu podpisania dokumentu +- Weryfikacja podpisów względem certyfikatu głównego Twojej organizacji +- Sprawdzanie szczegółów podpisu w dokumentach urzędowych lub prawnych + +## Wskazówki + +- Certyfikat samopodpisany nie oznacza, że podpis jest nieważny. Oznacza, że tożsamości podpisującego nie można potwierdzić przez zaufaną stronę trzecią. To częste w dokumentach wewnętrznych. +- Częściowe pokrycie nie zawsze oznacza manipulację. Wiele procesów PDF dodaje aktualizacje przyrostowe (jak drugi podpis), które dają częściowe pokrycie. +- Prześlij certyfikat główny lub pośredni swojej organizacji jako zaufany certyfikat, aby uzyskać weryfikację łańcucha zaufania. + +## Powiązane narzędzia + +- [Podpis cyfrowy PDF](./digital-sign-pdf): podpisz pliki PDF własnym certyfikatem +- [Spłaszcz PDF](./flatten-pdf): spłaszcz plik PDF przed podpisaniem, aby zapobiec modyfikacjom po podpisie +- [Usuń metadane](./remove-metadata): wyczyść plik PDF przed złożeniem podpisu diff --git a/docs/pl/tools/view-metadata.md b/docs/pl/tools/view-metadata.md new file mode 100644 index 00000000..528b10c6 --- /dev/null +++ b/docs/pl/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Wyświetl metadane +description: Sprawdź wszystkie właściwości metadanych pliku PDF, w tym informacje o dokumencie, dane XMP i szczegóły strukturalne. +--- + +# Wyświetl metadane + +Sprawdź ukryte właściwości osadzone w pliku PDF. Narzędzie wyświetla informacje o dokumencie (tytuł, autor, daty), metadane XMP, wymiary stron i inne dane strukturalne w czytelnej formie. + +## Jak to działa + +1. Prześlij plik PDF. +2. Narzędzie od razu analizuje plik i wyświetla wszystkie dostępne metadane w uporządkowanych sekcjach. +3. Przejrzyj słownik informacji o dokumencie, drzewo metadanych XMP i właściwości strukturalne. +4. Nie jest potrzebny żaden krok przetwarzania: metadane są wyświetlane zaraz po wczytaniu pliku. + +## Funkcje + +- Wyświetla standardowe pola informacji o dokumencie: Title, Author, Subject, Keywords, Creator, Producer +- Pokazuje daty utworzenia i modyfikacji w czytelnym formacie +- Analizuje i wyświetla pełne drzewo metadanych XMP z zagnieżdżonymi przestrzeniami nazw +- Konwertuje format daty PDF (`D:20240101120000Z`) na czytelne daty +- Uporządkowane w zwijane sekcje dla łatwej nawigacji + +## Sekcje metadanych + +| Sekcja | Zawartość | +| --------------------------- | ------------------------------------------------------------------------------------- | +| **Informacje o dokumencie** | Title, Author, Subject, Keywords, Creator, Producer, Creation Date, Modification Date | +| **Metadane XMP** | Pełne drzewo metadanych XML z przestrzeniami nazw Dublin Core, XAP, PDF i własnymi | +| **Właściwości dokumentu** | Liczba stron, wersja PDF, rozmiar pliku, status szyfrowania | + +## Zastosowania + +- Sprawdzenie, kto jest autorem pliku PDF i kiedy był ostatnio modyfikowany +- Weryfikacja, czy metadane zostały poprawnie ustawione przed publikacją dokumentu +- Audyt plików PDF pod kątem prywatności, czyli sprawdzenie, jakie dane osobowe są osadzone +- Ustalenie, jakiego oprogramowania użyto do utworzenia lub zmodyfikowania pliku PDF (pole Producer) +- Przegląd metadanych XMP pod kątem zgodności z zarządzaniem zasobami cyfrowymi + +## Wskazówki + +- Ciągi dat PDF zaczynające się od `D:` są automatycznie konwertowane na format Twojej strefy czasowej. +- Jeśli pola metadanych są puste, twórca pliku PDF po prostu ich nie ustawił. Nie wszystkie pliki PDF zawierają bogate metadane. +- Aby zmodyfikować metadane po sprawdzeniu, użyj [Edytuj metadane](./edit-metadata). Aby usunąć je całkowicie, użyj Usuń metadane. + +## Powiązane narzędzia + +- [Edytuj metadane](./edit-metadata) +- [Warstwy PDF (OCG)](./pdf-layers) +- [Porównaj PDF](./compare-pdfs) diff --git a/docs/pl/tools/vsd-to-pdf.md b/docs/pl/tools/vsd-to-pdf.md new file mode 100644 index 00000000..3be3b80d --- /dev/null +++ b/docs/pl/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD na PDF +description: Konwertuj diagramy Microsoft Visio (VSD/VSDX) na PDF w przeglądarce. Za darmo, prywatnie, bez Visio. +--- + +# VSD na PDF + +Konwertuj diagramy Microsoft Visio na PDF bez instalowania Visio. Pliki VSD i VSDX zawierają schematy blokowe, schematy organizacyjne, diagramy sieciowe i plany pięter, których większość osób nie może otworzyć. To narzędzie renderuje je jako czytelne pliki PDF, które można oglądać na dowolnym urządzeniu. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----------- | :----------- | :----------------------------------------------- | +| Visio Binary | `.vsd` | Starszy format Visio (Visio 2003 i wcześniejsze) | +| Visio XML | `.vsdx` | Nowoczesny format Visio (Visio 2013+) | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki VSD lub VSDX. W jednej partii można mieszać oba formaty. +2. Przejrzyj listę plików. Usuń niechciane pozycje ikoną kosza lub użyj **Dodaj więcej plików**, aby dodać kolejne diagramy. +3. Kliknij **Konwertuj na PDF**. Silnik oparty na LibreOffice ładuje się w przeglądarce i renderuje każdy diagram do PDF, zachowując kształty, łączniki, etykiety i układ strony. +4. Pojedynczy diagram jest pobierany bezpośrednio jako PDF. Wiele plików da archiwum ZIP o nazwie `vsd-to-pdf.zip`. + +## Opcje + +Nie jest wymagana żadna konfiguracja. Konwerter respektuje oryginalny rozmiar i orientację strony z dokumentu Visio. + +## Zastosowania + +- Przeglądanie diagramów Visio od współpracownika, gdy nie masz licencji Visio +- Dołączanie diagramów sieciowych lub architektury do dokumentacji projektu jako PDF +- Drukowanie schematów organizacyjnych lub procesów jako materiałów na spotkania +- Archiwizacja starych plików VSD ze starszych wersji Visio w formacie odpornym na przyszłość + +## Wskazówki + +- Wielostronicowe dokumenty Visio dają wielostronicowe pliki PDF, a każda strona Visio odpowiada stronie PDF. +- Pliki VSDX (nowoczesny format oparty na XML) zwykle konwertują się wierniej niż starsze binarne pliki VSD. +- Silnik LibreOffice ładuje się raz na sesję. Przy pierwszej konwersji należy się spodziewać krótkiego oczekiwania, a kolejne pliki będą przetwarzane szybciej. + +## Powiązane narzędzia + +- [ODG na PDF](./odg-to-pdf) +- [PUB na PDF](./pub-to-pdf) +- [PSD na PDF](./psd-to-pdf) diff --git a/docs/pl/tools/webp-to-pdf.md b/docs/pl/tools/webp-to-pdf.md new file mode 100644 index 00000000..41dd4854 --- /dev/null +++ b/docs/pl/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP na PDF +description: Konwertuj obrazy WebP na PDF bezpośrednio w przeglądarce z regulowaną jakością kompresji. +--- + +# WebP na PDF + +Konwertuj format obrazów WebP od Google na PDF. Jest to szczególnie przydatne, gdy pobrane z sieci obrazy są w formacie WebP, a potrzebujesz ich w bardziej uniwersalnym formacie do druku lub udostępniania. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :----- | :----------- | +| WebP | `.webp` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki WebP. +2. Przejrzyj listę plików i usuń te, których nie potrzebujesz. +3. Wybierz poziom **Jakość PDF**. +4. Kliknij **Konwertuj na PDF**. Wynik zostanie pobrany jako `from_webps.pdf`. + +Wewnątrz każdy obraz WebP jest dekodowany przez API canvas przeglądarki, a następnie osadzany w PDF za pomocą pdf-lib. Dzięki temu konwersja działa w każdej przeglądarce obsługującej dekodowanie WebP (wszystkie nowoczesne ją mają). + +## Opcje + +**Jakość PDF** steruje kompresją podczas osadzania obrazów: + +- **Wysoka jakość**: zachowuje najwięcej szczegółów. +- **Średnia jakość** (domyślnie): zrównoważony wynik. +- **Niska jakość**: najmniejszy rozmiar pliku. + +## Zastosowania + +- Konwersja obrazów pobranych z sieci i zapisanych jako WebP na PDF do wydruku +- Pakowanie zrzutów ekranu WebP z Chrome lub Edge do dokumentacji +- Tworzenie portfolio PDF z obrazów eksportowanych z narzędzi graficznych, które domyślnie używają WebP +- Archiwizacja obrazów WebP w bardziej uniwersalnie czytelnym formacie + +## Wskazówki + +- WebP jest wewnętrznie dekodowany do PNG przed osadzeniem w PDF, więc obrazy WebP bezstratne zachowują jakość przy ustawieniu Wysoka. +- Jeśli masz mieszankę WebP i innych formatów obrazów, użyj zamiast tego narzędzia [Obrazy do PDF](./image-to-pdf), które przyjmuje wszystko naraz. + +## Powiązane narzędzia + +- [Obrazy do PDF](./image-to-pdf) +- [PNG na PDF](./png-to-pdf) +- [JPG na PDF](./jpg-to-pdf) diff --git a/docs/pl/tools/word-to-pdf.md b/docs/pl/tools/word-to-pdf.md new file mode 100644 index 00000000..9e616877 --- /dev/null +++ b/docs/pl/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word na PDF +description: Konwertuj dokumenty Word (DOC, DOCX), ODT i RTF na PDF w przeglądarce z pełnym zachowaniem formatowania. +--- + +# Word na PDF + +Konwertuj dokumenty Microsoft Word i zgodne formaty na PDF. Narzędzie używa działającego w przeglądarce silnika LibreOffice, który obsługuje pliki DOC, DOCX, ODT i RTF, zachowując w wyniku formatowanie, tabele, obrazy, nagłówki, stopki i style. + +## Obsługiwane formaty + +| Format | Rozszerzenia | +| :---------------- | :----------- | +| Word (nowoczesny) | `.docx` | +| Word (starszy) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść dokumenty Word. Można wybrać wiele plików naraz. +2. Przejrzyj listę plików i zarządzaj nią. +3. Kliknij **Konwertuj na PDF**. Silnik LibreOffice ładuje się przy pierwszym użyciu (wskaźnik postępu pokazuje stan inicjalizacji), a następnie każdy plik jest konwertowany. +4. Pojedynczy plik jest pobierany bezpośrednio jako PDF. Wiele plików jest pakowanych do `word-converted.zip`. + +## Opcje + +To narzędzie nie ma dodatkowych ustawień. Silnik LibreOffice tworzy wynik przy użyciu domyślnego profilu eksportu PDF. + +## Wynik + +| Liczba plików | Wynik | +| :------------ | :------------------------------------------------------------------- | +| 1 plik | Pobranie jednego PDF (oryginalna nazwa pliku z rozszerzeniem `.pdf`) | +| 2+ plików | Archiwum ZIP (`word-converted.zip`) z jednym PDF dla każdego pliku | + +## Zastosowania + +- Konwersja CV lub listu motywacyjnego z DOCX na PDF przed wysłaniem aplikacji +- Wsadowa konwersja zestawu umów lub ofert na PDF do dostarczenia klientowi +- Zamiana starszych plików `.doc` na nowoczesne pliki PDF do długoterminowej archiwizacji +- Konwersja dokumentów współdzielonych z Dokumentów Google (eksportowanych jako DOCX) na PDF +- Tworzenie gotowych do druku plików PDF z szablonów Word używanych w automatycznym generowaniu dokumentów + +## Wskazówki + +- Silnik LibreOffice jest pobierany raz na sesję i buforowany. Przy pierwszej konwersji należy się spodziewać kilku sekund ładowania, a kolejne będą znacznie szybsze. +- Złożone formatowanie (makra, kontrolki ActiveX, zaawansowane SmartArt) może nie zostać przekonwertowane idealnie. Standardowe elementy dokumentu (tekst, tabele, obrazy, nagłówki, przypisy) konwertują się niezawodnie. +- Ponieważ to narzędzie przyjmuje także ODT i RTF, możesz używać go jako uniwersalnego konwertera wszystkich formatów edytorów tekstu. + +## Powiązane narzędzia + +- [ODT na PDF](./odt-to-pdf) +- [RTF na PDF](./rtf-to-pdf) +- [Excel na PDF](./excel-to-pdf) +- [PowerPoint na PDF](./powerpoint-to-pdf) diff --git a/docs/pl/tools/wpd-to-pdf.md b/docs/pl/tools/wpd-to-pdf.md new file mode 100644 index 00000000..e1d8530b --- /dev/null +++ b/docs/pl/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD na PDF +description: Konwertuj dokumenty WordPerfect (WPD) na PDF w przeglądarce za pomocą LibreOffice. Za darmo i prywatnie. +--- + +# WPD na PDF + +Konwertuj dokumenty Corel WordPerfect na pliki PDF. WPD był kiedyś dominującym formatem edytorów tekstu w kancelariach prawnych i urzędach. Jeśli masz stare pliki WordPerfect, których współczesne oprogramowanie nie chce otworzyć, to narzędzie przywróci je do życia jako standardowe pliki PDF. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :---------- | :----------- | :---------------------------------- | +| WordPerfect | `.wpd` | Wszystkie główne wersje WordPerfect | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki WPD. Można wybrać wiele plików naraz. +2. Przejrzyj listę plików. Usuń niechciane pliki ikoną kosza lub użyj **Dodaj więcej plików**, aby dodać kolejne dokumenty. +3. Kliknij **Konwertuj na PDF**. Narzędzie ładuje w przeglądarce silnik konwersji oparty na LibreOffice, który analizuje format WPD i tworzy PDF. +4. Pojedynczy plik jest pobierany bezpośrednio jako PDF. Konwersje wsadowe dają archiwum ZIP o nazwie `wpd-to-pdf.zip`. + +## Opcje + +Nie jest wymagana żadna konfiguracja. Silnik LibreOffice automatycznie obsługuje formatowanie, czcionki i układ WPD. + +## Zastosowania + +- Otwieranie wieloletnich dokumentów prawnych napisanych w WordPerfect +- Konwersja zarchiwizowanych dokumentów urzędowych z WPD na nowoczesny format +- Migracja starej biblioteki dokumentów WordPerfect do PDF w celu długoterminowego przechowywania +- Udostępnianie plików WPD odbiorcom, którzy nie mają zainstalowanego Corel WordPerfect + +## Wskazówki + +- Silnik LibreOffice ładuje się przy pierwszym użyciu, co chwilę trwa. Kolejne konwersje w tej samej sesji są szybsze. +- Złożone makra WPD i kody ujawniania nie są zachowywane, ale układ wizualny, treść tekstowa i podstawowe formatowanie są przenoszone do PDF. + +## Powiązane narzędzia + +- [WPS na PDF](./wps-to-pdf) +- [ODG na PDF](./odg-to-pdf) diff --git a/docs/pl/tools/wps-to-pdf.md b/docs/pl/tools/wps-to-pdf.md new file mode 100644 index 00000000..3fa90e0c --- /dev/null +++ b/docs/pl/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS na PDF +description: Konwertuj dokumenty Microsoft Works (WPS) na PDF w przeglądarce. Za darmo, bez rejestracji, w pełni prywatnie. +--- + +# WPS na PDF + +Konwertuj pliki edytora tekstu Microsoft Works na PDF. Microsoft Works był dołączany do komputerów konsumenckich pod koniec lat 90. i w latach 2000., a wiele plików WPS nadal leży na starych dyskach i w archiwach poczty. To narzędzie otwiera je w przeglądarce i tworzy czytelne pliki PDF. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :-------------- | :----------- | :------------------------------------- | +| Microsoft Works | `.wps` | Pliki edytora tekstu z Microsoft Works | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki WPS. Można dodać wiele plików. +2. Przejrzyj listę plików. Użyj ikony kosza, aby usunąć pojedyncze pliki, lub kliknij **Dodaj więcej plików**, aby powiększyć partię. +3. Kliknij **Konwertuj na PDF**. Silnik oparty na LibreOffice ładuje się w przeglądarce i konwertuje każdy dokument WPS na PDF. +4. Jeden plik jest pobierany bezpośrednio jako PDF. Wiele plików jest pakowanych do archiwum ZIP o nazwie `wps-to-pdf.zip`. + +## Opcje + +Nie są potrzebne żadne dodatkowe ustawienia. Konwerter obsługuje tekst, podstawowe formatowanie i osadzone obrazy z pliku WPS. + +## Zastosowania + +- Odzyskiwanie starych dokumentów szkolnych lub służbowych zapisanych w formacie Microsoft Works +- Otwieranie załączników WPS w wiadomościach e-mail, gdy nie masz zainstalowanego Microsoft Works +- Konwersja archiwum plików WPS w celu migracji do nowoczesnego systemu dokumentów +- Drukowanie starych dokumentów, których obecne edytory tekstu nie potrafią otworzyć + +## Wskazówki + +- Nie myl plików Microsoft Works `.wps` z plikami WPS Office. To narzędzie jest przeznaczone wyłącznie dla starszego formatu Microsoft Works. +- Silnik LibreOffice ładuje się chwilę przy pierwszym użyciu. Po załadowaniu kolejne konwersje w tej samej sesji działają szybciej. + +## Powiązane narzędzia + +- [WPD na PDF](./wpd-to-pdf) +- [PUB na PDF](./pub-to-pdf) diff --git a/docs/pl/tools/xml-to-pdf.md b/docs/pl/tools/xml-to-pdf.md new file mode 100644 index 00000000..1b99226d --- /dev/null +++ b/docs/pl/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML na PDF +description: Konwertuj pliki XML na uporządkowane dokumenty PDF w przeglądarce. Za darmo, prywatnie, bez przetwarzania na serwerze. +--- + +# XML na PDF + +Konwertuj pliki danych XML na czytelne, uporządkowane dokumenty PDF. Surowy XML jest potężny, ale trudny do czytania dla ludzi. To narzędzie analizuje drzewo XML, rozpoznaje powtarzające się struktury danych i renderuje je jako sformatowane tabele i sekcje w pliku PDF A4 w orientacji poziomej. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----- | :----------- | :------------------------------- | +| XML | `.xml` | Dowolny poprawnie sformowany XML | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki XML. W jednej partii można przetworzyć wiele plików. +2. Przejrzyj listę plików. Usuń niechciane pliki ikoną kosza lub kliknij **Dodaj więcej plików**, aby dodać kolejne. +3. Kliknij **Konwertuj na PDF**. Narzędzie analizuje strukturę XML za pomocą wbudowanego w przeglądarkę DOMParser, analizuje hierarchię danych i renderuje ją do PDF przy użyciu jsPDF z formatowaniem auto-table. +4. Pojedynczy plik jest pobierany jako PDF. Wiele konwersji jest pakowanych do `xml-to-pdf.zip`. + +## Opcje + +Nie jest wymagana ręczna konfiguracja. Konwerter automatycznie wykrywa strukturę XML i dobiera odpowiednie układy tabel. Wynik ma orientację poziomą A4, aby pomieścić szerokie zestawy danych. + +## Zastosowania + +- Zamiana eksportów danych XML z baz danych lub API na raporty do druku +- Tworzenie czytelnych podsumowań z plików konfiguracyjnych XML +- Konwersja faktur lub dzienników transakcji opartych na XML na PDF do celów ewidencji +- Udostępnianie map witryny XML lub kanałów RSS w czytelnej formie dokumentu + +## Wskazówki + +- XML musi być poprawnie sformowany. Jeśli parser napotka błędy składni, konwersja zakończy się opisowym komunikatem wskazującym problem. +- Głęboko zagnieżdżone struktury XML są spłaszczane do tabel. Najlepsze wyniki daje, gdy dane mają powtarzające się elementy sąsiednie o spójnych elementach potomnych. +- Podczas konwersji pojawiają się komunikaty o postępie dla każdej fazy: odczyt, analiza składni, analiza struktury i renderowanie. + +## Powiązane narzędzia + +- [FB2 na PDF](./fb2-to-pdf) +- [XPS na PDF](./xps-to-pdf) +- [E-mail na PDF](./email-to-pdf) diff --git a/docs/pl/tools/xps-to-pdf.md b/docs/pl/tools/xps-to-pdf.md new file mode 100644 index 00000000..70bcc539 --- /dev/null +++ b/docs/pl/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS na PDF +description: Konwertuj dokumenty XPS i OXPS na format PDF w przeglądarce. Bez wysyłania, bez rejestracji, w pełni prywatnie. +--- + +# XPS na PDF + +Konwertuj dokumenty Microsoft XPS i OXPS na standardowe pliki PDF. XPS (XML Paper Specification) był odpowiedzią Microsoftu na PDF, ale jego obsługa na różnych platformach zanikła. To narzędzie sprawia, że takie dokumenty znów można czytać wszędzie. + +## Obsługiwane formaty + +| Format | Rozszerzenie | Uwagi | +| :----- | :----------- | :---------------------------------------------- | +| XPS | `.xps` | Oryginalny format Microsoft XPS | +| OXPS | `.oxps` | Open XPS, wariant zgodny ze standardem ECMA-388 | + +## Jak to działa + +1. Kliknij obszar przesyłania lub przeciągnij i upuść pliki XPS/OXPS. Można wybrać wiele plików naraz. +2. Przejrzyj listę plików. Usuń pojedyncze pliki ikoną kosza lub kliknij **Dodaj więcej plików**, aby dołączyć kolejne dokumenty. +3. Kliknij **Konwertuj na PDF**. Silnik PyMuPDF przetwarza każdy dokument lokalnie w przeglądarce. +4. Pojedynczy plik jest pobierany bezpośrednio jako PDF. Wiele plików jest pakowanych do archiwum ZIP o nazwie `xps-converted.zip`. + +## Opcje + +To narzędzie wykonuje bezpośrednią konwersję formatu bez dodatkowej konfiguracji. Wynik zachowuje oryginalne wymiary stron, grafikę wektorową, czcionki i obrazy ze źródła XPS. + +## Zastosowania + +- Otwieranie plików XPS otrzymanych ze starszych systemów Windows, w których domyślnym sterownikiem drukowania był XPS +- Konwersja dokumentów OXPS z Windows 10/11 w celu udostępnienia ich użytkownikom macOS lub Linuksa +- Archiwizacja starych plików XPS w szerzej obsługiwanym formacie +- Udostępnianie dokumentów urzędowych lub firmowych opartych na XPS odbiorcom zewnętrznym + +## Wskazówki + +- Rozszerzenia `.xps` i `.oxps` są obsługiwane automatycznie, więc można je mieszać w jednej partii. +- Jeśli oryginalny plik XPS powstał ze sterownika drukowania o wysokiej rozdzielczości, wynikowy PDF zachowuje tę jakość. Nie następuje żadne ponowne próbkowanie. + +## Powiązane narzędzia + +- [Word na PDF](./word-to-pdf) +- [XML na PDF](./xml-to-pdf) diff --git a/docs/pt/contributing.md b/docs/pt/contributing.md new file mode 100644 index 00000000..ab24882e --- /dev/null +++ b/docs/pt/contributing.md @@ -0,0 +1,136 @@ +# Contribuindo + +Obrigado pelo seu interesse em contribuir com o BentoPDF! Este guia vai ajudar você a começar. + +## Primeiros Passos + +### Pré-requisitos + +- Node.js 18+ +- npm 9+ +- Git + +### Configuração + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Estrutura do Projeto + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Adicionando uma Nova Ferramenta + +### Passo 1: Crie o Arquivo de Lógica + +Crie `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Passo 2: Crie a Página HTML + +Crie `src/pages/your-tool.html` seguindo os modelos de ferramentas existentes. + +### Passo 3: Registre a Ferramenta + +Adicione em `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Passo 4: Adicione à Configuração de Build + +Adicione a página ao `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Passo 5: Adicione as Traduções + +Adicione entradas a todos os arquivos de idioma em `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Estilo de Código + +- Use TypeScript para todo código novo +- Siga os padrões existentes para manter a consistência +- Execute `npm run format` antes de fazer commit +- Sem comentários no código de produção (os comentários são removidos durante o build) + +## Processo de Pull Request + +1. Crie uma branch de funcionalidade: `git checkout -b feature/your-feature` +2. Faça suas alterações +3. Teste com cuidado: `npm run build` +4. Envie um PR com uma descrição clara + +## Tradução + +Veja [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) para adicionar novos idiomas. + +## Contrato de Licença de Contribuidor + +Antes que seu PR possa ser mesclado, você precisará assinar nosso CLA: + +- [CLA Individual (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA Corporativo (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Obtendo Ajuda + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Comunidade no Discord](https://discord.gg/Bgq3Ay3f2w) + +## Licença + +O BentoPDF tem licenciamento duplo: + +- **AGPL-3.0** para projetos de código aberto em que você compartilha todo o seu código-fonte publicamente +- **Licença Comercial** para aplicações proprietárias/de código fechado - [Obtenha a Licença Vitalícia por $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Ao contribuir, você concorda que suas contribuições serão licenciadas sob esses termos. diff --git a/docs/pt/getting-started.md b/docs/pt/getting-started.md new file mode 100644 index 00000000..dcea4cbb --- /dev/null +++ b/docs/pt/getting-started.md @@ -0,0 +1,80 @@ +# Primeiros Passos + +Bem-vindo ao BentoPDF! Este guia vai ajudar você a começar rapidamente. + +## O que é o BentoPDF? + +O BentoPDF é um kit de ferramentas PDF gratuito, de código aberto e focado em privacidade, que funciona **inteiramente no seu navegador**. Seus arquivos nunca saem do seu dispositivo: todo o processamento acontece localmente com a tecnologia WebAssembly (WASM). + +## Início Rápido + +### Opção 1: Use a Versão Hospedada + +Acesse [bentopdf.com](https://www.bentopdf.com) para usar o BentoPDF na hora, sem instalação. + +### Opção 2: Hospede por Conta Própria com Docker + +> [!IMPORTANT] +> A conversão de arquivos do Office requer `SharedArrayBuffer`, que exige ambos: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - um contexto seguro +> +> `http://localhost` funciona para testes locais porque os navegadores tratam o loopback como confiável. `http://192.168.x.x` ou outros IPs de rede local normalmente não funcionam, então as conversões de Word/Excel/PowerPoint exigirão HTTPS quando acessadas de outros dispositivos da sua rede. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> O BentoPDF vem em duas versões: a **versão Self-Hosted** (`bentopdf-simple`, usada acima) para implantações internas, de equipes e organizações, e a **versão Comercial** (`bentopdf:latest`), usada pelo próprio bentopdf.com e por titulares de licença comercial que mantêm implantações públicas. Ambas incluem as mesmas ferramentas de PDF: a versão Comercial adiciona o hero, o FAQ, os depoimentos e o rodapé do bentopdf.com. Em caso de dúvida, use a versão Self-Hosted. + +Depois, abra `http://localhost:3000` no seu navegador. + +> [!NOTE] +> Se você está preparando uma implantação de OCR isolada da internet (air-gapped), é preciso hospedar internamente as fontes da camada de texto do OCR, além do worker do Tesseract, do runtime principal e dos arquivos traineddata. A configuração completa está documentada em [Self-Hosting](/pt/self-hosting/), incluindo `VITE_OCR_FONT_BASE_URL` e o diretório `ocr-fonts/` incluído. + +### Opção 3: Compile a Partir do Código-Fonte + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Recursos em Resumo + +| Categoria | Ferramentas | +| ---------------------- | --------------------------------------------------------------------- | +| **Converter para PDF** | Word, Excel, PowerPoint, Imagens, Markdown, EPUB, MOBI e mais | +| **Converter de PDF** | JPG, PNG, Texto, Excel, SVG e mais | +| **Editar e Anotar** | Assinar, Destacar, Redigir, Preencher Formulários, Adicionar Carimbos | +| **Organizar** | Mesclar, Dividir, Girar, Excluir Páginas, Reordenar | +| **Otimizar** | Comprimir, Reparar, Nivelar, OCR | +| **Segurança** | Criptografar, Descriptografar, Remover Restrições | + +## Suporte a Navegadores + +O BentoPDF funciona melhor em navegadores modernos: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Próximos Passos + +- [Explore todas as ferramentas](/pt/tools/) +- [Hospede o BentoPDF por conta própria](/pt/self-hosting/) +- [Contribua com o projeto](/pt/contributing) diff --git a/docs/pt/index.md b/docs/pt/index.md new file mode 100644 index 00000000..88365d91 --- /dev/null +++ b/docs/pt/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Ferramentas PDF Gratuitas e de Código Aberto' + tagline: Processe PDFs inteiramente no seu navegador. Sem uploads. Sem servidores. Privacidade total. + actions: + - theme: brand + text: Começar + link: /pt/getting-started + - theme: alt + text: Ver Ferramentas + link: /pt/tools/ + - theme: alt + text: Hospedar por Conta Própria + link: /pt/self-hosting/ + - theme: alt + text: Licença Comercial + link: /pt/licensing + +features: + - icon: 🔒 + title: 100% Privado + details: Seus arquivos nunca saem do seu dispositivo. Todo o processamento acontece localmente no seu navegador usando WebAssembly. + - icon: ⚡ + title: Rápido e Gratuito + details: Sem cadastros, sem limites, sem marcas d'água. Processe PDFs ilimitados de graça, para sempre. + - icon: 🛠️ + title: Mais de 50 Ferramentas + details: Converta, edite, mescle, divida, comprima, assine, aplique OCR e muito mais. Tudo o que você precisa em um só lugar. + + - icon: 🌐 + title: Hospedável por Conta Própria + details: Implante na sua própria infraestrutura. Docker, Vercel, Netlify, AWS ou ambientes totalmente isolados da internet, com workers de OCR, dados de idioma e fontes da camada de texto hospedados por você. +--- + +## OCR Offline + +Se você hospeda o BentoPDF por conta própria em um ambiente isolado da internet ou offline, o OCR precisa de mais do que o worker do Tesseract e os arquivos traineddata. A saída de PDF pesquisável também exige que as fontes da camada de texto do OCR sejam servidas internamente. +Veja [Self-Hosting](/pt/self-hosting/) para a configuração completa, incluindo `VITE_OCR_FONT_BASE_URL`, o diretório `ocr-fonts/` incluído e o fluxo de trabalho air-gapped atualizado. diff --git a/docs/pt/licensing.md b/docs/pt/licensing.md new file mode 100644 index 00000000..571c56b4 --- /dev/null +++ b/docs/pt/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/pt/self-hosting/#configuracao-do-wasm-componentes-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/pt/self-hosting/apache.md b/docs/pt/self-hosting/apache.md new file mode 100644 index 00000000..b8cbc256 --- /dev/null +++ b/docs/pt/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Implantação com Apache + +Hospede o BentoPDF usando o Apache HTTP Server. + +## Pré-requisitos + +- Apache 2.4+ +- mod_rewrite habilitado +- Certificado SSL (recomendado) + +## Passo 1: Compile o Projeto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Para personalizar a marca, defina variáveis de ambiente antes de compilar: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Passo 2: Copie os Arquivos + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Passo 3: Configuração do Apache + +Crie `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Passo 4: .htaccess para Roteamento + +Crie `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Passo 5: Habilite os Módulos Necessários + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Passo 6: Habilite o Site + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Implantação em Subdiretório + +Para hospedar em `/pdf/`: + +1. Compile com a URL base: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Atualize o `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Solução de Problemas + +### Erros 404 de WASM + +Verifique se o tipo MIME está configurado: + +```apache +AddType application/wasm .wasm +``` + +### Assinar PDF ou Preencher Formulários Mostra um Visualizador em Branco (erro de MIME `.mjs`) + +Se o console do navegador mostrar: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…e a requisição com falha termina em `.mjs`, falta na sua configuração do Apache o mapeamento `.mjs → application/javascript`. O visualizador de PDF incluído usa arquivos de módulo ES com extensão `.mjs`, e o `mime.types` padrão do Apache não os inclui por padrão. + +Adicione ao seu VirtualHost ou `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Depois, recarregue o Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Para confirmar: no DevTools do navegador, na aba Network, encontre a requisição `.mjs` com falha e verifique o cabeçalho de resposta `Content-Type`. Ele deve ser `application/javascript`, e não `application/octet-stream`. + +### Rewrite Não Funciona + +Verifique se o mod_rewrite está habilitado: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel para PDF Não Funciona + +O LibreOffice WASM requer `SharedArrayBuffer`, que exige estes cabeçalhos: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Ele também exige um contexto seguro. `http://localhost` funciona para testes locais, mas `http://192.168.x.x` ou outros IPs de rede local normalmente exigem HTTPS. Se os cabeçalhos estiverem presentes, mas `window.crossOriginIsolated` ainda for `false`, verifique se a página está sendo aberta por HTTP simples em uma origem que não seja loopback. + +Os arquivos pré-comprimidos `.wasm.gz` e `.data.gz` também precisam do `Content-Encoding` correto: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Verifique se o `mod_headers` está habilitado: `sudo a2enmod headers` + +### Permissão Negada + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/pt/self-hosting/aws.md b/docs/pt/self-hosting/aws.md new file mode 100644 index 00000000..9bbfe7fe --- /dev/null +++ b/docs/pt/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Implantação na AWS S3 + CloudFront + +Hospede o BentoPDF na AWS para ter o máximo de controle e escalabilidade. + +## Arquitetura + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Passo 1: Crie o Bucket S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Passo 2: Compile e Envie + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Passo 3: Crie a Distribuição do CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Ou use o Console da AWS: + +1. Vá para CloudFront → Create distribution +2. Origin domain: selecione seu bucket S3 +3. Ative "Origin Access Control" +4. Default root object: `index.html` +5. Crie a distribuição + +## Passo 3b: Política de Cabeçalhos de Resposta (Necessária para o LibreOffice WASM) + +As conversões baseadas no LibreOffice (Word, Excel e PowerPoint para PDF) exigem `SharedArrayBuffer`, que precisa de cabeçalhos de resposta específicos. Crie uma Response Headers Policy no CloudFront: + +1. Vá para CloudFront → Policies → Response headers +2. Crie uma política personalizada com estes cabeçalhos: + +| Cabeçalho | Valor | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Anexe a política ao comportamento de cache padrão da sua distribuição + +Ou pela CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Passo 3c: Metadados do S3 para Arquivos WASM Pré-Comprimidos + +Os arquivos WASM do LibreOffice são pré-comprimidos (`.wasm.gz`, `.data.gz`). Defina o Content-Type e o Content-Encoding corretos para que os navegadores os descomprimam: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Importante +Sem a política de cabeçalhos de resposta, o `SharedArrayBuffer` fica indisponível e as conversões do LibreOffice WASM travam em ~55%. Sem o Content-Encoding correto nos arquivos `.gz`, o navegador recebe bytes gzip brutos e a compilação do WASM falha. +::: + +## Passo 4: Política do Bucket S3 + +Permita que o CloudFront acesse o bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Passo 5: Páginas de Erro Personalizadas + +Configure o 404 para retornar `index.html` no roteamento SPA: + +1. CloudFront → Error pages +2. Crie uma resposta de erro personalizada: + - Código de erro HTTP: 404 + - Caminho da página de resposta: `/index.html` + - Código de resposta HTTP: 200 + +## Estimativa de Custos + +| Recurso | Custo Estimado | +| ---------------------------------- | -------------- | +| Armazenamento S3 (~500MB) | ~$0,01/mês | +| CloudFront (1TB de transferência) | ~$85/mês | +| CloudFront (10GB de transferência) | ~$0,85/mês | + +::: tip +Use o S3 Intelligent Tiering para otimizar custos de arquivos acessados com pouca frequência. +::: + +## Automação com Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/pt/self-hosting/cloudflare.md b/docs/pt/self-hosting/cloudflare.md new file mode 100644 index 00000000..461166cf --- /dev/null +++ b/docs/pt/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Implantação no Cloudflare Pages + +O [Cloudflare Pages](https://pages.cloudflare.com) oferece hospedagem estática rápida e global com largura de banda ilimitada. + +## Implantação Rápida + +1. Acesse o [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Clique em "Create a project" +3. Conecte seu repositório do GitHub + +## Configuração de Build + +| Configuração | Valor | +| ---------------------- | --------------- | +| Framework preset | Nenhum | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Variáveis de Ambiente + +Adicione estas em Settings → Environment variables: + +| Variável | Valor | +| ----------------------- | --------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (opcional) | +| `VITE_BRAND_NAME` | Nome de marca personalizado (opcional) | +| `VITE_BRAND_LOGO` | Caminho do logotipo relativo a `public/` (opcional) | +| `VITE_FOOTER_TEXT` | Texto personalizado de rodapé/copyright (opcional) | +| `VITE_DEFAULT_LANGUAGE` | Idioma padrão da interface, p. ex. `fr` (opcional) | + +## Arquivo de Configuração + +Crie `_headers` na sua pasta `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Importante +Os cabeçalhos `Cross-Origin-Embedder-Policy` e `Cross-Origin-Opener-Policy` são necessários para as conversões de Word/ODT/Excel/PowerPoint para PDF. Sem eles, o `SharedArrayBuffer` fica indisponível e o mecanismo LibreOffice WASM não consegue inicializar. +::: + +Crie `_redirects` para o roteamento SPA: + +``` +/* /index.html 200 +``` + +## Domínio Personalizado + +1. Acesse seu projeto no Pages +2. Clique em "Custom domains" +3. Adicione seu domínio +4. O Cloudflare configura o DNS automaticamente se o domínio estiver no Cloudflare + +## Vantagens + +- **Largura de banda ilimitada e gratuita** +- **CDN global** com mais de 300 locais de borda +- **HTTPS automático** +- **Implantações de pré-visualização** para pull requests +- **Builds rápidos** + +## Solução de Problemas + +### Upload de Arquivos Grandes + +O Cloudflare Pages aceita arquivos de até 25 MB. Os módulos WASM devem funcionar bem, mas se você atingir os limites, considere: + +```bash +# Split large files during build +npm run build +``` + +### Limites de Tamanho do Worker + +Se você usa o Cloudflare Workers para roteamento avançado, observe o limite de 1 MB nos planos gratuitos. + +## Worker de Proxy CORS (para Assinaturas Digitais) + +A ferramenta de Assinatura Digital exige um proxy CORS para buscar cadeias de certificados. Implante o worker incluído: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Recursos de Segurança + +| Recurso | Descrição | +| -------------------------------- | -------------------------------------- | +| **Restrições de URL** | Apenas URLs de certificados permitidas | +| **Limite de Tamanho de Arquivo** | Máx. 10MB por requisição | +| **Limitação de Taxa** | 60 req/IP/min (requer KV) | +| **Bloqueio de IP Privado** | Bloqueia localhost e IPs internos | + +### Ativar Limitação de Taxa + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Compile com a URL do Proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Ou com Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Observação:** Veja o [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) para configurar a assinatura HMAC. diff --git a/docs/pt/self-hosting/cors-proxy.md b/docs/pt/self-hosting/cors-proxy.md new file mode 100644 index 00000000..5475cc91 --- /dev/null +++ b/docs/pt/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Proxy CORS para Buscar Certificados + +A ferramenta de assinatura digital usa um proxy CORS para buscar certificados de emissores em Autoridades Certificadoras (CAs) externas. Isso é necessário porque muitos servidores de CA não incluem cabeçalhos CORS nas respostas, o que impede a busca direta pelo navegador. + +Além disso, muitos servidores de CA entregam certificados por HTTP simples. Quando sua instância do BentoPDF é hospedada em HTTPS, os navegadores bloqueiam essas requisições HTTP (política de conteúdo misto). O proxy CORS resolve os dois problemas encaminhando as requisições por um endpoint HTTPS com os cabeçalhos corretos. + +## Como Funciona + +Ao assinar um PDF com um certificado: + +1. A biblioteca `zgapdfsigner` tenta montar uma cadeia de certificados completa +2. Ela busca os certificados dos emissores em URLs incorporadas na extensão AIA (Authority Information Access) do seu certificado +3. Essas requisições passam por um proxy CORS que adiciona os cabeçalhos `Access-Control-Allow-Origin` necessários +4. O proxy devolve os dados do certificado ao navegador + +## Hospedando o Proxy CORS por Conta Própria + +Se você hospeda o BentoPDF por conta própria, precisará implantar seu próprio proxy CORS para que as assinaturas digitais funcionem com certificados que exigem busca da cadeia. + +### Opção 1: Cloudflare Workers (Recomendado) + +1. **Instale a CLI do Wrangler**: + + ```bash + npm install -g wrangler + ``` + +2. **Faça login no Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clone o BentoPDF e atualize as origens permitidas**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Abra `cors-proxy-worker.js` e altere o array `ALLOWED_ORIGINS` para o seu domínio: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Importante + Sem essa alteração, o proxy rejeitará todas as requisições do seu site com um erro **403 Forbidden**. O padrão só permite requisições de `bentopdf.com`. + ::: + +4. **Implante o proxy**: + + ```bash + wrangler deploy + ``` + + Anote a URL do seu worker (p. ex., `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Recompile o BentoPDF com a URL do proxy**: + + Se estiver usando Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Se estiver compilando a partir do código-fonte: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Opção 2: Proxy de Backend Personalizado + +Você também pode criar seu próprio endpoint de proxy. Os requisitos são: + +1. Aceitar requisições GET com um parâmetro de consulta `url` +2. Buscar a URL a partir do seu servidor (sem restrições de CORS no lado do servidor) +3. Devolver a resposta com estes cabeçalhos: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Exemplo de implementação com Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Considerações de Segurança + +O Cloudflare Worker incluído tem várias medidas de segurança: + +| Recurso | Descrição | +| -------------------------------- | ------------------------------------------------------------------------------------------------- | +| **Validação de Origem** | Só permite requisições de domínios listados em `ALLOWED_ORIGINS` | +| **Restrições de URL** | Só permite URLs de certificados (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Bloqueio de IP Privado** | Bloqueia faixas privadas IPv4/IPv6, link-local, loopback, IPs decimais e metadados de nuvem | +| **Segurança de Content-Type** | Só devolve tipos MIME de certificado seguros e bloqueia injeção de content-type vinda do upstream | +| **Limite de Tamanho de Arquivo** | Transmite a resposta com limite de 10MB e interrompe o download se for excedido | +| **Limitação de Taxa** | 60 requisições por minuto por IP ou IPv6 /64 (requer KV, libera o acesso se o KV falhar) | +| **Assinaturas HMAC** | Assinatura opcional no cliente (desestimula abuso casual) | + +### DNS rebinding (hospedagem própria fora do Cloudflare) + +O worker rejeita qualquer URL que resolva para um IP privado ou interno. Ele não pode usar uma lista fixa de hosts permitidos, pois as URLs da cadeia de certificados apontam para a CA que emitiu o certificado (FNMT, CAs corporativas e assim por diante), então os destinos não são conhecidos de antemão. Isso deixa uma pequena janela de rebinding: quem controla o DNS do próprio domínio poderia devolver um IP público na verificação de segurança e um IP privado na requisição real, logo em seguida. + +No Cloudflare isso não é explorável: os Workers não alcançam IPs privados nem o endpoint de metadados `169.254.169.254`, então um rebind não chega a lugar nenhum. Apenas não dê ao worker um caminho de entrada: não anexe um Tunnel, Service ou binding de rede privada (ele só precisa de `RATE_LIMIT_KV`). + +Se você executa isso fora do Cloudflare (workerd, Node e similares) dentro de uma VPC, o runtime _consegue_ alcançar IPs internos. Coloque um firewall de saída na frente dele e bloqueie as faixas privadas: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` e seus equivalentes IPv6. O código da aplicação não consegue impor isso fora do Cloudflare. + +## Desativando o Proxy + +Se você não quer usar um proxy CORS, defina a variável de ambiente como uma string vazia: + +``` +VITE_CORS_PROXY_URL= +``` + +**Observação**: Sem o proxy, a assinatura com certificados que exigem busca externa da cadeia (como FNMT ou algumas CAs corporativas) falhará com o erro "Failed to fetch". + +## Solução de Problemas + +### "Signing error: TypeError: Failed to fetch" + +Isso geralmente significa uma destas situações: + +1. **Nenhum proxy CORS configurado**: defina `VITE_CORS_PROXY_URL` e recompile +2. **Conteúdo misto bloqueado**: seu site usa HTTPS, mas a URL do emissor do certificado usa HTTP. O proxy CORS resolve isso. +3. **Proxy CORS rejeitando sua origem**: verifique se o seu domínio está no array `ALLOWED_ORIGINS` em `cors-proxy-worker.js` + +### "403 Forbidden" vindo do proxy + +Seu domínio não está na lista `ALLOWED_ORIGINS`. Edite `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Depois, implante novamente: `npx wrangler deploy` + +### Testando o proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certificados que Funcionam Sem Proxy + +Alguns certificados incluem a cadeia completa no arquivo P12/PFX e não exigem busca externa: + +- Certificados autoassinados +- Algumas CAs comerciais que incluem certificados intermediários +- Certificados que você montou manualmente com a cadeia completa diff --git a/docs/pt/self-hosting/docker.md b/docs/pt/self-hosting/docker.md new file mode 100644 index 00000000..bda7fd49 --- /dev/null +++ b/docs/pt/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Implantação com Docker / Podman + +A maneira mais fácil de hospedar o BentoPDF por conta própria em um ambiente de produção. + +> [!IMPORTANT] +> **Cabeçalhos Necessários para a Conversão de Arquivos do Office** +> +> As ferramentas baseadas no LibreOffice (conversão de Word, Excel e PowerPoint) exigem estes cabeçalhos HTTP para dar suporte a `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> A página também precisa ser servida em um contexto seguro. `http://localhost` funciona para testes locais, mas `http://192.168.x.x` ou outros IPs de rede local normalmente não se qualificam, então a conversão do Office por HTTP simples falhará mesmo com os cabeçalhos presentes. +> +> As imagens de contêiner oficiais já incluem esses cabeçalhos. Se você usa um proxy reverso (Traefik, Caddy etc.), garanta que esses cabeçalhos sejam preservados ou adicionados, e use HTTPS para acessos que não sejam de loopback. + +> [!TIP] +> **Usuários do Podman:** todos os comandos `docker` funcionam com o Podman substituindo `docker` por `podman` e `docker-compose` por `podman-compose`. + +## Início Rápido + +> [!TIP] +> O BentoPDF vem em duas versões: +> +> - **Versão Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Todas as ferramentas de PDF, **sem** a parte de marketing (sem hero, FAQ, depoimentos nem rodapé). Use para implantações internas, de equipes e organizações. **Não** é uma versão "lite" com menos recursos. +> - **Versão Comercial**: `ghcr.io/alam00000/bentopdf:latest`. O site de marketing completo, usado pelo próprio bentopdf.com e por titulares de licença comercial que mantêm implantações públicas. +> +> Em caso de dúvida: baixe a versão Self-Hosted. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Crie o `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Execute: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Crie Sua Própria Imagem + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Compile e execute: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Variáveis de Ambiente + +| Variável | Descrição | Padrão | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Compila a variante Self-Hosted (oculta a parte de marketing do bentopdf.com: hero, FAQ, depoimentos e rodapé). Todas as ferramentas de PDF permanecem. | `false` | +| `BASE_URL` | Implantar em subdiretório | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL do módulo WASM do PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL do módulo WASM do Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL do módulo WASM do CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL do script do worker de OCR | _(vazio; usa a CDN padrão do Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Diretório do runtime principal do OCR | _(vazio; usa a CDN padrão do Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Diretório traineddata do OCR | _(vazio; usa a CDN padrão do Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Idiomas de OCR separados por vírgula exibidos na interface | _(vazio; mostra o catálogo completo)_ | +| `VITE_OCR_FONT_BASE_URL` | Diretório de fontes da camada de texto do OCR | _(vazio; usa as URLs remotas de fontes Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Idioma padrão da interface | `en` | +| `VITE_BRAND_NAME` | Nome de marca personalizado | `BentoPDF` | +| `VITE_BRAND_LOGO` | Caminho do logotipo relativo a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Texto personalizado de rodapé/copyright | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | IDs de ferramentas separados por vírgula a ocultar | _(vazio; todas as ferramentas ativadas)_ | +| `DISABLE_GITHUB_STARS` | Pula a busca da contagem de estrelas do GitHub ao carregar a página e remove `api.github.com` da CSP. As versões Simple Mode sempre a dispensam. | `false` | +| `SITE_URL` | URL pública gravada nos links canonical, hreflang e sitemap. Mantenha o padrão, a menos que queira que os mecanismos de busca tratem sua implantação como um site próprio. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Com um `SITE_URL` personalizado, todas as páginas são marcadas como `noindex` para que sua cópia não concorra com o bentopdf.com nos resultados de busca. Defina como `true` para permitir a indexação pelos mecanismos de busca. | `false` | + +As URLs dos módulos WASM vêm pré-configuradas com padrões de CDN, então todos os recursos avançados funcionam sem configuração. Substitua-as em implantações isoladas da internet (air-gapped) ou hospedadas por conta própria. + +### Mecanismos de busca + +Por padrão, cada página indica aos mecanismos de busca o bentopdf.com como original, para que sua implantação não apareça como duplicada. Você não precisa mudar nada em uma instância privada ou interna. + +- **Manter sua instância fora dos resultados de busca:** execute o contêiner com `-e ROBOTS_NOINDEX=true`. Isso exige apenas uma reinicialização, não uma recompilação. +- **Fazer da sua instância um site próprio nos resultados de busca:** compile com `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Sem `ALLOW_INDEXING=true`, um `SITE_URL` personalizado marca todas as páginas como `noindex`. + +### Content-Security-Policy + +A imagem do nginx vem com um cabeçalho `Content-Security-Policy` em modo de aplicação. As diretivas `script-src`, `connect-src` e `font-src` da CSP são **geradas em tempo de build** a partir das variáveis de URL `VITE_*` acima: os hosts que você passar via `--build-arg` são adicionados automaticamente à política. + +Como resultado: + +- Se você substituir `VITE_CORS_PROXY_URL` ou `VITE_WASM_*_URL` em tempo de build, a CSP permite essas origens automaticamente, sem configuração extra. +- Para URLs em `cdn.jsdelivr.net`, o `script-src` permite apenas a pasta exata do pacote com versão, por exemplo `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, e não a CDN inteira. O jsDelivr serve qualquer pacote npm público ou repositório do GitHub, então permitir o host inteiro deixaria qualquer um deles rodar na sua instância. URLs em qualquer outro host são permitidas por origem. +- Se você configurar URLs WASM personalizadas em _tempo de execução_ pela página de Configurações Avançadas do app, essas origens **não** estarão na CSP e o navegador bloqueará as requisições a elas. Isso vale também para uma versão diferente do mesmo pacote em `cdn.jsdelivr.net`, pois só a versão definida em tempo de build é permitida. A configuração em tempo de execução serve para experimentação; para URLs personalizadas permanentes, defina o build arg `VITE_*` correspondente. +- Em implantações air-gapped que substituem os três valores `VITE_WASM_*_URL`, essas pastas de pacote de `cdn.jsdelivr.net` também são removidas da CSP (cada padrão é substituído, não acrescentado). Os padrões do Tesseract OCR em `cdn.jsdelivr.net` permanecem na política até que você defina também os três valores `VITE_TESSERACT_*`. Da mesma forma, definir `VITE_CORS_PROXY_URL` substitui o padrão público `bentopdf-cors-proxy.bentopdf.workers.dev`. + +A CSP inclui `'unsafe-eval'` no `script-src` porque o runtime do LibreOffice WASM (usado pelas ferramentas de conversão de Word/Excel/PowerPoint) e a biblioteca de imagens wasm-vips (usada em PDF para TIFF) compilam código interno de despacho via `new Function()`. Removê-lo quebraria essas ferramentas. Se você compila em `SIMPLE_MODE` (sem LibreOffice) e não precisa de PDF para TIFF, pode editar manualmente o `security-headers.conf` gerado para remover `'unsafe-eval'` e obter uma política mais restrita. + +Para o OCR, deixe as variáveis `VITE_TESSERACT_*` vazias para usar os recursos online padrão, ou defina as três juntas para OCR hospedado por conta própria/offline. Substituições parciais do OCR são rejeitadas porque o worker, o runtime principal e o diretório traineddata precisam corresponder. Para uma saída de PDF pesquisável totalmente offline, defina também `VITE_OCR_FONT_BASE_URL`, de modo que as fontes da camada de texto do OCR sejam carregadas do seu servidor interno e não das URLs públicas de fontes Noto. + +`VITE_DEFAULT_LANGUAGE` define o idioma da interface para quem visita pela primeira vez. Valores aceitos: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Os usuários ainda podem trocar de idioma; isso só muda o padrão. + +Exemplo: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Marca Personalizada + +Substitua o logotipo, o nome e o texto de rodapé padrão do BentoPDF pelos seus. Coloque seu arquivo de logotipo na pasta `public/` (ou use uma imagem existente) e passe as variáveis de marca em tempo de build: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +A marca personalizada funciona tanto no modo completo quanto no Simple Mode, e pode ser combinada com todas as outras opções de build. + +### Desativando Ferramentas Específicas + +Oculte ferramentas da interface por requisitos de conformidade ou segurança. As ferramentas desativadas são removidas da página inicial, dos resultados de busca, dos atalhos de teclado e do construtor de fluxos de trabalho. O acesso direto pela URL mostra uma página de "ferramenta indisponível". + +Os IDs das ferramentas são a URL da página sem `.html`. Por exemplo, se a ferramenta está em `bentopdf.com/edit-pdf.html`, o ID é `edit-pdf`. + +#### Encontrando os IDs das Ferramentas + +O jeito mais fácil: abra qualquer ferramenta no BentoPDF e olhe a URL. A última parte do caminho (sem `.html`) é o ID da ferramenta. + +
+Lista completa de IDs das ferramentas + +**Editar e Anotar:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Converter para PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Converter de PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organizar e Gerenciar:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Otimizar e Reparar:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Segurança:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Opção 1: Em tempo de build (build arg do Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Isso embute a lista de desativadas no bundle JavaScript. Mudar exige uma recompilação. + +#### Opção 2: Em tempo de execução (config.json) + +Monte um arquivo `config.json` no diretório servido, sem precisar recompilar: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Ou com Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Os dois métodos podem ser combinados: as listas são mescladas. Se uma ferramenta aparecer em qualquer uma delas, ela é desativada. + +#### Desativando Recursos do Editor + +Você também pode desativar recursos específicos dentro do Editor de PDF (p. ex., redação, anotações, formulários) sem desativar a ferramenta de edição inteira. Adicione `editorDisabledCategories` ao seu `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Lista completa de categorias do editor + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Anotação:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Formas:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulário:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Redação:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Documento:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Página:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Painel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Ferramentas:** `tools`, `pan`, `pointer`, `capture` + +**Seleção:** `selection`, `selection-copy` + +**Histórico:** `history`, `history-undo`, `history-redo` + +
+ +As categorias são hierárquicas: desativar uma categoria pai (p. ex., `annotation`) desativa todas as suas filhas. + +### Desativando o Contador de Estrelas do GitHub + +A barra de navegação mostra a contagem de estrelas do GitHub em tempo real, buscada em `api.github.com` ao carregar a página. É a única requisição externa que não atende a um recurso de PDF. Desative-a em tempo de build para remover o código de busca do bundle e tirar `api.github.com` da Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +As versões Simple Mode (`bentopdf-simple`) sempre dispensam o contador de estrelas; essa opção só é necessária na versão Comercial ou em builds completos personalizados. + +### URLs WASM Personalizadas (Air-Gapped / Hospedagem Própria) + +> [!IMPORTANT] +> As URLs WASM são embutidas no JavaScript em **tempo de build**. Os arquivos WASM são baixados pelo **navegador do usuário** em tempo de execução: o Docker não os baixa durante o build. Em redes air-gapped, você precisa hospedar os arquivos WASM em um servidor interno que os navegadores consigam alcançar. + +**Fluxo de trabalho air-gapped completo:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Use os códigos exibidos por `bash scripts/prepare-airgap.sh --list-ocr-languages`, ou busque pelo nome com `bash scripts/prepare-airgap.sh --search-ocr-language `, em `--ocr-languages`. Ao compilar com um subconjunto restrito de OCR, passe os mesmos códigos para `VITE_TESSERACT_AVAILABLE_LANGUAGES` para que o app mostre apenas os idiomas incluídos. Para uma saída de OCR totalmente offline, hospede também o diretório `ocr-fonts/` incluído e aponte `VITE_OCR_FONT_BASE_URL` para ele. + +Defina uma variável como string vazia para desativar esse módulo (os usuários precisarão configurar manualmente em Configurações Avançadas). + +## Porta Personalizada + +Por padrão, o BentoPDF escuta na porta `8080` dentro do contêiner. Para mudar isso, defina a variável de ambiente `PORT` em tempo de execução: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variável | Descrição | Padrão | +| -------- | ------------------------------------- | ------ | +| `PORT` | Porta de escuta do Nginx no contêiner | `8080` | + +Isso funciona tanto com o Dockerfile padrão quanto com o nonroot. + +## ID de Usuário Personalizado (PUID/PGID) + +Para ambientes que exigem execução como um usuário específico que não seja root (dispositivos NAS, Kubernetes com contextos de segurança, políticas organizacionais), o BentoPDF oferece um Dockerfile separado com suporte a PUID/PGID no estilo LSIO. + +### Compile e Execute + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Variáveis de Ambiente + +| Variável | Descrição | Padrão | +| -------------- | ------------------------- | ------- | +| `PUID` | ID do usuário de execução | `1000` | +| `PGID` | ID do grupo de execução | `1000` | +| `PORT` | Porta de escuta do Nginx | `8080` | +| `DISABLE_IPV6` | Desativar o listener IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Como Funciona + +O contêiner inicia como root, cria um usuário com o PUID/PGID especificado, ajusta a propriedade de todos os diretórios graváveis e depois reduz os privilégios usando `su-exec`. O processo do nginx roda inteiramente como o usuário que você especificou. + +> [!NOTE] +> O `Dockerfile` padrão usa `nginx-unprivileged` (UID 101) e é recomendado para a maioria das implantações. Use o `Dockerfile.nonroot` apenas quando precisar de um UID/GID específico. + +> [!WARNING] +> PUID/PGID não podem ser `0` (root). O entrypoint valida as entradas e encerra com erro para valores inválidos. + +## Com Traefik (Proxy Reverso) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Com Caddy (Proxy Reverso) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Limites de Recursos + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (Integração com Systemd) + +O [Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) permite executar contêineres do Podman como serviços do systemd. É ideal para implantações de produção em sistemas Linux. + +### Configuração Básica do Quadlet + +Crie um arquivo de unidade de contêiner em `~/.config/containers/systemd/bentopdf.container` (usuário) ou `/etc/containers/systemd/bentopdf.container` (sistema): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Habilite e Inicie + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Para implantação em todo o sistema, use `systemctl` sem a flag `--user` e coloque o arquivo em `/etc/containers/systemd/`. + +### Quadlet com Health Check + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Atualização Automática com Quadlet + +O Podman pode atualizar contêineres automaticamente quando houver novas imagens disponíveis: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Configuração de Rede do Quadlet + +Para uma configuração de rede personalizada, crie um arquivo de rede `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Depois, referencie-o no seu arquivo de contêiner: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Atualizando + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/pt/self-hosting/hostinger.md b/docs/pt/self-hosting/hostinger.md new file mode 100644 index 00000000..29b74087 --- /dev/null +++ b/docs/pt/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Implantação na Hostinger + +A [Hostinger](https://hostinger.com) é um provedor popular de hospedagem compartilhada. Este guia explica como implantar o BentoPDF na hospedagem compartilhada da Hostinger. + +## Pré-requisitos + +- Plano de hospedagem da Hostinger com acesso ao gerenciador de arquivos +- Node.js instalado localmente para compilar + +## Passo 1: Compile o Projeto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Os arquivos compilados ficarão na pasta `dist`. + +## Passo 2: Envie para a Hostinger + +### Implantação no Domínio Raiz + +1. Entre na sua conta da Hostinger +2. Vá para **File Manager** → **public_html** +3. **Exclua** os arquivos existentes (faça backup, se necessário) +4. **Envie** todo o conteúdo da sua pasta local `dist` para `public_html` + +### Implantação em Subdiretório + +Se for implantar em um subdiretório (p. ex., `yourdomain.com/pdf-tools/`): + +1. Compile com a URL base correta: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Crie a pasta na Hostinger: + - Vá para **File Manager** → **public_html** + - Crie uma nova pasta: `pdf-tools` +3. Envie todo o conteúdo de `dist` para `public_html/pdf-tools/` + +## Passo 3: Crie o Arquivo .htaccess + +Crie um arquivo `.htaccess` na raiz da sua pasta de implantação (`public_html` ou `public_html/pdf-tools/`): + +::: warning Importante +Para implantação em subdiretório, altere `RewriteBase /` para `RewriteBase /pdf-tools/` (ou o nome da sua pasta). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Exemplo de .htaccess para Subdiretório + +Para `yourdomain.com/pdf-tools/`, atualize estas linhas: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Solução de Problemas + +### Arquivos WASM Não Carregam + +Verifique se os tipos MIME estão definidos corretamente no `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Ferramentas do LibreOffice Não Funcionam + +Os cabeçalhos de segurança são essenciais para o SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Se os cabeçalhos não estiverem sendo aplicados, entre em contato com o suporte da Hostinger para habilitar o `mod_headers`. + +### Erros 404 ao Atualizar a Página + +Verifique se a regra da extensão `.html` e as rotas de idioma estão configuradas corretamente. O BentoPDF usa arquivos HTML estáticos, não roteamento SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limites de Upload de Arquivos + +A Hostinger pode ter limites de tamanho de arquivo. Envie os arquivos WASM separadamente se o upload em massa falhar. diff --git a/docs/pt/self-hosting/index.md b/docs/pt/self-hosting/index.md new file mode 100644 index 00000000..da6c1e68 --- /dev/null +++ b/docs/pt/self-hosting/index.md @@ -0,0 +1,538 @@ +# Guia de Auto-Hospedagem + +O BentoPDF pode ser auto-hospedado na sua própria infraestrutura. Este guia cobre várias opções de implantação. + +## Início Rápido com Docker / Podman + +A forma mais rápida de auto-hospedar o BentoPDF: + +> [!TIP] +> O BentoPDF é distribuído em duas versões: +> +> - **Versão Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Todas as ferramentas de PDF, **sem** os elementos de marketing (sem hero, FAQ, depoimentos nem rodapé). Use esta para implantações internas, de equipe ou de organização. **Não** é uma versão "lite" com menos recursos. +> - **Versão Commercial**: `ghcr.io/alam00000/bentopdf:latest`. O site de marketing completo, usado pelo próprio bentopdf.com e por detentores de licença comercial que executam implantações voltadas ao público. +> +> Na dúvida: use a versão Self-Hosted. + +> [!IMPORTANT] +> A conversão de arquivos do Office exige `SharedArrayBuffer`, o que significa que o aplicativo precisa estar isolado de origem cruzada (cross-origin isolated) e ser servido a partir de um contexto seguro. A imagem oficial já envia os cabeçalhos COOP/COEP necessários, mas os navegadores ainda desativam o `SharedArrayBuffer` em origens HTTP simples da rede local, como `http://192.168.x.x`. +> +> Use `http://localhost` apenas para testes no mesmo dispositivo. Se os usuários acessarem o BentoPDF por um IP ou nome de host da rede local, termine a conexão com HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Ou com Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Execute o BentoPDF como um serviço do systemd. Crie `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Veja o [guia de implantação com Docker](/pt/self-hosting/docker) para a documentação completa do Quadlet. + +## Compilando a Partir do Código-Fonte + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Opções de Configuração + +### Versão Self-Hosted (Simple Mode) + +A versão Self-Hosted (a imagem `bentopdf-simple`, também chamada de Simple Mode) é **funcionalmente idêntica** à versão Commercial: todas as ferramentas de PDF estão presentes e se comportam da mesma forma. Ela apenas oculta os elementos de marketing que só fazem sentido no próprio bentopdf.com ou em uma implantação comercial voltada ao público. **Não é uma versão "lite" nem com menos recursos.** + +**O que a versão Self-Hosted oculta** (apenas visual, nenhum recurso de PDF é removido): + +- Barra de navegação, seção hero, seção de recursos, FAQ, depoimentos, rodapé +- Altera o título da página para "Ferramentas PDF" + +**O que a versão Self-Hosted mantém** (tudo o que de fato trabalha com PDF): + +- Todas as ferramentas de PDF (mesclar, dividir, editar, assinar, OCR, conversão do Office etc.) +- Suporte a marca personalizada e toda a configuração em tempo de compilação e de execução + +A versão Commercial (`ghcr.io/alam00000/bentopdf:latest`) é a que alimenta o próprio bentopdf.com e é usada por detentores de licença comercial que executam implantações voltadas ao público. Ela acrescenta o hero, o FAQ, os depoimentos e o rodapé, que não fariam sentido em uma ferramenta interna. + +Se você está auto-hospedando o BentoPDF para sua equipe, sua organização ou como ferramenta interna, use a versão Self-Hosted: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Veja [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) para mais detalhes. + +### Versão Commercial (implantações voltadas ao público com sua própria marca) + +A versão Commercial (a imagem `bentopdf`, sem o sufixo `-simple`) é a que alimenta o próprio bentopdf.com. Ela inclui o site de marketing completo (hero, recursos, FAQ, depoimentos, rodapé) além de todas as ferramentas de PDF. Use esta versão quando quiser **implantar o BentoPDF como um serviço de PDF voltado ao público, sob sua própria marca**, por exemplo: + +- Você executa o BentoPDF como um SaaS hospedado para usuários finais no seu próprio domínio +- Você quer a experiência de landing page (seções de marketing + ferramentas), e não apenas a interface básica das ferramentas +- Você é detentor de licença comercial e incorpora o BentoPDF em um produto comercial + +**Execute como está** (com a marca BentoPDF, útil para visualizar a versão): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Compile com a sua própria marca** (o fluxo comercial típico): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Todas as outras opções de tempo de compilação (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, substituições de URL do WASM etc.) funcionam da mesma forma que na versão Self-Hosted. + +::: warning Licenciamento +Executar a versão Commercial é permitido sob qualquer uma das duas opções de licença do BentoPDF: + +- **AGPL-3.0** (gratuita): permitida se a sua implantação publicar todo o seu código-fonte sob AGPL, incluindo quaisquer modificações de marca e a lógica de negócio associada. +- **Licença comercial** ($79 vitalícia): necessária para implantações proprietárias ou de código fechado, em que você não abre o código do seu fork de marca nem do seu código de negócio. + +Veja a [página de Licenciamento](https://www.bentopdf.com/licensing) para a comparação completa. Os módulos WASM licenciados sob AGPL (PyMuPDF, Ghostscript, CoherentPDF) são carregados de uma CDN em tempo de execução, portanto não entram na sua imagem e não alteram a sua situação de licenciamento. +::: + +### URL Base + +Implante em um subdiretório: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Marca Personalizada + +Substitua o logotipo, o nome e o texto de rodapé padrão do BentoPDF pelos seus em tempo de compilação: + +| Variável | Descrição | Padrão | +| ------------------ | ----------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Nome da marca exibido no cabeçalho e no rodapé | `BentoPDF` | +| `VITE_BRAND_LOGO` | Caminho do logotipo relativo a `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Texto personalizado de rodapé/direitos autorais | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Ou via Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +A marca personalizada funciona tanto no modo completo quanto no Simple Mode e pode ser combinada com todas as outras opções de tempo de compilação (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Desativando Ferramentas Específicas + +Oculte ferramentas individuais por conformidade ou segurança. As ferramentas desativadas são removidas da página inicial, da busca, dos atalhos, do construtor de fluxos e do acesso direto por URL. + +Os IDs das ferramentas são a URL da página sem `.html`: abra qualquer ferramenta e veja a URL (ex.: `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Em tempo de compilação** (incorporado ao pacote): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Em tempo de execução** (sem recompilar, monte um `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Os dois métodos podem ser combinados: as listas são mescladas. + +Você também pode desativar recursos específicos dentro do Editor de PDF (ex.: redação) sem desativar a ferramenta inteira, adicionando `editorDisabledCategories` ao `config.json`. Veja o [guia do Docker](/pt/self-hosting/docker#desativando-recursos-do-editor) para a lista completa de categorias. + +## Guias de Implantação + +Escolha sua plataforma: + +- [Vercel](/pt/self-hosting/vercel) +- [Netlify](/pt/self-hosting/netlify) +- [Cloudflare Pages](/pt/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/pt/self-hosting/aws) +- [Hostinger](/pt/self-hosting/hostinger) +- [Nginx](/pt/self-hosting/nginx) +- [Apache](/pt/self-hosting/apache) +- [Docker](/pt/self-hosting/docker) +- [Kubernetes](/pt/self-hosting/kubernetes) +- [CORS Proxy](/pt/self-hosting/cors-proxy): necessário para assinaturas digitais + +## Problemas Comuns + +### Word / ODT / Excel / PowerPoint para PDF Trava (SharedArrayBuffer Indisponível) + +**Sintoma**: as conversões de documentos baseadas em LibreOffice (Word, ODT, Excel, PowerPoint para PDF) travam em ~55% ou não iniciam. O console do navegador pode mostrar: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…ou `window.crossOriginIsolated` retorna `false`, ou a compilação do WASM informa `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Causa**: o LibreOffice WASM exige `SharedArrayBuffer`, que o navegador só habilita quando a página está **isolada de origem cruzada (cross-origin isolated)** E é servida a partir de um **contexto seguro**. Isso significa que duas condições precisam ser verdadeiras: + +1. Toda resposta inclui ambos os cabeçalhos: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. A página é servida a partir de `https://...` ou `http://localhost`. HTTP simples em um IP da rede local (ex.: `http://192.168.x.x`) NÃO conta como seguro: os navegadores desativam o `SharedArrayBuffer` nesse caso. + +A divergência `00 61 73 6d / 1f 8b 08 08` é um subsintoma separado: os arquivos pré-comprimidos `.wasm.gz` / `.data.gz` estão sem o cabeçalho de resposta `Content-Encoding: gzip`, então o navegador recebe bytes gzip brutos em vez do WASM descompactado. + +**Correção**: veja o guia de implantação da sua plataforma para a configuração exata: + +- [Nginx →](/pt/self-hosting/nginx#conversao-de-word-odt-excel-para-pdf-nao-funciona) +- [Apache →](/pt/self-hosting/apache#word-odt-excel-para-pdf-nao-funciona) +- [AWS S3 + CloudFront →](/pt/self-hosting/aws#passo-3b-politica-de-cabecalhos-de-resposta-necessaria-para-o-libreoffice-wasm) +- [Cloudflare Pages →](/pt/self-hosting/cloudflare#arquivo-de-configuracao) (arquivo `_headers`) +- [Netlify →](/pt/self-hosting/netlify#conversao-de-word-odt-excel-para-pdf-travada-em-55) (`netlify.toml`) +- [Vercel →](/pt/self-hosting/vercel#conversao-de-word-odt-excel-para-pdf-nao-funciona) (`vercel.json`) +- [Hostinger →](/pt/self-hosting/hostinger#ferramentas-do-libreoffice-nao-funcionam) (`.htaccess`) +- [Kubernetes →](/pt/self-hosting/kubernetes#garantindo-que-os-cabecalhos-do-sharedarraybuffer-continuem-funcionando-ingress-gateway) +- **Docker**: tratado automaticamente pela configuração nginx incluída, sem necessidade de ação. + +**Verificação**: abra o Console do DevTools em qualquer página do BentoPDF e execute: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Se a página for HTTPS ou `http://localhost` E ambos os cabeçalhos COEP/COOP estiverem presentes em todas as respostas, as duas verificações passam. Se você estiver em `http://192.168.x.x` ou outra origem HTTP que não seja de loopback, termine a conexão com HTTPS: não existe correção apenas por cabeçalhos. + +### Arquivos `.mjs` Servidos como `application/octet-stream` + +**Sintoma**: Sign PDF / Form Filler / algumas outras ferramentas mostram um visualizador em branco ou não carregam. O console do navegador informa: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Causa**: seu servidor web ou proxy reverso não tem um mapeamento de tipo MIME para arquivos `.mjs` (o visualizador de PDF incluído traz módulos ES com essa extensão). Muitas configurações padrão de servidor usam `application/octet-stream` para extensões desconhecidas, e os navegadores se recusam a executá-las como módulos ES. + +**Correção**: veja o guia de implantação da sua plataforma para o trecho exato: + +- [Nginx →](/pt/self-hosting/nginx#sign-pdf-ou-form-filler-mostra-um-visualizador-em-branco-erro-de-mime-de-mjs) +- [Apache →](/pt/self-hosting/apache#assinar-pdf-ou-preencher-formularios-mostra-um-visualizador-em-branco-erro-de-mime-mjs) +- [AWS S3 + CloudFront →](/pt/self-hosting/aws#passo-2-compile-e-envie) (veja `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/pt/self-hosting/kubernetes#erros-de-tipo-mime-de-mjs-iframe-em-branco-no-sign-pdf-form-filler) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: tratados automaticamente, sem necessidade de ação. + +**Verificação**: abra o DevTools → aba Network, encontre a requisição `.mjs` com falha e verifique o cabeçalho de resposta `Content-Type`. Ele deve ser `application/javascript`. Se ainda for `application/octet-stream`, um proxy reverso ou CDN externo pode estar reinterpretando o tipo: verifique cada camada da sua cadeia de entrega. + +## Configuração do WASM (Componentes AGPL) + +O BentoPDF **não inclui** bibliotecas de processamento licenciadas sob AGPL em seu código-fonte, mas **pré-configura URLs de CDN** para que todos os recursos funcionem de imediato, sem configuração manual. + +::: tip Zero Configuração por Padrão +A partir da v2.0.0, os módulos WASM vêm pré-configurados para carregar da CDN do jsDelivr por meio de variáveis de ambiente. Todos os recursos avançados funcionam imediatamente, sem nenhuma configuração do usuário. +::: + +| Componente | Licença | Recursos | +| --------------- | -------- | ------------------------------------------------------------------------ | +| **PyMuPDF** | AGPL-3.0 | Conversão de EPUB/MOBI/FB2/XPS, extração de imagens, extração de tabelas | +| **Ghostscript** | AGPL-3.0 | Conversão para PDF/A, compressão, correção de inclinação, rasterização | +| **CoherentPDF** | AGPL-3.0 | Índice, anexos, mesclagem de PDF com marcadores | + +### Variáveis de Ambiente Padrão + +Estas são definidas em `.env.production` e incorporadas à compilação: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Substituindo as URLs do WASM + +Você pode substituir os padrões em tempo de compilação para implantações personalizadas: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Para desativar um módulo por completo (exigindo configuração manual do usuário em Configurações Avançadas), defina sua variável como uma string vazia. + +Para OCR, deixe todas as variáveis `VITE_TESSERACT_*` vazias e mantenha os recursos online padrão, ou defina juntas as URLs de worker/core/lang para OCR auto-hospedado/offline. Se você incluir apenas idiomas de OCR específicos, defina também `VITE_TESSERACT_AVAILABLE_LANGUAGES` com os mesmos códigos separados por vírgula, para que a interface ofereça só os idiomas instalados e seleções não compatíveis falhem com um erro descritivo. Para uma saída de PDF pesquisável totalmente offline, defina também `VITE_OCR_FONT_BASE_URL` com o diretório interno que serve as fontes de OCR incluídas. + +Os usuários também podem substituir esses padrões a qualquer momento em **Configurações Avançadas** na interface: as substituições do usuário armazenadas no navegador têm prioridade sobre os padrões do ambiente. + +### Implantação Air-Gapped / Offline + +Para redes sem acesso à internet (governo, saúde, setor financeiro etc.). As URLs do WASM são incorporadas ao JavaScript em **tempo de compilação**, e os arquivos WASM em si são baixados pelo **navegador do usuário** em tempo de execução. Portanto, você precisa preparar tudo em uma máquina com internet e depois transferir para a rede isolada. + +#### Script Automatizado (Recomendado) + +O script incluído `prepare-airgap.sh` automatiza todo o processo: baixa os pacotes WASM, compila a imagem Docker e produz um pacote autocontido com um script de configuração. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Isso produz um diretório de pacote: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Transfira o pacote para a rede isolada por USB, repositório interno de artefatos ou outro método aprovado. Em seguida, execute o script de configuração incluído: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +O script de configuração carrega a imagem Docker, extrai os arquivos WASM e, opcionalmente, inicia o contêiner. + +**Opções do script:** + +| Flag | Descrição | Padrão | +| ------------------------------ | ----------------------------------------------------------------- | -------------------------------------- | +| `--wasm-base-url ` | Onde os WASMs serão hospedados internamente | _(obrigatório, solicitado se ausente)_ | +| `--image-name ` | Tag da imagem Docker | `bentopdf` | +| `--output-dir ` | Diretório de saída do pacote | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Ativa o Simple Mode | desativado | +| `--base-url ` | URL base do subdiretório (ex.: `/pdf/`) | `/` | +| `--language ` | Idioma padrão da interface (ex.: `fr`, `de`) | _(nenhum)_ | +| `--brand-name ` | Nome de marca personalizado | _(nenhum)_ | +| `--brand-logo ` | Caminho do logotipo relativo a `public/` | _(nenhum)_ | +| `--footer-text ` | Texto de rodapé personalizado | _(nenhum)_ | +| `--ocr-languages ` | Idiomas de OCR a incluir, separados por vírgula | `eng` | +| `--list-ocr-languages` | Exibe os códigos e nomes de OCR compatíveis e sai | desativado | +| `--search-ocr-language ` | Busca códigos de OCR por nome ou abreviação | desativado | +| `--dockerfile ` | Dockerfile a usar | `Dockerfile` | +| `--skip-docker` | Pula a compilação e exportação do Docker | desativado | +| `--skip-wasm` | Pula o download do WASM (reutiliza os arquivos `.tgz` existentes) | desativado | + +O prompt interativo também aceita `list` para exibir a lista completa de códigos do Tesseract compatíveis e `search ` para encontrar correspondências, como `search german` ou `search chi`. + +::: warning Requisito de Mesma Origem +Os arquivos WASM devem ser servidos da **mesma origem** do aplicativo BentoPDF. Os Web Workers usam `importScripts()`, que não consegue carregar scripts de outra origem. Por exemplo, se o BentoPDF roda em `https://internal.example.com`, a URL base do WASM também deve ser `https://internal.example.com/wasm`. +::: + +#### Passos Manuais + +
+Se você prefere fazer manualmente, sem o script + +**Passo 1: Baixe os pacotes WASM e de OCR** (em uma máquina com internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Passo 2: Compile a imagem Docker com as URLs internas** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Passo 3: Exporte a imagem Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Passo 4: Transfira para a rede isolada** + +Copie por USB, repositório interno de artefatos ou outro método de transferência aprovado: + +- `bentopdf.tar`: a imagem Docker +- Os cinco pacotes `.tgz` de WASM/OCR do Passo 1 +- O diretório `tesseract-langdata/` do Passo 1 +- O diretório `ocr-fonts/` do Passo 1 + +**Passo 5: Configure dentro da rede isolada** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Garanta que os arquivos estejam acessíveis nas URLs que você configurou no Passo 2, incluindo `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` e `.../ocr/fonts`. + +
+ +::: info Compilando a partir do código-fonte em vez de usar Docker? +Defina as variáveis em `.env.production` antes de executar `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Hospedando Seu Próprio Proxy WASM + +Se você precisa servir arquivos WASM AGPL com cabeçalhos CORS adequados, pode implantar um proxy simples. Veja o [guia do Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) para um exemplo de implementação. + +::: tip Por Que Separar? +Essa separação garante: + +- Conformidade legal clara para usuários comerciais +- O núcleo do BentoPDF permanece sob sua licença dupla (AGPL-3.0 / Commercial) +- Os arquivos WASM são carregados em tempo de execução, e não incluídos no código-fonte + ::: + +## Requisitos do Sistema + +| Requisito | Mínimo | +| ------------- | --------------------------------- | +| Armazenamento | ~100 MB (núcleo sem módulos AGPL) | +| RAM | 512 MB | +| CPU | Qualquer processador moderno | + +::: tip +O BentoPDF é um site estático: não é necessário banco de dados nem servidor de back-end! +::: diff --git a/docs/pt/self-hosting/kubernetes.md b/docs/pt/self-hosting/kubernetes.md new file mode 100644 index 00000000..09ced076 --- /dev/null +++ b/docs/pt/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Implantar com Kubernetes + +O Kubernetes pode ser exagero para um site estático, mas pode ser uma ótima opção se você já padroniza em Helm + GitOps. + +> [!IMPORTANT] +> **Cabeçalhos Necessários para a Conversão de Arquivos do Office** +> +> As ferramentas baseadas em LibreOffice (conversão de Word, Excel, PowerPoint) exigem estes cabeçalhos HTTP para o suporte a `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> As imagens nginx oficiais do BentoPDF incluem esses cabeçalhos. No Kubernetes, **os controladores de Ingress/Gateway também são proxies reversos**, então garanta que esses cabeçalhos sejam preservados (ou adicione-os na borda). + +## Pré-requisitos + +- Cluster Kubernetes +- Helm v3 +- Uma imagem nginx do BentoPDF (ex.: `ghcr.io/alam00000/bentopdf:`) que atenda na **porta 8080** + +## Implantar com Helm + +### Instalar a partir deste repositório (chart local) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Instalar a partir do GHCR (chart OCI) + +Se o chart for publicado no GHCR como um artefato OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Exponha o Serviço + +### Port-forward (teste rápido) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (opcional) + +Ative o Ingress (exemplo para nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (opcional) + +Este chart oferece suporte a `Gateway` + `HTTPRoute` da Gateway API. + +Exemplo (operador Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Garantindo que os cabeçalhos do SharedArrayBuffer continuem funcionando (Ingress/Gateway) + +### O que "deveria" acontecer + +A configuração do nginx do BentoPDF define os cabeçalhos de resposta necessários. A maioria dos controladores de Ingress/Gateway **repassa os cabeçalhos de resposta do upstream sem alterá-los**. + +### O que pode quebrar isso + +- Uma política do controlador/borda que **sobrescreve** ou **remove** cabeçalhos de resposta +- Um middleware de "cabeçalhos de segurança" que define valores diferentes de COOP/COEP + +### Como verificar + +Execute isto no seu endpoint público: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Você deve ver: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Se o seu controlador de Ingress não os preservar + +Adicione os cabeçalhos na borda (específico de cada controlador). Exemplo para o **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Erros de tipo MIME de `.mjs` (iframe em branco no Sign PDF / Form Filler) + +Se o console do navegador mostrar `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` em uma requisição `.mjs`, um controlador de Ingress/Gateway na frente do nginx do BentoPDF está substituindo o cabeçalho `Content-Type` do upstream por `application/octet-stream`. + +O nginx da imagem do BentoPDF já serve `.mjs` como `application/javascript`. A correção é impedir que o controlador o remova ou substitua. Para o nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Ou use um filtro `ResponseHeaderModifier` na Gateway API para definir `Content-Type: application/javascript` nos caminhos `.mjs`. Verifique no DevTools → aba Network: a requisição `.mjs` que falhou agora deve mostrar `content-type: application/javascript`. + +### Se você usa a Gateway API e quer forçar a adição de cabeçalhos + +A Gateway API oferece suporte a um filtro `ResponseHeaderModifier`. Você pode anexá-lo em `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +O suporte a filtros específicos depende do seu controlador Gateway; se um filtro for ignorado, adicione os cabeçalhos na camada de borda/controlador. + +## Desativando Ferramentas Específicas + +Use um ConfigMap para desativar ferramentas em tempo de execução, sem recompilar a imagem: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Monte-o no diretório servido: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Os IDs das ferramentas são a URL da página sem `.html`: abra qualquer ferramenta e veja a URL (ex.: `edit-pdf`, `merge-pdf`, `compress-pdf`). As ferramentas desativadas ficam ocultas na página inicial, na busca, nos atalhos, no construtor de fluxos e no acesso direto por URL. Veja o [guia do Docker](/pt/self-hosting/docker#desativando-ferramentas-especificas) para a lista completa de opções. diff --git a/docs/pt/self-hosting/netlify.md b/docs/pt/self-hosting/netlify.md new file mode 100644 index 00000000..648e4a1e --- /dev/null +++ b/docs/pt/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Implantar no Netlify + +O [Netlify](https://netlify.com) oferece uma excelente hospedagem de sites estáticos, com um plano gratuito generoso. + +## Implantação com Um Clique + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Implantação Manual + +### Passo 1: Conecte o Repositório + +1. Faça login no [Netlify](https://app.netlify.com) +2. Clique em "Add new site" → "Import an existing project" +3. Conecte sua conta do GitHub +4. Selecione seu fork do BentoPDF + +### Passo 2: Configure as Opções de Compilação + +| Configuração | Valor | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Passo 3: Implante + +Clique em "Deploy site" e aguarde a compilação. + +## Arquivo de Configuração + +Crie o `netlify.toml` na raiz do seu projeto: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Importante +Os cabeçalhos `Cross-Origin-Embedder-Policy` e `Cross-Origin-Opener-Policy` são necessários para as conversões de Word/ODT/Excel/PowerPoint para PDF. Sem eles, o `SharedArrayBuffer` fica indisponível e o mecanismo LibreOffice WASM não consegue inicializar. + +Os cabeçalhos `Content-Encoding: gzip` nos arquivos `.wasm.gz` e `.data.gz` instruem o navegador a descompactá-los automaticamente. Sem eles, o navegador recebe bytes gzip brutos e a compilação do WASM falha. +::: + +## Variáveis de Ambiente + +Defina estas em Site settings → Environment variables: + +| Variável | Descrição | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Defina como `true` para uma compilação mínima | +| `VITE_BRAND_NAME` | Nome de marca personalizado (substitui "BentoPDF") | +| `VITE_BRAND_LOGO` | Caminho do logotipo relativo a `public/` (ex.: `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Texto personalizado de rodapé/direitos autorais | +| `VITE_DEFAULT_LANGUAGE` | Idioma padrão da interface (ex.: `fr`, `de`, `es`) | + +## Domínio Personalizado + +1. Acesse Site settings → Domain management +2. Clique em "Add custom domain" +3. Siga as instruções de configuração de DNS + +## Large Media + +Para arquivos WASM grandes, considere ativar o [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Solução de Problemas + +### Conversão de Word/ODT/Excel para PDF Travada em 55% + +Se as conversões de documentos travarem em 55%, abra o Console do DevTools e verifique: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Se `crossOriginIsolated` for `false`, os cabeçalhos COEP/COOP do seu `netlify.toml` não estão sendo aplicados. Confirme que o arquivo está na raiz do projeto e implante novamente. + +Se você vir `expected magic word 00 61 73 6d, found 1f 8b 08 08` no console, os arquivos `.wasm.gz` estão sem os cabeçalhos `Content-Encoding: gzip`. Confirme que os blocos `[[headers]]` de `soffice.wasm.gz` e `soffice.data.gz` estão no seu `netlify.toml`. + +### A Compilação Falha + +Verifique a compatibilidade da versão do Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Carregamento Inicial Lento + +Ative a otimização de ativos em Site settings → Build & deploy → Asset optimization. diff --git a/docs/pt/self-hosting/nginx.md b/docs/pt/self-hosting/nginx.md new file mode 100644 index 00000000..2aa1b67d --- /dev/null +++ b/docs/pt/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Implantar com Nginx + +Hospede o BentoPDF no seu próprio servidor usando o Nginx. + +## Pré-requisitos + +- Servidor Ubuntu/Debian +- Nginx instalado +- Certificado SSL (recomendado: Let's Encrypt) + +## Passo 1: Compile o Projeto + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Para personalizar a marca, defina variáveis de ambiente antes de compilar: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Passo 2: Copie os Arquivos + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Passo 3: Configuração do Nginx + +Crie o arquivo `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Passo 4: Ative o Site + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Passo 5: SSL com Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Implantação em Subdiretório + +Para hospedar em `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Compile com: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Ajuste de Desempenho + +Adicione ao `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Solução de Problemas + +### O WASM Não Carrega + +Confirme que o tipo MIME está definido: + +```nginx +types { + application/wasm wasm; +} +``` + +### Sign PDF ou Form Filler Mostra um Visualizador em Branco (erro de MIME de `.mjs`) + +Se o console do navegador mostrar: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…e a requisição com falha terminar em `.mjs`, falta ao seu nginx o mapeamento `.mjs → application/javascript`. O visualizador de PDF incluído (usado por Sign PDF, Form Filler e algumas outras ferramentas) traz arquivos de módulo ES com extensão `.mjs`, e o `mime.types` padrão do nginx não os inclui por padrão. + +Corrija adicionando `mjs` à linha `application/javascript` existente em `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> NÃO acrescente uma _segunda_ linha `application/javascript`. O nginx lê o `mime.types` linha por linha e só um mapeamento de tipo para extensão vale, então uma segunda linha é ignorada silenciosamente em algumas versões. Edite a linha existente para adicionar `mjs` junto com `js`. + +Ou sobrescreva localmente dentro do seu bloco server (sem editar o arquivo global): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Recarregue o nginx após a alteração: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Para confirmar: no DevTools do navegador → aba Network, encontre a requisição `.mjs` com falha e verifique o cabeçalho de resposta `Content-Type`. Agora ele deve ser `application/javascript`, e não `application/octet-stream`. + +### Conversão de Word/ODT/Excel para PDF Não Funciona + +O LibreOffice WASM exige `SharedArrayBuffer`, que precisa dos cabeçalhos `Cross-Origin-Embedder-Policy` e `Cross-Origin-Opener-Policy`. Ele também precisa de um contexto seguro, então `http://localhost` funciona para testes locais, mas `http://192.168.x.x` ou outros IPs de rede local geralmente exigem HTTPS. Observe que as diretivas `add_header` de um bloco `location` **substituem** as diretivas `add_header` do nível do servidor, e não se combinam. Todo bloco `location` com seu próprio `add_header` deve incluir os cabeçalhos COEP/COOP. + +Verifique com: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Se você usa um proxy reverso na frente do nginx, garanta que ele preserve esses cabeçalhos. + +### 502 Bad Gateway + +Verifique os logs de erro do Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/pt/self-hosting/vercel.md b/docs/pt/self-hosting/vercel.md new file mode 100644 index 00000000..551f8856 --- /dev/null +++ b/docs/pt/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Implantar no Vercel + +O [Vercel](https://vercel.com) oferece a experiência de implantação mais simples para sites estáticos. + +## Implantação com Um Clique + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Implantação Manual + +### Passo 1: Faça um Fork do Repositório + +Faça um fork de [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) para sua conta do GitHub. + +### Passo 2: Importe no Vercel + +1. Acesse [vercel.com/new](https://vercel.com/new) +2. Selecione seu repositório com o fork +3. Configure o projeto: + +| Configuração | Valor | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Passo 3: Variáveis de Ambiente (Opcional) + +Adicione estas se necessário: + +| Variável | Descrição | +| ----------------------- | -------------------------------------------------------------------- | +| `SIMPLE_MODE` | Defina como `true` para uma interface mínima | +| `VITE_BRAND_NAME` | Nome de marca personalizado (substitui "BentoPDF") | +| `VITE_BRAND_LOGO` | Caminho do logotipo relativo a `public/` (ex.: `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Texto personalizado de rodapé/direitos autorais | +| `VITE_DEFAULT_LANGUAGE` | Idioma padrão da interface (ex.: `fr`, `de`, `es`) | + +### Passo 4: Implante + +Clique em "Deploy" e aguarde a conclusão da compilação. + +## Domínio Personalizado + +1. Acesse as configurações do seu projeto +2. Navegue até "Domains" +3. Adicione seu domínio personalizado +4. Configure o DNS conforme as instruções + +## Limitações + +::: warning Arquivos Grandes +As funções serverless do Vercel têm um limite de 50MB. Como o BentoPDF é um site estático, isso não deve afetar você, mas os módulos WASM são grandes (~100MB no total). Garanta que eles sejam servidos a partir da pasta `/public`. +::: + +## Solução de Problemas + +### Tempo Limite da Compilação + +Se a compilação exceder o tempo limite, tente: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 ao Atualizar a Página + +Adicione um `vercel.json` para o roteamento de SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Conversão de Word/ODT/Excel para PDF Não Funciona + +As conversões do LibreOffice WASM exigem `SharedArrayBuffer`, que precisa destes cabeçalhos de resposta em todas as páginas: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Os arquivos pré-comprimidos `.wasm.gz` e `.data.gz` também precisam de `Content-Encoding: gzip` para que o navegador os descompacte. + +Adicione isto ao seu `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Para verificar, abra o Console do DevTools e execute `console.log(window.crossOriginIsolated)`. Deve retornar `true`. diff --git a/docs/pt/tools/add-attachments.md b/docs/pt/tools/add-attachments.md new file mode 100644 index 00000000..60673867 --- /dev/null +++ b/docs/pt/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Adicionar anexos +description: Incorpore arquivos de qualquer tipo em um PDF no nível do documento ou anexados a páginas específicas. +--- + +# Adicionar anexos + +Incorpore um ou mais arquivos diretamente dentro de um documento PDF. Os anexos podem ser adicionados no nível do documento (visíveis no painel de anexos de qualquer leitor de PDF) ou vinculados a páginas específicas. + +## Como Funciona + +1. Envie o PDF ao qual você quer anexar arquivos. +2. Use a área de soltar anexos para selecionar os arquivos que deseja incorporar (qualquer tipo de arquivo). +3. Escolha o nível do anexo: **Documento** (padrão) ou **Página**. +4. Se escolher o nível de Página, informe um intervalo de páginas (por exemplo, `1-3` ou `5`). +5. Clique no botão de processar. O PDF modificado é baixado com seus arquivos incorporados. + +## Recursos + +- Anexe qualquer tipo de arquivo: imagens, planilhas, arquivos compactados, executáveis, o que for +- Anexos no nível do documento ou da página +- Vários arquivos podem ser anexados em uma única operação +- Exibe os nomes e tamanhos de todos os anexos selecionados +- A saída preserva o conteúdo original do PDF com os arquivos incorporados adicionados + +## Opções + +| Opção | Descrição | +| ---------------------- | ------------------------------------------------------------------------------ | +| **Nível do documento** | Anexa os arquivos ao PDF como um todo, acessíveis pelo painel de anexos | +| **Nível da página** | Anexa os arquivos a páginas específicas, definidas por um intervalo de páginas | + +## Casos de Uso + +- Reunir dados de origem (arquivos Excel, CSVs) com um relatório em PDF +- Anexar os arquivos de imagem originais a um PDF de portfólio fotográfico +- Incorporar documentos de apoio em um contrato ou proposta +- Adicionar materiais complementares a páginas específicas de um manual de treinamento + +## Dicas + +- Os anexos no nível do documento são os mais amplamente compatíveis entre leitores de PDF. Os anexos no nível da página podem não ser visíveis em todos os visualizadores. +- Não há limite de tamanho para os anexos, mas arquivos incorporados muito grandes aumentam o tamanho do PDF proporcionalmente. + +## Ferramentas Relacionadas + +- [Extrair anexos](./extract-attachments) +- [Editar anexos](./edit-attachments) +- [Mesclar PDF](./merge-pdf) diff --git a/docs/pt/tools/add-blank-page.md b/docs/pt/tools/add-blank-page.md new file mode 100644 index 00000000..0e41719c --- /dev/null +++ b/docs/pt/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Adicionar página em branco +description: Insira uma ou mais páginas em branco em qualquer posição de um documento PDF. +--- + +# Adicionar página em branco + +Insira páginas vazias em um PDF na posição que você especificar. Você controla onde as páginas em branco entram e quantas adicionar. + +## Como Funciona + +1. Envie um arquivo PDF. A ferramenta exibe o número de páginas. +2. Informe a **posição** onde as páginas em branco devem ser inseridas. Use `0` para inserir no início, ou o total de páginas para adicionar ao final. +3. Informe o **número** de páginas em branco a adicionar (o padrão é 1). +4. Clique no botão de processar. O PDF modificado é baixado com as páginas em branco inseridas. + +## Recursos + +- Insira em qualquer posição: início, meio ou fim do documento +- Adicione várias páginas em branco em uma só operação +- A dica de posição é atualizada dinamicamente conforme o número de páginas do PDF enviado +- Páginas em branco no tamanho A4 padrão + +## Casos de Uso + +- Adicionar uma página em branco separadora entre as seções de um documento compilado +- Inserir páginas em branco para alinhar a impressão frente e verso +- Deixar espaço para anotações manuscritas em um guia de estudo impresso +- Completar um documento para atingir um número mínimo de páginas + +## Dicas + +- A posição `0` insere antes da primeira página. A posição igual ao total de páginas adiciona depois da última página. +- Se você precisa inserir conteúdo (não apenas páginas em branco) em uma posição específica, use a [Multiferramenta PDF](./pdf-multi-tool) para inserir outro PDF após uma determinada página. + +## Ferramentas Relacionadas + +- [Organize & Duplicate](./organize-pdf) +- [Multiferramenta PDF](./pdf-multi-tool) +- [Mesclar PDF](./merge-pdf) diff --git a/docs/pt/tools/add-page-labels.md b/docs/pt/tools/add-page-labels.md new file mode 100644 index 00000000..21ce3580 --- /dev/null +++ b/docs/pt/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Adicionar rótulos de página +description: Adicione rótulos de página ao PDF com algarismos romanos, prefixos de letras, numeração personalizada e várias regras por documento. +--- + +# Adicionar rótulos de página + +Os rótulos de página controlam como os números de página aparecem nos leitores de PDF (o número mostrado na barra de ferramentas, não impresso na página). Esta ferramenta permite atribuir esquemas de rotulagem diferentes a intervalos de páginas diferentes: algarismos romanos para as páginas iniciais, números decimais para o corpo, apêndices com letras e muito mais. + +## Como Funciona + +1. Envie seu arquivo PDF. +2. O painel de opções aparece com uma regra de rótulo por padrão. +3. Configure cada regra com um intervalo de páginas, estilo, prefixo opcional e valor inicial. +4. Clique em **Adicionar Regra** para criar regras adicionais para outras seções. +5. Clique em **Adicionar rótulos de página** para aplicar todas as regras e baixar o resultado. + +## Opções + +Cada regra de rótulo tem estas configurações: + +- **Intervalo de Páginas**: as páginas às quais a regra se aplica. Deixe vazio para todas as páginas. Aceita intervalos como `1-4`, `7`, `odd` ou `1-9,30-40`. +- **Estilo do Rótulo**: Arábico decimal, Romano minúsculo (i, ii, iii), Romano maiúsculo (I, II, III), Letras minúsculas (a, b, c), Letras maiúsculas (A, B, C) ou Sem rótulo (somente prefixo). +- **Prefixo do Rótulo**: texto opcional adicionado antes de cada rótulo, como "A-" para criar rótulos como A-1, A-2, A-3. +- **Valor Inicial**: o número a partir do qual a contagem começa. O padrão é 1. Defina como 0 para numeração começando em zero. +- **Continuar a numeração entre intervalos separados**: ative quando uma regra abranger páginas não contíguas (como `1-9,30-40` ou `odd`) e você quiser que a numeração continue em sequência. +- **Remover rótulos de página existentes**: marcado por padrão. Apaga quaisquer rótulos anteriores antes de aplicar as novas regras. + +## Recursos + +- Várias regras de rótulo por documento para esquemas de numeração complexos +- Seis estilos de rótulo que cobrem todos os sistemas de numeração padrão +- Suporte a prefixo personalizado para rotulagem por seção +- Suporte a intervalos separados com numeração progressiva +- Opção de manter ou remover os rótulos existentes + +## Casos de Uso + +- Definir rótulos em algarismos romanos (i, ii, iii) para o prefácio de um livro e rótulos decimais para o texto principal +- Rotular as páginas de apêndice com prefixos de letras como "A-1", "A-2", "B-1", "B-2" +- Corrigir os rótulos de página em um documento digitalizado em que os números físicos das páginas não correspondem à ordem das páginas do PDF +- Adicionar numeração iniciada em zero para documentos técnicos + +## Dicas + +- Os rótulos de página são metadados que os leitores de PDF exibem na barra de navegação. Eles não são impressos na página. Para números visíveis, use [Números de página](./page-numbers). +- Esta ferramenta exige que o CoherentPDF (CPDF) esteja configurado nas suas Configurações de WASM. Se não estiver, você será solicitado a configurá-lo. + +## Ferramentas Relacionadas + +- [Números de página](./page-numbers) +- [Numeração Bates](./bates-numbering) +- [Editar marcadores](./bookmark) diff --git a/docs/pt/tools/add-stamps.md b/docs/pt/tools/add-stamps.md new file mode 100644 index 00000000..5af39fb3 --- /dev/null +++ b/docs/pt/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Adicionar carimbos +description: Adicione carimbos de imagem às páginas do PDF usando uma barra de ferramentas de anotação integrada com atribuição de nome de usuário. +--- + +# Adicionar carimbos + +Coloque carimbos de imagem nas páginas do seu PDF usando um visualizador incorporado com uma barra de ferramentas de anotação de carimbos. Os carimbos podem incluir seu nome para atribuição, o que é útil em fluxos de aprovação, processos de revisão e marcação de documentos. + +## Como Funciona + +1. Digite seu nome no campo **Nome de Usuário do Carimbo**. Esse nome aparecerá nos carimbos que você criar. +2. Envie seu arquivo PDF clicando ou arrastando-o para a área de soltar. +3. O editor de carimbos abre com o documento carregado em um visualizador. +4. Use a ferramenta de carimbo de imagem da barra de ferramentas para selecionar e posicionar carimbos em qualquer página. +5. Posicione e redimensione os carimbos conforme necessário. +6. Clique em **Salvar PDF Carimbado** para baixar o resultado. + +## Recursos + +- Visualizador de PDF integrado com uma barra de ferramentas de anotação específica para carimbos +- Atribuição de nome de usuário nos carimbos criados +- Colocação de carimbos de imagem em qualquer página +- Posicionamento e redimensionamento por arrastar e soltar +- Dimensionamento automático do visualizador conforme a proporção da página +- Exibição do arquivo com nome e tamanho + +## Casos de Uso + +- Adicionar carimbos de imagem "APROVADO" ou "REVISADO" a documentos em um fluxo de revisão +- Colocar imagens de selo da empresa ou carimbo de cartório em documentos oficiais +- Marcar páginas com carimbos "RECEBIDO" incluindo o nome do revisor +- Adicionar carimbos de controle de qualidade a relatórios de inspeção + +## Dicas + +- Defina o nome de usuário do carimbo antes de enviar o PDF. O nome de usuário é incorporado nos metadados do carimbo. +- O visualizador ajusta sua altura com base na proporção da primeira página do PDF para uma visualização ideal. +- Para marcas d'água de texto em vez de carimbos de imagem, use a ferramenta [Adicionar marca d'água](./add-watermark). + +## Ferramentas Relacionadas + +- [Assinar PDF](./sign-pdf) +- [Adicionar marca d'água](./add-watermark) +- [Editor de PDF](./edit-pdf) diff --git a/docs/pt/tools/add-watermark.md b/docs/pt/tools/add-watermark.md new file mode 100644 index 00000000..d8dcefcb --- /dev/null +++ b/docs/pt/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Adicionar marca d'água +description: Aplique marcas d'água de texto ou imagem nas páginas do PDF com um editor visual de arrastar e soltar e visualização ao vivo. +--- + +# Adicionar marca d'água + +Adicione marcas d'água de texto ou imagem às páginas do seu PDF usando um editor visual. Você pode posicionar a marca d'água arrastando-a diretamente na visualização, redimensioná-la pelas alças dos cantos e configurar opacidade, rotação, fonte e cor. Cada página pode ter sua própria posição de marca d'água, ou você pode aplicar a mesma marca a todas as páginas de uma vez. + +## Como Funciona + +1. Envie seu arquivo PDF. +2. O editor abre com uma visualização ao vivo da primeira página e uma marca d'água arrastável sobreposta. +3. Escolha entre o modo de marca d'água de **Texto** ou de **Imagem** usando os botões de alternância. +4. Configure as opções da marca d'água no painel lateral. +5. Arraste a marca d'água na visualização para posicioná-la exatamente onde quiser. Use as alças dos cantos para redimensionar. +6. Navegue entre as páginas para definir marcas d'água por página, ou mantenha **Aplicar a todas as páginas** marcado. +7. Clique em **Adicionar Marca d'Água** para processar e baixar. + +## Opções + +**Configurações da marca d'água de texto:** + +- **Texto**: o texto da marca d'água (por exemplo, "CONFIDENCIAL", "RASCUNHO"). +- **Tamanho da Fonte**: de 10 a 200 pontos. O padrão é 72. +- **Cor**: qualquer cor pelo seletor de cores. +- **Opacidade**: controle a transparência, de totalmente transparente a totalmente opaco. +- **Rotação**: gire o texto da marca d'água de -180 a 180 graus. + +**Configurações da marca d'água de imagem:** + +- **Envio de Imagem**: envie um arquivo PNG, JPG ou outro formato de imagem para usar como marca d'água. +- **Opacidade**: controle a transparência da imagem. +- **Escala**: redimensione a marca d'água de imagem. + +**Configurações de layout:** + +- **Única**: uma marca d'água por página, posicionada por arrastar ou pelas predefinições de posição. +- **Em mosaico**: repete a marca d'água por toda a página em uma grade diagonal que acompanha o ângulo de rotação, de modo que a marca cubra o documento de ponta a ponta. +- **Espaçamento horizontal**: espaço entre os blocos ao longo da direção do texto, como porcentagem da largura da marca d'água (somente no modo mosaico). +- **Espaçamento vertical**: espaço entre as linhas de blocos, como porcentagem da altura da marca d'água (somente no modo mosaico). + +**Configurações gerais:** + +- **Aplicar a todas as páginas**: quando marcado, a mesma marca d'água é aplicada a todas as páginas. Desmarque para definir marcas d'água individuais por página. +- **Intervalo de Páginas**: especifique quais páginas recebem a marca d'água (por exemplo, "1-3, 5, 7-9" ou "all"). + +## Recursos + +- Posicionamento visual por arrastar e soltar em uma visualização ao vivo do PDF +- Marca d'água redimensionável com alças nos cantos +- Modos de marca d'água de texto e de imagem +- Layout único ou em mosaico (repetido) na página inteira, com espaçamento ajustável +- Aplicação da marca d'água por página ou global +- Navegação página a página na visualização +- Controles de opacidade e rotação +- Filtragem por intervalo de páginas + +## Casos de Uso + +- Marcar documentos em rascunho com "RASCUNHO" antes de circular para revisão +- Adicionar marcas d'água "CONFIDENCIAL" a relatórios financeiros sensíveis +- Personalizar documentos com uma marca d'água de imagem com o logotipo da empresa +- Aplicar "AMOSTRA" em documentações de produtos compartilhadas com potenciais clientes +- Adicionar avisos de direitos autorais a materiais em PDF distribuídos + +## Dicas + +- Para marcas d'água diagonais na página, defina uma rotação em torno de 45 graus e aumente o tamanho da fonte. +- O modo mosaico torna o documento muito mais difícil de reaproveitar após um recorte, já que remover uma marca ainda deixa dezenas de outras. Reduza a opacidade ao usar mosaico para que o texto por baixo continue legível. +- Marcas d'água de imagem com fundo transparente (formato PNG) se misturam de forma mais natural ao conteúdo do documento. +- Se você precisa de textos de marca d'água diferentes em páginas diferentes, desmarque "Aplicar a todas as páginas" e navegue página por página. + +## Ferramentas Relacionadas + +- [Cabeçalho e rodapé](./header-footer) +- [Adicionar carimbos](./add-stamps) +- [Numeração Bates](./bates-numbering) +- [Assinar PDF](./sign-pdf) diff --git a/docs/pt/tools/adjust-colors.md b/docs/pt/tools/adjust-colors.md new file mode 100644 index 00000000..547b8451 --- /dev/null +++ b/docs/pt/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Ajustar cores +description: Ajuste com precisão o brilho, contraste, saturação, matiz, temperatura, tonalidade, gama e sépia do seu PDF. +--- + +# Ajustar cores + +Um kit completo de correção de cor para PDFs. Ajuste oito parâmetros independentes (brilho, contraste, saturação, deslocamento de matiz, temperatura, tonalidade, gama e sépia) com uma visualização ao vivo que é atualizada conforme você move cada controle deslizante. + +## Como Funciona + +1. Envie seu arquivo PDF. +2. O editor abre mostrando uma visualização da primeira página e um painel de configurações de cor. +3. Mova os controles deslizantes para ajustar cada parâmetro de cor. A visualização é atualizada em tempo real. +4. Clique em **Redefinir** para restaurar todos os controles às posições padrão. +5. Clique em **Aplicar** para processar todas as páginas e baixar o PDF ajustado. + +## Opções + +- **Brilho**: clareia ou escurece a página inteira (-100 a +100). +- **Contraste**: aumenta ou diminui a diferença entre áreas claras e escuras (-100 a +100). +- **Saturação**: aumenta ou reduz a intensidade das cores (-100 a +100). Definir como -100 gera um resultado em tons de cinza. +- **Deslocamento de Matiz**: gira a roda de cores para deslocar todas as cores uniformemente. +- **Temperatura**: desloca as cores para mais quentes (amarelo/laranja) ou mais frias (azul). +- **Tonalidade**: adiciona uma dominante verde ou magenta. +- **Gama**: ajusta o brilho dos meios-tons usando uma curva de gama. Valores abaixo de 1,0 escurecem os meios-tons; valores acima de 1,0 os clareiam. +- **Sépia**: aplica um efeito clássico de tom sépia. Valores mais altos produzem uma tonalidade marrom mais forte. + +## Recursos + +- Oito parâmetros de cor ajustáveis de forma independente +- Visualização ao vivo que responde imediatamente às mudanças nos controles +- Botão de redefinição para voltar rapidamente aos padrões +- Processa todas as páginas do documento +- Funciona com qualquer conteúdo de PDF (texto, imagens, gráficos) + +## Casos de Uso + +- Clarear uma digitalização escura ou corrigir páginas superexpostas +- Dessaturar um documento colorido para reduzir o uso de tinta antes de imprimir +- Aplicar um tom sépia para criar um visual antigo em certificados ou premiações +- Corrigir a temperatura de cor de fotos incorporadas em um PDF +- Aumentar o contraste de documentos digitalizados desbotados ou de baixa qualidade + +## Dicas + +- Para uma conversão rápida em tons de cinza, arraste o controle de saturação até -100. +- O controle de gama é especialmente útil para melhorar a legibilidade de documentos digitalizados em que os meios-tons estão escuros ou claros demais. +- Como as outras ferramentas de efeito de imagem, esta rasteriza cada página. A saída será baseada em imagem, então o texto não poderá ser selecionado. + +## Ferramentas Relacionadas + +- [Inverter cores](./invert-colors) +- [Efeito scanner](./scanner-effect) +- [Cor de fundo](./background-color) diff --git a/docs/pt/tools/alternate-merge.md b/docs/pt/tools/alternate-merge.md new file mode 100644 index 00000000..88b38cbd --- /dev/null +++ b/docs/pt/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alternar e misturar páginas +description: Mescle PDFs intercalando as páginas de cada arquivo em ordem alternada, com preservação dos marcadores. +--- + +# Alternar e misturar páginas + +Intercale as páginas de vários arquivos PDF para que as páginas se alternem entre os documentos. Esta é a ferramenta certa quando uma mesclagem comum apenas juntaria os arquivos um após o outro, mas você precisa da página 1 do Arquivo A, depois da página 1 do Arquivo B, depois da página 2 do Arquivo A, e assim por diante. + +## Como Funciona + +1. Envie pelo menos dois arquivos PDF usando a área de soltar. +2. A ferramenta exibe cada arquivo com seu número de páginas e tamanho. +3. Arraste as alças para reordenar qual arquivo tem as páginas primeiro na sequência de intercalação. +4. Clique em **Misturar Páginas** para gerar a saída intercalada. +5. O resultado é baixado como `alternated-mixed.pdf`. + +## Recursos + +- Intercala páginas de qualquer número de PDFs (mínimo de dois) +- Reordenação dos arquivos por arrastar e soltar para controlar a prioridade da intercalação +- Preserva os marcadores dos documentos de origem +- Exibe o número de páginas e o tamanho de cada arquivo enviado +- Processa em um web worker dedicado para manter a interface responsiva + +## Casos de Uso + +- Remontar digitalizações frente e verso em que as páginas ímpares e pares foram digitalizadas separadamente +- Combinar folhas de perguntas com gabaritos, para que cada pergunta seja seguida da sua resposta +- Mesclar documentos em dois idiomas página a página (por exemplo, inglês de um lado e a tradução no seguinte) +- Intercalar digitalizações de frente e verso feitas em um scanner de face única + +## Dicas + +- Se os PDFs de origem tiverem números de páginas diferentes, as páginas do documento mais curto acabam primeiro e as páginas restantes do documento mais longo aparecem no final. +- A ordem dos arquivos importa: o primeiro arquivo da lista fornece a primeira página da saída. Arraste para reorganizar, se necessário. + +## Ferramentas Relacionadas + +- [Mesclar PDF](./merge-pdf) +- [Organize & Duplicate](./organize-pdf) +- [Dividir PDF](./split-pdf) diff --git a/docs/pt/tools/background-color.md b/docs/pt/tools/background-color.md new file mode 100644 index 00000000..4892e4cc --- /dev/null +++ b/docs/pt/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Cor de fundo +description: Altere a cor de fundo de todas as páginas do PDF preservando todo o conteúdo por cima. +--- + +# Cor de fundo + +Defina uma cor de fundo sólida atrás de todo o conteúdo existente do seu PDF. A ferramenta cria um retângulo colorido em cada página e coloca o conteúdo original por cima, de modo que texto, imagens e gráficos continuam totalmente visíveis sobre o novo fundo. + +## Como Funciona + +1. Envie seu arquivo PDF. +2. Escolha uma cor de fundo no seletor de cores. O padrão é um amarelo claro (#FFFFCC). +3. Clique em **Alterar Cor de Fundo** para processar. +4. O PDF atualizado é baixado automaticamente. + +## Opções + +- **Cor de Fundo**: um seletor de cores padrão para escolher qualquer cor sólida. O padrão é amarelo claro. + +## Recursos + +- Aplica uma cor de fundo uniforme a todas as páginas +- Preserva todo o conteúdo original (texto, imagens, gráficos vetoriais) por cima da camada colorida +- Mantém as dimensões originais das páginas +- Funciona com documentos de qualquer número de páginas + +## Casos de Uso + +- Adicionar um fundo creme ou marfim claro para dar aos documentos uma aparência mais suave, parecida com papel +- Codificar conjuntos de documentos por cor, aplicando fundos diferentes a categorias diferentes +- Criar versões visualmente distintas do mesmo documento para públicos diferentes +- Adicionar uma leve tonalidade de fundo para melhorar a legibilidade ao projetar documentos na tela + +## Dicas + +- Cores claras e suaves funcionam melhor. Um fundo muito escuro pode dificultar a leitura do texto, a menos que o texto já seja claro. +- Se quiser mudar tanto a cor de fundo quanto a do texto, aplique primeiro a cor de fundo e depois use [Alterar cor do texto](./text-color) no resultado. +- Esta ferramenta trabalha no nível estrutural do PDF (sem rasterização), então o texto continua selecionável e pesquisável na saída. + +## Ferramentas Relacionadas + +- [Alterar cor do texto](./text-color) +- [Inverter cores](./invert-colors) +- [Ajustar cores](./adjust-colors) diff --git a/docs/pt/tools/bates-numbering.md b/docs/pt/tools/bates-numbering.md new file mode 100644 index 00000000..5ab2a7a3 --- /dev/null +++ b/docs/pt/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Numeração Bates +description: Aplique números Bates a um ou vários PDFs com modelos, preenchimento, fontes e posicionamento personalizáveis. +--- + +# Numeração Bates + +A numeração Bates carimba identificadores sequenciais em cada página dos seus PDFs. É o método padrão para rotular documentos em processos judiciais, auditorias e fluxos de conformidade. Esta ferramenta aceita vários arquivos, modelos personalizáveis e gera PDFs numerados individualmente ou um único arquivo ZIP. + +## Como Funciona + +1. Envie um ou mais arquivos PDF. Você pode arrastar vários arquivos de uma vez. +2. Escolha uma predefinição de estilo ou crie um modelo personalizado. +3. Configure a posição, a fonte, o tamanho, a cor e os números iniciais. +4. Clique em **Aplicar Números Bates** para processar. +5. Um único arquivo é baixado diretamente. Vários arquivos são baixados como um arquivo ZIP. + +## Opções + +- **Predefinição de Estilo**: escolha entre os formatos integrados: + - Exhibit + Case + Bates + Page (por exemplo, "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (sem número de página) + - Case + Bates + - Somente Número Bates (por exemplo, "000001") + - Personalizado (escreva seu próprio modelo) +- **Personalizar Estilo**: uma string de modelo com marcadores: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Preenchimento Bates**: número de dígitos (3 a 6) para números Bates preenchidos com zeros. Visível apenas no modo personalizado. +- **Posição**: Cabeçalho ou Rodapé, Esquerda, Centro ou Direita. +- **Bates Começa em**: o primeiro número Bates. O padrão é 1. A numeração continua entre os arquivos. +- **Contador de Arquivos Começa em**: o número inicial do marcador `[FILE]`. +- **Fonte**: Helvetica, Times New Roman ou Courier. +- **Tamanho da Fonte**: tamanho do texto carimbado. +- **Cor**: seletor de cores para o texto do número Bates. + +## Recursos + +- Visualização ao vivo mostrando como os números Bates aparecerão em todos os arquivos enviados +- Suporte a vários arquivos com numeração contínua entre os documentos +- Reordenação de arquivos por arrastar e soltar para controlar a sequência de numeração +- Seis opções de posição (cabeçalho/rodapé, esquerda/centro/direita) +- Cálculo adaptativo de margens que respeita tamanhos de página diferentes +- Saída em ZIP para lotes com vários arquivos +- Marcadores de modelo para máxima flexibilidade + +## Casos de Uso + +- Carimbar documentos de produção de provas em litígios com números sequenciais de exibição +- Numerar pacotes de evidências de auditoria que abrangem dezenas de arquivos +- Aplicar números de referência regulatórios em documentação de conformidade +- Rotular anexos de pedidos de patente com identificadores específicos de cada caso + +## Dicas + +- Arraste os arquivos na lista para reordená-los antes de processar. A sequência de numeração Bates segue essa ordem. +- Use o marcador `[FILENAME]` para incluir o nome do arquivo original no carimbo, o que ajuda a rastrear as páginas até os documentos de origem. +- A caixa de visualização é atualizada em tempo real conforme você altera as configurações, para que você confira o formato antes de processar. + +## Ferramentas Relacionadas + +- [Números de página](./page-numbers) +- [Adicionar rótulos de página](./add-page-labels) +- [Cabeçalho e rodapé](./header-footer) diff --git a/docs/pt/tools/bmp-to-pdf.md b/docs/pt/tools/bmp-to-pdf.md new file mode 100644 index 00000000..b4c0114d --- /dev/null +++ b/docs/pt/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP para PDF +description: Converta imagens bitmap BMP para o formato PDF diretamente no navegador, sem enviar nada a nenhum servidor. +--- + +# BMP para PDF + +Converta arquivos Windows Bitmap (BMP) em PDF. O BMP é um formato de imagem sem compressão ainda encontrado em sistemas legados, imagens médicas e scanners industriais. Esta ferramenta os converte em PDF sem precisar instalar nada. + +## Formatos Compatíveis + +| Formato | Extensões | +| :------ | :-------- | +| BMP | `.bmp` | + +## Como Funciona + +1. Clique na área de envio ou arraste e solte seus arquivos BMP. +2. Revise a lista de arquivos. Adicione mais arquivos ou remova os indesejados. +3. Clique em **Converter para PDF**. A saída é baixada como `from_bmps.pdf`. + +Cada BMP é desenhado em um canvas, exportado como PNG e depois incorporado ao PDF usando pdf-lib. O tamanho da página corresponde às dimensões originais da imagem. + +## Opções + +Esta ferramenta não expõe configurações adicionais de qualidade. As imagens são incorporadas na resolução original, como PNG sem perdas, dentro do PDF. + +## Casos de Uso + +- Converter documentos digitalizados legados armazenados como BMP em PDFs de arquivamento +- Transformar capturas de tela BMP de aplicativos mais antigos do Windows em documentos compartilháveis +- Processar a saída de scanners médicos ou industriais que usam BMP por padrão +- Migrar arquivos de imagens antigos para um formato mais portátil + +## Dicas + +- Os arquivos BMP não têm compressão, por isso tendem a ser grandes. O PDF resultante será bem menor, pois as imagens são recodificadas internamente como PNG. +- Se você tem arquivos BMP junto com outros formatos de imagem, use a ferramenta [Imagens para PDF](./image-to-pdf) para converter tudo em um único lote. + +## Ferramentas Relacionadas + +- [Imagens para PDF](./image-to-pdf) +- [PNG para PDF](./png-to-pdf) +- [TIFF para PDF](./tiff-to-pdf) diff --git a/docs/pt/tools/bookmark.md b/docs/pt/tools/bookmark.md new file mode 100644 index 00000000..5c3c4a97 --- /dev/null +++ b/docs/pt/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Editar marcadores +description: Adicione, edite, importe, exporte e exclua favoritos de PDF com um editor visual e suporte a CSV/JSON. +--- + +# Editar marcadores + +O editor de favoritos oferece controle total sobre os favoritos de navegação do PDF (também chamados de estrutura de tópicos). Você pode adicionar novos favoritos, editar os existentes, reorganizar a hierarquia e importar ou exportar os dados em formatos CSV e JSON. + +## Como funciona + +1. Envie seu PDF clicando ou arrastando um arquivo para a área de soltar. +2. Se quiser, marque **Extrair favoritos existentes automaticamente** para carregar a árvore de favoritos atual do documento. +3. O editor abre em visualização dividida: visualizador de PDF à esquerda e painel de favoritos à direita. +4. Digite o título de um favorito e clique em **Adicionar à página** para criar um novo favorito apontando para a página atual. +5. Use os botões da barra de ferramentas para reorganizar, estilizar ou excluir favoritos. +6. Clique em **Salvar PDF com favoritos** para baixar o arquivo atualizado. + +## Recursos + +- Visualizador de PDF com navegação de páginas, controles de zoom e campo para ir a uma página +- Adicione favoritos a qualquer página com um único clique +- Clique diretamente no PDF para definir um destino preciso do favorito (modo de seleção) +- Hierarquia de favoritos aninhados com reordenação por arrastar e soltar +- Operações em lote: selecione vários favoritos para alterar a cor, o estilo ou excluir de uma vez +- Busca de favoritos para encontrar rapidamente itens em árvores grandes +- Suporte a desfazer e refazer para todas as alterações +- Importe favoritos de arquivos CSV (título, página, nível) ou JSON +- Exporte favoritos para CSV ou JSON para edição externa +- Estilo dos favoritos: cor (vermelho, azul, verde, amarelo, roxo) e estilo da fonte (negrito, itálico, negrito itálico) +- Navegação rápida: percorra as páginas com as teclas Page Up/Page Down + +## Opções + +- **Extrair favoritos existentes automaticamente**: quando marcada, a ferramenta lê e exibe os favoritos atuais do PDF ao carregar. +- **Modo em lote**: ative para selecionar vários favoritos e aplicar alterações de cor, estilo ou exclusão em massa. +- **Expandir/Recolher tudo**: mostre ou oculte rapidamente os favoritos filhos. + +## Casos de uso + +- Adicionar um sumário a um livro didático ou manual que não tem favoritos +- Reestruturar os favoritos de um documento digitalizado após o processamento de OCR +- Exportar favoritos para CSV, editá-los em uma planilha e importá-los novamente +- Limpar favoritos gerados automaticamente que têm referências de página incorretas +- Adicionar favoritos coloridos para marcar seções importantes em uma petição jurídica + +## Dicas + +- Use a importação de CSV para criar favoritos em massa. O formato é simples: `title,page,level`, em que o nível 1 é o nível superior. +- O modo de seleção permite clicar em um ponto exato da página do PDF para definir o destino do favorito, o que é mais preciso do que apenas indicar o número da página. +- Exporte seus favoritos antes de fazer grandes alterações para ter um backup. + +## Ferramentas relacionadas + +- [Sumário](./table-of-contents) +- [Editor de PDF](./edit-pdf) +- [Adicionar rótulos de página](./add-page-labels) diff --git a/docs/pt/tools/cbz-to-pdf.md b/docs/pt/tools/cbz-to-pdf.md new file mode 100644 index 00000000..14577913 --- /dev/null +++ b/docs/pt/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ para PDF +description: Converta arquivos de quadrinhos CBZ e CBR em PDF no seu navegador. Grátis, privado, sem upload. +--- + +# CBZ para PDF + +Transforme arquivos de quadrinhos em PDFs. CBZ e CBR são os formatos padrão para quadrinhos digitais: são apenas arquivos ZIP ou RAR cheios de imagens. Esta ferramenta extrai cada página, preserva a ordem de leitura e gera um PDF limpo em que cada imagem vira uma página em tamanho real. + +## Formatos compatíveis + +| Formato | Extensão | Observações | +| :------ | :------- | :----------------------------------------------------------------------- | +| CBZ | `.cbz` | Arquivo de quadrinhos baseado em ZIP (processado localmente com pdf-lib) | +| CBR | `.cbr` | Arquivo de quadrinhos baseado em RAR (processado pelo mecanismo PyMuPDF) | + +O conversor de CBZ reconhece imagens JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC e JXL dentro do arquivo. Formatos não padrão são convertidos automaticamente para PNG antes de serem incorporados. + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos CBZ ou CBR. Você pode misturar os dois formatos em um único lote. +2. Revise os arquivos listados. Remova os que não precisa ou clique em **Adicionar mais arquivos** para incluir outros. +3. Clique em **Converter para PDF**. Para arquivos CBZ, a ferramenta descompacta o arquivo, ordena as imagens pelo nome em ordem natural, detecta o formato real de cada imagem e as incorpora em um PDF usando pdf-lib. Os arquivos CBR são processados pelo mecanismo PyMuPDF. +4. Um único arquivo é baixado como PDF. Vários arquivos geram um arquivo ZIP chamado `comic-converted.zip`. + +## Opções + +Nenhuma configuração é necessária. Cada imagem vira uma página com o mesmo tamanho original, então páginas duplas continuam largas e páginas simples continuam estreitas. + +## Casos de uso + +- Ler quadrinhos em um tablet ou aplicativo de celular que aceita PDF, mas não CBZ/CBR +- Imprimir páginas específicas de um quadrinho digital +- Arquivar uma coleção de quadrinhos em um formato que qualquer leitor de arquivos consegue abrir +- Compartilhar um quadrinho com alguém que não tem um leitor de quadrinhos dedicado + +## Dicas + +- As imagens dentro do arquivo são ordenadas em ordem natural (assim `page2.jpg` vem antes de `page10.jpg`). Nomeie seus arquivos com numeração consistente para obter a sequência correta de páginas. +- O conversor detecta os formatos de imagem pelas assinaturas binárias, não pelas extensões. Um PNG nomeado por engano como `.jpg` ainda será incorporado corretamente. +- Os arquivos CBZ são processados inteiramente no navegador, sem carregar o mecanismo PyMuPDF, então são convertidos mais rápido que os arquivos CBR. + +## Ferramentas relacionadas + +- [EPUB para PDF](./epub-to-pdf) +- [MOBI para PDF](./mobi-to-pdf) +- [Imagem para PDF](./image-to-pdf) diff --git a/docs/pt/tools/change-permissions.md b/docs/pt/tools/change-permissions.md new file mode 100644 index 00000000..e808964c --- /dev/null +++ b/docs/pt/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Alterar permissões +description: Defina ou modifique as permissões de uso do PDF para impressão, cópia, edição e anotações. Usa criptografia AES de 256 bits. +--- + +# Alterar permissões + +Ajuste com precisão o que os destinatários podem fazer com seu PDF. Ao contrário da criptografia básica, que apenas tranca o arquivo com uma senha, esta ferramenta permite permitir ou negar seletivamente impressão, cópia, edição, anotações, preenchimento de formulários, montagem do documento e extração de páginas, tudo garantido pela criptografia AES de 256 bits. + +## Como funciona + +1. Envie um arquivo PDF. +2. Se o PDF já estiver criptografado, digite a **Senha atual**. +3. Defina uma **Nova senha de usuário** (necessária para abrir) e/ou uma **Nova senha de proprietário** (controla as permissões). +4. Ative ou desative cada permissão usando as caixas de seleção. +5. Clique em **Alterar permissões**. +6. Baixe o PDF atualizado. + +Se você deixar os dois campos de nova senha vazios, a ferramenta descriptografa o PDF por completo, removendo toda a criptografia e as restrições. + +## Controles de permissão + +| Permissão | O que controla | +| ----------------------------------------- | ------------------------------------------------------------ | +| **Permitir impressão** | Se o documento pode ser impresso | +| **Permitir cópia** | Se texto e imagens podem ser selecionados e copiados | +| **Permitir modificação** | Se o conteúdo do documento pode ser editado | +| **Permitir anotações** | Se comentários, destaques e carimbos podem ser adicionados | +| **Permitir preenchimento de formulários** | Se os campos interativos de formulário podem ser preenchidos | +| **Permitir montagem do documento** | Se páginas podem ser inseridas, excluídas ou giradas | +| **Permitir extração de páginas** | Se páginas individuais podem ser extraídas | + +Todas as permissões exigem uma senha de proprietário para serem aplicadas. Sem uma senha de proprietário, os indicadores de permissão são ignorados pela maioria dos leitores de PDF. + +## Como as permissões funcionam no PDF + +As permissões do PDF fazem parte da especificação de criptografia. Elas são armazenadas como indicadores de bits no dicionário de criptografia e aplicadas por leitores de PDF compatíveis. A diferença principal: + +- **Senha de usuário**: necessária para abrir o arquivo. +- **Senha de proprietário**: necessária para alterar permissões ou remover restrições. Sem ela, os indicadores de permissão controlam quais operações o usuário pode realizar. + +Se você definir apenas uma senha de proprietário (sem senha de usuário), qualquer pessoa pode abrir o arquivo, mas fica restrita às operações permitidas. Se definir as duas, o arquivo exige uma senha para abrir e fica restrito após a autenticação. + +## Casos de uso + +- Distribuir um relatório que pode ser visualizado e impresso, mas não editado nem copiado +- Compartilhar um modelo de contrato que os destinatários podem preencher, mas não modificar +- Publicar um catálogo em PDF em que a cópia de imagens está desativada +- Permitir anotações em um rascunho de revisão e impedir alterações estruturais + +## Dicas + +- Para ser eficaz, sempre defina uma senha de proprietário. Permissões sem senha de proprietário não podem ser aplicadas. +- Algumas ferramentas de PDF de terceiros ignoram os indicadores de permissão. Para uma proteção mais forte, considere rasterizar o PDF ou usar DRM. +- Use esta ferramenta para atualizar PDFs antigos criptografados com RC4 para AES-256. + +## Ferramentas relacionadas + +- [Criptografar PDF](./protect-pdf): proteção simples por senha, sem permissões detalhadas +- [Descriptografar PDF](./unlock-pdf): remove a criptografia por completo +- [Remover Restrições](./remove-restrictions): elimina todas as restrições quando você tem a senha de proprietário diff --git a/docs/pt/tools/combine-single-page.md b/docs/pt/tools/combine-single-page.md new file mode 100644 index 00000000..1206257a --- /dev/null +++ b/docs/pt/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Combinar em página única +description: Una todas as páginas de um PDF em uma única rolagem contínua, vertical ou horizontal. +--- + +# Combinar em página única + +Junte todas as páginas de um PDF em uma única página longa. As páginas são unidas na vertical (como um rolo) ou na horizontal (lado a lado), gerando uma página contínua na saída. + +## Como funciona + +1. Envie um arquivo PDF. +2. Escolha a direção do layout: **Vertical** (páginas empilhadas de cima para baixo) ou **Horizontal** (páginas lado a lado). +3. Defina o espaçamento entre as páginas em pontos. +4. Escolha uma cor de fundo para os espaços entre as páginas. +5. Se quiser, ative os separadores (linhas finas entre as páginas) e configure a espessura e a cor. +6. Clique no botão de processar. A saída é um PDF de uma única página. + +## Recursos + +- União de páginas na vertical ou na horizontal +- Espaçamento configurável entre as páginas +- Seletor de cor de fundo para as áreas de espaço +- Linhas separadoras opcionais com espessura e cor ajustáveis +- Renderiza cada página original em resolução total no canvas combinado + +## Opções + +| Opção | Descrição | +| --------------------------- | ------------------------------------------------ | +| **Orientação** | Vertical (empilhado) ou Horizontal (lado a lado) | +| **Espaçamento das páginas** | Espaço entre as páginas em pontos | +| **Cor de fundo** | Cor da área entre as páginas | +| **Adicionar separador** | Ativa linhas finas entre as páginas | +| **Espessura do separador** | Espessura da linha em pontos | +| **Cor do separador** | Cor das linhas separadoras | + +## Casos de uso + +- Criar uma única imagem longa a partir de um wireframe ou protótipo de design com várias páginas +- Gerar uma visualização contínua e rolável de um documento para incorporar na web +- Unir um quadrinho ou storyboard de várias páginas em uma única tira +- Produzir uma visão panorâmica de páginas sequenciais para revisão + +## Dicas + +- A orientação vertical funciona melhor para documentos com páginas em retrato. A horizontal é melhor para conteúdo em paisagem. +- Documentos grandes com muitas páginas geram uma saída muito alta ou muito larga. Alguns visualizadores de PDF podem ter dificuldade com páginas únicas extremamente grandes. +- Adicionar separadores com uma cor contrastante facilita ver onde termina uma página original e começa a próxima. + +## Ferramentas relacionadas + +- [PDF N-Up](./n-up-pdf) +- [Mesclar PDF](./merge-pdf) +- [Dividir Páginas](./divide-pages) diff --git a/docs/pt/tools/compare-pdfs.md b/docs/pt/tools/compare-pdfs.md new file mode 100644 index 00000000..e70ce6b7 --- /dev/null +++ b/docs/pt/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Comparar PDFs +description: Compare dois documentos PDF lado a lado ou em modo de sobreposição, com detecção e categorização detalhadas das alterações. +--- + +# Comparar PDFs + +Envie dois PDFs e veja exatamente o que mudou entre eles. A ferramenta emparelha as páginas de forma inteligente, detecta diferenças em texto, imagens, anotações, cabeçalhos e formatação, e as apresenta em uma visualização lado a lado ou em sobreposição. + +## Como funciona + +1. Envie dois arquivos PDF: o original (à esquerda) e a versão revisada (à direita). +2. A ferramenta emparelha as páginas dos dois documentos usando assinaturas de conteúdo. +3. Selecione um modo de visualização: **Lado a lado** ou **Sobreposição**. +4. Navegue entre os pares de páginas com os controles de paginação. +5. As diferenças são destacadas e categorizadas. Use o painel de filtros para focar em tipos específicos de alteração. +6. Se quiser, exporte a comparação como um relatório em PDF. + +## Recursos + +- Emparelhamento automático de páginas com base na similaridade de conteúdo +- Visualizações de comparação lado a lado e em sobreposição +- Categorização das alterações: texto, imagem, cabeçalho/rodapé, anotação, formatação, plano de fundo +- Filtros por categoria para mostrar ou ocultar tipos específicos de alteração +- Busca de alterações de texto com filtro por consulta +- Suporte a OCR para comparar documentos digitalizados +- Controles de zoom para inspeção detalhada +- Rolagem sincronizada entre os painéis no modo lado a lado +- Exportação dos resultados da comparação como PDF + +## Opções + +| Opção | Descrição | +| ------------------------- | --------------------------------------------------------------------------------------------------------------- | +| **Modo de visualização** | Lado a lado ou Sobreposição | +| **OCR** | Ativa/desativa o OCR para comparar documentos digitalizados | +| **Idioma do OCR** | Idioma para a extração de texto por OCR | +| **Filtros de categoria** | Alterna a visibilidade das alterações de texto, imagem, cabeçalho/rodapé, anotação, formatação e plano de fundo | +| **Escopo das alterações** | No modo de sobreposição, alterna entre todas as alterações ou somente o conteúdo | +| **Zoom** | Ajusta o nível de ampliação para inspeção detalhada | + +## Casos de uso + +- Revisar versões de um contrato para encontrar exatamente o que mudou entre elas +- Comparar protótipos de design para verificar se as exportações em PDF correspondem ao esperado +- Auditar alterações em documentos de setores regulados, em que toda edição precisa ser rastreada +- Verificar se um processo de conversão de PDF preservou o conteúdo original com precisão +- Conferir documentos traduzidos com o original para detectar mudanças de layout + +## Dicas + +- A sobreposição empilha os dois documentos um sobre o outro, tornando imediatamente visíveis as diferenças espaciais (elementos deslocados, imagens redimensionadas). +- Ative o OCR ao comparar documentos digitalizados que não têm camada de texto. O mecanismo de comparação extrairá o texto das imagens das páginas. +- Use os filtros de categoria para focar no que importa. Por exemplo, oculte as alterações de formatação quando só se importar com as diferenças no conteúdo do texto. + +## Ferramentas relacionadas + +- [Ver Metadados](./view-metadata) +- [OCR para PDF](./ocr-pdf) +- [Mesclar PDF](./merge-pdf) diff --git a/docs/pt/tools/compress-pdf.md b/docs/pt/tools/compress-pdf.md new file mode 100644 index 00000000..6bc62b59 --- /dev/null +++ b/docs/pt/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Comprimir PDF +description: Reduza o tamanho do PDF em até 90% com o mecanismo Hyper Compress. Aceita tamanhos de arquivo alvo, processamento em lote e configurações de qualidade personalizadas. +--- + +# Comprimir PDF + +Reduza o tamanho dos seus PDFs sem estragá-los. O Comprimir PDF usa o [Hyper Compress](https://www.bentopdf.com/hyper-compress), o mecanismo de compressão próprio do BentoPDF. Ele recomprime imagens, cria subconjuntos e mescla fontes, e remove peso morto, como miniaturas incorporadas e dados privados de aplicativos. O PDF continua totalmente funcional: o texto permanece selecionável, e links e campos de formulário continuam funcionando. + +O Hyper Compress é compilado para WebAssembly e acompanha o BentoPDF, então a compressão funciona offline e em implantações isoladas da internet, sem configuração extra. + +## Como funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando os arquivos. +2. Escolha um **Nível de compressão**: Baixo, Médio, Alto ou Sem perdas. +3. Se quiser, informe um **Tamanho de arquivo alvo** ou expanda as **Configurações personalizadas** para um controle mais detalhado, incluindo **Converter para tons de cinza**. +4. Clique em **Comprimir PDF**. Para vários arquivos, você recebe um único download em ZIP. + +## Documentos especiais + +- **PDFs assinados digitalmente** são devolvidos sem alterações, porque qualquer mudança invalidaria a assinatura. Ative **Ignorar proteção de conteúdo** nas Configurações personalizadas para remover as assinaturas e comprimi-los; a assinatura visível permanece na página, mas o arquivo deixa de estar assinado. +- **Arquivos PDF/A** perdem o selo PDF/A após a compressão, para que o arquivo nunca afirme uma conformidade que não cumpre mais. Ative **Preservar PDF/A** nas Configurações personalizadas para manter o arquivo em conformidade. +- **PDFs protegidos por senha** ganham um campo de senha no cartão do arquivo. Digite a senha ali e o Hyper Compress abre o arquivo por conta própria, sem uma etapa separada de desbloqueio. Com dois ou mais arquivos bloqueados, um único campo compartilhado desbloqueia todos os arquivos que usam a mesma senha. A cópia comprimida não tem senha; use [Criptografar PDF](./protect-pdf) para adicionar uma novamente. +- **Digitalizações sem camada de texto** podem encolher ainda mais com **Rasterizar páginas** nas Configurações personalizadas, que substitui cada página por uma imagem otimizada. A opção é ignorada em qualquer documento com texto selecionável, incluindo digitalizações com OCR, a menos que **Ignorar proteção de conteúdo** esteja ativado. Nesse caso, páginas com texto também viram imagens, então o texto deixa de ser selecionável e os links param de funcionar. + +## Níveis de compressão + +| Nível | Qualidade da imagem | Resolução máxima | Ideal para | +| -------------- | ------------------- | ---------------- | ------------------------------------ | +| **Baixo** | 80 | 200 DPI | Preservar a qualidade visual | +| **Médio** | 50 | 150 DPI | Documentos do dia a dia | +| **Alto** | 20 | 72 DPI | Anexos de e-mail, uploads para a web | +| **Sem perdas** | Imagens intactas | Inalterada | Cópias de arquivamento | + +O nível Alto também remove a incorporação das 14 fontes padrão do PDF, além de fontes semelhantes, como a Arial, quando isso é seguro. + +## Tamanho de arquivo alvo + +Informe um tamanho em KB ou MB e o Hyper Compress busca a melhor qualidade de imagem que ainda caiba, partindo do nível escolhido. Se o documento não puder ficar tão pequeno, você recebe a menor versão possível e uma mensagem avisando. As páginas dedicadas, como [Comprimir PDF para 1MB](https://www.bentopdf.com/compress-pdf-to-1mb), abrem com o alvo já preenchido. + +## Configurações personalizadas + +Expanda o painel de Configurações personalizadas para ajustar o Hyper Compress diretamente. Escolher um nível de compressão restaura esses valores para os do nível, e editar qualquer um deles muda o nível para Personalizado. + +- **Ignorar proteção de conteúdo**: por padrão, o Hyper Compress não mexe em PDFs assinados e não rasteriza páginas que têm texto. Ativar esta opção ignora as duas regras. Ela continua ativada quando você muda o nível. + +- **Imagens**: qualidade da imagem, resolução máxima, reamostragem forçada, redução de cores, recorte de áreas invisíveis de imagens, remoção de imagens alternativas, simplificação de perfis de cor, JPEG 2000 e modo sem perdas +- **Fontes**: criação de subconjuntos, mesclagem de duplicatas e remoção da incorporação de fontes padrão e suas semelhantes +- **Conteúdo**: achatar anotações, campos de formulário ou links +- **Limpeza**: remoção de miniaturas, dados de aplicativos, threads de artigos, informações de captura da web, árvore de estrutura ou intenções de saída +- **Rasterizar**: substituir páginas por imagens, para digitalizações somente de imagem; ignorado quando o documento tem texto selecionável +- **Saída**: Preservar PDF/A e compressão Brotli para leitores de PDF 2.0 que a suportam + +## Casos de uso + +- Fazer um relatório de 50 MB caber no limite de anexos de e-mail +- Colocar uma digitalização abaixo do limite rígido de upload de um portal usando um tamanho de arquivo alvo +- Otimizar PDFs de marketing para downloads mais rápidos no site +- Arquivar grandes conjuntos de documentos em que o custo de armazenamento importa +- Reduzir o uso de dados móveis ao compartilhar PDFs em aplicativos de mensagens + +## Dicas + +- Comece pelo Médio. Se o resultado ainda for grande demais, defina um tamanho de arquivo alvo ou suba para o Alto. +- Para uma digitalização sem camada de texto, ative Rasterizar páginas nas Configurações personalizadas. +- Converter para tons de cinza, nas Configurações personalizadas, pode reduzir o tamanho de documentos com muitas cores. + +## Ferramentas relacionadas + +- [Linearizar PDF](./linearize-pdf): otimize o PDF comprimido para visualização rápida na web +- [Rasterizar PDF](./rasterize-pdf): converta páginas em imagens com um DPI específico, inclusive páginas com texto +- [Reparar PDF](./repair-pdf): corrija um PDF que quebrou durante a compressão em outro lugar +- [Remover Metadados](./remove-metadata): elimine dados ocultos para maior privacidade diff --git a/docs/pt/tools/crop-pdf.md b/docs/pt/tools/crop-pdf.md new file mode 100644 index 00000000..213e6da7 --- /dev/null +++ b/docs/pt/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Cortar PDF +description: Corte visualmente as páginas do PDF desenhando uma região de corte em cada página com um editor baseado em Cropper.js. +--- + +# Cortar PDF + +Apare as margens das páginas do PDF com uma interface visual de corte. Desenhe um retângulo de corte diretamente em cada página, visualize o resultado e aplique o corte. Você pode definir regiões de corte diferentes para páginas diferentes ou aplicar o mesmo corte ao documento inteiro. + +## Como funciona + +1. Envie seu arquivo PDF. +2. O editor de corte abre, mostrando a primeira página com uma sobreposição de corte arrastável. +3. Ajuste o retângulo de corte arrastando suas bordas ou cantos. +4. Use os botões de navegação de páginas para passar entre as páginas e definir a região de corte de cada uma. +5. Clique em **Cortar** para aplicar o corte e baixar o resultado. + +## Recursos + +- Editor de corte visual baseado em Cropper.js, com alças para ajuste preciso +- Navegação página a página para definir regiões de corte individuais +- Guarda as configurações de corte por página, para que você defina cortes diferentes em páginas diferentes +- Pré-visualização ao vivo da área de corte selecionada +- Compatível com PDFs de qualquer tamanho de página ou orientação + +## Casos de uso + +- Remover margens largas de documentos digitalizados para focar na área de conteúdo +- Aparar marcas de corte ou de registro de impressora em PDFs de pré-impressão +- Cortar slides de aula para remover a área de notas do apresentador +- Remover cabeçalhos ou rodapés de todas as páginas antes de compartilhar um trecho de documento +- Redimensionar páginas para caber em uma tela ou layout de impressão específico + +## Dicas + +- A sobreposição de corte pode ser redimensionada e reposicionada livremente. Arraste os cantos para redimensionar proporcionalmente ou as bordas para ajustar um só eixo. +- Para documentos em que todas as páginas precisam do mesmo corte, defina-o na primeira página: a ferramenta lembra a região de corte conforme você navega pelas páginas. +- Se você precisa padronizar os tamanhos das páginas em vez de cortar visualmente, a ferramenta Ajustar Tamanho da Página pode ser mais adequada. + +## Ferramentas relacionadas + +- [Editor de PDF](./edit-pdf) +- [Números de Página](./page-numbers) +- [Remover Páginas em Branco](./remove-blank-pages) diff --git a/docs/pt/tools/csv-to-pdf.md b/docs/pt/tools/csv-to-pdf.md new file mode 100644 index 00000000..a882eae4 --- /dev/null +++ b/docs/pt/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV para PDF +description: Converta planilhas CSV em tabelas PDF formatadas diretamente no seu navegador. +--- + +# CSV para PDF + +Transforme arquivos CSV em documentos PDF limpos e formatados. Cada CSV é analisado e renderizado como uma tabela no PDF de saída. É útil quando você precisa imprimir ou compartilhar dados tabulares sem exigir que o destinatário tenha um programa de planilhas. + +## Formatos compatíveis + +| Formato | Extensões | +| :------ | :-------- | +| CSV | `.csv` | + +## Como funciona + +1. Clique na área de upload ou arraste e solte um ou mais arquivos CSV. +2. Revise a lista de arquivos. Adicione mais arquivos ou remova os indesejados. +3. Clique em **Converter para PDF**. Um indicador de progresso mostra o andamento da conversão. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são empacotados em `csv-converted.zip`. + +## Opções + +Esta ferramenta não tem configurações adicionais. O CSV é analisado e formatado automaticamente como uma tabela. + +## Saída + +| Quantidade de entrada | Saída | +| :-------------------- | :------------------------------------------------------------ | +| 1 arquivo | Download de um único PDF (por exemplo, `data.pdf`) | +| 2 ou mais arquivos | Arquivo ZIP (`csv-converted.zip`) contendo um PDF por arquivo | + +## Casos de uso + +- Converter relatórios exportados de bancos de dados em tabelas PDF imprimíveis +- Compartilhar dados financeiros ou listas de estoque com pessoas que não têm o Excel +- Criar versões em PDF de arquivos de log CSV para documentação de conformidade +- Imprimir listas de endereços, planilhas de notas ou quaisquer dados tabulares armazenados em CSV + +## Dicas + +- Para obter os melhores resultados, garanta que seu CSV use delimitadores de vírgula padrão. A ferramenta segue as convenções comuns de análise de CSV. +- Se o seu CSV tem muitas colunas, a tabela pode ser comprimida para caber na largura da página. Considere dividir conjuntos de dados largos em vários arquivos. +- Para arquivos do Excel (`.xls`, `.xlsx`), use a ferramenta [Excel para PDF](./excel-to-pdf), que preserva a formatação da planilha e várias planilhas. + +## Ferramentas relacionadas + +- [Excel para PDF](./excel-to-pdf) +- [Texto para PDF](./txt-to-pdf) +- [JSON para PDF](./json-to-pdf) diff --git a/docs/pt/tools/delete-pages.md b/docs/pt/tools/delete-pages.md new file mode 100644 index 00000000..ed7c6f60 --- /dev/null +++ b/docs/pt/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Excluir páginas +description: Remova páginas específicas de um PDF por número, intervalo ou seleção visual de miniaturas. +--- + +# Excluir páginas + +Remova páginas indesejadas de um documento PDF. Indique as páginas a excluir digitando números de página ou intervalos, ou clique diretamente nas miniaturas para marcá-las para remoção. + +## Como funciona + +1. Envie um arquivo PDF. A ferramenta renderiza miniaturas de todas as páginas. +2. Digite as páginas a excluir no campo de texto usando a sintaxe de intervalos (por exemplo, `2, 5-8`) ou clique nas miniaturas para alternar a seleção. +3. As páginas marcadas ficam destacadas para você confirmar a seleção. +4. Clique no botão de processar. Um novo PDF é criado sem as páginas selecionadas. + +## Recursos + +- Seleção de páginas por texto com sintaxe de intervalos (`2, 5-8, 12`) +- Grade visual de miniaturas para excluir com um clique +- Destaque em tempo real das páginas marcadas para exclusão +- Validação da entrada em relação ao número real de páginas +- Mantém todas as páginas não excluídas na ordem original + +## Casos de uso + +- Remover páginas em branco ou de preenchimento de um documento digitalizado +- Retirar capas ou apêndices antes de compartilhar um documento +- Limpar páginas de rascunho deixadas por engano em um PDF final +- Remover páginas com informações sensíveis antes da distribuição + +## Dicas + +- Excluir páginas não afeta o conteúdo nem a formatação das páginas restantes. A saída é uma cópia fiel do original sem as páginas removidas. +- Se você quer manter apenas páginas específicas em vez de remover algumas, [Extrair Páginas](./extract-pages) é a melhor opção. +- A visualização de miniaturas carrega sob demanda, então documentos grandes continuam responsivos. + +## Ferramentas relacionadas + +- [Extrair Páginas](./extract-pages) +- [Duplicar e Organizar](./organize-pdf) +- [Dividir PDF](./split-pdf) diff --git a/docs/pt/tools/deskew-pdf.md b/docs/pt/tools/deskew-pdf.md new file mode 100644 index 00000000..1a5b1232 --- /dev/null +++ b/docs/pt/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Desinclinar PDF +description: Endireite automaticamente páginas inclinadas em PDFs digitalizados usando a detecção de inclinação do OpenCV. Limite e DPI ajustáveis. +--- + +# Desinclinar PDF + +Documentos digitalizados raramente ficam perfeitamente retos. Mesmo uma leve inclinação deixa o OCR menos preciso e a impressão com aspecto desleixado. Esta ferramenta usa os algoritmos de processamento de imagem do OpenCV para detectar o ângulo de inclinação de cada página e girá-la de volta ao nível. + +## Como funciona + +1. Envie um ou mais PDFs digitalizados. +2. Defina o **Limite de inclinação**: páginas com inclinação detectada abaixo desse valor não são alteradas. +3. Escolha a **Qualidade de processamento (DPI)**: um DPI maior melhora a precisão da detecção, mas demora mais. +4. Clique em **Desinclinar PDF**. +5. Após o processamento, um painel de resultados mostra o ângulo detectado em cada página e se ela foi corrigida. + +## Opções + +| Configuração | Valores | Padrão | +| ------------------------ | ------------------------ | ------ | +| **Limite de inclinação** | 0,1, 0,5, 1,0, 2,0 graus | 0,5 | +| **DPI de processamento** | 100, 150, 200, 300 | 150 | + +## Como funciona a detecção de inclinação + +A ferramenta renderiza cada página como imagem no DPI selecionado e usa o OpenCV para detectar os ângulos dominantes das linhas no conteúdo. Se a inclinação detectada exceder o limite, a página é girada no ângulo inverso para ficar reta. Páginas abaixo do limite passam sem alterações. + +## Casos de uso + +- Limpar contratos ou documentos jurídicos digitalizados em lote +- Preparar recibos ou notas fiscais digitalizados para o processamento de OCR +- Endireitar páginas de um scanner de mesa com posicionamento irregular do papel +- Melhorar a qualidade visual de materiais de arquivo digitalizados + +## Dicas + +- Reduza o limite para 0,1 grau se precisar de alinhamento perfeito ao pixel para o OCR. +- 150 DPI é rápido e preciso para a maioria dos documentos. Use 300 DPI para textos muito pequenos ou páginas com detalhes finos. +- O desinclinar funciona melhor em documentos com linhas de texto horizontais nítidas. Pode ter dificuldade com páginas que são majoritariamente imagens ou elementos de design diagonais. + +## Ferramentas relacionadas + +- [Rasterizar PDF](./rasterize-pdf): converta a saída desinclinada em um PDF plano baseado em imagens +- [Comprimir PDF](./compress-pdf): reduza o tamanho do arquivo após desinclinar +- [Reparar PDF](./repair-pdf): corrija problemas estruturais em PDFs digitalizados diff --git a/docs/pt/tools/digital-sign-pdf.md b/docs/pt/tools/digital-sign-pdf.md new file mode 100644 index 00000000..0b772094 --- /dev/null +++ b/docs/pt/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Assinatura Digital +description: Adicione assinaturas digitais criptográficas a PDFs usando certificados X.509. Aceita os formatos PKCS#12 e PEM, com opções de assinatura visível. +--- + +# Assinatura Digital + +Uma assinatura digital é uma prova criptográfica de que uma pessoa específica assinou um documento e de que ele não foi alterado desde então. Ao contrário de uma assinatura desenhada (que é apenas uma imagem), a assinatura digital usa certificados X.509 e padrões PKCS#7 para oferecer autenticidade e integridade verificáveis. + +O BentoPDF aplica assinaturas digitais inteiramente no seu navegador. Sua chave privada nunca sai do seu dispositivo. + +## Como funciona + +1. Envie um arquivo PDF. +2. Envie o arquivo do seu certificado (.pfx, .p12 ou .pem). +3. Digite a senha do certificado para desbloqueá-lo. A ferramenta exibe o titular, o emissor e o período de validade do certificado. +4. Se quiser, configure os metadados da assinatura (motivo, local, informações de contato). +5. Se quiser, ative uma **assinatura visível** com personalização de posição, tamanho, imagem e texto. +6. Clique em **Assinar PDF**. + +## Formatos de certificado compatíveis + +| Formato | Extensões | Descrição | +| ----------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------ | +| **PKCS#12** | .pfx, .p12 | Pacote padrão do setor contendo a chave privada e a cadeia de certificados. Formato mais comum. | +| **PEM** | .pem | Formato baseado em texto. Deve conter o certificado e a chave privada no mesmo arquivo. Aceita chaves privadas criptografadas. | + +## Opções de assinatura visível + +Quando ativado, um bloco de assinatura visível é renderizado na página do PDF: + +- **Posição**: coordenadas X/Y e largura/altura em pontos +- **Página**: primeira página, última página, todas as páginas ou um número de página específico +- **Imagem**: envie uma imagem PNG, JPG ou WebP (sua assinatura manuscrita, selo da empresa etc.) +- **Texto**: texto personalizado com cor e tamanho de fonte configuráveis. Se nenhuma imagem ou texto for fornecido, a ferramenta gera automaticamente um texto a partir do nome comum do certificado e da data atual. + +## Metadados da assinatura + +- **Motivo**: por que o documento foi assinado (por exemplo, "Aprovado", "Revisado") +- **Local**: onde a assinatura ocorreu (por exemplo, "São Paulo, SP") +- **Informações de contato**: como falar com o signatário (por exemplo, endereço de e-mail) + +## Nota sobre conexão com a internet + +A assinatura pode exigir conexão com a internet. A biblioteca de assinatura busca a cadeia de certificados em URLs incorporadas na extensão Authority Information Access (AIA) do seu certificado. Se esses servidores estiverem inacessíveis, a assinatura falhará para certificados que exigem validação da cadeia. + +## Casos de uso + +- Assinar contratos, propostas e acordos com assinaturas digitais juridicamente vinculantes +- Certificar documentos oficiais em fluxos de trabalho que exigem autenticação baseada em PKI +- Assinar notas fiscais em PDF para conformidade regulatória (muitos países da UE exigem faturas eletrônicas assinadas digitalmente) +- Adicionar aprovação organizacional a desenhos de engenharia ou documentos de qualidade + +## Dicas + +- Certificados autoassinados servem para testes, mas exibem avisos no Adobe Reader. Use um certificado de uma Autoridade Certificadora confiável para documentos em produção. +- A assinatura visível é puramente visual. A assinatura criptográfica é incorporada independentemente de o bloco visível estar ativado. +- Verifique seu PDF assinado com a ferramenta Validar Assinatura PDF para confirmar que a assinatura está intacta. + +## Ferramentas relacionadas + +- [Validar Assinatura PDF](./validate-signature-pdf): verifique assinaturas digitais em PDFs assinados +- [Achatar PDF (Flatten)](./flatten-pdf): achate formulários antes de assinar para impedir modificações +- [Criptografar PDF](./protect-pdf): adicione proteção por senha além da assinatura digital +- [Remover Metadados](./remove-metadata): elimine metadados antes de assinar diff --git a/docs/pt/tools/divide-pages.md b/docs/pt/tools/divide-pages.md new file mode 100644 index 00000000..53ea4262 --- /dev/null +++ b/docs/pt/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Dividir páginas +description: Divida páginas de PDF na horizontal ou na vertical em subpáginas menores. +--- + +# Dividir páginas + +Corte páginas individuais de um PDF ao meio, dividindo-as na horizontal ou na vertical. É útil quando uma única página contém conteúdo que deveria ficar em páginas separadas, por exemplo, um layout de duas colunas digitalizado como uma página larga. + +## Como funciona + +1. Envie um arquivo PDF. +2. Selecione a direção da divisão: **Vertical** (metades esquerda/direita) ou **Horizontal** (metades superior/inferior). +3. Se quiser, informe um intervalo de páginas para limitar quais páginas serão divididas. Deixe em branco para dividir todas. +4. Clique no botão de processar para gerar o PDF dividido. + +## Recursos + +- Divisão vertical: divide cada página em metades esquerda e direita +- Divisão horizontal: divide cada página em metades superior e inferior +- Filtro de intervalo de páginas para dividir apenas páginas específicas +- As páginas não selecionadas passam sem alterações +- Preserva a qualidade do conteúdo sem renderizar novamente + +## Casos de uso + +- Separar páginas digitalizadas em duas por folha (por exemplo, a digitalização de um livro com páginas esquerda e direita na mesma folha) +- Dividir um PDF em paisagem com conteúdo lado a lado em páginas individuais em retrato +- Dividir infográficos ou pôsteres altos em seções superior e inferior separadas +- Preparar documentos de formato largo para impressão em papel padrão + +## Dicas + +- Se suas páginas têm conteúdo distribuído de forma desigual, a divisão ainda ocorre exatamente no ponto médio. Para divisões assimétricas, use [Cortar PDF](./crop-pdf). +- Combine esta ferramenta com [Girar PDF](./rotate-pdf) se suas páginas precisarem ser giradas antes ou depois da divisão. + +## Ferramentas relacionadas + +- [Dividir PDF](./split-pdf) +- [Cortar PDF](./crop-pdf) +- [PDF N-Up](./n-up-pdf) +- [Posterizar PDF](./posterize-pdf) diff --git a/docs/pt/tools/duplex-collate.md b/docs/pt/tools/duplex-collate.md new file mode 100644 index 00000000..a7626660 --- /dev/null +++ b/docs/pt/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Intercalar digitalização frente e verso +description: Reordene PDFs de digitalização frente e verso que têm as páginas da frente e do verso em blocos separados, colocando-os na ordem correta. +--- + +# Intercalar digitalização frente e verso + +O Intercalar digitalização frente e verso foi pensado para fluxos de digitalização com alimentador automático (ADF) em que um PDF contém dois blocos de páginas: + +- todas as frentes primeiro +- todos os versos depois + +Em vez de dividir e remontar manualmente, esta ferramenta intercala os dois blocos na ordem natural de leitura: frente1, verso1, frente2, verso2 e assim por diante. + +## Como funciona + +1. Envie um único PDF criado a partir da digitalização de uma pilha frente e verso. +2. Defina o ponto de divisão onde termina o bloco das frentes. +3. Escolha como tratar o bloco dos versos: + - **Inverter bloco dos versos** (comum quando a pilha é virada antes de digitalizar os versos) + - **Manter bloco dos versos como está** +4. Clique em **Intercalar PDF** para baixar o resultado reordenado. + +## Opções + +- **Detectar divisão automaticamente (metade)**: define o ponto de divisão como `ceil(totalPages / 2)`. +- **Aviso de página ímpar**: avisa quando o total de páginas é ímpar (geralmente indica um erro de digitalização). +- **Confirmação de blocos desiguais**: pede confirmação quando os tamanhos dos blocos de frente e verso são diferentes. +- **Exportação agrupada**: divide a saída intercalada em PDFs separados com base na quantidade de páginas do documento original e baixa tudo como ZIP. + +## Comportamento da saída + +- **Padrão**: um PDF de saída (um PDF de entrada gera um PDF de saída). +- **Modo agrupado**: a saída é dividida conforme o valor de páginas por documento; se forem produzidos vários grupos, eles são baixados em um único ZIP; caso contrário, um único PDF é baixado. + +Se os blocos tiverem tamanhos desiguais, as páginas pareadas são intercaladas primeiro e as páginas restantes sem par são adicionadas ao final. + +## Casos de uso comuns + +- Restaurar a ordem depois de digitalizar uma pilha de formulários frente e verso em duas passagens. +- Remontar pacotes de frente e verso de scanners de escritório que geram todas as frentes e depois todos os versos. +- Pós-processar digitalizações de arquivo antes de dividi-las em arquivos por documento. + +## Dicas + +- A maioria dos lotes frente e verso deve ter um número par de páginas. +- Se os versos aparecerem invertidos na saída, alterne entre **Inverter bloco dos versos** e **Manter bloco dos versos como está**. +- Para originais de 2 páginas (frente e verso), use a exportação agrupada com `2` páginas por documento. + +## Ferramentas relacionadas + +- [Alternar e Misturar Páginas](./alternate-merge) +- [Dividir PDF](./split-pdf) +- [Mesclar PDF](./merge-pdf) +- [Duplicar e Organizar](./organize-pdf) diff --git a/docs/pt/tools/edit-attachments.md b/docs/pt/tools/edit-attachments.md new file mode 100644 index 00000000..80953dc5 --- /dev/null +++ b/docs/pt/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Editar anexos +description: Visualize e remova seletivamente os arquivos anexados incorporados em um documento PDF. +--- + +# Editar anexos + +Inspecione e gerencie os arquivos anexados dentro de um PDF. A ferramenta lista cada arquivo incorporado com seu nome e nível de anexo, e permite marcar anexos individuais para remoção ou removê-los todos de uma vez. + +## Como funciona + +1. Envie um arquivo PDF. +2. A ferramenta procura os anexos automaticamente e os exibe em uma lista. +3. Cada anexo mostra o nome do arquivo e se é um anexo de nível de documento ou de nível de página. +4. Clique no ícone de lixeira ao lado de um anexo para marcá-lo para remoção (clique novamente para desmarcar). +5. Use o botão **Remover todos os anexos** para selecionar tudo de uma vez ou **Desmarcar tudo** para limpar suas seleções. +6. Clique no botão de processar para salvar um novo PDF sem os anexos selecionados. + +## Recursos + +- Lista todos os anexos de nível de documento e de nível de página +- Remoção de anexos individual ou em massa +- Alterne a seleção antes de confirmar as alterações +- Texto riscado e opacidade reduzida nos itens marcados para remoção +- Baixa o PDF modificado sem os anexos selecionados + +## Casos de uso + +- Remover arquivos desatualizados ou incorretos incorporados em um documento antes de redistribuí-lo +- Retirar anexos sensíveis (dados financeiros, informações pessoais) de um PDF antes de compartilhá-lo +- Reduzir o tamanho do PDF removendo arquivos incorporados grandes que não são mais necessários +- Auditar o conteúdo incorporado e limpar um documento antes de arquivá-lo + +## Dicas + +- Os anexos marcados para remoção aparecem riscados. Você pode desfazer a marcação antes de processar, se mudar de ideia. +- Se nenhum anexo for encontrado, a ferramenta exibe a mensagem "Nenhum anexo encontrado", ou seja, o PDF simplesmente não contém arquivos incorporados. + +## Ferramentas relacionadas + +- [Adicionar Anexos](./add-attachments) +- [Extrair Anexos](./extract-attachments) +- [Ver Metadados](./view-metadata) diff --git a/docs/pt/tools/edit-metadata.md b/docs/pt/tools/edit-metadata.md new file mode 100644 index 00000000..725a9e17 --- /dev/null +++ b/docs/pt/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Editar metadados +description: Visualize e modifique campos de metadados do PDF, incluindo título, autor, palavras-chave, datas e propriedades personalizadas. +--- + +# Editar metadados + +Edite os metadados incorporados em um arquivo PDF. A ferramenta preenche um formulário com os metadados existentes do documento, permite modificar qualquer campo e salva as alterações em um novo PDF. + +## Como funciona + +1. Envie um arquivo PDF. A ferramenta lê os metadados atuais e preenche o formulário. +2. Edite qualquer um dos campos padrão: Título, Autor, Assunto, Palavras-chave, Criador, Produtor. +3. Ajuste a Data de criação e a Data de modificação usando os seletores de data e hora. +4. Adicione campos de metadados personalizados clicando no botão de adicionar e informando um par chave-valor. +5. Clique no botão de processar para salvar o PDF modificado. + +## Recursos + +- Preenche todos os metadados existentes do PDF enviado +- Campos padrão: Título, Autor, Assunto, Palavras-chave, Criador, Produtor +- Seletores de data e hora para Data de criação e Data de modificação +- Campos personalizados de chave-valor para propriedades arbitrárias +- Salva as alterações diretamente no dicionário de informações do documento PDF + +## Campos editáveis + +| Campo | Descrição | +| ------------------------- | ------------------------------------------------------- | +| **Título** | O título do documento exibido nos leitores de PDF | +| **Autor** | A pessoa ou organização que criou o documento | +| **Assunto** | Uma breve descrição do tema do documento | +| **Palavras-chave** | Termos separados por vírgula para busca e categorização | +| **Criador** | O aplicativo que criou o conteúdo originalmente | +| **Produtor** | O aplicativo que gerou o PDF | +| **Data de criação** | Quando o documento foi criado originalmente | +| **Data de modificação** | Quando o documento foi modificado pela última vez | +| **Campos personalizados** | Quaisquer pares chave-valor adicionais que você definir | + +## Casos de uso + +- Definir um título e um autor adequados antes de publicar um documento +- Adicionar palavras-chave para melhorar a capacidade de busca em sistemas de gestão de documentos +- Atualizar a data de modificação para refletir a revisão atual +- Adicionar campos de metadados personalizados, como Departamento, ID do projeto ou Classificação +- Limpar metadados deixados pelo software de criação original + +## Dicas + +- Os campos personalizados são gravados diretamente no dicionário de informações do PDF. Alguns leitores de PDF podem não exibir campos personalizados, mas eles são preservados no arquivo. +- Deixe um campo em branco para apagá-lo dos metadados. O botão de processar salva o que estiver no formulário. +- Para ver os metadados sem editar, use [Ver Metadados](./view-metadata). Para remover todos os metadados, use Remover Metadados. + +## Ferramentas relacionadas + +- [Ver Metadados](./view-metadata) +- [Camadas PDF (OCG)](./pdf-layers) +- [Comprimir PDF](./compress-pdf) diff --git a/docs/pt/tools/edit-pdf.md b/docs/pt/tools/edit-pdf.md new file mode 100644 index 00000000..44ee074b --- /dev/null +++ b/docs/pt/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Editor de PDF +description: Anote, destaque, oculte informações, adicione formas e imagens, pesquise e visualize PDFs diretamente no navegador. +--- + +# Editor de PDF + +O Editor de PDF do BentoPDF permite anotar, destacar, redigir (ocultar informações), comentar, adicionar formas e imagens e pesquisar em seus PDFs. Ele carrega um editor completo diretamente no navegador, sem uploads para servidores. + +## Como funciona + +1. Envie seu PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. O editor de PDF incorporado abre automaticamente com seu documento carregado. +3. Use a barra de ferramentas para anotar, destacar, redigir, adicionar texto, desenhar formas ou inserir imagens. +4. Clique em **Baixar PDF editado** para salvar suas alterações. + +## Recursos + +- Barra de anotações completa com destaque, sublinhado, tachado e desenho à mão livre +- Inserção de texto e comentários +- Ferramentas de redação que removem permanentemente o conteúdo marcado depois que você aplica a redação. Se houver marcações não aplicadas quando você clicar em **Baixar PDF editado**, o editor oferece aplicá-las antes. +- Ferramentas de formas para retângulos, círculos, linhas e setas +- Inserção de imagens nas páginas do PDF +- Pesquisa de texto integrada em todo o documento +- Suporte a vários documentos com abas (até 10 documentos abertos ao mesmo tempo) +- Carregamento de arquivos por arrastar e soltar + +## Casos de uso + +- Revisar contratos e marcar alterações com destaques e comentários +- Redigir informações confidenciais, como números de CPF ou dados financeiros, antes de compartilhar +- Adicionar anotações a plantas arquitetônicas ou desenhos de engenharia +- Inserir logotipos ou carimbos da empresa nas páginas de um documento +- Pesquisar termos específicos em documentos jurídicos extensos + +## Dicas + +- Você pode abrir vários PDFs ao mesmo tempo e alternar entre eles usando a barra de abas no topo do editor. +- O editor preserva a estrutura original do PDF, então fontes, layouts e campos de formulário permanecem intactos. +- Marcar um texto ou uma área para redação não remove nada até que a redação seja aplicada. Quando você redige um texto selecionado, as cópias dele nas propriedades, favoritos, comentários e anexos do arquivo também são removidas do download, a menos que o arquivo esteja criptografado. +- Para marca d'água ou numeração de páginas em lote, use as ferramentas dedicadas, que oferecem mais controle sobre a formatação. + +## Ferramentas relacionadas + +- [Adicionar Marca d'Água](./add-watermark) +- [Assinar PDF](./sign-pdf) +- [Adicionar Carimbos](./add-stamps) +- [Remover Anotações](./remove-annotations) diff --git a/docs/pt/tools/email-to-pdf.md b/docs/pt/tools/email-to-pdf.md new file mode 100644 index 00000000..ea4a0292 --- /dev/null +++ b/docs/pt/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-mail para PDF +description: Converta arquivos de e-mail EML e MSG em PDF no seu navegador. Preserva cabeçalhos, corpo e lista de anexos. +--- + +# E-mail para PDF + +Converta e-mails salvos em PDFs limpos e imprimíveis. A ferramenta analisa arquivos EML e MSG, extrai a mensagem completa (cabeçalhos, conteúdo do corpo e metadados dos anexos) e renderiza tudo em um PDF estruturado. Útil para descoberta jurídica, arquivamento de registros ou simplesmente para imprimir um e-mail importante. + +## Formatos compatíveis + +| Formato | Extensão | Observações | +| :------ | :------- | :---------------------------------------------------------------------------- | +| EML | `.eml` | Formato MIME padrão de e-mail (exportado pela maioria dos clientes de e-mail) | +| MSG | `.msg` | Formato proprietário do Microsoft Outlook | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos EML ou MSG. Você pode misturar os dois formatos em um único lote. +2. Revise a lista de arquivos. Remova entradas indesejadas com o ícone de lixeira ou clique em **Adicionar mais arquivos** para incluir mais e-mails. +3. Configure as opções de conversão (veja abaixo). +4. Clique em **Converter para PDF**. A ferramenta analisa cada e-mail, renderiza o conteúdo como HTML estilizado e o converte em PDF pelo mecanismo PyMuPDF. +5. Um único e-mail é baixado diretamente como PDF. Vários e-mails são empacotados em `emails-converted.zip`. + +## Opções + +| Opção | Padrão | Descrição | +| :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------ | +| **Tamanho da página** | A4 | Escolha entre as dimensões de página A4, Carta (Letter) ou Ofício (Legal). | +| **Incluir Cc e Cco** | Ativado | Quando ativado, as listas de destinatários em Cc e Cco aparecem na seção de cabeçalho do e-mail no PDF. | +| **Incluir lista de anexos** | Ativado | Quando ativado, uma lista dos arquivos anexados ao e-mail (com nomes e tamanhos) aparece no PDF. | + +## Casos de uso + +- Arquivar correspondências comerciais importantes em PDF para conformidade ou auditoria +- Imprimir cadeias de e-mails para processos judiciais ou pedidos de descoberta +- Criar um registro permanente de confirmações de pedido, recibos ou contratos recebidos por e-mail +- Fazer backup de arquivos MSG do Outlook em um formato que não exige o Outlook para ser lido +- Documentar interações de suporte ao cliente a partir de arquivos EML exportados + +## Dicas + +- Tanto arquivos EML (usados pelo Thunderbird, Apple Mail e a maioria dos clientes de e-mail) quanto arquivos MSG do Outlook são compatíveis. Exporte os e-mails do seu cliente de e-mail e solte-os diretamente na ferramenta. +- E-mails em formato HTML mantêm o estilo no PDF. E-mails em texto simples são renderizados com uma formatação limpa e legível. +- A lista de anexos mostra nomes e tamanhos de arquivos, mas não incorpora os arquivos anexados no PDF. + +## Ferramentas relacionadas + +- [XML para PDF](./xml-to-pdf) +- [XPS para PDF](./xps-to-pdf) diff --git a/docs/pt/tools/epub-to-pdf.md b/docs/pt/tools/epub-to-pdf.md new file mode 100644 index 00000000..f810da7b --- /dev/null +++ b/docs/pt/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB para PDF +description: Converta ebooks EPUB em PDF no seu navegador. Grátis, sem upload, com conversão focada na privacidade. +--- + +# EPUB para PDF + +Converta ebooks EPUB em arquivos PDF sem sair do navegador. O EPUB é o padrão aberto para livros digitais, mas às vezes você precisa de um PDF de layout fixo para imprimir, anotar ou compartilhar com pessoas que não têm um leitor de ebooks. + +## Formatos compatíveis + +| Formato | Extensão | Observações | +| :------ | :------- | :----------------------- | +| EPUB | `.epub` | Arquivos EPUB 2 e EPUB 3 | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos EPUB. A seleção múltipla é compatível. +2. Revise os arquivos enviados. Remova entradas indesejadas com o ícone de lixeira ou clique em **Adicionar mais arquivos** para ampliar o lote. +3. Clique em **Converter para PDF**. O mecanismo PyMuPDF renderiza o conteúdo do EPUB (texto, imagens e formatação) em uma saída PDF paginada. +4. Um único EPUB é baixado diretamente como PDF. Vários arquivos são empacotados em um arquivo ZIP chamado `epub-converted.zip`. + +## Opções + +A conversão roda com padrões sensatos e sem configuração obrigatória. O texto é reorganizado nas dimensões de página padrão, e as fontes e imagens incorporadas são levadas para o PDF. + +## Casos de uso + +- Imprimir um ebook sem DRM para ler longe das telas +- Enviar um manuscrito em EPUB como PDF de layout fixo para revisão +- Arquivar livros digitais em um formato que todo sistema operacional abre nativamente +- Compartilhar um capítulo com um colega que não tem um leitor de EPUB +- Converter documentação técnica distribuída em EPUB em PDFs que podem ser anotados + +## Dicas + +- Recursos do EPUB 3, como áudio e vídeo incorporados, não são levados para o PDF, mas todo o texto, imagens e tabelas são convertidos sem problemas. +- Para obter os melhores resultados com EPUBs muito estilizados, confira as primeiras páginas da saída para confirmar a fidelidade do layout. + +## Ferramentas relacionadas + +- [MOBI para PDF](./mobi-to-pdf) +- [FB2 para PDF](./fb2-to-pdf) +- [CBZ para PDF](./cbz-to-pdf) diff --git a/docs/pt/tools/excel-to-pdf.md b/docs/pt/tools/excel-to-pdf.md new file mode 100644 index 00000000..fb17a960 --- /dev/null +++ b/docs/pt/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel para PDF +description: Converta planilhas do Excel (XLS, XLSX), ODS e arquivos CSV em PDF com a formatação preservada. +--- + +# Excel para PDF + +Converta arquivos de planilha em PDF. A ferramenta lida com arquivos modernos do Excel, o formato legado XLS, planilhas OpenDocument e até CSV, tudo renderizado por um mecanismo LibreOffice no navegador que preserva a formatação das células, as fórmulas (como valores calculados), os gráficos e os layouts de várias planilhas. + +## Formatos compatíveis + +| Formato | Extensões | +| :-------------------- | :-------- | +| Excel (moderno) | `.xlsx` | +| Excel (legado) | `.xls` | +| Planilha OpenDocument | `.ods` | +| CSV | `.csv` | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos de planilha. +2. Revise a lista de arquivos. Adicione mais arquivos ou remova os indesejados. +3. Clique em **Converter para PDF**. O mecanismo LibreOffice é inicializado no primeiro uso e depois processa cada arquivo. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são entregues como `excel-converted.zip`. + +## Opções + +Esta ferramenta não tem configurações adicionais. O mecanismo LibreOffice determina o layout da página, a escala e a área de impressão com base nas configurações internas da planilha. + +## Saída + +| Quantidade de entrada | Saída | +| :-------------------- | :---------------------------------------------------------------------- | +| 1 arquivo | Download de um único PDF (nome original do arquivo com extensão `.pdf`) | +| 2 ou mais arquivos | Arquivo ZIP (`excel-converted.zip`) contendo um PDF por arquivo | + +## Casos de uso + +- Converter relatórios financeiros ou orçamentos do Excel em PDF para distribuição +- Criar PDFs prontos para impressão a partir de planilhas de estoque ou de catálogo de produtos +- Compartilhar resultados de análises de dados com partes interessadas que não têm o Excel instalado +- Arquivar relatórios trimestrais em um formato não editável +- Converter arquivos ODS do LibreOffice Calc em PDF + +## Dicas + +- Os gráficos incorporados na planilha são renderizados no PDF. Confira se eles estão corretos no arquivo de origem antes de converter. +- Se a sua planilha tem várias planilhas (abas), todas são incluídas na saída em PDF. +- Para dados CSV simples sem formatação, a ferramenta [CSV para PDF](./csv-to-pdf) oferece uma conversão mais leve. Use Excel para PDF quando precisar preservar formatação, gráficos ou várias planilhas. + +## Ferramentas relacionadas + +- [CSV para PDF](./csv-to-pdf) +- [Word para PDF](./word-to-pdf) +- [PowerPoint para PDF](./powerpoint-to-pdf) diff --git a/docs/pt/tools/extract-attachments.md b/docs/pt/tools/extract-attachments.md new file mode 100644 index 00000000..2c1cc9fa --- /dev/null +++ b/docs/pt/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Extrair anexos +description: Extraia todos os arquivos anexados incorporados em um ou mais PDFs e baixe-os como um arquivo ZIP. +--- + +# Extrair anexos + +Retire todos os anexos incorporados de um ou mais arquivos PDF. Todos os arquivos extraídos são reunidos em um único arquivo ZIP para download. + +## Como funciona + +1. Envie um ou mais arquivos PDF que contenham anexos incorporados. +2. Clique em **Extrair Anexos**. +3. A ferramenta procura anexos de nível de documento e de nível de página em cada PDF. +4. Todos os arquivos encontrados são empacotados em um arquivo ZIP e baixados automaticamente. +5. Uma mensagem de status confirma quantos anexos foram encontrados e o tamanho total. + +## Recursos + +- Extração em lote de vários PDFs de uma só vez +- Extrai anexos de nível de documento e de nível de página +- Gera um único arquivo ZIP contendo todos os arquivos extraídos +- Exibe a contagem total de anexos e o tamanho combinado dos arquivos +- Mensagens de status claras se nenhum anexo for encontrado + +## Casos de uso + +- Recuperar arquivos de dados incorporados em um PDF de relatório +- Retirar recursos de imagem de um portfólio ou de um documento de especificação +- Extrair materiais complementares de PDFs de treinamento ou de conformidade +- Auditar quais arquivos estão incorporados em um lote de PDFs + +## Dicas + +- Se a ferramenta informar que não há anexos, o PDF pode conter imagens incorporadas ou dados de formulário, que não são anexos de arquivo. Use [Extrair Imagens](./extract-images) para imagens incorporadas. +- Ao processar vários PDFs, todos os anexos de todos os arquivos vão para um único ZIP. Os nomes dos arquivos são preservados como nas incorporações originais. + +## Ferramentas relacionadas + +- [Adicionar Anexos](./add-attachments) +- [Editar Anexos](./edit-attachments) +- [Extrair Imagens](./extract-images) diff --git a/docs/pt/tools/extract-images.md b/docs/pt/tools/extract-images.md new file mode 100644 index 00000000..41900e39 --- /dev/null +++ b/docs/pt/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Extrair imagens +description: Extraia todas as imagens incorporadas de arquivos PDF. Visualize-as em uma grade e baixe individualmente ou como um arquivo ZIP. +--- + +# Extrair imagens + +Retira todas as imagens incorporadas de um ou mais arquivos PDF. As imagens extraídas são exibidas em uma grade de pré-visualização, onde você pode baixá-las individualmente ou pegar tudo de uma vez em um ZIP. Desenvolvido com PyMuPDF. + +## Como funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando os arquivos para ela. Adicione mais arquivos ou remova alguns individualmente, conforme necessário. +2. Clique em **Extrair** para iniciar o processamento. +3. A ferramenta examina todas as páginas de todos os PDFs enviados, encontrando e extraindo as imagens incorporadas. +4. As imagens extraídas aparecem em uma grade com miniaturas. Cada imagem tem um botão de download. +5. Clique em **Baixar tudo** para salvar tudo como um arquivo ZIP. + +## Opções + +Esta ferramenta não tem opções configuráveis. Todas as imagens incorporadas são extraídas no formato original (normalmente PNG, JPEG ou o formato usado quando a imagem foi incorporada ao PDF). + +## Formato de saída + +- As imagens aparecem na grade de pré-visualização com nomes como `image_1.png`, `image_2.jpg` etc. +- **Baixar tudo** gera `extracted-images.zip` contendo todas as imagens. +- As imagens individuais podem ser baixadas uma a uma pela grade. + +## Casos de uso + +- Recuperar fotos ou gráficos de um PDF para reutilizar em outro projeto. +- Extrair imagens de produtos de um PDF de catálogo para um anúncio de e-commerce. +- Retirar diagramas de documentações técnicas para usar em apresentações. +- Auditar quais imagens estão incorporadas em um documento antes de compartilhá-lo. + +## Dicas + +- A ferramenta extrai as imagens exatamente como estão armazenadas no PDF. Ela não renderiza as páginas como imagens; para isso, use [PDF para PNG](./pdf-to-png) ou [PDF para JPG](./pdf-to-jpg). +- Se a ferramenta informar "Nenhuma imagem encontrada", o PDF pode usar gráficos vetoriais em vez de imagens raster incorporadas, ou pode ser um documento digitalizado em que a página inteira é uma única imagem grande. +- O processamento em lote funciona com vários PDFs. Todas as imagens de todos os arquivos são combinadas em uma única grade e em um único ZIP. + +## Ferramentas relacionadas + +- [PDF para PNG](./pdf-to-png) +- [PDF para JPG](./pdf-to-jpg) +- [Construtor de Fluxo de Trabalho PDF](./pdf-workflow) diff --git a/docs/pt/tools/extract-pages.md b/docs/pt/tools/extract-pages.md new file mode 100644 index 00000000..ee5a4a3c --- /dev/null +++ b/docs/pt/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Extrair páginas +description: Salve um intervalo específico de páginas de um PDF como um novo documento. +--- + +# Extrair páginas + +Retire um conjunto de páginas de um PDF e salve-as como um novo arquivo. Indique exatamente quais páginas você quer usando a sintaxe de intervalos, e a ferramenta cria um PDF limpo contendo apenas essas páginas. + +## Como funciona + +1. Envie um arquivo PDF. A ferramenta exibe o nome do arquivo, o tamanho e o total de páginas. +2. Digite as páginas que deseja extrair usando a sintaxe de intervalos (por exemplo, `1-5`, `3, 7, 10-12`). +3. Se quiser, escolha baixar cada intervalo como um PDF separado em um arquivo ZIP. +4. Clique no botão de processar. As páginas extraídas são baixadas como um novo PDF (ou ZIP). + +## Recursos + +- Sintaxe flexível de intervalos de páginas: páginas individuais, intervalos ou combinações separadas por vírgula +- Exibe o total de páginas após o upload para facilitar a consulta +- Opção de gerar um único PDF combinado ou arquivos separados em um ZIP +- Preserva o conteúdo e a formatação originais das páginas + +## Casos de uso + +- Retirar o resumo executivo (as primeiras páginas) de um relatório extenso +- Extrair um único capítulo de um PDF de livro didático +- Salvar páginas específicas de um pacote de formulários como documentos independentes +- Criar um documento de amostra a partir de páginas selecionadas de um arquivo maior + +## Dicas + +- Os números de página começam em 1. Use `1` para a primeira página, não `0`. +- Para remover páginas em vez de extraí-las, use [Excluir Páginas](./delete-pages), que é a operação inversa. +- Se você precisa de seleção visual de páginas com miniaturas, use [Dividir PDF](./split-pdf) no modo de Seleção visual. + +## Ferramentas relacionadas + +- [Dividir PDF](./split-pdf) +- [Excluir Páginas](./delete-pages) +- [Mesclar PDF](./merge-pdf) diff --git a/docs/pt/tools/extract-tables.md b/docs/pt/tools/extract-tables.md new file mode 100644 index 00000000..f01fbc5a --- /dev/null +++ b/docs/pt/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Extrair Tabelas +description: Detecte e extraia tabelas de documentos PDF. Exporte como CSV, JSON ou Markdown com granularidade por tabela. +--- + +# Extrair Tabelas + +Detecta todas as tabelas de um PDF e permite exportá-las no formato que você escolher: CSV, JSON ou Markdown. Cada tabela é extraída individualmente com metadados de página e posição. Desenvolvido com o mecanismo de detecção de tabelas do PyMuPDF. + +## Como funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Selecione o **formato de exportação** de sua preferência: CSV, JSON ou Markdown. +3. Clique em **Extrair** para iniciar o processamento. +4. Se uma tabela for encontrada, ela é baixada como um único arquivo. Várias tabelas geram um arquivo ZIP com um arquivo por tabela. + +## Opções + +- **Formato de exportação**: escolha entre: + - **CSV**: valores separados por vírgula, com aspas adequadas em campos que contêm vírgulas, aspas ou quebras de linha. Adequado para planilhas e bancos de dados. + - **JSON**: estrutura de arrays de arrays, formatada com indentação de 2 espaços. Adequado para consumo programático. + - **Markdown**: formato de tabela delimitado por barras verticais, renderizado pelo PyMuPDF. Adequado para documentação e arquivos README. + +## Formato de saída + +- **Uma tabela**: `filename_table.csv` (ou `.json` / `.md`) +- **Várias tabelas**: `filename_tables.zip` contendo arquivos nomeados `table_1_page3.csv`, `table_2_page5.csv` etc. + +## Casos de uso + +- Extrair tabelas específicas de relatórios PDF extensos sem puxar os dados do documento inteiro. +- Obter tabelas em formato Markdown para colar diretamente em issues do GitHub, wikis ou documentação. +- Retirar dados JSON estruturados de tabelas de PDF para integrações de API ou scripts. +- Comparar tabelas entre diferentes versões de PDF exportando ambas para CSV e comparando as diferenças. + +## Dicas + +- Esta ferramenta dá controle por tabela. Se você só quer todas as tabelas reunidas em um único CSV, use [PDF para CSV](./pdf-to-csv). Para uma pasta de trabalho completa do Excel, use [PDF para Excel](./pdf-to-excel). +- Tabelas que abrangem várias páginas podem ser detectadas como tabelas separadas por página. Talvez seja necessário concatená-las manualmente. +- Se nenhuma tabela for detectada, o PDF pode ser uma imagem digitalizada. Passe-o antes pelo OCR para adicionar uma camada de texto. + +## Ferramentas relacionadas + +- [PDF para CSV](./pdf-to-csv) +- [PDF para Excel](./pdf-to-excel) +- [PDF para Texto](./pdf-to-text) diff --git a/docs/pt/tools/fb2-to-pdf.md b/docs/pt/tools/fb2-to-pdf.md new file mode 100644 index 00000000..6058e316 --- /dev/null +++ b/docs/pt/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 para PDF +description: Converta e-books FictionBook (FB2) em PDF no seu navegador. Grátis, privado, sem envio para servidor. +--- + +# FB2 para PDF + +Converta arquivos FictionBook 2 (FB2) em documentos PDF. O FB2 é um formato de e-book baseado em XML, popular na Rússia e no Leste Europeu. Embora seja bem suportado em algumas plataformas, é praticamente desconhecido em outras. Converter para PDF torna seus livros legíveis em qualquer lugar. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :------------ | :------- | :----------------------- | +| FictionBook 2 | `.fb2` | Formato de e-book em XML | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos FB2. É possível selecionar vários arquivos de uma vez. +2. Revise a lista de arquivos. Use o ícone da lixeira para remover itens individuais, ou **Adicionar mais arquivos** para incluir outros. +3. Clique em **Converter para PDF**. O mecanismo PyMuPDF analisa a estrutura XML do FB2 e a renderiza como conteúdo paginado em PDF. +4. Um único arquivo é baixado diretamente como PDF. Várias conversões são reunidas em `fb2-converted.zip`. + +## Opções + +Nenhuma configuração é necessária. O conversor trata a estrutura XML do FB2 automaticamente, preservando quebras de capítulo, formatação e imagens incorporadas. + +## Casos de uso + +- Ler e-books FB2 em dispositivos ou aplicativos que só aceitam PDF +- Imprimir literatura em russo distribuída em formato FB2 +- Arquivar uma biblioteca FB2 em um formato universalmente suportado +- Compartilhar um livro com alguém cujo leitor não suporta FictionBook + +## Dicas + +- Arquivos FB2 são XML puro, por isso costumam ser pequenos e converter rapidamente, mesmo no navegador. +- Se seus arquivos FB2 estiverem compactados como `.fb2.zip`, extraia-os antes de enviar. + +## Ferramentas relacionadas + +- [EPUB para PDF](./epub-to-pdf) +- [MOBI para PDF](./mobi-to-pdf) +- [XML para PDF](./xml-to-pdf) diff --git a/docs/pt/tools/fix-page-size.md b/docs/pt/tools/fix-page-size.md new file mode 100644 index 00000000..31123650 --- /dev/null +++ b/docs/pt/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Ajustar tamanho da página +description: Padronize todas as páginas de um PDF para um tamanho uniforme. Escolha entre tamanhos de papel padrão ou defina dimensões personalizadas. +--- + +# Ajustar tamanho da página + +PDFs montados a partir de várias fontes costumam acabar com tamanhos de página diferentes: alguns em Carta, outros em A4, outros completamente fora do padrão. Esta ferramenta força todas as páginas a um único tamanho de destino, redimensionando o conteúdo para caber ou preencher conforme necessário. + +## Como funciona + +1. Envie um arquivo PDF. +2. Selecione um **Tamanho da Página de Destino** na lista (A4, Carta, Ofício, A3, A5, Tabloide ou Personalizado). +3. Escolha uma **Orientação**: Automática mantém a orientação original de cada página, ou você pode forçar Retrato ou Paisagem. +4. Escolha um modo de **Escala do Conteúdo**: Ajustar (preserva todo o conteúdo, pode adicionar margens) ou Preencher (preenche a página, pode cortar as bordas). +5. Opcionalmente, defina uma **Cor de Fundo** para as margens adicionadas. +6. Clique em **Ajustar Tamanho da Página**. + +## Opções + +- **Tamanhos padrão**: A4, Carta, Ofício, A3, A5, Tabloide +- **Dimensões personalizadas**: Informe largura e altura em polegadas ou milímetros +- **Orientação**: Automática, Retrato, Paisagem +- **Modo de escala**: Ajustar ou Preencher (Cortar) +- **Cor de fundo**: Qualquer cor para o preenchimento das margens + +## Casos de uso + +- Normalizar um PDF mesclado em que as páginas vieram de scanners diferentes +- Converter um documento Carta dos EUA para A4 para distribuição internacional +- Preparar PDFs prontos para impressão que exigem um tamanho de corte consistente +- Corrigir páginas ligeiramente fora do padrão (por exemplo, 8,49 x 11,02 polegadas em vez de 8,5 x 11) + +## Dicas + +- Use o modo Ajustar para garantir que nenhum conteúdo seja perdido. O modo Preencher fica mais limpo, mas pode cortar as bordas. +- Verifique o resultado com a ferramenta Dimensões da Página para confirmar que todas as páginas correspondem ao tamanho de destino. +- Branco é a cor de fundo padrão; troque para uma cor escura se o seu documento tiver margens escuras. + +## Ferramentas relacionadas + +- [Dimensões da Página](./page-dimensions): inspecione os tamanhos das páginas antes e depois do ajuste +- [Comprimir PDF](./compress-pdf): reduza o tamanho do arquivo após a padronização +- [Cortar PDF](./crop-pdf): corte as páginas manualmente em vez de redimensionar automaticamente diff --git a/docs/pt/tools/flatten-pdf.md b/docs/pt/tools/flatten-pdf.md new file mode 100644 index 00000000..c3009418 --- /dev/null +++ b/docs/pt/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Achatar PDF +description: Achate formulários interativos e anotações em conteúdo estático. Torna os campos do formulário não editáveis e incorpora as anotações à página. +--- + +# Achatar PDF + +Achatar (flatten) mescla elementos interativos (campos de formulário, listas suspensas, caixas de seleção, anotações, destaques, notas adesivas) diretamente no conteúdo da página. A aparência visual permanece a mesma, mas nada mais é editável ou extraível. É o equivalente em PDF a imprimir um formulário preenchido e digitalizá-lo de volta, só que com a qualidade perfeita. + +## Como funciona + +1. Envie um ou mais arquivos PDF. +2. Clique em **Achatar PDF**. +3. Um único arquivo é baixado diretamente. Vários arquivos geram um arquivo ZIP. + +A ferramenta usa o pdf-lib para achatar os campos de formulário (via `form.flatten()`) e um achatador de anotações dedicado para incorporar as anotações ao fluxo da página. Ambas as operações acontecem em uma única passagem. + +## O que é achatado + +- **Campos de formulário**: Campos de texto, caixas de seleção, botões de opção, listas suspensas, campos de assinatura +- **Anotações**: Comentários, destaques, tachado, sublinhado, notas adesivas, carimbos, anotações de tinta +- **Elementos interativos**: Botões, gatilhos de ação + +## O que permanece inalterado + +- Conteúdo de texto (continua selecionável e pesquisável) +- Imagens e gráficos +- Layout e dimensões da página +- Marcadores e sumário +- Hiperlinks (exceto os baseados em anotações) + +## Casos de uso + +- Bloquear um formulário preenchido para que os destinatários não alterem as respostas enviadas +- Preparar um PDF para arquivamento, onde elementos interativos são desnecessários +- Corrigir problemas de exibição causados por anotações renderizadas de forma diferente em cada visualizador +- Garantir que um documento assinado não possa ser modificado após a aplicação da assinatura +- Reduzir o tamanho do arquivo eliminando definições de campos de formulário e objetos de anotação + +## Dicas + +- Achate depois de concluir todas as edições. Não há como desfazer o achatamento de um PDF. +- Se você precisa achatar e também remover metadados, JavaScript e anexos, use a ferramenta Sanitizar PDF, que inclui o achatamento como uma de suas opções. +- Alguns PDFs informam "nenhum formulário encontrado". Isso é normal se o documento tem apenas anotações e nenhum campo de formulário. + +## Ferramentas relacionadas + +- [Sanitizar PDF](./sanitize-pdf): achate formulários e remova metadados, scripts e mais +- [Rasterizar PDF](./rasterize-pdf): converta para PDF baseado em imagem para o máximo de achatamento +- [Fonte para Contorno](./font-to-outline): converta fontes em caminhos vetoriais +- [Criptografar PDF](./protect-pdf): proteja o PDF achatado com uma senha diff --git a/docs/pt/tools/font-to-outline.md b/docs/pt/tools/font-to-outline.md new file mode 100644 index 00000000..dd01dcd4 --- /dev/null +++ b/docs/pt/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Fonte para contorno +description: Converta todas as fontes do PDF em contornos vetoriais para uma renderização consistente em todos os dispositivos. Elimina problemas de dependência de fontes. +--- + +# Fonte para contorno + +Converter fontes em contornos transforma cada caractere de texto de um glifo baseado em fonte em um caminho vetorial. O PDF deixa de depender de qualquer fonte instalada e é renderizado de forma idêntica em todos os dispositivos, sistemas operacionais e impressoras. Esta é uma etapa padrão em fluxos de pré-impressão. + +## Como funciona + +1. Envie um ou mais arquivos PDF. +2. Clique em **Converter em Contornos**. +3. O Ghostscript converte todo o texto em caminhos vetoriais. +4. Baixe o resultado. Vários arquivos geram um arquivo ZIP. + +Não há configurações a ajustar. A ferramenta usa o Ghostscript (WebAssembly) para converter todas as referências de fontes em caminhos contornados em uma única passagem. + +## O que muda + +- Os caracteres de texto se tornam curvas vetoriais (caminhos bézier) +- A incorporação de fontes deixa de ser necessária: o PDF fica autossuficiente no nível do glifo +- O tamanho do arquivo pode aumentar, pois caminhos vetoriais costumam ser maiores que referências de fontes +- A aparência visual é preservada exatamente + +## O que você perde + +- Seleção e cópia de texto +- Pesquisa de texto (Ctrl+F deixa de funcionar) +- A capacidade de editar o conteúdo do texto +- Acessibilidade para leitores de tela + +## Casos de uso + +- Enviar PDFs para uma gráfica que exige fontes em contorno +- Compartilhar documentos que usam fontes personalizadas ou licenciadas com pessoas que não têm essas fontes +- Evitar a substituição de fontes que muda a aparência do documento em outros sistemas +- Preparar PDFs para gravação a laser ou corte CNC que exigem entrada vetorial +- Garantir que um PDF com muitos logotipos seja exibido corretamente em todas as plataformas + +## Dicas + +- Guarde o PDF original. O contorno é irreversível: não é possível converter os caminhos de volta em texto editável. +- Se você precisa que o texto continue pesquisável, considere usar a ferramenta Rasterizar PDF seguida de OCR. +- PDFs contornados tendem a ser maiores. Execute Comprimir PDF depois, se o tamanho do arquivo importar. + +## Ferramentas relacionadas + +- [Achatar PDF](./flatten-pdf): achate formulários e anotações sem mexer nas fontes +- [Rasterizar PDF](./rasterize-pdf): converta para PDF baseado em imagem em vez de contornos vetoriais +- [Comprimir PDF](./compress-pdf): reduza o tamanho do arquivo após o contorno +- [PDF para PDF/A](./pdf-to-pdfa): converta para arquivamento depois de garantir a independência de fontes diff --git a/docs/pt/tools/form-creator.md b/docs/pt/tools/form-creator.md new file mode 100644 index 00000000..04d9c59e --- /dev/null +++ b/docs/pt/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Criar formulário PDF +description: Crie formulários PDF preenchíveis com campos de texto, caixas de seleção, listas suspensas, botões de opção e mais, arrastando e soltando. +--- + +# Criar formulário PDF + +Projete formulários PDF preenchíveis profissionais do zero ou adicionando campos a um PDF existente. O editor visual permite arrastar e soltar elementos de formulário (campos de texto, caixas de seleção, listas suspensas, botões de opção, campos de assinatura e mais) diretamente nas prévias das páginas. Configure as propriedades dos campos, defina regras de visibilidade condicional e exporte um formulário PDF totalmente interativo. + +## Como funciona + +1. Envie um PDF existente **ou** clique em **Criar PDF em Branco** para começar do zero. +2. Se estiver criando um PDF em branco, selecione um tamanho de página (Carta, A4, A5, Ofício, Tabloide, A3 ou dimensões personalizadas). +3. O editor de formulários abre com uma barra de ferramentas de tipos de campo e uma área de prévia da página. +4. Selecione um tipo de campo na barra de ferramentas e clique na página para posicioná-lo. +5. Arraste os campos para reposicioná-los. Use as alças de redimensionamento para ajustar as dimensões. +6. Clique em um campo para abrir o painel de propriedades, onde você pode definir o nome do campo, valor padrão, tamanho da fonte, alinhamento e mais. +7. Navegue entre as páginas usando os controles de página. +8. Clique em **Salvar** para baixar o PDF preenchível finalizado. + +## Recursos + +- Posicionamento de campos por arrastar e soltar, com alças visuais para redimensionar +- Tipos de campo: entrada de texto, texto de várias linhas, caixa de seleção, lista suspensa, botão de opção, assinatura, data, número e código de barras +- Painel de propriedades para configurar o nome, rótulo, valor padrão, tamanho da fonte, cor, alinhamento e validação de cada campo +- Ações de campo e regras de visibilidade condicional (mostrar/ocultar campos com base nos valores de outros campos) +- Navegação de páginas para formulários de várias páginas +- Extração de campos existentes: detecta e importa automaticamente os campos de formulário de PDFs enviados +- Suporte a PDFs enviados e a páginas em branco como tela do formulário +- Vários tamanhos de página predefinidos, além de dimensões personalizadas +- Geração de códigos de barras com bwip-js +- Gerenciamento de grupos de botões de opção + +## Opções + +**Tamanhos de página predefinidos (para PDFs em branco):** + +- Carta (8,5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Ofício (8,5" x 14") +- Tabloide (11" x 17") +- A3 (297mm x 420mm) +- Personalizado (informe largura e altura) + +**Propriedades do campo (variam conforme o tipo de campo):** + +- Nome, rótulo e texto de espaço reservado +- Valor padrão +- Família, tamanho e cor da fonte +- Alinhamento do texto (esquerda, centro, direita) +- Alternância de campo obrigatório +- Alternância de somente leitura +- Comprimento máximo para campos de texto +- Lista de opções para listas suspensas e botões de opção +- Ações de visibilidade condicional + +## Casos de uso + +- Criar formulários de integração de funcionários com campos de texto para dados pessoais e caixas de seleção para ciência das políticas +- Criar questionários de admissão de clientes com listas suspensas para escolha de serviço +- Projetar formulários de pedido com campos calculados e identificadores em código de barras +- Criar checklists de inspeção com botões de opção para avaliações de aprovado/reprovado +- Criar formulários de pesquisa com perguntas de acompanhamento condicionais que aparecem conforme as respostas + +## Dicas + +- Se você enviar um PDF existente, a ferramenta tentará extrair os campos de formulário já presentes, permitindo editá-los ou adicionar novos. +- Use o recurso de grupo de botões de opção para criar seleções mutuamente exclusivas. Campos do mesmo grupo compartilham um nome de grupo. +- Teste seu formulário baixando-o e abrindo-o no [Preenchedor de Formulários](./form-filler) para verificar o comportamento dos campos. + +## Ferramentas relacionadas + +- [Preenchedor de Formulários](./form-filler) +- [Assinar PDF](./sign-pdf) +- [Editor de PDF](./edit-pdf) diff --git a/docs/pt/tools/form-filler.md b/docs/pt/tools/form-filler.md new file mode 100644 index 00000000..012d4cd0 --- /dev/null +++ b/docs/pt/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Preenchimento de formulário PDF +description: Preencha formulários PDF, incluindo formulários XFA, diretamente no navegador com um visualizador incorporado. +--- + +# Preenchimento de formulário PDF + +Abra um PDF com campos de formulário e preencha-o diretamente em um visualizador incorporado. A ferramenta suporta tanto campos AcroForm padrão quanto formulários XFA (XML Forms Architecture) legados. Depois de concluir o formulário, baixe a versão preenchida com um único clique. + +## Como funciona + +1. Envie um PDF que contenha campos de formulário. +2. O documento abre em um visualizador de PDF integrado que renderiza os campos como entradas interativas. +3. Clique nos campos de texto, caixas de seleção, listas suspensas e botões de opção para preenchê-los. +4. Clique em **Salvar e Baixar Formulário Preenchido** para obter o PDF concluído. + +## Recursos + +- Visualizador PDF.js incorporado com interação completa com os campos do formulário +- Suporte a campos AcroForm padrão (campos de texto, caixas de seleção, listas suspensas, botões de opção) +- Suporte a formulários XFA para formulários legados baseados em XML +- Dimensionamento automático do visualizador com base nas dimensões da página +- Exibição do arquivo com nome e tamanho + +## Opções + +Não há opções de configuração adicionais. Envie o formulário, preencha e baixe. + +## Casos de uso + +- Preencher declarações de impostos, pedidos de seguro ou documentos governamentais +- Preencher formulários de candidatura a vagas recebidos como anexos PDF +- Preencher formulários de cadastro de fornecedores ou questionários de fornecedores +- Aprovar checklists de conformidade com campos de caixa de seleção +- Preencher fichas médicas antes de uma consulta + +## Dicas + +- Formulários XFA são um formato legado suportado apenas por alguns visualizadores de PDF. Se você abrir um PDF XFA no Chrome ou na maioria das outras ferramentas e vir páginas em branco, é porque esses visualizadores não têm suporte a XFA. O Preenchedor de Formulários do BentoPDF e o Firefox tratam XFA corretamente. +- Para PDFs sem campos de formulário, use a ferramenta [Criar Formulário PDF](./form-creator) para adicionar campos primeiro e depois preenchê-los aqui. +- O visualizador ajusta automaticamente seu tamanho às dimensões das páginas do PDF. + +## Ferramentas relacionadas + +- [Criar Formulário PDF](./form-creator) +- [Assinar PDF](./sign-pdf) +- [Editor de PDF](./edit-pdf) diff --git a/docs/pt/tools/header-footer.md b/docs/pt/tools/header-footer.md new file mode 100644 index 00000000..600f68d0 --- /dev/null +++ b/docs/pt/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Cabeçalho e rodapé +description: Adicione texto personalizável de cabeçalho e rodapé às páginas do PDF com variáveis dinâmicas de número de página. +--- + +# Cabeçalho e rodapé + +Adicione texto em seis posições das páginas do PDF: cabeçalho à esquerda, ao centro e à direita, e rodapé à esquerda, ao centro e à direita. A ferramenta suporta variáveis dinâmicas para o número da página e o total de páginas, para que você crie modelos como "Página 3 de 10" que se atualizam automaticamente em cada página. + +## Como funciona + +1. Envie seu arquivo PDF. +2. O painel de opções aparece com os controles de formatação e seis campos de texto. +3. Digite o texto desejado em qualquer uma das posições de cabeçalho/rodapé. +4. Use os marcadores `{page}` e `{total}` para numeração dinâmica de páginas. +5. Ajuste o tamanho e a cor da fonte e, se quiser, limite a um intervalo de páginas específico. +6. Clique em **Adicionar Cabeçalho e Rodapé** para processar e baixar. + +## Opções + +- **Intervalo de páginas**: Limite, se quiser, quais páginas recebem cabeçalho e rodapé. Deixe vazio para aplicar a todas as páginas. Formato: "1-3, 5" (intervalos separados por vírgula). +- **Tamanho da fonte**: Entre 6 e 24 pontos. O padrão é 10. +- **Cor da fonte**: Escolha qualquer cor com o seletor de cores. +- **Cabeçalho esquerda / centro / direita**: Campos de texto para o topo de cada página. +- **Rodapé esquerda / centro / direita**: Campos de texto para a parte inferior de cada página. + +## Recursos + +- Seis posições de texto independentes por página +- Variável dinâmica `{page}` que insere o número da página atual +- Variável dinâmica `{total}` que insere o total de páginas +- Filtro de intervalo de páginas para atingir páginas específicas +- Tamanho e cor da fonte personalizáveis +- Fonte Helvetica para um resultado limpo e profissional + +## Casos de uso + +- Adicionar "Página {page} de {total}" ao centro do rodapé de um relatório +- Colocar o nome da empresa no cabeçalho à esquerda e a data do documento no cabeçalho à direita +- Adicionar avisos de confidencialidade ao rodapé de documentos jurídicos +- Carimbar números de revisão do documento em intervalos de páginas específicos + +## Dicas + +- Combine `{page}` e `{total}` em um único campo para formatos como "Página {page} de {total}" ou "{page}/{total}". +- Você pode deixar a maioria dos campos vazios e preencher apenas as posições de que precisa. Campos vazios são simplesmente ignorados. +- Para cabeçalhos mais complexos com imagens ou logotipos, considere usar a ferramenta [Adicionar Marca d'Água](./add-watermark) posicionada no topo da página. + +## Ferramentas relacionadas + +- [Números de Página](./page-numbers) +- [Adicionar Marca d'Água](./add-watermark) +- [Numeração Bates](./bates-numbering) diff --git a/docs/pt/tools/heic-to-pdf.md b/docs/pt/tools/heic-to-pdf.md new file mode 100644 index 00000000..e42c690e --- /dev/null +++ b/docs/pt/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC para PDF +description: Converta imagens HEIC e HEIF de iPhones e iPads para PDF diretamente no navegador. +--- + +# HEIC para PDF + +Converta imagens HEIC/HEIF em PDF. O HEIC é o formato de foto padrão em iPhones e iPads desde o iOS 11. Esta ferramenta permite transformar essas fotos em PDFs sem instalar nenhum software de desktop e sem enviar arquivos para um servidor. + +## Formatos suportados + +| Formato | Extensões | +| :------ | :-------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos HEIC/HEIF. +2. Revise a lista de arquivos e remova os indesejados. +3. Clique em **Converter para PDF**. O resultado é baixado como `from_heic.pdf`. + +Cada arquivo HEIC é decodificado com a biblioteca heic2any, que o converte para PNG com 92% de qualidade. O PNG é então incorporado ao PDF com o pdf-lib, com cada imagem em sua própria página, em resolução total. + +## Opções + +Esta ferramenta não expõe configurações adicionais. As imagens HEIC são convertidas em alta qualidade (0,92) para PNG antes de serem incorporadas. + +## Casos de uso + +- Criar um PDF a partir de fotos do iPhone para anexar a um pedido de seguro ou relatório +- Converter fotos HEIC de um anúncio imobiliário em um único documento imprimível +- Transformar capturas de tela do iPad (formato HEIF) em um PDF compartilhável +- Converter em lote fotos de férias para um diário de viagem + +## Dicas + +- A decodificação de HEIC acontece inteiramente no navegador, usando WebAssembly. A primeira conversão pode demorar um pouco enquanto o decodificador é carregado. +- Se você precisa misturar HEIC com outros formatos de imagem (JPG, PNG etc.), use a ferramenta [Imagens para PDF](./image-to-pdf), que trata HEIC junto com todos os outros formatos. +- Arquivos HEIC de iPhones costumam conter dados EXIF, incluindo coordenadas de GPS. O PDF gerado não carrega esses metadados. + +## Ferramentas relacionadas + +- [Imagens para PDF](./image-to-pdf) +- [JPG para PDF](./jpg-to-pdf) +- [PNG para PDF](./png-to-pdf) diff --git a/docs/pt/tools/image-to-pdf.md b/docs/pt/tools/image-to-pdf.md new file mode 100644 index 00000000..b00559b7 --- /dev/null +++ b/docs/pt/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Imagens para PDF +description: Converta JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD e mais de 10 outros formatos de imagem em um único arquivo PDF. +--- + +# Imagens para PDF + +O conversor universal de imagem para PDF. Envie imagens em praticamente qualquer formato e combine-as em um único documento PDF. Cada imagem ocupa sua própria página, com o tamanho das dimensões originais. + +## Formatos suportados + +| Formato | Extensões | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Este é o suporte a formatos mais amplo entre todos os conversores de imagem do BentoPDF. Se você precisa de apenas um formato específico, use uma das ferramentas dedicadas. + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos de imagem. Você pode selecionar vários arquivos de uma vez. +2. Revise a lista de arquivos. Remova os indesejados com o ícone da lixeira ou clique em **Adicionar mais arquivos** para incluir outras imagens. +3. Escolha um nível de **Qualidade do PDF** na lista. +4. Clique em **Converter para PDF**. A ferramenta processa as imagens com o mecanismo PyMuPDF e baixa o resultado como `images_to_pdf.pdf`. + +## Opções + +A **Qualidade do PDF** controla a compressão aplicada às imagens ao incorporá-las no PDF: + +- **Alta qualidade**: compressão mínima, arquivo maior. Ideal para impressão ou arquivamento. +- **Qualidade média** (padrão): compressão equilibrada. Boa para a maioria dos casos. +- **Baixa qualidade**: compressão agressiva, menor tamanho de arquivo. Adequada para e-mail ou compartilhamento rápido. + +Arquivos HEIC e WebP são convertidos automaticamente em PNG antes de serem incorporados. Isso acontece de forma transparente e não exige nenhuma etapa extra. + +## Casos de uso + +- Combinar recibos ou documentos digitalizados com a câmera do celular em um único PDF +- Criar um portfólio de fotos ou um lookbook a partir de imagens em formatos mistos +- Converter fotos do iPhone (HEIC) em um PDF compartilhável sem instalar software de desktop +- Reunir mockups de design a partir de exportações PSD e capturas de tela em uma entrega para o cliente +- Arquivar uma pasta de formatos de imagem antigos (PNM, JXR, JP2) como um único PDF + +## Dicas + +- A ordem das imagens no PDF segue a ordem em que aparecem na lista de arquivos. Envie-as na sequência desejada. +- Para o menor tamanho de arquivo possível, escolha Baixa qualidade. A diferença visual costuma ser insignificante em digitalizações com muito texto. +- Se você tem apenas um formato de imagem, os conversores dedicados (JPG para PDF, PNG para PDF etc.) oferecem o mesmo resultado com uma interface mais simples. + +## Ferramentas relacionadas + +- [JPG para PDF](./jpg-to-pdf) +- [PNG para PDF](./png-to-pdf) +- [HEIC para PDF](./heic-to-pdf) +- [WebP para PDF](./webp-to-pdf) diff --git a/docs/pt/tools/index.md b/docs/pt/tools/index.md new file mode 100644 index 00000000..87d4c229 --- /dev/null +++ b/docs/pt/tools/index.md @@ -0,0 +1,183 @@ +# Referência de Ferramentas + +O BentoPDF oferece **mais de 130 ferramentas** para trabalhar com PDFs. Todas as ferramentas rodam inteiramente no seu navegador: seus arquivos nunca saem do seu dispositivo. + +--- + +## Editar e Anotar + +Modifique, marque e aprimore seus documentos PDF com um conjunto completo de ferramentas de edição. + +
+ +- [**Editor de PDF**](./edit-pdf): Anote, destaque, oculte, comente, adicione formas/imagens, pesquise e visualize PDFs. +- [**Editar Marcadores**](./bookmark): Adicione, edite, importe, exclua e extraia marcadores de PDF. +- [**Sumário**](./table-of-contents): Gere uma página de sumário a partir dos marcadores do PDF. +- [**Números de Página**](./page-numbers): Insira números de página no seu documento. +- [**Adicionar Rótulos de Página**](./add-page-labels): Aplique rótulos de página do PDF com algarismos romanos, prefixos e inícios personalizados. +- [**Numeração Bates**](./bates-numbering): Adicione números Bates sequenciais em um ou mais arquivos PDF. +- [**Adicionar Marca d'Água**](./add-watermark): Carimbe texto ou uma imagem sobre as páginas do PDF. +- [**Cabeçalho e Rodapé**](./header-footer): Adicione texto no topo e na parte inferior das páginas. +- [**Inverter Cores**](./invert-colors): Crie uma versão em modo escuro do seu PDF. +- [**Efeito de Scanner**](./scanner-effect): Faça seu PDF parecer um documento digitalizado. +- [**Ajustar Cores**](./adjust-colors): Ajuste com precisão brilho, contraste, saturação e mais. +- [**Cor de Fundo**](./background-color): Altere a cor de fundo do seu PDF. +- [**Alterar Cor do Texto**](./text-color): Altere a cor do texto no seu PDF. +- [**Assinar PDF**](./sign-pdf): Desenhe, digite ou envie sua assinatura. +- [**Adicionar Carimbos**](./add-stamps): Adicione carimbos de imagem ao seu PDF usando a barra de ferramentas de anotação. +- [**Remover Anotações**](./remove-annotations): Remova comentários, destaques e links. +- [**Cortar PDF**](./crop-pdf): Apare as margens de todas as páginas do seu PDF. +- [**Preenchedor de Formulários PDF**](./form-filler): Preencha formulários diretamente no navegador. Também suporta formulários XFA. +- [**Criar Formulário PDF**](./form-creator): Crie formulários PDF preenchíveis com campos de texto por arrastar e soltar. +- [**Remover Páginas em Branco**](./remove-blank-pages): Detecte e exclua páginas em branco automaticamente. + +
+ +--- + +## Converter para PDF + +Transforme imagens, documentos, e-books e outros formatos de arquivo em PDF. + +
+ +- [**Imagens para PDF**](./image-to-pdf): Converta JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP e mais para PDF. +- [**JPG para PDF**](./jpg-to-pdf): Crie um PDF a partir de uma ou mais imagens JPG. +- [**PNG para PDF**](./png-to-pdf): Crie um PDF a partir de uma ou mais imagens PNG. +- [**WebP para PDF**](./webp-to-pdf): Crie um PDF a partir de uma ou mais imagens WebP. +- [**SVG para PDF**](./svg-to-pdf): Crie um PDF a partir de uma ou mais imagens SVG. +- [**BMP para PDF**](./bmp-to-pdf): Crie um PDF a partir de uma ou mais imagens BMP. +- [**HEIC para PDF**](./heic-to-pdf): Crie um PDF a partir de uma ou mais imagens HEIC. +- [**TIFF para PDF**](./tiff-to-pdf): Crie um PDF a partir de uma ou mais imagens TIFF. +- [**Texto para PDF**](./txt-to-pdf): Converta um arquivo de texto simples em PDF. +- [**Markdown para PDF**](./markdown-to-pdf): Converta Markdown em PDF com prévia ao vivo e destaque de sintaxe. +- [**JSON para PDF**](./json-to-pdf): Converta arquivos JSON para o formato PDF. +- [**ODT para PDF**](./odt-to-pdf): Converta arquivos ODT (OpenDocument Text) em PDF. +- [**CSV para PDF**](./csv-to-pdf): Converta planilhas CSV em PDF. +- [**RTF para PDF**](./rtf-to-pdf): Converta documentos RTF (Rich Text Format) em PDF. +- [**Word para PDF**](./word-to-pdf): Converta documentos do Word (DOCX, DOC, ODT) em PDF. +- [**Excel para PDF**](./excel-to-pdf): Converta planilhas do Excel (XLSX, XLS, ODS) em PDF. +- [**PowerPoint para PDF**](./powerpoint-to-pdf): Converta apresentações do PowerPoint (PPTX, PPT, ODP) em PDF. +- [**XPS para PDF**](./xps-to-pdf): Converta documentos XPS/OXPS em PDF. +- [**MOBI para PDF**](./mobi-to-pdf): Converta e-books MOBI em PDF. +- [**EPUB para PDF**](./epub-to-pdf): Converta e-books EPUB em PDF. +- [**FB2 para PDF**](./fb2-to-pdf): Converta e-books FictionBook (FB2) em PDF. +- [**CBZ para PDF**](./cbz-to-pdf): Converta arquivos de quadrinhos (CBZ/CBR) em PDF. +- [**WPD para PDF**](./wpd-to-pdf): Converta documentos WordPerfect (WPD) em PDF. +- [**WPS para PDF**](./wps-to-pdf): Converta documentos do WPS Office em PDF. +- [**XML para PDF**](./xml-to-pdf): Converta documentos XML em PDF. +- [**ODG para PDF**](./odg-to-pdf): Converta OpenDocument Graphics (ODG) em PDF. +- [**ODS para PDF**](./ods-to-pdf): Converta OpenDocument Spreadsheet (ODS) em PDF. +- [**ODP para PDF**](./odp-to-pdf): Converta OpenDocument Presentation (ODP) em PDF. +- [**PUB para PDF**](./pub-to-pdf): Converta Microsoft Publisher (PUB) em PDF. +- [**VSD para PDF**](./vsd-to-pdf): Converta Microsoft Visio (VSD, VSDX) em PDF. +- [**PSD para PDF**](./psd-to-pdf): Converta arquivos do Adobe Photoshop (PSD) em PDF. +- [**E-mail para PDF**](./email-to-pdf): Converta arquivos de e-mail (EML, MSG) para o formato PDF. + +
+ +--- + +## Converter de PDF + +Extraia conteúdo de PDFs para imagens, documentos e formatos de dados. + +
+ +- [**PDF para JPG**](./pdf-to-jpg): Converta cada página do PDF em uma imagem JPG. +- [**PDF para PNG**](./pdf-to-png): Converta cada página do PDF em uma imagem PNG. +- [**PDF para WebP**](./pdf-to-webp): Converta cada página do PDF em uma imagem WebP. +- [**PDF para BMP**](./pdf-to-bmp): Converta cada página do PDF em uma imagem BMP. +- [**PDF para TIFF**](./pdf-to-tiff): Converta cada página do PDF em uma imagem TIFF. +- [**PDF para CBZ**](./pdf-to-cbz): Converta um PDF em CBZ (arquivo de quadrinhos) para leitores de quadrinhos e Calibre. +- [**PDF para SVG**](./pdf-to-svg): Converta cada página do PDF em um gráfico vetorial escalável. +- [**PDF para CSV**](./pdf-to-csv): Extraia tabelas do PDF e converta para o formato CSV. +- [**PDF para Excel**](./pdf-to-excel): Extraia tabelas do PDF e converta para Excel (XLSX). +- [**PDF para Escala de Cinza**](./pdf-to-greyscale): Converta todas as cores em preto e branco. +- [**PDF para JSON**](./pdf-to-json): Converta arquivos PDF para o formato JSON. +- [**PDF para Word**](./pdf-to-word): Converta arquivos PDF em documentos do Word editáveis. +- [**Extrair Imagens**](./extract-images): Extraia todas as imagens incorporadas dos seus arquivos PDF. +- [**PDF para Markdown**](./pdf-to-markdown): Converta texto e tabelas do PDF para o formato Markdown. +- [**Preparar PDF para IA**](./prepare-pdf-for-ai): Extraia o conteúdo do PDF como JSON do LlamaIndex para pipelines de RAG/LLM. +- [**PDF para Texto**](./pdf-to-text): Extraia texto de arquivos PDF e salve como texto simples. +- [**Extrair Tabelas**](./extract-tables): Extraia tabelas de PDFs como CSV, JSON ou Markdown. + +
+ +--- + +## Organizar e Gerenciar + +Reorganize, combine, divida e gerencie as páginas e os arquivos dos seus PDFs. + +
+ +- [**Construtor de Fluxo de PDF**](./pdf-workflow): Crie pipelines personalizados de processamento de PDF com um editor visual de nós. +- [**Multiferramenta PDF**](./pdf-multi-tool): Editor de PDF completo com gerenciamento de páginas. +- [**OCR para PDF**](./ocr-pdf): Torne um PDF pesquisável e copiável. +- [**Mesclar PDF**](./merge-pdf): Combine vários PDFs em um único arquivo. +- [**Alternar e Misturar Páginas**](./alternate-merge): Mescle PDFs alternando páginas de cada PDF. +- [**Intercalação Duplex**](./duplex-collate): Reordene blocos de digitalização frente e verso na sequência correta de páginas. +- [**Organizar e Duplicar**](./organize-pdf): Duplique, reordene e exclua páginas. +- [**Adicionar Anexos**](./add-attachments): Incorpore um ou mais arquivos ao seu PDF. +- [**Extrair Anexos**](./extract-attachments): Extraia todos os arquivos incorporados de PDFs como um ZIP. +- [**Editar Anexos**](./edit-attachments): Veja ou remova anexos do seu PDF. +- [**Camadas de PDF (OCG)**](./pdf-layers): Veja, alterne, adicione e exclua camadas OCG no seu PDF. +- [**Dividir PDF**](./split-pdf): Extraia um intervalo de páginas para um novo PDF. +- [**Dividir Páginas**](./divide-pages): Divida páginas na horizontal ou na vertical. +- [**Extrair Páginas**](./extract-pages): Salve uma seleção de páginas como novos arquivos. +- [**Excluir Páginas**](./delete-pages): Remova páginas específicas do seu documento. +- [**Adicionar Página em Branco**](./add-blank-page): Insira uma página vazia em qualquer lugar do seu PDF. +- [**Inverter Ordem das Páginas**](./reverse-pages): Inverta a ordem de todas as páginas do seu documento. +- [**Girar PDF**](./rotate-pdf): Gire páginas em incrementos de 90 graus. +- [**Girar por Graus Personalizados**](./rotate-custom): Gire páginas por qualquer ângulo personalizado. +- [**PDF N-Up**](./n-up-pdf): Organize várias páginas em uma única folha. +- [**Livreto PDF**](./pdf-booklet): Reorganize as páginas para impressão de livreto frente e verso. +- [**Combinar em Página Única**](./combine-single-page): Una todas as páginas em uma única rolagem contínua. +- [**Ver Metadados**](./view-metadata): Inspecione as propriedades ocultas do seu PDF. +- [**Editar Metadados**](./edit-metadata): Altere o autor, o título e outras propriedades. +- [**PDFs para ZIP**](./pdf-to-zip): Empacote vários arquivos PDF em um arquivo ZIP. +- [**Comparar PDFs**](./compare-pdfs): Compare dois PDFs lado a lado. +- [**Posterizar PDF**](./posterize-pdf): Divida uma página grande em várias páginas menores. + +
+ +--- + +## Otimizar e Reparar + +Comprima, corrija e otimize seus PDFs para melhor desempenho e compatibilidade. + +
+ +- [**Comprimir PDF**](./compress-pdf): Reduza o tamanho do arquivo do seu PDF. +- [**PDF para PDF/A**](./pdf-to-pdfa): Converta PDF para PDF/A para arquivamento de longo prazo. +- [**Ajustar Tamanho da Página**](./fix-page-size): Padronize todas as páginas para um tamanho uniforme. +- [**Linearizar PDF**](./linearize-pdf): Otimize o PDF para visualização rápida na web. +- [**Dimensões da Página**](./page-dimensions): Analise tamanho, orientação e unidades da página. +- [**Remover Restrições**](./remove-restrictions): Remova a proteção por senha e as restrições de segurança. +- [**Reparar PDF**](./repair-pdf): Recupere dados de arquivos PDF corrompidos ou danificados. +- [**Rasterizar PDF**](./rasterize-pdf): Converta PDF em PDF baseado em imagem. Achata camadas e remove o texto selecionável. +- [**Corrigir Inclinação do PDF**](./deskew-pdf): Endireite automaticamente páginas digitalizadas inclinadas usando OpenCV. +- [**Fonte para Contorno**](./font-to-outline): Converta todas as fontes em contornos vetoriais para uma renderização consistente. + +
+ +--- + +## Proteger PDF + +Proteja, criptografe e controle o acesso aos seus documentos PDF. + +
+ +- [**Criptografar PDF**](./protect-pdf): Bloqueie seu PDF adicionando uma senha. +- [**Sanitizar PDF**](./sanitize-pdf): Remova metadados, anotações, scripts e mais. +- [**Descriptografar PDF**](./unlock-pdf): Desbloqueie o PDF removendo a proteção por senha. +- [**Achatar PDF**](./flatten-pdf): Torne campos de formulário e anotações não editáveis. +- [**Remover Metadados**](./remove-metadata): Remova dados ocultos do seu PDF. +- [**Alterar Permissões**](./change-permissions): Defina ou altere as permissões de usuário em um PDF. +- [**Assinatura Digital**](./digital-sign-pdf): Adicione uma assinatura digital criptográfica usando certificados X.509. +- [**Validar Assinatura**](./validate-signature-pdf): Verifique assinaturas digitais e veja os detalhes do certificado. + +
diff --git a/docs/pt/tools/invert-colors.md b/docs/pt/tools/invert-colors.md new file mode 100644 index 00000000..bd7a865e --- /dev/null +++ b/docs/pt/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Inverter cores +description: Inverta todas as cores do seu PDF para criar uma versão em modo escuro de qualquer documento. +--- + +# Inverter cores + +Troque cada cor do seu PDF pela sua inversa. Fundos brancos ficam pretos, texto preto fica branco e todas as outras cores passam para seus valores complementares. É a forma mais rápida de criar uma versão "modo escuro" de qualquer PDF. + +## Como funciona + +1. Envie seu arquivo PDF. +2. Clique em **Inverter Cores** para processar. +3. O PDF invertido é baixado automaticamente. + +Não há configurações adicionais. A ferramenta renderiza cada página como imagem, inverte as cores de todos os pixels e remonta o resultado em um novo PDF. + +## Recursos + +- Inversão de cores com um clique em todas as páginas +- Processa todas as páginas do documento +- Mantém as dimensões e o layout originais da página +- Funciona com qualquer PDF, independentemente do tipo de conteúdo (texto, imagens, misto) + +## Casos de uso + +- Criar versões em modo escuro de livros didáticos ou manuais para leitura confortável à noite +- Preparar versões de alto contraste de documentos para fins de acessibilidade +- Inverter documentos digitalizados que foram capturados com exposição incorreta +- Gerar versões em negativo de PDFs com muitas imagens para análise visual + +## Dicas + +- Como a ferramenta rasteriza as páginas para aplicar o efeito, o resultado é baseado em imagem. O texto deixa de ser selecionável e pesquisável. Se você precisa de texto pesquisável após a inversão, passe o resultado por uma ferramenta de OCR. +- Para ajustes de cor mais detalhados (brilho, contraste, saturação), use a ferramenta [Ajustar Cores](./adjust-colors). +- PDFs grandes com muitas páginas podem levar mais tempo, pois cada página é renderizada e invertida individualmente. + +## Ferramentas relacionadas + +- [Ajustar Cores](./adjust-colors) +- [Cor de Fundo](./background-color) +- [Efeito de Scanner](./scanner-effect) diff --git a/docs/pt/tools/jpg-to-pdf.md b/docs/pt/tools/jpg-to-pdf.md new file mode 100644 index 00000000..65f5bb07 --- /dev/null +++ b/docs/pt/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG para PDF +description: Converta uma ou mais imagens JPG, JPEG e JPEG 2000 em um único arquivo PDF diretamente no navegador. +--- + +# JPG para PDF + +Transforme imagens JPG em um PDF limpo. Envie um arquivo ou vários JPGs de uma vez: cada imagem se torna uma página em tamanho total no documento de saída. + +## Formatos suportados + +| Formato | Extensões | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos JPG. A seleção múltipla é suportada. +2. Revise os arquivos enviados. Use o ícone da lixeira para remover arquivos individuais ou clique em **Adicionar mais arquivos** para acrescentar à lista. +3. Selecione um nível de **Qualidade do PDF**. +4. Clique em **Converter para PDF**. A ferramenta comprime as imagens conforme a qualidade escolhida, converte-as com o mecanismo PyMuPDF e baixa `from_jpgs.pdf`. + +## Opções + +A **Qualidade do PDF** ajusta a compressão aplicada a cada imagem antes de ela ser incorporada ao PDF: + +- **Alta qualidade**: preserva o máximo de detalhes. Use para fotografia ou impressão. +- **Qualidade média** (padrão): um bom equilíbrio entre nitidez e tamanho de arquivo. +- **Baixa qualidade**: compressão agressiva para o menor resultado possível. + +## Casos de uso + +- Converter documentos digitalizados salvos como JPG em um único PDF para envio +- Reunir fotos de produtos em um catálogo para clientes +- Transformar imagens médicas ou de satélite em JPEG 2000 em um PDF portátil +- Criar um álbum de fotos imprimível a partir de exportações da câmera + +## Dicas + +- Arquivos JPEG 2000 (`.jp2`, `.jpx`) são totalmente suportados, não apenas o JPEG padrão. Isso é útil para imagens médicas e dados geoespaciais. +- Se seus JPGs vêm da câmera de um celular, a qualidade Média costuma gerar um arquivo 40-60% menor que a Alta, sem diferença visível na tela. + +## Ferramentas relacionadas + +- [Imagens para PDF](./image-to-pdf) +- [PNG para PDF](./png-to-pdf) +- [WebP para PDF](./webp-to-pdf) diff --git a/docs/pt/tools/json-to-pdf.md b/docs/pt/tools/json-to-pdf.md new file mode 100644 index 00000000..1d8f897f --- /dev/null +++ b/docs/pt/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON para PDF +description: Reconstrua arquivos PDF a partir do formato JSON do BentoPDF. Converta exportações JSON de volta aos documentos PDF originais. +--- + +# JSON para PDF + +Reconstrua documentos PDF a partir de arquivos JSON criados anteriormente pela ferramenta **PDF para JSON** do BentoPDF. É uma ferramenta de conversão de ida e volta: ela pega a representação estruturada em JSON de um PDF e reconstrói o documento original. + +::: warning +Esta ferramenta aceita apenas arquivos JSON produzidos pelo conversor PDF para JSON do BentoPDF. Arquivos JSON comuns de APIs, bancos de dados ou outras ferramentas não são suportados. +::: + +## Formatos suportados + +| Entrada | Descrição | +| :------ | :----------------------------------------------------------------- | +| `.json` | Arquivos JSON exportados pela ferramenta PDF para JSON do BentoPDF | + +## Como funciona + +1. Clique na área de upload ou arraste e solte um ou mais arquivos JSON. +2. A lista de arquivos mostra cada arquivo selecionado com seu tamanho. +3. Clique em **Converter para PDF**. A ferramenta processa todos os arquivos com um Web Worker e o mecanismo CPDF. +4. O resultado é baixado como `jsons-to-pdf.zip`, contendo um PDF para cada arquivo JSON de entrada. + +A conversão roda em um Web Worker em segundo plano, então a interface continua responsiva mesmo com arquivos grandes. + +## Opções + +Esta ferramenta não tem opções configuráveis. A estrutura do JSON determina totalmente o PDF de saída. + +## Saída + +Ao converter vários arquivos JSON, os resultados são entregues em um arquivo ZIP. Cada PDF recebe o nome do arquivo JSON de origem (por exemplo, `report.json` vira `report.pdf`). + +## Casos de uso + +- Restaurar PDFs a partir de um backup ou pipeline de arquivamento baseado em JSON +- Fazer o caminho de ida e volta de um PDF por JSON para inspeção e depois de volta para PDF +- Reconstruir documentos após modificações programáticas na estrutura JSON +- Verificar se uma exportação de PDF para JSON capturou todo o conteúdo do documento, convertendo-a de volta + +## Dicas + +- Se você precisa converter dados JSON arbitrários (como respostas de API ou arquivos de configuração) em um PDF formatado, a ferramenta [Texto para PDF](./txt-to-pdf) é mais adequada. Cole o JSON como texto e ele será renderizado com a formatação correta. +- O mecanismo WebAssembly CPDF precisa estar disponível para esta ferramenta funcionar. Instâncias auto-hospedadas precisam ter os arquivos WASM do CPDF configurados. + +## Ferramentas relacionadas + +- [Texto para PDF](./txt-to-pdf) +- [Markdown para PDF](./markdown-to-pdf) +- [CSV para PDF](./csv-to-pdf) diff --git a/docs/pt/tools/linearize-pdf.md b/docs/pt/tools/linearize-pdf.md new file mode 100644 index 00000000..d8257c45 --- /dev/null +++ b/docs/pt/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linearizar PDF +description: Otimize arquivos PDF para visualização rápida na web com carregamento progressivo. Também conhecido como otimização "Fast Web View". +--- + +# Linearizar PDF + +A linearização reestrutura um PDF para que a primeira página possa ser exibida antes de o arquivo inteiro ser baixado. A Adobe chama isso de "Fast Web View". Se você hospeda PDFs em um site ou os serve por um portal de documentos, a linearização faz com que eles abram de forma bem mais rápida. + +## Como funciona + +1. Envie um ou mais arquivos PDF. +2. Clique em **Linearizar PDF(s)**. +3. Baixe os resultados como um arquivo ZIP contendo todos os arquivos linearizados. + +Não há configurações a ajustar. A ferramenta usa a opção `--linearize` do QPDF, que reorganiza a estrutura interna do PDF sem alterar seu conteúdo visual. + +## O que a linearização faz + +- Reordena os objetos do PDF para que os dados da primeira página fiquem no início do arquivo +- Adiciona um dicionário de linearização e tabelas de dicas para que os visualizadores saibam onde encontrar cada página +- Habilita requisições por intervalo de bytes: o navegador pode buscar apenas a primeira página sem baixar o arquivo inteiro +- Limpa a tabela de referências cruzadas para acesso aleatório eficiente + +## Recursos + +- Processamento em lote de vários PDFs em uma única operação +- A saída preserva todo o conteúdo, fontes, imagens e elementos interativos +- Usa o QPDF (WebAssembly) para uma linearização confiável e compatível com os padrões +- Os resultados são empacotados em um ZIP para facilitar o download + +## Casos de uso + +- Hospedar relatórios em PDF em um site em que os usuários esperam exibição instantânea da página +- Incorporar PDFs em aplicações web com visualizadores no navegador +- Publicar catálogos ou manuais em PDF acessados por conexões móveis lentas +- Preparar documentos para redes de distribuição de conteúdo (CDNs) que suportam entrega por intervalo de bytes + +## Dicas + +- Linearize depois de concluir todas as outras edições. Qualquer modificação posterior (mesclar, adicionar páginas) quebra a linearização. +- Combine com Comprimir PDF para obter os PDFs menores e mais rápidos de carregar possíveis. +- A linearização adiciona uma pequena sobrecarga ao tamanho do arquivo (normalmente menos de 1%). + +## Ferramentas relacionadas + +- [Comprimir PDF](./compress-pdf): reduza o tamanho do arquivo antes de linearizar +- [Reparar PDF](./repair-pdf): corrija problemas estruturais que impedem a linearização +- [Remover Metadados](./remove-metadata): remova metadados antes de publicar online diff --git a/docs/pt/tools/markdown-to-pdf.md b/docs/pt/tools/markdown-to-pdf.md new file mode 100644 index 00000000..796d00b8 --- /dev/null +++ b/docs/pt/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown para PDF +description: Escreva ou cole Markdown e exporte como um PDF formatado profissionalmente, com prévia ao vivo e destaque de sintaxe. +--- + +# Markdown para PDF + +Um editor Markdown completo com prévia ao vivo e exportação para PDF com um clique. Escreva do zero, envie um arquivo `.md` existente ou cole o conteúdo da área de transferência. O editor renderiza seu Markdown em tempo real e exporta um PDF estilizado usando o mecanismo de impressão nativo do navegador. + +## Formatos suportados + +| Entrada | Descrição | +| :------------- | :----------------------- | +| Arquivos `.md` | Envie pelo botão Enviar | +| Entrada direta | Digite ou cole no editor | + +## Como funciona + +1. Abra a ferramenta Markdown para PDF. O editor carrega com visualização dividida: o código Markdown à esquerda e a prévia renderizada à direita. +2. Escreva seu Markdown, cole-o ou clique em **Enviar** para carregar um arquivo `.md`. +3. Alterne entre os temas claro e escuro usando o controle deslizante de tema na barra de ferramentas. +4. Clique em **Exportar PDF** (ou pressione `Ctrl/Cmd + S`) para gerar um PDF pela caixa de diálogo de impressão do navegador. + +## Recursos + +O editor suporta um amplo conjunto de recursos de Markdown além do básico: + +- **Markdown padrão**: títulos, negrito, itálico, links, imagens, listas, citações, linhas horizontais +- **Blocos de código** com destaque de sintaxe para mais de 15 linguagens (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash e mais) +- **Diagramas Mermaid**: fluxogramas, diagramas de sequência, diagramas ER e outros tipos de gráficos Mermaid são renderizados diretamente na prévia +- **Tabelas** com a sintaxe padrão de tabelas do Markdown +- **Listas de tarefas** com caixas de seleção +- **Notas de rodapé**, **subscrito**, **sobrescrito** +- **Listas de definição**, **abreviações** +- Suporte a **emoji** (`:smile:` é renderizado como o emoji) +- **Destaques** (`==marked text==`) e **inserções** (`++inserted text++`) +- **URLs com link automático**: URLs simples são convertidas em links clicáveis +- Geração de **sumário** +- **Links de âncora** nos títulos + +## Casos de uso + +- Escrever documentação de projeto e exportar um PDF bem acabado para as partes interessadas +- Criar relatórios técnicos com exemplos de código e diagramas de arquitetura em Mermaid +- Converter um README do GitHub em PDF para uso offline ou impressão +- Redigir uma proposta ou especificação com listas de tarefas e tabelas +- Gerar um material de apoio estilizado a partir de anotações de aula escritas em Markdown + +## Dicas + +- A saída em PDF usa a função de imprimir como PDF do navegador. No Chrome, você pode personalizar margens e escala na caixa de diálogo de impressão antes de salvar. +- Os diagramas Mermaid são renderizados na prévia, mas podem levar um instante para inicializar no primeiro uso. +- Use `Ctrl/Cmd + S` como atalho de teclado para exportar sem precisar procurar o botão. + +## Ferramentas relacionadas + +- [Texto para PDF](./txt-to-pdf) +- [Word para PDF](./word-to-pdf) +- [JSON para PDF](./json-to-pdf) diff --git a/docs/pt/tools/merge-pdf.md b/docs/pt/tools/merge-pdf.md new file mode 100644 index 00000000..2e9fea5e --- /dev/null +++ b/docs/pt/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Mesclar PDF +description: Combine vários arquivos PDF em um único documento, com reordenação por arrastar e soltar e controle no nível de página. +--- + +# Mesclar PDF + +Combine vários arquivos PDF em um único documento. Você pode mesclar arquivos inteiros em uma ordem específica ou alternar para o Modo Página para ter controle detalhado sobre cada página de todos os PDFs enviados. + +## Como funciona + +1. Envie dois ou mais arquivos PDF clicando na área de soltar ou arrastando-os para ela. +2. Escolha entre **Modo Arquivo** e **Modo Página** usando o seletor no topo. +3. No Modo Arquivo, arraste os arquivos para reordená-los e, se quiser, especifique intervalos de páginas (por exemplo, `1-3, 5`) para cada um. Deixe o intervalo em branco para incluir todas as páginas. +4. No Modo Página, arraste e solte miniaturas de páginas individuais para montar a sequência exata de páginas. +5. Clique em **Mesclar PDFs** para combinar tudo em um único arquivo. O PDF mesclado é baixado automaticamente. + +## Recursos + +- Dois modos de mesclagem: Modo Arquivo para combinar arquivos inteiros rapidamente, Modo Página para controle página a página +- Reordenação por arrastar e soltar nos dois modos, com animações suaves +- A sintaxe de intervalo de páginas (por exemplo, `1-3, 5, 8-10`) permite escolher páginas sem mudar para o Modo Página +- Miniaturas de páginas carregadas sob demanda mantêm a interface responsiva mesmo com documentos grandes +- Sem limite de número de arquivos ou de total de páginas +- Preserva a qualidade original do PDF, sem recodificação + +## Opções + +| Opção | Descrição | +| -------------------- | -------------------------------------------------------------------------------------------------------------- | +| **Modo Arquivo** | Mescle arquivos inteiros em uma ordem personalizada, com filtros opcionais de intervalo de páginas por arquivo | +| **Modo Página** | Grade visual de todas as páginas de todos os arquivos: arraste as miniaturas para montar a sequência exata | +| **Campo de páginas** | Campo de texto por arquivo que aceita intervalos como `1-3, 5` para incluir apenas páginas específicas | + +## Casos de uso + +- Combinar PDFs de capítulos separados em um único livro ou relatório +- Mesclar uma carta de apresentação e um currículo em um único documento de candidatura +- Reunir páginas específicas de vários documentos de origem em um arquivo consolidado +- Montar recibos ou faturas digitalizados em um único PDF de arquivo +- Criar um material de apoio de apresentação com slides de vários conjuntos + +## Dicas + +- Use o Modo Página quando precisar intercalar páginas de arquivos diferentes em vez de anexar um arquivo após o outro. +- Você pode adicionar mais arquivos após o envio inicial com o botão **Adicionar mais arquivos**, sem perder a organização atual. +- Os intervalos de páginas começam em 1, então `1` se refere à primeira página daquele arquivo. + +## Ferramentas relacionadas + +- [Dividir PDF](./split-pdf) +- [Organizar e Duplicar](./organize-pdf) +- [Alternar e Misturar Páginas](./alternate-merge) +- [Excluir Páginas](./delete-pages) diff --git a/docs/pt/tools/mobi-to-pdf.md b/docs/pt/tools/mobi-to-pdf.md new file mode 100644 index 00000000..aa2cbaf1 --- /dev/null +++ b/docs/pt/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI para PDF +description: Converta e-books MOBI em PDF diretamente no navegador. Grátis, privado, sem envio de arquivos. +--- + +# MOBI para PDF + +Converta e-books MOBI da Amazon Kindle em documentos PDF. Arquivos MOBI estão ligados a dispositivos e aplicativos Kindle, o que dificulta lê-los em outros lugares. Converter para PDF dá a você uma versão portátil que pode ser aberta em qualquer dispositivo ou impressa. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :------ | :------- | :------------------------------------ | +| MOBI | `.mobi` | Formato de e-book Kindle (Mobipocket) | + +## Como funciona + +1. Clique na área de upload ou arraste e solte um ou mais arquivos MOBI. +2. Revise a lista de arquivos. Remova os indesejados com o ícone da lixeira ou use **Adicionar mais arquivos** para incluir outros e-books. +3. Clique em **Converter para PDF**. O mecanismo PyMuPDF analisa a estrutura do MOBI e renderiza cada página como conteúdo PDF. +4. Um único arquivo é baixado como PDF. Ao converter vários arquivos, você recebe um arquivo ZIP chamado `mobi-converted.zip`. + +## Opções + +Nenhuma configuração adicional é necessária. A conversão preserva o conteúdo de texto, a formatação e as imagens incorporadas do arquivo MOBI original. + +## Casos de uso + +- Ler conteúdo comprado no Kindle em um leitor de e-books que não seja Kindle e só suporte PDF +- Imprimir capítulos de um e-book para estudo ou anotações offline +- Arquivar sua biblioteca pessoal de e-books em um formato universal +- Compartilhar trechos com alguém que não tem o aplicativo Kindle instalado + +## Dicas + +- Arquivos MOBI protegidos por DRM não podem ser convertidos. A ferramenta funciona apenas com arquivos MOBI sem DRM. +- E-books grandes com muitas imagens incorporadas podem levar alguns segundos a mais para processar, já que tudo acontece no navegador. + +## Ferramentas relacionadas + +- [EPUB para PDF](./epub-to-pdf) +- [FB2 para PDF](./fb2-to-pdf) +- [CBZ para PDF](./cbz-to-pdf) diff --git a/docs/pt/tools/n-up-pdf.md b/docs/pt/tools/n-up-pdf.md new file mode 100644 index 00000000..d3435e9e --- /dev/null +++ b/docs/pt/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF N-Up +description: Organize várias páginas de PDF em uma única folha em uma grade, para impressão compacta. +--- + +# PDF N-Up + +Coloque várias páginas em uma única folha em uma disposição de grade. Isso reduz o número de páginas impressas ao encaixar 2, 4, 6, 8, 9 ou 16 páginas por folha. A ferramenta cuida do dimensionamento, do posicionamento e da configuração opcional do tamanho da página. + +## Como funciona + +1. Envie um arquivo PDF. +2. Selecione o número de páginas por folha (o valor "N"): 2, 4, 6, 8, 9 ou 16. +3. Escolha o tamanho da página de saída (o padrão é A4) e a orientação. +4. Se quiser, configure o espaçamento, a cor da borda e a cor de fundo. +5. Clique no botão de processar. A ferramenta redimensiona cada página e as organiza em novas folhas. + +## Recursos + +- Layouts em grade: 2-up, 4-up, 6-up, 8-up, 9-up e 16-up +- Tamanho e orientação da página de saída configuráveis +- Espaçamento opcional entre as páginas +- Configurações de cor de fundo e de borda +- Mantém a proporção das páginas originais ao redimensioná-las para caber + +## Opções + +| Opção | Descrição | +| --------------------- | ---------------------------------------------------------------------------------- | +| **Páginas por folha** | Número de páginas originais a encaixar em cada página de saída (2, 4, 6, 8, 9, 16) | +| **Tamanho da página** | Tamanho da folha de saída (A4, Carta, Ofício etc.) | +| **Orientação** | Retrato ou Paisagem para a folha de saída | +| **Espaçamento** | Espaço em pontos entre as páginas | +| **Cor de fundo** | Cor de preenchimento do fundo da folha de saída | +| **Cor da borda** | Cor das bordas ao redor de cada página | + +## Casos de uso + +- Imprimir materiais de apoio com 4 slides por página para economizar papel +- Criar folhas de estudo com várias páginas de referência em uma única folha +- Produzir arquivos de documentos compactos para arquivamento +- Gerar folhas de visão geral em miniatura de um documento longo + +## Dicas + +- A orientação paisagem costuma funcionar melhor para layouts 2-up, enquanto retrato geralmente é a melhor para 4-up ou mais. +- Aumentar o espaçamento melhora a legibilidade, mas reduz a área disponível para cada página. +- Para a operação inversa (dividir uma página em várias), veja [Posterizar PDF](./posterize-pdf). + +## Ferramentas relacionadas + +- [Posterizar PDF](./posterize-pdf) +- [Livreto PDF](./pdf-booklet) +- [Combinar em Página Única](./combine-single-page) diff --git a/docs/pt/tools/ocr-pdf.md b/docs/pt/tools/ocr-pdf.md new file mode 100644 index 00000000..b5c96d67 --- /dev/null +++ b/docs/pt/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR em PDF +description: Torne PDFs digitalizados pesquisáveis e copiáveis usando o Tesseract OCR, com suporte a vários idiomas e filtragem de caracteres. +--- + +# OCR em PDF + +Transforme documentos digitalizados em PDFs pesquisáveis e copiáveis. A ferramenta usa o Tesseract OCR para reconhecer o texto nas imagens e sobrepõe uma camada de texto invisível sobre as páginas originais, preservando a aparência visual e tornando o conteúdo totalmente pesquisável. + +## Como funciona + +1. Envie um PDF digitalizado ou baseado em imagem. +2. Selecione um ou mais idiomas presentes no documento na lista de idiomas pesquisável. +3. Se quiser, ajuste as configurações avançadas (resolução, binarização, lista de permissão). +4. Clique em **Iniciar OCR** e acompanhe o progresso na barra de progresso em tempo real. +5. Ao terminar, revise o texto extraído e baixe o PDF pesquisável ou um arquivo `.txt` simples. + +## Recursos + +- OCR em vários idiomas com um seletor de idiomas pesquisável +- A camada de texto invisível preserva a aparência original do documento +- Barra de progresso em tempo real e saída de log durante o processamento +- Baixe os resultados como PDF pesquisável ou arquivo de texto simples +- Copie o texto extraído diretamente para a área de transferência +- Três níveis de resolução para equilibrar velocidade e precisão + +## Opções + +| Configuração | Valores | Padrão | Finalidade | +| --------------------------------------- | ----------------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------ | +| **Resolução** | Padrão (192 DPI), Alta (288 DPI), Ultra (384 DPI) | Alta | Resolução maior melhora a precisão em textos pequenos, mas leva mais tempo | +| **Binarizar imagem** | Ligado / Desligado | Desligado | Melhora o contraste em digitalizações limpas, convertendo para preto e branco | +| **Predefinição da lista de caracteres** | Nenhuma, Alfanumérica, Números + Moeda, Somente letras, Somente números, Fatura, Formulários, Personalizada | Nenhuma | Restringe os caracteres reconhecidos para melhorar a precisão em tipos específicos de documentos | +| **Lista de caracteres permitidos** | Texto livre | Vazio | Conjunto de caracteres manual quando a predefinição é Personalizada | + +## Casos de uso + +- Tornar contratos e faturas digitalizados pesquisáveis para usar Ctrl+F neles +- Extrair texto de documentos fotografados ou de registros antigos em papel +- Processar recibos com a predefinição Fatura para capturar com precisão valores e datas +- Criar PDFs acessíveis a partir de digitalizações somente de imagem para atender requisitos de conformidade +- Extrair em lote o conteúdo de texto de livros ou manuais digitalizados + +## Dicas + +- Selecione vários idiomas se o seu documento tiver conteúdo em idiomas mistos (por exemplo, títulos em inglês com corpo de texto em japonês). +- Use a opção de binarização em documentos com texto desbotado ou de baixo contraste: ela pode melhorar bastante a precisão do reconhecimento. +- As predefinições Fatura e Formulários reduzem drasticamente os falsos positivos em documentos estruturados, ignorando formas de caracteres irrelevantes. + +## Ferramentas relacionadas + +- [Extrair Tabelas](./extract-tables) +- [Mesclar PDF](./merge-pdf) +- [Comprimir PDF](./compress-pdf) diff --git a/docs/pt/tools/odg-to-pdf.md b/docs/pt/tools/odg-to-pdf.md new file mode 100644 index 00000000..52a0bde8 --- /dev/null +++ b/docs/pt/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG para PDF +description: Converta arquivos do LibreOffice Draw (ODG) em PDF no navegador. Grátis, sem upload, totalmente privado. +--- + +# ODG para PDF + +Converta arquivos OpenDocument Graphics em PDF. O ODG é o formato nativo do LibreOffice Draw e é usado para diagramas, fluxogramas e ilustrações vetoriais. Converter para PDF facilita compartilhar, imprimir e incorporar esses desenhos em outros documentos. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :-------------------- | :------- | :--------------------------------------------- | +| OpenDocument Graphics | `.odg` | Arquivos do LibreOffice Draw / OpenOffice Draw | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos ODG. Vários arquivos podem ser adicionados de uma vez. +2. Revise a lista de arquivos. Remova itens individuais com o ícone da lixeira ou clique em **Adicionar mais arquivos** para incluir mais desenhos. +3. Clique em **Converter para PDF**. Um mecanismo baseado no LibreOffice é carregado no navegador e converte cada arquivo ODG, preservando gráficos vetoriais, formas e texto. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos geram um arquivo ZIP chamado `odg-to-pdf.zip`. + +## Opções + +Nenhuma configuração adicional é necessária. A conversão preserva as dimensões originais da página, formas, conectores e caixas de texto do ODG de origem. + +## Casos de uso + +- Compartilhar diagramas do LibreOffice Draw com clientes que não têm o LibreOffice instalado +- Imprimir fluxogramas e diagramas de rede criados no Draw +- Incluir ilustrações ODG em um relatório ou apresentação como PDFs incorporados +- Arquivar desenhos técnicos em um formato que continuará legível por décadas + +## Dicas + +- Os elementos vetoriais continuam vetoriais no PDF, então o resultado escala sem perda para qualquer tamanho de impressão. +- O mecanismo do LibreOffice leva um momento para inicializar no primeiro uso. As conversões seguintes na mesma sessão são mais rápidas. + +## Ferramentas relacionadas + +- [ODS para PDF](./ods-to-pdf) +- [ODP para PDF](./odp-to-pdf) +- [VSD para PDF](./vsd-to-pdf) diff --git a/docs/pt/tools/odp-to-pdf.md b/docs/pt/tools/odp-to-pdf.md new file mode 100644 index 00000000..0e2920ad --- /dev/null +++ b/docs/pt/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP para PDF +description: Converta apresentações do LibreOffice Impress (ODP) em PDF no navegador. Grátis, privado, sem upload. +--- + +# ODP para PDF + +Converta arquivos OpenDocument Presentation em PDF. O ODP é o formato nativo do LibreOffice Impress e uma exportação padrão do Google Slides. Transformar apresentações em PDFs permite que qualquer pessoa as veja sem software de apresentação, e os slides são impressos de forma limpa. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :------------------------ | :------- | :------------------------------------------------ | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / exportação do Google Slides | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos ODP. Você pode selecionar várias apresentações de uma vez. +2. Revise a lista de arquivos. Remova itens com o ícone da lixeira ou use **Adicionar mais arquivos** para incluir outras apresentações. +3. Clique em **Converter para PDF**. O mecanismo baseado no LibreOffice processa cada apresentação e produz um PDF em que cada slide vira uma página. +4. Um único arquivo é baixado como PDF. Vários arquivos são entregues em um arquivo ZIP chamado `odp-to-pdf.zip`. + +## Opções + +Sem configurações. Cada slide é renderizado em suas dimensões originais, preservando texto, imagens, formas e planos de fundo dos slides. + +## Casos de uso + +- Distribuir uma apresentação ao público como PDF de apoio +- Compartilhar exportações do Google Slides com pessoas que preferem PDF a ODP +- Arquivar palestras e aulas em um formato somente leitura +- Imprimir apresentações para workshops presenciais + +## Dicas + +- Transições e animações de slides são recursos apenas visuais que não passam para o PDF, mas todo o conteúdo estático é renderizado corretamente. +- As notas do apresentador não são incluídas no PDF. Se você precisa das notas, exporte-as separadamente pelo seu software de apresentação. +- Como as outras ferramentas baseadas no LibreOffice, o mecanismo é carregado no primeiro uso e fica em cache durante a sessão. + +## Ferramentas relacionadas + +- [ODG para PDF](./odg-to-pdf) +- [ODS para PDF](./ods-to-pdf) +- [PUB para PDF](./pub-to-pdf) diff --git a/docs/pt/tools/ods-to-pdf.md b/docs/pt/tools/ods-to-pdf.md new file mode 100644 index 00000000..e755f026 --- /dev/null +++ b/docs/pt/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS para PDF +description: Converta planilhas do LibreOffice Calc (ODS) em PDF no seu navegador. Grátis, privado, sem cadastro. +--- + +# ODS para PDF + +Converta arquivos OpenDocument Spreadsheet em PDF. ODS é o formato nativo do LibreOffice Calc e uma exportação comum do Google Sheets. Esta ferramenta renderiza os dados, a formatação e os gráficos da sua planilha em um PDF paginado que você pode imprimir ou compartilhar. + +## Formatos Suportados + +| Formato | Extensão | Observações | +| :----------------------- | :------- | :--------------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Exportação do LibreOffice Calc / Google Sheets | + +## Como Funciona + +1. Clique na área de envio ou arraste e solte seus arquivos ODS. Vários arquivos são suportados. +2. Revise a lista de arquivos. Use o ícone de lixeira para remover arquivos ou clique em **Adicionar Mais Arquivos** para ampliar o lote. +3. Clique em **Converter para PDF**. O mecanismo baseado no LibreOffice é carregado no navegador e renderiza cada planilha em páginas PDF. +4. Uma única planilha é baixada como PDF. Vários arquivos são empacotados em `ods-to-pdf.zip`. + +## Opções + +Nenhuma configuração é necessária. O conversor aplica ao PDF o layout de impressão, a formatação das células e a largura das colunas já existentes na planilha. + +## Casos de Uso + +- Compartilhar um orçamento ou relatório do LibreOffice Calc com alguém que só aceita PDFs +- Imprimir uma exportação do Google Sheets baixada como ODS +- Arquivar registros financeiros em um formato não editável +- Enviar formulários ou folhas de ponto em ODS como documentos de layout fixo + +## Dicas + +- Se a planilha tiver várias abas, todas elas são incluídas no PDF. +- Planilhas muito largas podem se estender por várias páginas PDF na horizontal. Se o layout for importante, ajuste a largura das colunas no arquivo original antes de converter. +- O mecanismo do LibreOffice é inicializado no primeiro uso. As conversões seguintes na mesma sessão são mais rápidas. + +## Ferramentas Relacionadas + +- [ODG para PDF](./odg-to-pdf) +- [ODP para PDF](./odp-to-pdf) +- [XML para PDF](./xml-to-pdf) diff --git a/docs/pt/tools/odt-to-pdf.md b/docs/pt/tools/odt-to-pdf.md new file mode 100644 index 00000000..04aab3c6 --- /dev/null +++ b/docs/pt/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT para PDF +description: Converta arquivos OpenDocument Text (ODT) para PDF no seu navegador usando um mecanismo baseado no LibreOffice. +--- + +# ODT para PDF + +Converta arquivos OpenDocument Text em PDF. ODT é o formato nativo do LibreOffice Writer, do Apache OpenOffice e de outros processadores de texto de código aberto. Esta ferramenta usa um mecanismo LibreOffice no navegador para produzir conversões precisas, que preservam formatação, tabelas, imagens e estilos. + +## Formatos Suportados + +| Formato | Extensões | +| :---------------- | :-------- | +| OpenDocument Text | `.odt` | + +## Como Funciona + +1. Clique na área de envio ou arraste e solte um ou mais arquivos ODT. +2. Revise a lista de arquivos. Adicione mais arquivos ou remova os indesejados. +3. Clique em **Converter para PDF**. O mecanismo do LibreOffice é inicializado (um indicador de progresso mostra o status do carregamento) e então cada arquivo é convertido. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são empacotados em `odt-converted.zip`. + +## Opções + +Esta ferramenta não tem configurações adicionais. A conversão preserva o máximo possível a formatação do documento original. + +## Saída + +| Qtd. de Entrada | Saída | +| :-------------- | :------------------------------------------------------------- | +| 1 arquivo | Download de um único PDF (ex.: `document.pdf`) | +| 2+ arquivos | Arquivo ZIP (`odt-converted.zip`) com um PDF para cada arquivo | + +## Casos de Uso + +- Converter documentos do LibreOffice Writer em PDF para compartilhar com usuários do Microsoft Office +- Gerar PDFs prontos para impressão a partir de trabalhos acadêmicos escritos em formato OpenDocument +- Converter em lote uma pasta de modelos ODT em PDFs para distribuição +- Gerar PDFs a partir de arquivos ODT criados por sistemas automatizados de geração de documentos + +## Dicas + +- O mecanismo do LibreOffice é carregado no primeiro uso e fica em cache para as próximas conversões. O carregamento inicial leva alguns segundos; depois disso, as conversões são rápidas. +- Documentos complexos com objetos OLE incorporados ou fontes incomuns podem ser renderizados de forma ligeiramente diferente do LibreOffice para desktop. Teste com um exemplo antes de converter em lote. +- Para documentos do Word (`.doc`, `.docx`), use a ferramenta [Word para PDF](./word-to-pdf), que também usa o mecanismo do LibreOffice, mas aceita os formatos da Microsoft diretamente. + +## Ferramentas Relacionadas + +- [Word para PDF](./word-to-pdf) +- [RTF para PDF](./rtf-to-pdf) +- [Texto para PDF](./txt-to-pdf) diff --git a/docs/pt/tools/organize-pdf.md b/docs/pt/tools/organize-pdf.md new file mode 100644 index 00000000..c834f929 --- /dev/null +++ b/docs/pt/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplicar e Organizar +description: Reordene, duplique e exclua páginas de PDF com miniaturas de arrastar e soltar e ordem de páginas personalizada. +--- + +# Duplicar e Organizar + +Reorganize, duplique e remova páginas de um PDF usando uma interface visual de arrastar e soltar. Cada página aparece como uma miniatura que você pode mover, clonar ou excluir antes de salvar o resultado como um novo arquivo. + +## Como Funciona + +1. Envie um único arquivo PDF. +2. A ferramenta renderiza uma grade de miniaturas com todas as páginas. +3. Arraste as miniaturas para reordenar as páginas, clique no botão verde de duplicar para clonar uma página ou no botão vermelho de excluir para removê-la. +4. Se preferir, digite uma ordem de páginas personalizada no campo de texto (ex.: `3, 1, 2, 4`) e clique em **Aplicar** para reorganizar todas as páginas de uma vez. +5. Clique no botão de processar para gerar e baixar o PDF reorganizado. + +## Recursos + +- Reordenação de páginas por arrastar e soltar com transições animadas +- Botões de duplicar e excluir em cada página +- Campo de ordem de páginas personalizada para reorganização precisa +- Números de página que se atualizam automaticamente a cada alteração +- Impede a exclusão da última página restante + +## Casos de Uso + +- Mover uma página fora do lugar para a posição correta em um relatório +- Duplicar a página de um formulário para ter várias cópias em branco em um só arquivo +- Remover páginas de rascunho ou de preenchimento antes de distribuir um documento +- Inverter ou embaralhar a ordem das páginas para preparar a impressão +- Montar uma sequência de páginas personalizada sem precisar mesclar arquivos separados novamente + +## Dicas + +- O campo de ordem personalizada espera os números das páginas originais separados por vírgula. Ele deve incluir cada página exatamente uma vez, sem omissões nem duplicatas. +- Depois de duplicar uma página, as duas cópias referenciam o mesmo índice de página original. Reordenar qualquer uma das cópias funciona de forma independente. +- Para operações em lote com vários arquivos ou fluxos mais avançados, considere usar a [Multiferramenta PDF](./pdf-multi-tool). + +## Ferramentas Relacionadas + +- [Mesclar PDF](./merge-pdf) +- [Excluir Páginas](./delete-pages) +- [Multiferramenta PDF](./pdf-multi-tool) +- [Inverter Páginas](./reverse-pages) diff --git a/docs/pt/tools/page-dimensions.md b/docs/pt/tools/page-dimensions.md new file mode 100644 index 00000000..d9951b46 --- /dev/null +++ b/docs/pt/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Dimensões da página +description: Analise tamanhos, orientações, proporções e rotação das páginas de um PDF. Detecte documentos com tamanhos mistos e exporte os dados para CSV. +--- + +# Dimensões da página + +Uma ferramenta de diagnóstico que lê cada página do seu PDF e informa suas dimensões exatas, orientação, nome do tamanho padrão, proporção, área e rotação. É útil para identificar páginas de tamanhos diferentes antes da impressão ou para documentar as propriedades de um PDF recebido. + +## Como Funciona + +1. Envie um arquivo PDF. A análise começa automaticamente, sem botão para clicar. +2. Um painel de resumo mostra o total de páginas, o número de tamanhos de página distintos e se o documento tem tamanhos mistos. +3. Navegue pela tabela completa de resultados com os detalhes de cada página. +4. Alterne a unidade de exibição entre Pontos, Polegadas, Milímetros ou Pixels. +5. Clique em **Exportar para CSV** para salvar os dados. + +## Campos Informados + +| Coluna | Descrição | +| -------------- | -------------------------------------------------------- | +| Nº da página | Número sequencial da página | +| Dimensões | Largura x Altura na unidade selecionada | +| Tamanho padrão | Nome correspondente (A4, Letter etc.) ou "Personalizado" | +| Orientação | Retrato ou Paisagem | +| Proporção | Razão entre largura e altura em formato decimal | +| Área | Área da página na unidade selecionada ao quadrado | +| Rotação | Rotação da página em graus | + +## Recursos + +- Detecção automática de tamanhos de papel padrão (A3, A4, A5, Letter, Legal, Tabloid e mais) +- Aviso de documento com tamanhos mistos, com o detalhamento de quais tamanhos aparecem e quantas páginas usam cada um +- Conversão de unidades entre pontos, polegadas, milímetros e pixels (a 96 PPI) +- Exportação para CSV para uso em planilhas ou sistemas de documentação + +## Casos de Uso + +- Verificar se todas as páginas são A4 antes de enviar um documento a uma gráfica +- Descobrir por que um PDF mesclado é impresso com margens inesperadas em certas páginas +- Documentar o layout de páginas de um grande arquivo de PDFs para registros de metadados +- Identificar páginas giradas que precisam de correção + +## Dicas + +- Se o resumo mostrar "Tamanhos Mistos", use a ferramenta Ajustar Tamanho da Página para padronizar antes de imprimir. +- O campo de rotação ajuda a identificar páginas que são exibidas corretamente, mas têm um atributo de rotação diferente de zero, o que pode causar problemas em alguns fluxos de trabalho. + +## Ferramentas Relacionadas + +- [Ajustar Tamanho da Página](./fix-page-size): padronize as páginas depois de identificar tamanhos mistos +- [Comprimir PDF](./compress-pdf): otimize o PDF depois de corrigir os problemas de página +- [Girar PDF](./rotate-pdf): corrija páginas giradas diff --git a/docs/pt/tools/page-numbers.md b/docs/pt/tools/page-numbers.md new file mode 100644 index 00000000..a1d78df4 --- /dev/null +++ b/docs/pt/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Números de página +description: Adicione números de página personalizáveis em qualquer posição das páginas do seu PDF, com fonte, tamanho e cor configuráveis. +--- + +# Números de página + +Adicione números de página visíveis a todas as páginas do seu PDF. Você escolhe a posição, o formato, o tamanho da fonte e a cor, e a ferramenta cuida do resto. + +## Como Funciona + +1. Envie seu arquivo PDF. +2. Configure os ajustes de numeração no painel de opções que aparece. +3. Clique em **Adicionar Números de Página** para processar. +4. O PDF numerado é baixado automaticamente. + +## Opções + +- **Posição**: escolha onde os números de página aparecem: Inferior Centro, Inferior Esquerda, Inferior Direita, Superior Centro, Superior Esquerda ou Superior Direita. +- **Formato**: selecione entre numeração simples (1, 2, 3...) ou o formato "página X de Y" (1 / 5, 2 / 5...). +- **Tamanho da Fonte**: defina o tamanho do texto do número de página. O padrão é 12. +- **Cor**: escolha qualquer cor para o texto do número de página usando o seletor de cores. + +## Recursos + +- Seis opções de posição, cobrindo todos os cantos e o centro +- Dois formatos de numeração: sequencial simples ou "página X de Y" +- Tamanho de fonte personalizável de 6 a 72 pontos +- Seletor de cores completo para o texto +- Tratamento automático de margens que mantém os números em áreas seguras, independentemente do tamanho da página + +## Casos de Uso + +- Preparar para impressão documentos que precisam de referências de página visíveis +- Adicionar números de página a um PDF mesclado a partir de vários arquivos de origem +- Numerar materiais de apresentação antes de distribuí-los +- Adicionar numeração sequencial a documentos jurídicos ou contratos + +## Dicas + +- O formato "página X de Y" é útil em documentos nos quais os leitores precisam saber a extensão total, como propostas ou relatórios. +- Se você precisar de estilos de numeração diferentes para seções diferentes (como algarismos romanos para a parte inicial), use a ferramenta [Adicionar rótulos de página](./add-page-labels). + +## Ferramentas Relacionadas + +- [Adicionar rótulos de página](./add-page-labels) +- [Numeração Bates](./bates-numbering) +- [Cabeçalho e Rodapé](./header-footer) diff --git a/docs/pt/tools/pdf-booklet.md b/docs/pt/tools/pdf-booklet.md new file mode 100644 index 00000000..56c4ea42 --- /dev/null +++ b/docs/pt/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Livreto PDF +description: Reorganize as páginas do PDF na ordem de livreto (grampo no meio) para dobrar e grampear em um livreto físico. +--- + +# Livreto PDF + +Reorganize as páginas de um PDF na ordem de imposição de livreto. Quando impresso frente e verso e dobrado ao meio, o documento terá as páginas na sequência de leitura correta. Esse é o layout usado em livretos grampeados no meio e em zines. + +## Como Funciona + +1. Envie um arquivo PDF. +2. Defina as configurações do livreto: tamanho e orientação da página de saída. +3. Clique em **Gerar Prévia** para ver como as páginas serão organizadas em cada folha. +4. Revise a prévia, que mostra cada folha física com as páginas da frente e do verso. +5. Clique em **Baixar** para salvar o PDF com a imposição de livreto. + +## Recursos + +- Reordenação automática de páginas para encadernação com grampo no meio +- Tamanho de página de saída configurável +- Prévia visual do layout do livreto antes de baixar +- Trata contagens ímpares de páginas inserindo páginas em branco quando necessário +- Ajusta a escala das páginas de origem ao tamanho da folha do livreto + +## Casos de Uso + +- Criar livretos ou zines imprimíveis a partir de um PDF comum +- Preparar programas de conferências ou guias de eventos para impressão interna +- Fazer cartões de felicitações dobrados ou pequenos catálogos +- Produzir plaquetes ou coletâneas de poesia para encadernação artesanal + +## Dicas + +- O ideal é que o número de páginas do PDF de origem seja múltiplo de 4 para obter um livreto limpo. Se não for, páginas em branco são adicionadas automaticamente para completar a última folha. +- Imprima o resultado frente e verso, com a opção "virar pela borda curta" da impressora, depois dobre todas as folhas juntas e grampeie na lombada. +- Para apenas colocar várias páginas em uma folha, sem a ordem de livreto, use o [PDF N-Up](./n-up-pdf). + +## Ferramentas Relacionadas + +- [PDF N-Up](./n-up-pdf) +- [Girar PDF](./rotate-pdf) +- [Adicionar Página em Branco](./add-blank-page) diff --git a/docs/pt/tools/pdf-layers.md b/docs/pt/tools/pdf-layers.md new file mode 100644 index 00000000..a4fe7203 --- /dev/null +++ b/docs/pt/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Camadas OCG do PDF +description: Visualize, alterne, adicione e exclua camadas de Grupo de Conteúdo Opcional (OCG) em um documento PDF. +--- + +# Camadas OCG do PDF + +Gerencie os Grupos de Conteúdo Opcional (OCG), comumente chamados de "camadas", dentro de um PDF. Você pode alternar a visibilidade das camadas, adicionar novas camadas (inclusive camadas filhas aninhadas), excluir camadas e salvar o PDF modificado. + +## Como Funciona + +1. Envie um arquivo PDF. +2. Clique no botão de processar para carregar o documento com o mecanismo PyMuPDF. +3. A ferramenta exibe todas as camadas existentes com o estado de visibilidade, o status de bloqueio e a hierarquia de aninhamento. +4. Use as caixas de seleção para mostrar ou ocultar camadas. Camadas bloqueadas não podem ser alternadas. +5. Adicione novas camadas de nível superior digitando um nome e clicando no botão de adicionar, ou adicione camadas filhas sob uma camada pai existente. +6. Exclua as camadas de que não precisa mais. +7. Clique em **Salvar** para baixar o PDF modificado com as alterações de camadas aplicadas. + +## Recursos + +- Exibe a hierarquia de camadas com recuo adequado para camadas aninhadas +- Ativa ou desativa a visibilidade das camadas +- Indicador de camada bloqueada que evita alterações acidentais +- Adiciona camadas de nível superior ou filhas com nomes personalizados +- Exclui camadas individuais +- Salva todas as alterações em um novo arquivo PDF + +## Casos de Uso + +- Alternar a visibilidade de camadas de marcação em desenhos de arquitetura ou engenharia +- Adicionar novas camadas de anotação a um documento de design com várias camadas +- Remover camadas obsoletas de um modelo antes de distribuí-lo +- Inspecionar quais camadas existem em um PDF complexo recebido de terceiros + +## Dicas + +- Se o PDF não tiver camadas, a ferramenta mostra um estado vazio com um convite para adicionar uma. Nem todos os PDFs usam camadas OCG, que são mais comuns em exportações de CAD e arquivos de design. +- As camadas filhas aparecem recuadas sob a camada pai. Você pode aninhar camadas em qualquer profundidade. +- As camadas bloqueadas são exibidas com um ícone de cadeado e suas caixas de seleção ficam desativadas. Esses bloqueios são definidos pelo criador do PDF. + +## Ferramentas Relacionadas + +- [Ver Metadados](./view-metadata) +- [Editar Metadados](./edit-metadata) +- [Duplicar e Organizar](./organize-pdf) diff --git a/docs/pt/tools/pdf-multi-tool.md b/docs/pt/tools/pdf-multi-tool.md new file mode 100644 index 00000000..34a33c05 --- /dev/null +++ b/docs/pt/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Multiferramenta PDF +description: Um gerenciador de páginas completo para mesclar, dividir, girar, duplicar, excluir e reordenar páginas de PDF. +--- + +# Multiferramenta PDF + +Um espaço de trabalho unificado para todas as operações de PDF em nível de página. Envie um ou mais PDFs e trabalhe com todas as páginas em uma única grade visual. Gire, reordene, duplique, exclua, insira novos PDFs, adicione páginas em branco e divida o resultado, tudo sem sair da ferramenta. + +## Como Funciona + +1. Clique em **Enviar PDFs** ou arraste arquivos para a área de envio. Vários arquivos são suportados. +2. Todas as páginas de cada arquivo enviado aparecem em uma grade rolável com miniaturas. +3. Use a barra de ferramentas ou os botões de ação de cada página para manipular as páginas. +4. Selecione páginas usando a caixa de seleção de cada cartão e depois aplique operações em lote. +5. Marque pontos de divisão com o ícone de tesoura para dividir a saída em arquivos separados. +6. Clique em **Exportar PDF** para baixar o resultado final. Se houver marcadores de divisão, a saída é um ZIP com vários PDFs. + +## Recursos + +- **Mesclar**: envie vários PDFs e eles são combinados em um único espaço de trabalho automaticamente +- **Reordenar**: arraste e solte os cartões de página para reorganizar a sequência +- **Girar**: rotação por página ou em lote, em incrementos de 90 graus (para a esquerda ou para a direita) +- **Duplicar**: clone qualquer página com um clique +- **Excluir**: remova páginas individuais ou exclua em lote as selecionadas +- **Inserir PDF**: adicione um novo PDF após qualquer página específica +- **Adicionar Página em Branco**: acrescente uma página A4 em branco no final +- **Dividir**: coloque marcadores de divisão entre as páginas e depois exporte como um ZIP de PDFs separados +- **Selecionar Tudo / Desmarcar Tudo**: seleção rápida para operações em lote +- **Desfazer / Refazer**: histórico completo de desfazer/refazer para cada operação +- **Baixar selecionadas**: exporte apenas as páginas selecionadas como um PDF independente +- Repara automaticamente PDFs corrompidos antes de carregá-los + +## Casos de Uso + +- Montar um documento personalizado com páginas de vários PDFs de origem +- Limpar um documento digitalizado excluindo páginas em branco, girando digitalizações de lado e reordenando seções +- Dividir um PDF grande nos limites dos capítulos usando marcadores de divisão visuais +- Fazer edições rápidas em nível de página sem precisar de um editor de PDF completo + +## Dicas + +- O sistema de desfazer/refazer registra cada operação. Use-o à vontade, pois você não consegue destruir seu trabalho por acidente. +- Os marcadores de divisão aparecem como linhas azuis tracejadas entre as páginas. Posicione-os visualmente onde quer dividir o documento e depois exporte para obter um ZIP. +- Para tarefas simples de mesclar ou dividir, as ferramentas dedicadas [Mesclar PDF](./merge-pdf) ou [Dividir PDF](./split-pdf) podem ser mais rápidas. A Multiferramenta brilha quando você precisa de várias operações em uma só sessão. + +## Ferramentas Relacionadas + +- [Mesclar PDF](./merge-pdf) +- [Dividir PDF](./split-pdf) +- [Duplicar e Organizar](./organize-pdf) +- [Girar PDF](./rotate-pdf) diff --git a/docs/pt/tools/pdf-to-bmp.md b/docs/pt/tools/pdf-to-bmp.md new file mode 100644 index 00000000..801f3e94 --- /dev/null +++ b/docs/pt/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF para BMP +description: Converta páginas de PDF em imagens BMP sem compressão. Útil para sistemas legados e fluxos de impressão que exigem bitmap. +--- + +# PDF para BMP + +Converte cada página de um PDF em uma imagem BMP (Bitmap). BMP é um formato sem compressão, então a saída é perfeita em pixels, sem perda de qualidade, mas os arquivos são grandes. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Clique em **Converter** para processar o arquivo. +3. Um único arquivo `.bmp` ou um arquivo ZIP é baixado automaticamente. + +## Opções + +Esta ferramenta não tem opções configuráveis. As páginas são renderizadas em escala fixa de 2x, produzindo imagens com aproximadamente o dobro das dimensões nativas da página do PDF. + +## Formato de Saída + +- **Página única**: `filename.bmp` +- **Várias páginas**: `filename_bmps.zip` contendo `page_1.bmp`, `page_2.bmp` etc. + +## Casos de Uso + +- Alimentar sistemas ou equipamentos legados que só aceitam BMP com páginas de PDF. +- Preparar imagens sem compressão para fluxos de impressão específicos. +- Usar a saída em bitmap como entrada para ferramentas de processamento de imagem que exigem dados de pixels brutos. + +## Dicas + +- Os arquivos BMP são muito grandes porque armazenam dados de pixels brutos sem compressão. Para a maioria dos usos, o [PDF para PNG](./pdf-to-png) oferece qualidade sem perdas com arquivos bem menores. +- Se o sistema de destino aceitar PNG ou TIFF, prefira esses formatos para economizar espaço em disco. + +## Ferramentas Relacionadas + +- [PDF para PNG](./pdf-to-png) +- [PDF para TIFF](./pdf-to-tiff) +- [PDF para JPG](./pdf-to-jpg) diff --git a/docs/pt/tools/pdf-to-cbz.md b/docs/pt/tools/pdf-to-cbz.md new file mode 100644 index 00000000..4e3c4650 --- /dev/null +++ b/docs/pt/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF para CBZ +description: Converta um PDF em um arquivo CBZ (Comic Book Archive) para leitores de quadrinhos como Komga, Kavita, CDisplayEx e Calibre. +--- + +# PDF para CBZ + +Converte um PDF em um arquivo CBZ (Comic Book ZIP), o formato padrão para quadrinhos e mangás digitais. Cada página do PDF vira uma imagem dentro do arquivo. A ferramenta gera metadados em três formatos para máxima compatibilidade: ComicInfo.xml, metadata.opf e ComicBookInfo JSON. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Escolha o formato da imagem, a qualidade, a escala e os metadados opcionais. +3. Clique em **Converter** para gerar o arquivo CBZ. +4. O arquivo `.cbz` é baixado automaticamente. + +## Opções + +| Opção | Valores | Padrão | Descrição | +| ----------------- | ---------------- | --------- | --------------------------------------------------------------------------------------------- | +| Formato da Imagem | JPEG, PNG, WebP | JPEG | JPEG para quadrinhos coloridos, PNG para mangá P&B sem perdas, WebP para a melhor compressão. | +| Qualidade | 50–100% | 85% | Controla a compressão JPEG/WebP. Oculta para PNG (sempre sem perdas). | +| Escala | 1.0x–4.0x | 2.0x | Escalas maiores produzem imagens mais nítidas para telas de alta resolução. | +| Tons de cinza | Ligado/Desligado | Desligado | Converte as páginas para tons de cinza. Reduz o tamanho do arquivo em conteúdo P&B. | +| Modo mangá | Ligado/Desligado | Desligado | Define a direção de leitura da direita para a esquerda nos metadados. | +| Incluir metadados | Ligado/Desligado | Ligado | Incorpora ComicInfo.xml, metadata.opf e ComicBookInfo JSON. | + +## Campos de Metadados + +Quando os metadados estão ativados, você pode preencher: + +- **Título**: detectado automaticamente a partir do nome do arquivo PDF. +- **Série**: o nome da série (ex.: "Naruto"). +- **Número (#)**: número da edição dentro da série. +- **Volume (Vol.)**: número do volume. +- **Autor(es)**: nome do roteirista ou criador. +- **Editora**: empresa responsável pela publicação. +- **Tags / Gênero**: tags separadas por vírgula (ex.: "Ação, Aventura"). +- **Ano de Publicação**: ano da publicação (1900–2100). +- **Avaliação**: avaliação da comunidade de 0 a 5. + +## Compatibilidade de Metadados + +A ferramenta grava os metadados em três formatos para que todo leitor consiga encontrá-los: + +| Formato | Local | Suportado por | +| ------------------ | -------------------------- | ------------------------------------------- | +| ComicInfo.xml | Arquivo dentro do ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Arquivo dentro do ZIP | Calibre | +| ComicBookInfo JSON | Campo de comentário do ZIP | Calibre (alternativa) | + +## Formato de Saída + +- `filename.cbz`: um arquivo ZIP contendo as imagens das páginas numeradas e os arquivos de metadados. + +As imagens das páginas são nomeadas com números preenchidos com zeros (`01.jpg`, `02.jpg` etc.) para que os leitores as exibam na ordem correta. + +## Casos de Uso + +- Converter PDFs de mangá ou quadrinhos para uso com leitores de quadrinhos. +- Montar uma biblioteca digital de quadrinhos no Komga, Kavita ou Calibre. +- Converter quadrinhos digitalizados em um formato amigável para leitores. +- Compartilhar quadrinhos em um formato que preserva a direção de leitura e os metadados. + +## Dicas + +- Use **JPEG** para quadrinhos coloridos e **PNG** para mangás em preto e branco: o PNG comprime conteúdo P&B com muita eficiência. +- Ative **Tons de cinza** para mangás para reduzir bastante o tamanho do arquivo. +- Preencha os campos **Série** e **Número** para que gerenciadores de biblioteca (Komga, Calibre) organizem sua coleção automaticamente. +- O **WebP** oferece a melhor compressão, mas leitores de quadrinhos mais antigos podem não suportá-lo. + +## Ferramentas Relacionadas + +- [PDF para JPG](./pdf-to-jpg) +- [PDF para PNG](./pdf-to-png) +- [PDF para TIFF](./pdf-to-tiff) +- [Extrair Imagens](./extract-images) diff --git a/docs/pt/tools/pdf-to-csv.md b/docs/pt/tools/pdf-to-csv.md new file mode 100644 index 00000000..3261b0fb --- /dev/null +++ b/docs/pt/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF para CSV +description: Extraia tabelas de documentos PDF e exporte-as como um único arquivo CSV. Trata PDFs com várias páginas com detecção automática de tabelas. +--- + +# PDF para CSV + +Extrai tabelas de um PDF e as exporta como um arquivo CSV. A ferramenta varre cada página em busca de dados tabulares usando o mecanismo de detecção de tabelas do PyMuPDF e grava todas as linhas encontradas em uma única saída separada por vírgulas. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Clique em **Converter** para iniciar a extração de tabelas. +3. A ferramenta varre cada página e identifica as tabelas automaticamente. +4. Um arquivo `.csv` é baixado com todos os dados das tabelas extraídas. + +As tabelas de páginas diferentes são separadas por linhas em branco na saída. Células que contêm vírgulas, aspas ou quebras de linha são escapadas corretamente, seguindo a RFC 4180. + +## Opções + +Esta ferramenta não tem opções configuráveis. Todas as tabelas encontradas no documento são extraídas e combinadas em um único CSV. + +## Formato de Saída + +- Um único arquivo `filename.csv` contendo todas as tabelas detectadas. + +## Casos de Uso + +- Levar dados financeiros de extratos bancários ou faturas em PDF para uma planilha. +- Extrair tabelas de preços de orçamentos de fornecedores para comparação. +- Converter dados tabulares de pesquisas em artigos PDF para um formato adequado a ferramentas de análise. +- Migrar dados de relatórios PDF legados para bancos de dados. + +## Dicas + +- Se nenhuma tabela for encontrada, a ferramenta exibe a mensagem "Nenhuma Tabela Encontrada". Isso normalmente significa que o PDF usa um layout de texto que parece tabular, mas não está estruturado como uma tabela de verdade. +- Para ter mais controle sobre cada tabela, use [Extrair Tabelas PDF](./extract-tables), que permite escolher entre os formatos de saída CSV, JSON e Markdown. +- Se você precisar dos dados em formato Excel, com uma planilha separada para cada tabela, use [PDF para Excel](./pdf-to-excel). + +## Ferramentas Relacionadas + +- [PDF para Excel](./pdf-to-excel) +- [Extrair Tabelas PDF](./extract-tables) +- [PDF para Texto](./pdf-to-text) diff --git a/docs/pt/tools/pdf-to-excel.md b/docs/pt/tools/pdf-to-excel.md new file mode 100644 index 00000000..9c44b948 --- /dev/null +++ b/docs/pt/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF para Excel +description: Extraia tabelas de documentos PDF para uma planilha do Excel. Cada tabela ganha sua própria planilha com a referência da página. +--- + +# PDF para Excel + +Extrai tabelas de um PDF e as salva como uma planilha do Excel (`.xlsx`). Cada tabela detectada é colocada em sua própria planilha, identificada pelo número da tabela e pela página de origem. Usa o PyMuPDF para detectar as tabelas e a biblioteca SheetJS para gerar o Excel. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Clique em **Converter** para iniciar a extração de tabelas. +3. A ferramenta varre todas as páginas em busca de tabelas e depois monta uma pasta de trabalho do Excel. +4. Um arquivo `.xlsx` é baixado com uma planilha por tabela. + +## Opções + +Esta ferramenta não tem opções configuráveis. Todas as tabelas detectadas são extraídas automaticamente. + +## Formato de Saída + +- Um único arquivo `filename.xlsx`. +- **Uma tabela**: uma única planilha chamada "Table". +- **Várias tabelas**: planilhas chamadas "Table 1 (Page 3)", "Table 2 (Page 5)" etc. Os nomes das planilhas são truncados em 31 caracteres (o limite do Excel). + +## Casos de Uso + +- Converter relatórios financeiros em PDF em planilhas editáveis para análises posteriores. +- Extrair tabelas de estoque ou de pedidos de PDFs de fornecedores. +- Levar dados estruturados de formulários ou catálogos em PDF para o Excel para classificar e filtrar. +- Arquivar dados tabulares de PDFs em um formato com o qual colegas não técnicos consigam trabalhar. + +## Dicas + +- Se a ferramenta informar "Nenhuma Tabela Encontrada", o PDF provavelmente usa um layout de texto livre em vez de tabelas estruturadas. Experimente [PDF para Texto](./pdf-to-text) para obter o conteúdo bruto. +- Para um formato mais simples e plano, use [PDF para CSV](./pdf-to-csv). Para downloads por tabela em vários formatos, use [Extrair Tabelas PDF](./extract-tables). +- Confira os nomes das planilhas para identificar de qual página cada tabela veio. + +## Ferramentas Relacionadas + +- [PDF para CSV](./pdf-to-csv) +- [Extrair Tabelas PDF](./extract-tables) +- [PDF para Texto](./pdf-to-text) diff --git a/docs/pt/tools/pdf-to-greyscale.md b/docs/pt/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..7bb7e478 --- /dev/null +++ b/docs/pt/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF para tons de cinza +description: Converta um PDF colorido em uma versão em tons de cinza (preto e branco). Gera um novo PDF sem nenhuma cor em todas as páginas. +--- + +# PDF para tons de cinza + +Converte um PDF colorido em uma versão em tons de cinza. Cada página é renderizada, dessaturada e reincorporada como imagem JPEG em um novo PDF. A saída preserva as dimensões originais das páginas. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Clique em **Converter** para processar o arquivo. +3. Um novo `greyscale.pdf` é baixado com todas as páginas convertidas para preto e branco. + +Nos bastidores, cada página é renderizada em escala 2x, os dados de pixels passam por um filtro de tons de cinza e depois são recodificados como JPEG com 90% de qualidade e colocados em um novo documento PDF. + +## Opções + +Esta ferramenta não tem opções configuráveis. A conversão para tons de cinza usa uma fórmula de luminância padrão e a qualidade do JPEG é fixa em 90%. + +## Formato de Saída + +- Um único arquivo `greyscale.pdf` com todas as páginas como imagens JPEG em tons de cinza. + +## Casos de Uso + +- Preparar documentos para impressão em preto e branco e economizar tinta colorida. +- Atender a exigências de envio de documentos jurídicos ou governamentais que determinam tons de cinza. +- Reduzir o tamanho de PDFs com muitas cores (imagens JPEG em tons de cinza são menores que as coloridas). +- Criar um estilo visual consistente em documentos com páginas coloridas e P&B misturadas. + +## Dicas + +- Como cada página é rasterizada e reincorporada como JPEG, a saída é baseada em imagens. O texto do PDF original deixa de poder ser selecionado ou pesquisado. Se você precisar de texto pesquisável depois, passe o resultado pela ferramenta de OCR. +- Para ter mais controle sobre os ajustes de cor (brilho, contraste, saturação), veja a ferramenta Ajustar Cores ou o nó Tons de Cinza no [Construtor de fluxo de trabalho PDF](./pdf-workflow). + +## Ferramentas Relacionadas + +- [PDF para JPG](./pdf-to-jpg) +- [PDF para PNG](./pdf-to-png) +- [Construtor de fluxo de trabalho PDF](./pdf-workflow) diff --git a/docs/pt/tools/pdf-to-jpg.md b/docs/pt/tools/pdf-to-jpg.md new file mode 100644 index 00000000..a57d14d3 --- /dev/null +++ b/docs/pt/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF para JPG +description: Converta páginas de PDF em imagens JPG com qualidade ajustável. PDFs de uma página são baixados diretamente; PDFs de várias páginas são exportados como ZIP. +--- + +# PDF para JPG + +Converte cada página de um PDF em uma imagem JPG. Documentos de uma página são baixados como um arquivo `.jpg` independente. PDFs de várias páginas geram um arquivo ZIP com um JPG por página. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. A ferramenta exibe o nome do arquivo, o tamanho e o número de páginas. +2. Ajuste o controle deslizante de **Qualidade** para definir a compressão do JPG. +3. Clique em **Converter** para iniciar o processamento. +4. O resultado é baixado automaticamente: um único JPG para PDFs de uma página ou um arquivo ZIP para documentos de várias páginas. + +## Opções + +- **Qualidade**: um controle deslizante de 0% a 100% (padrão 90%). Valores mais altos produzem imagens mais nítidas, com arquivos maiores. Valores mais baixos comprimem de forma mais agressiva. + +Internamente, as páginas são renderizadas em escala 2x, então a resolução de saída é o dobro das dimensões da página do PDF. Uma página padrão em tamanho Carta gera uma imagem de cerca de 1.224 x 1.584 pixels. + +## Formato de Saída + +- **Página única**: `filename.jpg` +- **Várias páginas**: `filename_jpgs.zip` contendo `page_1.jpg`, `page_2.jpg` etc. + +## Casos de Uso + +- Gerar miniaturas de pré-visualização para um sistema de gerenciamento de documentos. +- Compartilhar uma página de um relatório em um chat ou e-mail que não aceita PDF. +- Criar recursos de imagem a partir de diagramas ou ilustrações em PDF. +- Arquivar documentos digitalizados como imagens individuais. + +## Dicas + +- Para uma saída sem perdas, use o [PDF para PNG](./pdf-to-png). +- Uma qualidade entre 80 e 90% oferece um bom equilíbrio entre tamanho do arquivo e fidelidade visual. +- Se você precisar de um formato específico por página, considere o [Construtor de fluxo de trabalho PDF](./pdf-workflow), que tem um nó de saída PDF para Imagens. + +## Ferramentas Relacionadas + +- [PDF para PNG](./pdf-to-png) +- [PDF para WebP](./pdf-to-webp) +- [PDF para BMP](./pdf-to-bmp) +- [PDF para TIFF](./pdf-to-tiff) diff --git a/docs/pt/tools/pdf-to-json.md b/docs/pt/tools/pdf-to-json.md new file mode 100644 index 00000000..2e461c08 --- /dev/null +++ b/docs/pt/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF para JSON +description: Converta arquivos PDF em formato JSON estruturado usando o CPDF. Exporta a estrutura interna do PDF como dados JSON legíveis por máquina. +--- + +# PDF para JSON + +Converte um ou mais arquivos PDF em formato JSON. A ferramenta usa o CPDF (Coherent PDF) para serializar a estrutura interna de cada PDF em uma representação JSON legível por máquina. A saída é sempre entregue como um arquivo ZIP. + +## Como Funciona + +1. Selecione um ou mais arquivos PDF usando o seletor de arquivos. +2. Clique em **Converter** para iniciar o processamento. A conversão é executada em um web worker em segundo plano. +3. Um arquivo ZIP é baixado com um arquivo JSON para cada PDF de entrada. + +A barra de status mostra o progresso das etapas de conversão e de criação do ZIP. + +## Opções + +Esta ferramenta não tem opções configuráveis. Cada PDF é convertido para sua representação JSON completa. + +## Formato de Saída + +- Um arquivo `pdfs-to-json.zip` contendo `filename.json` para cada PDF de entrada. + +A saída JSON representa a estrutura interna de objetos do PDF, incluindo árvores de páginas, referências de fontes, metadados e fluxos de conteúdo. + +## Casos de Uso + +- Inspecionar a estrutura interna de um PDF para depuração ou validação. +- Extrair metadados estruturados e propriedades de página de forma programática. +- Alimentar pipelines de processamento personalizados com dados da estrutura do PDF. +- Auditar documentos PDF quanto à conformidade analisando suas árvores de objetos. + +## Dicas + +- Esta ferramenta gera a estrutura bruta de objetos do PDF, não o conteúdo de texto extraído. Se você precisar do texto das páginas em formato JSON, use [Preparar PDF para IA](./prepare-pdf-for-ai). +- Para extração de texto simples, [PDF para Texto](./pdf-to-text) é mais direto. +- PDFs grandes com estruturas complexas geram arquivos JSON muito grandes. + +## Ferramentas Relacionadas + +- [PDF para Texto](./pdf-to-text) +- [Preparar PDF para IA](./prepare-pdf-for-ai) +- [Extrair Tabelas PDF](./extract-tables) diff --git a/docs/pt/tools/pdf-to-markdown.md b/docs/pt/tools/pdf-to-markdown.md new file mode 100644 index 00000000..41b2c295 --- /dev/null +++ b/docs/pt/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF para Markdown +description: Converta documentos PDF para o formato Markdown, com extração opcional de imagens. Suporta conversão em lote de vários arquivos. +--- + +# PDF para Markdown + +Converte arquivos PDF para o formato Markdown (`.md`), preservando títulos, parágrafos, listas e a formatação básica. Opcionalmente, extrai e inclui as imagens incorporadas. Suporta conversão individual e em lote. Usa o PyMuPDF. + +## Como Funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando arquivos para ela. +2. Se quiser, ative **Incluir Imagens** para incorporar as imagens extraídas na saída em Markdown. +3. Clique em **Converter** para iniciar o processamento. +4. Um único arquivo é baixado como `filename.md`. Vários arquivos geram um `markdown-files.zip`. + +## Opções + +- **Incluir Imagens**: quando marcada, as imagens incorporadas no PDF são extraídas e referenciadas na saída em Markdown. Quando desmarcada, apenas o conteúdo de texto é convertido. + +## Formato de Saída + +- **Arquivo único**: `filename.md` +- **Vários arquivos**: `markdown-files.zip` contendo um `.md` para cada PDF de entrada. + +## Casos de Uso + +- Converter documentação em PDF para Markdown para um gerador de sites estáticos como VitePress, Hugo ou Jekyll. +- Transformar artigos científicos em PDF em Markdown editável para aplicativos de anotações como o Obsidian. +- Migrar bases de conhecimento legadas em PDF para um formato de texto compatível com o Git. +- Extrair conteúdo estruturado de e-books em PDF para reformatação. + +## Dicas + +- A opção Incluir Imagens é útil quando o PDF contém diagramas ou figuras essenciais ao conteúdo. Desative-a em documentos com muito texto para manter a saída limpa. +- Layouts complexos com barras laterais, notas de rodapé ou texto em várias colunas podem gerar um Markdown imperfeito. Revise e ajuste a saída conforme necessário. +- Para texto bruto, sem nenhuma formatação, use [PDF para Texto](./pdf-to-text). + +## Ferramentas Relacionadas + +- [PDF para Texto](./pdf-to-text) +- [PDF para Word](./pdf-to-word) +- [Preparar PDF para IA](./prepare-pdf-for-ai) diff --git a/docs/pt/tools/pdf-to-pdfa.md b/docs/pt/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..bd81fff7 --- /dev/null +++ b/docs/pt/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF para PDF/A +description: Converta PDFs comuns para o formato PDF/A para arquivamento de longo prazo. Suporta os níveis de conformidade PDF/A-1b, PDF/A-2b e PDF/A-3b. +--- + +# PDF para PDF/A + +PDF/A é um subconjunto do PDF padronizado pela ISO e projetado para a preservação digital de longo prazo. Esta ferramenta converte seus PDFs comuns em documentos compatíveis com PDF/A usando o Ghostscript, executado diretamente no seu navegador. + +## Como Funciona + +1. Envie um ou mais arquivos PDF. +2. Selecione uma **Versão do PDF/A** na lista suspensa. +3. Se quiser, ative **Pré-achatar PDF** para arquivos complexos que falham na conversão normal. +4. Clique em **Converter para PDF/A**. Vários arquivos geram um arquivo ZIP. + +## Versões do PDF/A + +| Versão | Restrições | Ideal Para | +| ------------ | ------------------------------------------------ | ---------------------------------------------------------------- | +| **PDF/A-1b** | A mais rígida. Sem transparência, sem camadas. | Máxima compatibilidade com sistemas de arquivamento mais antigos | +| **PDF/A-2b** | Permite transparência e JPEG2000. | Arquivamento de uso geral (recomendado) | +| **PDF/A-3b** | Permite anexos incorporados de qualquer formato. | Arquivar documentos com arquivos de dados de origem | + +O PDF/A-2b vem selecionado por padrão e atende à grande maioria das necessidades de arquivamento. + +## Opção de Pré-achatar + +Alguns PDFs contêm recursos que impedem uma conversão limpa para PDF/A: codificações de fonte incomuns, pilhas de transparência complexas ou estruturas internas danificadas. Ativar **Pré-achatar** rasteriza o PDF a 300 DPI antes da conversão, o que garante a conformidade ao custo de tornar o texto não selecionável. Use-a como alternativa quando a conversão padrão gerar erros. + +O pré-achatamento requer o mecanismo PyMuPDF WASM. + +## Casos de Uso + +- Atender a exigências de arquivamento governamentais ou jurídicas (muitas jurisdições exigem PDF/A em peças processuais) +- Enviar documentos a repositórios institucionais ou bibliotecas digitais +- Preservar registros empresariais cujo software original talvez não exista daqui a dez anos +- Preparar faturas para padrões de faturamento eletrônico que exigem PDF/A-3b com anexos XML + +## Dicas + +- Tente primeiro a conversão sem pré-achatar. Ative-a apenas se ocorrer um erro. +- O PDF/A incorpora todas as fontes, então os arquivos de saída costumam ser maiores que os originais. +- Valide a saída em um validador de PDF/A dedicado se o seu fluxo exigir conformidade estrita. + +## Ferramentas Relacionadas + +- [Comprimir PDF](./compress-pdf): reduza o tamanho do arquivo depois da conversão +- [Achatar PDF (Flatten)](./flatten-pdf): achate os formulários antes de converter para PDF/A +- [Remover Metadados](./remove-metadata): remova os metadados antes de arquivar diff --git a/docs/pt/tools/pdf-to-png.md b/docs/pt/tools/pdf-to-png.md new file mode 100644 index 00000000..daf8017b --- /dev/null +++ b/docs/pt/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF para PNG +description: Converta páginas de PDF em imagens PNG sem perdas, com escala ajustável. Ideal para capturas de tela de alta qualidade e fundos transparentes. +--- + +# PDF para PNG + +Converte cada página de um PDF em uma imagem PNG. O PNG usa compressão sem perdas, então a saída preserva todos os detalhes da página original. PDFs de uma página são baixados como um arquivo `.png`; PDFs de várias páginas geram um ZIP. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Ajuste o controle deslizante de **Escala** para definir a resolução de saída. +3. Clique em **Converter** para iniciar o processamento. +4. Um único PNG ou um arquivo ZIP é baixado automaticamente. + +## Opções + +- **Escala**: varia de 1.0x a 3.0x (padrão 2.0x). Em 2.0x, uma página padrão em tamanho Carta é renderizada com cerca de 1.224 x 1.584 pixels. Escalas maiores produzem imagens maiores e mais nítidas, ao custo de tamanho de arquivo e tempo de processamento. + +## Formato de Saída + +- **Página única**: `filename.png` +- **Várias páginas**: `filename_pngs.zip` contendo `page_1.png`, `page_2.png` etc. + +## Casos de Uso + +- Capturar imagens de alta fidelidade de páginas de PDF para apresentações. +- Extrair gráficos ou diagramas que precisam de bordas nítidas e sem artefatos de compressão. +- Preparar recursos para web design a partir de protótipos em PDF. +- Criar imagens de página sem perdas para pré-processamento de OCR. + +## Dicas + +- Os arquivos PNG são bem maiores que os JPG. Se o tamanho do arquivo importa mais que a qualidade perfeita, use [PDF para JPG](./pdf-to-jpg) ou [PDF para WebP](./pdf-to-webp). +- Na escala 1.0x, a saída corresponde à resolução nativa do PDF. Use 3.0x para exportações com qualidade de impressão. + +## Ferramentas Relacionadas + +- [PDF para JPG](./pdf-to-jpg) +- [PDF para WebP](./pdf-to-webp) +- [PDF para SVG](./pdf-to-svg) diff --git a/docs/pt/tools/pdf-to-svg.md b/docs/pt/tools/pdf-to-svg.md new file mode 100644 index 00000000..71e32c35 --- /dev/null +++ b/docs/pt/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF para SVG +description: Converta páginas de PDF em gráficos vetoriais SVG escaláveis. Preserva texto e formas como caminhos vetoriais para escala infinita. +--- + +# PDF para SVG + +Converte cada página de um PDF em um arquivo SVG (Scalable Vector Graphics). Ao contrário dos formatos raster, o SVG preserva caminhos vetoriais, texto e formas, de modo que a saída pode ser ampliada a qualquer tamanho sem pixelização. Usa o PyMuPDF. + +## Como Funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando arquivos para ela. Você pode adicionar vários arquivos e gerenciá-los individualmente. +2. Clique em **Converter** para processar todos os arquivos enviados. +3. Conversões de um único arquivo com uma única página são baixadas como um `.svg` independente. Todo o resto é baixado como um arquivo ZIP. + +## Opções + +Esta ferramenta não tem opções configuráveis. Cada página é convertida em SVG usando a exportação vetorial nativa do PyMuPDF. + +## Formato de Saída + +- **Um arquivo, uma página**: `filename.svg` +- **Um arquivo, várias páginas**: `filename_svg.zip` contendo `page_1.svg`, `page_2.svg` etc. +- **Vários arquivos**: `pdf_to_svg.zip` com os arquivos organizados pelo nome do documento de origem. + +## Casos de Uso + +- Extrair diagramas vetoriais, gráficos ou ilustrações de relatórios em PDF para usar em páginas web. +- Editar o conteúdo de páginas de PDF em um editor vetorial como o Inkscape ou o Illustrator. +- Incorporar pré-visualizações escaláveis de páginas em aplicativos web responsivos. +- Extrair logotipos ou gráficos de folhetos em PDF preservando bordas nítidas. + +## Dicas + +- O SVG funciona melhor com PDFs que contêm conteúdo vetorial. Documentos digitalizados ou PDFs com muitas imagens geram arquivos SVG grandes, com dados raster incorporados. +- Para saída raster de PDFs com muitas imagens, use [PDF para PNG](./pdf-to-png) ou [PDF para JPG](./pdf-to-jpg). +- Esta ferramenta suporta conversão em lote: envie vários PDFs de uma vez para convertê-los todos em uma única execução. + +## Ferramentas Relacionadas + +- [PDF para PNG](./pdf-to-png) +- [PDF para JPG](./pdf-to-jpg) +- [PDF para Markdown](./pdf-to-markdown) diff --git a/docs/pt/tools/pdf-to-text.md b/docs/pt/tools/pdf-to-text.md new file mode 100644 index 00000000..af863edd --- /dev/null +++ b/docs/pt/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF para texto +description: Extraia o conteúdo de texto simples de arquivos PDF. Suporta extração em lote de vários PDFs com saída em arquivos TXT. +--- + +# PDF para texto + +Extrai todo o conteúdo de texto de arquivos PDF e o salva como arquivos `.txt` simples. Suporta processamento em lote: envie vários PDFs e tenha o texto de cada um extraído em uma única operação. Usa o PyMuPDF. + +## Como Funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando arquivos para ela. Gerencie sua lista de arquivos com os botões Adicionar Mais e Limpar. +2. Clique em **Extrair** para iniciar o processamento. +3. Um único arquivo é baixado como `filename.txt`. Vários arquivos geram um arquivo `pdf-to-text.zip`. + +## Opções + +Esta ferramenta não tem opções configuráveis. Todo o conteúdo de texto é extraído de todas as páginas na ordem de leitura. + +## Formato de Saída + +- **Arquivo único**: `filename.txt` +- **Vários arquivos**: `pdf-to-text.zip` contendo um `.txt` para cada PDF de entrada. + +## Casos de Uso + +- Extrair o texto principal de relatórios em PDF para indexação de pesquisa de texto completo. +- Converter e-books ou artigos em PDF para texto simples para ler em dispositivos de tinta eletrônica. +- Extrair texto de contratos ou documentos jurídicos para análise de palavras-chave. +- Remover a formatação de PDFs para obter texto limpo para scripts de processamento de dados. +- Preparar um corpus de texto a partir de arquivos PDF para processamento de linguagem natural. + +## Dicas + +- PDFs digitalizados (apenas imagem) geram arquivos de texto vazios, pois não há camada de texto para extrair. Passe primeiro os documentos digitalizados por OCR. +- A saída preserva a ordem de leitura como interpretada pelo PyMuPDF, que em geral segue da esquerda para a direita e de cima para baixo. Layouts de várias colunas podem gerar texto intercalado. +- Para uma saída estruturada com títulos e formatação, experimente [PDF para Markdown](./pdf-to-markdown). Para JSON estruturado pronto para IA, use [Preparar PDF para IA](./prepare-pdf-for-ai). + +## Ferramentas Relacionadas + +- [PDF para Markdown](./pdf-to-markdown) +- [Preparar PDF para IA](./prepare-pdf-for-ai) +- [PDF para Word](./pdf-to-word) diff --git a/docs/pt/tools/pdf-to-tiff.md b/docs/pt/tools/pdf-to-tiff.md new file mode 100644 index 00000000..bc164884 --- /dev/null +++ b/docs/pt/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF para TIFF +description: Converta páginas de PDF em imagens TIFF, muito usadas em fluxos de impressão, fax e arquivamento. Usa PNG como alternativa se a codificação falhar. +--- + +# PDF para TIFF + +Converte cada página de um PDF em uma imagem TIFF. O TIFF é o formato padrão para produção gráfica, sistemas de fax e arquivamento de documentos. A ferramenta usa a compressão PackBits para codificar o TIFF e recorre ao PNG caso uma página não possa ser codificada. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Clique em **Converter** para processar o arquivo. +3. Um único arquivo TIFF ou um arquivo ZIP é baixado automaticamente. + +## Opções + +Esta ferramenta não tem opções configuráveis. As páginas são renderizadas em escala fixa de 2x. + +## Formato de Saída + +- **Página única**: `filename.tiff` +- **Várias páginas**: `filename_tiffs.zip` contendo `page_1.tiff`, `page_2.tiff` etc. + +Se a codificação TIFF falhar em uma página específica (por problemas de compressão), essa página é salva como um arquivo `.png`. Nesse caso, o ZIP conterá uma mistura de arquivos TIFF e PNG. + +## Casos de Uso + +- Enviar documentos a órgãos governamentais ou sistemas jurídicos que exigem o formato TIFF. +- Preparar páginas para transmissão por fax em serviços de fax digital. +- Arquivar documentos digitalizados em um formato sem perdas amplamente suportado. +- Alimentar sistemas corporativos de gerenciamento de documentos com as páginas. + +## Dicas + +- Os arquivos TIFF são grandes. Se você só precisa de qualidade sem perdas para uso na web ou na tela, [PDF para PNG](./pdf-to-png) é uma escolha melhor. +- Confira o conteúdo do ZIP se algumas páginas precisaram da alternativa em PNG: talvez você queira convertê-las separadamente. + +## Ferramentas Relacionadas + +- [PDF para PNG](./pdf-to-png) +- [PDF para BMP](./pdf-to-bmp) +- [PDF para JPG](./pdf-to-jpg) diff --git a/docs/pt/tools/pdf-to-webp.md b/docs/pt/tools/pdf-to-webp.md new file mode 100644 index 00000000..2ba884f2 --- /dev/null +++ b/docs/pt/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF para WebP +description: Converta páginas de PDF em imagens WebP com qualidade ajustável. Arquivos menores que o JPG com qualidade visual comparável. +--- + +# PDF para WebP + +Converte cada página de um PDF em uma imagem WebP. O WebP costuma gerar arquivos 25-35% menores que o JPG com a mesma qualidade percebida, o que o torna uma ótima escolha para uso na web. + +## Como Funciona + +1. Envie um PDF clicando na área de soltar ou arrastando um arquivo para ela. +2. Ajuste o controle deslizante de **Qualidade**. +3. Clique em **Converter** para processar o arquivo. +4. Um único arquivo `.webp` ou um arquivo ZIP é baixado automaticamente. + +## Opções + +- **Qualidade**: um controle deslizante de 0% a 100% (padrão 85%). Controla o nível de compressão com perdas. Valores mais altos retêm mais detalhes. + +Internamente, as páginas são renderizadas em escala 2x, gerando imagens com aproximadamente o dobro das dimensões nativas do PDF. + +## Formato de Saída + +- **Página única**: `filename.webp` +- **Várias páginas**: `filename_webps.zip` contendo `page_1.webp`, `page_2.webp` etc. + +## Casos de Uso + +- Preparar pré-visualizações de páginas para sites em que a largura de banda importa. +- Gerar versões de imagem leves de panfletos ou folhetos para redes sociais. +- Converter em lote documentos de várias páginas em um conjunto de imagens otimizado para a web. + +## Dicas + +- O WebP é suportado em todos os navegadores modernos. Para compatibilidade com navegadores antigos, use [PDF para JPG](./pdf-to-jpg) como alternativa. +- Uma qualidade de 80-85% costuma ser indistinguível do original na tela, mantendo os arquivos pequenos. + +## Ferramentas Relacionadas + +- [PDF para JPG](./pdf-to-jpg) +- [PDF para PNG](./pdf-to-png) +- [PDF para BMP](./pdf-to-bmp) diff --git a/docs/pt/tools/pdf-to-word.md b/docs/pt/tools/pdf-to-word.md new file mode 100644 index 00000000..4f3ef04e --- /dev/null +++ b/docs/pt/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF para Word +description: Converta arquivos PDF em documentos editáveis do Word (DOCX). Suporta conversão em lote de vários PDFs de uma só vez. +--- + +# PDF para Word + +Converte arquivos PDF em documentos editáveis do Word (`.docx`). A ferramenta usa o PyMuPDF para reconstruir o conteúdo do documento, preservando o texto, a formatação básica e o layout. Suporta conversão individual e em lote. + +## Como Funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando arquivos para ela. Você pode adicionar mais arquivos ou remover arquivos individuais da lista. +2. Clique em **Converter** para iniciar o processamento. +3. Um único arquivo é baixado como `filename.docx`. Vários arquivos são empacotados em `converted-documents.zip`. + +## Opções + +Esta ferramenta não tem opções configuráveis. Cada PDF é convertido em DOCX usando o mecanismo de conversão integrado do PyMuPDF. + +## Formato de Saída + +- **Arquivo único**: `filename.docx` +- **Vários arquivos**: `converted-documents.zip` contendo um `.docx` para cada PDF de entrada. + +## Casos de Uso + +- Editar o texto de um PDF que você recebeu e precisa modificar. +- Converter relatórios arquivados em PDF para um formato que colegas possam editar no Microsoft Word ou no Google Docs. +- Levar o conteúdo de contratos ou propostas em PDF para o Word para fazer revisões. +- Migrar documentação legada em PDF para um formato editável. + +## Dicas + +- Layouts complexos com texto em várias colunas, formulários incorporados ou muitos gráficos podem não ser convertidos perfeitamente. Revise a saída e ajuste a formatação no seu processador de texto. +- PDFs digitalizados (apenas imagem) geram arquivos DOCX vazios ou quase vazios. Passe-os primeiro por OCR para adicionar uma camada de texto. +- O modo em lote é eficiente para converter pastas inteiras de PDFs: envie todos de uma vez. + +## Ferramentas Relacionadas + +- [PDF para Texto](./pdf-to-text) +- [PDF para Markdown](./pdf-to-markdown) +- [Construtor de fluxo de trabalho PDF](./pdf-workflow) diff --git a/docs/pt/tools/pdf-to-zip.md b/docs/pt/tools/pdf-to-zip.md new file mode 100644 index 00000000..b1d01bc4 --- /dev/null +++ b/docs/pt/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDFs para ZIP +description: Empacote vários arquivos PDF em um único arquivo ZIP para facilitar o compartilhamento e o armazenamento. +--- + +# PDFs para ZIP + +Reúna vários arquivos PDF em um único arquivo ZIP. É uma ferramenta de empacotamento simples: não há conversão, compressão nem modificação dos próprios PDFs. + +## Como Funciona + +1. Envie vários arquivos PDF usando a área de soltar. +2. Revise a lista de arquivos. Remova os que você não quer incluir. +3. Clique no botão de processar. +4. Um arquivo ZIP com todos os PDFs enviados é baixado imediatamente. + +## Recursos + +- Aceita qualquer quantidade de arquivos PDF +- Remoção individual de arquivos antes de criar o arquivo ZIP +- Preserva os nomes originais dos arquivos dentro do ZIP +- Nenhuma modificação no conteúdo dos PDFs: os arquivos são empacotados como estão +- Exibe o nome e o tamanho de cada PDF enviado + +## Casos de Uso + +- Reunir um conjunto de faturas ou recibos para anexar a um e-mail +- Empacotar entregas de um projeto (vários relatórios em PDF) para a passagem de bastão +- Criar um único download para uma coleção de formulários ou modelos +- Arquivar um lote de documentos em um único arquivo compactado + +## Dicas + +- O arquivo ZIP usa os nomes originais dos PDFs. Se houver arquivos com o mesmo nome, renomeie-os antes de enviar para evitar conflitos. +- Esta ferramenta não comprime os próprios PDFs. Para reduzir o tamanho dos arquivos, passe-os primeiro por Comprimir PDF e depois empacote com esta ferramenta. + +## Ferramentas Relacionadas + +- [Mesclar PDF](./merge-pdf) +- [Dividir PDF](./split-pdf) +- [Comprimir PDF](./compress-pdf) diff --git a/docs/pt/tools/pdf-workflow.md b/docs/pt/tools/pdf-workflow.md new file mode 100644 index 00000000..e442fc36 --- /dev/null +++ b/docs/pt/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Construtor de fluxo de trabalho PDF +description: Crie pipelines personalizados de processamento de PDF de forma visual, conectando nós em um canvas. Encadeie operações como mesclar, comprimir, marca d'água e exportar. +--- + +# Construtor de fluxo de trabalho PDF + +O Construtor de fluxo de trabalho permite encadear várias operações de PDF em um único pipeline automatizado. Em vez de executar as ferramentas uma de cada vez, você monta um grafo visual de nós (entrada, processamento, saída) e executa tudo com um clique. Seus arquivos nunca saem do navegador. + +## Como Funciona + +A interface é dividida em três painéis: uma **caixa de nós** à esquerda, o **canvas** no centro e um **painel de configurações** à direita, que aparece ao selecionar um nó. + +1. **Adicione nós** clicando neles na barra lateral esquerda ou arrastando-os diretamente para o canvas. Use a barra de pesquisa no topo da caixa de nós para filtrar por nome. +2. **Conecte os nós** arrastando de um soquete de saída (parte de baixo de um nó) até um soquete de entrada (parte de cima de outro nó). As conexões fluem de cima para baixo. +3. **Defina as configurações** clicando em um nó para abrir seu painel de configurações à direita. Cada tipo de nó tem suas próprias opções (intervalos de páginas, controles de qualidade, senhas etc.). +4. **Execute o fluxo de trabalho** clicando no botão **Executar** na barra de ferramentas. O mecanismo executa os nós em ordem topológica, processando um de cada vez em sequência. Uma barra de status na parte inferior acompanha o progresso. +5. **Baixe os resultados**: o nó Download, no final, salva o PDF final (ou um ZIP, se vários arquivos forem produzidos). + +## Categorias de Nós + +Os nós são organizados em seis categorias, cada uma com uma cor no canvas: + +- **Entrada** (azul): Entrada PDF, Entrada de imagem, Word/Excel/PowerPoint para PDF e mais de 15 outros conversores de formato que alimentam o pipeline com arquivos. +- **Editar e Anotar** (índigo): Recortar, Tons de Cinza, Inverter Cores, Marca d'água, Números de Página, Cabeçalho e Rodapé, Efeito de Scanner, Ajustar Cores, Cor de Fundo, Remover Páginas em Branco, Remover Anotações. +- **Organizar e Gerenciar** (violeta): Mesclar, Dividir, Extrair Páginas, Girar, Excluir Páginas, Inverter, Adicionar Página em Branco, Dividir Páginas, N-Up, Ajustar Tamanho da Página, Combinar em Página Única, Livreto, Posterizar, Editar Metadados, Índice, OCR. +- **Otimizar e Reparar** (âmbar): Comprimir, Rasterizar, Linearizar, Desinclinar, PDF para PDF/A, Fonte em Contorno, Reparar. +- **Proteger PDF** (rosa): Criptografar, Descriptografar, Higienizar, Achatar, Assinar Digitalmente, Redigir. +- **Saída** (verde-azulado): Download (detecta automaticamente PDF único ou ZIP), PDF para Imagens, PDF para Texto, PDF para DOCX, PDF para XLSX, PDF para CSV, PDF para SVG, PDF para Markdown, Extrair Imagens. + +## Salvando e Carregando Fluxos de Trabalho + +A barra de ferramentas oferece quatro opções de persistência: + +- **Salvar**: armazena o fluxo de trabalho atual como um modelo nomeado no armazenamento local do navegador. Você pode salvar vários modelos. +- **Carregar**: abre uma janela com todos os modelos salvos. Clique em Carregar para restaurar um deles ou exclua os modelos de que não precisa mais. +- **Exportar**: baixa o fluxo de trabalho como um arquivo `.json` para você compartilhá-lo ou fazer um backup. +- **Importar**: carrega um arquivo de fluxo de trabalho `.json` do disco, restaurando todos os nós, posições e conexões. + +Os modelos persistem entre sessões no armazenamento local. Os arquivos JSON exportados são portáteis entre navegadores e máquinas. + +## Modelo de Execução + +O mecanismo cria um grafo de dependências a partir das suas conexões e executa os nós em ordem topológica. Se algum nó falhar, a execução é interrompida e o nó com falha é marcado em vermelho. Algumas regras a ter em mente: + +- Todo fluxo de trabalho precisa de pelo menos um nó de **Entrada** e um nó de **Saída**. +- O mecanismo detecta dependências circulares e bloqueia a execução com um erro. +- O nó **Criptografar** deve ser a última etapa de processamento antes do nó de saída. Colocá-lo antes dispara um aviso de validação, pois os nós seguintes não conseguem operar com dados criptografados. +- PDFs protegidos por senha pedem a senha durante a execução. +- Entradas com vários PDFs são suportadas: o nó Mesclar pode combiná-los, ou os nós de processamento em lote processarão cada PDF individualmente. + +## Tipos de Soquete + +As conexões usam soquetes tipados para evitar ligações inválidas: + +- **PDF** (índigo): um único documento PDF. +- **MultiPDF** (âmbar): vários documentos PDF agrupados. +- **Image** (verde): um blob de imagem. + +## Opções + +Cada nó tem sua própria configuração, acessível pelo painel de configurações à direita. Alguns padrões comuns: + +- **Intervalos de páginas** nos nós Dividir, Extrair Páginas e Excluir Páginas +- **Controles de qualidade** nos nós de saída de conversão para imagem +- **Campos de senha** nos nós Criptografar e Descriptografar +- **Campos de texto** para Marca d'água, Cabeçalho e Rodapé e Editar Metadados +- **Ângulos de rotação** no nó Girar +- **Nível de compressão** no nó Comprimir +- **Seleção de idioma do OCR** no nó OCR + +## Casos de Uso + +- **Pipeline de processamento de faturas**: Entrada PDF -> OCR -> Extrair Tabelas -> Download como CSV. +- **Padronização de relatórios**: Word para PDF -> Ajustar Tamanho da Página -> Adicionar Números de Página -> Marca d'água -> Comprimir -> Download. +- **Preparação para arquivamento**: Entrada PDF -> Reparar -> Achatar -> Higienizar -> PDF para PDF/A -> Download. +- **Extração de imagens em lote**: Entrada PDF (vários arquivos) -> Extrair Imagens -> Download do ZIP. +- **Livretos prontos para impressão**: Entrada PDF -> Livreto -> Recortar -> Comprimir -> Download. +- **Distribuição segura**: Entrada PDF -> Redigir -> Remover Anotações -> Criptografar -> Download. + +## Dicas + +- Use **Delete** ou **Backspace** para remover do canvas o nó selecionado. +- Clique no botão **X** na barra de status de um nó para excluí-lo diretamente. +- Mova o canvas clicando e arrastando em um espaço vazio. O cursor muda para um ícone de mão enquanto você move. +- No celular, use o botão **+** na barra de ferramentas para alternar a caixa de nós. +- Se o fluxo de trabalho produzir vários arquivos de saída, o nó Download os agrupa automaticamente em um ZIP. +- Comece de forma simples: monte e teste um pipeline de dois nós antes de aumentar a complexidade. + +## Ferramentas Relacionadas + +- [PDF para Texto](./pdf-to-text) +- [PDF para Excel](./pdf-to-excel) +- [Extrair Imagens](./extract-images) +- [PDF para Markdown](./pdf-to-markdown) diff --git a/docs/pt/tools/png-to-pdf.md b/docs/pt/tools/png-to-pdf.md new file mode 100644 index 00000000..051cc663 --- /dev/null +++ b/docs/pt/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG para PDF +description: Converta uma ou mais imagens PNG em um documento PDF com qualidade ajustável, inteiramente no seu navegador. +--- + +# PNG para PDF + +Converta imagens PNG em PDF preservando a resolução total. Cada PNG vira uma página própria, com o tamanho igual ao das dimensões originais da imagem. A transparência é tratada automaticamente. + +## Formatos Suportados + +| Formato | Extensões | +| :------ | :-------- | +| PNG | `.png` | + +## Como Funciona + +1. Clique na área de envio ou arraste e solte arquivos PNG. Você pode selecionar vários de uma vez. +2. Gerencie a lista de arquivos: remova os indesejados ou adicione mais. +3. Escolha um nível de **Qualidade do PDF** na lista suspensa. +4. Clique em **Converter para PDF**. A saída é baixada como `from_jpgs.pdf`. + +A ferramenta usa o pdf-lib para incorporar cada imagem diretamente. Se um PNG não puder ser incorporado de forma nativa (por exemplo, por causa de um perfil de cor incomum), ele é renderizado novamente em um canvas como JPEG. + +## Opções + +A **Qualidade do PDF** controla a compressão aplicada antes da incorporação: + +- **Alta Qualidade**: compressão mínima, maior tamanho de arquivo. +- **Qualidade Média** (padrão): bom equilíbrio entre tamanho e nitidez. +- **Baixa Qualidade**: compressão máxima, menor saída. + +## Casos de Uso + +- Converter capturas de tela em um PDF de várias páginas para relatórios de bugs ou documentação +- Empacotar exportações de design de interface em um único arquivo para revisão +- Transformar exportações de diagramas (draw.io, Excalidraw) em um PDF compartilhável +- Reunir um conjunto de imagens de gráficos em um relatório + +## Dicas + +- Arquivos PNG com transparência recebem um fundo branco no PDF. Se você precisar de outro fundo, edite as imagens antes. +- Para capturas de tela e diagramas com bordas nítidas e texto, a qualidade Alta evita artefatos de compressão JPEG. Média ou Baixa podem converter para JPEG internamente. + +## Ferramentas Relacionadas + +- [Imagem para PDF](./image-to-pdf) +- [JPG para PDF](./jpg-to-pdf) +- [SVG para PDF](./svg-to-pdf) diff --git a/docs/pt/tools/posterize-pdf.md b/docs/pt/tools/posterize-pdf.md new file mode 100644 index 00000000..f118aa1d --- /dev/null +++ b/docs/pt/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Posterizar PDF +description: Divida as páginas do PDF em uma grade de páginas menores para impressão em grande formato em várias folhas. +--- + +# Posterizar PDF + +Divida cada página de um PDF em uma grade de subpáginas menores. Esta é a ferramenta para imprimir uma única página em várias folhas de papel, que você depois junta para formar um pôster ou banner grande. + +## Como funciona + +1. Envie um arquivo PDF. +2. Defina o número de **linhas** e **colunas** da grade (por exemplo, 2 linhas x 2 colunas divide cada página em 4 subpáginas). +3. Opcionalmente, informe um intervalo de páginas para limitar quais páginas serão posterizadas. +4. A tela de pré-visualização mostra uma grade sobre a página atual para você visualizar os cortes. +5. Navegue entre as páginas para conferir a grade em páginas diferentes. +6. Clique no botão de processar. Cada célula da grade vira uma página própria no PDF de saída. + +## Recursos + +- Número de linhas e colunas configurável para grades flexíveis +- Pré-visualização ao vivo com a grade mostrando exatamente onde as páginas serão divididas +- Filtro de intervalo de páginas para posterizar apenas páginas específicas +- Navegação página a página na pré-visualização +- Capturas de página em cache para navegação rápida na pré-visualização +- Linhas tracejadas vermelhas marcam claramente os limites de corte + +## Opções + +| Opção | Descrição | +| ------------------------ | --------------------------------------------------- | +| **Linhas** | Número de divisões horizontais (padrão: 1) | +| **Colunas** | Número de divisões verticais (padrão: 1) | +| **Intervalo de páginas** | Quais páginas posterizar (vazio = todas as páginas) | + +## Casos de uso + +- Imprimir um PDF do tamanho de um pôster em folhas A4 ou Carta comuns para montar na parede +- Criar banners grandes a partir de um design de uma única página +- Dividir desenhos técnicos grandes em blocos imprimíveis +- Fazer impressões em grande formato sem acesso a uma impressora de grande formato + +## Dicas + +- Uma grade 2x2 transforma uma página em 4 páginas. Uma grade 3x3 transforma uma página em 9. Planeje a grade conforme o tamanho final que você quer na montagem. +- A grade na pré-visualização ajuda a verificar se conteúdo importante não cai em uma linha de corte. Ajuste linhas/colunas se necessário. +- Para a operação inversa (colocar várias páginas em uma folha), use [PDF N-Up](./n-up-pdf). + +## Ferramentas relacionadas + +- [PDF N-Up](./n-up-pdf) +- [Dividir Páginas](./divide-pages) +- [Dividir PDF](./split-pdf) diff --git a/docs/pt/tools/powerpoint-to-pdf.md b/docs/pt/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..578d396e --- /dev/null +++ b/docs/pt/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint para PDF +description: Converta apresentações do PowerPoint (PPT, PPTX) e arquivos ODP em PDF mantendo a formatação dos slides. +--- + +# PowerPoint para PDF + +Converta arquivos de apresentação em PDF. Cada slide vira uma página no documento de saída, com texto, imagens, formas e transições renderizados por um mecanismo LibreOffice no navegador. Suporta formatos modernos e legados do PowerPoint, além do formato OpenDocument Presentation. + +## Formatos suportados + +| Formato | Extensões | +| :------------------------ | :-------- | +| PowerPoint (moderno) | `.pptx` | +| PowerPoint (legado) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Como funciona + +1. Clique na área de envio ou arraste e solte seus arquivos de apresentação. +2. Revise a lista de arquivos. Adicione mais ou remova conforme necessário. +3. Clique em **Converter para PDF**. O mecanismo LibreOffice é carregado no primeiro uso e depois converte cada arquivo. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são empacotados em `powerpoint-converted.zip`. + +## Opções + +Esta ferramenta não tem configurações adicionais. Os slides são renderizados em suas dimensões originais. + +## Saída + +| Quantidade de entrada | Saída | +| :-------------------- | :-------------------------------------------------------------- | +| 1 arquivo | Download de um único PDF (nome original com extensão `.pdf`) | +| 2+ arquivos | Arquivo ZIP (`powerpoint-converted.zip`) com um PDF por arquivo | + +## Casos de uso + +- Converter uma apresentação em PDF antes de compartilhar com um público que pode não ter o PowerPoint +- Criar uma versão imprimível de uma apresentação para uma conferência ou workshop +- Arquivar apresentações em um formato que é exibido de forma idêntica em qualquer dispositivo +- Converter em lote uma biblioteca de apresentações ODP do LibreOffice Impress em PDF +- Gerar uma versão em PDF de um pitch deck para enviar por e-mail + +## Dicas + +- Animações e transições de slides não são representadas no PDF. Cada slide é capturado como uma página estática. +- Vídeos incorporados não aparecem na saída. Substitua-os por uma captura de tela ou imagem de substituição, se necessário. +- As notas do apresentador não são incluídas na exportação padrão para PDF. Se precisar das notas, considere exportar antes pela visualização nativa "Imprimir Notas" do PowerPoint. +- O mecanismo LibreOffice fica em cache após o primeiro carregamento, então converter uma segunda apresentação na mesma sessão é muito mais rápido. + +## Ferramentas relacionadas + +- [Word para PDF](./word-to-pdf) +- [Excel para PDF](./excel-to-pdf) +- [Imagem para PDF](./image-to-pdf) diff --git a/docs/pt/tools/prepare-pdf-for-ai.md b/docs/pt/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..07d1a0e6 --- /dev/null +++ b/docs/pt/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Preparar PDF para IA +description: Extraia o conteúdo do PDF para JSON estruturado, otimizado para LLMs e pipelines de IA como o LlamaIndex. Suporta processamento em lote. +--- + +# Preparar PDF para IA + +Extrai o conteúdo de arquivos PDF e o estrutura como JSON otimizado para ingestão por modelos de linguagem (LLMs) e frameworks de IA como o LlamaIndex. O conteúdo de cada página é extraído e organizado em um formato estruturado, pronto para pipelines RAG, chatbots ou sistemas de busca semântica. + +## Como funciona + +1. Envie um ou mais PDFs clicando na área de soltar ou arrastando os arquivos para ela. +2. Clique em **Extrair** para iniciar o processamento. +3. Um único arquivo é baixado como `filename_llm.json`. Vários arquivos geram um arquivo `pdf-for-ai.zip`. + +A ferramenta usa a integração do PyMuPDF com o LlamaIndex para extrair o conteúdo por página com metadados, produzindo uma saída que pode ser carregada diretamente em frameworks de IA. + +## Opções + +Esta ferramenta não tem opções configuráveis. Todas as páginas são extraídas com texto completo e metadados. + +## Formato de saída + +- **Um arquivo**: `filename_llm.json` +- **Vários arquivos**: `pdf-for-ai.zip` contendo um `_llm.json` por PDF de entrada. + +A saída JSON segue o esquema de documento do LlamaIndex, com o texto de cada página e campos de metadados. + +## Casos de uso + +- Preparar documentos PDF para pipelines de geração aumentada por recuperação (RAG). +- Criar uma base de conhecimento pesquisável a partir de arquivos PDF para um chatbot de IA. +- Alimentar relatórios em PDF em fluxos de análise baseados em LLM. +- Pré-processar artigos científicos para busca semântica e sistemas de perguntas e respostas. +- Criar dados de treinamento estruturados a partir de coleções de documentos PDF. + +## Dicas + +- Para extração de texto simples, sem formatação específica para IA, use [PDF para Texto](./pdf-to-text). +- Para uma saída em Markdown que preserve títulos e estrutura, use [PDF para Markdown](./pdf-to-markdown). +- PDFs digitalizados produzem saída vazia ou mínima. Passe-os antes por OCR para adicionar uma camada de texto antes da extração. + +## Ferramentas relacionadas + +- [PDF para Texto](./pdf-to-text) +- [PDF para Markdown](./pdf-to-markdown) +- [PDF para JSON](./pdf-to-json) diff --git a/docs/pt/tools/protect-pdf.md b/docs/pt/tools/protect-pdf.md new file mode 100644 index 00000000..489bbd9d --- /dev/null +++ b/docs/pt/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Proteger PDF +description: Proteja arquivos PDF com senha usando criptografia AES de 256 bits. Defina senhas de usuário e de proprietário com restrições de uso configuráveis. +--- + +# Proteger PDF + +Bloqueie seu PDF com uma senha para que só pessoas autorizadas possam abri-lo. O BentoPDF usa criptografia AES de 256 bits, o mesmo padrão usado por bancos e órgãos governamentais, aplicada inteiramente no seu navegador via QPDF. + +## Como funciona + +1. Envie um arquivo PDF. +2. Digite uma **Senha de usuário** (obrigatória). É a senha que as pessoas precisarão para abrir o arquivo. +3. Opcionalmente, digite uma **Senha de proprietário**. Quando definida, o PDF ganha restrições de uso que impedem imprimir, editar, copiar e anotar. +4. Clique em **Criptografar PDF**. +5. Baixe o arquivo criptografado. + +## Tipos de senha + +### Senha de usuário (obrigatória) + +A senha de usuário é o que os destinatários digitam para abrir o PDF. Sem ela, o documento fica totalmente inacessível. Todo PDF criptografado precisa de uma. + +### Senha de proprietário (opcional) + +A senha de proprietário controla o que um usuário autorizado pode fazer depois de abrir o arquivo. Quando você define uma senha de proprietário diferente, o BentoPDF aplica automaticamente o conjunto de restrições mais rígido: + +- Modificação desativada +- Extração/cópia desativada +- Impressão desativada +- Anotação desativada +- Preenchimento de formulários desativado +- Montagem de documento desativada + +Se você deixar a senha de proprietário em branco, o PDF é criptografado (ainda exige a senha de usuário para abrir), mas não tem restrições de uso depois de aberto. + +## Detalhes da criptografia + +- **Algoritmo**: AES-256 (Advanced Encryption Standard de 256 bits) +- **Tamanho da chave**: 256 bits +- **Padrão**: criptografia PDF 2.0 (implementação do QPDF) + +Com a tecnologia atual, é computacionalmente inviável quebrar o AES-256 por força bruta. A segurança do seu PDF criptografado depende inteiramente da força da sua senha. + +## Casos de uso + +- Proteger relatórios financeiros confidenciais antes de enviá-los por e-mail +- Proteger documentos jurídicos compartilhados com a parte contrária +- Adicionar senha a prontuários médicos ou informações de identificação pessoal +- Distribuir conteúdo pago (e-books, relatórios) com controle de acesso +- Cumprir políticas de proteção de dados que exigem criptografia em repouso + +## Dicas + +- Use uma senha forte e exclusiva. Uma frase-senha de 12 ou mais caracteres com maiúsculas, minúsculas, números e símbolos é o ideal. +- Compartilhe a senha por um canal separado (telefone, mensagem de texto), nunca no mesmo e-mail do PDF. +- Se você só precisa restringir ações (sem imprimir, sem copiar) sem exigir senha para abrir, use a ferramenta Alterar Permissões. + +## Ferramentas relacionadas + +- [Descriptografar PDF](./unlock-pdf): remova a criptografia quando você souber a senha +- [Alterar Permissões](./change-permissions): modifique restrições de uso específicas +- [Remover Restrições](./remove-restrictions): remova toda a segurança de um PDF +- [Sanitizar PDF](./sanitize-pdf): remova conteúdo oculto antes de criptografar diff --git a/docs/pt/tools/psd-to-pdf.md b/docs/pt/tools/psd-to-pdf.md new file mode 100644 index 00000000..b1b0cb58 --- /dev/null +++ b/docs/pt/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD para PDF +description: Converta arquivos do Photoshop (PSD) em PDF no seu navegador. Grátis, privado, sem precisar de software da Adobe. +--- + +# PSD para PDF + +Converta arquivos PSD do Adobe Photoshop em documentos PDF. O PSD é o formato nativo do Photoshop, e abri-lo normalmente exige um software caro da Adobe. Esta ferramenta renderiza o composto achatado do seu arquivo PSD como uma página PDF em resolução total. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :-------------- | :------- | :----------------------------------- | +| Adobe Photoshop | `.psd` | Renderiza a imagem composta achatada | + +## Como funciona + +1. Clique na área de envio ou arraste e solte seus arquivos PSD. Vários arquivos são suportados. +2. Revise a lista de arquivos. Remova arquivos indesejados com o ícone de lixeira ou use **Adicionar mais arquivos** para incluir outros. +3. Clique em **Converter para PDF**. O mecanismo PyMuPDF lê o arquivo PSD e incorpora a imagem composta em uma página PDF na resolução original. +4. Um único PSD gera um PDF. Quando você envia vários arquivos PSD, eles são combinados em um único PDF de várias páginas chamado `psd_to_pdf.pdf`, com cada PSD virando uma página. + +## Opções + +Nenhuma configuração é necessária. O conversor usa os dados da imagem achatada do arquivo PSD. + +## Casos de uso + +- Visualizar designs do Photoshop sem abrir o Photoshop +- Enviar provas de design a clientes que não têm o Adobe Creative Suite +- Imprimir artes em alta resolução a partir de arquivos PSD +- Criar um portfólio em PDF a partir de vários arquivos de design PSD: cada um vira uma página em um único documento + +## Dicas + +- A conversão renderiza a visualização composta (achatada) do PSD. Camadas individuais, camadas de ajuste e efeitos de camada não são preservados como elementos separados no PDF. +- Vários arquivos PSD são mesclados em um PDF de várias páginas, em vez de PDFs individuais. Isso é útil para montar portfólios ou lookbooks. +- Arquivos PSD de resolução muito alta (arquivos de impressão de 300+ DPI) geram PDFs grandes. A ferramenta preserva a resolução total. + +## Ferramentas relacionadas + +- [Imagem para PDF](./image-to-pdf) +- [PNG para PDF](./png-to-pdf) +- [VSD para PDF](./vsd-to-pdf) diff --git a/docs/pt/tools/pub-to-pdf.md b/docs/pt/tools/pub-to-pdf.md new file mode 100644 index 00000000..5648a02c --- /dev/null +++ b/docs/pt/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB para PDF +description: Converta arquivos do Microsoft Publisher (PUB) em PDF no seu navegador. Grátis, privado, sem precisar de software. +--- + +# PUB para PDF + +Converta arquivos do Microsoft Publisher em PDF. O Publisher é uma ferramenta de editoração eletrônica incluída em algumas edições do Microsoft Office, mas a maioria das pessoas não o tem instalado. Esta ferramenta permite que qualquer pessoa converta arquivos PUB em PDF direto no navegador, sem nenhum software da Microsoft. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :------------------ | :------- | :---------------------------------- | +| Microsoft Publisher | `.pub` | Documentos de editoração eletrônica | + +## Como funciona + +1. Clique na área de envio ou arraste e solte seus arquivos PUB. Vários arquivos podem ser enviados de uma vez. +2. Revise a lista de arquivos. Remova arquivos indesejados com o ícone de lixeira ou clique em **Adicionar mais arquivos** para incluir outros. +3. Clique em **Converter para PDF**. Um mecanismo baseado em LibreOffice é carregado no navegador e converte cada arquivo PUB, preservando layout, imagens e caixas de texto. +4. Um arquivo é baixado diretamente como PDF. Vários arquivos são entregues em um arquivo ZIP chamado `pub-to-pdf.zip`. + +## Opções + +Nenhuma configuração adicional é necessária. O conversor cuida do mecanismo de layout do PUB automaticamente. + +## Casos de uso + +- Abrir um folheto ou boletim em PUB de um cliente sem comprar o Microsoft Publisher +- Converter boletins de igrejas, programas de eventos ou jornais escolares criados no Publisher +- Arquivar materiais de marketing do Publisher em um formato acessível a todos +- Imprimir arquivos PUB em um sistema que não tem o Publisher instalado + +## Dicas + +- Layouts complexos do Publisher, com caixas de texto sobrepostas e posicionamento preciso, podem se deslocar um pouco durante a conversão. Revise a saída se o posicionamento exato for crítico. +- O mecanismo LibreOffice é inicializado uma vez por sessão. A primeira conversão demora mais; as seguintes são mais rápidas. +- Para uma conversão mais fiel de arquivos do Publisher, garanta que as fontes personalizadas usadas no original sejam fontes padrão do sistema. + +## Ferramentas relacionadas + +- [VSD para PDF](./vsd-to-pdf) +- [ODP para PDF](./odp-to-pdf) diff --git a/docs/pt/tools/rasterize-pdf.md b/docs/pt/tools/rasterize-pdf.md new file mode 100644 index 00000000..4d05318c --- /dev/null +++ b/docs/pt/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasterizar PDF +description: Converta páginas de PDF em PDF baseado em imagem. Achate todas as camadas, remova texto selecionável e controle o DPI e o formato da imagem. +--- + +# Rasterizar PDF + +A rasterização converte cada página de um PDF em uma imagem e remonta essas imagens em um PDF. O resultado é idêntico ao original, mas não tem texto selecionável, elementos interativos nem camadas editáveis. É, na prática, uma fotocópia de alta qualidade. + +## Como funciona + +1. Envie um ou mais arquivos PDF. +2. Defina o **DPI** (resolução) da saída rasterizada. +3. Escolha um **Formato da imagem**: PNG para qualidade sem perdas ou JPEG para arquivos menores. +4. Opcionalmente, marque **Converter para tons de cinza**. +5. Clique em **Rasterizar PDF**. Vários arquivos são baixados em um ZIP. + +## Opções + +| Configuração | Valores | Padrão | +| --------------------- | ------------------------------ | --------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Formato da imagem** | PNG (sem perdas), JPEG (menor) | PNG | +| **Tons de cinza** | Ligado/Desligado | Desligado | + +## Orientações de DPI + +- **72**: apenas visualização em tela, menor tamanho de arquivo +- **150**: bom equilíbrio para uso geral +- **200**: texto mais nítido, tamanho de arquivo moderado +- **300**: saída com qualidade de impressão +- **600**: arquivamento de alta qualidade ou impressão profissional + +## Casos de uso + +- Impedir a extração de texto de documentos confidenciais antes de compartilhar +- Eliminar problemas de dependência de fontes convertendo o texto em pixels +- Criar uma versão "plana" de um PDF com camadas complexas ou transparência que é exibida de forma diferente em cada leitor +- Preparar um PDF para um sistema que só aceita entrada baseada em imagem +- Remover conteúdo oculto (como alterações controladas ou dados de formulário) reduzindo o PDF a imagens puras + +## Dicas + +- 150 DPI em PNG é um bom padrão. Só aumente se precisar de saída para impressão ou de zoom em detalhes finos. +- O JPEG produz arquivos visivelmente menores, mas introduz artefatos de compressão nas bordas nítidas do texto. +- A rasterização é irreversível: guarde o PDF original caso precise de texto editável depois. + +## Ferramentas relacionadas + +- [Comprimir PDF](./compress-pdf): reduza o tamanho do PDF rasterizado +- [Desinclinar PDF](./deskew-pdf): endireite as páginas antes de rasterizar documentos digitalizados +- [Fonte para Contorno](./font-to-outline): converta fontes em caminhos vetoriais se quiser manter a escalabilidade +- [Achatar PDF (Flatten)](./flatten-pdf): achate formulários sem converter em imagens diff --git a/docs/pt/tools/remove-annotations.md b/docs/pt/tools/remove-annotations.md new file mode 100644 index 00000000..2c1efb37 --- /dev/null +++ b/docs/pt/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Remover anotações +description: Remova todos os comentários, destaques, links e outras anotações do seu PDF com um clique. +--- + +# Remover anotações + +Limpe seu PDF removendo todas as anotações: comentários, destaques, notas adesivas, marcações de texto, links, carimbos e qualquer outro objeto de anotação incorporado ao documento. O conteúdo da página (texto, imagens, gráficos) permanece intacto. + +## Como funciona + +1. Envie seu arquivo PDF. +2. A ferramenta detecta o número de páginas do documento e exibe as informações do arquivo. +3. Clique em **Remover Anotações** para processar. +4. O PDF limpo é baixado automaticamente, sem nenhuma anotação. + +## Recursos + +- Remove todos os tipos de anotação: comentários, destaques, sublinhados, tachados, notas adesivas, carimbos, links e marcações de formulário +- Atua em todas as páginas do documento +- Preserva todo o conteúdo que não é anotação (texto, imagens, gráficos vetoriais, campos de formulário) +- Exibe a contagem de páginas e o tamanho do arquivo antes de processar + +## Casos de uso + +- Limpar um documento antes da distribuição final, depois de uma rodada de revisão em que vários revisores adicionaram comentários +- Remover destaques e notas adesivas de um material de estudo compartilhado +- Remover anotações de link de um documento antes de arquivá-lo +- Preparar uma versão "limpa" de um documento jurídico muito anotado durante a negociação +- Remover comentários de revisores de um manuscrito antes de enviá-lo para impressão + +## Dicas + +- Esta ferramenta remove as anotações no nível da estrutura do PDF, então o resultado mantém o texto selecionável e a qualidade original, sem rasterização. +- Se você quiser remover apenas anotações específicas, e não todas, use o [Editor de PDF](./edit-pdf) para excluir anotações individualmente. +- Anotações em PDFs achatados (em que as anotações foram mescladas ao conteúdo da página) não podem ser removidas, pois deixaram de ser objetos separados. + +## Ferramentas relacionadas + +- [Editor de PDF](./edit-pdf) +- [Adicionar Marca d'Água](./add-watermark) +- [Assinar PDF](./sign-pdf) diff --git a/docs/pt/tools/remove-blank-pages.md b/docs/pt/tools/remove-blank-pages.md new file mode 100644 index 00000000..a079d0ac --- /dev/null +++ b/docs/pt/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Remover páginas em branco +description: Detecte e remova automaticamente páginas em branco ou quase em branco do seu PDF, com sensibilidade ajustável. +--- + +# Remover páginas em branco + +Analise seu PDF em busca de páginas em branco ou quase em branco e remova-as automaticamente. A ferramenta renderiza cada página e analisa o conteúdo dos pixels para determinar se está em branco, e depois deixa você confirmar quais páginas remover antes de processar. + +## Como funciona + +1. Envie seu arquivo PDF. +2. Ajuste o controle deslizante de **Sensibilidade** para definir o rigor com que "em branco" é definido. +3. Clique em **Detectar Páginas em Branco** para analisar o documento. +4. A ferramenta mostra miniaturas das páginas em branco detectadas para você revisar. +5. Confirme a seleção e baixe o PDF limpo, sem as páginas em branco. + +## Opções + +- **Sensibilidade**: um controle deslizante de 0% a 100% (padrão 80%). Valores mais altos são mais rigorosos e só marcam páginas completamente ou quase brancas. Valores mais baixos são mais permissivos e pegam páginas com conteúdo mínimo, como um único ponto ou uma marca d'água discreta. + +## Recursos + +- Análise em nível de pixel de cada página para detectar conteúdo em branco +- Controle deslizante de sensibilidade ajustável para refinar a detecção +- Pré-visualização em miniatura das páginas em branco detectadas para verificação manual +- Preserva todas as páginas que não estão em branco exatamente como estão +- Lida com documentos de qualquer tamanho ou número de páginas +- Indicação de progresso durante a análise + +## Casos de uso + +- Limpar documentos digitalizados em que o scanner capturou versos vazios de originais de face única +- Remover páginas separadoras de lotes de documentos digitalizados em massa +- Remover páginas em branco inseridas por sistemas de gerenciamento de documentos +- Limpar PDFs exportados de processadores de texto que às vezes incluem páginas em branco no final +- Reduzir o tamanho do arquivo removendo páginas vazias desnecessárias + +## Dicas + +- Comece com a sensibilidade padrão de 80% e ajuste a partir daí. Se a ferramenta deixar passar páginas que parecem em branco para você, diminua a sensibilidade. Se ela marcar páginas com conteúdo leve que você quer manter, aumente. +- A ferramenta renderiza cada página para analisar o conteúdo, então o tempo de processamento cresce com o número de páginas. Em documentos muito grandes, espere uma pequena espera. +- Revise as páginas em branco detectadas na pré-visualização em miniatura antes de confirmar a remoção. Páginas com cabeçalhos, rodapés ou marcas d'água discretos podem ser marcadas, dependendo da sensibilidade. + +## Ferramentas relacionadas + +- [Cortar PDF](./crop-pdf) +- [Editor de PDF](./edit-pdf) +- [Números de Página](./page-numbers) diff --git a/docs/pt/tools/remove-metadata.md b/docs/pt/tools/remove-metadata.md new file mode 100644 index 00000000..70ef86a5 --- /dev/null +++ b/docs/pt/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Remover metadados +description: Remova todos os metadados ocultos de arquivos PDF, incluindo autor, título, data de criação, produtor, dados XMP e IDs do documento. +--- + +# Remover metadados + +Todo PDF carrega metadados que podem revelar quem o criou, qual software foi usado, quando foi modificado pela última vez e mais. Esta ferramenta remove tudo isso (o dicionário de informações, os fluxos de metadados XMP, os IDs do documento e os dados específicos de aplicativos), deixando um documento limpo, sem nenhum rastro de sua origem. + +## Como funciona + +1. Envie um arquivo PDF. +2. Clique em **Remover Metadados**. +3. Baixe o arquivo limpo. + +Não há opções para configurar. A ferramenta é completa por design: ela limpa tudo. + +## O que é removido + +- **Campos do dicionário de informações**: Título, Autor, Assunto, Palavras-chave, Criador, Produtor, data de criação, data de modificação +- **Fluxo de metadados XMP**: o bloco de metadados baseado em XML armazenado no catálogo do documento +- **IDs do documento**: identificadores exclusivos no trailer do PDF que podem ser usados para rastrear um documento entre sistemas +- **PieceInfo**: metadados específicos de aplicativos adicionados por programas como Illustrator ou InDesign + +## O que permanece + +- Todo o conteúdo visível da página (texto, imagens, gráficos) +- Campos de formulário e anotações +- Favoritos e links +- A própria estrutura do documento + +## Casos de uso + +- Remover seu nome e sua organização de um documento antes de publicá-lo anonimamente +- Remover carimbos de data de criação que revelam quando um documento foi preparado +- Limpar strings de produtor que identificam o software de PDF que você usa +- Preparar documentos para envios regulatórios que exigem PDFs sem metadados +- Remover rastros do histórico de edição antes de compartilhar um documento externamente + +## Dicas + +- Use primeiro a ferramenta Ver Metadados para ver exatamente quais metadados seu PDF contém antes de removê-los. +- Se você precisa remover metadados _e_ JavaScript, anotações e arquivos incorporados, use Sanitizar PDF para uma limpeza mais completa. +- A remoção de metadados é permanente. Guarde o original caso precise desses dados depois. + +## Ferramentas relacionadas + +- [Sanitizar PDF](./sanitize-pdf): remova metadados, além de scripts, anexos e mais +- [Criptografar PDF](./protect-pdf): proteja o PDF limpo com uma senha +- [Comprimir PDF](./compress-pdf): remover metadados pode reduzir levemente o tamanho do arquivo; comprima para economizar mais diff --git a/docs/pt/tools/remove-restrictions.md b/docs/pt/tools/remove-restrictions.md new file mode 100644 index 00000000..91f69428 --- /dev/null +++ b/docs/pt/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Remover restrições +description: Remova a proteção por senha, restrições de impressão, bloqueios de edição e limites de cópia de arquivos PDF. +--- + +# Remover restrições + +Os PDFs podem ter dois tipos de senha: uma senha de usuário (necessária para abrir o arquivo) e uma senha de proprietário (controla o que você pode fazer com ele). Esta ferramenta remove ambas, junto com todas as restrições associadas: bloqueios de impressão, edição, cópia e anotação. + +## Como funciona + +1. Envie um arquivo PDF. +2. Se o PDF tiver uma senha de proprietário, digite-a no campo **Senha de proprietário**. Deixe em branco se o PDF tiver apenas restrições de uso sem senha. +3. Clique em **Remover Restrições**. +4. Baixe o PDF sem restrições. + +A ferramenta usa as flags `--decrypt` e `--remove-restrictions` do QPDF para produzir uma cópia limpa e sem restrições. + +## O que é removido + +- Proteção por senha (senhas de usuário e de proprietário) +- Restrições de impressão +- Restrições de edição +- Restrições de cópia de texto e imagens +- Restrições de anotação e comentários +- Todas as outras limitações de segurança codificadas no PDF + +## Casos de uso + +- Desbloquear um PDF seu cuja senha você definiu anos atrás +- Remover restrições de impressão de um documento ao qual você tem acesso legítimo +- Permitir copiar e colar em materiais de referência para anotações +- Preparar PDFs para ferramentas de acessibilidade que não lidam com documentos restritos + +## Dicas + +- Você precisa saber a senha de proprietário, se houver uma. Esta ferramenta não quebra nem tenta adivinhar senhas por força bruta. +- Se você precisa manter o arquivo criptografado, mas alterar permissões específicas, use a ferramenta Alterar Permissões. +- O arquivo de saída não tem nenhuma criptografia: qualquer pessoa que o receber pode abri-lo livremente. + +## Ferramentas relacionadas + +- [Descriptografar PDF](./unlock-pdf): desbloqueie um PDF quando você souber a senha de usuário +- [Criptografar PDF](./protect-pdf): aplique a criptografia novamente com novas configurações +- [Alterar Permissões](./change-permissions): modifique seletivamente quais ações são permitidas diff --git a/docs/pt/tools/repair-pdf.md b/docs/pt/tools/repair-pdf.md new file mode 100644 index 00000000..b529b9e5 --- /dev/null +++ b/docs/pt/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Reparar PDF +description: Recupere dados de arquivos PDF corrompidos ou danificados usando o mecanismo de reparo do QPDF. Suporta processamento em lote. +--- + +# Reparar PDF + +Quando um PDF se recusa a abrir, exibe conteúdo embaralhado ou gera erros no seu leitor, esta ferramenta tenta reconstruir sua estrutura interna. Ela usa o mecanismo de reparo do QPDF, que consegue recuperar dados de muitos tipos de corrupção: tabelas de referência cruzada quebradas, fluxos truncados, referências de objeto inválidas e mais. + +## Como funciona + +1. Envie um ou mais arquivos PDF danificados. +2. Clique em **Reparar PDF**. +3. Um único arquivo reparado é baixado diretamente. Vários arquivos geram um arquivo ZIP. + +A ferramenta passa cada arquivo pelo QPDF com a flag `--decrypt`, que força o QPDF a ler e reescrever toda a estrutura do PDF, corrigindo no caminho os problemas recuperáveis. + +## Recursos + +- Reparo em lote de vários PDFs em uma única operação +- Detecção automática de arquivos recuperáveis e irrecuperáveis +- Relatório de sucesso/falha por arquivo ao processar vários arquivos +- Usa o QPDF (WebAssembly), uma biblioteca de transformação de PDF testada em campo + +## O que ela pode corrigir + +- Tabelas de referência cruzada quebradas ou ausentes +- Finais de arquivo truncados por downloads incompletos +- Numeração de objetos e comprimentos de fluxo inválidos +- Pequenas inconsistências estruturais de geradores de PDF com bugs +- Artefatos de criptografia de tentativas de descriptografia que falharam + +## O que ela não pode corrigir + +- Arquivos muito truncados, em que a maior parte dos dados de conteúdo está ausente +- PDFs criptografados com uma senha que você não tem +- Arquivos que na verdade não são PDFs (extensão de arquivo errada) +- Corrupção de imagem dentro do PDF (a estrutura é corrigida, mas os dados de pixels não são regenerados) + +## Casos de uso + +- Recuperar um PDF de um download de e-mail que falhou +- Abrir arquivos produzidos por geradores de PDF legados ou fora do padrão +- Corrigir PDFs que funcionam em um leitor, mas não em outro +- Preparar documentos de arquivo danificados para armazenamento de longo prazo + +## Dicas + +- Se o reparo falhar, tente abrir o arquivo primeiro em um navegador: os navegadores têm sua própria lógica de recuperação e podem renderizar conteúdo suficiente para salvá-lo de novo. +- Para PDFs criptografados em que o reparo falha, tente primeiro Descriptografar PDF e depois repare a saída descriptografada. + +## Ferramentas relacionadas + +- [Comprimir PDF](./compress-pdf): limpe ainda mais a estrutura do PDF reparado +- [Linearizar PDF](./linearize-pdf): otimize o arquivo reparado para entrega na web +- [Achatar PDF (Flatten)](./flatten-pdf): achate formulários que possam ter sido danificados diff --git a/docs/pt/tools/reverse-pages.md b/docs/pt/tools/reverse-pages.md new file mode 100644 index 00000000..21c2fccb --- /dev/null +++ b/docs/pt/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Inverter ordem das páginas +description: Inverta a ordem das páginas de um ou mais arquivos PDF para que a última página se torne a primeira. +--- + +# Inverter ordem das páginas + +Inverta a ordem das páginas de um PDF para que a última página se torne a primeira, a penúltima se torne a segunda, e assim por diante. Suporta o processamento em lote de vários arquivos de uma vez. + +## Como funciona + +1. Envie um ou mais arquivos PDF. +2. Clique no botão de processar. +3. Cada arquivo é invertido de forma independente. Se você enviou vários arquivos, a saída é um arquivo ZIP com todos os PDFs invertidos. +4. Um único arquivo é baixado diretamente como PDF invertido. + +## Recursos + +- Processamento em lote: inverta vários PDFs em uma única operação +- Saída de um único arquivo para um PDF, saída em ZIP para vários +- Botões de remoção por arquivo antes de processar +- Preserva todo o conteúdo e a formatação das páginas + +## Casos de uso + +- Corrigir um documento que foi digitalizado em ordem inversa +- Preparar um PDF de apresentação para ser lido de trás para frente +- Inverter a ordem das páginas em fluxos de impressão específicos que alimentam as páginas ao contrário +- Corrigir um documento cujas páginas foram montadas ao contrário por engano + +## Dicas + +- Cada arquivo de um lote é invertido de forma independente: os arquivos em si não são reordenados entre si. +- Para uma reordenação de páginas mais detalhada (não apenas uma inversão completa), use [Duplicar e Organizar](./organize-pdf). + +## Ferramentas relacionadas + +- [Duplicar e Organizar](./organize-pdf) +- [Girar PDF](./rotate-pdf) +- [Multiferramenta PDF](./pdf-multi-tool) diff --git a/docs/pt/tools/rotate-custom.md b/docs/pt/tools/rotate-custom.md new file mode 100644 index 00000000..f0188caa --- /dev/null +++ b/docs/pt/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Girar em graus personalizados +description: Rotacione páginas de PDF em qualquer ângulo, com campos de graus por página e controles de rotação em lote. +--- + +# Girar em graus personalizados + +Rotacione páginas de PDF em qualquer ângulo, não apenas em múltiplos de 90 graus. Cada página tem seu próprio campo de ângulo, e você pode aplicar um único ângulo a todas as páginas de uma vez com o controle em lote. + +## Como funciona + +1. Envie um arquivo PDF. As miniaturas são renderizadas para cada página. +2. Cada página tem um campo numérico que mostra seu ângulo de rotação atual. +3. Digite qualquer valor em graus (positivo ou negativo) para rotacionar uma página específica, ou use os botões esquerda/direita de cada página para ajustes rápidos de 90 graus. +4. Use o campo de **ângulo em lote** no topo para definir uma rotação uniforme para todas as páginas. +5. Clique no botão de processar para gerar o PDF rotacionado. + +## Recursos + +- Entrada livre de graus por página (qualquer valor inteiro) +- Controle de ângulo em lote para definir a mesma rotação em todas as páginas +- Pré-visualização da rotação em tempo real nas miniaturas +- Botões de rotação rápida por página em incrementos de 90 graus +- Miniaturas carregadas sob demanda para desempenho em documentos grandes + +## Casos de uso + +- Corrigir digitalizações levemente inclinadas em alguns graus +- Rotacionar páginas para atender a um requisito de orientação fora do padrão +- Aplicar rotações precisas a páginas individuais em um documento de conteúdo misto +- Ajustar os ângulos das páginas após uma rotação em massa inicial + +## Dicas + +- Valores positivos rotacionam no sentido horário, valores negativos rotacionam no sentido anti-horário. +- O campo de ângulo em lote sobrescreve todos os ângulos por página quando aplicado. Faça os ajustes individuais depois da operação em lote, se necessário. +- Para rotações padrão de 90/180/270 graus com uma interface mais simples, use [Girar PDF](./rotate-pdf). + +## Ferramentas relacionadas + +- [Girar PDF](./rotate-pdf) +- [Multiferramenta PDF](./pdf-multi-tool) +- [Duplicar e Organizar](./organize-pdf) diff --git a/docs/pt/tools/rotate-pdf.md b/docs/pt/tools/rotate-pdf.md new file mode 100644 index 00000000..2c6a14f7 --- /dev/null +++ b/docs/pt/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Girar PDF +description: Gire páginas individuais ou todas as páginas de um PDF em incrementos de 90 graus com uma interface visual de miniaturas. +--- + +# Girar PDF + +Gire as páginas de um PDF em 90 graus no sentido horário ou anti-horário. A ferramenta mostra miniaturas de todas as páginas, permitindo girá-las individualmente ou aplicar uma rotação em massa a todo o documento. + +## Como funciona + +1. Envie um arquivo PDF. As miniaturas de todas as páginas são renderizadas em uma grade. +2. Use os botões de rotação esquerda/direita abaixo da miniatura de cada página para girar aquela página específica. +3. Use os controles de rotação em massa no topo para girar todas as páginas de uma vez. +4. A pré-visualização das miniaturas é atualizada em tempo real para mostrar a rotação. +5. Clique no botão de processar para salvar o PDF girado. + +## Recursos + +- Rotação por página em incrementos de 90 graus (esquerda ou direita) +- Rotação em massa de todas as páginas simultaneamente +- Pré-visualização das miniaturas em tempo real com transições de rotação animadas +- Miniaturas carregadas sob demanda para um desempenho fluido em documentos grandes +- Preserva o conteúdo e a qualidade originais das páginas + +## Casos de uso + +- Corrigir páginas digitalizadas de lado ou de cabeça para baixo +- Girar páginas em paisagem para retrato (ou vice-versa) +- Corrigir um documento de orientação mista em que algumas páginas foram digitalizadas no ângulo errado +- Preparar um documento para uma orientação de exibição específica + +## Dicas + +- As rotações são cumulativas. Clicar duas vezes no botão horário aplica uma rotação de 180 graus. +- Para rotações que não sejam de 90 graus (por exemplo, 45 graus para corrigir uma digitalização levemente inclinada), use [Rotacionar em Graus Customizáveis](./rotate-custom). +- Os controles de rotação em massa afetam todas as páginas, não apenas as selecionadas. Não há mecanismo de seleção nesta ferramenta; para isso, use a [Multiferramenta PDF](./pdf-multi-tool). + +## Ferramentas relacionadas + +- [Rotacionar em Graus Customizáveis](./rotate-custom) +- [Multiferramenta PDF](./pdf-multi-tool) +- [Duplicar e Organizar](./organize-pdf) diff --git a/docs/pt/tools/rtf-to-pdf.md b/docs/pt/tools/rtf-to-pdf.md new file mode 100644 index 00000000..dc7f50e4 --- /dev/null +++ b/docs/pt/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF para PDF +description: Converta arquivos Rich Text Format (RTF) em PDF no seu navegador usando um mecanismo baseado em LibreOffice. +--- + +# RTF para PDF + +Converta documentos Rich Text Format em PDF. O RTF é um formato de documento multiplataforma suportado por praticamente todo processador de texto. Esta ferramenta usa um mecanismo LibreOffice no navegador para renderizar arquivos RTF com a formatação intacta: negrito, itálico, tabelas e imagens incorporadas são todos mantidos no PDF. + +## Formatos suportados + +| Formato | Extensões | Tipos MIME | +| :------ | :-------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Como funciona + +1. Clique na área de envio ou arraste e solte um ou mais arquivos RTF. +2. Revise a lista de arquivos. Adicione mais ou remova conforme necessário. +3. Clique em **Converter para PDF**. O mecanismo LibreOffice é inicializado no primeiro uso e depois processa cada arquivo. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são entregues como `rtf-converted.zip`. + +## Opções + +Esta ferramenta não tem configurações adicionais. A conversão preserva a formatação original do RTF. + +## Saída + +| Quantidade de entrada | Saída | +| :-------------------- | :------------------------------------------------------- | +| 1 arquivo | Download de um único PDF (por exemplo, `letter.pdf`) | +| 2+ arquivos | Arquivo ZIP (`rtf-converted.zip`) com um PDF por arquivo | + +## Casos de uso + +- Converter documentos RTF legados de processadores de texto antigos em PDFs modernos +- Transformar modelos de e-mail em RTF em pré-visualizações em PDF +- Processar saídas em RTF de sistemas de software jurídicos ou médicos +- Converter em lote arquivos RTF de um sistema de gerenciamento de documentos em PDF para arquivamento + +## Dicas + +- O mecanismo LibreOffice é carregado uma vez e fica em cache. A primeira conversão em uma sessão leva alguns segundos a mais; as seguintes são mais rápidas. +- Arquivos RTF com objetos OLE incorporados podem não renderizar todos os objetos perfeitamente. Texto simples, imagens e formatação padrão são convertidos de forma confiável. +- Se seus arquivos RTF foram criados pelo Microsoft Word, você também pode convertê-los diretamente com a ferramenta [Word para PDF](./word-to-pdf), que aceita RTF junto com DOC e DOCX. + +## Ferramentas relacionadas + +- [Word para PDF](./word-to-pdf) +- [ODT para PDF](./odt-to-pdf) +- [Texto para PDF](./txt-to-pdf) diff --git a/docs/pt/tools/sanitize-pdf.md b/docs/pt/tools/sanitize-pdf.md new file mode 100644 index 00000000..f55b62e0 --- /dev/null +++ b/docs/pt/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Sanitizar PDF +description: Remova conteúdo oculto e potencialmente perigoso de PDFs, incluindo metadados, JavaScript, arquivos incorporados, anotações e camadas. +--- + +# Sanitizar PDF + +Os PDFs podem carregar muito mais do que você vê na tela. Metadados ocultos, JavaScript incorporado, anexos, dados de formulário e informações de camadas podem vazar dados sensíveis ou representar riscos de segurança. A sanitização remove tudo isso, deixando você com um documento limpo e seguro para compartilhar publicamente. + +## Como funciona + +1. Envie um arquivo PDF. +2. Selecione na lista quais elementos remover. +3. Clique em **Sanitizar PDF**. +4. Baixe o arquivo limpo. + +## Opções de sanitização + +Todas as opções vêm ativadas por padrão. Desmarque as que você quiser preservar. + +| Opção | O que remove | +| --------------------------------- | -------------------------------------------------------------------------- | +| **Achatar Formulários** | Converte campos de formulário interativos em conteúdo estático | +| **Remover Metadados** | Remove autor, título, data de criação, informações do software e dados XMP | +| **Remover Anotações** | Exclui comentários, destaques, notas adesivas e marcações | +| **Remover JavaScript** | Elimina scripts incorporados que poderiam ser executados ao abrir | +| **Remover Arquivos Incorporados** | Remove anexos incorporados ao PDF | +| **Remover Camadas (OCG)** | Achata os grupos de conteúdo opcional em uma única camada | +| **Remover Links** | Remove hiperlinks e referências de URL | +| **Remover Árvore de Estrutura** | Remove a estrutura do documento usada para marcação de acessibilidade | +| **Remover MarkInfo** | Remove as informações de conteúdo marcado | +| **Remover Fontes** | Remove os dados de fontes incorporadas (use com cuidado) | + +## Casos de uso + +- Preparar um PDF para publicação removendo metadados internos (nomes de autores, versões de software, histórico de edição) +- Remover JavaScript de um PDF recebido de uma fonte não confiável antes de abri-lo +- Limpar um PDF antes de enviá-lo a um cliente que não deve ver comentários incorporados ou nomes de campos de formulário +- Remover camadas ocultas de um desenho arquitetônico antes de compartilhar a versão final +- Cumprir requisitos de minimização de dados previstos em regulamentos de privacidade + +## Dicas + +- Deixe "Remover Fontes" desmarcado, a menos que você tenha certeza de que o PDF ainda será exibido corretamente. Remover fontes pode tornar o texto invisível em alguns leitores. +- Se você só precisa remover metadados, a ferramenta dedicada Remover Metadados é mais rápida e mais focada. +- A sanitização é irreversível. Guarde seu arquivo original. + +## Ferramentas relacionadas + +- [Remover Metadados](./remove-metadata): remova apenas os metadados sem mexer no restante do conteúdo +- [Achatar PDF (Flatten)](./flatten-pdf): achate especificamente formulários e anotações +- [Criptografar PDF](./protect-pdf): adicione proteção por senha depois de sanitizar +- [Rasterizar PDF](./rasterize-pdf): a opção radical, converter em imagens para eliminar todo o conteúdo oculto diff --git a/docs/pt/tools/scanner-effect.md b/docs/pt/tools/scanner-effect.md new file mode 100644 index 00000000..35c2b7ef --- /dev/null +++ b/docs/pt/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Efeito scanner +description: Faça seu PDF parecer um documento digitalizado, com efeitos ajustáveis de ruído, rotação, desfoque e envelhecimento do papel. +--- + +# Efeito scanner + +Transforme um PDF digital limpo em algo que parece ter saído de um scanner de mesa. A ferramenta aplica ruído configurável, leve rotação, desfoque, variações de brilho e amarelamento opcional para simular as imperfeições de uma digitalização física. + +## Como funciona + +1. Envie seu arquivo PDF. +2. O editor abre com uma pré-visualização ao vivo da primeira página ao lado de um painel de configurações. +3. Ajuste os parâmetros do efeito de digitalização com os controles deslizantes e as chaves. +4. A pré-visualização é atualizada em tempo real conforme você altera as configurações. +5. Clique em **Aplicar** para processar todas as páginas e baixar o resultado. + +## Opções + +- **Espaço de cor (chave de tons de cinza)**: converta a saída para tons de cinza para o visual clássico de digitalização em preto e branco. +- **Borda**: adicione uma borda escura sutil nas bordas da página para imitar os artefatos de borda do scanner. +- **Rotação**: aplique uma leve rotação (-5 a +5 graus) para simular a alimentação desalinhada do papel. +- **Variação da rotação**: adicione variação aleatória ao ângulo de rotação para que cada página se incline de forma um pouco diferente. +- **Brilho**: aumente ou diminua o brilho geral. +- **Contraste**: ajuste o contraste para simular variações na qualidade do toner. +- **Desfoque**: aplique desfoque gaussiano para suavizar as bordas do texto como em uma digitalização de baixa qualidade. +- **Ruído**: adicione ruído aleatório de pixels para simular o granulado do sensor do scanner. Valores mais altos produzem resultados mais granulados. +- **Amarelado**: adicione um tom amarelo quente para simular papel envelhecido ou reciclado. +- **Resolução**: defina o DPI de saída. Valores mais baixos criam uma aparência mais pixelada, típica de digitalização. +- **Redefinir**: restaure todas as configurações para os valores padrão. + +## Recursos + +- Pré-visualização em tempo real que é atualizada conforme você ajusta cada parâmetro +- Variação aleatória de rotação por página para uma variação realista +- Dez parâmetros ajustáveis de forma independente +- Modo tons de cinza para uma saída autêntica de digitalização em preto e branco +- Controle de resolução, da qualidade de fax de baixo DPI à qualidade de arquivo de alto DPI + +## Casos de uso + +- Fazer documentos criados digitalmente parecerem ter sido impressos e digitalizados +- Simular o envelhecimento de documentos físicos para recriação de documentos históricos +- Testar softwares de OCR contra digitalizações de qualidade degradada +- Produzir documentos que combinem com o estilo visual de arquivos digitalizados existentes + +## Dicas + +- Comece com valores sutis. Um nível de ruído de 10-20, uma leve rotação de 0,5 grau e desfoque mínimo já produzem uma aparência convincente de digitalização. +- Combine o modo tons de cinza com um leve amarelamento para um efeito de "fotocópia de uma fotocópia". +- Resoluções mais baixas (100-150 DPI) criam a aparência mais realista de máquina de fax. + +## Ferramentas relacionadas + +- [Inverter Cores](./invert-colors) +- [Ajustar Cores](./adjust-colors) +- [Cor de Fundo](./background-color) diff --git a/docs/pt/tools/sign-pdf.md b/docs/pt/tools/sign-pdf.md new file mode 100644 index 00000000..681d0e00 --- /dev/null +++ b/docs/pt/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Assinar PDF +description: Desenhe, digite ou envie uma assinatura e posicione-a nas páginas do seu PDF com um visualizador integrado. +--- + +# Assinar PDF + +Adicione sua assinatura a qualquer documento PDF. A ferramenta incorpora um visualizador de PDF completo com ferramentas de assinatura integradas, onde você pode desenhar uma assinatura à mão livre, digitar seu nome em uma fonte de assinatura ou enviar uma imagem de assinatura. Posicione e redimensione as assinaturas em qualquer página e depois salve o documento assinado. + +## Como funciona + +1. Envie seu arquivo PDF. +2. O documento abre em um visualizador de PDF integrado com ferramentas de anotação. +3. Use a ferramenta de assinatura do visualizador para criar sua assinatura desenhando, digitando ou enviando uma imagem. +4. Clique na página onde quer posicionar a assinatura e ajuste o tamanho e a posição. +5. Opcionalmente, marque **Achatar PDF** para incorporar a assinatura de forma permanente ao documento. +6. Clique em **Salvar e baixar PDF assinado** para obter seu arquivo assinado. + +## Opções + +- **Achatar PDF**: quando marcada, a assinatura é incorporada de forma permanente ao conteúdo da página. Isso impede que a assinatura seja movida ou excluída por outras pessoas. Quando desmarcada, a assinatura continua sendo uma anotação que pode ser editada em visualizadores compatíveis. + +## Recursos + +- Três métodos para criar a assinatura: desenho à mão livre, texto digitado ou imagem enviada +- Visualizador de PDF integrado para um posicionamento preciso +- Arraste para posicionar e redimensionar assinaturas em qualquer página +- Achatamento opcional para incorporar as assinaturas de forma permanente +- Suporte a várias assinaturas no mesmo documento + +## Casos de uso + +- Assinar contratos, acordos ou formulários de aprovação antes de devolvê-los +- Adicionar sua assinatura a documentos fiscais, pedidos de seguro ou formulários governamentais +- Colocar rubricas em páginas individuais de um acordo de várias páginas +- Assinar NDAs ou documentos de RH que chegam como anexos em PDF + +## Dicas + +- Ative o achatamento se for enviar o PDF assinado para alguém que não deve poder remover ou reposicionar sua assinatura. +- Para assinaturas digitais com validade jurídica e verificação baseada em certificado, o BentoPDF também oferece uma ferramenta separada de Assinatura Digital. +- Envie uma imagem de assinatura em PNG com fundo transparente para obter o resultado mais limpo. + +## Ferramentas relacionadas + +- [Editor de PDF](./edit-pdf) +- [Adicionar Carimbos](./add-stamps) +- [Preenchimento de Formulário](./form-filler) diff --git a/docs/pt/tools/split-pdf.md b/docs/pt/tools/split-pdf.md new file mode 100644 index 00000000..3cfe408f --- /dev/null +++ b/docs/pt/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Dividir PDF +description: Divida um PDF em arquivos menores por intervalo de páginas, seleção visual, favoritos, páginas pares/ímpares ou intervalos fixos. +--- + +# Dividir PDF + +Divida um PDF em documentos menores usando um dos seis modos de divisão. De simples intervalos de páginas a divisão baseada em favoritos, esta ferramenta atende a todos os cenários de divisão de um documento. + +## Como funciona + +1. Envie um único arquivo PDF. +2. Escolha um modo de divisão no menu suspenso. +3. Configure as opções específicas do modo (intervalos de páginas, seleções etc.). +4. Clique no botão de processar. +5. O resultado é baixado como um único PDF ou como um arquivo ZIP, dependendo do modo e das configurações. + +## Modos de divisão + +| Modo | Descrição | +| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| **Intervalo** | Digite intervalos de páginas como `1-3, 5, 8-10`. Vários intervalos geram PDFs separados em um ZIP. Um único intervalo gera um PDF. | +| **Seleção visual** | Navegue pelas miniaturas das páginas e clique para selecionar as que você quer. As páginas selecionadas são extraídas para um novo PDF. | +| **Pares / Ímpares** | Extraia apenas as páginas de número par ou ímpar. | +| **Todas as páginas** | Divida cada página em seu próprio arquivo PDF, baixado em um ZIP. | +| **Favoritos** | Divida nos limites dos favoritos. Escolha o nível do favorito para controlar onde ocorrem as divisões. | +| **A cada N páginas** | Divida em blocos de N páginas cada (por exemplo, a cada 5 páginas). O último bloco pode ter menos páginas. | + +## Recursos + +- Seis modos de divisão distintos, cobrindo praticamente todos os casos de uso +- Seletor visual de páginas com miniaturas carregadas sob demanda +- Divisão baseada em favoritos com filtro por nível +- Opção de saída em ZIP para os modos de intervalo e visual +- Aceita intervalos de páginas com sintaxe mista (`1-3, 5, 8-10`) +- Aviso quando as divisões de N páginas resultam em blocos desiguais + +## Casos de uso + +- Extrair um capítulo ou seção específica de um documento grande +- Separar páginas ímpares e pares para fluxos de impressão frente e verso +- Dividir um PDF de livro em arquivos de capítulos individuais nos limites dos favoritos +- Isolar páginas específicas (como a página de assinatura) de um contrato +- Dividir um relatório compilado em arquivos por seção para distribuição + +## Dicas + +- Vários intervalos de páginas separados por vírgulas (por exemplo, `1-5, 10-15, 20-25`) geram PDFs separados, um por intervalo, reunidos em um ZIP. +- O modo de divisão por favoritos exige que o PDF realmente contenha favoritos. Se nenhum for encontrado, você verá uma mensagem de erro. +- A caixa "Baixar como ZIP" nos modos Intervalo e Seleção visual permite obter PDFs individuais por página em vez de um arquivo combinado. + +## Ferramentas relacionadas + +- [Mesclar PDF](./merge-pdf) +- [Extrair Páginas](./extract-pages) +- [Excluir Páginas](./delete-pages) +- [Multiferramenta PDF](./pdf-multi-tool) diff --git a/docs/pt/tools/svg-to-pdf.md b/docs/pt/tools/svg-to-pdf.md new file mode 100644 index 00000000..19eeeb10 --- /dev/null +++ b/docs/pt/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG para PDF +description: Converta gráficos vetoriais SVG em PDF com controle de qualidade, inteiramente no seu navegador. +--- + +# SVG para PDF + +Converta arquivos Scalable Vector Graphics (SVG) em PDF. A ferramenta rasteriza cada SVG pelo mecanismo de renderização do navegador e depois incorpora o resultado em sua resolução nativa. É útil para transformar ícones vetoriais, diagramas e ilustrações em documentos portáteis. + +## Formatos suportados + +| Formato | Extensões | +| :------ | :-------- | +| SVG | `.svg` | + +## Como funciona + +1. Clique na área de envio ou arraste e solte um ou mais arquivos SVG. +2. Revise e gerencie a lista de arquivos. +3. Escolha um nível de **Qualidade do PDF**. +4. Clique em **Converter para PDF**. O resultado é baixado como `from_svgs.pdf`. + +Cada SVG é lido como texto, renderizado em um canvas com sua largura e altura intrínsecas (usando 800x600 por padrão se nenhuma dimensão for especificada) e exportado como PNG. Esse PNG é então incorporado ao PDF usando o pdf-lib. As áreas transparentes são preenchidas com um fundo branco. + +## Opções + +A **Qualidade do PDF** controla a compressão após a rasterização: + +- **Alta qualidade**: o mais próximo da renderização original. +- **Qualidade média** (padrão): bom equilíbrio. +- **Baixa qualidade**: menor arquivo, com alguma perda de detalhes. + +## Casos de uso + +- Converter diagramas de arquitetura ou engenharia de SVG em um PDF pronto para impressão +- Reunir conjuntos de ícones em um PDF de referência para um sistema de design +- Transformar visualizações de dados (D3.js, exportações de bibliotecas de gráficos) em PDFs prontos para relatórios +- Criar versões imprimíveis de infográficos baseados em SVG + +## Dicas + +- Arquivos SVG sem os atributos `width` e `height` explícitos são renderizados em 800x600 pixels. Para obter os melhores resultados, defina as dimensões no código-fonte do SVG antes de converter. +- SVGs complexos com referências externas a fontes ou imagens vinculadas podem não ser renderizados perfeitamente. Incorpore todos os recursos no SVG para uma saída confiável. +- Como o SVG é rasterizado, o PDF conterá uma imagem bitmap em vez de caminhos vetoriais. Para uma saída em PDF realmente vetorial, é necessária uma ferramenta vetorial dedicada. + +## Ferramentas relacionadas + +- [Imagem para PDF](./image-to-pdf) +- [PNG para PDF](./png-to-pdf) +- [BMP para PDF](./bmp-to-pdf) diff --git a/docs/pt/tools/table-of-contents.md b/docs/pt/tools/table-of-contents.md new file mode 100644 index 00000000..60780c77 --- /dev/null +++ b/docs/pt/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Sumário +description: Gere uma página de sumário formatada a partir dos favoritos existentes no seu PDF. +--- + +# Sumário + +Esta ferramenta lê os favoritos (estrutura de tópicos) do seu PDF e gera uma página de sumário formatada que é inserida no início do documento. Se o seu PDF já tem favoritos, mas não tem uma página de sumário visível, esta ferramenta cria uma automaticamente. + +## Como funciona + +1. Envie um PDF que contenha favoritos. +2. Personalize o título do sumário, o tamanho da fonte e a família da fonte. +3. Opcionalmente, marque **Adicionar favorito para a página do sumário** para incluir o próprio sumário na árvore de favoritos. +4. Clique em **Gerar Sumário** para processar o arquivo. +5. O PDF atualizado é baixado automaticamente, com a página do sumário inserida no início. + +## Opções + +- **Título do sumário**: o título exibido no topo da página gerada. O padrão é "Sumário". +- **Tamanho da fonte**: escolha de 10pt a 72pt. O padrão é 12pt. +- **Família da fonte**: escolha entre as variantes Times Roman, Helvetica ou Courier (regular, negrito, itálico, negrito itálico). O padrão é Helvetica. +- **Adicionar favorito para a página do sumário**: quando marcada, uma entrada de favorito para a própria página do sumário é adicionada à árvore de tópicos do PDF. + +## Recursos + +- Lê toda a hierarquia de favoritos do PDF +- Gera uma página de sumário bem formatada, com referências de números de página +- Suporta níveis aninhados de favoritos com recuo +- Escolha entre 12 fontes PDF integradas +- Favorito opcional que aponta para a própria página do sumário + +## Casos de uso + +- Adicionar um sumário imprimível a e-books ou relatórios que só têm favoritos digitais +- Criar um sumário para um documento mesclado depois de combinar vários PDFs +- Gerar uma página de referência para manuais técnicos longos +- Preparar documentos para impressão em que se espera um sumário visível + +## Dicas + +- Se o seu PDF não tem favoritos, use primeiro a ferramenta [Editar Favoritos](./bookmark) para criá-los e depois volte aqui para gerar o sumário. +- Para documentos grandes, um tamanho de fonte maior, como 14pt ou 16pt, melhora a legibilidade. + +## Ferramentas relacionadas + +- [Editar Favoritos](./bookmark) +- [Números de Página](./page-numbers) +- [Cabeçalho e Rodapé](./header-footer) diff --git a/docs/pt/tools/text-color.md b/docs/pt/tools/text-color.md new file mode 100644 index 00000000..77bf8ef8 --- /dev/null +++ b/docs/pt/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Alterar cor do texto +description: Altere a cor de todo o texto do seu PDF para qualquer cor que você escolher. +--- + +# Alterar cor do texto + +Substitua a cor do texto em todo o seu PDF. A ferramenta identifica as regiões de texto em cada página e as recolore com a cor escolhida, preservando o layout do documento e o conteúdo que não é texto. + +## Como funciona + +1. Envie seu arquivo PDF. +2. Escolha uma nova cor de texto no seletor de cores. O padrão é azul (#0000FF). +3. Clique em **Alterar Cor do Texto** para processar. +4. O PDF recolorido é baixado automaticamente. Um indicador de progresso mostra qual página está sendo processada. + +## Opções + +- **Nova cor do texto**: um seletor de cores para escolher a cor de substituição de todo o texto do documento. + +## Recursos + +- Recolore o texto de todas as páginas do documento +- Processamento página a página com indicação de progresso +- Seletor de cores com suporte completo a cores hexadecimais +- Preserva o layout da página e os elementos que não são texto + +## Casos de uso + +- Mudar texto preto para azul-escuro, para uma aparência de documento mais suave e moderna +- Recolorir o texto para seguir as diretrizes da marca antes de distribuir documentos +- Converter o texto para uma cor específica para atender à conformidade de acessibilidade +- Tornar o texto visível sobre uma cor de fundo recém-aplicada + +## Dicas + +- Esta ferramenta renderiza as páginas em escala 2x para manter a qualidade e depois reconstrói o PDF. A saída é baseada em imagem, então o texto não poderá mais ser selecionado nem pesquisado. +- Para documentos em que você precisa manter o texto selecionável, considere editar o PDF diretamente com o [Editor de PDF](./edit-pdf). +- O tempo de processamento aumenta com o número de páginas, pois cada página é renderizada individualmente. + +## Ferramentas relacionadas + +- [Cor de Fundo](./background-color) +- [Inverter Cores](./invert-colors) +- [Ajustar Cores](./adjust-colors) diff --git a/docs/pt/tools/tiff-to-pdf.md b/docs/pt/tools/tiff-to-pdf.md new file mode 100644 index 00000000..beac059a --- /dev/null +++ b/docs/pt/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF para PDF +description: Converta imagens TIFF de uma ou várias páginas para o formato PDF no seu navegador, com suporte completo a páginas. +--- + +# TIFF para PDF + +Converta arquivos TIFF em PDF, incluindo TIFFs de várias páginas. Cada página (ou "IFD") de um arquivo TIFF vira uma página separada no PDF de saída. Isso é especialmente útil para documentos digitalizados, faxes e imagens médicas, que costumam ser armazenados como TIFFs de várias páginas. + +## Formatos suportados + +| Formato | Extensões | +| :------ | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Como funciona + +1. Clique na área de envio ou arraste e solte seus arquivos TIFF. +2. Revise a lista de arquivos e gerencie-a conforme necessário. +3. Clique em **Converter para PDF**. O resultado é baixado como `from_tiff.pdf`. + +A ferramenta decodifica cada arquivo TIFF usando um decodificador TIFF em JavaScript, extraindo os dados brutos de pixels RGBA de cada página. Cada página é renderizada em um canvas, exportada como PNG e incorporada ao PDF. As dimensões das páginas correspondem às das páginas originais do TIFF. + +## Opções + +Esta ferramenta não expõe configurações adicionais de qualidade. As imagens são incorporadas em sua resolução nativa. + +## Casos de uso + +- Converter documentos de fax de várias páginas (TIFF-F) em um formato PDF mais portátil +- Transformar arquivos de documentos digitalizados armazenados como TIFF em PDFs pesquisáveis (combine depois com a ferramenta de OCR) +- Processar arquivos de imagem médica (lâminas de patologia, exportações de radiologia) que usam TIFF +- Converter arquivos TIFF de GIS ou imagens de satélite em documentos compartilháveis + +## Dicas + +- TIFFs de várias páginas são totalmente suportados. Um TIFF de 10 páginas gera um PDF de 10 páginas. Você não precisa dividir o TIFF antes. +- Arquivos TIFF muito grandes (centenas de megabytes) podem demorar mais para processar, pois o arquivo inteiro precisa ser decodificado na memória do navegador. +- Se você precisa de OCR no PDF resultante, passe-o pela ferramenta [OCR para PDF](./ocr-pdf) após a conversão. + +## Ferramentas relacionadas + +- [Imagem para PDF](./image-to-pdf) +- [BMP para PDF](./bmp-to-pdf) +- [JPG para PDF](./jpg-to-pdf) diff --git a/docs/pt/tools/txt-to-pdf.md b/docs/pt/tools/txt-to-pdf.md new file mode 100644 index 00000000..05c4d65b --- /dev/null +++ b/docs/pt/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Texto para PDF +description: Converta arquivos de texto simples ou texto digitado em PDF com fontes, cores e tamanhos de página personalizados. +--- + +# Texto para PDF + +Converta texto simples em um PDF formatado. Você pode enviar arquivos `.txt` ou digitar diretamente no editor de texto integrado. A ferramenta suporta várias fontes, cores de texto personalizadas e uma ampla variedade de tamanhos de página, de A0 a A10, além de US Letter, Legal e Tabloid. + +## Formatos suportados + +| Entrada | Extensões | +| :------------------------ | :----------------------- | +| Arquivos de texto simples | `.txt` | +| Entrada direta de texto | Digite ou cole no editor | + +## Como funciona + +1. Escolha o modo de entrada usando a chave no topo: **Enviar arquivos** ou **Digitar texto**. +2. Se for enviar, arraste e solte ou clique para selecionar um ou mais arquivos `.txt`. Se for digitar, insira o texto diretamente na área de texto. +3. Configure as opções de formatação: família da fonte, tamanho da fonte, cor do texto e tamanho da página. +4. Clique em **Criar PDF**. A saída é baixada como `text_to_pdf.pdf`. + +Ao enviar vários arquivos, o conteúdo deles é concatenado, com linhas em branco entre eles. + +## Opções + +| Opção | Valores | Padrão | +| :-------------------- | :-------------------------------------------------------------------------------- | :-------------- | +| **Família da fonte** | Helvetica (sem serifa), Tiro (serifada), Courier (monoespaçada), Times (serifada) | Helvetica | +| **Tamanho da fonte** | 6 a 72 pt | 12 | +| **Cor do texto** | Qualquer cor pelo seletor de cores | Preto (#000000) | +| **Tamanho da página** | ISO A0 a A10, B0 a B10, C0 a C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Idiomas RTL (árabe, hebraico, persa, urdu) são detectados automaticamente. Quando texto RTL é encontrado, a direção e o alinhamento do texto mudam de acordo. + +## Casos de uso + +- Converter trechos de código ou arquivos de log em um PDF imprimível com a fonte Courier +- Criar rapidamente um PDF a partir de anotações de reunião digitadas na hora +- Formatar um manuscrito em texto simples com uma fonte e um tamanho de página específicos para envio +- Produzir uma versão em PDF de um README ou changelog para distribuição offline + +## Dicas + +- Use o modo **Digitar texto** quando quiser converter rapidamente o conteúdo da área de transferência sem salvá-lo antes como arquivo. +- Courier (monoespaçada) é a melhor escolha de fonte para código, logs ou qualquer conteúdo em que o alinhamento das colunas importe. +- As margens da página são fixas em 72 pontos (1 polegada) em todos os lados. + +## Ferramentas relacionadas + +- [Markdown para PDF](./markdown-to-pdf) +- [CSV para PDF](./csv-to-pdf) +- [Word para PDF](./word-to-pdf) diff --git a/docs/pt/tools/unlock-pdf.md b/docs/pt/tools/unlock-pdf.md new file mode 100644 index 00000000..f284c093 --- /dev/null +++ b/docs/pt/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Desbloquear PDF +description: Remova a proteção por senha de PDFs criptografados. Suporta descriptografia em lote com uma única senha para vários arquivos. +--- + +# Desbloquear PDF + +Se você tem a senha de um PDF criptografado, esta ferramenta remove a criptografia por completo e gera uma cópia desbloqueada que qualquer pessoa pode abrir sem credenciais. Ela suporta descriptografia em lote quando vários PDFs compartilham a mesma senha. + +## Como funciona + +1. Envie um ou mais arquivos PDF criptografados. +2. Digite a **senha** usada para proteger os arquivos. +3. Clique em **Descriptografar PDF**. +4. Um único arquivo é baixado diretamente. Vários arquivos geram um arquivo ZIP com todos os PDFs desbloqueados. + +## Recursos + +- Descriptografia de um único arquivo e em lote +- Funciona com senhas de usuário e senhas de proprietário +- Gera uma saída totalmente sem criptografia e sem restrições residuais +- Relatório de erros claro para senhas incorretas ou arquivos corrompidos +- Acompanhamento de sucesso/falha por arquivo no modo em lote + +## Diferença em relação a Remover Restrições + +**Descriptografar PDF** exige a senha e remove toda a criptografia. **Remover Restrições** atua sobre as restrições de uso (impressão, cópia, edição) e pode não exigir senha se apenas uma senha de proprietário foi definida. Use Descriptografar quando o PDF não abre de jeito nenhum sem senha. + +## Casos de uso + +- Desbloquear de forma permanente PDFs que você criptografou antes, quando a senha não é mais necessária +- Remover a criptografia de um lote de documentos arquivados para facilitar o acesso a longo prazo +- Preparar PDFs protegidos por senha para um sistema de gerenciamento de documentos que não suporta arquivos criptografados +- Desbloquear PDFs antes de mesclá-los com outros documentos (muitas ferramentas de mesclagem não processam arquivos criptografados) + +## Dicas + +- O campo de senha vale para todos os arquivos enviados. Se seus PDFs têm senhas diferentes, processe-os em lotes separados. +- Se aparecer o erro "Senha incorreta", verifique se há espaços no final ou se o Caps Lock está ativado. +- Após a descriptografia, a saída não tem nenhuma segurança. Criptografe novamente com Criptografar PDF se precisar aplicar uma nova senha. + +## Ferramentas relacionadas + +- [Criptografar PDF](./protect-pdf): aplique a criptografia novamente com uma nova senha +- [Remover Restrições](./remove-restrictions): remova restrições de uso sem descriptografar totalmente +- [Alterar Permissões](./change-permissions): modifique permissões específicas de um PDF criptografado diff --git a/docs/pt/tools/validate-signature-pdf.md b/docs/pt/tools/validate-signature-pdf.md new file mode 100644 index 00000000..a34b6153 --- /dev/null +++ b/docs/pt/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Validar Assinatura +description: Verifique assinaturas digitais em arquivos PDF. Confira a validade do certificado, a identidade do signatário, a integridade do documento e o status da cadeia de confiança. +--- + +# Validar Assinatura + +Envie um PDF assinado e esta ferramenta extrai todas as assinaturas digitais, identifica o signatário, verifica a validade do certificado e informa se o documento foi modificado após a assinatura. Você também pode fornecer um certificado confiável para verificar a cadeia da assinatura. + +## Como funciona + +1. Envie um arquivo PDF assinado. A validação começa automaticamente. +2. A ferramenta exibe um resumo: número de assinaturas encontradas e quantas são válidas. +3. Cada assinatura recebe um cartão detalhado com nome do signatário, emissor, datas e status. +4. Opcionalmente, envie um **certificado confiável** (.pem, .crt, .cer, .der) para verificar a assinatura em relação a uma âncora de confiança específica. A revalidação é executada automaticamente. + +## O que é verificado + +### Análise da assinatura + +A ferramenta extrai os objetos de assinatura PKCS#7 do PDF, decodifica a estrutura ASN.1 e obtém o certificado X.509 do signatário, junto com qualquer cadeia de certificados incorporada na assinatura. + +### Validade do certificado + +- **Expiração**: o certificado está dentro do período de validade no momento? +- **Detecção de autoassinatura**: o certificado é o próprio emissor? +- **Cadeia de confiança**: quando um certificado confiável é fornecido, o certificado do signatário remonta a ele? + +### Verificação criptográfica + +- A ferramenta reconstrói os bytes cobertos pelo `/ByteRange` da assinatura, calcula o hash deles com o algoritmo declarado pelo signatário e compara o resultado com o atributo `messageDigest` dentro da assinatura. +- Em seguida, ela reserializa os atributos assinados como um SET DER e verifica a assinatura com a chave pública do certificado do signatário. +- **Uma assinatura só é considerada válida quando todas essas verificações passam.** Se os bytes do PDF foram modificados após a assinatura, ou se a assinatura incorporada não corresponde à chave do signatário, o status mostra "Inválido: falha na verificação criptográfica" com o motivo específico. + +#### Algoritmos de assinatura suportados + +| Algoritmo | Caminho de verificação | +| ----------------------- | ------------------------------------------------------------------------------------------ | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, com fallback para Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` após a conversão da assinatura DER → IEEE P1363 | + +Se uma assinatura usa um algoritmo fora dessa lista (por exemplo Ed25519, SM2 ou RSA com um OID de digest incomum), o cartão mostra **"Não verificada: algoritmo de assinatura não compatível"** em amarelo, junto com o OID ou o motivo específico. Trata-se de uma distinção deliberada em três estados: + +- **Válida**: assinatura verificada criptograficamente com a chave pública do signatário. +- **Inválida**: a verificação foi executada e deu resultado negativo (bytes alterados, chave incompatível). +- **Não verificada**: a ferramenta não conseguiu executar a verificação para esse algoritmo. Os metadados do certificado continuam sendo exibidos, mas você deve tratar a assinatura como "desconhecida" e verificá-la com o Adobe Acrobat ou `openssl cms -verify`. + +### Algoritmos de digest inseguros + +- Assinaturas que usam **MD5 ou SHA-1** são rejeitadas como inválidas e sinalizadas com o status "Resumo inseguro". Ambos os algoritmos têm ataques de colisão publicados, então uma assinatura sobre um hash SHA-1 ou MD5 não oferece garantia de integridade. +- SHA-224, SHA-256, SHA-384 e SHA-512 são todos aceitos. + +### Cobertura do documento + +- **Cobertura total**: a assinatura cobre todo o arquivo PDF, ou seja, nenhum byte foi adicionado ou alterado após a assinatura. +- **Cobertura parcial**: a assinatura cobre apenas parte do arquivo. Isso pode indicar que houve modificações após a assinatura (não necessariamente maliciosas: salvamentos incrementais produzem cobertura parcial). + +## Detalhes da assinatura + +Cada cartão de assinatura mostra: + +- **Assinado por**: nome comum, organização e e-mail do certificado do signatário +- **Emissor**: a autoridade certificadora que emitiu o certificado do signatário +- **Assinado em**: o carimbo de data e hora incorporado na assinatura +- **Válido de / Válido até**: o período de validade do certificado +- **Motivo**: por que o documento foi assinado (se informado) +- **Local**: onde foi assinado (se informado) +- **Status de cobertura**: total ou parcial +- **Selo de confiança**: confiável ou fora da cadeia de confiança (somente quando um certificado personalizado é fornecido) + +### Detalhes técnicos + +Expanda a seção de detalhes técnicos para ver: + +- Número de série do certificado do signatário +- Algoritmo de digest (SHA-256, SHA-512 etc.) +- Algoritmo de assinatura (RSA com SHA-256, ECDSA com SHA-256 etc.) +- Mensagens de erro para assinaturas inválidas + +## Casos de uso + +- Verificar um contrato assinado digitalmente antes de assinar em seguida +- Auditar documentos assinados para confirmar que não foram adulterados +- Conferir se um certificado expirou desde que o documento foi assinado +- Validar assinaturas com o certificado raiz da sua organização +- Inspecionar os detalhes de assinatura de documentos governamentais ou jurídicos + +## Dicas + +- Um certificado autoassinado não significa que a assinatura é inválida: significa que a identidade do signatário não pode ser verificada por meio de um terceiro confiável. Isso é comum em documentos internos. +- A cobertura parcial nem sempre indica adulteração. Muitos fluxos de trabalho de PDF adicionam atualizações incrementais (como uma segunda assinatura) que criam cobertura parcial. +- Envie o certificado raiz ou intermediário da sua organização como certificado confiável para obter a verificação da cadeia de confiança. + +## Ferramentas relacionadas + +- [Assinatura Digital PDF](./digital-sign-pdf): assine PDFs com seu próprio certificado +- [Achatar PDF (Flatten)](./flatten-pdf): achate um PDF antes de assinar para evitar modificações após a assinatura +- [Remover Metadados](./remove-metadata): limpe um PDF antes de aplicar uma assinatura diff --git a/docs/pt/tools/view-metadata.md b/docs/pt/tools/view-metadata.md new file mode 100644 index 00000000..74220264 --- /dev/null +++ b/docs/pt/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Ver metadados +description: Inspecione todas as propriedades de metadados de um PDF, incluindo informações do documento, dados XMP e detalhes estruturais. +--- + +# Ver metadados + +Examine as propriedades ocultas incorporadas em um arquivo PDF. A ferramenta exibe as informações do documento (título, autor, datas), metadados XMP, dimensões das páginas e outros dados estruturais em um formato legível. + +## Como funciona + +1. Envie um arquivo PDF. +2. A ferramenta analisa o arquivo imediatamente e exibe todos os metadados disponíveis em seções organizadas. +3. Revise o dicionário de informações do documento, a árvore de metadados XMP e as propriedades estruturais. +4. Nenhuma etapa de processamento é necessária: os metadados são exibidos assim que o arquivo é carregado. + +## Recursos + +- Exibe os campos padrão de informações do documento: Title, Author, Subject, Keywords, Creator, Producer +- Mostra as datas de criação e modificação em formato legível +- Analisa e renderiza a árvore completa de metadados XMP com namespaces aninhados +- Converte o formato de data do PDF (`D:20240101120000Z`) em datas legíveis +- Organizado em seções recolhíveis para facilitar a navegação + +## Seções de metadados + +| Seção | Conteúdo | +| ----------------------------- | ------------------------------------------------------------------------------------------------- | +| **Informações do Documento** | Title, Author, Subject, Keywords, Creator, Producer, Creation Date, Modification Date | +| **Metadados XMP** | Árvore completa de metadados baseada em XML com Dublin Core, XAP, PDF e namespaces personalizados | +| **Propriedades do Documento** | Número de páginas, versão do PDF, tamanho do arquivo, status de criptografia | + +## Casos de uso + +- Verificar quem criou um PDF e quando foi modificado pela última vez +- Confirmar que os metadados foram definidos corretamente antes de publicar um documento +- Auditar PDFs quanto à privacidade, verificando quais informações pessoais estão incorporadas +- Investigar o software usado para criar ou modificar um PDF (pelo campo Producer) +- Revisar metadados XMP para conformidade na gestão de ativos digitais + +## Dicas + +- Strings de data do PDF que começam com `D:` são convertidas automaticamente para o formato do seu fuso horário local. +- Se campos de metadados aparecem vazios, o criador do PDF simplesmente não os definiu. Nem todos os PDFs contêm metadados completos. +- Para modificar os metadados depois de inspecioná-los, use [Editar Metadados](./edit-metadata). Para removê-los por completo, use Remover Metadados. + +## Ferramentas relacionadas + +- [Editar Metadados](./edit-metadata) +- [Camadas OCG do PDF](./pdf-layers) +- [Comparar PDFs](./compare-pdfs) diff --git a/docs/pt/tools/vsd-to-pdf.md b/docs/pt/tools/vsd-to-pdf.md new file mode 100644 index 00000000..02d01812 --- /dev/null +++ b/docs/pt/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD para PDF +description: Converta diagramas do Microsoft Visio (VSD/VSDX) em PDF no seu navegador. Grátis, privado, sem precisar do Visio. +--- + +# VSD para PDF + +Converta diagramas do Microsoft Visio em PDF sem instalar o Visio. Arquivos VSD e VSDX contêm fluxogramas, organogramas, diagramas de rede e plantas baixas que a maioria das pessoas não consegue abrir. Esta ferramenta os renderiza como PDFs limpos, que podem ser vistos em qualquer dispositivo. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :----------- | :------- | :--------------------------------------------- | +| Visio Binary | `.vsd` | Formato Visio legado (Visio 2003 e anteriores) | +| Visio XML | `.vsdx` | Formato Visio moderno (Visio 2013+) | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos VSD ou VSDX. Os dois formatos podem ser misturados em um mesmo lote. +2. Revise a lista de arquivos. Remova entradas indesejadas com o ícone de lixeira ou use **Adicionar Mais Arquivos** para incluir mais diagramas. +3. Clique em **Converter para PDF**. O mecanismo baseado em LibreOffice é carregado no navegador e renderiza cada diagrama em um PDF, preservando formas, conectores, rótulos e layout da página. +4. Um único diagrama é baixado diretamente como PDF. Vários arquivos geram um arquivo ZIP chamado `vsd-to-pdf.zip`. + +## Opções + +Nenhuma configuração é necessária. O conversor respeita o tamanho e a orientação originais da página do documento Visio. + +## Casos de uso + +- Revisar diagramas do Visio enviados por um colega quando você não tem licença do Visio +- Incluir diagramas de rede ou de arquitetura na documentação de projetos como PDFs +- Imprimir organogramas ou fluxos de processo como material de reunião +- Arquivar arquivos VSD legados de versões antigas do Visio em um formato com futuro garantido + +## Dicas + +- Documentos Visio de várias páginas geram PDFs de várias páginas, com cada página do Visio correspondendo a uma página do PDF. +- Arquivos VSDX (o formato moderno baseado em XML) geralmente são convertidos com maior fidelidade que os arquivos binários VSD mais antigos. +- O mecanismo LibreOffice é carregado uma vez por sessão. Espere uma breve espera na primeira conversão, com resultados mais rápidos nos arquivos seguintes. + +## Ferramentas relacionadas + +- [ODG para PDF](./odg-to-pdf) +- [PUB para PDF](./pub-to-pdf) +- [PSD para PDF](./psd-to-pdf) diff --git a/docs/pt/tools/webp-to-pdf.md b/docs/pt/tools/webp-to-pdf.md new file mode 100644 index 00000000..9bdb0337 --- /dev/null +++ b/docs/pt/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP para PDF +description: Converta imagens WebP em PDF diretamente no seu navegador, com qualidade de compressão ajustável. +--- + +# WebP para PDF + +Converta o formato de imagem WebP, do Google, em PDF. É especialmente útil quando você baixou imagens da web em WebP e precisa delas em um formato mais amplamente aceito para impressão ou compartilhamento. + +## Formatos suportados + +| Formato | Extensões | +| :------ | :-------- | +| WebP | `.webp` | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos WebP. +2. Revise a lista de arquivos e remova os que você não precisa. +3. Selecione um nível de **Qualidade do PDF**. +4. Clique em **Converter para PDF**. A saída é baixada como `from_webps.pdf`. + +Internamente, cada imagem WebP é decodificada pela API canvas do navegador e depois incorporada ao PDF usando pdf-lib. Isso significa que a conversão funciona em qualquer navegador que suporte a decodificação de WebP (todos os navegadores modernos suportam). + +## Opções + +A **Qualidade do PDF** controla a compressão ao incorporar as imagens: + +- **Alta Qualidade**: preserva o máximo de detalhes. +- **Qualidade Média** (padrão): saída equilibrada. +- **Baixa Qualidade**: menor tamanho de arquivo. + +## Casos de uso + +- Converter imagens baixadas da web e salvas como WebP em um PDF imprimível +- Reunir capturas de tela WebP do Chrome ou do Edge em uma documentação +- Criar um portfólio em PDF a partir de imagens exportadas por ferramentas de design que usam WebP por padrão +- Arquivar imagens WebP em um formato legível de forma mais universal + +## Dicas + +- O WebP é decodificado para PNG internamente antes de ser incorporado ao PDF, então imagens WebP sem perdas mantêm a qualidade na configuração Alta. +- Se você tem uma mistura de WebP e outros formatos de imagem, use a ferramenta [Imagem para PDF](./image-to-pdf), que aceita tudo de uma vez. + +## Ferramentas relacionadas + +- [Imagem para PDF](./image-to-pdf) +- [PNG para PDF](./png-to-pdf) +- [JPG para PDF](./jpg-to-pdf) diff --git a/docs/pt/tools/word-to-pdf.md b/docs/pt/tools/word-to-pdf.md new file mode 100644 index 00000000..0b6dca2c --- /dev/null +++ b/docs/pt/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word para PDF +description: Converta documentos Word (DOC, DOCX), ODT e RTF em PDF no seu navegador, preservando toda a formatação. +--- + +# Word para PDF + +Converta documentos do Microsoft Word e formatos compatíveis em PDF. A ferramenta usa um mecanismo LibreOffice executado no navegador, que lida com arquivos DOC, DOCX, ODT e RTF e preserva formatação, tabelas, imagens, cabeçalhos, rodapés e estilos na saída. + +## Formatos suportados + +| Formato | Extensões | +| :---------------- | :-------- | +| Word (moderno) | `.docx` | +| Word (legado) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus documentos Word. Vários arquivos podem ser selecionados de uma vez. +2. Revise e gerencie a lista de arquivos. +3. Clique em **Converter para PDF**. O mecanismo LibreOffice é carregado no primeiro uso (um indicador de progresso mostra o status da inicialização) e depois cada arquivo é convertido. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são empacotados em `word-converted.zip`. + +## Opções + +Esta ferramenta não tem configurações adicionais. O mecanismo LibreOffice gera a saída usando seu perfil padrão de exportação para PDF. + +## Saída + +| Quantidade de entrada | Saída | +| :-------------------- | :---------------------------------------------------------------------- | +| 1 arquivo | Download de um único PDF (nome original do arquivo com extensão `.pdf`) | +| 2+ arquivos | Arquivo ZIP (`word-converted.zip`) com um PDF por arquivo | + +## Casos de uso + +- Converter um currículo ou uma carta de apresentação de DOCX para PDF antes de enviar uma candidatura +- Converter em lote um conjunto de contratos ou propostas em PDF para entregar a um cliente +- Transformar arquivos `.doc` legados em PDFs modernos para arquivamento de longo prazo +- Converter documentos colaborativos do Google Docs (exportados como DOCX) em PDF +- Produzir PDFs prontos para impressão a partir de modelos do Word usados na geração automatizada de documentos + +## Dicas + +- O mecanismo LibreOffice é baixado uma vez por sessão e fica em cache. Espere alguns segundos de carregamento na primeira conversão, com as conversões seguintes bem mais rápidas. +- Formatação complexa (macros, controles ActiveX, SmartArt avançado) pode não ser convertida perfeitamente. Elementos padrão de documento (texto, tabelas, imagens, cabeçalhos, notas de rodapé) são convertidos com confiabilidade. +- Como esta ferramenta também aceita ODT e RTF, você pode usá-la como conversor único para todos os formatos de processamento de texto. + +## Ferramentas relacionadas + +- [ODT para PDF](./odt-to-pdf) +- [RTF para PDF](./rtf-to-pdf) +- [Excel para PDF](./excel-to-pdf) +- [PowerPoint para PDF](./powerpoint-to-pdf) diff --git a/docs/pt/tools/wpd-to-pdf.md b/docs/pt/tools/wpd-to-pdf.md new file mode 100644 index 00000000..fd4e48cd --- /dev/null +++ b/docs/pt/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD para PDF +description: Converta documentos WordPerfect (WPD) em PDF no seu navegador usando o LibreOffice. Grátis e privado. +--- + +# WPD para PDF + +Converta documentos do Corel WordPerfect em arquivos PDF. O WPD já foi o formato de processamento de texto dominante em escritórios de advocacia e órgãos públicos. Se você tem arquivos antigos do WordPerfect que os programas modernos se recusam a abrir, esta ferramenta os traz de volta à vida como PDFs padrão. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :---------- | :------- | :----------------------------------------- | +| WordPerfect | `.wpd` | Todas as principais versões do WordPerfect | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos WPD. Vários arquivos podem ser selecionados de uma vez. +2. Revise a lista de arquivos. Remova arquivos indesejados com o ícone de lixeira ou use **Adicionar Mais Arquivos** para incluir mais documentos. +3. Clique em **Converter para PDF**. A ferramenta carrega no navegador um mecanismo de conversão baseado em LibreOffice, que analisa o formato WPD e gera o PDF. +4. Um único arquivo é baixado diretamente como PDF. Conversões em lote geram um arquivo ZIP chamado `wpd-to-pdf.zip`. + +## Opções + +Nenhuma configuração é necessária. O mecanismo LibreOffice cuida automaticamente da formatação, das fontes e do layout do WPD. + +## Casos de uso + +- Abrir documentos jurídicos de décadas atrás escritos em WordPerfect +- Converter registros governamentais arquivados de WPD para um formato moderno +- Migrar uma biblioteca de documentos WordPerfect legados para PDF para armazenamento de longo prazo +- Compartilhar arquivos WPD com destinatários que não têm o Corel WordPerfect instalado + +## Dicas + +- O mecanismo LibreOffice é carregado no primeiro uso, o que leva um momento. As conversões seguintes na mesma sessão são mais rápidas. +- Macros complexas do WPD e reveal codes não são preservados, mas o layout visual, o conteúdo do texto e a formatação básica são mantidos no PDF. + +## Ferramentas relacionadas + +- [WPS para PDF](./wps-to-pdf) +- [ODG para PDF](./odg-to-pdf) diff --git a/docs/pt/tools/wps-to-pdf.md b/docs/pt/tools/wps-to-pdf.md new file mode 100644 index 00000000..a62c2153 --- /dev/null +++ b/docs/pt/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS para PDF +description: Converta documentos do Microsoft Works (WPS) em PDF no seu navegador. Grátis, sem cadastro e totalmente privado. +--- + +# WPS para PDF + +Converta arquivos do processador de texto Microsoft Works em PDF. O Microsoft Works vinha instalado em PCs domésticos no fim dos anos 1990 e nos anos 2000, e muitos arquivos WPS ainda estão em discos rígidos antigos e arquivos de e-mail. Esta ferramenta os abre no navegador e gera PDFs limpos. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :-------------- | :------- | :-------------------------------------------------- | +| Microsoft Works | `.wps` | Arquivos do processador de texto do Microsoft Works | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos WPS. Vários arquivos são aceitos. +2. Revise a lista de arquivos. Use o ícone de lixeira para remover arquivos individuais ou clique em **Adicionar Mais Arquivos** para ampliar o lote. +3. Clique em **Converter para PDF**. Um mecanismo baseado em LibreOffice é carregado no navegador e converte cada documento WPS em PDF. +4. Um arquivo é baixado diretamente como PDF. Vários arquivos são reunidos em um arquivo ZIP chamado `wps-to-pdf.zip`. + +## Opções + +Nenhuma configuração adicional é necessária. O conversor trata o texto, a formatação básica e as imagens incorporadas do arquivo WPS. + +## Casos de uso + +- Recuperar documentos antigos da escola ou do trabalho salvos no formato Microsoft Works +- Abrir anexos WPS de e-mail quando você não tem o Microsoft Works instalado +- Converter um acervo de arquivos WPS para migrar para um sistema de documentos moderno +- Imprimir documentos legados que os processadores de texto atuais não conseguem abrir + +## Dicas + +- Não confunda os arquivos `.wps` do Microsoft Works com os arquivos do WPS Office. Esta ferramenta é específica para o formato mais antigo do Microsoft Works. +- O mecanismo LibreOffice leva um momento para carregar no primeiro uso. Depois de carregado, as conversões seguintes na mesma sessão são mais rápidas. + +## Ferramentas relacionadas + +- [WPD para PDF](./wpd-to-pdf) +- [PUB para PDF](./pub-to-pdf) diff --git a/docs/pt/tools/xml-to-pdf.md b/docs/pt/tools/xml-to-pdf.md new file mode 100644 index 00000000..874650e0 --- /dev/null +++ b/docs/pt/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML para PDF +description: Converta arquivos XML em documentos PDF estruturados no seu navegador. Grátis, privado, sem processamento em servidor. +--- + +# XML para PDF + +Converta arquivos de dados XML em documentos PDF legíveis e estruturados. O XML bruto é poderoso, mas difícil de ler para humanos. Esta ferramenta analisa a árvore XML, identifica estruturas de dados repetitivas e as renderiza como tabelas e seções formatadas em um PDF A4 na horizontal. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :------ | :------- | :--------------------------------- | +| XML | `.xml` | Qualquer documento XML bem formado | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos XML. Vários arquivos podem ser processados em um único lote. +2. Revise a lista de arquivos. Remova arquivos indesejados com o ícone de lixeira ou clique em **Adicionar Mais Arquivos** para incluir mais. +3. Clique em **Converter para PDF**. A ferramenta analisa a estrutura XML com o DOMParser nativo do navegador, examina a hierarquia dos dados e a renderiza em um PDF usando jsPDF com formatação de tabelas automática. +4. Um único arquivo é baixado como PDF. Várias conversões são empacotadas em `xml-to-pdf.zip`. + +## Opções + +Nenhuma configuração manual é necessária. O conversor detecta automaticamente a estrutura XML e escolhe layouts de tabela apropriados. A saída usa orientação A4 na horizontal para acomodar conjuntos de dados largos. + +## Casos de uso + +- Transformar exportações de dados XML de bancos de dados ou APIs em relatórios imprimíveis +- Criar resumos legíveis a partir de arquivos de configuração XML +- Converter notas fiscais ou logs de transações em XML para PDFs de arquivo +- Tornar sitemaps XML ou feeds RSS legíveis em formato de documento + +## Dicas + +- O XML precisa estar bem formado. Se o analisador encontrar erros de sintaxe, a conversão falha com uma mensagem de erro descritiva apontando o problema. +- Estruturas XML muito aninhadas são achatadas em tabelas. Para melhores resultados, os dados devem ter elementos irmãos repetidos com elementos filhos consistentes. +- Atualizações de progresso aparecem durante a conversão, mostrando cada fase: leitura, análise, avaliação e renderização. + +## Ferramentas relacionadas + +- [FB2 para PDF](./fb2-to-pdf) +- [XPS para PDF](./xps-to-pdf) +- [Email para PDF](./email-to-pdf) diff --git a/docs/pt/tools/xps-to-pdf.md b/docs/pt/tools/xps-to-pdf.md new file mode 100644 index 00000000..444112cb --- /dev/null +++ b/docs/pt/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS para PDF +description: Converta documentos XPS e OXPS em PDF no seu navegador. Sem upload, sem cadastro, totalmente privado. +--- + +# XPS para PDF + +Converta documentos Microsoft XPS e OXPS em arquivos PDF padrão. O XPS (XML Paper Specification) foi a resposta da Microsoft ao PDF, mas o suporte a ele diminuiu em várias plataformas. Esta ferramenta torna esses documentos legíveis universalmente de novo. + +## Formatos suportados + +| Formato | Extensão | Observações | +| :------ | :------- | :-------------------------------------- | +| XPS | `.xps` | Formato XPS original da Microsoft | +| OXPS | `.oxps` | Open XPS, a variante do padrão ECMA-388 | + +## Como funciona + +1. Clique na área de upload ou arraste e solte seus arquivos XPS/OXPS. Você pode selecionar vários arquivos de uma vez. +2. Revise a lista de arquivos. Remova arquivos individuais com o ícone de lixeira ou clique em **Adicionar Mais Arquivos** para acrescentar documentos. +3. Clique em **Converter para PDF**. O mecanismo PyMuPDF processa cada documento localmente no seu navegador. +4. Um único arquivo é baixado diretamente como PDF. Vários arquivos são reunidos em um arquivo ZIP chamado `xps-converted.zip`. + +## Opções + +Esta ferramenta faz uma conversão direta de formato, sem configuração adicional. A saída preserva as dimensões originais da página, os gráficos vetoriais, as fontes e as imagens da origem XPS. + +## Casos de uso + +- Abrir arquivos XPS recebidos de sistemas Windows mais antigos que usavam o driver de impressão XPS por padrão +- Converter documentos OXPS do Windows 10/11 para compartilhar com usuários de macOS ou Linux +- Arquivar arquivos XPS legados em um formato com suporte mais amplo +- Tornar documentos governamentais ou corporativos baseados em XPS acessíveis a destinatários externos + +## Dicas + +- As extensões `.xps` e `.oxps` são tratadas automaticamente: você pode misturá-las no mesmo lote. +- Se o arquivo XPS original foi criado com um driver de impressão de alta resolução, o PDF resultante mantém essa qualidade. Não há reamostragem. + +## Ferramentas relacionadas + +- [Word para PDF](./word-to-pdf) +- [XML para PDF](./xml-to-pdf) diff --git a/docs/ru/contributing.md b/docs/ru/contributing.md new file mode 100644 index 00000000..c778c8c9 --- /dev/null +++ b/docs/ru/contributing.md @@ -0,0 +1,136 @@ +# Участие в разработке + +Спасибо за интерес к участию в разработке BentoPDF! Это руководство поможет вам начать. + +## Начало работы + +### Требования + +- Node.js 18+ +- npm 9+ +- Git + +### Настройка + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Структура проекта + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Добавление нового инструмента + +### Шаг 1: создайте файл логики + +Создайте `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Шаг 2: создайте HTML-страницу + +Создайте `src/pages/your-tool.html` по образцу существующих шаблонов инструментов. + +### Шаг 3: зарегистрируйте инструмент + +Добавьте в `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Шаг 4: добавьте в конфигурацию сборки + +Добавьте страницу в `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Шаг 5: добавьте переводы + +Добавьте записи во все файлы локалей в `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Стиль кода + +- Используйте TypeScript для всего нового кода +- Следуйте существующим шаблонам для единообразия +- Запускайте `npm run format` перед коммитом +- Без комментариев в рабочем коде (комментарии удаляются при сборке) + +## Процесс отправки pull request + +1. Создайте ветку для функции: `git checkout -b feature/your-feature` +2. Внесите изменения +3. Тщательно протестируйте: `npm run build` +4. Отправьте PR с понятным описанием + +## Перевод + +О добавлении новых языков читайте в [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md). + +## Лицензионное соглашение контрибьютора + +Прежде чем ваш PR будет принят, нужно подписать наше CLA: + +- [Индивидуальное CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Корпоративное CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Помощь + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Сообщество в Discord](https://discord.gg/Bgq3Ay3f2w) + +## Лицензия + +BentoPDF распространяется по двойной лицензии: + +- **AGPL-3.0** для проектов с открытым исходным кодом, где вы публикуете весь свой исходный код +- **Коммерческая лицензия** для проприетарных приложений с закрытым кодом: [Получить бессрочную лицензию за $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Участвуя в разработке, вы соглашаетесь, что ваш вклад будет лицензирован на этих условиях. diff --git a/docs/ru/getting-started.md b/docs/ru/getting-started.md new file mode 100644 index 00000000..08988e42 --- /dev/null +++ b/docs/ru/getting-started.md @@ -0,0 +1,80 @@ +# Начало работы + +Добро пожаловать в BentoPDF! Это руководство поможет вам быстро начать работу. + +## Что такое BentoPDF? + +BentoPDF: бесплатный набор PDF-инструментов с открытым исходным кодом и упором на приватность, который работает **целиком в вашем браузере**. Ваши файлы никогда не покидают устройство: вся обработка выполняется локально с помощью WebAssembly (WASM). + +## Быстрый старт + +### Вариант 1: размещённая версия + +Откройте [bentopdf.com](https://www.bentopdf.com) и пользуйтесь BentoPDF сразу, без установки. + +### Вариант 2: самостоятельный хостинг в Docker + +> [!IMPORTANT] +> Для конвертации файлов Office нужен `SharedArrayBuffer`, а для него требуется всё перечисленное: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - безопасный контекст +> +> `http://localhost` подходит для локального тестирования, так как браузеры считают loopback доверенным. `http://192.168.x.x` и другие адреса локальной сети обычно не считаются, поэтому для конвертации Word/Excel/PowerPoint с других устройств в вашей сети понадобится HTTPS. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF выпускается в двух сборках: **Self-Hosted** (`bentopdf-simple`, используется выше) для внутренних, командных и корпоративных развёртываний и **Commercial** (`bentopdf:latest`), которую использует сам bentopdf.com и владельцы коммерческой лицензии для публичных развёртываний. В обеих одинаковые PDF-инструменты, а Commercial добавляет главный экран, FAQ, отзывы и подвал bentopdf.com. Если сомневаетесь, берите сборку Self-Hosted. + +Затем откройте `http://localhost:3000` в браузере. + +> [!NOTE] +> Если вы готовите изолированное (air-gapped) развёртывание OCR, помимо воркера Tesseract, основного рантайма и файлов traineddata нужно разместить внутри сети и шрифты текстового слоя OCR. Полная настройка описана в разделе [Самостоятельный хостинг](/ru/self-hosting/), включая `VITE_OCR_FONT_BASE_URL` и поставляемый каталог `ocr-fonts/`. + +### Вариант 3: сборка из исходников + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Возможности вкратце + +| Категория | Инструменты | +| ---------------------- | --------------------------------------------------------------------- | +| **Конвертация в PDF** | Word, Excel, PowerPoint, изображения, Markdown, EPUB, MOBI и другое | +| **Конвертация из PDF** | JPG, PNG, текст, Excel, SVG и другое | +| **Правка и аннотации** | Подпись, выделение, скрытие данных, заполнение форм, штампы | +| **Организация** | Объединение, разделение, поворот, удаление страниц, изменение порядка | +| **Оптимизация** | Сжатие, восстановление, сведение слоёв, OCR | +| **Безопасность** | Шифрование, расшифровка, снятие ограничений | + +## Поддержка браузеров + +BentoPDF лучше всего работает в современных браузерах: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Дальнейшие шаги + +- [Изучите все инструменты](/ru/tools/) +- [Разверните BentoPDF у себя](/ru/self-hosting/) +- [Участвуйте в проекте](/ru/contributing) diff --git a/docs/ru/index.md b/docs/ru/index.md new file mode 100644 index 00000000..f5b99482 --- /dev/null +++ b/docs/ru/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Бесплатные PDF-инструменты с открытым кодом' + tagline: Обрабатывайте PDF прямо в браузере. Без загрузок. Без серверов. Полная приватность. + actions: + - theme: brand + text: Начать + link: /ru/getting-started + - theme: alt + text: Инструменты + link: /ru/tools/ + - theme: alt + text: Свой хостинг + link: /ru/self-hosting/ + - theme: alt + text: Коммерческая лицензия + link: /ru/licensing + +features: + - icon: 🔒 + title: На 100% приватно + details: Ваши файлы не покидают устройство. Вся обработка выполняется локально в браузере с помощью WebAssembly. + - icon: ⚡ + title: Быстро и бесплатно + details: Без регистрации, без ограничений, без водяных знаков. Обрабатывайте неограниченное число PDF бесплатно и навсегда. + - icon: 🛠️ + title: Более 50 инструментов + details: Конвертация, правка, объединение, разделение, сжатие, подпись, OCR и многое другое. Всё нужное в одном месте. + + - icon: 🌐 + title: Можно развернуть у себя + details: 'Развёртывайте на своей инфраструктуре: Docker, Vercel, Netlify, AWS или полностью изолированные среды с собственными воркерами OCR, языковыми данными и шрифтами текстового слоя.' +--- + +## OCR офлайн + +Если вы размещаете BentoPDF у себя в изолированной или офлайн-среде, для OCR нужны не только воркер Tesseract и файлы traineddata. Чтобы получать PDF с возможностью поиска, шрифты текстового слоя OCR тоже должны раздаваться изнутри. +Полную настройку, включая `VITE_OCR_FONT_BASE_URL`, поставляемый каталог `ocr-fonts/` и обновлённый процесс для изолированных сред, смотрите в разделе [Самостоятельный хостинг](/ru/self-hosting/). diff --git a/docs/ru/licensing.md b/docs/ru/licensing.md new file mode 100644 index 00000000..15456ab6 --- /dev/null +++ b/docs/ru/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/ru/self-hosting/#конфигурация-wasm-компоненты-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/ru/self-hosting/apache.md b/docs/ru/self-hosting/apache.md new file mode 100644 index 00000000..23213ea4 --- /dev/null +++ b/docs/ru/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Развёртывание на Apache + +Размещение BentoPDF на Apache HTTP Server. + +## Требования + +- Apache 2.4+ +- Включённый mod_rewrite +- SSL-сертификат (рекомендуется) + +## Шаг 1: соберите проект + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Чтобы настроить брендинг, задайте переменные окружения перед сборкой: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Шаг 2: скопируйте файлы + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Шаг 3: конфигурация Apache + +Создайте `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Шаг 4: .htaccess для маршрутизации + +Создайте `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Шаг 5: включите нужные модули + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Шаг 6: включите сайт + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Развёртывание в подкаталоге + +Чтобы разместить по адресу `/pdf/`: + +1. Соберите проект с базовым URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Обновите `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Устранение неполадок + +### Ошибки 404 для WASM + +Убедитесь, что настроен MIME-тип: + +```apache +AddType application/wasm .wasm +``` + +### Sign PDF или Form Filler показывают пустой просмотрщик (ошибка MIME для `.mjs`) + +Если в консоли браузера видно: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…и неудачный запрос заканчивается на `.mjs`, в конфигурации Apache нет сопоставления `.mjs → application/javascript`. Встроенный PDF-просмотрщик поставляется с ES-модулями с расширением `.mjs`, а стандартный `mime.types` Apache их по умолчанию не содержит. + +Добавьте в VirtualHost или `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Затем перезагрузите Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Для проверки откройте DevTools браузера → вкладка Network, найдите неудачный запрос `.mjs` и посмотрите заголовок ответа `Content-Type`. Теперь он должен быть `application/javascript`, а не `application/octet-stream`. + +### Rewrite не работает + +Проверьте, что mod_rewrite включён: + +```bash +sudo a2enmod rewrite +``` + +### Конвертация Word/ODT/Excel в PDF не работает + +LibreOffice WASM требует `SharedArrayBuffer`, для которого нужны такие заголовки: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Также нужен безопасный контекст. `http://localhost` подходит для локального тестирования, а для `http://192.168.x.x` и других адресов локальной сети обычно требуется HTTPS. Если заголовки есть, но `window.crossOriginIsolated` по-прежнему `false`, проверьте, не открывается ли страница по обычному HTTP с адреса, отличного от loopback. + +Предварительно сжатым файлам `.wasm.gz` и `.data.gz` также нужен правильный `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Убедитесь, что `mod_headers` включён: `sudo a2enmod headers` + +### Отказано в доступе + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/ru/self-hosting/aws.md b/docs/ru/self-hosting/aws.md new file mode 100644 index 00000000..357ab7f9 --- /dev/null +++ b/docs/ru/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Развёртывание на AWS S3 + CloudFront + +Размещение BentoPDF на AWS для максимального контроля и масштабируемости. + +## Архитектура + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Шаг 1: создайте S3-бакет + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Шаг 2: сборка и загрузка + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Шаг 3: создайте дистрибутив CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Или воспользуйтесь консолью AWS: + +1. Откройте CloudFront → Create distribution +2. Origin domain: выберите свой S3-бакет +3. Включите "Origin Access Control" +4. Default root object: `index.html` +5. Создайте дистрибутив + +## Шаг 3b: политика заголовков ответа (обязательна для LibreOffice WASM) + +Конвертации на основе LibreOffice (Word, Excel, PowerPoint в PDF) требуют `SharedArrayBuffer`, для которого нужны определённые заголовки ответа. Создайте политику заголовков ответа CloudFront (Response Headers Policy): + +1. Откройте CloudFront → Policies → Response headers +2. Создайте собственную политику с такими заголовками: + +| Заголовок | Значение | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Привяжите политику к default cache behavior вашего дистрибутива + +Или через CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Шаг 3c: метаданные S3 для предварительно сжатых файлов WASM + +Файлы LibreOffice WASM предварительно сжаты (`.wasm.gz`, `.data.gz`). Задайте правильные Content-Type и Content-Encoding, чтобы браузеры их распаковывали: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Важно +Без политики заголовков ответа `SharedArrayBuffer` недоступен, и конвертации LibreOffice WASM зависнут примерно на 55%. Без правильного Content-Encoding у файлов `.gz` браузер получает необработанные байты gzip, и компиляция WASM завершается ошибкой. +::: + +## Шаг 4: политика S3-бакета + +Разрешите CloudFront доступ к бакету: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Шаг 5: собственные страницы ошибок + +Настройте возврат `index.html` при 404 для маршрутизации SPA: + +1. CloudFront → Error pages +2. Создайте собственный ответ на ошибку: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Оценка стоимости + +| Ресурс | Ориентировочная стоимость | +| -------------------------- | ------------------------- | +| S3 Storage (~500MB) | ~$0.01/мес. | +| CloudFront (1TB transfer) | ~$85/мес. | +| CloudFront (10GB transfer) | ~$0.85/мес. | + +::: tip +Используйте S3 Intelligent Tiering, чтобы снизить расходы на редко запрашиваемые файлы. +::: + +## Автоматизация с Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/ru/self-hosting/cloudflare.md b/docs/ru/self-hosting/cloudflare.md new file mode 100644 index 00000000..a0803963 --- /dev/null +++ b/docs/ru/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Развёртывание на Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) предлагает быстрый глобальный хостинг статических сайтов с неограниченным трафиком. + +## Быстрое развёртывание + +1. Откройте [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Нажмите "Create a project" +3. Подключите свой репозиторий GitHub + +## Настройка сборки + +| Параметр | Значение | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Переменные окружения + +Добавьте их в Settings → Environment variables: + +| Переменная | Значение | +| ----------------------- | ----------------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (необязательно) | +| `VITE_BRAND_NAME` | Своё название бренда (необязательно) | +| `VITE_BRAND_LOGO` | Путь к логотипу относительно `public/` (необязательно) | +| `VITE_FOOTER_TEXT` | Свой текст подвала/копирайта (необязательно) | +| `VITE_DEFAULT_LANGUAGE` | Язык интерфейса по умолчанию, например `fr` (необязательно) | + +## Файл конфигурации + +Создайте `_headers` в папке `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Важно +Заголовки `Cross-Origin-Embedder-Policy` и `Cross-Origin-Opener-Policy` обязательны для конвертации Word/ODT/Excel/PowerPoint в PDF. Без них `SharedArrayBuffer` недоступен, и движок LibreOffice WASM не сможет инициализироваться. +::: + +Создайте `_redirects` для маршрутизации SPA: + +``` +/* /index.html 200 +``` + +## Собственный домен + +1. Откройте свой проект Pages +2. Нажмите "Custom domains" +3. Добавьте свой домен +4. Cloudflare автоматически настроит DNS, если домен находится в Cloudflare + +## Преимущества + +- **Бесплатный неограниченный трафик** +- **Глобальная CDN** с более чем 300 узлами +- **Автоматический HTTPS** +- **Предпросмотр развёртываний** для pull request +- **Быстрые сборки** + +## Устранение неполадок + +### Загрузка больших файлов + +Cloudflare Pages поддерживает файлы размером до 25 МБ. Модули WASM должны проходить, но если вы упрётесь в лимит, попробуйте: + +```bash +# Split large files during build +npm run build +``` + +### Ограничения размера Worker + +Если вы используете Cloudflare Workers для сложной маршрутизации, учтите лимит 1 МБ на бесплатных тарифах. + +## CORS-прокси Worker (для цифровых подписей) + +Инструменту цифровой подписи нужен CORS-прокси для получения цепочек сертификатов. Разверните входящий в комплект worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Функции безопасности + +| Функция | Описание | +| ------------------------- | ----------------------------------- | +| **Ограничение URL** | Разрешены только URL сертификатов | +| **Лимит размера файла** | Максимум 10 МБ на запрос | +| **Ограничение частоты** | 60 запросов/IP/мин (нужен KV) | +| **Блокировка частных IP** | Блокирует localhost и внутренние IP | + +### Включение ограничения частоты + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Сборка с URL прокси + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Или с Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Примечание:** настройку подписи HMAC смотрите в [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required). diff --git a/docs/ru/self-hosting/cors-proxy.md b/docs/ru/self-hosting/cors-proxy.md new file mode 100644 index 00000000..a421e684 --- /dev/null +++ b/docs/ru/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-прокси для получения сертификатов + +Инструмент цифровой подписи использует CORS-прокси для получения сертификатов издателей у внешних удостоверяющих центров (CA). Это нужно, потому что многие серверы CA не добавляют заголовки CORS в ответы, и браузер не может запросить сертификаты напрямую. + +Кроме того, многие серверы CA отдают сертификаты по обычному HTTP. Если ваш экземпляр BentoPDF работает по HTTPS, браузеры блокируют такие HTTP-запросы (политика смешанного содержимого). CORS-прокси решает обе проблемы: запросы идут через HTTPS-endpoint с нужными заголовками. + +## Как это работает + +При подписании PDF сертификатом: + +1. Библиотека `zgapdfsigner` пытается построить полную цепочку сертификатов +2. Она запрашивает сертификаты издателей по URL из расширения AIA (Authority Information Access) вашего сертификата +3. Эти запросы идут через CORS-прокси, который добавляет нужные заголовки `Access-Control-Allow-Origin` +4. Прокси возвращает данные сертификата в браузер + +## Собственный CORS-прокси + +Если вы размещаете BentoPDF у себя, для работы цифровых подписей с сертификатами, которым нужна загрузка цепочки, потребуется развернуть собственный CORS-прокси. + +### Вариант 1: Cloudflare Workers (рекомендуется) + +1. **Установите Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Войдите в Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Клонируйте BentoPDF и обновите разрешённые источники**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Откройте `cors-proxy-worker.js` и замените массив `ALLOWED_ORIGINS` на свой домен: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Важно + Без этого изменения прокси отклонит все запросы с вашего сайта с ошибкой **403 Forbidden**. По умолчанию разрешены только запросы с `bentopdf.com`. + ::: + +4. **Разверните прокси**: + + ```bash + wrangler deploy + ``` + + Запомните URL своего worker (например, `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Пересоберите BentoPDF с URL прокси**: + + Если вы используете Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Если вы собираете из исходников: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Вариант 2: собственный серверный прокси + +Можно создать и собственный endpoint прокси. Требования: + +1. Принимать GET-запросы с параметром запроса `url` +2. Запрашивать этот URL со своего сервера (на стороне сервера ограничений CORS нет) +3. Возвращать ответ с такими заголовками: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Пример реализации на Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Вопросы безопасности + +В поставляемом Cloudflare Worker предусмотрено несколько мер безопасности: + +| Функция | Описание | +| --------------------------- | ------------------------------------------------------------------------------------------------ | +| **Проверка источника** | Разрешает запросы только с доменов из `ALLOWED_ORIGINS` | +| **Ограничение URL** | Разрешает только URL сертификатов (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Блокировка частных IP** | Блокирует частные диапазоны IPv4/IPv6, link-local, loopback, десятичные IP и облачные метаданные | +| **Безопасный Content-Type** | Возвращает только безопасные MIME-типы сертификатов, блокирует подмену content-type источником | +| **Лимит размера файла** | Передаёт ответ потоком с лимитом 10 МБ и прерывает загрузку при превышении | +| **Ограничение частоты** | 60 запросов в минуту на IP или IPv6 /64 (нужен KV, при ошибках KV пропускает запросы) | +| **Подписи HMAC** | Необязательная подпись на стороне клиента (сдерживает случайные злоупотребления) | + +### DNS rebinding (хостинг вне Cloudflare) + +Worker отклоняет любой URL, который разрешается в частный или внутренний IP. Фиксированный список разрешённых хостов использовать нельзя, так как URL цепочек сертификатов указывают на тот CA, который выдал сертификат (FNMT, корпоративные CA и так далее), и адреса заранее неизвестны. Поэтому остаётся небольшое окно для rebinding: тот, кто управляет DNS своего домена, может отдать проверке безопасности публичный IP, а настоящему запросу чуть позже частный. + +В Cloudflare это не эксплуатируется: Workers не могут обращаться к частным IP и endpoint метаданных `169.254.169.254`, поэтому rebind ни к чему не приведёт. Только не давайте worker доступа внутрь: не подключайте Tunnel, Service или привязку к частной сети (ему нужен лишь `RATE_LIMIT_KV`). + +Если вы запускаете его вне Cloudflare (workerd, Node и подобное) внутри VPC, среда _может_ обращаться к внутренним IP. Поставьте перед ней исходящий файрвол и заблокируйте частные диапазоны: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` и их аналоги IPv6. Код приложения не может этого обеспечить, когда вы вне Cloudflare. + +## Отключение прокси + +Если CORS-прокси вам не нужен, задайте переменной окружения пустую строку: + +``` +VITE_CORS_PROXY_URL= +``` + +**Примечание**: без прокси подпись сертификатами, которым нужна внешняя загрузка цепочки (например, FNMT или некоторые корпоративные CA), завершится ошибкой "Failed to fetch". + +## Устранение неполадок + +### "Signing error: TypeError: Failed to fetch" + +Обычно это означает одно из двух: + +1. **CORS-прокси не настроен**: задайте `VITE_CORS_PROXY_URL` и пересоберите проект +2. **Смешанное содержимое заблокировано**: ваш сайт работает по HTTPS, а URL издателя сертификата по HTTP. CORS-прокси решает эту проблему. +3. **CORS-прокси отклоняет ваш источник**: проверьте, что ваш домен есть в массиве `ALLOWED_ORIGINS` в `cors-proxy-worker.js` + +### "403 Forbidden" от прокси + +Вашего домена нет в списке `ALLOWED_ORIGINS`. Отредактируйте `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Затем разверните заново: `npx wrangler deploy` + +### Проверка прокси + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Сертификаты, работающие без прокси + +Некоторые сертификаты содержат полную цепочку в файле P12/PFX и не требуют внешней загрузки: + +- Самоподписанные сертификаты +- Некоторые коммерческие CA, которые включают промежуточные сертификаты +- Сертификаты, для которых вы вручную собрали полную цепочку diff --git a/docs/ru/self-hosting/docker.md b/docs/ru/self-hosting/docker.md new file mode 100644 index 00000000..c100248a --- /dev/null +++ b/docs/ru/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Развёртывание с Docker / Podman + +Самый простой способ развернуть BentoPDF у себя в рабочей среде. + +> [!IMPORTANT] +> **Обязательные заголовки для конвертации файлов Office** +> +> Инструментам на основе LibreOffice (конвертация Word, Excel, PowerPoint) для поддержки `SharedArrayBuffer` нужны такие HTTP-заголовки: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Страница также должна отдаваться из безопасного контекста. `http://localhost` подходит для локального тестирования, а `http://192.168.x.x` и другие адреса локальной сети обычно под это не подпадают, поэтому конвертация Office по обычному HTTP не сработает, даже если заголовки есть. +> +> Официальные образы контейнеров включают эти заголовки. Если вы используете обратный прокси (Traefik, Caddy и т. д.), убедитесь, что эти заголовки сохраняются или добавляются, и используйте HTTPS для доступа не через loopback. + +> [!TIP] +> **Пользователям Podman:** все команды `docker` работают и с Podman, если заменить `docker` на `podman`, а `docker-compose` на `podman-compose`. + +## Быстрый старт + +> [!TIP] +> BentoPDF выпускается в двух сборках: +> +> - **Сборка Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Все PDF-инструменты **без** маркетинговой обвязки (без главного экрана, FAQ, отзывов и подвала). Используйте её для внутренних, командных и корпоративных развёртываний. Это **не** урезанная «лёгкая» версия. +> - **Сборка Commercial**: `ghcr.io/alam00000/bentopdf:latest`. Полный маркетинговый сайт, который использует сам bentopdf.com и владельцы коммерческой лицензии для публичных развёртываний. +> +> Если сомневаетесь, берите сборку Self-Hosted. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Создайте `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Запустите: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Собственный образ + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Соберите и запустите: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Переменные окружения + +| Переменная | Описание | По умолчанию | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Собрать вариант Self-Hosted (скрывает маркетинговую обвязку bentopdf.com: главный экран, FAQ, отзывы, подвал). Все PDF-инструменты остаются. | `false` | +| `BASE_URL` | Развёртывание в подкаталог | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL модуля PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL модуля Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL модуля CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL скрипта воркера OCR | _(пусто; CDN Tesseract.js по умолчанию)_ | +| `VITE_TESSERACT_CORE_URL` | Каталог основного рантайма OCR | _(пусто; CDN Tesseract.js по умолчанию)_ | +| `VITE_TESSERACT_LANG_URL` | Каталог traineddata для OCR | _(пусто; CDN Tesseract.js по умолчанию)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Языки OCR через запятую, показываемые в интерфейсе | _(пусто; показать весь каталог)_ | +| `VITE_OCR_FONT_BASE_URL` | Каталог шрифтов текстового слоя OCR | _(пусто; удалённые URL шрифтов Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Язык интерфейса по умолчанию | `en` | +| `VITE_BRAND_NAME` | Своё название бренда | `BentoPDF` | +| `VITE_BRAND_LOGO` | Путь к логотипу относительно `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Свой текст подвала/копирайта | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID инструментов через запятую, которые нужно скрыть | _(пусто; все инструменты включены)_ | +| `DISABLE_GITHUB_STARS` | Пропускать запрос числа звёзд GitHub при загрузке страницы и убирать `api.github.com` из CSP. Сборки Simple Mode всегда его пропускают. | `false` | +| `SITE_URL` | Публичный URL, записываемый в canonical, hreflang и ссылки sitemap. Оставьте значение по умолчанию, если не хотите, чтобы поисковые системы считали ваше развёртывание отдельным сайтом. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | При собственном `SITE_URL` каждая страница помечается `noindex`, чтобы ваша копия не конкурировала с bentopdf.com в поисковой выдаче. Задайте `true`, чтобы разрешить индексацию. | `false` | + +URL модулей WASM заранее настроены на значения CDN по умолчанию, поэтому все расширенные функции работают сразу. Переопределите их для изолированных (air-gapped) или самостоятельно размещаемых развёртываний. + +### Поисковые системы + +По умолчанию каждая страница указывает поисковым системам на bentopdf.com как на оригинал, поэтому ваше развёртывание не считается дубликатом. Для частного или внутреннего экземпляра ничего менять не нужно. + +- **Полностью скрыть экземпляр из поисковой выдачи:** запустите контейнер с `-e ROBOTS_NOINDEX=true`. Нужен только перезапуск, пересборка не требуется. +- **Сделать экземпляр отдельным сайтом в поисковой выдаче:** соберите с `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Без `ALLOW_INDEXING=true` собственный `SITE_URL` помечает каждую страницу как `noindex`. + +### Content-Security-Policy + +Образ nginx поставляется с действующим заголовком `Content-Security-Policy`. Директивы CSP `script-src`, `connect-src` и `font-src` **генерируются при сборке** из перечисленных выше переменных URL `VITE_*`: все хосты, которые вы передаёте через `--build-arg`, автоматически добавляются в политику. + +Как следствие: + +- Если вы переопределяете `VITE_CORS_PROXY_URL` или `VITE_WASM_*_URL` при сборке, CSP автоматически разрешает эти источники, дополнительная настройка не нужна. +- Для URL на `cdn.jsdelivr.net` директива `script-src` разрешает только точную папку пакета с версией, например `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, а не весь CDN. jsDelivr раздаёт любой публичный пакет npm или репозиторий GitHub, поэтому разрешение всего хоста позволило бы запускать любой из них на вашем экземпляре. URL на любых других хостах разрешаются по источнику (origin). +- Если вы задаёте собственные URL WASM во _время работы_ на странице расширенных настроек приложения, эти источники **не** попадают в CSP, и браузер заблокирует запросы к ним. Это относится и к другой версии того же пакета на `cdn.jsdelivr.net`, так как разрешена только версия, заданная при сборке. Настройка во время работы предназначена для экспериментов; для постоянных собственных URL задайте соответствующий аргумент сборки `VITE_*`. +- В изолированных развёртываниях, где переопределены все три значения `VITE_WASM_*_URL`, из CSP также удаляются эти папки пакетов `cdn.jsdelivr.net` (каждое значение по умолчанию заменяется, а не дополняется). Значения Tesseract OCR по умолчанию на `cdn.jsdelivr.net` остаются в политике, пока вы не зададите и три значения `VITE_TESSERACT_*`. Аналогично, задание `VITE_CORS_PROXY_URL` заменяет публичное значение по умолчанию `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP включает `'unsafe-eval'` в `script-src`, потому что среда LibreOffice WASM (используется инструментами конвертации Word/Excel/PowerPoint) и библиотека изображений wasm-vips (используется для PDF в TIFF) компилируют внутренний диспетчерский код через `new Function()`. Если убрать его, эти инструменты перестанут работать. Если вы собираете в `SIMPLE_MODE` (без LibreOffice) и PDF в TIFF вам не нужен, можно вручную отредактировать сгенерированный `security-headers.conf` и убрать `'unsafe-eval'` для более строгой политики. + +Для OCR оставьте переменные `VITE_TESSERACT_*` пустыми, чтобы использовать онлайн-ресурсы по умолчанию, или задайте все три вместе для OCR на своём сервере или офлайн. Частичное переопределение отклоняется, потому что воркер, основной рантайм и каталог traineddata должны соответствовать друг другу. Для полностью офлайнового вывода PDF с возможностью поиска также задайте `VITE_OCR_FONT_BASE_URL`, чтобы шрифты текстового слоя OCR загружались с вашего внутреннего сервера, а не по публичным URL Noto. + +`VITE_DEFAULT_LANGUAGE` задаёт язык интерфейса для новых посетителей. Поддерживаемые значения: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Пользователи по-прежнему могут переключать язык: меняется только значение по умолчанию. + +Пример: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Свой брендинг + +Замените стандартные логотип, название и текст подвала BentoPDF своими. Поместите файл логотипа в папку `public/` (или используйте существующее изображение), затем передайте переменные брендинга при сборке: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Брендинг работает и в полном режиме, и в Simple Mode, и сочетается со всеми остальными параметрами сборки. + +### Отключение отдельных инструментов + +Скройте инструменты в интерфейсе по требованиям соответствия или безопасности. Отключённые инструменты удаляются с главной страницы, из результатов поиска, сочетаний клавиш и конструктора рабочих процессов. При прямом переходе по URL показывается страница «инструмент недоступен». + +ID инструмента: URL страницы без `.html`. Например, если инструмент находится по адресу `bentopdf.com/edit-pdf.html`, его ID равен `edit-pdf`. + +#### Как найти ID инструментов + +Проще всего открыть любой инструмент в BentoPDF и посмотреть на URL. Последняя часть пути (без `.html`) и есть ID инструмента. + +
+Полный список ID инструментов + +**Правка и аннотации:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Конвертация в PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Конвертация из PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Организация и управление:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Оптимизация и восстановление:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Безопасность:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Вариант 1: при сборке (аргумент сборки Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Список отключённых инструментов встраивается в JavaScript-бандл. Для изменения нужна пересборка. + +#### Вариант 2: во время работы (config.json) + +Смонтируйте файл `config.json` в раздаваемый каталог, пересборка не нужна: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Или с Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Оба способа можно сочетать: списки объединяются. Если инструмент указан в любом из них, он отключён. + +#### Отключение функций редактора + +Можно также отключить отдельные функции внутри PDF-редактора (например, скрытие данных, аннотации, формы), не отключая весь инструмент редактора. Добавьте `editorDisabledCategories` в свой `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Полный список категорий редактора + +**Масштаб:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Аннотации:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Фигуры:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Формы:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Скрытие данных:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Документ:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Страница:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Панель:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Инструменты:** `tools`, `pan`, `pointer`, `capture` + +**Выделение:** `selection`, `selection-copy` + +**История:** `history`, `history-undo`, `history-redo` + +
+ +Категории иерархичны: отключение родительской (например, `annotation`) отключает все дочерние. + +### Отключение счётчика звёзд GitHub + +В навигационной панели показывается актуальное число звёзд GitHub, которое запрашивается с `api.github.com` при загрузке страницы. Это единственный внешний запрос, не связанный с PDF-функциями. Отключите его при сборке, чтобы убрать код запроса из бандла и исключить `api.github.com` из Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Сборки Simple Mode (`bentopdf-simple`) всегда пропускают счётчик звёзд: этот флаг нужен только для сборки Commercial или собственных полных сборок. + +### Собственные URL WASM (изолированная среда / свой хостинг) + +> [!IMPORTANT] +> URL WASM встраиваются в JavaScript **при сборке**. Файлы WASM скачиваются **браузером пользователя** во время работы: Docker не загружает их при сборке. Для изолированных сетей нужно разместить файлы WASM на внутреннем сервере, доступном браузерам. + +**Полный процесс для изолированной среды:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Используйте коды, которые выводит `bash scripts/prepare-airgap.sh --list-ocr-languages`, или ищите по названию через `bash scripts/prepare-airgap.sh --search-ocr-language `, для `--ocr-languages`. Когда вы собираете с ограниченным набором языков OCR, передайте те же коды в `VITE_TESSERACT_AVAILABLE_LANGUAGES`, чтобы приложение показывало только включённые языки. Для полностью офлайнового вывода OCR также разместите поставляемый каталог `ocr-fonts/` и укажите на него `VITE_OCR_FONT_BASE_URL`. + +Задайте переменной пустую строку, чтобы отключить этот модуль (пользователям придётся настроить его вручную в расширенных настройках). + +## Свой порт + +По умолчанию BentoPDF слушает порт `8080` внутри контейнера. Чтобы изменить его, задайте переменную окружения `PORT` во время работы: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Переменная | Описание | По умолчанию | +| ---------- | ----------------------- | ------------ | +| `PORT` | Порт Nginx в контейнере | `8080` | + +Это работает и со стандартным, и с nonroot-Dockerfile. + +## Свой ID пользователя (PUID/PGID) + +Для сред, где нужен запуск от конкретного непривилегированного пользователя (NAS-устройства, Kubernetes с контекстами безопасности, организационные политики), BentoPDF предоставляет отдельный Dockerfile с поддержкой PUID/PGID в стиле LSIO. + +### Сборка и запуск + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Переменные окружения + +| Переменная | Описание | По умолчанию | +| -------------- | --------------------------- | ------------ | +| `PUID` | ID пользователя для запуска | `1000` | +| `PGID` | ID группы для запуска | `1000` | +| `PORT` | Порт Nginx | `8080` | +| `DISABLE_IPV6` | Отключить слушатель IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Как это работает + +Контейнер стартует от root, создаёт пользователя с заданными PUID/PGID, меняет владельца всех каталогов с правом записи, затем сбрасывает привилегии через `su-exec`. Процесс nginx работает целиком от указанного вами пользователя. + +> [!NOTE] +> Стандартный `Dockerfile` использует `nginx-unprivileged` (UID 101) и рекомендуется для большинства развёртываний. Используйте `Dockerfile.nonroot` только когда нужен конкретный UID/GID. + +> [!WARNING] +> PUID/PGID не могут быть равны `0` (root). Точка входа проверяет значения и завершится с ошибкой при недопустимых. + +## С Traefik (обратный прокси) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## С Caddy (обратный прокси) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Ограничения ресурсов + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (интеграция с systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) позволяет запускать контейнеры Podman как службы systemd. Это идеально подходит для рабочих развёртываний в Linux. + +### Базовая настройка Quadlet + +Создайте файл юнита контейнера `~/.config/containers/systemd/bentopdf.container` (пользовательский) или `/etc/containers/systemd/bentopdf.container` (системный): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Включение и запуск + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Для общесистемного развёртывания используйте `systemctl` без флага `--user` и поместите файл в `/etc/containers/systemd/`. + +### Quadlet с проверкой работоспособности + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Автообновление с Quadlet + +Podman может автоматически обновлять контейнеры, когда появляются новые образы: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Сетевая конфигурация Quadlet + +Для собственной сетевой конфигурации создайте файл сети `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Затем сошлитесь на него в файле контейнера: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Обновление + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/ru/self-hosting/hostinger.md b/docs/ru/self-hosting/hostinger.md new file mode 100644 index 00000000..ba9b67f2 --- /dev/null +++ b/docs/ru/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Развёртывание на Hostinger + +[Hostinger](https://hostinger.com) популярный провайдер виртуального хостинга. Это руководство описывает развёртывание BentoPDF на виртуальном хостинге Hostinger. + +## Требования + +- Тариф хостинга Hostinger с доступом к файловому менеджеру +- Node.js, установленный локально для сборки + +## Шаг 1: соберите проект + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Готовые файлы будут в папке `dist`. + +## Шаг 2: загрузите на Hostinger + +### Развёртывание в корне домена + +1. Войдите в свой аккаунт Hostinger +2. Откройте **File Manager** → **public_html** +3. **Удалите** все существующие файлы (при необходимости сделайте резервную копию) +4. **Загрузите** всё содержимое локальной папки `dist` в `public_html` + +### Развёртывание в подкаталоге + +Если вы развёртываете в подкаталог (например, `yourdomain.com/pdf-tools/`): + +1. Соберите проект с правильным базовым URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Создайте папку на Hostinger: + - Откройте **File Manager** → **public_html** + - Создайте новую папку: `pdf-tools` +3. Загрузите всё содержимое `dist` в `public_html/pdf-tools/` + +## Шаг 3: создайте файл .htaccess + +Создайте файл `.htaccess` в корне папки развёртывания (`public_html` или `public_html/pdf-tools/`): + +::: warning Важно +При развёртывании в подкаталог замените `RewriteBase /` на `RewriteBase /pdf-tools/` (или имя вашей папки). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Пример .htaccess для подкаталога + +Для `yourdomain.com/pdf-tools/` измените такие строки: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Устранение неполадок + +### Файлы WASM не загружаются + +Убедитесь, что MIME-типы правильно заданы в `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Инструменты LibreOffice не работают + +Заголовки безопасности критически важны для SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Если заголовки не применяются, обратитесь в поддержку Hostinger, чтобы включить `mod_headers`. + +### Ошибки 404 при обновлении страницы + +Убедитесь, что правило для расширения `.html` и языковые маршруты настроены правильно. BentoPDF использует статические HTML-файлы, а не маршрутизацию SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Ограничения на загрузку файлов + +У Hostinger могут быть ограничения на размер файлов. Если массовая загрузка не удаётся, загружайте файлы WASM отдельно. diff --git a/docs/ru/self-hosting/index.md b/docs/ru/self-hosting/index.md new file mode 100644 index 00000000..ca96cf76 --- /dev/null +++ b/docs/ru/self-hosting/index.md @@ -0,0 +1,538 @@ +# Руководство по самостоятельному размещению + +BentoPDF можно разместить на собственной инфраструктуре. В этом руководстве описаны разные варианты развертывания. + +## Быстрый старт с Docker / Podman + +Самый быстрый способ разместить BentoPDF у себя: + +> [!TIP] +> BentoPDF поставляется в двух сборках: +> +> - **Сборка для самостоятельного размещения**: `ghcr.io/alam00000/bentopdf-simple:latest`. Все инструменты PDF, **без** маркетингового оформления (без главного экрана, FAQ, отзывов и подвала). Используйте ее для внутренних развертываний в команде или организации. Это **не** урезанная «облегченная» версия. +> - **Коммерческая сборка**: `ghcr.io/alam00000/bentopdf:latest`. Полный маркетинговый сайт, который использует сам bentopdf.com и держатели коммерческих лицензий для публичных развертываний. +> +> Если сомневаетесь, берите сборку для самостоятельного размещения. + +> [!IMPORTANT] +> Для конвертации офисных файлов нужен `SharedArrayBuffer`, а значит, приложение должно быть изолировано между источниками (cross-origin isolated) и раздаваться из защищенного контекста. Официальный образ уже отправляет нужные заголовки COOP/COEP, но браузеры все равно отключают `SharedArrayBuffer` на обычных HTTP-адресах в локальной сети, например `http://192.168.x.x`. +> +> Используйте `http://localhost` только для проверки на одном устройстве. Если пользователи открывают BentoPDF по IP-адресу или имени хоста в локальной сети, настройте HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Или с помощью Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Запустите BentoPDF как службу systemd. Создайте `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Полную документацию по Quadlet смотрите в [руководстве по развертыванию Docker](/ru/self-hosting/docker). + +## Сборка из исходного кода + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Параметры конфигурации + +### Сборка для самостоятельного размещения (Simple Mode) + +Сборка для самостоятельного размещения (образ `bentopdf-simple`, также называемая Simple Mode) **функционально идентична** коммерческой сборке: все инструменты PDF на месте и работают одинаково. Она лишь скрывает маркетинговое оформление, которое имеет смысл только на самом bentopdf.com или в коммерческом публичном развертывании. **Это не урезанная и не «облегченная» версия.** + +**Что скрывает сборка для самостоятельного размещения** (только оформление, функции PDF не удаляются): + +- Панель навигации, главный экран, раздел возможностей, FAQ, отзывы, подвал +- Заголовок страницы меняется на «Инструменты PDF» + +**Что сохраняет сборка для самостоятельного размещения** (все, что реально работает с PDF): + +- Все инструменты PDF (объединение, разделение, редактирование, подпись, OCR, конвертация офисных файлов и т. д.) +- Поддержку собственного брендинга, всю конфигурацию на этапе сборки и во время работы + +Коммерческая сборка (`ghcr.io/alam00000/bentopdf:latest`) лежит в основе самого bentopdf.com, и ее используют держатели коммерческих лицензий для публичных развертываний. Она добавляет главный экран, FAQ, отзывы и подвал, которые не нужны во внутреннем инструменте. + +Если вы размещаете BentoPDF для своей команды, организации или как внутренний инструмент, берите сборку для самостоятельного размещения: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Подробности смотрите в [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md). + +### Коммерческая сборка (публичные развертывания под вашим брендом) + +Коммерческая сборка (образ `bentopdf`, без суффикса `-simple`) лежит в основе самого bentopdf.com. Она включает полный маркетинговый сайт (главный экран, возможности, FAQ, отзывы, подвал) в дополнение ко всем инструментам PDF. Используйте эту сборку, когда хотите **развернуть BentoPDF как публичный сервис PDF под собственным брендом**, например: + +- Вы запускаете BentoPDF как размещаемый SaaS для конечных пользователей на своем домене +- Вам нужна посадочная страница (маркетинговые разделы плюс инструменты), а не только сами инструменты +- Вы держатель коммерческой лицензии и встраиваете BentoPDF в коммерческий продукт + +**Запустите как есть** (с брендингом BentoPDF, удобно для предпросмотра сборки): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Соберите со своим брендом** (типичный коммерческий сценарий): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Все остальные параметры времени сборки (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, переопределения URL для WASM и т. д.) работают так же, как в сборке для самостоятельного размещения. + +::: warning Лицензирование +Запуск коммерческой сборки разрешен по любому из двух вариантов лицензии BentoPDF: + +- **AGPL-3.0** (бесплатно): допускается, если ваше развертывание публикует весь исходный код под AGPL, включая любые изменения брендинга и окружающую бизнес-логику. +- **Коммерческая лицензия** (79 $ навсегда): требуется для закрытых и проприетарных развертываний, где вы не публикуете исходный код своего форка с брендингом или бизнес-код. + +Полное сравнение смотрите на [странице лицензирования](https://www.bentopdf.com/licensing). Модули WASM под лицензией AGPL (PyMuPDF, Ghostscript, CoherentPDF) загружаются из CDN во время работы, поэтому они не попадают в ваш образ и не меняют ваш лицензионный статус. +::: + +### Базовый URL + +Развертывание в подкаталоге: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Собственный брендинг + +Замените стандартные логотип, название и текст подвала BentoPDF на свои при сборке: + +| Переменная | Описание | По умолчанию | +| ------------------ | -------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Название бренда в заголовке и подвале | `BentoPDF` | +| `VITE_BRAND_LOGO` | Путь к логотипу относительно `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Свой текст подвала и авторских прав | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Или через Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Брендинг работает как в полном режиме, так и в Simple Mode и сочетается со всеми остальными параметрами времени сборки (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Отключение отдельных инструментов + +Скрывайте отдельные инструменты ради соответствия требованиям или безопасности. Отключенные инструменты удаляются с главной страницы, из поиска, быстрых клавиш, конструктора рабочих процессов и недоступны по прямому URL. + +Идентификаторы инструментов совпадают с URL страницы без `.html`: откройте любой инструмент и посмотрите на адрес (например, `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Во время сборки** (вшивается в бандл): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Во время работы** (пересборка не нужна, смонтируйте `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Оба способа можно сочетать: списки объединяются. + +Вы также можете отключить отдельные функции внутри редактора PDF (например, редактирование с удалением данных), не отключая инструмент целиком, добавив `editorDisabledCategories` в `config.json`. Полный список категорий смотрите в [руководстве по Docker](/ru/self-hosting/docker#отключение-функции-редактора). + +## Руководства по развертыванию + +Выберите платформу: + +- [Vercel](/ru/self-hosting/vercel) +- [Netlify](/ru/self-hosting/netlify) +- [Cloudflare Pages](/ru/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/ru/self-hosting/aws) +- [Hostinger](/ru/self-hosting/hostinger) +- [Nginx](/ru/self-hosting/nginx) +- [Apache](/ru/self-hosting/apache) +- [Docker](/ru/self-hosting/docker) +- [Kubernetes](/ru/self-hosting/kubernetes) +- [CORS-прокси](/ru/self-hosting/cors-proxy) - необходим для цифровых подписей + +## Частые проблемы + +### Конвертация Word / ODT / Excel / PowerPoint в PDF зависает (SharedArrayBuffer недоступен) + +**Симптом**: конвертация документов через LibreOffice (Word, ODT, Excel, PowerPoint в PDF) зависает примерно на 55% или не запускается. В консоли браузера может быть: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…или `window.crossOriginIsolated` возвращает `false`, или компиляция WASM сообщает `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Причина**: LibreOffice WASM требует `SharedArrayBuffer`, который браузер включает, только когда страница **изолирована между источниками (cross-origin isolated)** И раздается из **защищенного контекста**. Для этого должны выполняться два условия: + +1. В каждом ответе есть оба заголовка: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Страница раздается по `https://...` или `http://localhost`. Обычный HTTP на IP-адресе в локальной сети (например, `http://192.168.x.x`) защищенным НЕ считается: браузеры отключают там `SharedArrayBuffer`. + +Несовпадение `00 61 73 6d / 1f 8b 08 08` является отдельным подсимптомом: у предварительно сжатых файлов `.wasm.gz` / `.data.gz` нет заголовка ответа `Content-Encoding: gzip`, поэтому браузер получает необработанные байты gzip вместо распакованного WASM. + +**Решение**: точную конфигурацию смотрите в руководстве для вашей платформы: + +- [Nginx →](/ru/self-hosting/nginx#конвертация-word-odt-excel-в-pdf-не-работает) +- [Apache →](/ru/self-hosting/apache#конвертация-word-odt-excel-в-pdf-не-работает) +- [AWS S3 + CloudFront →](/ru/self-hosting/aws#шаг-3b-политика-заголовков-ответа-обязательна-для-libreoffice-wasm) +- [Cloudflare Pages →](/ru/self-hosting/cloudflare#фаил-конфигурации) (файл `_headers`) +- [Netlify →](/ru/self-hosting/netlify#конвертация-word-odt-excel-в-pdf-зависает-на-55) (`netlify.toml`) +- [Vercel →](/ru/self-hosting/vercel#конвертация-word-odt-excel-в-pdf-не-работает) (`vercel.json`) +- [Hostinger →](/ru/self-hosting/hostinger#инструменты-libreoffice-не-работают) (`.htaccess`) +- [Kubernetes →](/ru/self-hosting/kubernetes#сохранение-заголовков-sharedarraybuffer-ingress-gateway) +- **Docker**: обрабатывается автоматически встроенной конфигурацией nginx, никаких действий не требуется. + +**Проверка**: откройте консоль DevTools на любой странице BentoPDF и выполните: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Если страница раздается по HTTPS или `http://localhost` И оба заголовка COEP/COOP присутствуют в каждом ответе, обе проверки пройдут. Если вы открываете `http://192.168.x.x` или другой HTTP-адрес не из loopback, настройте HTTPS: решения только через заголовки не существует. + +### Файлы `.mjs` отдаются как `application/octet-stream` + +**Симптом**: Sign PDF / Form Filler и некоторые другие инструменты показывают пустой просмотрщик или не загружаются. В консоли браузера: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Причина**: в вашем веб-сервере или обратном прокси нет соответствия MIME-типа для файлов `.mjs` (встроенный просмотрщик PDF поставляется с ES-модулями с таким расширением). Во многих стандартных конфигурациях для неизвестных расширений по умолчанию используется `application/octet-stream`, и браузеры отказываются выполнять такие файлы как ES-модули. + +**Решение**: нужный фрагмент смотрите в руководстве для вашей платформы: + +- [Nginx →](/ru/self-hosting/nginx#sign-pdf-или-form-filler-показывает-пустои-просмотрщик-ошибка-mime-для-mjs) +- [Apache →](/ru/self-hosting/apache#sign-pdf-или-form-filler-показывают-пустои-просмотрщик-ошибка-mime-для-mjs) +- [AWS S3 + CloudFront →](/ru/self-hosting/aws#шаг-2-сборка-и-загрузка) (см. `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/ru/self-hosting/kubernetes#ошибки-mime-типа-mjs-пустои-iframe-в-sign-pdf-form-filler) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: обрабатывается автоматически, никаких действий не требуется. + +**Проверка**: откройте DevTools → вкладка Network, найдите неудавшийся запрос `.mjs` и проверьте заголовок ответа `Content-Type`. Там должно быть `application/javascript`. Если по-прежнему `application/octet-stream`, возможно, внешний обратный прокси или CDN заново определяет тип: проверьте каждый уровень вашей цепочки. + +## Конфигурация WASM (компоненты AGPL) + +BentoPDF **не включает** библиотеки обработки под лицензией AGPL в свой исходный код, но **заранее настраивает URL CDN**, поэтому все функции работают сразу, без ручной настройки. + +::: tip Работает без настройки +Начиная с v2.0.0, модули WASM заранее настроены на загрузку из CDN jsDelivr через переменные окружения. Все расширенные функции работают сразу, без какой-либо настройки пользователем. +::: + +| Компонент | Лицензия | Возможности | +| --------------- | -------- | -------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Конвертация EPUB/MOBI/FB2/XPS, извлечение изображений и таблиц | +| **Ghostscript** | AGPL-3.0 | Конвертация в PDF/A, сжатие, выравнивание, растрирование | +| **CoherentPDF** | AGPL-3.0 | Оглавление, вложения, объединение PDF с закладками | + +### Переменные окружения по умолчанию + +Они заданы в `.env.production` и вшиваются в сборку: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Переопределение URL для WASM + +Значения по умолчанию можно переопределить при сборке для нестандартных развертываний: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Чтобы полностью отключить модуль (пользователю придется настраивать его вручную в расширенных настройках), задайте его переменной пустую строку. + +Для OCR либо оставьте все переменные `VITE_TESSERACT_*` пустыми и используйте стандартные онлайн-ресурсы, либо задайте URL воркера, ядра и языковых данных вместе для автономного OCR на своей инфраструктуре. Если вы включаете в сборку только некоторые языки OCR, задайте также `VITE_TESSERACT_AVAILABLE_LANGUAGES` с теми же кодами через запятую, чтобы интерфейс предлагал только установленные языки, а неподдерживаемый выбор завершался понятной ошибкой. Для полностью автономного создания PDF с возможностью поиска задайте также `VITE_OCR_FONT_BASE_URL` с адресом внутренней директории, где лежат встроенные шрифты OCR. + +Пользователи также могут в любой момент переопределить эти значения через **расширенные настройки** в интерфейсе: пользовательские настройки, сохраненные в браузере, имеют приоритет над значениями окружения по умолчанию. + +### Развертывание в изолированной сети / офлайн + +Для сетей без доступа в интернет (госсектор, здравоохранение, финансы и т. д.). URL для WASM вшиваются в JavaScript **при сборке**, а сами файлы WASM скачивает **браузер пользователя** во время работы. Поэтому все нужно подготовить на машине с интернетом, а затем перенести во внутреннюю сеть. + +#### Автоматический скрипт (рекомендуется) + +Входящий в состав скрипт `prepare-airgap.sh` автоматизирует весь процесс: скачивает пакеты WASM, собирает образ Docker и создает самодостаточный пакет со скриптом установки. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +В результате создается директория с пакетом: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Перенесите пакет в изолированную сеть через USB, внутренний репозиторий артефактов или другим разрешенным способом. Затем запустите входящий в него скрипт установки: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Скрипт установки загружает образ Docker, распаковывает файлы WASM и при желании запускает контейнер. + +**Параметры скрипта:** + +| Флаг | Описание | По умолчанию | +| ------------------------------ | -------------------------------------------------------------- | --------------------------------------------- | +| `--wasm-base-url ` | Где файлы WASM будут размещены внутри сети | _(обязателен, запрашивается, если не указан)_ | +| `--image-name ` | Тег образа Docker | `bentopdf` | +| `--output-dir ` | Директория для итогового пакета | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Включить Simple Mode | выкл. | +| `--base-url ` | Базовый URL подкаталога (например, `/pdf/`) | `/` | +| `--language ` | Язык интерфейса по умолчанию (например, `fr`, `de`) | _(нет)_ | +| `--brand-name ` | Свое название бренда | _(нет)_ | +| `--brand-logo ` | Путь к логотипу относительно `public/` | _(нет)_ | +| `--footer-text ` | Свой текст подвала | _(нет)_ | +| `--ocr-languages ` | Языки OCR для включения в пакет через запятую | `eng` | +| `--list-ocr-languages` | Вывести поддерживаемые коды и названия OCR и выйти | выкл. | +| `--search-ocr-language ` | Поиск кодов OCR по названию или сокращению | выкл. | +| `--dockerfile ` | Используемый Dockerfile | `Dockerfile` | +| `--skip-docker` | Пропустить сборку и экспорт Docker | выкл. | +| `--skip-wasm` | Пропустить загрузку WASM (использовать имеющиеся файлы `.tgz`) | выкл. | + +Интерактивный режим также принимает `list`, чтобы вывести полный список поддерживаемых кодов Tesseract, и `search `, чтобы найти совпадения, например `search german` или `search chi`. + +::: warning Требование одного источника +Файлы WASM должны раздаваться с **того же источника** (origin), что и приложение BentoPDF. Веб-воркеры используют `importScripts()`, который не может загружать скрипты с другого источника. Например, если BentoPDF работает на `https://internal.example.com`, базовый URL для WASM тоже должен быть `https://internal.example.com/wasm`. +::: + +#### Ручные шаги + +
+Если вы предпочитаете выполнить все вручную, без скрипта + +**Шаг 1: Скачайте пакеты WASM и OCR** (на машине с интернетом) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Шаг 2: Соберите образ Docker с внутренними URL** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Шаг 3: Экспортируйте образ Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Шаг 4: Перенесите во внутреннюю изолированную сеть** + +Скопируйте через USB, внутренний репозиторий артефактов или другой разрешенный способ передачи: + +- `bentopdf.tar`: образ Docker +- Пять пакетов `.tgz` WASM/OCR из шага 1 +- Директорию `tesseract-langdata/` из шага 1 +- Директорию `ocr-fonts/` из шага 1 + +**Шаг 5: Настройте внутри изолированной сети** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Убедитесь, что файлы доступны по URL, настроенным на шаге 2, включая `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` и `.../ocr/fonts`. + +
+ +::: info Собираете из исходного кода, а не через Docker? +Задайте переменные в `.env.production` перед запуском `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Собственный прокси для WASM + +Если нужно раздавать файлы WASM под лицензией AGPL с правильными заголовками CORS, можно развернуть простой прокси. Пример реализации смотрите в [руководстве по Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md). + +::: tip Зачем разделять? +Такое разделение обеспечивает: + +- Юридическую ясность для коммерческих пользователей +- Ядро BentoPDF остается под двойной лицензией (AGPL-3.0 / коммерческая) +- Файлы WASM загружаются во время работы и не входят в исходный код + ::: + +## Системные требования + +| Требование | Минимум | +| ---------- | ------------------------------- | +| Диск | ~100 МБ (ядро без модулей AGPL) | +| ОЗУ | 512 МБ | +| Процессор | Любой современный | + +::: tip +BentoPDF является статическим сайтом: база данных и серверная часть не нужны! +::: diff --git a/docs/ru/self-hosting/kubernetes.md b/docs/ru/self-hosting/kubernetes.md new file mode 100644 index 00000000..be5c4bd9 --- /dev/null +++ b/docs/ru/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Развертывание в Kubernetes + +Kubernetes может быть избыточен для статического сайта, но он хорошо подходит, если вы уже стандартизировали процессы на Helm и GitOps. + +> [!IMPORTANT] +> **Обязательные заголовки для конвертации офисных файлов** +> +> Инструментам на основе LibreOffice (конвертация Word, Excel, PowerPoint) для поддержки `SharedArrayBuffer` нужны следующие HTTP-заголовки: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Официальные образы BentoPDF на nginx уже отправляют эти заголовки. В Kubernetes **контроллеры Ingress и Gateway тоже являются обратными прокси**, поэтому убедитесь, что заголовки сохраняются (или добавьте их на границе). + +## Требования + +- Кластер Kubernetes +- Helm v3 +- Образ BentoPDF на nginx (например, `ghcr.io/alam00000/bentopdf:`), который работает на **порту 8080** + +## Развертывание с помощью Helm + +### Установка из этого репозитория (локальный чарт) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Установка из GHCR (чарт OCI) + +Если чарт опубликован в GHCR как артефакт OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Как открыть доступ + +### Port-forward (быстрая проверка) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (необязательно) + +Включите Ingress (пример для nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (необязательно) + +Чарт поддерживает `Gateway` и `HTTPRoute` из Gateway API. + +Пример (оператор Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Сохранение заголовков SharedArrayBuffer (Ingress/Gateway) + +### Что должно происходить + +Конфигурация nginx в BentoPDF задает нужные заголовки ответа. Большинство контроллеров Ingress и Gateway **передают заголовки ответа апстрима без изменений**. + +### Что может сломаться + +- Политика контроллера или границы, которая **переопределяет** или **удаляет** заголовки ответа +- Промежуточный слой «заголовков безопасности», который задает другие значения COOP/COEP + +### Как проверить + +Выполните команду для вашего публичного адреса: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Вы должны увидеть: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Если ваш контроллер Ingress не сохраняет заголовки + +Добавьте заголовки на границе (способ зависит от контроллера). Пример для **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Ошибки MIME-типа `.mjs` (пустой iframe в Sign PDF / Form Filler) + +Если в консоли браузера появляется `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` для запроса `.mjs`, значит контроллер Ingress или Gateway перед nginx из BentoPDF подменяет заголовок `Content-Type` апстрима на `application/octet-stream`. + +Nginx в образе BentoPDF уже отдает `.mjs` как `application/javascript`. Нужно запретить контроллеру удалять или заменять этот заголовок. Для nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Либо используйте фильтр `ResponseHeaderModifier` в Gateway API, чтобы задать `Content-Type: application/javascript` для путей `.mjs`. Проверьте на вкладке Network в DevTools: у неудавшегося запроса `.mjs` теперь должно быть `content-type: application/javascript`. + +### Если вы используете Gateway API и хотите принудительно добавить заголовки + +Gateway API поддерживает фильтр `ResponseHeaderModifier`. Его можно подключить в `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Поддержка конкретных фильтров зависит от вашего контроллера Gateway. Если фильтр игнорируется, добавьте заголовки на уровне границы или контроллера. + +## Отключение отдельных инструментов + +Используйте ConfigMap, чтобы отключать инструменты во время работы без пересборки образа: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Смонтируйте его в раздаваемую директорию: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Идентификаторы инструментов совпадают с URL страницы без `.html`: откройте любой инструмент и посмотрите на адрес (например, `edit-pdf`, `merge-pdf`, `compress-pdf`). Отключенные инструменты скрыты с главной страницы, из поиска, быстрых клавиш, конструктора рабочих процессов и недоступны по прямому URL. Полный список параметров смотрите в [руководстве по Docker](/ru/self-hosting/docker#отключение-отдельных-инструментов). diff --git a/docs/ru/self-hosting/netlify.md b/docs/ru/self-hosting/netlify.md new file mode 100644 index 00000000..49c29260 --- /dev/null +++ b/docs/ru/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Развертывание в Netlify + +[Netlify](https://netlify.com) предлагает отличный хостинг статических сайтов с щедрым бесплатным тарифом. + +## Развертывание в один клик + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Ручное развертывание + +### Шаг 1: Подключите репозиторий + +1. Войдите в [Netlify](https://app.netlify.com) +2. Нажмите «Add new site» → «Import an existing project» +3. Подключите свой аккаунт GitHub +4. Выберите свой форк BentoPDF + +### Шаг 2: Настройте параметры сборки + +| Параметр | Значение | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Шаг 3: Разверните + +Нажмите «Deploy site» и дождитесь завершения сборки. + +## Файл конфигурации + +Создайте `netlify.toml` в корне проекта: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Важно +Заголовки `Cross-Origin-Embedder-Policy` и `Cross-Origin-Opener-Policy` необходимы для конвертации Word/ODT/Excel/PowerPoint в PDF. Без них `SharedArrayBuffer` недоступен, и движок LibreOffice WASM не сможет запуститься. + +Заголовки `Content-Encoding: gzip` для файлов `.wasm.gz` и `.data.gz` указывают браузеру распаковывать их автоматически. Без них браузер получает необработанные байты gzip, и компиляция WASM завершается ошибкой. +::: + +## Переменные окружения + +Задайте их в Site settings → Environment variables: + +| Переменная | Описание | +| ----------------------- | ----------------------------------------------------------------------- | +| `SIMPLE_MODE` | Укажите `true` для минимальной сборки | +| `VITE_BRAND_NAME` | Свое название бренда (заменяет «BentoPDF») | +| `VITE_BRAND_LOGO` | Путь к логотипу относительно `public/` (например, `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Свой текст подвала и авторских прав | +| `VITE_DEFAULT_LANGUAGE` | Язык интерфейса по умолчанию (например, `fr`, `de`, `es`) | + +## Собственный домен + +1. Перейдите в Site settings → Domain management +2. Нажмите «Add custom domain» +3. Следуйте инструкциям по настройке DNS + +## Большие медиафайлы + +Для больших файлов WASM рассмотрите включение [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Устранение неполадок + +### Конвертация Word/ODT/Excel в PDF зависает на 55% + +Если конвертация документов зависает на 55%, откройте консоль DevTools и проверьте: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Если `crossOriginIsolated` равно `false`, заголовки COEP/COOP из вашего `netlify.toml` не применяются. Убедитесь, что файл лежит в корне проекта, и разверните сайт заново. + +Если в консоли появляется `expected magic word 00 61 73 6d, found 1f 8b 08 08`, у файлов `.wasm.gz` нет заголовков `Content-Encoding: gzip`. Убедитесь, что блоки `[[headers]]` для `soffice.wasm.gz` и `soffice.data.gz` есть в вашем `netlify.toml`. + +### Сборка завершается ошибкой + +Проверьте совместимость версии Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Медленная первая загрузка + +Включите оптимизацию ресурсов в Site settings → Build & deploy → Asset optimization. diff --git a/docs/ru/self-hosting/nginx.md b/docs/ru/self-hosting/nginx.md new file mode 100644 index 00000000..fb965bc4 --- /dev/null +++ b/docs/ru/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Развертывание с Nginx + +Разместите BentoPDF на собственном сервере с помощью Nginx. + +## Требования + +- Сервер Ubuntu/Debian +- Установленный Nginx +- SSL-сертификат (рекомендуется Let's Encrypt) + +## Шаг 1: Соберите проект + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Чтобы настроить брендинг, задайте переменные окружения перед сборкой: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Шаг 2: Скопируйте файлы + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Шаг 3: Конфигурация Nginx + +Создайте `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Шаг 4: Включите сайт + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Шаг 5: SSL с Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Развертывание в подкаталоге + +Чтобы разместить сайт по адресу `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Соберите проект так: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Настройка производительности + +Добавьте в `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Устранение неполадок + +### WASM не загружается + +Убедитесь, что задан MIME-тип: + +```nginx +types { + application/wasm wasm; +} +``` + +### Sign PDF или Form Filler показывает пустой просмотрщик (ошибка MIME для `.mjs`) + +Если в консоли браузера появляется: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…и неудавшийся запрос оканчивается на `.mjs`, значит в вашем nginx нет соответствия `.mjs → application/javascript`. Встроенный просмотрщик PDF (его используют Sign PDF, Form Filler и несколько других инструментов) содержит файлы ES-модулей с расширением `.mjs`, а стандартный `mime.types` в nginx их по умолчанию не включает. + +Исправьте это, добавив `mjs` в существующую строку `application/javascript` в `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> НЕ добавляйте _вторую_ строку `application/javascript`: nginx разбирает `mime.types` построчно, и в некоторых версиях вторая строка для того же типа молча игнорируется. Отредактируйте существующую строку, добавив `mjs` рядом с `js`. + +Или переопределите это локально в блоке server (без правки глобального файла): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +После изменения перезагрузите nginx: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Для проверки найдите в DevTools на вкладке Network неудавшийся запрос `.mjs` и посмотрите заголовок ответа `Content-Type`. Теперь там должно быть `application/javascript`, а не `application/octet-stream`. + +### Конвертация Word/ODT/Excel в PDF не работает + +LibreOffice WASM требует `SharedArrayBuffer`, а для него нужны заголовки `Cross-Origin-Embedder-Policy` и `Cross-Origin-Opener-Policy`. Также нужен защищенный контекст: `http://localhost` подходит для локальной проверки, но для `http://192.168.x.x` и других адресов в локальной сети обычно требуется HTTPS. Учтите, что директивы `add_header` в блоке `location` **переопределяют** директивы `add_header` уровня server, а не объединяются с ними. Каждый блок `location` со своими `add_header` должен включать заголовки COEP/COOP. + +Проверьте так: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Если перед nginx стоит обратный прокси, убедитесь, что он сохраняет эти заголовки. + +### 502 Bad Gateway + +Проверьте журнал ошибок Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/ru/self-hosting/vercel.md b/docs/ru/self-hosting/vercel.md new file mode 100644 index 00000000..a59bba7d --- /dev/null +++ b/docs/ru/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Развертывание в Vercel + +[Vercel](https://vercel.com) предлагает самый простой способ развертывания статических сайтов. + +## Развертывание в один клик + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Ручное развертывание + +### Шаг 1: Сделайте форк репозитория + +Сделайте форк [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) в свой аккаунт GitHub. + +### Шаг 2: Импортируйте в Vercel + +1. Перейдите на [vercel.com/new](https://vercel.com/new) +2. Выберите свой форк репозитория +3. Настройте проект: + +| Параметр | Значение | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Шаг 3: Переменные окружения (необязательно) + +Добавьте их при необходимости: + +| Переменная | Описание | +| ----------------------- | ----------------------------------------------------------------------- | +| `SIMPLE_MODE` | Укажите `true` для минимального интерфейса | +| `VITE_BRAND_NAME` | Свое название бренда (заменяет «BentoPDF») | +| `VITE_BRAND_LOGO` | Путь к логотипу относительно `public/` (например, `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Свой текст подвала и авторских прав | +| `VITE_DEFAULT_LANGUAGE` | Язык интерфейса по умолчанию (например, `fr`, `de`, `es`) | + +### Шаг 4: Разверните + +Нажмите «Deploy» и дождитесь завершения сборки. + +## Собственный домен + +1. Откройте настройки проекта +2. Перейдите в раздел «Domains» +3. Добавьте свой домен +4. Настройте DNS по инструкции + +## Ограничения + +::: warning Большие файлы +У serverless-функций Vercel есть ограничение в 50 МБ. Поскольку BentoPDF является статическим сайтом, это не должно вас затронуть, но модули WASM велики (около 100 МБ в сумме). Убедитесь, что они раздаются из папки `/public`. +::: + +## Устранение неполадок + +### Тайм-аут сборки + +Если сборка завершается по тайм-ауту, попробуйте: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Ошибка 404 при обновлении страницы + +Добавьте `vercel.json` для маршрутизации SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Конвертация Word/ODT/Excel в PDF не работает + +Для конвертации через LibreOffice WASM нужен `SharedArrayBuffer`, а для него на всех страницах должны быть следующие заголовки ответа: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Предварительно сжатым файлам `.wasm.gz` и `.data.gz` также нужен заголовок `Content-Encoding: gzip`, чтобы браузер их распаковывал. + +Добавьте это в свой `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Для проверки откройте консоль DevTools и выполните `console.log(window.crossOriginIsolated)`: должно вернуться `true`. diff --git a/docs/ru/tools/add-attachments.md b/docs/ru/tools/add-attachments.md new file mode 100644 index 00000000..453ba109 --- /dev/null +++ b/docs/ru/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Добавление вложений +description: Встраивайте файлы любого типа в PDF на уровне документа или прикрепляйте их к определенным страницам. +--- + +# Добавление вложений + +Встраивайте один или несколько файлов прямо в PDF-документ. Вложения можно добавить на уровне документа (они видны в панели вложений любой программы для чтения PDF) или привязать к определенным страницам. + +## Как это работает + +1. Загрузите PDF, к которому нужно прикрепить файлы. +2. В зоне для вложений выберите файлы, которые хотите встроить (любого типа). +3. Выберите уровень вложения: **Документ** (по умолчанию) или **Страница**. +4. Если выбран уровень страницы, укажите диапазон страниц (например, `1-3` или `5`). +5. Нажмите кнопку обработки. Измененный PDF скачается со встроенными файлами. + +## Возможности + +- Вложения любых типов: изображения, таблицы, архивы, исполняемые файлы, что угодно +- Размещение вложений на уровне документа или страницы +- Несколько файлов можно прикрепить за одну операцию +- Отображаются имена и размеры всех выбранных вложений +- В результате сохраняется исходное содержимое PDF, к которому добавлены встроенные файлы + +## Параметры + +| Параметр | Описание | +| --------------------- | --------------------------------------------------------------- | +| **Уровень документа** | Прикрепляет файлы к PDF целиком, они доступны в панели вложений | +| **Уровень страницы** | Прикрепляет файлы к определенным страницам, заданным диапазоном | + +## Сценарии использования + +- Добавление исходных данных (файлов Excel, CSV) к PDF-отчету +- Прикрепление исходных изображений к PDF-портфолио фотографа +- Встраивание подтверждающих документов в договор или коммерческое предложение +- Добавление дополнительных материалов к отдельным страницам учебного пособия + +## Советы + +- Вложения на уровне документа поддерживаются в программах для чтения PDF лучше всего. Вложения на уровне страницы могут быть видны не во всех программах. +- Ограничения на размер вложений нет, но очень большие встроенные файлы пропорционально увеличат размер PDF. + +## Похожие инструменты + +- [Извлечение вложений](./extract-attachments) +- [Редактирование вложений](./edit-attachments) +- [Объединение PDF](./merge-pdf) diff --git a/docs/ru/tools/add-blank-page.md b/docs/ru/tools/add-blank-page.md new file mode 100644 index 00000000..b2555e3d --- /dev/null +++ b/docs/ru/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Добавление пустой страницы +description: Вставляйте одну или несколько пустых страниц в любое место PDF-документа. +--- + +# Добавление пустой страницы + +Вставляйте пустые страницы в PDF в указанное место. Вы сами выбираете, куда поместить пустые страницы и сколько их добавить. + +## Как это работает + +1. Загрузите PDF-файл. Инструмент покажет количество страниц. +2. Введите **позицию**, в которую нужно вставить пустые страницы. Укажите `0`, чтобы вставить в самое начало, или общее число страниц, чтобы добавить в конец. +3. Введите **количество** добавляемых пустых страниц (по умолчанию 1). +4. Нажмите кнопку обработки. Измененный PDF скачается со вставленными пустыми страницами. + +## Возможности + +- Вставка в любое место: в начало, середину или конец документа +- Добавление нескольких пустых страниц за одну операцию +- Подсказка по позиции динамически обновляется в зависимости от числа страниц загруженного PDF +- Пустые страницы стандартного размера A4 + +## Сценарии использования + +- Добавление пустой страницы-разделителя между разделами сводного документа +- Вставка пустых страниц для правильной двусторонней печати +- Добавление места для рукописных заметок в распечатанном учебном пособии +- Дополнение документа до минимально необходимого числа страниц + +## Советы + +- Позиция `0` вставляет страницы перед первой. Позиция, равная общему числу страниц, добавляет их после последней. +- Если нужно вставить в определенное место не просто пустые страницы, а содержимое, используйте [Мультиинструмент PDF](./pdf-multi-tool), чтобы вставить другой PDF после заданной страницы. + +## Похожие инструменты + +- [Упорядочивание и дублирование](./organize-pdf) +- [Мультиинструмент PDF](./pdf-multi-tool) +- [Объединение PDF](./merge-pdf) diff --git a/docs/ru/tools/add-page-labels.md b/docs/ru/tools/add-page-labels.md new file mode 100644 index 00000000..48d78c11 --- /dev/null +++ b/docs/ru/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Добавить метки страниц +description: Добавляйте метки страниц PDF с римскими цифрами, буквенными префиксами, произвольной нумерацией и несколькими правилами на документ. +--- + +# Добавить метки страниц + +Метки страниц определяют, как номера страниц отображаются в программах для чтения PDF (номер в панели инструментов, а не напечатанный на странице). Этот инструмент позволяет назначать разные схемы нумерации разным диапазонам страниц: римские цифры для вводной части, обычные числа для основного текста, буквенные приложения и другое. + +## Как это работает + +1. Загрузите PDF-файл. +2. Появится панель параметров с одним правилом меток по умолчанию. +3. Для каждого правила задайте диапазон страниц, стиль, необязательный префикс и начальное значение. +4. Нажмите **Добавить правило**, чтобы создать дополнительные правила для других разделов. +5. Нажмите **Добавить метки страниц**, чтобы применить все правила и скачать результат. + +## Параметры + +У каждого правила меток есть следующие настройки: + +- **Диапазон страниц**: страницы, к которым применяется правило. Оставьте пустым для всех страниц. Поддерживаются записи вида `1-4`, `7`, `odd` или `1-9,30-40`. +- **Стиль метки**: десятичные арабские цифры, строчные римские (i, ii, iii), прописные римские (I, II, III), строчные буквы (a, b, c), прописные буквы (A, B, C) или без метки (только префикс). +- **Префикс метки**: необязательный текст перед каждой меткой, например «A-», чтобы получились метки A-1, A-2, A-3. +- **Начальное значение**: число, с которого начинается счет. По умолчанию 1. Укажите 0 для нумерации с нуля. +- **Продолжать нумерацию в несмежных диапазонах**: включите, если правило охватывает несмежные страницы (например, `1-9,30-40` или `odd`) и нумерация должна идти подряд. +- **Удалить существующие метки страниц**: включено по умолчанию. Очищает все прежние метки перед применением новых правил. + +## Возможности + +- Несколько правил меток на документ для сложных схем нумерации +- Шесть стилей меток, покрывающих все стандартные системы нумерации +- Произвольные префиксы для нумерации по разделам +- Поддержка несмежных диапазонов со сквозной нумерацией +- Возможность сохранить или удалить существующие метки + +## Сценарии использования + +- Римские цифры (i, ii, iii) для предисловия книги и обычные числа для основного текста +- Нумерация страниц приложений с буквенными префиксами, например «A-1», «A-2», «B-1», «B-2» +- Исправление меток страниц в отсканированном документе, где номера на бумаге не совпадают с порядком страниц в PDF +- Нумерация с нуля для технических документов + +## Советы + +- Метки страниц являются метаданными, которые программы для чтения PDF показывают в панели навигации. На самой странице они не печатаются. Для видимых номеров используйте [Номера страниц](./page-numbers). +- Для этого инструмента нужно настроить CoherentPDF (CPDF) в настройках WASM. Если он не настроен, вам предложат это сделать. + +## Похожие инструменты + +- [Номера страниц](./page-numbers) +- [Bates-нумерация](./bates-numbering) +- [Редактирование закладок](./bookmark) diff --git a/docs/ru/tools/add-stamps.md b/docs/ru/tools/add-stamps.md new file mode 100644 index 00000000..909dcfb0 --- /dev/null +++ b/docs/ru/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Добавление штампов +description: Добавляйте штампы-изображения на страницы PDF с помощью встроенной панели аннотаций с указанием имени автора. +--- + +# Добавление штампов + +Размещайте штампы-изображения на страницах PDF во встроенном просмотрщике с панелью аннотаций для штампов. Штампы могут содержать ваше имя, что удобно для процессов согласования, проверки и маркировки документов. + +## Как это работает + +1. Введите свое имя в поле **Имя автора штампа**. Это имя будет указано на создаваемых штампах. +2. Загрузите PDF-файл, нажав на зону загрузки или перетащив файл в нее. +3. Откроется редактор штампов с загруженным документом в просмотрщике. +4. С помощью инструмента штампа-изображения на панели выберите и разместите штампы на любой странице. +5. При необходимости измените положение и размер штампов. +6. Нажмите **Сохранить PDF со штампами**, чтобы скачать результат. + +## Возможности + +- Встроенный просмотрщик PDF с панелью аннотаций для штампов +- Указание имени автора на созданных штампах +- Размещение штампов-изображений на любой странице +- Перетаскивание и изменение размера штампов +- Автоматический подбор размера просмотрщика по пропорциям страницы +- Отображение имени и размера файла + +## Сценарии использования + +- Добавление штампов «УТВЕРЖДЕНО» или «ПРОВЕРЕНО» в документы в процессе согласования +- Размещение изображений печати компании или нотариуса на официальных документах +- Отметка страниц штампами «ПОЛУЧЕНО» с именем проверяющего +- Добавление штампов контроля качества в акты проверок + +## Советы + +- Задайте имя автора штампа до загрузки PDF. Имя встраивается в метаданные штампа. +- Высота просмотрщика подстраивается под пропорции первой страницы PDF для удобного просмотра. +- Для текстовых водяных знаков вместо штампов-изображений используйте инструмент [Добавление водяных знаков](./add-watermark). + +## Похожие инструменты + +- [Подпись PDF](./sign-pdf) +- [Добавление водяных знаков](./add-watermark) +- [Редактор PDF](./edit-pdf) diff --git a/docs/ru/tools/add-watermark.md b/docs/ru/tools/add-watermark.md new file mode 100644 index 00000000..1ac1983a --- /dev/null +++ b/docs/ru/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Добавление водяных знаков +description: Накладывайте текстовые или графические водяные знаки на страницы PDF с помощью визуального редактора с перетаскиванием и предпросмотром в реальном времени. +--- + +# Добавление водяных знаков + +Добавляйте текстовые или графические водяные знаки на страницы PDF с помощью визуального редактора. Положение знака можно задать, перетащив его прямо на предпросмотре, размер меняется угловыми маркерами, а также настраиваются прозрачность, поворот, шрифт и цвет. У каждой страницы может быть свое положение знака, либо можно сразу применить один и тот же знак ко всем страницам. + +## Как это работает + +1. Загрузите PDF-файл. +2. Откроется редактор с предпросмотром первой страницы в реальном времени и перетаскиваемым водяным знаком. +3. Выберите режим **Текст** или **Изображение** с помощью переключателей. +4. Настройте параметры водяного знака на боковой панели. +5. Перетащите знак на предпросмотре в нужное место. Для изменения размера используйте угловые маркеры. +6. Переключайтесь между страницами, чтобы задать знаки для каждой страницы отдельно, либо оставьте включенным **Применить ко всем страницам**. +7. Нажмите **Добавить водяной знак**, чтобы обработать файл и скачать результат. + +## Параметры + +**Параметры текстового водяного знака:** + +- **Текст**: текст знака (например, «КОНФИДЕНЦИАЛЬНО», «ЧЕРНОВИК»). +- **Размер шрифта**: от 10 до 200 пунктов. По умолчанию 72. +- **Цвет**: любой цвет через палитру. +- **Прозрачность**: от полностью прозрачного до полностью непрозрачного. +- **Поворот**: поворот текста знака от -180 до 180 градусов. + +**Параметры графического водяного знака:** + +- **Загрузка изображения**: загрузите PNG, JPG или другой файл изображения для использования в качестве знака. +- **Прозрачность**: управление прозрачностью изображения. +- **Масштаб**: изменение размера изображения-знака. + +**Параметры расположения:** + +- **Одиночный**: один знак на страницу, положение задается перетаскиванием или готовыми пресетами позиции. +- **Мозаика**: повторяет знак по всей странице в диагональной сетке, которая следует углу поворота, поэтому знак покрывает документ от края до края. +- **Горизонтальный интервал**: расстояние между плитками вдоль направления текста в процентах от ширины знака (только в режиме мозаики). +- **Вертикальный интервал**: расстояние между рядами плиток в процентах от высоты знака (только в режиме мозаики). + +**Общие параметры:** + +- **Применить ко всем страницам**: если включено, один и тот же знак применяется к каждой странице. Отключите, чтобы задавать знаки для страниц по отдельности. +- **Диапазон страниц**: укажите, на какие страницы наносится знак (например, «1-3, 5, 7-9» или «all»). + +## Возможности + +- Визуальное размещение перетаскиванием на предпросмотре PDF в реальном времени +- Изменение размера знака угловыми маркерами +- Текстовый и графический режимы водяных знаков +- Одиночное или мозаичное (повторяющееся) расположение по всей странице с настраиваемыми интервалами +- Применение к отдельным страницам или ко всему документу +- Постраничная навигация в предпросмотре +- Управление прозрачностью и поворотом +- Фильтрация по диапазону страниц + +## Сценарии использования + +- Пометка черновиков словом «ЧЕРНОВИК» перед рассылкой на согласование +- Добавление водяных знаков «КОНФИДЕНЦИАЛЬНО» в закрытые финансовые отчеты +- Брендирование документов водяным знаком с логотипом компании +- Нанесение отметки «ОБРАЗЕЦ» на документацию, которую показывают потенциальным клиентам +- Добавление уведомлений об авторских правах в распространяемые PDF-материалы + +## Советы + +- Для диагональных водяных знаков по странице задайте поворот около 45 градусов и увеличьте размер шрифта. +- Режим мозаики сильно затрудняет повторное использование документа после обрезки: даже если убрать один знак, останутся десятки других. При мозаичном расположении уменьшите непрозрачность, чтобы текст под знаками оставался читаемым. +- Изображения-знаки с прозрачным фоном (формат PNG) естественнее сочетаются с содержимым документа. +- Если на разных страницах нужен разный текст знака, отключите «Применить ко всем страницам» и переходите от страницы к странице. + +## Похожие инструменты + +- [Колонтитулы](./header-footer) +- [Добавление штампов](./add-stamps) +- [Bates-нумерация](./bates-numbering) +- [Подпись PDF](./sign-pdf) diff --git a/docs/ru/tools/adjust-colors.md b/docs/ru/tools/adjust-colors.md new file mode 100644 index 00000000..2cefa001 --- /dev/null +++ b/docs/ru/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Настройка цвета +description: Точно настраивайте яркость, контрастность, насыщенность, оттенок, температуру, тон, гамму и сепию в вашем PDF. +--- + +# Настройка цвета + +Полный набор инструментов цветокоррекции для PDF. Настраивайте восемь независимых параметров: яркость, контрастность, насыщенность, сдвиг оттенка, температуру, тон, гамму и сепию. Предпросмотр обновляется в реальном времени при движении каждого ползунка. + +## Как это работает + +1. Загрузите PDF-файл. +2. Откроется редактор с предпросмотром первой страницы и панелью настроек цвета. +3. Двигайте ползунки, чтобы изменить каждый параметр цвета. Предпросмотр обновляется сразу. +4. Нажмите **Сбросить**, чтобы вернуть все ползунки в исходное положение. +5. Нажмите **Применить**, чтобы обработать все страницы и скачать скорректированный PDF. + +## Параметры + +- **Яркость**: осветление или затемнение всей страницы (от -100 до +100). +- **Контрастность**: увеличение или уменьшение разницы между светлыми и темными областями (от -100 до +100). +- **Насыщенность**: усиление или ослабление интенсивности цвета (от -100 до +100). При значении -100 получается изображение в оттенках серого. +- **Сдвиг оттенка**: поворот цветового круга, равномерно сдвигающий все цвета. +- **Температура**: сдвиг цветов в теплую (желтую или оранжевую) или холодную (синюю) сторону. +- **Тон**: добавление зеленого или пурпурного оттенка. +- **Гамма**: настройка яркости средних тонов по гамма-кривой. Значения меньше 1,0 затемняют средние тона, больше 1,0 осветляют их. +- **Сепия**: классический эффект сепии. Чем выше значение, тем сильнее коричневый оттенок. + +## Возможности + +- Восемь независимо настраиваемых параметров цвета +- Предпросмотр в реальном времени, мгновенно реагирующий на ползунки +- Кнопка сброса для быстрого возврата к значениям по умолчанию +- Обработка всех страниц документа +- Работает с любым содержимым PDF (текст, изображения, графика) + +## Сценарии использования + +- Осветление темного скана или исправление переэкспонированных страниц +- Снижение насыщенности цветного документа, чтобы сэкономить краску при печати +- Применение сепии для старинного вида сертификатов или наград +- Коррекция цветовой температуры фотографий, встроенных в PDF +- Повышение контрастности выцветших или низкокачественных сканов + +## Советы + +- Для быстрого перевода в оттенки серого передвиньте ползунок насыщенности до -100. +- Ползунок гаммы особенно полезен для улучшения читаемости сканов, у которых средние тона слишком темные или слишком светлые. +- Как и другие инструменты с эффектами изображения, этот растрирует каждую страницу. Результат будет состоять из изображений, поэтому текст нельзя будет выделить. + +## Похожие инструменты + +- [Инвертирование цветов](./invert-colors) +- [Эффект сканера](./scanner-effect) +- [Цвет фона](./background-color) diff --git a/docs/ru/tools/alternate-merge.md b/docs/ru/tools/alternate-merge.md new file mode 100644 index 00000000..ff9abc1c --- /dev/null +++ b/docs/ru/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Объединение документов с чередованием страниц +description: Объединяйте PDF, чередуя страницы из каждого файла по очереди, с сохранением закладок. +--- + +# Объединение документов с чередованием страниц + +Чередуйте страницы нескольких PDF-файлов так, чтобы они шли по очереди из разных документов. Этот инструмент нужен, когда обычное объединение просто склеивает файлы один за другим, а вам требуется страница 1 файла A, затем страница 1 файла B, затем страница 2 файла A и так далее. + +## Как это работает + +1. Загрузите не менее двух PDF-файлов через зону загрузки. +2. Инструмент покажет каждый файл с числом страниц и размером. +3. Перетаскивайте маркеры, чтобы изменить, страницы какого файла идут первыми в последовательности чередования. +4. Нажмите **Смешать страницы**, чтобы получить результат с чередованием. +5. Результат скачается как `alternated-mixed.pdf`. + +## Возможности + +- Чередование страниц любого числа PDF (минимум два) +- Изменение порядка файлов перетаскиванием для управления приоритетом чередования +- Сохранение закладок исходных документов +- Отображение числа страниц и размера каждого загруженного файла +- Обработка в отдельном веб-воркере, чтобы интерфейс оставался отзывчивым + +## Сценарии использования + +- Сборка двусторонних сканов, когда нечетные и четные страницы сканировались отдельно +- Объединение листов с вопросами и ответами, чтобы после каждого вопроса шел ответ +- Постраничное объединение документов на двух языках (например, английский на одной странице, перевод на следующей) +- Чередование лицевых и оборотных сканов, полученных на одностороннем сканере + +## Советы + +- Если в исходных PDF разное число страниц, страницы более короткого документа закончатся первыми, а оставшиеся страницы более длинного окажутся в конце. +- Порядок файлов важен: первый файл в списке дает первую страницу результата. При необходимости перетащите файлы, чтобы изменить порядок. + +## Похожие инструменты + +- [Объединение PDF](./merge-pdf) +- [Упорядочивание и дублирование](./organize-pdf) +- [Разделение PDF](./split-pdf) diff --git a/docs/ru/tools/background-color.md b/docs/ru/tools/background-color.md new file mode 100644 index 00000000..bd6f5e72 --- /dev/null +++ b/docs/ru/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Цвет фона +description: Меняйте цвет фона на каждой странице PDF, сохраняя все содержимое поверх него. +--- + +# Цвет фона + +Задайте сплошной цвет фона за всем существующим содержимым PDF. Инструмент создает цветной прямоугольник на каждой странице и накладывает поверх него исходное содержимое, поэтому текст, изображения и графика остаются полностью видимыми на новом фоне. + +## Как это работает + +1. Загрузите PDF-файл. +2. Выберите цвет фона с помощью палитры. По умолчанию это светло-желтый (#FFFFCC). +3. Нажмите **Изменить цвет фона**, чтобы начать обработку. +4. Обновленный PDF скачается автоматически. + +## Параметры + +- **Цвет фона**: стандартная палитра для выбора любого сплошного цвета. По умолчанию светло-желтый. + +## Возможности + +- Единый цвет фона на каждой странице +- Все исходное содержимое (текст, изображения, векторная графика) сохраняется поверх цветного слоя +- Исходные размеры страниц сохраняются +- Работает с документами с любым числом страниц + +## Сценарии использования + +- Светлый кремовый или цвета слоновой кости фон, чтобы документ выглядел мягче, как бумага +- Цветовая маркировка наборов документов с разными фонами для разных категорий +- Создание визуально различимых версий одного документа для разных аудиторий +- Легкий оттенок фона для лучшей читаемости при показе документов на экране + +## Советы + +- Лучше всего подходят светлые приглушенные цвета. Очень темный фон затрудняет чтение текста, если только сам текст уже не светлый. +- Если нужно изменить и фон, и цвет текста, сначала примените цвет фона, а затем используйте [Изменение цвета текста](./text-color) для результата. +- Инструмент работает на структурном уровне PDF (без растрирования), поэтому текст в результате остается выделяемым и доступным для поиска. + +## Похожие инструменты + +- [Изменение цвета текста](./text-color) +- [Инвертирование цветов](./invert-colors) +- [Настройка цвета](./adjust-colors) diff --git a/docs/ru/tools/bates-numbering.md b/docs/ru/tools/bates-numbering.md new file mode 100644 index 00000000..0a19fdf0 --- /dev/null +++ b/docs/ru/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates-нумерация +description: Применяйте Bates-номера к одному или нескольким PDF с настраиваемыми шаблонами, дополнением нулями, шрифтами и расположением. +--- + +# Bates-нумерация + +Bates-нумерация проставляет последовательные идентификаторы на каждой странице ваших PDF. Это стандартный способ маркировки документов в судебных разбирательствах, аудитах и процессах комплаенса. Инструмент поддерживает несколько файлов и настраиваемые шаблоны, а результат выдает в виде отдельных пронумерованных PDF или одного ZIP-архива. + +## Как это работает + +1. Загрузите один или несколько PDF-файлов. Можно перетащить сразу несколько. +2. Выберите готовый стиль или создайте собственный шаблон. +3. Настройте положение, шрифт, размер, цвет и начальные номера. +4. Нажмите **Применить Bates-номера**, чтобы начать обработку. +5. Один файл скачивается напрямую. Несколько файлов скачиваются как ZIP-архив. + +## Параметры + +- **Готовый стиль**: выберите один из встроенных форматов: + - Exhibit + Case + Bates + Page (например, «Exhibit 1 Case XYZ 000001 Page 1») + - Exhibit + Case + Bates (без номера страницы) + - Case + Bates + - Только Bates-номер (например, «000001») + - Пользовательский (напишите свой шаблон) +- **Настроить стиль**: строка шаблона с плейсхолдерами: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Дополнение Bates-номера**: количество цифр (от 3 до 6) для Bates-номеров с ведущими нулями. Видно только в пользовательском режиме. +- **Положение**: верхний или нижний колонтитул, слева, по центру или справа. +- **Bates-нумерация начинается с**: первый Bates-номер. По умолчанию 1. Нумерация продолжается между файлами. +- **Счетчик файлов начинается с**: начальное число для плейсхолдера `[FILE]`. +- **Шрифт**: Helvetica, Times New Roman или Courier. +- **Размер шрифта**: размер наносимого текста. +- **Цвет**: палитра для цвета текста Bates-номера. + +## Возможности + +- Предпросмотр в реальном времени показывает, как Bates-номера будут выглядеть во всех загруженных файлах +- Поддержка нескольких файлов со сквозной нумерацией между документами +- Изменение порядка файлов перетаскиванием для управления последовательностью нумерации +- Шесть вариантов положения (верх или низ, слева, по центру, справа) +- Адаптивный расчет полей с учетом разных размеров страниц +- Результат в ZIP для пакетной обработки нескольких файлов +- Плейсхолдеры в шаблонах для максимальной гибкости + +## Сценарии использования + +- Нумерация документов раскрытия в судебном процессе последовательными номерами доказательств +- Нумерация пакетов аудиторских доказательств, состоящих из десятков файлов +- Нанесение регуляторных справочных номеров на документацию по комплаенсу +- Маркировка приложений к патентной заявке идентификаторами конкретного дела + +## Советы + +- Перетащите файлы в списке, чтобы изменить их порядок перед обработкой. Последовательность Bates-номеров следует этому порядку. +- Используйте плейсхолдер `[FILENAME]`, чтобы включить в штамп исходное имя файла: так проще отследить страницы до исходных документов. +- Окно предпросмотра обновляется в реальном времени при изменении настроек, поэтому формат можно проверить до обработки. + +## Похожие инструменты + +- [Номера страниц](./page-numbers) +- [Добавить метки страниц](./add-page-labels) +- [Колонтитулы](./header-footer) diff --git a/docs/ru/tools/bmp-to-pdf.md b/docs/ru/tools/bmp-to-pdf.md new file mode 100644 index 00000000..89c089ee --- /dev/null +++ b/docs/ru/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP в PDF +description: Конвертируйте растровые изображения BMP в PDF прямо в браузере, без загрузки на какой-либо сервер. +--- + +# BMP в PDF + +Конвертируйте файлы Windows Bitmap (BMP) в PDF. BMP, несжатый формат изображений, до сих пор встречается в устаревших системах, медицинской визуализации и промышленных сканерах. Этот инструмент превращает их в PDF без установки чего-либо. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :--------- | +| BMP | `.bmp` | + +## Как это работает + +1. Нажмите на зону загрузки или перетащите в нее файлы BMP. +2. Просмотрите список файлов. Добавьте еще файлы или удалите ненужные. +3. Нажмите **Конвертировать в PDF**. Результат скачается как `from_bmps.pdf`. + +Каждое BMP рисуется на canvas, экспортируется в PNG и затем встраивается в PDF с помощью pdf-lib. Размер страницы совпадает с размерами исходного изображения. + +## Параметры + +У этого инструмента нет дополнительных настроек качества. Изображения встраиваются в исходном разрешении как PNG без потерь внутри PDF. + +## Сценарии использования + +- Конвертация старых отсканированных документов в формате BMP в архивные PDF +- Превращение снимков экрана в BMP из старых приложений Windows в документы, которыми удобно делиться +- Обработка результатов медицинских или промышленных сканеров, которые по умолчанию сохраняют BMP +- Перенос старых архивов изображений в более переносимый формат + +## Советы + +- Файлы BMP не сжаты, поэтому обычно велики. Итоговый PDF будет заметно меньше, так как внутри изображения перекодируются в PNG. +- Если у вас есть файлы BMP вместе с другими форматами изображений, используйте инструмент [Изображения в PDF](./image-to-pdf), чтобы конвертировать все за один раз. + +## Похожие инструменты + +- [Изображения в PDF](./image-to-pdf) +- [PNG в PDF](./png-to-pdf) +- [TIFF в PDF](./tiff-to-pdf) diff --git a/docs/ru/tools/bookmark.md b/docs/ru/tools/bookmark.md new file mode 100644 index 00000000..274743da --- /dev/null +++ b/docs/ru/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Редактирование закладок +description: Добавляйте, редактируйте, импортируйте, экспортируйте и удаляйте закладки PDF в визуальном редакторе с поддержкой CSV и JSON. +--- + +# Редактирование закладок + +Редактор закладок дает полный контроль над навигационными закладками PDF (их также называют структурой документа). Вы можете добавлять новые закладки, редактировать существующие, менять иерархию, а также импортировать и экспортировать данные закладок в форматах CSV и JSON. + +## Как это работает + +1. Загрузите PDF, щелкнув по области загрузки или перетащив в нее файл. +2. При желании отметьте **Автоматически извлекать существующие закладки**, чтобы загрузить текущее дерево закладок документа. +3. Редактор откроется в режиме разделенного экрана: слева просмотр PDF, справа панель закладок. +4. Введите название закладки и нажмите **Добавить на страницу**, чтобы создать закладку на текущую страницу. +5. Кнопками на панели инструментов можно переставлять, оформлять или удалять закладки. +6. Нажмите **Сохранить PDF с закладками**, чтобы скачать обновленный файл. + +## Возможности + +- Визуальный просмотр PDF с навигацией по страницам, масштабированием и переходом к нужной странице +- Добавление закладки на любую страницу одним щелчком +- Щелчок прямо по PDF для точного задания места назначения закладки (режим выбора) +- Вложенная иерархия закладок с изменением порядка перетаскиванием +- Пакетные операции: выберите несколько закладок, чтобы сразу изменить цвет, стиль или удалить их +- Поиск по закладкам для быстрого нахождения записей в больших деревьях +- Отмена и повтор всех изменений +- Импорт закладок из CSV (название, страница, уровень) или JSON +- Экспорт закладок в CSV или JSON для внешнего редактирования +- Оформление закладок: цвет (красный, синий, зеленый, желтый, фиолетовый) и начертание (полужирный, курсив, полужирный курсив) +- Быстрая навигация: прокручивайте страницы клавишами Page Up и Page Down + +## Параметры + +- **Автоматически извлекать существующие закладки**: если отмечено, инструмент при загрузке считывает и показывает текущие закладки PDF. +- **Пакетный режим**: включите, чтобы выбирать несколько закладок и применять к ним массовое изменение цвета, стиля или удаление. +- **Развернуть всё / Свернуть всё**: быстро показывает или скрывает вложенные закладки. + +## Сценарии использования + +- Добавление оглавления в учебник или руководство, где нет закладок +- Перестройка закладок в отсканированном документе после распознавания текста +- Экспорт закладок в CSV, правка в электронной таблице и повторный импорт +- Очистка автоматически созданных закладок с неверными ссылками на страницы +- Цветные закладки для выделения важных разделов в юридическом документе + +## Советы + +- Для массового создания закладок используйте импорт CSV. Формат простой: `title,page,level`, где уровень 1 означает верхний уровень. +- Режим выбора позволяет щелкнуть по точному месту на странице PDF и задать место назначения закладки, что точнее, чем указание только номера страницы. +- Экспортируйте закладки перед крупными изменениями, чтобы иметь резервную копию. + +## Связанные инструменты + +- [Оглавление](./table-of-contents) +- [Редактор PDF](./edit-pdf) +- [Добавить метки страниц](./add-page-labels) diff --git a/docs/ru/tools/cbz-to-pdf.md b/docs/ru/tools/cbz-to-pdf.md new file mode 100644 index 00000000..168fb3fe --- /dev/null +++ b/docs/ru/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ в PDF +description: Преобразуйте архивы комиксов CBZ и CBR в PDF прямо в браузере. Бесплатно, конфиденциально, без загрузки на сервер. +--- + +# CBZ в PDF + +Превращайте архивы комиксов в PDF. CBZ и CBR являются стандартными форматами цифровых комиксов: это обычные архивы ZIP или RAR с изображениями. Инструмент извлекает каждую страницу, сохраняет порядок чтения и создает аккуратный PDF, где каждое изображение становится страницей полного размера. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----- | :--------- | :------------------------------------------------------------------ | +| CBZ | `.cbz` | Архив комикса на основе ZIP (обрабатывается локально через pdf-lib) | +| CBR | `.cbr` | Архив комикса на основе RAR (обрабатывается движком PyMuPDF) | + +Конвертер CBZ распознает изображения JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC и JXL внутри архива. Нестандартные форматы перед встраиванием автоматически преобразуются в PNG. + +## Как это работает + +1. Щелкните по области загрузки или перетащите в нее файлы CBZ или CBR. В одной партии можно смешивать оба формата. +2. Проверьте список файлов. Удалите ненужные или нажмите **Добавить еще файлы**, чтобы добавить еще. +3. Нажмите **Преобразовать в PDF**. Для файлов CBZ инструмент распаковывает архив, сортирует изображения по имени в естественном порядке, определяет реальный формат каждого изображения и встраивает их в PDF с помощью pdf-lib. Файлы CBR обрабатываются движком PyMuPDF. +4. Один файл скачивается как PDF. Несколько файлов дают ZIP-архив с именем `comic-converted.zip`. + +## Параметры + +Настройка не требуется. Каждое изображение становится страницей того же размера, что и оригинал, поэтому развороты остаются широкими, а одиночные страницы узкими. + +## Сценарии использования + +- Чтение комиксов на планшете или в приложении для телефона, которое поддерживает PDF, но не CBZ/CBR +- Печать отдельных страниц цифрового комикса +- Архивирование коллекции комиксов в формат, который откроет любой просмотрщик +- Передача комикса тому, у кого нет специальной программы для чтения комиксов + +## Советы + +- Изображения внутри архива сортируются в естественном порядке (так что `page2.jpg` идет раньше `page10.jpg`). Нумеруйте файлы единообразно, чтобы страницы шли в правильной последовательности. +- Конвертер определяет формат изображений по двоичным сигнатурам, а не по расширениям. PNG, случайно названный `.jpg`, все равно будет встроен правильно. +- Файлы CBZ обрабатываются полностью в браузере без загрузки движка PyMuPDF, поэтому конвертируются быстрее, чем CBR. + +## Связанные инструменты + +- [EPUB в PDF](./epub-to-pdf) +- [MOBI в PDF](./mobi-to-pdf) +- [Изображения в PDF](./image-to-pdf) diff --git a/docs/ru/tools/change-permissions.md b/docs/ru/tools/change-permissions.md new file mode 100644 index 00000000..5d85e1bd --- /dev/null +++ b/docs/ru/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Изменение разрешений +description: Задавайте или меняйте разрешения PDF на печать, копирование, редактирование и добавление аннотаций. Используется 256-битное шифрование AES. +--- + +# Изменение разрешений + +Гибко настройте, что получатели могут делать с вашим PDF. В отличие от обычного шифрования, которое просто закрывает файл паролем, этот инструмент позволяет выборочно разрешать или запрещать печать, копирование, редактирование, аннотирование, заполнение форм, сборку документа и извлечение страниц. Все ограничения обеспечиваются 256-битным шифрованием AES. + +## Как это работает + +1. Загрузите PDF-файл. +2. Если PDF уже зашифрован, введите **Текущий пароль**. +3. Задайте **Новый пароль пользователя** (нужен для открытия) и/или **Новый пароль владельца** (управляет разрешениями). +4. Включайте и отключайте отдельные разрешения с помощью флажков. +5. Нажмите **Изменение разрешений**. +6. Скачайте обновленный PDF. + +Если оставить оба поля нового пароля пустыми, инструмент полностью расшифрует PDF, сняв все шифрование и ограничения. + +## Управление разрешениями + +| Разрешение | Что оно контролирует | +| -------------------------------- | --------------------------------------------------- | +| **Разрешить печать** | Можно ли печатать документ | +| **Разрешить копирование текста** | Можно ли выделять и копировать текст и изображения | +| **Разрешить изменение** | Можно ли редактировать содержимое документа | +| **Разрешить аннотирование** | Можно ли добавлять комментарии, выделения и штампы | +| **Разрешить заполнение форм** | Можно ли заполнять интерактивные поля форм | +| **Разрешить сборку документа** | Можно ли вставлять, удалять и поворачивать страницы | +| **Разрешить извлечение страниц** | Можно ли извлекать отдельные страницы | + +Для работы любых разрешений необходим пароль владельца. Без пароля владельца флаги разрешений игнорируются большинством программ для чтения PDF. + +## Как работают разрешения в PDF + +Разрешения PDF входят в спецификацию шифрования. Они хранятся как битовые флаги в словаре шифрования, и их соблюдают совместимые программы для чтения PDF. Главное различие: + +- **Пароль пользователя**: нужен, чтобы вообще открыть файл. +- **Пароль владельца**: нужен, чтобы изменить разрешения или снять ограничения. Без него флаги разрешений определяют, какие операции доступны пользователю. + +Если задать только пароль владельца (без пароля пользователя), файл сможет открыть любой, но ему будут доступны только разрешенные операции. Если задать оба пароля, для открытия файла потребуется пароль, а после аутентификации действуют ограничения. + +## Сценарии использования + +- Рассылка отчета, который можно смотреть и печатать, но нельзя редактировать и копировать +- Передача шаблона договора, который получатели могут заполнить, но не изменить +- Публикация PDF-каталога с отключенным копированием изображений +- Разрешение аннотировать черновик для рецензирования при запрете структурных изменений + +## Советы + +- Чтобы защита работала, всегда задавайте пароль владельца. Разрешения без пароля владельца невозможно обеспечить. +- Некоторые сторонние PDF-инструменты игнорируют флаги разрешений. Для более надежной защиты рассмотрите растеризацию PDF или DRM. +- Используйте этот инструмент, чтобы обновить старые PDF с шифрованием RC4 до AES-256. + +## Связанные инструменты + +- [Защита PDF](./protect-pdf): простая защита паролем без гибких разрешений +- [Разблокировка PDF](./unlock-pdf): полное снятие шифрования +- [Снятие ограничений](./remove-restrictions): удаление всех ограничений, если у вас есть пароль владельца diff --git a/docs/ru/tools/combine-single-page.md b/docs/ru/tools/combine-single-page.md new file mode 100644 index 00000000..a941d80a --- /dev/null +++ b/docs/ru/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Объединение в одну страницу +description: Склейте все страницы PDF в одну непрерывную вертикальную или горизонтальную ленту. +--- + +# Объединение в одну страницу + +Объедините все страницы PDF в одну длинную страницу. Страницы склеиваются по вертикали (как свиток) или по горизонтали (рядом друг с другом), и на выходе получается одна непрерывная страница. + +## Как это работает + +1. Загрузите PDF-файл. +2. Выберите направление: **Вертикально** (страницы друг под другом) или **Горизонтально** (страницы рядом). +3. Задайте расстояние между страницами в пунктах. +4. Выберите цвет фона для промежутков между страницами. +5. При желании включите разделители (тонкие линии между страницами) и настройте их толщину и цвет. +6. Нажмите кнопку обработки. На выходе будет одностраничный PDF. + +## Возможности + +- Вертикальная или горизонтальная склейка страниц +- Настраиваемое расстояние между страницами +- Выбор цвета фона для промежутков +- Необязательные линии-разделители с настраиваемой толщиной и цветом +- Каждая исходная страница отображается в полном разрешении на общем холсте + +## Параметры + +| Параметр | Описание | +| ------------------------------ | ----------------------------------------------- | +| **Направление раскладки** | Вертикально (стопкой) или горизонтально (рядом) | +| **Интервал** | Расстояние между страницами в пунктах | +| **Цвет фона** | Цвет области между страницами | +| **Добавить линии-разделители** | Включает тонкие линии между страницами | +| **Толщина разделителя** | Толщина линии в пунктах | +| **Цвет разделителя** | Цвет линий-разделителей | + +## Сценарии использования + +- Создание одного длинного изображения из многостраничного макета или прототипа +- Непрерывный прокручиваемый вид документа для встраивания на веб-страницу +- Склейка многостраничного комикса или раскадровки в одну ленту +- Панорамный вид последовательных страниц для рецензирования + +## Советы + +- Вертикальная ориентация лучше подходит для документов с книжными страницами. Горизонтальная лучше для альбомного содержимого. +- Большие документы с множеством страниц дадут очень высокий или очень широкий результат. Некоторые программы просмотра PDF могут плохо справляться со слишком большими одиночными страницами. +- Разделители контрастного цвета помогают легко увидеть, где заканчивается одна исходная страница и начинается следующая. + +## Связанные инструменты + +- [N-Up PDF](./n-up-pdf) +- [Объединение PDF](./merge-pdf) +- [Разделение страниц](./divide-pages) diff --git a/docs/ru/tools/compare-pdfs.md b/docs/ru/tools/compare-pdfs.md new file mode 100644 index 00000000..310b2051 --- /dev/null +++ b/docs/ru/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Сравнение документов +description: Сравнивайте два PDF-документа рядом или в режиме наложения с подробным выявлением и классификацией изменений. +--- + +# Сравнение документов + +Загрузите два PDF и узнайте, что именно изменилось. Инструмент интеллектуально сопоставляет страницы, находит различия в тексте, изображениях, аннотациях, колонтитулах и оформлении и показывает их рядом или в режиме наложения. + +## Как это работает + +1. Загрузите два PDF-файла: оригинал (слева) и исправленную версию (справа). +2. Инструмент сопоставляет страницы документов по сигнатурам содержимого. +3. Выберите режим просмотра: **Рядом** или **Наложение**. +4. Переключайтесь между парами страниц с помощью элементов постраничной навигации. +5. Различия выделяются и классифицируются. Панель фильтров помогает сосредоточиться на нужных типах изменений. +6. При желании экспортируйте сравнение в виде PDF-отчета. + +## Возможности + +- Автоматическое сопоставление страниц по схожести содержимого +- Режимы сравнения рядом и с наложением +- Классификация изменений: текст, изображение, колонтитулы, аннотации, оформление, фон +- Переключатели фильтров по категориям для показа или скрытия отдельных типов изменений +- Поиск по изменениям текста с фильтрацией по запросу +- Поддержка OCR для сравнения отсканированных документов +- Масштабирование для детального просмотра +- Синхронная прокрутка панелей в режиме рядом +- Экспорт результатов сравнения в PDF + +## Параметры + +| Параметр | Описание | +| --------------------- | ----------------------------------------------------------------------------------------------- | +| **Режим просмотра** | Рядом или наложение | +| **OCR** | Включает и отключает OCR для сравнения отсканированных документов | +| **Язык OCR** | Язык для извлечения текста методом OCR | +| **Фильтры категорий** | Переключает видимость изменений текста, изображений, колонтитулов, аннотаций, оформления и фона | +| **Область изменений** | В режиме наложения: все изменения или только изменения содержимого | +| **Масштаб** | Настройка масштаба для детального просмотра | + +## Сценарии использования + +- Проверка правок договора, чтобы увидеть, что именно изменилось между версиями +- Сравнение макетов, чтобы убедиться, что экспорт в PDF соответствует ожиданиям +- Аудит изменений документов в регулируемых отраслях, где нужно отслеживать каждую правку +- Проверка того, что преобразование в PDF точно сохранило исходное содержимое +- Сверка переводов документов с оригиналом на предмет изменений верстки + +## Советы + +- Режим наложения помещает оба документа друг на друга, поэтому пространственные различия (сдвинутые элементы, измененные размеры изображений) сразу заметны. +- Включайте OCR при сравнении отсканированных документов без текстового слоя. Движок сравнения извлечет текст из изображений страниц. +- Используйте фильтры категорий, чтобы сосредоточиться на важном. Например, скройте изменения оформления, если вас интересуют только различия в тексте. + +## Связанные инструменты + +- [Просмотр метаданных](./view-metadata) +- [Распознавание текста в PDF](./ocr-pdf) +- [Объединение PDF](./merge-pdf) diff --git a/docs/ru/tools/compress-pdf.md b/docs/ru/tools/compress-pdf.md new file mode 100644 index 00000000..c82a6ce3 --- /dev/null +++ b/docs/ru/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Сжатие PDF +description: Уменьшайте размер PDF до 90% с помощью движка Hyper Compress. Поддерживаются целевой размер файла, пакетная обработка и пользовательские настройки качества. +--- + +# Сжатие PDF + +Уменьшайте PDF-файлы, не разрушая их. Сжатие PDF работает на [Hyper Compress](https://www.bentopdf.com/hyper-compress), собственном движке сжатия BentoPDF. Он пережимает изображения, создает подмножества шрифтов и объединяет их, а также удаляет лишний вес: встроенные миниатюры и приватные данные приложений. PDF остается полностью рабочим: текст можно выделять, ссылки и поля форм продолжают работать. + +Hyper Compress скомпилирован в WebAssembly и поставляется вместе с BentoPDF, поэтому сжатие работает офлайн и в изолированных развертываниях без дополнительной настройки. + +## Как это работает + +1. Загрузите один или несколько PDF, щелкнув по области загрузки или перетащив файлы. +2. Выберите **Уровень сжатия**: Низкий, Средний, Высокий или Без потерь. +3. При желании введите **Целевой размер файла** или раскройте **Пользовательские настройки** для тонкой настройки, включая **Конвертировать в оттенки серого**. +4. Нажмите **Сжатие PDF**. Для нескольких файлов вы получите один ZIP-архив. + +## Особые документы + +- **PDF с цифровой подписью** возвращаются без изменений, так как любое изменение сделает подпись недействительной. Включите **Игнорировать защиту содержимого** в разделе «Пользовательские настройки», чтобы удалить подписи и сжать файл: видимая подпись останется на странице, но файл больше не будет подписан. +- **Файлы PDF/A** после сжатия теряют метку PDF/A, чтобы файл не заявлял соответствие, которому он больше не отвечает. Включите **Сохранить PDF/A** в разделе «Пользовательские настройки», чтобы сохранить соответствие. +- **PDF, защищенные паролем**, получают поле пароля на карточке файла. Введите пароль там, и Hyper Compress откроет файл сам, без отдельного шага расшифровки. Если заблокированных файлов два и больше, одно общее поле открывает все файлы с одинаковым паролем. У сжатой копии пароля нет; чтобы снова добавить его, используйте [Защита PDF](./protect-pdf). +- **Сканы без текстового слоя** можно сжать сильнее с помощью **Растеризовать страницы в изображения** в разделе «Пользовательские настройки», который заменяет каждую страницу одним оптимизированным изображением. Это пропускается для любого документа с выделяемым текстом, включая сканы с распознанным текстом, если не включено **Игнорировать защиту содержимого**. Тогда текстовые страницы тоже становятся изображениями, текст перестает выделяться, а ссылки перестают работать. + +## Уровни сжатия + +| Уровень | Качество изображений | Макс. разрешение | Лучше всего подходит для | +| -------------- | ---------------------- | ---------------- | ------------------------------------ | +| **Низкий** | 80 | 200 DPI | Сохранения визуального качества | +| **Средний** | 50 | 150 DPI | Повседневных документов | +| **Высокий** | 20 | 72 DPI | Вложений в письма, загрузки на сайты | +| **Без потерь** | Изображения не тронуты | Без изменений | Архивных копий | + +Уровень «Высокий» также убирает встраивание 14 стандартных шрифтов PDF и похожих на них, например Arial, если это безопасно. + +## Целевой размер файла + +Введите размер в КБ или МБ, и Hyper Compress подберет наилучшее качество изображений, при котором файл все еще укладывается в этот размер, начиная с выбранного уровня. Если документ невозможно сжать до такого размера, вы получите самую маленькую версию, которую удалось создать, и сообщение об этом. Специальные страницы, например [Сжать PDF до 1MB](https://www.bentopdf.com/compress-pdf-to-1mb), открываются с уже заполненным целевым размером. + +## Пользовательские настройки + +Раскройте панель «Пользовательские настройки», чтобы напрямую настроить Hyper Compress. Выбор уровня сжатия сбрасывает эти параметры к значениям этого уровня, а изменение любого из них переключает уровень на «Пользовательский». + +- **Игнорировать защиту содержимого**: по умолчанию Hyper Compress не трогает подписанные PDF и не растеризует страницы с текстом. Включение отменяет оба ограничения. Параметр остается включенным при смене уровня. + +- **Изображения**: качество изображений, максимальное разрешение, принудительная передискретизация, сокращение цветов, обрезка невидимых областей изображений, удаление альтернативных изображений, упрощение цветовых профилей, JPEG 2000 и режим без потерь +- **Шрифты**: создание подмножеств, объединение дубликатов и отмена встраивания стандартных шрифтов и похожих на них +- **Содержимое**: сведение аннотаций, полей форм или ссылок +- **Очистка**: удаление миниатюр, данных приложений, цепочек статей, информации о веб-захвате, дерева структуры или выходных намерений +- **Растеризовать**: замена страниц изображениями для сканов, состоящих только из изображений; пропускается, если в документе есть выделяемый текст +- **Вывод**: «Сохранить PDF/A» и сжатие Brotli для программ чтения PDF 2.0, которые его поддерживают + +## Сценарии использования + +- Уменьшение отчета в 50 МБ до лимита вложений электронной почты +- Уменьшение скана до строгого лимита загрузки на портале с помощью целевого размера файла +- Оптимизация маркетинговых PDF для более быстрой загрузки с сайта +- Архивирование больших наборов документов, когда важна стоимость хранения +- Снижение расхода мобильного трафика при отправке PDF через мессенджеры + +## Советы + +- Начните с уровня «Средний». Если результат все еще слишком большой, задайте целевой размер файла или перейдите на «Высокий». +- Для скана без текстового слоя включите «Растеризовать страницы в изображения» в разделе «Пользовательские настройки». +- Параметр «Конвертировать в оттенки серого» в разделе «Пользовательские настройки» может уменьшить размер документов с большим количеством цветных элементов. + +## Связанные инструменты + +- [Линеаризация документа](./linearize-pdf): оптимизируйте сжатый PDF для быстрого просмотра в вебе +- [Растеризация документа](./rasterize-pdf): преобразование страниц в изображения с заданным DPI, включая страницы с текстом +- [Восстановление документа](./repair-pdf): исправление PDF, поврежденного при сжатии в другом инструменте +- [Удаление метаданных](./remove-metadata): удаление скрытых данных для конфиденциальности diff --git a/docs/ru/tools/crop-pdf.md b/docs/ru/tools/crop-pdf.md new file mode 100644 index 00000000..e622f32c --- /dev/null +++ b/docs/ru/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Обрезка PDF +description: Визуально обрезайте страницы PDF, рисуя область обрезки на каждой странице в редакторе на базе Cropper.js. +--- + +# Обрезка PDF + +Обрезайте поля страниц PDF в визуальном интерфейсе. Нарисуйте прямоугольник обрезки прямо на странице, посмотрите результат и примените обрезку. Для разных страниц можно задать разные области обрезки или применить одну и ту же обрезку ко всему документу. + +## Как это работает + +1. Загрузите PDF-файл. +2. Откроется редактор обрезки с первой страницей и перетаскиваемой областью обрезки. +3. Меняйте прямоугольник обрезки, перетаскивая его края или углы. +4. Кнопками навигации переходите между страницами и задавайте область обрезки для каждой из них. +5. Нажмите **Обрезать и скачать**, чтобы применить обрезку и скачать результат. + +## Возможности + +- Визуальный редактор обрезки на базе Cropper.js с маркерами для точной настройки +- Постраничная навигация для задания отдельных областей обрезки +- Настройки обрезки хранятся для каждой страницы, поэтому для разных страниц можно задать разную обрезку +- Предпросмотр выбранной области обрезки в реальном времени +- Поддержка PDF с любым размером и ориентацией страниц + +## Сценарии использования + +- Удаление широких полей из отсканированных документов, чтобы сосредоточиться на содержимом +- Удаление печатных меток обреза и приводочных меток из PDF для допечатной подготовки +- Обрезка слайдов лекций, чтобы убрать область заметок докладчика +- Удаление верхних и нижних колонтитулов со всех страниц перед отправкой отрывка документа +- Изменение размера страниц под конкретный экран или макет печати + +## Советы + +- Область обрезки можно свободно менять по размеру и перемещать. Тяните за углы для пропорционального изменения или за края для изменения по одной оси. +- Если для всех страниц нужна одинаковая обрезка, задайте ее на первой странице: инструмент запоминает область обрезки при переходе между страницами. +- Если нужно привести страницы к единому размеру, а не обрезать визуально, лучше подойдет инструмент «Редактор размера страниц». + +## Связанные инструменты + +- [Редактор PDF](./edit-pdf) +- [Нумерация страниц](./page-numbers) +- [Удаление пустых страниц](./remove-blank-pages) diff --git a/docs/ru/tools/csv-to-pdf.md b/docs/ru/tools/csv-to-pdf.md new file mode 100644 index 00000000..2c2f8993 --- /dev/null +++ b/docs/ru/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV в PDF +description: Преобразуйте файлы CSV в отформатированные таблицы PDF прямо в браузере. +--- + +# CSV в PDF + +Превращайте файлы CSV в аккуратные отформатированные PDF-документы. Каждый CSV разбирается и отображается в выходном PDF в виде таблицы. Это удобно, когда нужно распечатать или передать табличные данные, не требуя от получателя программы для работы с электронными таблицами. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :--------- | +| CSV | `.csv` | + +## Как это работает + +1. Щелкните по области загрузки или перетащите в нее один или несколько файлов CSV. +2. Проверьте список файлов. Добавьте еще файлы или удалите ненужные. +3. Нажмите **Конвертировать в PDF**. Индикатор выполнения показывает состояние преобразования. +4. Один файл скачивается сразу как PDF. Несколько файлов упаковываются в `csv-converted.zip`. + +## Параметры + +У этого инструмента нет дополнительных настроек. CSV автоматически разбирается и форматируется как таблица. + +## Результат + +| Количество файлов | Результат | +| :---------------- | :---------------------------------------------------------------- | +| 1 файл | Скачивание одного PDF (например, `data.pdf`) | +| 2 и более файлов | ZIP-архив (`csv-converted.zip`) с отдельным PDF для каждого файла | + +## Сценарии использования + +- Преобразование экспортированных отчетов из баз данных в печатные PDF-таблицы +- Передача финансовых данных или списков инвентаризации тем, у кого нет Excel +- Создание PDF-версий лог-файлов CSV для документации по соответствию требованиям +- Печать списков адресов, ведомостей оценок и любых других табличных данных в формате CSV + +## Советы + +- Для лучшего результата используйте в CSV стандартный разделитель-запятую. Инструмент следует общепринятым правилам разбора CSV. +- Если в CSV много столбцов, таблица может быть сжата по ширине страницы. Подумайте о разделении широких наборов данных на несколько файлов. +- Для файлов Excel (`.xls`, `.xlsx`) используйте инструмент [Excel в PDF](./excel-to-pdf), который сохраняет форматирование таблиц и несколько листов. + +## Связанные инструменты + +- [Excel в PDF](./excel-to-pdf) +- [Текст в PDF](./txt-to-pdf) +- [JSON в PDF](./json-to-pdf) diff --git a/docs/ru/tools/delete-pages.md b/docs/ru/tools/delete-pages.md new file mode 100644 index 00000000..a36a841f --- /dev/null +++ b/docs/ru/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Удаление страниц +description: Удаляйте из PDF отдельные страницы по номеру, диапазону или визуальному выбору миниатюр. +--- + +# Удаление страниц + +Удаляйте ненужные страницы из PDF-документа. Укажите страницы для удаления, введя номера или диапазоны, или щелкайте по миниатюрам страниц, чтобы отметить их. + +## Как это работает + +1. Загрузите PDF-файл. Инструмент отобразит миниатюры всех страниц. +2. Введите страницы для удаления в текстовое поле с синтаксисом диапазонов (например, `2, 5-8`) или щелкайте по миниатюрам, чтобы переключать выбор. +3. Отмеченные страницы выделяются, чтобы вы могли проверить выбор. +4. Нажмите кнопку обработки. Будет создан новый PDF без выбранных страниц. + +## Возможности + +- Выбор страниц текстом с синтаксисом диапазонов (`2, 5-8, 12`) +- Визуальная сетка миниатюр для удаления щелчком +- Подсветка страниц, отмеченных для удаления, в реальном времени +- Проверка ввода по фактическому числу страниц +- Все оставшиеся страницы сохраняют исходный порядок + +## Сценарии использования + +- Удаление пустых или заполняющих страниц из отсканированного документа +- Удаление титульных страниц или приложений перед передачей документа +- Очистка черновых страниц, случайно оставшихся в итоговом PDF +- Удаление страниц с конфиденциальной информацией перед распространением + +## Советы + +- Удаление страниц не влияет на содержимое и оформление остальных страниц. Результат является точной копией оригинала без удаленных страниц. +- Если вам нужно оставить только определенные страницы, а не удалить определенные, лучше подойдет [Извлечение страниц](./extract-pages). +- Миниатюры загружаются лениво, поэтому с большими документами интерфейс остается отзывчивым. + +## Связанные инструменты + +- [Извлечение страниц](./extract-pages) +- [Дублирование и организация](./organize-pdf) +- [Разделение PDF](./split-pdf) diff --git a/docs/ru/tools/deskew-pdf.md b/docs/ru/tools/deskew-pdf.md new file mode 100644 index 00000000..8df0595c --- /dev/null +++ b/docs/ru/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Выпрямление PDF +description: Автоматически выравнивайте наклонные страницы в отсканированных PDF с помощью определения перекоса OpenCV. Настраиваемые порог и DPI. +--- + +# Выпрямление PDF + +Отсканированные документы редко бывают идеально ровными. Даже небольшой наклон снижает точность OCR и портит вид печати. Этот инструмент использует алгоритмы обработки изображений OpenCV, чтобы определить угол перекоса каждой страницы и повернуть ее обратно в горизонтальное положение. + +## Как это работает + +1. Загрузите один или несколько отсканированных PDF. +2. Задайте **Порог наклона**: страницы, у которых обнаруженный перекос меньше этого значения, остаются без изменений. +3. Выберите **Качество обработки (DPI)**: более высокий DPI повышает точность определения, но занимает больше времени. +4. Нажмите **Выпрямление PDF**. +5. После обработки панель результатов покажет обнаруженный угол каждой страницы и то, была ли она исправлена. + +## Параметры + +| Параметр | Значения | По умолчанию | +| ---------------------------- | -------------------------- | ------------ | +| **Порог наклона** | 0.1, 0.5, 1.0, 2.0 градуса | 0.5 | +| **Качество обработки (DPI)** | 100, 150, 200, 300 | 150 | + +## Как работает определение перекоса + +Инструмент отображает каждую страницу в изображение с выбранным DPI, затем с помощью OpenCV находит преобладающие углы линий в содержимом. Если обнаруженный перекос превышает порог, страница поворачивается на обратный угол. Страницы ниже порога передаются без изменений. + +## Сценарии использования + +- Очистка пакетно отсканированных договоров и юридических документов +- Подготовка отсканированных чеков и счетов к распознаванию текста +- Выпрямление страниц с планшетного сканера при неровной укладке бумаги +- Улучшение внешнего вида оцифрованных архивных материалов + +## Советы + +- Уменьшите порог до 0.1 градуса, если для OCR нужно попиксельное выравнивание. +- 150 DPI быстро и точно подходит для большинства документов. Используйте 300 DPI для очень мелкого текста или страниц с тонкими деталями. +- Выпрямление лучше всего работает с документами, где есть четкие горизонтальные строки текста. Страницы, состоящие в основном из изображений или диагональных элементов оформления, могут вызывать трудности. + +## Связанные инструменты + +- [Растеризация документа](./rasterize-pdf): преобразуйте выпрямленный результат в плоский PDF на основе изображений +- [Сжатие PDF](./compress-pdf): уменьшите размер файла после выпрямления +- [Восстановление документа](./repair-pdf): исправление структурных проблем в отсканированных PDF diff --git a/docs/ru/tools/digital-sign-pdf.md b/docs/ru/tools/digital-sign-pdf.md new file mode 100644 index 00000000..65136141 --- /dev/null +++ b/docs/ru/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Цифровая подпись +description: Добавляйте в PDF криптографические цифровые подписи с помощью сертификатов X.509. Поддерживаются форматы PKCS#12 и PEM и видимые подписи. +--- + +# Цифровая подпись + +Цифровая подпись является криптографическим доказательством того, что документ подписал конкретный человек и что документ не изменялся после подписания. В отличие от нарисованной подписи (которая является просто изображением), цифровая подпись использует сертификаты X.509 и стандарты PKCS#7, обеспечивая проверяемую подлинность и целостность. + +BentoPDF применяет цифровые подписи полностью в вашем браузере. Ваш закрытый ключ никогда не покидает устройство. + +## Как это работает + +1. Загрузите PDF-файл. +2. Загрузите файл сертификата (.pfx, .p12 или .pem). +3. Введите пароль сертификата, чтобы разблокировать его. Инструмент покажет субъекта, издателя и срок действия сертификата. +4. При желании настройте метаданные подписи (причина, место, контактные данные). +5. При желании включите **видимую подпись** с настройкой положения, размера, изображения и текста. +6. Нажмите **Подписание PDF**. + +## Поддерживаемые форматы сертификатов + +| Формат | Расширения | Описание | +| ----------- | ---------- | -------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Отраслевой стандартный контейнер с закрытым ключом и цепочкой сертификатов. Самый распространенный формат. | +| **PEM** | .pem | Текстовый формат. Сертификат и закрытый ключ должны находиться в одном файле. Поддерживаются зашифрованные закрытые ключи. | + +## Параметры видимой подписи + +Если включено, на странице PDF отображается блок видимой подписи: + +- **Положение**: координаты X/Y, а также ширина и высота в пунктах +- **Страница**: первая страница, последняя страница, все страницы или конкретный номер страницы +- **Изображение**: загрузите изображение PNG, JPG или WebP (рукописная подпись, печать компании и т. д.) +- **Текст**: произвольный текст с настраиваемым цветом и размером шрифта. Если не заданы ни изображение, ни текст, инструмент автоматически создает текст из общего имени сертификата и текущей даты. + +## Метаданные подписи + +- **Причина**: зачем подписан документ (например, «Утверждено», «Проверено») +- **Место**: где происходило подписание (например, «Нью-Йорк») +- **Контактная информация**: как связаться с подписавшим (например, адрес электронной почты) + +## Примечание об интернет-соединении + +Для подписания может потребоваться подключение к интернету. Библиотека подписи загружает цепочку сертификатов по URL-адресам, указанным в расширении Authority Information Access (AIA) вашего сертификата. Если эти серверы недоступны, подписание не удастся для сертификатов, которым требуется проверка цепочки. + +## Сценарии использования + +- Подписание договоров, коммерческих предложений и соглашений юридически значимыми цифровыми подписями +- Заверение официальных документов в процессах, где требуется аутентификация на основе PKI +- Подписание PDF-счетов для соответствия требованиям регуляторов (во многих странах ЕС требуются электронные счета с цифровой подписью) +- Добавление организационного утверждения к инженерным чертежам и документам по качеству + +## Советы + +- Самоподписанные сертификаты подходят для тестирования, но в Adobe Reader будут показывать предупреждения. Для рабочих документов используйте сертификат доверенного центра сертификации. +- Видимая подпись является чисто визуальной. Криптографическая подпись встраивается независимо от того, включен ли видимый блок. +- Проверьте подписанный PDF инструментом «Проверка подписи в PDF», чтобы убедиться, что подпись не повреждена. + +## Связанные инструменты + +- [Проверка подписи в PDF](./validate-signature-pdf): проверка цифровых подписей в подписанных PDF +- [Сведение документа](./flatten-pdf): сведите формы перед подписанием, чтобы предотвратить изменения +- [Защита PDF](./protect-pdf): добавьте защиту паролем поверх цифровой подписи +- [Удаление метаданных](./remove-metadata): удалите метаданные перед подписанием diff --git a/docs/ru/tools/divide-pages.md b/docs/ru/tools/divide-pages.md new file mode 100644 index 00000000..b7e6e646 --- /dev/null +++ b/docs/ru/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Разделение страниц +description: Делите страницы PDF по горизонтали или вертикали на более мелкие части. +--- + +# Разделение страниц + +Разрезайте отдельные страницы PDF пополам по горизонтали или по вертикали. Это полезно, когда на одной странице находится содержимое, которое нужно разнести на отдельные страницы, например двухколоночная верстка, отсканированная как одна широкая страница. + +## Как это работает + +1. Загрузите PDF-файл. +2. Выберите направление разделения: **По вертикали** (левая и правая половины) или **По горизонтали** (верхняя и нижняя половины). +3. При желании укажите диапазон страниц, чтобы разделить только их. Оставьте поле пустым, чтобы разделить все страницы. +4. Нажмите кнопку обработки, чтобы создать разделенный PDF. + +## Возможности + +- Вертикальное разделение: каждая страница делится на левую и правую половины +- Горизонтальное разделение: каждая страница делится на верхнюю и нижнюю половины +- Фильтр по диапазону страниц для выборочного разделения +- Страницы вне диапазона остаются без изменений +- Качество содержимого сохраняется без повторной отрисовки + +## Сценарии использования + +- Разделение отсканированных разворотов (например, скан книги, где на одном листе левая и правая страницы) +- Разделение альбомного PDF с содержимым рядом на отдельные книжные страницы +- Разделение высоких инфографик и плакатов на верхнюю и нижнюю части +- Подготовка широкоформатных документов к печати на стандартной бумаге + +## Советы + +- Если содержимое на страницах распределено неравномерно, разделение все равно происходит ровно посередине. Для несимметричного разделения лучше использовать [Обрезка PDF](./crop-pdf). +- Если страницы нужно повернуть до или после разделения, сочетайте этот инструмент с [Поворот PDF](./rotate-pdf). + +## Связанные инструменты + +- [Разделение PDF](./split-pdf) +- [Обрезка PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Постеризация документа](./posterize-pdf) diff --git a/docs/ru/tools/duplex-collate.md b/docs/ru/tools/duplex-collate.md new file mode 100644 index 00000000..9e36a247 --- /dev/null +++ b/docs/ru/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Сортировка двустороннего сканирования +description: Приводите PDF двустороннего сканирования, где лицевые и оборотные страницы идут отдельными блоками, к правильному порядку лицевых и оборотных страниц. +--- + +# Сортировка двустороннего сканирования + +Этот инструмент предназначен для сценариев сканирования через автоподатчик (ADF), когда один PDF содержит два блока страниц: + +- сначала все лицевые стороны +- затем все оборотные стороны + +Вместо ручного разделения и пересборки инструмент чередует два блока в естественном порядке чтения: лицевая 1, оборотная 1, лицевая 2, оборотная 2 и так далее. + +## Как это работает + +1. Загрузите один PDF, созданный сканированием стопки с двух сторон. +2. Укажите точку разделения, где заканчивается блок лицевых сторон. +3. Выберите обработку блока оборотных сторон: + - **Обратить блок оборотов** (обычно нужно, когда стопку переворачивают перед сканированием оборотов) + - **Оставить блок оборотов без изменений** +4. Нажмите **Собрать PDF**, чтобы скачать результат с измененным порядком. + +## Параметры + +- **Определить разделение автоматически (половина)**: устанавливает точку разделения на `ceil(totalPages / 2)`. +- **Предупреждение о нечетном числе страниц**: предупреждает, если общее число страниц нечетное (часто это признак несоответствия при сканировании). +- **Подтверждение неравных блоков**: запрашивает подтверждение, если размеры блоков лицевых и оборотных сторон различаются. +- **Экспорт группами**: делит результат на отдельные PDF по числу страниц исходного документа и скачивает их в виде ZIP. + +## Поведение результата + +- **По умолчанию**: один выходной PDF (один входной PDF дает один выходной PDF). +- **Групповой режим**: результат делится на части по заданному числу страниц на документ; если получилось несколько частей, они скачиваются одним ZIP, иначе скачивается один PDF. + +Если размеры блоков различаются, сначала сопоставляются парные страницы, а оставшиеся непарные страницы добавляются в конец. + +## Типичные сценарии использования + +- Восстановление порядка после сканирования стопки двусторонних форм за два прохода. +- Пересборка комплектов лицевых и оборотных страниц с офисных сканеров, которые выдают сначала все лицевые, затем все оборотные стороны. +- Постобработка архивных сканов перед разделением на файлы по документам. + +## Советы + +- В большинстве двусторонних пакетов общее число страниц должно быть четным. +- Если оборотные стороны оказались перевернутыми, переключитесь между **Обратить блок оборотов** и **Оставить блок оборотов без изменений**. +- Для оригиналов из 2 страниц (лицевая и оборотная) используйте групповой экспорт с `2` страницами на документ. + +## Связанные инструменты + +- [Объединение документов с чередованием страниц](./alternate-merge) +- [Разделение PDF](./split-pdf) +- [Объединение PDF](./merge-pdf) +- [Дублирование и организация](./organize-pdf) diff --git a/docs/ru/tools/edit-attachments.md b/docs/ru/tools/edit-attachments.md new file mode 100644 index 00000000..b5a56eef --- /dev/null +++ b/docs/ru/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Редактирование вложений +description: Просматривайте и выборочно удаляйте файлы, вложенные в PDF-документ. +--- + +# Редактирование вложений + +Просматривайте вложенные файлы PDF и управляйте ими. Инструмент перечисляет каждый встроенный файл с его именем и уровнем вложения, а затем позволяет отметить отдельные вложения для удаления или удалить их все сразу. + +## Как это работает + +1. Загрузите PDF-файл. +2. Инструмент автоматически ищет вложения и показывает их в списке. +3. Для каждого вложения показаны имя файла и уровень: документа или страницы. +4. Щелкните значок корзины рядом с вложением, чтобы отметить его для удаления (повторный щелчок снимает отметку). +5. Кнопка **Удалить все вложения** выбирает все сразу, а **Снять выделение** снимает выбор. +6. Нажмите кнопку обработки, чтобы сохранить новый PDF без выбранных вложений. + +## Возможности + +- Список всех вложений уровня документа и уровня страницы +- Удаление отдельных вложений или всех сразу +- Выбор можно включать и отключать до применения изменений +- Отмеченные для удаления элементы зачеркиваются и становятся полупрозрачными +- Скачивание измененного PDF без выбранных вложений + +## Сценарии использования + +- Удаление устаревших или неверных файлов, встроенных в документ, перед повторным распространением +- Удаление конфиденциальных вложений (финансовые данные, личная информация) из PDF перед отправкой +- Уменьшение размера PDF за счет удаления больших встроенных файлов, которые больше не нужны +- Аудит встроенного содержимого и очистка документа перед архивацией + +## Советы + +- Вложения, отмеченные для удаления, показываются зачеркнутыми. Если вы передумали, можно снять отметку до обработки. +- Если вложения не найдены, инструмент показывает сообщение «В этом PDF вложений не найдено»: в PDF просто нет встроенных файлов. + +## Связанные инструменты + +- [Добавление вложений](./add-attachments) +- [Извлечение вложений](./extract-attachments) +- [Просмотр метаданных](./view-metadata) diff --git a/docs/ru/tools/edit-metadata.md b/docs/ru/tools/edit-metadata.md new file mode 100644 index 00000000..09648bad --- /dev/null +++ b/docs/ru/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Редактирование метаданных +description: Просматривайте и изменяйте поля метаданных PDF, включая заголовок, автора, ключевые слова, даты и пользовательские свойства. +--- + +# Редактирование метаданных + +Редактируйте метаданные, встроенные в PDF-файл. Инструмент заполняет форму существующими метаданными документа, позволяет изменить любое поле и сохраняет изменения в новый PDF. + +## Как это работает + +1. Загрузите PDF-файл. Инструмент считает текущие метаданные и заполнит ими форму. +2. Измените любое из стандартных полей: Название, Автор, Тема, Ключевые слова, Создатель, Производитель. +3. Настройте поля «Дата создания» и «Дата изменения» с помощью выбора даты и времени. +4. Добавьте пользовательские поля метаданных, нажав кнопку добавления и введя пару «ключ-значение». +5. Нажмите кнопку обработки, чтобы сохранить измененный PDF. + +## Возможности + +- Автоматическое заполнение всех существующих метаданных из загруженного PDF +- Стандартные поля: Название, Автор, Тема, Ключевые слова, Создатель, Производитель +- Выбор даты и времени для полей «Дата создания» и «Дата изменения» +- Пользовательские поля «ключ-значение» для произвольных свойств +- Изменения сохраняются прямо в словарь информации о документе PDF + +## Редактируемые поля + +| Поле | Описание | +| ------------------------- | ------------------------------------------------------------- | +| **Название** | Заголовок документа, который показывают программы для PDF | +| **Автор** | Человек или организация, создавшие документ | +| **Тема** | Краткое описание темы документа | +| **Ключевые слова** | Термины через запятую для поиска и классификации | +| **Создатель** | Приложение, в котором было создано исходное содержимое | +| **Производитель** | Приложение, создавшее PDF | +| **Дата создания** | Когда документ был создан изначально | +| **Дата изменения** | Когда документ последний раз изменялся | +| **Пользовательские поля** | Любые дополнительные пары «ключ-значение», которые вы задаете | + +## Сценарии использования + +- Задание правильного заголовка и автора перед публикацией документа +- Добавление ключевых слов для лучшего поиска в системах управления документами +- Обновление даты изменения под текущую редакцию +- Добавление пользовательских полей метаданных, например Department, Project ID или Classification +- Очистка метаданных, оставленных исходной программой + +## Советы + +- Пользовательские поля записываются прямо в словарь информации PDF. Некоторые программы для PDF могут не показывать пользовательские поля, но в файле они сохраняются. +- Оставьте поле пустым, чтобы убрать его из метаданных. Кнопка обработки сохраняет все, что находится в форме. +- Чтобы просмотреть метаданные без редактирования, используйте [Просмотр метаданных](./view-metadata). Чтобы полностью удалить все метаданные, используйте «Удаление метаданных». + +## Связанные инструменты + +- [Просмотр метаданных](./view-metadata) +- [PDF OCG](./pdf-layers) +- [Сжатие PDF](./compress-pdf) diff --git a/docs/ru/tools/edit-pdf.md b/docs/ru/tools/edit-pdf.md new file mode 100644 index 00000000..585032be --- /dev/null +++ b/docs/ru/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Редактор PDF +description: Аннотируйте, выделяйте, редактируйте (закрашивайте) содержимое, добавляйте фигуры и изображения, ищите и просматривайте PDF прямо в браузере. +--- + +# Редактор PDF + +Редактор PDF в BentoPDF позволяет аннотировать, выделять, закрашивать конфиденциальные данные, комментировать, добавлять фигуры и изображения и искать по PDF. Полнофункциональный редактор загружается прямо в браузере, без отправки файлов на сервер. + +## Как это работает + +1. Загрузите PDF, щелкнув по области загрузки или перетащив файл на нее. +2. Встроенный редактор PDF автоматически откроется с вашим документом. +3. С помощью панели инструментов аннотируйте, выделяйте, закрашивайте, добавляйте текст, рисуйте фигуры или вставляйте изображения. +4. Нажмите **Скачать изменённый PDF**, чтобы сохранить изменения. + +## Возможности + +- Полная панель аннотаций: выделение, подчеркивание, зачеркивание и рисование от руки +- Вставка текста и комментирование +- Инструменты редактирования (redaction), которые безвозвратно удаляют отмеченное содержимое после применения. Если при нажатии **Скачать изменённый PDF** остались непримененные отметки, редактор предложит сначала применить их. +- Фигуры: прямоугольники, окружности, линии и стрелки +- Вставка изображений на страницы PDF +- Встроенный текстовый поиск по документу +- Поддержка нескольких документов во вкладках (до 10 документов одновременно) +- Загрузка файлов перетаскиванием + +## Сценарии использования + +- Проверка договоров и пометка изменений выделениями и комментариями +- Закрашивание конфиденциальной информации, например номеров социального страхования или финансовых данных, перед отправкой +- Добавление аннотаций на архитектурные планы и инженерные чертежи +- Вставка логотипов компании или штампов на страницы документа +- Поиск определенных терминов в объемных юридических документах + +## Советы + +- Можно открыть несколько PDF одновременно и переключаться между ними с помощью панели вкладок вверху редактора. +- Редактор сохраняет исходную структуру PDF, поэтому шрифты, макеты и поля форм остаются нетронутыми. +- Пометка текста или области для закрашивания ничего не удаляет, пока закрашивание не применено. Когда вы закрашиваете выделенный текст, его копии в свойствах файла, закладках, комментариях и вложениях также удаляются из скачиваемого файла, если файл не зашифрован. +- Для массового нанесения водяных знаков или нумерации страниц используйте специальные инструменты: у них больше возможностей форматирования. + +## Связанные инструменты + +- [Добавление водяных знаков](./add-watermark) +- [Подписание PDF](./sign-pdf) +- [Добавление штампов](./add-stamps) +- [Удаление аннотаций](./remove-annotations) diff --git a/docs/ru/tools/email-to-pdf.md b/docs/ru/tools/email-to-pdf.md new file mode 100644 index 00000000..f74ef8a8 --- /dev/null +++ b/docs/ru/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email в PDF +description: Преобразуйте файлы электронной почты EML и MSG в PDF прямо в браузере. Сохраняются заголовки, текст письма и список вложений. +--- + +# Email в PDF + +Превращайте сохраненные файлы электронной почты в аккуратные PDF для печати. Инструмент разбирает файлы EML и MSG, извлекает все письмо (заголовки, текст и сведения о вложениях) и отображает все это в структурированном PDF. Подходит для юридического раскрытия документов, ведения записей или просто печати важного письма. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----- | :--------- | :------------------------------------------------------------------------------ | +| EML | `.eml` | Стандартный формат писем MIME (экспортируется из большинства почтовых клиентов) | +| MSG | `.msg` | Проприетарный формат Microsoft Outlook | + +## Как это работает + +1. Щелкните по области загрузки или перетащите в нее файлы EML или MSG. В одной партии можно смешивать оба формата. +2. Проверьте список файлов. Удаляйте ненужные записи значком корзины или нажмите **Добавить еще файлы**, чтобы добавить еще письма. +3. Настройте параметры преобразования (см. ниже). +4. Нажмите **Преобразовать в PDF**. Инструмент разбирает каждое письмо, отображает содержимое как стилизованный HTML и преобразует его в PDF через движок PyMuPDF. +5. Одно письмо скачивается сразу как PDF. Несколько писем упаковываются в `emails-converted.zip`. + +## Параметры + +| Параметр | По умолчанию | Описание | +| :---------------------------------------------------------- | :----------- | :---------------------------------------------------------------------------------------- | +| **Размер страницы** | A4 | Выберите размер страницы: A4, Letter или Legal. | +| **Указывать получателей копии и скрытой копии в заголовке** | Вкл. | Если включено, списки получателей CC и BCC отображаются в разделе заголовка письма в PDF. | +| **Добавить список вложений письма** | Вкл. | Если включено, в PDF появляется список вложенных файлов письма (с именами и размерами). | + +## Сценарии использования + +- Архивирование важной деловой переписки в PDF для соблюдения требований или аудита +- Печать цепочек писем для судебных разбирательств или запросов на раскрытие документов +- Создание постоянной записи подтверждений заказов, чеков и договоров, полученных по электронной почте +- Резервное копирование файлов Outlook MSG в формате, для чтения которого не нужен Outlook +- Документирование обращений в службу поддержки по экспортированным файлам EML + +## Советы + +- Поддерживаются и EML (используется в Thunderbird, Apple Mail и большинстве почтовых клиентов), и файлы Outlook MSG. Экспортируйте письма из почтового клиента и перетащите их прямо в инструмент. +- Письма в формате HTML сохраняют оформление в PDF. Письма в виде обычного текста отображаются с аккуратным читаемым форматированием. +- Список вложений показывает имена файлов и размеры, но не встраивает сами вложенные файлы в PDF. + +## Связанные инструменты + +- [XML в PDF](./xml-to-pdf) +- [XPS в PDF](./xps-to-pdf) diff --git a/docs/ru/tools/epub-to-pdf.md b/docs/ru/tools/epub-to-pdf.md new file mode 100644 index 00000000..5ec32adc --- /dev/null +++ b/docs/ru/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB в PDF +description: Преобразуйте электронные книги EPUB в PDF прямо в браузере. Бесплатно, без загрузки на сервер, с упором на конфиденциальность. +--- + +# EPUB в PDF + +Преобразуйте электронные книги EPUB в PDF-файлы, не выходя из браузера. EPUB является открытым стандартом цифровых книг, но иногда нужен PDF с фиксированной версткой: для печати, аннотирования или передачи тем, у кого нет программы для чтения электронных книг. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----- | :--------- | :-------------------- | +| EPUB | `.epub` | Файлы EPUB 2 и EPUB 3 | + +## Как это работает + +1. Щелкните по области загрузки или перетащите в нее файлы EPUB. Можно выбрать сразу несколько файлов. +2. Проверьте загруженные файлы. Удаляйте ненужные записи значком корзины или нажмите **Добавить еще файлы**, чтобы расширить партию. +3. Нажмите **Преобразовать в PDF**. Движок PyMuPDF преобразует содержимое EPUB (текст, изображения и форматирование) в постраничный PDF. +4. Один EPUB скачивается сразу как PDF. Несколько файлов упаковываются в ZIP-архив `epub-converted.zip`. + +## Параметры + +Преобразование выполняется с разумными настройками по умолчанию, дополнительная конфигурация не нужна. Текст перетекает в страницы стандартного размера, а встроенные шрифты и изображения переносятся в PDF. + +## Сценарии использования + +- Печать электронной книги без DRM для чтения вдали от экранов +- Отправка рукописи в формате EPUB на рецензию в виде PDF с фиксированной версткой +- Архивирование цифровых книг в формате, который нативно открывает любая операционная система +- Передача главы коллеге, у которого нет программы для чтения EPUB +- Преобразование технической документации в формате EPUB в PDF с возможностью аннотирования + +## Советы + +- Возможности EPUB 3, такие как встроенное аудио и видео, в PDF не переносятся, но весь текст, изображения и таблицы преобразуются корректно. +- Для сильно стилизованных EPUB проверьте первые страницы результата, чтобы убедиться в точности верстки. + +## Связанные инструменты + +- [MOBI в PDF](./mobi-to-pdf) +- [FB2 в PDF](./fb2-to-pdf) +- [CBZ в PDF](./cbz-to-pdf) diff --git a/docs/ru/tools/excel-to-pdf.md b/docs/ru/tools/excel-to-pdf.md new file mode 100644 index 00000000..e3b83a36 --- /dev/null +++ b/docs/ru/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel в PDF +description: Преобразуйте электронные таблицы Excel (XLS, XLSX), а также файлы ODS и CSV в PDF с сохранением форматирования. +--- + +# Excel в PDF + +Преобразуйте файлы электронных таблиц в PDF. Инструмент работает с современными файлами Excel, устаревшим форматом XLS, таблицами OpenDocument и даже CSV. Все они обрабатываются браузерным движком LibreOffice, который сохраняет форматирование ячеек, формулы (как вычисленные значения), диаграммы и макеты с несколькими листами. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :------------------- | :--------- | +| Excel (современный) | `.xlsx` | +| Excel (устаревший) | `.xls` | +| Таблица OpenDocument | `.ods` | +| CSV | `.csv` | + +## Как это работает + +1. Щелкните по области загрузки или перетащите в нее файлы электронных таблиц. +2. Проверьте список файлов. Добавьте еще файлы или удалите ненужные. +3. Нажмите **Преобразовать в PDF**. Движок LibreOffice инициализируется при первом использовании, затем обрабатывает каждый файл. +4. Один файл скачивается сразу как PDF. Несколько файлов передаются в виде `excel-converted.zip`. + +## Параметры + +У этого инструмента нет дополнительных настроек. Движок LibreOffice определяет макет страницы, масштаб и область печати по встроенным настройкам таблицы. + +## Результат + +| Количество файлов | Результат | +| :---------------- | :------------------------------------------------------------------ | +| 1 файл | Скачивание одного PDF (исходное имя файла с расширением `.pdf`) | +| 2 и более файлов | ZIP-архив (`excel-converted.zip`) с отдельным PDF для каждого файла | + +## Сценарии использования + +- Преобразование финансовых отчетов и бюджетов из Excel в PDF для рассылки +- Создание готовых к печати PDF из таблиц складских остатков и каталогов товаров +- Передача результатов анализа данных заинтересованным лицам, у которых не установлен Excel +- Архивирование квартальных отчетов в формате, не допускающем редактирования +- Преобразование файлов ODS из LibreOffice Calc в PDF + +## Советы + +- Диаграммы, встроенные в таблицу, отображаются в PDF. Перед преобразованием убедитесь, что в исходном файле они выглядят правильно. +- Если в таблице несколько листов, в итоговый PDF попадают все листы. +- Для простых данных CSV без форматирования инструмент [CSV в PDF](./csv-to-pdf) выполняет более легкое преобразование. Используйте Excel в PDF, когда нужно сохранить форматирование, диаграммы или несколько листов. + +## Связанные инструменты + +- [CSV в PDF](./csv-to-pdf) +- [Word в PDF](./word-to-pdf) +- [PowerPoint в PDF](./powerpoint-to-pdf) diff --git a/docs/ru/tools/extract-attachments.md b/docs/ru/tools/extract-attachments.md new file mode 100644 index 00000000..c0bbdad0 --- /dev/null +++ b/docs/ru/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Извлечение вложений +description: Извлекайте все встроенные файлы из одного или нескольких PDF и скачивайте их в виде ZIP-архива. +--- + +# Извлечение вложений + +Извлеките все встроенные вложения из одного или нескольких PDF-файлов. Все извлеченные файлы собираются в один ZIP-архив для скачивания. + +## Как это работает + +1. Загрузите один или несколько PDF-файлов со встроенными вложениями. +2. Нажмите **Извлечение вложений**. +3. Инструмент просматривает каждый PDF в поисках вложений уровня документа и уровня страницы. +4. Все найденные файлы упаковываются в ZIP-архив, который скачивается автоматически. +5. Сообщение о статусе подтверждает, сколько вложений найдено и каков их общий размер. + +## Возможности + +- Пакетное извлечение из нескольких PDF одновременно +- Извлекаются вложения как уровня документа, так и уровня страницы +- Результат: один ZIP-файл со всеми извлеченными файлами +- Показывает общее число вложений и суммарный размер файлов +- Понятные сообщения о статусе, если вложения не найдены + +## Сценарии использования + +- Восстановление файлов данных, встроенных в PDF-отчет +- Извлечение графических материалов из портфолио или технической спецификации +- Извлечение дополнительных материалов из обучающих PDF и документов по соответствию требованиям +- Аудит файлов, встроенных в набор PDF + +## Советы + +- Если инструмент сообщает об отсутствии вложений, в PDF могут быть встроенные изображения или данные форм, а они не являются вложенными файлами. Для встроенных изображений используйте [Извлечение изображений](./extract-images). +- При обработке нескольких PDF все вложения из всех файлов попадают в один ZIP. Имена файлов сохраняются такими, какими они были при встраивании. + +## Связанные инструменты + +- [Добавление вложений](./add-attachments) +- [Редактирование вложений](./edit-attachments) +- [Извлечение изображений](./extract-images) diff --git a/docs/ru/tools/extract-images.md b/docs/ru/tools/extract-images.md new file mode 100644 index 00000000..37319b97 --- /dev/null +++ b/docs/ru/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Извлечение изображений +description: Извлекайте все встроенные изображения из PDF-файлов. Просматривайте их в сетке и скачивайте по отдельности или ZIP-архивом. +--- + +# Извлечение изображений + +Извлекает все встроенные изображения из одного или нескольких PDF-файлов. Извлеченные изображения показываются в сетке предпросмотра, где их можно скачать по одному или сразу все ZIP-архивом. Работает на PyMuPDF. + +## Как это работает + +1. Загрузите один или несколько PDF, щелкнув по области загрузки или перетащив на нее файлы. Добавляйте файлы или удаляйте отдельные при необходимости. +2. Нажмите **Извлечение изображений**, чтобы начать обработку. +3. Инструмент просматривает каждую страницу каждого загруженного PDF, находя и извлекая встроенные изображения. +4. Извлеченные изображения появляются в сетке с миниатюрами. У каждого изображения есть кнопка скачивания. +5. Нажмите **Скачать всё**, чтобы сохранить все в виде ZIP-архива. + +## Параметры + +У этого инструмента нет настраиваемых параметров. Все встроенные изображения извлекаются в исходном формате (обычно PNG, JPEG или тот формат, в котором изображение было встроено в PDF). + +## Формат результата + +- В сетке предпросмотра изображения называются `image_1.png`, `image_2.jpg` и так далее. +- **Скачать всё** создает `extracted-images.zip` со всеми изображениями. +- Отдельные изображения можно скачивать по одному из сетки. + +## Сценарии использования + +- Восстановление фотографий и графики из PDF для повторного использования в другом проекте. +- Извлечение изображений товаров из PDF-каталога для карточки в интернет-магазине. +- Извлечение схем из технической документации для презентаций. +- Аудит изображений, встроенных в документ, перед его отправкой. + +## Советы + +- Инструмент извлекает изображения ровно в том виде, в котором они хранятся в PDF. Он не преобразует страницы в изображения: для этого используйте [PDF в PNG](./pdf-to-png) или [PDF в JPG](./pdf-to-jpg). +- Если инструмент сообщает «Изображения не найдены», в PDF может быть векторная графика вместо встроенных растровых изображений, либо это отсканированный документ, где вся страница является одним большим изображением. +- Пакетная обработка работает с несколькими PDF. Все изображения из всех файлов объединяются в одну сетку и один ZIP. + +## Связанные инструменты + +- [PDF в PNG](./pdf-to-png) +- [PDF в JPG](./pdf-to-jpg) +- [Конструктор PDF-процессов](./pdf-workflow) diff --git a/docs/ru/tools/extract-pages.md b/docs/ru/tools/extract-pages.md new file mode 100644 index 00000000..e4762144 --- /dev/null +++ b/docs/ru/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Извлечение страниц +description: Сохраняйте выбранный диапазон страниц PDF в виде нового документа. +--- + +# Извлечение страниц + +Извлеките набор страниц из PDF и сохраните их как новый файл. Укажите нужные страницы с помощью синтаксиса диапазонов, и инструмент создаст чистый PDF, содержащий только эти страницы. + +## Как это работает + +1. Загрузите PDF-файл. Инструмент покажет имя файла, размер и общее число страниц. +2. Введите страницы для извлечения с помощью синтаксиса диапазонов (например, `1-5`, `3, 7, 10-12`). +3. При желании выберите скачивание каждого диапазона как отдельного PDF в ZIP-архиве. +4. Нажмите кнопку обработки. Извлеченные страницы скачиваются как новый PDF (или ZIP). + +## Возможности + +- Гибкий синтаксис диапазонов: отдельные страницы, диапазоны или комбинации через запятую +- После загрузки показывается общее число страниц для удобства +- Результат можно получить одним объединенным PDF или отдельными файлами в ZIP +- Содержимое и форматирование исходных страниц сохраняются + +## Сценарии использования + +- Извлечение краткого резюме (первых нескольких страниц) из объемного отчета +- Извлечение одной главы из PDF-учебника +- Сохранение отдельных страниц из пакета форм как самостоятельных документов +- Создание образца документа из выбранных страниц большого файла + +## Советы + +- Нумерация страниц начинается с 1. Для первой страницы используйте `1`, а не `0`. +- Чтобы удалить страницы, а не извлечь их, используйте [Удаление страниц](./delete-pages): это обратная операция. +- Если нужен визуальный выбор страниц по миниатюрам, используйте [Разделение PDF](./split-pdf) в режиме «Выбрать страницы визуально». + +## Связанные инструменты + +- [Разделение PDF](./split-pdf) +- [Удаление страниц](./delete-pages) +- [Объединение PDF](./merge-pdf) diff --git a/docs/ru/tools/extract-tables.md b/docs/ru/tools/extract-tables.md new file mode 100644 index 00000000..bb4f2498 --- /dev/null +++ b/docs/ru/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Извлечение таблиц из PDF +description: Находите и извлекайте таблицы из PDF-документов. Экспорт в CSV, JSON или Markdown с разбивкой по таблицам. +--- + +# Извлечение таблиц из PDF + +Находит все таблицы в PDF и позволяет экспортировать их в выбранном формате: CSV, JSON или Markdown. Каждая таблица извлекается отдельно с метаданными о странице и положении. Работает на движке обнаружения таблиц PyMuPDF. + +## Как это работает + +1. Загрузите PDF, щелкнув по области загрузки или перетащив на нее файл. +2. Выберите нужный **формат экспорта**: CSV, JSON или Markdown. +3. Нажмите **Извлечь таблицы**, чтобы начать обработку. +4. Если найдена одна таблица, она скачивается одним файлом. Если таблиц несколько, создается ZIP-архив с отдельным файлом для каждой таблицы. + +## Параметры + +- **Формат экспорта**: выберите один из вариантов: + - **CSV**: значения через запятую с корректным заключением в кавычки полей, содержащих запятые, кавычки или переводы строк. Подходит для электронных таблиц и баз данных. + - **JSON**: структура «массив массивов» с форматированием и отступом в 2 пробела. Подходит для программной обработки. + - **Markdown**: формат таблицы с разделителями-вертикальными чертами, создаваемый PyMuPDF. Подходит для документации и файлов README. + +## Формат результата + +- **Одна таблица**: `filename_table.csv` (или `.json` / `.md`) +- **Несколько таблиц**: `filename_tables.zip` с файлами `table_1_page3.csv`, `table_2_page5.csv` и так далее. + +## Сценарии использования + +- Извлечение отдельных таблиц из объемных PDF-отчетов без выгрузки данных всего документа. +- Получение таблиц в формате Markdown для вставки прямо в задачи GitHub, вики и документацию. +- Получение структурированных данных JSON из таблиц PDF для интеграций с API и скриптов. +- Сравнение таблиц из разных версий PDF: экспортируйте обе версии в CSV и сравните их. + +## Советы + +- Этот инструмент дает контроль над каждой таблицей. Если нужно выгрузить все таблицы в один CSV, используйте [PDF в CSV](./pdf-to-csv). Для полной книги Excel используйте [PDF в Excel](./pdf-to-excel). +- Таблицы, занимающие несколько страниц, могут быть определены как отдельные таблицы на каждой странице. Возможно, их придется объединить вручную. +- Если таблицы не обнаружены, возможно, PDF является отсканированным изображением. Сначала выполните распознавание текста, чтобы добавить текстовый слой. + +## Связанные инструменты + +- [PDF в CSV](./pdf-to-csv) +- [PDF в Excel](./pdf-to-excel) +- [PDF в текст](./pdf-to-text) diff --git a/docs/ru/tools/fb2-to-pdf.md b/docs/ru/tools/fb2-to-pdf.md new file mode 100644 index 00000000..347aec26 --- /dev/null +++ b/docs/ru/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 в PDF +description: Преобразуйте электронные книги FictionBook (FB2) в PDF прямо в браузере. Бесплатно, приватно, без загрузки на сервер. +--- + +# FB2 в PDF + +Преобразуйте файлы FictionBook 2 (FB2) в документы PDF. FB2 - это формат электронных книг на основе XML, популярный в России и Восточной Европе. На одних платформах он поддерживается хорошо, а на других почти неизвестен, поэтому конвертация в PDF сделает ваши книги доступными везде. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :------------ | :--------- | :----------------------------- | +| FictionBook 2 | `.fb2` | Формат электронных книг на XML | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы FB2. Можно выбрать сразу несколько файлов. +2. Просмотрите список файлов. Значок корзины удаляет отдельные записи, а **Добавить ещё файлы** позволяет добавить другие. +3. Нажмите **Преобразовать в PDF**. Движок PyMuPDF разбирает XML-структуру FB2 и выводит её как постраничное содержимое PDF. +4. Один файл скачивается сразу как PDF. Несколько результатов упаковываются в `fb2-converted.zip`. + +## Параметры + +Настройка не требуется. Конвертер сам обрабатывает XML-структуру FB2 и сохраняет разделы, форматирование и встроенные изображения. + +## Сценарии использования + +- Чтение книг FB2 на устройствах и в приложениях, которые поддерживают только PDF +- Печать русскоязычной литературы, распространяемой в формате FB2 +- Архивирование библиотеки FB2 в универсальном формате +- Передача книги тому, чья программа для чтения не поддерживает FictionBook + +## Советы + +- Файлы FB2 представляют собой обычный XML, поэтому они обычно небольшие и быстро конвертируются даже в браузере. +- Если ваши файлы FB2 сжаты как `.fb2.zip`, сначала распакуйте их, а затем загружайте. + +## Связанные инструменты + +- [EPUB в PDF](./epub-to-pdf) +- [MOBI в PDF](./mobi-to-pdf) +- [XML в PDF](./xml-to-pdf) diff --git a/docs/ru/tools/fix-page-size.md b/docs/ru/tools/fix-page-size.md new file mode 100644 index 00000000..d9fd0f78 --- /dev/null +++ b/docs/ru/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Редактор размера страниц +description: Приведите все страницы PDF к единому размеру. Выберите стандартный формат бумаги или задайте свои размеры. +--- + +# Редактор размера страниц + +PDF, собранные из нескольких источников, часто содержат страницы разных размеров: одни Letter, другие A4, а третьи совсем нестандартные. Этот инструмент приводит каждую страницу к одному целевому размеру, масштабируя содержимое по размеру или с заполнением. + +## Как это работает + +1. Загрузите файл PDF. +2. Выберите **Целевой размер страницы** в выпадающем списке (A4, Letter, Legal, A3, A5, Tabloid или Свой). +3. Выберите **Ориентацию**: «Авто» сохраняет исходную ориентацию каждой страницы, а также можно принудительно задать книжную или альбомную. +4. Выберите режим **Масштабирования содержимого**: «Вписать» (сохраняет всё содержимое, могут появиться поля) или «Заполнить» (заполняет страницу, края могут быть обрезаны). +5. При желании задайте **Цвет фона** для добавленных полей. +6. Нажмите **Исправить размер страниц**. + +## Параметры + +- **Стандартные размеры**: A4, Letter, Legal, A3, A5, Tabloid +- **Свои размеры**: введите ширину и высоту в дюймах или миллиметрах +- **Ориентация**: авто, книжная, альбомная +- **Режим масштабирования**: вписать или заполнить (с обрезкой) +- **Цвет фона**: любой цвет для заполнения полей + +## Сценарии использования + +- Выравнивание объединённого PDF, страницы которого получены с разных сканеров +- Преобразование документа US Letter в A4 для международной рассылки +- Подготовка PDF к печати, где нужен единый размер обреза +- Исправление страниц, которые слегка отличаются от стандарта (например, 8,49 x 11,02 дюйма вместо 8,5 x 11) + +## Советы + +- Режим «Вписать» гарантирует, что содержимое не потеряется. Режим «Заполнить» выглядит аккуратнее, но может обрезать края. +- Проверьте результат инструментом «Размеры страниц», чтобы убедиться, что все страницы соответствуют целевому размеру. +- По умолчанию фон белый. Если у документа тёмные поля, выберите тёмный цвет. + +## Связанные инструменты + +- [Размеры страниц](./page-dimensions): проверьте размеры страниц до и после исправления +- [Сжатие PDF](./compress-pdf): уменьшите размер файла после приведения к единому размеру +- [Обрезка PDF](./crop-pdf): обрезайте страницы вручную вместо автоматического масштабирования diff --git a/docs/ru/tools/flatten-pdf.md b/docs/ru/tools/flatten-pdf.md new file mode 100644 index 00000000..62aa1bc0 --- /dev/null +++ b/docs/ru/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Сведение документа +description: Преобразуйте интерактивные формы и аннотации в статичное содержимое. Поля форм перестают быть редактируемыми, а аннотации встраиваются в страницу. +--- + +# Сведение документа + +Сведение встраивает интерактивные элементы (поля форм, выпадающие списки, флажки, аннотации, выделения, стикеры) прямо в содержимое страницы. Внешний вид остаётся прежним, но редактировать и извлекать эти элементы уже нельзя. Это аналог распечатки заполненной формы и повторного сканирования, только качество остаётся идеальным. + +## Как это работает + +1. Загрузите один или несколько файлов PDF. +2. Нажмите **Свести PDF**. +3. Один файл скачивается напрямую. Несколько файлов упаковываются в ZIP-архив. + +Инструмент использует pdf-lib для сведения полей форм (через `form.flatten()`) и отдельный механизм сведения аннотаций, который встраивает их в поток страницы. Обе операции выполняются за один проход. + +## Что сводится + +- **Поля форм**: текстовые поля, флажки, переключатели, выпадающие списки, поля подписи +- **Аннотации**: комментарии, выделение, зачёркивание, подчёркивание, стикеры, штампы, рукописные аннотации +- **Интерактивные элементы**: кнопки, триггеры действий + +## Что остаётся без изменений + +- Текст (его по-прежнему можно выделять и искать) +- Изображения и графика +- Макет и размеры страниц +- Закладки и оглавление +- Гиперссылки (если они не реализованы как аннотации) + +## Сценарии использования + +- Блокировка заполненной формы, чтобы получатели не могли изменить отправленные ответы +- Подготовка PDF к архивированию, когда интерактивные элементы не нужны +- Исправление проблем отображения, когда аннотации по-разному выглядят в разных программах просмотра +- Защита подписанного документа от изменений после наложения подписи +- Уменьшение размера файла за счёт удаления описаний полей форм и объектов аннотаций + +## Советы + +- Сводите документ после завершения всех правок. Отменить сведение PDF невозможно. +- Если нужно не только свести документ, но и удалить метаданные, JavaScript и вложения, используйте инструмент «Санирование документа»: сведение есть среди его параметров. +- Некоторые PDF сообщают «форма не найдена». Это нормально, если в документе есть только аннотации и нет полей форм. + +## Связанные инструменты + +- [Санирование документа](./sanitize-pdf): сведение форм, а также удаление метаданных, скриптов и многого другого +- [Растеризация документа](./rasterize-pdf): преобразование в PDF на основе изображений для максимального сведения +- [Шрифты в кривые](./font-to-outline): преобразование шрифтов в векторные контуры +- [Защита PDF](./protect-pdf): защитите сведённый PDF паролем diff --git a/docs/ru/tools/font-to-outline.md b/docs/ru/tools/font-to-outline.md new file mode 100644 index 00000000..da93bf8f --- /dev/null +++ b/docs/ru/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Шрифты в кривые +description: Преобразуйте все шрифты PDF в векторные контуры для одинакового отображения на любых устройствах. Устраняет зависимость от шрифтов. +--- + +# Шрифты в кривые + +При преобразовании шрифтов в кривые каждый символ текста из глифа шрифта превращается в векторный контур. PDF перестаёт зависеть от установленных шрифтов и выглядит одинаково на любом устройстве, в любой операционной системе и на любом принтере. Это стандартный шаг в допечатной подготовке. + +## Как это работает + +1. Загрузите один или несколько файлов PDF. +2. Нажмите **Преобразовать в кривые**. +3. Ghostscript преобразует весь текст в векторные контуры. +4. Скачайте результат. Несколько файлов упаковываются в ZIP-архив. + +Настраивать ничего не нужно. Инструмент использует Ghostscript (WebAssembly), чтобы за один проход превратить все ссылки на шрифты в контуры. + +## Что меняется + +- Символы текста становятся векторными кривыми (кривыми Безье) +- Встраивать шрифты больше не нужно: PDF самодостаточен на уровне глифов +- Размер файла может вырасти, так как векторные контуры обычно занимают больше места, чем ссылки на шрифты +- Внешний вид сохраняется точно + +## Что вы теряете + +- Выделение и копирование текста +- Поиск по тексту (Ctrl+F перестаёт работать) +- Возможность редактировать текст +- Доступность для программ чтения с экрана + +## Сценарии использования + +- Отправка PDF в типографию, которая требует шрифты в кривых +- Передача документов с нестандартными или лицензионными шрифтами людям, у которых этих шрифтов нет +- Защита от подмены шрифтов, из-за которой документ выглядит иначе на других системах +- Подготовка PDF для лазерной гравировки или резки на станках с ЧПУ, где нужен векторный ввод +- Корректное отображение PDF с большим количеством логотипов на всех платформах + +## Советы + +- Сохраните исходный PDF. Преобразование в кривые необратимо: контуры нельзя превратить обратно в редактируемый текст. +- Если текст должен остаться доступным для поиска, лучше воспользуйтесь инструментом «Растеризация документа», а затем распознаванием текста. +- PDF с кривыми обычно больше по размеру. Если размер важен, потом запустите «Сжатие PDF». + +## Связанные инструменты + +- [Сведение документа](./flatten-pdf): сведение форм и аннотаций без изменения шрифтов +- [Растеризация документа](./rasterize-pdf): преобразование в PDF на основе изображений вместо векторных контуров +- [Сжатие PDF](./compress-pdf): уменьшение размера файла после преобразования в кривые +- [PDF в PDF/A](./pdf-to-pdfa): преобразование для архивирования после устранения зависимости от шрифтов diff --git a/docs/ru/tools/form-creator.md b/docs/ru/tools/form-creator.md new file mode 100644 index 00000000..8b3874cd --- /dev/null +++ b/docs/ru/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Создание PDF-форм +description: Создавайте заполняемые PDF-формы с текстовыми полями, флажками, выпадающими списками, переключателями и другими элементами перетаскиванием. +--- + +# Создание PDF-форм + +Создавайте профессиональные заполняемые PDF-формы с нуля или добавляйте поля в существующий PDF. Визуальный редактор позволяет перетаскивать элементы формы (текстовые поля, флажки, выпадающие списки, переключатели, поля подписи и другие) прямо на предварительный просмотр страницы. Настраивайте свойства полей, задавайте правила условной видимости и экспортируйте полностью интерактивную PDF-форму. + +## Как это работает + +1. Загрузите существующий PDF **или** нажмите **Создать пустой PDF**, чтобы начать с нуля. +2. При создании пустого PDF выберите размер страницы (Letter, A4, A5, Legal, Tabloid, A3 или свои размеры). +3. Откроется редактор форм с панелью типов полей и областью предварительного просмотра страницы. +4. Выберите тип поля на панели, затем щёлкните на странице, чтобы разместить его. +5. Перетаскивайте поля, чтобы изменить их положение. Маркеры изменения размера помогут подогнать размеры. +6. Щёлкните поле, чтобы открыть панель свойств, где можно задать имя поля, значение по умолчанию, размер шрифта, выравнивание и многое другое. +7. Переключайтесь между страницами с помощью элементов управления страницами. +8. Нажмите **Сохранить**, чтобы скачать готовый заполняемый PDF. + +## Возможности + +- Размещение полей перетаскиванием с визуальными маркерами изменения размера +- Типы полей: текстовое поле, многострочный текст, флажок, выпадающий список, переключатель, подпись, дата, число и штрихкод +- Панель свойств для настройки имени, подписи, значения по умолчанию, размера шрифта, цвета, выравнивания и проверки каждого поля +- Действия полей и правила условной видимости (показ и скрытие полей в зависимости от значений других полей) +- Навигация по страницам для многостраничных форм +- Извлечение существующих полей: поля формы из загруженных PDF определяются и импортируются автоматически +- Поддержка как загруженных PDF, так и пустых страниц в качестве основы формы +- Несколько готовых размеров страниц и возможность задать свои +- Генерация штрихкодов на основе bwip-js +- Управление группами переключателей + +## Параметры + +**Готовые размеры страниц (для пустых PDF):** + +- Letter (8,5" x 11") +- A4 (210 мм x 297 мм) +- A5 (148 мм x 210 мм) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297 мм x 420 мм) +- Свой (укажите ширину и высоту) + +**Свойства полей (зависят от типа поля):** + +- Имя, подпись и текст подсказки +- Значение по умолчанию +- Шрифт, размер и цвет +- Выравнивание текста (по левому краю, по центру, по правому краю) +- Переключатель обязательного поля +- Переключатель «только чтение» +- Максимальная длина текстовых полей +- Список вариантов для выпадающих списков и переключателей +- Действия условной видимости + +## Сценарии использования + +- Создание форм для приёма сотрудников с текстовыми полями для личных данных и флажками для подтверждения ознакомления с политикой +- Создание анкет для клиентов с выпадающими списками для выбора услуги +- Разработка бланков заказов с вычисляемыми полями и штрихкодами-идентификаторами +- Создание контрольных листов для осмотра с переключателями для оценки «пройдено/не пройдено» +- Создание опросов с условными уточняющими вопросами, которые появляются в зависимости от ответов + +## Советы + +- Если вы загрузите существующий PDF, инструмент попытается извлечь уже имеющиеся поля формы, и вы сможете их редактировать или дополнять. +- Используйте группы переключателей, чтобы создавать взаимоисключающие варианты. Поля в одной группе переключателей имеют общее имя группы. +- Проверьте форму: скачайте её и откройте в инструменте [Заполнение PDF-форм](./form-filler), чтобы убедиться, что поля работают правильно. + +## Связанные инструменты + +- [Заполнение PDF-форм](./form-filler) +- [Подписание PDF](./sign-pdf) +- [Редактор PDF](./edit-pdf) diff --git a/docs/ru/tools/form-filler.md b/docs/ru/tools/form-filler.md new file mode 100644 index 00000000..025435ba --- /dev/null +++ b/docs/ru/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Заполнение PDF-форм +description: Заполняйте PDF-формы, включая формы XFA, прямо в браузере во встроенном просмотрщике. +--- + +# Заполнение PDF-форм + +Откройте PDF с полями формы и заполните его прямо во встроенном просмотрщике. Инструмент поддерживает как обычные поля AcroForm, так и устаревшие формы XFA (XML Forms Architecture). Когда форма заполнена, скачайте готовую версию одним нажатием. + +## Как это работает + +1. Загрузите PDF с полями формы. +2. Документ откроется во встроенном просмотрщике PDF, где поля формы отображаются как интерактивные элементы ввода. +3. Щёлкайте текстовые поля, флажки, выпадающие списки и переключатели, чтобы заполнить их. +4. Нажмите **Сохранить и скачать заполненную форму**, чтобы получить готовый PDF. + +## Возможности + +- Встроенный просмотрщик PDF.js с полной поддержкой работы с полями формы +- Поддержка стандартных полей AcroForm (текстовые поля, флажки, выпадающие списки, переключатели) +- Поддержка форм XFA, устаревших форм на основе XML +- Автоматический подбор размера просмотрщика по размерам страницы +- Отображение имени и размера файла + +## Параметры + +Дополнительных параметров нет. Загрузите форму, заполните её и скачайте. + +## Сценарии использования + +- Заполнение налоговых деклараций, страховых заявлений или государственных бумаг +- Заполнение анкет для приёма на работу, полученных в виде вложений PDF +- Заполнение форм регистрации поставщиков и анкет для поставщиков +- Подтверждение контрольных списков соответствия с помощью флажков +- Заполнение медицинских анкет перед приёмом + +## Советы + +- XFA - устаревший формат, который поддерживают только некоторые программы просмотра PDF. Если вы открываете PDF с XFA в Chrome или в большинстве других программ и видите пустые страницы, значит, в них нет поддержки XFA. Заполнение PDF-форм в BentoPDF и Firefox корректно работают с XFA. +- Если в PDF нет полей формы, сначала добавьте их инструментом [Создание PDF-форм](./form-creator), а затем заполните форму здесь. +- Просмотрщик автоматически подстраивает свой размер под размеры страницы PDF. + +## Связанные инструменты + +- [Создание PDF-форм](./form-creator) +- [Подписание PDF](./sign-pdf) +- [Редактор PDF](./edit-pdf) diff --git a/docs/ru/tools/header-footer.md b/docs/ru/tools/header-footer.md new file mode 100644 index 00000000..b17f51a8 --- /dev/null +++ b/docs/ru/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Колонтитулы +description: Добавляйте настраиваемый текст верхних и нижних колонтитулов на страницы PDF с динамическими переменными номера страницы. +--- + +# Колонтитулы + +Добавляйте текст в шесть позиций на страницах PDF: верхний левый, верхний по центру, верхний правый, нижний левый, нижний по центру и нижний правый. Инструмент поддерживает динамические переменные номера страницы и общего числа страниц, поэтому можно создавать шаблоны вроде «Страница 3 из 10», которые автоматически обновляются на каждой странице. + +## Как это работает + +1. Загрузите файл PDF. +2. Появится панель параметров с элементами форматирования и шестью полями ввода текста. +3. Введите нужный текст в любую из позиций колонтитулов. +4. Используйте заполнители `{page}` и `{total}` для динамической нумерации страниц. +5. Настройте размер и цвет шрифта и при желании ограничьте диапазон страниц. +6. Нажмите **Добавить колонтитулы**, чтобы обработать файл и скачать результат. + +## Параметры + +- **Диапазон страниц**: при желании ограничьте, на каких страницах будут колонтитулы. Оставьте поле пустым, чтобы применить ко всем страницам. Формат: «1-3, 5» (диапазоны через запятую). +- **Размер шрифта**: от 6 до 24 пунктов. По умолчанию 10. +- **Цвет шрифта**: выберите любой цвет с помощью палитры. +- **Верхний левый / по центру / правый**: текстовые поля для верхней части каждой страницы. +- **Нижний левый / по центру / правый**: текстовые поля для нижней части каждой страницы. + +## Возможности + +- Шесть независимых позиций текста на странице +- Динамическая переменная `{page}`, которая вставляет номер текущей страницы +- Динамическая переменная `{total}`, которая вставляет общее число страниц +- Фильтрация по диапазону страниц для выбора нужных страниц +- Настраиваемые размер и цвет шрифта +- Шрифт Helvetica для аккуратного, профессионального результата + +## Сценарии использования + +- Добавление «Страница {page} из {total}» в нижний колонтитул по центру отчёта +- Размещение названия компании в верхнем левом колонтитуле и даты документа в верхнем правом +- Добавление уведомлений о конфиденциальности в нижний колонтитул юридических документов +- Проставление номеров редакций документа на определённых диапазонах страниц + +## Советы + +- Объединяйте `{page}` и `{total}` в одном поле для форматов вроде «Страница {page} из {total}» или «{page}/{total}». +- Большинство полей можно оставить пустыми и заполнить только нужные позиции. Пустые поля просто пропускаются. +- Для более сложных колонтитулов с изображениями или логотипами попробуйте инструмент [Добавление водяных знаков](./add-watermark), разместив знак в верхней части страницы. + +## Связанные инструменты + +- [Нумерация страниц](./page-numbers) +- [Добавление водяных знаков](./add-watermark) +- [Bates-нумерация](./bates-numbering) diff --git a/docs/ru/tools/heic-to-pdf.md b/docs/ru/tools/heic-to-pdf.md new file mode 100644 index 00000000..adcfbd19 --- /dev/null +++ b/docs/ru/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC в PDF +description: Преобразуйте изображения HEIC и HEIF с iPhone и iPad в PDF прямо в браузере. +--- + +# HEIC в PDF + +Преобразуйте изображения HEIC/HEIF в PDF. HEIC - формат фотографий по умолчанию на iPhone и iPad начиная с iOS 11. Этот инструмент превращает такие фотографии в PDF без установки программ на компьютер и без загрузки файлов на сервер. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :--------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы HEIC/HEIF. +2. Просмотрите список файлов и удалите ненужные. +3. Нажмите **Преобразовать в PDF**. Результат скачивается как `from_heic.pdf`. + +Каждый файл HEIC декодируется библиотекой heic2any и преобразуется в PNG с качеством 92%. Затем PNG встраивается в PDF с помощью pdf-lib, и каждое изображение занимает отдельную страницу в полном разрешении. + +## Параметры + +У этого инструмента нет дополнительных настроек. Изображения HEIC перед встраиванием преобразуются в PNG с высоким качеством (0,92). + +## Сценарии использования + +- Создание PDF из фотографий с iPhone для страховой заявки или отчёта +- Преобразование фотографий HEIC для объявления о недвижимости в один документ для печати +- Превращение снимков экрана iPad (формат HEIF) в PDF, которым удобно делиться +- Пакетное преобразование фотографий из отпуска для дневника путешествий + +## Советы + +- Декодирование HEIC целиком выполняется в браузере с помощью WebAssembly. Первое преобразование может занять некоторое время, пока загружается декодер. +- Если нужно объединить HEIC с другими форматами изображений (JPG, PNG и др.), используйте инструмент [Изображения в PDF](./image-to-pdf), который работает с HEIC наравне со всеми остальными форматами. +- Файлы HEIC с iPhone часто содержат данные EXIF, включая координаты GPS. В итоговый PDF эти метаданные не переносятся. + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [JPG в PDF](./jpg-to-pdf) +- [PNG в PDF](./png-to-pdf) diff --git a/docs/ru/tools/image-to-pdf.md b/docs/ru/tools/image-to-pdf.md new file mode 100644 index 00000000..ecc61646 --- /dev/null +++ b/docs/ru/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Изображения в PDF +description: Преобразуйте JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD и более 10 других форматов изображений в один файл PDF. +--- + +# Изображения в PDF + +Универсальный конвертер изображений в PDF. Загружайте изображения практически в любом формате и объединяйте их в один документ PDF. Каждое изображение получает отдельную страницу, размер которой соответствует оригиналу. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Это самая широкая поддержка форматов среди всех конвертеров изображений BentoPDF. Если вам нужен только один формат, используйте соответствующий специализированный инструмент. + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы изображений. Можно выбрать сразу несколько файлов. +2. Просмотрите список файлов. Удалите ненужные значком корзины или нажмите **Добавить ещё файлы**, чтобы добавить другие изображения. +3. Выберите уровень **Качества PDF** в выпадающем списке. +4. Нажмите **Преобразовать в PDF**. Инструмент обрабатывает изображения движком PyMuPDF и скачивает результат как `images_to_pdf.pdf`. + +## Параметры + +**Качество PDF** определяет сжатие, применяемое к изображениям при встраивании в PDF: + +- **Высокое качество**: минимальное сжатие, больший размер файла. Лучше всего для печати и архивирования. +- **Среднее качество** (по умолчанию): сбалансированное сжатие. Подходит для большинства задач. +- **Низкое качество**: сильное сжатие, наименьший размер файла. Подходит для отправки по почте и быстрого обмена. + +Файлы HEIC и WebP автоматически преобразуются в PNG перед встраиванием. Это происходит незаметно и не требует дополнительных действий. + +## Сценарии использования + +- Объединение отсканированных чеков или документов, снятых на камеру телефона, в один PDF +- Создание портфолио или лукбука из изображений в разных форматах +- Преобразование фотографий с iPhone (HEIC) в PDF, которым удобно делиться, без установки программ на компьютер +- Сборка макетов из экспорта PSD и снимков экрана в один документ для клиента +- Архивирование папки с устаревшими форматами изображений (PNM, JXR, JP2) в один PDF + +## Советы + +- Порядок изображений в PDF совпадает с их порядком в списке файлов. Загружайте их в нужной последовательности. +- Для минимального размера файла выберите низкое качество. Для сканов с большим количеством текста разница на глаз часто незаметна. +- Если у вас только один формат изображений, специализированные конвертеры (JPG в PDF, PNG в PDF и другие) дают тот же результат с более простым интерфейсом. + +## Связанные инструменты + +- [JPG в PDF](./jpg-to-pdf) +- [PNG в PDF](./png-to-pdf) +- [HEIC в PDF](./heic-to-pdf) +- [WebP в PDF](./webp-to-pdf) diff --git a/docs/ru/tools/index.md b/docs/ru/tools/index.md new file mode 100644 index 00000000..a574319e --- /dev/null +++ b/docs/ru/tools/index.md @@ -0,0 +1,183 @@ +# Справочник инструментов + +BentoPDF предлагает **более 130 инструментов** для работы с PDF. Все инструменты работают целиком в вашем браузере: ваши файлы никогда не покидают устройство. + +--- + +## Редактирование и аннотации + +Изменяйте, размечайте и улучшайте документы PDF с помощью полного набора инструментов редактирования. + +
+ +- [**Редактор PDF**](./edit-pdf): аннотации, выделение, редактирование (редакция), комментарии, фигуры и изображения, поиск и просмотр PDF. +- [**Редактирование закладок**](./bookmark): добавление, изменение, импорт, удаление и извлечение закладок PDF. +- [**Оглавление**](./table-of-contents): создание страницы оглавления из закладок PDF. +- [**Нумерация страниц**](./page-numbers): вставка номеров страниц в документ. +- [**Добавить метки страниц**](./add-page-labels): метки страниц PDF с римскими цифрами, префиксами и произвольным началом. +- [**Bates-нумерация**](./bates-numbering): последовательные номера Bates в одном или нескольких файлах PDF. +- [**Добавление водяных знаков**](./add-watermark): наложение текста или изображения на страницы PDF. +- [**Колонтитулы**](./header-footer): добавление текста в верхнюю и нижнюю части страниц. +- [**Инверсия цвета**](./invert-colors): создание тёмной версии PDF. +- [**Эффект сканера**](./scanner-effect): придайте PDF вид отсканированного документа. +- [**Настройка цвета**](./adjust-colors): точная настройка яркости, контраста, насыщенности и других параметров. +- [**Цвет фона**](./background-color): изменение цвета фона PDF. +- [**Изменение цвета текста**](./text-color): изменение цвета текста в PDF. +- [**Подписание PDF**](./sign-pdf): нарисуйте, введите или загрузите свою подпись. +- [**Добавление штампов**](./add-stamps): добавление штампов-изображений в PDF с помощью панели аннотаций. +- [**Удаление аннотаций**](./remove-annotations): удаление комментариев, выделений и ссылок. +- [**Обрезка PDF**](./crop-pdf): обрезка полей на каждой странице PDF. +- [**Заполнение PDF-форм**](./form-filler): заполнение форм прямо в браузере. Поддерживаются и формы XFA. +- [**Создание PDF-форм**](./form-creator): создание заполняемых PDF-форм с текстовыми полями перетаскиванием. +- [**Удаление пустых страниц**](./remove-blank-pages): автоматический поиск и удаление пустых страниц. + +
+ +--- + +## Преобразование в PDF + +Превращайте изображения, документы, электронные книги и файлы других форматов в PDF. + +
+ +- [**Изображения в PDF**](./image-to-pdf): преобразование JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP и других форматов в PDF. +- [**JPG в PDF**](./jpg-to-pdf): создание PDF из одного или нескольких изображений JPG. +- [**PNG в PDF**](./png-to-pdf): создание PDF из одного или нескольких изображений PNG. +- [**WebP в PDF**](./webp-to-pdf): создание PDF из одного или нескольких изображений WebP. +- [**SVG в PDF**](./svg-to-pdf): создание PDF из одного или нескольких изображений SVG. +- [**BMP в PDF**](./bmp-to-pdf): создание PDF из одного или нескольких изображений BMP. +- [**HEIC в PDF**](./heic-to-pdf): создание PDF из одного или нескольких изображений HEIC. +- [**TIFF в PDF**](./tiff-to-pdf): создание PDF из одного или нескольких изображений TIFF. +- [**Текст в PDF**](./txt-to-pdf): преобразование обычного текстового файла в PDF. +- [**Markdown в PDF**](./markdown-to-pdf): преобразование Markdown в PDF с живым предпросмотром и подсветкой синтаксиса. +- [**JSON в PDF**](./json-to-pdf): преобразование файлов JSON в формат PDF. +- [**ODT в PDF**](./odt-to-pdf): преобразование файлов ODT (OpenDocument Text) в PDF. +- [**CSV в PDF**](./csv-to-pdf): преобразование таблиц CSV в PDF. +- [**RTF в PDF**](./rtf-to-pdf): преобразование документов RTF (Rich Text Format) в PDF. +- [**Word в PDF**](./word-to-pdf): преобразование документов Word (DOCX, DOC, ODT) в PDF. +- [**Excel в PDF**](./excel-to-pdf): преобразование таблиц Excel (XLSX, XLS, ODS) в PDF. +- [**PowerPoint в PDF**](./powerpoint-to-pdf): преобразование презентаций PowerPoint (PPTX, PPT, ODP) в PDF. +- [**XPS в PDF**](./xps-to-pdf): преобразование документов XPS/OXPS в PDF. +- [**MOBI в PDF**](./mobi-to-pdf): преобразование электронных книг MOBI в PDF. +- [**EPUB в PDF**](./epub-to-pdf): преобразование электронных книг EPUB в PDF. +- [**FB2 в PDF**](./fb2-to-pdf): преобразование электронных книг FictionBook (FB2) в PDF. +- [**CBZ в PDF**](./cbz-to-pdf): преобразование архивов комиксов (CBZ/CBR) в PDF. +- [**WPD в PDF**](./wpd-to-pdf): преобразование документов WordPerfect (WPD) в PDF. +- [**WPS в PDF**](./wps-to-pdf): преобразование документов WPS Office в PDF. +- [**XML в PDF**](./xml-to-pdf): преобразование документов XML в PDF. +- [**ODG в PDF**](./odg-to-pdf): преобразование OpenDocument Graphics (ODG) в PDF. +- [**ODS в PDF**](./ods-to-pdf): преобразование OpenDocument Spreadsheet (ODS) в PDF. +- [**ODP в PDF**](./odp-to-pdf): преобразование OpenDocument Presentation (ODP) в PDF. +- [**PUB в PDF**](./pub-to-pdf): преобразование Microsoft Publisher (PUB) в PDF. +- [**VSD в PDF**](./vsd-to-pdf): преобразование Microsoft Visio (VSD, VSDX) в PDF. +- [**PSD в PDF**](./psd-to-pdf): преобразование файлов Adobe Photoshop (PSD) в PDF. +- [**Email в PDF**](./email-to-pdf): преобразование файлов электронной почты (EML, MSG) в формат PDF. + +
+ +--- + +## Преобразование из PDF + +Извлекайте содержимое PDF в изображения, документы и форматы данных. + +
+ +- [**PDF в JPG**](./pdf-to-jpg): преобразование каждой страницы PDF в изображение JPG. +- [**PDF в PNG**](./pdf-to-png): преобразование каждой страницы PDF в изображение PNG. +- [**PDF в WebP**](./pdf-to-webp): преобразование каждой страницы PDF в изображение WebP. +- [**PDF в BMP**](./pdf-to-bmp): преобразование каждой страницы PDF в изображение BMP. +- [**PDF в TIFF**](./pdf-to-tiff): преобразование каждой страницы PDF в изображение TIFF. +- [**PDF в CBZ**](./pdf-to-cbz): преобразование PDF в CBZ (архив комиксов) для программ чтения комиксов и Calibre. +- [**PDF в SVG**](./pdf-to-svg): преобразование каждой страницы PDF в масштабируемую векторную графику. +- [**PDF в CSV**](./pdf-to-csv): извлечение таблиц из PDF и преобразование в формат CSV. +- [**PDF в Excel**](./pdf-to-excel): извлечение таблиц из PDF и преобразование в Excel (XLSX). +- [**PDF в оттенки серого**](./pdf-to-greyscale): преобразование всех цветов в чёрно-белые. +- [**PDF в JSON**](./pdf-to-json): преобразование файлов PDF в формат JSON. +- [**PDF в Word**](./pdf-to-word): преобразование файлов PDF в редактируемые документы Word. +- [**Извлечение изображений**](./extract-images): извлечение всех встроенных изображений из файлов PDF. +- [**PDF в Markdown**](./pdf-to-markdown): преобразование текста и таблиц PDF в формат Markdown. +- [**Подготовка PDF для ИИ**](./prepare-pdf-for-ai): извлечение содержимого PDF как JSON LlamaIndex для конвейеров RAG/LLM. +- [**PDF в текст**](./pdf-to-text): извлечение текста из файлов PDF и сохранение в виде обычного текста. +- [**Извлечение таблиц из PDF**](./extract-tables): извлечение таблиц из PDF в виде CSV, JSON или Markdown. + +
+ +--- + +## Организация и управление + +Переставляйте, объединяйте, разделяйте страницы и файлы PDF и управляйте ими. + +
+ +- [**Конструктор PDF-процессов**](./pdf-workflow): создание собственных конвейеров обработки PDF в визуальном редакторе узлов. +- [**PDF мультиинструмент**](./pdf-multi-tool): полнофункциональный редактор PDF с управлением страницами. +- [**Распознавание текста в PDF**](./ocr-pdf): сделайте PDF доступным для поиска и копирования. +- [**Объединение PDF**](./merge-pdf): объединение нескольких PDF в один файл. +- [**Объединение документов с чередованием страниц**](./alternate-merge): объединение PDF с чередованием страниц из каждого файла. +- [**Сортировка двустороннего сканирования**](./duplex-collate): перестановка блоков лицевых и оборотных сканов в правильный порядок страниц. +- [**Дублирование и организация**](./organize-pdf): дублирование, перестановка и удаление страниц. +- [**Добавление вложений**](./add-attachments): встраивание одного или нескольких файлов в PDF. +- [**Извлечение вложений**](./extract-attachments): извлечение всех встроенных файлов из PDF в ZIP-архив. +- [**Редактирование вложений**](./edit-attachments): просмотр или удаление вложений в PDF. +- [**PDF OCG**](./pdf-layers): просмотр, переключение, добавление и удаление слоёв OCG в PDF. +- [**Разделение PDF**](./split-pdf): извлечение диапазона страниц в новый PDF. +- [**Разделение страниц**](./divide-pages): разделение страниц по горизонтали или вертикали. +- [**Извлечение страниц**](./extract-pages): сохранение выбранных страниц в новые файлы. +- [**Удаление страниц**](./delete-pages): удаление определённых страниц из документа. +- [**Добавление пустой страницы**](./add-blank-page): вставка пустой страницы в любое место PDF. +- [**Обращение порядка страниц**](./reverse-pages): переворот порядка всех страниц документа. +- [**Поворот PDF**](./rotate-pdf): поворот страниц с шагом 90 градусов. +- [**Поворот на заданное количество градусов**](./rotate-custom): поворот страниц на любой произвольный угол. +- [**N-Up PDF**](./n-up-pdf): размещение нескольких страниц на одном листе. +- [**PDF-буклет**](./pdf-booklet): перестановка страниц для двусторонней печати буклета. +- [**Объединение в одну страницу**](./combine-single-page): склейка всех страниц в одну непрерывную ленту. +- [**Просмотр метаданных**](./view-metadata): просмотр скрытых свойств PDF. +- [**Редактирование метаданных**](./edit-metadata): изменение автора, заголовка и других свойств. +- [**PDF в ZIP**](./pdf-to-zip): упаковка нескольких файлов PDF в ZIP-архив. +- [**Сравнение документов**](./compare-pdfs): сравнение двух PDF рядом. +- [**Постеризация документа**](./posterize-pdf): разделение большой страницы на несколько меньших. + +
+ +--- + +## Оптимизация и восстановление + +Сжимайте, исправляйте и оптимизируйте PDF для лучшей производительности и совместимости. + +
+ +- [**Сжатие PDF**](./compress-pdf): уменьшение размера файла PDF. +- [**PDF в PDF/A**](./pdf-to-pdfa): преобразование PDF в PDF/A для долгосрочного архивирования. +- [**Редактор размера страниц**](./fix-page-size): приведение всех страниц к единому размеру. +- [**Линеаризация документа**](./linearize-pdf): оптимизация PDF для быстрого просмотра в вебе. +- [**Размеры страниц**](./page-dimensions): анализ размера, ориентации и единиц измерения страниц. +- [**Снятие ограничений**](./remove-restrictions): снятие защиты паролем и ограничений безопасности. +- [**Восстановление документа**](./repair-pdf): восстановление данных из повреждённых файлов PDF. +- [**Растеризация документа**](./rasterize-pdf): преобразование PDF в PDF на основе изображений. Сведение слоёв и удаление выделяемого текста. +- [**Выпрямление PDF**](./deskew-pdf): автоматическое выравнивание наклонённых отсканированных страниц с помощью OpenCV. +- [**Шрифты в кривые**](./font-to-outline): преобразование всех шрифтов в векторные контуры для одинакового отображения. + +
+ +--- + +## Защита PDF + +Защищайте, шифруйте PDF и управляйте доступом к документам. + +
+ +- [**Защита PDF**](./protect-pdf): защита PDF паролем. +- [**Санирование документа**](./sanitize-pdf): удаление метаданных, аннотаций, скриптов и многого другого. +- [**Разблокировка PDF**](./unlock-pdf): снятие защиты паролем с PDF. +- [**Сведение документа**](./flatten-pdf): превращение полей форм и аннотаций в нередактируемые. +- [**Удаление метаданных**](./remove-metadata): удаление скрытых данных из PDF. +- [**Изменение разрешений**](./change-permissions): установка или изменение прав пользователей для PDF. +- [**Цифровая подпись PDF**](./digital-sign-pdf): добавление криптографической цифровой подписи с сертификатами X.509. +- [**Проверка подписи в PDF**](./validate-signature-pdf): проверка цифровых подписей и просмотр сведений о сертификате. + +
diff --git a/docs/ru/tools/invert-colors.md b/docs/ru/tools/invert-colors.md new file mode 100644 index 00000000..9528e299 --- /dev/null +++ b/docs/ru/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Инверсия цвета +description: Инвертируйте все цвета PDF, чтобы получить тёмную версию любого документа. +--- + +# Инверсия цвета + +Замените каждый цвет в PDF на противоположный. Белый фон становится чёрным, чёрный текст белым, а все остальные цвета переходят в дополнительные. Это самый быстрый способ получить «тёмную тему» для любого PDF. + +## Как это работает + +1. Загрузите файл PDF. +2. Нажмите **Инвертировать цвета** для обработки. +3. Инвертированный PDF скачивается автоматически. + +Дополнительных настроек нет. Инструмент отображает каждую страницу как изображение, инвертирует цвета всех пикселей и собирает результат в новый PDF. + +## Возможности + +- Инверсия цвета всех страниц в одно нажатие +- Обработка каждой страницы документа +- Сохранение исходных размеров и макета страниц +- Работает с любым PDF независимо от содержимого (текст, изображения, смешанное содержимое) + +## Сценарии использования + +- Создание тёмных версий учебников и руководств для комфортного чтения ночью +- Подготовка высококонтрастных версий документов для доступности +- Инверсия отсканированных документов, снятых с неправильной экспозицией +- Создание негативов PDF с большим количеством изображений для визуального анализа + +## Советы + +- Чтобы применить эффект, инструмент растеризует страницы, поэтому результат состоит из изображений. Текст больше нельзя выделять и искать. Если после инверсии нужен текст с возможностью поиска, пропустите результат через инструмент распознавания текста. +- Для более точной настройки цвета (яркость, контраст, насыщенность) используйте инструмент [Настройка цвета](./adjust-colors). +- Большие PDF с множеством страниц могут обрабатываться дольше, так как каждая страница отображается и инвертируется отдельно. + +## Связанные инструменты + +- [Настройка цвета](./adjust-colors) +- [Цвет фона](./background-color) +- [Эффект сканера](./scanner-effect) diff --git a/docs/ru/tools/jpg-to-pdf.md b/docs/ru/tools/jpg-to-pdf.md new file mode 100644 index 00000000..2246c637 --- /dev/null +++ b/docs/ru/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG в PDF +description: Преобразуйте одно или несколько изображений JPG, JPEG и JPEG 2000 в один файл PDF прямо в браузере. +--- + +# JPG в PDF + +Превратите изображения JPG в аккуратный PDF. Загрузите один файл или сразу несколько JPG: каждое изображение станет полноразмерной страницей итогового документа. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы JPG. Можно выбрать несколько файлов. +2. Просмотрите загруженные файлы. Значок корзины удаляет отдельные файлы, а **Добавить ещё файлы** дополняет список. +3. Выберите уровень **Качества PDF**. +4. Нажмите **Преобразовать в PDF**. Инструмент сжимает изображения согласно выбранному качеству, преобразует их движком PyMuPDF и скачивает `from_jpgs.pdf`. + +## Параметры + +**Качество PDF** определяет сжатие, применяемое к каждому изображению перед встраиванием в PDF: + +- **Высокое качество**: сохраняет максимум деталей. Подходит для фотографий и печати. +- **Среднее качество** (по умолчанию): хороший баланс между чёткостью и размером файла. +- **Низкое качество**: сильное сжатие для наименьшего размера результата. + +## Сценарии использования + +- Преобразование отсканированных документов, сохранённых как JPG, в один PDF для отправки +- Упаковка фотографий товаров в каталог для клиентов +- Превращение медицинских или спутниковых изображений JPEG 2000 в переносимый PDF +- Создание фотоальбома для печати из файлов с камеры + +## Советы + +- Файлы JPEG 2000 (`.jp2`, `.jpx`) поддерживаются полностью, а не только обычный JPEG. Это удобно для медицинских изображений и геоданных. +- Если ваши JPG сняты на камеру телефона, среднее качество обычно даёт файл на 40-60% меньше, чем высокое, без заметной на экране разницы. + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [PNG в PDF](./png-to-pdf) +- [WebP в PDF](./webp-to-pdf) diff --git a/docs/ru/tools/json-to-pdf.md b/docs/ru/tools/json-to-pdf.md new file mode 100644 index 00000000..ec7ebb12 --- /dev/null +++ b/docs/ru/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON в PDF +description: Восстанавливайте файлы PDF из формата JSON BentoPDF. Преобразуйте экспорт JSON обратно в исходные документы PDF. +--- + +# JSON в PDF + +Восстанавливайте документы PDF из файлов JSON, ранее созданных инструментом **PDF в JSON** от BentoPDF. Это инструмент обратного преобразования: он берёт структурированное JSON-представление PDF и собирает исходный документ заново. + +::: warning +Этот инструмент принимает только файлы JSON, созданные конвертером PDF в JSON от BentoPDF. Обычные файлы JSON из API, баз данных и других инструментов не поддерживаются. +::: + +## Поддерживаемые форматы + +| Вход | Описание | +| :------ | :--------------------------------------------------------------- | +| `.json` | Файлы JSON, экспортированные инструментом PDF в JSON от BentoPDF | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё один или несколько файлов JSON. +2. В списке файлов показан каждый выбранный файл с его размером. +3. Нажмите **Преобразовать в PDF**. Инструмент обрабатывает все файлы с помощью Web Worker и движка CPDF. +4. Результат скачивается как `jsons-to-pdf.zip` и содержит по одному PDF на каждый входной файл JSON. + +Преобразование выполняется в фоновом Web Worker, поэтому интерфейс остаётся отзывчивым даже с большими файлами. + +## Параметры + +У этого инструмента нет настраиваемых параметров. Итоговый PDF полностью определяется структурой JSON. + +## Результат + +При преобразовании нескольких файлов JSON результаты поставляются в ZIP-архиве. Каждый PDF называется по исходному файлу JSON (например, `report.json` превращается в `report.pdf`). + +## Сценарии использования + +- Восстановление PDF из резервной копии или архивного конвейера на основе JSON +- Прогон PDF через JSON для проверки и обратно в PDF +- Пересборка документов после программных изменений структуры JSON +- Проверка того, что экспорт PDF в JSON сохранил всё содержимое документа, путём обратного преобразования + +## Советы + +- Если нужно преобразовать произвольные данные JSON (например, ответы API или файлы конфигурации) в отформатированный PDF, лучше подходит инструмент [Текст в PDF](./txt-to-pdf). Вставьте JSON как текст, и он будет отображён с правильным форматированием. +- Для работы этого инструмента должен быть доступен движок CPDF WebAssembly. На самостоятельно размещённых экземплярах нужно настроить файлы CPDF WASM. + +## Связанные инструменты + +- [Текст в PDF](./txt-to-pdf) +- [Markdown в PDF](./markdown-to-pdf) +- [CSV в PDF](./csv-to-pdf) diff --git a/docs/ru/tools/linearize-pdf.md b/docs/ru/tools/linearize-pdf.md new file mode 100644 index 00000000..f7643d99 --- /dev/null +++ b/docs/ru/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Линеаризация документа +description: Оптимизируйте файлы PDF для быстрого просмотра в вебе с постепенной загрузкой. Также известно как оптимизация «Быстрый просмотр в Интернете». +--- + +# Линеаризация документа + +Линеаризация перестраивает PDF так, чтобы первую страницу можно было показать до полной загрузки файла. В Adobe это называется «Быстрый просмотр в Интернете». Если вы размещаете PDF на сайте или отдаёте их через портал документов, линеаризация заметно ускоряет их открытие. + +## Как это работает + +1. Загрузите один или несколько файлов PDF. +2. Нажмите **Линеаризовать PDF**. +3. Скачайте результат в виде ZIP-архива со всеми линеаризованными файлами. + +Настраивать ничего не нужно. Инструмент использует флаг `--linearize` из QPDF, который перестраивает внутреннюю структуру PDF, не меняя его внешний вид. + +## Что делает линеаризация + +- Переупорядочивает объекты PDF так, чтобы данные первой страницы находились в начале файла +- Добавляет словарь линеаризации и таблицы подсказок, чтобы программы просмотра знали, где найти каждую страницу +- Включает запросы по диапазонам байтов: браузер может загрузить только первую страницу, не скачивая весь файл +- Приводит в порядок таблицу перекрёстных ссылок для эффективного произвольного доступа + +## Возможности + +- Пакетная обработка нескольких PDF за одну операцию +- Результат сохраняет все содержимое, шрифты, изображения и интерактивные элементы +- Использует QPDF (WebAssembly) для надёжной линеаризации по стандартам +- Результаты упаковываются в ZIP для удобной загрузки + +## Сценарии использования + +- Размещение отчётов в PDF на сайте, где пользователи ожидают мгновенного отображения страницы +- Встраивание PDF в веб-приложения со встроенными просмотрщиками +- Публикация каталогов и руководств в PDF, которые открывают при медленном мобильном соединении +- Подготовка документов для сетей доставки контента (CDN), поддерживающих выдачу по диапазонам байтов + +## Советы + +- Линеаризуйте документ после завершения всех остальных правок. Любое последующее изменение (объединение, добавление страниц) нарушит линеаризацию. +- Сочетайте с инструментом «Сжатие PDF», чтобы получить самые компактные и быстро загружаемые PDF. +- Линеаризация немного увеличивает размер файла (обычно менее чем на 1%). + +## Связанные инструменты + +- [Сжатие PDF](./compress-pdf): уменьшите размер файла перед линеаризацией +- [Восстановление документа](./repair-pdf): исправьте структурные проблемы, мешающие линеаризации +- [Удаление метаданных](./remove-metadata): удалите метаданные перед публикацией в интернете diff --git a/docs/ru/tools/markdown-to-pdf.md b/docs/ru/tools/markdown-to-pdf.md new file mode 100644 index 00000000..3327d06d --- /dev/null +++ b/docs/ru/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown в PDF +description: Пишите или вставляйте Markdown и экспортируйте его в профессионально оформленный PDF с живым предпросмотром и подсветкой синтаксиса. +--- + +# Markdown в PDF + +Полнофункциональный редактор Markdown с живым предпросмотром и экспортом в PDF одним нажатием. Пишите с нуля, загрузите готовый файл `.md` или вставьте содержимое из буфера обмена. Редактор отображает Markdown в реальном времени и экспортирует оформленный PDF с помощью встроенного механизма печати браузера. + +## Поддерживаемые форматы + +| Вход | Описание | +| :---------- | :------------------------------ | +| Файлы `.md` | Загрузка кнопкой «Загрузить» | +| Прямой ввод | Введите или вставьте в редактор | + +## Как это работает + +1. Откройте инструмент Markdown в PDF. Редактор загрузится в режиме разделённого экрана: исходный Markdown слева, готовый предпросмотр справа. +2. Напишите Markdown, вставьте его или нажмите **Загрузить**, чтобы открыть файл `.md`. +3. Переключайтесь между светлой и тёмной темой ползунком темы на панели инструментов. +4. Нажмите **Экспорт в PDF** (или `Ctrl/Cmd + S`), чтобы создать PDF через диалог печати браузера. + +## Возможности + +Редактор поддерживает широкий набор возможностей Markdown помимо базовых: + +- **Стандартный Markdown**: заголовки, полужирный, курсив, ссылки, изображения, списки, цитаты, горизонтальные линии +- **Блоки кода** с подсветкой синтаксиса для более чем 15 языков (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash и другие) +- **Диаграммы Mermaid**: блок-схемы, диаграммы последовательности, ER-диаграммы и другие типы диаграмм Mermaid отображаются прямо в предпросмотре +- **Таблицы** со стандартным синтаксисом таблиц Markdown +- **Списки задач** с флажками +- **Сноски**, **подстрочные** и **надстрочные** символы +- **Списки определений**, **аббревиатуры** +- Поддержка **эмодзи** (`:smile:` отображается как эмодзи) +- **Выделение** (`==marked text==`) и **вставки** (`++inserted text++`) +- **Автоматические ссылки**: обычные URL превращаются в кликабельные ссылки +- Создание **оглавления** +- **Якорные ссылки** в заголовках + +## Сценарии использования + +- Написание документации проекта и экспорт аккуратного PDF для заинтересованных сторон +- Создание технических отчётов с примерами кода и архитектурными диаграммами Mermaid +- Преобразование README с GitHub в PDF для автономного чтения или печати +- Подготовка предложения или спецификации со списками задач и таблицами +- Создание оформленного раздаточного материала из конспектов лекций, написанных в Markdown + +## Советы + +- Для создания PDF используется функция печати в PDF в браузере. В Chrome перед сохранением можно настроить поля и масштаб в диалоге печати. +- Диаграммы Mermaid отображаются в предпросмотре, но при первом использовании им может потребоваться немного времени на инициализацию. +- Используйте сочетание `Ctrl/Cmd + S`, чтобы экспортировать, не тянясь к кнопке. + +## Связанные инструменты + +- [Текст в PDF](./txt-to-pdf) +- [Word в PDF](./word-to-pdf) +- [JSON в PDF](./json-to-pdf) diff --git a/docs/ru/tools/merge-pdf.md b/docs/ru/tools/merge-pdf.md new file mode 100644 index 00000000..acaf488e --- /dev/null +++ b/docs/ru/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Объединение PDF +description: Объединяйте несколько файлов PDF в один документ с изменением порядка перетаскиванием и управлением на уровне страниц. +--- + +# Объединение PDF + +Объединяйте несколько файлов PDF в один документ. Можно объединять файлы целиком в нужном порядке или переключиться в режим страниц для точного управления отдельными страницами из каждого загруженного PDF. + +## Как это работает + +1. Загрузите два или более файла PDF: нажмите на область загрузки или перетащите их. +2. Выберите **Режим файлов** или **Режим страниц** переключателем вверху. +3. В режиме файлов перетаскивайте файлы, чтобы изменить порядок, и при желании укажите для каждого файла диапазоны страниц (например, `1-3, 5`). Оставьте диапазон пустым, чтобы включить все страницы. +4. В режиме страниц перетаскивайте миниатюры отдельных страниц, чтобы составить точную последовательность. +5. Нажмите **Объединить PDF**, чтобы собрать всё в один файл. Объединённый PDF скачивается автоматически. + +## Возможности + +- Два режима объединения: режим файлов для быстрого объединения целых файлов и режим страниц для управления каждой страницей +- Изменение порядка перетаскиванием в обоих режимах с плавной анимацией +- Синтаксис диапазонов страниц (например, `1-3, 5, 8-10`) позволяет выбирать страницы без перехода в режим страниц +- Миниатюры страниц загружаются по мере необходимости, поэтому интерфейс остаётся отзывчивым даже с большими документами +- Нет ограничений на число файлов и общее количество страниц +- Сохраняет исходное качество PDF без повторного кодирования + +## Параметры + +| Параметр | Описание | +| ----------------- | ----------------------------------------------------------------------------------------------------------------- | +| **Режим файлов** | Объединение файлов целиком в произвольном порядке с необязательными фильтрами диапазонов страниц | +| **Режим страниц** | Визуальная сетка всех страниц из всех файлов: перетаскивайте миниатюры, чтобы составить точную последовательность | +| **Поле страниц** | Текстовое поле для каждого файла, принимающее диапазоны вроде `1-3, 5`, чтобы включить только нужные страницы | + +## Сценарии использования + +- Объединение отдельных PDF с главами в одну книгу или отчёт +- Объединение сопроводительного письма и резюме в один документ для заявки +- Сбор нужных страниц из нескольких исходных документов в один файл +- Сборка отсканированных чеков или счетов в один архивный PDF +- Создание раздаточного материала для презентации из слайдов нескольких наборов + +## Советы + +- Используйте режим страниц, когда нужно чередовать страницы из разных файлов, а не добавлять один файл после другого. +- После первоначальной загрузки можно добавить ещё файлы кнопкой **Добавить ещё файлы**, не теряя текущего порядка. +- Нумерация страниц в диапазонах начинается с 1, поэтому `1` означает первую страницу файла. + +## Связанные инструменты + +- [Разделение PDF](./split-pdf) +- [Дублирование и организация](./organize-pdf) +- [Объединение документов с чередованием страниц](./alternate-merge) +- [Удаление страниц](./delete-pages) diff --git a/docs/ru/tools/mobi-to-pdf.md b/docs/ru/tools/mobi-to-pdf.md new file mode 100644 index 00000000..8f42883e --- /dev/null +++ b/docs/ru/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI в PDF +description: Преобразуйте файлы электронных книг MOBI в PDF прямо в браузере. Бесплатно, приватно, без загрузки файлов. +--- + +# MOBI в PDF + +Преобразуйте электронные книги Amazon Kindle в формате MOBI в документы PDF. Файлы MOBI привязаны к устройствам и приложениям Kindle, поэтому их сложно читать в других местах. PDF даёт переносимую версию, которую можно открыть на любом устройстве или распечатать. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----- | :--------- | :------------------------------ | +| MOBI | `.mobi` | Формат книг Kindle (Mobipocket) | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё один или несколько файлов MOBI. +2. Просмотрите список файлов. Удалите ненужные значком корзины или нажмите **Добавить ещё файлы**, чтобы добавить другие книги. +3. Нажмите **Преобразовать в PDF**. Движок PyMuPDF разбирает структуру MOBI и отображает каждую страницу как содержимое PDF. +4. Один файл скачивается как PDF. При конвертации нескольких файлов вы получите ZIP-архив `mobi-converted.zip`. + +## Параметры + +Дополнительные настройки не нужны. При преобразовании сохраняются текст, форматирование и встроенные изображения исходного файла MOBI. + +## Сценарии использования + +- Чтение содержимого, купленного в Kindle, на устройстве для чтения без Kindle, которое поддерживает только PDF +- Печать глав книги для автономного изучения или заметок +- Архивирование личной библиотеки книг в универсальном формате +- Отправка фрагментов тому, у кого не установлено приложение Kindle + +## Советы + +- Файлы MOBI с защитой DRM преобразовать нельзя. Инструмент работает только с файлами MOBI без DRM. +- Большие книги с множеством встроенных изображений могут обрабатываться на несколько секунд дольше, так как всё выполняется в браузере. + +## Связанные инструменты + +- [EPUB в PDF](./epub-to-pdf) +- [FB2 в PDF](./fb2-to-pdf) +- [CBZ в PDF](./cbz-to-pdf) diff --git a/docs/ru/tools/n-up-pdf.md b/docs/ru/tools/n-up-pdf.md new file mode 100644 index 00000000..49f317e5 --- /dev/null +++ b/docs/ru/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Расположите несколько страниц PDF на одном листе в виде сетки для экономной печати. +--- + +# N-Up PDF + +Размещайте несколько страниц на одном листе в виде сетки. Это сокращает число печатаемых листов: на каждый лист помещается 2, 4, 6, 8, 9 или 16 страниц. Инструмент сам масштабирует и размещает страницы, а размер страницы можно настроить. + +## Как это работает + +1. Загрузите файл PDF. +2. Выберите число страниц на листе (значение «N»): 2, 4, 6, 8, 9 или 16. +3. Выберите размер страницы результата (по умолчанию A4) и ориентацию. +4. При желании настройте интервал, цвет границ и цвет фона. +5. Нажмите кнопку обработки. Инструмент масштабирует каждую страницу и размещает их плиткой на новых листах. + +## Возможности + +- Макеты сетки: 2, 4, 6, 8, 9 и 16 страниц на листе +- Настраиваемые размер и ориентация страницы результата +- Необязательный интервал между страницами +- Настройки цвета фона и границ +- Сохраняет пропорции исходных страниц при масштабировании + +## Параметры + +| Параметр | Описание | +| -------------------- | ------------------------------------------------------------------------ | +| **Страниц на листе** | Число исходных страниц на каждой странице результата (2, 4, 6, 8, 9, 16) | +| **Размер страницы** | Размер выходного листа (A4, Letter, Legal и другие) | +| **Ориентация** | Книжная или альбомная для выходного листа | +| **Интервал** | Промежуток между страницами в пунктах | +| **Цвет фона** | Цвет заливки фона выходного листа | +| **Цвет границы** | Цвет границ вокруг каждой страницы | + +## Сценарии использования + +- Печать раздаточных материалов по 4 слайда на странице для экономии бумаги +- Создание шпаргалок с несколькими справочными страницами на одном листе +- Подготовка компактных архивов документов для подшивки +- Создание листов-обзоров с миниатюрами длинного документа + +## Советы + +- Альбомная ориентация часто лучше подходит для макета по 2 страницы, а книжная обычно лучше для 4 и более. +- Увеличение интервала улучшает читаемость, но уменьшает область для каждой страницы. +- Для обратной операции (разделения одной страницы на несколько) см. [Постеризация документа](./posterize-pdf). + +## Связанные инструменты + +- [Постеризация документа](./posterize-pdf) +- [PDF-буклет](./pdf-booklet) +- [Объединение в одну страницу](./combine-single-page) diff --git a/docs/ru/tools/ocr-pdf.md b/docs/ru/tools/ocr-pdf.md new file mode 100644 index 00000000..24c214c3 --- /dev/null +++ b/docs/ru/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: Распознавание текста в PDF +description: Сделайте отсканированные PDF доступными для поиска и копирования с помощью Tesseract OCR с поддержкой нескольких языков и фильтрацией символов. +--- + +# Распознавание текста в PDF + +Превращайте отсканированные документы в PDF с поиском и копированием текста. Инструмент использует Tesseract OCR, чтобы распознавать текст на изображениях, и накладывает поверх исходных страниц невидимый текстовый слой. Внешний вид страниц сохраняется, а содержимое становится полностью доступным для поиска. + +## Как это работает + +1. Загрузите отсканированный PDF или PDF на основе изображений. +2. Выберите один или несколько языков документа в списке языков с поиском. +3. При желании настройте расширенные параметры (разрешение, бинаризация, белый список). +4. Нажмите **Начать распознавание** и следите за ходом выполнения на индикаторе прогресса. +5. По завершении просмотрите извлечённый текст, затем скачайте PDF с поиском или обычный файл `.txt`. + +## Возможности + +- Распознавание на нескольких языках с выбором языка через поиск +- Невидимый текстовый слой сохраняет исходный вид документа +- Индикатор прогресса и журнал в реальном времени во время обработки +- Скачивание результата как PDF с поиском или обычного текстового файла +- Копирование извлечённого текста в буфер обмена +- Три уровня разрешения для баланса между скоростью и точностью + +## Параметры + +| Настройка | Значения | По умолчанию | Назначение | +| -------------------------------- | --------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------- | +| **Разрешение** | Стандартное (192 DPI), Высокое (288 DPI), Максимальное (384 DPI) | Высокое | Более высокое разрешение повышает точность для мелкого текста, но работает дольше | +| **Бинаризация изображения** | Вкл. / Выкл. | Выкл. | Повышает контраст чистых сканов, преобразуя их в чёрно-белые | +| **Набор символов белого списка** | Нет, Буквы и цифры, Числа и валюта, Только буквы, Только цифры, Счёт, Формы, Свой | Нет | Ограничивает распознаваемые символы, чтобы повысить точность для определённых типов документов | +| **Белый список символов** | Произвольный текст | Пусто | Ручной набор символов, если выбран набор «Свой» | + +## Сценарии использования + +- Превращение отсканированных договоров и счетов в документы с поиском, чтобы искать по ним через Ctrl+F +- Извлечение текста из сфотографированных документов или старых бумажных записей +- Обработка чеков с набором «Счёт» для точного распознавания сумм и дат +- Создание доступных PDF из сканов, состоящих только из изображений, для соответствия требованиям +- Пакетное извлечение текста из отсканированных книг или руководств + +## Советы + +- Выбирайте несколько языков, если документ содержит текст на разных языках (например, английские заголовки и основной текст на японском). +- Используйте бинаризацию для документов с выцветшим или малоконтрастным текстом: она может заметно повысить точность распознавания. +- Наборы белого списка «Счёт» и «Формы» значительно снижают число ложных срабатываний в структурированных документах, игнорируя лишние формы символов. + +## Связанные инструменты + +- [Извлечение таблиц из PDF](./extract-tables) +- [Объединение PDF](./merge-pdf) +- [Сжатие PDF](./compress-pdf) diff --git a/docs/ru/tools/odg-to-pdf.md b/docs/ru/tools/odg-to-pdf.md new file mode 100644 index 00000000..074db673 --- /dev/null +++ b/docs/ru/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG в PDF +description: Преобразуйте файлы LibreOffice Draw (ODG) в PDF в браузере. Бесплатно, без загрузки, полностью приватно. +--- + +# ODG в PDF + +Преобразуйте файлы OpenDocument Graphics в PDF. ODG - родной формат LibreOffice Draw, который используется для диаграмм, блок-схем и векторных иллюстраций. PDF упрощает обмен такими рисунками, их печать и встраивание в другие документы. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :-------------------- | :--------- | :--------------------------------------- | +| OpenDocument Graphics | `.odg` | Файлы LibreOffice Draw / OpenOffice Draw | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы ODG. Можно добавить сразу несколько файлов. +2. Просмотрите список файлов. Значок корзины удаляет отдельные записи, а **Добавить ещё файлы** добавляет другие рисунки. +3. Нажмите **Преобразовать в PDF**. В браузере загружается движок на основе LibreOffice и преобразует каждый файл ODG, сохраняя векторную графику, фигуры и текст. +4. Один файл скачивается сразу как PDF. Несколько файлов создают ZIP-архив `odg-to-pdf.zip`. + +## Параметры + +Дополнительные настройки не нужны. При преобразовании сохраняются исходные размеры страницы, фигуры, соединители и текстовые блоки из файла ODG. + +## Сценарии использования + +- Передача диаграмм LibreOffice Draw клиентам, у которых не установлен LibreOffice +- Печать блок-схем и сетевых диаграмм, созданных в Draw +- Включение иллюстраций ODG в отчёт или презентацию в виде встроенных PDF +- Архивирование технических чертежей в формате, который останется читаемым десятилетиями + +## Советы + +- Векторные элементы остаются векторными в итоговом PDF, поэтому результат чётко масштабируется для печати любого размера. +- При первом использовании движку LibreOffice нужно время на запуск. Последующие преобразования в том же сеансе выполняются быстрее. + +## Связанные инструменты + +- [ODS в PDF](./ods-to-pdf) +- [ODP в PDF](./odp-to-pdf) +- [VSD в PDF](./vsd-to-pdf) diff --git a/docs/ru/tools/odp-to-pdf.md b/docs/ru/tools/odp-to-pdf.md new file mode 100644 index 00000000..109430a3 --- /dev/null +++ b/docs/ru/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP в PDF +description: Преобразуйте презентации LibreOffice Impress (ODP) в PDF в браузере. Бесплатно, приватно, без загрузки. +--- + +# ODP в PDF + +Преобразуйте файлы OpenDocument Presentation в PDF. ODP - родной формат LibreOffice Impress и стандартный вариант экспорта из Google Slides. Если превратить презентации в PDF, их сможет открыть любой человек без программ для презентаций, а слайды аккуратно печатаются. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :------------------------ | :--------- | :--------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / экспорт из Google Slides | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы ODP. Можно выбрать сразу несколько презентаций. +2. Просмотрите список файлов. Значок корзины удаляет записи, а **Добавить ещё файлы** добавляет другие презентации. +3. Нажмите **Преобразовать в PDF**. Движок на основе LibreOffice обрабатывает каждую презентацию и создаёт PDF, где каждый слайд становится страницей. +4. Один файл скачивается как PDF. Несколько файлов поставляются в ZIP-архиве `odp-to-pdf.zip`. + +## Параметры + +Настраивать ничего не нужно. Каждый слайд отображается в исходных размерах, а текст, изображения, фигуры и фоны слайдов сохраняются. + +## Сценарии использования + +- Рассылка презентации аудитории в виде раздаточного PDF +- Передача экспорта из Google Slides тем, кто предпочитает PDF вместо ODP +- Архивирование докладов и лекций на конференциях в формате только для чтения +- Печать наборов слайдов для очных семинаров + +## Советы + +- Переходы и анимация слайдов относятся только к визуальным эффектам и в PDF не переносятся, но всё статичное содержимое отображается правильно. +- Заметки докладчика в итоговый PDF не включаются. Если они нужны, экспортируйте их отдельно из программы для презентаций. +- Как и другие инструменты на основе LibreOffice, движок загружается при первом использовании и остаётся в кэше на время сеанса. + +## Связанные инструменты + +- [ODG в PDF](./odg-to-pdf) +- [ODS в PDF](./ods-to-pdf) +- [PUB в PDF](./pub-to-pdf) diff --git a/docs/ru/tools/ods-to-pdf.md b/docs/ru/tools/ods-to-pdf.md new file mode 100644 index 00000000..3d2f4451 --- /dev/null +++ b/docs/ru/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS в PDF +description: Конвертируйте таблицы LibreOffice Calc (ODS) в PDF прямо в браузере. Бесплатно, приватно, без регистрации. +--- + +# ODS в PDF + +Преобразуйте файлы OpenDocument Spreadsheet в PDF. ODS - родной формат LibreOffice Calc и частый вариант экспорта из Google Sheets. Инструмент выводит данные, форматирование и диаграммы таблицы в постраничный PDF, который можно распечатать или отправить. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----------------------- | :--------- | :------------------------------------------ | +| OpenDocument Spreadsheet | `.ods` | Экспорт из LibreOffice Calc / Google Sheets | + +## Как это работает + +1. Нажмите на область загрузки или перетащите ODS-файлы. Можно выбрать сразу несколько файлов. +2. Проверьте список файлов. Значком корзины удалите лишнее или нажмите **Добавить еще файлы**, чтобы добавить ещё. +3. Нажмите **Преобразовать в PDF**. Движок на основе LibreOffice загрузится в браузере и преобразует каждую таблицу в страницы PDF. +4. Одна таблица скачивается как PDF. Несколько файлов упаковываются в `ods-to-pdf.zip`. + +## Параметры + +Настройка не требуется. Конвертер применяет к PDF существующую разметку печати таблицы, форматирование ячеек и ширину столбцов. + +## Сценарии использования + +- Отправить бюджет или отчёт из LibreOffice Calc тому, кто принимает только PDF +- Распечатать экспорт из Google Sheets, скачанный в формате ODS +- Архивировать финансовые документы в формате, который нельзя редактировать +- Сдавать формы и табели в формате ODS как документы с фиксированной разметкой + +## Советы + +- Если в таблице несколько листов, в PDF попадут все листы. +- Очень широкие таблицы могут разбиваться по горизонтали на несколько страниц PDF. Если разметка важна, подберите ширину столбцов в исходном файле перед конвертацией. +- Движок LibreOffice инициализируется при первом использовании. Последующие конвертации в той же сессии выполняются быстрее. + +## Связанные инструменты + +- [ODG в PDF](./odg-to-pdf) +- [ODP в PDF](./odp-to-pdf) +- [XML в PDF](./xml-to-pdf) diff --git a/docs/ru/tools/odt-to-pdf.md b/docs/ru/tools/odt-to-pdf.md new file mode 100644 index 00000000..ae319abb --- /dev/null +++ b/docs/ru/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT в PDF +description: Конвертируйте файлы OpenDocument Text (ODT) в PDF в браузере с помощью движка на основе LibreOffice. +--- + +# ODT в PDF + +Преобразуйте файлы OpenDocument Text в PDF. ODT - родной формат LibreOffice Writer, Apache OpenOffice и других открытых текстовых редакторов. Инструмент использует браузерный движок LibreOffice и точно сохраняет форматирование, таблицы, изображения и стили. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :---------------- | :--------- | +| OpenDocument Text | `.odt` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите один или несколько ODT-файлов. +2. Проверьте список файлов. Добавьте ещё или удалите лишние. +3. Нажмите **Конвертировать в PDF**. Движок LibreOffice инициализируется (индикатор показывает ход загрузки), затем конвертируется каждый файл. +4. Один файл скачивается сразу как PDF. Несколько файлов упаковываются в `odt-converted.zip`. + +## Параметры + +Дополнительных настроек нет. При конвертации форматирование исходного документа сохраняется максимально близко к оригиналу. + +## Результат + +| Количество файлов | Результат | +| :---------------- | :--------------------------------------------------------- | +| 1 файл | Скачивается один PDF (например, `document.pdf`) | +| 2 и более | ZIP-архив (`odt-converted.zip`) с одним PDF на каждый файл | + +## Сценарии использования + +- Конвертация документов LibreOffice Writer в PDF для пользователей Microsoft Office +- Подготовка PDF для печати из научных работ в формате OpenDocument +- Пакетная конвертация папки шаблонов ODT в PDF для рассылки +- Получение PDF из ODT-файлов, созданных системами автоматической генерации документов + +## Советы + +- Движок LibreOffice загружается при первом использовании и кэшируется для следующих конвертаций. Первая загрузка занимает несколько секунд, потом конвертация проходит быстро. +- Сложные документы со встроенными OLE-объектами или необычными шрифтами могут выглядеть немного иначе, чем в настольном LibreOffice. Перед пакетной конвертацией проверьте на образце. +- Для документов Word (`.doc`, `.docx`) используйте инструмент [Word в PDF](./word-to-pdf): он тоже работает на движке LibreOffice, но напрямую принимает форматы Microsoft. + +## Связанные инструменты + +- [Word в PDF](./word-to-pdf) +- [RTF в PDF](./rtf-to-pdf) +- [Текст в PDF](./txt-to-pdf) diff --git a/docs/ru/tools/organize-pdf.md b/docs/ru/tools/organize-pdf.md new file mode 100644 index 00000000..c3d7c3bc --- /dev/null +++ b/docs/ru/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Дублирование и организация +description: Меняйте порядок страниц PDF, дублируйте и удаляйте их перетаскиванием миниатюр или вводом нужного порядка. +--- + +# Дублирование и организация + +Переставляйте, дублируйте и удаляйте страницы PDF в наглядном интерфейсе с перетаскиванием. Каждая страница отображается миниатюрой, которую можно переместить, клонировать или удалить перед сохранением результата в новый файл. + +## Как это работает + +1. Загрузите один PDF-файл. +2. Инструмент отобразит сетку миниатюр всех страниц. +3. Перетаскивайте миниатюры, чтобы изменить порядок, нажимайте зелёную кнопку дублирования, чтобы клонировать страницу, или красную кнопку удаления, чтобы убрать её. +4. Либо введите свой порядок страниц в текстовое поле (например, `3, 1, 2, 4`) и нажмите **Применить порядок**, чтобы переставить все страницы сразу. +5. Нажмите кнопку обработки, чтобы собрать и скачать PDF с новым порядком. + +## Возможности + +- Перестановка страниц перетаскиванием с плавной анимацией +- Кнопки дублирования и удаления для каждой страницы +- Ввод порядка страниц для точной перестановки +- Номера страниц автоматически обновляются после каждого изменения +- Защита от удаления последней оставшейся страницы + +## Сценарии использования + +- Перенести неправильно поставленную страницу отчёта на нужное место +- Продублировать страницу формы, чтобы в одном файле было несколько пустых копий +- Убрать черновые и служебные страницы перед рассылкой документа +- Развернуть или перемешать порядок страниц при подготовке к печати +- Собрать свою последовательность страниц без повторного объединения файлов + +## Советы + +- В поле порядка страниц указываются исходные номера страниц через запятую. Каждая страница должна встретиться ровно один раз, без пропусков и повторов. +- После дублирования страницы обе копии ссылаются на один и тот же исходный индекс страницы. Перемещать каждую копию можно независимо. +- Для массовых операций с несколькими файлами или более сложных сценариев воспользуйтесь инструментом [PDF мультиинструмент](./pdf-multi-tool). + +## Связанные инструменты + +- [Объединение PDF](./merge-pdf) +- [Удаление страниц](./delete-pages) +- [PDF мультиинструмент](./pdf-multi-tool) +- [Обращение порядка страниц](./reverse-pages) diff --git a/docs/ru/tools/page-dimensions.md b/docs/ru/tools/page-dimensions.md new file mode 100644 index 00000000..88f319a8 --- /dev/null +++ b/docs/ru/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Размеры страниц +description: Анализ размеров, ориентации, пропорций и поворота страниц PDF. Находит документы со страницами разного размера и экспортирует данные в CSV. +--- + +# Размеры страниц + +Диагностический инструмент, который читает каждую страницу PDF и показывает её точные размеры, ориентацию, название стандартного формата, пропорции, площадь и поворот. Полезен, чтобы найти страницы разного размера перед печатью или чтобы описать свойства полученного PDF. + +## Как это работает + +1. Загрузите PDF-файл. Анализ запускается автоматически, нажимать кнопку не нужно. +2. В сводной панели показаны общее число страниц, число уникальных размеров и наличие страниц разного размера. +3. Просмотрите полную таблицу с данными по каждой странице. +4. Переключайте единицы измерения: пункты, дюймы, миллиметры или пиксели. +5. Нажмите **Экспорт в CSV**, чтобы сохранить данные. + +## Поля отчёта + +| Столбец | Описание | +| ------------------ | --------------------------------------------------- | +| Страница № | Порядковый номер страницы | +| Размеры | Ширина x высота в выбранных единицах | +| Стандартный формат | Подходящее название (A4, Letter и т. д.) или "Свой" | +| Ориентация | Книжная или альбомная | +| Соотношение сторон | Отношение ширины к высоте в десятичном виде | +| Площадь | Площадь страницы в квадратных выбранных единицах | +| Rotation | Поворот страницы в градусах | + +## Возможности + +- Автоматическое определение стандартных форматов бумаги (A3, A4, A5, Letter, Legal, Tabloid и других) +- Предупреждение о страницах разного размера с разбивкой по размерам и числу страниц каждого размера +- Перевод между пунктами, дюймами, миллиметрами и пикселями (при 96 PPI) +- Экспорт в CSV для электронных таблиц и систем документации + +## Сценарии использования + +- Убедиться, что все страницы имеют формат A4, перед отправкой документа в типографию +- Выяснить, почему объединённый PDF печатается с неожиданными полями на некоторых страницах +- Описать структуру страниц большого PDF-архива для записей метаданных +- Найти повёрнутые страницы, которые нужно исправить + +## Советы + +- Если в сводке указано "Разные размеры", перед печатью приведите страницы к единому размеру с помощью инструмента "Редактор размера страниц". +- Поле поворота помогает найти страницы, которые отображаются правильно, но имеют ненулевой атрибут поворота. В некоторых процессах это вызывает проблемы. + +## Связанные инструменты + +- [Редактор размера страниц](./fix-page-size): приведите страницы к единому размеру после обнаружения разных +- [Сжатие PDF](./compress-pdf): оптимизируйте PDF после исправления страниц +- [Поворот PDF](./rotate-pdf): исправьте повёрнутые страницы diff --git a/docs/ru/tools/page-numbers.md b/docs/ru/tools/page-numbers.md new file mode 100644 index 00000000..e27ae0c0 --- /dev/null +++ b/docs/ru/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Нумерация страниц +description: Добавляйте номера страниц в любое место страниц PDF с настройкой шрифта, размера и цвета. +--- + +# Нумерация страниц + +Добавьте видимые номера на каждую страницу PDF. Вы выбираете положение, формат, размер шрифта и цвет, остальное инструмент сделает сам. + +## Как это работает + +1. Загрузите PDF-файл. +2. Настройте параметры нумерации в появившейся панели. +3. Нажмите **Добавить номера страниц**, чтобы начать обработку. +4. PDF с номерами скачается автоматически. + +## Параметры + +- **Положение**: где будут номера страниц. Внизу по центру, внизу слева, внизу справа, вверху по центру, вверху слева или вверху справа. +- **Формат**: простая нумерация (1, 2, 3...) или формат "страница X из Y" (1 / 5, 2 / 5...). +- **Размер шрифта**: размер текста номера. По умолчанию 12. +- **Цвет**: любой цвет текста номера, выбирается в палитре. + +## Возможности + +- Шесть вариантов положения: все углы и центр сверху и снизу +- Два формата нумерации: простая последовательная или "страница X из Y" +- Размер шрифта от 6 до 72 пунктов +- Полноценная палитра для цвета текста +- Автоматический подбор полей, чтобы номера оставались в безопасной зоне при любом размере страницы + +## Сценарии использования + +- Подготовка документов к печати, где нужны видимые номера страниц +- Нумерация объединённого PDF, собранного из нескольких файлов +- Нумерация раздаточных материалов к презентациям перед рассылкой +- Последовательная нумерация юридических документов и договоров + +## Советы + +- Формат "страница X из Y" удобен для документов, где читателю важно знать общий объём, например для коммерческих предложений и отчётов. +- Если для разных разделов нужны разные стили нумерации (например, римские цифры для вводной части), воспользуйтесь инструментом [Добавить метки страниц](./add-page-labels). + +## Связанные инструменты + +- [Добавить метки страниц](./add-page-labels) +- [Bates-нумерация](./bates-numbering) +- [Колонтитулы](./header-footer) diff --git a/docs/ru/tools/pdf-booklet.md b/docs/ru/tools/pdf-booklet.md new file mode 100644 index 00000000..42e479b9 --- /dev/null +++ b/docs/ru/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF-буклет +description: Расположите страницы PDF в порядке буклета (скрепка по сгибу) для фальцовки и скрепления в печатную брошюру. +--- + +# PDF-буклет + +Переставьте страницы PDF в порядке буклетной импозиции. При двусторонней печати и сложении пополам страницы окажутся в правильной последовательности. Такая раскладка используется для брошюр на скрепке и зинов. + +## Как это работает + +1. Загрузите PDF-файл. +2. Задайте параметры буклета: размер страницы результата и ориентацию. +3. Нажмите **Создать предпросмотр**, чтобы увидеть, как страницы расположатся на каждом листе. +4. Просмотрите превью: для каждого физического листа показано, какие страницы окажутся на лицевой и оборотной стороне. +5. Нажмите **Скачать**, чтобы сохранить PDF с буклетной импозицией. + +## Возможности + +- Автоматическая перестановка страниц для сшивания скрепкой по сгибу +- Настраиваемый размер страницы результата +- Наглядное превью раскладки буклета перед скачиванием +- При нечётном числе страниц автоматически добавляются пустые +- Исходные страницы масштабируются под размер листа буклета + +## Сценарии использования + +- Создание печатных буклетов и зинов из обычного PDF +- Подготовка программ конференций и путеводителей мероприятий к печати своими силами +- Изготовление сложенных открыток и небольших каталогов +- Выпуск небольших сборников стихов и прозы для ручной брошюровки + +## Советы + +- Для аккуратного буклета число страниц исходного PDF желательно кратно 4. Если это не так, недостающие пустые страницы добавятся автоматически, чтобы заполнить последний лист. +- Печатайте двусторонне с настройкой принтера "переворот по короткому краю", затем сложите все листы вместе и скрепите по сгибу. +- Если нужно просто разместить несколько страниц на одном листе без буклетного порядка, используйте [N-Up PDF](./n-up-pdf). + +## Связанные инструменты + +- [N-Up PDF](./n-up-pdf) +- [Поворот PDF](./rotate-pdf) +- [Добавление пустой страницы](./add-blank-page) diff --git a/docs/ru/tools/pdf-layers.md b/docs/ru/tools/pdf-layers.md new file mode 100644 index 00000000..b3153198 --- /dev/null +++ b/docs/ru/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Слои PDF OCG +description: Просматривайте, переключайте, добавляйте и удаляйте слои Optional Content Group (OCG) в PDF-документе. +--- + +# Слои PDF OCG + +Управляйте группами необязательного содержимого (Optional Content Groups, OCG), которые обычно называют "слоями", внутри PDF. Можно включать и выключать слои, добавлять новые (в том числе вложенные дочерние), удалять слои и сохранять изменённый PDF. + +## Как это работает + +1. Загрузите PDF-файл. +2. Нажмите кнопку обработки, чтобы загрузить документ в движке PyMuPDF. +3. Инструмент покажет все существующие слои с их видимостью, состоянием блокировки и иерархией вложенности. +4. Флажками показывайте и скрывайте слои. Заблокированные слои переключать нельзя. +5. Добавляйте новые слои верхнего уровня, вводя название и нажимая кнопку добавления, либо добавляйте дочерние слои к существующему родительскому. +6. Удаляйте ненужные слои. +7. Нажмите **Скачать изменённый PDF**, чтобы скачать изменённый PDF с применёнными изменениями слоёв. + +## Возможности + +- Показывает иерархию слоёв с отступами для вложенных +- Включение и выключение видимости слоя +- Индикатор блокировки защищает от случайных изменений +- Добавление слоёв верхнего уровня и дочерних слоёв с любыми названиями +- Удаление отдельных слоёв +- Все изменения сохраняются в новый PDF-файл + +## Сценарии использования + +- Включение и выключение слоёв разметки в архитектурных и инженерных чертежах +- Добавление новых слоёв аннотаций в многослойный проектный документ +- Удаление устаревших слоёв из шаблона перед рассылкой +- Проверка, какие слои есть в сложном PDF, полученном от третьей стороны + +## Советы + +- Если в PDF нет слоёв, инструмент покажет пустое состояние с предложением добавить слой. Не все PDF используют слои OCG: чаще всего они встречаются в экспорте из CAD и в дизайнерских файлах. +- Дочерние слои отображаются с отступом под родительским. Вложенность может быть любой глубины. +- Заблокированные слои отмечены значком замка, а их флажки отключены. Блокировку задаёт автор PDF. + +## Связанные инструменты + +- [Просмотр метаданных](./view-metadata) +- [Редактирование метаданных](./edit-metadata) +- [Дублирование и организация](./organize-pdf) diff --git a/docs/ru/tools/pdf-multi-tool.md b/docs/ru/tools/pdf-multi-tool.md new file mode 100644 index 00000000..d0c284a0 --- /dev/null +++ b/docs/ru/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF мультиинструмент +description: Универсальный менеджер страниц для объединения, разделения, поворота, дублирования, удаления и перестановки страниц PDF. +--- + +# PDF мультиинструмент + +Единое рабочее пространство для всех операций со страницами PDF. Загрузите один или несколько PDF и работайте со всеми страницами в одной визуальной сетке. Поворачивайте, переставляйте, дублируйте, удаляйте, вставляйте другие PDF, добавляйте пустые страницы и разделяйте результат, не выходя из инструмента. + +## Как это работает + +1. Нажмите **Загрузить PDF** или перетащите файлы в область загрузки. Можно выбрать несколько файлов. +2. Все страницы всех загруженных файлов появятся в прокручиваемой сетке с миниатюрами. +3. Для работы со страницами используйте панель инструментов или кнопки на каждой странице. +4. Отмечайте страницы флажком на карточке, затем применяйте массовые операции. +5. Отмечайте точки разделения значком ножниц, чтобы разбить результат на отдельные файлы. +6. Нажмите **Экспортировать PDF**, чтобы скачать итог. Если есть метки разделения, результатом будет ZIP с несколькими PDF. + +## Возможности + +- **Объединить**: загруженные PDF автоматически объединяются в одном рабочем пространстве +- **Изменить порядок**: перетаскивайте карточки страниц, чтобы изменить порядок +- **Повернуть**: поворот отдельных страниц или группы с шагом 90 градусов (влево или вправо) +- **Дублировать**: клонирование любой страницы одним щелчком +- **Удалить**: удаление отдельных страниц или выбранной группы +- **Вставить PDF**: вставка нового PDF после любой страницы +- **Добавить пустую страницу**: добавление пустой страницы A4 в конец +- **Разделить**: расставьте метки разделения между страницами, затем экспортируйте ZIP с отдельными PDF +- **Выбрать все / Снять выбор**: быстрое выделение для массовых операций +- **Отменить / Вернуть**: полная история отмены и повтора для каждой операции +- **Скачать выбранное**: экспорт только выбранных страниц в отдельный PDF +- Автоматическое восстановление повреждённых PDF перед загрузкой + +## Сценарии использования + +- Сборка своего документа из страниц нескольких исходных PDF +- Очистка отсканированного документа: удаление пустых страниц, поворот боковых сканов, перестановка разделов +- Разделение большого PDF по границам глав с помощью визуальных меток +- Быстрое редактирование страниц без полноценного PDF-редактора + +## Советы + +- Система отмены и повтора учитывает каждую операцию. Пользуйтесь ей свободно: случайно потерять работу нельзя. +- Метки разделения отображаются пунктирными синими линиями между страницами. Поставьте их там, где нужно разделить документ, затем экспортируйте ZIP. +- Для простого объединения или разделения быстрее могут оказаться отдельные инструменты [Объединение PDF](./merge-pdf) и [Разделение PDF](./split-pdf). Мультиинструмент выручает, когда за один сеанс нужно несколько операций. + +## Связанные инструменты + +- [Объединение PDF](./merge-pdf) +- [Разделение PDF](./split-pdf) +- [Дублирование и организация](./organize-pdf) +- [Поворот PDF](./rotate-pdf) diff --git a/docs/ru/tools/pdf-to-bmp.md b/docs/ru/tools/pdf-to-bmp.md new file mode 100644 index 00000000..c32ddddb --- /dev/null +++ b/docs/ru/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF в BMP +description: Конвертируйте страницы PDF в несжатые изображения BMP. Подходит для устаревших систем и печатных процессов, которым нужен растровый вход. +--- + +# PDF в BMP + +Преобразует каждую страницу PDF в изображение BMP (Bitmap). BMP - несжатый формат, поэтому результат точен до пикселя и без потери качества, но файлы получаются большими. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Нажмите **Конвертировать**, чтобы обработать файл. +3. Автоматически скачается один файл `.bmp` или ZIP-архив. + +## Параметры + +Настраиваемых параметров нет. Страницы рендерятся в фиксированном масштабе 2x, поэтому размер изображений примерно вдвое больше исходных размеров страницы PDF. + +## Формат результата + +- **Одна страница**: `filename.bmp` +- **Несколько страниц**: `filename_bmps.zip` с файлами `page_1.bmp`, `page_2.bmp` и так далее. + +## Сценарии использования + +- Передача страниц PDF в устаревшие системы и оборудование, принимающее только BMP. +- Подготовка несжатых изображений для определённых печатных процессов. +- Использование растрового результата как входных данных для программ обработки изображений, которым нужны необработанные пиксели. + +## Советы + +- Файлы BMP очень большие, потому что хранят необработанные пиксели без сжатия. В большинстве случаев [PDF в PNG](./pdf-to-png) даёт то же качество без потерь при гораздо меньшем размере. +- Если ваша система принимает PNG или TIFF, выбирайте эти форматы, чтобы экономить место на диске. + +## Связанные инструменты + +- [PDF в PNG](./pdf-to-png) +- [PDF в TIFF](./pdf-to-tiff) +- [PDF в JPG](./pdf-to-jpg) diff --git a/docs/ru/tools/pdf-to-cbz.md b/docs/ru/tools/pdf-to-cbz.md new file mode 100644 index 00000000..94d04daa --- /dev/null +++ b/docs/ru/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF в CBZ +description: Преобразуйте PDF в файл CBZ (Comic Book Archive) для программ чтения комиксов, таких как Komga, Kavita, CDisplayEx и Calibre. +--- + +# PDF в CBZ + +Преобразует PDF в файл CBZ (Comic Book ZIP), стандартный формат цифровых комиксов и манги. Каждая страница PDF становится изображением внутри архива. Для максимальной совместимости инструмент создаёт метаданные в трёх форматах: ComicInfo.xml, metadata.opf и ComicBookInfo JSON. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Выберите формат изображений, качество, масштаб и при желании метаданные. +3. Нажмите **Конвертировать**, чтобы создать файл CBZ. +4. Файл `.cbz` скачается автоматически. + +## Параметры + +| Параметр | Значения | По умолчанию | Описание | +| -------------------- | --------------- | ------------ | ------------------------------------------------------------------------------------------- | +| Формат изображения | JPEG, PNG, WebP | JPEG | JPEG для цветных комиксов, PNG для чёрно-белой манги без потерь, WebP для лучшего сжатия. | +| Качество изображения | 50–100% | 85% | Степень сжатия JPEG/WebP. Для PNG скрыт (всегда без потерь). | +| Масштаб | 1.0x–4.0x | 2.0x | Больший масштаб даёт более чёткие изображения для экранов с высоким разрешением. | +| Оттенки серого | Вкл/Выкл | Выкл | Преобразует страницы в оттенки серого. Уменьшает размер файла для чёрно-белого содержимого. | +| Режим манги | Вкл/Выкл | Выкл | Задаёт в метаданных направление чтения справа налево. | +| Включить метаданные | Вкл/Выкл | Вкл | Встраивает ComicInfo.xml, metadata.opf и ComicBookInfo JSON. | + +## Поля метаданных + +Когда метаданные включены, можно заполнить: + +- **Название**: определяется автоматически по имени PDF-файла. +- **Серия**: название серии (например, "Naruto"). +- **Номер (#)**: номер выпуска в серии. +- **Том**: номер тома. +- **Автор(ы)**: имя автора или создателя. +- **Издатель**: издательство. +- **Теги / Жанр**: теги через запятую (например, "Action, Adventure"). +- **Год издания**: год публикации (1900–2100). +- **Рейтинг**: оценка сообщества от 0 до 5. + +## Совместимость метаданных + +Инструмент записывает метаданные в трёх форматах, чтобы любая программа чтения могла их найти: + +| Формат | Расположение | Поддерживается в | +| ------------------ | -------------------- | ------------------------------------------- | +| ComicInfo.xml | Файл внутри ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Файл внутри ZIP | Calibre | +| ComicBookInfo JSON | Поле комментария ZIP | Calibre (запасной вариант) | + +## Формат результата + +- `filename.cbz`: ZIP-архив с пронумерованными изображениями страниц и файлами метаданных. + +Изображения страниц называются с числами с ведущими нулями (`01.jpg`, `02.jpg` и так далее), чтобы программы чтения показывали их в правильном порядке. + +## Сценарии использования + +- Конвертация PDF с мангой и комиксами для программ чтения комиксов. +- Создание цифровой библиотеки комиксов в Komga, Kavita или Calibre. +- Преобразование отсканированных комиксов в удобный для чтения формат. +- Обмен комиксами в формате, который сохраняет направление чтения и метаданные. + +## Советы + +- Используйте **JPEG** для цветных комиксов и **PNG** для чёрно-белой манги: PNG очень эффективно сжимает чёрно-белое содержимое. +- Включите **Конвертировать в оттенки серого** для манги, чтобы заметно уменьшить размер файла. +- Заполните поля **Серия** и **Номер (#)**, чтобы менеджеры библиотек (Komga, Calibre) могли автоматически упорядочить вашу коллекцию. +- **WebP** даёт лучшее сжатие, но старые программы чтения комиксов могут его не поддерживать. + +## Связанные инструменты + +- [PDF в JPG](./pdf-to-jpg) +- [PDF в PNG](./pdf-to-png) +- [PDF в TIFF](./pdf-to-tiff) +- [Извлечение изображений](./extract-images) diff --git a/docs/ru/tools/pdf-to-csv.md b/docs/ru/tools/pdf-to-csv.md new file mode 100644 index 00000000..33ddb9b8 --- /dev/null +++ b/docs/ru/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF в CSV +description: Извлекайте таблицы из PDF-документов и экспортируйте их в один файл CSV. Работает с многостраничными PDF и автоматически находит таблицы. +--- + +# PDF в CSV + +Извлекает таблицы из PDF и экспортирует их в файл CSV. Инструмент просматривает каждую страницу с помощью механизма поиска таблиц PyMuPDF и записывает все найденные строки в один файл с разделителями-запятыми. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Нажмите **Конвертировать в CSV**, чтобы начать извлечение таблиц. +3. Инструмент просматривает каждую страницу и автоматически находит таблицы. +4. Скачивается файл `.csv` со всеми извлечёнными данными таблиц. + +Таблицы с разных страниц разделяются в результате пустыми строками. Ячейки с запятыми, кавычками или переводами строк корректно экранируются по RFC 4180. + +## Параметры + +Настраиваемых параметров нет. Все найденные в документе таблицы извлекаются и объединяются в один CSV. + +## Формат результата + +- Один файл `filename.csv` со всеми найденными таблицами. + +## Сценарии использования + +- Перенос финансовых данных из банковских выписок и счетов в PDF в электронную таблицу. +- Извлечение таблиц цен из предложений поставщиков для сравнения. +- Преобразование табличных данных исследований из PDF в формат, удобный для анализа. +- Перенос данных из старых PDF-отчётов в базы данных. + +## Советы + +- Если таблицы не найдены, инструмент покажет сообщение "Таблицы не найдены". Обычно это значит, что в PDF текст выглядит как таблица, но не является настоящей таблицей. +- Для более тонкого контроля над отдельными таблицами используйте [Извлечение таблиц из PDF](./extract-tables), где можно выбрать формат CSV, JSON или Markdown. +- Если данные нужны в Excel с отдельным листом для каждой таблицы, используйте [PDF в Excel](./pdf-to-excel). + +## Связанные инструменты + +- [PDF в Excel](./pdf-to-excel) +- [Извлечение таблиц из PDF](./extract-tables) +- [PDF в текст](./pdf-to-text) diff --git a/docs/ru/tools/pdf-to-excel.md b/docs/ru/tools/pdf-to-excel.md new file mode 100644 index 00000000..90b82082 --- /dev/null +++ b/docs/ru/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF в Excel +description: Извлекайте таблицы из PDF-документов в электронную таблицу Excel. Каждая таблица попадает на отдельный лист с указанием страницы. +--- + +# PDF в Excel + +Извлекает таблицы из PDF и сохраняет их в электронную таблицу Excel (`.xlsx`). Каждая найденная таблица размещается на отдельном листе с номером таблицы и исходной страницей в названии. Для поиска таблиц используется PyMuPDF, для создания файла Excel библиотека SheetJS. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Нажмите **Конвертировать в Excel**, чтобы начать извлечение таблиц. +3. Инструмент просматривает каждую страницу в поисках таблиц и собирает книгу Excel. +4. Скачивается файл `.xlsx`, где каждой таблице соответствует свой лист. + +## Параметры + +Настраиваемых параметров нет. Все найденные таблицы извлекаются автоматически. + +## Формат результата + +- Один файл `filename.xlsx`. +- **Одна таблица**: один лист с названием "Table". +- **Несколько таблиц**: листы с названиями "Table 1 (Page 3)", "Table 2 (Page 5)" и так далее. Названия листов обрезаются до 31 символа (ограничение Excel). + +## Сценарии использования + +- Преобразование финансовых отчётов из PDF в редактируемые таблицы для дальнейшего анализа. +- Извлечение таблиц складских остатков и заказов из PDF поставщиков. +- Перенос структурированных данных из PDF-форм и каталогов в Excel для сортировки и фильтрации. +- Архивирование табличных данных из PDF в формате, с которым могут работать коллеги без технической подготовки. + +## Советы + +- Если инструмент сообщает "Таблицы не найдены", скорее всего, в PDF свободная вёрстка текста, а не структурированные таблицы. Попробуйте [PDF в текст](./pdf-to-text), чтобы получить исходное содержимое. +- Для более простого плоского формата используйте [PDF в CSV](./pdf-to-csv). Для скачивания отдельных таблиц в разных форматах используйте [Извлечение таблиц из PDF](./extract-tables). +- По названиям листов можно понять, с какой страницы взята каждая таблица. + +## Связанные инструменты + +- [PDF в CSV](./pdf-to-csv) +- [Извлечение таблиц из PDF](./extract-tables) +- [PDF в текст](./pdf-to-text) diff --git a/docs/ru/tools/pdf-to-greyscale.md b/docs/ru/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..0e81fa72 --- /dev/null +++ b/docs/ru/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF в оттенки серого +description: Преобразуйте цветной PDF в версию в градациях серого (чёрно-белую). Создаёт новый PDF, в котором со всех страниц убран цвет. +--- + +# PDF в оттенки серого + +Преобразует цветной PDF в версию в градациях серого. Каждая страница рендерится, обесцвечивается и встраивается как изображение JPEG в новый PDF. Размеры страниц остаются прежними. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Нажмите **Конвертировать в оттенки серого**, чтобы обработать файл. +3. Скачивается новый `greyscale.pdf`, в котором все страницы стали чёрно-белыми. + +Внутри каждая страница рендерится в масштабе 2x, данные пикселей проходят через фильтр градаций серого, затем кодируются в JPEG с качеством 90% и помещаются в новый PDF-документ. + +## Параметры + +Настраиваемых параметров нет. Преобразование использует стандартную формулу яркости, а качество JPEG зафиксировано на 90%. + +## Формат результата + +- Один файл `greyscale.pdf`, в котором все страницы представлены изображениями JPEG в градациях серого. + +## Сценарии использования + +- Подготовка документов к чёрно-белой печати, чтобы сэкономить на цветных чернилах. +- Соблюдение требований к подаче юридических и государственных документов, где нужны градации серого. +- Уменьшение размера PDF с большим количеством цвета (изображения JPEG в градациях серого меньше цветных). +- Единый визуальный стиль для документов, где смешаны цветные и чёрно-белые страницы. + +## Советы + +- Поскольку каждая страница растеризуется и встраивается как JPEG, результат состоит из изображений. Текст исходного PDF перестанет выделяться и находиться поиском. Если после этого нужен текстовый слой, пропустите результат через инструмент OCR. +- Для более тонкой настройки цвета (яркость, контраст, насыщенность) используйте инструмент "Настройка цвета" или узел Greyscale в [Конструктор PDF-процессов](./pdf-workflow). + +## Связанные инструменты + +- [PDF в JPG](./pdf-to-jpg) +- [PDF в PNG](./pdf-to-png) +- [Конструктор PDF-процессов](./pdf-workflow) diff --git a/docs/ru/tools/pdf-to-jpg.md b/docs/ru/tools/pdf-to-jpg.md new file mode 100644 index 00000000..d5b69fdf --- /dev/null +++ b/docs/ru/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF в JPG +description: Конвертируйте страницы PDF в изображения JPG с настройкой качества. Одностраничные PDF скачиваются сразу, многостраничные экспортируются в ZIP. +--- + +# PDF в JPG + +Преобразует каждую страницу PDF в изображение JPG. Одностраничные документы скачиваются как отдельный файл `.jpg`. Многостраничные PDF дают ZIP-архив с одним JPG на страницу. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. Инструмент покажет имя файла, размер и число страниц. +2. Ползунком **Качество изображения** настройте степень сжатия JPG. +3. Нажмите **Конвертировать**, чтобы начать обработку. +4. Результат скачается автоматически: один JPG для одностраничного PDF или ZIP-файл для многостраничного. + +## Параметры + +- **Качество изображения**: ползунок от 0% до 100% (по умолчанию 90%). Большие значения дают более чёткие изображения и большие файлы. Меньшие значения сжимают сильнее. + +Внутри страницы рендерятся в масштабе 2x, поэтому разрешение результата вдвое больше размеров страницы PDF. Стандартная страница формата Letter даёт изображение примерно 1 224 x 1 584 пикселей. + +## Формат результата + +- **Одна страница**: `filename.jpg` +- **Несколько страниц**: `filename_jpgs.zip` с файлами `page_1.jpg`, `page_2.jpg` и так далее. + +## Сценарии использования + +- Создание миниатюр для системы управления документами. +- Отправка страницы отчёта в чат или письмо, где PDF не поддерживается. +- Получение изображений из PDF-схем и иллюстраций. +- Архивирование отсканированных документов в виде отдельных изображений. + +## Советы + +- Для вывода без потерь используйте [PDF в PNG](./pdf-to-png). +- Качество 80-90% даёт хороший баланс между размером файла и качеством изображения. +- Если для каждой страницы нужен определённый формат, посмотрите [Конструктор PDF-процессов](./pdf-workflow) с узлом вывода «PDF в изображения». + +## Связанные инструменты + +- [PDF в PNG](./pdf-to-png) +- [PDF в WebP](./pdf-to-webp) +- [PDF в BMP](./pdf-to-bmp) +- [PDF в TIFF](./pdf-to-tiff) diff --git a/docs/ru/tools/pdf-to-json.md b/docs/ru/tools/pdf-to-json.md new file mode 100644 index 00000000..bd4f25d0 --- /dev/null +++ b/docs/ru/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF в JSON +description: Конвертируйте PDF-файлы в структурированный JSON с помощью CPDF. Экспортирует внутреннюю структуру PDF как машиночитаемые данные JSON. +--- + +# PDF в JSON + +Преобразует один или несколько PDF-файлов в формат JSON. Инструмент использует CPDF (Coherent PDF), чтобы сериализовать внутреннюю структуру каждого PDF в машиночитаемое представление JSON. Результат всегда выдаётся в виде ZIP-архива. + +## Как это работает + +1. Выберите один или несколько PDF-файлов через окно выбора файлов. +2. Нажмите **Конвертировать в JSON**, чтобы начать обработку. Конвертация выполняется в фоновом веб-воркере. +3. Скачивается ZIP-архив с одним файлом JSON на каждый исходный PDF. + +Строка состояния показывает ход конвертации и создания ZIP. + +## Параметры + +Настраиваемых параметров нет. Каждый PDF преобразуется в полное представление JSON. + +## Формат результата + +- Файл `pdfs-to-json.zip` с файлом `filename.json` для каждого исходного PDF. + +JSON отражает внутреннюю структуру объектов PDF, включая деревья страниц, ссылки на шрифты, метаданные и потоки содержимого. + +## Сценарии использования + +- Изучение внутренней структуры PDF для отладки или проверки. +- Программное извлечение структурированных метаданных и свойств страниц. +- Передача данных о структуре PDF в собственные конвейеры обработки. +- Аудит PDF-документов на соответствие требованиям через анализ деревьев объектов. + +## Советы + +- Инструмент выводит необработанную структуру объектов PDF, а не извлечённый текст. Если нужен текст страниц в JSON, используйте [Подготовка PDF для ИИ](./prepare-pdf-for-ai). +- Для простого извлечения текста удобнее [PDF в текст](./pdf-to-text). +- Большие PDF со сложной структурой дают очень большие файлы JSON. + +## Связанные инструменты + +- [PDF в текст](./pdf-to-text) +- [Подготовка PDF для ИИ](./prepare-pdf-for-ai) +- [Извлечение таблиц из PDF](./extract-tables) diff --git a/docs/ru/tools/pdf-to-markdown.md b/docs/ru/tools/pdf-to-markdown.md new file mode 100644 index 00000000..228cfd09 --- /dev/null +++ b/docs/ru/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF в Markdown +description: Конвертируйте PDF-документы в формат Markdown с возможным извлечением изображений. Поддерживает пакетную конвертацию нескольких файлов. +--- + +# PDF в Markdown + +Преобразует PDF-файлы в формат Markdown (`.md`), сохраняя заголовки, абзацы, списки и базовое форматирование. При желании извлекает и включает встроенные изображения. Поддерживает одиночную и пакетную конвертацию. Работает на PyMuPDF. + +## Как это работает + +1. Загрузите один или несколько PDF, нажав на область загрузки или перетащив файлы. +2. При желании включите **Включить изображения как base64**, чтобы встроить извлечённые изображения в Markdown. +3. Нажмите **Конвертировать в Markdown**, чтобы начать обработку. +4. Один файл скачивается как `filename.md`. Несколько файлов дают `markdown-files.zip`. + +## Параметры + +- **Включить изображения как base64**: если включено, встроенные изображения из PDF извлекаются и подключаются в Markdown. Если выключено, конвертируется только текст. + +## Формат результата + +- **Один файл**: `filename.md` +- **Несколько файлов**: `markdown-files.zip` с одним `.md` на каждый исходный PDF. + +## Сценарии использования + +- Преобразование PDF-документации в Markdown для генераторов статических сайтов, таких как VitePress, Hugo или Jekyll. +- Превращение научных статей из PDF в редактируемый Markdown для приложений заметок вроде Obsidian. +- Перенос старых баз знаний из PDF в текстовый формат, удобный для Git. +- Извлечение структурированного содержимого из PDF-книг для переверстки. + +## Советы + +- Параметр «Включить изображения как base64» полезен, когда в PDF есть схемы и рисунки, важные для содержания. Для текстовых документов отключите его, чтобы результат оставался чистым. +- Сложная вёрстка с боковыми колонками, сносками или многоколоночным текстом может дать неидеальный Markdown. Проверьте и поправьте результат при необходимости. +- Для чистого текста без форматирования используйте [PDF в текст](./pdf-to-text). + +## Связанные инструменты + +- [PDF в текст](./pdf-to-text) +- [PDF в Word](./pdf-to-word) +- [Подготовка PDF для ИИ](./prepare-pdf-for-ai) diff --git a/docs/ru/tools/pdf-to-pdfa.md b/docs/ru/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..7e5a3fac --- /dev/null +++ b/docs/ru/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF в PDF/A +description: Преобразуйте обычные PDF в формат PDF/A для долгосрочного архивирования. Поддерживает уровни соответствия PDF/A-1b, PDF/A-2b и PDF/A-3b. +--- + +# PDF в PDF/A + +PDF/A - стандартизированное ISO подмножество PDF, созданное для долговременного хранения цифровых документов. Инструмент преобразует обычные PDF в документы, соответствующие PDF/A, с помощью Ghostscript, который работает прямо в вашем браузере. + +## Как это работает + +1. Загрузите один или несколько PDF-файлов. +2. Выберите **Версия PDF/A** в выпадающем списке. +3. При необходимости включите **Предварительно свести PDF** для сложных файлов, которые не конвертируются обычным способом. +4. Нажмите **Конвертировать в PDF/A**. Несколько файлов дают ZIP-архив. + +## Версии PDF/A + +| Версия | Ограничения | Лучше всего подходит для | +| ------------ | --------------------------------------------- | --------------------------------------------------------- | +| **PDF/A-1b** | Самая строгая. Без прозрачности и слоёв. | Максимальная совместимость со старыми архивными системами | +| **PDF/A-2b** | Допускает прозрачность и JPEG2000. | Универсальное архивирование (рекомендуется) | +| **PDF/A-3b** | Допускает встроенные вложения любого формата. | Архивирование документов с исходными файлами данных | + +PDF/A-2b выбран по умолчанию и подходит для подавляющего большинства задач архивирования. + +## Параметр Pre-flatten + +Некоторые PDF содержат особенности, мешающие корректному преобразованию в PDF/A: необычные кодировки шрифтов, сложные стеки прозрачности или повреждённую внутреннюю структуру. Параметр **Предварительно свести PDF** растеризует PDF с разрешением 300 DPI перед конвертацией. Это гарантирует соответствие стандарту, но делает текст невыделяемым. Используйте его как запасной вариант, если обычная конвертация завершается ошибками. + +Для Pre-flatten нужен движок PyMuPDF WASM. + +## Сценарии использования + +- Выполнение требований государственных и юридических архивов (во многих юрисдикциях PDF/A обязателен для судебных документов) +- Подача документов в институциональные репозитории и электронные библиотеки +- Сохранение деловых документов, когда исходной программы через десять лет может не существовать +- Подготовка счетов для стандартов электронного инвойсинга, требующих PDF/A-3b с XML-вложениями + +## Советы + +- Сначала попробуйте конвертацию без Pre-flatten. Включайте его, только если получили ошибку. +- PDF/A встраивает все шрифты, поэтому итоговые файлы часто больше исходных. +- Если в вашем процессе нужно строгое соответствие, проверьте результат в специальном валидаторе PDF/A. + +## Связанные инструменты + +- [Сжатие PDF](./compress-pdf): уменьшите размер файла после конвертации +- [Сведение документа](./flatten-pdf): сведите формы перед преобразованием в PDF/A +- [Удаление метаданных](./remove-metadata): удалите метаданные перед архивированием diff --git a/docs/ru/tools/pdf-to-png.md b/docs/ru/tools/pdf-to-png.md new file mode 100644 index 00000000..9d8b4e7c --- /dev/null +++ b/docs/ru/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF в PNG +description: Конвертируйте страницы PDF в изображения PNG без потерь с настройкой масштаба. Подходит для качественных скриншотов и прозрачных фонов. +--- + +# PDF в PNG + +Преобразует каждую страницу PDF в изображение PNG. PNG использует сжатие без потерь, поэтому результат сохраняет все детали исходной страницы. Одностраничные PDF скачиваются как файл `.png`, многостраничные дают ZIP. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Ползунком **Масштаб изображения** задайте разрешение результата. +3. Нажмите **Конвертировать**, чтобы начать обработку. +4. Автоматически скачается один PNG или ZIP-архив. + +## Параметры + +- **Масштаб изображения**: от 1.0x до 3.0x (по умолчанию 2.0x). При 2.0x стандартная страница формата Letter рендерится примерно в 1 224 x 1 584 пикселей. Большие значения дают более крупные и чёткие изображения ценой размера файла и времени обработки. + +## Формат результата + +- **Одна страница**: `filename.png` +- **Несколько страниц**: `filename_pngs.zip` с файлами `page_1.png`, `page_2.png` и так далее. + +## Сценарии использования + +- Получение точных скриншотов страниц PDF для презентаций. +- Извлечение графиков и схем, которым нужны чёткие края без артефактов сжатия. +- Подготовка ресурсов для веб-дизайна из PDF-макетов. +- Создание изображений страниц без потерь для предварительной обработки перед OCR. + +## Советы + +- Файлы PNG заметно больше JPG. Если размер важнее идеального качества, используйте [PDF в JPG](./pdf-to-jpg) или [PDF в WebP](./pdf-to-webp). +- При масштабе 1.0x результат соответствует исходному разрешению PDF. Для экспорта в качестве, пригодном для печати, поставьте 3.0x. + +## Связанные инструменты + +- [PDF в JPG](./pdf-to-jpg) +- [PDF в WebP](./pdf-to-webp) +- [PDF в SVG](./pdf-to-svg) diff --git a/docs/ru/tools/pdf-to-svg.md b/docs/ru/tools/pdf-to-svg.md new file mode 100644 index 00000000..992f0f5d --- /dev/null +++ b/docs/ru/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF в SVG +description: Конвертируйте страницы PDF в масштабируемую векторную графику SVG. Сохраняет текст и фигуры как векторные контуры для неограниченного масштабирования. +--- + +# PDF в SVG + +Преобразует каждую страницу PDF в файл SVG (Scalable Vector Graphics). В отличие от растровых форматов, SVG сохраняет векторные контуры, текст и фигуры, поэтому результат масштабируется до любого размера без пикселизации. Работает на PyMuPDF. + +## Как это работает + +1. Загрузите один или несколько PDF, нажав на область загрузки или перетащив файлы. Можно добавить несколько файлов и управлять ими по отдельности. +2. Нажмите **Конвертировать в SVG**, чтобы обработать все загруженные файлы. +3. Конвертация одного файла с одной страницей скачивается как отдельный `.svg`. Во всех остальных случаях скачивается ZIP-архив. + +## Параметры + +Настраиваемых параметров нет. Каждая страница преобразуется в SVG встроенным векторным экспортом PyMuPDF. + +## Формат результата + +- **Один файл, одна страница**: `filename.svg` +- **Один файл, несколько страниц**: `filename_svg.zip` с файлами `page_1.svg`, `page_2.svg` и так далее. +- **Несколько файлов**: `pdf_to_svg.zip` с файлами, разложенными по именам исходных документов. + +## Сценарии использования + +- Извлечение векторных схем, графиков и иллюстраций из PDF-отчётов для веб-страниц. +- Редактирование содержимого страниц PDF в векторном редакторе, таком как Inkscape или Illustrator. +- Встраивание масштабируемых превью страниц в адаптивные веб-приложения. +- Извлечение логотипов и графики из PDF-брошюр с сохранением чётких краёв. + +## Советы + +- SVG лучше всего работает с PDF, содержащими векторное содержимое. Отсканированные документы и PDF с множеством изображений дают крупные файлы SVG со встроенными растровыми данными. +- Для растрового результата из PDF с большим количеством изображений используйте [PDF в PNG](./pdf-to-png) или [PDF в JPG](./pdf-to-jpg). +- Инструмент поддерживает пакетную конвертацию: загрузите несколько PDF сразу, чтобы преобразовать их за один запуск. + +## Связанные инструменты + +- [PDF в PNG](./pdf-to-png) +- [PDF в JPG](./pdf-to-jpg) +- [PDF в Markdown](./pdf-to-markdown) diff --git a/docs/ru/tools/pdf-to-text.md b/docs/ru/tools/pdf-to-text.md new file mode 100644 index 00000000..dcc9a6f3 --- /dev/null +++ b/docs/ru/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF в текст +description: Извлекайте простой текст из PDF-файлов. Поддерживает пакетное извлечение из нескольких PDF с результатом в файлах TXT. +--- + +# PDF в текст + +Извлекает весь текст из PDF-файлов и сохраняет его в обычные файлы `.txt`. Поддерживает пакетную обработку: загрузите несколько PDF и получите текст каждого за одну операцию. Работает на PyMuPDF. + +## Как это работает + +1. Загрузите один или несколько PDF, нажав на область загрузки или перетащив файлы. Управляйте списком кнопками «Добавить еще файлы» и «Очистить файлы». +2. Нажмите **Извлечь текст**, чтобы начать обработку. +3. Один файл скачивается как `filename.txt`. Несколько файлов дают архив `pdf-to-text.zip`. + +## Параметры + +Настраиваемых параметров нет. Весь текст извлекается со всех страниц в порядке чтения. + +## Формат результата + +- **Один файл**: `filename.txt` +- **Несколько файлов**: `pdf-to-text.zip` с одним `.txt` на каждый исходный PDF. + +## Сценарии использования + +- Извлечение основного текста из PDF-отчётов для индексации полнотекстового поиска. +- Преобразование PDF-книг и статей в простой текст для чтения на устройствах с электронными чернилами. +- Получение текста из договоров и юридических документов для анализа по ключевым словам. +- Удаление форматирования из PDF, чтобы получить чистый текст для скриптов обработки данных. +- Подготовка текстового корпуса из PDF-архивов для обработки естественного языка. + +## Советы + +- Отсканированные PDF (только изображения) дадут пустые текстовые файлы, потому что текстового слоя для извлечения нет. Сначала пропустите отсканированные документы через OCR. +- Результат сохраняет порядок чтения, определённый PyMuPDF: как правило, слева направо и сверху вниз. При многоколоночной вёрстке строки могут перемешиваться. +- Для структурированного результата с заголовками и форматированием попробуйте [PDF в Markdown](./pdf-to-markdown). Для структурированного JSON, готового для ИИ, используйте [Подготовка PDF для ИИ](./prepare-pdf-for-ai). + +## Связанные инструменты + +- [PDF в Markdown](./pdf-to-markdown) +- [Подготовка PDF для ИИ](./prepare-pdf-for-ai) +- [PDF в Word](./pdf-to-word) diff --git a/docs/ru/tools/pdf-to-tiff.md b/docs/ru/tools/pdf-to-tiff.md new file mode 100644 index 00000000..097d40ed --- /dev/null +++ b/docs/ru/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF в TIFF +description: Конвертируйте страницы PDF в изображения TIFF, которые широко используются в печати, факсах и архивах. При ошибке кодирования сохраняет PNG. +--- + +# PDF в TIFF + +Преобразует каждую страницу PDF в изображение TIFF. TIFF - стандартный формат для полиграфии, факсимильных систем и архивного хранения документов. Для кодирования TIFF инструмент использует сжатие PackBits, а при ошибке кодирования страницы сохраняет её как PNG. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Нажмите **Конвертировать**, чтобы обработать файл. +3. Автоматически скачается один файл TIFF или ZIP-архив. + +## Параметры + +Настраиваемых параметров нет. Страницы рендерятся в фиксированном масштабе 2x. + +## Формат результата + +- **Одна страница**: `filename.tiff` +- **Несколько страниц**: `filename_tiffs.zip` с файлами `page_1.tiff`, `page_2.tiff` и так далее. + +Если кодирование TIFF для конкретной страницы не удалось (из-за проблем со сжатием), эта страница сохраняется как файл `.png`. В таком случае в ZIP будет смесь файлов TIFF и PNG. + +## Сценарии использования + +- Подача документов в государственные органы и юридические системы, требующие формат TIFF. +- Подготовка страниц для отправки по факсу через цифровые факс-сервисы. +- Архивирование отсканированных документов в широко поддерживаемом формате без потерь. +- Передача страниц в корпоративные системы управления документами. + +## Советы + +- Файлы TIFF большие. Если качество без потерь нужно только для веба или экрана, лучше подойдёт [PDF в PNG](./pdf-to-png). +- Проверьте содержимое ZIP, если для некоторых страниц понадобился запасной PNG: возможно, их стоит сконвертировать отдельно. + +## Связанные инструменты + +- [PDF в PNG](./pdf-to-png) +- [PDF в BMP](./pdf-to-bmp) +- [PDF в JPG](./pdf-to-jpg) diff --git a/docs/ru/tools/pdf-to-webp.md b/docs/ru/tools/pdf-to-webp.md new file mode 100644 index 00000000..085c3c2c --- /dev/null +++ b/docs/ru/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF в WebP +description: Конвертируйте страницы PDF в изображения WebP с настройкой качества. Файлы меньше, чем у JPG, при сопоставимом визуальном качестве. +--- + +# PDF в WebP + +Преобразует каждую страницу PDF в изображение WebP. WebP обычно даёт файлы на 25-35% меньше, чем JPG, при том же воспринимаемом качестве, что делает его хорошим выбором для веба. + +## Как это работает + +1. Загрузите PDF, нажав на область загрузки или перетащив файл. +2. Настройте ползунок **Качество изображения**. +3. Нажмите **Конвертировать**, чтобы обработать файл. +4. Автоматически скачается один файл `.webp` или ZIP-архив. + +## Параметры + +- **Качество изображения**: ползунок от 0% до 100% (по умолчанию 85%). Управляет уровнем сжатия с потерями. Большие значения сохраняют больше деталей. + +Внутри страницы рендерятся в масштабе 2x, поэтому размер изображений примерно вдвое больше исходных размеров PDF. + +## Формат результата + +- **Одна страница**: `filename.webp` +- **Несколько страниц**: `filename_webps.zip` с файлами `page_1.webp`, `page_2.webp` и так далее. + +## Сценарии использования + +- Подготовка превью страниц для сайтов, где важен трафик. +- Создание лёгких изображений листовок и брошюр для соцсетей. +- Пакетная конвертация многостраничных документов в набор изображений, оптимизированных для веба. + +## Советы + +- WebP поддерживается во всех современных браузерах. Для совместимости со старыми используйте [PDF в JPG](./pdf-to-jpg). +- Качество 80-85% обычно неотличимо от оригинала на экране, а размер файлов остаётся небольшим. + +## Связанные инструменты + +- [PDF в JPG](./pdf-to-jpg) +- [PDF в PNG](./pdf-to-png) +- [PDF в BMP](./pdf-to-bmp) diff --git a/docs/ru/tools/pdf-to-word.md b/docs/ru/tools/pdf-to-word.md new file mode 100644 index 00000000..64d74088 --- /dev/null +++ b/docs/ru/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF в Word +description: Конвертируйте PDF-файлы в редактируемые документы Word (DOCX). Поддерживает пакетную конвертацию нескольких PDF сразу. +--- + +# PDF в Word + +Преобразует PDF-файлы в редактируемые документы Word (`.docx`). Инструмент использует PyMuPDF, чтобы восстановить содержимое документа, сохраняя текст, базовое форматирование и разметку. Поддерживает одиночную и пакетную конвертацию. + +## Как это работает + +1. Загрузите один или несколько PDF, нажав на область загрузки или перетащив файлы. Можно добавить ещё файлы или удалить отдельные из списка. +2. Нажмите **Конвертировать в DOCX**, чтобы начать обработку. +3. Один файл скачивается как `filename.docx`. Несколько файлов упаковываются в `converted-documents.zip`. + +## Параметры + +Настраиваемых параметров нет. Каждый PDF преобразуется в DOCX встроенным движком конвертации PyMuPDF. + +## Формат результата + +- **Один файл**: `filename.docx` +- **Несколько файлов**: `converted-documents.zip` с одним `.docx` на каждый исходный PDF. + +## Сценарии использования + +- Редактирование текста в полученном PDF, который нужно изменить. +- Преобразование архивных PDF-отчётов в формат, который коллеги могут править в Microsoft Word или Google Docs. +- Перенос содержимого PDF-договоров и предложений в Word для правок. +- Перенос старой PDF-документации в редактируемый формат. + +## Советы + +- Сложная вёрстка с многоколоночным текстом, встроенными формами или большим количеством графики может конвертироваться неидеально. Проверьте результат и поправьте форматирование в текстовом редакторе. +- Отсканированные PDF (только изображения) дадут пустые или почти пустые файлы DOCX. Сначала пропустите их через OCR, чтобы добавить текстовый слой. +- Пакетный режим удобен для конвертации целых папок с PDF: загрузите всё сразу. + +## Связанные инструменты + +- [PDF в текст](./pdf-to-text) +- [PDF в Markdown](./pdf-to-markdown) +- [Конструктор PDF-процессов](./pdf-workflow) diff --git a/docs/ru/tools/pdf-to-zip.md b/docs/ru/tools/pdf-to-zip.md new file mode 100644 index 00000000..8ff13e0a --- /dev/null +++ b/docs/ru/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF в ZIP +description: Упакуйте несколько PDF-файлов в один ZIP-архив для удобной отправки и хранения. +--- + +# PDF в ZIP + +Соберите несколько PDF-файлов в один ZIP-архив. Это простой инструмент для упаковки: сами PDF не конвертируются, не сжимаются и не изменяются. + +## Как это работает + +1. Загрузите несколько PDF-файлов в область загрузки. +2. Проверьте список файлов. Удалите те, которые не нужны. +3. Нажмите кнопку обработки. +4. Сразу скачается ZIP-архив со всеми загруженными PDF. + +## Возможности + +- Принимает любое количество PDF-файлов +- Удаление отдельных файлов до создания архива +- Сохраняет исходные имена файлов внутри ZIP +- Содержимое PDF не изменяется: файлы упаковываются как есть +- Показывает имя и размер каждого загруженного PDF + +## Сценарии использования + +- Упаковка набора счетов или чеков для отправки по почте +- Упаковка результатов проекта (нескольких PDF-отчётов) для передачи +- Создание одной ссылки для скачивания набора форм или шаблонов +- Архивирование пакета документов в один сжатый файл + +## Советы + +- В ZIP используются исходные имена PDF-файлов. Если у файлов одинаковые имена, переименуйте их перед загрузкой, чтобы избежать конфликтов. +- Инструмент не сжимает сами PDF. Чтобы уменьшить размер, сначала пропустите их через "Сжатие PDF", затем упакуйте этим инструментом. + +## Связанные инструменты + +- [Объединение PDF](./merge-pdf) +- [Разделение PDF](./split-pdf) +- [Сжатие PDF](./compress-pdf) diff --git a/docs/ru/tools/pdf-workflow.md b/docs/ru/tools/pdf-workflow.md new file mode 100644 index 00000000..64a838f0 --- /dev/null +++ b/docs/ru/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Конструктор PDF-процессов +description: 'Визуально создавайте собственные конвейеры обработки PDF, соединяя узлы на холсте. Объединяйте в цепочку операции: объединение, сжатие, водяные знаки и экспорт.' +--- + +# Конструктор PDF-процессов + +Конструктор процессов позволяет объединить несколько операций с PDF в один автоматизированный конвейер. Вместо запуска инструментов по одному вы собираете визуальный граф из узлов (ввод, обработка, вывод) и выполняете всё одним нажатием. Ваши файлы не покидают браузер. + +## Как это работает + +Интерфейс состоит из трёх панелей: **набор узлов** слева, **холст** в центре и **панель настроек** справа, которая появляется при выборе узла. + +1. **Добавляйте узлы**, нажимая на них в левой боковой панели или перетаскивая прямо на холст. Для фильтрации по названию используйте строку поиска вверху набора узлов. +2. **Соединяйте узлы**, перетаскивая от выходного разъёма (внизу узла) к входному разъёму (вверху другого узла). Соединения идут сверху вниз. +3. **Настраивайте параметры**: нажмите на узел, чтобы открыть его панель настроек справа. У каждого типа узла свои параметры (диапазоны страниц, ползунки качества, пароли и так далее). +4. **Запустите процесс** кнопкой **Запустить** на панели инструментов. Движок выполняет узлы в топологическом порядке, обрабатывая каждый по очереди. Строка состояния внизу показывает ход выполнения. +5. **Скачайте результат**: конечный узел Скачать сохраняет итоговый PDF (или ZIP, если создано несколько файлов). + +## Категории узлов + +Узлы разделены на шесть категорий, каждая обозначена своим цветом на холсте: + +- **Ввод** (синий): PDF-вход, Ввод изображений, Word/Excel/PowerPoint в PDF и более 15 других конвертеров форматов, которые подают файлы в конвейер. +- **Редактирование и добавление примечаний** (индиго): Обрезка PDF, PDF в оттенки серого, Инверсия цвета, Добавление водяных знаков, Нумерация страниц, Колонтитулы, Эффект сканера, Настройка цвета, Цвет фона, Удаление пустых страниц, Удаление аннотаций. +- **Организация и управление** (фиолетовый): Объединение PDF, Разделение PDF, Извлечение страниц, Поворот PDF, Удаление страниц, Обращение порядка страниц, Добавление пустой страницы, Разделение страниц, N-Up PDF, Редактор размера страниц, Объединить на одну страницу, PDF-буклет, Постеризация документа, Редактирование метаданных, Оглавление, Распознавание текста в PDF. +- **Оптимизация и восстановление** (янтарный): Сжатие PDF, Растеризация документа, Линеаризация документа, Выпрямление PDF, PDF в PDF/A, Шрифты в кривые, Восстановление документа. +- **Защита PDF** (розовый): Зашифровать, Расшифровать, Санирование документа, Сведение документа, Цифровая подпись, Вымарать. +- **Вывод** (бирюзовый): Скачать (автоматически определяет один PDF или ZIP), PDF в изображения, PDF в текст, PDF в DOCX, PDF в XLSX, PDF в CSV, PDF в SVG, PDF в Markdown, Извлечение изображений. + +## Сохранение и загрузка процессов + +На панели инструментов доступны четыре варианта сохранения: + +- **Сохранить**: сохраняет текущий процесс как именованный шаблон в локальном хранилище браузера. Можно сохранить несколько шаблонов. +- **Загрузить**: открывает окно со списком всех сохранённых шаблонов. Нажмите «Загрузить», чтобы восстановить шаблон, или удалите ненужные. +- **Экспорт**: скачивает процесс в виде файла `.json`, которым можно поделиться или сохранить резервную копию. +- **Импорт**: загружает файл процесса `.json` с диска, восстанавливая все узлы, их положение и соединения. + +Шаблоны сохраняются между сеансами в локальном хранилище. Экспортированные файлы JSON переносимы между браузерами и компьютерами. + +## Модель выполнения + +Движок строит граф зависимостей по вашим соединениям и выполняет узлы в топологическом порядке. Если какой-либо узел завершается ошибкой, выполнение останавливается, а узел с ошибкой отмечается красным. Несколько правил, которые нужно учитывать: + +- В каждом процессе должен быть минимум один узел **Ввод** и один узел **Вывод**. +- Движок обнаруживает циклические зависимости и блокирует выполнение с ошибкой. +- Узел **Зашифровать** должен быть последним шагом обработки перед узлом вывода. Если поставить его раньше, появится предупреждение при проверке, потому что следующие узлы не могут работать с зашифрованными данными. +- Для PDF, защищённых паролем, во время выполнения запрашивается пароль. +- Поддерживаются входы с несколькими PDF: узел Объединение PDF может их объединить, а узлы пакетной обработки обработают каждый PDF отдельно. + +## Типы разъёмов + +Соединения используют типизированные разъёмы, чтобы не допустить неверных связей: + +- **PDF** (индиго): один PDF-документ. +- **MultiPDF** (янтарный): несколько PDF-документов, собранных вместе. +- **Image** (зелёный): изображение (blob). + +## Параметры + +У каждого узла есть собственная конфигурация, доступная через правую панель настроек. Типичные примеры: + +- **Диапазоны страниц** в узлах Разделение PDF, Извлечение страниц, Удаление страниц +- **Ползунки качества** в узлах вывода с преобразованием в изображения +- **Поля пароля** в узлах Зашифровать и Расшифровать +- **Текстовые поля** в узлах Добавление водяных знаков, Колонтитулы, Редактирование метаданных +- **Углы поворота** в узле Поворот PDF +- **Уровень сжатия** в узле Сжатие PDF +- **Выбор языка OCR** в узле Распознавание текста в PDF + +## Сценарии использования + +- **Конвейер обработки счетов**: PDF-вход -> Распознавание текста в PDF -> Извлечение таблиц из PDF -> Скачать в формате CSV. +- **Стандартизация отчётов**: Word в PDF -> Редактор размера страниц -> Нумерация страниц -> Добавление водяных знаков -> Сжатие PDF -> Скачать. +- **Подготовка к архивированию**: PDF-вход -> Восстановление документа -> Сведение документа -> Санирование документа -> PDF в PDF/A -> Скачать. +- **Пакетное извлечение изображений**: PDF-вход (несколько файлов) -> Извлечение изображений -> Скачать ZIP. +- **Буклеты, готовые к печати**: PDF-вход -> PDF-буклет -> Обрезка PDF -> Сжатие PDF -> Скачать. +- **Защищённая рассылка**: PDF-вход -> Вымарать -> Удаление аннотаций -> Зашифровать -> Скачать. + +## Советы + +- Клавиши **Delete** или **Backspace** удаляют выбранный узел с холста. +- Нажмите кнопку **X** в строке состояния узла, чтобы удалить его напрямую. +- Перемещайте холст, нажимая и перетаскивая пустое место. Во время перемещения курсор меняется на значок руки. +- На мобильных устройствах кнопкой **+** на панели инструментов можно показать или скрыть набор узлов. +- Если процесс создаёт несколько выходных файлов, узел Скачать автоматически упаковывает их в ZIP. +- Начните с простого: соберите и проверьте конвейер из двух узлов, прежде чем усложнять. + +## Связанные инструменты + +- [PDF в текст](./pdf-to-text) +- [PDF в Excel](./pdf-to-excel) +- [Извлечение изображений](./extract-images) +- [PDF в Markdown](./pdf-to-markdown) diff --git a/docs/ru/tools/png-to-pdf.md b/docs/ru/tools/png-to-pdf.md new file mode 100644 index 00000000..1cef0ea7 --- /dev/null +++ b/docs/ru/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG в PDF +description: Преобразуйте одно или несколько изображений PNG в PDF-документ с настройкой качества прямо в браузере. +--- + +# PNG в PDF + +Преобразуйте изображения PNG в PDF с сохранением полного разрешения. Каждый PNG становится отдельной страницей, размер которой совпадает с размером исходного изображения. Прозрачность обрабатывается автоматически. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :--------- | +| PNG | `.png` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы PNG. Можно выбрать сразу несколько. +2. Управляйте списком файлов: удаляйте лишние или добавляйте новые. +3. Выберите уровень **Качество PDF** в выпадающем списке. +4. Нажмите **Конвертировать в PDF**. Результат скачается как `from_jpgs.pdf`. + +Инструмент использует pdf-lib, чтобы встроить каждое изображение напрямую. Если PNG нельзя встроить как есть (например, из-за необычного цветового профиля), он перерисовывается через canvas и сохраняется как JPEG. + +## Параметры + +**Качество PDF** определяет сжатие, применяемое перед встраиванием: + +- **Высокое качество**: минимальное сжатие, самый большой размер файла. +- **Среднее качество** (по умолчанию): хороший баланс размера и чёткости. +- **Низкое качество**: максимальное сжатие, самый маленький результат. + +## Сценарии использования + +- Преобразование скриншотов в многостраничный PDF для отчётов об ошибках и документации +- Упаковка экспортированных макетов интерфейса в один файл для согласования +- Превращение экспорта диаграмм (draw.io, Excalidraw) в PDF, которым удобно делиться +- Сборка набора изображений графиков в отчёт + +## Советы + +- У PNG с прозрачностью в PDF будет белый фон. Если нужен другой фон, отредактируйте изображения заранее. +- Для скриншотов и схем с чёткими краями и текстом вариант «Высокое качество» позволяет избежать артефактов сжатия JPEG. При среднем или низком качестве изображение может внутри преобразоваться в JPEG. + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [JPG в PDF](./jpg-to-pdf) +- [SVG в PDF](./svg-to-pdf) diff --git a/docs/ru/tools/posterize-pdf.md b/docs/ru/tools/posterize-pdf.md new file mode 100644 index 00000000..06180c17 --- /dev/null +++ b/docs/ru/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Постеризация документа +description: Разделение страниц PDF на сетку из более мелких страниц для печати крупного формата на нескольких листах. +--- + +# Постеризация документа + +Разделите каждую страницу PDF на сетку из более мелких страниц. Этот инструмент нужен, чтобы напечатать одну страницу на нескольких листах бумаги, а затем склеить их в большой плакат или баннер. + +## Как это работает + +1. Загрузите PDF-файл. +2. Задайте количество **строк** и **столбцов**, определяющих сетку (например, 2 строки x 2 столбца делят каждую страницу на 4 части). +3. При желании укажите диапазон страниц, чтобы постеризировать только их. +4. На холсте предпросмотра поверх текущей страницы показана сетка, так что линии разреза видны заранее. +5. Переключайтесь между страницами, чтобы проверить сетку на разных страницах. +6. Нажмите кнопку обработки. Каждая ячейка сетки станет отдельной страницей итогового PDF. + +## Возможности + +- Настраиваемое число строк и столбцов для сетки любого размера +- Живой предпросмотр с сеткой, показывающей, где именно страницы будут разделены +- Фильтр по диапазону страниц, чтобы постеризировать только нужные +- Постраничная навигация в предпросмотре +- Кэширование снимков страниц для быстрой навигации +- Красные пунктирные линии сетки отчётливо обозначают границы разреза + +## Параметры + +| Параметр | Описание | +| -------------------- | ----------------------------------------------------- | +| **Строки** | Число горизонтальных делений (по умолчанию: 1) | +| **Столбцы** | Число вертикальных делений (по умолчанию: 1) | +| **Диапазон страниц** | Какие страницы постеризировать (пусто = все страницы) | + +## Сценарии использования + +- Печать PDF размером с плакат на стандартных листах A4 или Letter для сборки на стене +- Создание больших баннеров из одностраничного PDF-макета +- Разделение крупных технических чертежей на печатаемые фрагменты +- Печать в большом формате без доступа к широкоформатному принтеру + +## Советы + +- Сетка 2x2 превращает одну страницу в 4, а сетка 3x3 в 9. Выбирайте сетку исходя из того, насколько большим должен получиться собранный результат. +- Предпросмотр помогает убедиться, что важное содержимое не попадает на линию разреза. При необходимости измените число строк и столбцов. +- Для обратной операции (размещение нескольких страниц на одном листе) используйте [N-Up PDF](./n-up-pdf). + +## Связанные инструменты + +- [N-Up PDF](./n-up-pdf) +- [Разделение страниц](./divide-pages) +- [Разделение PDF](./split-pdf) diff --git a/docs/ru/tools/powerpoint-to-pdf.md b/docs/ru/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..8bd4a5f8 --- /dev/null +++ b/docs/ru/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint в PDF +description: Преобразуйте презентации PowerPoint (PPT, PPTX) и файлы ODP в PDF с сохранением оформления слайдов. +--- + +# PowerPoint в PDF + +Преобразуйте файлы презентаций в PDF. Каждый слайд становится страницей итогового документа, а текст, изображения и фигуры отображаются через LibreOffice, работающий прямо в браузере. Поддерживаются современный и устаревший форматы PowerPoint, а также формат OpenDocument Presentation. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :------------------------ | :--------- | +| PowerPoint (современный) | `.pptx` | +| PowerPoint (устаревший) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё файлы презентаций. +2. Просмотрите список файлов. Добавьте ещё или удалите лишние. +3. Нажмите **Преобразовать в PDF**. При первом использовании загружается движок LibreOffice, затем каждый файл преобразуется. +4. Один файл скачивается сразу как PDF. Несколько файлов упаковываются в `powerpoint-converted.zip`. + +## Параметры + +У этого инструмента нет дополнительных настроек. Слайды отображаются в исходных размерах. + +## Результат + +| Количество файлов | Результат | +| :---------------- | :----------------------------------------------------------------------- | +| 1 файл | Один PDF (исходное имя файла с расширением `.pdf`) | +| 2 и более | ZIP-архив (`powerpoint-converted.zip`) с отдельным PDF для каждого файла | + +## Сценарии использования + +- Преобразование презентации в PDF перед отправкой аудитории, у которой может не быть PowerPoint +- Создание печатной версии слайдов для конференции или семинара +- Архивирование презентаций в формате, который одинаково выглядит на любом устройстве +- Пакетное преобразование коллекции презентаций ODP из LibreOffice Impress в PDF +- Подготовка PDF-версии презентации для отправки по электронной почте + +## Советы + +- Анимация и переходы между слайдами в PDF не сохраняются. Каждый слайд фиксируется как статичная страница. +- Встроенные видео в результате не отображаются. При необходимости замените их снимком экрана или изображением-заглушкой. +- Заметки докладчика не попадают в PDF при экспорте по умолчанию. Если они нужны, сначала экспортируйте их из режима печати заметок в PowerPoint. +- Движок LibreOffice кэшируется после первой загрузки, поэтому вторая презентация в той же сессии преобразуется намного быстрее. + +## Связанные инструменты + +- [Word в PDF](./word-to-pdf) +- [Excel в PDF](./excel-to-pdf) +- [Изображения в PDF](./image-to-pdf) diff --git a/docs/ru/tools/prepare-pdf-for-ai.md b/docs/ru/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..21008ce2 --- /dev/null +++ b/docs/ru/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Подготовка PDF для ИИ +description: Извлечение содержимого PDF в структурированный JSON, оптимизированный для LLM и ИИ-конвейеров вроде LlamaIndex. Поддерживает пакетную обработку. +--- + +# Подготовка PDF для ИИ + +Извлекает содержимое PDF-файлов и структурирует его в JSON, оптимизированный для загрузки в большие языковые модели (LLM) и ИИ-фреймворки вроде LlamaIndex. Содержимое каждой страницы извлекается и организуется в структурированный формат, готовый для RAG-конвейеров, чат-ботов и систем семантического поиска. + +## Как это работает + +1. Загрузите один или несколько PDF, нажав на область загрузки или перетащив файлы. +2. Нажмите **Извлечь для ИИ**, чтобы начать обработку. +3. Один файл скачивается как `filename_llm.json`. Несколько файлов дают архив `pdf-for-ai.zip`. + +Инструмент использует интеграцию PyMuPDF с LlamaIndex, чтобы извлекать содержимое постранично вместе с метаданными. Результат можно напрямую загружать в ИИ-фреймворки. + +## Параметры + +У этого инструмента нет настраиваемых параметров. Все страницы извлекаются с полным текстом и метаданными. + +## Формат результата + +- **Один файл**: `filename_llm.json` +- **Несколько файлов**: `pdf-for-ai.zip` с одним `_llm.json` на каждый исходный PDF. + +JSON соответствует схеме документов LlamaIndex: текст каждой страницы и поля метаданных. + +## Сценарии использования + +- Подготовка PDF-документов для конвейеров RAG (генерация с дополнением выборкой). +- Создание базы знаний с поиском по архивам PDF для ИИ-чат-бота. +- Передача PDF-отчётов в процессы анализа на основе LLM. +- Предварительная обработка научных статей для семантического поиска и систем вопросов и ответов. +- Создание структурированных обучающих данных из коллекций PDF-документов. + +## Советы + +- Для извлечения простого текста без ИИ-форматирования используйте [PDF в текст](./pdf-to-text). +- Для вывода в Markdown с сохранением заголовков и структуры используйте [PDF в Markdown](./pdf-to-markdown). +- Для отсканированных PDF результат будет пустым или минимальным. Сначала пропустите их через распознавание текста, чтобы добавить текстовый слой. + +## Связанные инструменты + +- [PDF в текст](./pdf-to-text) +- [PDF в Markdown](./pdf-to-markdown) +- [PDF в JSON](./pdf-to-json) diff --git a/docs/ru/tools/protect-pdf.md b/docs/ru/tools/protect-pdf.md new file mode 100644 index 00000000..8ea0ab55 --- /dev/null +++ b/docs/ru/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Защита PDF +description: Защитите PDF-файлы паролем с 256-битным шифрованием AES. Задайте пароли пользователя и владельца с настраиваемыми ограничениями. +--- + +# Защита PDF + +Закройте PDF паролем, чтобы открыть его могли только нужные люди. BentoPDF использует 256-битное шифрование AES, тот же стандарт, что применяют банки и госструктуры, и выполняет его целиком в вашем браузере через QPDF. + +## Как это работает + +1. Загрузите PDF-файл. +2. Введите **Пароль пользователя** (обязательно). Этот пароль потребуется, чтобы открыть файл. +3. При желании введите **Пароль владельца**. Если он задан, на PDF накладываются ограничения: нельзя печатать, редактировать, копировать и аннотировать. +4. Нажмите **Шифрование документа**. +5. Скачайте зашифрованный файл. + +## Типы паролей + +### Пароль пользователя (обязательный) + +Пароль пользователя вводят получатели, чтобы открыть PDF. Без него документ полностью недоступен. У каждого зашифрованного PDF он должен быть. + +### Пароль владельца (необязательный) + +Пароль владельца определяет, что может делать авторизованный пользователь после открытия файла. Если вы задаёте отдельный пароль владельца, BentoPDF автоматически применяет самый строгий набор ограничений: + +- Изменение запрещено +- Извлечение и копирование запрещены +- Печать запрещена +- Аннотирование запрещено +- Заполнение форм запрещено +- Сборка документа запрещена + +Если оставить пароль владельца пустым, PDF будет зашифрован (для открытия по-прежнему нужен пароль пользователя), но после открытия никаких ограничений не будет. + +## Подробности шифрования + +- **Алгоритм**: AES-256 (256-битный Advanced Encryption Standard) +- **Длина ключа**: 256 бит +- **Стандарт**: шифрование PDF 2.0 (реализация QPDF) + +Подобрать ключ AES-256 перебором на современных технологиях вычислительно невозможно. Защищённость зашифрованного PDF целиком зависит от надёжности пароля. + +## Сценарии использования + +- Защита конфиденциальных финансовых отчётов перед отправкой по почте +- Защита юридических документов, передаваемых противной стороне +- Установка пароля на медицинские записи и персональные данные +- Распространение платного контента (электронные книги, отчёты) с контролем доступа +- Соблюдение политик защиты данных, требующих шифрования при хранении + +## Советы + +- Используйте надёжный уникальный пароль. Идеальна парольная фраза от 12 символов с разным регистром, цифрами и символами. +- Передавайте пароль отдельным каналом (звонок, SMS), а не в том же письме, что и PDF. +- Если нужно только ограничить действия (без печати и копирования), не требуя пароля для открытия, используйте инструмент «Изменение разрешений». + +## Связанные инструменты + +- [Разблокировка PDF](./unlock-pdf): снять шифрование, если вы знаете пароль +- [Изменение разрешений](./change-permissions): изменить отдельные ограничения использования +- [Снятие ограничений](./remove-restrictions): удалить из PDF всю защиту +- [Санирование документа](./sanitize-pdf): удалить скрытое содержимое перед шифрованием diff --git a/docs/ru/tools/psd-to-pdf.md b/docs/ru/tools/psd-to-pdf.md new file mode 100644 index 00000000..c1aadccf --- /dev/null +++ b/docs/ru/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD в PDF +description: Преобразуйте файлы Photoshop (PSD) в PDF прямо в браузере. Бесплатно, приватно, без программ Adobe. +--- + +# PSD в PDF + +Преобразуйте файлы Adobe Photoshop PSD в PDF-документы. PSD это родной формат Photoshop, и обычно для его открытия нужна дорогая программа Adobe. Этот инструмент отображает совмещённое (сведённое) изображение вашего PSD как страницу PDF в полном разрешении. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :-------------- | :--------- | :------------------------------------------- | +| Adobe Photoshop | `.psd` | Отображается сведённое составное изображение | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё PSD-файлы. Можно загружать несколько файлов. +2. Просмотрите список файлов. Удалите лишние значком корзины или добавьте новые кнопкой **Добавить еще файлы**. +3. Нажмите **Преобразовать в PDF**. Движок PyMuPDF читает PSD-файл и встраивает составное изображение в страницу PDF в исходном разрешении. +4. Один PSD даёт один PDF. Если загрузить несколько PSD-файлов, они объединяются в один многостраничный PDF с именем `psd_to_pdf.pdf`, где каждый PSD становится одной страницей. + +## Параметры + +Настройки не нужны. Конвертер использует сведённые данные изображения из PSD-файла. + +## Сценарии использования + +- Просмотр дизайнов Photoshop без запуска Photoshop +- Отправка макетов клиентам, у которых нет Adobe Creative Suite +- Печать художественных работ высокого разрешения из PSD-файлов +- Создание PDF-портфолио из нескольких PSD-макетов: каждый становится страницей одного документа + +## Советы + +- При преобразовании отображается составной (сведённый) вид PSD. Отдельные слои, корректирующие слои и эффекты слоёв не сохраняются в PDF как отдельные элементы. +- Несколько PSD-файлов объединяются в один многостраничный PDF, а не в отдельные PDF. Это удобно для портфолио и лукбуков. +- PSD-файлы очень высокого разрешения (печатные файлы 300+ DPI) дадут большие PDF. Инструмент сохраняет полное разрешение. + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [PNG в PDF](./png-to-pdf) +- [VSD в PDF](./vsd-to-pdf) diff --git a/docs/ru/tools/pub-to-pdf.md b/docs/ru/tools/pub-to-pdf.md new file mode 100644 index 00000000..15dbd928 --- /dev/null +++ b/docs/ru/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB в PDF +description: Преобразуйте файлы Microsoft Publisher (PUB) в PDF прямо в браузере. Бесплатно, приватно, без установки программ. +--- + +# PUB в PDF + +Преобразуйте файлы Microsoft Publisher в PDF. Publisher это программа для настольной вёрстки, входящая в некоторые версии Microsoft Office, но у большинства людей она не установлена. Этот инструмент позволяет любому преобразовать PUB в PDF прямо в браузере, без программ Microsoft. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :------------------ | :--------- | :--------------------------- | +| Microsoft Publisher | `.pub` | Документы настольной вёрстки | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё PUB-файлы. Можно загрузить сразу несколько файлов. +2. Просмотрите список файлов. Удалите лишние значком корзины или нажмите **Добавить еще файлы**, чтобы добавить новые. +3. Нажмите **Преобразовать в PDF**. В браузере загружается движок на основе LibreOffice и преобразует каждый PUB-файл, сохраняя макет, изображения и текстовые блоки. +4. Один файл скачивается сразу как PDF. Несколько файлов доставляются в ZIP-архиве `pub-to-pdf.zip`. + +## Параметры + +Дополнительная настройка не нужна. Конвертер сам обрабатывает макет PUB. + +## Сценарии использования + +- Открытие PUB-флаеров и бюллетеней от клиента без покупки Microsoft Publisher +- Преобразование церковных бюллетеней, программ мероприятий и школьных газет, созданных в Publisher +- Архивирование маркетинговых материалов из Publisher в универсально доступном формате +- Печать PUB-файлов на системе, где Publisher не установлен + +## Советы + +- Сложные макеты Publisher с наложенными текстовыми блоками и точным позиционированием при преобразовании могут слегка сместиться. Если точность важна, проверьте результат. +- Движок LibreOffice инициализируется один раз за сессию. Первое преобразование занимает больше времени, последующие быстрее. +- Для наиболее точного преобразования убедитесь, что пользовательские шрифты из оригинала являются стандартными системными шрифтами. + +## Связанные инструменты + +- [VSD в PDF](./vsd-to-pdf) +- [ODP в PDF](./odp-to-pdf) diff --git a/docs/ru/tools/rasterize-pdf.md b/docs/ru/tools/rasterize-pdf.md new file mode 100644 index 00000000..872f5470 --- /dev/null +++ b/docs/ru/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Растеризация документа +description: Преобразуйте страницы PDF в PDF из изображений. Сведите все слои, уберите выделяемый текст и управляйте DPI и форматом изображения. +--- + +# Растеризация документа + +Растеризация превращает каждую страницу PDF в изображение и собирает эти изображения обратно в PDF. Результат выглядит так же, как оригинал, но в нём нет выделяемого текста, интерактивных элементов и редактируемых слоёв. По сути, это качественная фотокопия. + +## Как это работает + +1. Загрузите один или несколько PDF-файлов. +2. Задайте **DPI** (разрешение) растеризованного результата. +3. Выберите **Формат изображения**: PNG для качества без потерь или JPEG для файлов меньшего размера. +4. При желании включите **Преобразовать в оттенки серого**. +5. Нажмите **Растеризация документа**. Несколько файлов скачиваются в ZIP. + +## Параметры + +| Настройка | Значения | По умолчанию | +| ---------------------- | -------------------------------------- | ------------ | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Формат изображения** | PNG (без потерь), JPEG (меньше размер) | PNG | +| **Градации серого** | Вкл/Выкл | Выкл | + +## Рекомендации по DPI + +- **72**: только просмотр на экране, наименьший размер файла +- **150**: хороший баланс для общего использования +- **200**: более чёткий текст, умеренный размер файла +- **300**: качество для печати +- **600**: высокое качество для архива или профессиональной печати + +## Сценарии использования + +- Защита конфиденциальных документов от извлечения текста перед отправкой +- Устранение проблем с зависимостью от шрифтов путём превращения текста в пиксели +- Создание «плоской» версии PDF со сложными слоями или прозрачностью, которая по-разному отображается в разных программах просмотра +- Подготовка PDF для системы, принимающей только изображения +- Удаление скрытого содержимого (например, исправлений или данных форм) путём сведения PDF к чистым изображениям + +## Советы + +- 150 DPI и PNG это надёжный вариант по умолчанию. Повышайте разрешение, только если нужна печать или вам нужно приближать мелкие детали. +- JPEG даёт заметно меньшие файлы, но добавляет артефакты сжатия на резких краях текста. +- Растеризация необратима: сохраните исходный PDF, если позже понадобится редактируемый текст. + +## Связанные инструменты + +- [Сжатие PDF](./compress-pdf): уменьшить размер растеризованного PDF +- [Выпрямление PDF](./deskew-pdf): выровнять страницы перед растеризацией отсканированных документов +- [Шрифты в кривые](./font-to-outline): преобразовать шрифты в векторные контуры, если нужна масштабируемость +- [Сведение документа](./flatten-pdf): свести формы без преобразования в изображения diff --git a/docs/ru/tools/remove-annotations.md b/docs/ru/tools/remove-annotations.md new file mode 100644 index 00000000..32dfea63 --- /dev/null +++ b/docs/ru/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Удаление аннотаций +description: Удалите из PDF все комментарии, выделения, ссылки и другие аннотации одним щелчком. +--- + +# Удаление аннотаций + +Очистите PDF, удалив все аннотации: комментарии, выделения, стикеры, разметку текста, ссылки, штампы и любые другие объекты аннотаций в документе. Основное содержимое страниц (текст, изображения, графика) остаётся нетронутым. + +## Как это работает + +1. Загрузите PDF-файл. +2. Инструмент определяет число страниц документа и показывает сведения о файле. +3. Нажмите **Удаление аннотаций** для обработки. +4. Очищенный PDF скачивается автоматически, все аннотации удалены. + +## Возможности + +- Удаляет аннотации всех типов: комментарии, выделения, подчёркивания, зачёркивания, стикеры, штампы, ссылки и разметку форм +- Обрабатывает каждую страницу документа +- Сохраняет всё содержимое, не являющееся аннотациями (текст, изображения, векторную графику, поля форм) +- Показывает число страниц и размер файла перед обработкой + +## Сценарии использования + +- Очистка документа перед окончательной рассылкой после рецензирования, в котором несколько рецензентов оставили комментарии +- Удаление выделений и стикеров из общего учебного пособия +- Удаление ссылок из документа перед архивированием +- Подготовка «чистой» версии юридического документа, который активно размечали при согласовании +- Удаление комментариев рецензентов из рукописи перед отправкой в печать + +## Советы + +- Инструмент удаляет аннотации на уровне структуры PDF, поэтому текст остаётся выделяемым, а качество исходным, без растеризации. +- Если нужно удалить только отдельные аннотации, а не все, используйте [Редактор PDF](./edit-pdf) для выборочного удаления. +- Аннотации в сведённых PDF (где они объединены с содержимым страницы) удалить нельзя, так как они уже не являются отдельными объектами. + +## Связанные инструменты + +- [Редактор PDF](./edit-pdf) +- [Добавление водяных знаков](./add-watermark) +- [Подписание PDF](./sign-pdf) diff --git a/docs/ru/tools/remove-blank-pages.md b/docs/ru/tools/remove-blank-pages.md new file mode 100644 index 00000000..f5f996c6 --- /dev/null +++ b/docs/ru/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Удаление пустых страниц +description: Автоматически находите и удаляйте пустые и почти пустые страницы в PDF с настраиваемой чувствительностью. +--- + +# Удаление пустых страниц + +Просканируйте PDF на пустые и почти пустые страницы и удалите их автоматически. Инструмент отрисовывает каждую страницу и анализирует её пиксели, чтобы определить, пуста ли она, а затем позволяет подтвердить, какие страницы удалить. + +## Как это работает + +1. Загрузите PDF-файл. +2. Настройте ползунок **Чувствительность**, определяющий, насколько строго понимается «пустая» страница. +3. Нажмите **Найти пустые страницы**, чтобы просканировать документ. +4. Инструмент покажет миниатюры найденных пустых страниц для проверки. +5. Подтвердите выбор и скачайте очищенный PDF без пустых страниц. + +## Параметры + +- **Чувствительность**: ползунок от 0% до 100% (по умолчанию 80%). Высокие значения строже и отмечают только полностью или почти белые страницы. Низкие значения мягче и находят страницы с минимальным содержимым, например с одной точкой или бледным водяным знаком. + +## Возможности + +- Попиксельный анализ каждой страницы для выявления пустого содержимого +- Настраиваемый ползунок чувствительности для тонкой подстройки +- Миниатюры найденных пустых страниц для ручной проверки +- Все непустые страницы сохраняются без изменений +- Работает с документами любого размера и числа страниц +- Индикатор хода сканирования + +## Сценарии использования + +- Очистка отсканированных документов, в которых сканер захватил пустые оборотные стороны односторонних оригиналов +- Удаление разделительных страниц из пакетов сканирования +- Удаление пустых страниц, добавленных системами управления документами +- Очистка PDF, экспортированных из текстовых редакторов, которые иногда добавляют пустые страницы в конце +- Уменьшение размера файла за счёт удаления ненужных пустых страниц + +## Советы + +- Начните с чувствительности по умолчанию 80% и корректируйте от неё. Если инструмент пропускает страницы, которые вам кажутся пустыми, снизьте чувствительность. Если он отмечает страницы с лёгким содержимым, которое нужно сохранить, повысьте её. +- Инструмент отрисовывает каждую страницу для анализа, поэтому время обработки растёт с числом страниц. Для очень больших документов придётся немного подождать. +- Проверьте найденные пустые страницы в миниатюрах перед подтверждением удаления. Страницы с бледными колонтитулами или водяными знаками могут быть отмечены в зависимости от чувствительности. + +## Связанные инструменты + +- [Обрезка PDF](./crop-pdf) +- [Редактор PDF](./edit-pdf) +- [Нумерация страниц](./page-numbers) diff --git a/docs/ru/tools/remove-metadata.md b/docs/ru/tools/remove-metadata.md new file mode 100644 index 00000000..bf3c0821 --- /dev/null +++ b/docs/ru/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Удаление метаданных +description: 'Удалите из PDF-файлов все скрытые метаданные: автора, название, дату создания, производителя, данные XMP и идентификаторы документа.' +--- + +# Удаление метаданных + +Каждый PDF содержит метаданные, которые могут раскрыть, кто его создал, какая программа использовалась, когда он последний раз изменялся и многое другое. Этот инструмент удаляет всё: словарь информации, потоки метаданных XMP, идентификаторы документа и данные конкретных приложений, оставляя чистый документ без следов происхождения. + +## Как это работает + +1. Загрузите PDF-файл. +2. Нажмите **Удаление метаданных**. +3. Скачайте очищенный файл. + +Настраивать ничего не нужно. Инструмент сделан тщательным намеренно: он очищает всё. + +## Что удаляется + +- **Поля словаря информации**: название, автор, тема, ключевые слова, создатель, производитель, дата создания, дата изменения +- **Поток метаданных XMP**: блок метаданных на основе XML, хранящийся в каталоге документа +- **Идентификаторы документа**: уникальные идентификаторы в трейлере PDF, по которым документ можно отслеживать между системами +- **PieceInfo**: метаданные конкретных приложений, добавляемые такими программами, как Illustrator или InDesign + +## Что остаётся + +- Всё видимое содержимое страниц (текст, изображения, графика) +- Поля форм и аннотации +- Закладки и ссылки +- Сама структура документа + +## Сценарии использования + +- Удаление вашего имени и организации из документа перед анонимной публикацией +- Удаление меток времени создания, которые показывают, когда документ готовился +- Очистка строк производителя, по которым определяется ваш набор PDF-программ +- Подготовка документов для регуляторных подач, требующих PDF без метаданных +- Удаление следов истории правок перед отправкой документа вовне + +## Советы + +- Сначала воспользуйтесь инструментом «Просмотр метаданных», чтобы увидеть, какие именно метаданные содержит ваш PDF. +- Если нужно удалить метаданные _и_ JavaScript, аннотации и встроенные файлы, используйте «Санирование документа» для более тщательной очистки. +- Удаление метаданных необратимо. Сохраните оригинал, если эти данные могут понадобиться позже. + +## Связанные инструменты + +- [Санирование документа](./sanitize-pdf): удалить метаданные, а также скрипты, вложения и другое +- [Защита PDF](./protect-pdf): защитить очищенный PDF паролем +- [Сжатие PDF](./compress-pdf): удаление метаданных немного уменьшает размер файла, а сжатие даёт больше экономии diff --git a/docs/ru/tools/remove-restrictions.md b/docs/ru/tools/remove-restrictions.md new file mode 100644 index 00000000..94350cf9 --- /dev/null +++ b/docs/ru/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Снятие ограничений +description: Снимайте защиту паролем, запреты на печать, блокировку редактирования и ограничения копирования с PDF-файлов. +--- + +# Снятие ограничений + +PDF может иметь два типа паролей: пароль пользователя (нужен, чтобы открыть файл) и пароль владельца (определяет, что можно с ним делать). Этот инструмент убирает оба, вместе со всеми связанными ограничениями: запретами на печать, редактирование, копирование и аннотирование. + +## Как это работает + +1. Загрузите PDF-файл. +2. Если у PDF есть пароль владельца, введите его в поле **Пароль владельца**. Оставьте поле пустым, если у PDF только ограничения использования без пароля. +3. Нажмите **Снятие ограничений**. +4. Скачайте PDF без ограничений. + +Инструмент использует флаги QPDF `--decrypt` и `--remove-restrictions`, чтобы получить чистую копию без ограничений. + +## Что удаляется + +- Защита паролем (и пароль пользователя, и пароль владельца) +- Ограничения печати +- Ограничения редактирования +- Ограничения копирования текста и изображений +- Ограничения аннотирования и комментирования +- Все прочие ограничения безопасности, закодированные в PDF + +## Сценарии использования + +- Разблокировка PDF, который принадлежит вам, но пароль к которому вы задали много лет назад +- Снятие запрета на печать с документа, к которому у вас законный доступ +- Включение копирования и вставки в справочных материалах для конспектирования +- Подготовка PDF для средств доступности, не работающих с документами с ограничениями + +## Советы + +- Если пароль владельца задан, его нужно знать. Инструмент не взламывает и не подбирает пароли. +- Если нужно оставить файл зашифрованным, но изменить отдельные разрешения, используйте инструмент «Изменение разрешений». +- В итоговом файле шифрования нет совсем: любой, кто его получит, сможет свободно его открыть. + +## Связанные инструменты + +- [Разблокировка PDF](./unlock-pdf): разблокировать PDF, если вы знаете пароль пользователя +- [Защита PDF](./protect-pdf): снова применить шифрование с новыми настройками +- [Изменение разрешений](./change-permissions): выборочно менять, какие действия разрешены diff --git a/docs/ru/tools/repair-pdf.md b/docs/ru/tools/repair-pdf.md new file mode 100644 index 00000000..fedfb4dc --- /dev/null +++ b/docs/ru/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Восстановление документа +description: Восстановление данных из повреждённых PDF-файлов с помощью движка восстановления QPDF. Поддерживает пакетную обработку. +--- + +# Восстановление документа + +Если PDF не открывается, показывает искажённое содержимое или вызывает ошибки в программе просмотра, этот инструмент пытается перестроить его внутреннюю структуру. Он использует движок восстановления QPDF, который умеет исправлять многие виды повреждений: сломанные таблицы перекрёстных ссылок, обрезанные потоки, недопустимые ссылки на объекты и другие. + +## Как это работает + +1. Загрузите один или несколько повреждённых PDF-файлов. +2. Нажмите **Восстановление документа**. +3. Один восстановленный файл скачивается сразу. Несколько файлов дают ZIP-архив. + +Инструмент пропускает каждый файл через QPDF с флагом `--decrypt`, что заставляет QPDF прочитать и полностью переписать структуру PDF, исправляя по пути все устранимые проблемы. + +## Возможности + +- Пакетное восстановление нескольких PDF за одну операцию +- Автоматическое определение восстановимых и невосстановимых файлов +- Отчёт об успехе или неудаче по каждому файлу при обработке нескольких файлов +- Использует QPDF (WebAssembly), проверенную временем библиотеку преобразования PDF + +## Что можно исправить + +- Сломанные или отсутствующие таблицы перекрёстных ссылок +- Обрезанные концы файлов из-за неполной загрузки +- Неверную нумерацию объектов и длины потоков +- Мелкие структурные несоответствия от ошибочных генераторов PDF +- Артефакты шифрования после неудачных попыток расшифровки + +## Что исправить нельзя + +- Сильно обрезанные файлы, у которых отсутствует большая часть данных +- PDF, зашифрованные паролем, которого у вас нет +- Файлы, которые на самом деле не PDF (неверное расширение) +- Повреждение изображений внутри PDF (структура исправляется, но пиксельные данные не воссоздаются) + +## Сценарии использования + +- Восстановление PDF после неудачной загрузки из почты +- Открытие файлов, созданных устаревшими или нестандартными генераторами PDF +- Исправление PDF, которые работают в одной программе просмотра, но не в другой +- Подготовка повреждённых архивных документов к долгосрочному хранению + +## Советы + +- Если восстановление не удалось, попробуйте сначала открыть файл в браузере: у браузеров своя логика восстановления, и они могут отобразить достаточно содержимого, чтобы пересохранить файл. +- Если зашифрованный PDF не удаётся восстановить, сначала примените «Разблокировка PDF», а затем восстановите расшифрованный результат. + +## Связанные инструменты + +- [Сжатие PDF](./compress-pdf): дополнительно очистить структуру восстановленного PDF +- [Линеаризация документа](./linearize-pdf): оптимизировать восстановленный файл для веба +- [Сведение документа](./flatten-pdf): свести формы, которые могли быть повреждены diff --git a/docs/ru/tools/reverse-pages.md b/docs/ru/tools/reverse-pages.md new file mode 100644 index 00000000..f2e3c1d7 --- /dev/null +++ b/docs/ru/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Обращение порядка страниц +description: Переверните порядок страниц одного или нескольких PDF-файлов, чтобы последняя страница стала первой. +--- + +# Обращение порядка страниц + +Переверните порядок страниц PDF: последняя страница станет первой, предпоследняя второй и так далее. Поддерживается пакетная обработка нескольких файлов сразу. + +## Как это работает + +1. Загрузите один или несколько PDF-файлов. +2. Нажмите кнопку обработки. +3. Каждый файл обращается независимо. Если вы загрузили несколько файлов, результатом будет ZIP-архив со всеми обращёнными PDF. +4. Один файл скачивается сразу как PDF с обращённым порядком страниц. + +## Возможности + +- Пакетная обработка: обращение нескольких PDF за одну операцию +- Один PDF на выходе для одного файла, ZIP для нескольких +- Кнопки удаления отдельных файлов перед обработкой +- Всё содержимое страниц и форматирование сохраняются + +## Сценарии использования + +- Исправление документа, отсканированного в обратном порядке +- Подготовка PDF-презентации для чтения с конца к началу +- Обращение порядка страниц для печати, при которой страницы подаются в обратном порядке +- Исправление документа, страницы которого случайно собрали задом наперёд + +## Советы + +- Каждый файл в пакете обращается независимо: сами файлы относительно друг друга не переставляются. +- Для более гибкой перестановки страниц (не только полного обращения) используйте [Дублирование и организация](./organize-pdf). + +## Связанные инструменты + +- [Дублирование и организация](./organize-pdf) +- [Поворот PDF](./rotate-pdf) +- [PDF мультиинструмент](./pdf-multi-tool) diff --git a/docs/ru/tools/rotate-custom.md b/docs/ru/tools/rotate-custom.md new file mode 100644 index 00000000..55321fdf --- /dev/null +++ b/docs/ru/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Поворот на заданное количество градусов +description: Поворачивайте страницы PDF на любой угол с отдельным полем ввода градусов для каждой страницы и пакетным управлением. +--- + +# Поворот на заданное количество градусов + +Поворачивайте страницы PDF на произвольный угол, а не только кратный 90 градусам. У каждой страницы своё поле ввода угла, а с помощью пакетного элемента управления можно применить один угол сразу ко всем страницам. + +## Как это работает + +1. Загрузите PDF-файл. Для каждой страницы отображаются миниатюры. +2. У каждой страницы есть числовое поле с текущим углом поворота. +3. Введите любое значение в градусах (положительное или отрицательное), чтобы повернуть конкретную страницу, или используйте кнопки влево и вправо у каждой страницы для быстрых поворотов на 90 градусов. +4. С помощью поля **пакетного угла** вверху задайте одинаковый поворот для всех страниц. +5. Нажмите кнопку обработки, чтобы создать повёрнутый PDF. + +## Возможности + +- Свободный ввод градусов для каждой страницы (любое целое число) +- Пакетное управление углом для одинакового поворота всех страниц +- Предпросмотр поворота в миниатюрах в реальном времени +- Кнопки быстрого поворота страницы с шагом 90 градусов +- Отложенная загрузка миниатюр для быстрой работы с большими документами + +## Сценарии использования + +- Исправление слегка наклонённых сканов на несколько градусов +- Поворот страниц под нестандартные требования к ориентации +- Точные повороты отдельных страниц в документе со смешанным содержимым +- Тонкая подстройка углов страниц после первоначального массового поворота + +## Советы + +- Положительные значения поворачивают по часовой стрелке, отрицательные против часовой. +- Поле пакетного угла при применении перезаписывает углы всех страниц. При необходимости задавайте индивидуальные поправки после пакетной операции. +- Для стандартных поворотов на 90, 180 и 270 градусов с более простым интерфейсом используйте [Поворот PDF](./rotate-pdf). + +## Связанные инструменты + +- [Поворот PDF](./rotate-pdf) +- [PDF мультиинструмент](./pdf-multi-tool) +- [Дублирование и организация](./organize-pdf) diff --git a/docs/ru/tools/rotate-pdf.md b/docs/ru/tools/rotate-pdf.md new file mode 100644 index 00000000..5afba587 --- /dev/null +++ b/docs/ru/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Поворот PDF +description: Поворачивайте отдельные или все страницы PDF с шагом 90 градусов в наглядном интерфейсе с миниатюрами. +--- + +# Поворот PDF + +Поворачивайте страницы PDF на 90 градусов по часовой стрелке или против неё. Инструмент показывает миниатюры всех страниц, позволяя поворачивать их по отдельности или сразу весь документ. + +## Как это работает + +1. Загрузите PDF-файл. Миниатюры всех страниц отображаются сеткой. +2. Кнопками поворота влево и вправо под миниатюрой повернёте именно эту страницу. +3. Элементами пакетного поворота вверху поверните все страницы сразу. +4. Предпросмотр миниатюр обновляется в реальном времени и показывает поворот. +5. Нажмите кнопку обработки, чтобы сохранить повёрнутый PDF. + +## Возможности + +- Поворот отдельных страниц с шагом 90 градусов (влево или вправо) +- Пакетный поворот всех страниц одновременно +- Предпросмотр миниатюр в реальном времени с анимацией поворота +- Отложенная загрузка миниатюр для плавной работы с большими документами +- Исходное содержимое и качество страниц сохраняются + +## Сценарии использования + +- Исправление отсканированных страниц, лежащих боком или вверх ногами +- Поворот альбомных страниц в книжную ориентацию (или наоборот) +- Исправление документа со смешанной ориентацией, где часть страниц отсканирована под неверным углом +- Подготовка документа к определённой ориентации отображения + +## Советы + +- Повороты накапливаются. Двойной щелчок по кнопке по часовой стрелке даёт поворот на 180 градусов. +- Для поворотов не на 90 градусов (например, на 45 градусов, чтобы выровнять слегка наклонённый скан) используйте [Поворот на заданное количество градусов](./rotate-custom). +- Элементы пакетного поворота действуют на все страницы, а не только на выбранные. Выбора страниц в этом инструменте нет: для этого используйте [PDF мультиинструмент](./pdf-multi-tool). + +## Связанные инструменты + +- [Поворот на заданное количество градусов](./rotate-custom) +- [PDF мультиинструмент](./pdf-multi-tool) +- [Дублирование и организация](./organize-pdf) diff --git a/docs/ru/tools/rtf-to-pdf.md b/docs/ru/tools/rtf-to-pdf.md new file mode 100644 index 00000000..586a99dc --- /dev/null +++ b/docs/ru/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF в PDF +description: Преобразуйте файлы Rich Text Format (RTF) в PDF в браузере с помощью движка на основе LibreOffice. +--- + +# RTF в PDF + +Преобразуйте документы Rich Text Format в PDF. RTF это кроссплатформенный формат документов, который поддерживает практически любой текстовый редактор. Инструмент использует LibreOffice, работающий в браузере, и отображает RTF-файлы с сохранением форматирования: полужирный и курсивный шрифт, таблицы и встроенные изображения переносятся в PDF. + +## Поддерживаемые форматы + +| Формат | Расширения | Типы MIME | +| :----- | :--------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё один или несколько RTF-файлов. +2. Просмотрите список файлов. Добавьте ещё или удалите лишние. +3. Нажмите **Конвертировать в PDF**. При первом использовании инициализируется движок LibreOffice, затем обрабатывается каждый файл. +4. Один файл скачивается сразу как PDF. Несколько файлов доставляются как `rtf-converted.zip`. + +## Параметры + +У этого инструмента нет дополнительных настроек. Преобразование сохраняет исходное форматирование RTF. + +## Результат + +| Количество файлов | Результат | +| :---------------- | :---------------------------------------------------------------- | +| 1 файл | Один PDF (например, `letter.pdf`) | +| 2 и более | ZIP-архив (`rtf-converted.zip`) с отдельным PDF для каждого файла | + +## Сценарии использования + +- Преобразование устаревших RTF-документов из старых текстовых редакторов в современные PDF +- Превращение RTF-шаблонов писем в PDF-превью +- Обработка RTF-вывода из юридических и медицинских программ +- Пакетное преобразование RTF-файлов из системы управления документами в PDF для архива + +## Советы + +- Движок LibreOffice загружается один раз и кэшируется. Первое преобразование за сессию занимает на несколько секунд больше, последующие быстрее. +- RTF-файлы со встроенными OLE-объектами могут отображаться не идеально. Простой текст, изображения и стандартное форматирование преобразуются надёжно. +- Если ваши RTF-файлы созданы в Microsoft Word, их можно также преобразовать напрямую инструментом [Word в PDF](./word-to-pdf), который принимает RTF наряду с DOC и DOCX. + +## Связанные инструменты + +- [Word в PDF](./word-to-pdf) +- [ODT в PDF](./odt-to-pdf) +- [Текст в PDF](./txt-to-pdf) diff --git a/docs/ru/tools/sanitize-pdf.md b/docs/ru/tools/sanitize-pdf.md new file mode 100644 index 00000000..e40e1949 --- /dev/null +++ b/docs/ru/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Санирование документа +description: 'Удалите из PDF скрытое и потенциально опасное содержимое: метаданные, JavaScript, встроенные файлы, аннотации и слои.' +--- + +# Санирование документа + +PDF может содержать гораздо больше, чем видно на экране. Скрытые метаданные, встроенный JavaScript, вложенные файлы, данные форм и сведения о слоях могут раскрыть конфиденциальную информацию или создать угрозу безопасности. Санирование убирает всё это и оставляет чистый документ, безопасный для публикации. + +## Как это работает + +1. Загрузите PDF-файл. +2. Отметьте в списке, какие элементы удалить. +3. Нажмите **Санирование документа**. +4. Скачайте очищенный файл. + +## Параметры санирования + +Все параметры включены по умолчанию. Снимите отметку с тех, что нужно сохранить. + +| Параметр | Что удаляется | +| ----------------------------- | ------------------------------------------------------------------- | +| **Свести формы** | Превращает интерактивные поля форм в статичное содержимое | +| **Удалить метаданные** | Удаляет автора, название, дату создания, сведения о ПО и данные XMP | +| **Удалить аннотации** | Удаляет комментарии, выделения, стикеры и разметку | +| **Удалить JavaScript** | Убирает встроенные скрипты, которые могут выполниться при открытии | +| **Удалить встроенные файлы** | Удаляет файлы, вложенные в PDF | +| **Удалить слои (OCG)** | Сводит группы необязательного содержимого в один слой | +| **Удалить ссылки** | Удаляет гиперссылки и ссылки на URL | +| **Удалить дерево структуры** | Удаляет структуру документа, используемую для тегов доступности | +| **Удалить MarkInfo** | Удаляет сведения о размеченном содержимом | +| **Удалить встроенные шрифты** | Удаляет данные встроенных шрифтов (использовать с осторожностью) | + +## Сценарии использования + +- Подготовка PDF к публикации с удалением внутренних метаданных (имена авторов, версии ПО, история правок) +- Удаление JavaScript из PDF, полученного из ненадёжного источника, перед открытием +- Очистка PDF перед отправкой клиенту, который не должен видеть встроенные комментарии и имена полей форм +- Удаление скрытых слоёв из архитектурного чертежа перед отправкой окончательной версии +- Соблюдение требований минимизации данных по нормам о конфиденциальности + +## Советы + +- Не отмечайте «Удалить встроенные шрифты», если не уверены, что PDF по-прежнему будет отображаться правильно. Удаление шрифтов может сделать текст невидимым в некоторых программах просмотра. +- Если нужно удалить только метаданные, быстрее и целенаправленнее воспользоваться отдельным инструментом «Удаление метаданных». +- Санирование необратимо. Сохраните исходный файл. + +## Связанные инструменты + +- [Удаление метаданных](./remove-metadata): удалить только метаданные, не трогая остальное содержимое +- [Сведение документа](./flatten-pdf): свести именно формы и аннотации +- [Защита PDF](./protect-pdf): добавить защиту паролем после санирования +- [Растеризация документа](./rasterize-pdf): радикальный вариант: преобразовать в изображения, чтобы убрать всё скрытое содержимое diff --git a/docs/ru/tools/scanner-effect.md b/docs/ru/tools/scanner-effect.md new file mode 100644 index 00000000..30dc861e --- /dev/null +++ b/docs/ru/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Эффект сканера +description: Придайте PDF вид отсканированного документа с настраиваемым шумом, поворотом, размытием и эффектом старения бумаги. +--- + +# Эффект сканера + +Превратите чистый цифровой PDF в документ, выглядящий так, будто он вышел из планшетного сканера. Инструмент применяет настраиваемый шум, лёгкий поворот, размытие, сдвиги яркости и необязательное пожелтение, имитируя несовершенства физического скана. + +## Как это работает + +1. Загрузите PDF-файл. +2. Откроется редактор с живым предпросмотром первой страницы и панелью настроек. +3. Настройте параметры эффекта сканирования ползунками и переключателями. +4. Предпросмотр обновляется в реальном времени при изменении настроек. +5. Нажмите **Применить эффект сканера**, чтобы обработать все страницы и скачать результат. + +## Параметры + +- **Цветовое пространство (переключатель градаций серого)**: преобразует результат в градации серого для классического чёрно-белого скана. +- **Граница**: добавляет едва заметную тёмную рамку по краям страницы, имитируя артефакты границ сканера. +- **Поворот**: применяет лёгкий поворот (от -5 до +5 градусов), имитируя неровную подачу бумаги. +- **Разброс поворота**: добавляет случайное отклонение угла, чтобы каждая страница наклонялась немного по-разному. +- **Яркость**: сдвигает общую яркость вверх или вниз. +- **Контраст**: регулирует контраст, имитируя различия в качестве тонера. +- **Размытие**: применяет размытие по Гауссу, смягчая края текста, как у скана низкого качества. +- **Шум**: добавляет случайный пиксельный шум, имитируя зернистость датчика сканера. Чем выше значение, тем зернистее результат. +- **Желтоватость**: добавляет тёплый жёлтый оттенок, имитируя старую или переработанную бумагу. +- **Разрешение**: задаёт DPI результата. Чем ниже значение, тем более пикселизированным и «сканированным» выглядит документ. +- **Сброс**: возвращает все настройки к значениям по умолчанию. + +## Возможности + +- Предпросмотр в реальном времени, обновляющийся при изменении каждого параметра +- Случайный разброс поворота для каждой страницы для реалистичного вида +- Десять независимо настраиваемых параметров +- Режим градаций серого для достоверного чёрно-белого скана +- Управление разрешением от качества факса с низким DPI до архивного качества с высоким DPI + +## Сценарии использования + +- Придание цифровым документам вида отсканированных и напечатанных +- Имитация старения физического документа для воссоздания исторических документов +- Проверка программ распознавания текста на сканах ухудшенного качества +- Создание документов, соответствующих визуальному стилю существующих архивов сканов + +## Советы + +- Начните с мягких значений. Уровня шума 10-20, лёгкого поворота в 0,5 градуса и минимального размытия уже достаточно для убедительного вида скана. +- Сочетайте режим градаций серого с лёгким пожелтением для эффекта «ксерокопии с ксерокопии». +- Низкие значения разрешения (100-150 DPI) дают наиболее реалистичный вид факса. + +## Связанные инструменты + +- [Инверсия цвета](./invert-colors) +- [Настройка цвета](./adjust-colors) +- [Цвет фона](./background-color) diff --git a/docs/ru/tools/sign-pdf.md b/docs/ru/tools/sign-pdf.md new file mode 100644 index 00000000..8a147364 --- /dev/null +++ b/docs/ru/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Подписание PDF +description: Нарисуйте, напечатайте или загрузите подпись и разместите её на страницах PDF во встроенном просмотрщике. +--- + +# Подписание PDF + +Добавьте свою подпись в любой PDF-документ. Инструмент включает полноценный просмотрщик PDF со встроенными средствами подписи: можно нарисовать подпись от руки, набрать имя шрифтом-подписью или загрузить изображение подписи. Разместите подпись на любой странице, измените её размер и сохраните подписанный документ. + +## Как это работает + +1. Загрузите PDF-файл. +2. Документ откроется во встроенном просмотрщике PDF с инструментами аннотирования. +3. С помощью инструмента подписи в просмотрщике создайте подпись: нарисуйте, напечатайте или загрузите изображение. +4. Щёлкните на странице там, где нужна подпись, и настройте её размер и положение. +5. При желании отметьте **Свести PDF**, чтобы навсегда встроить подпись в документ. +6. Нажмите **Сохранить и скачать подписанный PDF**, чтобы получить подписанный файл. + +## Параметры + +- **Свести PDF**: если отмечено, подпись навсегда встраивается в содержимое страницы. Это не позволяет другим переместить или удалить подпись. Если не отмечено, подпись остаётся аннотацией, которую можно изменять в совместимых программах просмотра. + +## Возможности + +- Три способа создания подписи: рисование от руки, набранный текст или загруженное изображение +- Встроенный просмотрщик PDF для точного размещения +- Перетаскивание для позиционирования и изменения размера подписей на любой странице +- Необязательное сведение для окончательного встраивания подписей +- Поддержка нескольких подписей в одном документе + +## Сценарии использования + +- Подписание договоров, соглашений и форм согласования перед отправкой обратно +- Добавление подписи в налоговые документы, страховые заявления и государственные формы +- Постановка инициалов на отдельных страницах многостраничного соглашения +- Подписание NDA и кадровых документов, приходящих во вложениях в формате PDF + +## Советы + +- Включите сведение, если отправляете подписанный PDF тому, кто не должен иметь возможности удалить или переместить вашу подпись. +- Для юридически значимых цифровых подписей с проверкой по сертификату в BentoPDF есть отдельный инструмент «Цифровая подпись PDF». +- Для наилучшего результата загрузите изображение подписи в формате PNG с прозрачным фоном. + +## Связанные инструменты + +- [Редактор PDF](./edit-pdf) +- [Добавление штампов](./add-stamps) +- [Заполнение PDF-форм](./form-filler) diff --git a/docs/ru/tools/split-pdf.md b/docs/ru/tools/split-pdf.md new file mode 100644 index 00000000..61114cf8 --- /dev/null +++ b/docs/ru/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Разделение PDF +description: Разделите PDF на файлы меньшего размера по диапазону страниц, визуальному выбору, закладкам, чётным и нечётным страницам или фиксированным интервалам. +--- + +# Разделение PDF + +Разбейте PDF на небольшие документы одним из шести режимов разделения. От простых диапазонов страниц до разделения по закладкам: инструмент подходит для любого сценария деления документа. + +## Как это работает + +1. Загрузите один PDF-файл. +2. Выберите режим разделения в выпадающем списке. +3. Настройте параметры выбранного режима (диапазоны страниц, выбор и т. д.). +4. Нажмите кнопку обработки. +5. Результат скачивается как один PDF или ZIP-архив в зависимости от режима и настроек. + +## Режимы разделения + +| Режим | Описание | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| **Диапазон** | Введите диапазоны страниц, например `1-3, 5, 8-10`. Несколько диапазонов дают отдельные PDF в ZIP. Один диапазон даёт один PDF. | +| **Визуальный выбор** | Просматривайте миниатюры страниц и щёлкайте по нужным. Выбранные страницы извлекаются в новый PDF. | +| **Чётные / нечётные** | Извлекаются только чётные или только нечётные страницы. | +| **Все страницы** | Каждая страница сохраняется как отдельный PDF-файл, всё скачивается в ZIP. | +| **Закладки** | Разделение по границам закладок. Выберите уровень закладок, чтобы определить, где проходят разрезы. | +| **Каждые N страниц** | Разделение на части по N страниц (например, каждые 5 страниц). В последней части может быть меньше страниц. | + +## Возможности + +- Шесть различных режимов разделения, охватывающих практически любой сценарий +- Визуальный выбор страниц с отложенной загрузкой миниатюр +- Разделение по закладкам с фильтрацией по уровню +- Вывод в ZIP для режимов диапазона и визуального выбора +- Поддержка диапазонов страниц со смешанным синтаксисом (`1-3, 5, 8-10`) +- Предупреждение, если разделение по N страниц даёт части неравного размера + +## Сценарии использования + +- Извлечение определённой главы или раздела из большого документа +- Разделение нечётных и чётных страниц для двусторонней печати +- Разбиение PDF книги на файлы отдельных глав по границам закладок +- Выделение отдельных страниц (например, страницы с подписями) из договора +- Разделение сводного отчёта на файлы по разделам для рассылки + +## Советы + +- Несколько диапазонов страниц через запятую (например, `1-5, 10-15, 20-25`) дают отдельные PDF, по одному на диапазон, упакованные в ZIP. +- Для режима закладок в PDF должны быть закладки. Если их нет, вы получите сообщение об ошибке. +- Флажок «Скачать как ZIP» в режимах диапазона и визуального выбора позволяет получить отдельные PDF для каждой страницы вместо одного общего файла. + +## Связанные инструменты + +- [Объединение PDF](./merge-pdf) +- [Извлечение страниц](./extract-pages) +- [Удаление страниц](./delete-pages) +- [PDF мультиинструмент](./pdf-multi-tool) diff --git a/docs/ru/tools/svg-to-pdf.md b/docs/ru/tools/svg-to-pdf.md new file mode 100644 index 00000000..a47d56b6 --- /dev/null +++ b/docs/ru/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG в PDF +description: Преобразуйте векторную графику SVG в PDF с управлением качеством прямо в браузере. +--- + +# SVG в PDF + +Преобразуйте файлы Scalable Vector Graphics (SVG) в PDF. Инструмент растеризует каждый SVG средствами отрисовки браузера, а затем встраивает результат в исходном разрешении. Удобно для превращения векторных значков, диаграмм и иллюстраций в переносимые документы. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :--------- | +| SVG | `.svg` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё один или несколько SVG-файлов. +2. Просмотрите список файлов и при необходимости измените его. +3. Выберите уровень **Качество PDF**. +4. Нажмите **Конвертировать в PDF**. Результат скачивается как `from_svgs.pdf`. + +Каждый SVG читается как текст, отрисовывается на холсте в собственных ширине и высоте (по умолчанию 800x600, если размеры не указаны) и экспортируется в PNG. Затем этот PNG встраивается в PDF с помощью pdf-lib. Прозрачные области заливаются белым фоном. + +## Параметры + +**Качество PDF** управляет сжатием после растеризации: + +- **Высокое качество**: ближе всего к исходной отрисовке. +- **Среднее качество** (по умолчанию): хороший баланс. +- **Низкое качество**: наименьший файл, часть деталей теряется. + +## Сценарии использования + +- Преобразование архитектурных и инженерных схем из SVG в PDF, готовый к печати +- Упаковка наборов значков в справочный PDF для дизайн-системы +- Превращение визуализаций данных (D3.js, экспорт из библиотек диаграмм) в PDF для отчётов +- Создание печатных версий инфографики на основе SVG + +## Советы + +- SVG-файлы без явных атрибутов `width` и `height` отрисовываются в размере 800x600 пикселей. Для лучшего результата задайте размеры в исходнике SVG перед преобразованием. +- Сложные SVG с внешними ссылками на шрифты или связанными изображениями могут отображаться неидеально. Встройте все ресурсы в SVG для надёжного результата. +- Поскольку SVG растеризуется, в PDF будет растровое изображение, а не векторные контуры. Для настоящего векторного PDF нужен специальный векторный инструмент. + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [PNG в PDF](./png-to-pdf) +- [BMP в PDF](./bmp-to-pdf) diff --git a/docs/ru/tools/table-of-contents.md b/docs/ru/tools/table-of-contents.md new file mode 100644 index 00000000..7a6cc189 --- /dev/null +++ b/docs/ru/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Оглавление +description: Создайте страницу с оформленным оглавлением на основе существующих закладок PDF. +--- + +# Оглавление + +Инструмент читает закладки (структуру) вашего PDF и создаёт страницу с оформленным оглавлением, которая добавляется в начало документа. Если в PDF уже есть закладки, но нет видимой страницы оглавления, инструмент создаст её автоматически. + +## Как это работает + +1. Загрузите PDF, содержащий закладки. +2. Настройте заголовок оглавления, размер шрифта и семейство шрифтов. +3. При желании отметьте **Добавить закладку для страницы оглавления**, чтобы включить само оглавление в дерево закладок. +4. Нажмите **Создать оглавление**, чтобы обработать файл. +5. Обновлённый PDF скачивается автоматически, страница оглавления вставлена в начало. + +## Параметры + +- **Заголовок оглавления**: заголовок вверху созданной страницы. По умолчанию «Оглавление». +- **Размер шрифта**: от 10 pt до 72 pt. По умолчанию 12 pt. +- **Семейство шрифтов**: Times Roman, Helvetica или Courier (обычный, полужирный, курсив, полужирный курсив). По умолчанию Helvetica. +- **Добавить закладку для страницы оглавления**: если отмечено, в дерево структуры PDF добавляется закладка на саму страницу оглавления. + +## Возможности + +- Считывает всю иерархию закладок из PDF +- Создаёт аккуратно оформленную страницу оглавления с номерами страниц +- Поддерживает вложенные уровни закладок с отступами +- Выбор из 12 встроенных шрифтов PDF +- Необязательная закладка на саму страницу оглавления + +## Сценарии использования + +- Добавление печатного оглавления в электронные книги и отчёты, где есть только цифровые закладки +- Создание оглавления для сводного документа после объединения нескольких PDF +- Создание справочной страницы для длинных технических руководств +- Подготовка документов к печати, где ожидается видимое оглавление + +## Советы + +- Если в PDF нет закладок, сначала создайте их инструментом [Редактирование закладок](./bookmark), а затем вернитесь сюда, чтобы создать оглавление. +- Для больших документов больший размер шрифта, например 14 pt или 16 pt, улучшает читаемость. + +## Связанные инструменты + +- [Редактирование закладок](./bookmark) +- [Нумерация страниц](./page-numbers) +- [Колонтитулы](./header-footer) diff --git a/docs/ru/tools/text-color.md b/docs/ru/tools/text-color.md new file mode 100644 index 00000000..e8cbcaa5 --- /dev/null +++ b/docs/ru/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Изменение цвета текста +description: Измените цвет всего текста в PDF на любой выбранный вами цвет. +--- + +# Изменение цвета текста + +Замените цвет текста во всём PDF. Инструмент находит текстовые области на каждой странице и перекрашивает их в выбранный цвет, сохраняя макет документа и нетекстовое содержимое. + +## Как это работает + +1. Загрузите PDF-файл. +2. Выберите новый цвет текста в селекторе цвета. По умолчанию синий (#0000FF). +3. Нажмите **Изменение цвета текста** для обработки. +4. Перекрашенный PDF скачивается автоматически. Индикатор хода показывает, какая страница обрабатывается. + +## Параметры + +- **Новый цвет текста**: палитра для выбора цвета, которым будет заменён весь текст документа. + +## Возможности + +- Перекрашивает текст на каждой странице документа +- Постраничная обработка с индикацией хода +- Палитра с полной поддержкой шестнадцатеричных цветов +- Сохраняет макет страницы и нетекстовые элементы + +## Сценарии использования + +- Замена чёрного текста на тёмно-синий для более мягкого и современного вида документа +- Перекраска текста под фирменный стиль перед рассылкой документов +- Преобразование текста в определённый цвет для соответствия требованиям доступности +- Обеспечение видимости текста на вновь применённом цвете фона + +## Советы + +- Инструмент отрисовывает страницы в масштабе 2x для качества, а затем пересобирает PDF. Результат состоит из изображений, поэтому текст больше нельзя будет выделять и искать. +- Если нужно сохранить выделяемый текст, лучше отредактируйте PDF напрямую в [Редактор PDF](./edit-pdf). +- Время обработки растёт с числом страниц, так как каждая страница отрисовывается отдельно. + +## Связанные инструменты + +- [Цвет фона](./background-color) +- [Инверсия цвета](./invert-colors) +- [Настройка цвета](./adjust-colors) diff --git a/docs/ru/tools/tiff-to-pdf.md b/docs/ru/tools/tiff-to-pdf.md new file mode 100644 index 00000000..f94cf06e --- /dev/null +++ b/docs/ru/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF в PDF +description: Преобразуйте одно- и многостраничные изображения TIFF в PDF в браузере с полной поддержкой страниц. +--- + +# TIFF в PDF + +Преобразуйте файлы TIFF в PDF, включая многостраничные. Каждая страница (или «IFD») TIFF-файла становится отдельной страницей итогового PDF. Это особенно полезно для отсканированных документов, факсов и медицинских изображений, которые обычно хранятся в виде многостраничных TIFF. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите в неё TIFF-файлы. +2. Просмотрите список файлов и при необходимости измените его. +3. Нажмите **Конвертировать в PDF**. Результат скачивается как `from_tiff.pdf`. + +Инструмент декодирует каждый TIFF-файл с помощью JavaScript-декодера TIFF и извлекает необработанные пиксельные данные RGBA каждой страницы. Каждая страница отрисовывается на холсте, экспортируется в PNG и встраивается в PDF. Размеры страниц соответствуют исходным страницам TIFF. + +## Параметры + +У этого инструмента нет дополнительных настроек качества. Изображения встраиваются в исходном разрешении. + +## Сценарии использования + +- Преобразование многостраничных факсов (TIFF-F) в более переносимый формат PDF +- Превращение архивов отсканированных документов в TIFF в PDF с возможностью поиска (затем объедините с инструментом распознавания текста) +- Обработка файлов медицинской визуализации (патологические снимки, экспорт рентгенологии) в формате TIFF +- Преобразование геоинформационных и спутниковых изображений TIFF в документы для обмена + +## Советы + +- Многостраничные TIFF поддерживаются полностью. TIFF из 10 страниц даст PDF из 10 страниц. Предварительно разделять TIFF не нужно. +- Очень большие TIFF-файлы (сотни мегабайт) могут обрабатываться дольше, так как весь файл декодируется в памяти браузера. +- Если нужно распознавание текста в итоговом PDF, после преобразования пропустите его через инструмент [Распознавание текста в PDF](./ocr-pdf). + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [BMP в PDF](./bmp-to-pdf) +- [JPG в PDF](./jpg-to-pdf) diff --git a/docs/ru/tools/txt-to-pdf.md b/docs/ru/tools/txt-to-pdf.md new file mode 100644 index 00000000..103349b0 --- /dev/null +++ b/docs/ru/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Текст в PDF +description: Преобразуйте обычные текстовые файлы или набранный текст в PDF с выбором шрифтов, цветов и размеров страницы. +--- + +# Текст в PDF + +Преобразуйте обычный текст в оформленный PDF. Можно загрузить файлы `.txt` или набрать текст прямо во встроенном редакторе. Поддерживаются несколько шрифтов, произвольные цвета текста и широкий набор размеров страниц: от A0 до A10, а также US Letter, Legal и Tabloid. + +## Поддерживаемые форматы + +| Ввод | Расширения | +| :---------------------- | :------------------------------- | +| Обычные текстовые файлы | `.txt` | +| Прямой ввод текста | Наберите или вставьте в редактор | + +## Как это работает + +1. Выберите режим ввода переключателем вверху: **Загрузить файлы** или **Ввести текст**. +2. При загрузке перетащите или выберите один или несколько файлов `.txt`. При наборе введите текст прямо в текстовое поле. +3. Настройте параметры форматирования: семейство шрифтов, размер шрифта, цвет текста и размер страницы. +4. Нажмите **Создать PDF**. Результат скачивается как `text_to_pdf.pdf`. + +При загрузке нескольких файлов их содержимое объединяется, между ними вставляются пустые строки. + +## Параметры + +| Параметр | Значения | По умолчанию | +| :-------------------- | :--------------------------------------------------------------------------------------- | :--------------- | +| **Семейство шрифтов** | Helvetica (без засечек), Tiro (с засечками), Courier (моноширинный), Times (с засечками) | Helvetica | +| **Размер шрифта** | 6 -- 72 pt | 12 | +| **Цвет текста** | Любой цвет через палитру | Чёрный (#000000) | +| **Размер страницы** | ISO A0--A10, B0--B10, C0--C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Языки с письмом справа налево (арабский, иврит, персидский, урду) определяются автоматически. Когда найден RTL-текст, направление текста и выравнивание переключаются соответственно. + +## Сценарии использования + +- Преобразование фрагментов кода и файлов журналов в печатный PDF шрифтом Courier +- Быстрое создание PDF из заметок встречи, набранных на месте +- Оформление текстовой рукописи определённым шрифтом и размером страницы для подачи +- Создание PDF-версии README или журнала изменений для распространения офлайн + +## Советы + +- Используйте режим **Ввести текст**, когда нужно быстро преобразовать содержимое буфера обмена, не сохраняя его сначала в файл. +- Courier (моноширинный) лучший выбор для кода, журналов и любого содержимого, где важно выравнивание по столбцам. +- Поля страницы фиксированы: 72 пункта (1 дюйм) со всех сторон. + +## Связанные инструменты + +- [Markdown в PDF](./markdown-to-pdf) +- [CSV в PDF](./csv-to-pdf) +- [Word в PDF](./word-to-pdf) diff --git a/docs/ru/tools/unlock-pdf.md b/docs/ru/tools/unlock-pdf.md new file mode 100644 index 00000000..ef27d772 --- /dev/null +++ b/docs/ru/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Разблокировка PDF +description: Снимите защиту паролем с зашифрованных PDF. Поддерживается пакетная расшифровка нескольких файлов с одним паролем. +--- + +# Разблокировка PDF + +Если у вас есть пароль к зашифрованному PDF, этот инструмент полностью снимает шифрование и создаёт разблокированную копию, которую можно открыть без пароля. Если у нескольких PDF один и тот же пароль, их можно расшифровать пакетом. + +## Как это работает + +1. Загрузите один или несколько зашифрованных PDF-файлов. +2. Введите **пароль**, которым защищены файлы. +3. Нажмите **Расшифровка документа**. +4. Один файл скачивается сразу. Если файлов несколько, вы получите ZIP-архив со всеми разблокированными PDF. + +## Возможности + +- Расшифровка одного файла и пакетная расшифровка +- Работает как с паролями пользователя, так и с паролями владельца +- Результат полностью не зашифрован и не содержит остаточных ограничений +- Понятные сообщения об ошибках при неверном пароле или повреждённых файлах +- Учёт успеха и ошибок по каждому файлу в пакетном режиме + +## Чем это отличается от снятия ограничений + +**Разблокировка PDF** требует пароль и снимает всё шифрование. **Снятие ограничений** убирает ограничения на использование (печать, копирование, редактирование) и может не требовать пароля, если задан только пароль владельца. Используйте расшифровку, когда PDF вообще не открывается без пароля. + +## Сценарии использования + +- Окончательно разблокировать PDF, которые вы зашифровали раньше, если пароль больше не нужен +- Снять шифрование с пакета архивных документов для удобного долгосрочного доступа +- Подготовить защищённые паролем PDF для системы документооборота, которая не поддерживает зашифрованные файлы +- Разблокировать PDF перед объединением с другими документами (многие инструменты объединения не работают с зашифрованными файлами) + +## Советы + +- Поле пароля применяется ко всем загруженным файлам. Если у ваших PDF разные пароли, обрабатывайте их отдельными пакетами. +- Если появляется ошибка «Неверный пароль», проверьте, нет ли лишних пробелов в конце и не включён ли Caps Lock. +- После расшифровки файл остаётся без защиты. Если нужен новый пароль, зашифруйте файл снова через «Защита PDF». + +## Связанные инструменты + +- [Защита PDF](./protect-pdf): повторно зашифровать файл с новым паролем +- [Снятие ограничений](./remove-restrictions): снять ограничения на использование без полной расшифровки +- [Изменение разрешений](./change-permissions): изменить отдельные разрешения в зашифрованном PDF diff --git a/docs/ru/tools/validate-signature-pdf.md b/docs/ru/tools/validate-signature-pdf.md new file mode 100644 index 00000000..588eb1b4 --- /dev/null +++ b/docs/ru/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Проверка подписи в PDF +description: Проверьте цифровые подписи в PDF-файлах. Инструмент оценивает действительность сертификата, личность подписавшего, целостность документа и цепочку доверия. +--- + +# Проверка подписи в PDF + +Загрузите подписанный PDF, и инструмент извлечёт все цифровые подписи, определит подписавшего, проверит действительность сертификата и сообщит, изменялся ли документ после подписания. Можно также указать доверенный сертификат для проверки цепочки подписи. + +## Как это работает + +1. Загрузите подписанный PDF-файл. Проверка начнётся автоматически. +2. Инструмент покажет сводку: сколько найдено подписей и сколько из них действительны. +3. Для каждой подписи отображается карточка с именем подписавшего, издателем, датами и статусом. +4. При желании загрузите **доверенный сертификат** (.pem, .crt, .cer, .der), чтобы проверить подпись относительно конкретного корня доверия. Повторная проверка запустится автоматически. + +## Что проверяется + +### Разбор подписи + +Инструмент извлекает из PDF объекты подписи PKCS#7, декодирует структуру ASN.1 и получает сертификат X.509 подписавшего вместе с цепочкой сертификатов, встроенной в подпись. + +### Действительность сертификата + +- **Срок действия**: находится ли сертификат сейчас в пределах срока действия? +- **Определение самоподписанного сертификата**: является ли сертификат собственным издателем? +- **Цепочка доверия**: если указан доверенный сертификат, восходит ли к нему сертификат подписавшего? + +### Криптографическая проверка + +- Инструмент восстанавливает байты, охваченные `/ByteRange` подписи, вычисляет их хеш алгоритмом, заявленным подписавшим, и сравнивает результат с атрибутом `messageDigest` внутри подписи. +- Затем он повторно сериализует подписанные атрибуты как DER SET и проверяет подпись по открытому ключу сертификата подписавшего. +- **Подпись считается действительной, только если пройдены все эти проверки.** Если байты PDF были изменены после подписания или встроенная подпись не соответствует ключу подписавшего, статус будет «Недействительна: криптографическая проверка не пройдена» с указанием конкретной причины. + +#### Поддерживаемые алгоритмы подписи + +| Алгоритм | Путь проверки | +| ----------------------- | ---------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, с резервным вариантом через Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` после преобразования подписи DER → IEEE P1363 | + +Если подпись использует алгоритм не из этого списка (например, Ed25519, SM2 или RSA с необычным OID дайджеста), карточка покажет жёлтым **«Не проверена: неподдерживаемый алгоритм подписи»** с конкретным OID или причиной. Это намеренное разделение на три состояния: + +- **Действительна**: подпись криптографически проверена по открытому ключу подписавшего. +- **Недействительна**: проверка выполнена и дала отрицательный результат (байты изменены, ключ не совпадает). +- **Не проверена**: инструмент не смог выполнить проверку для этого алгоритма. Данные сертификата по-прежнему показываются, но подпись следует считать «неизвестной» и проверить её в Adobe Acrobat или через `openssl cms -verify`. + +### Небезопасные алгоритмы дайджеста + +- Подписи с **MD5 или SHA-1** отклоняются как недействительные и помечаются статусом «Небезопасный хеш». Для обоих алгоритмов опубликованы атаки на коллизии, поэтому подпись по хешу SHA-1 или MD5 не гарантирует целостность. +- SHA-224, SHA-256, SHA-384 и SHA-512 принимаются. + +### Охват документа + +- **Полное покрытие**: подпись охватывает весь PDF-файл, то есть после подписания байты не добавлялись и не менялись. +- **Частичное покрытие**: подпись охватывает только часть файла. Это может указывать на изменения после подписания (не обязательно злонамеренные: инкрементальные сохранения дают частичный охват). + +## Сведения о подписи + +Каждая карточка подписи содержит: + +- **Подписано**: общее имя, организация и адрес электронной почты из сертификата подписавшего +- **Издатель**: центр сертификации, выдавший сертификат подписавшего +- **Дата подписания**: отметка времени, встроенная в подпись +- **Действителен с / Действителен до**: срок действия сертификата +- **Причина**: зачем документ был подписан (если указана) +- **Место**: где он был подписан (если указано) +- **Статус охвата**: полный или частичный +- **Значок доверия**: доверенный или не входит в цепочку доверия (только если указан собственный сертификат) + +### Технические сведения + +Разверните раздел технических сведений, чтобы увидеть: + +- Серийный номер сертификата подписавшего +- Алгоритм дайджеста (SHA-256, SHA-512 и т. д.) +- Алгоритм подписи (RSA с SHA-256, ECDSA с SHA-256 и т. д.) +- Сообщения об ошибках для недействительных подписей + +## Сценарии использования + +- Проверка подписанного цифровой подписью договора перед его встречным подписанием +- Аудит подписанных документов, чтобы убедиться, что они не были подделаны +- Проверка, не истёк ли сертификат с момента подписания документа +- Проверка подписей по корневому сертификату вашей организации +- Изучение сведений о подписи в государственных или юридических документах + +## Советы + +- Самоподписанный сертификат не означает, что подпись недействительна: он означает, что личность подписавшего нельзя подтвердить через доверенную третью сторону. Для внутренних документов это обычное дело. +- Частичное покрытие не всегда говорит о подделке. Во многих процессах работы с PDF добавляются инкрементальные обновления (например, вторая подпись), которые создают частичный охват. +- Загрузите корневой или промежуточный сертификат вашей организации как доверенный, чтобы получить проверку цепочки доверия. + +## Связанные инструменты + +- [Цифровая подпись PDF](./digital-sign-pdf): подписывайте PDF своим сертификатом +- [Сведение документа](./flatten-pdf): сведите PDF перед подписанием, чтобы предотвратить изменения после подписи +- [Удаление метаданных](./remove-metadata): очистите PDF перед добавлением подписи diff --git a/docs/ru/tools/view-metadata.md b/docs/ru/tools/view-metadata.md new file mode 100644 index 00000000..00eb9c96 --- /dev/null +++ b/docs/ru/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Просмотр метаданных +description: Изучите все свойства метаданных PDF, включая сведения о документе, данные XMP и структурные характеристики. +--- + +# Просмотр метаданных + +Изучите скрытые свойства, встроенные в PDF-файл. Инструмент показывает сведения о документе (название, автор, даты), метаданные XMP, размеры страниц и другие структурные данные в удобном виде. + +## Как это работает + +1. Загрузите PDF-файл. +2. Инструмент сразу разбирает файл и показывает все доступные метаданные по разделам. +3. Просмотрите словарь сведений о документе, дерево метаданных XMP и структурные свойства. +4. Отдельный шаг обработки не нужен: метаданные отображаются сразу после загрузки файла. + +## Возможности + +- Показывает стандартные поля сведений о документе: название, автор, тема, ключевые слова, создатель, производитель +- Показывает даты создания и изменения в читаемом формате +- Разбирает и отображает полное дерево метаданных XMP с вложенными пространствами имён +- Преобразует формат даты PDF (`D:20240101120000Z`) в читаемые даты +- Разделы сворачиваются для удобной навигации + +## Разделы метаданных + +| Раздел | Содержимое | +| ------------------------ | ------------------------------------------------------------------------------------------------------ | +| **Сведения о документе** | Название, автор, тема, ключевые слова, создатель, производитель, дата создания, дата изменения | +| **Метаданные XMP** | Полное дерево метаданных на основе XML с пространствами имён Dublin Core, XAP, PDF и пользовательскими | +| **Свойства документа** | Число страниц, версия PDF, размер файла, статус шифрования | + +## Сценарии использования + +- Узнать, кто автор PDF и когда он был изменён в последний раз +- Убедиться, что метаданные заданы правильно, перед публикацией документа +- Проверить PDF на приватность: какие личные данные в них встроены +- Выяснить, какая программа создала или изменила PDF (по полю Producer) +- Проверить метаданные XMP на соответствие требованиям управления цифровыми активами + +## Советы + +- Строки дат PDF, начинающиеся с `D:`, автоматически преобразуются в формат вашего часового пояса. +- Если поля метаданных пустые, значит, создатель PDF просто не задал их. Не во всех PDF есть подробные метаданные. +- Чтобы изменить метаданные после просмотра, используйте [Редактирование метаданных](./edit-metadata). Чтобы удалить их полностью, используйте «Удаление метаданных». + +## Связанные инструменты + +- [Редактирование метаданных](./edit-metadata) +- [Слои PDF OCG](./pdf-layers) +- [Сравнение документов](./compare-pdfs) diff --git a/docs/ru/tools/vsd-to-pdf.md b/docs/ru/tools/vsd-to-pdf.md new file mode 100644 index 00000000..9ed412d2 --- /dev/null +++ b/docs/ru/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD в PDF +description: Конвертируйте диаграммы Microsoft Visio (VSD/VSDX) в PDF прямо в браузере. Бесплатно, конфиденциально, Visio не нужен. +--- + +# VSD в PDF + +Конвертируйте диаграммы Microsoft Visio в PDF без установки Visio. Файлы VSD и VSDX содержат блок-схемы, организационные структуры, схемы сетей и планы помещений, которые большинство людей не может открыть. Этот инструмент превращает их в аккуратные PDF, которые открываются на любом устройстве. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----------- | :--------- | :-------------------------------------------- | +| Visio Binary | `.vsd` | Устаревший формат Visio (Visio 2003 и старше) | +| Visio XML | `.vsdx` | Современный формат Visio (Visio 2013+) | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы VSD или VSDX. В одном пакете можно смешивать оба формата. +2. Проверьте список файлов. Удалите ненужные записи значком корзины или нажмите **Добавить еще файлы**, чтобы добавить ещё диаграммы. +3. Нажмите **Преобразовать в PDF**. Движок на основе LibreOffice загружается в браузере и преобразует каждую диаграмму в PDF, сохраняя фигуры, соединители, подписи и разметку страницы. +4. Одна диаграмма скачивается сразу как PDF. Несколько файлов упаковываются в ZIP-архив `vsd-to-pdf.zip`. + +## Параметры + +Настройка не требуется. Конвертер сохраняет размер и ориентацию страницы из документа Visio. + +## Сценарии использования + +- Просмотр диаграмм Visio от коллеги, если у вас нет лицензии Visio +- Добавление диаграмм сетей или архитектуры в проектную документацию в виде PDF +- Печать организационных структур или схем процессов для раздаточных материалов на встречу +- Архивирование старых файлов VSD из прежних версий Visio в формате, рассчитанном на будущее + +## Советы + +- Многостраничные документы Visio превращаются в многостраничные PDF: каждая страница Visio соответствует странице PDF. +- Файлы VSDX (современный формат на основе XML) обычно конвертируются точнее, чем старые двоичные файлы VSD. +- Движок LibreOffice загружается один раз за сеанс. При первой конвертации придётся немного подождать, последующие файлы обрабатываются быстрее. + +## Связанные инструменты + +- [ODG в PDF](./odg-to-pdf) +- [PUB в PDF](./pub-to-pdf) +- [PSD в PDF](./psd-to-pdf) diff --git a/docs/ru/tools/webp-to-pdf.md b/docs/ru/tools/webp-to-pdf.md new file mode 100644 index 00000000..66e2a21c --- /dev/null +++ b/docs/ru/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP в PDF +description: Конвертируйте изображения WebP в PDF прямо в браузере с настраиваемым качеством сжатия. +--- + +# WebP в PDF + +Конвертируйте изображения в формате Google WebP в PDF. Это особенно удобно, если вы скачали из интернета картинки в WebP и вам нужен более универсальный формат для печати или отправки. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----- | :--------- | +| WebP | `.webp` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы WebP. +2. Проверьте список файлов и удалите лишние. +3. Выберите уровень **Качество PDF**. +4. Нажмите **Конвертировать в PDF**. Результат скачивается как `from_webps.pdf`. + +Внутри каждое изображение WebP декодируется через canvas API браузера, а затем встраивается в PDF с помощью pdf-lib. Поэтому конвертация работает в любом браузере с поддержкой декодирования WebP (это все современные браузеры). + +## Параметры + +**Качество PDF** задаёт степень сжатия при встраивании изображений: + +- **Высокое качество**: сохраняет максимум деталей. +- **Среднее качество** (по умолчанию): сбалансированный результат. +- **Низкое качество**: минимальный размер файла. + +## Сценарии использования + +- Превратить скачанные из интернета картинки WebP в PDF для печати +- Собрать скриншоты WebP из Chrome или Edge в документацию +- Создать PDF-портфолио из изображений, которые дизайнерские инструменты по умолчанию экспортируют в WebP +- Архивировать изображения WebP в более универсально читаемом формате + +## Советы + +- Перед встраиванием в PDF WebP внутри декодируется в PNG, поэтому изображения WebP без потерь сохраняют качество при настройке High. +- Если у вас смесь WebP и других форматов изображений, используйте инструмент [Изображения в PDF](./image-to-pdf): он принимает всё сразу. + +## Связанные инструменты + +- [Изображения в PDF](./image-to-pdf) +- [PNG в PDF](./png-to-pdf) +- [JPG в PDF](./jpg-to-pdf) diff --git a/docs/ru/tools/word-to-pdf.md b/docs/ru/tools/word-to-pdf.md new file mode 100644 index 00000000..95c04672 --- /dev/null +++ b/docs/ru/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word в PDF +description: Конвертируйте документы Word (DOC, DOCX), ODT и RTF в PDF прямо в браузере с полным сохранением форматирования. +--- + +# Word в PDF + +Конвертируйте документы Microsoft Word и совместимые форматы в PDF. Инструмент использует движок LibreOffice, работающий в браузере, который обрабатывает файлы DOC, DOCX, ODT и RTF и сохраняет в результате форматирование, таблицы, изображения, колонтитулы и стили. + +## Поддерживаемые форматы + +| Формат | Расширения | +| :----------------- | :--------- | +| Word (современный) | `.docx` | +| Word (устаревший) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Как это работает + +1. Нажмите на область загрузки или перетащите документы Word. Можно выбрать сразу несколько файлов. +2. Проверьте список файлов и при необходимости измените его. +3. Нажмите **Преобразовать в PDF**. При первом использовании загружается движок LibreOffice (индикатор прогресса показывает состояние инициализации), после чего каждый файл конвертируется. +4. Один файл скачивается сразу как PDF. Несколько файлов упаковываются в `word-converted.zip`. + +## Параметры + +Дополнительных настроек у этого инструмента нет. Движок LibreOffice создаёт результат с профилем экспорта в PDF по умолчанию. + +## Результат + +| Количество файлов | Результат | +| :---------------- | :-------------------------------------------------------------- | +| 1 файл | Скачивание одного PDF (исходное имя файла с расширением `.pdf`) | +| 2 и больше | ZIP-архив (`word-converted.zip`) с одним PDF на каждый файл | + +## Сценарии использования + +- Конвертировать резюме или сопроводительное письмо из DOCX в PDF перед отправкой отклика на вакансию +- Пакетно конвертировать набор договоров или предложений в PDF для передачи клиенту +- Превратить старые файлы `.doc` в современные PDF для долгосрочного архива +- Конвертировать документы совместной работы из Google Docs (экспортированные как DOCX) в PDF +- Получать PDF, готовые к печати, из шаблонов Word, которые используются при автоматической генерации документов + +## Советы + +- Движок LibreOffice загружается один раз за сеанс и кэшируется. При первой конвертации придётся подождать несколько секунд, последующие выполняются намного быстрее. +- Сложное форматирование (макросы, элементы ActiveX, продвинутые SmartArt) может конвертироваться неидеально. Стандартные элементы документа (текст, таблицы, изображения, колонтитулы, сноски) конвертируются надёжно. +- Поскольку инструмент принимает также ODT и RTF, его можно использовать как универсальный конвертер для всех текстовых форматов. + +## Связанные инструменты + +- [ODT в PDF](./odt-to-pdf) +- [RTF в PDF](./rtf-to-pdf) +- [Excel в PDF](./excel-to-pdf) +- [PowerPoint в PDF](./powerpoint-to-pdf) diff --git a/docs/ru/tools/wpd-to-pdf.md b/docs/ru/tools/wpd-to-pdf.md new file mode 100644 index 00000000..56071d34 --- /dev/null +++ b/docs/ru/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD в PDF +description: Конвертируйте документы WordPerfect (WPD) в PDF прямо в браузере с помощью LibreOffice. Бесплатно и конфиденциально. +--- + +# WPD в PDF + +Конвертируйте документы Corel WordPerfect в PDF-файлы. Когда-то WPD был основным форматом текстовых редакторов в юридических фирмах и государственных учреждениях. Если у вас остались старые файлы WordPerfect, которые современные программы не открывают, этот инструмент вернёт их к жизни в виде обычных PDF. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :---------- | :--------- | :------------------------------ | +| WordPerfect | `.wpd` | Все основные версии WordPerfect | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы WPD. Можно выбрать сразу несколько файлов. +2. Проверьте список файлов. Удалите ненужные значком корзины или нажмите **Добавить еще файлы**, чтобы добавить документы. +3. Нажмите **Преобразовать в PDF**. Инструмент загружает в браузере движок конвертации на основе LibreOffice, который разбирает формат WPD и выдаёт PDF. +4. Один файл скачивается сразу как PDF. При пакетной конвертации создаётся ZIP-архив `wpd-to-pdf.zip`. + +## Параметры + +Настройка не требуется. Движок LibreOffice сам обрабатывает форматирование, шрифты и разметку WPD. + +## Сценарии использования + +- Открыть юридические документы десятилетней давности, написанные в WordPerfect +- Конвертировать архивные государственные документы из WPD в современный формат +- Перенести старую библиотеку документов WordPerfect в PDF для долгосрочного хранения +- Отправить файлы WPD получателям, у которых не установлен Corel WordPerfect + +## Советы + +- Движок LibreOffice загружается при первом использовании, на это нужно некоторое время. Последующие конвертации в том же сеансе выполняются быстрее. +- Сложные макросы WPD и коды Reveal Codes не сохраняются, но визуальная разметка, текст и базовое форматирование переносятся в PDF. + +## Связанные инструменты + +- [WPS в PDF](./wps-to-pdf) +- [ODG в PDF](./odg-to-pdf) diff --git a/docs/ru/tools/wps-to-pdf.md b/docs/ru/tools/wps-to-pdf.md new file mode 100644 index 00000000..630734b9 --- /dev/null +++ b/docs/ru/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS в PDF +description: Конвертируйте документы Microsoft Works (WPS) в PDF прямо в браузере. Бесплатно, без регистрации, полностью конфиденциально. +--- + +# WPS в PDF + +Конвертируйте файлы текстового редактора Microsoft Works в PDF. Microsoft Works шёл в комплекте с домашними компьютерами в конце 1990-х и 2000-х, и множество файлов WPS до сих пор лежит на старых жёстких дисках и в архивах почты. Этот инструмент открывает их в браузере и создаёт аккуратные PDF. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :-------------- | :--------- | :-------------------------------------------- | +| Microsoft Works | `.wps` | Файлы текстового редактора из Microsoft Works | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы WPS. Можно загружать несколько файлов. +2. Проверьте список файлов. Значком корзины удаляйте отдельные файлы или нажмите **Добавить еще файлы**, чтобы расширить пакет. +3. Нажмите **Преобразовать в PDF**. В браузере загружается движок на основе LibreOffice и конвертирует каждый документ WPS в PDF. +4. Один файл скачивается сразу как PDF. Несколько файлов упаковываются в ZIP-архив `wps-to-pdf.zip`. + +## Параметры + +Дополнительные настройки не нужны. Конвертер обрабатывает текст, базовое форматирование и встроенные изображения из файла WPS. + +## Сценарии использования + +- Восстановить старые учебные или рабочие документы, сохранённые в формате Microsoft Works +- Открыть вложения WPS из почты, если Microsoft Works не установлен +- Конвертировать архив файлов WPS для переноса в современную систему документооборота +- Распечатать старые документы, которые современные текстовые редакторы не открывают + +## Советы + +- Не путайте файлы Microsoft Works `.wps` с файлами WPS Office. Этот инструмент предназначен именно для старого формата Microsoft Works. +- Движок LibreOffice загружается при первом использовании не мгновенно. После загрузки последующие конвертации в том же сеансе выполняются быстрее. + +## Связанные инструменты + +- [WPD в PDF](./wpd-to-pdf) +- [PUB в PDF](./pub-to-pdf) diff --git a/docs/ru/tools/xml-to-pdf.md b/docs/ru/tools/xml-to-pdf.md new file mode 100644 index 00000000..85586230 --- /dev/null +++ b/docs/ru/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML в PDF +description: Конвертируйте файлы XML в структурированные PDF-документы прямо в браузере. Бесплатно, конфиденциально, без обработки на сервере. +--- + +# XML в PDF + +Конвертируйте файлы данных XML в читаемые структурированные PDF-документы. Исходный XML удобен для машин, но людям его читать трудно. Этот инструмент разбирает дерево XML, находит повторяющиеся структуры данных и отображает их как оформленные таблицы и разделы в PDF формата A4 с альбомной ориентацией. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----- | :--------- | :------------------------------ | +| XML | `.xml` | Любой корректно оформленный XML | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы XML. В одном пакете можно обработать несколько файлов. +2. Проверьте список файлов. Удалите ненужные значком корзины или нажмите **Добавить еще файлы**, чтобы добавить ещё. +3. Нажмите **Преобразовать в PDF**. Инструмент разбирает структуру XML встроенным в браузер DOMParser, анализирует иерархию данных и отрисовывает её в PDF с помощью jsPDF с форматированием auto-table. +4. Один файл скачивается как PDF. Несколько результатов упаковываются в `xml-to-pdf.zip`. + +## Параметры + +Ручная настройка не требуется. Конвертер сам определяет структуру XML и выбирает подходящую раскладку таблиц. Результат выводится в альбомной ориентации A4, чтобы поместились широкие наборы данных. + +## Сценарии использования + +- Превратить выгрузки данных XML из баз данных или API в отчёты для печати +- Получить читаемые сводки из файлов конфигурации XML +- Конвертировать счета или журналы транзакций в формате XML в PDF для хранения +- Сделать карты сайта XML или ленты RSS читаемыми в виде документа + +## Советы + +- XML должен быть корректно оформлен. Если парсер встретит синтаксические ошибки, конвертация завершится сообщением об ошибке с указанием на проблему. +- Глубоко вложенные структуры XML разворачиваются в таблицы. Лучший результат получается, если у данных есть повторяющиеся соседние элементы с одинаковым набором дочерних. +- Во время конвертации отображаются обновления прогресса по каждому этапу: чтение, разбор, анализ и отрисовка. + +## Связанные инструменты + +- [FB2 в PDF](./fb2-to-pdf) +- [XPS в PDF](./xps-to-pdf) +- [Email в PDF](./email-to-pdf) diff --git a/docs/ru/tools/xps-to-pdf.md b/docs/ru/tools/xps-to-pdf.md new file mode 100644 index 00000000..77d32c10 --- /dev/null +++ b/docs/ru/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS в PDF +description: Конвертируйте документы XPS и OXPS в PDF прямо в браузере. Без загрузки на сервер, без регистрации, полностью конфиденциально. +--- + +# XPS в PDF + +Конвертируйте документы Microsoft XPS и OXPS в обычные PDF-файлы. XPS (XML Paper Specification) был ответом Microsoft на PDF, но поддержка этого формата на разных платформах сошла на нет. Этот инструмент снова делает такие документы доступными для всех. + +## Поддерживаемые форматы + +| Формат | Расширение | Примечания | +| :----- | :--------- | :----------------------------------- | +| XPS | `.xps` | Исходный формат Microsoft XPS | +| OXPS | `.oxps` | Open XPS, вариант стандарта ECMA-388 | + +## Как это работает + +1. Нажмите на область загрузки или перетащите файлы XPS/OXPS. Можно выбрать сразу несколько файлов. +2. Проверьте список файлов. Удаляйте отдельные файлы значком корзины или нажмите **Добавить еще файлы**, чтобы добавить документы. +3. Нажмите **Преобразовать в PDF**. Движок PyMuPDF обрабатывает каждый документ локально в вашем браузере. +4. Один файл скачивается сразу как PDF. Несколько файлов упаковываются в ZIP-архив `xps-converted.zip`. + +## Параметры + +Этот инструмент выполняет прямую конвертацию формата без дополнительных настроек. Результат сохраняет исходные размеры страниц, векторную графику, шрифты и изображения из файла XPS. + +## Сценарии использования + +- Открыть файлы XPS, полученные из старых систем Windows, где драйвер печати XPS был выбран по умолчанию +- Конвертировать документы OXPS из Windows 10/11 для отправки пользователям macOS или Linux +- Архивировать старые файлы XPS в более широко поддерживаемом формате +- Сделать документы государственных организаций и компаний в формате XPS доступными для внешних получателей + +## Советы + +- Расширения `.xps` и `.oxps` обрабатываются автоматически, поэтому их можно смешивать в одном пакете. +- Если исходный файл XPS был создан драйвером печати с высоким разрешением, итоговый PDF сохраняет это качество. Передискретизации не происходит. + +## Связанные инструменты + +- [Word в PDF](./word-to-pdf) +- [XML в PDF](./xml-to-pdf) diff --git a/docs/self-hosting/docker.md b/docs/self-hosting/docker.md index 3e19208a..a249f92f 100644 --- a/docs/self-hosting/docker.md +++ b/docs/self-hosting/docker.md @@ -98,27 +98,36 @@ docker run -d -p 3000:8080 bentopdf:custom ## Environment Variables -| Variable | Description | Default | -| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | -| `SIMPLE_MODE` | Build the Self-Hosted variant (hides bentopdf.com marketing chrome — hero, FAQ, testimonials, footer). All PDF tools remain. | `false` | -| `BASE_URL` | Deploy to subdirectory | `/` | -| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM module URL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | -| `VITE_WASM_GS_URL` | Ghostscript WASM module URL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | -| `VITE_WASM_CPDF_URL` | CoherentPDF WASM module URL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | -| `VITE_TESSERACT_WORKER_URL` | OCR worker script URL | _(empty; use Tesseract.js default CDN)_ | -| `VITE_TESSERACT_CORE_URL` | OCR core runtime directory | _(empty; use Tesseract.js default CDN)_ | -| `VITE_TESSERACT_LANG_URL` | OCR traineddata directory | _(empty; use Tesseract.js default CDN)_ | -| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Comma-separated OCR languages exposed in UI | _(empty; show full catalog)_ | -| `VITE_OCR_FONT_BASE_URL` | OCR text-layer font directory | _(empty; use remote Noto font URLs)_ | -| `VITE_DEFAULT_LANGUAGE` | Default UI language | `en` | -| `VITE_BRAND_NAME` | Custom brand name | `BentoPDF` | -| `VITE_BRAND_LOGO` | Logo path relative to `public/` | `images/favicon-no-bg.svg` | -| `VITE_FOOTER_TEXT` | Custom footer/copyright text | `© 2026 BentoPDF. All rights reserved.` | -| `DISABLE_TOOLS` | Comma-separated tool IDs to hide | _(empty; all tools enabled)_ | -| `DISABLE_GITHUB_STARS` | Skip the GitHub star-count fetch on page load and drop `api.github.com` from the CSP. Simple Mode builds always skip it. | `false` | +| Variable | Description | Default | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Build the Self-Hosted variant (hides bentopdf.com marketing chrome — hero, FAQ, testimonials, footer). All PDF tools remain. | `false` | +| `BASE_URL` | Deploy to subdirectory | `/` | +| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM module URL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Ghostscript WASM module URL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | CoherentPDF WASM module URL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | OCR worker script URL | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_CORE_URL` | OCR core runtime directory | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_LANG_URL` | OCR traineddata directory | _(empty; use Tesseract.js default CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Comma-separated OCR languages exposed in UI | _(empty; show full catalog)_ | +| `VITE_OCR_FONT_BASE_URL` | OCR text-layer font directory | _(empty; use remote Noto font URLs)_ | +| `VITE_DEFAULT_LANGUAGE` | Default UI language | `en` | +| `VITE_BRAND_NAME` | Custom brand name | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logo path relative to `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Custom footer/copyright text | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Comma-separated tool IDs to hide | _(empty; all tools enabled)_ | +| `DISABLE_GITHUB_STARS` | Skip the GitHub star-count fetch on page load and drop `api.github.com` from the CSP. Simple Mode builds always skip it. | `false` | +| `SITE_URL` | Public URL written into canonical, hreflang and sitemap links. Leave it at the default unless you want search engines to treat your deployment as its own site. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | With a custom `SITE_URL`, every page is marked `noindex` so your copy doesn't compete with bentopdf.com in search results. Set to `true` to let search engines index it. | `false` | WASM module URLs are pre-configured with CDN defaults — all advanced features work out of the box. Override these for air-gapped or self-hosted deployments. +### Search engines + +By default, every page points search engines to bentopdf.com as the original, so your deployment doesn't show up as a duplicate. You don't need to change anything for a private or internal instance. + +- **Keep your instance out of search results entirely:** run the container with `-e ROBOTS_NOINDEX=true`. This only needs a restart, not a rebuild. +- **Make your instance its own site in search results:** build with `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Without `ALLOW_INDEXING=true`, a custom `SITE_URL` marks every page `noindex`. + ### Content-Security-Policy The nginx image ships with an enforcing `Content-Security-Policy` header. The CSP's `script-src`, `connect-src`, and `font-src` directives are **generated at build time** from the `VITE_*` URL variables above — whatever hosts you pass via `--build-arg` are automatically added to the policy. diff --git a/docs/sk/contributing.md b/docs/sk/contributing.md new file mode 100644 index 00000000..4a3a09e6 --- /dev/null +++ b/docs/sk/contributing.md @@ -0,0 +1,136 @@ +# Prispievanie + +Ďakujeme, že máte záujem prispievať do BentoPDF! Táto príručka vám pomôže začať. + +## Začíname + +### Predpoklady + +- Node.js 18+ +- npm 9+ +- Git + +### Nastavenie + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Štruktúra projektu + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Pridanie nového nástroja + +### Krok 1: Vytvorte súbor s logikou + +Vytvorte `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Krok 2: Vytvorte HTML stránku + +Vytvorte `src/pages/your-tool.html` podľa existujúcich šablón nástrojov. + +### Krok 3: Zaregistrujte nástroj + +Pridajte do `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Krok 4: Pridajte do konfigurácie buildu + +Pridajte stránku do `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Krok 5: Pridajte preklady + +Pridajte záznamy do všetkých jazykových súborov v `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Štýl kódu + +- Pre všetok nový kód používajte TypeScript +- Dodržiavajte existujúce vzory pre konzistentnosť +- Pred odoslaním zmien spustite `npm run format` +- Žiadne komentáre v produkčnom kóde (komentáre sa pri builde odstraňujú) + +## Postup pre pull request + +1. Vytvorte vetvu funkcie: `git checkout -b feature/your-feature` +2. Vykonajte zmeny +3. Dôkladne otestujte: `npm run build` +4. Odošlite PR s jasným popisom + +## Preklady + +Pozrite si [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md), kde nájdete postup pridania nových jazykov. + +## Licenčná zmluva prispievateľa + +Skôr než bude váš PR zlúčený, budete musieť podpísať našu CLA: + +- [Individuálna CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Firemná CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Pomoc + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Komunita na Discorde](https://discord.gg/Bgq3Ay3f2w) + +## Licencia + +BentoPDF má duálnu licenciu: + +- **AGPL-3.0** pre open-source projekty, v ktorých verejne zdieľate celý zdrojový kód +- **Komerčná licencia** pre proprietárne aplikácie so zatvoreným zdrojovým kódom - [Získajte doživotnú licenciu za $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Prispievaním súhlasíte s tým, že vaše príspevky budú licencované za týchto podmienok. diff --git a/docs/sk/getting-started.md b/docs/sk/getting-started.md new file mode 100644 index 00000000..d047ad21 --- /dev/null +++ b/docs/sk/getting-started.md @@ -0,0 +1,80 @@ +# Začíname + +Vitajte v BentoPDF! Táto príručka vám pomôže rýchlo začať. + +## Čo je BentoPDF? + +BentoPDF je bezplatná open-source sada PDF nástrojov zameraná na súkromie, ktorá beží **celá vo vašom prehliadači**. Vaše súbory nikdy neopustia vaše zariadenie, všetko spracovanie prebieha lokálne pomocou technológie WebAssembly (WASM). + +## Rýchly štart + +### Možnosť 1: Použite hostovanú verziu + +Navštívte [bentopdf.com](https://www.bentopdf.com) a používajte BentoPDF okamžite, bez inštalácie. + +### Možnosť 2: Vlastný hosting pomocou Dockera + +> [!IMPORTANT] +> Konverzia súborov Office vyžaduje `SharedArrayBuffer`, ktorý potrebuje obe nasledujúce hlavičky: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - zabezpečený kontext +> +> `http://localhost` funguje pri lokálnom testovaní, pretože prehliadače považujú loopback za dôveryhodný. `http://192.168.x.x` alebo iné adresy LAN zvyčajne nie, preto konverzie Wordu, Excelu a PowerPointu budú pri prístupe z iných zariadení vo vašej sieti vyžadovať HTTPS. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF sa dodáva v dvoch zostaveniach: **Self-Hosted build** (`bentopdf-simple`, použitý vyššie) pre interné nasadenia v tímoch a organizáciách a **Commercial build** (`bentopdf:latest`), ktorý používa samotný bentopdf.com a držitelia komerčnej licencie s verejne dostupnými nasadeniami. Obe obsahujú rovnaké PDF nástroje, Commercial build navyše pridáva hero sekciu bentopdf.com, FAQ, referencie a pätičku. Ak si nie ste istí, použite Self-Hosted build. + +Potom otvorte `http://localhost:3000` vo svojom prehliadači. + +> [!NOTE] +> Ak pripravujete nasadenie OCR v izolovanom prostredí (air-gapped), okrem workera Tesseract, jadra runtime a súborov traineddata musíte interne hostovať aj písma textovej vrstvy OCR. Úplný postup je zdokumentovaný v časti [Vlastný hosting](/sk/self-hosting/), vrátane `VITE_OCR_FONT_BASE_URL` a priloženého adresára `ocr-fonts/`. + +### Možnosť 3: Zostavenie zo zdrojového kódu + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funkcie v kocke + +| Kategória | Nástroje | +| --------------------- | ---------------------------------------------------------------- | +| **Konverzia do PDF** | Word, Excel, PowerPoint, obrázky, Markdown, EPUB, MOBI a ďalšie | +| **Konverzia z PDF** | JPG, PNG, text, Excel, SVG a ďalšie | +| **Úpravy a poznámky** | Podpis, zvýraznenie, začiernenie, vyplnenie formulárov, pečiatky | +| **Organizácia** | Zlúčenie, rozdelenie, otočenie, odstránenie strán, zmena poradia | +| **Optimalizácia** | Kompresia, oprava, zploštenie, OCR | +| **Zabezpečenie** | Šifrovanie, dešifrovanie, odstránenie obmedzení | + +## Podpora prehliadačov + +BentoPDF funguje najlepšie v moderných prehliadačoch: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Ďalšie kroky + +- [Preskúmajte všetky nástroje](/sk/tools/) +- [Vlastný hosting BentoPDF](/sk/self-hosting/) +- [Prispejte do projektu](/sk/contributing) diff --git a/docs/sk/index.md b/docs/sk/index.md new file mode 100644 index 00000000..5bbf0ed3 --- /dev/null +++ b/docs/sk/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Bezplatné open-source PDF nástroje' + tagline: Spracujte PDF úplne vo svojom prehliadači. Bez nahrávania. Bez serverov. Úplné súkromie. + actions: + - theme: brand + text: Začať + link: /sk/getting-started + - theme: alt + text: Zobraziť nástroje + link: /sk/tools/ + - theme: alt + text: Vlastný hosting + link: /sk/self-hosting/ + - theme: alt + text: Komerčná licencia + link: /sk/licensing + +features: + - icon: 🔒 + title: 100% súkromné + details: Vaše súbory nikdy neopustia vaše zariadenie. Všetko spracovanie prebieha lokálne vo vašom prehliadači pomocou WebAssembly. + - icon: ⚡ + title: Rýchle a zadarmo + details: Bez registrácií, bez limitov, bez vodoznakov. Spracujte neobmedzený počet PDF zadarmo, navždy. + - icon: 🛠️ + title: Viac ako 50 nástrojov + details: Konvertujte, upravujte, zlučujte, rozdeľujte, komprimujte, podpisujte, použite OCR a ďalšie. Všetko, čo potrebujete, na jednom mieste. + + - icon: 🌐 + title: Možnosť vlastného hostingu + details: Nasaďte na vlastnej infraštruktúre. Docker, Vercel, Netlify, AWS alebo úplne izolované (air-gapped) prostredia s vlastnými OCR workermi, jazykovými dátami a písmami textovej vrstvy. +--- + +## Offline OCR + +Ak hostujete BentoPDF vo vlastnom izolovanom (air-gapped) alebo offline prostredí, OCR potrebuje viac než worker Tesseract a súbory traineddata. Výstup vo forme PDF s možnosťou vyhľadávania vyžaduje aj to, aby boli písma textovej vrstvy OCR poskytované interne. +Úplný postup, vrátane `VITE_OCR_FONT_BASE_URL`, priloženého adresára `ocr-fonts/` a aktualizovaného postupu pre air-gap, nájdete v časti [Vlastný hosting](/sk/self-hosting/). diff --git a/docs/sk/licensing.md b/docs/sk/licensing.md new file mode 100644 index 00000000..672b6554 --- /dev/null +++ b/docs/sk/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/sk/self-hosting/#konfiguracia-wasm-komponenty-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/sk/self-hosting/apache.md b/docs/sk/self-hosting/apache.md new file mode 100644 index 00000000..f2fe898d --- /dev/null +++ b/docs/sk/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Nasadenie s Apache + +Hosťujte BentoPDF pomocou Apache HTTP Server. + +## Predpoklady + +- Apache 2.4+ +- zapnutý mod_rewrite +- SSL certifikát (odporúčané) + +## Krok 1: Zostavenie projektu + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Ak chcete prispôsobiť značku, pred zostavením nastavte premenné prostredia: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Krok 2: Skopírovanie súborov + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Krok 3: Konfigurácia Apache + +Vytvorte `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Krok 4: .htaccess pre smerovanie + +Vytvorte `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Krok 5: Zapnutie potrebných modulov + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Krok 6: Zapnutie stránky + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Nasadenie do podadresára + +Hosťovanie na `/pdf/`: + +1. Zostavte so základnou URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Upravte `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Riešenie problémov + +### Chyby 404 pri WASM + +Uistite sa, že je nastavený MIME typ: + +```apache +AddType application/wasm .wasm +``` + +### Podpísať PDF alebo Vypĺňanie formulárov zobrazuje prázdny prehliadač (chyba MIME pri `.mjs`) + +Ak konzola prehliadača zobrazuje: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…a zlyhávajúca požiadavka končí na `.mjs`, vo vašej konfigurácii Apache chýba mapovanie `.mjs → application/javascript`. Pribalený PDF prehliadač obsahuje súbory ES modulov s príponou `.mjs` a predvolený `mime.types` v Apache ich štandardne nezahŕňa. + +Pridajte do VirtualHost alebo `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Potom znovu načítajte Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Overenie: v DevTools prehliadača → karta Network nájdite zlyhávajúcu požiadavku `.mjs` a skontrolujte hlavičku odpovede `Content-Type`. Teraz by mala byť `application/javascript`, nie `application/octet-stream`. + +### Prepisovanie nefunguje + +Skontrolujte, či je zapnutý mod_rewrite: + +```bash +sudo a2enmod rewrite +``` + +### Prevod Word/ODT/Excel do PDF nefunguje + +LibreOffice WASM vyžaduje `SharedArrayBuffer`, ktorý potrebuje tieto hlavičky: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Potrebuje aj zabezpečený kontext. `http://localhost` funguje na lokálne testovanie, ale `http://192.168.x.x` alebo iné IP adresy v LAN zvyčajne vyžadujú HTTPS. Ak sú hlavičky prítomné, no `window.crossOriginIsolated` je stále `false`, skontrolujte, či sa stránka neotvára cez obyčajné HTTP na inom pôvode ako loopback. + +Predkomprimované súbory `.wasm.gz` a `.data.gz` tiež potrebujú správne `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Uistite sa, že je zapnutý `mod_headers`: `sudo a2enmod headers` + +### Prístup zamietnutý + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/sk/self-hosting/aws.md b/docs/sk/self-hosting/aws.md new file mode 100644 index 00000000..857f1e68 --- /dev/null +++ b/docs/sk/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Nasadenie na AWS S3 + CloudFront + +Hosťujte BentoPDF na AWS pre maximálnu kontrolu a škálovateľnosť. + +## Architektúra + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Krok 1: Vytvorenie S3 bucketu + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Krok 2: Zostavenie a nahranie + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Krok 3: Vytvorenie CloudFront distribúcie + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Alebo použite AWS Console: + +1. Prejdite do CloudFront → Create distribution +2. Origin domain: vyberte svoj S3 bucket +3. Zapnite „Origin Access Control“ +4. Default root object: `index.html` +5. Vytvorte distribúciu + +## Krok 3b: Politika hlavičiek odpovede (potrebná pre LibreOffice WASM) + +Prevody založené na LibreOffice (Word, Excel, PowerPoint do PDF) vyžadujú `SharedArrayBuffer`, ktorý potrebuje konkrétne hlavičky odpovede. Vytvorte CloudFront Response Headers Policy: + +1. Prejdite do CloudFront → Policies → Response headers +2. Vytvorte vlastnú politiku s týmito hlavičkami: + +| Hlavička | Hodnota | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Pripojte politiku k predvolenému správaniu cache vašej distribúcie + +Alebo cez CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Krok 3c: S3 metadáta pre predkomprimované WASM súbory + +Súbory LibreOffice WASM sú predkomprimované (`.wasm.gz`, `.data.gz`). Nastavte správne Content-Type a Content-Encoding, aby ich prehliadače dekomprimovali: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Dôležité +Bez politiky hlavičiek odpovede nie je `SharedArrayBuffer` dostupný a prevody cez LibreOffice WASM sa zaseknú na ~55 %. Bez správneho Content-Encoding na súboroch `.gz` dostane prehliadač surové gzip bajty a kompilácia WASM zlyhá. +::: + +## Krok 4: Politika S3 bucketu + +Povoľte CloudFront prístup k bucketu: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Krok 5: Vlastné chybové stránky + +Nastavte, aby 404 vracala `index.html` pre smerovanie SPA: + +1. CloudFront → Error pages +2. Vytvorte vlastnú chybovú odpoveď: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Odhad nákladov + +| Zdroj | Odhadované náklady | +| ------------------------- | ------------------ | +| Úložisko S3 (~500MB) | ~$0.01/mesiac | +| CloudFront (1TB prenosu) | ~$85/mesiac | +| CloudFront (10GB prenosu) | ~$0.85/mesiac | + +::: tip +Na optimalizáciu nákladov pri zriedka používaných súboroch použite S3 Intelligent Tiering. +::: + +## Automatizácia s Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/sk/self-hosting/cloudflare.md b/docs/sk/self-hosting/cloudflare.md new file mode 100644 index 00000000..04a12eca --- /dev/null +++ b/docs/sk/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Nasadenie na Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) ponúka rýchly globálny hosting statických stránok s neobmedzeným prenosom dát. + +## Rýchle nasadenie + +1. Prejdite na [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Kliknite na „Create a project“ +3. Pripojte svoj GitHub repozitár + +## Konfigurácia zostavenia + +| Nastavenie | Hodnota | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Premenné prostredia + +Pridajte ich v Settings → Environment variables: + +| Premenná | Hodnota | +| ----------------------- | -------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (voliteľné) | +| `VITE_BRAND_NAME` | Vlastný názov značky (voliteľné) | +| `VITE_BRAND_LOGO` | Cesta k logu relatívne k `public/` (voliteľné) | +| `VITE_FOOTER_TEXT` | Vlastný text päty/copyrightu (voliteľné) | +| `VITE_DEFAULT_LANGUAGE` | Predvolený jazyk rozhrania, napr. `fr` (voliteľné) | + +## Konfiguračný súbor + +Vytvorte `_headers` v priečinku `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Dôležité +Hlavičky `Cross-Origin-Embedder-Policy` a `Cross-Origin-Opener-Policy` sú potrebné na prevody Word/ODT/Excel/PowerPoint do PDF. Bez nich nie je `SharedArrayBuffer` dostupný a engine LibreOffice WASM sa nepodarí inicializovať. +::: + +Vytvorte `_redirects` pre smerovanie SPA: + +``` +/* /index.html 200 +``` + +## Vlastná doména + +1. Prejdite do svojho projektu Pages +2. Kliknite na „Custom domains“ +3. Pridajte svoju doménu +4. Ak je doména na Cloudflare, Cloudflare automaticky nastaví DNS + +## Výhody + +- **Neobmedzený prenos dát zadarmo** +- **Globálne CDN** s viac ako 300 okrajovými lokalitami +- **Automatické HTTPS** +- **Náhľadové nasadenia** pre pull requesty +- **Rýchle zostavenia** + +## Riešenie problémov + +### Nahrávanie veľkých súborov + +Cloudflare Pages podporuje súbory do 25 MB. WASM moduly by mali byť v poriadku, no ak narazíte na limity, zvážte: + +```bash +# Split large files during build +npm run build +``` + +### Limity veľkosti Workera + +Ak používate Cloudflare Workers na pokročilé smerovanie, myslite na limit 1 MB v bezplatných plánoch. + +## CORS proxy Worker (pre digitálne podpisy) + +Nástroj Digitálny podpis potrebuje CORS proxy na získanie reťazcov certifikátov. Nasaďte priložený worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Bezpečnostné funkcie + +| Funkcia | Popis | +| ---------------------------- | -------------------------------- | +| **Obmedzenia URL** | Povolené sú len URL certifikátov | +| **Limit veľkosti súboru** | Max. 10MB na požiadavku | +| **Obmedzenie frekvencie** | 60 pož./IP/min (vyžaduje KV) | +| **Blokovanie súkromných IP** | Blokuje localhost a interné IP | + +### Zapnutie obmedzenia frekvencie + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Zostavenie s URL proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Alebo s Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Poznámka:** Nastavenie HMAC podpisu nájdete v [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required). diff --git a/docs/sk/self-hosting/cors-proxy.md b/docs/sk/self-hosting/cors-proxy.md new file mode 100644 index 00000000..dbef46d1 --- /dev/null +++ b/docs/sk/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS proxy na získavanie certifikátov + +Nástroj na digitálny podpis používa CORS proxy na získavanie certifikátov vydavateľov od externých certifikačných autorít (CA). Je to potrebné, pretože mnohé servery CA vo svojich odpovediach neuvádzajú hlavičky CORS, čo bráni priamemu získaniu v prehliadači. + +Mnohé servery CA navyše poskytujú certifikáty cez obyčajné HTTP. Keď je vaša inštancia BentoPDF hosťovaná cez HTTPS, prehliadače tieto HTTP požiadavky blokujú (politika zmiešaného obsahu). CORS proxy rieši oba problémy tým, že požiadavky smeruje cez HTTPS endpoint so správnymi hlavičkami. + +## Ako to funguje + +Pri podpisovaní PDF certifikátom: + +1. Knižnica `zgapdfsigner` sa pokúsi zostaviť úplný reťazec certifikátov +2. Získava certifikáty vydavateľov z URL vložených v rozšírení AIA (Authority Information Access) vášho certifikátu +3. Tieto požiadavky idú cez CORS proxy, ktorá pridá potrebné hlavičky `Access-Control-Allow-Origin` +4. Proxy vráti údaje certifikátu prehliadaču + +## Vlastné hosťovanie CORS proxy + +Ak BentoPDF hosťujete sami, musíte nasadiť vlastnú CORS proxy, aby digitálne podpisy fungovali s certifikátmi, ktoré vyžadujú získanie reťazca. + +### Možnosť 1: Cloudflare Workers (odporúčané) + +1. **Nainštalujte Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Prihláste sa do Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Naklonujte BentoPDF a upravte povolené pôvody**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Otvorte `cors-proxy-worker.js` a zmeňte pole `ALLOWED_ORIGINS` na svoju doménu: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Dôležité + Bez tejto zmeny proxy odmietne všetky požiadavky z vašej stránky s chybou **403 Forbidden**. Predvolene povoľuje len požiadavky z `bentopdf.com`. + ::: + +4. **Nasaďte proxy**: + + ```bash + wrangler deploy + ``` + + Poznačte si URL svojho workera (napr. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Znovu zostavte BentoPDF s URL proxy**: + + Ak používate Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Ak zostavujete zo zdrojového kódu: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Možnosť 2: Vlastná backendová proxy + +Môžete si vytvoriť aj vlastný proxy endpoint. Požiadavky sú: + +1. Prijíma GET požiadavky s parametrom dotazu `url` +2. Získa URL zo servera (na strane servera neplatia obmedzenia CORS) +3. Vráti odpoveď s týmito hlavičkami: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Príklad implementácie v Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Bezpečnostné hľadiská + +Priložený Cloudflare Worker má niekoľko bezpečnostných opatrení: + +| Funkcia | Popis | +| ---------------------------- | ------------------------------------------------------------------------------------------- | +| **Overenie pôvodu** | Povoľuje len požiadavky z domén uvedených v `ALLOWED_ORIGINS` | +| **Obmedzenia URL** | Povoľuje len URL certifikátov (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blokovanie súkromných IP** | Blokuje súkromné rozsahy IPv4/IPv6, link-local, loopback, desiatkové IP a cloudové metadáta | +| **Bezpečnosť Content-Type** | Vracia len bezpečné MIME typy certifikátov, blokuje vloženie content-type zo zdroja | +| **Limit veľkosti súboru** | Streamuje odpoveď s limitom 10MB, pri prekročení preruší sťahovanie | +| **Obmedzenie frekvencie** | 60 požiadaviek za minútu na IP alebo IPv6 /64 (vyžaduje KV, pri chybách KV prepúšťa) | +| **HMAC podpisy** | Voliteľné podpisovanie na strane klienta (odrádza od bežného zneužitia) | + +### DNS rebinding (vlastné hosťovanie mimo Cloudflare) + +Worker odmietne každú URL, ktorá sa preloží na súkromnú alebo internú IP. Nemôže použiť pevný zoznam povolených hostiteľov, pretože URL reťazca certifikátov smerujú na CA, ktorá certifikát vydala (FNMT, firemné CA a podobne), takže ciele nie sú vopred známe. Zostáva tak malé okno pre rebinding: niekto, kto spravuje DNS svojej domény, môže bezpečnostnej kontrole vrátiť verejnú IP a o chvíľu neskôr skutočnej požiadavke súkromnú. + +Na Cloudflare sa to nedá zneužiť: Workers nedosiahnu súkromné IP ani metadátový endpoint `169.254.169.254`, takže rebind nikam nevedie. Len workerovi neotvárajte cestu dnu: nepripájajte Tunnel, Service ani väzbu na súkromnú sieť (potrebuje iba `RATE_LIMIT_KV`). + +Ak ho prevádzkujete mimo Cloudflare (workerd, Node a podobne) vo VPC, runtime _môže_ dosiahnuť interné IP. Predraďte mu firewall pre odchádzajúcu prevádzku a zablokujte súkromné rozsahy: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` a ich IPv6 ekvivalenty. Mimo Cloudflare to kód aplikácie vynútiť nedokáže. + +## Vypnutie proxy + +Ak nechcete používať CORS proxy, nastavte premennú prostredia na prázdny reťazec: + +``` +VITE_CORS_PROXY_URL= +``` + +**Poznámka**: Bez proxy zlyhá podpisovanie certifikátmi, ktoré vyžadujú externé získanie reťazca (napríklad FNMT alebo niektoré firemné CA), s chybou „Failed to fetch“. + +## Riešenie problémov + +### "Signing error: TypeError: Failed to fetch" + +Zvyčajne to znamená jedno z toho: + +1. **Nie je nastavená CORS proxy**: nastavte `VITE_CORS_PROXY_URL` a znovu zostavte +2. **Zablokovaný zmiešaný obsah**: vaša stránka je na HTTPS, ale URL vydavateľa certifikátu je HTTP. CORS proxy to rieši. +3. **CORS proxy odmieta váš pôvod**: skontrolujte, či je vaša doména v poli `ALLOWED_ORIGINS` v `cors-proxy-worker.js` + +### "403 Forbidden" z proxy + +Vaša doména nie je v zozname `ALLOWED_ORIGINS`. Upravte `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Potom znovu nasaďte: `npx wrangler deploy` + +### Testovanie proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certifikáty, ktoré fungujú bez proxy + +Niektoré certifikáty obsahujú úplný reťazec v súbore P12/PFX a nevyžadujú externé získavanie: + +- Certifikáty podpísané samým sebou +- Niektoré komerčné CA, ktoré pribaľujú medziľahlé certifikáty +- Certifikáty, ktoré ste ručne zostavili s úplným reťazcom diff --git a/docs/sk/self-hosting/docker.md b/docs/sk/self-hosting/docker.md new file mode 100644 index 00000000..9418ee2f --- /dev/null +++ b/docs/sk/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Nasadenie s Docker / Podman + +Najjednoduchší spôsob, ako BentoPDF hosťovať sami v produkčnom prostredí. + +> [!IMPORTANT] +> **Potrebné hlavičky pre prevod súborov Office** +> +> Nástroje založené na LibreOffice (prevod Word, Excel, PowerPoint) vyžadujú pre podporu `SharedArrayBuffer` tieto HTTP hlavičky: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Stránka sa musí poskytovať aj v zabezpečenom kontexte. `http://localhost` funguje na lokálne testovanie, ale `http://192.168.x.x` ani iné IP adresy v LAN zvyčajne nevyhovujú, takže prevod Office cez obyčajné HTTP zlyhá, aj keď hlavičky existujú. +> +> Oficiálne obrazy kontajnerov tieto hlavičky obsahujú. Ak používate reverznú proxy (Traefik, Caddy a pod.), zaistite, aby sa hlavičky zachovali alebo pridali, a pre prístup mimo loopback používajte HTTPS. + +> [!TIP] +> **Používatelia Podman:** Všetky príkazy `docker` fungujú s Podman, ak nahradíte `docker` za `podman` a `docker-compose` za `podman-compose`. + +## Rýchly štart + +> [!TIP] +> BentoPDF sa dodáva v dvoch zostaveniach: +> +> - **Zostavenie Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Všetky PDF nástroje **bez** marketingových prvkov (bez úvodnej sekcie, FAQ, referencií a päty). Použite ho na interné, tímové a firemné nasadenia. **Nie je** to ochudobnená „lite“ verzia. +> - **Komerčné zostavenie**: `ghcr.io/alam00000/bentopdf:latest`. Úplná marketingová stránka, ktorú používa samotné bentopdf.com a držitelia komerčnej licencie s verejnými nasadeniami. +> +> Ak si nie ste istí, stiahnite zostavenie Self-Hosted. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Vytvorte `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Spustite: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Zostavenie vlastného obrazu + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Zostavte a spustite: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Premenné prostredia + +| Premenná | Popis | Predvolené | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Zostaví variant Self-Hosted (skryje marketingové prvky bentopdf.com: úvodnú sekciu, FAQ, referencie, pätu). Všetky PDF nástroje zostanú. | `false` | +| `BASE_URL` | Nasadenie do podadresára | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL modulu PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL modulu Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL modulu CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL skriptu OCR workera | _(prázdne; použije sa predvolené CDN Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Priečinok základného runtime OCR | _(prázdne; použije sa predvolené CDN Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Priečinok OCR traineddata | _(prázdne; použije sa predvolené CDN Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Jazyky OCR zobrazené v rozhraní, oddelené čiarkou | _(prázdne; zobrazí sa celý katalóg)_ | +| `VITE_OCR_FONT_BASE_URL` | Priečinok písiem textovej vrstvy OCR | _(prázdne; použijú sa vzdialené URL písiem Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Predvolený jazyk rozhrania | `en` | +| `VITE_BRAND_NAME` | Vlastný názov značky | `BentoPDF` | +| `VITE_BRAND_LOGO` | Cesta k logu relatívne k `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Vlastný text päty/copyrightu | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID nástrojov na skrytie, oddelené čiarkou | _(prázdne; všetky nástroje zapnuté)_ | +| `DISABLE_GITHUB_STARS` | Vynechá získanie počtu hviezdičiek GitHub pri načítaní stránky a odstráni `api.github.com` z CSP. Zostavenia Simple Mode ho vynechávajú vždy. | `false` | +| `SITE_URL` | Verejná URL zapísaná do odkazov canonical, hreflang a sitemap. Nechajte predvolenú hodnotu, pokiaľ nechcete, aby vyhľadávače považovali vaše nasadenie za samostatnú stránku. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | S vlastnou `SITE_URL` je každá stránka označená `noindex`, aby vaša kópia nekonkurovala bentopdf.com vo výsledkoch vyhľadávania. Nastavte na `true`, ak ju majú vyhľadávače indexovať. | `false` | + +URL WASM modulov sú vopred nastavené na predvolené CDN, takže všetky pokročilé funkcie fungujú hneď. Pri izolovaných (air-gapped) alebo vlastných nasadeniach ich prepíšte. + +### Vyhľadávače + +Predvolene každá stránka označuje pre vyhľadávače bentopdf.com ako originál, takže sa vaše nasadenie nezobrazí ako duplikát. Pri súkromnej alebo internej inštancii nemusíte nič meniť. + +- **Úplne vylúčiť inštanciu z výsledkov vyhľadávania:** spustite kontajner s `-e ROBOTS_NOINDEX=true`. Stačí reštart, nie nové zostavenie. +- **Zobrazovať inštanciu vo výsledkoch vyhľadávania ako samostatnú stránku:** zostavte s `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Bez `ALLOW_INDEXING=true` vlastná `SITE_URL` označí každú stránku ako `noindex`. + +### Content-Security-Policy + +Obraz nginx obsahuje vynucovanú hlavičku `Content-Security-Policy`. Direktívy CSP `script-src`, `connect-src` a `font-src` sa **generujú pri zostavení** z vyššie uvedených URL premenných `VITE_*`, takže hostitelia, ktorých odovzdáte cez `--build-arg`, sa do politiky pridajú automaticky. + +Výsledok: + +- Ak pri zostavení prepíšete `VITE_CORS_PROXY_URL` alebo `VITE_WASM_*_URL`, CSP tieto pôvody automaticky povolí, bez ďalšej konfigurácie. +- Pri URL na `cdn.jsdelivr.net` povoľuje `script-src` len presný priečinok balíka s verziou, napríklad `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, nie celé CDN. jsDelivr poskytuje akýkoľvek verejný npm balík alebo GitHub repozitár, takže povolenie celého hostiteľa by umožnilo spustiť na vašej inštancii ktorýkoľvek z nich. URL na iných hostiteľoch sa povoľujú podľa pôvodu. +- Ak nastavíte vlastné WASM URL _za behu_ na stránke Rozšírené nastavenia v aplikácii, tieto pôvody **nie sú** v CSP a prehliadač požiadavky na ne zablokuje. Platí to aj pre inú verziu toho istého balíka na `cdn.jsdelivr.net`, pretože povolená je len verzia nastavená pri zostavení. Konfigurácia za behu je určená na experimenty; pre trvalé vlastné URL nastavte zodpovedajúci build arg `VITE_*`. +- Izolované nasadenia, ktoré prepíšu všetky tri hodnoty `VITE_WASM_*_URL`, majú tieto priečinky balíkov na `cdn.jsdelivr.net` z CSP odstránené (každá predvolená hodnota sa nahradí, nepridá). Predvolené hodnoty Tesseract OCR na `cdn.jsdelivr.net` zostávajú v politike, kým nenastavíte aj tri hodnoty `VITE_TESSERACT_*`. Podobne nastavenie `VITE_CORS_PROXY_URL` nahradí verejnú predvolenú `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP obsahuje `'unsafe-eval'` v `script-src`, pretože runtime LibreOffice WASM (používaný nástrojmi na prevod Word/Excel/PowerPoint) a knižnica obrázkov wasm-vips (používaná pri PDF do TIFF) kompilujú interný kód cez `new Function()`. Jeho odstránenie by tieto nástroje pokazilo. Ak zostavujete v `SIMPLE_MODE` (bez LibreOffice) a nepotrebujete PDF do TIFF, môžete ručne upraviť vygenerovaný `security-headers.conf` a `'unsafe-eval'` odstrániť pre prísnejšiu politiku. + +Pre OCR nechajte premenné `VITE_TESSERACT_*` prázdne, ak chcete použiť predvolené online zdroje, alebo nastavte všetky tri naraz pre vlastné či offline OCR. Čiastočné prepísanie OCR sa odmietne, pretože worker, základný runtime a priečinok traineddata musia zodpovedať. Pre úplne offline prehľadávateľné PDF nastavte aj `VITE_OCR_FONT_BASE_URL`, aby sa písma textovej vrstvy OCR načítali z vášho interného servera namiesto verejných URL písiem Noto. + +`VITE_DEFAULT_LANGUAGE` nastavuje jazyk rozhrania pre nových návštevníkov. Podporované hodnoty: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Používatelia môžu jazyk stále prepnúť, mení sa len predvolená hodnota. + +Príklad: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Vlastná značka + +Nahraďte predvolené logo, názov a text päty BentoPDF vlastnými. Vložte súbor loga do priečinka `public/` (alebo použite existujúci obrázok) a pri zostavení odovzdajte premenné značky: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Značka funguje v plnom režime aj v Simple Mode a dá sa kombinovať so všetkými ostatnými možnosťami zostavenia. + +### Vypnutie konkrétnych nástrojov + +Skryte nástroje z rozhrania kvôli požiadavkám na súlad alebo bezpečnosť. Vypnuté nástroje sa odstránia z domovskej stránky, výsledkov vyhľadávania, klávesových skratiek a tvorcu pracovných postupov. Priamy prístup cez URL zobrazí stránku „nástroj nie je dostupný“. + +ID nástroja je URL stránky bez `.html`. Napríklad ak je nástroj na `bentopdf.com/edit-pdf.html`, ID je `edit-pdf`. + +#### Zistenie ID nástrojov + +Najjednoduchšie: otvorte ľubovoľný nástroj v BentoPDF a pozrite sa na URL. Posledná časť cesty (bez `.html`) je ID nástroja. + +
+Úplný zoznam ID nástrojov + +**Úpravy a anotácie:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Prevod do PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Prevod z PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organizácia a správa:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimalizácia a oprava:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Zabezpečenie:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Možnosť 1: Pri zostavení (Docker build arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Zoznam vypnutých nástrojov sa zapečie do JavaScript balíka. Zmena vyžaduje nové zostavenie. + +#### Možnosť 2: Za behu (config.json) + +Pripojte súbor `config.json` do poskytovaného priečinka, nové zostavenie netreba: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Alebo s Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Obe metódy sa dajú kombinovať, zoznamy sa zlúčia. Ak je nástroj v ktoromkoľvek z nich, je vypnutý. + +#### Vypnutie funkcií editora + +Môžete vypnúť aj konkrétne funkcie v PDF editore (napr. začiernenie, anotácie, formuláre) bez vypnutia celého editora. Pridajte `editorDisabledCategories` do svojho `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Úplný zoznam kategórií editora + +**Priblíženie:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Anotácie:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Tvary:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formuláre:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Začiernenie:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Dokument:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Strana:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Nástroje:** `tools`, `pan`, `pointer`, `capture` + +**Výber:** `selection`, `selection-copy` + +**História:** `history`, `history-undo`, `history-redo` + +
+ +Kategórie sú hierarchické: vypnutie nadradenej (napr. `annotation`) vypne všetky podradené. + +### Vypnutie počítadla hviezdičiek GitHub + +Navigačná lišta zobrazuje aktuálny počet hviezdičiek na GitHub, ktorý sa pri načítaní stránky získava z `api.github.com`. Je to jediná externá požiadavka, ktorá neslúži žiadnej PDF funkcii. Vypnite ju pri zostavení, čím sa kód požiadavky odstráni z balíka a `api.github.com` z Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Zostavenia Simple Mode (`bentopdf-simple`) počítadlo hviezdičiek vždy vynechávajú, tento prepínač je potrebný len pri komerčnom zostavení alebo vlastných plných zostaveniach. + +### Vlastné WASM URL (izolované / vlastné hosťovanie) + +> [!IMPORTANT] +> WASM URL sa zapečú do JavaScriptu **pri zostavení**. Súbory WASM sťahuje za behu **prehliadač používateľa**, Docker ich počas zostavenia nesťahuje. V izolovaných sieťach musíte súbory WASM hosťovať na internom serveri, ktorý je pre prehliadače dostupný. + +**Úplný postup pre izolované prostredie:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Pre `--ocr-languages` použite kódy, ktoré vypíše `bash scripts/prepare-airgap.sh --list-ocr-languages`, alebo vyhľadávajte podľa názvu cez `bash scripts/prepare-airgap.sh --search-ocr-language `. Keď zostavujete s obmedzenou podmnožinou OCR, odovzdajte rovnaké kódy do `VITE_TESSERACT_AVAILABLE_LANGUAGES`, aby aplikácia zobrazovala len pribalené jazyky. Pre úplne offline výstup OCR hosťujte aj pribalený priečinok `ocr-fonts/` a nasmerujte naň `VITE_OCR_FONT_BASE_URL`. + +Nastavením premennej na prázdny reťazec daný modul vypnete (používatelia ho musia nastaviť ručne v Rozšírených nastaveniach). + +## Vlastný port + +Predvolene BentoPDF v kontajneri počúva na porte `8080`. Ak to chcete zmeniť, nastavte za behu premennú prostredia `PORT`: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Premenná | Popis | Predvolené | +| -------- | ----------------------------------------- | ---------- | +| `PORT` | Port, na ktorom nginx počúva v kontajneri | `8080` | + +Funguje to so štandardným aj s nonroot Dockerfile. + +## Vlastné ID používateľa (PUID/PGID) + +Pre prostredia, ktoré vyžadujú beh pod konkrétnym používateľom bez root práv (zariadenia NAS, Kubernetes s bezpečnostnými kontextmi, firemné politiky), BentoPDF poskytuje samostatný Dockerfile s podporou PUID/PGID v štýle LSIO. + +### Zostavenie a spustenie + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Premenné prostredia + +| Premenná | Popis | Predvolené | +| -------------- | ---------------------------- | ---------- | +| `PUID` | ID používateľa pre beh | `1000` | +| `PGID` | ID skupiny pre beh | `1000` | +| `PORT` | Port, na ktorom nginx počúva | `8080` | +| `DISABLE_IPV6` | Vypne IPv6 listener | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Ako to funguje + +Kontajner sa spustí ako root, vytvorí používateľa so zadaným PUID/PGID, upraví vlastníctvo všetkých zapisovateľných priečinkov a potom sa cez `su-exec` vzdá oprávnení. Proces nginx beží celý pod vami zadaným používateľom. + +> [!NOTE] +> Štandardný `Dockerfile` používa `nginx-unprivileged` (UID 101) a odporúča sa pre väčšinu nasadení. `Dockerfile.nonroot` použite, len ak potrebujete konkrétne UID/GID. + +> [!WARNING] +> PUID/PGID nemôže byť `0` (root). Vstupný bod overuje vstupy a pri neplatných hodnotách skončí s chybou. + +## S Traefik (reverzná proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## S Caddy (reverzná proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Limity zdrojov + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (integrácia so systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) umožňuje spúšťať kontajnery Podman ako služby systemd. Je to ideálne pre produkčné nasadenia na systémoch Linux. + +### Základné nastavenie Quadlet + +Vytvorte súbor jednotky kontajnera v `~/.config/containers/systemd/bentopdf.container` (používateľ) alebo `/etc/containers/systemd/bentopdf.container` (systém): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Zapnutie a spustenie + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Pri celosystémovom nasadení použite `systemctl` bez prepínača `--user` a súbor umiestnite do `/etc/containers/systemd/`. + +### Quadlet s kontrolou stavu + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Automatická aktualizácia s Quadlet + +Podman dokáže automaticky aktualizovať kontajnery, keď sú dostupné nové obrazy: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Sieťová konfigurácia Quadlet + +Pre vlastnú sieťovú konfiguráciu vytvorte sieťový súbor `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Potom sa naň odkážte v súbore kontajnera: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Aktualizácia + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/sk/self-hosting/hostinger.md b/docs/sk/self-hosting/hostinger.md new file mode 100644 index 00000000..e2508e97 --- /dev/null +++ b/docs/sk/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Nasadenie na Hostinger + +[Hostinger](https://hostinger.com) je obľúbený poskytovateľ zdieľaného hostingu. Tento návod popisuje nasadenie BentoPDF na zdieľaný hosting Hostinger. + +## Predpoklady + +- Hostingový plán Hostinger s prístupom k správcovi súborov +- Lokálne nainštalovaný Node.js na zostavenie + +## Krok 1: Zostavenie projektu + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Zostavené súbory budú v priečinku `dist`. + +## Krok 2: Nahranie na Hostinger + +### Nasadenie na koreňovú doménu + +1. Prihláste sa do svojho účtu Hostinger +2. Prejdite do **File Manager** → **public_html** +3. **Odstráňte** existujúce súbory (v prípade potreby si ich zálohujte) +4. **Nahrajte** celý obsah lokálneho priečinka `dist` do `public_html` + +### Nasadenie do podadresára + +Pri nasadení do podadresára (napr. `yourdomain.com/pdf-tools/`): + +1. Zostavte so správnou základnou URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Vytvorte priečinok v Hostinger: + - Prejdite do **File Manager** → **public_html** + - Vytvorte nový priečinok: `pdf-tools` +3. Nahrajte celý obsah `dist` do `public_html/pdf-tools/` + +## Krok 3: Vytvorenie súboru .htaccess + +Vytvorte súbor `.htaccess` v koreni priečinka nasadenia (`public_html` alebo `public_html/pdf-tools/`): + +::: warning Dôležité +Pri nasadení do podadresára zmeňte `RewriteBase /` na `RewriteBase /pdf-tools/` (alebo názov vášho priečinka). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Príklad .htaccess pre podadresár + +Pre `yourdomain.com/pdf-tools/` upravte tieto riadky: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Riešenie problémov + +### Súbory WASM sa nenačítajú + +Uistite sa, že MIME typy sú v `.htaccess` správne nastavené: + +```apache +AddType application/wasm .wasm +``` + +### Nástroje LibreOffice nefungujú + +Bezpečnostné hlavičky sú pre SharedArrayBuffer kľúčové: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Ak sa hlavičky neuplatňujú, požiadajte podporu Hostinger o zapnutie `mod_headers`. + +### Chyby 404 pri obnovení stránky + +Uistite sa, že pravidlo pre príponu `.html` a jazykové trasy sú správne nastavené. BentoPDF používa statické HTML súbory, nie smerovanie SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Limity nahrávania súborov + +Hostinger môže mať limity veľkosti súborov. Ak hromadné nahrávanie zlyhá, nahrajte súbory WASM samostatne. diff --git a/docs/sk/self-hosting/index.md b/docs/sk/self-hosting/index.md new file mode 100644 index 00000000..40d1134d --- /dev/null +++ b/docs/sk/self-hosting/index.md @@ -0,0 +1,538 @@ +# Príručka pre vlastný hosting + +BentoPDF môžete hostovať na vlastnej infraštruktúre. Táto príručka pokrýva rôzne možnosti nasadenia. + +## Rýchly štart s Docker / Podman + +Najrýchlejší spôsob, ako hostovať BentoPDF vo vlastnej réžii: + +> [!TIP] +> BentoPDF sa dodáva v dvoch zostaveniach: +> +> - **Zostavenie Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Všetky PDF nástroje, **bez** marketingových prvkov (bez úvodnej sekcie, FAQ, referencií a päty). Použite ho pre interné, tímové a organizačné nasadenia. **Nie je** to funkčne obmedzená verzia „lite“. +> - **Komerčné zostavenie**: `ghcr.io/alam00000/bentopdf:latest`. Kompletný marketingový web, ktorý používa samotný bentopdf.com a držitelia komerčnej licencie pri verejných nasadeniach. +> +> Ak si nie ste istí, stiahnite zostavenie Self-Hosted. + +> [!IMPORTANT] +> Konverzia súborov Office vyžaduje `SharedArrayBuffer`, čo znamená, že aplikácia musí byť izolovaná z hľadiska cross-origin a zároveň poskytovaná zo zabezpečeného kontextu. Oficiálny obraz už posiela potrebné hlavičky COOP/COEP, prehliadače však `SharedArrayBuffer` stále vypínajú na obyčajných HTTP pôvodoch v lokálnej sieti, ako je `http://192.168.x.x`. +> +> `http://localhost` používajte len na testovanie na tom istom zariadení. Ak používatelia pristupujú k BentoPDF cez IP adresu alebo názov hostiteľa v LAN, zabezpečte ho cez HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Alebo pomocou Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Spustite BentoPDF ako službu systemd. Vytvorte `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Kompletnú dokumentáciu ku Quadlet nájdete v [príručke nasadenia Docker](/sk/self-hosting/docker). + +## Zostavenie zo zdrojového kódu + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Možnosti konfigurácie + +### Zostavenie Self-Hosted (Simple Mode) + +Zostavenie Self-Hosted (obraz `bentopdf-simple`, nazývaný aj Simple Mode) je **funkčne identické** s komerčným zostavením: obsahuje všetky PDF nástroje a tie sa správajú rovnako. Iba skrýva marketingové prvky, ktoré dávajú zmysel len na samotnom bentopdf.com alebo pri komerčnom verejnom nasadení. **Nie je to funkčne obmedzená ani „lite“ verzia.** + +**Čo zostavenie Self-Hosted skrýva** (len kozmetické zmeny, žiadne PDF funkcie sa neodstraňujú): + +- Navigačnú lištu, úvodnú sekciu, sekciu funkcií, FAQ, referencie, pätu +- Mení titulok stránky na „Nástroje PDF“ + +**Čo zostavenie Self-Hosted zachováva** (všetko, čo skutočne pracuje s PDF): + +- Všetky PDF nástroje (spájanie, rozdeľovanie, úpravy, podpisovanie, OCR, konverzia Office atď.) +- Podporu vlastnej značky, všetku konfiguráciu pri zostavení aj za behu + +Komerčné zostavenie (`ghcr.io/alam00000/bentopdf:latest`) poháňa samotný bentopdf.com a používajú ho držitelia komerčnej licencie pri verejných nasadeniach. Pridáva úvodnú sekciu, FAQ, referencie a pätu, ktoré by pri internom nástroji nedávali zmysel. + +Ak hostujete BentoPDF pre svoj tím, organizáciu alebo ako interný nástroj, stiahnite zostavenie Self-Hosted: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Všetky podrobnosti nájdete v [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md). + +### Komerčné zostavenie (verejné nasadenia pod vlastnou značkou) + +Komerčné zostavenie (obraz `bentopdf`, bez prípony `-simple`) poháňa samotný bentopdf.com. Okrem všetkých PDF nástrojov obsahuje kompletný marketingový web (úvodná sekcia, funkcie, FAQ, referencie, päta). Toto zostavenie použite, keď chcete **nasadiť BentoPDF ako verejnú PDF službu pod vlastnou značkou**, napríklad: + +- Prevádzkujete BentoPDF ako hostovanú SaaS službu pre koncových používateľov na vlastnej doméne +- Chcete zážitok úvodnej stránky (marketingové sekcie + nástroje), nie len samotné nástroje +- Ste držiteľom komerčnej licencie a integrujete BentoPDF do komerčného produktu + +**Spustenie bez úprav** (so značkou BentoPDF, užitočné na náhľad zostavenia): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Zostavenie s vlastnou značkou** (typický komerčný postup): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Všetky ostatné možnosti pri zostavení (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, prepísanie URL pre WASM atď.) fungujú rovnako ako pri zostavení Self-Hosted. + +::: warning Licencovanie +Prevádzka komerčného zostavenia je povolená v rámci ktorejkoľvek z dvoch licenčných možností BentoPDF: + +- **AGPL-3.0** (zadarmo): povolené, ak vaše nasadenie zverejní celý svoj zdrojový kód pod AGPL vrátane všetkých úprav značky a súvisiacej obchodnej logiky. +- **Komerčná licencia** (79 $ doživotne): potrebná pre uzavreté / proprietárne nasadenia, kde nezverejňujete svoj fork so značkou ani obchodný kód. + +Úplné porovnanie nájdete na [stránke licencovania](https://www.bentopdf.com/licensing). WASM moduly pod licenciou AGPL (PyMuPDF, Ghostscript, CoherentPDF) sa načítavajú z CDN za behu, takže sa nedostanú do vášho obrazu a nemenia vašu licenčnú pozíciu. +::: + +### Základná URL + +Nasadenie do podadresára: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Vlastná značka + +Pri zostavení nahraďte predvolené logo, názov a text päty BentoPDF vlastnými: + +| Premenná | Popis | Predvolené | +| ------------------ | ----------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Názov značky v hlavičke a päte | `BentoPDF` | +| `VITE_BRAND_LOGO` | Cesta k logu relatívne k `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Vlastný text päty / autorských práv | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Alebo cez Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Vlastná značka funguje v plnom režime aj v Simple Mode a dá sa kombinovať so všetkými ostatnými možnosťami pri zostavení (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Vypnutie konkrétnych nástrojov + +Skryte jednotlivé nástroje z dôvodu súladu s predpismi alebo bezpečnosti. Vypnuté nástroje sa odstránia z domovskej stránky, vyhľadávania, skratiek, nástroja na tvorbu workflow aj z priameho prístupu cez URL. + +ID nástroja je URL stránky bez `.html`: otvorte ľubovoľný nástroj a pozrite sa na URL (napr. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Pri zostavení** (zapečené do balíka): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Za behu** (bez nového zostavenia, stačí pripojiť `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Obe metódy sa dajú kombinovať, zoznamy sa zlúčia. + +V PDF editore môžete vypnúť aj konkrétne funkcie (napr. redigovanie) bez vypnutia celého nástroja, a to pridaním `editorDisabledCategories` do `config.json`. Úplný zoznam kategórií nájdete v [príručke Docker](/sk/self-hosting/docker#vypnutie-funkcii-editora). + +## Príručky nasadenia + +Vyberte si platformu: + +- [Vercel](/sk/self-hosting/vercel) +- [Netlify](/sk/self-hosting/netlify) +- [Cloudflare Pages](/sk/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/sk/self-hosting/aws) +- [Hostinger](/sk/self-hosting/hostinger) +- [Nginx](/sk/self-hosting/nginx) +- [Apache](/sk/self-hosting/apache) +- [Docker](/sk/self-hosting/docker) +- [Kubernetes](/sk/self-hosting/kubernetes) +- [CORS proxy](/sk/self-hosting/cors-proxy) - Potrebný pre digitálne podpisy + +## Časté problémy + +### Konverzia Word / ODT / Excel / PowerPoint do PDF zamrzne (SharedArrayBuffer nie je dostupný) + +**Príznak**: Konverzie dokumentov založené na LibreOffice (Word, ODT, Excel, PowerPoint do PDF) zamrznú na ~55 % alebo sa vôbec nespustia. Konzola prehliadača môže zobraziť: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…alebo `window.crossOriginIsolated` hlási `false`, alebo kompilácia WASM hlási `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Príčina**: LibreOffice WASM vyžaduje `SharedArrayBuffer`, ktorý prehliadač povolí, len keď je stránka **izolovaná z hľadiska cross-origin** A ZÁROVEŇ poskytovaná zo **zabezpečeného kontextu**. Musia teda platiť dve veci: + +1. Každá odpoveď obsahuje obe hlavičky: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Stránka sa poskytuje z `https://...` alebo `http://localhost`. Obyčajné HTTP na IP adrese v LAN (napr. `http://192.168.x.x`) sa NEPOVAŽUJE za zabezpečené, prehliadače tam `SharedArrayBuffer` vypínajú. + +Nezhoda `00 61 73 6d / 1f 8b 08 08` je samostatný čiastkový príznak: vopred skomprimovaným súborom `.wasm.gz` / `.data.gz` chýba hlavička odpovede `Content-Encoding: gzip`, takže prehliadač dostane surové gzip bajty namiesto dekomprimovaného WASM. + +**Riešenie**: presnú konfiguráciu nájdete v príručke nasadenia pre vašu platformu: + +- [Nginx →](/sk/self-hosting/nginx#konverzia-word-odt-excel-do-pdf-nefunguje) +- [Apache →](/sk/self-hosting/apache#prevod-word-odt-excel-do-pdf-nefunguje) +- [AWS S3 + CloudFront →](/sk/self-hosting/aws#krok-3b-politika-hlaviciek-odpovede-potrebna-pre-libreoffice-wasm) +- [Cloudflare Pages →](/sk/self-hosting/cloudflare#konfiguracny-subor) (súbor `_headers`) +- [Netlify →](/sk/self-hosting/netlify#konverzia-word-odt-excel-do-pdf-sa-zasekne-na-55) (`netlify.toml`) +- [Vercel →](/sk/self-hosting/vercel#konverzia-word-odt-excel-do-pdf-nefunguje) (`vercel.json`) +- [Hostinger →](/sk/self-hosting/hostinger#nastroje-libreoffice-nefunguju) (`.htaccess`) +- [Kubernetes →](/sk/self-hosting/kubernetes#ako-zabezpecit-aby-hlavicky-sharedarraybuffer-stale-fungovali-ingress-gateway) +- **Docker**: rieši sa automaticky pribalenou konfiguráciou nginx, nie je potrebný žiadny zásah. + +**Overenie**: otvorte konzolu DevTools na ľubovoľnej stránke BentoPDF a spustite: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Ak je stránka na HTTPS alebo `http://localhost` A ZÁROVEŇ sú na každej odpovedi prítomné obe hlavičky COEP/COOP, obe kontroly prejdú. Ak ste na `http://192.168.x.x` alebo inom HTTP pôvode mimo loopback, zabezpečte ho cez HTTPS, riešenie len pomocou hlavičiek neexistuje. + +### Súbory `.mjs` sa poskytujú ako `application/octet-stream` + +**Príznak**: Podpísať PDF / Vyplňovač formulárov / niektoré ďalšie nástroje zobrazia prázdny prehliadač alebo sa nenačítajú. Konzola prehliadača hlási: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Príčina**: Váš webový server alebo reverzný proxy nemá mapovanie MIME typu pre súbory `.mjs` (pribalený PDF prehliadač dodáva ES moduly s touto príponou). Mnohé štandardné konfigurácie serverov používajú pre neznáme prípony predvolene `application/octet-stream` a prehliadače ich odmietnu spustiť ako ES moduly. + +**Riešenie**: presný úryvok nájdete v príručke nasadenia pre vašu platformu: + +- [Nginx →](/sk/self-hosting/nginx#podpisat-pdf-alebo-vyplnovac-formularov-zobrazuje-prazdny-prehliadac-chyba-mime-mjs) +- [Apache →](/sk/self-hosting/apache#podpisat-pdf-alebo-vyplnanie-formularov-zobrazuje-prazdny-prehliadac-chyba-mime-pri-mjs) +- [AWS S3 + CloudFront →](/sk/self-hosting/aws#krok-2-zostavenie-a-nahranie) (pozri `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/sk/self-hosting/kubernetes#chyby-mime-typu-mjs-prazdny-iframe-v-podpisat-pdf-vyplnovac-formularov) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: rieši sa automaticky, nie je potrebný žiadny zásah. + +**Overenie**: otvorte DevTools → kartu Network, nájdite zlyhávajúcu požiadavku `.mjs` a skontrolujte hlavičku odpovede `Content-Type`. Mala by byť `application/javascript`. Ak je stále `application/octet-stream`, typ môže znova určovať vonkajší reverzný proxy alebo CDN, skontrolujte každú vrstvu v reťazci. + +## Konfigurácia WASM (komponenty AGPL) + +BentoPDF **nepribaľuje** knižnice na spracovanie pod licenciou AGPL do svojho zdrojového kódu, ale **má predkonfigurované URL adresy CDN**, takže všetky funkcie fungujú hneď po inštalácii, bez ručného nastavovania. + +::: tip Predvolene bez konfigurácie +Od verzie v2.0.0 sú WASM moduly predkonfigurované tak, aby sa načítavali z CDN jsDelivr cez premenné prostredia. Všetky pokročilé funkcie fungujú okamžite bez akejkoľvek konfigurácie zo strany používateľa. +::: + +| Komponent | Licencia | Funkcie | +| --------------- | -------- | ------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Konverzia EPUB/MOBI/FB2/XPS, extrakcia obrázkov, extrakcia tabuliek | +| **Ghostscript** | AGPL-3.0 | Konverzia do PDF/A, kompresia, vyrovnanie, rasterizácia | +| **CoherentPDF** | AGPL-3.0 | Obsah, prílohy, spájanie PDF so záložkami | + +### Predvolené premenné prostredia + +Sú nastavené v `.env.production` a zapečené do zostavenia: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Prepísanie URL adries WASM + +Pre vlastné nasadenia môžete predvolené hodnoty prepísať pri zostavení: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Ak chcete modul úplne vypnúť (vyžaduje ručnú konfiguráciu používateľom v Pokročilých nastaveniach), nastavte jeho premennú na prázdny reťazec. + +Pre OCR buď nechajte všetky premenné `VITE_TESSERACT_*` prázdne a ponechajte predvolené online zdroje, alebo nastavte URL pre worker/core/lang spolu pre vlastné hostované / offline OCR. Ak pribalíte len konkrétne jazyky OCR, nastavte aj `VITE_TESSERACT_AVAILABLE_LANGUAGES` na rovnaké kódy oddelené čiarkami, aby rozhranie ponúkalo len nainštalované jazyky a nepodporovaný výber zlyhal s popisnou chybou. Pre úplne offline výstup prehľadávateľného PDF nastavte aj `VITE_OCR_FONT_BASE_URL` na interný adresár, ktorý poskytuje pribalené OCR písma. + +Používatelia môžu tieto predvolené hodnoty kedykoľvek prepísať aj v **Pokročilých nastaveniach** v rozhraní: používateľské nastavenia uložené v prehliadači majú prednosť pred predvolenými hodnotami prostredia. + +### Nasadenie v izolovanej sieti (air-gapped) / offline + +Pre siete bez prístupu na internet (štátna správa, zdravotníctvo, financie atď.). URL adresy WASM sa zapečú do JavaScriptu **pri zostavení**, samotné WASM súbory sťahuje **prehliadač používateľa** za behu. Preto musíte všetko pripraviť na počítači s internetom a potom to preniesť do izolovanej siete. + +#### Automatizovaný skript (odporúčané) + +Priložený skript `prepare-airgap.sh` automatizuje celý proces: stiahne WASM balíky, zostaví Docker obraz a vytvorí samostatný balík s inštalačným skriptom. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Vznikne adresár s balíkom: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Preneste balík do izolovanej siete cez USB, interný repozitár artefaktov alebo schválenou metódou. Potom spustite priložený inštalačný skript: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Inštalačný skript načíta Docker obraz, rozbalí WASM súbory a voliteľne spustí kontajner. + +**Možnosti skriptu:** + +| Prepínač | Popis | Predvolené | +| ------------------------------ | ---------------------------------------------------- | --------------------------------- | +| `--wasm-base-url ` | Kde budú WASM súbory interne hostované | _(povinné, ak chýba, vyžiada sa)_ | +| `--image-name ` | Tag Docker obrazu | `bentopdf` | +| `--output-dir ` | Výstupný adresár balíka | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Zapnúť Simple Mode | vypnuté | +| `--base-url ` | Základná URL podadresára (napr. `/pdf/`) | `/` | +| `--language ` | Predvolený jazyk rozhrania (napr. `fr`, `de`) | _(žiadne)_ | +| `--brand-name ` | Vlastný názov značky | _(žiadne)_ | +| `--brand-logo ` | Cesta k logu relatívne k `public/` | _(žiadne)_ | +| `--footer-text ` | Vlastný text päty | _(žiadne)_ | +| `--ocr-languages ` | Jazyky OCR na pribalenie, oddelené čiarkami | `eng` | +| `--list-ocr-languages` | Vypíše podporované kódy a názvy OCR a skončí | vypnuté | +| `--search-ocr-language ` | Vyhľadá kódy OCR podľa názvu alebo skratky | vypnuté | +| `--dockerfile ` | Použitý Dockerfile | `Dockerfile` | +| `--skip-docker` | Preskočiť zostavenie a export Docker obrazu | vypnuté | +| `--skip-wasm` | Preskočiť sťahovanie WASM (použiť existujúce `.tgz`) | vypnuté | + +Interaktívna výzva prijíma aj `list` na vypísanie celého zoznamu podporovaných kódov Tesseract a `search ` na hľadanie zhôd, napríklad `search german` alebo `search chi`. + +::: warning Požiadavka na rovnaký pôvod +WASM súbory musia byť poskytované z **rovnakého pôvodu** ako aplikácia BentoPDF. Web Workers používajú `importScripts()`, ktorý nedokáže načítať skripty z iného pôvodu. Ak napríklad BentoPDF beží na `https://internal.example.com`, základná URL pre WASM by mala byť tiež `https://internal.example.com/wasm`. +::: + +#### Ručný postup + +
+Ak to chcete urobiť ručne bez skriptu + +**Krok 1: Stiahnite balíky WASM a OCR** (na počítači s internetom) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Krok 2: Zostavte Docker obraz s internými URL adresami** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Krok 3: Exportujte Docker obraz** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Krok 4: Preneste súbory do izolovanej siete** + +Skopírujte cez USB, interný repozitár artefaktov alebo schválenou metódou prenosu: + +- `bentopdf.tar`: Docker obraz +- Päť balíkov WASM/OCR `.tgz` z kroku 1 +- Adresár `tesseract-langdata/` z kroku 1 +- Adresár `ocr-fonts/` z kroku 1 + +**Krok 5: Nastavenie v izolovanej sieti** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Uistite sa, že súbory sú dostupné na URL adresách nastavených v kroku 2 vrátane `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` a `.../ocr/fonts`. + +
+ +::: info Zostavujete zo zdrojového kódu namiesto Docker? +Pred spustením `npm run build` nastavte premenné v `.env.production`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Hostovanie vlastného WASM proxy + +Ak potrebujete poskytovať AGPL WASM súbory so správnymi hlavičkami CORS, môžete nasadiť jednoduchý proxy. Príklad implementácie nájdete v [príručke Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md). + +::: tip Prečo oddelene? +Toto oddelenie zaručuje: + +- Jasný súlad s licenciami pre komerčných používateľov +- Jadro BentoPDF zostáva pod duálnou licenciou (AGPL-3.0 / komerčná) +- WASM súbory sa načítavajú za behu, nie sú pribalené v zdrojovom kóde + ::: + +## Systémové požiadavky + +| Požiadavka | Minimum | +| ---------- | -------------------------------- | +| Úložisko | ~100 MB (jadro bez modulov AGPL) | +| RAM | 512 MB | +| CPU | Akýkoľvek moderný procesor | + +::: tip +BentoPDF je statický web, nepotrebuje žiadnu databázu ani backendový server! +::: diff --git a/docs/sk/self-hosting/kubernetes.md b/docs/sk/self-hosting/kubernetes.md new file mode 100644 index 00000000..2f43e09d --- /dev/null +++ b/docs/sk/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Nasadenie pomocou Kubernetes + +Kubernetes môže byť pre statický web zbytočne veľa, no môže sa výborne hodiť, ak už štandardne používate Helm + GitOps. + +> [!IMPORTANT] +> **Povinné hlavičky pre konverziu súborov Office** +> +> Nástroje založené na LibreOffice (konverzia Word, Excel, PowerPoint) vyžadujú pre podporu `SharedArrayBuffer` tieto HTTP hlavičky: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Oficiálne nginx obrazy BentoPDF tieto hlavičky obsahujú. V Kubernetes sú **kontroléry Ingress/Gateway tiež reverzné proxy**, preto sa uistite, že sa tieto hlavičky zachovajú (alebo ich pridajte na okraji siete). + +## Predpoklady + +- Klaster Kubernetes +- Helm v3 +- Nginx obraz BentoPDF (napr. `ghcr.io/alam00000/bentopdf:`), ktorý počúva na **porte 8080** + +## Nasadenie pomocou Helm + +### Inštalácia z tohto repozitára (lokálny chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Inštalácia z GHCR (OCI chart) + +Ak je chart publikovaný v GHCR ako OCI artefakt: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Sprístupnenie + +### Port-forward (rýchly test) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (voliteľné) + +Zapnite Ingress (príklad pre nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (voliteľné) + +Tento chart podporuje Gateway API `Gateway` + `HTTPRoute`. + +Príklad (operátor Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Ako zabezpečiť, aby hlavičky SharedArrayBuffer stále fungovali (Ingress/Gateway) + +### Čo by sa „malo“ diať + +Konfigurácia nginx v BentoPDF nastavuje potrebné hlavičky odpovede. Väčšina kontrolérov Ingress/Gateway **odovzdáva hlavičky odpovede z upstreamu bez zmeny**. + +### Čo to môže pokaziť + +- Politika kontroléra alebo okraja siete, ktorá hlavičky odpovede **prepisuje** alebo **odstraňuje** +- Middleware „bezpečnostných hlavičiek“, ktorý nastavuje iné hodnoty COOP/COEP + +### Ako overiť + +Spustite toto proti svojmu verejnému endpointu: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Mali by ste vidieť: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Ak ich váš kontrolér Ingress nezachováva + +Pridajte hlavičky na okraji siete (podľa konkrétneho kontroléra). Príklad pre **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Chyby MIME typu `.mjs` (prázdny iframe v Podpísať PDF / Vyplňovač formulárov) + +Ak konzola prehliadača pri požiadavke `.mjs` zobrazí `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"`, kontrolér Ingress/Gateway pred nginx BentoPDF nahrádza hlavičku `Content-Type` z upstreamu hodnotou `application/octet-stream`. + +Nginx v obraze BentoPDF už poskytuje `.mjs` ako `application/javascript`. Riešením je zabrániť kontroléru, aby ju odstraňoval alebo nahrádzal. Pre nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Alebo v Gateway API použite filter `ResponseHeaderModifier` na nastavenie `Content-Type: application/javascript` pre cesty `.mjs`. Overte to v DevTools → karta Network: zlyhaná požiadavka `.mjs` by teraz mala zobrazovať `content-type: application/javascript`. + +### Ak používate Gateway API a chcete hlavičky pridať vynútene + +Gateway API podporuje filter `ResponseHeaderModifier`. Môžete ho pripojiť v `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Podpora konkrétnych filtrov závisí od vášho kontroléra Gateway; ak sa filter ignoruje, pridajte hlavičky na vrstve okraja siete alebo kontroléra. + +## Vypnutie konkrétnych nástrojov + +Na vypnutie nástrojov za behu bez nového zostavenia obrazu použite ConfigMap: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Pripojte ho do poskytovaného adresára: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +ID nástroja je URL stránky bez `.html`: otvorte ľubovoľný nástroj a pozrite sa na URL (napr. `edit-pdf`, `merge-pdf`, `compress-pdf`). Vypnuté nástroje sa skryjú z domovskej stránky, vyhľadávania, skratiek, nástroja na tvorbu workflow aj z priameho prístupu cez URL. Úplný zoznam možností nájdete v [príručke Docker](/sk/self-hosting/docker#vypnutie-konkretnych-nastrojov). diff --git a/docs/sk/self-hosting/netlify.md b/docs/sk/self-hosting/netlify.md new file mode 100644 index 00000000..8419caf4 --- /dev/null +++ b/docs/sk/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Nasadenie na Netlify + +[Netlify](https://netlify.com) ponúka výborný hosting statických webov so štedrým bezplatným plánom. + +## Nasadenie jedným kliknutím + +[![Nasadiť na Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Ručné nasadenie + +### Krok 1: Pripojte repozitár + +1. Prihláste sa do [Netlify](https://app.netlify.com) +2. Kliknite na „Add new site“ → „Import an existing project“ +3. Pripojte svoj účet GitHub +4. Vyberte svoj fork BentoPDF + +### Krok 2: Nakonfigurujte nastavenia zostavenia + +| Nastavenie | Hodnota | +| ------------------ | --------------- | +| Príkaz zostavenia | `npm run build` | +| Publikačný adresár | `dist` | +| Verzia Node | 18+ | + +### Krok 3: Nasaďte + +Kliknite na „Deploy site“ a počkajte na zostavenie. + +## Konfiguračný súbor + +V koreňovom adresári projektu vytvorte `netlify.toml`: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Dôležité +Hlavičky `Cross-Origin-Embedder-Policy` a `Cross-Origin-Opener-Policy` sú potrebné pre konverzie Word/ODT/Excel/PowerPoint do PDF. Bez nich nie je `SharedArrayBuffer` dostupný a engine LibreOffice WASM sa nepodarí inicializovať. + +Hlavičky `Content-Encoding: gzip` pri súboroch `.wasm.gz` a `.data.gz` hovoria prehliadaču, aby ich automaticky dekomprimoval. Bez nich prehliadač dostane surové gzip bajty a kompilácia WASM zlyhá. +::: + +## Premenné prostredia + +Nastavte ich v Site settings → Environment variables: + +| Premenná | Popis | +| ----------------------- | --------------------------------------------------------------- | +| `SIMPLE_MODE` | Nastavte na `true` pre minimálne zostavenie | +| `VITE_BRAND_NAME` | Vlastný názov značky (nahrádza „BentoPDF“) | +| `VITE_BRAND_LOGO` | Cesta k logu relatívne k `public/` (napr. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Vlastný text päty / autorských práv | +| `VITE_DEFAULT_LANGUAGE` | Predvolený jazyk rozhrania (napr. `fr`, `de`, `es`) | + +## Vlastná doména + +1. Prejdite do Site settings → Domain management +2. Kliknite na „Add custom domain“ +3. Postupujte podľa pokynov na konfiguráciu DNS + +## Veľké médiá + +Pre veľké WASM súbory zvážte zapnutie [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Riešenie problémov + +### Konverzia Word/ODT/Excel do PDF sa zasekne na 55 % + +Ak sa konverzie dokumentov zaseknú na 55 %, otvorte konzolu DevTools a skontrolujte: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Ak je `crossOriginIsolated` `false`, hlavičky COEP/COOP z vášho `netlify.toml` sa neuplatňujú. Uistite sa, že súbor je v koreňovom adresári projektu, a nasaďte znova. + +Ak v konzole vidíte `expected magic word 00 61 73 6d, found 1f 8b 08 08`, súborom `.wasm.gz` chýbajú hlavičky `Content-Encoding: gzip`. Uistite sa, že bloky `[[headers]]` pre `soffice.wasm.gz` a `soffice.data.gz` sú vo vašom `netlify.toml`. + +### Zostavenie zlyhá + +Skontrolujte kompatibilitu verzie Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Pomalé prvé načítanie + +Zapnite optimalizáciu zdrojov v Site settings → Build & deploy → Asset optimization. diff --git a/docs/sk/self-hosting/nginx.md b/docs/sk/self-hosting/nginx.md new file mode 100644 index 00000000..02d1f857 --- /dev/null +++ b/docs/sk/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Nasadenie pomocou Nginx + +Hostujte BentoPDF na vlastnom serveri pomocou Nginx. + +## Predpoklady + +- Server Ubuntu/Debian +- Nainštalovaný Nginx +- SSL certifikát (odporúčané: Let's Encrypt) + +## Krok 1: Zostavte projekt + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Ak chcete prispôsobiť značku, pred zostavením nastavte premenné prostredia: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Krok 2: Skopírujte súbory + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Krok 3: Konfigurácia Nginx + +Vytvorte `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Krok 4: Zapnite web + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Krok 5: SSL s Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Nasadenie do podadresára + +Hostovanie na `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Zostavte pomocou: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Ladenie výkonu + +Pridajte do `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Riešenie problémov + +### WASM sa nenačítava + +Uistite sa, že je nastavený MIME typ: + +```nginx +types { + application/wasm wasm; +} +``` + +### Podpísať PDF alebo Vyplňovač formulárov zobrazuje prázdny prehliadač (chyba MIME `.mjs`) + +Ak konzola prehliadača zobrazí: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…a zlyhávajúca požiadavka končí na `.mjs`, vášmu nginx chýba mapovanie `.mjs → application/javascript`. Pribalený PDF prehliadač (používaný nástrojmi Podpísať PDF, Vyplňovač formulárov a niekoľkými ďalšími) dodáva súbory ES modulov s príponou `.mjs` a štandardný `mime.types` v nginx ich predvolene neobsahuje. + +Opravte to pridaním `mjs` do existujúceho riadka `application/javascript` v `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> NEPRIDÁVAJTE _druhý_ riadok `application/javascript`: nginx spracúva `mime.types` riadok po riadku a vyhrá len jedno mapovanie typu na príponu, takže druhý riadok sa v niektorých verziách potichu ignoruje. Upravte existujúci riadok a pridajte `mjs` vedľa `js`. + +Alebo ho prepíšte lokálne vo vašom bloku server (bez úpravy globálneho súboru): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Po zmene znova načítajte nginx: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Na overenie: v DevTools prehliadača → karta Network nájdite zlyhávajúcu požiadavku `.mjs` a skontrolujte hlavičku odpovede `Content-Type`. Teraz by mala byť `application/javascript`, nie `application/octet-stream`. + +### Konverzia Word/ODT/Excel do PDF nefunguje + +LibreOffice WASM vyžaduje `SharedArrayBuffer`, ktorý potrebuje hlavičky `Cross-Origin-Embedder-Policy` a `Cross-Origin-Opener-Policy`. Potrebuje aj zabezpečený kontext, takže `http://localhost` funguje na lokálne testovanie, ale `http://192.168.x.x` alebo iné IP adresy v LAN zvyčajne vyžadujú HTTPS. Pozor: direktívy nginx `add_header` v bloku `location` **prepisujú** direktívy `add_header` na úrovni servera, nezlučujú sa. Každý blok `location` s vlastným `add_header` musí obsahovať hlavičky COEP/COOP. + +Overte pomocou: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Ak pred nginx používate reverzný proxy, uistite sa, že tieto hlavičky zachováva. + +### 502 Bad Gateway + +Skontrolujte chybové logy Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/sk/self-hosting/vercel.md b/docs/sk/self-hosting/vercel.md new file mode 100644 index 00000000..52119b1b --- /dev/null +++ b/docs/sk/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Nasadenie na Vercel + +[Vercel](https://vercel.com) ponúka najjednoduchšie nasadenie statických webov. + +## Nasadenie jedným kliknutím + +[![Nasadiť cez Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Ručné nasadenie + +### Krok 1: Vytvorte fork repozitára + +Vytvorte fork [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) do svojho účtu GitHub. + +### Krok 2: Importujte do Vercel + +1. Prejdite na [vercel.com/new](https://vercel.com/new) +2. Vyberte svoj fork repozitára +3. Nakonfigurujte projekt: + +| Nastavenie | Hodnota | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Krok 3: Premenné prostredia (voliteľné) + +V prípade potreby pridajte: + +| Premenná | Popis | +| ----------------------- | --------------------------------------------------------------- | +| `SIMPLE_MODE` | Nastavte na `true` pre minimálne rozhranie | +| `VITE_BRAND_NAME` | Vlastný názov značky (nahrádza „BentoPDF“) | +| `VITE_BRAND_LOGO` | Cesta k logu relatívne k `public/` (napr. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Vlastný text päty / autorských práv | +| `VITE_DEFAULT_LANGUAGE` | Predvolený jazyk rozhrania (napr. `fr`, `de`, `es`) | + +### Krok 4: Nasaďte + +Kliknite na „Deploy“ a počkajte na dokončenie zostavenia. + +## Vlastná doména + +1. Prejdite do nastavení projektu +2. Otvorte „Domains“ +3. Pridajte svoju vlastnú doménu +4. Nakonfigurujte DNS podľa pokynov + +## Obmedzenia + +::: warning Veľké súbory +Serverless funkcie Vercel majú limit 50 MB. Keďže BentoPDF je statický web, nemalo by vás to ovplyvniť, ale WASM moduly sú veľké (spolu ~100 MB). Uistite sa, že sa poskytujú z priečinka `/public`. +::: + +## Riešenie problémov + +### Časový limit zostavenia + +Ak zostavenia prekračujú časový limit, skúste: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 po obnovení stránky + +Pridajte `vercel.json` pre SPA smerovanie: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Konverzia Word/ODT/Excel do PDF nefunguje + +Konverzie LibreOffice WASM vyžadujú `SharedArrayBuffer`, ktorý potrebuje na všetkých stránkach tieto hlavičky odpovede: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Vopred skomprimované súbory `.wasm.gz` a `.data.gz` tiež potrebujú `Content-Encoding: gzip`, aby ich prehliadač dekomprimoval. + +Pridajte toto do svojho `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Na overenie otvorte konzolu DevTools a spustite `console.log(window.crossOriginIsolated)`: mal by vrátiť `true`. diff --git a/docs/sk/tools/add-attachments.md b/docs/sk/tools/add-attachments.md new file mode 100644 index 00000000..fa130d8e --- /dev/null +++ b/docs/sk/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Pridať prílohy +description: Vložte do PDF súbory ľubovoľného typu na úrovni dokumentu alebo ich pripojte ku konkrétnym stranám. +--- + +# Pridať prílohy + +Vložte jeden alebo viac súborov priamo do PDF dokumentu. Prílohy môžete pridať na úrovni dokumentu (viditeľné v paneli príloh v ľubovoľnej čítačke PDF) alebo ich naviazať na konkrétne strany. + +## Ako to funguje + +1. Nahrajte PDF, ku ktorému chcete pripojiť súbory. +2. V oblasti na pretiahnutie príloh vyberte súbory, ktoré chcete vložiť (ľubovoľný typ súboru). +3. Zvoľte úroveň prílohy: **Dokument** (predvolené) alebo **Strana**. +4. Ak zvolíte úroveň strany, zadajte rozsah strán (napr. `1-3` alebo `5`). +5. Kliknite na tlačidlo spracovania. Upravené PDF s vloženými súbormi sa stiahne. + +## Funkcie + +- Pripojenie ľubovoľného typu súboru: obrázky, tabuľky, archívy, spustiteľné súbory, čokoľvek +- Umiestnenie prílohy na úrovni dokumentu alebo strany +- Viac súborov v jednej operácii +- Zobrazenie názvov a veľkostí všetkých vybraných príloh +- Výstup zachováva pôvodný obsah PDF a pridáva vložené súbory + +## Možnosti + +| Možnosť | Popis | +| -------------------- | ----------------------------------------------------------------- | +| **Úroveň dokumentu** | Pripojí súbory k PDF ako celku, prístupné z panela príloh | +| **Úroveň strany** | Pripojí súbory ku konkrétnym stranám zadaným v poli rozsahu strán | + +## Prípady použitia + +- Pribalenie zdrojových dát (súbory Excel, CSV) k PDF správe +- Pripojenie pôvodných obrázkov k PDF fotografickému portfóliu +- Vloženie podporných dokumentov do zmluvy alebo ponuky +- Pridanie doplnkových materiálov ku konkrétnym stranám školiacej príručky + +## Tipy + +- Prílohy na úrovni dokumentu majú najširšiu podporu v čítačkách PDF. Prílohy na úrovni strany nemusia byť viditeľné vo všetkých prehliadačoch. +- Veľkosť príloh nie je obmedzená, no veľmi veľké vložené súbory úmerne zväčšia PDF. + +## Súvisiace nástroje + +- [Extrahovať prílohy](./extract-attachments) +- [Upraviť prílohy](./edit-attachments) +- [Spojiť PDF](./merge-pdf) diff --git a/docs/sk/tools/add-blank-page.md b/docs/sk/tools/add-blank-page.md new file mode 100644 index 00000000..65a27ada --- /dev/null +++ b/docs/sk/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Pridať prázdnu stranu +description: Vložte jednu alebo viac prázdnych strán na ľubovoľné miesto v PDF dokumente. +--- + +# Pridať prázdnu stranu + +Vložte do PDF prázdne strany na zvolené miesto. Určujete, kam prázdne strany pôjdu a koľko ich pridať. + +## Ako to funguje + +1. Nahrajte PDF súbor. Nástroj zobrazí počet strán. +2. Zadajte **pozíciu**, kam sa majú prázdne strany vložiť. Použite `0` na vloženie úplne na začiatok alebo celkový počet strán na pridanie na koniec. +3. Zadajte **počet** prázdnych strán na pridanie (predvolene 1). +4. Kliknite na tlačidlo spracovania. Upravené PDF s vloženými prázdnymi stranami sa stiahne. + +## Funkcie + +- Vloženie na ľubovoľnú pozíciu: na začiatok, do stredu alebo na koniec dokumentu +- Pridanie viacerých prázdnych strán v jednej operácii +- Nápoveda k pozícii sa dynamicky prispôsobí počtu strán nahraného PDF +- Prázdne strany štandardnej veľkosti A4 + +## Prípady použitia + +- Pridanie prázdnej oddeľovacej strany medzi časti zostaveného dokumentu +- Vloženie prázdnych strán na zarovnanie pri obojstrannej tlači +- Pridanie miesta na ručné poznámky vo vytlačenom študijnom materiáli +- Doplnenie dokumentu na minimálny požadovaný počet strán + +## Tipy + +- Pozícia `0` vkladá pred prvú stranu. Pozícia rovná celkovému počtu strán pridáva za poslednú stranu. +- Ak potrebujete na konkrétne miesto vložiť obsah (nie len prázdne strany), použite [PDF Multi Nástroj](./pdf-multi-tool) na vloženie ďalšieho PDF za zvolenú stranu. + +## Súvisiace nástroje + +- [Usporiadať a duplikovať](./organize-pdf) +- [PDF Multi Nástroj](./pdf-multi-tool) +- [Spojiť PDF](./merge-pdf) diff --git a/docs/sk/tools/add-page-labels.md b/docs/sk/tools/add-page-labels.md new file mode 100644 index 00000000..27907dc5 --- /dev/null +++ b/docs/sk/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Pridať označenia strán +description: Pridajte do PDF označenia strán s rímskymi číslicami, písmenovými predponami, vlastným číslovaním a viacerými pravidlami na dokument. +--- + +# Pridať označenia strán + +Označenia strán určujú, ako sa čísla strán zobrazujú v prehliadačoch PDF (číslo na paneli nástrojov, nie vytlačené na strane). Tento nástroj vám umožní priradiť rôznym rozsahom strán rôzne schémy označovania: rímske číslice pre úvodnú časť, arabské čísla pre hlavný text, písmenami označené prílohy a ďalšie. + +## Ako to funguje + +1. Nahrajte PDF súbor. +2. Zobrazí sa panel možností s jedným predvoleným pravidlom označenia. +3. Pre každé pravidlo nastavte rozsah strán, štýl, voliteľnú predponu a počiatočnú hodnotu. +4. Kliknutím na **Pridať pravidlo** vytvoríte ďalšie pravidlá pre rôzne časti. +5. Kliknutím na **Pridať označenia strán** použijete všetky pravidlá a stiahnete výsledok. + +## Možnosti + +Každé pravidlo označenia má tieto nastavenia: + +- **Rozsah strán**: Na ktoré strany sa pravidlo vzťahuje. Ak necháte prázdne, platí pre všetky strany. Podporuje rozsahy ako `1-4`, `7`, `odd` alebo `1-9,30-40`. +- **Štýl označenia**: Arabské čísla, malé rímske číslice (i, ii, iii), veľké rímske číslice (I, II, III), malé písmená (a, b, c), veľké písmená (A, B, C) alebo bez označenia (len predpona). +- **Predpona označenia**: Voliteľný text pred každým označením, napríklad „A-“ pre označenia ako A-1, A-2, A-3. +- **Počiatočná hodnota**: Číslo, od ktorého sa začína počítať. Predvolene 1. Nastavte 0 pre číslovanie od nuly. +- **Pokračovať v číslovaní cez nesúvislé rozsahy**: Zapnite, ak pravidlo cieli na nesúvislé strany (napríklad `1-9,30-40` alebo `odd`) a chcete, aby číslovanie pokračovalo postupne. +- **Odstrániť existujúce označenia strán**: Predvolene zaškrtnuté. Pred použitím nových pravidiel vymaže všetky predchádzajúce označenia. + +## Funkcie + +- Viac pravidiel označenia v jednom dokumente pre zložité schémy číslovania +- Šesť štýlov označenia pokrývajúcich všetky štandardné číselné sústavy +- Podpora vlastnej predpony pre označovanie podľa častí +- Podpora nesúvislých rozsahov s postupným číslovaním +- Možnosť zachovať alebo odstrániť existujúce označenia + +## Prípady použitia + +- Nastavenie rímskych číslic (i, ii, iii) pre predhovor knihy a arabských čísel pre hlavný text +- Označenie strán príloh písmenovými predponami ako „A-1“, „A-2“, „B-1“, „B-2“ +- Oprava označení strán v naskenovanom dokumente, kde fyzické čísla strán nezodpovedajú poradiu strán v PDF +- Pridanie číslovania od nuly pre technické dokumenty + +## Tipy + +- Označenia strán sú metadáta, ktoré prehliadače PDF zobrazujú na navigačnom paneli. Na samotnej strane sa netlačia. Pre viditeľné čísla použite [Čísla strán](./page-numbers). +- Tento nástroj vyžaduje, aby bol v nastaveniach WASM nakonfigurovaný CoherentPDF (CPDF). Ak nie je nastavený, zobrazí sa výzva na jeho konfiguráciu. + +## Súvisiace nástroje + +- [Čísla strán](./page-numbers) +- [Batesovo číslovanie](./bates-numbering) +- [Upraviť záložky](./bookmark) diff --git a/docs/sk/tools/add-stamps.md b/docs/sk/tools/add-stamps.md new file mode 100644 index 00000000..47cf48cf --- /dev/null +++ b/docs/sk/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Pridať pečiatky +description: Pridajte na strany PDF obrázkové pečiatky pomocou integrovaného panela anotácií s uvedením mena používateľa. +--- + +# Pridať pečiatky + +Umiestnite na strany PDF obrázkové pečiatky pomocou vstavaného prehliadača s panelom nástrojov na anotácie pečiatkami. Pečiatky môžu obsahovať vaše meno, čo sa hodí pri schvaľovacích procesoch, revíziách a označovaní dokumentov. + +## Ako to funguje + +1. Zadajte svoje meno do poľa **Meno pre pečiatku**. Toto meno sa zobrazí na vytvorených pečiatkach. +2. Nahrajte PDF súbor kliknutím alebo pretiahnutím do oblasti na nahrávanie. +3. Otvorí sa editor pečiatok s dokumentom načítaným v prehliadači. +4. Pomocou nástroja obrázkovej pečiatky na paneli vyberte a umiestnite pečiatky na ľubovoľnú stranu. +5. Podľa potreby pečiatky presuňte a zmeňte ich veľkosť. +6. Kliknutím na **Uložiť PDF s pečiatkami** stiahnete výsledok. + +## Funkcie + +- Integrovaný prehliadač PDF s panelom anotácií určeným pre pečiatky +- Uvedenie mena používateľa na vytvorených pečiatkach +- Umiestnenie obrázkových pečiatok na ľubovoľnú stranu +- Presúvanie a zmena veľkosti pretiahnutím +- Automatická veľkosť prehliadača podľa pomeru strán stránky +- Zobrazenie súboru s názvom a veľkosťou + +## Prípady použitia + +- Pridanie obrázkových pečiatok „SCHVÁLENÉ“ alebo „SKONTROLOVANÉ“ do dokumentov v procese revízie +- Umiestnenie obrázka firemnej pečate alebo notárskej pečiatky na úradné dokumenty +- Označenie strán pečiatkou „PRIJATÉ“ s menom kontrolóra +- Pridanie pečiatok kontroly kvality do inšpekčných správ + +## Tipy + +- Meno pre pečiatku nastavte pred nahraním PDF. Meno sa vloží do metadát pečiatky. +- Prehliadač prispôsobí svoju výšku pomeru strán prvej strany PDF pre optimálne zobrazenie. +- Pre textové vodoznaky namiesto obrázkových pečiatok použite nástroj [Pridať vodoznak](./add-watermark). + +## Súvisiace nástroje + +- [Podpísať PDF](./sign-pdf) +- [Pridať vodoznak](./add-watermark) +- [Editor PDF](./edit-pdf) diff --git a/docs/sk/tools/add-watermark.md b/docs/sk/tools/add-watermark.md new file mode 100644 index 00000000..b707dc3f --- /dev/null +++ b/docs/sk/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Pridať vodoznak +description: Pridajte na strany PDF textové alebo obrázkové vodoznaky pomocou vizuálneho editora s presúvaním a živým náhľadom. +--- + +# Pridať vodoznak + +Pridajte na strany PDF textové alebo obrázkové vodoznaky pomocou vizuálneho editora. Vodoznak umiestnite pretiahnutím priamo v náhľade, veľkosť zmeníte rohovými úchytmi a nastaviť môžete priehľadnosť, otočenie, písmo aj farbu. Každá strana môže mať vlastnú pozíciu vodoznaku, alebo môžete rovnaký vodoznak použiť na všetky strany naraz. + +## Ako to funguje + +1. Nahrajte PDF súbor. +2. Otvorí sa editor so živým náhľadom prvej strany a presúvateľnou vrstvou vodoznaku. +3. Prepínacími tlačidlami zvoľte režim vodoznaku **Text** alebo **Obrázok**. +4. Nastavte vodoznak v bočnom paneli. +5. Pretiahnite vodoznak v náhľade presne tam, kam ho chcete umiestniť. Rohovými úchytmi zmeníte veľkosť. +6. Prechádzajte medzi stranami a nastavte vodoznaky pre jednotlivé strany, alebo nechajte zaškrtnuté **Použiť na všetky strany**. +7. Kliknutím na **Pridať vodoznak** spracujete a stiahnete výsledok. + +## Možnosti + +**Nastavenia textového vodoznaku:** + +- **Text**: Text vodoznaku (napr. „DÔVERNÉ“, „KONCEPT“). +- **Veľkosť písma**: Od 10 do 200 bodov. Predvolene 72. +- **Farba**: Ľubovoľná farba z výberu farieb. +- **Priehľadnosť**: Nastavenie od úplne priehľadného po úplne nepriehľadný. +- **Otočenie**: Otočenie textu vodoznaku od -180 do 180 stupňov. + +**Nastavenia obrázkového vodoznaku:** + +- **Nahranie obrázka**: Nahrajte PNG, JPG alebo iný obrázok, ktorý sa použije ako vodoznak. +- **Priehľadnosť**: Nastavenie priehľadnosti obrázka. +- **Mierka**: Zmena veľkosti obrázkového vodoznaku. + +**Nastavenia rozloženia:** + +- **Jeden**: Jeden vodoznak na stranu, umiestnený pretiahnutím alebo pomocou predvolených pozícií. +- **Dlaždice**: Opakuje vodoznak po celej strane v diagonálnej mriežke podľa uhla otočenia, takže značka pokrýva dokument od okraja po okraj. +- **Vodorovná medzera**: Rozstup medzi dlaždicami v smere textu ako percento šírky vodoznaku (len v režime dlaždíc). +- **Zvislá medzera**: Rozstup medzi radmi dlaždíc ako percento výšky vodoznaku (len v režime dlaždíc). + +**Všeobecné nastavenia:** + +- **Použiť na všetky strany**: Ak je zaškrtnuté, rovnaký vodoznak sa použije na každú stranu. Zrušením zaškrtnutia nastavíte vodoznaky pre jednotlivé strany. +- **Rozsah strán**: Určuje, ktoré strany dostanú vodoznak (napr. „1-3, 5, 7-9“ alebo „all“). + +## Funkcie + +- Vizuálne umiestnenie pretiahnutím v živom náhľade PDF +- Zmena veľkosti vodoznaku rohovými úchytmi +- Režimy textového a obrázkového vodoznaku +- Jednoduché rozloženie alebo dlaždice (opakovanie) po celej strane s nastaviteľným rozstupom +- Vodoznak pre jednotlivé strany alebo globálne +- Prechádzanie po stranách v náhľade +- Ovládanie priehľadnosti a otočenia +- Filtrovanie podľa rozsahu strán + +## Prípady použitia + +- Označenie konceptov nápisom „KONCEPT“ pred rozoslaním na pripomienkovanie +- Pridanie vodoznaku „DÔVERNÉ“ do citlivých finančných správ +- Označenie dokumentov firemným logom ako obrázkovým vodoznakom +- Pridanie nápisu „VZOR“ do produktovej dokumentácie pre potenciálnych zákazníkov +- Pridanie upozornení na autorské práva do distribuovaných PDF materiálov + +## Tipy + +- Pre diagonálne vodoznaky cez celú stranu nastavte otočenie okolo 45 stupňov a zväčšite písmo. +- Režim dlaždíc výrazne sťažuje opätovné použitie dokumentu po orezaní, pretože po odstránení jednej značky zostanú desiatky ďalších. Pri dlaždiciach znížte priehľadnosť, aby zostal text pod nimi čitateľný. +- Obrázkové vodoznaky s priehľadným pozadím (formát PNG) splývajú s obsahom dokumentu prirodzenejšie. +- Ak potrebujete na rôznych stranách rôzny text vodoznaku, zrušte zaškrtnutie „Použiť na všetky strany“ a prechádzajte stranu po strane. + +## Súvisiace nástroje + +- [Hlavička a pätička](./header-footer) +- [Pridať pečiatky](./add-stamps) +- [Batesovo číslovanie](./bates-numbering) +- [Podpísať PDF](./sign-pdf) diff --git a/docs/sk/tools/adjust-colors.md b/docs/sk/tools/adjust-colors.md new file mode 100644 index 00000000..1fa14ffb --- /dev/null +++ b/docs/sk/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Úprava farieb +description: Dolaďte jas, kontrast, sýtosť, odtieň, teplotu, tónovanie, gamu a sépiu vo svojom PDF. +--- + +# Úprava farieb + +Kompletná sada nástrojov na farebné úpravy PDF. Upravte osem nezávislých parametrov (jas, kontrast, sýtosť, posun odtieňa, teplotu, tónovanie, gamu a sépiu) so živým náhľadom, ktorý sa aktualizuje pri pohybe každého posuvníka. + +## Ako to funguje + +1. Nahrajte PDF súbor. +2. Otvorí sa editor s náhľadom prvej strany a panelom nastavení farieb. +3. Posuvníkmi upravte jednotlivé farebné parametre. Náhľad sa aktualizuje v reálnom čase. +4. Kliknutím na **Obnoviť** vrátite všetky posuvníky do predvolených pozícií. +5. Kliknutím na **Použiť** spracujete všetky strany a stiahnete upravené PDF. + +## Možnosti + +- **Jas**: Zosvetlenie alebo stmavenie celej strany (-100 až +100). +- **Kontrast**: Zväčšenie alebo zmenšenie rozdielu medzi svetlými a tmavými oblasťami (-100 až +100). +- **Sýtosť**: Zvýšenie alebo zníženie intenzity farieb (-100 až +100). Hodnota -100 vytvorí výsledok v odtieňoch sivej. +- **Posun odtieňa**: Otočenie farebného kruhu na rovnomerný posun všetkých farieb. +- **Teplota**: Posun farieb do teplejších (žltá/oranžová) alebo chladnejších (modrá) tónov. +- **Tónovanie**: Pridanie zeleného alebo purpurového nádychu. +- **Gama**: Úprava jasu stredných tónov pomocou gama krivky. Hodnoty pod 1,0 stredné tóny stmavia, hodnoty nad 1,0 ich zosvetlia. +- **Sépia**: Klasický efekt sépiového tónu. Vyššie hodnoty vytvoria silnejší hnedý nádych. + +## Funkcie + +- Osem nezávisle nastaviteľných farebných parametrov +- Živý náhľad, ktorý okamžite reaguje na zmeny posuvníkov +- Tlačidlo obnovenia na rýchly návrat k predvoleným hodnotám +- Spracuje všetky strany dokumentu +- Funguje s akýmkoľvek obsahom PDF (text, obrázky, grafika) + +## Prípady použitia + +- Zosvetlenie tmavého skenu alebo oprava preexponovaných strán +- Zníženie sýtosti farebného dokumentu na úsporu atramentu pred tlačou +- Použitie sépiového tónu na starožitný vzhľad certifikátov alebo ocenení +- Korekcia farebnej teploty fotografií vložených v PDF +- Zvýšenie kontrastu vyblednutých alebo nekvalitných naskenovaných dokumentov + +## Tipy + +- Pre rýchly prevod do odtieňov sivej potiahnite posuvník sýtosti úplne na -100. +- Posuvník gama je obzvlášť užitočný na zlepšenie čitateľnosti naskenovaných dokumentov, kde sú stredné tóny príliš tmavé alebo príliš svetlé. +- Podobne ako ostatné nástroje s obrazovými efektmi tento nástroj každú stranu rasterizuje. Výstup bude založený na obrázkoch, takže text nebude možné označiť. + +## Súvisiace nástroje + +- [Invertovať farby](./invert-colors) +- [Efekt skenera](./scanner-effect) +- [Farba pozadia](./background-color) diff --git a/docs/sk/tools/alternate-merge.md b/docs/sk/tools/alternate-merge.md new file mode 100644 index 00000000..aaba09b3 --- /dev/null +++ b/docs/sk/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Striedavo spojiť a zmiešať strany +description: Spojte PDF prekladaním strán z jednotlivých súborov v striedavom poradí so zachovaním záložiek. +--- + +# Striedavo spojiť a zmiešať strany + +Prekladajte strany z viacerých PDF súborov tak, aby sa strany jednotlivých dokumentov striedali. Po tomto nástroji siahnete, keď by bežné spojenie súbory len pripojilo za seba, ale vy potrebujete stranu 1 zo súboru A, potom stranu 1 zo súboru B, potom stranu 2 zo súboru A a tak ďalej. + +## Ako to funguje + +1. Nahrajte aspoň dva PDF súbory do oblasti na nahrávanie. +2. Nástroj zobrazí každý súbor s počtom strán a veľkosťou. +3. Potiahnutím za úchyty zmeňte poradie, v ktorom sa strany súborov striedajú. +4. Kliknutím na **Zmiešať strany** vytvoríte prekladaný výstup. +5. Výsledok sa stiahne ako `alternated-mixed.pdf`. + +## Funkcie + +- Prekladá strany z ľubovoľného počtu PDF (minimálne dvoch) +- Zmena poradia súborov pretiahnutím určuje prioritu prekladania +- Zachováva záložky zo zdrojových dokumentov +- Zobrazuje počet strán a veľkosť každého nahraného súboru +- Spracúva sa v samostatnom web workeri, takže rozhranie zostáva svižné + +## Prípady použitia + +- Opätovné zostavenie obojstranných skenov, kde boli nepárne a párne strany skenované zvlášť +- Spojenie zadaní s kľúčom odpovedí, aby po každej otázke nasledovala jej odpoveď +- Spojenie dvojjazyčných dokumentov strana po strane (napr. angličtina na jednej strane, preklad na ďalšej) +- Prekladanie predných a zadných skenov z jednostranného skenera + +## Tipy + +- Ak majú zdrojové PDF rôzny počet strán, strany kratšieho dokumentu sa minú skôr a zvyšné strany dlhšieho dokumentu sa zobrazia na konci. +- Na poradí súborov záleží: prvý súbor v zozname poskytne prvú stranu výstupu. V prípade potreby poradie zmeňte pretiahnutím. + +## Súvisiace nástroje + +- [Spojiť PDF](./merge-pdf) +- [Usporiadať a duplikovať](./organize-pdf) +- [Rozdeliť PDF](./split-pdf) diff --git a/docs/sk/tools/background-color.md b/docs/sk/tools/background-color.md new file mode 100644 index 00000000..666e38e9 --- /dev/null +++ b/docs/sk/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Farba pozadia +description: Zmeňte farbu pozadia každej strany PDF a zachovajte všetok obsah nad ním. +--- + +# Farba pozadia + +Nastavte jednofarebné pozadie za všetok existujúci obsah PDF. Nástroj vytvorí na každej strane farebný obdĺžnik a pôvodný obsah umiestni nad neho, takže text, obrázky a grafika zostanú na novom pozadí plne viditeľné. + +## Ako to funguje + +1. Nahrajte PDF súbor. +2. Vyberte farbu pozadia pomocou výberu farieb. Predvolená je svetložltá (#FFFFCC). +3. Kliknutím na **Zmeniť farbu pozadia** spustíte spracovanie. +4. Upravené PDF sa automaticky stiahne. + +## Možnosti + +- **Farba pozadia**: Štandardný výber farieb na zvolenie ľubovoľnej plnej farby. Predvolene svetložltá. + +## Funkcie + +- Použije jednotnú farbu pozadia na každú stranu +- Zachová všetok pôvodný obsah (text, obrázky, vektorovú grafiku) nad farebnou vrstvou +- Zachová pôvodné rozmery strán +- Funguje s dokumentmi s ľubovoľným počtom strán + +## Prípady použitia + +- Pridanie svetlého krémového alebo slonovinového pozadia pre jemnejší vzhľad pripomínajúci papier +- Farebné rozlíšenie sád dokumentov použitím rôznych farieb pozadia pre rôzne kategórie +- Vytvorenie vizuálne odlišných verzií toho istého dokumentu pre rôzne publikum +- Pridanie jemného farebného pozadia na lepšiu čitateľnosť pri premietaní dokumentov + +## Tipy + +- Najlepšie fungujú svetlé, tlmené farby. Veľmi tmavé pozadie môže sťažiť čítanie textu, pokiaľ text už nie je svetlý. +- Ak chcete zmeniť pozadie aj farbu textu, najprv použite farbu pozadia a potom na výsledok použite [Zmeniť farbu textu](./text-color). +- Tento nástroj pracuje na úrovni štruktúry PDF (bez rasterizácie), takže text vo výstupe zostane označiteľný a prehľadávateľný. + +## Súvisiace nástroje + +- [Zmeniť farbu textu](./text-color) +- [Invertovať farby](./invert-colors) +- [Úprava farieb](./adjust-colors) diff --git a/docs/sk/tools/bates-numbering.md b/docs/sk/tools/bates-numbering.md new file mode 100644 index 00000000..4a2ee580 --- /dev/null +++ b/docs/sk/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Batesovo číslovanie +description: Pridajte Batesove čísla do jedného alebo viacerých PDF s prispôsobiteľnými šablónami, doplnením nulami, písmami a umiestnením. +--- + +# Batesovo číslovanie + +Batesovo číslovanie pridá na každú stranu PDF postupné identifikátory. Je to štandardný spôsob označovania dokumentov v súdnych konaniach, auditoch a procesoch súladu s predpismi. Tento nástroj podporuje viac súborov, prispôsobiteľné šablóny a vytvára jednotlivo očíslované PDF alebo jeden archív ZIP. + +## Ako to funguje + +1. Nahrajte jeden alebo viac PDF súborov. Môžete pretiahnuť viac súborov naraz. +2. Vyberte predvolený štýl alebo vytvorte vlastnú šablónu. +3. Nastavte pozíciu, písmo, veľkosť, farbu a počiatočné čísla. +4. Kliknutím na **Použiť Batesove čísla** spustíte spracovanie. +5. Jeden súbor sa stiahne priamo. Viac súborov sa stiahne ako archív ZIP. + +## Možnosti + +- **Predvolený štýl**: Vyberte si zo vstavaných formátov: + - Exhibit + Case + Bates + Page (napr. „Exhibit 1 Case XYZ 000001 Page 1“) + - Exhibit + Case + Bates (bez čísla strany) + - Case + Bates + - Iba Batesovo číslo (napr. „000001“) + - Vlastný (napíšte si vlastnú šablónu) +- **Prispôsobiť štýl**: Reťazec šablóny so zástupnými symbolmi: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Doplnenie Batesovho čísla**: Počet číslic (3 až 6) pre Batesove čísla doplnené nulami. Viditeľné len vo vlastnom režime. +- **Pozícia**: Hlavička alebo päta, vľavo, v strede alebo vpravo. +- **Batesovo číslo začína od**: Prvé Batesovo číslo. Predvolene 1. Číslovanie pokračuje naprieč súbormi. +- **Počítadlo súborov začína od**: Počiatočné číslo pre zástupný symbol `[FILE]`. +- **Písmo**: Helvetica, Times New Roman alebo Courier. +- **Veľkosť písma**: Veľkosť pridaného textu. +- **Farba**: Výber farby textu Batesovho čísla. + +## Funkcie + +- Živý náhľad, ako budú Batesove čísla vyzerať vo všetkých nahraných súboroch +- Podpora viacerých súborov s priebežným číslovaním naprieč dokumentmi +- Zmena poradia súborov pretiahnutím určuje poradie číslovania +- Šesť možností umiestnenia (hlavička/päta, vľavo/v strede/vpravo) +- Prispôsobivý výpočet okrajov, ktorý rešpektuje rôzne veľkosti strán +- Výstup ZIP pre dávky viacerých súborov +- Zástupné symboly v šablóne pre maximálnu flexibilitu + +## Prípady použitia + +- Označenie dokumentov v dokazovaní pre súdny spor postupnými číslami príloh +- Číslovanie balíkov audítorských dôkazov, ktoré zahŕňajú desiatky súborov +- Pridanie regulačných referenčných čísel do dokumentácie súladu s predpismi +- Označenie príloh patentovej prihlášky identifikátormi konkrétneho prípadu + +## Tipy + +- Pred spracovaním zmeňte poradie súborov pretiahnutím v zozname. Batesovo číslovanie sa riadi týmto poradím. +- Zástupný symbol `[FILENAME]` vloží do pečiatky pôvodný názov súboru, čo pomáha dohľadať zdrojový dokument strán. +- Náhľad sa pri zmene nastavení aktualizuje v reálnom čase, takže formát môžete overiť pred spracovaním. + +## Súvisiace nástroje + +- [Čísla strán](./page-numbers) +- [Pridať označenia strán](./add-page-labels) +- [Hlavička a pätička](./header-footer) diff --git a/docs/sk/tools/bmp-to-pdf.md b/docs/sk/tools/bmp-to-pdf.md new file mode 100644 index 00000000..d56f928b --- /dev/null +++ b/docs/sk/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP do PDF +description: Konvertujte bitmapové obrázky BMP do formátu PDF priamo v prehliadači, bez nahrávania na akýkoľvek server. +--- + +# BMP do PDF + +Konvertujte súbory Windows Bitmap (BMP) do PDF. BMP je nekomprimovaný obrazový formát, ktorý sa stále vyskytuje v starších systémoch, medicínskom zobrazovaní a priemyselných skeneroch. Tento nástroj ich prevedie do PDF bez nutnosti čokoľvek inštalovať. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :------ | +| BMP | `.bmp` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite svoje BMP súbory. +2. Skontrolujte zoznam súborov. Pridajte ďalšie súbory alebo odstráňte nechcené. +3. Kliknite na **Konvertovať do PDF**. Výstup sa stiahne ako `from_bmps.pdf`. + +Každý BMP sa vykreslí na plátno, exportuje ako PNG a potom sa pomocou pdf-lib vloží do PDF. Veľkosť strany zodpovedá pôvodným rozmerom obrázka. + +## Možnosti + +Tento nástroj neponúka ďalšie nastavenia kvality. Obrázky sa do PDF vkladajú v pôvodnom rozlíšení ako bezstratové PNG. + +## Prípady použitia + +- Konverzia starších naskenovaných dokumentov uložených ako BMP do archívnych PDF +- Premena BMP snímok obrazovky zo starších aplikácií Windows na zdieľateľné dokumenty +- Spracovanie výstupu medicínskych alebo priemyselných skenerov, ktoré predvolene ukladajú BMP +- Migrácia starých archívov obrázkov do prenosnejšieho formátu + +## Tipy + +- Súbory BMP sú nekomprimované, preto bývajú veľké. Výsledné PDF bude výrazne menšie, keďže obrázky sa interne znova zakódujú ako PNG. +- Ak máte BMP súbory spolu s inými obrazovými formátmi, použite nástroj [Obrázky do PDF](./image-to-pdf) a konvertujte všetko v jednej dávke. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [PNG do PDF](./png-to-pdf) +- [TIFF do PDF](./tiff-to-pdf) diff --git a/docs/sk/tools/bookmark.md b/docs/sk/tools/bookmark.md new file mode 100644 index 00000000..c5e37539 --- /dev/null +++ b/docs/sk/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Upraviť záložky +description: Pridávajte, upravujte, importujte, exportujte a odstraňujte záložky PDF pomocou vizuálneho editora s podporou CSV/JSON. +--- + +# Upraviť záložky + +Editor záložiek vám dáva plnú kontrolu nad navigačnými záložkami PDF (nazývanými aj osnova). Môžete pridávať nové záložky, upravovať existujúce, meniť hierarchiu a importovať alebo exportovať údaje záložiek vo formátoch CSV a JSON. + +## Ako to funguje + +1. Nahrajte PDF kliknutím alebo pretiahnutím súboru do oblasti na nahrávanie. +2. Voliteľne zaškrtnite **Automaticky extrahovať existujúce záložky** a načítajte aktuálny strom záložiek dokumentu. +3. Editor sa otvorí v rozdelenom zobrazení: prehliadač PDF vľavo, panel záložiek vpravo. +4. Zadajte názov záložky a kliknite na **Pridať na stranu**, čím vytvoríte novú záložku odkazujúcu na aktuálnu stranu. +5. Tlačidlami na paneli nástrojov záložky presúvajte, štylizujte alebo odstraňujte. +6. Kliknite na **Uložiť PDF so záložkami** a stiahnite upravený súbor. + +## Funkcie + +- Vizuálny prehliadač PDF s navigáciou po stranách, ovládaním priblíženia a poľom na prechod na stranu +- Pridanie záložky na ľubovoľnú stranu jedným kliknutím +- Kliknutím priamo do PDF nastavíte presný cieľ záložky (režim výberu) +- Vnorená hierarchia záložiek s preusporiadaním pretiahnutím +- Hromadné operácie: vyberte viac záložiek a naraz zmeňte farbu, štýl alebo ich odstráňte +- Vyhľadávanie záložiek na rýchle nájdenie položiek vo veľkých stromoch +- Podpora vrátenia a opakovania pre všetky zmeny +- Import záložiek zo súborov CSV (názov, strana, úroveň) alebo JSON +- Export záložiek do CSV alebo JSON na externú úpravu +- Štýl záložiek: farba (červená, modrá, zelená, žltá, fialová) a štýl písma (tučné, kurzíva, tučná kurzíva) +- Rýchla navigácia: prechádzanie stranami klávesmi Page Up/Down + +## Možnosti + +- **Automaticky extrahovať existujúce záložky**: ak je zaškrtnuté, nástroj pri načítaní prečíta a zobrazí aktuálne záložky PDF. +- **Hromadný režim**: prepínač na výber viacerých záložiek a hromadnú zmenu farby, štýlu alebo odstránenie. +- **Rozbaliť/Zbaliť všetko**: rýchlo zobrazí alebo skryje vnorené podzáložky. + +## Prípady použitia + +- Pridanie obsahu do učebnice alebo príručky, ktorá nemá záložky +- Reorganizácia záložiek v naskenovanom dokumente po spracovaní OCR +- Export záložiek do CSV, ich úprava v tabuľkovom procesore a opätovný import +- Vyčistenie automaticky vygenerovaných záložiek s nesprávnymi odkazmi na strany +- Pridanie farebných záložiek na označenie dôležitých častí právneho podania + +## Tipy + +- Na hromadné vytváranie záložiek použite import CSV. Formát je jednoduchý: `title,page,level`, kde úroveň 1 je najvyššia. +- Režim výberu vám umožní kliknúť na presné miesto na strane PDF a nastaviť ho ako cieľ záložky, čo je presnejšie než len cieliť na číslo strany. +- Pred väčšími zmenami si záložky exportujte, aby ste mali zálohu. + +## Súvisiace nástroje + +- [Obsah](./table-of-contents) +- [Editor PDF](./edit-pdf) +- [Pridať označenia strán](./add-page-labels) diff --git a/docs/sk/tools/cbz-to-pdf.md b/docs/sk/tools/cbz-to-pdf.md new file mode 100644 index 00000000..6ceef6b1 --- /dev/null +++ b/docs/sk/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ do PDF +description: Prevádzajte archívy komiksov CBZ a CBR do PDF priamo v prehliadači. Zadarmo, súkromne, bez nahrávania. +--- + +# CBZ do PDF + +Premeňte archívy komiksov na PDF. CBZ a CBR sú štandardné formáty digitálnych komiksov: ide len o archívy ZIP alebo RAR plné obrázkov. Tento nástroj extrahuje každú stranu, zachová poradie čítania a vytvorí čisté PDF, v ktorom sa každý obrázok stane stranou v plnej veľkosti. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----- | :------ | :---------------------------------------------------------- | +| CBZ | `.cbz` | Archív komiksu na báze ZIP (spracovaný lokálne cez pdf-lib) | +| CBR | `.cbr` | Archív komiksu na báze RAR (spracovaný enginom PyMuPDF) | + +Prevodník CBZ rozpozná v archíve obrázky JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC a JXL. Neštandardné formáty sa pred vložením automaticky prevedú na PNG. + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory CBZ či CBR. V jednej dávke môžete kombinovať oba formáty. +2. Skontrolujte zoznam súborov. Odstráňte tie, ktoré nepotrebujete, alebo kliknite na **Pridať ďalšie súbory**. +3. Kliknite na **Previesť do PDF**. Pri súboroch CBZ nástroj rozbalí archív, zoradí obrázky podľa názvu v prirodzenom poradí, zistí skutočný formát každého obrázka a vloží ich do PDF pomocou pdf-lib. Súbory CBR sa namiesto toho spracujú enginom PyMuPDF. +4. Jeden súbor sa stiahne ako PDF. Viac súborov vytvorí archív ZIP s názvom `comic-converted.zip`. + +## Možnosti + +Nie je potrebné nič nastavovať. Každý obrázok sa stane stranou s rozmermi zodpovedajúcimi originálu, takže dvojstrany zostanú široké a jednotlivé strany úzke. + +## Prípady použitia + +- Čítanie komiksov v aplikácii na tablete alebo telefóne, ktorá podporuje PDF, ale nie CBZ/CBR +- Tlač vybraných strán z digitálneho komiksu +- Archivácia zbierky komiksov vo formáte, ktorý otvorí každý prehliadač súborov +- Zdieľanie komiksu s niekým, kto nemá špeciálnu čítačku komiksov + +## Tipy + +- Obrázky v archíve sa zoraďujú prirodzeným poradím (takže `page2.jpg` je pred `page10.jpg`). Pre správne poradie strán pomenujte súbory s konzistentným číslovaním. +- Prevodník rozpoznáva formáty obrázkov podľa binárnych podpisov, nie podľa prípon. PNG omylom pomenovaný `.jpg` sa aj tak vloží správne. +- Súbory CBZ sa spracúvajú úplne v prehliadači bez načítania enginu PyMuPDF, takže sa prevádzajú rýchlejšie než súbory CBR. + +## Súvisiace nástroje + +- [EPUB do PDF](./epub-to-pdf) +- [MOBI do PDF](./mobi-to-pdf) +- [Obrázky do PDF](./image-to-pdf) diff --git a/docs/sk/tools/change-permissions.md b/docs/sk/tools/change-permissions.md new file mode 100644 index 00000000..e1a89341 --- /dev/null +++ b/docs/sk/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Zmeniť oprávnenia +description: Nastavte alebo upravte oprávnenia PDF na tlač, kopírovanie, úpravy a anotácie. Používa 256-bitové šifrovanie AES. +--- + +# Zmeniť oprávnenia + +Presne určte, čo môžu príjemcovia s vaším PDF robiť. Na rozdiel od základného šifrovania, ktoré súbor len zamkne heslom, vám tento nástroj umožní selektívne povoliť alebo zakázať tlač, kopírovanie, úpravy, anotácie, vypĺňanie formulárov, zostavovanie dokumentu a extrakciu strán, pričom všetko je vynútené 256-bitovým šifrovaním AES. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Ak je PDF už zašifrované, zadajte **Aktuálne heslo**. +3. Nastavte **Nové heslo používateľa** (potrebné na otvorenie) a/alebo **Nové heslo vlastníka** (riadi oprávnenia). +4. Jednotlivé oprávnenia zapnite alebo vypnite pomocou začiarkavacích políčok. +5. Kliknite na **Zmeniť oprávnenia**. +6. Stiahnite upravené PDF. + +Ak obe polia pre nové heslá necháte prázdne, nástroj PDF úplne dešifruje a odstráni všetko šifrovanie a obmedzenia. + +## Ovládanie oprávnení + +| Oprávnenie | Čo riadi | +| ---------------------------------- | ------------------------------------------------------ | +| **Povoliť tlač** | Či je možné dokument vytlačiť | +| **Povoliť kopírovanie** | Či je možné vyberať a kopírovať text a obrázky | +| **Povoliť úpravy** | Či je možné upravovať obsah dokumentu | +| **Povoliť anotácie** | Či je možné pridávať komentáre, zvýraznenia a pečiatky | +| **Povoliť vypĺňanie formulárov** | Či je možné vypĺňať interaktívne polia formulára | +| **Povoliť zostavovanie dokumentu** | Či je možné vkladať, odstraňovať alebo otáčať strany | +| **Povoliť extrakciu strán** | Či je možné extrahovať jednotlivé strany | + +Na vynútenie všetkých oprávnení je potrebné heslo vlastníka. Bez hesla vlastníka väčšina čítačiek PDF príznaky oprávnení ignoruje. + +## Ako fungujú oprávnenia v PDF + +Oprávnenia PDF sú súčasťou špecifikácie šifrovania. Ukladajú sa ako bitové príznaky v šifrovacom slovníku a vynucujú ich čítačky PDF, ktoré dodržiavajú štandard. Kľúčový rozdiel: + +- **Heslo používateľa**: potrebné na samotné otvorenie súboru. +- **Heslo vlastníka**: potrebné na zmenu oprávnení alebo odstránenie obmedzení. Bez neho príznaky oprávnení určujú, aké operácie môže používateľ vykonávať. + +Ak nastavíte iba heslo vlastníka (bez hesla používateľa), súbor môže otvoriť ktokoľvek, no je obmedzený na povolené operácie. Ak nastavíte obe, súbor na otvorenie vyžaduje heslo a po overení je obmedzený. + +## Prípady použitia + +- Distribúcia správy, ktorú je možné zobraziť a vytlačiť, ale nie upravovať či kopírovať +- Zdieľanie šablóny zmluvy, ktorú môžu príjemcovia vyplniť, ale nie upraviť +- Zverejnenie PDF katalógu so zakázaným kopírovaním obrázkov +- Povolenie anotácií v koncepte na pripomienkovanie pri zabránení štrukturálnym zmenám + +## Tipy + +- Aby boli oprávnenia účinné, vždy nastavte heslo vlastníka. Oprávnenia bez hesla vlastníka sa nedajú vynútiť. +- Niektoré nástroje PDF tretích strán príznaky oprávnení ignorujú. Pre silnejšiu ochranu zvážte rastrovanie PDF alebo použitie DRM. +- Týmto nástrojom môžete aktualizovať staré PDF šifrované RC4 na AES-256. + +## Súvisiace nástroje + +- [Zašifrovať PDF](./protect-pdf): jednoduchá ochrana heslom bez podrobných oprávnení +- [Dešifrovať PDF](./unlock-pdf): úplné odstránenie šifrovania +- [Odstrániť obmedzenia](./remove-restrictions): odstránenie všetkých obmedzení, keď máte heslo vlastníka diff --git a/docs/sk/tools/combine-single-page.md b/docs/sk/tools/combine-single-page.md new file mode 100644 index 00000000..20fff39c --- /dev/null +++ b/docs/sk/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Spojiť do jednej strany +description: Spojte všetky strany PDF do jedného súvislého zvislého alebo vodorovného pásu. +--- + +# Spojiť do jednej strany + +Zlúčte všetky strany PDF do jednej dlhej strany. Strany sa spoja zvisle (ako zvitok) alebo vodorovne (vedľa seba) a výsledkom je jedna súvislá strana. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Vyberte smer rozloženia: **Zvisle** (strany pod sebou zhora nadol) alebo **Vodorovne** (strany vedľa seba). +3. Nastavte medzeru medzi stranami v bodoch. +4. Vyberte farbu pozadia pre medzery medzi stranami. +5. Voliteľne zapnite oddeľovače (tenké čiary medzi stranami) a nastavte ich hrúbku a farbu. +6. Kliknite na tlačidlo spracovania. Výstupom je jednostranové PDF. + +## Funkcie + +- Zvislé alebo vodorovné spájanie strán +- Nastaviteľná medzera medzi stranami +- Výber farby pozadia pre medzery +- Voliteľné oddeľovacie čiary s nastaviteľnou hrúbkou a farbou +- Každá pôvodná strana sa vykreslí v plnom rozlíšení na spoločné plátno + +## Možnosti + +| Možnosť | Popis | +| -------------------------- | ----------------------------------------------- | +| **Orientácia** | Zvisle (pod sebou) alebo Vodorovne (vedľa seba) | +| **Medzera medzi stranami** | Medzera medzi stranami v bodoch | +| **Farba pozadia** | Farba oblasti medzi stranami | +| **Pridať oddeľovač** | Zapnutie tenkých čiar medzi stranami | +| **Hrúbka oddeľovača** | Hrúbka čiary v bodoch | +| **Farba oddeľovača** | Farba oddeľovacích čiar | + +## Prípady použitia + +- Vytvorenie jedného dlhého obrázka z viacstranového wireframu alebo návrhu +- Vytvorenie súvislého posúvateľného zobrazenia dokumentu na vloženie na web +- Spojenie viacstranového komiksu alebo storyboardu do jedného pásu +- Vytvorenie panoramatického zobrazenia po sebe idúcich strán na kontrolu + +## Tipy + +- Zvislá orientácia je najvhodnejšia pre dokumenty s výškovými stranami. Vodorovná je lepšia pre obsah na šírku. +- Veľké dokumenty s mnohými stranami vytvoria veľmi vysoký alebo široký výstup. Niektoré prehliadače PDF môžu mať s extrémne veľkými stranami problémy. +- Oddeľovače s kontrastnou farbou uľahčia rozpoznať, kde jedna pôvodná strana končí a ďalšia začína. + +## Súvisiace nástroje + +- [N-Up PDF](./n-up-pdf) +- [Spojiť PDF](./merge-pdf) +- [Rozdeliť strany](./divide-pages) diff --git a/docs/sk/tools/compare-pdfs.md b/docs/sk/tools/compare-pdfs.md new file mode 100644 index 00000000..da742250 --- /dev/null +++ b/docs/sk/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Porovnať PDF +description: Porovnajte dva dokumenty PDF vedľa seba alebo v režime prekrytia s podrobnou detekciou a kategorizáciou zmien. +--- + +# Porovnať PDF + +Nahrajte dve PDF a presne uvidíte, čo sa medzi nimi zmenilo. Nástroj inteligentne páruje strany, zisťuje rozdiely v texte, obrázkoch, anotáciách, hlavičkách a formátovaní a zobrazí ich vedľa seba alebo v prekrytí. + +## Ako to funguje + +1. Nahrajte dva súbory PDF: originál (vľavo) a upravenú verziu (vpravo). +2. Nástroj spáruje strany dokumentov pomocou podpisov obsahu. +3. Vyberte režim zobrazenia: **Vedľa seba** alebo **Prekrytie**. +4. Medzi pármi strán prechádzajte ovládacími prvkami stránkovania. +5. Rozdiely sú zvýraznené a kategorizované. Pomocou panela filtrov sa zamerajte na konkrétne typy zmien. +6. Voliteľne exportujte porovnanie ako správu PDF. + +## Funkcie + +- Automatické párovanie strán na základe podobnosti obsahu +- Zobrazenie porovnania vedľa seba a v prekrytí +- Kategorizácia zmien: text, obrázok, hlavička/päta, anotácia, formátovanie, pozadie +- Prepínače filtrov pre jednotlivé kategórie na zobrazenie alebo skrytie typov zmien +- Vyhľadávanie v textových zmenách s filtrovaním dotazom +- Podpora OCR na porovnávanie naskenovaných dokumentov +- Ovládanie priblíženia na podrobnú kontrolu +- Synchronizované posúvanie panelov v režime vedľa seba +- Export výsledkov porovnania ako PDF + +## Možnosti + +| Možnosť | Popis | +| -------------------- | --------------------------------------------------------------------------------- | +| **Režim zobrazenia** | Vedľa seba alebo Prekrytie | +| **OCR** | Zapnutie/vypnutie OCR na porovnávanie naskenovaných dokumentov | +| **Jazyk OCR** | Jazyk na extrakciu textu pomocou OCR | +| **Filtre kategórií** | Zobrazenie zmien textu, obrázkov, hlavičky/päty, anotácií, formátovania a pozadia | +| **Rozsah zmien** | V režime prekrytia filtrovanie medzi všetkými zmenami alebo iba zmenami obsahu | +| **Priblíženie** | Úprava úrovne zväčšenia na podrobnú kontrolu | + +## Prípady použitia + +- Kontrola revízií zmluvy s cieľom zistiť, čo presne sa medzi verziami zmenilo +- Porovnanie návrhov na overenie, že exporty PDF zodpovedajú očakávaniam +- Audit zmien dokumentov v regulovaných odvetviach, kde sa musí sledovať každá úprava +- Overenie, že proces prevodu PDF presne zachoval pôvodný obsah +- Kontrola prekladov oproti zdroju z hľadiska zmien rozloženia + +## Tipy + +- Zobrazenie v prekrytí kladie oba dokumenty na seba, takže priestorové rozdiely (posunuté prvky, zmenené veľkosti obrázkov) sú okamžite viditeľné. +- Pri porovnávaní naskenovaných dokumentov bez textovej vrstvy zapnite OCR. Porovnávací engine extrahuje text z obrázkov strán. +- Pomocou filtrov kategórií sa zamerajte na to podstatné. Napríklad skryte zmeny formátovania, ak vás zaujímajú len rozdiely v textovom obsahu. + +## Súvisiace nástroje + +- [Zobraziť metadáta](./view-metadata) +- [Rozpoznávanie textu (OCR) PDF](./ocr-pdf) +- [Spojiť PDF](./merge-pdf) diff --git a/docs/sk/tools/compress-pdf.md b/docs/sk/tools/compress-pdf.md new file mode 100644 index 00000000..4c79cf93 --- /dev/null +++ b/docs/sk/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Komprimovať PDF +description: Zmenšite veľkosť PDF až o 90 % s enginom Hyper Compress. Podporuje cieľovú veľkosť súboru, dávkové spracovanie a vlastné nastavenia kvality. +--- + +# Komprimovať PDF + +Zmenšite svoje PDF bez toho, aby ste ich poškodili. Komprimovať PDF poháňa [Hyper Compress](https://www.bentopdf.com/hyper-compress), vlastný kompresný engine BentoPDF. Znovu komprimuje obrázky, vytvára podmnožiny písiem a zlučuje ich a odstraňuje zbytočnú záťaž, napríklad vložené náhľady a súkromné údaje aplikácií. PDF zostáva plne funkčné: text sa dá stále vyberať, odkazy a polia formulárov fungujú. + +Hyper Compress je skompilovaný do WebAssembly a dodáva sa s BentoPDF, takže kompresia funguje offline aj v izolovaných (air-gapped) nasadeniach bez ďalšieho nastavovania. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo pretiahnutím súborov. +2. Vyberte **Úroveň kompresie**: Nízka, Stredná, Vysoká alebo Bezstratová. +3. Voliteľne zadajte **Cieľovú veľkosť súboru** alebo rozbaľte **Vlastné nastavenia** pre podrobné ovládanie vrátane možnosti **Previesť na odtiene sivej**. +4. Kliknite na **Komprimovať PDF**. Pri viacerých súboroch dostanete jeden ZIP na stiahnutie. + +## Špeciálne dokumenty + +- **Digitálne podpísané PDF** sa vrátia nezmenené, pretože akákoľvek zmena by podpis zneplatnila. Ak ich chcete komprimovať a podpisy odstrániť, zapnite **Prepísať ochranu obsahu** vo Vlastných nastaveniach; viditeľný podpis zostane na strane, ale súbor už nebude podpísaný. +- **Súbory PDF/A** po kompresii stratia označenie PDF/A, aby súbor nikdy netvrdil súlad, ktorý už nespĺňa. Ak chcete súbor namiesto toho ponechať v súlade, zapnite **Zachovať PDF/A** vo Vlastných nastaveniach. +- **PDF chránené heslom** dostanú na svojej karte súboru pole na heslo. Zadajte tam heslo a Hyper Compress súbor otvorí sám, bez samostatného kroku odomknutia. Pri dvoch alebo viacerých zamknutých súboroch jedno spoločné pole odomkne každý súbor s rovnakým heslom. Komprimovaná kópia nemá heslo; na jeho opätovné pridanie použite [Zašifrovať PDF](./protect-pdf). +- **Skeny bez textovej vrstvy** sa dajú ešte viac zmenšiť pomocou **Rastrovať strany** vo Vlastných nastaveniach, čo každú stranu nahradí jedným optimalizovaným obrázkom. Pri dokumentoch s vyberateľným textom vrátane skenov s OCR sa tento krok preskočí, pokiaľ nie je zapnuté **Prepísať ochranu obsahu**. Potom sa aj textové strany zmenia na obrázky, takže text sa už nedá vyberať a odkazy prestanú fungovať. + +## Úrovne kompresie + +| Úroveň | Kvalita obrázkov | Max. rozlíšenie | Najvhodnejšie pre | +| --------------- | ------------------ | --------------- | ----------------------------------- | +| **Nízka** | 80 | 200 DPI | Zachovanie vizuálnej kvality | +| **Stredná** | 50 | 150 DPI | Bežné dokumenty | +| **Vysoká** | 20 | 72 DPI | Prílohy e-mailov, nahrávanie na web | +| **Bezstratová** | Obrázky nedotknuté | Nezmenené | Archívne kópie | + +Vysoká úroveň tiež zruší vloženie 14 štandardných písiem PDF a podobných písiem, napríklad Arial, ak je to bezpečné. + +## Cieľová veľkosť súboru + +Zadajte veľkosť v KB alebo MB a Hyper Compress vyhľadá najlepšiu kvalitu obrázkov, ktorá sa ešte zmestí, počnúc vybranou úrovňou. Ak sa dokument nedá zmenšiť až tak, dostanete najmenšiu verziu, akú dokáže vytvoriť, a správu o tom. Špeciálne stránky, napríklad [Komprimovať PDF na 1 MB](https://www.bentopdf.com/compress-pdf-to-1mb), sa otvoria s už vyplneným cieľom. + +## Vlastné nastavenia + +Rozbaľte panel Vlastné nastavenia a upravte Hyper Compress priamo. Výber úrovne kompresie nastaví tieto hodnoty podľa danej úrovne a úprava ktorejkoľvek z nich prepne úroveň na Vlastnú. + +- **Prepísať ochranu obsahu**: Hyper Compress v predvolenom stave nemení podpísané PDF a nerastruje strany s textom. Zapnutím tejto možnosti obídete oboje. Zostane zapnutá aj pri zmene úrovne. + +- **Obrázky**: kvalita obrázkov, maximálne rozlíšenie, vynútené prevzorkovanie, redukcia farieb, orezanie neviditeľných oblastí obrázkov, odstránenie alternatívnych obrázkov, zjednodušenie farebných profilov, JPEG 2000 a bezstratový režim +- **Písma**: podmnožiny, zlúčenie duplikátov a zrušenie vloženia štandardných písiem a podobných písiem +- **Obsah**: zlúčenie (flatten) anotácií, polí formulárov alebo odkazov +- **Čistenie**: odstránenie náhľadov, údajov aplikácií, článkových vlákien, informácií o webovom zachytení, stromu štruktúry alebo výstupných zámerov (output intents) +- **Rastrovanie**: nahradenie strán obrázkami pre skeny len s obrázkami; preskočí sa, ak má dokument vyberateľný text +- **Výstup**: Zachovať PDF/A a kompresia Brotli pre čítačky PDF 2.0, ktoré ju podporujú + +## Prípady použitia + +- Zmenšenie 50 MB správy pod limit príloh e-mailu +- Dostanie skenu pod prísny limit nahrávania portálu pomocou cieľovej veľkosti súboru +- Optimalizácia marketingových PDF pre rýchlejšie sťahovanie z webu +- Archivácia veľkých súborov dokumentov, kde záleží na nákladoch na úložisko +- Zníženie spotreby mobilných dát pri zdieľaní PDF cez aplikácie na posielanie správ + +## Tipy + +- Začnite so Strednou úrovňou. Ak je výsledok stále príliš veľký, nastavte cieľovú veľkosť súboru alebo prejdite na Vysokú. +- Pri skene bez textovej vrstvy zapnite Rastrovať strany vo Vlastných nastaveniach. +- Previesť na odtiene sivej vo Vlastných nastaveniach môže zmenšiť veľkosť dokumentov s množstvom farieb. + +## Súvisiace nástroje + +- [Linearizovať PDF](./linearize-pdf): optimalizácia komprimovaného PDF na rýchle zobrazenie na webe +- [Rastrovať PDF](./rasterize-pdf): prevod strán na obrázky v konkrétnom DPI vrátane strán s textom +- [Opraviť PDF](./repair-pdf): oprava PDF, ktoré sa poškodilo pri kompresii inde +- [Odstrániť metadáta](./remove-metadata): odstránenie skrytých údajov kvôli súkromiu diff --git a/docs/sk/tools/crop-pdf.md b/docs/sk/tools/crop-pdf.md new file mode 100644 index 00000000..0de786ad --- /dev/null +++ b/docs/sk/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Orezať PDF +description: Vizuálne orežte strany PDF nakreslením oblasti orezania na každej strane v editore postavenom na Cropper.js. +--- + +# Orezať PDF + +Orežte okraje strán PDF pomocou vizuálneho rozhrania. Nakreslite obdĺžnik orezania priamo na každú stranu, pozrite si náhľad výsledku a orezanie použite. Pre rôzne strany môžete nastaviť rôzne oblasti orezania alebo rovnaké orezanie použiť na celý dokument. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Otvorí sa editor orezania s prvou stranou a posúvateľným prekrytím orezania. +3. Upravte obdĺžnik orezania ťahaním jeho okrajov alebo rohov. +4. Tlačidlami navigácie prechádzajte medzi stranami a nastavte oblasť orezania pre každú z nich. +5. Kliknite na **Orezať**, čím orezanie použijete a stiahnete výsledok. + +## Funkcie + +- Vizuálny editor orezania postavený na Cropper.js s úchytmi na presné nastavenie +- Navigácia po stranách na nastavenie jednotlivých oblastí orezania +- Ukladá nastavenia orezania pre každú stranu, takže pre rôzne strany môžete určiť rôzne orezanie +- Živý náhľad vybranej oblasti orezania +- Podporuje PDF s ľubovoľnou veľkosťou a orientáciou strán + +## Prípady použitia + +- Odstránenie širokých okrajov z naskenovaných dokumentov na zameranie sa na obsah +- Orezanie tlačových značiek alebo registračných značiek z predtlačových PDF +- Orezanie prednáškových snímok na odstránenie oblasti poznámok prednášajúceho +- Odstránenie hlavičiek alebo piat zo všetkých strán pred zdieľaním výňatku dokumentu +- Zmena veľkosti strán pre konkrétny displej alebo tlačové rozloženie + +## Tipy + +- Prekrytie orezania môžete voľne meniť a presúvať. Ťahaním rohov meníte veľkosť proporcionálne, ťahaním okrajov v jednej osi. +- Pri dokumentoch, kde každá strana potrebuje rovnaké orezanie, ho nastavte na prvej strane: nástroj si oblasť orezania pamätá pri prechádzaní stranami. +- Ak potrebujete zjednotiť veľkosti strán namiesto vizuálneho orezania, vhodnejší môže byť nástroj Zjednotiť veľkosť strán. + +## Súvisiace nástroje + +- [Editor PDF](./edit-pdf) +- [Čísla strán](./page-numbers) +- [Odstrániť prázdne strany](./remove-blank-pages) diff --git a/docs/sk/tools/csv-to-pdf.md b/docs/sk/tools/csv-to-pdf.md new file mode 100644 index 00000000..db874457 --- /dev/null +++ b/docs/sk/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV do PDF +description: Prevádzajte tabuľkové súbory CSV na formátované tabuľky PDF priamo v prehliadači. +--- + +# CSV do PDF + +Premeňte súbory CSV na čisté, formátované dokumenty PDF. Každý CSV sa analyzuje a vykreslí ako tabuľka vo výstupnom PDF. Hodí sa to, keď potrebujete vytlačiť alebo zdieľať tabuľkové údaje bez toho, aby príjemca potreboval tabuľkový procesor. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :------ | +| CSV | `.csv` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite jeden či viac súborov CSV. +2. Skontrolujte zoznam súborov. Pridajte ďalšie alebo odstráňte nepotrebné. +3. Kliknite na **Previesť do PDF**. Indikátor priebehu zobrazuje stav prevodu. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov sa zabalí do `csv-converted.zip`. + +## Možnosti + +Tento nástroj nemá žiadne ďalšie nastavenia. CSV sa automaticky analyzuje a naformátuje ako tabuľka. + +## Výstup + +| Počet vstupov | Výstup | +| :------------ | :------------------------------------------------------------ | +| 1 súbor | Stiahnutie jedného PDF (napr. `data.pdf`) | +| 2+ súborov | Archív ZIP (`csv-converted.zip`) s jedným PDF pre každý súbor | + +## Prípady použitia + +- Prevod exportovaných databázových správ na tlačiteľné tabuľky PDF +- Zdieľanie finančných údajov alebo inventárnych zoznamov s ľuďmi, ktorí nemajú Excel +- Vytváranie PDF verzií logovacích súborov CSV pre dokumentáciu súladu +- Tlač adresárov, hodnotiacich hárkov alebo akýchkoľvek tabuľkových údajov uložených ako CSV + +## Tipy + +- Pre najlepšie výsledky používajte v CSV štandardné čiarky ako oddeľovače. Nástroj dodržiava bežné konvencie analýzy CSV. +- Ak má váš CSV veľa stĺpcov, tabuľka sa môže zúžiť, aby sa zmestila na šírku strany. Zvážte rozdelenie širokých dát do viacerých súborov. +- Pre súbory Excel (`.xls`, `.xlsx`) použite nástroj [Excel do PDF](./excel-to-pdf), ktorý zachová formátovanie tabuliek a viac hárkov. + +## Súvisiace nástroje + +- [Excel do PDF](./excel-to-pdf) +- [Text do PDF](./txt-to-pdf) +- [JSON do PDF](./json-to-pdf) diff --git a/docs/sk/tools/delete-pages.md b/docs/sk/tools/delete-pages.md new file mode 100644 index 00000000..3a419c51 --- /dev/null +++ b/docs/sk/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Odstrániť strany +description: Odstráňte konkrétne strany z PDF podľa čísla strany, rozsahu alebo vizuálnym výberom náhľadov. +--- + +# Odstrániť strany + +Odstráňte nechcené strany z dokumentu PDF. Strany na odstránenie určte zadaním čísel strán alebo rozsahov, prípadne kliknite priamo na náhľady strán a označte ich na odstránenie. + +## Ako to funguje + +1. Nahrajte súbor PDF. Nástroj vykreslí náhľady všetkých strán. +2. Do textového poľa zadajte strany na odstránenie pomocou syntaxe rozsahov (napr. `2, 5-8`) alebo kliknutím na náhľady ich prepnite. +3. Označené strany sa vizuálne zvýraznia, aby ste mohli výber potvrdiť. +4. Kliknite na tlačidlo spracovania. Vytvorí sa nové PDF bez vybraných strán. + +## Funkcie + +- Textový výber strán so syntaxou rozsahov (`2, 5-8, 12`) +- Vizuálna mriežka náhľadov na výber kliknutím +- Zvýraznenie strán označených na odstránenie v reálnom čase +- Overenie vstupu voči skutočnému počtu strán +- Všetky neodstránené strany zostanú v pôvodnom poradí + +## Prípady použitia + +- Odstránenie prázdnych alebo výplňových strán z naskenovaného dokumentu +- Odstránenie titulných strán alebo príloh pred zdieľaním dokumentu +- Vyčistenie konceptových strán, ktoré omylom zostali vo finálnom PDF +- Odstránenie strán s citlivými informáciami pred distribúciou + +## Tipy + +- Odstránenie strán neovplyvní obsah ani formátovanie zostávajúcich strán. Výstup je verná kópia originálu bez odstránených strán. +- Ak si chcete ponechať iba konkrétne strany namiesto odstraňovania konkrétnych, vhodnejší je nástroj [Extrahovať strany](./extract-pages). +- Náhľady sa načítavajú postupne, takže aj veľké dokumenty zostávajú responzívne. + +## Súvisiace nástroje + +- [Extrahovať strany](./extract-pages) +- [Usporiadať a duplikovať](./organize-pdf) +- [Rozdeliť PDF](./split-pdf) diff --git a/docs/sk/tools/deskew-pdf.md b/docs/sk/tools/deskew-pdf.md new file mode 100644 index 00000000..6dd1e562 --- /dev/null +++ b/docs/sk/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Zarovnať naklonené PDF +description: Automaticky vyrovnajte naklonené strany v naskenovaných PDF pomocou detekcie sklonu OpenCV. Nastaviteľný prah a DPI. +--- + +# Zarovnať naklonené PDF + +Naskenované dokumenty sú zriedka dokonale rovné. Aj mierny sklon znižuje presnosť OCR a tlač pôsobí neupravene. Tento nástroj využíva algoritmy spracovania obrazu OpenCV na zistenie uhla sklonu každej strany a jej otočenie späť do roviny. + +## Ako to funguje + +1. Nahrajte jedno alebo viac naskenovaných PDF. +2. Nastavte **Prah sklonu**: strany so zisteným sklonom pod touto hodnotou zostanú nezmenené. +3. Vyberte **Kvalitu spracovania (DPI)**: vyššie DPI zlepšuje presnosť detekcie, ale trvá dlhšie. +4. Kliknite na **Zarovnať PDF**. +5. Po spracovaní panel výsledkov zobrazí zistený uhol každej strany a či bola opravená. + +## Možnosti + +| Nastavenie | Hodnoty | Predvolené | +| ------------------- | ------------------------- | ---------- | +| **Prah sklonu** | 0,1; 0,5; 1,0; 2,0 stupňa | 0,5 | +| **DPI spracovania** | 100, 150, 200, 300 | 150 | + +## Ako funguje detekcia sklonu + +Nástroj vykreslí každú stranu do obrázka vo zvolenom DPI a potom pomocou OpenCV zistí uhly dominantných čiar v obsahu. Ak zistený sklon prekročí prah, strana sa otočí o opačný uhol, aby sa vyrovnala. Strany pod prahom prejdú bez zmeny. + +## Prípady použitia + +- Vyčistenie hromadne naskenovaných zmlúv alebo právnych dokumentov +- Príprava naskenovaných účteniek alebo faktúr na spracovanie OCR +- Vyrovnanie strán z plochého skenera s nekonzistentne položeným papierom +- Zlepšenie vizuálnej kvality digitalizovaných archívnych materiálov + +## Tipy + +- Ak potrebujete na OCR dokonalé zarovnanie, znížte prah na 0,1 stupňa. +- 150 DPI je rýchle a presné pre väčšinu dokumentov. Pre veľmi malý text alebo strany s jemnými detailmi použite 300 DPI. +- Zarovnanie funguje najlepšie pri dokumentoch s jasnými vodorovnými riadkami textu. Problémy môže mať pri stranách, ktoré sú prevažne obrázky alebo obsahujú diagonálne grafické prvky. + +## Súvisiace nástroje + +- [Rastrovať PDF](./rasterize-pdf): prevod zarovnaného výstupu na ploché PDF založené na obrázkoch +- [Komprimovať PDF](./compress-pdf): zmenšenie veľkosti súboru po zarovnaní +- [Opraviť PDF](./repair-pdf): oprava štrukturálnych problémov v naskenovaných PDF diff --git a/docs/sk/tools/digital-sign-pdf.md b/docs/sk/tools/digital-sign-pdf.md new file mode 100644 index 00000000..1aa48228 --- /dev/null +++ b/docs/sk/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Digitálny podpis +description: Pridajte do PDF kryptografické digitálne podpisy pomocou certifikátov X.509. Podporuje formáty PKCS#12 a PEM s možnosťou viditeľného podpisu. +--- + +# Digitálny podpis + +Digitálny podpis je kryptografický dôkaz, že dokument podpísala konkrétna osoba a že dokument odvtedy nebol zmenený. Na rozdiel od nakresleného podpisu (ktorý je len obrázok) digitálny podpis využíva certifikáty X.509 a štandardy PKCS#7 na overiteľnú pravosť a integritu. + +BentoPDF aplikuje digitálne podpisy úplne vo vašom prehliadači. Váš súkromný kľúč nikdy neopustí vaše zariadenie. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Nahrajte súbor certifikátu (.pfx, .p12 alebo .pem). +3. Zadajte heslo certifikátu na jeho odomknutie. Nástroj zobrazí subjekt certifikátu, vydavateľa a obdobie platnosti. +4. Voliteľne nastavte metadáta podpisu (dôvod, miesto, kontaktné údaje). +5. Voliteľne zapnite **viditeľný podpis** s nastavením polohy, veľkosti, obrázka a textu. +6. Kliknite na **Podpísať PDF**. + +## Podporované formáty certifikátov + +| Formát | Prípony | Popis | +| ----------- | ---------- | --------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Štandardný balík so súkromným kľúčom a reťazcom certifikátov. Najbežnejší formát. | +| **PEM** | .pem | Textový formát. Musí obsahovať certifikát aj súkromný kľúč v jednom súbore. Podporuje šifrované súkromné kľúče. | + +## Možnosti viditeľného podpisu + +Ak je zapnutý, na strane PDF sa vykreslí blok viditeľného podpisu: + +- **Poloha**: súradnice X/Y a šírka/výška v bodoch +- **Strana**: prvá strana, posledná strana, všetky strany alebo konkrétne číslo strany +- **Obrázok**: nahrajte obrázok PNG, JPG alebo WebP (váš vlastnoručný podpis, firemnú pečiatku a pod.) +- **Text**: vlastný text s nastaviteľnou farbou a veľkosťou písma. Ak nezadáte obrázok ani text, nástroj automaticky vygeneruje text z bežného mena (common name) certifikátu a aktuálneho dátumu. + +## Metadáta podpisu + +- **Dôvod**: prečo bol dokument podpísaný (napr. „Schválené“, „Skontrolované“) +- **Miesto**: kde sa podpis uskutočnil (napr. „New York, NY“) +- **Kontaktné údaje**: ako kontaktovať podpisujúceho (napr. e-mailová adresa) + +## Poznámka k internetovému pripojeniu + +Podpisovanie môže vyžadovať internetové pripojenie. Podpisová knižnica sťahuje reťazec certifikátov z adries URL vložených v rozšírení Authority Information Access (AIA) vášho certifikátu. Ak sú tieto servery nedostupné, podpisovanie zlyhá pri certifikátoch, ktoré vyžadujú overenie reťazca. + +## Prípady použitia + +- Podpisovanie zmlúv, ponúk a dohôd právne záväznými digitálnymi podpismi +- Certifikácia úradných dokumentov v procesoch vyžadujúcich overovanie na báze PKI +- Podpisovanie PDF faktúr kvôli súladu s predpismi (mnohé krajiny EÚ vyžadujú digitálne podpísané e-faktúry) +- Pridanie schválenia organizácie k technickým výkresom alebo dokumentom kvality + +## Tipy + +- Certifikáty s vlastným podpisom fungujú na testovanie, ale v Adobe Reader zobrazia varovania. Pre produkčné dokumenty použite certifikát od dôveryhodnej certifikačnej autority. +- Viditeľný podpis je čisto vizuálny. Kryptografický podpis sa vloží bez ohľadu na to, či je viditeľný blok zapnutý. +- Podpísané PDF si overte nástrojom Overiť PDF podpis, aby ste sa uistili, že podpis je neporušený. + +## Súvisiace nástroje + +- [Overiť PDF podpis](./validate-signature-pdf): overenie digitálnych podpisov v podpísaných PDF +- [Zlúčiť vrstvy PDF](./flatten-pdf): zlúčenie formulárov pred podpisom, aby sa zabránilo úpravám +- [Zašifrovať PDF](./protect-pdf): pridanie ochrany heslom k digitálnemu podpisu +- [Odstrániť metadáta](./remove-metadata): odstránenie metadát pred podpisom diff --git a/docs/sk/tools/divide-pages.md b/docs/sk/tools/divide-pages.md new file mode 100644 index 00000000..61288072 --- /dev/null +++ b/docs/sk/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Rozdeliť strany +description: Rozdeľte strany PDF vodorovne alebo zvisle na menšie podstrany. +--- + +# Rozdeliť strany + +Rozrežte jednotlivé strany PDF na polovice vodorovne alebo zvisle. Hodí sa to, keď jedna strana obsahuje obsah, ktorý by mal byť na samostatných stranách, napríklad dvojstĺpcové rozloženie naskenované ako jedna široká strana. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Vyberte smer delenia: **Zvisle** (ľavá/pravá polovica) alebo **Vodorovne** (horná/dolná polovica). +3. Voliteľne zadajte rozsah strán, ktoré sa majú rozdeliť. Ak ho necháte prázdny, rozdelia sa všetky strany. +4. Kliknutím na tlačidlo spracovania vytvoríte rozdelené PDF. + +## Funkcie + +- Zvislé delenie: rozdelí každú stranu na ľavú a pravú polovicu +- Vodorovné delenie: rozdelí každú stranu na hornú a dolnú polovicu +- Filter rozsahu strán na selektívne delenie konkrétnych strán +- Nevybrané strany prejdú bez zmeny +- Zachováva kvalitu obsahu bez opätovného vykresľovania + +## Prípady použitia + +- Oddelenie naskenovaných dvojstrán (napr. sken knihy s ľavou a pravou stranou na jednom hárku) +- Rozdelenie PDF na šírku s obsahom vedľa seba na samostatné strany na výšku +- Rozdelenie vysokých infografík alebo plagátov na samostatnú hornú a dolnú časť +- Príprava širokoformátových dokumentov na tlač na štandardný papier + +## Tipy + +- Ak je obsah na stranách rozložený nerovnomerne, delenie aj tak prebehne presne v strede. Pre asymetrické delenie zvážte radšej [Orezať PDF](./crop-pdf). +- Ak strany potrebujete pred delením alebo po ňom otočiť, kombinujte tento nástroj s [Otočiť PDF](./rotate-pdf). + +## Súvisiace nástroje + +- [Rozdeliť PDF](./split-pdf) +- [Orezať PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Vytvoriť plagát z PDF](./posterize-pdf) diff --git a/docs/sk/tools/duplex-collate.md b/docs/sk/tools/duplex-collate.md new file mode 100644 index 00000000..28fdfccd --- /dev/null +++ b/docs/sk/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Usporiadať obojstranné skenovanie +description: Preusporiadajte PDF z obojstranného skenovania, ktoré obsahujú predné a zadné strany v samostatných blokoch, do správneho poradia predná/zadná. +--- + +# Usporiadať obojstranné skenovanie + +Usporiadať obojstranné skenovanie je určené pre skenovanie cez ADF, pri ktorom jedno PDF obsahuje dva bloky strán: + +- najprv všetky predné strany +- potom všetky zadné strany + +Namiesto ručného rozdeľovania a skladania tento nástroj prekladá oba bloky do prirodzeného poradia čítania: predná1, zadná1, predná2, zadná2 atď. + +## Ako to funguje + +1. Nahrajte jedno PDF vytvorené obojstranným skenovaním stohu. +2. Nastavte bod rozdelenia, kde končí blok predných strán. +3. Vyberte spracovanie bloku zadných strán: + - **Obrátiť blok zadných strán** (bežné, keď sa stoh pred skenovaním zadných strán otočí) + - **Ponechať blok zadných strán bez zmeny** +4. Kliknite na **Usporiadať PDF** a stiahnite preusporiadaný výsledok. + +## Možnosti + +- **Automaticky určiť rozdelenie (polovica)**: nastaví bod rozdelenia na `ceil(totalPages / 2)`. +- **Upozornenie na nepárny počet strán**: upozorní, keď je celkový počet strán nepárny (často ide o chybu skenovania). +- **Potvrdenie nerovnakých blokov**: vyžiada potvrdenie, keď sa veľkosti predného a zadného bloku líšia. +- **Zoskupený export**: rozdelí usporiadaný výstup na samostatné PDF podľa počtu strán pôvodného dokumentu a stiahne ich ako ZIP. + +## Správanie výstupu + +- **Predvolené**: jedno výstupné PDF (jedno vstupné PDF dnu, jedno výstupné PDF von). +- **Zoskupený režim**: výstup sa delí podľa zadaného počtu strán na dokument; ak vznikne viac častí, stiahnu sa ako jeden ZIP, inak sa stiahne jedno PDF. + +Ak sú bloky nerovnako veľké, najprv sa usporiadajú spárované strany a zostávajúce nespárované strany sa pripoja na koniec. + +## Bežné prípady použitia + +- Obnovenie poradia po naskenovaní kopy obojstranných formulárov v dvoch prechodoch. +- Zostavenie predných a zadných strán z kancelárskych skenerov, ktoré vytvoria najprv všetky predné a potom všetky zadné strany. +- Dodatočné spracovanie archívnych skenov pred rozdelením na súbory podľa dokumentov. + +## Tipy + +- Väčšina obojstranných dávok by mala mať párny celkový počet strán. +- Ak zadné strany vo výstupe vyzerajú obrátene, prepnite medzi **Obrátiť blok zadných strán** a **Ponechať blok zadných strán bez zmeny**. +- Pri dvojstranových origináloch (predná + zadná) použite zoskupený export s `2` stranami na dokument. + +## Súvisiace nástroje + +- [Striedavo spojiť a zmiešať strany](./alternate-merge) +- [Rozdeliť PDF](./split-pdf) +- [Spojiť PDF](./merge-pdf) +- [Usporiadať a duplikovať](./organize-pdf) diff --git a/docs/sk/tools/edit-attachments.md b/docs/sk/tools/edit-attachments.md new file mode 100644 index 00000000..31231cc2 --- /dev/null +++ b/docs/sk/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Upraviť prílohy +description: Zobrazte a selektívne odstráňte prílohy súborov vložené v dokumente PDF. +--- + +# Upraviť prílohy + +Prezrite si a spravujte prílohy súborov v PDF. Nástroj zobrazí zoznam všetkých vložených súborov s ich názvom a úrovňou prílohy a umožní vám označiť jednotlivé prílohy na odstránenie alebo odstrániť všetky naraz. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Nástroj automaticky vyhľadá prílohy a zobrazí ich v zozname. +3. Pri každej prílohe je uvedený názov súboru a či ide o prílohu na úrovni dokumentu alebo strany. +4. Kliknutím na ikonu koša vedľa prílohy ju označíte na odstránenie (opätovným kliknutím označenie zrušíte). +5. Tlačidlom **Odstrániť všetky prílohy** vyberiete všetko naraz, tlačidlom **Zrušiť výber všetkých** výber vymažete. +6. Kliknutím na tlačidlo spracovania uložíte nové PDF bez vybraných príloh. + +## Funkcie + +- Zoznam všetkých príloh na úrovni dokumentu aj strany +- Odstránenie jednotlivých príloh alebo hromadne +- Zapínanie a vypínanie výberu pred potvrdením zmien +- Vizuálne prečiarknutie a zmena priehľadnosti pri položkách označených na odstránenie +- Stiahnutie upraveného PDF bez vybraných príloh + +## Prípady použitia + +- Odstránenie zastaraných alebo nesprávnych súborov vložených v dokumente pred ďalšou distribúciou +- Odstránenie citlivých príloh (finančné údaje, osobné informácie) z PDF pred zdieľaním +- Zmenšenie PDF odstránením veľkých vložených súborov, ktoré už nie sú potrebné +- Audit vloženého obsahu a vyčistenie dokumentu pred archiváciou + +## Tipy + +- Prílohy označené na odstránenie sú vizuálne prečiarknuté. Ak si to rozmyslíte, môžete ich pred spracovaním znova prepnúť. +- Ak sa nenájdu žiadne prílohy, nástroj zobrazí jasnú správu „Nenašli sa žiadne prílohy“: PDF jednoducho neobsahuje vložené súbory. + +## Súvisiace nástroje + +- [Pridať prílohy](./add-attachments) +- [Extrahovať prílohy](./extract-attachments) +- [Zobraziť metadáta](./view-metadata) diff --git a/docs/sk/tools/edit-metadata.md b/docs/sk/tools/edit-metadata.md new file mode 100644 index 00000000..3c67b794 --- /dev/null +++ b/docs/sk/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Upraviť metadáta +description: Zobrazte a upravte polia metadát PDF vrátane názvu, autora, kľúčových slov, dátumov a vlastných vlastností. +--- + +# Upraviť metadáta + +Upravte metadáta vložené v súbore PDF. Nástroj vopred vyplní formulár existujúcimi metadátami dokumentu, umožní vám zmeniť ľubovoľné pole a zmeny uloží do nového PDF. + +## Ako to funguje + +1. Nahrajte súbor PDF. Nástroj prečíta jeho aktuálne metadáta a vyplní formulár. +2. Upravte ktorékoľvek zo štandardných polí: Názov, Autor, Predmet, Kľúčové slová, Tvorca, Producent. +3. Upravte Dátum vytvorenia a Dátum úpravy pomocou výberu dátumu a času. +4. Pridajte vlastné polia metadát kliknutím na tlačidlo pridania a zadaním dvojice kľúč-hodnota. +5. Kliknutím na tlačidlo spracovania uložíte upravené PDF. + +## Funkcie + +- Vopred vyplní všetky existujúce metadáta z nahraného PDF +- Štandardné polia: Názov, Autor, Predmet, Kľúčové slová, Tvorca, Producent +- Výber dátumu a času pre Dátum vytvorenia a Dátum úpravy +- Vlastné polia metadát kľúč-hodnota pre ľubovoľné vlastnosti +- Ukladá zmeny priamo do informačného slovníka dokumentu PDF + +## Upraviteľné polia + +| Pole | Popis | +| -------------------- | --------------------------------------------------- | +| **Názov** | Názov dokumentu zobrazený v čítačkách PDF | +| **Autor** | Osoba alebo organizácia, ktorá dokument vytvorila | +| **Predmet** | Krátky popis témy dokumentu | +| **Kľúčové slová** | Výrazy oddelené čiarkou na vyhľadávanie a triedenie | +| **Tvorca** | Aplikácia, ktorá pôvodne vytvorila obsah | +| **Producent** | Aplikácia, ktorá vygenerovala PDF | +| **Dátum vytvorenia** | Kedy bol dokument pôvodne vytvorený | +| **Dátum úpravy** | Kedy bol dokument naposledy upravený | +| **Vlastné polia** | Akékoľvek ďalšie dvojice kľúč-hodnota, ktoré zadáte | + +## Prípady použitia + +- Nastavenie správneho názvu a autora pred zverejnením dokumentu +- Pridanie kľúčových slov na lepšiu vyhľadateľnosť v systémoch na správu dokumentov +- Aktualizácia dátumu úpravy podľa aktuálnej revízie +- Pridanie vlastných polí metadát, napríklad Oddelenie, ID projektu alebo Klasifikácia +- Vyčistenie metadát, ktoré zanechal pôvodný autorský softvér + +## Tipy + +- Vlastné polia sa zapisujú priamo do informačného slovníka PDF. Niektoré čítačky PDF ich nemusia zobrazovať, no v súbore zostanú zachované. +- Ak pole necháte prázdne, z metadát sa vymaže. Tlačidlo spracovania uloží všetko, čo je vo formulári. +- Na zobrazenie metadát bez úprav použite [Zobraziť metadáta](./view-metadata). Na úplné odstránenie všetkých metadát použite Odstrániť metadáta. + +## Súvisiace nástroje + +- [Zobraziť metadáta](./view-metadata) +- [Vrstvy PDF (OCG)](./pdf-layers) +- [Komprimovať PDF](./compress-pdf) diff --git a/docs/sk/tools/edit-pdf.md b/docs/sk/tools/edit-pdf.md new file mode 100644 index 00000000..922c00aa --- /dev/null +++ b/docs/sk/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Editor PDF +description: Anotujte, zvýrazňujte, začierňujte, pridávajte tvary a obrázky, vyhľadávajte a prezerajte PDF priamo v prehliadači. +--- + +# Editor PDF + +Editor PDF v BentoPDF vám umožní anotovať, zvýrazňovať, začierňovať, komentovať, pridávať tvary a obrázky a vyhľadávať vo vašich PDF. Plnohodnotný editor sa načíta priamo vo vašom prehliadači bez nahrávania na server. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo pretiahnutím súboru na ňu. +2. Vložený editor PDF sa automaticky otvorí s načítaným dokumentom. +3. Pomocou panela nástrojov anotujte, zvýrazňujte, začierňujte, pridávajte text, kreslite tvary alebo vkladajte obrázky. +4. Kliknutím na **Stiahnuť upravené PDF** uložíte zmeny. + +## Funkcie + +- Kompletný panel anotácií so zvýrazňovaním, podčiarkovaním, prečiarkovaním a kreslením od ruky +- Vkladanie textu a komentovanie +- Nástroje na začiernenie, ktoré po použití začiernenia natrvalo odstránia označený obsah. Ak niektoré označenia nie sú použité, keď kliknete na **Stiahnuť upravené PDF**, editor ponúkne ich najprv použiť. +- Nástroje na tvary: obdĺžniky, kruhy, čiary a šípky +- Vkladanie obrázkov na strany PDF +- Vstavané vyhľadávanie textu v celom dokumente +- Podpora viacerých dokumentov na kartách (až 10 súčasne otvorených dokumentov) +- Načítanie súborov pretiahnutím + +## Prípady použitia + +- Kontrola zmlúv a označovanie zmien zvýrazneniami a komentármi +- Začiernenie dôverných informácií, napríklad rodných čísel alebo finančných údajov, pred zdieľaním +- Pridávanie anotácií k architektonickým plánom alebo technickým výkresom +- Vkladanie firemných log alebo pečiatok na strany dokumentu +- Vyhľadávanie konkrétnych výrazov v rozsiahlych právnych dokumentoch + +## Tipy + +- Môžete otvoriť viac PDF naraz a prepínať medzi nimi pomocou panela kariet v hornej časti editora. +- Editor zachováva pôvodnú štruktúru PDF, takže písma, rozloženia a polia formulárov zostanú neporušené. +- Označenie textu alebo oblasti na začiernenie nič neodstráni, kým sa začiernenie nepoužije. Keď začierňujete vybraný text, zo stiahnutého súboru sa odstránia aj jeho kópie vo vlastnostiach súboru, záložkách, komentároch a prílohách, pokiaľ súbor nie je zašifrovaný. +- Na hromadné vodoznaky alebo číslovanie strán radšej použite špecializované nástroje, ktoré dávajú viac kontroly nad formátovaním. + +## Súvisiace nástroje + +- [Pridať vodoznak](./add-watermark) +- [Podpísať PDF](./sign-pdf) +- [Pridať pečiatky](./add-stamps) +- [Odstrániť anotácie](./remove-annotations) diff --git a/docs/sk/tools/email-to-pdf.md b/docs/sk/tools/email-to-pdf.md new file mode 100644 index 00000000..f3c6cb93 --- /dev/null +++ b/docs/sk/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-mail do PDF +description: Prevádzajte e-mailové súbory EML a MSG do PDF v prehliadači. Zachováva hlavičky, telo a zoznam príloh. +--- + +# E-mail do PDF + +Prevádzajte uložené e-mailové súbory na čisté PDF pripravené na tlač. Nástroj analyzuje súbory EML a MSG, extrahuje celú správu (hlavičky, obsah tela a metadáta príloh) a všetko vykreslí do štruktúrovaného PDF. Hodí sa na právne zisťovanie, vedenie záznamov alebo jednoducho na vytlačenie dôležitého e-mailu. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----- | :------ | :----------------------------------------------------------- | +| EML | `.eml` | Štandardný e-mailový formát MIME (export z väčšiny klientov) | +| MSG | `.msg` | Proprietárny formát Microsoft Outlook | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory EML či MSG. V jednej dávke môžete kombinovať oba formáty. +2. Skontrolujte zoznam súborov. Nechcené položky odstráňte ikonou koša alebo kliknite na **Pridať ďalšie súbory** a pridajte ďalšie e-maily. +3. Nastavte možnosti prevodu (pozri nižšie). +4. Kliknite na **Previesť do PDF**. Nástroj analyzuje každý e-mail, vykreslí obsah ako štylizované HTML a prevedie ho do PDF cez engine PyMuPDF. +5. Jeden e-mail sa stiahne priamo ako PDF. Viac e-mailov sa zabalí do `emails-converted.zip`. + +## Možnosti + +| Možnosť | Predvolené | Popis | +| :------------------------------- | :--------- | :------------------------------------------------------------------------------------------------------ | +| **Veľkosť strany** | A4 | Vyberte rozmery strany A4, Letter alebo Legal. | +| **Zahrnúť kópiu a skrytú kópiu** | Zapnuté | Ak je zapnuté, zoznamy príjemcov kópie (CC) a skrytej kópie (BCC) sa zobrazia v hlavičke e-mailu v PDF. | +| **Zahrnúť zoznam príloh** | Zapnuté | Ak je zapnuté, v PDF sa zobrazí zoznam príloh e-mailu (s názvami súborov a veľkosťami). | + +## Prípady použitia + +- Archivácia dôležitej obchodnej korešpondencie ako PDF kvôli súladu s predpismi alebo auditu +- Tlač e-mailových konverzácií pre súdne konania alebo žiadosti o poskytnutie dôkazov +- Vytvorenie trvalého záznamu potvrdení objednávok, účteniek alebo zmlúv prijatých e-mailom +- Zálohovanie súborov Outlook MSG vo formáte, ktorý na čítanie nevyžaduje Outlook +- Dokumentácia komunikácie so zákazníckou podporou z exportovaných súborov EML + +## Tipy + +- Podporované sú súbory EML (používané v Thunderbirde, Apple Mail a väčšine e-mailových klientov) aj súbory Outlook MSG. Exportujte e-maily zo svojho klienta a pretiahnite ich priamo do nástroja. +- E-maily vo formáte HTML si v PDF zachovajú štýl. Čisto textové e-maily sa vykreslia s čistým, čitateľným formátovaním. +- Zoznam príloh zobrazuje názvy súborov a veľkosti, ale samotné prílohy do PDF nevkladá. + +## Súvisiace nástroje + +- [XML do PDF](./xml-to-pdf) +- [XPS do PDF](./xps-to-pdf) diff --git a/docs/sk/tools/epub-to-pdf.md b/docs/sk/tools/epub-to-pdf.md new file mode 100644 index 00000000..a30c3d73 --- /dev/null +++ b/docs/sk/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB do PDF +description: Prevádzajte e-knihy EPUB do PDF v prehliadači. Zadarmo, bez nahrávania, s dôrazom na súkromie. +--- + +# EPUB do PDF + +Prevádzajte e-knihy EPUB na súbory PDF bez opustenia prehliadača. EPUB je otvorený štandard pre digitálne knihy, no niekedy potrebujete PDF s pevným rozložením na tlač, anotácie alebo zdieľanie s ľuďmi, ktorí nemajú čítačku e-kníh. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----- | :------ | :--------------------- | +| EPUB | `.epub` | Súbory EPUB 2 a EPUB 3 | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory EPUB. Podporovaný je výber viacerých súborov. +2. Skontrolujte nahrané súbory. Nechcené položky odstráňte ikonou koša alebo kliknite na **Pridať ďalšie súbory** a rozšírte dávku. +3. Kliknite na **Previesť do PDF**. Engine PyMuPDF vykreslí obsah EPUB (text, obrázky a formátovanie) do stránkovaného PDF. +4. Jeden EPUB sa stiahne priamo ako PDF. Viac súborov sa zabalí do archívu ZIP s názvom `epub-converted.zip`. + +## Možnosti + +Prevod prebieha s rozumnými predvolenými nastaveniami a nevyžaduje žiadnu konfiguráciu. Text sa preformátuje na štandardné rozmery strany a vložené písma a obrázky sa prenesú do PDF. + +## Prípady použitia + +- Tlač e-knihy bez DRM na čítanie mimo obrazovky +- Odoslanie rukopisu EPUB na posúdenie ako PDF s pevným rozložením +- Archivácia digitálnych kníh vo formáte, ktorý natívne otvorí každý operačný systém +- Zdieľanie kapitoly s kolegom, ktorý nemá čítačku EPUB +- Prevod technickej dokumentácie distribuovanej ako EPUB na PDF, do ktorých sa dajú pridávať anotácie + +## Tipy + +- Funkcie EPUB 3, ako vložené audio a video, sa do PDF neprenesú, ale všetok text, obrázky a tabuľky sa prevedú bez problémov. +- Pre najlepšie výsledky pri výrazne štylizovaných EPUB skontrolujte prvých pár strán výstupu, či rozloženie zodpovedá. + +## Súvisiace nástroje + +- [MOBI do PDF](./mobi-to-pdf) +- [FB2 do PDF](./fb2-to-pdf) +- [CBZ do PDF](./cbz-to-pdf) diff --git a/docs/sk/tools/excel-to-pdf.md b/docs/sk/tools/excel-to-pdf.md new file mode 100644 index 00000000..107bc3b7 --- /dev/null +++ b/docs/sk/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel do PDF +description: Prevádzajte tabuľky Excel (XLS, XLSX), ODS a súbory CSV do PDF so zachovaním formátovania. +--- + +# Excel do PDF + +Prevádzajte tabuľkové súbory do PDF. Nástroj zvládne moderné súbory Excel, starší formát XLS, tabuľky OpenDocument a dokonca aj CSV, pričom všetko sa vykresľuje cez engine LibreOffice v prehliadači, ktorý zachováva formátovanie buniek, vzorce (ako vypočítané hodnoty), grafy a rozloženia s viacerými hárkami. + +## Podporované formáty + +| Formát | Prípony | +| :------------------- | :------ | +| Excel (moderný) | `.xlsx` | +| Excel (starší) | `.xls` | +| Tabuľka OpenDocument | `.ods` | +| CSV | `.csv` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite tabuľkové súbory. +2. Skontrolujte zoznam súborov. Pridajte ďalšie alebo odstráňte nepotrebné. +3. Kliknite na **Previesť do PDF**. Engine LibreOffice sa pri prvom použití inicializuje a potom spracuje každý súbor. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov dostanete ako `excel-converted.zip`. + +## Možnosti + +Tento nástroj nemá žiadne ďalšie nastavenia. Engine LibreOffice určí rozloženie strany, mierku a oblasť tlače podľa vstavaných nastavení tabuľky. + +## Výstup + +| Počet vstupov | Výstup | +| :------------ | :-------------------------------------------------------------- | +| 1 súbor | Stiahnutie jedného PDF (pôvodný názov súboru s príponou `.pdf`) | +| 2+ súborov | Archív ZIP (`excel-converted.zip`) s jedným PDF pre každý súbor | + +## Prípady použitia + +- Prevod finančných správ alebo rozpočtov z Excelu do PDF na distribúciu +- Vytváranie PDF pripravených na tlač z tabuliek inventára alebo produktových katalógov +- Zdieľanie výsledkov analýzy dát so zainteresovanými stranami, ktoré nemajú nainštalovaný Excel +- Archivácia štvrťročných správ v needitovateľnom formáte +- Prevod súborov ODS z LibreOffice Calc do PDF + +## Tipy + +- Grafy vložené v tabuľke sa vykreslia v PDF. Pred prevodom sa uistite, že v zdrojovom súbore vyzerajú správne. +- Ak má tabuľka viac hárkov, do výstupného PDF sa zahrnú všetky. +- Pre jednoduché údaje CSV bez formátovania ponúka nástroj [CSV do PDF](./csv-to-pdf) odľahčenejší prevod. Excel do PDF použite, keď potrebujete zachovať formátovanie, grafy alebo viac hárkov. + +## Súvisiace nástroje + +- [CSV do PDF](./csv-to-pdf) +- [Word do PDF](./word-to-pdf) +- [PowerPoint do PDF](./powerpoint-to-pdf) diff --git a/docs/sk/tools/extract-attachments.md b/docs/sk/tools/extract-attachments.md new file mode 100644 index 00000000..68c049ff --- /dev/null +++ b/docs/sk/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Extrahovať prílohy +description: Extrahujte všetky vložené prílohy súborov z jedného alebo viacerých PDF a stiahnite ich ako archív ZIP. +--- + +# Extrahovať prílohy + +Vytiahnite všetky vložené prílohy z jedného alebo viacerých súborov PDF. Všetky extrahované súbory sa zabalia do jedného archívu ZIP na stiahnutie. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF, ktoré obsahujú vložené prílohy. +2. Kliknite na **Extrahovať prílohy**. +3. Nástroj prehľadá každé PDF a nájde prílohy na úrovni dokumentu aj strany. +4. Všetky nájdené súbory sa zabalia do archívu ZIP a automaticky stiahnu. +5. Stavová správa potvrdí, koľko príloh sa našlo a akú majú celkovú veľkosť. + +## Funkcie + +- Hromadná extrakcia z viacerých PDF naraz +- Extrahuje prílohy na úrovni dokumentu aj strany +- Výstupom je jeden súbor ZIP so všetkými extrahovanými súbormi +- Zobrazuje celkový počet príloh a ich celkovú veľkosť +- Jasné stavové správy, ak sa nenájdu žiadne prílohy + +## Prípady použitia + +- Obnovenie dátových súborov vložených v PDF správe +- Vytiahnutie obrazových podkladov z portfólia alebo dokumentu so špecifikáciou +- Extrakcia doplnkových materiálov zo školiacich PDF alebo PDF o súlade s predpismi +- Audit toho, aké súbory sú vložené v dávke PDF + +## Tipy + +- Ak nástroj nehlási žiadne prílohy, PDF môže namiesto nich obsahovať vložené obrázky alebo údaje formulárov, ktoré nie sú prílohami súborov. Na vložené obrázky použite [Extrahovať obrázky](./extract-images). +- Pri spracovaní viacerých PDF skončia všetky prílohy zo všetkých súborov v jednom ZIP. Názvy súborov sa zachovajú podľa pôvodného vloženia. + +## Súvisiace nástroje + +- [Pridať prílohy](./add-attachments) +- [Upraviť prílohy](./edit-attachments) +- [Extrahovať obrázky](./extract-images) diff --git a/docs/sk/tools/extract-images.md b/docs/sk/tools/extract-images.md new file mode 100644 index 00000000..8fc9b4e8 --- /dev/null +++ b/docs/sk/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Extrahovať obrázky +description: Extrahujte všetky vložené obrázky zo súborov PDF. Prezrite si ich v mriežke a stiahnite jednotlivo alebo ako archív ZIP. +--- + +# Extrahovať obrázky + +Vytiahne všetky vložené obrázky z jedného alebo viacerých súborov PDF. Extrahované obrázky sa zobrazia v mriežke náhľadov, kde ich môžete stiahnuť jednotlivo alebo všetky naraz ako ZIP. Poháňa ho PyMuPDF. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo pretiahnutím súborov na ňu. Podľa potreby pridajte ďalšie súbory alebo jednotlivé odstráňte. +2. Kliknutím na **Extrahovať** spustíte spracovanie. +3. Nástroj prehľadá každú stranu každého nahraného PDF a nájde a extrahuje vložené obrázky. +4. Extrahované obrázky sa zobrazia v mriežke s náhľadmi. Každý obrázok má tlačidlo na stiahnutie. +5. Kliknutím na **Stiahnuť všetko** uložíte všetko ako archív ZIP. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Všetky vložené obrázky sa extrahujú v natívnom formáte (zvyčajne PNG, JPEG alebo v akomkoľvek formáte, v ktorom bol obrázok do PDF vložený). + +## Formát výstupu + +- Obrázky sa zobrazia v mriežke náhľadov s názvami `image_1.png`, `image_2.jpg` atď. +- **Stiahnuť všetko** vytvorí `extracted-images.zip` so všetkými obrázkami. +- Jednotlivé obrázky môžete z mriežky sťahovať po jednom. + +## Prípady použitia + +- Obnovenie fotografií alebo grafiky z PDF na opätovné použitie v inom projekte. +- Extrakcia produktových obrázkov z PDF katalógu pre e-shop. +- Vytiahnutie diagramov z technickej dokumentácie na použitie v prezentáciách. +- Audit toho, ktoré obrázky sú v dokumente vložené, pred jeho zdieľaním. + +## Tipy + +- Nástroj extrahuje obrázky presne tak, ako sú uložené v PDF. Nevykresľuje strany znova ako obrázky; na to použite [PDF do PNG](./pdf-to-png) alebo [PDF do JPG](./pdf-to-jpg). +- Ak nástroj hlási „Nenašli sa žiadne obrázky“, PDF môže používať vektorovú grafiku namiesto vložených rastrových obrázkov alebo môže ísť o naskenovaný dokument, kde je celá strana jeden veľký obrázok. +- Dávkové spracovanie funguje naprieč viacerými PDF. Všetky obrázky zo všetkých súborov sa spoja do jednej mriežky a jedného ZIP. + +## Súvisiace nástroje + +- [PDF do PNG](./pdf-to-png) +- [PDF do JPG](./pdf-to-jpg) +- [Tvorca pracovných postupov (Workflow) PDF](./pdf-workflow) diff --git a/docs/sk/tools/extract-pages.md b/docs/sk/tools/extract-pages.md new file mode 100644 index 00000000..fc8b15b5 --- /dev/null +++ b/docs/sk/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Extrahovať strany +description: Uložte konkrétny rozsah strán z PDF ako nový dokument. +--- + +# Extrahovať strany + +Vytiahnite skupinu strán z PDF a uložte ich ako nový súbor. Pomocou syntaxe rozsahov presne určte, ktoré strany chcete, a nástroj vytvorí čisté PDF obsahujúce iba tieto strany. + +## Ako to funguje + +1. Nahrajte súbor PDF. Nástroj zobrazí názov súboru, veľkosť a celkový počet strán. +2. Zadajte strany, ktoré chcete extrahovať, pomocou syntaxe rozsahov (napr. `1-5`, `3, 7, 10-12`). +3. Voliteľne zvoľte stiahnutie každého rozsahu ako samostatného PDF v archíve ZIP. +4. Kliknite na tlačidlo spracovania. Extrahované strany sa stiahnu ako nové PDF (alebo ZIP). + +## Funkcie + +- Flexibilná syntax rozsahov strán: jednotlivé strany, rozsahy alebo kombinácie oddelené čiarkou +- Po nahraní zobrazí celkový počet strán pre ľahkú orientáciu +- Možnosť výstupu ako jedného spojeného PDF alebo samostatných súborov v ZIP +- Zachováva pôvodný obsah a formátovanie strán + +## Prípady použitia + +- Vytiahnutie manažérskeho zhrnutia (prvých pár strán) z rozsiahlej správy +- Extrakcia jednej kapitoly z PDF učebnice +- Uloženie konkrétnych strán z balíka formulárov ako samostatných dokumentov +- Vytvorenie ukážkového dokumentu z vybraných strán väčšieho súboru + +## Tipy + +- Strany sa číslujú od 1. Pre prvú stranu použite `1`, nie `0`. +- Ak chcete strany odstrániť namiesto extrahovania, použite [Odstrániť strany](./delete-pages), čo je opačná operácia. +- Ak potrebujete vizuálny výber strán s náhľadmi, použite [Rozdeliť PDF](./split-pdf) v režime vizuálneho výberu. + +## Súvisiace nástroje + +- [Rozdeliť PDF](./split-pdf) +- [Odstrániť strany](./delete-pages) +- [Spojiť PDF](./merge-pdf) diff --git a/docs/sk/tools/extract-tables.md b/docs/sk/tools/extract-tables.md new file mode 100644 index 00000000..5754b677 --- /dev/null +++ b/docs/sk/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Extrahovať PDF tabuľky +description: Rozpoznajte a extrahujte tabuľky z dokumentov PDF. Export do CSV, JSON alebo Markdown pre každú tabuľku zvlášť. +--- + +# Extrahovať PDF tabuľky + +Rozpozná všetky tabuľky v PDF a umožní vám exportovať ich vo zvolenom formáte: CSV, JSON alebo Markdown. Každá tabuľka sa extrahuje samostatne s metadátami o strane a polohe. Poháňa ho engine na rozpoznávanie tabuliek v PyMuPDF. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo pretiahnutím súboru na ňu. +2. Vyberte preferovaný **formát exportu**: CSV, JSON alebo Markdown. +3. Kliknutím na **Extrahovať** spustíte spracovanie. +4. Ak sa nájde jedna tabuľka, stiahne sa ako jeden súbor. Viac tabuliek vytvorí archív ZIP s jedným súborom na tabuľku. + +## Možnosti + +- **Formát exportu**: vyberte si z: + - **CSV**: hodnoty oddelené čiarkou so správnym úvodzovkovaním polí, ktoré obsahujú čiarky, úvodzovky alebo zalomenia riadkov. Vhodné pre tabuľkové procesory a databázy. + - **JSON**: štruktúra poľa polí, formátovaná s odsadením 2 medzery. Vhodné na programové spracovanie. + - **Markdown**: tabuľka oddelená zvislými čiarami, ktorú vykreslí PyMuPDF. Vhodné pre dokumentáciu a súbory README. + +## Formát výstupu + +- **Jedna tabuľka**: `filename_table.csv` (alebo `.json` / `.md`) +- **Viac tabuliek**: `filename_tables.zip` so súbormi s názvami `table_1_page3.csv`, `table_2_page5.csv` atď. + +## Prípady použitia + +- Extrakcia konkrétnych tabuliek z rozsiahlych PDF správ bez vyťahovania údajov celého dokumentu. +- Získanie tabuliek vo formáte Markdown na priame vloženie do issues na GitHub, wiki alebo dokumentácie. +- Vytiahnutie štruktúrovaných údajov JSON z PDF tabuliek pre integrácie API alebo skripty. +- Porovnanie tabuliek v rôznych verziách PDF exportom oboch do CSV a porovnaním rozdielov. + +## Tipy + +- Tento nástroj vám dáva kontrolu nad každou tabuľkou. Ak chcete všetky tabuľky jednoducho uložiť do jedného CSV, použite [PDF do CSV](./pdf-to-csv). Pre celý zošit Excel použite [PDF do Excelu](./pdf-to-excel). +- Tabuľky, ktoré presahujú cez viac strán, sa môžu rozpoznať ako samostatné tabuľky na každej strane. Možno ich budete musieť spojiť ručne. +- Ak sa nerozpoznajú žiadne tabuľky, PDF môže byť naskenovaný obrázok. Najprv ho spracujte cez OCR, aby ste pridali textovú vrstvu. + +## Súvisiace nástroje + +- [PDF do CSV](./pdf-to-csv) +- [PDF do Excelu](./pdf-to-excel) +- [PDF do Textu](./pdf-to-text) diff --git a/docs/sk/tools/fb2-to-pdf.md b/docs/sk/tools/fb2-to-pdf.md new file mode 100644 index 00000000..f9235b96 --- /dev/null +++ b/docs/sk/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 do PDF +description: Konvertujte e-knihy FictionBook (FB2) do PDF priamo v prehliadači. Zadarmo, súkromne, bez nahrávania na server. +--- + +# FB2 do PDF + +Konvertujte súbory FictionBook 2 (FB2) na dokumenty PDF. FB2 je formát e-kníh založený na XML, obľúbený v Rusku a vo východnej Európe. Na niektorých platformách je dobre podporovaný, na iných je takmer neznámy, preto konverzia do PDF sprístupní vaše knihy všade. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :------------ | :------ | :---------------------------- | +| FictionBook 2 | `.fb2` | Formát e-kníh založený na XML | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite súbory FB2. Môžete vybrať viac súborov naraz. +2. Skontrolujte zoznam súborov. Ikonou koša odstránite jednotlivé položky, tlačidlom **Pridať ďalšie súbory** pridáte ďalšie. +3. Kliknite na **Konvertovať do PDF**. Engine PyMuPDF spracuje štruktúru XML súboru FB2 a vykreslí ju ako stránkovaný obsah PDF. +4. Jeden súbor sa stiahne priamo ako PDF. Viac konverzií sa zabalí do `fb2-converted.zip`. + +## Možnosti + +Nie je potrebné nič nastavovať. Konvertor spracuje štruktúru XML súboru FB2 automaticky a zachová zalomenia kapitol, formátovanie aj vložené obrázky. + +## Príklady použitia + +- Čítanie e-kníh FB2 na zariadeniach alebo v aplikáciách, ktoré podporujú iba PDF +- Tlač ruskojazyčnej literatúry distribuovanej vo formáte FB2 +- Archivácia knižnice FB2 v univerzálne podporovanom formáte +- Zdieľanie knihy s niekým, koho čítačka nepodporuje FictionBook + +## Tipy + +- Súbory FB2 sú čisté XML, takže bývajú malé a konvertujú sa rýchlo aj v prehliadači. +- Ak sú vaše súbory FB2 skomprimované ako `.fb2.zip`, pred nahraním ich najprv rozbaľte. + +## Súvisiace nástroje + +- [EPUB do PDF](./epub-to-pdf) +- [MOBI do PDF](./mobi-to-pdf) +- [XML do PDF](./xml-to-pdf) diff --git a/docs/sk/tools/fix-page-size.md b/docs/sk/tools/fix-page-size.md new file mode 100644 index 00000000..ed3d10ca --- /dev/null +++ b/docs/sk/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Zjednotiť veľkosť strán +description: Zjednoťte všetky strany PDF na rovnakú veľkosť. Vyberte štandardný formát papiera alebo nastavte vlastné rozmery. +--- + +# Zjednotiť veľkosť strán + +PDF zostavené z viacerých zdrojov majú často rôzne veľkosti strán: niektoré Letter, niektoré A4, niektoré úplne neštandardné. Tento nástroj nastaví všetky strany na jednu cieľovú veľkosť a obsah podľa potreby prispôsobí alebo roztiahne. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. V rozbaľovacom zozname vyberte **Cieľovú veľkosť strany** (A4, Letter, Legal, A3, A5, Tabloid alebo Vlastná). +3. Zvoľte **Orientáciu**: Automaticky zachová pôvodnú orientáciu každej strany, prípadne môžete vynútiť Na výšku alebo Na šírku. +4. Vyberte režim **Škálovania obsahu**: Prispôsobiť (zachová všetok obsah, môže pridať okraje) alebo Vyplniť (vyplní stranu, môže orezať okraje). +5. Voliteľne nastavte **Farbu pozadia** pre pridané okraje. +6. Kliknite na **Zjednotiť veľkosť strán**. + +## Možnosti + +- **Štandardné veľkosti**: A4, Letter, Legal, A3, A5, Tabloid +- **Vlastné rozmery**: Zadajte šírku a výšku v palcoch alebo milimetroch +- **Orientácia**: Automaticky, Na výšku, Na šírku +- **Režim škálovania**: Prispôsobiť alebo Vyplniť (orezať) +- **Farba pozadia**: Ľubovoľná farba výplne okrajov + +## Príklady použitia + +- Zjednotenie spojeného PDF, ktorého strany pochádzajú z rôznych skenerov +- Prevod dokumentu US Letter na A4 pre medzinárodnú distribúciu +- Príprava PDF na tlač, ktorá vyžaduje jednotný formát po orezaní +- Oprava strán, ktoré sú mierne mimo štandardu (napr. 8,49 x 11,02 palca namiesto 8,5 x 11) + +## Tipy + +- Režim Prispôsobiť zaručí, že sa nestratí žiadny obsah. Režim Vyplniť vyzerá čistejšie, ale môže orezať okraje. +- Výsledok skontrolujte nástrojom Rozmery strany a overte, že každá strana zodpovedá cieľovej veľkosti. +- Predvolená farba pozadia je biela; ak má váš dokument tmavé okraje, zvoľte tmavú farbu. + +## Súvisiace nástroje + +- [Rozmery strany](./page-dimensions): skontrolujte veľkosti strán pred opravou a po nej +- [Komprimovať PDF](./compress-pdf): zmenšite veľkosť súboru po zjednotení +- [Orezať PDF](./crop-pdf): orežte strany ručne namiesto automatického škálovania diff --git a/docs/sk/tools/flatten-pdf.md b/docs/sk/tools/flatten-pdf.md new file mode 100644 index 00000000..92812667 --- /dev/null +++ b/docs/sk/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Sploštiť PDF +description: Zlúčte interaktívne formuláre a anotácie do statického obsahu. Polia formulára už nebude možné upravovať a anotácie sa vpália do strany. +--- + +# Sploštiť PDF + +Zlúčenie vrstiev vloží interaktívne prvky (polia formulára, rozbaľovacie zoznamy, zaškrtávacie políčka, anotácie, zvýraznenia, poznámky) priamo do obsahu strany. Vzhľad zostane rovnaký, no nič už nebude možné upravovať ani extrahovať. Je to ekvivalent vytlačenia vyplneného formulára a jeho opätovného naskenovania, len s dokonalou kvalitou. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF. +2. Kliknite na **Zlúčiť vrstvy PDF**. +3. Jeden súbor sa stiahne priamo. Viac súborov vytvorí archív ZIP. + +Nástroj používa pdf-lib na zlúčenie polí formulára (cez `form.flatten()`) a samostatný nástroj na vpálenie anotácií do obsahu strany. Obe operácie prebehnú v jednom kroku. + +## Čo sa zlúči + +- **Polia formulára**: Textové polia, zaškrtávacie políčka, prepínače, rozbaľovacie zoznamy, podpisové polia +- **Anotácie**: Komentáre, zvýraznenia, preškrtnutia, podčiarknutia, poznámky, pečiatky, kresby +- **Interaktívne prvky**: Tlačidlá, spúšťače akcií + +## Čo zostane nezmenené + +- Textový obsah (zostane označiteľný a vyhľadávateľný) +- Obrázky a grafika +- Rozloženie a rozmery strán +- Záložky a obsah +- Hypertextové odkazy (pokiaľ nie sú založené na anotáciách) + +## Príklady použitia + +- Uzamknutie vyplneného formulára, aby príjemcovia nemohli meniť odoslané odpovede +- Príprava PDF na archiváciu, keď interaktívne prvky nie sú potrebné +- Oprava problémov so zobrazením, keď sa anotácie v rôznych prehliadačoch vykresľujú inak +- Zabezpečenie, aby podpísaný dokument nebolo možné po podpise upraviť +- Zmenšenie súboru odstránením definícií polí formulára a objektov anotácií + +## Tipy + +- Vrstvy zlúčte až po dokončení všetkých úprav. Zlúčenie sa nedá vrátiť. +- Ak potrebujete zlúčiť vrstvy a zároveň odstrániť metadáta, JavaScript a prílohy, použite radšej nástroj Vyčistiť PDF, ktorý zlúčenie ponúka ako jednu z možností. +- Niektoré PDF hlásia „formulár sa nenašiel“. Je to normálne, ak dokument obsahuje iba anotácie a žiadne polia formulára. + +## Súvisiace nástroje + +- [Vyčistiť PDF](./sanitize-pdf): zlúčenie formulárov plus odstránenie metadát, skriptov a ďalšieho +- [Rastrovať PDF](./rasterize-pdf): prevod na obrázkové PDF pre maximálne zlúčenie +- [Písma do kriviek](./font-to-outline): prevod písiem na vektorové cesty +- [Zašifrovať PDF](./protect-pdf): uzamknite zlúčené PDF heslom diff --git a/docs/sk/tools/font-to-outline.md b/docs/sk/tools/font-to-outline.md new file mode 100644 index 00000000..97cf6414 --- /dev/null +++ b/docs/sk/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Písma do kriviek +description: Preveďte všetky písma v PDF na vektorové krivky pre konzistentné vykreslenie na všetkých zariadeniach. Odstráni problémy so závislosťou od písiem. +--- + +# Písma do kriviek + +Prevod písiem na krivky premení každý znak textu z glyfu písma na vektorovú cestu. PDF potom nezávisí od žiadnych nainštalovaných písiem a vykreslí sa rovnako na každom zariadení, v každom operačnom systéme a na každej tlačiarni. Ide o štandardný krok v predtlačovej príprave. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF. +2. Kliknite na **Previesť na krivky**. +3. Ghostscript prevedie všetok text na vektorové cesty. +4. Stiahnite výsledok. Viac súborov vytvorí archív ZIP. + +Nie je čo nastavovať. Nástroj používa Ghostscript (WebAssembly) a v jednom kroku prevedie všetky odkazy na písma na krivky. + +## Čo sa zmení + +- Znaky textu sa stanú vektorovými krivkami (Bézierove cesty) +- Vkladanie písiem už nie je potrebné, PDF je sebestačné na úrovni glyfov +- Veľkosť súboru sa môže zväčšiť, pretože vektorové cesty sú zvyčajne väčšie ako odkazy na písma +- Vzhľad zostane presne zachovaný + +## Čo stratíte + +- Označovanie a kopírovanie textu +- Vyhľadávanie v texte (Ctrl+F prestane fungovať) +- Možnosť upravovať text +- Prístupnosť pre čítačky obrazovky + +## Príklady použitia + +- Odoslanie PDF do tlačiarne, ktorá vyžaduje písma prevedené na krivky +- Zdieľanie dokumentov s vlastnými alebo licencovanými písmami s ľuďmi, ktorí tieto písma nemajú +- Zabránenie náhrade písiem, ktorá mení vzhľad dokumentu v iných systémoch +- Príprava PDF pre laserové gravírovanie alebo CNC rezanie, ktoré vyžadujú vektorový vstup +- Zabezpečenie správneho zobrazenia PDF plného log na všetkých platformách + +## Tipy + +- Pôvodné PDF si ponechajte. Prevod na krivky je nevratný, cesty už nemožno previesť späť na upraviteľný text. +- Ak potrebujete, aby text zostal vyhľadávateľný, zvážte radšej nástroj Rastrovať PDF a následne OCR. +- PDF s krivkami bývajú väčšie. Ak záleží na veľkosti súboru, použite potom Komprimovať PDF. + +## Súvisiace nástroje + +- [Zlúčiť vrstvy PDF](./flatten-pdf): zlúčte formuláre a anotácie bez zmeny písiem +- [Rastrovať PDF](./rasterize-pdf): prevod na obrázkové PDF namiesto vektorových kriviek +- [Komprimovať PDF](./compress-pdf): zmenšite súbor po prevode na krivky +- [PDF do PDF/A](./pdf-to-pdfa): prevod na archiváciu po zaistení nezávislosti od písiem diff --git a/docs/sk/tools/form-creator.md b/docs/sk/tools/form-creator.md new file mode 100644 index 00000000..b6edc630 --- /dev/null +++ b/docs/sk/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Vytvoriť PDF formulár +description: Vytvárajte vyplniteľné PDF formuláre s textovými poľami, zaškrtávacími políčkami, rozbaľovacími zoznamami, prepínačmi a ďalšími prvkami pomocou pretiahnutia. +--- + +# Vytvoriť PDF formulár + +Navrhnite profesionálne vyplniteľné PDF formuláre od nuly alebo pridajte polia do existujúceho PDF. Vizuálny editor vám umožní pretiahnuť prvky formulára (textové polia, zaškrtávacie políčka, rozbaľovacie zoznamy, prepínače, podpisové polia a ďalšie) priamo na náhľady strán. Nastavte vlastnosti polí, pravidlá podmienenej viditeľnosti a exportujte plne interaktívny PDF formulár. + +## Ako to funguje + +1. Nahrajte existujúce PDF **alebo** kliknite na **Vytvoriť prázdne PDF** a začnite od nuly. +2. Pri prázdnom PDF vyberte veľkosť strany (Letter, A4, A5, Legal, Tabloid, A3 alebo vlastné rozmery). +3. Otvorí sa editor formulárov s panelom typov polí a oblasťou náhľadu strany. +4. Na paneli vyberte typ poľa a kliknutím na stranu ho umiestnite. +5. Polia presúvajte pretiahnutím. Rozmery upravíte úchytmi. +6. Kliknutím na pole otvoríte panel vlastností, kde nastavíte názov poľa, predvolenú hodnotu, veľkosť písma, zarovnanie a ďalšie. +7. Medzi stranami prechádzajte ovládacími prvkami strán. +8. Kliknite na **Uložiť** a stiahnite hotové vyplniteľné PDF. + +## Funkcie + +- Umiestňovanie polí pretiahnutím s vizuálnymi úchytmi na zmenu veľkosti +- Typy polí: textové pole, viacriadkový text, zaškrtávacie políčko, rozbaľovací zoznam, prepínač, podpis, dátum, číslo a čiarový kód +- Panel vlastností na nastavenie názvu, popisu, predvolenej hodnoty, veľkosti písma, farby, zarovnania a validácie každého poľa +- Akcie polí a pravidlá podmienenej viditeľnosti (zobrazenie alebo skrytie polí podľa hodnôt iných polí) +- Navigácia po stranách pre viacstranové formuláre +- Extrakcia existujúcich polí: automaticky rozpozná a importuje polia formulára z nahraných PDF +- Ako plátno formulára slúži nahrané PDF alebo prázdne strany +- Viacero predvolieb veľkosti strany plus vlastné rozmery +- Generovanie čiarových kódov pomocou bwip-js +- Správa skupín prepínačov + +## Možnosti + +**Predvoľby veľkosti strany (pre prázdne PDF):** + +- Letter (8,5" x 11") +- A4 (210 mm x 297 mm) +- A5 (148 mm x 210 mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297 mm x 420 mm) +- Vlastná (zadajte šírku a výšku) + +**Vlastnosti polí (líšia sa podľa typu poľa):** + +- Názov, popis a zástupný text +- Predvolená hodnota +- Rodina, veľkosť a farba písma +- Zarovnanie textu (vľavo, na stred, vpravo) +- Prepínač povinného poľa +- Prepínač iba na čítanie +- Maximálna dĺžka textových polí +- Zoznam možností pre rozbaľovacie zoznamy a prepínače +- Akcie podmienenej viditeľnosti + +## Príklady použitia + +- Tvorba formulárov na nástup zamestnancov s textovými poľami pre osobné údaje a zaškrtávacími políčkami na potvrdenie pravidiel +- Tvorba vstupných dotazníkov pre klientov s rozbaľovacími zoznamami na výber služby +- Návrh objednávkových formulárov s vypočítavanými poľami a čiarovými kódmi +- Tvorba kontrolných zoznamov s prepínačmi na hodnotenie vyhovel/nevyhovel +- Tvorba prieskumov s doplňujúcimi otázkami, ktoré sa zobrazia podľa odpovedí + +## Tipy + +- Ak nahráte existujúce PDF, nástroj sa pokúsi extrahovať už prítomné polia formulára, aby ste ich mohli upraviť alebo doplniť. +- Funkciou skupín prepínačov vytvoríte vzájomne sa vylučujúce voľby. Polia v rovnakej skupine zdieľajú názov skupiny. +- Formulár otestujte tak, že ho stiahnete a otvoríte v nástroji [Vypĺňanie PDF formulárov](./form-filler) a overíte správanie polí. + +## Súvisiace nástroje + +- [Vypĺňanie PDF formulárov](./form-filler) +- [Podpísať PDF](./sign-pdf) +- [Editor PDF](./edit-pdf) diff --git a/docs/sk/tools/form-filler.md b/docs/sk/tools/form-filler.md new file mode 100644 index 00000000..44804475 --- /dev/null +++ b/docs/sk/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Vypĺňanie PDF formulárov +description: Vypĺňajte PDF formuláre vrátane formulárov XFA priamo v prehliadači pomocou vstavaného prehliadača. +--- + +# Vypĺňanie PDF formulárov + +Otvorte PDF s poľami formulára a vyplňte ho priamo vo vstavanom prehliadači. Nástroj podporuje štandardné polia AcroForm aj staršie formuláre XFA (XML Forms Architecture). Po vyplnení stiahnete vyplnenú verziu jedným kliknutím. + +## Ako to funguje + +1. Nahrajte PDF, ktoré obsahuje polia formulára. +2. Dokument sa otvorí v integrovanom prehliadači PDF, ktorý zobrazí polia formulára ako interaktívne vstupy. +3. Kliknite na textové polia, zaškrtávacie políčka, rozbaľovacie zoznamy a prepínače a vyplňte ich. +4. Kliknite na **Uložiť a stiahnuť vyplnený formulár** a získajte hotové PDF. + +## Funkcie + +- Vstavaný prehliadač PDF.js s plnou interakciou s poľami formulára +- Podpora štandardných polí AcroForm (textové polia, zaškrtávacie políčka, rozbaľovacie zoznamy, prepínače) +- Podpora formulárov XFA pre staršie formuláre založené na XML +- Automatické prispôsobenie veľkosti prehliadača podľa rozmerov strany +- Zobrazenie súboru s názvom a veľkosťou + +## Možnosti + +Nie sú k dispozícii žiadne ďalšie nastavenia. Nahrajte formulár, vyplňte ho a stiahnite. + +## Príklady použitia + +- Vypĺňanie daňových formulárov, žiadostí o poistenie alebo úradných tlačív +- Vypĺňanie žiadostí o zamestnanie prijatých ako prílohy PDF +- Vypĺňanie formulárov na registráciu dodávateľov alebo dotazníkov pre dodávateľov +- Potvrdzovanie kontrolných zoznamov súladu pomocou zaškrtávacích políčok +- Vypĺňanie zdravotných dotazníkov pred návštevou lekára + +## Tipy + +- Formuláre XFA sú starší formát, ktorý podporujú iba niektoré prehliadače PDF. Ak otvoríte PDF s XFA v Chrome alebo vo väčšine iných nástrojov a vidíte prázdne strany, tieto prehliadače XFA nepodporujú. Vypĺňanie formulárov v BentoPDF aj Firefox si s XFA poradia správne. +- Pre PDF bez polí formulára najprv pridajte polia nástrojom [Vytvoriť PDF formulár](./form-creator) a potom ich vyplňte tu. +- Prehliadač automaticky prispôsobí svoju veľkosť rozmerom strán PDF. + +## Súvisiace nástroje + +- [Vytvoriť PDF formulár](./form-creator) +- [Podpísať PDF](./sign-pdf) +- [Editor PDF](./edit-pdf) diff --git a/docs/sk/tools/header-footer.md b/docs/sk/tools/header-footer.md new file mode 100644 index 00000000..83874c24 --- /dev/null +++ b/docs/sk/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Hlavička a pätička +description: Pridajte na strany PDF prispôsobiteľný text hlavičky a pätičky s dynamickými premennými čísla strany. +--- + +# Hlavička a pätička + +Pridajte text na šesť pozícií na stranách PDF: hlavička vľavo, na stred a vpravo, pätička vľavo, na stred a vpravo. Nástroj podporuje dynamické premenné pre číslo strany a celkový počet strán, takže môžete vytvoriť šablóny ako „Strana 3 z 10“, ktoré sa na každej strane automaticky aktualizujú. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Zobrazí sa panel možností s ovládacími prvkami formátovania a šiestimi textovými poľami. +3. Zadajte požadovaný text do ktorejkoľvek pozície hlavičky alebo pätičky. +4. Na dynamické číslovanie strán použite zástupné symboly `{page}` a `{total}`. +5. Upravte veľkosť a farbu písma a voliteľne obmedzte rozsah strán. +6. Kliknite na **Pridať hlavičku a pätičku**, čím súbor spracujete a stiahnete. + +## Možnosti + +- **Rozsah strán**: Voliteľne obmedzte, ktoré strany dostanú hlavičky a pätičky. Ak pole necháte prázdne, použije sa na všetky strany. Formát: „1-3, 5“ (rozsahy oddelené čiarkou). +- **Veľkosť písma**: Od 6 do 24 bodov. Predvolene 10. +- **Farba písma**: Vyberte ľubovoľnú farbu pomocou výberu farby. +- **Hlavička vľavo / na stred / vpravo**: Textové polia pre hornú časť každej strany. +- **Pätička vľavo / na stred / vpravo**: Textové polia pre dolnú časť každej strany. + +## Funkcie + +- Šesť nezávislých textových pozícií na stranu +- Dynamická premenná `{page}`, ktorá vloží aktuálne číslo strany +- Dynamická premenná `{total}`, ktorá vloží celkový počet strán +- Filtrovanie rozsahu strán na cielenie konkrétnych strán +- Prispôsobiteľná veľkosť a farba písma +- Písmo Helvetica pre čistý a profesionálny výsledok + +## Príklady použitia + +- Pridanie „Strana {page} z {total}“ do stredu pätičky správy +- Umiestnenie názvu firmy do hlavičky vľavo a dátumu dokumentu do hlavičky vpravo +- Pridanie upozornení o dôvernosti do pätičky právnych dokumentov +- Označenie čísel revízií dokumentu na konkrétnych rozsahoch strán + +## Tipy + +- Skombinujte `{page}` a `{total}` v jednom poli pre formáty ako „Strana {page} z {total}“ alebo „{page}/{total}“. +- Väčšinu polí môžete nechať prázdnych a vyplniť iba potrebné pozície. Prázdne polia sa jednoducho preskočia. +- Pre zložitejšie hlavičky s obrázkami alebo logami zvážte nástroj [Pridať vodoznak](./add-watermark) umiestnený v hornej časti strany. + +## Súvisiace nástroje + +- [Čísla strán](./page-numbers) +- [Pridať vodoznak](./add-watermark) +- [Batesovo číslovanie](./bates-numbering) diff --git a/docs/sk/tools/heic-to-pdf.md b/docs/sk/tools/heic-to-pdf.md new file mode 100644 index 00000000..35dbd7bb --- /dev/null +++ b/docs/sk/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC do PDF +description: Konvertujte obrázky HEIC a HEIF z iPhonov a iPadov do formátu PDF priamo v prehliadači. +--- + +# HEIC do PDF + +Konvertujte obrázky HEIC/HEIF do PDF. HEIC je predvolený formát fotografií na iPhonoch a iPadoch od iOS 11. Tento nástroj z nich vytvorí PDF bez inštalácie desktopového softvéru a bez nahrávania súborov na server. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite súbory HEIC/HEIF. +2. Skontrolujte zoznam súborov a odstráňte nechcené súbory. +3. Kliknite na **Konvertovať do PDF**. Výsledok sa stiahne ako `from_heic.pdf`. + +Každý súbor HEIC sa dekóduje knižnicou heic2any, ktorá ho prevedie na PNG s kvalitou 92 %. PNG sa potom pomocou pdf-lib vloží do PDF, každý obrázok na samostatnú stranu v plnom rozlíšení. + +## Možnosti + +Tento nástroj neponúka ďalšie nastavenia. Obrázky HEIC sa pred vložením prevedú na PNG vo vysokej kvalite (0,92). + +## Príklady použitia + +- Vytvorenie PDF z fotografií z iPhonu ako prílohy k poistnej udalosti alebo správe +- Prevod fotografií HEIC k realitnému inzerátu do jedného tlačiteľného dokumentu +- Premena snímok obrazovky z iPadu (formát HEIF) na PDF na zdieľanie +- Hromadný prevod fotografií z dovolenky do cestovného denníka + +## Tipy + +- Dekódovanie HEIC prebieha celé v prehliadači pomocou WebAssembly. Prvá konverzia môže chvíľu trvať, kým sa dekodér načíta. +- Ak potrebujete kombinovať HEIC s inými formátmi obrázkov (JPG, PNG atď.), použite nástroj [Obrázky do PDF](./image-to-pdf), ktorý spracuje HEIC spolu so všetkými ostatnými formátmi. +- Súbory HEIC z iPhonov často obsahujú údaje EXIF vrátane súradníc GPS. Výstupné PDF tieto metadáta neprenáša. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [JPG do PDF](./jpg-to-pdf) +- [PNG do PDF](./png-to-pdf) diff --git a/docs/sk/tools/image-to-pdf.md b/docs/sk/tools/image-to-pdf.md new file mode 100644 index 00000000..a0c82e7e --- /dev/null +++ b/docs/sk/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Obrázky do PDF +description: Konvertujte JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD a viac ako 10 ďalších formátov obrázkov do jedného súboru PDF. +--- + +# Obrázky do PDF + +Univerzálny konvertor obrázkov do PDF. Nahrajte obrázky takmer v akomkoľvek formáte a spojte ich do jedného dokumentu PDF. Každý obrázok dostane vlastnú stranu s veľkosťou podľa pôvodných rozmerov. + +## Podporované formáty + +| Formát | Prípony | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Ide o najširšiu podporu formátov spomedzi všetkých konvertorov obrázkov v BentoPDF. Ak potrebujete iba konkrétny formát, použite radšej niektorý zo špecializovaných nástrojov. + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite obrázky. Môžete vybrať viac súborov naraz. +2. Skontrolujte zoznam súborov. Nechcené súbory odstránite ikonou koša, ďalšie obrázky pridáte tlačidlom **Pridať ďalšie súbory**. +3. V rozbaľovacom zozname vyberte úroveň **Kvalita PDF**. +4. Kliknite na **Konvertovať do PDF**. Nástroj spracuje obrázky enginom PyMuPDF a stiahne výsledok ako `images_to_pdf.pdf`. + +## Možnosti + +**Kvalita PDF** určuje kompresiu obrázkov pri ich vkladaní do PDF: + +- **Vysoká kvalita**: minimálna kompresia, väčší súbor. Najlepšia na tlač alebo archiváciu. +- **Stredná kvalita** (predvolená): vyvážená kompresia. Vhodná na väčšinu účelov. +- **Nízka kvalita**: agresívna kompresia, najmenší súbor. Vhodná na e-mail alebo rýchle zdieľanie. + +Súbory HEIC a WebP sa pred vložením automaticky prevedú na PNG. Prebieha to na pozadí a nevyžaduje žiadne ďalšie kroky. + +## Príklady použitia + +- Spojenie naskenovaných účteniek alebo dokumentov z fotoaparátu telefónu do jedného PDF +- Vytvorenie fotografického portfólia alebo katalógu z obrázkov v rôznych formátoch +- Prevod fotografií z iPhonu (HEIC) do PDF na zdieľanie bez inštalácie desktopového softvéru +- Zostavenie návrhov z exportov PSD a snímok obrazovky do podkladov pre klienta +- Archivácia priečinka obrázkov v starších formátoch (PNM, JXR, JP2) ako jedného PDF + +## Tipy + +- Poradie obrázkov v PDF zodpovedá poradiu v zozname súborov. Nahrajte ich v požadovanom poradí. +- Pre najmenší možný súbor zvoľte Nízku kvalitu. Pri skenoch s prevahou textu je vizuálny rozdiel často zanedbateľný. +- Ak máte iba jeden formát obrázkov, špecializované konvertory (JPG do PDF, PNG do PDF atď.) ponúknu rovnaký výsledok s jednoduchším rozhraním. + +## Súvisiace nástroje + +- [JPG do PDF](./jpg-to-pdf) +- [PNG do PDF](./png-to-pdf) +- [HEIC do PDF](./heic-to-pdf) +- [WebP do PDF](./webp-to-pdf) diff --git a/docs/sk/tools/index.md b/docs/sk/tools/index.md new file mode 100644 index 00000000..4a4068d3 --- /dev/null +++ b/docs/sk/tools/index.md @@ -0,0 +1,183 @@ +# Prehľad nástrojov + +BentoPDF ponúka **viac ako 130 nástrojov** na prácu s PDF. Všetky nástroje bežia výhradne vo vašom prehliadači: vaše súbory nikdy neopustia vaše zariadenie. + +--- + +## Úpravy a anotácie + +Upravujte, označujte a vylepšujte svoje dokumenty PDF pomocou úplnej sady nástrojov na úpravy. + +
+ +- [**Editor PDF**](./edit-pdf): Anotujte, zvýrazňujte, redigujte, komentujte, pridávajte tvary a obrázky, vyhľadávajte a prezerajte PDF. +- [**Upraviť záložky**](./bookmark): Pridávajte, upravujte, importujte, odstraňujte a extrahujte záložky PDF. +- [**Obsah**](./table-of-contents): Vygenerujte stranu s obsahom zo záložiek PDF. +- [**Čísla strán**](./page-numbers): Vložte do dokumentu čísla strán. +- [**Pridať označenia strán**](./add-page-labels): Použite označenia strán PDF s rímskymi číslicami, predponami a vlastným začiatkom. +- [**Batesovo číslovanie**](./bates-numbering): Pridajte postupné Batesove čísla do jedného alebo viacerých súborov PDF. +- [**Pridať vodoznak**](./add-watermark): Umiestnite text alebo obrázok na strany PDF. +- [**Hlavička a pätička**](./header-footer): Pridajte text do hornej a dolnej časti strán. +- [**Invertovať farby**](./invert-colors): Vytvorte tmavú verziu svojho PDF. +- [**Efekt skenera**](./scanner-effect): Nechajte PDF vyzerať ako naskenovaný dokument. +- [**Úprava farieb**](./adjust-colors): Dolaďte jas, kontrast, sýtosť a ďalšie. +- [**Farba pozadia**](./background-color): Zmeňte farbu pozadia PDF. +- [**Zmeniť farbu textu**](./text-color): Zmeňte farbu textu v PDF. +- [**Podpísať PDF**](./sign-pdf): Nakreslite, napíšte alebo nahrajte svoj podpis. +- [**Pridať pečiatky**](./add-stamps): Pridajte do PDF obrázkové pečiatky pomocou panela anotácií. +- [**Odstrániť anotácie**](./remove-annotations): Odstráňte komentáre, zvýraznenia a odkazy. +- [**Orezať PDF**](./crop-pdf): Orežte okraje každej strany PDF. +- [**Vypĺňanie PDF formulárov**](./form-filler): Vypĺňajte formuláre priamo v prehliadači. Podporuje aj formuláre XFA. +- [**Vytvoriť PDF formulár**](./form-creator): Vytvárajte vyplniteľné PDF formuláre s textovými poľami pomocou pretiahnutia. +- [**Odstrániť prázdne strany**](./remove-blank-pages): Automaticky rozpoznajte a odstráňte prázdne strany. + +
+ +--- + +## Konvertovať do PDF + +Premeňte obrázky, dokumenty, e-knihy a ďalšie formáty súborov na PDF. + +
+ +- [**Obrázky do PDF**](./image-to-pdf): Konvertujte JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP a ďalšie do PDF. +- [**JPG do PDF**](./jpg-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov JPG. +- [**PNG do PDF**](./png-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov PNG. +- [**WebP do PDF**](./webp-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov WebP. +- [**SVG do PDF**](./svg-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov SVG. +- [**BMP do PDF**](./bmp-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov BMP. +- [**HEIC do PDF**](./heic-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov HEIC. +- [**TIFF do PDF**](./tiff-to-pdf): Vytvorte PDF z jedného alebo viacerých obrázkov TIFF. +- [**Text do PDF**](./txt-to-pdf): Konvertujte obyčajný textový súbor do PDF. +- [**Markdown do PDF**](./markdown-to-pdf): Konvertujte Markdown do PDF so živým náhľadom a zvýrazňovaním syntaxe. +- [**JSON do PDF**](./json-to-pdf): Konvertujte súbory JSON do formátu PDF. +- [**ODT do PDF**](./odt-to-pdf): Konvertujte súbory ODT (OpenDocument Text) do PDF. +- [**CSV do PDF**](./csv-to-pdf): Konvertujte tabuľky CSV do PDF. +- [**RTF do PDF**](./rtf-to-pdf): Konvertujte dokumenty RTF (Rich Text Format) do PDF. +- [**Word do PDF**](./word-to-pdf): Konvertujte dokumenty Word (DOCX, DOC, ODT) do PDF. +- [**Excel do PDF**](./excel-to-pdf): Konvertujte tabuľky Excel (XLSX, XLS, ODS) do PDF. +- [**PowerPoint do PDF**](./powerpoint-to-pdf): Konvertujte prezentácie PowerPoint (PPTX, PPT, ODP) do PDF. +- [**XPS do PDF**](./xps-to-pdf): Konvertujte dokumenty XPS/OXPS do PDF. +- [**MOBI do PDF**](./mobi-to-pdf): Konvertujte e-knihy MOBI do PDF. +- [**EPUB do PDF**](./epub-to-pdf): Konvertujte e-knihy EPUB do PDF. +- [**FB2 do PDF**](./fb2-to-pdf): Konvertujte e-knihy FictionBook (FB2) do PDF. +- [**CBZ do PDF**](./cbz-to-pdf): Konvertujte komiksové archívy (CBZ/CBR) do PDF. +- [**WPD do PDF**](./wpd-to-pdf): Konvertujte dokumenty WordPerfect (WPD) do PDF. +- [**WPS do PDF**](./wps-to-pdf): Konvertujte dokumenty WPS Office do PDF. +- [**XML do PDF**](./xml-to-pdf): Konvertujte dokumenty XML do PDF. +- [**ODG do PDF**](./odg-to-pdf): Konvertujte OpenDocument Graphics (ODG) do PDF. +- [**ODS do PDF**](./ods-to-pdf): Konvertujte OpenDocument Spreadsheet (ODS) do PDF. +- [**ODP do PDF**](./odp-to-pdf): Konvertujte OpenDocument Presentation (ODP) do PDF. +- [**PUB do PDF**](./pub-to-pdf): Konvertujte Microsoft Publisher (PUB) do PDF. +- [**VSD do PDF**](./vsd-to-pdf): Konvertujte Microsoft Visio (VSD, VSDX) do PDF. +- [**PSD do PDF**](./psd-to-pdf): Konvertujte súbory Adobe Photoshop (PSD) do PDF. +- [**E-mail do PDF**](./email-to-pdf): Konvertujte e-mailové súbory (EML, MSG) do formátu PDF. + +
+ +--- + +## Konvertovať z PDF + +Extrahujte obsah z PDF do obrázkov, dokumentov a dátových formátov. + +
+ +- [**PDF do JPG**](./pdf-to-jpg): Konvertujte každú stranu PDF na obrázok JPG. +- [**PDF do PNG**](./pdf-to-png): Konvertujte každú stranu PDF na obrázok PNG. +- [**PDF do WebP**](./pdf-to-webp): Konvertujte každú stranu PDF na obrázok WebP. +- [**PDF do BMP**](./pdf-to-bmp): Konvertujte každú stranu PDF na obrázok BMP. +- [**PDF do TIFF**](./pdf-to-tiff): Konvertujte každú stranu PDF na obrázok TIFF. +- [**PDF do CBZ**](./pdf-to-cbz): Konvertujte PDF na CBZ (Comic Book Archive) pre čítačky komiksov a Calibre. +- [**PDF do SVG**](./pdf-to-svg): Konvertujte každú stranu PDF na škálovateľnú vektorovú grafiku. +- [**PDF do CSV**](./pdf-to-csv): Extrahujte tabuľky z PDF a konvertujte ich do formátu CSV. +- [**PDF do Excelu**](./pdf-to-excel): Extrahujte tabuľky z PDF a konvertujte ich do Excelu (XLSX). +- [**PDF do odtieňov sivej**](./pdf-to-greyscale): Konvertujte všetky farby na čiernobiele. +- [**PDF do JSON**](./pdf-to-json): Konvertujte súbory PDF do formátu JSON. +- [**PDF do Wordu**](./pdf-to-word): Konvertujte súbory PDF na upraviteľné dokumenty Word. +- [**Extrahovať obrázky**](./extract-images): Extrahujte všetky vložené obrázky zo súborov PDF. +- [**PDF do Markdownu**](./pdf-to-markdown): Konvertujte text a tabuľky z PDF do formátu Markdown. +- [**Pripraviť PDF pre AI**](./prepare-pdf-for-ai): Extrahujte obsah PDF ako LlamaIndex JSON pre procesy RAG/LLM. +- [**PDF do Textu**](./pdf-to-text): Extrahujte text zo súborov PDF a uložte ho ako obyčajný text. +- [**Extrahovať PDF tabuľky**](./extract-tables): Extrahujte tabuľky z PDF ako CSV, JSON alebo Markdown. + +
+ +--- + +## Usporiadanie a správa + +Preusporiadajte, spájajte, rozdeľujte a spravujte strany a súbory PDF. + +
+ +- [**Tvorca pracovných postupov (Workflow) PDF**](./pdf-workflow): Zostavte si vlastné procesy spracovania PDF pomocou vizuálneho editora uzlov. +- [**PDF Multi Nástroj**](./pdf-multi-tool): Plnohodnotný editor PDF so správou strán. +- [**Rozpoznávanie textu (OCR) PDF**](./ocr-pdf): Umožnite vyhľadávanie a kopírovanie textu v PDF. +- [**Spojiť PDF**](./merge-pdf): Spojte viac PDF do jedného súboru. +- [**Striedavo spojiť a zmiešať strany**](./alternate-merge): Spojte PDF striedaním strán z každého PDF. +- [**Usporiadať obojstranné skenovanie**](./duplex-collate): Zoraďte bloky predných a zadných strán skenu do správneho poradia. +- [**Duplikovať a organizovať**](./organize-pdf): Duplikujte, preusporiadajte a odstraňujte strany. +- [**Pridať prílohy**](./add-attachments): Vložte do PDF jeden alebo viac súborov. +- [**Extrahovať prílohy**](./extract-attachments): Extrahujte všetky vložené súbory z PDF ako ZIP. +- [**Upraviť prílohy**](./edit-attachments): Zobrazte alebo odstráňte prílohy v PDF. +- [**PDF OCG (vrstvy)**](./pdf-layers): Zobrazujte, prepínajte, pridávajte a odstraňujte vrstvy OCG v PDF. +- [**Rozdeliť PDF**](./split-pdf): Extrahujte rozsah strán do nového PDF. +- [**Rozdeliť strany**](./divide-pages): Rozdeľte strany vodorovne alebo zvisle. +- [**Extrahovať strany**](./extract-pages): Uložte výber strán ako nové súbory. +- [**Odstrániť strany**](./delete-pages): Odstráňte konkrétne strany z dokumentu. +- [**Pridať prázdnu stranu**](./add-blank-page): Vložte prázdnu stranu kdekoľvek do PDF. +- [**Obrátiť poradie strán**](./reverse-pages): Obráťte poradie všetkých strán v dokumente. +- [**Otočiť PDF**](./rotate-pdf): Otáčajte strany po 90 stupňoch. +- [**Otočiť o vlastné stupne**](./rotate-custom): Otočte strany o ľubovoľný uhol. +- [**N-Up PDF**](./n-up-pdf): Usporiadajte viac strán na jeden hárok. +- [**PDF Brožúra**](./pdf-booklet): Preusporiadajte strany na obojstrannú tlač brožúry. +- [**Spojiť do jednej strany**](./combine-single-page): Zošite všetky strany do jedného súvislého pásu. +- [**Zobraziť metadáta**](./view-metadata): Skontrolujte skryté vlastnosti PDF. +- [**Upraviť metadáta**](./edit-metadata): Zmeňte autora, názov a ďalšie vlastnosti. +- [**PDF do ZIP**](./pdf-to-zip): Zabaľte viac súborov PDF do archívu ZIP. +- [**Porovnať PDF**](./compare-pdfs): Porovnajte dve PDF vedľa seba. +- [**Vytvoriť plagát z PDF**](./posterize-pdf): Rozdeľte veľkú stranu na viac menších strán. + +
+ +--- + +## Optimalizácia a oprava + +Komprimujte, opravujte a optimalizujte PDF pre lepší výkon a kompatibilitu. + +
+ +- [**Komprimovať PDF**](./compress-pdf): Zmenšite veľkosť súboru PDF. +- [**PDF do PDF/A**](./pdf-to-pdfa): Konvertujte PDF do PDF/A na dlhodobú archiváciu. +- [**Zjednotiť veľkosť strán**](./fix-page-size): Zjednoťte všetky strany na rovnakú veľkosť. +- [**Linearizovať PDF**](./linearize-pdf): Optimalizujte PDF na rýchle zobrazenie na webe. +- [**Rozmery strany**](./page-dimensions): Analyzujte veľkosť strany, orientáciu a jednotky. +- [**Odstrániť obmedzenia**](./remove-restrictions): Odstráňte ochranu heslom a bezpečnostné obmedzenia. +- [**Opraviť PDF**](./repair-pdf): Obnovte údaje z poškodených súborov PDF. +- [**Rastrovať PDF**](./rasterize-pdf): Konvertujte PDF na PDF založené na obrázkoch. Zlúčte vrstvy a odstráňte označiteľný text. +- [**Zarovnať naklonené PDF**](./deskew-pdf): Automaticky vyrovnajte naklonené naskenované strany pomocou OpenCV. +- [**Písma do kriviek**](./font-to-outline): Preveďte všetky písma na vektorové krivky pre konzistentné vykreslenie. + +
+ +--- + +## Zabezpečenie PDF + +Chráňte, šifrujte a kontrolujte prístup k svojim dokumentom PDF. + +
+ +- [**Zašifrovať PDF**](./protect-pdf): Uzamknite PDF pridaním hesla. +- [**Vyčistiť PDF**](./sanitize-pdf): Odstráňte metadáta, anotácie, skripty a ďalšie. +- [**Dešifrovať PDF**](./unlock-pdf): Odomknite PDF odstránením ochrany heslom. +- [**Zlúčiť vrstvy PDF**](./flatten-pdf): Urobte polia formulára a anotácie neupraviteľnými. +- [**Odstrániť metadáta**](./remove-metadata): Odstráňte skryté údaje z PDF. +- [**Zmeniť oprávnenia**](./change-permissions): Nastavte alebo zmeňte používateľské oprávnenia PDF. +- [**Digitálny podpis**](./digital-sign-pdf): Pridajte kryptografický digitálny podpis pomocou certifikátov X.509. +- [**Overiť podpis**](./validate-signature-pdf): Overte digitálne podpisy a zobrazte podrobnosti certifikátu. + +
diff --git a/docs/sk/tools/invert-colors.md b/docs/sk/tools/invert-colors.md new file mode 100644 index 00000000..130dea24 --- /dev/null +++ b/docs/sk/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Invertovať farby +description: Invertujte všetky farby v PDF a vytvorte tmavú verziu akéhokoľvek dokumentu. +--- + +# Invertovať farby + +Prevráťte každú farbu v PDF na jej inverznú hodnotu. Biele pozadie sa zmení na čierne, čierny text na biely a všetky ostatné farby sa posunú na doplnkové. Je to najrýchlejší spôsob, ako vytvoriť „tmavú“ verziu akéhokoľvek PDF. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Kliknite na **Invertovať farby**. +3. Invertované PDF sa stiahne automaticky. + +Nie sú k dispozícii žiadne ďalšie nastavenia. Nástroj vykreslí každú stranu ako obrázok, invertuje farby všetkých pixelov a výsledok poskladá do nového PDF. + +## Funkcie + +- Inverzia farieb všetkých strán jedným kliknutím +- Spracuje každú stranu dokumentu +- Zachová pôvodné rozmery a rozloženie strán +- Funguje s akýmkoľvek PDF bez ohľadu na typ obsahu (text, obrázky, kombinácia) + +## Príklady použitia + +- Vytvorenie tmavých verzií učebníc alebo príručiek na pohodlné čítanie v noci +- Príprava vysokokontrastných verzií dokumentov z dôvodu prístupnosti +- Invertovanie naskenovaných dokumentov zachytených s nesprávnou expozíciou +- Generovanie negatívov PDF s množstvom obrázkov na vizuálnu analýzu + +## Tipy + +- Nástroj na použitie efektu rastruje strany, takže výstup je založený na obrázkoch. Text už nebude možné označiť ani vyhľadávať. Ak potrebujete vyhľadávateľný text aj po inverzii, spracujte výstup nástrojom OCR. +- Na jemnejšie úpravy farieb (jas, kontrast, sýtosť) použite radšej nástroj [Úprava farieb](./adjust-colors). +- Spracovanie veľkých PDF s mnohými stranami môže trvať dlhšie, pretože každá strana sa vykresľuje a invertuje samostatne. + +## Súvisiace nástroje + +- [Úprava farieb](./adjust-colors) +- [Farba pozadia](./background-color) +- [Efekt skenera](./scanner-effect) diff --git a/docs/sk/tools/jpg-to-pdf.md b/docs/sk/tools/jpg-to-pdf.md new file mode 100644 index 00000000..c9646283 --- /dev/null +++ b/docs/sk/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG do PDF +description: Konvertujte jeden alebo viac obrázkov JPG, JPEG a JPEG 2000 do jedného súboru PDF priamo v prehliadači. +--- + +# JPG do PDF + +Premeňte obrázky JPG na čisté PDF. Nahrajte jeden súbor alebo naraz viac súborov JPG, každý obrázok sa vo výslednom dokumente stane stranou v plnej veľkosti. + +## Podporované formáty + +| Formát | Prípony | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite súbory JPG. Podporovaný je výber viacerých súborov. +2. Skontrolujte nahrané súbory. Ikonou koša odstránite jednotlivé súbory, tlačidlom **Pridať ďalšie súbory** pridáte ďalšie do zoznamu. +3. Vyberte úroveň **Kvalita PDF**. +4. Kliknite na **Konvertovať do PDF**. Nástroj skomprimuje obrázky podľa nastavenej kvality, prevedie ich enginom PyMuPDF a stiahne `from_jpgs.pdf`. + +## Možnosti + +**Kvalita PDF** upravuje kompresiu každého obrázka pred jeho vložením do PDF: + +- **Vysoká kvalita**: zachová maximum detailov. Na fotografie alebo tlač. +- **Stredná kvalita** (predvolená): dobrá rovnováha medzi čistotou a veľkosťou súboru. +- **Nízka kvalita**: agresívna kompresia pre najmenší výstup. + +## Príklady použitia + +- Prevod naskenovaných dokumentov uložených ako JPG do jedného PDF na odoslanie +- Zabalenie fotografií produktov do katalógu pre klientov +- Premena medicínskych alebo satelitných snímok JPEG 2000 na prenosné PDF +- Vytvorenie tlačiteľného fotoalbumu z exportov z fotoaparátu + +## Tipy + +- Súbory JPEG 2000 (`.jp2`, `.jpx`) sú plne podporované, nielen štandardný JPEG. Hodí sa to pri medicínskom zobrazovaní a geopriestorových dátach. +- Ak vaše súbory JPG pochádzajú z fotoaparátu telefónu, Stredná kvalita zvyčajne vytvorí súbor o 40 až 60 % menší ako Vysoká bez viditeľného rozdielu na obrazovke. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [PNG do PDF](./png-to-pdf) +- [WebP do PDF](./webp-to-pdf) diff --git a/docs/sk/tools/json-to-pdf.md b/docs/sk/tools/json-to-pdf.md new file mode 100644 index 00000000..df6343f6 --- /dev/null +++ b/docs/sk/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON do PDF +description: Zrekonštruujte súbory PDF z formátu JSON od BentoPDF. Preveďte exporty JSON späť na pôvodné dokumenty PDF. +--- + +# JSON do PDF + +Zrekonštruujte dokumenty PDF zo súborov JSON, ktoré predtým vytvoril nástroj BentoPDF **PDF do JSON**. Ide o nástroj na spätnú konverziu: vezme štruktúrovanú reprezentáciu PDF v JSON a znovu zostaví pôvodný dokument. + +::: warning +Tento nástroj prijíma iba súbory JSON vytvorené konvertorom PDF do JSON od BentoPDF. Bežné súbory JSON z API, databáz alebo iných nástrojov nie sú podporované. +::: + +## Podporované formáty + +| Vstup | Popis | +| :------ | :-------------------------------------------------------- | +| `.json` | Súbory JSON exportované nástrojom PDF do JSON od BentoPDF | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite jeden či viac súborov JSON. +2. Zoznam súborov zobrazí každý vybraný súbor s jeho veľkosťou. +3. Kliknite na **Konvertovať do PDF**. Nástroj spracuje všetky súbory pomocou Web Workera a enginu CPDF. +4. Výstup sa stiahne ako `jsons-to-pdf.zip` s jedným PDF pre každý vstupný súbor JSON. + +Konverzia beží vo Web Workeri na pozadí, takže rozhranie reaguje aj pri veľkých súboroch. + +## Možnosti + +Tento nástroj nemá žiadne nastavenia. Výstupné PDF úplne určuje štruktúra JSON. + +## Výstup + +Pri konverzii viacerých súborov JSON dostanete výsledky v archíve ZIP. Každé PDF je pomenované podľa zdrojového súboru JSON (napr. z `report.json` vznikne `report.pdf`). + +## Príklady použitia + +- Obnova PDF zo zálohy alebo archivačného procesu založeného na JSON +- Prevod PDF do JSON na kontrolu a potom späť do PDF +- Opätovné zostavenie dokumentov po programových úpravách štruktúry JSON +- Overenie, že export PDF do JSON zachytil všetok obsah dokumentu, spätným prevodom + +## Tipy + +- Ak potrebujete previesť ľubovoľné dáta JSON (napríklad odpovede API alebo konfiguračné súbory) na formátované PDF, lepšie poslúži nástroj [Text do PDF](./txt-to-pdf). Vložte JSON ako text a vykreslí sa so správnym formátovaním. +- Na fungovanie tohto nástroja musí byť dostupný engine CPDF vo WebAssembly. Inštancie na vlastnom serveri musia mať nakonfigurované súbory CPDF WASM. + +## Súvisiace nástroje + +- [Text do PDF](./txt-to-pdf) +- [Markdown do PDF](./markdown-to-pdf) +- [CSV do PDF](./csv-to-pdf) diff --git a/docs/sk/tools/linearize-pdf.md b/docs/sk/tools/linearize-pdf.md new file mode 100644 index 00000000..de9551a4 --- /dev/null +++ b/docs/sk/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linearizovať PDF +description: Optimalizujte súbory PDF na rýchle zobrazenie na webe s postupným načítaním. Známe aj ako optimalizácia „Fast Web View“. +--- + +# Linearizovať PDF + +Linearizácia preusporiada PDF tak, aby sa prvá strana zobrazila ešte pred stiahnutím celého súboru. Adobe to nazýva „Fast Web View“. Ak hostujete PDF na webe alebo ich poskytujete cez dokumentový portál, linearizácia výrazne zrýchli ich otváranie. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF. +2. Kliknite na **Linearizovať PDF**. +3. Stiahnite výsledky ako archív ZIP so všetkými linearizovanými súbormi. + +Nie je čo nastavovať. Nástroj používa príznak `--linearize` z QPDF, ktorý preusporiada vnútornú štruktúru PDF bez zmeny vizuálneho obsahu. + +## Čo linearizácia robí + +- Preusporiada objekty PDF tak, aby dáta prvej strany boli na začiatku súboru +- Pridá linearizačný slovník a tabuľky nápovedy, aby prehliadače vedeli, kde nájsť každú stranu +- Umožní požiadavky na rozsah bajtov: prehliadač môže načítať iba prvú stranu bez sťahovania celého súboru +- Upraví tabuľku krížových odkazov pre efektívny náhodný prístup + +## Funkcie + +- Hromadné spracovanie viacerých PDF v jednej operácii +- Výstup zachová všetok obsah, písma, obrázky a interaktívne prvky +- Používa QPDF (WebAssembly) na spoľahlivú linearizáciu v súlade so štandardmi +- Výsledky sa zabalia do ZIP na jednoduché stiahnutie + +## Príklady použitia + +- Hostovanie PDF správ na webe, kde používatelia očakávajú okamžité zobrazenie strany +- Vkladanie PDF do webových aplikácií s prehliadačmi v prehliadači +- Publikovanie PDF katalógov alebo príručiek otváraných cez pomalé mobilné pripojenie +- Príprava dokumentov pre siete na doručovanie obsahu (CDN), ktoré podporujú poskytovanie rozsahov bajtov + +## Tipy + +- Linearizujte až po všetkých ostatných úpravách. Každá ďalšia zmena (spájanie, pridávanie strán) linearizáciu poruší. +- Skombinujte s nástrojom Komprimovať PDF pre čo najmenšie a najrýchlejšie sa načítavajúce PDF. +- Linearizácia mierne zväčší súbor (zvyčajne o menej ako 1 %). + +## Súvisiace nástroje + +- [Komprimovať PDF](./compress-pdf): zmenšite súbor pred linearizáciou +- [Opraviť PDF](./repair-pdf): opravte štrukturálne problémy, ktoré bránia linearizácii +- [Odstrániť metadáta](./remove-metadata): odstráňte metadáta pred zverejnením online diff --git a/docs/sk/tools/markdown-to-pdf.md b/docs/sk/tools/markdown-to-pdf.md new file mode 100644 index 00000000..5dae953b --- /dev/null +++ b/docs/sk/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown do PDF +description: Píšte alebo vložte Markdown a exportujte ho ako profesionálne formátované PDF so živým náhľadom a zvýrazňovaním syntaxe. +--- + +# Markdown do PDF + +Plnohodnotný editor Markdownu so živým náhľadom a exportom do PDF jedným kliknutím. Píšte od nuly, nahrajte existujúci súbor `.md` alebo vložte obsah zo schránky. Editor vykresľuje Markdown v reálnom čase a exportuje naštýlované PDF pomocou vstavaného tlačového enginu prehliadača. + +## Podporované formáty + +| Vstup | Popis | +| :----------- | :-------------------------------- | +| Súbory `.md` | Nahranie tlačidlom Nahrať | +| Priamy vstup | Písanie alebo vloženie do editora | + +## Ako to funguje + +1. Otvorte nástroj Markdown do PDF. Editor sa načíta v rozdelenom zobrazení: zdrojový Markdown vľavo, vykreslený náhľad vpravo. +2. Napíšte Markdown, vložte ho alebo kliknite na **Nahrať** a načítajte súbor `.md`. +3. Medzi svetlou a tmavou témou prepínate posuvníkom témy na paneli nástrojov. +4. Kliknite na **Exportovať PDF** (alebo stlačte `Ctrl/Cmd + S`) a vytvorte PDF cez dialóg tlače prehliadača. + +## Funkcie + +Editor podporuje rozsiahlu sadu funkcií Markdownu nad rámec základov: + +- **Štandardný Markdown**: nadpisy, tučné písmo, kurzíva, odkazy, obrázky, zoznamy, citácie, vodorovné čiary +- **Bloky kódu** so zvýrazňovaním syntaxe pre viac ako 15 jazykov (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash a ďalšie) +- **Diagramy Mermaid**: vývojové diagramy, sekvenčné diagramy, ER diagramy a ďalšie typy grafov Mermaid sa vykreslia priamo v náhľade +- **Tabuľky** so štandardnou syntaxou tabuliek Markdown +- **Zoznamy úloh** so zaškrtávacími políčkami +- **Poznámky pod čiarou**, **dolný index**, **horný index** +- **Definičné zoznamy**, **skratky** +- Podpora **emoji** (`:smile:` sa vykreslí ako emoji) +- **Zvýraznenia** (`==marked text==`) a **vloženia** (`++inserted text++`) +- **Automatické odkazy**: obyčajné URL sa prevedú na klikateľné odkazy +- Generovanie **obsahu** +- **Kotviace odkazy** pri nadpisoch + +## Príklady použitia + +- Písanie projektovej dokumentácie a export upraveného PDF pre zainteresované strany +- Tvorba technických správ s ukážkami kódu a architektonickými diagramami Mermaid +- Prevod README z GitHubu do PDF na použitie offline alebo tlač +- Príprava návrhu alebo špecifikácie so zoznamami úloh a tabuľkami +- Vytvorenie naštýlovaných podkladov z poznámok z prednášok napísaných v Markdowne + +## Tipy + +- Výstup PDF využíva funkciu tlače do PDF v prehliadači. V Chrome môžete pred uložením upraviť okraje a mierku v dialógu tlače. +- Diagramy Mermaid sa vykreslia v náhľade, ale pri prvom použití môže inicializácia chvíľu trvať. +- Klávesovou skratkou `Ctrl/Cmd + S` exportujete bez hľadania tlačidla. + +## Súvisiace nástroje + +- [Text do PDF](./txt-to-pdf) +- [Word do PDF](./word-to-pdf) +- [JSON do PDF](./json-to-pdf) diff --git a/docs/sk/tools/merge-pdf.md b/docs/sk/tools/merge-pdf.md new file mode 100644 index 00000000..00b6ad28 --- /dev/null +++ b/docs/sk/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Spojiť PDF +description: Spojte viac súborov PDF do jedného dokumentu s preusporiadaním pretiahnutím a kontrolou na úrovni strán. +--- + +# Spojiť PDF + +Spojte viac súborov PDF do jedného dokumentu. Môžete spojiť celé súbory v určenom poradí alebo prepnúť do Režimu strán a podrobne ovládať jednotlivé strany zo všetkých nahraných PDF. + +## Ako to funguje + +1. Nahrajte dva alebo viac súborov PDF kliknutím na oblasť na nahrávanie alebo ich pretiahnutím. +2. Prepínačom v hornej časti zvoľte **Režim súborov** alebo **Režim strán**. +3. V Režime súborov preusporiadajte súbory pretiahnutím a voliteľne zadajte pre každý súbor rozsah strán (napr. `1-3, 5`). Ak rozsah necháte prázdny, zahrnú sa všetky strany. +4. V Režime strán pretiahnite jednotlivé miniatúry strán a zostavte presné poradie strán. +5. Kliknite na **Spojiť PDF** a všetko sa spojí do jedného súboru. Spojené PDF sa stiahne automaticky. + +## Funkcie + +- Dva režimy spájania: Režim súborov na rýchle spojenie celých súborov, Režim strán na ovládanie jednotlivých strán +- Preusporiadanie pretiahnutím v oboch režimoch s plynulými animáciami +- Syntax rozsahov strán (napr. `1-3, 5, 8-10`) umožňuje vybrať strany bez prepnutia do Režimu strán +- Postupne načítavané miniatúry strán udržia rozhranie svižné aj pri veľkých dokumentoch +- Bez obmedzenia počtu súborov alebo celkového počtu strán +- Zachová pôvodnú kvalitu PDF bez opätovného kódovania + +## Možnosti + +| Možnosť | Popis | +| ----------------- | --------------------------------------------------------------------------------------------------- | +| **Režim súborov** | Spojenie celých súborov vo vlastnom poradí s voliteľným filtrom rozsahu strán pre každý súbor | +| **Režim strán** | Vizuálna mriežka všetkých strán zo všetkých súborov: pretiahnutím miniatúr zostavíte presné poradie | +| **Pole strán** | Textové pole pre každý súbor, ktoré prijíma rozsahy ako `1-3, 5` na zahrnutie iba vybraných strán | + +## Príklady použitia + +- Spojenie samostatných PDF kapitol do jednej knihy alebo správy +- Spojenie motivačného listu a životopisu do jedného dokumentu žiadosti +- Výber konkrétnych strán z viacerých zdrojových dokumentov do jedného súboru +- Zostavenie naskenovaných účteniek alebo faktúr do jedného archívneho PDF +- Vytvorenie podkladov k prezentácii zo snímok z viacerých prezentácií + +## Tipy + +- Režim strán použite, keď potrebujete prekladať strany z rôznych súborov namiesto pripájania jedného súboru za druhý. +- Po prvom nahraní môžete pridať ďalšie súbory tlačidlom **Pridať ďalšie súbory** bez straty aktuálneho usporiadania. +- Rozsahy strán sa číslujú od 1, takže `1` označuje prvú stranu daného súboru. + +## Súvisiace nástroje + +- [Rozdeliť PDF](./split-pdf) +- [Duplikovať a organizovať](./organize-pdf) +- [Striedavo spojiť a zmiešať strany](./alternate-merge) +- [Odstrániť strany](./delete-pages) diff --git a/docs/sk/tools/mobi-to-pdf.md b/docs/sk/tools/mobi-to-pdf.md new file mode 100644 index 00000000..fb7cb86a --- /dev/null +++ b/docs/sk/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI do PDF +description: Konvertujte e-knihy MOBI do PDF priamo v prehliadači. Zadarmo, súkromne, bez nahrávania súborov. +--- + +# MOBI do PDF + +Konvertujte e-knihy MOBI pre Amazon Kindle na dokumenty PDF. Súbory MOBI sú viazané na zariadenia a aplikácie Kindle, takže inde sa čítajú ťažko. Prevod do PDF vám dá prenosnú verziu, ktorú otvoríte na akomkoľvek zariadení alebo vytlačíte. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----- | :------ | :------------------------------------ | +| MOBI | `.mobi` | Formát e-kníh pre Kindle (Mobipocket) | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite jeden či viac súborov MOBI. +2. Skontrolujte zoznam súborov. Nechcené súbory odstránite ikonou koša, ďalšie e-knihy pridáte tlačidlom **Pridať ďalšie súbory**. +3. Kliknite na **Konvertovať do PDF**. Engine PyMuPDF spracuje štruktúru MOBI a vykreslí každú stranu ako obsah PDF. +4. Jeden súbor sa stiahne ako PDF. Pri konverzii viacerých súborov dostanete archív ZIP s názvom `mobi-converted.zip`. + +## Možnosti + +Nie sú potrebné žiadne ďalšie nastavenia. Konverzia zachová textový obsah, formátovanie a vložené obrázky z pôvodného súboru MOBI. + +## Príklady použitia + +- Čítanie obsahu zakúpeného pre Kindle v inej čítačke, ktorá podporuje iba PDF +- Tlač kapitol z e-knihy na štúdium offline alebo poznámky +- Archivácia osobnej knižnice e-kníh v univerzálnom formáte +- Zdieľanie úryvkov s niekým, kto nemá nainštalovanú aplikáciu Kindle + +## Tipy + +- Súbory MOBI chránené DRM nemožno konvertovať. Nástroj funguje iba so súbormi MOBI bez DRM. +- Spracovanie veľkých e-kníh s mnohými vloženými obrázkami môže trvať o niekoľko sekúnd dlhšie, pretože všetko prebieha v prehliadači. + +## Súvisiace nástroje + +- [EPUB do PDF](./epub-to-pdf) +- [FB2 do PDF](./fb2-to-pdf) +- [CBZ do PDF](./cbz-to-pdf) diff --git a/docs/sk/tools/n-up-pdf.md b/docs/sk/tools/n-up-pdf.md new file mode 100644 index 00000000..22274e85 --- /dev/null +++ b/docs/sk/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Usporiadajte viac strán PDF na jeden hárok do mriežky pre kompaktnú tlač. +--- + +# N-Up PDF + +Umiestnite viac strán na jeden hárok v mriežke. Počet vytlačených strán sa zníži, pretože na hárok sa zmestí 2, 4, 6, 8, 9 alebo 16 strán. Nástroj sa postará o škálovanie, umiestnenie a voliteľné nastavenie veľkosti strany. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Vyberte počet strán na hárok (hodnota „N“): 2, 4, 6, 8, 9 alebo 16. +3. Zvoľte veľkosť výstupnej strany (predvolene A4) a orientáciu. +4. Voliteľne nastavte medzery, farbu okraja a farbu pozadia. +5. Kliknite na tlačidlo spracovania. Nástroj zmenší každú stranu a poukladá ich na nové hárky. + +## Funkcie + +- Rozloženia mriežky: 2-up, 4-up, 6-up, 8-up, 9-up a 16-up +- Nastaviteľná veľkosť a orientácia výstupnej strany +- Voliteľné medzery medzi stranami +- Nastavenie farby pozadia a okraja +- Zachováva pomer strán pôvodných strán pri prispôsobení veľkosti + +## Možnosti + +| Možnosť | Popis | +| ------------------ | -------------------------------------------------------------------- | +| **Strán na hárok** | Počet pôvodných strán na každej výstupnej strane (2, 4, 6, 8, 9, 16) | +| **Veľkosť strany** | Veľkosť výstupného hárka (A4, Letter, Legal atď.) | +| **Orientácia** | Na výšku alebo na šírku pre výstupný hárok | +| **Medzery** | Medzera v bodoch medzi stranami | +| **Farba pozadia** | Farba výplne pozadia výstupného hárka | +| **Farba okraja** | Farba okrajov okolo každej strany | + +## Príklady použitia + +- Tlač podkladov so 4 snímkami na stranu na úsporu papiera +- Vytvorenie študijných hárkov s viacerými referenčnými stranami na jednom hárku +- Vytvorenie kompaktných archívov dokumentov na založenie +- Generovanie prehľadových hárkov s miniatúrami dlhého dokumentu + +## Tipy + +- Pri rozložení 2-up často funguje lepšie orientácia na šírku, pri 4-up a viac zvyčajne na výšku. +- Väčšie medzery zlepšia čitateľnosť, ale zmenšia plochu pre každú stranu. +- Opačnú operáciu (rozdelenie jednej strany na viac) nájdete v nástroji [Vytvoriť plagát z PDF](./posterize-pdf). + +## Súvisiace nástroje + +- [Vytvoriť plagát z PDF](./posterize-pdf) +- [PDF Brožúra](./pdf-booklet) +- [Spojiť do jednej strany](./combine-single-page) diff --git a/docs/sk/tools/ocr-pdf.md b/docs/sk/tools/ocr-pdf.md new file mode 100644 index 00000000..f318c29f --- /dev/null +++ b/docs/sk/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: Rozpoznávanie textu (OCR) PDF +description: Sprístupnite naskenované PDF na vyhľadávanie a kopírovanie pomocou Tesseract OCR s podporou viacerých jazykov a filtrovaním znakov. +--- + +# Rozpoznávanie textu (OCR) PDF + +Premeňte naskenované dokumenty na PDF, v ktorých možno vyhľadávať a kopírovať text. Nástroj používa Tesseract OCR na rozpoznanie textu v obrázkoch a na pôvodné strany pridá neviditeľnú textovú vrstvu, takže vzhľad zostane zachovaný a obsah bude plne vyhľadávateľný. + +## Ako to funguje + +1. Nahrajte naskenované PDF alebo PDF založené na obrázkoch. +2. Zo zoznamu jazykov s vyhľadávaním vyberte jeden alebo viac jazykov, ktoré sa v dokumente nachádzajú. +3. Voliteľne upravte rozšírené nastavenia (rozlíšenie, binarizácia, povolené znaky). +4. Kliknite na **Spustiť OCR** a sledujte priebeh na indikátore v reálnom čase. +5. Po dokončení skontrolujte extrahovaný text a stiahnite vyhľadávateľné PDF alebo obyčajný súbor `.txt`. + +## Funkcie + +- OCR vo viacerých jazykoch s výberom jazyka s vyhľadávaním +- Neviditeľná textová vrstva zachová pôvodný vzhľad dokumentu +- Indikátor priebehu v reálnom čase a výpis záznamu počas spracovania +- Stiahnutie výsledkov ako vyhľadávateľného PDF alebo textového súboru +- Kopírovanie extrahovaného textu priamo do schránky +- Tri úrovne rozlíšenia na vyváženie rýchlosti a presnosti + +## Možnosti + +| Nastavenie | Hodnoty | Predvolené | Účel | +| ------------------------------- | ---------------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------- | +| **Rozlíšenie** | Štandardné (192 DPI), Vysoké (288 DPI), Ultra (384 DPI) | Vysoké | Vyššie rozlíšenie zlepší presnosť pri malom texte, ale trvá dlhšie | +| **Binarizovať obrázok** | Zap. / Vyp. | Vyp. | Zvýši kontrast čistých skenov prevodom na čiernobiele | +| **Predvoľba povolených znakov** | Žiadna, Alfanumerické, Čísla + mena, Iba písmená, Iba čísla, Faktúra, Formuláre, Vlastné | Žiadna | Obmedzí rozpoznávané znaky a zlepší presnosť pre konkrétne typy dokumentov | +| **Povolené znaky** | Voľný text | Prázdne | Ručne zadaná sada znakov, keď je predvoľba nastavená na Vlastné | + +## Príklady použitia + +- Sprístupnenie vyhľadávania v naskenovaných zmluvách a faktúrach pomocou Ctrl+F +- Extrakcia textu z odfotených dokumentov alebo starých papierových záznamov +- Spracovanie účteniek s predvoľbou Faktúra na presné zachytenie súm v dolároch a dátumov +- Vytváranie prístupných PDF z obrázkových skenov kvôli požiadavkám na súlad +- Hromadná extrakcia textu z naskenovaných kníh alebo príručiek + +## Tipy + +- Ak dokument obsahuje text vo viacerých jazykoch (napr. anglické nadpisy a japonský text), vyberte viac jazykov. +- Pri dokumentoch s vyblednutým alebo málo kontrastným textom použite binarizáciu, môže výrazne zlepšiť presnosť rozpoznávania. +- Predvoľby Faktúra a Formuláre výrazne znížia počet chybných rozpoznaní v štruktúrovaných dokumentoch, pretože ignorujú nepodstatné tvary znakov. + +## Súvisiace nástroje + +- [Extrahovať PDF tabuľky](./extract-tables) +- [Spojiť PDF](./merge-pdf) +- [Komprimovať PDF](./compress-pdf) diff --git a/docs/sk/tools/odg-to-pdf.md b/docs/sk/tools/odg-to-pdf.md new file mode 100644 index 00000000..b30f82ac --- /dev/null +++ b/docs/sk/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG do PDF +description: Konvertujte súbory LibreOffice Draw (ODG) do PDF priamo v prehliadači. Zadarmo, bez nahrávania, úplne súkromne. +--- + +# ODG do PDF + +Konvertujte súbory OpenDocument Graphics do PDF. ODG je natívny formát LibreOffice Draw a používa sa na diagramy, vývojové diagramy a vektorové ilustrácie. Prevod do PDF uľahčí ich zdieľanie, tlač a vkladanie do iných dokumentov. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :-------------------- | :------ | :---------------------------------------- | +| OpenDocument Graphics | `.odg` | Súbory LibreOffice Draw / OpenOffice Draw | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite súbory ODG. Naraz môžete pridať viac súborov. +2. Skontrolujte zoznam súborov. Ikonou koša odstránite jednotlivé položky, tlačidlom **Pridať ďalšie súbory** pridáte ďalšie kresby. +3. Kliknite na **Konvertovať do PDF**. V prehliadači sa načíta engine založený na LibreOffice a prevedie každý súbor ODG so zachovaním vektorovej grafiky, tvarov a textu. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov vytvorí archív ZIP s názvom `odg-to-pdf.zip`. + +## Možnosti + +Nie sú potrebné žiadne ďalšie nastavenia. Konverzia zachová pôvodné rozmery strán, tvary, spojnice a textové polia zo zdrojového súboru ODG. + +## Príklady použitia + +- Zdieľanie diagramov z LibreOffice Draw s klientmi, ktorí nemajú nainštalovaný LibreOffice +- Tlač vývojových diagramov a sieťových schém vytvorených v Draw +- Vloženie ilustrácií ODG do správy alebo prezentácie ako PDF +- Archivácia technických výkresov vo formáte, ktorý zostane čitateľný desaťročia + +## Tipy + +- Vektorové prvky zostanú vo výstupnom PDF vektormi, takže výsledok sa čisto prispôsobí akejkoľvek veľkosti tlače. +- Engine LibreOffice sa pri prvom použití chvíľu inicializuje. Ďalšie konverzie v tej istej relácii sú potom rýchlejšie. + +## Súvisiace nástroje + +- [ODS do PDF](./ods-to-pdf) +- [ODP do PDF](./odp-to-pdf) +- [VSD do PDF](./vsd-to-pdf) diff --git a/docs/sk/tools/odp-to-pdf.md b/docs/sk/tools/odp-to-pdf.md new file mode 100644 index 00000000..73f3dcc1 --- /dev/null +++ b/docs/sk/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP do PDF +description: Konvertujte prezentácie LibreOffice Impress (ODP) do PDF priamo v prehliadači. Zadarmo, súkromne, bez nahrávania. +--- + +# ODP do PDF + +Konvertujte súbory OpenDocument Presentation do PDF. ODP je natívny formát LibreOffice Impress a štandardný formát exportu z Google Slides. Po prevode prezentácií do PDF si ich môže ktokoľvek pozrieť bez prezentačného softvéru a snímky sa čisto vytlačia. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :------------------------ | :------ | :------------------------------------------- | +| OpenDocument Presentation | `.odp` | Export z LibreOffice Impress / Google Slides | + +## Ako to funguje + +1. Kliknite na oblasť na nahrávanie alebo sem pretiahnite súbory ODP. Naraz môžete vybrať viac prezentácií. +2. Skontrolujte zoznam súborov. Ikonou koša odstránite položky, tlačidlom **Pridať ďalšie súbory** pridáte ďalšie prezentácie. +3. Kliknite na **Konvertovať do PDF**. Engine založený na LibreOffice spracuje každú prezentáciu a vytvorí PDF, v ktorom je každá snímka jednou stranou. +4. Jeden súbor sa stiahne ako PDF. Viac súborov dostanete v archíve ZIP s názvom `odp-to-pdf.zip`. + +## Možnosti + +Nie je čo nastavovať. Každá snímka sa vykreslí v pôvodných rozmeroch so zachovaním textu, obrázkov, tvarov a pozadí snímok. + +## Príklady použitia + +- Distribúcia prezentácie publiku ako PDF podkladov +- Zdieľanie exportov z Google Slides s ľuďmi, ktorí uprednostňujú PDF pred ODP +- Archivácia konferenčných prednášok vo formáte iba na čítanie +- Tlač prezentácií na prezenčné workshopy + +## Tipy + +- Prechody snímok a animácie sú iba vizuálne funkcie, ktoré sa do PDF neprenesú, no všetok statický obsah sa vykreslí správne. +- Poznámky prednášajúceho sa do výstupného PDF nezahrnú. Ak ich potrebujete, exportujte ich samostatne z prezentačného softvéru. +- Rovnako ako ostatné nástroje založené na LibreOffice sa engine načíta pri prvom použití a počas relácie zostane vo vyrovnávacej pamäti. + +## Súvisiace nástroje + +- [ODG do PDF](./odg-to-pdf) +- [ODS do PDF](./ods-to-pdf) +- [PUB do PDF](./pub-to-pdf) diff --git a/docs/sk/tools/ods-to-pdf.md b/docs/sk/tools/ods-to-pdf.md new file mode 100644 index 00000000..04caf7a8 --- /dev/null +++ b/docs/sk/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS do PDF +description: Prevádzajte tabuľky LibreOffice Calc (ODS) do PDF priamo v prehliadači. Zadarmo, súkromne, bez registrácie. +--- + +# ODS do PDF + +Prevádzajte súbory OpenDocument Spreadsheet do PDF. ODS je natívny formát LibreOffice Calc a bežný formát exportu z Google Sheets. Tento nástroj vykreslí údaje, formátovanie a grafy vašej tabuľky do stránkovaného PDF, ktoré môžete vytlačiť alebo zdieľať. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----------------------- | :------ | :---------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Export z LibreOffice Calc / Google Sheets | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo presuňte svoje súbory ODS. Podporuje sa viac súborov naraz. +2. Skontrolujte zoznam súborov. Ikonou koša súbory odstránite, kliknutím na **Pridať ďalšie súbory** dávku rozšírite. +3. Kliknite na **Previesť do PDF**. V prehliadači sa načíta engine založený na LibreOffice a vykreslí každú tabuľku do strán PDF. +4. Jedna tabuľka sa stiahne ako PDF. Viac súborov sa zabalí do `ods-to-pdf.zip`. + +## Možnosti + +Nie je potrebné žiadne nastavenie. Prevodník použije v PDF existujúce rozloženie tlače, formátovanie buniek a šírky stĺpcov z tabuľky. + +## Prípady použitia + +- Zdieľanie rozpočtu alebo prehľadu z LibreOffice Calc s niekým, kto prijíma iba PDF +- Tlač exportu z Google Sheets stiahnutého ako ODS +- Archivácia finančných záznamov v needitovateľnom formáte +- Odovzdávanie formulárov alebo výkazov práce v ODS ako dokumentov s pevným rozložením + +## Tipy + +- Ak má tabuľka viac hárkov, v PDF budú zahrnuté všetky. +- Veľmi široké tabuľky sa môžu vodorovne rozložiť na viac strán PDF. Ak vám na rozložení záleží, upravte pred prevodom šírky stĺpcov v zdrojovom súbore. +- Engine LibreOffice sa inicializuje pri prvom použití. Ďalšie prevody v tej istej relácii sú rýchlejšie. + +## Súvisiace nástroje + +- [ODG do PDF](./odg-to-pdf) +- [ODP do PDF](./odp-to-pdf) +- [XML do PDF](./xml-to-pdf) diff --git a/docs/sk/tools/odt-to-pdf.md b/docs/sk/tools/odt-to-pdf.md new file mode 100644 index 00000000..35b1a2b5 --- /dev/null +++ b/docs/sk/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT do PDF +description: Prevádzajte súbory OpenDocument Text (ODT) do formátu PDF v prehliadači pomocou enginu založeného na LibreOffice. +--- + +# ODT do PDF + +Prevádzajte súbory OpenDocument Text do PDF. ODT je natívny formát LibreOffice Writer, Apache OpenOffice a ďalších open-source textových editorov. Tento nástroj používa engine LibreOffice bežiaci v prehliadači, ktorý vytvára presné prevody so zachovaním formátovania, tabuliek, obrázkov a štýlov. + +## Podporované formáty + +| Formát | Prípony | +| :---------------- | :------ | +| OpenDocument Text | `.odt` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo presuňte jeden či viac súborov ODT. +2. Skontrolujte zoznam súborov. Pridajte ďalšie súbory alebo odstráňte nechcené. +3. Kliknite na **Previesť do PDF**. Engine LibreOffice sa inicializuje (stav načítania zobrazuje indikátor priebehu) a potom sa prevedie každý súbor. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov sa zabalí do `odt-converted.zip`. + +## Možnosti + +Tento nástroj nemá žiadne ďalšie nastavenia. Prevod čo najvernejšie zachováva formátovanie pôvodného dokumentu. + +## Výstup + +| Počet vstupov | Výstup | +| :------------ | :----------------------------------------------------------- | +| 1 súbor | Stiahnutie jedného PDF (napr. `document.pdf`) | +| 2+ súborov | Archív ZIP (`odt-converted.zip`) s jedným PDF na každý súbor | + +## Prípady použitia + +- Prevod dokumentov LibreOffice Writer do PDF na zdieľanie s používateľmi Microsoft Office +- Tvorba PDF pripravených na tlač z akademických prác napísaných vo formáte OpenDocument +- Hromadný prevod priečinka šablón ODT do PDF na distribúciu +- Generovanie PDF zo súborov ODT vytvorených automatizovanými systémami na tvorbu dokumentov + +## Tipy + +- Engine LibreOffice sa načíta pri prvom použití a pre ďalšie prevody sa uloží do vyrovnávacej pamäte. Prvé načítanie trvá niekoľko sekúnd, potom sú prevody rýchle. +- Zložité dokumenty s vloženými objektmi OLE alebo neobvyklými písmami sa môžu vykresliť mierne odlišne ako v desktopovom LibreOffice. Pred hromadným prevodom vyskúšajte vzorku. +- Pre dokumenty Word (`.doc`, `.docx`) použite radšej nástroj [Word do PDF](./word-to-pdf), ktorý tiež používa engine LibreOffice, no priamo prijíma formáty Microsoft. + +## Súvisiace nástroje + +- [Word do PDF](./word-to-pdf) +- [RTF do PDF](./rtf-to-pdf) +- [Text do PDF](./txt-to-pdf) diff --git a/docs/sk/tools/organize-pdf.md b/docs/sk/tools/organize-pdf.md new file mode 100644 index 00000000..947e84d5 --- /dev/null +++ b/docs/sk/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplikovať a organizovať +description: Meňte poradie, duplikujte a odstraňujte strany PDF pomocou miniatúr s presúvaním a vlastného zadania poradia strán. +--- + +# Duplikovať a organizovať + +Meňte usporiadanie, duplikujte a odstraňujte strany PDF vo vizuálnom rozhraní s presúvaním. Každá strana sa zobrazí ako miniatúra, ktorú môžete pred uložením výsledku ako nového súboru presunúť, klonovať alebo odstrániť. + +## Ako to funguje + +1. Nahrajte jeden súbor PDF. +2. Nástroj vykreslí mriežku miniatúr so všetkými stranami. +3. Presúvaním miniatúr meňte poradie strán, zeleným tlačidlom duplikovania stranu naklonujete, červeným tlačidlom odstránenia ju odstránite. +4. Prípadne zadajte vlastné poradie strán do textového poľa (napr. `3, 1, 2, 4`) a kliknutím na **Použiť** preusporiadate všetky strany naraz. +5. Kliknutím na tlačidlo spracovania vytvoríte a stiahnete preusporiadané PDF. + +## Funkcie + +- Zmena poradia strán presúvaním s animovanými prechodmi +- Tlačidlá na duplikovanie a odstránenie pri každej strane +- Vlastné zadanie poradia strán pre presné preusporiadanie +- Označenia čísel strán, ktoré sa po každej zmene automaticky aktualizujú +- Zabraňuje odstráneniu poslednej zostávajúcej strany + +## Prípady použitia + +- Presun nesprávne umiestnenej strany na správne miesto v správe +- Duplikovanie strany formulára, aby ste mali v jednom súbore viac prázdnych kópií +- Odstránenie konceptov alebo zástupných strán pred distribúciou dokumentu +- Obrátenie alebo premiešanie poradia strán pri príprave na tlač +- Zostavenie vlastnej postupnosti strán bez opätovného spájania samostatných súborov + +## Tipy + +- Pole vlastného poradia strán očakáva pôvodné čísla strán oddelené čiarkami. Musí obsahovať každú stranu presne raz, bez vynechaní či duplikátov. +- Po duplikovaní strany odkazujú obe kópie na rovnaký index pôvodnej strany. Zmena poradia ktorejkoľvek kópie funguje nezávisle. +- Na hromadné operácie s viacerými súbormi alebo pokročilejšie postupy zvážte radšej [PDF Multi Nástroj](./pdf-multi-tool). + +## Súvisiace nástroje + +- [Spojiť PDF](./merge-pdf) +- [Odstrániť strany](./delete-pages) +- [PDF Multi Nástroj](./pdf-multi-tool) +- [Obrátiť poradie strán](./reverse-pages) diff --git a/docs/sk/tools/page-dimensions.md b/docs/sk/tools/page-dimensions.md new file mode 100644 index 00000000..c7d8499b --- /dev/null +++ b/docs/sk/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Rozmery strany +description: Analyzujte veľkosti, orientáciu, pomer strán a otočenie strán PDF. Odhaľte dokumenty so zmiešanými veľkosťami a exportujte údaje do CSV. +--- + +# Rozmery strany + +Diagnostický nástroj, ktorý prečíta každú stranu vo vašom PDF a vypíše jej presné rozmery, orientáciu, názov štandardnej veľkosti, pomer strán, plochu a otočenie. Hodí sa na odhalenie strán rôznych veľkostí pred tlačou alebo na zdokumentovanie vlastností prijatého PDF. + +## Ako to funguje + +1. Nahrajte súbor PDF. Analýza sa spustí automaticky, nie je potrebné stláčať žiadne tlačidlo. +2. Súhrnný panel zobrazí celkový počet strán, počet rôznych veľkostí strán a či má dokument zmiešané veľkosti. +3. Prezrite si úplnú tabuľku výsledkov s podrobnosťami o každej strane. +4. Prepínajte jednotky zobrazenia medzi bodmi, palcami, milimetrami a pixelmi. +5. Kliknutím na **Exportovať do CSV** údaje uložíte. + +## Vykazované polia + +| Stĺpec | Popis | +| ------------------ | ---------------------------------------------- | +| Strana č. | Poradové číslo strany | +| Rozmery | Šírka x výška vo zvolenej jednotke | +| Štandardná veľkosť | Zhodný názov (A4, Letter atď.) alebo „Vlastná“ | +| Orientácia | Na výšku alebo na šírku | +| Pomer strán | Pomer šírky k výške ako desatinné číslo | +| Plocha | Plocha strany vo zvolenej jednotke na druhú | +| Otočenie | Otočenie strany v stupňoch | + +## Funkcie + +- Automatické rozpoznanie štandardných veľkostí papiera (A3, A4, A5, Letter, Legal, Tabloid a ďalšie) +- Upozornenie na zmiešané veľkosti s prehľadom, ktoré veľkosti sa vyskytujú a koľko strán ich používa +- Prevod jednotiek medzi bodmi, palcami, milimetrami a pixelmi (pri 96 PPI) +- Export do CSV na použitie v tabuľkách alebo dokumentačných systémoch + +## Prípady použitia + +- Overenie, že všetky strany sú A4, pred odoslaním dokumentu do tlačiarne +- Zistenie, prečo sa spojené PDF tlačí na niektorých stranách s neočakávanými okrajmi +- Zdokumentovanie rozloženia strán veľkého archívu PDF pre záznamy metadát +- Nájdenie otočených strán, ktoré treba opraviť + +## Tipy + +- Ak súhrn ukazuje „Zmiešané veľkosti“, pred tlačou ich zjednoťte nástrojom Zjednotiť veľkosť strán. +- Pole otočenia pomáha nájsť strany, ktoré sa zobrazujú správne, no majú nenulový atribút otočenia, čo môže v niektorých postupoch spôsobovať problémy. + +## Súvisiace nástroje + +- [Zjednotiť veľkosť strán](./fix-page-size): zjednotí strany po zistení zmiešaných veľkostí +- [Komprimovať PDF](./compress-pdf): optimalizuje PDF po oprave problémov so stranami +- [Otočiť PDF](./rotate-pdf): opraví otočené strany diff --git a/docs/sk/tools/page-numbers.md b/docs/sk/tools/page-numbers.md new file mode 100644 index 00000000..4a196e8e --- /dev/null +++ b/docs/sk/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Čísla strán +description: Pridajte prispôsobiteľné čísla strán na ľubovoľné miesto na stranách PDF s nastaviteľným písmom, veľkosťou a farbou. +--- + +# Čísla strán + +Pridajte viditeľné čísla strán na každú stranu vášho PDF. Vy zvolíte pozíciu, formát, veľkosť písma a farbu, o zvyšok sa postará nástroj. + +## Ako to funguje + +1. Nahrajte svoj súbor PDF. +2. Nastavte čísla strán v zobrazenom paneli možností. +3. Kliknutím na **Pridať čísla strán** spustíte spracovanie. +4. Očíslované PDF sa stiahne automaticky. + +## Možnosti + +- **Pozícia**: Zvoľte, kde sa čísla strán zobrazia: dole v strede, dole vľavo, dole vpravo, hore v strede, hore vľavo alebo hore vpravo. +- **Formát**: Vyberte jednoduché číslovanie (1, 2, 3...) alebo formát „strana X z Y“ (1 / 5, 2 / 5...). +- **Veľkosť písma**: Nastavte veľkosť textu čísla strany. Predvolená hodnota je 12. +- **Farba**: Pomocou výberu farby zvoľte ľubovoľnú farbu textu čísla strany. + +## Funkcie + +- Šesť možností umiestnenia pokrývajúcich všetky rohy aj stredy +- Dva formáty číslovania: jednoduché poradové alebo „strana X z Y“ +- Nastaviteľná veľkosť písma od 6 do 72 bodov +- Plnohodnotný výber farby textu +- Automatická práca s okrajmi, ktorá drží čísla v bezpečnej oblasti bez ohľadu na veľkosť strany + +## Prípady použitia + +- Príprava dokumentov na tlač, ktoré potrebujú viditeľné odkazy na strany +- Pridanie čísel strán do spojeného PDF vytvoreného z viacerých zdrojových súborov +- Očíslovanie podkladov k prezentácii pred rozdaním +- Pridanie poradového číslovania do právnych dokumentov alebo zmlúv + +## Tipy + +- Formát „strana X z Y“ sa hodí pre dokumenty, pri ktorých čitatelia potrebujú poznať celkovú dĺžku, napríklad návrhy alebo správy. +- Ak potrebujete rôzne štýly číslovania pre rôzne časti (napríklad rímske číslice pre úvodnú časť), použite radšej nástroj [Pridať označenia strán](./add-page-labels). + +## Súvisiace nástroje + +- [Pridať označenia strán](./add-page-labels) +- [Batesovo číslovanie](./bates-numbering) +- [Hlavička a pätička](./header-footer) diff --git a/docs/sk/tools/pdf-booklet.md b/docs/sk/tools/pdf-booklet.md new file mode 100644 index 00000000..eea50287 --- /dev/null +++ b/docs/sk/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF brožúra +description: Preusporiadajte strany PDF do poradia brožúry (väzba V1) na prehnutie a zošitie do fyzickej brožúry. +--- + +# PDF brožúra + +Preusporiadajte strany PDF do poradia vyradenia brožúry. Po obojstrannej tlači a prehnutí na polovicu budú strany v správnom poradí na čítanie. Toto rozloženie sa používa pri brožúrach a zinoch so šitou väzbou V1. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Nastavte brožúru: veľkosť a orientáciu výstupnej strany. +3. Kliknutím na **Vytvoriť náhľad** uvidíte, ako budú strany rozmiestnené na každom hárku. +4. Skontrolujte náhľad, ktorý ukazuje každý fyzický hárok s priradením strán na prednej a zadnej strane. +5. Kliknutím na **Stiahnuť** uložíte PDF vyradené do brožúry. + +## Funkcie + +- Automatická zmena poradia strán pre šitú väzbu V1 +- Nastaviteľná veľkosť výstupnej strany +- Vizuálny náhľad rozloženia brožúry pred stiahnutím +- Nepárny počet strán rieši vložením prázdnych strán podľa potreby +- Zmenší zdrojové strany tak, aby sa zmestili na hárok brožúry + +## Prípady použitia + +- Tvorba tlačiteľných brožúr alebo zinov z bežného PDF +- Príprava programov konferencií alebo sprievodcov podujatiami na tlač vo vlastnej réžii +- Výroba skladaných pohľadníc alebo malých katalógov +- Tvorba zošitových publikácií alebo zbierok poézie na ručnú väzbu + +## Tipy + +- Počet strán zdrojového PDF by mal byť ideálne násobkom 4, aby bola brožúra čistá. Ak nie je, prázdne strany sa doplnia automaticky na vyplnenie posledného hárku. +- Výstup vytlačte obojstranne s nastavením tlačiarne „otáčať po kratšej strane“, potom všetky hárky spolu prehnite a zošite v chrbte. +- Ak chcete len umiestniť viac strán na jeden hárok bez poradia brožúry, použite radšej [N-Up PDF](./n-up-pdf). + +## Súvisiace nástroje + +- [N-Up PDF](./n-up-pdf) +- [Otočiť PDF](./rotate-pdf) +- [Pridať prázdnu stranu](./add-blank-page) diff --git a/docs/sk/tools/pdf-layers.md b/docs/sk/tools/pdf-layers.md new file mode 100644 index 00000000..4e5a39d7 --- /dev/null +++ b/docs/sk/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCG (vrstvy) +description: Zobrazujte, prepínajte, pridávajte a odstraňujte vrstvy Optional Content Group (OCG) v dokumente PDF. +--- + +# PDF OCG (vrstvy) + +Spravujte skupiny voliteľného obsahu (Optional Content Groups, OCG), bežne nazývané „vrstvy“, v PDF. Môžete prepínať viditeľnosť vrstiev, pridávať nové vrstvy (vrátane vnorených podradených vrstiev), odstraňovať vrstvy a uložiť upravené PDF. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Kliknutím na tlačidlo spracovania načítate dokument pomocou enginu PyMuPDF. +3. Nástroj zobrazí všetky existujúce vrstvy s ich viditeľnosťou, stavom uzamknutia a hierarchiou vnorenia. +4. Začiarkavacími políčkami vrstvy zobrazíte alebo skryjete. Uzamknuté vrstvy sa prepínať nedajú. +5. Nové vrstvy najvyššej úrovne pridáte zadaním názvu a kliknutím na tlačidlo pridania, prípadne pridajte podradené vrstvy pod existujúcu nadradenú. +6. Odstráňte vrstvy, ktoré už nepotrebujete. +7. Kliknutím na **Uložiť** stiahnete upravené PDF s použitými zmenami vrstiev. + +## Funkcie + +- Zobrazuje hierarchiu vrstiev so správnym odsadením vnorených vrstiev +- Zapínanie a vypínanie viditeľnosti vrstiev +- Indikátor uzamknutej vrstvy zabraňuje náhodným zmenám +- Pridávanie vrstiev najvyššej úrovne alebo podradených vrstiev s vlastnými názvami +- Odstraňovanie jednotlivých vrstiev +- Ukladá všetky zmeny do nového súboru PDF + +## Prípady použitia + +- Prepínanie viditeľnosti vrstiev s poznámkami v architektonických alebo technických výkresoch +- Pridávanie nových vrstiev anotácií do viacvrstvového dizajnového dokumentu +- Odstraňovanie zastaraných vrstiev zo šablóny pred jej distribúciou +- Kontrola, ktoré vrstvy existujú v zložitom PDF prijatom od tretej strany + +## Tipy + +- Ak PDF nemá žiadne vrstvy, nástroj zobrazí prázdny stav s výzvou na pridanie vrstvy. Nie všetky PDF používajú vrstvy OCG, najčastejšie sa vyskytujú v exportoch z CAD a v dizajnových súboroch. +- Podradené vrstvy sú vizuálne odsadené pod nadradenou vrstvou. Vrstvy môžete vnárať do ľubovoľnej hĺbky. +- Uzamknuté vrstvy sa zobrazujú s ikonou zámku a ich začiarkavacie políčka sú neaktívne. Tieto zámky nastavil autor PDF. + +## Súvisiace nástroje + +- [Zobraziť metadáta](./view-metadata) +- [Upraviť metadáta](./edit-metadata) +- [Duplikovať a organizovať](./organize-pdf) diff --git a/docs/sk/tools/pdf-multi-tool.md b/docs/sk/tools/pdf-multi-tool.md new file mode 100644 index 00000000..27510e1f --- /dev/null +++ b/docs/sk/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Multinástroj PDF +description: Všestranný správca strán na spájanie, rozdeľovanie, otáčanie, duplikovanie, odstraňovanie a zmenu poradia strán PDF. +--- + +# Multinástroj PDF + +Jednotný pracovný priestor pre všetky operácie so stranami PDF. Nahrajte jedno alebo viac PDF a pracujte so všetkými ich stranami v jednej vizuálnej mriežke. Otáčajte, meňte poradie, duplikujte, odstraňujte, vkladajte nové PDF, pridávajte prázdne strany a rozdeľte výsledok, a to všetko bez opustenia nástroja. + +## Ako to funguje + +1. Kliknite na **Nahrať PDF** alebo presuňte súbory do oblasti nahrávania. Podporuje sa viac súborov naraz. +2. Všetky strany zo všetkých nahraných súborov sa zobrazia v posúvateľnej mriežke s miniatúrami. +3. Strany upravujte pomocou panela nástrojov alebo tlačidiel akcií pri každej strane. +4. Vyberte strany začiarkavacím políčkom na každej karte a potom použite hromadné operácie. +5. Ikonou nožníc označte body rozdelenia, aby sa výstup rozdelil do samostatných súborov. +6. Kliknutím na **Exportovať PDF** stiahnete konečný výsledok. Ak sú prítomné značky rozdelenia, výstupom je ZIP s viacerými PDF. + +## Funkcie + +- **Spojenie**: Nahrajte viac PDF a automaticky sa spoja do jedného pracovného priestoru +- **Zmena poradia**: Presúvaním kariet strán meníte ich postupnosť +- **Otočenie**: Otáčanie jednotlivých strán alebo hromadne po 90 stupňoch (doľava alebo doprava) +- **Duplikovanie**: Klonovanie ľubovoľnej strany jedným kliknutím +- **Odstránenie**: Odstraňovanie jednotlivých strán alebo hromadné odstránenie vybraných +- **Vložiť PDF**: Pridanie nového PDF za ľubovoľnú konkrétnu stranu +- **Pridať prázdnu stranu**: Pripojenie prázdnej strany A4 na koniec +- **Rozdelenie**: Umiestnite značky rozdelenia medzi strany a exportujte ako ZIP so samostatnými PDF +- **Vybrať všetko / Zrušiť výber**: Rýchly výber pre hromadné operácie +- **Späť / Znova**: Úplná história krokov späť a znova pre každú operáciu +- **Stiahnuť vybrané**: Export iba vybraných strán ako samostatného PDF +- Pred načítaním automaticky opravuje poškodené PDF + +## Prípady použitia + +- Zostavenie vlastného dokumentu zo strán z viacerých zdrojových PDF +- Vyčistenie naskenovaného dokumentu odstránením prázdnych strán, otočením bočne naskenovaných strán a zmenou poradia sekcií +- Rozdelenie veľkého PDF na hraniciach kapitol pomocou vizuálnych značiek rozdelenia +- Rýchla úprava na úrovni strán bez potreby plnohodnotného editora PDF + +## Tipy + +- Systém späť/znova sleduje každú operáciu. Používajte ho bez obáv, svoju prácu omylom nezničíte. +- Značky rozdelenia sa zobrazujú ako modré prerušované čiary medzi stranami. Umiestnite ich vizuálne tam, kde chcete dokument rozdeliť, a exportom získate ZIP. +- Pri jednoduchom spájaní alebo rozdeľovaní môžu byť rýchlejšie samostatné nástroje [Spojiť PDF](./merge-pdf) alebo [Rozdeliť PDF](./split-pdf). Multi Nástroj vyniká, keď potrebujete viac operácií v jednej relácii. + +## Súvisiace nástroje + +- [Spojiť PDF](./merge-pdf) +- [Rozdeliť PDF](./split-pdf) +- [Duplikovať a organizovať](./organize-pdf) +- [Otočiť PDF](./rotate-pdf) diff --git a/docs/sk/tools/pdf-to-bmp.md b/docs/sk/tools/pdf-to-bmp.md new file mode 100644 index 00000000..3e57a342 --- /dev/null +++ b/docs/sk/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF do BMP +description: Prevádzajte strany PDF na nekomprimované obrázky BMP. Užitočné pre staršie systémy a tlačové postupy, ktoré vyžadujú bitmapový vstup. +--- + +# PDF do BMP + +Prevedie každú stranu PDF na obrázok BMP (Bitmap). BMP je nekomprimovaný formát, takže výstup je pixelovo presný bez straty kvality, no súbory sú veľké. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Kliknutím na **Previesť** súbor spracujete. +3. Automaticky sa stiahne jeden súbor `.bmp` alebo archív ZIP. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Strany sa vykresľujú v pevnej mierke 2x, takže obrázky majú približne dvojnásobok pôvodných rozmerov strany PDF. + +## Výstupný formát + +- **Jedna strana**: `filename.bmp` +- **Viac strán**: `filename_bmps.zip` obsahujúci `page_1.bmp`, `page_2.bmp` atď. + +## Prípady použitia + +- Odovzdávanie strán PDF starším systémom alebo zariadeniam, ktoré prijímajú iba BMP. +- Príprava nekomprimovaných obrázkov pre špecifické tlačové postupy. +- Použitie bitmapového výstupu ako vstupu pre nástroje na spracovanie obrazu, ktoré vyžadujú surové pixelové dáta. + +## Tipy + +- Súbory BMP sú veľmi veľké, pretože ukladajú surové pixelové dáta bez kompresie. Na väčšinu účelov poskytne [PDF do PNG](./pdf-to-png) bezstratovú kvalitu pri oveľa menších súboroch. +- Ak cieľový systém prijíma PNG alebo TIFF, uprednostnite tieto formáty kvôli úspore miesta na disku. + +## Súvisiace nástroje + +- [PDF do PNG](./pdf-to-png) +- [PDF do TIFF](./pdf-to-tiff) +- [PDF do JPG](./pdf-to-jpg) diff --git a/docs/sk/tools/pdf-to-cbz.md b/docs/sk/tools/pdf-to-cbz.md new file mode 100644 index 00000000..6a3c507c --- /dev/null +++ b/docs/sk/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF do CBZ +description: Preveďte PDF na súbor CBZ (Comic Book Archive) pre čítačky komiksov ako Komga, Kavita, CDisplayEx a Calibre. +--- + +# PDF do CBZ + +Prevedie PDF na súbor CBZ (Comic Book ZIP), štandardný formát digitálnych komiksov a mangy. Každá strana PDF sa stane obrázkom v archíve. Nástroj kvôli maximálnej kompatibilite generuje metadáta v troch formátoch: ComicInfo.xml, metadata.opf a ComicBookInfo JSON. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Zvoľte formát obrázkov, kvalitu, mierku a voliteľné metadáta. +3. Kliknutím na **Previesť** vytvoríte súbor CBZ. +4. Súbor `.cbz` sa stiahne automaticky. + +## Možnosti + +| Možnosť | Hodnoty | Predvolené | Popis | +| ---------------- | --------------- | ---------- | ---------------------------------------------------------------------------------------------- | +| Formát obrázkov | JPEG, PNG, WebP | JPEG | JPEG pre farebné komiksy, PNG pre bezstratovú čiernobielu mangu, WebP pre najlepšiu kompresiu. | +| Kvalita | 50–100% | 85% | Riadi kompresiu JPEG/WebP. Pri PNG je skrytá (vždy bezstratové). | +| Mierka | 1.0x–4.0x | 2.0x | Vyššia mierka vytvára ostrejšie obrázky pre obrazovky s vysokým rozlíšením. | +| Odtiene sivej | Zap./Vyp. | Vyp. | Prevedie strany do odtieňov sivej. Zmenšuje súbor pri čiernobielom obsahu. | +| Režim manga | Zap./Vyp. | Vyp. | Nastaví v metadátach smer čítania sprava doľava. | +| Zahrnúť metadáta | Zap./Vyp. | Zap. | Vloží ComicInfo.xml, metadata.opf a ComicBookInfo JSON. | + +## Polia metadát + +Keď sú metadáta zapnuté, môžete vyplniť: + +- **Názov**: Automaticky zistený z názvu súboru PDF. +- **Séria**: Názov série (napr. „Naruto“). +- **Číslo (#)**: Číslo vydania v rámci série. +- **Zväzok (Vol.)**: Číslo zväzku. +- **Autor(i)**: Meno scenáristu alebo tvorcu. +- **Vydavateľ**: Vydavateľská spoločnosť. +- **Značky / Žáner**: Značky oddelené čiarkami (napr. „Akcia, Dobrodružstvo“). +- **Rok vydania**: Rok vydania (1900–2100). +- **Hodnotenie**: Hodnotenie komunity od 0 do 5. + +## Kompatibilita metadát + +Nástroj zapisuje metadáta v troch formátoch, aby ich našla každá čítačka: + +| Formát | Umiestnenie | Podporuje | +| ------------------ | ------------------ | ------------------------------------------- | +| ComicInfo.xml | Súbor v ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Súbor v ZIP | Calibre | +| ComicBookInfo JSON | Pole komentára ZIP | Calibre (záloha) | + +## Výstupný formát + +- `filename.cbz`: Archív ZIP s očíslovanými obrázkami strán a súbormi metadát. + +Obrázky strán sú pomenované číslami doplnenými nulami (`01.jpg`, `02.jpg` atď.), aby ich čítačky zobrazili v správnom poradí. + +## Prípady použitia + +- Prevod PDF s mangou alebo komiksami na použitie v čítačkách komiksov. +- Budovanie digitálnej knižnice komiksov v Komga, Kavita alebo Calibre. +- Prevod naskenovaných komiksov do formátu vhodného na čítanie. +- Zdieľanie komiksov vo formáte, ktorý zachová smer čítania a metadáta. + +## Tipy + +- Pre farebné komiksy použite **JPEG** a pre čiernobielu mangu **PNG**, PNG komprimuje čiernobiely obsah veľmi efektívne. +- Pri mange zapnite **Odtiene sivej**, výrazne tým zmenšíte súbor. +- Vyplňte polia **Séria** a **Číslo**, aby správcovia knižníc (Komga, Calibre) mohli vašu zbierku usporiadať automaticky. +- **WebP** ponúka najlepšiu kompresiu, no staršie čítačky komiksov ho nemusia podporovať. + +## Súvisiace nástroje + +- [PDF do JPG](./pdf-to-jpg) +- [PDF do PNG](./pdf-to-png) +- [PDF do TIFF](./pdf-to-tiff) +- [Extrahovať obrázky](./extract-images) diff --git a/docs/sk/tools/pdf-to-csv.md b/docs/sk/tools/pdf-to-csv.md new file mode 100644 index 00000000..fcc98811 --- /dev/null +++ b/docs/sk/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF do CSV +description: Extrahujte tabuľky z dokumentov PDF a exportujte ich do jedného súboru CSV. Zvláda viacstranové PDF s automatickým rozpoznávaním tabuliek. +--- + +# PDF do CSV + +Extrahuje tabuľky z PDF a exportuje ich ako súbor CSV. Nástroj pomocou enginu na rozpoznávanie tabuliek z PyMuPDF prehľadá každú stranu a všetky nájdené riadky zapíše do jedného výstupu oddeleného čiarkami. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Kliknutím na **Previesť** spustíte extrakciu tabuliek. +3. Nástroj prehľadá každú stranu a automaticky rozpozná tabuľky. +4. Stiahne sa súbor `.csv` so všetkými extrahovanými údajmi tabuliek. + +Tabuľky z rôznych strán sú vo výstupe oddelené prázdnymi riadkami. Bunky obsahujúce čiarky, úvodzovky alebo zalomenia riadkov sú správne escapované podľa RFC 4180. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Všetky tabuľky nájdené v dokumente sa extrahujú a spoja do jedného CSV. + +## Výstupný formát + +- Jeden súbor `filename.csv` so všetkými rozpoznanými tabuľkami. + +## Prípady použitia + +- Prenos finančných údajov z bankových výpisov alebo faktúr v PDF do tabuľky. +- Extrakcia cenníkových tabuliek z ponúk dodávateľov na porovnanie. +- Prevod tabuľkových výskumných údajov z odborných PDF do formátu vhodného pre analytické nástroje. +- Migrácia údajov zo starších správ v PDF do databáz. + +## Tipy + +- Ak sa nenájdu žiadne tabuľky, nástroj zobrazí správu „Nenašli sa žiadne tabuľky“. Zvyčajne to znamená, že PDF používa rozloženie textu, ktoré vyzerá ako tabuľka, no nie je štruktúrované ako skutočná tabuľka. +- Pre väčšiu kontrolu nad jednotlivými tabuľkami použite [Extrahovať PDF tabuľky](./extract-tables), kde si môžete vybrať výstup CSV, JSON alebo Markdown. +- Ak potrebujete údaje vo formáte Excel so samostatným hárkom pre každú tabuľku, použite [PDF do Excelu](./pdf-to-excel). + +## Súvisiace nástroje + +- [PDF do Excelu](./pdf-to-excel) +- [Extrahovať PDF tabuľky](./extract-tables) +- [PDF do Textu](./pdf-to-text) diff --git a/docs/sk/tools/pdf-to-excel.md b/docs/sk/tools/pdf-to-excel.md new file mode 100644 index 00000000..32c7916b --- /dev/null +++ b/docs/sk/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF do Excelu +description: Extrahujte tabuľky z dokumentov PDF do tabuľky Excel. Každá tabuľka dostane vlastný hárok s odkazom na stranu. +--- + +# PDF do Excelu + +Extrahuje tabuľky z PDF a uloží ich ako tabuľku Excel (`.xlsx`). Každá rozpoznaná tabuľka sa umiestni na vlastný hárok označený číslom tabuľky a zdrojovou stranou. Rozpoznávanie tabuliek zabezpečuje PyMuPDF a generovanie Excelu knižnica SheetJS. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Kliknutím na **Previesť** spustíte extrakciu tabuliek. +3. Nástroj prehľadá každú stranu, či obsahuje tabuľky, a potom vytvorí zošit Excel. +4. Stiahne sa súbor `.xlsx` s jedným hárkom na tabuľku. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Všetky rozpoznané tabuľky sa extrahujú automaticky. + +## Výstupný formát + +- Jeden súbor `filename.xlsx`. +- **Jedna tabuľka**: jeden hárok s názvom „Table“. +- **Viac tabuliek**: hárky s názvami „Table 1 (Page 3)“, „Table 2 (Page 5)“ atď. Názvy hárkov sa skracujú na 31 znakov (limit Excelu). + +## Prípady použitia + +- Prevod finančných správ v PDF na upraviteľné tabuľky na ďalšiu analýzu. +- Extrakcia tabuliek zásob alebo objednávok z PDF od dodávateľov. +- Prenos štruktúrovaných údajov z PDF formulárov alebo katalógov do Excelu na triedenie a filtrovanie. +- Archivácia tabuľkových údajov z PDF vo formáte, s ktorým zvládnu pracovať aj netechnickí kolegovia. + +## Tipy + +- Ak nástroj hlási „Nenašli sa žiadne tabuľky“, PDF pravdepodobne používa voľne plynúci text namiesto štruktúrovaných tabuliek. Skúste radšej [PDF do Textu](./pdf-to-text) a získajte surový obsah. +- Pre jednoduchší plochý formát použite [PDF do CSV](./pdf-to-csv). Na sťahovanie jednotlivých tabuliek vo viacerých formátoch použite [Extrahovať PDF tabuľky](./extract-tables). +- Podľa názvov hárkov zistíte, z ktorej strany pochádza každá tabuľka. + +## Súvisiace nástroje + +- [PDF do CSV](./pdf-to-csv) +- [Extrahovať PDF tabuľky](./extract-tables) +- [PDF do Textu](./pdf-to-text) diff --git a/docs/sk/tools/pdf-to-greyscale.md b/docs/sk/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..d6e6082a --- /dev/null +++ b/docs/sk/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF do odtieňov sivej +description: Preveďte farebné PDF na verziu v odtieňoch sivej (čiernobielu). Vytvorí nové PDF s odstránenou farbou zo všetkých strán. +--- + +# PDF do odtieňov sivej + +Prevedie farebné PDF na verziu v odtieňoch sivej. Každá strana sa vykreslí, odfarbí a znova vloží ako obrázok JPEG do nového PDF. Výstup zachováva pôvodné rozmery strán. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Kliknutím na **Previesť** súbor spracujete. +3. Stiahne sa nový `greyscale.pdf` so všetkými stranami prevedenými na čiernobiele. + +Interne sa každá strana vykreslí v mierke 2x, pixelové dáta prejdú filtrom odtieňov sivej, potom sa znova zakódujú ako JPEG s kvalitou 90 % a vložia do nového dokumentu PDF. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Prevod do odtieňov sivej používa štandardný vzorec jasu a kvalita JPEG je pevne nastavená na 90 %. + +## Výstupný formát + +- Jeden súbor `greyscale.pdf` so všetkými stranami ako obrázkami JPEG v odtieňoch sivej. + +## Prípady použitia + +- Príprava dokumentov na čiernobielu tlač kvôli úspore nákladov na farebný atrament. +- Splnenie požiadaviek na podania na súdy alebo úrady, ktoré vyžadujú odtiene sivej. +- Zmenšenie veľkosti PDF s množstvom farieb (obrázky JPEG v odtieňoch sivej sú menšie ako farebné). +- Jednotný vizuálny štýl dokumentov s kombináciou farebných a čiernobielych strán. + +## Tipy + +- Keďže sa každá strana rastruje a znova vkladá ako JPEG, výstup je založený na obrázkoch. Text z pôvodného PDF už nebude možné označiť ani vyhľadávať. Ak potom potrebujete vyhľadávateľný text, spracujte výstup nástrojom OCR. +- Pre väčšiu kontrolu nad úpravou farieb (jas, kontrast, sýtosť) sa pozrite na nástroj Úprava farieb alebo uzol Odtiene sivej v nástroji [Tvorca pracovných postupov (Workflow) PDF](./pdf-workflow). + +## Súvisiace nástroje + +- [PDF do JPG](./pdf-to-jpg) +- [PDF do PNG](./pdf-to-png) +- [Tvorca pracovných postupov (Workflow) PDF](./pdf-workflow) diff --git a/docs/sk/tools/pdf-to-jpg.md b/docs/sk/tools/pdf-to-jpg.md new file mode 100644 index 00000000..21456634 --- /dev/null +++ b/docs/sk/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF do JPG +description: Prevádzajte strany PDF na obrázky JPG s nastaviteľnou kvalitou. Jednostranové PDF sa stiahnu priamo, viacstranové sa exportujú ako ZIP. +--- + +# PDF do JPG + +Prevedie každú stranu PDF na obrázok JPG. Jednostranové dokumenty sa stiahnu ako samostatný súbor `.jpg`. Viacstranové PDF vytvoria archív ZIP s jedným JPG na každú stranu. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. Nástroj zobrazí názov súboru, jeho veľkosť a počet strán. +2. Posuvníkom **Kvalita** nastavte kompresiu JPG. +3. Kliknutím na **Previesť** spustíte spracovanie. +4. Výsledok sa stiahne automaticky: jeden JPG pri jednostranovom PDF alebo súbor ZIP pri viacstranových dokumentoch. + +## Možnosti + +- **Kvalita**: posuvník od 0 % do 100 % (predvolene 90 %). Vyššie hodnoty vytvárajú ostrejšie obrázky s väčšími súbormi. Nižšie hodnoty komprimujú agresívnejšie. + +Strany sa interne vykresľujú v mierke 2x, takže výstupné rozlíšenie je dvojnásobkom rozmerov strany PDF. Štandardná strana veľkosti Letter vytvorí obrázok s rozmermi približne 1 224 x 1 584 pixelov. + +## Výstupný formát + +- **Jedna strana**: `filename.jpg` +- **Viac strán**: `filename_jpgs.zip` obsahujúci `page_1.jpg`, `page_2.jpg` atď. + +## Prípady použitia + +- Generovanie miniatúr náhľadov pre systém správy dokumentov. +- Zdieľanie strany zo správy v chate alebo e-maile, ktoré nepodporujú PDF. +- Tvorba obrazových podkladov z diagramov alebo ilustrácií v PDF. +- Archivácia naskenovaných dokumentov ako jednotlivých obrázkov. + +## Tipy + +- Pre bezstratový výstup použite radšej [PDF do PNG](./pdf-to-png). +- Nastavenie kvality 80-90 % predstavuje dobrú rovnováhu medzi veľkosťou súboru a vizuálnou vernosťou. +- Ak potrebujete konkrétny formát pre každú stranu, zvážte [Tvorca pracovných postupov (Workflow) PDF](./pdf-workflow), ktorý má výstupný uzol PDF do obrázkov. + +## Súvisiace nástroje + +- [PDF do PNG](./pdf-to-png) +- [PDF do WebP](./pdf-to-webp) +- [PDF do BMP](./pdf-to-bmp) +- [PDF do TIFF](./pdf-to-tiff) diff --git a/docs/sk/tools/pdf-to-json.md b/docs/sk/tools/pdf-to-json.md new file mode 100644 index 00000000..c6137086 --- /dev/null +++ b/docs/sk/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF do JSON +description: Prevádzajte súbory PDF do štruktúrovaného formátu JSON pomocou CPDF. Exportuje vnútornú štruktúru PDF ako strojovo čitateľné dáta JSON. +--- + +# PDF do JSON + +Prevedie jeden alebo viac súborov PDF do formátu JSON. Nástroj používa CPDF (Coherent PDF) na serializáciu vnútornej štruktúry každého PDF do strojovo čitateľnej reprezentácie JSON. Výstup sa vždy doručí ako archív ZIP. + +## Ako to funguje + +1. Vyberte jeden alebo viac súborov PDF pomocou výberu súborov. +2. Kliknutím na **Previesť** spustíte spracovanie. Prevod beží vo web workeri na pozadí. +3. Stiahne sa archív ZIP s jedným súborom JSON pre každé vstupné PDF. + +Stavový riadok zobrazuje priebeh fáz prevodu a vytvárania ZIP. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Každé PDF sa prevedie na úplnú reprezentáciu JSON. + +## Výstupný formát + +- Súbor `pdfs-to-json.zip` obsahujúci `filename.json` pre každé vstupné PDF. + +Výstup JSON predstavuje vnútornú objektovú štruktúru PDF vrátane stromov strán, odkazov na písma, metadát a obsahových prúdov. + +## Prípady použitia + +- Kontrola vnútornej štruktúry PDF pri ladení alebo validácii. +- Programová extrakcia štruktúrovaných metadát a vlastností strán. +- Odovzdávanie údajov o štruktúre PDF do vlastných spracovateľských reťazcov. +- Audit dokumentov PDF z hľadiska súladu analýzou ich objektových stromov. + +## Tipy + +- Tento nástroj vypisuje surovú objektovú štruktúru PDF, nie extrahovaný textový obsah. Ak potrebujete text strán vo formáte JSON, použite radšej [Pripraviť PDF pre AI](./prepare-pdf-for-ai). +- Na extrakciu čistého textu je priamočiarejší nástroj [PDF do Textu](./pdf-to-text). +- Veľké PDF so zložitou štruktúrou vytvárajú veľmi veľké súbory JSON. + +## Súvisiace nástroje + +- [PDF do Textu](./pdf-to-text) +- [Pripraviť PDF pre AI](./prepare-pdf-for-ai) +- [Extrahovať PDF tabuľky](./extract-tables) diff --git a/docs/sk/tools/pdf-to-markdown.md b/docs/sk/tools/pdf-to-markdown.md new file mode 100644 index 00000000..fe9f0d76 --- /dev/null +++ b/docs/sk/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF do Markdownu +description: Prevádzajte dokumenty PDF do formátu Markdown s voliteľnou extrakciou obrázkov. Podporuje hromadný prevod viacerých súborov. +--- + +# PDF do Markdownu + +Prevádza súbory PDF do formátu Markdown (`.md`) so zachovaním nadpisov, odsekov, zoznamov a základného formátovania. Voliteľne extrahuje a zahrnie vložené obrázky. Podporuje prevod jedného súboru aj hromadný prevod. Využíva PyMuPDF. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo presunutím súborov do nej. +2. Voliteľne zapnite **Zahrnúť obrázky**, aby sa extrahované obrázky vložili do výstupu Markdown. +3. Kliknutím na **Previesť** spustíte spracovanie. +4. Jeden súbor sa stiahne ako `filename.md`. Viac súborov vytvorí `markdown-files.zip`. + +## Možnosti + +- **Zahrnúť obrázky**: keď je začiarknuté, vložené obrázky z PDF sa extrahujú a odkazuje sa na ne vo výstupe Markdown. Keď nie je začiarknuté, prevedie sa iba textový obsah. + +## Výstupný formát + +- **Jeden súbor**: `filename.md` +- **Viac súborov**: `markdown-files.zip` s jedným `.md` pre každé vstupné PDF. + +## Prípady použitia + +- Prevod dokumentácie v PDF do Markdownu pre generátor statických stránok ako VitePress, Hugo alebo Jekyll. +- Premena odborných článkov v PDF na upraviteľný Markdown pre aplikácie na poznámky ako Obsidian. +- Migrácia starších znalostných báz v PDF do textového formátu vhodného pre Git. +- Extrakcia štruktúrovaného obsahu z e-kníh v PDF na preformátovanie. + +## Tipy + +- Možnosť Zahrnúť obrázky sa hodí, keď PDF obsahuje diagramy alebo obrázky podstatné pre obsah. Pri dokumentoch s prevahou textu ju vypnite, aby bol výstup čistý. +- Zložité rozloženia s bočnými panelmi, poznámkami pod čiarou alebo viacstĺpcovým textom môžu viesť k nedokonalému Markdownu. Výstup podľa potreby skontrolujte a upravte. +- Pre surový text bez akéhokoľvek formátovania použite radšej [PDF do Textu](./pdf-to-text). + +## Súvisiace nástroje + +- [PDF do Textu](./pdf-to-text) +- [PDF do Wordu](./pdf-to-word) +- [Pripraviť PDF pre AI](./prepare-pdf-for-ai) diff --git a/docs/sk/tools/pdf-to-pdfa.md b/docs/sk/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..738f9138 --- /dev/null +++ b/docs/sk/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF do PDF/A +description: Prevádzajte štandardné PDF do formátu PDF/A na dlhodobú archiváciu. Podporuje úrovne zhody PDF/A-1b, PDF/A-2b a PDF/A-3b. +--- + +# PDF do PDF/A + +PDF/A je normou ISO štandardizovaná podmnožina PDF určená na dlhodobé digitálne uchovávanie. Tento nástroj prevádza vaše štandardné PDF na dokumenty v súlade s PDF/A pomocou Ghostscriptu bežiaceho priamo vo vašom prehliadači. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF. +2. V rozbaľovacom zozname vyberte **Verziu PDF/A**. +3. Voliteľne zapnite **Predbežne zlúčiť PDF** pre zložité súbory, pri ktorých bežný prevod zlyhá. +4. Kliknite na **Previesť do PDF/A**. Viac súborov vytvorí archív ZIP. + +## Verzie PDF/A + +| Verzia | Obmedzenia | Najvhodnejšie na | +| ------------ | ---------------------------------------------- | -------------------------------------------------------- | +| **PDF/A-1b** | Najprísnejšia. Bez priehľadnosti, bez vrstiev. | Maximálnu kompatibilitu so staršími archívnymi systémami | +| **PDF/A-2b** | Povoľuje priehľadnosť a JPEG2000. | Všeobecnú archiváciu (odporúčané) | +| **PDF/A-3b** | Povoľuje vložené prílohy ľubovoľného formátu. | Archiváciu dokumentov so zdrojovými dátovými súbormi | + +Predvolene je vybraná PDF/A-2b, ktorá vyhovuje veľkej väčšine archivačných potrieb. + +## Možnosť predbežného zlúčenia + +Niektoré PDF obsahujú prvky, ktoré bránia čistému prevodu na PDF/A: neobvyklé kódovanie písiem, zložité vrstvenie priehľadnosti alebo poškodené vnútorné štruktúry. Zapnutím **Predbežne zlúčiť** sa PDF pred prevodom rastruje pri 300 DPI, čo zaručí súlad, no text už nebude možné označiť. Použite to ako záložné riešenie, keď štandardný prevod hlási chyby. + +Predbežné zlúčenie vyžaduje engine PyMuPDF WASM. + +## Prípady použitia + +- Splnenie úradných alebo právnych požiadaviek na archiváciu (mnohé jurisdikcie vyžadujú PDF/A pre súdne podania) +- Odovzdávanie dokumentov do inštitucionálnych repozitárov alebo digitálnych knižníc +- Uchovávanie obchodných záznamov, keď pôvodný softvér o desať rokov nemusí existovať +- Príprava faktúr pre štandardy elektronickej fakturácie, ktoré vyžadujú PDF/A-3b s prílohami XML + +## Tipy + +- Najprv skúste prevod bez predbežného zlúčenia. Zapnite ho, iba ak dostanete chybu. +- PDF/A vkladá všetky písma, takže výstupné súbory sú často väčšie ako originály. +- Ak váš postup vyžaduje prísny súlad, overte výstup v špecializovanom validátore PDF/A. + +## Súvisiace nástroje + +- [Komprimovať PDF](./compress-pdf): zmenší veľkosť súboru po prevode +- [Zlúčiť vrstvy PDF](./flatten-pdf): zlúči formuláre pred prevodom do PDF/A +- [Odstrániť metadáta](./remove-metadata): odstráni metadáta pred archiváciou diff --git a/docs/sk/tools/pdf-to-png.md b/docs/sk/tools/pdf-to-png.md new file mode 100644 index 00000000..8347dbc6 --- /dev/null +++ b/docs/sk/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF do PNG +description: Prevádzajte strany PDF na bezstratové obrázky PNG s nastaviteľnou mierkou. Ideálne pre kvalitné snímky obrazovky a priehľadné pozadia. +--- + +# PDF do PNG + +Prevedie každú stranu PDF na obrázok PNG. PNG používa bezstratovú kompresiu, takže výstup zachová každý detail pôvodnej strany. Jednostranové PDF sa stiahnu ako súbor `.png`, viacstranové PDF vytvoria ZIP. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Posuvníkom **Mierka** nastavte výstupné rozlíšenie. +3. Kliknutím na **Previesť** spustíte spracovanie. +4. Automaticky sa stiahne jeden PNG alebo archív ZIP. + +## Možnosti + +- **Mierka**: od 1.0x do 3.0x (predvolene 2.0x). Pri 2.0x sa štandardná strana veľkosti Letter vykreslí približne na 1 224 x 1 584 pixelov. Vyššie hodnoty mierky vytvárajú väčšie a ostrejšie obrázky za cenu väčších súborov a dlhšieho spracovania. + +## Výstupný formát + +- **Jedna strana**: `filename.png` +- **Viac strán**: `filename_pngs.zip` obsahujúci `page_1.png`, `page_2.png` atď. + +## Prípady použitia + +- Zachytenie verných snímok strán PDF pre prezentácie. +- Extrakcia grafov alebo diagramov, ktoré potrebujú ostré hrany bez kompresných artefaktov. +- Príprava podkladov pre webdizajn z návrhov v PDF. +- Tvorba bezstratových obrázkov strán na predspracovanie pre OCR. + +## Tipy + +- Súbory PNG sú výrazne väčšie ako JPG. Ak vám záleží viac na veľkosti súboru než na dokonalej kvalite, použite [PDF do JPG](./pdf-to-jpg) alebo [PDF do WebP](./pdf-to-webp). +- Pri mierke 1.0x zodpovedá výstup natívnemu rozlíšeniu PDF. Pre exporty v tlačovej kvalite zvýšte na 3.0x. + +## Súvisiace nástroje + +- [PDF do JPG](./pdf-to-jpg) +- [PDF do WebP](./pdf-to-webp) +- [PDF do SVG](./pdf-to-svg) diff --git a/docs/sk/tools/pdf-to-svg.md b/docs/sk/tools/pdf-to-svg.md new file mode 100644 index 00000000..54d464b6 --- /dev/null +++ b/docs/sk/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF do SVG +description: Prevádzajte strany PDF na škálovateľnú vektorovú grafiku SVG. Zachováva text a tvary ako vektorové cesty pre neobmedzené zväčšovanie. +--- + +# PDF do SVG + +Prevedie každú stranu PDF na súbor SVG (Scalable Vector Graphics). Na rozdiel od rastrových formátov SVG zachováva vektorové cesty, text a tvary, takže výstup sa dá zväčšiť na ľubovoľnú veľkosť bez pixelovania. Využíva PyMuPDF. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo presunutím súborov do nej. Môžete pridať viac súborov a spravovať ich jednotlivo. +2. Kliknutím na **Previesť** spracujete všetky nahrané súbory. +3. Prevody jedného súboru s jednou stranou sa stiahnu ako samostatný `.svg`. Všetko ostatné sa stiahne ako archív ZIP. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Každá strana sa prevedie do SVG natívnym vektorovým exportom PyMuPDF. + +## Výstupný formát + +- **Jeden súbor, jedna strana**: `filename.svg` +- **Jeden súbor, viac strán**: `filename_svg.zip` obsahujúci `page_1.svg`, `page_2.svg` atď. +- **Viac súborov**: `pdf_to_svg.zip` so súbormi usporiadanými podľa názvu zdrojového dokumentu. + +## Prípady použitia + +- Extrakcia vektorových diagramov, grafov alebo ilustrácií zo správ v PDF na použitie na webových stránkach. +- Úprava obsahu strán PDF vo vektorovom editore ako Inkscape alebo Illustrator. +- Vkladanie škálovateľných náhľadov strán do responzívnych webových aplikácií. +- Extrakcia log alebo grafiky z brožúr v PDF so zachovaním ostrých hrán. + +## Tipy + +- SVG funguje najlepšie s PDF, ktoré obsahujú vektorový obsah. Naskenované dokumenty alebo PDF s množstvom obrázkov vytvoria veľké súbory SVG s vloženými rastrovými dátami. +- Pre rastrový výstup z PDF s množstvom obrázkov použite radšej [PDF do PNG](./pdf-to-png) alebo [PDF do JPG](./pdf-to-jpg). +- Tento nástroj podporuje hromadný prevod: nahrajte viac PDF naraz a preveďte ich všetky v jednom behu. + +## Súvisiace nástroje + +- [PDF do PNG](./pdf-to-png) +- [PDF do JPG](./pdf-to-jpg) +- [PDF do Markdownu](./pdf-to-markdown) diff --git a/docs/sk/tools/pdf-to-text.md b/docs/sk/tools/pdf-to-text.md new file mode 100644 index 00000000..370d45b9 --- /dev/null +++ b/docs/sk/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF do textu +description: Extrahujte čistý text zo súborov PDF. Podporuje hromadnú extrakciu z viacerých PDF s výstupom ako súbory TXT. +--- + +# PDF do textu + +Extrahuje všetok textový obsah zo súborov PDF a uloží ho ako čisté súbory `.txt`. Podporuje hromadné spracovanie: nahrajte viac PDF a text z každého získate v jednej operácii. Využíva PyMuPDF. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo presunutím súborov do nej. Zoznam súborov spravujete tlačidlami Pridať ďalšie a Vymazať. +2. Kliknutím na **Extrahovať** spustíte spracovanie. +3. Jeden súbor sa stiahne ako `filename.txt`. Viac súborov vytvorí archív `pdf-to-text.zip`. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Všetok textový obsah sa extrahuje z každej strany v poradí čítania. + +## Výstupný formát + +- **Jeden súbor**: `filename.txt` +- **Viac súborov**: `pdf-to-text.zip` s jedným `.txt` pre každé vstupné PDF. + +## Prípady použitia + +- Extrakcia hlavného textu zo správ v PDF na indexovanie pre fulltextové vyhľadávanie. +- Prevod e-kníh alebo článkov v PDF na čistý text na čítanie v zariadeniach s e-ink displejom. +- Získanie textu zo zmlúv alebo právnych dokumentov na analýzu kľúčových slov. +- Odstránenie formátovania z PDF na získanie čistého textu pre skripty na spracovanie dát. +- Príprava textového korpusu z archívov PDF na spracovanie prirodzeného jazyka. + +## Tipy + +- Naskenované PDF (iba obrázky) vytvoria prázdne textové súbory, pretože neobsahujú textovú vrstvu na extrakciu. Naskenované dokumenty najprv spracujte pomocou OCR. +- Výstup zachováva poradie čítania tak, ako ho interpretuje PyMuPDF, teda spravidla zľava doprava a zhora nadol. Viacstĺpcové rozloženia môžu viesť k premiešanému textu. +- Pre štruktúrovaný výstup s nadpismi a formátovaním vyskúšajte [PDF do Markdownu](./pdf-to-markdown). Pre štruktúrovaný JSON pripravený pre AI použite [Pripraviť PDF pre AI](./prepare-pdf-for-ai). + +## Súvisiace nástroje + +- [PDF do Markdownu](./pdf-to-markdown) +- [Pripraviť PDF pre AI](./prepare-pdf-for-ai) +- [PDF do Wordu](./pdf-to-word) diff --git a/docs/sk/tools/pdf-to-tiff.md b/docs/sk/tools/pdf-to-tiff.md new file mode 100644 index 00000000..6f855221 --- /dev/null +++ b/docs/sk/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF do TIFF +description: Prevádzajte strany PDF na obrázky TIFF, bežne používané pri tlači, faxovaní a archivácii. Ak kódovanie zlyhá, použije sa PNG. +--- + +# PDF do TIFF + +Prevedie každú stranu PDF na obrázok TIFF. TIFF je štandardný formát pre tlačovú výrobu, faxové systémy a archiváciu dokumentov. Nástroj pri kódovaní TIFF používa kompresiu PackBits a ak sa stranu nepodarí zakódovať, použije PNG. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Kliknutím na **Previesť** súbor spracujete. +3. Automaticky sa stiahne jeden súbor TIFF alebo archív ZIP. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Strany sa vykresľujú v pevnej mierke 2x. + +## Výstupný formát + +- **Jedna strana**: `filename.tiff` +- **Viac strán**: `filename_tiffs.zip` obsahujúci `page_1.tiff`, `page_2.tiff` atď. + +Ak kódovanie TIFF pre konkrétnu stranu zlyhá (kvôli problémom s kompresiou), táto strana sa namiesto toho uloží ako súbor `.png`. ZIP potom bude obsahovať kombináciu súborov TIFF a PNG. + +## Prípady použitia + +- Odovzdávanie dokumentov úradom alebo právnym systémom, ktoré vyžadujú formát TIFF. +- Príprava strán na odoslanie faxom cez digitálne faxové služby. +- Archivácia naskenovaných dokumentov v široko podporovanom bezstratovom formáte. +- Odovzdávanie strán do podnikových systémov správy dokumentov. + +## Tipy + +- Súbory TIFF sú veľké. Ak potrebujete bezstratovú kvalitu len na web alebo obrazovku, lepšou voľbou je [PDF do PNG](./pdf-to-png). +- Ak niektoré strany potrebovali záložné PNG, skontrolujte obsah ZIP, možno ich budete chcieť previesť samostatne. + +## Súvisiace nástroje + +- [PDF do PNG](./pdf-to-png) +- [PDF do BMP](./pdf-to-bmp) +- [PDF do JPG](./pdf-to-jpg) diff --git a/docs/sk/tools/pdf-to-webp.md b/docs/sk/tools/pdf-to-webp.md new file mode 100644 index 00000000..7ac2812b --- /dev/null +++ b/docs/sk/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF do WebP +description: Prevádzajte strany PDF na obrázky WebP s nastaviteľnou kvalitou. Menšie súbory ako JPG pri porovnateľnej vizuálnej kvalite. +--- + +# PDF do WebP + +Prevedie každú stranu PDF na obrázok WebP. WebP zvyčajne vytvára súbory o 25-35 % menšie ako JPG pri rovnakej vnímanej kvalite, čo z neho robí silnú voľbu pre web. + +## Ako to funguje + +1. Nahrajte PDF kliknutím na oblasť nahrávania alebo presunutím súboru do nej. +2. Nastavte posuvník **Kvalita**. +3. Kliknutím na **Previesť** súbor spracujete. +4. Automaticky sa stiahne jeden súbor `.webp` alebo archív ZIP. + +## Možnosti + +- **Kvalita**: posuvník od 0 % do 100 % (predvolene 85 %). Riadi úroveň stratovej kompresie. Vyššie hodnoty zachovajú viac detailov. + +Strany sa interne vykresľujú v mierke 2x, takže obrázky majú približne dvojnásobok pôvodných rozmerov PDF. + +## Výstupný formát + +- **Jedna strana**: `filename.webp` +- **Viac strán**: `filename_webps.zip` obsahujúci `page_1.webp`, `page_2.webp` atď. + +## Prípady použitia + +- Príprava náhľadov strán pre webové stránky, kde záleží na prenosovej kapacite. +- Generovanie odľahčených obrazových verzií letákov alebo brožúr pre sociálne siete. +- Hromadný prevod viacstranových dokumentov na sadu obrázkov optimalizovaných pre web. + +## Tipy + +- WebP podporujú všetky moderné prehliadače. Kvôli kompatibilite so staršími systémami použite [PDF do JPG](./pdf-to-jpg). +- Kvalita 80-85 % je na obrazovke zvyčajne na nerozoznanie od originálu a súbory zostávajú malé. + +## Súvisiace nástroje + +- [PDF do JPG](./pdf-to-jpg) +- [PDF do PNG](./pdf-to-png) +- [PDF do BMP](./pdf-to-bmp) diff --git a/docs/sk/tools/pdf-to-word.md b/docs/sk/tools/pdf-to-word.md new file mode 100644 index 00000000..34a468bc --- /dev/null +++ b/docs/sk/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF do Wordu +description: Prevádzajte súbory PDF na upraviteľné dokumenty Word (DOCX). Podporuje hromadný prevod viacerých PDF naraz. +--- + +# PDF do Wordu + +Prevádza súbory PDF na upraviteľné dokumenty Word (`.docx`). Nástroj pomocou PyMuPDF rekonštruuje obsah dokumentu so zachovaním textu, základného formátovania a rozloženia. Podporuje prevod jedného súboru aj hromadný prevod. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo presunutím súborov do nej. Môžete pridať ďalšie súbory alebo zo zoznamu odstrániť jednotlivé. +2. Kliknutím na **Previesť** spustíte spracovanie. +3. Jeden súbor sa stiahne ako `filename.docx`. Viac súborov sa zabalí do `converted-documents.zip`. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Každé PDF sa prevedie do DOCX vstavaným prevodným enginom PyMuPDF. + +## Výstupný formát + +- **Jeden súbor**: `filename.docx` +- **Viac súborov**: `converted-documents.zip` s jedným `.docx` pre každé vstupné PDF. + +## Prípady použitia + +- Úprava textu v prijatom PDF, ktoré potrebujete zmeniť. +- Prevod archivovaných správ v PDF do formátu, ktorý môžu kolegovia upravovať v Microsoft Word alebo Google Docs. +- Prenos obsahu zo zmlúv alebo návrhov v PDF do Wordu na sledovanie zmien. +- Migrácia staršej dokumentácie v PDF do upraviteľného formátu. + +## Tipy + +- Zložité rozloženia s viacstĺpcovým textom, vloženými formulármi alebo množstvom grafiky sa nemusia previesť dokonale. Skontrolujte výstup a upravte formátovanie v textovom editore. +- Naskenované PDF (iba obrázky) vytvoria prázdne alebo takmer prázdne súbory DOCX. Najprv ich spracujte pomocou OCR, aby získali textovú vrstvu. +- Hromadný režim je efektívny na prevod celých priečinkov PDF: nahrajte ich všetky naraz. + +## Súvisiace nástroje + +- [PDF do Textu](./pdf-to-text) +- [PDF do Markdownu](./pdf-to-markdown) +- [Tvorca pracovných postupov (Workflow) PDF](./pdf-workflow) diff --git a/docs/sk/tools/pdf-to-zip.md b/docs/sk/tools/pdf-to-zip.md new file mode 100644 index 00000000..be61997b --- /dev/null +++ b/docs/sk/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF do ZIP +description: Zabaľte viac súborov PDF do jedného archívu ZIP na jednoduché zdieľanie a ukladanie. +--- + +# PDF do ZIP + +Zabaľte viac súborov PDF do jedného archívu ZIP. Ide o jednoduchý baliaci nástroj: samotné PDF sa neprevádzajú, nekomprimujú ani neupravujú. + +## Ako to funguje + +1. Nahrajte viac súborov PDF cez oblasť nahrávania. +2. Skontrolujte zoznam súborov. Odstráňte tie, ktoré nechcete zahrnúť. +3. Kliknite na tlačidlo spracovania. +4. Okamžite sa stiahne archív ZIP so všetkými nahranými PDF. + +## Funkcie + +- Prijíma ľubovoľný počet súborov PDF +- Odstránenie jednotlivých súborov pred vytvorením archívu +- Zachováva pôvodné názvy súborov v ZIP +- Žiadna úprava obsahu PDF, súbory sa zabalia tak, ako sú +- Zobrazuje názov a veľkosť každého nahraného PDF + +## Prípady použitia + +- Zabalenie sady faktúr alebo účteniek ako prílohy e-mailu +- Zabalenie výstupov projektu (viacerých správ v PDF) na odovzdanie +- Vytvorenie jedného stiahnutia pre kolekciu formulárov alebo šablón +- Archivácia dávky dokumentov do jedného komprimovaného súboru + +## Tipy + +- Súbor ZIP používa pôvodné názvy súborov PDF. Ak máte súbory s rovnakým názvom, pred nahraním ich premenujte, aby nedošlo ku konfliktom. +- Tento nástroj samotné PDF nekomprimuje. Na zmenšenie veľkosti ich najprv spracujte nástrojom Komprimovať PDF a potom zabaľte týmto nástrojom. + +## Súvisiace nástroje + +- [Spojiť PDF](./merge-pdf) +- [Rozdeliť PDF](./split-pdf) +- [Komprimovať PDF](./compress-pdf) diff --git a/docs/sk/tools/pdf-workflow.md b/docs/sk/tools/pdf-workflow.md new file mode 100644 index 00000000..dba7f360 --- /dev/null +++ b/docs/sk/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Tvorca pracovných postupov (Workflow) PDF +description: Vizuálne vytvárajte vlastné reťazce spracovania PDF prepájaním uzlov na plátne. Reťazte operácie ako spojenie, kompresia, vodoznak a export. +--- + +# Tvorca pracovných postupov (Workflow) PDF + +Tvorca pracovných postupov umožňuje spojiť viacero operácií s PDF do jedného automatizovaného reťazca. Namiesto spúšťania nástrojov jeden po druhom poprepájate vizuálny graf uzlov (vstup, spracovanie, výstup) a všetko spustíte jedným kliknutím. Vaše súbory nikdy neopustia prehliadač. + +## Ako to funguje + +Rozhranie je rozdelené na tri panely: **panel uzlov** vľavo, **plátno** v strede a **panel nastavení** vpravo, ktorý sa zobrazí po výbere uzla. + +1. **Pridávajte uzly** kliknutím v ľavom bočnom paneli alebo ich presuňte priamo na plátno. Vyhľadávacím poľom v hornej časti panela uzlov ich filtrujete podľa názvu. +2. **Prepájajte uzly** ťahaním z výstupnej zásuvky (spodok uzla) do vstupnej zásuvky (vrch iného uzla). Prepojenia vedú zhora nadol. +3. **Nastavte možnosti** kliknutím na uzol, čím sa vpravo otvorí jeho panel nastavení. Každý typ uzla má vlastné možnosti (rozsahy strán, posuvníky kvality, heslá atď.). +4. **Spustite pracovný postup** kliknutím na tlačidlo **Spustiť** na paneli nástrojov. Engine vykonáva uzly v topologickom poradí a spracúva ich postupne. Stavový riadok dole sleduje priebeh. +5. **Stiahnite výsledky**: koncový uzol Stiahnuť uloží výsledné PDF (alebo ZIP, ak vznikne viac súborov). + +## Kategórie uzlov + +Uzly sú rozdelené do šiestich kategórií, každá má na plátne vlastnú farbu: + +- **Vstup** (modrá): PDF Vstup, Vstup obrázkov, Word/Excel/PowerPoint do PDF a viac ako 15 ďalších prevodníkov formátov, ktoré privádzajú súbory do reťazca. +- **Úpravy a anotácie** (indigová): Orezať, Odtiene sivej, Invertovať farby, Vodoznak, Čísla strán, Hlavička a pätička, Efekt skenera, Úprava farieb, Farba pozadia, Odstrániť prázdne strany, Odstrániť anotácie. +- **Usporiadanie a správa** (fialová): Spojiť, Rozdeliť, Extrahovať strany, Otočiť, Odstrániť strany, Obrátiť, Pridať prázdnu stranu, Rozdeliť strany, N-Up, Zjednotiť veľkosť strán, Spojiť do jednej strany, Brožúra, Plagát, Upraviť metadáta, Obsah, OCR. +- **Optimalizácia a oprava** (jantárová): Komprimovať, Rastrovať, Linearizovať, Zarovnať naklonenie, PDF do PDF/A, Písma do kriviek, Opraviť. +- **Zabezpečenie PDF** (ružová): Zašifrovať, Dešifrovať, Vyčistiť, Zlúčiť vrstvy, Digitálny podpis, Začierniť. +- **Výstup** (tyrkysová): Stiahnuť (automaticky rozpozná jedno PDF alebo ZIP), PDF do obrázkov, PDF do textu, PDF do DOCX, PDF do XLSX, PDF do CSV, PDF do SVG, PDF do Markdownu, Extrahovať obrázky. + +## Ukladanie a načítanie pracovných postupov + +Panel nástrojov ponúka štyri možnosti uchovania: + +- **Uložiť**: uloží aktuálny pracovný postup ako pomenovanú šablónu v lokálnom úložisku prehliadača. Môžete uložiť viac šablón. +- **Načítať**: otvorí okno so zoznamom všetkých uložených šablón. Kliknutím na Načítať jednu obnovíte, prípadne odstráňte šablóny, ktoré už nepotrebujete. +- **Exportovať**: stiahne pracovný postup ako súbor `.json`, aby ste ho mohli zdieľať alebo zálohovať. +- **Importovať**: načíta súbor pracovného postupu `.json` z disku a obnoví všetky uzly, pozície a prepojenia. + +Šablóny pretrvávajú medzi reláciami v lokálnom úložisku. Exportované súbory JSON sú prenosné medzi prehliadačmi a počítačmi. + +## Model vykonávania + +Engine zostaví z vašich prepojení graf závislostí a vykonáva uzly v topologickom poradí. Ak niektorý uzol zlyhá, vykonávanie sa zastaví a chybný uzol sa označí načerveno. Niekoľko pravidiel, na ktoré treba pamätať: + +- Každý pracovný postup potrebuje aspoň jeden uzol **Vstup** a jeden uzol **Výstup**. +- Engine rozpozná cyklické závislosti a zablokuje vykonávanie s chybou. +- Uzol **Zašifrovať** musí byť posledným krokom spracovania pred výstupným uzlom. Ak ho umiestnite skôr, zobrazí sa varovanie validácie, pretože nasledujúce uzly nemôžu pracovať so zašifrovanými dátami. +- PDF chránené heslom si počas vykonávania vyžiadajú heslo. +- Podporujú sa vstupy s viacerými PDF: uzol Spojiť ich môže zlúčiť, alebo uzly hromadného spracovania spracujú každé PDF samostatne. + +## Typy zásuviek + +Prepojenia používajú typované zásuvky, ktoré zabraňujú neplatnému zapojeniu: + +- **PDF** (indigová): jeden dokument PDF. +- **MultiPDF** (jantárová): viac dokumentov PDF spolu. +- **Image** (zelená): obrázkový blob. + +## Možnosti + +Každý uzol má vlastné nastavenia dostupné cez pravý panel nastavení. Bežné príklady: + +- **Rozsahy strán** v uzloch Rozdeliť, Extrahovať strany, Odstrániť strany +- **Posuvníky kvality** vo výstupných uzloch prevodu na obrázky +- **Polia hesla** v uzloch Zašifrovať a Dešifrovať +- **Textové vstupy** pre Vodoznak, Hlavička a pätička, Upraviť metadáta +- **Uhly otočenia** v uzle Otočiť +- **Úroveň kompresie** v uzle Komprimovať +- **Výber jazyka OCR** v uzle OCR + +## Prípady použitia + +- **Spracovanie faktúr**: PDF Vstup -> OCR -> Extrahovať tabuľky -> Stiahnuť ako CSV. +- **Štandardizácia správ**: Word do PDF -> Zjednotiť veľkosť strán -> Pridať čísla strán -> Vodoznak -> Komprimovať -> Stiahnuť. +- **Príprava na archiváciu**: PDF Vstup -> Opraviť -> Zlúčiť vrstvy -> Vyčistiť -> PDF do PDF/A -> Stiahnuť. +- **Hromadná extrakcia obrázkov**: PDF Vstup (viac súborov) -> Extrahovať obrázky -> Stiahnuť ZIP. +- **Brožúry pripravené na tlač**: PDF Vstup -> Brožúra -> Orezať -> Komprimovať -> Stiahnuť. +- **Bezpečná distribúcia**: PDF Vstup -> Začierniť -> Odstrániť anotácie -> Zašifrovať -> Stiahnuť. + +## Tipy + +- Klávesom **Delete** alebo **Backspace** odstránite vybraný uzol z plátna. +- Kliknutím na tlačidlo **X** na stavovom riadku uzla ho priamo odstránite. +- Plátno posúvate kliknutím a ťahaním na prázdnom mieste. Kurzor sa počas posúvania zmení na ikonu ruky. +- Na mobile prepínate panel uzlov tlačidlom **+** na paneli nástrojov. +- Ak pracovný postup vytvorí viac výstupných súborov, uzol Stiahnuť ich automaticky zabalí do ZIP. +- Začnite jednoducho: pred pridaním zložitosti vytvorte a otestujte reťazec s dvoma uzlami. + +## Súvisiace nástroje + +- [PDF do Textu](./pdf-to-text) +- [PDF do Excelu](./pdf-to-excel) +- [Extrahovať obrázky](./extract-images) +- [PDF do Markdownu](./pdf-to-markdown) diff --git a/docs/sk/tools/png-to-pdf.md b/docs/sk/tools/png-to-pdf.md new file mode 100644 index 00000000..d49d6d7a --- /dev/null +++ b/docs/sk/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG do PDF +description: Preveďte jeden alebo viac obrázkov PNG na dokument PDF s nastaviteľnou kvalitou, úplne vo vašom prehliadači. +--- + +# PNG do PDF + +Prevádzajte obrázky PNG do PDF so zachovaním ich plného rozlíšenia. Každý PNG sa stane samostatnou stranou s veľkosťou podľa rozmerov pôvodného obrázka. Priehľadnosť sa spracuje automaticky. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :------ | +| PNG | `.png` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo presuňte súbory PNG. Môžete ich vybrať viac naraz. +2. Spravujte zoznam súborov: odstráňte nechcené súbory alebo pridajte ďalšie. +3. V rozbaľovacom zozname zvoľte úroveň **Kvalita PDF**. +4. Kliknite na **Previesť do PDF**. Výstup sa stiahne ako `from_jpgs.pdf`. + +Nástroj vkladá každý obrázok priamo pomocou pdf-lib. Ak PNG nemožno vložiť natívne (napr. kvôli neobvyklému farebnému profilu), znova sa vykreslí cez canvas ako JPEG. + +## Možnosti + +**Kvalita PDF** určuje kompresiu použitú pred vložením: + +- **Vysoká kvalita**: minimálna kompresia, najväčší súbor. +- **Stredná kvalita** (predvolené): dobrá rovnováha medzi veľkosťou a ostrosťou. +- **Nízka kvalita**: maximálna kompresia, najmenší výstup. + +## Prípady použitia + +- Prevod snímok obrazovky do viacstranového PDF pre hlásenia chýb alebo dokumentáciu +- Zabalenie exportov návrhov UI do jedného súboru na kontrolu +- Premena exportov diagramov (draw.io, Excalidraw) na PDF na zdieľanie +- Zostavenie sady obrázkov grafov do správy + +## Tipy + +- Súbory PNG s priehľadnosťou dostanú v PDF biele pozadie. Ak potrebujete iné pozadie, upravte obrázky vopred. +- Pri snímkach obrazovky a diagramoch s ostrými hranami a textom sa vysokou kvalitou vyhnete kompresným artefaktom JPEG. Stredná alebo nízka kvalita môže interne previesť obrázok na JPEG. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [JPG do PDF](./jpg-to-pdf) +- [SVG do PDF](./svg-to-pdf) diff --git a/docs/sk/tools/posterize-pdf.md b/docs/sk/tools/posterize-pdf.md new file mode 100644 index 00000000..e4a28ce4 --- /dev/null +++ b/docs/sk/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Vytvoriť plagát z PDF +description: Rozdeľte strany PDF na mriežku menších strán na veľkoformátovú tlač na viacero hárkov. +--- + +# Vytvoriť plagát z PDF + +Rozdeľte každú stranu PDF na mriežku menších podstrán. Tento nástroj slúži na tlač jednej strany na viacero hárkov papiera, ktoré potom poskladáte do veľkého plagátu alebo banneru. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Nastavte počet **riadkov** a **stĺpcov**, ktoré určujú mriežku (napr. 2 riadky x 2 stĺpce rozdelia každú stranu na 4 podstrany). +3. Voliteľne zadajte rozsah strán, aby ste obmedzili, ktoré strany sa posterizujú. +4. Plátno náhľadu zobrazuje na aktuálnej strane prekrytie mriežky, takže vidíte, kde budú rezy. +5. Prechádzajte medzi stranami a skontrolujte prekrytie na rôznych stranách. +6. Kliknite na tlačidlo spracovania. Každá bunka mriežky sa vo výslednom PDF stane samostatnou stranou. + +## Funkcie + +- Nastaviteľný počet riadkov a stĺpcov pre flexibilnú veľkosť mriežky +- Živý náhľad s prekrytím mriežky, ktorý presne ukazuje, kde sa strany rozdelia +- Filter rozsahu strán na posterizáciu len vybraných strán +- Navigácia po stranách v náhľade +- Uložené snímky strán v medzipamäti pre rýchlu navigáciu v náhľade +- Prerušované červené čiary mriežky jasne označujú hranice rezov + +## Možnosti + +| Možnosť | Popis | +| ---------------- | --------------------------------------------------- | +| **Riadky** | Počet vodorovných delení (predvolene: 1) | +| **Stĺpce** | Počet zvislých delení (predvolene: 1) | +| **Rozsah strán** | Ktoré strany posterizovať (prázdne = všetky strany) | + +## Prípady použitia + +- Tlač PDF vo veľkosti plagátu na bežné hárky A4 alebo Letter a ich poskladanie na stene +- Vytváranie veľkých bannerov z jednostranového návrhu v PDF +- Rozdelenie nadrozmerných technických výkresov na tlačiteľné dlaždice +- Veľkoformátová tlač bez prístupu k veľkoformátovej tlačiarni + +## Tipy + +- Mriežka 2x2 zmení jednu stranu na 4 strany. Mriežka 3x3 zmení jednu stranu na 9. Mriežku naplánujte podľa toho, aký veľký má byť výsledný poskladaný výstup. +- Prekrytie v náhľade vám pomôže overiť, že dôležitý obsah nepadne na čiaru rezu. V prípade potreby upravte riadky/stĺpce. +- Na opačnú operáciu (umiestnenie viacerých strán na jeden hárok) použite [N-Up PDF](./n-up-pdf). + +## Súvisiace nástroje + +- [N-Up PDF](./n-up-pdf) +- [Rozdeliť strany](./divide-pages) +- [Rozdeliť PDF](./split-pdf) diff --git a/docs/sk/tools/powerpoint-to-pdf.md b/docs/sk/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..3e33d39f --- /dev/null +++ b/docs/sk/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint do PDF +description: Preveďte prezentácie PowerPoint (PPT, PPTX) a súbory ODP do PDF so zachovaním formátovania snímok. +--- + +# PowerPoint do PDF + +Preveďte súbory prezentácií do PDF. Každá snímka sa stane stranou výsledného dokumentu, pričom text, obrázky, tvary a prechody vykreslí engine LibreOffice bežiaci v prehliadači. Podporované sú moderné aj staršie formáty PowerPoint, ako aj formát OpenDocument Presentation. + +## Podporované formáty + +| Formát | Prípony | +| :------------------------ | :------ | +| PowerPoint (moderný) | `.pptx` | +| PowerPoint (starší) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory prezentácií. +2. Skontrolujte zoznam súborov. Podľa potreby pridajte ďalšie alebo súbory odstráňte. +3. Kliknite na **Previesť do PDF**. Engine LibreOffice sa načíta pri prvom použití a potom prevedie každý súbor. +4. Jeden súbor sa stiahne priamo ako PDF. Viacero súborov sa zabalí do `powerpoint-converted.zip`. + +## Možnosti + +Tento nástroj nemá žiadne ďalšie nastavenia. Snímky sa vykreslia v ich pôvodných rozmeroch. + +## Výstup + +| Počet vstupov | Výstup | +| :------------ | :------------------------------------------------------------------- | +| 1 súbor | Stiahnutie jedného PDF (pôvodný názov súboru s príponou `.pdf`) | +| 2+ súbory | Archív ZIP (`powerpoint-converted.zip`) s jedným PDF pre každý súbor | + +## Prípady použitia + +- Prevod prezentácie do PDF pred zdieľaním s publikom, ktoré nemusí mať PowerPoint +- Vytvorenie tlačiteľných podkladov zo sady snímok na konferenciu alebo workshop +- Archivácia prezentácií vo formáte, ktorý sa na každom zariadení zobrazí rovnako +- Hromadný prevod knižnice prezentácií ODP z LibreOffice Impress do PDF +- Vytvorenie PDF verzie pitch decku na prílohy e-mailov + +## Tipy + +- Animácie a prechody snímok sa v PDF nezobrazia. Každá snímka sa zachytí ako statická strana. +- Vložené videá sa vo výstupe nezobrazia. V prípade potreby ich nahraďte snímkou obrazovky alebo zástupným obrázkom. +- Poznámky prednášajúceho nie sú v predvolenom exporte PDF zahrnuté. Ak poznámky potrebujete, zvážte najprv export z natívneho zobrazenia „Tlač poznámok“ v PowerPointe. +- Engine LibreOffice sa po prvom načítaní uloží do medzipamäte, takže prevod druhej prezentácie v rovnakej relácii je oveľa rýchlejší. + +## Súvisiace nástroje + +- [Word do PDF](./word-to-pdf) +- [Excel do PDF](./excel-to-pdf) +- [Obrázky do PDF](./image-to-pdf) diff --git a/docs/sk/tools/prepare-pdf-for-ai.md b/docs/sk/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..059fa495 --- /dev/null +++ b/docs/sk/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Pripraviť PDF pre AI +description: Extrahujte obsah PDF do štruktúrovaného JSON optimalizovaného pre LLM a AI pipeline, ako je LlamaIndex. Podporuje dávkové spracovanie. +--- + +# Pripraviť PDF pre AI + +Extrahuje obsah zo súborov PDF a štruktúruje ho ako JSON optimalizovaný na spracovanie veľkými jazykovými modelmi (LLM) a AI frameworkmi, ako je LlamaIndex. Obsah každej strany sa extrahuje a usporiada do štruktúrovaného formátu pripraveného pre RAG pipeline, chatboty alebo systémy sémantického vyhľadávania. + +## Ako to funguje + +1. Nahrajte jedno alebo viac PDF kliknutím na oblasť nahrávania alebo pretiahnutím súborov. +2. Kliknutím na **Extrahovať** spustíte spracovanie. +3. Jeden súbor sa stiahne ako `filename_llm.json`. Z viacerých súborov vznikne archív `pdf-for-ai.zip`. + +Nástroj používa integráciu PyMuPDF s LlamaIndex na extrakciu obsahu na úrovni strán spolu s metadátami, takže výstup sa dá priamo načítať do AI frameworkov. + +## Možnosti + +Tento nástroj nemá žiadne nastaviteľné možnosti. Všetky strany sa extrahujú s úplným textom a metadátami. + +## Formát výstupu + +- **Jeden súbor**: `filename_llm.json` +- **Viacero súborov**: `pdf-for-ai.zip` s jedným `_llm.json` pre každé vstupné PDF. + +Výstup JSON sa riadi schémou dokumentu LlamaIndex s textovým obsahom a poľami metadát pre každú stranu. + +## Prípady použitia + +- Príprava dokumentov PDF pre pipeline generovania rozšíreného o vyhľadávanie (RAG). +- Budovanie prehľadávateľnej znalostnej bázy z archívov PDF pre AI chatbota. +- Vkladanie PDF správ do analytických workflow založených na LLM. +- Predspracovanie výskumných prác pre systémy sémantického vyhľadávania a odpovedania na otázky. +- Vytváranie štruktúrovaných trénovacích dát zo zbierok dokumentov PDF. + +## Tipy + +- Na extrakciu čistého textu bez formátovania špecifického pre AI použite [PDF do Textu](./pdf-to-text). +- Na výstup v Markdowne, ktorý zachová nadpisy a štruktúru, použite [PDF do Markdownu](./pdf-to-markdown). +- Naskenované PDF vytvoria prázdny alebo minimálny výstup. Pred extrakciou ich najprv spracujte pomocou OCR, aby ste pridali textovú vrstvu. + +## Súvisiace nástroje + +- [PDF do Textu](./pdf-to-text) +- [PDF do Markdownu](./pdf-to-markdown) +- [PDF do JSON](./pdf-to-json) diff --git a/docs/sk/tools/protect-pdf.md b/docs/sk/tools/protect-pdf.md new file mode 100644 index 00000000..88346ada --- /dev/null +++ b/docs/sk/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Chrániť PDF heslom +description: Chráňte súbory PDF heslom pomocou 256-bitového šifrovania AES. Nastavte heslo používateľa a vlastníka s nastaviteľnými obmedzeniami používania. +--- + +# Chrániť PDF heslom + +Zamknite svoje PDF heslom, aby ho mohli otvoriť len oprávnení ľudia. BentoPDF používa 256-bitové šifrovanie AES (rovnaký štandard, aký používajú banky a štátne inštitúcie), ktoré sa celé aplikuje vo vašom prehliadači pomocou QPDF. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Zadajte **Heslo používateľa** (povinné). Toto heslo budú ľudia potrebovať na otvorenie súboru. +3. Voliteľne zadajte **Heslo vlastníka**. Ak je nastavené, PDF získa obmedzenia používania, ktoré zabránia tlači, úpravám, kopírovaniu a pridávaniu anotácií. +4. Kliknite na **Zašifrovať PDF**. +5. Stiahnite zašifrovaný súbor. + +## Typy hesiel + +### Heslo používateľa (povinné) + +Heslo používateľa zadávajú príjemcovia na otvorenie PDF. Bez neho je dokument úplne neprístupný. Každé zašifrované PDF ho musí mať. + +### Heslo vlastníka (voliteľné) + +Heslo vlastníka určuje, čo môže oprávnený používateľ robiť po otvorení súboru. Keď nastavíte odlišné heslo vlastníka, BentoPDF automaticky použije najprísnejšiu sadu obmedzení: + +- Úpravy zakázané +- Extrakcia/kopírovanie zakázané +- Tlač zakázaná +- Anotácie zakázané +- Vypĺňanie formulárov zakázané +- Zostavovanie dokumentu zakázané + +Ak heslo vlastníka necháte prázdne, PDF sa zašifruje (na otvorenie stále vyžaduje heslo používateľa), ale po otvorení nemá žiadne obmedzenia používania. + +## Podrobnosti o šifrovaní + +- **Algoritmus**: AES-256 (256-bitový Advanced Encryption Standard) +- **Dĺžka kľúča**: 256 bitov +- **Štandard**: šifrovanie PDF 2.0 (implementácia QPDF) + +AES-256 sa so súčasnou technológiou nedá prakticky prelomiť hrubou silou. Bezpečnosť vášho zašifrovaného PDF závisí úplne od sily vášho hesla. + +## Prípady použitia + +- Ochrana dôverných finančných správ pred ich odoslaním e-mailom +- Zabezpečenie právnych dokumentov zdieľaných s protistranou +- Pridanie hesla k zdravotným záznamom alebo osobným údajom +- Distribúcia plateného obsahu (e-knihy, správy) s riadením prístupu +- Dodržiavanie zásad ochrany údajov, ktoré vyžadujú šifrovanie uložených dát + +## Tipy + +- Používajte silné, jedinečné heslo. Ideálna je prístupová fráza s 12 a viac znakmi, malými aj veľkými písmenami, číslami a symbolmi. +- Heslo zdieľajte iným kanálom (telefón, SMS), nikdy nie v rovnakom e-maile ako PDF. +- Ak potrebujete len obmedziť akcie (bez tlače, bez kopírovania) bez vyžadovania hesla na otvorenie, použite namiesto toho nástroj Zmeniť oprávnenia. + +## Súvisiace nástroje + +- [Dešifrovať PDF](./unlock-pdf): odstránenie šifrovania, keď poznáte heslo +- [Zmeniť oprávnenia](./change-permissions): úprava konkrétnych obmedzení používania +- [Odstrániť obmedzenia](./remove-restrictions): odstránenie všetkého zabezpečenia z PDF +- [Vyčistiť PDF](./sanitize-pdf): odstránenie skrytého obsahu pred šifrovaním diff --git a/docs/sk/tools/psd-to-pdf.md b/docs/sk/tools/psd-to-pdf.md new file mode 100644 index 00000000..6697b56f --- /dev/null +++ b/docs/sk/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD do PDF +description: Preveďte súbory Photoshop (PSD) do PDF vo svojom prehliadači. Zadarmo, súkromne, bez softvéru Adobe. +--- + +# PSD do PDF + +Preveďte súbory Adobe Photoshop PSD na dokumenty PDF. PSD je natívny formát Photoshopu a jeho otvorenie bežne vyžaduje drahý softvér Adobe. Tento nástroj vykreslí zlúčený kompozit vášho súboru PSD ako stranu PDF v plnom rozlíšení. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :-------------- | :------ | :---------------------------------- | +| Adobe Photoshop | `.psd` | Vykreslí zlúčený kompozitný obrázok | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory PSD. Podporuje sa viacero súborov. +2. Skontrolujte zoznam súborov. Nechcené súbory odstráňte ikonou koša alebo pomocou **Pridať ďalšie súbory** pridajte ďalšie. +3. Kliknite na **Previesť do PDF**. Engine PyMuPDF načíta súbor PSD a vloží kompozitný obrázok do strany PDF v pôvodnom rozlíšení. +4. Z jedného PSD vznikne jedno PDF. Keď nahráte viacero súborov PSD, spoja sa do jedného viacstranového PDF s názvom `psd_to_pdf.pdf`, kde každé PSD tvorí jednu stranu. + +## Možnosti + +Nie sú potrebné žiadne nastavenia. Prevodník používa zlúčené obrazové dáta zo súboru PSD. + +## Prípady použitia + +- Náhľad návrhov z Photoshopu bez otvorenia Photoshopu +- Posielanie korektúr návrhov klientom, ktorí nemajú Adobe Creative Suite +- Tlač grafiky vo vysokom rozlíšení zo súborov PSD +- Vytvorenie PDF portfólia z viacerých návrhov PSD, kde každý tvorí stranu jedného dokumentu + +## Tipy + +- Prevod vykreslí kompozitné (zlúčené) zobrazenie PSD. Jednotlivé vrstvy, vrstvy úprav a efekty vrstiev sa v PDF nezachovajú ako samostatné prvky. +- Viacero súborov PSD sa namiesto jednotlivých PDF spojí do jedného viacstranového PDF. Je to užitočné pri tvorbe portfólií alebo lookbookov. +- Súbory PSD s veľmi vysokým rozlíšením (tlačové súbory s 300+ DPI) vytvoria veľké PDF. Nástroj zachováva plné rozlíšenie. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [PNG do PDF](./png-to-pdf) +- [VSD do PDF](./vsd-to-pdf) diff --git a/docs/sk/tools/pub-to-pdf.md b/docs/sk/tools/pub-to-pdf.md new file mode 100644 index 00000000..6e454458 --- /dev/null +++ b/docs/sk/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB do PDF +description: Preveďte súbory Microsoft Publisher (PUB) do PDF vo svojom prehliadači. Zadarmo, súkromne, bez potreby softvéru. +--- + +# PUB do PDF + +Preveďte súbory Microsoft Publisher do PDF. Publisher je nástroj na prípravu publikácií dodávaný s niektorými edíciami Microsoft Office, no väčšina ľudí ho nemá nainštalovaný. Tento nástroj umožňuje komukoľvek previesť súbory PUB do PDF priamo v prehliadači bez softvéru Microsoft. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :------------------ | :------ | :------------------------------- | +| Microsoft Publisher | `.pub` | Dokumenty na prípravu publikácií | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory PUB. Naraz môžete nahrať viacero súborov. +2. Skontrolujte zoznam súborov. Nechcené súbory odstráňte ikonou koša alebo kliknite na **Pridať ďalšie súbory** a pridajte ďalšie. +3. Kliknite na **Previesť do PDF**. V prehliadači sa načíta engine založený na LibreOffice a prevedie každý súbor PUB so zachovaním rozloženia, obrázkov a textových polí. +4. Jeden súbor sa stiahne priamo ako PDF. Viacero súborov dostanete v archíve ZIP s názvom `pub-to-pdf.zip`. + +## Možnosti + +Nie je potrebná žiadna ďalšia konfigurácia. Prevodník spracuje rozloženie PUB automaticky. + +## Prípady použitia + +- Otvorenie letáku alebo bulletinu PUB od klienta bez kúpy Microsoft Publisher +- Prevod farských oznamov, programov podujatí alebo školských novín vytvorených v Publisheri +- Archivácia marketingových materiálov z Publishera v univerzálne dostupnom formáte +- Tlač súborov PUB v systéme, ktorý nemá nainštalovaný Publisher + +## Tipy + +- Zložité rozloženia Publishera s vrstvenými textovými poľami a presným umiestnením sa môžu pri prevode mierne posunúť. Ak je presné umiestnenie dôležité, skontrolujte výstup. +- Engine LibreOffice sa inicializuje raz za reláciu. Prvý prevod trvá dlhšie, ďalšie sú rýchlejšie. +- Pre čo najvernejší prevod súborov Publisher sa uistite, že všetky vlastné písma použité v origináli sú štandardné systémové písma. + +## Súvisiace nástroje + +- [VSD do PDF](./vsd-to-pdf) +- [ODP do PDF](./odp-to-pdf) diff --git a/docs/sk/tools/rasterize-pdf.md b/docs/sk/tools/rasterize-pdf.md new file mode 100644 index 00000000..0ab72b72 --- /dev/null +++ b/docs/sk/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rastrovať PDF +description: Preveďte strany PDF na PDF založené na obrázkoch. Zlúčte všetky vrstvy, odstráňte vyberateľný text a ovládajte DPI a formát obrázkov. +--- + +# Rastrovať PDF + +Rastrovanie prevedie každú stranu PDF na obrázok a tieto obrázky znovu zostaví do PDF. Výsledok vyzerá rovnako ako originál, ale neobsahuje žiadny vyberateľný text, interaktívne prvky ani upraviteľné vrstvy. Ide v podstate o kvalitnú fotokópiu. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF. +2. Nastavte **DPI** (rozlíšenie) rastrovaného výstupu. +3. Vyberte **Formát obrázka**: PNG pre bezstratovú kvalitu alebo JPEG pre menšie súbory. +4. Voliteľne zaškrtnite **Previesť na odtiene sivej**. +5. Kliknite na **Rastrovať PDF**. Viacero súborov sa stiahne ako ZIP. + +## Možnosti + +| Nastavenie | Hodnoty | Predvolené | +| ------------------ | ------------------------------- | ---------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Formát obrázka** | PNG (bezstratový), JPEG (menší) | PNG | +| **Odtiene sivej** | Zap./Vyp. | Vyp. | + +## Odporúčania pre DPI + +- **72**: len na zobrazenie na obrazovke, najmenšia veľkosť súboru +- **150**: dobrá rovnováha na bežné použitie +- **200**: ostrejší text, stredná veľkosť súboru +- **300**: výstup v tlačovej kvalite +- **600**: vysoká kvalita na archiváciu alebo profesionálnu tlač + +## Prípady použitia + +- Zabránenie extrakcii textu z dôverných dokumentov pred zdieľaním +- Odstránenie problémov so závislosťou od písiem prevodom textu na pixely +- Vytvorenie „plochej“ verzie PDF so zložitými vrstvami alebo priehľadnosťou, ktorá sa v rôznych prehliadačoch zobrazuje rozdielne +- Príprava PDF pre systém, ktorý prijíma len vstup založený na obrázkoch +- Odstránenie skrytého obsahu (napríklad sledovaných zmien alebo údajov formulárov) zredukovaním PDF na čisté obrázky + +## Tipy + +- 150 DPI v PNG je spoľahlivé predvolené nastavenie. Vyššie choďte len vtedy, ak potrebujete tlačový výstup alebo priblíženie jemných detailov. +- JPEG vytvára výrazne menšie súbory, ale na ostrých hranách textu spôsobuje kompresné artefakty. +- Rastrovanie je nevratné: ak budete neskôr potrebovať upraviteľný text, ponechajte si pôvodné PDF. + +## Súvisiace nástroje + +- [Komprimovať PDF](./compress-pdf): zmenšenie veľkosti rastrovaného PDF +- [Zarovnať naklonené PDF](./deskew-pdf): narovnanie strán pred rastrovaním naskenovaných dokumentov +- [Písma do kriviek](./font-to-outline): prevod písiem na vektorové cesty, ak chcete zachovať škálovateľnosť +- [Zlúčiť vrstvy PDF](./flatten-pdf): zlúčenie formulárov bez prevodu na obrázky diff --git a/docs/sk/tools/remove-annotations.md b/docs/sk/tools/remove-annotations.md new file mode 100644 index 00000000..ce84ed07 --- /dev/null +++ b/docs/sk/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Odstrániť anotácie +description: Odstráňte z PDF všetky komentáre, zvýraznenia, odkazy a ďalšie anotácie jedným kliknutím. +--- + +# Odstrániť anotácie + +Vyčistite svoje PDF odstránením všetkých anotácií: komentárov, zvýraznení, lepiacich poznámok, značiek v texte, odkazov, pečiatok a akýchkoľvek ďalších objektov anotácií vložených v dokumente. Samotný obsah strán (text, obrázky, grafika) zostane nedotknutý. + +## Ako to funguje + +1. Nahrajte svoj súbor PDF. +2. Nástroj zistí počet strán dokumentu a zobrazí informácie o súbore. +3. Kliknutím na **Odstrániť anotácie** spustíte spracovanie. +4. Vyčistené PDF bez všetkých anotácií sa stiahne automaticky. + +## Funkcie + +- Odstraňuje všetky typy anotácií: komentáre, zvýraznenia, podčiarknutia, prečiarknutia, lepiace poznámky, pečiatky, odkazy a značky formulárov +- Pracuje na každej strane dokumentu +- Zachováva všetok obsah, ktorý nie je anotáciou (text, obrázky, vektorovú grafiku, polia formulárov) +- Pred spracovaním zobrazí počet strán a veľkosť súboru + +## Prípady použitia + +- Vyčistenie dokumentu pred konečnou distribúciou po kole pripomienkovania, v ktorom viacerí recenzenti pridali komentáre +- Odstránenie zvýraznení a lepiacich poznámok zo zdieľaných študijných materiálov +- Odstránenie anotácií odkazov z dokumentu pred archiváciou +- Príprava „čistej“ verzie právneho dokumentu, ktorý bol počas rokovaní hojne anotovaný +- Odstránenie komentárov recenzentov z rukopisu pred odoslaním do tlače + +## Tipy + +- Tento nástroj odstraňuje anotácie na úrovni štruktúry PDF, takže výsledok si zachová vyberateľný text a pôvodnú kvalitu, bez akéhokoľvek rastrovania. +- Ak chcete odstrániť len konkrétne anotácie, nie všetky, použite [Editor PDF](./edit-pdf) a vymažte jednotlivé anotácie selektívne. +- Anotácie v zlúčených PDF (kde boli anotácie začlenené do obsahu strany) sa nedajú odstrániť, pretože už nie sú samostatnými objektmi. + +## Súvisiace nástroje + +- [Editor PDF](./edit-pdf) +- [Pridať vodoznak](./add-watermark) +- [Podpísať PDF](./sign-pdf) diff --git a/docs/sk/tools/remove-blank-pages.md b/docs/sk/tools/remove-blank-pages.md new file mode 100644 index 00000000..18938e7a --- /dev/null +++ b/docs/sk/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Odstrániť prázdne strany +description: Automaticky rozpoznajte a odstráňte z PDF prázdne alebo takmer prázdne strany s nastaviteľnou citlivosťou. +--- + +# Odstrániť prázdne strany + +Prehľadajte PDF a automaticky odstráňte prázdne alebo takmer prázdne strany. Nástroj vykreslí každú stranu a analyzuje jej pixely, aby zistil, či je prázdna, a pred spracovaním vám umožní potvrdiť, ktoré strany sa odstránia. + +## Ako to funguje + +1. Nahrajte svoj súbor PDF. +2. Posuvníkom **Citlivosť** nastavte, ako prísne sa určuje „prázdna“ strana. +3. Kliknutím na **Rozpoznať prázdne strany** prehľadáte dokument. +4. Nástroj zobrazí miniatúry rozpoznaných prázdnych strán, aby ste ich mohli skontrolovať. +5. Potvrďte výber a stiahnite vyčistené PDF bez prázdnych strán. + +## Možnosti + +- **Citlivosť**: posuvník od 0 % do 100 % (predvolene 80 %). Vyššie hodnoty sú prísnejšie a označia len strany, ktoré sú úplne alebo takmer biele. Nižšie hodnoty sú benevolentnejšie a zachytia aj strany s minimálnym obsahom, napríklad jednou bodkou alebo slabým vodoznakom. + +## Funkcie + +- Analýza každej strany na úrovni pixelov na rozpoznanie prázdneho obsahu +- Nastaviteľný posuvník citlivosti na jemné doladenie rozpoznávania +- Náhľad miniatúr rozpoznaných prázdnych strán na ručné overenie +- Všetky neprázdne strany zostanú presne také, aké sú +- Zvládne dokumenty akejkoľvek veľkosti a s akýmkoľvek počtom strán +- Zobrazenie priebehu počas prehľadávania + +## Prípady použitia + +- Vyčistenie naskenovaných dokumentov, pri ktorých skener zachytil prázdne zadné strany jednostranných originálov +- Odstránenie oddeľovacích strán z hromadne skenovaných dávok dokumentov +- Odstránenie prázdnych strán vložených systémami na správu dokumentov +- Vyčistenie PDF exportovaných z textových editorov, ktoré niekedy obsahujú prázdne strany na konci +- Zmenšenie veľkosti súboru odstránením zbytočných prázdnych strán + +## Tipy + +- Začnite s predvolenou citlivosťou 80 % a upravte ju podľa potreby. Ak nástroj vynechá strany, ktoré vám pripadajú prázdne, citlivosť znížte. Ak označí strany so slabým obsahom, ktorý chcete ponechať, zvýšte ju. +- Nástroj vykresľuje každú stranu, aby analyzoval jej obsah, takže čas spracovania rastie s počtom strán. Pri veľmi veľkých dokumentoch počítajte s krátkym čakaním. +- Pred potvrdením odstránenia skontrolujte rozpoznané prázdne strany v náhľade miniatúr. Strany so slabými hlavičkami, pätičkami alebo vodoznakmi môžu byť v závislosti od nastavenia citlivosti označené. + +## Súvisiace nástroje + +- [Orezať PDF](./crop-pdf) +- [Editor PDF](./edit-pdf) +- [Čísla strán](./page-numbers) diff --git a/docs/sk/tools/remove-metadata.md b/docs/sk/tools/remove-metadata.md new file mode 100644 index 00000000..4e6abba7 --- /dev/null +++ b/docs/sk/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Odstrániť metadáta +description: Odstráňte zo súborov PDF všetky skryté metadáta vrátane autora, názvu, dátumu vytvorenia, producenta, údajov XMP a ID dokumentu. +--- + +# Odstrániť metadáta + +Každé PDF nesie metadáta, ktoré môžu prezradiť, kto ho vytvoril, aký softvér sa použil, kedy bolo naposledy upravené a ďalšie. Tento nástroj ich odstráni všetky (slovník info, prúdy metadát XMP, ID dokumentu a údaje špecifické pre aplikácie) a ponechá čistý dokument bez stopy po jeho pôvode. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Kliknite na **Odstrániť metadáta**. +3. Stiahnite vyčistený súbor. + +Nie je čo nastavovať. Nástroj je zámerne dôkladný: vymaže všetko. + +## Čo sa odstráni + +- **Polia slovníka info**: názov, autor, predmet, kľúčové slová, tvorca, producent, dátum vytvorenia, dátum úpravy +- **Prúd metadát XMP**: blok metadát vo formáte XML uložený v katalógu dokumentu +- **ID dokumentu**: jedinečné identifikátory v traileri PDF, pomocou ktorých sa dá dokument sledovať naprieč systémami +- **PieceInfo**: metadáta špecifické pre aplikácie pridané programami ako Illustrator alebo InDesign + +## Čo zostane + +- Všetok viditeľný obsah strán (text, obrázky, grafika) +- Polia formulárov a anotácie +- Záložky a odkazy +- Samotná štruktúra dokumentu + +## Prípady použitia + +- Odstránenie vášho mena a organizácie z dokumentu pred jeho anonymným zverejnením +- Odstránenie časových pečiatok vytvorenia, ktoré prezrádzajú, kedy bol dokument pripravený +- Vyčistenie reťazcov producenta, ktoré identifikujú váš softvér na prácu s PDF +- Príprava dokumentov na regulačné podania, ktoré vyžadujú PDF bez metadát +- Odstránenie stôp histórie úprav pred zdieľaním dokumentu navonok + +## Tipy + +- Najprv použite nástroj Zobraziť metadáta, aby ste presne videli, aké metadáta vaše PDF obsahuje, skôr než ich odstránite. +- Ak potrebujete odstrániť metadáta _a zároveň_ JavaScript, anotácie a vložené súbory, použite na dôkladnejšie čistenie Vyčistiť PDF. +- Odstránenie metadát je trvalé. Ak by ste tieto údaje mohli neskôr potrebovať, ponechajte si originál. + +## Súvisiace nástroje + +- [Vyčistiť PDF](./sanitize-pdf): odstránenie metadát spolu so skriptmi, prílohami a ďalším +- [Zašifrovať PDF](./protect-pdf): ochrana vyčisteného PDF heslom +- [Komprimovať PDF](./compress-pdf): odstránenie metadát môže mierne zmenšiť súbor; kompresiou ušetríte viac diff --git a/docs/sk/tools/remove-restrictions.md b/docs/sk/tools/remove-restrictions.md new file mode 100644 index 00000000..d06cc1a3 --- /dev/null +++ b/docs/sk/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Odstrániť obmedzenia +description: Odstráňte zo súborov PDF ochranu heslom, obmedzenia tlače, zámky úprav a obmedzenia kopírovania. +--- + +# Odstrániť obmedzenia + +PDF môžu mať dva typy hesiel: heslo používateľa (potrebné na otvorenie súboru) a heslo vlastníka (určuje, čo s ním môžete robiť). Tento nástroj odstráni obe spolu so všetkými súvisiacimi obmedzeniami: zámkami tlače, úprav, kopírovania a anotácií. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. Ak má PDF heslo vlastníka, zadajte ho do poľa **Heslo vlastníka**. Ak má PDF len obmedzenia používania bez hesla, nechajte ho prázdne. +3. Kliknite na **Odstrániť obmedzenia**. +4. Stiahnite PDF bez obmedzení. + +Nástroj používa prepínače QPDF `--decrypt` a `--remove-restrictions` na vytvorenie čistej kópie bez obmedzení. + +## Čo sa odstráni + +- Ochrana heslom (heslo používateľa aj vlastníka) +- Obmedzenia tlače +- Obmedzenia úprav +- Obmedzenia kopírovania textu a obrázkov +- Obmedzenia anotácií a komentovania +- Všetky ostatné bezpečnostné obmedzenia zakódované v PDF + +## Prípady použitia + +- Odomknutie PDF, ktoré vlastníte, ale heslo ste nastavili pred rokmi +- Odstránenie obmedzení tlače z dokumentu, ku ktorému máte oprávnený prístup +- Povolenie kopírovania a vkladania z referenčných materiálov na robenie poznámok +- Príprava PDF pre nástroje prístupnosti, ktoré nevedia pracovať s obmedzenými dokumentmi + +## Tipy + +- Ak je nastavené heslo vlastníka, musíte ho poznať. Tento nástroj heslá neprelamuje ani neskúša hrubou silou. +- Ak potrebujete súbor ponechať zašifrovaný, ale zmeniť konkrétne oprávnenia, použite namiesto toho nástroj Zmeniť oprávnenia. +- Výstupný súbor nemá žiadne šifrovanie: ktokoľvek, kto ho dostane, ho môže voľne otvoriť. + +## Súvisiace nástroje + +- [Dešifrovať PDF](./unlock-pdf): odomknutie PDF, keď poznáte heslo používateľa +- [Zašifrovať PDF](./protect-pdf): opätovné použitie šifrovania s novými nastaveniami +- [Zmeniť oprávnenia](./change-permissions): selektívna úprava povolených akcií diff --git a/docs/sk/tools/repair-pdf.md b/docs/sk/tools/repair-pdf.md new file mode 100644 index 00000000..43ebd649 --- /dev/null +++ b/docs/sk/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Opraviť PDF +description: Obnovte údaje z poškodených súborov PDF pomocou opravného enginu QPDF. Podporuje dávkové spracovanie. +--- + +# Opraviť PDF + +Keď sa PDF nechce otvoriť, zobrazuje porušený obsah alebo vo vašom prehliadači spôsobuje chyby, tento nástroj sa pokúsi znovu zostaviť jeho vnútornú štruktúru. Používa opravný engine QPDF, ktorý dokáže obnoviť údaje pri mnohých typoch poškodenia: poškodené tabuľky krížových odkazov, skrátené prúdy, neplatné odkazy na objekty a ďalšie. + +## Ako to funguje + +1. Nahrajte jeden alebo viac poškodených súborov PDF. +2. Kliknite na **Opraviť PDF**. +3. Jeden opravený súbor sa stiahne priamo. Z viacerých súborov vznikne archív ZIP. + +Nástroj spracuje každý súbor cez QPDF s prepínačom `--decrypt`, ktorý QPDF prinúti prečítať a prepísať celú štruktúru PDF a pritom opraviť obnoviteľné problémy. + +## Funkcie + +- Dávková oprava viacerých PDF v jednej operácii +- Automatické rozlíšenie obnoviteľných a neobnoviteľných súborov +- Hlásenie úspechu/zlyhania pre každý súbor pri spracovaní viacerých súborov +- Používa QPDF (WebAssembly), overenú knižnicu na transformáciu PDF + +## Čo dokáže opraviť + +- Poškodené alebo chýbajúce tabuľky krížových odkazov +- Skrátené konce súborov z neúplných stiahnutí +- Neplatné číslovanie objektov a dĺžky prúdov +- Menšie štrukturálne nezrovnalosti z chybných generátorov PDF +- Artefakty šifrovania z neúspešných pokusov o dešifrovanie + +## Čo nedokáže opraviť + +- Výrazne skrátené súbory, v ktorých chýba väčšina obsahových dát +- PDF zašifrované heslom, ktoré nemáte +- Súbory, ktoré v skutočnosti nie sú PDF (nesprávna prípona súboru) +- Poškodenie obrázkov v PDF (štruktúra sa opraví, ale obrazové dáta sa znovu nevytvoria) + +## Prípady použitia + +- Obnovenie PDF z neúspešného stiahnutia z e-mailu +- Otváranie súborov vytvorených staršími alebo neštandardnými generátormi PDF +- Oprava PDF, ktoré fungujú v jednom prehliadači, ale v inom nie +- Príprava poškodených archívnych dokumentov na dlhodobé uloženie + +## Tipy + +- Ak oprava zlyhá, skúste súbor najprv otvoriť vo webovom prehliadači: prehliadače majú vlastnú logiku obnovy a môžu vykresliť dosť obsahu na opätovné uloženie. +- Pri zašifrovaných PDF, ktorých oprava zlyhá, skúste najprv Dešifrovať PDF a potom opravte dešifrovaný výstup. + +## Súvisiace nástroje + +- [Komprimovať PDF](./compress-pdf): ďalšie vyčistenie štruktúry opraveného PDF +- [Linearizovať PDF](./linearize-pdf): optimalizácia opraveného súboru na doručovanie cez web +- [Zlúčiť vrstvy PDF](./flatten-pdf): zlúčenie formulárov, ktoré mohli byť poškodené diff --git a/docs/sk/tools/reverse-pages.md b/docs/sk/tools/reverse-pages.md new file mode 100644 index 00000000..c8138392 --- /dev/null +++ b/docs/sk/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Obrátiť poradie strán +description: Otočte poradie strán jedného alebo viacerých súborov PDF tak, aby sa posledná strana stala prvou. +--- + +# Obrátiť poradie strán + +Obráťte poradie strán PDF tak, aby sa posledná strana stala prvou, predposledná druhou a tak ďalej. Podporuje dávkové spracovanie viacerých súborov naraz. + +## Ako to funguje + +1. Nahrajte jeden alebo viac súborov PDF. +2. Kliknite na tlačidlo spracovania. +3. Každý súbor sa obráti samostatne. Ak ste nahrali viacero súborov, výstupom je archív ZIP so všetkými obrátenými PDF. +4. Jeden súbor sa stiahne priamo ako obrátené PDF. + +## Funkcie + +- Dávkové spracovanie: obrátenie viacerých PDF v jednej operácii +- Jeden súbor pri jednom PDF, ZIP pri viacerých +- Tlačidlá na odstránenie jednotlivých súborov pred spracovaním +- Zachováva všetok obsah a formátovanie strán + +## Prípady použitia + +- Oprava dokumentu, ktorý bol naskenovaný v opačnom poradí +- Príprava prezentácie v PDF na čítanie odzadu dopredu +- Obrátenie poradia strán pre konkrétne tlačové postupy, ktoré podávajú strany v opačnom poradí +- Oprava dokumentu, ktorého strany boli omylom zostavené odzadu + +## Tipy + +- Každý súbor v dávke sa obráti samostatne: samotné súbory sa voči sebe nepreusporiadajú. +- Na podrobnejšie preusporiadanie strán (nielen úplné obrátenie) použite [Duplikovať a organizovať](./organize-pdf). + +## Súvisiace nástroje + +- [Duplikovať a organizovať](./organize-pdf) +- [Otočiť PDF](./rotate-pdf) +- [PDF Multi Nástroj](./pdf-multi-tool) diff --git a/docs/sk/tools/rotate-custom.md b/docs/sk/tools/rotate-custom.md new file mode 100644 index 00000000..556bc1fb --- /dev/null +++ b/docs/sk/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Otočiť o vlastné stupne +description: Otáčajte strany PDF o ľubovoľný uhol so zadaním stupňov pre každú stranu a hromadným ovládaním otočenia. +--- + +# Otočiť o vlastné stupne + +Otáčajte strany PDF o ľubovoľný uhol, nielen po 90 stupňoch. Každá strana má vlastné pole na zadanie uhla a pomocou hromadného ovládania môžete použiť jeden uhol na všetky strany naraz. + +## Ako to funguje + +1. Nahrajte súbor PDF. Pre každú stranu sa vykreslí miniatúra. +2. Každá strana má číselné pole zobrazujúce jej aktuálny uhol otočenia. +3. Zadajte ľubovoľnú hodnotu v stupňoch (kladnú alebo zápornú) na otočenie konkrétnej strany alebo použite tlačidlá doľava/doprava pri strane na rýchle úpravy o 90 stupňov. +4. Pomocou poľa **hromadný uhol** v hornej časti nastavte jednotné otočenie všetkých strán. +5. Kliknutím na tlačidlo spracovania vytvoríte otočené PDF. + +## Funkcie + +- Voľné zadanie stupňov pre každú stranu (ľubovoľné celé číslo) +- Hromadné ovládanie uhla na nastavenie rovnakého otočenia všetkých strán +- Náhľad otočenia v miniatúrach v reálnom čase +- Tlačidlá rýchleho otočenia o 90 stupňov pri každej strane +- Postupne načítavané miniatúry pre výkon pri veľkých dokumentoch + +## Prípady použitia + +- Oprava mierne naklonených skenov o niekoľko stupňov +- Otočenie strán podľa neštandardnej požiadavky na orientáciu +- Presné otočenie jednotlivých strán v dokumente so zmiešaným obsahom +- Doladenie uhlov strán po počiatočnom hromadnom otočení + +## Tipy + +- Kladné hodnoty otáčajú v smere hodinových ručičiek, záporné proti smeru hodinových ručičiek. +- Pole hromadného uhla po použití prepíše uhly všetkých strán. V prípade potreby nastavte jednotlivé úpravy až po hromadnej operácii. +- Na štandardné otočenia o 90/180/270 stupňov s jednoduchším rozhraním použite [Otočiť PDF](./rotate-pdf). + +## Súvisiace nástroje + +- [Otočiť PDF](./rotate-pdf) +- [PDF Multi Nástroj](./pdf-multi-tool) +- [Duplikovať a organizovať](./organize-pdf) diff --git a/docs/sk/tools/rotate-pdf.md b/docs/sk/tools/rotate-pdf.md new file mode 100644 index 00000000..7d891d37 --- /dev/null +++ b/docs/sk/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Otočiť PDF +description: Otáčajte jednotlivé alebo všetky strany PDF po 90 stupňoch pomocou vizuálneho rozhrania s miniatúrami. +--- + +# Otočiť PDF + +Otáčajte strany PDF o 90 stupňov v smere alebo proti smeru hodinových ručičiek. Nástroj zobrazuje náhľady miniatúr všetkých strán, takže ich môžete otáčať jednotlivo alebo hromadne otočiť celý dokument. + +## Ako to funguje + +1. Nahrajte súbor PDF. Miniatúry všetkých strán sa vykreslia v mriežke. +2. Tlačidlami otočenia doľava/doprava pod miniatúrou strany otočíte konkrétnu stranu. +3. Ovládacími prvkami hromadného otočenia v hornej časti otočíte všetky strany naraz. +4. Náhľad miniatúr sa v reálnom čase aktualizuje a zobrazuje otočenie. +5. Kliknutím na tlačidlo spracovania uložíte otočené PDF. + +## Funkcie + +- Otáčanie jednotlivých strán po 90 stupňoch (doľava alebo doprava) +- Hromadné otočenie všetkých strán naraz +- Náhľad miniatúr v reálnom čase s animovanými prechodmi otočenia +- Postupne načítavané miniatúry pre plynulý výkon pri veľkých dokumentoch +- Zachováva pôvodný obsah a kvalitu strán + +## Prípady použitia + +- Oprava naskenovaných strán otočených nabok alebo hore nohami +- Otočenie strán na šírku na výšku (alebo naopak) +- Oprava dokumentu so zmiešanou orientáciou, kde boli niektoré strany naskenované v nesprávnom uhle +- Príprava dokumentu na konkrétnu orientáciu zobrazenia + +## Tipy + +- Otočenia sa sčítavajú. Dvojnásobné kliknutie na tlačidlo v smere hodinových ručičiek otočí stranu o 180 stupňov. +- Na otočenia o iný uhol než 90 stupňov (napr. 45 stupňov na opravu mierne nakloneného skenu) použite namiesto toho [Otočiť o vlastné stupne](./rotate-custom). +- Ovládacie prvky hromadného otočenia ovplyvňujú všetky strany, nielen vybrané. Tento nástroj nemá žiadny mechanizmus výberu; na to použite [PDF Multi Nástroj](./pdf-multi-tool). + +## Súvisiace nástroje + +- [Otočiť o vlastné stupne](./rotate-custom) +- [PDF Multi Nástroj](./pdf-multi-tool) +- [Duplikovať a organizovať](./organize-pdf) diff --git a/docs/sk/tools/rtf-to-pdf.md b/docs/sk/tools/rtf-to-pdf.md new file mode 100644 index 00000000..eaa400a2 --- /dev/null +++ b/docs/sk/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF do PDF +description: Preveďte súbory Rich Text Format (RTF) do PDF vo svojom prehliadači pomocou enginu založeného na LibreOffice. +--- + +# RTF do PDF + +Preveďte dokumenty Rich Text Format do PDF. RTF je multiplatformový formát dokumentov, ktorý podporuje prakticky každý textový editor. Tento nástroj používa engine LibreOffice bežiaci v prehliadači na vykreslenie súborov RTF s nedotknutým formátovaním: tučné písmo, kurzíva, tabuľky aj vložené obrázky sa prenesú do PDF. + +## Podporované formáty + +| Formát | Prípony | Typy MIME | +| :----- | :------ | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite jeden či viac súborov RTF. +2. Skontrolujte zoznam súborov. Podľa potreby pridajte ďalšie alebo súbory odstráňte. +3. Kliknite na **Previesť do PDF**. Engine LibreOffice sa inicializuje pri prvom použití a potom spracuje každý súbor. +4. Jeden súbor sa stiahne priamo ako PDF. Viacero súborov dostanete ako `rtf-converted.zip`. + +## Možnosti + +Tento nástroj nemá žiadne ďalšie nastavenia. Prevod zachováva pôvodné formátovanie RTF. + +## Výstup + +| Počet vstupov | Výstup | +| :------------ | :------------------------------------------------------------ | +| 1 súbor | Stiahnutie jedného PDF (napr. `letter.pdf`) | +| 2+ súbory | Archív ZIP (`rtf-converted.zip`) s jedným PDF pre každý súbor | + +## Prípady použitia + +- Prevod starších dokumentov RTF zo starých textových editorov na moderné PDF +- Premena e-mailových šablón RTF na náhľady v PDF +- Spracovanie výstupu RTF z právnych alebo zdravotníckych softvérových systémov +- Hromadný prevod súborov RTF zo systému na správu dokumentov do PDF na archiváciu + +## Tipy + +- Engine LibreOffice sa načíta raz a uloží do medzipamäte. Prvý prevod v relácii trvá o niekoľko sekúnd dlhšie, ďalšie sú rýchlejšie. +- Súbory RTF s vloženými objektmi OLE nemusia vykresliť všetky objekty dokonale. Čistý text, obrázky a štandardné formátovanie sa prevedú spoľahlivo. +- Ak vaše súbory RTF vytvoril Microsoft Word, môžete ich previesť aj priamo nástrojom [Word do PDF](./word-to-pdf), ktorý okrem DOC a DOCX prijíma aj RTF. + +## Súvisiace nástroje + +- [Word do PDF](./word-to-pdf) +- [ODT do PDF](./odt-to-pdf) +- [Text do PDF](./txt-to-pdf) diff --git a/docs/sk/tools/sanitize-pdf.md b/docs/sk/tools/sanitize-pdf.md new file mode 100644 index 00000000..dc5d68c0 --- /dev/null +++ b/docs/sk/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Vyčistiť PDF +description: Odstráňte z PDF skrytý a potenciálne nebezpečný obsah vrátane metadát, JavaScriptu, vložených súborov, anotácií a vrstiev. +--- + +# Vyčistiť PDF + +PDF môžu obsahovať oveľa viac, než vidíte na obrazovke. Skryté metadáta, vložený JavaScript, prílohy, údaje formulárov a informácie o vrstvách môžu vyzradiť citlivé údaje alebo predstavovať bezpečnostné riziko. Vyčistenie ich všetky odstráni a zostane vám čistý dokument, ktorý môžete bezpečne zdieľať verejne. + +## Ako to funguje + +1. Nahrajte súbor PDF. +2. V zozname vyberte, ktoré prvky sa majú odstrániť. +3. Kliknite na **Vyčistiť PDF**. +4. Stiahnite vyčistený súbor. + +## Možnosti čistenia + +Všetky možnosti sú predvolene zapnuté. Zrušte začiarknutie tých, ktoré chcete zachovať. + +| Možnosť | Čo odstráni | +| -------------------------------- | --------------------------------------------------------------------------- | +| **Zlúčiť formuláre** | Prevedie interaktívne polia formulárov na statický obsah | +| **Odstrániť metadáta** | Odstráni autora, názov, dátum vytvorenia, informácie o softvéri a údaje XMP | +| **Odstrániť anotácie** | Vymaže komentáre, zvýraznenia, lepiace poznámky a značky | +| **Odstrániť JavaScript** | Odstráni vložené skripty, ktoré by sa mohli spustiť pri otvorení | +| **Odstrániť vložené súbory** | Odstráni prílohy vložené v PDF | +| **Odstrániť vrstvy (OCG)** | Zlúči skupiny voliteľného obsahu do jednej vrstvy | +| **Odstrániť odkazy** | Odstráni hypertextové odkazy a odkazy na URL | +| **Odstrániť stromovú štruktúru** | Odstráni štruktúru dokumentu používanú na značkovanie prístupnosti | +| **Odstrániť MarkInfo** | Odstráni informácie o označenom obsahu | +| **Odstrániť písma** | Odstráni údaje vložených písiem (používajte opatrne) | + +## Prípady použitia + +- Príprava PDF na verejné zverejnenie odstránením interných metadát (mená autorov, verzie softvéru, história úprav) +- Odstránenie JavaScriptu z PDF prijatého z nedôveryhodného zdroja pred jeho otvorením +- Vyčistenie PDF pred odoslaním klientovi, ktorý by nemal vidieť vložené komentáre ani názvy polí formulárov +- Odstránenie skrytých vrstiev z architektonického výkresu pred zdieľaním konečnej verzie +- Dodržiavanie požiadaviek na minimalizáciu údajov podľa predpisov o ochrane súkromia + +## Tipy + +- Možnosť „Odstrániť písma“ nechajte nezačiarknutú, pokiaľ si nie ste istí, že sa PDF stále vykreslí správne. Odstránenie písiem môže v niektorých prehliadačoch spôsobiť, že text bude neviditeľný. +- Ak potrebujete odstrániť len metadáta, samostatný nástroj Odstrániť metadáta je rýchlejší a cielenejší. +- Vyčistenie je nevratné. Pôvodný súbor si ponechajte. + +## Súvisiace nástroje + +- [Odstrániť metadáta](./remove-metadata): odstránenie len metadát bez zásahu do iného obsahu +- [Zlúčiť vrstvy PDF](./flatten-pdf): cielené zlúčenie formulárov a anotácií +- [Zašifrovať PDF](./protect-pdf): pridanie ochrany heslom po vyčistení +- [Rastrovať PDF](./rasterize-pdf): krajná možnosť, prevod na obrázky na odstránenie všetkého skrytého obsahu diff --git a/docs/sk/tools/scanner-effect.md b/docs/sk/tools/scanner-effect.md new file mode 100644 index 00000000..907d34b8 --- /dev/null +++ b/docs/sk/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Efekt skenera +description: Nechajte svoje PDF vyzerať ako naskenovaný dokument pomocou nastaviteľného šumu, otočenia, rozmazania a efektu starnutia papiera. +--- + +# Efekt skenera + +Premeňte čisté digitálne PDF na niečo, čo vyzerá, akoby vyšlo z plochého skenera. Nástroj použije nastaviteľný šum, mierne otočenie, rozmazanie, posun jasu a voliteľné zažltnutie, aby napodobnil nedokonalosti fyzického skenu. + +## Ako to funguje + +1. Nahrajte svoj súbor PDF. +2. Otvorí sa editor so živým náhľadom prvej strany a panelom nastavení. +3. Upravte parametre efektu skenovania pomocou posuvníkov a prepínačov. +4. Náhľad sa pri zmene nastavení aktualizuje v reálnom čase. +5. Kliknutím na **Použiť** spracujete všetky strany a stiahnete výsledok. + +## Možnosti + +- **Farebný priestor (prepínač Odtiene sivej)**: prevedie výstup na odtiene sivej pre klasický čiernobiely vzhľad skenu. +- **Okraj**: pridá jemný tmavý okraj okolo hrán strany, ktorý napodobňuje artefakty okrajov skenera. +- **Otočenie**: použije mierne otočenie (-5 až +5 stupňov) na simuláciu nakrivo podaného papiera. +- **Rozptyl otočenia**: pridá k uhlu otočenia náhodnú odchýlku, takže každá strana je naklonená trochu inak. +- **Jas**: posunie celkový jas nahor alebo nadol. +- **Kontrast**: upraví kontrast na simuláciu rozdielov v kvalite tonera. +- **Rozmazanie**: použije gaussovské rozmazanie na zjemnenie hrán textu ako pri nekvalitnom skene. +- **Šum**: pridá náhodný pixelový šum na simuláciu zrnitosti snímača skenera. Vyššie hodnoty vytvárajú zrnitejší výsledok. +- **Zažltnutie**: pridá teplý žltý nádych na simuláciu starého alebo recyklovaného papiera. +- **Rozlíšenie**: nastaví výstupné DPI. Nižšie hodnoty vytvárajú viac pixelovaný vzhľad pripomínajúci sken. +- **Obnoviť**: vráti všetky nastavenia na predvolené hodnoty. + +## Funkcie + +- Náhľad v reálnom čase, ktorý sa aktualizuje pri úprave každého parametra +- Náhodný rozptyl otočenia pre každú stranu pre realistickú variabilitu +- Desať nezávisle nastaviteľných parametrov +- Režim odtieňov sivej pre autentický čiernobiely výstup skenu +- Ovládanie rozlíšenia od faxovej kvality s nízkym DPI po archívnu kvalitu s vysokým DPI + +## Prípady použitia + +- Dodanie vzhľadu naskenovaného a vytlačeného dokumentu digitálne vytvoreným dokumentom +- Simulácia starnutia fyzických dokumentov pri rekonštrukcii historických dokumentov +- Testovanie softvéru OCR na zhoršenej kvalite skenov +- Vytváranie dokumentov, ktoré zodpovedajú vizuálnemu štýlu existujúcich naskenovaných archívov + +## Tipy + +- Začnite s jemnými hodnotami. Úroveň šumu 10-20, mierne otočenie o 0,5 stupňa a minimálne rozmazanie už vytvoria presvedčivý vzhľad skenu. +- Skombinujte režim odtieňov sivej s miernym zažltnutím pre efekt „fotokópie z fotokópie“. +- Nižšie nastavenia rozlíšenia (100-150 DPI) vytvárajú najrealistickejší vzhľad faxu. + +## Súvisiace nástroje + +- [Invertovať farby](./invert-colors) +- [Úprava farieb](./adjust-colors) +- [Farba pozadia](./background-color) diff --git a/docs/sk/tools/sign-pdf.md b/docs/sk/tools/sign-pdf.md new file mode 100644 index 00000000..f08d3950 --- /dev/null +++ b/docs/sk/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Podpísať PDF +description: Nakreslite, napíšte alebo nahrajte podpis a umiestnite ho na strany PDF pomocou integrovaného prehliadača. +--- + +# Podpísať PDF + +Pridajte svoj podpis do akéhokoľvek dokumentu PDF. Nástroj obsahuje plnohodnotný prehliadač PDF so vstavanými nástrojmi na podpis, v ktorom môžete podpis nakresliť voľnou rukou, napísať svoje meno podpisovým písmom alebo nahrať obrázok podpisu. Podpisy umiestnite a zmeňte ich veľkosť na ľubovoľnej strane a potom uložte podpísaný dokument. + +## Ako to funguje + +1. Nahrajte svoj súbor PDF. +2. Dokument sa otvorí v integrovanom prehliadači PDF s nástrojmi na anotácie. +3. Pomocou nástroja na podpis v prehliadači vytvorte podpis nakreslením, napísaním alebo nahraním obrázka. +4. Kliknite na miesto na strane, kam chcete podpis umiestniť, a upravte jeho veľkosť a polohu. +5. Voliteľne zaškrtnite **Zlúčiť PDF**, aby sa podpis natrvalo vložil do dokumentu. +6. Kliknutím na **Uložiť a stiahnuť podpísané PDF** získate podpísaný súbor. + +## Možnosti + +- **Zlúčiť PDF**: ak je zaškrtnuté, podpis sa natrvalo vloží do obsahu strany. Tým sa zabráni, aby ho iní presunuli alebo odstránili. Ak nie je zaškrtnuté, podpis zostane anotáciou, ktorú možno upraviť v kompatibilných prehliadačoch. + +## Funkcie + +- Tri spôsoby vytvorenia podpisu: kreslenie voľnou rukou, napísaný text alebo nahraný obrázok +- Integrovaný prehliadač PDF na presné umiestnenie +- Presúvanie a zmena veľkosti podpisov na ľubovoľnej strane +- Voliteľné zlúčenie na trvalé vloženie podpisov +- Podpora viacerých podpisov v tom istom dokumente + +## Prípady použitia + +- Podpisovanie zmlúv, dohôd alebo schvaľovacích formulárov pred ich odoslaním späť +- Pridanie podpisu na daňové dokumenty, poistné udalosti alebo úradné formuláre +- Umiestnenie iniciálok na jednotlivé strany viacstranovej zmluvy +- Podpisovanie NDA alebo personálnych dokumentov, ktoré prichádzajú ako prílohy PDF + +## Tipy + +- Zlúčenie zapnite, ak posielate podpísané PDF niekomu, kto by nemal mať možnosť váš podpis odstrániť alebo premiestniť. +- Pre právne záväzné digitálne podpisy s overením na základe certifikátu ponúka BentoPDF aj samostatný nástroj Digitálny podpis. +- Pre najčistejší výsledok nahrajte obrázok podpisu vo formáte PNG s priehľadným pozadím. + +## Súvisiace nástroje + +- [Editor PDF](./edit-pdf) +- [Pridať pečiatky](./add-stamps) +- [Vypĺňanie PDF formulárov](./form-filler) diff --git a/docs/sk/tools/split-pdf.md b/docs/sk/tools/split-pdf.md new file mode 100644 index 00000000..e59da765 --- /dev/null +++ b/docs/sk/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Rozdeliť PDF +description: Rozdeľte PDF na menšie súbory podľa rozsahu strán, vizuálneho výberu, záložiek, párnych/nepárnych strán alebo pevných intervalov. +--- + +# Rozdeliť PDF + +Rozdeľte PDF na menšie dokumenty pomocou jedného zo šiestich režimov rozdelenia. Od jednoduchých rozsahov strán až po rozdelenie podľa záložiek, tento nástroj zvládne každý scenár delenia dokumentu. + +## Ako to funguje + +1. Nahrajte jeden súbor PDF. +2. V rozbaľovacom zozname vyberte režim rozdelenia. +3. Nastavte možnosti daného režimu (rozsahy strán, výbery atď.). +4. Kliknite na tlačidlo spracovania. +5. Výsledok sa stiahne ako jedno PDF alebo archív ZIP v závislosti od režimu a nastavení. + +## Režimy rozdelenia + +| Režim | Popis | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| **Rozsah** | Zadajte rozsahy strán, napríklad `1-3, 5, 8-10`. Viacero rozsahov vytvorí samostatné PDF v ZIP. Jeden rozsah vytvorí jedno PDF. | +| **Vizuálny výber** | Prechádzajte miniatúry strán a kliknutím vyberte požadované strany. Vybrané strany sa extrahujú do nového PDF. | +| **Párne / Nepárne** | Extrahuje len párne alebo nepárne strany. | +| **Všetky strany** | Rozdelí každú stranu do samostatného súboru PDF, stiahnutého ako ZIP. | +| **Záložky** | Rozdelí na hraniciach záložiek. Vyberte úroveň záložiek, ktorá určí, kde nastanú rozdelenia. | +| **Každých N strán** | Rozdelí na časti po N stranách (napr. každých 5 strán). Posledná časť môže mať menej strán. | + +## Funkcie + +- Šesť rôznych režimov rozdelenia pokrývajúcich prakticky každý prípad použitia +- Vizuálny výber strán s postupne načítavanými miniatúrami +- Rozdelenie podľa záložiek s filtrovaním úrovní +- Možnosť výstupu ZIP pre režimy rozsahu a vizuálneho výberu +- Spracuje rozsahy strán so zmiešanou syntaxou (`1-3, 5, 8-10`) +- Upozornenie, keď rozdelenie po N stranách vytvorí nerovnomerné časti + +## Prípady použitia + +- Extrakcia konkrétnej kapitoly alebo časti z veľkého dokumentu +- Oddelenie nepárnych a párnych strán pre obojstrannú tlač +- Rozdelenie knihy v PDF na súbory jednotlivých kapitol na hraniciach záložiek +- Vyčlenenie konkrétnych strán (napríklad strany s podpisom) zo zmluvy +- Rozdelenie zostavenej správy na súbory podľa častí na distribúciu + +## Tipy + +- Viacero rozsahov strán oddelených čiarkami (napr. `1-5, 10-15, 20-25`) vytvorí samostatné PDF, jedno pre každý rozsah, zabalené v ZIP. +- Režim rozdelenia podľa záložiek vyžaduje, aby PDF záložky skutočne obsahovalo. Ak sa žiadne nenájdu, zobrazí sa chybové hlásenie. +- Začiarkavacie políčko „Stiahnuť ako ZIP“ v režimoch Rozsah a Vizuálny výber vám umožní získať samostatné PDF pre každú stranu namiesto spojeného súboru. + +## Súvisiace nástroje + +- [Spojiť PDF](./merge-pdf) +- [Extrahovať strany](./extract-pages) +- [Odstrániť strany](./delete-pages) +- [PDF Multi Nástroj](./pdf-multi-tool) diff --git a/docs/sk/tools/svg-to-pdf.md b/docs/sk/tools/svg-to-pdf.md new file mode 100644 index 00000000..3389012c --- /dev/null +++ b/docs/sk/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG do PDF +description: Preveďte vektorovú grafiku SVG do PDF s ovládaním kvality, celé vo vašom prehliadači. +--- + +# SVG do PDF + +Preveďte súbory Scalable Vector Graphics (SVG) do PDF. Nástroj rastruje každé SVG pomocou vykresľovacieho enginu prehliadača a výsledok vloží v jeho pôvodnom rozlíšení. Užitočné na premenu vektorových ikon, diagramov a ilustrácií na prenosné dokumenty. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :------ | +| SVG | `.svg` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite jeden či viac súborov SVG. +2. Skontrolujte a spravujte zoznam súborov. +3. Vyberte úroveň **Kvalita PDF**. +4. Kliknite na **Previesť do PDF**. Výsledok sa stiahne ako `from_svgs.pdf`. + +Každé SVG sa načíta ako text, vykreslí sa na plátno v jeho vlastnej šírke a výške (predvolene 800x600, ak nie sú zadané rozmery) a exportuje sa ako PNG. Toto PNG sa potom vloží do PDF pomocou pdf-lib. Priehľadné oblasti sa vyplnia bielym pozadím. + +## Možnosti + +**Kvalita PDF** určuje kompresiu po rastrovaní: + +- **Vysoká kvalita**: najbližšie k pôvodnému vykresleniu. +- **Stredná kvalita** (predvolené): dobrá rovnováha. +- **Nízka kvalita**: najmenší súbor, určitá strata detailov. + +## Prípady použitia + +- Prevod architektonických alebo technických diagramov zo SVG do PDF pripraveného na tlač +- Zabalenie sád ikon do referenčného PDF pre dizajnový systém +- Premena vizualizácií dát (D3.js, exporty z knižníc grafov) na PDF pripravené do správ +- Vytvorenie tlačiteľných verzií infografík založených na SVG + +## Tipy + +- Súbory SVG bez explicitných atribútov `width` a `height` sa vykreslia v rozmere 800x600 pixelov. Pre najlepšie výsledky nastavte rozmery v zdrojovom SVG pred prevodom. +- Zložité SVG s odkazmi na externé písma alebo prepojenými obrázkami sa nemusia vykresliť dokonale. Pre spoľahlivý výstup vložte všetky zdroje priamo do SVG. +- Keďže sa SVG rastruje, PDF bude obsahovať bitmapový obrázok namiesto vektorových ciest. Na skutočný vektorový výstup PDF je potrebný špecializovaný vektorový nástroj. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [PNG do PDF](./png-to-pdf) +- [BMP do PDF](./bmp-to-pdf) diff --git a/docs/sk/tools/table-of-contents.md b/docs/sk/tools/table-of-contents.md new file mode 100644 index 00000000..3301f7b7 --- /dev/null +++ b/docs/sk/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Obsah +description: Vytvorte naformátovanú stranu s obsahom z existujúcich záložiek vášho PDF. +--- + +# Obsah + +Tento nástroj načíta záložky (osnovu) vo vašom PDF a vytvorí naformátovanú stranu s obsahom, ktorá sa vloží na začiatok dokumentu. Ak vaše PDF už má záložky, ale chýba mu viditeľná strana s obsahom, tento nástroj ju vytvorí automaticky. + +## Ako to funguje + +1. Nahrajte PDF, ktoré obsahuje záložky. +2. Prispôsobte nadpis obsahu, veľkosť písma a rodinu písma. +3. Voliteľne zaškrtnite **Pridať záložku pre stranu s obsahom**, aby sa samotný obsah zahrnul do stromu záložiek. +4. Kliknutím na **Vytvoriť obsah** spracujete súbor. +5. Aktualizované PDF sa stiahne automaticky so stranou s obsahom vloženou na začiatok. + +## Možnosti + +- **Nadpis obsahu**: nadpis zobrazený v hornej časti vytvorenej strany. Predvolene „Obsah“. +- **Veľkosť písma**: vyberte od 10 pt do 72 pt. Predvolená hodnota je 12 pt. +- **Rodina písma**: vyberte z variantov Times Roman, Helvetica alebo Courier (normálne, tučné, kurzíva, tučná kurzíva). Predvolene Helvetica. +- **Pridať záložku pre stranu s obsahom**: ak je zaškrtnuté, do stromu osnovy PDF sa pridá záložka pre samotnú stranu s obsahom. + +## Funkcie + +- Načíta celú hierarchiu záložiek z PDF +- Vytvorí prehľadne naformátovanú stranu s obsahom s odkazmi na čísla strán +- Podporuje vnorené úrovne záložiek s odsadením +- Výber z 12 vstavaných písiem PDF +- Voliteľná záložka odkazujúca na samotnú stranu s obsahom + +## Prípady použitia + +- Pridanie tlačiteľného obsahu do e-kníh alebo správ, ktoré majú len digitálne záložky +- Vytvorenie obsahu pre zlúčený dokument po spojení viacerých PDF +- Vytvorenie referenčnej strany pre dlhé technické príručky +- Príprava dokumentov na tlač, kde sa očakáva viditeľný obsah + +## Tipy + +- Ak vaše PDF nemá žiadne záložky, najprv ich vytvorte nástrojom [Upraviť záložky](./bookmark) a potom sa sem vráťte a vytvorte obsah. +- Pri veľkých dokumentoch zlepší čitateľnosť väčšia veľkosť písma, napríklad 14 pt alebo 16 pt. + +## Súvisiace nástroje + +- [Upraviť záložky](./bookmark) +- [Čísla strán](./page-numbers) +- [Hlavička a pätička](./header-footer) diff --git a/docs/sk/tools/text-color.md b/docs/sk/tools/text-color.md new file mode 100644 index 00000000..15dab5ed --- /dev/null +++ b/docs/sk/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Zmeniť farbu textu +description: Zmeňte farbu všetkého textu vo vašom PDF na ľubovoľnú farbu. +--- + +# Zmeniť farbu textu + +Nahraďte farbu textu v celom PDF. Nástroj rozpozná oblasti textu na každej strane a prefarbí ich na zvolenú farbu, pričom zachová rozloženie dokumentu a netextový obsah. + +## Ako to funguje + +1. Nahrajte svoj súbor PDF. +2. Vyberte novú farbu textu pomocou výberu farby. Predvolená je modrá (#0000FF). +3. Kliknutím na **Zmeniť farbu textu** spustíte spracovanie. +4. Prefarbené PDF sa stiahne automaticky. Indikátor priebehu ukazuje, ktorá strana sa práve spracúva. + +## Možnosti + +- **Nová farba textu**: výber farby na zvolenie náhradnej farby pre všetok text v dokumente. + +## Funkcie + +- Prefarbí text na každej strane dokumentu +- Spracovanie po stranách so zobrazením priebehu +- Výber farby s plnou podporou hex farieb +- Zachováva rozloženie strany a netextové prvky + +## Prípady použitia + +- Zmena čierneho textu na tmavomodrý pre jemnejší, modernejší vzhľad dokumentu +- Prefarbenie textu podľa pravidiel značky pred distribúciou dokumentov +- Prevod textu na konkrétnu farbu kvôli súladu s požiadavkami na prístupnosť +- Zviditeľnenie textu na novo použitej farbe pozadia + +## Tipy + +- Tento nástroj kvôli kvalite vykresľuje strany v dvojnásobnej mierke a potom PDF znovu zostaví. Výstup je založený na obrázkoch, takže text už nebude možné vyberať ani vyhľadávať. +- Pri dokumentoch, v ktorých potrebujete zachovať vyberateľný text, zvážte namiesto toho priamu úpravu PDF v nástroji [Editor PDF](./edit-pdf). +- Čas spracovania rastie s počtom strán, pretože každá strana sa vykresľuje samostatne. + +## Súvisiace nástroje + +- [Farba pozadia](./background-color) +- [Invertovať farby](./invert-colors) +- [Úprava farieb](./adjust-colors) diff --git a/docs/sk/tools/tiff-to-pdf.md b/docs/sk/tools/tiff-to-pdf.md new file mode 100644 index 00000000..3f7378a9 --- /dev/null +++ b/docs/sk/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF do PDF +description: Preveďte jednostranové aj viacstranové obrázky TIFF do formátu PDF vo svojom prehliadači s plnou podporou strán. +--- + +# TIFF do PDF + +Preveďte súbory TIFF do PDF vrátane viacstranových TIFF. Každá strana (alebo „IFD“) v súbore TIFF sa stane samostatnou stranou výsledného PDF. Je to užitočné najmä pri naskenovaných dokumentoch, faxoch a medicínskych snímkach, ktoré sa bežne ukladajú ako viacstranové TIFF. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory TIFF. +2. Skontrolujte zoznam súborov a podľa potreby ho upravte. +3. Kliknite na **Previesť do PDF**. Výsledok sa stiahne ako `from_tiff.pdf`. + +Nástroj dekóduje každý súbor TIFF pomocou dekodéra TIFF v JavaScripte a extrahuje surové pixelové dáta RGBA každej strany. Každá strana sa vykreslí na plátno, exportuje ako PNG a vloží do PDF. Rozmery strán zodpovedajú pôvodným stranám TIFF. + +## Možnosti + +Tento nástroj neposkytuje žiadne ďalšie nastavenia kvality. Obrázky sa vkladajú v pôvodnom rozlíšení. + +## Prípady použitia + +- Prevod viacstranových faxových dokumentov (TIFF-F) do prenosnejšieho formátu PDF +- Premena archívov naskenovaných dokumentov uložených ako TIFF na prehľadávateľné PDF (následne v kombinácii s nástrojom OCR) +- Spracovanie medicínskych obrazových súborov (patologické preparáty, rádiologické exporty), ktoré používajú TIFF +- Prevod súborov TIFF so snímkami GIS alebo satelitnými snímkami na zdieľateľné dokumenty + +## Tipy + +- Viacstranové TIFF sú plne podporované. Z 10-stranového TIFF vznikne 10-stranové PDF. TIFF nemusíte najprv rozdeľovať. +- Spracovanie veľmi veľkých súborov TIFF (stovky megabajtov) môže trvať dlhšie, pretože celý súbor sa musí dekódovať v pamäti prehliadača. +- Ak potrebujete na výslednom PDF OCR, po prevode ho spracujte nástrojom [Rozpoznávanie textu (OCR) PDF](./ocr-pdf). + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [BMP do PDF](./bmp-to-pdf) +- [JPG do PDF](./jpg-to-pdf) diff --git a/docs/sk/tools/txt-to-pdf.md b/docs/sk/tools/txt-to-pdf.md new file mode 100644 index 00000000..1dea548c --- /dev/null +++ b/docs/sk/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Text do PDF +description: Preveďte textové súbory alebo napísaný text do PDF s vlastnými písmami, farbami a veľkosťami strán. +--- + +# Text do PDF + +Preveďte čistý text na naformátované PDF. Môžete nahrať súbory `.txt` alebo písať priamo do vstavaného textového editora. Nástroj podporuje viacero písiem, vlastné farby textu a širokú škálu veľkostí strán, od A0 po A10, ako aj US Letter, Legal a Tabloid. + +## Podporované formáty + +| Vstup | Prípony | +| :------------------- | :----------------------------------- | +| Čisté textové súbory | `.txt` | +| Priame zadanie textu | Napíšte alebo vložte text do editora | + +## Ako to funguje + +1. Prepínačom v hornej časti vyberte režim vstupu: **Nahrať súbory** alebo **Napísať text**. +2. Pri nahrávaní pretiahnite alebo kliknutím vyberte jeden či viac súborov `.txt`. Pri písaní zadajte text priamo do textového poľa. +3. Nastavte možnosti formátovania: rodinu písma, veľkosť písma, farbu textu a veľkosť strany. +4. Kliknite na **Vytvoriť PDF**. Výstup sa stiahne ako `text_to_pdf.pdf`. + +Pri nahrávaní viacerých súborov sa ich obsah spojí s prázdnymi riadkami medzi nimi. + +## Možnosti + +| Možnosť | Hodnoty | Predvolené | +| :----------------- | :---------------------------------------------------------------------------------- | :--------------- | +| **Rodina písma** | Helvetica (bezpätkové), Tiro (pätkové), Courier (neproporcionálne), Times (pätkové) | Helvetica | +| **Veľkosť písma** | 6 až 72 pt | 12 | +| **Farba textu** | Ľubovoľná farba cez výber farby | Čierna (#000000) | +| **Veľkosť strany** | ISO A0 až A10, B0 až B10, C0 až C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Jazyky s písmom sprava doľava (arabčina, hebrejčina, perzština, urdčina) sa rozpoznajú automaticky. Keď sa nájde text RTL, smer a zarovnanie textu sa zodpovedajúco prepnú. + +## Prípady použitia + +- Prevod útržkov kódu alebo log súborov na tlačiteľné PDF s písmom Courier +- Rýchle vytvorenie PDF z poznámok zo stretnutia napísaných na mieste +- Naformátovanie textového rukopisu konkrétnym písmom a veľkosťou strany na odovzdanie +- Vytvorenie PDF verzie súboru README alebo changelogu na offline distribúciu + +## Tipy + +- Režim **Napísať text** použite, keď chcete rýchlo previesť obsah schránky bez toho, aby ste ho najprv uložili ako súbor. +- Courier (neproporcionálne) je najlepšou voľbou písma pre kód, logy alebo akýkoľvek obsah, pri ktorom záleží na zarovnaní stĺpcov. +- Okraje strany sú pevne nastavené na 72 bodov (1 palec) na všetkých stranách. + +## Súvisiace nástroje + +- [Markdown do PDF](./markdown-to-pdf) +- [CSV do PDF](./csv-to-pdf) +- [Word do PDF](./word-to-pdf) diff --git a/docs/sk/tools/unlock-pdf.md b/docs/sk/tools/unlock-pdf.md new file mode 100644 index 00000000..7cea85e2 --- /dev/null +++ b/docs/sk/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Odomknúť PDF +description: Odstráňte ochranu heslom zo zašifrovaných PDF. Podporuje hromadné dešifrovanie viacerých súborov jedným heslom. +--- + +# Odomknúť PDF + +Ak poznáte heslo k zašifrovanému PDF, tento nástroj úplne odstráni šifrovanie a vytvorí odomknutú kópiu, ktorú môže ktokoľvek otvoriť bez prihlasovacích údajov. Podporuje hromadné dešifrovanie, ak viacero PDF zdieľa rovnaké heslo. + +## Ako to funguje + +1. Nahrajte jeden alebo viac zašifrovaných PDF súborov. +2. Zadajte **heslo**, ktorým sú súbory chránené. +3. Kliknite na **Dešifrovať PDF**. +4. Jeden súbor sa stiahne priamo. Viac súborov vytvorí ZIP archív so všetkými odomknutými PDF. + +## Funkcie + +- Dešifrovanie jedného súboru aj hromadné dešifrovanie +- Podpora používateľských hesiel aj hesiel vlastníka +- Výstup úplne bez šifrovania a bez zostávajúcich obmedzení +- Jasné hlásenie chýb pri nesprávnom hesle alebo poškodenom súbore +- Sledovanie úspechu alebo zlyhania každého súboru v hromadnom režime + +## Rozdiel oproti nástroju Odstrániť obmedzenia + +**Dešifrovať PDF** vyžaduje heslo a odstráni všetko šifrovanie. **Odstrániť obmedzenia** sa zameriava na obmedzenia používania (tlač, kopírovanie, úpravy) a nemusí vyžadovať heslo, ak bolo nastavené iba heslo vlastníka. Dešifrovanie použite, keď sa PDF bez hesla vôbec neotvorí. + +## Prípady použitia + +- Trvalé odomknutie PDF, ktoré ste predtým zašifrovali a heslo už nepotrebujete +- Odstránenie šifrovania z dávky archivovaných dokumentov pre jednoduchší dlhodobý prístup +- Príprava PDF chránených heslom pre systém správy dokumentov, ktorý nepodporuje šifrované súbory +- Odomknutie PDF pred zlúčením s inými dokumentmi (mnohé nástroje na zlučovanie nevedia spracovať šifrovaný vstup) + +## Tipy + +- Pole pre heslo platí pre všetky nahrané súbory. Ak majú vaše PDF rôzne heslá, spracujte ich v samostatných dávkach. +- Ak sa zobrazí chyba „Nesprávne heslo", skontrolujte medzery na konci a Caps Lock. +- Po dešifrovaní nemá výstup žiadne zabezpečenie. Ak potrebujete nové heslo, znova ho zašifrujte nástrojom Zašifrovať PDF. + +## Súvisiace nástroje + +- [Zašifrovať PDF](./protect-pdf) -- znova použite šifrovanie s novým heslom +- [Odstrániť obmedzenia](./remove-restrictions) -- odstráňte obmedzenia používania bez úplného dešifrovania +- [Zmeniť oprávnenia](./change-permissions) -- upravte konkrétne oprávnenia zašifrovaného PDF diff --git a/docs/sk/tools/validate-signature-pdf.md b/docs/sk/tools/validate-signature-pdf.md new file mode 100644 index 00000000..ea1e6571 --- /dev/null +++ b/docs/sk/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Overiť PDF podpis +description: Overte digitálne podpisy v PDF súboroch. Skontrolujte platnosť certifikátu, identitu podpisujúceho, integritu dokumentu a stav reťazca dôvery. +--- + +# Overiť PDF podpis + +Nahrajte podpísané PDF a tento nástroj extrahuje každý digitálny podpis, identifikuje podpisujúceho, skontroluje platnosť certifikátu a oznámi, či bol dokument po podpísaní zmenený. Môžete tiež zadať dôveryhodný certifikát na overenie reťazca podpisu. + +## Ako to funguje + +1. Nahrajte podpísaný PDF súbor. Overovanie sa spustí automaticky. +2. Nástroj zobrazí súhrn: počet nájdených podpisov a koľko z nich je platných. +3. Každý podpis má podrobnú kartu s menom podpisujúceho, vydavateľom, dátumami a stavom. +4. Voliteľne nahrajte **dôveryhodný certifikát** (.pem, .crt, .cer, .der) na overenie podpisu voči konkrétnej kotve dôvery. Opätovné overenie prebehne automaticky. + +## Čo sa kontroluje + +### Analýza podpisu + +Nástroj extrahuje z PDF objekty podpisu PKCS#7, dekóduje štruktúru ASN.1 a získa X.509 certifikát podpisujúceho spolu s reťazcom certifikátov vloženým v podpise. + +### Platnosť certifikátu + +- **Expirácia**: Je certifikát momentálne v rozsahu platnosti? +- **Detekcia vlastného podpisu**: Je certifikát svojím vlastným vydavateľom? +- **Reťazec dôvery**: Ak je zadaný dôveryhodný certifikát, vedie k nemu reťazec certifikátu podpisujúceho? + +### Kryptografické overenie + +- Nástroj zrekonštruuje bajty pokryté hodnotou `/ByteRange` podpisu, zahašuje ich algoritmom deklarovaným podpisujúcim a porovná výsledok s atribútom `messageDigest` v podpise. +- Potom znova serializuje podpísané atribúty ako DER SET a overí podpis voči verejnému kľúču certifikátu podpisujúceho. +- **Podpis je označený ako platný, iba ak prejdú všetky tieto kontroly.** Ak boli bajty PDF po podpísaní zmenené alebo vložený podpis nezodpovedá kľúču podpisujúceho, stav ukáže „Neplatný: kryptografické overenie zlyhalo" s konkrétnym dôvodom. + +#### Podporované algoritmy podpisu + +| Algoritmus | Spôsob overenia | +| ----------------------- | -------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, so záložným Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` po konverzii podpisu DER → IEEE P1363 | + +Ak podpis používa algoritmus mimo tohto zoznamu (napríklad Ed25519, SM2 alebo RSA s nezvyčajným OID hašu), karta zobrazí žltý stav **„Neoverený: nepodporovaný algoritmus podpisu"** spolu s konkrétnym OID alebo dôvodom. Ide o zámerné rozlíšenie troch stavov: + +- **Platný**: podpis bol kryptograficky overený voči verejnému kľúču podpisujúceho. +- **Neplatný**: overenie prebehlo a dopadlo negatívne (zmenené bajty, nezhoda kľúča). +- **Neoverený**: nástroj nedokázal spustiť overenie pre tento algoritmus. Metadáta certifikátu sa stále zobrazia, ale podpis považujte za „neznámy" a overte ho v Adobe Acrobat alebo príkazom `openssl cms -verify`. + +### Nezabezpečené hašovacie algoritmy + +- Podpisy používajúce **MD5 alebo SHA-1** sú odmietnuté ako neplatné a označené stavom „Nezabezpečený haš". Na oba algoritmy existujú zverejnené kolízne útoky, takže podpis nad hašom SHA-1 alebo MD5 nezaručuje integritu. +- SHA-224, SHA-256, SHA-384 a SHA-512 sú akceptované. + +### Pokrytie dokumentu + +- **Úplné pokrytie**: Podpis pokrýva celý PDF súbor, teda po podpísaní neboli pridané ani zmenené žiadne bajty. +- **Čiastočné pokrytie**: Podpis pokrýva iba časť súboru. Môže to naznačovať zmeny po podpísaní (nie nutne škodlivé -- prírastkové ukladanie vytvára čiastočné pokrytie). + +## Podrobnosti podpisu + +Každá karta podpisu zobrazuje: + +- **Podpísal**: Bežné meno, organizácia a e-mail z certifikátu podpisujúceho +- **Vydavateľ**: Certifikačná autorita, ktorá vydala certifikát podpisujúceho +- **Podpísané dňa**: Časová pečiatka vložená v podpise +- **Platné od / Platné do**: Obdobie platnosti certifikátu +- **Dôvod**: Prečo bol dokument podpísaný (ak je uvedený) +- **Miesto**: Kde bol podpísaný (ak je uvedené) +- **Stav pokrytia**: Úplné alebo čiastočné +- **Odznak dôvery**: Dôveryhodný alebo Mimo reťazca dôvery (iba ak je zadaný vlastný certifikát) + +### Technické podrobnosti + +Rozbaľte sekciu technických podrobností, kde nájdete: + +- Sériové číslo certifikátu podpisujúceho +- Hašovací algoritmus (SHA-256, SHA-512 a pod.) +- Algoritmus podpisu (RSA so SHA-256, ECDSA so SHA-256 a pod.) +- Chybové hlásenia pre neplatné podpisy + +## Prípady použitia + +- Overenie digitálne podpísanej zmluvy pred jej spolupodpísaním +- Audit podpísaných dokumentov na potvrdenie, že neboli pozmenené +- Kontrola, či certifikát od podpísania dokumentu nevypršal +- Overenie podpisov voči koreňovému certifikátu vašej organizácie +- Kontrola údajov o podpise na úradných alebo právnych dokumentoch + +## Tipy + +- Certifikát s vlastným podpisom neznamená, že podpis je neplatný -- znamená to, že identitu podpisujúceho nemožno overiť cez dôveryhodnú tretiu stranu. Pri interných dokumentoch je to bežné. +- Čiastočné pokrytie nemusí vždy znamenať manipuláciu. Mnohé PDF postupy pridávajú prírastkové aktualizácie (napríklad druhý podpis), ktoré vytvárajú čiastočné pokrytie. +- Ak chcete overiť reťazec dôvery, nahrajte ako dôveryhodný certifikát koreňový alebo sprostredkujúci certifikát vašej organizácie. + +## Súvisiace nástroje + +- [Digitálny podpis PDF](./digital-sign-pdf) -- podpíšte PDF vlastným certifikátom +- [Zlúčiť vrstvy PDF](./flatten-pdf) -- zlúčte vrstvy PDF pred podpísaním, aby ste zabránili úpravám po podpise +- [Odstrániť metadáta](./remove-metadata) -- vyčistite PDF pred pridaním podpisu diff --git a/docs/sk/tools/view-metadata.md b/docs/sk/tools/view-metadata.md new file mode 100644 index 00000000..2d08a01a --- /dev/null +++ b/docs/sk/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Zobraziť metadáta +description: Preskúmajte všetky vlastnosti metadát PDF vrátane informácií o dokumente, údajov XMP a štruktúrnych detailov. +--- + +# Zobraziť metadáta + +Preskúmajte skryté vlastnosti vložené v PDF súbore. Nástroj zobrazí informácie o dokumente (názov, autor, dátumy), metadáta XMP, rozmery strán a ďalšie štruktúrne údaje v čitateľnej podobe. + +## Ako to funguje + +1. Nahrajte PDF súbor. +2. Nástroj súbor okamžite analyzuje a zobrazí všetky dostupné metadáta v prehľadných sekciách. +3. Prezrite si slovník informácií o dokumente, strom metadát XMP a štruktúrne vlastnosti. +4. Nie je potrebný žiadny krok spracovania -- metadáta sa zobrazia hneď po načítaní súboru. + +## Funkcie + +- Zobrazuje štandardné polia informácií o dokumente: Názov, Autor, Predmet, Kľúčové slová, Tvorca, Producent +- Zobrazuje dátumy vytvorenia a úpravy v čitateľnom formáte +- Analyzuje a vykresľuje celý strom metadát XMP s vnorenými mennými priestormi +- Prevádza formát dátumu PDF (`D:20240101120000Z`) na čitateľné dátumy +- Usporiadané do zbaliteľných sekcií pre jednoduchú navigáciu + +## Sekcie metadát + +| Sekcia | Obsah | +| -------------------------- | --------------------------------------------------------------------------------------- | +| **Informácie o dokumente** | Názov, Autor, Predmet, Kľúčové slová, Tvorca, Producent, Dátum vytvorenia, Dátum úpravy | +| **Metadáta XMP** | Celý strom metadát na báze XML s mennými priestormi Dublin Core, XAP, PDF a vlastnými | +| **Vlastnosti dokumentu** | Počet strán, verzia PDF, veľkosť súboru, stav šifrovania | + +## Prípady použitia + +- Zistenie, kto je autorom PDF a kedy bolo naposledy upravené +- Overenie, že metadáta boli pred zverejnením dokumentu správne nastavené +- Audit súkromia PDF kontrolou, aké osobné údaje obsahuje +- Zistenie softvéru použitého na vytvorenie alebo úpravu PDF (cez pole Producent) +- Kontrola metadát XMP kvôli súladu so správou digitálnych aktív + +## Tipy + +- Reťazce dátumov PDF začínajúce na `D:` sa automaticky prevedú do formátu vášho miestneho časového pásma. +- Ak sú polia metadát prázdne, tvorca PDF ich jednoducho nenastavil. Nie všetky PDF obsahujú bohaté metadáta. +- Ak chcete metadáta po kontrole upraviť, použite [Upraviť metadáta](./edit-metadata). Na ich úplné odstránenie použite Odstrániť metadáta. + +## Súvisiace nástroje + +- [Upraviť metadáta](./edit-metadata) +- [PDF OCG (vrstvy)](./pdf-layers) +- [Porovnať PDF](./compare-pdfs) diff --git a/docs/sk/tools/vsd-to-pdf.md b/docs/sk/tools/vsd-to-pdf.md new file mode 100644 index 00000000..1b99d766 --- /dev/null +++ b/docs/sk/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD do PDF +description: Prevádzajte diagramy Microsoft Visio (VSD/VSDX) do PDF priamo v prehliadači. Zadarmo, súkromne, bez potreby Visia. +--- + +# VSD do PDF + +Prevádzajte diagramy Microsoft Visio do PDF bez inštalácie Visia. Súbory VSD a VSDX obsahujú vývojové diagramy, organizačné schémy, sieťové diagramy a pôdorysy, ktoré väčšina ľudí nedokáže otvoriť. Tento nástroj ich vykreslí ako čisté PDF, ktoré si zobrazíte na akomkoľvek zariadení. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :------------ | :------ | :----------------------------------------- | +| Visio binárny | `.vsd` | Starší formát Visio (Visio 2003 a staršie) | +| Visio XML | `.vsdx` | Moderný formát Visio (Visio 2013+) | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory VSD či VSDX. Oba formáty môžete kombinovať v jednej dávke. +2. Skontrolujte zoznam súborov. Nechcené položky odstráňte ikonou koša alebo pomocou **Pridať ďalšie súbory** pridajte ďalšie diagramy. +3. Kliknite na **Previesť do PDF**. V prehliadači sa načíta engine založený na LibreOffice a vykreslí každý diagram do PDF so zachovaním tvarov, spojníc, popisov a rozloženia strany. +4. Jeden diagram sa stiahne priamo ako PDF. Viac súborov vytvorí ZIP archív s názvom `vsd-to-pdf.zip`. + +## Možnosti + +Nie je potrebné žiadne nastavenie. Prevodník rešpektuje pôvodnú veľkosť a orientáciu strany z dokumentu Visio. + +## Prípady použitia + +- Prezeranie diagramov Visio od kolegu, keď nemáte licenciu Visio +- Zaradenie sieťových alebo architektonických diagramov do projektovej dokumentácie ako PDF +- Tlač organizačných schém alebo procesných tokov ako podkladov na stretnutie +- Archivácia starších súborov VSD zo starých verzií Visia vo formáte odolnom voči budúcnosti + +## Tipy + +- Viacstranové dokumenty Visio vytvoria viacstranové PDF, pričom každá strana Visio zodpovedá jednej strane PDF. +- Súbory VSDX (moderný formát na báze XML) sa vo všeobecnosti prevádzajú vernejšie ako staršie binárne súbory VSD. +- Engine LibreOffice sa načíta raz za reláciu. Pri prvom prevode počítajte s krátkym čakaním, ďalšie súbory budú rýchlejšie. + +## Súvisiace nástroje + +- [ODG do PDF](./odg-to-pdf) +- [PUB do PDF](./pub-to-pdf) +- [PSD do PDF](./psd-to-pdf) diff --git a/docs/sk/tools/webp-to-pdf.md b/docs/sk/tools/webp-to-pdf.md new file mode 100644 index 00000000..d8aaa47b --- /dev/null +++ b/docs/sk/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP do PDF +description: Prevádzajte obrázky WebP do formátu PDF priamo v prehliadači s nastaviteľnou kvalitou kompresie. +--- + +# WebP do PDF + +Prevádzajte obrazový formát WebP od Googlu do PDF. Hodí sa to najmä vtedy, keď ste si z webu stiahli obrázky vo formáte WebP a potrebujete ich v univerzálnejšom formáte na tlač alebo zdieľanie. + +## Podporované formáty + +| Formát | Prípony | +| :----- | :------ | +| WebP | `.webp` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory WebP. +2. Skontrolujte zoznam súborov a odstráňte tie, ktoré nepotrebujete. +3. Vyberte úroveň **Kvalita PDF**. +4. Kliknite na **Previesť do PDF**. Výstup sa stiahne ako `from_webps.pdf`. + +Interne sa každý obrázok WebP dekóduje cez canvas API prehliadača a potom sa vloží do PDF pomocou pdf-lib. Prevod tak funguje v každom prehliadači, ktorý podporuje dekódovanie WebP (všetky moderné prehliadače). + +## Možnosti + +**Kvalita PDF** určuje kompresiu pri vkladaní obrázkov: + +- **Vysoká kvalita** -- zachová najviac detailov. +- **Stredná kvalita** (predvolená) -- vyvážený výstup. +- **Nízka kvalita** -- najmenšia veľkosť súboru. + +## Prípady použitia + +- Prevod obrázkov stiahnutých z webu vo formáte WebP do PDF na tlač +- Zabalenie snímok obrazovky WebP z Chrome alebo Edge do dokumentácie +- Vytvorenie PDF portfólia z obrázkov exportovaných z dizajnérskych nástrojov, ktoré predvolene používajú WebP +- Archivácia obrázkov WebP v univerzálnejšie čitateľnom formáte + +## Tipy + +- WebP sa pred vložením do PDF interne dekóduje do PNG, takže bezstratové obrázky WebP si pri nastavení Vysoká zachovajú kvalitu. +- Ak máte mix WebP a iných obrazových formátov, použite radšej nástroj [Obrázky do PDF](./image-to-pdf) -- prijme všetko naraz. + +## Súvisiace nástroje + +- [Obrázky do PDF](./image-to-pdf) +- [PNG do PDF](./png-to-pdf) +- [JPG do PDF](./jpg-to-pdf) diff --git a/docs/sk/tools/word-to-pdf.md b/docs/sk/tools/word-to-pdf.md new file mode 100644 index 00000000..8576c79a --- /dev/null +++ b/docs/sk/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word do PDF +description: Prevádzajte dokumenty Word (DOC, DOCX), ODT a RTF do PDF priamo v prehliadači s úplným zachovaním formátovania. +--- + +# Word do PDF + +Prevádzajte dokumenty Microsoft Word a kompatibilné formáty do PDF. Nástroj používa engine LibreOffice bežiaci v prehliadači, ktorý spracuje súbory DOC, DOCX, ODT a RTF a vo výstupe zachová formátovanie, tabuľky, obrázky, hlavičky, päty a štýly. + +## Podporované formáty + +| Formát | Prípony | +| :---------------- | :------ | +| Word (moderný) | `.docx` | +| Word (starší) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite dokumenty Word. Naraz môžete vybrať viac súborov. +2. Skontrolujte a upravte zoznam súborov. +3. Kliknite na **Previesť do PDF**. Engine LibreOffice sa načíta pri prvom použití (indikátor priebehu ukazuje stav inicializácie), potom sa prevedie každý súbor. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov sa zabalí do `word-converted.zip`. + +## Možnosti + +Tento nástroj nemá žiadne ďalšie nastavenia. Engine LibreOffice vytvorí výstup pomocou predvoleného profilu exportu PDF. + +## Výstup + +| Počet vstupov | Výstup | +| :------------ | :-------------------------------------------------------------- | +| 1 súbor | Stiahnutie jedného PDF (pôvodný názov súboru s príponou `.pdf`) | +| 2+ súbory | ZIP archív (`word-converted.zip`) s jedným PDF pre každý súbor | + +## Prípady použitia + +- Prevod životopisu alebo motivačného listu z DOCX do PDF pred odoslaním žiadosti o prácu +- Hromadný prevod zmlúv alebo návrhov do PDF na odovzdanie klientovi +- Premena starších súborov `.doc` na moderné PDF na dlhodobú archiváciu +- Prevod spoločných dokumentov z Google Docs (exportovaných ako DOCX) do PDF +- Tvorba PDF pripravených na tlač zo šablón Word používaných pri automatickom generovaní dokumentov + +## Tipy + +- Engine LibreOffice sa stiahne raz za reláciu a uloží do vyrovnávacej pamäte. Pri prvom prevode počítajte s niekoľkými sekundami načítania, ďalšie prevody sú oveľa rýchlejšie. +- Zložité formátovanie (makrá, ovládacie prvky ActiveX, pokročilý SmartArt) sa nemusí previesť dokonale. Štandardné prvky dokumentu -- text, tabuľky, obrázky, hlavičky, poznámky pod čiarou -- sa prevádzajú spoľahlivo. +- Keďže tento nástroj prijíma aj ODT a RTF, môžete ho použiť ako univerzálny prevodník pre všetky formáty textových procesorov. + +## Súvisiace nástroje + +- [ODT do PDF](./odt-to-pdf) +- [RTF do PDF](./rtf-to-pdf) +- [Excel do PDF](./excel-to-pdf) +- [PowerPoint do PDF](./powerpoint-to-pdf) diff --git a/docs/sk/tools/wpd-to-pdf.md b/docs/sk/tools/wpd-to-pdf.md new file mode 100644 index 00000000..af4a5dc6 --- /dev/null +++ b/docs/sk/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD do PDF +description: Prevádzajte dokumenty WordPerfect (WPD) do PDF priamo v prehliadači pomocou LibreOffice. Zadarmo a súkromne. +--- + +# WPD do PDF + +Prevádzajte dokumenty Corel WordPerfect do PDF súborov. WPD bol kedysi dominantným formátom textových procesorov v advokátskych kanceláriách a štátnych úradoch. Ak máte staré súbory WordPerfect, ktoré moderný softvér odmieta otvoriť, tento nástroj ich oživí ako štandardné PDF. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :---------- | :------ | :------------------------------- | +| WordPerfect | `.wpd` | Všetky hlavné verzie WordPerfect | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory WPD. Naraz môžete vybrať viac súborov. +2. Skontrolujte zoznam súborov. Nechcené súbory odstráňte ikonou koša alebo pomocou **Pridať ďalšie súbory** pridajte ďalšie dokumenty. +3. Kliknite na **Previesť do PDF**. Nástroj načíta v prehliadači prevodný engine založený na LibreOffice, ktorý analyzuje formát WPD a vytvorí PDF. +4. Jeden súbor sa stiahne priamo ako PDF. Hromadné prevody vytvoria ZIP archív s názvom `wpd-to-pdf.zip`. + +## Možnosti + +Nie je potrebné žiadne nastavenie. Engine LibreOffice automaticky spracuje formátovanie, písma a rozloženie WPD. + +## Prípady použitia + +- Otváranie desaťročia starých právnych dokumentov napísaných vo WordPerfect +- Prevod archivovaných úradných podaní z WPD do moderného formátu +- Migrácia staršej knižnice dokumentov WordPerfect do PDF na dlhodobé uchovanie +- Zdieľanie súborov WPD s príjemcami, ktorí nemajú nainštalovaný Corel WordPerfect + +## Tipy + +- Engine LibreOffice sa načíta pri prvom použití, čo chvíľu trvá. Ďalšie prevody v tej istej relácii sú rýchlejšie. +- Zložité makrá WPD a kódy zobrazenia (reveal codes) sa nezachovajú, ale vizuálne rozloženie, textový obsah a základné formátovanie sa prenesú do PDF. + +## Súvisiace nástroje + +- [WPS do PDF](./wps-to-pdf) +- [ODG do PDF](./odg-to-pdf) diff --git a/docs/sk/tools/wps-to-pdf.md b/docs/sk/tools/wps-to-pdf.md new file mode 100644 index 00000000..3e81bee4 --- /dev/null +++ b/docs/sk/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS do PDF +description: Prevádzajte dokumenty Microsoft Works (WPS) do PDF priamo v prehliadači. Zadarmo, bez registrácie, úplne súkromne. +--- + +# WPS do PDF + +Prevádzajte súbory textového procesora Microsoft Works do PDF. Microsoft Works sa dodával so spotrebiteľskými počítačmi počas konca 90. rokov a v 2000-tych rokoch a množstvo súborov WPS stále leží na starých diskoch a v e-mailových archívoch. Tento nástroj ich otvorí v prehliadači a vytvorí čisté PDF. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :-------------- | :------ | :------------------------------------------- | +| Microsoft Works | `.wps` | Súbory textového procesora z Microsoft Works | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory WPS. Prijíma sa viac súborov. +2. Skontrolujte zoznam súborov. Ikonou koša odstráňte jednotlivé súbory alebo kliknite na **Pridať ďalšie súbory** a rozšírte dávku. +3. Kliknite na **Previesť do PDF**. V prehliadači sa načíta engine založený na LibreOffice a prevedie každý dokument WPS do PDF. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov sa zabalí do ZIP archívu s názvom `wps-to-pdf.zip`. + +## Možnosti + +Nie sú potrebné žiadne ďalšie nastavenia. Prevodník spracuje text, základné formátovanie a vložené obrázky zo súboru WPS. + +## Prípady použitia + +- Obnova starých školských alebo pracovných dokumentov uložených vo formáte Microsoft Works +- Otváranie e-mailových príloh WPS, keď nemáte nainštalovaný Microsoft Works +- Prevod archívu súborov WPS pri migrácii do moderného systému dokumentov +- Tlač starších dokumentov, ktoré súčasné textové procesory nedokážu otvoriť + +## Tipy + +- Nezamieňajte súbory `.wps` z Microsoft Works so súbormi WPS Office. Tento nástroj je určený výhradne pre starší formát Microsoft Works. +- Engine LibreOffice sa pri prvom použití chvíľu načítava. Po načítaní prebiehajú ďalšie prevody v tej istej relácii rýchlejšie. + +## Súvisiace nástroje + +- [WPD do PDF](./wpd-to-pdf) +- [PUB do PDF](./pub-to-pdf) diff --git a/docs/sk/tools/xml-to-pdf.md b/docs/sk/tools/xml-to-pdf.md new file mode 100644 index 00000000..4382d28e --- /dev/null +++ b/docs/sk/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML do PDF +description: Prevádzajte XML súbory do štruktúrovaných PDF dokumentov priamo v prehliadači. Zadarmo, súkromne, bez spracovania na serveri. +--- + +# XML do PDF + +Prevádzajte dátové súbory XML do čitateľných, štruktúrovaných PDF dokumentov. Surové XML je výkonné, ale pre ľudí ťažko čitateľné. Tento nástroj analyzuje strom XML, rozpozná opakujúce sa dátové štruktúry a vykreslí ich ako formátované tabuľky a sekcie v PDF formátu A4 na šírku. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----- | :------ | :--------------------------------------- | +| XML | `.xml` | Akýkoľvek správne formovaný XML dokument | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory XML. V jednej dávke môžete spracovať viac súborov. +2. Skontrolujte zoznam súborov. Nechcené súbory odstráňte ikonou koša alebo kliknite na **Pridať ďalšie súbory** a pridajte ďalšie. +3. Kliknite na **Previesť do PDF**. Nástroj analyzuje štruktúru XML vstavaným DOMParserom prehliadača, vyhodnotí hierarchiu dát a vykreslí ju do PDF pomocou jsPDF s formátovaním auto-table. +4. Jeden súbor sa stiahne ako PDF. Viac prevodov sa zabalí do `xml-to-pdf.zip`. + +## Možnosti + +Nie je potrebné žiadne ručné nastavenie. Prevodník automaticky rozpozná štruktúru XML a zvolí vhodné rozloženie tabuliek. Výstup používa orientáciu A4 na šírku, aby sa zmestili aj široké dátové sady. + +## Prípady použitia + +- Premena dátových exportov XML z databáz alebo API na tlačiteľné správy +- Tvorba čitateľných prehľadov z konfiguračných súborov XML +- Prevod faktúr alebo transakčných záznamov na báze XML do PDF na evidenciu +- Sprístupnenie XML sitemap alebo RSS kanálov v podobe dokumentu + +## Tipy + +- XML musí byť správne formované. Ak parser narazí na syntaktické chyby, prevod zlyhá s popisným chybovým hlásením, ktoré ukáže na problém. +- Hlboko vnorené štruktúry XML sa sploštia do tabuliek. Najlepšie výsledky dosiahnete, ak dáta obsahujú opakujúce sa súrodenecké prvky s konzistentnými podriadenými prvkami. +- Počas prevodu sa zobrazuje priebeh jednotlivých fáz: čítanie, analýza, vyhodnotenie a vykreslenie. + +## Súvisiace nástroje + +- [FB2 do PDF](./fb2-to-pdf) +- [XPS do PDF](./xps-to-pdf) +- [E-mail do PDF](./email-to-pdf) diff --git a/docs/sk/tools/xps-to-pdf.md b/docs/sk/tools/xps-to-pdf.md new file mode 100644 index 00000000..735acb07 --- /dev/null +++ b/docs/sk/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS do PDF +description: Prevádzajte dokumenty XPS a OXPS do formátu PDF priamo v prehliadači. Bez nahrávania, bez registrácie, úplne súkromne. +--- + +# XPS do PDF + +Prevádzajte dokumenty Microsoft XPS a OXPS do štandardných PDF súborov. XPS (XML Paper Specification) bola odpoveď Microsoftu na PDF, no jej podpora na rôznych platformách upadla. Tento nástroj tieto dokumenty opäť sprístupní všade. + +## Podporované formáty + +| Formát | Prípona | Poznámky | +| :----- | :------ | :----------------------------------- | +| XPS | `.xps` | Pôvodný formát Microsoft XPS | +| OXPS | `.oxps` | Open XPS, variant štandardu ECMA-388 | + +## Ako to funguje + +1. Kliknite na oblasť nahrávania alebo pretiahnite súbory XPS/OXPS. Naraz môžete vybrať viac súborov. +2. Skontrolujte zoznam súborov. Jednotlivé súbory odstráňte ikonou koša alebo kliknite na **Pridať ďalšie súbory** a pripojte ďalšie dokumenty. +3. Kliknite na **Previesť do PDF**. Engine PyMuPDF spracuje každý dokument lokálne vo vašom prehliadači. +4. Jeden súbor sa stiahne priamo ako PDF. Viac súborov sa zabalí do ZIP archívu s názvom `xps-converted.zip`. + +## Možnosti + +Tento nástroj vykoná priamy prevod formátu bez ďalšieho nastavenia. Výstup zachová pôvodné rozmery strán, vektorovú grafiku, písma a obrázky zo zdrojového XPS. + +## Prípady použitia + +- Otváranie súborov XPS zo starších systémov Windows, ktoré predvolene používali tlačový ovládač XPS +- Prevod dokumentov OXPS z Windows 10/11 na zdieľanie s používateľmi macOS alebo Linuxu +- Archivácia starších súborov XPS v rozšírenejšom formáte +- Sprístupnenie úradných alebo firemných dokumentov XPS externým príjemcom + +## Tipy + +- Prípony `.xps` aj `.oxps` sa spracujú automaticky -- môžete ich kombinovať v tej istej dávke. +- Ak bol pôvodný súbor XPS vytvorený tlačovým ovládačom s vysokým rozlíšením, výsledné PDF si túto kvalitu zachová. Nedochádza k prevzorkovaniu. + +## Súvisiace nástroje + +- [Word do PDF](./word-to-pdf) +- [XML do PDF](./xml-to-pdf) diff --git a/docs/sv/contributing.md b/docs/sv/contributing.md new file mode 100644 index 00000000..81092a0b --- /dev/null +++ b/docs/sv/contributing.md @@ -0,0 +1,136 @@ +# Bidra + +Tack för ditt intresse av att bidra till BentoPDF! Den här guiden hjälper dig att komma igång. + +## Komma igång + +### Förutsättningar + +- Node.js 18+ +- npm 9+ +- Git + +### Installation + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Projektstruktur + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Lägga till ett nytt verktyg + +### Steg 1: Skapa logikfilen + +Skapa `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Steg 2: Skapa HTML-sidan + +Skapa `src/pages/your-tool.html` efter mönster från de befintliga verktygsmallarna. + +### Steg 3: Registrera verktyget + +Lägg till i `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Steg 4: Lägg till i bygginställningarna + +Lägg till sidan i `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Steg 5: Lägg till översättningar + +Lägg till poster i alla språkfiler i `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Kodstil + +- Använd TypeScript för all ny kod +- Följ befintliga mönster för att hålla koden enhetlig +- Kör `npm run format` innan du committar +- Inga kommentarer i produktionskod (kommentarer tas bort vid bygget) + +## Pull request-process + +1. Skapa en funktionsgren: `git checkout -b feature/your-feature` +2. Gör dina ändringar +3. Testa noggrant: `npm run build` +4. Skicka in en PR med en tydlig beskrivning + +## Översättning + +Se [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) för hur du lägger till nya språk. + +## Licensavtal för bidragsgivare + +Innan din PR kan slås ihop måste du signera vårt CLA: + +- [Individual CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Corporate CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Få hjälp + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord-community](https://discord.gg/Bgq3Ay3f2w) + +## Licens + +BentoPDF har dubbel licensiering: + +- **AGPL-3.0** för öppen källkod-projekt där du delar hela din källkod offentligt +- **Kommersiell licens** för proprietära program med sluten källkod - [Skaffa livstidslicens för $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Genom att bidra godkänner du att dina bidrag licensieras enligt dessa villkor. diff --git a/docs/sv/getting-started.md b/docs/sv/getting-started.md new file mode 100644 index 00000000..5f7805ed --- /dev/null +++ b/docs/sv/getting-started.md @@ -0,0 +1,80 @@ +# Kom igång + +Välkommen till BentoPDF! Den här guiden hjälper dig att komma igång snabbt. + +## Vad är BentoPDF? + +BentoPDF är ett gratis PDF-verktyg med öppen källkod som sätter integriteten först och körs **helt i din webbläsare**. Dina filer lämnar aldrig din enhet, all bearbetning sker lokalt med hjälp av WebAssembly (WASM). + +## Snabbstart + +### Alternativ 1: Använd den hostade versionen + +Besök [bentopdf.com](https://www.bentopdf.com) för att använda BentoPDF direkt, ingen installation krävs. + +### Alternativ 2: Självhosta med Docker + +> [!IMPORTANT] +> Konvertering av Office-filer kräver `SharedArrayBuffer`, vilket kräver både: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - en säker kontext +> +> `http://localhost` fungerar för lokal testning eftersom webbläsare betraktar loopback som betrodd. `http://192.168.x.x` och andra LAN-adresser gör det oftast inte, så konvertering av Word/Excel/PowerPoint kräver HTTPS när du kommer åt tjänsten från andra enheter i ditt nätverk. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF levereras i två byggen: **Self-Hosted-bygget** (`bentopdf-simple`, används ovan) för interna driftsättningar i team och organisationer, och **Commercial-bygget** (`bentopdf:latest`) som används av bentopdf.com själv och av innehavare av kommersiell licens som kör publika driftsättningar. Båda innehåller samma PDF-verktyg. Commercial-bygget lägger till hero-sektionen, FAQ, omdömen och sidfoten från bentopdf.com. Är du osäker, använd Self-Hosted-bygget. + +Öppna sedan `http://localhost:3000` i din webbläsare. + +> [!NOTE] +> Om du förbereder en OCR-driftsättning i en luftgappad miljö måste du även hosta OCR-textlagrets typsnitt internt, utöver Tesseract-workern, kärnkörmiljön och traineddata-filerna. Hela uppsättningen beskrivs i [Självhosting](/sv/self-hosting/), inklusive `VITE_OCR_FONT_BASE_URL` och den medföljande katalogen `ocr-fonts/`. + +### Alternativ 3: Bygg från källkod + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Funktioner i korthet + +| Kategori | Verktyg | +| --------------------------- | -------------------------------------------------------------- | +| **Konvertera till PDF** | Word, Excel, PowerPoint, bilder, Markdown, EPUB, MOBI och mer | +| **Konvertera från PDF** | JPG, PNG, text, Excel, SVG och mer | +| **Redigera och kommentera** | Signera, markera, maskera, fyll i formulär, lägg till stämplar | +| **Organisera** | Slå ihop, dela, rotera, ta bort sidor, ändra ordning | +| **Optimera** | Komprimera, reparera, platta ut, OCR | +| **Säkerhet** | Kryptera, dekryptera, ta bort begränsningar | + +## Webbläsarstöd + +BentoPDF fungerar bäst i moderna webbläsare: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Nästa steg + +- [Utforska alla verktyg](/sv/tools/) +- [Självhosta BentoPDF](/sv/self-hosting/) +- [Bidra till projektet](/sv/contributing) diff --git a/docs/sv/index.md b/docs/sv/index.md new file mode 100644 index 00000000..adebf455 --- /dev/null +++ b/docs/sv/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Gratis PDF-verktyg med öppen källkod' + tagline: Bearbeta PDF-filer helt i din webbläsare. Inga uppladdningar. Inga servrar. Fullständig integritet. + actions: + - theme: brand + text: Kom igång + link: /sv/getting-started + - theme: alt + text: Visa verktyg + link: /sv/tools/ + - theme: alt + text: Självhosta + link: /sv/self-hosting/ + - theme: alt + text: Kommersiell licens + link: /sv/licensing + +features: + - icon: 🔒 + title: 100% privat + details: Dina filer lämnar aldrig din enhet. All bearbetning sker lokalt i din webbläsare med WebAssembly. + - icon: ⚡ + title: Snabbt och gratis + details: Ingen registrering, inga begränsningar, inga vattenstämplar. Bearbeta obegränsat med PDF-filer gratis, för alltid. + - icon: 🛠️ + title: Över 50 verktyg + details: Konvertera, redigera, slå ihop, dela, komprimera, signera, OCR och mer. Allt du behöver på ett ställe. + + - icon: 🌐 + title: Kan självhostas + details: Driftsätt på din egen infrastruktur. Docker, Vercel, Netlify, AWS eller helt luftgappade miljöer med självhostade OCR-workers, språkdata och typsnitt för textlager. +--- + +## Offline-OCR + +Om du självhostar BentoPDF i en luftgappad eller offline-miljö behöver OCR mer än Tesseract-workern och traineddata-filerna. För att få sökbara PDF-filer måste även OCR-textlagrets typsnitt serveras internt. +Se [Självhosting](/sv/self-hosting/) för hela uppsättningen, inklusive `VITE_OCR_FONT_BASE_URL`, den medföljande katalogen `ocr-fonts/` och det uppdaterade arbetsflödet för luftgappade miljöer. diff --git a/docs/sv/licensing.md b/docs/sv/licensing.md new file mode 100644 index 00000000..4846c973 --- /dev/null +++ b/docs/sv/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/sv/self-hosting/#wasm-konfiguration-agpl-komponenter) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/sv/self-hosting/apache.md b/docs/sv/self-hosting/apache.md new file mode 100644 index 00000000..abc2cd33 --- /dev/null +++ b/docs/sv/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Driftsätt med Apache + +Hosta BentoPDF med Apache HTTP Server. + +## Förutsättningar + +- Apache 2.4+ +- mod_rewrite aktiverat +- SSL-certifikat (rekommenderas) + +## Steg 1: Bygg projektet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +För att anpassa varumärket, ange miljövariabler innan bygget: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Steg 2: Kopiera filer + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Steg 3: Apache-konfiguration + +Skapa `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Steg 4: .htaccess för routing + +Skapa `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Steg 5: Aktivera nödvändiga moduler + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Steg 6: Aktivera webbplatsen + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Driftsättning i en underkatalog + +För att hosta på `/pdf/`: + +1. Bygg med bas-URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Uppdatera `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Felsökning + +### WASM 404-fel + +Kontrollera att MIME-typen är konfigurerad: + +```apache +AddType application/wasm .wasm +``` + +### Signera PDF eller Formulärifyllare visar en tom visare (`.mjs` MIME-fel) + +Om webbläsarens konsol visar: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…och den misslyckade förfrågan slutar på `.mjs`, saknar din Apache-konfiguration mappningen `.mjs → application/javascript`. Den medföljande PDF-visaren levereras med ES-modulfiler med filändelsen `.mjs`, och Apaches standardfil `mime.types` innehåller dem inte som standard. + +Lägg till i din VirtualHost eller `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Ladda sedan om Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +För att bekräfta: leta i webbläsarens DevTools → fliken Nätverk upp den misslyckade `.mjs`-förfrågan och kontrollera svarshuvudet `Content-Type`. Det ska nu vara `application/javascript`, inte `application/octet-stream`. + +### Rewrite fungerar inte + +Kontrollera att mod_rewrite är aktiverat: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel till PDF fungerar inte + +LibreOffice WASM kräver `SharedArrayBuffer`, vilket kräver dessa rubriker: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Det kräver också en säker kontext. `http://localhost` fungerar för lokal testning, men `http://192.168.x.x` och andra LAN-adresser kräver oftast HTTPS. Om rubrikerna finns men `window.crossOriginIsolated` fortfarande är `false`, kontrollera om sidan öppnas över vanlig HTTP på ett ursprung som inte är loopback. + +De förkomprimerade filerna `.wasm.gz` och `.data.gz` behöver också rätt `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Kontrollera att `mod_headers` är aktiverat: `sudo a2enmod headers` + +### Åtkomst nekad + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/sv/self-hosting/aws.md b/docs/sv/self-hosting/aws.md new file mode 100644 index 00000000..a5fb7be1 --- /dev/null +++ b/docs/sv/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Driftsätt på AWS S3 + CloudFront + +Hosta BentoPDF på AWS för maximal kontroll och skalbarhet. + +## Arkitektur + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Steg 1: Skapa S3-bucket + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Steg 2: Bygg och ladda upp + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Steg 3: Skapa CloudFront-distribution + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Eller använd AWS Console: + +1. Gå till CloudFront → Create distribution +2. Origin domain: välj din S3-bucket +3. Aktivera "Origin Access Control" +4. Default root object: `index.html` +5. Skapa distributionen + +## Steg 3b: Response Headers Policy (krävs för LibreOffice WASM) + +LibreOffice-baserade konverteringar (Word, Excel, PowerPoint till PDF) kräver `SharedArrayBuffer`, vilket kräver specifika svarsrubriker. Skapa en CloudFront Response Headers Policy: + +1. Gå till CloudFront → Policies → Response headers +2. Skapa en anpassad policy med dessa rubriker: + +| Rubrik | Värde | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Koppla policyn till din distributions standardbeteende för cache + +Eller via CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Steg 3c: S3-metadata för förkomprimerade WASM-filer + +LibreOffice WASM-filerna är förkomprimerade (`.wasm.gz`, `.data.gz`). Ange rätt Content-Type och Content-Encoding så att webbläsare packar upp dem: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Viktigt +Utan policyn för svarsrubriker är `SharedArrayBuffer` inte tillgängligt och LibreOffice WASM-konverteringar hänger sig vid cirka 55%. Utan rätt Content-Encoding på `.gz`-filerna får webbläsaren råa gzip-byte och WASM-kompileringen misslyckas. +::: + +## Steg 4: S3 Bucket Policy + +Ge CloudFront åtkomst till bucketen: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Steg 5: Anpassade felsidor + +Konfigurera 404 så att den returnerar `index.html` för SPA-routing: + +1. CloudFront → Error pages +2. Skapa ett anpassat felsvar: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Kostnadsuppskattning + +| Resurs | Uppskattad kostnad | +| ---------------------------- | ------------------ | +| S3-lagring (~500MB) | ~$0.01/månad | +| CloudFront (1TB överföring) | ~$85/månad | +| CloudFront (10GB överföring) | ~$0.85/månad | + +::: tip +Använd S3 Intelligent Tiering för att optimera kostnaden för filer som sällan används. +::: + +## Automatisering med Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/sv/self-hosting/cloudflare.md b/docs/sv/self-hosting/cloudflare.md new file mode 100644 index 00000000..b8ae5d23 --- /dev/null +++ b/docs/sv/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Driftsätt på Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) erbjuder snabb, global hosting av statiska webbplatser med obegränsad bandbredd. + +## Snabb driftsättning + +1. Gå till [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Klicka på "Create a project" +3. Anslut ditt GitHub-repository + +## Byggkonfiguration + +| Inställning | Värde | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Miljövariabler + +Lägg till dessa under Settings → Environment variables: + +| Variabel | Värde | +| ----------------------- | ----------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (valfritt) | +| `VITE_BRAND_NAME` | Eget varumärkesnamn (valfritt) | +| `VITE_BRAND_LOGO` | Logotypens sökväg relativt `public/` (valfritt) | +| `VITE_FOOTER_TEXT` | Egen sidfots-/upphovsrättstext (valfritt) | +| `VITE_DEFAULT_LANGUAGE` | Standardspråk för gränssnittet, t.ex. `fr` (valfritt) | + +## Konfigurationsfil + +Skapa `_headers` i din `public`-mapp: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Viktigt +Rubrikerna `Cross-Origin-Embedder-Policy` och `Cross-Origin-Opener-Policy` krävs för konvertering av Word/ODT/Excel/PowerPoint till PDF. Utan dem är `SharedArrayBuffer` inte tillgängligt och LibreOffice WASM-motorn kan inte initieras. +::: + +Skapa `_redirects` för SPA-routing: + +``` +/* /index.html 200 +``` + +## Egen domän + +1. Gå till ditt Pages-projekt +2. Klicka på "Custom domains" +3. Lägg till din domän +4. Cloudflare konfigurerar DNS automatiskt om domänen finns hos Cloudflare + +## Fördelar + +- **Gratis obegränsad bandbredd** +- **Globalt CDN** med över 300 edge-platser +- **Automatisk HTTPS** +- **Förhandsdriftsättningar** för pull requests +- **Snabba byggen** + +## Felsökning + +### Uppladdning av stora filer + +Cloudflare Pages stöder filer upp till 25 MB. WASM-moduler bör fungera bra, men om du når gränserna kan du överväga: + +```bash +# Split large files during build +npm run build +``` + +### Storleksgränser för Workers + +Om du använder Cloudflare Workers för avancerad routing, notera gränsen på 1 MB för gratisplaner. + +## CORS-proxy-Worker (för digitala signaturer) + +Verktyget för digitala signaturer kräver en CORS-proxy för att hämta certifikatkedjor. Driftsätt den medföljande workern: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Säkerhetsfunktioner + +| Funktion | Beskrivning | +| ---------------------------- | ------------------------------------------- | +| **URL-begränsningar** | Endast certifikat-URL:er tillåts | +| **Filstorleksgräns** | Max 10MB per förfrågan | +| **Hastighetsbegränsning** | 60 förfr./IP/min (kräver KV) | +| **Blockering av privata IP** | Blockerar localhost och interna IP-adresser | + +### Aktivera hastighetsbegränsning + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Bygg med proxy-URL + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Eller med Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Obs:** Se [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) för hur du ställer in HMAC-signaturer. diff --git a/docs/sv/self-hosting/cors-proxy.md b/docs/sv/self-hosting/cors-proxy.md new file mode 100644 index 00000000..5a5d22c3 --- /dev/null +++ b/docs/sv/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-proxy för hämtning av certifikat + +Verktyget för digitala signaturer använder en CORS-proxy för att hämta utfärdarcertifikat från externa certifikatutfärdare (CA). Det behövs eftersom många CA-servrar inte inkluderar CORS-rubriker i sina svar, vilket hindrar direkt hämtning från webbläsaren. + +Dessutom serverar många CA-servrar certifikat över vanlig HTTP. När din BentoPDF-instans hostas över HTTPS blockerar webbläsare dessa HTTP-förfrågningar (policy för blandat innehåll). CORS-proxyn löser båda problemen genom att dirigera förfrågningar via en HTTPS-ändpunkt med rätt rubriker. + +## Så fungerar det + +När du signerar en PDF med ett certifikat: + +1. Biblioteket `zgapdfsigner` försöker bygga en komplett certifikatkedja +2. Det hämtar utfärdarcertifikat från URL:er som finns i ditt certifikats AIA-tillägg (Authority Information Access) +3. Förfrågningarna dirigeras via en CORS-proxy som lägger till de nödvändiga `Access-Control-Allow-Origin`-rubrikerna +4. Proxyn returnerar certifikatdata till webbläsaren + +## Självhosta CORS-proxyn + +Om du självhostar BentoPDF måste du driftsätta din egen CORS-proxy för att digitala signaturer ska fungera med certifikat som kräver hämtning av kedjan. + +### Alternativ 1: Cloudflare Workers (rekommenderas) + +1. **Installera Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Logga in på Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Klona BentoPDF och uppdatera tillåtna ursprung**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Öppna `cors-proxy-worker.js` och ändra arrayen `ALLOWED_ORIGINS` till din domän: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Viktigt + Utan den här ändringen avvisar proxyn alla förfrågningar från din webbplats med felet **403 Forbidden**. Standardinställningen tillåter bara förfrågningar från `bentopdf.com`. + ::: + +4. **Driftsätt proxyn**: + + ```bash + wrangler deploy + ``` + + Anteckna din worker-URL (t.ex. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Bygg om BentoPDF med proxy-URL:en**: + + Om du använder Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Om du bygger från källkod: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Alternativ 2: Egen backend-proxy + +Du kan också skapa din egen proxy-ändpunkt. Kraven är: + +1. Ta emot GET-förfrågningar med en frågeparameter `url` +2. Hämta URL:en från din server (inga CORS-begränsningar på serversidan) +3. Returnera svaret med dessa rubriker: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Exempel på en implementation i Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Säkerhetsaspekter + +Den medföljande Cloudflare Worker har flera säkerhetsåtgärder: + +| Funktion | Beskrivning | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | +| **Ursprungsvalidering** | Tillåter bara förfrågningar från domäner i `ALLOWED_ORIGINS` | +| **URL-begränsningar** | Tillåter bara certifikat-URL:er (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Blockering av privata IP** | Blockerar privata IPv4/IPv6-intervall, link-local, loopback, decimala IP-adresser och moln-metadata | +| **Content-Type-säkerhet** | Returnerar bara säkra MIME-typer för certifikat och blockerar injektion av content-type från uppströms | +| **Filstorleksgräns** | Strömmar svaret med 10MB-gräns och avbryter nedladdningen om den överskrids | +| **Hastighetsbegränsning** | 60 förfrågningar per minut per IP eller IPv6 /64 (kräver KV, tillåter vid KV-fel) | +| **HMAC-signaturer** | Valfri signering på klientsidan (avskräcker enkelt missbruk) | + +### DNS rebinding (självhosting utanför Cloudflare) + +Workern avvisar alla URL:er som löser till en privat eller intern IP. Den kan inte använda en fast tillåtelselista med värdar, eftersom URL:erna i certifikatkedjor pekar på den CA som utfärdade certifikatet (FNMT, företags-CA:er och så vidare), så destinationerna är inte kända i förväg. Det lämnar ett litet rebinding-fönster: den som kör DNS för sin egen domän kan ge en publik IP till säkerhetskontrollen och en privat IP till den riktiga förfrågan ett ögonblick senare. + +På Cloudflare går detta inte att utnyttja: Workers kan inte nå privata IP-adresser eller metadata-ändpunkten `169.254.169.254`, så en rebind leder ingenstans. Ge bara inte workern en väg in: koppla inte på en Tunnel, Service eller privat nätverksbindning (den behöver bara `RATE_LIMIT_KV`). + +Om du kör detta utanför Cloudflare (workerd, Node och liknande) inuti ett VPC _kan_ körmiljön nå interna IP-adresser. Sätt en egress-brandvägg framför och blockera de privata intervallen: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` och deras IPv6-motsvarigheter. Appkod kan inte upprätthålla det när du inte längre är på Cloudflare. + +## Inaktivera proxyn + +Om du inte vill använda en CORS-proxy, sätt miljövariabeln till en tom sträng: + +``` +VITE_CORS_PROXY_URL= +``` + +**Obs**: Utan proxyn misslyckas signering med certifikat som kräver extern hämtning av kedjan (som FNMT eller vissa företags-CA:er) med felet "Failed to fetch". + +## Felsökning + +### "Signing error: TypeError: Failed to fetch" + +Det betyder oftast något av följande: + +1. **Ingen CORS-proxy konfigurerad**: ange `VITE_CORS_PROXY_URL` och bygg om +2. **Blandat innehåll blockerat**: din webbplats använder HTTPS men certifikatets utfärdar-URL använder HTTP. CORS-proxyn löser detta. +3. **CORS-proxyn avvisar ditt ursprung**: kontrollera att din domän finns i arrayen `ALLOWED_ORIGINS` i `cors-proxy-worker.js` + +### "403 Forbidden" från proxyn + +Din domän finns inte i listan `ALLOWED_ORIGINS`. Redigera `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Driftsätt sedan igen: `npx wrangler deploy` + +### Testa proxyn + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Certifikat som fungerar utan proxy + +Vissa certifikat innehåller hela kedjan i P12/PFX-filen och kräver ingen extern hämtning: + +- Självsignerade certifikat +- Vissa kommersiella CA:er som paketerar mellancertifikat +- Certifikat som du själv har satt ihop med hela kedjan diff --git a/docs/sv/self-hosting/docker.md b/docs/sv/self-hosting/docker.md new file mode 100644 index 00000000..94743816 --- /dev/null +++ b/docs/sv/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Driftsätt med Docker / Podman + +Det enklaste sättet att självhosta BentoPDF i en produktionsmiljö. + +> [!IMPORTANT] +> **Obligatoriska rubriker för konvertering av Office-filer** +> +> LibreOffice-baserade verktyg (konvertering av Word, Excel och PowerPoint) kräver dessa HTTP-rubriker för stöd för `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Sidan måste dessutom serveras från en säker kontext. `http://localhost` fungerar för lokal testning, men `http://192.168.x.x` och andra LAN-adresser kvalificerar sig oftast inte, så Office-konvertering över vanlig HTTP misslyckas även om rubrikerna finns. +> +> De officiella containerbilderna inkluderar dessa rubriker. Om du använder en reverse proxy (Traefik, Caddy m.fl.), se till att rubrikerna bevaras eller läggs till, och använd HTTPS för åtkomst som inte är loopback. + +> [!TIP] +> **Podman-användare:** Alla `docker`-kommandon fungerar med Podman om du ersätter `docker` med `podman` och `docker-compose` med `podman-compose`. + +## Snabbstart + +> [!TIP] +> BentoPDF levereras i två byggen: +> +> - **Self-Hosted-bygget**: `ghcr.io/alam00000/bentopdf-simple:latest`. Alla PDF-verktyg, **utan** marknadsföringsdelarna (ingen hero, FAQ, omdömen eller sidfot). Använd detta för interna driftsättningar i team och organisationer. Det är **inte** en "lite"-version med färre funktioner. +> - **Commercial-bygget**: `ghcr.io/alam00000/bentopdf:latest`. Hela marknadsföringssajten, som används av bentopdf.com själv och av innehavare av kommersiell licens som kör publika driftsättningar. +> +> Är du osäker: hämta Self-Hosted-bygget. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Skapa `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Kör: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Bygg din egen image + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Bygg och kör: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Miljövariabler + +| Variabel | Beskrivning | Standard | +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Bygg Self-Hosted-varianten (döljer marknadsföringsdelarna från bentopdf.com: hero, FAQ, omdömen, sidfot). Alla PDF-verktyg finns kvar. | `false` | +| `BASE_URL` | Driftsätt i en underkatalog | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL till PyMuPDF WASM-modulen | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL till Ghostscript WASM-modulen | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL till CoherentPDF WASM-modulen | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL till OCR-workerskriptet | _(tom; använd Tesseract.js standard-CDN)_ | +| `VITE_TESSERACT_CORE_URL` | Katalog för OCR-kärnkörmiljön | _(tom; använd Tesseract.js standard-CDN)_ | +| `VITE_TESSERACT_LANG_URL` | Katalog för OCR traineddata | _(tom; använd Tesseract.js standard-CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Kommaseparerade OCR-språk som visas i gränssnittet | _(tom; visa hela katalogen)_ | +| `VITE_OCR_FONT_BASE_URL` | Katalog för typsnitt till OCR-textlager | _(tom; använd externa Noto-typsnitts-URL:er)_ | +| `VITE_DEFAULT_LANGUAGE` | Standardspråk för gränssnittet | `en` | +| `VITE_BRAND_NAME` | Eget varumärkesnamn | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logotypens sökväg relativt `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Egen sidfots-/upphovsrättstext | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Kommaseparerade verktygs-ID:n som ska döljas | _(tom; alla verktyg aktiverade)_ | +| `DISABLE_GITHUB_STARS` | Hoppa över hämtningen av GitHub-stjärnor vid sidladdning och ta bort `api.github.com` från CSP. Simple Mode-byggen hoppar alltid över den. | `false` | +| `SITE_URL` | Publik URL som skrivs in i canonical-, hreflang- och sitemap-länkar. Behåll standardvärdet om du inte vill att sökmotorer ska behandla din driftsättning som en egen webbplats. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Med en egen `SITE_URL` markeras varje sida `noindex` så att din kopia inte konkurrerar med bentopdf.com i sökresultaten. Sätt till `true` för att låta sökmotorer indexera den. | `false` | + +WASM-modulernas URL:er är förkonfigurerade med CDN-standardvärden, så alla avancerade funktioner fungerar direkt. Åsidosätt dem för luftgappade eller självhostade driftsättningar. + +### Sökmotorer + +Som standard pekar varje sida sökmotorer till bentopdf.com som originalet, så att din driftsättning inte visas som en dubblett. Du behöver inte ändra något för en privat eller intern instans. + +- **Håll din instans helt borta från sökresultat:** kör containern med `-e ROBOTS_NOINDEX=true`. Det kräver bara en omstart, inte ett nytt bygge. +- **Gör din instans till en egen webbplats i sökresultaten:** bygg med `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Utan `ALLOW_INDEXING=true` markerar en egen `SITE_URL` varje sida `noindex`. + +### Content-Security-Policy + +Nginx-imagen levereras med en tillämpad `Content-Security-Policy`-rubrik. CSP:ns direktiv `script-src`, `connect-src` och `font-src` **genereras vid bygget** från URL-variablerna `VITE_*` ovan: alla värdar du anger via `--build-arg` läggs automatiskt till i policyn. + +Det innebär att: + +- Om du åsidosätter `VITE_CORS_PROXY_URL` eller `VITE_WASM_*_URL` vid bygget tillåter CSP dessa ursprung automatiskt, ingen extra konfiguration behövs. +- För URL:er på `cdn.jsdelivr.net` tillåter `script-src` bara den exakta versionerade paketmappen, till exempel `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, inte hela CDN:et. jsDelivr serverar alla publika npm-paket och GitHub-repositorier, så om hela värden tilläts kunde vilket som helst av dem köras på din instans. URL:er på andra värdar tillåts per ursprung. +- Om du konfigurerar egna WASM-URL:er vid _körning_ via sidan Avancerade inställningar i appen finns dessa ursprung **inte** i CSP och webbläsaren blockerar hämtningar från dem. Detta gäller även en annan version av samma paket på `cdn.jsdelivr.net`, eftersom bara den version som angavs vid bygget tillåts. Konfiguration vid körning är avsedd för experiment; för permanenta egna URL:er, ange motsvarande `VITE_*` build arg. +- Luftgappade driftsättningar som åsidosätter alla tre `VITE_WASM_*_URL`-värden får även dessa paketmappar på `cdn.jsdelivr.net` borttagna från CSP (varje standardvärde ersätts, läggs inte till). Tesseract OCR-standardvärdena på `cdn.jsdelivr.net` finns kvar i policyn tills du även anger de tre `VITE_TESSERACT_*`-värdena. På samma sätt ersätter `VITE_CORS_PROXY_URL` den publika standardadressen `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP innehåller `'unsafe-eval'` i `script-src` eftersom LibreOffice WASM-körmiljön (som används av verktygen för konvertering av Word/Excel/PowerPoint) och bildbiblioteket wasm-vips (som används av PDF till TIFF) kompilerar intern dispatch-kod via `new Function()`. Att ta bort det skulle bryta dessa verktyg. Om du bygger i `SIMPLE_MODE` (utan LibreOffice) och inte behöver PDF till TIFF kan du manuellt redigera den genererade `security-headers.conf` och ta bort `'unsafe-eval'` för en striktare policy. + +För OCR, lämna variablerna `VITE_TESSERACT_*` tomma för att använda de förvalda onlineresurserna, eller ange alla tre tillsammans för självhostad/offline-OCR. Partiella OCR-åsidosättningar avvisas eftersom workern, kärnkörmiljön och traineddata-katalogen måste matcha varandra. För sökbara PDF-filer helt offline, ange även `VITE_OCR_FONT_BASE_URL` så att OCR-textlagrets typsnitt laddas från din interna server i stället för de publika Noto-typsnitts-URL:erna. + +`VITE_DEFAULT_LANGUAGE` anger gränssnittsspråk för förstagångsbesökare. Värden som stöds: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Användare kan fortfarande byta språk, det är bara standardvärdet som ändras. + +Exempel: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Eget varumärke + +Ersätt standardlogotypen, namnet och sidfotstexten för BentoPDF med dina egna. Lägg din logotypfil i mappen `public/` (eller använd en befintlig bild) och ange sedan varumärkesvariablerna vid bygget: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Varumärkesanpassning fungerar i både fullt läge och Simple Mode och kan kombineras med alla andra alternativ vid bygget. + +### Inaktivera specifika verktyg + +Dölj verktyg i gränssnittet av efterlevnads- eller säkerhetsskäl. Inaktiverade verktyg tas bort från startsidan, sökresultat, kortkommandon och arbetsflödesbyggaren. Direkt åtkomst via URL visar en sida om att verktyget inte är tillgängligt. + +Verktygs-ID:n är sidans URL utan `.html`. Om verktyget till exempel finns på `bentopdf.com/edit-pdf.html` är ID:t `edit-pdf`. + +#### Hitta verktygs-ID:n + +Det enklaste sättet: öppna ett verktyg i BentoPDF och titta på URL:en. Sista delen av sökvägen (utan `.html`) är verktygets ID. + +
+Fullständig lista över verktygs-ID:n + +**Redigera och kommentera:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Konvertera till PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Konvertera från PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Organisera och hantera:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimera och reparera:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Säkerhet:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Alternativ 1: Vid bygget (Docker build arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Detta bakar in listan över inaktiverade verktyg i JavaScript-paketet. Ändringar kräver ett nytt bygge. + +#### Alternativ 2: Vid körning (config.json) + +Montera en `config.json`-fil i den serverade katalogen, inget nytt bygge behövs: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Eller med Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Båda metoderna kan kombineras, listorna slås ihop. Om ett verktyg finns i någon av dem inaktiveras det. + +#### Inaktivera redigeringsfunktioner + +Du kan också inaktivera specifika funktioner i PDF-redigeraren (t.ex. maskering, kommentarer, formulär) utan att inaktivera hela redigeringsverktyget. Lägg till `editorDisabledCategories` i din `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Fullständig lista över redigerarkategorier + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Kommentarer:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Former:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Formulär:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Maskering:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Dokument:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Sida:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Verktyg:** `tools`, `pan`, `pointer`, `capture` + +**Markering:** `selection`, `selection-copy` + +**Historik:** `history`, `history-undo`, `history-redo` + +
+ +Kategorierna är hierarkiska: om du inaktiverar en överordnad kategori (t.ex. `annotation`) inaktiveras alla underordnade. + +### Inaktivera GitHub-stjärnräknaren + +Navigeringsfältet visar ett live-antal GitHub-stjärnor som hämtas från `api.github.com` vid sidladdning. Det är den enda externa förfrågan som inte tjänar en PDF-funktion. Inaktivera den vid bygget för att ta bort hämtningskoden från paketet och ta bort `api.github.com` från Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Mode-byggen (`bentopdf-simple`) hoppar alltid över stjärnräknaren, flaggan behövs bara för Commercial-bygget eller egna fullständiga byggen. + +### Egna WASM-URL:er (luftgappat / självhostat) + +> [!IMPORTANT] +> WASM-URL:erna bakas in i JavaScript vid **bygget**. WASM-filerna laddas ned av **användarens webbläsare** vid körning, Docker laddar inte ned dem under bygget. För luftgappade nätverk måste du hosta WASM-filerna på en intern server som webbläsare kan nå. + +**Fullständigt arbetsflöde för luftgappade miljöer:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Använd koderna som skrivs ut av `bash scripts/prepare-airgap.sh --list-ocr-languages`, eller sök på namn med `bash scripts/prepare-airgap.sh --search-ocr-language `, för `--ocr-languages`. När du bygger med en begränsad uppsättning OCR-språk, ange samma koder till `VITE_TESSERACT_AVAILABLE_LANGUAGES` så att appen bara visar medföljande språk. För fullständig OCR offline, hosta även den medföljande katalogen `ocr-fonts/` och peka `VITE_OCR_FONT_BASE_URL` mot den. + +Sätt en variabel till en tom sträng för att inaktivera den modulen (användare måste då konfigurera manuellt via Avancerade inställningar). + +## Egen port + +Som standard lyssnar BentoPDF på port `8080` i containern. För att ändra detta, ange miljövariabeln `PORT` vid körning: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Variabel | Beskrivning | Standard | +| -------- | -------------------------------- | -------- | +| `PORT` | Nginx lyssningsport i containern | `8080` | + +Detta fungerar med både standard-Dockerfile och nonroot-Dockerfile. + +## Eget användar-ID (PUID/PGID) + +För miljöer som kräver att köra som en specifik icke-root-användare (NAS-enheter, Kubernetes med säkerhetskontexter, organisationspolicyer) tillhandahåller BentoPDF en separat Dockerfile med PUID/PGID-stöd i LSIO-stil. + +### Bygg och kör + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Miljövariabler + +| Variabel | Beskrivning | Standard | +| -------------- | ------------------------ | -------- | +| `PUID` | Användar-ID att köra som | `1000` | +| `PGID` | Grupp-ID att köra som | `1000` | +| `PORT` | Nginx lyssningsport | `8080` | +| `DISABLE_IPV6` | Inaktivera IPv6-lyssnare | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Så fungerar det + +Containern startar som root, skapar en användare med angivet PUID/PGID, justerar ägarskapet för alla skrivbara kataloger och släpper sedan behörigheter med `su-exec`. Nginx-processen körs helt som din angivna användare. + +> [!NOTE] +> Standard-`Dockerfile` använder `nginx-unprivileged` (UID 101) och rekommenderas för de flesta driftsättningar. Använd `Dockerfile.nonroot` bara när du behöver ett specifikt UID/GID. + +> [!WARNING] +> PUID/PGID kan inte vara `0` (root). Entrypoint validerar indata och avslutas med ett fel vid ogiltiga värden. + +## Med Traefik (reverse proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Med Caddy (reverse proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Resursgränser + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (Systemd-integration) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) låter dig köra Podman-containrar som systemd-tjänster. Det är idealiskt för produktionsdriftsättningar på Linux-system. + +### Grundläggande Quadlet-uppsättning + +Skapa en container unit-fil i `~/.config/containers/systemd/bentopdf.container` (användare) eller `/etc/containers/systemd/bentopdf.container` (system): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Aktivera och starta + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> För driftsättning på systemnivå, använd `systemctl` utan flaggan `--user` och placera filen i `/etc/containers/systemd/`. + +### Quadlet med hälsokontroll + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Automatisk uppdatering med Quadlet + +Podman kan uppdatera containrar automatiskt när nya images finns: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Nätverkskonfiguration för Quadlet + +För egen nätverkskonfiguration, skapa en nätverksfil `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Referera sedan till den i din containerfil: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Uppdatera + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/sv/self-hosting/hostinger.md b/docs/sv/self-hosting/hostinger.md new file mode 100644 index 00000000..068117c7 --- /dev/null +++ b/docs/sv/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Driftsätt på Hostinger + +[Hostinger](https://hostinger.com) är en populär leverantör av delad hosting. Den här guiden beskriver hur du driftsätter BentoPDF på Hostingers delade hosting. + +## Förutsättningar + +- Ett Hostinger-hostingpaket med åtkomst till filhanteraren +- Node.js installerat lokalt för bygget + +## Steg 1: Bygg projektet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +De byggda filerna hamnar i mappen `dist`. + +## Steg 2: Ladda upp till Hostinger + +### Driftsättning på rotdomänen + +1. Logga in på ditt Hostinger-konto +2. Gå till **File Manager** → **public_html** +3. **Ta bort** befintliga filer (gör en säkerhetskopia vid behov) +4. **Ladda upp** hela innehållet i din lokala `dist`-mapp till `public_html` + +### Driftsättning i en underkatalog + +Om du driftsätter i en underkatalog (t.ex. `yourdomain.com/pdf-tools/`): + +1. Bygg med rätt bas-URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Skapa mappen i Hostinger: + - Gå till **File Manager** → **public_html** + - Skapa en ny mapp: `pdf-tools` +3. Ladda upp hela innehållet i `dist` till `public_html/pdf-tools/` + +## Steg 3: Skapa .htaccess-filen + +Skapa en `.htaccess`-fil i roten av din driftsättningsmapp (`public_html` eller `public_html/pdf-tools/`): + +::: warning Viktigt +Vid driftsättning i en underkatalog, ändra `RewriteBase /` till `RewriteBase /pdf-tools/` (eller ditt mappnamn). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Exempel på .htaccess för underkatalog + +För `yourdomain.com/pdf-tools/`, uppdatera dessa rader: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Felsökning + +### WASM-filer laddas inte + +Kontrollera att MIME-typerna är rätt angivna i `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice-verktyg fungerar inte + +Säkerhetsrubrikerna är avgörande för SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Om rubrikerna inte tillämpas, kontakta Hostingers support för att aktivera `mod_headers`. + +### 404-fel vid omladdning av sidan + +Kontrollera att regeln för filändelsen `.html` och språkrouterna är rätt konfigurerade. BentoPDF använder statiska HTML-filer, inte SPA-routing: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Gränser för filuppladdning + +Hostinger kan ha gränser för filstorlek. Ladda upp WASM-filerna separat om massuppladdning misslyckas. diff --git a/docs/sv/self-hosting/index.md b/docs/sv/self-hosting/index.md new file mode 100644 index 00000000..2b08f500 --- /dev/null +++ b/docs/sv/self-hosting/index.md @@ -0,0 +1,538 @@ +# Guide för självhosting + +BentoPDF kan självhostas på din egen infrastruktur. Den här guiden går igenom olika distributionsalternativ. + +## Snabbstart med Docker / Podman + +Det snabbaste sättet att självhosta BentoPDF: + +> [!TIP] +> BentoPDF levereras i två byggen: +> +> - **Självhostat bygge**: `ghcr.io/alam00000/bentopdf-simple:latest`. Alla PDF-verktyg, **utan** marknadsföringsdelarna (ingen hero, FAQ, omdömen eller sidfot). Använd detta för interna distributioner i team och organisationer. Det är **inte** en funktionsbegränsad "lite"-version. +> - **Kommersiellt bygge**: `ghcr.io/alam00000/bentopdf:latest`. Hela marknadsföringswebbplatsen, som används av bentopdf.com själv och av innehavare av kommersiell licens med publika distributioner. +> +> Om du är osäker: hämta det självhostade bygget. + +> [!IMPORTANT] +> Konvertering av Office-filer kräver `SharedArrayBuffer`, vilket innebär att appen måste vara både cross-origin-isolerad och levereras från en säker kontext. Den officiella avbildningen skickar redan de nödvändiga COOP/COEP-huvudena, men webbläsare inaktiverar ändå `SharedArrayBuffer` på vanliga HTTP-ursprung i lokala nätverk, som `http://192.168.x.x`. +> +> Använd `http://localhost` bara för tester på samma enhet. Om användare når BentoPDF via en LAN-IP eller ett värdnamn ska du avsluta anslutningen med HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Eller med Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Kör BentoPDF som en systemd-tjänst. Skapa `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Se [Docker-distributionsguiden](/sv/self-hosting/docker) för fullständig dokumentation om Quadlet. + +## Bygga från källkod + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Konfigurationsalternativ + +### Självhostat bygge (Simple Mode) + +Det självhostade bygget (avbildningen `bentopdf-simple`, även kallat Simple Mode) är **funktionellt identiskt** med det kommersiella bygget: alla PDF-verktyg finns med och beter sig likadant. Det döljer bara marknadsföringsdelarna som bara är rimliga på bentopdf.com självt eller i en kommersiell publik distribution. **Det är inte en funktionsbegränsad eller "lite"-version.** + +**Vad det självhostade bygget döljer** (enbart kosmetiskt, inga PDF-funktioner tas bort): + +- Navigeringsfält, hero-sektion, funktionssektion, FAQ, omdömen, sidfot +- Uppdaterar sidtiteln till "PDF-verktyg" + +**Vad det självhostade bygget behåller** (allt som faktiskt hanterar PDF-arbete): + +- Alla PDF-verktyg (slå ihop, dela, redigera, signera, OCR, Office-konvertering m.m.) +- Stöd för eget varumärke, all konfiguration vid bygge och körning + +Det kommersiella bygget (`ghcr.io/alam00000/bentopdf:latest`) driver bentopdf.com självt och används av innehavare av kommersiell licens med publika distributioner. Det lägger till hero, FAQ, omdömen och sidfot, som inte vore rimliga i ett internt verktyg. + +Om du självhostar BentoPDF för ditt team, din organisation eller som ett internt verktyg hämtar du det självhostade bygget: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Se [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) för fullständig information. + +### Kommersiellt bygge (publika distributioner med eget varumärke) + +Det kommersiella bygget (avbildningen `bentopdf`, utan suffixet `-simple`) driver bentopdf.com självt. Det innehåller hela marknadsföringswebbplatsen (hero, funktioner, FAQ, omdömen, sidfot) ovanpå alla PDF-verktyg. Använd det här bygget när du vill **distribuera BentoPDF som en publik PDF-tjänst under ditt eget varumärke**, till exempel: + +- Du kör BentoPDF som en hostad SaaS för slutanvändare på din egen domän +- Du vill ha upplevelsen med målsida (marknadsföringssektioner + verktyg), inte bara själva verktygsytan +- Du är innehavare av kommersiell licens och bäddar in BentoPDF i en kommersiell produkt + +**Kör det som det är** (med BentoPDF-varumärke, användbart för att förhandsgranska bygget): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Bygg med ditt eget varumärke** (det typiska kommersiella arbetsflödet): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Alla andra alternativ vid bygget (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, åsidosättning av WASM-URL:er m.m.) fungerar på samma sätt som i det självhostade bygget. + +::: warning Licensiering +Det är tillåtet att köra det kommersiella bygget under något av BentoPDF:s två licensalternativ: + +- **AGPL-3.0** (gratis): tillåtet om din distribution publicerar hela sin källkod under AGPL, inklusive varumärkesändringar och omgivande affärslogik. +- **Kommersiell licens** (79 USD engångsavgift): krävs för distributioner med sluten källkod eller proprietära distributioner där du inte öppnar källkoden för din varumärkesfork eller affärskod. + +Se [licenssidan](https://www.bentopdf.com/licensing) för en fullständig jämförelse. AGPL-licensierade WASM-moduler (PyMuPDF, Ghostscript, CoherentPDF) laddas från ett CDN vid körning, så de hamnar inte i din avbildning och påverkar inte din licenssituation. +::: + +### Bas-URL + +Distribuera till en underkatalog: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Eget varumärke + +Ersätt BentoPDF:s standardlogotyp, namn och sidfotstext med dina egna vid bygget: + +| Variabel | Beskrivning | Standard | +| ------------------ | ---------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Varumärkesnamn som visas i sidhuvud och sidfot | `BentoPDF` | +| `VITE_BRAND_LOGO` | Logotypsökväg relativt `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Egen sidfots-/upphovsrättstext | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Eller via Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Varumärkesanpassning fungerar i både fullt läge och Simple Mode och kan kombineras med alla andra alternativ vid bygget (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Inaktivera specifika verktyg + +Dölj enskilda verktyg av efterlevnads- eller säkerhetsskäl. Inaktiverade verktyg tas bort från startsidan, sökningen, genvägarna, arbetsflödesbyggaren och direkt URL-åtkomst. + +Verktygs-ID:n är sidans URL utan `.html`: öppna ett verktyg och titta på URL:en (t.ex. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Vid bygget** (inbakat i paketet): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Vid körning** (ingen ombyggnad behövs, montera en `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Båda metoderna kan kombineras: listorna slås ihop. + +Du kan också inaktivera specifika funktioner i PDF-redigeraren (t.ex. maskering) utan att inaktivera hela verktyget genom att lägga till `editorDisabledCategories` i `config.json`. Se [Docker-guiden](/sv/self-hosting/docker#inaktivera-redigeringsfunktioner) för en fullständig lista över kategorier. + +## Distributionsguider + +Välj din plattform: + +- [Vercel](/sv/self-hosting/vercel) +- [Netlify](/sv/self-hosting/netlify) +- [Cloudflare Pages](/sv/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/sv/self-hosting/aws) +- [Hostinger](/sv/self-hosting/hostinger) +- [Nginx](/sv/self-hosting/nginx) +- [Apache](/sv/self-hosting/apache) +- [Docker](/sv/self-hosting/docker) +- [Kubernetes](/sv/self-hosting/kubernetes) +- [CORS-proxy](/sv/self-hosting/cors-proxy) - Krävs för digitala signaturer + +## Vanliga problem + +### Word / ODT / Excel / PowerPoint till PDF hänger sig (SharedArrayBuffer otillgängligt) + +**Symptom**: LibreOffice-baserade dokumentkonverteringar (Word, ODT, Excel, PowerPoint till PDF) hänger sig vid ca 55 % eller startar inte. Webbläsarkonsolen kan visa: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…eller så rapporterar `window.crossOriginIsolated` `false`, eller så rapporterar WASM-kompileringen `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Orsak**: LibreOffice WASM kräver `SharedArrayBuffer`, som webbläsaren bara aktiverar när sidan är **cross-origin-isolerad** OCH levereras från en **säker kontext**. Det innebär att två saker måste stämma: + +1. Varje svar innehåller båda huvudena: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Sidan levereras från `https://...` eller `http://localhost`. Vanlig HTTP på en LAN-IP (t.ex. `http://192.168.x.x`) räknas INTE som säker: webbläsare inaktiverar `SharedArrayBuffer` där. + +Skillnaden mellan `00 61 73 6d` och `1f 8b 08 08` är ett separat delsymptom: de förkomprimerade filerna `.wasm.gz` / `.data.gz` saknar svarshuvudet `Content-Encoding: gzip`, så webbläsaren får rå gzip-data i stället för uppackad WASM. + +**Lösning**: se din plattformsspecifika distributionsguide för exakt konfiguration: + +- [Nginx →](/sv/self-hosting/nginx#signera-pdf-eller-formularifyllare-visar-en-tom-lasare-mime-fel-for-mjs) +- [Apache →](/sv/self-hosting/apache#signera-pdf-eller-formularifyllare-visar-en-tom-visare-mjs-mime-fel) +- [AWS S3 + CloudFront →](/sv/self-hosting/aws#steg-3b-response-headers-policy-kravs-for-libreoffice-wasm) +- [Cloudflare Pages →](/sv/self-hosting/cloudflare#konfigurationsfil) (filen `_headers`) +- [Netlify →](/sv/self-hosting/netlify#word-odt-excel-till-pdf-fastnar-pa-55) (`netlify.toml`) +- [Vercel →](/sv/self-hosting/vercel#word-odt-excel-till-pdf-fungerar-inte) (`vercel.json`) +- [Hostinger →](/sv/self-hosting/hostinger#libreoffice-verktyg-fungerar-inte) (`.htaccess`) +- [Kubernetes →](/sv/self-hosting/kubernetes#mime-typfel-for-mjs-tom-iframe-i-signera-pdf-formularifyllare) +- **Docker**: hanteras automatiskt av den medföljande nginx-konfigurationen, ingen åtgärd behövs. + +**Verifiera**: öppna DevTools Console på valfri BentoPDF-sida och kör: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Om sidan levereras via HTTPS eller `http://localhost` OCH båda COEP/COOP-huvudena finns på varje svar klarar båda kontrollerna. Om du använder `http://192.168.x.x` eller ett annat HTTP-ursprung som inte är loopback avslutar du anslutningen med HTTPS: det finns ingen lösning enbart med huvuden. + +### `.mjs`-filer levereras som `application/octet-stream` + +**Symptom**: Signera PDF / Formulärifyllare / vissa andra verktyg visar en tom läsare eller laddas inte. Webbläsarkonsolen rapporterar: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Orsak**: Din webbserver eller omvända proxy saknar en MIME-typsmappning för `.mjs`-filer (den medföljande PDF-läsaren levereras med ES-moduler med den filändelsen). Många standardkonfigurationer av servrar använder `application/octet-stream` för okända filändelser, och webbläsare vägrar köra sådana som ES-moduler. + +**Lösning**: se din plattformsspecifika distributionsguide för exakt kodsnutt: + +- [Nginx →](/sv/self-hosting/nginx#signera-pdf-eller-formularifyllare-visar-en-tom-lasare-mime-fel-for-mjs) +- [Apache →](/sv/self-hosting/apache#signera-pdf-eller-formularifyllare-visar-en-tom-visare-mjs-mime-fel) +- [AWS S3 + CloudFront →](/sv/self-hosting/aws#steg-2-bygg-och-ladda-upp) (se `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/sv/self-hosting/kubernetes#mime-typfel-for-mjs-tom-iframe-i-signera-pdf-formularifyllare) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: hanteras automatiskt, ingen åtgärd behövs. + +**Verifiera**: öppna DevTools → fliken Network, hitta den misslyckade `.mjs`-begäran och kontrollera svarshuvudet `Content-Type`. Det ska vara `application/javascript`. Om det fortfarande är `application/octet-stream` kan en yttre omvänd proxy eller ett CDN avläsa typen på nytt: kontrollera varje lager i din leveranskedja. + +## WASM-konfiguration (AGPL-komponenter) + +BentoPDF **bundlar inte** AGPL-licensierade bearbetningsbibliotek i sin källkod, men **förkonfigurerar CDN-URL:er** så att alla funktioner fungerar direkt, utan manuell konfiguration. + +::: tip Nollkonfiguration som standard +Från och med v2.0.0 är WASM-modulerna förkonfigurerade att laddas från jsDelivr CDN via miljövariabler. Alla avancerade funktioner fungerar direkt utan någon konfiguration från användaren. +::: + +| Komponent | Licens | Funktioner | +| --------------- | -------- | --------------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS-konvertering, bildextrahering, tabellextrahering | +| **Ghostscript** | AGPL-3.0 | PDF/A-konvertering, komprimering, rakning av snedskanning, rastrering | +| **CoherentPDF** | AGPL-3.0 | Innehållsförteckning, bilagor, PDF-sammanslagning med bokmärken | + +### Standardmiljövariabler + +Dessa är satta i `.env.production` och inbakade i bygget: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Åsidosätta WASM-URL:er + +Du kan åsidosätta standardvärdena vid bygget för anpassade distributioner: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +För att inaktivera en modul helt (kräver manuell konfiguration av användaren i Avancerade inställningar) sätter du dess variabel till en tom sträng. + +För OCR låter du antingen alla `VITE_TESSERACT_*`-variabler vara tomma och behåller de förvalda onlinetillgångarna, eller sätter URL:erna för worker, core och språkdata tillsammans för självhostad/offline OCR. Om du bara bundlar specifika OCR-språk sätter du också `VITE_TESSERACT_AVAILABLE_LANGUAGES` till samma kommaseparerade koder så att gränssnittet bara erbjuder installerade språk och ej stödda val ger ett beskrivande fel. För helt offline sökbar PDF-utdata sätter du också `VITE_OCR_FONT_BASE_URL` till den interna katalog som levererar de medföljande OCR-teckensnitten. + +Användare kan också när som helst åsidosätta dessa standardvärden via **Avancerade inställningar** i gränssnittet: användarens åsidosättningar som lagras i webbläsaren har företräde framför miljövärdena. + +### Distribution utan internet (air-gapped / offline) + +För nätverk utan internetåtkomst (myndigheter, sjukvård, finans m.fl.). WASM-URL:erna bakas in i JavaScript vid **bygget**: själva WASM-filerna laddas ner av **användarens webbläsare** vid körning. Du behöver därför förbereda allt på en dator med internet och sedan överföra det till det isolerade nätverket. + +#### Automatiskt skript (rekommenderas) + +Det medföljande skriptet `prepare-airgap.sh` automatiserar hela processen: det laddar ner WASM-paketen, bygger Docker-avbildningen och skapar ett fristående paket med ett installationsskript. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Detta skapar en paketkatalog: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Överför paketet till det isolerade nätverket via USB, internt artefaktarkiv eller någon godkänd metod. Kör sedan det medföljande installationsskriptet: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Installationsskriptet läser in Docker-avbildningen, packar upp WASM-filerna och startar på begäran containern. + +**Skriptalternativ:** + +| Flagga | Beskrivning | Standard | +| ------------------------------ | ---------------------------------------------------------------- | ------------------------------------------- | +| `--wasm-base-url ` | Var WASM-filerna hostas internt | _(obligatorisk, efterfrågas om den saknas)_ | +| `--image-name ` | Docker-avbildningens tagg | `bentopdf` | +| `--output-dir ` | Utdatakatalog för paketet | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Aktivera Simple Mode | av | +| `--base-url ` | Bas-URL för underkatalog (t.ex. `/pdf/`) | `/` | +| `--language ` | Standardspråk för gränssnittet (t.ex. `fr`, `de`) | _(ingen)_ | +| `--brand-name ` | Eget varumärkesnamn | _(ingen)_ | +| `--brand-logo ` | Logotypsökväg relativt `public/` | _(ingen)_ | +| `--footer-text ` | Egen sidfotstext | _(ingen)_ | +| `--ocr-languages ` | Kommaseparerade OCR-språk att bundla | `eng` | +| `--list-ocr-languages` | Skriv ut stödda OCR-koder och namn, avsluta sedan | av | +| `--search-ocr-language ` | Sök OCR-koder efter namn eller förkortning | av | +| `--dockerfile ` | Dockerfile som ska användas | `Dockerfile` | +| `--skip-docker` | Hoppa över Docker-bygge och export | av | +| `--skip-wasm` | Hoppa över WASM-nedladdning (återanvänd befintliga `.tgz`-filer) | av | + +Den interaktiva prompten accepterar också `list` för att skriva ut hela listan över stödda Tesseract-koder och `search ` för att hitta träffar som `search german` eller `search chi`. + +::: warning Krav på samma ursprung +WASM-filer måste levereras från **samma ursprung** som BentoPDF-appen. Web Workers använder `importScripts()`, som inte kan ladda skript mellan olika ursprung. Om BentoPDF till exempel körs på `https://internal.example.com` bör WASM-bas-URL:en också vara `https://internal.example.com/wasm`. +::: + +#### Manuella steg + +
+Om du föredrar att göra det manuellt utan skriptet + +**Steg 1: Ladda ner WASM- och OCR-paketen** (på en dator med internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Steg 2: Bygg Docker-avbildningen med interna URL:er** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Steg 3: Exportera Docker-avbildningen** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Steg 4: Överför till det isolerade nätverket** + +Kopiera via USB, internt artefaktarkiv eller annan godkänd överföringsmetod: + +- `bentopdf.tar`: Docker-avbildningen +- De fem `.tgz`-paketen för WASM/OCR från steg 1 +- Katalogen `tesseract-langdata/` från steg 1 +- Katalogen `ocr-fonts/` från steg 1 + +**Steg 5: Konfigurera inne i det isolerade nätverket** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Se till att filerna är åtkomliga på de URL:er som du konfigurerade i steg 2, inklusive `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` och `.../ocr/fonts`. + +
+ +::: info Bygger du från källkod i stället för Docker? +Sätt variablerna i `.env.production` innan du kör `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Hosta din egen WASM-proxy + +Om du behöver leverera AGPL-WASM-filer med rätt CORS-huvuden kan du distribuera en enkel proxy. Se [guiden för Cloudflare WASM-proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) för ett exempel på implementation. + +::: tip Varför separat? +Denna separation säkerställer: + +- Tydlig laglig efterlevnad för kommersiella användare +- BentoPDF:s kärna förblir under sin dubbla licens (AGPL-3.0 / kommersiell) +- WASM-filer laddas vid körning och bundlas inte i källkoden + ::: + +## Systemkrav + +| Krav | Minimum | +| ------- | --------------------------------- | +| Lagring | ~100 MB (kärna utan AGPL-moduler) | +| RAM | 512 MB | +| CPU | Valfri modern processor | + +::: tip +BentoPDF är en statisk webbplats, så ingen databas eller backend-server behövs! +::: diff --git a/docs/sv/self-hosting/kubernetes.md b/docs/sv/self-hosting/kubernetes.md new file mode 100644 index 00000000..d9756a23 --- /dev/null +++ b/docs/sv/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Distribuera med Kubernetes + +Kubernetes kan vara överdrivet för en statisk webbplats, men det kan passa utmärkt om du redan standardiserar på Helm + GitOps. + +> [!IMPORTANT] +> **Obligatoriska huvuden för konvertering av Office-filer** +> +> LibreOffice-baserade verktyg (konvertering av Word, Excel, PowerPoint) kräver dessa HTTP-huvuden för stöd för `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> De officiella nginx-avbildningarna för BentoPDF innehåller dessa huvuden. I Kubernetes är **Ingress-/Gateway-kontrollerare också omvända proxyservrar**, så se till att huvudena bevaras (eller lägg till dem vid kanten). + +## Förutsättningar + +- Kubernetes-kluster +- Helm v3 +- En nginx-avbildning för BentoPDF (t.ex. `ghcr.io/alam00000/bentopdf:`) som levererar på **port 8080** + +## Distribuera med Helm + +### Installera från det här repositoryt (lokalt chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Installera från GHCR (OCI-chart) + +Om chartet är publicerat på GHCR som en OCI-artefakt: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Exponera tjänsten + +### Port-forward (snabbtest) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (valfritt) + +Aktivera Ingress (exempel för nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (valfritt) + +Det här chartet stöder Gateway API `Gateway` + `HTTPRoute`. + +Exempel (Cloudflare Gateway API operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Se till att SharedArrayBuffer-huvudena fortfarande fungerar (Ingress/Gateway) + +### Vad som "borde" hända + +BentoPDF:s nginx-konfiguration sätter de nödvändiga svarshuvudena. De flesta Ingress-/Gateway-kontrollerare **skickar vidare uppströmssvarens huvuden oförändrade**. + +### Vad som kan gå sönder + +- En kontrollerare eller kantpolicy som **skriver över** eller **tar bort** svarshuvuden +- Ett mellanlager för "säkerhetshuvuden" som sätter andra COOP/COEP-värden + +### Så verifierar du + +Kör detta mot din publika slutpunkt: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Du bör se: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Om din Ingress-kontrollerare inte bevarar dem + +Lägg till huvudena vid kanten (kontrollerarspecifikt). Exempel för **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## MIME-typfel för `.mjs` (tom iframe i Signera PDF / Formulärifyllare) + +Om webbläsarkonsolen visar `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` för en `.mjs`-begäran ersätter en Ingress-/Gateway-kontrollerare framför BentoPDF:s nginx huvudet `Content-Type` från uppströmsservern med `application/octet-stream`. + +Nginx i BentoPDF-avbildningen levererar redan `.mjs` som `application/javascript`. Lösningen är att hindra kontrollern från att ta bort eller ersätta det. För nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Eller använd ett `ResponseHeaderModifier`-filter i Gateway API för att sätta `Content-Type: application/javascript` för `.mjs`-sökvägar. Verifiera med DevTools → fliken Network: den misslyckade `.mjs`-begäran ska nu visa `content-type: application/javascript`. + +### Om du använder Gateway API och vill tvinga fram huvuden + +Gateway API stöder ett `ResponseHeaderModifier`-filter. Du kan koppla det i `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Stödet för specifika filter beror på din Gateway-kontrollerare. Om ett filter ignoreras lägger du till huvudena i kant- eller kontrollerarlagret i stället. + +## Inaktivera specifika verktyg + +Använd en ConfigMap för att inaktivera verktyg vid körning utan att bygga om avbildningen: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Montera den i den levererade mappen: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Verktygs-ID:n är sidans URL utan `.html`: öppna ett verktyg och titta på URL:en (t.ex. `edit-pdf`, `merge-pdf`, `compress-pdf`). Inaktiverade verktyg döljs från startsidan, sökningen, genvägarna, arbetsflödesbyggaren och direkt URL-åtkomst. Se [Docker-guiden](/sv/self-hosting/docker#inaktivera-specifika-verktyg) för en fullständig lista över alternativ. diff --git a/docs/sv/self-hosting/netlify.md b/docs/sv/self-hosting/netlify.md new file mode 100644 index 00000000..1dc19cbc --- /dev/null +++ b/docs/sv/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Distribuera till Netlify + +[Netlify](https://netlify.com) erbjuder utmärkt hosting av statiska webbplatser med en generös gratisnivå. + +## Distribuera med ett klick + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Manuell distribution + +### Steg 1: Anslut repositoryt + +1. Logga in på [Netlify](https://app.netlify.com) +2. Klicka på "Add new site" → "Import an existing project" +3. Anslut ditt GitHub-konto +4. Välj din BentoPDF-fork + +### Steg 2: Konfigurera bygginställningar + +| Inställning | Värde | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Steg 3: Distribuera + +Klicka på "Deploy site" och vänta tills bygget är klart. + +## Konfigurationsfil + +Skapa `netlify.toml` i projektets rotmapp: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Viktigt +Huvudena `Cross-Origin-Embedder-Policy` och `Cross-Origin-Opener-Policy` krävs för konvertering av Word/ODT/Excel/PowerPoint till PDF. Utan dem är `SharedArrayBuffer` otillgängligt och LibreOffice WASM-motorn kan inte initieras. + +Huvudena `Content-Encoding: gzip` på filerna `.wasm.gz` och `.data.gz` får webbläsaren att packa upp dem automatiskt. Utan dem får webbläsaren rå gzip-data och WASM-kompileringen misslyckas. +::: + +## Miljövariabler + +Ange dessa under Site settings → Environment variables: + +| Variabel | Beskrivning | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Sätt till `true` för ett minimalt bygge | +| `VITE_BRAND_NAME` | Eget varumärkesnamn (ersätter "BentoPDF") | +| `VITE_BRAND_LOGO` | Logotypsökväg relativt `public/` (t.ex. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Egen sidfots-/upphovsrättstext | +| `VITE_DEFAULT_LANGUAGE` | Standardspråk för gränssnittet (t.ex. `fr`, `de`, `es`) | + +## Egen domän + +1. Gå till Site settings → Domain management +2. Klicka på "Add custom domain" +3. Följ anvisningarna för DNS-konfiguration + +## Stora mediefiler + +För stora WASM-filer kan du överväga att aktivera [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Felsökning + +### Word/ODT/Excel till PDF fastnar på 55 % + +Om dokumentkonverteringar hänger sig på 55 % öppnar du DevTools Console och kontrollerar: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Om `crossOriginIsolated` är `false` tillämpas inte COEP/COOP-huvudena från din `netlify.toml`. Se till att filen ligger i projektets rotmapp och distribuera om. + +Om du ser `expected magic word 00 61 73 6d, found 1f 8b 08 08` i konsolen saknar filerna `.wasm.gz` huvudet `Content-Encoding: gzip`. Kontrollera att blocken `[[headers]]` för `soffice.wasm.gz` och `soffice.data.gz` finns i din `netlify.toml`. + +### Bygget misslyckas + +Kontrollera att Node-versionen är kompatibel: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Långsam första laddning + +Aktivera tillgångsoptimering under Site settings → Build & deploy → Asset optimization. diff --git a/docs/sv/self-hosting/nginx.md b/docs/sv/self-hosting/nginx.md new file mode 100644 index 00000000..bc7452ae --- /dev/null +++ b/docs/sv/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Distribuera med Nginx + +Hosta BentoPDF på din egen server med Nginx. + +## Förutsättningar + +- Ubuntu/Debian-server +- Nginx installerat +- SSL-certifikat (rekommenderat: Let's Encrypt) + +## Steg 1: Bygg projektet + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +För att anpassa varumärket sätter du miljövariabler före bygget: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Steg 2: Kopiera filer + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Steg 3: Nginx-konfiguration + +Skapa `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Steg 4: Aktivera webbplatsen + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Steg 5: SSL med Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Distribution i en underkatalog + +För att hosta på `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Bygg med: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Prestandajustering + +Lägg till i `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Felsökning + +### WASM laddas inte + +Se till att MIME-typen är angiven: + +```nginx +types { + application/wasm wasm; +} +``` + +### Signera PDF eller Formulärifyllare visar en tom läsare (MIME-fel för `.mjs`) + +Om webbläsarkonsolen visar: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…och den misslyckade begäran slutar på `.mjs` saknar din nginx mappningen `.mjs → application/javascript`. Den medföljande PDF-läsaren (som används av Signera PDF, Formulärifyllare och några andra verktyg) levereras med ES-modulfiler med filändelsen `.mjs`, och nginx standardfil `mime.types` innehåller dem inte som standard. + +Åtgärda det genom att lägga till `mjs` på den befintliga raden `application/javascript` i `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> Lägg INTE till en _andra_ rad med `application/javascript`: nginx tolkar `mime.types` rad för rad och bara en mappning från typ till filändelse gäller, så en andra rad ignoreras tyst i vissa versioner. Redigera den befintliga raden så att `mjs` står bredvid `js`. + +Eller åsidosätt lokalt i ditt serverblock (ingen global filändring): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Ladda om nginx efter ändringen: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +För att bekräfta: leta i webbläsarens DevTools → fliken Network upp den misslyckade `.mjs`-begäran och kontrollera svarshuvudet `Content-Type`. Det ska nu vara `application/javascript`, inte `application/octet-stream`. + +### Word/ODT/Excel till PDF fungerar inte + +LibreOffice WASM kräver `SharedArrayBuffer`, som kräver huvudena `Cross-Origin-Embedder-Policy` och `Cross-Origin-Opener-Policy`. Det kräver också en säker kontext, så `http://localhost` fungerar för lokal testning men `http://192.168.x.x` eller andra LAN-adresser kräver oftast HTTPS. Observera att nginx-direktiv av typen `add_header` i ett `location`-block **åsidosätter** `add_header`-direktiv på servernivå: de slås inte ihop. Varje `location`-block med egna `add_header` måste innehålla COEP/COOP-huvudena. + +Verifiera med: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Om du använder en omvänd proxy framför nginx ser du till att den bevarar dessa huvuden. + +### 502 Bad Gateway + +Kontrollera Nginx felloggar: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/sv/self-hosting/vercel.md b/docs/sv/self-hosting/vercel.md new file mode 100644 index 00000000..1ea6aa36 --- /dev/null +++ b/docs/sv/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Distribuera till Vercel + +[Vercel](https://vercel.com) erbjuder den enklaste distributionsupplevelsen för statiska webbplatser. + +## Distribuera med ett klick + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Manuell distribution + +### Steg 1: Forka repositoryt + +Forka [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) till ditt GitHub-konto. + +### Steg 2: Importera till Vercel + +1. Gå till [vercel.com/new](https://vercel.com/new) +2. Välj ditt forkade repository +3. Konfigurera projektet: + +| Inställning | Värde | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Steg 3: Miljövariabler (valfritt) + +Lägg till dessa vid behov: + +| Variabel | Beskrivning | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Sätt till `true` för minimalt gränssnitt | +| `VITE_BRAND_NAME` | Eget varumärkesnamn (ersätter "BentoPDF") | +| `VITE_BRAND_LOGO` | Logotypsökväg relativt `public/` (t.ex. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Egen sidfots-/upphovsrättstext | +| `VITE_DEFAULT_LANGUAGE` | Standardspråk för gränssnittet (t.ex. `fr`, `de`, `es`) | + +### Steg 4: Distribuera + +Klicka på "Deploy" och vänta tills bygget är klart. + +## Egen domän + +1. Gå till projektinställningarna +2. Navigera till "Domains" +3. Lägg till din egen domän +4. Konfigurera DNS enligt anvisningarna + +## Begränsningar + +::: warning Stora filer +Vercels serverlösa funktioner har en gräns på 50 MB. Eftersom BentoPDF är en statisk webbplats ska detta inte påverka dig, men WASM-modulerna är stora (cirka 100 MB totalt). Se till att de levereras från mappen `/public`. +::: + +## Felsökning + +### Tidsgräns för bygget överskrids + +Om bygget överskrider tidsgränsen, prova: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 404 vid omladdning + +Lägg till en `vercel.json` för SPA-routing: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel till PDF fungerar inte + +LibreOffice WASM-konverteringar kräver `SharedArrayBuffer`, som kräver dessa svarshuvuden på alla sidor: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +De förkomprimerade filerna `.wasm.gz` och `.data.gz` behöver också `Content-Encoding: gzip` så att webbläsaren packar upp dem. + +Lägg till dessa i din `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +För att verifiera öppnar du DevTools Console och kör `console.log(window.crossOriginIsolated)`. Det ska returnera `true`. diff --git a/docs/sv/tools/add-attachments.md b/docs/sv/tools/add-attachments.md new file mode 100644 index 00000000..a4864798 --- /dev/null +++ b/docs/sv/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Lägg till bilagor +description: Bädda in filer av valfri typ i en PDF på dokumentnivå eller kopplade till specifika sidor. +--- + +# Lägg till bilagor + +Bädda in en eller flera filer direkt i ett PDF-dokument. Bilagor kan läggas till på dokumentnivå (synliga i bilagepanelen i alla PDF-läsare) eller kopplas till specifika sidor. + +## Så fungerar det + +1. Ladda upp PDF-filen som du vill bifoga filer till. +2. Använd bilageytan för att välja de filer du vill bädda in (valfri filtyp). +3. Välj bilagenivå: **Dokument** (standard) eller **Sida**. +4. Om du väljer sidnivå anger du ett sidintervall (t.ex. `1-3` eller `5`). +5. Klicka på bearbetningsknappen. Den ändrade PDF-filen laddas ner med dina filer inbäddade. + +## Funktioner + +- Bifoga valfri filtyp: bilder, kalkylblad, arkiv, körbara filer, vad som helst +- Placering av bilagor på dokumentnivå eller sidnivå +- Flera filer kan bifogas i en och samma åtgärd +- Visar filnamn och storlek för alla valda bilagor +- Resultatet behåller det ursprungliga PDF-innehållet med de inbäddade filerna tillagda + +## Alternativ + +| Alternativ | Beskrivning | +| ---------------- | --------------------------------------------------------------------- | +| **Dokumentnivå** | Bifogar filer till PDF-filen som helhet, åtkomliga från bilagepanelen | +| **Sidnivå** | Bifogar filer till specifika sidor, angivna med ett sidintervall | + +## Användningsområden + +- Samla underlagsdata (Excel-filer, CSV) tillsammans med en PDF-rapport +- Bifoga originalbilder till en PDF med ett fotoportfolio +- Bädda in stödjande dokument i ett avtal eller ett förslag +- Lägga till kompletterande material på specifika sidor i en utbildningsmanual + +## Tips + +- Bilagor på dokumentnivå stöds bredast i PDF-läsare. Bilagor på sidnivå kanske inte syns i alla läsare. +- Det finns ingen storleksgräns för bilagor, men mycket stora inbäddade filer ökar PDF-filens storlek i motsvarande grad. + +## Relaterade verktyg + +- [Extrahera bilagor](./extract-attachments) +- [Redigera bilagor](./edit-attachments) +- [Slå ihop PDF](./merge-pdf) diff --git a/docs/sv/tools/add-blank-page.md b/docs/sv/tools/add-blank-page.md new file mode 100644 index 00000000..67b2b17d --- /dev/null +++ b/docs/sv/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Lägg till tom sida +description: Infoga en eller flera tomma sidor på valfri position i ett PDF-dokument. +--- + +# Lägg till tom sida + +Infoga tomma sidor i en PDF på en position som du anger. Du styr var de tomma sidorna hamnar och hur många som läggs till. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Verktyget visar antalet sidor. +2. Ange **positionen** där de tomma sidorna ska infogas. Använd `0` för att infoga allra först, eller det totala antalet sidor för att lägga till i slutet. +3. Ange **antalet** tomma sidor som ska läggas till (standard är 1). +4. Klicka på bearbetningsknappen. Den ändrade PDF-filen laddas ner med de tomma sidorna infogade. + +## Funktioner + +- Infoga på valfri position: i början, mitten eller slutet av dokumentet +- Lägg till flera tomma sidor i en och samma åtgärd +- Positionstipset uppdateras dynamiskt utifrån antalet sidor i den uppladdade PDF-filen +- Tomma sidor i standardformatet A4 + +## Användningsområden + +- Lägga till en tom avskiljande sida mellan avsnitt i ett sammanställt dokument +- Infoga tomma sidor för att få rätt placering vid dubbelsidig utskrift +- Lämna plats för handskrivna anteckningar i en utskriven studiehandledning +- Fylla ut ett dokument så att det når ett minsta antal sidor + +## Tips + +- Position `0` infogar före första sidan. En position som är lika med det totala antalet sidor lägger till efter sista sidan. +- Om du behöver infoga innehåll (inte bara tomma sidor) på en viss position kan du använda [PDF-multiverktyg](./pdf-multi-tool) för att infoga en annan PDF efter en angiven sida. + +## Relaterade verktyg + +- [Organisera och duplicera](./organize-pdf) +- [PDF-multiverktyg](./pdf-multi-tool) +- [Slå ihop PDF](./merge-pdf) diff --git a/docs/sv/tools/add-page-labels.md b/docs/sv/tools/add-page-labels.md new file mode 100644 index 00000000..63eacba9 --- /dev/null +++ b/docs/sv/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Lägg till sidetiketter +description: Lägg till PDF-sidetiketter med romerska siffror, bokstavsprefix, anpassad numrering och flera regler per dokument. +--- + +# Lägg till sidetiketter + +Sidetiketter styr hur sidnummer visas i PDF-läsare (numret som visas i verktygsfältet, inte det som är tryckt på sidan). Med det här verktyget kan du ge olika sidintervall olika etikettscheman: romerska siffror för inledande sidor, vanliga tal för huvuddelen, bokstavsmärkta bilagor och mer. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Alternativpanelen visas med en etikettregel som standard. +3. Konfigurera varje regel med sidintervall, stil, valfritt prefix och startvärde. +4. Klicka på **Lägg till regel** för att skapa fler regler för olika avsnitt. +5. Klicka på **Lägg till sidetiketter** för att tillämpa alla regler och ladda ner resultatet. + +## Alternativ + +Varje etikettregel har följande inställningar: + +- **Sidintervall**: Vilka sidor regeln gäller för. Lämna tomt för alla sidor. Stöder intervall som `1-4`, `7`, `odd` eller `1-9,30-40`. +- **Etikettstil**: Decimala arabiska siffror, små romerska siffror (i, ii, iii), stora romerska siffror (I, II, III), små bokstäver (a, b, c), stora bokstäver (A, B, C) eller ingen etikett (endast prefix). +- **Etikettprefix**: Valfri text som läggs framför varje etikett, till exempel "A-" för att skapa etiketter som A-1, A-2, A-3. +- **Startvärde**: Talet som räkningen börjar på. Standard är 1. Ange 0 för nollbaserad numrering. +- **Fortsätt numreringen över åtskilda intervall**: Aktivera detta när en regel gäller sidor som inte följer på varandra (som `1-9,30-40` eller `odd`) och du vill att numreringen ska fortsätta i följd. +- **Ta bort befintliga sidetiketter**: Markerat som standard. Rensar tidigare etiketter innan dina nya regler tillämpas. + +## Funktioner + +- Flera etikettregler per dokument för komplexa numreringsscheman +- Sex etikettstilar som täcker alla vanliga numreringssystem +- Stöd för egna prefix för avsnittsbaserad märkning +- Stöd för åtskilda intervall med löpande numrering +- Möjlighet att behålla eller ta bort befintliga etiketter + +## Användningsområden + +- Ange etiketter med romerska siffror (i, ii, iii) för en boks förord och decimala etiketter för huvudtexten +- Märka bilagesidor med bokstavsprefix som "A-1", "A-2", "B-1", "B-2" +- Rätta sidetiketter i ett skannat dokument där de fysiska sidnumren inte stämmer med PDF-ordningen +- Lägga till nollbaserad numrering för tekniska dokument + +## Tips + +- Sidetiketter är metadata som PDF-läsare visar i sitt navigeringsfält. De skrivs inte ut på själva sidan. För synliga nummer använder du [Sidnummer](./page-numbers). +- Det här verktyget kräver att CoherentPDF (CPDF) är konfigurerat i dina WASM-inställningar. Om det inte är konfigurerat uppmanas du att göra det. + +## Relaterade verktyg + +- [Sidnummer](./page-numbers) +- [Bates-numrering](./bates-numbering) +- [Redigera bokmärken](./bookmark) diff --git a/docs/sv/tools/add-stamps.md b/docs/sv/tools/add-stamps.md new file mode 100644 index 00000000..a0e21898 --- /dev/null +++ b/docs/sv/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Lägg till stämplar +description: Lägg till bildstämplar på dina PDF-sidor med ett integrerat anteckningsverktygsfält och användarnamn som avsändare. +--- + +# Lägg till stämplar + +Placera bildstämplar på dina PDF-sidor med en inbäddad läsare och ett verktygsfält för stämpelanteckningar. Stämplar kan innehålla ditt namn som avsändare, vilket är praktiskt för godkännandeflöden, granskningsprocesser och märkning av dokument. + +## Så fungerar det + +1. Ange ditt namn i fältet **Stämpelns användarnamn**. Namnet visas på stämplar som du skapar. +2. Ladda upp din PDF-fil genom att klicka eller dra den till släppytan. +3. Stämpelredigeraren öppnas med ditt dokument inläst i en läsare. +4. Använd verktygsfältets bildstämpelverktyg för att välja och placera stämplar på valfri sida. +5. Placera och ändra storlek på stämplarna efter behov. +6. Klicka på **Spara stämplad PDF** för att ladda ner resultatet. + +## Funktioner + +- Integrerad PDF-läsare med ett stämpelspecifikt verktygsfält för anteckningar +- Användarnamn som avsändare på skapade stämplar +- Placering av bildstämplar på valfri sida +- Positionering och storleksändring med dra och släpp +- Automatisk anpassning av läsarens storlek efter sidans proportioner +- Filvisning med namn och storlek + +## Användningsområden + +- Lägga till bildstämplarna "GODKÄND" eller "GRANSKAD" på dokument i ett granskningsflöde +- Placera bilder av företagsstämplar eller notariestämplar på officiella dokument +- Märka sidor med stämplar som "MOTTAGEN" inklusive granskarens namn +- Lägga till kvalitetskontrollstämplar på inspektionsrapporter + +## Tips + +- Ange stämpelns användarnamn innan du laddar upp PDF-filen. Användarnamnet bäddas in i stämpelns metadata. +- Läsaren justerar sin höjd efter förstasidans proportioner för bästa visning. +- För textbaserade vattenstämplar i stället för bildstämplar använder du verktyget [Lägg till vattenstämpel](./add-watermark). + +## Relaterade verktyg + +- [Signera PDF](./sign-pdf) +- [Lägg till vattenstämpel](./add-watermark) +- [PDF-redigerare](./edit-pdf) diff --git a/docs/sv/tools/add-watermark.md b/docs/sv/tools/add-watermark.md new file mode 100644 index 00000000..66fe0c3d --- /dev/null +++ b/docs/sv/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Lägg till vattenstämpel +description: Lägg text- eller bildvattenstämplar på PDF-sidor med en visuell dra och släpp-redigerare och liveförhandsvisning. +--- + +# Lägg till vattenstämpel + +Lägg till text- eller bildvattenstämplar på dina PDF-sidor med en visuell redigerare. Du kan placera vattenstämpeln genom att dra den direkt i förhandsvisningen, ändra storlek med hörnhandtagen och ställa in opacitet, rotation, teckensnitt och färg. Varje sida kan ha sin egen vattenstämpelposition, eller så kan du tillämpa samma vattenstämpel på alla sidor på en gång. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Redigeraren öppnas med en liveförhandsvisning av första sidan och en flyttbar vattenstämpel. +3. Välj mellan läget **Text** eller **Bild** med växlingsknapparna. +4. Konfigurera vattenstämpelns inställningar i sidopanelen. +5. Dra vattenstämpeln i förhandsvisningen till exakt rätt plats. Använd hörnhandtagen för att ändra storlek. +6. Bläddra mellan sidorna för att ställa in vattenstämplar per sida, eller låt **Tillämpa på alla sidor** vara markerat. +7. Klicka på **Lägg till vattenstämpel** för att bearbeta och ladda ner. + +## Alternativ + +**Inställningar för textvattenstämpel:** + +- **Text**: Vattenstämpelns text (t.ex. "KONFIDENTIELLT", "UTKAST"). +- **Teckenstorlek**: Från 10 till 200 punkter. Standard är 72. +- **Färg**: Valfri färg via färgväljaren. +- **Opacitet**: Styr genomskinligheten från helt genomskinlig till helt ogenomskinlig. +- **Rotation**: Rotera vattenstämpelns text från -180 till 180 grader. + +**Inställningar för bildvattenstämpel:** + +- **Bilduppladdning**: Ladda upp en PNG-, JPG- eller annan bildfil som ska användas som vattenstämpel. +- **Opacitet**: Styr bildens genomskinlighet. +- **Skala**: Ändra storlek på bildvattenstämpeln. + +**Layoutinställningar:** + +- **Enkel**: En vattenstämpel per sida, placerad genom att dra den eller med positionsförinställningarna. +- **Plattad**: Upprepar vattenstämpeln över hela sidan i ett diagonalt rutnät som följer rotationsvinkeln, så att märket täcker dokumentet från kant till kant. +- **Horisontellt avstånd**: Avståndet mellan brickor längs textriktningen, som en procentandel av vattenstämpelns bredd (endast i plattat läge). +- **Vertikalt avstånd**: Avståndet mellan brickrader, som en procentandel av vattenstämpelns höjd (endast i plattat läge). + +**Allmänna inställningar:** + +- **Tillämpa på alla sidor**: När det är markerat gäller samma vattenstämpel för varje sida. Avmarkera för att ställa in enskilda vattenstämplar per sida. +- **Sidintervall**: Ange vilka sidor som får vattenstämpeln (t.ex. "1-3, 5, 7-9" eller "all"). + +## Funktioner + +- Visuell positionering med dra och släpp på en PDF-liveförhandsvisning +- Vattenstämpel som går att skala med hörnhandtag +- Lägen för text- och bildvattenstämplar +- Enkel eller plattad (upprepad) layout över hela sidan med justerbart avstånd +- Vattenstämpel per sida eller global +- Sida för sida-navigering i förhandsvisningen +- Reglage för opacitet och rotation +- Filtrering på sidintervall + +## Användningsområden + +- Märka utkast med "UTKAST" innan de skickas ut för granskning +- Lägga till vattenstämplar med "KONFIDENTIELLT" på känsliga ekonomiska rapporter +- Profilera dokument med en vattenstämpel i form av en företagslogotyp +- Stämpla "EXEMPEL" på produktdokumentation som delas med potentiella kunder +- Lägga till upphovsrättsmeddelanden på distribuerat PDF-material + +## Tips + +- För diagonala vattenstämplar över sidan ställer du in en rotation på omkring 45 grader och ökar teckenstorleken. +- Plattat läge gör ett dokument mycket svårare att återanvända efter beskärning, eftersom dussintals märken finns kvar även om ett tas bort. Sänk opaciteten när du använder plattat läge så att texten under förblir läsbar. +- Bildvattenstämplar med genomskinlig bakgrund (PNG-format) smälter in bättre i dokumentets innehåll. +- Om du vill ha olika vattenstämpeltext på olika sidor avmarkerar du "Tillämpa på alla sidor" och bläddrar sida för sida. + +## Relaterade verktyg + +- [Sidhuvud och sidfot](./header-footer) +- [Lägg till stämplar](./add-stamps) +- [Bates-numrering](./bates-numbering) +- [Signera PDF](./sign-pdf) diff --git a/docs/sv/tools/adjust-colors.md b/docs/sv/tools/adjust-colors.md new file mode 100644 index 00000000..011b8346 --- /dev/null +++ b/docs/sv/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Justera färger +description: Finjustera ljusstyrka, kontrast, mättnad, nyans, temperatur, färgton, gamma och sepia i din PDF. +--- + +# Justera färger + +Ett komplett verktyg för färgkorrigering av PDF-filer. Justera åtta oberoende parametrar (ljusstyrka, kontrast, mättnad, nyansförskjutning, temperatur, färgton, gamma och sepia) med en liveförhandsvisning som uppdateras när du flyttar varje reglage. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Redigeraren öppnas med en förhandsvisning av första sidan och en panel för färginställningar. +3. Flytta reglagen för att justera varje färgparameter. Förhandsvisningen uppdateras i realtid. +4. Klicka på **Återställ** för att sätta alla reglage tillbaka till standardlägena. +5. Klicka på **Tillämpa** för att bearbeta alla sidor och ladda ner den justerade PDF-filen. + +## Alternativ + +- **Ljusstyrka**: Gör hela sidan ljusare eller mörkare (-100 till +100). +- **Kontrast**: Ökar eller minskar skillnaden mellan ljusa och mörka partier (-100 till +100). +- **Mättnad**: Förstärker eller minskar färgintensiteten (-100 till +100). Vid -100 blir resultatet gråskala. +- **Nyansförskjutning**: Roterar färghjulet för att förskjuta alla färger lika mycket. +- **Temperatur**: Förskjuter färgerna mot varmare (gult/orange) eller kallare (blått). +- **Färgton**: Lägger till en grön eller magenta färgstick. +- **Gamma**: Justerar mellantonernas ljusstyrka med en gammakurva. Värden under 1,0 mörkar mellantoner, värden över 1,0 gör dem ljusare. +- **Sepia**: Tillämpar en klassisk sepiaeffekt. Högre värden ger en starkare brun ton. + +## Funktioner + +- Åtta oberoende justerbara färgparametrar +- Liveförhandsvisning som reagerar direkt på reglagen +- Återställningsknapp för att snabbt gå tillbaka till standardvärdena +- Bearbetar alla sidor i dokumentet +- Fungerar med allt PDF-innehåll (text, bilder, grafik) + +## Användningsområden + +- Göra en mörk skanning ljusare eller korrigera överexponerade sidor +- Minska mättnaden i ett färgglatt dokument för att spara bläck före utskrift +- Lägga på en sepiaton för att ge intyg eller utmärkelser ett antikt utseende +- Korrigera färgtemperaturen på foton som är inbäddade i en PDF +- Öka kontrasten i bleka eller lågkvalitativa skannade dokument + +## Tips + +- För en snabb gråskaleomvandling drar du mättnadsreglaget hela vägen till -100. +- Gammareglaget är särskilt användbart för att förbättra läsbarheten i skannade dokument där mellantonerna är för mörka eller för ljusa. +- Precis som de andra bildeffektverktygen rastrerar det här verktyget varje sida. Resultatet blir bildbaserat, så texten går inte att markera. + +## Relaterade verktyg + +- [Invertera färger](./invert-colors) +- [Skannereffekt](./scanner-effect) +- [Bakgrundsfärg](./background-color) diff --git a/docs/sv/tools/alternate-merge.md b/docs/sv/tools/alternate-merge.md new file mode 100644 index 00000000..f3e5696d --- /dev/null +++ b/docs/sv/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Alternera & blanda sidor +description: Slå ihop PDF-filer genom att varva sidor från varje fil i växlande ordning, med bevarade bokmärken. +--- + +# Alternera & blanda sidor + +Varva sidor från flera PDF-filer så att sidorna växlar mellan dokumenten. Det här är verktyget du behöver när en vanlig sammanslagning bara skulle lägga filerna efter varandra, men du vill ha sida 1 från fil A, sedan sida 1 från fil B, sedan sida 2 från fil A och så vidare. + +## Så fungerar det + +1. Ladda upp minst två PDF-filer via släppytan. +2. Verktyget visar varje fil med sidantal och filstorlek. +3. Dra i greppen för att ändra vilken fils sidor som kommer först i växlingsordningen. +4. Klicka på **Blanda sidor** för att skapa det varvade resultatet. +5. Resultatet laddas ner som `alternated-mixed.pdf`. + +## Funktioner + +- Varvar sidor över valfritt antal PDF-filer (minst två) +- Ändra filernas ordning med dra och släpp för att styra växlingsprioriteten +- Bevarar bokmärken från källdokumenten +- Visar sidantal och filstorlek för varje uppladdad fil +- Bearbetar i en dedikerad webbarbetare för ett responsivt gränssnitt + +## Användningsområden + +- Sätta ihop dubbelsidiga skanningar där udda och jämna sidor skannades separat +- Kombinera frågeblad med facit så att varje fråga följs av sitt svar +- Slå ihop tvåspråkiga dokument sida för sida (t.ex. engelska på ena sidan och översättningen på nästa) +- Varva fram- och baksidor från en enkelsidig skanner + +## Tips + +- Om dina käll-PDF-filer har olika antal sidor tar sidorna i det kortare dokumentet slut först, och de återstående sidorna från det längre dokumentet hamnar sist. +- Filernas ordning spelar roll: den första filen i listan bidrar med resultatets första sida. Dra för att ordna om vid behov. + +## Relaterade verktyg + +- [Slå ihop PDF](./merge-pdf) +- [Organisera och duplicera](./organize-pdf) +- [Dela PDF](./split-pdf) diff --git a/docs/sv/tools/background-color.md b/docs/sv/tools/background-color.md new file mode 100644 index 00000000..bde4af48 --- /dev/null +++ b/docs/sv/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Bakgrundsfärg +description: Ändra bakgrundsfärgen på varje sida i din PDF och behåll allt innehåll ovanpå. +--- + +# Bakgrundsfärg + +Ange en enfärgad bakgrund bakom allt befintligt innehåll i din PDF. Verktyget skapar en färgad rektangel på varje sida och lägger det ursprungliga innehållet ovanpå, så att text, bilder och grafik förblir fullt synliga mot den nya bakgrunden. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Välj en bakgrundsfärg med färgväljaren. Standard är en ljusgul färg (#FFFFCC). +3. Klicka på **Ändra bakgrundsfärg** för att bearbeta. +4. Den uppdaterade PDF-filen laddas ner automatiskt. + +## Alternativ + +- **Bakgrundsfärg**: En vanlig färgväljare för att välja valfri enfärgad ton. Standard är ljusgul. + +## Funktioner + +- Tillämpar en enhetlig bakgrundsfärg på varje sida +- Bevarar allt originalinnehåll (text, bilder, vektorgrafik) ovanpå det färgade lagret +- Behåller de ursprungliga sidmåtten +- Fungerar med dokument med valfritt antal sidor + +## Användningsområden + +- Lägga till en ljus kräm- eller elfenbensfärgad bakgrund för att ge dokument ett mjukare, papperslikt utseende +- Färgkoda dokumentuppsättningar genom att ge olika kategorier olika bakgrundsfärger +- Skapa visuellt åtskilda versioner av samma dokument för olika målgrupper +- Lägga till en ljus bakgrundston för bättre läsbarhet när dokument visas på skärm + +## Tips + +- Ljusa, dämpade färger fungerar bäst. En mycket mörk bakgrund kan göra texten svårläst om inte texten redan är ljus. +- Om du vill ändra både bakgrunds- och textfärg tillämpar du först bakgrundsfärgen och använder sedan [Ändra textfärg](./text-color) på resultatet. +- Det här verktyget arbetar på PDF-ets strukturella nivå (inte genom rastrering), så texten förblir markerbar och sökbar i resultatet. + +## Relaterade verktyg + +- [Ändra textfärg](./text-color) +- [Invertera färger](./invert-colors) +- [Justera färger](./adjust-colors) diff --git a/docs/sv/tools/bates-numbering.md b/docs/sv/tools/bates-numbering.md new file mode 100644 index 00000000..c7f7f604 --- /dev/null +++ b/docs/sv/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates-numrering +description: Tillämpa Bates-nummer på en eller flera PDF-filer med anpassningsbara mallar, nollutfyllnad, teckensnitt och placering. +--- + +# Bates-numrering + +Bates-numrering stämplar löpande identifierare på varje sida i dina PDF-filer. Det är standardmetoden för att märka dokument i rättsliga processer, revisioner och efterlevnadsarbete. Verktyget stöder flera filer och anpassningsbara mallar, och ger antingen individuellt numrerade PDF-filer eller ett enda ZIP-arkiv. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. Du kan dra flera filer samtidigt. +2. Välj en stilförinställning eller skapa en egen mall. +3. Konfigurera position, teckensnitt, storlek, färg och startnummer. +4. Klicka på **Tillämpa Bates-nummer** för att bearbeta. +5. En enskild fil laddas ner direkt. Flera filer laddas ner som ett ZIP-arkiv. + +## Alternativ + +- **Stilförinställning**: Välj bland inbyggda format: + - Exhibit + Case + Bates + Page (t.ex. "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (utan sidnummer) + - Case + Bates + - Endast Bates-nummer (t.ex. "000001") + - Anpassad (skriv din egen mall) +- **Anpassa stil**: En mallsträng med platshållare: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Bates-utfyllnad**: Antal siffror (3 till 6) för Bates-nummer med inledande nollor. Visas bara i anpassat läge. +- **Position**: Sidhuvud eller sidfot, vänster, mitten eller höger. +- **Bates börjar från**: Det första Bates-numret. Standard är 1. Numreringen fortsätter över filerna. +- **Filräknaren börjar från**: Startnumret för platshållaren `[FILE]`. +- **Teckensnitt**: Helvetica, Times New Roman eller Courier. +- **Teckenstorlek**: Storleken på den stämplade texten. +- **Färg**: Färgväljare för texten i Bates-numret. + +## Funktioner + +- Liveförhandsvisning som visar hur Bates-numren ser ut över alla uppladdade filer +- Stöd för flera filer med sammanhängande numrering över dokumenten +- Ändra filernas ordning med dra och släpp för att styra numreringsföljden +- Sex positionsalternativ (sidhuvud/sidfot, vänster/mitten/höger) +- Adaptiv marginalberäkning som tar hänsyn till olika sidstorlekar +- ZIP-utdata för batcher med flera filer +- Mallplatshållare för maximal flexibilitet + +## Användningsområden + +- Stämpla bevisdokument inför rättegång med löpande exhibit-nummer +- Numrera revisionsunderlag som omfattar dussintals filer +- Tillämpa myndighetsreferensnummer på efterlevnadsdokumentation +- Märka bilagor till patentansökningar med ärendespecifika identifierare + +## Tips + +- Dra filerna i fillistan för att ändra ordning innan du bearbetar. Bates-numreringen följer denna ordning. +- Använd platshållaren `[FILENAME]` för att ta med det ursprungliga filnamnet i stämpeln, vilket gör det lättare att spåra sidor tillbaka till källdokumenten. +- Förhandsvisningsrutan uppdateras i realtid när du ändrar inställningar, så du kan kontrollera formatet innan du bearbetar. + +## Relaterade verktyg + +- [Sidnummer](./page-numbers) +- [Lägg till sidetiketter](./add-page-labels) +- [Sidhuvud och sidfot](./header-footer) diff --git a/docs/sv/tools/bmp-to-pdf.md b/docs/sv/tools/bmp-to-pdf.md new file mode 100644 index 00000000..2e111ec8 --- /dev/null +++ b/docs/sv/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP till PDF +description: Konvertera BMP-bitmappsbilder till PDF direkt i webbläsaren, utan uppladdning till någon server. +--- + +# BMP till PDF + +Konvertera Windows Bitmap-filer (BMP) till PDF. BMP är ett okomprimerat bildformat som fortfarande förekommer i äldre system, medicinsk bildbehandling och industriella skannrar. Det här verktyget konverterar dem till PDF utan att du behöver installera något. + +## Format som stöds + +| Format | Filändelser | +| :----- | :---------- | +| BMP | `.bmp` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina BMP-filer. +2. Granska fillistan. Lägg till fler filer eller ta bort oönskade. +3. Klicka på **Konvertera till PDF**. Resultatet laddas ner som `from_bmps.pdf`. + +Varje BMP ritas på en canvas, exporteras som PNG och bäddas sedan in i PDF-filen med pdf-lib. Sidstorleken motsvarar den ursprungliga bildens mått. + +## Alternativ + +Det här verktyget har inga extra kvalitetsinställningar. Bilderna bäddas in i sin ursprungliga upplösning som förlustfri PNG i PDF-filen. + +## Användningsområden + +- Konvertera äldre skannade dokument som lagrats som BMP till arkiverbara PDF-filer +- Göra om BMP-skärmbilder från äldre Windows-program till delbara dokument +- Bearbeta utdata från medicinska eller industriella skannrar som använder BMP som standard +- Migrera gamla bildarkiv till ett mer portabelt format + +## Tips + +- BMP-filer är okomprimerade och därför ofta stora. Den resulterande PDF-filen blir betydligt mindre eftersom bilderna kodas om internt som PNG. +- Om du har BMP-filer tillsammans med andra bildformat kan du använda verktyget [Bilder till PDF](./image-to-pdf) för att konvertera allt i en enda batch. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [PNG till PDF](./png-to-pdf) +- [TIFF till PDF](./tiff-to-pdf) diff --git a/docs/sv/tools/bookmark.md b/docs/sv/tools/bookmark.md new file mode 100644 index 00000000..ec892c31 --- /dev/null +++ b/docs/sv/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Redigera bokmärken +description: Lägg till, redigera, importera, exportera och ta bort PDF-bokmärken med en visuell redigerare och stöd för CSV/JSON. +--- + +# Redigera bokmärken + +Bokmärkesredigeraren ger dig full kontroll över PDF-bokmärken för navigering (även kallade konturer). Du kan lägga till nya bokmärken, redigera befintliga, ändra hierarkin och importera eller exportera bokmärkesdata i formaten CSV och JSON. + +## Så fungerar det + +1. Ladda upp din PDF genom att klicka eller dra en fil till släppytan. +2. Markera eventuellt **Extrahera befintliga bokmärken automatiskt** för att hämta dokumentets nuvarande bokmärkesträd. +3. Redigeraren öppnas i delad vy: PDF-visaren till vänster och bokmärkespanelen till höger. +4. Skriv en bokmärkestitel och klicka på **Lägg till på sidan** för att skapa ett nytt bokmärke som pekar på den aktuella sidan. +5. Använd verktygsfältets knappar för att ordna om, formatera eller ta bort bokmärken. +6. Klicka på **Spara PDF med bokmärken** för att ladda ner den uppdaterade filen. + +## Funktioner + +- Visuell PDF-visare med sidnavigering, zoomkontroller och fält för att gå till en sida +- Lägg till bokmärken på valfri sida med ett enda klick +- Klicka direkt på PDF-filen för att ange en exakt bokmärkesdestination (väljarläge) +- Nästlad bokmärkeshierarki med omordning via dra och släpp +- Batchåtgärder: markera flera bokmärken för att ändra färg, stil eller ta bort dem på en gång +- Bokmärkessökning för att snabbt hitta poster i stora träd +- Ångra och gör om för alla ändringar +- Importera bokmärken från CSV (titel, sida, nivå) eller JSON-filer +- Exportera bokmärken till CSV eller JSON för extern redigering +- Bokmärkesformatering: färg (röd, blå, grön, gul, lila) och teckenstil (fet, kursiv, fet kursiv) +- Snabb navigering: bläddra mellan sidor med sida upp/ned-tangenterna + +## Alternativ + +- **Extrahera befintliga bokmärken automatiskt**: När det är markerat läser verktyget in och visar PDF-filens nuvarande bokmärken vid inladdning. +- **Batchläge**: Slå på för att markera flera bokmärken och tillämpa massändringar av färg, stil eller borttagning. +- **Expandera/dölj alla**: Visa eller dölj snabbt nästlade underbokmärken. + +## Användningsfall + +- Lägga till en innehållsförteckning i en lärobok eller manual som saknar bokmärken +- Strukturera om bokmärken i ett skannat dokument efter OCR-bearbetning +- Exportera bokmärken till CSV, redigera dem i ett kalkylblad och sedan importera dem igen +- Rensa upp automatiskt genererade bokmärken med felaktiga sidhänvisningar +- Lägga till färgade bokmärken för att markera viktiga avsnitt i en juridisk inlaga + +## Tips + +- Använd CSV-import för att skapa många bokmärken på en gång. Formatet är enkelt: `title,page,level` där nivå 1 är högsta nivån. +- Väljarläget låter dig klicka på en exakt plats på PDF-sidan för att ange bokmärkets destination, vilket är mer exakt än att bara ange ett sidnummer. +- Exportera dina bokmärken innan du gör stora ändringar så att du har en säkerhetskopia. + +## Relaterade verktyg + +- [Innehållsförteckning](./table-of-contents) +- [PDF-redigerare](./edit-pdf) +- [Lägg till sidetiketter](./add-page-labels) diff --git a/docs/sv/tools/cbz-to-pdf.md b/docs/sv/tools/cbz-to-pdf.md new file mode 100644 index 00000000..88c50340 --- /dev/null +++ b/docs/sv/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ till PDF +description: Konvertera CBZ- och CBR-serietidningsarkiv till PDF i webbläsaren. Gratis, privat, ingen uppladdning behövs. +--- + +# CBZ till PDF + +Förvandla serietidningsarkiv till PDF-filer. CBZ och CBR är standardformaten för digitala serier. De är bara ZIP- eller RAR-arkiv fyllda med bilder. Det här verktyget extraherar varje sida, bevarar läsordningen och skapar en ren PDF där varje bild blir en sida i full storlek. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----- | :--------- | :------------------------------------------------------------ | +| CBZ | `.cbz` | ZIP-baserat serietidningsarkiv (bearbetas lokalt med pdf-lib) | +| CBR | `.cbr` | RAR-baserat serietidningsarkiv (bearbetas via PyMuPDF-motorn) | + +CBZ-konverteraren känner igen bilder i formaten JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC och JXL i arkivet. Format som inte är standard konverteras automatiskt till PNG före inbäddning. + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina CBZ- eller CBR-filer. Du kan blanda båda formaten i samma batch. +2. Granska de listade filerna. Ta bort de du inte behöver, eller klicka på **Lägg till fler filer** för att lägga till fler. +3. Klicka på **Konvertera till PDF**. För CBZ-filer packar verktyget upp arkivet, sorterar bildfilerna efter namn i naturlig ordning, identifierar varje bilds faktiska format och bäddar in dem i en PDF med pdf-lib. CBR-filer går i stället via PyMuPDF-motorn. +4. En enskild fil laddas ner som en PDF. Flera filer ger ett ZIP-arkiv med namnet `comic-converted.zip`. + +## Alternativ + +Ingen konfiguration krävs. Varje bild blir en sida med samma mått som originalet, så dubbelsidor förblir breda och enkelsidor förblir smala. + +## Användningsfall + +- Läsa serier på en surfplatta eller i en mobilapp som stöder PDF men inte CBZ/CBR +- Skriva ut vissa sidor från en digital serie +- Arkivera en seriesamling i ett format som alla filvisare kan öppna +- Dela en serie med någon som inte har en särskild serieläsare + +## Tips + +- Bilderna i arkivet sorteras i naturlig ordning (så `page2.jpg` kommer före `page10.jpg`). Namnge filerna med enhetlig numrering för rätt sidordning. +- Konverteraren identifierar bildformat utifrån deras binära signaturer, inte filändelser. En PNG som av misstag fått namnet `.jpg` bäddas ändå in korrekt. +- CBZ-filer bearbetas helt i webbläsaren utan att PyMuPDF-motorn läses in, så de konverteras snabbare än CBR-filer. + +## Relaterade verktyg + +- [EPUB till PDF](./epub-to-pdf) +- [MOBI till PDF](./mobi-to-pdf) +- [Bilder till PDF](./image-to-pdf) diff --git a/docs/sv/tools/change-permissions.md b/docs/sv/tools/change-permissions.md new file mode 100644 index 00000000..5e4386dd --- /dev/null +++ b/docs/sv/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Ändra behörigheter +description: Ange eller ändra PDF-behörigheter för utskrift, kopiering, redigering och kommentarer. Använder 256-bitars AES-kryptering. +--- + +# Ändra behörigheter + +Finjustera vad mottagarna kan göra med din PDF. Till skillnad från enkel kryptering som bara låser filen bakom ett lösenord låter det här verktyget dig selektivt tillåta eller förbjuda utskrift, kopiering, redigering, kommentarer, ifyllning av formulär, dokumentsammansättning och sidextrahering, allt framtvingat genom 256-bitars AES-kryptering. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Om PDF-filen redan är krypterad, ange **Nuvarande lösenord**. +3. Ange ett **Nytt användarlösenord** (krävs för att öppna) och/eller ett **Nytt ägarlösenord** (styr behörigheterna). +4. Slå på eller av enskilda behörigheter med kryssrutorna. +5. Klicka på **Ändra behörigheter**. +6. Ladda ner den uppdaterade PDF-filen. + +Om du lämnar båda fälten för nya lösenord tomma dekrypterar verktyget PDF-filen helt och tar bort all kryptering och alla begränsningar. + +## Behörighetskontroller + +| Behörighet | Vad den styr | +| --------------------------------- | -------------------------------------------------------- | +| **Tillåt utskrift** | Om dokumentet får skrivas ut | +| **Tillåt kopiering** | Om text och bilder får markeras och kopieras | +| **Tillåt ändringar** | Om dokumentets innehåll får redigeras | +| **Tillåt kommentarer** | Om kommentarer, markeringar och stämplar får läggas till | +| **Tillåt ifyllning av formulär** | Om interaktiva formulärfält får fyllas i | +| **Tillåt dokumentsammansättning** | Om sidor får infogas, tas bort eller roteras | +| **Tillåt sidextrahering** | Om enskilda sidor får extraheras | + +Alla behörigheter kräver ett ägarlösenord för att kunna framtvingas. Utan ägarlösenord ignoreras behörighetsflaggorna av de flesta PDF-läsare. + +## Så fungerar behörigheter i PDF + +PDF-behörigheter är en del av krypteringsspecifikationen. De lagras som bitflaggor i krypteringsordlistan och framtvingas av kompatibla PDF-läsare. Den viktiga skillnaden: + +- **Användarlösenord**: Krävs för att över huvud taget öppna filen. +- **Ägarlösenord**: Krävs för att ändra behörigheter eller ta bort begränsningar. Utan det styr behörighetsflaggorna vilka åtgärder användaren kan utföra. + +Om du bara anger ett ägarlösenord (inget användarlösenord) kan vem som helst öppna filen men är begränsad till de tillåtna åtgärderna. Om du anger båda kräver filen ett lösenord för att öppnas och är begränsad efter autentisering. + +## Användningsfall + +- Distribuera en rapport som kan visas och skrivas ut men inte redigeras eller kopieras +- Dela en avtalsmall som mottagarna kan fylla i men inte ändra +- Publicera en PDF-katalog där kopiering av bilder är avstängd +- Tillåta kommentarer i ett granskningsutkast samtidigt som strukturella ändringar förhindras + +## Tips + +- För att vara effektiv bör du alltid ange ett ägarlösenord. Behörigheter utan ägarlösenord går inte att framtvinga. +- Vissa PDF-verktyg från tredje part ignorerar behörighetsflaggor. För starkare skydd kan du överväga att rasterisera PDF-filen eller använda DRM. +- Använd det här verktyget för att uppgradera gamla RC4-krypterade PDF-filer till AES-256. + +## Relaterade verktyg + +- [Skydda PDF](./protect-pdf): enkelt lösenordsskydd utan detaljerade behörigheter +- [Lås upp PDF](./unlock-pdf): ta bort krypteringen helt +- [Ta bort begränsningar](./remove-restrictions): ta bort alla begränsningar när du har ägarlösenordet diff --git a/docs/sv/tools/combine-single-page.md b/docs/sv/tools/combine-single-page.md new file mode 100644 index 00000000..12c4ec15 --- /dev/null +++ b/docs/sv/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Kombinera till en sida +description: Foga ihop alla sidor i en PDF till en enda sammanhängande vertikal eller horisontell rullning. +--- + +# Kombinera till en sida + +Slå ihop varje sida i en PDF till en enda lång sida. Sidorna fogas ihop vertikalt (som en rulle) eller horisontellt (sida vid sida), vilket ger en sammanhängande sida i utdata. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Välj layoutriktning: **Vertikal** (sidor staplade uppifrån och ned) eller **Horisontell** (sidor placerade sida vid sida). +3. Ange avståndet mellan sidorna i punkter. +4. Välj en bakgrundsfärg för mellanrummen mellan sidorna. +5. Aktivera eventuellt avdelare (tunna linjer mellan sidorna) och ställ in deras tjocklek och färg. +6. Klicka på bearbetningsknappen. Utdata är en PDF med en enda sida. + +## Funktioner + +- Vertikal eller horisontell sammanfogning av sidor +- Konfigurerbart avstånd mellan sidorna +- Färgväljare för bakgrunden i mellanrummen +- Valfria avdelarlinjer med justerbar tjocklek och färg +- Återger varje originalsida i full upplösning på den kombinerade ytan + +## Alternativ + +| Alternativ | Beskrivning | +| ----------------------- | ---------------------------------------------------- | +| **Orientering** | Vertikal (staplad) eller horisontell (sida vid sida) | +| **Sidavstånd** | Mellanrum mellan sidorna i punkter | +| **Bakgrundsfärg** | Färg på området mellan sidorna | +| **Lägg till avdelare** | Slå på tunna linjer mellan sidorna | +| **Avdelarens tjocklek** | Linjetjocklek i punkter | +| **Avdelarens färg** | Färg på avdelarlinjerna | + +## Användningsfall + +- Skapa en enda lång bild av en flersidig wireframe eller designmockup +- Generera en sammanhängande rullbar vy av ett dokument för inbäddning på webben +- Foga ihop en flersidig serie eller storyboard till en enda remsa +- Skapa en panoramavy av på varandra följande sidor för granskning + +## Tips + +- Vertikal orientering fungerar bäst för dokument med stående sidor. Horisontell passar bättre för innehåll i liggande format. +- Stora dokument med många sidor ger en mycket hög eller bred utdata. Vissa PDF-visare kan få problem med extremt stora enskilda sidor. +- Avdelare i kontrasterande färg gör det lätt att se var en originalsida slutar och nästa börjar. + +## Relaterade verktyg + +- [N-Up PDF](./n-up-pdf) +- [Sammanfoga PDF](./merge-pdf) +- [Dela sidor](./divide-pages) diff --git a/docs/sv/tools/compare-pdfs.md b/docs/sv/tools/compare-pdfs.md new file mode 100644 index 00000000..5b1da9e9 --- /dev/null +++ b/docs/sv/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: 'Jämför PDF:er' +description: Jämför två PDF-dokument sida vid sida eller i överlagringsläge med detaljerad ändringsidentifiering och kategorisering. +--- + +# Jämför PDF:er + +Ladda upp två PDF-filer och se exakt vad som har ändrats mellan dem. Verktyget parar ihop sidor på ett smart sätt, identifierar skillnader i text, bilder, kommentarer, sidhuvuden och formatering och visar dem i en vy sida vid sida eller i överlagring. + +## Så fungerar det + +1. Ladda upp två PDF-filer: originalet (till vänster) och den reviderade versionen (till höger). +2. Verktyget parar ihop sidor mellan dokumenten med hjälp av innehållssignaturer. +3. Välj visningsläge: **Sida vid sida** eller **Överlagring**. +4. Navigera mellan sidpar med sidnumreringskontrollerna. +5. Skillnader markeras och kategoriseras. Använd filterpanelen för att fokusera på vissa typer av ändringar. +6. Exportera eventuellt jämförelsen som en PDF-rapport. + +## Funktioner + +- Automatisk sidparning baserad på innehållslikhet +- Jämförelsevyer sida vid sida och i överlagring +- Ändringskategorisering: text, bild, sidhuvud/sidfot, kommentar, formatering, bakgrund +- Filterreglage per kategori för att visa eller dölja vissa typer av ändringar +- Sökning bland textändringar med frågefilter +- OCR-stöd för jämförelse av skannade dokument +- Zoomkontroller för detaljgranskning +- Synkroniserad rullning mellan panelerna i läget sida vid sida +- Exportera jämförelseresultat som en PDF + +## Alternativ + +| Alternativ | Beskrivning | +| ------------------ | -------------------------------------------------------------------------------------------------- | +| **Visningsläge** | Sida vid sida eller överlagring | +| **OCR** | Aktivera/inaktivera OCR för jämförelse av skannade dokument | +| **OCR-språk** | Språk för OCR-textextrahering | +| **Kategorifilter** | Växla synligheten för ändringar i text, bild, sidhuvud/sidfot, kommentar, formatering och bakgrund | +| **Ändringsomfång** | I överlagringsläge: filtrera mellan alla ändringar eller endast innehåll | +| **Zoom** | Justera förstoringsnivån för detaljgranskning | + +## Användningsfall + +- Granska avtalsrevisioner för att se exakt vad som ändrats mellan versioner +- Jämföra designmockups för att kontrollera att PDF-exporter motsvarar förväntningarna +- Granska dokumentändringar i reglerade branscher där varje ändring måste spåras +- Kontrollera att en PDF-konvertering har bevarat originalinnehållet korrekt +- Kontrollera översättningsdokument mot källan för layoutändringar + +## Tips + +- Överlagringsvyn lägger båda dokumenten ovanpå varandra, så rumsliga skillnader (förflyttade element, storleksändrade bilder) syns direkt. +- Aktivera OCR när du jämför skannade dokument som saknar textlager. Jämförelsemotorn extraherar då text från sidbilderna. +- Använd kategorifilter för att fokusera på det som är viktigt. Dölj till exempel formateringsändringar när du bara bryr dig om skillnader i textinnehåll. + +## Relaterade verktyg + +- [Visa metadata](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Sammanfoga PDF](./merge-pdf) diff --git a/docs/sv/tools/compress-pdf.md b/docs/sv/tools/compress-pdf.md new file mode 100644 index 00000000..a43a7df8 --- /dev/null +++ b/docs/sv/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Komprimera PDF +description: Minska PDF-filens storlek med upp till 90 % med motorn Hyper Compress. Stöder målstorlekar, batchbearbetning och anpassade kvalitetsinställningar. +--- + +# Komprimera PDF + +Krymp dina PDF-filer utan att förstöra dem. Komprimera PDF drivs av [Hyper Compress](https://www.bentopdf.com/hyper-compress), BentoPDF:s egen komprimeringsmotor. Den komprimerar om bilder, skapar delmängder av och slår ihop typsnitt och tar bort onödig vikt som inbäddade miniatyrer och privata programdata. PDF-filen förblir fullt fungerande: texten kan fortfarande markeras, och länkar och formulärfält fortsätter att fungera. + +Hyper Compress är kompilerad till WebAssembly och levereras med BentoPDF, så komprimeringen fungerar offline och i isolerade miljöer utan extra konfiguration. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppytan eller dra in filer. +2. Välj en **Komprimeringsnivå**: Låg, Medel, Hög eller Förlustfri. +3. Ange eventuellt en **Målfilstorlek**, eller expandera **Anpassade inställningar** för finjustering, inklusive **Konvertera till gråskala**. +4. Klicka på **Komprimera PDF**. För flera filer får du en enda ZIP-nedladdning. + +## Särskilda dokument + +- **Digitalt signerade PDF-filer** returneras oförändrade, eftersom varje ändring skulle ogiltigförklara signaturen. Slå på **Åsidosätt innehållsskydd** under Anpassade inställningar för att ta bort signaturerna och komprimera dem. Den synliga signaturen finns kvar på sidan, men filen är inte längre signerad. +- **PDF/A-filer** förlorar sin PDF/A-märkning efter komprimering, så att filen aldrig påstår en överensstämmelse som den inte längre uppfyller. Slå på **Bevara PDF/A** under Anpassade inställningar för att i stället behålla överensstämmelsen. +- **Lösenordsskyddade PDF-filer** får ett lösenordsfält på sitt filkort. Ange lösenordet där så öppnar Hyper Compress filen själv, utan ett separat upplåsningssteg. Med två eller fler låsta filer låser ett gemensamt fält upp alla filer som använder samma lösenord. Den komprimerade kopian har inget lösenord. Använd [Skydda PDF](./protect-pdf) för att lägga till ett igen. +- **Skanningar utan textlager** kan krympa ännu mer med **Rasterisera sidor** under Anpassade inställningar, vilket ersätter varje sida med en optimerad bild. Det hoppas över för alla dokument som har markerbar text, inklusive OCR-behandlade skanningar, om inte **Åsidosätt innehållsskydd** är på. Då blir även textsidor bilder, så texten går inte längre att markera och länkar slutar fungera. + +## Komprimeringsnivåer + +| Nivå | Bildkvalitet | Max. upplösning | Bäst för | +| -------------- | ------------- | --------------- | -------------------------------- | +| **Låg** | 80 | 200 DPI | Bevara den visuella kvaliteten | +| **Medel** | 50 | 150 DPI | Vardagsdokument | +| **Hög** | 20 | 72 DPI | E-postbilagor, webbuppladdningar | +| **Förlustfri** | Bilder orörda | Oförändrad | Arkivkopior | + +Hög tar också bort inbäddningen av de 14 standardtypsnitten i PDF, samt liknande typsnitt som Arial när det är säkert. + +## Målfilstorlek + +Ange en storlek i KB eller MB så söker Hyper Compress efter den bästa bildkvalitet som ändå ryms, med utgångspunkt i den nivå du valde. Om dokumentet inte kan bli så litet får du den minsta version det kan skapa och ett meddelande om det. De särskilda sidorna, som [Komprimera PDF till 1 MB](https://www.bentopdf.com/compress-pdf-to-1mb), öppnas med målet redan ifyllt. + +## Anpassade inställningar + +Expandera panelen Anpassade inställningar för att justera Hyper Compress direkt. När du väljer en komprimeringsnivå återställs dessa till nivåns värden, och om du ändrar någon av dem växlar nivån till Anpassad. + +- **Åsidosätt innehållsskydd**: som standard lämnar Hyper Compress signerade PDF-filer orörda och rasteriserar inte sidor som har text. När detta slås på kringgås båda. Det förblir på när du ändrar nivå. + +- **Bilder**: bildkvalitet, maximal upplösning, tvingad omsampling, färgreducering, beskärning av osynliga bildområden, borttagning av alternativa bilder, förenkling av färgprofiler, JPEG 2000 och förlustfritt läge +- **Typsnitt**: skapande av delmängder, sammanslagning av dubbletter och borttagning av inbäddning av standardtypsnitt och deras liknande typsnitt +- **Innehåll**: platta till kommentarer, formulärfält eller länkar +- **Rensning**: ta bort miniatyrer, programdata, artikeltrådar, webbinsamlingsinformation, strukturträdet eller utdataavsikter +- **Rasterisera**: ersätta sidor med bilder, för skanningar som bara består av bilder. Hoppas över när dokumentet har markerbar text +- **Utdata**: Bevara PDF/A och Brotli-komprimering för PDF 2.0-läsare som stöder det + +## Användningsfall + +- Få en rapport på 50 MB under gränsen för e-postbilagor +- Få en skanning under en portals strikta uppladdningsgräns med en målfilstorlek +- Optimera marknadsförings-PDF:er för snabbare nedladdning från webbplatser +- Arkivera stora dokumentsamlingar där lagringskostnaden spelar roll +- Minska mobildataanvändningen när du delar PDF-filer via meddelandeappar + +## Tips + +- Börja med Medel. Om resultatet fortfarande är för stort, ange en målfilstorlek eller gå upp till Hög. +- För en skanning utan textlager, slå på Rasterisera sidor under Anpassade inställningar. +- Konvertera till gråskala, under Anpassade inställningar, kan minska filstorleken för färgtunga dokument. + +## Relaterade verktyg + +- [Linjärisera PDF](./linearize-pdf): optimera den komprimerade PDF-filen för snabb visning på webben +- [Rasterisera PDF](./rasterize-pdf): konvertera sidor till bilder med en viss DPI, även sidor med text +- [Reparera PDF](./repair-pdf): fixa en PDF som gick sönder vid komprimering någon annanstans +- [Ta bort metadata](./remove-metadata): ta bort dold data för integritetens skull diff --git a/docs/sv/tools/crop-pdf.md b/docs/sv/tools/crop-pdf.md new file mode 100644 index 00000000..cd256b4c --- /dev/null +++ b/docs/sv/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Beskär PDF +description: Beskär PDF-sidor visuellt genom att rita ett beskärningsområde på varje sida med en redigerare baserad på Cropper.js. +--- + +# Beskär PDF + +Trimma marginalerna på dina PDF-sidor med ett visuellt beskärningsgränssnitt. Rita en beskärningsrektangel direkt på varje sida, förhandsgranska resultatet och tillämpa beskärningen. Du kan ange olika beskärningsområden för olika sidor eller tillämpa samma beskärning på hela dokumentet. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Beskärningsredigeraren öppnas och visar den första sidan med ett dragbart beskärningsöverlägg. +3. Justera beskärningsrektangeln genom att dra i dess kanter eller hörn. +4. Använd sidnavigeringsknapparna för att flytta mellan sidor och ange beskärningsområden för var och en. +5. Klicka på **Beskär** för att tillämpa beskärningen och ladda ner resultatet. + +## Funktioner + +- Visuell beskärningsredigerare baserad på Cropper.js med handtag för exakt justering +- Navigering sida för sida för att ange enskilda beskärningsområden +- Sparar beskärningsinställningar per sida så att du kan ange olika beskärningar för olika sidor +- Liveförhandsgranskning av det valda beskärningsområdet +- Stöder PDF-filer med valfri sidstorlek eller orientering + +## Användningsfall + +- Ta bort breda marginaler från skannade dokument för att fokusera på innehållsytan +- Trimma bort skrivarens beskärningsmärken eller passmärken från PDF-filer för tryckförberedelse +- Beskära föreläsningsbilder för att ta bort området för talaranteckningar +- Ta bort sidhuvuden eller sidfötter från varje sida innan ett dokumentutdrag delas +- Ändra storlek på sidor för att passa en viss skärm eller utskriftslayout + +## Tips + +- Beskärningsöverlägget kan ändras i storlek och flyttas fritt. Dra i hörnen för proportionell storleksändring eller i kanterna för justering längs en axel. +- För dokument där varje sida behöver samma beskärning, ange den på första sidan. Verktyget kommer ihåg ditt beskärningsområde medan du navigerar mellan sidor. +- Om du behöver standardisera sidstorlekar i stället för att beskära visuellt kan verktyget Fixa sidstorlek passa bättre. + +## Relaterade verktyg + +- [PDF-redigerare](./edit-pdf) +- [Sidnummer](./page-numbers) +- [Ta bort tomma sidor](./remove-blank-pages) diff --git a/docs/sv/tools/csv-to-pdf.md b/docs/sv/tools/csv-to-pdf.md new file mode 100644 index 00000000..86f93edd --- /dev/null +++ b/docs/sv/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV till PDF +description: Konvertera CSV-kalkylbladsfiler till formaterade PDF-tabeller direkt i webbläsaren. +--- + +# CSV till PDF + +Förvandla CSV-filer till rena, formaterade PDF-dokument. Varje CSV-fil tolkas och återges som en tabell i PDF-utdata. Det är användbart när du behöver skriva ut eller dela tabelldata utan att mottagaren behöver ha kalkylprogram. + +## Format som stöds + +| Format | Filändelser | +| :----- | :---------- | +| CSV | `.csv` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp en eller flera CSV-filer. +2. Granska fillistan. Lägg till fler filer eller ta bort oönskade. +3. Klicka på **Konvertera till PDF**. En förloppsindikator visar konverteringens status. +4. En enskild fil laddas ner direkt som en PDF. Flera filer paketeras i `csv-converted.zip`. + +## Alternativ + +Det här verktyget har ingen ytterligare konfiguration. CSV-filen tolkas och formateras automatiskt som en tabell. + +## Utdata + +| Antal indata | Utdata | +| :----------- | :------------------------------------------------- | +| 1 fil | Enskild PDF-nedladdning (t.ex. `data.pdf`) | +| 2+ filer | ZIP-arkiv (`csv-converted.zip`) med en PDF per fil | + +## Användningsfall + +- Konvertera exporterade databasrapporter till utskrivbara PDF-tabeller +- Dela finansiella data eller lagerlistor med personer som inte har Excel +- Skapa PDF-versioner av CSV-loggfiler för efterlevnadsdokumentation +- Skriva ut adresslistor, betygsblad eller andra tabelldata som lagras som CSV + +## Tips + +- För bästa resultat bör din CSV använda vanliga kommatecken som avgränsare. Verktyget följer vanliga konventioner för CSV-tolkning. +- Om din CSV har många kolumner kan tabellen komprimeras för att passa sidbredden. Överväg att dela upp breda datamängder i flera filer. +- För Excel-filer (`.xls`, `.xlsx`), använd verktyget [Excel till PDF](./excel-to-pdf), som bevarar kalkylbladsformatering och flera blad. + +## Relaterade verktyg + +- [Excel till PDF](./excel-to-pdf) +- [Text till PDF](./txt-to-pdf) +- [JSON till PDF](./json-to-pdf) diff --git a/docs/sv/tools/delete-pages.md b/docs/sv/tools/delete-pages.md new file mode 100644 index 00000000..d3c199ca --- /dev/null +++ b/docs/sv/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Ta bort sidor +description: Ta bort vissa sidor från en PDF efter sidnummer, intervall eller visuellt val av miniatyrer. +--- + +# Ta bort sidor + +Ta bort oönskade sidor från ett PDF-dokument. Ange vilka sidor som ska tas bort genom att skriva sidnummer eller intervall, eller klicka direkt på sidminiatyrer för att markera dem för borttagning. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Verktyget återger miniatyrförhandsvisningar av varje sida. +2. Ange sidorna som ska tas bort i textfältet med intervallsyntax (t.ex. `2, 5-8`), eller klicka på miniatyrer för att växla dem. +3. Markerade sidor framhävs visuellt så att du kan bekräfta ditt val. +4. Klicka på bearbetningsknappen. En ny PDF skapas utan de valda sidorna. + +## Funktioner + +- Textbaserat sidval med intervallsyntax (`2, 5-8, 12`) +- Visuellt miniatyrrutnät för borttagning genom klick +- Förhandsgranskning i realtid som framhäver sidor markerade för borttagning +- Indatavalidering mot det faktiska sidantalet +- Behåller alla sidor som inte tas bort i ursprunglig ordning + +## Användningsfall + +- Ta bort tomma sidor eller utfyllnadssidor från ett skannat dokument +- Ta bort omslagssidor eller bilagor innan ett dokument delas +- Rensa bort utkastsidor som av misstag lämnats kvar i en slutlig PDF +- Ta bort sidor med känslig information före distribution + +## Tips + +- Att ta bort sidor påverkar inte innehållet eller formateringen på de återstående sidorna. Utdata är en trogen kopia av originalet utan de borttagna sidorna. +- Om du vill behålla bara vissa sidor i stället för att ta bort vissa passar [Extrahera sidor](./extract-pages) bättre. +- Miniatyrvyn läses in stegvis, så stora dokument förblir responsiva. + +## Relaterade verktyg + +- [Extrahera sidor](./extract-pages) +- [Duplicera & organisera](./organize-pdf) +- [Dela PDF](./split-pdf) diff --git a/docs/sv/tools/deskew-pdf.md b/docs/sv/tools/deskew-pdf.md new file mode 100644 index 00000000..12ee7deb --- /dev/null +++ b/docs/sv/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Räta upp PDF +description: Räta automatiskt upp lutande sidor i skannade PDF-filer med OpenCV-skevhetsdetektering. Justerbara inställningar för tröskel och DPI. +--- + +# Räta upp PDF + +Skannade dokument är sällan helt raka. Även en liten lutning gör OCR mindre exakt och utskrifter slarviga. Det här verktyget använder OpenCV:s bildbehandlingsalgoritmer för att upptäcka varje sidas skevhetsvinkel och rotera tillbaka den till vågrätt. + +## Så fungerar det + +1. Ladda upp en eller flera skannade PDF-filer. +2. Ange **Skevhetströskel**. Sidor med en upptäckt skevhet under detta värde lämnas orörda. +3. Välj **Bearbetningskvalitet (DPI)**. Högre DPI ger bättre detekteringsnoggrannhet men tar längre tid. +4. Klicka på **Räta upp PDF**. +5. Efter bearbetningen visar en resultatpanel varje sidas upptäckta vinkel och om den korrigerades. + +## Alternativ + +| Inställning | Värden | Standard | +| -------------------- | ------------------------- | -------- | +| **Skevhetströskel** | 0,1, 0,5, 1,0, 2,0 grader | 0,5 | +| **Bearbetnings-DPI** | 100, 150, 200, 300 | 150 | + +## Så fungerar skevhetsdetektering + +Verktyget återger varje sida som en bild med vald DPI och använder sedan OpenCV för att upptäcka dominerande linjevinklar i innehållet. Om den upptäckta skevheten överstiger tröskeln roteras sidan med den omvända vinkeln för att räta upp den. Sidor under tröskeln förs vidare oförändrade. + +## Användningsfall + +- Rensa upp batchskannade avtal eller juridiska dokument +- Förbereda skannade kvitton eller fakturor för OCR-bearbetning +- Räta upp sidor från en planskanner där pappret placerats ojämnt +- Förbättra den visuella kvaliteten på digitaliserat arkivmaterial + +## Tips + +- Sänk tröskeln till 0,1 grader om du behöver pixelperfekt justering för OCR. +- 150 DPI är snabbt och exakt för de flesta dokument. Använd 300 DPI för mycket liten text eller sidor med fina detaljer. +- Uträtning fungerar bäst på dokument med tydliga horisontella textrader. Det kan ha svårt med sidor som mest består av bilder eller diagonala designelement. + +## Relaterade verktyg + +- [Rasterisera PDF](./rasterize-pdf): konvertera den uträtade utdatan till en platt, bildbaserad PDF +- [Komprimera PDF](./compress-pdf): minska filstorleken efter uträtning +- [Reparera PDF](./repair-pdf): åtgärda strukturella problem i skannade PDF-filer diff --git a/docs/sv/tools/digital-sign-pdf.md b/docs/sv/tools/digital-sign-pdf.md new file mode 100644 index 00000000..f3b63654 --- /dev/null +++ b/docs/sv/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Digital signatur +description: Lägg till kryptografiska digitala signaturer i PDF-filer med X.509-certifikat. Stöder formaten PKCS#12 och PEM med alternativ för synlig signatur. +--- + +# Digital signatur + +En digital signatur är kryptografiskt bevis på att en viss person har undertecknat ett dokument och att dokumentet inte har ändrats sedan dess. Till skillnad från en ritad signatur (som bara är en bild) använder en digital signatur X.509-certifikat och PKCS#7-standarder för att ge verifierbar äkthet och integritet. + +BentoPDF tillämpar digitala signaturer helt i din webbläsare. Din privata nyckel lämnar aldrig din enhet. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Ladda upp din certifikatfil (.pfx, .p12 eller .pem). +3. Ange certifikatets lösenord för att låsa upp det. Verktyget visar certifikatets ämne, utfärdare och giltighetstid. +4. Konfigurera eventuellt signaturens metadata (orsak, plats, kontaktinformation). +5. Aktivera eventuellt en **synlig signatur** med anpassning av position, storlek, bild och text. +6. Klicka på **Signera PDF**. + +## Certifikatformat som stöds + +| Format | Filändelser | Beskrivning | +| ----------- | ----------- | -------------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Branschstandardpaket med den privata nyckeln och certifikatkedjan. Det vanligaste formatet. | +| **PEM** | .pem | Textbaserat format. Måste innehålla både certifikatet och den privata nyckeln i en fil. Stöder krypterade privata nycklar. | + +## Alternativ för synlig signatur + +När det är aktiverat återges ett synligt signaturblock på PDF-sidan: + +- **Position**: X/Y-koordinater samt bredd/höjd i punkter +- **Sida**: Första sidan, sista sidan, alla sidor eller ett visst sidnummer +- **Bild**: Ladda upp en PNG-, JPG- eller WebP-bild (din handskrivna signatur, företagsstämpel osv.) +- **Text**: Anpassad text med konfigurerbar färg och teckenstorlek. Om ingen bild eller text anges genererar verktyget automatiskt text från certifikatets Common Name och dagens datum. + +## Signaturmetadata + +- **Orsak**: Varför dokumentet signerades (t.ex. "Godkänt", "Granskat") +- **Plats**: Var signeringen ägde rum (t.ex. "Stockholm") +- **Kontaktinformation**: Hur du når undertecknaren (t.ex. e-postadress) + +## Anmärkning om internetanslutning + +Signering kan kräva en internetanslutning. Signeringsbiblioteket hämtar certifikatkedjan från URL:er som finns i certifikatets tillägg Authority Information Access (AIA). Om dessa servrar inte kan nås misslyckas signeringen för certifikat som kräver kedjevalidering. + +## Användningsfall + +- Signera avtal, offerter och överenskommelser med juridiskt bindande digitala signaturer +- Certifiera officiella dokument i arbetsflöden som kräver PKI-baserad autentisering +- Signera PDF-fakturor för regelefterlevnad (många EU-länder kräver digitalt signerade e-fakturor) +- Lägga till organisatoriskt godkännande på ritningar eller kvalitetsdokument + +## Tips + +- Självsignerade certifikat fungerar för testning men ger varningar i Adobe Reader. Använd ett certifikat från en betrodd certifikatutfärdare för produktionsdokument. +- Den synliga signaturen är enbart visuell. Den kryptografiska signaturen bäddas in oavsett om det synliga blocket är aktiverat. +- Verifiera din signerade PDF med verktyget Validera PDF-signatur för att bekräfta att signaturen är intakt. + +## Relaterade verktyg + +- [Validera PDF-signatur](./validate-signature-pdf): verifiera digitala signaturer i signerade PDF-filer +- [Platta till PDF](./flatten-pdf): platta till formulär före signering för att förhindra ändringar +- [Skydda PDF](./protect-pdf): lägg till lösenordsskydd ovanpå den digitala signaturen +- [Ta bort metadata](./remove-metadata): ta bort metadata före signering diff --git a/docs/sv/tools/divide-pages.md b/docs/sv/tools/divide-pages.md new file mode 100644 index 00000000..582c26f1 --- /dev/null +++ b/docs/sv/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Dela sidor +description: Dela PDF-sidor horisontellt eller vertikalt i mindre delsidor. +--- + +# Dela sidor + +Skär enskilda PDF-sidor i halvor genom att dela dem horisontellt eller vertikalt. Det är användbart när en enda sida innehåller material som bör delas upp i separata sidor, till exempel en tvåkolumnslayout som skannats som en bred sida. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Välj delningsriktning: **Vertikal** (vänster/höger halva) eller **Horisontell** (övre/nedre halva). +3. Ange eventuellt ett sidintervall för att begränsa vilka sidor som delas. Lämna tomt för att dela alla sidor. +4. Klicka på bearbetningsknappen för att skapa den delade PDF-filen. + +## Funktioner + +- Vertikal delning: delar varje sida i en vänster och en höger halva +- Horisontell delning: delar varje sida i en övre och en nedre halva +- Sidintervallfilter för att selektivt dela vissa sidor +- Sidor som inte omfattas förs vidare oförändrade +- Bevarar innehållskvaliteten utan omrendering + +## Användningsfall + +- Separera skannade sidor med två sidor per ark (t.ex. en boksökning med vänster och höger sida på samma ark) +- Dela en liggande PDF med innehåll sida vid sida i enskilda stående sidor +- Dela höga infografiker eller affischer i separata övre och nedre delar +- Förbereda bredformatsdokument för utskrift på standardpapper + +## Tips + +- Om innehållet på dina sidor är ojämnt fördelat sker delningen ändå exakt på mittpunkten. För asymmetriska delningar kan du i stället överväga [Beskär PDF](./crop-pdf). +- Kombinera det här verktyget med [Rotera PDF](./rotate-pdf) om dina sidor behöver roteras före eller efter delningen. + +## Relaterade verktyg + +- [Dela PDF](./split-pdf) +- [Beskär PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Postera PDF](./posterize-pdf) diff --git a/docs/sv/tools/duplex-collate.md b/docs/sv/tools/duplex-collate.md new file mode 100644 index 00000000..fbb0be97 --- /dev/null +++ b/docs/sv/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Sortera dubbelsidig skanning +description: Ordna om PDF-filer från dubbelsidig skanning där framsidor och baksidor ligger i separata block till rätt ordning för fram- och baksidor. +--- + +# Sortera dubbelsidig skanning + +Sortera dubbelsidig skanning är avsett för ADF-skanningsflöden där en PDF innehåller två block med sidor: + +- alla framsidor först +- alla baksidor sedan + +I stället för att manuellt dela upp och sätta ihop igen flätar det här verktyget ihop de två blocken till naturlig läsordning: framsida1, baksida1, framsida2, baksida2 och så vidare. + +## Så fungerar det + +1. Ladda upp en enda PDF som skapats genom skanning av en dubbelsidig bunt. +2. Ange delningspunkten där framsideblocket slutar. +3. Välj hur baksideblocket hanteras: + - **Vänd baksideblocket** (vanligt när bunten vänds innan baksidorna skannas) + - **Behåll baksideblocket som det är** +4. Klicka på **Sortera PDF** för att ladda ner det omordnade resultatet. + +## Alternativ + +- **Identifiera delning automatiskt (hälften)**: sätter delningspunkten till `ceil(totalPages / 2)`. +- **Varning för udda sidantal**: varnar när det totala antalet sidor är udda (ofta ett skanningsfel). +- **Bekräftelse vid ojämna block**: ber om bekräftelse när fram- och baksideblockens storlekar skiljer sig åt. +- **Grupperad export**: dela upp den sorterade utdatan i separata PDF-filer baserat på det ursprungliga dokumentets sidantal och ladda ner som ZIP. + +## Utdatabeteende + +- **Standard**: en utdata-PDF (en indata-PDF ger en utdata-PDF). +- **Grupperat läge**: utdatan delas upp efter ditt värde för sidor per dokument. Om flera delar skapas laddas de ner som en ZIP, annars laddas en enda PDF ner. + +Om blockstorlekarna är ojämna sorteras de parade sidorna först, och återstående oparade sidor läggs till i slutet. + +## Vanliga användningsfall + +- Återställa ordningen efter att en hög dubbelsidiga formulär skannats i två omgångar. +- Bygga upp fram-/baksidepaket från kontorsskannrar som matar ut alla framsidor och sedan alla baksidor. +- Efterbearbeta arkivskanningar innan de delas upp i filer per dokument. + +## Tips + +- De flesta dubbelsidiga batcher bör ha ett jämnt totalt sidantal. +- Om baksidorna ser omvända ut, växla mellan **Vänd baksideblocket** och **Behåll baksideblocket som det är**. +- För original med 2 sidor (fram- och baksida), använd grupperad export med `2` sidor per dokument. + +## Relaterade verktyg + +- [Alternera & blanda sidor](./alternate-merge) +- [Dela PDF](./split-pdf) +- [Sammanfoga PDF](./merge-pdf) +- [Duplicera & organisera](./organize-pdf) diff --git a/docs/sv/tools/edit-attachments.md b/docs/sv/tools/edit-attachments.md new file mode 100644 index 00000000..c8a7fc8c --- /dev/null +++ b/docs/sv/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Redigera bilagor +description: Visa och ta selektivt bort filbilagor som är inbäddade i ett PDF-dokument. +--- + +# Redigera bilagor + +Granska och hantera filbilagorna i en PDF. Verktyget listar varje inbäddad fil med namn och bilagenivå och låter dig sedan markera enskilda bilagor för borttagning eller ta bort alla på en gång. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Verktyget söker automatiskt efter bilagor och visar dem i en lista. +3. Varje bilaga visar sitt filnamn och om den är en bilaga på dokumentnivå eller sidnivå. +4. Klicka på papperskorgsikonen bredvid en bilaga för att markera den för borttagning (klicka igen för att avmarkera). +5. Använd knappen **Ta bort alla bilagor** för att markera allt på en gång, eller **Avmarkera alla** för att rensa dina val. +6. Klicka på bearbetningsknappen för att spara en ny PDF där de valda bilagorna har tagits bort. + +## Funktioner + +- Listar alla bilagor på dokument- och sidnivå +- Borttagning av enskilda bilagor eller i bulk +- Slå markeringen på och av innan ändringarna genomförs +- Visuell genomstrykning och ändrad opacitet för objekt markerade för borttagning +- Laddar ner den ändrade PDF-filen utan de valda bilagorna + +## Användningsfall + +- Ta bort föråldrade eller felaktiga filer som bäddats in i ett dokument innan det distribueras på nytt +- Ta bort känsliga bilagor (finansiella data, personlig information) från en PDF innan den delas +- Minska PDF-filens storlek genom att ta bort stora inbäddade filer som inte längre behövs +- Granska inbäddat innehåll och rensa ett dokument före arkivering + +## Tips + +- Bilagor markerade för borttagning visas med en visuell genomstrykning. Du kan växla tillbaka dem före bearbetningen om du ändrar dig. +- Om inga bilagor hittas visar verktyget ett tydligt meddelande om att inga bilagor hittades. PDF-filen innehåller helt enkelt inga inbäddade filer. + +## Relaterade verktyg + +- [Lägg till bilagor](./add-attachments) +- [Extrahera bilagor](./extract-attachments) +- [Visa metadata](./view-metadata) diff --git a/docs/sv/tools/edit-metadata.md b/docs/sv/tools/edit-metadata.md new file mode 100644 index 00000000..5212cb21 --- /dev/null +++ b/docs/sv/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Redigera metadata +description: Visa och ändra PDF-metadatafält, inklusive titel, författare, nyckelord, datum och anpassade egenskaper. +--- + +# Redigera metadata + +Redigera metadatan som är inbäddad i en PDF-fil. Verktyget fyller i ett formulär med dokumentets befintliga metadata, låter dig ändra vilket fält som helst och sparar ändringarna i en ny PDF. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Verktyget läser dess nuvarande metadata och fyller i formuläret. +2. Redigera något av standardfälten: Titel, Författare, Ämne, Nyckelord, Skapare, Producent. +3. Justera Skapandedatum och Ändringsdatum med datum- och tidväljarna. +4. Lägg till anpassade metadatafält genom att klicka på lägg till-knappen och ange ett nyckel-värde-par. +5. Klicka på bearbetningsknappen för att spara den ändrade PDF-filen. + +## Funktioner + +- Fyller i all befintlig metadata från den uppladdade PDF-filen +- Standardfält: Titel, Författare, Ämne, Nyckelord, Skapare, Producent +- Datum- och tidväljare för Skapandedatum och Ändringsdatum +- Anpassade nyckel-värde-metadatafält för valfria egenskaper +- Sparar ändringar direkt i PDF-filens dokumentinformationsordlista + +## Redigerbara fält + +| Fält | Beskrivning | +| ------------------ | ----------------------------------------------------- | +| **Titel** | Dokumenttiteln som visas i PDF-läsare | +| **Författare** | Personen eller organisationen som skapade dokumentet | +| **Ämne** | En kort beskrivning av dokumentets ämne | +| **Nyckelord** | Kommaseparerade termer för sökning och kategorisering | +| **Skapare** | Programmet som ursprungligen skapade innehållet | +| **Producent** | Programmet som genererade PDF-filen | +| **Skapandedatum** | När dokumentet ursprungligen skapades | +| **Ändringsdatum** | När dokumentet senast ändrades | +| **Anpassade fält** | Alla ytterligare nyckel-värde-par som du definierar | + +## Användningsfall + +- Ange en korrekt titel och författare innan ett dokument publiceras +- Lägga till nyckelord för att förbättra sökbarheten i dokumenthanteringssystem +- Uppdatera ändringsdatumet så att det speglar den aktuella revisionen +- Lägga till anpassade metadatafält som Avdelning, Projekt-ID eller Klassificering +- Rensa upp metadata som lämnats kvar av det ursprungliga skrivprogrammet + +## Tips + +- Anpassade fält skrivs direkt i PDF-filens informationsordlista. Vissa PDF-läsare visar kanske inte anpassade fält, men de bevaras i filen. +- Lämna ett fält tomt för att rensa det från metadatan. Bearbetningsknappen sparar det som finns i formuläret. +- För att visa metadata utan att redigera, använd [Visa metadata](./view-metadata). För att ta bort all metadata helt, använd Ta bort metadata. + +## Relaterade verktyg + +- [Visa metadata](./view-metadata) +- [PDF OCG](./pdf-layers) +- [Komprimera PDF](./compress-pdf) diff --git a/docs/sv/tools/edit-pdf.md b/docs/sv/tools/edit-pdf.md new file mode 100644 index 00000000..268cc7f1 --- /dev/null +++ b/docs/sv/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF-redigerare +description: Kommentera, markera, maskera, lägg till former och bilder, sök och visa PDF-filer direkt i webbläsaren. +--- + +# PDF-redigerare + +BentoPDF:s PDF-redigerare låter dig kommentera, markera, maskera, kommentera i text, lägga till former och bilder och söka i dina PDF-filer. Den läser in en fullfjädrad redigerare direkt i webbläsaren utan serveruppladdningar. + +## Så fungerar det + +1. Ladda upp din PDF genom att klicka på släppytan eller dra en fil dit. +2. Den inbäddade PDF-redigeraren öppnas automatiskt med ditt dokument inläst. +3. Använd verktygsfältet för att kommentera, markera, maskera, lägga till text, rita former eller infoga bilder. +4. Klicka på **Ladda ner redigerad PDF** för att spara dina ändringar. + +## Funktioner + +- Fullständigt kommentarsverktygsfält med markering, understrykning, genomstrykning och frihandsritning +- Textinfogning och kommentarer +- Maskeringsverktyg som permanent tar bort markerat innehåll när du tillämpar maskeringen. Om några markeringar inte har tillämpats när du klickar på **Ladda ner redigerad PDF** erbjuder redigeraren att tillämpa dem först. +- Formverktyg för rektanglar, cirklar, linjer och pilar +- Bildinfogning på PDF-sidor +- Inbyggd textsökning i hela dokumentet +- Stöd för flera dokument med flikar (upp till 10 dokument öppna samtidigt) +- Filinläsning med dra och släpp + +## Användningsfall + +- Granska avtal och markera ändringar med markeringar och kommentarer +- Maskera konfidentiell information som personnummer eller finansiella data innan delning +- Lägga till kommentarer på arkitektritningar eller tekniska ritningar +- Infoga företagslogotyper eller stämplar på dokumentsidor +- Söka efter vissa termer i långa juridiska dokument + +## Tips + +- Du kan öppna flera PDF-filer samtidigt och växla mellan dem med flikfältet högst upp i redigeraren. +- Redigeraren bevarar den ursprungliga PDF-strukturen, så typsnitt, layouter och formulärfält förblir intakta. +- Att markera text eller ett område för maskering tar inte bort något förrän maskeringen tillämpas. När du maskerar markerad text tas även kopior av den i filens egenskaper, bokmärken, kommentarer och bilagor bort från nedladdningen, om inte filen är krypterad. +- För massvis med vattenstämplar eller sidnumrering, använd de särskilda verktygen i stället för mer kontroll över formateringen. + +## Relaterade verktyg + +- [Lägg till vattenstämpel](./add-watermark) +- [Signera PDF](./sign-pdf) +- [Lägg till stämplar](./add-stamps) +- [Ta bort anteckningar](./remove-annotations) diff --git a/docs/sv/tools/email-to-pdf.md b/docs/sv/tools/email-to-pdf.md new file mode 100644 index 00000000..3a1f033d --- /dev/null +++ b/docs/sv/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-post till PDF +description: Konvertera e-postfiler i formaten EML och MSG till PDF i webbläsaren. Bevarar sidhuvuden, brödtext och bilagelista. +--- + +# E-post till PDF + +Konvertera sparade e-postfiler till rena, utskrivbara PDF-filer. Verktyget tolkar EML- och MSG-filer, extraherar hela meddelandet (sidhuvuden, brödtext och bilagemetadata) och återger allt i en strukturerad PDF. Användbart för juridisk bevisinsamling, arkivering eller bara för att skriva ut ett viktigt e-postmeddelande. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----- | :--------- | :----------------------------------------------------------------------- | +| EML | `.eml` | Standardformat för MIME-e-post (exporteras från de flesta e-postprogram) | +| MSG | `.msg` | Microsoft Outlooks egna format | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina EML- eller MSG-filer. Du kan blanda båda formaten i samma batch. +2. Granska fillistan. Ta bort oönskade poster med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att ta med fler e-postmeddelanden. +3. Konfigurera konverteringsalternativen (se nedan). +4. Klicka på **Konvertera till PDF**. Verktyget tolkar varje e-postmeddelande, återger innehållet som formaterad HTML och konverterar det till PDF via PyMuPDF-motorn. +5. Ett enskilt e-postmeddelande laddas ner direkt som en PDF. Flera e-postmeddelanden paketeras i `emails-converted.zip`. + +## Alternativ + +| Alternativ | Standard | Beskrivning | +| :------------------------ | :------- | :----------------------------------------------------------------------------------------------------- | +| **Sidstorlek** | A4 | Välj mellan sidmåtten A4, Letter eller Legal. | +| **Inkludera Cc och Bcc** | På | När det är aktiverat visas mottagarlistorna för Cc och Bcc i e-postens sidhuvudsavsnitt i PDF-filen. | +| **Inkludera bilagelista** | På | När det är aktiverat visas en lista över e-postens filbilagor (med filnamn och storlekar) i PDF-filen. | + +## Användningsfall + +- Arkivera viktig affärskorrespondens som PDF för efterlevnad eller revision +- Skriva ut e-posttrådar för rättsliga förfaranden eller begäranden om bevisinsamling +- Skapa en permanent post över orderbekräftelser, kvitton eller avtal som mottagits via e-post +- Säkerhetskopiera Outlook MSG-filer i ett format som inte kräver Outlook för att läsas +- Dokumentera kundsupportärenden från exporterade EML-filer + +## Tips + +- Både EML (används av Thunderbird, Apple Mail och de flesta e-postprogram) och Outlook MSG-filer stöds. Exportera e-postmeddelanden från ditt e-postprogram och släpp dem direkt i verktyget. +- HTML-formaterade e-postmeddelanden behåller sin formatering i PDF-filen. E-postmeddelanden i ren text återges med en ren och läsbar formatering. +- Bilagelistan visar filnamn och storlekar men bäddar inte in själva bilagefilerna i PDF-filen. + +## Relaterade verktyg + +- [XML till PDF](./xml-to-pdf) +- [XPS till PDF](./xps-to-pdf) diff --git a/docs/sv/tools/epub-to-pdf.md b/docs/sv/tools/epub-to-pdf.md new file mode 100644 index 00000000..848ccdb1 --- /dev/null +++ b/docs/sv/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB till PDF +description: Konvertera EPUB-e-böcker till PDF i webbläsaren. Gratis, ingen uppladdning krävs, konvertering med integriteten främst. +--- + +# EPUB till PDF + +Konvertera EPUB-e-böcker till PDF-filer utan att lämna webbläsaren. EPUB är den öppna standarden för digitala böcker, men ibland behöver du en PDF med fast layout för utskrift, kommentarer eller delning med personer som inte har en e-boksläsare. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----- | :--------- | :----------------------- | +| EPUB | `.epub` | EPUB 2- och EPUB 3-filer | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina EPUB-filer. Flera filer kan väljas samtidigt. +2. Granska de uppladdade filerna. Ta bort oönskade poster med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att utöka batchen. +3. Klicka på **Konvertera till PDF**. PyMuPDF-motorn återger EPUB-innehållet (text, bilder och formatering) som sidindelad PDF-utdata. +4. En enskild EPUB laddas ner direkt som en PDF. Flera filer paketeras i ett ZIP-arkiv med namnet `epub-converted.zip`. + +## Alternativ + +Konverteringen körs med rimliga standardvärden och kräver ingen konfiguration. Texten flödar om till standardmått för sidor, och inbäddade typsnitt och bilder förs över till PDF-filen. + +## Användningsfall + +- Skriva ut en DRM-fri e-bok för läsning bort från skärmar +- Skicka in ett EPUB-manus som en PDF med fast layout för granskning +- Arkivera digitala böcker i ett format som alla operativsystem kan öppna direkt +- Dela ett kapitel med en kollega som inte har en EPUB-läsare +- Konvertera teknisk dokumentation som distribueras som EPUB till PDF-filer som går att kommentera + +## Tips + +- EPUB 3-funktioner som inbäddat ljud och video förs inte över till PDF, men all text, alla bilder och tabeller konverteras rent. +- För bästa resultat med kraftigt formaterade EPUB-filer, kontrollera de första sidorna i utdatan för att bekräfta att layouten är trogen. + +## Relaterade verktyg + +- [MOBI till PDF](./mobi-to-pdf) +- [FB2 till PDF](./fb2-to-pdf) +- [CBZ till PDF](./cbz-to-pdf) diff --git a/docs/sv/tools/excel-to-pdf.md b/docs/sv/tools/excel-to-pdf.md new file mode 100644 index 00000000..10a8a1c3 --- /dev/null +++ b/docs/sv/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel till PDF +description: Konvertera Excel-kalkylblad (XLS, XLSX), ODS- och CSV-filer till PDF med bevarad formatering. +--- + +# Excel till PDF + +Konvertera kalkylbladsfiler till PDF. Verktyget hanterar moderna Excel-filer, det äldre XLS-formatet, OpenDocument-kalkylblad och till och med CSV, allt återgivet genom en webbläsarbaserad LibreOffice-motor som bevarar cellformatering, formler (som beräknade värden), diagram och layouter med flera blad. + +## Format som stöds + +| Format | Filändelser | +| :---------------------- | :---------- | +| Excel (modernt) | `.xlsx` | +| Excel (äldre) | `.xls` | +| OpenDocument-kalkylblad | `.ods` | +| CSV | `.csv` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina kalkylbladsfiler. +2. Granska fillistan. Lägg till fler filer eller ta bort oönskade. +3. Klicka på **Konvertera till PDF**. LibreOffice-motorn startas vid första användningen och bearbetar sedan varje fil. +4. En enskild fil laddas ner direkt som en PDF. Flera filer levereras som `excel-converted.zip`. + +## Alternativ + +Det här verktyget har ingen ytterligare konfiguration. LibreOffice-motorn bestämmer sidlayout, skalning och utskriftsområde utifrån kalkylbladets inbyggda inställningar. + +## Utdata + +| Antal indata | Utdata | +| :----------- | :----------------------------------------------------------------- | +| 1 fil | Enskild PDF-nedladdning (originalfilnamnet med filändelsen `.pdf`) | +| 2+ filer | ZIP-arkiv (`excel-converted.zip`) med en PDF per fil | + +## Användningsfall + +- Konvertera finansiella rapporter eller budgetar från Excel till PDF för distribution +- Skapa utskriftsklara PDF-filer från kalkylblad med lager eller produktkataloger +- Dela dataanalysresultat med intressenter som inte har Excel installerat +- Arkivera kvartalsrapporter i ett format som inte kan redigeras +- Konvertera ODS-filer från LibreOffice Calc till PDF + +## Tips + +- Diagram som är inbäddade i kalkylbladet återges i PDF-filen. Kontrollera att de ser rätt ut i källfilen innan du konverterar. +- Om ditt kalkylblad har flera blad ingår alla blad i PDF-utdatan. +- För enkel CSV-data utan formatering ger verktyget [CSV till PDF](./csv-to-pdf) en lättare konvertering. Använd Excel till PDF när du behöver bevara formatering, diagram eller flera blad. + +## Relaterade verktyg + +- [CSV till PDF](./csv-to-pdf) +- [Word till PDF](./word-to-pdf) +- [PowerPoint till PDF](./powerpoint-to-pdf) diff --git a/docs/sv/tools/extract-attachments.md b/docs/sv/tools/extract-attachments.md new file mode 100644 index 00000000..d234207b --- /dev/null +++ b/docs/sv/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Extrahera bilagor +description: Extrahera alla inbäddade filbilagor från en eller flera PDF-filer och ladda ner dem som ett ZIP-arkiv. +--- + +# Extrahera bilagor + +Hämta ut varje inbäddad bilaga från en eller flera PDF-filer. Alla extraherade filer paketeras i ett enda ZIP-arkiv för nedladdning. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer som innehåller inbäddade bilagor. +2. Klicka på **Extrahera bilagor**. +3. Verktyget söker igenom varje PDF efter bilagor på dokument- och sidnivå. +4. Alla hittade filer paketeras i ett ZIP-arkiv och laddas ner automatiskt. +5. Ett statusmeddelande bekräftar hur många bilagor som hittades och deras totala storlek. + +## Funktioner + +- Batchextrahering från flera PDF-filer på en gång +- Extraherar både bilagor på dokumentnivå och sidnivå +- Ger en enda ZIP-fil med alla extraherade filer +- Visar totalt antal bilagor och sammanlagd filstorlek +- Tydliga statusmeddelanden om inga bilagor hittas + +## Användningsfall + +- Återskapa datafiler som är inbäddade i en rapport-PDF +- Hämta ut bildresurser ur en portfölj eller ett specifikationsdokument +- Extrahera kompletterande material från utbildnings- eller efterlevnads-PDF:er +- Granska vilka filer som är inbäddade i en grupp PDF-filer + +## Tips + +- Om verktyget rapporterar att inga bilagor finns kan PDF-filen i stället innehålla inbäddade bilder eller formulärdata, vilka inte är filbilagor. Använd [Extrahera bilder](./extract-images) för inbäddade bilder. +- När flera PDF-filer bearbetas hamnar alla bilagor från varje fil i en ZIP. Filnamnen bevaras från de ursprungliga inbäddningarna. + +## Relaterade verktyg + +- [Lägg till bilagor](./add-attachments) +- [Redigera bilagor](./edit-attachments) +- [Extrahera bilder](./extract-images) diff --git a/docs/sv/tools/extract-images.md b/docs/sv/tools/extract-images.md new file mode 100644 index 00000000..17e2fb1e --- /dev/null +++ b/docs/sv/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Extrahera bilder +description: Extrahera alla inbäddade bilder från PDF-filer. Förhandsgranska dem i ett rutnät och ladda ner dem enskilt eller som ett ZIP-arkiv. +--- + +# Extrahera bilder + +Hämtar ut alla inbäddade bilder från en eller flera PDF-filer. Extraherade bilder visas i ett förhandsgranskningsrutnät där du kan ladda ner dem enskilt, eller ta allt på en gång som en ZIP. Drivs av PyMuPDF. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppytan eller dra filer dit. Lägg till fler filer eller ta bort enskilda efter behov. +2. Klicka på **Extrahera** för att starta bearbetningen. +3. Verktyget söker igenom varje sida i varje uppladdad PDF och hittar och extraherar inbäddade bilder. +4. Extraherade bilder visas i ett rutnät med miniatyrer. Varje bild har en nedladdningsknapp. +5. Klicka på **Ladda ner alla** för att spara allt som ett ZIP-arkiv. + +## Alternativ + +Det här verktyget har inga konfigurerbara alternativ. Alla inbäddade bilder extraheras i sitt ursprungliga format (vanligtvis PNG, JPEG eller vilket format som användes när bilden bäddades in i PDF-filen). + +## Utdataformat + +- Bilder visas i ett förhandsgranskningsrutnät med namnen `image_1.png`, `image_2.jpg` osv. +- **Ladda ner alla** ger `extracted-images.zip` med alla bilder. +- Enskilda bilder kan laddas ner en i taget från rutnätet. + +## Användningsfall + +- Återskapa foton eller grafik från en PDF för återanvändning i ett annat projekt. +- Extrahera produktbilder från en katalog-PDF för en e-handelsannons. +- Hämta ut diagram från teknisk dokumentation för användning i presentationer. +- Granska vilka bilder som är inbäddade i ett dokument innan det delas. + +## Tips + +- Verktyget extraherar bilder precis som de lagras i PDF-filen. Det återger inte sidor som bilder. För det, använd [PDF till PNG](./pdf-to-png) eller [PDF till JPG](./pdf-to-jpg). +- Om verktyget rapporterar "Inga bilder hittades" kan PDF-filen använda vektorgrafik i stället för inbäddade rasterbilder, eller så kan det vara ett skannat dokument där hela sidan är en enda stor bild. +- Batchbearbetning fungerar över flera PDF-filer. Alla bilder från alla filer kombineras i ett enda rutnät och en enda ZIP. + +## Relaterade verktyg + +- [PDF till PNG](./pdf-to-png) +- [PDF till JPG](./pdf-to-jpg) +- [PDF-arbetsflödesbyggare](./pdf-workflow) diff --git a/docs/sv/tools/extract-pages.md b/docs/sv/tools/extract-pages.md new file mode 100644 index 00000000..69abebb2 --- /dev/null +++ b/docs/sv/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Extrahera sidor +description: Spara ett visst sidintervall från en PDF som ett nytt dokument. +--- + +# Extrahera sidor + +Hämta ut en uppsättning sidor ur en PDF och spara dem som en ny fil. Ange exakt vilka sidor du vill ha med intervallsyntax, så skapar verktyget en ren PDF som bara innehåller de sidorna. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Verktyget visar filnamn, storlek och totalt sidantal. +2. Ange sidorna du vill extrahera med intervallsyntax (t.ex. `1-5`, `3, 7, 10-12`). +3. Välj eventuellt att ladda ner varje intervall som en separat PDF i ett ZIP-arkiv. +4. Klicka på bearbetningsknappen. De extraherade sidorna laddas ner som en ny PDF (eller ZIP). + +## Funktioner + +- Flexibel syntax för sidintervall: enskilda sidor, intervall eller kommaseparerade kombinationer +- Visar totalt sidantal efter uppladdning för enkel referens +- Alternativ att mata ut en enda kombinerad PDF eller separata filer i en ZIP +- Bevarar originalsidornas innehåll och formatering + +## Användningsfall + +- Hämta ut sammanfattningen (de första sidorna) ur en lång rapport +- Extrahera ett enskilt kapitel ur en läroboks-PDF +- Spara vissa sidor från ett formulärpaket som fristående dokument +- Skapa ett exempeldokument av utvalda sidor från en större fil + +## Tips + +- Sidnumren börjar på 1. Använd `1` för första sidan, inte `0`. +- För att ta bort sidor i stället för att extrahera dem, använd [Ta bort sidor](./delete-pages), som är den omvända åtgärden. +- Om du behöver visuellt sidval med miniatyrer, använd [Dela PDF](./split-pdf) i läget Visuellt val. + +## Relaterade verktyg + +- [Dela PDF](./split-pdf) +- [Ta bort sidor](./delete-pages) +- [Sammanfoga PDF](./merge-pdf) diff --git a/docs/sv/tools/extract-tables.md b/docs/sv/tools/extract-tables.md new file mode 100644 index 00000000..66466ec8 --- /dev/null +++ b/docs/sv/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Extrahera PDF-tabeller +description: Identifiera och extrahera tabeller från PDF-dokument. Exportera som CSV, JSON eller Markdown med tabell för tabell. +--- + +# Extrahera PDF-tabeller + +Identifierar alla tabeller i en PDF och låter dig exportera dem i valfritt format: CSV, JSON eller Markdown. Varje tabell extraheras enskilt med metadata om sida och position. Drivs av PyMuPDF:s tabelldetekteringsmotor. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Välj önskat **exportformat**: CSV, JSON eller Markdown. +3. Klicka på **Extrahera** för att starta bearbetningen. +4. Om en tabell hittas laddas den ner som en enskild fil. Flera tabeller ger ett ZIP-arkiv med en fil per tabell. + +## Alternativ + +- **Exportformat**: välj mellan: + - **CSV**: kommaseparerade värden med korrekt citering för fält som innehåller kommatecken, citattecken eller radbrytningar. Lämpligt för kalkylblad och databaser. + - **JSON**: struktur med matris av matriser, formaterad med 2 blanksteg indrag. Lämpligt för programmatisk användning. + - **Markdown**: tabellformat avgränsat med lodräta streck, återgivet av PyMuPDF. Lämpligt för dokumentation och README-filer. + +## Utdataformat + +- **En tabell**: `filename_table.csv` (eller `.json` / `.md`) +- **Flera tabeller**: `filename_tables.zip` med filer som heter `table_1_page3.csv`, `table_2_page5.csv` osv. + +## Användningsfall + +- Extrahera vissa tabeller från långa PDF-rapporter utan att hämta ut hela dokumentets data. +- Få tabeller i Markdown-format för att klistra in direkt i GitHub-ärenden, wikis eller dokumentation. +- Hämta ut strukturerad JSON-data från PDF-tabeller för API-integrationer eller skript. +- Jämföra tabeller mellan olika PDF-versioner genom att exportera båda till CSV och jämföra skillnaderna. + +## Tips + +- Det här verktyget ger dig kontroll per tabell. Om du bara vill ha alla tabeller samlade i en enda CSV, använd [PDF till CSV](./pdf-to-csv). För en hel Excel-arbetsbok, använd [PDF till Excel](./pdf-to-excel). +- Tabeller som sträcker sig över flera sidor kan identifieras som separata tabeller per sida. Du kan behöva sätta ihop dem manuellt. +- Om inga tabeller upptäcks kan PDF-filen vara en skannad bild. Kör den genom OCR först för att lägga till ett textlager. + +## Relaterade verktyg + +- [PDF till CSV](./pdf-to-csv) +- [PDF till Excel](./pdf-to-excel) +- [PDF till text](./pdf-to-text) diff --git a/docs/sv/tools/fb2-to-pdf.md b/docs/sv/tools/fb2-to-pdf.md new file mode 100644 index 00000000..e07b12db --- /dev/null +++ b/docs/sv/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 till PDF +description: Konvertera FictionBook-e-böcker (FB2) till PDF i webbläsaren. Gratis, privat, ingen uppladdning till server. +--- + +# FB2 till PDF + +Konvertera FictionBook 2-filer (FB2) till PDF-dokument. FB2 är ett XML-baserat e-boksformat som är populärt i Ryssland och Östeuropa. Det stöds väl på vissa plattformar men är nästan okänt på andra. Genom att konvertera till PDF blir dina böcker läsbara överallt. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :------------ | :--------- | :----------------------- | +| FictionBook 2 | `.fb2` | XML-baserat e-boksformat | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina FB2-filer. Du kan välja flera filer på en gång. +2. Granska fillistan. Använd papperskorgsikonen för att ta bort enskilda poster, eller **Lägg till fler filer** för att lägga till fler. +3. Klicka på **Konvertera till PDF**. PyMuPDF-motorn tolkar FB2:s XML-struktur och återger den som paginerat PDF-innehåll. +4. En fil laddas ned direkt som PDF. Flera konverteringar paketeras i `fb2-converted.zip`. + +## Alternativ + +Ingen konfiguration behövs. Konverteraren hanterar FB2:s XML-struktur automatiskt och bevarar kapitelbrytningar, formatering och eventuella inbäddade bilder. + +## Användningsområden + +- Läsa FB2-e-böcker på enheter eller appar som bara stöder PDF +- Skriva ut rysk litteratur som distribueras i FB2-format +- Arkivera ett FB2-bibliotek i ett format som stöds överallt +- Dela en bok med någon vars läsare inte stöder FictionBook + +## Tips + +- FB2-filer är vanlig XML, så de är oftast små och konverteras snabbt även i webbläsaren. +- Om dina FB2-filer är komprimerade som `.fb2.zip` ska du packa upp dem innan du laddar upp dem. + +## Relaterade verktyg + +- [EPUB till PDF](./epub-to-pdf) +- [MOBI till PDF](./mobi-to-pdf) +- [XML till PDF](./xml-to-pdf) diff --git a/docs/sv/tools/fix-page-size.md b/docs/sv/tools/fix-page-size.md new file mode 100644 index 00000000..a8538ca6 --- /dev/null +++ b/docs/sv/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Fixa sidstorlek +description: Standardisera alla sidor i en PDF till en enhetlig storlek. Välj bland vanliga pappersstorlekar eller ange egna mått. +--- + +# Fixa sidstorlek + +PDF-filer som sätts ihop från flera källor får ofta sidor med olika storlek: vissa Letter, vissa A4, vissa helt ostandardiserade. Det här verktyget tvingar alla sidor till en enda målstorlek och skalar innehållet så att det passar eller fyller sidan. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Välj en **Målsidstorlek** i listan (A4, Letter, Legal, A3, A5, Tabloid eller Anpassad). +3. Välj **Orientering**: Auto behåller varje sidas ursprungliga orientering, eller så kan du tvinga Stående eller Liggande. +4. Välj ett **Innehållsskalningsläge**: Anpassa (bevarar allt innehåll, kan lägga till marginaler) eller Fyll (fyller sidan, kan beskära kanter). +5. Ställ eventuellt in en **Bakgrundsfärg** för tillagda marginaler. +6. Klicka på **Fixa sidstorlek**. + +## Alternativ + +- **Standardstorlekar**: A4, Letter, Legal, A3, A5, Tabloid +- **Egna mått**: Ange bredd och höjd i tum eller millimeter +- **Orientering**: Auto, Stående, Liggande +- **Skalningsläge**: Anpassa eller Fyll (beskär) +- **Bakgrundsfärg**: Valfri färg för marginalutfyllnad + +## Användningsområden + +- Normalisera en sammanfogad PDF där sidorna kommer från olika skannrar +- Konvertera ett US Letter-dokument till A4 för internationell distribution +- Förbereda tryckklara PDF-filer som kräver en enhetlig beskärningsstorlek +- Rätta till sidor som avviker något från standard (t.ex. 8,49 x 11,02 tum i stället för 8,5 x 11) + +## Tips + +- Använd läget Anpassa för att garantera att inget innehåll går förlorat. Läget Fyll ser renare ut men kan klippa kanter. +- Kontrollera resultatet med verktyget Sidmått för att bekräfta att varje sida matchar målet. +- Vit är standardbakgrundsfärg. Byt till en mörk färg om ditt dokument har mörka marginaler. + +## Relaterade verktyg + +- [Sidmått](./page-dimensions): granska sidstorlekar före och efter åtgärden +- [Komprimera PDF](./compress-pdf): minska filstorleken efter standardiseringen +- [Beskär PDF](./crop-pdf): beskär sidor manuellt i stället för att skala automatiskt diff --git a/docs/sv/tools/flatten-pdf.md b/docs/sv/tools/flatten-pdf.md new file mode 100644 index 00000000..1178d0f6 --- /dev/null +++ b/docs/sv/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Platta till PDF +description: Platta till interaktiva formulär och anteckningar till statiskt innehåll. Gör formulärfält icke-redigerbara och bränner in anteckningar på sidan. +--- + +# Platta till PDF + +Utplattning slår ihop interaktiva element (formulärfält, listrutor, kryssrutor, anteckningar, markeringar, klisterlappar) direkt med sidinnehållet. Det visuella utseendet förblir detsamma, men inget går längre att redigera eller extrahera. Det är PDF-motsvarigheten till att skriva ut ett ifyllt formulär och skanna in det igen, fast kvaliteten förblir perfekt. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. +2. Klicka på **Platta till PDF**. +3. En enskild fil laddas ned direkt. Flera filer ger ett ZIP-arkiv. + +Verktyget använder pdf-lib för att platta till formulärfält (via `form.flatten()`) och en särskild anteckningsutplattare för att bränna in anteckningar i sidflödet. Båda åtgärderna sker i ett enda pass. + +## Vad som plattas till + +- **Formulärfält**: Textfält, kryssrutor, alternativknappar, listrutor, signaturfält +- **Anteckningar**: Kommentarer, markeringar, genomstrykning, understrykning, klisterlappar, stämplar, pennanteckningar +- **Interaktiva element**: Knappar, åtgärdsutlösare + +## Vad som förblir oförändrat + +- Textinnehåll (förblir markerbart och sökbart) +- Bilder och grafik +- Sidlayout och sidmått +- Bokmärken och innehållsförteckning +- Hyperlänkar (om de inte är anteckningsbaserade) + +## Användningsområden + +- Låsa ett ifyllt formulär så att mottagare inte kan ändra de inskickade svaren +- Förbereda en PDF för arkivering där interaktiva element är onödiga +- Åtgärda visningsproblem som orsakas av att anteckningar renderas olika i olika läsare +- Säkerställa att ett signerat dokument inte kan ändras efter att signaturen lagts till +- Minska filstorleken genom att ta bort formulärfältsdefinitioner och anteckningsobjekt + +## Tips + +- Platta till först när alla redigeringar är klara. Det går inte att ångra utplattningen av en PDF. +- Om du behöver platta till och dessutom ta bort metadata, JavaScript och bilagor, använd verktyget Sanera PDF i stället. Det har utplattning som ett av sina alternativ. +- Vissa PDF-filer rapporterar "inget formulär hittades". Det är normalt om dokumentet bara har anteckningar och inga formulärfält. + +## Relaterade verktyg + +- [Sanera PDF](./sanitize-pdf): platta till formulär och ta bort metadata, skript och mer +- [Rasterisera PDF](./rasterize-pdf): konvertera till bildbaserad PDF för maximal utplattning +- [Typsnitt till kontur](./font-to-outline): platta till typsnitt till vektorbanor +- [Skydda PDF](./protect-pdf): lås den utplattade PDF-filen med ett lösenord diff --git a/docs/sv/tools/font-to-outline.md b/docs/sv/tools/font-to-outline.md new file mode 100644 index 00000000..55fc6b85 --- /dev/null +++ b/docs/sv/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Typsnitt till kontur +description: Konvertera alla typsnitt i en PDF till vektorkonturer för enhetlig rendering på alla enheter. Eliminerar problem med typsnittsberoende. +--- + +# Typsnitt till kontur + +När typsnitt konverteras till konturer omvandlas varje textteckens glyf till en vektorbana. PDF-filen är då inte längre beroende av några installerade typsnitt: den renderas identiskt på varje enhet, i varje operativsystem och på varje skrivare. Det är ett standardsteg i tryckförberedelser. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. +2. Klicka på **Konvertera till konturer**. +3. Ghostscript konverterar all text till vektorbanor. +4. Ladda ned resultatet. Flera filer ger ett ZIP-arkiv. + +Det finns inga inställningar att konfigurera. Verktyget använder Ghostscript (WebAssembly) för att konvertera alla typsnittsreferenser till konturbanor i ett enda pass. + +## Vad som ändras + +- Teckentext blir vektorkurvor (bézierbanor) +- Typsnittsinbäddning behövs inte längre, PDF-filen är självständig på glyfnivå +- Filstorleken kan öka eftersom vektorbanor oftast är större än typsnittsreferenser +- Det visuella utseendet bevaras exakt + +## Vad du förlorar + +- Textmarkering och kopiera-klistra +- Textsökbarhet (Ctrl+F slutar fungera) +- Möjligheten att redigera textinnehållet +- Tillgänglighet för skärmläsare + +## Användningsområden + +- Skicka PDF-filer till ett tryckeri som kräver konturerade typsnitt +- Dela dokument som använder egna eller licensierade typsnitt med personer som inte har dessa typsnitt +- Förhindra typsnittsersättning som ändrar dokumentets utseende på andra system +- Förbereda PDF-filer för lasergravyr eller CNC-skärning som kräver vektorindata +- Säkerställa att en logotyptung PDF visas korrekt på alla plattformar + +## Tips + +- Behåll din ursprungliga PDF. Konturering går inte att ångra, du kan inte konvertera banor tillbaka till redigerbar text. +- Om texten ska förbli sökbar kan du i stället överväga verktyget Rasterisera PDF med OCR som efterföljande steg. +- Konturerade PDF-filer tenderar att bli större. Kör Komprimera PDF efteråt om filstorleken är viktig. + +## Relaterade verktyg + +- [Platta till PDF](./flatten-pdf): platta till formulär och anteckningar utan att röra typsnitt +- [Rasterisera PDF](./rasterize-pdf): konvertera till bildbaserad PDF i stället för vektorkonturer +- [Komprimera PDF](./compress-pdf): minska filstorleken efter konturering +- [PDF till PDF/A](./pdf-to-pdfa): konvertera för arkivering efter att typsnittsoberoende säkerställts diff --git a/docs/sv/tools/form-creator.md b/docs/sv/tools/form-creator.md new file mode 100644 index 00000000..a6e877ba --- /dev/null +++ b/docs/sv/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Skapa PDF-formulär +description: Bygg ifyllbara PDF-formulär med dra-och-släpp-textfält, kryssrutor, listrutor, alternativknappar med mera. +--- + +# Skapa PDF-formulär + +Designa professionella ifyllbara PDF-formulär från grunden eller genom att lägga till fält i en befintlig PDF. Den visuella redigeraren låter dig dra och släppa formulärelement (textfält, kryssrutor, listrutor, alternativknappar, signaturfält med mera) direkt på sidförhandsvisningar. Konfigurera fältegenskaper, ställ in regler för villkorlig synlighet och exportera ett fullt interaktivt PDF-formulär. + +## Så fungerar det + +1. Ladda upp en befintlig PDF **eller** klicka på **Skapa tom PDF** för att börja från början. +2. Om du skapar en tom PDF väljer du en sidstorlek (Letter, A4, A5, Legal, Tabloid, A3 eller egna mått). +3. Formulärredigeraren öppnas med ett verktygsfält med fälttyper och ett sidförhandsvisningsområde. +4. Välj en fälttyp i verktygsfältet och klicka sedan på sidan för att placera den. +5. Dra fält för att flytta dem. Använd storlekshandtagen för att justera måtten. +6. Klicka på ett fält för att öppna egenskapspanelen där du kan ange fältnamn, standardvärde, teckenstorlek, justering med mera. +7. Navigera mellan sidor med sidkontrollerna. +8. Klicka på **Spara** för att ladda ned den färdiga ifyllbara PDF-filen. + +## Funktioner + +- Placering av fält med dra och släpp och visuella handtag för storleksändring +- Fälttyper: textfält, flerradig text, kryssruta, listruta, alternativknapp, signatur, datum, nummer och streckkod +- Egenskapspanel för att konfigurera varje fälts namn, etikett, standardvärde, teckenstorlek, färg, justering och validering +- Fältåtgärder och regler för villkorlig synlighet (visa/dölj fält baserat på andra fälts värden) +- Sidnavigering för flersidiga formulär +- Extrahering av befintliga fält: identifierar och importerar automatiskt formulärfält från uppladdade PDF-filer +- Stöd för både uppladdade PDF-filer och tomma sidor som formulärunderlag +- Flera förinställda sidstorlekar samt egna mått +- Streckkodsgenerering med bwip-js +- Hantering av grupper av alternativknappar + +## Alternativ + +**Förinställda sidstorlekar (för tomma PDF-filer):** + +- Letter (8,5" x 11") +- A4 (210 mm x 297 mm) +- A5 (148 mm x 210 mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297 mm x 420 mm) +- Anpassad (ange bredd och höjd) + +**Fältegenskaper (varierar efter fälttyp):** + +- Namn, etikett och platshållartext +- Standardvärde +- Teckensnittsfamilj, storlek och färg +- Textjustering (vänster, center, höger) +- Reglage för obligatoriskt fält +- Reglage för skrivskydd +- Maxlängd för textfält +- Alternativlista för listrutor och alternativknappar +- Åtgärder för villkorlig synlighet + +## Användningsområden + +- Bygga introduktionsformulär för nyanställda med textfält för personuppgifter och kryssrutor för bekräftelse av policyer +- Skapa kundfrågeformulär med listrutor för val av tjänst +- Designa beställningsformulär med beräknade fält och streckkodsidentifierare +- Bygga inspektionschecklistor med alternativknappar för godkänt/underkänt +- Skapa enkätformulär med villkorliga följdfrågor som visas utifrån svar + +## Tips + +- Om du laddar upp en befintlig PDF försöker verktyget extrahera de formulärfält som redan finns, så att du kan redigera eller lägga till i dem. +- Använd funktionen för grupper av alternativknappar för att skapa ömsesidigt uteslutande val. Fält i samma grupp delar gruppnamn. +- Testa ditt formulär genom att ladda ned det och öppna det i [Formulärifyllare](./form-filler) för att verifiera fältens beteende. + +## Relaterade verktyg + +- [Formulärifyllare](./form-filler) +- [Signera PDF](./sign-pdf) +- [PDF-redigerare](./edit-pdf) diff --git a/docs/sv/tools/form-filler.md b/docs/sv/tools/form-filler.md new file mode 100644 index 00000000..14c9f76b --- /dev/null +++ b/docs/sv/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF-formulärifyllare +description: Fyll i PDF-formulär, inklusive XFA-formulär, direkt i webbläsaren med en inbäddad visare. +--- + +# PDF-formulärifyllare + +Öppna en PDF med formulärfält och fyll i den direkt i en inbäddad visare. Verktyget stöder både vanliga AcroForm-fält och äldre XFA-formulär (XML Forms Architecture). När du har fyllt i formuläret laddar du ned den ifyllda versionen med ett enda klick. + +## Så fungerar det + +1. Ladda upp en PDF som innehåller formulärfält. +2. Dokumentet öppnas i en integrerad PDF-visare som återger formulärfält som interaktiva inmatningsfält. +3. Klicka på textfält, kryssrutor, listrutor och alternativknappar för att fylla i dem. +4. Klicka på **Spara och ladda ned ifyllt formulär** för att få den färdiga PDF-filen. + +## Funktioner + +- Inbäddad PDF.js-visare med full interaktion med formulärfält +- Stöd för vanliga AcroForm-fält (textfält, kryssrutor, listrutor, alternativknappar) +- XFA-formulärstöd för äldre XML-baserade formulär +- Automatisk anpassning av visarens storlek efter sidmåtten +- Filvisning med namn och storlek + +## Alternativ + +Det finns inga ytterligare konfigurationsalternativ. Ladda upp formuläret, fyll i det och ladda ned. + +## Användningsområden + +- Fylla i skatteformulär, försäkringsansökningar eller myndighetsblanketter +- Fylla i jobbansökningsformulär som mottagits som PDF-bilagor +- Fylla i leverantörsregistreringar eller leverantörsenkäter +- Intyga efterlevnadschecklistor med kryssrutefält +- Fylla i medicinska anamnesformulär före ett besök + +## Tips + +- XFA-formulär är ett äldre format som bara stöds av vissa PDF-visare. Om du öppnar en XFA-PDF i Chrome eller de flesta andra verktyg och ser tomma sidor beror det på att dessa visare saknar XFA-stöd. BentoPDF:s Formulärifyllare och Firefox hanterar båda XFA korrekt. +- För PDF-filer utan befintliga formulärfält, använd verktyget [Skapa PDF-formulär](./form-creator) för att lägga till fält först och fyll sedan i dem här. +- Visaren anpassar automatiskt sin storlek efter PDF-filens sidmått. + +## Relaterade verktyg + +- [Skapa PDF-formulär](./form-creator) +- [Signera PDF](./sign-pdf) +- [PDF-redigerare](./edit-pdf) diff --git a/docs/sv/tools/header-footer.md b/docs/sv/tools/header-footer.md new file mode 100644 index 00000000..02691816 --- /dev/null +++ b/docs/sv/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Sidhuvud & sidfot +description: Lägg till anpassningsbar sidhuvuds- och sidfotstext på PDF-sidor med dynamiska variabler för sidnummer. +--- + +# Sidhuvud & sidfot + +Lägg till text på sex positioner på dina PDF-sidor: sidhuvud vänster, sidhuvud center, sidhuvud höger, sidfot vänster, sidfot center och sidfot höger. Verktyget stöder dynamiska variabler för sidnummer och totalt antal sidor, så att du kan skapa mallar som "Sida 3 av 10" som uppdateras automatiskt för varje sida. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Alternativpanelen visas med formateringskontroller och sex textfält. +3. Ange önskad text i valfri sidhuvuds- eller sidfotsposition. +4. Använd platshållarna `{page}` och `{total}` för dynamisk sidnumrering. +5. Justera teckenstorlek och teckenfärg, och begränsa eventuellt till ett specifikt sidintervall. +6. Klicka på **Lägg till sidhuvud och sidfot** för att bearbeta och ladda ned. + +## Alternativ + +- **Sidintervall**: Begränsa eventuellt vilka sidor som får sidhuvud och sidfot. Lämna tomt för att tillämpa på alla sidor. Format: "1-3, 5" (kommaseparerade intervall). +- **Teckenstorlek**: Mellan 6 och 24 punkter. Standard är 10. +- **Teckenfärg**: Välj valfri färg med färgväljaren. +- **Sidhuvud vänster / center / höger**: Textfält för toppen av varje sida. +- **Sidfot vänster / center / höger**: Textfält för botten av varje sida. + +## Funktioner + +- Sex oberoende textpositioner per sida +- Dynamisk variabel `{page}` som infogar aktuellt sidnummer +- Dynamisk variabel `{total}` som infogar totalt antal sidor +- Sidintervallfiltrering för att rikta in sig på specifika sidor +- Anpassningsbar teckenstorlek och färg +- Typsnittet Helvetica för ett rent, professionellt resultat + +## Användningsområden + +- Lägga till "Sida {page} av {total}" i sidfot center i en rapport +- Placera ett företagsnamn i sidhuvud vänster och ett dokumentdatum i sidhuvud höger +- Lägga till sekretessmeddelanden i sidfoten i juridiska dokument +- Stämpla dokumentrevisionsnummer på specifika sidintervall + +## Tips + +- Kombinera `{page}` och `{total}` i ett enda fält för format som "Sida {page} av {total}" eller "{page}/{total}". +- Du kan lämna de flesta fält tomma och bara fylla i de positioner du behöver. Tomma fält hoppas helt enkelt över. +- För mer komplexa sidhuvuden med bilder eller logotyper, överväg att använda verktyget [Lägg till vattenstämpel](./add-watermark) placerat överst på sidan. + +## Relaterade verktyg + +- [Sidnummer](./page-numbers) +- [Lägg till vattenstämpel](./add-watermark) +- [Bates-numrering](./bates-numbering) diff --git a/docs/sv/tools/heic-to-pdf.md b/docs/sv/tools/heic-to-pdf.md new file mode 100644 index 00000000..a8f1341a --- /dev/null +++ b/docs/sv/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC till PDF +description: Konvertera HEIC- och HEIF-bilder från iPhone och iPad till PDF direkt i webbläsaren. +--- + +# HEIC till PDF + +Konvertera HEIC/HEIF-bilder till PDF. HEIC har varit standardformatet för foton på iPhone och iPad sedan iOS 11. Med det här verktyget kan du göra om dessa foton till PDF-filer utan att installera någon skrivbordsprogramvara eller ladda upp filer till en server. + +## Format som stöds + +| Format | Filändelser | +| :----- | :---------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina HEIC/HEIF-filer. +2. Granska fillistan och ta bort oönskade filer. +3. Klicka på **Konvertera till PDF**. Resultatet laddas ned som `from_heic.pdf`. + +Varje HEIC-fil avkodas med biblioteket heic2any, som konverterar den till PNG med 92 % kvalitet. PNG-filen bäddas sedan in i PDF-filen med pdf-lib, med varje bild på en egen sida i full upplösning. + +## Alternativ + +Det här verktyget har inga ytterligare inställningar. HEIC-bilder konverteras med hög kvalitet (0,92) till PNG innan de bäddas in. + +## Användningsområden + +- Skapa en PDF av iPhone-foton att bifoga till ett försäkringsärende eller en rapport +- Konvertera HEIC-foton till en bostadsannons och samla dem i ett enda utskrivbart dokument +- Göra om skärmbilder från iPad (HEIF-format) till en delbar PDF +- Batchkonvertera semesterbilder till en resedagbok + +## Tips + +- HEIC-avkodningen sker helt i webbläsaren med WebAssembly. Den första konverteringen kan ta en stund medan avkodaren laddas. +- Om du behöver blanda HEIC med andra bildformat (JPG, PNG osv.), använd verktyget [Bilder till PDF](./image-to-pdf), som hanterar HEIC tillsammans med alla andra format. +- HEIC-filer från iPhone innehåller ofta EXIF-data, inklusive GPS-koordinater. PDF-resultatet för inte vidare dessa metadata. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [JPG till PDF](./jpg-to-pdf) +- [PNG till PDF](./png-to-pdf) diff --git a/docs/sv/tools/image-to-pdf.md b/docs/sv/tools/image-to-pdf.md new file mode 100644 index 00000000..3442b02c --- /dev/null +++ b/docs/sv/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Bilder till PDF +description: Konvertera JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD och över 10 andra bildformat till en enda PDF-fil. +--- + +# Bilder till PDF + +Den universella konverteraren från bild till PDF. Ladda upp bilder i praktiskt taget vilket format som helst och kombinera dem till ett enda PDF-dokument. Varje bild får en egen sida, anpassad efter originalmåtten. + +## Format som stöds + +| Format | Filändelser | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Det här är det bredaste formatstödet av alla bildkonverterare i BentoPDF. Om du bara behöver ett specifikt format kan du använda ett av de dedikerade verktygen i stället. + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina bildfiler. Du kan välja flera filer på en gång. +2. Granska fillistan. Ta bort oönskade filer med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att lägga till fler bilder. +3. Välj en **PDF-kvalitet** i listan. +4. Klicka på **Konvertera till PDF**. Verktyget bearbetar bilderna med PyMuPDF-motorn och laddar ned resultatet som `images_to_pdf.pdf`. + +## Alternativ + +**PDF-kvalitet** styr den bildkomprimering som används när bilderna bäddas in i PDF-filen: + +- **Hög kvalitet**: minimal komprimering, större filstorlek. Bäst för tryck eller arkivering. +- **Medelhög kvalitet** (standard): balanserad komprimering. Passar de flesta ändamål. +- **Låg kvalitet**: kraftig komprimering, minsta filstorlek. Lämplig för e-post eller snabb delning. + +HEIC- och WebP-filer konverteras automatiskt till PNG innan de bäddas in. Det sker transparent och kräver inga extra steg. + +## Användningsområden + +- Kombinera skannade kvitton eller dokument från en mobilkamera till en PDF +- Skapa en fotoportfölj eller lookbook av bilder i blandade format +- Konvertera iPhone-foton (HEIC) till en delbar PDF utan att installera skrivbordsprogramvara +- Sätta ihop designskisser från PSD-exporter och skärmbilder till en kundleverans +- Arkivera en mapp med äldre bildformat (PNM, JXR, JP2) som en enda PDF + +## Tips + +- Bildernas ordning i PDF-filen följer ordningen i fillistan. Ladda upp dem i den ordning du vill ha. +- Välj Låg kvalitet för minsta möjliga filstorlek. Den visuella skillnaden är ofta försumbar för textrika skanningar. +- Om du bara har ett bildformat ger de dedikerade konverterarna (JPG till PDF, PNG till PDF osv.) samma resultat med ett enklare gränssnitt. + +## Relaterade verktyg + +- [JPG till PDF](./jpg-to-pdf) +- [PNG till PDF](./png-to-pdf) +- [HEIC till PDF](./heic-to-pdf) +- [WebP till PDF](./webp-to-pdf) diff --git a/docs/sv/tools/index.md b/docs/sv/tools/index.md new file mode 100644 index 00000000..e6d845f1 --- /dev/null +++ b/docs/sv/tools/index.md @@ -0,0 +1,183 @@ +# Verktygsreferens + +BentoPDF erbjuder **över 130 verktyg** för att arbeta med PDF-filer. Alla verktyg körs helt i din webbläsare: dina filer lämnar aldrig din enhet. + +--- + +## Redigera & kommentera + +Ändra, markera och förbättra dina PDF-dokument med en komplett uppsättning redigeringsverktyg. + +
+ +- [**PDF-redigerare**](./edit-pdf): Kommentera, markera, maskera, skriv kommentarer, lägg till former/bilder, sök och visa PDF-filer. +- [**Redigera bokmärken**](./bookmark): Lägg till, redigera, importera, ta bort och extrahera PDF-bokmärken. +- [**Innehållsförteckning**](./table-of-contents): Skapa en innehållsförteckningssida från PDF-bokmärken. +- [**Sidnummer**](./page-numbers): Infoga sidnummer i ditt dokument. +- [**Lägg till sidetiketter**](./add-page-labels): Använd PDF-sidetiketter med romerska siffror, prefix och egna startvärden. +- [**Bates-numrering**](./bates-numbering): Lägg till löpande Bates-nummer i en eller flera PDF-filer. +- [**Lägg till vattenstämpel**](./add-watermark): Stämpla text eller en bild över dina PDF-sidor. +- [**Sidhuvud & sidfot**](./header-footer): Lägg till text överst och nederst på sidorna. +- [**Invertera färger**](./invert-colors): Skapa en version av din PDF i mörkt läge. +- [**Skannereffekt**](./scanner-effect): Få din PDF att se ut som ett skannat dokument. +- [**Justera färger**](./adjust-colors): Finjustera ljusstyrka, kontrast, mättnad och mer. +- [**Bakgrundsfärg**](./background-color): Ändra bakgrundsfärgen i din PDF. +- [**Ändra textfärg**](./text-color): Ändra färgen på texten i din PDF. +- [**Signera PDF**](./sign-pdf): Rita, skriv eller ladda upp din signatur. +- [**Lägg till stämplar**](./add-stamps): Lägg till bildstämplar i din PDF med anteckningsverktygsfältet. +- [**Ta bort anteckningar**](./remove-annotations): Ta bort kommentarer, markeringar och länkar. +- [**Beskär PDF**](./crop-pdf): Trimma marginalerna på varje sida i din PDF. +- [**PDF-formulärifyllare**](./form-filler): Fyll i formulär direkt i webbläsaren. Stöder även XFA-formulär. +- [**Skapa PDF-formulär**](./form-creator): Skapa ifyllbara PDF-formulär med textfält som du drar och släpper. +- [**Ta bort tomma sidor**](./remove-blank-pages): Identifiera och ta bort tomma sidor automatiskt. + +
+ +--- + +## Konvertera till PDF + +Gör om bilder, dokument, e-böcker och andra filformat till PDF. + +
+ +- [**Bilder till PDF**](./image-to-pdf): Konvertera JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP med flera till PDF. +- [**JPG till PDF**](./jpg-to-pdf): Skapa en PDF från en eller flera JPG-bilder. +- [**PNG till PDF**](./png-to-pdf): Skapa en PDF från en eller flera PNG-bilder. +- [**WebP till PDF**](./webp-to-pdf): Skapa en PDF från en eller flera WebP-bilder. +- [**SVG till PDF**](./svg-to-pdf): Skapa en PDF från en eller flera SVG-bilder. +- [**BMP till PDF**](./bmp-to-pdf): Skapa en PDF från en eller flera BMP-bilder. +- [**HEIC till PDF**](./heic-to-pdf): Skapa en PDF från en eller flera HEIC-bilder. +- [**TIFF till PDF**](./tiff-to-pdf): Skapa en PDF från en eller flera TIFF-bilder. +- [**Text till PDF**](./txt-to-pdf): Konvertera en vanlig textfil till en PDF. +- [**Markdown till PDF**](./markdown-to-pdf): Konvertera Markdown till PDF med liveförhandsgranskning och syntaxmarkering. +- [**JSON till PDF**](./json-to-pdf): Konvertera JSON-filer till PDF-format. +- [**ODT till PDF**](./odt-to-pdf): Konvertera ODT-filer (OpenDocument Text) till PDF. +- [**CSV till PDF**](./csv-to-pdf): Konvertera CSV-kalkylblad till PDF. +- [**RTF till PDF**](./rtf-to-pdf): Konvertera RTF-dokument (Rich Text Format) till PDF. +- [**Word till PDF**](./word-to-pdf): Konvertera Word-dokument (DOCX, DOC, ODT) till PDF. +- [**Excel till PDF**](./excel-to-pdf): Konvertera Excel-kalkylblad (XLSX, XLS, ODS) till PDF. +- [**PowerPoint till PDF**](./powerpoint-to-pdf): Konvertera PowerPoint-presentationer (PPTX, PPT, ODP) till PDF. +- [**XPS till PDF**](./xps-to-pdf): Konvertera XPS/OXPS-dokument till PDF. +- [**MOBI till PDF**](./mobi-to-pdf): Konvertera MOBI-e-böcker till PDF. +- [**EPUB till PDF**](./epub-to-pdf): Konvertera EPUB-e-böcker till PDF. +- [**FB2 till PDF**](./fb2-to-pdf): Konvertera FictionBook-e-böcker (FB2) till PDF. +- [**CBZ till PDF**](./cbz-to-pdf): Konvertera serietidningsarkiv (CBZ/CBR) till PDF. +- [**WPD till PDF**](./wpd-to-pdf): Konvertera WordPerfect-dokument (WPD) till PDF. +- [**WPS till PDF**](./wps-to-pdf): Konvertera WPS Office-dokument till PDF. +- [**XML till PDF**](./xml-to-pdf): Konvertera XML-dokument till PDF. +- [**ODG till PDF**](./odg-to-pdf): Konvertera OpenDocument Graphics (ODG) till PDF. +- [**ODS till PDF**](./ods-to-pdf): Konvertera OpenDocument Spreadsheet (ODS) till PDF. +- [**ODP till PDF**](./odp-to-pdf): Konvertera OpenDocument Presentation (ODP) till PDF. +- [**PUB till PDF**](./pub-to-pdf): Konvertera Microsoft Publisher (PUB) till PDF. +- [**VSD till PDF**](./vsd-to-pdf): Konvertera Microsoft Visio (VSD, VSDX) till PDF. +- [**PSD till PDF**](./psd-to-pdf): Konvertera Adobe Photoshop-filer (PSD) till PDF. +- [**E-post till PDF**](./email-to-pdf): Konvertera e-postfiler (EML, MSG) till PDF-format. + +
+ +--- + +## Konvertera från PDF + +Extrahera innehåll från PDF-filer till bilder, dokument och dataformat. + +
+ +- [**PDF till JPG**](./pdf-to-jpg): Konvertera varje PDF-sida till en JPG-bild. +- [**PDF till PNG**](./pdf-to-png): Konvertera varje PDF-sida till en PNG-bild. +- [**PDF till WebP**](./pdf-to-webp): Konvertera varje PDF-sida till en WebP-bild. +- [**PDF till BMP**](./pdf-to-bmp): Konvertera varje PDF-sida till en BMP-bild. +- [**PDF till TIFF**](./pdf-to-tiff): Konvertera varje PDF-sida till en TIFF-bild. +- [**PDF till CBZ**](./pdf-to-cbz): Konvertera en PDF till en CBZ (serietidningsarkiv) för serieläsare och Calibre. +- [**PDF till SVG**](./pdf-to-svg): Konvertera varje PDF-sida till en skalbar vektorgrafik. +- [**PDF till CSV**](./pdf-to-csv): Extrahera tabeller från PDF och konvertera till CSV-format. +- [**PDF till Excel**](./pdf-to-excel): Extrahera tabeller från PDF och konvertera till Excel (XLSX). +- [**PDF till gråskala**](./pdf-to-greyscale): Konvertera alla färger till svartvitt. +- [**PDF till JSON**](./pdf-to-json): Konvertera PDF-filer till JSON-format. +- [**PDF till Word**](./pdf-to-word): Konvertera PDF-filer till redigerbara Word-dokument. +- [**Extrahera bilder**](./extract-images): Extrahera alla inbäddade bilder från dina PDF-filer. +- [**PDF till Markdown**](./pdf-to-markdown): Konvertera PDF-text och tabeller till Markdown-format. +- [**Förbered PDF för AI**](./prepare-pdf-for-ai): Extrahera PDF-innehåll som LlamaIndex JSON för RAG/LLM-pipelines. +- [**PDF till text**](./pdf-to-text): Extrahera text från PDF-filer och spara som vanlig text. +- [**Extrahera PDF-tabeller**](./extract-tables): Extrahera tabeller från PDF-filer som CSV, JSON eller Markdown. + +
+ +--- + +## Organisera & hantera + +Ordna om, kombinera, dela och hantera dina PDF-sidor och filer. + +
+ +- [**PDF-arbetsflödesbyggare**](./pdf-workflow): Bygg egna PDF-bearbetningskedjor med en visuell nodredigerare. +- [**PDF multiverktyg**](./pdf-multi-tool): Fullfjädrad PDF-redigerare med sidhantering. +- [**OCR PDF**](./ocr-pdf): Gör en PDF sökbar och kopierbar. +- [**Sammanfoga PDF**](./merge-pdf): Kombinera flera PDF-filer till en fil. +- [**Alternera & blanda sidor**](./alternate-merge): Sammanfoga PDF-filer genom att alternera sidor från varje PDF. +- [**Sortera dubbelsidig skanning**](./duplex-collate): Ordna om block med fram-/baksidesskanningar till rätt sidföljd. +- [**Duplicera & organisera**](./organize-pdf): Duplicera, ordna om och ta bort sidor. +- [**Lägg till bilagor**](./add-attachments): Bädda in en eller flera filer i din PDF. +- [**Extrahera bilagor**](./extract-attachments): Extrahera alla inbäddade filer från PDF-filer som en ZIP. +- [**Redigera bilagor**](./edit-attachments): Visa eller ta bort bilagor i din PDF. +- [**PDF OCG**](./pdf-layers): Visa, växla, lägg till och ta bort OCG-lager i din PDF. +- [**Dela PDF**](./split-pdf): Extrahera ett sidintervall till en ny PDF. +- [**Dela sidor**](./divide-pages): Dela sidor horisontellt eller vertikalt. +- [**Extrahera sidor**](./extract-pages): Spara ett urval av sidor som nya filer. +- [**Ta bort sidor**](./delete-pages): Ta bort specifika sidor från ditt dokument. +- [**Lägg till tom sida**](./add-blank-page): Infoga en tom sida var som helst i din PDF. +- [**Omvänd sidor**](./reverse-pages): Vänd på ordningen för alla sidor i ditt dokument. +- [**Rotera PDF**](./rotate-pdf): Vrid sidor i steg om 90 grader. +- [**Rotera efter anpassade grader**](./rotate-custom): Rotera sidor med valfri vinkel. +- [**N-Up PDF**](./n-up-pdf): Placera flera sidor på ett enda ark. +- [**PDF-broschyr**](./pdf-booklet): Ordna om sidor för dubbelsidig broschyrutskrift. +- [**Kombinera till enskild sida**](./combine-single-page): Foga ihop alla sidor till en enda sammanhängande rullning. +- [**Visa metadata**](./view-metadata): Granska de dolda egenskaperna i din PDF. +- [**Redigera metadata**](./edit-metadata): Ändra författare, titel och andra egenskaper. +- [**PDF:er till ZIP**](./pdf-to-zip): Paketera flera PDF-filer i ett ZIP-arkiv. +- [**Jämför PDF:er**](./compare-pdfs): Jämför två PDF-filer sida vid sida. +- [**Postera PDF**](./posterize-pdf): Dela en stor sida i flera mindre sidor. + +
+ +--- + +## Optimera & reparera + +Komprimera, åtgärda och optimera dina PDF-filer för bättre prestanda och kompatibilitet. + +
+ +- [**Komprimera PDF**](./compress-pdf): Minska filstorleken på din PDF. +- [**PDF till PDF/A**](./pdf-to-pdfa): Konvertera PDF till PDF/A för långtidsarkivering. +- [**Fixa sidstorlek**](./fix-page-size): Standardisera alla sidor till en enhetlig storlek. +- [**Linjärisera PDF**](./linearize-pdf): Optimera PDF för snabb webbvisning. +- [**Sidmått**](./page-dimensions): Analysera sidstorlek, orientering och enheter. +- [**Ta bort begränsningar**](./remove-restrictions): Ta bort lösenordsskydd och säkerhetsbegränsningar. +- [**Reparera PDF**](./repair-pdf): Återskapa data från skadade eller korrupta PDF-filer. +- [**Rasterisera PDF**](./rasterize-pdf): Konvertera PDF till bildbaserad PDF. Platta till lager och ta bort markerbar text. +- [**Räta upp PDF**](./deskew-pdf): Räta automatiskt upp sneda skannade sidor med OpenCV. +- [**Typsnitt till kontur**](./font-to-outline): Konvertera alla typsnitt till vektorkonturer för enhetlig rendering. + +
+ +--- + +## Säkra PDF + +Skydda, kryptera och styr åtkomsten till dina PDF-dokument. + +
+ +- [**Kryptera PDF**](./protect-pdf): Lås din PDF genom att lägga till ett lösenord. +- [**Sanera PDF**](./sanitize-pdf): Ta bort metadata, anteckningar, skript och mer. +- [**Dekryptera PDF**](./unlock-pdf): Lås upp PDF genom att ta bort lösenordsskydd. +- [**Platta till PDF**](./flatten-pdf): Gör formulärfält och anteckningar icke-redigerbara. +- [**Ta bort metadata**](./remove-metadata): Ta bort dold data från din PDF. +- [**Ändra behörigheter**](./change-permissions): Ange eller ändra användarbehörigheter för en PDF. +- [**Digital signatur**](./digital-sign-pdf): Lägg till en kryptografisk digital signatur med X.509-certifikat. +- [**Validera signatur**](./validate-signature-pdf): Verifiera digitala signaturer och visa certifikatinformation. + +
diff --git a/docs/sv/tools/invert-colors.md b/docs/sv/tools/invert-colors.md new file mode 100644 index 00000000..1cc61312 --- /dev/null +++ b/docs/sv/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Invertera färger +description: Invertera alla färger i din PDF för att skapa en mörkt läge-version av vilket dokument som helst. +--- + +# Invertera färger + +Vänd varje färg i din PDF till sin invers. Vita bakgrunder blir svarta, svart text blir vit och alla andra färger skiftar till sina komplementfärger. Det är det snabbaste sättet att skapa en version i "mörkt läge" av vilken PDF som helst. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Klicka på **Invertera färger** för att bearbeta. +3. Den inverterade PDF-filen laddas ned automatiskt. + +Det finns inga ytterligare inställningar. Verktyget renderar varje sida som en bild, inverterar alla pixelfärger och sätter ihop resultatet till en ny PDF. + +## Funktioner + +- Färginvertering med ett klick för alla sidor +- Bearbetar varje sida i dokumentet +- Behåller ursprungliga sidmått och layout +- Fungerar med vilken PDF som helst oavsett innehållstyp (text, bilder, blandat) + +## Användningsområden + +- Skapa versioner i mörkt läge av läroböcker eller manualer för bekväm kvällsläsning +- Förbereda högkontrastversioner av dokument i tillgänglighetssyfte +- Invertera skannade dokument som fångats med felaktig exponering +- Generera negativa versioner av bildtunga PDF-filer för visuell analys + +## Tips + +- Eftersom verktyget rasteriserar sidorna för att åstadkomma effekten blir resultatet bildbaserat. Texten går då inte längre att markera eller söka i. Om du behöver sökbar text efter inverteringen kan du köra resultatet genom ett OCR-verktyg. +- För mer detaljerade färgjusteringar (ljusstyrka, kontrast, mättnad), använd verktyget [Justera färger](./adjust-colors) i stället. +- Stora PDF-filer med många sidor kan ta längre tid att bearbeta eftersom varje sida renderas och inverteras för sig. + +## Relaterade verktyg + +- [Justera färger](./adjust-colors) +- [Bakgrundsfärg](./background-color) +- [Skannereffekt](./scanner-effect) diff --git a/docs/sv/tools/jpg-to-pdf.md b/docs/sv/tools/jpg-to-pdf.md new file mode 100644 index 00000000..0eee1b1c --- /dev/null +++ b/docs/sv/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG till PDF +description: Konvertera en eller flera JPG-, JPEG- och JPEG 2000-bilder till en enda PDF-fil direkt i webbläsaren. +--- + +# JPG till PDF + +Gör om JPG-bilder till en ren PDF. Ladda upp en fil eller flera JPG-filer på en gång. Varje bild blir en helsida i det färdiga dokumentet. + +## Format som stöds + +| Format | Filändelser | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina JPG-filer. Flera filer kan väljas samtidigt. +2. Granska de uppladdade filerna. Använd papperskorgsikonen för att ta bort enskilda filer, eller klicka på **Lägg till fler filer** för att lägga till i listan. +3. Välj en **PDF-kvalitet**. +4. Klicka på **Konvertera till PDF**. Verktyget komprimerar bilderna enligt din kvalitetsinställning, konverterar dem med PyMuPDF-motorn och laddar ned `from_jpgs.pdf`. + +## Alternativ + +**PDF-kvalitet** justerar den komprimering som används på varje bild innan den bäddas in i PDF-filen: + +- **Hög kvalitet**: bevarar maximal detaljrikedom. Använd för fotografi eller tryck. +- **Medelhög kvalitet** (standard): en bra balans mellan tydlighet och filstorlek. +- **Låg kvalitet**: kraftig komprimering för minsta möjliga resultat. + +## Användningsområden + +- Konvertera skannade dokument som sparats som JPG till en enda PDF för inlämning +- Paketera produktbilder i en katalog åt kunder +- Göra om medicinska bilder eller satellitbilder i JPEG 2000 till en portabel PDF +- Skapa ett utskrivbart fotoalbum av kameraexporter + +## Tips + +- JPEG 2000-filer (`.jp2`, `.jpx`) stöds fullt ut, inte bara vanlig JPEG. Det är användbart för medicinsk bilddiagnostik och geospatiala data. +- Om dina JPG-filer kommer från en mobilkamera ger Medelhög kvalitet vanligtvis en fil som är 40-60 % mindre än Hög utan synlig skillnad på skärmen. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [PNG till PDF](./png-to-pdf) +- [WebP till PDF](./webp-to-pdf) diff --git a/docs/sv/tools/json-to-pdf.md b/docs/sv/tools/json-to-pdf.md new file mode 100644 index 00000000..36e26e5e --- /dev/null +++ b/docs/sv/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON till PDF +description: Återskapa PDF-filer från BentoPDF:s JSON-format. Konvertera JSON-exporter tillbaka till sina ursprungliga PDF-dokument. +--- + +# JSON till PDF + +Återskapa PDF-dokument från JSON-filer som tidigare skapats med BentoPDF:s verktyg **PDF till JSON**. Det här är ett verktyg för tur-och-retur-konvertering: det tar den strukturerade JSON-representationen av en PDF och bygger upp det ursprungliga dokumentet igen. + +::: warning +Det här verktyget accepterar bara JSON-filer som skapats av BentoPDF:s PDF till JSON-konverterare. Vanliga JSON-filer från API:er, databaser eller andra verktyg stöds inte. +::: + +## Format som stöds + +| Indata | Beskrivning | +| :------ | :--------------------------------------------------------- | +| `.json` | JSON-filer exporterade av BentoPDF:s verktyg PDF till JSON | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp en eller flera JSON-filer. +2. Fillistan visar varje vald fil med dess storlek. +3. Klicka på **Konvertera till PDF**. Verktyget bearbetar alla filer med en Web Worker och CPDF-motorn. +4. Resultatet laddas ned som `jsons-to-pdf.zip` med en PDF per JSON-fil. + +Konverteringen körs i en Web Worker i bakgrunden, så att gränssnittet förblir responsivt även med stora filer. + +## Alternativ + +Det här verktyget har inga konfigurerbara alternativ. JSON-strukturen bestämmer helt den resulterande PDF-filen. + +## Resultat + +När flera JSON-filer konverteras levereras resultaten som ett ZIP-arkiv. Varje PDF får namn efter sin JSON-källfil (t.ex. blir `report.json` till `report.pdf`). + +## Användningsområden + +- Återställa PDF-filer från en JSON-baserad säkerhetskopia eller arkiveringskedja +- Skicka en PDF genom JSON för inspektion och sedan tillbaka till PDF +- Bygga om dokument efter programmatiska ändringar i JSON-strukturen +- Verifiera att en PDF till JSON-export fångade allt dokumentinnehåll genom att konvertera tillbaka det + +## Tips + +- Om du behöver konvertera godtycklig JSON-data (som API-svar eller konfigurationsfiler) till en formaterad PDF passar verktyget [Text till PDF](./txt-to-pdf) bättre. Klistra in JSON som text så renderas den med korrekt formatering. +- WebAssembly-motorn CPDF måste vara tillgänglig för att det här verktyget ska fungera. Självhostade instanser behöver ha CPDF WASM-filerna konfigurerade. + +## Relaterade verktyg + +- [Text till PDF](./txt-to-pdf) +- [Markdown till PDF](./markdown-to-pdf) +- [CSV till PDF](./csv-to-pdf) diff --git a/docs/sv/tools/linearize-pdf.md b/docs/sv/tools/linearize-pdf.md new file mode 100644 index 00000000..d59e5171 --- /dev/null +++ b/docs/sv/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Linjärisera PDF +description: Optimera PDF-filer för snabb webbvisning med progressiv laddning. Också känt som "Fast Web View"-optimering. +--- + +# Linjärisera PDF + +Linearisering strukturerar om en PDF så att den första sidan kan visas innan hela filen har laddats ned. Adobe kallar detta "Fast Web View". Om du hostar PDF-filer på en webbplats eller levererar dem via en dokumentportal gör linearisering att de känns märkbart snabbare att öppna. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. +2. Klicka på **Linjärisera PDF**. +3. Ladda ned resultaten som ett ZIP-arkiv med alla lineariserade filer. + +Det finns inga inställningar att konfigurera. Verktyget använder QPDF:s flagga `--linearize`, som ordnar om PDF-filens interna struktur utan att ändra dess visuella innehåll. + +## Vad linearisering gör + +- Ordnar om PDF-objekt så att första sidans data hamnar i början av filen +- Lägger till en lineariseringsordlista och tips-tabeller så att visare vet var varje sida finns +- Möjliggör byte-range-förfrågningar: en webbläsare kan hämta bara första sidan utan att ladda ned hela filen +- Städar upp korsreferenstabellen för effektiv slumpmässig åtkomst + +## Funktioner + +- Batchbearbetning av flera PDF-filer i en enda åtgärd +- Resultatet bevarar allt innehåll, alla typsnitt, bilder och interaktiva element +- Använder QPDF (WebAssembly) för tillförlitlig, standardenlig linearisering +- Resultaten paketeras i ett ZIP-arkiv för enkel nedladdning + +## Användningsområden + +- Hosta PDF-rapporter på en webbplats där användare förväntar sig omedelbar sidvisning +- Bädda in PDF-filer i webbapplikationer med visare i webbläsaren +- Publicera PDF-kataloger eller manualer som nås över långsamma mobila anslutningar +- Förbereda dokument för innehållsleveransnätverk (CDN) som stöder byte-range-leverans + +## Tips + +- Linearisera efter att alla andra redigeringar är klara. Varje efterföljande ändring (sammanfogning, tillägg av sidor) bryter lineariseringen. +- Kombinera med Komprimera PDF för de minsta och snabbast laddade PDF-filerna. +- Linearisering lägger till en liten extra mängd i filstorleken (vanligtvis under 1 %). + +## Relaterade verktyg + +- [Komprimera PDF](./compress-pdf): minska filstorleken före linearisering +- [Reparera PDF](./repair-pdf): åtgärda strukturproblem som hindrar linearisering +- [Ta bort metadata](./remove-metadata): ta bort metadata före publicering online diff --git a/docs/sv/tools/markdown-to-pdf.md b/docs/sv/tools/markdown-to-pdf.md new file mode 100644 index 00000000..1e814606 --- /dev/null +++ b/docs/sv/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown till PDF +description: Skriv eller klistra in Markdown och exportera det som en professionellt formaterad PDF med liveförhandsgranskning och syntaxmarkering. +--- + +# Markdown till PDF + +En fullfjädrad Markdown-redigerare med liveförhandsgranskning och PDF-export med ett klick. Skriv från grunden, ladda upp en befintlig `.md`-fil eller klistra in innehåll från urklipp. Redigeraren renderar din Markdown i realtid och exporterar en formaterad PDF med webbläsarens inbyggda utskriftsmotor. + +## Format som stöds + +| Indata | Beskrivning | +| :--------------- | :----------------------------------- | +| `.md`-filer | Ladda upp med knappen Ladda upp | +| Direkt inmatning | Skriv eller klistra in i redigeraren | + +## Så fungerar det + +1. Öppna verktyget Markdown till PDF. Redigeraren laddas med delad vy: Markdown-källa till vänster, renderad förhandsgranskning till höger. +2. Skriv din Markdown, klistra in den eller klicka på **Ladda upp** för att läsa in en `.md`-fil. +3. Växla mellan ljust och mörkt tema med temareglaget i verktygsfältet. +4. Klicka på **Exportera PDF** (eller tryck på `Ctrl/Cmd + S`) för att skapa en PDF via webbläsarens utskriftsdialog. + +## Funktioner + +Redigeraren stöder en omfattande uppsättning Markdown-funktioner utöver grunderna: + +- **Standard-Markdown**: rubriker, fet stil, kursiv stil, länkar, bilder, listor, blockcitat, horisontella linjer +- **Kodblock** med syntaxmarkering för över 15 språk (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash med flera) +- **Mermaid-diagram**: flödesscheman, sekvensdiagram, ER-diagram och andra Mermaid-diagramtyper renderas direkt i förhandsgranskningen +- **Tabeller** med standardsyntax för Markdown-tabeller +- **Uppgiftslistor** med kryssrutor +- **Fotnoter**, **nedsänkt text**, **upphöjd text** +- **Definitionslistor**, **förkortningar** +- Stöd för **emoji** (`:smile:` renderas som emojin) +- **Markeringar** (`==marked text==`) och **infogningar** (`++inserted text++`) +- **Automatiskt länkade webbadresser**: vanliga webbadresser omvandlas till klickbara länkar +- Generering av **innehållsförteckning** +- **Ankarlänkar** på rubriker + +## Användningsområden + +- Skriva projektdokumentation och exportera en polerad PDF till intressenter +- Skapa tekniska rapporter med kodexempel och Mermaid-arkitekturdiagram +- Konvertera en GitHub-README till PDF för offlineanvändning eller utskrift +- Skriva ett förslag eller en specifikation med uppgiftslistor och tabeller +- Generera ett formaterat utdelningsblad från föreläsningsanteckningar skrivna i Markdown + +## Tips + +- PDF-resultatet använder webbläsarens funktion för att skriva ut till PDF. I Chrome kan du anpassa marginaler och skala i utskriftsdialogen innan du sparar. +- Mermaid-diagram renderas i förhandsgranskningen men kan behöva en stund för att initieras vid första användningen. +- Använd `Ctrl/Cmd + S` som kortkommando för att exportera utan att leta efter knappen. + +## Relaterade verktyg + +- [Text till PDF](./txt-to-pdf) +- [Word till PDF](./word-to-pdf) +- [JSON till PDF](./json-to-pdf) diff --git a/docs/sv/tools/merge-pdf.md b/docs/sv/tools/merge-pdf.md new file mode 100644 index 00000000..2817962b --- /dev/null +++ b/docs/sv/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Sammanfoga PDF +description: Kombinera flera PDF-filer till ett dokument med omordning via dra och släpp och kontroll på sidnivå. +--- + +# Sammanfoga PDF + +Kombinera flera PDF-filer till ett enda dokument. Du kan sammanfoga hela filer i en viss ordning, eller växla till Sidläge för detaljerad kontroll över enskilda sidor från varje uppladdad PDF. + +## Så fungerar det + +1. Ladda upp två eller flera PDF-filer genom att klicka på släppytan eller dra in dem. +2. Välj mellan **Filläge** och **Sidläge** med reglaget överst. +3. I Filläge drar du filerna för att ordna om dem och kan ange sidintervall (t.ex. `1-3, 5`) för varje fil. Lämna intervallet tomt för att ta med alla sidor. +4. I Sidläge drar och släpper du enskilda sidminiatyrer för att bygga din exakta sidföljd. +5. Klicka på **Sammanfoga PDF-filer** för att kombinera allt till en fil. Den sammanfogade PDF-filen laddas ned automatiskt. + +## Funktioner + +- Två sammanfogningslägen: Filläge för snabb sammanfogning av hela filer, Sidläge för kontroll per sida +- Omordning med dra och släpp i båda lägena med mjuka animationer +- Syntax för sidintervall (t.ex. `1-3, 5, 8-10`) låter dig välja sidor utan att byta till Sidläge +- Latladdade sidminiatyrer håller gränssnittet responsivt även med stora dokument +- Ingen gräns för antal filer eller totalt sidantal +- Bevarar den ursprungliga PDF-kvaliteten utan omkodning + +## Alternativ + +| Alternativ | Beskrivning | +| ----------- | ----------------------------------------------------------------------------------------------- | +| **Filläge** | Sammanfoga hela filer i valfri ordning, med valfria sidintervallfilter per fil | +| **Sidläge** | Visuellt rutnät med alla sidor från alla filer: dra miniatyrer för att bygga din exakta sekvens | +| **Sidfält** | Textfält per fil som accepterar intervall som `1-3, 5` för att bara ta med specifika sidor | + +## Användningsområden + +- Kombinera separata kapitel-PDF:er till en enda bok eller rapport +- Sammanfoga ett personligt brev och ett CV till ett ansökningsdokument +- Hämta specifika sidor från flera källdokument till en samlad fil +- Samla skannade kvitton eller fakturor i en arkiv-PDF +- Skapa ett utdelningsmaterial från bilder i flera presentationer + +## Tips + +- Använd Sidläge när du behöver varva sidor från olika filer i stället för att lägga en fil efter en annan. +- Du kan lägga till fler filer efter den första uppladdningen med knappen **Lägg till fler filer** utan att förlora din nuvarande ordning. +- Sidintervall är 1-indexerade, så `1` avser den första sidan i den filen. + +## Relaterade verktyg + +- [Dela PDF](./split-pdf) +- [Duplicera & organisera](./organize-pdf) +- [Alternera & blanda sidor](./alternate-merge) +- [Ta bort sidor](./delete-pages) diff --git a/docs/sv/tools/mobi-to-pdf.md b/docs/sv/tools/mobi-to-pdf.md new file mode 100644 index 00000000..14c390b0 --- /dev/null +++ b/docs/sv/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI till PDF +description: Konvertera MOBI-e-boksfiler till PDF direkt i webbläsaren. Gratis, privat, inga filuppladdningar. +--- + +# MOBI till PDF + +Konvertera Amazon Kindle MOBI-e-böcker till PDF-dokument. MOBI-filer är knutna till Kindle-enheter och appar, vilket gör dem svåra att läsa på andra ställen. Genom att konvertera till PDF får du en portabel version som du kan öppna på vilken enhet som helst eller skriva ut. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----- | :--------- | :------------------------------- | +| MOBI | `.mobi` | Kindle-e-boksformat (Mobipocket) | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp en eller flera MOBI-filer. +2. Granska fillistan. Ta bort oönskade filer med papperskorgsikonen, eller använd **Lägg till fler filer** för att lägga till fler e-böcker. +3. Klicka på **Konvertera till PDF**. PyMuPDF-motorn tolkar MOBI-strukturen och renderar varje sida som PDF-innehåll. +4. En enskild fil laddas ned som PDF. När flera filer konverteras får du ett ZIP-arkiv med namnet `mobi-converted.zip`. + +## Alternativ + +Inga ytterligare inställningar behövs. Konverteringen bevarar textinnehåll, formatering och inbäddade bilder från den ursprungliga MOBI-filen. + +## Användningsområden + +- Läsa innehåll köpt via Kindle på en e-läsare som inte är en Kindle och bara stöder PDF +- Skriva ut kapitel ur en e-bok för offlinestudier eller anteckningar +- Arkivera ditt personliga e-boksbibliotek i ett universellt format +- Dela utdrag med någon som inte har Kindle-appen installerad + +## Tips + +- DRM-skyddade MOBI-filer kan inte konverteras. Verktyget fungerar bara med DRM-fria MOBI-filer. +- Stora e-böcker med många inbäddade bilder kan ta några sekunder längre att bearbeta eftersom allt sker i webbläsaren. + +## Relaterade verktyg + +- [EPUB till PDF](./epub-to-pdf) +- [FB2 till PDF](./fb2-to-pdf) +- [CBZ till PDF](./cbz-to-pdf) diff --git a/docs/sv/tools/n-up-pdf.md b/docs/sv/tools/n-up-pdf.md new file mode 100644 index 00000000..8da7588f --- /dev/null +++ b/docs/sv/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Placera flera PDF-sidor på ett enda ark i ett rutnät för kompakt utskrift. +--- + +# N-Up PDF + +Placera flera sidor på ett enda ark i ett rutnät. Det minskar antalet utskrivna sidor genom att rymma 2, 4, 6, 8, 9 eller 16 sidor per ark. Verktyget hanterar skalning, placering och valfri konfiguration av sidstorlek. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Välj antal sidor per ark ("N"-värdet): 2, 4, 6, 8, 9 eller 16. +3. Välj utdatasidans storlek (standard är A4) och orientering. +4. Konfigurera eventuellt avstånd, ramfärg och bakgrundsfärg. +5. Klicka på bearbetningsknappen. Verktyget skalar varje sida och lägger ut dem som plattor på nya ark. + +## Funktioner + +- Rutnätslayouter: 2-up, 4-up, 6-up, 8-up, 9-up och 16-up +- Konfigurerbar storlek och orientering på utdatasidan +- Valfritt avstånd mellan sidorna +- Inställningar för bakgrunds- och ramfärg +- Bevarar de ursprungliga sidornas proportioner vid skalning + +## Alternativ + +| Alternativ | Beskrivning | +| ----------------- | ------------------------------------------------------------------------- | +| **Sidor per ark** | Antal ursprungliga sidor som ryms på varje utdatasida (2, 4, 6, 8, 9, 16) | +| **Sidstorlek** | Storlek på utdataarket (A4, Letter, Legal osv.) | +| **Orientering** | Stående eller Liggande för utdataarket | +| **Avstånd** | Mellanrum i punkter mellan sidorna | +| **Bakgrundsfärg** | Fyllnadsfärg för utdatarkets bakgrund | +| **Ramfärg** | Färg på ramarna runt varje sida | + +## Användningsområden + +- Skriva ut utdelningsmaterial med 4 bilder per sida för att spara papper +- Skapa studieblad med flera referenssidor på ett ark +- Producera kompakta dokumentarkiv för arkivering +- Generera översiktsark med miniatyrer av ett långt dokument + +## Tips + +- Liggande orientering fungerar ofta bättre för 2-up-layouter, medan stående oftast är bäst för 4-up och uppåt. +- Större avstånd förbättrar läsbarheten men minskar ytan för varje sida. +- För den omvända åtgärden (dela en sida i flera), se [Postera PDF](./posterize-pdf). + +## Relaterade verktyg + +- [Postera PDF](./posterize-pdf) +- [PDF-broschyr](./pdf-booklet) +- [Kombinera till enskild sida](./combine-single-page) diff --git a/docs/sv/tools/ocr-pdf.md b/docs/sv/tools/ocr-pdf.md new file mode 100644 index 00000000..9ec813c1 --- /dev/null +++ b/docs/sv/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Gör skannade PDF-filer sökbara och kopierbara med Tesseract OCR, med stöd för flera språk och teckenfiltrering. +--- + +# OCR PDF + +Gör skannade dokument till sökbara, kopierbara PDF-filer. Verktyget använder Tesseract OCR för att känna igen text i bilder och lägger ett osynligt textlager ovanpå de ursprungliga sidorna, så att det visuella utseendet bevaras medan innehållet blir fullt sökbart. + +## Så fungerar det + +1. Ladda upp en skannad eller bildbaserad PDF-fil. +2. Välj ett eller flera språk som förekommer i dokumentet i den sökbara språklistan. +3. Justera eventuellt avancerade inställningar (upplösning, binarisering, vitlista). +4. Klicka på **Starta OCR** och följ förloppet i förloppsindikatorn i realtid. +5. När det är klart granskar du den extraherade texten och laddar sedan ned den sökbara PDF-filen eller en vanlig `.txt`-fil. + +## Funktioner + +- OCR på flera språk med en sökbar språkväljare +- Osynligt textlager bevarar dokumentets ursprungliga utseende +- Förloppsindikator och loggutdata i realtid under bearbetningen +- Ladda ned resultaten som en sökbar PDF eller en vanlig textfil +- Kopiera extraherad text direkt till urklipp +- Tre upplösningsnivåer för att balansera hastighet mot noggrannhet + +## Alternativ + +| Inställning | Värden | Standard | Syfte | +| ------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------- | +| **Upplösning** | Standard (192 DPI), Hög (288 DPI), Ultra (384 DPI) | Hög | Högre upplösning ger bättre noggrannhet på liten text men tar längre tid | +| **Binarisera bild** | På / Av | Av | Förbättrar kontrasten för rena skanningar genom att konvertera till svartvitt | +| **Förinställning för teckenvitlista** | Ingen, Alfanumerisk, Siffror + valuta, Endast bokstäver, Endast siffror, Faktura, Formulär, Anpassad | Ingen | Begränsar igenkända tecken för att förbättra noggrannheten för specifika dokumenttyper | +| **Teckenvitlista** | Fri text | Tom | Manuell teckenuppsättning när förinställningen är Anpassad | + +## Användningsområden + +- Göra skannade avtal och fakturor sökbara så att du kan använda Ctrl+F i dem +- Extrahera text från fotograferade dokument eller gamla pappersregister +- Bearbeta kvitton med förinställningen Faktura för att korrekt fånga belopp och datum +- Skapa tillgängliga PDF-filer från skanningar som bara består av bilder för att uppfylla efterlevnadskrav +- Batchextrahera textinnehåll från skannade böcker eller manualer + +## Tips + +- Välj flera språk om ditt dokument innehåller blandat språk (t.ex. engelska rubriker med japansk brödtext). +- Använd alternativet binarisera för dokument med bleknad text eller låg kontrast, det kan förbättra igenkänningen avsevärt. +- Vitlistorna Faktura och Formulär minskar kraftigt antalet falska träffar i strukturerade dokument genom att ignorera irrelevanta teckenformer. + +## Relaterade verktyg + +- [Extrahera PDF-tabeller](./extract-tables) +- [Sammanfoga PDF](./merge-pdf) +- [Komprimera PDF](./compress-pdf) diff --git a/docs/sv/tools/odg-to-pdf.md b/docs/sv/tools/odg-to-pdf.md new file mode 100644 index 00000000..cf8613cd --- /dev/null +++ b/docs/sv/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG till PDF +description: Konvertera LibreOffice Draw-filer (ODG) till PDF i webbläsaren. Gratis, ingen uppladdning, helt privat. +--- + +# ODG till PDF + +Konvertera OpenDocument Graphics-filer till PDF. ODG är det inbyggda formatet för LibreOffice Draw och används för diagram, flödesscheman och vektorillustrationer. Genom att konvertera till PDF blir dessa ritningar enkla att dela, skriva ut och bädda in i andra dokument. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :-------------------- | :--------- | :--------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw-filer | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina ODG-filer. Flera filer kan läggas till på en gång. +2. Granska fillistan. Ta bort enskilda poster med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att lägga till fler ritningar. +3. Klicka på **Konvertera till PDF**. En LibreOffice-baserad motor laddas i webbläsaren och konverterar varje ODG-fil och bevarar vektorgrafik, former och text. +4. En fil laddas ned direkt som PDF. Flera filer ger ett ZIP-arkiv med namnet `odg-to-pdf.zip`. + +## Alternativ + +Inga ytterligare inställningar krävs. Konverteringen bevarar de ursprungliga sidmåtten, formerna, kopplingarna och textrutorna från ODG-källan. + +## Användningsområden + +- Dela LibreOffice Draw-diagram med kunder som inte har LibreOffice installerat +- Skriva ut flödesscheman och nätverksdiagram skapade i Draw +- Ta med ODG-illustrationer i en rapport eller presentation som inbäddade PDF-filer +- Arkivera tekniska ritningar i ett format som förblir läsbart i årtionden + +## Tips + +- Vektorelement förblir vektorer i PDF-resultatet, så att det skalar rent till vilken utskriftsstorlek som helst. +- LibreOffice-motorn behöver en stund för att initieras vid första användningen. Konverteringar i samma session därefter går snabbare. + +## Relaterade verktyg + +- [ODS till PDF](./ods-to-pdf) +- [ODP till PDF](./odp-to-pdf) +- [VSD till PDF](./vsd-to-pdf) diff --git a/docs/sv/tools/odp-to-pdf.md b/docs/sv/tools/odp-to-pdf.md new file mode 100644 index 00000000..513e8932 --- /dev/null +++ b/docs/sv/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP till PDF +description: Konvertera LibreOffice Impress-presentationer (ODP) till PDF i webbläsaren. Gratis, privat, ingen uppladdning. +--- + +# ODP till PDF + +Konvertera OpenDocument Presentation-filer till PDF. ODP är det inbyggda formatet för LibreOffice Impress och en standardexport från Google Slides. När presentationer görs om till PDF-filer kan vem som helst visa dem utan presentationsprogram, och bilderna skrivs ut rent. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :------------------------ | :--------- | :----------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides-export | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina ODP-filer. Du kan välja flera presentationer på en gång. +2. Granska fillistan. Ta bort poster med papperskorgsikonen, eller använd **Lägg till fler filer** för att lägga till fler presentationer. +3. Klicka på **Konvertera till PDF**. Den LibreOffice-baserade motorn bearbetar varje presentation och skapar en PDF där varje bild blir en sida. +4. En enskild fil laddas ned som PDF. Flera filer levereras i ett ZIP-arkiv med namnet `odp-to-pdf.zip`. + +## Alternativ + +Inga inställningar att konfigurera. Varje bild renderas i sina ursprungliga mått och bevarar text, bilder, former och bildbakgrunder. + +## Användningsområden + +- Dela ut en presentation till en publik som PDF-utdelningsmaterial +- Dela Google Slides-exporter med personer som föredrar PDF framför ODP +- Arkivera konferensföredrag och föreläsningar i ett skrivskyddat format +- Skriva ut bildspel för workshops på plats + +## Tips + +- Bildövergångar och animationer är rent visuella funktioner som inte följer med till PDF, men allt statiskt innehåll renderas korrekt. +- Talaranteckningar ingår inte i PDF-resultatet. Om du behöver anteckningarna exporterar du dem separat från ditt presentationsprogram. +- Precis som de andra LibreOffice-baserade verktygen laddas motorn vid första användningen och förblir cachad under sessionen. + +## Relaterade verktyg + +- [ODG till PDF](./odg-to-pdf) +- [ODS till PDF](./ods-to-pdf) +- [PUB till PDF](./pub-to-pdf) diff --git a/docs/sv/tools/ods-to-pdf.md b/docs/sv/tools/ods-to-pdf.md new file mode 100644 index 00000000..11b3741c --- /dev/null +++ b/docs/sv/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS till PDF +description: Konvertera LibreOffice Calc-kalkylblad (ODS) till PDF i webbläsaren. Gratis, privat, ingen registrering. +--- + +# ODS till PDF + +Konvertera OpenDocument Spreadsheet-filer till PDF. ODS är det inbyggda formatet i LibreOffice Calc och en vanlig exportmetod från Google Sheets. Verktyget renderar kalkylbladets data, formatering och diagram till en sidindelad PDF som du kan skriva ut eller dela. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----------------------- | :--------- | :-------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / Google Sheets-export | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina ODS-filer. Flera filer stöds. +2. Granska fillistan. Använd papperskorgsikonen för att ta bort filer, eller klicka på **Lägg till fler filer** för att utöka gruppen. +3. Klicka på **Konvertera till PDF**. LibreOffice-motorn laddas i webbläsaren och renderar varje kalkylblad till PDF-sidor. +4. Ett enskilt kalkylblad laddas ner som en PDF. Flera filer paketeras i `ods-to-pdf.zip`. + +## Alternativ + +Ingen konfiguration krävs. Konverteraren använder kalkylbladets befintliga utskriftslayout, cellformatering och kolumnbredder i PDF-utdata. + +## Användningsområden + +- Dela en budget eller rapport från LibreOffice Calc med någon som bara tar emot PDF-filer +- Skriva ut en Google Sheets-export som laddats ner som ODS +- Arkivera ekonomiska underlag i ett format som inte kan redigeras +- Skicka in ODS-baserade formulär eller tidrapporter som dokument med fast layout + +## Tips + +- Om ditt kalkylblad har flera blad ingår alla blad i PDF-utdata. +- Mycket breda kalkylblad kan sträcka sig över flera PDF-sidor på bredden. Justera kolumnbredderna i källfilen innan konverteringen om layouten är viktig. +- LibreOffice-motorn initieras vid första användningen. Följande konverteringar i samma session går snabbare. + +## Relaterade verktyg + +- [ODG till PDF](./odg-to-pdf) +- [ODP till PDF](./odp-to-pdf) +- [XML till PDF](./xml-to-pdf) diff --git a/docs/sv/tools/odt-to-pdf.md b/docs/sv/tools/odt-to-pdf.md new file mode 100644 index 00000000..49654878 --- /dev/null +++ b/docs/sv/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT till PDF +description: Konvertera OpenDocument Text-filer (ODT) till PDF i webbläsaren med en LibreOffice-driven motor. +--- + +# ODT till PDF + +Konvertera OpenDocument Text-filer till PDF. ODT är det inbyggda formatet i LibreOffice Writer, Apache OpenOffice och andra ordbehandlare med öppen källkod. Verktyget använder en webbläsarbaserad LibreOffice-motor för exakta konverteringar som bevarar formatering, tabeller, bilder och stilar. + +## Format som stöds + +| Format | Filändelser | +| :---------------- | :---------- | +| OpenDocument Text | `.odt` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp en eller flera ODT-filer. +2. Granska fillistan. Lägg till fler filer eller ta bort oönskade. +3. Klicka på **Konvertera till PDF**. LibreOffice-motorn initieras (en förloppsindikator visar laddningsstatus) och därefter konverteras varje fil. +4. En enskild fil laddas ner direkt som en PDF. Flera filer paketeras i `odt-converted.zip`. + +## Alternativ + +Verktyget har ingen extra konfiguration. Konverteringen bevarar originaldokumentets formatering så noga som möjligt. + +## Utdata + +| Antal indatafiler | Utdata | +| :---------------- | :--------------------------------------------------- | +| 1 fil | Nedladdning av en enskild PDF (t.ex. `document.pdf`) | +| 2+ filer | ZIP-arkiv (`odt-converted.zip`) med en PDF per fil | + +## Användningsområden + +- Konvertera LibreOffice Writer-dokument till PDF för att dela med användare av Microsoft Office +- Skapa utskriftsklara PDF-filer från akademiska uppsatser skrivna i OpenDocument-format +- Massomvandla en mapp med ODT-mallar till PDF-filer för distribution +- Skapa PDF-filer från ODT-filer som genererats av automatiserade dokumentsystem + +## Tips + +- LibreOffice-motorn laddas vid första användningen och cachas för följande konverteringar. Den första laddningen tar några sekunder, därefter går konverteringarna snabbt. +- Komplexa dokument med inbäddade OLE-objekt eller ovanliga teckensnitt kan återges något annorlunda än i LibreOffice på skrivbordet. Testa med ett prov innan du massomvandlar. +- För Word-dokument (`.doc`, `.docx`), använd verktyget [Word till PDF](./word-to-pdf) i stället. Det använder också LibreOffice-motorn men tar emot Microsofts format direkt. + +## Relaterade verktyg + +- [Word till PDF](./word-to-pdf) +- [RTF till PDF](./rtf-to-pdf) +- [Text till PDF](./txt-to-pdf) diff --git a/docs/sv/tools/organize-pdf.md b/docs/sv/tools/organize-pdf.md new file mode 100644 index 00000000..1c0c0fcb --- /dev/null +++ b/docs/sv/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Duplicera & organisera +description: Ändra ordning på, duplicera och ta bort PDF-sidor med miniatyrer som du drar och släpper, eller ange en egen sidordning. +--- + +# Duplicera & organisera + +Ordna om, duplicera och ta bort sidor i en PDF med ett visuellt gränssnitt där du drar och släpper. Varje sida visas som en miniatyr som du kan flytta, klona eller ta bort innan resultatet sparas som en ny fil. + +## Så fungerar det + +1. Ladda upp en enskild PDF-fil. +2. Verktyget renderar ett miniatyrrutnät med alla sidor. +3. Dra miniatyrer för att ändra ordning, klicka på den gröna dupliceringsknappen för att klona en sida eller på den röda borttagningsknappen för att ta bort en. +4. Du kan också ange en egen sidordning i textfältet (t.ex. `3, 1, 2, 4`) och klicka på **Tillämpa** för att ordna om alla sidor på en gång. +5. Klicka på bearbetningsknappen för att bygga och ladda ner den omorganiserade PDF-filen. + +## Funktioner + +- Omordning av sidor med dra och släpp och animerade övergångar +- Knappar för att duplicera och ta bort enskilda sidor +- Inmatning av egen sidordning för exakt omordning +- Sidnummeretiketter som uppdateras automatiskt efter varje ändring +- Hindrar att den sista återstående sidan tas bort + +## Användningsområden + +- Flytta en felplacerad sida till rätt plats i en rapport +- Duplicera en formulärsida så att du får flera tomma kopior i en fil +- Ta bort utkast eller platshållarsidor innan ett dokument distribueras +- Vända eller blanda sidordningen inför utskrift +- Bygga en egen sidföljd utan att sammanfoga separata filer på nytt + +## Tips + +- Fältet för egen sidordning förväntar sig kommaseparerade ursprungliga sidnummer. Det måste innehålla varje sida exakt en gång, utan utelämnade eller dubbla sidor. +- När du har duplicerat en sida refererar båda kopiorna till samma ursprungliga sidindex. Du kan ordna om var och en för sig. +- För massåtgärder över flera filer eller mer avancerade arbetsflöden, använd [PDF multiverktyg](./pdf-multi-tool) i stället. + +## Relaterade verktyg + +- [Sammanfoga PDF](./merge-pdf) +- [Ta bort sidor](./delete-pages) +- [PDF multiverktyg](./pdf-multi-tool) +- [Omvänd sidor](./reverse-pages) diff --git a/docs/sv/tools/page-dimensions.md b/docs/sv/tools/page-dimensions.md new file mode 100644 index 00000000..8ef38b1a --- /dev/null +++ b/docs/sv/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Sidmått +description: Analysera PDF-sidors storlek, orientering, bildformat och rotation. Upptäck dokument med blandade storlekar och exportera data till CSV. +--- + +# Sidmått + +Ett diagnostikverktyg som läser varje sida i din PDF och rapporterar exakta mått, orientering, standardstorlekens namn, bildformat, area och rotation. Användbart för att upptäcka sidor med blandade storlekar före utskrift eller för att dokumentera egenskaperna hos en PDF du fått. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Analysen startar automatiskt, ingen knapp behöver tryckas. +2. En sammanfattningspanel visar totalt antal sidor, antal unika sidstorlekar och om dokumentet har blandade storlekar. +3. Bläddra i hela resultattabellen med uppgifter per sida. +4. Växla visningsenhet mellan punkter, tum, millimeter eller pixlar. +5. Klicka på **Exportera till CSV** för att spara data. + +## Rapporterade fält + +| Kolumn | Beskrivning | +| --------------- | ------------------------------------------------- | +| Sida # | Löpande sidnummer | +| Mått | Bredd x höjd i vald enhet | +| Standardstorlek | Matchat namn (A4, Letter osv.) eller "Anpassad" | +| Orientering | Stående eller liggande | +| Bildformat | Förhållandet mellan bredd och höjd som decimaltal | +| Area | Sidans area i vald enhet i kvadrat | +| Rotation | Sidans rotation i grader | + +## Funktioner + +- Automatisk identifiering av standardpappersstorlekar (A3, A4, A5, Letter, Legal, Tabloid med fler) +- Varning för dokument med blandade storlekar, med en uppdelning av vilka storlekar som förekommer och hur många sidor som använder var och en +- Enhetsomvandling mellan punkter, tum, millimeter och pixlar (vid 96 PPI) +- CSV-export för användning i kalkylblad eller dokumentationssystem + +## Användningsområden + +- Kontrollera att alla sidor är A4 innan ett dokument skickas till ett tryckeri +- Ta reda på varför en sammanfogad PDF skrivs ut med oväntade marginaler på vissa sidor +- Dokumentera sidlayouten i ett stort PDF-arkiv för metadataregister +- Hitta roterade sidor som behöver korrigeras + +## Tips + +- Om sammanfattningen visar "Blandade storlekar", använd verktyget Fixa sidstorlek för att standardisera före utskrift. +- Rotationsfältet hjälper dig att hitta sidor som visas korrekt men har ett rotationsattribut som inte är noll, vilket kan orsaka problem i vissa arbetsflöden. + +## Relaterade verktyg + +- [Fixa sidstorlek](./fix-page-size): standardisera sidor efter att du hittat blandade storlekar +- [Komprimera PDF](./compress-pdf): optimera PDF-filen efter att sidproblem åtgärdats +- [Rotera PDF](./rotate-pdf): korrigera roterade sidor diff --git a/docs/sv/tools/page-numbers.md b/docs/sv/tools/page-numbers.md new file mode 100644 index 00000000..c3c8fb1e --- /dev/null +++ b/docs/sv/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Sidnummer +description: Lägg till anpassningsbara sidnummer på valfri plats på PDF-sidorna, med inställbart teckensnitt, storlek och färg. +--- + +# Sidnummer + +Lägg till synliga sidnummer på varje sida i din PDF. Du väljer placering, format, teckenstorlek och färg, verktyget sköter resten. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Ställ in sidnumren i alternativpanelen som visas. +3. Klicka på **Lägg till sidnummer** för att bearbeta. +4. Den numrerade PDF-filen laddas ner automatiskt. + +## Alternativ + +- **Placering**: Välj var sidnumren visas: nere i mitten, nere till vänster, nere till höger, uppe i mitten, uppe till vänster eller uppe till höger. +- **Format**: Välj mellan enkel numrering (1, 2, 3...) eller formatet "sida X av Y" (1 / 5, 2 / 5...). +- **Teckenstorlek**: Ange storleken på sidnumrets text. Standardvärdet är 12. +- **Färg**: Välj valfri färg för sidnumrets text med färgväljaren. + +## Funktioner + +- Sex placeringsalternativ som täcker alla hörn och mittpositioner +- Två numreringsformat: enkel löpande numrering eller "sida X av Y" +- Anpassningsbar teckenstorlek från 6 till 72 punkter +- Fullständig färgväljare för textfärg +- Automatisk marginalhantering som håller numren inom säkra områden oavsett sidstorlek + +## Användningsområden + +- Förbereda dokument för utskrift som behöver synliga sidhänvisningar +- Lägga till sidnummer i en sammanfogad PDF som skapats av flera källfiler +- Numrera presentationsutdrag innan de delas ut +- Lägga till löpande numrering i juridiska dokument eller avtal + +## Tips + +- Formatet "sida X av Y" är användbart för dokument där läsaren behöver veta den totala längden, som offerter eller rapporter. +- Om du behöver olika numreringsstilar för olika avsnitt (som romerska siffror för förstasidor), använd verktyget [Lägg till sidetiketter](./add-page-labels) i stället. + +## Relaterade verktyg + +- [Lägg till sidetiketter](./add-page-labels) +- [Bates-numrering](./bates-numbering) +- [Sidhuvud & sidfot](./header-footer) diff --git a/docs/sv/tools/pdf-booklet.md b/docs/sv/tools/pdf-booklet.md new file mode 100644 index 00000000..7cf0c381 --- /dev/null +++ b/docs/sv/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF-broschyr +description: Ordna om PDF-sidor i broschyrordning (häftning) för att vika och hefta till en fysisk broschyr. +--- + +# PDF-broschyr + +Ordna om sidorna i en PDF enligt broschyrimposition. När den skrivs ut dubbelsidigt och viks på mitten hamnar sidorna i rätt läsordning. Det här är layouten som används för häftade broschyrer och zines. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Ställ in broschyrens inställningar: utdatans sidstorlek och orientering. +3. Klicka på **Skapa förhandsvisning** för att se hur sidorna placeras på varje ark. +4. Granska förhandsvisningen, som visar varje fysiskt ark med sidorna på fram- och baksidan. +5. Klicka på **Ladda ner** för att spara den broschyrimponerade PDF-filen. + +## Funktioner + +- Automatisk omordning av sidor för häftning +- Inställbar sidstorlek för utdata +- Visuell förhandsvisning av broschyrlayouten före nedladdning +- Hanterar udda sidantal genom att infoga tomma sidor där det behövs +- Skalar källsidorna så att de passar broschyrarkets storlek + +## Användningsområden + +- Skapa utskrivbara broschyrer eller zines från en vanlig PDF +- Förbereda konferensprogram eller evenemangsguider för egen utskrift +- Göra vikta gratulationskort eller små kataloger +- Producera småskrifter eller diktsamlingar för handbindning + +## Tips + +- Antalet sidor i din käll-PDF bör helst vara en multipel av 4 för en snygg broschyr. Om det inte är det läggs tomma sidor till automatiskt för att fylla det sista arket. +- Skriv ut dubbelsidigt med skrivarens inställning "vänd på kortsidan", vik sedan alla ark tillsammans och hefta i ryggen. +- Om du bara vill placera flera sidor på ett ark utan broschyrordning, använd [N-Up PDF](./n-up-pdf) i stället. + +## Relaterade verktyg + +- [N-Up PDF](./n-up-pdf) +- [Rotera PDF](./rotate-pdf) +- [Lägg till tom sida](./add-blank-page) diff --git a/docs/sv/tools/pdf-layers.md b/docs/sv/tools/pdf-layers.md new file mode 100644 index 00000000..e8824ebd --- /dev/null +++ b/docs/sv/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF OCG-lager +description: Visa, växla, lägg till och ta bort Optional Content Group-lager (OCG) i ett PDF-dokument. +--- + +# PDF OCG-lager + +Hantera Optional Content Groups (OCG), vanligen kallade "lager", i en PDF. Du kan växla lagrens synlighet, lägga till nya lager (även underlager), ta bort lager och spara den ändrade PDF-filen. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Klicka på bearbetningsknappen för att läsa in dokumentet med PyMuPDF-motorn. +3. Verktyget visar alla befintliga lager med synlighet, låsstatus och nästlad hierarki. +4. Använd kryssrutorna för att visa eller dölja lager. Låsta lager kan inte växlas. +5. Lägg till nya lager på översta nivån genom att skriva ett namn och klicka på lägg till-knappen, eller lägg till underlager under ett befintligt överordnat lager. +6. Ta bort lager som du inte längre behöver. +7. Klicka på **Spara** för att ladda ner den ändrade PDF-filen med dina lagerändringar. + +## Funktioner + +- Visar lagerhierarkin med korrekt indrag för nästlade lager +- Slå på eller av lagrets synlighet +- Indikator för låsta lager förhindrar oavsiktliga ändringar +- Lägg till lager på översta nivån eller underlager med egna namn +- Ta bort enskilda lager +- Sparar alla ändringar i en ny PDF-fil + +## Användningsområden + +- Växla synligheten för markeringslager i arkitekt- eller konstruktionsritningar +- Lägga till nya anteckningslager i ett designdokument med många lager +- Ta bort föråldrade lager från en mall innan den distribueras +- Undersöka vilka lager som finns i en komplex PDF från en tredje part + +## Tips + +- Om PDF-filen saknar lager visar verktyget ett tomt läge med en uppmaning att lägga till ett. Inte alla PDF-filer använder OCG-lager, de är vanligast i CAD-exporter och designfiler. +- Underlager visas med indrag under sitt överordnade lager. Du kan nästla lager till valfritt djup. +- Låsta lager visas med en låsikon och deras kryssrutor är inaktiverade. Låsningarna har angetts av PDF-filens skapare. + +## Relaterade verktyg + +- [Visa metadata](./view-metadata) +- [Redigera metadata](./edit-metadata) +- [Duplicera & organisera](./organize-pdf) diff --git a/docs/sv/tools/pdf-multi-tool.md b/docs/sv/tools/pdf-multi-tool.md new file mode 100644 index 00000000..06e8da9e --- /dev/null +++ b/docs/sv/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF-multiverktyg +description: En allt-i-ett-sidhanterare för att sammanfoga, dela, rotera, duplicera, ta bort och ordna om PDF-sidor. +--- + +# PDF-multiverktyg + +En enhetlig arbetsyta för alla åtgärder på sidnivå i PDF. Ladda upp en eller flera PDF-filer och arbeta med alla deras sidor i ett enda visuellt rutnät. Rotera, ordna om, duplicera, ta bort, infoga nya PDF-filer, lägg till tomma sidor och dela resultatet, allt utan att lämna verktyget. + +## Så fungerar det + +1. Klicka på **Ladda upp PDF:er** eller dra filer till uppladdningsytan. Flera filer stöds. +2. Alla sidor från varje uppladdad fil visas i ett rullningsbart rutnät med miniatyrer. +3. Använd verktygsfältet eller knapparna för varje sida för att hantera sidor. +4. Markera sidor med kryssrutan på varje kort och tillämpa sedan massåtgärder. +5. Markera delningspunkter med saxikonen för att dela upp utdata i separata filer. +6. Klicka på **Exportera PDF** för att ladda ner slutresultatet. Om delningsmarkörer finns blir utdata en ZIP med flera PDF-filer. + +## Funktioner + +- **Sammanfoga**: Ladda upp flera PDF-filer så kombineras de automatiskt till en arbetsyta +- **Ordna om**: Dra och släpp sidkort för att ändra ordningen +- **Rotera**: Rotation per sida eller i bulk i steg om 90 grader (vänster eller höger) +- **Duplicera**: Klona valfri sida med ett klick +- **Ta bort**: Ta bort enskilda sidor eller markerade sidor på en gång +- **Infoga PDF**: Lägg till en ny PDF efter en viss sida +- **Lägg till tom sida**: Lägg till en tom A4-sida i slutet +- **Dela**: Placera delningsmarkörer mellan sidor och exportera sedan som en ZIP med separata PDF-filer +- **Markera alla / Avmarkera alla**: Snabbt urval för massåtgärder +- **Ångra / Gör om**: Fullständig ångra- och gör om-historik för varje åtgärd +- **Ladda ner markerade**: Exportera bara de markerade sidorna som en fristående PDF +- Reparerar skadade PDF-filer automatiskt innan de läses in + +## Användningsområden + +- Bygga ett eget dokument av sidor från flera käll-PDF:er +- Städa upp ett skannat dokument genom att ta bort tomma sidor, rotera sidvända skanningar och ordna om avsnitt +- Dela en stor PDF vid kapitelgränser med visuella delningsmarkörer +- Snabb redigering på sidnivå utan att behöva en fullständig PDF-redigerare + +## Tips + +- Ångra- och gör om-systemet spårar varje åtgärd. Använd det fritt, du kan inte råka förstöra ditt arbete. +- Delningsmarkörer visas som streckade blå linjer mellan sidor. Placera dem visuellt där du vill dela dokumentet och exportera sedan för att få en ZIP. +- För enkla uppgifter som sammanfogning eller delning kan de särskilda verktygen [Sammanfoga PDF](./merge-pdf) eller [Dela PDF](./split-pdf) gå snabbare. Multiverktyget är bäst när du behöver flera åtgärder i en session. + +## Relaterade verktyg + +- [Sammanfoga PDF](./merge-pdf) +- [Dela PDF](./split-pdf) +- [Duplicera & organisera](./organize-pdf) +- [Rotera PDF](./rotate-pdf) diff --git a/docs/sv/tools/pdf-to-bmp.md b/docs/sv/tools/pdf-to-bmp.md new file mode 100644 index 00000000..ba35086d --- /dev/null +++ b/docs/sv/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF till BMP +description: Konvertera PDF-sidor till okomprimerade BMP-bilder. Användbart för äldre system och utskriftsflöden som kräver bitmapp som indata. +--- + +# PDF till BMP + +Konverterar varje sida i en PDF till en BMP-bild (bitmapp). BMP är ett okomprimerat format, så utdata är pixelperfekt utan kvalitetsförlust, men filerna blir stora. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Klicka på **Konvertera** för att bearbeta filen. +3. En enskild `.bmp`-fil eller ett ZIP-arkiv laddas ner automatiskt. + +## Alternativ + +Verktyget har inga inställbara alternativ. Sidor renderas i fast 2x-skala, vilket ger bilder med ungefär dubbla PDF-sidans ursprungliga mått. + +## Utdataformat + +- **En sida**: `filename.bmp` +- **Flera sidor**: `filename_bmps.zip` med `page_1.bmp`, `page_2.bmp` osv. + +## Användningsområden + +- Mata in PDF-sidor i äldre system eller hårdvara som bara tar emot BMP. +- Förbereda okomprimerade bilder för vissa utskriftsflöden. +- Använda bitmappsutdata som indata till bildbehandlingsverktyg som kräver råa pixeldata. + +## Tips + +- BMP-filer blir mycket stora eftersom de lagrar råa pixeldata utan komprimering. För de flesta ändamål ger [PDF till PNG](./pdf-to-png) förlustfri kvalitet med mycket mindre filer. +- Om ditt målsystem accepterar PNG eller TIFF, välj hellre de formaten för att spara diskutrymme. + +## Relaterade verktyg + +- [PDF till PNG](./pdf-to-png) +- [PDF till TIFF](./pdf-to-tiff) +- [PDF till JPG](./pdf-to-jpg) diff --git a/docs/sv/tools/pdf-to-cbz.md b/docs/sv/tools/pdf-to-cbz.md new file mode 100644 index 00000000..67045f05 --- /dev/null +++ b/docs/sv/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF till CBZ +description: Konvertera en PDF till en CBZ-fil (Comic Book Archive) för serieläsare som Komga, Kavita, CDisplayEx och Calibre. +--- + +# PDF till CBZ + +Konverterar en PDF till en CBZ-fil (Comic Book ZIP), standardformatet för digitala serier och manga. Varje PDF-sida blir en bild i arkivet. Verktyget skapar metadata i tre format för maximal kompatibilitet: ComicInfo.xml, metadata.opf och ComicBookInfo JSON. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Välj bildformat, kvalitet, skala och valfri metadata. +3. Klicka på **Konvertera** för att skapa CBZ-filen. +4. Filen `.cbz` laddas ner automatiskt. + +## Alternativ + +| Alternativ | Värden | Standard | Beskrivning | +| ------------------ | --------------- | -------- | ----------------------------------------------------------------------------------- | +| Bildformat | JPEG, PNG, WebP | JPEG | JPEG för färgserier, PNG för förlustfri svartvit manga, WebP för bäst komprimering. | +| Kvalitet | 50–100% | 85% | Styr JPEG/WebP-komprimeringen. Dold för PNG (alltid förlustfri). | +| Skala | 1.0x–4.0x | 2.0x | Högre skala ger skarpare bilder för skärmar med hög upplösning. | +| Gråskala | På/Av | Av | Konverterar sidor till gråskala. Minskar filstorleken för svartvitt innehåll. | +| Mangaläge | På/Av | Av | Anger läsriktning från höger till vänster i metadata. | +| Inkludera metadata | På/Av | På | Bäddar in ComicInfo.xml, metadata.opf och ComicBookInfo JSON. | + +## Metadatafält + +När metadata är aktiverat kan du fylla i: + +- **Titel**: Identifieras automatiskt från PDF-filens namn. +- **Serie**: Seriens namn (t.ex. "Naruto"). +- **Nummer (#)**: Utgåvans nummer i serien. +- **Volym (Vol.)**: Volymnummer. +- **Författare**: Manusförfattarens eller skaparens namn. +- **Förlag**: Förlaget. +- **Taggar / Genre**: Kommaseparerade taggar (t.ex. "Action, Äventyr"). +- **Utgivningsår**: Utgivningsår (1900–2100). +- **Betyg**: Communityns betyg från 0 till 5. + +## Metadatakompatibilitet + +Verktyget skriver metadata i tre format så att varje läsare kan hitta den: + +| Format | Plats | Stöds av | +| ------------------ | ------------------ | ------------------------------------------- | +| ComicInfo.xml | Fil i ZIP-arkivet | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Fil i ZIP-arkivet | Calibre | +| ComicBookInfo JSON | ZIP-kommentarsfält | Calibre (reserv) | + +## Utdataformat + +- `filename.cbz`: Ett ZIP-arkiv med numrerade sidbilder och metadatafiler. + +Sidbilderna namnges med nollutfyllda nummer (`01.jpg`, `02.jpg` osv.) så att läsare visar dem i rätt ordning. + +## Användningsområden + +- Konvertera manga- eller serie-PDF:er för användning i serieläsare. +- Bygga ett digitalt serie-bibliotek i Komga, Kavita eller Calibre. +- Konvertera inskannade serietidningar till ett läsarvänligt format. +- Dela serier i ett format som bevarar läsriktning och metadata. + +## Tips + +- Använd **JPEG** för färgserier och **PNG** för svartvit manga, eftersom PNG komprimerar svartvitt innehåll mycket effektivt. +- Aktivera **Gråskala** för manga för att minska filstorleken avsevärt. +- Fyll i fälten **Serie** och **Nummer** så att biblioteksverktyg (Komga, Calibre) kan organisera din samling automatiskt. +- **WebP** ger bäst komprimering, men äldre serieläsare kanske inte stöder det. + +## Relaterade verktyg + +- [PDF till JPG](./pdf-to-jpg) +- [PDF till PNG](./pdf-to-png) +- [PDF till TIFF](./pdf-to-tiff) +- [Extrahera bilder](./extract-images) diff --git a/docs/sv/tools/pdf-to-csv.md b/docs/sv/tools/pdf-to-csv.md new file mode 100644 index 00000000..f043c1ad --- /dev/null +++ b/docs/sv/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF till CSV +description: Extrahera tabeller från PDF-dokument och exportera dem som en enda CSV-fil. Hanterar PDF-filer med flera sidor med automatisk tabellidentifiering. +--- + +# PDF till CSV + +Extraherar tabeller från en PDF och exporterar dem som en CSV-fil. Verktyget söker igenom varje sida efter tabelldata med PyMuPDF:s tabellidentifiering och skriver alla hittade rader i en enda kommaseparerad utdatafil. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Klicka på **Konvertera** för att starta tabellextraheringen. +3. Verktyget söker igenom varje sida och identifierar tabeller automatiskt. +4. En `.csv`-fil laddas ner med alla extraherade tabelldata. + +Tabeller från olika sidor skiljs åt med tomma rader i utdata. Celler som innehåller kommatecken, citattecken eller radbrytningar escapas korrekt enligt RFC 4180. + +## Alternativ + +Verktyget har inga inställbara alternativ. Alla tabeller som hittas i dokumentet extraheras och kombineras i en enda CSV. + +## Utdataformat + +- En enda `filename.csv`-fil med alla identifierade tabeller. + +## Användningsområden + +- Hämta ekonomiska data från PDF-kontoutdrag eller fakturor till ett kalkylblad. +- Extrahera pristabeller från leverantörsoffert för jämförelse. +- Konvertera tabelldata från PDF-artiklar till ett format som passar analysverktyg. +- Migrera data från äldre PDF-rapporter till databaser. + +## Tips + +- Om inga tabeller hittas visar verktyget meddelandet "Inga tabeller hittades". Det beror oftast på att PDF-filen har en textlayout som ser ut som en tabell men inte är uppbyggd som en riktig tabell. +- För mer kontroll över enskilda tabeller, använd [Extrahera PDF-tabeller](./extract-tables), där du kan välja mellan CSV, JSON och Markdown som utdataformat. +- Om du behöver data i Excel-format med separata blad för varje tabell, använd [PDF till Excel](./pdf-to-excel). + +## Relaterade verktyg + +- [PDF till Excel](./pdf-to-excel) +- [Extrahera PDF-tabeller](./extract-tables) +- [PDF till text](./pdf-to-text) diff --git a/docs/sv/tools/pdf-to-excel.md b/docs/sv/tools/pdf-to-excel.md new file mode 100644 index 00000000..44e9df52 --- /dev/null +++ b/docs/sv/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF till Excel +description: Extrahera tabeller från PDF-dokument till ett Excel-kalkylblad. Varje tabell får ett eget kalkylblad med sidhänvisning. +--- + +# PDF till Excel + +Extraherar tabeller från en PDF och sparar dem som ett Excel-kalkylblad (`.xlsx`). Varje identifierad tabell placeras på ett eget blad, märkt med tabellnummer och källsida. Drivs av PyMuPDF för tabellidentifiering och biblioteket SheetJS för att skapa Excel-filen. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Klicka på **Konvertera** för att starta tabellextraheringen. +3. Verktyget söker igenom varje sida efter tabeller och bygger sedan en Excel-arbetsbok. +4. En `.xlsx`-fil laddas ner med ett blad per tabell. + +## Alternativ + +Verktyget har inga inställbara alternativ. Alla identifierade tabeller extraheras automatiskt. + +## Utdataformat + +- En enda `filename.xlsx`-fil. +- **En tabell**: ett enda blad med namnet "Table". +- **Flera tabeller**: blad med namnen "Table 1 (Page 3)", "Table 2 (Page 5)" osv. Bladnamn kortas till 31 tecken (Excels gräns). + +## Användningsområden + +- Konvertera ekonomiska PDF-rapporter till redigerbara kalkylblad för vidare analys. +- Extrahera lager- eller beställningstabeller från leverantörers PDF-filer. +- Hämta strukturerade data från PDF-formulär eller kataloger till Excel för sortering och filtrering. +- Arkivera tabelldata från PDF i ett format som kollegor utan teknisk bakgrund kan arbeta med. + +## Tips + +- Om verktyget rapporterar "Inga tabeller hittades" använder PDF-filen sannolikt en fri textlayout i stället för strukturerade tabeller. Prova [PDF till text](./pdf-to-text) för att hämta det råa innehållet. +- För ett enklare platt format, använd [PDF till CSV](./pdf-to-csv). För nedladdning per tabell i flera format, använd [Extrahera PDF-tabeller](./extract-tables). +- Titta på bladnamnen för att se vilken sida varje tabell kommer från. + +## Relaterade verktyg + +- [PDF till CSV](./pdf-to-csv) +- [Extrahera PDF-tabeller](./extract-tables) +- [PDF till text](./pdf-to-text) diff --git a/docs/sv/tools/pdf-to-greyscale.md b/docs/sv/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..afe1270b --- /dev/null +++ b/docs/sv/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF till gråskala +description: Konvertera en PDF i färg till en gråskaleversion (svartvit). Skapar en ny PDF där all färg är borttagen från varje sida. +--- + +# PDF till gråskala + +Konverterar en PDF i färg till en gråskaleversion. Varje sida renderas, avmättas och bäddas in på nytt som en JPEG-bild i en ny PDF. Utdata bevarar de ursprungliga sidmåtten. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Klicka på **Konvertera** för att bearbeta filen. +3. En ny `greyscale.pdf` laddas ner med alla sidor konverterade till svartvitt. + +Bakom kulisserna renderas varje sida i 2x-skala, pixeldata körs genom ett gråskalefilter och kodas sedan om som JPEG med 90 % kvalitet och placeras i ett nytt PDF-dokument. + +## Alternativ + +Verktyget har inga inställbara alternativ. Gråskalekonverteringen använder en standardformel för luminans och JPEG-kvaliteten är fast på 90 %. + +## Utdataformat + +- En enda `greyscale.pdf`-fil med alla sidor som JPEG-bilder i gråskala. + +## Användningsområden + +- Förbereda dokument för svartvit utskrift för att spara på färgbläck. +- Uppfylla inlämningskrav för juridiska eller offentliga handlingar som kräver gråskala. +- Minska filstorleken på färgtunga PDF-filer (JPEG-bilder i gråskala är mindre än färgbilder). +- Skapa en enhetlig visuell stil i dokument med blandade färg- och svartvita sidor. + +## Tips + +- Eftersom varje sida rastreras och bäddas in som JPEG är utdata bildbaserad. Text i den ursprungliga PDF-filen går inte längre att markera eller söka i. Om du behöver sökbar text efteråt kan du köra utdata genom OCR-verktyget. +- För mer kontroll över färgjusteringar (ljusstyrka, kontrast, mättnad), titta på verktyget Justera färger eller noden Gråskala i [PDF-arbetsflödesbyggare](./pdf-workflow). + +## Relaterade verktyg + +- [PDF till JPG](./pdf-to-jpg) +- [PDF till PNG](./pdf-to-png) +- [PDF-arbetsflödesbyggare](./pdf-workflow) diff --git a/docs/sv/tools/pdf-to-jpg.md b/docs/sv/tools/pdf-to-jpg.md new file mode 100644 index 00000000..c35796c6 --- /dev/null +++ b/docs/sv/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF till JPG +description: Konvertera PDF-sidor till JPG-bilder med justerbar kvalitet. PDF-filer med en sida laddas ner direkt, filer med flera sidor exporteras som ZIP. +--- + +# PDF till JPG + +Konverterar varje sida i en PDF till en JPG-bild. Dokument med en sida laddas ner som en fristående `.jpg`-fil. PDF-filer med flera sidor ger ett ZIP-arkiv med en JPG per sida. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. Verktyget visar filnamn, filstorlek och antal sidor. +2. Justera reglaget **Kvalitet** för att styra JPG-komprimeringen. +3. Klicka på **Konvertera** för att starta bearbetningen. +4. Resultatet laddas ner automatiskt: en enda JPG för PDF-filer med en sida eller en ZIP-fil för dokument med flera sidor. + +## Alternativ + +- **Kvalitet**: ett reglage från 0 % till 100 % (standard 90 %). Högre värden ger skarpare bilder med större filer. Lägre värden komprimerar hårdare. + +Sidor renderas internt i 2x-skala, så utdataupplösningen är dubbelt så stor som PDF-sidans mått. En vanlig sida i Letter-storlek ger en bild på ungefär 1 224 x 1 584 pixlar. + +## Utdataformat + +- **En sida**: `filename.jpg` +- **Flera sidor**: `filename_jpgs.zip` med `page_1.jpg`, `page_2.jpg` osv. + +## Användningsområden + +- Skapa förhandsminiatyrer för ett dokumenthanteringssystem. +- Dela en sida från en rapport i en chatt eller ett e-postprogram som inte stöder PDF. +- Skapa bildresurser från PDF-diagram eller illustrationer. +- Arkivera skannade dokument som enskilda bilder. + +## Tips + +- För förlustfri utdata, använd [PDF till PNG](./pdf-to-png) i stället. +- En kvalitetsinställning på 80-90 % ger en bra balans mellan filstorlek och visuell återgivning. +- Om du behöver ett visst format per sida kan du använda [PDF-arbetsflödesbyggare](./pdf-workflow), som har en utdatanod för PDF till bilder. + +## Relaterade verktyg + +- [PDF till PNG](./pdf-to-png) +- [PDF till WebP](./pdf-to-webp) +- [PDF till BMP](./pdf-to-bmp) +- [PDF till TIFF](./pdf-to-tiff) diff --git a/docs/sv/tools/pdf-to-json.md b/docs/sv/tools/pdf-to-json.md new file mode 100644 index 00000000..23bf2f81 --- /dev/null +++ b/docs/sv/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF till JSON +description: Konvertera PDF-filer till strukturerat JSON-format med CPDF. Exporterar PDF-filens interna struktur som maskinläsbara JSON-data. +--- + +# PDF till JSON + +Konverterar en eller flera PDF-filer till JSON-format. Verktyget använder CPDF (Coherent PDF) för att serialisera varje PDF-fils interna struktur till en maskinläsbar JSON-representation. Utdata levereras alltid som ett ZIP-arkiv. + +## Så fungerar det + +1. Välj en eller flera PDF-filer med filväljaren. +2. Klicka på **Konvertera** för att starta bearbetningen. Konverteringen körs i en webbworker i bakgrunden. +3. Ett ZIP-arkiv laddas ner med en JSON-fil för varje PDF. + +Statusraden visar förloppet genom konverteringen och skapandet av ZIP-filen. + +## Alternativ + +Verktyget har inga inställbara alternativ. Varje PDF konverteras till sin fullständiga JSON-representation. + +## Utdataformat + +- En `pdfs-to-json.zip`-fil med `filename.json` för varje PDF. + +JSON-utdata representerar PDF-filens interna objektstruktur, inklusive sidträd, typsnittsreferenser, metadata och innehållsströmmar. + +## Användningsområden + +- Undersöka en PDF-fils interna struktur för felsökning eller validering. +- Extrahera strukturerad metadata och sidegenskaper programmatiskt. +- Mata in PDF-strukturdata i egna bearbetningskedjor. +- Granska PDF-dokument för efterlevnad genom att analysera deras objektträd. + +## Tips + +- Verktyget ger den råa PDF-objektstrukturen, inte extraherat textinnehåll. Om du behöver sidtext i JSON-format, använd [Förbered PDF för AI](./prepare-pdf-for-ai) i stället. +- För ren textextrahering är [PDF till text](./pdf-to-text) enklare. +- Stora PDF-filer med komplex struktur ger mycket stora JSON-filer. + +## Relaterade verktyg + +- [PDF till text](./pdf-to-text) +- [Förbered PDF för AI](./prepare-pdf-for-ai) +- [Extrahera PDF-tabeller](./extract-tables) diff --git a/docs/sv/tools/pdf-to-markdown.md b/docs/sv/tools/pdf-to-markdown.md new file mode 100644 index 00000000..87d73c79 --- /dev/null +++ b/docs/sv/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF till Markdown +description: Konvertera PDF-dokument till Markdown-format med valfri bildextrahering. Stöder batchkonvertering av flera filer. +--- + +# PDF till Markdown + +Konverterar PDF-filer till Markdown-format (`.md`) och bevarar rubriker, stycken, listor och enkel formatering. Kan även extrahera och inkludera inbäddade bilder. Stöder konvertering av enskilda filer och batchkonvertering. Drivs av PyMuPDF. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppytan eller dra filer dit. +2. Slå vid behov på **Inkludera bilder** för att bädda in extraherade bilder i Markdown-utdata. +3. Klicka på **Konvertera** för att starta bearbetningen. +4. En enskild fil laddas ner som `filename.md`. Flera filer ger en `markdown-files.zip`. + +## Alternativ + +- **Inkludera bilder**: när det är markerat extraheras inbäddade bilder från PDF-filen och refereras i Markdown-utdata. När det inte är markerat konverteras bara textinnehållet. + +## Utdataformat + +- **En fil**: `filename.md` +- **Flera filer**: `markdown-files.zip` med en `.md` per PDF. + +## Användningsområden + +- Konvertera PDF-dokumentation till Markdown för en statisk webbplatsgenerator som VitePress, Hugo eller Jekyll. +- Göra PDF-forskningsartiklar till redigerbar Markdown för anteckningsappar som Obsidian. +- Migrera äldre PDF-kunskapsbaser till ett Git-vänligt textformat. +- Extrahera strukturerat innehåll från PDF-e-böcker för omformatering. + +## Tips + +- Alternativet Inkludera bilder är användbart när PDF-filen innehåller diagram eller figurer som är avgörande för innehållet. Stäng av det för textbaserade dokument så blir utdata renare. +- Komplexa layouter med sidofält, fotnoter eller text i flera kolumner kan ge ofullständig Markdown. Granska och justera utdata vid behov. +- För rå text utan formatering, använd [PDF till text](./pdf-to-text) i stället. + +## Relaterade verktyg + +- [PDF till text](./pdf-to-text) +- [PDF till Word](./pdf-to-word) +- [Förbered PDF för AI](./prepare-pdf-for-ai) diff --git a/docs/sv/tools/pdf-to-pdfa.md b/docs/sv/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..3ef76188 --- /dev/null +++ b/docs/sv/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF till PDF/A +description: Konvertera vanliga PDF-filer till PDF/A-format för långtidsarkivering. Stöder konformitetsnivåerna PDF/A-1b, PDF/A-2b och PDF/A-3b. +--- + +# PDF till PDF/A + +PDF/A är en ISO-standardiserad delmängd av PDF som utformats för långsiktig digital bevarande. Verktyget konverterar dina vanliga PDF-filer till PDF/A-kompatibla dokument med Ghostscript som körs direkt i webbläsaren. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. +2. Välj en **PDF/A-version** i rullgardinsmenyn. +3. Aktivera vid behov **Platta till PDF i förväg** för komplexa filer som inte klarar en vanlig konvertering. +4. Klicka på **Konvertera till PDF/A**. Flera filer ger ett ZIP-arkiv. + +## PDF/A-versioner + +| Version | Begränsningar | Bäst för | +| ------------ | ----------------------------------------- | -------------------------------------------------- | +| **PDF/A-1b** | Strängast. Ingen transparens, inga lager. | Maximal kompatibilitet med äldre arkivsystem | +| **PDF/A-2b** | Tillåter transparens och JPEG2000. | Allmän arkivering (rekommenderas) | +| **PDF/A-3b** | Tillåter inbäddade bilagor i alla format. | Arkivering av dokument med underliggande datafiler | + +PDF/A-2b är förvalt och fungerar för de allra flesta arkiveringsbehov. + +## Alternativet att platta till i förväg + +Vissa PDF-filer innehåller funktioner som hindrar en ren PDF/A-konvertering, till exempel ovanliga typsnittskodningar, komplexa transparenslager eller trasiga interna strukturer. Om du aktiverar **Platta till i förväg** rastreras PDF-filen i 300 DPI före konverteringen, vilket garanterar efterlevnad men gör att texten inte längre går att markera. Använd det som reserv när den vanliga konverteringen ger fel. + +Att platta till i förväg kräver PyMuPDF WASM-motorn. + +## Användningsområden + +- Uppfylla offentliga eller juridiska arkivkrav (många jurisdiktioner kräver PDF/A för domstolshandlingar) +- Lämna in dokument till institutionella arkiv eller digitala bibliotek +- Bevara affärshandlingar där originalprogramvaran kanske inte finns om tio år +- Förbereda fakturor för e-fakturastandarder som kräver PDF/A-3b med XML-bilagor + +## Tips + +- Prova konverteringen utan att platta till i förväg först. Aktivera det bara om du får ett fel. +- PDF/A bäddar in alla typsnitt, så utdatafilerna blir ofta större än originalen. +- Validera utdata i en särskild PDF/A-validerare om ditt arbetsflöde kräver strikt efterlevnad. + +## Relaterade verktyg + +- [Komprimera PDF](./compress-pdf): minska filstorleken efter konverteringen +- [Platta till PDF](./flatten-pdf): platta till formulär före konvertering till PDF/A +- [Ta bort metadata](./remove-metadata): ta bort metadata före arkivering diff --git a/docs/sv/tools/pdf-to-png.md b/docs/sv/tools/pdf-to-png.md new file mode 100644 index 00000000..2a466e3f --- /dev/null +++ b/docs/sv/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF till PNG +description: Konvertera PDF-sidor till förlustfria PNG-bilder med justerbar skala. Idealiskt för högkvalitativa skärmbilder och genomskinliga bakgrunder. +--- + +# PDF till PNG + +Konverterar varje sida i en PDF till en PNG-bild. PNG använder förlustfri komprimering, så utdata bevarar varje detalj på originalsidan. PDF-filer med en sida laddas ner som en `.png`-fil, filer med flera sidor ger en ZIP. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Ställ in reglaget **Skala** för att styra utdataupplösningen. +3. Klicka på **Konvertera** för att starta bearbetningen. +4. En enskild PNG eller ett ZIP-arkiv laddas ner automatiskt. + +## Alternativ + +- **Skala**: från 1.0x till 3.0x (standard 2.0x). Vid 2.0x renderas en vanlig sida i Letter-storlek till ungefär 1 224 x 1 584 pixlar. Högre skalvärden ger större och skarpare bilder på bekostnad av filstorlek och bearbetningstid. + +## Utdataformat + +- **En sida**: `filename.png` +- **Flera sidor**: `filename_pngs.zip` med `page_1.png`, `page_2.png` osv. + +## Användningsområden + +- Ta högkvalitativa skärmbilder av PDF-sidor till presentationer. +- Extrahera diagram eller illustrationer som behöver skarpa kanter och inga komprimeringsartefakter. +- Förbereda resurser för webbdesign från PDF-skisser. +- Skapa förlustfria sidbilder för OCR-förbehandling. + +## Tips + +- PNG-filer är betydligt större än JPG. Om filstorleken är viktigare än perfekt kvalitet, använd [PDF till JPG](./pdf-to-jpg) eller [PDF till WebP](./pdf-to-webp). +- Vid skala 1.0x motsvarar utdata PDF-filens ursprungliga upplösning. Höj till 3.0x för exporter i utskriftskvalitet. + +## Relaterade verktyg + +- [PDF till JPG](./pdf-to-jpg) +- [PDF till WebP](./pdf-to-webp) +- [PDF till SVG](./pdf-to-svg) diff --git a/docs/sv/tools/pdf-to-svg.md b/docs/sv/tools/pdf-to-svg.md new file mode 100644 index 00000000..34177ae1 --- /dev/null +++ b/docs/sv/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF till SVG +description: Konvertera PDF-sidor till skalbar SVG-vektorgrafik. Bevarar text och former som vektorbanor för oändlig skalning. +--- + +# PDF till SVG + +Konverterar varje sida i en PDF till en SVG-fil (Scalable Vector Graphics). Till skillnad från rasterformat bevarar SVG vektorbanor, text och former så att utdata kan skalas till vilken storlek som helst utan pixlighet. Drivs av PyMuPDF. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppytan eller dra filer dit. Du kan lägga till flera filer och hantera dem var för sig. +2. Klicka på **Konvertera** för att bearbeta alla uppladdade filer. +3. Konverteringar av en enskild fil med en sida laddas ner som en fristående `.svg`. Allt annat laddas ner som ett ZIP-arkiv. + +## Alternativ + +Verktyget har inga inställbara alternativ. Varje sida konverteras till SVG med PyMuPDF:s inbyggda vektorexport. + +## Utdataformat + +- **En fil, en sida**: `filename.svg` +- **En fil, flera sidor**: `filename_svg.zip` med `page_1.svg`, `page_2.svg` osv. +- **Flera filer**: `pdf_to_svg.zip` med filer ordnade efter källdokumentets namn. + +## Användningsområden + +- Extrahera vektordiagram, grafer eller illustrationer från PDF-rapporter för användning på webbsidor. +- Redigera PDF-sidors innehåll i en vektorredigerare som Inkscape eller Illustrator. +- Bädda in skalbara sidförhandsvisningar i responsiva webbapplikationer. +- Extrahera logotyper eller grafik från PDF-broschyrer med bevarade skarpa kanter. + +## Tips + +- SVG fungerar bäst med PDF-filer som innehåller vektorinnehåll. Skannade dokument eller bildtunga PDF-filer ger stora SVG-filer med inbäddade rasterdata. +- För rasterutdata från bildtunga PDF-filer, använd [PDF till PNG](./pdf-to-png) eller [PDF till JPG](./pdf-to-jpg) i stället. +- Verktyget stöder batchkonvertering: ladda upp flera PDF-filer samtidigt för att konvertera dem alla i en körning. + +## Relaterade verktyg + +- [PDF till PNG](./pdf-to-png) +- [PDF till JPG](./pdf-to-jpg) +- [PDF till Markdown](./pdf-to-markdown) diff --git a/docs/sv/tools/pdf-to-text.md b/docs/sv/tools/pdf-to-text.md new file mode 100644 index 00000000..58c066a5 --- /dev/null +++ b/docs/sv/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF till text +description: Extrahera ren text från PDF-filer. Stöder batchextrahering av flera PDF-filer med TXT-filer som utdata. +--- + +# PDF till text + +Extraherar allt textinnehåll från PDF-filer och sparar det som rena `.txt`-filer. Stöder batchbearbetning: ladda upp flera PDF-filer och få varje fils text extraherad i en och samma åtgärd. Drivs av PyMuPDF. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppytan eller dra filer dit. Hantera fillistan med knapparna Lägg till fler och Rensa. +2. Klicka på **Extrahera** för att starta bearbetningen. +3. En enskild fil laddas ner som `filename.txt`. Flera filer ger ett `pdf-to-text.zip`-arkiv. + +## Alternativ + +Verktyget har inga inställbara alternativ. Allt textinnehåll extraheras från varje sida i läsordning. + +## Utdataformat + +- **En fil**: `filename.txt` +- **Flera filer**: `pdf-to-text.zip` med en `.txt` per PDF. + +## Användningsområden + +- Extrahera brödtext från PDF-rapporter för indexering av fulltextsökning. +- Konvertera PDF-e-böcker eller artiklar till ren text för läsning på e-ink-enheter. +- Hämta text från avtal eller juridiska dokument för nyckelordsanalys. +- Ta bort formatering från PDF-filer för att få ren text till databehandlingsskript. +- Förbereda textkorpusar från PDF-arkiv för språkteknologi. + +## Tips + +- Skannade PDF-filer (endast bild) ger tomma textfiler eftersom det inte finns något textlager att extrahera. Kör skannade dokument genom OCR först. +- Utdata bevarar läsordningen så som PyMuPDF tolkar den, vilket oftast följer vänster till höger och uppifrån och ned. Layouter med flera kolumner kan ge text som blandas ihop. +- För strukturerad utdata med rubriker och formatering, prova [PDF till Markdown](./pdf-to-markdown). För AI-färdig strukturerad JSON, använd [Förbered PDF för AI](./prepare-pdf-for-ai). + +## Relaterade verktyg + +- [PDF till Markdown](./pdf-to-markdown) +- [Förbered PDF för AI](./prepare-pdf-for-ai) +- [PDF till Word](./pdf-to-word) diff --git a/docs/sv/tools/pdf-to-tiff.md b/docs/sv/tools/pdf-to-tiff.md new file mode 100644 index 00000000..d8055c2f --- /dev/null +++ b/docs/sv/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF till TIFF +description: Konvertera PDF-sidor till TIFF-bilder, vanligt i tryck-, fax- och arkivflöden. Faller tillbaka på PNG om kodningen misslyckas. +--- + +# PDF till TIFF + +Konverterar varje sida i en PDF till en TIFF-bild. TIFF är standardformatet för tryckproduktion, faxsystem och dokumentarkivering. Verktyget använder PackBits-komprimering för TIFF-kodningen och faller tillbaka på PNG om en sida inte kan kodas. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Klicka på **Konvertera** för att bearbeta filen. +3. En enskild TIFF-fil eller ett ZIP-arkiv laddas ner automatiskt. + +## Alternativ + +Verktyget har inga inställbara alternativ. Sidor renderas i fast 2x-skala. + +## Utdataformat + +- **En sida**: `filename.tiff` +- **Flera sidor**: `filename_tiffs.zip` med `page_1.tiff`, `page_2.tiff` osv. + +Om TIFF-kodningen misslyckas för en viss sida (på grund av komprimeringsproblem) sparas den sidan som en `.png`-fil i stället. ZIP-filen innehåller då en blandning av TIFF- och PNG-filer. + +## Användningsområden + +- Lämna in dokument till myndigheter eller juridiska system som kräver TIFF-format. +- Förbereda sidor för faxöverföring via digitala faxtjänster. +- Arkivera skannade dokument i ett brett stött förlustfritt format. +- Mata in sidor i dokumenthanteringssystem för företag. + +## Tips + +- TIFF-filer är stora. Om du bara behöver förlustfri kvalitet för webben eller skärmen är [PDF till PNG](./pdf-to-png) ett bättre val. +- Kontrollera ZIP-filens innehåll om vissa sidor behövde PNG-reserven, eftersom du kanske vill konvertera dem separat. + +## Relaterade verktyg + +- [PDF till PNG](./pdf-to-png) +- [PDF till BMP](./pdf-to-bmp) +- [PDF till JPG](./pdf-to-jpg) diff --git a/docs/sv/tools/pdf-to-webp.md b/docs/sv/tools/pdf-to-webp.md new file mode 100644 index 00000000..c36eb75f --- /dev/null +++ b/docs/sv/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF till WebP +description: Konvertera PDF-sidor till WebP-bilder med justerbar kvalitet. Mindre filer än JPG vid jämförbar visuell kvalitet. +--- + +# PDF till WebP + +Konverterar varje sida i en PDF till en WebP-bild. WebP ger vanligtvis filer som är 25-35 % mindre än JPG vid samma upplevda kvalitet, vilket gör det till ett starkt val för webben. + +## Så fungerar det + +1. Ladda upp en PDF genom att klicka på släppytan eller dra en fil dit. +2. Justera reglaget **Kvalitet**. +3. Klicka på **Konvertera** för att bearbeta filen. +4. En enskild `.webp`-fil eller ett ZIP-arkiv laddas ner automatiskt. + +## Alternativ + +- **Kvalitet**: ett reglage från 0 % till 100 % (standard 85 %). Styr nivån på den förlustbringande komprimeringen. Högre värden behåller fler detaljer. + +Sidor renderas internt i 2x-skala, vilket ger bilder med ungefär dubbla PDF-filens ursprungliga mått. + +## Utdataformat + +- **En sida**: `filename.webp` +- **Flera sidor**: `filename_webps.zip` med `page_1.webp`, `page_2.webp` osv. + +## Användningsområden + +- Förbereda sidförhandsvisningar för webbplatser där bandbredd spelar roll. +- Skapa lätta bildversioner av flygblad eller broschyrer för sociala medier. +- Batchkonvertera dokument med flera sidor till en webboptimerad bilduppsättning. + +## Tips + +- WebP stöds i alla moderna webbläsare. För äldre kompatibilitet, använd [PDF till JPG](./pdf-to-jpg) som reserv. +- En kvalitet på 80-85 % går oftast inte att skilja från originalet på skärmen men håller nere filstorleken. + +## Relaterade verktyg + +- [PDF till JPG](./pdf-to-jpg) +- [PDF till PNG](./pdf-to-png) +- [PDF till BMP](./pdf-to-bmp) diff --git a/docs/sv/tools/pdf-to-word.md b/docs/sv/tools/pdf-to-word.md new file mode 100644 index 00000000..8add85b0 --- /dev/null +++ b/docs/sv/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF till Word +description: Konvertera PDF-filer till redigerbara Word-dokument (DOCX). Stöder batchkonvertering av flera PDF-filer samtidigt. +--- + +# PDF till Word + +Konverterar PDF-filer till redigerbara Word-dokument (`.docx`). Verktyget använder PyMuPDF för att återskapa dokumentets innehåll och bevarar text, enkel formatering och layout. Stöder konvertering av enskilda filer och batchkonvertering. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppytan eller dra filer dit. Du kan lägga till fler filer eller ta bort enskilda från listan. +2. Klicka på **Konvertera** för att starta bearbetningen. +3. En enskild fil laddas ner som `filename.docx`. Flera filer paketeras i `converted-documents.zip`. + +## Alternativ + +Verktyget har inga inställbara alternativ. Varje PDF konverteras till DOCX med PyMuPDF:s inbyggda konverteringsmotor. + +## Utdataformat + +- **En fil**: `filename.docx` +- **Flera filer**: `converted-documents.zip` med en `.docx` per PDF. + +## Användningsområden + +- Redigera text i en PDF som du har fått och behöver ändra. +- Konvertera arkiverade PDF-rapporter till ett format som kollegor kan redigera i Microsoft Word eller Google Docs. +- Hämta innehåll från PDF-avtal eller offerter till Word för ändringsspårning. +- Migrera äldre PDF-dokumentation till ett redigerbart format. + +## Tips + +- Komplexa layouter med text i flera kolumner, inbäddade formulär eller mycket grafik kanske inte konverteras perfekt. Granska utdata och justera formateringen i din ordbehandlare. +- Skannade PDF-filer (endast bild) ger tomma eller minimala DOCX-filer. Kör dem genom OCR först för att lägga till ett textlager. +- Batchläget är effektivt för att konvertera hela mappar med PDF-filer: ladda upp dem alla på en gång. + +## Relaterade verktyg + +- [PDF till text](./pdf-to-text) +- [PDF till Markdown](./pdf-to-markdown) +- [PDF-arbetsflödesbyggare](./pdf-workflow) diff --git a/docs/sv/tools/pdf-to-zip.md b/docs/sv/tools/pdf-to-zip.md new file mode 100644 index 00000000..99ab1a69 --- /dev/null +++ b/docs/sv/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: 'PDF:er till ZIP' +description: Paketera flera PDF-filer i ett enda ZIP-arkiv för enkel delning och lagring. +--- + +# PDF:er till ZIP + +Samla flera PDF-filer i ett enda ZIP-arkiv. Det här är ett rent paketeringsverktyg: ingen konvertering, komprimering eller ändring av själva PDF-filerna sker. + +## Så fungerar det + +1. Ladda upp flera PDF-filer via släppytan. +2. Granska fillistan. Ta bort de filer du inte vill ha med. +3. Klicka på bearbetningsknappen. +4. Ett ZIP-arkiv med alla uppladdade PDF-filer laddas ner direkt. + +## Funktioner + +- Tar emot valfritt antal PDF-filer +- Borttagning av enskilda filer innan arkivet skapas +- Bevarar de ursprungliga filnamnen i ZIP-filen +- Ingen ändring av PDF-innehållet, filerna paketeras som de är +- Visar filnamn och storlek för varje uppladdad PDF + +## Användningsområden + +- Samla en uppsättning fakturor eller kvitton som e-postbilaga +- Paketera projektleveranser (flera PDF-rapporter) för överlämning +- Skapa en enda nedladdning för en samling formulär eller mallar +- Arkivera en grupp dokument i en komprimerad fil + +## Tips + +- ZIP-filen använder de ursprungliga PDF-filnamnen. Om du har filer med samma namn, döp om dem före uppladdningen för att undvika konflikter. +- Verktyget komprimerar inte själva PDF-filerna. För att minska filstorleken, kör dem först genom Komprimera PDF och paketera sedan med det här verktyget. + +## Relaterade verktyg + +- [Sammanfoga PDF](./merge-pdf) +- [Dela PDF](./split-pdf) +- [Komprimera PDF](./compress-pdf) diff --git a/docs/sv/tools/pdf-workflow.md b/docs/sv/tools/pdf-workflow.md new file mode 100644 index 00000000..4225c0f0 --- /dev/null +++ b/docs/sv/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF-arbetsflödesbyggare +description: Bygg egna PDF-bearbetningskedjor visuellt genom att koppla ihop noder på en canvas. Kedja åtgärder som sammanfogning, komprimering, vattenstämpel och export. +--- + +# PDF-arbetsflödesbyggare + +Med arbetsflödesbyggaren kan du kedja flera PDF-åtgärder till en enda automatiserad pipeline. I stället för att köra verktygen ett i taget kopplar du ihop en visuell graf av noder (indata, bearbetning, utdata) och kör allt med ett klick. Dina filer lämnar aldrig webbläsaren. + +## Så fungerar det + +Gränssnittet är uppdelat i tre paneler: en **nodverktygslåda** till vänster, **canvasen** i mitten och en **inställningspanel** till höger som visas när du markerar en nod. + +1. **Lägg till noder** genom att klicka på dem i det vänstra sidofältet eller dra dem direkt till canvasen. Använd sökfältet högst upp i verktygslådan för att filtrera efter namn. +2. **Koppla ihop noder** genom att dra från ett utdatauttag (nederst på en nod) till ett indatauttag (överst på en annan nod). Kopplingar går uppifrån och ned. +3. **Konfigurera inställningar** genom att klicka på en nod för att öppna dess inställningspanel till höger. Varje nodtyp har sina egna alternativ (sidintervall, kvalitetsreglage, lösenord osv.). +4. **Kör arbetsflödet** genom att klicka på knappen **Kör** i verktygsfältet. Motorn kör noderna i topologisk ordning och bearbetar dem en i taget. Ett statusfält längst ned visar förloppet. +5. **Ladda ner resultat**: den avslutande nedladdningsnoden sparar den slutliga PDF-filen (eller en ZIP om flera filer skapas). + +## Nodkategorier + +Noderna är ordnade i sex kategorier, var och en färgkodad på canvasen: + +- **Indata** (blå): PDF-indata, bildindata, Word/Excel/PowerPoint till PDF och över 15 andra formatkonverterare som matar in filer i kedjan. +- **Redigera & kommentera** (indigo): Beskär, Gråskala, Invertera färger, Vattenstämpel, Sidnummer, Sidhuvud & sidfot, Skannereffekt, Justera färger, Bakgrundsfärg, Ta bort tomma sidor, Ta bort kommentarer. +- **Organisera & hantera** (violett): Sammanfoga, Dela, Extrahera sidor, Rotera, Ta bort sidor, Omvänd, Lägg till tom sida, Dela sidor, N-Up, Fixa sidstorlek, Kombinera till en sida, Broschyr, Posterisera, Redigera metadata, Innehållsförteckning, OCR. +- **Optimera & reparera** (bärnsten): Komprimera, Rastrera, Linjärisera, Räta upp, PDF till PDF/A, Typsnitt till konturer, Reparera. +- **Säkra PDF** (ros): Kryptera, Dekryptera, Sanera, Platta till, Digital signatur, Maskera. +- **Utdata** (blågrön): Nedladdning (identifierar automatiskt enskild PDF eller ZIP), PDF till bilder, PDF till text, PDF till DOCX, PDF till XLSX, PDF till CSV, PDF till SVG, PDF till Markdown, Extrahera bilder. + +## Spara och läsa in arbetsflöden + +Verktygsfältet har fyra alternativ för att spara: + +- **Spara**: sparar det aktuella arbetsflödet som en namngiven mall i webbläsarens lokala lagring. Du kan spara flera mallar. +- **Läs in**: öppnar en dialogruta med alla sparade mallar. Klicka på Läs in för att återställa en, eller ta bort mallar du inte längre behöver. +- **Exportera**: laddar ner arbetsflödet som en `.json`-fil så att du kan dela eller säkerhetskopiera det. +- **Importera**: läser in en `.json`-arbetsflödesfil från disk och återställer alla noder, positioner och kopplingar. + +Mallar finns kvar mellan sessioner i den lokala lagringen. Exporterade JSON-filer kan flyttas mellan webbläsare och datorer. + +## Körningsmodell + +Motorn bygger en beroendegraf utifrån dina kopplingar och kör noder i topologisk ordning. Om en nod misslyckas stoppas körningen och den felande noden markeras röd. Några regler att ha i åtanke: + +- Varje arbetsflöde behöver minst en **indatanod** och en **utdatanod**. +- Motorn upptäcker cirkulära beroenden och blockerar körningen med ett fel. +- Noden **Kryptera** måste vara det sista bearbetningssteget före utdatanoden. Om den placeras tidigare utlöses en valideringsvarning, eftersom efterföljande noder inte kan arbeta med krypterade data. +- Lösenordsskyddade PDF-filer ber om ett lösenord under körningen. +- Indata med flera PDF-filer stöds: noden Sammanfoga kan kombinera dem, eller så bearbetar batchnoderna varje PDF för sig. + +## Uttagstyper + +Kopplingar använder typade uttag för att förhindra ogiltiga kopplingar: + +- **PDF** (indigo): ett enskilt PDF-dokument. +- **MultiPDF** (bärnsten): flera PDF-dokument samlade. +- **Bild** (grön): en bildblob. + +## Alternativ + +Varje nod har sin egen konfiguration som nås via den högra inställningspanelen. Vanliga mönster är: + +- **Sidintervall** på noderna Dela, Extrahera sidor och Ta bort sidor +- **Kvalitetsreglage** på utdatanoder för bildkonvertering +- **Lösenordsfält** på noderna Kryptera och Dekryptera +- **Textfält** för Vattenstämpel, Sidhuvud & sidfot och Redigera metadata +- **Rotationsvinklar** på noden Rotera +- **Komprimeringsnivå** på noden Komprimera +- **Val av OCR-språk** på noden OCR + +## Användningsområden + +- **Fakturabearbetning**: PDF-indata -> OCR -> Extrahera tabeller -> Ladda ner som CSV. +- **Standardisering av rapporter**: Word till PDF -> Fixa sidstorlek -> Lägg till sidnummer -> Vattenstämpel -> Komprimera -> Ladda ner. +- **Arkivförberedelse**: PDF-indata -> Reparera -> Platta till -> Sanera -> PDF till PDF/A -> Ladda ner. +- **Batchextrahering av bilder**: PDF-indata (flera filer) -> Extrahera bilder -> Ladda ner ZIP. +- **Utskriftsklara broschyrer**: PDF-indata -> Broschyr -> Beskär -> Komprimera -> Ladda ner. +- **Säker distribution**: PDF-indata -> Maskera -> Ta bort kommentarer -> Kryptera -> Ladda ner. + +## Tips + +- Använd **Delete** eller **Backspace** för att ta bort den markerade noden från canvasen. +- Klicka på knappen **X** i en nods statusfält för att ta bort den direkt. +- Panorera canvasen genom att klicka och dra på tom yta. Markören ändras till en grepp-ikon under panoreringen. +- På mobil, använd knappen **+** i verktygsfältet för att visa eller dölja nodverktygslådan. +- Om ditt arbetsflöde ger flera utdatafiler paketerar nedladdningsnoden dem automatiskt i en ZIP. +- Börja enkelt: bygg och testa en pipeline med två noder innan du gör det mer komplext. + +## Relaterade verktyg + +- [PDF till text](./pdf-to-text) +- [PDF till Excel](./pdf-to-excel) +- [Extrahera bilder](./extract-images) +- [PDF till Markdown](./pdf-to-markdown) diff --git a/docs/sv/tools/png-to-pdf.md b/docs/sv/tools/png-to-pdf.md new file mode 100644 index 00000000..44ee75fc --- /dev/null +++ b/docs/sv/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG till PDF +description: Konvertera en eller flera PNG-bilder till ett PDF-dokument med justerbar kvalitet, helt i webbläsaren. +--- + +# PNG till PDF + +Konvertera PNG-bilder till PDF med full upplösning bevarad. Varje PNG blir en egen sida, anpassad efter originalbildens mått. Transparens hanteras automatiskt. + +## Format som stöds + +| Format | Filändelser | +| :----- | :---------- | +| PNG | `.png` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp PNG-filer. Du kan välja flera samtidigt. +2. Hantera fillistan: ta bort oönskade filer eller lägg till fler. +3. Välj en nivå för **PDF-kvalitet** i rullgardinsmenyn. +4. Klicka på **Konvertera till PDF**. Utdata laddas ner som `from_jpgs.pdf`. + +Verktyget använder pdf-lib för att bädda in varje bild direkt. Om en PNG inte kan bäddas in på ursprungligt sätt (t.ex. på grund av en ovanlig färgprofil) faller verktyget tillbaka på att rendera om den via en canvas som JPEG. + +## Alternativ + +**PDF-kvalitet** styr komprimeringen som tillämpas före inbäddning: + +- **Hög kvalitet**: minimal komprimering, största filstorlek. +- **Medelhög kvalitet** (standard): bra balans mellan storlek och tydlighet. +- **Låg kvalitet**: maximal komprimering, minsta utdata. + +## Användningsområden + +- Konvertera skärmbilder till en PDF med flera sidor för felrapporter eller dokumentation +- Paketera exporter från UI-design i en enda fil för granskning +- Göra diagramexporter (draw.io, Excalidraw) till en delbar PDF +- Sätta ihop en uppsättning diagrambilder till en rapport + +## Tips + +- PNG-filer med transparens får vit bakgrund i PDF-filen. Om du behöver en annan bakgrund, redigera bilderna i förväg. +- För skärmbilder och diagram med skarpa kanter och text undviker Hög kvalitet JPEG-komprimeringsartefakter. Medelhög eller Låg kan konvertera till JPEG internt. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [JPG till PDF](./jpg-to-pdf) +- [SVG till PDF](./svg-to-pdf) diff --git a/docs/sv/tools/posterize-pdf.md b/docs/sv/tools/posterize-pdf.md new file mode 100644 index 00000000..1178d1b9 --- /dev/null +++ b/docs/sv/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Postera PDF +description: Dela upp PDF-sidor i ett rutnät av mindre sidor för storformatsutskrift över flera ark. +--- + +# Postera PDF + +Dela varje sida i en PDF i ett rutnät av mindre delsidor. Det här verktyget används för att skriva ut en enda sida över flera pappersark, som du sedan sätter ihop till en stor affisch eller banderoll. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Ange antal **rader** och **kolumner** för rutnätet (t.ex. 2 rader x 2 kolumner delar varje sida i 4 delsidor). +3. Ange vid behov ett sidintervall för att begränsa vilka sidor som posteras. +4. Förhandsvisningen visar ett rutnät över den aktuella sidan så att du kan se var den delas. +5. Bläddra mellan sidor för att kontrollera rutnätet på olika sidor. +6. Klicka på bearbetningsknappen. Varje rutcell blir en egen sida i den färdiga PDF-filen. + +## Funktioner + +- Valfritt antal rader och kolumner för flexibla rutnätsstorlekar +- Liveförhandsvisning med rutnät som visar exakt var sidorna delas +- Sidintervallfilter för att postera enbart vissa sidor +- Sida-för-sida-navigering i förhandsvisningen +- Cachade sidbilder för snabb navigering i förhandsvisningen +- Streckade röda rutnätslinjer markerar tydligt skärgränserna + +## Alternativ + +| Alternativ | Beskrivning | +| ---------------- | ------------------------------------------------ | +| **Rader** | Antal horisontella delningar (standard: 1) | +| **Kolumner** | Antal vertikala delningar (standard: 1) | +| **Sidintervall** | Vilka sidor som ska posteras (tomt = alla sidor) | + +## Användningsområden + +- Skriva ut en PDF i affischstorlek över vanliga A4- eller Letter-ark för att sätta ihop på en vägg +- Skapa stora banderoller från en ensidig PDF-design +- Dela överdimensionerade tekniska ritningar i utskrivbara delar +- Göra storformatsutskrifter utan tillgång till en storformatsskrivare + +## Tips + +- Ett 2x2-rutnät gör en sida till 4 sidor. Ett 3x3-rutnät gör en sida till 9. Planera rutnätet efter hur stor den färdiga sammansättningen ska bli. +- Förhandsvisningens rutnät hjälper dig att se till att viktigt innehåll inte hamnar på en skärlinje. Justera rader/kolumner vid behov. +- För den omvända operationen (flera sidor på ett ark), använd [N-Up PDF](./n-up-pdf). + +## Relaterade verktyg + +- [N-Up PDF](./n-up-pdf) +- [Dela sidor](./divide-pages) +- [Dela PDF](./split-pdf) diff --git a/docs/sv/tools/powerpoint-to-pdf.md b/docs/sv/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..0cf58c04 --- /dev/null +++ b/docs/sv/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint till PDF +description: Konvertera PowerPoint-presentationer (PPT, PPTX) och ODP-filer till PDF med bevarad bildformatering. +--- + +# PowerPoint till PDF + +Konvertera presentationsfiler till PDF. Varje bild blir en sida i dokumentet, med text, bilder, former och övergångar renderade via en LibreOffice-motor i webbläsaren. Stöder både moderna och äldre PowerPoint-format samt formatet OpenDocument Presentation. + +## Format som stöds + +| Format | Filändelser | +| :------------------------ | :---------- | +| PowerPoint (modern) | `.pptx` | +| PowerPoint (äldre) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina presentationsfiler. +2. Granska fillistan. Lägg till fler eller ta bort filer vid behov. +3. Klicka på **Konvertera till PDF**. LibreOffice-motorn laddas första gången och konverterar sedan varje fil. +4. En enskild fil laddas ned direkt som PDF. Flera filer paketeras i `powerpoint-converted.zip`. + +## Alternativ + +Det här verktyget har inga extra inställningar. Bilderna renderas i sina ursprungliga mått. + +## Resultat + +| Antal filer | Resultat | +| :---------- | :------------------------------------------------------------------- | +| 1 fil | Enskild PDF att ladda ned (ursprungligt filnamn med ändelsen `.pdf`) | +| 2+ filer | ZIP-arkiv (`powerpoint-converted.zip`) med en PDF per fil | + +## Användningsområden + +- Konvertera en presentation till PDF innan du delar den med en publik som kanske inte har PowerPoint +- Skapa en utskrivbar handout av en bildpresentation för en konferens eller workshop +- Arkivera presentationer i ett format som ser likadant ut på alla enheter +- Konvertera ett bibliotek med ODP-presentationer från LibreOffice Impress till PDF i bulk +- Skapa en PDF-version av en pitch deck för e-postbilagor + +## Tips + +- Animationer och övergångar i bilderna återges inte i PDF-filen. Varje bild fångas som en statisk sida. +- Inbäddade videor visas inte i resultatet. Ersätt dem med en skärmbild eller platshållarbild vid behov. +- Anteckningar för talaren ingår inte i standardexporten till PDF. Behöver du anteckningar kan du först exportera från PowerPoints egen vy "Skriv ut anteckningar". +- LibreOffice-motorn cachas efter första laddningen, så att konvertera en andra presentation under samma session går mycket snabbare. + +## Relaterade verktyg + +- [Word till PDF](./word-to-pdf) +- [Excel till PDF](./excel-to-pdf) +- [Bilder till PDF](./image-to-pdf) diff --git a/docs/sv/tools/prepare-pdf-for-ai.md b/docs/sv/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..7d695490 --- /dev/null +++ b/docs/sv/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Förbered PDF för AI +description: Extrahera PDF-innehåll till strukturerad JSON optimerad för LLM:er och AI-pipelines som LlamaIndex. Stöder batchbearbetning. +--- + +# Förbered PDF för AI + +Extraherar innehåll från PDF-filer och strukturerar det som JSON optimerad för inläsning i stora språkmodeller (LLM:er) och AI-ramverk som LlamaIndex. Varje sidas innehåll extraheras och organiseras i ett strukturerat format som är redo för RAG-pipelines, chattbottar eller semantiska söksystem. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer genom att klicka på släppzonen eller dra filer till den. +2. Klicka på **Extrahera** för att starta bearbetningen. +3. En enskild fil laddas ned som `filename_llm.json`. Flera filer ger ett arkiv, `pdf-for-ai.zip`. + +Verktyget använder PyMuPDF:s LlamaIndex-integration för att extrahera innehåll per sida med metadata, och ger utdata som kan läsas in direkt i AI-ramverk. + +## Alternativ + +Det här verktyget har inga inställningar. Alla sidor extraheras med fullständig text och metadata. + +## Utdataformat + +- **Enskild fil**: `filename_llm.json` +- **Flera filer**: `pdf-for-ai.zip` med en `_llm.json` per PDF. + +JSON-utdata följer LlamaIndex dokumentschema med textinnehåll per sida och metadatafält. + +## Användningsområden + +- Förbereda PDF-dokument för RAG-pipelines (retrieval-augmented generation). +- Bygga en sökbar kunskapsbas från PDF-arkiv för en AI-chattbot. +- Mata in PDF-rapporter i LLM-baserade analysflöden. +- Förbehandla forskningsartiklar för semantisk sökning och fråga-svar-system. +- Skapa strukturerad träningsdata från PDF-samlingar. + +## Tips + +- För ren textextraktion utan AI-specifik formatering, använd [PDF till text](./pdf-to-text). +- För Markdown-utdata som bevarar rubriker och struktur, använd [PDF till Markdown](./pdf-to-markdown). +- Skannade PDF-filer ger tomt eller minimalt resultat. Kör dem först genom OCR för att lägga till ett textlager innan extraktion. + +## Relaterade verktyg + +- [PDF till text](./pdf-to-text) +- [PDF till Markdown](./pdf-to-markdown) +- [PDF till JSON](./pdf-to-json) diff --git a/docs/sv/tools/protect-pdf.md b/docs/sv/tools/protect-pdf.md new file mode 100644 index 00000000..8a6c4067 --- /dev/null +++ b/docs/sv/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Skydda PDF +description: Lösenordsskydda PDF-filer med 256-bitars AES-kryptering. Ange användar- och ägarlösenord med konfigurerbara användningsbegränsningar. +--- + +# Skydda PDF + +Lås din PDF med ett lösenord så att bara behöriga kan öppna den. BentoPDF använder 256-bitars AES-kryptering (samma standard som banker och myndigheter använder), helt i din webbläsare via QPDF. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Ange ett **användarlösenord** (obligatoriskt). Det är lösenordet som krävs för att öppna filen. +3. Ange eventuellt ett **ägarlösenord**. När det är angivet får PDF-filen användningsbegränsningar som förhindrar utskrift, redigering, kopiering och anteckningar. +4. Klicka på **Kryptera PDF**. +5. Ladda ned den krypterade filen. + +## Lösenordstyper + +### Användarlösenord (obligatoriskt) + +Användarlösenordet är det mottagarna skriver in för att öppna PDF-filen. Utan det är dokumentet helt oåtkomligt. Varje krypterad PDF måste ha ett. + +### Ägarlösenord (valfritt) + +Ägarlösenordet styr vad en behörig användare kan göra efter att ha öppnat filen. När du anger ett separat ägarlösenord tillämpar BentoPDF automatiskt den strängaste uppsättningen begränsningar: + +- Ändring inaktiverad +- Extrahering/kopiering inaktiverad +- Utskrift inaktiverad +- Anteckningar inaktiverade +- Ifyllning av formulär inaktiverad +- Dokumentsammanställning inaktiverad + +Om du lämnar ägarlösenordet tomt krypteras PDF-filen (användarlösenordet krävs fortfarande för att öppna den) men har inga användningsbegränsningar när den väl är öppnad. + +## Krypteringsdetaljer + +- **Algoritm**: AES-256 (256-bitars Advanced Encryption Standard) +- **Nyckellängd**: 256 bitar +- **Standard**: PDF 2.0-kryptering (QPDF-implementation) + +AES-256 är beräkningsmässigt ogenomförbart att knäcka med brute force med dagens teknik. Säkerheten hos din krypterade PDF beror helt på lösenordets styrka. + +## Användningsområden + +- Skydda konfidentiella ekonomiska rapporter innan de skickas med e-post +- Säkra juridiska dokument som delas med motpartens ombud +- Lägga lösenord på journaler eller personuppgifter +- Distribuera betalt innehåll (e-böcker, rapporter) med åtkomstkontroll +- Följa dataskyddspolicyer som kräver kryptering av lagrade data + +## Tips + +- Använd ett starkt, unikt lösenord. En lösenfras på 12 tecken eller fler med versaler, gemener, siffror och symboler är idealisk. +- Dela lösenordet via en separat kanal (telefon, sms) och aldrig i samma e-post som PDF-filen. +- Om du bara vill begränsa åtgärder (ingen utskrift, ingen kopiering) utan att kräva lösenord för att öppna filen, använd verktyget Ändra behörigheter i stället. + +## Relaterade verktyg + +- [Lås upp PDF](./unlock-pdf): ta bort kryptering när du känner till lösenordet +- [Ändra behörigheter](./change-permissions): ändra specifika användningsbegränsningar +- [Ta bort begränsningar](./remove-restrictions): ta bort all säkerhet från en PDF +- [Sanera PDF](./sanitize-pdf): ta bort dolt innehåll innan du krypterar diff --git a/docs/sv/tools/psd-to-pdf.md b/docs/sv/tools/psd-to-pdf.md new file mode 100644 index 00000000..0385600b --- /dev/null +++ b/docs/sv/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD till PDF +description: Konvertera Photoshop-filer (PSD) till PDF i webbläsaren. Gratis, privat, ingen Adobe-programvara krävs. +--- + +# PSD till PDF + +Konvertera Adobe Photoshop PSD-filer till PDF-dokument. PSD är Photoshops egna format, och för att öppna en krävs normalt dyr Adobe-programvara. Det här verktyget renderar den sammanslagna kompositbilden av din PSD-fil som en PDF-sida i full upplösning. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :-------------- | :--------- | :--------------------------------------- | +| Adobe Photoshop | `.psd` | Renderar den sammanslagna kompositbilden | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina PSD-filer. Flera filer stöds. +2. Granska fillistan. Ta bort oönskade filer med papperskorgsikonen, eller använd **Lägg till fler filer** för att lägga till fler. +3. Klicka på **Konvertera till PDF**. PyMuPDF-motorn läser PSD-filen och bäddar in kompositbilden på en PDF-sida i originalupplösning. +4. En enskild PSD ger en PDF. När du laddar upp flera PSD-filer kombineras de till en enda flersidig PDF med namnet `psd_to_pdf.pdf`, där varje PSD blir en sida. + +## Alternativ + +Inga inställningar behövs. Konverteraren använder den sammanslagna bilddatan från PSD-filen. + +## Användningsområden + +- Förhandsgranska Photoshop-design utan att öppna Photoshop +- Skicka designutkast till kunder som inte har Adobe Creative Suite +- Skriva ut högupplöst grafik från PSD-filer +- Skapa en PDF-portfölj av flera PSD-designfiler, där varje blir en sida i ett enda dokument + +## Tips + +- Konverteringen renderar kompositvyn (sammanslagen) av PSD-filen. Enskilda lager, justeringslager och lagereffekter bevaras inte som separata element i PDF-filen. +- Flera PSD-filer slås ihop till en flersidig PDF i stället för enskilda PDF-filer. Det är praktiskt för att bygga portföljer eller lookbooks. +- PSD-filer med mycket hög upplösning (tryckfiler på 300+ DPI) ger stora PDF-filer. Verktyget bevarar den fulla upplösningen. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [PNG till PDF](./png-to-pdf) +- [VSD till PDF](./vsd-to-pdf) diff --git a/docs/sv/tools/pub-to-pdf.md b/docs/sv/tools/pub-to-pdf.md new file mode 100644 index 00000000..e391d693 --- /dev/null +++ b/docs/sv/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB till PDF +description: Konvertera Microsoft Publisher-filer (PUB) till PDF i webbläsaren. Gratis, privat, ingen programvara behövs. +--- + +# PUB till PDF + +Konvertera Microsoft Publisher-filer till PDF. Publisher är ett desktop publishing-program som ingår i vissa utgåvor av Microsoft Office, men de flesta har det inte installerat. Med det här verktyget kan vem som helst konvertera PUB-filer till PDF direkt i webbläsaren, utan Microsoft-programvara. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :------------------ | :--------- | :-------------------------- | +| Microsoft Publisher | `.pub` | Desktop publishing-dokument | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina PUB-filer. Flera filer kan laddas upp samtidigt. +2. Granska fillistan. Ta bort oönskade filer med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att lägga till fler. +3. Klicka på **Konvertera till PDF**. En LibreOffice-baserad motor laddas i webbläsaren och konverterar varje PUB-fil med bevarad layout, bilder och textrutor. +4. En fil laddas ned direkt som PDF. Flera filer levereras i ett ZIP-arkiv med namnet `pub-to-pdf.zip`. + +## Alternativ + +Ingen ytterligare konfiguration behövs. Konverteraren hanterar PUB-layoutmotorn automatiskt. + +## Användningsområden + +- Öppna en PUB-flygblad eller ett nyhetsbrev från en kund utan att köpa Microsoft Publisher +- Konvertera programblad, evenemangsprogram eller skolbrev skapade i Publisher +- Arkivera marknadsföringsmaterial från Publisher i ett universellt tillgängligt format +- Skriva ut PUB-filer på ett system som inte har Publisher installerat + +## Tips + +- Komplexa Publisher-layouter med överlappande textrutor och exakt placering kan förskjutas något vid konverteringen. Granska resultatet om exakt placering är avgörande. +- LibreOffice-motorn initieras en gång per session. Den första konverteringen tar längre tid, de följande går snabbare. +- För den mest trogna konverteringen av Publisher-filer, se till att eventuella egna typsnitt i originalet är vanliga systemtypsnitt. + +## Relaterade verktyg + +- [VSD till PDF](./vsd-to-pdf) +- [ODP till PDF](./odp-to-pdf) diff --git a/docs/sv/tools/rasterize-pdf.md b/docs/sv/tools/rasterize-pdf.md new file mode 100644 index 00000000..66a7fe24 --- /dev/null +++ b/docs/sv/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Rasterisera PDF +description: Konvertera PDF-sidor till bildbaserad PDF. Platta till alla lager, ta bort markerbar text och styr DPI och bildformat. +--- + +# Rasterisera PDF + +Rasterisering omvandlar varje sida i en PDF till en bild och sätter ihop bilderna till en PDF igen. Resultatet ser likadant ut som originalet men innehåller ingen markerbar text, inga interaktiva element och inga redigerbara lager. Det är i praktiken en fotokopia av hög kvalitet. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. +2. Ange **DPI** (upplösning) för den rasteriserade utdatan. +3. Välj ett **bildformat**: PNG för förlustfri kvalitet eller JPEG för mindre filer. +4. Markera eventuellt **Konvertera till gråskala**. +5. Klicka på **Rasterisera PDF**. Flera filer laddas ned som ZIP. + +## Alternativ + +| Inställning | Värden | Standard | +| -------------- | ------------------------------- | -------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Bildformat** | PNG (förlustfri), JPEG (mindre) | PNG | +| **Gråskala** | På/Av | Av | + +## DPI-riktlinjer + +- **72**: Endast visning på skärm, minsta filstorlek +- **150**: Bra balans för allmänt bruk +- **200**: Skarpare text, måttlig filstorlek +- **300**: Utdata i tryckkvalitet +- **600**: Högkvalitativ arkivering eller professionell utskrift + +## Användningsområden + +- Förhindra textextraktion från konfidentiella dokument innan de delas +- Eliminera typsnittsberoenden genom att omvandla text till pixlar +- Skapa en "platt" version av en PDF med komplexa lager eller transparens som renderas olika i olika läsare +- Förbereda en PDF för ett system som bara accepterar bildbaserad indata +- Ta bort dolt innehåll (som spårade ändringar eller formulärdata) genom att reducera PDF-filen till rena bilder + +## Tips + +- 150 DPI med PNG är en bra standard. Gå bara högre om du behöver utskrift eller vill zooma in på fina detaljer. +- JPEG ger märkbart mindre filer men introducerar kompressionsartefakter på skarpa textkanter. +- Rasterisering går inte att ångra, så behåll originalet om du kan behöva redigerbar text senare. + +## Relaterade verktyg + +- [Komprimera PDF](./compress-pdf): minska den rasteriserade PDF-filens storlek +- [Räta upp PDF](./deskew-pdf): räta upp sidor innan du rasteriserar skannade dokument +- [Typsnitt till konturer](./font-to-outline): omvandla typsnitt till vektorbanor om du vill behålla skalbarheten +- [Platta till PDF](./flatten-pdf): platta till formulär utan att konvertera till bilder diff --git a/docs/sv/tools/remove-annotations.md b/docs/sv/tools/remove-annotations.md new file mode 100644 index 00000000..31016b99 --- /dev/null +++ b/docs/sv/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Ta bort anteckningar +description: Ta bort alla kommentarer, markeringar, länkar och andra anteckningar från din PDF med ett klick. +--- + +# Ta bort anteckningar + +Rensa din PDF genom att ta bort alla anteckningar: kommentarer, markeringar, klisterlappar, textmarkeringar, länkar, stämplar och alla andra anteckningsobjekt som finns i dokumentet. Det underliggande sidinnehållet (text, bilder, grafik) lämnas orört. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Verktyget identifierar dokumentets sidantal och visar filinformation. +3. Klicka på **Ta bort anteckningar** för att bearbeta. +4. Den rensade PDF-filen laddas ned automatiskt utan några anteckningar. + +## Funktioner + +- Tar bort alla typer av anteckningar: kommentarer, markeringar, understrykningar, genomstrykningar, klisterlappar, stämplar, länkar och formulärmarkeringar +- Fungerar på varje sida i dokumentet +- Bevarar allt innehåll som inte är anteckningar (text, bilder, vektorgrafik, formulärfält) +- Visar sidantal och filstorlek före bearbetning + +## Användningsområden + +- Rensa ett dokument före slutlig distribution efter en granskningsrunda där flera granskare lagt till kommentarer +- Ta bort markeringar och klisterlappar från en delad studiehandledning +- Ta bort länkanteckningar från ett dokument före arkivering +- Förbereda en "ren" version av ett juridiskt dokument som annoterats kraftigt under förhandling +- Ta bort granskarkommentarer från ett manuskript innan det skickas till tryck + +## Tips + +- Verktyget tar bort anteckningar på PDF-strukturens nivå, så resultatet behåller markerbar text och originalkvalitet, utan rasterisering. +- Om du bara vill ta bort vissa anteckningar i stället för alla, använd [PDF-redigeraren](./edit-pdf) för att ta bort enskilda anteckningar. +- Anteckningar i tillplattade PDF-filer (där anteckningarna har slagits ihop med sidinnehållet) kan inte tas bort eftersom de inte längre är separata objekt. + +## Relaterade verktyg + +- [PDF-redigerare](./edit-pdf) +- [Lägg till vattenstämpel](./add-watermark) +- [Signera PDF](./sign-pdf) diff --git a/docs/sv/tools/remove-blank-pages.md b/docs/sv/tools/remove-blank-pages.md new file mode 100644 index 00000000..a7198389 --- /dev/null +++ b/docs/sv/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Ta bort tomma sidor +description: Identifiera och ta bort tomma eller nästan tomma sidor från din PDF automatiskt, med justerbar känslighet. +--- + +# Ta bort tomma sidor + +Sök igenom din PDF efter tomma eller nästan tomma sidor och ta bort dem automatiskt. Verktyget renderar varje sida och analyserar pixelinnehållet för att avgöra om den är tom, och låter dig sedan bekräfta vilka sidor som ska tas bort innan bearbetningen. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Justera reglaget **Känslighet** för att styra hur strikt "tom" definieras. +3. Klicka på **Identifiera tomma sidor** för att skanna dokumentet. +4. Verktyget visar miniatyrer av identifierade tomma sidor så att du kan granska dem. +5. Bekräfta urvalet och ladda ned den rensade PDF-filen utan de tomma sidorna. + +## Alternativ + +- **Känslighet**: Ett reglage från 0 % till 100 % (standard 80 %). Högre värden är strängare och flaggar bara sidor som är helt eller nästan helt vita. Lägre värden är mer toleranta och fångar sidor med minimalt innehåll, som en enstaka prick eller en svag vattenstämpel. + +## Funktioner + +- Analys på pixelnivå av varje sida för att hitta tomt innehåll +- Justerbart känslighetsreglage för finjustering av identifieringen +- Miniatyrförhandsvisning av identifierade tomma sidor för manuell kontroll +- Bevarar alla sidor som inte är tomma exakt som de är +- Hanterar dokument av valfri storlek eller sidantal +- Förloppsindikator under skanningen + +## Användningsområden + +- Rensa skannade dokument där skannern fångat tomma baksidor på ensidiga original +- Ta bort avskiljarsidor från skannade dokumentbuntar +- Ta bort tomma sidor som lagts in av dokumenthanteringssystem +- Rensa PDF-filer exporterade från ordbehandlare som ibland har tomma sidor på slutet +- Minska filstorleken genom att ta bort onödiga tomma sidor + +## Tips + +- Börja med standardkänsligheten 80 % och justera därifrån. Om verktyget missar sidor som ser tomma ut för dig, sänk känsligheten. Om det flaggar sidor med ljust innehåll som du vill behålla, höj den. +- Verktyget renderar varje sida för att analysera innehållet, så bearbetningstiden växer med sidantalet. För mycket stora dokument kan du få vänta en kort stund. +- Granska de identifierade tomma sidorna i miniatyrförhandsvisningen innan du bekräftar borttagningen. Sidor med svaga sidhuvuden, sidfötter eller vattenstämplar kan flaggas beroende på känslighetsinställningen. + +## Relaterade verktyg + +- [Beskär PDF](./crop-pdf) +- [PDF-redigerare](./edit-pdf) +- [Sidnummer](./page-numbers) diff --git a/docs/sv/tools/remove-metadata.md b/docs/sv/tools/remove-metadata.md new file mode 100644 index 00000000..c7c232f8 --- /dev/null +++ b/docs/sv/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Ta bort metadata +description: Ta bort all dold metadata från PDF-filer, inklusive författare, titel, skapandedatum, producent, XMP-data och dokument-ID. +--- + +# Ta bort metadata + +Varje PDF bär metadata som kan avslöja vem som skapade den, vilken programvara som användes, när den senast ändrades och mer. Det här verktyget tar bort allt: infoordlistan, XMP-metadataströmmar, dokument-ID och programspecifik data, så att dokumentet blir rent och utan spår av sitt ursprung. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Klicka på **Ta bort metadata**. +3. Ladda ned den rensade filen. + +Inga alternativ att konfigurera. Verktyget är grundligt med flit: det rensar allt. + +## Vad som tas bort + +- **Fält i infoordlistan**: Titel, Författare, Ämne, Nyckelord, Skapare, Producent, skapandedatum, ändringsdatum +- **XMP-metadataström**: XML-baserat metadatablock som lagras i dokumentkatalogen +- **Dokument-ID**: Unika identifierare i PDF-trailern som kan användas för att spåra ett dokument mellan system +- **PieceInfo**: Programspecifik metadata som läggs till av program som Illustrator eller InDesign + +## Vad som finns kvar + +- Allt synligt sidinnehåll (text, bilder, grafik) +- Formulärfält och anteckningar +- Bokmärken och länkar +- Själva dokumentstrukturen + +## Användningsområden + +- Ta bort ditt namn och din organisation från ett dokument innan du publicerar det anonymt +- Ta bort tidsstämplar som avslöjar när ett dokument förbereddes +- Rensa producentsträngar som visar vilken PDF-programvara du använder +- Förbereda dokument för myndighetsinlämningar som kräver PDF-filer utan metadata +- Ta bort spår av redigeringshistorik innan du delar ett dokument externt + +## Tips + +- Använd verktyget Visa metadata först för att se exakt vilken metadata din PDF innehåller innan du tar bort den. +- Om du behöver ta bort metadata _och_ JavaScript, anteckningar och inbäddade filer, använd Sanera PDF för en grundligare rensning. +- Borttagning av metadata är permanent. Behåll originalet om du kan behöva datan senare. + +## Relaterade verktyg + +- [Sanera PDF](./sanitize-pdf): ta bort metadata samt skript, bilagor och mer +- [Skydda PDF](./protect-pdf): skydda den rensade PDF-filen med ett lösenord +- [Komprimera PDF](./compress-pdf): borttagning av metadata kan minska filstorleken något, komprimera för större besparing diff --git a/docs/sv/tools/remove-restrictions.md b/docs/sv/tools/remove-restrictions.md new file mode 100644 index 00000000..a7f4c560 --- /dev/null +++ b/docs/sv/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Ta bort begränsningar +description: Ta bort lösenordsskydd, utskriftsbegränsningar, redigeringslås och kopieringsbegränsningar från PDF-filer. +--- + +# Ta bort begränsningar + +PDF-filer kan ha två typer av lösenord: ett användarlösenord (krävs för att öppna filen) och ett ägarlösenord (styr vad du kan göra med den). Det här verktyget tar bort båda, tillsammans med alla tillhörande begränsningar: lås för utskrift, redigering, kopiering och anteckningar. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Om PDF-filen har ett ägarlösenord, ange det i fältet **Ägarlösenord**. Lämna det tomt om PDF-filen bara har användningsbegränsningar utan lösenord. +3. Klicka på **Ta bort begränsningar**. +4. Ladda ned den obegränsade PDF-filen. + +Verktyget använder QPDF:s flaggor `--decrypt` och `--remove-restrictions` för att skapa en ren, obegränsad kopia. + +## Vad som tas bort + +- Lösenordsskydd (både användar- och ägarlösenord) +- Utskriftsbegränsningar +- Redigeringsbegränsningar +- Begränsningar för kopiering av text och bilder +- Begränsningar för anteckningar och kommentarer +- Alla andra säkerhetsbegränsningar som är kodade i PDF-filen + +## Användningsområden + +- Låsa upp en PDF som du äger men vars lösenord du satte för flera år sedan +- Ta bort utskriftsbegränsningar från ett dokument du har legitim åtkomst till +- Aktivera kopiera och klistra in i referensmaterial för anteckningar +- Förbereda PDF-filer för tillgänglighetsverktyg som inte klarar begränsade dokument + +## Tips + +- Du måste känna till ägarlösenordet om ett sådant är angivet. Verktyget knäcker eller brute-forcar inte lösenord. +- Om du vill behålla krypteringen men ändra specifika behörigheter, använd verktyget Ändra behörigheter i stället. +- Utdatafilen har ingen kryptering alls, så vem som helst som tar emot den kan öppna den fritt. + +## Relaterade verktyg + +- [Lås upp PDF](./unlock-pdf): lås upp en PDF när du känner till användarlösenordet +- [Skydda PDF](./protect-pdf): tillämpa kryptering igen med nya inställningar +- [Ändra behörigheter](./change-permissions): ändra selektivt vilka åtgärder som är tillåtna diff --git a/docs/sv/tools/repair-pdf.md b/docs/sv/tools/repair-pdf.md new file mode 100644 index 00000000..d2ebbcee --- /dev/null +++ b/docs/sv/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Reparera PDF +description: Återställ data från skadade eller korrupta PDF-filer med QPDF:s reparationsmotor. Stöder batchbearbetning. +--- + +# Reparera PDF + +När en PDF inte vill öppnas, visar förvrängt innehåll eller ger fel i din läsare försöker det här verktyget bygga upp dess interna struktur på nytt. Det använder QPDF:s reparationsmotor, som kan återställa data efter många typer av skador: trasiga korsreferenstabeller, avkortade strömmar, ogiltiga objektreferenser och mer. + +## Så fungerar det + +1. Ladda upp en eller flera skadade PDF-filer. +2. Klicka på **Reparera PDF**. +3. En enskild reparerad fil laddas ned direkt. Flera filer ger ett ZIP-arkiv. + +Verktyget skickar varje fil genom QPDF med flaggan `--decrypt`, vilket tvingar QPDF att läsa och skriva om hela PDF-strukturen och åtgärda återställningsbara problem på vägen. + +## Funktioner + +- Batchreparation av flera PDF-filer i en operation +- Automatisk identifiering av återställningsbara respektive icke återställningsbara filer +- Rapportering av lyckat/misslyckat per fil vid bearbetning av flera filer +- Använder QPDF (WebAssembly), ett beprövat bibliotek för PDF-transformering + +## Vad den kan åtgärda + +- Trasiga eller saknade korsreferenstabeller +- Avkortade filslut från ofullständiga nedladdningar +- Ogiltig objektnumrering och strömlängder +- Mindre strukturella inkonsekvenser från buggiga PDF-generatorer +- Krypteringsartefakter från misslyckade dekrypteringsförsök + +## Vad den inte kan åtgärda + +- Kraftigt avkortade filer där det mesta av innehållsdatan saknas +- PDF-filer krypterade med ett lösenord som du inte har +- Filer som egentligen inte är PDF-filer (fel filändelse) +- Bildskador inuti PDF-filen (strukturen åtgärdas, men pixeldata återskapas inte) + +## Användningsområden + +- Återställa en PDF från en misslyckad nedladdning via e-post +- Öppna filer skapade av äldre eller icke-standardiserade PDF-generatorer +- Åtgärda PDF-filer som fungerar i en läsare men inte i en annan +- Förbereda skadade arkivdokument för långtidslagring + +## Tips + +- Om reparationen misslyckas, försök öppna filen i en webbläsare först. Webbläsare har egen återställningslogik och kan visa tillräckligt mycket för att spara om filen. +- För krypterade PDF-filer där reparationen misslyckas, prova Dekryptera PDF först och reparera sedan den dekrypterade utdatan. + +## Relaterade verktyg + +- [Komprimera PDF](./compress-pdf): rensa den reparerade PDF-filens struktur ytterligare +- [Linjärisera PDF](./linearize-pdf): optimera den reparerade filen för webbleverans +- [Platta till PDF](./flatten-pdf): platta till formulär som kan ha skadats diff --git a/docs/sv/tools/reverse-pages.md b/docs/sv/tools/reverse-pages.md new file mode 100644 index 00000000..ccd6c74d --- /dev/null +++ b/docs/sv/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Vänd sidordning +description: Vänd sidordningen i en eller flera PDF-filer så att den sista sidan blir den första. +--- + +# Vänd sidordning + +Vänd sidordningen i en PDF så att den sista sidan blir den första, den näst sista blir den andra, och så vidare. Stöder batchbearbetning av flera filer samtidigt. + +## Så fungerar det + +1. Ladda upp en eller flera PDF-filer. +2. Klicka på bearbetningsknappen. +3. Varje fil vänds oberoende av de andra. Om du laddade upp flera filer blir resultatet ett ZIP-arkiv med alla omvända PDF-filer. +4. En enskild fil laddas ned direkt som en omvänd PDF. + +## Funktioner + +- Batchbearbetning: vänd flera PDF-filer i en operation +- Enskild fil som utdata för en PDF, ZIP för flera +- Borttagningsknappar per fil före bearbetning +- Bevarar allt sidinnehåll och all formatering + +## Användningsområden + +- Åtgärda ett dokument som skannats i omvänd ordning +- Förbereda en presentations-PDF för läsning bakifrån och fram +- Vända sidordningen för vissa utskriftsflöden som matar sidor baklänges +- Rätta till ett dokument där sidorna av misstag satts ihop bakvänt + +## Tips + +- Varje fil i en batch vänds oberoende, filerna ändrar alltså inte ordning i förhållande till varandra. +- För mer detaljerad omordning av sidor (inte bara en full vändning), använd [Organisera & duplicera](./organize-pdf). + +## Relaterade verktyg + +- [Organisera & duplicera](./organize-pdf) +- [Rotera PDF](./rotate-pdf) +- [PDF-multiverktyg](./pdf-multi-tool) diff --git a/docs/sv/tools/rotate-custom.md b/docs/sv/tools/rotate-custom.md new file mode 100644 index 00000000..aedd149d --- /dev/null +++ b/docs/sv/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Rotera med valfri vinkel +description: Rotera PDF-sidor i valfri vinkel med gradinmatning per sida och kontroller för batchrotation. +--- + +# Rotera med valfri vinkel + +Rotera PDF-sidor i valfri vinkel, inte bara i steg om 90 grader. Varje sida får ett eget vinkelfält, och du kan tillämpa en enda vinkel på alla sidor samtidigt med batchkontrollen. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Miniatyrer renderas för varje sida. +2. Varje sida har ett numeriskt inmatningsfält som visar dess aktuella rotationsvinkel. +3. Skriv in valfritt gradvärde (positivt eller negativt) för att rotera en specifik sida, eller använd knapparna vänster/höger per sida för snabba justeringar om 90 grader. +4. Använd fältet för **batchvinkel** högst upp för att ange en enhetlig rotation för alla sidor. +5. Klicka på bearbetningsknappen för att skapa den roterade PDF-filen. + +## Funktioner + +- Fri gradinmatning per sida (valfritt heltal) +- Batchvinkelkontroll för att ange samma rotation på varje sida +- Förhandsvisning av rotationen i realtid i miniatyrerna +- Snabbrotationsknappar per sida för steg om 90 grader +- Miniatyrer som laddas vid behov för bra prestanda i stora dokument + +## Användningsområden + +- Rätta till något sneda skanningar med några få grader +- Rotera sidor för att uppfylla ett krav på ovanlig orientering +- Tillämpa exakta rotationer på enskilda sidor i ett dokument med blandat innehåll +- Finjustera sidvinklar efter en första massrotation + +## Tips + +- Positiva värden roterar medurs, negativa värden roterar moturs. +- Batchvinkelfältet skriver över alla vinklar per sida när det tillämpas. Gör individuella justeringar efter batchoperationen vid behov. +- För vanliga rotationer på 90/180/270 grader med ett enklare gränssnitt, använd [Rotera PDF](./rotate-pdf). + +## Relaterade verktyg + +- [Rotera PDF](./rotate-pdf) +- [PDF-multiverktyg](./pdf-multi-tool) +- [Organisera & duplicera](./organize-pdf) diff --git a/docs/sv/tools/rotate-pdf.md b/docs/sv/tools/rotate-pdf.md new file mode 100644 index 00000000..d20e2fdf --- /dev/null +++ b/docs/sv/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Rotera PDF +description: Rotera enskilda sidor eller alla sidor i en PDF i steg om 90 grader med ett visuellt miniatyrgränssnitt. +--- + +# Rotera PDF + +Rotera sidor i en PDF 90 grader medurs eller moturs. Verktyget visar miniatyrförhandsvisningar av varje sida så att du kan rotera dem individuellt eller tillämpa en massrotation på hela dokumentet. + +## Så fungerar det + +1. Ladda upp en PDF-fil. Miniatyrer för varje sida renderas i ett rutnät. +2. Använd vänster/höger-rotationsknapparna under varje sidminiatyr för att rotera just den sidan. +3. Använd massrotationskontrollerna högst upp för att rotera alla sidor samtidigt. +4. Miniatyrförhandsvisningen uppdateras i realtid och visar rotationen. +5. Klicka på bearbetningsknappen för att spara den roterade PDF-filen. + +## Funktioner + +- Rotation per sida i steg om 90 grader (vänster eller höger) +- Massrotation av alla sidor samtidigt +- Miniatyrförhandsvisning i realtid med animerade rotationsövergångar +- Miniatyrer som laddas vid behov för smidig prestanda i stora dokument +- Bevarar originalets sidinnehåll och kvalitet + +## Användningsområden + +- Åtgärda sidvända eller upp-och-ner-vända skannade sidor +- Rotera liggande sidor till stående orientering (eller tvärtom) +- Rätta till ett dokument med blandad orientering där vissa sidor skannats i fel vinkel +- Förbereda ett dokument för en viss visningsorientering + +## Tips + +- Rotationer är kumulativa. Om du klickar två gånger på medurs-knappen tillämpas en rotation på 180 grader. +- För rotationer som inte är 90 grader (t.ex. 45 grader för att rätta till en något sned skanning), använd i stället [Rotera efter anpassade grader](./rotate-custom). +- Massrotationskontrollerna påverkar alla sidor, inte bara markerade. Det finns ingen markeringsfunktion i det här verktyget. För det, använd [PDF-multiverktyg](./pdf-multi-tool). + +## Relaterade verktyg + +- [Rotera efter anpassade grader](./rotate-custom) +- [PDF-multiverktyg](./pdf-multi-tool) +- [Organisera & duplicera](./organize-pdf) diff --git a/docs/sv/tools/rtf-to-pdf.md b/docs/sv/tools/rtf-to-pdf.md new file mode 100644 index 00000000..5b23967f --- /dev/null +++ b/docs/sv/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF till PDF +description: Konvertera Rich Text Format-filer (RTF) till PDF i webbläsaren med en LibreOffice-driven motor. +--- + +# RTF till PDF + +Konvertera Rich Text Format-dokument till PDF. RTF är ett plattformsoberoende dokumentformat som stöds av i princip alla ordbehandlare. Det här verktyget använder en LibreOffice-motor i webbläsaren för att rendera RTF-filer med bevarad formatering: fet stil, kursiv stil, tabeller och inbäddade bilder följer alla med till PDF-filen. + +## Format som stöds + +| Format | Filändelser | MIME-typer | +| :----- | :---------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp en eller flera RTF-filer. +2. Granska fillistan. Lägg till fler eller ta bort filer vid behov. +3. Klicka på **Konvertera till PDF**. LibreOffice-motorn initieras första gången och bearbetar sedan varje fil. +4. En enskild fil laddas ned direkt som PDF. Flera filer levereras som `rtf-converted.zip`. + +## Alternativ + +Det här verktyget har inga extra inställningar. Konverteringen bevarar den ursprungliga RTF-formateringen. + +## Resultat + +| Antal filer | Resultat | +| :---------- | :------------------------------------------------- | +| 1 fil | Enskild PDF att ladda ned (t.ex. `letter.pdf`) | +| 2+ filer | ZIP-arkiv (`rtf-converted.zip`) med en PDF per fil | + +## Användningsområden + +- Konvertera äldre RTF-dokument från äldre ordbehandlare till moderna PDF-filer +- Göra om RTF-mallar för e-post till PDF-förhandsvisningar +- Bearbeta RTF-utdata från juridiska eller medicinska programsystem +- Batchkonvertera RTF-filer från ett dokumenthanteringssystem till PDF för arkivering + +## Tips + +- LibreOffice-motorn laddas en gång och cachas. Den första konverteringen i en session tar några sekunder extra, de följande går snabbare. +- RTF-filer med inbäddade OLE-objekt kanske inte renderar alla objekt perfekt. Vanlig text, bilder och standardformatering konverteras tillförlitligt. +- Om dina RTF-filer skapades i Microsoft Word kan du också konvertera dem direkt med verktyget [Word till PDF](./word-to-pdf), som accepterar RTF vid sidan av DOC och DOCX. + +## Relaterade verktyg + +- [Word till PDF](./word-to-pdf) +- [ODT till PDF](./odt-to-pdf) +- [Text till PDF](./txt-to-pdf) diff --git a/docs/sv/tools/sanitize-pdf.md b/docs/sv/tools/sanitize-pdf.md new file mode 100644 index 00000000..cde38f6b --- /dev/null +++ b/docs/sv/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Sanera PDF +description: Ta bort dolt och potentiellt farligt innehåll från PDF-filer, inklusive metadata, JavaScript, inbäddade filer, anteckningar och lager. +--- + +# Sanera PDF + +PDF-filer kan innehålla mycket mer än det du ser på skärmen. Dold metadata, inbäddad JavaScript, filbilagor, formulärdata och lagerinformation kan läcka känsliga uppgifter eller utgöra säkerhetsrisker. Sanering tar bort allt detta och ger dig ett rent dokument som är säkert att dela offentligt. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Välj vilka element som ska tas bort i checklistan. +3. Klicka på **Sanera PDF**. +4. Ladda ned den rensade filen. + +## Saneringsalternativ + +Alla alternativ är aktiverade som standard. Avmarkera de du vill behålla. + +| Alternativ | Vad som tas bort | +| --------------------------- | ------------------------------------------------------------------- | +| **Platta till formulär** | Omvandlar interaktiva formulärfält till statiskt innehåll | +| **Ta bort metadata** | Tar bort författare, titel, skapandedatum, programinfo och XMP-data | +| **Ta bort anteckningar** | Raderar kommentarer, markeringar, klisterlappar och markup | +| **Ta bort JavaScript** | Eliminerar inbäddade skript som kan köras vid öppning | +| **Ta bort inbäddade filer** | Tar bort filbilagor som är inbäddade i PDF-filen | +| **Ta bort lager (OCG)** | Plattar till valfria innehållsgrupper till ett enda lager | +| **Ta bort länkar** | Tar bort hyperlänkar och URL-referenser | +| **Ta bort strukturträd** | Tar bort dokumentstrukturen som används för tillgänglighetstaggning | +| **Ta bort MarkInfo** | Tar bort information om märkt innehåll | +| **Ta bort typsnitt** | Tar bort inbäddad typsnittsdata (använd med försiktighet) | + +## Användningsområden + +- Förbereda en PDF för offentlig publicering genom att ta bort intern metadata (författarnamn, programversioner, redigeringshistorik) +- Ta bort JavaScript från en PDF som mottagits från en opålitlig källa innan du öppnar den +- Rensa en PDF innan du skickar den till en kund som inte ska se inbäddade kommentarer eller formulärfältsnamn +- Ta bort dolda lager från en arkitektritning innan du delar slutversionen +- Uppfylla krav på dataminimering enligt integritetslagstiftning + +## Tips + +- Lämna "Ta bort typsnitt" avmarkerat om du inte är säker på att PDF-filen fortfarande renderas korrekt. Att ta bort typsnitt kan göra text osynlig i vissa läsare. +- Om du bara behöver ta bort metadata är det dedikerade verktyget Ta bort metadata snabbare och mer fokuserat. +- Sanering går inte att ångra. Behåll din originalfil. + +## Relaterade verktyg + +- [Ta bort metadata](./remove-metadata): ta bara bort metadata utan att röra annat innehåll +- [Platta till PDF](./flatten-pdf): platta specifikt till formulär och anteckningar +- [Skydda PDF](./protect-pdf): lägg till lösenordsskydd efter saneringen +- [Rasterisera PDF](./rasterize-pdf): den radikala lösningen, konvertera till bilder för att eliminera allt dolt innehåll diff --git a/docs/sv/tools/scanner-effect.md b/docs/sv/tools/scanner-effect.md new file mode 100644 index 00000000..db6cc1a7 --- /dev/null +++ b/docs/sv/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Skannereffekt +description: Få din PDF att se ut som ett skannat dokument med justerbart brus, rotation, oskärpa och pappersåldrande. +--- + +# Skannereffekt + +Förvandla en ren digital PDF till något som ser ut att ha kommit ur en flatbäddsskanner. Verktyget tillämpar konfigurerbart brus, lätt rotation, oskärpa, ljusstyrkeförskjutningar och valfri gulning för att simulera bristerna hos en fysisk skanning. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Redigeraren öppnas med en liveförhandsvisning av första sidan bredvid en inställningspanel. +3. Justera skanningseffektens parametrar med reglagen och växlarna. +4. Förhandsvisningen uppdateras i realtid när du ändrar inställningar. +5. Klicka på **Använd** för att bearbeta alla sidor och ladda ned resultatet. + +## Alternativ + +- **Färgrymd (växel för gråskala)**: Konvertera utdatan till gråskala för ett klassiskt svartvitt skanningsutseende. +- **Kant**: Lägg till en subtil mörk kant runt sidkanterna för att efterlikna kantartefakter från skannern. +- **Rotera**: Tillämpa en lätt rotation (-5 till +5 grader) för att simulera felmatat papper. +- **Rotationsvarians**: Lägg till slumpmässig variation i rotationsvinkeln så att varje sida lutar lite olika. +- **Ljusstyrka**: Förskjut den totala ljusstyrkan uppåt eller nedåt. +- **Kontrast**: Justera kontrasten för att simulera variationer i tonerkvalitet. +- **Oskärpa**: Tillämpa gaussisk oskärpa för att mjuka upp textkanter som i en skanning av låg kvalitet. +- **Brus**: Lägg till slumpmässigt pixelbrus för att simulera korn från skannerns sensor. Högre värden ger grövre korn. +- **Gulaktig**: Lägg till en varm gul ton för att simulera åldrat eller återvunnet papper. +- **Upplösning**: Ange utdatans DPI. Lägre värden ger ett mer pixlat, skanningsliknande utseende. +- **Återställ**: Återställ alla inställningar till standardvärdena. + +## Funktioner + +- Förhandsvisning i realtid som uppdateras när du justerar varje parameter +- Slumpmässig rotationsvarians per sida för realistisk variation +- Tio oberoende justerbara parametrar +- Gråskaleläge för autentisk svartvit skanningsutdata +- Upplösningskontroll från fax med låg DPI till arkivkvalitet med hög DPI + +## Användningsområden + +- Få digitalt skapade dokument att se ut som om de skannats och skrivits ut +- Simulera fysiskt åldrande av dokument för rekonstruktion av historiska dokument +- Testa OCR-programvara mot försämrad skanningskvalitet +- Skapa dokument som matchar den visuella stilen i befintliga skannade arkiv + +## Tips + +- Börja med subtila värden. En brusnivå på 10-20, en lätt rotation på 0,5 grader och minimal oskärpa ger redan ett övertygande skanningsutseende. +- Kombinera gråskaleläget med lätt gulning för en effekt av "kopia av en kopia". +- Lägre upplösningar (100-150 DPI) ger det mest realistiska faxmaskinsutseendet. + +## Relaterade verktyg + +- [Invertera färger](./invert-colors) +- [Justera färger](./adjust-colors) +- [Bakgrundsfärg](./background-color) diff --git a/docs/sv/tools/sign-pdf.md b/docs/sv/tools/sign-pdf.md new file mode 100644 index 00000000..4b12cd6a --- /dev/null +++ b/docs/sv/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Signera PDF +description: Rita, skriv eller ladda upp en signatur och placera den på dina PDF-sidor med en integrerad läsare. +--- + +# Signera PDF + +Lägg till din signatur i vilket PDF-dokument som helst. Verktyget bäddar in en komplett PDF-läsare med inbyggda signaturverktyg där du kan rita en signatur för hand, skriva ditt namn i ett signaturtypsnitt eller ladda upp en signaturbild. Placera och ändra storlek på signaturer på valfri sida och spara sedan det signerade dokumentet. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Dokumentet öppnas i en integrerad PDF-läsare med anteckningsverktyg. +3. Använd läsarens signaturverktyg för att skapa din signatur genom att rita, skriva eller ladda upp en bild. +4. Klicka på sidan där du vill placera signaturen och justera dess storlek och position. +5. Markera eventuellt **Platta till PDF** för att bädda in signaturen permanent i dokumentet. +6. Klicka på **Spara och ladda ned signerad PDF** för att få din signerade fil. + +## Alternativ + +- **Platta till PDF**: När det är markerat bäddas signaturen in permanent i sidinnehållet. Det hindrar andra från att flytta eller ta bort signaturen. När det inte är markerat förblir signaturen en anteckning som kan redigeras i kompatibla läsare. + +## Funktioner + +- Tre sätt att skapa signaturer: frihandsritning, skriven text eller uppladdad bild +- Integrerad PDF-läsare för exakt placering +- Dra för att placera och ändra storlek på signaturer på valfri sida +- Valfri tillplattning för att bädda in signaturer permanent +- Stöd för flera signaturer i samma dokument + +## Användningsområden + +- Signera kontrakt, avtal eller godkännandeformulär innan du skickar tillbaka dem +- Lägga till din signatur på skattedokument, försäkringsanspråk eller myndighetsblanketter +- Placera initialer på enskilda sidor i ett flersidigt avtal +- Signera sekretessavtal eller HR-dokument som kommer som PDF-bilagor + +## Tips + +- Aktivera tillplattning om du skickar den signerade PDF-filen till någon som inte ska kunna ta bort eller flytta din signatur. +- För juridiskt bindande digitala signaturer med certifikatbaserad verifiering erbjuder BentoPDF också ett separat verktyg för digital signatur. +- Ladda upp en PNG-signaturbild med transparent bakgrund för det renaste resultatet. + +## Relaterade verktyg + +- [PDF-redigerare](./edit-pdf) +- [Lägg till stämplar](./add-stamps) +- [Formulärifyllare](./form-filler) diff --git a/docs/sv/tools/split-pdf.md b/docs/sv/tools/split-pdf.md new file mode 100644 index 00000000..d4b82e56 --- /dev/null +++ b/docs/sv/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Dela PDF +description: Dela en PDF i mindre filer efter sidintervall, visuellt urval, bokmärken, jämna/udda sidor eller fasta intervall. +--- + +# Dela PDF + +Dela upp en PDF i mindre dokument med ett av sex delningslägen. Från enkla sidintervall till delning baserad på bokmärken, det här verktyget hanterar alla scenarier för att dela ett dokument. + +## Så fungerar det + +1. Ladda upp en enskild PDF-fil. +2. Välj ett delningsläge i listrutan. +3. Konfigurera lägets alternativ (sidintervall, urval osv.). +4. Klicka på bearbetningsknappen. +5. Resultatet laddas ned som en enskild PDF eller ett ZIP-arkiv beroende på läge och inställningar. + +## Delningslägen + +| Läge | Beskrivning | +| ------------------ | --------------------------------------------------------------------------------------------------------------------- | +| **Intervall** | Ange sidintervall som `1-3, 5, 8-10`. Flera intervall ger separata PDF-filer i en ZIP. Ett enda intervall ger en PDF. | +| **Visuellt urval** | Bläddra bland sidminiatyrer och klicka för att välja de sidor du vill ha. Valda sidor extraheras till en ny PDF. | +| **Jämna / udda** | Extrahera enbart jämnt numrerade eller udda numrerade sidor. | +| **Alla sidor** | Dela varje sida till en egen PDF-fil, nedladdad som ZIP. | +| **Bokmärken** | Dela vid bokmärkesgränser. Välj bokmärkesnivå för att styra var delningarna sker. | +| **Var N:e sida** | Dela i delar om N sidor vardera (t.ex. var 5:e sida). Den sista delen kan ha färre sidor. | + +## Funktioner + +- Sex olika delningslägen som täcker i princip alla användningsfall +- Visuell sidväljare med miniatyrer som laddas vid behov +- Bokmärkesmedveten delning med nivåfiltrering +- ZIP-utdata som alternativ för lägena intervall och visuellt urval +- Hanterar sidintervall med blandad syntax (`1-3, 5, 8-10`) +- Varning när delning efter N sidor ger ojämna delar + +## Användningsområden + +- Extrahera ett specifikt kapitel eller avsnitt ur ett stort dokument +- Separera udda och jämna sidor för arbetsflöden med dubbelsidig utskrift +- Dela en bok-PDF i enskilda kapitelfiler vid bokmärkesgränser +- Isolera specifika sidor (som en signatursida) från ett kontrakt +- Dela en sammanställd rapport i filer per avsnitt för distribution + +## Tips + +- Flera sidintervall separerade med kommatecken (t.ex. `1-5, 10-15, 20-25`) ger separata PDF-filer, en per intervall, samlade i en ZIP. +- Bokmärkesläget kräver att PDF-filen faktiskt innehåller bokmärken. Om inga hittas får du ett felmeddelande. +- Kryssrutan "Ladda ned som ZIP" i lägena Intervall och Visuellt urval låter dig få enskilda PDF-filer per sida i stället för en samlad fil. + +## Relaterade verktyg + +- [Sammanfoga PDF](./merge-pdf) +- [Extrahera sidor](./extract-pages) +- [Ta bort sidor](./delete-pages) +- [PDF-multiverktyg](./pdf-multi-tool) diff --git a/docs/sv/tools/svg-to-pdf.md b/docs/sv/tools/svg-to-pdf.md new file mode 100644 index 00000000..b274f37d --- /dev/null +++ b/docs/sv/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG till PDF +description: Konvertera SVG-vektorgrafik till PDF med kvalitetskontroll, helt i webbläsaren. +--- + +# SVG till PDF + +Konvertera Scalable Vector Graphics-filer (SVG) till PDF. Verktyget rasteriserar varje SVG via webbläsarens renderingsmotor och bäddar sedan in resultatet i dess ursprungliga upplösning. Användbart för att göra vektorikoner, diagram och illustrationer till portabla dokument. + +## Format som stöds + +| Format | Filändelser | +| :----- | :---------- | +| SVG | `.svg` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp en eller flera SVG-filer. +2. Granska och hantera fillistan. +3. Välj en nivå för **PDF-kvalitet**. +4. Klicka på **Konvertera till PDF**. Resultatet laddas ned som `from_svgs.pdf`. + +Varje SVG läses som text, renderas på en canvas i sin egen bredd och höjd (standard 800x600 om inga mått anges) och exporteras som PNG. Den PNG-filen bäddas sedan in i PDF-filen med pdf-lib. Transparenta områden fylls med vit bakgrund. + +## Alternativ + +**PDF-kvalitet** styr komprimeringen efter rasteriseringen: + +- **Hög kvalitet**: närmast den ursprungliga renderingen. +- **Medelhög kvalitet** (standard): bra balans. +- **Låg kvalitet**: minsta filen, en del detaljförlust. + +## Användningsområden + +- Konvertera arkitekt- eller ingenjörsdiagram från SVG till en tryckklar PDF +- Paketera ikonuppsättningar i en referens-PDF för ett designsystem +- Göra datavisualiseringar (D3.js, export från diagrambibliotek) till rapportklara PDF-filer +- Skapa utskrivbara versioner av SVG-baserad infografik + +## Tips + +- SVG-filer utan explicita attribut för `width` och `height` renderas i 800x600 pixlar. För bästa resultat, ange mått i SVG-källan innan du konverterar. +- Komplexa SVG-filer med externa typsnittsreferenser eller länkade bilder kanske inte renderas perfekt. Bädda in alla resurser i SVG-filen för tillförlitligt resultat. +- Eftersom SVG-filen rasteriseras innehåller PDF-filen en bitmappsbild i stället för vektorbanor. För äkta vektor-PDF behövs ett dedikerat vektorverktyg. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [PNG till PDF](./png-to-pdf) +- [BMP till PDF](./bmp-to-pdf) diff --git a/docs/sv/tools/table-of-contents.md b/docs/sv/tools/table-of-contents.md new file mode 100644 index 00000000..94446ef5 --- /dev/null +++ b/docs/sv/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Innehållsförteckning +description: Skapa en formaterad innehållsförteckningssida från PDF-filens befintliga bokmärken. +--- + +# Innehållsförteckning + +Det här verktyget läser bokmärkena (konturerna) i din PDF och skapar en formaterad innehållsförteckningssida som läggs först i dokumentet. Om din PDF redan har bokmärken men saknar en synlig innehållsförteckning skapar verktyget en automatiskt. + +## Så fungerar det + +1. Ladda upp en PDF som innehåller bokmärken. +2. Anpassa innehållsförteckningens titel, teckenstorlek och typsnittsfamilj. +3. Markera eventuellt **Lägg till bokmärke för innehållsförteckningssidan** för att ta med själva innehållsförteckningen i bokmärkesträdet. +4. Klicka på **Skapa innehållsförteckning** för att bearbeta filen. +5. Den uppdaterade PDF-filen laddas ned automatiskt med innehållsförteckningssidan inlagd i början. + +## Alternativ + +- **Titel på innehållsförteckning**: Rubriken som visas överst på den skapade sidan. Standard är "Innehållsförteckning". +- **Teckenstorlek**: Välj mellan 10 pt och 72 pt. Standard är 12 pt. +- **Typsnittsfamilj**: Välj bland varianterna Times Roman, Helvetica eller Courier (normal, fet, kursiv, fet kursiv). Standard är Helvetica. +- **Lägg till bokmärke för innehållsförteckningssidan**: När det är markerat läggs en bokmärkespost för själva innehållsförteckningssidan till i PDF-filens konturträd. + +## Funktioner + +- Läser hela bokmärkeshierarkin från PDF-filen +- Skapar en prydligt formaterad innehållsförteckningssida med sidnummerhänvisningar +- Stöder nästlade bokmärkesnivåer med indrag +- Val bland 12 inbyggda PDF-typsnitt +- Valfritt självrefererande bokmärke för innehållsförteckningssidan + +## Användningsområden + +- Lägga till en utskrivbar innehållsförteckning i e-böcker eller rapporter som bara har digitala bokmärken +- Skapa en innehållsförteckning för ett sammanfogat dokument efter att flera PDF-filer slagits ihop +- Skapa en referenssida för långa tekniska manualer +- Förbereda dokument för tryck där en synlig innehållsförteckning förväntas + +## Tips + +- Om din PDF inte har några bokmärken, använd först verktyget [Redigera bokmärken](./bookmark) för att skapa dem och kom sedan tillbaka hit för att skapa innehållsförteckningen. +- För stora dokument förbättrar en större teckenstorlek som 14 pt eller 16 pt läsbarheten. + +## Relaterade verktyg + +- [Redigera bokmärken](./bookmark) +- [Sidnummer](./page-numbers) +- [Sidhuvud & sidfot](./header-footer) diff --git a/docs/sv/tools/text-color.md b/docs/sv/tools/text-color.md new file mode 100644 index 00000000..1616234b --- /dev/null +++ b/docs/sv/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Ändra textfärg +description: Ändra färgen på all text i din PDF till valfri färg. +--- + +# Ändra textfärg + +Byt färg på text i hela din PDF. Verktyget identifierar textområden på varje sida och färgar om dem till din valda färg, med bevarad dokumentlayout och innehåll som inte är text. + +## Så fungerar det + +1. Ladda upp din PDF-fil. +2. Välj en ny textfärg med färgväljaren. Standard är blå (#0000FF). +3. Klicka på **Ändra textfärg** för att bearbeta. +4. Den omfärgade PDF-filen laddas ned automatiskt. En förloppsindikator visar vilken sida som bearbetas. + +## Alternativ + +- **Ny textfärg**: En färgväljare för att välja ersättningsfärgen för all text i dokumentet. + +## Funktioner + +- Färgar om text på varje sida i dokumentet +- Bearbetning per sida med förloppsvisning +- Färgväljare med fullt stöd för hexfärger +- Bevarar sidlayout och element som inte är text + +## Användningsområden + +- Ändra svart text till mörkblå för ett mjukare, modernare dokumentutseende +- Färga om text för att matcha varumärkesriktlinjer innan dokument distribueras +- Konvertera text till en specifik färg för att uppfylla tillgänglighetskrav +- Göra text synlig mot en nyligen tillämpad bakgrundsfärg + +## Tips + +- Verktyget renderar sidor i 2x skala för kvalitet och bygger sedan om PDF-filen. Utdatan är bildbaserad, så texten går inte längre att markera eller söka i. +- För dokument där du behöver behålla markerbar text, överväg att redigera PDF-filen direkt med [PDF-redigeraren](./edit-pdf) i stället. +- Bearbetningstiden ökar med sidantalet eftersom varje sida renderas individuellt. + +## Relaterade verktyg + +- [Bakgrundsfärg](./background-color) +- [Invertera färger](./invert-colors) +- [Justera färger](./adjust-colors) diff --git a/docs/sv/tools/tiff-to-pdf.md b/docs/sv/tools/tiff-to-pdf.md new file mode 100644 index 00000000..c2dbf3e7 --- /dev/null +++ b/docs/sv/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF till PDF +description: Konvertera enkel- och flersidiga TIFF-bilder till PDF i webbläsaren med fullt sidstöd. +--- + +# TIFF till PDF + +Konvertera TIFF-filer till PDF, inklusive flersidiga TIFF-filer. Varje sida (eller "IFD") i en TIFF-fil blir en separat sida i PDF-filen. Det är särskilt användbart för skannade dokument, fax och medicinska bilder som ofta lagras som flersidiga TIFF-filer. + +## Format som stöds + +| Format | Filändelser | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina TIFF-filer. +2. Granska fillistan och hantera den vid behov. +3. Klicka på **Konvertera till PDF**. Resultatet laddas ned som `from_tiff.pdf`. + +Verktyget avkodar varje TIFF-fil med en JavaScript-baserad TIFF-avkodare och extraherar varje sidas råa RGBA-pixeldata. Varje sida renderas på en canvas, exporteras som PNG och bäddas in i PDF-filen. Sidmåtten matchar de ursprungliga TIFF-sidorna. + +## Alternativ + +Det här verktyget har inga extra kvalitetsinställningar. Bilder bäddas in i sin ursprungliga upplösning. + +## Användningsområden + +- Konvertera flersidiga faxdokument (TIFF-F) till ett mer portabelt PDF-format +- Göra skannade dokumentarkiv som lagrats som TIFF till sökbara PDF-filer (kombinera med OCR-verktyget efteråt) +- Bearbeta medicinska bildfiler (patologibilder, röntgenexporter) som använder TIFF +- Konvertera TIFF-filer med GIS- eller satellitbilder till delbara dokument + +## Tips + +- Flersidiga TIFF-filer stöds fullt ut. En TIFF med 10 sidor ger en PDF med 10 sidor. Du behöver inte dela TIFF-filen först. +- Mycket stora TIFF-filer (hundratals megabyte) kan ta längre tid att bearbeta eftersom hela filen måste avkodas i webbläsarens minne. +- Om du behöver OCR på den resulterande PDF-filen, kör den genom verktyget [OCR PDF](./ocr-pdf) efter konverteringen. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [BMP till PDF](./bmp-to-pdf) +- [JPG till PDF](./jpg-to-pdf) diff --git a/docs/sv/tools/txt-to-pdf.md b/docs/sv/tools/txt-to-pdf.md new file mode 100644 index 00000000..fc3b0208 --- /dev/null +++ b/docs/sv/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Text till PDF +description: Konvertera vanliga textfiler eller skriven text till PDF med egna typsnitt, färger och sidstorlekar. +--- + +# Text till PDF + +Konvertera ren text till en formaterad PDF. Du kan ladda upp `.txt`-filer eller skriva direkt i den inbyggda textredigeraren. Verktyget stöder flera typsnitt, egna textfärger och ett brett urval av sidstorlekar, från A0 ned till A10, plus US Letter, Legal och Tabloid. + +## Format som stöds + +| Indata | Filändelser | +| :------------------- | :----------------------------------- | +| Vanliga textfiler | `.txt` | +| Direkt textinmatning | Skriv eller klistra in i redigeraren | + +## Så fungerar det + +1. Välj indataläge med växeln högst upp: **Ladda upp filer** eller **Skriv text**. +2. Om du laddar upp, dra och släpp eller klicka för att välja en eller flera `.txt`-filer. Om du skriver, ange texten direkt i textrutan. +3. Konfigurera formateringsalternativen: typsnittsfamilj, teckenstorlek, textfärg och sidstorlek. +4. Klicka på **Skapa PDF**. Resultatet laddas ned som `text_to_pdf.pdf`. + +När du laddar upp flera filer sammanfogas deras innehåll med tomma rader emellan. + +## Alternativ + +| Alternativ | Värden | Standard | +| :------------------ | :----------------------------------------------------------------------- | :-------------- | +| **Typsnittsfamilj** | Helvetica (sans-serif), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Teckenstorlek** | 6 -- 72 pt | 12 | +| **Textfärg** | Valfri färg via färgväljare | Svart (#000000) | +| **Sidstorlek** | ISO A0--A10, B0--B10, C0--C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Språk med höger-till-vänster-skrift (arabiska, hebreiska, persiska, urdu) identifieras automatiskt. När RTL-text hittas växlar textriktning och justering i enlighet med det. + +## Användningsområden + +- Konvertera kodsnuttar eller loggfiler till en utskrivbar PDF med typsnittet Courier +- Skapa snabbt en PDF av mötesanteckningar som skrivits på stället +- Formatera ett manuskript i ren text med ett visst typsnitt och en viss sidstorlek för inlämning +- Skapa en PDF-version av en README eller changelog för offlinedistribution + +## Tips + +- Använd läget **Skriv text** när du snabbt vill konvertera innehåll från urklipp utan att först spara det som en fil. +- Courier (monospace) är det bästa typsnittet för kod, loggar eller annat innehåll där kolumnjustering spelar roll. +- Sidmarginalerna är fasta på 72 punkter (1 tum) på alla sidor. + +## Relaterade verktyg + +- [Markdown till PDF](./markdown-to-pdf) +- [CSV till PDF](./csv-to-pdf) +- [Word till PDF](./word-to-pdf) diff --git a/docs/sv/tools/unlock-pdf.md b/docs/sv/tools/unlock-pdf.md new file mode 100644 index 00000000..3ca38fd9 --- /dev/null +++ b/docs/sv/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Lås upp PDF +description: Ta bort lösenordsskydd från krypterade PDF:er. Stöder batchdekryptering med ett enda lösenord för flera filer. +--- + +# Lås upp PDF + +Om du har lösenordet till en krypterad PDF tar det här verktyget bort krypteringen helt och skapar en olåst kopia som alla kan öppna utan inloggningsuppgifter. Det stöder batchdekryptering när flera PDF:er har samma lösenord. + +## Så fungerar det + +1. Ladda upp en eller flera krypterade PDF-filer. +2. Ange det **lösenord** som skyddar filerna. +3. Klicka på **Dekryptera PDF**. +4. En enskild fil laddas ner direkt. Flera filer ger ett ZIP-arkiv med alla olåsta PDF:er. + +## Funktioner + +- Dekryptering av enskilda filer och i batch +- Hanterar både användarlösenord och ägarlösenord +- Ger helt okrypterad utdata utan kvarvarande begränsningar +- Tydliga felmeddelanden för felaktiga lösenord eller skadade filer +- Spårning av lyckade och misslyckade filer i batchläge + +## Skillnaden mot Ta bort begränsningar + +**Dekryptera PDF** kräver lösenordet och tar bort all kryptering. **Ta bort begränsningar** riktar sig mot användningsbegränsningar (utskrift, kopiering, redigering) och kräver kanske inget lösenord om bara ett ägarlösenord har angetts. Använd Dekryptera när PDF:en inte alls går att öppna utan lösenord. + +## Användningsområden + +- Permanent låsa upp PDF:er som du krypterat tidigare när lösenordet inte längre behövs +- Ta bort kryptering från en omgång arkiverade dokument för enklare långsiktig åtkomst +- Förbereda lösenordsskyddade PDF:er för ett dokumenthanteringssystem som inte stöder krypterade filer +- Låsa upp PDF:er innan du slår ihop dem med andra dokument (många sammanslagningsverktyg kan inte hantera krypterad indata) + +## Tips + +- Lösenordsfältet gäller alla uppladdade filer. Om dina PDF:er har olika lösenord, behandla dem i separata omgångar. +- Om du får felet "Fel lösenord", kontrollera om det finns avslutande mellanslag eller om Caps Lock är påslaget. +- Efter dekryptering har utdata ingen säkerhet alls. Kryptera om med Kryptera PDF om du vill använda ett nytt lösenord. + +## Relaterade verktyg + +- [Skydda PDF](./protect-pdf), använd kryptering igen med ett nytt lösenord +- [Ta bort begränsningar](./remove-restrictions), ta bort användningsbegränsningar utan full dekryptering +- [Ändra behörigheter](./change-permissions), ändra specifika behörigheter i en krypterad PDF diff --git a/docs/sv/tools/validate-signature-pdf.md b/docs/sv/tools/validate-signature-pdf.md new file mode 100644 index 00000000..21ccb9d9 --- /dev/null +++ b/docs/sv/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Validera signatur +description: Verifiera digitala signaturer i PDF-filer. Kontrollera certifikatets giltighet, undertecknarens identitet, dokumentets integritet och förtroendekedjans status. +--- + +# Validera signatur + +Ladda upp en signerad PDF så extraherar verktyget varje digital signatur, identifierar undertecknaren, kontrollerar certifikatets giltighet och rapporterar om dokumentet har ändrats sedan signeringen. Du kan också ange ett betrott certifikat för att verifiera signaturkedjan. + +## Så fungerar det + +1. Ladda upp en signerad PDF-fil. Valideringen startar automatiskt. +2. Verktyget visar en sammanfattning: antal signaturer som hittats och hur många som är giltiga. +3. Varje signatur får ett detaljerat kort med undertecknarens namn, utfärdare, datum och status. +4. Du kan också ladda upp ett **betrott certifikat** (.pem, .crt, .cer, .der) för att verifiera signaturen mot ett specifikt förtroendeankare. Omvalidering körs automatiskt. + +## Vad som kontrolleras + +### Tolkning av signaturen + +Verktyget extraherar PKCS#7-signaturobjekt från PDF:en, avkodar ASN.1-strukturen och hämtar undertecknarens X.509-certifikat tillsammans med eventuell certifikatkedja som är inbäddad i signaturen. + +### Certifikatets giltighet + +- **Utgångsdatum**: Ligger certifikatet just nu inom sitt giltighetsintervall? +- **Upptäckt av självsignerade certifikat**: Är certifikatet sin egen utfärdare? +- **Förtroendekedja**: När ett betrott certifikat anges, leder undertecknarens certifikatkedja tillbaka till det? + +### Kryptografisk verifiering + +- Verktyget återskapar de byte som omfattas av signaturens `/ByteRange`, beräknar hashen med den algoritm som undertecknaren angett och jämför resultatet med attributet `messageDigest` i signaturen. +- Därefter serialiseras de signerade attributen om som en DER SET och signaturen verifieras mot signaturcertifikatets publika nyckel. +- **En signatur rapporteras som giltig endast när alla dessa kontroller godkänns.** Om PDF:ens byte ändrades efter signeringen, eller om den inbäddade signaturen inte matchar undertecknarens nyckel, visar statusen "Ogiltig: den kryptografiska verifieringen misslyckades" med den specifika orsaken. + +#### Algoritmer för signaturer som stöds + +| Algoritm | Verifieringsväg | +| ----------------------- | -------------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, med Web Crypto som reserv | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` efter konvertering av signaturen DER → IEEE P1363 | + +Om en signatur använder en algoritm utanför den här listan (till exempel Ed25519, SM2 eller RSA med ett ovanligt digest-OID) visar kortet **"Overifierad: signaturalgoritmen stöds inte"** i gult, tillsammans med det specifika OID:t eller skälet. Detta är en medveten uppdelning i tre tillstånd: + +- **Giltig**: signaturen har verifierats kryptografiskt mot undertecknarens publika nyckel. +- **Ogiltig**: verifieringen kördes och gav ett negativt resultat (byte ändrade, nyckeln matchar inte). +- **Overifierad**: verktyget kunde inte köra verifiering för den här algoritmen. Certifikatets metadata visas fortfarande, men du bör behandla signaturen som "okänd" och verifiera den med Adobe Acrobat eller `openssl cms -verify`. + +### Osäkra digest-algoritmer + +- Signaturer som använder **MD5 eller SHA-1** avvisas som ogiltiga och markeras med statusen "Osäker sammandragsalgoritm". Båda algoritmerna har publicerade kollisionsattacker, så en signatur över en SHA-1- eller MD5-hash ger ingen integritetsgaranti. +- SHA-224, SHA-256, SHA-384 och SHA-512 accepteras alla. + +### Dokumenttäckning + +- **Full täckning**: Signaturen omfattar hela PDF-filen, vilket betyder att inga byte har lagts till eller ändrats efter signeringen. +- **Partiell täckning**: Signaturen omfattar bara en del av filen. Det kan tyda på att ändringar gjorts efter signeringen (inte nödvändigtvis skadliga, eftersom inkrementella sparningar ger partiell täckning). + +## Signaturdetaljer + +Varje signaturkort visar: + +- **Signerad av**: Common name, organisation och e-postadress från undertecknarens certifikat +- **Utfärdare**: Certifikatutfärdaren som utfärdade undertecknarens certifikat +- **Signerad den**: Tidsstämpeln som är inbäddad i signaturen +- **Giltig från / Giltig till**: Certifikatets giltighetsperiod +- **Orsak**: Varför dokumentet signerades (om angivet) +- **Plats**: Var det signerades (om angivet) +- **Täckningsstatus**: Full eller partiell +- **Förtroendemärke**: Betrodd eller Inte i förtroendekedjan (endast när ett eget certifikat anges) + +### Tekniska detaljer + +Expandera avsnittet med tekniska detaljer för: + +- Serienummer för undertecknarens certifikat +- Digest-algoritm (SHA-256, SHA-512 osv.) +- Signaturalgoritm (RSA med SHA-256, ECDSA med SHA-256 osv.) +- Felmeddelanden för ogiltiga signaturer + +## Användningsområden + +- Verifiera ett digitalt signerat avtal innan du medsignerar +- Granska signerade dokument för att bekräfta att de inte har manipulerats +- Kontrollera om ett certifikat har gått ut sedan dokumentet signerades +- Validera signaturer mot din organisations rotcertifikat +- Granska signeringsdetaljerna i myndighets- eller juridiska dokument + +## Tips + +- Ett självsignerat certifikat betyder inte att signaturen är ogiltig. Det betyder att undertecknarens identitet inte kan verifieras via en betrodd tredje part. Det är vanligt för interna dokument. +- Partiell täckning tyder inte alltid på manipulation. Många PDF-arbetsflöden lägger till inkrementella uppdateringar (som en andra signatur) som ger partiell täckning. +- Ladda upp din organisations rot- eller mellancertifikat som betrott certifikat för att få verifiering av förtroendekedjan. + +## Relaterade verktyg + +- [Digital signatur PDF](./digital-sign-pdf), signera PDF:er med ditt eget certifikat +- [Platta till PDF](./flatten-pdf), platta till en PDF före signering för att förhindra ändringar efter signaturen +- [Ta bort metadata](./remove-metadata), rensa en PDF innan du lägger till en signatur diff --git a/docs/sv/tools/view-metadata.md b/docs/sv/tools/view-metadata.md new file mode 100644 index 00000000..7fc479a4 --- /dev/null +++ b/docs/sv/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Visa metadata +description: Granska alla metadataegenskaper i en PDF, inklusive dokumentinformation, XMP-data och strukturella detaljer. +--- + +# Visa metadata + +Undersök de dolda egenskaperna som är inbäddade i en PDF-fil. Verktyget visar dokumentinformation (titel, författare, datum), XMP-metadata, sidmått och andra strukturella data i ett läsbart format. + +## Så fungerar det + +1. Ladda upp en PDF-fil. +2. Verktyget tolkar filen direkt och visar all tillgänglig metadata i ordnade avsnitt. +3. Gå igenom dokumentinformationsordlistan, XMP-metadataträdet och de strukturella egenskaperna. +4. Inget bearbetningssteg behövs, metadata visas så fort filen har lästs in. + +## Funktioner + +- Visar standardfälten för dokumentinformation: Title, Author, Subject, Keywords, Creator, Producer +- Visar skapande- och ändringsdatum i läsbart format +- Tolkar och visar hela XMP-metadataträdet med nästlade namnrymder +- Omvandlar PDF-datumformatet (`D:20240101120000Z`) till läsbara datum +- Ordnat i hopfällbara avsnitt för enkel navigering + +## Metadataavsnitt + +| Avsnitt | Innehåll | +| ----------------------- | -------------------------------------------------------------------------------------- | +| **Dokumentinformation** | Titel, författare, ämne, nyckelord, skapare, producent, skapandedatum, ändringsdatum | +| **XMP-metadata** | Fullständigt XML-baserat metadataträd med Dublin Core-, XAP-, PDF- och egna namnrymder | +| **Dokumentegenskaper** | Antal sidor, PDF-version, filstorlek, krypteringsstatus | + +## Användningsområden + +- Kontrollera vem som skrev en PDF och när den senast ändrades +- Verifiera att metadata har angetts korrekt innan ett dokument publiceras +- Granska PDF:er ur integritetssynpunkt genom att se vilken personlig information som är inbäddad +- Undersöka vilken programvara som skapade eller ändrade en PDF (via fältet Producer) +- Gå igenom XMP-metadata för efterlevnad inom hantering av digitala tillgångar + +## Tips + +- PDF-datumsträngar som börjar med `D:` omvandlas automatiskt till formatet för din lokala tidszon. +- Om metadatafält verkar tomma har PDF:ens skapare helt enkelt inte angett dem. Alla PDF:er innehåller inte rik metadata. +- Om du vill ändra metadata efter granskningen, använd [Redigera metadata](./edit-metadata). Om du vill ta bort den helt, använd Ta bort metadata. + +## Relaterade verktyg + +- [Redigera metadata](./edit-metadata) +- [PDF OCG-lager](./pdf-layers) +- [Jämför PDF:er](./compare-pdfs) diff --git a/docs/sv/tools/vsd-to-pdf.md b/docs/sv/tools/vsd-to-pdf.md new file mode 100644 index 00000000..b284c353 --- /dev/null +++ b/docs/sv/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD till PDF +description: Konvertera Microsoft Visio-diagram (VSD/VSDX) till PDF i webbläsaren. Gratis, privat, ingen Visio behövs. +--- + +# VSD till PDF + +Konvertera Microsoft Visio-diagram till PDF utan att installera Visio. VSD- och VSDX-filer innehåller flödesscheman, organisationsscheman, nätverksdiagram och planritningar som de flesta inte kan öppna. Det här verktyget renderar dem som rena PDF:er som går att visa på vilken enhet som helst. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----------- | :--------- | :------------------------------------------- | +| Visio Binary | `.vsd` | Äldre Visio-format (Visio 2003 och tidigare) | +| Visio XML | `.vsdx` | Modernt Visio-format (Visio 2013+) | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina VSD- eller VSDX-filer. Båda formaten kan blandas i samma batch. +2. Gå igenom fillistan. Ta bort oönskade poster med papperskorgsikonen, eller använd **Lägg till fler filer** för att lägga till fler diagram. +3. Klicka på **Konvertera till PDF**. LibreOffice-baserade motorn läses in i webbläsaren och renderar varje diagram till en PDF, med bevarade former, kopplingar, etiketter och sidlayout. +4. Ett enskilt diagram laddas ner direkt som PDF. Flera filer ger ett ZIP-arkiv med namnet `vsd-to-pdf.zip`. + +## Alternativ + +Ingen konfiguration krävs. Konverteraren respekterar den ursprungliga sidstorleken och orienteringen i Visio-dokumentet. + +## Användningsområden + +- Granska Visio-diagram från en kollega när du saknar Visio-licens +- Ta med nätverks- eller arkitekturdiagram som PDF:er i projektdokumentation +- Skriva ut organisationsscheman eller processflöden som utdelningsmaterial till möten +- Arkivera äldre VSD-filer från äldre Visio-versioner i ett framtidssäkert format + +## Tips + +- Visio-dokument med flera sidor ger PDF:er med flera sidor, där varje Visio-sida motsvarar en PDF-sida. +- VSDX-filer (det moderna XML-baserade formatet) konverteras oftast med högre kvalitet än äldre binära VSD-filer. +- LibreOffice-motorn läses in en gång per session. Räkna med en kort väntan vid första konverteringen, med snabbare resultat för följande filer. + +## Relaterade verktyg + +- [ODG till PDF](./odg-to-pdf) +- [PUB till PDF](./pub-to-pdf) +- [PSD till PDF](./psd-to-pdf) diff --git a/docs/sv/tools/webp-to-pdf.md b/docs/sv/tools/webp-to-pdf.md new file mode 100644 index 00000000..4bdded76 --- /dev/null +++ b/docs/sv/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP till PDF +description: Konvertera WebP-bilder till PDF direkt i webbläsaren med justerbar komprimeringskvalitet. +--- + +# WebP till PDF + +Konvertera Googles bildformat WebP till PDF. Det är särskilt användbart när du har laddat ner bilder från webben i WebP-format och behöver dem i ett mer allmänt accepterat format för utskrift eller delning. + +## Format som stöds + +| Format | Filändelser | +| :----- | :---------- | +| WebP | `.webp` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina WebP-filer. +2. Gå igenom fillistan och ta bort filer du inte behöver. +3. Välj en nivå för **PDF-kvalitet**. +4. Klicka på **Konvertera till PDF**. Resultatet laddas ner som `from_webps.pdf`. + +Internt avkodas varje WebP-bild via webbläsarens canvas-API och bäddas sedan in i PDF:en med pdf-lib. Det betyder att konverteringen fungerar i alla webbläsare som stöder WebP-avkodning (alla moderna webbläsare gör det). + +## Alternativ + +**PDF-kvalitet** styr komprimeringen när bilder bäddas in: + +- **Hög kvalitet**: bevarar mest detaljer. +- **Medelhög kvalitet** (standard): balanserad utdata. +- **Låg kvalitet**: minsta filstorlek. + +## Användningsområden + +- Konvertera WebP-bilder som laddats ner från webben till en utskrivbar PDF +- Samla WebP-skärmdumpar från Chrome eller Edge i dokumentation +- Skapa en PDF-portfölj av bilder exporterade från designverktyg som använder WebP som standard +- Arkivera WebP-bilder i ett mer allmänt läsbart format + +## Tips + +- WebP avkodas internt till PNG innan det bäddas in i PDF:en, så förlustfria WebP-bilder behåller sin kvalitet med inställningen Hög. +- Om du har en blandning av WebP och andra bildformat, använd verktyget [Bilder till PDF](./image-to-pdf) i stället, eftersom det accepterar allt på en gång. + +## Relaterade verktyg + +- [Bilder till PDF](./image-to-pdf) +- [PNG till PDF](./png-to-pdf) +- [JPG till PDF](./jpg-to-pdf) diff --git a/docs/sv/tools/word-to-pdf.md b/docs/sv/tools/word-to-pdf.md new file mode 100644 index 00000000..2f7dd3fa --- /dev/null +++ b/docs/sv/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word till PDF +description: Konvertera Word-dokument (DOC, DOCX), ODT- och RTF-filer till PDF i webbläsaren med full bevarad formatering. +--- + +# Word till PDF + +Konvertera Microsoft Word-dokument och kompatibla format till PDF. Verktyget använder en webbläsarbaserad LibreOffice-motor som hanterar DOC-, DOCX-, ODT- och RTF-filer och bevarar formatering, tabeller, bilder, sidhuvuden, sidfötter och format i utdata. + +## Format som stöds + +| Format | Filändelser | +| :---------------- | :---------- | +| Word (modernt) | `.docx` | +| Word (äldre) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina Word-dokument. Flera filer kan väljas samtidigt. +2. Gå igenom och hantera fillistan. +3. Klicka på **Konvertera till PDF**. LibreOffice-motorn läses in vid första användningen (en förloppsindikator visar initieringsstatus) och sedan konverteras varje fil. +4. En enskild fil laddas ner direkt som PDF. Flera filer paketeras i `word-converted.zip`. + +## Alternativ + +Det här verktyget har inga ytterligare inställningar. LibreOffice-motorn skapar utdata med sin standardprofil för PDF-export. + +## Utdata + +| Antal indatafiler | Utdata | +| :---------------- | :-------------------------------------------------------------- | +| 1 fil | Nedladdning av en enskild PDF (ursprungligt filnamn med `.pdf`) | +| 2+ filer | ZIP-arkiv (`word-converted.zip`) med en PDF per fil | + +## Användningsområden + +- Konvertera ett CV eller personligt brev från DOCX till PDF innan du skickar in en jobbansökan +- Batchkonvertera en uppsättning avtal eller offerter till PDF för leverans till en kund +- Göra om äldre `.doc`-filer till moderna PDF:er för långsiktig arkivering +- Konvertera samarbetsdokument från Google Docs (exporterade som DOCX) till PDF +- Skapa utskriftsklara PDF:er från Word-mallar som används vid automatisk dokumentgenerering + +## Tips + +- LibreOffice-motorn laddas ner en gång per session och cachas. Räkna med några sekunders laddning vid första konverteringen, och betydligt snabbare konverteringar efteråt. +- Komplex formatering (makron, ActiveX-kontroller, avancerad SmartArt) konverteras kanske inte perfekt. Vanliga dokumentelement (text, tabeller, bilder, sidhuvuden, fotnoter) konverteras pålitligt. +- Eftersom verktyget även accepterar ODT och RTF kan du använda det som en samlad konverterare för alla ordbehandlingsformat. + +## Relaterade verktyg + +- [ODT till PDF](./odt-to-pdf) +- [RTF till PDF](./rtf-to-pdf) +- [Excel till PDF](./excel-to-pdf) +- [PowerPoint till PDF](./powerpoint-to-pdf) diff --git a/docs/sv/tools/wpd-to-pdf.md b/docs/sv/tools/wpd-to-pdf.md new file mode 100644 index 00000000..3c5c69e8 --- /dev/null +++ b/docs/sv/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD till PDF +description: Konvertera WordPerfect-dokument (WPD) till PDF i webbläsaren med LibreOffice. Gratis och privat. +--- + +# WPD till PDF + +Konvertera Corel WordPerfect-dokument till PDF-filer. WPD var en gång det dominerande ordbehandlingsformatet på advokatbyråer och myndigheter. Om du har gamla WordPerfect-filer som modern programvara vägrar öppna väcker det här verktyget dem till liv igen som vanliga PDF:er. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :---------- | :--------- | :-------------------------------- | +| WordPerfect | `.wpd` | Alla större WordPerfect-versioner | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina WPD-filer. Flera filer kan väljas samtidigt. +2. Gå igenom fillistan. Ta bort oönskade filer med papperskorgsikonen, eller använd **Lägg till fler filer** för att lägga till fler dokument. +3. Klicka på **Konvertera till PDF**. Verktyget läser in en LibreOffice-baserad konverteringsmotor i webbläsaren, som tolkar WPD-formatet och skapar PDF. +4. En enskild fil laddas ner direkt som PDF. Batchkonverteringar ger ett ZIP-arkiv med namnet `wpd-to-pdf.zip`. + +## Alternativ + +Ingen konfiguration krävs. LibreOffice-motorn hanterar WPD-formatering, typsnitt och layout automatiskt. + +## Användningsområden + +- Öppna årtionden gamla juridiska dokument skrivna i WordPerfect +- Konvertera arkiverade myndighetshandlingar från WPD till ett modernt format +- Migrera ett äldre WordPerfect-dokumentbibliotek till PDF för långtidslagring +- Dela WPD-filer med mottagare som inte har Corel WordPerfect installerat + +## Tips + +- LibreOffice-motorn läses in vid första användningen, vilket tar en stund. Följande konverteringar under samma session går snabbare. +- Komplexa WPD-makron och reveal codes bevaras inte, men den visuella layouten, textinnehållet och grundläggande formatering följer med till PDF. + +## Relaterade verktyg + +- [WPS till PDF](./wps-to-pdf) +- [ODG till PDF](./odg-to-pdf) diff --git a/docs/sv/tools/wps-to-pdf.md b/docs/sv/tools/wps-to-pdf.md new file mode 100644 index 00000000..c518b15a --- /dev/null +++ b/docs/sv/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS till PDF +description: Konvertera Microsoft Works-dokument (WPS) till PDF i webbläsaren. Gratis, utan registrering och helt privat. +--- + +# WPS till PDF + +Konvertera ordbehandlingsfiler från Microsoft Works till PDF. Microsoft Works följde med konsument-PC under hela slutet av 1990-talet och 2000-talet, och gott om WPS-filer finns kvar på gamla hårddiskar och i e-postarkiv. Det här verktyget öppnar dem i webbläsaren och skapar rena PDF:er. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :-------------- | :--------- | :--------------------------------------- | +| Microsoft Works | `.wps` | Ordbehandlingsfiler från Microsoft Works | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina WPS-filer. Flera filer accepteras. +2. Gå igenom fillistan. Använd papperskorgsikonen för att ta bort enskilda filer, eller klicka på **Lägg till fler filer** för att utöka din batch. +3. Klicka på **Konvertera till PDF**. En LibreOffice-baserad motor läses in i webbläsaren och konverterar varje WPS-dokument till PDF. +4. En fil laddas ner direkt som PDF. Flera filer paketeras i ett ZIP-arkiv med namnet `wps-to-pdf.zip`. + +## Alternativ + +Inga ytterligare inställningar behövs. Konverteraren hanterar text, grundläggande formatering och inbäddade bilder från WPS-filen. + +## Användningsområden + +- Återskapa gamla skol- eller arbetsdokument som sparats i Microsoft Works-format +- Öppna WPS-bilagor i e-post när du inte har Microsoft Works installerat +- Konvertera ett arkiv med WPS-filer för migrering till ett modernt dokumentsystem +- Skriva ut äldre dokument som dagens ordbehandlare inte kan öppna + +## Tips + +- Blanda inte ihop Microsoft Works `.wps`-filer med WPS Office-filer. Det här verktyget är specifikt för det äldre Microsoft Works-formatet. +- LibreOffice-motorn tar en stund att läsa in vid första användningen. När den väl är inläst går ytterligare konverteringar under samma session snabbare. + +## Relaterade verktyg + +- [WPD till PDF](./wpd-to-pdf) +- [PUB till PDF](./pub-to-pdf) diff --git a/docs/sv/tools/xml-to-pdf.md b/docs/sv/tools/xml-to-pdf.md new file mode 100644 index 00000000..78c1f1f1 --- /dev/null +++ b/docs/sv/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML till PDF +description: Konvertera XML-filer till strukturerade PDF-dokument i webbläsaren. Gratis, privat, ingen serverbearbetning. +--- + +# XML till PDF + +Konvertera XML-datafiler till läsbara, strukturerade PDF-dokument. Rå XML är kraftfull men svårläst för människor. Det här verktyget tolkar XML-trädet, identifierar återkommande datastrukturer och renderar dem som formaterade tabeller och avsnitt i en PDF i A4 liggande format. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----- | :--------- | :--------------------------- | +| XML | `.xml` | Alla välformade XML-dokument | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina XML-filer. Flera filer kan behandlas i samma batch. +2. Gå igenom fillistan. Ta bort oönskade filer med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att ta med fler. +3. Klicka på **Konvertera till PDF**. Verktyget tolkar XML-strukturen med webbläsarens inbyggda DOMParser, analyserar datahierarkin och renderar den till en PDF med jsPDF och auto-table-formatering. +4. En enskild fil laddas ner som PDF. Flera konverteringar paketeras i `xml-to-pdf.zip`. + +## Alternativ + +Ingen manuell konfiguration krävs. Konverteraren identifierar automatiskt XML-strukturen och väljer lämpliga tabellayouter. Utdata använder A4 i liggande orientering för att rymma bred data. + +## Användningsområden + +- Göra om XML-dataexporter från databaser eller API:er till utskrivbara rapporter +- Skapa läsbara sammanfattningar av XML-konfigurationsfiler +- Konvertera XML-baserade fakturor eller transaktionsloggar till PDF:er för arkivering +- Göra XML-webbplatskartor eller RSS-flöden läsbara i dokumentform + +## Tips + +- XML måste vara välformad. Om tolken stöter på syntaxfel misslyckas konverteringen med ett beskrivande felmeddelande som pekar ut problemet. +- Djupt nästlade XML-strukturer plattas ut till tabeller. För bästa resultat bör datan ha återkommande syskonelement med konsekventa underelement. +- Förloppsuppdateringar visas under konverteringen och visar varje fas: läsning, tolkning, analys och rendering. + +## Relaterade verktyg + +- [FB2 till PDF](./fb2-to-pdf) +- [XPS till PDF](./xps-to-pdf) +- [E-post till PDF](./email-to-pdf) diff --git a/docs/sv/tools/xps-to-pdf.md b/docs/sv/tools/xps-to-pdf.md new file mode 100644 index 00000000..30b4935f --- /dev/null +++ b/docs/sv/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS till PDF +description: Konvertera XPS- och OXPS-dokument till PDF-format i webbläsaren. Ingen uppladdning, ingen registrering, helt privat. +--- + +# XPS till PDF + +Konvertera Microsoft XPS- och OXPS-dokument till vanliga PDF-filer. XPS (XML Paper Specification) var Microsofts svar på PDF, men stödet för det har minskat på de flesta plattformar. Det här verktyget gör dokumenten läsbara för alla igen. + +## Format som stöds + +| Format | Filändelse | Anmärkningar | +| :----- | :--------- | :--------------------------------------------- | +| XPS | `.xps` | Ursprungligt Microsoft XPS-format | +| OXPS | `.oxps` | Open XPS, varianten enligt standarden ECMA-388 | + +## Så fungerar det + +1. Klicka på uppladdningsytan eller dra och släpp dina XPS-/OXPS-filer. Du kan välja flera filer samtidigt. +2. Gå igenom fillistan. Ta bort enskilda filer med papperskorgsikonen, eller klicka på **Lägg till fler filer** för att lägga till fler dokument. +3. Klicka på **Konvertera till PDF**. PyMuPDF-motorn bearbetar varje dokument lokalt i webbläsaren. +4. En enskild fil laddas ner direkt som PDF. Flera filer paketeras i ett ZIP-arkiv med namnet `xps-converted.zip`. + +## Alternativ + +Det här verktyget gör en direkt formatkonvertering utan ytterligare konfiguration. Utdata bevarar de ursprungliga sidmåtten, vektorgrafiken, typsnitten och bilderna från XPS-källan. + +## Användningsområden + +- Öppna XPS-filer från äldre Windows-system som använde XPS-skrivardrivrutinen som standard +- Konvertera OXPS-dokument från Windows 10/11 för att dela med macOS- eller Linux-användare +- Arkivera äldre XPS-filer i ett format som stöds bredare +- Göra XPS-baserade myndighets- eller företagsdokument tillgängliga för externa mottagare + +## Tips + +- Både `.xps` och `.oxps` hanteras automatiskt, så du kan blanda dem i samma batch. +- Om den ursprungliga XPS-filen skapades med en skrivardrivrutin för hög upplösning behåller den resulterande PDF:en den kvaliteten. Ingen omsampling sker. + +## Relaterade verktyg + +- [Word till PDF](./word-to-pdf) +- [XML till PDF](./xml-to-pdf) diff --git a/docs/tools/protect-pdf.md b/docs/tools/protect-pdf.md index 62e781ac..08acdf10 100644 --- a/docs/tools/protect-pdf.md +++ b/docs/tools/protect-pdf.md @@ -1,9 +1,9 @@ --- -title: Encrypt PDF +title: Protect PDF description: Password-protect PDF files with 256-bit AES encryption. Set user and owner passwords with configurable usage restrictions. --- -# Encrypt PDF +# Protect PDF Lock your PDF behind a password so only authorized people can open it. BentoPDF uses 256-bit AES encryption -- the same standard used by banks and government agencies -- applied entirely in your browser via QPDF. diff --git a/docs/tools/unlock-pdf.md b/docs/tools/unlock-pdf.md index e329b8a1..41d8dbcb 100644 --- a/docs/tools/unlock-pdf.md +++ b/docs/tools/unlock-pdf.md @@ -1,9 +1,9 @@ --- -title: Decrypt PDF +title: Unlock PDF description: Remove password protection from encrypted PDFs. Supports batch decryption with a single password for multiple files. --- -# Decrypt PDF +# Unlock PDF If you have the password to an encrypted PDF, this tool removes the encryption entirely, producing an unlocked copy that anyone can open without credentials. It supports batch decryption when multiple PDFs share the same password. diff --git a/docs/tools/validate-signature-pdf.md b/docs/tools/validate-signature-pdf.md index 9610acc1..77d7606a 100644 --- a/docs/tools/validate-signature-pdf.md +++ b/docs/tools/validate-signature-pdf.md @@ -30,7 +30,7 @@ The tool extracts PKCS#7 signature objects from the PDF, decodes the ASN.1 struc - The tool reconstructs the bytes covered by the signature's `/ByteRange`, hashes them with the algorithm the signer declared, and compares the result against the `messageDigest` attribute inside the signature. - It then re-serializes the signed attributes as a DER SET and verifies the signature against the signer certificate's public key. -- **A signature is reported as valid only when all of these pass.** If the PDF bytes were modified after signing, or the embedded signature does not match the signer's key, the status shows "Invalid — Cryptographic Verification Failed" with the specific reason. +- **A signature is reported as valid only when all of these pass.** If the PDF bytes were modified after signing, or the embedded signature does not match the signer's key, the status shows "Invalid: Cryptographic Verification Failed" with the specific reason. #### Supported Signature Algorithms @@ -40,7 +40,7 @@ The tool extracts PKCS#7 signature objects from the PDF, decodes the ASN.1 struc | RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | | ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` after DER → IEEE P1363 signature conversion | -If a signature uses an algorithm outside this list (for example Ed25519, SM2, or RSA with an unusual digest OID), the card shows **"Unverified — Unsupported Signature Algorithm"** in yellow, along with the specific OID or reason. This is a deliberate three-state distinction: +If a signature uses an algorithm outside this list (for example Ed25519, SM2, or RSA with an unusual digest OID), the card shows **"Unverified: Unsupported Signature Algorithm"** in yellow, along with the specific OID or reason. This is a deliberate three-state distinction: - **Valid** — signature cryptographically verified against the signer's public key. - **Invalid** — verification ran and produced a negative result (bytes changed, key mismatch). diff --git a/docs/tr/contributing.md b/docs/tr/contributing.md new file mode 100644 index 00000000..73efe00c --- /dev/null +++ b/docs/tr/contributing.md @@ -0,0 +1,136 @@ +# Katkıda Bulunma + +BentoPDF'e katkıda bulunmak istediğiniz için teşekkürler! Bu rehber başlamanıza yardımcı olacak. + +## Başlarken + +### Gereksinimler + +- Node.js 18+ +- npm 9+ +- Git + +### Kurulum + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Proje Yapısı + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Yeni Araç Ekleme + +### Adım 1: Mantık Dosyasını Oluşturun + +`src/js/logic/your-tool-page.ts` dosyasını oluşturun: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Adım 2: HTML Sayfasını Oluşturun + +Mevcut araç şablonlarını izleyerek `src/pages/your-tool.html` dosyasını oluşturun. + +### Adım 3: Aracı Kaydedin + +`src/js/config/tools.ts` dosyasına ekleyin: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Adım 4: Derleme Yapılandırmasına Ekleyin + +Sayfayı `vite.config.ts` dosyasına ekleyin: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Adım 5: Çevirileri Ekleyin + +`public/locales/` içindeki tüm dil dosyalarına girdileri ekleyin: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Kod Stili + +- Tüm yeni kodlar için TypeScript kullanın +- Tutarlılık için mevcut kalıpları izleyin +- Commit yapmadan önce `npm run format` çalıştırın +- Üretim kodunda yorum satırı kullanmayın (yorumlar derleme sırasında kaldırılır) + +## Pull Request Süreci + +1. Bir özellik dalı oluşturun: `git checkout -b feature/your-feature` +2. Değişikliklerinizi yapın +3. Kapsamlı şekilde test edin: `npm run build` +4. Açık bir açıklamayla PR gönderin + +## Çeviri + +Yeni dil eklemek için [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) dosyasına bakın. + +## Katkıda Bulunan Lisans Sözleşmesi + +PR'ınızın birleştirilebilmesi için CLA'mızı imzalamanız gerekir: + +- [Bireysel CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Kurumsal CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Yardım Alma + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord Topluluğu](https://discord.gg/Bgq3Ay3f2w) + +## Lisans + +BentoPDF çift lisanslıdır: + +- Kaynak kodunuzun tamamını herkese açık paylaştığınız açık kaynaklı projeler için **AGPL-3.0** +- Özel/kapalı kaynaklı uygulamalar için **Ticari Lisans** - [79$'a Ömür Boyu Lisans Alın](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Katkıda bulunarak, katkılarınızın bu koşullar altında lisanslanacağını kabul etmiş olursunuz. diff --git a/docs/tr/getting-started.md b/docs/tr/getting-started.md new file mode 100644 index 00000000..b44c958d --- /dev/null +++ b/docs/tr/getting-started.md @@ -0,0 +1,80 @@ +# Başlarken + +BentoPDF'e hoş geldiniz! Bu rehber hızlıca çalışır hale gelmenize yardımcı olacak. + +## BentoPDF Nedir? + +BentoPDF, **tamamen tarayıcınızda** çalışan ücretsiz, açık kaynaklı, gizlilik odaklı bir PDF araç setidir. Dosyalarınız cihazınızdan asla çıkmaz. Tüm işlemler WebAssembly (WASM) teknolojisiyle yerel olarak yapılır. + +## Hızlı Başlangıç + +### Seçenek 1: Barındırılan Sürümü Kullanın + +BentoPDF'i anında kullanmak için [bentopdf.com](https://www.bentopdf.com) adresini ziyaret edin, kurulum gerekmez. + +### Seçenek 2: Docker ile Kendi Sunucunuzda Barındırın + +> [!IMPORTANT] +> Office dosya dönüştürme için `SharedArrayBuffer` gerekir ve bunun için şunların ikisi de gereklidir: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - güvenli bir bağlam +> +> `http://localhost` yerel testler için çalışır, çünkü tarayıcılar geri döngü adresine güvenir. `http://192.168.x.x` gibi yerel ağ IP'lerine genellikle güvenmez, bu yüzden ağınızdaki diğer cihazlardan erişirken Word/Excel/PowerPoint dönüştürmeleri HTTPS gerektirir. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF iki sürüm olarak sunulur: dahili/ekip/kurum dağıtımları için **Kendi Sunucunda Barındırma sürümü** (`bentopdf-simple`, yukarıda kullanılan) ve bentopdf.com'un kendisi ile herkese açık dağıtım yapan ticari lisans sahipleri tarafından kullanılan **Ticari sürüm** (`bentopdf:latest`). İkisi de aynı PDF araçlarını sunar. Ticari sürüm bentopdf.com ana sayfa bölümünü, SSS'yi, kullanıcı yorumlarını ve alt bilgiyi ekler. Emin değilseniz Kendi Sunucunda Barındırma sürümünü kullanın. + +Ardından tarayıcınızda `http://localhost:3000` adresini açın. + +> [!NOTE] +> İnternetten yalıtılmış (air-gapped) bir OCR dağıtımı hazırlıyorsanız, Tesseract worker, çekirdek çalışma zamanı ve traineddata dosyalarına ek olarak OCR metin katmanı yazı tiplerini de kendi ağınızda barındırmanız gerekir. Tam kurulum, `VITE_OCR_FONT_BASE_URL` ve paketle gelen `ocr-fonts/` dizini dahil, [Kendi Sunucunda Barındırma](/tr/self-hosting/) sayfasında anlatılmıştır. + +### Seçenek 3: Kaynaktan Derleyin + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Özelliklere Genel Bakış + +| Kategori | Araçlar | +| ----------------------- | ------------------------------------------------------------------------ | +| **PDF'e Dönüştür** | Word, Excel, PowerPoint, Görseller, Markdown, EPUB, MOBI ve daha fazlası | +| **PDF'den Dönüştür** | JPG, PNG, Metin, Excel, SVG ve daha fazlası | +| **Düzenle ve Not Ekle** | İmzala, Vurgula, Karart, Form Doldur, Damga Ekle | +| **Düzenle (Sayfalar)** | Birleştir, Böl, Döndür, Sayfa Sil, Yeniden Sırala | +| **Optimize Et** | Sıkıştır, Onar, Düzleştir, OCR | +| **Güvenlik** | Şifrele, Şifreyi Kaldır, Kısıtlamaları Kaldır | + +## Tarayıcı Desteği + +BentoPDF modern tarayıcılarda en iyi şekilde çalışır: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Sonraki Adımlar + +- [Tüm araçları keşfedin](/tr/tools/) +- [BentoPDF'i kendi sunucunuzda barındırın](/tr/self-hosting/) +- [Projeye katkıda bulunun](/tr/contributing) diff --git a/docs/tr/index.md b/docs/tr/index.md new file mode 100644 index 00000000..f7a4ca5c --- /dev/null +++ b/docs/tr/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Ücretsiz, Açık Kaynaklı PDF Araçları' + tagline: PDF'leri tamamen tarayıcınızda işleyin. Yükleme yok. Sunucu yok. Tam gizlilik. + actions: + - theme: brand + text: Başlayın + link: /tr/getting-started + - theme: alt + text: Araçları Görüntüle + link: /tr/tools/ + - theme: alt + text: Kendi Sunucunda Barındır + link: /tr/self-hosting/ + - theme: alt + text: Ticari Lisans + link: /tr/licensing + +features: + - icon: 🔒 + title: '%100 Gizli' + details: Dosyalarınız cihazınızdan asla çıkmaz. Tüm işlemler WebAssembly kullanılarak tarayıcınızda yerel olarak yapılır. + - icon: ⚡ + title: Hızlı ve Ücretsiz + details: Kayıt yok, sınır yok, filigran yok. Sınırsız PDF'i sonsuza dek ücretsiz işleyin. + - icon: 🛠️ + title: 50+ Araç + details: Dönüştürün, düzenleyin, birleştirin, bölün, sıkıştırın, imzalayın, OCR uygulayın ve daha fazlası. İhtiyacınız olan her şey tek yerde. + + - icon: 🌐 + title: Kendi Sunucunuzda Barındırılabilir + details: Kendi altyapınıza dağıtın. Docker, Vercel, Netlify, AWS veya kendi OCR worker'ları, dil verileri ve metin katmanı yazı tipleriyle tamamen internetten yalıtılmış ortamlar. +--- + +## Çevrimdışı OCR + +BentoPDF'i internetten yalıtılmış veya çevrimdışı bir ortamda kendi sunucunuzda barındırıyorsanız, OCR için Tesseract worker ve traineddata dosyalarından fazlası gerekir. Aranabilir PDF çıktısı için OCR metin katmanı yazı tiplerinin de kendi ağınızdan sunulması gerekir. +`VITE_OCR_FONT_BASE_URL`, paketle gelen `ocr-fonts/` dizini ve güncellenmiş air-gap iş akışı dahil tam kurulum için [Kendi Sunucunda Barındırma](/tr/self-hosting/) sayfasına bakın. diff --git a/docs/tr/licensing.md b/docs/tr/licensing.md new file mode 100644 index 00000000..0aa6a976 --- /dev/null +++ b/docs/tr/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/tr/self-hosting/#wasm-yapılandırması-agpl-bilesenleri) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/tr/self-hosting/apache.md b/docs/tr/self-hosting/apache.md new file mode 100644 index 00000000..70caf05d --- /dev/null +++ b/docs/tr/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Apache ile Dağıtım + +BentoPDF'i Apache HTTP Server ile barındırın. + +## Gereksinimler + +- Apache 2.4+ +- mod_rewrite etkin +- SSL sertifikası (önerilir) + +## Adım 1: Projeyi Derleyin + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Markayı özelleştirmek için derlemeden önce ortam değişkenlerini ayarlayın: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Adım 2: Dosyaları Kopyalayın + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Adım 3: Apache Yapılandırması + +`/etc/apache2/sites-available/bentopdf.conf` dosyasını oluşturun: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Adım 4: Yönlendirme için .htaccess + +`/var/www/bentopdf/.htaccess` dosyasını oluşturun: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Adım 5: Gerekli Modülleri Etkinleştirin + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Adım 6: Siteyi Etkinleştirin + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Alt Dizinde Dağıtım + +`/pdf/` altında barındırmak için: + +1. Temel URL ile derleyin: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. `.htaccess` dosyasını güncelleyin: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Sorun Giderme + +### WASM 404 Hataları + +MIME türünün yapılandırıldığından emin olun: + +```apache +AddType application/wasm .wasm +``` + +### PDF İmzala veya Form Doldurucu Boş Görüntüleyici Gösteriyor (`.mjs` MIME hatası) + +Tarayıcı konsolunda şu görünüyorsa: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...ve başarısız olan istek `.mjs` ile bitiyorsa, Apache yapılandırmanızda `.mjs → application/javascript` eşlemesi eksik demektir. Paketle gelen PDF görüntüleyici ES modül dosyalarını `.mjs` uzantısıyla sunar ve Apache'nin varsayılan `mime.types` dosyası bunları içermez. + +VirtualHost veya `.htaccess` dosyanıza ekleyin: + +```apache +AddType application/javascript .mjs +``` + +Ardından Apache'yi yeniden yükleyin: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Doğrulamak için: tarayıcı DevTools → Network sekmesinde başarısız olan `.mjs` isteğini bulun ve `Content-Type` yanıt başlığına bakın. Artık `application/octet-stream` değil, `application/javascript` olmalıdır. + +### Rewrite Çalışmıyor + +mod_rewrite'ın etkin olduğunu kontrol edin: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel'den PDF'e Dönüştürme Çalışmıyor + +LibreOffice WASM, `SharedArrayBuffer` gerektirir ve bunun için şu başlıklar gerekir: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Ayrıca güvenli bir bağlam da gerekir. `http://localhost` yerel testler için çalışır, ancak `http://192.168.x.x` gibi yerel ağ IP'leri genellikle HTTPS gerektirir. Başlıklar mevcut olduğu halde `window.crossOriginIsolated` hâlâ `false` ise, sayfanın geri döngü olmayan bir kaynakta düz HTTP üzerinden açılıp açılmadığını kontrol edin. + +Önceden sıkıştırılmış `.wasm.gz` ve `.data.gz` dosyaları da doğru `Content-Encoding` gerektirir: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +`mod_headers`'ın etkin olduğundan emin olun: `sudo a2enmod headers` + +### İzin Reddedildi + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/tr/self-hosting/aws.md b/docs/tr/self-hosting/aws.md new file mode 100644 index 00000000..4cd7ea46 --- /dev/null +++ b/docs/tr/self-hosting/aws.md @@ -0,0 +1,200 @@ +# AWS S3 + CloudFront'a Dağıtım + +Azami kontrol ve ölçeklenebilirlik için BentoPDF'i AWS üzerinde barındırın. + +## Mimari + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Adım 1: S3 Bucket Oluşturun + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Adım 2: Derleyin ve Yükleyin + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Adım 3: CloudFront Dağıtımı Oluşturun + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Veya AWS Console'u kullanın: + +1. CloudFront → Create distribution bölümüne gidin +2. Origin domain: S3 bucket'ınızı seçin +3. "Origin Access Control" seçeneğini etkinleştirin +4. Default root object: `index.html` +5. Dağıtımı oluşturun + +## Adım 3b: Response Headers Policy (LibreOffice WASM için Gerekli) + +LibreOffice tabanlı dönüştürmeler (Word, Excel, PowerPoint'ten PDF'e) `SharedArrayBuffer` gerektirir ve bunun için belirli yanıt başlıkları gerekir. Bir CloudFront Response Headers Policy oluşturun: + +1. CloudFront → Policies → Response headers bölümüne gidin +2. Şu başlıklarla özel bir politika oluşturun: + +| Başlık | Değer | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Politikayı dağıtımınızın varsayılan önbellek davranışına bağlayın + +Veya CLI ile: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Adım 3c: Önceden Sıkıştırılmış WASM Dosyaları için S3 Metadata + +LibreOffice WASM dosyaları önceden sıkıştırılmıştır (`.wasm.gz`, `.data.gz`). Tarayıcıların bunları açabilmesi için doğru Content-Type ve Content-Encoding değerlerini ayarlayın: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Önemli +Response headers policy olmadan `SharedArrayBuffer` kullanılamaz ve LibreOffice WASM dönüştürmeleri yaklaşık %55'te takılır. `.gz` dosyalarında doğru Content-Encoding yoksa tarayıcı ham gzip baytlarını alır ve WASM derlemesi başarısız olur. +::: + +## Adım 4: S3 Bucket Policy + +CloudFront'un bucket'a erişmesine izin verin: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Adım 5: Özel Hata Sayfaları + +SPA yönlendirmesi için 404'ün `index.html` döndürmesini yapılandırın: + +1. CloudFront → Error pages +2. Özel hata yanıtı oluşturun: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Maliyet Tahmini + +| Kaynak | Tahmini Maliyet | +| ------------------------- | --------------- | +| S3 Depolama (~500MB) | ~$0.01/ay | +| CloudFront (1TB aktarım) | ~$85/ay | +| CloudFront (10GB aktarım) | ~$0.85/ay | + +::: tip +Seyrek erişilen dosyalarda maliyet optimizasyonu için S3 Intelligent Tiering kullanın. +::: + +## Terraform ile Otomasyon + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/tr/self-hosting/cloudflare.md b/docs/tr/self-hosting/cloudflare.md new file mode 100644 index 00000000..407a4026 --- /dev/null +++ b/docs/tr/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Cloudflare Pages'e Dağıtım + +[Cloudflare Pages](https://pages.cloudflare.com), sınırsız bant genişliğiyle hızlı, küresel statik site barındırma sunar. + +## Hızlı Dağıtım + +1. [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) sayfasına gidin +2. "Create a project" düğmesine tıklayın +3. GitHub deponuzu bağlayın + +## Derleme Yapılandırması + +| Ayar | Değer | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Ortam Değişkenleri + +Bunları Settings → Environment variables bölümüne ekleyin: + +| Değişken | Değer | +| ----------------------- | ------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (isteğe bağlı) | +| `VITE_BRAND_NAME` | Özel marka adı (isteğe bağlı) | +| `VITE_BRAND_LOGO` | `public/` klasörüne göre logo yolu (isteğe bağlı) | +| `VITE_FOOTER_TEXT` | Özel alt bilgi/telif hakkı metni (isteğe bağlı) | +| `VITE_DEFAULT_LANGUAGE` | Varsayılan arayüz dili, örn. `fr` (isteğe bağlı) | + +## Yapılandırma Dosyası + +`public` klasörünüzde `_headers` dosyasını oluşturun: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Önemli +`Cross-Origin-Embedder-Policy` ve `Cross-Origin-Opener-Policy` başlıkları Word/ODT/Excel/PowerPoint'ten PDF'e dönüştürmeler için gereklidir. Bunlar olmadan `SharedArrayBuffer` kullanılamaz ve LibreOffice WASM motoru başlatılamaz. +::: + +SPA yönlendirmesi için `_redirects` dosyasını oluşturun: + +``` +/* /index.html 200 +``` + +## Özel Alan Adı + +1. Pages projenize gidin +2. "Custom domains" düğmesine tıklayın +3. Alan adınızı ekleyin +4. Alan adı Cloudflare'deyse Cloudflare DNS'i otomatik yapılandırır + +## Avantajlar + +- **Ücretsiz sınırsız bant genişliği** +- 300'den fazla uç noktası olan **küresel CDN** +- **Otomatik HTTPS** +- Pull request'ler için **önizleme dağıtımları** +- **Hızlı derlemeler** + +## Sorun Giderme + +### Büyük Dosya Yüklemeleri + +Cloudflare Pages 25 MB'a kadar dosyaları destekler. WASM modüllerinde sorun olmaması gerekir, ancak sınırlara takılırsanız şunu düşünün: + +```bash +# Split large files during build +npm run build +``` + +### Worker Boyut Sınırları + +Gelişmiş yönlendirme için Cloudflare Workers kullanıyorsanız, ücretsiz planlardaki 1 MB sınırını göz önünde bulundurun. + +## CORS Proxy Worker (Dijital İmzalar için) + +Dijital İmza aracı, sertifika zincirlerini almak için bir CORS proxy gerektirir. Pakete dahil worker'ı dağıtın: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Güvenlik Özellikleri + +| Özellik | Açıklama | +| ----------------------- | ------------------------------------------ | +| **URL Kısıtlamaları** | Yalnızca sertifika URL'lerine izin verilir | +| **Dosya Boyutu Sınırı** | İstek başına en fazla 10MB | +| **Hız Sınırlama** | 60 istek/IP/dk (KV gerekir) | +| **Özel IP Engelleme** | localhost ve dahili IP'leri engeller | + +### Hız Sınırlamayı Etkinleştirme + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Proxy URL ile Derleme + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Veya Docker ile: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Not:** HMAC imza kurulumu için [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) dosyasına bakın. diff --git a/docs/tr/self-hosting/cors-proxy.md b/docs/tr/self-hosting/cors-proxy.md new file mode 100644 index 00000000..b25b5d19 --- /dev/null +++ b/docs/tr/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# Sertifika Alımı için CORS Proxy + +Dijital imza aracı, harici Sertifika Otoritelerinden (CA) düzenleyici sertifikaları almak için bir CORS proxy kullanır. Bu gereklidir, çünkü birçok CA sunucusu yanıtlarında CORS başlıkları içermez ve bu da tarayıcıdan doğrudan almayı engeller. + +Ayrıca birçok CA sunucusu sertifikaları düz HTTP üzerinden sunar. BentoPDF örneğiniz HTTPS üzerinden barındırıldığında tarayıcılar bu HTTP isteklerini engeller (karma içerik politikası). CORS proxy, istekleri uygun başlıklara sahip bir HTTPS uç noktası üzerinden yönlendirerek her iki sorunu da çözer. + +## Nasıl Çalışır + +Bir PDF'i sertifikayla imzalarken: + +1. `zgapdfsigner` kütüphanesi eksiksiz bir sertifika zinciri oluşturmaya çalışır +2. Düzenleyici sertifikaları, sertifikanızın AIA (Authority Information Access) uzantısına gömülü URL'lerden alır +3. Bu istekler, gerekli `Access-Control-Allow-Origin` başlıklarını ekleyen bir CORS proxy üzerinden yönlendirilir +4. Proxy, sertifika verilerini tarayıcıya döndürür + +## CORS Proxy'yi Kendi Sunucunuzda Barındırma + +BentoPDF'i kendi sunucunuzda barındırıyorsanız, zincir alımı gerektiren sertifikalarla dijital imzaların çalışması için kendi CORS proxy'nizi dağıtmanız gerekir. + +### Seçenek 1: Cloudflare Workers (Önerilir) + +1. **Wrangler CLI'ı kurun**: + + ```bash + npm install -g wrangler + ``` + +2. **Cloudflare'e giriş yapın**: + + ```bash + wrangler login + ``` + +3. **BentoPDF'i klonlayın ve izin verilen kaynakları güncelleyin**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + `cors-proxy-worker.js` dosyasını açın ve `ALLOWED_ORIGINS` dizisini kendi alan adınıza göre değiştirin: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Önemli + Bu değişiklik olmadan proxy, sitenizden gelen tüm istekleri **403 Forbidden** hatasıyla reddeder. Varsayılan yalnızca `bentopdf.com` kaynağından gelen isteklere izin verir. + ::: + +4. **Proxy'yi dağıtın**: + + ```bash + wrangler deploy + ``` + + Worker URL'nizi not edin (örn. `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **BentoPDF'i proxy URL ile yeniden derleyin**: + + Docker kullanıyorsanız: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Kaynaktan derliyorsanız: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Seçenek 2: Özel Arka Uç Proxy + +Kendi proxy uç noktanızı da oluşturabilirsiniz. Gereksinimler: + +1. `url` sorgu parametresiyle GET isteklerini kabul edin +2. URL'yi sunucunuzdan alın (sunucu tarafında CORS kısıtlaması yoktur) +3. Yanıtı şu başlıklarla döndürün: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Örnek Express.js uygulaması: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Güvenlik Hususları + +Pakete dahil Cloudflare Worker'ın çeşitli güvenlik önlemleri vardır: + +| Özellik | Açıklama | +| -------------------------- | ----------------------------------------------------------------------------------------------------- | +| **Kaynak Doğrulama** | Yalnızca `ALLOWED_ORIGINS` içinde listelenen alan adlarından gelen isteklere izin verir | +| **URL Kısıtlamaları** | Yalnızca sertifika URL'lerine izin verir (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Özel IP Engelleme** | IPv4/IPv6 özel aralıklarını, link-local, loopback, ondalık IP'leri ve bulut metadata'sını engeller | +| **Content-Type Güvenliği** | Yalnızca güvenli sertifika MIME türlerini döndürür, üst kaynaktan content-type enjeksiyonunu engeller | +| **Dosya Boyutu Sınırı** | Yanıtı 10MB sınırıyla akıtır, aşılırsa indirmeyi yarıda keser | +| **Hız Sınırlama** | IP veya IPv6 /64 başına dakikada 60 istek (KV gerekir, KV hatalarında açık kalır) | +| **HMAC İmzaları** | İsteğe bağlı istemci tarafı imzalama (sıradan kötüye kullanımı caydırır) | + +### DNS rebinding (Cloudflare dışında kendi sunucunuzda barındırma) + +Worker, özel veya dahili bir IP'ye çözümlenen her URL'yi reddeder. Sabit bir ana bilgisayar izin listesi kullanamaz, çünkü sertifika zinciri URL'leri sertifikayı hangi CA verdiyse ona işaret eder (FNMT, kurumsal CA'lar vb.), dolayısıyla hedefler önceden bilinmez. Bu da küçük bir rebinding penceresi bırakır: kendi alan adının DNS'ini yöneten biri, güvenlik kontrolüne genel bir IP, bir an sonra gerçek isteğe ise özel bir IP verebilir. + +Cloudflare üzerinde bu istismar edilemez: Workers özel IP'lere veya `169.254.169.254` metadata uç noktasına erişemez, dolayısıyla bir rebind hiçbir yere ulaşmaz. Yeter ki worker'a bir giriş yolu vermeyin: Tunnel, Service veya özel ağ binding'i eklemeyin (yalnızca `RATE_LIMIT_KV` gerekir). + +Bunu Cloudflare dışında (workerd, Node vb.) bir VPC içinde çalıştırırsanız, çalışma zamanı dahili IP'lere _erişebilir_. Önüne bir çıkış güvenlik duvarı koyun ve özel aralıkları engelleyin: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` ve bunların IPv6 karşılıkları. Cloudflare dışına çıktığınızda uygulama kodu bunu zorunlu kılamaz. + +## Proxy'yi Devre Dışı Bırakma + +CORS proxy kullanmak istemiyorsanız, ortam değişkenini boş bir dizeye ayarlayın: + +``` +VITE_CORS_PROXY_URL= +``` + +**Not**: Proxy olmadan, harici zincir alımı gerektiren sertifikalarla (FNMT veya bazı kurumsal CA'lar gibi) imzalama "Failed to fetch" hatasıyla başarısız olur. + +## Sorun Giderme + +### "Signing error: TypeError: Failed to fetch" + +Bu genellikle şunlardan birini ifade eder: + +1. **CORS proxy yapılandırılmamış**: `VITE_CORS_PROXY_URL` değerini ayarlayın ve yeniden derleyin +2. **Karma içerik engellendi**: Siteniz HTTPS, ancak sertifikanın düzenleyici URL'si HTTP. CORS proxy bunu çözer. +3. **CORS proxy kaynağınızı reddediyor**: Alan adınızın `cors-proxy-worker.js` içindeki `ALLOWED_ORIGINS` dizisinde olduğunu kontrol edin + +### Proxy'den "403 Forbidden" + +Alan adınız `ALLOWED_ORIGINS` listesinde değil. `cors-proxy-worker.js` dosyasını düzenleyin: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Ardından yeniden dağıtın: `npx wrangler deploy` + +### Proxy'yi test etme + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Proxy Olmadan Çalışan Sertifikalar + +Bazı sertifikalar tam zinciri P12/PFX dosyasında içerir ve harici alım gerektirmez: + +- Kendinden imzalı sertifikalar +- Ara sertifikaları paketleyen bazı ticari CA'lar +- Tam zincirle elle oluşturduğunuz sertifikalar diff --git a/docs/tr/self-hosting/docker.md b/docs/tr/self-hosting/docker.md new file mode 100644 index 00000000..d57e3824 --- /dev/null +++ b/docs/tr/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Docker / Podman ile Dağıtım + +BentoPDF'i üretim ortamında kendi sunucunuzda barındırmanın en kolay yolu. + +> [!IMPORTANT] +> **Office Dosya Dönüştürme için Gerekli Başlıklar** +> +> LibreOffice tabanlı araçlar (Word, Excel, PowerPoint dönüştürme), `SharedArrayBuffer` desteği için şu HTTP başlıklarını gerektirir: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Sayfa ayrıca güvenli bir bağlamdan sunulmalıdır. `http://localhost` yerel testler için çalışır, ancak `http://192.168.x.x` gibi yerel ağ IP'leri genellikle bu koşulu karşılamaz. Bu yüzden başlıklar mevcut olsa bile düz HTTP üzerinden Office dönüştürme başarısız olur. +> +> Resmi konteyner görüntüleri bu başlıkları içerir. Bir ters proxy kullanıyorsanız (Traefik, Caddy vb.), bu başlıkların korunduğundan veya eklendiğinden emin olun ve geri döngü dışı erişim için HTTPS kullanın. + +> [!TIP] +> **Podman Kullanıcıları:** Tüm `docker` komutları, `docker` yerine `podman` ve `docker-compose` yerine `podman-compose` yazılarak Podman ile çalışır. + +## Hızlı Başlangıç + +> [!TIP] +> BentoPDF iki sürüm olarak sunulur: +> +> - **Kendi Sunucunda Barındırma sürümü**: `ghcr.io/alam00000/bentopdf-simple:latest`. Tüm PDF araçları, tanıtım bölümleri **olmadan** (ana sayfa bölümü, SSS, kullanıcı yorumları, alt bilgi yok). Dahili/ekip/kurum dağıtımları için bunu kullanın. Özellikleri kısıtlanmış bir "lite" sürüm **değildir**. +> - **Ticari sürüm**: `ghcr.io/alam00000/bentopdf:latest`. Tam tanıtım sitesi; bentopdf.com'un kendisi ve herkese açık dağıtım yapan ticari lisans sahipleri tarafından kullanılır. +> +> Emin değilseniz: Kendi Sunucunda Barındırma sürümünü çekin. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +`docker-compose.yml` dosyasını oluşturun: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Çalıştırın: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Kendi Görüntünüzü Derleyin + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Derleyin ve çalıştırın: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Ortam Değişkenleri + +| Değişken | Açıklama | Varsayılan | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Kendi Sunucunda Barındırma varyantını derler (bentopdf.com tanıtım bölümlerini gizler: ana sayfa bölümü, SSS, kullanıcı yorumları, alt bilgi). Tüm PDF araçları kalır. | `false` | +| `BASE_URL` | Alt dizine dağıtım | `/` | +| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM modül URL'si | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Ghostscript WASM modül URL'si | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | CoherentPDF WASM modül URL'si | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | OCR worker betik URL'si | _(boş; Tesseract.js varsayılan CDN'i kullanılır)_ | +| `VITE_TESSERACT_CORE_URL` | OCR çekirdek çalışma zamanı dizini | _(boş; Tesseract.js varsayılan CDN'i kullanılır)_ | +| `VITE_TESSERACT_LANG_URL` | OCR traineddata dizini | _(boş; Tesseract.js varsayılan CDN'i kullanılır)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Arayüzde gösterilen virgülle ayrılmış OCR dilleri | _(boş; tam katalog gösterilir)_ | +| `VITE_OCR_FONT_BASE_URL` | OCR metin katmanı yazı tipi dizini | _(boş; uzak Noto yazı tipi URL'leri kullanılır)_ | +| `VITE_DEFAULT_LANGUAGE` | Varsayılan arayüz dili | `en` | +| `VITE_BRAND_NAME` | Özel marka adı | `BentoPDF` | +| `VITE_BRAND_LOGO` | `public/` klasörüne göre logo yolu | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Özel alt bilgi/telif hakkı metni | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | Gizlenecek araç kimlikleri (virgülle ayrılmış) | _(boş; tüm araçlar etkin)_ | +| `DISABLE_GITHUB_STARS` | Sayfa yüklenirken GitHub yıldız sayısı çekimini atlar ve `api.github.com` adresini CSP'den çıkarır. Simple Mode derlemeleri bunu her zaman atlar. | `false` | +| `SITE_URL` | Canonical, hreflang ve sitemap bağlantılarına yazılan herkese açık URL. Arama motorlarının dağıtımınızı ayrı bir site olarak görmesini istemiyorsanız varsayılan değerde bırakın. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Özel bir `SITE_URL` ile her sayfa `noindex` olarak işaretlenir, böylece kopyanız arama sonuçlarında bentopdf.com ile rekabet etmez. Arama motorlarının dizinlemesine izin vermek için `true` yapın. | `false` | + +WASM modül URL'leri CDN varsayılanlarıyla önceden yapılandırılmıştır, tüm gelişmiş özellikler kutudan çıktığı gibi çalışır. İnternetten yalıtılmış veya kendi sunucunuzdaki dağıtımlar için bunları geçersiz kılın. + +### Arama motorları + +Varsayılan olarak her sayfa, arama motorlarını asıl kaynak olarak bentopdf.com'a yönlendirir, böylece dağıtımınız kopya olarak görünmez. Özel veya dahili bir örnek için hiçbir şeyi değiştirmeniz gerekmez. + +- **Örneğinizi arama sonuçlarının tamamen dışında tutun:** konteyneri `-e ROBOTS_NOINDEX=true` ile çalıştırın. Bunun için yalnızca yeniden başlatma gerekir, yeniden derleme gerekmez. +- **Örneğinizi arama sonuçlarında ayrı bir site yapın:** `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true` ile derleyin. `ALLOW_INDEXING=true` olmadan, özel bir `SITE_URL` her sayfayı `noindex` olarak işaretler. + +### Content-Security-Policy + +nginx görüntüsü, uygulanan bir `Content-Security-Policy` başlığıyla gelir. CSP'nin `script-src`, `connect-src` ve `font-src` yönergeleri, yukarıdaki `VITE_*` URL değişkenlerinden **derleme zamanında oluşturulur**. `--build-arg` ile verdiğiniz tüm ana bilgisayarlar politikaya otomatik olarak eklenir. + +Sonuç olarak: + +- Derleme zamanında `VITE_CORS_PROXY_URL` veya `VITE_WASM_*_URL` değerlerini geçersiz kılarsanız, CSP bu kaynaklara otomatik izin verir, ek yapılandırma gerekmez. +- `cdn.jsdelivr.net` üzerindeki URL'lerde `script-src`, tüm CDN'e değil yalnızca tam sürümlü paket klasörüne izin verir, örneğin `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`. jsDelivr herhangi bir herkese açık npm paketini veya GitHub deposunu sunar, bu yüzden ana bilgisayarın tamamına izin vermek bunların hepsinin örneğinizde çalışmasına izin verirdi. Diğer ana bilgisayarlardaki URL'lere kaynak bazında izin verilir. +- Özel WASM URL'lerini _çalışma zamanında_ uygulama içi Gelişmiş Ayarlar sayfasından yapılandırırsanız, bu kaynaklar CSP'de **yer almaz** ve tarayıcı bunlara yapılan istekleri engeller. Bu, `cdn.jsdelivr.net` üzerindeki aynı paketin farklı bir sürümü için de geçerlidir, çünkü yalnızca derleme zamanında ayarlanan sürüme izin verilir. Çalışma zamanı yapılandırması deneme amaçlıdır. Kalıcı özel URL'ler için ilgili `VITE_*` build arg değerini ayarlayın. +- Üç `VITE_WASM_*_URL` değerinin tümünü geçersiz kılan internetten yalıtılmış dağıtımlarda, bu `cdn.jsdelivr.net` paket klasörleri de CSP'den çıkarılır (her varsayılan değiştirilir, eklenmez). `cdn.jsdelivr.net` üzerindeki Tesseract OCR varsayılanları, üç `VITE_TESSERACT_*` değerini de ayarlayana kadar politikada kalır. Benzer şekilde, `VITE_CORS_PROXY_URL` ayarlamak herkese açık `bentopdf-cors-proxy.bentopdf.workers.dev` varsayılanının yerini alır. + +CSP, `script-src` içinde `'unsafe-eval'` içerir, çünkü LibreOffice WASM çalışma zamanı (Word/Excel/PowerPoint dönüştürme araçlarınca kullanılır) ve wasm-vips görüntü kütüphanesi (PDF'den TIFF'e dönüştürmede kullanılır) dahili dağıtım kodunu `new Function()` ile derler. Bunu kaldırmak bu araçları bozar. `SIMPLE_MODE` ile (LibreOffice olmadan) derliyor ve PDF'den TIFF'e dönüştürmeye ihtiyaç duymuyorsanız, daha sıkı bir politika için oluşturulan `security-headers.conf` dosyasını elle düzenleyip `'unsafe-eval'` değerini çıkarabilirsiniz. + +OCR için, varsayılan çevrimiçi varlıkları kullanmak üzere `VITE_TESSERACT_*` değişkenlerini boş bırakın veya kendi sunucunuzdaki/çevrimdışı OCR için üçünü birlikte ayarlayın. Kısmi OCR geçersiz kılmaları reddedilir, çünkü worker, çekirdek çalışma zamanı ve traineddata dizini birbiriyle eşleşmelidir. Tamamen çevrimdışı aranabilir PDF çıktısı için ayrıca `VITE_OCR_FONT_BASE_URL` değerini ayarlayın, böylece OCR metin katmanı yazı tipleri herkese açık Noto yazı tipi URL'leri yerine dahili sunucunuzdan yüklenir. + +`VITE_DEFAULT_LANGUAGE`, ilk kez gelen ziyaretçiler için arayüz dilini belirler. Desteklenen değerler: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Kullanıcılar dili yine değiştirebilir, bu yalnızca varsayılanı değiştirir. + +Örnek: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Özel Marka + +Varsayılan BentoPDF logosunu, adını ve alt bilgi metnini kendinizinkilerle değiştirin. Logo dosyanızı `public/` klasörüne koyun (veya mevcut bir görseli kullanın), ardından marka değişkenlerini derleme zamanında verin: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Marka özelleştirme hem tam modda hem Simple Mode'da çalışır ve diğer tüm derleme zamanı seçenekleriyle birleştirilebilir. + +### Belirli Araçları Devre Dışı Bırakma + +Uyumluluk veya güvenlik gereksinimleri için araçları arayüzden gizleyin. Devre dışı bırakılan araçlar ana sayfadan, arama sonuçlarından, klavye kısayollarından ve iş akışı oluşturucudan kaldırılır. Doğrudan URL ile erişim "araç kullanılamıyor" sayfasını gösterir. + +Araç kimlikleri, sayfa URL'sinin `.html` olmayan halidir. Örneğin araç `bentopdf.com/edit-pdf.html` adresindeyse kimliği `edit-pdf` olur. + +#### Araç Kimliklerini Bulma + +En kolay yol: BentoPDF'te herhangi bir aracı açıp URL'ye bakın. Yolun son kısmı (`.html` olmadan) araç kimliğidir. + +
+Araç kimliklerinin tam listesi + +**Düzenle ve Not Ekle:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**PDF'e Dönüştür:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**PDF'den Dönüştür:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Düzenle ve Yönet:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Optimize Et ve Onar:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Güvenlik:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Seçenek 1: Derleme zamanı (Docker build arg) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Bu, devre dışı listesini JavaScript paketine gömer. Değiştirmek için yeniden derleme gerekir. + +#### Seçenek 2: Çalışma zamanı (config.json) + +Sunulan dizine bir `config.json` dosyası bağlayın, yeniden derleme gerekmez: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Veya Docker Compose ile: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +İki yöntem birlikte kullanılabilir, listeler birleştirilir. Bir araç herhangi birinde yer alıyorsa devre dışı bırakılır. + +#### Düzenleyici Özelliklerini Devre Dışı Bırakma + +PDF Düzenleyici içindeki belirli özellikleri (örn. karartma, ek açıklamalar, formlar) tüm düzenleyici aracını devre dışı bırakmadan da kapatabilirsiniz. `config.json` dosyanıza `editorDisabledCategories` ekleyin: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Düzenleyici kategorilerinin tam listesi + +**Yakınlaştırma:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Ek Açıklama:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Şekiller:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Form:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Karartma:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Belge:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Sayfa:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Panel:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Araçlar:** `tools`, `pan`, `pointer`, `capture` + +**Seçim:** `selection`, `selection-copy` + +**Geçmiş:** `history`, `history-undo`, `history-redo` + +
+ +Kategoriler hiyerarşiktir: bir üst kategoriyi (örn. `annotation`) devre dışı bırakmak tüm alt kategorilerini de devre dışı bırakır. + +### GitHub Yıldız Sayacını Devre Dışı Bırakma + +Gezinme çubuğu, sayfa yüklenirken `api.github.com` adresinden çekilen canlı bir GitHub yıldız sayısı gösterir. Bir PDF özelliğine hizmet etmeyen tek harici istek budur. Çekme kodunu paketten kaldırmak ve `api.github.com` adresini Content-Security-Policy'den çıkarmak için derleme zamanında devre dışı bırakın: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Mode derlemeleri (`bentopdf-simple`) yıldız sayacını her zaman atlar. Bu bayrak yalnızca Ticari sürümde veya özel tam derlemelerde gereklidir. + +### Özel WASM URL'leri (İnternetten Yalıtılmış / Kendi Sunucunuzda) + +> [!IMPORTANT] +> WASM URL'leri JavaScript'e **derleme zamanında** gömülür. WASM dosyaları çalışma zamanında **kullanıcının tarayıcısı** tarafından indirilir, Docker bunları derleme sırasında indirmez. İnternetten yalıtılmış ağlarda WASM dosyalarını tarayıcıların erişebildiği dahili bir sunucuda barındırmanız gerekir. + +**Tam air-gapped iş akışı:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +`--ocr-languages` için `bash scripts/prepare-airgap.sh --list-ocr-languages` komutunun yazdırdığı kodları kullanın veya `bash scripts/prepare-airgap.sh --search-ocr-language ` ile ada göre arayın. Kısıtlı bir OCR alt kümesiyle derlerken, uygulamanın yalnızca pakete dahil dilleri göstermesi için aynı kodları `VITE_TESSERACT_AVAILABLE_LANGUAGES` değerine verin. Tam çevrimdışı OCR çıktısı için ayrıca paketle gelen `ocr-fonts/` dizinini barındırın ve `VITE_OCR_FONT_BASE_URL` değerini ona yönlendirin. + +Bir modülü devre dışı bırakmak için değişkeni boş bir dizeye ayarlayın (kullanıcıların Gelişmiş Ayarlar üzerinden elle yapılandırması gerekir). + +## Özel Port + +Varsayılan olarak BentoPDF, konteyner içinde `8080` portunu dinler. Bunu değiştirmek için çalışma zamanında `PORT` ortam değişkenini ayarlayın: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Değişken | Açıklama | Varsayılan | +| -------- | ------------------------------- | ---------- | +| `PORT` | Konteynerde Nginx dinleme portu | `8080` | + +Bu, hem standart hem nonroot Dockerfile'larla çalışır. + +## Özel Kullanıcı Kimliği (PUID/PGID) + +Belirli bir root olmayan kullanıcı olarak çalışmayı gerektiren ortamlar için (NAS cihazları, güvenlik bağlamlı Kubernetes, kurumsal politikalar), BentoPDF, LSIO tarzı PUID/PGID desteğine sahip ayrı bir Dockerfile sunar. + +### Derleme ve Çalıştırma + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Ortam Değişkenleri + +| Değişken | Açıklama | Varsayılan | +| -------------- | ----------------------------------- | ---------- | +| `PUID` | Çalıştırılacak kullanıcı kimliği | `1000` | +| `PGID` | Çalıştırılacak grup kimliği | `1000` | +| `PORT` | Nginx dinleme portu | `8080` | +| `DISABLE_IPV6` | IPv6 dinleyicisini devre dışı bırak | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Nasıl Çalışır + +Konteyner root olarak başlar, belirtilen PUID/PGID ile bir kullanıcı oluşturur, yazılabilir tüm dizinlerin sahipliğini ayarlar, ardından `su-exec` ile ayrıcalıkları düşürür. nginx süreci tamamen belirttiğiniz kullanıcı olarak çalışır. + +> [!NOTE] +> Standart `Dockerfile`, `nginx-unprivileged` (UID 101) kullanır ve çoğu dağıtım için önerilir. `Dockerfile.nonroot` dosyasını yalnızca belirli bir UID/GID gerektiğinde kullanın. + +> [!WARNING] +> PUID/PGID `0` (root) olamaz. Giriş noktası girdileri doğrular ve geçersiz değerlerde hatayla çıkar. + +## Traefik ile (Ters Proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Caddy ile (Ters Proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Kaynak Sınırları + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (Systemd Entegrasyonu) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) Podman konteynerlerini systemd servisleri olarak çalıştırmanızı sağlar. Linux sistemlerdeki üretim dağıtımları için idealdir. + +### Temel Quadlet Kurulumu + +`~/.config/containers/systemd/bentopdf.container` (kullanıcı) veya `/etc/containers/systemd/bentopdf.container` (sistem) konumunda bir konteyner birim dosyası oluşturun: + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Etkinleştirme ve Başlatma + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Sistem genelinde dağıtım için `systemctl` komutunu `--user` bayrağı olmadan kullanın ve dosyayı `/etc/containers/systemd/` içine yerleştirin. + +### Sağlık Kontrollü Quadlet + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Quadlet ile Otomatik Güncelleme + +Podman, yeni görüntüler mevcut olduğunda konteynerleri otomatik güncelleyebilir: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadlet Ağ Yapılandırması + +Özel ağ yapılandırması için `bentopdf.network` ağ dosyasını oluşturun: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Ardından konteyner dosyanızda ona başvurun: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Güncelleme + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/tr/self-hosting/hostinger.md b/docs/tr/self-hosting/hostinger.md new file mode 100644 index 00000000..a271a45f --- /dev/null +++ b/docs/tr/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Hostinger'a Dağıtım + +[Hostinger](https://hostinger.com) popüler bir paylaşımlı barındırma sağlayıcısıdır. Bu rehber, BentoPDF'in Hostinger paylaşımlı barındırmasına dağıtımını anlatır. + +## Gereksinimler + +- Dosya yöneticisi erişimi olan bir Hostinger barındırma planı +- Derleme için yerel olarak kurulu Node.js + +## Adım 1: Projeyi Derleyin + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Derlenen dosyalar `dist` klasöründe olacaktır. + +## Adım 2: Hostinger'a Yükleyin + +### Kök Alan Adına Dağıtım + +1. Hostinger hesabınıza giriş yapın +2. **File Manager** → **public_html** bölümüne gidin +3. Mevcut tüm dosyaları **silin** (gerekirse yedekleyin) +4. Yerel `dist` klasörünüzün tüm içeriğini `public_html` içine **yükleyin** + +### Alt Dizine Dağıtım + +Bir alt dizine dağıtıyorsanız (örn. `yourdomain.com/pdf-tools/`): + +1. Doğru temel URL ile derleyin: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Hostinger'da klasörü oluşturun: + - **File Manager** → **public_html** bölümüne gidin + - Yeni bir klasör oluşturun: `pdf-tools` +3. `dist` içeriğinin tamamını `public_html/pdf-tools/` içine yükleyin + +## Adım 3: .htaccess Dosyası Oluşturun + +Dağıtım klasörünüzün köküne (`public_html` veya `public_html/pdf-tools/`) bir `.htaccess` dosyası oluşturun: + +::: warning Önemli +Alt dizine dağıtımda `RewriteBase /` değerini `RewriteBase /pdf-tools/` (veya klasör adınız) olarak değiştirin. +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Alt Dizin .htaccess Örneği + +`yourdomain.com/pdf-tools/` için şu satırları güncelleyin: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Sorun Giderme + +### WASM Dosyaları Yüklenmiyor + +MIME türlerinin `.htaccess` içinde doğru ayarlandığından emin olun: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice Araçları Çalışmıyor + +Güvenlik başlıkları SharedArrayBuffer için kritiktir: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Başlıklar uygulanmıyorsa, `mod_headers` modülünü etkinleştirmek için Hostinger desteğiyle iletişime geçin. + +### Sayfa Yenilemede 404 Hataları + +`.html` uzantı kuralının ve dil yönlendirmelerinin doğru yapılandırıldığından emin olun. BentoPDF, SPA yönlendirmesi değil statik HTML dosyaları kullanır: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Dosya Yükleme Sınırları + +Hostinger'ın dosya boyutu sınırları olabilir. Toplu yükleme başarısız olursa WASM dosyalarını ayrı yükleyin. diff --git a/docs/tr/self-hosting/index.md b/docs/tr/self-hosting/index.md new file mode 100644 index 00000000..8cfc3440 --- /dev/null +++ b/docs/tr/self-hosting/index.md @@ -0,0 +1,538 @@ +# Kendi Sunucunuzda Barındırma Kılavuzu + +BentoPDF kendi altyapınızda barındırılabilir. Bu kılavuz çeşitli dağıtım seçeneklerini kapsar. + +## Docker / Podman ile Hızlı Başlangıç + +BentoPDF'i kendi sunucunuzda barındırmanın en hızlı yolu: + +> [!TIP] +> BentoPDF iki derleme halinde sunulur: +> +> - **Kendi Sunucunuzda Barındırma derlemesi**: `ghcr.io/alam00000/bentopdf-simple:latest`. Tanıtım arayüzü olmadan (kahraman bölümü, SSS, kullanıcı yorumları, alt bilgi yok) tüm PDF araçlarını içerir. Kurum içi/ekip/organizasyon dağıtımları için bunu kullanın. Özellikleri kısıtlanmış bir "lite" sürüm **değildir**. +> - **Ticari derleme**: `ghcr.io/alam00000/bentopdf:latest`. Tanıtım sitesinin tamamını içerir; bentopdf.com'un kendisi ve herkese açık dağıtım yapan ticari lisans sahipleri tarafından kullanılır. +> +> Emin değilseniz: Kendi Sunucunuzda Barındırma derlemesini çekin. + +> [!IMPORTANT] +> Office dosyası dönüştürme `SharedArrayBuffer` gerektirir; bu da uygulamanın hem çapraz kaynak yalıtımlı olması hem de güvenli bir bağlamdan sunulması anlamına gelir. Resmi imaj gerekli COOP/COEP başlıklarını zaten gönderir, ancak tarayıcılar `http://192.168.x.x` gibi düz HTTP yerel ağ kaynaklarında `SharedArrayBuffer`'ı yine de devre dışı bırakır. +> +> `http://localhost` adresini yalnızca aynı cihazdaki testler için kullanın. Kullanıcılar BentoPDF'e bir yerel ağ IP'si veya ana bilgisayar adı üzerinden erişiyorsa, bağlantıyı HTTPS ile sonlandırın. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Veya Docker Compose / Podman Compose ile: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +BentoPDF'i bir systemd hizmeti olarak çalıştırın. `~/.config/containers/systemd/bentopdf.container` dosyasını oluşturun: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Tam Quadlet belgeleri için [Docker dağıtım kılavuzuna](/tr/self-hosting/docker) bakın. + +## Kaynaktan Derleme + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Yapılandırma Seçenekleri + +### Kendi Sunucunuzda Barındırma derlemesi (Basit Mod) + +Kendi Sunucunuzda Barındırma derlemesi (`bentopdf-simple` imajı, Basit Mod olarak da adlandırılır) Ticari derlemeyle **işlevsel olarak aynıdır**: her PDF aracı mevcuttur ve aynı şekilde davranır. Yalnızca bentopdf.com'da veya herkese açık bir ticari dağıtımda anlamlı olan tanıtım arayüzünü gizler. **Özellikleri kısıtlanmış veya "lite" bir sürüm değildir.** + +**Kendi Sunucunuzda Barındırma derlemesinin gizledikleri** (yalnızca görünüm; hiçbir PDF özelliği kaldırılmaz): + +- Gezinme çubuğu, kahraman bölümü, özellikler bölümü, SSS, kullanıcı yorumları, alt bilgi +- Sayfa başlığını "PDF Araçları" olarak günceller + +**Kendi Sunucunuzda Barındırma derlemesinin koruduğu** (gerçekten PDF işi yapan her şey): + +- Her PDF aracı (birleştirme, bölme, düzenleme, imzalama, OCR, Office dönüştürme vb.) +- Özel marka desteği, tüm derleme zamanı ve çalışma zamanı yapılandırması + +Ticari derleme (`ghcr.io/alam00000/bentopdf:latest`) bentopdf.com'un kendisini çalıştıran ve herkese açık dağıtım yapan ticari lisans sahipleri tarafından kullanılan derlemedir; bir kurum içi araçta anlamlı olmayacak kahraman bölümü, SSS, kullanıcı yorumları ve alt bilgiyi ekler. + +BentoPDF'i ekibiniz, kuruluşunuz veya kurum içi bir araç olarak kendi sunucunuzda barındırıyorsanız, Kendi Sunucunuzda Barındırma derlemesini çekin: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Tüm ayrıntılar için [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) dosyasına bakın. + +### Ticari derleme (kendi markanızla herkese açık dağıtımlar) + +Ticari derleme (`bentopdf` imajı, `-simple` soneki olmadan) bentopdf.com'un kendisini çalıştıran derlemedir. Her PDF aracının üzerine tanıtım sitesinin tamamını (kahraman bölümü, özellikler, SSS, kullanıcı yorumları, alt bilgi) ekler. **BentoPDF'i kendi markanız altında herkese açık bir PDF hizmeti olarak dağıtmak** istediğinizde bu derlemeyi kullanın, örneğin: + +- BentoPDF'i kendi alan adınızda son kullanıcılar için barındırılan bir SaaS olarak çalıştırıyorsunuz +- Yalnızca çıplak araç arayüzünü değil, açılış sayfası deneyimini (tanıtım bölümleri + araçlar) istiyorsunuz +- BentoPDF'i ticari bir ürüne gömen bir ticari lisans sahibisiniz + +**Olduğu gibi çalıştırın** (BentoPDF markası, derlemeyi önizlemek için yararlıdır): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Kendi markanızla derleyin** (tipik ticari iş akışı): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Diğer tüm derleme zamanı seçenekleri (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, WASM URL geçersiz kılmaları vb.) Kendi Sunucunuzda Barındırma derlemesinde olduğu gibi çalışır. + +::: warning Lisanslama +Ticari derlemeyi çalıştırmaya BentoPDF'in iki lisans seçeneğinden biri altında izin verilir: + +- **AGPL-3.0** (ücretsiz): dağıtımınız, marka değişiklikleri ve çevresindeki iş mantığı dahil tüm kaynak kodunu AGPL altında yayımlıyorsa izin verilir. +- **Ticari lisans** ($79 ömür boyu): marka fork'unuzu veya iş kodunuzu açık kaynak yapmadığınız kapalı kaynaklı / tescilli dağıtımlar için gereklidir. + +Tam karşılaştırma için [Lisanslama sayfasına](https://www.bentopdf.com/licensing) bakın. AGPL lisanslı WASM modülleri (PyMuPDF, Ghostscript, CoherentPDF) çalışma zamanında bir CDN'den yüklenir, bu nedenle imajınıza girmezler ve lisanslama durumunuzu değiştirmezler. +::: + +### Temel URL + +Bir alt dizine dağıtın: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Özel Marka + +Varsayılan BentoPDF logosunu, adını ve alt bilgi metnini derleme zamanında kendinizinkilerle değiştirin: + +| Değişken | Açıklama | Varsayılan | +| ------------------ | --------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Üst ve alt bilgide gösterilen marka adı | `BentoPDF` | +| `VITE_BRAND_LOGO` | `public/` dizinine göre logo yolu | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Özel alt bilgi/telif hakkı metni | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Veya Docker ile: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Marka özelleştirme hem tam modda hem de Basit Modda çalışır ve diğer tüm derleme zamanı seçenekleriyle (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`) birlikte kullanılabilir. + +### Belirli Araçları Devre Dışı Bırakma + +Uyumluluk veya güvenlik için tek tek araçları gizleyin. Devre dışı bırakılan araçlar ana sayfadan, aramadan, kısayollardan, iş akışı oluşturucudan ve doğrudan URL erişiminden kaldırılır. + +Araç kimlikleri, `.html` olmadan sayfa URL'sidir: herhangi bir aracı açıp URL'ye bakın (örn. `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Derleme zamanı** (pakete gömülür): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Çalışma zamanı** (yeniden derleme gerekmez, bir `config.json` bağlayın): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Her iki yöntem birlikte kullanılabilir: listeler birleştirilir. + +Ayrıca `config.json` dosyasına `editorDisabledCategories` ekleyerek, aracın tamamını devre dışı bırakmadan PDF Düzenleyici içindeki belirli özellikleri (örn. karartma) devre dışı bırakabilirsiniz. Kategorilerin tam listesi için [Docker kılavuzuna](/tr/self-hosting/docker#duzenleyici-ozelliklerini-devre-dısı-bırakma) bakın. + +## Dağıtım Kılavuzları + +Platformunuzu seçin: + +- [Vercel](/tr/self-hosting/vercel) +- [Netlify](/tr/self-hosting/netlify) +- [Cloudflare Pages](/tr/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/tr/self-hosting/aws) +- [Hostinger](/tr/self-hosting/hostinger) +- [Nginx](/tr/self-hosting/nginx) +- [Apache](/tr/self-hosting/apache) +- [Docker](/tr/self-hosting/docker) +- [Kubernetes](/tr/self-hosting/kubernetes) +- [CORS Proxy](/tr/self-hosting/cors-proxy) - Dijital imzalar için gereklidir + +## Sık Karşılaşılan Sorunlar + +### Word / ODT / Excel / PowerPoint'ten PDF'ye Dönüştürme Takılıyor (SharedArrayBuffer Kullanılamıyor) + +**Belirti**: LibreOffice tabanlı belge dönüştürmeleri (Word, ODT, Excel, PowerPoint'ten PDF'ye) yaklaşık %55'te takılır veya başlamaz. Tarayıcı konsolu şunu gösterebilir: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...veya `window.crossOriginIsolated` değeri `false` döner ya da WASM derlemesi `expected magic word 00 61 73 6d, found 1f 8b 08 08` bildirir. + +**Neden**: LibreOffice WASM, tarayıcının yalnızca sayfa **çapraz kaynak yalıtımlı** VE **güvenli bir bağlamdan** sunulduğunda etkinleştirdiği `SharedArrayBuffer`'a ihtiyaç duyar. Bunun için iki şeyin doğru olması gerekir: + +1. Her yanıt her iki başlığı da içerir: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Sayfa `https://...` veya `http://localhost` üzerinden sunulur. Yerel ağ IP'sinde düz HTTP (örn. `http://192.168.x.x`) güvenli SAYILMAZ: tarayıcılar orada `SharedArrayBuffer`'ı devre dışı bırakır. + +`00 61 73 6d / 1f 8b 08 08` uyuşmazlığı ayrı bir alt belirtidir: önceden sıkıştırılmış `.wasm.gz` / `.data.gz` dosyalarında `Content-Encoding: gzip` yanıt başlığı eksiktir, bu yüzden tarayıcı açılmış WASM yerine ham gzip baytlarını alır. + +**Çözüm**: tam yapılandırma için platformunuza özel dağıtım kılavuzuna bakın: + +- [Nginx →](/tr/self-hosting/nginx#word-odt-excel-den-pdf-ye-donusturme-calısmıyor) +- [Apache →](/tr/self-hosting/apache#word-odt-excel-den-pdf-e-donusturme-calısmıyor) +- [AWS S3 + CloudFront →](/tr/self-hosting/aws#adım-3b-response-headers-policy-libreoffice-wasm-icin-gerekli) +- [Cloudflare Pages →](/tr/self-hosting/cloudflare#yapılandırma-dosyası) (`_headers` dosyası) +- [Netlify →](/tr/self-hosting/netlify#word-odt-excel-den-pdf-ye-donusturme-55-te-takılıyor) (`netlify.toml`) +- [Vercel →](/tr/self-hosting/vercel#word-odt-excel-den-pdf-ye-donusturme-calısmıyor) (`vercel.json`) +- [Hostinger →](/tr/self-hosting/hostinger#libreoffice-aracları-calısmıyor) (`.htaccess`) +- [Kubernetes →](/tr/self-hosting/kubernetes#sharedarraybuffer-baslıklarının-hala-calıstıgından-emin-olma-ingress-gateway) +- **Docker**: birlikte gelen nginx yapılandırması tarafından otomatik olarak halledilir, işlem gerekmez. + +**Doğrulama**: herhangi bir BentoPDF sayfasında DevTools Konsolu'nu açın ve şunu çalıştırın: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Sayfa HTTPS veya `http://localhost` ise VE her yanıtta hem COEP hem COOP başlıkları varsa, iki kontrol de geçer. `http://192.168.x.x` veya loopback olmayan başka bir HTTP kaynağındaysanız, bağlantıyı HTTPS ile sonlandırın: yalnızca başlıkla çözülebilecek bir çözüm yoktur. + +### `.mjs` Dosyaları `application/octet-stream` Olarak Sunuluyor + +**Belirti**: PDF İmzala / Form Doldurucu / bazı diğer araçlar boş bir görüntüleyici gösterir veya yüklenemez. Tarayıcı konsolu şunu bildirir: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Neden**: Web sunucunuzda veya ters proxy'nizde `.mjs` dosyaları için bir MIME türü eşlemesi yok (birlikte gelen PDF görüntüleyici ES modüllerini bu uzantıyla sunar). Birçok standart sunucu yapılandırması tanınmayan uzantılar için varsayılan olarak `application/octet-stream` kullanır ve tarayıcılar bunu ES modülü olarak çalıştırmayı reddeder. + +**Çözüm**: tam kod parçacığı için platformunuza özel dağıtım kılavuzuna bakın: + +- [Nginx →](/tr/self-hosting/nginx#pdf-imzala-veya-form-doldurucu-bos-goruntuleyici-gosteriyor-mjs-mime-hatası) +- [Apache →](/tr/self-hosting/apache#pdf-imzala-veya-form-doldurucu-bos-goruntuleyici-gosteriyor-mjs-mime-hatası) +- [AWS S3 + CloudFront →](/tr/self-hosting/aws#adım-2-derleyin-ve-yukleyin) (`aws s3 cp ... --include "*.mjs"` bölümüne bakın) +- [Kubernetes →](/tr/self-hosting/kubernetes#mjs-mime-turu-hataları-pdf-imzala-form-doldurucu-iframe-i-bos) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: otomatik olarak halledilir, işlem gerekmez. + +**Doğrulama**: DevTools → Network sekmesini açın, başarısız olan `.mjs` isteğini bulun ve `Content-Type` yanıt başlığını kontrol edin. `application/javascript` olmalıdır. Hâlâ `application/octet-stream` ise, dıştaki bir ters proxy veya CDN türü yeniden algılıyor olabilir: sunum zincirinizdeki her katmanı kontrol edin. + +## WASM Yapılandırması (AGPL Bileşenleri) + +BentoPDF, AGPL lisanslı işleme kütüphanelerini kaynak koduna **dahil etmez**, ancak tüm özelliklerin kutudan çıktığı gibi çalışması için **CDN URL'lerini önceden yapılandırır**; elle kurulum gerekmez. + +::: tip Varsayılan Olarak Sıfır Yapılandırma +v2.0.0 itibarıyla WASM modülleri, ortam değişkenleriyle jsDelivr CDN'den yüklenecek şekilde önceden yapılandırılmıştır. Tüm gelişmiş özellikler herhangi bir kullanıcı yapılandırması olmadan hemen çalışır. +::: + +| Bileşen | Lisans | Özellikler | +| --------------- | -------- | -------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS dönüştürme, görsel çıkarma, tablo çıkarma | +| **Ghostscript** | AGPL-3.0 | PDF/A dönüştürme, sıkıştırma, eğrilik düzeltme, rasterleştirme | +| **CoherentPDF** | AGPL-3.0 | İçindekiler, ekler, yer işaretleriyle PDF birleştirme | + +### Varsayılan Ortam Değişkenleri + +Bunlar `.env.production` dosyasında ayarlanır ve derlemeye gömülür: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### WASM URL'lerini Geçersiz Kılma + +Özel dağıtımlar için varsayılanları derleme zamanında geçersiz kılabilirsiniz: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Bir modülü tamamen devre dışı bırakmak için (kullanıcının Gelişmiş Ayarlar üzerinden elle yapılandırmasını gerektirir), değişkenini boş bir dizeye ayarlayın. + +OCR için ya tüm `VITE_TESSERACT_*` değişkenlerini boş bırakıp varsayılan çevrimiçi varlıkları kullanın ya da kendi sunucunuzda/çevrimdışı OCR için worker/core/lang URL'lerini birlikte ayarlayın. Yalnızca belirli OCR dillerini pakete dahil ederseniz, arayüzün yalnızca kurulu dilleri sunması ve desteklenmeyen seçimlerin açıklayıcı bir hatayla başarısız olması için `VITE_TESSERACT_AVAILABLE_LANGUAGES` değişkenini de aynı virgülle ayrılmış kodlara ayarlayın. Tam çevrimdışı aranabilir PDF çıktısı için ayrıca `VITE_OCR_FONT_BASE_URL` değişkenini, birlikte gelen OCR yazı tiplerini sunan dahili dizine ayarlayın. + +Kullanıcılar ayrıca bu varsayılanları arayüzdeki **Gelişmiş Ayarlar** üzerinden istedikleri zaman geçersiz kılabilir: tarayıcıda saklanan kullanıcı geçersiz kılmaları ortam varsayılanlarına göre önceliklidir. + +### Hava Boşluklu / Çevrimdışı Dağıtım + +İnternet erişimi olmayan ağlar için (kamu, sağlık, finans vb.). WASM URL'leri JavaScript'e **derleme zamanında** gömülür; gerçek WASM dosyaları çalışma zamanında **kullanıcının tarayıcısı** tarafından indirilir. Bu nedenle her şeyi internet erişimi olan bir makinede hazırlayıp yalıtılmış ağa aktarmanız gerekir. + +#### Otomatik Betik (Önerilen) + +Birlikte gelen `prepare-airgap.sh` betiği tüm süreci otomatikleştirir: WASM paketlerini indirir, Docker imajını derler ve bir kurulum betiğiyle birlikte kendi kendine yeten bir paket üretir. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Bu, bir paket dizini üretir: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Paketi USB, kurum içi yapıt deposu veya onaylı bir yöntemle hava boşluklu ağa aktarın. Ardından birlikte gelen kurulum betiğini çalıştırın: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Kurulum betiği Docker imajını yükler, WASM dosyalarını çıkarır ve isteğe bağlı olarak kapsayıcıyı başlatır. + +**Betik seçenekleri:** + +| Bayrak | Açıklama | Varsayılan | +| ------------------------------ | ----------------------------------------------------------------- | ---------------------------- | +| `--wasm-base-url ` | WASM'lerin dahili olarak barındırılacağı yer | _(zorunlu, eksikse sorulur)_ | +| `--image-name ` | Docker imaj etiketi | `bentopdf` | +| `--output-dir ` | Çıktı paketi dizini | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Basit Modu etkinleştirir | kapalı | +| `--base-url ` | Alt dizin temel URL'si (örn. `/pdf/`) | `/` | +| `--language ` | Varsayılan arayüz dili (örn. `fr`, `de`) | _(yok)_ | +| `--brand-name ` | Özel marka adı | _(yok)_ | +| `--brand-logo ` | `public/` dizinine göre logo yolu | _(yok)_ | +| `--footer-text ` | Özel alt bilgi metni | _(yok)_ | +| `--ocr-languages ` | Pakete dahil edilecek virgülle ayrılmış OCR dilleri | `eng` | +| `--list-ocr-languages` | Desteklenen OCR kodlarını ve adlarını yazdırır, sonra çıkar | kapalı | +| `--search-ocr-language ` | OCR kodlarını ada veya kısaltmaya göre arar | kapalı | +| `--dockerfile ` | Kullanılacak Dockerfile | `Dockerfile` | +| `--skip-docker` | Docker derlemesini ve dışa aktarmayı atlar | kapalı | +| `--skip-wasm` | WASM indirmeyi atlar (mevcut `.tgz` dosyalarını yeniden kullanır) | kapalı | + +Etkileşimli istem ayrıca tam desteklenen Tesseract kod listesini yazdırmak için `list` ve `search german` veya `search chi` gibi eşleşmeleri bulmak için `search ` kabul eder. + +::: warning Aynı Kaynak Gereksinimi +WASM dosyaları BentoPDF uygulamasıyla **aynı kaynaktan** sunulmalıdır. Web Worker'lar, komut dosyalarını çapraz kaynaktan yükleyemeyen `importScripts()` kullanır. Örneğin BentoPDF `https://internal.example.com` adresinde çalışıyorsa, WASM temel URL'si de `https://internal.example.com/wasm` olmalıdır. +::: + +#### Elle Adımlar + +
+Betik olmadan elle yapmayı tercih ediyorsanız + +**Adım 1: WASM ve OCR paketlerini indirin** (internet erişimi olan bir makinede) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Adım 2: Docker imajını dahili URL'lerle derleyin** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Adım 3: Docker imajını dışa aktarın** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Adım 4: Hava boşluklu ağa aktarın** + +USB, kurum içi yapıt deposu veya onaylı aktarım yöntemiyle kopyalayın: + +- `bentopdf.tar`: Docker imajı +- Adım 1'deki beş `.tgz` WASM/OCR paketi +- Adım 1'deki `tesseract-langdata/` dizini +- Adım 1'deki `ocr-fonts/` dizini + +**Adım 5: Hava boşluklu ağın içinde kurun** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Dosyaların Adım 2'de yapılandırdığınız URL'lerde, yani `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` ve `.../ocr/fonts` dahil erişilebilir olduğundan emin olun. + +
+ +::: info Docker yerine kaynaktan mı derliyorsunuz? +`npm run build` çalıştırmadan önce değişkenleri `.env.production` dosyasında ayarlayın: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Kendi WASM Proxy'nizi Barındırma + +AGPL WASM dosyalarını uygun CORS başlıklarıyla sunmanız gerekiyorsa basit bir proxy dağıtabilirsiniz. Örnek bir uygulama için [Cloudflare WASM Proxy kılavuzuna](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) bakın. + +::: tip Neden Ayrı? +Bu ayrım şunları sağlar: + +- Ticari kullanıcılar için net yasal uyumluluk +- BentoPDF çekirdeğinin ikili lisansı (AGPL-3.0 / Ticari) altında kalması +- WASM dosyalarının kaynağa dahil edilmeden çalışma zamanında yüklenmesi + ::: + +## Sistem Gereksinimleri + +| Gereksinim | Asgari | +| ---------- | ----------------------------------------- | +| Depolama | ~100 MB (AGPL modülleri olmadan çekirdek) | +| RAM | 512 MB | +| CPU | Herhangi bir modern işlemci | + +::: tip +BentoPDF statik bir sitedir: veritabanı veya arka uç sunucusu gerekmez! +::: diff --git a/docs/tr/self-hosting/kubernetes.md b/docs/tr/self-hosting/kubernetes.md new file mode 100644 index 00000000..d0dbf9f8 --- /dev/null +++ b/docs/tr/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Kubernetes ile Dağıtım + +Kubernetes statik bir site için gereğinden fazla olabilir, ancak zaten Helm + GitOps standardını kullanıyorsanız çok iyi bir seçim olabilir. + +> [!IMPORTANT] +> **Office Dosyası Dönüştürme için Gerekli Başlıklar** +> +> LibreOffice tabanlı araçlar (Word, Excel, PowerPoint dönüştürme) `SharedArrayBuffer` desteği için şu HTTP başlıklarını gerektirir: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Resmi BentoPDF nginx imajları bu başlıkları içerir. Kubernetes'te **Ingress/Gateway denetleyicileri de birer ters proxy'dir**, bu nedenle bu başlıkların korunduğundan emin olun (veya uç katmanda ekleyin). + +## Ön Koşullar + +- Kubernetes kümesi +- Helm v3 +- **8080 numaralı bağlantı noktasında** hizmet veren bir BentoPDF nginx imajı (örn. `ghcr.io/alam00000/bentopdf:`) + +## Helm ile Dağıtım + +### Bu depodan kurulum (yerel chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### GHCR'den kurulum (OCI chart) + +Chart GHCR'de OCI yapıtı olarak yayımlanmışsa: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Erişime Açma + +### Port-forward (hızlı test) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (isteğe bağlı) + +Ingress'i etkinleştirin (nginx-ingress için örnek): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (isteğe bağlı) + +Bu chart, Gateway API `Gateway` + `HTTPRoute` yapılarını destekler. + +Örnek (Cloudflare Gateway API operatörü): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## SharedArrayBuffer Başlıklarının Hâlâ Çalıştığından Emin Olma (Ingress/Gateway) + +### Ne olması "gerekir" + +BentoPDF'in nginx yapılandırması gerekli yanıt başlıklarını ayarlar. Çoğu Ingress/Gateway denetleyicisi **üst akış yanıt başlıklarını değiştirmeden iletir**. + +### Neyi bozabilir + +- Yanıt başlıklarını **geçersiz kılan** veya **kaldıran** bir denetleyici/uç politikası +- Farklı COOP/COEP değerleri ayarlayan bir "güvenlik başlıkları" ara katmanı + +### Nasıl doğrulanır + +Bunu herkese açık uç noktanıza karşı çalıştırın: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Şunları görmelisiniz: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Ingress denetleyiciniz bunları korumuyorsa + +Başlıkları uç katmanda ekleyin (denetleyiciye özgüdür). **nginx-ingress** için örnek: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` MIME türü hataları (PDF İmzala / Form Doldurucu iframe'i boş) + +Tarayıcı konsolunda bir `.mjs` isteğinde `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` görüyorsanız, BentoPDF nginx'inin önündeki bir Ingress/Gateway denetleyicisi üst akıştaki `Content-Type` başlığını `application/octet-stream` ile değiştiriyor demektir. + +BentoPDF imajındaki nginx `.mjs` dosyalarını zaten `application/javascript` olarak sunar. Çözüm, denetleyicinin bunu kaldırmasını/değiştirmesini engellemektir. nginx-ingress için: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Veya Gateway API'de `.mjs` yolları için `Content-Type: application/javascript` ayarlamak üzere bir `ResponseHeaderModifier` filtresi kullanın. DevTools → Network sekmesiyle doğrulayın: başarısız olan `.mjs` isteği artık `content-type: application/javascript` göstermelidir. + +### Gateway API kullanıyorsanız ve başlıkları zorla eklemek istiyorsanız + +Gateway API bir `ResponseHeaderModifier` filtresi destekler. Bunu `httpRoute.rules[*].filters` içine ekleyebilirsiniz: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Belirli filtrelerin desteği Gateway denetleyicinize bağlıdır; bir filtre yok sayılırsa başlıkları bunun yerine uç/denetleyici katmanında ekleyin. + +## Belirli Araçları Devre Dışı Bırakma + +İmajı yeniden derlemeden çalışma zamanında araçları devre dışı bırakmak için bir ConfigMap kullanın: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Bunu sunulan dizine bağlayın: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Araç kimlikleri, `.html` olmadan sayfa URL'sidir: herhangi bir aracı açıp URL'ye bakın (örn. `edit-pdf`, `merge-pdf`, `compress-pdf`). Devre dışı bırakılan araçlar ana sayfadan, aramadan, kısayollardan, iş akışı oluşturucudan ve doğrudan URL erişiminden gizlenir. Seçeneklerin tam listesi için [Docker kılavuzuna](/tr/self-hosting/docker#belirli-aracları-devre-dısı-bırakma) bakın. diff --git a/docs/tr/self-hosting/netlify.md b/docs/tr/self-hosting/netlify.md new file mode 100644 index 00000000..6f3eee8f --- /dev/null +++ b/docs/tr/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Netlify'a Dağıtım + +[Netlify](https://netlify.com), cömert bir ücretsiz katmanla mükemmel statik site barındırma sunar. + +## Tek Tıkla Dağıtım + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Elle Dağıtım + +### Adım 1: Depoyu Bağlayın + +1. [Netlify](https://app.netlify.com)'a giriş yapın +2. "Add new site" → "Import an existing project" seçeneğine tıklayın +3. GitHub hesabınızı bağlayın +4. BentoPDF fork'unuzu seçin + +### Adım 2: Derleme Ayarlarını Yapılandırın + +| Ayar | Değer | +| -------------- | --------------- | +| Derleme komutu | `npm run build` | +| Yayın dizini | `dist` | +| Node sürümü | 18+ | + +### Adım 3: Dağıtın + +"Deploy site"a tıklayın ve derlemenin bitmesini bekleyin. + +## Yapılandırma Dosyası + +Proje kök dizininizde `netlify.toml` oluşturun: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Önemli +`Cross-Origin-Embedder-Policy` ve `Cross-Origin-Opener-Policy` başlıkları Word/ODT/Excel/PowerPoint'ten PDF'ye dönüştürmeler için gereklidir. Bunlar olmadan `SharedArrayBuffer` kullanılamaz ve LibreOffice WASM motoru başlatılamaz. + +`.wasm.gz` ve `.data.gz` dosyalarındaki `Content-Encoding: gzip` başlıkları, tarayıcıya bunları otomatik olarak açmasını söyler. Bunlar olmadan tarayıcı ham gzip baytlarını alır ve WASM derlemesi başarısız olur. +::: + +## Ortam Değişkenleri + +Bunları Site settings → Environment variables bölümünde ayarlayın: + +| Değişken | Açıklama | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Asgari derleme için `true` yapın | +| `VITE_BRAND_NAME` | Özel marka adı ("BentoPDF" yerine geçer) | +| `VITE_BRAND_LOGO` | `public/` dizinine göre logo yolu (örn. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Özel alt bilgi/telif hakkı metni | +| `VITE_DEFAULT_LANGUAGE` | Varsayılan arayüz dili (örn. `fr`, `de`, `es`) | + +## Özel Alan Adı + +1. Site settings → Domain management bölümüne gidin +2. "Add custom domain"e tıklayın +3. DNS yapılandırma yönergelerini izleyin + +## Büyük Medya + +Büyük WASM dosyaları için [Netlify Large Media](https://docs.netlify.com/large-media/overview/) özelliğini etkinleştirmeyi düşünebilirsiniz: + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Sorun Giderme + +### Word/ODT/Excel'den PDF'ye Dönüştürme %55'te Takılıyor + +Belge dönüştürmeleri %55'te takılırsa DevTools Konsolu'nu açıp şunları kontrol edin: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +`crossOriginIsolated` değeri `false` ise, `netlify.toml` dosyanızdaki COEP/COOP başlıkları uygulanmıyor demektir. Dosyanın proje kök dizininizde olduğundan emin olun ve yeniden dağıtın. + +Konsolda `expected magic word 00 61 73 6d, found 1f 8b 08 08` görüyorsanız, `.wasm.gz` dosyalarında `Content-Encoding: gzip` başlıkları eksiktir. `soffice.wasm.gz` ve `soffice.data.gz` için `[[headers]]` bloklarının `netlify.toml` dosyanızda olduğundan emin olun. + +### Derleme Başarısız Oluyor + +Node sürümü uyumluluğunu kontrol edin: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Yavaş İlk Yükleme + +Site settings → Build & deploy → Asset optimization bölümünde varlık optimizasyonunu etkinleştirin. diff --git a/docs/tr/self-hosting/nginx.md b/docs/tr/self-hosting/nginx.md new file mode 100644 index 00000000..78c1c59d --- /dev/null +++ b/docs/tr/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Nginx ile Dağıtım + +BentoPDF'i Nginx kullanarak kendi sunucunuzda barındırın. + +## Ön Koşullar + +- Ubuntu/Debian sunucu +- Kurulu Nginx +- SSL sertifikası (önerilen: Let's Encrypt) + +## Adım 1: Projeyi Derleyin + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Markayı özelleştirmek için derlemeden önce ortam değişkenlerini ayarlayın: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Adım 2: Dosyaları Kopyalayın + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Adım 3: Nginx Yapılandırması + +`/etc/nginx/sites-available/bentopdf` dosyasını oluşturun: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Adım 4: Siteyi Etkinleştirin + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Adım 5: Let's Encrypt ile SSL + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Alt Dizinde Dağıtım + +`/pdf/` altında barındırmak için: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Şununla derleyin: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Performans İyileştirme + +`nginx.conf` dosyasına ekleyin: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Sorun Giderme + +### WASM Yüklenmiyor + +MIME türünün ayarlandığından emin olun: + +```nginx +types { + application/wasm wasm; +} +``` + +### PDF İmzala veya Form Doldurucu Boş Görüntüleyici Gösteriyor (`.mjs` MIME hatası) + +Tarayıcı konsolunda şunu görüyorsanız: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...ve başarısız olan istek `.mjs` ile bitiyorsa, nginx'inizde `.mjs → application/javascript` eşlemesi eksiktir. Gömülü PDF görüntüleyici (PDF İmzala, Form Doldurucu ve birkaç başka araç tarafından kullanılır) `.mjs` uzantılı ES modül dosyaları içerir ve nginx'in standart `mime.types` dosyası bunları varsayılan olarak içermez. + +Çözmek için `/etc/nginx/mime.types` içindeki mevcut `application/javascript` satırına `mjs` ekleyin: + +```nginx +application/javascript js mjs; +``` + +> İkinci bir `application/javascript` satırı EKLEMEYİN: nginx `mime.types` dosyasını satır satır ayrıştırır ve yalnızca bir tür-uzantı eşlemesi geçerli olur, bu nedenle ikinci satır bazı sürümlerde sessizce yok sayılır. Mevcut satırı düzenleyip `js` yanına `mjs` ekleyin. + +Veya server bloğunuzun içinde yerel olarak geçersiz kılın (genel dosyayı düzenlemeden): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Değişiklikten sonra nginx'i yeniden yükleyin: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Doğrulamak için tarayıcı DevTools → Network sekmesinde başarısız olan `.mjs` isteğini bulun ve `Content-Type` yanıt başlığını kontrol edin. Artık `application/octet-stream` değil, `application/javascript` olmalıdır. + +### Word/ODT/Excel'den PDF'ye Dönüştürme Çalışmıyor + +LibreOffice WASM, `Cross-Origin-Embedder-Policy` ve `Cross-Origin-Opener-Policy` başlıklarını gerektiren `SharedArrayBuffer`'a ihtiyaç duyar. Ayrıca güvenli bir bağlam gerekir; bu nedenle `http://localhost` yerel testlerde çalışır, ancak `http://192.168.x.x` gibi yerel ağ IP'leri genellikle HTTPS gerektirir. Bir `location` bloğundaki nginx `add_header` yönergelerinin, sunucu düzeyindeki `add_header` yönergelerini **geçersiz kıldığını**, birleştirmediğini unutmayın. Kendi `add_header` yönergesi olan her `location` bloğu COEP/COOP başlıklarını içermelidir. + +Şununla doğrulayın: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Nginx'in önünde bir ters proxy kullanıyorsanız, bu başlıkları korumasından emin olun. + +### 502 Bad Gateway + +Nginx hata günlüklerini kontrol edin: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/tr/self-hosting/vercel.md b/docs/tr/self-hosting/vercel.md new file mode 100644 index 00000000..b8fe5603 --- /dev/null +++ b/docs/tr/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Vercel'e Dağıtım + +[Vercel](https://vercel.com), statik siteler için en kolay dağıtım deneyimini sunar. + +## Tek Tıkla Dağıtım + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Elle Dağıtım + +### Adım 1: Depoyu Fork'layın + +[bentopdf/bentopdf](https://github.com/alam00000/bentopdf) deposunu GitHub hesabınıza fork'layın. + +### Adım 2: Vercel'e Aktarın + +1. [vercel.com/new](https://vercel.com/new) adresine gidin +2. Fork'ladığınız depoyu seçin +3. Projeyi yapılandırın: + +| Ayar | Değer | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Adım 3: Ortam Değişkenleri (İsteğe Bağlı) + +Gerekirse bunları ekleyin: + +| Değişken | Açıklama | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Asgari arayüz için `true` yapın | +| `VITE_BRAND_NAME` | Özel marka adı ("BentoPDF" yerine geçer) | +| `VITE_BRAND_LOGO` | `public/` dizinine göre logo yolu (örn. `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Özel alt bilgi/telif hakkı metni | +| `VITE_DEFAULT_LANGUAGE` | Varsayılan arayüz dili (örn. `fr`, `de`, `es`) | + +### Adım 4: Dağıtın + +"Deploy"a tıklayın ve derlemenin tamamlanmasını bekleyin. + +## Özel Alan Adı + +1. Proje ayarlarınıza gidin +2. "Domains" bölümüne gidin +3. Özel alan adınızı ekleyin +4. DNS'i yönergelere göre yapılandırın + +## Sınırlamalar + +::: warning Büyük Dosyalar +Vercel'in sunucusuz işlevlerinin 50MB sınırı vardır. BentoPDF statik bir site olduğu için bu sizi etkilememelidir, ancak WASM modülleri büyüktür (toplam ~100MB). Bunların `/public` klasöründen sunulduğundan emin olun. +::: + +## Sorun Giderme + +### Derleme Zaman Aşımı + +Derlemeler zaman aşımına uğruyorsa şunu deneyin: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Yenilemede 404 + +SPA yönlendirmesi için bir `vercel.json` ekleyin: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel'den PDF'ye Dönüştürme Çalışmıyor + +LibreOffice WASM dönüştürmeleri `SharedArrayBuffer` gerektirir; bunun için tüm sayfalarda şu yanıt başlıkları gerekir: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Önceden sıkıştırılmış `.wasm.gz` ve `.data.gz` dosyalarının da tarayıcının bunları açabilmesi için `Content-Encoding: gzip` başlığına ihtiyacı vardır. + +Bunları `vercel.json` dosyanıza ekleyin: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Doğrulamak için DevTools Konsolu'nu açın ve `console.log(window.crossOriginIsolated)` komutunu çalıştırın: `true` döndürmelidir. diff --git a/docs/tr/tools/add-attachments.md b/docs/tr/tools/add-attachments.md new file mode 100644 index 00000000..f34d707c --- /dev/null +++ b/docs/tr/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Ek Dosya Ekle +description: Her türden dosyayı PDF'ye belge düzeyinde veya belirli sayfalara bağlı olarak gömün. +--- + +# Ek Dosya Ekle + +Bir veya daha fazla dosyayı doğrudan PDF belgesinin içine gömün. Ekler belge düzeyinde eklenebilir (herhangi bir PDF okuyucunun ek dosyalar panelinde görünür) veya belirli sayfalara bağlanabilir. + +## Nasıl Çalışır + +1. Dosya eklemek istediğiniz PDF'yi yükleyin. +2. Ek dosya bırakma alanını kullanarak gömmek istediğiniz dosyaları seçin (her dosya türü olur). +3. Ek düzeyini seçin: **Belge** (varsayılan) veya **Sayfa**. +4. Sayfa düzeyini seçerseniz bir sayfa aralığı girin (örn. `1-3` veya `5`). +5. İşle düğmesine tıklayın. Dosyalarınız gömülü olarak değiştirilmiş PDF indirilir. + +## Özellikler + +- Her dosya türü eklenebilir: görseller, e-tablolar, arşivler, çalıştırılabilir dosyalar, her şey +- Belge düzeyinde veya sayfa düzeyinde ek yerleşimi +- Tek işlemde birden fazla dosya eklenebilir +- Seçilen tüm eklerin dosya adlarını ve boyutlarını gösterir +- Çıktı, özgün PDF içeriğini korur ve gömülü dosyaları ekler + +## Seçenekler + +| Seçenek | Açıklama | +| ---------------- | ---------------------------------------------------------------------------- | +| **Belge düzeyi** | Dosyaları PDF'ye bir bütün olarak ekler, ek dosyalar panelinden erişilebilir | +| **Sayfa düzeyi** | Dosyaları sayfa aralığı girişiyle belirtilen belirli sayfalara ekler | + +## Kullanım Alanları + +- Kaynak verileri (Excel dosyaları, CSV'ler) bir PDF raporuyla birlikte paketlemek +- Özgün görsel dosyalarını bir fotoğraf portfolyosu PDF'sine eklemek +- Bir sözleşme veya teklifin içine destekleyici belgeleri gömmek +- Bir eğitim kılavuzunun belirli sayfalarına ek materyaller eklemek + +## İpuçları + +- Belge düzeyindeki ekler PDF okuyucuları arasında en yaygın desteklenen türdür. Sayfa düzeyindeki ekler tüm görüntüleyicilerde görünmeyebilir. +- Ekler için dosya boyutu sınırı yoktur, ancak çok büyük gömülü dosyalar PDF boyutunu orantılı olarak artırır. + +## İlgili Araçlar + +- [Ek Dosyaları Çıkar](./extract-attachments) +- [Ek Dosyaları Düzenle](./edit-attachments) +- [PDF Birleştir](./merge-pdf) diff --git a/docs/tr/tools/add-blank-page.md b/docs/tr/tools/add-blank-page.md new file mode 100644 index 00000000..d42f79af --- /dev/null +++ b/docs/tr/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Boş Sayfa Ekle +description: Bir PDF belgesinin istediğiniz konumuna bir veya daha fazla boş sayfa ekleyin. +--- + +# Boş Sayfa Ekle + +Belirttiğiniz konuma PDF'ye boş sayfalar ekleyin. Boş sayfaların nereye gideceğini ve kaç tane ekleneceğini siz belirlersiniz. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Araç sayfa sayısını gösterir. +2. Boş sayfaların ekleneceği **konumu** girin. En başa eklemek için `0`, sona eklemek için toplam sayfa sayısını kullanın. +3. Eklenecek boş sayfa **sayısını** girin (varsayılan 1). +4. İşle düğmesine tıklayın. Boş sayfalar eklenmiş PDF indirilir. + +## Özellikler + +- Herhangi bir konuma ekleme: belgenin başı, ortası veya sonu +- Tek işlemde birden fazla boş sayfa ekleme +- Konum ipucu, yüklenen PDF'nin sayfa sayısına göre dinamik olarak güncellenir +- Standart A4 boyutunda boş sayfalar + +## Kullanım Alanları + +- Derlenmiş bir belgenin bölümleri arasına boş ayırıcı sayfa eklemek +- Çift taraflı baskı hizalaması için boş sayfa eklemek +- Basılı bir çalışma kılavuzuna el yazısı notlar için alan eklemek +- Bir belgeyi asgari sayfa sayısı gereksinimini karşılayacak şekilde doldurmak + +## İpuçları + +- `0` konumu ilk sayfadan önce ekler. Toplam sayfa sayısına eşit konum, son sayfadan sonra ekler. +- Belirli bir konuma boş sayfa değil de içerik eklemeniz gerekiyorsa, belirli bir sayfadan sonra başka bir PDF eklemek için [PDF Çoklu Araç](./pdf-multi-tool) aracını kullanın. + +## İlgili Araçlar + +- [Çoğalt & Düzenle](./organize-pdf) +- [PDF Çoklu Araç](./pdf-multi-tool) +- [PDF Birleştir](./merge-pdf) diff --git a/docs/tr/tools/add-page-labels.md b/docs/tr/tools/add-page-labels.md new file mode 100644 index 00000000..9cd8a0de --- /dev/null +++ b/docs/tr/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Sayfa Etiketleri Ekle +description: Roma rakamları, harf önekleri, özel numaralandırma ve belge başına birden fazla kural ile PDF sayfa etiketleri ekleyin. +--- + +# Sayfa Etiketleri Ekle + +Sayfa etiketleri, sayfa numaralarının PDF görüntüleyicilerde nasıl gösterileceğini belirler (araç çubuğunda görünen numara, sayfaya basılan numara değildir). Bu araçla farklı sayfa aralıklarına farklı etiketleme düzenleri atayabilirsiniz: ön bölüm için Roma rakamları, ana metin için ondalık sayılar, harfli ekler ve daha fazlası. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Seçenekler paneli varsayılan olarak bir etiket kuralıyla açılır. +3. Her kuralı bir sayfa aralığı, stil, isteğe bağlı önek ve başlangıç değeriyle yapılandırın. +4. Farklı bölümler için ek kurallar oluşturmak üzere **Kural Ekle**'ye tıklayın. +5. Tüm kuralları uygulamak ve sonucu indirmek için **Sayfa Etiketleri Ekle**'ye tıklayın. + +## Seçenekler + +Her etiket kuralının şu ayarları vardır: + +- **Sayfa Aralığı** -- Kuralın hangi sayfalara uygulanacağı. Tüm sayfalar için boş bırakın. `1-4`, `7`, `odd` veya `1-9,30-40` gibi aralıkları destekler. +- **Etiket Stili** -- Ondalık Arap rakamı, küçük harfli Roma rakamı (i, ii, iii), büyük harfli Roma rakamı (I, II, III), küçük harf (a, b, c), büyük harf (A, B, C) veya Etiketsiz (yalnızca önek). +- **Etiket Öneki** -- Her etiketin başına eklenen isteğe bağlı metin; örneğin "A-" ile A-1, A-2, A-3 gibi etiketler oluşturulur. +- **Başlangıç Değeri** -- Saymaya başlanacak sayı. Varsayılan 1'dir. Sıfırdan başlayan numaralandırma için 0 yapın. +- **Ayrık aralıklarda numaralandırmaya devam et** -- Bir kural bitişik olmayan sayfaları hedeflediğinde (`1-9,30-40` veya `odd` gibi) ve numaralandırmanın sırayla devam etmesini istediğinizde bunu etkinleştirin. +- **Mevcut sayfa etiketlerini kaldır** -- Varsayılan olarak işaretlidir. Yeni kurallarınızı uygulamadan önce önceki etiketleri temizler. + +## Özellikler + +- Karmaşık numaralandırma düzenleri için belge başına birden fazla etiket kuralı +- Tüm standart numaralandırma sistemlerini kapsayan altı etiket stili +- Bölüm bazlı etiketleme için özel önek desteği +- Aşamalı numaralandırmayla ayrık aralık desteği +- Mevcut etiketleri koruma veya kaldırma seçeneği + +## Kullanım Alanları + +- Bir kitabın önsözü için Roma rakamı (i, ii, iii), ana metin için ondalık etiketler ayarlamak +- Ek sayfalarını "A-1", "A-2", "B-1", "B-2" gibi harf önekleriyle etiketlemek +- Fiziksel sayfa numaralarının PDF sayfa sırasıyla eşleşmediği taranmış bir belgedeki sayfa etiketlerini düzeltmek +- Teknik belgeler için sıfırdan başlayan numaralandırma eklemek + +## İpuçları + +- Sayfa etiketleri, PDF görüntüleyicilerin gezinme araç çubuğunda gösterdiği üst verilerdir. Sayfaya basılmazlar. Görünür numaralar için [Sayfa Numaraları](./page-numbers) aracını kullanın. +- Bu araç, WASM Ayarlarınızda CoherentPDF (CPDF) yapılandırılmış olmasını gerektirir. Kurulu değilse yapılandırmanız istenir. + +## İlgili Araçlar + +- [Sayfa Numaraları](./page-numbers) +- [Bates Numaralandırma](./bates-numbering) +- [Yer İşaretlerini Düzenle](./bookmark) diff --git a/docs/tr/tools/add-stamps.md b/docs/tr/tools/add-stamps.md new file mode 100644 index 00000000..cbfc5d22 --- /dev/null +++ b/docs/tr/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Damga Ekle +description: Kullanıcı adı ekli entegre bir açıklama araç çubuğuyla PDF sayfalarınıza görsel damgalar ekleyin. +--- + +# Damga Ekle + +Damga açıklama araç çubuğuna sahip gömülü bir görüntüleyici kullanarak PDF sayfalarınıza görsel damgalar yerleştirin. Damgalar ad bilginizi içerebilir; bu da onay iş akışları, inceleme süreçleri ve belge işaretleme için kullanışlıdır. + +## Nasıl Çalışır + +1. **Damga Kullanıcı Adı** alanına adınızı girin. Bu ad oluşturduğunuz damgalarda görünür. +2. PDF dosyanızı tıklayarak veya bırakma alanına sürükleyerek yükleyin. +3. Damga düzenleyici, belgeniz bir görüntüleyicide yüklenmiş olarak açılır. +4. Araç çubuğundaki görsel damga aracıyla herhangi bir sayfaya damga seçip yerleştirin. +5. Damgaları gerektiği gibi konumlandırın ve yeniden boyutlandırın. +6. Sonucu indirmek için **Damgalı PDF'yi Kaydet**'e tıklayın. + +## Özellikler + +- Damga odaklı açıklama araç çubuğuna sahip entegre PDF görüntüleyici +- Oluşturulan damgalarda kullanıcı adı bilgisi +- Herhangi bir sayfaya görsel damga yerleştirme +- Sürükle-bırak ile konumlandırma ve yeniden boyutlandırma +- Sayfa en-boy oranına göre otomatik görüntüleyici boyutlandırma +- Ad ve boyut bilgisiyle dosya gösterimi + +## Kullanım Alanları + +- İnceleme iş akışındaki belgelere "ONAYLANDI" veya "İNCELENDİ" görsel damgaları eklemek +- Resmi belgelere şirket mührü veya noter damgası görselleri yerleştirmek +- Sayfaları incelemeyi yapanın adını içeren "ALINDI" damgalarıyla işaretlemek +- Muayene raporlarına kalite kontrol damgaları eklemek + +## İpuçları + +- PDF'yi yüklemeden önce damga kullanıcı adınızı ayarlayın. Kullanıcı adı damga üst verisine gömülür. +- Görüntüleyici, en iyi görünüm için yüksekliğini PDF'nin ilk sayfasının en-boy oranına göre ayarlar. +- Görsel damgalar yerine metin tabanlı filigranlar için [Filigran Ekle](./add-watermark) aracını kullanın. + +## İlgili Araçlar + +- [PDF İmzala](./sign-pdf) +- [Filigran Ekle](./add-watermark) +- [PDF Düzenleyici](./edit-pdf) diff --git a/docs/tr/tools/add-watermark.md b/docs/tr/tools/add-watermark.md new file mode 100644 index 00000000..0a0ba632 --- /dev/null +++ b/docs/tr/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Filigran Ekle +description: Görsel sürükle-bırak düzenleyici ve canlı önizleme ile PDF sayfalarına metin veya görsel filigran ekleyin. +--- + +# Filigran Ekle + +Görsel bir düzenleyici kullanarak PDF sayfalarınıza metin veya görsel filigran ekleyin. Filigranı önizleme üzerinde doğrudan sürükleyerek konumlandırabilir, köşe tutamaçlarıyla yeniden boyutlandırabilir; opaklık, döndürme, yazı tipi ve rengi ayarlayabilirsiniz. Her sayfanın kendi filigran konumu olabilir veya aynı filigranı tüm sayfalara tek seferde uygulayabilirsiniz. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Düzenleyici, ilk sayfanın canlı önizlemesi ve sürüklenebilir bir filigran katmanıyla açılır. +3. Geçiş düğmelerini kullanarak **Metin** veya **Görsel** filigran modunu seçin. +4. Filigran ayarlarını kenar çubuğu panelinden yapılandırın. +5. Filigranı önizleme üzerinde tam istediğiniz yere sürükleyin. Yeniden boyutlandırmak için köşe tutamaçlarını kullanın. +6. Sayfa bazlı filigranlar ayarlamak için sayfalar arasında gezinin veya **Tüm sayfalara uygula** seçeneğini işaretli tutun. +7. İşlemek ve indirmek için **Filigran Ekle**'ye tıklayın. + +## Seçenekler + +**Metin filigranı ayarları:** + +- **Metin** -- Filigran metni (örn. "GİZLİ", "TASLAK"). +- **Yazı Boyutu** -- 10 ile 200 punto arası. Varsayılan 72'dir. +- **Renk** -- Renk seçici ile herhangi bir renk. +- **Opaklık** -- Saydamlığı tamamen saydamdan tamamen opağa kadar ayarlayın. +- **Döndürme** -- Filigran metnini -180 ile 180 derece arasında döndürün. + +**Görsel filigranı ayarları:** + +- **Görsel Yükleme** -- Filigran olarak kullanılacak bir PNG, JPG veya başka bir görsel dosyası yükleyin. +- **Opaklık** -- Görsel saydamlığını ayarlayın. +- **Ölçek** -- Görsel filigranı yeniden boyutlandırın. + +**Düzen ayarları:** + +- **Tek** -- Sayfa başına bir filigran; sürükleyerek veya konum ön ayarlarıyla konumlandırılır. +- **Döşemeli** -- Filigranı tüm sayfa boyunca döndürme açısını izleyen çapraz bir ızgarada tekrarlar, böylece işaret belgeyi kenardan kenara kaplar. +- **Yatay boşluk** -- Metin yönündeki döşemeler arasındaki aralık, filigran genişliğinin yüzdesi olarak (yalnızca döşemeli mod). +- **Dikey boşluk** -- Döşeme satırları arasındaki aralık, filigran yüksekliğinin yüzdesi olarak (yalnızca döşemeli mod). + +**Genel ayarlar:** + +- **Tüm sayfalara uygula** -- İşaretlendiğinde aynı filigran her sayfaya uygulanır. Sayfa başına ayrı filigranlar için işareti kaldırın. +- **Sayfa Aralığı** -- Filigranın hangi sayfalara ekleneceğini belirtin (örn. "1-3, 5, 7-9" veya "all"). + +## Özellikler + +- Canlı PDF önizlemesinde görsel sürükle-bırak konumlandırma +- Köşe tutamaçlarıyla yeniden boyutlandırılabilir filigran +- Metin ve görsel filigran modları +- Ayarlanabilir aralıklı tek veya tüm sayfaya döşemeli (tekrarlayan) düzen +- Sayfa bazlı veya genel filigran uygulama +- Önizlemede sayfa sayfa gezinme +- Opaklık ve döndürme kontrolleri +- Sayfa aralığı filtreleme + +## Kullanım Alanları + +- İnceleme için dağıtmadan önce taslak belgeleri "TASLAK" ile işaretlemek +- Hassas mali raporlara "GİZLİ" filigranları eklemek +- Belgeleri şirket logosu görsel filigranıyla markalamak +- Potansiyel müşterilerle paylaşılan ürün belgelerine "ÖRNEK" damgası basmak +- Dağıtılan PDF materyallerine telif hakkı bildirimleri eklemek + +## İpuçları + +- Sayfa boyunca çapraz filigranlar için döndürmeyi yaklaşık 45 dereceye ayarlayın ve yazı boyutunu artırın. +- Döşemeli mod, kırpıldıktan sonra belgenin yeniden kullanılmasını çok zorlaştırır; çünkü bir işareti kaldırmak onlarca işareti geride bırakır. Döşeme yaparken alttaki metnin okunabilir kalması için opaklığı düşürün. +- Saydam arka planlı görsel filigranlar (PNG biçimi) belge içeriğiyle daha doğal bir şekilde karışır. +- Farklı sayfalarda farklı filigran metni gerekiyorsa "Tüm sayfalara uygula" işaretini kaldırın ve sayfa sayfa gezinin. + +## İlgili Araçlar + +- [Üst Bilgi & Alt Bilgi](./header-footer) +- [Damga Ekle](./add-stamps) +- [Bates Numaralandırma](./bates-numbering) +- [PDF İmzala](./sign-pdf) diff --git a/docs/tr/tools/adjust-colors.md b/docs/tr/tools/adjust-colors.md new file mode 100644 index 00000000..acbb390f --- /dev/null +++ b/docs/tr/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Renkleri Ayarla +description: PDF'inizdeki parlaklık, kontrast, doygunluk, ton, sıcaklık, renk tonu, gama ve sepya değerlerini ince ayarlayın. +--- + +# Renkleri Ayarla + +PDF'ler için eksiksiz bir renk derecelendirme araç seti. Parlaklık, kontrast, doygunluk, ton kaydırma, sıcaklık, renk tonu, gama ve sepya olmak üzere sekiz bağımsız parametreyi, her kaydırıcıyı oynattıkça güncellenen canlı önizlemeyle ayarlayın. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Düzenleyici, ilk sayfanın önizlemesi ve bir renk ayarları paneliyle açılır. +3. Her renk parametresini ayarlamak için kaydırıcıları hareket ettirin. Önizleme gerçek zamanlı güncellenir. +4. Tüm kaydırıcıları varsayılan konumlarına döndürmek için **Sıfırla**'ya tıklayın. +5. Tüm sayfaları işlemek ve ayarlanmış PDF'yi indirmek için **Uygula**'ya tıklayın. + +## Seçenekler + +- **Parlaklık** -- Tüm sayfayı aydınlatın veya karartın (-100 ile +100 arası). +- **Kontrast** -- Açık ve koyu alanlar arasındaki farkı artırın veya azaltın (-100 ile +100 arası). +- **Doygunluk** -- Renk yoğunluğunu artırın veya azaltın (-100 ile +100 arası). -100 yapmak gri tonlamalı bir sonuç üretir. +- **Ton Kaydırma** -- Tüm renkleri eşit şekilde kaydırmak için renk çemberini döndürün. +- **Sıcaklık** -- Renkleri daha sıcak (sarı/turuncu) veya daha soğuk (mavi) yöne kaydırın. +- **Renk Tonu** -- Yeşil veya macenta bir ton ekleyin. +- **Gama** -- Gama eğrisiyle orta ton parlaklığını ayarlayın. 1,0'ın altındaki değerler orta tonları karartır; 1,0'ın üstündeki değerler aydınlatır. +- **Sepya** -- Klasik bir sepya tonu efekti uygulayın. Yüksek değerler daha güçlü bir kahverengi ton üretir. + +## Özellikler + +- Sekiz bağımsız ayarlanabilir renk parametresi +- Kaydırıcı değişikliklerine anında yanıt veren canlı önizleme +- Varsayılanlara hızla dönmek için sıfırlama düğmesi +- Belgedeki tüm sayfaları işler +- Her PDF içeriğiyle çalışır (metin, görseller, grafikler) + +## Kullanım Alanları + +- Karanlık bir taramayı aydınlatmak veya fazla pozlanmış sayfaları düzeltmek +- Yazdırmadan önce mürekkep kullanımını azaltmak için renkli bir belgenin doygunluğunu düşürmek +- Sertifika veya ödüllere antika bir görünüm kazandırmak için sepya tonu uygulamak +- PDF'ye gömülü fotoğrafların renk sıcaklığını düzeltmek +- Soluk veya düşük kaliteli taranmış belgelerde kontrastı artırmak + +## İpuçları + +- Hızlı gri tonlamaya dönüştürme için doygunluk kaydırıcısını tamamen -100'e çekin. +- Gama kaydırıcısı, orta tonların çok koyu veya çok açık olduğu taranmış belgelerin okunabilirliğini artırmak için özellikle yararlıdır. +- Diğer görsel efekt araçları gibi bu araç da her sayfayı rasterleştirir. Çıktı görsel tabanlı olur, bu nedenle metin seçilemez. + +## İlgili Araçlar + +- [Renkleri Ters Çevir](./invert-colors) +- [Tarayıcı Efekti](./scanner-effect) +- [Arka Plan Rengi](./background-color) diff --git a/docs/tr/tools/alternate-merge.md b/docs/tr/tools/alternate-merge.md new file mode 100644 index 00000000..127e9d0c --- /dev/null +++ b/docs/tr/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Sayfaları Karıştır & Birleştir +description: Her dosyadan sayfaları dönüşümlü sırayla araya yerleştirerek PDF'leri birleştirin, yer işaretleri korunur. +--- + +# Sayfaları Karıştır & Birleştir + +Sayfaların belgeler arasında dönüşümlü olması için birden fazla PDF dosyasının sayfalarını iç içe geçirin. Standart birleştirme dosyaları uç uca eklerken, A Dosyası'nın 1. sayfası, sonra B Dosyası'nın 1. sayfası, sonra A Dosyası'nın 2. sayfası ve böyle devam eden bir sıra gerektiğinde başvuracağınız araç budur. + +## Nasıl Çalışır + +1. Bırakma alanını kullanarak en az iki PDF dosyası yükleyin. +2. Araç her dosyayı sayfa sayısı ve dosya boyutuyla gösterir. +3. İç içe geçirme sırasında hangi dosyanın sayfalarının önce geleceğini değiştirmek için tutamaçları sürükleyin. +4. İç içe geçirilmiş çıktıyı üretmek için **Sayfaları Karıştır**'a tıklayın. +5. Sonuç `alternated-mixed.pdf` olarak indirilir. + +## Özellikler + +- Herhangi sayıda PDF'nin sayfalarını iç içe geçirir (en az iki) +- İç içe geçirme önceliğini belirlemek için dosyaları sürükle-bırak ile yeniden sıralama +- Kaynak belgelerdeki yer işaretlerini korur +- Yüklenen her dosya için sayfa sayısını ve dosya boyutunu gösterir +- Duyarlı bir arayüz için özel bir web worker üzerinden işler + +## Kullanım Alanları + +- Tek ve çift sayfaların ayrı ayrı tarandığı çift taraflı taramaları yeniden birleştirmek +- Soru kâğıtlarını cevap anahtarlarıyla birleştirip her sorunun ardından cevabının gelmesini sağlamak +- İki dilli belgeleri sayfa sayfa birleştirmek (örn. bir yüzde İngilizce, diğerinde çevirisi) +- Tek taraflı tarayıcıdan gelen ön ve arka taramaları iç içe geçirmek + +## İpuçları + +- Kaynak PDF'lerin sayfa sayıları farklıysa, kısa belgenin sayfaları önce biter ve uzun belgenin kalan sayfaları sonda yer alır. +- Dosya sırası önemlidir: listedeki ilk dosya çıktının ilk sayfasını sağlar. Gerekirse yeniden düzenlemek için sürükleyin. + +## İlgili Araçlar + +- [PDF Birleştir](./merge-pdf) +- [Çoğalt & Düzenle](./organize-pdf) +- [PDF Böl](./split-pdf) diff --git a/docs/tr/tools/background-color.md b/docs/tr/tools/background-color.md new file mode 100644 index 00000000..b368a51d --- /dev/null +++ b/docs/tr/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Arka Plan Rengi +description: Tüm içeriği koruyarak PDF'inizdeki her sayfanın arka plan rengini değiştirin. +--- + +# Arka Plan Rengi + +PDF'inizdeki tüm mevcut içeriğin arkasına düz bir arka plan rengi ayarlayın. Araç her sayfada renkli bir dikdörtgen oluşturur ve özgün içeriği üstüne yerleştirir; böylece metin, görseller ve grafikler yeni arka planın üzerinde tamamen görünür kalır. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Renk seçiciyle bir arka plan rengi seçin. Varsayılan açık sarıdır (#FFFFCC). +3. İşlemek için **Arka Plan Rengini Değiştir**'e tıklayın. +4. Güncellenmiş PDF otomatik olarak indirilir. + +## Seçenekler + +- **Arka Plan Rengi** -- Herhangi bir düz rengi seçmek için standart renk seçici. Varsayılan açık sarıdır. + +## Özellikler + +- Her sayfaya tek tip bir arka plan rengi uygular +- Tüm özgün içeriği (metin, görseller, vektör grafikler) renkli katmanın üzerinde korur +- Özgün sayfa boyutlarını korur +- Her sayfa sayısındaki belgelerle çalışır + +## Kullanım Alanları + +- Belgelere daha yumuşak, kâğıt benzeri bir görünüm vermek için açık krem veya fildişi arka plan eklemek +- Farklı kategorilere farklı arka plan renkleri uygulayarak belge setlerini renk koduyla ayırmak +- Aynı belgenin farklı kitleler için görsel olarak ayırt edilebilir sürümlerini oluşturmak +- Belgeleri ekranda yansıtırken okunabilirliği artırmak için açık bir arka plan tonu eklemek + +## İpuçları + +- Açık, soluk renkler en iyi sonucu verir. Metin zaten açık renkli değilse çok koyu bir arka plan metni okunmaz hale getirebilir. +- Hem arka plan hem metin rengini değiştirmek istiyorsanız önce arka plan rengini uygulayın, ardından sonuç üzerinde [Metin Rengini Değiştir](./text-color) aracını kullanın. +- Bu araç PDF yapısal düzeyinde çalışır (rasterleştirme değil), bu nedenle çıktıdaki metin seçilebilir ve aranabilir kalır. + +## İlgili Araçlar + +- [Metin Rengini Değiştir](./text-color) +- [Renkleri Ters Çevir](./invert-colors) +- [Renkleri Ayarla](./adjust-colors) diff --git a/docs/tr/tools/bates-numbering.md b/docs/tr/tools/bates-numbering.md new file mode 100644 index 00000000..d5668f06 --- /dev/null +++ b/docs/tr/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates Numaralandırma +description: Özelleştirilebilir şablonlar, dolgu, yazı tipleri ve konumlandırmayla bir veya birden fazla PDF'ye Bates numaraları uygulayın. +--- + +# Bates Numaralandırma + +Bates numaralandırma, PDF'lerinizin her sayfasına sıralı tanımlayıcılar basar. Hukuki süreçlerde, denetimlerde ve uyumluluk iş akışlarında belgeleri etiketlemenin standart yöntemidir. Bu araç birden fazla dosyayı ve özelleştirilebilir şablonları destekler; ayrı ayrı numaralandırılmış PDF'ler veya tek bir ZIP arşivi üretir. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. Aynı anda birden fazla dosya sürükleyebilirsiniz. +2. Bir stil ön ayarı seçin veya özel bir şablon oluşturun. +3. Konumu, yazı tipini, boyutu, rengi ve başlangıç numaralarını yapılandırın. +4. İşlemek için **Bates Numaralarını Uygula**'ya tıklayın. +5. Tek dosya doğrudan indirilir. Birden fazla dosya ZIP arşivi olarak indirilir. + +## Seçenekler + +- **Stil Ön Ayarı** -- Yerleşik biçimlerden birini seçin: + - Exhibit + Case + Bates + Page (örn. "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (sayfa numarasız) + - Case + Bates + - Yalnızca Bates Numarası (örn. "000001") + - Özel (kendi şablonunuzu yazın) +- **Stili Özelleştir** -- Yer tutucular kullanan bir şablon dizesi: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Bates Dolgusu** -- Sıfır dolgulu Bates numaraları için basamak sayısı (3 ile 6 arası). Yalnızca özel modda görünür. +- **Konum** -- Üst bilgi veya Alt bilgi; Sol, Orta veya Sağ. +- **Bates Başlangıcı** -- İlk Bates numarası. Varsayılan 1'dir. Numaralandırma dosyalar arasında devam eder. +- **Dosya Sayacı Başlangıcı** -- `[FILE]` yer tutucusu için başlangıç numarası. +- **Yazı Tipi** -- Helvetica, Times New Roman veya Courier. +- **Yazı Boyutu** -- Basılan metnin boyutu. +- **Renk** -- Bates numarası metni için renk seçici. + +## Özellikler + +- Bates numaralarının yüklenen tüm dosyalarda nasıl görüneceğini gösteren canlı önizleme +- Belgeler arasında kesintisiz numaralandırmayla çoklu dosya desteği +- Numaralandırma sırasını belirlemek için sürükle-bırak dosya yeniden sıralama +- Altı konum seçeneği (üst bilgi/alt bilgi, sol/orta/sağ) +- Farklı sayfa boyutlarına uyan uyarlanabilir kenar boşluğu hesaplaması +- Çoklu dosya toplu işlemleri için ZIP çıktısı +- Azami esneklik için şablon yer tutucuları + +## Kullanım Alanları + +- Dava keşif belgelerine sıralı delil numaraları basmak +- Onlarca dosyaya yayılan denetim kanıt paketlerini numaralandırmak +- Uyumluluk belgelerine düzenleyici referans numaraları uygulamak +- Patent başvurusu eklerini davaya özgü tanımlayıcılarla etiketlemek + +## İpuçları + +- İşlemeden önce sıralarını değiştirmek için dosya listesindeki dosyaları sürükleyin. Bates numaralandırma sırası bu sırayı izler. +- Basılan metne özgün dosya adını eklemek için `[FILENAME]` yer tutucusunu kullanın; bu, sayfaları kaynak belgelere kadar izlemenize yardımcı olur. +- Önizleme kutusu ayarları değiştirdikçe gerçek zamanlı güncellenir, böylece işlemeden önce biçimi doğrulayabilirsiniz. + +## İlgili Araçlar + +- [Sayfa Numaraları](./page-numbers) +- [Sayfa etiketleri ekle](./add-page-labels) +- [Üst Bilgi & Alt Bilgi](./header-footer) diff --git a/docs/tr/tools/bmp-to-pdf.md b/docs/tr/tools/bmp-to-pdf.md new file mode 100644 index 00000000..f004779d --- /dev/null +++ b/docs/tr/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP'den PDF'ye +description: BMP bit eşlem görsellerini doğrudan tarayıcınızda PDF biçimine dönüştürün, hiçbir sunucuya yükleme gerekmez. +--- + +# BMP'den PDF'ye + +Windows Bitmap (BMP) dosyalarını PDF'ye dönüştürün. BMP, eski sistemlerde, tıbbi görüntülemede ve endüstriyel tarayıcılarda hâlâ bulunan sıkıştırılmamış bir görsel biçimidir. Bu araç, hiçbir şey kurmanıza gerek kalmadan bunları PDF'ye dönüştürür. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------- | +| BMP | `.bmp` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya BMP dosyalarınızı sürükleyip bırakın. +2. Dosya listesini gözden geçirin. Daha fazla dosya ekleyin veya istenmeyenleri kaldırın. +3. **PDF'ye Dönüştür**'e tıklayın. Çıktı `from_bmps.pdf` olarak indirilir. + +Her BMP bir tuvale çizilir, PNG olarak dışa aktarılır ve ardından pdf-lib kullanılarak PDF'ye gömülür. Sayfa boyutu özgün görsel boyutlarıyla eşleşir. + +## Seçenekler + +Bu araç ek kalite ayarları sunmaz. Görseller PDF içinde özgün çözünürlüklerinde, kayıpsız PNG olarak gömülür. + +## Kullanım Alanları + +- BMP olarak saklanan eski taranmış belgeleri arşivlik PDF'lere dönüştürmek +- Eski Windows uygulamalarından alınan BMP ekran görüntülerini paylaşılabilir belgelere çevirmek +- Varsayılan olarak BMP üreten tıbbi veya endüstriyel tarayıcı çıktılarını işlemek +- Eski görsel arşivlerini daha taşınabilir bir biçime aktarmak + +## İpuçları + +- BMP dosyaları sıkıştırılmadığı için genellikle büyüktür. Görseller dahili olarak PNG olarak yeniden kodlandığı için ortaya çıkan PDF belirgin şekilde daha küçük olur. +- BMP dosyalarınızla birlikte başka görsel biçimleriniz de varsa, her şeyi tek seferde dönüştürmek için [Görselden PDF'ye](./image-to-pdf) aracını kullanın. + +## İlgili Araçlar + +- [Görselden PDF'ye](./image-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) +- [TIFF'den PDF'ye](./tiff-to-pdf) diff --git a/docs/tr/tools/bookmark.md b/docs/tr/tools/bookmark.md new file mode 100644 index 00000000..e5e7197f --- /dev/null +++ b/docs/tr/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Yer İşaretlerini Düzenle +description: Görsel bir düzenleyici ve CSV/JSON desteğiyle PDF yer işaretlerini ekleyin, düzenleyin, içe ve dışa aktarın, silin. +--- + +# Yer İşaretlerini Düzenle + +Yer işareti düzenleyici, PDF gezinme yer işaretleri (ana hatlar olarak da bilinir) üzerinde tam denetim sağlar. Yeni yer işaretleri ekleyebilir, mevcut olanları düzenleyebilir, hiyerarşiyi yeniden düzenleyebilir ve yer işareti verilerini CSV ve JSON biçimlerinde içe veya dışa aktarabilirsiniz. + +## Nasıl Çalışır + +1. Bir dosyaya tıklayarak veya bırakma alanına sürükleyerek PDF'nizi yükleyin. +2. İsterseniz belgenin mevcut yer işareti ağacını almak için **Mevcut yer işaretlerini otomatik çıkar** seçeneğini işaretleyin. +3. Düzenleyici bölünmüş görünümde açılır: solda PDF görüntüleyici, sağda yer işareti paneli. +4. Bir yer işareti başlığı yazın ve geçerli sayfayı gösteren yeni bir yer işareti oluşturmak için **Sayfaya Ekle**'ye tıklayın. +5. Yer işaretlerini yeniden düzenlemek, biçimlendirmek veya silmek için araç çubuğu düğmelerini kullanın. +6. Güncellenen dosyayı indirmek için **PDF'yi Yer İşaretleriyle Kaydet**'e tıklayın. + +## Özellikler + +- Sayfa gezintisi, yakınlaştırma denetimleri ve sayfaya git alanı olan görsel PDF görüntüleyici +- Tek tıklamayla herhangi bir sayfaya yer işareti ekleme +- Kesin bir yer işareti hedefi belirlemek için doğrudan PDF üzerine tıklama (seçme modu) +- Sürükle ve bırak ile yeniden sıralanabilen iç içe yer işareti hiyerarşisi +- Toplu işlemler: rengi veya stili değiştirmek ya da silmek için birden çok yer işareti seçin +- Büyük ağaçlarda girdileri hızla bulmak için yer işareti araması +- Tüm değişiklikler için geri alma ve yineleme desteği +- Yer işaretlerini CSV (başlık, sayfa, düzey) veya JSON dosyalarından içe aktarma +- Harici düzenleme için yer işaretlerini CSV veya JSON olarak dışa aktarma +- Yer işareti biçimlendirme: renk (kırmızı, mavi, yeşil, sarı, mor) ve yazı stili (kalın, italik, kalın italik) +- Hızlı gezinme: sayfa yukarı/aşağı tuşlarıyla sayfalarda ilerleme + +## Seçenekler + +- **Mevcut yer işaretlerini otomatik çıkar**: İşaretlendiğinde araç, yükleme sırasında PDF'nin mevcut yer işaretlerini okur ve görüntüler. +- **Toplu Mod**: Birden çok yer işareti seçip toplu renk, stil veya silme işlemleri uygulamak için açın. +- **Tümünü Genişlet/Daralt**: İç içe yer işaretlerini hızla gösterin veya gizleyin. + +## Kullanım Alanları + +- Yer işareti bulunmayan bir ders kitabına veya kılavuza içindekiler tablosu eklemek +- OCR işleminden sonra taranmış bir belgedeki yer işaretlerini yeniden yapılandırmak +- Yer işaretlerini CSV olarak dışa aktarıp bir e-tabloda düzenlemek, ardından yeniden içe aktarmak +- Yanlış sayfa referansları olan otomatik oluşturulmuş yer işaretlerini temizlemek +- Bir hukuki dilekçedeki önemli bölümleri işaretlemek için renkli yer işaretleri eklemek + +## İpuçları + +- Toplu yer işareti oluşturmak için CSV içe aktarmayı kullanın. Biçim basittir: `title,page,level`, burada düzey 1 üst düzeydir. +- Seçme modu, yer işareti hedefini belirlemek için PDF sayfasında tam bir noktaya tıklamanızı sağlar; bu, yalnızca sayfa numarasını hedeflemekten daha kesindir. +- Büyük değişiklikler yapmadan önce yedek olması için yer işaretlerinizi dışa aktarın. + +## İlgili Araçlar + +- [İçindekiler](./table-of-contents) +- [PDF Düzenleyici](./edit-pdf) +- [Sayfa etiketleri ekle](./add-page-labels) diff --git a/docs/tr/tools/cbz-to-pdf.md b/docs/tr/tools/cbz-to-pdf.md new file mode 100644 index 00000000..bcd4ea4a --- /dev/null +++ b/docs/tr/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ'den PDF'ye +description: CBZ ve CBR çizgi roman arşivlerini tarayıcınızda PDF'ye dönüştürün. Ücretsiz, gizli, yükleme gerekmez. +--- + +# CBZ'den PDF'ye + +Çizgi roman arşiv dosyalarını PDF'ye dönüştürün. CBZ ve CBR, dijital çizgi romanlar için standart biçimlerdir: görsellerle dolu ZIP veya RAR arşivlerinden ibarettirler. Bu araç her sayfayı çıkarır, okuma sırasını korur ve her görselin tam boyutlu bir sayfa olduğu temiz bir PDF üretir. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---- | :----- | :---------------------------------------------------------- | +| CBZ | `.cbz` | ZIP tabanlı çizgi roman arşivi (pdf-lib ile yerel işlenir) | +| CBR | `.cbr` | RAR tabanlı çizgi roman arşivi (PyMuPDF motoru ile işlenir) | + +CBZ dönüştürücü, arşiv içindeki JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC ve JXL görsellerini tanır. Standart olmayan biçimler gömülmeden önce otomatik olarak PNG'ye dönüştürülür. + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya CBZ ya da CBR dosyalarınızı sürükleyip bırakın. Tek bir toplu işte iki biçimi birlikte kullanabilirsiniz. +2. Listelenen dosyaları gözden geçirin. İstemediklerinizi kaldırın veya daha fazla eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. **PDF'ye Dönüştür**'e tıklayın. CBZ dosyaları için araç arşivi açar, görsel dosyalarını doğal sırayla ada göre sıralar, her görselin gerçek biçimini algılar ve pdf-lib ile bir PDF'ye gömer. CBR dosyaları bunun yerine PyMuPDF motoru üzerinden işlenir. +4. Tek dosya PDF olarak iner. Birden çok dosya, `comic-converted.zip` adlı bir ZIP arşivi oluşturur. + +## Seçenekler + +Yapılandırma gerekmez. Her görsel, özgün boyutlarına uygun bir sayfa olur; böylece çift sayfa açılımlar geniş, tek sayfalar dar kalır. + +## Kullanım Alanları + +- PDF'yi destekleyen ama CBZ/CBR'yi desteklemeyen bir tablet veya telefon uygulamasında çizgi roman okumak +- Dijital bir çizgi romanın belirli sayfalarını yazdırmak +- Bir çizgi roman koleksiyonunu her dosya görüntüleyicinin açabildiği bir biçimde arşivlemek +- Özel bir çizgi roman okuyucusu olmayan biriyle çizgi roman paylaşmak + +## İpuçları + +- Arşivdeki görseller doğal sıralamayla sıralanır (böylece `page2.jpg`, `page10.jpg` dosyasından önce gelir). Doğru sayfa sırası için dosyalarınızı tutarlı numaralandırın. +- Dönüştürücü görsel biçimlerini dosya uzantılarına göre değil, ikili imzalarına göre algılar. Yanlışlıkla `.jpg` olarak adlandırılmış bir PNG yine de doğru şekilde gömülür. +- CBZ dosyaları PyMuPDF motoru yüklenmeden tamamen tarayıcıda işlenir, bu yüzden CBR dosyalarından daha hızlı dönüşür. + +## İlgili Araçlar + +- [EPUB'dan PDF'ye](./epub-to-pdf) +- [MOBI'den PDF'ye](./mobi-to-pdf) +- [Görselden PDF'ye](./image-to-pdf) diff --git a/docs/tr/tools/change-permissions.md b/docs/tr/tools/change-permissions.md new file mode 100644 index 00000000..fc50b0ba --- /dev/null +++ b/docs/tr/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: İzinleri Değiştir +description: Yazdırma, kopyalama, düzenleme ve açıklama ekleme için PDF kullanım izinlerini ayarlayın veya değiştirin. 256 bit AES şifreleme kullanır. +--- + +# İzinleri Değiştir + +PDF'nizle alıcıların neler yapabileceğini ince ayarlarla belirleyin. Dosyayı yalnızca bir parolayla kilitleyen temel şifrelemenin aksine bu araç, yazdırma, kopyalama, düzenleme, açıklama ekleme, form doldurma, belge birleştirme ve sayfa çıkarma işlemlerine tek tek izin vermenizi veya bunları engellemenizi sağlar. Hepsi 256 bit AES şifrelemeyle uygulanır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. PDF zaten şifreliyse **Geçerli Parola**'yı girin. +3. Bir **Yeni Kullanıcı Parolası** (açmak için gerekir) ve/veya **Yeni Sahip Parolası** (izinleri denetler) belirleyin. +4. Onay kutularıyla tek tek izinleri açıp kapatın. +5. **İzinleri Değiştir**'e tıklayın. +6. Güncellenen PDF'yi indirin. + +Her iki yeni parola alanını da boş bırakırsanız araç PDF'nin şifresini tamamen çözer ve tüm şifrelemeyi ve kısıtlamaları kaldırır. + +## İzin Denetimleri + +| İzin | Neyi Denetler | +| -------------------------------- | ------------------------------------------------------------------------------------------- | +| **Yazdırmaya İzin Ver** | Belgenin yazdırılıp yazdırılamayacağı | +| **Kopyalamaya İzin Ver** | Metin ve görsellerin seçilip kopyalanıp kopyalanamayacağı | +| **Değiştirmeye İzin Ver** | Belge içeriğinin düzenlenip düzenlenemeyeceği | +| **Açıklama Eklemeye İzin Ver** | Yorum, vurgu ve damga eklenip eklenemeyeceği | +| **Form Doldurmaya İzin Ver** | Etkileşimli form alanlarının doldurulup doldurulamayacağı | +| **Belge Birleştirmeye İzin Ver** | Sayfaların eklenip eklenemeyeceği, silinip silinemeyeceği veya döndürülüp döndürülemeyeceği | +| **Sayfa Çıkarmaya İzin Ver** | Tek tek sayfaların çıkarılıp çıkarılamayacağı | + +Tüm izinlerin uygulanması için bir sahip parolası gerekir. Sahip parolası olmadan izin bayrakları çoğu PDF okuyucusu tarafından yok sayılır. + +## PDF'de İzinler Nasıl Çalışır + +PDF izinleri şifreleme belirtiminin bir parçasıdır. Şifreleme sözlüğünde bit bayrakları olarak saklanır ve uyumlu PDF okuyucuları tarafından uygulanır. Temel fark şudur: + +- **Kullanıcı parolası**: Dosyayı açmak için gereklidir. +- **Sahip parolası**: İzinleri değiştirmek veya kısıtlamaları kaldırmak için gereklidir. Bu parola olmadan izin bayrakları, kullanıcının hangi işlemleri yapabileceğini belirler. + +Yalnızca bir sahip parolası belirlerseniz (kullanıcı parolası olmadan) herkes dosyayı açabilir ancak izin verilen işlemlerle sınırlıdır. İkisini de belirlerseniz dosyanın açılması için parola gerekir ve kimlik doğrulamadan sonra da kısıtlıdır. + +## Kullanım Alanları + +- Görüntülenip yazdırılabilen ancak düzenlenemeyen veya kopyalanamayan bir rapor dağıtmak +- Alıcıların doldurabildiği ama değiştiremediği bir sözleşme şablonu paylaşmak +- Görsellerin kopyalanmasının engellendiği bir PDF kataloğu yayımlamak +- Bir inceleme taslağında yapısal değişiklikleri engellerken açıklama eklemeye izin vermek + +## İpuçları + +- Etkili olması için her zaman bir sahip parolası belirleyin. Sahip parolası olmayan izinler uygulanamaz. +- Bazı üçüncü taraf PDF araçları izin bayraklarını yok sayar. Daha güçlü koruma için PDF'yi rasterleştirmeyi veya DRM kullanmayı düşünün. +- Eski RC4 ile şifrelenmiş PDF'leri AES-256'ya yükseltmek için bu aracı kullanın. + +## İlgili Araçlar + +- [PDF'yi Parolayla Koru](./protect-pdf): ayrıntılı izinler olmadan basit parola koruması +- [PDF Kilidini Aç](./unlock-pdf): şifrelemeyi tamamen kaldırın +- [Kısıtlamaları Kaldır](./remove-restrictions): sahip parolasına sahipseniz tüm kısıtlamaları kaldırın diff --git a/docs/tr/tools/combine-single-page.md b/docs/tr/tools/combine-single-page.md new file mode 100644 index 00000000..80423432 --- /dev/null +++ b/docs/tr/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Tek Sayfada Birleştir +description: Bir PDF'nin tüm sayfalarını tek bir sürekli dikey veya yatay kaydırmada birleştirin. +--- + +# Tek Sayfada Birleştir + +Bir PDF'nin tüm sayfalarını tek, uzun bir sayfada birleştirin. Sayfalar dikey (bir tomar gibi) veya yatay (yan yana) olarak art arda eklenir ve çıktıda tek bir sürekli sayfa oluşur. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Yerleşim yönünü seçin: **Dikey** (sayfalar yukarıdan aşağıya yığılır) veya **Yatay** (sayfalar yan yana yerleşir). +3. Sayfalar arasındaki boşluğu punto olarak ayarlayın. +4. Sayfalar arasındaki boşluklar için bir arka plan rengi seçin. +5. İsterseniz ayırıcıları (sayfalar arasında ince çizgiler) etkinleştirin ve kalınlıklarını ile renklerini ayarlayın. +6. İşlem düğmesine tıklayın. Çıktı tek sayfalık bir PDF'dir. + +## Özellikler + +- Dikey veya yatay sayfa birleştirme +- Ayarlanabilir sayfa aralığı +- Boşluk alanları için arka plan rengi seçici +- Kalınlığı ve rengi ayarlanabilen isteğe bağlı ayırıcı çizgiler +- Her özgün sayfayı birleşik tuvale tam çözünürlükte işler + +## Seçenekler + +| Seçenek | Açıklama | +| --------------------- | ----------------------------------------------- | +| **Yön** | Dikey (yığılı) veya Yatay (yan yana) | +| **Sayfa aralığı** | Sayfalar arasındaki boşluk, punto olarak | +| **Arka plan rengi** | Sayfalar arasındaki alanın rengi | +| **Ayırıcı ekle** | Sayfalar arasındaki ince çizgileri açıp kapatır | +| **Ayırıcı kalınlığı** | Çizgi kalınlığı, punto olarak | +| **Ayırıcı rengi** | Ayırıcı çizgilerin rengi | + +## Kullanım Alanları + +- Çok sayfalı bir tel kafes veya tasarım maketinden tek uzun bir görsel oluşturmak +- Bir belgenin web'e gömülmek üzere sürekli kaydırılabilir görünümünü üretmek +- Çok sayfalı bir çizgi romanı veya storyboard'u tek bir şerit hâlinde birleştirmek +- İnceleme için ardışık sayfaların panoramik görünümünü oluşturmak + +## İpuçları + +- Dikey yön, dikey sayfalı belgelerde en iyi sonucu verir. Yatay yön, yatay biçimli içerikler için daha uygundur. +- Çok sayfalı büyük belgeler çok uzun veya çok geniş bir çıktı üretir. Bazı PDF görüntüleyiciler aşırı büyük tek sayfalarda zorlanabilir. +- Zıt renkli ayırıcılar eklemek, bir özgün sayfanın nerede bitip diğerinin nerede başladığını görmeyi kolaylaştırır. + +## İlgili Araçlar + +- [N'li PDF](./n-up-pdf) +- [PDF Birleştir](./merge-pdf) +- [Sayfaları Böl](./divide-pages) diff --git a/docs/tr/tools/compare-pdfs.md b/docs/tr/tools/compare-pdfs.md new file mode 100644 index 00000000..e33def6a --- /dev/null +++ b/docs/tr/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: PDF'leri Karşılaştır +description: İki PDF belgesini yan yana veya bindirme modunda, ayrıntılı değişiklik algılama ve kategorilendirmeyle karşılaştırın. +--- + +# PDF'leri Karşılaştır + +İki PDF yükleyin ve aralarında tam olarak nelerin değiştiğini görün. Araç sayfaları akıllıca eşleştirir; metin, görsel, açıklama, üst bilgi ve biçimlendirmedeki farkları algılar ve bunları yan yana veya bindirme görünümünde sunar. + +## Nasıl Çalışır + +1. İki PDF dosyası yükleyin: özgün (sol) ve gözden geçirilmiş sürüm (sağ). +2. Araç, içerik imzalarını kullanarak belgeler arasındaki sayfaları eşleştirir. +3. Bir görünüm modu seçin: **Yan Yana** veya **Bindirme**. +4. Sayfalama denetimleriyle sayfa çiftleri arasında gezinin. +5. Farklar vurgulanır ve kategorilere ayrılır. Belirli değişiklik türlerine odaklanmak için filtre panelini kullanın. +6. İsterseniz karşılaştırmayı PDF raporu olarak dışa aktarın. + +## Özellikler + +- İçerik benzerliğine dayalı otomatik sayfa eşleştirme +- Yan yana ve bindirme karşılaştırma görünümleri +- Değişiklik kategorileri: metin, görsel, üst/alt bilgi, açıklama, biçimlendirme, arka plan +- Belirli değişiklik türlerini göstermek veya gizlemek için kategori başına filtre anahtarları +- Sorgu filtrelemeli metin değişikliği araması +- Taranmış belgeleri karşılaştırmak için OCR desteği +- Ayrıntılı inceleme için yakınlaştırma denetimleri +- Yan yana modda paneller arasında eşzamanlı kaydırma +- Karşılaştırma sonuçlarını PDF olarak dışa aktarma + +## Seçenekler + +| Seçenek | Açıklama | +| ----------------------- | --------------------------------------------------------------------------------------------------------------- | +| **Görünüm Modu** | Yan Yana veya Bindirme | +| **OCR** | Taranmış belge karşılaştırması için OCR'yi etkinleştirir/devre dışı bırakır | +| **OCR Dili** | OCR metin çıkarma dili | +| **Kategori Filtreleri** | Metin, görsel, üst/alt bilgi, açıklama, biçimlendirme ve arka plan değişikliklerinin görünürlüğünü açıp kapatır | +| **Değişiklik Kapsamı** | Bindirme modunda tüm değişiklikler veya yalnızca içerik arasında filtreleme yapar | +| **Yakınlaştırma** | Ayrıntılı inceleme için büyütme düzeyini ayarlar | + +## Kullanım Alanları + +- Sözleşme revizyonlarını inceleyerek sürümler arasında tam olarak neyin değiştiğini bulmak +- PDF dışa aktarımlarının beklentilerle uyuştuğunu doğrulamak için tasarım maketlerini karşılaştırmak +- Her düzenlemenin izlenmesi gereken düzenlemeye tabi sektörlerde belge değişikliklerini denetlemek +- Bir PDF dönüştürme sürecinin özgün içeriği doğru şekilde koruduğunu doğrulamak +- Çeviri belgelerini kaynakla karşılaştırıp yerleşim değişikliklerini kontrol etmek + +## İpuçları + +- Bindirme görünümü iki belgeyi üst üste koyar; böylece konumsal farklar (kaymış öğeler, yeniden boyutlandırılmış görseller) hemen görünür olur. +- Metin katmanı olmayan taranmış belgeleri karşılaştırırken OCR'yi etkinleştirin. Karşılaştırma motoru metni sayfa görsellerinden çıkarır. +- Önemli olana odaklanmak için kategori filtrelerini kullanın. Örneğin yalnızca metin içeriği farklarıyla ilgileniyorsanız biçimlendirme değişikliklerini gizleyin. + +## İlgili Araçlar + +- [Üst Veriyi Görüntüle](./view-metadata) +- [PDF'de OCR](./ocr-pdf) +- [PDF Birleştir](./merge-pdf) diff --git a/docs/tr/tools/compress-pdf.md b/docs/tr/tools/compress-pdf.md new file mode 100644 index 00000000..d2faaa9e --- /dev/null +++ b/docs/tr/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: PDF Sıkıştır +description: Hyper Compress motoruyla PDF dosya boyutunu %90'a kadar küçültün. Hedef dosya boyutlarını, toplu işlemeyi ve özel kalite ayarlarını destekler. +--- + +# PDF Sıkıştır + +PDF dosyalarınızı bozmadan küçültün. PDF Sıkıştır, BentoPDF'in kendi sıkıştırma motoru olan [Hyper Compress](https://www.bentopdf.com/hyper-compress) ile çalışır. Görselleri yeniden sıkıştırır, yazı tiplerini alt kümeleyip birleştirir ve gömülü küçük resimler ile özel uygulama verileri gibi gereksiz yükü temizler. PDF tamamen işlevsel kalır: metin seçilebilir olmaya devam eder, bağlantılar ve form alanları çalışmayı sürdürür. + +Hyper Compress WebAssembly'ye derlenir ve BentoPDF ile birlikte gelir; bu nedenle sıkıştırma ek kurulum gerektirmeden çevrimdışı ve hava boşluklu ortamlarda da çalışır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları sürükleyerek bir veya daha fazla PDF yükleyin. +2. Bir **Sıkıştırma Düzeyi** seçin: Düşük, Orta, Yüksek veya Kayıpsız. +3. İsterseniz bir **Hedef Dosya Boyutu** girin veya **Gri tonlamaya dönüştür** dahil ince ayarlar için **Özel Ayarlar**'ı genişletin. +4. **PDF Sıkıştır**'a tıklayın. Birden çok dosyada tek bir ZIP indirirsiniz. + +## Özel Belgeler + +- **Dijital olarak imzalanmış PDF'ler** değiştirilmeden döndürülür, çünkü her değişiklik imzayı geçersiz kılar. İmzaları kaldırıp sıkıştırmak için Özel Ayarlar altında **İçerik korumasını geçersiz kıl**'ı açın; görünür imza sayfada kalır ancak dosya artık imzalı değildir. +- **PDF/A dosyaları** sıkıştırmadan sonra PDF/A etiketini kaybeder; böylece dosya artık karşılamadığı bir uyumluluğu asla iddia etmez. Dosyanın uyumlu kalması için Özel Ayarlar altında **PDF/A'yı koru**'yu açın. +- **Parola korumalı PDF'ler** dosya kartında bir parola alanı alır. Parolayı oraya girin; Hyper Compress dosyayı kendisi açar, ayrı bir kilit açma adımı gerekmez. İki veya daha fazla kilitli dosya varsa, ortak bir alan aynı parolayı kullanan tüm dosyaların kilidini açar. Sıkıştırılmış kopyanın parolası yoktur; yeniden eklemek için [PDF'yi Parolayla Koru](./protect-pdf) aracını kullanın. +- **Metin katmanı olmayan taramalar**, Özel Ayarlar altındaki **Sayfaları rasterleştir** ile daha da küçülebilir; bu seçenek her sayfayı tek bir optimize edilmiş görselle değiştirir. OCR uygulanmış taramalar dahil, seçilebilir metni olan her belge için atlanır; ancak **İçerik korumasını geçersiz kıl** açıksa atlanmaz. O zaman metin sayfaları da görsele dönüşür, dolayısıyla metin seçilemez olur ve bağlantılar çalışmaz. + +## Sıkıştırma Düzeyleri + +| Düzey | Görsel Kalitesi | Maks. Çözünürlük | En Uygun Kullanım | +| ------------ | --------------------- | ---------------- | -------------------------------- | +| **Düşük** | 80 | 200 DPI | Görsel kaliteyi korumak | +| **Orta** | 50 | 150 DPI | Günlük belgeler | +| **Yüksek** | 20 | 72 DPI | E-posta ekleri, web'e yüklemeler | +| **Kayıpsız** | Görsellere dokunulmaz | Değişmez | Arşiv kopyaları | + +Yüksek düzey ayrıca 14 standart PDF yazı tipinin gömülmesini kaldırır; güvenli olduğunda Arial gibi benzer yazı tiplerini de kaldırır. + +## Hedef Dosya Boyutu + +KB veya MB cinsinden bir boyut girin; Hyper Compress, seçtiğiniz düzeyden başlayarak yine de sığan en iyi görsel kalitesini arar. Belge o kadar küçülemiyorsa, üretebileceği en küçük sürümü ve bunu belirten bir mesajı alırsınız. [PDF'yi 1MB'a Sıkıştır](https://www.bentopdf.com/compress-pdf-to-1mb) gibi özel sayfalar, hedef zaten doldurulmuş olarak açılır. + +## Özel Ayarlar + +Hyper Compress'i doğrudan ayarlamak için Özel Ayarlar panelini genişletin. Bir sıkıştırma düzeyi seçmek bunları o düzeyin değerlerine sıfırlar ve herhangi birini düzenlemek düzeyi Özel'e geçirir. + +- **İçerik korumasını geçersiz kıl**: Varsayılan olarak Hyper Compress imzalı PDF'lere dokunmaz ve metni olan sayfaları rasterleştirmez. Bunu açmak her ikisini de devre dışı bırakır. Düzeyi değiştirdiğinizde açık kalır. + +- **Görseller**: görsel kalitesi, maksimum çözünürlük, zorunlu yeniden örnekleme, renk azaltma, görünmez görsel alanlarını kırpma, alternatif görselleri kaldırma, renk profillerini basitleştirme, JPEG 2000 ve kayıpsız mod +- **Yazı tipleri**: alt kümeleme, yinelenenleri birleştirme ve standart yazı tiplerinin ile benzerlerinin gömülmesini kaldırma +- **İçerik**: açıklamaları, form alanlarını veya bağlantıları düzleştirme +- **Temizlik**: küçük resimleri, uygulama verilerini, makale dizilerini, web yakalama bilgilerini, yapı ağacını veya çıktı niyetlerini kaldırma +- **Rasterleştir**: yalnızca görselden oluşan taramalar için sayfaları görsellerle değiştirme; belgede seçilebilir metin varsa atlanır +- **Çıktı**: PDF/A'yı koru ve bunu destekleyen PDF 2.0 okuyucuları için Brotli sıkıştırma + +## Kullanım Alanları + +- 50 MB'lık bir raporu e-posta eki sınırının altına indirmek +- Hedef dosya boyutuyla bir taramayı bir portalın katı yükleme sınırının altına indirmek +- Pazarlama PDF'lerini daha hızlı web indirmeleri için optimize etmek +- Depolama maliyetinin önemli olduğu büyük belge kümelerini arşivlemek +- PDF'leri mesajlaşma uygulamalarında paylaşırken mobil veri kullanımını azaltmak + +## İpuçları + +- Orta ile başlayın. Sonuç hâlâ çok büyükse bir hedef dosya boyutu belirleyin veya Yüksek'e geçin. +- Metin katmanı olmayan bir tarama için Özel Ayarlar altında Sayfaları rasterleştir'i açın. +- Özel Ayarlar altındaki Gri tonlamaya dönüştür, renk ağırlıklı belgelerde dosya boyutunu düşürebilir. + +## İlgili Araçlar + +- [PDF'yi Doğrusallaştır](./linearize-pdf): sıkıştırılmış PDF'yi hızlı web görüntüleme için optimize edin +- [PDF'yi Rasterleştir](./rasterize-pdf): metinli sayfalar dahil sayfaları belirli bir DPI'da görsellere dönüştürün +- [PDF'yi Onar](./repair-pdf): başka bir yerde sıkıştırma sırasında bozulan bir PDF'yi düzeltin +- [Üst Veriyi Kaldır](./remove-metadata): gizlilik için gizli verileri temizleyin diff --git a/docs/tr/tools/crop-pdf.md b/docs/tr/tools/crop-pdf.md new file mode 100644 index 00000000..34bf4dcd --- /dev/null +++ b/docs/tr/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: PDF Kırp +description: Cropper.js destekli bir düzenleyiciyle her sayfaya kırpma alanı çizerek PDF sayfalarını görsel olarak kırpın. +--- + +# PDF Kırp + +Görsel kırpma arayüzüyle PDF sayfalarınızın kenar boşluklarını kesin. Her sayfaya doğrudan bir kırpma dikdörtgeni çizin, sonucu önizleyin ve kırpmayı uygulayın. Farklı sayfalar için farklı kırpma alanları belirleyebilir veya aynı kırpmayı tüm belgeye uygulayabilirsiniz. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Kırpma düzenleyicisi açılır ve ilk sayfayı sürüklenebilir bir kırpma katmanıyla gösterir. +3. Kırpma dikdörtgenini kenarlarından veya köşelerinden sürükleyerek ayarlayın. +4. Sayfalar arasında gezinmek ve her biri için kırpma alanı belirlemek üzere sayfa gezinti düğmelerini kullanın. +5. Kırpmayı uygulamak ve sonucu indirmek için **Kırp**'a tıklayın. + +## Özellikler + +- Hassas ayar için tutamaçlar içeren, Cropper.js destekli görsel kırpma düzenleyicisi +- Tek tek kırpma alanları belirlemek için sayfa sayfa gezinti +- Kırpma ayarlarını sayfa başına saklar; böylece farklı sayfalar için farklı kırpmalar tanımlayabilirsiniz +- Seçilen kırpma alanının canlı önizlemesi +- Her sayfa boyutunu ve yönelimini destekler + +## Kullanım Alanları + +- İçerik alanına odaklanmak için taranmış belgelerden geniş kenar boşluklarını kaldırmak +- Baskı öncesi PDF'lerden yazıcı kesim işaretlerini veya hizalama işaretlerini kesmek +- Konuşmacı notları alanını kaldırmak için ders slaytlarını kırpmak +- Bir belge alıntısını paylaşmadan önce her sayfadan üst veya alt bilgileri kaldırmak +- Sayfaları belirli bir ekrana veya baskı düzenine uyacak şekilde yeniden boyutlandırmak + +## İpuçları + +- Kırpma katmanı serbestçe yeniden boyutlandırılabilir ve yeniden konumlandırılabilir. Orantılı boyutlandırma için köşelerden, tek eksende ayar için kenarlardan sürükleyin. +- Her sayfanın aynı kırpmaya ihtiyaç duyduğu belgelerde bunu ilk sayfada belirleyin: araç, sayfalar arasında gezinirken kırpma alanınızı hatırlar. +- Görsel olarak kırpmak yerine sayfa boyutlarını standartlaştırmanız gerekiyorsa Sayfa Boyutunu Düzelt aracı daha uygun olabilir. + +## İlgili Araçlar + +- [PDF Düzenleyici](./edit-pdf) +- [Sayfa Numaraları](./page-numbers) +- [Boş Sayfaları Kaldır](./remove-blank-pages) diff --git a/docs/tr/tools/csv-to-pdf.md b/docs/tr/tools/csv-to-pdf.md new file mode 100644 index 00000000..c70daf85 --- /dev/null +++ b/docs/tr/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV'den PDF'ye +description: CSV e-tablo dosyalarını doğrudan tarayıcınızda biçimlendirilmiş PDF tablolarına dönüştürün. +--- + +# CSV'den PDF'ye + +CSV dosyalarını temiz, biçimlendirilmiş PDF belgelerine dönüştürün. Her CSV ayrıştırılır ve çıktı PDF'de tablo olarak işlenir. Alıcının e-tablo yazılımına ihtiyaç duymadan tablo verilerini yazdırmanız veya paylaşmanız gerektiğinde kullanışlıdır. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------- | +| CSV | `.csv` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya bir ya da daha fazla CSV dosyasını sürükleyip bırakın. +2. Dosya listesini gözden geçirin. Daha fazla dosya ekleyin veya istemediklerinizi kaldırın. +3. **PDF'ye Dönüştür**'e tıklayın. Bir ilerleme göstergesi dönüştürme durumunu gösterir. +4. Tek dosya doğrudan PDF olarak iner. Birden çok dosya `csv-converted.zip` içinde paketlenir. + +## Seçenekler + +Bu aracın ek bir yapılandırması yoktur. CSV otomatik olarak ayrıştırılır ve tablo olarak biçimlendirilir. + +## Çıktı + +| Girdi Sayısı | Çıktı | +| :----------- | :----------------------------------------------------------- | +| 1 dosya | Tek PDF indirmesi (örn. `data.pdf`) | +| 2+ dosya | Dosya başına bir PDF içeren ZIP arşivi (`csv-converted.zip`) | + +## Kullanım Alanları + +- Dışa aktarılan veritabanı raporlarını yazdırılabilir PDF tablolarına dönüştürmek +- Finansal verileri veya envanter listelerini Excel'i olmayan kişilerle paylaşmak +- Uyumluluk belgeleri için CSV günlük dosyalarının PDF sürümlerini oluşturmak +- Adres listelerini, not çizelgelerini veya CSV olarak saklanan her türlü tablo verisini yazdırmak + +## İpuçları + +- En iyi sonuç için CSV'nizin standart virgül ayırıcıları kullandığından emin olun. Araç yaygın CSV ayrıştırma kurallarını izler. +- CSV'nizde çok sayıda sütun varsa tablo sayfa genişliğine sığması için sıkıştırılabilir. Geniş veri kümelerini birden çok dosyaya bölmeyi düşünün. +- Excel dosyaları (`.xls`, `.xlsx`) için e-tablo biçimlendirmesini ve birden çok sayfayı koruyan [Excel'den PDF'ye](./excel-to-pdf) aracını kullanın. + +## İlgili Araçlar + +- [Excel'den PDF'ye](./excel-to-pdf) +- [Metinden PDF'ye](./txt-to-pdf) +- [JSON'dan PDF'ye](./json-to-pdf) diff --git a/docs/tr/tools/delete-pages.md b/docs/tr/tools/delete-pages.md new file mode 100644 index 00000000..589017c3 --- /dev/null +++ b/docs/tr/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Sayfaları Sil +description: Belirli sayfaları sayfa numarası, aralık veya görsel küçük resim seçimiyle bir PDF'den kaldırın. +--- + +# Sayfaları Sil + +İstenmeyen sayfaları bir PDF belgesinden kaldırın. Silinecek sayfaları sayfa numaralarını veya aralıklarını yazarak belirtin ya da kaldırmak üzere işaretlemek için doğrudan sayfa küçük resimlerine tıklayın. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Araç her sayfanın küçük resim önizlemelerini oluşturur. +2. Silinecek sayfaları metin alanına aralık sözdizimiyle (örn. `2, 5-8`) girin veya küçük resimlere tıklayarak değiştirin. +3. İşaretlenen sayfalar görsel olarak vurgulanır; böylece seçiminizi doğrulayabilirsiniz. +4. İşlem düğmesine tıklayın. Seçilen sayfaların kaldırıldığı yeni bir PDF oluşturulur. + +## Özellikler + +- Aralık sözdizimiyle metin tabanlı sayfa seçimi (`2, 5-8, 12`) +- Tıklayarak silme seçimi için görsel küçük resim ızgarası +- Silinmek üzere işaretlenen sayfaların gerçek zamanlı önizleme vurgusu +- Gerçek sayfa sayısına karşı girdi doğrulaması +- Silinmeyen tüm sayfaları özgün sırasında tutar + +## Kullanım Alanları + +- Taranmış bir belgeden boş veya dolgu sayfalarını kaldırmak +- Bir belgeyi paylaşmadan önce kapak sayfalarını veya ekleri çıkarmak +- Yanlışlıkla son PDF'de kalmış taslak sayfaları temizlemek +- Dağıtımdan önce hassas bilgi içeren sayfaları kaldırmak + +## İpuçları + +- Sayfaları silmek, kalan sayfaların içeriğini veya biçimlendirmesini etkilemez. Çıktı, özgün belgenin kaldırılan sayfalar hariç sadık bir kopyasıdır. +- Belirli sayfaları kaldırmak yerine yalnızca belirli sayfaları tutmak istiyorsanız [Sayfaları Çıkar](./extract-pages) daha uygundur. +- Küçük resim görünümü tembel yüklenir; böylece büyük belgelerde de arayüz duyarlı kalır. + +## İlgili Araçlar + +- [Sayfaları Çıkar](./extract-pages) +- [Çoğalt & Düzenle](./organize-pdf) +- [PDF Böl](./split-pdf) diff --git a/docs/tr/tools/deskew-pdf.md b/docs/tr/tools/deskew-pdf.md new file mode 100644 index 00000000..6a599edd --- /dev/null +++ b/docs/tr/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF Eğriliğini Düzelt +description: OpenCV eğrilik algılamasıyla taranmış PDF'lerdeki eğik sayfaları otomatik olarak düzeltin. Ayarlanabilir eşik ve DPI değerleri. +--- + +# PDF Eğriliğini Düzelt + +Taranmış belgeler nadiren tam düz olur. Hafif bir eğim bile OCR doğruluğunu düşürür ve baskının özensiz görünmesine yol açar. Bu araç, her sayfanın eğrilik açısını algılamak ve sayfayı yeniden düzleştirmek için OpenCV'nin görüntü işleme algoritmalarını kullanır. + +## Nasıl Çalışır + +1. Bir veya daha fazla taranmış PDF yükleyin. +2. **Eğrilik Eşiği**'ni ayarlayın: algılanan eğriliği bu değerin altında olan sayfalara dokunulmaz. +3. Bir **İşleme Kalitesi (DPI)** seçin: yüksek DPI algılama doğruluğunu artırır ancak daha uzun sürer. +4. **PDF Eğriliğini Düzelt**'e tıklayın. +5. İşlemden sonra bir sonuç paneli her sayfanın algılanan açısını ve düzeltilip düzeltilmediğini gösterir. + +## Seçenekler + +| Ayar | Değerler | Varsayılan | +| ----------------- | ------------------------- | ---------- | +| **Eğrilik Eşiği** | 0,1, 0,5, 1,0, 2,0 derece | 0,5 | +| **İşleme DPI'ı** | 100, 150, 200, 300 | 150 | + +## Eğrilik Algılama Nasıl Çalışır + +Araç her sayfayı seçilen DPI'da bir görsele dönüştürür, ardından içerikteki baskın çizgi açılarını algılamak için OpenCV kullanır. Algılanan eğrilik eşiği aşarsa sayfa, düzeltmek için ters açıyla döndürülür. Eşiğin altındaki sayfalar değiştirilmeden geçirilir. + +## Kullanım Alanları + +- Toplu taranmış sözleşmeleri veya hukuki belgeleri temizlemek +- Taranmış fişleri veya faturaları OCR işlemine hazırlamak +- Kâğıt yerleşimi tutarsız bir düz yataklı tarayıcıdan gelen sayfaları düzeltmek +- Dijitalleştirilmiş arşiv malzemelerinin görsel kalitesini iyileştirmek + +## İpuçları + +- OCR için piksel hassasiyetinde hizalamaya ihtiyacınız varsa eşiği 0,1 dereceye düşürün. +- 150 DPI çoğu belge için hızlı ve doğrudur. Çok küçük metinler veya ince ayrıntılı sayfalar için 300 DPI kullanın. +- Eğrilik düzeltme, net yatay metin satırları olan belgelerde en iyi sonucu verir. Çoğunlukla görsellerden veya çapraz tasarım öğelerinden oluşan sayfalarda zorlanabilir. + +## İlgili Araçlar + +- [PDF'yi Rasterleştir](./rasterize-pdf): düzeltilmiş çıktıyı düz, görsel tabanlı bir PDF'ye dönüştürün +- [PDF Sıkıştır](./compress-pdf): eğriliği düzelttikten sonra dosya boyutunu küçültün +- [PDF'yi Onar](./repair-pdf): taranmış PDF'lerdeki yapısal sorunları düzeltin diff --git a/docs/tr/tools/digital-sign-pdf.md b/docs/tr/tools/digital-sign-pdf.md new file mode 100644 index 00000000..13f3c2db --- /dev/null +++ b/docs/tr/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Dijital İmza +description: X.509 sertifikalarıyla PDF'lere kriptografik dijital imzalar ekleyin. Görünür imza seçenekleriyle PKCS#12 ve PEM biçimlerini destekler. +--- + +# Dijital İmza + +Dijital imza, belgeyi belirli bir kişinin imzaladığının ve belgenin o zamandan beri değiştirilmediğinin kriptografik kanıtıdır. Yalnızca bir görsel olan çizilmiş imzanın aksine dijital imza, doğrulanabilir özgünlük ve bütünlük sağlamak için X.509 sertifikalarını ve PKCS#7 standartlarını kullanır. + +BentoPDF dijital imzaları tamamen tarayıcınızda uygular. Özel anahtarınız cihazınızdan asla çıkmaz. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Sertifika dosyanızı yükleyin (.pfx, .p12 veya .pem). +3. Kilidini açmak için sertifika parolasını girin. Araç sertifikanın konusunu, vereni ve geçerlilik süresini gösterir. +4. İsterseniz imza üst verilerini (neden, konum, iletişim bilgisi) yapılandırın. +5. İsterseniz konum, boyut, görsel ve metin özelleştirmesiyle **görünür imzayı** etkinleştirin. +6. **PDF'yi İmzala**'ya tıklayın. + +## Desteklenen Sertifika Biçimleri + +| Biçim | Uzantılar | Açıklama | +| ----------- | ---------- | ---------------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Özel anahtarı ve sertifika zincirini içeren sektör standardı paket. En yaygın biçim. | +| **PEM** | .pem | Metin tabanlı biçim. Hem sertifikayı hem de özel anahtarı tek dosyada içermelidir. Şifreli özel anahtarları destekler. | + +## Görünür İmza Seçenekleri + +Etkinleştirildiğinde PDF sayfasında görünür bir imza bloğu işlenir: + +- **Konum**: X/Y koordinatları ile genişlik/yükseklik, punto olarak +- **Sayfa**: İlk sayfa, son sayfa, tüm sayfalar veya belirli bir sayfa numarası +- **Görsel**: Bir PNG, JPG veya WebP görseli yükleyin (el yazısı imzanız, şirket mührü vb.) +- **Metin**: Rengi ve yazı boyutu ayarlanabilen özel metin. Görsel veya metin verilmezse araç, sertifikanın ortak adından ve geçerli tarihten otomatik metin üretir. + +## İmza Üst Verileri + +- **Neden**: Belgenin neden imzalandığı (örn. "Onaylandı", "İncelendi") +- **Konum**: İmzalamanın nerede yapıldığı (örn. "New York, NY") +- **İletişim Bilgisi**: İmzalayana nasıl ulaşılacağı (örn. e-posta adresi) + +## İnternet Bağlantısı Notu + +İmzalama için internet bağlantısı gerekebilir. İmzalama kitaplığı, sertifika zincirini sertifikanızın Authority Information Access (AIA) uzantısında gömülü URL'lerden alır. Bu sunuculara ulaşılamazsa zincir doğrulaması gerektiren sertifikalar için imzalama başarısız olur. + +## Kullanım Alanları + +- Sözleşmeleri, teklifleri ve anlaşmaları yasal bağlayıcılığı olan dijital imzalarla imzalamak +- PKI tabanlı kimlik doğrulama gerektiren iş akışlarında resmi belgeleri onaylamak +- Mevzuata uyum için PDF faturaları imzalamak (birçok AB ülkesi dijital imzalı e-fatura şart koşar) +- Mühendislik çizimlerine veya kalite belgelerine kurumsal onay eklemek + +## İpuçları + +- Kendinden imzalı sertifikalar test için çalışır ancak Adobe Reader'da uyarı gösterir. Üretim belgeleri için güvenilir bir Sertifika Yetkilisinden alınmış sertifika kullanın. +- Görünür imza yalnızca görseldir. Kriptografik imza, görünür blok etkin olsun veya olmasın gömülür. +- İmzanın bozulmadığını doğrulamak için imzalı PDF'nizi İmza Doğrula aracıyla kontrol edin. + +## İlgili Araçlar + +- [İmza Doğrula](./validate-signature-pdf): imzalı PDF'lerdeki dijital imzaları doğrulayın +- [PDF'yi Düzleştir](./flatten-pdf): değişiklikleri önlemek için imzalamadan önce formları düzleştirin +- [PDF'yi Parolayla Koru](./protect-pdf): dijital imzanın üzerine parola koruması ekleyin +- [Üst Veriyi Kaldır](./remove-metadata): imzalamadan önce üst verileri temizleyin diff --git a/docs/tr/tools/divide-pages.md b/docs/tr/tools/divide-pages.md new file mode 100644 index 00000000..ee5128e2 --- /dev/null +++ b/docs/tr/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Sayfaları Böl +description: PDF sayfalarını yatay veya dikey olarak daha küçük alt sayfalara bölün. +--- + +# Sayfaları Böl + +Tek tek PDF sayfalarını yatay veya dikey bölerek yarıya ayırın. Tek bir sayfadaki içeriğin ayrı sayfalara ayrılması gerektiğinde kullanışlıdır; örneğin tek geniş sayfa olarak taranmış iki sütunlu bir düzen. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Bölme yönünü seçin: **Dikey** (sol/sağ yarılar) veya **Yatay** (üst/alt yarılar). +3. İsterseniz hangi sayfaların bölüneceğini sınırlamak için bir sayfa aralığı belirtin. Tüm sayfaları bölmek için boş bırakın. +4. Bölünmüş PDF'yi oluşturmak için işlem düğmesine tıklayın. + +## Özellikler + +- Dikey bölme: her sayfayı sol ve sağ yarılara ayırır +- Yatay bölme: her sayfayı üst ve alt yarılara ayırır +- Belirli sayfaları seçerek bölmek için sayfa aralığı filtresi +- Hedeflenmeyen sayfalar değiştirilmeden geçer +- Yeniden işleme yapmadan içerik kalitesini korur + +## Kullanım Alanları + +- İkili taranmış sayfaları ayırmak (örn. tek yaprakta sol ve sağ sayfaların bulunduğu bir kitap taraması) +- Yan yana içerikli yatay bir PDF'yi tek tek dikey sayfalara bölmek +- Uzun infografikleri veya posterleri ayrı üst ve alt bölümlere ayırmak +- Geniş biçimli belgeleri standart kâğıda yazdırmaya hazırlamak + +## İpuçları + +- Sayfalarınızda içerik dağılımı eşit değilse bölme yine de tam orta noktada yapılır. Asimetrik bölmeler için bunun yerine [PDF Kırp](./crop-pdf) aracını düşünün. +- Sayfalarınızın bölmeden önce veya sonra döndürülmesi gerekiyorsa bu aracı [PDF'yi Döndür](./rotate-pdf) ile birlikte kullanın. + +## İlgili Araçlar + +- [PDF Böl](./split-pdf) +- [PDF Kırp](./crop-pdf) +- [N'li PDF](./n-up-pdf) +- [PDF'yi Posterleştir](./posterize-pdf) diff --git a/docs/tr/tools/duplex-collate.md b/docs/tr/tools/duplex-collate.md new file mode 100644 index 00000000..7aec494a --- /dev/null +++ b/docs/tr/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Çift Taraflı Harmanla +description: Ön ve arka sayfaları ayrı bloklarda olan çift taraflı tarama PDF'lerini doğru ön/arka sayfa sırasına yeniden düzenleyin. +--- + +# Çift Taraflı Harmanla + +Çift taraflı taramayı harmanla, bir PDF'nin iki sayfa bloğu içerdiği ADF tarama iş akışları için tasarlanmıştır: + +- önce tüm ön yüzler +- sonra tüm arka yüzler + +Elle bölüp yeniden birleştirmek yerine bu araç iki bloğu doğal okuma sırasında iç içe geçirir: ön1, arka1, ön2, arka2 ve devamı. + +## Nasıl Çalışır + +1. Çift taraflı deste taramasından oluşturulmuş tek bir PDF yükleyin. +2. Ön bloğun bittiği bölme noktasını ayarlayın. +3. Arka blok işleme biçimini seçin: + - **Arka bloğu ters çevir** (arka yüzleri taramadan önce deste çevrildiğinde yaygındır) + - **Arka bloğu olduğu gibi tut** +4. Yeniden sıralanmış sonucu indirmek için **PDF'yi Harmanla**'ya tıklayın. + +## Seçenekler + +- **Bölmeyi otomatik algıla (yarı)**: bölme noktasını `ceil(totalPages / 2)` olarak ayarlar. +- **Tek sayfa uyarısı**: toplam sayfa sayısı tek olduğunda uyarır (genellikle tarama uyumsuzluğudur). +- **Eşitsiz blok onayı**: ön/arka blok boyutları farklı olduğunda onay ister. +- **Gruplanmış dışa aktarım**: harmanlanmış çıktıyı özgün belge sayfa sayısına göre ayrı PDF'lere böler ve ZIP olarak indirir. + +## Çıktı Davranışı + +- **Varsayılan**: tek bir çıktı PDF'si (tek girdi PDF'si, tek çıktı PDF'si). +- **Gruplanmış mod**: çıktı, belge başına sayfa değerinize göre parçalara bölünür; birden çok parça üretilirse tek bir ZIP olarak, aksi hâlde tek bir PDF olarak indirilir. + +Blok boyutları eşit değilse eşleşen sayfalar önce harmanlanır, eşleşmeyen kalan sayfalar en sona eklenir. + +## Yaygın Kullanım Alanları + +- Bir yığın çift taraflı formu iki geçişte taradıktan sonra sırayı geri yüklemek. +- Önce tüm ön yüzleri, sonra tüm arka yüzleri veren ofis tarayıcılarından ön/arka paketleri yeniden oluşturmak. +- Belge başına dosyalara bölmeden önce arşiv taramalarını son işlemeden geçirmek. + +## İpuçları + +- Çoğu çift taraflı toplu işin toplam sayfa sayısı çift olmalıdır. +- Arka yüzler ters görünüyorsa **Arka bloğu ters çevir** ile **Arka bloğu olduğu gibi tut** arasında geçiş yapın. +- 2 sayfalık özgün belgeler (ön+arka) için belge başına `2` sayfa ile gruplanmış dışa aktarımı kullanın. + +## İlgili Araçlar + +- [Sayfaları Karıştır & Birleştir](./alternate-merge) +- [PDF Böl](./split-pdf) +- [PDF Birleştir](./merge-pdf) +- [Çoğalt & Düzenle](./organize-pdf) diff --git a/docs/tr/tools/edit-attachments.md b/docs/tr/tools/edit-attachments.md new file mode 100644 index 00000000..08195864 --- /dev/null +++ b/docs/tr/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Ek Dosyaları Düzenle +description: Bir PDF belgesine gömülü dosya eklerini görüntüleyin ve seçerek kaldırın. +--- + +# Ek Dosyaları Düzenle + +Bir PDF içindeki dosya eklerini inceleyin ve yönetin. Araç, gömülü her dosyayı adı ve ek düzeyiyle listeler; ardından tek tek ekleri kaldırmak üzere işaretlemenize veya hepsini bir kerede temizlemenize olanak tanır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Araç ekleri otomatik olarak tarar ve bir listede gösterir. +3. Her ek, dosya adını ve belge düzeyinde mi sayfa düzeyinde mi olduğunu gösterir. +4. Bir eki kaldırmak üzere işaretlemek için yanındaki çöp kutusu simgesine tıklayın (işareti kaldırmak için tekrar tıklayın). +5. Her şeyi bir kerede seçmek için **Tüm Ek Dosyaları Kaldır** düğmesini, seçimlerinizi temizlemek için **Tüm Seçimleri Kaldır**'ı kullanın. +6. Seçilen eklerin kaldırıldığı yeni bir PDF kaydetmek için işlem düğmesine tıklayın. + +## Özellikler + +- Tüm belge düzeyindeki ve sayfa düzeyindeki ekleri listeler +- Tek tek veya toplu ek kaldırma +- Değişiklikleri uygulamadan önce seçimi açıp kapatma +- Kaldırmak üzere işaretlenen öğelerde görsel üstü çizili ve opaklık değişimi +- Seçilen ekler temizlenmiş değiştirilmiş PDF'yi indirir + +## Kullanım Alanları + +- Yeniden dağıtımdan önce belgeye gömülü eski veya hatalı dosyaları kaldırmak +- Paylaşmadan önce PDF'deki hassas ekleri (finansal veriler, kişisel bilgiler) temizlemek +- Artık gerekmeyen büyük gömülü dosyaları kaldırarak PDF dosya boyutunu küçültmek +- Gömülü içeriği denetlemek ve arşivlemeden önce belgeyi temizlemek + +## İpuçları + +- Kaldırmak üzere işaretlenen ekler görsel olarak üstü çizili gösterilir. Fikrinizi değiştirirseniz işlemden önce işaretlerini geri alabilirsiniz. +- Hiç ek bulunamazsa araç açık bir "Ek dosya bulunamadı" mesajı gösterir: PDF'de gömülü dosya yoktur. + +## İlgili Araçlar + +- [Ek Dosya Ekle](./add-attachments) +- [Ek Dosyaları Çıkar](./extract-attachments) +- [Üst Veriyi Görüntüle](./view-metadata) diff --git a/docs/tr/tools/edit-metadata.md b/docs/tr/tools/edit-metadata.md new file mode 100644 index 00000000..c44a71fa --- /dev/null +++ b/docs/tr/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Üst Veriyi Düzenle +description: Başlık, yazar, anahtar sözcükler, tarihler ve özel özellikler dahil PDF üst veri alanlarını görüntüleyin ve değiştirin. +--- + +# Üst Veriyi Düzenle + +Bir PDF dosyasına gömülü üst veriyi düzenleyin. Araç, bir formu belgenin mevcut üst verileriyle önceden doldurur, herhangi bir alanı değiştirmenize izin verir ve değişiklikleri yeni bir PDF'ye kaydeder. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Araç mevcut üst verilerini okur ve formu doldurur. +2. Standart alanlardan herhangi birini düzenleyin: Başlık, Yazar, Konu, Anahtar Sözcükler, Oluşturan, Üreten. +3. Tarih-saat seçicilerle Oluşturma Tarihi'ni ve Değiştirme Tarihi'ni ayarlayın. +4. Ekle düğmesine tıklayıp bir anahtar-değer çifti girerek özel üst veri alanları ekleyin. +5. Değiştirilmiş PDF'yi kaydetmek için işlem düğmesine tıklayın. + +## Özellikler + +- Yüklenen PDF'deki tüm mevcut üst verileri önceden doldurur +- Standart alanlar: Başlık, Yazar, Konu, Anahtar Sözcükler, Oluşturan, Üreten +- Oluşturma Tarihi ve Değiştirme Tarihi için tarih-saat seçiciler +- Keyfi özellikler için özel anahtar-değer üst veri alanları +- Değişiklikleri doğrudan PDF'nin belge bilgi sözlüğüne kaydeder + +## Düzenlenebilir Alanlar + +| Alan | Açıklama | +| --------------------- | --------------------------------------------------------- | +| **Başlık** | PDF okuyucularında görüntülenen belge başlığı | +| **Yazar** | Belgeyi oluşturan kişi veya kuruluş | +| **Konu** | Belgenin konusunun kısa açıklaması | +| **Anahtar Sözcükler** | Arama ve kategorilendirme için virgülle ayrılmış terimler | +| **Oluşturan** | İçeriği özgün olarak oluşturan uygulama | +| **Üreten** | PDF'yi üreten uygulama | +| **Oluşturma Tarihi** | Belgenin özgün olarak oluşturulduğu zaman | +| **Değiştirme Tarihi** | Belgenin en son değiştirildiği zaman | +| **Özel alanlar** | Tanımladığınız ek anahtar-değer çiftleri | + +## Kullanım Alanları + +- Bir belgeyi yayımlamadan önce uygun bir başlık ve yazar belirlemek +- Belge yönetim sistemlerinde aranabilirliği artırmak için anahtar sözcükler eklemek +- Güncel revizyonu yansıtmak için değiştirme tarihini güncellemek +- Departman, Proje Kimliği veya Sınıflandırma gibi özel üst veri alanları eklemek +- Özgün yazım yazılımının bıraktığı üst verileri temizlemek + +## İpuçları + +- Özel alanlar doğrudan PDF'nin bilgi sözlüğüne yazılır. Bazı PDF okuyucuları özel alanları göstermeyebilir ancak bunlar dosyada korunur. +- Bir alanı üst verilerden silmek için boş bırakın. İşlem düğmesi formda ne varsa onu kaydeder. +- Düzenlemeden üst veriyi görüntülemek için [Üst Veriyi Görüntüle](./view-metadata) aracını kullanın. Tüm üst verileri tamamen kaldırmak için Üst Veriyi Kaldır'ı kullanın. + +## İlgili Araçlar + +- [Üst Veriyi Görüntüle](./view-metadata) +- [PDF Katmanları (OCG)](./pdf-layers) +- [PDF Sıkıştır](./compress-pdf) diff --git a/docs/tr/tools/edit-pdf.md b/docs/tr/tools/edit-pdf.md new file mode 100644 index 00000000..60d20ccb --- /dev/null +++ b/docs/tr/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF Düzenleyici +description: PDF'lere doğrudan tarayıcınızda açıklama ekleyin, vurgulayın, karartın, şekil ve görsel ekleyin, arayın ve görüntüleyin. +--- + +# PDF Düzenleyici + +BentoPDF'in PDF Düzenleyicisi, PDF'lerinize açıklama eklemenizi, vurgulamanızı, karartmanızı, yorum yapmanızı, şekil ve görsel eklemenizi ve içlerinde arama yapmanızı sağlar. Sunucuya yükleme gerektirmeden doğrudan tarayıcınızda tam özellikli bir düzenleyici yükler. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek PDF'nizi yükleyin. +2. Gömülü PDF düzenleyici, belgeniz yüklenmiş olarak otomatik açılır. +3. Açıklama eklemek, vurgulamak, karartmak, metin eklemek, şekil çizmek veya görsel eklemek için araç çubuğunu kullanın. +4. Değişikliklerinizi kaydetmek için **Düzenlenmiş PDF'yi İndir**'e tıklayın. + +## Özellikler + +- Vurgulama, altını çizme, üstünü çizme ve serbest çizim içeren tam açıklama araç çubuğu +- Metin ekleme ve yorum yapma +- Karartmayı uyguladıktan sonra işaretlenen içeriği kalıcı olarak kaldıran karartma araçları. **Düzenlenmiş PDF'yi İndir**'e tıkladığınızda uygulanmamış işaretler varsa düzenleyici önce bunları uygulamayı önerir. +- Dikdörtgen, daire, çizgi ve ok için şekil araçları +- PDF sayfalarına görsel ekleme +- Belge genelinde yerleşik metin araması +- Sekmelerle çoklu belge desteği (aynı anda en fazla 10 belge açık) +- Sürükle ve bırak ile dosya yükleme + +## Kullanım Alanları + +- Sözleşmeleri incelemek ve değişiklikleri vurgu ve yorumlarla işaretlemek +- Paylaşmadan önce kimlik numarası veya finansal veriler gibi gizli bilgileri karartmak +- Mimari planlara veya mühendislik çizimlerine açıklama eklemek +- Belge sayfalarına şirket logoları veya damgalar eklemek +- Uzun hukuki belgelerde belirli terimleri aramak + +## İpuçları + +- Aynı anda birden çok PDF açabilir ve düzenleyicinin üstündeki sekme çubuğuyla aralarında geçiş yapabilirsiniz. +- Düzenleyici özgün PDF yapısını korur; böylece yazı tipleri, yerleşimler ve form alanları bozulmaz. +- Metni veya bir alanı karartma için işaretlemek, karartma uygulanana kadar hiçbir şeyi kaldırmaz. Seçili metni karartırsanız, dosya şifreli değilse onun dosya özelliklerindeki, yer işaretlerindeki, yorumlardaki ve eklerdeki kopyaları da indirilen dosyadan kaldırılır. +- Toplu filigran veya sayfa numaralandırma için biçimlendirme üzerinde daha fazla denetim sağlayan özel araçları kullanın. + +## İlgili Araçlar + +- [Filigran Ekle](./add-watermark) +- [PDF İmzala](./sign-pdf) +- [Damga Ekle](./add-stamps) +- [Açıklamaları Kaldır](./remove-annotations) diff --git a/docs/tr/tools/email-to-pdf.md b/docs/tr/tools/email-to-pdf.md new file mode 100644 index 00000000..04f83e66 --- /dev/null +++ b/docs/tr/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: E-postadan PDF'ye +description: EML ve MSG e-posta dosyalarını tarayıcınızda PDF'ye dönüştürün. Üst bilgileri, gövdeyi ve ek listesini korur. +--- + +# E-postadan PDF'ye + +Kaydedilmiş e-posta dosyalarını temiz, yazdırılabilir PDF'lere dönüştürün. Araç EML ve MSG dosyalarını ayrıştırır, mesajın tamamını (üst bilgiler, gövde içeriği ve ek üst verileri) çıkarır ve her şeyi yapılandırılmış bir PDF'ye işler. Hukuki keşif, kayıt tutma veya önemli bir e-postayı yazdırmak için kullanışlıdır. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---- | :----- | :----------------------------------------------------------------------- | +| EML | `.eml` | Standart MIME e-posta biçimi (çoğu e-posta istemcisinden dışa aktarılır) | +| MSG | `.msg` | Microsoft Outlook'un özel biçimi | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya EML ya da MSG dosyalarınızı sürükleyip bırakın. Tek bir toplu işte iki biçimi birlikte kullanabilirsiniz. +2. Dosya listesini gözden geçirin. İstenmeyen girdileri çöp kutusu simgesiyle kaldırın veya daha fazla e-posta eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. Dönüştürme seçeneklerini yapılandırın (aşağıya bakın). +4. **PDF'ye Dönüştür**'e tıklayın. Araç her e-postayı ayrıştırır, içeriği biçimlendirilmiş HTML olarak işler ve PyMuPDF motoruyla PDF'ye dönüştürür. +5. Tek bir e-posta doğrudan PDF olarak iner. Birden çok e-posta `emails-converted.zip` içinde paketlenir. + +## Seçenekler + +| Seçenek | Varsayılan | Açıklama | +| :------------------------ | :--------- | :----------------------------------------------------------------------------------------------------- | +| **Sayfa Boyutu** | A4 | A4, Letter veya Legal sayfa boyutları arasında seçim yapın. | +| **CC ve BCC'yi Dahil Et** | Açık | Etkinleştirildiğinde CC ve BCC alıcı listeleri PDF'nin e-posta üst bilgi bölümünde görünür. | +| **Ek Listesini Dahil Et** | Açık | Etkinleştirildiğinde e-postanın dosya eklerinin listesi (dosya adları ve boyutlarıyla) PDF'de görünür. | + +## Kullanım Alanları + +- Uyumluluk veya denetim için önemli iş yazışmalarını PDF olarak arşivlemek +- Hukuki süreçler veya keşif talepleri için e-posta zincirlerini yazdırmak +- E-postayla alınan sipariş onaylarının, makbuzların veya sözleşmelerin kalıcı kaydını oluşturmak +- Outlook MSG dosyalarını okumak için Outlook gerektirmeyen bir biçimde yedeklemek +- Dışa aktarılmış EML dosyalarından müşteri destek görüşmelerini belgelemek + +## İpuçları + +- Hem EML (Thunderbird, Apple Mail ve çoğu e-posta istemcisi tarafından kullanılır) hem de Outlook MSG dosyaları desteklenir. E-postaları istemcinizden dışa aktarın ve doğrudan araca bırakın. +- HTML biçimli e-postalar PDF'de stillerini korur. Düz metin e-postalar temiz, okunaklı biçimlendirmeyle işlenir. +- Ek listesi dosya adlarını ve boyutlarını gösterir ancak gerçek ek dosyaları PDF'ye gömmez. + +## İlgili Araçlar + +- [XML'den PDF'ye](./xml-to-pdf) +- [XPS'ten PDF'ye](./xps-to-pdf) diff --git a/docs/tr/tools/epub-to-pdf.md b/docs/tr/tools/epub-to-pdf.md new file mode 100644 index 00000000..5bc69131 --- /dev/null +++ b/docs/tr/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB'dan PDF'ye +description: EPUB e-kitaplarını tarayıcınızda PDF'ye dönüştürün. Ücretsiz, yükleme gerekmez, gizlilik öncelikli dönüştürme. +--- + +# EPUB'dan PDF'ye + +EPUB e-kitaplarını tarayıcınızdan ayrılmadan PDF dosyalarına dönüştürün. EPUB dijital kitaplar için açık standarttır, ancak bazen yazdırma, açıklama ekleme veya e-kitap okuyucusu olmayan kişilerle paylaşma için sabit düzenli bir PDF gerekir. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---- | :------ | :------------------------- | +| EPUB | `.epub` | EPUB 2 ve EPUB 3 dosyaları | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya EPUB dosyalarınızı sürükleyip bırakın. Çoklu seçim desteklenir. +2. Yüklenen dosyaları gözden geçirin. İstenmeyen girdileri çöp kutusu simgesiyle kaldırın veya toplu işi genişletmek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. **PDF'ye Dönüştür**'e tıklayın. PyMuPDF motoru EPUB içeriğini (metin, görseller ve biçimlendirme) sayfalanmış PDF çıktısına işler. +4. Tek bir EPUB doğrudan PDF olarak iner. Birden çok dosya `epub-converted.zip` adlı bir ZIP arşivinde paketlenir. + +## Seçenekler + +Dönüştürme makul varsayılanlarla çalışır ve zorunlu yapılandırma gerektirmez. Metin standart sayfa boyutlarına göre yeniden akar; gömülü yazı tipleri ve görseller PDF'ye aktarılır. + +## Kullanım Alanları + +- DRM'siz bir e-kitabı ekranlardan uzakta okumak için yazdırmak +- Bir EPUB el yazmasını inceleme için sabit düzenli PDF olarak göndermek +- Dijital kitapları her işletim sisteminin doğrudan açabildiği bir biçimde arşivlemek +- Bir bölümü EPUB okuyucusu olmayan bir meslektaşla paylaşmak +- EPUB olarak dağıtılan teknik belgeleri açıklama eklenebilir PDF'lere dönüştürmek + +## İpuçları + +- Gömülü ses ve video gibi EPUB 3 özellikleri PDF'ye aktarılmaz, ancak tüm metin, görsel ve tablolar sorunsuz dönüşür. +- Yoğun stillendirilmiş EPUB'larda en iyi sonuç için yerleşim doğruluğunu onaylamak üzere çıktının ilk birkaç sayfasını kontrol edin. + +## İlgili Araçlar + +- [MOBI'den PDF'ye](./mobi-to-pdf) +- [FB2'den PDF'ye](./fb2-to-pdf) +- [CBZ'den PDF'ye](./cbz-to-pdf) diff --git a/docs/tr/tools/excel-to-pdf.md b/docs/tr/tools/excel-to-pdf.md new file mode 100644 index 00000000..65a631b2 --- /dev/null +++ b/docs/tr/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel'den PDF'ye +description: Excel e-tablolarını (XLS, XLSX), ODS ve CSV dosyalarını biçimlendirme korunarak PDF'ye dönüştürün. +--- + +# Excel'den PDF'ye + +E-tablo dosyalarını PDF'ye dönüştürün. Araç modern Excel dosyalarını, eski XLS biçimini, OpenDocument E-tablolarını ve hatta CSV'yi işler. Hepsi, hücre biçimlendirmesini, formülleri (hesaplanmış değerler olarak), grafikleri ve çok sayfalı düzenleri koruyan tarayıcı tabanlı bir LibreOffice motoruyla işlenir. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :--------------------- | :-------- | +| Excel (modern) | `.xlsx` | +| Excel (eski) | `.xls` | +| OpenDocument E-tablosu | `.ods` | +| CSV | `.csv` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya e-tablo dosyalarınızı sürükleyip bırakın. +2. Dosya listesini gözden geçirin. Daha fazla dosya ekleyin veya istemediklerinizi kaldırın. +3. **PDF'ye Dönüştür**'e tıklayın. LibreOffice motoru ilk kullanımda başlatılır, ardından her dosyayı işler. +4. Tek dosya doğrudan PDF olarak iner. Birden çok dosya `excel-converted.zip` olarak teslim edilir. + +## Seçenekler + +Bu aracın ek bir yapılandırması yoktur. LibreOffice motoru sayfa düzenini, ölçeklemeyi ve yazdırma alanını e-tablonun yerleşik ayarlarına göre belirler. + +## Çıktı + +| Girdi Sayısı | Çıktı | +| :----------- | :------------------------------------------------------------- | +| 1 dosya | Tek PDF indirmesi (özgün dosya adı, `.pdf` uzantısıyla) | +| 2+ dosya | Dosya başına bir PDF içeren ZIP arşivi (`excel-converted.zip`) | + +## Kullanım Alanları + +- Finansal raporları veya bütçeleri dağıtım için Excel'den PDF'ye dönüştürmek +- Envanter veya ürün kataloğu e-tablolarından baskıya hazır PDF'ler oluşturmak +- Veri analizi sonuçlarını Excel'i kurulu olmayan paydaşlarla paylaşmak +- Üç aylık raporları düzenlenemez bir biçimde arşivlemek +- LibreOffice Calc'tan ODS dosyalarını PDF'ye dönüştürmek + +## İpuçları + +- E-tabloya gömülü grafikler PDF'de işlenir. Dönüştürmeden önce kaynak dosyada doğru göründüklerinden emin olun. +- E-tablonuzda birden çok sayfa varsa tüm sayfalar PDF çıktısına dahil edilir. +- Biçimlendirmesiz basit CSV verileri için [CSV'den PDF'ye](./csv-to-pdf) aracı daha hafif bir dönüştürme sağlar. Biçimlendirmenin, grafiklerin veya birden çok sayfanın korunması gerektiğinde Excel to PDF'yi kullanın. + +## İlgili Araçlar + +- [CSV'den PDF'ye](./csv-to-pdf) +- [Word'den PDF'ye](./word-to-pdf) +- [PowerPoint'ten PDF'ye](./powerpoint-to-pdf) diff --git a/docs/tr/tools/extract-attachments.md b/docs/tr/tools/extract-attachments.md new file mode 100644 index 00000000..78c98c7d --- /dev/null +++ b/docs/tr/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Ek Dosyaları Çıkar +description: Bir veya daha fazla PDF'den gömülü tüm dosya eklerini çıkarın ve ZIP arşivi olarak indirin. +--- + +# Ek Dosyaları Çıkar + +Bir veya daha fazla PDF dosyasındaki gömülü her eki çıkarın. Çıkarılan tüm dosyalar indirmek için tek bir ZIP arşivinde toplanır. + +## Nasıl Çalışır + +1. Gömülü ekler içeren bir veya daha fazla PDF dosyası yükleyin. +2. **Ek Dosyaları Çıkar**'a tıklayın. +3. Araç her PDF'yi belge düzeyindeki ve sayfa düzeyindeki ekler için tarar. +4. Bulunan tüm dosyalar bir ZIP arşivinde paketlenir ve otomatik olarak indirilir. +5. Bir durum mesajı kaç ek bulunduğunu ve toplam boyutlarını doğrular. + +## Özellikler + +- Aynı anda birden çok PDF'den toplu çıkarma +- Hem belge düzeyindeki hem de sayfa düzeyindeki ekleri çıkarır +- Çıkarılan tüm dosyaları içeren tek bir ZIP dosyası üretir +- Toplam ek sayısını ve birleşik dosya boyutunu gösterir +- Ek bulunamazsa açık durum mesajları verir + +## Kullanım Alanları + +- Bir rapor PDF'sine gömülü veri dosyalarını kurtarmak +- Bir portföy veya şartname belgesinden görsel varlıkları çıkarmak +- Eğitim veya uyumluluk PDF'lerinden ek materyalleri çıkarmak +- Bir grup PDF'nin içine hangi dosyaların gömülü olduğunu denetlemek + +## İpuçları + +- Araç ek bulunmadığını bildirirse PDF bunun yerine gömülü görseller veya form verileri içeriyor olabilir; bunlar dosya eki değildir. Gömülü görseller için [Görüntüleri Çıkar](./extract-images) aracını kullanın. +- Birden çok PDF işlerken her dosyadaki tüm ekler tek bir ZIP'te toplanır. Dosya adları özgün gömmelerden korunur. + +## İlgili Araçlar + +- [Ek Dosya Ekle](./add-attachments) +- [Ek Dosyaları Düzenle](./edit-attachments) +- [Görüntüleri Çıkar](./extract-images) diff --git a/docs/tr/tools/extract-images.md b/docs/tr/tools/extract-images.md new file mode 100644 index 00000000..da073cbb --- /dev/null +++ b/docs/tr/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Görüntüleri Çıkar +description: PDF dosyalarındaki gömülü tüm görüntüleri çıkarın. Bir ızgarada önizleyin, tek tek veya ZIP arşivi olarak indirin. +--- + +# Görüntüleri Çıkar + +Bir veya daha fazla PDF dosyasındaki gömülü her görüntüyü çıkarır. Çıkarılan görüntüler, tek tek indirebileceğiniz veya hepsini bir kerede ZIP olarak alabileceğiniz bir önizleme ızgarasında gösterilir. PyMuPDF ile çalışır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları üzerine sürükleyerek bir veya daha fazla PDF yükleyin. Gerektiğinde daha fazla dosya ekleyin veya tek tek kaldırın. +2. İşlemeyi başlatmak için **Çıkar**'a tıklayın. +3. Araç, yüklenen her PDF'nin her sayfasını tarar, gömülü görüntüleri bulur ve çıkarır. +4. Çıkarılan görüntüler küçük resimlerle bir ızgarada görünür. Her görüntünün bir indirme düğmesi vardır. +5. Hepsini ZIP arşivi olarak kaydetmek için **Tümünü İndir**'e tıklayın. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Gömülü tüm görüntüler özgün biçimlerinde çıkarılır (genellikle PNG, JPEG veya görüntü PDF'ye gömülürken hangi biçim kullanıldıysa o). + +## Çıktı Biçimi + +- Görüntüler önizleme ızgarasında `image_1.png`, `image_2.jpg` gibi adlarla görünür. +- **Tümünü İndir**, tüm görüntüleri içeren `extracted-images.zip` dosyasını üretir. +- Görüntüler ızgaradan tek tek indirilebilir. + +## Kullanım Alanları + +- Bir PDF'deki fotoğrafları veya grafikleri başka bir projede yeniden kullanmak için kurtarmak. +- Bir e-ticaret listesi için katalog PDF'sinden ürün görsellerini çıkarmak. +- Sunumlarda kullanmak üzere teknik belgelerden diyagramları çıkarmak. +- Bir belgeyi paylaşmadan önce hangi görüntülerin gömülü olduğunu denetlemek. + +## İpuçları + +- Araç görüntüleri PDF'de saklandıkları gibi çıkarır. Sayfaları görüntü olarak yeniden işlemez; bunun için [PDF'den PNG'ye](./pdf-to-png) veya [PDF'den JPG'ye](./pdf-to-jpg) araçlarını kullanın. +- Araç "Görüntü Bulunamadı" bildirirse PDF gömülü raster görüntüler yerine vektör grafikler kullanıyor olabilir veya tüm sayfanın tek büyük görüntü olduğu taranmış bir belge olabilir. +- Toplu işleme birden çok PDF genelinde çalışır. Tüm dosyalardaki tüm görüntüler tek bir ızgarada ve ZIP'te birleştirilir. + +## İlgili Araçlar + +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den JPG'ye](./pdf-to-jpg) +- [PDF İş Akışı Oluşturucu](./pdf-workflow) diff --git a/docs/tr/tools/extract-pages.md b/docs/tr/tools/extract-pages.md new file mode 100644 index 00000000..b5d29a18 --- /dev/null +++ b/docs/tr/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Sayfaları Çıkar +description: Bir PDF'den belirli bir sayfa aralığını yeni bir belge olarak kaydedin. +--- + +# Sayfaları Çıkar + +Bir PDF'den bir sayfa kümesini çıkarın ve yeni bir dosya olarak kaydedin. İstediğiniz sayfaları aralık sözdizimiyle tam olarak belirtin; araç yalnızca bu sayfaları içeren temiz bir PDF oluşturur. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Araç dosya adını, boyutunu ve toplam sayfa sayısını gösterir. +2. Çıkarmak istediğiniz sayfaları aralık sözdizimiyle girin (örn. `1-5`, `3, 7, 10-12`). +3. İsterseniz her aralığı bir ZIP arşivinde ayrı bir PDF olarak indirmeyi seçin. +4. İşlem düğmesine tıklayın. Çıkarılan sayfalar yeni bir PDF (veya ZIP) olarak iner. + +## Özellikler + +- Esnek sayfa aralığı sözdizimi: tek tek sayfalar, aralıklar veya virgülle ayrılmış kombinasyonlar +- Kolay başvuru için yüklemeden sonra toplam sayfa sayısını gösterir +- Tek birleşik PDF veya ZIP içinde ayrı dosyalar olarak çıktı seçeneği +- Özgün sayfa içeriğini ve biçimlendirmesini korur + +## Kullanım Alanları + +- Uzun bir raporun yönetici özetini (ilk birkaç sayfa) çıkarmak +- Bir ders kitabı PDF'sinden tek bir bölümü çıkarmak +- Bir form paketinden belirli sayfaları bağımsız belgeler olarak kaydetmek +- Daha büyük bir dosyanın seçili sayfalarından örnek belge oluşturmak + +## İpuçları + +- Sayfa numaraları 1'den başlar. İlk sayfa için `0` değil `1` kullanın. +- Sayfaları çıkarmak yerine kaldırmak için ters işlem olan [Sayfaları Sil](./delete-pages) aracını kullanın. +- Küçük resimlerle görsel sayfa seçimi gerekiyorsa [PDF Böl](./split-pdf) aracını Görsel Seçim modunda kullanın. + +## İlgili Araçlar + +- [PDF Böl](./split-pdf) +- [Sayfaları Sil](./delete-pages) +- [PDF Birleştir](./merge-pdf) diff --git a/docs/tr/tools/extract-tables.md b/docs/tr/tools/extract-tables.md new file mode 100644 index 00000000..1a163db6 --- /dev/null +++ b/docs/tr/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: PDF Tablolarını Çıkar +description: PDF belgelerindeki tabloları algılayın ve çıkarın. Tablo bazında ayrıntıyla CSV, JSON veya Markdown olarak dışa aktarın. +--- + +# PDF Tablolarını Çıkar + +Bir PDF'deki tüm tabloları algılar ve bunları seçtiğiniz biçimde dışa aktarmanızı sağlar: CSV, JSON veya Markdown. Her tablo sayfa ve konum üst verisiyle tek tek çıkarılır. PyMuPDF'in tablo algılama motoruyla çalışır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Tercih ettiğiniz **dışa aktarma biçimini** seçin: CSV, JSON veya Markdown. +3. İşlemeyi başlatmak için **Çıkar**'a tıklayın. +4. Tek tablo bulunursa tek dosya olarak iner. Birden çok tablo, tablo başına bir dosya içeren bir ZIP arşivi üretir. + +## Seçenekler + +- **Dışa Aktarma Biçimi**: şunlar arasında seçim yapın: + - **CSV**: virgül, tırnak veya yeni satır içeren alanlar için doğru tırnaklamayla virgülle ayrılmış değerler. E-tablolar ve veritabanları için uygundur. + - **JSON**: dizi dizisi yapısı, 2 boşluk girintiyle okunaklı biçimlendirilmiş. Programatik kullanım için uygundur. + - **Markdown**: PyMuPDF tarafından işlenen dikey çizgiyle ayrılmış tablo biçimi. Belgeler ve README dosyaları için uygundur. + +## Çıktı Biçimi + +- **Tek tablo**: `filename_table.csv` (veya `.json` / `.md`) +- **Birden çok tablo**: `table_1_page3.csv`, `table_2_page5.csv` vb. adlı dosyaları içeren `filename_tables.zip` + +## Kullanım Alanları + +- Tüm belgenin verilerini çekmeden uzun PDF raporlarından belirli tabloları çıkarmak. +- Tabloları GitHub issue'larına, wiki'lere veya belgelere doğrudan yapıştırmak üzere Markdown biçiminde almak. +- API entegrasyonları veya betikler için PDF tablolarından yapılandırılmış JSON verisi çıkarmak. +- Farklı PDF sürümlerindeki tabloları her ikisini de CSV'ye aktarıp farklarını karşılaştırarak kıyaslamak. + +## İpuçları + +- Bu araç tablo bazında denetim sağlar. Tüm tabloları tek bir CSV'ye dökmek istiyorsanız [PDF'den CSV'ye](./pdf-to-csv) aracını kullanın. Tam bir Excel çalışma kitabı için [PDF'den Excel'e](./pdf-to-excel) aracını kullanın. +- Birden çok sayfaya yayılan tablolar sayfa başına ayrı tablolar olarak algılanabilir. Bunları elle birleştirmeniz gerekebilir. +- Hiç tablo algılanmazsa PDF taranmış bir görüntü olabilir. Metin katmanı eklemek için önce OCR'den geçirin. + +## İlgili Araçlar + +- [PDF'den CSV'ye](./pdf-to-csv) +- [PDF'den Excel'e](./pdf-to-excel) +- [PDF'den Metne](./pdf-to-text) diff --git a/docs/tr/tools/fb2-to-pdf.md b/docs/tr/tools/fb2-to-pdf.md new file mode 100644 index 00000000..9954dcde --- /dev/null +++ b/docs/tr/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2'den PDF'ye +description: FictionBook (FB2) e-kitap dosyalarını tarayıcınızda PDF'ye dönüştürün. Ücretsiz, gizli, sunucuya yükleme yok. +--- + +# FB2'den PDF'ye + +FictionBook 2 (FB2) dosyalarını PDF belgelerine dönüştürün. FB2, Rusya ve Doğu Avrupa'da yaygın, XML tabanlı bir e-kitap biçimidir. Bazı platformlarda iyi desteklenirken diğerlerinde neredeyse hiç bilinmez. PDF'ye dönüştürmek kitaplarınızı her yerde okunabilir hale getirir. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :------------ | :----- | :------------------------- | +| FictionBook 2 | `.fb2` | XML tabanlı e-kitap biçimi | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya FB2 dosyalarınızı sürükleyip bırakın. Birden fazla dosyayı toplu olarak seçebilirsiniz. +2. Dosya listesini gözden geçirin. Tek tek girişleri kaldırmak için çöp kutusu simgesini kullanın veya daha fazla dosya eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. **PDF'ye Dönüştür**'e tıklayın. PyMuPDF motoru FB2 XML yapısını ayrıştırır ve sayfalara bölünmüş PDF içeriği olarak işler. +4. Tek bir dosya doğrudan PDF olarak iner. Birden fazla dönüşüm `fb2-converted.zip` içinde paketlenir. + +## Seçenekler + +Herhangi bir yapılandırma gerekmez. Dönüştürücü FB2 XML yapısını otomatik olarak işler; bölüm sonlarını, biçimlendirmeyi ve gömülü görselleri korur. + +## Kullanım Alanları + +- FB2 e-kitaplarını yalnızca PDF destekleyen cihazlarda veya uygulamalarda okumak +- FB2 biçiminde dağıtılan Rusça edebiyatı yazdırmak +- FB2 kitaplığını evrensel olarak desteklenen bir biçimde arşivlemek +- Okuyucusu FictionBook desteklemeyen biriyle kitap paylaşmak + +## İpuçları + +- FB2 dosyaları düz XML olduğundan genellikle küçüktür ve tarayıcıda bile hızlı dönüşür. +- FB2 dosyalarınız `.fb2.zip` olarak sıkıştırılmışsa, yüklemeden önce arşivden çıkarın. + +## İlgili Araçlar + +- [EPUB'dan PDF'ye](./epub-to-pdf) +- [MOBI'den PDF'ye](./mobi-to-pdf) +- [XML'den PDF'ye](./xml-to-pdf) diff --git a/docs/tr/tools/fix-page-size.md b/docs/tr/tools/fix-page-size.md new file mode 100644 index 00000000..cf4680d8 --- /dev/null +++ b/docs/tr/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Sayfa Boyutunu Düzelt +description: Bir PDF'deki tüm sayfaları tek tip boyuta getirin. Standart kağıt boyutlarından seçin veya özel ölçüler belirleyin. +--- + +# Sayfa Boyutunu Düzelt + +Birden fazla kaynaktan birleştirilen PDF'lerde sayfa boyutları sıklıkla birbirini tutmaz: bazıları Letter, bazıları A4, bazıları ise tamamen standart dışıdır. Bu araç her sayfayı tek bir hedef boyuta getirir ve içeriği gerektiği şekilde sığdırır veya doldurur. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Açılır listeden bir **Hedef Sayfa Boyutu** seçin (A4, Letter, Legal, A3, A5, Tabloid veya Özel). +3. Bir **Yönlendirme** seçin: Otomatik her sayfanın özgün yönlendirmesini korur, isterseniz Dikey veya Yatay'a zorlayabilirsiniz. +4. Bir **İçerik Ölçekleme** modu seçin: Sığdır (tüm içeriği korur, kenar boşlukları ekleyebilir) veya Doldur (sayfayı doldurur, kenarları kırpabilir). +5. İsteğe bağlı olarak eklenen boşluklar için bir **Arka Plan Rengi** belirleyin. +6. **Sayfa Boyutunu Düzelt**'e tıklayın. + +## Seçenekler + +- **Standart boyutlar**: A4, Letter, Legal, A3, A5, Tabloid +- **Özel ölçüler**: Genişlik ve yüksekliği inç veya milimetre olarak girin +- **Yönlendirme**: Otomatik, Dikey, Yatay +- **Ölçekleme modu**: Sığdır veya Doldur (Kırp) +- **Arka plan rengi**: Boşluk dolgusu için herhangi bir renk + +## Kullanım Alanları + +- Sayfaları farklı tarayıcılardan gelen birleştirilmiş bir PDF'yi düzenlemek +- ABD Letter boyutundaki belgeyi uluslararası dağıtım için A4'e çevirmek +- Tutarlı bir kesim boyutu gerektiren baskıya hazır PDF'ler hazırlamak +- Standarttan biraz sapan sayfaları düzeltmek (ör. 8,5 x 11 yerine 8,49 x 11,02 inç) + +## İpuçları + +- Hiçbir içeriğin kaybolmaması için Sığdır modunu kullanın. Doldur modu daha derli toplu görünür ancak kenarları kesebilir. +- Her sayfanın hedefle eşleştiğini doğrulamak için çıktıyı Sayfa Boyutları aracıyla kontrol edin. +- Varsayılan arka plan rengi beyazdır; belgenizin kenarları koyuysa koyu bir renge geçin. + +## İlgili Araçlar + +- [Sayfa Boyutları](./page-dimensions): düzeltmeden önce ve sonra sayfa boyutlarını inceleyin +- [PDF Sıkıştır](./compress-pdf): standartlaştırmadan sonra dosya boyutunu azaltın +- [PDF Kırp](./crop-pdf): otomatik ölçekleme yerine sayfaları elle kırpın diff --git a/docs/tr/tools/flatten-pdf.md b/docs/tr/tools/flatten-pdf.md new file mode 100644 index 00000000..57887191 --- /dev/null +++ b/docs/tr/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: PDF'yi Düzleştir +description: Etkileşimli formları ve ek açıklamaları statik içeriğe dönüştürün. Form alanlarını düzenlenemez yapar ve ek açıklamaları sayfaya işler. +--- + +# PDF'yi Düzleştir + +Düzleştirme, etkileşimli öğeleri (form alanları, açılır listeler, onay kutuları, ek açıklamalar, vurgular, yapışkan notlar) doğrudan sayfa içeriğine birleştirir. Görünüm aynı kalır, ancak artık hiçbir şey düzenlenemez veya ayıklanamaz. Doldurulmuş bir formu yazdırıp yeniden taramanın PDF karşılığıdır, ancak kalite kusursuz kalır. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. +2. **PDF'yi Düzleştir**'e tıklayın. +3. Tek bir dosya doğrudan iner. Birden fazla dosya ZIP arşivi oluşturur. + +Araç, form alanlarını düzleştirmek için pdf-lib'i (`form.flatten()` ile) ve ek açıklamaları sayfa akışına işlemek için özel bir ek açıklama düzleştiriciyi kullanır. Her iki işlem de tek geçişte yapılır. + +## Neler Düzleştirilir + +- **Form alanları**: Metin girişleri, onay kutuları, radyo düğmeleri, açılır listeler, imza alanları +- **Ek açıklamalar**: Yorumlar, vurgular, üstü çizili, altı çizili, yapışkan notlar, damgalar, mürekkep ek açıklamaları +- **Etkileşimli öğeler**: Düğmeler, eylem tetikleyicileri + +## Neler Değişmeden Kalır + +- Metin içeriği (seçilebilir ve aranabilir kalır) +- Görseller ve grafikler +- Sayfa düzeni ve boyutları +- Yer imleri ve içindekiler tablosu +- Köprüler (ek açıklama tabanlı olmadıkça) + +## Kullanım Alanları + +- Doldurulmuş bir formu kilitleyerek alıcıların gönderilen yanıtları değiştirmesini önlemek +- Etkileşimli öğelerin gereksiz olduğu bir PDF'yi arşive hazırlamak +- Ek açıklamaların görüntüleyicilere göre farklı işlenmesinden kaynaklanan görüntü sorunlarını gidermek +- İmzalı bir belgenin imza uygulandıktan sonra değiştirilemediğinden emin olmak +- Form alanı tanımlarını ve ek açıklama nesnelerini ortadan kaldırarak dosya boyutunu küçültmek + +## İpuçları + +- Tüm düzenlemeler bittikten sonra düzleştirin. Bir PDF'nin düzleştirmesini geri almanın yolu yoktur. +- Düzleştirmenin yanı sıra meta verileri, JavaScript'i ve ekleri de temizlemeniz gerekiyorsa bunun yerine PDF'yi Temizle aracını kullanın; düzleştirme seçeneklerinden biri olarak orada da bulunur. +- Bazı PDF'ler "form bulunamadı" bildirir. Belgede yalnızca ek açıklamalar olup form alanı yoksa bu normaldir. + +## İlgili Araçlar + +- [PDF'yi Temizle](./sanitize-pdf): formları düzleştirin, ayrıca meta verileri, betikleri ve daha fazlasını kaldırın +- [PDF'yi Rasterleştir](./rasterize-pdf): azami düzleştirme için görsel tabanlı PDF'ye dönüştürün +- [Yazı Tipi Çerçeveye Dönüştür](./font-to-outline): yazı tiplerini vektör yollarına düzleştirin +- [PDF'yi Parolayla Koru](./protect-pdf): düzleştirilmiş PDF'yi parolayla kilitleyin diff --git a/docs/tr/tools/font-to-outline.md b/docs/tr/tools/font-to-outline.md new file mode 100644 index 00000000..d5439386 --- /dev/null +++ b/docs/tr/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Yazı Tipini Ana Hatlara Dönüştür +description: Cihazlar arasında tutarlı görüntüleme için tüm PDF yazı tiplerini vektör çerçevelerine dönüştürün. Yazı tipi bağımlılığı sorunlarını ortadan kaldırır. +--- + +# Yazı Tipini Ana Hatlara Dönüştür + +Yazı tiplerini çerçeveye dönüştürmek, her metin karakterini yazı tipi tabanlı bir glifden vektör yoluna çevirir. PDF artık yüklü hiçbir yazı tipine bağlı değildir: her cihazda, her işletim sisteminde ve her yazıcıda aynı görünür. Bu, baskı öncesi iş akışlarında standart bir adımdır. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. +2. **Çerçevelere Dönüştür**'e tıklayın. +3. Ghostscript tüm metni vektör yollarına dönüştürür. +4. Sonucu indirin. Birden fazla dosya ZIP arşivi oluşturur. + +Yapılandırılacak bir ayar yoktur. Araç, tüm yazı tipi başvurularını tek geçişte çerçeveli yollara dönüştürmek için Ghostscript'i (WebAssembly) kullanır. + +## Neler Değişir + +- Metin karakterleri vektör eğrilerine (bezier yolları) dönüşür +- Yazı tipi gömmeye artık gerek kalmaz; PDF glif düzeyinde kendi kendine yeterlidir +- Vektör yolları genellikle yazı tipi başvurularından büyük olduğundan dosya boyutu artabilir +- Görsel görünüm birebir korunur + +## Neleri Kaybedersiniz + +- Metin seçme ve kopyala-yapıştır +- Metin aranabilirliği (Ctrl+F çalışmaz) +- Metin içeriğini düzenleme imkanı +- Ekran okuyucu erişilebilirliği + +## Kullanım Alanları + +- Çerçeveli yazı tipi isteyen bir matbaaya PDF göndermek +- Özel veya lisanslı yazı tipleri kullanan belgeleri bu yazı tiplerine sahip olmayan kişilerle paylaşmak +- Belgenizin diğer sistemlerde görünümünü değiştiren yazı tipi ikamesini önlemek +- Vektör girdi gerektiren lazer gravür veya CNC kesim iş akışları için PDF hazırlamak +- Logo ağırlıklı bir PDF'nin tüm platformlarda doğru görüntülenmesini sağlamak + +## İpuçları + +- Özgün PDF'nizi saklayın. Çerçeveye dönüştürme geri alınamaz; yolları tekrar düzenlenebilir metne çeviremezsiniz. +- Metnin aranabilir kalması gerekiyorsa, bunun yerine PDF'yi Rasterleştir aracını ve ardından OCR'ı değerlendirin. +- Çerçeveli PDF'ler daha büyük olma eğilimindedir. Dosya boyutu önemliyse sonrasında PDF Sıkıştır'ı çalıştırın. + +## İlgili Araçlar + +- [PDF'yi Düzleştir](./flatten-pdf): yazı tiplerine dokunmadan formları ve ek açıklamaları düzleştirin +- [PDF'yi Rasterleştir](./rasterize-pdf): vektör çerçeveler yerine görsel tabanlı PDF'ye dönüştürün +- [PDF Sıkıştır](./compress-pdf): çerçeveye dönüştürmeden sonra dosya boyutunu azaltın +- [PDF'den PDF/A'ya](./pdf-to-pdfa): yazı tipi bağımsızlığını sağladıktan sonra arşiv için dönüştürün diff --git a/docs/tr/tools/form-creator.md b/docs/tr/tools/form-creator.md new file mode 100644 index 00000000..351cfc80 --- /dev/null +++ b/docs/tr/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: PDF Formu Oluştur +description: Sürükle-bırak metin alanları, onay kutuları, açılır listeler, radyo düğmeleri ve daha fazlasıyla doldurulabilir PDF formları oluşturun. +--- + +# PDF Formu Oluştur + +Profesyonel, doldurulabilir PDF formlarını sıfırdan veya mevcut bir PDF'ye alan ekleyerek tasarlayın. Görsel düzenleyici, form öğelerini (metin alanları, onay kutuları, açılır listeler, radyo düğmeleri, imza alanları ve daha fazlası) doğrudan sayfa önizlemelerine sürükleyip bırakmanızı sağlar. Alan özelliklerini yapılandırın, koşullu görünürlük kuralları belirleyin ve tamamen etkileşimli bir PDF formu dışa aktarın. + +## Nasıl Çalışır + +1. Mevcut bir PDF yükleyin **veya** sıfırdan başlamak için **Boş PDF Oluştur**'a tıklayın. +2. Boş PDF oluşturuyorsanız bir sayfa boyutu seçin (Letter, A4, A5, Legal, Tabloid, A3 veya özel ölçüler). +3. Form düzenleyici, alan türleri araç çubuğu ve sayfa önizleme alanıyla açılır. +4. Araç çubuğundan bir alan türü seçin, ardından yerleştirmek için sayfaya tıklayın. +5. Alanları yeniden konumlandırmak için sürükleyin. Boyutları ayarlamak için yeniden boyutlandırma tutamaçlarını kullanın. +6. Alana tıklayarak alan adını, varsayılan değeri, yazı tipi boyutunu, hizalamayı ve daha fazlasını ayarlayabileceğiniz özellikler panelini açın. +7. Sayfa denetimleriyle sayfalar arasında gezinin. +8. Hazır doldurulabilir PDF'yi indirmek için **Kaydet**'e tıklayın. + +## Özellikler + +- Yeniden boyutlandırma için görsel tutamaçlarla sürükle-bırak alan yerleştirme +- Alan türleri: metin girişi, çok satırlı metin, onay kutusu, açılır liste, radyo düğmesi, imza, tarih, sayı ve barkod +- Her alanın adını, etiketini, varsayılan değerini, yazı tipi boyutunu, rengini, hizalamasını ve doğrulamasını yapılandırmak için özellikler paneli +- Alan eylemleri ve koşullu görünürlük kuralları (alanları diğer alan değerlerine göre göster/gizle) +- Çok sayfalı formlar için sayfa gezintisi +- Mevcut alan ayıklama: yüklenen PDF'lerdeki form alanlarını otomatik algılar ve içe aktarır +- Form tuvali olarak hem yüklenen PDF'lerin hem de boş sayfaların desteği +- Birden fazla hazır sayfa boyutu ve özel ölçüler +- bwip-js ile barkod oluşturma +- Radyo düğmesi grubu yönetimi + +## Seçenekler + +**Sayfa boyutu hazır ayarları (boş PDF'ler için):** + +- Letter (8,5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8,5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Özel (genişlik ve yükseklik belirtin) + +**Alan özellikleri (alan türüne göre değişir):** + +- Ad, etiket ve yer tutucu metin +- Varsayılan değer +- Yazı tipi ailesi, boyutu ve rengi +- Metin hizalama (sol, orta, sağ) +- Zorunlu alan anahtarı +- Salt okunur anahtarı +- Metin alanları için azami uzunluk +- Açılır listeler ve radyo düğmeleri için seçenek listesi +- Koşullu görünürlük eylemleri + +## Kullanım Alanları + +- Kişisel bilgiler için metin alanları ve politika onayı için onay kutuları içeren çalışan işe alım formları hazırlamak +- Hizmet seçimi için açılır listeler içeren müşteri kabul anketleri oluşturmak +- Hesaplanan alanlar ve barkod tanımlayıcılarıyla sipariş formları tasarlamak +- Geçti/kaldı derecelendirmesi için radyo düğmeleri içeren denetim kontrol listeleri hazırlamak +- Yanıtlara göre beliren koşullu takip soruları içeren anket formları oluşturmak + +## İpuçları + +- Mevcut bir PDF yüklerseniz araç, zaten var olan form alanlarını ayıklamaya çalışır; böylece bunları düzenleyebilir veya yenilerini ekleyebilirsiniz. +- Birbirini dışlayan seçimler oluşturmak için radyo düğmesi grubu özelliğini kullanın. Aynı radyo grubundaki alanlar bir grup adını paylaşır. +- Formunuzu indirip alan davranışını doğrulamak için [PDF Form Doldurucu](./form-filler)'da açarak test edin. + +## İlgili Araçlar + +- [PDF Form Doldurucu](./form-filler) +- [PDF İmzala](./sign-pdf) +- [PDF Düzenleyici](./edit-pdf) diff --git a/docs/tr/tools/form-filler.md b/docs/tr/tools/form-filler.md new file mode 100644 index 00000000..05164aec --- /dev/null +++ b/docs/tr/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF Form Doldurucu +description: XFA formları dahil PDF formlarını tarayıcınızda gömülü bir görüntüleyiciyle doldurun. +--- + +# PDF Form Doldurucu + +Form alanları içeren bir PDF'yi açın ve gömülü bir görüntüleyicide doğrudan doldurun. Araç hem standart AcroForm alanlarını hem de eski XFA (XML Forms Architecture) formlarını destekler. Formu tamamladıktan sonra doldurulmuş sürümü tek tıkla indirebilirsiniz. + +## Nasıl Çalışır + +1. Form alanları içeren bir PDF yükleyin. +2. Belge, form alanlarını etkileşimli girişler olarak gösteren tümleşik bir PDF görüntüleyicide açılır. +3. Doldurmak için metin alanlarına, onay kutularına, açılır listelere ve radyo düğmelerine tıklayın. +4. Tamamlanmış PDF'yi almak için **Kaydet ve Doldurulmuş Formu İndir**'e tıklayın. + +## Özellikler + +- Tam form alanı etkileşimini destekleyen gömülü PDF.js görüntüleyici +- Standart AcroForm alanları desteği (metin girişleri, onay kutuları, açılır listeler, radyo düğmeleri) +- XML tabanlı eski formlar için XFA form desteği +- Sayfa boyutlarına göre otomatik görüntüleyici boyutlandırma +- Ad ve boyut bilgisiyle dosya gösterimi + +## Seçenekler + +Ek yapılandırma seçeneği yoktur. Formu yükleyin, doldurun ve indirin. + +## Kullanım Alanları + +- Vergi formlarını, sigorta başvurularını veya resmi evrakları doldurmak +- PDF eki olarak gelen iş başvuru formlarını doldurmak +- Tedarikçi kayıt formlarını veya tedarikçi anketlerini tamamlamak +- Onay kutusu alanlarıyla uyumluluk kontrol listelerini onaylamak +- Randevudan önce tıbbi kabul formlarını doldurmak + +## İpuçları + +- XFA formları yalnızca bazı PDF görüntüleyiciler tarafından desteklenen eski bir biçimdir. Bir XFA PDF'yi Chrome'da veya çoğu diğer araçta açıp boş sayfalar görüyorsanız, bu görüntüleyicilerin XFA desteği olmadığı anlamına gelir. BentoPDF'in Form Doldurucusu ve Firefox, XFA'yı düzgün işler. +- Mevcut form alanı olmayan PDF'ler için önce alan eklemek üzere [PDF Formu Oluştur](./form-creator) aracını kullanın, ardından burada doldurun. +- Görüntüleyici boyutunu PDF'nin sayfa ölçülerine uyacak şekilde otomatik ayarlar. + +## İlgili Araçlar + +- [PDF Formu Oluştur](./form-creator) +- [PDF İmzala](./sign-pdf) +- [PDF Düzenleyici](./edit-pdf) diff --git a/docs/tr/tools/header-footer.md b/docs/tr/tools/header-footer.md new file mode 100644 index 00000000..7d46aedf --- /dev/null +++ b/docs/tr/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Üst Bilgi & Alt Bilgi +description: PDF sayfalarına dinamik sayfa numarası değişkenleriyle özelleştirilebilir üst bilgi ve alt bilgi metni ekleyin. +--- + +# Üst Bilgi & Alt Bilgi + +PDF sayfalarınızda altı konuma metin ekleyin: üst bilgi sol, üst bilgi orta, üst bilgi sağ, alt bilgi sol, alt bilgi orta ve alt bilgi sağ. Araç, sayfa numaraları ve toplam sayfa sayısı için dinamik değişkenleri destekler; böylece her sayfada otomatik güncellenen "Sayfa 3 / 10" gibi şablonlar oluşturabilirsiniz. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Biçimlendirme denetimlerini ve altı metin giriş alanını gösteren seçenekler paneli görünür. +3. İstediğiniz metni üst bilgi/alt bilgi konumlarından herhangi birine girin. +4. Dinamik sayfa numaralandırma için `{page}` ve `{total}` yer tutucularını kullanın. +5. Yazı tipi boyutunu ve rengini ayarlayın, isterseniz belirli bir sayfa aralığıyla sınırlayın. +6. İşlemek ve indirmek için **Üst Bilgi ve Alt Bilgi Ekle**'ye tıklayın. + +## Seçenekler + +- **Sayfa Aralığı**: Hangi sayfalara üst bilgi ve alt bilgi ekleneceğini isteğe bağlı olarak sınırlayın. Tüm sayfalara uygulamak için boş bırakın. Biçim: "1-3, 5" (virgülle ayrılmış aralıklar). +- **Yazı Tipi Boyutu**: 6 ile 24 punto arasında. Varsayılan 10'dur. +- **Yazı Tipi Rengi**: Renk seçiciyle istediğiniz rengi seçin. +- **Üst Bilgi Sol / Orta / Sağ**: Her sayfanın üst kısmı için metin alanları. +- **Alt Bilgi Sol / Orta / Sağ**: Her sayfanın alt kısmı için metin alanları. + +## Özellikler + +- Sayfa başına altı bağımsız metin konumu +- Geçerli sayfa numarasını ekleyen dinamik `{page}` değişkeni +- Toplam sayfa sayısını ekleyen dinamik `{total}` değişkeni +- Belirli sayfaları hedeflemek için sayfa aralığı filtreleme +- Özelleştirilebilir yazı tipi boyutu ve rengi +- Temiz, profesyonel çıktı için Helvetica yazı tipi + +## Kullanım Alanları + +- Bir raporun alt bilgi ortasına "Sayfa {page} / {total}" eklemek +- Üst bilgi soluna şirket adını, üst bilgi sağına belge tarihini yerleştirmek +- Hukuki belgelerin alt bilgisine gizlilik uyarıları eklemek +- Belirli sayfa aralıklarına belge revizyon numaralarını damgalamak + +## İpuçları + +- `{page}` ve `{total}` değişkenlerini tek bir alanda birleştirerek "Sayfa {page} / {total}" veya "{page}/{total}" gibi biçimler oluşturabilirsiniz. +- Çoğu alanı boş bırakıp yalnızca ihtiyacınız olan konumları doldurabilirsiniz. Boş alanlar atlanır. +- Görsel veya logo içeren daha karmaşık üst bilgiler için sayfanın üstüne konumlandırılmış [Filigran Ekle](./add-watermark) aracını kullanmayı düşünün. + +## İlgili Araçlar + +- [Sayfa Numaraları](./page-numbers) +- [Filigran Ekle](./add-watermark) +- [Bates Numaralandırma](./bates-numbering) diff --git a/docs/tr/tools/heic-to-pdf.md b/docs/tr/tools/heic-to-pdf.md new file mode 100644 index 00000000..93c75895 --- /dev/null +++ b/docs/tr/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC'den PDF'ye +description: iPhone ve iPad'lerdeki HEIC ve HEIF görsellerini doğrudan tarayıcınızda PDF biçimine dönüştürün. +--- + +# HEIC'den PDF'ye + +HEIC/HEIF görsellerini PDF'ye dönüştürün. HEIC, iOS 11'den beri iPhone ve iPad'lerde varsayılan fotoğraf biçimidir. Bu araç, masaüstü yazılımı kurmadan veya dosyaları bir sunucuya yüklemeden bu fotoğrafları PDF'ye çevirmenizi sağlar. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya HEIC/HEIF dosyalarınızı sürükleyip bırakın. +2. Dosya listesini gözden geçirin ve istemediğiniz dosyaları kaldırın. +3. **PDF'ye Dönüştür**'e tıklayın. Sonuç `from_heic.pdf` olarak iner. + +Her HEIC dosyasının kodu heic2any kitaplığıyla çözülür ve %92 kalitede PNG'ye dönüştürülür. PNG daha sonra pdf-lib ile PDF'ye gömülür; her görsel tam çözünürlükte kendi sayfasında yer alır. + +## Seçenekler + +Bu araç ek ayar sunmaz. HEIC görselleri gömülmeden önce yüksek kalitede (0,92) PNG'ye dönüştürülür. + +## Kullanım Alanları + +- Sigorta talebine veya rapora eklemek için iPhone fotoğraflarından PDF oluşturmak +- Bir emlak ilanı için HEIC fotoğraflarını tek bir yazdırılabilir belgeye dönüştürmek +- iPad ekran görüntülerini (HEIF biçimi) paylaşılabilir PDF'ye çevirmek +- Bir seyahat günlüğü için tatil fotoğraflarını toplu dönüştürmek + +## İpuçları + +- HEIC kod çözme işlemi tamamen tarayıcıda WebAssembly ile yapılır. Kod çözücü yüklenirken ilk dönüşüm biraz sürebilir. +- HEIC'i diğer görsel biçimleriyle (JPG, PNG vb.) karıştırmanız gerekiyorsa, HEIC'i diğer tüm biçimlerle birlikte işleyen [Görselleri PDF'ye](./image-to-pdf) aracını kullanın. +- iPhone'lardaki HEIC dosyaları genellikle GPS koordinatları dahil EXIF verileri içerir. PDF çıktısı bu meta verileri taşımaz. + +## İlgili Araçlar + +- [Görselleri PDF'ye](./image-to-pdf) +- [JPG'den PDF'ye](./jpg-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) diff --git a/docs/tr/tools/image-to-pdf.md b/docs/tr/tools/image-to-pdf.md new file mode 100644 index 00000000..0452c861 --- /dev/null +++ b/docs/tr/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Görselden PDF'ye +description: JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD ve 10'dan fazla diğer görsel biçimini tek bir PDF dosyasında birleştirin. +--- + +# Görselden PDF'ye + +Evrensel görselden PDF'ye dönüştürücü. Neredeyse her biçimde görsel yükleyin ve bunları tek bir PDF belgesinde birleştirin. Her görsel, özgün ölçülerine uygun boyutta kendi sayfasına yerleşir. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Bu, BentoPDF'in tüm görsel dönüştürücüleri arasındaki en geniş biçim desteğidir. Yalnızca belirli bir biçime ihtiyacınız varsa bunun yerine özel araçlardan birini kullanın. + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya görsel dosyalarınızı sürükleyip bırakın. Aynı anda birden fazla dosya seçebilirsiniz. +2. Dosya listesini gözden geçirin. İstemediğiniz dosyaları çöp kutusu simgesiyle kaldırın veya ek görseller eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. Açılır listeden bir **PDF Kalitesi** düzeyi seçin. +4. **PDF'ye Dönüştür**'e tıklayın. Araç görselleri PyMuPDF motoruyla işler ve sonucu `images_to_pdf.pdf` olarak indirir. + +## Seçenekler + +**PDF Kalitesi**, görseller PDF'ye gömülürken uygulanan görsel sıkıştırmasını belirler: + +- **Yüksek Kalite**: minimum sıkıştırma, daha büyük dosya boyutu. Baskı veya arşiv kullanımı için en iyisi. +- **Orta Kalite** (varsayılan): dengeli sıkıştırma. Çoğu amaç için uygundur. +- **Düşük Kalite**: agresif sıkıştırma, en küçük dosya boyutu. E-posta veya hızlı paylaşım için uygundur. + +HEIC ve WebP dosyaları gömülmeden önce otomatik olarak PNG'ye dönüştürülür. Bu işlem şeffaf biçimde gerçekleşir ve ek adım gerektirmez. + +## Kullanım Alanları + +- Telefon kamerasından alınan taranmış fişleri veya belgeleri tek bir PDF'de birleştirmek +- Karışık biçimli görsellerden fotoğraf portfolyosu veya lookbook oluşturmak +- iPhone fotoğraflarını (HEIC) masaüstü yazılımı kurmadan paylaşılabilir PDF'ye dönüştürmek +- PSD dışa aktarımlarından ve ekran görüntülerinden tasarım maketlerini müşteri teslimatı olarak bir araya getirmek +- Eski görsel biçimlerinden (PNM, JXR, JP2) oluşan bir klasörü tek bir PDF olarak arşivlemek + +## İpuçları + +- PDF'deki görsel sırası, dosya listesindeki sıraya uyar. Görselleri istediğiniz sırayla yükleyin. +- En küçük dosya boyutu için Düşük Kalite'yi seçin. Metin ağırlıklı taramalarda görsel fark çoğunlukla ihmal edilebilir düzeydedir. +- Yalnızca tek bir görsel biçiminiz varsa özel dönüştürücüler (JPG'den PDF'ye, PNG'den PDF'ye vb.) daha basit bir arayüzle aynı sonucu verir. + +## İlgili Araçlar + +- [JPG'den PDF'ye](./jpg-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) +- [HEIC'den PDF'ye](./heic-to-pdf) +- [WebP'den PDF'ye](./webp-to-pdf) diff --git a/docs/tr/tools/index.md b/docs/tr/tools/index.md new file mode 100644 index 00000000..46a60432 --- /dev/null +++ b/docs/tr/tools/index.md @@ -0,0 +1,183 @@ +# Araçlar Referansı + +BentoPDF, PDF'lerle çalışmak için **130'dan fazla araç** sunar. Tüm araçlar tamamen tarayıcınızda çalışır: dosyalarınız cihazınızdan asla çıkmaz. + +--- + +## Düzenle ve Not Ekle + +PDF belgelerinizi kapsamlı bir düzenleme araçları setiyle değiştirin, işaretleyin ve geliştirin. + +
+ +- [**PDF Düzenleyici**](./edit-pdf): Not ekleyin, vurgulayın, karartın, yorum yapın, şekil/görsel ekleyin, arayın ve PDF'leri görüntüleyin. +- [**Yer İmlerini Düzenle**](./bookmark): PDF yer imlerini ekleyin, düzenleyin, içe aktarın, silin ve ayıklayın. +- [**İçindekiler Tablosu**](./table-of-contents): PDF yer imlerinden bir içindekiler sayfası oluşturun. +- [**Sayfa Numaraları**](./page-numbers): Belgenize sayfa numaraları ekleyin. +- [**Sayfa Etiketleri Ekle**](./add-page-labels): Roma rakamları, önekler ve özel başlangıçlarla PDF sayfa etiketleri uygulayın. +- [**Bates Numaralandırma**](./bates-numbering): Bir veya daha fazla PDF dosyasına sıralı Bates numaraları ekleyin. +- [**Filigran Ekle**](./add-watermark): PDF sayfalarınızın üzerine metin veya görsel damgalayın. +- [**Üst Bilgi ve Alt Bilgi**](./header-footer): Sayfaların üstüne ve altına metin ekleyin. +- [**Renkleri Ters Çevir**](./invert-colors): PDF'inizin koyu mod sürümünü oluşturun. +- [**Tarayıcı Efekti**](./scanner-effect): PDF'inizi taranmış bir belge gibi gösterin. +- [**Renkleri Ayarla**](./adjust-colors): Parlaklığı, kontrastı, doygunluğu ve daha fazlasını ince ayarlayın. +- [**Arka Plan Rengi**](./background-color): PDF'inizin arka plan rengini değiştirin. +- [**Metin Rengini Değiştir**](./text-color): PDF'inizdeki metnin rengini değiştirin. +- [**PDF İmzala**](./sign-pdf): İmzanızı çizin, yazın veya yükleyin. +- [**Damga Ekle**](./add-stamps): Not ekleme araç çubuğunu kullanarak PDF'inize görsel damgalar ekleyin. +- [**Not Eklemeleri Kaldır**](./remove-annotations): Yorumları, vurguları ve bağlantıları temizleyin. +- [**PDF Kırp**](./crop-pdf): PDF'inizdeki her sayfanın kenar boşluklarını kırpın. +- [**PDF Form Doldurucu**](./form-filler): Formları doğrudan tarayıcıda doldurun. XFA formlarını da destekler. +- [**PDF Formu Oluştur**](./form-creator): Sürükle-bırak metin alanlarıyla doldurulabilir PDF formları oluşturun. +- [**Boş Sayfaları Kaldır**](./remove-blank-pages): Boş sayfaları otomatik olarak algılayın ve silin. + +
+ +--- + +## PDF'ye Dönüştür + +Görselleri, belgeleri, e-kitapları ve diğer dosya biçimlerini PDF'ye çevirin. + +
+ +- [**Görselleri PDF'ye**](./image-to-pdf): JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP ve daha fazlasını PDF'ye dönüştürün. +- [**JPG'den PDF'ye**](./jpg-to-pdf): Bir veya daha fazla JPG görselinden PDF oluşturun. +- [**PNG'den PDF'ye**](./png-to-pdf): Bir veya daha fazla PNG görselinden PDF oluşturun. +- [**WebP'den PDF'ye**](./webp-to-pdf): Bir veya daha fazla WebP görselinden PDF oluşturun. +- [**SVG'den PDF'ye**](./svg-to-pdf): Bir veya daha fazla SVG görselinden PDF oluşturun. +- [**BMP'den PDF'ye**](./bmp-to-pdf): Bir veya daha fazla BMP görselinden PDF oluşturun. +- [**HEIC'den PDF'ye**](./heic-to-pdf): Bir veya daha fazla HEIC görselinden PDF oluşturun. +- [**TIFF'den PDF'ye**](./tiff-to-pdf): Bir veya daha fazla TIFF görselinden PDF oluşturun. +- [**Metinden PDF'ye**](./txt-to-pdf): Düz metin dosyasını PDF'ye dönüştürün. +- [**Markdown'dan PDF'ye**](./markdown-to-pdf): Markdown'ı canlı önizleme ve sözdizimi vurgulamayla PDF'ye dönüştürün. +- [**JSON'dan PDF'ye**](./json-to-pdf): JSON dosyalarını PDF biçimine dönüştürün. +- [**ODT'den PDF'ye**](./odt-to-pdf): ODT (OpenDocument Text) dosyalarını PDF'ye dönüştürün. +- [**CSV'den PDF'ye**](./csv-to-pdf): CSV elektronik tablolarını PDF'ye dönüştürün. +- [**RTF'den PDF'ye**](./rtf-to-pdf): RTF (Rich Text Format) belgelerini PDF'ye dönüştürün. +- [**Word'den PDF'ye**](./word-to-pdf): Word belgelerini (DOCX, DOC, ODT) PDF'ye dönüştürün. +- [**Excel'den PDF'ye**](./excel-to-pdf): Excel elektronik tablolarını (XLSX, XLS, ODS) PDF'ye dönüştürün. +- [**PowerPoint'ten PDF'ye**](./powerpoint-to-pdf): PowerPoint sunumlarını (PPTX, PPT, ODP) PDF'ye dönüştürün. +- [**XPS'ten PDF'ye**](./xps-to-pdf): XPS/OXPS belgelerini PDF'ye dönüştürün. +- [**MOBI'den PDF'ye**](./mobi-to-pdf): MOBI e-kitaplarını PDF'ye dönüştürün. +- [**EPUB'dan PDF'ye**](./epub-to-pdf): EPUB e-kitaplarını PDF'ye dönüştürün. +- [**FB2'den PDF'ye**](./fb2-to-pdf): FictionBook (FB2) e-kitaplarını PDF'ye dönüştürün. +- [**CBZ'den PDF'ye**](./cbz-to-pdf): Çizgi roman arşivlerini (CBZ/CBR) PDF'ye dönüştürün. +- [**WPD'den PDF'ye**](./wpd-to-pdf): WordPerfect belgelerini (WPD) PDF'ye dönüştürün. +- [**WPS'ten PDF'ye**](./wps-to-pdf): WPS Office belgelerini PDF'ye dönüştürün. +- [**XML'den PDF'ye**](./xml-to-pdf): XML belgelerini PDF'ye dönüştürün. +- [**ODG'den PDF'ye**](./odg-to-pdf): OpenDocument Graphics (ODG) dosyalarını PDF'ye dönüştürün. +- [**ODS'den PDF'ye**](./ods-to-pdf): OpenDocument Spreadsheet (ODS) dosyalarını PDF'ye dönüştürün. +- [**ODP'den PDF'ye**](./odp-to-pdf): OpenDocument Presentation (ODP) dosyalarını PDF'ye dönüştürün. +- [**PUB'dan PDF'ye**](./pub-to-pdf): Microsoft Publisher (PUB) dosyalarını PDF'ye dönüştürün. +- [**VSD'den PDF'ye**](./vsd-to-pdf): Microsoft Visio (VSD, VSDX) dosyalarını PDF'ye dönüştürün. +- [**PSD'den PDF'ye**](./psd-to-pdf): Adobe Photoshop (PSD) dosyalarını PDF'ye dönüştürün. +- [**E-postadan PDF'ye**](./email-to-pdf): E-posta dosyalarını (EML, MSG) PDF biçimine dönüştürün. + +
+ +--- + +## PDF'den Dönüştür + +PDF'lerdeki içeriği görsellere, belgelere ve veri biçimlerine aktarın. + +
+ +- [**PDF'den JPG'ye**](./pdf-to-jpg): Her PDF sayfasını bir JPG görseline dönüştürün. +- [**PDF'den PNG'ye**](./pdf-to-png): Her PDF sayfasını bir PNG görseline dönüştürün. +- [**PDF'den WebP'ye**](./pdf-to-webp): Her PDF sayfasını bir WebP görseline dönüştürün. +- [**PDF'den BMP'ye**](./pdf-to-bmp): Her PDF sayfasını bir BMP görseline dönüştürün. +- [**PDF'den TIFF'e**](./pdf-to-tiff): Her PDF sayfasını bir TIFF görseline dönüştürün. +- [**PDF'den CBZ'ye**](./pdf-to-cbz): Çizgi roman okuyucuları ve Calibre için bir PDF'yi CBZ'ye (Comic Book Archive) dönüştürün. +- [**PDF'den SVG'ye**](./pdf-to-svg): Her PDF sayfasını ölçeklenebilir bir vektör grafiğe dönüştürün. +- [**PDF'den CSV'ye**](./pdf-to-csv): PDF'deki tabloları ayıklayıp CSV biçimine dönüştürün. +- [**PDF'den Excel'e**](./pdf-to-excel): PDF'deki tabloları ayıklayıp Excel'e (XLSX) dönüştürün. +- [**PDF'yi Gri Tonlamaya**](./pdf-to-greyscale): Tüm renkleri siyah beyaza dönüştürün. +- [**PDF'den JSON'a**](./pdf-to-json): PDF dosyalarını JSON biçimine dönüştürün. +- [**PDF'den Word'e**](./pdf-to-word): PDF dosyalarını düzenlenebilir Word belgelerine dönüştürün. +- [**Görselleri Ayıkla**](./extract-images): PDF dosyalarınızdaki tüm gömülü görselleri ayıklayın. +- [**PDF'den Markdown'a**](./pdf-to-markdown): PDF metnini ve tablolarını Markdown biçimine dönüştürün. +- [**PDF'yi Yapay Zeka İçin Hazırla**](./prepare-pdf-for-ai): RAG/LLM hatları için PDF içeriğini LlamaIndex JSON olarak ayıklayın. +- [**PDF'den Metne**](./pdf-to-text): PDF dosyalarından metin ayıklayıp düz metin olarak kaydedin. +- [**Tabloları Ayıkla**](./extract-tables): PDF'lerdeki tabloları CSV, JSON veya Markdown olarak ayıklayın. + +
+ +--- + +## Düzenle ve Yönet + +PDF sayfalarınızı ve dosyalarınızı yeniden düzenleyin, birleştirin, bölün ve yönetin. + +
+ +- [**PDF İş Akışı Oluşturucu**](./pdf-workflow): Görsel bir düğüm düzenleyiciyle özel PDF işleme hatları oluşturun. +- [**PDF Çoklu Araç**](./pdf-multi-tool): Sayfa yönetimi olan tam özellikli PDF düzenleyici. +- [**PDF'de OCR**](./ocr-pdf): PDF'yi aranabilir ve kopyalanabilir hale getirin. +- [**PDF Birleştir**](./merge-pdf): Birden fazla PDF'yi tek dosyada birleştirin. +- [**Sayfaları Değiştirerek Birleştir**](./alternate-merge): Her PDF'den sırayla sayfalar alarak PDF'leri birleştirin. +- [**Çift Yönlü Harmanlama**](./duplex-collate): Ön/arka tarama bloklarını doğru sayfa sırasına yeniden dizin. +- [**Düzenle ve Çoğalt**](./organize-pdf): Sayfaları çoğaltın, yeniden sıralayın ve silin. +- [**Ek Dosya Ekle**](./add-attachments): PDF'inize bir veya daha fazla dosya gömün. +- [**Ek Dosyaları Ayıkla**](./extract-attachments): PDF'lerdeki tüm gömülü dosyaları ZIP olarak ayıklayın. +- [**Ek Dosyaları Düzenle**](./edit-attachments): PDF'inizdeki ekleri görüntüleyin veya kaldırın. +- [**PDF Katmanları (OCG)**](./pdf-layers): PDF'inizdeki OCG katmanlarını görüntüleyin, açıp kapatın, ekleyin ve silin. +- [**PDF Böl**](./split-pdf): Bir sayfa aralığını yeni bir PDF'ye ayıklayın. +- [**Sayfaları Böl**](./divide-pages): Sayfaları yatay veya dikey olarak bölün. +- [**Sayfaları Ayıkla**](./extract-pages): Seçili sayfaları yeni dosyalar olarak kaydedin. +- [**Sayfaları Sil**](./delete-pages): Belgenizden belirli sayfaları kaldırın. +- [**Boş Sayfa Ekle**](./add-blank-page): PDF'inizin herhangi bir yerine boş sayfa ekleyin. +- [**Sayfaları Ters Çevir**](./reverse-pages): Belgenizdeki tüm sayfaların sırasını tersine çevirin. +- [**PDF Döndür**](./rotate-pdf): Sayfaları 90 derecelik adımlarla çevirin. +- [**Özel Derece ile Döndür**](./rotate-custom): Sayfaları istediğiniz herhangi bir açıyla döndürün. +- [**N'li PDF**](./n-up-pdf): Birden fazla sayfayı tek bir sayfada düzenleyin. +- [**PDF Kitapçık**](./pdf-booklet): Sayfaları çift taraflı kitapçık baskısı için yeniden düzenleyin. +- [**Tek Sayfada Birleştir**](./combine-single-page): Tüm sayfaları tek bir sürekli kaydırmada birleştirin. +- [**Meta Verileri Görüntüle**](./view-metadata): PDF'inizin gizli özelliklerini inceleyin. +- [**Meta Verileri Düzenle**](./edit-metadata): Yazarı, başlığı ve diğer özellikleri değiştirin. +- [**PDF'leri ZIP'e**](./pdf-to-zip): Birden fazla PDF dosyasını ZIP arşivinde paketleyin. +- [**PDF'leri Karşılaştır**](./compare-pdfs): İki PDF'yi yan yana karşılaştırın. +- [**PDF'yi Posterleştir**](./posterize-pdf): Büyük bir sayfayı birden fazla küçük sayfaya bölün. + +
+ +--- + +## Optimize Et ve Onar + +PDF'lerinizi daha iyi performans ve uyumluluk için sıkıştırın, düzeltin ve optimize edin. + +
+ +- [**PDF Sıkıştır**](./compress-pdf): PDF'inizin dosya boyutunu küçültün. +- [**PDF'den PDF/A'ya**](./pdf-to-pdfa): Uzun süreli arşivleme için PDF'yi PDF/A'ya dönüştürün. +- [**Sayfa Boyutunu Düzelt**](./fix-page-size): Tüm sayfaları tek tip boyuta getirin. +- [**PDF'yi Doğrusallaştır**](./linearize-pdf): PDF'yi hızlı web görüntüleme için optimize edin. +- [**Sayfa Boyutları**](./page-dimensions): Sayfa boyutunu, yönlendirmeyi ve birimleri analiz edin. +- [**Kısıtlamaları Kaldır**](./remove-restrictions): Parola korumasını ve güvenlik kısıtlamalarını kaldırın. +- [**PDF Onar**](./repair-pdf): Bozuk veya hasarlı PDF dosyalarından verileri kurtarın. +- [**PDF'yi Rasterleştir**](./rasterize-pdf): PDF'yi görsel tabanlı PDF'ye dönüştürün. Katmanları düzleştirin ve seçilebilir metni kaldırın. +- [**PDF Eğriliğini Düzelt**](./deskew-pdf): OpenCV kullanarak eğik taranmış sayfaları otomatik olarak düzeltin. +- [**Yazı Tipi Çerçeveye Dönüştür**](./font-to-outline): Tutarlı görüntüleme için tüm yazı tiplerini vektör çerçevelerine dönüştürün. + +
+ +--- + +## PDF'yi Güvenceye Al + +PDF belgelerinizi koruyun, şifreleyin ve erişimi denetleyin. + +
+ +- [**PDF'yi Şifrele**](./protect-pdf): PDF'inizi parola ekleyerek kilitleyin. +- [**PDF'yi Temizle**](./sanitize-pdf): Meta verileri, not eklemeleri, betikleri ve daha fazlasını kaldırın. +- [**PDF Şifresini Çöz**](./unlock-pdf): Parola korumasını kaldırarak PDF'nin kilidini açın. +- [**PDF'yi Düzleştir**](./flatten-pdf): Form alanlarını ve not eklemelerini düzenlenemez yapın. +- [**Meta Verileri Kaldır**](./remove-metadata): PDF'inizdeki gizli verileri temizleyin. +- [**İzinleri Değiştir**](./change-permissions): Bir PDF'de kullanıcı izinlerini ayarlayın veya değiştirin. +- [**Dijital İmza**](./digital-sign-pdf): X.509 sertifikalarıyla kriptografik bir dijital imza ekleyin. +- [**İmzayı Doğrula**](./validate-signature-pdf): Dijital imzaları doğrulayın ve sertifika ayrıntılarını görüntüleyin. + +
diff --git a/docs/tr/tools/invert-colors.md b/docs/tr/tools/invert-colors.md new file mode 100644 index 00000000..db7aa83c --- /dev/null +++ b/docs/tr/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Renkleri Ters Çevir +description: Herhangi bir belgenin koyu mod sürümünü oluşturmak için PDF'inizdeki tüm renkleri ters çevirin. +--- + +# Renkleri Ters Çevir + +PDF'inizdeki her rengi tersine çevirin. Beyaz arka planlar siyah, siyah metin beyaz olur ve diğer tüm renkler tamamlayıcı değerlerine kayar. Herhangi bir PDF'nin "koyu mod" sürümünü oluşturmanın en hızlı yoludur. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. İşlemek için **Renkleri Ters Çevir**'e tıklayın. +3. Ters çevrilmiş PDF otomatik olarak iner. + +Ek ayar yoktur. Araç her sayfayı görsel olarak işler, tüm piksel renklerini ters çevirir ve sonucu yeni bir PDF olarak yeniden birleştirir. + +## Özellikler + +- Tüm sayfalar için tek tıkla renk ters çevirme +- Belgedeki her sayfayı işler +- Özgün sayfa ölçülerini ve düzenini korur +- İçerik türünden bağımsız olarak (metin, görsel, karışık) her PDF'de çalışır + +## Kullanım Alanları + +- Ders kitaplarının veya kılavuzların geceleri rahat okunabilmesi için koyu mod sürümlerini oluşturmak +- Erişilebilirlik amacıyla belgelerin yüksek kontrastlı sürümlerini hazırlamak +- Hatalı pozlamayla taranmış belgeleri ters çevirmek +- Görsel ağırlıklı PDF'lerin görsel analiz için negatif sürümlerini oluşturmak + +## İpuçları + +- Araç efekti uygulamak için sayfaları rasterleştirdiğinden çıktı görsel tabanlıdır. Metin artık seçilebilir veya aranabilir olmaz. Ters çevirmeden sonra aranabilir metne ihtiyacınız varsa çıktıyı bir OCR aracından geçirin. +- Daha ayrıntılı renk ayarları (parlaklık, kontrast, doygunluk) için bunun yerine [Renkleri Ayarla](./adjust-colors) aracını kullanın. +- Çok sayfalı büyük PDF'lerin işlenmesi daha uzun sürebilir; çünkü her sayfa ayrı ayrı işlenir ve ters çevrilir. + +## İlgili Araçlar + +- [Renkleri Ayarla](./adjust-colors) +- [Arka Plan Rengi](./background-color) +- [Tarayıcı Efekti](./scanner-effect) diff --git a/docs/tr/tools/jpg-to-pdf.md b/docs/tr/tools/jpg-to-pdf.md new file mode 100644 index 00000000..2eb1f342 --- /dev/null +++ b/docs/tr/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG'den PDF'ye +description: Bir veya daha fazla JPG, JPEG ve JPEG 2000 görselini doğrudan tarayıcınızda tek bir PDF dosyasına dönüştürün. +--- + +# JPG'den PDF'ye + +JPG görsellerini temiz bir PDF'ye dönüştürün. Tek bir dosya yükleyin veya birden fazla JPG'yi toplu olarak ekleyin; her görsel çıktı belgesinde tam boyutlu bir sayfa olur. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya JPG dosyalarınızı sürükleyip bırakın. Çoklu seçim desteklenir. +2. Yüklenen dosyaları gözden geçirin. Tek tek dosyaları kaldırmak için çöp kutusu simgesini kullanın veya listeye eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. Bir **PDF Kalitesi** düzeyi seçin. +4. **PDF'ye Dönüştür**'e tıklayın. Araç görselleri kalite ayarınıza göre sıkıştırır, PyMuPDF motoruyla dönüştürür ve `from_jpgs.pdf` dosyasını indirir. + +## Seçenekler + +**PDF Kalitesi**, her görsel PDF'ye gömülmeden önce uygulanan sıkıştırmayı ayarlar: + +- **Yüksek Kalite**: azami ayrıntıyı korur. Fotoğrafçılık veya baskı için kullanın. +- **Orta Kalite** (varsayılan): netlik ile dosya boyutu arasında sağlam bir denge. +- **Düşük Kalite**: en küçük çıktı için agresif sıkıştırma. + +## Kullanım Alanları + +- JPG olarak kaydedilmiş taranmış belgeleri tek bir başvuru PDF'sine dönüştürmek +- Ürün fotoğraflarını müşteriler için bir kataloğa paketlemek +- JPEG 2000 tıbbi veya uydu görüntülerini taşınabilir bir PDF'ye çevirmek +- Kamera dışa aktarımlarından yazdırılabilir bir fotoğraf albümü oluşturmak + +## İpuçları + +- JPEG 2000 dosyaları (`.jp2`, `.jpx`) yalnızca standart JPEG değil, tam olarak desteklenir. Bu, tıbbi görüntüleme ve coğrafi veriler için kullanışlıdır. +- JPG'leriniz telefon kamerasından geliyorsa Orta kalite genellikle ekranda görünür bir fark olmadan Yüksek'ten %40-60 daha küçük bir dosya üretir. + +## İlgili Araçlar + +- [Görselleri PDF'ye](./image-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) +- [WebP'den PDF'ye](./webp-to-pdf) diff --git a/docs/tr/tools/json-to-pdf.md b/docs/tr/tools/json-to-pdf.md new file mode 100644 index 00000000..5aab3458 --- /dev/null +++ b/docs/tr/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON'dan PDF'ye +description: PDF dosyalarını BentoPDF'in JSON biçiminden yeniden oluşturun. JSON dışa aktarımlarını özgün PDF belgelerine geri dönüştürün. +--- + +# JSON'dan PDF'ye + +Daha önce BentoPDF'in **PDF'den JSON'a** aracıyla oluşturulmuş JSON dosyalarından PDF belgelerini yeniden oluşturun. Bu, gidiş-dönüş bir dönüştürme aracıdır: bir PDF'nin yapılandırılmış JSON temsilini alır ve özgün belgeyi yeniden oluşturur. + +::: warning +Bu araç yalnızca BentoPDF'in PDF'den JSON'a dönüştürücüsünün ürettiği JSON dosyalarını kabul eder. API'lerden, veritabanlarından veya diğer araçlardan gelen standart JSON dosyaları desteklenmez. +::: + +## Desteklenen Biçimler + +| Girdi | Açıklama | +| :------ | :---------------------------------------------------------------- | +| `.json` | BentoPDF'in PDF'den JSON'a aracıyla dışa aktarılan JSON dosyaları | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya bir veya daha fazla JSON dosyasını sürükleyip bırakın. +2. Dosya listesi, seçilen her dosyayı boyutuyla birlikte gösterir. +3. **PDF'ye Dönüştür**'e tıklayın. Araç tüm dosyaları bir Web Worker ve CPDF motoruyla işler. +4. Çıktı, her girdi JSON dosyası için bir PDF içeren `jsons-to-pdf.zip` olarak iner. + +Dönüştürme arka planda bir Web Worker'da çalışır; bu sayede büyük dosyalarda bile arayüz yanıt vermeye devam eder. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Çıktı PDF'yi tamamen JSON yapısı belirler. + +## Çıktı + +Birden fazla JSON dosyası dönüştürülürken sonuçlar ZIP arşivi olarak teslim edilir. Her PDF, kaynak JSON dosyasının adını alır (ör. `report.json` dosyası `report.pdf` olur). + +## Kullanım Alanları + +- JSON tabanlı bir yedekten veya arşiv hattından PDF'leri geri yüklemek +- İnceleme için bir PDF'yi JSON üzerinden geçirip tekrar PDF'ye döndürmek +- JSON yapısında programatik değişikliklerden sonra belgeleri yeniden oluşturmak +- PDF'den JSON'a dışa aktarımın tüm belge içeriğini yakaladığını geri dönüştürerek doğrulamak + +## İpuçları + +- Rastgele JSON verilerini (API yanıtları veya yapılandırma dosyaları gibi) biçimlendirilmiş bir PDF'ye dönüştürmeniz gerekiyorsa [Metinden PDF'ye](./txt-to-pdf) aracı daha uygundur. JSON'u metin olarak yapıştırın; düzgün biçimlendirmeyle işlenecektir. +- Bu aracın çalışması için CPDF WebAssembly motorunun erişilebilir olması gerekir. Kendi sunucusunda barındırılan örneklerde CPDF WASM dosyalarının yapılandırılması gerekir. + +## İlgili Araçlar + +- [Metinden PDF'ye](./txt-to-pdf) +- [Markdown'dan PDF'ye](./markdown-to-pdf) +- [CSV'den PDF'ye](./csv-to-pdf) diff --git a/docs/tr/tools/linearize-pdf.md b/docs/tr/tools/linearize-pdf.md new file mode 100644 index 00000000..a3e8a657 --- /dev/null +++ b/docs/tr/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: PDF'yi Doğrusallaştır +description: PDF dosyalarını aşamalı yükleme ile hızlı web görüntüleme için optimize edin. "Hızlı Web Görünümü" optimizasyonu olarak da bilinir. +--- + +# PDF'yi Doğrusallaştır + +Doğrusallaştırma, bir PDF'yi yeniden yapılandırarak ilk sayfanın tüm dosya inmeden görüntülenebilmesini sağlar. Adobe buna "Hızlı Web Görünümü" der. PDF'leri bir web sitesinde barındırıyor veya bir belge portalı üzerinden sunuyorsanız doğrusallaştırma, açılışlarını belirgin biçimde hızlandırır. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. +2. **PDF'yi Doğrusallaştır**'a tıklayın. +3. Sonuçları, tüm doğrusallaştırılmış dosyaları içeren bir ZIP arşivi olarak indirin. + +Yapılandırılacak ayar yoktur. Araç, QPDF'in `--linearize` bayrağını kullanır; bu bayrak PDF'nin görsel içeriğini değiştirmeden iç yapısını yeniden düzenler. + +## Doğrusallaştırma Ne Yapar + +- PDF nesnelerini, ilk sayfanın verisi dosyanın başında yer alacak şekilde yeniden sıralar +- Görüntüleyicilerin her sayfayı nerede bulacağını bilmesi için bir doğrusallaştırma sözlüğü ve ipucu tabloları ekler +- Bayt aralığı isteklerini etkinleştirir: tarayıcı tüm dosyayı indirmeden yalnızca ilk sayfayı alabilir +- Verimli rastgele erişim için çapraz başvuru tablosunu temizler + +## Özellikler + +- Tek işlemde birden fazla PDF'nin toplu işlenmesi +- Çıktı tüm içeriği, yazı tiplerini, görselleri ve etkileşimli öğeleri korur +- Güvenilir, standartlara uygun doğrusallaştırma için QPDF (WebAssembly) kullanır +- Kolay indirme için sonuçlar ZIP içinde paketlenir + +## Kullanım Alanları + +- Kullanıcıların anında sayfa görüntülemesini beklediği bir web sitesinde PDF raporları barındırmak +- PDF'leri tarayıcı içi görüntüleyicilerle web uygulamalarına gömmek +- Yavaş mobil bağlantılardan erişilen PDF kataloglarını veya kılavuzlarını yayımlamak +- Bayt aralığı sunumunu destekleyen içerik dağıtım ağları (CDN) için belgeleri hazırlamak + +## İpuçları + +- Diğer tüm düzenlemeler bittikten sonra doğrusallaştırın. Sonraki herhangi bir değişiklik (birleştirme, sayfa ekleme) doğrusallaştırmayı bozar. +- Mümkün olan en küçük ve en hızlı yüklenen PDF'ler için PDF Sıkıştır ile birleştirin. +- Doğrusallaştırma dosya boyutuna küçük bir ek yük getirir (genellikle %1'in altında). + +## İlgili Araçlar + +- [PDF Sıkıştır](./compress-pdf): doğrusallaştırmadan önce dosya boyutunu azaltın +- [PDF Onar](./repair-pdf): doğrusallaştırmayı engelleyen yapısal sorunları giderin +- [Meta Verileri Kaldır](./remove-metadata): çevrimiçi yayımlamadan önce meta verileri temizleyin diff --git a/docs/tr/tools/markdown-to-pdf.md b/docs/tr/tools/markdown-to-pdf.md new file mode 100644 index 00000000..30cbb6d8 --- /dev/null +++ b/docs/tr/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown'dan PDF'ye +description: Markdown yazın veya yapıştırın ve canlı önizleme ile sözdizimi vurgulamayla profesyonelce biçimlendirilmiş PDF olarak dışa aktarın. +--- + +# Markdown'dan PDF'ye + +Canlı önizleme ve tek tıkla PDF dışa aktarma sunan, tam özellikli bir Markdown düzenleyici. Sıfırdan yazın, mevcut bir `.md` dosyası yükleyin veya panonuzdan içerik yapıştırın. Düzenleyici Markdown'ınızı gerçek zamanlı işler ve tarayıcının yerleşik yazdırma motoruyla stillendirilmiş bir PDF dışa aktarır. + +## Desteklenen Biçimler + +| Girdi | Açıklama | +| :-------------- | :---------------------------------- | +| `.md` dosyaları | Yükle düğmesiyle yükleyin | +| Doğrudan giriş | Düzenleyiciye yazın veya yapıştırın | + +## Nasıl Çalışır + +1. Markdown'dan PDF'ye aracını açın. Düzenleyici bölünmüş görünümle yüklenir: solda Markdown kaynağı, sağda işlenmiş önizleme. +2. Markdown'ınızı yazın, yapıştırın veya bir `.md` dosyası yüklemek için **Yükle**'ye tıklayın. +3. Araç çubuğundaki tema kaydırıcısıyla açık ve koyu temalar arasında geçiş yapın. +4. Tarayıcının yazdırma iletişim kutusu üzerinden PDF oluşturmak için **PDF Dışa Aktar**'a tıklayın (veya `Ctrl/Cmd + S` tuşlarına basın). + +## Özellikler + +Düzenleyici, temellerin ötesinde kapsamlı bir Markdown özellikleri kümesini destekler: + +- **Standart Markdown**: başlıklar, kalın, italik, bağlantılar, görseller, listeler, alıntı blokları, yatay çizgiler +- 15'ten fazla dil için sözdizimi vurgulamalı **kod blokları** (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash ve daha fazlası) +- **Mermaid diyagramları**: akış şemaları, sıralama diyagramları, ER diyagramları ve diğer Mermaid grafik türleri doğrudan önizlemede işlenir +- Standart Markdown tablo sözdizimiyle **tablolar** +- Onay kutulu **görev listeleri** +- **Dipnotlar**, **alt simge**, **üst simge** +- **Tanım listeleri**, **kısaltmalar** +- **Emoji** desteği (`:smile:` emoji olarak işlenir) +- **Vurgular** (`==marked text==`) ve **eklemeler** (`++inserted text++`) +- **Otomatik bağlanan URL'ler**: düz URL'ler tıklanabilir bağlantılara dönüştürülür +- **İçindekiler tablosu** oluşturma +- Başlıklarda **çapa bağlantıları** + +## Kullanım Alanları + +- Proje belgeleri yazıp paydaşlar için özenli bir PDF dışa aktarmak +- Kod örnekleri ve Mermaid mimari diyagramları içeren teknik raporlar oluşturmak +- Çevrimdışı kullanım veya yazdırma için bir GitHub README'yi PDF'ye dönüştürmek +- Görev listeleri ve tablolarla bir teklif veya şartname taslağı hazırlamak +- Markdown ile yazılmış ders notlarından stillendirilmiş bir ders dokümanı oluşturmak + +## İpuçları + +- PDF çıktısı, tarayıcının PDF olarak yazdırma özelliğini kullanır. Chrome'da kaydetmeden önce yazdırma iletişim kutusunda kenar boşluklarını ve ölçeği özelleştirebilirsiniz. +- Mermaid diyagramları önizlemede işlenir ancak ilk kullanımda başlatılması biraz zaman alabilir. +- Düğmeye uzanmadan dışa aktarmak için klavye kısayolu olarak `Ctrl/Cmd + S` kullanın. + +## İlgili Araçlar + +- [Metinden PDF'ye](./txt-to-pdf) +- [Word'den PDF'ye](./word-to-pdf) +- [JSON'dan PDF'ye](./json-to-pdf) diff --git a/docs/tr/tools/merge-pdf.md b/docs/tr/tools/merge-pdf.md new file mode 100644 index 00000000..be875f51 --- /dev/null +++ b/docs/tr/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF Birleştir +description: Birden fazla PDF dosyasını sürükle-bırak yeniden sıralama ve sayfa düzeyinde denetimle tek bir belgede birleştirin. +--- + +# PDF Birleştir + +Birden fazla PDF dosyasını tek bir belgede birleştirin. Dosyaların tamamını belirli bir sırayla birleştirebilir veya yüklenen her PDF'deki tek tek sayfalar üzerinde ayrıntılı denetim için Sayfa Moduna geçebilirsiniz. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları sürükleyerek iki veya daha fazla PDF dosyası yükleyin. +2. Üstteki anahtarla **Dosya Modu** ve **Sayfa Modu** arasında seçim yapın. +3. Dosya Modunda dosyaları sürükleyerek yeniden sıralayın ve isteğe bağlı olarak her dosya için sayfa aralıkları belirtin (ör. `1-3, 5`). Tüm sayfaları dahil etmek için aralığı boş bırakın. +4. Sayfa Modunda, tam sayfa sıranızı oluşturmak için tek tek sayfa küçük resimlerini sürükleyip bırakın. +5. Her şeyi tek dosyada birleştirmek için **PDF'leri Birleştir**'e tıklayın. Birleştirilmiş PDF otomatik olarak iner. + +## Özellikler + +- İki birleştirme modu: hızlı tam dosya birleştirme için Dosya Modu, sayfa başına denetim için Sayfa Modu +- Her iki modda akıcı animasyonlarla sürükle-bırak yeniden sıralama +- Sayfa aralığı sözdizimi (ör. `1-3, 5, 8-10`), Sayfa Moduna geçmeden sayfaları ayıklamanızı sağlar +- Tembel yüklenen sayfa küçük resimleri, büyük belgelerde bile arayüzü yanıt verir tutar +- Dosya sayısı veya toplam sayfa sayısı sınırı yok +- Yeniden kodlama olmadan özgün PDF kalitesini korur + +## Seçenekler + +| Seçenek | Açıklama | +| ------------------- | -------------------------------------------------------------------------------------------------------- | +| **Dosya Modu** | Dosyaların tamamını özel bir sırayla, dosya başına isteğe bağlı sayfa aralığı filtreleriyle birleştirin | +| **Sayfa Modu** | Tüm dosyalardaki tüm sayfaların görsel ızgarası: tam sıranızı oluşturmak için küçük resimleri sürükleyin | +| **Sayfalar girişi** | Yalnızca belirli sayfaları dahil etmek için `1-3, 5` gibi aralıkları kabul eden dosya başına metin alanı | + +## Kullanım Alanları + +- Ayrı bölüm PDF'lerini tek bir kitapta veya raporda birleştirmek +- Bir ön yazıyı ve özgeçmişi tek bir başvuru belgesinde birleştirmek +- Birden fazla kaynak belgeden belirli sayfaları tek bir dosyada toplamak +- Taranmış fişleri veya faturaları tek bir arşiv PDF'sinde bir araya getirmek +- Birden fazla sunumdaki slaytlardan bir sunum çıktısı oluşturmak + +## İpuçları + +- Bir dosyayı diğerinin ardına eklemek yerine farklı dosyalardaki sayfaları iç içe yerleştirmeniz gerektiğinde Sayfa Modunu kullanın. +- Mevcut düzeninizi kaybetmeden ilk yüklemeden sonra **Daha Fazla Dosya Ekle** düğmesiyle daha fazla dosya ekleyebilirsiniz. +- Sayfa aralıkları 1'den başlar; yani `1`, o dosyanın ilk sayfasını ifade eder. + +## İlgili Araçlar + +- [PDF Böl](./split-pdf) +- [Düzenle ve Çoğalt](./organize-pdf) +- [Sayfaları Değiştirerek Birleştir](./alternate-merge) +- [Sayfaları Sil](./delete-pages) diff --git a/docs/tr/tools/mobi-to-pdf.md b/docs/tr/tools/mobi-to-pdf.md new file mode 100644 index 00000000..50ff391f --- /dev/null +++ b/docs/tr/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI'den PDF'ye +description: MOBI e-kitap dosyalarını doğrudan tarayıcınızda PDF'ye dönüştürün. Ücretsiz, gizli, dosya yükleme yok. +--- + +# MOBI'den PDF'ye + +Amazon Kindle MOBI e-kitaplarını PDF belgelerine dönüştürün. MOBI dosyaları Kindle cihazlarına ve uygulamalarına bağlıdır; bu da başka yerde okumayı zorlaştırır. PDF'ye dönüştürmek, her cihazda açabileceğiniz veya yazdırabileceğiniz taşınabilir bir sürüm sağlar. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---- | :------ | :--------------------------------- | +| MOBI | `.mobi` | Kindle e-kitap biçimi (Mobipocket) | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya bir veya daha fazla MOBI dosyasını sürükleyip bırakın. +2. Dosya listesini gözden geçirin. İstenmeyen dosyaları çöp kutusu simgesiyle kaldırın veya ek e-kitaplar eklemek için **Daha Fazla Dosya Ekle**'yi kullanın. +3. **PDF'ye Dönüştür**'e tıklayın. PyMuPDF motoru MOBI yapısını ayrıştırır ve her sayfayı PDF içeriği olarak işler. +4. Tek bir dosya PDF olarak iner. Birden fazla dosya dönüştürürken `mobi-converted.zip` adlı bir ZIP arşivi alırsınız. + +## Seçenekler + +Ek ayar gerekmez. Dönüştürme, özgün MOBI dosyasındaki metin içeriğini, biçimlendirmeyi ve gömülü görselleri korur. + +## Kullanım Alanları + +- Kindle'dan satın alınan içeriği yalnızca PDF destekleyen, Kindle olmayan bir e-okuyucuda okumak +- Çevrimdışı çalışma veya not alma için bir e-kitaptan bölümler yazdırmak +- Kişisel e-kitap kitaplığınızı evrensel bir biçimde arşivlemek +- Kindle uygulaması olmayan biriyle alıntı paylaşmak + +## İpuçları + +- DRM korumalı MOBI dosyaları dönüştürülemez. Araç yalnızca DRM'siz MOBI dosyalarıyla çalışır. +- Çok sayıda gömülü görsel içeren büyük e-kitaplar, her şey tarayıcıda gerçekleştiği için birkaç saniye daha uzun sürebilir. + +## İlgili Araçlar + +- [EPUB'dan PDF'ye](./epub-to-pdf) +- [FB2'den PDF'ye](./fb2-to-pdf) +- [CBZ'den PDF'ye](./cbz-to-pdf) diff --git a/docs/tr/tools/n-up-pdf.md b/docs/tr/tools/n-up-pdf.md new file mode 100644 index 00000000..ab15fef1 --- /dev/null +++ b/docs/tr/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N'li PDF +description: Kompakt yazdırma için birden fazla PDF sayfasını ızgara düzeninde tek bir sayfada düzenleyin. +--- + +# N'li PDF + +Birden fazla sayfayı ızgara düzeninde tek bir sayfaya yerleştirin. Sayfa başına 2, 4, 6, 8, 9 veya 16 sayfa sığdırarak yazdırılan sayfa sayısını azaltır. Araç ölçeklemeyi, konumlandırmayı ve isteğe bağlı sayfa boyutu yapılandırmasını halleder. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Sayfa başına sayfa sayısını ("N" değeri) seçin: 2, 4, 6, 8, 9 veya 16. +3. Çıktı sayfa boyutunu (varsayılan A4) ve yönlendirmeyi seçin. +4. İsteğe bağlı olarak aralığı, kenarlık rengini ve arka plan rengini yapılandırın. +5. İşlem düğmesine tıklayın. Araç her sayfayı ölçekler ve yeni sayfalara döşer. + +## Özellikler + +- Izgara düzenleri: 2'li, 4'lü, 6'lı, 8'li, 9'lu ve 16'lı +- Yapılandırılabilir çıktı sayfa boyutu ve yönlendirme +- Döşenen sayfalar arasında isteğe bağlı aralık +- Arka plan ve kenarlık rengi ayarları +- Sığdırmak için ölçeklerken özgün sayfaların en-boy oranını korur + +## Seçenekler + +| Seçenek | Açıklama | +| ---------------------- | ----------------------------------------------------------------------- | +| **Sayfa başına sayfa** | Her çıktı sayfasına sığdırılacak özgün sayfa sayısı (2, 4, 6, 8, 9, 16) | +| **Sayfa boyutu** | Çıktı sayfası boyutu (A4, Letter, Legal vb.) | +| **Yönlendirme** | Çıktı sayfası için Dikey veya Yatay | +| **Aralık** | Döşenen sayfalar arasındaki boşluk (punto cinsinden) | +| **Arka plan rengi** | Çıktı sayfası arka planının dolgu rengi | +| **Kenarlık rengi** | Döşenen her sayfanın etrafındaki kenarlıkların rengi | + +## Kullanım Alanları + +- Kağıt tasarrufu için sayfa başına 4 slayt içeren çıktılar yazdırmak +- Tek sayfada birden fazla başvuru sayfası içeren çalışma kâğıtları oluşturmak +- Dosyalama için kompakt belge arşivleri üretmek +- Uzun bir belgenin küçük resim genel bakış sayfalarını oluşturmak + +## İpuçları + +- Yatay yönlendirme genellikle 2'li düzenlerde daha iyi çalışırken, dikey yönlendirme genellikle 4'lü ve üzeri için en iyisidir. +- Aralığı artırmak okunabilirliğe yardımcı olur ancak döşenen her sayfa için kullanılabilir alanı azaltır. +- Ters işlem için (bir sayfayı birden fazla sayfaya bölmek) bkz. [PDF'yi Posterleştir](./posterize-pdf). + +## İlgili Araçlar + +- [PDF'yi Posterleştir](./posterize-pdf) +- [PDF Kitapçık](./pdf-booklet) +- [Tek Sayfada Birleştir](./combine-single-page) diff --git a/docs/tr/tools/ocr-pdf.md b/docs/tr/tools/ocr-pdf.md new file mode 100644 index 00000000..697aaf38 --- /dev/null +++ b/docs/tr/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF'de OCR +description: Tesseract OCR ile taranmış PDF'leri çok dilli destek ve karakter filtrelemeyle aranabilir ve kopyalanabilir hale getirin. +--- + +# PDF'de OCR + +Taranmış belgeleri aranabilir, kopyalanabilir PDF'lere dönüştürün. Araç, görsellerdeki metni tanımak için Tesseract OCR'ı kullanır ve özgün sayfaların üzerine görünmez bir metin katmanı ekler; böylece görsel görünüm korunurken içerik tamamen aranabilir hale gelir. + +## Nasıl Çalışır + +1. Taranmış veya görsel tabanlı bir PDF dosyası yükleyin. +2. Aranabilir dil listesinden belgede bulunan bir veya daha fazla dili seçin. +3. İsteğe bağlı olarak gelişmiş ayarları (çözünürlük, ikili hale getirme, izin listesi) düzenleyin. +4. **OCR'ı Başlat**'a tıklayın ve ilerlemeyi gerçek zamanlı ilerleme çubuğundan izleyin. +5. Tamamlandığında ayıklanan metni inceleyin, ardından aranabilir PDF'yi veya düz `.txt` dosyasını indirin. + +## Özellikler + +- Aranabilir dil seçicisiyle çok dilli OCR +- Görünmez metin katmanı özgün belge görünümünü korur +- İşlem sırasında gerçek zamanlı ilerleme çubuğu ve günlük çıktısı +- Sonuçları aranabilir PDF veya düz metin dosyası olarak indirme +- Ayıklanan metni doğrudan panoya kopyalama +- Hız ile doğruluğu dengelemek için üç çözünürlük düzeyi + +## Seçenekler + +| Ayar | Değerler | Varsayılan | Amaç | +| ------------------------------------- | -------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------ | +| **Çözünürlük** | Standart (192 DPI), Yüksek (288 DPI), Ultra (384 DPI) | Yüksek | Yüksek çözünürlük küçük metinde doğruluğu artırır ancak daha uzun sürer | +| **Görseli İkili Hale Getir** | Açık / Kapalı | Kapalı | Temiz taramalarda siyah beyaza dönüştürerek kontrastı artırır | +| **Karakter İzin Listesi Hazır Ayarı** | Yok, Alfanümerik, Sayılar + Para Birimi, Yalnızca Harfler, Yalnızca Sayılar, Fatura, Formlar, Özel | Yok | Belirli belge türlerinde doğruluğu artırmak için tanınan karakterleri kısıtlar | +| **Karakter İzin Listesi** | Serbest metin | Boş | Hazır ayar Özel olduğunda elle karakter kümesi | + +## Kullanım Alanları + +- Taranmış sözleşmeleri ve faturaları Ctrl+F ile aranabilir hale getirmek +- Fotoğrafı çekilmiş belgelerden veya eski kağıt kayıtlardan metin ayıklamak +- Fatura hazır ayarıyla fişleri işleyerek tutarları ve tarihleri doğru yakalamak +- Uyumluluk gereksinimleri için yalnızca görsel taramalardan erişilebilir PDF'ler oluşturmak +- Taranmış kitaplardan veya kılavuzlardan metin içeriğini toplu ayıklamak + +## İpuçları + +- Belgeniz karışık dilli içerik barındırıyorsa (ör. İngilizce başlıklar ve Japonca gövde metni) birden fazla dil seçin. +- Soluk veya düşük kontrastlı metin içeren belgeler için ikili hale getirme seçeneğini kullanın; tanıma doğruluğunu önemli ölçüde artırabilir. +- Fatura ve Formlar izin listesi hazır ayarları, ilgisiz karakter şekillerini yok sayarak yapılandırılmış belgelerdeki yanlış pozitifleri büyük ölçüde azaltır. + +## İlgili Araçlar + +- [Tabloları Ayıkla](./extract-tables) +- [PDF Birleştir](./merge-pdf) +- [PDF Sıkıştır](./compress-pdf) diff --git a/docs/tr/tools/odg-to-pdf.md b/docs/tr/tools/odg-to-pdf.md new file mode 100644 index 00000000..a314fe66 --- /dev/null +++ b/docs/tr/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG'den PDF'ye +description: LibreOffice Draw (ODG) dosyalarını tarayıcınızda PDF'ye dönüştürün. Ücretsiz, yükleme yok, tamamen gizli. +--- + +# ODG'den PDF'ye + +OpenDocument Graphics dosyalarını PDF'ye dönüştürün. ODG, LibreOffice Draw'ın yerel biçimidir ve diyagramlar, akış şemaları ve vektör çizimler için kullanılır. PDF'ye dönüştürmek bu çizimleri paylaşmayı, yazdırmayı ve diğer belgelere gömmeyi kolaylaştırır. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :-------------------- | :----- | :------------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw dosyaları | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya ODG dosyalarınızı sürükleyip bırakın. Aynı anda birden fazla dosya eklenebilir. +2. Dosya listesini gözden geçirin. Tek tek girişleri çöp kutusu simgesiyle kaldırın veya daha fazla çizim eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. **PDF'ye Dönüştür**'e tıklayın. LibreOffice tabanlı bir motor tarayıcıda yüklenir ve vektör grafikleri, şekilleri ve metni koruyarak her ODG dosyasını dönüştürür. +4. Tek bir dosya doğrudan PDF olarak iner. Birden fazla dosya `odg-to-pdf.zip` adlı bir ZIP arşivi oluşturur. + +## Seçenekler + +Ek ayar gerekmez. Dönüştürme, ODG kaynağındaki özgün sayfa ölçülerini, şekilleri, bağlayıcıları ve metin kutularını korur. + +## Kullanım Alanları + +- LibreOffice Draw diyagramlarını LibreOffice'i kurulu olmayan müşterilerle paylaşmak +- Draw'da oluşturulan akış şemalarını ve ağ diyagramlarını yazdırmak +- ODG çizimlerini bir rapora veya sunuya gömülü PDF olarak dahil etmek +- Teknik çizimleri onlarca yıl okunabilir kalacak bir biçimde arşivlemek + +## İpuçları + +- Vektör öğeler PDF çıktısında vektör olarak kalır; böylece sonuç herhangi bir baskı boyutuna temiz biçimde ölçeklenir. +- LibreOffice motorunun ilk kullanımda başlatılması biraz zaman alır. Aynı oturumdaki sonraki dönüştürmeler daha hızlıdır. + +## İlgili Araçlar + +- [ODS'ten PDF'ye](./ods-to-pdf) +- [ODP'den PDF'ye](./odp-to-pdf) +- [VSD'den PDF'ye](./vsd-to-pdf) diff --git a/docs/tr/tools/odp-to-pdf.md b/docs/tr/tools/odp-to-pdf.md new file mode 100644 index 00000000..6d73d8ef --- /dev/null +++ b/docs/tr/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP'den PDF'ye +description: LibreOffice Impress (ODP) sunumlarını tarayıcınızda PDF'ye dönüştürün. Ücretsiz, gizli, yükleme yok. +--- + +# ODP'den PDF'ye + +OpenDocument Presentation dosyalarını PDF'ye dönüştürün. ODP, LibreOffice Impress'in yerel biçimidir ve Google Slides'tan standart bir dışa aktarımdır. Sunumları PDF'ye çevirmek, herkesin sunum yazılımı olmadan görüntülemesini sağlar ve slaytlar temiz biçimde yazdırılır. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :------------------------ | :----- | :------------------------------------------------ | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides dışa aktarımı | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya ODP dosyalarınızı sürükleyip bırakın. Aynı anda birden fazla sunum seçebilirsiniz. +2. Dosya listesini gözden geçirin. Girişleri çöp kutusu simgesiyle kaldırın veya ek sunumlar eklemek için **Daha Fazla Dosya Ekle**'yi kullanın. +3. **PDF'ye Dönüştür**'e tıklayın. LibreOffice tabanlı motor her sunumu işler ve her slaydın bir sayfa olduğu bir PDF üretir. +4. Tek bir dosya PDF olarak iner. Birden fazla dosya `odp-to-pdf.zip` adlı bir ZIP arşivinde teslim edilir. + +## Seçenekler + +Yapılandırılacak ayar yoktur. Her slayt, metni, görselleri, şekilleri ve slayt arka planlarını koruyarak özgün ölçülerinde işlenir. + +## Kullanım Alanları + +- Bir sunumu izleyicilere PDF çıktısı olarak dağıtmak +- Google Slides dışa aktarımlarını ODP yerine PDF tercih eden kişilerle paylaşmak +- Konferans konuşmalarını ve dersleri salt okunur bir biçimde arşivlemek +- Yüz yüze atölyeler için slayt sunumlarını yazdırmak + +## İpuçları + +- Slayt geçişleri ve animasyonlar yalnızca görsel özelliklerdir ve PDF'ye aktarılmaz, ancak tüm statik içerik doğru işlenir. +- Konuşmacı notları PDF çıktısına dahil edilmez. Notlara ihtiyacınız varsa bunları sunum yazılımınızdan ayrıca dışa aktarın. +- Diğer LibreOffice tabanlı araçlar gibi, motor ilk kullanımda yüklenir ve oturum boyunca önbellekte kalır. + +## İlgili Araçlar + +- [ODG'den PDF'ye](./odg-to-pdf) +- [ODS'ten PDF'ye](./ods-to-pdf) +- [PUB'dan PDF'ye](./pub-to-pdf) diff --git a/docs/tr/tools/ods-to-pdf.md b/docs/tr/tools/ods-to-pdf.md new file mode 100644 index 00000000..e088aceb --- /dev/null +++ b/docs/tr/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS'ten PDF'ye +description: LibreOffice Calc (ODS) elektronik tablolarını tarayıcınızda PDF'ye dönüştürün. Ücretsiz, gizli, kayıt gerekmez. +--- + +# ODS'ten PDF'ye + +OpenDocument Spreadsheet dosyalarını PDF'ye dönüştürün. ODS, LibreOffice Calc'ın yerel biçimidir ve Google Sheets'ten sık kullanılan bir dışa aktarma biçimidir. Bu araç, elektronik tablo verilerinizi, biçimlendirmenizi ve grafiklerinizi yazdırabileceğiniz veya paylaşabileceğiniz sayfalı bir PDF'ye dönüştürür. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :----------------------- | :----- | :--------------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / Google Sheets dışa aktarımı | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya ODS dosyalarınızı sürükleyip bırakın. Birden fazla dosya desteklenir. +2. Dosya listesini gözden geçirin. Dosyaları kaldırmak için çöp kutusu simgesini kullanın veya toplu işlemi genişletmek için **Daha Fazla Dosya Ekle** düğmesine tıklayın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. LibreOffice tabanlı motor tarayıcıda yüklenir ve her elektronik tabloyu PDF sayfalarına dönüştürür. +4. Tek bir elektronik tablo PDF olarak iner. Birden fazla dosya `ods-to-pdf.zip` içinde paketlenir. + +## Seçenekler + +Yapılandırma gerekmez. Dönüştürücü, elektronik tablonun mevcut yazdırma düzenini, hücre biçimlendirmesini ve sütun genişliklerini PDF çıktısına uygular. + +## Kullanım Alanları + +- LibreOffice Calc'ta hazırlanmış bir bütçeyi veya raporu yalnızca PDF kabul eden biriyle paylaşmak +- ODS olarak indirilen bir Google Sheets dışa aktarımını yazdırmak +- Mali kayıtları düzenlenemez bir biçimde arşivlemek +- ODS tabanlı formları veya puantaj çizelgelerini sabit düzenli belgeler olarak göndermek + +## İpuçları + +- Elektronik tablonuzda birden fazla sayfa varsa, tüm sayfalar PDF çıktısına dahil edilir. +- Çok geniş elektronik tablolar PDF'de yatay olarak birden fazla sayfaya yayılabilir. Düzen önemliyse, dönüştürmeden önce kaynak dosyadaki sütun genişliklerini ayarlayın. +- LibreOffice motoru ilk kullanımda başlatılır. Aynı oturumdaki sonraki dönüştürmeler daha hızlıdır. + +## İlgili Araçlar + +- [ODG'den PDF'ye](./odg-to-pdf) +- [ODP'den PDF'ye](./odp-to-pdf) +- [XML'den PDF'ye](./xml-to-pdf) diff --git a/docs/tr/tools/odt-to-pdf.md b/docs/tr/tools/odt-to-pdf.md new file mode 100644 index 00000000..67d03973 --- /dev/null +++ b/docs/tr/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT'den PDF'ye +description: OpenDocument Text (ODT) dosyalarını, LibreOffice tabanlı bir motorla tarayıcınızda PDF biçimine dönüştürün. +--- + +# ODT'den PDF'ye + +OpenDocument Text dosyalarını PDF'ye dönüştürün. ODT, LibreOffice Writer, Apache OpenOffice ve diğer açık kaynaklı kelime işlemcilerin yerel biçimidir. Bu araç, biçimlendirmeyi, tabloları, görselleri ve stilleri koruyan doğru dönüştürmeler üretmek için tarayıcıda çalışan bir LibreOffice motoru kullanır. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---------------- | :-------- | +| OpenDocument Text | `.odt` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya bir ya da daha fazla ODT dosyasını sürükleyip bırakın. +2. Dosya listesini gözden geçirin. Daha fazla dosya ekleyin veya istemediklerinizi kaldırın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. LibreOffice motoru başlatılır (bir ilerleme göstergesi yükleme durumunu gösterir), ardından her dosya dönüştürülür. +4. Tek bir dosya doğrudan PDF olarak iner. Birden fazla dosya `odt-converted.zip` içinde paketlenir. + +## Seçenekler + +Bu araçta ek bir yapılandırma yoktur. Dönüştürme, özgün belgenin biçimlendirmesini mümkün olduğunca yakından korur. + +## Çıktı + +| Girdi Sayısı | Çıktı | +| :----------- | :------------------------------------------------------------- | +| 1 dosya | Tek bir PDF indirmesi (ör. `document.pdf`) | +| 2+ dosya | Her dosya için bir PDF içeren ZIP arşivi (`odt-converted.zip`) | + +## Kullanım Alanları + +- LibreOffice Writer belgelerini Microsoft Office kullanıcılarıyla paylaşmak için PDF'ye dönüştürmek +- OpenDocument biçiminde yazılmış akademik makalelerden baskıya hazır PDF'ler üretmek +- Bir klasördeki ODT şablonlarını dağıtım için toplu olarak PDF'ye dönüştürmek +- Otomatik belge oluşturma sistemlerinin ürettiği ODT dosyalarından PDF üretmek + +## İpuçları + +- LibreOffice motoru ilk kullanımda yüklenir ve sonraki dönüştürmeler için önbelleğe alınır. İlk yükleme birkaç saniye sürer; ardından dönüştürmeler hızlıdır. +- Gömülü OLE nesneleri veya alışılmadık yazı tipleri içeren karmaşık belgeler, masaüstü LibreOffice'ten biraz farklı görüntülenebilir. Toplu dönüştürmeden önce bir örnekle deneyin. +- Word belgeleri (`.doc`, `.docx`) için bunun yerine [Word'den PDF'ye](./word-to-pdf) aracını kullanın. O da LibreOffice motorunu kullanır ancak Microsoft biçimlerini doğrudan kabul eder. + +## İlgili Araçlar + +- [Word'den PDF'ye](./word-to-pdf) +- [RTF'den PDF'ye](./rtf-to-pdf) +- [Metinden PDF'ye](./txt-to-pdf) diff --git a/docs/tr/tools/organize-pdf.md b/docs/tr/tools/organize-pdf.md new file mode 100644 index 00000000..399d5b85 --- /dev/null +++ b/docs/tr/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Çoğalt & Düzenle +description: PDF sayfalarını sürükle-bırak küçük resimlerle ve özel sayfa sırası girişiyle yeniden sıralayın, çoğaltın ve silin. +--- + +# Çoğalt & Düzenle + +Görsel sürükle-bırak arayüzüyle bir PDF'nin sayfalarını yeniden düzenleyin, çoğaltın ve kaldırın. Her sayfa, sonucu yeni bir dosya olarak kaydetmeden önce taşıyabileceğiniz, kopyalayabileceğiniz veya silebileceğiniz bir küçük resim olarak görünür. + +## Nasıl Çalışır + +1. Tek bir PDF dosyası yükleyin. +2. Araç, her sayfayı gösteren bir küçük resim ızgarası oluşturur. +3. Sayfaları yeniden sıralamak için küçük resimleri sürükleyin, bir sayfayı kopyalamak için yeşil çoğalt düğmesine, kaldırmak için kırmızı sil düğmesine tıklayın. +4. Alternatif olarak, metin alanına özel bir sayfa sırası girin (ör. `3, 1, 2, 4`) ve tüm sayfaları tek seferde düzenlemek için **Sırayı Uygula** düğmesine tıklayın. +5. Yeniden düzenlenmiş PDF'yi oluşturup indirmek için işle düğmesine tıklayın. + +## Özellikler + +- Animasyonlu geçişlerle sürükle-bırak sayfa sıralama +- Sayfa başına çoğaltma ve silme düğmeleri +- Hassas düzenleme için özel sayfa sırası girişi +- Her değişiklikten sonra otomatik güncellenen sayfa numarası etiketleri +- Kalan son sayfanın silinmesini engeller + +## Kullanım Alanları + +- Bir raporda yanlış yerdeki sayfayı doğru konuma taşımak +- Tek dosyada birden fazla boş kopya olması için bir form sayfasını çoğaltmak +- Bir belgeyi dağıtmadan önce taslak veya yer tutucu sayfaları kaldırmak +- Baskı hazırlığı için sayfa sırasını tersine çevirmek veya karıştırmak +- Ayrı dosyaları yeniden birleştirmeden özel bir sayfa dizisi oluşturmak + +## İpuçları + +- Özel sayfa sırası alanı, virgülle ayrılmış özgün sayfa numaraları bekler. Her sayfayı tam olarak bir kez içermelidir: eksik veya tekrarlanan sayfa olamaz. +- Bir sayfayı çoğalttıktan sonra her iki kopya da aynı özgün sayfa dizinine başvurur. Kopyalardan birini yeniden sıralamak diğerinden bağımsız çalışır. +- Birden fazla dosya üzerinde toplu işlemler veya daha gelişmiş iş akışları için bunun yerine [PDF Çoklu Araç](./pdf-multi-tool) aracını değerlendirin. + +## İlgili Araçlar + +- [PDF Birleştir](./merge-pdf) +- [Sayfaları Sil](./delete-pages) +- [PDF Çoklu Araç](./pdf-multi-tool) +- [Sayfaları Ters Çevir](./reverse-pages) diff --git a/docs/tr/tools/page-dimensions.md b/docs/tr/tools/page-dimensions.md new file mode 100644 index 00000000..17bf41e1 --- /dev/null +++ b/docs/tr/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Sayfa Boyutları +description: PDF sayfa boyutlarını, yönlerini, en-boy oranlarını ve dönüşünü analiz edin. Karışık boyutlu belgeleri tespit edin ve verileri CSV olarak dışa aktarın. +--- + +# Sayfa Boyutları + +PDF'inizdeki her sayfayı okuyan ve tam boyutlarını, yönünü, standart boyut adını, en-boy oranını, alanını ve dönüşünü bildiren bir tanılama aracı. Yazdırmadan önce karışık boyutlu sayfaları yakalamak veya aldığınız bir PDF'in özelliklerini belgelemek için kullanışlıdır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Analiz otomatik başlar: basılacak bir düğme yoktur. +2. Bir özet paneli toplam sayfa sayısını, benzersiz sayfa boyutlarının sayısını ve belgenin karışık boyutlu olup olmadığını gösterir. +3. Sayfa başına ayrıntıların bulunduğu tam sonuç tablosuna göz atın. +4. Görüntüleme birimlerini Nokta, İnç, Milimetre veya Piksel arasında değiştirin. +5. Verileri kaydetmek için **CSV'ye Aktar** düğmesine tıklayın. + +## Bildirilen Alanlar + +| Sütun | Açıklama | +| -------------- | ------------------------------------------------ | +| Sayfa # | Sıralı sayfa numarası | +| Boyutlar | Seçilen birimde Genişlik x Yükseklik | +| Standart Boyut | Eşleşen ad (A4, Letter vb.) veya "Özel" | +| Yön | Dikey veya Yatay | +| En Boy Oranı | Genişliğin yüksekliğe oranı, ondalık sayı olarak | +| Alan | Seçilen birimin karesi cinsinden sayfa alanı | +| Döndürme | Derece cinsinden sayfa dönüşü | + +## Özellikler + +- Standart kağıt boyutlarının otomatik tespiti (A3, A4, A5, Letter, Legal, Tabloid ve daha fazlası) +- Hangi boyutların göründüğünü ve her birini kaç sayfanın kullandığını gösteren, karışık boyutlu belge uyarısı +- Nokta, inç, milimetre ve piksel (96 PPI'da) arasında birim dönüştürme +- Elektronik tablolarda veya belgeleme sistemlerinde kullanmak için CSV dışa aktarımı + +## Kullanım Alanları + +- Bir belgeyi matbaaya göndermeden önce tüm sayfaların A4 olduğunu doğrulamak +- Birleştirilmiş bir PDF'in bazı sayfalarda neden beklenmedik kenar boşluklarıyla yazdırıldığını teşhis etmek +- Üst veri kayıtları için büyük bir PDF arşivinin sayfa düzenini belgelemek +- Düzeltilmesi gereken döndürülmüş sayfaları belirlemek + +## İpuçları + +- Özet "Karışık Boyutlar" gösteriyorsa, yazdırmadan önce standartlaştırmak için Sayfa Boyutunu Düzelt aracını kullanın. +- Dönüş alanı, doğru görüntülenen ancak sıfır olmayan bir dönüş özniteliğine sahip sayfaları belirlemenize yardımcı olur; bu, bazı iş akışlarında sorunlara yol açabilir. + +## İlgili Araçlar + +- [Sayfa Boyutunu Düzelt](./fix-page-size): karışık boyutlar belirlendikten sonra sayfaları standartlaştırın +- [PDF Sıkıştır](./compress-pdf): sayfa sorunlarını düzelttikten sonra PDF'i optimize edin +- [PDF'yi Döndür](./rotate-pdf): döndürülmüş sayfaları düzeltin diff --git a/docs/tr/tools/page-numbers.md b/docs/tr/tools/page-numbers.md new file mode 100644 index 00000000..991fda7e --- /dev/null +++ b/docs/tr/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Sayfa Numaraları +description: PDF sayfalarınızın istediğiniz konumuna, yazı tipi, boyut ve renk ayarlarıyla özelleştirilebilir sayfa numaraları ekleyin. +--- + +# Sayfa Numaraları + +PDF'inizin her sayfasına görünür sayfa numaraları ekleyin. Konumu, biçimi, yazı tipi boyutunu ve rengi siz seçersiniz, gerisini araç halleder. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Beliren seçenekler panelinde sayfa numarası ayarlarını yapılandırın. +3. İşlemek için **Sayfa Numaraları Ekle** düğmesine tıklayın. +4. Numaralandırılmış PDF otomatik olarak iner. + +## Seçenekler + +- **Konum**: Sayfa numaralarının nerede görüneceğini seçin: Alt Orta, Sol Alt, Sağ Alt, Üst Orta, Sol Üst veya Sağ Üst. +- **Biçim**: Basit numaralandırma (1, 2, 3...) veya "sayfa X / Y" biçimi (1 / 5, 2 / 5...) arasında seçim yapın. +- **Yazı Boyutu**: Sayfa numarası metninin boyutunu ayarlayın. Varsayılan 12'dir. +- **Renk**: Renk seçiciyle sayfa numarası metni için istediğiniz rengi seçin. + +## Özellikler + +- Tüm köşeleri ve orta konumları kapsayan altı konum seçeneği +- İki numaralandırma biçimi: basit ardışık veya "sayfa X / Y" +- 6 ile 72 punto arasında özelleştirilebilir yazı tipi boyutu +- Metin rengi için tam renk seçici +- Sayfa boyutu ne olursa olsun numaraları güvenli alanlar içinde tutan otomatik kenar boşluğu yönetimi + +## Kullanım Alanları + +- Görünür sayfa başvuruları gereken belgeleri baskıya hazırlamak +- Birden fazla kaynak dosyadan oluşturulan birleştirilmiş bir PDF'e sayfa numarası eklemek +- Sunum dökümlerini dağıtmadan önce numaralandırmak +- Hukuki belgelere veya sözleşmelere ardışık numaralandırma eklemek + +## İpuçları + +- "Sayfa X / Y" biçimi, okuyucuların toplam uzunluğu bilmesi gereken teklifler veya raporlar gibi belgelerde yararlıdır. +- Farklı bölümler için farklı numaralandırma stillerine (ön sayfalar için Romen rakamları gibi) ihtiyacınız varsa, bunun yerine [Sayfa etiketleri ekle](./add-page-labels) aracını kullanın. + +## İlgili Araçlar + +- [Sayfa etiketleri ekle](./add-page-labels) +- [Bates Numaralandırma](./bates-numbering) +- [Üst Bilgi & Alt Bilgi](./header-footer) diff --git a/docs/tr/tools/pdf-booklet.md b/docs/tr/tools/pdf-booklet.md new file mode 100644 index 00000000..54a130de --- /dev/null +++ b/docs/tr/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF Kitapçık +description: PDF sayfalarını, fiziksel bir kitapçık olarak katlayıp zımbalamak için kitapçık (telden dikiş) sırasına göre yeniden düzenleyin. +--- + +# PDF Kitapçık + +Bir PDF'in sayfalarını kitapçık dizilim sırasına göre yeniden düzenleyin. Çift taraflı yazdırılıp ortadan katlandığında sayfalar doğru okuma sırasında olur. Bu, telden dikişli kitapçıklar ve fanzinler için kullanılan düzendir. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Kitapçık ayarlarını yapılandırın: çıktı sayfa boyutu ve yön. +3. Sayfaların her yaprakta nasıl düzenleneceğini görmek için **Önizleme Oluştur** düğmesine tıklayın. +4. Her fiziksel yaprağı ön ve arka sayfa atamalarıyla gösteren önizlemeyi gözden geçirin. +5. Kitapçık dizilimli PDF'i kaydetmek için **İndir** düğmesine tıklayın. + +## Özellikler + +- Telden dikiş ciltleme için otomatik sayfa yeniden sıralama +- Yapılandırılabilir çıktı sayfa boyutu +- İndirmeden önce kitapçık düzeninin görsel önizlemesi +- Tek sayıda sayfa varsa gerektiği yerlere boş sayfalar ekler +- Kaynak sayfaları kitapçık yaprağı boyutuna sığacak şekilde ölçekler + +## Kullanım Alanları + +- Normal bir PDF'ten yazdırılabilir kitapçıklar veya fanzinler oluşturmak +- Konferans programlarını veya etkinlik rehberlerini kendi baskınız için hazırlamak +- Katlanmış tebrik kartları veya küçük kataloglar yapmak +- El ile ciltlenecek şiir kitapçıkları veya derlemeler üretmek + +## İpuçları + +- Temiz bir kitapçık için kaynak PDF'inizin sayfa sayısı ideal olarak 4'ün katı olmalıdır. Değilse, son yaprağı tamamlamak için otomatik olarak boş sayfalar eklenir. +- Çıktıyı yazıcınızın "kısa kenardan çevir" ayarıyla çift taraflı yazdırın, ardından tüm yaprakları birlikte katlayıp sırttan zımbalayın. +- Kitapçık sıralaması olmadan yalnızca bir yaprağa birden fazla sayfa yerleştirmek için bunun yerine [N'li PDF](./n-up-pdf) aracını kullanın. + +## İlgili Araçlar + +- [N'li PDF](./n-up-pdf) +- [PDF'yi Döndür](./rotate-pdf) +- [Boş Sayfa Ekle](./add-blank-page) diff --git a/docs/tr/tools/pdf-layers.md b/docs/tr/tools/pdf-layers.md new file mode 100644 index 00000000..2e4f9a15 --- /dev/null +++ b/docs/tr/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF Katmanları (OCG) +description: Bir PDF belgesindeki Optional Content Group (OCG) katmanlarını görüntüleyin, açıp kapatın, ekleyin ve silin. +--- + +# PDF Katmanları (OCG) + +Bir PDF içindeki Optional Content Group (OCG) yapılarını, yani yaygın adıyla "katmanları", yönetin. Katman görünürlüğünü açıp kapatabilir, yeni katmanlar (iç içe alt katmanlar dahil) ekleyebilir, katmanları silebilir ve değiştirilmiş PDF'i kaydedebilirsiniz. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Belgeyi PyMuPDF motoruyla yüklemek için işle düğmesine tıklayın. +3. Araç, mevcut tüm katmanları görünürlük durumları, kilit durumları ve iç içe hiyerarşileriyle birlikte gösterir. +4. Katmanları göstermek veya gizlemek için onay kutularını değiştirin. Kilitli katmanlar açılıp kapatılamaz. +5. Bir ad yazıp ekle düğmesine tıklayarak yeni üst düzey katmanlar ekleyin veya mevcut bir üst katmanın altına alt katmanlar ekleyin. +6. İhtiyacınız olmayan katmanları silin. +7. Katman değişiklikleri uygulanmış PDF'i indirmek için **Değiştirilmiş PDF'yi İndir** düğmesine tıklayın. + +## Özellikler + +- Katman hiyerarşisini, iç içe katmanlar için uygun girintiyle gösterir +- Katman görünürlüğünü açıp kapatma +- Kilitli katman göstergesi yanlışlıkla yapılacak değişiklikleri önler +- Özel adlarla üst düzey veya alt katmanlar ekleme +- Tek tek katmanları silme +- Tüm değişiklikleri yeni bir PDF dosyasına kaydeder + +## Kullanım Alanları + +- Mimari veya mühendislik çizimlerindeki işaretleme katmanlarının görünürlüğünü açıp kapatmak +- Çok katmanlı bir tasarım belgesine yeni açıklama katmanları eklemek +- Bir şablonu dağıtmadan önce eski katmanları kaldırmak +- Üçüncü taraftan alınan karmaşık bir PDF'te hangi katmanların bulunduğunu incelemek + +## İpuçları + +- PDF'te katman yoksa araç, bir katman eklemeyi öneren boş bir durum gösterir. Tüm PDF'ler OCG katmanları kullanmaz: en çok CAD dışa aktarımlarında ve tasarım dosyalarında görülür. +- Alt katmanlar, üst katmanlarının altında görsel olarak girintilidir. Katmanları istediğiniz derinliğe kadar iç içe geçirebilirsiniz. +- Kilitli katmanlar bir kilit simgesiyle gösterilir ve onay kutuları devre dışıdır. Bu kilitleri PDF'i oluşturan kişi belirler. + +## İlgili Araçlar + +- [Üst Veriyi Görüntüle](./view-metadata) +- [Üst Veriyi Düzenle](./edit-metadata) +- [Çoğalt & Düzenle](./organize-pdf) diff --git a/docs/tr/tools/pdf-multi-tool.md b/docs/tr/tools/pdf-multi-tool.md new file mode 100644 index 00000000..680ada2f --- /dev/null +++ b/docs/tr/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF Çoklu Araç +description: PDF sayfalarını birleştirmek, bölmek, döndürmek, çoğaltmak, silmek ve yeniden sıralamak için hepsi bir arada sayfa yöneticisi. +--- + +# PDF Çoklu Araç + +Sayfa düzeyindeki her PDF işlemi için birleşik bir çalışma alanı. Bir veya daha fazla PDF yükleyin ve tüm sayfalarıyla tek bir görsel ızgarada çalışın. Sayfaları döndürün, yeniden sıralayın, çoğaltın, silin, yeni PDF'ler ekleyin, boş sayfalar ekleyin ve sonucu bölün: hepsi araçtan çıkmadan. + +## Nasıl Çalışır + +1. **PDF Yükle** düğmesine tıklayın veya dosyaları yükleme alanına sürükleyin. Birden fazla dosya desteklenir. +2. Yüklenen tüm dosyaların sayfaları, küçük resimlerle birlikte kaydırılabilir bir ızgarada görünür. +3. Sayfaları işlemek için araç çubuğunu veya sayfa başına eylem düğmelerini kullanın. +4. Her kartın üzerindeki onay kutusuyla sayfaları seçin, ardından toplu işlemler uygulayın. +5. Çıktıyı ayrı dosyalara bölmek için makas simgesiyle bölme noktaları işaretleyin. +6. Nihai sonucu indirmek için **PDF Olarak Dışa Aktar** düğmesine tıklayın. Bölme işaretleri varsa çıktı, birden fazla PDF içeren bir ZIP olur. + +## Özellikler + +- **Birleştir**: Birden fazla PDF yükleyin, otomatik olarak tek bir çalışma alanında birleşirler +- **Yeniden Sırala**: Sırayı değiştirmek için sayfa kartlarını sürükleyip bırakın +- **Döndür**: 90 derecelik adımlarla (sola veya sağa) sayfa başına veya toplu döndürme +- **Çoğalt**: Herhangi bir sayfayı tek tıklamayla kopyalayın +- **Sil**: Tek tek sayfaları kaldırın veya seçilenleri toplu silin +- **PDF Ekle**: Belirli bir sayfanın ardına yeni bir PDF ekleyin +- **Boş Sayfa Ekle**: Sonuna boş bir A4 sayfa ekleyin +- **Böl**: Sayfalar arasına bölme işaretleri koyun, ardından ayrı PDF'lerden oluşan bir ZIP olarak dışa aktarın +- **Tümünü Seç / Seçimi Kaldır**: Toplu işlemler için hızlı seçim +- **Geri Al / Yinele**: Her işlem için tam geri alma/yineleme geçmişi +- **Seçilenleri İndir**: Yalnızca seçili sayfaları bağımsız bir PDF olarak dışa aktarın +- Yüklemeden önce bozuk PDF'leri otomatik onarır + +## Kullanım Alanları + +- Birden fazla kaynak PDF'teki sayfalardan özel bir belge oluşturmak +- Boş sayfaları silerek, yan taramaları döndürerek ve bölümleri yeniden sıralayarak taranmış bir belgeyi temizlemek +- Görsel bölme işaretleriyle büyük bir PDF'i bölüm sınırlarından bölmek +- Tam bir PDF düzenleyiciye gerek kalmadan hızlı sayfa düzeyinde düzenleme yapmak + +## İpuçları + +- Geri alma/yineleme sistemi her işlemi izler. Özgürce kullanın: çalışmanızı yanlışlıkla bozamazsınız. +- Bölme işaretleri, sayfalar arasında kesikli mavi çizgiler olarak görünür. Bunları belgenin bölünmesini istediğiniz yerlere görsel olarak yerleştirin, ardından ZIP almak için dışa aktarın. +- Basit birleştirme veya bölme işleri için özel [PDF Birleştir](./merge-pdf) veya [PDF Böl](./split-pdf) araçları daha hızlı olabilir. Çoklu Araç, tek oturumda birden fazla işleme ihtiyaç duyduğunuzda öne çıkar. + +## İlgili Araçlar + +- [PDF Birleştir](./merge-pdf) +- [PDF Böl](./split-pdf) +- [Çoğalt & Düzenle](./organize-pdf) +- [PDF'yi Döndür](./rotate-pdf) diff --git a/docs/tr/tools/pdf-to-bmp.md b/docs/tr/tools/pdf-to-bmp.md new file mode 100644 index 00000000..0e2bd1ee --- /dev/null +++ b/docs/tr/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF'den BMP'ye +description: PDF sayfalarını sıkıştırılmamış BMP görsellerine dönüştürün. Bitmap girdi gerektiren eski sistemler ve baskı iş akışları için kullanışlıdır. +--- + +# PDF'den BMP'ye + +Bir PDF'in her sayfasını BMP (Bitmap) görseline dönüştürür. BMP sıkıştırılmamış bir biçimdir, bu nedenle çıktı kalite kaybı olmadan piksel piksel aynıdır, ancak dosyalar büyüktür. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Dosyayı işlemek için **Dönüştür** düğmesine tıklayın. +3. Tek bir `.bmp` dosyası veya bir ZIP arşivi otomatik olarak iner. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Sayfalar sabit 2x ölçekte işlenir ve PDF'in özgün sayfa boyutlarının yaklaşık iki katı boyutunda görseller üretir. + +## Çıktı Biçimi + +- **Tek sayfa**: `filename.bmp` +- **Birden fazla sayfa**: `page_1.bmp`, `page_2.bmp` vb. içeren `filename_bmps.zip` + +## Kullanım Alanları + +- PDF sayfalarını yalnızca BMP girdisi kabul eden eski sistemlere veya donanımlara aktarmak. +- Belirli baskı iş akışları için sıkıştırılmamış görseller hazırlamak. +- Ham piksel verisi gerektiren görüntü işleme araçları için girdi olarak bitmap çıktısı kullanmak. + +## İpuçları + +- BMP dosyaları sıkıştırma olmadan ham piksel verisi depoladıkları için çok büyüktür. Çoğu kullanım için [PDF'den PNG'ye](./pdf-to-png), çok daha küçük dosyalarla kayıpsız kalite sunar. +- Hedef sisteminiz PNG veya TIFF kabul ediyorsa, disk alanından tasarruf etmek için bu biçimleri tercih edin. + +## İlgili Araçlar + +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den TIFF'e](./pdf-to-tiff) +- [PDF'den JPG'ye](./pdf-to-jpg) diff --git a/docs/tr/tools/pdf-to-cbz.md b/docs/tr/tools/pdf-to-cbz.md new file mode 100644 index 00000000..f6e34015 --- /dev/null +++ b/docs/tr/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF'den CBZ'ye +description: Bir PDF'i Komga, Kavita, CDisplayEx ve Calibre gibi çizgi roman okuyucuları için CBZ (Comic Book Archive) dosyasına dönüştürün. +--- + +# PDF'den CBZ'ye + +Bir PDF'i, dijital çizgi romanlar ve mangalar için standart biçim olan CBZ (Comic Book ZIP) dosyasına dönüştürür. Her PDF sayfası, arşiv içinde bir görsel olur. Araç, azami uyumluluk için üç biçimde üst veri oluşturur: ComicInfo.xml, metadata.opf ve ComicBookInfo JSON. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Görsel biçimini, kaliteyi, ölçeği ve isteğe bağlı üst veriyi seçin. +3. CBZ dosyasını oluşturmak için **Dönüştür** düğmesine tıklayın. +4. `.cbz` dosyası otomatik olarak iner. + +## Seçenekler + +| Seçenek | Değerler | Varsayılan | Açıklama | +| ---------------- | --------------- | ---------- | -------------------------------------------------------------------------------------------------- | +| Görüntü Formatı | JPEG, PNG, WebP | JPEG | Renkli çizgi romanlar için JPEG, kayıpsız siyah-beyaz manga için PNG, en iyi sıkıştırma için WebP. | +| Görüntü Kalitesi | 50–100% | 85% | JPEG/WebP sıkıştırmasını denetler. PNG için gizlidir (her zaman kayıpsız). | +| Ölçek | 1.0x–4.0x | 2.0x | Yüksek ölçek, yüksek çözünürlüklü ekranlar için daha keskin görseller üretir. | +| Gri tonlama | Açık/Kapalı | Kapalı | Sayfaları gri tonlamaya çevirir. Siyah-beyaz içerikte dosya boyutunu küçültür. | +| Manga modu | Açık/Kapalı | Kapalı | Üst veride sağdan sola okuma yönünü ayarlar. | +| Üst veri ekle | Açık/Kapalı | Açık | ComicInfo.xml, metadata.opf ve ComicBookInfo JSON'u gömer. | + +## Üst Veri Alanları + +Üst veri etkinleştirildiğinde şunları doldurabilirsiniz: + +- **Başlık**: PDF dosya adından otomatik algılanır. +- **Seri**: Seri adı (ör. "Naruto"). +- **Numara (#)**: Seri içindeki sayı numarası. +- **Cilt**: Cilt numarası. +- **Yazar(lar)**: Yazar veya yaratıcı adı. +- **Yayıncı**: Yayıncı şirket. +- **Etiketler / Tür**: Virgülle ayrılmış etiketler (ör. "Action, Adventure"). +- **Yayın Yılı**: Yayın yılı (1900–2100). +- **Puan**: 0 ile 5 arasında topluluk puanı. + +## Üst Veri Uyumluluğu + +Araç, her okuyucunun bulabilmesi için üst veriyi üç biçimde yazar: + +| Biçim | Konum | Destekleyenler | +| ------------------ | ------------------ | ------------------------------------------- | +| ComicInfo.xml | ZIP içindeki dosya | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | ZIP içindeki dosya | Calibre | +| ComicBookInfo JSON | ZIP yorum alanı | Calibre (yedek) | + +## Çıktı Biçimi + +- `filename.cbz`: numaralı sayfa görsellerini ve üst veri dosyalarını içeren bir ZIP arşivi. + +Sayfa görselleri, okuyucuların bunları doğru sırada göstermesi için sıfır dolgulu numaralarla adlandırılır (`01.jpg`, `02.jpg` vb.). + +## Kullanım Alanları + +- Manga veya çizgi roman PDF'lerini çizgi roman okuyucularında kullanmak üzere dönüştürmek. +- Komga, Kavita veya Calibre'de dijital bir çizgi roman kütüphanesi oluşturmak. +- Taranmış çizgi romanları okuyucu dostu bir biçime dönüştürmek. +- Çizgi romanları okuma yönünü ve üst veriyi koruyan bir biçimde paylaşmak. + +## İpuçları + +- Renkli çizgi romanlar için **JPEG**, siyah-beyaz manga için **PNG** kullanın: PNG, siyah-beyaz içeriği çok verimli sıkıştırır. +- Dosya boyutunu önemli ölçüde küçültmek için manga için **Gri tonlamaya dönüştür** seçeneğini etkinleştirin. +- Kütüphane yöneticilerinin (Komga, Calibre) koleksiyonunuzu otomatik olarak düzenleyebilmesi için **Seri** ve **Numara (#)** alanlarını doldurun. +- **WebP** en iyi sıkıştırmayı sunar ancak eski çizgi roman okuyucuları bunu desteklemeyebilir. + +## İlgili Araçlar + +- [PDF'den JPG'ye](./pdf-to-jpg) +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den TIFF'e](./pdf-to-tiff) +- [Görüntüleri Çıkar](./extract-images) diff --git a/docs/tr/tools/pdf-to-csv.md b/docs/tr/tools/pdf-to-csv.md new file mode 100644 index 00000000..09ece637 --- /dev/null +++ b/docs/tr/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF'den CSV'ye +description: PDF belgelerinden tabloları çıkarın ve tek bir CSV dosyası olarak dışa aktarın. Otomatik tablo algılamayla çok sayfalı PDF'leri destekler. +--- + +# PDF'den CSV'ye + +Bir PDF'teki tabloları çıkarır ve CSV dosyası olarak dışa aktarır. Araç, her sayfayı PyMuPDF'in tablo algılama motoruyla tablo verileri için tarar, ardından bulunan tüm satırları virgülle ayrılmış tek bir çıktıya yazar. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Tablo çıkarmayı başlatmak için **CSV'ye Dönüştür** düğmesine tıklayın. +3. Araç her sayfayı tarar ve tabloları otomatik olarak belirler. +4. Çıkarılan tüm tablo verilerini içeren bir `.csv` dosyası iner. + +Farklı sayfalardaki tablolar çıktıda boş satırlarla ayrılır. Virgül, tırnak veya satır sonu içeren hücreler RFC 4180'e uygun olarak düzgün biçimde kaçışlanır. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Belgede bulunan tüm tablolar çıkarılır ve tek bir CSV'de birleştirilir. + +## Çıktı Biçimi + +- Algılanan tüm tabloları içeren tek bir `filename.csv` dosyası. + +## Kullanım Alanları + +- PDF banka ekstrelerinden veya faturalardan mali verileri bir elektronik tabloya aktarmak. +- Karşılaştırma için tedarikçi tekliflerindeki fiyat tablolarını çıkarmak. +- PDF makalelerdeki tablo biçimli araştırma verilerini analiz araçlarına uygun bir biçime dönüştürmek. +- Eski PDF raporlarındaki verileri veritabanlarına taşımak. + +## İpuçları + +- Hiç tablo bulunamazsa araç "Tablo Bulunamadı" mesajı gösterir. Bu genellikle PDF'in tablo gibi görünen ancak gerçek bir tablo olarak yapılandırılmamış bir metin düzeni kullandığı anlamına gelir. +- Tek tek tablolar üzerinde daha fazla denetim için CSV, JSON ve Markdown çıktı biçimleri arasında seçim yapmanızı sağlayan [PDF Tablolarını Çıkar](./extract-tables) aracını kullanın. +- Verilere her tablo için ayrı sayfalar bulunan Excel biçiminde ihtiyacınız varsa [PDF'den Excel'e](./pdf-to-excel) aracını kullanın. + +## İlgili Araçlar + +- [PDF'den Excel'e](./pdf-to-excel) +- [PDF Tablolarını Çıkar](./extract-tables) +- [PDF'den Metne](./pdf-to-text) diff --git a/docs/tr/tools/pdf-to-excel.md b/docs/tr/tools/pdf-to-excel.md new file mode 100644 index 00000000..c5b270aa --- /dev/null +++ b/docs/tr/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF'den Excel'e +description: PDF belgelerindeki tabloları bir Excel elektronik tablosuna çıkarın. Her tablo, sayfa başvurusuyla kendi çalışma sayfasında yer alır. +--- + +# PDF'den Excel'e + +Bir PDF'teki tabloları çıkarır ve Excel (`.xlsx`) elektronik tablosu olarak kaydeder. Algılanan her tablo, tablo numarası ve kaynak sayfasıyla etiketlenmiş kendi çalışma sayfasına yerleştirilir. Tablo algılama için PyMuPDF, Excel oluşturma için SheetJS kütüphanesi kullanılır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Tablo çıkarmayı başlatmak için **Excel'e Dönüştür** düğmesine tıklayın. +3. Araç her sayfayı tablolar için tarar, ardından bir Excel çalışma kitabı oluşturur. +4. Tablo başına bir sayfa içeren bir `.xlsx` dosyası iner. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Algılanan tüm tablolar otomatik olarak çıkarılır. + +## Çıktı Biçimi + +- Tek bir `filename.xlsx` dosyası. +- **Tek tablo**: "Table" adlı tek bir çalışma sayfası. +- **Birden fazla tablo**: "Table 1 (Page 3)", "Table 2 (Page 5)" vb. adlı çalışma sayfaları. Sayfa adları 31 karaktere kısaltılır (Excel sınırı). + +## Kullanım Alanları + +- PDF mali raporlarını daha fazla analiz için düzenlenebilir elektronik tablolara dönüştürmek. +- Tedarikçi PDF'lerinden envanter veya sipariş tablolarını çıkarmak. +- PDF formlarından veya kataloglarından yapılandırılmış verileri sıralama ve filtreleme için Excel'e aktarmak. +- Tablo biçimli PDF verilerini teknik olmayan meslektaşların çalışabileceği bir biçimde arşivlemek. + +## İpuçları + +- Araç "Tablo Bulunamadı" bildirirse, PDF büyük olasılıkla yapılandırılmış tablolar yerine serbest akışlı bir metin düzeni kullanıyordur. Ham içeriği almak için bunun yerine [PDF'den Metne](./pdf-to-text) aracını deneyin. +- Daha basit, düz bir biçim için [PDF'den CSV'ye](./pdf-to-csv) aracını kullanın. Birden fazla biçimde tablo başına indirme için [PDF Tablolarını Çıkar](./extract-tables) aracını kullanın. +- Her tablonun hangi sayfadan geldiğini belirlemek için sayfa adlarına bakın. + +## İlgili Araçlar + +- [PDF'den CSV'ye](./pdf-to-csv) +- [PDF Tablolarını Çıkar](./extract-tables) +- [PDF'den Metne](./pdf-to-text) diff --git a/docs/tr/tools/pdf-to-greyscale.md b/docs/tr/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..39020f0f --- /dev/null +++ b/docs/tr/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF'yi Gri Tonlamaya Çevir +description: Renkli bir PDF'i gri tonlamalı (siyah-beyaz) sürüme dönüştürün. Her sayfadaki tüm rengin kaldırıldığı yeni bir PDF üretir. +--- + +# PDF'yi Gri Tonlamaya Çevir + +Renkli bir PDF'i gri tonlamalı sürüme dönüştürür. Her sayfa işlenir, doygunluğu azaltılır ve yeni bir PDF'e JPEG görseli olarak yeniden gömülür. Çıktı, özgün sayfa boyutlarını korur. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Dosyayı işlemek için **Gri Tonlamaya Dönüştür** düğmesine tıklayın. +3. Tüm sayfaları siyah-beyaza çevrilmiş yeni bir `greyscale.pdf` iner. + +Arka planda her sayfa 2x ölçekte işlenir, piksel verisi bir gri tonlama filtresinden geçirilir, ardından %90 kalitede JPEG olarak yeniden kodlanır ve yeni bir PDF belgesine yerleştirilir. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Gri tonlama dönüştürmesi standart bir parlaklık formülü kullanır ve JPEG kalitesi %90'a sabitlenmiştir. + +## Çıktı Biçimi + +- Tüm sayfaları gri tonlamalı JPEG görselleri olarak içeren tek bir `greyscale.pdf` dosyası. + +## Kullanım Alanları + +- Renkli mürekkep maliyetinden tasarruf etmek için belgeleri siyah-beyaz baskıya hazırlamak. +- Gri tonlama zorunlu kılan hukuki veya resmi başvuru gereksinimlerini karşılamak. +- Renk ağırlıklı PDF'lerde dosya boyutunu küçültmek (gri tonlamalı JPEG görseller renklilerden küçüktür). +- Renkli ve siyah-beyaz sayfaların karışık olduğu belgelerde tutarlı bir görsel stil oluşturmak. + +## İpuçları + +- Her sayfa rasterleştirilip JPEG olarak yeniden gömüldüğünden çıktı görsel tabanlıdır. Özgün PDF'teki metin artık seçilemez ve aranamaz. Sonrasında aranabilir metne ihtiyacınız varsa çıktıyı OCR aracından geçirin. +- Renk ayarları (parlaklık, kontrast, doygunluk) üzerinde daha fazla denetim için Renkleri Ayarla aracına veya [PDF İş Akışı Oluşturucu](./pdf-workflow) içindeki Greyscale düğümüne bakın. + +## İlgili Araçlar + +- [PDF'den JPG'ye](./pdf-to-jpg) +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF İş Akışı Oluşturucu](./pdf-workflow) diff --git a/docs/tr/tools/pdf-to-jpg.md b/docs/tr/tools/pdf-to-jpg.md new file mode 100644 index 00000000..034fb36c --- /dev/null +++ b/docs/tr/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF'den JPG'ye +description: PDF sayfalarını ayarlanabilir kalitede JPG görsellerine dönüştürün. Tek sayfalı PDF'ler doğrudan iner, çok sayfalı PDF'ler ZIP olarak dışa aktarılır. +--- + +# PDF'den JPG'ye + +Bir PDF'in her sayfasını JPG görseline dönüştürür. Tek sayfalı belgeler bağımsız bir `.jpg` dosyası olarak iner. Çok sayfalı PDF'ler, sayfa başına bir JPG içeren bir ZIP arşivi üretir. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. Araç dosya adını, dosya boyutunu ve sayfa sayısını gösterir. +2. JPG sıkıştırmasını denetlemek için **Görüntü Kalitesi** kaydırıcısını ayarlayın. +3. İşlemeyi başlatmak için **Dönüştür** düğmesine tıklayın. +4. Sonuç otomatik olarak iner: tek sayfalı PDF'ler için tek bir JPG, çok sayfalı belgeler için bir ZIP dosyası. + +## Seçenekler + +- **Görüntü Kalitesi**: %0 ile %100 arasında bir kaydırıcı (varsayılan %90). Yüksek değerler daha keskin ve daha büyük dosyalı görseller üretir. Düşük değerler daha agresif sıkıştırır. + +Sayfalar dahili olarak 2x ölçekte işlenir, bu nedenle çıktı çözünürlüğü PDF sayfa boyutlarının iki katıdır. Standart bir Letter boyutlu sayfa yaklaşık 1.224 x 1.584 piksellik bir görsel üretir. + +## Çıktı Biçimi + +- **Tek sayfa**: `filename.jpg` +- **Birden fazla sayfa**: `page_1.jpg`, `page_2.jpg` vb. içeren `filename_jpgs.zip` + +## Kullanım Alanları + +- Bir belge yönetim sistemi için önizleme küçük resimleri oluşturmak. +- Bir raporun bir sayfasını PDF desteklemeyen bir sohbette veya e-postada paylaşmak. +- PDF diyagramlarından veya çizimlerinden görsel varlıklar oluşturmak. +- Taranmış belgeleri tek tek görseller olarak arşivlemek. + +## İpuçları + +- Kayıpsız çıktı için bunun yerine [PDF'den PNG'ye](./pdf-to-png) aracını kullanın. +- %80-90 kalite ayarı, dosya boyutu ile görsel doğruluk arasında iyi bir denge sağlar. +- Sayfa başına belirli bir biçime ihtiyacınız varsa, PDF'den Görsellere çıktı düğümüne sahip [PDF İş Akışı Oluşturucu](./pdf-workflow) aracını değerlendirin. + +## İlgili Araçlar + +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den WebP'ye](./pdf-to-webp) +- [PDF'den BMP'ye](./pdf-to-bmp) +- [PDF'den TIFF'e](./pdf-to-tiff) diff --git a/docs/tr/tools/pdf-to-json.md b/docs/tr/tools/pdf-to-json.md new file mode 100644 index 00000000..0b2d52e7 --- /dev/null +++ b/docs/tr/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF'den JSON'a +description: CPDF kullanarak PDF dosyalarını yapılandırılmış JSON biçimine dönüştürün. PDF'in iç yapısını makine tarafından okunabilir JSON verisi olarak dışa aktarır. +--- + +# PDF'den JSON'a + +Bir veya daha fazla PDF dosyasını JSON biçimine dönüştürür. Araç, her PDF'in iç yapısını makine tarafından okunabilir bir JSON gösterimine serileştirmek için CPDF (Coherent PDF) kullanır. Çıktı her zaman bir ZIP arşivi olarak sunulur. + +## Nasıl Çalışır + +1. Dosya seçiciyle bir veya daha fazla PDF dosyası seçin. +2. İşlemeyi başlatmak için **JSON'a Dönüştür** düğmesine tıklayın. Dönüştürme arka planda bir web worker içinde çalışır. +3. Her girdi PDF'i için bir JSON dosyası içeren bir ZIP arşivi iner. + +Durum çubuğu, dönüştürme ve ZIP oluşturma aşamalarındaki ilerlemeyi gösterir. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Her PDF, tam JSON gösterimine dönüştürülür. + +## Çıktı Biçimi + +- Her girdi PDF'i için `filename.json` içeren bir `pdfs-to-json.zip` dosyası. + +JSON çıktısı, PDF'in sayfa ağaçları, yazı tipi başvuruları, üst veri ve içerik akışları dahil iç nesne yapısını temsil eder. + +## Kullanım Alanları + +- Hata ayıklama veya doğrulama için bir PDF'in iç yapısını incelemek. +- Yapılandırılmış üst veriyi ve sayfa özelliklerini programatik olarak çıkarmak. +- PDF yapı verilerini özel işleme hatlarına aktarmak. +- PDF belgelerini nesne ağaçlarını analiz ederek uyumluluk açısından denetlemek. + +## İpuçları + +- Bu araç, çıkarılmış metin içeriğini değil, ham PDF nesne yapısını çıktı olarak verir. Sayfa metnine JSON biçiminde ihtiyacınız varsa bunun yerine [PDF'yi Yapay Zeka için Hazırla](./prepare-pdf-for-ai) aracını kullanın. +- Düz metin çıkarma için [PDF'den Metne](./pdf-to-text) daha basittir. +- Karmaşık yapılı büyük PDF'ler çok büyük JSON dosyaları üretir. + +## İlgili Araçlar + +- [PDF'den Metne](./pdf-to-text) +- [PDF'yi Yapay Zeka için Hazırla](./prepare-pdf-for-ai) +- [PDF Tablolarını Çıkar](./extract-tables) diff --git a/docs/tr/tools/pdf-to-markdown.md b/docs/tr/tools/pdf-to-markdown.md new file mode 100644 index 00000000..d559254a --- /dev/null +++ b/docs/tr/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF'den Markdown'a +description: PDF belgelerini isteğe bağlı görsel çıkarmayla Markdown biçimine dönüştürün. Birden fazla dosyanın toplu dönüştürülmesini destekler. +--- + +# PDF'den Markdown'a + +PDF dosyalarını başlıkları, paragrafları, listeleri ve temel biçimlendirmeyi koruyarak Markdown (`.md`) biçimine dönüştürür. İsteğe bağlı olarak gömülü görselleri çıkarıp ekler. Tekli ve toplu dönüştürmeyi destekler. PyMuPDF ile çalışır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları üzerine sürükleyerek bir veya daha fazla PDF yükleyin. +2. İsteğe bağlı olarak, çıkarılan görselleri Markdown çıktısına gömmek için **Görüntüleri base64 olarak dahil et** seçeneğini açın. +3. İşlemeyi başlatmak için **Markdown'a Dönüştür** düğmesine tıklayın. +4. Tek bir dosya `filename.md` olarak iner. Birden fazla dosya bir `markdown-files.zip` üretir. + +## Seçenekler + +- **Görüntüleri base64 olarak dahil et**: işaretlendiğinde PDF'teki gömülü görseller çıkarılır ve Markdown çıktısında başvurulur. İşaretli değilse yalnızca metin içeriği dönüştürülür. + +## Çıktı Biçimi + +- **Tek dosya**: `filename.md` +- **Birden fazla dosya**: her girdi PDF'i için bir `.md` içeren `markdown-files.zip`. + +## Kullanım Alanları + +- PDF belgelerini VitePress, Hugo veya Jekyll gibi bir statik site oluşturucu için Markdown'a dönüştürmek. +- PDF araştırma makalelerini Obsidian gibi not alma uygulamaları için düzenlenebilir Markdown'a çevirmek. +- Eski PDF bilgi tabanlarını Git dostu bir metin biçimine taşımak. +- PDF e-kitaplardan yapılandırılmış içeriği yeniden biçimlendirmek üzere çıkarmak. + +## İpuçları + +- Include Images seçeneği, PDF içeriğin vazgeçilmez parçası olan diyagramlar veya şekiller içerdiğinde kullanışlıdır. Çıktıyı temiz tutmak için metin ağırlıklı belgelerde kapatın. +- Kenar çubukları, dipnotlar veya çok sütunlu metin içeren karmaşık düzenler kusurlu Markdown üretebilir. Çıktıyı gözden geçirip gerektiği gibi düzeltin. +- Hiçbir biçimlendirme olmadan ham metin için bunun yerine [PDF'den Metne](./pdf-to-text) aracını kullanın. + +## İlgili Araçlar + +- [PDF'den Metne](./pdf-to-text) +- [PDF'den Word'e](./pdf-to-word) +- [PDF'yi Yapay Zeka için Hazırla](./prepare-pdf-for-ai) diff --git a/docs/tr/tools/pdf-to-pdfa.md b/docs/tr/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..cc3af18c --- /dev/null +++ b/docs/tr/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF'den PDF/A'ya +description: Standart PDF'leri uzun süreli arşivleme için PDF/A biçimine dönüştürün. PDF/A-1b, PDF/A-2b ve PDF/A-3b uyumluluk düzeylerini destekler. +--- + +# PDF'den PDF/A'ya + +PDF/A, uzun süreli dijital koruma için tasarlanmış, ISO standardı bir PDF alt kümesidir. Bu araç, doğrudan tarayıcınızda çalışan Ghostscript kullanarak standart PDF'lerinizi PDF/A uyumlu belgelere dönüştürür. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. +2. Açılır listeden bir **PDF/A Sürümü** seçin. +3. İsteğe bağlı olarak, normal dönüştürmenin başarısız olduğu karmaşık dosyalar için **PDF'yi ön düzleştir** seçeneğini etkinleştirin. +4. **PDF/A'ya Dönüştür** düğmesine tıklayın. Birden fazla dosya bir ZIP arşivi üretir. + +## PDF/A Sürümleri + +| Sürüm | Kısıtlamalar | En Uygun Olduğu Durum | +| ------------ | ------------------------------------- | --------------------------------------------- | +| **PDF/A-1b** | En katı. Saydamlık yok, katman yok. | Eski arşiv sistemleriyle azami uyumluluk | +| **PDF/A-2b** | Saydamlığa ve JPEG2000'e izin verir. | Genel amaçlı arşivleme (önerilir) | +| **PDF/A-3b** | Her biçimde gömülü eklere izin verir. | Kaynak veri dosyalarıyla belgeleri arşivlemek | + +PDF/A-2b varsayılan olarak seçilidir ve arşivleme ihtiyaçlarının büyük çoğunluğu için uygundur. + +## Pre-flatten Seçeneği + +Bazı PDF'ler, temiz bir PDF/A dönüştürmesini engelleyen özellikler içerir: alışılmadık yazı tipi kodlamaları, karmaşık saydamlık yığınları veya bozuk iç yapılar. **PDF'yi ön düzleştir** seçeneğini etkinleştirmek, dönüştürmeden önce PDF'i 300 DPI'da rasterleştirir; bu, uyumluluğu garanti eder ancak metni seçilemez hale getirir. Standart dönüştürme hata verdiğinde yedek olarak kullanın. + +Pre-flatten, PyMuPDF WASM motorunu gerektirir. + +## Kullanım Alanları + +- Resmi veya hukuki arşiv gereksinimlerini karşılamak (birçok yargı bölgesi mahkeme dosyaları için PDF/A zorunlu kılar) +- Belgeleri kurumsal depolara veya dijital kütüphanelere göndermek +- Orijinal yazılımın on yıl sonra var olmayabileceği ticari kayıtları korumak +- Faturaları, XML ekleriyle PDF/A-3b gerektiren e-fatura standartlarına hazırlamak + +## İpuçları + +- Önce pre-flatten olmadan dönüştürmeyi deneyin. Yalnızca hata alırsanız etkinleştirin. +- PDF/A tüm yazı tiplerini gömer, bu nedenle çıktı dosyaları genellikle özgün dosyalardan büyüktür. +- İş akışınız için katı uyumluluk gerekiyorsa çıktıyı özel bir PDF/A doğrulayıcıda doğrulayın. + +## İlgili Araçlar + +- [PDF Sıkıştır](./compress-pdf): dönüştürmeden sonra dosya boyutunu küçültün +- [PDF'yi Düzleştir](./flatten-pdf): PDF/A'ya dönüştürmeden önce formları düzleştirin +- [Üst Veriyi Kaldır](./remove-metadata): arşivlemeden önce üst veriyi temizleyin diff --git a/docs/tr/tools/pdf-to-png.md b/docs/tr/tools/pdf-to-png.md new file mode 100644 index 00000000..f05287f9 --- /dev/null +++ b/docs/tr/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF'den PNG'ye +description: PDF sayfalarını ayarlanabilir ölçekte kayıpsız PNG görsellerine dönüştürün. Yüksek kaliteli ekran görüntüleri ve saydam arka planlar için idealdir. +--- + +# PDF'den PNG'ye + +Bir PDF'in her sayfasını PNG görseline dönüştürür. PNG kayıpsız sıkıştırma kullanır, bu nedenle çıktı özgün sayfanın her ayrıntısını korur. Tek sayfalı PDF'ler `.png` dosyası olarak iner; çok sayfalı PDF'ler bir ZIP üretir. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Çıktı çözünürlüğünü denetlemek için **Görüntü Ölçeği** kaydırıcısını ayarlayın. +3. İşlemeyi başlatmak için **Dönüştür** düğmesine tıklayın. +4. Tek bir PNG veya bir ZIP arşivi otomatik olarak iner. + +## Seçenekler + +- **Görüntü Ölçeği**: 1.0x ile 3.0x arasındadır (varsayılan 2.0x). 2.0x'te standart bir Letter boyutlu sayfa yaklaşık 1.224 x 1.584 piksel olarak işlenir. Yüksek ölçek değerleri, dosya boyutu ve işlem süresi pahasına daha büyük ve daha keskin görseller üretir. + +## Çıktı Biçimi + +- **Tek sayfa**: `filename.png` +- **Birden fazla sayfa**: `page_1.png`, `page_2.png` vb. içeren `filename_pngs.zip` + +## Kullanım Alanları + +- Sunumlar için PDF sayfalarının yüksek doğrulukta ekran görüntülerini almak. +- Net kenarlar ve sıkıştırma artefaktı olmaması gereken grafikleri veya diyagramları çıkarmak. +- PDF maketlerinden web tasarımı için varlıklar hazırlamak. +- OCR ön işlemesi için kayıpsız sayfa görselleri oluşturmak. + +## İpuçları + +- PNG dosyaları JPG'den belirgin biçimde büyüktür. Dosya boyutu mükemmel kaliteden daha önemliyse [PDF'den JPG'ye](./pdf-to-jpg) veya [PDF'den WebP'ye](./pdf-to-webp) kullanın. +- 1.0x ölçekte çıktı, PDF'in özgün çözünürlüğüyle eşleşir. Baskı kalitesinde dışa aktarımlar için 3.0x'e çıkarın. + +## İlgili Araçlar + +- [PDF'den JPG'ye](./pdf-to-jpg) +- [PDF'den WebP'ye](./pdf-to-webp) +- [PDF'den SVG'ye](./pdf-to-svg) diff --git a/docs/tr/tools/pdf-to-svg.md b/docs/tr/tools/pdf-to-svg.md new file mode 100644 index 00000000..d2d71107 --- /dev/null +++ b/docs/tr/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF'den SVG'ye +description: PDF sayfalarını ölçeklenebilir SVG vektör grafiklerine dönüştürün. Metni ve şekilleri vektör yolları olarak koruyarak sonsuz ölçeklemeye olanak tanır. +--- + +# PDF'den SVG'ye + +Bir PDF'in her sayfasını SVG (Scalable Vector Graphics) dosyasına dönüştürür. Raster biçimlerden farklı olarak SVG, vektör yollarını, metni ve şekilleri korur; böylece çıktı pikselleşme olmadan her boyuta ölçeklenir. PyMuPDF ile çalışır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları üzerine sürükleyerek bir veya daha fazla PDF yükleyin. Birden fazla dosya ekleyebilir ve bunları tek tek yönetebilirsiniz. +2. Yüklenen tüm dosyaları işlemek için **SVG'ye Dönüştür** düğmesine tıklayın. +3. Tek dosyalı, tek sayfalı dönüştürmeler bağımsız bir `.svg` olarak iner. Diğer her şey ZIP arşivi olarak iner. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Her sayfa, PyMuPDF'in yerel vektör dışa aktarımıyla SVG'ye dönüştürülür. + +## Çıktı Biçimi + +- **Tek dosya, tek sayfa**: `filename.svg` +- **Tek dosya, birden fazla sayfa**: `page_1.svg`, `page_2.svg` vb. içeren `filename_svg.zip` +- **Birden fazla dosya**: dosyaların kaynak belge adına göre düzenlendiği `pdf_to_svg.zip`. + +## Kullanım Alanları + +- PDF raporlarındaki vektör diyagramlarını, grafikleri veya çizimleri web sayfalarında kullanmak üzere çıkarmak. +- PDF sayfa içeriğini Inkscape veya Illustrator gibi bir vektör düzenleyicide düzenlemek. +- Duyarlı web uygulamalarına ölçeklenebilir sayfa önizlemeleri gömmek. +- PDF broşürlerden logoları veya grafikleri keskin kenarlarını koruyarak çıkarmak. + +## İpuçları + +- SVG, vektör içerik barındıran PDF'lerle en iyi sonucu verir. Taranmış belgeler veya görsel ağırlıklı PDF'ler, gömülü raster veri içeren büyük SVG dosyaları üretir. +- Görsel ağırlıklı PDF'lerin raster çıktısı için bunun yerine [PDF'den PNG'ye](./pdf-to-png) veya [PDF'den JPG'ye](./pdf-to-jpg) kullanın. +- Bu araç toplu dönüştürmeyi destekler: birden fazla PDF'i aynı anda yükleyerek tek seferde dönüştürebilirsiniz. + +## İlgili Araçlar + +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den JPG'ye](./pdf-to-jpg) +- [PDF'den Markdown'a](./pdf-to-markdown) diff --git a/docs/tr/tools/pdf-to-text.md b/docs/tr/tools/pdf-to-text.md new file mode 100644 index 00000000..065a8d15 --- /dev/null +++ b/docs/tr/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF'den Metne +description: PDF dosyalarından düz metin içeriğini çıkarın. Birden fazla PDF'in toplu çıkarılmasını ve TXT dosyaları olarak çıktı almayı destekler. +--- + +# PDF'den Metne + +PDF dosyalarındaki tüm metin içeriğini çıkarır ve düz `.txt` dosyaları olarak kaydeder. Toplu işlemeyi destekler: birden fazla PDF yükleyin ve her birinin metnini tek işlemde çıkarın. PyMuPDF ile çalışır. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları üzerine sürükleyerek bir veya daha fazla PDF yükleyin. Dosya listenizi Add More ve Clear düğmeleriyle yönetin. +2. İşlemeyi başlatmak için **Metni Çıkar** düğmesine tıklayın. +3. Tek bir dosya `filename.txt` olarak iner. Birden fazla dosya bir `pdf-to-text.zip` arşivi üretir. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Tüm metin içeriği, her sayfadan okuma sırasıyla çıkarılır. + +## Çıktı Biçimi + +- **Tek dosya**: `filename.txt` +- **Birden fazla dosya**: her girdi PDF'i için bir `.txt` içeren `pdf-to-text.zip`. + +## Kullanım Alanları + +- Tam metin arama dizinlemesi için PDF raporlarından gövde metnini çıkarmak. +- PDF e-kitapları veya makaleleri e-mürekkep cihazlarda okumak için düz metne dönüştürmek. +- Anahtar kelime analizi için sözleşmelerden veya hukuki belgelerden metin almak. +- Veri işleme betikleri için temiz metin elde etmek üzere PDF'lerden biçimlendirmeyi temizlemek. +- Doğal dil işleme için PDF arşivlerinden metin derlemi hazırlamak. + +## İpuçları + +- Taranmış PDF'ler (yalnızca görsel), çıkarılacak bir metin katmanı olmadığından boş metin dosyaları üretir. Taranmış belgeleri önce OCR'dan geçirin. +- Çıktı, PyMuPDF'in yorumladığı okuma sırasını korur; bu sıra genellikle soldan sağa ve yukarıdan aşağıyadır. Çok sütunlu düzenler iç içe geçmiş metin üretebilir. +- Başlıklar ve biçimlendirme içeren yapılandırılmış çıktı için [PDF'den Markdown'a](./pdf-to-markdown) aracını deneyin. Yapay zekaya hazır yapılandırılmış JSON için [PDF'yi Yapay Zeka için Hazırla](./prepare-pdf-for-ai) aracını kullanın. + +## İlgili Araçlar + +- [PDF'den Markdown'a](./pdf-to-markdown) +- [PDF'yi Yapay Zeka için Hazırla](./prepare-pdf-for-ai) +- [PDF'den Word'e](./pdf-to-word) diff --git a/docs/tr/tools/pdf-to-tiff.md b/docs/tr/tools/pdf-to-tiff.md new file mode 100644 index 00000000..af78da98 --- /dev/null +++ b/docs/tr/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF'den TIFF'e +description: PDF sayfalarını baskı, faks ve arşiv iş akışlarında yaygın olarak kullanılan TIFF görsellerine dönüştürün. Kodlama başarısız olursa PNG'ye geçer. +--- + +# PDF'den TIFF'e + +Bir PDF'in her sayfasını TIFF görseline dönüştürür. TIFF; baskı üretimi, faks sistemleri ve belge arşivleme için standart biçimdir. Araç, TIFF kodlaması için PackBits sıkıştırması kullanır ve bir sayfa kodlanamazsa PNG'ye geçer. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. Dosyayı işlemek için **Dönüştür** düğmesine tıklayın. +3. Tek bir TIFF dosyası veya bir ZIP arşivi otomatik olarak iner. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Sayfalar sabit 2x ölçekte işlenir. + +## Çıktı Biçimi + +- **Tek sayfa**: `filename.tiff` +- **Birden fazla sayfa**: `page_1.tiff`, `page_2.tiff` vb. içeren `filename_tiffs.zip` + +Belirli bir sayfa için TIFF kodlaması başarısız olursa (sıkıştırma sorunları nedeniyle), o sayfa bunun yerine `.png` dosyası olarak kaydedilir. Bu durumda ZIP, TIFF ve PNG dosyalarının karışımını içerir. + +## Kullanım Alanları + +- Belgeleri TIFF biçimi gerektiren devlet kurumlarına veya hukuki sistemlere göndermek. +- Sayfaları dijital faks hizmetleri üzerinden faks iletimine hazırlamak. +- Taranmış belgeleri yaygın olarak desteklenen kayıpsız bir biçimde arşivlemek. +- Sayfaları kurumsal belge yönetim sistemlerine aktarmak. + +## İpuçları + +- TIFF dosyaları büyüktür. Yalnızca web veya ekran kullanımı için kayıpsız kaliteye ihtiyacınız varsa [PDF'den PNG'ye](./pdf-to-png) daha iyi bir seçimdir. +- Bazı sayfalar PNG yedeğine ihtiyaç duyduysa ZIP içeriğini kontrol edin: bunları ayrıca dönüştürmek isteyebilirsiniz. + +## İlgili Araçlar + +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den BMP'ye](./pdf-to-bmp) +- [PDF'den JPG'ye](./pdf-to-jpg) diff --git a/docs/tr/tools/pdf-to-webp.md b/docs/tr/tools/pdf-to-webp.md new file mode 100644 index 00000000..70ab0922 --- /dev/null +++ b/docs/tr/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF'den WebP'ye +description: PDF sayfalarını ayarlanabilir kalitede WebP görsellerine dönüştürün. Karşılaştırılabilir görsel kalitede JPG'den daha küçük dosya boyutları. +--- + +# PDF'den WebP'ye + +Bir PDF'in her sayfasını WebP görseline dönüştürür. WebP, aynı algılanan kalitede genellikle JPG'den %25-35 daha küçük dosyalar üretir; bu da onu web kullanımı için güçlü bir seçim yapar. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya bir dosyayı üzerine sürükleyerek bir PDF yükleyin. +2. **Görüntü Kalitesi** kaydırıcısını ayarlayın. +3. Dosyayı işlemek için **Dönüştür** düğmesine tıklayın. +4. Tek bir `.webp` dosyası veya bir ZIP arşivi otomatik olarak iner. + +## Seçenekler + +- **Görüntü Kalitesi**: %0 ile %100 arasında bir kaydırıcı (varsayılan %85). Kayıplı sıkıştırma düzeyini denetler. Yüksek değerler daha fazla ayrıntıyı korur. + +Sayfalar dahili olarak 2x ölçekte işlenir ve PDF'in özgün boyutlarının kabaca iki katı boyutunda görseller üretir. + +## Çıktı Biçimi + +- **Tek sayfa**: `filename.webp` +- **Birden fazla sayfa**: `page_1.webp`, `page_2.webp` vb. içeren `filename_webps.zip` + +## Kullanım Alanları + +- Bant genişliğinin önemli olduğu web siteleri için sayfa önizlemeleri hazırlamak. +- Broşürlerin veya el ilanlarının sosyal medya için hafif görsel sürümlerini oluşturmak. +- Çok sayfalı belgeleri web için optimize edilmiş bir görsel setine toplu dönüştürmek. + +## İpuçları + +- WebP tüm modern tarayıcılarda desteklenir. Eski uyumluluk için [PDF'den JPG'ye](./pdf-to-jpg) aracına geçin. +- %80-85 kalite genellikle ekranda özgünden ayırt edilemez ve dosya boyutlarını küçük tutar. + +## İlgili Araçlar + +- [PDF'den JPG'ye](./pdf-to-jpg) +- [PDF'den PNG'ye](./pdf-to-png) +- [PDF'den BMP'ye](./pdf-to-bmp) diff --git a/docs/tr/tools/pdf-to-word.md b/docs/tr/tools/pdf-to-word.md new file mode 100644 index 00000000..ceec1343 --- /dev/null +++ b/docs/tr/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF'den Word'e +description: PDF dosyalarını düzenlenebilir Word (DOCX) belgelerine dönüştürün. Birden fazla PDF'in aynı anda toplu dönüştürülmesini destekler. +--- + +# PDF'den Word'e + +PDF dosyalarını düzenlenebilir Word (`.docx`) belgelerine dönüştürür. Araç, belge içeriğini yeniden oluşturmak için PyMuPDF kullanır ve metni, temel biçimlendirmeyi ve düzeni korur. Tekli ve toplu dönüştürmeyi destekler. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları üzerine sürükleyerek bir veya daha fazla PDF yükleyin. Listeye daha fazla dosya ekleyebilir veya tek tek dosyaları kaldırabilirsiniz. +2. İşlemeyi başlatmak için **DOCX'e Dönüştür** düğmesine tıklayın. +3. Tek bir dosya `filename.docx` olarak iner. Birden fazla dosya `converted-documents.zip` içinde paketlenir. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Her PDF, PyMuPDF'in yerleşik dönüştürme motoruyla DOCX'e dönüştürülür. + +## Çıktı Biçimi + +- **Tek dosya**: `filename.docx` +- **Birden fazla dosya**: her girdi PDF'i için bir `.docx` içeren `converted-documents.zip`. + +## Kullanım Alanları + +- Aldığınız ve değiştirmeniz gereken bir PDF'teki metni düzenlemek. +- Arşivlenmiş PDF raporlarını meslektaşların Microsoft Word veya Google Docs'ta düzenleyebileceği bir biçime dönüştürmek. +- PDF sözleşmelerinden veya tekliflerden içeriği düzeltme işaretleri için Word'e aktarmak. +- Eski PDF belgelerini düzenlenebilir bir biçime taşımak. + +## İpuçları + +- Çok sütunlu metin, gömülü formlar veya yoğun grafikler içeren karmaşık düzenler mükemmel dönüşmeyebilir. Çıktıyı gözden geçirin ve biçimlendirmeyi kelime işlemcinizde düzeltin. +- Taranmış PDF'ler (yalnızca görsel) boş veya çok az içerikli DOCX dosyaları üretir. Bir metin katmanı eklemek için önce OCR'dan geçirin. +- Toplu mod, PDF'lerin tüm klasörlerini dönüştürmek için verimlidir: hepsini birden yükleyin. + +## İlgili Araçlar + +- [PDF'den Metne](./pdf-to-text) +- [PDF'den Markdown'a](./pdf-to-markdown) +- [PDF İş Akışı Oluşturucu](./pdf-workflow) diff --git a/docs/tr/tools/pdf-to-zip.md b/docs/tr/tools/pdf-to-zip.md new file mode 100644 index 00000000..a3680b97 --- /dev/null +++ b/docs/tr/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF'leri ZIP Yap +description: Kolay paylaşım ve depolama için birden fazla PDF dosyasını tek bir ZIP arşivinde paketleyin. +--- + +# PDF'leri ZIP Yap + +Birden fazla PDF dosyasını tek bir ZIP arşivinde toplayın. Bu basit bir paketleme aracıdır: PDF'lerin kendisinde dönüştürme, sıkıştırma veya değişiklik yapılmaz. + +## Nasıl Çalışır + +1. Bırakma alanını kullanarak birden fazla PDF dosyası yükleyin. +2. Dosya listesini gözden geçirin. Dahil etmek istemediklerinizi kaldırın. +3. İşle düğmesine tıklayın. +4. Yüklenen tüm PDF'leri içeren bir ZIP arşivi hemen iner. + +## Özellikler + +- Herhangi bir sayıda PDF dosyası kabul eder +- Arşivi oluşturmadan önce dosya başına kaldırma +- ZIP içinde özgün dosya adlarını korur +- PDF içeriğinde değişiklik yapılmaz: dosyalar olduğu gibi paketlenir +- Yüklenen her PDF için dosya adını ve boyutunu gösterir + +## Kullanım Alanları + +- E-posta eki için bir dizi fatura veya makbuzu paketlemek +- Teslim için proje çıktılarını (birden fazla PDF raporu) paketlemek +- Bir form veya şablon koleksiyonu için tek bir indirme oluşturmak +- Bir belge grubunu tek bir sıkıştırılmış dosyada arşivlemek + +## İpuçları + +- ZIP dosyası, özgün PDF dosya adlarını kullanır. Aynı ada sahip dosyalarınız varsa, çakışmayı önlemek için yüklemeden önce yeniden adlandırın. +- Bu araç PDF'lerin kendisini sıkıştırmaz. Dosya boyutunu küçültmek için önce PDF Sıkıştır aracından geçirin, ardından bu araçla paketleyin. + +## İlgili Araçlar + +- [PDF Birleştir](./merge-pdf) +- [PDF Böl](./split-pdf) +- [PDF Sıkıştır](./compress-pdf) diff --git a/docs/tr/tools/pdf-workflow.md b/docs/tr/tools/pdf-workflow.md new file mode 100644 index 00000000..8315eb71 --- /dev/null +++ b/docs/tr/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF İş Akışı Oluşturucu +description: Bir tuval üzerinde düğümleri bağlayarak özel PDF işleme hatlarını görsel olarak oluşturun. Birleştirme, sıkıştırma, filigran ve dışa aktarma gibi işlemleri zincirleyin. +--- + +# PDF İş Akışı Oluşturucu + +İş Akışı Oluşturucu, birden fazla PDF işlemini tek bir otomatik hatta zincirlemenizi sağlar. Araçları tek tek çalıştırmak yerine; giriş, işleme ve çıktı düğümlerinden oluşan görsel bir grafik kurar ve her şeyi tek tıklamayla yürütürsünüz. Dosyalarınız tarayıcıdan asla çıkmaz. + +## Nasıl Çalışır + +Arayüz üç panele ayrılmıştır: solda bir **düğüm araç kutusu**, ortada **tuval** ve bir düğüm seçtiğinizde sağda beliren bir **ayarlar paneli**. + +1. Sol kenar çubuğundan düğümlere tıklayarak veya doğrudan tuvale sürükleyerek **düğüm ekleyin**. Ada göre süzmek için araç kutusunun üstündeki arama çubuğunu kullanın. +2. Bir çıkış soketinden (düğümün altı) başka bir düğümün giriş soketine (üstü) sürükleyerek **düğümleri bağlayın**. Bağlantılar yukarıdan aşağıya akar. +3. Bir düğüme tıklayıp sağdaki ayarlar panelini açarak **ayarları yapılandırın**. Her düğüm türünün kendi seçenekleri vardır (sayfa aralıkları, kalite kaydırıcıları, parolalar vb.). +4. Araç çubuğundaki **Çalıştır** düğmesine tıklayarak **iş akışını çalıştırın**. Motor, düğümleri topolojik sırayla yürütür ve her birini sırayla işler. Alttaki durum çubuğu ilerlemeyi izler. +5. **Sonuçları indirin**: son İndir düğümü nihai PDF'i (birden fazla dosya üretilirse ZIP'i) kaydeder. + +## Düğüm Kategorileri + +Düğümler, tuval üzerinde renk kodlu altı kategoride düzenlenmiştir: + +- **Giriş** (mavi): PDF Girişi, Görsel Girişi, Word/Excel/PowerPoint'ten PDF'ye ve iş akışına dosya besleyen 15'ten fazla diğer biçim dönüştürücü. +- **Düzenle & Açıklama Ekle** (çivit mavisi): PDF Kırp, PDF'yi Gri Tonlamaya Çevir, Renkleri Ters Çevir, Filigran Ekle, Sayfa Numaraları, Üst Bilgi & Alt Bilgi, Tarayıcı Efekti, Renkleri Ayarla, Arka Plan Rengi, Boş Sayfaları Kaldır, Açıklamaları Kaldır. +- **Düzenle & Yönet** (mor): PDF Birleştir, PDF Böl, Sayfaları Çıkar, PDF'yi Döndür, Sayfaları Sil, Sayfaları Ters Çevir, Boş Sayfa Ekle, Sayfaları Böl, N'li PDF, Sayfa Boyutunu Düzelt, Tek Sayfada Birleştir, PDF Kitapçık, PDF'yi Posterleştir, Üst Veriyi Düzenle, İçindekiler, PDF'de OCR. +- **Optimize Et & Onar** (kehribar): PDF Sıkıştır, PDF'yi Rasterleştir, PDF'yi Doğrusallaştır, PDF Eğriliğini Düzelt, PDF'den PDF/A'ya, Yazı Tipini Ana Hatlara Dönüştür, PDF'yi Onar. +- **PDF Güvenliği** (gül kırmızısı): Şifrele, Şifreyi Çöz, PDF'yi Temizle, PDF'yi Düzleştir, Dijital İmza, Karart. +- **Çıkış** (deniz mavisi): İndir (tek PDF ile ZIP'i otomatik algılar), PDF'den Görsellere, PDF'den Metne, PDF'den DOCX'e, PDF'den XLSX'e, PDF'den CSV'ye, PDF'den SVG'ye, PDF'den Markdown'a, Görüntüleri Çıkar. + +## İş Akışlarını Kaydetme ve Yükleme + +Araç çubuğu dört kalıcılık seçeneği sunar: + +- **Kaydet**: geçerli iş akışını tarayıcınızın yerel depolama alanında adlandırılmış bir şablon olarak saklar. Birden fazla şablon kaydedebilirsiniz. +- **Yükle**: kayıtlı tüm şablonları listeleyen bir pencere açar. Birini geri yüklemek için Yükle'ye tıklayın veya artık ihtiyacınız olmayan şablonları silin. +- **Dışa Aktar**: iş akışını paylaşabilmeniz veya yedekleyebilmeniz için bir `.json` dosyası olarak indirir. +- **İçe Aktar**: diskten bir `.json` iş akışı dosyası yükler ve tüm düğümleri, konumları ve bağlantıları geri getirir. + +Şablonlar oturumlar arasında yerel depolamada kalır. Dışa aktarılan JSON dosyaları tarayıcılar ve makineler arasında taşınabilir. + +## Yürütme Modeli + +Motor, bağlantılarınızdan bir bağımlılık grafiği oluşturur ve düğümleri topolojik sırayla yürütür. Herhangi bir düğüm başarısız olursa yürütme durur ve başarısız düğüm kırmızı işaretlenir. Akılda tutulması gereken birkaç kural: + +- Her iş akışı en az bir **Giriş** düğümüne ve bir **Çıkış** düğümüne ihtiyaç duyar. +- Motor döngüsel bağımlılıkları algılar ve yürütmeyi bir hatayla engeller. +- **Şifrele** düğümü, çıktı düğümünden önceki son işleme adımı olmalıdır. Daha erkene yerleştirmek bir doğrulama uyarısı tetikler, çünkü sonraki düğümler şifrelenmiş veri üzerinde çalışamaz. +- Parola korumalı PDF'ler yürütme sırasında parola ister. +- Çoklu PDF girişleri desteklenir: PDF Birleştir düğümü bunları birleştirebilir veya toplu işleme düğümleri her PDF'i ayrı ayrı işler. + +## Soket Türleri + +Bağlantılar, geçersiz bağlantıları önlemek için türlendirilmiş soketler kullanır: + +- **PDF** (çivit mavisi): tek bir PDF belgesi. +- **MultiPDF** (kehribar): birlikte paketlenmiş birden fazla PDF belgesi. +- **Image** (yeşil): bir görsel blobu. + +## Seçenekler + +Her düğümün, sağdaki ayarlar paneliyle erişilen kendi yapılandırması vardır. Yaygın örüntüler şunlardır: + +- PDF Böl, Sayfaları Çıkar, Sayfaları Sil düğümlerinde **sayfa aralıkları** +- Görsel dönüştürme çıktı düğümlerinde **kalite kaydırıcıları** +- Şifrele ve Şifreyi Çöz düğümlerinde **parola alanları** +- Filigran Ekle, Üst Bilgi & Alt Bilgi, Üst Veriyi Düzenle için **metin girişleri** +- PDF'yi Döndür düğümünde **döndürme açıları** +- PDF Sıkıştır düğümünde **sıkıştırma düzeyi** +- PDF'de OCR düğümünde **OCR dil seçimi** + +## Kullanım Alanları + +- **Fatura işleme hattı**: PDF Girişi -> PDF'de OCR -> PDF Tablolarını Çıkar -> CSV olarak İndir. +- **Rapor standardizasyonu**: Word'den PDF'ye -> Sayfa Boyutunu Düzelt -> Sayfa Numaraları -> Filigran Ekle -> PDF Sıkıştır -> İndir. +- **Arşiv hazırlığı**: PDF Girişi -> PDF'yi Onar -> PDF'yi Düzleştir -> PDF'yi Temizle -> PDF'den PDF/A'ya -> İndir. +- **Toplu görsel çıkarma**: PDF Girişi (birden fazla dosya) -> Görüntüleri Çıkar -> ZIP olarak İndir. +- **Baskıya hazır kitapçıklar**: PDF Girişi -> PDF Kitapçık -> PDF Kırp -> PDF Sıkıştır -> İndir. +- **Güvenli dağıtım**: PDF Girişi -> Karart -> Açıklamaları Kaldır -> Şifrele -> İndir. + +## İpuçları + +- Seçili düğümü tuvalden kaldırmak için **Delete** veya **Backspace** tuşunu kullanın. +- Bir düğümün durum çubuğundaki **X** düğmesine tıklayarak doğrudan silebilirsiniz. +- Boş alana tıklayıp sürükleyerek tuvali kaydırın. Kaydırma sırasında imleç bir tutma simgesine dönüşür. +- Mobilde, düğüm araç kutusunu açıp kapatmak için araç çubuğundaki **+** düğmesini kullanın. +- İş akışınız birden fazla çıktı dosyası üretirse İndir düğümü bunları otomatik olarak bir ZIP içinde paketler. +- Basit başlayın: karmaşıklık eklemeden önce iki düğümlü bir hat oluşturup test edin. + +## İlgili Araçlar + +- [PDF'den Metne](./pdf-to-text) +- [PDF'den Excel'e](./pdf-to-excel) +- [Görüntüleri Çıkar](./extract-images) +- [PDF'den Markdown'a](./pdf-to-markdown) diff --git a/docs/tr/tools/png-to-pdf.md b/docs/tr/tools/png-to-pdf.md new file mode 100644 index 00000000..707f866d --- /dev/null +++ b/docs/tr/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG'den PDF'ye +description: Bir veya daha fazla PNG görselini, ayarlanabilir kaliteyle tamamen tarayıcınızda bir PDF belgesine dönüştürün. +--- + +# PNG'den PDF'ye + +PNG görsellerini tam çözünürlüklerini koruyarak PDF'ye dönüştürün. Her PNG, özgün görsel boyutlarına uygun boyutta kendi sayfası olur. Saydamlık otomatik olarak işlenir. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------- | +| PNG | `.png` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya PNG dosyalarını sürükleyip bırakın. Aynı anda birkaçını seçebilirsiniz. +2. Dosya listesini yönetin: istemediğiniz dosyaları kaldırın veya daha fazlasını ekleyin. +3. Açılır listeden bir **PDF Kalitesi** düzeyi seçin. +4. **PDF'ye Dönüştür** düğmesine tıklayın. Çıktı `from_jpgs.pdf` olarak iner. + +Araç, her görseli doğrudan gömmek için pdf-lib kullanır. Bir PNG yerel olarak gömülemezse (ör. alışılmadık bir renk profili nedeniyle), bir canvas üzerinden JPEG olarak yeniden işlenmeye geçer. + +## Seçenekler + +**PDF Kalitesi**, gömmeden önce uygulanan sıkıştırmayı denetler: + +- **Yüksek Kalite**: minimum sıkıştırma, en büyük dosya boyutu. +- **Orta Kalite** (varsayılan): boyut ve netlik arasında iyi bir denge. +- **Düşük Kalite**: maksimum sıkıştırma, en küçük çıktı. + +## Kullanım Alanları + +- Hata raporları veya belgeler için ekran görüntülerini çok sayfalı bir PDF'ye dönüştürmek +- Arayüz tasarımı dışa aktarımlarını inceleme için tek bir dosyada paketlemek +- Diyagram dışa aktarımlarını (draw.io, Excalidraw) paylaşılabilir bir PDF'ye çevirmek +- Bir grup grafik görselini bir rapor halinde birleştirmek + +## İpuçları + +- Saydamlık içeren PNG dosyaları PDF'de beyaz arka plan alır. Farklı bir arka plana ihtiyacınız varsa görselleri önceden düzenleyin. +- Keskin kenarlı ve metinli ekran görüntüleri ile diyagramlar için High kalite, JPEG sıkıştırma artefaktlarını önler. Medium veya Low dahili olarak JPEG'e dönüştürebilir. + +## İlgili Araçlar + +- [Görselden PDF'ye](./image-to-pdf) +- [JPG'den PDF'ye](./jpg-to-pdf) +- [SVG'den PDF'ye](./svg-to-pdf) diff --git a/docs/tr/tools/posterize-pdf.md b/docs/tr/tools/posterize-pdf.md new file mode 100644 index 00000000..798e6347 --- /dev/null +++ b/docs/tr/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF'yi Posterleştir +description: PDF sayfalarını, birden fazla kağıda büyük format baskı için daha küçük sayfalardan oluşan bir ızgaraya bölün. +--- + +# PDF'yi Posterleştir + +PDF'nin her sayfasını daha küçük alt sayfalardan oluşan bir ızgaraya bölün. Tek bir sayfayı birden fazla kağıda yazdırıp bir araya getirerek büyük bir poster veya afiş oluşturmak için kullanılan araç budur. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Izgarayı tanımlamak için **satır** ve **sütun** sayısını belirleyin (örn. 2 satır x 2 sütun her sayfayı 4 alt sayfaya böler). +3. İsteğe bağlı olarak, hangi sayfaların bölüneceğini sınırlamak için bir sayfa aralığı belirtin. +4. Önizleme tuvali, kesimleri görebilmeniz için geçerli sayfanın üzerinde bir ızgara katmanı gösterir. +5. Farklı sayfalardaki katmanı kontrol etmek için sayfalar arasında gezinin. +6. İşle düğmesine tıklayın. Her ızgara hücresi, çıktı PDF'inde ayrı bir sayfa olur. + +## Özellikler + +- Esnek ızgara boyutları için yapılandırılabilir satır ve sütun sayısı +- Sayfaların tam olarak nereden bölüneceğini gösteren ızgara katmanlı canlı önizleme +- Yalnızca belirli sayfaları bölmek için sayfa aralığı filtresi +- Önizlemede sayfa sayfa gezinme +- Hızlı önizleme gezinmesi için önbelleğe alınmış sayfa görüntüleri +- Kesikli kırmızı ızgara çizgileri kesim sınırlarını net biçimde işaretler + +## Seçenekler + +| Seçenek | Açıklama | +| ----------------- | ------------------------------------------------ | +| **Satırlar** | Yatay bölme sayısı (varsayılan: 1) | +| **Sütunlar** | Dikey bölme sayısı (varsayılan: 1) | +| **Sayfa aralığı** | Hangi sayfaların bölüneceği (boş = tüm sayfalar) | + +## Kullanım Alanları + +- Poster boyutundaki bir PDF'i standart A4 veya Letter kağıtlara yazdırıp duvarda birleştirmek +- Tek sayfalık bir PDF tasarımından büyük afişler oluşturmak +- Büyük boyutlu teknik çizimleri yazdırılabilir parçalara bölmek +- Geniş format yazıcıya erişim olmadan büyük format baskı yapmak + +## İpuçları + +- 2x2 ızgara bir sayfayı 4 sayfaya, 3x3 ızgara ise 9 sayfaya dönüştürür. Izgarayı, birleştirilmiş son çıktının ne kadar büyük olmasını istediğinize göre planlayın. +- Önizleme katmanı, önemli içeriğin bir kesim çizgisine denk gelmediğini doğrulamanıza yardımcı olur. Gerekirse satır/sütun sayısını değiştirin. +- Ters işlem (birden fazla sayfayı tek kağıda sığdırma) için [N'li PDF](./n-up-pdf) aracını kullanın. + +## İlgili Araçlar + +- [N'li PDF](./n-up-pdf) +- [Sayfaları Böl](./divide-pages) +- [PDF Böl](./split-pdf) diff --git a/docs/tr/tools/powerpoint-to-pdf.md b/docs/tr/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..43719865 --- /dev/null +++ b/docs/tr/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint'ten PDF'ye +description: PowerPoint sunumlarını (PPT, PPTX) ve ODP dosyalarını slayt biçimlendirmesi korunarak PDF'e dönüştürün. +--- + +# PowerPoint'ten PDF'ye + +Sunum dosyalarını PDF'e dönüştürün. Her slayt çıktı belgesinde bir sayfa olur; metin, görseller, şekiller ve geçişler tarayıcı tabanlı bir LibreOffice motoruyla işlenir. Hem modern hem eski PowerPoint biçimlerini, ayrıca OpenDocument Presentation biçimini destekler. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :------------------------ | :-------- | +| PowerPoint (modern) | `.pptx` | +| PowerPoint (eski) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya sunum dosyalarınızı sürükleyip bırakın. +2. Dosya listesini gözden geçirin. Gerektiği gibi dosya ekleyin veya kaldırın. +3. **PDF'e Dönüştür**'e tıklayın. LibreOffice motoru ilk kullanımda yüklenir, ardından her dosyayı dönüştürür. +4. Tek dosya doğrudan PDF olarak iner. Birden fazla dosya `powerpoint-converted.zip` içinde paketlenir. + +## Seçenekler + +Bu aracın ek bir ayarı yoktur. Slaytlar özgün boyutlarında işlenir. + +## Çıktı + +| Girdi Sayısı | Çıktı | +| :----------- | :-------------------------------------------------------------------- | +| 1 dosya | Tek PDF indirmesi (özgün dosya adı, `.pdf` uzantısıyla) | +| 2+ dosya | Her dosya için bir PDF içeren ZIP arşivi (`powerpoint-converted.zip`) | + +## Kullanım Alanları + +- PowerPoint'i olmayabilecek bir kitleyle paylaşmadan önce sunumu PDF'e dönüştürmek +- Konferans veya atölye için slayt gösterisinin yazdırılabilir bir el notu sürümünü oluşturmak +- Sunumları her cihazda aynı görünen bir biçimde arşivlemek +- LibreOffice Impress'ten gelen ODP sunumlarından oluşan bir kitaplığı toplu olarak PDF'e dönüştürmek +- Bir yatırımcı sunumunun e-posta eki olarak PDF sürümünü hazırlamak + +## İpuçları + +- Slayt animasyonları ve geçişler PDF'te yer almaz. Her slayt statik bir sayfa olarak alınır. +- Gömülü videolar çıktıda görünmez. Gerekirse bunları bir ekran görüntüsü veya yer tutucu görselle değiştirin. +- Konuşmacı notları varsayılan PDF dışa aktarımına dahil edilmez. Notlara ihtiyacınız varsa önce PowerPoint'in yerel "Notları Yazdır" görünümünden dışa aktarmayı deneyin. +- LibreOffice motoru ilk yüklemeden sonra önbelleğe alınır, bu yüzden aynı oturumda ikinci bir sunumu dönüştürmek çok daha hızlıdır. + +## İlgili Araçlar + +- [Word'den PDF'ye](./word-to-pdf) +- [Excel'den PDF'ye](./excel-to-pdf) +- [Görselden PDF'ye](./image-to-pdf) diff --git a/docs/tr/tools/prepare-pdf-for-ai.md b/docs/tr/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..0ea58cf0 --- /dev/null +++ b/docs/tr/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: PDF'yi Yapay Zeka için Hazırla +description: PDF içeriğini LLM'ler ve LlamaIndex gibi yapay zeka işlem hatları için optimize edilmiş yapılandırılmış JSON'a çıkarın. Toplu işlemeyi destekler. +--- + +# PDF'yi Yapay Zeka için Hazırla + +PDF dosyalarındaki içeriği çıkarır ve büyük dil modelleri (LLM) ile LlamaIndex gibi yapay zeka çerçeveleri tarafından alınmaya uygun JSON olarak yapılandırır. Her sayfanın içeriği çıkarılır ve RAG işlem hatları, sohbet botları veya anlamsal arama sistemleri için hazır, yapılandırılmış bir biçimde düzenlenir. + +## Nasıl Çalışır + +1. Bırakma alanına tıklayarak veya dosyaları üzerine sürükleyerek bir veya daha fazla PDF yükleyin. +2. İşlemi başlatmak için **Çıkar**'a tıklayın. +3. Tek dosya `filename_llm.json` olarak iner. Birden fazla dosya `pdf-for-ai.zip` arşivi oluşturur. + +Araç, meta verilerle birlikte sayfa düzeyinde içerik çıkarmak için PyMuPDF'in LlamaIndex entegrasyonunu kullanır ve yapay zeka çerçevelerine doğrudan yüklenebilecek çıktı üretir. + +## Seçenekler + +Bu aracın yapılandırılabilir seçeneği yoktur. Tüm sayfalar tam metin ve meta verilerle çıkarılır. + +## Çıktı Biçimi + +- **Tek dosya**: `filename_llm.json` +- **Birden fazla dosya**: Her girdi PDF'i için bir `_llm.json` içeren `pdf-for-ai.zip`. + +JSON çıktısı, sayfa başına metin içeriği ve meta veri alanları içeren LlamaIndex belge şemasını izler. + +## Kullanım Alanları + +- PDF belgelerini bilgi getirme destekli üretim (RAG) işlem hatları için hazırlamak. +- Bir yapay zeka sohbet botu için PDF arşivlerinden aranabilir bir bilgi tabanı oluşturmak. +- PDF raporlarını LLM tabanlı analiz iş akışlarına beslemek. +- Araştırma makalelerini anlamsal arama ve soru-cevap sistemleri için ön işlemden geçirmek. +- PDF belge koleksiyonlarından yapılandırılmış eğitim verisi oluşturmak. + +## İpuçları + +- Yapay zekaya özgü biçimlendirme olmadan düz metin çıkarmak için [PDF'den Metne](./pdf-to-text) aracını kullanın. +- Başlıkları ve yapıyı koruyan Markdown çıktısı için [PDF'den Markdown'a](./pdf-to-markdown) aracını kullanın. +- Taranmış PDF'ler boş veya çok az çıktı üretir. Çıkarma işleminden önce metin katmanı eklemek için OCR'dan geçirin. + +## İlgili Araçlar + +- [PDF'den Metne](./pdf-to-text) +- [PDF'den Markdown'a](./pdf-to-markdown) +- [PDF'den JSON'a](./pdf-to-json) diff --git a/docs/tr/tools/protect-pdf.md b/docs/tr/tools/protect-pdf.md new file mode 100644 index 00000000..58051fe5 --- /dev/null +++ b/docs/tr/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: PDF'yi Şifrele +description: PDF dosyalarını 256 bit AES şifrelemesiyle parola ile koruyun. Yapılandırılabilir kullanım kısıtlamalarıyla kullanıcı ve sahip parolaları belirleyin. +--- + +# PDF'yi Şifrele + +PDF'inizi bir parolanın arkasına kilitleyin, böylece yalnızca yetkili kişiler açabilir. BentoPDF, bankalar ve devlet kurumlarının kullandığı standartla aynı olan 256 bit AES şifrelemesini kullanır ve bunu tamamen tarayıcınızda QPDF aracılığıyla uygular. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Bir **Kullanıcı Parolası** girin (zorunlu). Dosyayı açmak için gereken parola budur. +3. İsteğe bağlı olarak bir **Sahip Parolası** girin. Ayarlandığında PDF, yazdırmayı, düzenlemeyi, kopyalamayı ve not eklemeyi engelleyen kullanım kısıtlamaları kazanır. +4. **PDF'yi Şifrele**'ye tıklayın. +5. Şifrelenmiş dosyayı indirin. + +## Parola Türleri + +### Kullanıcı Parolası (Zorunlu) + +Kullanıcı parolası, alıcıların PDF'i açmak için yazdığı paroladır. Bu parola olmadan belgeye hiçbir şekilde erişilemez. Her şifrelenmiş PDF'in bir kullanıcı parolası olmalıdır. + +### Sahip Parolası (İsteğe Bağlı) + +Sahip parolası, yetkili bir kullanıcının dosyayı açtıktan sonra neler yapabileceğini denetler. Farklı bir sahip parolası belirlediğinizde BentoPDF en sıkı kısıtlama kümesini otomatik olarak uygular: + +- Değiştirme devre dışı +- Çıkarma/kopyalama devre dışı +- Yazdırma devre dışı +- Not ekleme devre dışı +- Form doldurma devre dışı +- Belge birleştirme devre dışı + +Sahip parolasını boş bırakırsanız PDF yine şifrelenir (açmak için hâlâ kullanıcı parolası gerekir) ancak açıldıktan sonra kullanım kısıtlaması olmaz. + +## Şifreleme Ayrıntıları + +- **Algoritma**: AES-256 (256 bit Gelişmiş Şifreleme Standardı) +- **Anahtar uzunluğu**: 256 bit +- **Standart**: PDF 2.0 şifrelemesi (QPDF uygulaması) + +AES-256'nın mevcut teknolojiyle kaba kuvvetle kırılması hesaplama açısından mümkün değildir. Şifrelenmiş PDF'inizin güvenliği tamamen parolanızın gücüne bağlıdır. + +## Kullanım Alanları + +- Gizli finansal raporları e-postayla göndermeden önce korumak +- Karşı tarafın avukatıyla paylaşılan hukuki belgeleri güvence altına almak +- Tıbbi kayıtlara veya kişisel olarak tanımlanabilir bilgilere parola eklemek +- Ücretli içerikleri (e-kitaplar, raporlar) erişim denetimiyle dağıtmak +- Bekleyen veriler için şifreleme gerektiren veri koruma politikalarına uymak + +## İpuçları + +- Güçlü ve benzersiz bir parola kullanın. Büyük/küçük harf, rakam ve sembol içeren 12+ karakterlik bir parola ibaresi idealdir. +- Parolayı ayrı bir kanaldan (telefon, kısa mesaj) paylaşın, asla PDF ile aynı e-postada göndermeyin. +- Açmak için parola gerektirmeden yalnızca işlemleri kısıtlamak istiyorsanız (yazdırma yok, kopyalama yok), bunun yerine İzinleri Değiştir aracını kullanın. + +## İlgili Araçlar + +- [PDF Kilidini Aç](./unlock-pdf): parolayı biliyorsanız şifrelemeyi kaldırın +- [İzinleri Değiştir](./change-permissions): belirli kullanım kısıtlamalarını değiştirin +- [Kısıtlamaları Kaldır](./remove-restrictions): bir PDF'teki tüm güvenlik önlemlerini kaldırın +- [PDF'yi Temizle](./sanitize-pdf): şifrelemeden önce gizli içeriği kaldırın diff --git a/docs/tr/tools/psd-to-pdf.md b/docs/tr/tools/psd-to-pdf.md new file mode 100644 index 00000000..02647b74 --- /dev/null +++ b/docs/tr/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD'den PDF'ye +description: Photoshop (PSD) dosyalarını tarayıcınızda PDF'e dönüştürün. Ücretsiz, gizli, Adobe yazılımı gerekmez. +--- + +# PSD'den PDF'ye + +Adobe Photoshop PSD dosyalarını PDF belgelerine dönüştürün. PSD, Photoshop'un yerel biçimidir ve bir PSD'yi açmak normalde pahalı Adobe yazılımı gerektirir. Bu araç, PSD dosyanızın düzleştirilmiş bileşik görüntüsünü tam çözünürlüklü bir PDF sayfası olarak işler. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :-------------- | :----- | :------------------------------------- | +| Adobe Photoshop | `.psd` | Düzleştirilmiş bileşik görüntüyü işler | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya PSD dosyalarınızı sürükleyip bırakın. Birden fazla dosya desteklenir. +2. Dosya listesini gözden geçirin. İstenmeyen dosyaları çöp kutusu simgesiyle kaldırın veya daha fazla dosya eklemek için **Daha Fazla Dosya Ekle**'yi kullanın. +3. **PDF'e Dönüştür**'e tıklayın. PyMuPDF motoru PSD dosyasını okur ve bileşik görüntüyü özgün çözünürlükte bir PDF sayfasına gömer. +4. Tek bir PSD bir PDF üretir. Birden fazla PSD dosyası yüklediğinizde bunlar, her PSD bir sayfa olacak şekilde `psd_to_pdf.pdf` adlı tek bir çok sayfalı PDF'te birleştirilir. + +## Seçenekler + +Ayar gerekmez. Dönüştürücü, PSD dosyasındaki düzleştirilmiş görüntü verisini kullanır. + +## Kullanım Alanları + +- Photoshop tasarımlarını Photoshop'u açmadan önizlemek +- Adobe Creative Suite'i olmayan müşterilere tasarım provaları göndermek +- PSD dosyalarındaki yüksek çözünürlüklü çalışmaları yazdırmak +- Birden fazla PSD tasarım dosyasından PDF portfolyo oluşturmak: her biri tek belgede bir sayfa olur + +## İpuçları + +- Dönüştürme, PSD'nin bileşik (düzleştirilmiş) görünümünü işler. Tek tek katmanlar, ayarlama katmanları ve katman efektleri PDF'te ayrı öğeler olarak korunmaz. +- Birden fazla PSD dosyası ayrı PDF'ler yerine tek bir çok sayfalı PDF'te birleştirilir. Bu, portfolyo veya lookbook oluşturmak için kullanışlıdır. +- Çok yüksek çözünürlüklü PSD dosyaları (300+ DPI baskı dosyaları) büyük PDF'ler üretir. Araç tam çözünürlüğü korur. + +## İlgili Araçlar + +- [Görselden PDF'ye](./image-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) +- [VSD'den PDF'ye](./vsd-to-pdf) diff --git a/docs/tr/tools/pub-to-pdf.md b/docs/tr/tools/pub-to-pdf.md new file mode 100644 index 00000000..20fd8084 --- /dev/null +++ b/docs/tr/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB'dan PDF'ye +description: Microsoft Publisher (PUB) dosyalarını tarayıcınızda PDF'e dönüştürün. Ücretsiz, gizli, yazılım gerekmez. +--- + +# PUB'dan PDF'ye + +Microsoft Publisher dosyalarını PDF'e dönüştürün. Publisher, Microsoft Office'in bazı sürümleriyle birlikte gelen bir masaüstü yayıncılık aracıdır, ancak çoğu kullanıcıda kurulu değildir. Bu araç, herkesin PUB dosyalarını Microsoft yazılımı gerektirmeden doğrudan tarayıcıda PDF'e dönüştürmesini sağlar. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :------------------ | :----- | :---------------------------- | +| Microsoft Publisher | `.pub` | Masaüstü yayıncılık belgeleri | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya PUB dosyalarınızı sürükleyip bırakın. Aynı anda birden fazla dosya yüklenebilir. +2. Dosya listesini gözden geçirin. İstenmeyen dosyaları çöp kutusu simgesiyle kaldırın veya daha fazlasını eklemek için **Daha Fazla Dosya Ekle**'ye tıklayın. +3. **PDF'e Dönüştür**'e tıklayın. LibreOffice tabanlı bir motor tarayıcıda yüklenir ve düzeni, görselleri ve metin kutularını koruyarak her PUB dosyasını dönüştürür. +4. Tek dosya doğrudan PDF olarak iner. Birden fazla dosya `pub-to-pdf.zip` adlı bir ZIP arşivinde sunulur. + +## Seçenekler + +Ek yapılandırma gerekmez. Dönüştürücü, PUB düzen motorunu otomatik olarak yönetir. + +## Kullanım Alanları + +- Bir müşteriden gelen PUB broşürünü veya bültenini Microsoft Publisher satın almadan açmak +- Publisher'da hazırlanan kilise bültenlerini, etkinlik programlarını veya okul bültenlerini dönüştürmek +- Publisher'daki pazarlama materyallerini herkesin erişebileceği bir biçimde arşivlemek +- PUB dosyalarını Publisher'ın kurulu olmadığı bir sistemde yazdırmak + +## İpuçları + +- Katmanlı metin kutuları ve hassas konumlandırma içeren karmaşık Publisher düzenleri dönüştürme sırasında hafifçe kayabilir. Tam konum önemliyse çıktıyı gözden geçirin. +- LibreOffice motoru oturum başına bir kez başlatılır. İlk dönüştürme daha uzun sürer, sonrakiler daha hızlıdır. +- Publisher dosyalarının en sadık dönüştürülmesi için özgün dosyada kullanılan özel yazı tiplerinin standart sistem yazı tipleri olduğundan emin olun. + +## İlgili Araçlar + +- [VSD'den PDF'ye](./vsd-to-pdf) +- [ODP'den PDF'ye](./odp-to-pdf) diff --git a/docs/tr/tools/rasterize-pdf.md b/docs/tr/tools/rasterize-pdf.md new file mode 100644 index 00000000..60cf967f --- /dev/null +++ b/docs/tr/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF'yi Rasterleştir +description: PDF sayfalarını görsel tabanlı PDF'e dönüştürün. Tüm katmanları düzleştirin, seçilebilir metni kaldırın, DPI ve görsel biçimini denetleyin. +--- + +# PDF'yi Rasterleştir + +Rasterleştirme, bir PDF'in her sayfasını görsele dönüştürür ve bu görselleri yeniden bir PDF'te birleştirir. Sonuç özgün belgeyle aynı görünür ancak seçilebilir metin, etkileşimli öğe veya düzenlenebilir katman içermez. Kısacası yüksek kaliteli bir fotokopidir. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. +2. Rasterleştirilmiş çıktı için **DPI** (çözünürlük) değerini ayarlayın. +3. Bir **Görsel Biçimi** seçin: kayıpsız kalite için PNG, daha küçük dosyalar için JPEG. +4. İsteğe bağlı olarak **Gri Tonlamaya Dönüştür**'ü işaretleyin. +5. **PDF'yi Rasterleştir**'e tıklayın. Birden fazla dosya ZIP olarak iner. + +## Seçenekler + +| Ayar | Değerler | Varsayılan | +| ----------------- | --------------------------------- | ---------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Görsel Biçimi** | PNG (kayıpsız), JPEG (daha küçük) | PNG | +| **Gri tonlama** | Açık/Kapalı | Kapalı | + +## DPI Yönergeleri + +- **72**: Yalnızca ekranda görüntüleme, en küçük dosya boyutu +- **150**: Genel kullanım için iyi bir denge +- **200**: Daha keskin metin, orta dosya boyutu +- **300**: Baskı kalitesinde çıktı +- **600**: Yüksek kaliteli arşivleme veya profesyonel baskı + +## Kullanım Alanları + +- Gizli belgeleri paylaşmadan önce metin çıkarılmasını engellemek +- Metni piksellere dönüştürerek yazı tipi bağımlılığı sorunlarını ortadan kaldırmak +- Karmaşık katmanlar veya saydamlık içeren ve görüntüleyicilere göre farklı işlenen bir PDF'in "düz" sürümünü oluşturmak +- Bir PDF'i yalnızca görsel tabanlı girdi kabul eden bir sisteme hazırlamak +- PDF'i salt görsellere indirgeyerek gizli içeriği (izlenen değişiklikler veya form verileri gibi) temizlemek + +## İpuçları + +- PNG ile 150 DPI sağlam bir varsayılandır. Yalnızca baskı çıktısı gerekiyorsa veya ince ayrıntılara yakınlaşmanız gerekiyorsa daha yükseğe çıkın. +- JPEG belirgin biçimde daha küçük dosyalar üretir ancak keskin metin kenarlarında sıkıştırma artefaktları oluşturur. +- Rasterleştirme geri alınamaz. Daha sonra düzenlenebilir metne ihtiyacınız olabilirse özgün PDF'inizi saklayın. + +## İlgili Araçlar + +- [PDF Sıkıştır](./compress-pdf): rasterleştirilmiş PDF'in dosya boyutunu küçültün +- [Eğrilik Düzelt](./deskew-pdf): taranmış belgeleri rasterleştirmeden önce sayfaları düzeltin +- [Yazı Tipini Ana Hatta Dönüştür](./font-to-outline): ölçeklenebilirliği korumak istiyorsanız yazı tiplerini vektör yollarına dönüştürün +- [PDF'yi Düzleştir](./flatten-pdf): formları görsele dönüştürmeden düzleştirin diff --git a/docs/tr/tools/remove-annotations.md b/docs/tr/tools/remove-annotations.md new file mode 100644 index 00000000..ce1765c9 --- /dev/null +++ b/docs/tr/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Açıklamaları Kaldır +description: PDF'inizdeki tüm yorumları, vurguları, bağlantıları ve diğer açıklamaları tek tıkla temizleyin. +--- + +# Açıklamaları Kaldır + +PDF'inizdeki tüm açıklamaları (yorumlar, vurgular, yapışkan notlar, metin işaretlemeleri, bağlantılar, damgalar ve belgeye gömülü diğer açıklama nesneleri) kaldırarak temizleyin. Sayfanın asıl içeriği (metin, görseller, grafikler) olduğu gibi kalır. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Araç belgenin sayfa sayısını algılar ve dosya bilgilerini gösterir. +3. İşlemek için **Açıklamaları Kaldır**'a tıklayın. +4. Tüm açıklamaları temizlenmiş PDF otomatik olarak iner. + +## Özellikler + +- Tüm açıklama türlerini kaldırır: yorumlar, vurgular, altı çizgiler, üstü çizgiler, yapışkan notlar, damgalar, bağlantılar ve form işaretlemeleri +- Belgedeki her sayfada çalışır +- Açıklama olmayan tüm içeriği korur (metin, görseller, vektör grafikler, form alanları) +- İşlemeden önce sayfa sayısını ve dosya boyutunu gösterir + +## Kullanım Alanları + +- Birden fazla gözden geçirenin yorum eklediği bir inceleme döngüsünden sonra belgeyi son dağıtımdan önce temizlemek +- Paylaşılan bir çalışma kılavuzundan vurgu işaretlerini ve yapışkan notları kaldırmak +- Arşivlemeden önce belgeden bağlantı açıklamalarını temizlemek +- Müzakere sırasında yoğun biçimde not alınmış bir hukuki belgenin "temiz" sürümünü hazırlamak +- Baskıya göndermeden önce bir el yazmasından gözden geçiren yorumlarını kaldırmak + +## İpuçları + +- Bu araç açıklamaları PDF yapısı düzeyinde kaldırır, bu yüzden sonuçta seçilebilir metin ve özgün kalite korunur. Rasterleştirme yoktur. +- Tüm açıklamalar yerine yalnızca belirli açıklamaları kaldırmak istiyorsanız, tek tek açıklamaları seçerek silmek için [PDF Düzenleyici](./edit-pdf) aracını kullanın. +- Düzleştirilmiş PDF'lerdeki (açıklamaların sayfa içeriğiyle birleştirildiği) açıklamalar artık ayrı nesneler olmadıkları için kaldırılamaz. + +## İlgili Araçlar + +- [PDF Düzenleyici](./edit-pdf) +- [Filigran Ekle](./add-watermark) +- [PDF İmzala](./sign-pdf) diff --git a/docs/tr/tools/remove-blank-pages.md b/docs/tr/tools/remove-blank-pages.md new file mode 100644 index 00000000..de2d3bb9 --- /dev/null +++ b/docs/tr/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Boş Sayfaları Kaldır +description: PDF'inizdeki boş veya neredeyse boş sayfaları ayarlanabilir hassasiyetle otomatik olarak algılayın ve kaldırın. +--- + +# Boş Sayfaları Kaldır + +PDF'inizi boş veya neredeyse boş sayfalar için tarayın ve bunları otomatik olarak kaldırın. Araç her sayfayı işler ve boş olup olmadığını belirlemek için piksel içeriğini analiz eder, ardından işlemeden önce hangi sayfaların kaldırılacağını onaylamanıza olanak tanır. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. "Boş" tanımının ne kadar katı olacağını denetlemek için **Hassasiyet** kaydırıcısını ayarlayın. +3. Belgeyi taramak için **Boş Sayfaları Algıla**'ya tıklayın. +4. Araç, gözden geçirebilmeniz için algılanan boş sayfaların küçük resimlerini gösterir. +5. Seçimi onaylayın ve boş sayfaları kaldırılmış temiz PDF'i indirin. + +## Seçenekler + +- **Hassasiyet**: %0 ile %100 arasında bir kaydırıcı (varsayılan %80). Yüksek değerler daha katıdır, yalnızca tamamen veya neredeyse tamamen beyaz sayfaları işaretler. Düşük değerler daha serbesttir, tek bir nokta veya soluk bir filigran gibi çok az içerik barındıran sayfaları da yakalar. + +## Özellikler + +- Boş içeriği algılamak için her sayfanın piksel düzeyinde analizi +- İnce ayar için ayarlanabilir hassasiyet kaydırıcısı +- Elle doğrulama için algılanan boş sayfaların küçük resim önizlemesi +- Boş olmayan tüm sayfaları olduğu gibi korur +- Her boyuttaki ve sayfa sayısındaki belgeleri işler +- Tarama sırasında ilerleme geri bildirimi + +## Kullanım Alanları + +- Tarayıcının tek taraflı özgün belgelerin boş arka yüzlerini yakaladığı taranmış belgeleri temizlemek +- Toplu taranan belge gruplarındaki ayırıcı sayfaları kaldırmak +- Belge yönetim sistemlerinin eklediği boş sayfaları temizlemek +- Bazen sonda boş sayfa içeren, kelime işlemcilerden dışa aktarılmış PDF'leri temizlemek +- Gereksiz boş sayfaları kaldırarak dosya boyutunu küçültmek + +## İpuçları + +- Varsayılan %80 hassasiyetle başlayın ve oradan ayarlayın. Araç size boş görünen sayfaları kaçırıyorsa hassasiyeti düşürün. Tutmak istediğiniz hafif içerikli sayfaları işaretliyorsa yükseltin. +- Araç içeriği analiz etmek için her sayfayı işler, bu yüzden işlem süresi sayfa sayısıyla artar. Çok büyük belgelerde kısa bir bekleme bekleyin. +- Kaldırmayı onaylamadan önce algılanan boş sayfaları küçük resim önizlemesinde gözden geçirin. Soluk üst bilgi, alt bilgi veya filigran içeren sayfalar hassasiyet ayarına bağlı olarak işaretlenebilir. + +## İlgili Araçlar + +- [PDF Kırp](./crop-pdf) +- [PDF Düzenleyici](./edit-pdf) +- [Sayfa Numaraları](./page-numbers) diff --git a/docs/tr/tools/remove-metadata.md b/docs/tr/tools/remove-metadata.md new file mode 100644 index 00000000..f2123b38 --- /dev/null +++ b/docs/tr/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Üst Veriyi Kaldır +description: Yazar, başlık, oluşturma tarihi, üretici, XMP verileri ve belge kimlikleri dahil PDF dosyalarındaki tüm gizli üst verileri temizleyin. +--- + +# Üst Veriyi Kaldır + +Her PDF, kimin oluşturduğunu, hangi yazılımın kullanıldığını, en son ne zaman değiştirildiğini ve daha fazlasını ortaya çıkarabilecek üst veriler taşır. Bu araç bunların tamamını (bilgi sözlüğü, XMP üst veri akışları, belge kimlikleri ve uygulamaya özgü veriler) temizler ve geriye kaynağına dair hiçbir iz bırakmayan temiz bir belge bırakır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. **Üst Veriyi Kaldır**'a tıklayın. +3. Temizlenmiş dosyayı indirin. + +Yapılandırılacak seçenek yoktur. Araç tasarım gereği kapsamlıdır: her şeyi temizler. + +## Neler Kaldırılır + +- **Bilgi sözlüğü alanları**: Başlık, Yazar, Konu, Anahtar Sözcükler, Oluşturan, Üretici, oluşturma tarihi, değiştirme tarihi +- **XMP üst veri akışı**: Belge kataloğunda saklanan XML tabanlı üst veri bloğu +- **Belge kimlikleri**: PDF sonunda (trailer) bulunan ve bir belgeyi sistemler arasında izlemek için kullanılabilen benzersiz tanımlayıcılar +- **PieceInfo**: Illustrator veya InDesign gibi programların eklediği uygulamaya özgü üst veriler + +## Neler Kalır + +- Görünen tüm sayfa içeriği (metin, görseller, grafikler) +- Form alanları ve açıklamalar +- Yer işaretleri ve bağlantılar +- Belge yapısının kendisi + +## Kullanım Alanları + +- Bir belgeyi anonim olarak yayımlamadan önce adınızı ve kurumunuzu kaldırmak +- Belgenin ne zaman hazırlandığını ortaya çıkaran oluşturma zaman damgalarını temizlemek +- PDF yazılım yığınınızı tanımlayan üretici dizelerini temizlemek +- Üst verisiz PDF isteyen resmi başvurular için belgeleri hazırlamak +- Bir belgeyi dışarıyla paylaşmadan önce düzenleme geçmişi izlerini kaldırmak + +## İpuçları + +- Temizlemeden önce PDF'inizin tam olarak hangi üst verileri içerdiğini görmek için önce Üst Veriyi Görüntüle aracını kullanın. +- Üst verilerle birlikte JavaScript'i, açıklamaları ve gömülü dosyaları da kaldırmak istiyorsanız daha kapsamlı bir temizlik için PDF'yi Temizle aracını kullanın. +- Üst veri kaldırma kalıcıdır. Bu verilere daha sonra ihtiyacınız olabilirse özgün dosyanızı saklayın. + +## İlgili Araçlar + +- [PDF'yi Temizle](./sanitize-pdf): üst verilerle birlikte betikleri, ekleri ve daha fazlasını kaldırın +- [PDF'yi Parolayla Koru](./protect-pdf): temizlenmiş PDF'i parolayla koruyun +- [PDF Sıkıştır](./compress-pdf): üst verileri kaldırmak dosya boyutunu biraz küçültebilir, daha fazla tasarruf için sıkıştırın diff --git a/docs/tr/tools/remove-restrictions.md b/docs/tr/tools/remove-restrictions.md new file mode 100644 index 00000000..d20f994c --- /dev/null +++ b/docs/tr/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Kısıtlamaları Kaldır +description: PDF dosyalarından parola korumasını, yazdırma kısıtlamalarını, düzenleme kilitlerini ve kopyalama sınırlarını kaldırın. +--- + +# Kısıtlamaları Kaldır + +PDF'ler iki tür parola taşıyabilir: kullanıcı parolası (dosyayı açmak için gerekir) ve sahip parolası (dosyayla neler yapabileceğinizi denetler). Bu araç her ikisini ve bunlarla ilişkili tüm kısıtlamaları (yazdırma, düzenleme, kopyalama ve not ekleme kilitleri) kaldırır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. PDF'in sahip parolası varsa bunu **Sahip Parolası** alanına girin. PDF'te parola olmadan yalnızca kullanım kısıtlamaları varsa boş bırakın. +3. **Kısıtlamaları Kaldır**'a tıklayın. +4. Kısıtlamasız PDF'i indirin. + +Araç, temiz ve kısıtlamasız bir kopya üretmek için QPDF'in `--decrypt` ve `--remove-restrictions` bayraklarını kullanır. + +## Neler Kaldırılır + +- Parola koruması (hem kullanıcı hem sahip parolaları) +- Yazdırma kısıtlamaları +- Düzenleme kısıtlamaları +- Metin ve görsel kopyalama kısıtlamaları +- Not ekleme ve yorum yapma kısıtlamaları +- PDF'e kodlanmış diğer tüm güvenlik sınırlamaları + +## Kullanım Alanları + +- Sahibi olduğunuz ancak parolasını yıllar önce belirlediğiniz bir PDF'in kilidini açmak +- Meşru erişiminiz olan bir belgeden yazdırma kısıtlamalarını kaldırmak +- Not almak için referans materyallerinde kopyala-yapıştırmayı etkinleştirmek +- PDF'leri, kısıtlı belgeleri işleyemeyen erişilebilirlik araçları için hazırlamak + +## İpuçları + +- Bir sahip parolası ayarlanmışsa bunu bilmeniz gerekir. Bu araç parolaları kırmaz veya kaba kuvvetle denemez. +- Dosyayı şifreli tutup yalnızca belirli izinleri değiştirmek istiyorsanız bunun yerine İzinleri Değiştir aracını kullanın. +- Çıktı dosyasında hiç şifreleme yoktur, yani onu alan herkes serbestçe açabilir. + +## İlgili Araçlar + +- [PDF Kilidini Aç](./unlock-pdf): kullanıcı parolasını biliyorsanız bir PDF'in kilidini açın +- [PDF'yi Parolayla Koru](./protect-pdf): şifrelemeyi yeni ayarlarla yeniden uygulayın +- [İzinleri Değiştir](./change-permissions): hangi işlemlere izin verileceğini seçerek değiştirin diff --git a/docs/tr/tools/repair-pdf.md b/docs/tr/tools/repair-pdf.md new file mode 100644 index 00000000..86026ec2 --- /dev/null +++ b/docs/tr/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: PDF'yi Onar +description: QPDF'in onarım motoruyla bozuk veya hasarlı PDF dosyalarından veri kurtarın. Toplu işlemeyi destekler. +--- + +# PDF'yi Onar + +Bir PDF açılmayı reddettiğinde, bozuk içerik gösterdiğinde veya görüntüleyicinizde hata verdiğinde bu araç iç yapısını yeniden oluşturmayı dener. Birçok bozulma türünden veri kurtarabilen QPDF'in onarım motorunu kullanır: bozuk çapraz başvuru tabloları, kesilmiş akışlar, geçersiz nesne başvuruları ve daha fazlası. + +## Nasıl Çalışır + +1. Hasarlı bir veya daha fazla PDF dosyası yükleyin. +2. **PDF'yi Onar**'a tıklayın. +3. Tek onarılmış dosya doğrudan iner. Birden fazla dosya bir ZIP arşivi oluşturur. + +Araç her dosyayı QPDF'ten `--decrypt` bayrağıyla geçirir; bu, QPDF'in tüm PDF yapısını okuyup yeniden yazmasını sağlayarak kurtarılabilir sorunları düzeltir. + +## Özellikler + +- Tek işlemde birden fazla PDF'in toplu onarımı +- Kurtarılabilir ve kurtarılamaz dosyaların otomatik algılanması +- Birden fazla dosya işlenirken dosya başına başarı/başarısızlık raporu +- Denenmiş bir PDF dönüştürme kitaplığı olan QPDF'i (WebAssembly) kullanır + +## Neleri Düzeltebilir + +- Bozuk veya eksik çapraz başvuru tabloları +- Tamamlanmamış indirmelerden kalan kesilmiş dosya sonları +- Geçersiz nesne numaralandırması ve akış uzunlukları +- Hatalı PDF üreticilerinden kaynaklanan küçük yapısal tutarsızlıklar +- Başarısız şifre çözme girişimlerinden kalan şifreleme artıkları + +## Neleri Düzeltemez + +- İçerik verilerinin çoğunun eksik olduğu ağır biçimde kesilmiş dosyalar +- Sahip olmadığınız bir parolayla şifrelenmiş PDF'ler +- Aslında PDF olmayan dosyalar (yanlış dosya uzantısı) +- PDF içindeki görsel bozulması (yapı düzeltilir ancak piksel verisi yeniden üretilmez) + +## Kullanım Alanları + +- Başarısız bir e-posta indirmesinden bir PDF'i kurtarmak +- Eski veya standart dışı PDF üreticilerinin oluşturduğu dosyaları açmak +- Bir görüntüleyicide çalışıp diğerinde çalışmayan PDF'leri düzeltmek +- Hasarlı arşiv belgelerini uzun vadeli saklamaya hazırlamak + +## İpuçları + +- Onarım başarısız olursa dosyayı önce bir tarayıcıda açmayı deneyin. Tarayıcıların kendi kurtarma mantığı vardır ve yeniden kaydetmeye yetecek kadar içeriği işleyebilir. +- Onarımı başarısız olan şifreli PDF'ler için önce PDF'nin Şifresini Çöz aracını deneyin, ardından şifresi çözülmüş çıktıyı onarın. + +## İlgili Araçlar + +- [PDF Sıkıştır](./compress-pdf): onarılmış PDF'in yapısını daha da temizleyin +- [PDF'yi Doğrusallaştır](./linearize-pdf): onarılmış dosyayı web'de sunum için optimize edin +- [PDF'yi Düzleştir](./flatten-pdf): hasar görmüş olabilecek formları düzleştirin diff --git a/docs/tr/tools/reverse-pages.md b/docs/tr/tools/reverse-pages.md new file mode 100644 index 00000000..2c207566 --- /dev/null +++ b/docs/tr/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Sayfaları Ters Çevir +description: Bir veya daha fazla PDF dosyasının sayfa sırasını, son sayfa ilk sayfa olacak şekilde ters çevirin. +--- + +# Sayfaları Ters Çevir + +Bir PDF'in sayfa sırasını, son sayfa ilk, sondan ikinci sayfa ikinci olacak şekilde ve böyle devam ederek ters çevirin. Birden fazla dosyanın aynı anda toplu işlenmesini destekler. + +## Nasıl Çalışır + +1. Bir veya daha fazla PDF dosyası yükleyin. +2. İşle düğmesine tıklayın. +3. Her dosya bağımsız olarak ters çevrilir. Birden fazla dosya yüklediyseniz çıktı, ters çevrilmiş tüm PDF'leri içeren bir ZIP arşividir. +4. Tek dosya doğrudan ters çevrilmiş PDF olarak iner. + +## Özellikler + +- Toplu işleme: tek işlemde birden fazla PDF'i ters çevirin +- Tek PDF için tek dosya çıktısı, birden fazla için ZIP çıktısı +- İşlemeden önce dosya başına kaldırma düğmeleri +- Tüm sayfa içeriğini ve biçimlendirmeyi korur + +## Kullanım Alanları + +- Ters sırada taranmış bir belgeyi düzeltmek +- Bir sunum PDF'ini sondan başa okunacak şekilde hazırlamak +- Sayfaları ters sırada besleyen belirli yazdırma iş akışları için sayfa sırasını ters çevirmek +- Sayfaları yanlışlıkla ters birleştirilmiş bir belgeyi düzeltmek + +## İpuçları + +- Bir gruptaki her dosya bağımsız olarak ters çevrilir. Dosyaların birbirine göre sırası değişmez. +- Tam ters çevirmenin ötesinde daha ayrıntılı sayfa yeniden sıralaması için [Düzenle ve Çoğalt](./organize-pdf) aracını kullanın. + +## İlgili Araçlar + +- [Düzenle ve Çoğalt](./organize-pdf) +- [PDF'yi Döndür](./rotate-pdf) +- [PDF Çoklu Aracı](./pdf-multi-tool) diff --git a/docs/tr/tools/rotate-custom.md b/docs/tr/tools/rotate-custom.md new file mode 100644 index 00000000..b461f02c --- /dev/null +++ b/docs/tr/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Özel Açıyla Döndür +description: PDF sayfalarını sayfa başına derece girişleri ve toplu döndürme denetimleriyle istediğiniz açıyla döndürün. +--- + +# Özel Açıyla Döndür + +PDF sayfalarını yalnızca 90 derecelik artışlarla değil, istediğiniz herhangi bir açıyla döndürün. Her sayfanın kendi açı girişi vardır ve toplu denetimle tek bir açıyı tüm sayfalara aynı anda uygulayabilirsiniz. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Her sayfa için küçük resimler oluşturulur. +2. Her sayfada, geçerli döndürme açısını gösteren sayısal bir giriş alanı bulunur. +3. Belirli bir sayfayı döndürmek için herhangi bir derece değeri (pozitif veya negatif) yazın veya hızlı 90 derecelik ayarlamalar için sayfa başına sol/sağ düğmelerini kullanın. +4. Tüm sayfalar için tek tip bir döndürme ayarlamak üzere üstteki **toplu açı** girişini kullanın. +5. Döndürülmüş PDF'i oluşturmak için işle düğmesine tıklayın. + +## Özellikler + +- Sayfa başına serbest biçimli derece girişi (herhangi bir tam sayı değeri) +- Aynı döndürmeyi her sayfaya uygulamak için toplu açı denetimi +- Küçük resimlerde döndürmenin gerçek zamanlı önizlemesi +- 90 derecelik artışlar için sayfa başına hızlı döndürme düğmeleri +- Büyük belgelerde performans için tembel yüklenen küçük resimler + +## Kullanım Alanları + +- Birkaç derece eğik taramaları düzeltmek +- Sayfaları standart dışı bir yön gereksinimine uyacak şekilde döndürmek +- Karışık içerikli bir belgedeki tek tek sayfalara hassas döndürmeler uygulamak +- İlk toplu döndürmeden sonra sayfa açılarında ince ayar yapmak + +## İpuçları + +- Pozitif değerler saat yönünde, negatif değerler saat yönünün tersine döndürür. +- Toplu açı alanı uygulandığında tüm sayfa başına açıların üzerine yazar. Gerekirse tek tek ayarlamaları toplu işlemden sonra yapın. +- Daha basit bir arayüzle standart 90/180/270 derecelik döndürmeler için [PDF'yi Döndür](./rotate-pdf) aracını kullanın. + +## İlgili Araçlar + +- [PDF'yi Döndür](./rotate-pdf) +- [PDF Çoklu Aracı](./pdf-multi-tool) +- [Düzenle ve Çoğalt](./organize-pdf) diff --git a/docs/tr/tools/rotate-pdf.md b/docs/tr/tools/rotate-pdf.md new file mode 100644 index 00000000..28838f29 --- /dev/null +++ b/docs/tr/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: PDF'yi Döndür +description: Bir PDF'teki tek tek sayfaları veya tüm sayfaları görsel küçük resim arayüzüyle 90 derecelik artışlarla döndürün. +--- + +# PDF'yi Döndür + +Bir PDF'teki sayfaları saat yönünde veya saat yönünün tersine 90 derece döndürün. Araç her sayfanın küçük resim önizlemesini gösterir; sayfaları tek tek döndürmenize veya tüm belgeye toplu döndürme uygulamanıza olanak tanır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. Her sayfanın küçük resmi bir ızgarada oluşturulur. +2. Belirli bir sayfayı döndürmek için her sayfa küçük resminin altındaki sol/sağ döndürme düğmelerini kullanın. +3. Tüm sayfaları aynı anda döndürmek için üstteki toplu döndürme denetimlerini kullanın. +4. Küçük resim önizlemesi, döndürmeyi göstermek için gerçek zamanlı güncellenir. +5. Döndürülmüş PDF'i kaydetmek için işle düğmesine tıklayın. + +## Özellikler + +- 90 derecelik artışlarla sayfa başına döndürme (sola veya sağa) +- Tüm sayfalar için eş zamanlı toplu döndürme +- Animasyonlu döndürme geçişleriyle gerçek zamanlı küçük resim önizlemesi +- Büyük belgelerde akıcı performans için tembel yüklenen küçük resimler +- Özgün sayfa içeriğini ve kalitesini korur + +## Kullanım Alanları + +- Yan veya ters taranmış sayfaları düzeltmek +- Yatay sayfaları dikey yönlendirmeye (veya tersine) döndürmek +- Bazı sayfaların yanlış açıyla tarandığı karışık yönlü bir belgeyi düzeltmek +- Bir belgeyi belirli bir görüntüleme yönü için hazırlamak + +## İpuçları + +- Döndürmeler birikimlidir. Saat yönü düğmesine iki kez tıklamak 180 derecelik döndürme uygular. +- 90 derece olmayan döndürmeler için (örn. hafif eğik bir taramayı düzeltmek için 45 derece) bunun yerine [Özel Açıyla Döndür](./rotate-custom) aracını kullanın. +- Toplu döndürme denetimleri yalnızca seçili sayfaları değil, tüm sayfaları etkiler. Bu araçta seçim mekanizması yoktur. Bunun için [PDF Çoklu Aracı](./pdf-multi-tool)'nı kullanın. + +## İlgili Araçlar + +- [Özel Açıyla Döndür](./rotate-custom) +- [PDF Çoklu Aracı](./pdf-multi-tool) +- [Düzenle ve Çoğalt](./organize-pdf) diff --git a/docs/tr/tools/rtf-to-pdf.md b/docs/tr/tools/rtf-to-pdf.md new file mode 100644 index 00000000..4beed1fe --- /dev/null +++ b/docs/tr/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF'den PDF'ye +description: Zengin Metin Biçimi (RTF) dosyalarını LibreOffice destekli bir motorla tarayıcınızda PDF'e dönüştürün. +--- + +# RTF'den PDF'ye + +Zengin Metin Biçimi belgelerini PDF'e dönüştürün. RTF, hemen her kelime işlemcinin desteklediği platformlar arası bir belge biçimidir. Bu araç, RTF dosyalarını biçimlendirmeleri bozulmadan işlemek için tarayıcı tabanlı bir LibreOffice motoru kullanır: kalın, italik, tablolar ve gömülü görseller PDF'e aynen aktarılır. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | MIME Türleri | +| :---- | :-------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya bir ya da daha fazla RTF dosyasını sürükleyip bırakın. +2. Dosya listesini gözden geçirin. Gerektiği gibi dosya ekleyin veya kaldırın. +3. **PDF'e Dönüştür**'e tıklayın. LibreOffice motoru ilk kullanımda başlatılır, ardından her dosyayı işler. +4. Tek dosya doğrudan PDF olarak iner. Birden fazla dosya `rtf-converted.zip` olarak sunulur. + +## Seçenekler + +Bu aracın ek bir ayarı yoktur. Dönüştürme, özgün RTF biçimlendirmesini korur. + +## Çıktı + +| Girdi Sayısı | Çıktı | +| :----------- | :------------------------------------------------------------- | +| 1 dosya | Tek PDF indirmesi (örn. `letter.pdf`) | +| 2+ dosya | Her dosya için bir PDF içeren ZIP arşivi (`rtf-converted.zip`) | + +## Kullanım Alanları + +- Eski kelime işlemcilerden kalan RTF belgelerini modern PDF'lere dönüştürmek +- RTF e-posta şablonlarını PDF önizlemelerine çevirmek +- Hukuk veya tıp yazılım sistemlerinin RTF çıktılarını işlemek +- Bir belge yönetim sistemindeki RTF dosyalarını arşivleme için toplu olarak PDF'e dönüştürmek + +## İpuçları + +- LibreOffice motoru bir kez yüklenir ve önbelleğe alınır. Bir oturumdaki ilk dönüştürme birkaç saniye fazla sürer, sonrakiler daha hızlıdır. +- Gömülü OLE nesneleri içeren RTF dosyalarında tüm nesneler kusursuz işlenmeyebilir. Düz metin, görseller ve standart biçimlendirme güvenilir biçimde dönüştürülür. +- RTF dosyalarınız Microsoft Word ile oluşturulduysa, DOC ve DOCX ile birlikte RTF'yi de kabul eden [Word'den PDF'ye](./word-to-pdf) aracıyla doğrudan dönüştürebilirsiniz. + +## İlgili Araçlar + +- [Word'den PDF'ye](./word-to-pdf) +- [ODT'den PDF'ye](./odt-to-pdf) +- [Metinden PDF'ye](./txt-to-pdf) diff --git a/docs/tr/tools/sanitize-pdf.md b/docs/tr/tools/sanitize-pdf.md new file mode 100644 index 00000000..0c2935ac --- /dev/null +++ b/docs/tr/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: PDF'yi Temizle +description: Üst veriler, JavaScript, gömülü dosyalar, açıklamalar ve katmanlar dahil PDF'lerdeki gizli ve potansiyel olarak tehlikeli içeriği kaldırın. +--- + +# PDF'yi Temizle + +PDF'ler ekranda gördüğünüzden çok daha fazlasını taşıyabilir. Gizli üst veriler, gömülü JavaScript, dosya ekleri, form verileri ve katman bilgileri hassas verileri sızdırabilir veya güvenlik riski oluşturabilir. Temizleme bunların tamamını kaldırarak size herkese açık paylaşımda güvenli, temiz bir belge bırakır. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Onay listesinden hangi öğelerin kaldırılacağını seçin. +3. **PDF'yi Temizle**'ye tıklayın. +4. Temizlenmiş dosyayı indirin. + +## Temizleme Seçenekleri + +Tüm seçenekler varsayılan olarak etkindir. Korumak istediklerinizin işaretini kaldırın. + +| Seçenek | Neyi Kaldırır | +| --------------------------- | --------------------------------------------------------------------------- | +| **Formları Düzleştir** | Etkileşimli form alanlarını statik içeriğe dönüştürür | +| **Üst Veriyi Kaldır** | Yazar, başlık, oluşturma tarihi, yazılım bilgisi ve XMP verilerini temizler | +| **Açıklamaları Kaldır** | Yorumları, vurguları, yapışkan notları ve işaretlemeleri siler | +| **JavaScript'i Kaldır** | Açılışta çalışabilecek gömülü betikleri ortadan kaldırır | +| **Gömülü Dosyaları Kaldır** | PDF'e gömülü dosya eklerini temizler | +| **Katmanları Kaldır (OCG)** | İsteğe bağlı içerik gruplarını tek bir katmanda düzleştirir | +| **Bağlantıları Kaldır** | Köprüleri ve URL başvurularını temizler | +| **Yapı Ağacını Kaldır** | Erişilebilirlik etiketleme için kullanılan belge yapısını kaldırır | +| **MarkInfo'yu Kaldır** | İşaretli içerik bilgilerini temizler | +| **Yazı Tiplerini Kaldır** | Gömülü yazı tipi verilerini kaldırır (dikkatli kullanın) | + +## Kullanım Alanları + +- Dahili üst verileri (yazar adları, yazılım sürümleri, düzenleme geçmişi) temizleyerek bir PDF'i herkese açık yayına hazırlamak +- Güvenilmeyen bir kaynaktan gelen PDF'i açmadan önce JavaScript'ini kaldırmak +- Gömülü yorumları veya form alanı adlarını görmemesi gereken bir müşteriye göndermeden önce PDF'i temizlemek +- Nihai sürümü paylaşmadan önce bir mimari çizimden gizli katmanları temizlemek +- Gizlilik düzenlemeleri kapsamındaki veri en aza indirme gereksinimlerine uymak + +## İpuçları + +- PDF'in yine de doğru işleneceğinden emin değilseniz "Yazı Tiplerini Kaldır" seçeneğini işaretlemeyin. Yazı tiplerini kaldırmak bazı görüntüleyicilerde metni görünmez yapabilir. +- Yalnızca üst verileri temizlemeniz gerekiyorsa, özel Üst Veriyi Kaldır aracı daha hızlı ve daha odaklıdır. +- Temizleme geri alınamaz. Özgün dosyanızı saklayın. + +## İlgili Araçlar + +- [Üst Veriyi Kaldır](./remove-metadata): diğer içeriğe dokunmadan yalnızca üst verileri temizleyin +- [PDF'yi Düzleştir](./flatten-pdf): özellikle formları ve açıklamaları düzleştirin +- [PDF'yi Parolayla Koru](./protect-pdf): temizledikten sonra parola koruması ekleyin +- [PDF'yi Rasterleştir](./rasterize-pdf): son çare: tüm gizli içeriği ortadan kaldırmak için görsellere dönüştürün diff --git a/docs/tr/tools/scanner-effect.md b/docs/tr/tools/scanner-effect.md new file mode 100644 index 00000000..3c02e3c2 --- /dev/null +++ b/docs/tr/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Tarayıcı Efekti +description: PDF'inizi ayarlanabilir gürültü, döndürme, bulanıklık ve kağıt eskitme efektleriyle taranmış bir belge gibi gösterin. +--- + +# Tarayıcı Efekti + +Temiz bir dijital PDF'i, düz yataklı tarayıcıdan çıkmış gibi görünen bir belgeye dönüştürün. Araç, fiziksel bir taramanın kusurlarını taklit etmek için yapılandırılabilir gürültü, hafif döndürme, bulanıklık, parlaklık kaymaları ve isteğe bağlı sararma uygular. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Düzenleyici, ayarlar paneliyle birlikte ilk sayfanın canlı önizlemesiyle açılır. +3. Tarama efekti parametrelerini kaydırıcılar ve düğmelerle ayarlayın. +4. Ayarları değiştirdikçe önizleme gerçek zamanlı güncellenir. +5. Tüm sayfaları işlemek ve sonucu indirmek için **Uygula**'ya tıklayın. + +## Seçenekler + +- **Renk uzayı (Gri tonlama düğmesi)**: Klasik siyah beyaz tarama görünümü için çıktıyı gri tonlamaya dönüştürün. +- **Kenarlık**: Tarayıcı kenar artefaktlarını taklit etmek için sayfa kenarlarına ince koyu bir kenarlık ekleyin. +- **Döndür**: Hizasız kağıt beslemesini simüle etmek için hafif bir döndürme (-5 ile +5 derece) uygulayın. +- **Döndürme Varyansı**: Her sayfa biraz farklı eğilsin diye döndürme açısına rastgele değişim ekleyin. +- **Parlaklık**: Genel parlaklığı artırın veya azaltın. +- **Karşıtlık**: Toner kalitesi farklılıklarını simüle etmek için karşıtlığı ayarlayın. +- **Bulanıklık**: Düşük kaliteli bir tarama gibi metin kenarlarını yumuşatmak için Gauss bulanıklığı uygulayın. +- **Gürültü**: Tarayıcı sensörü tanelerini simüle etmek için rastgele piksel gürültüsü ekleyin. Yüksek değerler daha taneli sonuçlar verir. +- **Sarımsı**: Eskimiş veya geri dönüşümlü kağıdı simüle etmek için sıcak bir sarı ton ekleyin. +- **Çözünürlük**: Çıktı DPI değerini belirleyin. Düşük değerler daha pikselli, taramaya benzer bir görünüm oluşturur. +- **Sıfırla**: Tüm ayarları varsayılanlara döndürün. + +## Özellikler + +- Her parametreyi değiştirdikçe güncellenen gerçek zamanlı önizleme +- Gerçekçi değişim için sayfa başına rastgele döndürme varyansı +- Bağımsız olarak ayarlanabilen on parametre +- Gerçekçi siyah beyaz tarama çıktısı için gri tonlama modu +- Düşük DPI faks kalitesinden yüksek DPI arşiv kalitesine çözünürlük denetimi + +## Kullanım Alanları + +- Dijital olarak oluşturulmuş belgelerin taranıp yazdırılmış gibi görünmesini sağlamak +- Tarihi belge yeniden oluşturma için fiziksel belge eskimesini simüle etmek +- OCR yazılımını bozulmuş tarama kalitesine karşı test etmek +- Mevcut taranmış arşivlerin görsel stiliyle eşleşen belgeler üretmek + +## İpuçları + +- Hafif değerlerle başlayın. 10-20 gürültü düzeyi, hafif 0,5 derecelik döndürme ve minimum bulanıklık zaten inandırıcı bir tarama görünümü verir. +- "Fotokopinin fotokopisi" etkisi için gri tonlama modunu hafif sararmayla birleştirin. +- Düşük çözünürlük ayarları (100-150 DPI) en gerçekçi faks makinesi görünümünü oluşturur. + +## İlgili Araçlar + +- [Renkleri Ters Çevir](./invert-colors) +- [Renkleri Ayarla](./adjust-colors) +- [Arka Plan Rengi](./background-color) diff --git a/docs/tr/tools/sign-pdf.md b/docs/tr/tools/sign-pdf.md new file mode 100644 index 00000000..39289cb2 --- /dev/null +++ b/docs/tr/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF İmzala +description: Bir imza çizin, yazın veya yükleyin ve bütünleşik bir görüntüleyiciyle PDF sayfalarınıza yerleştirin. +--- + +# PDF İmzala + +Herhangi bir PDF belgesine imzanızı ekleyin. Araç, imzanızı serbest elle çizebileceğiniz, adınızı imza yazı tipiyle yazabileceğiniz veya bir imza görseli yükleyebileceğiniz yerleşik imza araçlarına sahip tam bir PDF görüntüleyici içerir. İmzaları herhangi bir sayfaya yerleştirip yeniden boyutlandırın, ardından imzalı belgeyi kaydedin. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Belge, açıklama araçlarına sahip bütünleşik bir PDF görüntüleyicide açılır. +3. Çizerek, yazarak veya görsel yükleyerek imzanızı oluşturmak için görüntüleyicinin imza aracını kullanın. +4. İmzayı yerleştirmek istediğiniz sayfa konumuna tıklayın ve boyutunu ve konumunu ayarlayın. +5. İsteğe bağlı olarak imzayı belgeye kalıcı biçimde gömmek için **PDF'yi Düzleştir**'i işaretleyin. +6. İmzalı dosyanızı almak için **Kaydet ve İmzalı PDF'i İndir**'e tıklayın. + +## Seçenekler + +- **PDF'yi Düzleştir**: İşaretlendiğinde imza, sayfa içeriğine kalıcı olarak gömülür. Bu, imzanın başkaları tarafından taşınmasını veya silinmesini önler. İşaretli değilse imza, uyumlu görüntüleyicilerde düzenlenebilen bir açıklama olarak kalır. + +## Özellikler + +- Üç imza oluşturma yöntemi: serbest elle çizim, yazılan metin veya yüklenen görsel +- Doğru yerleştirme için bütünleşik PDF görüntüleyici +- İmzaları herhangi bir sayfada sürükleyerek konumlandırma ve yeniden boyutlandırma +- İmzaları kalıcı olarak gömmek için isteğe bağlı düzleştirme +- Aynı belgede birden fazla imza desteği + +## Kullanım Alanları + +- Sözleşmeleri, anlaşmaları veya onay formlarını geri göndermeden önce imzalamak +- Vergi belgelerine, sigorta taleplerine veya resmi formlara imzanızı eklemek +- Çok sayfalı bir anlaşmanın tek tek sayfalarına paraf atmak +- PDF eki olarak gelen gizlilik sözleşmelerini veya İK belgelerini imzalamak + +## İpuçları + +- İmzalı PDF'i, imzanızı kaldırmaması veya yerini değiştirmemesi gereken birine gönderiyorsanız düzleştirmeyi etkinleştirin. +- Sertifika tabanlı doğrulamaya sahip hukuken bağlayıcı dijital imzalar için BentoPDF ayrıca ayrı bir Dijital İmza aracı sunar. +- En temiz sonuç için arka planı saydam bir PNG imza görseli yükleyin. + +## İlgili Araçlar + +- [PDF Düzenleyici](./edit-pdf) +- [Damga Ekle](./add-stamps) +- [Form Doldurucu](./form-filler) diff --git a/docs/tr/tools/split-pdf.md b/docs/tr/tools/split-pdf.md new file mode 100644 index 00000000..2b80377a --- /dev/null +++ b/docs/tr/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: PDF Böl +description: Bir PDF'i sayfa aralığına, görsel seçime, yer işaretlerine, çift/tek sayfalara veya sabit aralıklara göre daha küçük dosyalara bölün. +--- + +# PDF Böl + +Bir PDF'i altı bölme modundan birini kullanarak daha küçük belgelere ayırın. Basit sayfa aralıklarından yer işaretine dayalı bölmeye kadar bu araç, bir belgeyi bölmenin her senaryosunu karşılar. + +## Nasıl Çalışır + +1. Tek bir PDF dosyası yükleyin. +2. Açılır listeden bir bölme modu seçin. +3. Moda özgü seçenekleri (sayfa aralıkları, seçimler vb.) yapılandırın. +4. İşle düğmesine tıklayın. +5. Sonuç, moda ve ayarlara bağlı olarak tek bir PDF veya bir ZIP arşivi olarak iner. + +## Bölme Modları + +| Mod | Açıklama | +| ------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| **Aralık** | `1-3, 5, 8-10` gibi sayfa aralıkları girin. Birden fazla aralık, ZIP içinde ayrı PDF'ler üretir. Tek aralık bir PDF üretir. | +| **Görsel Seçim** | Sayfa küçük resimlerine göz atın ve istediğiniz sayfaları seçmek için tıklayın. Seçilen sayfalar yeni bir PDF'e çıkarılır. | +| **Çift / Tek** | Yalnızca çift numaralı veya tek numaralı sayfaları çıkarın. | +| **Tüm Sayfalar** | Her sayfayı ayrı bir PDF dosyasına bölün, ZIP olarak indirilir. | +| **Yer İşaretleri** | Yer işareti sınırlarında bölün. Bölmelerin nerede yapılacağını denetlemek için yer işareti düzeyini seçin. | +| **Her N Sayfada** | Her biri N sayfalık parçalara bölün (örn. her 5 sayfada). Son parça daha az sayfa içerebilir. | + +## Özellikler + +- Hemen her kullanım senaryosunu kapsayan altı farklı bölme modu +- Tembel yüklenen küçük resimlere sahip görsel sayfa seçici +- Düzey filtrelemeli, yer işaretini dikkate alan bölme +- Aralık ve görsel modlar için ZIP çıktı seçeneği +- Karışık söz dizimli sayfa aralıklarını işler (`1-3, 5, 8-10`) +- N sayfalık bölmeler eşit olmayan parçalarla sonuçlandığında uyarı + +## Kullanım Alanları + +- Büyük bir belgeden belirli bir bölümü veya kısmı çıkarmak +- Çift taraflı yazdırma iş akışları için tek ve çift sayfaları ayırmak +- Bir kitap PDF'ini yer işareti sınırlarında tek tek bölüm dosyalarına ayırmak +- Bir sözleşmeden belirli sayfaları (imza sayfası gibi) ayırmak +- Derlenmiş bir raporu dağıtım için bölüm başına dosyalara bölmek + +## İpuçları + +- Virgülle ayrılmış birden fazla sayfa aralığı (örn. `1-5, 10-15, 20-25`), her aralık için bir tane olmak üzere ZIP içinde paketlenmiş ayrı PDF'ler üretir. +- Yer işareti bölme modu, PDF'in gerçekten yer işareti içermesini gerektirir. Hiç bulunamazsa bir hata mesajı alırsınız. +- Aralık ve Görsel modlardaki "ZIP olarak indir" kutusu, birleşik bir dosya yerine sayfa başına ayrı PDF'ler almanızı sağlar. + +## İlgili Araçlar + +- [PDF Birleştir](./merge-pdf) +- [Sayfaları Çıkar](./extract-pages) +- [Sayfaları Sil](./delete-pages) +- [PDF Çoklu Aracı](./pdf-multi-tool) diff --git a/docs/tr/tools/svg-to-pdf.md b/docs/tr/tools/svg-to-pdf.md new file mode 100644 index 00000000..4316b91c --- /dev/null +++ b/docs/tr/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG'den PDF'ye +description: SVG vektör grafiklerini kalite denetimiyle tamamen tarayıcınızda PDF'e dönüştürün. +--- + +# SVG'den PDF'ye + +Ölçeklenebilir Vektör Grafiği (SVG) dosyalarını PDF'e dönüştürün. Araç her SVG'yi tarayıcının işleme motoruyla rasterleştirir, ardından sonucu özgün çözünürlüğünde gömer. Vektör simgeleri, diyagramları ve çizimleri taşınabilir belgelere dönüştürmek için kullanışlıdır. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------- | +| SVG | `.svg` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya bir ya da daha fazla SVG dosyasını sürükleyip bırakın. +2. Dosya listesini gözden geçirin ve yönetin. +3. Bir **PDF Kalitesi** düzeyi seçin. +4. **PDF'e Dönüştür**'e tıklayın. Sonuç `from_svgs.pdf` olarak iner. + +Her SVG metin olarak okunur, kendi iç genişliği ve yüksekliğinde (boyut belirtilmemişse varsayılan 800x600) bir tuvale işlenir ve PNG olarak dışa aktarılır. Ardından bu PNG, pdf-lib kullanılarak PDF'e gömülür. Saydam alanlar beyaz arka planla doldurulur. + +## Seçenekler + +**PDF Kalitesi**, rasterleştirmeden sonraki sıkıştırmayı denetler: + +- **Yüksek Kalite**: özgün işlemeye en yakın. +- **Orta Kalite** (varsayılan): iyi bir denge. +- **Düşük Kalite**: en küçük dosya, bir miktar ayrıntı kaybı. + +## Kullanım Alanları + +- Mimari veya mühendislik diyagramlarını SVG'den baskıya hazır PDF'e dönüştürmek +- Simge setlerini bir tasarım sistemi için başvuru PDF'inde paketlemek +- Veri görselleştirmelerini (D3.js, grafik kitaplığı dışa aktarımları) rapora hazır PDF'lere dönüştürmek +- SVG tabanlı infografiklerin yazdırılabilir sürümlerini oluşturmak + +## İpuçları + +- Açık `width` ve `height` öznitelikleri olmayan SVG dosyaları 800x600 piksel olarak işlenir. En iyi sonuç için dönüştürmeden önce SVG kaynağında boyutları belirleyin. +- Harici yazı tipi başvuruları veya bağlı görseller içeren karmaşık SVG'ler kusursuz işlenmeyebilir. Güvenilir çıktı için tüm varlıkları SVG içine gömün. +- SVG rasterleştirildiği için PDF, vektör yolları yerine bir bitmap görsel içerir. Gerçek vektör PDF çıktısı için özel bir vektör aracı gerekir. + +## İlgili Araçlar + +- [Görselden PDF'ye](./image-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) +- [BMP'den PDF'ye](./bmp-to-pdf) diff --git a/docs/tr/tools/table-of-contents.md b/docs/tr/tools/table-of-contents.md new file mode 100644 index 00000000..af1bba57 --- /dev/null +++ b/docs/tr/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: İçindekiler +description: PDF'inizdeki mevcut yer işaretlerinden biçimlendirilmiş bir içindekiler sayfası oluşturun. +--- + +# İçindekiler + +Bu araç PDF'inizdeki yer işaretlerini (ana hatları) okur ve belgenin başına eklenen biçimlendirilmiş bir içindekiler sayfası oluşturur. PDF'inizde zaten yer işaretleri varsa ancak görünür bir içindekiler sayfası yoksa bu araç otomatik olarak bir tane oluşturur. + +## Nasıl Çalışır + +1. Yer işaretleri içeren bir PDF yükleyin. +2. İçindekiler başlığını, yazı tipi boyutunu ve yazı tipi ailesini özelleştirin. +3. İsteğe bağlı olarak içindekilerin kendisini yer işareti ağacına dahil etmek için **İçindekiler sayfası için yer işareti ekle**'yi işaretleyin. +4. Dosyayı işlemek için **İçindekiler Oluştur**'a tıklayın. +5. Güncellenmiş PDF, içindekiler sayfası başa eklenmiş olarak otomatik iner. + +## Seçenekler + +- **İçindekiler Başlığı**: Oluşturulan sayfanın en üstünde görüntülenen başlık. Varsayılan "İçindekiler"dir. +- **Yazı Tipi Boyutu**: 10 pt ile 72 pt arasında seçin. Varsayılan 12 pt'dir. +- **Yazı Tipi Ailesi**: Times Roman, Helvetica veya Courier varyantları arasından seçin (normal, kalın, italik, kalın italik). Varsayılan Helvetica'dır. +- **İçindekiler sayfası için yer işareti ekle**: İşaretlendiğinde, içindekiler sayfasının kendisi için PDF'in ana hat ağacına bir yer işareti girdisi eklenir. + +## Özellikler + +- PDF'teki yer işareti hiyerarşisinin tamamını okur +- Sayfa numarası başvurularıyla düzgün biçimlendirilmiş bir içindekiler sayfası oluşturur +- Girintili iç içe yer işareti düzeylerini destekler +- 12 yerleşik PDF yazı tipi arasından seçim +- İçindekiler sayfası için isteğe bağlı kendine başvuran yer işareti + +## Kullanım Alanları + +- Yalnızca dijital yer işaretleri olan e-kitaplara veya raporlara yazdırılabilir bir içindekiler eklemek +- Birden fazla PDF birleştirildikten sonra birleşik belge için içindekiler oluşturmak +- Uzun teknik kılavuzlar için bir başvuru sayfası oluşturmak +- Görünür bir içindekilerin beklendiği belgeleri baskıya hazırlamak + +## İpuçları + +- PDF'inizde yer işareti yoksa önce bunları oluşturmak için [Yer İşaretlerini Düzenle](./bookmark) aracını kullanın, ardından içindekileri oluşturmak için buraya dönün. +- Büyük belgelerde 14 pt veya 16 pt gibi daha büyük bir yazı tipi boyutu okunabilirliği artırır. + +## İlgili Araçlar + +- [Yer İşaretlerini Düzenle](./bookmark) +- [Sayfa Numaraları](./page-numbers) +- [Üst Bilgi & Alt Bilgi](./header-footer) diff --git a/docs/tr/tools/text-color.md b/docs/tr/tools/text-color.md new file mode 100644 index 00000000..55c323de --- /dev/null +++ b/docs/tr/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Metin Rengini Değiştir +description: PDF'inizdeki tüm metnin rengini seçtiğiniz herhangi bir renge değiştirin. +--- + +# Metin Rengini Değiştir + +PDF'inizdeki metnin rengini baştan sona değiştirin. Araç her sayfadaki metin bölgelerini belirler ve belge düzenini ve metin olmayan içeriği koruyarak bunları seçtiğiniz renge boyar. + +## Nasıl Çalışır + +1. PDF dosyanızı yükleyin. +2. Renk seçiciyle yeni bir metin rengi seçin. Varsayılan mavidir (#0000FF). +3. İşlemek için **Metin Rengini Değiştir**'e tıklayın. +4. Yeniden renklendirilmiş PDF otomatik olarak iner. Bir ilerleme göstergesi hangi sayfanın işlendiğini gösterir. + +## Seçenekler + +- **Yeni Metin Rengi**: Belgedeki tüm metin için yeni rengi seçmeye yarayan bir renk seçici. + +## Özellikler + +- Belgedeki her sayfanın metnini yeniden renklendirir +- İlerleme geri bildirimiyle sayfa başına işleme +- Tam onaltılık renk desteğine sahip renk seçici +- Sayfa düzenini ve metin olmayan öğeleri korur + +## Kullanım Alanları + +- Daha yumuşak ve modern bir belge görünümü için siyah metni koyu maviye çevirmek +- Belgeleri dağıtmadan önce metni marka yönergelerine uyacak şekilde yeniden renklendirmek +- Erişilebilirlik uyumluluğu için metni belirli bir renge dönüştürmek +- Yeni uygulanan bir arka plan rengine karşı metni görünür kılmak + +## İpuçları + +- Bu araç kalite için sayfaları 2x ölçekte işler, ardından PDF'i yeniden oluşturur. Çıktı görsel tabanlıdır, bu yüzden metin artık seçilemez veya aranamaz. +- Seçilebilir metni korumanız gereken belgelerde, bunun yerine PDF'i doğrudan [PDF Düzenleyici](./edit-pdf) ile düzenlemeyi düşünün. +- Her sayfa ayrı ayrı işlendiği için işlem süresi sayfa sayısıyla artar. + +## İlgili Araçlar + +- [Arka Plan Rengi](./background-color) +- [Renkleri Ters Çevir](./invert-colors) +- [Renkleri Ayarla](./adjust-colors) diff --git a/docs/tr/tools/tiff-to-pdf.md b/docs/tr/tools/tiff-to-pdf.md new file mode 100644 index 00000000..1e781fd2 --- /dev/null +++ b/docs/tr/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF'den PDF'ye +description: Tek ve çok sayfalı TIFF görsellerini tam sayfa desteğiyle tarayıcınızda PDF biçimine dönüştürün. +--- + +# TIFF'den PDF'ye + +TIFF dosyalarını, çok sayfalı TIFF'ler dahil, PDF'e dönüştürün. Bir TIFF dosyasındaki her sayfa (veya "IFD") çıktı PDF'inde ayrı bir sayfa olur. Bu, genellikle çok sayfalı TIFF olarak saklanan taranmış belgeler, fakslar ve tıbbi görüntüler için özellikle kullanışlıdır. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya TIFF dosyalarınızı sürükleyip bırakın. +2. Dosya listesini gözden geçirin ve gerektiği gibi yönetin. +3. **PDF'e Dönüştür**'e tıklayın. Sonuç `from_tiff.pdf` olarak iner. + +Araç her TIFF dosyasını bir JavaScript TIFF çözücüsüyle çözerek her sayfanın ham RGBA piksel verisini çıkarır. Her sayfa bir tuvale işlenir, PNG olarak dışa aktarılır ve PDF'e gömülür. Sayfa boyutları özgün TIFF sayfalarıyla eşleşir. + +## Seçenekler + +Bu araç ek kalite ayarı sunmaz. Görseller özgün çözünürlüklerinde gömülür. + +## Kullanım Alanları + +- Çok sayfalı faks belgelerini (TIFF-F) daha taşınabilir bir PDF biçimine dönüştürmek +- TIFF olarak saklanan taranmış belge arşivlerini aranabilir PDF'lere çevirmek (sonrasında OCR aracıyla birleştirin) +- TIFF kullanan tıbbi görüntüleme dosyalarını (patoloji lamları, radyoloji dışa aktarımları) işlemek +- CBS veya uydu görüntüsü TIFF dosyalarını paylaşılabilir belgelere dönüştürmek + +## İpuçları + +- Çok sayfalı TIFF'ler tam olarak desteklenir. 10 sayfalık bir TIFF, 10 sayfalık bir PDF üretir. TIFF'i önce bölmeniz gerekmez. +- Çok büyük TIFF dosyalarının (yüzlerce megabayt) işlenmesi daha uzun sürebilir, çünkü dosyanın tamamı tarayıcı belleğinde çözülmelidir. +- Elde edilen PDF üzerinde OCR gerekiyorsa, dönüştürmeden sonra [PDF'de OCR](./ocr-pdf) aracından geçirin. + +## İlgili Araçlar + +- [Görselden PDF'ye](./image-to-pdf) +- [BMP'den PDF'ye](./bmp-to-pdf) +- [JPG'den PDF'ye](./jpg-to-pdf) diff --git a/docs/tr/tools/txt-to-pdf.md b/docs/tr/tools/txt-to-pdf.md new file mode 100644 index 00000000..e9851261 --- /dev/null +++ b/docs/tr/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Metinden PDF'ye +description: Düz metin dosyalarını veya yazılan metni özel yazı tipleri, renkler ve sayfa boyutlarıyla PDF'e dönüştürün. +--- + +# Metinden PDF'ye + +Düz metni biçimlendirilmiş bir PDF'e dönüştürün. `.txt` dosyaları yükleyebilir veya doğrudan yerleşik metin düzenleyiciye yazabilirsiniz. Araç birden fazla yazı tipini, özel metin renklerini ve A0'dan A10'a, ayrıca US Letter, Legal ve Tabloid dahil geniş bir sayfa boyutu yelpazesini destekler. + +## Desteklenen Biçimler + +| Girdi | Uzantılar | +| :-------------------- | :---------------------------------- | +| Düz metin dosyaları | `.txt` | +| Doğrudan metin girişi | Düzenleyiciye yazın veya yapıştırın | + +## Nasıl Çalışır + +1. Üstteki düğmeyi kullanarak girdi modunuzu seçin: **Dosya Yükle** veya **Metin Yaz**. +2. Yüklüyorsanız bir veya daha fazla `.txt` dosyasını sürükleyip bırakın ya da seçmek için tıklayın. Yazıyorsanız metninizi doğrudan metin alanına girin. +3. Biçimlendirme seçeneklerini yapılandırın: yazı tipi ailesi, yazı tipi boyutu, metin rengi ve sayfa boyutu. +4. **PDF Oluştur**'a tıklayın. Çıktı `text_to_pdf.pdf` olarak iner. + +Birden fazla dosya yüklerken içerikleri aralarına boş satırlar konularak birleştirilir. + +## Seçenekler + +| Seçenek | Değerler | Varsayılan | +| :------------------- | :------------------------------------------------------------------------------- | :-------------- | +| **Yazı Tipi Ailesi** | Helvetica (tırnaksız), Tiro (tırnaklı), Courier (tek aralıklı), Times (tırnaklı) | Helvetica | +| **Yazı Tipi Boyutu** | 6 - 72 pt | 12 | +| **Metin Rengi** | Renk seçiciyle herhangi bir renk | Siyah (#000000) | +| **Sayfa Boyutu** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Sağdan sola yazılan diller (Arapça, İbranice, Farsça, Urduca) otomatik olarak algılanır. Sağdan sola metin bulunduğunda metin yönü ve hizalama buna göre değişir. + +## Kullanım Alanları + +- Kod parçacıklarını veya günlük dosyalarını Courier yazı tipiyle yazdırılabilir bir PDF'e dönüştürmek +- Anında yazılan toplantı notlarından hızlıca bir PDF oluşturmak +- Düz metin bir el yazmasını teslim için belirli bir yazı tipi ve sayfa boyutuyla biçimlendirmek +- Bir README veya değişiklik günlüğünün çevrimdışı dağıtım için PDF sürümünü oluşturmak + +## İpuçları + +- Pano içeriğini önce dosya olarak kaydetmeden hızlıca dönüştürmek istediğinizde **Metin Yaz** modunu kullanın. +- Courier (tek aralıklı), kod, günlük veya sütun hizasının önemli olduğu her içerik için en iyi yazı tipi seçimidir. +- Sayfa kenar boşlukları her tarafta 72 punto (1 inç) olarak sabittir. + +## İlgili Araçlar + +- [Markdown'dan PDF'ye](./markdown-to-pdf) +- [CSV'den PDF'ye](./csv-to-pdf) +- [Word'den PDF'ye](./word-to-pdf) diff --git a/docs/tr/tools/unlock-pdf.md b/docs/tr/tools/unlock-pdf.md new file mode 100644 index 00000000..76b46772 --- /dev/null +++ b/docs/tr/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF'nin Şifresini Çöz +description: Şifreli PDF'lerin parola korumasını kaldırın. Birden fazla dosya için tek parolayla toplu şifre çözmeyi destekler. +--- + +# PDF'nin Şifresini Çöz + +Şifreli bir PDF'nin parolasına sahipseniz, bu araç şifrelemeyi tamamen kaldırır ve herkesin kimlik bilgisi olmadan açabileceği, kilidi açılmış bir kopya üretir. Birden fazla PDF aynı parolayı paylaşıyorsa toplu şifre çözmeyi destekler. + +## Nasıl Çalışır + +1. Şifreli bir veya daha fazla PDF dosyası yükleyin. +2. Dosyaları korumak için kullanılan **parolayı** girin. +3. **PDF Şifresini Çöz** düğmesine tıklayın. +4. Tek dosya doğrudan indirilir. Birden fazla dosya, kilidi açılmış tüm PDF'leri içeren bir ZIP arşivi olarak indirilir. + +## Özellikler + +- Tek dosya ve toplu şifre çözme +- Hem kullanıcı parolalarını hem de sahip parolalarını destekler +- Kalıntı kısıtlama içermeyen, tamamen şifresiz çıktı üretir +- Yanlış parola veya bozuk dosyalar için net hata bildirimi +- Toplu modda dosya başına başarı/hata takibi + +## Kısıtlamaları Kaldır Aracından Farkı + +**PDF Şifresini Çöz** parola gerektirir ve tüm şifrelemeyi kaldırır. **Kısıtlamaları Kaldır** ise kullanım kısıtlamalarını (yazdırma, kopyalama, düzenleme) hedefler ve yalnızca sahip parolası belirlenmişse parola gerektirmeyebilir. PDF parola olmadan hiç açılmıyorsa Şifre Çöz'ü kullanın. + +## Kullanım Alanları + +- Daha önce şifrelediğiniz ve artık parolaya ihtiyaç duymadığınız PDF'lerin kilidini kalıcı olarak açmak +- Arşivlenmiş bir belge grubunun şifrelemesini, uzun vadede daha kolay erişim için kaldırmak +- Parola korumalı PDF'leri, şifreli dosyaları desteklemeyen bir belge yönetim sistemine hazırlamak +- PDF'leri diğer belgelerle birleştirmeden önce kilidini açmak (birçok birleştirme aracı şifreli girdiyi işleyemez) + +## İpuçları + +- Parola alanı yüklenen tüm dosyalara uygulanır. PDF'lerinizin parolaları farklıysa onları ayrı gruplar halinde işleyin. +- "Yanlış Parola" hatası alırsanız sondaki boşlukları ve Caps Lock durumunu kontrol edin. +- Şifre çözüldükten sonra çıktıda hiçbir güvenlik kalmaz. Yeni bir parola uygulamak istiyorsanız PDF Şifrele ile yeniden şifreleyin. + +## İlgili Araçlar + +- [PDF'yi Parolayla Koru](./protect-pdf): yeni bir parolayla şifrelemeyi yeniden uygulayın +- [Kısıtlamaları Kaldır](./remove-restrictions): tam şifre çözme olmadan kullanım kısıtlamalarını kaldırın +- [İzinleri Değiştir](./change-permissions): şifreli bir PDF'nin belirli izinlerini değiştirin diff --git a/docs/tr/tools/validate-signature-pdf.md b/docs/tr/tools/validate-signature-pdf.md new file mode 100644 index 00000000..7b5817fa --- /dev/null +++ b/docs/tr/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: İmzayı Doğrula +description: PDF dosyalarındaki dijital imzaları doğrulayın. Sertifika geçerliliğini, imzalayan kimliğini, belge bütünlüğünü ve güven zinciri durumunu kontrol edin. +--- + +# İmzayı Doğrula + +İmzalı bir PDF yükleyin; bu araç her dijital imzayı çıkarır, imzalayanı belirler, sertifika geçerliliğini kontrol eder ve belgenin imzalandıktan sonra değiştirilip değiştirilmediğini bildirir. İmza zincirini doğrulamak için güvenilir bir sertifika da sağlayabilirsiniz. + +## Nasıl Çalışır + +1. İmzalı bir PDF dosyası yükleyin. Doğrulama otomatik olarak başlar. +2. Araç bir özet gösterir: bulunan imza sayısı ve kaçının geçerli olduğu. +3. Her imza için imzalayan adı, düzenleyen, tarihler ve durumu gösteren ayrıntılı bir kart görüntülenir. +4. İsteğe bağlı olarak, imzayı belirli bir güven çapasına karşı doğrulamak için bir **güvenilir sertifika** (.pem, .crt, .cer, .der) yükleyin. Yeniden doğrulama otomatik olarak çalışır. + +## Neler Kontrol Edilir + +### İmza Ayrıştırma + +Araç, PDF'den PKCS#7 imza nesnelerini çıkarır, ASN.1 yapısını çözer ve imzalayanın X.509 sertifikasını, imzaya gömülü sertifika zinciriyle birlikte alır. + +### Sertifika Geçerliliği + +- **Son kullanma tarihi**: Sertifika şu anda geçerlilik tarih aralığında mı? +- **Kendinden imzalı algılama**: Sertifika kendi düzenleyicisi mi? +- **Güven zinciri**: Güvenilir bir sertifika sağlandığında, imzalayanın sertifikası ona kadar uzanan bir zincire sahip mi? + +### Kriptografik Doğrulama + +- Araç, imzanın `/ByteRange` değerinin kapsadığı baytları yeniden oluşturur, imzalayanın belirttiği algoritmayla özetini çıkarır ve sonucu imza içindeki `messageDigest` özniteliğiyle karşılaştırır. +- Ardından imzalı öznitelikleri DER SET olarak yeniden serileştirir ve imzayı, imzalayan sertifikanın açık anahtarına karşı doğrular. +- **Bir imza yalnızca bunların hepsi geçtiğinde geçerli olarak bildirilir.** PDF baytları imzalandıktan sonra değiştirildiyse veya gömülü imza imzalayanın anahtarıyla eşleşmiyorsa, durum belirli nedenle birlikte "Geçersiz: Kriptografik Doğrulama Başarısız" olarak görünür. + +#### Desteklenen İmza Algoritmaları + +| Algoritma | Doğrulama yolu | +| ----------------------- | ----------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, Web Crypto yedeğiyle | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | DER → IEEE P1363 imza dönüşümünden sonra Web Crypto `verify({name: 'ECDSA', hash})` | + +Bir imza bu listenin dışında bir algoritma kullanıyorsa (örneğin Ed25519, SM2 veya alışılmadık bir özet OID'sine sahip RSA), kart sarı renkte **"Doğrulanmadı: Desteklenmeyen İmza Algoritması"** ifadesini ve belirli OID'yi veya nedeni gösterir. Bu kasıtlı bir üç durumlu ayrımdır: + +- **Geçerli**: imza, imzalayanın açık anahtarına karşı kriptografik olarak doğrulandı. +- **Geçersiz**: doğrulama çalıştı ve olumsuz sonuç verdi (baytlar değişti, anahtar uyuşmuyor). +- **Doğrulanmadı**: araç bu algoritma için doğrulamayı çalıştıramadı. Sertifika meta verileri yine gösterilir, ancak imzayı "bilinmiyor" olarak değerlendirmeli ve Adobe Acrobat veya `openssl cms -verify` ile doğrulamalısınız. + +### Güvensiz Özet Algoritmaları + +- **MD5 veya SHA-1** kullanan imzalar geçersiz olarak reddedilir ve "Güvensiz Özet" durumuyla işaretlenir. Her iki algoritmanın da yayımlanmış çakışma saldırıları vardır, bu nedenle SHA-1 veya MD5 özeti üzerindeki bir imza bütünlük garantisi vermez. +- SHA-224, SHA-256, SHA-384 ve SHA-512 kabul edilir. + +### Belge Kapsamı + +- **Tam kapsam**: İmza PDF dosyasının tamamını kapsar, yani imzalandıktan sonra hiçbir bayt eklenmemiş veya değiştirilmemiştir. +- **Kısmi kapsam**: İmza dosyanın yalnızca bir bölümünü kapsar. Bu, imzalandıktan sonra değişiklik yapıldığını gösterebilir (zararlı olması gerekmez, artımlı kayıtlar kısmi kapsam üretir). + +## İmza Ayrıntıları + +Her imza kartında şunlar gösterilir: + +- **İmzalayan**: İmzalayanın sertifikasındaki ortak ad, kuruluş ve e-posta +- **Düzenleyen**: İmzalayanın sertifikasını veren Sertifika Yetkilisi +- **İmza Tarihi**: İmzaya gömülü zaman damgası +- **Geçerlilik Başlangıcı / Bitişi**: Sertifikanın geçerlilik süresi +- **Neden**: Belgenin neden imzalandığı (belirtilmişse) +- **Konum**: Nerede imzalandığı (belirtilmişse) +- **Kapsam Durumu**: Tam veya Kısmi +- **Güven Rozeti**: Güvenilir veya Güven zincirinde değil (yalnızca özel bir sertifika sağlandığında) + +### Teknik Ayrıntılar + +Şunlar için teknik ayrıntılar bölümünü genişletin: + +- İmzalayanın sertifikasının seri numarası +- Özet algoritması (SHA-256, SHA-512 vb.) +- İmza algoritması (SHA-256 ile RSA, SHA-256 ile ECDSA vb.) +- Geçersiz imzalar için hata iletileri + +## Kullanım Alanları + +- Karşı imza atmadan önce dijital olarak imzalanmış bir sözleşmeyi doğrulamak +- İmzalı belgelerin üzerinde oynanmadığını doğrulamak için denetlemek +- Bir sertifikanın belge imzalandıktan sonra süresinin dolup dolmadığını kontrol etmek +- İmzaları kurumunuzun kök sertifikasına karşı doğrulamak +- Resmi veya hukuki belgelerin imza ayrıntılarını incelemek + +## İpuçları + +- Kendinden imzalı bir sertifika imzanın geçersiz olduğu anlamına gelmez, imzalayanın kimliğinin güvenilir bir üçüncü taraf aracılığıyla doğrulanamadığı anlamına gelir. Bu, iç belgelerde yaygındır. +- Kısmi kapsam her zaman kurcalama anlamına gelmez. Birçok PDF iş akışı (ikinci bir imza gibi) kısmi kapsam oluşturan artımlı güncellemeler ekler. +- Güven zinciri doğrulaması almak için kurumunuzun kök veya ara sertifikasını güvenilir sertifika olarak yükleyin. + +## İlgili Araçlar + +- [Dijital İmza](./digital-sign-pdf): PDF'leri kendi sertifikanızla imzalayın +- [PDF'yi Düzleştir](./flatten-pdf): imza sonrası değişiklikleri önlemek için imzalamadan önce PDF'yi düzleştirin +- [Meta Verileri Kaldır](./remove-metadata): imza uygulamadan önce bir PDF'yi temizleyin diff --git a/docs/tr/tools/view-metadata.md b/docs/tr/tools/view-metadata.md new file mode 100644 index 00000000..d88b1cdb --- /dev/null +++ b/docs/tr/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Üst Veriyi Görüntüle +description: Belge bilgileri, XMP verileri ve yapısal ayrıntılar dahil bir PDF'nin tüm meta veri özelliklerini inceleyin. +--- + +# Üst Veriyi Görüntüle + +Bir PDF dosyasına gömülü gizli özellikleri inceleyin. Araç belge bilgilerini (başlık, yazar, tarihler), XMP meta verilerini, sayfa boyutlarını ve diğer yapısal verileri okunabilir bir biçimde gösterir. + +## Nasıl Çalışır + +1. Bir PDF dosyası yükleyin. +2. Araç dosyayı hemen ayrıştırır ve mevcut tüm meta verileri düzenli bölümler halinde gösterir. +3. Belge bilgisi sözlüğünü, XMP meta veri ağacını ve yapısal özellikleri inceleyin. +4. İşleme adımı gerekmez: meta veriler dosya yüklenir yüklenmez gösterilir. + +## Özellikler + +- Standart belge bilgisi alanlarını gösterir: Başlık, Yazar, Konu, Anahtar Sözcükler, Oluşturan, Üretici +- Oluşturma ve değiştirme tarihlerini okunabilir biçimde gösterir +- Tam XMP meta veri ağacını iç içe ad alanlarıyla ayrıştırır ve görüntüler +- PDF tarih biçimini (`D:20240101120000Z`) okunabilir tarihlere dönüştürür +- Kolay gezinme için katlanabilir bölümlere ayrılmıştır + +## Meta Veri Bölümleri + +| Bölüm | İçerik | +| --------------------- | ----------------------------------------------------------------------------------------------- | +| **Belge Bilgisi** | Başlık, Yazar, Konu, Anahtar Sözcükler, Oluşturan, Üretici, Oluşturma Tarihi, Değiştirme Tarihi | +| **XMP Meta Verileri** | Dublin Core, XAP, PDF ve özel ad alanlarını içeren, XML tabanlı tam meta veri ağacı | +| **Belge Özellikleri** | Sayfa sayısı, PDF sürümü, dosya boyutu, şifreleme durumu | + +## Kullanım Alanları + +- Bir PDF'yi kimin yazdığını ve en son ne zaman değiştirildiğini kontrol etmek +- Bir belge yayımlanmadan önce meta verilerin doğru ayarlandığını doğrulamak +- Hangi kişisel bilgilerin gömülü olduğunu kontrol ederek PDF'leri gizlilik açısından denetlemek +- Bir PDF'yi oluşturmak veya değiştirmek için kullanılan yazılımı incelemek (Üretici alanı aracılığıyla) +- Dijital varlık yönetimi uyumluluğu için XMP meta verilerini gözden geçirmek + +## İpuçları + +- `D:` ile başlayan PDF tarih dizeleri otomatik olarak yerel saat diliminize göre biçime dönüştürülür. +- Meta veri alanları boş görünüyorsa, PDF'yi oluşturan bunları ayarlamamıştır. Tüm PDF'ler zengin meta veri içermez. +- İnceledikten sonra meta verileri değiştirmek için [Meta Verileri Düzenle](./edit-metadata) aracını kullanın. Tamamen silmek için Meta Verileri Kaldır aracını kullanın. + +## İlgili Araçlar + +- [Meta Verileri Düzenle](./edit-metadata) +- [PDF Katmanları (OCG)](./pdf-layers) +- [PDF'leri Karşılaştır](./compare-pdfs) diff --git a/docs/tr/tools/vsd-to-pdf.md b/docs/tr/tools/vsd-to-pdf.md new file mode 100644 index 00000000..629193b4 --- /dev/null +++ b/docs/tr/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD'den PDF'ye +description: Microsoft Visio (VSD/VSDX) diyagramlarını tarayıcınızda PDF'ye dönüştürün. Ücretsiz, gizli, Visio gerekmez. +--- + +# VSD'den PDF'ye + +Microsoft Visio diyagramlarını Visio kurmadan PDF'ye dönüştürün. VSD ve VSDX dosyaları, çoğu kişinin açamadığı akış şemaları, organizasyon şemaları, ağ diyagramları ve kat planları içerir. Bu araç onları her cihazda görüntülenebilen temiz PDF'ler olarak işler. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :----------- | :------ | :--------------------------------------- | +| Visio Binary | `.vsd` | Eski Visio biçimi (Visio 2003 ve öncesi) | +| Visio XML | `.vsdx` | Modern Visio biçimi (Visio 2013+) | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya VSD ya da VSDX dosyalarınızı sürükleyip bırakın. Her iki biçim tek bir toplu işte karıştırılabilir. +2. Dosya listesini gözden geçirin. İstemediğiniz girdileri çöp kutusu simgesiyle kaldırın veya daha fazla diyagram eklemek için **Daha Fazla Dosya Ekle** seçeneğini kullanın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. LibreOffice tabanlı motor tarayıcıda yüklenir ve her diyagramı şekilleri, bağlayıcıları, etiketleri ve sayfa düzenini koruyarak PDF'ye dönüştürür. +4. Tek bir diyagram doğrudan PDF olarak indirilir. Birden fazla dosya `vsd-to-pdf.zip` adlı bir ZIP arşivi oluşturur. + +## Seçenekler + +Yapılandırma gerekmez. Dönüştürücü, Visio belgesindeki özgün sayfa boyutuna ve yönüne uyar. + +## Kullanım Alanları + +- Visio lisansınız yokken bir meslektaşınızdan gelen Visio diyagramlarını incelemek +- Ağ veya mimari diyagramlarını proje belgelerine PDF olarak eklemek +- Toplantı dağıtım kağıtları için organizasyon şemalarını veya süreç akışlarını yazdırmak +- Eski Visio sürümlerinden kalan VSD dosyalarını geleceğe dayanıklı bir biçimde arşivlemek + +## İpuçları + +- Çok sayfalı Visio belgeleri çok sayfalı PDF'ler üretir, her Visio sayfası bir PDF sayfasına karşılık gelir. +- VSDX dosyaları (modern XML tabanlı biçim) genellikle eski VSD ikili dosyalarından daha yüksek doğrulukla dönüştürülür. +- LibreOffice motoru oturum başına bir kez yüklenir. İlk dönüştürmede kısa bir bekleme olur, sonraki dosyalarda sonuçlar daha hızlıdır. + +## İlgili Araçlar + +- [ODG'den PDF'ye](./odg-to-pdf) +- [PUB'dan PDF'ye](./pub-to-pdf) +- [PSD'den PDF'ye](./psd-to-pdf) diff --git a/docs/tr/tools/webp-to-pdf.md b/docs/tr/tools/webp-to-pdf.md new file mode 100644 index 00000000..733ca8a5 --- /dev/null +++ b/docs/tr/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP'den PDF'ye +description: WebP görsellerini ayarlanabilir sıkıştırma kalitesiyle doğrudan tarayıcınızda PDF biçimine dönüştürün. +--- + +# WebP'den PDF'ye + +Google'ın WebP görsel biçimini PDF'ye dönüştürün. Bu, webden WebP biçiminde indirdiğiniz görselleri yazdırma veya paylaşma için daha yaygın kabul gören bir biçime çevirmeniz gerektiğinde özellikle kullanışlıdır. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---- | :-------- | +| WebP | `.webp` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya WebP dosyalarınızı sürükleyip bırakın. +2. Dosya listesini gözden geçirin ve ihtiyacınız olmayan dosyaları kaldırın. +3. Bir **PDF Kalitesi** düzeyi seçin. +4. **PDF'ye Dönüştür** düğmesine tıklayın. Çıktı `from_webps.pdf` olarak indirilir. + +Her WebP görseli dahili olarak tarayıcının canvas API'si ile çözülür, ardından pdf-lib kullanılarak PDF'ye gömülür. Bu, dönüştürmenin WebP çözmeyi destekleyen her tarayıcıda çalışması anlamına gelir (tüm modern tarayıcılar destekler). + +## Seçenekler + +**PDF Kalitesi**, görselleri gömerken sıkıştırmayı belirler: + +- **Yüksek Kalite**: en fazla ayrıntıyı korur. +- **Orta Kalite** (varsayılan): dengeli çıktı. +- **Düşük Kalite**: en küçük dosya boyutu. + +## Kullanım Alanları + +- WebP olarak kaydedilmiş, webden indirilen görselleri yazdırılabilir bir PDF'ye dönüştürmek +- Chrome veya Edge'den alınan WebP ekran görüntülerini belgelere paketlemek +- Varsayılan olarak WebP dışa aktaran tasarım araçlarından gelen görsellerle bir PDF portföyü oluşturmak +- WebP görsellerini daha yaygın okunabilen bir biçimde arşivlemek + +## İpuçları + +- WebP, PDF'ye gömülmeden önce dahili olarak PNG'ye çözülür, bu nedenle kayıpsız WebP görselleri Yüksek ayarında kalitesini korur. +- WebP ile diğer görsel biçimlerini karıştırdıysanız bunun yerine [Görsellerden PDF'ye](./image-to-pdf) aracını kullanın, hepsini tek seferde kabul eder. + +## İlgili Araçlar + +- [Görsellerden PDF'ye](./image-to-pdf) +- [PNG'den PDF'ye](./png-to-pdf) +- [JPG'den PDF'ye](./jpg-to-pdf) diff --git a/docs/tr/tools/word-to-pdf.md b/docs/tr/tools/word-to-pdf.md new file mode 100644 index 00000000..289c90bd --- /dev/null +++ b/docs/tr/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word'den PDF'ye +description: Word belgelerini (DOC, DOCX), ODT ve RTF dosyalarını biçimlendirmeyi tam koruyarak tarayıcınızda PDF'ye dönüştürün. +--- + +# Word'den PDF'ye + +Microsoft Word belgelerini ve uyumlu biçimleri PDF'ye dönüştürün. Araç, DOC, DOCX, ODT ve RTF dosyalarını işleyen, tarayıcı tabanlı bir LibreOffice motoru kullanır ve çıktıda biçimlendirmeyi, tabloları, görselleri, üst bilgileri, alt bilgileri ve stilleri korur. + +## Desteklenen Biçimler + +| Biçim | Uzantılar | +| :---------------- | :-------- | +| Word (modern) | `.docx` | +| Word (eski) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya Word belgelerinizi sürükleyip bırakın. Birden fazla dosya aynı anda seçilebilir. +2. Dosya listesini gözden geçirin ve yönetin. +3. **PDF'ye Dönüştür** düğmesine tıklayın. LibreOffice motoru ilk kullanımda yüklenir (bir ilerleme göstergesi başlatma durumunu gösterir), ardından her dosya dönüştürülür. +4. Tek dosya doğrudan PDF olarak indirilir. Birden fazla dosya `word-converted.zip` içinde paketlenir. + +## Seçenekler + +Bu aracın ek ayarı yoktur. LibreOffice motoru çıktıyı varsayılan PDF dışa aktarma profiliyle üretir. + +## Çıktı + +| Girdi Sayısı | Çıktı | +| :----------- | :-------------------------------------------------------------- | +| 1 dosya | Tek PDF indirmesi (özgün dosya adı, `.pdf` uzantısıyla) | +| 2+ dosya | Her dosya için bir PDF içeren ZIP arşivi (`word-converted.zip`) | + +## Kullanım Alanları + +- İş başvurusu yapmadan önce özgeçmişi veya ön yazıyı DOCX'ten PDF'ye dönüştürmek +- Bir müşteriye teslim için bir dizi sözleşmeyi veya teklifi toplu olarak PDF'ye dönüştürmek +- Eski `.doc` dosyalarını uzun vadeli arşivleme için modern PDF'lere çevirmek +- Google Docs'tan DOCX olarak dışa aktarılan ortak belgeleri PDF'ye dönüştürmek +- Otomatik belge üretiminde kullanılan Word şablonlarından baskıya hazır PDF'ler üretmek + +## İpuçları + +- LibreOffice motoru oturum başına bir kez indirilir ve önbelleğe alınır. İlk dönüştürmede birkaç saniyelik yükleme süresi beklenir, sonraki dönüştürmeler çok daha hızlıdır. +- Karmaşık biçimlendirme (makrolar, ActiveX denetimleri, gelişmiş SmartArt) mükemmel dönüşmeyebilir. Metin, tablolar, görseller, üst bilgiler ve dipnotlar gibi standart belge öğeleri güvenilir biçimde dönüşür. +- Bu araç ODT ve RTF'yi de kabul ettiği için tüm kelime işlemci biçimleri için tek duraklı bir dönüştürücü olarak kullanabilirsiniz. + +## İlgili Araçlar + +- [ODT'den PDF'ye](./odt-to-pdf) +- [RTF'den PDF'ye](./rtf-to-pdf) +- [Excel'den PDF'ye](./excel-to-pdf) +- [PowerPoint'ten PDF'ye](./powerpoint-to-pdf) diff --git a/docs/tr/tools/wpd-to-pdf.md b/docs/tr/tools/wpd-to-pdf.md new file mode 100644 index 00000000..673f64c8 --- /dev/null +++ b/docs/tr/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD'den PDF'ye +description: WordPerfect (WPD) belgelerini LibreOffice kullanarak tarayıcınızda PDF'ye dönüştürün. Ücretsiz ve gizli. +--- + +# WPD'den PDF'ye + +Corel WordPerfect belgelerini PDF dosyalarına dönüştürün. WPD, bir zamanlar hukuk bürolarında ve kamu kurumlarında baskın kelime işlemci biçimiydi. Modern yazılımların açmayı reddettiği eski WordPerfect dosyalarınız varsa, bu araç onları standart PDF'ler olarak yeniden hayata döndürür. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---------- | :----- | :------------------------------ | +| WordPerfect | `.wpd` | Tüm büyük WordPerfect sürümleri | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya WPD dosyalarınızı sürükleyip bırakın. Birden fazla dosya aynı anda seçilebilir. +2. Dosya listesini gözden geçirin. İstemediğiniz dosyaları çöp kutusu simgesiyle kaldırın veya daha fazla belge eklemek için **Daha Fazla Dosya Ekle** seçeneğini kullanın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. Araç, tarayıcınızda WPD biçimini ayrıştıran ve PDF çıktısı veren LibreOffice tabanlı bir dönüştürme motoru yükler. +4. Tek dosya doğrudan PDF olarak indirilir. Toplu dönüştürmeler `wpd-to-pdf.zip` adlı bir ZIP arşivi oluşturur. + +## Seçenekler + +Yapılandırma gerekmez. LibreOffice motoru WPD biçimlendirmesini, yazı tiplerini ve düzeni otomatik olarak işler. + +## Kullanım Alanları + +- WordPerfect ile yazılmış onlarca yıllık hukuki belgeleri açmak +- Arşivlenmiş resmi dosyaları WPD'den modern bir biçime dönüştürmek +- Eski bir WordPerfect belge kitaplığını uzun süreli saklama için PDF'ye taşımak +- WPD dosyalarını Corel WordPerfect kurulu olmayan alıcılarla paylaşmak + +## İpuçları + +- LibreOffice motoru ilk kullanımda yüklenir ve bu biraz zaman alır. Aynı oturumdaki sonraki dönüştürmeler daha hızlıdır. +- Karmaşık WPD makroları ve kod gösterme (reveal codes) korunmaz, ancak görsel düzen, metin içeriği ve temel biçimlendirme PDF'ye aktarılır. + +## İlgili Araçlar + +- [WPS'den PDF'ye](./wps-to-pdf) +- [ODG'den PDF'ye](./odg-to-pdf) diff --git a/docs/tr/tools/wps-to-pdf.md b/docs/tr/tools/wps-to-pdf.md new file mode 100644 index 00000000..e0647165 --- /dev/null +++ b/docs/tr/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS'ten PDF'ye +description: Microsoft Works (WPS) belgelerini tarayıcınızda PDF'ye dönüştürün. Ücretsiz, kayıt gerektirmez, tamamen gizli. +--- + +# WPS'ten PDF'ye + +Microsoft Works kelime işlemci dosyalarını PDF'ye dönüştürün. Microsoft Works, 1990'ların sonu ve 2000'ler boyunca bireysel bilgisayarlarla birlikte geliyordu ve birçok WPS dosyası hâlâ eski sabit disklerde ve e-posta arşivlerinde duruyor. Bu araç onları tarayıcıda açar ve temiz PDF'ler üretir. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :-------------- | :----- | :--------------------------------------- | +| Microsoft Works | `.wps` | Microsoft Works kelime işlemci dosyaları | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya WPS dosyalarınızı sürükleyip bırakın. Birden fazla dosya kabul edilir. +2. Dosya listesini gözden geçirin. Tek tek dosyaları kaldırmak için çöp kutusu simgesini kullanın veya toplu işinizi genişletmek için **Daha Fazla Dosya Ekle** seçeneğine tıklayın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. LibreOffice tabanlı bir motor tarayıcıda yüklenir ve her WPS belgesini PDF'ye dönüştürür. +4. Tek dosya doğrudan PDF olarak indirilir. Birden fazla dosya `wps-to-pdf.zip` adlı bir ZIP arşivinde toplanır. + +## Seçenekler + +Ek ayar gerekmez. Dönüştürücü, WPS dosyasındaki metni, temel biçimlendirmeyi ve gömülü görselleri işler. + +## Kullanım Alanları + +- Microsoft Works biçiminde kaydedilmiş eski okul veya iş belgelerini kurtarmak +- Microsoft Works kurulu değilken WPS e-posta eklerini açmak +- Bir WPS dosyası arşivini modern bir belge sistemine taşımak için dönüştürmek +- Güncel kelime işlemcilerin açamadığı eski belgeleri yazdırmak + +## İpuçları + +- Microsoft Works `.wps` dosyalarını WPS Office dosyalarıyla karıştırmayın. Bu araç özellikle eski Microsoft Works biçimi içindir. +- LibreOffice motoru ilk kullanımda yüklenirken biraz zaman alır. Yüklendikten sonra aynı oturumdaki dönüştürmeler daha hızlı çalışır. + +## İlgili Araçlar + +- [WPD'den PDF'ye](./wpd-to-pdf) +- [PUB'dan PDF'ye](./pub-to-pdf) diff --git a/docs/tr/tools/xml-to-pdf.md b/docs/tr/tools/xml-to-pdf.md new file mode 100644 index 00000000..862bd55d --- /dev/null +++ b/docs/tr/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML'den PDF'ye +description: XML dosyalarını tarayıcınızda yapılandırılmış PDF belgelerine dönüştürün. Ücretsiz, gizli, sunucuda işlem yok. +--- + +# XML'den PDF'ye + +XML veri dosyalarını okunabilir, yapılandırılmış PDF belgelerine dönüştürün. Ham XML güçlüdür ancak insanlar için okunması zordur. Bu araç XML ağacını ayrıştırır, yinelenen veri yapılarını belirler ve bunları yatay A4 PDF içinde biçimlendirilmiş tablolar ve bölümler olarak işler. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---- | :----- | :--------------------------------------- | +| XML | `.xml` | Geçerli biçimli herhangi bir XML belgesi | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya XML dosyalarınızı sürükleyip bırakın. Birden fazla dosya tek bir toplu işte işlenebilir. +2. Dosya listesini gözden geçirin. İstemediğiniz dosyaları çöp kutusu simgesiyle kaldırın veya daha fazlasını eklemek için **Daha Fazla Dosya Ekle** seçeneğine tıklayın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. Araç, XML yapısını tarayıcının yerleşik DOMParser'ı ile ayrıştırır, veri hiyerarşisini analiz eder ve jsPDF ile otomatik tablo biçimlendirmesi kullanarak PDF'ye işler. +4. Tek dosya PDF olarak indirilir. Birden fazla dönüştürme `xml-to-pdf.zip` içinde paketlenir. + +## Seçenekler + +Elle yapılandırma gerekmez. Dönüştürücü XML yapısını otomatik olarak algılar ve uygun tablo düzenlerini seçer. Çıktı, geniş veri kümelerini sığdırmak için yatay A4 yönelimini kullanır. + +## Kullanım Alanları + +- Veritabanlarından veya API'lerden alınan XML veri dışa aktarımlarını yazdırılabilir raporlara dönüştürmek +- XML yapılandırma dosyalarından okunabilir özetler oluşturmak +- XML tabanlı faturaları veya işlem günlüklerini kayıt tutmak için PDF'ye dönüştürmek +- XML site haritalarını veya RSS beslemelerini belge biçiminde okunabilir kılmak + +## İpuçları + +- XML geçerli biçimde olmalıdır. Ayrıştırıcı sözdizimi hatalarıyla karşılaşırsa, dönüştürme sorunu gösteren açıklayıcı bir hata iletisiyle başarısız olur. +- Çok derin iç içe XML yapıları tablolara düzleştirilir. En iyi sonuç için veride, tutarlı alt öğelere sahip yinelenen kardeş öğeler bulunmalıdır. +- Dönüştürme sırasında her aşamayı gösteren ilerleme güncellemeleri görünür: okuma, ayrıştırma, analiz ve işleme. + +## İlgili Araçlar + +- [FB2'den PDF'ye](./fb2-to-pdf) +- [XPS'den PDF'ye](./xps-to-pdf) +- [E-postadan PDF'ye](./email-to-pdf) diff --git a/docs/tr/tools/xps-to-pdf.md b/docs/tr/tools/xps-to-pdf.md new file mode 100644 index 00000000..ae620b6a --- /dev/null +++ b/docs/tr/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS'ten PDF'ye +description: XPS ve OXPS belgelerini tarayıcınızda PDF biçimine dönüştürün. Yükleme yok, kayıt yok, tamamen gizli. +--- + +# XPS'ten PDF'ye + +Microsoft XPS ve OXPS belgelerini standart PDF dosyalarına dönüştürün. XPS (XML Paper Specification), Microsoft'un PDF'ye yanıtıydı, ancak platformlardaki desteği giderek azaldı. Bu araç söz konusu belgeleri yeniden herkesin okuyabileceği hale getirir. + +## Desteklenen Biçimler + +| Biçim | Uzantı | Notlar | +| :---- | :------ | :------------------------------------ | +| XPS | `.xps` | Özgün Microsoft XPS biçimi | +| OXPS | `.oxps` | Open XPS, ECMA-388 standardı varyantı | + +## Nasıl Çalışır + +1. Yükleme alanına tıklayın veya XPS/OXPS dosyalarınızı sürükleyip bırakın. Birden fazla dosyayı aynı anda seçebilirsiniz. +2. Dosya listesini gözden geçirin. Tek tek dosyaları çöp kutusu simgesiyle kaldırın veya ek belgeler eklemek için **Daha Fazla Dosya Ekle** seçeneğine tıklayın. +3. **PDF'ye Dönüştür** düğmesine tıklayın. PyMuPDF motoru her belgeyi tarayıcınızda yerel olarak işler. +4. Tek dosya doğrudan PDF olarak indirilir. Birden fazla dosya `xps-converted.zip` adlı bir ZIP arşivinde toplanır. + +## Seçenekler + +Bu araç ek yapılandırma olmadan doğrudan biçim dönüştürme yapar. Çıktı, XPS kaynağındaki özgün sayfa boyutlarını, vektör grafiklerini, yazı tiplerini ve görselleri korur. + +## Kullanım Alanları + +- Varsayılan olarak XPS yazdırma sürücüsünü kullanan eski Windows sistemlerinden gelen XPS dosyalarını açmak +- Windows 10/11'den gelen OXPS belgelerini macOS veya Linux kullanıcılarıyla paylaşmak için dönüştürmek +- Eski XPS dosyalarını daha yaygın desteklenen bir biçimde arşivlemek +- XPS tabanlı resmi veya kurumsal belgeleri dış alıcılar için erişilebilir kılmak + +## İpuçları + +- Hem `.xps` hem de `.oxps` uzantıları otomatik olarak işlenir, aynı toplu işte karıştırabilirsiniz. +- Özgün XPS dosyası yüksek çözünürlüklü bir yazdırma sürücüsüyle oluşturulduysa, ortaya çıkan PDF bu kaliteyi korur. Yeniden örnekleme yapılmaz. + +## İlgili Araçlar + +- [Word'den PDF'ye](./word-to-pdf) +- [XML'den PDF'ye](./xml-to-pdf) diff --git a/docs/uk/contributing.md b/docs/uk/contributing.md new file mode 100644 index 00000000..5f09b0c8 --- /dev/null +++ b/docs/uk/contributing.md @@ -0,0 +1,136 @@ +# Участь у розробці + +Дякуємо за інтерес до участі в розробці BentoPDF! Цей посібник допоможе вам почати. + +## Початок роботи + +### Вимоги + +- Node.js 18+ +- npm 9+ +- Git + +### Налаштування + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Структура проєкту + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Додавання нового інструмента + +### Крок 1: створіть файл логіки + +Створіть `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Крок 2: створіть HTML-сторінку + +Створіть `src/pages/your-tool.html` за зразком наявних шаблонів інструментів. + +### Крок 3: зареєструйте інструмент + +Додайте до `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Крок 4: додайте до конфігурації збірки + +Додайте сторінку до `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Крок 5: додайте переклади + +Додайте записи до всіх файлів локалей у `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Стиль коду + +- Використовуйте TypeScript для всього нового коду +- Дотримуйтеся наявних підходів для узгодженості +- Запускайте `npm run format` перед комітом +- Без коментарів у робочому коді (коментарі видаляються під час збірки) + +## Процес pull request + +1. Створіть гілку для функції: `git checkout -b feature/your-feature` +2. Внесіть зміни +3. Ретельно протестуйте: `npm run build` +4. Надішліть PR із чітким описом + +## Переклад + +Щоб додати нові мови, перегляньте [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md). + +## Ліцензійна угода контриб'ютора + +Перш ніж ваш PR буде злито, потрібно підписати нашу CLA: + +- [Індивідуальна CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [Корпоративна CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Де отримати допомогу + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Спільнота в Discord](https://discord.gg/Bgq3Ay3f2w) + +## Ліцензія + +BentoPDF має подвійне ліцензування: + +- **AGPL-3.0** для проєктів з відкритим кодом, де ви публічно ділитеся всім вихідним кодом +- **Комерційна ліцензія** для пропрієтарних застосунків із закритим кодом - [Отримати безстрокову ліцензію за $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Роблячи внесок, ви погоджуєтеся, що ваш внесок буде ліцензовано на цих умовах. diff --git a/docs/uk/getting-started.md b/docs/uk/getting-started.md new file mode 100644 index 00000000..c4234a65 --- /dev/null +++ b/docs/uk/getting-started.md @@ -0,0 +1,80 @@ +# Початок роботи + +Ласкаво просимо до BentoPDF! Цей посібник допоможе вам швидко розпочати. + +## Що таке BentoPDF? + +BentoPDF це безкоштовний PDF-набір інструментів з відкритим кодом, створений з урахуванням конфіденційності, який працює **повністю у вашому браузері**. Ваші файли ніколи не залишають пристрій: уся обробка відбувається локально за допомогою технології WebAssembly (WASM). + +## Швидкий старт + +### Варіант 1: використати онлайн-версію + +Відвідайте [bentopdf.com](https://www.bentopdf.com), щоб скористатися BentoPDF одразу, без встановлення. + +### Варіант 2: розгорнути на власному сервері через Docker + +> [!IMPORTANT] +> Конвертація офісних файлів потребує `SharedArrayBuffer`, для чого потрібні обидва заголовки: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - безпечний контекст +> +> `http://localhost` підходить для локального тестування, бо браузери вважають loopback надійним. `http://192.168.x.x` та інші LAN-адреси зазвичай не підходять, тому конвертація Word/Excel/PowerPoint з інших пристроїв вашої мережі вимагатиме HTTPS. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF постачається у двох збірках: **Self-Hosted build** (`bentopdf-simple`, використана вище) для внутрішніх розгортань у командах і організаціях, та **Commercial build** (`bentopdf:latest`), яку використовує сам bentopdf.com і власники комерційної ліцензії для публічних розгортань. Обидві мають однакові PDF-інструменти, а Commercial build додає головний екран, FAQ, відгуки та футер bentopdf.com. Якщо вагаєтеся, обирайте Self-Hosted build. + +Потім відкрийте `http://localhost:3000` у браузері. + +> [!NOTE] +> Якщо ви готуєте OCR-розгортання в ізольованому середовищі (air-gapped), окрім Tesseract worker, основного runtime та файлів traineddata, потрібно розмістити внутрішньо й шрифти текстового шару OCR. Повне налаштування описано в розділі [Самостійне розгортання](/uk/self-hosting/), зокрема `VITE_OCR_FONT_BASE_URL` і вбудований каталог `ocr-fonts/`. + +### Варіант 3: зібрати з вихідного коду + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Можливості коротко + +| Категорія | Інструменти | +| -------------------------- | ------------------------------------------------------------------ | +| **Конвертація в PDF** | Word, Excel, PowerPoint, зображення, Markdown, EPUB, MOBI та інші | +| **Конвертація з PDF** | JPG, PNG, текст, Excel, SVG та інші | +| **Редагування й анотації** | Підпис, виділення, редагування (redact), заповнення форм, штампи | +| **Організація** | Об’єднання, розділення, поворот, видалення сторінок, зміна порядку | +| **Оптимізація** | Стиснення, відновлення, зведення (flatten), OCR | +| **Безпека** | Шифрування, розшифрування, зняття обмежень | + +## Підтримка браузерів + +BentoPDF найкраще працює в сучасних браузерах: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Наступні кроки + +- [Переглянути всі інструменти](/uk/tools/) +- [Розгорнути BentoPDF самостійно](/uk/self-hosting/) +- [Долучитися до проєкту](/uk/contributing) diff --git a/docs/uk/index.md b/docs/uk/index.md new file mode 100644 index 00000000..28051efd --- /dev/null +++ b/docs/uk/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Безкоштовні PDF-інструменти з відкритим кодом' + tagline: Обробляйте PDF повністю у браузері. Без завантажень. Без серверів. Повна конфіденційність. + actions: + - theme: brand + text: Почати + link: /uk/getting-started + - theme: alt + text: Переглянути інструменти + link: /uk/tools/ + - theme: alt + text: Самостійне розгортання + link: /uk/self-hosting/ + - theme: alt + text: Комерційна ліцензія + link: /uk/licensing + +features: + - icon: 🔒 + title: 100% приватно + details: Ваші файли ніколи не залишають пристрій. Уся обробка відбувається локально у вашому браузері за допомогою WebAssembly. + - icon: ⚡ + title: Швидко й безкоштовно + details: Без реєстрації, без обмежень, без водяних знаків. Обробляйте необмежену кількість PDF безкоштовно та назавжди. + - icon: 🛠️ + title: 50+ інструментів + details: Конвертуйте, редагуйте, об’єднуйте, розділяйте, стискайте, підписуйте, розпізнавайте (OCR) та багато іншого. Усе потрібне в одному місці. + + - icon: 🌐 + title: Можна розгорнути самостійно + details: Розгортайте на власній інфраструктурі. Docker, Vercel, Netlify, AWS або повністю ізольовані (air-gapped) середовища з власними OCR-воркерами, мовними даними та шрифтами текстового шару. +--- + +## OCR офлайн + +Якщо ви самостійно розгортаєте BentoPDF в ізольованому або офлайн-середовищі, для OCR потрібні не лише Tesseract worker і файли traineddata. Для пошукового PDF також потрібно внутрішньо віддавати шрифти текстового шару OCR. +Повне налаштування, зокрема `VITE_OCR_FONT_BASE_URL`, вбудований каталог `ocr-fonts/` та оновлений процес для ізольованих середовищ, дивіться в розділі [Самостійне розгортання](/uk/self-hosting/). diff --git a/docs/uk/licensing.md b/docs/uk/licensing.md new file mode 100644 index 00000000..8aa5355b --- /dev/null +++ b/docs/uk/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/uk/self-hosting/#конфігурація-wasm-компоненти-під-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/uk/self-hosting/apache.md b/docs/uk/self-hosting/apache.md new file mode 100644 index 00000000..ff0c9727 --- /dev/null +++ b/docs/uk/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Розгортання з Apache + +Розмістіть BentoPDF за допомогою Apache HTTP Server. + +## Вимоги + +- Apache 2.4+ +- Увімкнений mod_rewrite +- SSL-сертифікат (рекомендовано) + +## Крок 1: зберіть проєкт + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Щоб налаштувати брендинг, задайте змінні середовища перед збіркою: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Крок 2: скопіюйте файли + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Крок 3: конфігурація Apache + +Створіть `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Крок 4: .htaccess для маршрутизації + +Створіть `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Крок 5: увімкніть потрібні модулі + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Крок 6: увімкніть сайт + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Розгортання в підкаталозі + +Щоб розмістити за адресою `/pdf/`: + +1. Зберіть із базовим URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Оновіть `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Усунення несправностей + +### Помилки 404 для WASM + +Переконайтеся, що налаштовано MIME-тип: + +```apache +AddType application/wasm .wasm +``` + +### Sign PDF або Form Filler показує порожній переглядач (помилка MIME для `.mjs`) + +Якщо в консолі браузера з'являється: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…і запит, що не вдався, закінчується на `.mjs`, у конфігурації Apache бракує зіставлення `.mjs → application/javascript`. Вбудований PDF-переглядач постачає файли ES-модулів з розширенням `.mjs`, а стандартний `mime.types` в Apache їх за замовчуванням не містить. + +Додайте до VirtualHost або `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Потім перезавантажте Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Щоб перевірити: у DevTools браузера → вкладка Network знайдіть невдалий запит `.mjs` і перегляньте заголовок відповіді `Content-Type`. Тепер він має бути `application/javascript`, а не `application/octet-stream`. + +### Rewrite не працює + +Перевірте, чи увімкнено mod_rewrite: + +```bash +sudo a2enmod rewrite +``` + +### Конвертація Word/ODT/Excel у PDF не працює + +LibreOffice WASM потребує `SharedArrayBuffer`, для чого потрібні такі заголовки: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Також потрібен безпечний контекст. `http://localhost` підходить для локального тестування, але `http://192.168.x.x` та інші LAN-адреси зазвичай вимагають HTTPS. Якщо заголовки є, але `window.crossOriginIsolated` усе ще `false`, перевірте, чи сторінка не відкривається через звичайний HTTP з origin, що не є loopback. + +Попередньо стиснуті файли `.wasm.gz` і `.data.gz` також потребують правильного `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Переконайтеся, що `mod_headers` увімкнено: `sudo a2enmod headers` + +### Доступ заборонено + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/uk/self-hosting/aws.md b/docs/uk/self-hosting/aws.md new file mode 100644 index 00000000..f9f895f3 --- /dev/null +++ b/docs/uk/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Розгортання на AWS S3 + CloudFront + +Розмістіть BentoPDF на AWS для максимального контролю та масштабованості. + +## Архітектура + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Крок 1: створіть бакет S3 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Крок 2: зберіть і завантажте + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Крок 3: створіть дистрибуцію CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Або скористайтеся консоллю AWS: + +1. Перейдіть до CloudFront → Create distribution +2. Origin domain: виберіть свій бакет S3 +3. Увімкніть "Origin Access Control" +4. Default root object: `index.html` +5. Створіть дистрибуцію + +## Крок 3b: політика заголовків відповіді (обов'язково для LibreOffice WASM) + +Конвертація на основі LibreOffice (Word, Excel, PowerPoint у PDF) потребує `SharedArrayBuffer`, для чого потрібні певні заголовки відповіді. Створіть CloudFront Response Headers Policy: + +1. Перейдіть до CloudFront → Policies → Response headers +2. Створіть власну політику з такими заголовками: + +| Заголовок | Значення | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Прикріпіть політику до стандартної поведінки кешу (default cache behavior) вашої дистрибуції + +Або через CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Крок 3c: метадані S3 для попередньо стиснутих файлів WASM + +Файли LibreOffice WASM попередньо стиснуті (`.wasm.gz`, `.data.gz`). Задайте правильні Content-Type і Content-Encoding, щоб браузери розпаковували їх: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Важливо +Без політики заголовків відповіді `SharedArrayBuffer` недоступний, і конвертація LibreOffice WASM зависатиме приблизно на 55%. Без правильного Content-Encoding для файлів `.gz` браузер отримує необроблені байти gzip, і компіляція WASM завершується помилкою. +::: + +## Крок 4: політика бакета S3 + +Дозвольте CloudFront доступ до бакета: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Крок 5: власні сторінки помилок + +Налаштуйте повернення `index.html` для 404 для маршрутизації SPA: + +1. CloudFront → Error pages +2. Створіть власну відповідь на помилку: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Оцінка вартості + +| Ресурс | Орієнтовна вартість | +| ------------------------- | ------------------- | +| Сховище S3 (~500MB) | ~$0.01/міс. | +| CloudFront (1TB трафіку) | ~$85/міс. | +| CloudFront (10GB трафіку) | ~$0.85/міс. | + +::: tip +Використовуйте S3 Intelligent Tiering, щоб оптимізувати витрати на файли, до яких звертаються нечасто. +::: + +## Автоматизація за допомогою Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/uk/self-hosting/cloudflare.md b/docs/uk/self-hosting/cloudflare.md new file mode 100644 index 00000000..0bdae43f --- /dev/null +++ b/docs/uk/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Розгортання на Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) пропонує швидкий глобальний хостинг статичних сайтів з необмеженим трафіком. + +## Швидке розгортання + +1. Перейдіть до [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Натисніть "Create a project" +3. Підключіть свій репозиторій GitHub + +## Конфігурація збірки + +| Параметр | Значення | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Змінні середовища + +Додайте їх у Settings → Environment variables: + +| Змінна | Значення | +| ----------------------- | ---------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (необов'язково) | +| `VITE_BRAND_NAME` | Власна назва бренду (необов'язково) | +| `VITE_BRAND_LOGO` | Шлях до логотипа відносно `public/` (необов'язково) | +| `VITE_FOOTER_TEXT` | Власний текст футера/авторських прав (необов'язково) | +| `VITE_DEFAULT_LANGUAGE` | Типова мова інтерфейсу, напр. `fr` (необов'язково) | + +## Файл конфігурації + +Створіть `_headers` у папці `public`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Важливо +Заголовки `Cross-Origin-Embedder-Policy` і `Cross-Origin-Opener-Policy` обов'язкові для конвертації Word/ODT/Excel/PowerPoint у PDF. Без них `SharedArrayBuffer` недоступний, і рушій LibreOffice WASM не зможе ініціалізуватися. +::: + +Створіть `_redirects` для маршрутизації SPA: + +``` +/* /index.html 200 +``` + +## Власний домен + +1. Перейдіть до свого проєкту Pages +2. Натисніть "Custom domains" +3. Додайте свій домен +4. Cloudflare автоматично налаштує DNS, якщо домен розміщено на Cloudflare + +## Переваги + +- **Безкоштовний необмежений трафік** +- **Глобальна CDN** з понад 300 вузлами +- **Автоматичний HTTPS** +- **Попередні розгортання** для pull request +- **Швидкі збірки** + +## Усунення несправностей + +### Завантаження великих файлів + +Cloudflare Pages підтримує файли до 25 MB. Модулі WASM мають вміститися, але якщо ви впираєтеся в ліміти, розгляньте: + +```bash +# Split large files during build +npm run build +``` + +### Ліміти розміру Worker + +Якщо ви використовуєте Cloudflare Workers для складної маршрутизації, зверніть увагу на ліміт 1 MB для безкоштовних планів. + +## Worker CORS-проксі (для цифрових підписів) + +Інструмент цифрового підпису потребує CORS-проксі для отримання ланцюжків сертифікатів. Розгорніть вбудований worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Функції безпеки + +| Функція | Опис | +| --------------------------- | ------------------------------- | +| **Обмеження URL** | Дозволено лише URL сертифікатів | +| **Ліміт розміру файлу** | Макс. 10MB на запит | +| **Обмеження частоти** | 60 запитів/IP/хв (потрібен KV) | +| **Блокування приватних IP** | Блокує localhost і внутрішні IP | + +### Увімкнення обмеження частоти + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Збірка з URL проксі + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Або з Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Примітка:** Налаштування підпису HMAC дивіться в [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required). diff --git a/docs/uk/self-hosting/cors-proxy.md b/docs/uk/self-hosting/cors-proxy.md new file mode 100644 index 00000000..90b7857c --- /dev/null +++ b/docs/uk/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS-проксі для отримання сертифікатів + +Інструмент цифрового підпису використовує CORS-проксі, щоб отримувати сертифікати емітентів із зовнішніх центрів сертифікації (CA). Це потрібно, бо багато серверів CA не додають заголовків CORS у відповіді, що унеможливлює пряме отримання з браузера. + +Крім того, багато серверів CA віддають сертифікати через звичайний HTTP. Коли ваш екземпляр BentoPDF розміщено через HTTPS, браузери блокують такі HTTP-запити (політика змішаного контенту). CORS-проксі вирішує обидві проблеми, спрямовуючи запити через HTTPS-ендпоінт із потрібними заголовками. + +## Як це працює + +Під час підписання PDF сертифікатом: + +1. Бібліотека `zgapdfsigner` намагається побудувати повний ланцюжок сертифікатів +2. Вона отримує сертифікати емітентів за URL, вбудованими в розширення AIA (Authority Information Access) вашого сертифіката +3. Ці запити проходять через CORS-проксі, який додає потрібні заголовки `Access-Control-Allow-Origin` +4. Проксі повертає дані сертифіката в браузер + +## Самостійне розгортання CORS-проксі + +Якщо ви самостійно розгортаєте BentoPDF, вам потрібно розгорнути власний CORS-проксі, щоб цифрові підписи працювали із сертифікатами, які потребують отримання ланцюжка. + +### Варіант 1: Cloudflare Workers (рекомендовано) + +1. **Встановіть Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Увійдіть у Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Клонуйте BentoPDF і змініть дозволені origin**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Відкрийте `cors-proxy-worker.js` і змініть масив `ALLOWED_ORIGINS` на свій домен: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Важливо + Без цієї зміни проксі відхилятиме всі запити з вашого сайту з помилкою **403 Forbidden**. За замовчуванням дозволено лише запити з `bentopdf.com`. + ::: + +4. **Розгорніть проксі**: + + ```bash + wrangler deploy + ``` + + Запам'ятайте URL вашого worker (напр., `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Перезберіть BentoPDF з URL проксі**: + + Якщо використовуєте Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Якщо збираєте з вихідного коду: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Варіант 2: власний бекенд-проксі + +Ви також можете створити власний ендпоінт проксі. Вимоги такі: + +1. Приймати GET-запити з параметром запиту `url` +2. Отримувати URL зі свого сервера (на сервері обмежень CORS немає) +3. Повертати відповідь із такими заголовками: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Приклад реалізації на Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Міркування щодо безпеки + +Вбудований Cloudflare Worker має кілька заходів безпеки: + +| Функція | Опис | +| --------------------------- | ------------------------------------------------------------------------------------------ | +| **Перевірка origin** | Дозволяє запити лише з доменів зі списку `ALLOWED_ORIGINS` | +| **Обмеження URL** | Дозволяє лише URL сертифікатів (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Блокування приватних IP** | Блокує приватні діапазони IPv4/IPv6, link-local, loopback, десяткові IP та метадані хмари | +| **Безпечний Content-Type** | Повертає лише безпечні MIME-типи сертифікатів, блокує підміну content-type від джерела | +| **Ліміт розміру файлу** | Передає відповідь потоком з лімітом 10MB, перериває завантаження, якщо його перевищено | +| **Обмеження частоти** | 60 запитів на хвилину на IP або IPv6 /64 (потрібен KV, у разі помилок KV пропускає запити) | +| **Підписи HMAC** | Необов'язкове підписування на стороні клієнта (стримує випадкові зловживання) | + +### DNS rebinding (самостійне розгортання поза Cloudflare) + +Worker відхиляє будь-який URL, що вказує на приватну або внутрішню IP-адресу. Він не може використовувати фіксований список дозволених хостів, бо URL ланцюжків сертифікатів вказують на будь-який CA, що видав сертифікат (FNMT, корпоративні CA тощо), тож призначення наперед невідомі. Через це залишається невелике вікно для rebinding: той, хто керує DNS власного домену, може віддати публічну IP під час перевірки безпеки, а приватну в реальному запиті за мить. + +На Cloudflare це не експлуатується: Workers не мають доступу до приватних IP чи ендпоінта метаданих `169.254.169.254`, тож rebind нікуди не веде. Просто не давайте worker шляху всередину: не підключайте Tunnel, Service чи binding приватної мережі (йому потрібен лише `RATE_LIMIT_KV`). + +Якщо ви запускаєте це поза Cloudflare (workerd, Node тощо) усередині VPC, середовище _може_ звертатися до внутрішніх IP. Поставте перед ним egress-фаєрвол і заблокуйте приватні діапазони: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16` та їхні IPv6-еквіваленти. Код застосунку не може цього забезпечити поза Cloudflare. + +## Вимкнення проксі + +Якщо ви не хочете використовувати CORS-проксі, задайте змінній середовища порожній рядок: + +``` +VITE_CORS_PROXY_URL= +``` + +**Примітка**: Без проксі підписання сертифікатами, що потребують отримання зовнішнього ланцюжка (як-от FNMT чи деякі корпоративні CA), завершиться помилкою "Failed to fetch". + +## Усунення несправностей + +### "Signing error: TypeError: Failed to fetch" + +Зазвичай це означає одне з двох: + +1. **CORS-проксі не налаштовано**: задайте `VITE_CORS_PROXY_URL` і перезберіть +2. **Змішаний контент заблоковано**: ваш сайт працює через HTTPS, а URL емітента сертифіката через HTTP. CORS-проксі це вирішує. +3. **CORS-проксі відхиляє ваш origin**: перевірте, чи ваш домен є в масиві `ALLOWED_ORIGINS` у `cors-proxy-worker.js` + +### "403 Forbidden" від проксі + +Вашого домену немає у списку `ALLOWED_ORIGINS`. Відредагуйте `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Потім розгорніть заново: `npx wrangler deploy` + +### Тестування проксі + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Сертифікати, що працюють без проксі + +Деякі сертифікати містять повний ланцюжок у файлі P12/PFX і не потребують зовнішнього отримання: + +- Самопідписані сертифікати +- Деякі комерційні CA, що включають проміжні сертифікати +- Сертифікати, які ви вручну зібрали з повним ланцюжком diff --git a/docs/uk/self-hosting/docker.md b/docs/uk/self-hosting/docker.md new file mode 100644 index 00000000..c49ac7a2 --- /dev/null +++ b/docs/uk/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Розгортання з Docker / Podman + +Найпростіший спосіб самостійно розгорнути BentoPDF у робочому середовищі. + +> [!IMPORTANT] +> **Обов'язкові заголовки для конвертації офісних файлів** +> +> Інструменти на основі LibreOffice (конвертація Word, Excel, PowerPoint) потребують таких HTTP-заголовків для підтримки `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Сторінка також має віддаватися з безпечного контексту. `http://localhost` підходить для локального тестування, але `http://192.168.x.x` та інші LAN-адреси зазвичай не відповідають вимогам, тому конвертація Office через звичайний HTTP не працюватиме, навіть якщо заголовки присутні. +> +> Офіційні образи контейнерів містять ці заголовки. Якщо ви використовуєте зворотний проксі (Traefik, Caddy тощо), переконайтеся, що ці заголовки зберігаються або додаються, і використовуйте HTTPS для доступу не з loopback. + +> [!TIP] +> **Користувачам Podman:** усі команди `docker` працюють з Podman, якщо замінити `docker` на `podman`, а `docker-compose` на `podman-compose`. + +## Швидкий старт + +> [!TIP] +> BentoPDF постачається у двох збірках: +> +> - **Self-Hosted build**: `ghcr.io/alam00000/bentopdf-simple:latest`. Усі PDF-інструменти, **без** маркетингових елементів (без головного екрана, FAQ, відгуків і футера). Використовуйте для внутрішніх розгортань у командах і організаціях. Це **не** урізана "lite"-версія. +> - **Commercial build**: `ghcr.io/alam00000/bentopdf:latest`. Повний маркетинговий сайт, який використовує сам bentopdf.com і власники комерційної ліцензії для публічних розгортань. +> +> Якщо вагаєтеся, беріть Self-Hosted build. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Створіть `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Запустіть: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Збірка власного образу + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Зберіть і запустіть: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Змінні середовища + +| Змінна | Опис | Типове значення | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Зібрати варіант Self-Hosted (ховає маркетингові елементи bentopdf.com: головний екран, FAQ, відгуки, футер). Усі PDF-інструменти залишаються. | `false` | +| `BASE_URL` | Розгортання в підкаталозі | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL модуля PyMuPDF WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL модуля Ghostscript WASM | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL модуля CoherentPDF WASM | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL скрипта OCR worker | _(порожньо; CDN Tesseract.js за замовчуванням)_ | +| `VITE_TESSERACT_CORE_URL` | Каталог основного runtime OCR | _(порожньо; CDN Tesseract.js за замовчуванням)_ | +| `VITE_TESSERACT_LANG_URL` | Каталог traineddata OCR | _(порожньо; CDN Tesseract.js за замовчуванням)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Мови OCR через кому, що відображаються в інтерфейсі | _(порожньо; показати повний каталог)_ | +| `VITE_OCR_FONT_BASE_URL` | Каталог шрифтів текстового шару OCR | _(порожньо; використовувати віддалені URL шрифтів Noto)_ | +| `VITE_DEFAULT_LANGUAGE` | Типова мова інтерфейсу | `en` | +| `VITE_BRAND_NAME` | Власна назва бренду | `BentoPDF` | +| `VITE_BRAND_LOGO` | Шлях до логотипа відносно `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Власний текст футера/авторських прав | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID інструментів через кому, які потрібно сховати | _(порожньо; усі інструменти ввімкнено)_ | +| `DISABLE_GITHUB_STARS` | Пропустити отримання кількості зірок GitHub під час завантаження сторінки та прибрати `api.github.com` із CSP. Збірки Simple Mode завжди це пропускають. | `false` | +| `SITE_URL` | Публічний URL, що записується в canonical, hreflang і посилання sitemap. Залиште типовим, якщо не хочете, щоб пошукові системи сприймали ваше розгортання як окремий сайт. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Із власним `SITE_URL` кожну сторінку позначено `noindex`, щоб ваша копія не конкурувала з bentopdf.com у пошуку. Задайте `true`, щоб дозволити пошуковим системам її індексувати. | `false` | + +URL модулів WASM попередньо налаштовано з типовими значеннями CDN, тому всі розширені функції працюють одразу. Перевизначте їх для ізольованих (air-gapped) або самостійно розгорнутих середовищ. + +### Пошукові системи + +За замовчуванням кожна сторінка вказує пошуковим системам на bentopdf.com як на оригінал, тож ваше розгортання не з'являється як дублікат. Для приватного чи внутрішнього екземпляра нічого змінювати не потрібно. + +- **Повністю сховати екземпляр із результатів пошуку:** запустіть контейнер із `-e ROBOTS_NOINDEX=true`. Для цього потрібен лише перезапуск, без перезбирання. +- **Зробити екземпляр окремим сайтом у результатах пошуку:** зберіть із `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Без `ALLOW_INDEXING=true` власний `SITE_URL` позначає кожну сторінку як `noindex`. + +### Content-Security-Policy + +Образ nginx постачається із заголовком `Content-Security-Policy` у режимі примусового застосування. Директиви CSP `script-src`, `connect-src` і `font-src` **генеруються під час збірки** зі змінних URL `VITE_*` вище: усі хости, які ви передаєте через `--build-arg`, автоматично додаються до політики. + +Отже: + +- Якщо ви перевизначаєте `VITE_CORS_PROXY_URL` або `VITE_WASM_*_URL` під час збірки, CSP автоматично дозволяє ці origin, додаткове налаштування не потрібне. +- Для URL на `cdn.jsdelivr.net` `script-src` дозволяє лише точну версійну папку пакета, наприклад `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, а не весь CDN. jsDelivr віддає будь-який публічний пакет npm або репозиторій GitHub, тож дозвіл усього хоста дав би змогу запускати будь-який із них на вашому екземплярі. URL на будь-яких інших хостах дозволяються за origin. +- Якщо ви налаштовуєте власні URL WASM під час _роботи_ через сторінку «Додаткові налаштування» у застосунку, ці origin **не** потрапляють до CSP, і браузер блокуватиме запити до них. Це також стосується іншої версії того самого пакета на `cdn.jsdelivr.net`, бо дозволено лише версію, задану під час збірки. Налаштування під час роботи призначене для експериментів; для постійних власних URL задайте відповідний build arg `VITE_*`. +- Ізольовані розгортання, що перевизначають усі три значення `VITE_WASM_*_URL`, також позбуваються цих папок пакетів `cdn.jsdelivr.net` у CSP (кожне типове значення замінюється, а не доповнюється). Типові значення Tesseract OCR на `cdn.jsdelivr.net` залишаються в політиці, доки ви також не задасте три значення `VITE_TESSERACT_*`. Так само задання `VITE_CORS_PROXY_URL` замінює публічне типове значення `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP містить `'unsafe-eval'` у `script-src`, тому що runtime LibreOffice WASM (використовується інструментами конвертації Word/Excel/PowerPoint) і бібліотека зображень wasm-vips (використовується для PDF у TIFF) компілюють внутрішній диспетчерський код через `new Function()`. Його видалення зламало б ці інструменти. Якщо ви збираєте в `SIMPLE_MODE` (без LibreOffice) і не потребуєте PDF у TIFF, можна вручну відредагувати згенерований `security-headers.conf`, прибравши `'unsafe-eval'` для суворішої політики. + +Для OCR залиште змінні `VITE_TESSERACT_*` порожніми, щоб використовувати типові онлайн-ресурси, або задайте всі три разом для самостійного/офлайн OCR. Часткові перевизначення OCR відхиляються, бо worker, основний runtime і каталог traineddata мають збігатися. Для повністю офлайн-виводу пошукового PDF також задайте `VITE_OCR_FONT_BASE_URL`, щоб шрифти текстового шару OCR завантажувалися з вашого внутрішнього сервера, а не з публічних URL шрифтів Noto. + +`VITE_DEFAULT_LANGUAGE` задає мову інтерфейсу для нових відвідувачів. Підтримувані значення: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Користувачі й далі можуть змінювати мову: це змінює лише типове значення. + +Приклад: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Власний брендинг + +Замініть типовий логотип BentoPDF, назву та текст футера на свої. Помістіть файл логотипа в папку `public/` (або використайте наявне зображення), а потім передайте змінні брендингу під час збірки: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Брендинг працює і в повному режимі, і в Simple Mode, і його можна поєднувати з усіма іншими параметрами збірки. + +### Вимкнення окремих інструментів + +Ховайте інструменти з інтерфейсу з міркувань відповідності вимогам або безпеки. Вимкнені інструменти прибираються з головної сторінки, результатів пошуку, клавіатурних скорочень і конструктора робочих процесів. Прямий доступ за URL показує сторінку "інструмент недоступний". + +ID інструмента це URL сторінки без `.html`. Наприклад, якщо інструмент розташований за адресою `bentopdf.com/edit-pdf.html`, ID це `edit-pdf`. + +#### Як знайти ID інструментів + +Найпростіше: відкрийте будь-який інструмент у BentoPDF і подивіться на URL. Остання частина шляху (без `.html`) це ID інструмента. + +
+Повний список ID інструментів + +**Редагування й анотації:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Конвертація в PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Конвертація з PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Організація й керування:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Оптимізація й відновлення:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Безпека:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Варіант 1: під час збірки (build arg Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Це вшиває список вимкнених інструментів у JavaScript-бандл. Для зміни потрібне перезбирання. + +#### Варіант 2: під час роботи (config.json) + +Змонтуйте файл `config.json` у каталог, що віддається, перезбирання не потрібне: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Або з Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Обидва способи можна поєднувати: списки об'єднуються. Якщо інструмент є в будь-якому з них, його вимкнено. + +#### Вимкнення функцій редактора + +Ви також можете вимкнути окремі функції всередині PDF-редактора (наприклад, редагування (redaction), анотації, форми), не вимикаючи весь інструмент редактора. Додайте `editorDisabledCategories` до `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Повний список категорій редактора + +**Масштаб:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Анотації:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Фігури:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Форми:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Приховування даних:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Документ:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Сторінка:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Панель:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Інструменти:** `tools`, `pan`, `pointer`, `capture` + +**Виділення:** `selection`, `selection-copy` + +**Історія:** `history`, `history-undo`, `history-redo` + +
+ +Категорії ієрархічні: вимкнення батьківської (наприклад, `annotation`) вимикає всі її дочірні. + +### Вимкнення лічильника зірок GitHub + +Навігаційна панель показує актуальну кількість зірок GitHub, яку отримують з `api.github.com` під час завантаження сторінки. Це єдиний зовнішній запит, що не обслуговує жодну функцію PDF. Вимкніть його під час збірки, щоб прибрати код отримання з бандла та `api.github.com` із Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Збірки Simple Mode (`bentopdf-simple`) завжди пропускають лічильник зірок: цей прапорець потрібен лише для Commercial build або власних повних збірок. + +### Власні URL WASM (ізольовані / самостійно розгорнуті середовища) + +> [!IMPORTANT] +> URL WASM вшиваються в JavaScript **під час збірки**. Файли WASM завантажує **браузер користувача** під час роботи: Docker не завантажує їх під час збірки. Для ізольованих мереж потрібно розмістити файли WASM на внутрішньому сервері, доступному для браузерів. + +**Повний процес для ізольованого середовища:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Для `--ocr-languages` використовуйте коди, які виводить `bash scripts/prepare-airgap.sh --list-ocr-languages`, або шукайте за назвою через `bash scripts/prepare-airgap.sh --search-ocr-language `. Коли ви збираєте з обмеженим набором мов OCR, передайте ті самі коди в `VITE_TESSERACT_AVAILABLE_LANGUAGES`, щоб застосунок показував лише вбудовані мови. Для повного офлайн-виводу OCR також розмістіть вбудований каталог `ocr-fonts/` і вкажіть на нього `VITE_OCR_FONT_BASE_URL`. + +Задайте змінній порожній рядок, щоб вимкнути відповідний модуль (користувачі мають налаштувати його вручну через «Додаткові налаштування»). + +## Власний порт + +За замовчуванням BentoPDF слухає порт `8080` усередині контейнера. Щоб його змінити, задайте змінну середовища `PORT` під час запуску: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Змінна | Опис | Типове значення | +| ------ | ------------------------------------ | --------------- | +| `PORT` | Порт, який слухає Nginx у контейнері | `8080` | + +Це працює і зі стандартним, і з nonroot Dockerfile. + +## Власний ID користувача (PUID/PGID) + +Для середовищ, які вимагають запуску від конкретного користувача без прав root (NAS-пристрої, Kubernetes із контекстами безпеки, організаційні політики), BentoPDF надає окремий Dockerfile з підтримкою PUID/PGID у стилі LSIO. + +### Збірка і запуск + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Змінні середовища + +| Змінна | Опис | Типове значення | +| -------------- | -------------------------- | --------------- | +| `PUID` | ID користувача для запуску | `1000` | +| `PGID` | ID групи для запуску | `1000` | +| `PORT` | Порт, який слухає Nginx | `8080` | +| `DISABLE_IPV6` | Вимкнути слухача IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Як це працює + +Контейнер запускається від root, створює користувача із заданими PUID/PGID, налаштовує власника для всіх каталогів із правом запису, а потім скидає привілеї за допомогою `su-exec`. Процес nginx повністю працює від указаного вами користувача. + +> [!NOTE] +> Стандартний `Dockerfile` використовує `nginx-unprivileged` (UID 101) і рекомендований для більшості розгортань. Використовуйте `Dockerfile.nonroot` лише тоді, коли потрібен конкретний UID/GID. + +> [!WARNING] +> PUID/PGID не можуть бути `0` (root). Точка входу перевіряє вхідні дані та завершиться з помилкою для недійсних значень. + +## З Traefik (зворотний проксі) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## З Caddy (зворотний проксі) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Обмеження ресурсів + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (інтеграція із systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) дає змогу запускати контейнери Podman як сервіси systemd. Це ідеально для робочих розгортань на системах Linux. + +### Базове налаштування Quadlet + +Створіть файл юніта контейнера в `~/.config/containers/systemd/bentopdf.container` (користувацький) або `/etc/containers/systemd/bentopdf.container` (системний): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Увімкнення і запуск + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Для розгортання на рівні системи використовуйте `systemctl` без прапорця `--user` і помістіть файл у `/etc/containers/systemd/`. + +### Quadlet із перевіркою стану + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Автоматичне оновлення з Quadlet + +Podman може автоматично оновлювати контейнери, коли з'являються нові образи: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Налаштування мережі Quadlet + +Для власної конфігурації мережі створіть файл мережі `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Потім послайтеся на нього у файлі контейнера: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Оновлення + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/uk/self-hosting/hostinger.md b/docs/uk/self-hosting/hostinger.md new file mode 100644 index 00000000..8c4252b2 --- /dev/null +++ b/docs/uk/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Розгортання на Hostinger + +[Hostinger](https://hostinger.com) це популярний провайдер спільного хостингу. Цей посібник описує розгортання BentoPDF на спільному хостингу Hostinger. + +## Вимоги + +- Тарифний план Hostinger з доступом до файлового менеджера +- Локально встановлений Node.js для збірки + +## Крок 1: зберіть проєкт + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Зібрані файли будуть у папці `dist`. + +## Крок 2: завантажте на Hostinger + +### Розгортання на кореневому домені + +1. Увійдіть у свій акаунт Hostinger +2. Перейдіть до **File Manager** → **public_html** +3. **Видаліть** усі наявні файли (за потреби зробіть резервну копію) +4. **Завантажте** весь вміст локальної папки `dist` до `public_html` + +### Розгортання в підкаталозі + +Якщо розгортаєте в підкаталозі (напр., `yourdomain.com/pdf-tools/`): + +1. Зберіть із правильним базовим URL: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Створіть папку в Hostinger: + - Перейдіть до **File Manager** → **public_html** + - Створіть нову папку: `pdf-tools` +3. Завантажте весь вміст `dist` до `public_html/pdf-tools/` + +## Крок 3: створіть файл .htaccess + +Створіть файл `.htaccess` у корені вашої папки розгортання (`public_html` або `public_html/pdf-tools/`): + +::: warning Важливо +Для розгортання в підкаталозі змініть `RewriteBase /` на `RewriteBase /pdf-tools/` (або назву вашої папки). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Приклад .htaccess для підкаталогу + +Для `yourdomain.com/pdf-tools/` змініть ці рядки: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Усунення несправностей + +### Файли WASM не завантажуються + +Переконайтеся, що MIME-типи правильно задано в `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Інструменти LibreOffice не працюють + +Заголовки безпеки критично важливі для SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Якщо заголовки не застосовуються, зверніться до підтримки Hostinger, щоб увімкнути `mod_headers`. + +### Помилки 404 під час оновлення сторінки + +Переконайтеся, що правило розширення `.html` і мовні маршрути налаштовано правильно. BentoPDF використовує статичні HTML-файли, а не маршрутизацію SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Ліміти завантаження файлів + +Hostinger може мати обмеження розміру файлів. Якщо масове завантаження не вдається, завантажуйте файли WASM окремо. diff --git a/docs/uk/self-hosting/index.md b/docs/uk/self-hosting/index.md new file mode 100644 index 00000000..661d1940 --- /dev/null +++ b/docs/uk/self-hosting/index.md @@ -0,0 +1,538 @@ +# Посібник із самостійного розміщення + +BentoPDF можна розмістити на власній інфраструктурі. Цей посібник описує різні варіанти розгортання. + +## Швидкий старт із Docker / Podman + +Найшвидший спосіб розмістити BentoPDF самостійно: + +> [!TIP] +> BentoPDF постачається у двох збірках: +> +> - **Збірка для самостійного розміщення** (Self-Hosted): `ghcr.io/alam00000/bentopdf-simple:latest`. Усі PDF-інструменти, **без** маркетингового оформлення (без hero-блоку, FAQ, відгуків і футера). Використовуйте її для внутрішніх розгортань у команді чи організації. Це **не** урізана "lite"-версія. +> - **Комерційна збірка** (Commercial): `ghcr.io/alam00000/bentopdf:latest`. Повний маркетинговий сайт, який використовує сам bentopdf.com і власники комерційної ліцензії з публічними розгортаннями. +> +> Якщо вагаєтеся, беріть збірку для самостійного розміщення. + +> [!IMPORTANT] +> Перетворення офісних файлів потребує `SharedArrayBuffer`, а отже застосунок має бути і ізольованим між походженнями (cross-origin isolated), і обслуговуватися з безпечного контексту. Офіційний образ уже надсилає потрібні заголовки COOP/COEP, але браузери все одно вимикають `SharedArrayBuffer` на звичайних HTTP-адресах локальної мережі, як-от `http://192.168.x.x`. +> +> Використовуйте `http://localhost` лише для тестування на одному пристрої. Якщо користувачі відкривають BentoPDF через LAN IP або ім’я хоста, налаштуйте HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Або з Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Запустіть BentoPDF як службу systemd. Створіть `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Повну документацію щодо Quadlet дивіться в [посібнику з розгортання Docker](/uk/self-hosting/docker). + +## Збірка з вихідного коду + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Параметри конфігурації + +### Збірка для самостійного розміщення (Simple Mode) + +Збірка для самостійного розміщення (образ `bentopdf-simple`, також званий Simple Mode) **функціонально ідентична** комерційній збірці: усі PDF-інструменти на місці й працюють однаково. Вона лише приховує маркетингове оформлення, яке має сенс тільки на самому bentopdf.com або в комерційному публічному розгортанні. **Це не урізана чи "lite"-версія.** + +**Що приховує збірка для самостійного розміщення** (лише косметика, жодні функції PDF не вилучаються): + +- Панель навігації, hero-секцію, секцію переваг, FAQ, відгуки, футер +- Змінює заголовок сторінки на "PDF інструменти" + +**Що зберігає збірка для самостійного розміщення** (усе, що справді працює з PDF): + +- Усі PDF-інструменти (об’єднання, розділення, редагування, підпис, OCR, перетворення офісних файлів тощо) +- Підтримку власного брендингу, усі налаштування часу збірки та виконання + +Комерційна збірка (`ghcr.io/alam00000/bentopdf:latest`) живить сам bentopdf.com і використовується власниками комерційної ліцензії з публічними розгортаннями. Вона додає hero-блок, FAQ, відгуки та футер, які не мають сенсу у внутрішньому інструменті. + +Якщо ви розміщуєте BentoPDF для своєї команди, організації або як внутрішній інструмент, беріть збірку для самостійного розміщення: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Повну інформацію дивіться в [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md). + +### Комерційна збірка (публічні розгортання з вашим брендом) + +Комерційна збірка (образ `bentopdf` без суфікса `-simple`) живить сам bentopdf.com. Вона містить повний маркетинговий сайт (hero, переваги, FAQ, відгуки, футер) на додачу до всіх PDF-інструментів. Використовуйте цю збірку, коли хочете **розгорнути BentoPDF як публічний PDF-сервіс під власним брендом**, наприклад: + +- Ви запускаєте BentoPDF як хмарний сервіс (SaaS) для кінцевих користувачів на власному домені +- Вам потрібен досвід лендингу (маркетингові секції + інструменти), а не лише голий набір інструментів +- Ви власник комерційної ліцензії та вбудовуєте BentoPDF у комерційний продукт + +**Запуск як є** (бренд BentoPDF, зручно для перегляду збірки): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Збірка з власним брендом** (типовий комерційний сценарій): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Усі інші параметри часу збірки (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, перевизначення URL для WASM тощо) працюють так само, як і в збірці для самостійного розміщення. + +::: warning Ліцензування +Запуск комерційної збірки дозволений за будь-яким із двох варіантів ліцензії BentoPDF: + +- **AGPL-3.0** (безкоштовно): дозволено, якщо ваше розгортання публікує повний вихідний код під AGPL, включно з будь-якими змінами брендингу та навколишньою бізнес-логікою. +- **Комерційна ліцензія** ($79 довічно): потрібна для закритих/пропрієтарних розгортань, де ви не відкриваєте вихідний код свого форка з брендингом чи бізнес-код. + +Повне порівняння дивіться на [сторінці ліцензування](https://www.bentopdf.com/licensing). WASM-модулі під AGPL (PyMuPDF, Ghostscript, CoherentPDF) завантажуються з CDN під час виконання, тому вони не потрапляють у ваш образ і не змінюють вашого ліцензійного статусу. +::: + +### Базовий URL + +Розгортання в підкаталозі: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Власний брендинг + +Замініть стандартний логотип, назву й текст футера BentoPDF на власні під час збірки: + +| Змінна | Опис | За замовчуванням | +| ------------------ | ------------------------------------ | --------------------------------------- | +| `VITE_BRAND_NAME` | Назва бренду в заголовку та футері | `BentoPDF` | +| `VITE_BRAND_LOGO` | Шлях до логотипа відносно `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Власний текст футера/авторських прав | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Або через Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Брендинг працює і в повному режимі, і в Simple Mode та поєднується з усіма іншими параметрами часу збірки (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Вимкнення окремих інструментів + +Приховуйте окремі інструменти з міркувань відповідності вимогам або безпеки. Вимкнені інструменти вилучаються з головної сторінки, пошуку, ярликів, конструктора робочих процесів і прямого доступу за URL. + +Ідентифікатори інструментів є URL сторінки без `.html`: відкрийте будь-який інструмент і подивіться на URL (наприклад, `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Під час збірки** (вбудовується в бандл): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Під час виконання** (без перебудови, змонтуйте `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Обидва способи можна поєднувати: списки об’єднуються. + +Також можна вимкнути окремі функції всередині редактора PDF (наприклад, редагування вмісту) без вимкнення всього інструмента, додавши `editorDisabledCategories` до `config.json`. Повний перелік категорій дивіться в [посібнику з Docker](/uk/self-hosting/docker#вимкнення-функціи-редактора). + +## Посібники з розгортання + +Виберіть свою платформу: + +- [Vercel](/uk/self-hosting/vercel) +- [Netlify](/uk/self-hosting/netlify) +- [Cloudflare Pages](/uk/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/uk/self-hosting/aws) +- [Hostinger](/uk/self-hosting/hostinger) +- [Nginx](/uk/self-hosting/nginx) +- [Apache](/uk/self-hosting/apache) +- [Docker](/uk/self-hosting/docker) +- [Kubernetes](/uk/self-hosting/kubernetes) +- [CORS-проксі](/uk/self-hosting/cors-proxy) - потрібен для цифрових підписів + +## Поширені проблеми + +### Перетворення Word / ODT / Excel / PowerPoint у PDF зависає (SharedArrayBuffer недоступний) + +**Симптом**: перетворення документів через LibreOffice (Word, ODT, Excel, PowerPoint у PDF) зависає приблизно на 55% або не запускається. У консолі браузера може бути: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...або `window.crossOriginIsolated` повертає `false`, або компіляція WASM повідомляє `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Причина**: LibreOffice WASM потребує `SharedArrayBuffer`, який браузер вмикає лише тоді, коли сторінка **ізольована між походженнями** І обслуговується з **безпечного контексту**. Тобто мають виконуватися дві умови: + +1. Кожна відповідь містить обидва заголовки: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Сторінка обслуговується через `https://...` або `http://localhost`. Звичайний HTTP на LAN IP (наприклад, `http://192.168.x.x`) безпечним НЕ вважається: браузери вимикають там `SharedArrayBuffer`. + +Невідповідність `00 61 73 6d / 1f 8b 08 08` є окремим підсимптомом: у попередньо стиснутих файлів `.wasm.gz` / `.data.gz` відсутній заголовок відповіді `Content-Encoding: gzip`, тож браузер отримує сирі байти gzip замість розпакованого WASM. + +**Рішення**: точну конфігурацію дивіться в посібнику для вашої платформи: + +- [Nginx →](/uk/self-hosting/nginx#не-працює-перетворення-word-odt-excel-у-pdf) +- [Apache →](/uk/self-hosting/apache#конвертація-word-odt-excel-у-pdf-не-працює) +- [AWS S3 + CloudFront →](/uk/self-hosting/aws#крок-3b-політика-заголовків-відповіді-обов-язково-для-libreoffice-wasm) +- [Cloudflare Pages →](/uk/self-hosting/cloudflare#фаил-конфігураціі) (файл `_headers`) +- [Netlify →](/uk/self-hosting/netlify#перетворення-word-odt-excel-у-pdf-зависає-на-55) (`netlify.toml`) +- [Vercel →](/uk/self-hosting/vercel#не-працює-перетворення-word-odt-excel-у-pdf) (`vercel.json`) +- [Hostinger →](/uk/self-hosting/hostinger#інструменти-libreoffice-не-працюють) (`.htaccess`) +- [Kubernetes →](/uk/self-hosting/kubernetes#як-переконатися-що-заголовки-sharedarraybuffer-працюють-ingress-gateway) +- **Docker**: обробляється автоматично вбудованою конфігурацією nginx, жодних дій не потрібно. + +**Перевірка**: відкрийте консоль DevTools на будь-якій сторінці BentoPDF і виконайте: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Якщо сторінка працює через HTTPS або `http://localhost` І обидва заголовки COEP/COOP присутні в кожній відповіді, обидві перевірки пройдуть. Якщо ви на `http://192.168.x.x` чи іншому не-loopback HTTP-походженні, налаштуйте HTTPS: рішення лише через заголовки не існує. + +### Файли `.mjs` віддаються як `application/octet-stream` + +**Симптом**: Sign PDF / Form Filler / деякі інші інструменти показують порожній переглядач або не завантажуються. Консоль браузера повідомляє: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Причина**: у вашого вебсервера або зворотного проксі немає зіставлення MIME-типу для файлів `.mjs` (вбудований PDF-переглядач постачає ES-модулі з таким розширенням). Багато стандартних конфігурацій серверів за замовчуванням віддають невідомі розширення як `application/octet-stream`, і браузери відмовляються виконувати їх як ES-модулі. + +**Рішення**: точний фрагмент дивіться в посібнику для вашої платформи: + +- [Nginx →](/uk/self-hosting/nginx#sign-pdf-або-form-filler-показує-порожніи-переглядач-помилка-mime-для-mjs) +- [Apache →](/uk/self-hosting/apache#sign-pdf-або-form-filler-показує-порожніи-переглядач-помилка-mime-для-mjs) +- [AWS S3 + CloudFront →](/uk/self-hosting/aws#крок-2-зберіть-і-завантажте) (дивіться `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/uk/self-hosting/kubernetes#помилки-mime-типу-mjs-порожніи-iframe-у-sign-pdf-form-filler) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: обробляється автоматично, жодних дій не потрібно. + +**Перевірка**: відкрийте DevTools → вкладка Network, знайдіть запит `.mjs`, що завершився помилкою, і перевірте заголовок відповіді `Content-Type`. Він має бути `application/javascript`. Якщо там досі `application/octet-stream`, зовнішній зворотний проксі чи CDN, можливо, повторно визначає тип: перевірте кожен рівень у ланцюжку обслуговування. + +## Конфігурація WASM (компоненти під AGPL) + +BentoPDF **не вбудовує** бібліотеки обробки під ліцензією AGPL у свій вихідний код, але **попередньо налаштовує URL-адреси CDN**, тож усі функції працюють одразу, без ручного налаштування. + +::: tip Нульова конфігурація за замовчуванням +Починаючи з v2.0.0 модулі WASM попередньо налаштовані на завантаження з CDN jsDelivr через змінні середовища. Усі розширені функції працюють одразу без жодного налаштування користувачем. +::: + +| Компонент | Ліцензія | Функції | +| --------------- | -------- | ------------------------------------------------------------------ | +| **PyMuPDF** | AGPL-3.0 | Перетворення EPUB/MOBI/FB2/XPS, витяг зображень, витяг таблиць | +| **Ghostscript** | AGPL-3.0 | Перетворення в PDF/A, стиснення, вирівнювання нахилу, растеризація | +| **CoherentPDF** | AGPL-3.0 | Зміст, вкладення, об’єднання PDF із закладками | + +### Змінні середовища за замовчуванням + +Вони задані в `.env.production` і вбудовані в збірку: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Перевизначення URL для WASM + +Значення за замовчуванням можна перевизначити під час збірки для власних розгортань: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Щоб повністю вимкнути модуль (вимагається ручне налаштування користувачем через «Додаткові налаштування»), задайте його змінній порожній рядок. + +Для OCR або залиште всі змінні `VITE_TESSERACT_*` порожніми й використовуйте онлайнові ресурси за замовчуванням, або задайте URL воркера/ядра/мовних даних разом для самостійно розміщеного/офлайн OCR. Якщо ви вбудовуєте лише окремі мови OCR, також задайте `VITE_TESSERACT_AVAILABLE_LANGUAGES` тими самими кодами через кому, щоб інтерфейс пропонував лише встановлені мови, а непідтримувані вибори завершувалися описовою помилкою. Для повністю офлайн-створення PDF із пошуком також задайте `VITE_OCR_FONT_BASE_URL` як внутрішній каталог, що віддає вбудовані шрифти OCR. + +Користувачі також можуть будь-коли перевизначити ці значення через **Додаткові налаштування** в інтерфейсі: перевизначення, збережені в браузері, мають пріоритет над значеннями середовища за замовчуванням. + +### Розгортання в ізольованій мережі / офлайн + +Для мереж без доступу до інтернету (державні установи, охорона здоров’я, фінанси тощо). URL-адреси WASM вбудовуються в JavaScript під час **збірки**, а самі файли WASM завантажує **браузер користувача** під час виконання. Тому все потрібно підготувати на машині з інтернетом, а потім перенести в ізольовану мережу. + +#### Автоматичний скрипт (рекомендовано) + +Скрипт `prepare-airgap.sh` автоматизує весь процес: завантажує пакети WASM, збирає образ Docker і створює самодостатній пакет зі скриптом налаштування. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Це створює каталог із пакетом: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Перенесіть пакет в ізольовану мережу через USB, внутрішнє сховище артефактів або інший схвалений спосіб. Потім запустіть вбудований скрипт налаштування: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Скрипт налаштування завантажує образ Docker, розпаковує файли WASM і за бажанням запускає контейнер. + +**Параметри скрипта:** + +| Прапорець | Опис | За замовчуванням | +| ------------------------------ | ----------------------------------------------------------------- | ---------------------------------------- | +| `--wasm-base-url ` | Де внутрішньо розміщуватимуться WASM | _(обов’язково, запитується, якщо немає)_ | +| `--image-name ` | Тег образу Docker | `bentopdf` | +| `--output-dir ` | Каталог пакета на виході | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Увімкнути Simple Mode | вимк. | +| `--base-url ` | Базовий URL підкаталогу (наприклад, `/pdf/`) | `/` | +| `--language ` | Мова інтерфейсу за замовчуванням (наприклад, `fr`, `de`) | _(немає)_ | +| `--brand-name ` | Власна назва бренду | _(немає)_ | +| `--brand-logo ` | Шлях до логотипа відносно `public/` | _(немає)_ | +| `--footer-text ` | Власний текст футера | _(немає)_ | +| `--ocr-languages ` | Мови OCR для включення, через кому | `eng` | +| `--list-ocr-languages` | Вивести підтримувані коди й назви OCR та вийти | вимк. | +| `--search-ocr-language ` | Пошук кодів OCR за назвою або абревіатурою | вимк. | +| `--dockerfile ` | Dockerfile для використання | `Dockerfile` | +| `--skip-docker` | Пропустити збірку й експорт Docker | вимк. | +| `--skip-wasm` | Пропустити завантаження WASM (повторно використати наявні `.tgz`) | вимк. | + +Інтерактивний запит також приймає `list` для виводу повного списку підтримуваних кодів Tesseract і `search ` для пошуку збігів, наприклад `search german` або `search chi`. + +::: warning Вимога одного походження +Файли WASM мають обслуговуватися з **того самого походження**, що й застосунок BentoPDF. Веб-воркери використовують `importScripts()`, який не може завантажувати скрипти з іншого походження. Наприклад, якщо BentoPDF працює на `https://internal.example.com`, базовий URL WASM також має бути `https://internal.example.com/wasm`. +::: + +#### Ручні кроки + +
+Якщо ви хочете зробити все вручну без скрипта + +**Крок 1: Завантажте пакети WASM і OCR** (на машині з інтернетом) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Крок 2: Зберіть образ Docker із внутрішніми URL** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Крок 3: Експортуйте образ Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Крок 4: Перенесіть в ізольовану мережу** + +Скопіюйте через USB, внутрішнє сховище артефактів або інший схвалений спосіб передачі: + +- `bentopdf.tar`: образ Docker +- П’ять пакетів `.tgz` WASM/OCR з кроку 1 +- Каталог `tesseract-langdata/` з кроку 1 +- Каталог `ocr-fonts/` з кроку 1 + +**Крок 5: Налаштуйте всередині ізольованої мережі** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Переконайтеся, що файли доступні за URL-адресами, налаштованими на кроці 2, зокрема `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` і `.../ocr/fonts`. + +
+ +::: info Збираєте з вихідного коду замість Docker? +Задайте змінні в `.env.production` перед запуском `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Розміщення власного WASM-проксі + +Якщо потрібно віддавати файли WASM під AGPL із правильними заголовками CORS, можна розгорнути простий проксі. Приклад реалізації дивіться в [посібнику Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md). + +::: tip Навіщо розділення? +Таке розділення забезпечує: + +- Чітку юридичну відповідність для комерційних користувачів +- Збереження ядра BentoPDF під його подвійною ліцензією (AGPL-3.0 / Commercial) +- Завантаження файлів WASM під час виконання, а не вбудовування у вихідний код + ::: + +## Системні вимоги + +| Вимога | Мінімум | +| ------- | ------------------------------- | +| Сховище | ~100 МБ (ядро без модулів AGPL) | +| RAM | 512 МБ | +| CPU | Будь-який сучасний процесор | + +::: tip +BentoPDF є статичним сайтом: база даних чи серверна частина не потрібні! +::: diff --git a/docs/uk/self-hosting/kubernetes.md b/docs/uk/self-hosting/kubernetes.md new file mode 100644 index 00000000..c66341e1 --- /dev/null +++ b/docs/uk/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Розгортання в Kubernetes + +Kubernetes може бути надмірним для статичного сайту, але він чудово підходить, якщо ви вже стандартизувалися на Helm + GitOps. + +> [!IMPORTANT] +> **Обов’язкові заголовки для перетворення офісних файлів** +> +> Інструменти на основі LibreOffice (перетворення Word, Excel, PowerPoint) потребують таких HTTP-заголовків для підтримки `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Офіційні образи BentoPDF на nginx містять ці заголовки. У Kubernetes **контролери Ingress/Gateway також є зворотними проксі**, тож переконайтеся, що ці заголовки зберігаються (або додайте їх на межі). + +## Вимоги + +- Кластер Kubernetes +- Helm v3 +- Образ BentoPDF на nginx (наприклад, `ghcr.io/alam00000/bentopdf:`), що обслуговує **порт 8080** + +## Розгортання через Helm + +### Встановлення з цього репозиторію (локальний чарт) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Встановлення з GHCR (OCI-чарт) + +Якщо чарт опубліковано в GHCR як артефакт OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Відкриття доступу + +### Port-forward (швидка перевірка) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (необов’язково) + +Увімкніть Ingress (приклад для nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (необов’язково) + +Цей чарт підтримує Gateway API `Gateway` + `HTTPRoute`. + +Приклад (оператор Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Як переконатися, що заголовки SharedArrayBuffer працюють (Ingress/Gateway) + +### Що "має" відбуватися + +Конфігурація nginx у BentoPDF встановлює потрібні заголовки відповіді. Більшість контролерів Ingress/Gateway **передають заголовки відповіді вихідного сервера без змін**. + +### Що може це зламати + +- Політика контролера/межі, що **перевизначає** або **видаляє** заголовки відповіді +- Проміжне ПЗ "security headers", яке встановлює інші значення COOP/COEP + +### Як перевірити + +Виконайте це для свого публічного endpoint: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Ви маєте побачити: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Якщо ваш контролер Ingress їх не зберігає + +Додайте заголовки на межі (залежить від контролера). Приклад для **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Помилки MIME-типу `.mjs` (порожній iframe у Sign PDF / Form Filler) + +Якщо консоль браузера показує `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` для запиту `.mjs`, то контролер Ingress/Gateway перед nginx BentoPDF підмінює заголовок `Content-Type` вихідного сервера на `application/octet-stream`. + +nginx в образі BentoPDF уже віддає `.mjs` як `application/javascript`. Рішення: заборонити контролеру видаляти/замінювати його. Для nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Або скористайтеся фільтром `ResponseHeaderModifier` у Gateway API, щоб встановити `Content-Type: application/javascript` для шляхів `.mjs`. Перевірте у DevTools → вкладка Network: невдалий запит `.mjs` тепер має показувати `content-type: application/javascript`. + +### Якщо ви використовуєте Gateway API і хочете примусово додати заголовки + +Gateway API підтримує фільтр `ResponseHeaderModifier`. Його можна підключити в `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Підтримка окремих фільтрів залежить від вашого контролера Gateway; якщо фільтр ігнорується, додайте заголовки на рівні межі/контролера. + +## Вимкнення окремих інструментів + +Використайте ConfigMap, щоб вимкнути інструменти під час виконання без перебудови образу: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Змонтуйте його в каталог, що обслуговується: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +Ідентифікатори інструментів є URL сторінки без `.html`: відкрийте будь-який інструмент і подивіться на URL (наприклад, `edit-pdf`, `merge-pdf`, `compress-pdf`). Вимкнені інструменти приховуються на головній сторінці, у пошуку, ярликах, конструкторі робочих процесів і при прямому доступі за URL. Повний перелік параметрів дивіться в [посібнику з Docker](/uk/self-hosting/docker#вимкнення-окремих-інструментів). diff --git a/docs/uk/self-hosting/netlify.md b/docs/uk/self-hosting/netlify.md new file mode 100644 index 00000000..871a4a3b --- /dev/null +++ b/docs/uk/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Розгортання у Netlify + +[Netlify](https://netlify.com) пропонує чудовий хостинг статичних сайтів із щедрим безкоштовним тарифом. + +## Розгортання в один клік + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Ручне розгортання + +### Крок 1: Підключіть репозиторій + +1. Увійдіть у [Netlify](https://app.netlify.com) +2. Натисніть "Add new site" → "Import an existing project" +3. Підключіть свій акаунт GitHub +4. Виберіть свій форк BentoPDF + +### Крок 2: Налаштуйте параметри збірки + +| Параметр | Значення | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Крок 3: Розгортання + +Натисніть "Deploy site" і дочекайтеся збірки. + +## Файл конфігурації + +Створіть `netlify.toml` у корені проєкту: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Важливо +Заголовки `Cross-Origin-Embedder-Policy` і `Cross-Origin-Opener-Policy` потрібні для перетворення Word/ODT/Excel/PowerPoint у PDF. Без них `SharedArrayBuffer` недоступний, і рушій LibreOffice WASM не зможе ініціалізуватися. + +Заголовки `Content-Encoding: gzip` для файлів `.wasm.gz` і `.data.gz` наказують браузеру автоматично їх розпакувати. Без них браузер отримує сирі байти gzip, і компіляція WASM завершується помилкою. +::: + +## Змінні середовища + +Задайте їх у Site settings → Environment variables: + +| Змінна | Опис | +| ----------------------- | --------------------------------------------------------------------- | +| `SIMPLE_MODE` | Встановіть `true` для мінімальної збірки | +| `VITE_BRAND_NAME` | Власна назва бренду (замінює "BentoPDF") | +| `VITE_BRAND_LOGO` | Шлях до логотипа відносно `public/` (наприклад, `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Власний текст футера/авторських прав | +| `VITE_DEFAULT_LANGUAGE` | Мова інтерфейсу за замовчуванням (наприклад, `fr`, `de`, `es`) | + +## Власний домен + +1. Перейдіть до Site settings → Domain management +2. Натисніть "Add custom domain" +3. Дотримуйтеся інструкцій із налаштування DNS + +## Великі медіафайли + +Для великих файлів WASM розгляньте можливість увімкнути [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Усунення неполадок + +### Перетворення Word/ODT/Excel у PDF зависає на 55% + +Якщо перетворення документів зависає на 55%, відкрийте консоль DevTools і перевірте: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Якщо `crossOriginIsolated` дорівнює `false`, заголовки COEP/COOP з вашого `netlify.toml` не застосовуються. Переконайтеся, що файл лежить у корені проєкту, і розгорніть заново. + +Якщо в консолі з’являється `expected magic word 00 61 73 6d, found 1f 8b 08 08`, у файлів `.wasm.gz` відсутні заголовки `Content-Encoding: gzip`. Переконайтеся, що блоки `[[headers]]` для `soffice.wasm.gz` і `soffice.data.gz` є у вашому `netlify.toml`. + +### Збірка завершується помилкою + +Перевірте сумісність версії Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Повільне початкове завантаження + +Увімкніть оптимізацію ресурсів у Site settings → Build & deploy → Asset optimization. diff --git a/docs/uk/self-hosting/nginx.md b/docs/uk/self-hosting/nginx.md new file mode 100644 index 00000000..4d03d76c --- /dev/null +++ b/docs/uk/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Розгортання з Nginx + +Розмістіть BentoPDF на власному сервері за допомогою Nginx. + +## Вимоги + +- Сервер Ubuntu/Debian +- Встановлений Nginx +- SSL-сертифікат (рекомендовано: Let's Encrypt) + +## Крок 1: Зберіть проєкт + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Щоб налаштувати брендинг, задайте змінні середовища перед збіркою: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Крок 2: Скопіюйте файли + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Крок 3: Конфігурація Nginx + +Створіть `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Крок 4: Увімкніть сайт + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Крок 5: SSL через Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Розгортання в підкаталозі + +Щоб розмістити за адресою `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Зберіть із: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Налаштування продуктивності + +Додайте до `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Усунення неполадок + +### WASM не завантажується + +Переконайтеся, що MIME-тип задано: + +```nginx +types { + application/wasm wasm; +} +``` + +### Sign PDF або Form Filler показує порожній переглядач (помилка MIME для `.mjs`) + +Якщо консоль браузера показує: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...а запит, що завершується помилкою, закінчується на `.mjs`, то в nginx немає зіставлення `.mjs → application/javascript`. Вбудований PDF-переглядач (його використовують Sign PDF, Form Filler та кілька інших інструментів) постачає файли ES-модулів із розширенням `.mjs`, а стандартний `mime.types` nginx їх за замовчуванням не містить. + +Виправте це, додавши `mjs` до наявного рядка `application/javascript` у `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> НЕ додавайте _другий_ рядок `application/javascript`: nginx розбирає `mime.types` рядок за рядком, і діє лише одне зіставлення типу з розширенням, тож другий рядок у деяких версіях мовчки ігнорується. Відредагуйте наявний рядок, додавши `mjs` поруч із `js`. + +Або перевизначте локально всередині блоку server (без редагування глобального файлу): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Перезавантажте nginx після зміни: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Щоб підтвердити: у DevTools браузера → вкладка Network знайдіть запит `.mjs`, що завершився помилкою, і перевірте заголовок відповіді `Content-Type`. Тепер він має бути `application/javascript`, а не `application/octet-stream`. + +### Не працює перетворення Word/ODT/Excel у PDF + +LibreOffice WASM потребує `SharedArrayBuffer`, для якого потрібні заголовки `Cross-Origin-Embedder-Policy` і `Cross-Origin-Opener-Policy`. Також потрібен безпечний контекст, тож `http://localhost` підходить для локального тестування, а `http://192.168.x.x` та інші LAN-адреси зазвичай потребують HTTPS. Зверніть увагу, що директиви nginx `add_header` у блоці `location` **перевизначають** директиви `add_header` рівня server, а не поєднуються з ними. Кожен блок `location` із власним `add_header` має містити заголовки COEP/COOP. + +Перевірте так: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Якщо перед nginx стоїть зворотний проксі, переконайтеся, що він зберігає ці заголовки. + +### 502 Bad Gateway + +Перевірте журнали помилок Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/uk/self-hosting/vercel.md b/docs/uk/self-hosting/vercel.md new file mode 100644 index 00000000..601a01c8 --- /dev/null +++ b/docs/uk/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Розгортання у Vercel + +[Vercel](https://vercel.com) пропонує найпростіше розгортання статичних сайтів. + +## Розгортання в один клік + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Ручне розгортання + +### Крок 1: Створіть форк репозиторію + +Створіть форк [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) у своєму акаунті GitHub. + +### Крок 2: Імпортуйте у Vercel + +1. Перейдіть на [vercel.com/new](https://vercel.com/new) +2. Виберіть свій форк репозиторію +3. Налаштуйте проєкт: + +| Параметр | Значення | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Крок 3: Змінні середовища (необов’язково) + +Додайте їх за потреби: + +| Змінна | Опис | +| ----------------------- | --------------------------------------------------------------------- | +| `SIMPLE_MODE` | Встановіть `true` для мінімального інтерфейсу | +| `VITE_BRAND_NAME` | Власна назва бренду (замінює "BentoPDF") | +| `VITE_BRAND_LOGO` | Шлях до логотипа відносно `public/` (наприклад, `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Власний текст футера/авторських прав | +| `VITE_DEFAULT_LANGUAGE` | Мова інтерфейсу за замовчуванням (наприклад, `fr`, `de`, `es`) | + +### Крок 4: Розгортання + +Натисніть "Deploy" і дочекайтеся завершення збірки. + +## Власний домен + +1. Перейдіть до налаштувань проєкту +2. Відкрийте "Domains" +3. Додайте свій домен +4. Налаштуйте DNS відповідно до інструкцій + +## Обмеження + +::: warning Великі файли +Серверні функції Vercel мають ліміт 50 МБ. Оскільки BentoPDF є статичним сайтом, це не повинно вплинути на вас, але модулі WASM великі (загалом ~100 МБ). Переконайтеся, що вони віддаються з папки `/public`. +::: + +## Усунення неполадок + +### Тайм-аут збірки + +Якщо збірка завершується за тайм-аутом, спробуйте: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Помилка 404 після оновлення сторінки + +Додайте `vercel.json` для маршрутизації SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Не працює перетворення Word/ODT/Excel у PDF + +Перетворення через LibreOffice WASM потребують `SharedArrayBuffer`, для якого на всіх сторінках потрібні такі заголовки відповіді: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Попередньо стиснуті файли `.wasm.gz` і `.data.gz` також потребують `Content-Encoding: gzip`, щоб браузер їх розпакував. + +Додайте це до свого `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Щоб перевірити, відкрийте консоль DevTools і виконайте `console.log(window.crossOriginIsolated)`: має повернутися `true`. diff --git a/docs/uk/tools/add-attachments.md b/docs/uk/tools/add-attachments.md new file mode 100644 index 00000000..adff69ca --- /dev/null +++ b/docs/uk/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Додати вкладення +description: Вбудовуйте файли будь-якого типу в PDF на рівні документа або прикріплюйте їх до окремих сторінок. +--- + +# Додати вкладення + +Вбудуйте один або кілька файлів безпосередньо в PDF-документ. Вкладення можна додати на рівні документа (вони відображаються на панелі вкладень будь-якого PDF-переглядача) або прив’язати до окремих сторінок. + +## Як це працює + +1. Завантажте PDF, до якого потрібно додати файли. +2. У зоні для вкладень виберіть файли, які потрібно вбудувати (будь-якого типу). +3. Виберіть рівень вкладення: **Документ** (за замовчуванням) або **Сторінка**. +4. Якщо вибрано рівень сторінки, введіть діапазон сторінок (наприклад, `1-3` або `5`). +5. Натисніть кнопку обробки. Змінений PDF завантажиться з вбудованими файлами. + +## Можливості + +- Вкладення файлів будь-якого типу: зображення, таблиці, архіви, виконувані файли, усе що завгодно +- Розміщення вкладень на рівні документа або сторінки +- Кілька файлів можна додати за одну операцію +- Відображення назв і розмірів усіх вибраних вкладень +- Початковий вміст PDF зберігається, до нього лише додаються вбудовані файли + +## Параметри + +| Параметр | Опис | +| -------------------- | ---------------------------------------------------------------------------- | +| **Рівень документа** | Прикріплює файли до PDF загалом, доступні на панелі вкладень | +| **Рівень сторінки** | Прикріплює файли до окремих сторінок, які вказуються через діапазон сторінок | + +## Приклади використання + +- Додавання вихідних даних (файлів Excel, CSV) до PDF-звіту +- Прикріплення оригінальних зображень до PDF-портфоліо фотографа +- Вбудовування супровідних документів у договір або комерційну пропозицію +- Додавання додаткових матеріалів до окремих сторінок навчального посібника + +## Поради + +- Вкладення на рівні документа підтримуються більшістю PDF-переглядачів. Вкладення на рівні сторінки можуть не відображатися в усіх переглядачах. +- Обмеження розміру вкладень немає, але дуже великі вбудовані файли пропорційно збільшують розмір PDF. + +## Пов’язані інструменти + +- [Витяг вкладень](./extract-attachments) +- [Редагувати вкладення](./edit-attachments) +- [Об’єднати PDF](./merge-pdf) diff --git a/docs/uk/tools/add-blank-page.md b/docs/uk/tools/add-blank-page.md new file mode 100644 index 00000000..9b632a1c --- /dev/null +++ b/docs/uk/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Додати порожню сторінку +description: Вставляйте одну або кілька порожніх сторінок у будь-яке місце PDF-документа. +--- + +# Додати порожню сторінку + +Вставте порожні сторінки в PDF у вказаній позиції. Ви самі визначаєте, де розмістити порожні сторінки і скільки їх додати. + +## Як це працює + +1. Завантажте PDF-файл. Інструмент покаже кількість сторінок. +2. Введіть **позицію**, у яку потрібно вставити порожні сторінки. Використайте `0`, щоб вставити на самому початку, або загальну кількість сторінок, щоб додати в кінець. +3. Введіть **кількість** порожніх сторінок (за замовчуванням 1). +4. Натисніть кнопку обробки. Змінений PDF завантажиться з вставленими порожніми сторінками. + +## Можливості + +- Вставка в будь-яку позицію: на початок, у середину або в кінець документа +- Додавання кількох порожніх сторінок за одну операцію +- Підказка щодо позиції динамічно оновлюється відповідно до кількості сторінок завантаженого PDF +- Порожні сторінки стандартного розміру A4 + +## Приклади використання + +- Додавання порожньої розділової сторінки між частинами зібраного документа +- Вставка порожніх сторінок для коректного двостороннього друку +- Додавання місця для рукописних нотаток у роздрукованому навчальному посібнику +- Доповнення документа до мінімально потрібної кількості сторінок + +## Поради + +- Позиція `0` вставляє сторінки перед першою. Позиція, що дорівнює загальній кількості сторінок, додає їх після останньої. +- Якщо потрібно вставити в певну позицію вміст (а не лише порожні сторінки), скористайтеся [PDF мультиінструментом](./pdf-multi-tool), щоб вставити інший PDF після вказаної сторінки. + +## Пов’язані інструменти + +- [Упорядкувати PDF](./organize-pdf) +- [PDF мультиінструмент](./pdf-multi-tool) +- [Об’єднати PDF](./merge-pdf) diff --git a/docs/uk/tools/add-page-labels.md b/docs/uk/tools/add-page-labels.md new file mode 100644 index 00000000..7ff2fec1 --- /dev/null +++ b/docs/uk/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Додати нумерацію сторінок +description: Додавайте мітки сторінок PDF з римськими цифрами, буквеними префіксами, власною нумерацією та кількома правилами в одному документі. +--- + +# Додати нумерацію сторінок + +Мітки сторінок визначають, як номери сторінок відображаються в PDF-переглядачах (номер на панелі інструментів, а не надрукований на самій сторінці). Цей інструмент дає змогу призначати різні схеми нумерації різним діапазонам сторінок: римські цифри для вступної частини, десяткові числа для основного тексту, буквені додатки тощо. + +## Як це працює + +1. Завантажте PDF-файл. +2. З’явиться панель параметрів з одним правилом міток за замовчуванням. +3. Налаштуйте кожне правило: діапазон сторінок, стиль, необов’язковий префікс і початкове значення. +4. Натисніть **Додати правило**, щоб створити додаткові правила для інших розділів. +5. Натисніть **Додати нумерацію сторінок**, щоб застосувати всі правила й завантажити результат. + +## Параметри + +Кожне правило міток має такі налаштування: + +- **Діапазон сторінок** -- Сторінки, до яких застосовується правило. Залиште порожнім для всіх сторінок. Підтримуються діапазони на кшталт `1-4`, `7`, `odd` або `1-9,30-40`. +- **Стиль мітки** -- Десяткові арабські цифри, римські малі (i, ii, iii), римські великі (I, II, III), малі літери (a, b, c), великі літери (A, B, C) або без мітки (лише префікс). +- **Префікс мітки** -- Необов’язковий текст перед кожною міткою, наприклад "A-", щоб отримати мітки A-1, A-2, A-3. +- **Початкове значення** -- Число, з якого починається відлік. За замовчуванням 1. Встановіть 0 для нумерації з нуля. +- **Продовжувати нумерацію між розривними діапазонами** -- Увімкніть, якщо правило охоплює несуміжні сторінки (наприклад, `1-9,30-40` або `odd`) і нумерація має тривати послідовно. +- **Видалити наявні мітки сторінок** -- Увімкнено за замовчуванням. Очищає всі попередні мітки перед застосуванням нових правил. + +## Можливості + +- Кілька правил міток в одному документі для складних схем нумерації +- Шість стилів міток, що охоплюють усі стандартні системи нумерації +- Підтримка власних префіксів для нумерації за розділами +- Підтримка розривних діапазонів зі наскрізною нумерацією +- Можливість зберегти або видалити наявні мітки + +## Приклади використання + +- Римські цифри (i, ii, iii) для передмови книги й десяткові мітки для основного тексту +- Позначення сторінок додатків буквеними префіксами, як-от "A-1", "A-2", "B-1", "B-2" +- Виправлення міток сторінок у відсканованому документі, де фізичні номери сторінок не збігаються з порядком сторінок у PDF +- Нумерація з нуля для технічних документів + +## Поради + +- Мітки сторінок є метаданими, які PDF-переглядачі показують на навігаційній панелі. Вони не друкуються на самій сторінці. Для видимих номерів використовуйте [Нумерація сторінок](./page-numbers). +- Для цього інструмента потрібно налаштувати CoherentPDF (CPDF) у налаштуваннях WASM. Якщо його не налаштовано, вам буде запропоновано це зробити. + +## Пов’язані інструменти + +- [Нумерація сторінок](./page-numbers) +- [Нумерація Bates](./bates-numbering) +- [Редагувати закладки](./bookmark) diff --git a/docs/uk/tools/add-stamps.md b/docs/uk/tools/add-stamps.md new file mode 100644 index 00000000..758cff2e --- /dev/null +++ b/docs/uk/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Додати штампи +description: Додавайте зображення-штампи на сторінки PDF за допомогою вбудованої панелі анотацій із зазначенням імені користувача. +--- + +# Додати штампи + +Розміщуйте зображення-штампи на сторінках PDF за допомогою вбудованого переглядача з панеллю анотацій для штампів. Штампи можуть містити ваше ім’я, що корисно для процесів погодження, рецензування та маркування документів. + +## Як це працює + +1. Введіть своє ім’я в поле **Ім’я користувача для штампа**. Це ім’я відображатиметься на створених вами штампах. +2. Завантажте PDF-файл, клацнувши зону завантаження або перетягнувши файл у неї. +3. Відкриється редактор штампів із завантаженим документом у переглядачі. +4. За допомогою інструмента зображення-штампа на панелі виберіть і розмістіть штампи на будь-якій сторінці. +5. За потреби змініть положення та розмір штампів. +6. Натисніть **Зберегти PDF зі штампами**, щоб завантажити результат. + +## Можливості + +- Інтегрований PDF-переглядач із панеллю анотацій для штампів +- Зазначення імені користувача на створених штампах +- Розміщення зображень-штампів на будь-якій сторінці +- Позиціювання та зміна розміру перетягуванням +- Автоматичний підбір розміру переглядача за співвідношенням сторін сторінки +- Відображення назви й розміру файлу + +## Приклади використання + +- Додавання зображень-штампів "APPROVED" або "REVIEWED" до документів у процесі рецензування +- Розміщення зображень печатки компанії або нотаріального штампа на офіційних документах +- Маркування сторінок штампами "RECEIVED" з ім’ям рецензента +- Додавання штампів контролю якості до звітів про перевірку + +## Поради + +- Вкажіть ім’я користувача для штампа до завантаження PDF. Ім’я вбудовується в метадані штампа. +- Переглядач підбирає висоту за співвідношенням сторін першої сторінки PDF для зручного перегляду. +- Для текстових водяних знаків замість зображень-штампів скористайтеся інструментом [Додати водяний знак](./add-watermark). + +## Пов’язані інструменти + +- [Підписати PDF](./sign-pdf) +- [Додати водяний знак](./add-watermark) +- [Редактор PDF](./edit-pdf) diff --git a/docs/uk/tools/add-watermark.md b/docs/uk/tools/add-watermark.md new file mode 100644 index 00000000..6d9721a5 --- /dev/null +++ b/docs/uk/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Додати водяний знак +description: Наносьте текстові або графічні водяні знаки на сторінки PDF у візуальному редакторі з перетягуванням і попереднім переглядом наживо. +--- + +# Додати водяний знак + +Додавайте текстові або графічні водяні знаки на сторінки PDF за допомогою візуального редактора. Положення водяного знака можна задати перетягуванням прямо на попередньому перегляді, розмір змінюється кутовими маркерами, а також налаштовуються прозорість, поворот, шрифт і колір. Кожна сторінка може мати власне положення водяного знака, або ж один і той самий знак можна застосувати до всіх сторінок одразу. + +## Як це працює + +1. Завантажте PDF-файл. +2. Відкриється редактор із попереднім переглядом першої сторінки наживо та водяним знаком, який можна перетягувати. +3. Виберіть режим водяного знака **Текст** або **Зображення** кнопками-перемикачами. +4. Налаштуйте параметри водяного знака на бічній панелі. +5. Перетягніть водяний знак на попередньому перегляді в потрібне місце. Змінюйте розмір кутовими маркерами. +6. Переходьте між сторінками, щоб задати водяні знаки для кожної сторінки окремо, або залиште позначеним **Застосувати до всіх сторінок**. +7. Натисніть **Додати водяний знак**, щоб обробити файл і завантажити результат. + +## Параметри + +**Параметри текстового водяного знака:** + +- **Текст** -- Текст водяного знака (наприклад, "КОНФІДЕНЦІЙНО", "ЧЕРНЕТКА"). +- **Розмір шрифту** -- Від 10 до 200 пунктів. За замовчуванням 72. +- **Колір** -- Будь-який колір через вибір кольору. +- **Прозорість** -- Керування прозорістю від повністю прозорого до повністю непрозорого. +- **Поворот** -- Поворот тексту водяного знака від -180 до 180 градусів. + +**Параметри графічного водяного знака:** + +- **Завантаження зображення** -- Завантажте PNG, JPG або інший файл зображення для використання як водяного знака. +- **Прозорість** -- Керування прозорістю зображення. +- **Масштаб** -- Зміна розміру графічного водяного знака. + +**Параметри розташування:** + +- **Одиночний** -- Один водяний знак на сторінці, положення задається перетягуванням або готовими шаблонами позиції. +- **Мозаїка** -- Повторює водяний знак по всій сторінці діагональною сіткою, що відповідає куту повороту, тож знак покриває документ від краю до краю. +- **Горизонтальний проміжок** -- Відстань між плитками вздовж напрямку тексту у відсотках від ширини водяного знака (лише в режимі мозаїки). +- **Вертикальний проміжок** -- Відстань між рядами плиток у відсотках від висоти водяного знака (лише в режимі мозаїки). + +**Загальні параметри:** + +- **Застосувати до всіх сторінок** -- Якщо позначено, той самий водяний знак застосовується до кожної сторінки. Зніміть позначку, щоб задавати окремі водяні знаки для кожної сторінки. +- **Діапазон сторінок** -- Вкажіть, які сторінки отримають водяний знак (наприклад, "1-3, 5, 7-9" або "all"). + +## Можливості + +- Візуальне позиціювання перетягуванням на попередньому перегляді PDF наживо +- Зміна розміру водяного знака кутовими маркерами +- Текстовий і графічний режими водяного знака +- Одиночне розташування або мозаїка (повторення) на всій сторінці з регульованими проміжками +- Застосування до окремих сторінок або до всього документа +- Перехід між сторінками в попередньому перегляді +- Керування прозорістю та поворотом +- Фільтрація за діапазоном сторінок + +## Приклади використання + +- Позначення чернеток документів написом "ЧЕРНЕТКА" перед передачею на рецензію +- Додавання водяних знаків "КОНФІДЕНЦІЙНО" до конфіденційних фінансових звітів +- Брендування документів водяним знаком із логотипом компанії +- Нанесення "SAMPLE" на документацію до продуктів, яку надсилають потенційним клієнтам +- Додавання повідомлень про авторські права до поширюваних PDF-матеріалів + +## Поради + +- Для діагональних водяних знаків на всю сторінку встановіть поворот близько 45 градусів і збільште розмір шрифту. +- Режим мозаїки значно ускладнює повторне використання документа після обрізання, адже видалення одного знака залишає десятки інших. Зменште прозорість у режимі мозаїки, щоб текст під знаками залишався читабельним. +- Графічні водяні знаки з прозорим фоном (формат PNG) природніше поєднуються зі вмістом документа. +- Якщо потрібен різний текст водяного знака на різних сторінках, зніміть позначку "Застосувати до всіх сторінок" і переходьте від сторінки до сторінки. + +## Пов’язані інструменти + +- [Колонтитули](./header-footer) +- [Додати штампи](./add-stamps) +- [Нумерація Bates](./bates-numbering) +- [Підписати PDF](./sign-pdf) diff --git a/docs/uk/tools/adjust-colors.md b/docs/uk/tools/adjust-colors.md new file mode 100644 index 00000000..4a88b482 --- /dev/null +++ b/docs/uk/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Корекція кольору +description: Точно налаштовуйте яскравість, контраст, насиченість, відтінок, температуру, тонування, гамму та сепію у вашому PDF. +--- + +# Корекція кольору + +Повноцінний набір для колірної корекції PDF. Налаштовуйте вісім незалежних параметрів -- яскравість, контраст, насиченість, зсув відтінку, температуру, тонування, гамму та сепію -- з попереднім переглядом наживо, що оновлюється під час руху кожного повзунка. + +## Як це працює + +1. Завантажте PDF-файл. +2. Відкриється редактор із попереднім переглядом першої сторінки та панеллю колірних налаштувань. +3. Рухайте повзунки, щоб змінити кожен колірний параметр. Попередній перегляд оновлюється в реальному часі. +4. Натисніть **Скинути**, щоб повернути всі повзунки до початкових положень. +5. Натисніть **Застосувати**, щоб обробити всі сторінки й завантажити відкоригований PDF. + +## Параметри + +- **Яскравість** -- Висвітлення або затемнення всієї сторінки (від -100 до +100). +- **Контраст** -- Збільшення або зменшення різниці між світлими й темними ділянками (від -100 до +100). +- **Насиченість** -- Посилення або зменшення інтенсивності кольорів (від -100 до +100). Значення -100 дає відтінки сірого. +- **Зсув відтінку** -- Поворот колірного кола для рівномірного зсуву всіх кольорів. +- **Температура** -- Зсув кольорів у теплий (жовтий/оранжевий) або холодний (синій) бік. +- **Тонування** -- Додавання зеленого або пурпурного відтінку. +- **Гамма** -- Регулювання яскравості півтонів за допомогою гамма-кривої. Значення нижче 1.0 затемнюють півтони, а вище 1.0 висвітлюють їх. +- **Сепія** -- Класичний ефект сепії. Вищі значення дають інтенсивніший коричневий відтінок. + +## Можливості + +- Вісім незалежно регульованих колірних параметрів +- Попередній перегляд наживо, що миттєво реагує на рух повзунків +- Кнопка скидання для швидкого повернення до початкових значень +- Обробка всіх сторінок документа +- Працює з будь-яким вмістом PDF (текст, зображення, графіка) + +## Приклади використання + +- Освітлення темного скана або виправлення переекспонованих сторінок +- Зменшення насиченості кольорового документа для економії чорнила перед друком +- Застосування тону сепії для старовинного вигляду сертифікатів або нагород +- Корекція колірної температури фотографій, вбудованих у PDF +- Підвищення контрасту блідих або низькоякісних сканованих документів + +## Поради + +- Для швидкого перетворення на відтінки сірого перетягніть повзунок насиченості до -100. +- Повзунок гамми особливо корисний для покращення читабельності сканованих документів, де півтони надто темні або надто світлі. +- Як і інші інструменти ефектів зображення, цей інструмент растеризує кожну сторінку. Результат буде у вигляді зображень, тому текст не можна буде виділити. + +## Пов’язані інструменти + +- [Інвертувати кольори](./invert-colors) +- [Ефект сканера](./scanner-effect) +- [Колір фону](./background-color) diff --git a/docs/uk/tools/alternate-merge.md b/docs/uk/tools/alternate-merge.md new file mode 100644 index 00000000..37243d9d --- /dev/null +++ b/docs/uk/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Чергування та змішування сторінок +description: Об’єднуйте PDF, чергуючи сторінки з кожного файлу, зі збереженням закладок. +--- + +# Чергування та змішування сторінок + +Чергуйте сторінки з кількох PDF-файлів так, щоб вони йшли по черзі з різних документів. Цей інструмент знадобиться, коли звичайне об’єднання просто приєднує файли один за одним, а вам потрібна сторінка 1 з файлу A, потім сторінка 1 з файлу B, потім сторінка 2 з файлу A і так далі. + +## Як це працює + +1. Завантажте щонайменше два PDF-файли через зону завантаження. +2. Інструмент покаже кожен файл із кількістю сторінок і розміром. +3. Перетягуйте маркери, щоб змінити, сторінки якого файлу йдуть першими в послідовності чергування. +4. Натисніть **Змішати сторінки**, щоб отримати результат із чергуванням. +5. Результат завантажується як `alternated-mixed.pdf`. + +## Можливості + +- Чергування сторінок у будь-якій кількості PDF (щонайменше два) +- Зміна порядку файлів перетягуванням для керування пріоритетом чергування +- Збереження закладок із вихідних документів +- Відображення кількості сторінок і розміру кожного завантаженого файлу +- Обробка в окремому веб-воркері для чуйного інтерфейсу + +## Приклади використання + +- Складання двосторонніх сканів, де непарні й парні сторінки скановано окремо +- Поєднання аркушів із питаннями та відповідями, щоб після кожного питання йшла відповідь +- Об’єднання двомовних документів сторінка за сторінкою (наприклад, англійською на одному боці, переклад на наступному) +- Чергування лицьових і зворотних сканів з одностороннього сканера + +## Поради + +- Якщо у вихідних PDF різна кількість сторінок, сторінки коротшого документа закінчаться першими, а решта сторінок довшого з’явиться в кінці. +- Порядок файлів має значення: перший файл у списку дає першу сторінку результату. За потреби перетягніть файли, щоб змінити порядок. + +## Пов’язані інструменти + +- [Об’єднати PDF](./merge-pdf) +- [Упорядкувати PDF](./organize-pdf) +- [Розділити PDF](./split-pdf) diff --git a/docs/uk/tools/background-color.md b/docs/uk/tools/background-color.md new file mode 100644 index 00000000..aaa4d38e --- /dev/null +++ b/docs/uk/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Колір фону +description: Змініть колір фону кожної сторінки PDF, зберігши увесь вміст поверх нього. +--- + +# Колір фону + +Задайте суцільний колір фону під усім наявним вмістом PDF. Інструмент створює кольоровий прямокутник на кожній сторінці й накладає на нього початковий вміст, тож текст, зображення та графіка залишаються повністю видимими на новому фоні. + +## Як це працює + +1. Завантажте PDF-файл. +2. Виберіть колір фону за допомогою вибору кольору. За замовчуванням це світло-жовтий (#FFFFCC). +3. Натисніть **Змінити колір фону**, щоб обробити файл. +4. Оновлений PDF завантажиться автоматично. + +## Параметри + +- **Колір фону** -- Стандартний вибір кольору для будь-якого суцільного кольору. За замовчуванням світло-жовтий. + +## Можливості + +- Єдиний колір фону на кожній сторінці +- Збереження всього початкового вмісту (текст, зображення, векторна графіка) поверх кольорового шару +- Збереження початкових розмірів сторінок +- Працює з документами з будь-якою кількістю сторінок + +## Приклади використання + +- Додавання світло-кремового або слонової кістки фону для м’якшого, паперового вигляду документів +- Колірне кодування наборів документів різними кольорами фону для різних категорій +- Створення візуально відмінних версій одного документа для різної аудиторії +- Додавання світлого відтінку фону для кращої читабельності під час показу документів на екрані + +## Поради + +- Найкраще працюють світлі, приглушені кольори. Дуже темний фон ускладнює читання тексту, якщо сам текст не світлий. +- Щоб змінити і фон, і колір тексту, спершу застосуйте колір фону, а потім скористайтеся інструментом [Змінити колір тексту](./text-color) для результату. +- Інструмент працює на структурному рівні PDF (без растеризації), тому текст у результаті залишається виділюваним і придатним для пошуку. + +## Пов’язані інструменти + +- [Змінити колір тексту](./text-color) +- [Інвертувати кольори](./invert-colors) +- [Корекція кольору](./adjust-colors) diff --git a/docs/uk/tools/bates-numbering.md b/docs/uk/tools/bates-numbering.md new file mode 100644 index 00000000..7954b15f --- /dev/null +++ b/docs/uk/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Нумерація Bates +description: Застосовуйте номери Bates до одного або кількох PDF із настроюваними шаблонами, заповненням нулями, шрифтами та позиціюванням. +--- + +# Нумерація Bates + +Нумерація Bates наносить послідовні ідентифікатори на кожну сторінку ваших PDF. Це стандартний метод маркування документів у судових процесах, аудитах і робочих процесах відповідності вимогам. Інструмент підтримує кілька файлів і настроювані шаблони та видає окремо пронумеровані PDF або єдиний ZIP-архів. + +## Як це працює + +1. Завантажте один або кілька PDF-файлів. Можна перетягнути одразу кілька файлів. +2. Виберіть готовий стиль або створіть власний шаблон. +3. Налаштуйте позицію, шрифт, розмір, колір і початкові номери. +4. Натисніть **Застосувати номери Bates**, щоб обробити файли. +5. Один файл завантажується напряму. Кілька файлів завантажуються як ZIP-архів. + +## Параметри + +- **Готовий стиль** -- Виберіть один із вбудованих форматів: + - Exhibit + Case + Bates + Page (наприклад, "Exhibit 1 Case XYZ 000001 Page 1") + - Exhibit + Case + Bates (без номера сторінки) + - Case + Bates + - Bates Number Only (наприклад, "000001") + - Власний (напишіть власний шаблон) +- **Власний стиль** -- Рядок шаблону із заповнювачами: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Заповнення номера Bates** -- Кількість цифр (від 3 до 6) для номерів Bates із ведучими нулями. Видимий лише у власному режимі. +- **Позиція** -- Верхній або нижній колонтитул, ліворуч, по центру або праворуч. +- **Номер Bates починається з** -- Перший номер Bates. За замовчуванням 1. Нумерація продовжується між файлами. +- **Лічильник файлів починається з** -- Початковий номер для заповнювача `[FILE]`. +- **Шрифт** -- Helvetica, Times New Roman або Courier. +- **Розмір шрифту** -- Розмір нанесеного тексту. +- **Колір** -- Вибір кольору тексту номера Bates. + +## Можливості + +- Попередній перегляд наживо, що показує вигляд номерів Bates у всіх завантажених файлах +- Підтримка кількох файлів зі скрізною нумерацією між документами +- Зміна порядку файлів перетягуванням для керування послідовністю нумерації +- Шість варіантів позиції (верх/низ, ліворуч/по центру/праворуч) +- Адаптивний розрахунок полів з урахуванням різних розмірів сторінок +- Вивід у ZIP для пакетів із кількох файлів +- Заповнювачі в шаблонах для максимальної гнучкості + +## Приклади використання + +- Нанесення послідовних номерів експонатів на документи для судового розкриття доказів +- Нумерація пакетів доказів аудиту, що охоплюють десятки файлів +- Застосування регуляторних довідкових номерів до документації з відповідності вимогам +- Маркування додатків до патентних заявок ідентифікаторами конкретної справи + +## Поради + +- Перед обробкою перетягніть файли у списку, щоб змінити їх порядок. Послідовність нумерації Bates відповідає цьому порядку. +- Використовуйте заповнювач `[FILENAME]`, щоб додати до штампа початкову назву файлу, що допомагає простежити сторінки до вихідних документів. +- Поле попереднього перегляду оновлюється в реальному часі під час зміни налаштувань, тож ви можете перевірити формат до обробки. + +## Пов’язані інструменти + +- [Нумерація сторінок](./page-numbers) +- [Додати нумерацію сторінок](./add-page-labels) +- [Колонтитули](./header-footer) diff --git a/docs/uk/tools/bmp-to-pdf.md b/docs/uk/tools/bmp-to-pdf.md new file mode 100644 index 00000000..84b74f2d --- /dev/null +++ b/docs/uk/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP у PDF +description: Перетворюйте растрові зображення BMP на PDF прямо у браузері, без завантаження на жоден сервер. +--- + +# BMP у PDF + +Перетворюйте файли Windows Bitmap (BMP) на PDF. BMP є нестисненим форматом зображень, який досі трапляється в застарілих системах, медичній візуалізації та промислових сканерах. Цей інструмент перетворює їх на PDF без жодного встановлення. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :--------- | +| BMP | `.bmp` | + +## Як це працює + +1. Клацніть зону завантаження або перетягніть у неї BMP-файли. +2. Перегляньте список файлів. Додайте ще файлів або видаліть зайві. +3. Натисніть **Перетворити на PDF**. Результат завантажиться як `from_bmps.pdf`. + +Кожен BMP малюється на полотні (canvas), експортується як PNG і вбудовується в PDF за допомогою pdf-lib. Розмір сторінки відповідає розмірам початкового зображення. + +## Параметри + +Цей інструмент не має додаткових налаштувань якості. Зображення вбудовуються в початковій роздільності як PNG без втрат. + +## Приклади використання + +- Перетворення застарілих сканованих документів у форматі BMP на архівні PDF +- Перетворення BMP-знімків екрана зі старіших програм Windows на документи для обміну +- Обробка результатів медичних або промислових сканерів, які за замовчуванням видають BMP +- Міграція старих архівів зображень у більш портативний формат + +## Поради + +- Файли BMP нестиснені, тому зазвичай великі. Отриманий PDF буде значно меншим, оскільки зображення всередині перекодовуються в PNG. +- Якщо поряд із BMP у вас є зображення інших форматів, скористайтеся інструментом [Зображення у PDF](./image-to-pdf), щоб перетворити все одним пакетом. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [TIFF у PDF](./tiff-to-pdf) diff --git a/docs/uk/tools/bookmark.md b/docs/uk/tools/bookmark.md new file mode 100644 index 00000000..9a88e325 --- /dev/null +++ b/docs/uk/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Редагувати закладки +description: Додавайте, редагуйте, імпортуйте, експортуйте та видаляйте закладки PDF у візуальному редакторі з підтримкою CSV і JSON. +--- + +# Редагувати закладки + +Редактор закладок дає повний контроль над навігаційними закладками PDF (їх також називають структурою документа). Ви можете додавати нові закладки, редагувати наявні, змінювати ієрархію та імпортувати чи експортувати дані закладок у форматах CSV і JSON. + +## Як це працює + +1. Завантажте PDF, клацнувши по зоні або перетягнувши в неї файл. +2. За бажання позначте **Автоматично витягувати наявні закладки**, щоб підтягнути поточне дерево закладок документа. +3. Редактор відкриється в режимі розділеного вікна: переглядач PDF ліворуч, панель закладок праворуч. +4. Введіть назву закладки та натисніть **Додати до сторінки**, щоб створити закладку, яка вказує на поточну сторінку. +5. Кнопками на панелі інструментів змінюйте порядок, стиль або видаляйте закладки. +6. Натисніть **Зберегти PDF із закладками**, щоб завантажити оновлений файл. + +## Можливості + +- Візуальний переглядач PDF з навігацією сторінками, масштабуванням і переходом на сторінку за номером +- Додавання закладок до будь-якої сторінки одним клацанням +- Клацання безпосередньо по PDF для точного місця призначення закладки (режим вибору) +- Вкладена ієрархія закладок із перевпорядкуванням перетягуванням +- Пакетні операції: виберіть кілька закладок, щоб змінити колір, стиль або видалити їх одразу +- Пошук закладок для швидкого знаходження записів у великих деревах +- Скасування та повернення всіх змін +- Імпорт закладок із CSV (назва, сторінка, рівень) або JSON +- Експорт закладок у CSV або JSON для редагування в інших програмах +- Стилізація закладок: колір (червоний, синій, зелений, жовтий, фіолетовий) і накреслення (жирний, курсив, жирний курсив) +- Швидка навігація: гортайте сторінки клавішами Page Up/Page Down + +## Параметри + +- **Автоматично витягувати наявні закладки**: якщо позначено, інструмент зчитує й показує поточні закладки PDF під час завантаження. +- **Пакетний режим**: дозволяє вибрати кілька закладок і застосувати до них масову зміну кольору, стилю або видалення. +- **Розгорнути все / Згорнути все**: швидко показує або ховає вкладені закладки. + +## Сценарії використання + +- Додавання змісту до підручника чи посібника без закладок +- Перебудова закладок у відсканованому документі після розпізнавання тексту (OCR) +- Експорт закладок у CSV, редагування в електронній таблиці та повторний імпорт +- Виправлення автоматично створених закладок з неправильними посиланнями на сторінки +- Додавання кольорових закладок для позначення важливих розділів у юридичному документі + +## Поради + +- Для масового створення закладок використовуйте імпорт CSV. Формат простий: `title,page,level`, де рівень 1 означає верхній рівень. +- Режим вибору дозволяє клацнути точне місце на сторінці PDF, щоб задати призначення закладки. Це точніше, ніж указувати лише номер сторінки. +- Експортуйте закладки перед великими змінами, щоб мати резервну копію. + +## Пов’язані інструменти + +- [Зміст](./table-of-contents) +- [Редактор PDF](./edit-pdf) +- [Додати мітки сторінок](./add-page-labels) diff --git a/docs/uk/tools/cbz-to-pdf.md b/docs/uk/tools/cbz-to-pdf.md new file mode 100644 index 00000000..d8a69559 --- /dev/null +++ b/docs/uk/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ у PDF +description: Перетворюйте архіви коміксів CBZ і CBR на PDF у браузері. Безкоштовно, приватно, без завантаження на сервер. +--- + +# CBZ у PDF + +Перетворюйте архіви коміксів на PDF. CBZ і CBR є стандартними форматами цифрових коміксів: це просто ZIP- або RAR-архіви із зображеннями. Інструмент витягує кожну сторінку, зберігає порядок читання та створює чистий PDF, де кожне зображення стає сторінкою повного розміру. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----- | :--------- | :---------------------------------------------------------------- | +| CBZ | `.cbz` | Архів коміксу на основі ZIP (обробляється локально через pdf-lib) | +| CBR | `.cbr` | Архів коміксу на основі RAR (обробляється рушієм PyMuPDF) | + +Конвертер CBZ розпізнає зображення JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC і JXL в архіві. Нестандартні формати автоматично перетворюються на PNG перед вбудовуванням. + +## Як це працює + +1. Клацніть зону завантаження або перетягніть файли CBZ чи CBR. В одній партії можна поєднувати обидва формати. +2. Перегляньте список файлів. Видаліть непотрібні або натисніть **Додати ще файли**, щоб додати ще. +3. Натисніть **Конвертувати у PDF**. Для файлів CBZ інструмент розпаковує архів, сортує зображення за назвою в природному порядку, визначає справжній формат кожного зображення та вбудовує їх у PDF за допомогою pdf-lib. Файли CBR натомість обробляє рушій PyMuPDF. +4. Один файл завантажується як PDF. Кілька файлів дають ZIP-архів із назвою `comic-converted.zip`. + +## Параметри + +Налаштування не потрібні. Кожне зображення стає сторінкою з розмірами оригіналу, тому розвороти залишаються широкими, а окремі сторінки вузькими. + +## Сценарії використання + +- Читання коміксів на планшеті чи в застосунку на телефоні, що підтримує PDF, але не CBZ/CBR +- Друк окремих сторінок цифрового коміксу +- Архівування колекції коміксів у форматі, який відкриє будь-який переглядач +- Передавання коміксу тому, хто не має спеціальної програми для читання коміксів + +## Поради + +- Зображення в архіві сортуються в природному порядку (тож `page2.jpg` іде перед `page10.jpg`). Називайте файли з послідовною нумерацією, щоб сторінки йшли в правильному порядку. +- Конвертер визначає формат зображення за бінарним підписом, а не за розширенням файлу. PNG, випадково названий `.jpg`, усе одно вбудується правильно. +- Файли CBZ обробляються повністю в браузері без завантаження рушія PyMuPDF, тому конвертуються швидше за CBR. + +## Пов’язані інструменти + +- [EPUB у PDF](./epub-to-pdf) +- [MOBI у PDF](./mobi-to-pdf) +- [Зображення у PDF](./image-to-pdf) diff --git a/docs/uk/tools/change-permissions.md b/docs/uk/tools/change-permissions.md new file mode 100644 index 00000000..6aca842d --- /dev/null +++ b/docs/uk/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Змінити дозволи +description: Установлюйте або змінюйте дозволи PDF на друк, копіювання, редагування й коментування. Використовує 256-бітне шифрування AES. +--- + +# Змінити дозволи + +Точно налаштуйте, що можуть робити отримувачі з вашим PDF. На відміну від звичайного шифрування, яке лише закриває файл паролем, цей інструмент дозволяє вибірково дозволяти або забороняти друк, копіювання, редагування, коментування, заповнення форм, складання документа та вилучення сторінок, і все це забезпечується 256-бітним шифруванням AES. + +## Як це працює + +1. Завантажте файл PDF. +2. Якщо PDF уже зашифровано, введіть **Поточний пароль**. +3. Задайте **Новий пароль користувача** (потрібен для відкриття) та/або **Новий пароль власника** (керує дозволами). +4. Увімкніть або вимкніть окремі дозволи за допомогою прапорців. +5. Натисніть **Змінити дозволи**. +6. Завантажте оновлений PDF. + +Якщо залишити обидва поля нових паролів порожніми, інструмент повністю розшифрує PDF і зніме все шифрування та обмеження. + +## Керування дозволами + +| Дозвіл | Що він контролює | +| ---------------------------------- | --------------------------------------------------- | +| **Дозволити друк** | Чи можна друкувати документ | +| **Дозволити копіювання тексту** | Чи можна виділяти та копіювати текст і зображення | +| **Дозволити зміни** | Чи можна редагувати вміст документа | +| **Дозволити анотування** | Чи можна додавати коментарі, виділення та штампи | +| **Дозволити заповнення форм** | Чи можна заповнювати інтерактивні поля форм | +| **Дозволити складання документа** | Чи можна вставляти, видаляти або повертати сторінки | +| **Дозволити видобування сторінок** | Чи можна вилучати окремі сторінки | + +Для дії всіх дозволів потрібен пароль власника. Без пароля власника прапорці дозволів ігнорує більшість програм для читання PDF. + +## Як працюють дозволи в PDF + +Дозволи PDF є частиною специфікації шифрування. Вони зберігаються як бітові прапорці в словнику шифрування, і їх застосовують сумісні програми для читання PDF. Ключова відмінність: + +- **Пароль користувача**: потрібен, щоб узагалі відкрити файл. +- **Пароль власника**: потрібен, щоб змінити дозволи або зняти обмеження. Без нього прапорці дозволів визначають, які операції може виконувати користувач. + +Якщо задати лише пароль власника (без пароля користувача), файл зможе відкрити будь-хто, але лише з дозволеними операціями. Якщо задати обидва, для відкриття файлу потрібен пароль, а після автентифікації діють обмеження. + +## Сценарії використання + +- Розповсюдження звіту, який можна переглядати й друкувати, але не редагувати чи копіювати +- Надання шаблону договору, який отримувачі можуть заповнити, але не змінювати +- Публікація PDF-каталогу із забороненим копіюванням зображень +- Дозвіл коментувати чернетку для рецензії із забороною структурних змін + +## Поради + +- Щоб дозволи діяли, завжди задавайте пароль власника. Дозволи без пароля власника неможливо забезпечити. +- Деякі сторонні інструменти для PDF ігнорують прапорці дозволів. Для надійнішого захисту розгляньте растеризацію PDF або DRM. +- Скористайтеся цим інструментом, щоб оновити старі PDF із шифруванням RC4 до AES-256. + +## Пов’язані інструменти + +- [Зашифрувати PDF](./protect-pdf): простий захист паролем без детальних дозволів +- [Розшифрувати PDF](./unlock-pdf): повністю зняти шифрування +- [Зняти обмеження](./remove-restrictions): прибрати всі обмеження, якщо у вас є пароль власника diff --git a/docs/uk/tools/combine-single-page.md b/docs/uk/tools/combine-single-page.md new file mode 100644 index 00000000..318efb02 --- /dev/null +++ b/docs/uk/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Об’єднати в одну сторінку +description: Зшийте всі сторінки PDF в одну суцільну вертикальну або горизонтальну стрічку. +--- + +# Об’єднати в одну сторінку + +Зведіть усі сторінки PDF в одну довгу сторінку. Сторінки зшиваються вертикально (як сувій) або горизонтально (поруч), і на виході виходить одна суцільна сторінка. + +## Як це працює + +1. Завантажте файл PDF. +2. Виберіть напрямок розташування: **Вертикально** (сторінки одна під одною) або **Горизонтально** (сторінки поруч). +3. Задайте відстань між сторінками в пунктах. +4. Виберіть колір тла для проміжків між сторінками. +5. За бажання ввімкніть роздільники (тонкі лінії між сторінками) та налаштуйте їхню товщину й колір. +6. Натисніть кнопку обробки. Результатом буде PDF з однією сторінкою. + +## Можливості + +- Вертикальне або горизонтальне зшивання сторінок +- Налаштовувана відстань між сторінками +- Вибір кольору тла для проміжків +- Необов’язкові роздільні лінії з регульованою товщиною та кольором +- Кожна початкова сторінка відображається в повній роздільності на спільному полотні + +## Параметри + +| Параметр | Опис | +| ---------------------------- | ------------------------------------------------------ | +| **Напрямок розкладки** | Вертикально (одна під одною) або горизонтально (поруч) | +| **Відступ** | Проміжок між сторінками в пунктах | +| **Колір фону** | Колір області між сторінками | +| **Додати лінії-роздільники** | Увімкнення тонких ліній між сторінками | +| **Товщина роздільника** | Товщина лінії в пунктах | +| **Колір роздільника** | Колір ліній-роздільників | + +## Сценарії використання + +- Створення одного довгого зображення з багатосторінкового каркаса чи макета дизайну +- Створення суцільного вигляду документа для вбудовування на вебсторінку +- Зшивання багатосторінкового коміксу чи розкадровки в одну стрічку +- Створення панорамного вигляду послідовних сторінок для перегляду + +## Поради + +- Вертикальна орієнтація найкраще підходить для документів із книжковими сторінками. Горизонтальна краща для альбомного вмісту. +- Великі документи з багатьма сторінками дають дуже високий або дуже широкий результат. Деякі переглядачі PDF можуть погано працювати з надзвичайно великими окремими сторінками. +- Роздільники контрастного кольору допомагають побачити, де закінчується одна початкова сторінка й починається наступна. + +## Пов’язані інструменти + +- [N-Up PDF](./n-up-pdf) +- [Об’єднати PDF](./merge-pdf) +- [Розділення сторінок](./divide-pages) diff --git a/docs/uk/tools/compare-pdfs.md b/docs/uk/tools/compare-pdfs.md new file mode 100644 index 00000000..18d0c576 --- /dev/null +++ b/docs/uk/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: Порівняти PDF +description: Порівнюйте два документи PDF поруч або в режимі накладання з детальним виявленням і класифікацією змін. +--- + +# Порівняти PDF + +Завантажте два PDF і побачте, що саме змінилося між ними. Інструмент розумно зіставляє сторінки, виявляє відмінності в тексті, зображеннях, анотаціях, колонтитулах і форматуванні та показує їх у режимі поруч або накладання. + +## Як це працює + +1. Завантажте два файли PDF: оригінал (ліворуч) і змінену версію (праворуч). +2. Інструмент зіставляє сторінки документів за сигнатурами вмісту. +3. Виберіть режим перегляду: **Пліч-о-пліч** або **Накладання**. +4. Переходьте між парами сторінок за допомогою елементів керування пагінацією. +5. Відмінності підсвічуються та класифікуються. Скористайтеся панеллю фільтрів, щоб зосередитися на певних типах змін. +6. За бажання експортуйте порівняння як звіт у PDF. + +## Можливості + +- Автоматичне зіставлення сторінок за схожістю вмісту +- Режими порівняння поруч і з накладанням +- Класифікація змін: текст, зображення, колонтитули, анотації, форматування, тло +- Перемикачі фільтрів за категоріями, щоб показувати або ховати певні типи змін +- Пошук змін у тексті з фільтрацією за запитом +- Підтримка OCR для порівняння відсканованих документів +- Елементи керування масштабом для детального огляду +- Синхронна прокрутка панелей у режимі поруч +- Експорт результатів порівняння у PDF + +## Параметри + +| Параметр | Опис | +| --------------------- | ------------------------------------------------------------------------------------------ | +| **Режим перегляду** | Пліч-о-пліч або накладання | +| **OCR** | Увімкнення чи вимкнення OCR для порівняння відсканованих документів | +| **Мова OCR** | Мова для розпізнавання тексту OCR | +| **Фільтри категорій** | Показ або приховування змін тексту, зображень, колонтитулів, анотацій, форматування та тла | +| **Обсяг змін** | У режимі накладання: усі зміни або лише зміни вмісту | +| **Масштаб** | Налаштування масштабу для детального огляду | + +## Сценарії використання + +- Перегляд редакцій договору, щоб знайти, що саме змінилося між версіями +- Порівняння макетів дизайну, щоб переконатися, що експорт у PDF відповідає очікуванням +- Аудит змін у документах у регульованих галузях, де потрібно відстежувати кожну правку +- Перевірка того, що процес конвертації в PDF точно зберіг початковий вміст +- Звірення перекладених документів з оригіналом на предмет змін у верстці + +## Поради + +- Режим накладання розміщує обидва документи один на одному, тож просторові відмінності (зсунуті елементи, змінені зображення) одразу помітні. +- Вмикайте OCR, коли порівнюєте скановані документи без текстового шару. Рушій порівняння витягне текст із зображень сторінок. +- Використовуйте фільтри категорій, щоб зосередитися на важливому. Наприклад, сховайте зміни форматування, якщо вас цікавлять лише відмінності в тексті. + +## Пов’язані інструменти + +- [Перегляд метаданих](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Об’єднати PDF](./merge-pdf) diff --git a/docs/uk/tools/compress-pdf.md b/docs/uk/tools/compress-pdf.md new file mode 100644 index 00000000..546665af --- /dev/null +++ b/docs/uk/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Стиснення PDF +description: Зменшуйте розмір PDF до 90% за допомогою рушія Hyper Compress. Підтримує цільовий розмір файлу, пакетну обробку та власні налаштування якості. +--- + +# Стиснення PDF + +Зменшуйте розмір PDF, не псуючи їх. Стиснення PDF працює на базі [Hyper Compress](https://www.bentopdf.com/hyper-compress), власного рушія стиснення BentoPDF. Він повторно стискає зображення, створює підмножини шрифтів і об’єднує їх, а також прибирає зайве, як-от вбудовані мініатюри та приватні дані програм. PDF залишається повністю функціональним: текст можна виділяти, а посилання й поля форм працюють. + +Hyper Compress скомпільовано у WebAssembly, і він постачається разом із BentoPDF, тому стиснення працює офлайн та в ізольованих від мережі середовищах без додаткового налаштування. + +## Як це працює + +1. Завантажте один або кілька PDF, клацнувши по зоні або перетягнувши файли. +2. Виберіть **Рівень стиснення**: Низький, Середній, Високий або Без втрат. +3. За бажання вкажіть **Цільовий розмір файлу** або розгорніть **Власні налаштування** для детального керування, зокрема **Конвертувати у відтінки сірого**. +4. Натисніть **Стиснення PDF**. Для кількох файлів ви отримаєте один ZIP-архів. + +## Особливі документи + +- **PDF із цифровим підписом** повертаються без змін, оскільки будь-яка зміна зробила б підпис недійсним. Увімкніть **Перевизначити захист вмісту** у розділі «Власні налаштування», щоб прибрати підписи та стиснути файл; видимий підпис залишиться на сторінці, але файл більше не буде підписаним. +- **Файли PDF/A** після стиснення втрачають позначку PDF/A, щоб файл ніколи не заявляв про відповідність, якої вже не має. Увімкніть **Зберегти PDF/A** у розділі «Власні налаштування», щоб натомість зберегти відповідність. +- **PDF із паролем** отримують поле пароля на картці файлу. Введіть пароль там, і Hyper Compress відкриє файл сам, без окремого кроку розблокування. Якщо заблокованих файлів два чи більше, одне спільне поле розблокує всі файли з однаковим паролем. Стиснута копія не має пароля; скористайтеся [Захистом PDF](./protect-pdf), щоб додати його знову. +- **Скани без текстового шару** можна стиснути ще сильніше за допомогою **Растеризувати сторінки в зображення** у розділі «Власні налаштування», що замінює кожну сторінку одним оптимізованим зображенням. Це пропускається для будь-якого документа з текстом, який можна виділити, зокрема для сканів після OCR, якщо не ввімкнено **Перевизначити захист вмісту**. Тоді текстові сторінки також стають зображеннями, тож текст перестає виділятися, а посилання перестають працювати. + +## Рівні стиснення + +| Рівень | Якість зображень | Макс. роздільність | Найкраще для | +| ------------- | ------------------- | ------------------ | ------------------------------------------ | +| **Низький** | 80 | 200 DPI | Збереження візуальної якості | +| **Середній** | 50 | 150 DPI | Щоденні документи | +| **Високий** | 20 | 72 DPI | Вкладення в email, вивантаження в інтернет | +| **Без втрат** | Зображення без змін | Без змін | Архівні копії | + +Рівень «Високий» також прибирає вбудовування 14 стандартних шрифтів PDF, а також схожих на них шрифтів, як-от Arial, коли це безпечно. + +## Цільовий розмір файлу + +Вкажіть розмір у КБ або МБ, і Hyper Compress шукатиме найкращу якість зображень, що все ще вміщається, починаючи з вибраного рівня. Якщо документ не вдається зменшити до такого розміру, ви отримаєте найменшу версію, яку він може створити, і повідомлення про це. Окремі сторінки, як-от [Стиснути PDF до 1 МБ](https://www.bentopdf.com/compress-pdf-to-1mb), відкриваються з уже заповненим цільовим розміром. + +## Власні налаштування + +Розгорніть панель «Власні налаштування», щоб налаштувати Hyper Compress напряму. Вибір рівня стиснення скидає ці значення до значень цього рівня, а зміна будь-якого з них перемикає рівень на «Власний». + +- **Перевизначити захист вмісту**: за замовчуванням Hyper Compress не чіпає підписані PDF і не растеризує сторінки з текстом. Увімкнення цього параметра обходить обидва обмеження. Він залишається ввімкненим, коли ви змінюєте рівень. + +- **Зображення**: якість зображень, максимальна роздільність, примусова передискретизація, зменшення кількості кольорів, обрізання невидимих областей зображень, видалення альтернативних зображень, спрощення профілів кольору, JPEG 2000 і режим без втрат +- **Шрифти**: створення підмножин, об’єднання дублікатів і прибирання вбудовування стандартних шрифтів та схожих на них +- **Вміст**: сплющення анотацій, полів форм або посилань +- **Очищення**: видалення мініатюр, даних програм, потоків статей, інформації про веб-захоплення, дерева структури або цільових профілів виводу +- **Растеризувати**: заміна сторінок зображеннями для сканів без тексту; пропускається, якщо в документі є текст, який можна виділити +- **Результат**: «Зберегти PDF/A» і стиснення Brotli для програм читання PDF 2.0, що його підтримують + +## Сценарії використання + +- Зменшення звіту на 50 МБ до ліміту вкладень в email +- Стиснення скану до суворого ліміту порталу за допомогою цільового розміру файлу +- Оптимізація маркетингових PDF для швидшого завантаження з вебсайту +- Архівування великих наборів документів, де важлива вартість зберігання +- Зменшення витрат мобільного трафіку під час надсилання PDF у месенджерах + +## Поради + +- Почніть із рівня «Середній». Якщо результат усе ще завеликий, задайте цільовий розмір файлу або перейдіть на «Високий». +- Для скану без текстового шару ввімкніть «Растеризувати сторінки в зображення» у розділі «Власні налаштування». +- Параметр «Конвертувати у відтінки сірого» у розділі «Власні налаштування» може зменшити розмір документів з великою кількістю кольорів. + +## Пов’язані інструменти + +- [Лінеаризація PDF](./linearize-pdf): оптимізуйте стиснений PDF для швидкого перегляду в інтернеті +- [Растеризація PDF](./rasterize-pdf): перетворюйте сторінки на зображення із заданою роздільністю DPI, зокрема сторінки з текстом +- [Відновлення PDF](./repair-pdf): виправте PDF, який зламався під час стиснення деінде +- [Видалити метадані](./remove-metadata): приберіть приховані дані для приватності diff --git a/docs/uk/tools/crop-pdf.md b/docs/uk/tools/crop-pdf.md new file mode 100644 index 00000000..fb564fe3 --- /dev/null +++ b/docs/uk/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Обрізати PDF +description: Візуально обрізайте сторінки PDF, малюючи область обрізання на кожній сторінці в редакторі на основі Cropper.js. +--- + +# Обрізати PDF + +Обрізайте поля сторінок PDF у візуальному інтерфейсі. Намалюйте прямокутник обрізання безпосередньо на кожній сторінці, перегляньте результат і застосуйте обрізання. Можна задати різні області для різних сторінок або застосувати однакове обрізання до всього документа. + +## Як це працює + +1. Завантажте файл PDF. +2. Відкриється редактор обрізання з першою сторінкою та накладкою, яку можна перетягувати. +3. Змінюйте прямокутник обрізання, перетягуючи його краї або кути. +4. Кнопками навігації переходьте між сторінками та задавайте області обрізання для кожної. +5. Натисніть **Обрізати й завантажити**, щоб застосувати обрізання й завантажити результат. + +## Можливості + +- Візуальний редактор обрізання на основі Cropper.js з маркерами для точного налаштування +- Посторінкова навігація для окремих областей обрізання +- Збереження параметрів обрізання для кожної сторінки, тож можна задати різні обрізання для різних сторінок +- Живий попередній перегляд вибраної області +- Підтримка PDF будь-якого розміру сторінки чи орієнтації + +## Сценарії використання + +- Видалення широких полів зі сканованих документів, щоб зосередитися на вмісті +- Прибирання друкарських міток обрізання чи реєстрації з PDF для передпресової підготовки +- Обрізання слайдів лекцій, щоб прибрати область приміток доповідача +- Видалення верхніх або нижніх колонтитулів з кожної сторінки перед поширенням уривка документа +- Зміна розміру сторінок під конкретний дисплей чи макет друку + +## Поради + +- Накладку обрізання можна вільно змінювати за розміром і переміщувати. Тягніть за кути для пропорційної зміни розміру або за краї для зміни по одній осі. +- Якщо до всіх сторінок потрібне однакове обрізання, задайте його на першій сторінці: інструмент запам’ятовує вашу область, поки ви переходите між сторінками. +- Якщо потрібно уніфікувати розміри сторінок, а не обрізати візуально, краще підійде інструмент «Вирівняти розмір сторінок». + +## Пов’язані інструменти + +- [Редактор PDF](./edit-pdf) +- [Номери сторінок](./page-numbers) +- [Видалити порожні сторінки](./remove-blank-pages) diff --git a/docs/uk/tools/csv-to-pdf.md b/docs/uk/tools/csv-to-pdf.md new file mode 100644 index 00000000..e1fb3b39 --- /dev/null +++ b/docs/uk/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV у PDF +description: Перетворюйте файли електронних таблиць CSV на відформатовані таблиці PDF прямо у браузері. +--- + +# CSV у PDF + +Перетворюйте файли CSV на охайні відформатовані документи PDF. Кожен CSV розбирається та відображається як таблиця у вихідному PDF. Це корисно, коли потрібно надрукувати чи поділитися табличними даними, не вимагаючи від отримувача програми для електронних таблиць. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :--------- | +| CSV | `.csv` | + +## Як це працює + +1. Клацніть зону завантаження або перетягніть один чи кілька файлів CSV. +2. Перегляньте список файлів. Додайте ще файли або видаліть непотрібні. +3. Натисніть **Перетворити на PDF**. Індикатор прогресу показує стан перетворення. +4. Один файл завантажується напряму як PDF. Кілька файлів пакуються в `csv-converted.zip`. + +## Параметри + +Цей інструмент не має додаткових налаштувань. CSV автоматично розбирається та форматується як таблиця. + +## Результат + +| Кількість вхідних файлів | Результат | +| :----------------------- | :-------------------------------------------------------- | +| 1 файл | Один PDF для завантаження (наприклад, `data.pdf`) | +| 2+ файли | ZIP-архів (`csv-converted.zip`) з одним PDF на кожен файл | + +## Сценарії використання + +- Перетворення експортованих звітів з бази даних на таблиці PDF для друку +- Передавання фінансових даних чи списків інвентаря людям без Excel +- Створення PDF-версій журналів CSV для документації відповідності вимогам +- Друк списків адрес, відомостей оцінок чи будь-яких табличних даних у форматі CSV + +## Поради + +- Для найкращого результату переконайтеся, що ваш CSV використовує стандартні роздільники-коми. Інструмент дотримується поширених правил розбору CSV. +- Якщо в CSV багато стовпців, таблицю може бути стиснуто до ширини сторінки. Розгляньте розділення широких наборів даних на кілька файлів. +- Для файлів Excel (`.xls`, `.xlsx`) скористайтеся інструментом [Excel у PDF](./excel-to-pdf), який зберігає форматування таблиць і кілька аркушів. + +## Пов’язані інструменти + +- [Excel у PDF](./excel-to-pdf) +- [Текст у PDF](./txt-to-pdf) +- [JSON у PDF](./json-to-pdf) diff --git a/docs/uk/tools/delete-pages.md b/docs/uk/tools/delete-pages.md new file mode 100644 index 00000000..e855d69c --- /dev/null +++ b/docs/uk/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Видалити сторінки +description: Видаляйте певні сторінки з PDF за номером, діапазоном або візуальним вибором мініатюр. +--- + +# Видалити сторінки + +Видаляйте непотрібні сторінки з документа PDF. Вказуйте сторінки для видалення, вводячи номери чи діапазони, або клацайте безпосередньо по мініатюрах сторінок, щоб позначити їх. + +## Як це працює + +1. Завантажте файл PDF. Інструмент відобразить мініатюри всіх сторінок. +2. Введіть сторінки для видалення в текстове поле за синтаксисом діапазонів (наприклад, `2, 5-8`) або клацайте мініатюри, щоб перемикати їх. +3. Позначені сторінки візуально підсвічуються, щоб ви могли підтвердити вибір. +4. Натисніть кнопку обробки. Буде створено новий PDF без вибраних сторінок. + +## Можливості + +- Текстовий вибір сторінок із синтаксисом діапазонів (`2, 5-8, 12`) +- Візуальна сітка мініатюр для видалення клацанням +- Підсвічування сторінок, позначених для видалення, у реальному часі +- Перевірка введеного щодо фактичної кількості сторінок +- Усі невидалені сторінки залишаються в початковому порядку + +## Сценарії використання + +- Видалення порожніх чи заповнювальних сторінок зі сканованого документа +- Прибирання обкладинок чи додатків перед поширенням документа +- Видалення чернеткових сторінок, випадково залишених у фінальному PDF +- Видалення сторінок із конфіденційною інформацією перед розповсюдженням + +## Поради + +- Видалення сторінок не впливає на вміст чи форматування решти сторінок. Результат є точною копією оригіналу без видалених сторінок. +- Якщо потрібно залишити лише певні сторінки, а не видаляти певні, краще підійде [Витяг сторінок](./extract-pages). +- Перегляд мініатюр завантажується поступово, тому великі документи залишаються чутливими до дій. + +## Пов’язані інструменти + +- [Витяг сторінок](./extract-pages) +- [Дублювати та впорядкувати](./organize-pdf) +- [Розділити PDF](./split-pdf) diff --git a/docs/uk/tools/deskew-pdf.md b/docs/uk/tools/deskew-pdf.md new file mode 100644 index 00000000..9d22c143 --- /dev/null +++ b/docs/uk/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Вирівнювання PDF +description: Автоматично вирівнюйте нахилені сторінки у сканованих PDF за допомогою виявлення нахилу OpenCV. Регульовані поріг і DPI. +--- + +# Вирівнювання PDF + +Скановані документи рідко бувають ідеально рівними. Навіть невеликий нахил знижує точність OCR і погіршує вигляд друку. Цей інструмент використовує алгоритми обробки зображень OpenCV, щоб визначити кут нахилу кожної сторінки та повернути її до рівня. + +## Як це працює + +1. Завантажте один або кілька сканованих PDF. +2. Задайте **Поріг нахилу**: сторінки, нахил яких менший за це значення, залишаються без змін. +3. Виберіть **Якість обробки (DPI)**: вищий DPI підвищує точність виявлення, але потребує більше часу. +4. Натисніть **Вирівнювання PDF**. +5. Після обробки панель результатів показує виявлений кут кожної сторінки та те, чи її було виправлено. + +## Параметри + +| Налаштування | Значення | За замовчуванням | +| ------------------------ | -------------------------- | ---------------- | +| **Поріг нахилу** | 0.1, 0.5, 1.0, 2.0 градуси | 0.5 | +| **Якість обробки (DPI)** | 100, 150, 200, 300 | 150 | + +## Як працює виявлення нахилу + +Інструмент відображає кожну сторінку як зображення з вибраним DPI, а потім за допомогою OpenCV визначає домінантні кути ліній у вмісті. Якщо виявлений нахил перевищує поріг, сторінка повертається на протилежний кут, щоб вирівнятися. Сторінки з нахилом нижче порогу проходять без змін. + +## Сценарії використання + +- Приведення до ладу пакетно сканованих договорів чи юридичних документів +- Підготовка сканованих чеків чи рахунків до обробки OCR +- Вирівнювання сторінок із планшетного сканера з нерівномірним розташуванням паперу +- Покращення візуальної якості оцифрованих архівних матеріалів + +## Поради + +- Знизьте поріг до 0.1 градуса, якщо для OCR потрібне точне вирівнювання до пікселя. +- 150 DPI швидкий і точний для більшості документів. Використовуйте 300 DPI для дуже дрібного тексту чи сторінок із тонкими деталями. +- Вирівнювання найкраще працює на документах із чіткими горизонтальними рядками тексту. Воно може давати збій на сторінках, що здебільшого складаються із зображень або діагональних елементів дизайну. + +## Пов’язані інструменти + +- [Растеризація PDF](./rasterize-pdf): перетворіть вирівняний результат на плоский PDF із зображень +- [Стиснення PDF](./compress-pdf): зменшіть розмір файлу після вирівнювання +- [Відновлення PDF](./repair-pdf): виправте структурні проблеми у сканованих PDF diff --git a/docs/uk/tools/digital-sign-pdf.md b/docs/uk/tools/digital-sign-pdf.md new file mode 100644 index 00000000..1e74480f --- /dev/null +++ b/docs/uk/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Цифровий підпис +description: Додавайте криптографічні цифрові підписи до PDF за допомогою сертифікатів X.509. Підтримує формати PKCS#12 і PEM та видимі підписи. +--- + +# Цифровий підпис + +Цифровий підпис є криптографічним доказом того, що конкретна особа підписала документ і що документ не змінювався відтоді. На відміну від намальованого підпису (який є лише зображенням), цифровий підпис використовує сертифікати X.509 і стандарти PKCS#7, щоб забезпечити перевірювану автентичність і цілісність. + +BentoPDF застосовує цифрові підписи повністю у вашому браузері. Ваш закритий ключ ніколи не залишає пристрій. + +## Як це працює + +1. Завантажте файл PDF. +2. Завантажте файл сертифіката (.pfx, .p12 або .pem). +3. Введіть пароль сертифіката, щоб його розблокувати. Інструмент покаже суб’єкта, емітента та термін дії сертифіката. +4. За бажання налаштуйте метадані підпису (причина, місце, контактні дані). +5. За бажання ввімкніть **видимий підпис** із налаштуванням позиції, розміру, зображення й тексту. +6. Натисніть **Підписати PDF**. + +## Підтримувані формати сертифікатів + +| Формат | Розширення | Опис | +| ----------- | ---------- | ---------------------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Галузевий стандартний пакет із закритим ключем і ланцюжком сертифікатів. Найпоширеніший формат. | +| **PEM** | .pem | Текстовий формат. Має містити і сертифікат, і закритий ключ в одному файлі. Підтримує зашифровані закриті ключі. | + +## Параметри видимого підпису + +Якщо ввімкнено, на сторінці PDF відображається блок видимого підпису: + +- **Позиція**: координати X/Y і ширина/висота в пунктах +- **Сторінка**: перша сторінка, остання, усі сторінки або конкретний номер сторінки +- **Зображення**: завантажте зображення PNG, JPG або WebP (ваш рукописний підпис, печатку компанії тощо) +- **Текст**: власний текст із налаштовуваними кольором і розміром шрифту. Якщо не задано ні зображення, ні тексту, інструмент автоматично створює текст зі звичайного імені сертифіката та поточної дати. + +## Метадані підпису + +- **Причина**: чому документ підписано (наприклад, "Approved", "Reviewed") +- **Місце**: де відбулося підписання (наприклад, "New York, NY") +- **Контактна інформація**: як зв’язатися з підписантом (наприклад, адреса email) + +## Примітка про підключення до інтернету + +Для підписання може знадобитися підключення до інтернету. Бібліотека підписання завантажує ланцюжок сертифікатів за URL-адресами, вбудованими в розширення Authority Information Access (AIA) вашого сертифіката. Якщо ці сервери недоступні, підписання не вдасться для сертифікатів, що потребують перевірки ланцюжка. + +## Сценарії використання + +- Підписання договорів, пропозицій і угод юридично значущими цифровими підписами +- Засвідчення офіційних документів у робочих процесах, що вимагають автентифікації на основі PKI +- Підписання PDF-рахунків для відповідності нормативним вимогам (багато країн ЄС вимагають цифрово підписаних електронних рахунків) +- Додавання організаційного затвердження до креслень чи документів з якості + +## Поради + +- Самопідписані сертифікати годяться для тестування, але в Adobe Reader показуватимуть попередження. Для робочих документів використовуйте сертифікат довіреного центру сертифікації. +- Видимий підпис суто візуальний. Криптографічний підпис вбудовується незалежно від того, чи ввімкнено видимий блок. +- Перевірте підписаний PDF за допомогою інструмента перевірки підпису, щоб підтвердити цілісність підпису. + +## Пов’язані інструменти + +- [Перевірка підпису](./validate-signature-pdf): перевіряйте цифрові підписи в підписаних PDF +- [Сплощення PDF](./flatten-pdf): сплющіть форми перед підписанням, щоб запобігти змінам +- [Зашифрувати PDF](./protect-pdf): додайте захист паролем поверх цифрового підпису +- [Видалити метадані](./remove-metadata): приберіть метадані перед підписанням diff --git a/docs/uk/tools/divide-pages.md b/docs/uk/tools/divide-pages.md new file mode 100644 index 00000000..3844e7a4 --- /dev/null +++ b/docs/uk/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Розділити сторінки +description: Розділяйте сторінки PDF горизонтально або вертикально на менші підсторінки. +--- + +# Розділити сторінки + +Розрізайте окремі сторінки PDF навпіл, розділяючи їх горизонтально або вертикально. Це корисно, коли одна сторінка містить вміст, який слід розділити на окремі сторінки, наприклад, дві колонки, відскановані як одна широка сторінка. + +## Як це працює + +1. Завантажте файл PDF. +2. Виберіть напрямок розділення: **Вертикально** (ліва/права половини) або **Горизонтально** (верхня/нижня половини). +3. За бажання вкажіть діапазон сторінок, щоб обмежити, які сторінки розділяти. Залиште порожнім, щоб розділити всі сторінки. +4. Натисніть кнопку обробки, щоб створити розділений PDF. + +## Можливості + +- Вертикальне розділення: ділить кожну сторінку на ліву та праву половини +- Горизонтальне розділення: ділить кожну сторінку на верхню та нижню половини +- Фільтр діапазону сторінок для вибіркового розділення певних сторінок +- Сторінки поза вибором проходять без змін +- Зберігає якість вмісту без повторного відображення + +## Сценарії використання + +- Розділення сторінок, відсканованих по дві (наприклад, скан книги, де ліва та права сторінки на одному аркуші) +- Розбиття альбомного PDF з вмістом поруч на окремі книжкові сторінки +- Поділ високих інфографік чи плакатів на окремі верхню та нижню частини +- Підготовка широкоформатних документів до друку на стандартному папері + +## Поради + +- Якщо вміст на сторінках розподілено нерівномірно, розділення все одно відбувається рівно посередині. Для асиметричного розділення краще скористайтеся [Обрізати PDF](./crop-pdf). +- Поєднуйте цей інструмент із [Повернути PDF](./rotate-pdf), якщо сторінки потрібно повернути до або після розділення. + +## Пов’язані інструменти + +- [Розділити PDF](./split-pdf) +- [Обрізати PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Постеризація PDF](./posterize-pdf) diff --git a/docs/uk/tools/duplex-collate.md b/docs/uk/tools/duplex-collate.md new file mode 100644 index 00000000..71a38e85 --- /dev/null +++ b/docs/uk/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Сортування двостороннього сканування +description: Переупорядковуйте скани PDF із двостороннього сканування, де лицьові й зворотні сторінки йдуть окремими блоками, у правильний порядок лицьових і зворотних сторінок. +--- + +# Сортування двостороннього сканування + +Дуплексне впорядкування призначене для робочих процесів сканування через автоподавач, коли один PDF містить два блоки сторінок: + +- спочатку всі лицьові сторони +- потім усі зворотні сторони + +Замість ручного розділення та повторного складання цей інструмент чергує два блоки в природному порядку читання: лицьова 1, зворотна 1, лицьова 2, зворотна 2 і так далі. + +## Як це працює + +1. Завантажте один PDF, створений скануванням стосу у дуплексному режимі. +2. Задайте точку розділення, де закінчується блок лицьових сторінок. +3. Виберіть обробку блоку зворотних сторінок: + - **Обернути блок зворотів** (поширений випадок, коли стос перевертають перед скануванням зворотних сторін) + - **Залишити блок зворотів без змін** +4. Натисніть **Зібрати PDF**, щоб завантажити результат із переупорядкованими сторінками. + +## Параметри + +- **Визначити розділення автоматично (половина)**: задає точку розділення як `ceil(totalPages / 2)`. +- **Попередження про непарну кількість сторінок**: попереджає, коли загальна кількість сторінок непарна (часто це невідповідність під час сканування). +- **Підтвердження нерівних блоків**: просить підтвердження, коли розміри блоків лицьових і зворотних сторінок різні. +- **Експорт групами**: розділяє результат на окремі PDF за кількістю сторінок початкового документа та завантажує їх як ZIP. + +## Поведінка результату + +- **За замовчуванням**: один вихідний PDF (один вхідний PDF дає один вихідний PDF). +- **Режим групування**: результат ділиться на частини за вашим значенням сторінок на документ; якщо утворюється кілька частин, їх завантажують одним ZIP, інакше завантажується один PDF. + +Якщо розміри блоків різні, спочатку впорядковуються парні сторінки, а решта сторінок без пари додається в кінець. + +## Типові сценарії використання + +- Відновлення порядку після сканування стосу двосторонніх форм у два проходи. +- Відновлення пакетів лицьових і зворотних сторінок зі сканерів офісного типу, які виводять спочатку всі лицьові, потім усі зворотні сторони. +- Постобробка архівних сканів перед розділенням на файли для окремих документів. + +## Поради + +- У більшості дуплексних пакетів загальна кількість сторінок має бути парною. +- Якщо зворотні сторінки виглядають перевернутими, перемкніть між **Обернути блок зворотів** і **Залишити блок зворотів без змін**. +- Для оригіналів із 2 сторінок (лицьова та зворотна) використовуйте груповий експорт із `2` сторінками на документ. + +## Пов’язані інструменти + +- [Чергування та змішування сторінок](./alternate-merge) +- [Розділити PDF](./split-pdf) +- [Об’єднати PDF](./merge-pdf) +- [Дублювати та впорядкувати](./organize-pdf) diff --git a/docs/uk/tools/edit-attachments.md b/docs/uk/tools/edit-attachments.md new file mode 100644 index 00000000..655296da --- /dev/null +++ b/docs/uk/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Редагувати вкладення +description: Переглядайте та вибірково видаляйте вкладені файли, вбудовані в документ PDF. +--- + +# Редагувати вкладення + +Перевіряйте вкладені файли всередині PDF та керуйте ними. Інструмент виводить список усіх вбудованих файлів із їхніми назвами та рівнем вкладення, а потім дозволяє позначити окремі вкладення для видалення або прибрати їх усі одразу. + +## Як це працює + +1. Завантажте файл PDF. +2. Інструмент автоматично шукає вкладення та показує їх у списку. +3. Для кожного вкладення відображається назва файлу та те, чи воно на рівні документа, чи на рівні сторінки. +4. Клацніть піктограму кошика поруч із вкладенням, щоб позначити його для видалення (клацніть ще раз, щоб зняти позначку). +5. Кнопка **Видалити всі вкладення** позначає все одразу, а **Скасувати вибір усіх** скидає вибір. +6. Натисніть кнопку обробки, щоб зберегти новий PDF без вибраних вкладень. + +## Можливості + +- Список усіх вкладень на рівні документа та на рівні сторінки +- Видалення окремих вкладень або всіх одразу +- Перемикання вибору до підтвердження змін +- Візуальне закреслення та зміна прозорості для елементів, позначених для видалення +- Завантаження зміненого PDF без вибраних вкладень + +## Сценарії використання + +- Видалення застарілих чи помилкових файлів, вбудованих у документ, перед повторним розповсюдженням +- Прибирання конфіденційних вкладень (фінансові дані, особисті відомості) з PDF перед поширенням +- Зменшення розміру PDF шляхом видалення великих вбудованих файлів, які більше не потрібні +- Аудит вбудованого вмісту та очищення документа перед архівуванням + +## Поради + +- Вкладення, позначені для видалення, відображаються із закресленням. Ви можете зняти позначку до обробки, якщо передумаєте. +- Якщо вкладень не знайдено, інструмент показує чітке повідомлення "У цьому PDF вкладень не знайдено": PDF просто не містить вбудованих файлів. + +## Пов’язані інструменти + +- [Додати вкладення](./add-attachments) +- [Витяг вкладень](./extract-attachments) +- [Перегляд метаданих](./view-metadata) diff --git a/docs/uk/tools/edit-metadata.md b/docs/uk/tools/edit-metadata.md new file mode 100644 index 00000000..2c86ff0b --- /dev/null +++ b/docs/uk/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Редагувати метадані +description: Переглядайте та змінюйте поля метаданих PDF, зокрема назву, автора, ключові слова, дати та власні властивості. +--- + +# Редагувати метадані + +Редагуйте метадані, вбудовані у файл PDF. Інструмент попередньо заповнює форму наявними метаданими документа, дозволяє змінити будь-яке поле та зберігає зміни в новий PDF. + +## Як це працює + +1. Завантажте файл PDF. Інструмент зчитує поточні метадані та заповнює форму. +2. Редагуйте будь-які стандартні поля: Заголовок, Автор, Тема, Ключові слова, Створювач, Виробник. +3. Налаштуйте поля «Дата створення» і «Дата зміни» за допомогою вибору дати й часу. +4. Додавайте власні поля метаданих, натискаючи кнопку додавання та вводячи пару ключ-значення. +5. Натисніть кнопку обробки, щоб зберегти змінений PDF. + +## Можливості + +- Попереднє заповнення всіх наявних метаданих із завантаженого PDF +- Стандартні поля: Заголовок, Автор, Тема, Ключові слова, Створювач, Виробник +- Вибір дати й часу для полів «Дата створення» і «Дата зміни» +- Власні поля метаданих «ключ-значення» для довільних властивостей +- Збереження змін безпосередньо в інформаційний словник документа PDF + +## Поля, які можна редагувати + +| Поле | Опис | +| ------------------ | -------------------------------------------------------------- | +| **Заголовок** | Назва документа, що відображається в програмах для читання PDF | +| **Автор** | Особа чи організація, що створила документ | +| **Тема** | Короткий опис теми документа | +| **Ключові слова** | Терміни через кому для пошуку та категоризації | +| **Створювач** | Програма, у якій спочатку створено вміст | +| **Виробник** | Програма, яка згенерувала PDF | +| **Дата створення** | Коли документ було створено | +| **Дата зміни** | Коли документ востаннє змінювали | +| **Власні поля** | Будь-які додаткові пари «ключ-значення», які ви задаєте | + +## Сценарії використання + +- Установлення належної назви й автора перед публікацією документа +- Додавання ключових слів для кращого пошуку в системах керування документами +- Оновлення дати зміни, щоб відобразити поточну редакцію +- Додавання власних полів метаданих, як-от Department, Project ID чи Classification +- Очищення метаданих, залишених початковою програмою створення + +## Поради + +- Власні поля записуються безпосередньо в інформаційний словник PDF. Деякі програми для читання PDF можуть не показувати власні поля, але вони зберігаються у файлі. +- Залиште поле порожнім, щоб очистити його в метаданих. Кнопка обробки зберігає все, що є у формі. +- Щоб переглянути метадані без редагування, скористайтеся [Перегляд метаданих](./view-metadata). Щоб повністю видалити всі метадані, скористайтеся інструментом «Видалити метадані». + +## Пов’язані інструменти + +- [Перегляд метаданих](./view-metadata) +- [Шари OCG у PDF](./pdf-layers) +- [Стиснення PDF](./compress-pdf) diff --git a/docs/uk/tools/edit-pdf.md b/docs/uk/tools/edit-pdf.md new file mode 100644 index 00000000..3a39b1bd --- /dev/null +++ b/docs/uk/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Редактор PDF +description: Коментуйте, виділяйте, редагуйте з вилученням, додавайте фігури й зображення, шукайте та переглядайте PDF прямо у браузері. +--- + +# Редактор PDF + +Редактор PDF у BentoPDF дозволяє коментувати, виділяти, закреслювати з видаленням вмісту (редагування), залишати примітки, додавати фігури й зображення та шукати в ваших PDF. Він завантажує повнофункціональний редактор прямо у браузері без завантаження файлів на сервер. + +## Як це працює + +1. Завантажте PDF, клацнувши зону завантаження або перетягнувши на неї файл. +2. Вбудований редактор PDF відкриється автоматично із завантаженим документом. +3. Скористайтеся панеллю інструментів, щоб коментувати, виділяти, редагувати з вилученням, додавати текст, малювати фігури чи вставляти зображення. +4. Натисніть **Завантажити відредагований PDF**, щоб зберегти зміни. + +## Можливості + +- Повна панель анотацій із виділенням, підкресленням, закресленням і вільним малюванням +- Вставлення тексту та коментарі +- Інструменти редагування з вилученням, які остаточно видаляють позначений вміст після застосування. Якщо під час натискання **Завантажити відредагований PDF** якісь позначки не застосовано, редактор запропонує застосувати їх спочатку. +- Інструменти фігур: прямокутники, кола, лінії та стрілки +- Вставлення зображень на сторінки PDF +- Вбудований текстовий пошук по документу +- Підтримка кількох документів із вкладками (до 10 документів одночасно) +- Завантаження файлів перетягуванням + +## Сценарії використання + +- Перегляд договорів і позначення змін виділеннями та коментарями +- Вилучення конфіденційної інформації, як-от номерів соціального страхування чи фінансових даних, перед поширенням +- Додавання анотацій до архітектурних планів чи інженерних креслень +- Вставлення логотипів компаній чи штампів на сторінки документів +- Пошук певних термінів у довгих юридичних документах + +## Поради + +- Ви можете відкрити кілька PDF одночасно й перемикатися між ними за допомогою панелі вкладок угорі редактора. +- Редактор зберігає початкову структуру PDF, тож шрифти, верстка та поля форм залишаються цілими. +- Позначення тексту чи області для вилучення нічого не видаляє, доки вилучення не буде застосовано. Коли ви вилучаєте вибраний текст, його копії у властивостях файлу, закладках, коментарях і вкладеннях також видаляються із завантаженого файлу, якщо файл не зашифровано. +- Для масового додавання водяних знаків чи нумерації сторінок користуйтеся спеціальними інструментами, які дають більше контролю над форматуванням. + +## Пов’язані інструменти + +- [Додати водяний знак](./add-watermark) +- [Підписати PDF](./sign-pdf) +- [Додати штампи](./add-stamps) +- [Видалити анотації](./remove-annotations) diff --git a/docs/uk/tools/email-to-pdf.md b/docs/uk/tools/email-to-pdf.md new file mode 100644 index 00000000..d9b58d2d --- /dev/null +++ b/docs/uk/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email у PDF +description: Перетворюйте файли електронної пошти EML і MSG на PDF у браузері. Зберігає заголовки, тіло листа та список вкладень. +--- + +# Email у PDF + +Перетворюйте збережені файли електронних листів на охайні PDF для друку. Інструмент розбирає файли EML і MSG, витягує повне повідомлення (заголовки, вміст тіла та метадані вкладень) і відображає все у структурованому PDF. Корисно для юридичного розкриття доказів, ведення записів або просто для друку важливого листа. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----- | :--------- | :-------------------------------------------------------------------- | +| EML | `.eml` | Стандартний формат MIME (експортується з більшості поштових клієнтів) | +| MSG | `.msg` | Власний формат Microsoft Outlook | + +## Як це працює + +1. Клацніть зону завантаження або перетягніть файли EML чи MSG. В одній партії можна поєднувати обидва формати. +2. Перегляньте список файлів. Видаліть непотрібні піктограмою кошика або натисніть **Додати ще файли**, щоб додати інші листи. +3. Налаштуйте параметри перетворення (див. нижче). +4. Натисніть **Конвертувати у PDF**. Інструмент розбирає кожен лист, відображає вміст як стилізований HTML і перетворює його на PDF за допомогою рушія PyMuPDF. +5. Один лист завантажується одразу як PDF. Кілька листів пакуються в `emails-converted.zip`. + +## Параметри + +| Параметр | За замовчуванням | Опис | +| :------------------------------------------ | :--------------- | :---------------------------------------------------------------------------------------- | +| **Розмір сторінки** | A4 | Вибір розміру сторінки: A4, Letter або Legal. | +| **Додати одержувачів CC і BCC у заголовок** | Увімк. | Якщо ввімкнено, списки одержувачів CC і BCC з’являються в розділі заголовка листа в PDF. | +| **Додати список вкладень листа** | Увімк. | Якщо ввімкнено, у PDF з’являється список вкладених файлів листа (з іменами та розмірами). | + +## Сценарії використання + +- Архівування важливого ділового листування у PDF для відповідності вимогам чи аудиту +- Друк ланцюжків листів для судових проваджень чи запитів про розкриття доказів +- Створення постійного запису підтверджень замовлень, квитанцій чи договорів, отриманих електронною поштою +- Резервне копіювання файлів Outlook MSG у форматі, для читання якого не потрібен Outlook +- Документування звернень до служби підтримки за експортованими файлами EML + +## Поради + +- Підтримуються і EML (використовують Thunderbird, Apple Mail і більшість поштових клієнтів), і файли Outlook MSG. Експортуйте листи зі свого поштового клієнта й перетягуйте їх прямо в інструмент. +- Листи у форматі HTML зберігають стилі в PDF. Листи з простим текстом відображаються з охайним, читабельним форматуванням. +- Список вкладень показує імена файлів і розміри, але не вбудовує самі вкладені файли в PDF. + +## Пов’язані інструменти + +- [XML у PDF](./xml-to-pdf) +- [XPS у PDF](./xps-to-pdf) diff --git a/docs/uk/tools/epub-to-pdf.md b/docs/uk/tools/epub-to-pdf.md new file mode 100644 index 00000000..44f26fb6 --- /dev/null +++ b/docs/uk/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB у PDF +description: Перетворюйте електронні книги EPUB на PDF у браузері. Безкоштовно, без завантаження на сервер, з пріоритетом приватності. +--- + +# EPUB у PDF + +Перетворюйте електронні книги EPUB на файли PDF, не залишаючи браузер. EPUB є відкритим стандартом цифрових книг, але іноді потрібен PDF із фіксованою версткою для друку, коментування чи передавання людям без читалки. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----- | :--------- | :-------------------- | +| EPUB | `.epub` | Файли EPUB 2 і EPUB 3 | + +## Як це працює + +1. Клацніть зону завантаження або перетягніть файли EPUB. Підтримується вибір кількох файлів. +2. Перегляньте завантажені файли. Видаліть непотрібні піктограмою кошика або натисніть **Додати ще файли**, щоб розширити партію. +3. Натисніть **Конвертувати у PDF**. Рушій PyMuPDF відображає вміст EPUB (текст, зображення та форматування) у посторінковий PDF. +4. Один EPUB завантажується одразу як PDF. Кілька файлів пакуються в ZIP-архів `epub-converted.zip`. + +## Параметри + +Перетворення виконується зі зручними типовими налаштуваннями й не потребує обов’язкової конфігурації. Текст перекомпоновується під стандартні розміри сторінки, а вбудовані шрифти й зображення переносяться в PDF. + +## Сценарії використання + +- Друк електронної книги без DRM для читання поза екранами +- Подання рукопису EPUB як PDF із фіксованою версткою для рецензування +- Архівування цифрових книг у форматі, який нативно відкриває кожна операційна система +- Передавання розділу колезі, який не має читалки EPUB +- Перетворення технічної документації, що поширюється як EPUB, на PDF, які можна коментувати + +## Поради + +- Функції EPUB 3, як-от вбудоване аудіо та відео, не переносяться в PDF, але весь текст, зображення й таблиці перетворюються без проблем. +- Для найкращого результату з сильно стилізованими EPUB перевірте кілька перших сторінок результату, щоб переконатися у відповідності верстки. + +## Пов’язані інструменти + +- [MOBI у PDF](./mobi-to-pdf) +- [FB2 у PDF](./fb2-to-pdf) +- [CBZ у PDF](./cbz-to-pdf) diff --git a/docs/uk/tools/excel-to-pdf.md b/docs/uk/tools/excel-to-pdf.md new file mode 100644 index 00000000..46742108 --- /dev/null +++ b/docs/uk/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel у PDF +description: Перетворюйте електронні таблиці Excel (XLS, XLSX), ODS і CSV на PDF зі збереженням форматування. +--- + +# Excel у PDF + +Перетворюйте файли електронних таблиць на PDF. Інструмент працює із сучасними файлами Excel, застарілим форматом XLS, таблицями OpenDocument і навіть CSV, і все це відображається через рушій LibreOffice у браузері, який зберігає форматування клітинок, формули (як обчислені значення), діаграми та багатоаркушеві макети. + +## Підтримувані формати + +| Формат | Розширення | +| :------------------- | :--------- | +| Excel (сучасний) | `.xlsx` | +| Excel (застарілий) | `.xls` | +| Таблиця OpenDocument | `.ods` | +| CSV | `.csv` | + +## Як це працює + +1. Клацніть зону завантаження або перетягніть файли електронних таблиць. +2. Перегляньте список файлів. Додайте ще файли або видаліть непотрібні. +3. Натисніть **Конвертувати у PDF**. Рушій LibreOffice ініціалізується під час першого використання, а потім обробляє кожен файл. +4. Один файл завантажується одразу як PDF. Кілька файлів надаються як `excel-converted.zip`. + +## Параметри + +Цей інструмент не має додаткових налаштувань. Рушій LibreOffice визначає макет сторінки, масштабування та область друку за вбудованими параметрами таблиці. + +## Результат + +| Кількість вхідних файлів | Результат | +| :----------------------- | :--------------------------------------------------------------------- | +| 1 файл | Один PDF для завантаження (початкова назва файлу з розширенням `.pdf`) | +| 2+ файли | ZIP-архів (`excel-converted.zip`) з одним PDF на кожен файл | + +## Сценарії використання + +- Перетворення фінансових звітів чи бюджетів з Excel на PDF для розповсюдження +- Створення PDF, готових до друку, з таблиць інвентаря чи каталогів продукції +- Передавання результатів аналізу даних зацікавленим сторонам, які не мають Excel +- Архівування квартальних звітів у форматі без можливості редагування +- Перетворення файлів ODS з LibreOffice Calc на PDF + +## Поради + +- Діаграми, вбудовані в таблицю, відображаються в PDF. Переконайтеся, що вони виглядають правильно у початковому файлі, перш ніж перетворювати. +- Якщо в таблиці кілька аркушів, усі аркуші потрапляють у вихідний PDF. +- Для простих даних CSV без форматування інструмент [CSV у PDF](./csv-to-pdf) пропонує легше перетворення. Використовуйте Excel у PDF, коли потрібно зберегти форматування, діаграми чи кілька аркушів. + +## Пов’язані інструменти + +- [CSV у PDF](./csv-to-pdf) +- [Word у PDF](./word-to-pdf) +- [PowerPoint у PDF](./powerpoint-to-pdf) diff --git a/docs/uk/tools/extract-attachments.md b/docs/uk/tools/extract-attachments.md new file mode 100644 index 00000000..dd60d992 --- /dev/null +++ b/docs/uk/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Витяг вкладень +description: Витягуйте всі вбудовані вкладені файли з одного чи кількох PDF і завантажуйте їх як ZIP-архів. +--- + +# Витяг вкладень + +Витягуйте всі вбудовані вкладення з одного чи кількох файлів PDF. Усі витягнуті файли пакуються в один ZIP-архів для завантаження. + +## Як це працює + +1. Завантажте один або кілька файлів PDF із вбудованими вкладеннями. +2. Натисніть **Витяг вкладень**. +3. Інструмент шукає в кожному PDF вкладення на рівні документа та на рівні сторінки. +4. Усі знайдені файли пакуються в ZIP-архів і завантажуються автоматично. +5. Повідомлення про стан підтверджує, скільки вкладень знайдено та який їхній загальний розмір. + +## Можливості + +- Пакетне витягування з кількох PDF одночасно +- Витягує вкладення і на рівні документа, і на рівні сторінки +- Видає один ZIP-файл з усіма витягнутими файлами +- Показує загальну кількість вкладень і сукупний розмір файлів +- Чіткі повідомлення про стан, якщо вкладень не знайдено + +## Сценарії використання + +- Відновлення файлів даних, вбудованих у PDF зі звітом +- Витягування графічних ресурсів з портфоліо чи специфікації +- Витягування додаткових матеріалів з навчальних чи PDF для відповідності вимогам +- Аудит того, які файли вбудовано в пакет PDF + +## Поради + +- Якщо інструмент повідомляє, що вкладень немає, PDF може містити вбудовані зображення чи дані форм, а вони не є вкладеними файлами. Для вбудованих зображень скористайтеся [Витяг зображень](./extract-images). +- Під час обробки кількох PDF усі вкладення з усіх файлів потрапляють в один ZIP. Назви файлів зберігаються з початкових вбудувань. + +## Пов’язані інструменти + +- [Додати вкладення](./add-attachments) +- [Редагування вкладень](./edit-attachments) +- [Витяг зображень](./extract-images) diff --git a/docs/uk/tools/extract-images.md b/docs/uk/tools/extract-images.md new file mode 100644 index 00000000..d6bd032d --- /dev/null +++ b/docs/uk/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Витяг зображень +description: Витягуйте всі вбудовані зображення з файлів PDF. Переглядайте їх у сітці та завантажуйте окремо або як ZIP-архів. +--- + +# Витяг зображень + +Витягує всі вбудовані зображення з одного чи кількох файлів PDF. Витягнуті зображення відображаються в сітці попереднього перегляду, де їх можна завантажувати окремо або одразу всі як ZIP. Працює на PyMuPDF. + +## Як це працює + +1. Завантажте один чи кілька PDF, клацнувши зону завантаження або перетягнувши на неї файли. Додавайте інші файли або видаляйте окремі за потреби. +2. Натисніть **Витяг зображень**, щоб почати обробку. +3. Інструмент переглядає кожну сторінку кожного завантаженого PDF, знаходячи та витягуючи вбудовані зображення. +4. Витягнуті зображення з’являються в сітці з мініатюрами. Кожне зображення має кнопку завантаження. +5. Натисніть **Завантажити все**, щоб зберегти все як ZIP-архів. + +## Параметри + +Цей інструмент не має налаштовуваних параметрів. Усі вбудовані зображення витягуються у власному форматі (зазвичай PNG, JPEG або в тому, у якому зображення було вбудовано в PDF). + +## Формат результату + +- Зображення відображаються в сітці попереднього перегляду з назвами `image_1.png`, `image_2.jpg` тощо. +- **Завантажити все** створює `extracted-images.zip` з усіма зображеннями. +- Окремі зображення можна завантажувати по одному із сітки. + +## Сценарії використання + +- Відновлення фото чи графіки з PDF для повторного використання в іншому проєкті. +- Витягування зображень товарів з PDF-каталогу для картки товару в інтернет-магазині. +- Витягування діаграм з технічної документації для презентацій. +- Аудит того, які зображення вбудовано в документ, перед його поширенням. + +## Поради + +- Інструмент витягує зображення точно так, як вони збережені в PDF. Він не відображає сторінки як зображення: для цього скористайтеся [PDF у PNG](./pdf-to-png) або [PDF у JPG](./pdf-to-jpg). +- Якщо інструмент повідомляє "Зображень не знайдено", PDF може використовувати векторну графіку замість вбудованих растрових зображень або бути скануванням, де вся сторінка є одним великим зображенням. +- Пакетна обробка працює для кількох PDF. Усі зображення з усіх файлів об’єднуються в одну сітку та один ZIP. + +## Пов’язані інструменти + +- [PDF у PNG](./pdf-to-png) +- [PDF у JPG](./pdf-to-jpg) +- [Конструктор робочих процесів PDF](./pdf-workflow) diff --git a/docs/uk/tools/extract-pages.md b/docs/uk/tools/extract-pages.md new file mode 100644 index 00000000..1bfb711e --- /dev/null +++ b/docs/uk/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Витяг сторінок +description: Зберігайте певний діапазон сторінок із PDF як новий документ. +--- + +# Витяг сторінок + +Витягуйте набір сторінок із PDF і зберігайте їх як новий файл. Вкажіть потрібні сторінки за синтаксисом діапазонів, і інструмент створить чистий PDF лише з ними. + +## Як це працює + +1. Завантажте файл PDF. Інструмент покаже назву файлу, розмір і загальну кількість сторінок. +2. Введіть сторінки для витягування за синтаксисом діапазонів (наприклад, `1-5`, `3, 7, 10-12`). +3. За бажання виберіть завантаження кожного діапазону як окремого PDF у ZIP-архіві. +4. Натисніть кнопку обробки. Витягнуті сторінки завантажаться як новий PDF (або ZIP). + +## Можливості + +- Гнучкий синтаксис діапазонів: окремі сторінки, діапазони або комбінації через кому +- Показує загальну кількість сторінок після завантаження для зручності +- Можливість отримати один об’єднаний PDF або окремі файли в ZIP +- Зберігає початковий вміст і форматування сторінок + +## Сценарії використання + +- Витягування короткого резюме (перших кількох сторінок) з довгого звіту +- Витягування одного розділу з PDF-підручника +- Збереження окремих сторінок із пакета форм як самостійних документів +- Створення зразка документа з вибраних сторінок більшого файлу + +## Поради + +- Нумерація сторінок починається з одиниці. Використовуйте `1` для першої сторінки, а не `0`. +- Щоб видалити сторінки, а не витягнути їх, скористайтеся [Видалити сторінки](./delete-pages): це обернена операція. +- Якщо потрібен візуальний вибір сторінок із мініатюрами, використовуйте [Розділити PDF](./split-pdf) у режимі «Вибрати сторінки візуально». + +## Пов’язані інструменти + +- [Розділити PDF](./split-pdf) +- [Видалити сторінки](./delete-pages) +- [Об’єднати PDF](./merge-pdf) diff --git a/docs/uk/tools/extract-tables.md b/docs/uk/tools/extract-tables.md new file mode 100644 index 00000000..1b79f0b7 --- /dev/null +++ b/docs/uk/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Витяг таблиць +description: Знаходьте та витягуйте таблиці з документів PDF. Експорт у CSV, JSON або Markdown з деталізацією по кожній таблиці. +--- + +# Витяг таблиць + +Знаходить усі таблиці в PDF і дозволяє експортувати їх у вибраному форматі: CSV, JSON або Markdown. Кожна таблиця витягується окремо з метаданими сторінки та позиції. Працює на рушії виявлення таблиць PyMuPDF. + +## Як це працює + +1. Завантажте PDF, клацнувши зону завантаження або перетягнувши на неї файл. +2. Виберіть бажаний **формат експорту**: CSV, JSON або Markdown. +3. Натисніть **Витягнути таблиці**, щоб почати обробку. +4. Якщо знайдено одну таблицю, вона завантажується як один файл. Кілька таблиць дають ZIP-архів з одним файлом на таблицю. + +## Параметри + +- **Формат експорту**: виберіть один із варіантів: + - **CSV**: значення, розділені комами, з належним екрануванням полів, що містять коми, лапки чи переноси рядків. Підходить для електронних таблиць і баз даних. + - **JSON**: структура масиву масивів, відформатована з відступом у 2 пробіли. Підходить для програмної обробки. + - **Markdown**: формат таблиці з роздільниками-вертикальними рисками, який формує PyMuPDF. Підходить для документації та файлів README. + +## Формат результату + +- **Одна таблиця**: `filename_table.csv` (або `.json` / `.md`) +- **Кілька таблиць**: `filename_tables.zip` з файлами на кшталт `table_1_page3.csv`, `table_2_page5.csv` тощо. + +## Сценарії використання + +- Витягування окремих таблиць із довгих PDF-звітів без вивантаження даних усього документа. +- Отримання таблиць у форматі Markdown для вставлення безпосередньо в задачі GitHub, вікі чи документацію. +- Отримання структурованих даних JSON із таблиць PDF для інтеграцій з API чи скриптів. +- Порівняння таблиць у різних версіях PDF шляхом експорту обох у CSV і перегляду відмінностей. + +## Поради + +- Цей інструмент дає контроль над кожною таблицею окремо. Якщо потрібно просто вивантажити всі таблиці в один CSV, скористайтеся [PDF у CSV](./pdf-to-csv). Для повної книги Excel використовуйте [PDF у Excel](./pdf-to-excel). +- Таблиці, що охоплюють кілька сторінок, можуть визначатися як окремі таблиці на кожній сторінці. Можливо, їх доведеться об’єднати вручну. +- Якщо таблиць не виявлено, PDF може бути скануванням. Спершу пропустіть його через OCR, щоб додати текстовий шар. + +## Пов’язані інструменти + +- [PDF у CSV](./pdf-to-csv) +- [PDF у Excel](./pdf-to-excel) +- [PDF у текст](./pdf-to-text) diff --git a/docs/uk/tools/fb2-to-pdf.md b/docs/uk/tools/fb2-to-pdf.md new file mode 100644 index 00000000..a92138c4 --- /dev/null +++ b/docs/uk/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 у PDF +description: Конвертуйте електронні книги FictionBook (FB2) у PDF у браузері. Безкоштовно, приватно, без завантаження на сервер. +--- + +# FB2 у PDF + +Конвертуйте файли FictionBook 2 (FB2) у документи PDF. FB2 це формат електронних книг на основі XML, популярний в Україні та Східній Європі. На одних платформах він добре підтримується, а на інших майже невідомий, тому конвертація в PDF робить ваші книги доступними всюди. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :------------ | :--------- | :----------------------------- | +| FictionBook 2 | `.fb2` | Формат електронних книг на XML | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли FB2. Можна вибрати одразу кілька файлів. +2. Перегляньте список файлів. Значком кошика видаляйте окремі записи, а кнопкою **Додати ще файли** додавайте нові. +3. Натисніть **Конвертувати в PDF**. Рушій PyMuPDF розбирає XML-структуру FB2 і відтворює її як посторінковий вміст PDF. +4. Один файл завантажується як PDF одразу. Кілька конвертацій пакуються в `fb2-converted.zip`. + +## Параметри + +Налаштування не потрібні. Конвертер автоматично обробляє XML-структуру FB2 і зберігає розриви розділів, форматування та вбудовані зображення. + +## Сценарії використання + +- Читання електронних книг FB2 на пристроях або в застосунках, які підтримують лише PDF +- Друк літератури, що поширюється у форматі FB2 +- Архівування бібліотеки FB2 у формат, який підтримується всюди +- Передавання книги людині, чия читалка не підтримує FictionBook + +## Поради + +- Файли FB2 є звичайним XML, тому вони зазвичай невеликі й швидко конвертуються навіть у браузері. +- Якщо ваші файли FB2 стиснуті як `.fb2.zip`, спочатку розпакуйте їх, а потім завантажуйте. + +## Пов’язані інструменти + +- [EPUB у PDF](./epub-to-pdf) +- [MOBI у PDF](./mobi-to-pdf) +- [XML у PDF](./xml-to-pdf) diff --git a/docs/uk/tools/fix-page-size.md b/docs/uk/tools/fix-page-size.md new file mode 100644 index 00000000..24d662c3 --- /dev/null +++ b/docs/uk/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Вирівняти розмір сторінок +description: Приведіть усі сторінки PDF до єдиного розміру. Оберіть стандартний формат паперу або задайте власні розміри. +--- + +# Вирівняти розмір сторінок + +PDF, зібрані з різних джерел, часто мають сторінки різного розміру: одні Letter, інші A4, а деякі зовсім нестандартні. Цей інструмент примусово задає всім сторінкам один цільовий розмір, масштабуючи вміст так, щоб він вписувався або заповнював сторінку. + +## Як це працює + +1. Завантажте файл PDF. +2. Оберіть **Цільовий розмір сторінки** зі списку (A4, Letter, Legal, A3, A5, Tabloid або Власний). +3. Оберіть **Орієнтацію**: Авто зберігає початкову орієнтацію кожної сторінки, або можна примусово задати книжкову чи альбомну. +4. Оберіть режим **Масштабування вмісту**: Вписати (зберігає весь вміст, може додати поля) або Заповнити (заповнює сторінку, може обрізати краї). +5. За потреби задайте **Колір фону** для доданих полів. +6. Натисніть **Вирівняти розмір сторінок**. + +## Параметри + +- **Стандартні розміри**: A4, Letter, Legal, A3, A5, Tabloid +- **Власні розміри**: введіть ширину та висоту в дюймах або міліметрах +- **Орієнтація**: Авто, книжкова, альбомна +- **Режим масштабування**: Вписати або Заповнити (з обрізанням) +- **Колір фону**: будь-який колір для заповнення полів + +## Сценарії використання + +- Нормалізація об’єднаного PDF, сторінки якого походять із різних сканерів +- Перетворення документа US Letter на A4 для міжнародного розповсюдження +- Підготовка PDF до друку, що потребують однакового розміру обрізання +- Виправлення сторінок, які трохи відхиляються від стандарту (наприклад, 8,49 x 11,02 дюйма замість 8,5 x 11) + +## Поради + +- Використовуйте режим Вписати, щоб гарантовано не втратити вміст. Режим Заповнити виглядає охайніше, але може обрізати краї. +- Перевірте результат інструментом «Розміри сторінок», щоб переконатися, що всі сторінки відповідають цільовому розміру. +- За замовчуванням фон білий; оберіть темний колір, якщо поля вашого документа темні. + +## Пов’язані інструменти + +- [Розміри сторінок](./page-dimensions): перегляньте розміри сторінок до і після виправлення +- [Стиснення PDF](./compress-pdf): зменште розмір файлу після вирівнювання +- [Обрізати PDF](./crop-pdf): обрізайте сторінки вручну замість автоматичного масштабування diff --git a/docs/uk/tools/flatten-pdf.md b/docs/uk/tools/flatten-pdf.md new file mode 100644 index 00000000..526b57da --- /dev/null +++ b/docs/uk/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Сплющити PDF +description: Перетворіть інтерактивні форми й анотації на статичний вміст. Поля форм стають нередагованими, а анотації вбудовуються в сторінку. +--- + +# Сплющити PDF + +Сплющення вбудовує інтерактивні елементи (поля форм, випадні списки, прапорці, анотації, виділення, нотатки) безпосередньо у вміст сторінки. Вигляд залишається тим самим, але нічого вже не можна редагувати чи витягувати. Це аналог друку заповненої форми та повторного сканування, тільки якість лишається ідеальною. + +## Як це працює + +1. Завантажте один або кілька файлів PDF. +2. Натисніть **Сплющити PDF**. +3. Один файл завантажується одразу. Кілька файлів дають архів ZIP. + +Інструмент використовує pdf-lib для сплющення полів форм (через `form.flatten()`) і окремий модуль сплющення анотацій, який вбудовує анотації в потік сторінки. Обидві операції виконуються за один прохід. + +## Що сплющується + +- **Поля форм**: текстові поля, прапорці, радіокнопки, випадні списки, поля підпису +- **Анотації**: коментарі, виділення, закреслення, підкреслення, нотатки, штампи, рукописні анотації +- **Інтерактивні елементи**: кнопки, тригери дій + +## Що не змінюється + +- Текстовий вміст (залишається виділюваним і доступним для пошуку) +- Зображення та графіка +- Макет і розміри сторінок +- Закладки та зміст +- Гіперпосилання (крім тих, що реалізовані як анотації) + +## Сценарії використання + +- Блокування заповненої форми, щоб отримувачі не могли змінити надані відповіді +- Підготовка PDF до архівування, коли інтерактивні елементи не потрібні +- Усунення проблем відображення, коли анотації виглядають по-різному в різних переглядачах +- Гарантія того, що підписаний документ не можна змінити після накладання підпису +- Зменшення розміру файлу завдяки видаленню визначень полів форм і об’єктів анотацій + +## Поради + +- Сплющуйте після завершення всіх правок. Скасувати сплющення PDF неможливо. +- Якщо потрібно сплющити та ще й видалити метадані, JavaScript і вкладення, скористайтеся інструментом «Очистити PDF»: сплющення є одним із його параметрів. +- Деякі PDF повідомляють «форму не знайдено». Це нормально, якщо в документі є лише анотації без полів форм. + +## Пов’язані інструменти + +- [Очистити PDF](./sanitize-pdf): сплющення форм плюс видалення метаданих, скриптів та іншого +- [Растеризація PDF](./rasterize-pdf): перетворення на PDF із зображень для максимального сплющення +- [Шрифти у контури](./font-to-outline): перетворення шрифтів на векторні контури +- [Зашифрувати PDF](./protect-pdf): захистіть сплющений PDF паролем diff --git a/docs/uk/tools/font-to-outline.md b/docs/uk/tools/font-to-outline.md new file mode 100644 index 00000000..7071b2f9 --- /dev/null +++ b/docs/uk/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Шрифти у контури +description: Перетворіть усі шрифти PDF на векторні контури для однакового відображення на різних пристроях. Усуває проблеми із залежністю від шрифтів. +--- + +# Шрифти у контури + +Перетворення шрифтів на контури змінює кожен символ тексту із гліфа шрифту на векторний контур. PDF більше не залежить від встановлених шрифтів: він виглядає однаково на кожному пристрої, в кожній операційній системі та на кожному принтері. Це стандартний крок у поліграфічній підготовці. + +## Як це працює + +1. Завантажте один або кілька файлів PDF. +2. Натисніть **Перетворити на контури**. +3. Ghostscript перетворює весь текст на векторні контури. +4. Завантажте результат. Кілька файлів дають архів ZIP. + +Налаштовувати нічого не потрібно. Інструмент використовує Ghostscript (WebAssembly), щоб за один прохід перетворити всі посилання на шрифти на контури. + +## Що змінюється + +- Символи тексту стають векторними кривими (контурами Безьє) +- Вбудовувати шрифти більше не потрібно: PDF самодостатній на рівні гліфів +- Розмір файлу може збільшитися, бо векторні контури зазвичай більші за посилання на шрифти +- Зовнішній вигляд зберігається точно + +## Що втрачається + +- Виділення та копіювання тексту +- Пошук за текстом (Ctrl+F перестає працювати) +- Можливість редагувати текстовий вміст +- Доступність для екранних читалок + +## Сценарії використання + +- Надсилання PDF до друкарні, яка вимагає шрифтів у контурах +- Передавання документів із власними або ліцензованими шрифтами людям, у яких цих шрифтів немає +- Запобігання підміні шрифтів, яка змінює вигляд документа в інших системах +- Підготовка PDF для лазерного гравіювання або CNC-різання, що потребують векторних даних +- Гарантія правильного відображення PDF із великою кількістю логотипів на всіх платформах + +## Поради + +- Зберігайте оригінал PDF. Створення контурів незворотне: перетворити контури назад на редагований текст неможливо. +- Якщо текст має залишатися доступним для пошуку, натомість скористайтеся інструментом «Растеризація PDF», а потім OCR. +- PDF із контурами зазвичай більші. Якщо розмір важливий, після цього запустіть «Стиснення PDF». + +## Пов’язані інструменти + +- [Сплющити PDF](./flatten-pdf): сплющення форм і анотацій без зміни шрифтів +- [Растеризація PDF](./rasterize-pdf): перетворення на PDF із зображень замість векторних контурів +- [Стиснення PDF](./compress-pdf): зменшення розміру файлу після створення контурів +- [PDF у PDF/A](./pdf-to-pdfa): конвертація для архівування після забезпечення незалежності від шрифтів diff --git a/docs/uk/tools/form-creator.md b/docs/uk/tools/form-creator.md new file mode 100644 index 00000000..0754ca17 --- /dev/null +++ b/docs/uk/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Створити PDF-форму +description: Створюйте PDF-форми для заповнення з текстовими полями, прапорцями, випадними списками, радіокнопками та іншим за допомогою перетягування. +--- + +# Створити PDF-форму + +Створюйте професійні PDF-форми для заповнення з нуля або додавайте поля до наявного PDF. Візуальний редактор дозволяє перетягувати елементи форми (текстові поля, прапорці, випадні списки, радіокнопки, поля підпису та інше) безпосередньо на попередній перегляд сторінок. Налаштовуйте властивості полів, задавайте правила умовної видимості та експортуйте повністю інтерактивну PDF-форму. + +## Як це працює + +1. Завантажте наявний PDF **або** натисніть **Створити порожній PDF**, щоб почати з нуля. +2. Якщо створюєте порожній PDF, оберіть розмір сторінки (Letter, A4, A5, Legal, Tabloid, A3 або власні розміри). +3. Відкриється редактор форм із панеллю типів полів і областю попереднього перегляду сторінки. +4. Оберіть тип поля на панелі, а потім клацніть на сторінці, щоб його розмістити. +5. Перетягуйте поля, щоб змінити їхнє положення. Маркерами зміни розміру коригуйте розміри. +6. Клацніть поле, щоб відкрити панель властивостей, де можна задати ім’я поля, значення за замовчуванням, розмір шрифту, вирівнювання та інше. +7. Переходьте між сторінками за допомогою елементів керування сторінками. +8. Натисніть **Зберегти**, щоб завантажити готовий PDF для заповнення. + +## Можливості + +- Розміщення полів перетягуванням із візуальними маркерами зміни розміру +- Типи полів: текстове, багаторядкове, прапорець, випадний список, радіокнопка, підпис, дата, число та штрихкод +- Панель властивостей для налаштування імені, мітки, значення за замовчуванням, розміру шрифту, кольору, вирівнювання та перевірки кожного поля +- Дії полів і правила умовної видимості (показ або приховування полів залежно від значень інших полів) +- Навігація сторінками для багатосторінкових форм +- Витягування наявних полів: автоматичне виявлення та імпорт полів форм із завантажених PDF +- Підтримка як завантажених PDF, так і порожніх сторінок як основи форми +- Кілька готових розмірів сторінки та власні розміри +- Генерація штрихкодів на основі bwip-js +- Керування групами радіокнопок + +## Параметри + +**Готові розміри сторінки (для порожніх PDF):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Власний (вкажіть ширину та висоту) + +**Властивості полів (залежать від типу поля):** + +- Ім’я, мітка та текст-підказка +- Значення за замовчуванням +- Гарнітура, розмір і колір шрифту +- Вирівнювання тексту (ліворуч, по центру, праворуч) +- Перемикач обов’язкового поля +- Перемикач «лише для читання» +- Максимальна довжина для текстових полів +- Список варіантів для випадних списків і радіокнопок +- Дії умовної видимості + +## Сценарії використання + +- Створення форм для прийому нових співробітників із текстовими полями для особистих даних і прапорцями для підтвердження політик +- Створення анкет для нових клієнтів із випадними списками для вибору послуги +- Розробка бланків замовлення з обчислюваними полями та штрихкодами-ідентифікаторами +- Створення контрольних списків для інспекцій із радіокнопками для оцінок «пройдено/не пройдено» +- Створення опитувань з умовними уточнювальними запитаннями, що з’являються залежно від відповідей + +## Поради + +- Якщо ви завантажуєте наявний PDF, інструмент спробує витягти всі наявні поля форм, щоб ви могли редагувати їх або додавати нові. +- Використовуйте групи радіокнопок для взаємовиключних варіантів. Поля в одній групі мають спільне ім’я групи. +- Перевірте форму: завантажте її та відкрийте в інструменті [Заповнення PDF-форм](./form-filler), щоб переконатися, що поля працюють правильно. + +## Пов’язані інструменти + +- [Заповнення PDF-форм](./form-filler) +- [Підписати PDF](./sign-pdf) +- [Редактор PDF](./edit-pdf) diff --git a/docs/uk/tools/form-filler.md b/docs/uk/tools/form-filler.md new file mode 100644 index 00000000..b523f13e --- /dev/null +++ b/docs/uk/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Заповнення PDF-форм +description: Заповнюйте PDF-форми, зокрема XFA, прямо у браузері за допомогою вбудованого переглядача. +--- + +# Заповнення PDF-форм + +Відкрийте PDF із полями форм і заповніть його прямо у вбудованому переглядачі. Інструмент підтримує як стандартні поля AcroForm, так і застарілі форми XFA (XML Forms Architecture). Після заповнення форми завантажте готову версію одним кліком. + +## Як це працює + +1. Завантажте PDF, що містить поля форм. +2. Документ відкривається в інтегрованому переглядачі PDF, який відображає поля форм як інтерактивні елементи. +3. Клацайте текстові поля, прапорці, випадні списки та радіокнопки, щоб заповнити їх. +4. Натисніть **Зберегти та завантажити заповнену форму**, щоб отримати готовий PDF. + +## Можливості + +- Вбудований переглядач PDF.js з повною взаємодією з полями форм +- Підтримка стандартних полів AcroForm (текстові поля, прапорці, випадні списки, радіокнопки) +- Підтримка форм XFA для застарілих форм на основі XML +- Автоматичний підбір розміру переглядача за розмірами сторінки +- Відображення імені та розміру файлу + +## Параметри + +Додаткових параметрів немає. Завантажте форму, заповніть її та завантажте результат. + +## Сценарії використання + +- Заповнення податкових форм, страхових заяв або державних документів +- Заповнення анкет для прийому на роботу, отриманих як вкладення PDF +- Заповнення форм реєстрації постачальників або анкет для підрядників +- Підтвердження контрольних списків відповідності за допомогою прапорців +- Заповнення медичних анкет перед візитом до лікаря + +## Поради + +- XFA це застарілий формат, який підтримують лише деякі переглядачі PDF. Якщо ви відкриваєте PDF із XFA у Chrome або більшості інших інструментів і бачите порожні сторінки, це означає, що в цих переглядачах немає підтримки XFA. Заповнення PDF-форм у BentoPDF і Firefox коректно обробляють XFA. +- Для PDF без наявних полів форм спочатку додайте поля інструментом [Створити PDF-форму](./form-creator), а потім заповніть їх тут. +- Переглядач автоматично підлаштовує свій розмір під розміри сторінки PDF. + +## Пов’язані інструменти + +- [Створити PDF-форму](./form-creator) +- [Підписати PDF](./sign-pdf) +- [Редактор PDF](./edit-pdf) diff --git a/docs/uk/tools/header-footer.md b/docs/uk/tools/header-footer.md new file mode 100644 index 00000000..4a1ab28e --- /dev/null +++ b/docs/uk/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Колонтитули +description: Додавайте власний текст верхнього й нижнього колонтитулів на сторінки PDF із динамічними змінними номера сторінки. +--- + +# Колонтитули + +Додавайте текст у шість позицій на сторінках PDF: верхній ліворуч, верхній по центру, верхній праворуч, нижній ліворуч, нижній по центру та нижній праворуч. Інструмент підтримує динамічні змінні для номера сторінки та загальної кількості сторінок, тож можна створювати шаблони на кшталт «Сторінка 3 з 10», які автоматично оновлюються для кожної сторінки. + +## Як це працює + +1. Завантажте файл PDF. +2. З’явиться панель параметрів з елементами форматування та шістьма полями введення тексту. +3. Введіть потрібний текст у будь-яку позицію колонтитулів. +4. Використовуйте заповнювачі `{page}` і `{total}` для динамічної нумерації сторінок. +5. Налаштуйте розмір і колір шрифту та за потреби обмежте діапазон сторінок. +6. Натисніть **Додати колонтитули**, щоб обробити файл і завантажити результат. + +## Параметри + +- **Діапазон сторінок**: за потреби обмежте сторінки, на які додаються колонтитули. Залиште порожнім, щоб застосувати до всіх сторінок. Формат: «1-3, 5» (діапазони через кому). +- **Розмір шрифту**: від 6 до 24 пунктів. За замовчуванням 10. +- **Колір шрифту**: оберіть будь-який колір за допомогою вибору кольору. +- **Верхній ліворуч / по центру / праворуч**: текстові поля для верхньої частини кожної сторінки. +- **Нижній ліворуч / по центру / праворуч**: текстові поля для нижньої частини кожної сторінки. + +## Можливості + +- Шість незалежних позицій тексту на кожній сторінці +- Динамічна змінна `{page}`, що вставляє поточний номер сторінки +- Динамічна змінна `{total}`, що вставляє загальну кількість сторінок +- Фільтрація за діапазоном сторінок для вибору конкретних сторінок +- Налаштовуваний розмір і колір шрифту +- Шрифт Helvetica для чистого професійного вигляду + +## Сценарії використання + +- Додавання «Сторінка {page} з {total}» у нижній колонтитул по центру звіту +- Розміщення назви компанії у верхньому колонтитулі ліворуч, а дати документа праворуч +- Додавання повідомлень про конфіденційність у нижній колонтитул юридичних документів +- Нанесення номерів редакцій документа на певні діапазони сторінок + +## Поради + +- Поєднуйте `{page}` і `{total}` в одному полі для форматів на кшталт «Сторінка {page} з {total}» або «{page}/{total}». +- Більшість полів можна залишити порожніми та заповнити лише потрібні позиції. Порожні поля просто пропускаються. +- Для складніших колонтитулів із зображеннями чи логотипами скористайтеся інструментом [Додати водяний знак](./add-watermark), розмістивши його у верхній частині сторінки. + +## Пов’язані інструменти + +- [Нумерація сторінок](./page-numbers) +- [Додати водяний знак](./add-watermark) +- [Нумерація Bates](./bates-numbering) diff --git a/docs/uk/tools/heic-to-pdf.md b/docs/uk/tools/heic-to-pdf.md new file mode 100644 index 00000000..115675e2 --- /dev/null +++ b/docs/uk/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC у PDF +description: Конвертуйте зображення HEIC і HEIF з iPhone та iPad у PDF прямо у браузері. +--- + +# HEIC у PDF + +Конвертуйте зображення HEIC/HEIF у PDF. HEIC є стандартним форматом фото на iPhone та iPad починаючи з iOS 11. Цей інструмент дозволяє перетворити такі фото на PDF без встановлення програм і без завантаження файлів на сервер. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :--------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли HEIC/HEIF. +2. Перегляньте список файлів і видаліть непотрібні. +3. Натисніть **Конвертувати в PDF**. Результат завантажується як `from_heic.pdf`. + +Кожен файл HEIC декодується бібліотекою heic2any, яка перетворює його на PNG із якістю 92%. Потім PNG вбудовується в PDF за допомогою pdf-lib: кожне зображення на окремій сторінці в повному розмірі. + +## Параметри + +Цей інструмент не має додаткових налаштувань. Зображення HEIC перед вбудовуванням конвертуються у PNG з високою якістю (0.92). + +## Сценарії використання + +- Створення PDF із фото з iPhone для додавання до страхової заяви чи звіту +- Конвертація фото HEIC для оголошення про нерухомість в один документ для друку +- Перетворення скриншотів iPad (формат HEIF) на PDF, яким легко поділитися +- Пакетна конвертація фото з відпустки для подорожнього щоденника + +## Поради + +- Декодування HEIC повністю відбувається у браузері за допомогою WebAssembly. Перша конвертація може тривати трохи довше, поки завантажується декодер. +- Якщо потрібно поєднати HEIC з іншими форматами зображень (JPG, PNG тощо), скористайтеся інструментом [Зображення у PDF](./image-to-pdf), який обробляє HEIC разом з усіма іншими форматами. +- Файли HEIC з iPhone часто містять дані EXIF, зокрема координати GPS. У вихідному PDF ці метадані не зберігаються. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [JPG у PDF](./jpg-to-pdf) +- [PNG у PDF](./png-to-pdf) diff --git a/docs/uk/tools/image-to-pdf.md b/docs/uk/tools/image-to-pdf.md new file mode 100644 index 00000000..c1a0dab9 --- /dev/null +++ b/docs/uk/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Зображення у PDF +description: Конвертуйте JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD та понад 10 інших форматів зображень в один файл PDF. +--- + +# Зображення у PDF + +Універсальний конвертер зображень у PDF. Завантажуйте зображення практично в будь-якому форматі та об’єднуйте їх в один документ PDF. Кожне зображення отримує власну сторінку з розмірами оригіналу. + +## Підтримувані формати + +| Формат | Розширення | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Це найширша підтримка форматів серед усіх конвертерів зображень BentoPDF. Якщо вам потрібен лише один формат, скористайтеся відповідним окремим інструментом. + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли зображень. Можна вибрати кілька файлів одночасно. +2. Перегляньте список файлів. Видаліть непотрібні файли значком кошика або натисніть **Додати ще файли**, щоб додати інші зображення. +3. Оберіть рівень **Якості PDF** у списку. +4. Натисніть **Конвертувати в PDF**. Інструмент обробляє зображення рушієм PyMuPDF і завантажує результат як `images_to_pdf.pdf`. + +## Параметри + +**Якість PDF** визначає стиснення зображень під час вбудовування в PDF: + +- **Висока якість**: мінімальне стиснення, більший розмір файлу. Найкраще для друку чи архівування. +- **Середня якість** (за замовчуванням): збалансоване стиснення. Підходить для більшості випадків. +- **Низька якість**: сильне стиснення, найменший розмір файлу. Підходить для електронної пошти чи швидкого обміну. + +Файли HEIC і WebP автоматично конвертуються у PNG перед вбудовуванням. Це відбувається непомітно й не потребує додаткових дій. + +## Сценарії використання + +- Об’єднання сканованих чеків чи документів, зроблених камерою телефона, в один PDF +- Створення фотопортфоліо чи лукбука зі зображень різних форматів +- Конвертація фото з iPhone (HEIC) у PDF без встановлення програм +- Збирання дизайнерських макетів з експортів PSD і скриншотів у фінальний матеріал для клієнта +- Архівування теки зі старими форматами зображень (PNM, JXR, JP2) в один PDF + +## Поради + +- Порядок зображень у PDF відповідає їхньому порядку в списку файлів. Завантажуйте їх у потрібній послідовності. +- Для найменшого розміру файлу оберіть низьку якість. Для сканів із великою кількістю тексту різниця зазвичай непомітна. +- Якщо у вас зображення лише одного формату, окремі конвертери (JPG у PDF, PNG у PDF тощо) дають той самий результат із простішим інтерфейсом. + +## Пов’язані інструменти + +- [JPG у PDF](./jpg-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [HEIC у PDF](./heic-to-pdf) +- [WebP у PDF](./webp-to-pdf) diff --git a/docs/uk/tools/index.md b/docs/uk/tools/index.md new file mode 100644 index 00000000..78124e47 --- /dev/null +++ b/docs/uk/tools/index.md @@ -0,0 +1,183 @@ +# Довідник інструментів + +BentoPDF пропонує **понад 130 інструментів** для роботи з PDF. Усі інструменти працюють повністю у вашому браузері: ваші файли ніколи не залишають пристрій. + +--- + +## Редагування та анотації + +Змінюйте, позначайте та покращуйте документи PDF за допомогою повного набору інструментів редагування. + +
+ +- [**Редактор PDF**](./edit-pdf): анотуйте, виділяйте, редагуйте вміст, коментуйте, додавайте фігури та зображення, шукайте й переглядайте PDF. +- [**Редагувати закладки**](./bookmark): додавайте, редагуйте, імпортуйте, видаляйте та витягуйте закладки PDF. +- [**Зміст**](./table-of-contents): створіть сторінку змісту із закладок PDF. +- [**Нумерація сторінок**](./page-numbers): вставте номери сторінок у документ. +- [**Додати нумерацію сторінок**](./add-page-labels): застосуйте мітки сторінок PDF з римськими цифрами, префіксами та власним початком. +- [**Нумерація Bates**](./bates-numbering): додайте послідовні номери Bates в один чи кілька файлів PDF. +- [**Додати водяний знак**](./add-watermark): нанесіть текст або зображення поверх сторінок PDF. +- [**Колонтитули**](./header-footer): додайте текст у верхню та нижню частину сторінок. +- [**Інвертувати кольори**](./invert-colors): створіть версію PDF для темного режиму. +- [**Ефект сканера**](./scanner-effect): зробіть так, щоб PDF виглядав як відсканований документ. +- [**Корекція кольору**](./adjust-colors): точно налаштуйте яскравість, контраст, насиченість та інше. +- [**Колір фону**](./background-color): змініть колір фону PDF. +- [**Змінити колір тексту**](./text-color): змініть колір тексту у PDF. +- [**Підписати PDF**](./sign-pdf): намалюйте, надрукуйте або завантажте свій підпис. +- [**Додати штампи**](./add-stamps): додайте штампи із зображень до PDF за допомогою панелі анотацій. +- [**Видалити анотації**](./remove-annotations): приберіть коментарі, виділення та посилання. +- [**Обрізати PDF**](./crop-pdf): обріжте поля кожної сторінки PDF. +- [**Заповнення PDF-форм**](./form-filler): заповнюйте форми прямо у браузері. Також підтримує форми XFA. +- [**Створити PDF-форму**](./form-creator): створюйте PDF-форми для заповнення з текстовими полями за допомогою перетягування. +- [**Видалити порожні сторінки**](./remove-blank-pages): автоматично виявляйте та видаляйте порожні сторінки. + +
+ +--- + +## Конвертація в PDF + +Перетворюйте зображення, документи, електронні книги та інші формати файлів на PDF. + +
+ +- [**Зображення у PDF**](./image-to-pdf): конвертуйте JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP та інші формати у PDF. +- [**JPG у PDF**](./jpg-to-pdf): створіть PDF з одного чи кількох зображень JPG. +- [**PNG у PDF**](./png-to-pdf): створіть PDF з одного чи кількох зображень PNG. +- [**WebP у PDF**](./webp-to-pdf): створіть PDF з одного чи кількох зображень WebP. +- [**SVG у PDF**](./svg-to-pdf): створіть PDF з одного чи кількох зображень SVG. +- [**BMP у PDF**](./bmp-to-pdf): створіть PDF з одного чи кількох зображень BMP. +- [**HEIC у PDF**](./heic-to-pdf): створіть PDF з одного чи кількох зображень HEIC. +- [**TIFF у PDF**](./tiff-to-pdf): створіть PDF з одного чи кількох зображень TIFF. +- [**Текст у PDF**](./txt-to-pdf): конвертуйте простий текстовий файл у PDF. +- [**Markdown у PDF**](./markdown-to-pdf): конвертуйте Markdown у PDF із живим переглядом і підсвічуванням синтаксису. +- [**JSON у PDF**](./json-to-pdf): конвертуйте файли JSON у формат PDF. +- [**ODT у PDF**](./odt-to-pdf): конвертуйте файли ODT (OpenDocument Text) у PDF. +- [**CSV у PDF**](./csv-to-pdf): конвертуйте таблиці CSV у PDF. +- [**RTF у PDF**](./rtf-to-pdf): конвертуйте документи RTF (Rich Text Format) у PDF. +- [**Word у PDF**](./word-to-pdf): конвертуйте документи Word (DOCX, DOC, ODT) у PDF. +- [**Excel у PDF**](./excel-to-pdf): конвертуйте таблиці Excel (XLSX, XLS, ODS) у PDF. +- [**PowerPoint у PDF**](./powerpoint-to-pdf): конвертуйте презентації PowerPoint (PPTX, PPT, ODP) у PDF. +- [**XPS у PDF**](./xps-to-pdf): конвертуйте документи XPS/OXPS у PDF. +- [**MOBI у PDF**](./mobi-to-pdf): конвертуйте електронні книги MOBI у PDF. +- [**EPUB у PDF**](./epub-to-pdf): конвертуйте електронні книги EPUB у PDF. +- [**FB2 у PDF**](./fb2-to-pdf): конвертуйте електронні книги FictionBook (FB2) у PDF. +- [**CBZ у PDF**](./cbz-to-pdf): конвертуйте архіви коміксів (CBZ/CBR) у PDF. +- [**WPD у PDF**](./wpd-to-pdf): конвертуйте документи WordPerfect (WPD) у PDF. +- [**WPS у PDF**](./wps-to-pdf): конвертуйте документи WPS Office у PDF. +- [**XML у PDF**](./xml-to-pdf): конвертуйте документи XML у PDF. +- [**ODG у PDF**](./odg-to-pdf): конвертуйте OpenDocument Graphics (ODG) у PDF. +- [**ODS у PDF**](./ods-to-pdf): конвертуйте OpenDocument Spreadsheet (ODS) у PDF. +- [**ODP у PDF**](./odp-to-pdf): конвертуйте OpenDocument Presentation (ODP) у PDF. +- [**PUB у PDF**](./pub-to-pdf): конвертуйте Microsoft Publisher (PUB) у PDF. +- [**VSD у PDF**](./vsd-to-pdf): конвертуйте Microsoft Visio (VSD, VSDX) у PDF. +- [**PSD у PDF**](./psd-to-pdf): конвертуйте файли Adobe Photoshop (PSD) у PDF. +- [**Email у PDF**](./email-to-pdf): конвертуйте файли електронної пошти (EML, MSG) у формат PDF. + +
+ +--- + +## Конвертація з PDF + +Витягуйте вміст PDF у зображення, документи та формати даних. + +
+ +- [**PDF у JPG**](./pdf-to-jpg): конвертуйте кожну сторінку PDF у зображення JPG. +- [**PDF у PNG**](./pdf-to-png): конвертуйте кожну сторінку PDF у зображення PNG. +- [**PDF у WebP**](./pdf-to-webp): конвертуйте кожну сторінку PDF у зображення WebP. +- [**PDF у BMP**](./pdf-to-bmp): конвертуйте кожну сторінку PDF у зображення BMP. +- [**PDF у TIFF**](./pdf-to-tiff): конвертуйте кожну сторінку PDF у зображення TIFF. +- [**PDF у CBZ**](./pdf-to-cbz): конвертуйте PDF у CBZ (архів коміксів) для читалок коміксів і Calibre. +- [**PDF у SVG**](./pdf-to-svg): конвертуйте кожну сторінку PDF у масштабовану векторну графіку. +- [**PDF у CSV**](./pdf-to-csv): витягуйте таблиці з PDF і конвертуйте їх у формат CSV. +- [**PDF у Excel**](./pdf-to-excel): витягуйте таблиці з PDF і конвертуйте їх в Excel (XLSX). +- [**PDF у відтінки сірого**](./pdf-to-greyscale): перетворіть усі кольори на чорно-білі. +- [**PDF у JSON**](./pdf-to-json): конвертуйте файли PDF у формат JSON. +- [**PDF у Word**](./pdf-to-word): конвертуйте файли PDF у редаговані документи Word. +- [**Витяг зображень**](./extract-images): витягніть усі вбудовані зображення з файлів PDF. +- [**PDF у Markdown**](./pdf-to-markdown): конвертуйте текст і таблиці PDF у формат Markdown. +- [**Підготовка PDF для AI**](./prepare-pdf-for-ai): витягніть вміст PDF як LlamaIndex JSON для конвеєрів RAG/LLM. +- [**PDF у текст**](./pdf-to-text): витягніть текст із файлів PDF і збережіть як простий текст. +- [**Витяг таблиць з PDF**](./extract-tables): витягніть таблиці з PDF у форматі CSV, JSON або Markdown. + +
+ +--- + +## Організація та керування + +Перевпорядковуйте, об’єднуйте, розділяйте та керуйте сторінками й файлами PDF. + +
+ +- [**Конструктор PDF-процесів**](./pdf-workflow): створюйте власні конвеєри обробки PDF у візуальному редакторі вузлів. +- [**PDF мультиінструмент**](./pdf-multi-tool): повнофункціональний редактор PDF з керуванням сторінками. +- [**OCR PDF**](./ocr-pdf): зробіть PDF придатним для пошуку та копіювання. +- [**Об’єднати PDF**](./merge-pdf): об’єднайте кілька PDF в один файл. +- [**Чергування та змішування сторінок**](./alternate-merge): об’єднуйте PDF, чергуючи сторінки з кожного PDF. +- [**Сортування двостороннього сканування**](./duplex-collate): перевпорядкуйте блоки сканів лицьового й зворотного боку в правильну послідовність сторінок. +- [**Дублювати та впорядкувати**](./organize-pdf): дублюйте, перевпорядковуйте та видаляйте сторінки. +- [**Додати вкладення**](./add-attachments): вбудуйте один чи кілька файлів у PDF. +- [**Витяг вкладень**](./extract-attachments): витягніть усі вбудовані файли з PDF як ZIP. +- [**Редагувати вкладення**](./edit-attachments): переглядайте або видаляйте вкладення у PDF. +- [**PDF OCG**](./pdf-layers): переглядайте, перемикайте, додавайте та видаляйте шари OCG у PDF. +- [**Розділити PDF**](./split-pdf): витягніть діапазон сторінок у новий PDF. +- [**Розділити сторінки**](./divide-pages): розділяйте сторінки по горизонталі або по вертикалі. +- [**Витяг сторінок**](./extract-pages): збережіть вибрані сторінки як нові файли. +- [**Видалити сторінки**](./delete-pages): видаліть окремі сторінки з документа. +- [**Додати порожню сторінку**](./add-blank-page): вставте порожню сторінку в будь-яке місце PDF. +- [**Зворотний порядок сторінок**](./reverse-pages): змініть порядок усіх сторінок документа на зворотний. +- [**Повернути PDF**](./rotate-pdf): повертайте сторінки з кроком 90 градусів. +- [**Повернути на довільний кут**](./rotate-custom): повертайте сторінки на будь-який власний кут. +- [**N-Up PDF**](./n-up-pdf): розмістіть кілька сторінок на одному аркуші. +- [**PDF-буклет**](./pdf-booklet): перевпорядкуйте сторінки для двостороннього друку буклета. +- [**Об’єднати в одну сторінку**](./combine-single-page): зшийте всі сторінки в одну безперервну стрічку. +- [**Перегляд метаданих**](./view-metadata): перегляньте приховані властивості PDF. +- [**Редагувати метадані**](./edit-metadata): змініть автора, заголовок та інші властивості. +- [**PDF у ZIP**](./pdf-to-zip): запакуйте кілька файлів PDF в архів ZIP. +- [**Порівняти PDF**](./compare-pdfs): порівняйте два PDF пліч-о-пліч. +- [**Постеризація PDF**](./posterize-pdf): розділіть велику сторінку на кілька менших. + +
+ +--- + +## Оптимізація та відновлення + +Стискайте, виправляйте та оптимізуйте PDF для кращої продуктивності та сумісності. + +
+ +- [**Стиснення PDF**](./compress-pdf): зменште розмір файлу PDF. +- [**PDF у PDF/A**](./pdf-to-pdfa): конвертуйте PDF у PDF/A для довготривалого архівування. +- [**Вирівняти розмір сторінок**](./fix-page-size): приведіть усі сторінки до єдиного розміру. +- [**Лінеаризація PDF**](./linearize-pdf): оптимізуйте PDF для швидкого перегляду в інтернеті. +- [**Розміри сторінок**](./page-dimensions): проаналізуйте розмір сторінок, орієнтацію та одиниці виміру. +- [**Зняти обмеження**](./remove-restrictions): зніміть захист паролем і обмеження безпеки. +- [**Відновити PDF**](./repair-pdf): відновіть дані з пошкоджених файлів PDF. +- [**Растеризація PDF**](./rasterize-pdf): конвертуйте PDF у PDF із зображень. Сплющує шари та прибирає виділюваний текст. +- [**Вирівнювання PDF**](./deskew-pdf): автоматично вирівнюйте нахилені відскановані сторінки за допомогою OpenCV. +- [**Шрифти у контури**](./font-to-outline): перетворіть усі шрифти на векторні контури для однакового відображення. + +
+ +--- + +## Захист PDF + +Захищайте, шифруйте та контролюйте доступ до документів PDF. + +
+ +- [**Зашифрувати PDF**](./protect-pdf): заблокуйте PDF, додавши пароль. +- [**Очистити PDF**](./sanitize-pdf): видаліть метадані, анотації, скрипти та інше. +- [**Розблокувати PDF**](./unlock-pdf): розблокуйте PDF, знявши захист паролем. +- [**Сплющити PDF**](./flatten-pdf): зробіть поля форм і анотації нередагованими. +- [**Видалити метадані**](./remove-metadata): приберіть приховані дані з PDF. +- [**Змінити дозволи**](./change-permissions): задайте або змініть дозволи користувачів для PDF. +- [**Цифровий підпис PDF**](./digital-sign-pdf): додайте криптографічний цифровий підпис за допомогою сертифікатів X.509. +- [**Перевірка підпису PDF**](./validate-signature-pdf): перевіряйте цифрові підписи та переглядайте відомості про сертифікат. + +
diff --git a/docs/uk/tools/invert-colors.md b/docs/uk/tools/invert-colors.md new file mode 100644 index 00000000..4f88effd --- /dev/null +++ b/docs/uk/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Інвертувати кольори +description: Інвертуйте всі кольори PDF, щоб створити версію будь-якого документа для темного режиму. +--- + +# Інвертувати кольори + +Замініть кожен колір у PDF на протилежний. Білий фон стає чорним, чорний текст білим, а всі інші кольори змінюються на додаткові. Це найшвидший спосіб створити версію будь-якого PDF для темного режиму. + +## Як це працює + +1. Завантажте файл PDF. +2. Натисніть **Інвертувати кольори** для обробки. +3. Інвертований PDF завантажується автоматично. + +Додаткових налаштувань немає. Інструмент відтворює кожну сторінку як зображення, інвертує кольори всіх пікселів і збирає результат у новий PDF. + +## Можливості + +- Інверсія кольорів усіх сторінок одним кліком +- Обробка кожної сторінки документа +- Збереження початкових розмірів і макета сторінок +- Працює з будь-яким PDF незалежно від типу вмісту (текст, зображення, змішаний) + +## Сценарії використання + +- Створення версій підручників чи посібників для темного режиму для комфортного читання вночі +- Підготовка висококонтрастних версій документів для доступності +- Інверсія відсканованих документів, зроблених із неправильною експозицією +- Створення негативів PDF із великою кількістю зображень для візуального аналізу + +## Поради + +- Оскільки для ефекту інструмент растеризує сторінки, результат складається із зображень. Текст більше не можна виділяти чи шукати. Якщо після інверсії потрібен текст із пошуком, пропустіть результат через інструмент OCR. +- Для точнішого налаштування кольору (яскравість, контраст, насиченість) скористайтеся інструментом [Корекція кольору](./adjust-colors). +- Великі PDF із багатьма сторінками можуть оброблятися довше, бо кожна сторінка відтворюється та інвертується окремо. + +## Пов’язані інструменти + +- [Корекція кольору](./adjust-colors) +- [Колір фону](./background-color) +- [Ефект сканера](./scanner-effect) diff --git a/docs/uk/tools/jpg-to-pdf.md b/docs/uk/tools/jpg-to-pdf.md new file mode 100644 index 00000000..16244f2e --- /dev/null +++ b/docs/uk/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG у PDF +description: Конвертуйте одне або кілька зображень JPG, JPEG і JPEG 2000 в один файл PDF прямо у браузері. +--- + +# JPG у PDF + +Перетворіть зображення JPG на охайний PDF. Завантажте один файл або кілька JPG одразу: кожне зображення стає повнорозмірною сторінкою вихідного документа. + +## Підтримувані формати + +| Формат | Розширення | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли JPG. Можна вибрати кілька файлів. +2. Перегляньте завантажені файли. Значком кошика видаляйте окремі файли або натисніть **Додати ще файли**, щоб доповнити список. +3. Оберіть рівень **Якості PDF**. +4. Натисніть **Конвертувати в PDF**. Інструмент стискає зображення відповідно до обраної якості, конвертує їх рушієм PyMuPDF і завантажує `from_jpgs.pdf`. + +## Параметри + +**Якість PDF** визначає стиснення кожного зображення перед вбудовуванням у PDF: + +- **Висока якість**: зберігає максимум деталей. Для фотографії чи друку. +- **Середня якість** (за замовчуванням): хороший баланс між чіткістю та розміром файлу. +- **Низька якість**: сильне стиснення для найменшого результату. + +## Сценарії використання + +- Конвертація відсканованих документів, збережених як JPG, в один PDF для подання +- Пакування фото товарів у каталог для клієнтів +- Перетворення медичних чи супутникових зображень JPEG 2000 на переносний PDF +- Створення фотоальбому для друку з експортів камери + +## Поради + +- Файли JPEG 2000 (`.jp2`, `.jpx`) підтримуються повністю, а не лише стандартний JPEG. Це корисно для медичної візуалізації та геопросторових даних. +- Якщо ваші JPG зроблено камерою телефона, середня якість зазвичай дає файл на 40-60% менший, ніж висока, без помітної різниці на екрані. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [WebP у PDF](./webp-to-pdf) diff --git a/docs/uk/tools/json-to-pdf.md b/docs/uk/tools/json-to-pdf.md new file mode 100644 index 00000000..86de70d6 --- /dev/null +++ b/docs/uk/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON у PDF +description: Відновлюйте файли PDF із формату JSON BentoPDF. Конвертуйте експорти JSON назад в оригінальні документи PDF. +--- + +# JSON у PDF + +Відновлюйте документи PDF із файлів JSON, раніше створених інструментом **PDF у JSON** від BentoPDF. Це інструмент зворотної конвертації: він бере структуроване JSON-представлення PDF і перебудовує початковий документ. + +::: warning +Цей інструмент приймає лише файли JSON, створені конвертером PDF у JSON від BentoPDF. Звичайні файли JSON з API, баз даних чи інших інструментів не підтримуються. +::: + +## Підтримувані формати + +| Вхідні дані | Опис | +| :---------- | :------------------------------------------------------------ | +| `.json` | Файли JSON, експортовані інструментом PDF у JSON від BentoPDF | + +## Як це працює + +1. Натисніть область завантаження або перетягніть один чи кілька файлів JSON. +2. У списку файлів відображається кожен вибраний файл із його розміром. +3. Натисніть **Конвертувати в PDF**. Інструмент обробляє всі файли за допомогою Web Worker і рушія CPDF. +4. Результат завантажується як `jsons-to-pdf.zip`, що містить по одному PDF для кожного вхідного файлу JSON. + +Конвертація виконується у фоновому Web Worker, тому інтерфейс залишається чутливим навіть із великими файлами. + +## Параметри + +Цей інструмент не має налаштовуваних параметрів. Структура JSON повністю визначає вихідний PDF. + +## Результат + +Під час конвертації кількох файлів JSON результати надаються як архів ZIP. Кожен PDF має ім’я вихідного файлу JSON (наприклад, `report.json` стає `report.pdf`). + +## Сценарії використання + +- Відновлення PDF із резервної копії чи архівного конвеєра на основі JSON +- Подвійна конвертація PDF через JSON для перевірки, а потім назад у PDF +- Перебудова документів після програмних змін у структурі JSON +- Перевірка того, що експорт PDF у JSON зберіг увесь вміст документа, шляхом конвертації назад + +## Поради + +- Якщо потрібно конвертувати довільні дані JSON (наприклад, відповіді API чи файли конфігурації) у відформатований PDF, краще підійде інструмент [Текст у PDF](./txt-to-pdf). Вставте JSON як текст, і він буде відображений із належним форматуванням. +- Для роботи цього інструмента потрібен рушій CPDF WebAssembly. Для власних екземплярів потрібно налаштувати файли CPDF WASM. + +## Пов’язані інструменти + +- [Текст у PDF](./txt-to-pdf) +- [Markdown у PDF](./markdown-to-pdf) +- [CSV у PDF](./csv-to-pdf) diff --git a/docs/uk/tools/linearize-pdf.md b/docs/uk/tools/linearize-pdf.md new file mode 100644 index 00000000..ce875c3a --- /dev/null +++ b/docs/uk/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Лінеаризація PDF +description: Оптимізуйте файли PDF для швидкого перегляду в інтернеті з поступовим завантаженням. Також відома як оптимізація «Fast Web View». +--- + +# Лінеаризація PDF + +Лінеаризація перебудовує структуру PDF так, щоб першу сторінку можна було показати ще до завантаження всього файлу. Adobe називає це «Fast Web View». Якщо ви розміщуєте PDF на сайті або видаєте їх через портал документів, лінеаризація помітно пришвидшує їх відкриття. + +## Як це працює + +1. Завантажте один або кілька файлів PDF. +2. Натисніть **Лінеаризувати PDF**. +3. Завантажте результати як архів ZIP з усіма лінеаризованими файлами. + +Налаштовувати нічого не потрібно. Інструмент використовує прапорець `--linearize` програми QPDF, який змінює внутрішню структуру PDF без зміни його візуального вмісту. + +## Що робить лінеаризація + +- Переупорядковує об’єкти PDF так, щоб дані першої сторінки опинилися на початку файлу +- Додає словник лінеаризації та таблиці підказок, щоб переглядачі знали, де шукати кожну сторінку +- Вмикає запити діапазонів байтів: браузер може отримати лише першу сторінку без завантаження всього файлу +- Очищає таблицю перехресних посилань для ефективного довільного доступу + +## Можливості + +- Пакетна обробка кількох PDF в одній операції +- Результат зберігає весь вміст, шрифти, зображення та інтерактивні елементи +- Використовує QPDF (WebAssembly) для надійної лінеаризації за стандартами +- Результати пакуються в ZIP для зручного завантаження + +## Сценарії використання + +- Розміщення PDF-звітів на сайті, де користувачі очікують миттєвого відображення сторінки +- Вбудовування PDF у вебзастосунки з переглядачами у браузері +- Публікація PDF-каталогів чи посібників, до яких звертаються через повільні мобільні з’єднання +- Підготовка документів для мереж доставки вмісту (CDN), що підтримують віддачу діапазонів байтів + +## Поради + +- Лінеаризуйте після завершення всіх інших правок. Будь-яка наступна зміна (об’єднання, додавання сторінок) порушить лінеаризацію. +- Поєднуйте зі «Стисненням PDF», щоб отримати найменші та найшвидші для завантаження PDF. +- Лінеаризація трохи збільшує розмір файлу (зазвичай менше ніж на 1%). + +## Пов’язані інструменти + +- [Стиснення PDF](./compress-pdf): зменште розмір файлу перед лінеаризацією +- [Відновити PDF](./repair-pdf): виправте структурні проблеми, що заважають лінеаризації +- [Видалити метадані](./remove-metadata): приберіть метадані перед публікацією в інтернеті diff --git a/docs/uk/tools/markdown-to-pdf.md b/docs/uk/tools/markdown-to-pdf.md new file mode 100644 index 00000000..19f4679a --- /dev/null +++ b/docs/uk/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown у PDF +description: Пишіть або вставляйте Markdown та експортуйте його у професійно відформатований PDF із живим переглядом і підсвічуванням синтаксису. +--- + +# Markdown у PDF + +Повнофункціональний редактор Markdown із живим переглядом і експортом у PDF одним кліком. Пишіть з нуля, завантажуйте наявний файл `.md` або вставляйте вміст із буфера обміну. Редактор відтворює ваш Markdown у реальному часі та експортує стилізований PDF за допомогою вбудованого рушія друку браузера. + +## Підтримувані формати + +| Вхідні дані | Опис | +| :------------- | :--------------------------------- | +| Файли `.md` | Завантаження кнопкою «Завантажити» | +| Пряме введення | Введіть або вставте в редактор | + +## Як це працює + +1. Відкрийте інструмент Markdown у PDF. Редактор завантажується з розділеним виглядом: джерело Markdown ліворуч, відтворений перегляд праворуч. +2. Напишіть Markdown, вставте його або натисніть **Завантажити**, щоб відкрити файл `.md`. +3. Перемикайте світлу й темну теми повзунком теми на панелі інструментів. +4. Натисніть **Експортувати PDF** (або `Ctrl/Cmd + S`), щоб створити PDF через діалог друку браузера. + +## Можливості + +Редактор підтримує широкий набір можливостей Markdown, окрім базових: + +- **Стандартний Markdown**: заголовки, напівжирний, курсив, посилання, зображення, списки, цитати, горизонтальні лінії +- **Блоки коду** з підсвічуванням синтаксису для понад 15 мов (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash та інші) +- **Діаграми Mermaid**: блок-схеми, діаграми послідовностей, ER-діаграми та інші типи діаграм Mermaid відображаються прямо в перегляді +- **Таблиці** зі стандартним синтаксисом таблиць Markdown +- **Списки завдань** із прапорцями +- **Виноски**, **нижні індекси**, **верхні індекси** +- **Списки визначень**, **абревіатури** +- Підтримка **емодзі** (`:smile:` відображається як емодзі) +- **Виділення** (`==marked text==`) і **вставки** (`++inserted text++`) +- **Автоматичні посилання**: прості URL перетворюються на клікабельні посилання +- Створення **змісту** +- **Якірні посилання** на заголовках + +## Сценарії використання + +- Написання документації проєкту та експорт охайного PDF для зацікавлених сторін +- Створення технічних звітів із прикладами коду та архітектурними діаграмами Mermaid +- Конвертація README з GitHub у PDF для офлайн-використання чи друку +- Підготовка пропозиції чи специфікації зі списками завдань і таблицями +- Створення стилізованого роздаткового матеріалу з конспектів лекцій, написаних у Markdown + +## Поради + +- PDF створюється функцією друку в PDF браузера. У Chrome перед збереженням можна налаштувати поля й масштаб у діалозі друку. +- Діаграми Mermaid відображаються в перегляді, але під час першого використання їм може знадобитися мить для ініціалізації. +- Використовуйте `Ctrl/Cmd + S` як гарячу клавішу для експорту без звернення до кнопки. + +## Пов’язані інструменти + +- [Текст у PDF](./txt-to-pdf) +- [Word у PDF](./word-to-pdf) +- [JSON у PDF](./json-to-pdf) diff --git a/docs/uk/tools/merge-pdf.md b/docs/uk/tools/merge-pdf.md new file mode 100644 index 00000000..1a60d714 --- /dev/null +++ b/docs/uk/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Об’єднати PDF +description: Об’єднуйте кілька файлів PDF в один документ із перевпорядкуванням перетягуванням і керуванням на рівні сторінок. +--- + +# Об’єднати PDF + +Об’єднуйте кілька файлів PDF в один документ. Можна зливати цілі файли у вибраному порядку або перейти в режим сторінок для докладного керування окремими сторінками з кожного завантаженого PDF. + +## Як це працює + +1. Завантажте два або більше файлів PDF, клацнувши область завантаження або перетягнувши їх. +2. Оберіть між **Режимом файлів** і **Режимом сторінок** за допомогою перемикача вгорі. +3. У режимі файлів перетягуйте файли, щоб змінити порядок, і за потреби вказуйте діапазони сторінок (наприклад, `1-3, 5`) для кожного файлу. Залиште діапазон порожнім, щоб додати всі сторінки. +4. У режимі сторінок перетягуйте окремі мініатюри сторінок, щоб побудувати точну послідовність сторінок. +5. Натисніть **Об’єднати PDF**, щоб зібрати все в один файл. Об’єднаний PDF завантажується автоматично. + +## Можливості + +- Два режими об’єднання: режим файлів для швидкого злиття цілих файлів, режим сторінок для керування кожною сторінкою +- Перевпорядкування перетягуванням в обох режимах із плавними анімаціями +- Синтаксис діапазонів сторінок (наприклад, `1-3, 5, 8-10`) дозволяє вибирати сторінки без переходу в режим сторінок +- Відкладене завантаження мініатюр сторінок зберігає чутливість інтерфейсу навіть із великими документами +- Без обмежень на кількість файлів чи загальну кількість сторінок +- Зберігає початкову якість PDF без повторного кодування + +## Параметри + +| Параметр | Опис | +| ------------------ | -------------------------------------------------------------------------------------------------------- | +| **Режим файлів** | Об’єднання цілих файлів у власному порядку з необов’язковими фільтрами діапазонів для кожного файлу | +| **Режим сторінок** | Візуальна сітка всіх сторінок з усіх файлів: перетягуйте мініатюри, щоб побудувати точну послідовність | +| **Поле сторінок** | Текстове поле для кожного файлу, що приймає діапазони на кшталт `1-3, 5`, щоб додати лише певні сторінки | + +## Сценарії використання + +- Об’єднання окремих PDF розділів в одну книгу чи звіт +- Поєднання супровідного листа та резюме в один документ для подання +- Збирання окремих сторінок із кількох джерел в один файл +- Збирання сканованих чеків чи рахунків в один архівний PDF +- Створення роздаткового матеріалу презентації зі слайдів кількох наборів + +## Поради + +- Використовуйте режим сторінок, коли потрібно чергувати сторінки з різних файлів, а не додавати один файл після іншого. +- Після початкового завантаження можна додати ще файли кнопкою **Додати ще файли**, не втрачаючи поточного розташування. +- Діапазони сторінок нумеруються з 1, тож `1` означає першу сторінку цього файлу. + +## Пов’язані інструменти + +- [Розділити PDF](./split-pdf) +- [Дублювати та впорядкувати](./organize-pdf) +- [Чергування та змішування сторінок](./alternate-merge) +- [Видалити сторінки](./delete-pages) diff --git a/docs/uk/tools/mobi-to-pdf.md b/docs/uk/tools/mobi-to-pdf.md new file mode 100644 index 00000000..2dc82a39 --- /dev/null +++ b/docs/uk/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI у PDF +description: Конвертуйте електронні книги MOBI у PDF прямо у браузері. Безкоштовно, приватно, без завантаження файлів. +--- + +# MOBI у PDF + +Конвертуйте електронні книги Amazon Kindle MOBI у документи PDF. Файли MOBI прив’язані до пристроїв і застосунків Kindle, тому їх важко читати деінде. Конвертація в PDF дає переносну версію, яку можна відкрити на будь-якому пристрої або надрукувати. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----- | :--------- | :------------------------------------------ | +| MOBI | `.mobi` | Формат електронних книг Kindle (Mobipocket) | + +## Як це працює + +1. Натисніть область завантаження або перетягніть один чи кілька файлів MOBI. +2. Перегляньте список файлів. Видаліть непотрібні файли значком кошика або скористайтеся кнопкою **Додати ще файли**, щоб додати інші книги. +3. Натисніть **Конвертувати в PDF**. Рушій PyMuPDF розбирає структуру MOBI та відтворює кожну сторінку як вміст PDF. +4. Один файл завантажується як PDF. Під час конвертації кількох файлів ви отримаєте архів ZIP з назвою `mobi-converted.zip`. + +## Параметри + +Додаткові налаштування не потрібні. Конвертація зберігає текст, форматування та вбудовані зображення оригінального файлу MOBI. + +## Сценарії використання + +- Читання вмісту, купленого в Kindle, на читалці не від Kindle, яка підтримує лише PDF +- Друк розділів електронної книги для навчання чи нотаток офлайн +- Архівування особистої бібліотеки електронних книг в універсальному форматі +- Передавання уривків людині, у якої не встановлено застосунок Kindle + +## Поради + +- Файли MOBI із захистом DRM конвертувати не можна. Інструмент працює лише з файлами MOBI без DRM. +- Великі електронні книги з багатьма вбудованими зображеннями можуть оброблятися на кілька секунд довше, бо все відбувається у браузері. + +## Пов’язані інструменти + +- [EPUB у PDF](./epub-to-pdf) +- [FB2 у PDF](./fb2-to-pdf) +- [CBZ у PDF](./cbz-to-pdf) diff --git a/docs/uk/tools/n-up-pdf.md b/docs/uk/tools/n-up-pdf.md new file mode 100644 index 00000000..222ff1df --- /dev/null +++ b/docs/uk/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Розміщуйте кілька сторінок PDF на одному аркуші у вигляді сітки для компактного друку. +--- + +# N-Up PDF + +Розміщуйте кілька сторінок на одному аркуші у вигляді сітки. Це зменшує кількість друкованих сторінок, вміщуючи по 2, 4, 6, 8, 9 або 16 сторінок на аркуш. Інструмент виконує масштабування, позиціонування та додаткове налаштування розміру сторінки. + +## Як це працює + +1. Завантажте файл PDF. +2. Оберіть кількість сторінок на аркуші (значення «N»): 2, 4, 6, 8, 9 або 16. +3. Оберіть розмір вихідної сторінки (за замовчуванням A4) та орієнтацію. +4. За потреби налаштуйте відступи, колір рамки та колір фону. +5. Натисніть кнопку обробки. Інструмент масштабує кожну сторінку та розміщує їх плиткою на нових аркушах. + +## Можливості + +- Сітки: 2-up, 4-up, 6-up, 8-up, 9-up і 16-up +- Налаштовувані розмір і орієнтація вихідної сторінки +- Необов’язкові відступи між сторінками в сітці +- Налаштування кольору фону та рамки +- Збереження пропорцій оригінальних сторінок під час масштабування + +## Параметри + +| Параметр | Опис | +| ---------------------- | ------------------------------------------------------------------------------- | +| **Сторінок на аркуші** | Кількість оригінальних сторінок на кожній вихідній сторінці (2, 4, 6, 8, 9, 16) | +| **Розмір сторінки** | Розмір вихідного аркуша (A4, Letter, Legal тощо) | +| **Орієнтація** | Книжкова або альбомна для вихідного аркуша | +| **Відступи** | Проміжок у пунктах між сторінками в сітці | +| **Колір фону** | Колір заливки фону вихідного аркуша | +| **Колір рамки** | Колір рамок навколо кожної сторінки в сітці | + +## Сценарії використання + +- Друк роздаткових матеріалів із 4 слайдами на сторінці для економії паперу +- Створення навчальних аркушів із кількома довідковими сторінками на одному аркуші +- Створення компактних архівів документів для підшивання +- Створення оглядових аркушів із мініатюрами довгого документа + +## Поради + +- Альбомна орієнтація часто краще підходить для розкладки 2-up, а книжкова зазвичай найкраща для 4-up і більше. +- Збільшення відступів покращує читабельність, але зменшує площу для кожної сторінки в сітці. +- Для зворотної операції (розділення однієї сторінки на кілька) дивіться [Постеризація PDF](./posterize-pdf). + +## Пов’язані інструменти + +- [Постеризація PDF](./posterize-pdf) +- [PDF-буклет](./pdf-booklet) +- [Об’єднати в одну сторінку](./combine-single-page) diff --git a/docs/uk/tools/ocr-pdf.md b/docs/uk/tools/ocr-pdf.md new file mode 100644 index 00000000..27c2c5fc --- /dev/null +++ b/docs/uk/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Робіть скановані PDF придатними для пошуку та копіювання за допомогою Tesseract OCR із підтримкою кількох мов і фільтрацією символів. +--- + +# OCR PDF + +Перетворюйте скановані документи на PDF з пошуком і копіюванням. Інструмент використовує Tesseract OCR для розпізнавання тексту на зображеннях і накладає невидимий текстовий шар поверх оригінальних сторінок, зберігаючи їхній вигляд і роблячи вміст повністю придатним для пошуку. + +## Як це працює + +1. Завантажте відсканований PDF або PDF із зображень. +2. Оберіть одну чи кілька мов, присутніх у документі, у списку мов із пошуком. +3. За потреби налаштуйте розширені параметри (роздільна здатність, бінаризація, білий список). +4. Натисніть **Почати OCR** і стежте за прогресом на індикаторі в реальному часі. +5. Після завершення перегляньте витягнутий текст, а потім завантажте PDF із пошуком або простий файл `.txt`. + +## Можливості + +- OCR кількома мовами з вибором мови за допомогою пошуку +- Невидимий текстовий шар зберігає оригінальний вигляд документа +- Індикатор прогресу та журнал у реальному часі під час обробки +- Завантаження результатів як PDF із пошуком або простого текстового файлу +- Копіювання витягнутого тексту прямо в буфер обміну +- Три рівні роздільної здатності для балансу між швидкістю та точністю + +## Параметри + +| Налаштування | Значення | За замовчуванням | Призначення | +| -------------------------------- | ----------------------------------------------------------------------------------------- | ---------------- | --------------------------------------------------------------------------------------- | +| **Роздільна здатність** | Стандартна (192 DPI), Висока (288 DPI), Ультра (384 DPI) | Висока | Вища роздільна здатність підвищує точність на дрібному тексті, але потребує більше часу | +| **Бінаризація зображення** | Увімк. / Вимк. | Вимк. | Підвищує контраст чистих сканів, перетворюючи їх на чорно-білі | +| **Набір білого списку символів** | Немає, Буквено-цифровий, Числа + валюта, Лише літери, Лише числа, Рахунок, Форми, Власний | Немає | Обмежує розпізнавані символи для підвищення точності для певних типів документів | +| **Білий список символів** | Довільний текст | Порожньо | Ручний набір символів, коли набір має значення «Власний» | + +## Сценарії використання + +- Перетворення сканованих контрактів і рахунків на документи з пошуком, щоб шукати в них через Ctrl+F +- Витягування тексту із сфотографованих документів чи старих паперових записів +- Обробка чеків за допомогою набору «Рахунок» для точного розпізнавання сум і дат +- Створення доступних PDF зі сканів без тексту для виконання вимог відповідності +- Пакетне витягування текстового вмісту зі сканованих книг чи посібників + +## Поради + +- Оберіть кілька мов, якщо документ містить текст різними мовами (наприклад, англійські заголовки та японський основний текст). +- Використовуйте бінаризацію для документів зі зблідлим або малоконтрастним текстом: вона може значно підвищити точність розпізнавання. +- Набори білого списку «Рахунок» і «Форми» різко зменшують кількість хибних спрацювань на структурованих документах, ігноруючи невідповідні форми символів. + +## Пов’язані інструменти + +- [Витяг таблиць з PDF](./extract-tables) +- [Об’єднати PDF](./merge-pdf) +- [Стиснення PDF](./compress-pdf) diff --git a/docs/uk/tools/odg-to-pdf.md b/docs/uk/tools/odg-to-pdf.md new file mode 100644 index 00000000..0bfe87f4 --- /dev/null +++ b/docs/uk/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG у PDF +description: Конвертуйте файли LibreOffice Draw (ODG) у PDF у браузері. Безкоштовно, без завантаження на сервер, повністю приватно. +--- + +# ODG у PDF + +Конвертуйте файли OpenDocument Graphics у PDF. ODG є рідним форматом LibreOffice Draw і використовується для діаграм, блок-схем і векторних ілюстрацій. Конвертація в PDF спрощує обмін цими малюнками, їх друк і вбудовування в інші документи. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :-------------------- | :--------- | :--------------------------------------- | +| OpenDocument Graphics | `.odg` | Файли LibreOffice Draw / OpenOffice Draw | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли ODG. Можна додати кілька файлів одразу. +2. Перегляньте список файлів. Видаліть окремі записи значком кошика або натисніть **Додати ще файли**, щоб додати інші малюнки. +3. Натисніть **Конвертувати в PDF**. Рушій на основі LibreOffice завантажується у браузері та конвертує кожен файл ODG, зберігаючи векторну графіку, фігури й текст. +4. Один файл завантажується як PDF одразу. Кілька файлів дають архів ZIP з назвою `odg-to-pdf.zip`. + +## Параметри + +Додаткові налаштування не потрібні. Конвертація зберігає початкові розміри сторінки, фігури, з’єднувальні лінії та текстові поля з джерела ODG. + +## Сценарії використання + +- Передавання діаграм LibreOffice Draw клієнтам, у яких не встановлено LibreOffice +- Друк блок-схем і мережевих діаграм, створених у Draw +- Додавання ілюстрацій ODG у звіт чи презентацію як вбудованих PDF +- Архівування технічних креслень у форматі, який залишатиметься читабельним десятиліттями + +## Поради + +- Векторні елементи залишаються векторними у вихідному PDF, тому результат чітко масштабується до будь-якого розміру друку. +- Рушію LibreOffice потрібна мить для ініціалізації під час першого використання. Наступні конвертації в тому ж сеансі виконуються швидше. + +## Пов’язані інструменти + +- [ODS у PDF](./ods-to-pdf) +- [ODP у PDF](./odp-to-pdf) +- [VSD у PDF](./vsd-to-pdf) diff --git a/docs/uk/tools/odp-to-pdf.md b/docs/uk/tools/odp-to-pdf.md new file mode 100644 index 00000000..70d25fdb --- /dev/null +++ b/docs/uk/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP у PDF +description: Конвертуйте презентації LibreOffice Impress (ODP) у PDF у браузері. Безкоштовно, приватно, без завантаження на сервер. +--- + +# ODP у PDF + +Конвертуйте файли OpenDocument Presentation у PDF. ODP є рідним форматом LibreOffice Impress і стандартним експортом із Google Slides. Перетворення презентацій на PDF дозволяє будь-кому переглядати їх без програм для презентацій, а слайди чітко друкуються. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :------------------------ | :--------- | :--------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / експорт із Google Slides | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли ODP. Можна вибрати кілька презентацій одразу. +2. Перегляньте список файлів. Видаліть записи значком кошика або скористайтеся кнопкою **Додати ще файли**, щоб додати інші презентації. +3. Натисніть **Конвертувати в PDF**. Рушій на основі LibreOffice обробляє кожну презентацію та створює PDF, де кожен слайд стає сторінкою. +4. Один файл завантажується як PDF. Кілька файлів надаються в архіві ZIP з назвою `odp-to-pdf.zip`. + +## Параметри + +Налаштовувати нічого не потрібно. Кожен слайд відтворюється в оригінальних розмірах зі збереженням тексту, зображень, фігур і фонів слайдів. + +## Сценарії використання + +- Розповсюдження презентації серед аудиторії як роздаткового PDF +- Передавання експортів Google Slides людям, які віддають перевагу PDF перед ODP +- Архівування доповідей і лекцій у форматі лише для читання +- Друк наборів слайдів для очних воркшопів + +## Поради + +- Переходи та анімації слайдів є суто візуальними функціями й не переносяться в PDF, але весь статичний вміст відображається правильно. +- Нотатки доповідача не включаються у вихідний PDF. Якщо вони потрібні, експортуйте їх окремо з програми для презентацій. +- Як і інші інструменти на основі LibreOffice, рушій завантажується під час першого використання та залишається в кеші на час сеансу. + +## Пов’язані інструменти + +- [ODG у PDF](./odg-to-pdf) +- [ODS у PDF](./ods-to-pdf) +- [PUB у PDF](./pub-to-pdf) diff --git a/docs/uk/tools/ods-to-pdf.md b/docs/uk/tools/ods-to-pdf.md new file mode 100644 index 00000000..0fff11aa --- /dev/null +++ b/docs/uk/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS у PDF +description: Конвертуйте електронні таблиці LibreOffice Calc (ODS) у PDF прямо в браузері. Безкоштовно, приватно, без реєстрації. +--- + +# ODS у PDF + +Конвертуйте файли OpenDocument Spreadsheet у PDF. ODS є рідним форматом LibreOffice Calc і поширеним форматом експорту з Google Sheets. Цей інструмент перетворює дані таблиці, форматування та діаграми на PDF із розбиттям на сторінки, який можна друкувати або надсилати іншим. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----------------------- | :--------- | :------------------------------------------ | +| OpenDocument Spreadsheet | `.ods` | Експорт із LibreOffice Calc / Google Sheets | + +## Як це працює + +1. Натисніть на область завантаження або перетягніть файли ODS. Підтримується кілька файлів. +2. Перегляньте список файлів. Скористайтеся іконкою кошика, щоб видалити файли, або натисніть **Додати файли**, щоб розширити пакет. +3. Натисніть **Конвертувати у PDF**. Рушій на основі LibreOffice завантажується в браузері й перетворює кожну таблицю на сторінки PDF. +4. Одна таблиця завантажується як PDF. Кілька файлів пакуються в `ods-to-pdf.zip`. + +## Параметри + +Налаштування не потрібні. Конвертер застосовує до PDF наявний макет друку таблиці, форматування клітинок і ширину стовпців. + +## Сценарії використання + +- Надсилання бюджету чи звіту з LibreOffice Calc тому, хто приймає лише PDF +- Друк експорту з Google Sheets, завантаженого у форматі ODS +- Архівування фінансових записів у форматі, що не редагується +- Подання форм або табелів на основі ODS як документів із фіксованим макетом + +## Поради + +- Якщо в таблиці кілька аркушів, усі вони потраплять у PDF. +- Дуже широкі таблиці можуть розтягуватися на кілька сторінок PDF по горизонталі. Якщо макет важливий, перед конвертацією підлаштуйте ширину стовпців у вихідному файлі. +- Рушій LibreOffice ініціалізується під час першого використання. Наступні конвертації в тому самому сеансі виконуються швидше. + +## Пов’язані інструменти + +- [ODG у PDF](./odg-to-pdf) +- [ODP у PDF](./odp-to-pdf) +- [XML у PDF](./xml-to-pdf) diff --git a/docs/uk/tools/odt-to-pdf.md b/docs/uk/tools/odt-to-pdf.md new file mode 100644 index 00000000..d516c307 --- /dev/null +++ b/docs/uk/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT у PDF +description: Конвертуйте файли OpenDocument Text (ODT) у формат PDF у браузері за допомогою рушія на основі LibreOffice. +--- + +# ODT у PDF + +Конвертуйте файли OpenDocument Text у PDF. ODT є рідним форматом LibreOffice Writer, Apache OpenOffice та інших відкритих текстових редакторів. Цей інструмент використовує LibreOffice-рушій у браузері для точної конвертації зі збереженням форматування, таблиць, зображень і стилів. + +## Підтримувані формати + +| Формат | Розширення | +| :---------------- | :--------- | +| OpenDocument Text | `.odt` | + +## Як це працює + +1. Натисніть на область завантаження або перетягніть один чи кілька файлів ODT. +2. Перегляньте список файлів. Додайте ще файли або видаліть зайві. +3. Натисніть **Конвертувати у PDF**. Рушій LibreOffice ініціалізується (індикатор прогресу показує стан завантаження), після чого кожен файл конвертується. +4. Один файл завантажується одразу як PDF. Кілька файлів пакуються в `odt-converted.zip`. + +## Параметри + +Цей інструмент не має додаткових налаштувань. Конвертація максимально точно зберігає форматування вихідного документа. + +## Результат + +| Кількість файлів | Результат | +| :--------------- | :---------------------------------------------------------------- | +| 1 файл | Завантаження одного PDF (напр., `document.pdf`) | +| 2 і більше | ZIP-архів (`odt-converted.zip`), що містить по одному PDF на файл | + +## Сценарії використання + +- Конвертація документів LibreOffice Writer у PDF для обміну з користувачами Microsoft Office +- Створення PDF для друку з наукових робіт, написаних у форматі OpenDocument +- Пакетна конвертація теки шаблонів ODT у PDF для розсилки +- Створення PDF із файлів ODT, згенерованих системами автоматичного формування документів + +## Поради + +- Рушій LibreOffice завантажується під час першого використання та кешується для наступних конвертацій. Перше завантаження займає кілька секунд, далі конвертація швидка. +- Складні документи з вбудованими об’єктами OLE або нестандартними шрифтами можуть відображатися трохи інакше, ніж у настільному LibreOffice. Перед пакетною конвертацією перевірте на зразку. +- Для документів Word (`.doc`, `.docx`) скористайтеся інструментом [Word у PDF](./word-to-pdf): він також використовує рушій LibreOffice, але напряму приймає формати Microsoft. + +## Пов’язані інструменти + +- [Word у PDF](./word-to-pdf) +- [RTF у PDF](./rtf-to-pdf) +- [Текст у PDF](./txt-to-pdf) diff --git a/docs/uk/tools/organize-pdf.md b/docs/uk/tools/organize-pdf.md new file mode 100644 index 00000000..f5b2104b --- /dev/null +++ b/docs/uk/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Дублювати та впорядкувати +description: Змінюйте порядок, дублюйте та видаляйте сторінки PDF за допомогою мініатюр із перетягуванням і довільного порядку сторінок. +--- + +# Дублювати та впорядкувати + +Змінюйте порядок, дублюйте та видаляйте сторінки PDF у наочному інтерфейсі з перетягуванням. Кожна сторінка відображається як мініатюра, яку можна перемістити, клонувати або видалити, перш ніж зберегти результат як новий файл. + +## Як це працює + +1. Завантажте один файл PDF. +2. Інструмент відобразить сітку мініатюр усіх сторінок. +3. Перетягуйте мініатюри, щоб змінити порядок сторінок, натисніть зелену кнопку дублювання, щоб клонувати сторінку, або червону кнопку видалення, щоб прибрати її. +4. Також можна ввести власний порядок сторінок у текстовому полі (напр., `3, 1, 2, 4`) і натиснути **Застосувати**, щоб одразу переставити всі сторінки. +5. Натисніть кнопку обробки, щоб зібрати та завантажити впорядкований PDF. + +## Можливості + +- Зміна порядку сторінок перетягуванням з анімованими переходами +- Кнопки дублювання та видалення для кожної сторінки +- Введення власного порядку сторінок для точного переставляння +- Номери сторінок автоматично оновлюються після кожної зміни +- Не дозволяє видалити останню сторінку + +## Сценарії використання + +- Переміщення сторінки, що опинилася не на своєму місці, на правильну позицію у звіті +- Дублювання сторінки форми, щоб мати кілька порожніх копій в одному файлі +- Видалення чернеткових або службових сторінок перед розповсюдженням документа +- Зворотний або довільний порядок сторінок для підготовки до друку +- Створення власної послідовності сторінок без повторного об’єднання окремих файлів + +## Поради + +- Поле власного порядку сторінок очікує номери вихідних сторінок через кому. Воно має містити кожну сторінку рівно один раз: без пропусків і дублікатів. +- Після дублювання сторінки обидві копії посилаються на той самий індекс вихідної сторінки. Переставляння будь-якої з копій працює незалежно. +- Для масових операцій з кількома файлами або складніших сценаріїв скористайтеся [PDF мультиінструментом](./pdf-multi-tool). + +## Пов’язані інструменти + +- [Об’єднати PDF](./merge-pdf) +- [Видалити сторінки](./delete-pages) +- [PDF мультиінструмент](./pdf-multi-tool) +- [Зворотний порядок сторінок](./reverse-pages) diff --git a/docs/uk/tools/page-dimensions.md b/docs/uk/tools/page-dimensions.md new file mode 100644 index 00000000..65afffcf --- /dev/null +++ b/docs/uk/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Розміри сторінок +description: Аналізуйте розміри сторінок PDF, орієнтацію, співвідношення сторін і поворот. Виявляйте документи зі сторінками різного розміру та експортуйте дані в CSV. +--- + +# Розміри сторінок + +Діагностичний інструмент, який зчитує кожну сторінку PDF і повідомляє її точні розміри, орієнтацію, назву стандартного формату, співвідношення сторін, площу та поворот. Корисний, щоб помітити сторінки різного розміру перед друком або задокументувати властивості отриманого PDF. + +## Як це працює + +1. Завантажте файл PDF. Аналіз починається автоматично, натискати кнопку не потрібно. +2. Панель підсумку показує загальну кількість сторінок, кількість унікальних розмірів сторінок і чи містить документ сторінки різного розміру. +3. Перегляньте повну таблицю результатів з даними по кожній сторінці. +4. Перемикайте одиниці виміру між пунктами, дюймами, міліметрами та пікселями. +5. Натисніть **Експортувати в CSV**, щоб зберегти дані. + +## Поля звіту + +| Стовпець | Опис | +| --------------------- | ------------------------------------------------------- | +| Сторінка № | Порядковий номер сторінки | +| Розміри | Ширина x Висота у вибраній одиниці | +| Стандартний розмір | Знайдена назва (A4, Letter тощо) або "Власний" | +| Орієнтація | Книжкова або альбомна | +| Співвідношення сторін | Відношення ширини до висоти у вигляді десяткового числа | +| Площа | Площа сторінки у квадратних одиницях вибраної одиниці | +| Поворот | Поворот сторінки в градусах | + +## Можливості + +- Автоматичне визначення стандартних форматів паперу (A3, A4, A5, Letter, Legal, Tabloid та інші) +- Попередження про документ зі сторінками різного розміру з розподілом: які розміри є і скільки сторінок використовує кожен +- Перетворення одиниць між пунктами, дюймами, міліметрами та пікселями (при 96 PPI) +- Експорт у CSV для електронних таблиць або систем документації + +## Сценарії використання + +- Перевірка того, що всі сторінки мають формат A4, перед відправкою документа в друкарню +- З’ясування, чому об’єднаний PDF друкується з неочікуваними полями на окремих сторінках +- Документування макета сторінок великого архіву PDF для метаданих +- Виявлення повернутих сторінок, які потребують виправлення + +## Поради + +- Якщо підсумок показує "Різні розміри", скористайтеся інструментом «Вирівняти розмір сторінок», щоб уніфікувати розміри перед друком. +- Поле повороту допомагає знайти сторінки, які відображаються правильно, але мають ненульовий атрибут повороту, що може спричиняти проблеми в деяких робочих процесах. + +## Пов’язані інструменти + +- [Вирівняти розмір сторінок](./fix-page-size): уніфікуйте сторінки після виявлення різних розмірів +- [Стиснення PDF](./compress-pdf): оптимізуйте PDF після виправлення проблем зі сторінками +- [Повернути PDF](./rotate-pdf): виправте повернуті сторінки diff --git a/docs/uk/tools/page-numbers.md b/docs/uk/tools/page-numbers.md new file mode 100644 index 00000000..5042669f --- /dev/null +++ b/docs/uk/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Нумерація сторінок +description: Додавайте настроювану нумерацію в будь-яке місце сторінок PDF із вибором шрифту, розміру та кольору. +--- + +# Нумерація сторінок + +Додайте видимі номери на кожну сторінку PDF. Ви обираєте позицію, формат, розмір шрифту та колір, а решту інструмент зробить сам. + +## Як це працює + +1. Завантажте файл PDF. +2. Налаштуйте параметри нумерації на панелі, що з’явиться. +3. Натисніть **Додати нумерацію сторінок** для обробки. +4. Пронумерований PDF завантажиться автоматично. + +## Параметри + +- **Позиція**: оберіть, де з’являтимуться номери: унизу по центру, унизу ліворуч, унизу праворуч, угорі по центру, угорі ліворуч або угорі праворуч. +- **Формат**: проста нумерація (1, 2, 3...) або формат "сторінка X з Y" (1 / 5, 2 / 5...). +- **Розмір шрифту**: розмір тексту номера. За замовчуванням 12. +- **Колір**: оберіть будь-який колір тексту номера за допомогою палітри. + +## Можливості + +- Шість варіантів розміщення, що охоплюють усі кути та центральні позиції +- Два формати нумерації: проста послідовна або "сторінка X з Y" +- Настроюваний розмір шрифту від 6 до 72 пунктів +- Повна палітра для вибору кольору тексту +- Автоматична обробка полів, що тримає номери в безпечній зоні незалежно від розміру сторінки + +## Сценарії використання + +- Підготовка документів до друку, де потрібні видимі посилання на сторінки +- Додавання номерів сторінок в об’єднаний PDF, створений із кількох вихідних файлів +- Нумерація роздаткових матеріалів до презентацій перед розповсюдженням +- Додавання послідовної нумерації в юридичні документи або договори + +## Поради + +- Формат "сторінка X з Y" корисний для документів, де читачам важливо знати загальний обсяг, наприклад комерційних пропозицій чи звітів. +- Якщо для різних розділів потрібні різні стилі нумерації (наприклад, римські цифри для вступної частини), скористайтеся інструментом [Додати нумерацію сторінок](./add-page-labels). + +## Пов’язані інструменти + +- [Додати нумерацію сторінок](./add-page-labels) +- [Нумерація Bates](./bates-numbering) +- [Колонтитули](./header-footer) diff --git a/docs/uk/tools/pdf-booklet.md b/docs/uk/tools/pdf-booklet.md new file mode 100644 index 00000000..5d238d6f --- /dev/null +++ b/docs/uk/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF-буклет +description: Переставте сторінки PDF у порядок буклета (зшивання внакидку) для складання та скріплення у фізичний буклет. +--- + +# PDF-буклет + +Переставте сторінки PDF у порядок розкладки буклета. Після двостороннього друку та складання навпіл сторінки йтимуть у правильній послідовності читання. Такий макет використовують для буклетів зі зшиванням внакидку та зінів. + +## Як це працює + +1. Завантажте файл PDF. +2. Налаштуйте параметри буклета: розмір сторінки результату та орієнтацію. +3. Натисніть **Створити попередній перегляд**, щоб побачити, як сторінки розташуються на кожному аркуші. +4. Перегляньте попередній перегляд: він показує кожен фізичний аркуш із розподілом сторінок на лицьовому та зворотному боці. +5. Натисніть **Завантажити**, щоб зберегти PDF із розкладкою буклета. + +## Можливості + +- Автоматична перестановка сторінок для зшивання внакидку +- Настроюваний розмір сторінки результату +- Наочний попередній перегляд макета буклета перед завантаженням +- Непарна кількість сторінок обробляється додаванням порожніх сторінок, де потрібно +- Масштабування вихідних сторінок під розмір аркуша буклета + +## Сценарії використання + +- Створення буклетів або зінів для друку зі звичайного PDF +- Підготовка програм конференцій або путівників заходів для друку власними силами +- Виготовлення складених вітальних листівок або невеликих каталогів +- Випуск збірок віршів чи невеликих книжечок для ручного палітурства + +## Поради + +- Кількість сторінок у вихідному PDF бажано кратна 4, щоб буклет вийшов охайним. Якщо це не так, порожні сторінки додаються автоматично, щоб заповнити останній аркуш. +- Друкуйте результат двосторонньо з налаштуванням принтера "перевертати по короткому краю", потім складіть усі аркуші разом і скріпіть степлером по корінцю. +- Щоб просто розмістити кілька сторінок на одному аркуші без порядку буклета, скористайтеся [N-Up PDF](./n-up-pdf). + +## Пов’язані інструменти + +- [N-Up PDF](./n-up-pdf) +- [Повернути PDF](./rotate-pdf) +- [Додати порожню сторінку](./add-blank-page) diff --git a/docs/uk/tools/pdf-layers.md b/docs/uk/tools/pdf-layers.md new file mode 100644 index 00000000..8a0e6d24 --- /dev/null +++ b/docs/uk/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Шари PDF (OCG) +description: Переглядайте, вмикайте та вимикайте, додавайте й видаляйте шари Optional Content Group (OCG) у документі PDF. +--- + +# Шари PDF (OCG) + +Керуйте групами необов’язкового вмісту (Optional Content Groups, OCG), яких зазвичай називають «шарами», усередині PDF. Можна вмикати й вимикати видимість шарів, додавати нові шари (зокрема вкладені дочірні), видаляти шари та зберігати змінений PDF. + +## Як це працює + +1. Завантажте файл PDF. +2. Натисніть кнопку обробки, щоб завантажити документ рушієм PyMuPDF. +3. Інструмент покаже всі наявні шари з їхнім станом видимості, станом блокування та ієрархією вкладеності. +4. Вмикайте й вимикайте прапорцями видимість шарів. Заблоковані шари перемикати не можна. +5. Додавайте нові шари верхнього рівня, ввівши назву й натиснувши кнопку додавання, або додавайте дочірні шари до наявного батьківського. +6. Видаліть шари, які вам більше не потрібні. +7. Натисніть **Зберегти**, щоб завантажити змінений PDF із застосованими змінами шарів. + +## Можливості + +- Показує ієрархію шарів із правильними відступами для вкладених шарів +- Увімкнення та вимкнення видимості шару +- Індикатор заблокованого шару запобігає випадковим змінам +- Додавання шарів верхнього рівня або дочірніх шарів із власними назвами +- Видалення окремих шарів +- Усі зміни зберігаються в новий файл PDF + +## Сценарії використання + +- Перемикання видимості шарів розмітки в архітектурних або інженерних кресленнях +- Додавання нових шарів анотацій у багатошаровий дизайн-документ +- Видалення застарілих шарів із шаблону перед розповсюдженням +- Перевірка того, які шари є в складному PDF, отриманому від третьої сторони + +## Поради + +- Якщо в PDF немає шарів, інструмент показує порожній стан із пропозицією додати шар. Не всі PDF використовують шари OCG: найчастіше вони трапляються в експорті з CAD і дизайнерських файлах. +- Дочірні шари візуально відсунуті під батьківським. Шари можна вкладати на будь-яку глибину. +- Заблоковані шари відображаються з іконкою замка, а їхні прапорці вимкнені. Ці блокування встановлює автор PDF. + +## Пов’язані інструменти + +- [Перегляд метаданих](./view-metadata) +- [Редагувати метадані](./edit-metadata) +- [Дублювати та впорядкувати](./organize-pdf) diff --git a/docs/uk/tools/pdf-multi-tool.md b/docs/uk/tools/pdf-multi-tool.md new file mode 100644 index 00000000..4c05a2f5 --- /dev/null +++ b/docs/uk/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF мультиінструмент +description: Універсальний менеджер сторінок для об’єднання, розділення, повороту, дублювання, видалення та зміни порядку сторінок PDF. +--- + +# PDF мультиінструмент + +Єдиний робочий простір для всіх операцій зі сторінками PDF. Завантажте один чи кілька PDF і працюйте з усіма їхніми сторінками в одній наочній сітці. Повертайте, переставляйте, дублюйте, видаляйте, вставляйте нові PDF, додавайте порожні сторінки та розділяйте результат, не залишаючи інструмент. + +## Як це працює + +1. Натисніть **Завантажити PDF** або перетягніть файли на область завантаження. Підтримується кілька файлів. +2. Усі сторінки з кожного завантаженого файлу з’являються в прокручуваній сітці з мініатюрами. +3. Керуйте сторінками за допомогою панелі інструментів або кнопок дій на кожній сторінці. +4. Позначайте сторінки прапорцем на кожній картці, а потім застосовуйте масові операції. +5. Позначайте точки розділення іконкою ножиць, щоб розбити результат на окремі файли. +6. Натисніть **Експортувати PDF**, щоб завантажити готовий результат. Якщо є позначки розділення, результатом буде ZIP із кількома PDF. + +## Можливості + +- **Об’єднання**: завантажені PDF автоматично об’єднуються в одному робочому просторі +- **Зміна порядку**: перетягуйте картки сторінок, щоб змінити послідовність +- **Поворот**: поворот окремої сторінки або групи кроками по 90 градусів (ліворуч або праворуч) +- **Дублювання**: клонуйте будь-яку сторінку одним кліком +- **Видалення**: прибирайте окремі сторінки або видаляйте вибрані групою +- **Вставити PDF**: додайте новий PDF після будь-якої сторінки +- **Додати порожню сторінку**: додайте порожню сторінку A4 у кінець +- **Розділення**: розставте позначки розділення між сторінками, а потім експортуйте ZIP з окремими PDF +- **Вибрати все / Зняти вибір**: швидкий вибір для масових операцій +- **Скасувати / Повторити**: повна історія скасування та повторення кожної операції +- **Завантажити вибране**: експортуйте лише вибрані сторінки як окремий PDF +- Автоматично відновлює пошкоджені PDF перед завантаженням + +## Сценарії використання + +- Створення власного документа зі сторінок кількох вихідних PDF +- Наведення порядку в скануванні: видалення порожніх сторінок, поворот бічних сканів і зміна порядку розділів +- Розділення великого PDF за межами розділів за допомогою наочних позначок +- Швидке редагування сторінок без повноцінного редактора PDF + +## Поради + +- Система скасування та повторення відстежує кожну операцію. Користуйтеся нею вільно: випадково зіпсувати роботу неможливо. +- Позначки розділення відображаються як пунктирні сині лінії між сторінками. Розмістіть їх там, де потрібно розділити документ, а потім експортуйте, щоб отримати ZIP. +- Для простого об’єднання чи розділення окремі інструменти [Об’єднати PDF](./merge-pdf) або [Розділити PDF](./split-pdf) можуть бути швидшими. Мультиінструмент незамінний, коли в одному сеансі потрібно кілька операцій. + +## Пов’язані інструменти + +- [Об’єднати PDF](./merge-pdf) +- [Розділити PDF](./split-pdf) +- [Дублювати та впорядкувати](./organize-pdf) +- [Повернути PDF](./rotate-pdf) diff --git a/docs/uk/tools/pdf-to-bmp.md b/docs/uk/tools/pdf-to-bmp.md new file mode 100644 index 00000000..54c57e3a --- /dev/null +++ b/docs/uk/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF у BMP +description: Конвертуйте сторінки PDF у нестиснуті зображення BMP. Корисно для застарілих систем і друкарських процесів, що потребують растрового вводу. +--- + +# PDF у BMP + +Перетворює кожну сторінку PDF на зображення BMP (Bitmap). BMP є нестисненим форматом, тому результат піксель у піксель без втрати якості, але файли великі. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Натисніть **Конвертувати** для обробки файлу. +3. Один файл `.bmp` або ZIP-архів завантажується автоматично. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Сторінки відображаються у фіксованому масштабі 2x, тож зображення приблизно вдвічі більші за рідні розміри сторінки PDF. + +## Формат результату + +- **Одна сторінка**: `filename.bmp` +- **Кілька сторінок**: `filename_bmps.zip`, що містить `page_1.bmp`, `page_2.bmp` тощо. + +## Сценарії використання + +- Передавання сторінок PDF у застарілі системи або обладнання, що приймають лише BMP. +- Підготовка нестиснутих зображень для певних друкарських процесів. +- Використання растрового результату як вводу для інструментів обробки зображень, що потребують сирих пікселів. + +## Поради + +- Файли BMP дуже великі, бо зберігають сирі дані пікселів без стиснення. Для більшості завдань [PDF у PNG](./pdf-to-png) дає якість без втрат і значно менші файли. +- Якщо ваша система приймає PNG або TIFF, віддайте перевагу цим форматам, щоб заощадити місце на диску. + +## Пов’язані інструменти + +- [PDF у PNG](./pdf-to-png) +- [PDF у TIFF](./pdf-to-tiff) +- [PDF у JPG](./pdf-to-jpg) diff --git a/docs/uk/tools/pdf-to-cbz.md b/docs/uk/tools/pdf-to-cbz.md new file mode 100644 index 00000000..f8f69061 --- /dev/null +++ b/docs/uk/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF у CBZ +description: Конвертуйте PDF у файл CBZ (Comic Book Archive) для читалок коміксів, як-от Komga, Kavita, CDisplayEx і Calibre. +--- + +# PDF у CBZ + +Перетворює PDF на файл CBZ (Comic Book ZIP), стандартний формат цифрових коміксів і манґи. Кожна сторінка PDF стає зображенням в архіві. Інструмент створює метадані в трьох форматах для максимальної сумісності: ComicInfo.xml, metadata.opf і ComicBookInfo JSON. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Оберіть формат зображень, якість, масштаб і необов’язкові метадані. +3. Натисніть **Конвертувати**, щоб створити файл CBZ. +4. Файл `.cbz` завантажується автоматично. + +## Параметри + +| Параметр | Значення | За замовчуванням | Опис | +| ---------------- | --------------- | ---------------- | ------------------------------------------------------------------------------------------------- | +| Формат зображень | JPEG, PNG, WebP | JPEG | JPEG для кольорових коміксів, PNG для чорно-білої манґи без втрат, WebP для найкращого стиснення. | +| Якість | 50–100% | 85% | Керує стисненням JPEG/WebP. Приховано для PNG (завжди без втрат). | +| Масштаб | 1.0x–4.0x | 2.0x | Вищий масштаб дає чіткіші зображення для екранів високої роздільності. | +| Відтінки сірого | Увімк./Вимк. | Вимк. | Перетворює сторінки на відтінки сірого. Зменшує розмір файлу для чорно-білого вмісту. | +| Режим манґи | Увімк./Вимк. | Вимк. | Задає в метаданих напрямок читання справа наліво. | +| Додати метадані | Увімк./Вимк. | Увімк. | Вбудовує ComicInfo.xml, metadata.opf і ComicBookInfo JSON. | + +## Поля метаданих + +Коли метадані ввімкнено, можна заповнити: + +- **Назва**: автоматично визначається з імені файлу PDF. +- **Серія**: назва серії (напр., "Naruto"). +- **Номер (#)**: номер випуску в серії. +- **Том**: номер тому. +- **Автор(и)**: ім’я сценариста або творця. +- **Видавець**: видавнича компанія. +- **Теги / Жанр**: теги через кому (напр., "Action, Adventure"). +- **Рік видання**: рік публікації (1900–2100). +- **Рейтинг**: оцінка спільноти від 0 до 5. + +## Сумісність метаданих + +Інструмент записує метадані в трьох форматах, щоб їх знайшла кожна читалка: + +| Формат | Розташування | Підтримується в | +| ------------------ | ------------------ | ------------------------------------------- | +| ComicInfo.xml | Файл усередині ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Файл усередині ZIP | Calibre | +| ComicBookInfo JSON | Поле коментаря ZIP | Calibre (запасний варіант) | + +## Формат результату + +- `filename.cbz`: ZIP-архів із пронумерованими зображеннями сторінок і файлами метаданих. + +Зображення сторінок мають імена з нулями попереду (`01.jpg`, `02.jpg` тощо), щоб читалки показували їх у правильному порядку. + +## Сценарії використання + +- Конвертація PDF манґи чи коміксів для читалок коміксів. +- Створення цифрової бібліотеки коміксів у Komga, Kavita або Calibre. +- Перетворення відсканованих коміксів на зручний для читалок формат. +- Обмін коміксами у форматі, що зберігає напрямок читання та метадані. + +## Поради + +- Використовуйте **JPEG** для кольорових коміксів і **PNG** для чорно-білої манґи: PNG дуже ефективно стискає чорно-білий вміст. +- Увімкніть **Відтінки сірого** для манґи, щоб суттєво зменшити розмір файлу. +- Заповніть поля **Серія** та **Номер**, щоб менеджери бібліотек (Komga, Calibre) могли автоматично впорядкувати вашу колекцію. +- **WebP** забезпечує найкраще стиснення, але старіші читалки коміксів можуть його не підтримувати. + +## Пов’язані інструменти + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у PNG](./pdf-to-png) +- [PDF у TIFF](./pdf-to-tiff) +- [Витяг зображень](./extract-images) diff --git a/docs/uk/tools/pdf-to-csv.md b/docs/uk/tools/pdf-to-csv.md new file mode 100644 index 00000000..7d435495 --- /dev/null +++ b/docs/uk/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF у CSV +description: Витягуйте таблиці з документів PDF і експортуйте їх в один файл CSV. Працює з багатосторінковими PDF з автоматичним виявленням таблиць. +--- + +# PDF у CSV + +Витягує таблиці з PDF і експортує їх у файл CSV. Інструмент сканує кожну сторінку на табличні дані за допомогою механізму виявлення таблиць PyMuPDF, а потім записує всі знайдені рядки в один результат, розділений комами. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Натисніть **Конвертувати**, щоб почати витяг таблиць. +3. Інструмент сканує кожну сторінку та автоматично визначає таблиці. +4. Файл `.csv` завантажується з усіма витягнутими даними таблиць. + +Таблиці з різних сторінок розділяються в результаті порожніми рядками. Клітинки з комами, лапками або переносами рядків коректно екрануються згідно з RFC 4180. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Усі знайдені в документі таблиці витягуються й об’єднуються в один CSV. + +## Формат результату + +- Один файл `filename.csv`, що містить усі виявлені таблиці. + +## Сценарії використання + +- Перенесення фінансових даних із банківських виписок чи рахунків у PDF до електронної таблиці. +- Витяг цінових таблиць із комерційних пропозицій постачальників для порівняння. +- Перетворення табличних дослідницьких даних із PDF-статей на формат, придатний для інструментів аналізу. +- Міграція даних зі застарілих PDF-звітів у бази даних. + +## Поради + +- Якщо таблиць не знайдено, інструмент показує повідомлення "Таблиць не знайдено". Зазвичай це означає, що PDF використовує текстове розташування, схоже на таблицю, але не є справжньою таблицею. +- Для більшого контролю над окремими таблицями скористайтеся інструментом [Витяг таблиць з PDF](./extract-tables), що дає змогу обрати вивід у CSV, JSON або Markdown. +- Якщо дані потрібні у форматі Excel з окремими аркушами для кожної таблиці, скористайтеся [PDF у Excel](./pdf-to-excel). + +## Пов’язані інструменти + +- [PDF у Excel](./pdf-to-excel) +- [Витяг таблиць з PDF](./extract-tables) +- [PDF у текст](./pdf-to-text) diff --git a/docs/uk/tools/pdf-to-excel.md b/docs/uk/tools/pdf-to-excel.md new file mode 100644 index 00000000..ab568c98 --- /dev/null +++ b/docs/uk/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF у Excel +description: Витягуйте таблиці з документів PDF в електронну таблицю Excel. Кожна таблиця отримує власний аркуш із посиланням на сторінку. +--- + +# PDF у Excel + +Витягує таблиці з PDF і зберігає їх як електронну таблицю Excel (`.xlsx`). Кожна виявлена таблиця розміщується на окремому аркуші з позначкою номера таблиці та вихідної сторінки. Виявлення таблиць працює на PyMuPDF, а створення файлу Excel забезпечує бібліотека SheetJS. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Натисніть **Конвертувати**, щоб почати витяг таблиць. +3. Інструмент сканує кожну сторінку на таблиці, а потім створює книгу Excel. +4. Файл `.xlsx` завантажується з одним аркушем на кожну таблицю. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Усі виявлені таблиці витягуються автоматично. + +## Формат результату + +- Один файл `filename.xlsx`. +- **Одна таблиця**: один аркуш з назвою "Table". +- **Кілька таблиць**: аркуші з назвами "Table 1 (Page 3)", "Table 2 (Page 5)" тощо. Назви аркушів обрізаються до 31 символу (обмеження Excel). + +## Сценарії використання + +- Перетворення фінансових PDF-звітів на редаговані електронні таблиці для подальшого аналізу. +- Витяг таблиць інвентаризації чи замовлень із PDF постачальників. +- Перенесення структурованих даних із PDF-форм або каталогів в Excel для сортування й фільтрації. +- Архівування табличних даних із PDF у форматі, з яким можуть працювати нетехнічні колеги. + +## Поради + +- Якщо інструмент повідомляє "Таблиць не знайдено", PDF, імовірно, використовує вільне текстове розташування замість структурованих таблиць. Спробуйте [PDF у текст](./pdf-to-text), щоб отримати сирий вміст. +- Для простішого плоского формату скористайтеся [PDF у CSV](./pdf-to-csv). Для завантаження окремих таблиць у кількох форматах скористайтеся [Витяг таблиць з PDF](./extract-tables). +- Перегляньте назви аркушів, щоб визначити, з якої сторінки походить кожна таблиця. + +## Пов’язані інструменти + +- [PDF у CSV](./pdf-to-csv) +- [Витяг таблиць з PDF](./extract-tables) +- [PDF у текст](./pdf-to-text) diff --git a/docs/uk/tools/pdf-to-greyscale.md b/docs/uk/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..1feaa2bd --- /dev/null +++ b/docs/uk/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF у відтінки сірого +description: Конвертуйте кольоровий PDF у версію у відтінках сірого (чорно-білу). Створює новий PDF, у якому з кожної сторінки прибрано колір. +--- + +# PDF у відтінки сірого + +Перетворює кольоровий PDF на версію у відтінках сірого. Кожна сторінка відображається, знебарвлюється й повторно вбудовується як зображення JPEG у новий PDF. Результат зберігає початкові розміри сторінок. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Натисніть **Конвертувати** для обробки файлу. +3. Новий файл `greyscale.pdf` завантажується з усіма сторінками, перетвореними на чорно-білі. + +Усередині кожна сторінка відображається в масштабі 2x, дані пікселів проходять через фільтр відтінків сірого, потім кодуються як JPEG із якістю 90% і розміщуються в новому документі PDF. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Перетворення у відтінки сірого використовує стандартну формулу яскравості, а якість JPEG фіксована на рівні 90%. + +## Формат результату + +- Один файл `greyscale.pdf`, що містить усі сторінки як зображення JPEG у відтінках сірого. + +## Сценарії використання + +- Підготовка документів до чорно-білого друку для економії на кольоровому тонері. +- Виконання вимог до подання юридичних чи державних документів, що вимагають відтінків сірого. +- Зменшення розміру файлу кольорових PDF (зображення JPEG у відтінках сірого менші за кольорові). +- Створення єдиного візуального стилю для документів зі змішаними кольоровими й чорно-білими сторінками. + +## Поради + +- Оскільки кожна сторінка растеризується й повторно вбудовується як JPEG, результат складається із зображень. Текст початкового PDF більше не можна буде виділяти чи шукати. Якщо потім потрібен текст із пошуком, пропустіть результат через інструмент OCR. +- Для точнішого керування кольорами (яскравість, контраст, насиченість) зверніть увагу на інструмент «Корекція кольору» або вузол Greyscale у [Конструкторі PDF-процесів](./pdf-workflow). + +## Пов’язані інструменти + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у PNG](./pdf-to-png) +- [Конструктор PDF-процесів](./pdf-workflow) diff --git a/docs/uk/tools/pdf-to-jpg.md b/docs/uk/tools/pdf-to-jpg.md new file mode 100644 index 00000000..90ea67d3 --- /dev/null +++ b/docs/uk/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF у JPG +description: Конвертуйте сторінки PDF у зображення JPG із настроюваною якістю. Односторінкові PDF завантажуються напряму, багатосторінкові експортуються як ZIP. +--- + +# PDF у JPG + +Перетворює кожну сторінку PDF на зображення JPG. Односторінкові документи завантажуються як окремий файл `.jpg`. Багатосторінкові PDF створюють ZIP-архів з одним JPG на кожну сторінку. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. Інструмент покаже ім’я файлу, його розмір і кількість сторінок. +2. Налаштуйте повзунок **Якість**, щоб керувати стисненням JPG. +3. Натисніть **Конвертувати**, щоб почати обробку. +4. Результат завантажується автоматично: один JPG для односторінкового PDF або ZIP-файл для багатосторінкових документів. + +## Параметри + +- **Якість**: повзунок від 0% до 100% (за замовчуванням 90%). Вищі значення дають чіткіші зображення більшого розміру. Нижчі значення стискають агресивніше. + +Усередині сторінки відображаються в масштабі 2x, тож роздільність результату вдвічі більша за розміри сторінки PDF. Стандартна сторінка формату Letter дає зображення приблизно 1 224 x 1 584 пікселів. + +## Формат результату + +- **Одна сторінка**: `filename.jpg` +- **Кілька сторінок**: `filename_jpgs.zip`, що містить `page_1.jpg`, `page_2.jpg` тощо. + +## Сценарії використання + +- Створення мініатюр для системи керування документами. +- Надсилання сторінки зі звіту в чаті чи листі, що не підтримує PDF. +- Створення графічних ресурсів із PDF-діаграм чи ілюстрацій. +- Архівування відсканованих документів як окремих зображень. + +## Поради + +- Для результату без втрат скористайтеся [PDF у PNG](./pdf-to-png). +- Якість 80-90% забезпечує добрий баланс між розміром файлу та візуальною точністю. +- Якщо для кожної сторінки потрібен певний формат, зверніть увагу на [Конструктор PDF-процесів](./pdf-workflow), де є вихідний вузол «PDF у зображення». + +## Пов’язані інструменти + +- [PDF у PNG](./pdf-to-png) +- [PDF у WebP](./pdf-to-webp) +- [PDF у BMP](./pdf-to-bmp) +- [PDF у TIFF](./pdf-to-tiff) diff --git a/docs/uk/tools/pdf-to-json.md b/docs/uk/tools/pdf-to-json.md new file mode 100644 index 00000000..58c86d8c --- /dev/null +++ b/docs/uk/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF у JSON +description: Конвертуйте файли PDF у структурований формат JSON за допомогою CPDF. Експортує внутрішню структуру PDF як машинозчитувані дані JSON. +--- + +# PDF у JSON + +Конвертує один чи кілька файлів PDF у формат JSON. Інструмент використовує CPDF (Coherent PDF), щоб серіалізувати внутрішню структуру кожного PDF у машинозчитуване представлення JSON. Результат завжди надається як ZIP-архів. + +## Як це працює + +1. Оберіть один чи кілька файлів PDF у вікні вибору файлів. +2. Натисніть **Конвертувати**, щоб почати обробку. Конвертація виконується у фоновому веб-воркері. +3. Завантажується ZIP-архів, що містить по одному файлу JSON для кожного вхідного PDF. + +Рядок стану показує перебіг етапів конвертації та створення ZIP. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Кожен PDF конвертується в повне представлення JSON. + +## Формат результату + +- Файл `pdfs-to-json.zip`, що містить `filename.json` для кожного вхідного PDF. + +Результат JSON відображає внутрішню структуру об’єктів PDF, зокрема дерева сторінок, посилання на шрифти, метадані та потоки вмісту. + +## Сценарії використання + +- Перевірка внутрішньої структури PDF для налагодження чи валідації. +- Програмне отримання структурованих метаданих і властивостей сторінок. +- Передавання даних про структуру PDF у власні конвеєри обробки. +- Аудит PDF-документів на відповідність вимогам шляхом аналізу їхніх дерев об’єктів. + +## Поради + +- Цей інструмент виводить сиру структуру об’єктів PDF, а не витягнутий текстовий вміст. Якщо потрібен текст сторінок у форматі JSON, скористайтеся натомість [Підготовка PDF для ШІ](./prepare-pdf-for-ai). +- Для витягу простого тексту [PDF у текст](./pdf-to-text) більш прямолінійний. +- Великі PDF зі складною структурою дають дуже великі файли JSON. + +## Пов’язані інструменти + +- [PDF у текст](./pdf-to-text) +- [Підготовка PDF для ШІ](./prepare-pdf-for-ai) +- [Витяг таблиць з PDF](./extract-tables) diff --git a/docs/uk/tools/pdf-to-markdown.md b/docs/uk/tools/pdf-to-markdown.md new file mode 100644 index 00000000..b99bfb7e --- /dev/null +++ b/docs/uk/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF у Markdown +description: Конвертуйте документи PDF у формат Markdown із необов’язковим витягом зображень. Підтримує пакетну конвертацію кількох файлів. +--- + +# PDF у Markdown + +Конвертує файли PDF у формат Markdown (`.md`), зберігаючи заголовки, абзаци, списки та базове форматування. За бажанням витягує й додає вбудовані зображення. Підтримує одиночну та пакетну конвертацію. Працює на PyMuPDF. + +## Як це працює + +1. Завантажте один чи кілька PDF, натиснувши на область завантаження або перетягнувши файли. +2. За бажанням увімкніть **Додати зображення**, щоб вбудувати витягнуті зображення в результат Markdown. +3. Натисніть **Конвертувати**, щоб почати обробку. +4. Один файл завантажується як `filename.md`. Кілька файлів створюють `markdown-files.zip`. + +## Параметри + +- **Додати зображення**: якщо позначено, вбудовані в PDF зображення витягуються й додаються як посилання в результат Markdown. Якщо не позначено, конвертується лише текстовий вміст. + +## Формат результату + +- **Один файл**: `filename.md` +- **Кілька файлів**: `markdown-files.zip`, що містить по одному `.md` на кожен вхідний PDF. + +## Сценарії використання + +- Конвертація PDF-документації в Markdown для генератора статичних сайтів, як-от VitePress, Hugo чи Jekyll. +- Перетворення PDF-статей на редагований Markdown для застосунків нотаток, як-от Obsidian. +- Міграція застарілих баз знань у PDF у текстовий формат, зручний для Git. +- Витяг структурованого вмісту з PDF-книг для переформатування. + +## Поради + +- Параметр «Додати зображення» корисний, коли PDF містить діаграми чи рисунки, важливі для змісту. Для текстових документів вимкніть його, щоб результат був чистішим. +- Складні макети з бічними колонками, виносками чи багатоколонковим текстом можуть дати недосконалий Markdown. Перегляньте результат і за потреби відкоригуйте. +- Для сирого тексту без форматування скористайтеся [PDF у текст](./pdf-to-text). + +## Пов’язані інструменти + +- [PDF у текст](./pdf-to-text) +- [PDF у Word](./pdf-to-word) +- [Підготовка PDF для ШІ](./prepare-pdf-for-ai) diff --git a/docs/uk/tools/pdf-to-pdfa.md b/docs/uk/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..f9336174 --- /dev/null +++ b/docs/uk/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF у PDF/A +description: Конвертуйте звичайні PDF у формат PDF/A для довготривалого архівування. Підтримує рівні відповідності PDF/A-1b, PDF/A-2b і PDF/A-3b. +--- + +# PDF у PDF/A + +PDF/A є підмножиною PDF, стандартизованою ISO, для довготривалого цифрового збереження. Цей інструмент конвертує ваші звичайні PDF у документи, що відповідають PDF/A, за допомогою Ghostscript, який працює безпосередньо у вашому браузері. + +## Як це працює + +1. Завантажте один чи кілька файлів PDF. +2. Оберіть **Версію PDF/A** у випадному списку. +3. За бажанням увімкніть **Попереднє сплощення PDF** для складних файлів, які не конвертуються звичайним способом. +4. Натисніть **Конвертувати у PDF/A**. Кілька файлів створюють ZIP-архів. + +## Версії PDF/A + +| Версія | Обмеження | Найкраще для | +| ------------ | ------------------------------------------------ | ------------------------------------------------------- | +| **PDF/A-1b** | Найсуворіша. Без прозорості, без шарів. | Максимальна сумісність зі старішими архівними системами | +| **PDF/A-2b** | Дозволяє прозорість і JPEG2000. | Універсальне архівування (рекомендовано) | +| **PDF/A-3b** | Дозволяє вбудовані вкладення будь-якого формату. | Архівування документів із вихідними файлами даних | + +PDF/A-2b вибрано за замовчуванням, і він підходить для переважної більшості потреб архівування. + +## Параметр попереднього сплощення + +Деякі PDF містять особливості, що заважають чистій конвертації в PDF/A: незвичні кодування шрифтів, складні стеки прозорості або пошкоджені внутрішні структури. Увімкнення **Попереднього сплощення** растеризує PDF з роздільністю 300 DPI перед конвертацією, що гарантує відповідність ціною неможливості виділяти текст. Використовуйте його як запасний варіант, коли звичайна конвертація дає помилки. + +Для попереднього сплощення потрібен рушій PyMuPDF WASM. + +## Сценарії використання + +- Виконання вимог державного чи юридичного архівування (у багатьох юрисдикціях PDF/A обов’язковий для судових документів) +- Подання документів до інституційних репозиторіїв або цифрових бібліотек +- Збереження ділових записів, для яких початкового програмного забезпечення за десять років може не існувати +- Підготовка рахунків до стандартів електронного виставлення, що вимагають PDF/A-3b із вкладеннями XML + +## Поради + +- Спершу спробуйте конвертацію без попереднього сплощення. Вмикайте його, лише якщо виникає помилка. +- PDF/A вбудовує всі шрифти, тож вихідні файли часто більші за оригінали. +- Якщо для вашого процесу потрібна сувора відповідність, перевірте результат у спеціальному валідаторі PDF/A. + +## Пов’язані інструменти + +- [Стиснення PDF](./compress-pdf): зменште розмір файлу після конвертації +- [Сплощити PDF](./flatten-pdf): сплощіть форми перед конвертацією в PDF/A +- [Видалити метадані](./remove-metadata): приберіть метадані перед архівуванням diff --git a/docs/uk/tools/pdf-to-png.md b/docs/uk/tools/pdf-to-png.md new file mode 100644 index 00000000..7b5e93d0 --- /dev/null +++ b/docs/uk/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF у PNG +description: Конвертуйте сторінки PDF у зображення PNG без втрат із настроюваним масштабом. Ідеально для якісних знімків екрана та прозорих фонів. +--- + +# PDF у PNG + +Перетворює кожну сторінку PDF на зображення PNG. PNG використовує стиснення без втрат, тож результат зберігає кожну деталь оригінальної сторінки. Односторінкові PDF завантажуються як файл `.png`, багатосторінкові створюють ZIP. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Налаштуйте повзунок **Масштаб**, щоб керувати роздільністю результату. +3. Натисніть **Конвертувати**, щоб почати обробку. +4. Один PNG або ZIP-архів завантажується автоматично. + +## Параметри + +- **Масштаб**: від 1.0x до 3.0x (за замовчуванням 2.0x). При 2.0x стандартна сторінка формату Letter відображається приблизно як 1 224 x 1 584 пікселів. Вищі значення масштабу дають більші й чіткіші зображення ціною розміру файлу та часу обробки. + +## Формат результату + +- **Одна сторінка**: `filename.png` +- **Кілька сторінок**: `filename_pngs.zip`, що містить `page_1.png`, `page_2.png` тощо. + +## Сценарії використання + +- Створення високоточних знімків сторінок PDF для презентацій. +- Витяг діаграм чи схем, яким потрібні чіткі краї без артефактів стиснення. +- Підготовка ресурсів для веб-дизайну з PDF-макетів. +- Створення зображень сторінок без втрат для попередньої обробки перед OCR. + +## Поради + +- Файли PNG значно більші за JPG. Якщо розмір файлу важливіший за ідеальну якість, скористайтеся [PDF у JPG](./pdf-to-jpg) або [PDF у WebP](./pdf-to-webp). +- При масштабі 1.0x результат відповідає рідній роздільності PDF. Підніміть до 3.0x для експорту якості друку. + +## Пов’язані інструменти + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у WebP](./pdf-to-webp) +- [PDF у SVG](./pdf-to-svg) diff --git a/docs/uk/tools/pdf-to-svg.md b/docs/uk/tools/pdf-to-svg.md new file mode 100644 index 00000000..a42c1657 --- /dev/null +++ b/docs/uk/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF у SVG +description: Конвертуйте сторінки PDF у масштабовану векторну графіку SVG. Зберігає текст і форми як векторні контури для необмеженого масштабування. +--- + +# PDF у SVG + +Перетворює кожну сторінку PDF на файл SVG (Scalable Vector Graphics). На відміну від растрових форматів, SVG зберігає векторні контури, текст і форми, тож результат масштабується до будь-якого розміру без пікселізації. Працює на PyMuPDF. + +## Як це працює + +1. Завантажте один чи кілька PDF, натиснувши на область завантаження або перетягнувши файли. Можна додати кілька файлів і керувати ними окремо. +2. Натисніть **Конвертувати**, щоб обробити всі завантажені файли. +3. Конвертація одного файлу з однією сторінкою завантажується як окремий `.svg`. Решта випадків завантажуються як ZIP-архів. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Кожна сторінка конвертується в SVG за допомогою рідного векторного експорту PyMuPDF. + +## Формат результату + +- **Один файл, одна сторінка**: `filename.svg` +- **Один файл, кілька сторінок**: `filename_svg.zip`, що містить `page_1.svg`, `page_2.svg` тощо. +- **Кілька файлів**: `pdf_to_svg.zip` з файлами, упорядкованими за назвою вихідного документа. + +## Сценарії використання + +- Витяг векторних діаграм, графіків чи ілюстрацій із PDF-звітів для використання на веб-сторінках. +- Редагування вмісту сторінок PDF у векторному редакторі, як-от Inkscape чи Illustrator. +- Вбудовування масштабованих попередніх переглядів сторінок в адаптивні веб-застосунки. +- Витяг логотипів чи графіки з PDF-брошур зі збереженням чітких країв. + +## Поради + +- SVG найкраще працює з PDF, що містять векторний вміст. Скановані документи або PDF із великою кількістю зображень дадуть великі файли SVG із вбудованими растровими даними. +- Для растрового результату PDF із великою кількістю зображень скористайтеся [PDF у PNG](./pdf-to-png) або [PDF у JPG](./pdf-to-jpg). +- Цей інструмент підтримує пакетну конвертацію: завантажте кілька PDF одразу, щоб конвертувати їх за один запуск. + +## Пов’язані інструменти + +- [PDF у PNG](./pdf-to-png) +- [PDF у JPG](./pdf-to-jpg) +- [PDF у Markdown](./pdf-to-markdown) diff --git a/docs/uk/tools/pdf-to-text.md b/docs/uk/tools/pdf-to-text.md new file mode 100644 index 00000000..22f61ea5 --- /dev/null +++ b/docs/uk/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF у текст +description: Витягуйте простий текст із файлів PDF. Підтримує пакетний витяг із кількох PDF з виводом у файли TXT. +--- + +# PDF у текст + +Витягує весь текстовий вміст із файлів PDF і зберігає його як прості файли `.txt`. Підтримує пакетну обробку: завантажте кілька PDF і отримайте текст кожного за одну операцію. Працює на PyMuPDF. + +## Як це працює + +1. Завантажте один чи кілька PDF, натиснувши на область завантаження або перетягнувши файли. Керуйте списком файлів кнопками «Додати ще» та «Очистити». +2. Натисніть **Витягти**, щоб почати обробку. +3. Один файл завантажується як `filename.txt`. Кілька файлів створюють архів `pdf-to-text.zip`. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Увесь текст витягується з кожної сторінки в порядку читання. + +## Формат результату + +- **Один файл**: `filename.txt` +- **Кілька файлів**: `pdf-to-text.zip`, що містить по одному `.txt` на кожен вхідний PDF. + +## Сценарії використання + +- Витяг основного тексту з PDF-звітів для індексації повнотекстового пошуку. +- Конвертація PDF-книг чи статей у простий текст для читання на пристроях з е-чорнилом. +- Отримання тексту з договорів чи юридичних документів для аналізу за ключовими словами. +- Видалення форматування з PDF, щоб отримати чистий текст для скриптів обробки даних. +- Підготовка текстового корпусу з PDF-архівів для обробки природної мови. + +## Поради + +- Скановані PDF (лише зображення) дадуть порожні текстові файли, бо текстового шару для витягу немає. Спершу пропустіть скановані документи через OCR. +- Результат зберігає порядок читання, як його інтерпретує PyMuPDF, зазвичай зліва направо й згори вниз. Багатоколонкові макети можуть давати перемішаний текст. +- Для структурованого результату із заголовками та форматуванням спробуйте [PDF у Markdown](./pdf-to-markdown). Для структурованого JSON, готового для ШІ, скористайтеся [Підготовка PDF для ШІ](./prepare-pdf-for-ai). + +## Пов’язані інструменти + +- [PDF у Markdown](./pdf-to-markdown) +- [Підготовка PDF для ШІ](./prepare-pdf-for-ai) +- [PDF у Word](./pdf-to-word) diff --git a/docs/uk/tools/pdf-to-tiff.md b/docs/uk/tools/pdf-to-tiff.md new file mode 100644 index 00000000..7520e395 --- /dev/null +++ b/docs/uk/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF у TIFF +description: Конвертуйте сторінки PDF у зображення TIFF, що зазвичай використовуються в друку, факсах і архівних процесах. У разі помилки кодування повертається до PNG. +--- + +# PDF у TIFF + +Перетворює кожну сторінку PDF на зображення TIFF. TIFF є стандартним форматом для поліграфії, факсових систем і архівування документів. Інструмент використовує стиснення PackBits для кодування TIFF і повертається до PNG, якщо сторінку закодувати не вдалося. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Натисніть **Конвертувати** для обробки файлу. +3. Один файл TIFF або ZIP-архів завантажується автоматично. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Сторінки відображаються у фіксованому масштабі 2x. + +## Формат результату + +- **Одна сторінка**: `filename.tiff` +- **Кілька сторінок**: `filename_tiffs.zip`, що містить `page_1.tiff`, `page_2.tiff` тощо. + +Якщо кодування TIFF для певної сторінки не вдалося (через проблеми зі стисненням), ця сторінка зберігається як файл `.png`. У такому разі ZIP міститиме суміш файлів TIFF і PNG. + +## Сценарії використання + +- Подання документів до державних органів чи юридичних систем, що вимагають формат TIFF. +- Підготовка сторінок до передавання факсом через цифрові факсові сервіси. +- Архівування відсканованих документів у широко підтримуваному форматі без втрат. +- Передавання сторінок у корпоративні системи керування документами. + +## Поради + +- Файли TIFF великі. Якщо вам потрібна якість без втрат лише для вебу чи екрана, краще підійде [PDF у PNG](./pdf-to-png). +- Перевірте вміст ZIP, якщо для деяких сторінок знадобився запасний PNG: можливо, їх варто конвертувати окремо. + +## Пов’язані інструменти + +- [PDF у PNG](./pdf-to-png) +- [PDF у BMP](./pdf-to-bmp) +- [PDF у JPG](./pdf-to-jpg) diff --git a/docs/uk/tools/pdf-to-webp.md b/docs/uk/tools/pdf-to-webp.md new file mode 100644 index 00000000..4a6447c9 --- /dev/null +++ b/docs/uk/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF у WebP +description: Конвертуйте сторінки PDF у зображення WebP із настроюваною якістю. Файли менші за JPG при порівнянній візуальній якості. +--- + +# PDF у WebP + +Перетворює кожну сторінку PDF на зображення WebP. WebP зазвичай дає файли на 25-35% менші за JPG при тій самій сприйнятій якості, що робить його вдалим вибором для вебу. + +## Як це працює + +1. Завантажте PDF, натиснувши на область завантаження або перетягнувши файл. +2. Налаштуйте повзунок **Якість**. +3. Натисніть **Конвертувати** для обробки файлу. +4. Один файл `.webp` або ZIP-архів завантажується автоматично. + +## Параметри + +- **Якість**: повзунок від 0% до 100% (за замовчуванням 85%). Керує рівнем стиснення з втратами. Вищі значення зберігають більше деталей. + +Усередині сторінки відображаються в масштабі 2x, тож зображення приблизно вдвічі більші за рідні розміри PDF. + +## Формат результату + +- **Одна сторінка**: `filename.webp` +- **Кілька сторінок**: `filename_webps.zip`, що містить `page_1.webp`, `page_2.webp` тощо. + +## Сценарії використання + +- Підготовка попередніх переглядів сторінок для сайтів, де важлива пропускна здатність. +- Створення легких зображень листівок чи брошур для соціальних мереж. +- Пакетна конвертація багатосторінкових документів в оптимізований для вебу набір зображень. + +## Поради + +- WebP підтримується в усіх сучасних браузерах. Для сумісності зі старішими скористайтеся запасним варіантом [PDF у JPG](./pdf-to-jpg). +- Якість 80-85% на екрані зазвичай не відрізняється від оригіналу, зберігаючи малий розмір файлів. + +## Пов’язані інструменти + +- [PDF у JPG](./pdf-to-jpg) +- [PDF у PNG](./pdf-to-png) +- [PDF у BMP](./pdf-to-bmp) diff --git a/docs/uk/tools/pdf-to-word.md b/docs/uk/tools/pdf-to-word.md new file mode 100644 index 00000000..9ded2d68 --- /dev/null +++ b/docs/uk/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF у Word +description: Конвертуйте файли PDF у редаговані документи Word (DOCX). Підтримує пакетну конвертацію кількох PDF одночасно. +--- + +# PDF у Word + +Конвертує файли PDF у редаговані документи Word (`.docx`). Інструмент використовує PyMuPDF, щоб відновити вміст документа, зберігаючи текст, базове форматування та макет. Підтримує одиночну та пакетну конвертацію. + +## Як це працює + +1. Завантажте один чи кілька PDF, натиснувши на область завантаження або перетягнувши файли. Можна додати ще файли або видалити окремі зі списку. +2. Натисніть **Конвертувати**, щоб почати обробку. +3. Один файл завантажується як `filename.docx`. Кілька файлів пакуються в `converted-documents.zip`. + +## Параметри + +Цей інструмент не має настроюваних параметрів. Кожен PDF конвертується в DOCX вбудованим рушієм конвертації PyMuPDF. + +## Формат результату + +- **Один файл**: `filename.docx` +- **Кілька файлів**: `converted-documents.zip`, що містить по одному `.docx` на кожен вхідний PDF. + +## Сценарії використання + +- Редагування тексту в отриманому PDF, який потрібно змінити. +- Перетворення архівних PDF-звітів на формат, який колеги можуть редагувати в Microsoft Word чи Google Docs. +- Перенесення вмісту PDF-договорів чи пропозицій у Word для правок. +- Міграція застарілої PDF-документації в редагований формат. + +## Поради + +- Складні макети з багатоколонковим текстом, вбудованими формами чи насиченою графікою можуть конвертуватися неідеально. Перегляньте результат і відкоригуйте форматування в текстовому редакторі. +- Скановані PDF (лише зображення) дадуть порожні або мінімальні файли DOCX. Спершу пропустіть їх через OCR, щоб додати текстовий шар. +- Пакетний режим ефективний для конвертації цілих тек із PDF: завантажте їх усі одразу. + +## Пов’язані інструменти + +- [PDF у текст](./pdf-to-text) +- [PDF у Markdown](./pdf-to-markdown) +- [Конструктор PDF-процесів](./pdf-workflow) diff --git a/docs/uk/tools/pdf-to-zip.md b/docs/uk/tools/pdf-to-zip.md new file mode 100644 index 00000000..0c5d06a7 --- /dev/null +++ b/docs/uk/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF у ZIP +description: Пакуйте кілька файлів PDF в один ZIP-архів для зручного обміну та зберігання. +--- + +# PDF у ZIP + +Зберіть кілька файлів PDF в один ZIP-архів. Це простий інструмент пакування: жодної конвертації, стиснення чи зміни самих PDF. + +## Як це працює + +1. Завантажте кілька файлів PDF в області завантаження. +2. Перегляньте список файлів. Видаліть ті, які не потрібно включати. +3. Натисніть кнопку обробки. +4. ZIP-архів з усіма завантаженими PDF одразу завантажується. + +## Можливості + +- Приймає будь-яку кількість файлів PDF +- Видалення окремих файлів перед створенням архіву +- Зберігає початкові імена файлів усередині ZIP +- Без змін вмісту PDF: файли пакуються як є +- Показує ім’я та розмір кожного завантаженого PDF + +## Сценарії використання + +- Об’єднання набору рахунків чи квитанцій для вкладення в лист +- Пакування результатів проєкту (кількох PDF-звітів) для передавання +- Створення єдиного завантаження для колекції форм чи шаблонів +- Архівування пакета документів в один стиснений файл + +## Поради + +- ZIP-файл використовує початкові імена PDF. Якщо у вас є файли з однаковими іменами, перейменуйте їх перед завантаженням, щоб уникнути конфліктів. +- Цей інструмент не стискає самі PDF. Щоб зменшити розмір файлів, спершу пропустіть їх через «Стиснення PDF», а потім запакуйте цим інструментом. + +## Пов’язані інструменти + +- [Об’єднати PDF](./merge-pdf) +- [Розділити PDF](./split-pdf) +- [Стиснення PDF](./compress-pdf) diff --git a/docs/uk/tools/pdf-workflow.md b/docs/uk/tools/pdf-workflow.md new file mode 100644 index 00000000..ee50c074 --- /dev/null +++ b/docs/uk/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Конструктор PDF-процесів +description: 'Візуально створюйте власні конвеєри обробки PDF, з’єднуючи вузли на полотні. Ланцюжіть операції: об’єднання, стиснення, водяний знак і експорт.' +--- + +# Конструктор PDF-процесів + +Конструктор процесів дає змогу об’єднати кілька операцій з PDF в один автоматизований конвеєр. Замість запуску інструментів по одному ви збираєте візуальний граф із вузлів (вхід, обробка, вихід) і виконуєте все одним кліком. Ваші файли ніколи не залишають браузер. + +## Як це працює + +Інтерфейс поділено на три панелі: **набір вузлів** ліворуч, **полотно** в центрі та **панель налаштувань** праворуч, яка з’являється після вибору вузла. + +1. **Додавайте вузли**, натискаючи на них у лівій бічній панелі або перетягуючи прямо на полотно. Скористайтеся рядком пошуку вгорі набору, щоб фільтрувати за назвою. +2. **З’єднуйте вузли**, перетягуючи від вихідного гнізда (унизу вузла) до вхідного гнізда (угорі іншого вузла). З’єднання йдуть згори вниз. +3. **Налаштовуйте параметри**, натиснувши на вузол, щоб відкрити його панель налаштувань праворуч. Кожен тип вузла має власні параметри (діапазони сторінок, повзунки якості, паролі тощо). +4. **Запускайте процес**, натиснувши кнопку **Запустити** на панелі інструментів. Рушій виконує вузли в топологічному порядку, обробляючи кожен послідовно. Рядок стану внизу показує прогрес. +5. **Завантажуйте результати**: кінцевий вузол Завантажити зберігає підсумковий PDF (або ZIP, якщо створено кілька файлів). + +## Категорії вузлів + +Вузли організовано в шість категорій, кожна позначена власним кольором на полотні: + +- **Ввід** (синій): Введення PDF, Вхідне зображення, Word/Excel/PowerPoint у PDF та понад 15 інших конвертерів форматів, що передають файли в конвеєр. +- **Редагування та анотації** (індиго): Обрізати PDF, PDF у відтінки сірого, Інвертувати кольори, Додати водяний знак, Нумерація сторінок, Колонтитули, Ефект сканера, Корекція кольору, Колір фону, Видалити порожні сторінки, Видалити анотації. +- **Організація та керування** (фіолетовий): Об’єднати PDF, Розділити PDF, Витяг сторінок, Повернути PDF, Видалити сторінки, Зворотний порядок сторінок, Додати порожню сторінку, Розділити сторінки, N-Up PDF, Вирівняти розмір сторінок, Об’єднати в одну сторінку, PDF-буклет, Постеризація PDF, Редагувати метадані, Зміст, OCR PDF. +- **Оптимізація та відновлення** (бурштиновий): Стиснення PDF, Растеризація PDF, Лінеаризація PDF, Вирівнювання PDF, PDF у PDF/A, Шрифти у контури, Відновити PDF. +- **Захист PDF** (рожево-червоний): Зашифрувати, Розшифрувати, Очистити PDF, Сплющити PDF, Цифровий підпис, Закреслити. +- **Вивід** (бірюзовий): Завантажити (автоматично визначає один PDF чи ZIP), PDF у зображення, PDF у текст, PDF у DOCX, PDF у XLSX, PDF у CSV, PDF у SVG, PDF у Markdown, Витяг зображень. + +## Збереження та завантаження процесів + +Панель інструментів пропонує чотири способи збереження: + +- **Зберегти**: зберігає поточний процес як іменований шаблон у локальному сховищі вашого браузера. Можна зберегти кілька шаблонів. +- **Завантажити**: відкриває вікно зі списком усіх збережених шаблонів. Натисніть «Завантажити», щоб відновити шаблон, або видаліть непотрібні. +- **Експорт**: завантажує процес як файл `.json`, щоб ним можна було поділитися або створити резервну копію. +- **Імпорт**: завантажує файл процесу `.json` з диска, відновлюючи всі вузли, їхні позиції та з’єднання. + +Шаблони зберігаються між сеансами в локальному сховищі. Експортовані файли JSON переносяться між браузерами та пристроями. + +## Модель виконання + +Рушій будує граф залежностей із ваших з’єднань і виконує вузли в топологічному порядку. Якщо будь-який вузол завершується помилкою, виконання зупиняється, а вузол із помилкою позначається червоним. Кілька правил, які варто пам’ятати: + +- Кожному процесу потрібен принаймні один вузол **Ввід** і один вузол **Вивід**. +- Рушій виявляє циклічні залежності та блокує виконання з помилкою. +- Вузол **Зашифрувати** має бути останнім кроком обробки перед вихідним вузлом. Розміщення його раніше спричинить попередження валідації, бо наступні вузли не можуть працювати із зашифрованими даними. +- Для PDF із паролем під час виконання з’являється запит пароля. +- Підтримуються вхідні дані з кількох PDF: вузол Об’єднати PDF може їх об’єднати, а вузли пакетної обробки обробляють кожен PDF окремо. + +## Типи гнізд + +З’єднання використовують типізовані гнізда, щоб запобігти неправильним підключенням: + +- **PDF** (індиго): один документ PDF. +- **MultiPDF** (бурштиновий): кілька документів PDF, зібраних разом. +- **Image** (зелений): блоб зображення. + +## Параметри + +Кожен вузол має власну конфігурацію, доступну через праву панель налаштувань. Типові приклади: + +- **Діапазони сторінок** у вузлах Розділити PDF, Витяг сторінок, Видалити сторінки +- **Повзунки якості** у вихідних вузлах перетворення на зображення +- **Поля пароля** у вузлах Зашифрувати і Розшифрувати +- **Текстові поля** для Додати водяний знак, Колонтитули, Редагувати метадані +- **Кути повороту** у вузлі Повернути PDF +- **Рівень стиснення** у вузлі Стиснення PDF +- **Вибір мови OCR** у вузлі OCR PDF + +## Сценарії використання + +- **Конвеєр обробки рахунків**: Введення PDF -> OCR PDF -> Витяг таблиць з PDF -> Завантажити як CSV. +- **Стандартизація звітів**: Word у PDF -> Вирівняти розмір сторінок -> Нумерація сторінок -> Додати водяний знак -> Стиснення PDF -> Завантажити. +- **Підготовка до архівування**: Введення PDF -> Відновити PDF -> Сплющити PDF -> Очистити PDF -> PDF у PDF/A -> Завантажити. +- **Пакетний витяг зображень**: Введення PDF (кілька файлів) -> Витяг зображень -> Завантажити ZIP. +- **Буклети, готові до друку**: Введення PDF -> PDF-буклет -> Обрізати PDF -> Стиснення PDF -> Завантажити. +- **Захищене розповсюдження**: Введення PDF -> Закреслити -> Видалити анотації -> Зашифрувати -> Завантажити. + +## Поради + +- Використовуйте **Delete** або **Backspace**, щоб видалити вибраний вузол із полотна. +- Натисніть кнопку **X** на рядку стану вузла, щоб видалити його напряму. +- Переміщуйте полотно, натискаючи й перетягуючи на порожньому місці. Під час переміщення курсор змінюється на іконку руки. +- На мобільних пристроях використовуйте кнопку **+** на панелі інструментів, щоб перемикати набір вузлів. +- Якщо процес створює кілька вихідних файлів, вузол Завантажити автоматично пакує їх у ZIP. +- Починайте з простого: збудуйте й перевірте конвеєр із двох вузлів, перш ніж ускладнювати. + +## Пов’язані інструменти + +- [PDF у текст](./pdf-to-text) +- [PDF у Excel](./pdf-to-excel) +- [Витяг зображень](./extract-images) +- [PDF у Markdown](./pdf-to-markdown) diff --git a/docs/uk/tools/png-to-pdf.md b/docs/uk/tools/png-to-pdf.md new file mode 100644 index 00000000..fbd0b8af --- /dev/null +++ b/docs/uk/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG у PDF +description: Конвертуйте одне чи кілька зображень PNG у документ PDF із настроюваною якістю повністю у вашому браузері. +--- + +# PNG у PDF + +Конвертуйте зображення PNG у PDF зі збереженням повної роздільності. Кожен PNG стає окремою сторінкою розміром, що відповідає початковому зображенню. Прозорість обробляється автоматично. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :--------- | +| PNG | `.png` | + +## Як це працює + +1. Натисніть на область завантаження або перетягніть файли PNG. Можна вибрати одразу кілька. +2. Керуйте списком файлів: видаляйте зайві або додавайте нові. +3. Оберіть рівень **Якості PDF** у випадному списку. +4. Натисніть **Конвертувати у PDF**. Результат завантажується як `from_jpgs.pdf`. + +Інструмент використовує pdf-lib, щоб вбудовувати кожне зображення напряму. Якщо PNG неможливо вбудувати рідним способом (наприклад, через незвичний профіль кольору), він повторно відображається через canvas як JPEG. + +## Параметри + +**Якість PDF** керує стисненням, що застосовується перед вбудовуванням: + +- **Висока якість**: мінімальне стиснення, найбільший розмір файлу. +- **Середня якість** (за замовчуванням): добрий баланс розміру та чіткості. +- **Низька якість**: максимальне стиснення, найменший результат. + +## Сценарії використання + +- Перетворення знімків екрана на багатосторінковий PDF для звітів про помилки чи документації +- Пакування експорту UI-дизайну в один файл для рецензування +- Перетворення експорту діаграм (draw.io, Excalidraw) на PDF для спільного доступу +- Складання набору зображень графіків у звіт + +## Поради + +- PNG із прозорістю отримують білий фон у PDF. Якщо потрібен інший фон, відредагуйте зображення заздалегідь. +- Для знімків екрана та діаграм із чіткими краями й текстом висока якість уникає артефактів стиснення JPEG. Середня чи низька можуть внутрішньо конвертувати у JPEG. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [JPG у PDF](./jpg-to-pdf) +- [SVG у PDF](./svg-to-pdf) diff --git a/docs/uk/tools/posterize-pdf.md b/docs/uk/tools/posterize-pdf.md new file mode 100644 index 00000000..94774037 --- /dev/null +++ b/docs/uk/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Постеризація PDF +description: Розділіть сторінки PDF на сітку менших сторінок для великоформатного друку на кількох аркушах. +--- + +# Постеризація PDF + +Розділіть кожну сторінку PDF на сітку менших підсторінок. Цей інструмент потрібен, щоб надрукувати одну сторінку на кількох аркушах паперу, які потім складаються разом у великий постер або банер. + +## Як це працює + +1. Завантажте файл PDF. +2. Задайте кількість **рядків** і **стовпців**, щоб визначити сітку (наприклад, 2 рядки x 2 стовпці розділяють кожну сторінку на 4 підсторінки). +3. За потреби вкажіть діапазон сторінок, щоб обмежити, які сторінки буде постеризовано. +4. На полотні попереднього перегляду показано накладену сітку на поточній сторінці, щоб ви бачили лінії розрізу. +5. Перемикайтеся між сторінками, щоб перевірити сітку на різних сторінках. +6. Натисніть кнопку обробки. Кожна клітинка сітки стане окремою сторінкою у вихідному PDF. + +## Можливості + +- Налаштовувана кількість рядків і стовпців для гнучких розмірів сітки +- Попередній перегляд у реальному часі з накладеною сіткою, що точно показує, де сторінки будуть розділені +- Фільтр діапазону сторінок для постеризації лише певних сторінок +- Посторінкова навігація в попередньому перегляді +- Кешовані знімки сторінок для швидкої навігації в попередньому перегляді +- Червоні пунктирні лінії сітки чітко позначають межі розрізу + +## Параметри + +| Параметр | Опис | +| --------------------- | ------------------------------------------------------ | +| **Рядки** | Кількість горизонтальних поділів (за замовчуванням: 1) | +| **Стовпці** | Кількість вертикальних поділів (за замовчуванням: 1) | +| **Діапазон сторінок** | Які сторінки постеризувати (порожньо = усі сторінки) | + +## Сценарії використання + +- Друк PDF розміром з постер на стандартних аркушах A4 або Letter для збирання на стіні +- Створення великих банерів з одностороннього PDF-макета +- Розділення завеликих технічних креслень на придатні для друку фрагменти +- Великоформатний друк без доступу до широкоформатного принтера + +## Поради + +- Сітка 2x2 перетворює одну сторінку на 4 сторінки. Сітка 3x3 перетворює одну сторінку на 9. Плануйте сітку залежно від того, наскільки великим має бути зібраний результат. +- Накладена сітка в попередньому перегляді допомагає переконатися, що важливий вміст не потрапляє на лінію розрізу. За потреби змініть кількість рядків і стовпців. +- Для зворотної операції (розміщення кількох сторінок на одному аркуші) скористайтеся [N-Up PDF](./n-up-pdf). + +## Пов’язані інструменти + +- [N-Up PDF](./n-up-pdf) +- [Розділити сторінки](./divide-pages) +- [Розділити PDF](./split-pdf) diff --git a/docs/uk/tools/powerpoint-to-pdf.md b/docs/uk/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..609d1091 --- /dev/null +++ b/docs/uk/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint у PDF +description: Конвертуйте презентації PowerPoint (PPT, PPTX) і файли ODP у PDF зі збереженням форматування слайдів. +--- + +# PowerPoint у PDF + +Конвертуйте файли презентацій у PDF. Кожен слайд стає сторінкою вихідного документа, а текст, зображення, фігури та переходи відтворюються через рушій LibreOffice, що працює в браузері. Підтримуються як сучасні, так і застарілі формати PowerPoint, а також формат OpenDocument Presentation. + +## Підтримувані формати + +| Формат | Розширення | +| :------------------------ | :--------- | +| PowerPoint (сучасний) | `.pptx` | +| PowerPoint (застарілий) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли презентацій. +2. Перегляньте список файлів. Додайте інші або видаліть зайві. +3. Натисніть **Конвертувати в PDF**. Рушій LibreOffice завантажується під час першого використання, потім конвертує кожен файл. +4. Один файл завантажується одразу як PDF. Кілька файлів пакуються в `powerpoint-converted.zip`. + +## Параметри + +Цей інструмент не має додаткових налаштувань. Слайди відтворюються у своїх початкових розмірах. + +## Результат + +| Кількість вхідних файлів | Результат | +| :----------------------- | :----------------------------------------------------------------- | +| 1 файл | Одне завантаження PDF (початкова назва файлу з розширенням `.pdf`) | +| 2+ файли | Архів ZIP (`powerpoint-converted.zip`) з одним PDF на кожен файл | + +## Сценарії використання + +- Конвертація презентації в PDF перед відправкою аудиторії, яка може не мати PowerPoint +- Створення версії слайдів для друку як роздатковий матеріал для конференції чи воркшопу +- Архівування презентацій у форматі, що однаково відображається на кожному пристрої +- Пакетна конвертація бібліотеки презентацій ODP з LibreOffice Impress у PDF +- Створення PDF-версії pitch deck для вкладення в електронний лист + +## Поради + +- Анімації та переходи слайдів у PDF не передаються. Кожен слайд зберігається як статична сторінка. +- Вбудовані відео у вихідному файлі не відображатимуться. За потреби замініть їх знімком екрана або зображенням-заповнювачем. +- Нотатки доповідача не входять до стандартного експорту в PDF. Якщо нотатки потрібні, спершу експортуйте з власного режиму «Друк нотаток» у PowerPoint. +- Рушій LibreOffice кешується після першого завантаження, тому конвертація другої презентації в тому ж сеансі набагато швидша. + +## Пов’язані інструменти + +- [Word у PDF](./word-to-pdf) +- [Excel у PDF](./excel-to-pdf) +- [Зображення у PDF](./image-to-pdf) diff --git a/docs/uk/tools/prepare-pdf-for-ai.md b/docs/uk/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..682cebc6 --- /dev/null +++ b/docs/uk/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Підготовка PDF для AI +description: Витягніть вміст PDF у структурований JSON, оптимізований для LLM і AI-конвеєрів, як-от LlamaIndex. Підтримує пакетну обробку. +--- + +# Підготовка PDF для AI + +Витягує вміст із файлів PDF і структурує його як JSON, оптимізований для споживання великими мовними моделями (LLM) і AI-фреймворками, як-от LlamaIndex. Вміст кожної сторінки витягується й організовується у структурований формат, готовий для конвеєрів RAG, чат-ботів або систем семантичного пошуку. + +## Як це працює + +1. Завантажте один або кілька PDF, натиснувши зону перетягування або перетягнувши файли на неї. +2. Натисніть **Витягти**, щоб почати обробку. +3. Один файл завантажується як `filename_llm.json`. Кілька файлів дають архів `pdf-for-ai.zip`. + +Інструмент використовує інтеграцію PyMuPDF з LlamaIndex, щоб витягти вміст на рівні сторінок з метаданими, отримуючи результат, який можна напряму завантажувати в AI-фреймворки. + +## Параметри + +Цей інструмент не має налаштовуваних параметрів. Усі сторінки витягуються з повним текстом і метаданими. + +## Формат результату + +- **Один файл**: `filename_llm.json` +- **Кілька файлів**: `pdf-for-ai.zip` з одним `_llm.json` на кожен вхідний PDF. + +JSON-результат відповідає схемі документів LlamaIndex з текстовим вмістом кожної сторінки та полями метаданих. + +## Сценарії використання + +- Підготовка документів PDF для конвеєрів генерації з доповненням пошуком (RAG). +- Створення бази знань з пошуком з архівів PDF для AI-чат-бота. +- Передача звітів PDF в аналітичні процеси на основі LLM. +- Попередня обробка наукових статей для семантичного пошуку та систем «питання-відповідь». +- Створення структурованих навчальних даних із колекцій документів PDF. + +## Поради + +- Для вилучення простого тексту без AI-специфічного форматування скористайтеся [PDF у текст](./pdf-to-text). +- Для виводу в Markdown зі збереженням заголовків і структури скористайтеся [PDF у Markdown](./pdf-to-markdown). +- Скановані PDF дадуть порожній або мінімальний результат. Спершу пропустіть їх через OCR, щоб додати текстовий шар перед вилученням. + +## Пов’язані інструменти + +- [PDF у текст](./pdf-to-text) +- [PDF у Markdown](./pdf-to-markdown) +- [PDF у JSON](./pdf-to-json) diff --git a/docs/uk/tools/protect-pdf.md b/docs/uk/tools/protect-pdf.md new file mode 100644 index 00000000..c1ca3078 --- /dev/null +++ b/docs/uk/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Захистити PDF +description: Захистіть файли PDF паролем із 256-бітним шифруванням AES. Задайте паролі користувача й власника з налаштовуваними обмеженнями використання. +--- + +# Захистити PDF + +Заблокуйте PDF паролем, щоб відкрити його могли лише уповноважені люди. BentoPDF використовує 256-бітне шифрування AES, той самий стандарт, що й банки та державні установи, і застосовує його повністю у вашому браузері через QPDF. + +## Як це працює + +1. Завантажте файл PDF. +2. Введіть **Пароль користувача** (обов’язково). Цей пароль потрібен, щоб відкрити файл. +3. За потреби введіть **Пароль власника**. Якщо його задано, PDF отримує обмеження використання, що забороняють друк, редагування, копіювання та анотування. +4. Натисніть **Зашифрувати PDF**. +5. Завантажте зашифрований файл. + +## Типи паролів + +### Пароль користувача (обов’язковий) + +Пароль користувача вводять одержувачі, щоб відкрити PDF. Без нього документ повністю недоступний. Кожен зашифрований PDF повинен його мати. + +### Пароль власника (необов’язковий) + +Пароль власника визначає, що може робити авторизований користувач після відкриття файлу. Якщо ви задаєте окремий пароль власника, BentoPDF автоматично застосовує найсуворіший набір обмежень: + +- Зміна заборонена +- Вилучення/копіювання заборонено +- Друк заборонено +- Анотування заборонено +- Заповнення форм заборонено +- Збирання документа заборонено + +Якщо залишити пароль власника порожнім, PDF зашифровано (для відкриття все одно потрібен пароль користувача), але після відкриття обмежень використання немає. + +## Відомості про шифрування + +- **Алгоритм**: AES-256 (256-бітний Advanced Encryption Standard) +- **Довжина ключа**: 256 біт +- **Стандарт**: шифрування PDF 2.0 (реалізація QPDF) + +Підібрати ключ AES-256 перебором за сучасних технологій обчислювально неможливо. Безпека вашого зашифрованого PDF повністю залежить від надійності пароля. + +## Сценарії використання + +- Захист конфіденційних фінансових звітів перед надсиланням електронною поштою +- Захист юридичних документів, якими обмінюються з протилежною стороною +- Додавання пароля до медичних карток або персональних даних +- Розповсюдження платного вмісту (електронні книги, звіти) з контролем доступу +- Дотримання політик захисту даних, що вимагають шифрування даних у стані спокою + +## Поради + +- Використовуйте надійний унікальний пароль. Ідеальна парольна фраза має понад 12 символів з великими й малими літерами, цифрами та символами. +- Передавайте пароль окремим каналом (телефон, SMS), ніколи в тому самому листі, що й PDF. +- Якщо потрібно лише обмежити дії (без друку, без копіювання) без пароля для відкриття, скористайтеся інструментом «Змінити дозволи». + +## Пов’язані інструменти + +- [Розшифрувати PDF](./unlock-pdf): зніміть шифрування, якщо знаєте пароль +- [Змінити дозволи](./change-permissions): змініть окремі обмеження використання +- [Зняти обмеження](./remove-restrictions): приберіть усі засоби захисту з PDF +- [Очистити PDF](./sanitize-pdf): видаліть приховані дані перед шифруванням diff --git a/docs/uk/tools/psd-to-pdf.md b/docs/uk/tools/psd-to-pdf.md new file mode 100644 index 00000000..d984bbf6 --- /dev/null +++ b/docs/uk/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD у PDF +description: Конвертуйте файли Photoshop (PSD) у PDF у браузері. Безкоштовно, приватно, без програм Adobe. +--- + +# PSD у PDF + +Конвертуйте файли Adobe Photoshop PSD у документи PDF. PSD є рідним форматом Photoshop, і зазвичай для його відкриття потрібне дороге програмне забезпечення Adobe. Цей інструмент відтворює зведене (сплющене) зображення вашого файлу PSD як сторінку PDF повної роздільної здатності. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :-------------- | :--------- | :------------------------------------ | +| Adobe Photoshop | `.psd` | Відтворює зведене сплющене зображення | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли PSD. Підтримується кілька файлів. +2. Перегляньте список файлів. Видаліть зайві файли значком кошика або скористайтеся **Додати ще файли**, щоб додати інші. +3. Натисніть **Конвертувати в PDF**. Рушій PyMuPDF читає файл PSD і вбудовує зведене зображення на сторінку PDF у початковій роздільній здатності. +4. Один PSD дає один PDF. Якщо завантажити кілька файлів PSD, вони об’єднуються в один багатосторінковий PDF з назвою `psd_to_pdf.pdf`, де кожен PSD стає однією сторінкою. + +## Параметри + +Налаштування не потрібні. Конвертер використовує сплющені дані зображення з файлу PSD. + +## Сценарії використання + +- Перегляд дизайнів Photoshop без відкриття Photoshop +- Надсилання дизайнерських проєктів клієнтам, які не мають Adobe Creative Suite +- Друк ілюстрацій високої роздільної здатності з файлів PSD +- Створення PDF-портфоліо з кількох дизайнерських файлів PSD: кожен стає сторінкою єдиного документа + +## Поради + +- Під час конвертації відтворюється зведений (сплющений) вигляд PSD. Окремі шари, коригувальні шари та ефекти шарів не зберігаються в PDF як окремі елементи. +- Кілька файлів PSD об’єднуються в один багатосторінковий PDF, а не в окремі PDF. Це корисно для створення портфоліо або лукбуків. +- Файли PSD з дуже високою роздільною здатністю (друкарські файли 300+ DPI) дадуть великі PDF. Інструмент зберігає повну роздільну здатність. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [VSD у PDF](./vsd-to-pdf) diff --git a/docs/uk/tools/pub-to-pdf.md b/docs/uk/tools/pub-to-pdf.md new file mode 100644 index 00000000..8296c8bc --- /dev/null +++ b/docs/uk/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB у PDF +description: Конвертуйте файли Microsoft Publisher (PUB) у PDF у браузері. Безкоштовно, приватно, без додаткових програм. +--- + +# PUB у PDF + +Конвертуйте файли Microsoft Publisher у PDF. Publisher є настільною програмою для верстки, що входить до деяких редакцій Microsoft Office, але в більшості людей її не встановлено. Цей інструмент дозволяє будь-кому конвертувати файли PUB у PDF прямо в браузері, без програмного забезпечення Microsoft. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :------------------ | :--------- | :------------------------------- | +| Microsoft Publisher | `.pub` | Документи для настільної верстки | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли PUB. Можна завантажити кілька файлів одночасно. +2. Перегляньте список файлів. Видаліть зайві файли значком кошика або натисніть **Додати ще файли**, щоб додати інші. +3. Натисніть **Конвертувати в PDF**. У браузері завантажується рушій на основі LibreOffice і конвертує кожен файл PUB зі збереженням макета, зображень і текстових полів. +4. Один файл завантажується одразу як PDF. Кілька файлів надходять в архіві ZIP з назвою `pub-to-pdf.zip`. + +## Параметри + +Додаткове налаштування не потрібне. Конвертер автоматично обробляє макет PUB. + +## Сценарії використання + +- Відкриття флаєра чи інформаційного бюлетеня PUB від клієнта без купівлі Microsoft Publisher +- Конвертація церковних оголошень, програм заходів або шкільних бюлетенів, створених у Publisher +- Архівування маркетингових матеріалів з Publisher у загальнодоступному форматі +- Друк файлів PUB у системі, де не встановлено Publisher + +## Поради + +- Складні макети Publisher з накладеними текстовими полями та точним позиціонуванням можуть трохи зміститися під час конвертації. Перегляньте результат, якщо точне розташування критичне. +- Рушій LibreOffice ініціалізується один раз за сеанс. Перша конвертація триває довше, наступні швидші. +- Для найточнішої конвертації файлів Publisher переконайтеся, що власні шрифти з оригіналу є стандартними системними шрифтами. + +## Пов’язані інструменти + +- [VSD у PDF](./vsd-to-pdf) +- [ODP у PDF](./odp-to-pdf) diff --git a/docs/uk/tools/rasterize-pdf.md b/docs/uk/tools/rasterize-pdf.md new file mode 100644 index 00000000..828f1dc0 --- /dev/null +++ b/docs/uk/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Растеризація PDF +description: Перетворіть сторінки PDF на PDF із зображень. Сплющте всі шари, приберіть виділюваний текст і керуйте DPI та форматом зображення. +--- + +# Растеризація PDF + +Растеризація перетворює кожну сторінку PDF на зображення й збирає ці зображення назад у PDF. Результат виглядає ідентично до оригіналу, але не містить виділюваного тексту, інтерактивних елементів і редагованих шарів. Це фактично високоякісна фотокопія. + +## Як це працює + +1. Завантажте один або кілька файлів PDF. +2. Задайте **DPI** (роздільну здатність) растеризованого результату. +3. Виберіть **Формат зображення**: PNG для якості без втрат або JPEG для менших файлів. +4. За потреби позначте **Конвертувати в градації сірого**. +5. Натисніть **Растеризувати PDF**. Кілька файлів завантажуються як ZIP. + +## Параметри + +| Налаштування | Значення | За замовчуванням | +| --------------------- | ------------------------------------- | ---------------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Формат зображення** | PNG (без втрат), JPEG (менший розмір) | PNG | +| **Градації сірого** | Увімк./Вимк. | Вимк. | + +## Рекомендації щодо DPI + +- **72**: лише перегляд на екрані, найменший розмір файлу +- **150**: гарний баланс для загального використання +- **200**: чіткіший текст, помірний розмір файлу +- **300**: результат друкарської якості +- **600**: висока якість для архівування або професійного друку + +## Сценарії використання + +- Запобігання вилученню тексту з конфіденційних документів перед передаванням +- Усунення проблем із залежністю від шрифтів шляхом перетворення тексту на пікселі +- Створення «пласкої» версії PDF зі складними шарами чи прозорістю, що по-різному відображаються в різних переглядачах +- Підготовка PDF для системи, яка приймає лише вхідні дані у вигляді зображень +- Видалення прихованого вмісту (як-от відстежуваних змін чи даних форм) шляхом зведення PDF до чистих зображень + +## Поради + +- 150 DPI з PNG є надійним вибором за замовчуванням. Збільшуйте, лише якщо потрібен друк або масштабування дрібних деталей. +- JPEG дає помітно менші файли, але вносить артефакти стиснення на чітких краях тексту. +- Растеризація незворотна: збережіть оригінальний PDF, якщо вам може знадобитися редагований текст. + +## Пов’язані інструменти + +- [Стиснення PDF](./compress-pdf): зменшіть розмір растеризованого PDF +- [Вирівнювання PDF](./deskew-pdf): вирівняйте сторінки перед растеризацією сканованих документів +- [Шрифти у контури](./font-to-outline): перетворіть шрифти на векторні контури, якщо хочете зберегти масштабованість +- [Сплющити PDF](./flatten-pdf): сплющте форми без перетворення на зображення diff --git a/docs/uk/tools/remove-annotations.md b/docs/uk/tools/remove-annotations.md new file mode 100644 index 00000000..64831bd4 --- /dev/null +++ b/docs/uk/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Видалити анотації +description: Одним кліком приберіть з PDF усі коментарі, виділення, посилання та інші анотації. +--- + +# Видалити анотації + +Очистіть PDF, видаливши всі анотації: коментарі, виділення, стікери, текстову розмітку, посилання, штампи та будь-які інші об’єкти анотацій, вбудовані в документ. Основний вміст сторінок (текст, зображення, графіка) залишається недоторканим. + +## Як це працює + +1. Завантажте файл PDF. +2. Інструмент визначає кількість сторінок документа й показує відомості про файл. +3. Натисніть **Видалити анотації** для обробки. +4. Очищений PDF автоматично завантажується без жодних анотацій. + +## Можливості + +- Видаляє всі типи анотацій: коментарі, виділення, підкреслення, закреслення, стікери, штампи, посилання та розмітку форм +- Працює з кожною сторінкою документа +- Зберігає весь вміст, що не є анотаціями (текст, зображення, векторну графіку, поля форм) +- Показує кількість сторінок і розмір файлу перед обробкою + +## Сценарії використання + +- Очищення документа перед остаточним розповсюдженням після циклу рецензування, коли кілька рецензентів додали коментарі +- Видалення виділень і стікерів зі спільного навчального посібника +- Видалення анотацій-посилань із документа перед архівуванням +- Підготовка «чистої» версії юридичного документа, який було рясно анотовано під час переговорів +- Видалення коментарів рецензентів із рукопису перед відправкою на друк + +## Поради + +- Цей інструмент видаляє анотації на рівні структури PDF, тому результат зберігає виділюваний текст і початкову якість, без растеризації. +- Якщо потрібно видалити лише окремі анотації, а не всі, скористайтеся [Редактором PDF](./edit-pdf) для вибіркового видалення окремих анотацій. +- Анотації у сплющених PDF (де анотації злито з вмістом сторінки) видалити неможливо, оскільки вони вже не є окремими об’єктами. + +## Пов’язані інструменти + +- [Редактор PDF](./edit-pdf) +- [Додати водяний знак](./add-watermark) +- [Підписати PDF](./sign-pdf) diff --git a/docs/uk/tools/remove-blank-pages.md b/docs/uk/tools/remove-blank-pages.md new file mode 100644 index 00000000..caff9aba --- /dev/null +++ b/docs/uk/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Видалити порожні сторінки +description: Автоматично виявляйте й видаляйте порожні або майже порожні сторінки з PDF з регульованою чутливістю. +--- + +# Видалити порожні сторінки + +Проскануйте PDF на наявність порожніх або майже порожніх сторінок і видаліть їх автоматично. Інструмент відтворює кожну сторінку та аналізує її пікселі, щоб визначити, чи вона порожня, а потім дозволяє підтвердити, які сторінки видалити, перед обробкою. + +## Як це працює + +1. Завантажте файл PDF. +2. Налаштуйте повзунок **Чутливість**, щоб керувати суворістю визначення «порожньої» сторінки. +3. Натисніть **Знайти порожні сторінки**, щоб просканувати документ. +4. Інструмент показує мініатюри виявлених порожніх сторінок, щоб ви могли їх переглянути. +5. Підтвердьте вибір і завантажте очищений PDF без порожніх сторінок. + +## Параметри + +- **Чутливість**: повзунок від 0% до 100% (за замовчуванням 80%). Вищі значення суворіші й позначають лише повністю або майже білі сторінки. Нижчі значення поблажливіші й ловлять сторінки з мінімальним вмістом, як-от одна крапка чи ледь помітний водяний знак. + +## Можливості + +- Піксельний аналіз кожної сторінки для виявлення порожнього вмісту +- Регульований повзунок чутливості для точного налаштування виявлення +- Попередній перегляд мініатюр виявлених порожніх сторінок для ручної перевірки +- Зберігає всі непорожні сторінки без змін +- Працює з документами будь-якого розміру та кількості сторінок +- Індикація прогресу під час сканування + +## Сценарії використання + +- Очищення сканованих документів, де сканер захопив порожні зворотні боки односторонніх оригіналів +- Видалення роздільних сторінок з пакетів документів, відсканованих масово +- Видалення порожніх сторінок, вставлених системами керування документами +- Очищення PDF, експортованих з текстових процесорів, які іноді додають порожні сторінки в кінці +- Зменшення розміру файлу шляхом видалення непотрібних порожніх сторінок + +## Поради + +- Почніть зі стандартної чутливості 80% і коригуйте звідти. Якщо інструмент пропускає сторінки, які вам здаються порожніми, зменште чутливість. Якщо він позначає сторінки з легким вмістом, який ви хочете залишити, збільште її. +- Інструмент відтворює кожну сторінку для аналізу вмісту, тому час обробки залежить від кількості сторінок. Для дуже великих документів доведеться трохи зачекати. +- Перегляньте виявлені порожні сторінки в мініатюрах перед підтвердженням видалення. Сторінки зі слабкими колонтитулами чи водяними знаками можуть бути позначені залежно від налаштувань чутливості. + +## Пов’язані інструменти + +- [Обрізати PDF](./crop-pdf) +- [Редактор PDF](./edit-pdf) +- [Нумерація сторінок](./page-numbers) diff --git a/docs/uk/tools/remove-metadata.md b/docs/uk/tools/remove-metadata.md new file mode 100644 index 00000000..cc2aeb10 --- /dev/null +++ b/docs/uk/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Видалити метадані +description: Приберіть з файлів PDF усі приховані метадані, зокрема автора, назву, дату створення, програму-виробник, дані XMP та ідентифікатори документа. +--- + +# Видалити метадані + +Кожен PDF містить метадані, які можуть розкрити, хто його створив, яке програмне забезпечення використовувалося, коли його востаннє змінювали, тощо. Цей інструмент прибирає все: словник інформації, потоки метаданих XMP, ідентифікатори документа та дані, специфічні для програм. У результаті ви отримуєте чистий документ без жодних слідів походження. + +## Як це працює + +1. Завантажте файл PDF. +2. Натисніть **Видалити метадані**. +3. Завантажте очищений файл. + +Налаштовувати нічого не потрібно. Інструмент ретельний за задумом: він очищає все. + +## Що видаляється + +- **Поля словника інформації**: назва, автор, тема, ключові слова, творець, виробник, дата створення, дата зміни +- **Потік метаданих XMP**: XML-блок метаданих, що зберігається в каталозі документа +- **Ідентифікатори документа**: унікальні ідентифікатори в трейлері PDF, за якими документ можна відстежувати між системами +- **PieceInfo**: метадані, специфічні для програм, додані такими програмами, як Illustrator або InDesign + +## Що залишається + +- Увесь видимий вміст сторінок (текст, зображення, графіка) +- Поля форм і анотації +- Закладки та посилання +- Сама структура документа + +## Сценарії використання + +- Видалення вашого імені й назви організації з документа перед анонімною публікацією +- Видалення часових позначок створення, що розкривають, коли документ було підготовлено +- Очищення рядків виробника, що вказують на ваш набір програм для PDF +- Підготовка документів для регуляторних подань, які вимагають PDF без метаданих +- Видалення слідів історії редагування перед передаванням документа зовні + +## Поради + +- Спершу скористайтеся інструментом «Перегляд метаданих», щоб побачити, які саме метадані містить ваш PDF, перш ніж їх видаляти. +- Якщо потрібно видалити метадані _та_ JavaScript, анотації й вбудовані файли, скористайтеся «Очистити PDF» для ґрунтовнішого очищення. +- Видалення метаданих незворотне. Збережіть оригінал, якщо ці дані можуть знадобитися пізніше. + +## Пов’язані інструменти + +- [Очистити PDF](./sanitize-pdf): видаліть метадані, а також скрипти, вкладення та інше +- [Зашифрувати PDF](./protect-pdf): захистіть очищений PDF паролем +- [Стиснення PDF](./compress-pdf): видалення метаданих може трохи зменшити розмір файлу; стисніть для більшої економії diff --git a/docs/uk/tools/remove-restrictions.md b/docs/uk/tools/remove-restrictions.md new file mode 100644 index 00000000..592f3301 --- /dev/null +++ b/docs/uk/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Зняти обмеження +description: Зніміть захист паролем, заборони друку, блокування редагування та обмеження копіювання з файлів PDF. +--- + +# Зняти обмеження + +PDF можуть мати паролі двох типів: пароль користувача (потрібен, щоб відкрити файл) і пароль власника (керує тим, що можна робити з файлом). Цей інструмент знімає обидва, а також усі пов’язані обмеження: друк, редагування, копіювання та блокування анотацій. + +## Як це працює + +1. Завантажте файл PDF. +2. Якщо PDF має пароль власника, введіть його в поле **Пароль власника**. Залиште поле порожнім, якщо PDF має лише обмеження використання без пароля. +3. Натисніть **Зняти обмеження**. +4. Завантажте PDF без обмежень. + +Інструмент використовує прапорці QPDF `--decrypt` і `--remove-restrictions`, щоб створити чисту копію без обмежень. + +## Що видаляється + +- Захист паролем (і пароль користувача, і пароль власника) +- Обмеження друку +- Обмеження редагування +- Обмеження копіювання тексту й зображень +- Обмеження анотування та коментування +- Усі інші обмеження безпеки, закодовані в PDF + +## Сценарії використання + +- Розблокування PDF, який вам належить, але пароль до якого ви встановили багато років тому +- Зняття заборони друку з документа, до якого ви маєте законний доступ +- Увімкнення копіювання та вставлення в довідкових матеріалах для конспектування +- Підготовка PDF для інструментів доступності, які не можуть працювати з обмеженими документами + +## Поради + +- Якщо пароль власника встановлено, ви повинні його знати. Цей інструмент не зламує й не підбирає паролі. +- Якщо потрібно залишити файл зашифрованим, але змінити певні дозволи, скористайтеся інструментом «Змінити дозволи». +- Вихідний файл зовсім не зашифрований: будь-хто, хто його отримає, може вільно його відкрити. + +## Пов’язані інструменти + +- [Розшифрувати PDF](./unlock-pdf): розблокуйте PDF, якщо знаєте пароль користувача +- [Зашифрувати PDF](./protect-pdf): знову застосуйте шифрування з новими налаштуваннями +- [Змінити дозволи](./change-permissions): вибірково змініть, які дії дозволені diff --git a/docs/uk/tools/repair-pdf.md b/docs/uk/tools/repair-pdf.md new file mode 100644 index 00000000..729d102c --- /dev/null +++ b/docs/uk/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Відновити PDF +description: Відновіть дані з пошкоджених файлів PDF за допомогою рушія відновлення QPDF. Підтримує пакетну обробку. +--- + +# Відновити PDF + +Коли PDF не відкривається, показує спотворений вміст або викликає помилки у вашому переглядачі, цей інструмент намагається перебудувати його внутрішню структуру. Він використовує рушій відновлення QPDF, який може відновити дані за багатьох видів пошкоджень: зламаних таблиць перехресних посилань, обрізаних потоків, недійсних посилань на об’єкти тощо. + +## Як це працює + +1. Завантажте один або кілька пошкоджених файлів PDF. +2. Натисніть **Відновити PDF**. +3. Один відновлений файл завантажується одразу. Кілька файлів дають архів ZIP. + +Інструмент пропускає кожен файл через QPDF з прапорцем `--decrypt`, що змушує QPDF прочитати й переписати всю структуру PDF, виправляючи по дорозі відновлювані проблеми. + +## Можливості + +- Пакетне відновлення кількох PDF в одній операції +- Автоматичне визначення відновлюваних і невідновлюваних файлів +- Звіт про успіх/невдачу для кожного файлу під час обробки кількох файлів +- Використовує QPDF (WebAssembly), перевірену часом бібліотеку перетворення PDF + +## Що можна виправити + +- Зламані або відсутні таблиці перехресних посилань +- Обрізані кінці файлів через неповне завантаження +- Недійсну нумерацію об’єктів і довжини потоків +- Незначні структурні невідповідності від помилкових генераторів PDF +- Артефакти шифрування від невдалих спроб розшифрування + +## Що виправити неможливо + +- Сильно обрізані файли, де відсутня більшість даних вмісту +- PDF, зашифровані паролем, якого ви не маєте +- Файли, які насправді не є PDF (неправильне розширення) +- Пошкодження зображень усередині PDF (структуру виправлено, але піксельні дані не відтворюються) + +## Сценарії використання + +- Відновлення PDF після невдалого завантаження з пошти +- Відкриття файлів, створених застарілими або нестандартними генераторами PDF +- Виправлення PDF, що працюють в одному переглядачі, але не в іншому +- Підготовка пошкоджених архівних документів до довгострокового зберігання + +## Поради + +- Якщо відновлення не вдалося, спробуйте спершу відкрити файл у браузері: браузери мають власну логіку відновлення й можуть відобразити достатньо вмісту, щоб його можна було зберегти повторно. +- Для зашифрованих PDF, які не вдалося відновити, спершу спробуйте «Розшифрувати PDF», а потім відновіть розшифрований результат. + +## Пов’язані інструменти + +- [Стиснення PDF](./compress-pdf): додатково очистіть структуру відновленого PDF +- [Лінеаризація PDF](./linearize-pdf): оптимізуйте відновлений файл для доставки через вебмережу +- [Сплющити PDF](./flatten-pdf): сплющте форми, які могли бути пошкоджені diff --git a/docs/uk/tools/reverse-pages.md b/docs/uk/tools/reverse-pages.md new file mode 100644 index 00000000..269ea939 --- /dev/null +++ b/docs/uk/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Зворотний порядок сторінок +description: Змініть порядок сторінок в одному або кількох файлах PDF на зворотний, щоб остання сторінка стала першою. +--- + +# Зворотний порядок сторінок + +Змініть порядок сторінок PDF на зворотний: остання сторінка стає першою, передостання другою тощо. Підтримується пакетна обробка кількох файлів одночасно. + +## Як це працює + +1. Завантажте один або кілька файлів PDF. +2. Натисніть кнопку обробки. +3. Кожен файл обробляється окремо. Якщо ви завантажили кілька файлів, результатом буде архів ZIP з усіма перевернутими PDF. +4. Один файл завантажується одразу як PDF зі зворотним порядком сторінок. + +## Можливості + +- Пакетна обробка: зворотний порядок для кількох PDF в одній операції +- Окремий файл для одного PDF, архів ZIP для кількох +- Кнопки видалення окремих файлів перед обробкою +- Зберігає весь вміст сторінок і форматування + +## Сценарії використання + +- Виправлення документа, відсканованого у зворотному порядку +- Підготовка PDF-презентації для читання з кінця до початку +- Зворотний порядок сторінок для певних процесів друку, що подають сторінки у зворотному порядку +- Виправлення документа, у якому сторінки випадково зібрано навпаки + +## Поради + +- Кожен файл у пакеті обробляється окремо: самі файли не змінюють порядок відносно один одного. +- Для детальнішого перевпорядкування сторінок (а не лише повного розвороту) скористайтеся [Дублювати та впорядкувати](./organize-pdf). + +## Пов’язані інструменти + +- [Дублювати та впорядкувати](./organize-pdf) +- [Повернути PDF](./rotate-pdf) +- [PDF мультиінструмент](./pdf-multi-tool) diff --git a/docs/uk/tools/rotate-custom.md b/docs/uk/tools/rotate-custom.md new file mode 100644 index 00000000..a05784f9 --- /dev/null +++ b/docs/uk/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Повернути на довільний кут +description: Повертайте сторінки PDF на будь-який кут за допомогою полів введення градусів для кожної сторінки та пакетного керування поворотом. +--- + +# Повернути на довільний кут + +Повертайте сторінки PDF на будь-який довільний кут, а не лише кратний 90 градусам. Кожна сторінка має власне поле для кута, а один кут можна застосувати до всіх сторінок одразу за допомогою пакетного керування. + +## Як це працює + +1. Завантажте файл PDF. Для кожної сторінки відображаються мініатюри. +2. Кожна сторінка має числове поле введення, що показує її поточний кут повороту. +3. Введіть будь-яке значення в градусах (додатне або від’ємне), щоб повернути певну сторінку, або скористайтеся кнопками вліво/вправо для кожної сторінки для швидких поворотів на 90 градусів. +4. Скористайтеся полем **пакетного кута** вгорі, щоб задати однаковий поворот для всіх сторінок. +5. Натисніть кнопку обробки, щоб створити повернутий PDF. + +## Можливості + +- Довільне введення градусів для кожної сторінки (будь-яке ціле значення) +- Пакетне керування кутом для задання однакового повороту на кожній сторінці +- Попередній перегляд повороту в мініатюрах у реальному часі +- Кнопки швидкого повороту для кожної сторінки з кроком 90 градусів +- Відкладене завантаження мініатюр для продуктивності на великих документах + +## Сценарії використання + +- Виправлення трохи нахилених сканів на кілька градусів +- Поворот сторінок відповідно до нестандартної вимоги щодо орієнтації +- Точне повертання окремих сторінок у документі зі змішаним вмістом +- Точне підлаштування кутів сторінок після початкового масового повороту + +## Поради + +- Додатні значення повертають за годинниковою стрілкою, від’ємні проти годинникової стрілки. +- Поле пакетного кута перезаписує всі кути окремих сторінок після застосування. За потреби задайте індивідуальні коригування після пакетної операції. +- Для стандартних поворотів на 90/180/270 градусів із простішим інтерфейсом скористайтеся [Повернути PDF](./rotate-pdf). + +## Пов’язані інструменти + +- [Повернути PDF](./rotate-pdf) +- [PDF мультиінструмент](./pdf-multi-tool) +- [Дублювати та впорядкувати](./organize-pdf) diff --git a/docs/uk/tools/rotate-pdf.md b/docs/uk/tools/rotate-pdf.md new file mode 100644 index 00000000..e75beb29 --- /dev/null +++ b/docs/uk/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Повернути PDF +description: Повертайте окремі сторінки або всі сторінки PDF з кроком 90 градусів за допомогою візуального інтерфейсу з мініатюрами. +--- + +# Повернути PDF + +Повертайте сторінки PDF на 90 градусів за годинниковою стрілкою або проти неї. Інструмент показує мініатюри всіх сторінок, дозволяючи повертати їх окремо або застосувати масовий поворот до всього документа. + +## Як це працює + +1. Завантажте файл PDF. Мініатюри всіх сторінок відображаються в сітці. +2. Скористайтеся кнопками повороту вліво/вправо під мініатюрою сторінки, щоб повернути саме цю сторінку. +3. Скористайтеся елементами масового повороту вгорі, щоб повернути всі сторінки одразу. +4. Попередній перегляд мініатюр оновлюється в реальному часі, показуючи поворот. +5. Натисніть кнопку обробки, щоб зберегти повернутий PDF. + +## Можливості + +- Поворот окремих сторінок з кроком 90 градусів (вліво або вправо) +- Масовий поворот усіх сторінок одночасно +- Попередній перегляд мініатюр у реальному часі з анімованими переходами повороту +- Відкладене завантаження мініатюр для плавної роботи на великих документах +- Зберігає початковий вміст сторінок і якість + +## Сценарії використання + +- Виправлення сканованих сторінок, що лежать на боці або догори дном +- Поворот альбомних сторінок у книжкову орієнтацію (або навпаки) +- Виправлення документа зі змішаною орієнтацією, де деякі сторінки було відскановано під неправильним кутом +- Підготовка документа для певної орієнтації відображення + +## Поради + +- Повороти накопичуються. Двічі натиснувши кнопку за годинниковою стрілкою, ви застосуєте поворот на 180 градусів. +- Для поворотів не на 90 градусів (наприклад, на 45 градусів, щоб виправити трохи нахилений скан) скористайтеся [Повернути на довільний кут](./rotate-custom). +- Елементи масового повороту впливають на всі сторінки, а не лише на вибрані. У цьому інструменті немає механізму вибору: для цього скористайтеся [PDF мультиінструмент](./pdf-multi-tool). + +## Пов’язані інструменти + +- [Повернути на довільний кут](./rotate-custom) +- [PDF мультиінструмент](./pdf-multi-tool) +- [Дублювати та впорядкувати](./organize-pdf) diff --git a/docs/uk/tools/rtf-to-pdf.md b/docs/uk/tools/rtf-to-pdf.md new file mode 100644 index 00000000..ed44f69e --- /dev/null +++ b/docs/uk/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF у PDF +description: Конвертуйте файли Rich Text Format (RTF) у PDF у браузері за допомогою рушія на основі LibreOffice. +--- + +# RTF у PDF + +Конвертуйте документи Rich Text Format у PDF. RTF є міжплатформним форматом документів, який підтримує практично кожен текстовий процесор. Цей інструмент використовує рушій LibreOffice у браузері, щоб відтворити файли RTF із збереженням форматування: напівжирний шрифт, курсив, таблиці та вбудовані зображення переносяться в PDF. + +## Підтримувані формати + +| Формат | Розширення | Типи MIME | +| :----- | :--------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть один чи кілька файлів RTF. +2. Перегляньте список файлів. Додайте інші або видаліть зайві. +3. Натисніть **Конвертувати в PDF**. Рушій LibreOffice ініціалізується під час першого використання, потім обробляє кожен файл. +4. Один файл завантажується одразу як PDF. Кілька файлів надходять як `rtf-converted.zip`. + +## Параметри + +Цей інструмент не має додаткових налаштувань. Конвертація зберігає початкове форматування RTF. + +## Результат + +| Кількість вхідних файлів | Результат | +| :----------------------- | :-------------------------------------------------------- | +| 1 файл | Одне завантаження PDF (наприклад, `letter.pdf`) | +| 2+ файли | Архів ZIP (`rtf-converted.zip`) з одним PDF на кожен файл | + +## Сценарії використання + +- Конвертація застарілих документів RTF зі старих текстових процесорів у сучасні PDF +- Перетворення шаблонів електронних листів RTF на попередній перегляд у PDF +- Обробка виводу RTF із юридичних або медичних програмних систем +- Пакетна конвертація файлів RTF із системи керування документами в PDF для архівування + +## Поради + +- Рушій LibreOffice завантажується один раз і кешується. Перша конвертація в сеансі триває на кілька секунд довше, наступні швидші. +- Файли RTF із вбудованими об’єктами OLE можуть відображати не всі об’єкти ідеально. Простий текст, зображення та стандартне форматування конвертуються надійно. +- Якщо ваші файли RTF створено в Microsoft Word, їх також можна конвертувати безпосередньо інструментом [Word у PDF](./word-to-pdf), який приймає RTF поряд з DOC і DOCX. + +## Пов’язані інструменти + +- [Word у PDF](./word-to-pdf) +- [ODT у PDF](./odt-to-pdf) +- [Текст у PDF](./txt-to-pdf) diff --git a/docs/uk/tools/sanitize-pdf.md b/docs/uk/tools/sanitize-pdf.md new file mode 100644 index 00000000..d062b9c3 --- /dev/null +++ b/docs/uk/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Очистити PDF +description: Видаліть з PDF прихований і потенційно небезпечний вміст, зокрема метадані, JavaScript, вбудовані файли, анотації та шари. +--- + +# Очистити PDF + +PDF можуть містити набагато більше, ніж ви бачите на екрані. Приховані метадані, вбудований JavaScript, вкладені файли, дані форм та інформація про шари можуть розкрити конфіденційні дані або становити загрозу безпеці. Очищення прибирає все це, залишаючи чистий документ, безпечний для публічного поширення. + +## Як це працює + +1. Завантажте файл PDF. +2. Виберіть у списку, які елементи видалити. +3. Натисніть **Очистити PDF**. +4. Завантажте очищений файл. + +## Параметри очищення + +Усі параметри ввімкнено за замовчуванням. Зніміть позначку з тих, які хочете зберегти. + +| Параметр | Що видаляється | +| ----------------------------- | -------------------------------------------------------------------------- | +| **Сплющити форми** | Перетворює інтерактивні поля форм на статичний вміст | +| **Видалити метадані** | Прибирає автора, назву, дату створення, відомості про програму та дані XMP | +| **Видалити анотації** | Видаляє коментарі, виділення, стікери та розмітку | +| **Видалити JavaScript** | Усуває вбудовані скрипти, які можуть виконатися під час відкриття | +| **Видалити вбудовані файли** | Прибирає вкладені файли, вбудовані в PDF | +| **Видалити шари (OCG)** | Зводить групи необов’язкового вмісту в один шар | +| **Видалити посилання** | Прибирає гіперпосилання та посилання на URL | +| **Видалити дерево структури** | Видаляє структуру документа, яку використовують для тегування доступності | +| **Видалити MarkInfo** | Прибирає інформацію про позначений вміст | +| **Видалити шрифти** | Видаляє дані вбудованих шрифтів (використовуйте обережно) | + +## Сценарії використання + +- Підготовка PDF до публічного випуску шляхом видалення внутрішніх метаданих (імена авторів, версії програм, історія редагування) +- Видалення JavaScript із PDF, отриманого з ненадійного джерела, перед його відкриттям +- Очищення PDF перед відправкою клієнту, який не повинен бачити вбудовані коментарі чи назви полів форм +- Видалення прихованих шарів з архітектурного креслення перед поширенням остаточної версії +- Дотримання вимог мінімізації даних відповідно до нормативів із конфіденційності + +## Поради + +- Не позначайте «Видалити вбудовані шрифти», якщо не впевнені, що PDF і далі відображатиметься правильно. Видалення шрифтів може зробити текст невидимим у деяких переглядачах. +- Якщо потрібно видалити лише метадані, спеціальний інструмент «Видалити метадані» швидший і більш цілеспрямований. +- Очищення незворотне. Збережіть оригінальний файл. + +## Пов’язані інструменти + +- [Видалити метадані](./remove-metadata): видаліть лише метадані, не торкаючись іншого вмісту +- [Сплющити PDF](./flatten-pdf): сплющте саме форми й анотації +- [Зашифрувати PDF](./protect-pdf): додайте захист паролем після очищення +- [Растеризація PDF](./rasterize-pdf): радикальний варіант: перетворіть на зображення, щоб усунути весь прихований вміст diff --git a/docs/uk/tools/scanner-effect.md b/docs/uk/tools/scanner-effect.md new file mode 100644 index 00000000..02f2e1ec --- /dev/null +++ b/docs/uk/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Ефект сканера +description: Зробіть так, щоб ваш PDF виглядав як відсканований документ, із регульованими шумом, поворотом, розмиттям і ефектами старіння паперу. +--- + +# Ефект сканера + +Перетворіть чистий цифровий PDF на документ, що виглядає так, ніби він вийшов із планшетного сканера. Інструмент застосовує налаштовувані шум, невеликий поворот, розмиття, зміни яскравості та за бажанням пожовтіння, щоб імітувати недосконалості фізичного сканування. + +## Як це працює + +1. Завантажте файл PDF. +2. Відкривається редактор із попереднім переглядом першої сторінки в реальному часі поряд із панеллю налаштувань. +3. Налаштуйте параметри ефекту сканування повзунками та перемикачами. +4. Попередній перегляд оновлюється в реальному часі під час зміни налаштувань. +5. Натисніть **Застосувати**, щоб обробити всі сторінки й завантажити результат. + +## Параметри + +- **Колірний простір (перемикач градацій сірого)**: конвертуйте результат у градації сірого для класичного чорно-білого вигляду скану. +- **Рамка**: додайте ледь помітну темну рамку по краях сторінки, щоб імітувати артефакти країв сканера. +- **Поворот**: застосуйте невеликий поворот (від -5 до +5 градусів), щоб імітувати перекошену подачу паперу. +- **Варіація повороту**: додайте випадкову варіацію кута повороту, щоб кожна сторінка була нахилена трохи по-іншому. +- **Яскравість**: змістіть загальну яскравість вгору або вниз. +- **Контраст**: налаштуйте контраст, щоб імітувати відмінності якості тонера. +- **Розмиття**: застосуйте розмиття за Гауссом, щоб пом’якшити краї тексту, як у скані низької якості. +- **Шум**: додайте випадковий піксельний шум, щоб імітувати зернистість сенсора сканера. Вищі значення дають зернистіший результат. +- **Жовтуватість**: додайте теплий жовтий відтінок, щоб імітувати старий або перероблений папір. +- **Роздільна здатність**: задайте DPI результату. Нижчі значення створюють піксельніший вигляд, схожий на скан. +- **Скинути**: поверніть усі налаштування до значень за замовчуванням. + +## Можливості + +- Попередній перегляд у реальному часі, що оновлюється під час зміни кожного параметра +- Випадкова варіація повороту для кожної сторінки для реалістичної різноманітності +- Десять параметрів, що налаштовуються незалежно +- Режим градацій сірого для автентичного чорно-білого результату +- Керування роздільною здатністю від якості факсу з низьким DPI до архівної якості з високим DPI + +## Сценарії використання + +- Створення враження, що цифрові документи було відскановано та надруковано +- Імітація фізичного старіння документів для відтворення історичних документів +- Тестування програм OCR на погіршеній якості скану +- Створення документів, що відповідають візуальному стилю наявних сканованих архівів + +## Поради + +- Починайте з м’яких значень. Рівень шуму 10-20, невеликий поворот 0,5 градуса та мінімальне розмиття вже дають переконливий вигляд скану. +- Поєднайте режим градацій сірого з легким пожовтінням для ефекту «ксерокопії ксерокопії». +- Нижчі значення роздільної здатності (100-150 DPI) створюють найреалістичніший вигляд факсу. + +## Пов’язані інструменти + +- [Інвертувати кольори](./invert-colors) +- [Корекція кольору](./adjust-colors) +- [Колір фону](./background-color) diff --git a/docs/uk/tools/sign-pdf.md b/docs/uk/tools/sign-pdf.md new file mode 100644 index 00000000..a492d867 --- /dev/null +++ b/docs/uk/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Підписати PDF +description: Намалюйте, введіть або завантажте підпис і розмістіть його на сторінках PDF за допомогою вбудованого переглядача. +--- + +# Підписати PDF + +Додайте свій підпис до будь-якого документа PDF. Інструмент містить повноцінний переглядач PDF із вбудованими засобами підпису, де можна намалювати підпис від руки, ввести ім’я шрифтом підпису або завантажити зображення підпису. Розмістіть підписи на будь-якій сторінці та змініть їх розмір, а потім збережіть підписаний документ. + +## Як це працює + +1. Завантажте файл PDF. +2. Документ відкривається у вбудованому переглядачі PDF із засобами анотування. +3. Скористайтеся інструментом підпису переглядача, щоб створити підпис: намалювати, ввести або завантажити зображення. +4. Клацніть на сторінці там, де хочете розмістити підпис, і налаштуйте його розмір і положення. +5. За потреби позначте **Сплющити PDF**, щоб остаточно вбудувати підпис у документ. +6. Натисніть **Зберегти та завантажити підписаний PDF**, щоб отримати підписаний файл. + +## Параметри + +- **Сплющити PDF**: якщо позначено, підпис остаточно вбудовується у вміст сторінки. Це не дає іншим пересунути або видалити підпис. Якщо не позначено, підпис залишається анотацією, яку можна редагувати в сумісних переглядачах. + +## Можливості + +- Три способи створення підпису: малювання від руки, введений текст або завантажене зображення +- Вбудований переглядач PDF для точного розміщення +- Перетягування для позиціонування та зміни розміру підписів на будь-якій сторінці +- Необов’язкове сплющення для остаточного вбудовування підписів +- Підтримка кількох підписів в одному документі + +## Сценарії використання + +- Підписання контрактів, угод або форм погодження перед поверненням +- Додавання підпису до податкових документів, страхових вимог або державних форм +- Проставлення ініціалів на окремих сторінках багатосторінкової угоди +- Підписання NDA чи кадрових документів, що надходять як вкладення PDF + +## Поради + +- Увімкніть сплющення, якщо надсилаєте підписаний PDF тому, хто не повинен мати змоги видалити або перемістити ваш підпис. +- Для юридично значущих цифрових підписів із перевіркою на основі сертифіката BentoPDF також пропонує окремий інструмент цифрового підпису. +- Завантажуйте зображення підпису у форматі PNG із прозорим фоном для найчистішого результату. + +## Пов’язані інструменти + +- [Редактор PDF](./edit-pdf) +- [Додати штампи](./add-stamps) +- [Заповнення форм](./form-filler) diff --git a/docs/uk/tools/split-pdf.md b/docs/uk/tools/split-pdf.md new file mode 100644 index 00000000..2a9d99bd --- /dev/null +++ b/docs/uk/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Розділити PDF +description: Розділіть PDF на менші файли за діапазоном сторінок, візуальним вибором, закладками, парними/непарними сторінками або фіксованими інтервалами. +--- + +# Розділити PDF + +Розбийте PDF на менші документи в одному з шести режимів поділу. Від простих діапазонів сторінок до поділу за закладками, цей інструмент охоплює кожен сценарій розділення документа. + +## Як це працює + +1. Завантажте один файл PDF. +2. Виберіть режим поділу зі списку. +3. Налаштуйте параметри, специфічні для режиму (діапазони сторінок, вибір тощо). +4. Натисніть кнопку обробки. +5. Результат завантажується як один PDF або архів ZIP залежно від режиму та налаштувань. + +## Режими поділу + +| Режим | Опис | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| **Діапазон** | Введіть діапазони сторінок, як-от `1-3, 5, 8-10`. Кілька діапазонів дають окремі PDF в архіві ZIP. Один діапазон дає один PDF. | +| **Візуальний вибір** | Переглядайте мініатюри сторінок і клацайте, щоб вибрати потрібні сторінки. Вибрані сторінки витягуються в новий PDF. | +| **Парні / Непарні** | Витягніть лише сторінки з парними або непарними номерами. | +| **Усі сторінки** | Розділіть кожну сторінку на окремий файл PDF, що завантажується як ZIP. | +| **Закладки** | Розділення за межами закладок. Виберіть рівень закладок, щоб керувати місцями поділу. | +| **Кожні N сторінок** | Розділіть на частини по N сторінок (наприклад, кожні 5 сторінок). Остання частина може мати менше сторінок. | + +## Можливості + +- Шість окремих режимів поділу, що охоплюють практично всі сценарії +- Візуальний вибір сторінок із відкладеним завантаженням мініатюр +- Поділ за закладками з фільтрацією за рівнем +- Варіант виводу в ZIP для режимів діапазону та візуального вибору +- Обробка діапазонів сторінок зі змішаним синтаксисом (`1-3, 5, 8-10`) +- Попередження, коли поділ на N сторінок дає нерівні частини + +## Сценарії використання + +- Витягування певного розділу чи секції з великого документа +- Розділення непарних і парних сторінок для процесів двостороннього друку +- Розбиття PDF книги на окремі файли розділів за межами закладок +- Виокремлення певних сторінок (як-от сторінки з підписом) з контракту +- Розділення зведеного звіту на файли за розділами для розповсюдження + +## Поради + +- Кілька діапазонів сторінок, розділених комами (наприклад, `1-5, 10-15, 20-25`), дають окремі PDF, по одному на діапазон, упаковані в ZIP. +- Режим поділу за закладками потребує, щоб PDF справді містив закладки. Якщо їх не знайдено, ви побачите повідомлення про помилку. +- Прапорець «Завантажити як ZIP» у режимах діапазону та візуального вибору дозволяє отримати окремі PDF для кожної сторінки замість єдиного файлу. + +## Пов’язані інструменти + +- [Об’єднати PDF](./merge-pdf) +- [Витягти сторінки](./extract-pages) +- [Видалити сторінки](./delete-pages) +- [PDF мультиінструмент](./pdf-multi-tool) diff --git a/docs/uk/tools/svg-to-pdf.md b/docs/uk/tools/svg-to-pdf.md new file mode 100644 index 00000000..d15c595c --- /dev/null +++ b/docs/uk/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG у PDF +description: Конвертуйте векторну графіку SVG у PDF з керуванням якістю повністю у вашому браузері. +--- + +# SVG у PDF + +Конвертуйте файли Scalable Vector Graphics (SVG) у PDF. Інструмент растеризує кожен SVG через рушій відтворення браузера, а потім вбудовує результат у його рідній роздільній здатності. Корисно для перетворення векторних іконок, діаграм та ілюстрацій на портативні документи. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :--------- | +| SVG | `.svg` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть один чи кілька файлів SVG. +2. Перегляньте список файлів і керуйте ним. +3. Виберіть рівень **Якості PDF**. +4. Натисніть **Конвертувати в PDF**. Результат завантажується як `from_svgs.pdf`. + +Кожен SVG зчитується як текст, відтворюється на полотні у власній ширині та висоті (за замовчуванням 800x600, якщо розміри не вказано) і експортується як PNG. Потім цей PNG вбудовується в PDF за допомогою pdf-lib. Прозорі ділянки заповнюються білим тлом. + +## Параметри + +**Якість PDF** керує стисненням після растеризації: + +- **Висока якість**: найближча до оригінального відтворення. +- **Середня якість** (за замовчуванням): гарний баланс. +- **Низька якість**: найменший файл, певна втрата деталей. + +## Сценарії використання + +- Конвертація архітектурних чи інженерних діаграм з SVG у PDF, готовий до друку +- Пакування наборів іконок у довідковий PDF для дизайн-системи +- Перетворення візуалізацій даних (D3.js, експорти бібліотек діаграм) на PDF, готові для звітів +- Створення версій для друку інфографіки на основі SVG + +## Поради + +- Файли SVG без явних атрибутів `width` і `height` відтворюються розміром 800x600 пікселів. Для найкращого результату задайте розміри у вихідному коді SVG перед конвертацією. +- Складні SVG із посиланнями на зовнішні шрифти чи пов’язані зображення можуть відтворюватися не ідеально. Вбудуйте всі ресурси в SVG для надійного результату. +- Оскільки SVG растеризується, PDF міститиме растрове зображення, а не векторні контури. Для справжнього векторного PDF потрібен спеціальний векторний інструмент. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [BMP у PDF](./bmp-to-pdf) diff --git a/docs/uk/tools/table-of-contents.md b/docs/uk/tools/table-of-contents.md new file mode 100644 index 00000000..d36f4430 --- /dev/null +++ b/docs/uk/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Зміст +description: Створіть відформатовану сторінку змісту з наявних закладок вашого PDF. +--- + +# Зміст + +Цей інструмент зчитує закладки (структуру) вашого PDF і створює відформатовану сторінку змісту, яка додається на початок документа. Якщо ваш PDF уже має закладки, але не має видимої сторінки змісту, цей інструмент створює її автоматично. + +## Як це працює + +1. Завантажте PDF, що містить закладки. +2. Налаштуйте заголовок змісту, розмір шрифту та гарнітуру. +3. За потреби позначте **Додати закладку для сторінки змісту**, щоб включити сам зміст у дерево закладок. +4. Натисніть **Створити зміст**, щоб обробити файл. +5. Оновлений PDF автоматично завантажується зі сторінкою змісту на початку. + +## Параметри + +- **Заголовок змісту**: заголовок, що відображається вгорі створеної сторінки. За замовчуванням «Зміст». +- **Розмір шрифту**: виберіть від 10 pt до 72 pt. За замовчуванням 12 pt. +- **Гарнітура шрифту**: виберіть варіанти Times Roman, Helvetica або Courier (звичайний, напівжирний, курсив, напівжирний курсив). За замовчуванням Helvetica. +- **Додати закладку для сторінки змісту**: якщо позначено, до дерева структури PDF додається закладка для самої сторінки змісту. + +## Можливості + +- Зчитує повну ієрархію закладок із PDF +- Створює чітко відформатовану сторінку змісту з посиланнями на номери сторінок +- Підтримує вкладені рівні закладок з відступами +- Вибір із 12 вбудованих шрифтів PDF +- Необов’язкова закладка на саму сторінку змісту + +## Сценарії використання + +- Додавання змісту для друку в електронні книги чи звіти, що мають лише цифрові закладки +- Створення змісту для об’єднаного документа після поєднання кількох PDF +- Створення довідкової сторінки для довгих технічних посібників +- Підготовка документів до друку, де очікується видимий зміст + +## Поради + +- Якщо у вашому PDF немає закладок, спершу скористайтеся інструментом [Редагувати закладки](./bookmark), щоб їх створити, а потім поверніться сюди, щоб створити зміст. +- Для великих документів більший розмір шрифту, наприклад 14 pt або 16 pt, покращує читабельність. + +## Пов’язані інструменти + +- [Редагувати закладки](./bookmark) +- [Нумерація сторінок](./page-numbers) +- [Верхній і нижній колонтитули](./header-footer) diff --git a/docs/uk/tools/text-color.md b/docs/uk/tools/text-color.md new file mode 100644 index 00000000..02313337 --- /dev/null +++ b/docs/uk/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Змінити колір тексту +description: Змініть колір усього тексту у вашому PDF на будь-який вибраний колір. +--- + +# Змінити колір тексту + +Замініть колір тексту в усьому PDF. Інструмент визначає текстові області на кожній сторінці й перефарбовує їх у вибраний колір, зберігаючи макет документа та нетекстовий вміст. + +## Як це працює + +1. Завантажте файл PDF. +2. Виберіть новий колір тексту за допомогою вибору кольору. За замовчуванням синій (#0000FF). +3. Натисніть **Змінити колір тексту** для обробки. +4. Перефарбований PDF завантажується автоматично. Індикатор прогресу показує, яка сторінка обробляється. + +## Параметри + +- **Новий колір тексту**: вибір кольору для заміни кольору всього тексту в документі. + +## Можливості + +- Перефарбовує текст на кожній сторінці документа +- Обробка посторінково з індикацією прогресу +- Вибір кольору з повною підтримкою hex-кольорів +- Зберігає макет сторінки та нетекстові елементи + +## Сценарії використання + +- Заміна чорного тексту на темно-синій для м’якшого, сучаснішого вигляду документа +- Перефарбування тексту відповідно до фірмових стандартів перед розповсюдженням документів +- Перетворення тексту на певний колір для відповідності вимогам доступності +- Забезпечення видимості тексту на щойно застосованому кольорі фону + +## Поради + +- Цей інструмент відтворює сторінки в масштабі 2x для якості, а потім відновлює PDF. Результат є зображенням, тому текст більше не можна буде виділити чи шукати. +- Для документів, де потрібно зберегти виділюваний текст, краще відредагуйте PDF безпосередньо за допомогою [Редактора PDF](./edit-pdf). +- Час обробки зростає зі збільшенням кількості сторінок, оскільки кожна сторінка відтворюється окремо. + +## Пов’язані інструменти + +- [Колір фону](./background-color) +- [Інвертувати кольори](./invert-colors) +- [Корекція кольору](./adjust-colors) diff --git a/docs/uk/tools/tiff-to-pdf.md b/docs/uk/tools/tiff-to-pdf.md new file mode 100644 index 00000000..edba62a8 --- /dev/null +++ b/docs/uk/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF у PDF +description: Конвертуйте одно- та багатосторінкові зображення TIFF у формат PDF у браузері з повною підтримкою сторінок. +--- + +# TIFF у PDF + +Конвертуйте файли TIFF у PDF, зокрема багатосторінкові TIFF. Кожна сторінка (або «IFD») у файлі TIFF стає окремою сторінкою вихідного PDF. Це особливо корисно для сканованих документів, факсів і медичних зображень, які зазвичай зберігаються як багатосторінкові TIFF. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли TIFF. +2. Перегляньте список файлів і керуйте ним за потреби. +3. Натисніть **Конвертувати в PDF**. Результат завантажується як `from_tiff.pdf`. + +Інструмент декодує кожен файл TIFF за допомогою декодера TIFF на JavaScript, витягуючи необроблені піксельні дані RGBA кожної сторінки. Кожна сторінка відтворюється на полотні, експортується як PNG і вбудовується в PDF. Розміри сторінок відповідають оригінальним сторінкам TIFF. + +## Параметри + +Цей інструмент не надає додаткових налаштувань якості. Зображення вбудовуються у власній роздільній здатності. + +## Сценарії використання + +- Конвертація багатосторінкових факсимільних документів (TIFF-F) у зручніший для перенесення формат PDF +- Перетворення архівів сканованих документів, що зберігаються як TIFF, на PDF з пошуком (після цього поєднайте з інструментом OCR) +- Обробка файлів медичної візуалізації (патологічні препарати, експорти рентгенології), що використовують TIFF +- Конвертація файлів TIFF із ГІС або супутниковими знімками в документи для поширення + +## Поради + +- Багатосторінкові TIFF повністю підтримуються. 10-сторінковий TIFF дасть 10-сторінковий PDF. Спершу розділяти TIFF не потрібно. +- Дуже великі файли TIFF (сотні мегабайтів) можуть оброблятися довше, оскільки весь файл потрібно декодувати в пам’яті браузера. +- Якщо потрібен OCR отриманого PDF, пропустіть його через інструмент [OCR PDF](./ocr-pdf) після конвертації. + +## Пов’язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [BMP у PDF](./bmp-to-pdf) +- [JPG у PDF](./jpg-to-pdf) diff --git a/docs/uk/tools/txt-to-pdf.md b/docs/uk/tools/txt-to-pdf.md new file mode 100644 index 00000000..d5394246 --- /dev/null +++ b/docs/uk/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Текст у PDF +description: Конвертуйте звичайні текстові файли або введений текст у PDF з власними шрифтами, кольорами та розмірами сторінок. +--- + +# Текст у PDF + +Конвертуйте звичайний текст у відформатований PDF. Можна завантажити файли `.txt` або ввести текст прямо у вбудований текстовий редактор. Інструмент підтримує кілька шрифтів, власні кольори тексту та широкий вибір розмірів сторінок: від A0 до A10, а також US Letter, Legal і Tabloid. + +## Підтримувані формати + +| Вхідні дані | Розширення | +| :---------------------- | :----------------------------- | +| Звичайні текстові файли | `.txt` | +| Пряме введення тексту | Введіть або вставте в редактор | + +## Як це працює + +1. Виберіть режим введення за допомогою перемикача вгорі: **Завантажити файли** або **Ввести текст**. +2. Якщо завантажуєте, перетягніть або клацніть, щоб вибрати один чи кілька файлів `.txt`. Якщо вводите, введіть текст прямо в текстове поле. +3. Налаштуйте параметри форматування: гарнітуру шрифту, розмір шрифту, колір тексту та розмір сторінки. +4. Натисніть **Створити PDF**. Результат завантажується як `text_to_pdf.pdf`. + +Під час завантаження кількох файлів їхній вміст об’єднується з порожніми рядками між ними. + +## Параметри + +| Параметр | Значення | За замовчуванням | +| :------------------- | :----------------------------------------------------------------------------------------- | :--------------- | +| **Гарнітура шрифту** | Helvetica (без засічок), Tiro (із засічками), Courier (моноширинний), Times (із засічками) | Helvetica | +| **Розмір шрифту** | 6 -- 72 pt | 12 | +| **Колір тексту** | Будь-який колір через вибір кольору | Чорний (#000000) | +| **Розмір сторінки** | ISO A0--A10, B0--B10, C0--C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Мови з письмом справа наліво (арабська, іврит, перська, урду) визначаються автоматично. Коли знайдено текст RTL, напрям тексту й вирівнювання відповідно перемикаються. + +## Сценарії використання + +- Конвертація фрагментів коду або файлів журналів у PDF для друку шрифтом Courier +- Швидке створення PDF із нотаток зустрічі, набраних на місці +- Форматування рукопису у вигляді звичайного тексту певним шрифтом і розміром сторінки для подання +- Створення PDF-версії README або журналу змін для офлайн-розповсюдження + +## Поради + +- Скористайтеся режимом **Ввести текст**, коли потрібно швидко конвертувати вміст буфера обміну, не зберігаючи його спершу у файл. +- Courier (моноширинний) є найкращим вибором шрифту для коду, журналів або будь-якого вмісту, де важливе вирівнювання стовпців. +- Поля сторінки фіксовані на 72 пунктах (1 дюйм) з усіх боків. + +## Пов’язані інструменти + +- [Markdown у PDF](./markdown-to-pdf) +- [CSV у PDF](./csv-to-pdf) +- [Word у PDF](./word-to-pdf) diff --git a/docs/uk/tools/unlock-pdf.md b/docs/uk/tools/unlock-pdf.md new file mode 100644 index 00000000..82d65fc7 --- /dev/null +++ b/docs/uk/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Розблокувати PDF +description: Зніміть захист паролем із зашифрованих PDF. Підтримується пакетне розшифрування кількох файлів одним паролем. +--- + +# Розблокувати PDF + +Якщо ви знаєте пароль до зашифрованого PDF, цей інструмент повністю прибирає шифрування й створює розблоковану копію, яку будь-хто може відкрити без пароля. Він підтримує пакетне розшифрування, коли кілька PDF мають однаковий пароль. + +## Як це працює + +1. Завантажте один або кілька зашифрованих PDF-файлів. +2. Введіть **пароль**, яким захищено файли. +3. Натисніть **Розшифрувати PDF**. +4. Один файл завантажується напряму. Для кількох файлів створюється ZIP-архів з усіма розблокованими PDF. + +## Можливості + +- Розшифрування одного файлу та пакетне розшифрування +- Працює і з паролями користувача, і з паролями власника +- Повністю нешифрований результат без залишкових обмежень +- Зрозумілі повідомлення про неправильний пароль або пошкоджені файли +- Облік успіху чи помилки для кожного файлу в пакетному режимі + +## Чим відрізняється від «Видалити обмеження» + +**Розшифрувати PDF** потребує пароль і прибирає все шифрування. **Видалити обмеження** працює з обмеженнями на використання (друк, копіювання, редагування) і може не потребувати пароля, якщо встановлено лише пароль власника. Використовуйте «Розшифрувати», коли PDF взагалі не відкривається без пароля. + +## Сценарії використання + +- Остаточне розблокування PDF, які ви шифрували раніше, коли пароль більше не потрібен +- Зняття шифрування з пакета архівних документів для зручнішого довгострокового доступу +- Підготовка захищених паролем PDF для системи керування документами, яка не підтримує зашифровані файли +- Розблокування PDF перед об'єднанням з іншими документами (багато інструментів об'єднання не обробляють зашифровані файли) + +## Поради + +- Поле пароля діє для всіх завантажених файлів. Якщо в ваших PDF різні паролі, обробляйте їх окремими пакетами. +- Якщо ви бачите помилку «Неправильний пароль», перевірте, чи немає зайвих пробілів у кінці та чи не ввімкнено Caps Lock. +- Після розшифрування результат не має жодного захисту. Якщо потрібен новий пароль, зашифруйте файл знову через «Зашифрувати PDF». + +## Пов'язані інструменти + +- [Зашифрувати PDF](./protect-pdf): знову застосувати шифрування з новим паролем +- [Видалити обмеження](./remove-restrictions): зняти обмеження на використання без повного розшифрування +- [Змінити дозволи](./change-permissions): змінити окремі дозволи для зашифрованого PDF diff --git a/docs/uk/tools/validate-signature-pdf.md b/docs/uk/tools/validate-signature-pdf.md new file mode 100644 index 00000000..dbe432be --- /dev/null +++ b/docs/uk/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Перевірити підпис +description: Перевіряйте цифрові підписи у файлах PDF. Дійсність сертифіката, особа підписанта, цілісність документа та стан ланцюжка довіри. +--- + +# Перевірити підпис + +Завантажте підписаний PDF, і інструмент витягне кожен цифровий підпис, визначить підписанта, перевірить дійсність сертифіката та покаже, чи змінювався документ після підписання. Також можна надати довірений сертифікат для перевірки ланцюжка підпису. + +## Як це працює + +1. Завантажте підписаний PDF-файл. Перевірка починається автоматично. +2. Інструмент показує зведення: кількість знайдених підписів і скільки з них дійсні. +3. Кожен підпис отримує детальну картку з іменем підписанта, видавцем, датами та статусом. +4. За бажанням завантажте **довірений сертифікат** (.pem, .crt, .cer, .der), щоб перевірити підпис відносно конкретного центру довіри. Повторна перевірка запускається автоматично. + +## Що перевіряється + +### Розбір підпису + +Інструмент витягує з PDF об'єкти підпису PKCS#7, декодує структуру ASN.1 і отримує сертифікат X.509 підписанта разом із ланцюжком сертифікатів, вбудованим у підпис. + +### Дійсність сертифіката + +- **Термін дії**: чи перебуває сертифікат зараз у межах строку дії? +- **Виявлення самопідписаних**: чи є сертифікат власним видавцем? +- **Ланцюжок довіри**: якщо надано довірений сертифікат, чи веде до нього ланцюжок сертифіката підписанта? + +### Криптографічна перевірка + +- Інструмент відтворює байти, які охоплює `/ByteRange` підпису, хешує їх алгоритмом, заявленим підписантом, і порівнює результат з атрибутом `messageDigest` усередині підпису. +- Потім він повторно серіалізує підписані атрибути як DER SET і перевіряє підпис за відкритим ключем сертифіката підписанта. +- **Підпис вважається дійсним, лише якщо пройдено всі ці перевірки.** Якщо байти PDF змінили після підписання або вбудований підпис не відповідає ключу підписанта, статус показує «Недійсний: криптографічну перевірку не пройдено» із конкретною причиною. + +#### Підтримувані алгоритми підпису + +| Алгоритм | Шлях перевірки | +| ----------------------- | -------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, із запасним варіантом Web Crypto | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` після перетворення підпису DER → IEEE P1363 | + +Якщо підпис використовує алгоритм поза цим списком (наприклад Ed25519, SM2 або RSA з нетиповим OID дайджесту), картка показує жовтим **«Не перевірено: непідтримуваний алгоритм підпису»** разом із конкретним OID або причиною. Це свідомий поділ на три стани: + +- **Дійсний**: підпис криптографічно перевірено за відкритим ключем підписанта. +- **Недійсний**: перевірку виконано, і результат негативний (байти змінено, ключ не збігається). +- **Неперевірений**: інструмент не зміг виконати перевірку для цього алгоритму. Метадані сертифіката все одно показуються, але підпис слід вважати «невідомим» і перевірити його в Adobe Acrobat або через `openssl cms -verify`. + +### Небезпечні алгоритми дайджесту + +- Підписи з **MD5 або SHA-1** відхиляються як недійсні й позначаються статусом «Небезпечний дайджест». Для обох алгоритмів опубліковано атаки на колізії, тож підпис поверх хешу SHA-1 чи MD5 не гарантує цілісності. +- SHA-224, SHA-256, SHA-384 і SHA-512 приймаються. + +### Охоплення документа + +- **Повне охоплення**: підпис охоплює весь PDF-файл, тобто після підписання жодних байтів не додавали й не змінювали. +- **Часткове охоплення**: підпис охоплює лише частину файлу. Це може означати, що після підписання вносилися зміни (не обов'язково зловмисні: інкрементальні збереження дають часткове охоплення). + +## Відомості про підпис + +Кожна картка підпису показує: + +- **Підписав**: загальне ім'я, організацію та email із сертифіката підписанта +- **Емітент**: центр сертифікації, що видав сертифікат підписанта +- **Дата підписання**: позначку часу, вбудовану в підпис +- **Дійсний з / Дійсний до**: період дії сертифіката +- **Причина**: чому документ підписано (якщо вказано) +- **Розташування**: де його підписано (якщо вказано) +- **Статус охоплення**: повне чи часткове +- **Значок довіри**: довірений чи поза ланцюжком довіри (лише коли надано власний сертифікат) + +### Технічні подробиці + +Розгорніть розділ технічних подробиць, щоб побачити: + +- Серійний номер сертифіката підписанта +- Алгоритм дайджесту (SHA-256, SHA-512 тощо) +- Алгоритм підпису (RSA із SHA-256, ECDSA із SHA-256 тощо) +- Повідомлення про помилки для недійсних підписів + +## Сценарії використання + +- Перевірка цифрово підписаного договору перед контрпідписанням +- Аудит підписаних документів, щоб переконатися, що їх не змінювали +- Перевірка, чи не закінчився термін дії сертифіката після підписання документа +- Перевірка підписів за кореневим сертифікатом вашої організації +- Огляд відомостей про підписання державних чи юридичних документів + +## Поради + +- Самопідписаний сертифікат не означає, що підпис недійсний: це означає, що особу підписанта не можна підтвердити через довірену третю сторону. Для внутрішніх документів це звична річ. +- Часткове охоплення не завжди свідчить про втручання. Багато робочих процесів PDF додають інкрементальні оновлення (наприклад, другий підпис), які створюють часткове охоплення. +- Завантажте кореневий або проміжний сертифікат вашої організації як довірений, щоб отримати перевірку ланцюжка довіри. + +## Пов'язані інструменти + +- [Цифровий підпис](./digital-sign-pdf): підписуйте PDF власним сертифікатом +- [Сплощити PDF](./flatten-pdf): сплощіть PDF перед підписанням, щоб запобігти змінам після підпису +- [Видалити метадані](./remove-metadata): очистьте PDF перед накладанням підпису diff --git a/docs/uk/tools/view-metadata.md b/docs/uk/tools/view-metadata.md new file mode 100644 index 00000000..67615dd2 --- /dev/null +++ b/docs/uk/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Перегляд метаданих +description: Перегляньте всі метадані PDF, зокрема відомості про документ, дані XMP і структурні властивості. +--- + +# Перегляд метаданих + +Перегляньте приховані властивості, вбудовані у PDF-файл. Інструмент показує відомості про документ (назва, автор, дати), метадані XMP, розміри сторінок та інші структурні дані в зручному вигляді. + +## Як це працює + +1. Завантажте PDF-файл. +2. Інструмент одразу розбирає файл і показує всі доступні метадані за розділами. +3. Перегляньте словник відомостей про документ, дерево метаданих XMP і структурні властивості. +4. Окрема обробка не потрібна: метадані відображаються, щойно файл завантажено. + +## Можливості + +- Показує стандартні поля: заголовок, автор, тема, ключові слова, створювач, виробник +- Відображає дати створення та зміни в зручному для читання форматі +- Розбирає й показує повне дерево метаданих XMP із вкладеними просторами імен +- Перетворює формат дат PDF (`D:20240101120000Z`) на зрозумілі дати +- Розділи згортаються для зручної навігації + +## Розділи метаданих + +| Розділ | Вміст | +| -------------------------- | -------------------------------------------------------------------------------------- | +| **Відомості про документ** | Заголовок, автор, тема, ключові слова, створювач, виробник, дата створення, дата зміни | +| **Метадані XMP** | Повне XML-дерево метаданих з просторами імен Dublin Core, XAP, PDF та власними | +| **Властивості документа** | Кількість сторінок, версія PDF, розмір файлу, стан шифрування | + +## Сценарії використання + +- Дізнатися, хто автор PDF і коли його востаннє змінювали +- Переконатися, що метадані задано правильно перед публікацією документа +- Перевірити PDF на приватність, подивившись, які особисті дані вбудовано +- З'ясувати, яке програмне забезпечення створило або змінило PDF (за полем Producer) +- Перевірити метадані XMP на відповідність вимогам керування цифровими активами + +## Поради + +- Рядки дат PDF, що починаються з `D:`, автоматично перетворюються на формат вашого часового поясу. +- Якщо поля метаданих порожні, автор PDF просто не заповнив їх. Не всі PDF містять багаті метадані. +- Щоб змінити метадані після перегляду, скористайтеся [Редагувати метадані](./edit-metadata). Щоб видалити їх повністю, використайте «Видалити метадані». + +## Пов'язані інструменти + +- [Редагувати метадані](./edit-metadata) +- [Шари PDF OCG](./pdf-layers) +- [Порівняти PDF](./compare-pdfs) diff --git a/docs/uk/tools/vsd-to-pdf.md b/docs/uk/tools/vsd-to-pdf.md new file mode 100644 index 00000000..8f57cba1 --- /dev/null +++ b/docs/uk/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD у PDF +description: Перетворюйте діаграми Microsoft Visio (VSD/VSDX) на PDF у браузері. Безкоштовно, приватно, Visio не потрібен. +--- + +# VSD у PDF + +Перетворюйте діаграми Microsoft Visio на PDF без встановлення Visio. Файли VSD і VSDX містять блок-схеми, організаційні структури, мережеві діаграми та плани приміщень, які більшість людей не можуть відкрити. Цей інструмент створює з них чисті PDF, які можна переглянути на будь-якому пристрої. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----------- | :--------- | :-------------------------------------------- | +| Visio Binary | `.vsd` | Застарілий формат Visio (Visio 2003 і раніше) | +| Visio XML | `.vsdx` | Сучасний формат Visio (Visio 2013+) | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли VSD чи VSDX. В одному пакеті можна поєднувати обидва формати. +2. Перегляньте список файлів. Видаляйте зайві записи піктограмою кошика або додайте діаграми кнопкою **Додати ще файли**. +3. Натисніть **Перетворити на PDF**. Рушій на основі LibreOffice завантажується в браузері й відтворює кожну діаграму у PDF, зберігаючи фігури, з'єднувачі, підписи та макет сторінки. +4. Одна діаграма завантажується напряму як PDF. Для кількох файлів створюється ZIP-архів `vsd-to-pdf.zip`. + +## Параметри + +Налаштування не потрібні. Конвертер зберігає початковий розмір і орієнтацію сторінки з документа Visio. + +## Сценарії використання + +- Перегляд діаграм Visio від колеги, коли у вас немає ліцензії Visio +- Додавання мережевих чи архітектурних діаграм у проєктну документацію у вигляді PDF +- Друк організаційних структур або схем процесів для роздаткових матеріалів на нарадах +- Архівація старих файлів VSD із ранніх версій Visio у форматі, що прослужить довго + +## Поради + +- Багатосторінкові документи Visio дають багатосторінкові PDF: кожна сторінка Visio стає сторінкою PDF. +- Файли VSDX (сучасний формат на основі XML) зазвичай конвертуються точніше, ніж старі двійкові файли VSD. +- Рушій LibreOffice завантажується один раз за сеанс. Під час першого перетворення доведеться трохи зачекати, наступні файли обробляються швидше. + +## Пов'язані інструменти + +- [ODG у PDF](./odg-to-pdf) +- [PUB у PDF](./pub-to-pdf) +- [PSD у PDF](./psd-to-pdf) diff --git a/docs/uk/tools/webp-to-pdf.md b/docs/uk/tools/webp-to-pdf.md new file mode 100644 index 00000000..3a887903 --- /dev/null +++ b/docs/uk/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP у PDF +description: Перетворюйте зображення WebP на PDF просто в браузері з регульованою якістю стиснення. +--- + +# WebP у PDF + +Перетворюйте формат зображень WebP від Google на PDF. Це особливо корисно, коли ви завантажили з інтернету зображення у форматі WebP і вам потрібен загальноприйнятіший формат для друку чи надсилання. + +## Підтримувані формати + +| Формат | Розширення | +| :----- | :--------- | +| WebP | `.webp` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли WebP. +2. Перегляньте список файлів і видаліть ті, що не потрібні. +3. Виберіть рівень **якості PDF**. +4. Натисніть **Перетворити на PDF**. Результат завантажується як `from_webps.pdf`. + +Усередині кожне зображення WebP декодується через canvas API браузера, а потім вбудовується у PDF за допомогою pdf-lib. Тому перетворення працює в будь-якому браузері з підтримкою декодування WebP (усі сучасні браузери її мають). + +## Параметри + +**Якість PDF** визначає стиснення під час вбудовування зображень: + +- **Висока якість**: зберігає найбільше деталей. +- **Середня якість** (за замовчуванням): збалансований результат. +- **Низька якість**: найменший розмір файлу. + +## Сценарії використання + +- Перетворення завантажених з інтернету зображень WebP на PDF для друку +- Збирання скриншотів WebP із Chrome чи Edge у документацію +- Створення PDF-портфоліо із зображень, які експортують дизайнерські інструменти зі WebP за замовчуванням +- Архівація зображень WebP у ширше підтримуваному форматі + +## Поради + +- WebP перед вбудовуванням у PDF декодується в PNG, тому WebP без втрат зберігає якість на високому рівні. +- Якщо у вас суміш WebP та інших форматів зображень, скористайтеся інструментом [Зображення у PDF](./image-to-pdf): він приймає все одразу. + +## Пов'язані інструменти + +- [Зображення у PDF](./image-to-pdf) +- [PNG у PDF](./png-to-pdf) +- [JPG у PDF](./jpg-to-pdf) diff --git a/docs/uk/tools/word-to-pdf.md b/docs/uk/tools/word-to-pdf.md new file mode 100644 index 00000000..4a303022 --- /dev/null +++ b/docs/uk/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word у PDF +description: Перетворюйте документи Word (DOC, DOCX), ODT і RTF на PDF у браузері зі збереженням усього форматування. +--- + +# Word у PDF + +Перетворюйте документи Microsoft Word та сумісні формати на PDF. Інструмент використовує рушій LibreOffice у браузері, який обробляє файли DOC, DOCX, ODT і RTF та зберігає у результаті форматування, таблиці, зображення, колонтитули й стилі. + +## Підтримувані формати + +| Формат | Розширення | +| :---------------- | :--------- | +| Word (сучасний) | `.docx` | +| Word (застарілий) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Як це працює + +1. Натисніть область завантаження або перетягніть документи Word. Можна вибрати одразу кілька файлів. +2. Перегляньте список файлів і впорядкуйте його. +3. Натисніть **Перетворити на PDF**. Під час першого використання завантажується рушій LibreOffice (індикатор прогресу показує стан ініціалізації), після чого кожен файл конвертується. +4. Один файл завантажується напряму як PDF. Кілька файлів пакуються в `word-converted.zip`. + +## Параметри + +Додаткових налаштувань немає. Рушій LibreOffice створює результат за стандартним профілем експорту в PDF. + +## Результат + +| Кількість файлів | Результат | +| :--------------- | :------------------------------------------------------------- | +| 1 файл | Один PDF (початкова назва файлу з розширенням `.pdf`) | +| 2+ файли | ZIP-архів (`word-converted.zip`) з одним PDF для кожного файлу | + +## Сценарії використання + +- Перетворення резюме чи супровідного листа з DOCX на PDF перед поданням заявки на роботу +- Пакетне перетворення набору договорів або пропозицій на PDF для передачі клієнту +- Перетворення старих файлів `.doc` на сучасні PDF для довгострокового архівування +- Перетворення спільних документів із Google Docs (експортованих як DOCX) на PDF +- Створення PDF, готових до друку, із шаблонів Word, які використовуються в автоматичному формуванні документів + +## Поради + +- Рушій LibreOffice завантажується один раз за сеанс і кешується. Під час першого перетворення доведеться почекати кілька секунд, наступні виконуються значно швидше. +- Складне форматування (макроси, елементи ActiveX, розширений SmartArt) може конвертуватися неідеально. Стандартні елементи документа (текст, таблиці, зображення, колонтитули, виноски) конвертуються надійно. +- Оскільки інструмент приймає також ODT і RTF, його можна використовувати як універсальний конвертер усіх текстових форматів. + +## Пов'язані інструменти + +- [ODT у PDF](./odt-to-pdf) +- [RTF у PDF](./rtf-to-pdf) +- [Excel у PDF](./excel-to-pdf) +- [PowerPoint у PDF](./powerpoint-to-pdf) diff --git a/docs/uk/tools/wpd-to-pdf.md b/docs/uk/tools/wpd-to-pdf.md new file mode 100644 index 00000000..63e6a01b --- /dev/null +++ b/docs/uk/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD у PDF +description: Перетворюйте документи WordPerfect (WPD) на PDF у браузері за допомогою LibreOffice. Безкоштовно та приватно. +--- + +# WPD у PDF + +Перетворюйте документи Corel WordPerfect на файли PDF. WPD колись був основним форматом текстових редакторів в юридичних конторах і державних установах. Якщо у вас є старі файли WordPerfect, які сучасні програми не відкривають, цей інструмент поверне їх до життя як звичайні PDF. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :---------- | :--------- | :----------------------------- | +| WordPerfect | `.wpd` | Усі основні версії WordPerfect | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли WPD. Можна вибрати одразу кілька файлів. +2. Перегляньте список файлів. Видаляйте зайві файли піктограмою кошика або додайте документи кнопкою **Додати ще файли**. +3. Натисніть **Перетворити на PDF**. Інструмент завантажує у браузері рушій конвертації на основі LibreOffice, який розбирає формат WPD і створює PDF. +4. Один файл завантажується напряму як PDF. Пакетне перетворення створює ZIP-архів `wpd-to-pdf.zip`. + +## Параметри + +Налаштування не потрібні. Рушій LibreOffice сам обробляє форматування, шрифти й макет WPD. + +## Сценарії використання + +- Відкриття юридичних документів десятирічної давності, написаних у WordPerfect +- Перетворення архівних державних документів із WPD на сучасний формат +- Перенесення старої бібліотеки документів WordPerfect у PDF для довгострокового зберігання +- Передача файлів WPD отримувачам, у яких не встановлено Corel WordPerfect + +## Поради + +- Рушій LibreOffice завантажується під час першого використання, це потребує трохи часу. Наступні перетворення в тому самому сеансі швидші. +- Складні макроси WPD і приховані коди (reveal codes) не зберігаються, але візуальний макет, текст і базове форматування переносяться в PDF. + +## Пов'язані інструменти + +- [WPS у PDF](./wps-to-pdf) +- [ODG у PDF](./odg-to-pdf) diff --git a/docs/uk/tools/wps-to-pdf.md b/docs/uk/tools/wps-to-pdf.md new file mode 100644 index 00000000..ea7b6de7 --- /dev/null +++ b/docs/uk/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS у PDF +description: Перетворюйте документи Microsoft Works (WPS) на PDF у браузері. Безкоштовно, без реєстрації, повністю приватно. +--- + +# WPS у PDF + +Перетворюйте файли текстового редактора Microsoft Works на PDF. Microsoft Works постачався зі споживчими ПК наприкінці 1990-х і в 2000-х, і багато файлів WPS досі лежать на старих дисках та в поштових архівах. Цей інструмент відкриває їх у браузері й створює чисті PDF. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :-------------- | :--------- | :----------------------------------------- | +| Microsoft Works | `.wps` | Файли текстового редактора Microsoft Works | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли WPS. Можна додати кілька файлів. +2. Перегляньте список файлів. Піктограмою кошика видаліть окремі файли або натисніть **Додати ще файли**, щоб розширити пакет. +3. Натисніть **Перетворити на PDF**. Рушій на основі LibreOffice завантажується в браузері й конвертує кожен документ WPS у PDF. +4. Один файл завантажується напряму як PDF. Кілька файлів пакуються в ZIP-архів `wps-to-pdf.zip`. + +## Параметри + +Додаткові налаштування не потрібні. Конвертер обробляє текст, базове форматування та вбудовані зображення з файлу WPS. + +## Сценарії використання + +- Відновлення старих шкільних чи робочих документів, збережених у форматі Microsoft Works +- Відкриття вкладень WPS в електронних листах, коли Microsoft Works не встановлено +- Перетворення архіву файлів WPS для перенесення в сучасну систему документів +- Друк старих документів, які сучасні текстові редактори не можуть відкрити + +## Поради + +- Не плутайте файли Microsoft Works `.wps` із файлами WPS Office. Цей інструмент призначений саме для старішого формату Microsoft Works. +- Рушій LibreOffice завантажується під час першого використання, це потребує трохи часу. Після завантаження наступні перетворення в тому самому сеансі швидші. + +## Пов'язані інструменти + +- [WPD у PDF](./wpd-to-pdf) +- [PUB у PDF](./pub-to-pdf) diff --git a/docs/uk/tools/xml-to-pdf.md b/docs/uk/tools/xml-to-pdf.md new file mode 100644 index 00000000..4347a7cf --- /dev/null +++ b/docs/uk/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML у PDF +description: Перетворюйте файли XML на структуровані PDF-документи у браузері. Безкоштовно, приватно, без обробки на сервері. +--- + +# XML у PDF + +Перетворюйте файли даних XML на читабельні структуровані PDF-документи. Сирий XML потужний, але незручний для людського читання. Цей інструмент розбирає дерево XML, виявляє повторювані структури даних і відображає їх як форматовані таблиці та розділи в альбомному PDF формату A4. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----- | :--------- | :------------------------------- | +| XML | `.xml` | Будь-який коректний XML-документ | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли XML. В одному пакеті можна обробити кілька файлів. +2. Перегляньте список файлів. Видаляйте зайві файли піктограмою кошика або натисніть **Додати ще файли**, щоб додати інші. +3. Натисніть **Перетворити на PDF**. Інструмент розбирає структуру XML за допомогою вбудованого в браузер DOMParser, аналізує ієрархію даних і відображає її у PDF через jsPDF з автоматичним форматуванням таблиць. +4. Один файл завантажується як PDF. Кілька перетворень пакуються в `xml-to-pdf.zip`. + +## Параметри + +Ручне налаштування не потрібне. Конвертер сам визначає структуру XML і добирає відповідні макети таблиць. Результат має альбомну орієнтацію A4, щоб вмістити широкі набори даних. + +## Сценарії використання + +- Перетворення експортів XML з баз даних чи API на звіти для друку +- Створення читабельних зведень із конфігураційних файлів XML +- Перетворення рахунків або журналів транзакцій у форматі XML на PDF для обліку +- Подання XML-карт сайту чи RSS-стрічок у читабельному вигляді документа + +## Поради + +- XML має бути коректним. Якщо парсер знайде синтаксичні помилки, перетворення завершиться з описовим повідомленням, що вказує на проблему. +- Глибоко вкладені структури XML розгортаються в таблиці. Найкращий результат дають дані з повторюваними сусідніми елементами однакової структури. +- Під час перетворення показуються оновлення прогресу з кожним етапом: читання, розбір, аналіз і відображення. + +## Пов'язані інструменти + +- [FB2 у PDF](./fb2-to-pdf) +- [XPS у PDF](./xps-to-pdf) +- [Email у PDF](./email-to-pdf) diff --git a/docs/uk/tools/xps-to-pdf.md b/docs/uk/tools/xps-to-pdf.md new file mode 100644 index 00000000..c2921dff --- /dev/null +++ b/docs/uk/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS у PDF +description: Перетворюйте документи XPS і OXPS на PDF у браузері. Без завантаження на сервер, без реєстрації, повністю приватно. +--- + +# XPS у PDF + +Перетворюйте документи Microsoft XPS і OXPS на стандартні файли PDF. XPS (XML Paper Specification) був відповіддю Microsoft на PDF, але підтримка його на платформах поступово згасла. Цей інструмент знову робить такі документи доступними для всіх. + +## Підтримувані формати + +| Формат | Розширення | Примітки | +| :----- | :--------- | :--------------------------------------- | +| XPS | `.xps` | Початковий формат Microsoft XPS | +| OXPS | `.oxps` | Open XPS, варіант за стандартом ECMA-388 | + +## Як це працює + +1. Натисніть область завантаження або перетягніть файли XPS/OXPS. Можна вибрати одразу кілька файлів. +2. Перегляньте список файлів. Видаляйте окремі файли піктограмою кошика або натисніть **Додати ще файли**, щоб додати документи. +3. Натисніть **Перетворити на PDF**. Рушій PyMuPDF обробляє кожен документ локально у вашому браузері. +4. Один файл завантажується напряму як PDF. Кілька файлів пакуються в ZIP-архів `xps-converted.zip`. + +## Параметри + +Інструмент виконує пряме перетворення формату без додаткових налаштувань. Результат зберігає початкові розміри сторінок, векторну графіку, шрифти й зображення з файлу XPS. + +## Сценарії використання + +- Відкриття файлів XPS, отриманих зі старих систем Windows, де драйвер друку XPS був типовим +- Перетворення документів OXPS із Windows 10/11 для передачі користувачам macOS чи Linux +- Архівація старих файлів XPS у ширше підтримуваному форматі +- Надання зовнішнім отримувачам доступу до державних чи корпоративних документів у форматі XPS + +## Поради + +- Розширення `.xps` та `.oxps` обробляються автоматично: їх можна змішувати в одному пакеті. +- Якщо початковий файл XPS створено драйвером друку з високою роздільною здатністю, PDF збереже цю якість. Передискретизації не відбувається. + +## Пов'язані інструменти + +- [Word у PDF](./word-to-pdf) +- [XML у PDF](./xml-to-pdf) diff --git a/docs/vi/contributing.md b/docs/vi/contributing.md new file mode 100644 index 00000000..0a772e40 --- /dev/null +++ b/docs/vi/contributing.md @@ -0,0 +1,136 @@ +# Đóng góp + +Cảm ơn bạn đã quan tâm đến việc đóng góp cho BentoPDF! Hướng dẫn này sẽ giúp bạn bắt đầu. + +## Bắt đầu + +### Yêu cầu + +- Node.js 18+ +- npm 9+ +- Git + +### Cài đặt + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Cấu trúc dự án + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## Thêm công cụ mới + +### Bước 1: Tạo tệp logic + +Tạo `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### Bước 2: Tạo trang HTML + +Tạo `src/pages/your-tool.html` theo các mẫu công cụ hiện có. + +### Bước 3: Đăng ký công cụ + +Thêm vào `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### Bước 4: Thêm vào cấu hình build + +Thêm trang vào `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### Bước 5: Thêm bản dịch + +Thêm các mục vào tất cả tệp locale trong `public/locales/`: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## Phong cách mã + +- Dùng TypeScript cho mọi mã mới +- Tuân theo các mẫu hiện có để nhất quán +- Chạy `npm run format` trước khi commit +- Không viết chú thích trong mã production (chú thích bị xóa khi build) + +## Quy trình Pull Request + +1. Tạo nhánh tính năng: `git checkout -b feature/your-feature` +2. Thực hiện thay đổi của bạn +3. Kiểm tra kỹ lưỡng: `npm run build` +4. Gửi PR kèm mô tả rõ ràng + +## Dịch thuật + +Xem [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md) để biết cách thêm ngôn ngữ mới. + +## Thỏa thuận cấp phép cho người đóng góp + +Trước khi PR của bạn được merge, bạn cần ký CLA của chúng tôi: + +- [CLA cá nhân (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [CLA doanh nghiệp (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## Nhận trợ giúp + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Cộng đồng Discord](https://discord.gg/Bgq3Ay3f2w) + +## Giấy phép + +BentoPDF được cấp phép kép: + +- **AGPL-3.0** cho các dự án mã nguồn mở công khai toàn bộ mã nguồn của mình +- **Giấy phép thương mại** cho các ứng dụng độc quyền/mã nguồn đóng - [Nhận giấy phép trọn đời với giá $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +Khi đóng góp, bạn đồng ý rằng các đóng góp của mình sẽ được cấp phép theo các điều khoản này. diff --git a/docs/vi/getting-started.md b/docs/vi/getting-started.md new file mode 100644 index 00000000..077f30fb --- /dev/null +++ b/docs/vi/getting-started.md @@ -0,0 +1,80 @@ +# Bắt đầu + +Chào mừng bạn đến với BentoPDF! Hướng dẫn này giúp bạn bắt đầu nhanh chóng. + +## BentoPDF là gì? + +BentoPDF là bộ công cụ PDF miễn phí, mã nguồn mở, đặt quyền riêng tư lên hàng đầu và chạy **hoàn toàn trong trình duyệt của bạn**. Tệp của bạn không bao giờ rời khỏi thiết bị, mọi xử lý đều diễn ra cục bộ bằng công nghệ WebAssembly (WASM). + +## Bắt đầu nhanh + +### Cách 1: Dùng phiên bản trực tuyến + +Truy cập [bentopdf.com](https://www.bentopdf.com) để dùng BentoPDF ngay, không cần cài đặt. + +### Cách 2: Tự lưu trữ bằng Docker + +> [!IMPORTANT] +> Chuyển đổi tệp Office cần `SharedArrayBuffer`, và điều này đòi hỏi cả: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - một ngữ cảnh bảo mật (secure context) +> +> `http://localhost` dùng được để thử nghiệm cục bộ vì trình duyệt coi loopback là đáng tin cậy. `http://192.168.x.x` hoặc các IP LAN khác thường thì không, nên việc chuyển đổi Word/Excel/PowerPoint sẽ cần HTTPS khi truy cập từ các thiết bị khác trong mạng của bạn. + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF có hai bản build: **bản Tự lưu trữ** (`bentopdf-simple`, dùng ở trên) cho triển khai nội bộ/nhóm/tổ chức, và **bản Thương mại** (`bentopdf:latest`) được chính bentopdf.com và các chủ sở hữu giấy phép thương mại dùng cho triển khai công khai. Cả hai đều có cùng các công cụ PDF, bản Thương mại bổ sung phần hero, FAQ, lời chứng thực và chân trang của bentopdf.com. Nếu không chắc, hãy dùng bản Tự lưu trữ. + +Sau đó mở `http://localhost:3000` trong trình duyệt của bạn. + +> [!NOTE] +> Nếu bạn chuẩn bị triển khai OCR trong môi trường air-gapped, bạn phải lưu trữ nội bộ cả các phông chữ lớp văn bản OCR, ngoài tệp worker Tesseract, runtime lõi và các tệp traineddata. Cách thiết lập đầy đủ có trong [Tự lưu trữ](/vi/self-hosting/), gồm `VITE_OCR_FONT_BASE_URL` và thư mục `ocr-fonts/` đi kèm. + +### Cách 3: Build từ mã nguồn + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## Tính năng nổi bật + +| Danh mục | Công cụ | +| ------------------------- | ------------------------------------------------------------------- | +| **Chuyển sang PDF** | Word, Excel, PowerPoint, Hình ảnh, Markdown, EPUB, MOBI, và hơn nữa | +| **Chuyển từ PDF** | JPG, PNG, Văn bản, Excel, SVG, và hơn nữa | +| **Chỉnh sửa & Chú thích** | Ký, Đánh dấu, Che thông tin, Điền biểu mẫu, Thêm con dấu | +| **Sắp xếp** | Gộp, Chia, Xoay, Xóa trang, Sắp xếp lại | +| **Tối ưu hóa** | Nén, Sửa chữa, Làm phẳng, OCR | +| **Bảo mật** | Mã hóa, Giải mã, Gỡ hạn chế | + +## Hỗ trợ trình duyệt + +BentoPDF hoạt động tốt nhất trên các trình duyệt hiện đại: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## Bước tiếp theo + +- [Khám phá tất cả công cụ](/vi/tools/) +- [Tự lưu trữ BentoPDF](/vi/self-hosting/) +- [Đóng góp cho dự án](/vi/contributing) diff --git a/docs/vi/index.md b/docs/vi/index.md new file mode 100644 index 00000000..ac00cff3 --- /dev/null +++ b/docs/vi/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: 'Công cụ PDF miễn phí, mã nguồn mở' + tagline: Xử lý PDF hoàn toàn trong trình duyệt của bạn. Không tải lên. Không máy chủ. Riêng tư tuyệt đối. + actions: + - theme: brand + text: Bắt đầu + link: /vi/getting-started + - theme: alt + text: Xem công cụ + link: /vi/tools/ + - theme: alt + text: Tự lưu trữ + link: /vi/self-hosting/ + - theme: alt + text: Giấy phép thương mại + link: /vi/licensing + +features: + - icon: 🔒 + title: Riêng tư 100% + details: Tệp của bạn không bao giờ rời khỏi thiết bị. Mọi xử lý diễn ra cục bộ trong trình duyệt bằng WebAssembly. + - icon: ⚡ + title: Nhanh và miễn phí + details: Không đăng ký, không giới hạn, không hình mờ. Xử lý không giới hạn PDF miễn phí, mãi mãi. + - icon: 🛠️ + title: Hơn 50 công cụ + details: Chuyển đổi, chỉnh sửa, gộp, chia, nén, ký, OCR và hơn thế nữa. Mọi thứ bạn cần ở cùng một nơi. + + - icon: 🌐 + title: Có thể tự lưu trữ + details: Triển khai trên hạ tầng của riêng bạn. Docker, Vercel, Netlify, AWS, hoặc môi trường air-gapped hoàn toàn với worker OCR, dữ liệu ngôn ngữ và phông chữ lớp văn bản tự lưu trữ. +--- + +## OCR ngoại tuyến + +Nếu bạn tự lưu trữ BentoPDF trong môi trường air-gapped hoặc ngoại tuyến, OCR cần nhiều hơn tệp worker Tesseract và các tệp traineddata. Đầu ra PDF có thể tìm kiếm còn cần các phông chữ lớp văn bản OCR được phục vụ nội bộ. +Xem [Tự lưu trữ](/vi/self-hosting/) để biết cách thiết lập đầy đủ, gồm `VITE_OCR_FONT_BASE_URL`, thư mục `ocr-fonts/` đi kèm và quy trình air-gap đã cập nhật. diff --git a/docs/vi/licensing.md b/docs/vi/licensing.md new file mode 100644 index 00000000..aa2a7503 --- /dev/null +++ b/docs/vi/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/vi/self-hosting/#cau-hinh-wasm-thanh-phan-agpl) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/vi/self-hosting/apache.md b/docs/vi/self-hosting/apache.md new file mode 100644 index 00000000..3aad3eca --- /dev/null +++ b/docs/vi/self-hosting/apache.md @@ -0,0 +1,275 @@ +# Triển khai với Apache + +Lưu trữ BentoPDF bằng Apache HTTP Server. + +## Yêu cầu + +- Apache 2.4+ +- Đã bật mod_rewrite +- Chứng chỉ SSL (khuyến nghị) + +## Bước 1: Build dự án + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Để tùy chỉnh thương hiệu, đặt các biến môi trường trước khi build: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Bước 2: Sao chép tệp + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Bước 3: Cấu hình Apache + +Tạo `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## Bước 4: .htaccess cho định tuyến + +Tạo `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## Bước 5: Bật các module cần thiết + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## Bước 6: Bật trang web + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## Triển khai trong thư mục con + +Để lưu trữ tại `/pdf/`: + +1. Build với base URL: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. Cập nhật `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## Khắc phục sự cố + +### Lỗi WASM 404 + +Đảm bảo đã cấu hình MIME type: + +```apache +AddType application/wasm .wasm +``` + +### Ký PDF hoặc Form Filler hiển thị trình xem trống (lỗi MIME `.mjs`) + +Nếu console của trình duyệt hiển thị: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...và yêu cầu bị lỗi có đuôi `.mjs`, cấu hình Apache của bạn đang thiếu ánh xạ `.mjs → application/javascript`. Trình xem PDF đi kèm dùng các tệp ES module có đuôi `.mjs`, và `mime.types` mặc định của Apache không có sẵn đuôi này. + +Thêm vào VirtualHost hoặc `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +Sau đó tải lại Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +Để xác nhận: trong DevTools của trình duyệt → thẻ Network, tìm yêu cầu `.mjs` bị lỗi và kiểm tra header phản hồi `Content-Type`. Giờ nó phải là `application/javascript`, không phải `application/octet-stream`. + +### Rewrite không hoạt động + +Kiểm tra mod_rewrite đã được bật: + +```bash +sudo a2enmod rewrite +``` + +### Chuyển Word/ODT/Excel sang PDF không hoạt động + +LibreOffice WASM cần `SharedArrayBuffer`, và điều này đòi hỏi các header sau: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +Nó cũng cần một ngữ cảnh bảo mật (secure context). `http://localhost` dùng được để thử nghiệm cục bộ, nhưng `http://192.168.x.x` hoặc các IP LAN khác thường cần HTTPS. Nếu các header đã có nhưng `window.crossOriginIsolated` vẫn là `false`, hãy kiểm tra xem trang có đang được mở qua HTTP thường trên một origin không phải loopback hay không. + +Các tệp `.wasm.gz` và `.data.gz` nén sẵn cũng cần `Content-Encoding` đúng: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +Đảm bảo `mod_headers` đã được bật: `sudo a2enmod headers` + +### Bị từ chối quyền truy cập + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/vi/self-hosting/aws.md b/docs/vi/self-hosting/aws.md new file mode 100644 index 00000000..66d3e0fd --- /dev/null +++ b/docs/vi/self-hosting/aws.md @@ -0,0 +1,200 @@ +# Triển khai lên AWS S3 + CloudFront + +Lưu trữ BentoPDF trên AWS để kiểm soát và mở rộng tối đa. + +## Kiến trúc + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## Bước 1: Tạo S3 bucket + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## Bước 2: Build và tải lên + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## Bước 3: Tạo bản phân phối CloudFront + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +Hoặc dùng AWS Console: + +1. Vào CloudFront → Create distribution +2. Origin domain: chọn S3 bucket của bạn +3. Bật "Origin Access Control" +4. Default root object: `index.html` +5. Tạo distribution + +## Bước 3b: Chính sách header phản hồi (bắt buộc cho LibreOffice WASM) + +Các chuyển đổi dựa trên LibreOffice (Word, Excel, PowerPoint sang PDF) cần `SharedArrayBuffer`, và điều này đòi hỏi các header phản hồi cụ thể. Hãy tạo một CloudFront Response Headers Policy: + +1. Vào CloudFront → Policies → Response headers +2. Tạo chính sách tùy chỉnh với các header sau: + +| Header | Giá trị | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. Gắn chính sách vào default cache behavior của distribution + +Hoặc qua CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## Bước 3c: Metadata S3 cho tệp WASM nén sẵn + +Các tệp WASM của LibreOffice được nén sẵn (`.wasm.gz`, `.data.gz`). Hãy đặt Content-Type và Content-Encoding đúng để trình duyệt giải nén chúng: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning Quan trọng +Nếu thiếu chính sách header phản hồi, `SharedArrayBuffer` sẽ không khả dụng và các chuyển đổi LibreOffice WASM sẽ bị treo ở khoảng 55%. Nếu thiếu Content-Encoding đúng trên các tệp `.gz`, trình duyệt sẽ nhận byte gzip thô và việc biên dịch WASM sẽ thất bại. +::: + +## Bước 4: Chính sách S3 bucket + +Cho phép CloudFront truy cập bucket: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## Bước 5: Trang lỗi tùy chỉnh + +Cấu hình 404 trả về `index.html` cho định tuyến SPA: + +1. CloudFront → Error pages +2. Tạo phản hồi lỗi tùy chỉnh: + - HTTP error code: 404 + - Response page path: `/index.html` + - HTTP response code: 200 + +## Ước tính chi phí + +| Tài nguyên | Chi phí ước tính | +| ------------------------ | ---------------- | +| Lưu trữ S3 (~500MB) | ~$0.01/tháng | +| CloudFront (truyền 1TB) | ~$85/tháng | +| CloudFront (truyền 10GB) | ~$0.85/tháng | + +::: tip +Dùng S3 Intelligent Tiering để tối ưu chi phí cho các tệp ít được truy cập. +::: + +## Tự động hóa với Terraform + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/vi/self-hosting/cloudflare.md b/docs/vi/self-hosting/cloudflare.md new file mode 100644 index 00000000..0474e08f --- /dev/null +++ b/docs/vi/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# Triển khai lên Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) cung cấp dịch vụ lưu trữ trang tĩnh toàn cầu, nhanh, với băng thông không giới hạn. + +## Triển khai nhanh + +1. Vào [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. Nhấp "Create a project" +3. Kết nối kho GitHub của bạn + +## Cấu hình build + +| Cài đặt | Giá trị | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## Biến môi trường + +Thêm các biến này trong Settings → Environment variables: + +| Biến | Giá trị | +| ----------------------- | ---------------------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false` (tùy chọn) | +| `VITE_BRAND_NAME` | Tên thương hiệu tùy chỉnh (tùy chọn) | +| `VITE_BRAND_LOGO` | Đường dẫn logo tương đối so với `public/` (tùy chọn) | +| `VITE_FOOTER_TEXT` | Văn bản chân trang/bản quyền tùy chỉnh (tùy chọn) | +| `VITE_DEFAULT_LANGUAGE` | Ngôn ngữ giao diện mặc định, ví dụ `fr` (tùy chọn) | + +## Tệp cấu hình + +Tạo `_headers` trong thư mục `public` của bạn: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning Quan trọng +Các header `Cross-Origin-Embedder-Policy` và `Cross-Origin-Opener-Policy` là bắt buộc cho việc chuyển Word/ODT/Excel/PowerPoint sang PDF. Nếu thiếu, `SharedArrayBuffer` sẽ không khả dụng và engine LibreOffice WASM sẽ không khởi tạo được. +::: + +Tạo `_redirects` cho định tuyến SPA: + +``` +/* /index.html 200 +``` + +## Tên miền tùy chỉnh + +1. Vào dự án Pages của bạn +2. Nhấp "Custom domains" +3. Thêm tên miền của bạn +4. Cloudflare sẽ tự động cấu hình DNS nếu tên miền nằm trên Cloudflare + +## Ưu điểm + +- **Băng thông không giới hạn, miễn phí** +- **CDN toàn cầu** với hơn 300 điểm biên +- **HTTPS tự động** +- **Bản triển khai xem trước** cho pull request +- **Build nhanh** + +## Khắc phục sự cố + +### Tải lên tệp lớn + +Cloudflare Pages hỗ trợ tệp tối đa 25 MB. Các module WASM thường ổn, nhưng nếu bạn chạm giới hạn, hãy cân nhắc: + +```bash +# Split large files during build +npm run build +``` + +### Giới hạn kích thước Worker + +Nếu dùng Cloudflare Workers cho định tuyến nâng cao, lưu ý giới hạn 1 MB cho gói miễn phí. + +## CORS Proxy Worker (cho chữ ký số) + +Công cụ Chữ ký số cần một CORS proxy để lấy chuỗi chứng chỉ. Hãy triển khai worker đi kèm: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### Tính năng bảo mật + +| Tính năng | Mô tả | +| --------------------------- | ------------------------------- | +| **Hạn chế URL** | Chỉ cho phép URL chứng chỉ | +| **Giới hạn kích thước tệp** | Tối đa 10MB mỗi yêu cầu | +| **Giới hạn tốc độ** | 60 yêu cầu/IP/phút (cần KV) | +| **Chặn IP riêng** | Chặn localhost và các IP nội bộ | + +### Bật giới hạn tốc độ + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### Build với URL proxy + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +Hoặc với Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **Lưu ý:** Xem [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required) để biết cách thiết lập chữ ký HMAC. diff --git a/docs/vi/self-hosting/cors-proxy.md b/docs/vi/self-hosting/cors-proxy.md new file mode 100644 index 00000000..25213c4e --- /dev/null +++ b/docs/vi/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# CORS Proxy để lấy chứng chỉ + +Công cụ chữ ký số dùng một CORS proxy để lấy các chứng chỉ của bên cấp phát từ các Tổ chức cấp chứng chỉ (CA) bên ngoài. Điều này cần thiết vì nhiều máy chủ CA không đưa header CORS vào phản hồi, khiến trình duyệt không thể lấy trực tiếp. + +Ngoài ra, nhiều máy chủ CA phục vụ chứng chỉ qua HTTP thường. Khi BentoPDF của bạn chạy trên HTTPS, trình duyệt sẽ chặn các yêu cầu HTTP này (chính sách nội dung hỗn hợp). CORS proxy giải quyết cả hai vấn đề bằng cách chuyển yêu cầu qua một endpoint HTTPS với các header phù hợp. + +## Cách hoạt động + +Khi ký PDF bằng chứng chỉ: + +1. Thư viện `zgapdfsigner` cố gắng dựng một chuỗi chứng chỉ hoàn chỉnh +2. Nó lấy các chứng chỉ của bên cấp phát từ các URL nhúng trong phần mở rộng AIA (Authority Information Access) của chứng chỉ bạn +3. Các yêu cầu này được chuyển qua một CORS proxy thêm các header `Access-Control-Allow-Origin` cần thiết +4. Proxy trả dữ liệu chứng chỉ về trình duyệt + +## Tự lưu trữ CORS Proxy + +Nếu bạn tự lưu trữ BentoPDF, bạn cần triển khai CORS proxy của riêng mình để chữ ký số hoạt động với các chứng chỉ cần lấy chuỗi chứng chỉ. + +### Cách 1: Cloudflare Workers (khuyến nghị) + +1. **Cài đặt Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **Đăng nhập Cloudflare**: + + ```bash + wrangler login + ``` + +3. **Clone BentoPDF và cập nhật các origin được phép**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + Mở `cors-proxy-worker.js` và đổi mảng `ALLOWED_ORIGINS` thành tên miền của bạn: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning Quan trọng + Nếu không thay đổi này, proxy sẽ từ chối mọi yêu cầu từ trang của bạn với lỗi **403 Forbidden**. Mặc định chỉ cho phép yêu cầu từ `bentopdf.com`. + ::: + +4. **Triển khai proxy**: + + ```bash + wrangler deploy + ``` + + Ghi lại URL worker của bạn (ví dụ `https://bentopdf-cors-proxy.your-subdomain.workers.dev`). + +5. **Build lại BentoPDF với URL proxy**: + + Nếu dùng Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + Nếu build từ mã nguồn: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### Cách 2: Backend proxy tùy chỉnh + +Bạn cũng có thể tự tạo endpoint proxy. Các yêu cầu là: + +1. Chấp nhận yêu cầu GET với tham số truy vấn `url` +2. Lấy URL đó từ máy chủ của bạn (phía máy chủ không bị hạn chế CORS) +3. Trả phản hồi kèm các header sau: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Ví dụ triển khai bằng Express.js: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## Lưu ý bảo mật + +Cloudflare Worker đi kèm có nhiều biện pháp bảo mật: + +| Tính năng | Mô tả | +| --------------------------- | ------------------------------------------------------------------------------------- | +| **Xác thực origin** | Chỉ cho phép yêu cầu từ các tên miền trong `ALLOWED_ORIGINS` | +| **Hạn chế URL** | Chỉ cho phép URL chứng chỉ (`.crt`, `.cer`, `.pem`, `/certs/`, `/ocsp`, `/crl`) | +| **Chặn IP riêng** | Chặn dải riêng IPv4/IPv6, link-local, loopback, IP dạng thập phân và metadata đám mây | +| **An toàn Content-Type** | Chỉ trả về các MIME type chứng chỉ an toàn, chặn chèn content-type từ upstream | +| **Giới hạn kích thước tệp** | Truyền phản hồi theo luồng với giới hạn 10MB, hủy giữa chừng nếu vượt quá | +| **Giới hạn tốc độ** | 60 yêu cầu mỗi phút cho mỗi IP hoặc IPv6 /64 (cần KV, bỏ qua giới hạn khi KV lỗi) | +| **Chữ ký HMAC** | Ký phía máy khách tùy chọn (ngăn chặn lạm dụng thông thường) | + +### DNS rebinding (tự lưu trữ ngoài Cloudflare) + +Worker từ chối mọi URL phân giải ra IP riêng hoặc nội bộ. Nó không thể dùng danh sách cho phép cố định các host, vì URL chuỗi chứng chỉ trỏ đến bất kỳ CA nào đã cấp chứng chỉ (FNMT, CA doanh nghiệp, v.v.), nên đích đến không biết trước. Điều đó để lại một khoảng hở rebinding nhỏ: người điều hành DNS cho tên miền của họ có thể đưa một IP công khai cho bước kiểm tra an toàn và một IP riêng cho yêu cầu thật ngay sau đó. + +Trên Cloudflare điều này không khai thác được, vì Workers không thể truy cập IP riêng hay endpoint metadata `169.254.169.254`, nên rebind không dẫn đến đâu. Chỉ cần đừng cho worker thêm đường vào: đừng gắn Tunnel, Service hay binding mạng riêng (nó chỉ cần `RATE_LIMIT_KV`). + +Nếu bạn chạy nó ngoài Cloudflare (workerd, Node và tương tự) bên trong VPC, runtime _có thể_ truy cập IP nội bộ. Hãy đặt tường lửa egress phía trước và chặn các dải riêng: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `127.0.0.0/8`, `169.254.0.0/16`, và các dải IPv6 tương đương. Mã ứng dụng không thể thực thi điều đó khi bạn đã ra ngoài Cloudflare. + +## Tắt Proxy + +Nếu bạn không muốn dùng CORS proxy, hãy đặt biến môi trường thành chuỗi rỗng: + +``` +VITE_CORS_PROXY_URL= +``` + +**Lưu ý**: Khi không có proxy, việc ký bằng các chứng chỉ cần lấy chuỗi từ bên ngoài (như FNMT hoặc một số CA doanh nghiệp) sẽ thất bại với lỗi "Failed to fetch". + +## Khắc phục sự cố + +### "Signing error: TypeError: Failed to fetch" + +Điều này thường có nghĩa là: + +1. **Chưa cấu hình CORS proxy**: Đặt `VITE_CORS_PROXY_URL` và build lại +2. **Bị chặn nội dung hỗn hợp**: Trang của bạn dùng HTTPS nhưng URL bên cấp phát của chứng chỉ là HTTP. CORS proxy giải quyết việc này. +3. **CORS proxy từ chối origin của bạn**: Kiểm tra tên miền của bạn có trong mảng `ALLOWED_ORIGINS` trong `cors-proxy-worker.js` không + +### "403 Forbidden" từ proxy + +Tên miền của bạn không có trong danh sách `ALLOWED_ORIGINS`. Sửa `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +Sau đó triển khai lại: `npx wrangler deploy` + +### Kiểm tra proxy + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### Chứng chỉ hoạt động không cần proxy + +Một số chứng chỉ chứa đủ chuỗi trong tệp P12/PFX và không cần lấy từ bên ngoài: + +- Chứng chỉ tự ký +- Một số CA thương mại đóng gói sẵn các chứng chỉ trung gian +- Chứng chỉ bạn tự ghép đủ chuỗi diff --git a/docs/vi/self-hosting/docker.md b/docs/vi/self-hosting/docker.md new file mode 100644 index 00000000..6df25930 --- /dev/null +++ b/docs/vi/self-hosting/docker.md @@ -0,0 +1,622 @@ +# Triển khai với Docker / Podman + +Cách dễ nhất để tự lưu trữ BentoPDF trong môi trường production. + +> [!IMPORTANT] +> **Các header bắt buộc cho chuyển đổi tệp Office** +> +> Các công cụ dựa trên LibreOffice (chuyển đổi Word, Excel, PowerPoint) cần các header HTTP sau để hỗ trợ `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Trang cũng phải được phục vụ từ một ngữ cảnh bảo mật (secure context). `http://localhost` dùng được để thử nghiệm cục bộ, nhưng `http://192.168.x.x` hoặc các IP LAN khác thường không đạt điều kiện, nên chuyển đổi Office qua HTTP thường sẽ thất bại dù các header đã có. +> +> Các container image chính thức đã bao gồm những header này. Nếu dùng reverse proxy (Traefik, Caddy, v.v.), hãy đảm bảo các header được giữ nguyên hoặc được thêm vào, và dùng HTTPS khi truy cập không qua loopback. + +> [!TIP] +> **Người dùng Podman:** Mọi lệnh `docker` đều chạy được với Podman bằng cách thay `docker` bằng `podman` và `docker-compose` bằng `podman-compose`. + +## Bắt đầu nhanh + +> [!TIP] +> BentoPDF có hai bản build: +> +> - **Bản Tự lưu trữ** - `ghcr.io/alam00000/bentopdf-simple:latest`. Có mọi công cụ PDF, **không** có phần giao diện quảng bá (không hero, FAQ, lời chứng thực, chân trang). Dùng cho triển khai nội bộ/nhóm/tổ chức. Đây **không** phải bản "lite" bị giảm tính năng. +> - **Bản Thương mại** - `ghcr.io/alam00000/bentopdf:latest`. Toàn bộ trang quảng bá, được chính bentopdf.com và các chủ sở hữu giấy phép thương mại dùng cho triển khai công khai. +> +> Nếu không chắc: hãy pull bản Tự lưu trữ. + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +Tạo `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +Chạy: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Tự build image + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +Build và chạy: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## Biến môi trường + +| Biến | Mô tả | Mặc định | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | Build biến thể Tự lưu trữ (ẩn phần giao diện quảng bá của bentopdf.com: hero, FAQ, lời chứng thực, chân trang). Mọi công cụ PDF vẫn còn. | `false` | +| `BASE_URL` | Triển khai vào thư mục con | `/` | +| `VITE_WASM_PYMUPDF_URL` | URL module WASM PyMuPDF | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | URL module WASM Ghostscript | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | URL module WASM CoherentPDF | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | URL tệp script worker OCR | _(trống; dùng CDN mặc định của Tesseract.js)_ | +| `VITE_TESSERACT_CORE_URL` | Thư mục runtime lõi OCR | _(trống; dùng CDN mặc định của Tesseract.js)_ | +| `VITE_TESSERACT_LANG_URL` | Thư mục traineddata OCR | _(trống; dùng CDN mặc định của Tesseract.js)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | Các ngôn ngữ OCR hiển thị trong giao diện, phân tách bằng dấu phẩy | _(trống; hiển thị toàn bộ danh mục)_ | +| `VITE_OCR_FONT_BASE_URL` | Thư mục phông chữ lớp văn bản OCR | _(trống; dùng URL phông Noto từ xa)_ | +| `VITE_DEFAULT_LANGUAGE` | Ngôn ngữ giao diện mặc định | `en` | +| `VITE_BRAND_NAME` | Tên thương hiệu tùy chỉnh | `BentoPDF` | +| `VITE_BRAND_LOGO` | Đường dẫn logo tương đối so với `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Văn bản chân trang/bản quyền tùy chỉnh | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | ID các công cụ cần ẩn, phân tách bằng dấu phẩy | _(trống; bật mọi công cụ)_ | +| `DISABLE_GITHUB_STARS` | Bỏ qua việc lấy số sao GitHub khi tải trang và loại `api.github.com` khỏi CSP. Các bản build Simple Mode luôn bỏ qua. | `false` | +| `SITE_URL` | URL công khai được ghi vào các liên kết canonical, hreflang và sitemap. Hãy giữ mặc định trừ khi bạn muốn công cụ tìm kiếm coi bản triển khai của bạn là một trang riêng. | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | Với `SITE_URL` tùy chỉnh, mọi trang được đánh dấu `noindex` để bản của bạn không cạnh tranh với bentopdf.com trong kết quả tìm kiếm. Đặt `true` để cho phép công cụ tìm kiếm lập chỉ mục. | `false` | + +URL các module WASM đã được cấu hình sẵn với CDN mặc định, nên mọi tính năng nâng cao hoạt động ngay. Hãy ghi đè các URL này cho môi trường air-gapped hoặc tự lưu trữ. + +### Công cụ tìm kiếm + +Theo mặc định, mọi trang đều chỉ công cụ tìm kiếm về bentopdf.com như bản gốc, nên bản triển khai của bạn không bị coi là trùng lặp. Bạn không cần thay đổi gì cho một bản riêng tư hoặc nội bộ. + +- **Giữ bản của bạn hoàn toàn ngoài kết quả tìm kiếm:** chạy container với `-e ROBOTS_NOINDEX=true`. Chỉ cần khởi động lại, không cần build lại. +- **Biến bản của bạn thành một trang riêng trong kết quả tìm kiếm:** build với `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true`. Nếu thiếu `ALLOW_INDEXING=true`, `SITE_URL` tùy chỉnh sẽ đánh dấu mọi trang là `noindex`. + +### Content-Security-Policy + +Image nginx đi kèm header `Content-Security-Policy` ở chế độ thực thi. Các chỉ thị `script-src`, `connect-src` và `font-src` của CSP được **tạo tại thời điểm build** từ các biến URL `VITE_*` ở trên: mọi host bạn truyền qua `--build-arg` đều tự động được thêm vào chính sách. + +Do đó: + +- Nếu bạn ghi đè `VITE_CORS_PROXY_URL` hoặc `VITE_WASM_*_URL` lúc build, CSP tự động cho phép các origin đó, không cần cấu hình thêm. +- Với URL trên `cdn.jsdelivr.net`, `script-src` chỉ cho phép đúng thư mục gói có phiên bản, ví dụ `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`, không phải toàn bộ CDN. jsDelivr phục vụ bất kỳ gói npm hoặc kho GitHub công khai nào, nên cho phép cả host sẽ để chúng chạy trên bản triển khai của bạn. URL trên mọi host khác được cho phép theo origin. +- Nếu bạn cấu hình URL WASM tùy chỉnh lúc _chạy_ qua trang Cài đặt nâng cao trong ứng dụng, các origin đó **không** có trong CSP và trình duyệt sẽ chặn các yêu cầu tới chúng. Điều này cũng áp dụng cho phiên bản khác của cùng một gói trên `cdn.jsdelivr.net`, vì chỉ phiên bản đặt lúc build được cho phép. Cấu hình lúc chạy dành cho thử nghiệm; với URL tùy chỉnh lâu dài, hãy đặt build arg `VITE_*` tương ứng. +- Các bản triển khai air-gapped ghi đè cả ba giá trị `VITE_WASM_*_URL` cũng sẽ bị loại các thư mục gói `cdn.jsdelivr.net` đó khỏi CSP (mỗi giá trị mặc định được thay thế, không phải nối thêm). Các mặc định Tesseract OCR trên `cdn.jsdelivr.net` vẫn nằm trong chính sách cho đến khi bạn cũng đặt ba giá trị `VITE_TESSERACT_*`. Tương tự, đặt `VITE_CORS_PROXY_URL` sẽ thay thế mặc định công khai `bentopdf-cors-proxy.bentopdf.workers.dev`. + +CSP có `'unsafe-eval'` trong `script-src` vì runtime LibreOffice WASM (dùng cho các công cụ chuyển đổi Word/Excel/PowerPoint) và thư viện ảnh wasm-vips (dùng cho PDF sang TIFF) biên dịch mã điều phối nội bộ qua `new Function()`. Gỡ nó sẽ làm hỏng các công cụ này. Nếu bạn build ở `SIMPLE_MODE` (không có LibreOffice) và không cần PDF sang TIFF, bạn có thể tự sửa tệp `security-headers.conf` được tạo ra để bỏ `'unsafe-eval'` cho chính sách chặt hơn. + +Với OCR, hãy để trống các biến `VITE_TESSERACT_*` để dùng tài nguyên trực tuyến mặc định, hoặc đặt cả ba cùng lúc cho OCR tự lưu trữ/ngoại tuyến. Ghi đè OCR một phần sẽ bị từ chối vì worker, runtime lõi và thư mục traineddata phải khớp nhau. Để có đầu ra PDF có thể tìm kiếm hoàn toàn ngoại tuyến, hãy đặt thêm `VITE_OCR_FONT_BASE_URL` để phông chữ lớp văn bản OCR được tải từ máy chủ nội bộ của bạn thay vì URL phông Noto công khai. + +`VITE_DEFAULT_LANGUAGE` đặt ngôn ngữ giao diện cho khách truy cập lần đầu. Giá trị được hỗ trợ: `en`, `ar`, `be`, `fr`, `de`, `es`, `zh`, `zh-TW`, `vi`, `tr`, `id`, `it`, `pt`, `nl`, `da`. Người dùng vẫn có thể đổi ngôn ngữ, giá trị này chỉ đổi mặc định. + +Ví dụ: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### Thương hiệu tùy chỉnh + +Thay logo, tên và văn bản chân trang BentoPDF mặc định bằng của riêng bạn. Đặt tệp logo vào thư mục `public/` (hoặc dùng một ảnh có sẵn), sau đó truyền các biến thương hiệu lúc build: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Thương hiệu hoạt động ở cả chế độ đầy đủ và Simple Mode, và có thể kết hợp với mọi tùy chọn build khác. + +### Tắt một số công cụ + +Ẩn công cụ khỏi giao diện để đáp ứng yêu cầu tuân thủ hoặc bảo mật. Các công cụ bị tắt sẽ bị gỡ khỏi trang chủ, kết quả tìm kiếm, phím tắt và trình tạo quy trình. Truy cập trực tiếp bằng URL sẽ hiển thị trang "công cụ không khả dụng". + +ID công cụ là URL của trang bỏ `.html`. Ví dụ, nếu công cụ nằm ở `bentopdf.com/edit-pdf.html`, ID là `edit-pdf`. + +#### Tìm ID công cụ + +Cách dễ nhất: mở bất kỳ công cụ nào trong BentoPDF và nhìn vào URL. Phần cuối của đường dẫn (bỏ `.html`) chính là ID công cụ. + +
+Danh sách đầy đủ ID công cụ + +**Chỉnh sửa & Chú thích:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**Chuyển sang PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**Chuyển từ PDF:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**Sắp xếp & Quản lý:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**Tối ưu hóa & Sửa chữa:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**Bảo mật:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### Cách 1: Lúc build (build arg của Docker) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +Cách này ghi danh sách công cụ bị tắt vào bundle JavaScript. Cần build lại để thay đổi. + +#### Cách 2: Lúc chạy (config.json) + +Gắn một tệp `config.json` vào thư mục được phục vụ, không cần build lại: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Hoặc với Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +Có thể kết hợp cả hai cách, các danh sách sẽ được gộp. Nếu một công cụ xuất hiện ở một trong hai, nó sẽ bị tắt. + +#### Tắt tính năng của trình chỉnh sửa + +Bạn cũng có thể tắt các tính năng cụ thể trong Trình chỉnh sửa PDF (ví dụ che thông tin, chú thích, biểu mẫu) mà không cần tắt cả công cụ chỉnh sửa. Thêm `editorDisabledCategories` vào `config.json`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+Danh sách đầy đủ danh mục của trình chỉnh sửa + +**Zoom:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**Chú thích:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**Hình dạng:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**Biểu mẫu:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**Che thông tin:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**Tài liệu:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**Trang:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**Bảng điều khiển:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**Công cụ:** `tools`, `pan`, `pointer`, `capture` + +**Lựa chọn:** `selection`, `selection-copy` + +**Lịch sử:** `history`, `history-undo`, `history-redo` + +
+ +Các danh mục có cấu trúc phân cấp: tắt một mục cha (ví dụ `annotation`) sẽ tắt toàn bộ mục con của nó. + +### Tắt bộ đếm sao GitHub + +Thanh điều hướng hiển thị số sao GitHub trực tiếp, được lấy từ `api.github.com` khi tải trang. Đây là yêu cầu bên ngoài duy nhất không phục vụ một tính năng PDF. Hãy tắt nó lúc build để gỡ mã lấy dữ liệu khỏi bundle và loại `api.github.com` khỏi Content-Security-Policy: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Các bản build Simple Mode (`bentopdf-simple`) luôn bỏ qua bộ đếm sao, cờ này chỉ cần cho bản Thương mại hoặc các bản build đầy đủ tùy chỉnh. + +### URL WASM tùy chỉnh (Air-Gapped / Tự lưu trữ) + +> [!IMPORTANT] +> URL WASM được ghi vào JavaScript lúc **build**. Các tệp WASM được **trình duyệt của người dùng** tải về lúc chạy, Docker không tải chúng trong quá trình build. Với mạng air-gapped, bạn phải lưu trữ các tệp WASM trên một máy chủ nội bộ mà trình duyệt truy cập được. + +**Quy trình air-gapped đầy đủ:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Dùng các mã được in bởi `bash scripts/prepare-airgap.sh --list-ocr-languages`, hoặc tìm theo tên bằng `bash scripts/prepare-airgap.sh --search-ocr-language `, cho `--ocr-languages`. Khi build với một tập con OCR giới hạn, hãy truyền cùng các mã đó cho `VITE_TESSERACT_AVAILABLE_LANGUAGES` để ứng dụng chỉ hiển thị các ngôn ngữ đã đóng gói. Để có đầu ra OCR ngoại tuyến đầy đủ, hãy lưu trữ thêm thư mục `ocr-fonts/` đi kèm và trỏ `VITE_OCR_FONT_BASE_URL` tới nó. + +Đặt một biến thành chuỗi rỗng để tắt module đó (người dùng phải tự cấu hình qua Cài đặt nâng cao). + +## Cổng tùy chỉnh + +Theo mặc định, BentoPDF lắng nghe ở cổng `8080` bên trong container. Để đổi, hãy đặt biến môi trường `PORT` lúc chạy: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| Biến | Mô tả | Mặc định | +| ------ | ------------------------------------ | -------- | +| `PORT` | Cổng lắng nghe Nginx trong container | `8080` | + +Cách này hoạt động với cả Dockerfile tiêu chuẩn và nonroot. + +## User ID tùy chỉnh (PUID/PGID) + +Với các môi trường yêu cầu chạy bằng một người dùng không phải root cụ thể (thiết bị NAS, Kubernetes có security context, chính sách của tổ chức), BentoPDF cung cấp một Dockerfile riêng hỗ trợ PUID/PGID kiểu LSIO. + +### Build và chạy + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### Biến môi trường + +| Biến | Mô tả | Mặc định | +| -------------- | -------------------- | -------- | +| `PUID` | User ID để chạy | `1000` | +| `PGID` | Group ID để chạy | `1000` | +| `PORT` | Cổng lắng nghe Nginx | `8080` | +| `DISABLE_IPV6` | Tắt listener IPv6 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### Cách hoạt động + +Container khởi động bằng root, tạo một người dùng với PUID/PGID đã chỉ định, điều chỉnh quyền sở hữu trên mọi thư mục có thể ghi, rồi hạ quyền bằng `su-exec`. Tiến trình nginx chạy hoàn toàn dưới người dùng bạn chỉ định. + +> [!NOTE] +> `Dockerfile` tiêu chuẩn dùng `nginx-unprivileged` (UID 101) và được khuyến nghị cho hầu hết triển khai. Chỉ dùng `Dockerfile.nonroot` khi bạn cần một UID/GID cụ thể. + +> [!WARNING] +> PUID/PGID không được là `0` (root). Entrypoint kiểm tra đầu vào và sẽ thoát với lỗi nếu giá trị không hợp lệ. + +## Với Traefik (Reverse Proxy) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## Với Caddy (Reverse Proxy) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## Giới hạn tài nguyên + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet (tích hợp Systemd) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) cho phép bạn chạy container Podman như các dịch vụ systemd. Rất phù hợp cho triển khai production trên hệ thống Linux. + +### Thiết lập Quadlet cơ bản + +Tạo tệp unit container tại `~/.config/containers/systemd/bentopdf.container` (người dùng) hoặc `/etc/containers/systemd/bentopdf.container` (hệ thống): + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Bật và khởi động + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> Với triển khai toàn hệ thống, dùng `systemctl` không kèm cờ `--user` và đặt tệp trong `/etc/containers/systemd/`. + +### Quadlet với kiểm tra sức khỏe + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### Tự động cập nhật với Quadlet + +Podman có thể tự động cập nhật container khi có image mới: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Cấu hình mạng Quadlet + +Để cấu hình mạng tùy chỉnh, tạo tệp mạng `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +Sau đó tham chiếu nó trong tệp container của bạn: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## Cập nhật + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/vi/self-hosting/hostinger.md b/docs/vi/self-hosting/hostinger.md new file mode 100644 index 00000000..21abddd9 --- /dev/null +++ b/docs/vi/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# Triển khai lên Hostinger + +[Hostinger](https://hostinger.com) là nhà cung cấp shared hosting phổ biến. Hướng dẫn này nói về cách triển khai BentoPDF lên shared hosting của Hostinger. + +## Yêu cầu + +- Gói hosting Hostinger có quyền truy cập File Manager +- Đã cài Node.js trên máy để build + +## Bước 1: Build dự án + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Các tệp đã build sẽ nằm trong thư mục `dist`. + +## Bước 2: Tải lên Hostinger + +### Triển khai trên tên miền gốc + +1. Đăng nhập vào tài khoản Hostinger của bạn +2. Vào **File Manager** → **public_html** +3. **Xóa** mọi tệp hiện có (sao lưu nếu cần) +4. **Tải lên** toàn bộ nội dung thư mục `dist` trên máy của bạn vào `public_html` + +### Triển khai trong thư mục con + +Nếu triển khai vào thư mục con (ví dụ `yourdomain.com/pdf-tools/`): + +1. Build với base URL đúng: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. Tạo thư mục trong Hostinger: + - Vào **File Manager** → **public_html** + - Tạo thư mục mới: `pdf-tools` +3. Tải toàn bộ nội dung `dist` lên `public_html/pdf-tools/` + +## Bước 3: Tạo tệp .htaccess + +Tạo tệp `.htaccess` ở thư mục gốc của bản triển khai (`public_html` hoặc `public_html/pdf-tools/`): + +::: warning Quan trọng +Với triển khai trong thư mục con, đổi `RewriteBase /` thành `RewriteBase /pdf-tools/` (hoặc tên thư mục của bạn). +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## Ví dụ .htaccess cho thư mục con + +Với `yourdomain.com/pdf-tools/`, hãy cập nhật các dòng sau: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## Khắc phục sự cố + +### Tệp WASM không tải được + +Đảm bảo các MIME type được đặt đúng trong `.htaccess`: + +```apache +AddType application/wasm .wasm +``` + +### Công cụ LibreOffice không hoạt động + +Các header bảo mật rất quan trọng cho SharedArrayBuffer: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +Nếu các header không được áp dụng, hãy liên hệ bộ phận hỗ trợ của Hostinger để bật `mod_headers`. + +### Lỗi 404 khi tải lại trang + +Đảm bảo quy tắc đuôi `.html` và các tuyến ngôn ngữ được cấu hình đúng. BentoPDF dùng các tệp HTML tĩnh, không dùng định tuyến SPA: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### Giới hạn tải tệp lên + +Hostinger có thể giới hạn kích thước tệp. Hãy tải các tệp WASM lên riêng nếu tải hàng loạt thất bại. diff --git a/docs/vi/self-hosting/index.md b/docs/vi/self-hosting/index.md new file mode 100644 index 00000000..94fc8562 --- /dev/null +++ b/docs/vi/self-hosting/index.md @@ -0,0 +1,538 @@ +# Hướng dẫn tự lưu trữ + +BentoPDF có thể được tự lưu trữ trên hạ tầng của riêng bạn. Hướng dẫn này trình bày nhiều tùy chọn triển khai. + +## Bắt đầu nhanh với Docker / Podman + +Cách nhanh nhất để tự lưu trữ BentoPDF: + +> [!TIP] +> BentoPDF có hai bản dựng: +> +> - **Bản dựng Self-Hosted**: `ghcr.io/alam00000/bentopdf-simple:latest`. Có mọi công cụ PDF, **không** có phần giao diện tiếp thị (không có hero, FAQ, lời chứng thực, chân trang). Dùng bản này cho các triển khai nội bộ, theo nhóm hoặc tổ chức. Đây **không phải** là phiên bản "lite" bị giảm tính năng. +> - **Bản dựng Commercial**: `ghcr.io/alam00000/bentopdf:latest`. Toàn bộ trang tiếp thị, được chính bentopdf.com và các chủ sở hữu giấy phép thương mại chạy triển khai công khai sử dụng. +> +> Nếu còn phân vân: hãy dùng bản dựng Self-Hosted. + +> [!IMPORTANT] +> Chuyển đổi tệp Office cần `SharedArrayBuffer`, nghĩa là ứng dụng phải được cô lập cross-origin và phục vụ từ một ngữ cảnh bảo mật. Image chính thức đã gửi sẵn các header COOP/COEP cần thiết, nhưng trình duyệt vẫn tắt `SharedArrayBuffer` trên các origin HTTP mạng nội bộ như `http://192.168.x.x`. +> +> Chỉ dùng `http://localhost` để thử nghiệm trên cùng một thiết bị. Nếu người dùng truy cập BentoPDF qua IP hoặc tên máy trong mạng LAN, hãy dùng HTTPS. + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +Hoặc với Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet (Linux Systemd) + +Chạy BentoPDF như một dịch vụ systemd. Tạo `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +Xem [hướng dẫn triển khai Docker](/vi/self-hosting/docker) để biết đầy đủ tài liệu về Quadlet. + +## Dựng từ mã nguồn + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## Tùy chọn cấu hình + +### Bản dựng Self-Hosted (Simple Mode) + +Bản dựng Self-Hosted (image `bentopdf-simple`, còn gọi là Simple Mode) **giống hệt về chức năng** với bản dựng Commercial: mọi công cụ PDF đều có và hoạt động như nhau. Nó chỉ ẩn phần giao diện tiếp thị vốn chỉ phù hợp với chính bentopdf.com hoặc một triển khai công khai thương mại. **Đây không phải là phiên bản bị giảm tính năng hay "lite".** + +**Những gì bản dựng Self-Hosted ẩn đi** (chỉ là phần hiển thị, không có tính năng PDF nào bị gỡ bỏ): + +- Thanh điều hướng, phần hero, phần tính năng, FAQ, lời chứng thực, chân trang +- Đổi tiêu đề trang thành "Công cụ PDF" + +**Những gì bản dựng Self-Hosted giữ lại** (mọi thứ thực sự xử lý PDF): + +- Mọi công cụ PDF (gộp, tách, chỉnh sửa, ký, OCR, chuyển đổi Office, v.v.) +- Hỗ trợ thương hiệu tùy chỉnh, toàn bộ cấu hình lúc dựng và lúc chạy + +Bản dựng Commercial (`ghcr.io/alam00000/bentopdf:latest`) là bản vận hành chính bentopdf.com và được các chủ sở hữu giấy phép thương mại chạy triển khai công khai sử dụng. Nó bổ sung hero, FAQ, lời chứng thực và chân trang, những thứ không phù hợp với một công cụ nội bộ. + +Nếu bạn tự lưu trữ BentoPDF cho nhóm, tổ chức hoặc làm công cụ nội bộ, hãy dùng bản dựng Self-Hosted: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +Xem [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) để biết chi tiết. + +### Bản dựng Commercial (triển khai công khai với thương hiệu riêng) + +Bản dựng Commercial (image `bentopdf`, không có hậu tố `-simple`) là bản vận hành chính bentopdf.com. Nó gồm toàn bộ trang tiếp thị (hero, tính năng, FAQ, lời chứng thực, chân trang) cùng mọi công cụ PDF. Hãy dùng bản dựng này khi bạn muốn **triển khai BentoPDF thành dịch vụ PDF công khai dưới thương hiệu của riêng bạn**, ví dụ: + +- Bạn chạy BentoPDF như một SaaS cho người dùng cuối trên tên miền của riêng bạn +- Bạn muốn có trải nghiệm trang chủ (phần tiếp thị cùng công cụ), không chỉ giao diện công cụ trơn +- Bạn là chủ sở hữu giấy phép thương mại và nhúng BentoPDF vào một sản phẩm thương mại + +**Chạy nguyên bản** (thương hiệu BentoPDF, hữu ích để xem trước bản dựng): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**Dựng với thương hiệu riêng** (quy trình thương mại điển hình): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +Mọi tùy chọn lúc dựng khác (`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, ghi đè URL WASM, v.v.) hoạt động giống như trên bản dựng Self-Hosted. + +::: warning Giấy phép +Chạy bản dựng Commercial được phép theo một trong hai tùy chọn giấy phép của BentoPDF: + +- **AGPL-3.0** (miễn phí): được phép nếu triển khai của bạn công bố toàn bộ mã nguồn theo AGPL, bao gồm mọi chỉnh sửa thương hiệu và logic nghiệp vụ liên quan. +- **Giấy phép thương mại** ($79 trọn đời): bắt buộc cho các triển khai mã nguồn đóng / độc quyền, nơi bạn không mở mã nguồn của bản fork thương hiệu hay mã nghiệp vụ. + +Xem [trang Giấy phép](https://www.bentopdf.com/licensing) để so sánh đầy đủ. Các mô-đun WASM theo giấy phép AGPL (PyMuPDF, Ghostscript, CoherentPDF) được tải từ CDN lúc chạy, nên chúng không nằm trong image của bạn và không thay đổi tình trạng giấy phép của bạn. +::: + +### Base URL + +Triển khai vào một thư mục con: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### Thương hiệu tùy chỉnh + +Thay logo, tên và văn bản chân trang mặc định của BentoPDF bằng của bạn ngay lúc dựng: + +| Variable | Mô tả | Mặc định | +| ------------------ | -------------------------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | Tên thương hiệu hiển thị ở đầu và chân trang | `BentoPDF` | +| `VITE_BRAND_LOGO` | Đường dẫn logo, tính từ `public/` | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | Văn bản chân trang / bản quyền tùy chỉnh | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +Hoặc qua Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +Thương hiệu hoạt động ở cả chế độ đầy đủ lẫn Simple Mode, và có thể kết hợp với mọi tùy chọn lúc dựng khác (`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`). + +### Tắt công cụ cụ thể + +Ẩn từng công cụ vì lý do tuân thủ hoặc bảo mật. Công cụ bị tắt sẽ bị loại khỏi trang chủ, tìm kiếm, phím tắt, trình tạo quy trình và truy cập trực tiếp bằng URL. + +ID công cụ là URL của trang bỏ đi `.html`. Hãy mở bất kỳ công cụ nào và xem URL (ví dụ: `edit-pdf`, `sign-pdf`, `encrypt-pdf`). + +**Lúc dựng** (được đưa thẳng vào bundle): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**Lúc chạy** (không cần dựng lại, gắn một tệp `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +Có thể kết hợp cả hai cách, các danh sách sẽ được gộp lại. + +Bạn cũng có thể tắt một số tính năng bên trong Trình chỉnh sửa PDF (ví dụ: biên tập che thông tin) mà không cần tắt cả công cụ, bằng cách thêm `editorDisabledCategories` vào `config.json`. Xem [hướng dẫn Docker](/vi/self-hosting/docker#tat-tinh-nang-cua-trinh-chinh-sua) để biết danh sách đầy đủ các nhóm. + +## Hướng dẫn triển khai + +Chọn nền tảng của bạn: + +- [Vercel](/vi/self-hosting/vercel) +- [Netlify](/vi/self-hosting/netlify) +- [Cloudflare Pages](/vi/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/vi/self-hosting/aws) +- [Hostinger](/vi/self-hosting/hostinger) +- [Nginx](/vi/self-hosting/nginx) +- [Apache](/vi/self-hosting/apache) +- [Docker](/vi/self-hosting/docker) +- [Kubernetes](/vi/self-hosting/kubernetes) +- [CORS Proxy](/vi/self-hosting/cors-proxy) - Bắt buộc cho chữ ký số + +## Các sự cố thường gặp + +### Chuyển Word / ODT / Excel / PowerPoint sang PDF bị treo (SharedArrayBuffer không khả dụng) + +**Triệu chứng**: Các chuyển đổi tài liệu dựa trên LibreOffice (Word, ODT, Excel, PowerPoint sang PDF) bị treo ở khoảng 55% hoặc không thể bắt đầu. Bảng điều khiển trình duyệt có thể hiển thị: + +> `ReferenceError: SharedArrayBuffer is not defined` + +...hoặc `window.crossOriginIsolated` trả về `false`, hoặc quá trình biên dịch WASM báo `expected magic word 00 61 73 6d, found 1f 8b 08 08`. + +**Nguyên nhân**: LibreOffice WASM cần `SharedArrayBuffer`, thứ mà trình duyệt chỉ bật khi trang được **cô lập cross-origin** VÀ được phục vụ từ một **ngữ cảnh bảo mật**. Điều đó nghĩa là cần đảm bảo hai điều: + +1. Mọi phản hồi đều có cả hai header: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. Trang được phục vụ từ `https://...` hoặc `http://localhost`. HTTP thường trên IP mạng LAN (ví dụ `http://192.168.x.x`) KHÔNG được coi là bảo mật: trình duyệt tắt `SharedArrayBuffer` ở đó. + +Việc lệch `00 61 73 6d / 1f 8b 08 08` là một triệu chứng phụ riêng: các tệp `.wasm.gz` / `.data.gz` đã nén sẵn thiếu header phản hồi `Content-Encoding: gzip`, nên trình duyệt nhận dữ liệu gzip thô thay vì WASM đã giải nén. + +**Cách khắc phục**: xem hướng dẫn triển khai riêng của nền tảng bạn để biết cấu hình chính xác: + +- [Nginx →](/vi/self-hosting/nginx#chuyen-word-odt-excel-sang-pdf-khong-hoat-đong) +- [Apache →](/vi/self-hosting/apache#chuyen-word-odt-excel-sang-pdf-khong-hoat-đong) +- [AWS S3 + CloudFront →](/vi/self-hosting/aws#buoc-3b-chinh-sach-header-phan-hoi-bat-buoc-cho-libreoffice-wasm) +- [Cloudflare Pages →](/vi/self-hosting/cloudflare#tep-cau-hinh) (tệp `_headers`) +- [Netlify →](/vi/self-hosting/netlify#chuyen-word-odt-excel-sang-pdf-bi-đung-o-55) (`netlify.toml`) +- [Vercel →](/vi/self-hosting/vercel#chuyen-word-odt-excel-sang-pdf-khong-hoat-đong) (`vercel.json`) +- [Hostinger →](/vi/self-hosting/hostinger#cong-cu-libreoffice-khong-hoat-đong) (`.htaccess`) +- [Kubernetes →](/vi/self-hosting/kubernetes#đam-bao-cac-header-sharedarraybuffer-van-hoat-đong-ingress-gateway) +- **Docker**: được xử lý tự động bởi cấu hình nginx đi kèm, không cần làm gì thêm. + +**Kiểm tra**: mở Console của DevTools trên bất kỳ trang BentoPDF nào và chạy: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Nếu trang dùng HTTPS hoặc `http://localhost` VÀ cả hai header COEP/COOP đều có trên mọi phản hồi, cả hai phép kiểm tra sẽ đạt. Nếu bạn đang dùng `http://192.168.x.x` hoặc một origin HTTP không phải loopback khác, hãy dùng HTTPS: không có cách khắc phục nào chỉ bằng header. + +### Tệp `.mjs` được phục vụ với `application/octet-stream` + +**Triệu chứng**: Ký PDF / Form Filler / một số công cụ khác hiển thị trình xem trống hoặc không tải được. Bảng điều khiển trình duyệt báo: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**Nguyên nhân**: Máy chủ web hoặc reverse proxy của bạn không có ánh xạ kiểu MIME cho tệp `.mjs` (trình xem PDF đi kèm dùng module ES với phần mở rộng này). Nhiều cấu hình máy chủ mặc định dùng `application/octet-stream` cho các phần mở rộng không nhận ra, và trình duyệt từ chối thực thi chúng như module ES. + +**Cách khắc phục**: xem hướng dẫn triển khai riêng của nền tảng bạn để biết đoạn cấu hình chính xác: + +- [Nginx →](/vi/self-hosting/nginx#ky-pdf-hoac-form-filler-hien-thi-trinh-xem-trong-loi-mime-mjs) +- [Apache →](/vi/self-hosting/apache#ky-pdf-hoac-form-filler-hien-thi-trinh-xem-trong-loi-mime-mjs) +- [AWS S3 + CloudFront →](/vi/self-hosting/aws#buoc-2-build-va-tai-len) (xem `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/vi/self-hosting/kubernetes#loi-kieu-mime-cua-mjs-ky-pdf-iframe-form-filler-bi-trong) +- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: được xử lý tự động, không cần làm gì thêm. + +**Kiểm tra**: mở DevTools → tab Network, tìm yêu cầu `.mjs` bị lỗi, xem header phản hồi `Content-Type`. Giá trị phải là `application/javascript`. Nếu vẫn là `application/octet-stream`, có thể một reverse proxy hoặc CDN bên ngoài đang tự đoán lại kiểu: hãy kiểm tra từng lớp trong chuỗi phục vụ của bạn. + +## Cấu hình WASM (thành phần AGPL) + +BentoPDF **không đóng gói** các thư viện xử lý theo giấy phép AGPL trong mã nguồn của mình, nhưng **cấu hình sẵn các URL CDN** để mọi tính năng hoạt động ngay, không cần thiết lập thủ công. + +::: tip Không cần cấu hình theo mặc định +Từ v2.0.0, các mô-đun WASM được cấu hình sẵn để tải từ CDN jsDelivr thông qua biến môi trường. Mọi tính năng nâng cao hoạt động ngay mà người dùng không cần cấu hình gì. +::: + +| Thành phần | Giấy phép | Tính năng | +| --------------- | --------- | ------------------------------------------------------------- | +| **PyMuPDF** | AGPL-3.0 | Chuyển đổi EPUB/MOBI/FB2/XPS, trích xuất ảnh, trích xuất bảng | +| **Ghostscript** | AGPL-3.0 | Chuyển đổi PDF/A, nén, chỉnh nghiêng, rasterize | +| **CoherentPDF** | AGPL-3.0 | Mục lục, tệp đính kèm, gộp PDF kèm dấu trang | + +### Biến môi trường mặc định + +Các biến này được đặt trong `.env.production` và đưa thẳng vào bản dựng: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### Ghi đè URL WASM + +Bạn có thể ghi đè các giá trị mặc định lúc dựng cho các triển khai tùy chỉnh: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +Để tắt hoàn toàn một mô-đun (yêu cầu người dùng tự cấu hình qua Cài đặt nâng cao), hãy đặt biến của nó thành chuỗi rỗng. + +Với OCR, hoặc để trống tất cả biến `VITE_TESSERACT_*` và dùng các tài nguyên trực tuyến mặc định, hoặc đặt đồng thời các URL worker/core/lang cho OCR tự lưu trữ / ngoại tuyến. Nếu bạn chỉ đóng gói một số ngôn ngữ OCR, hãy đặt thêm `VITE_TESSERACT_AVAILABLE_LANGUAGES` với cùng các mã phân tách bằng dấu phẩy để giao diện chỉ đưa ra các ngôn ngữ đã cài và các lựa chọn không được hỗ trợ báo lỗi mô tả rõ ràng. Để xuất PDF có thể tìm kiếm hoàn toàn ngoại tuyến, hãy đặt thêm `VITE_OCR_FONT_BASE_URL` trỏ đến thư mục nội bộ phục vụ các phông chữ OCR đi kèm. + +Người dùng cũng có thể ghi đè các giá trị mặc định này bất cứ lúc nào qua **Cài đặt nâng cao** trong giao diện: các ghi đè của người dùng lưu trong trình duyệt được ưu tiên hơn giá trị mặc định của môi trường. + +### Triển khai cách ly mạng / ngoại tuyến + +Dành cho các mạng không có internet (chính phủ, y tế, tài chính, v.v.). Các URL WASM được đưa thẳng vào JavaScript **lúc dựng**, còn các tệp WASM thực tế được **trình duyệt của người dùng** tải về lúc chạy. Vì vậy bạn cần chuẩn bị mọi thứ trên một máy có internet rồi chuyển vào mạng cách ly. + +#### Script tự động (khuyến nghị) + +Script `prepare-airgap.sh` đi kèm tự động hóa toàn bộ quy trình: tải các gói WASM, dựng image Docker và tạo một bundle độc lập cùng script thiết lập. + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +Lệnh này tạo ra một thư mục bundle: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +Chuyển bundle vào mạng cách ly qua USB, kho artifact nội bộ hoặc phương thức được phê duyệt. Sau đó chạy script thiết lập đi kèm: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +Script thiết lập sẽ nạp image Docker, giải nén các tệp WASM và tùy chọn khởi động container. + +**Tùy chọn của script:** + +| Flag | Mô tả | Mặc định | +| ------------------------------ | ------------------------------------------------------ | ------------------------------ | +| `--wasm-base-url ` | Nơi các WASM sẽ được lưu trữ nội bộ | _(bắt buộc, sẽ hỏi nếu thiếu)_ | +| `--image-name ` | Tag image Docker | `bentopdf` | +| `--output-dir ` | Thư mục bundle đầu ra | `./bentopdf-airgap-bundle` | +| `--simple-mode` | Bật Simple Mode | tắt | +| `--base-url ` | URL gốc của thư mục con (ví dụ `/pdf/`) | `/` | +| `--language ` | Ngôn ngữ giao diện mặc định (ví dụ `fr`, `de`) | _(không có)_ | +| `--brand-name ` | Tên thương hiệu tùy chỉnh | _(không có)_ | +| `--brand-logo ` | Đường dẫn logo, tính từ `public/` | _(không có)_ | +| `--footer-text ` | Văn bản chân trang tùy chỉnh | _(không có)_ | +| `--ocr-languages ` | Các ngôn ngữ OCR cần đóng gói, phân tách bằng dấu phẩy | `eng` | +| `--list-ocr-languages` | In các mã và tên OCR được hỗ trợ rồi thoát | tắt | +| `--search-ocr-language ` | Tìm mã OCR theo tên hoặc chữ viết tắt | tắt | +| `--dockerfile ` | Dockerfile cần dùng | `Dockerfile` | +| `--skip-docker` | Bỏ qua bước dựng và xuất Docker | tắt | +| `--skip-wasm` | Bỏ qua tải WASM (dùng lại các tệp `.tgz` có sẵn) | tắt | + +Lời nhắc tương tác cũng chấp nhận `list` để in toàn bộ danh sách mã Tesseract được hỗ trợ và `search ` để tìm kết quả khớp như `search german` hoặc `search chi`. + +::: warning Yêu cầu cùng origin +Các tệp WASM phải được phục vụ từ **cùng origin** với ứng dụng BentoPDF. Web Worker dùng `importScripts()` và không thể tải script cross-origin. Ví dụ, nếu BentoPDF chạy tại `https://internal.example.com`, URL gốc của WASM cũng nên là `https://internal.example.com/wasm`. +::: + +#### Các bước thủ công + +
+Nếu bạn muốn làm thủ công mà không dùng script + +**Bước 1: Tải các gói WASM và OCR** (trên máy có internet) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**Bước 2: Dựng image Docker với các URL nội bộ** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**Bước 3: Xuất image Docker** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**Bước 4: Chuyển vào mạng cách ly** + +Sao chép qua USB, kho artifact nội bộ hoặc phương thức chuyển được phê duyệt: + +- `bentopdf.tar`: image Docker +- Năm gói WASM/OCR `.tgz` từ Bước 1 +- Thư mục `tesseract-langdata/` từ Bước 1 +- Thư mục `ocr-fonts/` từ Bước 1 + +**Bước 5: Thiết lập bên trong mạng cách ly** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +Hãy đảm bảo các tệp truy cập được tại các URL bạn đã cấu hình ở Bước 2, gồm `.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data` và `.../ocr/fonts`. + +
+ +::: info Dựng từ mã nguồn thay vì Docker? +Đặt các biến trong `.env.production` trước khi chạy `npm run build`: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### Tự lưu trữ WASM Proxy + +Nếu bạn cần phục vụ các tệp WASM AGPL với header CORS phù hợp, bạn có thể triển khai một proxy đơn giản. Xem [hướng dẫn Cloudflare WASM Proxy](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md) để có ví dụ triển khai. + +::: tip Tại sao tách riêng? +Việc tách riêng này đảm bảo: + +- Tuân thủ pháp lý rõ ràng cho người dùng thương mại +- Phần lõi của BentoPDF vẫn nằm dưới giấy phép kép (AGPL-3.0 / Commercial) +- Các tệp WASM được tải lúc chạy, không đóng gói trong mã nguồn + ::: + +## Yêu cầu hệ thống + +| Yêu cầu | Tối thiểu | +| ------- | ----------------------------------------- | +| Lưu trữ | ~100 MB (phần lõi, không gồm mô-đun AGPL) | +| RAM | 512 MB | +| CPU | Bất kỳ bộ xử lý hiện đại nào | + +::: tip +BentoPDF là một trang web tĩnh, không cần cơ sở dữ liệu hay máy chủ backend! +::: diff --git a/docs/vi/self-hosting/kubernetes.md b/docs/vi/self-hosting/kubernetes.md new file mode 100644 index 00000000..91f0954e --- /dev/null +++ b/docs/vi/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# Triển khai với Kubernetes + +Kubernetes có thể là quá mức cần thiết cho một trang web tĩnh, nhưng sẽ rất phù hợp nếu bạn đã chuẩn hóa theo Helm + GitOps. + +> [!IMPORTANT] +> **Header bắt buộc để chuyển đổi tệp Office** +> +> Các công cụ dựa trên LibreOffice (chuyển đổi Word, Excel, PowerPoint) cần các header HTTP sau để hỗ trợ `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> Các image nginx chính thức của BentoPDF đã bao gồm các header này. Trong Kubernetes, **bộ điều khiển Ingress/Gateway cũng là reverse proxy**, vì vậy hãy đảm bảo các header này được giữ nguyên (hoặc thêm chúng ở lớp biên). + +## Điều kiện tiên quyết + +- Cụm Kubernetes +- Helm v3 +- Một image nginx của BentoPDF (ví dụ `ghcr.io/alam00000/bentopdf:`) phục vụ trên **cổng 8080** + +## Triển khai với Helm + +### Cài đặt từ repo này (chart cục bộ) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### Cài đặt từ GHCR (chart OCI) + +Nếu chart được xuất bản lên GHCR dưới dạng artifact OCI: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## Công khai dịch vụ + +### Port-forward (thử nhanh) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress (tùy chọn) + +Bật Ingress (ví dụ cho nginx-ingress): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API (tùy chọn) + +Chart này hỗ trợ Gateway API `Gateway` + `HTTPRoute`. + +Ví dụ (operator Cloudflare Gateway API): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## Đảm bảo các header SharedArrayBuffer vẫn hoạt động (Ingress/Gateway) + +### Điều "đáng lẽ" xảy ra + +Cấu hình nginx của BentoPDF đặt các header phản hồi cần thiết. Hầu hết bộ điều khiển Ingress/Gateway **chuyển tiếp nguyên vẹn các header phản hồi từ upstream**. + +### Điều có thể làm hỏng + +- Một chính sách của bộ điều khiển/lớp biên **ghi đè** hoặc **loại bỏ** các header phản hồi +- Một middleware "security headers" đặt giá trị COOP/COEP khác + +### Cách kiểm tra + +Chạy lệnh này với endpoint công khai của bạn: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +Bạn sẽ thấy: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### Nếu bộ điều khiển Ingress của bạn không giữ nguyên chúng + +Hãy thêm header ở lớp biên (tùy theo bộ điều khiển). Ví dụ cho **nginx-ingress**: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## Lỗi kiểu MIME của `.mjs` (Ký PDF / iframe Form Filler bị trống) + +Nếu bảng điều khiển trình duyệt hiển thị `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"` ở một yêu cầu `.mjs`, nghĩa là một bộ điều khiển Ingress/Gateway đặt phía trước nginx của BentoPDF đang thay header `Content-Type` từ upstream bằng `application/octet-stream`. + +Nginx trong image BentoPDF vốn đã phục vụ `.mjs` với kiểu `application/javascript`. Cách khắc phục là ngăn bộ điều khiển loại bỏ/thay thế nó. Với nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +Hoặc dùng bộ lọc `ResponseHeaderModifier` trong Gateway API để đặt `Content-Type: application/javascript` cho các đường dẫn `.mjs`. Kiểm tra bằng DevTools → tab Network: yêu cầu `.mjs` từng lỗi giờ sẽ hiển thị `content-type: application/javascript`. + +### Nếu bạn dùng Gateway API và muốn buộc thêm header + +Gateway API hỗ trợ bộ lọc `ResponseHeaderModifier`. Bạn có thể gắn nó trong `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +Việc hỗ trợ từng bộ lọc cụ thể tùy thuộc vào bộ điều khiển Gateway của bạn; nếu một bộ lọc bị bỏ qua, hãy thêm header ở lớp biên/bộ điều khiển. + +## Tắt công cụ cụ thể + +Dùng ConfigMap để tắt công cụ lúc chạy mà không cần dựng lại image: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +Gắn nó vào thư mục được phục vụ: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +ID công cụ là URL của trang bỏ đi `.html`. Hãy mở bất kỳ công cụ nào và xem URL (ví dụ: `edit-pdf`, `merge-pdf`, `compress-pdf`). Công cụ bị tắt sẽ bị ẩn khỏi trang chủ, tìm kiếm, phím tắt, trình tạo quy trình và truy cập trực tiếp bằng URL. Xem [hướng dẫn Docker](/vi/self-hosting/docker#tat-mot-so-cong-cu) để biết đầy đủ các tùy chọn. diff --git a/docs/vi/self-hosting/netlify.md b/docs/vi/self-hosting/netlify.md new file mode 100644 index 00000000..664e8e8e --- /dev/null +++ b/docs/vi/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# Triển khai lên Netlify + +[Netlify](https://netlify.com) cung cấp dịch vụ lưu trữ trang web tĩnh xuất sắc với gói miễn phí hào phóng. + +## Triển khai một lần nhấp + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## Triển khai thủ công + +### Bước 1: Kết nối repository + +1. Đăng nhập vào [Netlify](https://app.netlify.com) +2. Nhấp "Add new site" → "Import an existing project" +3. Kết nối tài khoản GitHub của bạn +4. Chọn bản fork BentoPDF của bạn + +### Bước 2: Cấu hình thiết lập dựng + +| Thiết lập | Giá trị | +| ----------------- | --------------- | +| Build command | `npm run build` | +| Publish directory | `dist` | +| Node version | 18+ | + +### Bước 3: Triển khai + +Nhấp "Deploy site" và đợi quá trình dựng hoàn tất. + +## Tệp cấu hình + +Tạo `netlify.toml` ở thư mục gốc của dự án: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning Quan trọng +Các header `Cross-Origin-Embedder-Policy` và `Cross-Origin-Opener-Policy` là bắt buộc cho việc chuyển Word/ODT/Excel/PowerPoint sang PDF. Thiếu chúng, `SharedArrayBuffer` sẽ không khả dụng và engine LibreOffice WASM sẽ không khởi tạo được. + +Các header `Content-Encoding: gzip` trên tệp `.wasm.gz` và `.data.gz` báo cho trình duyệt tự động giải nén chúng. Thiếu chúng, trình duyệt nhận dữ liệu gzip thô và quá trình biên dịch WASM sẽ thất bại. +::: + +## Biến môi trường + +Đặt các biến này tại Site settings → Environment variables: + +| Variable | Mô tả | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Đặt là `true` để dựng bản tối giản | +| `VITE_BRAND_NAME` | Tên thương hiệu tùy chỉnh (thay cho "BentoPDF") | +| `VITE_BRAND_LOGO` | Đường dẫn logo tính từ `public/` (ví dụ `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Văn bản chân trang / bản quyền tùy chỉnh | +| `VITE_DEFAULT_LANGUAGE` | Ngôn ngữ giao diện mặc định (ví dụ `fr`, `de`, `es`) | + +## Tên miền tùy chỉnh + +1. Vào Site settings → Domain management +2. Nhấp "Add custom domain" +3. Làm theo hướng dẫn cấu hình DNS + +## Phương tiện dung lượng lớn + +Với các tệp WASM lớn, hãy cân nhắc bật [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## Khắc phục sự cố + +### Chuyển Word/ODT/Excel sang PDF bị đứng ở 55% + +Nếu quá trình chuyển đổi tài liệu bị treo ở 55%, hãy mở Console của DevTools và kiểm tra: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +Nếu `crossOriginIsolated` là `false`, các header COEP/COOP từ `netlify.toml` của bạn chưa được áp dụng. Hãy đảm bảo tệp nằm ở thư mục gốc dự án rồi triển khai lại. + +Nếu bạn thấy `expected magic word 00 61 73 6d, found 1f 8b 08 08` trong console, các tệp `.wasm.gz` đang thiếu header `Content-Encoding: gzip`. Hãy đảm bảo các khối `[[headers]]` cho `soffice.wasm.gz` và `soffice.data.gz` có trong `netlify.toml` của bạn. + +### Dựng thất bại + +Kiểm tra tính tương thích phiên bản Node: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### Tải lần đầu chậm + +Bật tối ưu hóa tài nguyên tại Site settings → Build & deploy → Asset optimization. diff --git a/docs/vi/self-hosting/nginx.md b/docs/vi/self-hosting/nginx.md new file mode 100644 index 00000000..0549b13d --- /dev/null +++ b/docs/vi/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# Triển khai với Nginx + +Lưu trữ BentoPDF trên máy chủ của riêng bạn bằng Nginx. + +## Điều kiện tiên quyết + +- Máy chủ Ubuntu/Debian +- Đã cài Nginx +- Chứng chỉ SSL (khuyến nghị: Let's Encrypt) + +## Bước 1: Dựng dự án + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +Để tùy chỉnh thương hiệu, hãy đặt biến môi trường trước khi dựng: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## Bước 2: Sao chép tệp + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## Bước 3: Cấu hình Nginx + +Tạo `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## Bước 4: Bật trang web + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## Bước 5: SSL với Let's Encrypt + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## Triển khai vào thư mục con + +Để lưu trữ tại `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +Dựng với: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## Tinh chỉnh hiệu năng + +Thêm vào `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## Khắc phục sự cố + +### WASM không tải được + +Đảm bảo đã đặt kiểu MIME: + +```nginx +types { + application/wasm wasm; +} +``` + +### Ký PDF hoặc Form Filler hiển thị trình xem trống (lỗi MIME `.mjs`) + +Nếu bảng điều khiển trình duyệt hiển thị: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +...và yêu cầu bị lỗi có đuôi `.mjs`, nginx của bạn đang thiếu ánh xạ `.mjs → application/javascript`. Trình xem PDF đi kèm (được dùng bởi Ký PDF, Form Filler và một vài công cụ khác) có các tệp module ES với phần mở rộng `.mjs`, và `mime.types` mặc định của nginx không bao gồm chúng. + +Hãy khắc phục bằng cách thêm `mjs` vào dòng `application/javascript` hiện có trong `/etc/nginx/mime.types`: + +```nginx +application/javascript js mjs; +``` + +> KHÔNG thêm dòng `application/javascript` _thứ hai_: nginx phân tích `mime.types` theo từng dòng và chỉ một ánh xạ kiểu sang phần mở rộng có hiệu lực, nên dòng thứ hai bị bỏ qua âm thầm trên một số phiên bản. Hãy sửa dòng hiện có để thêm `mjs` cạnh `js`. + +Hoặc ghi đè cục bộ trong khối server của bạn (không sửa tệp toàn cục): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +Tải lại nginx sau khi thay đổi: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +Để xác nhận: trong DevTools của trình duyệt → tab Network, tìm yêu cầu `.mjs` bị lỗi và kiểm tra header phản hồi `Content-Type`. Giờ nó phải là `application/javascript`, không phải `application/octet-stream`. + +### Chuyển Word/ODT/Excel sang PDF không hoạt động + +LibreOffice WASM cần `SharedArrayBuffer`, thứ đòi hỏi các header `Cross-Origin-Embedder-Policy` và `Cross-Origin-Opener-Policy`. Nó cũng cần ngữ cảnh bảo mật, nên `http://localhost` dùng được để thử cục bộ nhưng `http://192.168.x.x` hay các IP LAN khác thường cần HTTPS. Lưu ý rằng các chỉ thị nginx `add_header` trong khối `location` **ghi đè** các chỉ thị `add_header` ở cấp server, chúng không được gộp lại. Mỗi khối `location` có `add_header` riêng phải bao gồm các header COEP/COOP. + +Kiểm tra bằng: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +Nếu dùng reverse proxy đặt trước nginx, hãy đảm bảo nó giữ nguyên các header này. + +### 502 Bad Gateway + +Kiểm tra nhật ký lỗi của Nginx: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/vi/self-hosting/vercel.md b/docs/vi/self-hosting/vercel.md new file mode 100644 index 00000000..c105f8b1 --- /dev/null +++ b/docs/vi/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# Triển khai lên Vercel + +[Vercel](https://vercel.com) mang lại trải nghiệm triển khai dễ nhất cho các trang web tĩnh. + +## Triển khai một lần nhấp + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## Triển khai thủ công + +### Bước 1: Fork repository + +Fork [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) về tài khoản GitHub của bạn. + +### Bước 2: Nhập vào Vercel + +1. Truy cập [vercel.com/new](https://vercel.com/new) +2. Chọn repository đã fork của bạn +3. Cấu hình dự án: + +| Thiết lập | Giá trị | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### Bước 3: Biến môi trường (tùy chọn) + +Thêm các biến này nếu cần: + +| Variable | Mô tả | +| ----------------------- | ------------------------------------------------------------- | +| `SIMPLE_MODE` | Đặt là `true` để có giao diện tối giản | +| `VITE_BRAND_NAME` | Tên thương hiệu tùy chỉnh (thay cho "BentoPDF") | +| `VITE_BRAND_LOGO` | Đường dẫn logo tính từ `public/` (ví dụ `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | Văn bản chân trang / bản quyền tùy chỉnh | +| `VITE_DEFAULT_LANGUAGE` | Ngôn ngữ giao diện mặc định (ví dụ `fr`, `de`, `es`) | + +### Bước 4: Triển khai + +Nhấp "Deploy" và đợi quá trình dựng hoàn tất. + +## Tên miền tùy chỉnh + +1. Vào phần cài đặt dự án của bạn +2. Chuyển đến "Domains" +3. Thêm tên miền tùy chỉnh của bạn +4. Cấu hình DNS theo hướng dẫn + +## Hạn chế + +::: warning Tệp lớn +Các serverless function của Vercel có giới hạn 50MB. Vì BentoPDF là trang web tĩnh nên điều này không ảnh hưởng đến bạn, nhưng các mô-đun WASM khá lớn (tổng cộng ~100MB). Hãy đảm bảo chúng được phục vụ từ thư mục `/public`. +::: + +## Khắc phục sự cố + +### Hết thời gian dựng + +Nếu quá trình dựng bị hết thời gian, hãy thử: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### Lỗi 404 khi làm mới trang + +Thêm `vercel.json` để định tuyến SPA: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Chuyển Word/ODT/Excel sang PDF không hoạt động + +Việc chuyển đổi LibreOffice WASM cần `SharedArrayBuffer`, thứ đòi hỏi các header phản hồi sau trên mọi trang: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +Các tệp `.wasm.gz` và `.data.gz` đã nén sẵn cũng cần `Content-Encoding: gzip` để trình duyệt giải nén chúng. + +Thêm các mục này vào `vercel.json` của bạn: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +Để kiểm tra, mở Console của DevTools và chạy `console.log(window.crossOriginIsolated)`: kết quả phải là `true`. diff --git a/docs/vi/tools/add-attachments.md b/docs/vi/tools/add-attachments.md new file mode 100644 index 00000000..82ea3cc0 --- /dev/null +++ b/docs/vi/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: Thêm tệp đính kèm +description: Nhúng tệp thuộc bất kỳ loại nào vào PDF ở cấp tài liệu hoặc gắn vào các trang cụ thể. +--- + +# Thêm tệp đính kèm + +Nhúng một hoặc nhiều tệp trực tiếp vào tài liệu PDF. Tệp đính kèm có thể được thêm ở cấp tài liệu (hiển thị trong bảng tệp đính kèm của mọi trình đọc PDF) hoặc gắn vào các trang cụ thể. + +## Cách hoạt động + +1. Tải lên PDF bạn muốn đính kèm tệp. +2. Dùng vùng thả tệp đính kèm để chọn các tệp bạn muốn nhúng (bất kỳ loại tệp nào). +3. Chọn cấp đính kèm: **Tài liệu** (mặc định) hoặc **Trang**. +4. Nếu chọn cấp Trang, hãy nhập phạm vi trang (ví dụ: `1-3` hoặc `5`). +5. Nhấp nút xử lý. PDF đã sửa đổi sẽ được tải xuống kèm các tệp đã nhúng. + +## Tính năng + +- Đính kèm mọi loại tệp: hình ảnh, bảng tính, tệp nén, tệp thực thi, bất cứ thứ gì +- Đặt tệp đính kèm ở cấp tài liệu hoặc cấp trang +- Có thể đính kèm nhiều tệp trong một thao tác +- Hiển thị tên và dung lượng của tất cả tệp đính kèm đã chọn +- Đầu ra giữ nguyên nội dung PDF gốc và thêm các tệp đã nhúng + +## Tùy chọn + +| Tùy chọn | Mô tả | +| ---------------- | ------------------------------------------------------------------- | +| **Cấp tài liệu** | Đính kèm tệp vào toàn bộ PDF, truy cập được từ bảng tệp đính kèm | +| **Cấp trang** | Đính kèm tệp vào các trang cụ thể, được chỉ định bằng phạm vi trang | + +## Trường hợp sử dụng + +- Gói dữ liệu nguồn (tệp Excel, CSV) cùng một báo cáo PDF +- Đính kèm các tệp ảnh gốc vào PDF danh mục ảnh nhiếp ảnh +- Nhúng tài liệu hỗ trợ vào hợp đồng hoặc đề xuất +- Thêm tài liệu bổ sung vào các trang cụ thể của một cuốn sổ tay đào tạo + +## Mẹo + +- Tệp đính kèm cấp tài liệu được hỗ trợ rộng rãi nhất trên các trình đọc PDF. Tệp đính kèm cấp trang có thể không hiển thị trong mọi trình xem. +- Không có giới hạn dung lượng cho tệp đính kèm, nhưng các tệp nhúng rất lớn sẽ làm tăng kích thước PDF tương ứng. + +## Công cụ liên quan + +- [Trích xuất tệp đính kèm](./extract-attachments) +- [Chỉnh sửa tệp đính kèm](./edit-attachments) +- [Gộp PDF](./merge-pdf) diff --git a/docs/vi/tools/add-blank-page.md b/docs/vi/tools/add-blank-page.md new file mode 100644 index 00000000..7a7aca30 --- /dev/null +++ b/docs/vi/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: Thêm trang trống +description: Chèn một hoặc nhiều trang trống vào bất kỳ vị trí nào trong tài liệu PDF. +--- + +# Thêm trang trống + +Chèn các trang trống vào PDF tại vị trí bạn chỉ định. Bạn kiểm soát nơi đặt các trang trống và số lượng cần thêm. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Công cụ hiển thị số trang. +2. Nhập **vị trí** cần chèn các trang trống. Dùng `0` để chèn ở đầu tài liệu, hoặc tổng số trang để thêm vào cuối. +3. Nhập **số lượng** trang trống cần thêm (mặc định là 1). +4. Nhấp nút xử lý. PDF đã sửa đổi sẽ được tải xuống kèm các trang trống đã chèn. + +## Tính năng + +- Chèn ở bất kỳ vị trí nào: đầu, giữa hoặc cuối tài liệu +- Thêm nhiều trang trống trong một thao tác +- Gợi ý vị trí tự cập nhật theo số trang của PDF đã tải lên +- Trang trống kích thước A4 chuẩn + +## Trường hợp sử dụng + +- Thêm trang trống ngăn cách giữa các phần của một tài liệu tổng hợp +- Chèn trang trống để căn chỉnh khi in hai mặt +- Thêm khoảng trống để ghi chú tay trong tài liệu học tập đã in +- Bổ sung trang để tài liệu đạt số trang tối thiểu theo yêu cầu + +## Mẹo + +- Vị trí `0` chèn trước trang đầu tiên. Vị trí bằng tổng số trang sẽ thêm sau trang cuối cùng. +- Nếu bạn cần chèn nội dung (không chỉ trang trống) vào một vị trí cụ thể, hãy dùng [Công cụ đa năng PDF](./pdf-multi-tool) để chèn một PDF khác sau một trang nhất định. + +## Công cụ liên quan + +- [Sắp xếp & Nhân bản](./organize-pdf) +- [Công cụ đa năng PDF](./pdf-multi-tool) +- [Gộp PDF](./merge-pdf) diff --git a/docs/vi/tools/add-page-labels.md b/docs/vi/tools/add-page-labels.md new file mode 100644 index 00000000..12a14cac --- /dev/null +++ b/docs/vi/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: Thêm nhãn trang +description: Thêm nhãn trang PDF với số La Mã, tiền tố chữ cái, đánh số tùy chỉnh và nhiều quy tắc trong một tài liệu. +--- + +# Thêm nhãn trang + +Nhãn trang điều khiển cách số trang hiển thị trong trình xem PDF (số hiển thị trên thanh công cụ, không in trên trang). Công cụ này cho phép bạn gán các kiểu nhãn khác nhau cho các phạm vi trang khác nhau: số La Mã cho phần đầu sách, số thập phân cho phần nội dung, phụ lục đánh chữ cái, v.v. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Bảng tùy chọn xuất hiện với một quy tắc nhãn theo mặc định. +3. Cấu hình từng quy tắc với phạm vi trang, kiểu, tiền tố tùy chọn và giá trị bắt đầu. +4. Nhấp **Thêm quy tắc** để tạo thêm quy tắc cho các phần khác nhau. +5. Nhấp **Thêm nhãn trang** để áp dụng mọi quy tắc và tải kết quả xuống. + +## Tùy chọn + +Mỗi quy tắc nhãn có các thiết lập sau: + +- **Phạm vi trang**: Các trang mà quy tắc áp dụng. Để trống nếu áp dụng cho mọi trang. Hỗ trợ các phạm vi như `1-4`, `7`, `odd` hoặc `1-9,30-40`. +- **Kiểu nhãn**: Số Ả Rập thập phân, số La Mã chữ thường (i, ii, iii), số La Mã chữ hoa (I, II, III), chữ cái thường (a, b, c), chữ cái hoa (A, B, C), hoặc Không nhãn (chỉ tiền tố). +- **Tiền tố nhãn**: Văn bản tùy chọn đặt trước mỗi nhãn, chẳng hạn "A-" để tạo các nhãn như A-1, A-2, A-3. +- **Giá trị bắt đầu**: Số bắt đầu đếm. Mặc định là 1. Đặt là 0 để đánh số từ 0. +- **Đánh số liên tục qua các phạm vi rời nhau**: Bật tùy chọn này khi một quy tắc nhắm đến các trang không liền kề (như `1-9,30-40` hoặc `odd`) và bạn muốn đánh số tiếp tục tuần tự. +- **Xóa nhãn trang hiện có**: Được chọn theo mặc định. Xóa mọi nhãn trước đó trước khi áp dụng các quy tắc mới. + +## Tính năng + +- Nhiều quy tắc nhãn trong một tài liệu cho các sơ đồ đánh số phức tạp +- Sáu kiểu nhãn bao quát mọi hệ thống đánh số chuẩn +- Hỗ trợ tiền tố tùy chỉnh để gắn nhãn theo từng phần +- Hỗ trợ phạm vi rời nhau với đánh số liên tiếp +- Tùy chọn giữ lại hoặc xóa các nhãn hiện có + +## Trường hợp sử dụng + +- Đặt nhãn số La Mã (i, ii, iii) cho lời nói đầu của một cuốn sách và nhãn thập phân cho phần nội dung chính +- Gắn nhãn các trang phụ lục bằng tiền tố chữ cái như "A-1", "A-2", "B-1", "B-2" +- Sửa nhãn trang trong tài liệu quét mà số trang thực tế không khớp với thứ tự trang PDF +- Thêm cách đánh số bắt đầu từ 0 cho tài liệu kỹ thuật + +## Mẹo + +- Nhãn trang là siêu dữ liệu mà trình xem PDF hiển thị trên thanh điều hướng. Chúng không được in trên trang thực tế. Để có số hiển thị trên trang, hãy dùng [Số trang](./page-numbers). +- Công cụ này yêu cầu CoherentPDF (CPDF) được cấu hình trong Cài đặt WASM của bạn. Nếu chưa thiết lập, bạn sẽ được nhắc cấu hình. + +## Công cụ liên quan + +- [Số trang](./page-numbers) +- [Đánh số Bates](./bates-numbering) +- [Chỉnh sửa Bookmark](./bookmark) diff --git a/docs/vi/tools/add-stamps.md b/docs/vi/tools/add-stamps.md new file mode 100644 index 00000000..e2e39368 --- /dev/null +++ b/docs/vi/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: Thêm tem +description: Thêm tem hình ảnh vào các trang PDF bằng thanh công cụ chú thích tích hợp kèm tên người dùng. +--- + +# Thêm tem + +Đặt tem hình ảnh lên các trang PDF bằng trình xem nhúng có thanh công cụ chú thích tem. Tem có thể kèm tên của bạn để ghi nhận người thực hiện, rất hữu ích cho quy trình phê duyệt, xem xét và đánh dấu tài liệu. + +## Cách hoạt động + +1. Nhập tên của bạn vào trường **Tên người dùng tem**. Tên này sẽ xuất hiện trên các tem bạn tạo. +2. Tải lên tệp PDF bằng cách nhấp hoặc kéo thả vào vùng thả tệp. +3. Trình chỉnh sửa tem mở ra với tài liệu của bạn được nạp trong trình xem. +4. Dùng công cụ tem hình ảnh trên thanh công cụ để chọn và đặt tem lên bất kỳ trang nào. +5. Định vị và đổi kích thước tem khi cần. +6. Nhấp **Lưu PDF đã đóng dấu** để tải kết quả xuống. + +## Tính năng + +- Trình xem PDF tích hợp với thanh công cụ chú thích dành riêng cho tem +- Ghi nhận tên người dùng trên các tem được tạo +- Đặt tem hình ảnh lên bất kỳ trang nào +- Định vị và đổi kích thước bằng kéo thả +- Tự động điều chỉnh kích thước trình xem theo tỷ lệ khung hình của trang +- Hiển thị tệp kèm tên và dung lượng + +## Trường hợp sử dụng + +- Thêm tem hình ảnh "APPROVED" hoặc "REVIEWED" vào tài liệu trong quy trình xem xét +- Đặt hình con dấu công ty hoặc tem công chứng lên các tài liệu chính thức +- Đánh dấu các trang bằng tem "RECEIVED" kèm tên người xem xét +- Thêm tem kiểm soát chất lượng vào báo cáo kiểm tra + +## Mẹo + +- Hãy đặt tên người dùng tem trước khi tải PDF lên. Tên người dùng được nhúng trong siêu dữ liệu của tem. +- Trình xem điều chỉnh chiều cao dựa trên tỷ lệ khung hình của trang đầu tiên để xem tối ưu. +- Nếu muốn watermark dạng văn bản thay vì tem hình ảnh, hãy dùng công cụ [Thêm Watermark](./add-watermark). + +## Công cụ liên quan + +- [Ký PDF](./sign-pdf) +- [Thêm Watermark](./add-watermark) +- [Trình chỉnh sửa PDF](./edit-pdf) diff --git a/docs/vi/tools/add-watermark.md b/docs/vi/tools/add-watermark.md new file mode 100644 index 00000000..9ea02f04 --- /dev/null +++ b/docs/vi/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: Thêm Watermark +description: Đóng dấu watermark văn bản hoặc hình ảnh lên các trang PDF bằng trình chỉnh sửa kéo thả trực quan có xem trước trực tiếp. +--- + +# Thêm Watermark + +Thêm watermark văn bản hoặc hình ảnh vào các trang PDF bằng trình chỉnh sửa trực quan. Bạn có thể định vị watermark bằng cách kéo trực tiếp trên bản xem trước, đổi kích thước bằng các điểm nắm ở góc, và cấu hình độ mờ, góc xoay, phông chữ và màu sắc. Mỗi trang có thể có vị trí watermark riêng, hoặc bạn có thể áp dụng cùng một watermark cho tất cả các trang cùng lúc. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Trình chỉnh sửa mở ra với bản xem trước trực tiếp của trang đầu tiên và lớp phủ watermark có thể kéo. +3. Chọn chế độ watermark **Văn bản** hoặc **Hình ảnh** bằng các nút chuyển đổi. +4. Cấu hình các thiết lập watermark trong bảng bên. +5. Kéo watermark trên bản xem trước đến đúng vị trí bạn muốn. Dùng các điểm nắm ở góc để đổi kích thước. +6. Chuyển giữa các trang để đặt watermark riêng cho từng trang, hoặc giữ nguyên tùy chọn **Áp dụng cho tất cả các trang**. +7. Nhấp **Thêm Watermark** để xử lý và tải xuống. + +## Tùy chọn + +**Thiết lập watermark văn bản:** + +- **Văn bản**: Nội dung watermark (ví dụ: "MẬT", "BẢN NHÁP"). +- **Cỡ chữ**: Từ 10 đến 200 điểm. Mặc định là 72. +- **Màu sắc**: Bất kỳ màu nào qua bộ chọn màu. +- **Độ mờ**: Điều chỉnh độ trong suốt từ hoàn toàn trong suốt đến hoàn toàn đục. +- **Góc xoay**: Xoay văn bản watermark từ -180 đến 180 độ. + +**Thiết lập watermark hình ảnh:** + +- **Tải ảnh lên**: Tải lên tệp PNG, JPG hoặc tệp ảnh khác để dùng làm watermark. +- **Độ mờ**: Điều chỉnh độ trong suốt của ảnh. +- **Tỷ lệ**: Đổi kích thước ảnh watermark. + +**Thiết lập bố cục:** + +- **Đơn**: Một watermark trên mỗi trang, được định vị bằng cách kéo hoặc bằng các vị trí đặt sẵn. +- **Lát gạch**: Lặp lại watermark trên toàn trang theo lưới chéo bám theo góc xoay, để dấu phủ kín tài liệu từ mép này sang mép kia. +- **Khoảng cách ngang**: Khoảng cách giữa các ô theo hướng văn bản, tính theo phần trăm chiều rộng watermark (chỉ ở chế độ lát gạch). +- **Khoảng cách dọc**: Khoảng cách giữa các hàng ô, tính theo phần trăm chiều cao watermark (chỉ ở chế độ lát gạch). + +**Thiết lập chung:** + +- **Áp dụng cho tất cả các trang**: Khi được chọn, cùng một watermark áp dụng cho mọi trang. Bỏ chọn để đặt watermark riêng cho từng trang. +- **Phạm vi trang**: Chỉ định các trang được thêm watermark (ví dụ: "1-3, 5, 7-9" hoặc "all"). + +## Tính năng + +- Định vị kéo thả trực quan trên bản xem trước PDF trực tiếp +- Watermark có thể đổi kích thước bằng các điểm nắm ở góc +- Chế độ watermark văn bản và hình ảnh +- Bố cục đơn hoặc lát gạch (lặp lại) toàn trang với khoảng cách điều chỉnh được +- Áp dụng watermark theo từng trang hoặc toàn cục +- Chuyển trang từng trang trong bản xem trước +- Điều khiển độ mờ và góc xoay +- Lọc theo phạm vi trang + +## Trường hợp sử dụng + +- Đánh dấu tài liệu nháp bằng "BẢN NHÁP" trước khi lưu hành để xem xét +- Thêm watermark "MẬT" vào các báo cáo tài chính nhạy cảm +- Gắn thương hiệu cho tài liệu bằng watermark là logo công ty +- Đóng dấu "SAMPLE" lên tài liệu sản phẩm chia sẻ với khách hàng tiềm năng +- Thêm thông báo bản quyền vào các tài liệu PDF được phân phối + +## Mẹo + +- Để có watermark chéo trên trang, hãy đặt góc xoay khoảng 45 độ và tăng cỡ chữ. +- Chế độ lát gạch khiến tài liệu khó tái sử dụng hơn nhiều sau khi cắt xén, vì xóa một dấu vẫn còn hàng chục dấu khác. Hãy giảm độ mờ khi lát gạch để văn bản bên dưới vẫn dễ đọc. +- Watermark hình ảnh có nền trong suốt (định dạng PNG) hòa vào nội dung tài liệu tự nhiên hơn. +- Nếu cần văn bản watermark khác nhau trên các trang khác nhau, hãy bỏ chọn "Áp dụng cho tất cả các trang" và chuyển từng trang. + +## Công cụ liên quan + +- [Đầu trang & Chân trang](./header-footer) +- [Thêm tem](./add-stamps) +- [Đánh số Bates](./bates-numbering) +- [Ký PDF](./sign-pdf) diff --git a/docs/vi/tools/adjust-colors.md b/docs/vi/tools/adjust-colors.md new file mode 100644 index 00000000..8a603840 --- /dev/null +++ b/docs/vi/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: Điều chỉnh màu sắc +description: Tinh chỉnh độ sáng, độ tương phản, độ bão hòa, sắc độ, nhiệt độ màu, tông màu, gamma và sepia trong PDF của bạn. +--- + +# Điều chỉnh màu sắc + +Bộ công cụ chỉnh màu đầy đủ cho PDF. Điều chỉnh tám thông số độc lập: độ sáng, độ tương phản, độ bão hòa, dịch sắc độ, nhiệt độ màu, tông màu, gamma và sepia, với bản xem trước trực tiếp cập nhật khi bạn di chuyển từng thanh trượt. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Trình chỉnh sửa mở ra, hiển thị bản xem trước trang đầu tiên và bảng thiết lập màu. +3. Di chuyển các thanh trượt để điều chỉnh từng thông số màu. Bản xem trước cập nhật theo thời gian thực. +4. Nhấp **Đặt lại** để đưa mọi thanh trượt về vị trí mặc định. +5. Nhấp **Áp dụng điều chỉnh màu** để xử lý tất cả các trang và tải PDF đã điều chỉnh xuống. + +## Tùy chọn + +- **Độ sáng**: Làm sáng hoặc tối toàn bộ trang (-100 đến +100). +- **Độ tương phản**: Tăng hoặc giảm sự khác biệt giữa vùng sáng và tối (-100 đến +100). +- **Độ bão hòa**: Tăng hoặc giảm cường độ màu (-100 đến +100). Đặt -100 cho kết quả thang xám. +- **Dịch sắc độ**: Xoay vòng màu để dịch chuyển đồng loạt mọi màu. +- **Nhiệt độ màu**: Dịch màu sang ấm hơn (vàng/cam) hoặc lạnh hơn (xanh dương). +- **Tông màu**: Thêm sắc xanh lá hoặc đỏ tím. +- **Gamma**: Điều chỉnh độ sáng vùng trung bằng đường cong gamma. Giá trị dưới 1.0 làm tối vùng trung; giá trị trên 1.0 làm sáng chúng. +- **Sepia**: Áp dụng hiệu ứng tông sepia cổ điển. Giá trị cao hơn cho sắc nâu đậm hơn. + +## Tính năng + +- Tám thông số màu điều chỉnh độc lập +- Bản xem trước trực tiếp phản hồi ngay khi kéo thanh trượt +- Nút Reset để nhanh chóng quay về mặc định +- Xử lý tất cả các trang trong tài liệu +- Hoạt động với mọi nội dung PDF (văn bản, hình ảnh, đồ họa) + +## Trường hợp sử dụng + +- Làm sáng bản quét tối hoặc chỉnh các trang bị cháy sáng +- Giảm bão hòa tài liệu nhiều màu để tiết kiệm mực trước khi in +- Áp dụng tông sepia để tạo vẻ cổ điển cho chứng chỉ hoặc giải thưởng +- Chỉnh nhiệt độ màu của các ảnh nhúng trong PDF +- Tăng độ tương phản cho tài liệu quét bị phai hoặc chất lượng thấp + +## Mẹo + +- Để chuyển nhanh sang thang xám, kéo thanh trượt độ bão hòa hết cỡ đến -100. +- Thanh trượt gamma đặc biệt hữu ích để cải thiện khả năng đọc của tài liệu quét có vùng trung quá tối hoặc quá sáng. +- Giống các công cụ hiệu ứng hình ảnh khác, công cụ này rasterize từng trang. Đầu ra sẽ dựa trên hình ảnh, nên văn bản sẽ không chọn được. + +## Công cụ liên quan + +- [Đảo ngược màu](./invert-colors) +- [Hiệu ứng máy quét](./scanner-effect) +- [Màu nền](./background-color) diff --git a/docs/vi/tools/alternate-merge.md b/docs/vi/tools/alternate-merge.md new file mode 100644 index 00000000..ffa47c34 --- /dev/null +++ b/docs/vi/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: Xen kẽ & Trộn trang +description: Gộp các PDF bằng cách xen kẽ trang từ mỗi tệp theo thứ tự luân phiên, giữ nguyên dấu trang. +--- + +# Xen kẽ & Trộn trang + +Xen kẽ các trang từ nhiều tệp PDF để các trang luân phiên giữa các tài liệu. Đây là công cụ bạn cần khi gộp thông thường chỉ nối các tệp nối đuôi nhau, còn bạn cần trang 1 của Tệp A, rồi trang 1 của Tệp B, rồi trang 2 của Tệp A, và cứ thế tiếp tục. + +## Cách hoạt động + +1. Tải lên ít nhất hai tệp PDF bằng vùng thả tệp. +2. Công cụ hiển thị từng tệp cùng số trang và dung lượng. +3. Kéo các tay nắm để sắp xếp lại tệp nào có trang đứng đầu trong chuỗi xen kẽ. +4. Nhấp **Trộn trang** để tạo đầu ra xen kẽ. +5. Kết quả được tải xuống với tên `alternated-mixed.pdf`. + +## Tính năng + +- Xen kẽ các trang giữa bất kỳ số lượng PDF nào (tối thiểu hai) +- Kéo thả sắp xếp lại tệp để điều khiển thứ tự ưu tiên xen kẽ +- Giữ nguyên dấu trang từ các tài liệu nguồn +- Hiển thị số trang và dung lượng của từng tệp đã tải lên +- Xử lý qua web worker riêng để giao diện luôn phản hồi + +## Trường hợp sử dụng + +- Ghép lại các bản quét hai mặt khi trang lẻ và trang chẵn được quét riêng +- Kết hợp phiếu câu hỏi với đáp án để mỗi câu hỏi được theo sau bởi đáp án của nó +- Gộp tài liệu hai ngôn ngữ theo từng trang (ví dụ: tiếng Anh ở một mặt, bản dịch ở mặt kế tiếp) +- Xen kẽ bản quét mặt trước và mặt sau từ máy quét một mặt + +## Mẹo + +- Nếu các PDF nguồn có số trang khác nhau, trang của tài liệu ngắn hơn sẽ hết trước và các trang còn lại của tài liệu dài hơn sẽ xuất hiện ở cuối. +- Thứ tự tệp rất quan trọng: tệp đầu tiên trong danh sách đóng góp trang đầu tiên của đầu ra. Hãy kéo để sắp xếp lại nếu cần. + +## Công cụ liên quan + +- [Gộp PDF](./merge-pdf) +- [Sắp xếp & Nhân bản](./organize-pdf) +- [Chia PDF](./split-pdf) diff --git a/docs/vi/tools/background-color.md b/docs/vi/tools/background-color.md new file mode 100644 index 00000000..65be661f --- /dev/null +++ b/docs/vi/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: Màu nền +description: Đổi màu nền của mọi trang trong PDF mà vẫn giữ nguyên toàn bộ nội dung phía trên. +--- + +# Màu nền + +Đặt một màu nền đơn sắc phía sau toàn bộ nội dung hiện có trong PDF. Công cụ tạo một hình chữ nhật màu trên mỗi trang và xếp nội dung gốc lên trên, nên văn bản, hình ảnh và đồ họa vẫn hiển thị đầy đủ trên nền mới. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Chọn màu nền bằng bộ chọn màu. Mặc định là vàng nhạt (#FFFFCC). +3. Nhấp **Đổi màu nền** để xử lý. +4. PDF đã cập nhật được tải xuống tự động. + +## Tùy chọn + +- **Màu nền**: Bộ chọn màu tiêu chuẩn để chọn bất kỳ màu đơn sắc nào. Mặc định là vàng nhạt. + +## Tính năng + +- Áp dụng màu nền đồng nhất cho mọi trang +- Giữ nguyên toàn bộ nội dung gốc (văn bản, hình ảnh, đồ họa vector) phía trên lớp màu +- Giữ nguyên kích thước trang gốc +- Hoạt động với tài liệu có số trang bất kỳ + +## Trường hợp sử dụng + +- Thêm nền màu kem hoặc ngà nhạt để tài liệu có vẻ ngoài mềm mại như giấy +- Mã hóa màu các bộ tài liệu bằng cách áp dụng các màu nền khác nhau cho từng danh mục +- Tạo các phiên bản khác biệt về hình thức của cùng một tài liệu cho các đối tượng khác nhau +- Thêm sắc nền nhạt để dễ đọc hơn khi trình chiếu tài liệu trên màn hình + +## Mẹo + +- Màu nhạt và dịu hoạt động tốt nhất. Nền quá tối có thể làm văn bản khó đọc trừ khi văn bản vốn có màu sáng. +- Nếu muốn đổi cả màu nền và màu văn bản, hãy áp dụng màu nền trước, rồi dùng [Thay đổi màu văn bản](./text-color) trên kết quả. +- Công cụ này hoạt động ở cấp cấu trúc PDF (không rasterize), nên văn bản vẫn chọn và tìm kiếm được trong đầu ra. + +## Công cụ liên quan + +- [Thay đổi màu văn bản](./text-color) +- [Đảo ngược màu](./invert-colors) +- [Điều chỉnh màu sắc](./adjust-colors) diff --git a/docs/vi/tools/bates-numbering.md b/docs/vi/tools/bates-numbering.md new file mode 100644 index 00000000..3285da06 --- /dev/null +++ b/docs/vi/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Đánh số Bates +description: Áp dụng số Bates cho một hoặc nhiều PDF với mẫu, độ đệm số, phông chữ và vị trí tùy chỉnh. +--- + +# Đánh số Bates + +Đánh số Bates đóng dấu các mã định danh tuần tự lên mọi trang trong PDF của bạn. Đây là phương pháp tiêu chuẩn để gắn nhãn tài liệu trong tố tụng pháp lý, kiểm toán và quy trình tuân thủ. Công cụ này hỗ trợ nhiều tệp, mẫu tùy chỉnh, và tạo các PDF được đánh số riêng lẻ hoặc một tệp nén ZIP duy nhất. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. Bạn có thể kéo nhiều tệp cùng lúc. +2. Chọn một kiểu cài sẵn hoặc tạo mẫu tùy chỉnh. +3. Cấu hình vị trí, phông chữ, cỡ chữ, màu sắc và các số bắt đầu. +4. Nhấp **Áp dụng số Bates** để xử lý. +5. Một tệp sẽ được tải xuống trực tiếp. Nhiều tệp sẽ được tải xuống dưới dạng tệp nén ZIP. + +## Tùy chọn + +- **Kiểu cài sẵn**: Chọn từ các định dạng dựng sẵn: + - Phụ lục + Vụ + Bates + Trang (ví dụ: "Exhibit 1 Case XYZ 000001 Page 1") + - Phụ lục + Vụ + Bates (không có số trang) + - Vụ + Bates + - Chỉ số Bates (ví dụ: "000001") + - Tùy chỉnh (tự viết mẫu của bạn) +- **Tùy chỉnh kiểu**: Một chuỗi mẫu dùng các placeholder: `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`. +- **Độ đệm số Bates**: Số chữ số (3 đến 6) cho số Bates được đệm số 0. Chỉ hiển thị ở chế độ tùy chỉnh. +- **Vị trí**: Đầu trang hoặc Chân trang, Trái, Giữa hoặc Phải. +- **Số Bates bắt đầu từ**: Số Bates đầu tiên. Mặc định là 1. Việc đánh số tiếp tục xuyên suốt các tệp. +- **Bộ đếm tệp bắt đầu từ**: Số bắt đầu cho placeholder `[FILE]`. +- **Phông chữ**: Helvetica, Times New Roman hoặc Courier. +- **Cỡ chữ**: Kích thước văn bản được đóng dấu. +- **Màu sắc**: Bộ chọn màu cho văn bản số Bates. + +## Tính năng + +- Xem trước trực tiếp cách số Bates sẽ xuất hiện trên tất cả các tệp đã tải lên +- Hỗ trợ nhiều tệp với việc đánh số liên tục giữa các tài liệu +- Kéo thả sắp xếp lại tệp để điều khiển thứ tự đánh số +- Sáu tùy chọn vị trí (đầu/chân trang, trái/giữa/phải) +- Tính lề thích ứng, phù hợp với các khổ trang khác nhau +- Đầu ra ZIP cho các lô nhiều tệp +- Placeholder trong mẫu để linh hoạt tối đa + +## Trường hợp sử dụng + +- Đóng dấu tài liệu thu thập chứng cứ cho tố tụng bằng số hiệu chứng cứ tuần tự +- Đánh số các gói bằng chứng kiểm toán gồm hàng chục tệp +- Áp dụng số tham chiếu quy định cho tài liệu tuân thủ +- Gắn nhãn các phụ lục hồ sơ đăng ký sáng chế bằng mã định danh riêng của vụ việc + +## Mẹo + +- Kéo các tệp trong danh sách để sắp xếp lại trước khi xử lý. Thứ tự đánh số Bates theo thứ tự này. +- Dùng placeholder `[FILENAME]` để đưa tên tệp gốc vào dấu đóng, giúp truy ngược các trang về tài liệu nguồn. +- Ô xem trước cập nhật theo thời gian thực khi bạn đổi thiết lập, nên bạn có thể kiểm tra định dạng trước khi xử lý. + +## Công cụ liên quan + +- [Số trang](./page-numbers) +- [Thêm nhãn trang](./add-page-labels) +- [Đầu trang & Chân trang](./header-footer) diff --git a/docs/vi/tools/bmp-to-pdf.md b/docs/vi/tools/bmp-to-pdf.md new file mode 100644 index 00000000..fe78948f --- /dev/null +++ b/docs/vi/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP sang PDF +description: Chuyển đổi ảnh bitmap BMP sang định dạng PDF ngay trong trình duyệt, không cần tải lên bất kỳ máy chủ nào. +--- + +# BMP sang PDF + +Chuyển đổi tệp Windows Bitmap (BMP) sang PDF. BMP là định dạng ảnh không nén vẫn còn gặp trong các hệ thống cũ, chẩn đoán hình ảnh y tế và máy quét công nghiệp. Công cụ này chuyển chúng sang PDF mà không cần cài đặt gì. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :----------- | +| BMP | `.bmp` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo thả các tệp BMP của bạn. +2. Xem lại danh sách tệp. Thêm tệp khác hoặc xóa những tệp không cần. +3. Nhấp **Chuyển đổi sang PDF**. Đầu ra được tải xuống với tên `from_bmps.pdf`. + +Mỗi BMP được vẽ lên canvas, xuất ra PNG, rồi nhúng vào PDF bằng pdf-lib. Kích thước trang khớp với kích thước ảnh gốc. + +## Tùy chọn + +Công cụ này không có thêm thiết lập chất lượng. Hình ảnh được nhúng ở độ phân giải gốc dưới dạng PNG không mất dữ liệu trong PDF. + +## Trường hợp sử dụng + +- Chuyển các tài liệu quét cũ lưu dưới dạng BMP thành PDF lưu trữ +- Biến ảnh chụp màn hình BMP từ các ứng dụng Windows cũ thành tài liệu có thể chia sẻ +- Xử lý đầu ra của máy quét y tế hoặc công nghiệp mặc định là BMP +- Di chuyển các kho ảnh cũ sang định dạng dễ mang theo hơn + +## Mẹo + +- Tệp BMP không nén nên thường rất lớn. PDF kết quả sẽ nhỏ hơn đáng kể vì hình ảnh được mã hóa lại thành PNG bên trong. +- Nếu bạn có tệp BMP cùng các định dạng ảnh khác, hãy dùng công cụ [Hình ảnh sang PDF](./image-to-pdf) để chuyển đổi tất cả trong một lô. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [PNG sang PDF](./png-to-pdf) +- [TIFF sang PDF](./tiff-to-pdf) diff --git a/docs/vi/tools/bookmark.md b/docs/vi/tools/bookmark.md new file mode 100644 index 00000000..a5e228c4 --- /dev/null +++ b/docs/vi/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: Chỉnh sửa Bookmark +description: Thêm, sửa, nhập, xuất và xóa dấu trang PDF bằng trình chỉnh sửa trực quan, hỗ trợ CSV/JSON. +--- + +# Chỉnh sửa Bookmark + +Trình chỉnh sửa dấu trang cho bạn toàn quyền kiểm soát các dấu trang điều hướng (còn gọi là outline) của PDF. Bạn có thể thêm dấu trang mới, sửa dấu trang hiện có, sắp xếp lại cấu trúc phân cấp, và nhập hoặc xuất dữ liệu dấu trang ở định dạng CSV và JSON. + +## Cách hoạt động + +1. Tải PDF lên bằng cách nhấp hoặc kéo thả tệp vào vùng thả. +2. Có thể chọn **Tự động trích xuất dấu trang hiện có** để lấy cây dấu trang hiện tại của tài liệu. +3. Trình chỉnh sửa mở ra với chế độ chia đôi: trình xem PDF ở bên trái, bảng dấu trang ở bên phải. +4. Nhập tiêu đề dấu trang và nhấp **Thêm vào trang** để tạo dấu trang mới trỏ đến trang hiện tại. +5. Dùng các nút trên thanh công cụ để sắp xếp lại, tạo kiểu hoặc xóa dấu trang. +6. Nhấp **Lưu PDF kèm dấu trang** để tải xuống tệp đã cập nhật. + +## Tính năng + +- Trình xem PDF trực quan với điều hướng trang, điều khiển thu phóng và ô nhập số trang cần đến +- Thêm dấu trang vào bất kỳ trang nào chỉ với một cú nhấp +- Nhấp trực tiếp lên PDF để đặt điểm đến chính xác cho dấu trang (chế độ chọn) +- Cấu trúc dấu trang lồng nhau, sắp xếp lại bằng kéo và thả +- Thao tác hàng loạt: chọn nhiều dấu trang để đổi màu, đổi kiểu hoặc xóa cùng lúc +- Tìm kiếm dấu trang để nhanh chóng tìm mục trong cây lớn +- Hỗ trợ hoàn tác và làm lại cho mọi thay đổi +- Nhập dấu trang từ tệp CSV (tiêu đề, trang, cấp) hoặc JSON +- Xuất dấu trang ra CSV hoặc JSON để chỉnh sửa bên ngoài +- Tạo kiểu dấu trang: màu (đỏ, xanh dương, xanh lá, vàng, tím) và kiểu chữ (đậm, nghiêng, đậm nghiêng) +- Điều hướng nhanh: cuộn qua các trang bằng phím Page Up/Page Down + +## Tùy chọn + +- **Tự động trích xuất dấu trang hiện có**: Khi chọn, công cụ đọc và hiển thị các dấu trang hiện tại của PDF lúc tải. +- **Chế độ hàng loạt**: Bật để chọn nhiều dấu trang và áp dụng đổi màu, đổi kiểu hoặc xóa hàng loạt. +- **Mở rộng/Thu gọn tất cả**: Nhanh chóng hiện hoặc ẩn các dấu trang con lồng nhau. + +## Trường hợp sử dụng + +- Thêm mục lục cho sách giáo khoa hoặc sổ tay chưa có dấu trang +- Sắp xếp lại dấu trang trong tài liệu quét sau khi xử lý OCR +- Xuất dấu trang ra CSV, chỉnh sửa trong bảng tính rồi nhập lại +- Dọn dẹp các dấu trang tự động tạo có tham chiếu trang sai +- Thêm dấu trang có màu để đánh dấu các phần quan trọng trong hồ sơ pháp lý + +## Mẹo + +- Dùng nhập CSV để tạo hàng loạt dấu trang. Định dạng đơn giản: `title,page,level`, trong đó level 1 là cấp cao nhất. +- Chế độ chọn cho phép nhấp vào đúng một vị trí trên trang PDF để đặt điểm đến của dấu trang, chính xác hơn so với chỉ nhắm đến số trang. +- Hãy xuất dấu trang trước khi thực hiện thay đổi lớn để có bản sao lưu. + +## Công cụ liên quan + +- [Mục lục](./table-of-contents) +- [Trình chỉnh sửa PDF](./edit-pdf) +- [Thêm nhãn trang](./add-page-labels) diff --git a/docs/vi/tools/cbz-to-pdf.md b/docs/vi/tools/cbz-to-pdf.md new file mode 100644 index 00000000..7042d004 --- /dev/null +++ b/docs/vi/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ sang PDF +description: Chuyển đổi kho lưu trữ truyện tranh CBZ và CBR sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không cần tải lên. +--- + +# CBZ sang PDF + +Biến các tệp lưu trữ truyện tranh thành PDF. CBZ và CBR là định dạng tiêu chuẩn của truyện tranh kỹ thuật số: thực chất chúng chỉ là kho lưu trữ ZIP hoặc RAR chứa đầy hình ảnh. Công cụ này trích xuất từng trang, giữ nguyên thứ tự đọc và tạo ra một PDF gọn gàng, trong đó mỗi hình ảnh trở thành một trang kích thước đầy đủ. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------- | :----------- | :-------------------------------------------------------- | +| CBZ | `.cbz` | Kho truyện tranh dựa trên ZIP (xử lý cục bộ bằng pdf-lib) | +| CBR | `.cbr` | Kho truyện tranh dựa trên RAR (xử lý qua engine PyMuPDF) | + +Trình chuyển đổi CBZ nhận dạng các hình ảnh JPEG, PNG, GIF, BMP, WebP, AVIF, TIFF, HEIC và JXL trong kho lưu trữ. Các định dạng không chuẩn được tự động chuyển sang PNG trước khi nhúng. + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo thả các tệp CBZ hoặc CBR. Bạn có thể trộn cả hai định dạng trong một lô. +2. Xem lại danh sách tệp. Xóa những tệp không cần, hoặc nhấp **Thêm tệp** để thêm nữa. +3. Nhấp **Chuyển đổi sang PDF**. Với tệp CBZ, công cụ giải nén kho lưu trữ, sắp xếp các tệp hình ảnh theo tên theo thứ tự tự nhiên, phát hiện định dạng thực của từng hình ảnh, rồi nhúng chúng vào PDF bằng pdf-lib. Tệp CBR được chuyển qua engine PyMuPDF. +4. Một tệp sẽ được tải xuống dưới dạng PDF. Nhiều tệp sẽ tạo ra một kho ZIP tên là `comic-converted.zip`. + +## Tùy chọn + +Không cần cấu hình. Mỗi hình ảnh trở thành một trang có kích thước khớp với kích thước gốc, nên các trang đôi vẫn rộng và các trang đơn vẫn hẹp. + +## Trường hợp sử dụng + +- Đọc truyện tranh trên máy tính bảng hoặc ứng dụng điện thoại hỗ trợ PDF nhưng không hỗ trợ CBZ/CBR +- In một số trang cụ thể từ truyện tranh kỹ thuật số +- Lưu trữ bộ sưu tập truyện tranh ở định dạng mà trình xem tệp nào cũng mở được +- Chia sẻ truyện tranh với người không có trình đọc truyện chuyên dụng + +## Mẹo + +- Hình ảnh trong kho lưu trữ được sắp xếp theo thứ tự tự nhiên (nên `page2.jpg` đứng trước `page10.jpg`). Hãy đặt tên tệp với cách đánh số nhất quán để có thứ tự trang đúng. +- Trình chuyển đổi phát hiện định dạng hình ảnh bằng chữ ký nhị phân, không dựa vào phần mở rộng tệp. Một tệp PNG vô tình đặt tên `.jpg` vẫn được nhúng đúng. +- Tệp CBZ được xử lý hoàn toàn trong trình duyệt mà không cần tải engine PyMuPDF, nên chuyển đổi nhanh hơn tệp CBR. + +## Công cụ liên quan + +- [EPUB sang PDF](./epub-to-pdf) +- [MOBI sang PDF](./mobi-to-pdf) +- [Hình ảnh sang PDF](./image-to-pdf) diff --git a/docs/vi/tools/change-permissions.md b/docs/vi/tools/change-permissions.md new file mode 100644 index 00000000..707ed823 --- /dev/null +++ b/docs/vi/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: Thay đổi quyền +description: Đặt hoặc sửa quyền sử dụng PDF cho việc in, sao chép, chỉnh sửa và chú thích. Dùng mã hóa AES 256-bit. +--- + +# Thay đổi quyền + +Tinh chỉnh những gì người nhận có thể làm với PDF của bạn. Khác với mã hóa cơ bản chỉ khóa tệp bằng mật khẩu, công cụ này cho phép bạn chọn cho phép hoặc từ chối việc in, sao chép, chỉnh sửa, chú thích, điền biểu mẫu, ghép tài liệu và trích xuất trang, tất cả đều được thực thi qua mã hóa AES 256-bit. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Nếu PDF đã được mã hóa, nhập **Mật khẩu hiện tại**. +3. Đặt **Mật khẩu người dùng mới** (bắt buộc để mở tệp) và/hoặc **Mật khẩu chủ sở hữu mới** (kiểm soát quyền). +4. Bật hoặc tắt từng quyền bằng các ô chọn. +5. Nhấp **Thay đổi quyền**. +6. Tải xuống PDF đã cập nhật. + +Nếu bạn để trống cả hai ô mật khẩu mới, công cụ sẽ giải mã hoàn toàn PDF, gỡ bỏ mọi mã hóa và hạn chế. + +## Các điều khiển quyền + +| Quyền | Kiểm soát điều gì | +| ----------------------------- | ---------------------------------------------------------- | +| **Cho phép in** | Tài liệu có thể được in hay không | +| **Cho phép sao chép** | Văn bản và hình ảnh có thể được chọn và sao chép hay không | +| **Cho phép chỉnh sửa** | Nội dung tài liệu có thể được chỉnh sửa hay không | +| **Cho phép chú thích** | Có thể thêm bình luận, đánh dấu và con dấu hay không | +| **Cho phép điền biểu mẫu** | Các trường biểu mẫu tương tác có thể được điền hay không | +| **Cho phép ghép tài liệu** | Có thể chèn, xóa hoặc xoay trang hay không | +| **Cho phép trích xuất trang** | Từng trang riêng lẻ có thể được trích xuất hay không | + +Mọi quyền đều cần mật khẩu chủ sở hữu để được thực thi. Nếu không có mật khẩu chủ sở hữu, hầu hết trình đọc PDF sẽ bỏ qua các cờ quyền. + +## Quyền hoạt động như thế nào trong PDF + +Quyền PDF là một phần của đặc tả mã hóa. Chúng được lưu dưới dạng cờ bit trong từ điển mã hóa và được các trình đọc PDF tuân thủ thực thi. Điểm khác biệt chính: + +- **Mật khẩu người dùng**: Bắt buộc để mở tệp. +- **Mật khẩu chủ sở hữu**: Bắt buộc để thay đổi quyền hoặc gỡ bỏ hạn chế. Nếu không có, các cờ quyền kiểm soát những thao tác người dùng được thực hiện. + +Nếu bạn chỉ đặt mật khẩu chủ sở hữu (không có mật khẩu người dùng), ai cũng mở được tệp nhưng chỉ được thực hiện các thao tác cho phép. Nếu đặt cả hai, tệp cần mật khẩu để mở và bị hạn chế sau khi xác thực. + +## Trường hợp sử dụng + +- Phân phối báo cáo có thể xem và in nhưng không thể chỉnh sửa hoặc sao chép +- Chia sẻ mẫu hợp đồng mà người nhận có thể điền nhưng không thể sửa +- Xuất bản danh mục PDF đã tắt khả năng sao chép hình ảnh +- Cho phép chú thích trên bản nháp cần duyệt nhưng ngăn thay đổi cấu trúc + +## Mẹo + +- Để có hiệu lực, hãy luôn đặt mật khẩu chủ sở hữu. Quyền không có mật khẩu chủ sở hữu không thể thực thi. +- Một số công cụ PDF của bên thứ ba bỏ qua cờ quyền. Để bảo vệ mạnh hơn, hãy cân nhắc chuyển PDF thành ảnh raster hoặc dùng DRM. +- Dùng công cụ này để nâng cấp PDF cũ mã hóa RC4 lên AES-256. + +## Công cụ liên quan + +- [Mã hóa PDF](./protect-pdf): bảo vệ bằng mật khẩu đơn giản, không có quyền chi tiết +- [Giải mã PDF](./unlock-pdf): gỡ bỏ hoàn toàn mã hóa +- [Xóa hạn chế](./remove-restrictions): gỡ mọi hạn chế khi bạn có mật khẩu chủ sở hữu diff --git a/docs/vi/tools/combine-single-page.md b/docs/vi/tools/combine-single-page.md new file mode 100644 index 00000000..127e5c10 --- /dev/null +++ b/docs/vi/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: Kết hợp thành một trang +description: Ghép tất cả các trang của PDF thành một trang cuộn liên tục theo chiều dọc hoặc chiều ngang. +--- + +# Kết hợp thành một trang + +Gộp mọi trang của PDF thành một trang dài duy nhất. Các trang được ghép theo chiều dọc (như một cuộn giấy) hoặc chiều ngang (cạnh nhau), tạo ra một trang liên tục trong tệp đầu ra. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Chọn hướng bố cục: **Dọc** (các trang xếp chồng từ trên xuống) hoặc **Ngang** (các trang đặt cạnh nhau). +3. Đặt khoảng cách giữa các trang tính bằng point. +4. Chọn màu nền cho khoảng trống giữa các trang. +5. Có thể bật đường phân cách (các đường mảnh giữa các trang) và cấu hình độ dày và màu của chúng. +6. Nhấp nút xử lý. Kết quả là một PDF một trang. + +## Tính năng + +- Ghép trang theo chiều dọc hoặc ngang +- Khoảng cách giữa các trang có thể cấu hình +- Bộ chọn màu nền cho vùng khoảng trống +- Đường phân cách tùy chọn với độ dày và màu chỉnh được +- Kết xuất từng trang gốc ở độ phân giải đầy đủ lên canvas gộp + +## Tùy chọn + +| Tùy chọn | Mô tả | +| -------------------------- | ------------------------------------------- | +| **Hướng** | Dọc (xếp chồng) hoặc Ngang (cạnh nhau) | +| **Khoảng cách trang** | Khoảng trống giữa các trang tính bằng point | +| **Màu nền** | Màu của vùng giữa các trang | +| **Thêm đường phân cách** | Bật các đường mảnh giữa các trang | +| **Độ dày đường phân cách** | Độ dày đường tính bằng point | +| **Màu đường phân cách** | Màu của các đường phân cách | + +## Trường hợp sử dụng + +- Tạo một hình ảnh dài duy nhất từ wireframe hoặc bản mockup thiết kế nhiều trang +- Tạo chế độ xem cuộn liên tục của tài liệu để nhúng vào web +- Ghép truyện tranh hoặc storyboard nhiều trang thành một dải +- Tạo cái nhìn toàn cảnh về các trang liên tiếp để xem xét + +## Mẹo + +- Hướng dọc phù hợp nhất với tài liệu có trang dọc. Hướng ngang tốt hơn cho nội dung nằm ngang. +- Tài liệu lớn nhiều trang sẽ tạo ra đầu ra rất cao hoặc rất rộng. Một số trình xem PDF có thể gặp khó với các trang đơn cực lớn. +- Thêm đường phân cách có màu tương phản giúp dễ thấy trang gốc này kết thúc và trang tiếp theo bắt đầu ở đâu. + +## Công cụ liên quan + +- [N-Up PDF](./n-up-pdf) +- [Gộp PDF](./merge-pdf) +- [Chia trang](./divide-pages) diff --git a/docs/vi/tools/compare-pdfs.md b/docs/vi/tools/compare-pdfs.md new file mode 100644 index 00000000..ade5a690 --- /dev/null +++ b/docs/vi/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: So sánh PDF +description: So sánh hai tài liệu PDF cạnh nhau hoặc ở chế độ chồng lớp, với phát hiện và phân loại thay đổi chi tiết. +--- + +# So sánh PDF + +Tải lên hai PDF và xem chính xác điều gì đã thay đổi giữa chúng. Công cụ ghép cặp các trang một cách thông minh, phát hiện khác biệt về văn bản, hình ảnh, chú thích, đầu trang và định dạng, rồi hiển thị chúng ở dạng cạnh nhau hoặc chồng lớp. + +## Cách hoạt động + +1. Tải lên hai tệp PDF: bản gốc (bên trái) và bản đã sửa (bên phải). +2. Công cụ ghép cặp các trang giữa hai tài liệu dựa trên chữ ký nội dung. +3. Chọn chế độ xem: **Cạnh nhau** hoặc **Chồng lớp**. +4. Chuyển giữa các cặp trang bằng điều khiển phân trang. +5. Các khác biệt được đánh dấu và phân loại. Dùng bảng bộ lọc để tập trung vào các loại thay đổi cụ thể. +6. Có thể xuất kết quả so sánh thành báo cáo PDF. + +## Tính năng + +- Tự động ghép cặp trang dựa trên độ tương đồng nội dung +- Chế độ xem so sánh cạnh nhau và chồng lớp +- Phân loại thay đổi: văn bản, hình ảnh, đầu trang/chân trang, chú thích, định dạng, nền +- Công tắc bộ lọc theo từng loại để hiện hoặc ẩn các loại thay đổi cụ thể +- Tìm kiếm thay đổi văn bản với bộ lọc truy vấn +- Hỗ trợ OCR để so sánh tài liệu quét +- Điều khiển thu phóng để kiểm tra chi tiết +- Cuộn đồng bộ giữa các bảng ở chế độ cạnh nhau +- Xuất kết quả so sánh thành PDF + +## Tùy chọn + +| Tùy chọn | Mô tả | +| -------------------- | ------------------------------------------------------------------------------------------------- | +| **Chế độ xem** | Cạnh nhau hoặc Chồng lớp | +| **OCR** | Bật/tắt OCR để so sánh tài liệu quét | +| **Ngôn ngữ OCR** | Ngôn ngữ để trích xuất văn bản bằng OCR | +| **Bộ lọc loại** | Bật/tắt hiển thị thay đổi về văn bản, hình ảnh, đầu trang/chân trang, chú thích, định dạng và nền | +| **Phạm vi thay đổi** | Ở chế độ chồng lớp, lọc giữa tất cả thay đổi hoặc chỉ nội dung | +| **Thu phóng** | Điều chỉnh mức phóng đại để kiểm tra chi tiết | + +## Trường hợp sử dụng + +- Xem lại các bản sửa hợp đồng để tìm chính xác điều gì đã thay đổi giữa các phiên bản +- So sánh bản mockup thiết kế để xác nhận PDF xuất ra đúng như mong đợi +- Kiểm toán thay đổi tài liệu trong các ngành được quản lý, nơi mọi chỉnh sửa đều phải được theo dõi +- Xác minh quá trình chuyển đổi PDF giữ nguyên nội dung gốc một cách chính xác +- Đối chiếu tài liệu dịch với bản gốc để tìm thay đổi về bố cục + +## Mẹo + +- Chế độ chồng lớp xếp hai tài liệu lên nhau, giúp các khác biệt về không gian (phần tử bị dịch chuyển, hình ảnh bị đổi kích thước) hiện ra ngay lập tức. +- Bật OCR khi so sánh tài liệu quét không có lớp văn bản. Engine so sánh sẽ trích xuất văn bản từ ảnh trang. +- Dùng bộ lọc loại để tập trung vào điều quan trọng. Ví dụ, ẩn thay đổi định dạng khi bạn chỉ quan tâm đến khác biệt về nội dung văn bản. + +## Công cụ liên quan + +- [Xem Metadata](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [Gộp PDF](./merge-pdf) diff --git a/docs/vi/tools/compress-pdf.md b/docs/vi/tools/compress-pdf.md new file mode 100644 index 00000000..a46c5845 --- /dev/null +++ b/docs/vi/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: Nén PDF +description: Giảm dung lượng tệp PDF tới 90% với engine Hyper Compress. Hỗ trợ kích thước tệp mục tiêu, xử lý hàng loạt và cài đặt chất lượng tùy chỉnh. +--- + +# Nén PDF + +Thu nhỏ tệp PDF mà không làm hỏng chúng. Nén PDF được cung cấp bởi [Hyper Compress](https://www.bentopdf.com/hyper-compress), engine nén riêng của BentoPDF. Nó nén lại hình ảnh, tạo tập con và gộp phông chữ, đồng thời loại bỏ phần dư thừa như ảnh thu nhỏ nhúng sẵn và dữ liệu riêng của ứng dụng. PDF vẫn hoạt động đầy đủ: văn bản vẫn chọn được, liên kết và trường biểu mẫu vẫn dùng được. + +Hyper Compress được biên dịch sang WebAssembly và đi kèm BentoPDF, nên việc nén hoạt động offline và trong các môi trường triển khai cách ly mạng mà không cần thiết lập thêm. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào. +2. Chọn **Mức nén**: Thấp, Trung bình, Cao hoặc Không mất dữ liệu. +3. Có thể nhập **Kích thước tệp mục tiêu**, hoặc mở **Cài đặt tùy chỉnh** để điều chỉnh chi tiết, gồm cả **Chuyển sang thang xám**. +4. Nhấp **Nén PDF**. Với nhiều tệp, bạn nhận được một tệp ZIP duy nhất để tải xuống. + +## Tài liệu đặc biệt + +- **PDF có chữ ký số** được trả về nguyên vẹn, vì mọi thay đổi đều làm mất hiệu lực chữ ký. Bật **Ghi đè bảo vệ nội dung** trong Cài đặt tùy chỉnh để gỡ chữ ký và nén chúng; chữ ký hiển thị vẫn nằm trên trang, nhưng tệp không còn được ký. +- **Tệp PDF/A** mất nhãn PDF/A sau khi nén, để tệp không bao giờ tuyên bố một mức tuân thủ mà nó không còn đáp ứng. Bật **Giữ PDF/A** trong Cài đặt tùy chỉnh để giữ tệp tuân thủ. +- **PDF có mật khẩu** có ô nhập mật khẩu trên thẻ tệp. Nhập mật khẩu ở đó và Hyper Compress tự mở tệp, không cần bước giải mã riêng. Với hai tệp bị khóa trở lên, một ô dùng chung sẽ mở khóa mọi tệp có cùng mật khẩu. Bản đã nén không có mật khẩu; hãy dùng [Mã hóa PDF](./protect-pdf) để thêm lại. +- **Bản quét không có lớp văn bản** có thể nhỏ hơn nữa với **Raster hóa trang** trong Cài đặt tùy chỉnh, thay mỗi trang bằng một hình ảnh đã tối ưu. Tùy chọn này bị bỏ qua với mọi tài liệu có văn bản chọn được, kể cả bản quét đã qua OCR, trừ khi **Ghi đè bảo vệ nội dung** đang bật. Khi đó các trang văn bản cũng thành hình ảnh, nên văn bản không còn chọn được và liên kết ngừng hoạt động. + +## Mức nén + +| Mức | Chất lượng hình ảnh | Độ phân giải tối đa | Phù hợp nhất cho | +| --------------------- | ------------------- | ------------------- | ------------------------------- | +| **Thấp** | 80 | 200 DPI | Giữ chất lượng hình ảnh | +| **Trung bình** | 50 | 150 DPI | Tài liệu hằng ngày | +| **Cao** | 20 | 72 DPI | Tệp đính kèm email, tải lên web | +| **Không mất dữ liệu** | Hình ảnh giữ nguyên | Không đổi | Bản lưu trữ | + +Mức Cao còn gỡ nhúng 14 phông chữ PDF tiêu chuẩn, cùng các phông tương tự như Arial khi an toàn. + +## Kích thước tệp mục tiêu + +Nhập kích thước theo KB hoặc MB và Hyper Compress sẽ tìm chất lượng hình ảnh tốt nhất vẫn vừa kích thước đó, bắt đầu từ mức bạn đã chọn. Nếu tài liệu không thể nhỏ đến vậy, bạn nhận được phiên bản nhỏ nhất có thể cùng một thông báo cho biết điều đó. Các trang chuyên biệt như [Nén PDF xuống 1MB](https://www.bentopdf.com/compress-pdf-to-1mb) mở ra với mục tiêu đã được điền sẵn. + +## Cài đặt tùy chỉnh + +Mở bảng Cài đặt tùy chỉnh để điều chỉnh trực tiếp Hyper Compress. Chọn một mức nén sẽ đặt lại các giá trị này về giá trị của mức đó, và chỉnh sửa bất kỳ giá trị nào sẽ chuyển mức sang Tùy chỉnh. + +- **Ghi đè bảo vệ nội dung**: theo mặc định Hyper Compress không động đến PDF đã ký và không raster hóa các trang có văn bản. Bật tùy chọn này sẽ bỏ qua cả hai. Nó vẫn bật khi bạn đổi mức. + +- **Hình ảnh**: chất lượng hình ảnh, độ phân giải tối đa, buộc lấy mẫu lại, giảm màu, cắt các vùng ảnh vô hình, xóa ảnh thay thế, đơn giản hóa hồ sơ màu, JPEG 2000 và chế độ không mất dữ liệu +- **Phông chữ**: tạo tập con, gộp bản trùng và gỡ nhúng phông chuẩn cùng các phông tương tự +- **Nội dung**: làm phẳng chú thích, trường biểu mẫu hoặc liên kết +- **Dọn dẹp**: xóa ảnh thu nhỏ, dữ liệu ứng dụng, article thread, thông tin chụp web, cây cấu trúc hoặc output intent +- **Raster hóa**: thay trang bằng hình ảnh, cho bản quét chỉ có ảnh; bị bỏ qua khi tài liệu có văn bản chọn được +- **Đầu ra**: Giữ PDF/A, và nén Brotli cho trình đọc PDF 2.0 có hỗ trợ + +## Trường hợp sử dụng + +- Đưa báo cáo 50 MB xuống dưới giới hạn tệp đính kèm email +- Đưa bản quét xuống dưới giới hạn tải lên nghiêm ngặt của một cổng thông tin bằng kích thước tệp mục tiêu +- Tối ưu PDF tiếp thị để tải xuống từ website nhanh hơn +- Lưu trữ bộ tài liệu lớn khi chi phí lưu trữ là vấn đề +- Giảm lưu lượng dữ liệu di động khi chia sẻ PDF qua ứng dụng nhắn tin + +## Mẹo + +- Bắt đầu với Trung bình. Nếu kết quả vẫn quá lớn, hãy đặt kích thước tệp mục tiêu hoặc tăng lên Cao. +- Với bản quét không có lớp văn bản, hãy bật Raster hóa trang trong Cài đặt tùy chỉnh. +- Chuyển sang thang xám, trong Cài đặt tùy chỉnh, có thể giảm dung lượng với tài liệu nhiều màu. + +## Công cụ liên quan + +- [Tuyến tính hóa PDF](./linearize-pdf): tối ưu PDF đã nén để xem web nhanh +- [Raster hóa PDF](./rasterize-pdf): chuyển trang thành hình ảnh ở DPI cụ thể, kể cả trang có văn bản +- [Sửa chữa PDF](./repair-pdf): sửa PDF bị hỏng trong quá trình nén ở nơi khác +- [Xóa metadata](./remove-metadata): loại bỏ dữ liệu ẩn để bảo vệ quyền riêng tư diff --git a/docs/vi/tools/crop-pdf.md b/docs/vi/tools/crop-pdf.md new file mode 100644 index 00000000..f7ddd3e4 --- /dev/null +++ b/docs/vi/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: Cắt PDF +description: Cắt các trang PDF trực quan bằng cách vẽ vùng cắt trên từng trang với trình chỉnh sửa dùng Cropper.js. +--- + +# Cắt PDF + +Cắt bớt lề các trang PDF bằng giao diện cắt trực quan. Vẽ hình chữ nhật cắt trực tiếp trên từng trang, xem trước kết quả rồi áp dụng. Bạn có thể đặt vùng cắt khác nhau cho từng trang hoặc áp dụng cùng một vùng cắt cho toàn bộ tài liệu. + +## Cách hoạt động + +1. Tải lên tệp PDF. +2. Trình chỉnh sửa cắt mở ra, hiển thị trang đầu tiên với lớp phủ cắt có thể kéo. +3. Điều chỉnh hình chữ nhật cắt bằng cách kéo các cạnh hoặc góc. +4. Dùng các nút điều hướng trang để chuyển giữa các trang và đặt vùng cắt cho từng trang. +5. Nhấp **Cắt** để áp dụng và tải xuống kết quả. + +## Tính năng + +- Trình chỉnh sửa cắt trực quan dùng Cropper.js với các tay nắm để điều chỉnh chính xác +- Điều hướng từng trang để đặt vùng cắt riêng +- Lưu cài đặt cắt theo từng trang để bạn có thể định nghĩa vùng cắt khác nhau cho các trang khác nhau +- Xem trước trực tiếp vùng cắt đã chọn +- Hỗ trợ PDF với mọi kích thước và hướng trang + +## Trường hợp sử dụng + +- Loại bỏ lề rộng khỏi tài liệu quét để tập trung vào vùng nội dung +- Cắt bỏ dấu cắt hoặc dấu căn chỉnh của máy in khỏi PDF tiền in +- Cắt slide bài giảng để bỏ vùng ghi chú của người trình bày +- Loại bỏ đầu trang hoặc chân trang khỏi mọi trang trước khi chia sẻ đoạn trích tài liệu +- Đổi kích thước trang cho vừa một màn hình hoặc bố cục in cụ thể + +## Mẹo + +- Lớp phủ cắt có thể đổi kích thước và di chuyển tự do. Kéo các góc để đổi kích thước theo tỷ lệ hoặc kéo các cạnh để chỉnh theo một trục. +- Với tài liệu mà mọi trang cần cùng một vùng cắt, hãy đặt nó trên trang đầu tiên: công cụ ghi nhớ vùng cắt của bạn khi bạn chuyển trang. +- Nếu bạn cần chuẩn hóa kích thước trang thay vì cắt trực quan, công cụ Sửa kích thước trang có thể phù hợp hơn. + +## Công cụ liên quan + +- [Trình chỉnh sửa PDF](./edit-pdf) +- [Số trang](./page-numbers) +- [Xóa trang trống](./remove-blank-pages) diff --git a/docs/vi/tools/csv-to-pdf.md b/docs/vi/tools/csv-to-pdf.md new file mode 100644 index 00000000..9c854a5a --- /dev/null +++ b/docs/vi/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV sang PDF +description: Chuyển đổi tệp bảng tính CSV thành bảng PDF đã định dạng ngay trong trình duyệt. +--- + +# CSV sang PDF + +Biến tệp CSV thành tài liệu PDF gọn gàng, đã định dạng. Mỗi tệp CSV được phân tích và hiển thị dưới dạng bảng trong PDF đầu ra. Điều này hữu ích khi bạn cần in hoặc chia sẻ dữ liệu dạng bảng mà người nhận không cần có phần mềm bảng tính. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :----------- | +| CSV | `.csv` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo thả một hoặc nhiều tệp CSV. +2. Xem lại danh sách tệp. Thêm tệp hoặc xóa những tệp không cần. +3. Nhấp **Chuyển đổi sang PDF**. Thanh tiến trình hiển thị trạng thái chuyển đổi. +4. Một tệp được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được đóng gói vào `csv-converted.zip`. + +## Tùy chọn + +Công cụ này không có cấu hình bổ sung. CSV được tự động phân tích và định dạng thành bảng. + +## Đầu ra + +| Số tệp đầu vào | Đầu ra | +| :------------- | :----------------------------------------------------- | +| 1 tệp | Tải xuống một PDF (ví dụ: `data.pdf`) | +| 2+ tệp | Kho ZIP (`csv-converted.zip`) chứa một PDF cho mỗi tệp | + +## Trường hợp sử dụng + +- Chuyển các báo cáo cơ sở dữ liệu đã xuất thành bảng PDF có thể in +- Chia sẻ dữ liệu tài chính hoặc danh sách kho cho người không có Excel +- Tạo phiên bản PDF của tệp nhật ký CSV cho tài liệu tuân thủ +- In danh sách địa chỉ, bảng điểm hoặc bất kỳ dữ liệu bảng nào lưu dưới dạng CSV + +## Mẹo + +- Để có kết quả tốt nhất, hãy đảm bảo CSV dùng dấu phân cách là dấu phẩy chuẩn. Công cụ tuân theo các quy ước phân tích CSV phổ biến. +- Nếu CSV có nhiều cột, bảng có thể bị nén lại để vừa chiều rộng trang. Hãy cân nhắc chia các bộ dữ liệu rộng thành nhiều tệp. +- Với tệp Excel (`.xls`, `.xlsx`), hãy dùng công cụ [Excel sang PDF](./excel-to-pdf), giữ nguyên định dạng bảng tính và nhiều trang tính. + +## Công cụ liên quan + +- [Excel sang PDF](./excel-to-pdf) +- [Văn bản sang PDF](./txt-to-pdf) +- [JSON sang PDF](./json-to-pdf) diff --git a/docs/vi/tools/delete-pages.md b/docs/vi/tools/delete-pages.md new file mode 100644 index 00000000..9a0bad12 --- /dev/null +++ b/docs/vi/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: Xóa trang +description: Xóa các trang cụ thể khỏi PDF theo số trang, phạm vi hoặc chọn trực quan bằng ảnh thu nhỏ. +--- + +# Xóa trang + +Xóa các trang không cần thiết khỏi tài liệu PDF. Chỉ định trang cần xóa bằng cách nhập số trang hoặc phạm vi, hoặc nhấp trực tiếp vào ảnh thu nhỏ để đánh dấu xóa. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Công cụ hiển thị ảnh thu nhỏ xem trước của mọi trang. +2. Nhập các trang cần xóa vào ô văn bản theo cú pháp phạm vi (ví dụ: `2, 5-8`), hoặc nhấp vào ảnh thu nhỏ để bật/tắt chúng. +3. Các trang được đánh dấu sẽ được làm nổi bật để bạn xác nhận lựa chọn. +4. Nhấp nút xử lý. Một PDF mới được tạo với các trang đã chọn bị xóa. + +## Tính năng + +- Chọn trang bằng văn bản với cú pháp phạm vi (`2, 5-8, 12`) +- Lưới ảnh thu nhỏ trực quan để nhấp chọn xóa +- Làm nổi bật theo thời gian thực các trang được đánh dấu xóa +- Kiểm tra đầu vào dựa trên số trang thực tế +- Giữ tất cả các trang không bị xóa theo thứ tự ban đầu + +## Trường hợp sử dụng + +- Xóa các trang trống hoặc trang đệm khỏi tài liệu quét +- Bỏ trang bìa hoặc phụ lục trước khi chia sẻ tài liệu +- Dọn các trang nháp vô tình còn sót trong PDF cuối cùng +- Xóa các trang chứa thông tin nhạy cảm trước khi phân phối + +## Mẹo + +- Xóa trang không ảnh hưởng đến nội dung hay định dạng của các trang còn lại. Đầu ra là bản sao trung thực của bản gốc trừ các trang đã xóa. +- Nếu bạn muốn chỉ giữ một số trang cụ thể thay vì xóa một số trang, [Trích xuất trang](./extract-pages) phù hợp hơn. +- Chế độ xem ảnh thu nhỏ tải theo kiểu lazy, nên tài liệu lớn vẫn phản hồi mượt. + +## Công cụ liên quan + +- [Trích xuất trang](./extract-pages) +- [Sắp xếp và nhân bản](./organize-pdf) +- [Chia PDF](./split-pdf) diff --git a/docs/vi/tools/deskew-pdf.md b/docs/vi/tools/deskew-pdf.md new file mode 100644 index 00000000..d5780edf --- /dev/null +++ b/docs/vi/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: Chỉnh nghiêng PDF +description: Tự động chỉnh thẳng các trang bị nghiêng trong PDF quét bằng phát hiện độ nghiêng của OpenCV. Có thể điều chỉnh ngưỡng và DPI. +--- + +# Chỉnh nghiêng PDF + +Tài liệu quét hiếm khi thẳng hoàn hảo. Chỉ một độ nghiêng nhỏ cũng làm OCR kém chính xác và bản in trông cẩu thả. Công cụ này dùng các thuật toán xử lý ảnh của OpenCV để phát hiện góc nghiêng của từng trang và xoay nó về ngang bằng. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF quét. +2. Đặt **Ngưỡng độ nghiêng**: các trang có độ nghiêng phát hiện được thấp hơn giá trị này sẽ được giữ nguyên. +3. Chọn **Chất lượng xử lý (DPI)**: DPI cao hơn giúp phát hiện chính xác hơn nhưng mất nhiều thời gian hơn. +4. Nhấp **Chỉnh thẳng PDF**. +5. Sau khi xử lý, bảng kết quả hiển thị góc phát hiện được của từng trang và trang đó có được chỉnh hay không. + +## Tùy chọn + +| Cài đặt | Giá trị | Mặc định | +| --------------------- | --------------------- | -------- | +| **Ngưỡng độ nghiêng** | 0.1, 0.5, 1.0, 2.0 độ | 0.5 | +| **DPI xử lý** | 100, 150, 200, 300 | 150 | + +## Cách phát hiện độ nghiêng hoạt động + +Công cụ kết xuất từng trang thành ảnh ở DPI đã chọn, sau đó dùng OpenCV để phát hiện các góc đường chủ đạo trong nội dung. Nếu độ nghiêng phát hiện được vượt ngưỡng, trang được xoay theo góc ngược lại để làm thẳng. Các trang dưới ngưỡng được giữ nguyên. + +## Trường hợp sử dụng + +- Dọn dẹp hợp đồng hoặc tài liệu pháp lý quét hàng loạt +- Chuẩn bị biên lai hoặc hóa đơn quét cho xử lý OCR +- Chỉnh thẳng các trang từ máy quét phẳng khi giấy đặt không đồng đều +- Cải thiện chất lượng hình ảnh của tài liệu lưu trữ đã số hóa + +## Mẹo + +- Hạ ngưỡng xuống 0.1 độ nếu bạn cần căn chỉnh chính xác từng điểm ảnh cho OCR. +- 150 DPI nhanh và chính xác với hầu hết tài liệu. Dùng 300 DPI cho văn bản rất nhỏ hoặc trang nhiều chi tiết. +- Chỉnh thẳng hoạt động tốt nhất với tài liệu có các dòng văn bản ngang rõ ràng. Nó có thể gặp khó với các trang chủ yếu là hình ảnh hoặc có yếu tố thiết kế đường chéo. + +## Công cụ liên quan + +- [Raster hóa PDF](./rasterize-pdf): chuyển đầu ra đã chỉnh thẳng thành PDF dạng ảnh phẳng +- [Nén PDF](./compress-pdf): giảm dung lượng tệp sau khi chỉnh thẳng +- [Sửa chữa PDF](./repair-pdf): sửa lỗi cấu trúc trong PDF quét diff --git a/docs/vi/tools/digital-sign-pdf.md b/docs/vi/tools/digital-sign-pdf.md new file mode 100644 index 00000000..15dfb6b5 --- /dev/null +++ b/docs/vi/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: Chữ ký số +description: Thêm chữ ký số mật mã vào PDF bằng chứng chỉ X.509. Hỗ trợ định dạng PKCS#12 và PEM với tùy chọn chữ ký hiển thị. +--- + +# Chữ ký số + +Chữ ký số là bằng chứng mật mã cho thấy một người cụ thể đã ký tài liệu và tài liệu không bị thay đổi kể từ đó. Khác với chữ ký vẽ tay (chỉ là một hình ảnh), chữ ký số dùng chứng chỉ X.509 và chuẩn PKCS#7 để cung cấp tính xác thực và toàn vẹn có thể kiểm chứng. + +BentoPDF áp dụng chữ ký số hoàn toàn trong trình duyệt của bạn. Khóa riêng của bạn không bao giờ rời khỏi thiết bị. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Tải lên tệp chứng chỉ của bạn (.pfx, .p12 hoặc .pem). +3. Nhập mật khẩu chứng chỉ để mở khóa. Công cụ hiển thị chủ thể, nhà phát hành và thời hạn hiệu lực của chứng chỉ. +4. Có thể cấu hình metadata chữ ký (lý do, địa điểm, thông tin liên hệ). +5. Có thể bật **chữ ký hiển thị** với tùy chỉnh vị trí, kích thước, hình ảnh và văn bản. +6. Nhấp **Ký PDF**. + +## Định dạng chứng chỉ được hỗ trợ + +| Định dạng | Phần mở rộng | Mô tả | +| ----------- | ------------ | ----------------------------------------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | Gói chuẩn công nghiệp chứa khóa riêng và chuỗi chứng chỉ. Định dạng phổ biến nhất. | +| **PEM** | .pem | Định dạng văn bản. Phải chứa cả chứng chỉ và khóa riêng trong một tệp. Hỗ trợ khóa riêng được mã hóa. | + +## Tùy chọn chữ ký hiển thị + +Khi bật, một khối chữ ký hiển thị được vẽ trên trang PDF: + +- **Vị trí**: Tọa độ X/Y và chiều rộng/chiều cao tính bằng point +- **Trang**: Trang đầu, trang cuối, tất cả các trang hoặc một số trang cụ thể +- **Hình ảnh**: Tải lên ảnh PNG, JPG hoặc WebP (chữ ký tay, con dấu công ty, v.v.) +- **Văn bản**: Văn bản tùy chỉnh với màu và cỡ chữ có thể cấu hình. Nếu không có hình ảnh hoặc văn bản, công cụ tự tạo văn bản từ tên chung (common name) của chứng chỉ và ngày hiện tại. + +## Metadata chữ ký + +- **Lý do**: Vì sao tài liệu được ký (ví dụ: "Đã phê duyệt", "Đã xem xét") +- **Địa điểm**: Nơi việc ký diễn ra (ví dụ: "New York, NY") +- **Thông tin liên hệ**: Cách liên lạc với người ký (ví dụ: địa chỉ email) + +## Lưu ý về kết nối Internet + +Việc ký có thể cần kết nối Internet. Thư viện ký tải chuỗi chứng chỉ từ các URL nhúng trong phần mở rộng Authority Information Access (AIA) của chứng chỉ. Nếu không truy cập được các máy chủ đó, việc ký sẽ thất bại với các chứng chỉ cần xác thực chuỗi. + +## Trường hợp sử dụng + +- Ký hợp đồng, đề xuất và thỏa thuận bằng chữ ký số có giá trị pháp lý +- Chứng thực tài liệu chính thức trong quy trình yêu cầu xác thực dựa trên PKI +- Ký hóa đơn PDF để tuân thủ quy định (nhiều nước EU yêu cầu hóa đơn điện tử có chữ ký số) +- Thêm phê duyệt của tổ chức vào bản vẽ kỹ thuật hoặc tài liệu chất lượng + +## Mẹo + +- Chứng chỉ tự ký dùng được để thử nghiệm nhưng sẽ hiện cảnh báo trong Adobe Reader. Hãy dùng chứng chỉ từ một Tổ chức cấp chứng chỉ (CA) đáng tin cậy cho tài liệu chính thức. +- Chữ ký hiển thị chỉ mang tính trực quan. Chữ ký mật mã luôn được nhúng dù khối hiển thị có được bật hay không. +- Hãy xác minh PDF đã ký bằng công cụ Xác thực chữ ký để chắc chắn chữ ký còn nguyên vẹn. + +## Công cụ liên quan + +- [Xác thực chữ ký](./validate-signature-pdf): xác minh chữ ký số trong PDF đã ký +- [Làm phẳng PDF](./flatten-pdf): làm phẳng biểu mẫu trước khi ký để ngăn chỉnh sửa +- [Mã hóa PDF](./protect-pdf): thêm bảo vệ bằng mật khẩu lên trên chữ ký số +- [Xóa metadata](./remove-metadata): loại bỏ metadata trước khi ký diff --git a/docs/vi/tools/divide-pages.md b/docs/vi/tools/divide-pages.md new file mode 100644 index 00000000..a01a1aa7 --- /dev/null +++ b/docs/vi/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: Chia trang +description: Chia các trang PDF theo chiều ngang hoặc dọc thành các trang con nhỏ hơn. +--- + +# Chia trang + +Cắt từng trang PDF thành hai nửa bằng cách chia theo chiều ngang hoặc dọc. Công cụ này hữu ích khi một trang chứa nội dung cần tách thành các trang riêng, ví dụ bố cục hai cột được quét thành một trang rộng. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Chọn hướng chia: **Dọc** (nửa trái/phải) hoặc **Ngang** (nửa trên/dưới). +3. Có thể chỉ định phạm vi trang để giới hạn các trang được chia. Để trống để chia tất cả các trang. +4. Nhấp nút xử lý để tạo PDF đã chia. + +## Tính năng + +- Chia dọc: chia mỗi trang thành nửa trái và nửa phải +- Chia ngang: chia mỗi trang thành nửa trên và nửa dưới +- Bộ lọc phạm vi trang để chia có chọn lọc các trang cụ thể +- Các trang không được chọn được giữ nguyên +- Giữ chất lượng nội dung mà không cần kết xuất lại + +## Trường hợp sử dụng + +- Tách các trang quét hai mặt trên một tờ (ví dụ: bản quét sách có trang trái và phải trên cùng một tờ) +- Chia PDF ngang có nội dung đặt cạnh nhau thành các trang dọc riêng lẻ +- Chia infographic hoặc áp phích cao thành các phần trên và dưới riêng biệt +- Chuẩn bị tài liệu khổ rộng để in trên giấy tiêu chuẩn + +## Mẹo + +- Nếu nội dung trên trang phân bố không đều, việc chia vẫn diễn ra đúng tại điểm giữa. Với cách chia không đối xứng, hãy cân nhắc dùng [Cắt PDF](./crop-pdf). +- Kết hợp công cụ này với [Xoay PDF](./rotate-pdf) nếu các trang cần xoay trước hoặc sau khi chia. + +## Công cụ liên quan + +- [Chia PDF](./split-pdf) +- [Cắt PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [Chia PDF thành poster](./posterize-pdf) diff --git a/docs/vi/tools/duplex-collate.md b/docs/vi/tools/duplex-collate.md new file mode 100644 index 00000000..8bf54f30 --- /dev/null +++ b/docs/vi/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: Sắp xếp bản quét hai mặt +description: Sắp xếp lại PDF quét hai mặt có các trang mặt trước và mặt sau nằm trong các khối riêng thành đúng thứ tự trước/sau. +--- + +# Sắp xếp bản quét hai mặt + +Sắp xếp quét hai mặt được thiết kế cho quy trình quét ADF, nơi một PDF chứa hai khối trang: + +- tất cả mặt trước trước +- tất cả mặt sau sau + +Thay vì tách và ghép lại thủ công, công cụ này xen kẽ hai khối thành thứ tự đọc tự nhiên: mặt trước 1, mặt sau 1, mặt trước 2, mặt sau 2, và cứ thế. + +## Cách hoạt động + +1. Tải lên một PDF được tạo từ việc quét xấp giấy hai mặt. +2. Đặt điểm chia nơi khối mặt trước kết thúc. +3. Chọn cách xử lý khối mặt sau: + - **Đảo ngược khối mặt sau** (thường dùng khi xấp giấy được lật trước khi quét mặt sau) + - **Giữ nguyên khối mặt sau** +4. Nhấp **Sắp xếp PDF** để tải xuống kết quả đã sắp xếp lại. + +## Tùy chọn + +- **Tự động phát hiện điểm chia (một nửa)**: đặt điểm chia là `ceil(totalPages / 2)`. +- **Cảnh báo số trang lẻ**: cảnh báo khi tổng số trang là số lẻ (thường là do quét lệch). +- **Xác nhận khối không đều**: yêu cầu xác nhận khi kích thước khối mặt trước/mặt sau khác nhau. +- **Xuất theo nhóm**: chia đầu ra đã sắp xếp thành các PDF riêng dựa trên số trang của tài liệu gốc và tải xuống dưới dạng ZIP. + +## Hành vi đầu ra + +- **Mặc định**: một PDF đầu ra (một PDF đầu vào, một PDF đầu ra). +- **Chế độ theo nhóm**: đầu ra được chia khúc theo giá trị số trang mỗi tài liệu của bạn; nếu tạo ra nhiều khúc, chúng được tải xuống dưới dạng một ZIP, ngược lại tải xuống một PDF. + +Nếu kích thước các khối không đều, các trang đã ghép cặp được sắp xếp trước, và các trang còn lại chưa ghép cặp được nối vào cuối. + +## Trường hợp sử dụng phổ biến + +- Khôi phục thứ tự sau khi quét một chồng biểu mẫu hai mặt trong hai lượt. +- Dựng lại các bộ mặt trước/mặt sau từ máy quét văn phòng xuất tất cả mặt trước rồi đến tất cả mặt sau. +- Hậu xử lý bản quét lưu trữ trước khi chia thành các tệp theo từng tài liệu. + +## Mẹo + +- Hầu hết các lô quét hai mặt nên có tổng số trang chẵn. +- Nếu mặt sau trông bị ngược, hãy chuyển giữa **Đảo ngược khối mặt sau** và **Giữ nguyên khối mặt sau**. +- Với bản gốc 2 trang (mặt trước + mặt sau), hãy dùng xuất theo nhóm với `2` trang mỗi tài liệu. + +## Công cụ liên quan + +- [Xen kẽ và trộn trang](./alternate-merge) +- [Chia PDF](./split-pdf) +- [Gộp PDF](./merge-pdf) +- [Sắp xếp và nhân bản](./organize-pdf) diff --git a/docs/vi/tools/edit-attachments.md b/docs/vi/tools/edit-attachments.md new file mode 100644 index 00000000..aa88ffa1 --- /dev/null +++ b/docs/vi/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: Chỉnh sửa tệp đính kèm +description: Xem và xóa có chọn lọc các tệp đính kèm nhúng trong tài liệu PDF. +--- + +# Chỉnh sửa tệp đính kèm + +Kiểm tra và quản lý các tệp đính kèm bên trong PDF. Công cụ liệt kê mọi tệp nhúng cùng tên và cấp đính kèm, sau đó cho phép bạn đánh dấu từng tệp để xóa hoặc xóa tất cả cùng lúc. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Công cụ tự động quét các tệp đính kèm và hiển thị chúng trong danh sách. +3. Mỗi tệp đính kèm hiển thị tên tệp và cho biết đó là tệp đính kèm cấp tài liệu hay cấp trang. +4. Nhấp biểu tượng thùng rác bên cạnh một tệp đính kèm để đánh dấu xóa (nhấp lại để bỏ đánh dấu). +5. Dùng nút **Xóa tất cả tệp đính kèm** để chọn tất cả cùng lúc, hoặc **Bỏ chọn tất cả** để xóa các lựa chọn. +6. Nhấp nút xử lý để lưu PDF mới với các tệp đính kèm đã chọn bị xóa. + +## Tính năng + +- Liệt kê tất cả tệp đính kèm cấp tài liệu và cấp trang +- Xóa từng tệp hoặc hàng loạt +- Bật/tắt lựa chọn trước khi áp dụng thay đổi +- Gạch ngang và giảm độ đậm trực quan trên các mục được đánh dấu xóa +- Tải xuống PDF đã sửa với các tệp đính kèm đã chọn bị loại bỏ + +## Trường hợp sử dụng + +- Xóa các tệp lỗi thời hoặc sai được nhúng trong tài liệu trước khi phân phối lại +- Loại bỏ các tệp đính kèm nhạy cảm (dữ liệu tài chính, thông tin cá nhân) khỏi PDF trước khi chia sẻ +- Giảm dung lượng PDF bằng cách xóa các tệp nhúng lớn không còn cần thiết +- Kiểm tra nội dung nhúng và dọn dẹp tài liệu trước khi lưu trữ + +## Mẹo + +- Các tệp đính kèm được đánh dấu xóa được hiển thị với đường gạch ngang. Bạn có thể bật lại chúng trước khi xử lý nếu đổi ý. +- Nếu không tìm thấy tệp đính kèm nào, công cụ hiển thị thông báo rõ ràng "Không tìm thấy tệp đính kèm": PDF đơn giản là không chứa tệp nhúng. + +## Công cụ liên quan + +- [Thêm tệp đính kèm](./add-attachments) +- [Trích xuất tệp đính kèm](./extract-attachments) +- [Xem Metadata](./view-metadata) diff --git a/docs/vi/tools/edit-metadata.md b/docs/vi/tools/edit-metadata.md new file mode 100644 index 00000000..df48752b --- /dev/null +++ b/docs/vi/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: Chỉnh sửa Metadata +description: Xem và sửa các trường metadata của PDF gồm tiêu đề, tác giả, từ khóa, ngày tháng và thuộc tính tùy chỉnh. +--- + +# Chỉnh sửa Metadata + +Chỉnh sửa metadata nhúng trong tệp PDF. Công cụ điền sẵn một biểu mẫu với metadata hiện có của tài liệu, cho phép bạn sửa bất kỳ trường nào và lưu thay đổi vào một PDF mới. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Công cụ đọc metadata hiện tại và điền vào biểu mẫu. +2. Chỉnh sửa bất kỳ trường chuẩn nào: Tiêu đề, Tác giả, Chủ đề, Từ khóa, Creator, Producer. +3. Điều chỉnh Ngày tạo và Ngày sửa đổi bằng bộ chọn ngày giờ. +4. Thêm trường metadata tùy chỉnh bằng cách nhấp nút thêm và nhập một cặp khóa-giá trị. +5. Nhấp nút xử lý để lưu PDF đã sửa. + +## Tính năng + +- Điền sẵn toàn bộ metadata hiện có từ PDF đã tải lên +- Trường chuẩn: Tiêu đề, Tác giả, Chủ đề, Từ khóa, Creator, Producer +- Bộ chọn ngày giờ cho Ngày tạo và Ngày sửa đổi +- Trường metadata khóa-giá trị tùy chỉnh cho các thuộc tính tùy ý +- Lưu thay đổi trực tiếp vào từ điển thông tin tài liệu của PDF + +## Các trường có thể chỉnh sửa + +| Trường | Mô tả | +| -------------------- | -------------------------------------------------------------- | +| **Tiêu đề** | Tiêu đề tài liệu hiển thị trong trình đọc PDF | +| **Tác giả** | Người hoặc tổ chức đã tạo tài liệu | +| **Chủ đề** | Mô tả ngắn về chủ đề của tài liệu | +| **Từ khóa** | Các thuật ngữ phân tách bằng dấu phẩy để tìm kiếm và phân loại | +| **Ứng dụng tạo** | Ứng dụng đã tạo nội dung ban đầu | +| **Trình tạo PDF** | Ứng dụng đã tạo ra PDF | +| **Ngày tạo** | Thời điểm tài liệu được tạo ban đầu | +| **Ngày sửa đổi** | Thời điểm tài liệu được sửa đổi lần cuối | +| **Trường tùy chỉnh** | Mọi cặp khóa-giá trị bổ sung do bạn định nghĩa | + +## Trường hợp sử dụng + +- Đặt tiêu đề và tác giả phù hợp trước khi xuất bản tài liệu +- Thêm từ khóa để cải thiện khả năng tìm kiếm trong hệ thống quản lý tài liệu +- Cập nhật ngày sửa đổi để phản ánh bản chỉnh sửa hiện tại +- Thêm các trường metadata tùy chỉnh như Phòng ban, Mã dự án hoặc Phân loại +- Dọn dẹp metadata do phần mềm soạn thảo gốc để lại + +## Mẹo + +- Trường tùy chỉnh được ghi trực tiếp vào từ điển info của PDF. Một số trình đọc PDF có thể không hiển thị trường tùy chỉnh, nhưng chúng vẫn được giữ trong tệp. +- Để trống một trường để xóa nó khỏi metadata. Nút xử lý lưu mọi thứ đang có trong biểu mẫu. +- Để xem metadata mà không chỉnh sửa, hãy dùng [Xem Metadata](./view-metadata). Để xóa toàn bộ metadata, hãy dùng Xóa metadata. + +## Công cụ liên quan + +- [Xem Metadata](./view-metadata) +- [Lớp PDF (OCG)](./pdf-layers) +- [Nén PDF](./compress-pdf) diff --git a/docs/vi/tools/edit-pdf.md b/docs/vi/tools/edit-pdf.md new file mode 100644 index 00000000..a33f02fb --- /dev/null +++ b/docs/vi/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: Trình chỉnh sửa PDF +description: Chú thích, đánh dấu, che thông tin, thêm hình khối và hình ảnh, tìm kiếm và xem PDF ngay trong trình duyệt. +--- + +# Trình chỉnh sửa PDF + +Trình chỉnh sửa PDF của BentoPDF cho phép bạn chú thích, đánh dấu, che thông tin, bình luận, thêm hình khối và hình ảnh, và tìm kiếm trong PDF. Nó tải một trình chỉnh sửa đầy đủ tính năng ngay trong trình duyệt mà không cần tải lên máy chủ. + +## Cách hoạt động + +1. Tải PDF lên bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Trình chỉnh sửa PDF nhúng tự động mở với tài liệu của bạn đã được tải. +3. Dùng thanh công cụ để chú thích, đánh dấu, che thông tin, thêm văn bản, vẽ hình khối hoặc chèn hình ảnh. +4. Nhấp **Tải xuống PDF đã chỉnh sửa** để lưu thay đổi. + +## Tính năng + +- Thanh công cụ chú thích đầy đủ với đánh dấu, gạch chân, gạch ngang và vẽ tay tự do +- Chèn văn bản và bình luận +- Công cụ che thông tin xóa vĩnh viễn nội dung đã đánh dấu sau khi bạn áp dụng. Nếu còn dấu nào chưa được áp dụng khi bạn nhấp **Tải xuống PDF đã chỉnh sửa**, trình chỉnh sửa sẽ đề nghị áp dụng chúng trước. +- Công cụ hình khối cho hình chữ nhật, hình tròn, đường thẳng và mũi tên +- Chèn hình ảnh lên các trang PDF +- Tìm kiếm văn bản tích hợp trong tài liệu +- Hỗ trợ nhiều tài liệu với các tab (tối đa 10 tài liệu mở cùng lúc) +- Tải tệp bằng kéo và thả + +## Trường hợp sử dụng + +- Xem xét hợp đồng và đánh dấu các thay đổi bằng highlight và bình luận +- Che thông tin mật như số an sinh xã hội hoặc dữ liệu tài chính trước khi chia sẻ +- Thêm chú thích vào bản vẽ kiến trúc hoặc kỹ thuật +- Chèn logo công ty hoặc con dấu lên các trang tài liệu +- Tìm kiếm các thuật ngữ cụ thể trong tài liệu pháp lý dài + +## Mẹo + +- Bạn có thể mở nhiều PDF cùng lúc và chuyển giữa chúng bằng thanh tab ở đầu trình chỉnh sửa. +- Trình chỉnh sửa giữ nguyên cấu trúc PDF gốc, nên phông chữ, bố cục và trường biểu mẫu vẫn nguyên vẹn. +- Đánh dấu văn bản hoặc một vùng để che thông tin sẽ không xóa gì cho đến khi việc che được áp dụng. Khi bạn che văn bản đã chọn, các bản sao của nó trong thuộc tính tệp, dấu trang, bình luận và tệp đính kèm cũng bị xóa khỏi bản tải xuống, trừ khi tệp được mã hóa. +- Với việc thêm watermark hoặc đánh số trang hàng loạt, hãy dùng các công cụ chuyên dụng để kiểm soát định dạng tốt hơn. + +## Công cụ liên quan + +- [Thêm watermark](./add-watermark) +- [Ký PDF](./sign-pdf) +- [Thêm con dấu](./add-stamps) +- [Xóa chú thích](./remove-annotations) diff --git a/docs/vi/tools/email-to-pdf.md b/docs/vi/tools/email-to-pdf.md new file mode 100644 index 00000000..444d1901 --- /dev/null +++ b/docs/vi/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: Email sang PDF +description: Chuyển đổi tệp email EML và MSG sang PDF ngay trong trình duyệt. Giữ nguyên tiêu đề, nội dung và danh sách tệp đính kèm. +--- + +# Email sang PDF + +Chuyển các tệp email đã lưu thành PDF gọn gàng, có thể in. Công cụ phân tích tệp EML và MSG, trích xuất toàn bộ thư (tiêu đề, nội dung và metadata tệp đính kèm) và hiển thị tất cả thành một PDF có cấu trúc. Hữu ích cho thu thập chứng cứ pháp lý, lưu hồ sơ, hoặc đơn giản là in một email quan trọng. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------- | :----------- | :---------------------------------------------------------- | +| EML | `.eml` | Định dạng email MIME chuẩn (xuất từ hầu hết ứng dụng email) | +| MSG | `.msg` | Định dạng độc quyền của Microsoft Outlook | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo thả các tệp EML hoặc MSG. Bạn có thể trộn cả hai định dạng trong một lô. +2. Xem lại danh sách tệp. Xóa các mục không cần bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để thêm email. +3. Cấu hình các tùy chọn chuyển đổi (xem bên dưới). +4. Nhấp **Chuyển đổi sang PDF**. Công cụ phân tích từng email, hiển thị nội dung dưới dạng HTML có định dạng và chuyển sang PDF qua engine PyMuPDF. +5. Một email được tải xuống trực tiếp dưới dạng PDF. Nhiều email được đóng gói vào `emails-converted.zip`. + +## Tùy chọn + +| Tùy chọn | Mặc định | Mô tả | +| :--------------------------------- | :------- | :--------------------------------------------------------------------------------------------- | +| **Khổ giấy** | A4 | Chọn giữa kích thước A4, Letter hoặc Legal. | +| **Bao gồm CC và BCC** | Bật | Khi bật, danh sách người nhận CC và BCC xuất hiện trong phần tiêu đề email của PDF. | +| **Bao gồm danh sách tệp đính kèm** | Bật | Khi bật, danh sách các tệp đính kèm của email (kèm tên tệp và kích thước) xuất hiện trong PDF. | + +## Trường hợp sử dụng + +- Lưu trữ thư từ kinh doanh quan trọng dưới dạng PDF để tuân thủ hoặc kiểm toán +- In chuỗi email cho thủ tục pháp lý hoặc yêu cầu cung cấp chứng cứ +- Tạo hồ sơ vĩnh viễn cho xác nhận đơn hàng, biên lai hoặc hợp đồng nhận qua email +- Sao lưu tệp Outlook MSG ở định dạng không cần Outlook để đọc +- Ghi lại các tương tác hỗ trợ khách hàng từ các tệp EML đã xuất + +## Mẹo + +- Cả EML (dùng bởi Thunderbird, Apple Mail và hầu hết ứng dụng email) lẫn tệp Outlook MSG đều được hỗ trợ. Hãy xuất email từ ứng dụng email của bạn và thả thẳng vào công cụ. +- Email định dạng HTML giữ nguyên kiểu dáng trong PDF. Email văn bản thuần được hiển thị với định dạng gọn gàng, dễ đọc. +- Danh sách tệp đính kèm hiển thị tên tệp và kích thước nhưng không nhúng chính các tệp đính kèm vào PDF. + +## Công cụ liên quan + +- [XML sang PDF](./xml-to-pdf) +- [XPS sang PDF](./xps-to-pdf) diff --git a/docs/vi/tools/epub-to-pdf.md b/docs/vi/tools/epub-to-pdf.md new file mode 100644 index 00000000..eeb466d2 --- /dev/null +++ b/docs/vi/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB sang PDF +description: Chuyển đổi sách điện tử EPUB sang PDF ngay trong trình duyệt. Miễn phí, không cần tải lên, ưu tiên quyền riêng tư. +--- + +# EPUB sang PDF + +Chuyển sách điện tử EPUB thành tệp PDF mà không cần rời trình duyệt. EPUB là chuẩn mở cho sách kỹ thuật số, nhưng đôi khi bạn cần một PDF bố cục cố định để in, chú thích hoặc chia sẻ với người không có trình đọc sách điện tử. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------- | :----------- | :------------------- | +| EPUB | `.epub` | Tệp EPUB 2 và EPUB 3 | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo thả các tệp EPUB. Hỗ trợ chọn nhiều tệp. +2. Xem lại các tệp đã tải lên. Xóa các mục không cần bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để mở rộng lô. +3. Nhấp **Chuyển đổi sang PDF**. Engine PyMuPDF kết xuất nội dung EPUB (văn bản, hình ảnh và định dạng) thành PDF được chia trang. +4. Một tệp EPUB được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được đóng gói vào kho ZIP tên là `epub-converted.zip`. + +## Tùy chọn + +Việc chuyển đổi chạy với các mặc định hợp lý và không cần cấu hình. Văn bản được dàn lại theo kích thước trang tiêu chuẩn, phông chữ và hình ảnh nhúng được giữ trong PDF. + +## Trường hợp sử dụng + +- In sách điện tử không DRM để đọc khi không dùng màn hình +- Nộp bản thảo EPUB dưới dạng PDF bố cục cố định để xem xét +- Lưu trữ sách kỹ thuật số ở định dạng mà hệ điều hành nào cũng mở được +- Chia sẻ một chương với đồng nghiệp không có trình đọc EPUB +- Chuyển tài liệu kỹ thuật phân phối dưới dạng EPUB thành PDF có thể chú thích + +## Mẹo + +- Các tính năng EPUB 3 như âm thanh và video nhúng sẽ không được giữ trong PDF, nhưng toàn bộ văn bản, hình ảnh và bảng được chuyển đổi gọn gàng. +- Để có kết quả tốt nhất với EPUB có nhiều kiểu dáng, hãy kiểm tra vài trang đầu của đầu ra để xác nhận bố cục đúng. + +## Công cụ liên quan + +- [MOBI sang PDF](./mobi-to-pdf) +- [FB2 sang PDF](./fb2-to-pdf) +- [CBZ sang PDF](./cbz-to-pdf) diff --git a/docs/vi/tools/excel-to-pdf.md b/docs/vi/tools/excel-to-pdf.md new file mode 100644 index 00000000..9c235858 --- /dev/null +++ b/docs/vi/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel sang PDF +description: Chuyển đổi bảng tính Excel (XLS, XLSX), ODS và CSV sang PDF với định dạng được giữ nguyên. +--- + +# Excel sang PDF + +Chuyển đổi tệp bảng tính sang PDF. Công cụ xử lý tệp Excel hiện đại, định dạng XLS cũ, bảng tính OpenDocument, thậm chí cả CSV, tất cả được kết xuất qua engine LibreOffice chạy trong trình duyệt, giữ nguyên định dạng ô, công thức (dưới dạng giá trị đã tính), biểu đồ và bố cục nhiều trang tính. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :----------------------- | :----------- | +| Excel (hiện đại) | `.xlsx` | +| Excel (cũ) | `.xls` | +| OpenDocument Spreadsheet | `.ods` | +| CSV | `.csv` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo thả các tệp bảng tính. +2. Xem lại danh sách tệp. Thêm tệp hoặc xóa những tệp không cần. +3. Nhấp **Chuyển đổi sang PDF**. Engine LibreOffice khởi tạo ở lần dùng đầu tiên, sau đó xử lý từng tệp. +4. Một tệp được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được cung cấp dưới dạng `excel-converted.zip`. + +## Tùy chọn + +Công cụ này không có cấu hình bổ sung. Engine LibreOffice quyết định bố cục trang, tỷ lệ và vùng in dựa trên cài đặt sẵn có của bảng tính. + +## Đầu ra + +| Số tệp đầu vào | Đầu ra | +| :------------- | :------------------------------------------------------- | +| 1 tệp | Tải xuống một PDF (tên tệp gốc với phần mở rộng `.pdf`) | +| 2+ tệp | Kho ZIP (`excel-converted.zip`) chứa một PDF cho mỗi tệp | + +## Trường hợp sử dụng + +- Chuyển báo cáo tài chính hoặc ngân sách từ Excel sang PDF để phân phối +- Tạo PDF sẵn sàng in từ bảng tính hàng tồn kho hoặc danh mục sản phẩm +- Chia sẻ kết quả phân tích dữ liệu với các bên liên quan không cài Excel +- Lưu trữ báo cáo hằng quý ở định dạng không thể chỉnh sửa +- Chuyển tệp ODS từ LibreOffice Calc sang PDF + +## Mẹo + +- Biểu đồ nhúng trong bảng tính được kết xuất trong PDF. Hãy đảm bảo chúng hiển thị đúng trong tệp nguồn trước khi chuyển đổi. +- Nếu bảng tính có nhiều trang tính, tất cả đều được đưa vào PDF đầu ra. +- Với dữ liệu CSV đơn giản không có định dạng, công cụ [CSV sang PDF](./csv-to-pdf) cho cách chuyển đổi nhẹ hơn. Dùng Excel sang PDF khi bạn cần giữ nguyên định dạng, biểu đồ hoặc nhiều trang tính. + +## Công cụ liên quan + +- [CSV sang PDF](./csv-to-pdf) +- [Word sang PDF](./word-to-pdf) +- [PowerPoint sang PDF](./powerpoint-to-pdf) diff --git a/docs/vi/tools/extract-attachments.md b/docs/vi/tools/extract-attachments.md new file mode 100644 index 00000000..7bdcd945 --- /dev/null +++ b/docs/vi/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: Trích xuất tệp đính kèm +description: Trích xuất tất cả tệp đính kèm nhúng từ một hoặc nhiều PDF và tải xuống dưới dạng kho ZIP. +--- + +# Trích xuất tệp đính kèm + +Lấy ra mọi tệp đính kèm nhúng từ một hoặc nhiều tệp PDF. Tất cả tệp được trích xuất được gói vào một kho ZIP duy nhất để tải xuống. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF có chứa tệp đính kèm nhúng. +2. Nhấp **Trích xuất tệp đính kèm**. +3. Công cụ quét từng PDF để tìm tệp đính kèm cấp tài liệu và cấp trang. +4. Tất cả tệp tìm thấy được đóng gói vào kho ZIP và tải xuống tự động. +5. Một thông báo trạng thái xác nhận số lượng tệp đính kèm tìm thấy và tổng dung lượng của chúng. + +## Tính năng + +- Trích xuất hàng loạt từ nhiều PDF cùng lúc +- Trích xuất cả tệp đính kèm cấp tài liệu và cấp trang +- Xuất một tệp ZIP duy nhất chứa mọi tệp đã trích xuất +- Hiển thị tổng số tệp đính kèm và tổng dung lượng +- Thông báo trạng thái rõ ràng nếu không tìm thấy tệp đính kèm + +## Trường hợp sử dụng + +- Khôi phục tệp dữ liệu nhúng trong PDF báo cáo +- Lấy tài nguyên hình ảnh ra khỏi hồ sơ năng lực hoặc tài liệu đặc tả +- Trích xuất tài liệu bổ sung từ PDF đào tạo hoặc tuân thủ +- Kiểm tra những tệp nào được nhúng trong một loạt PDF + +## Mẹo + +- Nếu công cụ báo không có tệp đính kèm, PDF có thể chứa hình ảnh nhúng hoặc dữ liệu biểu mẫu thay vì tệp đính kèm: những thứ đó không phải tệp đính kèm. Hãy dùng [Trích xuất hình ảnh](./extract-images) cho hình ảnh nhúng. +- Khi xử lý nhiều PDF, tất cả tệp đính kèm từ mọi tệp nằm trong một ZIP. Tên tệp được giữ nguyên từ lúc nhúng ban đầu. + +## Công cụ liên quan + +- [Thêm tệp đính kèm](./add-attachments) +- [Chỉnh sửa tệp đính kèm](./edit-attachments) +- [Trích xuất hình ảnh](./extract-images) diff --git a/docs/vi/tools/extract-images.md b/docs/vi/tools/extract-images.md new file mode 100644 index 00000000..6ab3c5be --- /dev/null +++ b/docs/vi/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: Trích xuất hình ảnh +description: Trích xuất tất cả hình ảnh nhúng từ tệp PDF. Xem trước trong lưới và tải xuống từng ảnh hoặc dưới dạng kho ZIP. +--- + +# Trích xuất hình ảnh + +Lấy ra mọi hình ảnh nhúng từ một hoặc nhiều tệp PDF. Các hình ảnh đã trích xuất được hiển thị trong lưới xem trước, nơi bạn có thể tải xuống từng ảnh hoặc lấy tất cả cùng lúc dưới dạng ZIP. Được cung cấp bởi PyMuPDF. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. Thêm tệp hoặc xóa từng tệp khi cần. +2. Nhấp **Trích xuất** để bắt đầu xử lý. +3. Công cụ quét mọi trang của mọi PDF đã tải lên, tìm và trích xuất các hình ảnh nhúng. +4. Các hình ảnh đã trích xuất xuất hiện trong lưới với ảnh thu nhỏ. Mỗi hình ảnh có một nút tải xuống. +5. Nhấp **Tải xuống tất cả** để lưu mọi thứ dưới dạng kho ZIP. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Tất cả hình ảnh nhúng được trích xuất ở định dạng gốc (thường là PNG, JPEG hoặc định dạng nào được dùng khi hình ảnh được nhúng vào PDF). + +## Định dạng đầu ra + +- Hình ảnh hiển thị trong lưới xem trước với tên `image_1.png`, `image_2.jpg`, v.v. +- **Tải xuống tất cả** tạo ra `extracted-images.zip` chứa mọi hình ảnh. +- Có thể tải xuống từng hình ảnh một từ lưới. + +## Trường hợp sử dụng + +- Khôi phục ảnh hoặc đồ họa từ PDF để dùng lại trong dự án khác. +- Trích xuất ảnh sản phẩm từ PDF danh mục cho danh sách thương mại điện tử. +- Lấy sơ đồ từ tài liệu kỹ thuật để dùng trong bài thuyết trình. +- Kiểm tra những hình ảnh nào được nhúng trong tài liệu trước khi chia sẻ. + +## Mẹo + +- Công cụ trích xuất hình ảnh đúng như được lưu trong PDF. Nó không kết xuất lại các trang thành hình ảnh: để làm vậy, hãy dùng [PDF sang PNG](./pdf-to-png) hoặc [PDF sang JPG](./pdf-to-jpg). +- Nếu công cụ báo "Không tìm thấy hình ảnh", PDF có thể dùng đồ họa vector thay vì hình ảnh raster nhúng, hoặc là tài liệu quét mà cả trang là một hình ảnh lớn. +- Xử lý hàng loạt hoạt động trên nhiều PDF. Tất cả hình ảnh từ mọi tệp được gộp vào một lưới và một ZIP. + +## Công cụ liên quan + +- [PDF sang PNG](./pdf-to-png) +- [PDF sang JPG](./pdf-to-jpg) +- [Trình tạo quy trình PDF](./pdf-workflow) diff --git a/docs/vi/tools/extract-pages.md b/docs/vi/tools/extract-pages.md new file mode 100644 index 00000000..3c83e836 --- /dev/null +++ b/docs/vi/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: Trích xuất trang +description: Lưu một phạm vi trang cụ thể từ PDF thành tài liệu mới. +--- + +# Trích xuất trang + +Lấy một nhóm trang ra khỏi PDF và lưu thành tệp mới. Chỉ định chính xác các trang bạn muốn bằng cú pháp phạm vi, và công cụ tạo ra một PDF gọn gàng chỉ chứa những trang đó. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Công cụ hiển thị tên tệp, dung lượng và tổng số trang. +2. Nhập các trang bạn muốn trích xuất bằng cú pháp phạm vi (ví dụ: `1-5`, `3, 7, 10-12`). +3. Có thể chọn tải xuống từng phạm vi dưới dạng PDF riêng trong kho ZIP. +4. Nhấp nút xử lý. Các trang đã trích xuất được tải xuống dưới dạng PDF mới (hoặc ZIP). + +## Tính năng + +- Cú pháp phạm vi trang linh hoạt: từng trang, phạm vi hoặc tổ hợp phân tách bằng dấu phẩy +- Hiển thị tổng số trang sau khi tải lên để dễ tham khảo +- Tùy chọn xuất thành một PDF gộp hoặc các tệp riêng trong ZIP +- Giữ nguyên nội dung và định dạng trang gốc + +## Trường hợp sử dụng + +- Lấy phần tóm tắt điều hành (vài trang đầu) ra khỏi báo cáo dài +- Trích xuất một chương từ PDF sách giáo khoa +- Lưu các trang cụ thể từ bộ biểu mẫu thành tài liệu độc lập +- Tạo tài liệu mẫu từ các trang chọn lọc của một tệp lớn hơn + +## Mẹo + +- Số trang bắt đầu từ 1. Dùng `1` cho trang đầu tiên, không phải `0`. +- Để xóa trang thay vì trích xuất, hãy dùng [Xóa trang](./delete-pages): đây là thao tác ngược lại. +- Nếu bạn cần chọn trang trực quan bằng ảnh thu nhỏ, hãy dùng [Chia PDF](./split-pdf) ở chế độ Chọn trực quan. + +## Công cụ liên quan + +- [Chia PDF](./split-pdf) +- [Xóa trang](./delete-pages) +- [Gộp PDF](./merge-pdf) diff --git a/docs/vi/tools/extract-tables.md b/docs/vi/tools/extract-tables.md new file mode 100644 index 00000000..af613dbd --- /dev/null +++ b/docs/vi/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: Trích xuất bảng +description: Phát hiện và trích xuất bảng từ tài liệu PDF. Xuất ra CSV, JSON hoặc Markdown theo từng bảng. +--- + +# Trích xuất bảng + +Phát hiện tất cả bảng trong PDF và cho phép bạn xuất chúng ở định dạng tùy chọn: CSV, JSON hoặc Markdown. Mỗi bảng được trích xuất riêng kèm metadata về trang và vị trí. Được cung cấp bởi engine phát hiện bảng của PyMuPDF. + +## Cách hoạt động + +1. Tải PDF lên bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Chọn **định dạng xuất** ưa thích: CSV, JSON hoặc Markdown. +3. Nhấp **Trích xuất** để bắt đầu xử lý. +4. Nếu tìm thấy một bảng, nó được tải xuống dưới dạng một tệp. Nhiều bảng tạo ra kho ZIP với một tệp cho mỗi bảng. + +## Tùy chọn + +- **Định dạng xuất**: chọn giữa: + - **CSV**: giá trị phân tách bằng dấu phẩy với dấu trích dẫn đúng cho các trường chứa dấu phẩy, dấu ngoặc kép hoặc xuống dòng. Phù hợp cho bảng tính và cơ sở dữ liệu. + - **JSON**: cấu trúc mảng của các mảng, in đẹp với thụt lề 2 dấu cách. Phù hợp để xử lý bằng chương trình. + - **Markdown**: định dạng bảng phân tách bằng dấu gạch đứng do PyMuPDF tạo ra. Phù hợp cho tài liệu và tệp README. + +## Định dạng đầu ra + +- **Một bảng**: `filename_table.csv` (hoặc `.json` / `.md`) +- **Nhiều bảng**: `filename_tables.zip` chứa các tệp tên `table_1_page3.csv`, `table_2_page5.csv`, v.v. + +## Trường hợp sử dụng + +- Trích xuất các bảng cụ thể từ báo cáo PDF dài mà không lấy dữ liệu của cả tài liệu. +- Lấy bảng ở định dạng Markdown để dán trực tiếp vào issue GitHub, wiki hoặc tài liệu. +- Lấy dữ liệu JSON có cấu trúc từ bảng PDF cho tích hợp API hoặc script. +- So sánh bảng giữa các phiên bản PDF khác nhau bằng cách xuất cả hai ra CSV rồi diff. + +## Mẹo + +- Công cụ này cho bạn quyền kiểm soát theo từng bảng. Nếu bạn chỉ muốn dồn tất cả bảng vào một CSV, hãy dùng [PDF sang CSV](./pdf-to-csv). Để có cả sổ làm việc Excel, hãy dùng [PDF sang Excel](./pdf-to-excel). +- Các bảng trải dài nhiều trang có thể bị phát hiện thành các bảng riêng cho mỗi trang. Bạn có thể cần nối chúng thủ công. +- Nếu không phát hiện bảng nào, PDF có thể là ảnh quét. Hãy chạy OCR trước để thêm lớp văn bản. + +## Công cụ liên quan + +- [PDF sang CSV](./pdf-to-csv) +- [PDF sang Excel](./pdf-to-excel) +- [PDF sang văn bản](./pdf-to-text) diff --git a/docs/vi/tools/fb2-to-pdf.md b/docs/vi/tools/fb2-to-pdf.md new file mode 100644 index 00000000..91fb38a3 --- /dev/null +++ b/docs/vi/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 sang PDF +description: Chuyển đổi tệp sách điện tử FictionBook (FB2) sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không tải lên máy chủ. +--- + +# FB2 sang PDF + +Chuyển đổi tệp FictionBook 2 (FB2) thành tài liệu PDF. FB2 là định dạng sách điện tử dựa trên XML, phổ biến ở Nga và Đông Âu. Định dạng này được hỗ trợ tốt trên một số nền tảng nhưng gần như không ai biết đến ở nơi khác. Chuyển sang PDF giúp sách của bạn đọc được ở mọi nơi. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :------------ | :----------- | :---------------------------------- | +| FictionBook 2 | `.fb2` | Định dạng sách điện tử dựa trên XML | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp FB2 của bạn. Có thể chọn nhiều tệp cùng lúc. +2. Xem lại danh sách tệp. Dùng biểu tượng thùng rác để xóa từng mục, hoặc **Thêm tệp** để bổ sung thêm. +3. Nhấp **Chuyển sang PDF**. Công cụ PyMuPDF phân tích cấu trúc XML của FB2 và hiển thị thành nội dung PDF có phân trang. +4. Một tệp sẽ được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được gói trong `fb2-converted.zip`. + +## Tùy chọn + +Không cần cấu hình. Bộ chuyển đổi tự động xử lý cấu trúc XML của FB2, giữ nguyên các ngắt chương, định dạng và mọi hình ảnh được nhúng. + +## Trường hợp sử dụng + +- Đọc sách FB2 trên thiết bị hoặc ứng dụng chỉ hỗ trợ PDF +- In văn học tiếng Nga được phát hành ở định dạng FB2 +- Lưu trữ thư viện FB2 sang một định dạng được hỗ trợ rộng rãi +- Chia sẻ sách với người có trình đọc không hỗ trợ FictionBook + +## Mẹo + +- Tệp FB2 là XML thuần nên thường nhỏ và chuyển đổi nhanh, ngay cả trong trình duyệt. +- Nếu tệp FB2 của bạn được nén dạng `.fb2.zip`, hãy giải nén trước khi tải lên. + +## Công cụ liên quan + +- [EPUB sang PDF](./epub-to-pdf) +- [MOBI sang PDF](./mobi-to-pdf) +- [XML sang PDF](./xml-to-pdf) diff --git a/docs/vi/tools/fix-page-size.md b/docs/vi/tools/fix-page-size.md new file mode 100644 index 00000000..df245e2b --- /dev/null +++ b/docs/vi/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: Sửa kích thước trang +description: Chuẩn hóa mọi trang trong PDF về cùng một kích thước. Chọn khổ giấy tiêu chuẩn hoặc đặt kích thước tùy chỉnh. +--- + +# Sửa kích thước trang + +PDF ghép từ nhiều nguồn thường có kích thước trang không đồng nhất: trang Letter, trang A4, trang có khổ hoàn toàn khác thường. Công cụ này ép mọi trang về một kích thước đích, co giãn nội dung cho vừa hoặc lấp đầy tùy ý. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Chọn **Kích thước trang đích** từ danh sách thả xuống (A4, Letter, Legal, A3, A5, Tabloid hoặc Tùy chỉnh). +3. Chọn **Hướng trang**: Tự động giữ nguyên hướng gốc của từng trang, hoặc bạn có thể ép hướng dọc hoặc ngang. +4. Chọn chế độ **Co giãn nội dung**: Vừa khít (giữ toàn bộ nội dung, có thể thêm lề) hoặc Lấp đầy (phủ kín trang, có thể cắt mép). +5. Tùy chọn đặt **Màu nền** cho phần lề được thêm vào. +6. Nhấp **Sửa kích thước trang**. + +## Tùy chọn + +- **Kích thước tiêu chuẩn**: A4, Letter, Legal, A3, A5, Tabloid +- **Kích thước tùy chỉnh**: Nhập chiều rộng và chiều cao theo inch hoặc milimét +- **Hướng trang**: Tự động, Dọc, Ngang +- **Chế độ co giãn**: Vừa khít hoặc Lấp đầy (Cắt) +- **Màu nền**: Màu bất kỳ cho phần lề đệm + +## Trường hợp sử dụng + +- Chuẩn hóa PDF đã gộp mà các trang đến từ những máy quét khác nhau +- Chuyển tài liệu US Letter sang A4 để phân phối quốc tế +- Chuẩn bị PDF sẵn sàng để in, yêu cầu kích thước cắt xén nhất quán +- Sửa các trang lệch chuẩn đôi chút (ví dụ 8.49 x 11.02 inch thay vì 8.5 x 11) + +## Mẹo + +- Dùng chế độ Vừa khít để đảm bảo không mất nội dung. Chế độ Lấp đầy trông gọn hơn nhưng có thể cắt mất mép. +- Kiểm tra kết quả bằng công cụ Kích thước trang để xác nhận mọi trang khớp với kích thước đích. +- Màu nền mặc định là trắng; hãy chuyển sang màu tối nếu tài liệu của bạn có lề tối. + +## Công cụ liên quan + +- [Kích thước trang](./page-dimensions): kiểm tra kích thước trang trước và sau khi sửa +- [Nén PDF](./compress-pdf): giảm dung lượng tệp sau khi chuẩn hóa +- [Cắt PDF](./crop-pdf): cắt trang thủ công thay vì tự động co giãn diff --git a/docs/vi/tools/flatten-pdf.md b/docs/vi/tools/flatten-pdf.md new file mode 100644 index 00000000..0f6c8cef --- /dev/null +++ b/docs/vi/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: Làm phẳng PDF +description: Làm phẳng form tương tác và ghi chú thành nội dung tĩnh. Khiến trường form không thể chỉnh sửa và gộp ghi chú vào trang. +--- + +# Làm phẳng PDF + +Làm phẳng là gộp các thành phần tương tác (trường form, danh sách thả xuống, hộp kiểm, ghi chú, đánh dấu, ghi chú dán) trực tiếp vào nội dung trang. Hình thức hiển thị giữ nguyên, nhưng không còn gì có thể chỉnh sửa hay trích xuất. Nó giống như in một form đã điền rồi quét lại, chỉ khác là chất lượng vẫn hoàn hảo. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. +2. Nhấp **Làm phẳng PDF**. +3. Một tệp sẽ được tải xuống trực tiếp. Nhiều tệp sẽ tạo thành một tệp ZIP. + +Công cụ dùng pdf-lib để làm phẳng trường form (qua `form.flatten()`) và một bộ làm phẳng ghi chú riêng để gộp ghi chú vào luồng nội dung của trang. Cả hai thao tác diễn ra trong một lượt. + +## Những gì được làm phẳng + +- **Trường form**: Ô nhập văn bản, hộp kiểm, nút radio, danh sách thả xuống, trường chữ ký +- **Ghi chú**: Bình luận, đánh dấu, gạch ngang chữ, gạch chân, ghi chú dán, tem, ghi chú nét vẽ +- **Thành phần tương tác**: Nút, trình kích hoạt hành động + +## Những gì giữ nguyên + +- Nội dung văn bản (vẫn chọn và tìm kiếm được) +- Hình ảnh và đồ họa +- Bố cục và kích thước trang +- Bookmark và mục lục +- Siêu liên kết (trừ khi chúng dựa trên ghi chú) + +## Trường hợp sử dụng + +- Khóa một form đã hoàn thành để người nhận không thể thay đổi các câu trả lời đã gửi +- Chuẩn bị PDF để lưu trữ khi không cần các thành phần tương tác +- Khắc phục lỗi hiển thị do ghi chú được hiển thị khác nhau giữa các trình xem +- Đảm bảo tài liệu đã ký không thể bị sửa đổi sau khi áp dụng chữ ký +- Giảm dung lượng tệp bằng cách loại bỏ định nghĩa trường form và đối tượng ghi chú + +## Mẹo + +- Hãy làm phẳng sau khi mọi chỉnh sửa đã hoàn tất. Không có cách nào để hoàn tác việc làm phẳng PDF. +- Nếu bạn cần làm phẳng đồng thời xóa metadata, JavaScript và tệp đính kèm, hãy dùng công cụ Làm sạch PDF, vì nó có làm phẳng như một trong các tùy chọn. +- Một số PDF báo "không tìm thấy form". Điều này bình thường nếu tài liệu chỉ có ghi chú mà không có trường form. + +## Công cụ liên quan + +- [Làm sạch PDF](./sanitize-pdf): làm phẳng form đồng thời xóa metadata, script và nhiều thứ khác +- [Raster hóa PDF](./rasterize-pdf): chuyển thành PDF dạng ảnh để làm phẳng triệt để nhất +- [Phông chữ thành đường viền](./font-to-outline): làm phẳng phông chữ thành đường vector +- [Mã hóa PDF](./protect-pdf): khóa PDF đã làm phẳng bằng mật khẩu diff --git a/docs/vi/tools/font-to-outline.md b/docs/vi/tools/font-to-outline.md new file mode 100644 index 00000000..550a1b69 --- /dev/null +++ b/docs/vi/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: Phông chữ thành đường viền +description: Chuyển mọi phông chữ trong PDF thành đường viền vector để hiển thị nhất quán trên mọi thiết bị. Loại bỏ vấn đề phụ thuộc phông chữ. +--- + +# Phông chữ thành đường viền + +Chuyển phông chữ thành đường viền sẽ biến mỗi ký tự từ glyph dựa trên phông chữ thành một đường vector. PDF không còn phụ thuộc vào bất kỳ phông chữ nào được cài đặt, nên hiển thị giống hệt nhau trên mọi thiết bị, mọi hệ điều hành và mọi máy in. Đây là bước tiêu chuẩn trong quy trình tiền in ấn. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. +2. Nhấp **Chuyển thành đường viền**. +3. Ghostscript chuyển toàn bộ văn bản thành đường vector. +4. Tải kết quả xuống. Nhiều tệp sẽ tạo thành một tệp ZIP. + +Không có cài đặt nào cần cấu hình. Công cụ dùng Ghostscript (WebAssembly) để chuyển mọi tham chiếu phông chữ thành đường viền trong một lượt. + +## Những gì thay đổi + +- Ký tự văn bản trở thành đường cong vector (đường bezier) +- Không cần nhúng phông chữ nữa, PDF tự chứa đầy đủ ở cấp độ glyph +- Dung lượng tệp có thể tăng vì đường vector thường lớn hơn tham chiếu phông chữ +- Hình thức hiển thị được giữ nguyên chính xác + +## Những gì bạn mất + +- Chọn và sao chép dán văn bản +- Khả năng tìm kiếm văn bản (Ctrl+F không còn hoạt động) +- Khả năng chỉnh sửa nội dung văn bản +- Khả năng truy cập qua trình đọc màn hình + +## Trường hợp sử dụng + +- Gửi PDF cho xưởng in yêu cầu phông chữ đã chuyển thành đường viền +- Chia sẻ tài liệu dùng phông chữ tùy chỉnh hoặc có bản quyền với người không có các phông chữ đó +- Ngăn việc thay thế phông chữ làm thay đổi diện mạo tài liệu trên hệ thống khác +- Chuẩn bị PDF cho quy trình khắc laser hoặc cắt CNC cần đầu vào vector +- Đảm bảo PDF nhiều logo hiển thị đúng trên mọi nền tảng + +## Mẹo + +- Hãy giữ lại PDF gốc. Chuyển thành đường viền là không thể hoàn tác, bạn không thể chuyển đường vector trở lại văn bản có thể chỉnh sửa. +- Nếu cần văn bản vẫn tìm kiếm được, hãy cân nhắc dùng công cụ Raster hóa PDF rồi chạy OCR sau đó. +- PDF đã chuyển thành đường viền thường lớn hơn. Hãy chạy Nén PDF sau đó nếu dung lượng tệp quan trọng. + +## Công cụ liên quan + +- [Làm phẳng PDF](./flatten-pdf): làm phẳng form và ghi chú mà không động đến phông chữ +- [Raster hóa PDF](./rasterize-pdf): chuyển thành PDF dạng ảnh thay vì đường viền vector +- [Nén PDF](./compress-pdf): giảm dung lượng tệp sau khi chuyển thành đường viền +- [PDF sang PDF/A](./pdf-to-pdfa): chuyển đổi để lưu trữ sau khi đảm bảo không phụ thuộc phông chữ diff --git a/docs/vi/tools/form-creator.md b/docs/vi/tools/form-creator.md new file mode 100644 index 00000000..5c878675 --- /dev/null +++ b/docs/vi/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: Tạo form PDF +description: Xây dựng form PDF có thể điền với các trường văn bản, hộp kiểm, danh sách thả xuống, nút radio và nhiều hơn nữa bằng kéo và thả. +--- + +# Tạo form PDF + +Thiết kế form PDF có thể điền chuyên nghiệp từ đầu hoặc bằng cách thêm trường vào PDF có sẵn. Trình chỉnh sửa trực quan cho phép bạn kéo và thả các thành phần form (trường văn bản, hộp kiểm, danh sách thả xuống, nút radio, trường chữ ký và nhiều loại khác) trực tiếp lên bản xem trước trang. Cấu hình thuộc tính trường, thiết lập quy tắc hiển thị có điều kiện và xuất ra một PDF form hoàn toàn tương tác. + +## Cách hoạt động + +1. Tải lên một PDF có sẵn **hoặc** nhấp **Tạo PDF trống** để bắt đầu từ đầu. +2. Nếu tạo PDF trống, hãy chọn kích thước trang (Letter, A4, A5, Legal, Tabloid, A3 hoặc kích thước tùy chỉnh). +3. Trình chỉnh sửa form mở ra với thanh công cụ các loại trường và vùng xem trước trang. +4. Chọn một loại trường từ thanh công cụ, rồi nhấp vào trang để đặt nó. +5. Kéo trường để đổi vị trí. Dùng tay nắm thay đổi kích thước để điều chỉnh kích cỡ. +6. Nhấp vào một trường để mở bảng thuộc tính, nơi bạn có thể đặt tên trường, giá trị mặc định, cỡ chữ, căn lề và nhiều hơn nữa. +7. Chuyển giữa các trang bằng điều khiển trang. +8. Nhấp **Lưu** để tải xuống PDF có thể điền đã hoàn thiện. + +## Tính năng + +- Đặt trường bằng kéo và thả, có tay nắm trực quan để đổi kích thước +- Loại trường: ô nhập văn bản, văn bản nhiều dòng, hộp kiểm, danh sách thả xuống, nút radio, chữ ký, ngày, số và mã vạch +- Bảng thuộc tính để cấu hình tên, nhãn, giá trị mặc định, cỡ chữ, màu sắc, căn lề và xác thực của từng trường +- Hành động trường và quy tắc hiển thị có điều kiện (hiện/ẩn trường dựa trên giá trị của trường khác) +- Điều hướng trang cho form nhiều trang +- Trích xuất trường có sẵn: tự động phát hiện và nhập các trường form từ PDF đã tải lên +- Hỗ trợ cả PDF đã tải lên và trang trống làm nền cho form +- Nhiều kích thước trang đặt sẵn cùng kích thước tùy chỉnh +- Tạo mã vạch bằng bwip-js +- Quản lý nhóm nút radio + +## Tùy chọn + +**Kích thước trang đặt sẵn (cho PDF trống):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- Tùy chỉnh (chỉ định chiều rộng và chiều cao) + +**Thuộc tính trường (khác nhau theo loại trường):** + +- Tên, nhãn và văn bản gợi ý +- Giá trị mặc định +- Họ phông chữ, cỡ chữ và màu sắc +- Căn lề văn bản (trái, giữa, phải) +- Bật/tắt trường bắt buộc +- Bật/tắt chỉ đọc +- Độ dài tối đa cho trường văn bản +- Danh sách lựa chọn cho danh sách thả xuống và nút radio +- Hành động hiển thị có điều kiện + +## Trường hợp sử dụng + +- Xây dựng form tiếp nhận nhân viên mới với trường văn bản cho thông tin cá nhân và hộp kiểm xác nhận chính sách +- Tạo bảng câu hỏi tiếp nhận khách hàng với danh sách thả xuống để chọn dịch vụ +- Thiết kế phiếu đặt hàng với trường tính toán và mã vạch định danh +- Xây dựng danh sách kiểm tra với nút radio cho đánh giá đạt/không đạt +- Tạo form khảo sát với câu hỏi tiếp theo có điều kiện xuất hiện dựa trên câu trả lời + +## Mẹo + +- Nếu bạn tải lên PDF có sẵn, công cụ sẽ cố gắng trích xuất các trường form đã có, cho phép bạn chỉnh sửa hoặc bổ sung. +- Dùng tính năng nhóm nút radio để tạo các lựa chọn loại trừ lẫn nhau. Các trường trong cùng một nhóm radio dùng chung một tên nhóm. +- Hãy kiểm tra form bằng cách tải xuống và mở trong [Điền form PDF](./form-filler) để xác nhận hành vi của các trường. + +## Công cụ liên quan + +- [Điền form PDF](./form-filler) +- [Ký PDF](./sign-pdf) +- [Trình chỉnh sửa PDF](./edit-pdf) diff --git a/docs/vi/tools/form-filler.md b/docs/vi/tools/form-filler.md new file mode 100644 index 00000000..25d3485b --- /dev/null +++ b/docs/vi/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: Điền form PDF +description: Điền form PDF, kể cả form XFA, ngay trong trình duyệt bằng trình xem tích hợp. +--- + +# Điền form PDF + +Mở PDF có trường form và điền trực tiếp trong trình xem tích hợp. Công cụ hỗ trợ cả trường AcroForm tiêu chuẩn và form XFA (XML Forms Architecture) cũ. Khi đã hoàn thành form, bạn tải xuống bản đã điền chỉ với một cú nhấp. + +## Cách hoạt động + +1. Tải lên một PDF có chứa trường form. +2. Tài liệu mở trong trình xem PDF tích hợp, hiển thị các trường form dưới dạng ô nhập tương tác. +3. Nhấp vào các trường văn bản, hộp kiểm, danh sách thả xuống và nút radio để điền. +4. Nhấp **Lưu & Tải xuống form đã điền** để nhận PDF đã hoàn thành. + +## Tính năng + +- Trình xem PDF.js tích hợp, tương tác đầy đủ với trường form +- Hỗ trợ trường AcroForm tiêu chuẩn (ô nhập văn bản, hộp kiểm, danh sách thả xuống, nút radio) +- Hỗ trợ form XFA cho các form cũ dựa trên XML +- Tự động điều chỉnh kích thước trình xem theo kích thước trang +- Hiển thị tệp kèm tên và dung lượng + +## Tùy chọn + +Không có tùy chọn cấu hình bổ sung. Tải form lên, điền và tải xuống. + +## Trường hợp sử dụng + +- Hoàn thành biểu mẫu thuế, đơn bảo hiểm hoặc giấy tờ hành chính +- Điền đơn xin việc nhận được dưới dạng tệp đính kèm PDF +- Hoàn thành form tiếp nhận nhà cung cấp hoặc bảng câu hỏi nhà cung cấp +- Xác nhận danh sách kiểm tra tuân thủ bằng các trường hộp kiểm +- Điền phiếu tiếp nhận y tế trước cuộc hẹn + +## Mẹo + +- XFA là định dạng cũ chỉ một số trình xem PDF hỗ trợ. Nếu bạn mở PDF XFA trong Chrome hoặc hầu hết công cụ khác và thấy trang trống, nghĩa là các trình xem đó không hỗ trợ XFA. Điền form PDF của BentoPDF và Firefox đều xử lý XFA đúng cách. +- Với PDF chưa có trường form, hãy dùng công cụ [Tạo form PDF](./form-creator) để thêm trường trước, rồi điền tại đây. +- Trình xem tự động điều chỉnh kích thước để khớp với kích thước trang của PDF. + +## Công cụ liên quan + +- [Tạo form PDF](./form-creator) +- [Ký PDF](./sign-pdf) +- [Trình chỉnh sửa PDF](./edit-pdf) diff --git a/docs/vi/tools/header-footer.md b/docs/vi/tools/header-footer.md new file mode 100644 index 00000000..3038a8eb --- /dev/null +++ b/docs/vi/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: Đầu trang & Chân trang +description: Thêm văn bản đầu trang và chân trang tùy chỉnh vào các trang PDF với biến số trang động. +--- + +# Đầu trang & Chân trang + +Thêm văn bản vào sáu vị trí trên các trang PDF: đầu trang trái, đầu trang giữa, đầu trang phải, chân trang trái, chân trang giữa và chân trang phải. Công cụ hỗ trợ biến động cho số trang và tổng số trang, nên bạn có thể tạo mẫu như "Trang 3 trên 10" tự động cập nhật theo từng trang. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Bảng tùy chọn xuất hiện với các điều khiển định dạng và sáu ô nhập văn bản. +3. Nhập văn bản mong muốn vào bất kỳ vị trí đầu trang/chân trang nào. +4. Dùng các biến giữ chỗ `{page}` và `{total}` để đánh số trang động. +5. Điều chỉnh cỡ chữ, màu chữ và tùy chọn giới hạn trong một phạm vi trang cụ thể. +6. Nhấp **Thêm đầu trang & chân trang** để xử lý và tải xuống. + +## Tùy chọn + +- **Phạm vi trang**: Tùy chọn giới hạn các trang được thêm đầu trang và chân trang. Để trống để áp dụng cho mọi trang. Định dạng: "1-3, 5" (các phạm vi cách nhau bằng dấu phẩy). +- **Cỡ chữ**: Từ 6 đến 24 điểm. Mặc định là 10. +- **Màu chữ**: Chọn màu bất kỳ bằng bộ chọn màu. +- **Đầu trang Trái / Giữa / Phải**: Các ô văn bản cho phần trên cùng của mỗi trang. +- **Chân trang Trái / Giữa / Phải**: Các ô văn bản cho phần dưới cùng của mỗi trang. + +## Tính năng + +- Sáu vị trí văn bản độc lập trên mỗi trang +- Biến động `{page}` chèn số trang hiện tại +- Biến động `{total}` chèn tổng số trang +- Lọc theo phạm vi trang để nhắm đến các trang cụ thể +- Cỡ chữ và màu sắc tùy chỉnh +- Phông chữ Helvetica cho kết quả gọn gàng, chuyên nghiệp + +## Trường hợp sử dụng + +- Thêm "Trang {page} trên {total}" vào giữa chân trang của một báo cáo +- Đặt tên công ty ở đầu trang bên trái và ngày tài liệu ở đầu trang bên phải +- Thêm thông báo bảo mật vào chân trang của tài liệu pháp lý +- Đóng dấu số phiên bản tài liệu lên các phạm vi trang cụ thể + +## Mẹo + +- Kết hợp `{page}` và `{total}` trong một ô để có định dạng như "Trang {page} trên {total}" hoặc "{page}/{total}". +- Bạn có thể để trống hầu hết các ô và chỉ điền những vị trí cần dùng. Các ô trống sẽ bị bỏ qua. +- Với đầu trang phức tạp hơn có hình ảnh hoặc logo, hãy cân nhắc dùng công cụ [Thêm Watermark](./add-watermark) đặt ở đầu trang. + +## Công cụ liên quan + +- [Số trang](./page-numbers) +- [Thêm Watermark](./add-watermark) +- [Đánh số Bates](./bates-numbering) diff --git a/docs/vi/tools/heic-to-pdf.md b/docs/vi/tools/heic-to-pdf.md new file mode 100644 index 00000000..c52162ad --- /dev/null +++ b/docs/vi/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC sang PDF +description: Chuyển đổi ảnh HEIC và HEIF từ iPhone và iPad sang định dạng PDF ngay trong trình duyệt. +--- + +# HEIC sang PDF + +Chuyển đổi ảnh HEIC/HEIF sang PDF. HEIC là định dạng ảnh mặc định trên iPhone và iPad từ iOS 11. Công cụ này giúp bạn biến những bức ảnh đó thành PDF mà không cần cài phần mềm máy tính hay tải tệp lên máy chủ. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :----------- | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp HEIC/HEIF của bạn. +2. Xem lại danh sách tệp và xóa những tệp không cần. +3. Nhấp **Chuyển sang PDF**. Kết quả được tải xuống với tên `from_heic.pdf`. + +Mỗi tệp HEIC được giải mã bằng thư viện heic2any, chuyển thành PNG với chất lượng 92%. Sau đó PNG được nhúng vào PDF bằng pdf-lib, mỗi ảnh nằm trên một trang riêng với độ phân giải đầy đủ. + +## Tùy chọn + +Công cụ này không có thêm cài đặt. Ảnh HEIC được chuyển thành PNG ở chất lượng cao (0.92) trước khi nhúng. + +## Trường hợp sử dụng + +- Tạo PDF từ ảnh iPhone để đính kèm vào hồ sơ bồi thường bảo hiểm hoặc báo cáo +- Chuyển ảnh HEIC của một tin đăng bất động sản thành một tài liệu có thể in +- Biến ảnh chụp màn hình iPad (định dạng HEIF) thành PDF có thể chia sẻ +- Chuyển đổi hàng loạt ảnh du lịch cho nhật ký hành trình + +## Mẹo + +- Việc giải mã HEIC diễn ra hoàn toàn trong trình duyệt bằng WebAssembly. Lần chuyển đổi đầu tiên có thể mất một lúc để tải bộ giải mã. +- Nếu cần kết hợp HEIC với các định dạng ảnh khác (JPG, PNG, v.v.), hãy dùng công cụ [Hình ảnh sang PDF](./image-to-pdf), hỗ trợ HEIC cùng mọi định dạng khác. +- Tệp HEIC từ iPhone thường chứa dữ liệu EXIF, bao gồm tọa độ GPS. PDF đầu ra không mang theo metadata này. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [JPG sang PDF](./jpg-to-pdf) +- [PNG sang PDF](./png-to-pdf) diff --git a/docs/vi/tools/image-to-pdf.md b/docs/vi/tools/image-to-pdf.md new file mode 100644 index 00000000..a2f9a1c7 --- /dev/null +++ b/docs/vi/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: Hình ảnh sang PDF +description: Chuyển đổi JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP, PSD và hơn 10 định dạng ảnh khác thành một tệp PDF duy nhất. +--- + +# Hình ảnh sang PDF + +Bộ chuyển đổi ảnh sang PDF đa năng. Tải lên ảnh ở hầu hết mọi định dạng và gộp chúng thành một tài liệu PDF. Mỗi ảnh nằm trên một trang riêng, có kích thước khớp với kích thước gốc. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +Đây là phạm vi hỗ trợ định dạng rộng nhất trong số các bộ chuyển đổi ảnh của BentoPDF. Nếu bạn chỉ cần một định dạng cụ thể, hãy dùng công cụ chuyên biệt tương ứng. + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp ảnh của bạn. Có thể chọn nhiều tệp cùng lúc. +2. Xem lại danh sách tệp. Xóa tệp không cần bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để bổ sung ảnh. +3. Chọn mức **Chất lượng PDF** từ danh sách thả xuống. +4. Nhấp **Chuyển sang PDF**. Công cụ xử lý ảnh qua engine PyMuPDF và tải kết quả xuống với tên `images_to_pdf.pdf`. + +## Tùy chọn + +**Chất lượng PDF** điều khiển mức nén ảnh áp dụng khi nhúng ảnh vào PDF: + +- **Chất lượng cao**: nén tối thiểu, dung lượng tệp lớn hơn. Phù hợp nhất để in hoặc lưu trữ. +- **Chất lượng trung bình** (mặc định): nén cân bằng. Tốt cho hầu hết mục đích. +- **Chất lượng thấp**: nén mạnh, dung lượng nhỏ nhất. Phù hợp để gửi email hoặc chia sẻ nhanh. + +Tệp HEIC và WebP được tự động chuyển thành PNG trước khi nhúng. Việc này diễn ra trong suốt và không cần thêm bước nào. + +## Trường hợp sử dụng + +- Gộp hóa đơn hoặc tài liệu quét từ camera điện thoại thành một PDF +- Tạo hồ sơ ảnh hoặc lookbook từ các ảnh nhiều định dạng +- Chuyển ảnh iPhone (HEIC) thành PDF có thể chia sẻ mà không cần cài phần mềm máy tính +- Tập hợp bản mockup thiết kế từ tệp PSD xuất ra và ảnh chụp màn hình thành sản phẩm bàn giao cho khách hàng +- Lưu trữ một thư mục các định dạng ảnh cũ (PNM, JXR, JP2) thành một PDF duy nhất + +## Mẹo + +- Thứ tự ảnh trong PDF khớp với thứ tự trong danh sách tệp. Hãy tải lên theo đúng thứ tự bạn muốn. +- Để có dung lượng tệp nhỏ nhất, hãy chọn Chất lượng thấp. Sự khác biệt về hình ảnh thường không đáng kể với các bản quét nhiều chữ. +- Nếu bạn chỉ có một định dạng ảnh, các bộ chuyển đổi chuyên biệt (JPG sang PDF, PNG sang PDF, v.v.) cho cùng kết quả với giao diện đơn giản hơn. + +## Công cụ liên quan + +- [JPG sang PDF](./jpg-to-pdf) +- [PNG sang PDF](./png-to-pdf) +- [HEIC sang PDF](./heic-to-pdf) +- [WebP sang PDF](./webp-to-pdf) diff --git a/docs/vi/tools/index.md b/docs/vi/tools/index.md new file mode 100644 index 00000000..f44ab729 --- /dev/null +++ b/docs/vi/tools/index.md @@ -0,0 +1,183 @@ +# Tham khảo công cụ + +BentoPDF cung cấp **hơn 130 công cụ** để làm việc với PDF. Mọi công cụ đều chạy hoàn toàn trong trình duyệt của bạn, tệp của bạn không bao giờ rời khỏi thiết bị. + +--- + +## Chỉnh sửa & Chú thích + +Chỉnh sửa, đánh dấu và nâng cao tài liệu PDF với bộ công cụ chỉnh sửa đầy đủ. + +
+ +- [**Trình chỉnh sửa PDF**](./edit-pdf): Chú thích, đánh dấu, che nội dung, bình luận, thêm hình dạng/hình ảnh, tìm kiếm và xem PDF. +- [**Chỉnh sửa Bookmark**](./bookmark): Thêm, chỉnh sửa, nhập, xóa và trích xuất bookmark PDF. +- [**Mục lục**](./table-of-contents): Tạo trang mục lục từ bookmark PDF. +- [**Số trang**](./page-numbers): Chèn số trang vào tài liệu của bạn. +- [**Thêm nhãn trang**](./add-page-labels): Áp dụng nhãn trang PDF với số La Mã, tiền tố và điểm bắt đầu tùy chỉnh. +- [**Đánh số Bates**](./bates-numbering): Thêm số Bates tuần tự trên một hoặc nhiều tệp PDF. +- [**Thêm Watermark**](./add-watermark): Đóng dấu văn bản hoặc hình ảnh lên các trang PDF. +- [**Đầu trang & Chân trang**](./header-footer): Thêm văn bản vào đầu và cuối trang. +- [**Đảo ngược màu**](./invert-colors): Tạo phiên bản chế độ tối của PDF. +- [**Hiệu ứng máy quét**](./scanner-effect): Làm PDF trông như tài liệu được quét. +- [**Điều chỉnh màu sắc**](./adjust-colors): Tinh chỉnh độ sáng, độ tương phản, độ bão hòa và hơn thế nữa. +- [**Màu nền**](./background-color): Thay đổi màu nền của PDF. +- [**Thay đổi màu văn bản**](./text-color): Thay đổi màu chữ trong PDF. +- [**Ký PDF**](./sign-pdf): Vẽ, nhập hoặc tải lên chữ ký của bạn. +- [**Thêm tem**](./add-stamps): Thêm tem hình ảnh vào PDF bằng thanh công cụ chú thích. +- [**Xóa ghi chú**](./remove-annotations): Loại bỏ bình luận, đánh dấu và liên kết. +- [**Cắt PDF**](./crop-pdf): Cắt bớt lề của mọi trang trong PDF. +- [**Điền form PDF**](./form-filler): Điền form trực tiếp trong trình duyệt. Hỗ trợ cả form XFA. +- [**Tạo form PDF**](./form-creator): Tạo form PDF có thể điền với các trường văn bản kéo và thả. +- [**Xóa trang trống**](./remove-blank-pages): Tự động phát hiện và xóa các trang trống. + +
+ +--- + +## Chuyển sang PDF + +Biến hình ảnh, tài liệu, sách điện tử và các định dạng tệp khác thành PDF. + +
+ +- [**Hình ảnh sang PDF**](./image-to-pdf): Chuyển JPG, PNG, BMP, GIF, TIFF, SVG, HEIC, WebP và nhiều định dạng khác sang PDF. +- [**JPG sang PDF**](./jpg-to-pdf): Tạo PDF từ một hoặc nhiều ảnh JPG. +- [**PNG sang PDF**](./png-to-pdf): Tạo PDF từ một hoặc nhiều ảnh PNG. +- [**WebP sang PDF**](./webp-to-pdf): Tạo PDF từ một hoặc nhiều ảnh WebP. +- [**SVG sang PDF**](./svg-to-pdf): Tạo PDF từ một hoặc nhiều ảnh SVG. +- [**BMP sang PDF**](./bmp-to-pdf): Tạo PDF từ một hoặc nhiều ảnh BMP. +- [**HEIC sang PDF**](./heic-to-pdf): Tạo PDF từ một hoặc nhiều ảnh HEIC. +- [**TIFF sang PDF**](./tiff-to-pdf): Tạo PDF từ một hoặc nhiều ảnh TIFF. +- [**Văn bản sang PDF**](./txt-to-pdf): Chuyển tệp văn bản thuần thành PDF. +- [**Markdown sang PDF**](./markdown-to-pdf): Chuyển Markdown sang PDF với xem trước trực tiếp và tô sáng cú pháp. +- [**JSON sang PDF**](./json-to-pdf): Chuyển tệp JSON sang định dạng PDF. +- [**ODT sang PDF**](./odt-to-pdf): Chuyển tệp ODT (OpenDocument Text) sang PDF. +- [**CSV sang PDF**](./csv-to-pdf): Chuyển bảng tính CSV sang PDF. +- [**RTF sang PDF**](./rtf-to-pdf): Chuyển tài liệu RTF (Rich Text Format) sang PDF. +- [**Word sang PDF**](./word-to-pdf): Chuyển tài liệu Word (DOCX, DOC, ODT) sang PDF. +- [**Excel sang PDF**](./excel-to-pdf): Chuyển bảng tính Excel (XLSX, XLS, ODS) sang PDF. +- [**PowerPoint sang PDF**](./powerpoint-to-pdf): Chuyển bản trình bày PowerPoint (PPTX, PPT, ODP) sang PDF. +- [**XPS sang PDF**](./xps-to-pdf): Chuyển tài liệu XPS/OXPS sang PDF. +- [**MOBI sang PDF**](./mobi-to-pdf): Chuyển sách điện tử MOBI sang PDF. +- [**EPUB sang PDF**](./epub-to-pdf): Chuyển sách điện tử EPUB sang PDF. +- [**FB2 sang PDF**](./fb2-to-pdf): Chuyển sách điện tử FictionBook (FB2) sang PDF. +- [**CBZ sang PDF**](./cbz-to-pdf): Chuyển kho lưu trữ truyện tranh (CBZ/CBR) sang PDF. +- [**WPD sang PDF**](./wpd-to-pdf): Chuyển tài liệu WordPerfect (WPD) sang PDF. +- [**WPS sang PDF**](./wps-to-pdf): Chuyển tài liệu WPS Office sang PDF. +- [**XML sang PDF**](./xml-to-pdf): Chuyển tài liệu XML sang PDF. +- [**ODG sang PDF**](./odg-to-pdf): Chuyển OpenDocument Graphics (ODG) sang PDF. +- [**ODS sang PDF**](./ods-to-pdf): Chuyển OpenDocument Spreadsheet (ODS) sang PDF. +- [**ODP sang PDF**](./odp-to-pdf): Chuyển OpenDocument Presentation (ODP) sang PDF. +- [**PUB sang PDF**](./pub-to-pdf): Chuyển Microsoft Publisher (PUB) sang PDF. +- [**VSD sang PDF**](./vsd-to-pdf): Chuyển Microsoft Visio (VSD, VSDX) sang PDF. +- [**PSD sang PDF**](./psd-to-pdf): Chuyển tệp Adobe Photoshop (PSD) sang PDF. +- [**Email sang PDF**](./email-to-pdf): Chuyển tệp email (EML, MSG) sang định dạng PDF. + +
+ +--- + +## Chuyển từ PDF + +Trích xuất nội dung từ PDF sang hình ảnh, tài liệu và các định dạng dữ liệu. + +
+ +- [**PDF sang JPG**](./pdf-to-jpg): Chuyển mỗi trang PDF thành một ảnh JPG. +- [**PDF sang PNG**](./pdf-to-png): Chuyển mỗi trang PDF thành một ảnh PNG. +- [**PDF sang WebP**](./pdf-to-webp): Chuyển mỗi trang PDF thành một ảnh WebP. +- [**PDF sang BMP**](./pdf-to-bmp): Chuyển mỗi trang PDF thành một ảnh BMP. +- [**PDF sang TIFF**](./pdf-to-tiff): Chuyển mỗi trang PDF thành một ảnh TIFF. +- [**PDF sang CBZ**](./pdf-to-cbz): Chuyển PDF thành CBZ (Comic Book Archive) cho trình đọc truyện tranh và Calibre. +- [**PDF sang SVG**](./pdf-to-svg): Chuyển mỗi trang PDF thành một đồ họa vector có thể co giãn. +- [**PDF sang CSV**](./pdf-to-csv): Trích xuất bảng từ PDF và chuyển sang định dạng CSV. +- [**PDF sang Excel**](./pdf-to-excel): Trích xuất bảng từ PDF và chuyển sang Excel (XLSX). +- [**PDF sang thang xám**](./pdf-to-greyscale): Chuyển mọi màu sang đen trắng. +- [**PDF sang JSON**](./pdf-to-json): Chuyển tệp PDF sang định dạng JSON. +- [**PDF sang Word**](./pdf-to-word): Chuyển tệp PDF thành tài liệu Word có thể chỉnh sửa. +- [**Trích xuất hình ảnh**](./extract-images): Trích xuất mọi ảnh được nhúng từ tệp PDF của bạn. +- [**PDF sang Markdown**](./pdf-to-markdown): Chuyển văn bản và bảng trong PDF sang định dạng Markdown. +- [**Chuẩn bị PDF cho AI**](./prepare-pdf-for-ai): Trích xuất nội dung PDF dưới dạng LlamaIndex JSON cho pipeline RAG/LLM. +- [**PDF sang Văn bản**](./pdf-to-text): Trích xuất văn bản từ tệp PDF và lưu dưới dạng văn bản thuần. +- [**Trích xuất bảng PDF**](./extract-tables): Trích xuất bảng từ PDF dưới dạng CSV, JSON hoặc Markdown. + +
+ +--- + +## Sắp xếp & Quản lý + +Sắp xếp lại, kết hợp, chia tách và quản lý các trang và tệp PDF của bạn. + +
+ +- [**Trình xây dựng quy trình PDF**](./pdf-workflow): Xây dựng pipeline xử lý PDF tùy chỉnh bằng trình chỉnh sửa node trực quan. +- [**Công cụ đa năng PDF**](./pdf-multi-tool): Trình chỉnh sửa PDF đầy đủ tính năng với quản lý trang. +- [**OCR PDF**](./ocr-pdf): Làm cho PDF có thể tìm kiếm và sao chép. +- [**Gộp PDF**](./merge-pdf): Kết hợp nhiều PDF thành một tệp. +- [**Xen kẽ & Trộn trang**](./alternate-merge): Gộp PDF bằng cách xen kẽ các trang từ từng PDF. +- [**Sắp xếp bản quét hai mặt**](./duplex-collate): Sắp xếp lại các khối quét mặt trước/mặt sau thành thứ tự trang đúng. +- [**Nhân đôi & Sắp xếp**](./organize-pdf): Nhân đôi, sắp xếp lại và xóa trang. +- [**Thêm tệp đính kèm**](./add-attachments): Nhúng một hoặc nhiều tệp vào PDF của bạn. +- [**Trích xuất tệp đính kèm**](./extract-attachments): Trích xuất mọi tệp được nhúng từ PDF dưới dạng ZIP. +- [**Chỉnh sửa tệp đính kèm**](./edit-attachments): Xem hoặc xóa tệp đính kèm trong PDF của bạn. +- [**Lớp PDF (OCG)**](./pdf-layers): Xem, bật/tắt, thêm và xóa các lớp OCG trong PDF của bạn. +- [**Chia PDF**](./split-pdf): Trích xuất một phạm vi trang thành PDF mới. +- [**Chia trang**](./divide-pages): Chia trang theo chiều ngang hoặc chiều dọc. +- [**Trích xuất trang**](./extract-pages): Lưu một số trang đã chọn thành các tệp mới. +- [**Xóa trang**](./delete-pages): Loại bỏ các trang cụ thể khỏi tài liệu. +- [**Thêm trang trống**](./add-blank-page): Chèn một trang trống vào bất kỳ đâu trong PDF. +- [**Đảo ngược trang**](./reverse-pages): Đảo thứ tự của mọi trang trong tài liệu. +- [**Xoay PDF**](./rotate-pdf): Xoay trang theo bước 90 độ. +- [**Xoay theo độ tùy chỉnh**](./rotate-custom): Xoay trang theo bất kỳ góc tùy chỉnh nào. +- [**N-Up PDF**](./n-up-pdf): Sắp xếp nhiều trang lên một tờ. +- [**Sách nhỏ PDF**](./pdf-booklet): Sắp xếp lại các trang để in sách nhỏ hai mặt. +- [**Kết hợp thành một trang**](./combine-single-page): Ghép mọi trang thành một trang cuộn liên tục. +- [**Xem Metadata**](./view-metadata): Kiểm tra các thuộc tính ẩn của PDF. +- [**Chỉnh sửa Metadata**](./edit-metadata): Thay đổi tác giả, tiêu đề và các thuộc tính khác. +- [**PDF sang ZIP**](./pdf-to-zip): Đóng gói nhiều tệp PDF thành một kho lưu trữ ZIP. +- [**So sánh PDF**](./compare-pdfs): So sánh hai PDF cạnh nhau. +- [**Chia PDF thành poster**](./posterize-pdf): Chia một trang lớn thành nhiều trang nhỏ hơn. + +
+ +--- + +## Tối ưu & Sửa chữa + +Nén, sửa và tối ưu PDF để có hiệu năng và khả năng tương thích tốt hơn. + +
+ +- [**Nén PDF**](./compress-pdf): Giảm dung lượng tệp PDF của bạn. +- [**PDF sang PDF/A**](./pdf-to-pdfa): Chuyển PDF sang PDF/A để lưu trữ lâu dài. +- [**Sửa kích thước trang**](./fix-page-size): Chuẩn hóa mọi trang về cùng một kích thước. +- [**Tuyến tính hóa PDF**](./linearize-pdf): Tối ưu PDF để xem web nhanh. +- [**Kích thước trang**](./page-dimensions): Phân tích kích thước trang, hướng và đơn vị. +- [**Xóa hạn chế**](./remove-restrictions): Loại bỏ bảo vệ bằng mật khẩu và các hạn chế bảo mật. +- [**Sửa chữa PDF**](./repair-pdf): Khôi phục dữ liệu từ tệp PDF bị hỏng hoặc hư hại. +- [**Raster hóa PDF**](./rasterize-pdf): Chuyển PDF thành PDF dạng ảnh. Làm phẳng các lớp và loại bỏ văn bản có thể chọn. +- [**Chỉnh nghiêng PDF**](./deskew-pdf): Tự động nắn thẳng các trang quét bị nghiêng bằng OpenCV. +- [**Phông chữ thành đường viền**](./font-to-outline): Chuyển mọi phông chữ thành đường viền vector để hiển thị nhất quán. + +
+ +--- + +## Bảo mật PDF + +Bảo vệ, mã hóa và kiểm soát quyền truy cập vào tài liệu PDF của bạn. + +
+ +- [**Mã hóa PDF**](./protect-pdf): Khóa PDF bằng cách thêm mật khẩu. +- [**Làm sạch PDF**](./sanitize-pdf): Loại bỏ metadata, ghi chú, script và nhiều thứ khác. +- [**Giải mã PDF**](./unlock-pdf): Mở khóa PDF bằng cách gỡ bỏ bảo vệ mật khẩu. +- [**Làm phẳng PDF**](./flatten-pdf): Khiến trường form và ghi chú không thể chỉnh sửa. +- [**Xóa Metadata**](./remove-metadata): Loại bỏ dữ liệu ẩn khỏi PDF. +- [**Thay đổi quyền**](./change-permissions): Đặt hoặc thay đổi quyền người dùng trên PDF. +- [**Chữ ký số PDF**](./digital-sign-pdf): Thêm chữ ký số mật mã bằng chứng chỉ X.509. +- [**Xác minh chữ ký PDF**](./validate-signature-pdf): Xác minh chữ ký số và xem chi tiết chứng chỉ. + +
diff --git a/docs/vi/tools/invert-colors.md b/docs/vi/tools/invert-colors.md new file mode 100644 index 00000000..d06f7fa8 --- /dev/null +++ b/docs/vi/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: Đảo ngược màu +description: Đảo ngược mọi màu trong PDF để tạo phiên bản chế độ tối của bất kỳ tài liệu nào. +--- + +# Đảo ngược màu + +Đảo mọi màu trong PDF sang màu nghịch đảo. Nền trắng thành đen, chữ đen thành trắng, và mọi màu khác chuyển sang màu bù tương ứng. Đây là cách nhanh nhất để tạo phiên bản "chế độ tối" của bất kỳ PDF nào. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Nhấp **Đảo ngược màu** để xử lý. +3. PDF đã đảo màu được tải xuống tự động. + +Không có cài đặt bổ sung. Công cụ hiển thị mỗi trang thành ảnh, đảo ngược màu của mọi điểm ảnh, rồi ghép lại thành PDF mới. + +## Tính năng + +- Đảo màu chỉ với một cú nhấp cho mọi trang +- Xử lý mọi trang trong tài liệu +- Giữ nguyên kích thước và bố cục trang gốc +- Hoạt động với mọi PDF bất kể loại nội dung (văn bản, hình ảnh, hỗn hợp) + +## Trường hợp sử dụng + +- Tạo phiên bản chế độ tối của sách giáo khoa hoặc sách hướng dẫn để đọc thoải mái vào ban đêm +- Chuẩn bị phiên bản tương phản cao của tài liệu để dễ tiếp cận hơn +- Đảo ngược các tài liệu quét bị phơi sáng sai +- Tạo phiên bản âm bản của PDF nhiều hình ảnh để phân tích trực quan + +## Mẹo + +- Vì công cụ chuyển trang thành ảnh để áp dụng hiệu ứng nên đầu ra là dạng ảnh. Văn bản sẽ không còn chọn hay tìm kiếm được. Nếu cần văn bản tìm kiếm được sau khi đảo màu, hãy chạy kết quả qua công cụ OCR. +- Để điều chỉnh màu chi tiết hơn (độ sáng, độ tương phản, độ bão hòa), hãy dùng công cụ [Điều chỉnh màu sắc](./adjust-colors). +- PDF lớn có nhiều trang có thể mất nhiều thời gian hơn vì mỗi trang được hiển thị và đảo màu riêng lẻ. + +## Công cụ liên quan + +- [Điều chỉnh màu sắc](./adjust-colors) +- [Màu nền](./background-color) +- [Hiệu ứng máy quét](./scanner-effect) diff --git a/docs/vi/tools/jpg-to-pdf.md b/docs/vi/tools/jpg-to-pdf.md new file mode 100644 index 00000000..d3307870 --- /dev/null +++ b/docs/vi/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG sang PDF +description: Chuyển đổi một hoặc nhiều ảnh JPG, JPEG và JPEG 2000 thành một tệp PDF duy nhất ngay trong trình duyệt. +--- + +# JPG sang PDF + +Biến ảnh JPG thành PDF gọn gàng. Tải lên một tệp hoặc nhiều ảnh JPG cùng lúc, mỗi ảnh trở thành một trang kích thước đầy đủ trong tài liệu đầu ra. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp JPG của bạn. Hỗ trợ chọn nhiều tệp. +2. Xem lại các tệp đã tải lên. Dùng biểu tượng thùng rác để xóa từng tệp, hoặc nhấp **Thêm tệp** để bổ sung vào danh sách. +3. Chọn mức **Chất lượng PDF**. +4. Nhấp **Chuyển sang PDF**. Công cụ nén ảnh theo cài đặt chất lượng của bạn, chuyển đổi qua engine PyMuPDF và tải xuống `from_jpgs.pdf`. + +## Tùy chọn + +**Chất lượng PDF** điều chỉnh mức nén áp dụng cho từng ảnh trước khi nhúng vào PDF: + +- **Chất lượng cao**: giữ tối đa chi tiết. Dùng cho ảnh chụp hoặc in ấn. +- **Chất lượng trung bình** (mặc định): cân bằng tốt giữa độ rõ nét và dung lượng tệp. +- **Chất lượng thấp**: nén mạnh để có đầu ra nhỏ nhất. + +## Trường hợp sử dụng + +- Chuyển các tài liệu quét lưu dạng JPG thành một PDF duy nhất để nộp +- Đóng gói ảnh sản phẩm thành catalog cho khách hàng +- Biến ảnh y tế hoặc vệ tinh JPEG 2000 thành PDF dễ mang theo +- Tạo album ảnh có thể in từ ảnh xuất ra từ máy ảnh + +## Mẹo + +- Tệp JPEG 2000 (`.jp2`, `.jpx`) được hỗ trợ đầy đủ, không chỉ JPEG tiêu chuẩn. Điều này hữu ích cho ảnh y tế và dữ liệu không gian địa lý. +- Nếu ảnh JPG của bạn đến từ camera điện thoại, chất lượng Trung bình thường cho tệp nhỏ hơn 40-60% so với Cao mà không thấy khác biệt trên màn hình. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [PNG sang PDF](./png-to-pdf) +- [WebP sang PDF](./webp-to-pdf) diff --git a/docs/vi/tools/json-to-pdf.md b/docs/vi/tools/json-to-pdf.md new file mode 100644 index 00000000..a211c1fe --- /dev/null +++ b/docs/vi/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON sang PDF +description: Dựng lại tệp PDF từ định dạng JSON của BentoPDF. Chuyển các bản xuất JSON trở lại tài liệu PDF gốc. +--- + +# JSON sang PDF + +Dựng lại tài liệu PDF từ các tệp JSON đã được tạo trước đó bởi công cụ **PDF sang JSON** của BentoPDF. Đây là công cụ chuyển đổi hai chiều: nó lấy biểu diễn JSON có cấu trúc của PDF và xây dựng lại tài liệu gốc. + +::: warning +Công cụ này chỉ chấp nhận tệp JSON do bộ chuyển đổi PDF sang JSON của BentoPDF tạo ra. Tệp JSON thông thường từ API, cơ sở dữ liệu hoặc công cụ khác không được hỗ trợ. +::: + +## Định dạng được hỗ trợ + +| Đầu vào | Mô tả | +| :------ | :-------------------------------------------------------- | +| `.json` | Tệp JSON được xuất bởi công cụ PDF sang JSON của BentoPDF | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả một hoặc nhiều tệp JSON. +2. Danh sách tệp hiển thị từng tệp đã chọn kèm dung lượng. +3. Nhấp **Chuyển sang PDF**. Công cụ xử lý mọi tệp bằng Web Worker và engine CPDF. +4. Kết quả được tải xuống dưới dạng `jsons-to-pdf.zip` chứa một PDF cho mỗi tệp JSON đầu vào. + +Quá trình chuyển đổi chạy trong Web Worker nền, nên giao diện vẫn phản hồi mượt ngay cả với tệp lớn. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Cấu trúc JSON quyết định hoàn toàn PDF đầu ra. + +## Đầu ra + +Khi chuyển đổi nhiều tệp JSON, kết quả được giao dưới dạng kho lưu trữ ZIP. Mỗi PDF được đặt tên theo tệp JSON nguồn (ví dụ `report.json` thành `report.pdf`). + +## Trường hợp sử dụng + +- Khôi phục PDF từ bản sao lưu hoặc pipeline lưu trữ dựa trên JSON +- Chuyển PDF qua JSON để kiểm tra rồi chuyển lại thành PDF +- Dựng lại tài liệu sau khi chỉnh sửa cấu trúc JSON bằng chương trình +- Xác minh bản xuất PDF sang JSON đã ghi lại toàn bộ nội dung tài liệu bằng cách chuyển ngược lại + +## Mẹo + +- Nếu bạn cần chuyển dữ liệu JSON tùy ý (như phản hồi API hoặc tệp cấu hình) thành PDF được định dạng, công cụ [Văn bản sang PDF](./txt-to-pdf) phù hợp hơn. Dán JSON dưới dạng văn bản và nó sẽ được hiển thị với định dạng đúng. +- Engine WebAssembly CPDF phải sẵn có để công cụ này hoạt động. Các bản tự lưu trữ cần cấu hình tệp CPDF WASM. + +## Công cụ liên quan + +- [Văn bản sang PDF](./txt-to-pdf) +- [Markdown sang PDF](./markdown-to-pdf) +- [CSV sang PDF](./csv-to-pdf) diff --git a/docs/vi/tools/linearize-pdf.md b/docs/vi/tools/linearize-pdf.md new file mode 100644 index 00000000..fb475600 --- /dev/null +++ b/docs/vi/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: Tuyến tính hóa PDF +description: Tối ưu tệp PDF để xem web nhanh với tải dần. Còn được gọi là tối ưu "Fast Web View". +--- + +# Tuyến tính hóa PDF + +Tuyến tính hóa sắp xếp lại cấu trúc PDF để trang đầu tiên có thể hiển thị trước khi toàn bộ tệp tải xong. Adobe gọi đây là "Fast Web View". Nếu bạn đăng PDF trên website hoặc phục vụ qua cổng tài liệu, tuyến tính hóa giúp chúng mở nhanh hơn đáng kể. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. +2. Nhấp **Tuyến tính hóa PDF**. +3. Tải kết quả xuống dưới dạng kho lưu trữ ZIP chứa mọi tệp đã tuyến tính hóa. + +Không có cài đặt nào cần cấu hình. Công cụ dùng cờ `--linearize` của QPDF, sắp xếp lại cấu trúc nội bộ của PDF mà không thay đổi nội dung hiển thị. + +## Tuyến tính hóa làm gì + +- Sắp xếp lại các đối tượng PDF để dữ liệu của trang đầu nằm ở đầu tệp +- Thêm từ điển tuyến tính hóa và bảng gợi ý để trình xem biết nơi tìm từng trang +- Cho phép yêu cầu theo dải byte: trình duyệt có thể tải riêng trang đầu mà không cần tải cả tệp +- Dọn dẹp bảng tham chiếu chéo để truy cập ngẫu nhiên hiệu quả + +## Tính năng + +- Xử lý hàng loạt nhiều PDF trong một thao tác +- Đầu ra giữ nguyên mọi nội dung, phông chữ, hình ảnh và thành phần tương tác +- Dùng QPDF (WebAssembly) để tuyến tính hóa đáng tin cậy, đúng chuẩn +- Kết quả được đóng gói vào ZIP để tải xuống dễ dàng + +## Trường hợp sử dụng + +- Đăng báo cáo PDF trên website nơi người dùng mong đợi trang hiển thị tức thì +- Nhúng PDF vào ứng dụng web có trình xem trong trình duyệt +- Xuất bản catalog hoặc sách hướng dẫn PDF được truy cập qua kết nối di động chậm +- Chuẩn bị tài liệu cho mạng phân phối nội dung (CDN) hỗ trợ phục vụ theo dải byte + +## Mẹo + +- Hãy tuyến tính hóa sau khi mọi chỉnh sửa khác đã xong. Bất kỳ sửa đổi nào sau đó (gộp, thêm trang) sẽ phá vỡ tuyến tính hóa. +- Kết hợp với Nén PDF để có PDF nhỏ nhất và tải nhanh nhất. +- Tuyến tính hóa làm tăng một chút dung lượng tệp (thường dưới 1%). + +## Công cụ liên quan + +- [Nén PDF](./compress-pdf): giảm dung lượng tệp trước khi tuyến tính hóa +- [Sửa chữa PDF](./repair-pdf): sửa các vấn đề cấu trúc ngăn cản việc tuyến tính hóa +- [Xóa Metadata](./remove-metadata): loại bỏ metadata trước khi đăng trực tuyến diff --git a/docs/vi/tools/markdown-to-pdf.md b/docs/vi/tools/markdown-to-pdf.md new file mode 100644 index 00000000..96ab7c9e --- /dev/null +++ b/docs/vi/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown sang PDF +description: Viết hoặc dán Markdown và xuất thành PDF được định dạng chuyên nghiệp với xem trước trực tiếp và tô sáng cú pháp. +--- + +# Markdown sang PDF + +Trình soạn thảo Markdown đầy đủ tính năng với xem trước trực tiếp và xuất PDF chỉ với một cú nhấp. Viết từ đầu, tải lên tệp `.md` có sẵn hoặc dán nội dung từ clipboard. Trình soạn thảo hiển thị Markdown theo thời gian thực và xuất PDF có kiểu dáng bằng công cụ in tích hợp của trình duyệt. + +## Định dạng được hỗ trợ + +| Đầu vào | Mô tả | +| :------------- | :------------------------------ | +| Tệp `.md` | Tải lên bằng nút Tải lên | +| Nhập trực tiếp | Gõ hoặc dán vào trình soạn thảo | + +## Cách hoạt động + +1. Mở công cụ Markdown sang PDF. Trình soạn thảo tải với chế độ chia đôi: mã nguồn Markdown bên trái, bản xem trước đã hiển thị bên phải. +2. Viết Markdown của bạn, dán vào hoặc nhấp **Tải lên** để tải tệp `.md`. +3. Chuyển giữa giao diện sáng và tối bằng thanh trượt giao diện trên thanh công cụ. +4. Nhấp **Xuất PDF** (hoặc nhấn `Ctrl/Cmd + S`) để tạo PDF qua hộp thoại in của trình duyệt. + +## Tính năng + +Trình soạn thảo hỗ trợ nhiều tính năng Markdown ngoài phần cơ bản: + +- **Markdown tiêu chuẩn**: tiêu đề, in đậm, in nghiêng, liên kết, hình ảnh, danh sách, trích dẫn, đường kẻ ngang +- **Khối mã** với tô sáng cú pháp cho hơn 15 ngôn ngữ (JavaScript, TypeScript, Python, Go, Rust, SQL, Java, C#, C++, YAML, Bash và nhiều hơn nữa) +- **Sơ đồ Mermaid**: lưu đồ, sơ đồ trình tự, sơ đồ ER và các loại biểu đồ Mermaid khác hiển thị trực tiếp trong bản xem trước +- **Bảng** với cú pháp bảng Markdown tiêu chuẩn +- **Danh sách công việc** với hộp kiểm +- **Chú thích cuối trang**, **chỉ số dưới**, **chỉ số trên** +- **Danh sách định nghĩa**, **từ viết tắt** +- Hỗ trợ **Emoji** (`:smile:` hiển thị thành emoji) +- **Đánh dấu** (`==marked text==`) và **chèn thêm** (`++inserted text++`) +- **URL tự động liên kết**: URL thuần được chuyển thành liên kết nhấp được +- Tạo **mục lục** +- **Liên kết neo** trên tiêu đề + +## Trường hợp sử dụng + +- Viết tài liệu dự án và xuất PDF hoàn chỉnh cho các bên liên quan +- Tạo báo cáo kỹ thuật với mã mẫu và sơ đồ kiến trúc Mermaid +- Chuyển README trên GitHub thành PDF để dùng ngoại tuyến hoặc in +- Soạn đề xuất hoặc đặc tả với danh sách công việc và bảng +- Tạo tài liệu phát tay có kiểu dáng từ ghi chú bài giảng viết bằng Markdown + +## Mẹo + +- Đầu ra PDF dùng chức năng in ra PDF của trình duyệt. Trong Chrome, bạn có thể tùy chỉnh lề và tỷ lệ trong hộp thoại in trước khi lưu. +- Sơ đồ Mermaid hiển thị trong bản xem trước nhưng có thể cần một lúc để khởi tạo ở lần dùng đầu. +- Dùng `Ctrl/Cmd + S` làm phím tắt để xuất mà không cần với tới nút. + +## Công cụ liên quan + +- [Văn bản sang PDF](./txt-to-pdf) +- [Word sang PDF](./word-to-pdf) +- [JSON sang PDF](./json-to-pdf) diff --git a/docs/vi/tools/merge-pdf.md b/docs/vi/tools/merge-pdf.md new file mode 100644 index 00000000..1e11ef97 --- /dev/null +++ b/docs/vi/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: Gộp PDF +description: Kết hợp nhiều tệp PDF thành một tài liệu với sắp xếp lại bằng kéo và thả và kiểm soát đến từng trang. +--- + +# Gộp PDF + +Kết hợp nhiều tệp PDF thành một tài liệu duy nhất. Bạn có thể gộp nguyên tệp theo thứ tự cụ thể, hoặc chuyển sang Chế độ trang để kiểm soát chi tiết từng trang riêng lẻ từ mọi PDF đã tải lên. + +## Cách hoạt động + +1. Tải lên hai hoặc nhiều tệp PDF bằng cách nhấp vào vùng thả hoặc kéo chúng vào. +2. Chọn giữa **Chế độ tệp** và **Chế độ trang** bằng nút chuyển ở trên cùng. +3. Trong Chế độ tệp, kéo các tệp để sắp xếp lại và tùy chọn chỉ định phạm vi trang (ví dụ `1-3, 5`) cho từng tệp. Để trống phạm vi để bao gồm mọi trang. +4. Trong Chế độ trang, kéo và thả từng hình thu nhỏ của trang để xây dựng chính xác thứ tự trang bạn muốn. +5. Nhấp **Gộp PDF** để kết hợp tất cả thành một tệp. PDF đã gộp được tải xuống tự động. + +## Tính năng + +- Hai chế độ gộp: Chế độ tệp để gộp nhanh nguyên tệp, Chế độ trang để kiểm soát từng trang +- Sắp xếp lại bằng kéo và thả ở cả hai chế độ với hiệu ứng mượt +- Cú pháp phạm vi trang (ví dụ `1-3, 5, 8-10`) cho phép chọn lọc trang mà không cần chuyển sang Chế độ trang +- Hình thu nhỏ trang được tải lười giúp giao diện luôn phản hồi tốt ngay cả với tài liệu lớn +- Không giới hạn số tệp hay tổng số trang +- Giữ nguyên chất lượng PDF gốc, không mã hóa lại + +## Tùy chọn + +| Tùy chọn | Mô tả | +| ---------------- | ------------------------------------------------------------------------------------------ | +| **Chế độ tệp** | Gộp nguyên tệp theo thứ tự tùy chỉnh, với bộ lọc phạm vi trang tùy chọn cho từng tệp | +| **Chế độ trang** | Lưới trực quan của mọi trang từ mọi tệp: kéo hình thu nhỏ để xây dựng đúng thứ tự bạn muốn | +| **Ô nhập trang** | Ô văn bản cho từng tệp nhận các phạm vi như `1-3, 5` để chỉ bao gồm các trang cụ thể | + +## Trường hợp sử dụng + +- Kết hợp các PDF chương riêng lẻ thành một cuốn sách hoặc báo cáo +- Gộp thư xin việc và sơ yếu lý lịch thành một tài liệu ứng tuyển +- Lấy các trang cụ thể từ nhiều tài liệu nguồn vào một tệp tổng hợp +- Tập hợp hóa đơn hoặc biên lai quét thành một PDF lưu trữ +- Tạo tài liệu phát tay bài thuyết trình từ các slide trong nhiều bộ + +## Mẹo + +- Dùng Chế độ trang khi bạn cần xen kẽ các trang từ các tệp khác nhau thay vì nối tệp này sau tệp kia. +- Bạn có thể thêm tệp sau lần tải lên đầu bằng nút **Thêm tệp** mà không mất bố cục hiện tại. +- Phạm vi trang được đánh số từ 1, nên `1` chỉ trang đầu tiên của tệp đó. + +## Công cụ liên quan + +- [Chia PDF](./split-pdf) +- [Nhân đôi & Sắp xếp](./organize-pdf) +- [Xen kẽ & Trộn trang](./alternate-merge) +- [Xóa trang](./delete-pages) diff --git a/docs/vi/tools/mobi-to-pdf.md b/docs/vi/tools/mobi-to-pdf.md new file mode 100644 index 00000000..fbad00c8 --- /dev/null +++ b/docs/vi/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI sang PDF +description: Chuyển đổi tệp sách điện tử MOBI sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không tải tệp lên. +--- + +# MOBI sang PDF + +Chuyển đổi sách điện tử MOBI của Amazon Kindle thành tài liệu PDF. Tệp MOBI gắn với thiết bị và ứng dụng Kindle nên khó đọc ở nơi khác. Chuyển sang PDF cho bạn bản di động có thể mở trên mọi thiết bị hoặc in ra. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------- | :----------- | :----------------------------------------- | +| MOBI | `.mobi` | Định dạng sách điện tử Kindle (Mobipocket) | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả một hoặc nhiều tệp MOBI. +2. Xem lại danh sách tệp. Xóa tệp không cần bằng biểu tượng thùng rác, hoặc dùng **Thêm tệp** để bổ sung sách điện tử. +3. Nhấp **Chuyển sang PDF**. Engine PyMuPDF phân tích cấu trúc MOBI và hiển thị từng trang thành nội dung PDF. +4. Một tệp được tải xuống dưới dạng PDF. Khi chuyển đổi nhiều tệp, bạn nhận một kho lưu trữ ZIP tên `mobi-converted.zip`. + +## Tùy chọn + +Không cần cài đặt thêm. Quá trình chuyển đổi giữ nguyên nội dung văn bản, định dạng và hình ảnh được nhúng từ tệp MOBI gốc. + +## Trường hợp sử dụng + +- Đọc nội dung mua từ Kindle trên máy đọc sách không phải Kindle chỉ hỗ trợ PDF +- In các chương của sách điện tử để học hoặc ghi chú ngoại tuyến +- Lưu trữ thư viện sách điện tử cá nhân ở định dạng phổ biến +- Chia sẻ trích đoạn với người không cài ứng dụng Kindle + +## Mẹo + +- Tệp MOBI có bảo vệ DRM không thể chuyển đổi. Công cụ chỉ hoạt động với tệp MOBI không DRM. +- Sách điện tử lớn có nhiều ảnh nhúng có thể mất thêm vài giây để xử lý vì mọi thứ diễn ra trong trình duyệt. + +## Công cụ liên quan + +- [EPUB sang PDF](./epub-to-pdf) +- [FB2 sang PDF](./fb2-to-pdf) +- [CBZ sang PDF](./cbz-to-pdf) diff --git a/docs/vi/tools/n-up-pdf.md b/docs/vi/tools/n-up-pdf.md new file mode 100644 index 00000000..7d0415cf --- /dev/null +++ b/docs/vi/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: Sắp xếp nhiều trang PDF lên một tờ theo bố cục lưới để in gọn. +--- + +# N-Up PDF + +Đặt nhiều trang lên một tờ theo bố cục lưới. Điều này giảm số trang in bằng cách đưa 2, 4, 6, 8, 9 hoặc 16 trang lên mỗi tờ. Công cụ xử lý việc co giãn, định vị và cấu hình kích thước trang tùy chọn. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Chọn số trang trên mỗi tờ (giá trị "N"): 2, 4, 6, 8, 9 hoặc 16. +3. Chọn kích thước trang đầu ra (mặc định là A4) và hướng trang. +4. Tùy chọn cấu hình khoảng cách, màu viền và màu nền. +5. Nhấp nút xử lý. Công cụ co giãn từng trang và xếp chúng lên các tờ mới. + +## Tính năng + +- Bố cục lưới: 2-up, 4-up, 6-up, 8-up, 9-up và 16-up +- Kích thước trang đầu ra và hướng trang có thể cấu hình +- Khoảng cách tùy chọn giữa các trang được xếp +- Cài đặt màu nền và màu viền +- Giữ nguyên tỷ lệ khung hình của trang gốc khi co giãn cho vừa + +## Tùy chọn + +| Tùy chọn | Mô tả | +| -------------------- | ---------------------------------------------------------- | +| **Số trang mỗi tờ** | Số trang gốc đặt trên mỗi trang đầu ra (2, 4, 6, 8, 9, 16) | +| **Kích thước trang** | Kích thước tờ đầu ra (A4, Letter, Legal, v.v.) | +| **Hướng trang** | Dọc hoặc Ngang cho tờ đầu ra | +| **Khoảng cách** | Khoảng trống tính bằng point giữa các trang được xếp | +| **Màu nền** | Màu tô cho nền của tờ đầu ra | +| **Màu viền** | Màu cho viền quanh mỗi trang được xếp | + +## Trường hợp sử dụng + +- In tài liệu phát tay với 4 slide mỗi trang để tiết kiệm giấy +- Tạo tờ ôn tập với nhiều trang tham khảo trên một tờ +- Tạo kho lưu trữ tài liệu gọn nhẹ để lưu hồ sơ +- Tạo tờ tổng quan dạng hình thu nhỏ cho một tài liệu dài + +## Mẹo + +- Hướng ngang thường phù hợp hơn cho bố cục 2-up, còn hướng dọc thường tốt nhất cho 4-up trở lên. +- Tăng khoảng cách giúp dễ đọc hơn nhưng làm giảm diện tích dành cho mỗi trang được xếp. +- Với thao tác ngược lại (chia một trang thành nhiều trang), xem [Chia PDF thành poster](./posterize-pdf). + +## Công cụ liên quan + +- [Chia PDF thành poster](./posterize-pdf) +- [Sách nhỏ PDF](./pdf-booklet) +- [Kết hợp thành một trang](./combine-single-page) diff --git a/docs/vi/tools/ocr-pdf.md b/docs/vi/tools/ocr-pdf.md new file mode 100644 index 00000000..d9c08576 --- /dev/null +++ b/docs/vi/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: Làm cho PDF quét có thể tìm kiếm và sao chép bằng Tesseract OCR với hỗ trợ đa ngôn ngữ và lọc ký tự. +--- + +# OCR PDF + +Biến tài liệu quét thành PDF có thể tìm kiếm và sao chép. Công cụ dùng Tesseract OCR để nhận dạng văn bản trong ảnh và phủ một lớp văn bản vô hình lên các trang gốc, giữ nguyên hình thức hiển thị trong khi làm cho nội dung hoàn toàn có thể tìm kiếm. + +## Cách hoạt động + +1. Tải lên PDF quét hoặc PDF dạng ảnh. +2. Chọn một hoặc nhiều ngôn ngữ có trong tài liệu từ danh sách ngôn ngữ có thể tìm kiếm. +3. Tùy chọn điều chỉnh cài đặt nâng cao (độ phân giải, nhị phân hóa, danh sách ký tự cho phép). +4. Nhấp **Bắt đầu OCR** và theo dõi tiến trình trên thanh tiến trình thời gian thực. +5. Khi hoàn tất, xem lại văn bản đã trích xuất, rồi tải xuống PDF có thể tìm kiếm hoặc tệp `.txt` thuần. + +## Tính năng + +- OCR đa ngôn ngữ với bộ chọn ngôn ngữ có thể tìm kiếm +- Lớp văn bản vô hình giữ nguyên diện mạo tài liệu gốc +- Thanh tiến trình thời gian thực và nhật ký đầu ra trong khi xử lý +- Tải kết quả xuống dưới dạng PDF có thể tìm kiếm hoặc tệp văn bản thuần +- Sao chép văn bản đã trích xuất trực tiếp vào clipboard +- Ba mức độ phân giải để cân bằng giữa tốc độ và độ chính xác + +## Tùy chọn + +| Cài đặt | Giá trị | Mặc định | Mục đích | +| -------------------------------- | ----------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------- | +| **Độ phân giải** | Chuẩn (192 DPI), Cao (288 DPI), Siêu cao (384 DPI) | Cao | Độ phân giải cao hơn cải thiện độ chính xác với chữ nhỏ nhưng mất nhiều thời gian hơn | +| **Nhị phân hóa ảnh** | Bật / Tắt | Tắt | Tăng độ tương phản cho bản quét sạch bằng cách chuyển sang đen trắng | +| **Mẫu danh sách ký tự cho phép** | Không, Chữ và số, Số + Tiền tệ, Chỉ chữ cái, Chỉ số, Hóa đơn, Form, Tùy chỉnh | Không | Giới hạn các ký tự được nhận dạng để cải thiện độ chính xác cho từng loại tài liệu | +| **Danh sách ký tự cho phép** | Văn bản tự do | Trống | Bộ ký tự thủ công khi mẫu được đặt là Tùy chỉnh | + +## Trường hợp sử dụng + +- Làm cho hợp đồng và hóa đơn quét có thể tìm kiếm để bạn dùng Ctrl+F +- Trích xuất văn bản từ tài liệu chụp ảnh hoặc hồ sơ giấy cũ +- Xử lý biên lai với mẫu Hóa đơn để ghi nhận chính xác số tiền và ngày tháng +- Tạo PDF dễ tiếp cận từ bản quét chỉ có ảnh để đáp ứng yêu cầu tuân thủ +- Trích xuất hàng loạt nội dung văn bản từ sách hoặc hướng dẫn quét + +## Mẹo + +- Hãy chọn nhiều ngôn ngữ nếu tài liệu có nội dung pha trộn ngôn ngữ (ví dụ tiêu đề tiếng Anh với nội dung tiếng Nhật). +- Dùng tùy chọn nhị phân hóa cho tài liệu có chữ mờ hoặc độ tương phản thấp, vì nó có thể cải thiện đáng kể độ chính xác nhận dạng. +- Các mẫu danh sách cho phép Hóa đơn và Form giảm mạnh nhận dạng sai trên tài liệu có cấu trúc bằng cách bỏ qua các hình dạng ký tự không liên quan. + +## Công cụ liên quan + +- [Trích xuất bảng PDF](./extract-tables) +- [Gộp PDF](./merge-pdf) +- [Nén PDF](./compress-pdf) diff --git a/docs/vi/tools/odg-to-pdf.md b/docs/vi/tools/odg-to-pdf.md new file mode 100644 index 00000000..93600448 --- /dev/null +++ b/docs/vi/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG sang PDF +description: Chuyển đổi tệp LibreOffice Draw (ODG) sang PDF trong trình duyệt. Miễn phí, không tải lên, hoàn toàn riêng tư. +--- + +# ODG sang PDF + +Chuyển đổi tệp OpenDocument Graphics sang PDF. ODG là định dạng gốc của LibreOffice Draw, dùng cho sơ đồ, lưu đồ và hình minh họa vector. Chuyển sang PDF giúp các bản vẽ này dễ chia sẻ, in và nhúng vào tài liệu khác. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------------------- | :----------- | :------------------------------------- | +| OpenDocument Graphics | `.odg` | Tệp LibreOffice Draw / OpenOffice Draw | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp ODG của bạn. Có thể thêm nhiều tệp cùng lúc. +2. Xem lại danh sách tệp. Xóa từng mục bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để thêm bản vẽ. +3. Nhấp **Chuyển sang PDF**. Engine dựa trên LibreOffice được tải trong trình duyệt và chuyển đổi từng tệp ODG, giữ nguyên đồ họa vector, hình dạng và văn bản. +4. Một tệp được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp tạo thành kho lưu trữ ZIP tên `odg-to-pdf.zip`. + +## Tùy chọn + +Không cần cài đặt thêm. Quá trình chuyển đổi giữ nguyên kích thước trang, hình dạng, đường nối và hộp văn bản gốc từ nguồn ODG. + +## Trường hợp sử dụng + +- Chia sẻ sơ đồ LibreOffice Draw với khách hàng không cài LibreOffice +- In lưu đồ và sơ đồ mạng được tạo trong Draw +- Đưa hình minh họa ODG vào báo cáo hoặc bài thuyết trình dưới dạng PDF nhúng +- Lưu trữ bản vẽ kỹ thuật ở định dạng vẫn đọc được trong nhiều thập kỷ + +## Mẹo + +- Các thành phần vector vẫn là vector trong PDF đầu ra, nên kết quả co giãn mượt đến mọi kích thước in. +- Engine LibreOffice cần một lúc để khởi tạo ở lần dùng đầu. Các lần chuyển đổi sau trong cùng phiên sẽ nhanh hơn. + +## Công cụ liên quan + +- [ODS sang PDF](./ods-to-pdf) +- [ODP sang PDF](./odp-to-pdf) +- [VSD sang PDF](./vsd-to-pdf) diff --git a/docs/vi/tools/odp-to-pdf.md b/docs/vi/tools/odp-to-pdf.md new file mode 100644 index 00000000..6d3b89a9 --- /dev/null +++ b/docs/vi/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP sang PDF +description: Chuyển đổi bản trình bày LibreOffice Impress (ODP) sang PDF trong trình duyệt. Miễn phí, riêng tư, không tải lên. +--- + +# ODP sang PDF + +Chuyển đổi tệp OpenDocument Presentation sang PDF. ODP là định dạng gốc của LibreOffice Impress và là bản xuất tiêu chuẩn từ Google Slides. Biến bản trình bày thành PDF nghĩa là ai cũng có thể xem mà không cần phần mềm trình chiếu, và các slide in ra rất đẹp. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :------------------------ | :----------- | :------------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / bản xuất Google Slides | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp ODP của bạn. Có thể chọn nhiều bản trình bày cùng lúc. +2. Xem lại danh sách tệp. Xóa mục bằng biểu tượng thùng rác, hoặc dùng **Thêm tệp** để bổ sung bản trình bày. +3. Nhấp **Chuyển sang PDF**. Engine dựa trên LibreOffice xử lý từng bản trình bày và tạo PDF trong đó mỗi slide thành một trang. +4. Một tệp được tải xuống dưới dạng PDF. Nhiều tệp được giao trong kho lưu trữ ZIP tên `odp-to-pdf.zip`. + +## Tùy chọn + +Không có cài đặt nào cần cấu hình. Mỗi slide được hiển thị ở kích thước gốc, giữ nguyên văn bản, hình ảnh, hình dạng và nền slide. + +## Trường hợp sử dụng + +- Phân phát bản trình bày cho khán giả dưới dạng PDF tài liệu phát tay +- Chia sẻ bản xuất Google Slides với người thích PDF hơn ODP +- Lưu trữ các bài nói chuyện và bài giảng ở định dạng chỉ đọc +- In bộ slide cho các hội thảo trực tiếp + +## Mẹo + +- Hiệu ứng chuyển slide và hoạt ảnh chỉ là tính năng hình ảnh nên không được đưa vào PDF, nhưng mọi nội dung tĩnh đều hiển thị đúng. +- Ghi chú của người trình bày không có trong PDF đầu ra. Nếu cần ghi chú, hãy xuất riêng từ phần mềm trình chiếu của bạn. +- Giống các công cụ dựa trên LibreOffice khác, engine được tải ở lần dùng đầu và được lưu đệm trong suốt phiên. + +## Công cụ liên quan + +- [ODG sang PDF](./odg-to-pdf) +- [ODS sang PDF](./ods-to-pdf) +- [PUB sang PDF](./pub-to-pdf) diff --git a/docs/vi/tools/ods-to-pdf.md b/docs/vi/tools/ods-to-pdf.md new file mode 100644 index 00000000..aab48d38 --- /dev/null +++ b/docs/vi/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS sang PDF +description: Chuyển đổi bảng tính LibreOffice Calc (ODS) sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không cần đăng ký. +--- + +# ODS sang PDF + +Chuyển đổi tệp OpenDocument Spreadsheet sang PDF. ODS là định dạng gốc của LibreOffice Calc và cũng là định dạng xuất phổ biến từ Google Sheets. Công cụ này kết xuất dữ liệu, định dạng và biểu đồ của bảng tính thành PDF có phân trang để bạn in hoặc chia sẻ. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :----------------------- | :----------- | :--------------------------------------- | +| OpenDocument Spreadsheet | `.ods` | Xuất từ LibreOffice Calc / Google Sheets | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp ODS của bạn. Hỗ trợ nhiều tệp. +2. Xem lại danh sách tệp. Dùng biểu tượng thùng rác để xóa tệp, hoặc nhấp **Thêm tệp** để mở rộng lô. +3. Nhấp **Chuyển đổi sang PDF**. Công cụ dựa trên LibreOffice sẽ tải trong trình duyệt và kết xuất từng bảng tính thành các trang PDF. +4. Một bảng tính sẽ được tải xuống dưới dạng PDF. Nhiều tệp sẽ được đóng gói thành `ods-to-pdf.zip`. + +## Tùy chọn + +Không cần cấu hình. Trình chuyển đổi áp dụng bố cục in, định dạng ô và độ rộng cột sẵn có của bảng tính vào PDF đầu ra. + +## Trường hợp sử dụng + +- Chia sẻ bảng ngân sách hoặc báo cáo LibreOffice Calc với người chỉ nhận PDF +- In bản xuất từ Google Sheets đã được tải xuống dưới dạng ODS +- Lưu trữ hồ sơ tài chính ở định dạng không thể chỉnh sửa +- Nộp biểu mẫu hoặc bảng chấm công dạng ODS dưới dạng tài liệu có bố cục cố định + +## Mẹo + +- Nếu bảng tính có nhiều trang tính, tất cả đều được đưa vào PDF đầu ra. +- Bảng tính rất rộng có thể trải trên nhiều trang PDF theo chiều ngang. Hãy cân nhắc chỉnh độ rộng cột trong tệp gốc trước khi chuyển đổi nếu bố cục quan trọng. +- Công cụ LibreOffice được khởi tạo trong lần dùng đầu tiên. Các lần chuyển đổi tiếp theo trong cùng phiên sẽ nhanh hơn. + +## Công cụ liên quan + +- [ODG sang PDF](./odg-to-pdf) +- [ODP sang PDF](./odp-to-pdf) +- [XML sang PDF](./xml-to-pdf) diff --git a/docs/vi/tools/odt-to-pdf.md b/docs/vi/tools/odt-to-pdf.md new file mode 100644 index 00000000..10060a0c --- /dev/null +++ b/docs/vi/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT sang PDF +description: Chuyển đổi tệp OpenDocument Text (ODT) sang định dạng PDF ngay trong trình duyệt bằng công cụ chạy trên LibreOffice. +--- + +# ODT sang PDF + +Chuyển đổi tệp OpenDocument Text sang PDF. ODT là định dạng gốc của LibreOffice Writer, Apache OpenOffice và các trình soạn thảo văn bản mã nguồn mở khác. Công cụ này dùng engine LibreOffice chạy trong trình duyệt để chuyển đổi chính xác, giữ nguyên định dạng, bảng, hình ảnh và kiểu dáng. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :---------------- | :----------- | +| OpenDocument Text | `.odt` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả một hoặc nhiều tệp ODT. +2. Xem lại danh sách tệp. Thêm tệp hoặc xóa những tệp không cần. +3. Nhấp **Chuyển đổi sang PDF**. Engine LibreOffice khởi tạo (có chỉ báo tiến trình hiển thị trạng thái tải), sau đó từng tệp được chuyển đổi. +4. Một tệp được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được đóng gói thành `odt-converted.zip`. + +## Tùy chọn + +Công cụ này không có cấu hình bổ sung. Quá trình chuyển đổi giữ định dạng của tài liệu gốc sát nhất có thể. + +## Kết quả đầu ra + +| Số tệp đầu vào | Đầu ra | +| :------------- | :----------------------------------------------------- | +| 1 tệp | Tải xuống một PDF (ví dụ: `document.pdf`) | +| 2+ tệp | Tệp ZIP (`odt-converted.zip`) chứa một PDF cho mỗi tệp | + +## Trường hợp sử dụng + +- Chuyển tài liệu LibreOffice Writer sang PDF để chia sẻ với người dùng Microsoft Office +- Tạo PDF sẵn sàng để in từ các bài báo học thuật viết ở định dạng OpenDocument +- Chuyển đổi hàng loạt một thư mục mẫu ODT thành PDF để phân phối +- Tạo PDF từ các tệp ODT do hệ thống tạo tài liệu tự động sinh ra + +## Mẹo + +- Engine LibreOffice tải trong lần dùng đầu tiên và được lưu đệm cho các lần chuyển đổi sau. Lần tải đầu mất vài giây; sau đó việc chuyển đổi rất nhanh. +- Tài liệu phức tạp có đối tượng OLE nhúng hoặc phông chữ lạ có thể hiển thị hơi khác so với LibreOffice trên máy tính. Hãy thử với một mẫu trước khi chuyển đổi hàng loạt. +- Với tài liệu Word (`.doc`, `.docx`), hãy dùng công cụ [Word sang PDF](./word-to-pdf), công cụ này cũng dùng engine LibreOffice nhưng nhận trực tiếp các định dạng của Microsoft. + +## Công cụ liên quan + +- [Word sang PDF](./word-to-pdf) +- [RTF sang PDF](./rtf-to-pdf) +- [Văn bản sang PDF](./txt-to-pdf) diff --git a/docs/vi/tools/organize-pdf.md b/docs/vi/tools/organize-pdf.md new file mode 100644 index 00000000..059ebb88 --- /dev/null +++ b/docs/vi/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: Nhân đôi & Sắp xếp +description: Sắp xếp lại, nhân đôi và xóa trang PDF bằng hình thu nhỏ kéo thả và ô nhập thứ tự trang tùy chỉnh. +--- + +# Nhân đôi & Sắp xếp + +Sắp xếp lại, nhân đôi và xóa trang của PDF bằng giao diện kéo thả trực quan. Mỗi trang hiển thị dưới dạng hình thu nhỏ để bạn di chuyển, sao chép hoặc xóa trước khi lưu kết quả thành tệp mới. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Công cụ kết xuất lưới hình thu nhỏ hiển thị mọi trang. +3. Kéo hình thu nhỏ để đổi thứ tự trang, nhấp nút nhân đôi màu xanh lá để sao chép một trang, hoặc nhấp nút xóa màu đỏ để xóa trang. +4. Hoặc nhập thứ tự trang tùy chỉnh vào ô văn bản (ví dụ: `3, 1, 2, 4`) rồi nhấp **Áp dụng** để sắp xếp lại tất cả trang cùng lúc. +5. Nhấp nút xử lý để tạo và tải xuống PDF đã sắp xếp lại. + +## Tính năng + +- Kéo thả để sắp xếp lại trang với hiệu ứng chuyển động +- Nút nhân đôi và xóa cho từng trang +- Ô nhập thứ tự trang tùy chỉnh để sắp xếp chính xác +- Nhãn số trang tự động cập nhật sau mỗi thay đổi +- Không cho xóa trang cuối cùng còn lại + +## Trường hợp sử dụng + +- Chuyển một trang bị đặt sai về đúng vị trí trong báo cáo +- Nhân đôi một trang biểu mẫu để có nhiều bản trống trong một tệp +- Xóa các trang nháp hoặc trang giữ chỗ trước khi phân phối tài liệu +- Đảo ngược hoặc xáo trộn thứ tự trang để chuẩn bị in +- Tạo trình tự trang tùy chỉnh mà không cần gộp lại các tệp riêng lẻ + +## Mẹo + +- Ô thứ tự trang tùy chỉnh nhận các số trang gốc cách nhau bằng dấu phẩy. Phải có đủ mọi trang, mỗi trang đúng một lần, không bỏ sót hay lặp lại. +- Sau khi nhân đôi một trang, cả hai bản đều tham chiếu cùng chỉ số trang gốc. Việc sắp xếp lại từng bản hoạt động độc lập. +- Với các thao tác hàng loạt trên nhiều tệp hoặc quy trình nâng cao hơn, hãy cân nhắc dùng [Công cụ đa năng PDF](./pdf-multi-tool). + +## Công cụ liên quan + +- [Gộp PDF](./merge-pdf) +- [Xóa trang](./delete-pages) +- [Công cụ đa năng PDF](./pdf-multi-tool) +- [Đảo ngược trang](./reverse-pages) diff --git a/docs/vi/tools/page-dimensions.md b/docs/vi/tools/page-dimensions.md new file mode 100644 index 00000000..ba82ac3d --- /dev/null +++ b/docs/vi/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: Kích thước trang +description: Phân tích kích thước trang PDF, hướng trang, tỷ lệ khung hình và độ xoay. Phát hiện tài liệu có nhiều kích thước và xuất dữ liệu ra CSV. +--- + +# Kích thước trang + +Công cụ chẩn đoán đọc từng trang trong PDF và báo cáo kích thước chính xác, hướng trang, tên khổ giấy chuẩn, tỷ lệ khung hình, diện tích và độ xoay. Hữu ích để phát hiện các trang khác kích thước trước khi in, hoặc để ghi lại thuộc tính của một PDF bạn nhận được. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Việc phân tích bắt đầu tự động, không cần nhấn nút nào. +2. Bảng tóm tắt hiển thị tổng số trang, số kích thước trang khác nhau và liệu tài liệu có nhiều kích thước hay không. +3. Duyệt bảng kết quả đầy đủ với chi tiết từng trang. +4. Chuyển đơn vị hiển thị giữa Điểm (Points), Inch, Milimét hoặc Pixel. +5. Nhấp **Xuất ra CSV** để lưu dữ liệu. + +## Các trường được báo cáo + +| Cột | Mô tả | +| ---------------- | ------------------------------------------------ | +| Trang số | Số thứ tự trang | +| Kích thước | Chiều rộng x Chiều cao theo đơn vị đã chọn | +| Khổ chuẩn | Tên khổ khớp (A4, Letter, v.v.) hoặc "Tùy chỉnh" | +| Hướng | Dọc (Portrait) hoặc Ngang (Landscape) | +| Tỷ lệ khung hình | Tỷ lệ rộng trên cao dưới dạng số thập phân | +| Diện tích | Diện tích trang theo đơn vị đã chọn bình phương | +| Góc xoay | Độ xoay của trang tính bằng độ | + +## Tính năng + +- Tự động nhận diện khổ giấy chuẩn (A3, A4, A5, Letter, Legal, Tabloid và nhiều khổ khác) +- Cảnh báo tài liệu nhiều kích thước kèm thống kê các kích thước xuất hiện và số trang dùng mỗi kích thước +- Chuyển đổi đơn vị giữa điểm, inch, milimét và pixel (ở 96 PPI) +- Xuất CSV để dùng trong bảng tính hoặc hệ thống tài liệu + +## Trường hợp sử dụng + +- Xác minh mọi trang đều là A4 trước khi gửi tài liệu cho tiệm in +- Tìm nguyên nhân PDF đã gộp in ra lề bất ngờ ở một số trang +- Ghi lại bố cục trang của kho lưu trữ PDF lớn cho hồ sơ metadata +- Xác định các trang bị xoay cần chỉnh sửa + +## Mẹo + +- Nếu phần tóm tắt hiển thị "Nhiều khổ trang", hãy dùng công cụ Sửa kích thước trang để chuẩn hóa trước khi in. +- Trường độ xoay giúp nhận ra các trang hiển thị đúng nhưng có thuộc tính xoay khác 0, điều có thể gây lỗi trong một số quy trình. + +## Công cụ liên quan + +- [Sửa kích thước trang](./fix-page-size): chuẩn hóa các trang sau khi phát hiện kích thước không đồng nhất +- [Nén PDF](./compress-pdf): tối ưu PDF sau khi sửa các vấn đề về trang +- [Xoay PDF](./rotate-pdf): chỉnh lại các trang bị xoay diff --git a/docs/vi/tools/page-numbers.md b/docs/vi/tools/page-numbers.md new file mode 100644 index 00000000..6259d413 --- /dev/null +++ b/docs/vi/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: Số trang +description: Thêm số trang tùy chỉnh vào bất kỳ vị trí nào trên trang PDF với phông chữ, cỡ chữ và màu sắc có thể cấu hình. +--- + +# Số trang + +Thêm số trang hiển thị vào mọi trang của PDF. Bạn chọn vị trí, định dạng, cỡ chữ và màu sắc, phần còn lại công cụ lo. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Cấu hình cài đặt số trang trong bảng tùy chọn xuất hiện. +3. Nhấp **Thêm số trang** để xử lý. +4. PDF đã đánh số sẽ được tải xuống tự động. + +## Tùy chọn + +- **Vị trí**: Chọn nơi số trang xuất hiện: Giữa dưới, Trái dưới, Phải dưới, Giữa trên, Trái trên hoặc Phải trên. +- **Định dạng**: Chọn giữa đánh số đơn giản (1, 2, 3...) hoặc định dạng "trang X trên Y" (1 / 5, 2 / 5...). +- **Cỡ chữ**: Đặt kích thước của văn bản số trang. Mặc định là 12. +- **Màu sắc**: Chọn bất kỳ màu nào cho văn bản số trang bằng bộ chọn màu. + +## Tính năng + +- Sáu tùy chọn vị trí bao gồm các góc và vị trí giữa +- Hai định dạng đánh số: tuần tự đơn giản hoặc "trang X trên Y" +- Cỡ chữ tùy chỉnh từ 6 đến 72 điểm +- Bộ chọn màu đầy đủ cho màu văn bản +- Tự động xử lý lề để số luôn nằm trong vùng an toàn bất kể kích thước trang + +## Trường hợp sử dụng + +- Chuẩn bị tài liệu để in cần có số trang tham chiếu rõ ràng +- Thêm số trang vào PDF đã gộp từ nhiều tệp nguồn +- Đánh số tài liệu phát tay cho bài thuyết trình trước khi phân phối +- Thêm số thứ tự vào tài liệu pháp lý hoặc hợp đồng + +## Mẹo + +- Định dạng "trang X trên Y" hữu ích cho tài liệu mà người đọc cần biết tổng độ dài, như đề xuất hoặc báo cáo. +- Nếu bạn cần kiểu đánh số khác nhau cho từng phần (như chữ số La Mã cho phần đầu sách), hãy dùng công cụ [Thêm nhãn trang](./add-page-labels). + +## Công cụ liên quan + +- [Thêm nhãn trang](./add-page-labels) +- [Đánh số Bates](./bates-numbering) +- [Đầu trang & Chân trang](./header-footer) diff --git a/docs/vi/tools/pdf-booklet.md b/docs/vi/tools/pdf-booklet.md new file mode 100644 index 00000000..3a56b86f --- /dev/null +++ b/docs/vi/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: Sách nhỏ PDF +description: Sắp xếp lại các trang PDF theo thứ tự sách nhỏ (đóng ghim giữa) để gấp và bấm thành cuốn sách nhỏ thực tế. +--- + +# Sách nhỏ PDF + +Sắp xếp lại các trang của PDF theo thứ tự dàn trang sách nhỏ. Khi in hai mặt và gấp đôi, các trang sẽ theo đúng thứ tự đọc. Đây là bố cục dùng cho sách nhỏ đóng ghim giữa và zine. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Cấu hình cài đặt sách nhỏ: kích thước trang đầu ra và hướng trang. +3. Nhấp **Tạo bản xem trước** để xem các trang sẽ được sắp xếp thế nào trên mỗi tờ. +4. Xem lại bản xem trước, hiển thị từng tờ giấy với các trang mặt trước và mặt sau. +5. Nhấp **Tải xuống** để lưu PDF đã dàn trang sách nhỏ. + +## Tính năng + +- Tự động sắp xếp lại trang cho kiểu đóng ghim giữa +- Kích thước trang đầu ra có thể cấu hình +- Xem trước trực quan bố cục sách nhỏ trước khi tải xuống +- Xử lý số trang lẻ bằng cách chèn trang trống khi cần +- Co giãn các trang nguồn cho vừa kích thước tờ sách nhỏ + +## Trường hợp sử dụng + +- Tạo sách nhỏ hoặc zine để in từ một PDF thông thường +- Chuẩn bị chương trình hội nghị hoặc hướng dẫn sự kiện để tự in +- Làm thiệp chúc mừng gấp hoặc catalogue nhỏ +- Làm tập thơ hoặc sách mỏng để đóng thủ công + +## Mẹo + +- Số trang của PDF nguồn lý tưởng nên là bội số của 4 để có cuốn sách gọn. Nếu không, trang trống sẽ được thêm tự động để lấp đầy tờ cuối. +- In đầu ra hai mặt với cài đặt "lật theo cạnh ngắn" của máy in, sau đó gấp tất cả các tờ lại với nhau và bấm ghim ở gáy sách. +- Nếu chỉ muốn đặt nhiều trang lên một tờ mà không theo thứ tự sách nhỏ, hãy dùng [N-Up PDF](./n-up-pdf). + +## Công cụ liên quan + +- [N-Up PDF](./n-up-pdf) +- [Xoay PDF](./rotate-pdf) +- [Thêm trang trống](./add-blank-page) diff --git a/docs/vi/tools/pdf-layers.md b/docs/vi/tools/pdf-layers.md new file mode 100644 index 00000000..929b4fe2 --- /dev/null +++ b/docs/vi/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: Lớp PDF (OCG) +description: Xem, bật tắt, thêm và xóa các lớp Optional Content Group (OCG) trong tài liệu PDF. +--- + +# Lớp PDF (OCG) + +Quản lý các Optional Content Group (OCG), thường gọi là "lớp", bên trong PDF. Bạn có thể bật tắt hiển thị lớp, thêm lớp mới (kể cả lớp con lồng nhau), xóa lớp và lưu PDF đã chỉnh sửa. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Nhấp nút xử lý để tải tài liệu bằng engine PyMuPDF. +3. Công cụ hiển thị tất cả lớp hiện có cùng trạng thái hiển thị, trạng thái khóa và cấp bậc lồng nhau. +4. Bật tắt các hộp kiểm để hiện hoặc ẩn lớp. Lớp bị khóa không thể bật tắt. +5. Thêm lớp cấp cao nhất mới bằng cách nhập tên và nhấp nút thêm, hoặc thêm lớp con dưới một lớp cha hiện có. +6. Xóa các lớp bạn không còn cần. +7. Nhấp **Lưu** để tải xuống PDF đã chỉnh sửa với các thay đổi về lớp. + +## Tính năng + +- Hiển thị cấu trúc phân cấp lớp với thụt lề phù hợp cho lớp lồng nhau +- Bật hoặc tắt hiển thị lớp +- Biểu tượng khóa giúp tránh thay đổi nhầm +- Thêm lớp cấp cao nhất hoặc lớp con với tên tùy chỉnh +- Xóa từng lớp riêng lẻ +- Lưu mọi thay đổi vào một tệp PDF mới + +## Trường hợp sử dụng + +- Bật tắt hiển thị các lớp ghi chú trong bản vẽ kiến trúc hoặc kỹ thuật +- Thêm lớp chú thích mới vào tài liệu thiết kế nhiều lớp +- Xóa các lớp lỗi thời khỏi mẫu trước khi phân phối +- Kiểm tra những lớp nào tồn tại trong một PDF phức tạp nhận từ bên thứ ba + +## Mẹo + +- Nếu PDF không có lớp nào, công cụ hiển thị trạng thái trống kèm gợi ý thêm lớp. Không phải PDF nào cũng dùng lớp OCG, chúng phổ biến nhất trong tệp xuất từ CAD và tệp thiết kế. +- Lớp con được thụt lề dưới lớp cha. Bạn có thể lồng lớp ở mọi cấp độ. +- Lớp bị khóa hiển thị với biểu tượng khóa và hộp kiểm bị vô hiệu hóa. Các khóa này do người tạo PDF thiết lập. + +## Công cụ liên quan + +- [Xem Metadata](./view-metadata) +- [Chỉnh sửa Metadata](./edit-metadata) +- [Nhân đôi & Sắp xếp](./organize-pdf) diff --git a/docs/vi/tools/pdf-multi-tool.md b/docs/vi/tools/pdf-multi-tool.md new file mode 100644 index 00000000..a91e685d --- /dev/null +++ b/docs/vi/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: Công cụ đa năng PDF +description: Trình quản lý trang tất cả trong một để gộp, chia, xoay, nhân đôi, xóa và sắp xếp lại các trang PDF. +--- + +# Công cụ đa năng PDF + +Không gian làm việc thống nhất cho mọi thao tác ở cấp độ trang PDF. Tải lên một hoặc nhiều PDF và làm việc với tất cả các trang trong một lưới trực quan duy nhất. Xoay, sắp xếp lại, nhân đôi, xóa, chèn PDF mới, thêm trang trống và chia kết quả, tất cả mà không rời khỏi công cụ. + +## Cách hoạt động + +1. Nhấp **Tải lên PDF** hoặc kéo tệp vào vùng tải lên. Hỗ trợ nhiều tệp. +2. Tất cả trang từ mọi tệp đã tải lên xuất hiện trong lưới có thể cuộn kèm hình thu nhỏ. +3. Dùng thanh công cụ hoặc các nút thao tác trên từng trang để chỉnh sửa trang. +4. Chọn trang bằng hộp kiểm trên mỗi thẻ, sau đó áp dụng thao tác hàng loạt. +5. Đánh dấu điểm chia bằng biểu tượng cái kéo để chia đầu ra thành các tệp riêng. +6. Nhấp **Xuất PDF** để tải xuống kết quả cuối cùng. Nếu có điểm chia, đầu ra là tệp ZIP chứa nhiều PDF. + +## Tính năng + +- **Gộp**: Tải lên nhiều PDF và chúng tự động được kết hợp vào một không gian làm việc +- **Sắp xếp lại**: Kéo thả các thẻ trang để thay đổi trình tự +- **Xoay**: Xoay từng trang hoặc hàng loạt theo bước 90 độ (trái hoặc phải) +- **Nhân đôi**: Sao chép bất kỳ trang nào chỉ với một cú nhấp +- **Xóa**: Xóa từng trang hoặc xóa hàng loạt các trang đã chọn +- **Chèn PDF**: Thêm PDF mới sau bất kỳ trang cụ thể nào +- **Thêm trang trống**: Nối một trang A4 trống vào cuối +- **Chia**: Đặt điểm chia giữa các trang, sau đó xuất thành ZIP gồm các PDF riêng +- **Chọn tất cả / Bỏ chọn tất cả**: Chọn nhanh cho các thao tác hàng loạt +- **Hoàn tác / Làm lại**: Lịch sử hoàn tác/làm lại đầy đủ cho mọi thao tác +- **Tải xuống mục đã chọn**: Chỉ xuất các trang đã chọn thành PDF độc lập +- Tự động sửa PDF bị hỏng trước khi tải + +## Trường hợp sử dụng + +- Tạo tài liệu tùy chỉnh từ các trang của nhiều PDF nguồn +- Dọn dẹp tài liệu quét bằng cách xóa trang trống, xoay các bản quét bị nghiêng và sắp xếp lại các phần +- Chia PDF lớn tại ranh giới chương bằng điểm chia trực quan +- Chỉnh sửa nhanh ở cấp độ trang mà không cần trình chỉnh sửa PDF đầy đủ + +## Mẹo + +- Hệ thống hoàn tác/làm lại ghi lại mọi thao tác. Cứ dùng thoải mái, bạn không thể vô tình làm mất công việc của mình. +- Điểm chia xuất hiện dưới dạng đường đứt nét màu xanh giữa các trang. Đặt chúng trực quan ở nơi bạn muốn chia tài liệu, rồi xuất để nhận tệp ZIP. +- Với các tác vụ gộp hoặc chia đơn giản, các công cụ chuyên dụng [Gộp PDF](./merge-pdf) hoặc [Chia PDF](./split-pdf) có thể nhanh hơn. Công cụ đa năng phát huy tác dụng khi bạn cần nhiều thao tác trong một phiên. + +## Công cụ liên quan + +- [Gộp PDF](./merge-pdf) +- [Chia PDF](./split-pdf) +- [Nhân đôi & Sắp xếp](./organize-pdf) +- [Xoay PDF](./rotate-pdf) diff --git a/docs/vi/tools/pdf-to-bmp.md b/docs/vi/tools/pdf-to-bmp.md new file mode 100644 index 00000000..00314348 --- /dev/null +++ b/docs/vi/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF sang BMP +description: Chuyển đổi các trang PDF thành ảnh BMP không nén. Hữu ích cho hệ thống cũ và quy trình in yêu cầu đầu vào bitmap. +--- + +# PDF sang BMP + +Chuyển mỗi trang của PDF thành một ảnh BMP (Bitmap). BMP là định dạng không nén, nên đầu ra chính xác đến từng điểm ảnh, không mất chất lượng, nhưng tệp rất lớn. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Nhấp **Chuyển đổi** để xử lý tệp. +3. Một tệp `.bmp` hoặc một tệp ZIP sẽ được tải xuống tự động. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Các trang được kết xuất ở tỷ lệ cố định 2x, tạo ra ảnh có kích thước xấp xỉ gấp đôi kích thước gốc của trang PDF. + +## Định dạng đầu ra + +- **Một trang**: `filename.bmp` +- **Nhiều trang**: `filename_bmps.zip` chứa `page_1.bmp`, `page_2.bmp`, v.v. + +## Trường hợp sử dụng + +- Đưa các trang PDF vào hệ thống hoặc phần cứng cũ chỉ nhận đầu vào BMP. +- Chuẩn bị ảnh không nén cho một số quy trình in nhất định. +- Dùng đầu ra bitmap làm đầu vào cho các công cụ xử lý ảnh cần dữ liệu điểm ảnh thô. + +## Mẹo + +- Tệp BMP rất lớn vì lưu dữ liệu điểm ảnh thô không nén. Với hầu hết mục đích, [PDF sang PNG](./pdf-to-png) cho chất lượng không mất dữ liệu với tệp nhỏ hơn nhiều. +- Nếu hệ thống đích chấp nhận PNG hoặc TIFF, hãy ưu tiên các định dạng đó để tiết kiệm dung lượng đĩa. + +## Công cụ liên quan + +- [PDF sang PNG](./pdf-to-png) +- [PDF sang TIFF](./pdf-to-tiff) +- [PDF sang JPG](./pdf-to-jpg) diff --git a/docs/vi/tools/pdf-to-cbz.md b/docs/vi/tools/pdf-to-cbz.md new file mode 100644 index 00000000..e2709eb1 --- /dev/null +++ b/docs/vi/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF sang CBZ +description: Chuyển đổi PDF thành tệp CBZ (Comic Book Archive) cho các trình đọc truyện tranh như Komga, Kavita, CDisplayEx và Calibre. +--- + +# PDF sang CBZ + +Chuyển PDF thành tệp CBZ (Comic Book ZIP), định dạng tiêu chuẩn cho truyện tranh và manga kỹ thuật số. Mỗi trang PDF trở thành một ảnh trong kho lưu trữ. Công cụ tạo metadata ở ba định dạng để tương thích tối đa: ComicInfo.xml, metadata.opf và ComicBookInfo JSON. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Chọn định dạng ảnh, chất lượng, tỷ lệ và metadata tùy chọn. +3. Nhấp **Chuyển đổi** để tạo tệp CBZ. +4. Tệp `.cbz` được tải xuống tự động. + +## Tùy chọn + +| Tùy chọn | Giá trị | Mặc định | Mô tả | +| ---------------- | --------------- | -------- | ------------------------------------------------------------------------------------- | +| Định dạng ảnh | JPEG, PNG, WebP | JPEG | JPEG cho truyện màu, PNG cho manga đen trắng không mất dữ liệu, WebP để nén tốt nhất. | +| Chất lượng | 50–100% | 85% | Điều khiển mức nén JPEG/WebP. Ẩn với PNG (luôn không mất dữ liệu). | +| Tỷ lệ | 1.0x–4.0x | 2.0x | Tỷ lệ cao hơn cho ảnh sắc nét hơn trên màn hình độ phân giải cao. | +| Thang xám | Bật/Tắt | Tắt | Chuyển các trang sang thang xám. Giảm dung lượng tệp với nội dung đen trắng. | +| Chế độ manga | Bật/Tắt | Tắt | Đặt hướng đọc từ phải sang trái trong metadata. | +| Bao gồm metadata | Bật/Tắt | Bật | Nhúng ComicInfo.xml, metadata.opf và ComicBookInfo JSON. | + +## Trường metadata + +Khi bật metadata, bạn có thể điền: + +- **Tiêu đề**: Tự động lấy từ tên tệp PDF. +- **Bộ truyện**: Tên bộ truyện (ví dụ: "Naruto"). +- **Số (#)**: Số tập trong bộ truyện. +- **Quyển (Vol.)**: Số quyển. +- **Tác giả**: Tên người viết hoặc người sáng tạo. +- **Nhà xuất bản**: Công ty xuất bản. +- **Thẻ / Thể loại**: Các thẻ cách nhau bằng dấu phẩy (ví dụ: "Action, Adventure"). +- **Năm xuất bản**: Năm xuất bản (1900–2100). +- **Đánh giá**: Điểm đánh giá cộng đồng từ 0 đến 5. + +## Khả năng tương thích metadata + +Công cụ ghi metadata ở ba định dạng để trình đọc nào cũng tìm thấy: + +| Định dạng | Vị trí | Được hỗ trợ bởi | +| ------------------ | -------------------- | ------------------------------------------- | +| ComicInfo.xml | Tệp bên trong ZIP | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | Tệp bên trong ZIP | Calibre | +| ComicBookInfo JSON | Trường chú thích ZIP | Calibre (dự phòng) | + +## Định dạng đầu ra + +- `filename.cbz`: Kho ZIP chứa các ảnh trang được đánh số và các tệp metadata. + +Ảnh trang được đặt tên bằng số có chữ số 0 đứng đầu (`01.jpg`, `02.jpg`, v.v.) để trình đọc hiển thị đúng thứ tự. + +## Trường hợp sử dụng + +- Chuyển PDF manga hoặc truyện tranh để dùng với trình đọc truyện tranh. +- Xây dựng thư viện truyện tranh kỹ thuật số trong Komga, Kavita hoặc Calibre. +- Chuyển truyện tranh quét sang định dạng thân thiện với trình đọc. +- Chia sẻ truyện tranh ở định dạng giữ nguyên hướng đọc và metadata. + +## Mẹo + +- Dùng **JPEG** cho truyện màu và **PNG** cho manga đen trắng, vì PNG nén nội dung đen trắng rất hiệu quả. +- Bật **Thang xám** cho manga để giảm đáng kể dung lượng tệp. +- Điền các trường **Bộ truyện** và **Số** để các trình quản lý thư viện (Komga, Calibre) tự động sắp xếp bộ sưu tập của bạn. +- **WebP** nén tốt nhất nhưng các trình đọc truyện tranh cũ có thể không hỗ trợ. + +## Công cụ liên quan + +- [PDF sang JPG](./pdf-to-jpg) +- [PDF sang PNG](./pdf-to-png) +- [PDF sang TIFF](./pdf-to-tiff) +- [Trích xuất hình ảnh](./extract-images) diff --git a/docs/vi/tools/pdf-to-csv.md b/docs/vi/tools/pdf-to-csv.md new file mode 100644 index 00000000..14004094 --- /dev/null +++ b/docs/vi/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF sang CSV +description: Trích xuất bảng từ tài liệu PDF và xuất thành một tệp CSV duy nhất. Xử lý PDF nhiều trang với khả năng tự động phát hiện bảng. +--- + +# PDF sang CSV + +Trích xuất bảng từ PDF và xuất thành tệp CSV. Công cụ quét từng trang để tìm dữ liệu dạng bảng bằng engine phát hiện bảng của PyMuPDF, rồi ghi mọi hàng tìm được vào một đầu ra duy nhất phân tách bằng dấu phẩy. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Nhấp **Chuyển đổi** để bắt đầu trích xuất bảng. +3. Công cụ quét từng trang và tự động nhận diện bảng. +4. Tệp `.csv` được tải xuống với toàn bộ dữ liệu bảng đã trích xuất. + +Các bảng từ những trang khác nhau được ngăn cách bằng hàng trống trong đầu ra. Các ô chứa dấu phẩy, dấu ngoặc kép hoặc xuống dòng được thoát đúng theo RFC 4180. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Mọi bảng tìm thấy trong tài liệu đều được trích xuất và gộp vào một CSV duy nhất. + +## Định dạng đầu ra + +- Một tệp `filename.csv` duy nhất chứa tất cả bảng được phát hiện. + +## Trường hợp sử dụng + +- Lấy dữ liệu tài chính từ sao kê ngân hàng hoặc hóa đơn PDF vào bảng tính. +- Trích xuất bảng giá từ báo giá của nhà cung cấp để so sánh. +- Chuyển dữ liệu nghiên cứu dạng bảng từ bài báo PDF sang định dạng phù hợp với công cụ phân tích. +- Di chuyển dữ liệu từ báo cáo PDF cũ vào cơ sở dữ liệu. + +## Mẹo + +- Nếu không tìm thấy bảng nào, công cụ hiển thị thông báo "Không tìm thấy bảng". Điều này thường có nghĩa là PDF dùng bố cục văn bản trông giống bảng nhưng không được cấu trúc như một bảng thực sự. +- Để kiểm soát từng bảng tốt hơn, hãy dùng [Trích xuất bảng PDF](./extract-tables), cho phép chọn giữa đầu ra CSV, JSON và Markdown. +- Nếu bạn cần dữ liệu ở định dạng Excel với các trang tính riêng cho từng bảng, hãy dùng [PDF sang Excel](./pdf-to-excel). + +## Công cụ liên quan + +- [PDF sang Excel](./pdf-to-excel) +- [Trích xuất bảng PDF](./extract-tables) +- [PDF sang Văn bản](./pdf-to-text) diff --git a/docs/vi/tools/pdf-to-excel.md b/docs/vi/tools/pdf-to-excel.md new file mode 100644 index 00000000..95c7488b --- /dev/null +++ b/docs/vi/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF sang Excel +description: Trích xuất bảng từ tài liệu PDF vào bảng tính Excel. Mỗi bảng có một trang tính riêng kèm tham chiếu trang. +--- + +# PDF sang Excel + +Trích xuất bảng từ PDF và lưu thành bảng tính Excel (`.xlsx`). Mỗi bảng được phát hiện nằm trên một trang tính riêng, được gắn nhãn bằng số bảng và trang nguồn. Chạy bằng PyMuPDF để phát hiện bảng và thư viện SheetJS để tạo tệp Excel. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Nhấp **Chuyển đổi** để bắt đầu trích xuất bảng. +3. Công cụ quét mọi trang để tìm bảng, sau đó tạo sổ làm việc Excel. +4. Tệp `.xlsx` được tải xuống với mỗi bảng một trang tính. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Mọi bảng được phát hiện đều được trích xuất tự động. + +## Định dạng đầu ra + +- Một tệp `filename.xlsx` duy nhất. +- **Một bảng**: một trang tính tên "Table". +- **Nhiều bảng**: các trang tính tên "Table 1 (Page 3)", "Table 2 (Page 5)", v.v. Tên trang tính bị cắt còn 31 ký tự (giới hạn của Excel). + +## Trường hợp sử dụng + +- Chuyển báo cáo tài chính PDF thành bảng tính có thể chỉnh sửa để phân tích thêm. +- Trích xuất bảng tồn kho hoặc đơn hàng từ PDF của nhà cung cấp. +- Đưa dữ liệu có cấu trúc từ biểu mẫu hoặc catalogue PDF vào Excel để sắp xếp và lọc. +- Lưu trữ dữ liệu bảng PDF ở định dạng mà đồng nghiệp không chuyên kỹ thuật có thể sử dụng. + +## Mẹo + +- Nếu công cụ báo "Không tìm thấy bảng", PDF có thể dùng bố cục văn bản tự do thay vì bảng có cấu trúc. Hãy thử [PDF sang Văn bản](./pdf-to-text) để lấy nội dung thô. +- Để có định dạng phẳng đơn giản hơn, hãy dùng [PDF sang CSV](./pdf-to-csv). Để tải từng bảng ở nhiều định dạng, hãy dùng [Trích xuất bảng PDF](./extract-tables). +- Xem tên trang tính để biết mỗi bảng đến từ trang nào. + +## Công cụ liên quan + +- [PDF sang CSV](./pdf-to-csv) +- [Trích xuất bảng PDF](./extract-tables) +- [PDF sang Văn bản](./pdf-to-text) diff --git a/docs/vi/tools/pdf-to-greyscale.md b/docs/vi/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..48a12e30 --- /dev/null +++ b/docs/vi/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF sang thang xám +description: Chuyển PDF màu thành phiên bản thang xám (đen trắng). Tạo PDF mới với toàn bộ màu sắc bị loại bỏ trên mọi trang. +--- + +# PDF sang thang xám + +Chuyển PDF màu thành phiên bản thang xám. Mỗi trang được kết xuất, giảm bão hòa màu và nhúng lại dưới dạng ảnh JPEG trong một PDF mới. Đầu ra giữ nguyên kích thước trang gốc. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Nhấp **Chuyển đổi** để xử lý tệp. +3. Tệp `greyscale.pdf` mới được tải xuống với tất cả trang đã chuyển sang đen trắng. + +Bên dưới, mỗi trang được kết xuất ở tỷ lệ 2x, dữ liệu điểm ảnh được đưa qua bộ lọc thang xám, sau đó mã hóa lại thành JPEG chất lượng 90% và đặt vào một tài liệu PDF mới. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Việc chuyển sang thang xám dùng công thức độ sáng tiêu chuẩn và chất lượng JPEG cố định ở 90%. + +## Định dạng đầu ra + +- Một tệp `greyscale.pdf` duy nhất chứa tất cả trang dưới dạng ảnh JPEG thang xám. + +## Trường hợp sử dụng + +- Chuẩn bị tài liệu để in đen trắng nhằm tiết kiệm chi phí mực màu. +- Đáp ứng yêu cầu nộp hồ sơ pháp lý hoặc chính phủ bắt buộc dùng thang xám. +- Giảm dung lượng tệp của PDF nhiều màu (ảnh JPEG thang xám nhỏ hơn ảnh màu). +- Tạo phong cách hình ảnh nhất quán cho tài liệu có cả trang màu và đen trắng. + +## Mẹo + +- Vì mỗi trang được rasterize và nhúng lại dưới dạng JPEG, đầu ra dựa trên ảnh. Văn bản trong PDF gốc sẽ không còn chọn hay tìm kiếm được. Nếu cần văn bản có thể tìm kiếm sau đó, hãy chạy đầu ra qua công cụ OCR. +- Để kiểm soát chỉnh màu tốt hơn (độ sáng, độ tương phản, độ bão hòa), hãy xem công cụ Điều chỉnh màu sắc hoặc nút Greyscale trong [Trình xây dựng quy trình PDF](./pdf-workflow). + +## Công cụ liên quan + +- [PDF sang JPG](./pdf-to-jpg) +- [PDF sang PNG](./pdf-to-png) +- [Trình xây dựng quy trình PDF](./pdf-workflow) diff --git a/docs/vi/tools/pdf-to-jpg.md b/docs/vi/tools/pdf-to-jpg.md new file mode 100644 index 00000000..10067a4c --- /dev/null +++ b/docs/vi/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF sang JPG +description: Chuyển đổi các trang PDF thành ảnh JPG với chất lượng có thể điều chỉnh. PDF một trang tải xuống trực tiếp; PDF nhiều trang xuất thành ZIP. +--- + +# PDF sang JPG + +Chuyển mỗi trang của PDF thành một ảnh JPG. Tài liệu một trang được tải xuống dưới dạng tệp `.jpg` riêng. PDF nhiều trang tạo ra kho ZIP chứa một JPG cho mỗi trang. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. Công cụ hiển thị tên tệp, dung lượng và số trang. +2. Điều chỉnh thanh trượt **Chất lượng** để kiểm soát mức nén JPG. +3. Nhấp **Chuyển đổi** để bắt đầu xử lý. +4. Kết quả được tải xuống tự động: một JPG cho PDF một trang, hoặc tệp ZIP cho tài liệu nhiều trang. + +## Tùy chọn + +- **Chất lượng**: thanh trượt từ 0% đến 100% (mặc định 90%). Giá trị cao hơn cho ảnh sắc nét hơn với dung lượng lớn hơn. Giá trị thấp hơn nén mạnh hơn. + +Các trang được kết xuất nội bộ ở tỷ lệ 2x, nên độ phân giải đầu ra gấp đôi kích thước trang PDF. Một trang cỡ letter tiêu chuẩn tạo ra ảnh khoảng 1.224 x 1.584 điểm ảnh. + +## Định dạng đầu ra + +- **Một trang**: `filename.jpg` +- **Nhiều trang**: `filename_jpgs.zip` chứa `page_1.jpg`, `page_2.jpg`, v.v. + +## Trường hợp sử dụng + +- Tạo hình thu nhỏ xem trước cho hệ thống quản lý tài liệu. +- Chia sẻ một trang của báo cáo trong chat hoặc email không hỗ trợ PDF. +- Tạo tài nguyên hình ảnh từ sơ đồ hoặc minh họa trong PDF. +- Lưu trữ tài liệu quét dưới dạng từng ảnh riêng. + +## Mẹo + +- Để có đầu ra không mất dữ liệu, hãy dùng [PDF sang PNG](./pdf-to-png). +- Mức chất lượng 80-90% cân bằng tốt giữa dung lượng tệp và độ trung thực hình ảnh. +- Nếu bạn cần định dạng riêng cho từng trang, hãy cân nhắc [Trình xây dựng quy trình PDF](./pdf-workflow) có nút đầu ra PDF sang hình ảnh. + +## Công cụ liên quan + +- [PDF sang PNG](./pdf-to-png) +- [PDF sang WebP](./pdf-to-webp) +- [PDF sang BMP](./pdf-to-bmp) +- [PDF sang TIFF](./pdf-to-tiff) diff --git a/docs/vi/tools/pdf-to-json.md b/docs/vi/tools/pdf-to-json.md new file mode 100644 index 00000000..7c034ef5 --- /dev/null +++ b/docs/vi/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF sang JSON +description: Chuyển đổi tệp PDF sang định dạng JSON có cấu trúc bằng CPDF. Xuất cấu trúc nội bộ của PDF thành dữ liệu JSON mà máy có thể đọc. +--- + +# PDF sang JSON + +Chuyển một hoặc nhiều tệp PDF sang định dạng JSON. Công cụ dùng CPDF (Coherent PDF) để tuần tự hóa cấu trúc nội bộ của từng PDF thành biểu diễn JSON mà máy có thể đọc. Đầu ra luôn được giao dưới dạng kho ZIP. + +## Cách hoạt động + +1. Chọn một hoặc nhiều tệp PDF bằng bộ chọn tệp. +2. Nhấp **Chuyển đổi** để bắt đầu xử lý. Việc chuyển đổi chạy trong web worker nền. +3. Kho ZIP được tải xuống chứa một tệp JSON cho mỗi PDF đầu vào. + +Thanh trạng thái hiển thị tiến trình qua các giai đoạn chuyển đổi và tạo ZIP. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Mỗi PDF được chuyển thành biểu diễn JSON đầy đủ. + +## Định dạng đầu ra + +- Tệp `pdfs-to-json.zip` chứa `filename.json` cho mỗi PDF đầu vào. + +Đầu ra JSON biểu diễn cấu trúc đối tượng nội bộ của PDF, bao gồm cây trang, tham chiếu phông chữ, metadata và luồng nội dung. + +## Trường hợp sử dụng + +- Kiểm tra cấu trúc nội bộ của PDF để gỡ lỗi hoặc xác thực. +- Trích xuất metadata và thuộc tính trang có cấu trúc bằng lập trình. +- Đưa dữ liệu cấu trúc PDF vào các quy trình xử lý tùy chỉnh. +- Kiểm tra tuân thủ tài liệu PDF bằng cách phân tích cây đối tượng của chúng. + +## Mẹo + +- Công cụ này xuất cấu trúc đối tượng PDF thô, không phải nội dung văn bản đã trích xuất. Nếu cần văn bản trang ở định dạng JSON, hãy dùng [Chuẩn bị PDF cho AI](./prepare-pdf-for-ai). +- Để trích xuất văn bản thuần, [PDF sang Văn bản](./pdf-to-text) đơn giản hơn. +- PDF lớn có cấu trúc phức tạp tạo ra các tệp JSON rất lớn. + +## Công cụ liên quan + +- [PDF sang Văn bản](./pdf-to-text) +- [Chuẩn bị PDF cho AI](./prepare-pdf-for-ai) +- [Trích xuất bảng PDF](./extract-tables) diff --git a/docs/vi/tools/pdf-to-markdown.md b/docs/vi/tools/pdf-to-markdown.md new file mode 100644 index 00000000..9ca42660 --- /dev/null +++ b/docs/vi/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF sang Markdown +description: Chuyển đổi tài liệu PDF sang định dạng Markdown với tùy chọn trích xuất hình ảnh. Hỗ trợ chuyển đổi hàng loạt nhiều tệp. +--- + +# PDF sang Markdown + +Chuyển tệp PDF sang định dạng Markdown (`.md`), giữ nguyên tiêu đề, đoạn văn, danh sách và định dạng cơ bản. Có thể trích xuất và đưa vào các hình ảnh nhúng. Hỗ trợ chuyển đổi đơn lẻ và hàng loạt. Chạy bằng PyMuPDF. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Tùy chọn bật **Bao gồm hình ảnh** để nhúng các hình ảnh đã trích xuất vào đầu ra Markdown. +3. Nhấp **Chuyển đổi** để bắt đầu xử lý. +4. Một tệp được tải xuống dưới dạng `filename.md`. Nhiều tệp tạo ra `markdown-files.zip`. + +## Tùy chọn + +- **Bao gồm hình ảnh**: khi được chọn, các hình ảnh nhúng trong PDF được trích xuất và tham chiếu trong đầu ra Markdown. Khi bỏ chọn, chỉ nội dung văn bản được chuyển đổi. + +## Định dạng đầu ra + +- **Một tệp**: `filename.md` +- **Nhiều tệp**: `markdown-files.zip` chứa một tệp `.md` cho mỗi PDF đầu vào. + +## Trường hợp sử dụng + +- Chuyển tài liệu PDF thành Markdown cho trình tạo trang tĩnh như VitePress, Hugo hoặc Jekyll. +- Biến các bài nghiên cứu PDF thành Markdown có thể chỉnh sửa cho ứng dụng ghi chú như Obsidian. +- Di chuyển kho kiến thức PDF cũ sang định dạng văn bản thân thiện với Git. +- Trích xuất nội dung có cấu trúc từ sách điện tử PDF để định dạng lại. + +## Mẹo + +- Tùy chọn Bao gồm hình ảnh hữu ích khi PDF chứa sơ đồ hoặc hình vẽ thiết yếu với nội dung. Hãy tắt nó với tài liệu nhiều chữ để giữ đầu ra gọn gàng. +- Bố cục phức tạp có thanh bên, chú thích cuối trang hoặc văn bản nhiều cột có thể cho Markdown chưa hoàn hảo. Hãy xem lại và chỉnh sửa đầu ra khi cần. +- Để lấy văn bản thô không có định dạng, hãy dùng [PDF sang Văn bản](./pdf-to-text). + +## Công cụ liên quan + +- [PDF sang Văn bản](./pdf-to-text) +- [PDF sang Word](./pdf-to-word) +- [Chuẩn bị PDF cho AI](./prepare-pdf-for-ai) diff --git a/docs/vi/tools/pdf-to-pdfa.md b/docs/vi/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..fc4e241e --- /dev/null +++ b/docs/vi/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF sang PDF/A +description: Chuyển PDF tiêu chuẩn sang định dạng PDF/A để lưu trữ lâu dài. Hỗ trợ các mức tuân thủ PDF/A-1b, PDF/A-2b và PDF/A-3b. +--- + +# PDF sang PDF/A + +PDF/A là tập con của PDF được tiêu chuẩn hóa theo ISO, thiết kế cho việc bảo quản kỹ thuật số lâu dài. Công cụ này chuyển PDF tiêu chuẩn của bạn thành tài liệu tuân thủ PDF/A bằng Ghostscript chạy trực tiếp trong trình duyệt. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. +2. Chọn **Phiên bản PDF/A** từ danh sách thả xuống. +3. Tùy chọn bật **Làm phẳng PDF trước** cho các tệp phức tạp không chuyển đổi được theo cách thông thường. +4. Nhấp **Chuyển đổi sang PDF/A**. Nhiều tệp sẽ tạo ra kho ZIP. + +## Các phiên bản PDF/A + +| Phiên bản | Hạn chế | Phù hợp nhất cho | +| ------------ | ----------------------------------------------- | ------------------------------------------ | +| **PDF/A-1b** | Nghiêm ngặt nhất. Không trong suốt, không lớp. | Tương thích tối đa với hệ thống lưu trữ cũ | +| **PDF/A-2b** | Cho phép trong suốt và JPEG2000. | Lưu trữ đa dụng (khuyến nghị) | +| **PDF/A-3b** | Cho phép tệp đính kèm nhúng ở bất kỳ định dạng. | Lưu trữ tài liệu kèm tệp dữ liệu nguồn | + +PDF/A-2b được chọn mặc định và phù hợp với đại đa số nhu cầu lưu trữ. + +## Tùy chọn làm phẳng trước + +Một số PDF chứa tính năng ngăn việc chuyển sang PDF/A suôn sẻ: mã hóa phông chữ bất thường, chồng trong suốt phức tạp hoặc cấu trúc nội bộ bị hỏng. Bật **Làm phẳng trước** sẽ rasterize PDF ở 300 DPI trước khi chuyển đổi, đảm bảo tuân thủ nhưng đổi lại văn bản không còn chọn được. Hãy dùng nó như phương án dự phòng khi chuyển đổi thông thường báo lỗi. + +Làm phẳng trước yêu cầu engine PyMuPDF WASM. + +## Trường hợp sử dụng + +- Đáp ứng yêu cầu lưu trữ của chính phủ hoặc pháp lý (nhiều khu vực pháp lý bắt buộc PDF/A cho hồ sơ tòa án) +- Nộp tài liệu cho kho lưu trữ của tổ chức hoặc thư viện số +- Bảo quản hồ sơ doanh nghiệp khi phần mềm gốc có thể không còn tồn tại sau mười năm +- Chuẩn bị hóa đơn cho các tiêu chuẩn hóa đơn điện tử yêu cầu PDF/A-3b kèm tệp XML đính kèm + +## Mẹo + +- Hãy thử chuyển đổi không làm phẳng trước. Chỉ bật khi gặp lỗi. +- PDF/A nhúng tất cả phông chữ, nên tệp đầu ra thường lớn hơn bản gốc. +- Hãy xác thực đầu ra bằng công cụ xác thực PDF/A chuyên dụng nếu quy trình của bạn yêu cầu tuân thủ nghiêm ngặt. + +## Công cụ liên quan + +- [Nén PDF](./compress-pdf): giảm dung lượng tệp sau khi chuyển đổi +- [Làm phẳng PDF](./flatten-pdf): làm phẳng biểu mẫu trước khi chuyển sang PDF/A +- [Xóa Metadata](./remove-metadata): loại bỏ metadata trước khi lưu trữ diff --git a/docs/vi/tools/pdf-to-png.md b/docs/vi/tools/pdf-to-png.md new file mode 100644 index 00000000..71262b92 --- /dev/null +++ b/docs/vi/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF sang PNG +description: Chuyển đổi các trang PDF thành ảnh PNG không mất dữ liệu với tỷ lệ có thể điều chỉnh. Lý tưởng cho ảnh chụp chất lượng cao và nền trong suốt. +--- + +# PDF sang PNG + +Chuyển mỗi trang của PDF thành một ảnh PNG. PNG dùng nén không mất dữ liệu, nên đầu ra giữ nguyên mọi chi tiết của trang gốc. PDF một trang được tải xuống dưới dạng tệp `.png`; PDF nhiều trang tạo ra ZIP. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Đặt thanh trượt **Tỷ lệ** để điều khiển độ phân giải đầu ra. +3. Nhấp **Chuyển đổi** để bắt đầu xử lý. +4. Một PNG hoặc một kho ZIP được tải xuống tự động. + +## Tùy chọn + +- **Tỷ lệ**: từ 1.0x đến 3.0x (mặc định 2.0x). Ở 2.0x, một trang cỡ letter tiêu chuẩn được kết xuất khoảng 1.224 x 1.584 điểm ảnh. Tỷ lệ cao hơn cho ảnh lớn và sắc nét hơn, đổi lại dung lượng tệp và thời gian xử lý tăng. + +## Định dạng đầu ra + +- **Một trang**: `filename.png` +- **Nhiều trang**: `filename_pngs.zip` chứa `page_1.png`, `page_2.png`, v.v. + +## Trường hợp sử dụng + +- Chụp ảnh các trang PDF với độ trung thực cao cho bài thuyết trình. +- Trích xuất biểu đồ hoặc sơ đồ cần cạnh sắc nét và không có lỗi nén. +- Chuẩn bị tài nguyên thiết kế web từ bản mockup PDF. +- Tạo ảnh trang không mất dữ liệu để tiền xử lý OCR. + +## Mẹo + +- Tệp PNG lớn hơn JPG đáng kể. Nếu dung lượng quan trọng hơn chất lượng hoàn hảo, hãy dùng [PDF sang JPG](./pdf-to-jpg) hoặc [PDF sang WebP](./pdf-to-webp). +- Ở tỷ lệ 1.0x, đầu ra khớp với độ phân giải gốc của PDF. Tăng lên 3.0x để xuất chất lượng in. + +## Công cụ liên quan + +- [PDF sang JPG](./pdf-to-jpg) +- [PDF sang WebP](./pdf-to-webp) +- [PDF sang SVG](./pdf-to-svg) diff --git a/docs/vi/tools/pdf-to-svg.md b/docs/vi/tools/pdf-to-svg.md new file mode 100644 index 00000000..afc13fb5 --- /dev/null +++ b/docs/vi/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF sang SVG +description: Chuyển đổi các trang PDF thành đồ họa vector SVG co giãn được. Giữ văn bản và hình dạng dưới dạng đường vector để phóng to vô hạn. +--- + +# PDF sang SVG + +Chuyển mỗi trang của PDF thành một tệp SVG (Scalable Vector Graphics). Khác với các định dạng raster, SVG giữ nguyên đường vector, văn bản và hình dạng nên đầu ra co giãn ở mọi kích thước mà không bị vỡ hạt. Chạy bằng PyMuPDF. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. Bạn có thể thêm nhiều tệp và quản lý từng tệp riêng. +2. Nhấp **Chuyển đổi** để xử lý tất cả tệp đã tải lên. +3. Chuyển đổi một tệp một trang được tải xuống dưới dạng `.svg` riêng. Mọi trường hợp khác được tải xuống dưới dạng kho ZIP. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Mỗi trang được chuyển sang SVG bằng chức năng xuất vector gốc của PyMuPDF. + +## Định dạng đầu ra + +- **Một tệp, một trang**: `filename.svg` +- **Một tệp, nhiều trang**: `filename_svg.zip` chứa `page_1.svg`, `page_2.svg`, v.v. +- **Nhiều tệp**: `pdf_to_svg.zip` với các tệp được sắp xếp theo tên tài liệu nguồn. + +## Trường hợp sử dụng + +- Trích xuất sơ đồ, biểu đồ hoặc hình minh họa vector từ báo cáo PDF để dùng trên trang web. +- Chỉnh sửa nội dung trang PDF trong trình chỉnh sửa vector như Inkscape hoặc Illustrator. +- Nhúng bản xem trước trang co giãn được vào ứng dụng web responsive. +- Trích xuất logo hoặc đồ họa từ brochure PDF mà vẫn giữ cạnh sắc nét. + +## Mẹo + +- SVG hoạt động tốt nhất với PDF chứa nội dung vector. Tài liệu quét hoặc PDF nhiều ảnh sẽ tạo ra tệp SVG lớn chứa dữ liệu raster nhúng. +- Để có đầu ra raster cho PDF nhiều ảnh, hãy dùng [PDF sang PNG](./pdf-to-png) hoặc [PDF sang JPG](./pdf-to-jpg). +- Công cụ này hỗ trợ chuyển đổi hàng loạt: tải lên nhiều PDF cùng lúc để chuyển tất cả trong một lần chạy. + +## Công cụ liên quan + +- [PDF sang PNG](./pdf-to-png) +- [PDF sang JPG](./pdf-to-jpg) +- [PDF sang Markdown](./pdf-to-markdown) diff --git a/docs/vi/tools/pdf-to-text.md b/docs/vi/tools/pdf-to-text.md new file mode 100644 index 00000000..571bc447 --- /dev/null +++ b/docs/vi/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF sang văn bản +description: Trích xuất nội dung văn bản thuần từ tệp PDF. Hỗ trợ trích xuất hàng loạt nhiều PDF với đầu ra là tệp TXT. +--- + +# PDF sang văn bản + +Trích xuất toàn bộ nội dung văn bản từ tệp PDF và lưu thành tệp `.txt` thuần. Hỗ trợ xử lý hàng loạt: tải lên nhiều PDF và trích xuất văn bản của từng tệp trong một thao tác. Chạy bằng PyMuPDF. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. Quản lý danh sách tệp bằng các nút Thêm tệp và Xóa hết. +2. Nhấp **Trích xuất** để bắt đầu xử lý. +3. Một tệp được tải xuống dưới dạng `filename.txt`. Nhiều tệp tạo ra kho `pdf-to-text.zip`. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Toàn bộ nội dung văn bản được trích xuất từ mọi trang theo thứ tự đọc. + +## Định dạng đầu ra + +- **Một tệp**: `filename.txt` +- **Nhiều tệp**: `pdf-to-text.zip` chứa một tệp `.txt` cho mỗi PDF đầu vào. + +## Trường hợp sử dụng + +- Trích xuất nội dung chính từ báo cáo PDF để lập chỉ mục tìm kiếm toàn văn. +- Chuyển sách điện tử hoặc bài viết PDF sang văn bản thuần để đọc trên thiết bị e-ink. +- Lấy văn bản từ hợp đồng hoặc tài liệu pháp lý để phân tích từ khóa. +- Loại bỏ định dạng khỏi PDF để có văn bản sạch cho các script xử lý dữ liệu. +- Chuẩn bị kho ngữ liệu văn bản từ kho lưu trữ PDF cho xử lý ngôn ngữ tự nhiên. + +## Mẹo + +- PDF quét (chỉ có ảnh) sẽ tạo ra tệp văn bản trống vì không có lớp văn bản để trích xuất. Hãy chạy tài liệu quét qua OCR trước. +- Đầu ra giữ thứ tự đọc theo cách PyMuPDF diễn giải, thường là từ trái sang phải, từ trên xuống dưới. Bố cục nhiều cột có thể tạo ra văn bản bị xen kẽ. +- Để có đầu ra có cấu trúc với tiêu đề và định dạng, hãy thử [PDF sang Markdown](./pdf-to-markdown). Để có JSON có cấu trúc sẵn sàng cho AI, hãy dùng [Chuẩn bị PDF cho AI](./prepare-pdf-for-ai). + +## Công cụ liên quan + +- [PDF sang Markdown](./pdf-to-markdown) +- [Chuẩn bị PDF cho AI](./prepare-pdf-for-ai) +- [PDF sang Word](./pdf-to-word) diff --git a/docs/vi/tools/pdf-to-tiff.md b/docs/vi/tools/pdf-to-tiff.md new file mode 100644 index 00000000..73f5c2b8 --- /dev/null +++ b/docs/vi/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF sang TIFF +description: Chuyển đổi các trang PDF thành ảnh TIFF, thường dùng trong in ấn, fax và lưu trữ. Tự động chuyển sang PNG nếu mã hóa thất bại. +--- + +# PDF sang TIFF + +Chuyển mỗi trang của PDF thành một ảnh TIFF. TIFF là định dạng tiêu chuẩn cho sản xuất in, hệ thống fax và lưu trữ tài liệu. Công cụ dùng nén PackBits để mã hóa TIFF và chuyển sang PNG nếu một trang mã hóa thất bại. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Nhấp **Chuyển đổi** để xử lý tệp. +3. Một tệp TIFF hoặc một kho ZIP được tải xuống tự động. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Các trang được kết xuất ở tỷ lệ cố định 2x. + +## Định dạng đầu ra + +- **Một trang**: `filename.tiff` +- **Nhiều trang**: `filename_tiffs.zip` chứa `page_1.tiff`, `page_2.tiff`, v.v. + +Nếu mã hóa TIFF thất bại ở một trang cụ thể (do vấn đề nén), trang đó sẽ được lưu thành tệp `.png`. Khi đó ZIP sẽ chứa cả tệp TIFF lẫn PNG. + +## Trường hợp sử dụng + +- Nộp tài liệu cho cơ quan chính phủ hoặc hệ thống pháp lý yêu cầu định dạng TIFF. +- Chuẩn bị các trang để gửi fax qua dịch vụ fax kỹ thuật số. +- Lưu trữ tài liệu quét ở định dạng không mất dữ liệu được hỗ trợ rộng rãi. +- Đưa các trang vào hệ thống quản lý tài liệu doanh nghiệp. + +## Mẹo + +- Tệp TIFF lớn. Nếu bạn chỉ cần chất lượng không mất dữ liệu cho web hoặc màn hình, [PDF sang PNG](./pdf-to-png) là lựa chọn tốt hơn. +- Hãy kiểm tra nội dung ZIP nếu một số trang phải dùng PNG dự phòng, bạn có thể muốn chuyển đổi riêng những trang đó. + +## Công cụ liên quan + +- [PDF sang PNG](./pdf-to-png) +- [PDF sang BMP](./pdf-to-bmp) +- [PDF sang JPG](./pdf-to-jpg) diff --git a/docs/vi/tools/pdf-to-webp.md b/docs/vi/tools/pdf-to-webp.md new file mode 100644 index 00000000..486ca3a4 --- /dev/null +++ b/docs/vi/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF sang WebP +description: Chuyển đổi các trang PDF thành ảnh WebP với chất lượng có thể điều chỉnh. Dung lượng nhỏ hơn JPG ở chất lượng hình ảnh tương đương. +--- + +# PDF sang WebP + +Chuyển mỗi trang của PDF thành một ảnh WebP. WebP thường tạo ra tệp nhỏ hơn JPG 25-35% ở cùng chất lượng cảm nhận, là lựa chọn tốt cho web. + +## Cách hoạt động + +1. Tải lên PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Điều chỉnh thanh trượt **Chất lượng**. +3. Nhấp **Chuyển đổi** để xử lý tệp. +4. Một tệp `.webp` hoặc một kho ZIP được tải xuống tự động. + +## Tùy chọn + +- **Chất lượng**: thanh trượt từ 0% đến 100% (mặc định 85%). Điều khiển mức nén có mất dữ liệu. Giá trị cao hơn giữ nhiều chi tiết hơn. + +Các trang được kết xuất nội bộ ở tỷ lệ 2x, tạo ra ảnh có kích thước khoảng gấp đôi kích thước gốc của PDF. + +## Định dạng đầu ra + +- **Một trang**: `filename.webp` +- **Nhiều trang**: `filename_webps.zip` chứa `page_1.webp`, `page_2.webp`, v.v. + +## Trường hợp sử dụng + +- Chuẩn bị bản xem trước trang cho các website cần tiết kiệm băng thông. +- Tạo phiên bản ảnh nhẹ của tờ rơi hoặc brochure cho mạng xã hội. +- Chuyển hàng loạt tài liệu nhiều trang thành bộ ảnh tối ưu cho web. + +## Mẹo + +- WebP được hỗ trợ trên mọi trình duyệt hiện đại. Để tương thích với hệ thống cũ, hãy dùng [PDF sang JPG](./pdf-to-jpg). +- Chất lượng 80-85% thường không thể phân biệt với bản gốc trên màn hình mà vẫn giữ dung lượng nhỏ. + +## Công cụ liên quan + +- [PDF sang JPG](./pdf-to-jpg) +- [PDF sang PNG](./pdf-to-png) +- [PDF sang BMP](./pdf-to-bmp) diff --git a/docs/vi/tools/pdf-to-word.md b/docs/vi/tools/pdf-to-word.md new file mode 100644 index 00000000..c9857d7e --- /dev/null +++ b/docs/vi/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF sang Word +description: Chuyển đổi tệp PDF thành tài liệu Word (DOCX) có thể chỉnh sửa. Hỗ trợ chuyển đổi hàng loạt nhiều PDF cùng lúc. +--- + +# PDF sang Word + +Chuyển tệp PDF thành tài liệu Word (`.docx`) có thể chỉnh sửa. Công cụ dùng PyMuPDF để dựng lại nội dung tài liệu, giữ nguyên văn bản, định dạng cơ bản và bố cục. Hỗ trợ chuyển đổi đơn lẻ và hàng loạt. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. Bạn có thể thêm tệp hoặc xóa từng tệp khỏi danh sách. +2. Nhấp **Chuyển đổi** để bắt đầu xử lý. +3. Một tệp được tải xuống dưới dạng `filename.docx`. Nhiều tệp được đóng gói thành `converted-documents.zip`. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Mỗi PDF được chuyển sang DOCX bằng engine chuyển đổi tích hợp của PyMuPDF. + +## Định dạng đầu ra + +- **Một tệp**: `filename.docx` +- **Nhiều tệp**: `converted-documents.zip` chứa một tệp `.docx` cho mỗi PDF đầu vào. + +## Trường hợp sử dụng + +- Chỉnh sửa văn bản trong PDF bạn nhận được và cần sửa đổi. +- Chuyển báo cáo PDF lưu trữ sang định dạng mà đồng nghiệp có thể chỉnh sửa trong Microsoft Word hoặc Google Docs. +- Đưa nội dung từ hợp đồng hoặc đề xuất PDF vào Word để chỉnh sửa có theo dõi. +- Di chuyển tài liệu PDF cũ sang định dạng có thể chỉnh sửa. + +## Mẹo + +- Bố cục phức tạp với văn bản nhiều cột, biểu mẫu nhúng hoặc nhiều đồ họa có thể không chuyển đổi hoàn hảo. Hãy xem lại đầu ra và chỉnh định dạng trong trình soạn thảo văn bản của bạn. +- PDF quét (chỉ có ảnh) sẽ tạo ra tệp DOCX trống hoặc rất ít nội dung. Hãy chạy chúng qua OCR trước để thêm lớp văn bản. +- Chế độ hàng loạt hiệu quả để chuyển cả thư mục PDF: tải lên tất cả cùng lúc. + +## Công cụ liên quan + +- [PDF sang Văn bản](./pdf-to-text) +- [PDF sang Markdown](./pdf-to-markdown) +- [Trình xây dựng quy trình PDF](./pdf-workflow) diff --git a/docs/vi/tools/pdf-to-zip.md b/docs/vi/tools/pdf-to-zip.md new file mode 100644 index 00000000..a97a29de --- /dev/null +++ b/docs/vi/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF sang ZIP +description: Đóng gói nhiều tệp PDF thành một kho ZIP duy nhất để dễ chia sẻ và lưu trữ. +--- + +# PDF sang ZIP + +Gói nhiều tệp PDF thành một kho ZIP duy nhất. Đây là công cụ đóng gói đơn giản, không chuyển đổi, nén hay sửa đổi bản thân các PDF. + +## Cách hoạt động + +1. Tải lên nhiều tệp PDF bằng vùng thả. +2. Xem lại danh sách tệp. Xóa những tệp bạn không muốn đưa vào. +3. Nhấp nút xử lý. +4. Kho ZIP chứa tất cả PDF đã tải lên được tải xuống ngay lập tức. + +## Tính năng + +- Nhận số lượng tệp PDF bất kỳ +- Xóa từng tệp trước khi tạo kho +- Giữ nguyên tên tệp gốc bên trong ZIP +- Không sửa đổi nội dung PDF, các tệp được đóng gói nguyên trạng +- Hiển thị tên và dung lượng của từng PDF đã tải lên + +## Trường hợp sử dụng + +- Gói một bộ hóa đơn hoặc biên lai để đính kèm email +- Đóng gói sản phẩm bàn giao của dự án (nhiều báo cáo PDF) để chuyển giao +- Tạo một tệp tải xuống duy nhất cho tập hợp biểu mẫu hoặc mẫu +- Lưu trữ một loạt tài liệu vào một tệp nén + +## Mẹo + +- Tệp ZIP dùng tên tệp PDF gốc. Nếu có các tệp trùng tên, hãy đổi tên trước khi tải lên để tránh xung đột. +- Công cụ này không nén bản thân các PDF. Để giảm dung lượng tệp, hãy chạy chúng qua Nén PDF trước, rồi đóng gói bằng công cụ này. + +## Công cụ liên quan + +- [Gộp PDF](./merge-pdf) +- [Chia PDF](./split-pdf) +- [Nén PDF](./compress-pdf) diff --git a/docs/vi/tools/pdf-workflow.md b/docs/vi/tools/pdf-workflow.md new file mode 100644 index 00000000..ccd11e7f --- /dev/null +++ b/docs/vi/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: Trình xây dựng quy trình PDF +description: Xây dựng quy trình xử lý PDF tùy chỉnh một cách trực quan bằng cách nối các nút trên canvas. Kết hợp các thao tác như gộp, nén, watermark và xuất. +--- + +# Trình xây dựng quy trình PDF + +Trình xây dựng quy trình cho phép bạn nối nhiều thao tác PDF thành một quy trình tự động duy nhất. Thay vì chạy từng công cụ một, bạn nối một đồ thị trực quan gồm các nút (đầu vào, xử lý, đầu ra) và thực thi tất cả chỉ với một cú nhấp. Tệp của bạn không bao giờ rời khỏi trình duyệt. + +## Cách hoạt động + +Giao diện chia thành ba bảng: **hộp công cụ nút** ở bên trái, **canvas** ở giữa và **bảng cài đặt** ở bên phải xuất hiện khi bạn chọn một nút. + +1. **Thêm nút** bằng cách nhấp vào chúng ở thanh bên trái, hoặc kéo trực tiếp lên canvas. Dùng thanh tìm kiếm ở đầu hộp công cụ để lọc theo tên. +2. **Nối các nút** bằng cách kéo từ ổ cắm đầu ra (cuối nút) tới ổ cắm đầu vào (đầu nút khác). Kết nối chạy từ trên xuống dưới. +3. **Cấu hình cài đặt** bằng cách nhấp vào một nút để mở bảng cài đặt ở bên phải. Mỗi loại nút có tùy chọn riêng (phạm vi trang, thanh trượt chất lượng, mật khẩu, v.v.). +4. **Chạy quy trình** bằng cách nhấp nút **Chạy** trên thanh công cụ. Engine thực thi các nút theo thứ tự tô-pô, xử lý lần lượt từng nút. Thanh trạng thái ở dưới cùng theo dõi tiến trình. +5. **Tải xuống kết quả**: nút Tải xuống cuối cùng lưu PDF kết quả (hoặc ZIP nếu tạo ra nhiều tệp). + +## Các nhóm nút + +Các nút được tổ chức thành sáu nhóm, mỗi nhóm có màu riêng trên canvas: + +- **Đầu vào** (xanh dương): Nhập PDF, Đầu vào hình ảnh, Word/Excel/PowerPoint sang PDF và hơn 15 bộ chuyển đổi định dạng khác đưa tệp vào quy trình. +- **Chỉnh sửa & Chú thích** (chàm): Cắt PDF, PDF sang thang xám, Đảo ngược màu, Thêm Watermark, Số trang, Đầu trang & Chân trang, Hiệu ứng máy quét, Điều chỉnh màu sắc, Màu nền, Xóa trang trống, Xóa ghi chú. +- **Sắp xếp & Quản lý** (tím): Gộp PDF, Chia PDF, Trích xuất trang, Xoay PDF, Xóa trang, Đảo ngược trang, Thêm trang trống, Chia trang, N-Up PDF, Sửa kích thước trang, Kết hợp thành một trang, Sách nhỏ PDF, Chia PDF thành poster, Chỉnh sửa Metadata, Mục lục, OCR PDF. +- **Tối ưu & Sửa chữa** (hổ phách): Nén PDF, Raster hóa PDF, Tuyến tính hóa PDF, Chỉnh nghiêng PDF, PDF sang PDF/A, Phông chữ thành đường viền, Sửa chữa PDF. +- **Bảo mật PDF** (hồng): Mã hóa, Giải mã, Làm sạch PDF, Làm phẳng PDF, Ký số, Che nội dung. +- **Đầu ra** (xanh mòng két): Tải xuống (tự động nhận biết một PDF hay ZIP), PDF sang hình ảnh, PDF sang văn bản, PDF sang DOCX, PDF sang XLSX, PDF sang CSV, PDF sang SVG, PDF sang Markdown, Trích xuất hình ảnh. + +## Lưu và tải quy trình + +Thanh công cụ cung cấp bốn tùy chọn lưu trữ: + +- **Lưu**: lưu quy trình hiện tại thành mẫu có tên trong bộ nhớ cục bộ của trình duyệt. Bạn có thể lưu nhiều mẫu. +- **Tải**: mở hộp thoại liệt kê tất cả mẫu đã lưu. Nhấp Tải để khôi phục một mẫu, hoặc xóa những mẫu bạn không còn cần. +- **Xuất**: tải quy trình xuống dưới dạng tệp `.json` để bạn chia sẻ hoặc sao lưu. +- **Nhập**: tải tệp quy trình `.json` từ ổ đĩa, khôi phục toàn bộ nút, vị trí và kết nối. + +Các mẫu được giữ lại qua các phiên trong bộ nhớ cục bộ. Tệp JSON đã xuất có thể chuyển giữa các trình duyệt và máy. + +## Mô hình thực thi + +Engine xây dựng đồ thị phụ thuộc từ các kết nối của bạn và thực thi các nút theo thứ tự tô-pô. Nếu một nút thất bại, quá trình thực thi dừng lại và nút lỗi được đánh dấu màu đỏ. Một vài quy tắc cần nhớ: + +- Mọi quy trình cần ít nhất một nút **Đầu vào** và một nút **Đầu ra**. +- Engine phát hiện phụ thuộc vòng và chặn thực thi kèm thông báo lỗi. +- Nút **Mã hóa** phải là bước xử lý cuối cùng trước nút đầu ra. Đặt nó sớm hơn sẽ gây cảnh báo xác thực vì các nút phía sau không thể xử lý dữ liệu đã mã hóa. +- PDF được bảo vệ bằng mật khẩu sẽ yêu cầu nhập mật khẩu trong lúc thực thi. +- Hỗ trợ đầu vào nhiều PDF: nút Gộp PDF có thể kết hợp chúng, hoặc các nút xử lý hàng loạt sẽ xử lý từng PDF riêng. + +## Các loại ổ cắm + +Kết nối dùng ổ cắm có kiểu để ngăn nối sai: + +- **PDF** (chàm): một tài liệu PDF. +- **MultiPDF** (hổ phách): nhiều tài liệu PDF được gộp lại. +- **Image** (xanh lá): một blob hình ảnh. + +## Tùy chọn + +Mỗi nút có cấu hình riêng, truy cập qua bảng cài đặt bên phải. Một số mẫu thường gặp: + +- **Phạm vi trang** ở các nút Chia PDF, Trích xuất trang, Xóa trang +- **Thanh trượt chất lượng** ở các nút đầu ra chuyển đổi hình ảnh +- **Trường mật khẩu** ở các nút Mã hóa và Giải mã +- **Ô nhập văn bản** cho Thêm Watermark, Đầu trang & Chân trang, Chỉnh sửa Metadata +- **Góc xoay** ở nút Xoay PDF +- **Mức nén** ở nút Nén PDF +- **Chọn ngôn ngữ OCR** ở nút OCR PDF + +## Trường hợp sử dụng + +- **Quy trình xử lý hóa đơn**: Nhập PDF -> OCR PDF -> Trích xuất bảng PDF -> Tải xuống dưới dạng CSV. +- **Chuẩn hóa báo cáo**: Word sang PDF -> Sửa kích thước trang -> Số trang -> Thêm Watermark -> Nén PDF -> Tải xuống. +- **Chuẩn bị lưu trữ**: Nhập PDF -> Sửa chữa PDF -> Làm phẳng PDF -> Làm sạch PDF -> PDF sang PDF/A -> Tải xuống. +- **Trích xuất hình ảnh hàng loạt**: Nhập PDF (nhiều tệp) -> Trích xuất hình ảnh -> Tải xuống ZIP. +- **Sách nhỏ sẵn sàng in**: Nhập PDF -> Sách nhỏ PDF -> Cắt PDF -> Nén PDF -> Tải xuống. +- **Phân phối an toàn**: Nhập PDF -> Che nội dung -> Xóa ghi chú -> Mã hóa -> Tải xuống. + +## Mẹo + +- Dùng **Delete** hoặc **Backspace** để xóa nút đang chọn khỏi canvas. +- Nhấp nút **X** trên thanh trạng thái của nút để xóa nó trực tiếp. +- Kéo canvas bằng cách nhấp và kéo trên vùng trống. Con trỏ đổi thành biểu tượng bàn tay nắm khi kéo. +- Trên di động, dùng nút **+** trên thanh công cụ để bật tắt hộp công cụ nút. +- Nếu quy trình tạo ra nhiều tệp đầu ra, nút Tải xuống tự động gói chúng thành ZIP. +- Hãy bắt đầu đơn giản: xây dựng và thử quy trình hai nút trước khi thêm độ phức tạp. + +## Công cụ liên quan + +- [PDF sang Văn bản](./pdf-to-text) +- [PDF sang Excel](./pdf-to-excel) +- [Trích xuất hình ảnh](./extract-images) +- [PDF sang Markdown](./pdf-to-markdown) diff --git a/docs/vi/tools/png-to-pdf.md b/docs/vi/tools/png-to-pdf.md new file mode 100644 index 00000000..9b381113 --- /dev/null +++ b/docs/vi/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG sang PDF +description: Chuyển một hoặc nhiều ảnh PNG thành tài liệu PDF với chất lượng có thể điều chỉnh, hoàn toàn trong trình duyệt của bạn. +--- + +# PNG sang PDF + +Chuyển ảnh PNG sang PDF mà vẫn giữ nguyên độ phân giải gốc. Mỗi PNG trở thành một trang riêng, có kích thước khớp với kích thước ảnh gốc. Độ trong suốt được xử lý tự động. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :----------- | +| PNG | `.png` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp PNG. Bạn có thể chọn nhiều tệp cùng lúc. +2. Quản lý danh sách tệp: xóa tệp không cần hoặc thêm tệp. +3. Chọn mức **Chất lượng PDF** từ danh sách thả xuống. +4. Nhấp **Chuyển đổi sang PDF**. Đầu ra được tải xuống với tên `from_jpgs.pdf`. + +Công cụ dùng pdf-lib để nhúng trực tiếp từng ảnh. Nếu một PNG không thể nhúng gốc (ví dụ do hồ sơ màu bất thường), công cụ sẽ chuyển sang kết xuất lại qua canvas dưới dạng JPEG. + +## Tùy chọn + +**Chất lượng PDF** điều khiển mức nén áp dụng trước khi nhúng: + +- **Chất lượng cao**: nén tối thiểu, dung lượng lớn nhất. +- **Chất lượng trung bình** (mặc định): cân bằng tốt giữa dung lượng và độ rõ nét. +- **Chất lượng thấp**: nén tối đa, đầu ra nhỏ nhất. + +## Trường hợp sử dụng + +- Chuyển ảnh chụp màn hình thành PDF nhiều trang cho báo cáo lỗi hoặc tài liệu +- Đóng gói các bản xuất thiết kế UI thành một tệp để xem xét +- Biến bản xuất sơ đồ (draw.io, Excalidraw) thành PDF có thể chia sẻ +- Tập hợp một bộ ảnh biểu đồ thành báo cáo + +## Mẹo + +- PNG có độ trong suốt sẽ có nền trắng trong PDF. Nếu cần nền khác, hãy chỉnh sửa ảnh trước. +- Với ảnh chụp màn hình và sơ đồ có cạnh sắc nét và văn bản, chất lượng Cao tránh được lỗi nén JPEG. Chất lượng Trung bình hoặc Thấp có thể chuyển sang JPEG nội bộ. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [JPG sang PDF](./jpg-to-pdf) +- [SVG sang PDF](./svg-to-pdf) diff --git a/docs/vi/tools/posterize-pdf.md b/docs/vi/tools/posterize-pdf.md new file mode 100644 index 00000000..25f9bbc0 --- /dev/null +++ b/docs/vi/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Chia PDF thành poster +description: Chia các trang PDF thành lưới các trang nhỏ hơn để in khổ lớn trên nhiều tờ giấy. +--- + +# Chia PDF thành poster + +Chia mỗi trang của PDF thành một lưới các trang con nhỏ hơn. Đây là công cụ dùng để in một trang trên nhiều tờ giấy, sau đó ghép các tờ lại với nhau thành áp phích hoặc băng rôn cỡ lớn. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Đặt số **hàng** và **cột** để xác định lưới (ví dụ: 2 hàng x 2 cột chia mỗi trang thành 4 trang con). +3. Tùy chọn chỉ định phạm vi trang để giới hạn những trang được posterize. +4. Canvas xem trước hiển thị lớp phủ lưới trên trang hiện tại để bạn hình dung các đường cắt. +5. Chuyển qua lại giữa các trang để kiểm tra lớp phủ trên từng trang. +6. Nhấp vào nút xử lý. Mỗi ô lưới trở thành một trang riêng trong PDF đầu ra. + +## Tính năng + +- Số hàng và số cột có thể cấu hình, cho kích thước lưới linh hoạt +- Xem trước trực tiếp với lớp phủ lưới cho thấy chính xác nơi các trang sẽ được chia +- Bộ lọc phạm vi trang để chỉ posterize các trang cụ thể +- Điều hướng từng trang trong phần xem trước +- Ảnh chụp trang được lưu đệm để chuyển trang xem trước nhanh +- Các đường lưới đỏ nét đứt đánh dấu rõ ranh giới cắt + +## Tùy chọn + +| Tùy chọn | Mô tả | +| ----------------- | ------------------------------------------------- | +| **Hàng** | Số phần chia ngang (mặc định: 1) | +| **Cột** | Số phần chia dọc (mặc định: 1) | +| **Phạm vi trang** | Các trang cần posterize (để trống = tất cả trang) | + +## Trường hợp sử dụng + +- In PDF cỡ áp phích trên các tờ A4 hoặc Letter tiêu chuẩn để ghép lên tường +- Tạo băng rôn lớn từ một thiết kế PDF một trang +- Chia các bản vẽ kỹ thuật quá khổ thành các mảnh có thể in +- In khổ lớn mà không cần máy in khổ rộng + +## Mẹo + +- Lưới 2x2 biến một trang thành 4 trang. Lưới 3x3 biến một trang thành 9. Hãy lập kế hoạch lưới dựa trên kích thước bạn muốn cho thành phẩm sau khi ghép. +- Lớp phủ xem trước giúp bạn kiểm tra nội dung quan trọng không nằm trên đường cắt. Hãy điều chỉnh số hàng/cột nếu cần. +- Để thực hiện thao tác ngược lại (xếp nhiều trang lên một tờ), hãy dùng [N-Up PDF](./n-up-pdf). + +## Công cụ liên quan + +- [N-Up PDF](./n-up-pdf) +- [Chia trang](./divide-pages) +- [Chia PDF](./split-pdf) diff --git a/docs/vi/tools/powerpoint-to-pdf.md b/docs/vi/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..00ac5b04 --- /dev/null +++ b/docs/vi/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint sang PDF +description: Chuyển đổi bản trình bày PowerPoint (PPT, PPTX) và tệp ODP sang PDF với định dạng slide được giữ nguyên. +--- + +# PowerPoint sang PDF + +Chuyển đổi tệp bản trình bày sang PDF. Mỗi slide trở thành một trang trong tài liệu đầu ra, với văn bản, hình ảnh, hình khối và hiệu ứng chuyển cảnh được hiển thị bằng engine LibreOffice chạy trong trình duyệt. Hỗ trợ cả định dạng PowerPoint hiện đại lẫn cũ, cùng định dạng OpenDocument Presentation. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :------------------------ | :----------- | +| PowerPoint (hiện đại) | `.pptx` | +| PowerPoint (cũ) | `.ppt` | +| OpenDocument Presentation | `.odp` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp bản trình bày của bạn. +2. Xem lại danh sách tệp. Thêm hoặc xóa tệp nếu cần. +3. Nhấp **Chuyển đổi sang PDF**. Engine LibreOffice được tải ở lần dùng đầu tiên, sau đó chuyển đổi từng tệp. +4. Một tệp duy nhất được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được đóng gói vào `powerpoint-converted.zip`. + +## Tùy chọn + +Công cụ này không có cài đặt bổ sung. Các slide được hiển thị ở kích thước gốc. + +## Đầu ra + +| Số tệp đầu vào | Đầu ra | +| :------------- | :------------------------------------------------------------ | +| 1 tệp | Tải xuống một PDF (tên tệp gốc với phần mở rộng `.pdf`) | +| 2 tệp trở lên | Tệp ZIP (`powerpoint-converted.zip`) chứa một PDF cho mỗi tệp | + +## Trường hợp sử dụng + +- Chuyển bản trình bày sang PDF trước khi chia sẻ với khán giả có thể không có PowerPoint +- Tạo bản tài liệu in được từ bộ slide cho hội nghị hoặc hội thảo +- Lưu trữ bản trình bày ở định dạng hiển thị giống hệt trên mọi thiết bị +- Chuyển đổi hàng loạt thư viện bản trình bày ODP từ LibreOffice Impress sang PDF +- Tạo phiên bản PDF của bộ slide giới thiệu để đính kèm email + +## Mẹo + +- Hiệu ứng động và chuyển cảnh của slide không được thể hiện trong PDF. Mỗi slide được ghi lại thành một trang tĩnh. +- Video nhúng sẽ không xuất hiện trong đầu ra. Hãy thay bằng ảnh chụp màn hình hoặc hình giữ chỗ nếu cần. +- Ghi chú của người trình bày không có trong bản xuất PDF mặc định. Nếu cần ghi chú, hãy cân nhắc xuất từ chế độ xem "Print Notes" gốc của PowerPoint trước. +- Engine LibreOffice được lưu đệm sau lần tải đầu, nên chuyển đổi bản trình bày thứ hai trong cùng phiên sẽ nhanh hơn nhiều. + +## Công cụ liên quan + +- [Word sang PDF](./word-to-pdf) +- [Excel sang PDF](./excel-to-pdf) +- [Hình ảnh sang PDF](./image-to-pdf) diff --git a/docs/vi/tools/prepare-pdf-for-ai.md b/docs/vi/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..df2137de --- /dev/null +++ b/docs/vi/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: Chuẩn bị PDF cho AI +description: Trích xuất nội dung PDF thành JSON có cấu trúc, tối ưu cho LLM và các pipeline AI như LlamaIndex. Hỗ trợ xử lý hàng loạt. +--- + +# Chuẩn bị PDF cho AI + +Trích xuất nội dung từ các tệp PDF và cấu trúc hóa thành JSON, tối ưu để đưa vào các mô hình ngôn ngữ lớn (LLM) và các framework AI như LlamaIndex. Nội dung của từng trang được trích xuất và sắp xếp theo định dạng có cấu trúc, sẵn sàng cho pipeline RAG, chatbot hoặc hệ thống tìm kiếm ngữ nghĩa. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều PDF bằng cách nhấp vào vùng thả hoặc kéo tệp vào đó. +2. Nhấp **Trích xuất** để bắt đầu xử lý. +3. Một tệp được tải xuống dưới dạng `filename_llm.json`. Nhiều tệp tạo ra tệp nén `pdf-for-ai.zip`. + +Công cụ dùng tích hợp LlamaIndex của PyMuPDF để trích xuất nội dung theo từng trang kèm metadata, tạo ra đầu ra có thể nạp trực tiếp vào các framework AI. + +## Tùy chọn + +Công cụ này không có tùy chọn cấu hình. Tất cả các trang được trích xuất với đầy đủ văn bản và metadata. + +## Định dạng đầu ra + +- **Một tệp**: `filename_llm.json` +- **Nhiều tệp**: `pdf-for-ai.zip` chứa một tệp `_llm.json` cho mỗi PDF đầu vào. + +Đầu ra JSON tuân theo schema tài liệu của LlamaIndex với nội dung văn bản của từng trang và các trường metadata. + +## Trường hợp sử dụng + +- Chuẩn bị tài liệu PDF cho các pipeline retrieval-augmented generation (RAG). +- Xây dựng cơ sở tri thức có thể tìm kiếm từ kho PDF cho chatbot AI. +- Đưa các báo cáo PDF vào quy trình phân tích dựa trên LLM. +- Tiền xử lý bài báo nghiên cứu cho các hệ thống tìm kiếm ngữ nghĩa và hỏi đáp. +- Tạo dữ liệu huấn luyện có cấu trúc từ các bộ sưu tập tài liệu PDF. + +## Mẹo + +- Để trích xuất văn bản thuần không có định dạng dành riêng cho AI, hãy dùng [PDF sang Văn bản](./pdf-to-text). +- Để có đầu ra Markdown giữ nguyên tiêu đề và cấu trúc, hãy dùng [PDF sang Markdown](./pdf-to-markdown). +- PDF được quét sẽ cho đầu ra trống hoặc rất ít. Hãy chạy OCR trước để thêm lớp văn bản rồi mới trích xuất. + +## Công cụ liên quan + +- [PDF sang Văn bản](./pdf-to-text) +- [PDF sang Markdown](./pdf-to-markdown) +- [PDF sang JSON](./pdf-to-json) diff --git a/docs/vi/tools/protect-pdf.md b/docs/vi/tools/protect-pdf.md new file mode 100644 index 00000000..95828e52 --- /dev/null +++ b/docs/vi/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: Bảo vệ PDF +description: Bảo vệ tệp PDF bằng mật khẩu với mã hóa AES 256-bit. Đặt mật khẩu người dùng và chủ sở hữu cùng các hạn chế sử dụng có thể cấu hình. +--- + +# Bảo vệ PDF + +Khóa PDF của bạn bằng mật khẩu để chỉ những người được ủy quyền mới mở được. BentoPDF dùng mã hóa AES 256-bit, cùng tiêu chuẩn mà ngân hàng và cơ quan chính phủ sử dụng, và được áp dụng hoàn toàn trong trình duyệt của bạn thông qua QPDF. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Nhập **Mật khẩu người dùng** (bắt buộc). Đây là mật khẩu mọi người cần để mở tệp. +3. Tùy chọn nhập **Mật khẩu chủ sở hữu**. Khi được đặt, PDF sẽ có các hạn chế sử dụng ngăn việc in, chỉnh sửa, sao chép và ghi chú. +4. Nhấp **Mã hóa PDF**. +5. Tải xuống tệp đã mã hóa. + +## Các loại mật khẩu + +### Mật khẩu người dùng (bắt buộc) + +Mật khẩu người dùng là thứ người nhận nhập để mở PDF. Không có nó, tài liệu hoàn toàn không thể truy cập. Mọi PDF được mã hóa đều phải có một mật khẩu này. + +### Mật khẩu chủ sở hữu (tùy chọn) + +Mật khẩu chủ sở hữu kiểm soát những gì người dùng được ủy quyền có thể làm sau khi mở tệp. Khi bạn đặt một mật khẩu chủ sở hữu khác biệt, BentoPDF tự động áp dụng bộ hạn chế nghiêm ngặt nhất: + +- Tắt chỉnh sửa +- Tắt trích xuất/sao chép +- Tắt in +- Tắt ghi chú +- Tắt điền biểu mẫu +- Tắt lắp ráp tài liệu + +Nếu bạn để trống mật khẩu chủ sở hữu, PDF vẫn được mã hóa (vẫn cần mật khẩu người dùng để mở) nhưng không có hạn chế sử dụng sau khi mở. + +## Chi tiết mã hóa + +- **Thuật toán**: AES-256 (Advanced Encryption Standard 256-bit) +- **Độ dài khóa**: 256 bit +- **Tiêu chuẩn**: Mã hóa PDF 2.0 (triển khai của QPDF) + +Với công nghệ hiện nay, việc dò AES-256 bằng vét cạn là không khả thi về mặt tính toán. Độ bảo mật của PDF đã mã hóa phụ thuộc hoàn toàn vào độ mạnh của mật khẩu. + +## Trường hợp sử dụng + +- Bảo vệ các báo cáo tài chính mật trước khi gửi qua email +- Bảo mật tài liệu pháp lý chia sẻ với luật sư phía đối tác +- Thêm mật khẩu cho hồ sơ y tế hoặc thông tin nhận dạng cá nhân +- Phân phối nội dung trả phí (sách điện tử, báo cáo) có kiểm soát truy cập +- Tuân thủ các chính sách bảo vệ dữ liệu yêu cầu mã hóa khi lưu trữ + +## Mẹo + +- Dùng mật khẩu mạnh và duy nhất. Cụm mật khẩu từ 12 ký tự trở lên gồm chữ hoa, chữ thường, số và ký hiệu là lý tưởng. +- Chia sẻ mật khẩu qua một kênh riêng (điện thoại, tin nhắn), đừng bao giờ gửi cùng email với PDF. +- Nếu bạn chỉ cần hạn chế các hành động (không in, không sao chép) mà không yêu cầu mật khẩu để mở, hãy dùng công cụ Thay đổi quyền. + +## Công cụ liên quan + +- [Giải mã PDF](./unlock-pdf): gỡ mã hóa khi bạn biết mật khẩu +- [Thay đổi quyền](./change-permissions): sửa các hạn chế sử dụng cụ thể +- [Xóa hạn chế](./remove-restrictions): loại bỏ toàn bộ bảo mật khỏi PDF +- [Làm sạch PDF](./sanitize-pdf): xóa nội dung ẩn trước khi mã hóa diff --git a/docs/vi/tools/psd-to-pdf.md b/docs/vi/tools/psd-to-pdf.md new file mode 100644 index 00000000..91f33d5b --- /dev/null +++ b/docs/vi/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD sang PDF +description: Chuyển đổi tệp Photoshop (PSD) sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không cần phần mềm Adobe. +--- + +# PSD sang PDF + +Chuyển đổi tệp Adobe Photoshop PSD thành tài liệu PDF. PSD là định dạng gốc của Photoshop, và thông thường để mở nó cần phần mềm Adobe đắt tiền. Công cụ này hiển thị ảnh tổng hợp đã làm phẳng của tệp PSD thành một trang PDF với độ phân giải đầy đủ. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------------- | :----------- | :--------------------------------- | +| Adobe Photoshop | `.psd` | Hiển thị ảnh tổng hợp đã làm phẳng | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp PSD của bạn. Hỗ trợ nhiều tệp. +2. Xem lại danh sách tệp. Xóa tệp không muốn bằng biểu tượng thùng rác, hoặc dùng **Thêm tệp** để bổ sung. +3. Nhấp **Chuyển đổi sang PDF**. Engine PyMuPDF đọc tệp PSD và nhúng ảnh tổng hợp vào một trang PDF ở độ phân giải gốc. +4. Một tệp PSD tạo ra một PDF. Khi bạn tải lên nhiều tệp PSD, chúng được gộp thành một PDF nhiều trang duy nhất tên `psd_to_pdf.pdf`, mỗi PSD là một trang. + +## Tùy chọn + +Không cần cài đặt. Bộ chuyển đổi dùng dữ liệu ảnh đã làm phẳng từ tệp PSD. + +## Trường hợp sử dụng + +- Xem trước thiết kế Photoshop mà không cần mở Photoshop +- Gửi bản duyệt thiết kế cho khách hàng không có Adobe Creative Suite +- In tác phẩm độ phân giải cao từ tệp PSD +- Tạo hồ sơ năng lực PDF từ nhiều tệp thiết kế PSD, mỗi tệp trở thành một trang trong một tài liệu + +## Mẹo + +- Quá trình chuyển đổi hiển thị chế độ xem tổng hợp (đã làm phẳng) của PSD. Các layer riêng lẻ, layer điều chỉnh và hiệu ứng layer không được giữ lại như các thành phần riêng trong PDF. +- Nhiều tệp PSD được gộp thành một PDF nhiều trang thay vì các PDF riêng lẻ. Điều này hữu ích khi xây dựng hồ sơ năng lực hoặc lookbook. +- Tệp PSD có độ phân giải rất cao (tệp in 300+ DPI) sẽ tạo ra PDF lớn. Công cụ giữ nguyên toàn bộ độ phân giải. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [PNG sang PDF](./png-to-pdf) +- [VSD sang PDF](./vsd-to-pdf) diff --git a/docs/vi/tools/pub-to-pdf.md b/docs/vi/tools/pub-to-pdf.md new file mode 100644 index 00000000..40744b8f --- /dev/null +++ b/docs/vi/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB sang PDF +description: Chuyển đổi tệp Microsoft Publisher (PUB) sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không cần cài phần mềm. +--- + +# PUB sang PDF + +Chuyển đổi tệp Microsoft Publisher sang PDF. Publisher là công cụ dàn trang đi kèm một số phiên bản Microsoft Office, nhưng hầu hết mọi người không cài đặt nó. Công cụ này cho phép bất kỳ ai chuyển tệp PUB sang PDF trực tiếp trong trình duyệt, không cần phần mềm Microsoft. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :------------------ | :----------- | :----------------- | +| Microsoft Publisher | `.pub` | Tài liệu dàn trang | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp PUB của bạn. Có thể tải lên nhiều tệp cùng lúc. +2. Xem lại danh sách tệp. Xóa tệp không muốn bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để bổ sung. +3. Nhấp **Chuyển đổi sang PDF**. Một engine dựa trên LibreOffice được tải trong trình duyệt và chuyển đổi từng tệp PUB, giữ nguyên bố cục, hình ảnh và hộp văn bản. +4. Một tệp được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được cung cấp trong tệp ZIP tên `pub-to-pdf.zip`. + +## Tùy chọn + +Không cần cấu hình thêm. Bộ chuyển đổi tự động xử lý engine bố cục PUB. + +## Trường hợp sử dụng + +- Mở tờ rơi hoặc bản tin PUB từ khách hàng mà không cần mua Microsoft Publisher +- Chuyển đổi bản tin nhà thờ, chương trình sự kiện hoặc bản tin trường học tạo bằng Publisher +- Lưu trữ tài liệu tiếp thị từ Publisher ở định dạng ai cũng truy cập được +- In tệp PUB trên hệ thống không cài Publisher + +## Mẹo + +- Các bố cục Publisher phức tạp với hộp văn bản xếp chồng và định vị chính xác có thể hơi lệch khi chuyển đổi. Hãy kiểm tra đầu ra nếu vị trí chính xác là quan trọng. +- Engine LibreOffice chỉ khởi tạo một lần mỗi phiên. Lần chuyển đổi đầu tiên mất nhiều thời gian hơn, các lần sau nhanh hơn. +- Để chuyển đổi tệp Publisher trung thực nhất, hãy đảm bảo các phông chữ tùy chỉnh dùng trong bản gốc là phông chữ hệ thống tiêu chuẩn. + +## Công cụ liên quan + +- [VSD sang PDF](./vsd-to-pdf) +- [ODP sang PDF](./odp-to-pdf) diff --git a/docs/vi/tools/rasterize-pdf.md b/docs/vi/tools/rasterize-pdf.md new file mode 100644 index 00000000..4fe71937 --- /dev/null +++ b/docs/vi/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Raster hóa PDF +description: Chuyển các trang PDF thành PDF dạng hình ảnh. Làm phẳng mọi layer, loại bỏ văn bản có thể chọn, và kiểm soát DPI và định dạng ảnh. +--- + +# Raster hóa PDF + +Rasterize chuyển mỗi trang của PDF thành một hình ảnh rồi ghép các hình ảnh đó lại thành PDF. Kết quả trông giống hệt bản gốc nhưng không còn văn bản có thể chọn, không có phần tử tương tác và không có layer chỉnh sửa được. Về cơ bản nó là một bản photocopy chất lượng cao. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. +2. Đặt **DPI** (độ phân giải) cho đầu ra rasterize. +3. Chọn **Định dạng ảnh**: PNG cho chất lượng không mất dữ liệu hoặc JPEG cho tệp nhỏ hơn. +4. Tùy chọn chọn **Chuyển sang thang xám**. +5. Nhấp **Raster hóa PDF**. Nhiều tệp được tải xuống dưới dạng ZIP. + +## Tùy chọn + +| Cài đặt | Giá trị | Mặc định | +| ----------------- | --------------------------------------- | -------- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **Định dạng ảnh** | PNG (không mất dữ liệu), JPEG (nhỏ hơn) | PNG | +| **Thang xám** | Bật/Tắt | Tắt | + +## Hướng dẫn chọn DPI + +- **72**: Chỉ xem trên màn hình, kích thước tệp nhỏ nhất +- **150**: Cân bằng tốt cho mục đích chung +- **200**: Văn bản sắc nét hơn, kích thước tệp vừa phải +- **300**: Đầu ra chất lượng in +- **600**: Lưu trữ chất lượng cao hoặc in chuyên nghiệp + +## Trường hợp sử dụng + +- Ngăn việc trích xuất văn bản từ tài liệu mật trước khi chia sẻ +- Loại bỏ vấn đề phụ thuộc phông chữ bằng cách chuyển văn bản thành điểm ảnh +- Tạo phiên bản "phẳng" của PDF có layer hoặc độ trong suốt phức tạp hiển thị khác nhau giữa các trình xem +- Chuẩn bị PDF cho hệ thống chỉ nhận đầu vào dạng hình ảnh +- Loại bỏ nội dung ẩn (như thay đổi được theo dõi hoặc dữ liệu biểu mẫu) bằng cách rút PDF về thuần hình ảnh + +## Mẹo + +- 150 DPI với PNG là mặc định vững chắc. Chỉ tăng cao hơn nếu bạn cần đầu ra để in hoặc cần phóng to các chi tiết nhỏ. +- JPEG cho tệp nhỏ hơn rõ rệt nhưng gây ra nhiễu nén ở các cạnh văn bản sắc nét. +- Rasterize không thể hoàn tác, hãy giữ PDF gốc nếu sau này bạn có thể cần văn bản chỉnh sửa được. + +## Công cụ liên quan + +- [Nén PDF](./compress-pdf): giảm kích thước tệp PDF đã rasterize +- [Chỉnh nghiêng PDF](./deskew-pdf): làm thẳng các trang trước khi rasterize tài liệu quét +- [Phông chữ thành đường viền](./font-to-outline): chuyển phông chữ thành đường vector nếu bạn muốn giữ khả năng co giãn +- [Làm phẳng PDF](./flatten-pdf): làm phẳng biểu mẫu mà không chuyển thành hình ảnh diff --git a/docs/vi/tools/remove-annotations.md b/docs/vi/tools/remove-annotations.md new file mode 100644 index 00000000..fc13650e --- /dev/null +++ b/docs/vi/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: Xóa ghi chú +description: Loại bỏ mọi bình luận, đánh dấu, liên kết và các ghi chú khác khỏi PDF của bạn chỉ bằng một cú nhấp. +--- + +# Xóa ghi chú + +Làm sạch PDF bằng cách xóa mọi ghi chú (annotation): bình luận, đánh dấu, ghi chú dán, đánh dấu văn bản, liên kết, tem và mọi đối tượng ghi chú khác được nhúng trong tài liệu. Nội dung trang bên dưới (văn bản, hình ảnh, đồ họa) được giữ nguyên. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Công cụ phát hiện số trang của tài liệu và hiển thị thông tin tệp. +3. Nhấp **Xóa ghi chú** để xử lý. +4. PDF đã làm sạch được tải xuống tự động với mọi ghi chú đã bị loại bỏ. + +## Tính năng + +- Xóa mọi loại ghi chú: bình luận, đánh dấu, gạch chân, gạch ngang, ghi chú dán, tem, liên kết và đánh dấu biểu mẫu +- Hoạt động trên mọi trang của tài liệu +- Giữ nguyên toàn bộ nội dung không phải ghi chú (văn bản, hình ảnh, đồ họa vector, trường biểu mẫu) +- Hiển thị số trang và kích thước tệp trước khi xử lý + +## Trường hợp sử dụng + +- Làm sạch tài liệu trước khi phát hành cuối cùng sau một vòng duyệt có nhiều người thêm bình luận +- Xóa đánh dấu và ghi chú dán khỏi tài liệu học tập được chia sẻ +- Loại bỏ ghi chú liên kết khỏi tài liệu trước khi lưu trữ +- Chuẩn bị phiên bản "sạch" của tài liệu pháp lý đã được ghi chú dày đặc trong quá trình đàm phán +- Xóa bình luận của người duyệt khỏi bản thảo trước khi gửi đi in + +## Mẹo + +- Công cụ này xóa ghi chú ở cấp cấu trúc PDF, nên kết quả vẫn giữ văn bản có thể chọn và chất lượng gốc, không liên quan đến rasterize. +- Nếu bạn chỉ muốn xóa một số ghi chú cụ thể thay vì tất cả, hãy dùng [Trình chỉnh sửa PDF](./edit-pdf) để xóa có chọn lọc từng ghi chú. +- Ghi chú trong PDF đã làm phẳng (khi ghi chú đã được gộp vào nội dung trang) không thể xóa vì chúng không còn là các đối tượng riêng biệt. + +## Công cụ liên quan + +- [Trình chỉnh sửa PDF](./edit-pdf) +- [Thêm Watermark](./add-watermark) +- [Ký PDF](./sign-pdf) diff --git a/docs/vi/tools/remove-blank-pages.md b/docs/vi/tools/remove-blank-pages.md new file mode 100644 index 00000000..adf31265 --- /dev/null +++ b/docs/vi/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: Xóa trang trống +description: Tự động phát hiện và xóa các trang trống hoặc gần như trống khỏi PDF với độ nhạy có thể điều chỉnh. +--- + +# Xóa trang trống + +Quét PDF để tìm các trang trống hoặc gần như trống và xóa chúng tự động. Công cụ hiển thị từng trang và phân tích nội dung điểm ảnh để xác định trang có trống hay không, sau đó cho phép bạn xác nhận những trang cần xóa trước khi xử lý. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Điều chỉnh thanh trượt **Độ nhạy** để kiểm soát mức độ nghiêm ngặt khi định nghĩa "trống". +3. Nhấp **Phát hiện trang trống** để quét tài liệu. +4. Công cụ hiển thị hình thu nhỏ của các trang trống được phát hiện để bạn xem lại. +5. Xác nhận lựa chọn và tải xuống PDF đã làm sạch với các trang trống đã bị xóa. + +## Tùy chọn + +- **Độ nhạy**: Thanh trượt từ 0% đến 100% (mặc định 80%). Giá trị cao hơn nghiêm ngặt hơn, chỉ đánh dấu các trang hoàn toàn hoặc gần như trắng. Giá trị thấp hơn dễ dãi hơn, bắt cả các trang có nội dung tối thiểu như một dấu chấm hoặc watermark mờ. + +## Tính năng + +- Phân tích từng trang ở mức điểm ảnh để phát hiện nội dung trống +- Thanh trượt độ nhạy có thể điều chỉnh để tinh chỉnh việc phát hiện +- Xem trước hình thu nhỏ của các trang trống được phát hiện để kiểm tra thủ công +- Giữ nguyên hoàn toàn mọi trang không trống +- Xử lý tài liệu có kích thước hoặc số trang bất kỳ +- Hiển thị tiến trình trong khi quét + +## Trường hợp sử dụng + +- Làm sạch tài liệu quét mà máy quét đã ghi lại mặt sau trống của bản gốc một mặt +- Xóa các trang ngăn cách khỏi các lô tài liệu quét hàng loạt +- Loại bỏ các trang trống do hệ thống quản lý tài liệu chèn vào +- Làm sạch PDF xuất từ trình xử lý văn bản đôi khi có thêm trang trống ở cuối +- Giảm kích thước tệp bằng cách xóa các trang trống không cần thiết + +## Mẹo + +- Bắt đầu với độ nhạy mặc định 80% rồi điều chỉnh. Nếu công cụ bỏ sót các trang mà bạn thấy trống, hãy giảm độ nhạy. Nếu nó đánh dấu các trang có nội dung nhạt mà bạn muốn giữ, hãy tăng lên. +- Công cụ hiển thị từng trang để phân tích nội dung, nên thời gian xử lý tăng theo số trang. Với tài liệu rất lớn, hãy chờ một lát. +- Hãy xem lại các trang trống được phát hiện trong phần xem trước hình thu nhỏ trước khi xác nhận xóa. Các trang có đầu trang, chân trang hoặc watermark mờ có thể bị đánh dấu tùy theo cài đặt độ nhạy. + +## Công cụ liên quan + +- [Cắt PDF](./crop-pdf) +- [Trình chỉnh sửa PDF](./edit-pdf) +- [Số trang](./page-numbers) diff --git a/docs/vi/tools/remove-metadata.md b/docs/vi/tools/remove-metadata.md new file mode 100644 index 00000000..bbb3af78 --- /dev/null +++ b/docs/vi/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: Xóa Metadata +description: Loại bỏ toàn bộ metadata ẩn khỏi tệp PDF, gồm tác giả, tiêu đề, ngày tạo, producer, dữ liệu XMP và ID tài liệu. +--- + +# Xóa Metadata + +Mọi PDF đều mang metadata có thể tiết lộ ai đã tạo nó, đã dùng phần mềm nào, được sửa lần cuối khi nào, v.v. Công cụ này loại bỏ tất cả: info dictionary, luồng metadata XMP, ID tài liệu và dữ liệu riêng của ứng dụng, để lại một tài liệu sạch không còn dấu vết nguồn gốc. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Nhấp **Xóa Metadata**. +3. Tải xuống tệp đã làm sạch. + +Không có tùy chọn nào cần cấu hình. Công cụ được thiết kế để làm triệt để: nó xóa mọi thứ. + +## Những gì bị xóa + +- **Các trường info dictionary**: Title, Author, Subject, Keywords, Creator, Producer, ngày tạo, ngày sửa đổi +- **Luồng metadata XMP**: Khối metadata dựa trên XML lưu trong danh mục tài liệu +- **ID tài liệu**: Mã định danh duy nhất trong trailer của PDF có thể dùng để theo dõi tài liệu giữa các hệ thống +- **PieceInfo**: Metadata riêng của ứng dụng do các chương trình như Illustrator hoặc InDesign thêm vào + +## Những gì được giữ lại + +- Toàn bộ nội dung trang hiển thị (văn bản, hình ảnh, đồ họa) +- Trường biểu mẫu và ghi chú +- Bookmark và liên kết +- Chính cấu trúc tài liệu + +## Trường hợp sử dụng + +- Xóa tên và tổ chức của bạn khỏi tài liệu trước khi xuất bản ẩn danh +- Loại bỏ dấu thời gian tạo cho thấy tài liệu được chuẩn bị khi nào +- Làm sạch chuỗi producer cho biết bộ phần mềm PDF của bạn +- Chuẩn bị tài liệu cho các hồ sơ pháp quy yêu cầu PDF không có metadata +- Xóa dấu vết lịch sử chỉnh sửa trước khi chia sẻ tài liệu ra bên ngoài + +## Mẹo + +- Hãy dùng công cụ Xem Metadata trước để biết chính xác PDF của bạn chứa metadata nào trước khi xóa. +- Nếu bạn cần xóa metadata _và_ JavaScript, ghi chú và tệp nhúng, hãy dùng Làm sạch PDF để làm sạch triệt để hơn. +- Việc xóa metadata là vĩnh viễn. Hãy giữ bản gốc nếu sau này bạn có thể cần dữ liệu đó. + +## Công cụ liên quan + +- [Làm sạch PDF](./sanitize-pdf): xóa metadata cùng script, tệp đính kèm và nhiều thứ khác +- [Mã hóa PDF](./protect-pdf): bảo vệ PDF đã làm sạch bằng mật khẩu +- [Nén PDF](./compress-pdf): xóa metadata có thể giảm nhẹ kích thước tệp; hãy nén để tiết kiệm thêm diff --git a/docs/vi/tools/remove-restrictions.md b/docs/vi/tools/remove-restrictions.md new file mode 100644 index 00000000..48d7bbbf --- /dev/null +++ b/docs/vi/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: Xóa hạn chế +description: Gỡ bảo vệ bằng mật khẩu, hạn chế in, khóa chỉnh sửa và giới hạn sao chép khỏi tệp PDF. +--- + +# Xóa hạn chế + +PDF có thể mang hai loại mật khẩu: mật khẩu người dùng (cần để mở tệp) và mật khẩu chủ sở hữu (kiểm soát những gì bạn có thể làm với tệp). Công cụ này loại bỏ cả hai, cùng mọi hạn chế liên quan: khóa in, chỉnh sửa, sao chép và ghi chú. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Nếu PDF có mật khẩu chủ sở hữu, hãy nhập vào trường **Mật khẩu chủ sở hữu**. Để trống nếu PDF chỉ có hạn chế sử dụng mà không có mật khẩu. +3. Nhấp **Xóa hạn chế**. +4. Tải xuống PDF không còn hạn chế. + +Công cụ dùng các cờ `--decrypt` và `--remove-restrictions` của QPDF để tạo ra một bản sao sạch, không hạn chế. + +## Những gì bị xóa + +- Bảo vệ bằng mật khẩu (cả mật khẩu người dùng và chủ sở hữu) +- Hạn chế in +- Hạn chế chỉnh sửa +- Hạn chế sao chép văn bản và hình ảnh +- Hạn chế ghi chú và bình luận +- Mọi giới hạn bảo mật khác được mã hóa trong PDF + +## Trường hợp sử dụng + +- Mở khóa PDF của bạn nhưng mật khẩu đã đặt từ nhiều năm trước +- Gỡ hạn chế in khỏi tài liệu mà bạn có quyền truy cập hợp pháp +- Bật sao chép-dán trên tài liệu tham khảo để ghi chú +- Chuẩn bị PDF cho các công cụ hỗ trợ tiếp cận không xử lý được tài liệu bị hạn chế + +## Mẹo + +- Bạn phải biết mật khẩu chủ sở hữu nếu có đặt. Công cụ này không bẻ khóa hay dò mật khẩu bằng vét cạn. +- Nếu bạn cần giữ tệp được mã hóa nhưng thay đổi một số quyền cụ thể, hãy dùng công cụ Thay đổi quyền. +- Tệp đầu ra hoàn toàn không có mã hóa: bất kỳ ai nhận được đều có thể mở tự do. + +## Công cụ liên quan + +- [Giải mã PDF](./unlock-pdf): mở khóa PDF khi bạn biết mật khẩu người dùng +- [Mã hóa PDF](./protect-pdf): áp dụng lại mã hóa với cài đặt mới +- [Thay đổi quyền](./change-permissions): sửa có chọn lọc những hành động được phép diff --git a/docs/vi/tools/repair-pdf.md b/docs/vi/tools/repair-pdf.md new file mode 100644 index 00000000..6ed6a27d --- /dev/null +++ b/docs/vi/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: Sửa chữa PDF +description: Khôi phục dữ liệu từ tệp PDF bị hỏng hoặc hư hại bằng engine sửa chữa của QPDF. Hỗ trợ xử lý hàng loạt. +--- + +# Sửa chữa PDF + +Khi PDF không chịu mở, hiển thị nội dung lỗi hoặc gây lỗi trong trình xem của bạn, công cụ này sẽ cố gắng dựng lại cấu trúc nội bộ của nó. Công cụ dùng engine sửa chữa của QPDF, có thể khôi phục dữ liệu từ nhiều loại hỏng hóc: bảng tham chiếu chéo bị hỏng, luồng bị cắt cụt, tham chiếu đối tượng không hợp lệ, v.v. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF bị hỏng. +2. Nhấp **Sửa chữa PDF**. +3. Một tệp đã sửa được tải xuống trực tiếp. Nhiều tệp tạo ra tệp nén ZIP. + +Công cụ chuyển từng tệp qua QPDF với cờ `--decrypt`, buộc QPDF đọc và ghi lại toàn bộ cấu trúc PDF, sửa các vấn đề có thể khôi phục trong quá trình đó. + +## Tính năng + +- Sửa chữa hàng loạt nhiều PDF trong một thao tác +- Tự động phát hiện tệp có thể khôi phục và không thể khôi phục +- Báo cáo thành công/thất bại cho từng tệp khi xử lý nhiều tệp +- Dùng QPDF (WebAssembly), một thư viện biến đổi PDF đã được kiểm chứng + +## Những gì có thể sửa + +- Bảng tham chiếu chéo bị hỏng hoặc thiếu +- Phần cuối tệp bị cắt cụt do tải xuống không hoàn chỉnh +- Đánh số đối tượng và độ dài luồng không hợp lệ +- Các bất nhất nhỏ về cấu trúc do trình tạo PDF lỗi +- Lỗi mã hóa do các lần giải mã thất bại + +## Những gì không thể sửa + +- Tệp bị cắt cụt nghiêm trọng, thiếu phần lớn dữ liệu nội dung +- PDF được mã hóa bằng mật khẩu mà bạn không có +- Tệp thực chất không phải PDF (sai phần mở rộng) +- Hỏng hình ảnh bên trong PDF (cấu trúc được sửa nhưng dữ liệu điểm ảnh không được tạo lại) + +## Trường hợp sử dụng + +- Khôi phục PDF từ lần tải email bị lỗi +- Mở các tệp tạo bởi trình tạo PDF cũ hoặc không chuẩn +- Sửa PDF mở được ở trình xem này nhưng không mở được ở trình xem khác +- Chuẩn bị tài liệu lưu trữ bị hư hại cho việc bảo quản lâu dài + +## Mẹo + +- Nếu sửa chữa thất bại, hãy thử mở tệp trong trình duyệt trước: trình duyệt có logic khôi phục riêng và có thể hiển thị đủ nội dung để lưu lại. +- Với PDF được mã hóa mà sửa chữa thất bại, hãy thử Giải mã PDF trước, rồi sửa chữa đầu ra đã giải mã. + +## Công cụ liên quan + +- [Nén PDF](./compress-pdf): làm sạch thêm cấu trúc của PDF đã sửa +- [Tuyến tính hóa PDF](./linearize-pdf): tối ưu tệp đã sửa để phân phối qua web +- [Làm phẳng PDF](./flatten-pdf): làm phẳng các biểu mẫu có thể đã bị hỏng diff --git a/docs/vi/tools/reverse-pages.md b/docs/vi/tools/reverse-pages.md new file mode 100644 index 00000000..8c25b9fd --- /dev/null +++ b/docs/vi/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: Đảo ngược trang +description: Đảo thứ tự trang của một hoặc nhiều tệp PDF để trang cuối trở thành trang đầu. +--- + +# Đảo ngược trang + +Đảo ngược thứ tự trang của PDF để trang cuối trở thành trang đầu, trang gần cuối trở thành trang thứ hai, và cứ thế. Hỗ trợ xử lý hàng loạt nhiều tệp cùng lúc. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF. +2. Nhấp vào nút xử lý. +3. Mỗi tệp được đảo ngược độc lập. Nếu bạn tải lên nhiều tệp, đầu ra là một tệp ZIP chứa tất cả PDF đã đảo ngược. +4. Một tệp duy nhất được tải xuống trực tiếp dưới dạng PDF đã đảo ngược. + +## Tính năng + +- Xử lý hàng loạt: đảo ngược nhiều PDF trong một thao tác +- Đầu ra là một tệp cho một PDF, ZIP cho nhiều PDF +- Nút xóa từng tệp trước khi xử lý +- Giữ nguyên toàn bộ nội dung và định dạng trang + +## Trường hợp sử dụng + +- Sửa tài liệu bị quét theo thứ tự ngược +- Chuẩn bị PDF bản trình bày để đọc từ cuối về đầu +- Đảo thứ tự trang cho các quy trình in cần nạp giấy theo thứ tự ngược +- Chỉnh lại tài liệu có các trang vô tình bị ghép ngược + +## Mẹo + +- Mỗi tệp trong lô được đảo ngược độc lập, bản thân các tệp không bị sắp xếp lại với nhau. +- Để sắp xếp lại trang chi tiết hơn (không chỉ đảo ngược toàn bộ), hãy dùng [Sắp xếp & Nhân đôi](./organize-pdf). + +## Công cụ liên quan + +- [Sắp xếp & Nhân đôi](./organize-pdf) +- [Xoay PDF](./rotate-pdf) +- [Công cụ đa năng PDF](./pdf-multi-tool) diff --git a/docs/vi/tools/rotate-custom.md b/docs/vi/tools/rotate-custom.md new file mode 100644 index 00000000..8b784eca --- /dev/null +++ b/docs/vi/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: Xoay theo độ tùy chỉnh +description: Xoay các trang PDF theo bất kỳ góc nào với ô nhập độ cho từng trang và điều khiển xoay hàng loạt. +--- + +# Xoay theo độ tùy chỉnh + +Xoay các trang PDF theo bất kỳ góc tùy ý nào, không chỉ bội số của 90 độ. Mỗi trang có ô nhập góc riêng, và bạn có thể áp dụng một góc cho tất cả các trang cùng lúc bằng điều khiển hàng loạt. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Hình thu nhỏ được hiển thị cho mọi trang. +2. Mỗi trang có một ô nhập số hiển thị góc xoay hiện tại. +3. Nhập bất kỳ giá trị độ nào (dương hoặc âm) để xoay một trang cụ thể, hoặc dùng các nút trái/phải của từng trang để điều chỉnh nhanh 90 độ. +4. Dùng ô nhập **góc hàng loạt** ở trên cùng để đặt một góc xoay đồng nhất cho mọi trang. +5. Nhấp vào nút xử lý để tạo PDF đã xoay. + +## Tính năng + +- Nhập độ tự do cho từng trang (mọi giá trị số nguyên) +- Điều khiển góc hàng loạt để đặt cùng một góc xoay cho mọi trang +- Xem trước thời gian thực việc xoay trong hình thu nhỏ +- Nút xoay nhanh từng trang theo bước 90 độ +- Hình thu nhỏ tải lười để hiệu năng tốt với tài liệu lớn + +## Trường hợp sử dụng + +- Chỉnh các bản quét hơi nghiêng vài độ +- Xoay trang để khớp yêu cầu hướng không chuẩn +- Áp dụng góc xoay chính xác cho từng trang trong tài liệu có nội dung hỗn hợp +- Tinh chỉnh góc trang sau lần xoay hàng loạt ban đầu + +## Mẹo + +- Giá trị dương xoay theo chiều kim đồng hồ, giá trị âm xoay ngược chiều kim đồng hồ. +- Trường góc hàng loạt ghi đè tất cả góc của từng trang khi được áp dụng. Hãy đặt các điều chỉnh riêng lẻ sau thao tác hàng loạt nếu cần. +- Với các phép xoay 90/180/270 độ tiêu chuẩn và giao diện đơn giản hơn, hãy dùng [Xoay PDF](./rotate-pdf). + +## Công cụ liên quan + +- [Xoay PDF](./rotate-pdf) +- [Công cụ đa năng PDF](./pdf-multi-tool) +- [Sắp xếp & Nhân đôi](./organize-pdf) diff --git a/docs/vi/tools/rotate-pdf.md b/docs/vi/tools/rotate-pdf.md new file mode 100644 index 00000000..121d117d --- /dev/null +++ b/docs/vi/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: Xoay PDF +description: Xoay từng trang hoặc tất cả các trang trong PDF theo bước 90 độ với giao diện hình thu nhỏ trực quan. +--- + +# Xoay PDF + +Xoay các trang trong PDF 90 độ theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Công cụ hiển thị hình thu nhỏ xem trước của mọi trang, cho phép bạn xoay từng trang hoặc áp dụng xoay hàng loạt cho toàn bộ tài liệu. + +## Cách hoạt động + +1. Tải lên một tệp PDF. Hình thu nhỏ của mọi trang được hiển thị trong lưới. +2. Dùng các nút xoay trái/phải bên dưới mỗi hình thu nhỏ để xoay trang đó. +3. Dùng các điều khiển xoay hàng loạt ở trên cùng để xoay tất cả các trang cùng lúc. +4. Hình thu nhỏ xem trước cập nhật theo thời gian thực để hiển thị phép xoay. +5. Nhấp vào nút xử lý để lưu PDF đã xoay. + +## Tính năng + +- Xoay từng trang theo bước 90 độ (trái hoặc phải) +- Xoay hàng loạt cho tất cả các trang cùng lúc +- Xem trước hình thu nhỏ thời gian thực với hiệu ứng chuyển động khi xoay +- Hình thu nhỏ tải lười để hiệu năng mượt với tài liệu lớn +- Giữ nguyên nội dung và chất lượng trang gốc + +## Trường hợp sử dụng + +- Sửa các trang quét bị nằm ngang hoặc lộn ngược +- Xoay trang ngang sang hướng dọc (hoặc ngược lại) +- Chỉnh tài liệu có hướng hỗn hợp, trong đó một số trang được quét sai góc +- Chuẩn bị tài liệu cho một hướng hiển thị cụ thể + +## Mẹo + +- Các phép xoay được cộng dồn. Nhấp nút theo chiều kim đồng hồ hai lần sẽ áp dụng phép xoay 180 độ. +- Với các phép xoay không phải 90 độ (ví dụ: 45 độ để chỉnh bản quét hơi nghiêng), hãy dùng [Xoay theo độ tùy chỉnh](./rotate-custom). +- Các điều khiển xoay hàng loạt tác động lên mọi trang, không chỉ các trang được chọn. Công cụ này không có cơ chế chọn trang, để chọn hãy dùng [Công cụ đa năng PDF](./pdf-multi-tool). + +## Công cụ liên quan + +- [Xoay theo độ tùy chỉnh](./rotate-custom) +- [Công cụ đa năng PDF](./pdf-multi-tool) +- [Sắp xếp & Nhân đôi](./organize-pdf) diff --git a/docs/vi/tools/rtf-to-pdf.md b/docs/vi/tools/rtf-to-pdf.md new file mode 100644 index 00000000..f7b2b713 --- /dev/null +++ b/docs/vi/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF sang PDF +description: Chuyển đổi tệp Rich Text Format (RTF) sang PDF trong trình duyệt bằng engine chạy trên LibreOffice. +--- + +# RTF sang PDF + +Chuyển đổi tài liệu Rich Text Format sang PDF. RTF là định dạng tài liệu đa nền tảng được hầu hết mọi trình xử lý văn bản hỗ trợ. Công cụ này dùng engine LibreOffice chạy trong trình duyệt để hiển thị tệp RTF với định dạng nguyên vẹn: chữ đậm, chữ nghiêng, bảng và hình ảnh nhúng đều được chuyển sang PDF. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Kiểu MIME | +| :-------- | :----------- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả một hoặc nhiều tệp RTF. +2. Xem lại danh sách tệp. Thêm hoặc xóa tệp nếu cần. +3. Nhấp **Chuyển đổi sang PDF**. Engine LibreOffice khởi tạo ở lần dùng đầu tiên, sau đó xử lý từng tệp. +4. Một tệp được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được cung cấp dưới dạng `rtf-converted.zip`. + +## Tùy chọn + +Công cụ này không có cài đặt bổ sung. Quá trình chuyển đổi giữ nguyên định dạng RTF gốc. + +## Đầu ra + +| Số tệp đầu vào | Đầu ra | +| :------------- | :----------------------------------------------------- | +| 1 tệp | Tải xuống một PDF (ví dụ: `letter.pdf`) | +| 2 tệp trở lên | Tệp ZIP (`rtf-converted.zip`) chứa một PDF cho mỗi tệp | + +## Trường hợp sử dụng + +- Chuyển các tài liệu RTF cũ từ trình xử lý văn bản đời cũ sang PDF hiện đại +- Biến mẫu email RTF thành bản xem trước PDF +- Xử lý đầu ra RTF từ các hệ thống phần mềm pháp lý hoặc y tế +- Chuyển đổi hàng loạt tệp RTF từ hệ thống quản lý tài liệu sang PDF để lưu trữ + +## Mẹo + +- Engine LibreOffice được tải một lần và lưu đệm. Lần chuyển đổi đầu tiên trong phiên mất thêm vài giây, các lần sau nhanh hơn. +- Tệp RTF có đối tượng OLE nhúng có thể không hiển thị hoàn hảo mọi đối tượng. Văn bản thuần, hình ảnh và định dạng tiêu chuẩn được chuyển đổi đáng tin cậy. +- Nếu tệp RTF của bạn được tạo bằng Microsoft Word, bạn cũng có thể chuyển đổi trực tiếp bằng công cụ [Word sang PDF](./word-to-pdf), công cụ này nhận RTF cùng với DOC và DOCX. + +## Công cụ liên quan + +- [Word sang PDF](./word-to-pdf) +- [ODT sang PDF](./odt-to-pdf) +- [Văn bản sang PDF](./txt-to-pdf) diff --git a/docs/vi/tools/sanitize-pdf.md b/docs/vi/tools/sanitize-pdf.md new file mode 100644 index 00000000..153291b8 --- /dev/null +++ b/docs/vi/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: Làm sạch PDF +description: Loại bỏ nội dung ẩn và có thể nguy hiểm khỏi PDF, gồm metadata, JavaScript, tệp nhúng, ghi chú và layer. +--- + +# Làm sạch PDF + +PDF có thể mang nhiều hơn rất nhiều so với những gì bạn thấy trên màn hình. Metadata ẩn, JavaScript nhúng, tệp đính kèm, dữ liệu biểu mẫu và thông tin layer có thể làm lộ dữ liệu nhạy cảm hoặc gây rủi ro bảo mật. Làm sạch sẽ loại bỏ tất cả, để lại cho bạn một tài liệu sạch, an toàn để chia sẻ công khai. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Chọn các thành phần cần xóa từ danh sách kiểm. +3. Nhấp **Làm sạch PDF**. +4. Tải xuống tệp đã làm sạch. + +## Tùy chọn làm sạch + +Tất cả tùy chọn được bật theo mặc định. Bỏ chọn những mục bạn muốn giữ lại. + +| Tùy chọn | Những gì bị xóa | +| ---------------------- | --------------------------------------------------------------------- | +| **Làm phẳng biểu mẫu** | Chuyển các trường biểu mẫu tương tác thành nội dung tĩnh | +| **Xóa Metadata** | Loại bỏ tác giả, tiêu đề, ngày tạo, thông tin phần mềm và dữ liệu XMP | +| **Xóa ghi chú** | Xóa bình luận, đánh dấu, ghi chú dán và markup | +| **Xóa JavaScript** | Loại bỏ các script nhúng có thể chạy khi mở tệp | +| **Xóa tệp nhúng** | Loại bỏ các tệp đính kèm được nhúng trong PDF | +| **Xóa layer (OCG)** | Làm phẳng các nhóm nội dung tùy chọn thành một layer duy nhất | +| **Xóa liên kết** | Loại bỏ siêu liên kết và tham chiếu URL | +| **Xóa cây cấu trúc** | Xóa cấu trúc tài liệu dùng cho việc gắn thẻ hỗ trợ tiếp cận | +| **Xóa MarkInfo** | Loại bỏ thông tin nội dung được đánh dấu | +| **Xóa phông chữ** | Xóa dữ liệu phông chữ nhúng (dùng thận trọng) | + +## Trường hợp sử dụng + +- Chuẩn bị PDF để phát hành công khai bằng cách loại bỏ metadata nội bộ (tên tác giả, phiên bản phần mềm, lịch sử chỉnh sửa) +- Xóa JavaScript khỏi PDF nhận từ nguồn không tin cậy trước khi mở +- Làm sạch PDF trước khi gửi cho khách hàng không nên thấy bình luận nhúng hoặc tên trường biểu mẫu +- Loại bỏ các layer ẩn khỏi bản vẽ kiến trúc trước khi chia sẻ bản cuối +- Tuân thủ các yêu cầu tối thiểu hóa dữ liệu theo quy định về quyền riêng tư + +## Mẹo + +- Đừng chọn "Xóa phông chữ" trừ khi bạn chắc chắn PDF vẫn hiển thị đúng. Việc xóa phông chữ có thể khiến văn bản không hiển thị trong một số trình xem. +- Nếu bạn chỉ cần loại bỏ metadata, công cụ Xóa Metadata chuyên dụng nhanh hơn và tập trung hơn. +- Làm sạch là không thể hoàn tác. Hãy giữ tệp gốc của bạn. + +## Công cụ liên quan + +- [Xóa Metadata](./remove-metadata): chỉ loại bỏ metadata mà không đụng đến nội dung khác +- [Làm phẳng PDF](./flatten-pdf): làm phẳng riêng biểu mẫu và ghi chú +- [Mã hóa PDF](./protect-pdf): thêm bảo vệ bằng mật khẩu sau khi làm sạch +- [Raster hóa PDF](./rasterize-pdf): giải pháp triệt để, chuyển thành hình ảnh để loại bỏ mọi nội dung ẩn diff --git a/docs/vi/tools/scanner-effect.md b/docs/vi/tools/scanner-effect.md new file mode 100644 index 00000000..c70aefef --- /dev/null +++ b/docs/vi/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: Hiệu ứng máy quét +description: Làm cho PDF của bạn trông như tài liệu được quét, với nhiễu, độ xoay, độ mờ và hiệu ứng giấy cũ có thể điều chỉnh. +--- + +# Hiệu ứng máy quét + +Biến một PDF kỹ thuật số sạch sẽ thành thứ trông như vừa ra từ máy quét phẳng. Công cụ áp dụng nhiễu, độ xoay nhẹ, làm mờ, thay đổi độ sáng và tùy chọn ngả vàng có thể cấu hình để mô phỏng các khiếm khuyết của bản quét vật lý. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Trình chỉnh sửa mở ra với bản xem trước trực tiếp của trang đầu tiên bên cạnh bảng cài đặt. +3. Điều chỉnh các tham số hiệu ứng quét bằng thanh trượt và công tắc. +4. Bản xem trước cập nhật theo thời gian thực khi bạn đổi cài đặt. +5. Nhấp **Áp dụng** để xử lý tất cả các trang và tải xuống kết quả. + +## Tùy chọn + +- **Không gian màu (công tắc Thang xám)**: Chuyển đầu ra sang thang xám để có vẻ ngoài bản quét đen trắng cổ điển. +- **Viền**: Thêm viền tối nhẹ quanh các cạnh trang để mô phỏng lỗi viền của máy quét. +- **Xoay**: Áp dụng độ xoay nhẹ (-5 đến +5 độ) để mô phỏng giấy bị nạp lệch. +- **Biến thiên xoay**: Thêm biến thiên ngẫu nhiên vào góc xoay để mỗi trang nghiêng hơi khác nhau. +- **Độ sáng**: Tăng hoặc giảm độ sáng tổng thể. +- **Độ tương phản**: Điều chỉnh độ tương phản để mô phỏng sự khác biệt về chất lượng mực. +- **Làm mờ**: Áp dụng làm mờ Gaussian để làm mềm cạnh văn bản như bản quét chất lượng thấp. +- **Nhiễu**: Thêm nhiễu điểm ảnh ngẫu nhiên để mô phỏng hạt của cảm biến máy quét. Giá trị càng cao kết quả càng nhiều hạt. +- **Ngả vàng**: Thêm sắc vàng ấm để mô phỏng giấy cũ hoặc giấy tái chế. +- **Độ phân giải**: Đặt DPI đầu ra. Giá trị thấp hơn tạo vẻ ngoài vỡ điểm ảnh, giống bản quét hơn. +- **Đặt lại**: Khôi phục mọi cài đặt về mặc định. + +## Tính năng + +- Xem trước thời gian thực cập nhật khi bạn tinh chỉnh từng tham số +- Biến thiên xoay ngẫu nhiên theo từng trang để tạo sự khác biệt chân thực +- Mười tham số có thể điều chỉnh độc lập +- Chế độ thang xám cho đầu ra quét đen trắng chân thực +- Điều khiển độ phân giải từ chất lượng fax DPI thấp đến chất lượng lưu trữ DPI cao + +## Trường hợp sử dụng + +- Làm cho tài liệu tạo bằng kỹ thuật số trông như đã được quét và in +- Mô phỏng sự lão hóa của tài liệu vật lý để dựng lại tài liệu lịch sử +- Kiểm thử phần mềm OCR với chất lượng quét suy giảm +- Tạo tài liệu khớp với phong cách hình ảnh của các kho lưu trữ quét sẵn có + +## Mẹo + +- Hãy bắt đầu với giá trị nhẹ. Mức nhiễu 10-20, xoay nhẹ 0,5 độ và làm mờ tối thiểu đã tạo ra vẻ ngoài quét khá thuyết phục. +- Kết hợp chế độ thang xám với ngả vàng nhẹ để có hiệu ứng "bản photocopy của bản photocopy". +- Cài đặt độ phân giải thấp hơn (100-150 DPI) tạo ra vẻ ngoài máy fax chân thực nhất. + +## Công cụ liên quan + +- [Đảo ngược màu](./invert-colors) +- [Điều chỉnh màu sắc](./adjust-colors) +- [Màu nền](./background-color) diff --git a/docs/vi/tools/sign-pdf.md b/docs/vi/tools/sign-pdf.md new file mode 100644 index 00000000..11765000 --- /dev/null +++ b/docs/vi/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: Ký PDF +description: Vẽ, gõ hoặc tải lên chữ ký và đặt nó lên các trang PDF của bạn bằng trình xem tích hợp. +--- + +# Ký PDF + +Thêm chữ ký của bạn vào bất kỳ tài liệu PDF nào. Công cụ nhúng một trình xem PDF đầy đủ với các công cụ chữ ký tích hợp, nơi bạn có thể vẽ chữ ký tự do, gõ tên bằng phông chữ chữ ký hoặc tải lên hình ảnh chữ ký. Đặt và đổi kích thước chữ ký trên bất kỳ trang nào, rồi lưu tài liệu đã ký. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Tài liệu mở trong trình xem PDF tích hợp với các công cụ ghi chú. +3. Dùng công cụ chữ ký của trình xem để tạo chữ ký bằng cách vẽ, gõ hoặc tải lên hình ảnh. +4. Nhấp vào vị trí trên trang nơi bạn muốn đặt chữ ký và điều chỉnh kích thước và vị trí. +5. Tùy chọn chọn **Làm phẳng PDF** để nhúng vĩnh viễn chữ ký vào tài liệu. +6. Nhấp **Lưu & Tải xuống PDF đã ký** để nhận tệp đã ký. + +## Tùy chọn + +- **Làm phẳng PDF**: Khi chọn, chữ ký được nhúng vĩnh viễn vào nội dung trang. Điều này ngăn người khác di chuyển hoặc xóa chữ ký. Khi bỏ chọn, chữ ký vẫn là một ghi chú có thể chỉnh sửa trong các trình xem tương thích. + +## Tính năng + +- Ba cách tạo chữ ký: vẽ tự do, văn bản gõ hoặc hình ảnh tải lên +- Trình xem PDF tích hợp để đặt vị trí chính xác +- Kéo để định vị và đổi kích thước chữ ký trên bất kỳ trang nào +- Tùy chọn làm phẳng để nhúng vĩnh viễn chữ ký +- Hỗ trợ nhiều chữ ký trên cùng một tài liệu + +## Trường hợp sử dụng + +- Ký hợp đồng, thỏa thuận hoặc biểu mẫu phê duyệt trước khi gửi lại +- Thêm chữ ký vào tài liệu thuế, yêu cầu bảo hiểm hoặc biểu mẫu của cơ quan nhà nước +- Đặt chữ ký tắt trên từng trang của một thỏa thuận nhiều trang +- Ký NDA hoặc tài liệu nhân sự gửi đến dưới dạng tệp đính kèm PDF + +## Mẹo + +- Hãy bật làm phẳng nếu bạn gửi PDF đã ký cho người không nên có khả năng xóa hoặc dời chữ ký của bạn. +- Với chữ ký số có giá trị pháp lý và xác minh dựa trên chứng chỉ, BentoPDF còn cung cấp công cụ Chữ ký số riêng. +- Hãy tải lên hình ảnh chữ ký PNG có nền trong suốt để có kết quả sạch nhất. + +## Công cụ liên quan + +- [Trình chỉnh sửa PDF](./edit-pdf) +- [Thêm tem](./add-stamps) +- [Điền form PDF](./form-filler) diff --git a/docs/vi/tools/split-pdf.md b/docs/vi/tools/split-pdf.md new file mode 100644 index 00000000..efeb88f2 --- /dev/null +++ b/docs/vi/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: Chia PDF +description: Chia PDF thành các tệp nhỏ hơn theo phạm vi trang, chọn trực quan, bookmark, trang chẵn/lẻ hoặc khoảng cố định. +--- + +# Chia PDF + +Tách PDF thành các tài liệu nhỏ hơn bằng một trong sáu chế độ chia. Từ phạm vi trang đơn giản đến chia theo bookmark, công cụ này xử lý mọi tình huống chia tài liệu. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Chọn chế độ chia từ danh sách thả xuống. +3. Cấu hình các tùy chọn riêng của chế độ (phạm vi trang, lựa chọn, v.v.). +4. Nhấp vào nút xử lý. +5. Kết quả được tải xuống dưới dạng một PDF hoặc tệp ZIP tùy theo chế độ và cài đặt. + +## Chế độ chia + +| Chế độ | Mô tả | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------- | +| **Phạm vi** | Nhập phạm vi trang như `1-3, 5, 8-10`. Nhiều phạm vi tạo các PDF riêng trong ZIP. Một phạm vi duy nhất tạo một PDF. | +| **Chọn trực quan** | Duyệt hình thu nhỏ các trang và nhấp để chọn những trang bạn muốn. Các trang đã chọn được trích xuất thành PDF mới. | +| **Chẵn / Lẻ** | Chỉ trích xuất các trang số chẵn hoặc số lẻ. | +| **Tất cả trang** | Chia mỗi trang thành một tệp PDF riêng, tải xuống dưới dạng ZIP. | +| **Tách theo dấu trang** | Chia tại ranh giới bookmark. Chọn cấp bookmark để kiểm soát nơi diễn ra việc chia. | +| **Mỗi N trang** | Chia thành các khối N trang mỗi khối (ví dụ: mỗi 5 trang). Khối cuối có thể có ít trang hơn. | + +## Tính năng + +- Sáu chế độ chia riêng biệt bao quát hầu như mọi trường hợp sử dụng +- Bộ chọn trang trực quan với hình thu nhỏ tải lười +- Chia theo bookmark có lọc theo cấp +- Tùy chọn đầu ra ZIP cho chế độ phạm vi và trực quan +- Xử lý phạm vi trang với cú pháp hỗn hợp (`1-3, 5, 8-10`) +- Cảnh báo khi việc chia N trang tạo ra các khối không đều + +## Trường hợp sử dụng + +- Trích xuất một chương hoặc phần cụ thể từ tài liệu lớn +- Tách trang lẻ và chẵn cho quy trình in hai mặt +- Tách PDF sách thành các tệp chương riêng tại ranh giới bookmark +- Tách riêng các trang cụ thể (như trang chữ ký) khỏi hợp đồng +- Chia báo cáo tổng hợp thành các tệp theo từng phần để phân phối + +## Mẹo + +- Nhiều phạm vi trang phân tách bằng dấu phẩy (ví dụ: `1-5, 10-15, 20-25`) tạo ra các PDF riêng, mỗi phạm vi một PDF, được gói trong ZIP. +- Chế độ chia theo bookmark yêu cầu PDF thực sự chứa bookmark. Nếu không tìm thấy, bạn sẽ nhận được thông báo lỗi. +- Hộp kiểm "Tải xuống dưới dạng ZIP" trong chế độ Phạm vi và Trực quan cho phép bạn nhận PDF riêng cho từng trang thay vì một tệp gộp. + +## Công cụ liên quan + +- [Gộp PDF](./merge-pdf) +- [Trích xuất trang](./extract-pages) +- [Xóa trang](./delete-pages) +- [Công cụ đa năng PDF](./pdf-multi-tool) diff --git a/docs/vi/tools/svg-to-pdf.md b/docs/vi/tools/svg-to-pdf.md new file mode 100644 index 00000000..dacb7ef7 --- /dev/null +++ b/docs/vi/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG sang PDF +description: Chuyển đổi đồ họa vector SVG sang PDF với kiểm soát chất lượng, hoàn toàn trong trình duyệt của bạn. +--- + +# SVG sang PDF + +Chuyển đổi tệp Scalable Vector Graphics (SVG) sang PDF. Công cụ rasterize từng SVG qua engine hiển thị của trình duyệt, rồi nhúng kết quả ở độ phân giải gốc. Hữu ích để biến biểu tượng vector, sơ đồ và hình minh họa thành tài liệu di động. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :----------- | +| SVG | `.svg` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả một hoặc nhiều tệp SVG. +2. Xem lại và quản lý danh sách tệp. +3. Chọn mức **Chất lượng PDF**. +4. Nhấp **Chuyển đổi sang PDF**. Kết quả được tải xuống dưới dạng `from_svgs.pdf`. + +Mỗi SVG được đọc dưới dạng văn bản, hiển thị lên canvas theo chiều rộng và chiều cao vốn có (mặc định 800x600 nếu không chỉ định kích thước), rồi xuất thành PNG. PNG đó sau đó được nhúng vào PDF bằng pdf-lib. Các vùng trong suốt được tô nền trắng. + +## Tùy chọn + +**Chất lượng PDF** kiểm soát việc nén sau khi rasterize: + +- **Chất lượng cao**: gần nhất với bản hiển thị gốc. +- **Chất lượng trung bình** (mặc định): cân bằng tốt. +- **Chất lượng thấp**: tệp nhỏ nhất, mất một ít chi tiết. + +## Trường hợp sử dụng + +- Chuyển sơ đồ kiến trúc hoặc kỹ thuật từ SVG sang PDF sẵn sàng để in +- Đóng gói bộ biểu tượng thành PDF tham chiếu cho một hệ thống thiết kế +- Biến trực quan hóa dữ liệu (D3.js, xuất từ thư viện biểu đồ) thành PDF sẵn sàng cho báo cáo +- Tạo phiên bản in được của infographic dựa trên SVG + +## Mẹo + +- Tệp SVG không có thuộc tính `width` và `height` rõ ràng được hiển thị ở 800x600 điểm ảnh. Để có kết quả tốt nhất, hãy đặt kích thước trong mã nguồn SVG trước khi chuyển đổi. +- SVG phức tạp có tham chiếu phông chữ ngoài hoặc hình ảnh liên kết có thể không hiển thị hoàn hảo. Hãy nhúng mọi tài nguyên vào trong SVG để có đầu ra đáng tin cậy. +- Vì SVG được rasterize, PDF sẽ chứa ảnh bitmap thay vì đường vector. Để có đầu ra PDF vector thực sự, cần một công cụ vector chuyên dụng. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [PNG sang PDF](./png-to-pdf) +- [BMP sang PDF](./bmp-to-pdf) diff --git a/docs/vi/tools/table-of-contents.md b/docs/vi/tools/table-of-contents.md new file mode 100644 index 00000000..b8367503 --- /dev/null +++ b/docs/vi/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: Mục lục +description: Tạo trang mục lục được định dạng từ các bookmark hiện có trong PDF của bạn. +--- + +# Mục lục + +Công cụ này đọc các bookmark (outline) trong PDF và tạo một trang mục lục được định dạng, được chèn vào đầu tài liệu. Nếu PDF của bạn đã có bookmark nhưng thiếu trang mục lục hiển thị, công cụ sẽ tự động tạo một trang. + +## Cách hoạt động + +1. Tải lên PDF có chứa bookmark. +2. Tùy chỉnh tiêu đề mục lục, cỡ chữ và họ phông chữ. +3. Tùy chọn chọn **Thêm bookmark cho trang mục lục** để đưa chính mục lục vào cây bookmark. +4. Nhấp **Tạo mục lục** để xử lý tệp. +5. PDF đã cập nhật được tải xuống tự động với trang mục lục chèn ở đầu. + +## Tùy chọn + +- **Tiêu đề mục lục**: Tiêu đề hiển thị ở đầu trang được tạo. Mặc định là "Mục lục". +- **Cỡ chữ**: Chọn từ 10pt đến 72pt. Mặc định là 12pt. +- **Họ phông chữ**: Chọn trong các biến thể Times Roman, Helvetica hoặc Courier (thường, đậm, nghiêng, đậm nghiêng). Mặc định là Helvetica. +- **Thêm bookmark cho trang mục lục**: Khi chọn, một mục bookmark cho chính trang mục lục được thêm vào cây outline của PDF. + +## Tính năng + +- Đọc toàn bộ cấu trúc phân cấp bookmark từ PDF +- Tạo trang mục lục định dạng gọn gàng với tham chiếu số trang +- Hỗ trợ các cấp bookmark lồng nhau với thụt lề +- 12 phông chữ PDF tích hợp để lựa chọn +- Bookmark tự tham chiếu tùy chọn cho trang mục lục + +## Trường hợp sử dụng + +- Thêm mục lục in được cho sách điện tử hoặc báo cáo chỉ có bookmark kỹ thuật số +- Tạo mục lục cho tài liệu đã gộp sau khi kết hợp nhiều PDF +- Tạo trang tham chiếu cho các sách hướng dẫn kỹ thuật dài +- Chuẩn bị tài liệu để in khi cần có mục lục hiển thị + +## Mẹo + +- Nếu PDF của bạn không có bookmark, hãy dùng công cụ [Chỉnh sửa Bookmark](./bookmark) trước để tạo chúng, rồi quay lại đây để tạo mục lục. +- Với tài liệu lớn, cỡ chữ lớn hơn như 14pt hoặc 16pt giúp dễ đọc hơn. + +## Công cụ liên quan + +- [Chỉnh sửa Bookmark](./bookmark) +- [Số trang](./page-numbers) +- [Đầu trang & Chân trang](./header-footer) diff --git a/docs/vi/tools/text-color.md b/docs/vi/tools/text-color.md new file mode 100644 index 00000000..b557a02f --- /dev/null +++ b/docs/vi/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: Thay đổi màu văn bản +description: Đổi màu của toàn bộ văn bản trong PDF sang bất kỳ màu nào bạn chọn. +--- + +# Thay đổi màu văn bản + +Thay màu văn bản trong toàn bộ PDF. Công cụ nhận diện các vùng văn bản trên mỗi trang và tô lại bằng màu bạn chọn, đồng thời giữ nguyên bố cục tài liệu và nội dung không phải văn bản. + +## Cách hoạt động + +1. Tải lên tệp PDF của bạn. +2. Chọn màu văn bản mới bằng bộ chọn màu. Mặc định là xanh dương (#0000FF). +3. Nhấp **Thay đổi màu văn bản** để xử lý. +4. PDF đã đổi màu được tải xuống tự động. Chỉ báo tiến trình cho biết trang nào đang được xử lý. + +## Tùy chọn + +- **Màu văn bản mới**: Bộ chọn màu để chọn màu thay thế cho toàn bộ văn bản trong tài liệu. + +## Tính năng + +- Đổi màu văn bản trên mọi trang của tài liệu +- Xử lý từng trang với phản hồi tiến trình +- Bộ chọn màu hỗ trợ đầy đủ mã màu hex +- Giữ nguyên bố cục trang và các thành phần không phải văn bản + +## Trường hợp sử dụng + +- Đổi chữ đen sang xanh dương đậm để tài liệu trông dịu và hiện đại hơn +- Đổi màu văn bản cho khớp với hướng dẫn thương hiệu trước khi phân phối tài liệu +- Chuyển văn bản sang một màu cụ thể để tuân thủ yêu cầu hỗ trợ tiếp cận +- Làm văn bản hiển thị rõ trên màu nền mới được áp dụng + +## Mẹo + +- Công cụ này hiển thị các trang ở tỷ lệ 2x để đảm bảo chất lượng, rồi dựng lại PDF. Đầu ra dựa trên hình ảnh, nên văn bản sẽ không còn chọn hoặc tìm kiếm được. +- Với tài liệu cần giữ văn bản có thể chọn, hãy cân nhắc chỉnh sửa PDF trực tiếp bằng [Trình chỉnh sửa PDF](./edit-pdf). +- Thời gian xử lý tăng theo số trang vì mỗi trang được hiển thị riêng. + +## Công cụ liên quan + +- [Màu nền](./background-color) +- [Đảo ngược màu](./invert-colors) +- [Điều chỉnh màu sắc](./adjust-colors) diff --git a/docs/vi/tools/tiff-to-pdf.md b/docs/vi/tools/tiff-to-pdf.md new file mode 100644 index 00000000..a1722308 --- /dev/null +++ b/docs/vi/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF sang PDF +description: Chuyển đổi ảnh TIFF một trang và nhiều trang sang định dạng PDF trong trình duyệt, hỗ trợ đầy đủ các trang. +--- + +# TIFF sang PDF + +Chuyển đổi tệp TIFF sang PDF, gồm cả TIFF nhiều trang. Mỗi trang (hay "IFD") trong tệp TIFF trở thành một trang riêng trong PDF đầu ra. Điều này đặc biệt hữu ích với tài liệu quét, fax và hình ảnh y tế thường được lưu dưới dạng TIFF nhiều trang. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## Cách hoạt động + +1. Nhấp vào vùng tải lên hoặc kéo và thả các tệp TIFF của bạn. +2. Xem lại danh sách tệp và quản lý nếu cần. +3. Nhấp **Chuyển đổi sang PDF**. Kết quả được tải xuống dưới dạng `from_tiff.pdf`. + +Công cụ giải mã từng tệp TIFF bằng bộ giải mã TIFF JavaScript, trích xuất dữ liệu điểm ảnh RGBA thô của từng trang. Mỗi trang được hiển thị lên canvas, xuất thành PNG và nhúng vào PDF. Kích thước trang khớp với các trang TIFF gốc. + +## Tùy chọn + +Công cụ này không có thêm cài đặt chất lượng. Hình ảnh được nhúng ở độ phân giải gốc. + +## Trường hợp sử dụng + +- Chuyển tài liệu fax nhiều trang (TIFF-F) sang định dạng PDF di động hơn +- Biến kho tài liệu quét lưu dạng TIFF thành PDF có thể tìm kiếm (sau đó kết hợp với công cụ OCR) +- Xử lý tệp hình ảnh y tế (tiêu bản bệnh lý, xuất từ chẩn đoán hình ảnh) dùng TIFF +- Chuyển tệp TIFF GIS hoặc ảnh vệ tinh thành tài liệu có thể chia sẻ + +## Mẹo + +- TIFF nhiều trang được hỗ trợ đầy đủ. TIFF 10 trang sẽ tạo PDF 10 trang. Bạn không cần chia TIFF trước. +- Tệp TIFF rất lớn (hàng trăm megabyte) có thể mất nhiều thời gian xử lý hơn vì toàn bộ tệp phải được giải mã trong bộ nhớ trình duyệt. +- Nếu bạn cần OCR cho PDF kết quả, hãy chạy qua công cụ [OCR PDF](./ocr-pdf) sau khi chuyển đổi. + +## Công cụ liên quan + +- [Hình ảnh sang PDF](./image-to-pdf) +- [BMP sang PDF](./bmp-to-pdf) +- [JPG sang PDF](./jpg-to-pdf) diff --git a/docs/vi/tools/txt-to-pdf.md b/docs/vi/tools/txt-to-pdf.md new file mode 100644 index 00000000..8056fdf2 --- /dev/null +++ b/docs/vi/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: Văn bản sang PDF +description: Chuyển đổi tệp văn bản thuần hoặc văn bản gõ trực tiếp sang PDF với phông chữ, màu sắc và kích thước trang tùy chỉnh. +--- + +# Văn bản sang PDF + +Chuyển đổi văn bản thuần thành PDF được định dạng. Bạn có thể tải lên tệp `.txt` hoặc gõ trực tiếp vào trình soạn thảo văn bản tích hợp. Công cụ hỗ trợ nhiều phông chữ, màu văn bản tùy chỉnh và nhiều kích thước trang, từ A0 đến A10, cùng US Letter, Legal và Tabloid. + +## Định dạng được hỗ trợ + +| Đầu vào | Phần mở rộng | +| :--------------------- | :------------------------------ | +| Tệp văn bản thuần | `.txt` | +| Nhập văn bản trực tiếp | Gõ hoặc dán vào trình soạn thảo | + +## Cách hoạt động + +1. Chọn chế độ đầu vào bằng công tắc ở trên cùng: **Tải tệp lên** hoặc **Gõ văn bản**. +2. Nếu tải lên, kéo và thả hoặc nhấp để chọn một hoặc nhiều tệp `.txt`. Nếu gõ, hãy nhập văn bản trực tiếp vào ô văn bản. +3. Cấu hình các tùy chọn định dạng: họ phông chữ, cỡ chữ, màu văn bản và kích thước trang. +4. Nhấp **Tạo PDF**. Đầu ra được tải xuống dưới dạng `text_to_pdf.pdf`. + +Khi tải lên nhiều tệp, nội dung của chúng được nối với nhau bằng các dòng trống ở giữa. + +## Tùy chọn + +| Tùy chọn | Giá trị | Mặc định | +| :------------------- | :----------------------------------------------------------------------- | :------------ | +| **Họ phông chữ** | Helvetica (sans-serif), Tiro (serif), Courier (monospace), Times (serif) | Helvetica | +| **Cỡ chữ** | 6 - 72 pt | 12 | +| **Màu văn bản** | Bất kỳ màu nào qua bộ chọn màu | Đen (#000000) | +| **Kích thước trang** | ISO A0-A10, B0-B10, C0-C10, US Letter, Legal, Tabloid, Ledger, 11x17 | A4 | + +Các ngôn ngữ viết từ phải sang trái (Ả Rập, Do Thái, Ba Tư, Urdu) được tự động phát hiện. Khi tìm thấy văn bản RTL, hướng văn bản và căn lề sẽ chuyển đổi tương ứng. + +## Trường hợp sử dụng + +- Chuyển đoạn mã hoặc tệp nhật ký thành PDF in được với phông chữ Courier +- Tạo nhanh PDF từ ghi chú cuộc họp gõ tại chỗ +- Định dạng bản thảo văn bản thuần với phông chữ và kích thước trang cụ thể để nộp +- Tạo phiên bản PDF của README hoặc changelog để phân phối ngoại tuyến + +## Mẹo + +- Dùng chế độ **Gõ văn bản** khi bạn muốn chuyển nhanh nội dung từ clipboard mà không cần lưu thành tệp trước. +- Courier (monospace) là lựa chọn phông chữ tốt nhất cho mã, nhật ký hoặc bất kỳ nội dung nào cần căn cột. +- Lề trang được cố định ở 72 point (1 inch) ở mọi cạnh. + +## Công cụ liên quan + +- [Markdown sang PDF](./markdown-to-pdf) +- [CSV sang PDF](./csv-to-pdf) +- [Word sang PDF](./word-to-pdf) diff --git a/docs/vi/tools/unlock-pdf.md b/docs/vi/tools/unlock-pdf.md new file mode 100644 index 00000000..faead0ad --- /dev/null +++ b/docs/vi/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: Mở khóa PDF +description: Xóa bảo vệ mật khẩu khỏi các PDF đã mã hóa. Hỗ trợ giải mã hàng loạt với một mật khẩu cho nhiều tệp. +--- + +# Mở khóa PDF + +Nếu bạn có mật khẩu của một PDF đã mã hóa, công cụ này sẽ loại bỏ hoàn toàn lớp mã hóa, tạo ra một bản đã mở khóa mà ai cũng có thể mở mà không cần thông tin xác thực. Công cụ hỗ trợ giải mã hàng loạt khi nhiều PDF dùng chung một mật khẩu. + +## Cách hoạt động + +1. Tải lên một hoặc nhiều tệp PDF đã mã hóa. +2. Nhập **mật khẩu** đã dùng để bảo vệ các tệp. +3. Nhấp **Giải mã PDF**. +4. Một tệp sẽ được tải xuống trực tiếp. Nhiều tệp sẽ tạo ra một tệp ZIP chứa tất cả PDF đã mở khóa. + +## Tính năng + +- Giải mã từng tệp và hàng loạt +- Xử lý được cả mật khẩu người dùng và mật khẩu chủ sở hữu +- Tạo đầu ra hoàn toàn không mã hóa, không còn hạn chế nào +- Báo lỗi rõ ràng khi mật khẩu sai hoặc tệp bị hỏng +- Theo dõi thành công/thất bại cho từng tệp ở chế độ hàng loạt + +## Khác biệt so với Xóa hạn chế + +**Giải mã PDF** cần mật khẩu và xóa toàn bộ mã hóa. **Xóa hạn chế** nhắm đến các hạn chế sử dụng (in, sao chép, chỉnh sửa) và có thể không cần mật khẩu nếu chỉ đặt mật khẩu chủ sở hữu. Hãy dùng Giải mã khi PDF hoàn toàn không mở được nếu thiếu mật khẩu. + +## Trường hợp sử dụng + +- Mở khóa vĩnh viễn các PDF bạn đã mã hóa trước đây khi không còn cần mật khẩu +- Gỡ mã hóa khỏi một loạt tài liệu lưu trữ để dễ truy cập lâu dài +- Chuẩn bị các PDF có mật khẩu cho hệ thống quản lý tài liệu không hỗ trợ tệp mã hóa +- Mở khóa PDF trước khi gộp với các tài liệu khác (nhiều công cụ gộp không xử lý được đầu vào đã mã hóa) + +## Mẹo + +- Trường mật khẩu áp dụng cho tất cả tệp đã tải lên. Nếu các PDF có mật khẩu khác nhau, hãy xử lý chúng trong các lô riêng. +- Nếu gặp lỗi "Mật khẩu không đúng", hãy kiểm tra lại khoảng trắng ở cuối hoặc phím caps lock. +- Sau khi giải mã, đầu ra không còn bảo mật. Hãy mã hóa lại bằng Mã hóa PDF nếu bạn cần áp dụng mật khẩu mới. + +## Công cụ liên quan + +- [Mã hóa PDF](./protect-pdf): áp dụng lại mã hóa với mật khẩu mới +- [Xóa hạn chế](./remove-restrictions): xóa hạn chế sử dụng mà không cần giải mã hoàn toàn +- [Thay đổi quyền](./change-permissions): chỉnh sửa các quyền cụ thể trên PDF đã mã hóa diff --git a/docs/vi/tools/validate-signature-pdf.md b/docs/vi/tools/validate-signature-pdf.md new file mode 100644 index 00000000..ec1e3f80 --- /dev/null +++ b/docs/vi/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: Xác minh chữ ký PDF +description: Xác minh chữ ký số trong tệp PDF. Kiểm tra tính hợp lệ của chứng chỉ, danh tính người ký, tính toàn vẹn của tài liệu và trạng thái chuỗi tin cậy. +--- + +# Xác minh chữ ký PDF + +Tải lên một PDF đã ký và công cụ này sẽ trích xuất mọi chữ ký số, xác định người ký, kiểm tra tính hợp lệ của chứng chỉ và báo cáo liệu tài liệu có bị sửa đổi kể từ khi ký hay không. Bạn cũng có thể cung cấp một chứng chỉ tin cậy để xác minh chuỗi chữ ký. + +## Cách hoạt động + +1. Tải lên một tệp PDF đã ký. Việc xác minh bắt đầu tự động. +2. Công cụ hiển thị bản tóm tắt: số chữ ký tìm thấy, bao nhiêu chữ ký hợp lệ. +3. Mỗi chữ ký có một thẻ chi tiết hiển thị tên người ký, bên cấp, ngày tháng và trạng thái. +4. Tùy chọn, tải lên một **chứng chỉ tin cậy** (.pem, .crt, .cer, .der) để xác minh chữ ký theo một trust anchor cụ thể. Việc xác minh lại chạy tự động. + +## Những gì được kiểm tra + +### Phân tích chữ ký + +Công cụ trích xuất các đối tượng chữ ký PKCS#7 từ PDF, giải mã cấu trúc ASN.1 và lấy chứng chỉ X.509 của người ký cùng với bất kỳ chuỗi chứng chỉ nào được nhúng trong chữ ký. + +### Tính hợp lệ của chứng chỉ + +- **Hết hạn**: Chứng chỉ hiện có nằm trong thời hạn hiệu lực không? +- **Phát hiện tự ký**: Chứng chỉ có phải do chính nó cấp không? +- **Chuỗi tin cậy**: Khi có chứng chỉ tin cậy, chứng chỉ của người ký có liên kết ngược về chứng chỉ đó không? + +### Xác minh mật mã + +- Công cụ dựng lại các byte nằm trong `/ByteRange` của chữ ký, băm chúng bằng thuật toán mà người ký đã khai báo, rồi so sánh kết quả với thuộc tính `messageDigest` bên trong chữ ký. +- Sau đó, công cụ tuần tự hóa lại các thuộc tính đã ký dưới dạng DER SET và xác minh chữ ký bằng khóa công khai của chứng chỉ người ký. +- **Chữ ký chỉ được báo cáo là hợp lệ khi tất cả các bước này đều đạt.** Nếu các byte của PDF bị sửa đổi sau khi ký, hoặc chữ ký nhúng không khớp với khóa của người ký, trạng thái sẽ hiển thị "Không hợp lệ: Xác minh mật mã không thành công" kèm lý do cụ thể. + +#### Thuật toán chữ ký được hỗ trợ + +| Thuật toán | Đường dẫn xác minh | +| ----------------------- | ------------------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`, với Web Crypto dự phòng | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | Web Crypto `verify({name: 'ECDSA', hash})` sau khi chuyển đổi chữ ký DER → IEEE P1363 | + +Nếu chữ ký dùng thuật toán nằm ngoài danh sách này (ví dụ Ed25519, SM2 hoặc RSA với OID digest bất thường), thẻ sẽ hiển thị **"Chưa xác minh: Thuật toán chữ ký không được hỗ trợ"** màu vàng, kèm OID hoặc lý do cụ thể. Đây là sự phân biệt ba trạng thái có chủ đích: + +- **Hợp lệ**: chữ ký đã được xác minh bằng mật mã với khóa công khai của người ký. +- **Không hợp lệ**: việc xác minh đã chạy và cho kết quả âm tính (byte bị thay đổi, khóa không khớp). +- **Chưa xác minh**: công cụ không thể chạy xác minh cho thuật toán này. Siêu dữ liệu chứng chỉ vẫn được hiển thị, nhưng bạn nên coi chữ ký là "không rõ" và xác minh bằng Adobe Acrobat hoặc `openssl cms -verify`. + +### Thuật toán digest không an toàn + +- Chữ ký dùng **MD5 hoặc SHA-1** bị từ chối là không hợp lệ và được gắn trạng thái "Thuật toán băm không an toàn". Cả hai thuật toán đều đã có các cuộc tấn công va chạm được công bố, nên chữ ký trên hash SHA-1 hoặc MD5 không đảm bảo tính toàn vẹn. +- SHA-224, SHA-256, SHA-384 và SHA-512 đều được chấp nhận. + +### Phạm vi bao phủ tài liệu + +- **Bao phủ toàn bộ**: Chữ ký bao phủ toàn bộ tệp PDF, nghĩa là không có byte nào được thêm hoặc thay đổi sau khi ký. +- **Bao phủ một phần**: Chữ ký chỉ bao phủ một phần của tệp. Điều này có thể cho thấy đã có sửa đổi sau khi ký (không nhất thiết là độc hại: lưu tăng dần cũng tạo ra phạm vi bao phủ một phần). + +## Chi tiết chữ ký + +Mỗi thẻ chữ ký hiển thị: + +- **Người ký**: Tên chung, tổ chức và email từ chứng chỉ của người ký +- **Bên cấp**: Tổ chức cấp chứng chỉ (Certificate Authority) đã cấp chứng chỉ của người ký +- **Ngày ký**: Dấu thời gian được nhúng trong chữ ký +- **Có hiệu lực từ / Có hiệu lực đến**: Thời hạn hiệu lực của chứng chỉ +- **Lý do**: Lý do ký tài liệu (nếu có) +- **Địa điểm**: Nơi ký (nếu có) +- **Trạng thái bao phủ**: Toàn bộ hoặc Một phần +- **Huy hiệu tin cậy**: Đáng tin cậy hoặc Không thuộc chuỗi tin cậy (chỉ khi cung cấp chứng chỉ tùy chỉnh) + +### Chi tiết kỹ thuật + +Mở rộng phần chi tiết kỹ thuật để xem: + +- Số sê-ri của chứng chỉ người ký +- Thuật toán digest (SHA-256, SHA-512, v.v.) +- Thuật toán chữ ký (RSA với SHA-256, ECDSA với SHA-256, v.v.) +- Thông báo lỗi cho các chữ ký không hợp lệ + +## Trường hợp sử dụng + +- Xác minh hợp đồng đã ký số trước khi đồng ký +- Kiểm tra các tài liệu đã ký để xác nhận chúng không bị giả mạo +- Kiểm tra xem chứng chỉ đã hết hạn kể từ khi tài liệu được ký hay chưa +- Xác thực chữ ký theo chứng chỉ gốc của tổ chức bạn +- Xem chi tiết việc ký của các tài liệu chính phủ hoặc pháp lý + +## Mẹo + +- Chứng chỉ tự ký không có nghĩa là chữ ký không hợp lệ: nó có nghĩa là danh tính người ký không thể được xác minh qua bên thứ ba đáng tin cậy. Điều này phổ biến với tài liệu nội bộ. +- Bao phủ một phần không phải lúc nào cũng cho thấy có giả mạo. Nhiều quy trình PDF thêm các cập nhật tăng dần (như chữ ký thứ hai) tạo ra phạm vi bao phủ một phần. +- Hãy tải lên chứng chỉ gốc hoặc chứng chỉ trung gian của tổ chức bạn làm chứng chỉ tin cậy để được xác minh chuỗi tin cậy. + +## Công cụ liên quan + +- [Chữ ký số PDF](./digital-sign-pdf): ký PDF bằng chứng chỉ của riêng bạn +- [Làm phẳng PDF](./flatten-pdf): làm phẳng PDF trước khi ký để ngăn sửa đổi sau khi ký +- [Xóa Metadata](./remove-metadata): làm sạch PDF trước khi áp dụng chữ ký diff --git a/docs/vi/tools/view-metadata.md b/docs/vi/tools/view-metadata.md new file mode 100644 index 00000000..8bd8d2d3 --- /dev/null +++ b/docs/vi/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: Xem Metadata +description: Kiểm tra mọi thuộc tính metadata của PDF, gồm thông tin tài liệu, dữ liệu XMP và chi tiết cấu trúc. +--- + +# Xem Metadata + +Xem các thuộc tính ẩn được nhúng trong tệp PDF. Công cụ hiển thị thông tin tài liệu (tiêu đề, tác giả, ngày tháng), metadata XMP, kích thước trang và các dữ liệu cấu trúc khác ở định dạng dễ đọc. + +## Cách hoạt động + +1. Tải lên một tệp PDF. +2. Công cụ phân tích tệp ngay lập tức và hiển thị toàn bộ metadata có sẵn trong các phần được sắp xếp gọn gàng. +3. Xem lại từ điển thông tin tài liệu, cây metadata XMP và các thuộc tính cấu trúc. +4. Không cần bước xử lý: metadata được hiển thị ngay khi tệp được tải. + +## Tính năng + +- Hiển thị các trường thông tin tài liệu chuẩn: Title, Author, Subject, Keywords, Creator, Producer +- Hiển thị ngày tạo và ngày sửa đổi ở dạng dễ đọc +- Phân tích và hiển thị toàn bộ cây metadata XMP với các namespace lồng nhau +- Chuyển đổi định dạng ngày PDF (`D:20240101120000Z`) sang ngày dễ đọc +- Được chia thành các phần có thể thu gọn để dễ điều hướng + +## Các phần metadata + +| Phần | Nội dung | +| ----------------------- | ------------------------------------------------------------------------------------- | +| **Thông tin tài liệu** | Title, Author, Subject, Keywords, Creator, Producer, Creation Date, Modification Date | +| **Metadata XMP** | Cây metadata dựa trên XML đầy đủ với Dublin Core, XAP, PDF và các namespace tùy chỉnh | +| **Thuộc tính tài liệu** | Số trang, phiên bản PDF, kích thước tệp, trạng thái mã hóa | + +## Trường hợp sử dụng + +- Kiểm tra ai là tác giả của PDF và lần sửa đổi gần nhất +- Xác nhận metadata đã được đặt đúng trước khi xuất bản tài liệu +- Kiểm tra quyền riêng tư của PDF bằng cách xem thông tin cá nhân nào được nhúng +- Tìm hiểu phần mềm đã dùng để tạo hoặc sửa đổi PDF (qua trường Producer) +- Xem lại metadata XMP để tuân thủ quản lý tài sản số + +## Mẹo + +- Chuỗi ngày PDF bắt đầu bằng `D:` được tự động chuyển sang định dạng múi giờ cục bộ của bạn. +- Nếu các trường metadata trống, nghĩa là người tạo PDF chưa đặt chúng. Không phải PDF nào cũng chứa metadata phong phú. +- Để sửa metadata sau khi kiểm tra, hãy dùng [Chỉnh sửa Metadata](./edit-metadata). Để xóa hoàn toàn, hãy dùng Xóa Metadata. + +## Công cụ liên quan + +- [Chỉnh sửa Metadata](./edit-metadata) +- [Lớp PDF (OCG)](./pdf-layers) +- [So sánh PDF](./compare-pdfs) diff --git a/docs/vi/tools/vsd-to-pdf.md b/docs/vi/tools/vsd-to-pdf.md new file mode 100644 index 00000000..52c0a62d --- /dev/null +++ b/docs/vi/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD sang PDF +description: Chuyển đổi sơ đồ Microsoft Visio (VSD/VSDX) sang PDF ngay trong trình duyệt. Miễn phí, riêng tư, không cần Visio. +--- + +# VSD sang PDF + +Chuyển đổi sơ đồ Microsoft Visio sang PDF mà không cần cài Visio. Tệp VSD và VSDX chứa lưu đồ, sơ đồ tổ chức, sơ đồ mạng và mặt bằng mà hầu hết mọi người không thể mở. Công cụ này hiển thị chúng thành các PDF gọn gàng xem được trên mọi thiết bị. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :----------- | :----------- | :-------------------------------------------- | +| Visio Binary | `.vsd` | Định dạng Visio cũ (Visio 2003 trở về trước) | +| Visio XML | `.vsdx` | Định dạng Visio hiện đại (Visio 2013 trở lên) | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tệp VSD hoặc VSDX của bạn. Có thể trộn cả hai định dạng trong một lô. +2. Xem lại danh sách tệp. Xóa các mục không cần bằng biểu tượng thùng rác, hoặc dùng **Thêm tệp** để thêm sơ đồ. +3. Nhấp **Chuyển sang PDF**. Công cụ dựa trên LibreOffice được tải trong trình duyệt và kết xuất từng sơ đồ thành PDF, giữ nguyên hình dạng, đường nối, nhãn và bố cục trang. +4. Một sơ đồ sẽ được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp sẽ tạo ra một tệp ZIP có tên `vsd-to-pdf.zip`. + +## Tùy chọn + +Không cần cấu hình. Trình chuyển đổi tôn trọng kích thước trang và hướng gốc của tài liệu Visio. + +## Trường hợp sử dụng + +- Xem sơ đồ Visio từ đồng nghiệp khi bạn không có giấy phép Visio +- Đưa sơ đồ mạng hoặc kiến trúc vào tài liệu dự án dưới dạng PDF +- In sơ đồ tổ chức hoặc quy trình làm tài liệu phát trong cuộc họp +- Lưu trữ các tệp VSD cũ từ các phiên bản Visio đời cũ ở định dạng bền vững lâu dài + +## Mẹo + +- Tài liệu Visio nhiều trang tạo ra PDF nhiều trang, mỗi trang Visio tương ứng một trang PDF. +- Tệp VSDX (định dạng hiện đại dựa trên XML) thường được chuyển đổi chính xác hơn tệp nhị phân VSD cũ. +- Công cụ LibreOffice chỉ được tải một lần mỗi phiên. Lần chuyển đổi đầu tiên sẽ phải chờ một lúc, các tệp sau sẽ nhanh hơn. + +## Công cụ liên quan + +- [ODG sang PDF](./odg-to-pdf) +- [PUB sang PDF](./pub-to-pdf) +- [PSD sang PDF](./psd-to-pdf) diff --git a/docs/vi/tools/webp-to-pdf.md b/docs/vi/tools/webp-to-pdf.md new file mode 100644 index 00000000..f4d3b0b4 --- /dev/null +++ b/docs/vi/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP sang PDF +description: Chuyển đổi ảnh WebP sang PDF ngay trong trình duyệt với chất lượng nén có thể điều chỉnh. +--- + +# WebP sang PDF + +Chuyển đổi định dạng ảnh WebP của Google sang PDF. Công cụ đặc biệt hữu ích khi bạn tải ảnh từ web ở định dạng WebP và cần một định dạng được chấp nhận rộng rãi hơn để in hoặc chia sẻ. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :-------- | :----------- | +| WebP | `.webp` | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tệp WebP của bạn. +2. Xem lại danh sách tệp và xóa những tệp bạn không cần. +3. Chọn mức **Chất lượng PDF**. +4. Nhấp **Chuyển sang PDF**. Đầu ra được tải xuống với tên `from_webps.pdf`. + +Bên trong, mỗi ảnh WebP được giải mã qua canvas API của trình duyệt, rồi được nhúng vào PDF bằng pdf-lib. Điều này có nghĩa là việc chuyển đổi hoạt động trên mọi trình duyệt hỗ trợ giải mã WebP (tất cả trình duyệt hiện đại đều hỗ trợ). + +## Tùy chọn + +**Chất lượng PDF** điều khiển mức nén khi nhúng ảnh: + +- **Chất lượng cao**: giữ lại nhiều chi tiết nhất. +- **Chất lượng trung bình** (mặc định): đầu ra cân bằng. +- **Chất lượng thấp**: kích thước tệp nhỏ nhất. + +## Trường hợp sử dụng + +- Chuyển các ảnh tải từ web được lưu dạng WebP thành PDF có thể in +- Gói ảnh chụp màn hình WebP từ Chrome hoặc Edge vào tài liệu +- Tạo danh mục PDF từ ảnh xuất ra bởi các công cụ thiết kế mặc định dùng WebP +- Lưu trữ ảnh WebP ở định dạng dễ đọc rộng rãi hơn + +## Mẹo + +- WebP được giải mã nội bộ sang PNG trước khi nhúng vào PDF, nên ảnh WebP không mất dữ liệu giữ nguyên chất lượng ở mức Cao. +- Nếu bạn có hỗn hợp WebP và các định dạng ảnh khác, hãy dùng công cụ [Ảnh sang PDF](./image-to-pdf), công cụ này nhận tất cả trong một lần. + +## Công cụ liên quan + +- [Ảnh sang PDF](./image-to-pdf) +- [PNG sang PDF](./png-to-pdf) +- [JPG sang PDF](./jpg-to-pdf) diff --git a/docs/vi/tools/word-to-pdf.md b/docs/vi/tools/word-to-pdf.md new file mode 100644 index 00000000..373d0e5d --- /dev/null +++ b/docs/vi/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word sang PDF +description: Chuyển đổi tài liệu Word (DOC, DOCX), ODT và RTF sang PDF ngay trong trình duyệt, giữ nguyên định dạng. +--- + +# Word sang PDF + +Chuyển đổi tài liệu Microsoft Word và các định dạng tương thích sang PDF. Công cụ dùng engine LibreOffice chạy trong trình duyệt, xử lý các tệp DOC, DOCX, ODT và RTF, giữ nguyên định dạng, bảng, ảnh, đầu trang, chân trang và kiểu dáng ở đầu ra. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | +| :---------------- | :----------- | +| Word (hiện đại) | `.docx` | +| Word (cũ) | `.doc` | +| OpenDocument Text | `.odt` | +| Rich Text Format | `.rtf` | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tài liệu Word của bạn. Có thể chọn nhiều tệp cùng lúc. +2. Xem lại và quản lý danh sách tệp. +3. Nhấp **Chuyển sang PDF**. Engine LibreOffice được tải ở lần dùng đầu tiên (một chỉ báo tiến trình cho biết trạng thái khởi tạo), sau đó từng tệp được chuyển đổi. +4. Một tệp sẽ được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được đóng gói vào `word-converted.zip`. + +## Tùy chọn + +Công cụ này không có cài đặt bổ sung. Engine LibreOffice tạo đầu ra bằng hồ sơ xuất PDF mặc định. + +## Đầu ra + +| Số tệp đầu vào | Đầu ra | +| :------------- | :------------------------------------------------------ | +| 1 tệp | Tải xuống một PDF (tên tệp gốc với phần mở rộng `.pdf`) | +| 2 tệp trở lên | Tệp ZIP (`word-converted.zip`) chứa một PDF cho mỗi tệp | + +## Trường hợp sử dụng + +- Chuyển sơ yếu lý lịch hoặc thư xin việc từ DOCX sang PDF trước khi nộp đơn +- Chuyển hàng loạt một bộ hợp đồng hoặc đề xuất sang PDF để giao cho khách hàng +- Biến các tệp `.doc` cũ thành PDF hiện đại để lưu trữ lâu dài +- Chuyển các tài liệu cộng tác từ Google Docs (xuất dạng DOCX) sang PDF +- Tạo PDF sẵn sàng để in từ các mẫu Word dùng trong việc tạo tài liệu tự động + +## Mẹo + +- Engine LibreOffice được tải một lần mỗi phiên và được lưu đệm. Lần chuyển đổi đầu tiên mất vài giây để tải, các lần sau nhanh hơn nhiều. +- Định dạng phức tạp (macro, điều khiển ActiveX, SmartArt nâng cao) có thể không được chuyển đổi hoàn hảo. Các thành phần tài liệu tiêu chuẩn như văn bản, bảng, ảnh, đầu trang, chú thích cuối trang được chuyển đổi đáng tin cậy. +- Vì công cụ này cũng nhận ODT và RTF, bạn có thể dùng nó làm công cụ chuyển đổi tất cả trong một cho mọi định dạng soạn thảo văn bản. + +## Công cụ liên quan + +- [ODT sang PDF](./odt-to-pdf) +- [RTF sang PDF](./rtf-to-pdf) +- [Excel sang PDF](./excel-to-pdf) +- [PowerPoint sang PDF](./powerpoint-to-pdf) diff --git a/docs/vi/tools/wpd-to-pdf.md b/docs/vi/tools/wpd-to-pdf.md new file mode 100644 index 00000000..975e0edb --- /dev/null +++ b/docs/vi/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD sang PDF +description: Chuyển đổi tài liệu WordPerfect (WPD) sang PDF ngay trong trình duyệt bằng LibreOffice. Miễn phí và riêng tư. +--- + +# WPD sang PDF + +Chuyển đổi tài liệu Corel WordPerfect thành tệp PDF. WPD từng là định dạng soạn thảo văn bản thống trị tại các văn phòng luật và cơ quan chính phủ. Nếu bạn có các tệp WordPerfect cũ mà phần mềm hiện đại không chịu mở, công cụ này sẽ đưa chúng trở lại thành PDF chuẩn. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :---------- | :----------- | :------------------------------------- | +| WordPerfect | `.wpd` | Tất cả các phiên bản WordPerfect chính | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tệp WPD của bạn. Có thể chọn nhiều tệp cùng lúc. +2. Xem lại danh sách tệp. Xóa các tệp không cần bằng biểu tượng thùng rác, hoặc dùng **Thêm tệp** để thêm tài liệu. +3. Nhấp **Chuyển sang PDF**. Công cụ tải một engine chuyển đổi dựa trên LibreOffice vào trình duyệt, phân tích định dạng WPD và xuất ra PDF. +4. Một tệp sẽ được tải xuống trực tiếp dưới dạng PDF. Chuyển đổi hàng loạt tạo ra một tệp ZIP có tên `wpd-to-pdf.zip`. + +## Tùy chọn + +Không cần cấu hình. Engine LibreOffice tự động xử lý định dạng, phông chữ và bố cục của WPD. + +## Trường hợp sử dụng + +- Mở các tài liệu pháp lý hàng chục năm tuổi được viết bằng WordPerfect +- Chuyển các hồ sơ lưu trữ của chính phủ từ WPD sang định dạng hiện đại +- Chuyển thư viện tài liệu WordPerfect cũ sang PDF để lưu trữ lâu dài +- Chia sẻ tệp WPD với người nhận không cài Corel WordPerfect + +## Mẹo + +- Engine LibreOffice được tải ở lần dùng đầu tiên, việc này mất một lúc. Các lần chuyển đổi sau trong cùng phiên sẽ nhanh hơn. +- Macro WPD phức tạp và reveal codes không được giữ lại, nhưng bố cục hình ảnh, nội dung văn bản và định dạng cơ bản được chuyển sang PDF. + +## Công cụ liên quan + +- [WPS sang PDF](./wps-to-pdf) +- [ODG sang PDF](./odg-to-pdf) diff --git a/docs/vi/tools/wps-to-pdf.md b/docs/vi/tools/wps-to-pdf.md new file mode 100644 index 00000000..53f3e2e6 --- /dev/null +++ b/docs/vi/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS sang PDF +description: Chuyển đổi tài liệu Microsoft Works (WPS) sang PDF ngay trong trình duyệt. Miễn phí, không cần đăng ký, hoàn toàn riêng tư. +--- + +# WPS sang PDF + +Chuyển đổi tệp xử lý văn bản Microsoft Works sang PDF. Microsoft Works được cài sẵn trên các máy tính cá nhân suốt cuối thập niên 1990 và 2000, và nhiều tệp WPS vẫn nằm trong ổ cứng cũ và kho lưu trữ email. Công cụ này mở chúng trong trình duyệt và tạo ra các PDF gọn gàng. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------------- | :----------- | :----------------------------------- | +| Microsoft Works | `.wps` | Tệp xử lý văn bản từ Microsoft Works | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tệp WPS của bạn. Chấp nhận nhiều tệp. +2. Xem lại danh sách tệp. Dùng biểu tượng thùng rác để xóa từng tệp, hoặc nhấp **Thêm tệp** để mở rộng lô. +3. Nhấp **Chuyển sang PDF**. Một engine dựa trên LibreOffice được tải trong trình duyệt và chuyển từng tài liệu WPS sang PDF. +4. Một tệp sẽ được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được gói vào một tệp ZIP có tên `wps-to-pdf.zip`. + +## Tùy chọn + +Không cần cài đặt bổ sung. Trình chuyển đổi xử lý văn bản, định dạng cơ bản và ảnh nhúng từ tệp WPS. + +## Trường hợp sử dụng + +- Khôi phục các tài liệu học tập hoặc công việc cũ được lưu ở định dạng Microsoft Works +- Mở tệp đính kèm email WPS khi bạn không cài Microsoft Works +- Chuyển một kho tệp WPS để di chuyển sang hệ thống tài liệu hiện đại +- In các tài liệu cũ mà các trình soạn thảo văn bản hiện tại không mở được + +## Mẹo + +- Đừng nhầm tệp `.wps` của Microsoft Works với tệp WPS Office. Công cụ này dành riêng cho định dạng Microsoft Works cũ. +- Engine LibreOffice cần một lúc để tải ở lần dùng đầu tiên. Sau khi được tải, các lần chuyển đổi tiếp theo trong cùng phiên chạy nhanh hơn. + +## Công cụ liên quan + +- [WPD sang PDF](./wpd-to-pdf) +- [PUB sang PDF](./pub-to-pdf) diff --git a/docs/vi/tools/xml-to-pdf.md b/docs/vi/tools/xml-to-pdf.md new file mode 100644 index 00000000..1db9b62c --- /dev/null +++ b/docs/vi/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML sang PDF +description: Chuyển đổi tệp XML thành tài liệu PDF có cấu trúc ngay trong trình duyệt. Miễn phí, riêng tư, không xử lý trên máy chủ. +--- + +# XML sang PDF + +Chuyển đổi tệp dữ liệu XML thành tài liệu PDF có cấu trúc, dễ đọc. XML thô rất mạnh nhưng khó đọc với con người. Công cụ này phân tích cây XML, nhận diện các cấu trúc dữ liệu lặp lại và kết xuất chúng thành bảng và phần được định dạng trong PDF A4 nằm ngang. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------- | :----------- | :------------------------------ | +| XML | `.xml` | Mọi tài liệu XML đúng định dạng | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tệp XML của bạn. Có thể xử lý nhiều tệp trong một lô. +2. Xem lại danh sách tệp. Xóa các tệp không cần bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để thêm. +3. Nhấp **Chuyển sang PDF**. Công cụ phân tích cấu trúc XML bằng DOMParser có sẵn của trình duyệt, phân tích hệ thống phân cấp dữ liệu và kết xuất thành PDF bằng jsPDF với định dạng auto-table. +4. Một tệp sẽ được tải xuống dưới dạng PDF. Nhiều tệp được đóng gói vào `xml-to-pdf.zip`. + +## Tùy chọn + +Không cần cấu hình thủ công. Trình chuyển đổi tự động phát hiện cấu trúc XML và chọn bố cục bảng phù hợp. Đầu ra dùng hướng A4 nằm ngang để chứa các tập dữ liệu rộng. + +## Trường hợp sử dụng + +- Biến dữ liệu XML xuất từ cơ sở dữ liệu hoặc API thành báo cáo có thể in +- Tạo bản tóm tắt dễ đọc từ các tệp cấu hình XML +- Chuyển hóa đơn hoặc nhật ký giao dịch dạng XML thành PDF để lưu hồ sơ +- Làm cho sơ đồ trang XML hoặc nguồn cấp RSS dễ đọc ở dạng tài liệu + +## Mẹo + +- XML phải đúng định dạng. Nếu trình phân tích gặp lỗi cú pháp, việc chuyển đổi sẽ thất bại kèm thông báo lỗi mô tả chỉ ra vấn đề. +- Các cấu trúc XML lồng sâu được làm phẳng thành bảng. Để có kết quả tốt nhất, dữ liệu nên có các phần tử anh em lặp lại với các phần tử con nhất quán. +- Các cập nhật tiến trình xuất hiện trong quá trình chuyển đổi, hiển thị từng giai đoạn: đọc, phân tích cú pháp, phân tích cấu trúc và kết xuất. + +## Công cụ liên quan + +- [FB2 sang PDF](./fb2-to-pdf) +- [XPS sang PDF](./xps-to-pdf) +- [Email sang PDF](./email-to-pdf) diff --git a/docs/vi/tools/xps-to-pdf.md b/docs/vi/tools/xps-to-pdf.md new file mode 100644 index 00000000..becbabed --- /dev/null +++ b/docs/vi/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS sang PDF +description: Chuyển đổi tài liệu XPS và OXPS sang định dạng PDF ngay trong trình duyệt. Không tải lên, không cần đăng ký, hoàn toàn riêng tư. +--- + +# XPS sang PDF + +Chuyển đổi tài liệu Microsoft XPS và OXPS thành tệp PDF chuẩn. XPS (XML Paper Specification) là câu trả lời của Microsoft cho PDF, nhưng sự hỗ trợ dành cho nó đã giảm dần trên các nền tảng. Công cụ này giúp những tài liệu đó đọc được trở lại ở mọi nơi. + +## Định dạng được hỗ trợ + +| Định dạng | Phần mở rộng | Ghi chú | +| :-------- | :----------- | :------------------------------------- | +| XPS | `.xps` | Định dạng XPS gốc của Microsoft | +| OXPS | `.oxps` | Open XPS, biến thể theo chuẩn ECMA-388 | + +## Cách hoạt động + +1. Nhấp vào khu vực tải lên hoặc kéo và thả các tệp XPS/OXPS của bạn. Bạn có thể chọn nhiều tệp cùng lúc. +2. Xem lại danh sách tệp. Xóa từng tệp bằng biểu tượng thùng rác, hoặc nhấp **Thêm tệp** để thêm tài liệu. +3. Nhấp **Chuyển sang PDF**. Engine PyMuPDF xử lý từng tài liệu cục bộ ngay trong trình duyệt của bạn. +4. Một tệp sẽ được tải xuống trực tiếp dưới dạng PDF. Nhiều tệp được gói vào một tệp ZIP có tên `xps-converted.zip`. + +## Tùy chọn + +Công cụ này thực hiện chuyển đổi định dạng trực tiếp mà không cần cấu hình bổ sung. Đầu ra giữ nguyên kích thước trang, đồ họa vector, phông chữ và ảnh gốc từ nguồn XPS. + +## Trường hợp sử dụng + +- Mở các tệp XPS nhận từ hệ thống Windows cũ từng mặc định dùng trình điều khiển in XPS +- Chuyển tài liệu OXPS từ Windows 10/11 để chia sẻ với người dùng macOS hoặc Linux +- Lưu trữ các tệp XPS cũ sang định dạng được hỗ trợ rộng rãi hơn +- Giúp người nhận bên ngoài truy cập được các tài liệu chính phủ hoặc doanh nghiệp dạng XPS + +## Mẹo + +- Cả hai phần mở rộng `.xps` và `.oxps` đều được xử lý tự động, bạn có thể trộn chúng trong cùng một lô. +- Nếu tệp XPS gốc được tạo từ trình điều khiển in độ phân giải cao, PDF kết quả giữ nguyên chất lượng đó. Không có việc lấy mẫu lại. + +## Công cụ liên quan + +- [Word sang PDF](./word-to-pdf) +- [XML sang PDF](./xml-to-pdf) diff --git a/docs/zh-TW/contributing.md b/docs/zh-TW/contributing.md new file mode 100644 index 00000000..3750e570 --- /dev/null +++ b/docs/zh-TW/contributing.md @@ -0,0 +1,136 @@ +# 參與貢獻 + +感謝您有興趣為 BentoPDF 做出貢獻!本指南將協助您開始。 + +## 開始使用 + +### 事前準備 + +- Node.js 18+ +- npm 9+ +- Git + +### 設定 + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 專案結構 + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## 新增工具 + +### 步驟 1:建立邏輯檔案 + +建立 `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### 步驟 2:建立 HTML 頁面 + +依照現有的工具範本建立 `src/pages/your-tool.html`。 + +### 步驟 3:註冊工具 + +加入 `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### 步驟 4:加入建置設定 + +將頁面加入 `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### 步驟 5:新增翻譯 + +在 `public/locales/` 中的所有語系檔案加入項目: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## 程式碼風格 + +- 所有新程式碼都使用 TypeScript +- 遵循現有模式以保持一致 +- 提交前執行 `npm run format` +- 正式環境程式碼中不寫註解(建置時會移除註解) + +## Pull Request 流程 + +1. 建立功能分支:`git checkout -b feature/your-feature` +2. 進行修改 +3. 徹底測試:`npm run build` +4. 提交 PR 並附上清楚的說明 + +## 翻譯 + +新增語言請參閱 [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md)。 + +## 貢獻者授權協議 + +在您的 PR 合併之前,您需要簽署我們的 CLA: + +- [個人 CLA(ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [企業 CLA(CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## 取得協助 + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord 社群](https://discord.gg/Bgq3Ay3f2w) + +## 授權 + +BentoPDF 採用雙重授權: + +- **AGPL-3.0**:適用於公開分享完整原始碼的開源專案 +- **商業授權**:適用於專有或閉源應用程式,[以 $79 取得終身授權](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +參與貢獻即表示您同意您的貢獻將依上述條款授權。 diff --git a/docs/zh-TW/getting-started.md b/docs/zh-TW/getting-started.md new file mode 100644 index 00000000..5789b88d --- /dev/null +++ b/docs/zh-TW/getting-started.md @@ -0,0 +1,80 @@ +# 快速入門 + +歡迎使用 BentoPDF!本指南將協助您快速上手。 + +## 什麼是 BentoPDF? + +BentoPDF 是一套免費、開源、以隱私為優先的 PDF 工具箱,**完全在您的瀏覽器中**執行。您的檔案絕不會離開您的裝置,所有處理都透過 WebAssembly(WASM)技術在本機完成。 + +## 快速開始 + +### 選項 1:使用線上版 + +前往 [bentopdf.com](https://www.bentopdf.com) 即可立即使用 BentoPDF,無需安裝。 + +### 選項 2:使用 Docker 自行架設 + +> [!IMPORTANT] +> Office 檔案轉換需要 `SharedArrayBuffer`,而它需要以下全部條件: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - 安全環境(secure context) +> +> `http://localhost` 可用於本機測試,因為瀏覽器將迴路位址視為可信任。`http://192.168.x.x` 或其他區域網路 IP 通常不行,因此從網路中的其他裝置存取時,Word/Excel/PowerPoint 轉換需要 HTTPS。 + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF 提供兩種版本:**自行架設版**(`bentopdf-simple`,即上方所用)適用於內部、團隊或組織部署;**商業版**(`bentopdf:latest`)則由 bentopdf.com 本身以及執行對外公開部署的商業授權持有者使用。兩者提供相同的 PDF 工具,商業版另外加入 bentopdf.com 的主視覺、常見問題、使用者推薦與頁尾。如果不確定,請使用自行架設版。 + +接著在瀏覽器中開啟 `http://localhost:3000`。 + +> [!NOTE] +> 如果您正在準備離線隔離(air-gapped)的 OCR 部署,除了 Tesseract worker、核心執行環境與 traineddata 檔案外,還必須在內部架設 OCR 文字層字型。完整設定請參閱[自行架設](/zh-TW/self-hosting/),包括 `VITE_OCR_FONT_BASE_URL` 與內建的 `ocr-fonts/` 目錄。 + +### 選項 3:從原始碼建置 + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 功能一覽 + +| 類別 | 工具 | +| --------------- | ------------------------------------------------------ | +| **轉換為 PDF** | Word、Excel、PowerPoint、圖片、Markdown、EPUB、MOBI 等 | +| **從 PDF 轉換** | JPG、PNG、文字、Excel、SVG 等 | +| **編輯與註解** | 簽署、螢光標示、塗黑遮蔽、填寫表單、加入印章 | +| **整理** | 合併、分割、旋轉、刪除頁面、重新排序 | +| **最佳化** | 壓縮、修復、平面化、OCR | +| **安全性** | 加密、解密、移除限制 | + +## 瀏覽器支援 + +BentoPDF 在現代瀏覽器上效果最佳: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## 後續步驟 + +- [探索所有工具](/zh-TW/tools/) +- [自行架設 BentoPDF](/zh-TW/self-hosting/) +- [參與專案貢獻](/zh-TW/contributing) diff --git a/docs/zh-TW/index.md b/docs/zh-TW/index.md new file mode 100644 index 00000000..d24c69d2 --- /dev/null +++ b/docs/zh-TW/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: '免費、開源的 PDF 工具' + tagline: 完全在瀏覽器中處理 PDF。免上傳,無伺服器,完整保護隱私。 + actions: + - theme: brand + text: 快速入門 + link: /zh-TW/getting-started + - theme: alt + text: 查看工具 + link: /zh-TW/tools/ + - theme: alt + text: 自行架設 + link: /zh-TW/self-hosting/ + - theme: alt + text: 商業授權 + link: /zh-TW/licensing + +features: + - icon: 🔒 + title: 100% 隱私 + details: 您的檔案絕不離開您的裝置。所有處理都透過 WebAssembly 在您的瀏覽器中本機完成。 + - icon: ⚡ + title: 快速且免費 + details: 免註冊、無限制、無浮水印。永久免費處理無限量的 PDF。 + - icon: 🛠️ + title: 50+ 種工具 + details: 轉換、編輯、合併、分割、壓縮、簽署、OCR 等。一站滿足所有需求。 + + - icon: 🌐 + title: 可自行架設 + details: 部署在您自己的基礎架構上。支援 Docker、Vercel、Netlify、AWS,或搭配自行架設 OCR worker、語言資料與文字層字型的完全離線隔離環境。 +--- + +## 離線 OCR + +如果您在離線隔離或離線環境中自行架設 BentoPDF,OCR 需要的不只是 Tesseract worker 與 traineddata 檔案。可搜尋的 PDF 輸出還需要在內部提供 OCR 文字層字型。 +完整設定請參閱[自行架設](/zh-TW/self-hosting/),包括 `VITE_OCR_FONT_BASE_URL`、內建的 `ocr-fonts/` 目錄,以及更新後的離線隔離工作流程。 diff --git a/docs/zh-TW/licensing.md b/docs/zh-TW/licensing.md new file mode 100644 index 00000000..3f26c0e2 --- /dev/null +++ b/docs/zh-TW/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/zh-TW/self-hosting/#wasm-設定-agpl-元件) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/zh-TW/self-hosting/apache.md b/docs/zh-TW/self-hosting/apache.md new file mode 100644 index 00000000..eca90711 --- /dev/null +++ b/docs/zh-TW/self-hosting/apache.md @@ -0,0 +1,275 @@ +# 使用 Apache 部署 + +使用 Apache HTTP Server 架設 BentoPDF。 + +## 事前準備 + +- Apache 2.4+ +- 已啟用 mod_rewrite +- SSL 憑證(建議) + +## 步驟 1:建置專案 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +若要自訂品牌,請在建置前設定環境變數: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## 步驟 2:複製檔案 + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## 步驟 3:Apache 設定 + +建立 `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## 步驟 4:用於路由的 .htaccess + +建立 `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## 步驟 5:啟用必要模組 + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## 步驟 6:啟用網站 + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## 子目錄部署 + +若要架設在 `/pdf/`: + +1. 以 base URL 建置: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. 更新 `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## 疑難排解 + +### WASM 404 錯誤 + +請確認已設定 MIME 類型: + +```apache +AddType application/wasm .wasm +``` + +### 簽署 PDF 或表單填寫工具顯示空白檢視器(`.mjs` MIME 錯誤) + +如果瀏覽器主控台顯示: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…且失敗的請求以 `.mjs` 結尾,表示您的 Apache 設定缺少 `.mjs → application/javascript` 對應。內建的 PDF 檢視器以 `.mjs` 副檔名提供 ES module 檔案,而 Apache 內建的 `mime.types` 預設並未包含它。 + +加入您的 VirtualHost 或 `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +然後重新載入 Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +確認方式:在瀏覽器 DevTools → Network 分頁中,找到失敗的 `.mjs` 請求並檢查 `Content-Type` 回應標頭。現在應為 `application/javascript`,而不是 `application/octet-stream`。 + +### Rewrite 無法運作 + +確認已啟用 mod_rewrite: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel 轉 PDF 無法運作 + +LibreOffice WASM 需要 `SharedArrayBuffer`,而它需要以下標頭: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +它也需要安全環境(secure context)。`http://localhost` 可用於本機測試,但 `http://192.168.x.x` 或其他區域網路 IP 通常需要 HTTPS。如果標頭已存在但 `window.crossOriginIsolated` 仍為 `false`,請檢查頁面是否透過一般 HTTP 在非迴路位址的來源上開啟。 + +預先壓縮的 `.wasm.gz` 與 `.data.gz` 檔案也需要正確的 `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +請確認已啟用 `mod_headers`:`sudo a2enmod headers` + +### 權限遭拒 + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/zh-TW/self-hosting/aws.md b/docs/zh-TW/self-hosting/aws.md new file mode 100644 index 00000000..22f03fe1 --- /dev/null +++ b/docs/zh-TW/self-hosting/aws.md @@ -0,0 +1,200 @@ +# 部署到 AWS S3 + CloudFront + +在 AWS 上架設 BentoPDF,取得最大的控制權與擴充性。 + +## 架構 + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## 步驟 1:建立 S3 儲存貯體 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## 步驟 2:建置並上傳 + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## 步驟 3:建立 CloudFront 分配 + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +或使用 AWS 主控台: + +1. 前往 CloudFront → Create distribution +2. Origin domain:選擇您的 S3 儲存貯體 +3. 啟用「Origin Access Control」 +4. Default root object:`index.html` +5. 建立分配 + +## 步驟 3b:回應標頭政策(LibreOffice WASM 必需) + +以 LibreOffice 為基礎的轉換(Word、Excel、PowerPoint 轉 PDF)需要 `SharedArrayBuffer`,而它需要特定的回應標頭。請建立 CloudFront 回應標頭政策: + +1. 前往 CloudFront → Policies → Response headers +2. 建立包含以下標頭的自訂政策: + +| 標頭 | 值 | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. 將政策套用到您分配的預設快取行為 + +或透過 CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## 步驟 3c:預先壓縮 WASM 檔案的 S3 中繼資料 + +LibreOffice WASM 檔案已預先壓縮(`.wasm.gz`、`.data.gz`)。請設定正確的 Content-Type 與 Content-Encoding,讓瀏覽器能解壓縮: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning 重要 +若沒有回應標頭政策,`SharedArrayBuffer` 將無法使用,LibreOffice WASM 轉換會停在約 55%。若 `.gz` 檔案沒有正確的 Content-Encoding,瀏覽器會收到原始 gzip 位元組,導致 WASM 編譯失敗。 +::: + +## 步驟 4:S3 儲存貯體政策 + +允許 CloudFront 存取儲存貯體: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## 步驟 5:自訂錯誤頁面 + +將 404 設定為回傳 `index.html` 以支援 SPA 路由: + +1. CloudFront → Error pages +2. 建立自訂錯誤回應: + - HTTP 錯誤代碼:404 + - 回應頁面路徑:`/index.html` + - HTTP 回應代碼:200 + +## 費用估算 + +| 資源 | 預估費用 | +| ------------------------- | ----------- | +| S3 儲存空間(約 500MB) | 約 $0.01/月 | +| CloudFront(1TB 傳輸量) | 約 $85/月 | +| CloudFront(10GB 傳輸量) | 約 $0.85/月 | + +::: tip +對不常存取的檔案使用 S3 Intelligent Tiering 以最佳化成本。 +::: + +## 使用 Terraform 自動化 + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/zh-TW/self-hosting/cloudflare.md b/docs/zh-TW/self-hosting/cloudflare.md new file mode 100644 index 00000000..90668a86 --- /dev/null +++ b/docs/zh-TW/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# 部署到 Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) 提供快速、全球化且頻寬無上限的靜態網站託管。 + +## 快速部署 + +1. 前往 [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. 點選「Create a project」 +3. 連結您的 GitHub 儲存庫 + +## 建置設定 + +| 設定項目 | 值 | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## 環境變數 + +在 Settings → Environment variables 中加入以下項目: + +| 變數 | 值 | +| ----------------------- | ----------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false`(選填) | +| `VITE_BRAND_NAME` | 自訂品牌名稱(選填) | +| `VITE_BRAND_LOGO` | 相對於 `public/` 的標誌路徑(選填) | +| `VITE_FOOTER_TEXT` | 自訂頁尾/版權文字(選填) | +| `VITE_DEFAULT_LANGUAGE` | 預設介面語言,例如 `fr`(選填) | + +## 設定檔 + +在您的 `public` 資料夾中建立 `_headers`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning 重要 +Word/ODT/Excel/PowerPoint 轉 PDF 需要 `Cross-Origin-Embedder-Policy` 與 `Cross-Origin-Opener-Policy` 標頭。缺少它們時,`SharedArrayBuffer` 將無法使用,LibreOffice WASM 引擎會初始化失敗。 +::: + +為 SPA 路由建立 `_redirects`: + +``` +/* /index.html 200 +``` + +## 自訂網域 + +1. 前往您的 Pages 專案 +2. 點選「Custom domains」 +3. 加入您的網域 +4. 若網域位於 Cloudflare 上,Cloudflare 會自動設定 DNS + +## 優點 + +- **免費且無上限的頻寬** +- **全球 CDN**,擁有 300 個以上的邊緣節點 +- **自動 HTTPS** +- 針對 pull request 的**預覽部署** +- **快速建置** + +## 疑難排解 + +### 大型檔案上傳 + +Cloudflare Pages 支援最大 25 MB 的檔案。WASM 模組應該沒問題,但若遇到限制,可以考慮: + +```bash +# Split large files during build +npm run build +``` + +### Worker 大小限制 + +若使用 Cloudflare Workers 進行進階路由,請注意免費方案有 1 MB 的限制。 + +## CORS 代理 Worker(用於數位簽章) + +數位簽章工具需要 CORS 代理來擷取憑證鏈。請部署內附的 worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### 安全功能 + +| 功能 | 說明 | +| ---------------- | ----------------------------- | +| **URL 限制** | 僅允許憑證 URL | +| **檔案大小限制** | 每個請求最大 10MB | +| **速率限制** | 每 IP 每分鐘 60 次(需要 KV) | +| **私人 IP 封鎖** | 封鎖 localhost 與內部 IP | + +### 啟用速率限制 + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### 以代理 URL 建置 + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +或使用 Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **注意:** HMAC 簽章設定請參閱 [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required)。 diff --git a/docs/zh-TW/self-hosting/cors-proxy.md b/docs/zh-TW/self-hosting/cors-proxy.md new file mode 100644 index 00000000..072b132e --- /dev/null +++ b/docs/zh-TW/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# 用於擷取憑證的 CORS 代理 + +數位簽章工具使用 CORS 代理,從外部憑證授權單位(CA)擷取簽發者憑證。這是必要的,因為許多 CA 伺服器的回應不包含 CORS 標頭,導致瀏覽器無法直接擷取。 + +此外,許多 CA 伺服器以一般 HTTP 提供憑證。當您的 BentoPDF 執行個體以 HTTPS 架設時,瀏覽器會封鎖這些 HTTP 請求(混合內容政策)。CORS 代理透過具備正確標頭的 HTTPS 端點轉送請求,同時解決這兩個問題。 + +## 運作方式 + +以憑證簽署 PDF 時: + +1. `zgapdfsigner` 函式庫會嘗試建立完整的憑證鏈 +2. 它會從您憑證的 AIA(Authority Information Access)延伸欄位中內嵌的 URL 擷取簽發者憑證 +3. 這些請求會透過 CORS 代理轉送,由代理加上必要的 `Access-Control-Allow-Origin` 標頭 +4. 代理將憑證資料回傳給瀏覽器 + +## 自行架設 CORS 代理 + +如果您自行架設 BentoPDF,就需要部署自己的 CORS 代理,數位簽章才能搭配需要擷取憑證鏈的憑證使用。 + +### 選項 1:Cloudflare Workers(建議) + +1. **安裝 Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **登入 Cloudflare**: + + ```bash + wrangler login + ``` + +3. **複製 BentoPDF 並更新允許的來源**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + 開啟 `cors-proxy-worker.js`,將 `ALLOWED_ORIGINS` 陣列改為您的網域: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning 重要 + 若未進行此修改,代理會以 **403 Forbidden** 錯誤拒絕來自您網站的所有請求。預設只允許來自 `bentopdf.com` 的請求。 + ::: + +4. **部署代理**: + + ```bash + wrangler deploy + ``` + + 記下您的 worker URL(例如 `https://bentopdf-cors-proxy.your-subdomain.workers.dev`)。 + +5. **以代理 URL 重新建置 BentoPDF**: + + 若使用 Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + 若從原始碼建置: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### 選項 2:自訂後端代理 + +您也可以建立自己的代理端點。需求如下: + +1. 接受帶有 `url` 查詢參數的 GET 請求 +2. 從您的伺服器擷取該 URL(伺服器端沒有 CORS 限制) +3. 回傳帶有以下標頭的回應: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Express.js 實作範例: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## 安全性考量 + +內附的 Cloudflare Worker 具備多項安全措施: + +| 功能 | 說明 | +| --------------------- | ----------------------------------------------------------------------- | +| **來源驗證** | 僅允許來自 `ALLOWED_ORIGINS` 所列網域的請求 | +| **URL 限制** | 僅允許憑證 URL(`.crt`、`.cer`、`.pem`、`/certs/`、`/ocsp`、`/crl`) | +| **私人 IP 封鎖** | 封鎖 IPv4/IPv6 私人範圍、link-local、迴路位址、十進位 IP 與雲端中繼資料 | +| **Content-Type 安全** | 僅回傳安全的憑證 MIME 類型,封鎖上游 content-type 注入 | +| **檔案大小限制** | 以 10MB 上限串流回應,超過時中途中止下載 | +| **速率限制** | 每個 IP 或 IPv6 /64 每分鐘 60 次請求(需要 KV,KV 發生錯誤時放行) | +| **HMAC 簽章** | 選用的用戶端簽署(嚇阻隨意濫用) | + +### DNS rebinding(在 Cloudflare 以外自行架設) + +worker 會拒絕任何解析為私人或內部 IP 的 URL。它無法使用固定的主機允許清單,因為憑證鏈 URL 指向簽發該憑證的 CA(FNMT、企業 CA 等),事先無法得知目的地。這留下一個小小的 rebinding 空窗:掌控自己網域 DNS 的人,可以在安全檢查時回傳公開 IP,片刻後在實際請求時回傳私人 IP。 + +在 Cloudflare 上這無法被利用:Workers 無法連線到私人 IP 或 `169.254.169.254` 中繼資料端點,因此 rebind 不會打到任何東西。只要別給 worker 進入的管道即可:不要附加 Tunnel、Service 或私人網路繫結(它只需要 `RATE_LIMIT_KV`)。 + +如果您在 Cloudflare 以外(workerd、Node 等)於 VPC 內執行,執行環境*確實能*連線到內部 IP。請在前方設置對外防火牆並封鎖私人範圍:`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`、`127.0.0.0/8`、`169.254.0.0/16`,以及對應的 IPv6 範圍。離開 Cloudflare 後,應用程式碼無法強制執行這點。 + +## 停用代理 + +如果您不想使用 CORS 代理,請將環境變數設為空字串: + +``` +VITE_CORS_PROXY_URL= +``` + +**注意**:沒有代理時,使用需要從外部擷取憑證鏈的憑證(例如 FNMT 或部分企業 CA)簽署會失敗,並出現「Failed to fetch」錯誤。 + +## 疑難排解 + +### "Signing error: TypeError: Failed to fetch" + +這通常代表以下其中之一: + +1. **未設定 CORS 代理**:設定 `VITE_CORS_PROXY_URL` 並重新建置 +2. **混合內容遭封鎖**:您的網站是 HTTPS,但憑證的簽發者 URL 是 HTTP。CORS 代理可解決此問題。 +3. **CORS 代理拒絕您的來源**:確認您的網域在 `cors-proxy-worker.js` 的 `ALLOWED_ORIGINS` 陣列中 + +### 代理回傳「403 Forbidden」 + +您的網域不在 `ALLOWED_ORIGINS` 清單中。請編輯 `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +然後重新部署:`npx wrangler deploy` + +### 測試代理 + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### 不需要代理的憑證 + +有些憑證在 P12/PFX 檔案中已包含完整憑證鏈,不需要從外部擷取: + +- 自簽憑證 +- 部分會附帶中繼憑證的商業 CA +- 您手動組合了完整憑證鏈的憑證 diff --git a/docs/zh-TW/self-hosting/docker.md b/docs/zh-TW/self-hosting/docker.md new file mode 100644 index 00000000..ca68a70d --- /dev/null +++ b/docs/zh-TW/self-hosting/docker.md @@ -0,0 +1,622 @@ +# 使用 Docker / Podman 部署 + +在正式環境中自行架設 BentoPDF 最簡單的方式。 + +> [!IMPORTANT] +> **Office 檔案轉換所需的標頭** +> +> 以 LibreOffice 為基礎的工具(Word、Excel、PowerPoint 轉換)需要以下 HTTP 標頭才能支援 `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 頁面也必須在安全環境(secure context)中提供。`http://localhost` 可用於本機測試,但 `http://192.168.x.x` 或其他區域網路 IP 通常不符合條件,因此即使標頭存在,透過一般 HTTP 進行 Office 轉換仍會失敗。 +> +> 官方容器映像已包含這些標頭。若使用反向代理(Traefik、Caddy 等),請確保保留或加入這些標頭,並在非迴路位址存取時使用 HTTPS。 + +> [!TIP] +> **Podman 使用者:** 只要將 `docker` 換成 `podman`、將 `docker-compose` 換成 `podman-compose`,所有 `docker` 指令都可在 Podman 上使用。 + +## 快速開始 + +> [!TIP] +> BentoPDF 提供兩種版本: +> +> - **自行架設版**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**行銷介面(沒有主視覺、常見問題、使用者推薦、頁尾)。適用於內部、團隊或組織部署。它**不是**功能縮減的「精簡」版本。 +> - **商業版**:`ghcr.io/alam00000/bentopdf:latest`。完整的行銷網站,由 bentopdf.com 本身以及執行對外公開部署的商業授權持有者使用。 +> +> 如果不確定,請拉取自行架設版。 + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +建立 `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +執行: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## 建置自己的映像 + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +建置並執行: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## 環境變數 + +| 變數 | 說明 | 預設值 | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | 建置自行架設版(隱藏 bentopdf.com 行銷介面:主視覺、常見問題、使用者推薦、頁尾)。所有 PDF 工具都會保留。 | `false` | +| `BASE_URL` | 部署到子目錄 | `/` | +| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM 模組 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Ghostscript WASM 模組 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | CoherentPDF WASM 模組 URL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | OCR worker 指令碼 URL | _(空白;使用 Tesseract.js 預設 CDN)_ | +| `VITE_TESSERACT_CORE_URL` | OCR 核心執行環境目錄 | _(空白;使用 Tesseract.js 預設 CDN)_ | +| `VITE_TESSERACT_LANG_URL` | OCR traineddata 目錄 | _(空白;使用 Tesseract.js 預設 CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | 在介面中顯示的 OCR 語言,以逗號分隔 | _(空白;顯示完整清單)_ | +| `VITE_OCR_FONT_BASE_URL` | OCR 文字層字型目錄 | _(空白;使用遠端 Noto 字型 URL)_ | +| `VITE_DEFAULT_LANGUAGE` | 預設介面語言 | `en` | +| `VITE_BRAND_NAME` | 自訂品牌名稱 | `BentoPDF` | +| `VITE_BRAND_LOGO` | 相對於 `public/` 的標誌路徑 | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | 自訂頁尾/版權文字 | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | 要隱藏的工具 ID,以逗號分隔 | _(空白;啟用所有工具)_ | +| `DISABLE_GITHUB_STARS` | 頁面載入時略過擷取 GitHub 星星數,並從 CSP 移除 `api.github.com`。Simple Mode 建置一律略過。 | `false` | +| `SITE_URL` | 寫入 canonical、hreflang 與 sitemap 連結的公開 URL。除非您希望搜尋引擎將您的部署視為獨立網站,否則請保留預設值。 | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | 使用自訂 `SITE_URL` 時,每個頁面都會標記為 `noindex`,避免您的副本在搜尋結果中與 bentopdf.com 競爭。設為 `true` 可讓搜尋引擎建立索引。 | `false` | + +WASM 模組 URL 已預先設定為 CDN 預設值,所有進階功能開箱即用。離線隔離或自行架設的部署可覆寫這些值。 + +### 搜尋引擎 + +預設情況下,每個頁面都會向搜尋引擎指出 bentopdf.com 為原始來源,因此您的部署不會被視為重複內容。私人或內部執行個體不需要做任何變更。 + +- **讓您的執行個體完全不出現在搜尋結果中:** 以 `-e ROBOTS_NOINDEX=true` 執行容器。只需要重新啟動,不需要重新建置。 +- **讓您的執行個體在搜尋結果中成為獨立網站:** 以 `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true` 建置。若沒有 `ALLOW_INDEXING=true`,自訂 `SITE_URL` 會將每個頁面標記為 `noindex`。 + +### Content-Security-Policy + +nginx 映像附帶強制執行的 `Content-Security-Policy` 標頭。CSP 的 `script-src`、`connect-src` 與 `font-src` 指令會在**建置時**根據上方的 `VITE_*` URL 變數**產生**:您透過 `--build-arg` 傳入的任何主機都會自動加入政策。 + +因此: + +- 若您在建置時覆寫 `VITE_CORS_PROXY_URL` 或 `VITE_WASM_*_URL`,CSP 會自動允許這些來源,無需額外設定。 +- 對於 `cdn.jsdelivr.net` 上的 URL,`script-src` 只允許確切版本的套件資料夾,例如 `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`,而不是整個 CDN。jsDelivr 提供任何公開的 npm 套件或 GitHub 儲存庫,若允許整個主機,任何套件都能在您的執行個體上執行。其他主機上的 URL 則依來源允許。 +- 若您在*執行時*透過應用程式內的進階設定頁面設定自訂 WASM URL,這些來源**不在** CSP 中,瀏覽器會封鎖對它們的擷取。這也適用於 `cdn.jsdelivr.net` 上同一套件的不同版本,因為只允許建置時設定的版本。執行時設定僅供實驗用途;若要永久使用自訂 URL,請設定對應的 `VITE_*` 建置參數。 +- 覆寫全部三個 `VITE_WASM_*_URL` 值的離線隔離部署,也會從 CSP 移除這些 `cdn.jsdelivr.net` 套件資料夾(每個預設值都是被取代,而不是附加)。`cdn.jsdelivr.net` 上的 Tesseract OCR 預設值會留在政策中,直到您也設定三個 `VITE_TESSERACT_*` 值。同樣地,設定 `VITE_CORS_PROXY_URL` 會取代公開的 `bentopdf-cors-proxy.bentopdf.workers.dev` 預設值。 + +CSP 在 `script-src` 中包含 `'unsafe-eval'`,因為 LibreOffice WASM 執行環境(用於 Word/Excel/PowerPoint 轉換工具)與 wasm-vips 影像函式庫(用於 PDF 轉 TIFF)會透過 `new Function()` 編譯內部分派程式碼。移除它會使這些工具無法運作。如果您以 `SIMPLE_MODE`(不含 LibreOffice)建置且不需要 PDF 轉 TIFF,可以手動編輯產生的 `security-headers.conf` 移除 `'unsafe-eval'`,以取得更嚴格的政策。 + +OCR 方面,將 `VITE_TESSERACT_*` 變數留空即使用預設的線上資源,或三個一起設定以使用自行架設/離線 OCR。部分覆寫 OCR 設定會被拒絕,因為 worker、核心執行環境與 traineddata 目錄必須相符。若要完全離線產生可搜尋的 PDF,也請設定 `VITE_OCR_FONT_BASE_URL`,讓 OCR 文字層字型從您的內部伺服器載入,而不是公開的 Noto 字型 URL。 + +`VITE_DEFAULT_LANGUAGE` 設定首次造訪者的介面語言。支援的值:`en`、`ar`、`be`、`fr`、`de`、`es`、`zh`、`zh-TW`、`vi`、`tr`、`id`、`it`、`pt`、`nl`、`da`。使用者仍可切換語言,此設定只會變更預設值。 + +範例: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### 自訂品牌 + +將預設的 BentoPDF 標誌、名稱與頁尾文字換成您自己的。將標誌檔案放在 `public/` 資料夾(或使用現有圖片),然後在建置時傳入品牌變數: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +品牌設定在完整模式與 Simple Mode 中皆可使用,並可與所有其他建置時選項搭配。 + +### 停用特定工具 + +基於法規遵循或安全需求,可從介面隱藏工具。停用的工具會從首頁、搜尋結果、鍵盤快速鍵與工作流程建構器中移除。直接以 URL 存取會顯示「工具無法使用」頁面。 + +工具 ID 是不含 `.html` 的頁面 URL。例如工具位於 `bentopdf.com/edit-pdf.html` 時,ID 為 `edit-pdf`。 + +#### 查詢工具 ID + +最簡單的方法:在 BentoPDF 中開啟任一工具並查看 URL。路徑的最後一段(不含 `.html`)就是工具 ID。 + +
+完整工具 ID 清單 + +**編輯與註解:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**轉換為 PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**從 PDF 轉換:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**整理與管理:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**最佳化與修復:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**安全性:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### 選項 1:建置時(Docker 建置參數) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +這會將停用清單寫入 JavaScript bundle。變更時需要重新建置。 + +#### 選項 2:執行時(config.json) + +將 `config.json` 檔案掛載到提供服務的目錄,無需重新建置: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +或使用 Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +兩種方法可以合併使用,清單會合併。只要工具出現在其中任一清單,就會被停用。 + +#### 停用編輯器功能 + +您也可以停用 PDF 編輯器中的特定功能(例如塗黑遮蔽、註解、表單),而不停用整個編輯器工具。在您的 `config.json` 中加入 `editorDisabledCategories`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+完整編輯器類別清單 + +**縮放:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**註解:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**形狀:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**表單:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**塗黑遮蔽:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**文件:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**頁面:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**面板:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**工具:** `tools`, `pan`, `pointer`, `capture` + +**選取:** `selection`, `selection-copy` + +**歷程記錄:** `history`, `history-undo`, `history-redo` + +
+ +類別具有階層關係:停用上層類別(例如 `annotation`)會停用其所有子類別。 + +### 停用 GitHub 星星計數器 + +導覽列會顯示即時的 GitHub 星星數,於頁面載入時從 `api.github.com` 擷取。這是唯一一個並非用於 PDF 功能的外部請求。在建置時停用它,即可從 bundle 移除擷取程式碼,並從 Content-Security-Policy 移除 `api.github.com`: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Mode 建置(`bentopdf-simple`)一律略過星星計數器,此旗標只在商業版或自訂完整建置時需要。 + +### 自訂 WASM URL(離線隔離 / 自行架設) + +> [!IMPORTANT] +> WASM URL 會在**建置時**寫入 JavaScript。WASM 檔案在執行時由**使用者的瀏覽器**下載,Docker 不會在建置期間下載它們。在離線隔離網路中,您必須將 WASM 檔案架設在瀏覽器可連線的內部伺服器上。 + +**完整離線隔離工作流程:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +`--ocr-languages` 請使用 `bash scripts/prepare-airgap.sh --list-ocr-languages` 列出的代碼,或以 `bash scripts/prepare-airgap.sh --search-ocr-language ` 依名稱搜尋。以受限的 OCR 子集建置時,請將相同代碼傳給 `VITE_TESSERACT_AVAILABLE_LANGUAGES`,讓應用程式只顯示已打包的語言。若要完全離線輸出 OCR,也請架設內附的 `ocr-fonts/` 目錄,並將 `VITE_OCR_FONT_BASE_URL` 指向它。 + +將變數設為空字串即可停用該模組(使用者必須透過進階設定手動設定)。 + +## 自訂連接埠 + +預設情況下,BentoPDF 在容器內監聽 `8080` 連接埠。若要變更,請在執行時設定 `PORT` 環境變數: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| 變數 | 說明 | 預設值 | +| ------ | ------------------------- | ------ | +| `PORT` | 容器內的 Nginx 監聽連接埠 | `8080` | + +這在標準與 nonroot Dockerfile 中皆可使用。 + +## 自訂使用者 ID(PUID/PGID) + +對於需要以特定非 root 使用者執行的環境(NAS 裝置、具有安全性內容的 Kubernetes、組織政策),BentoPDF 提供另一個支援 LSIO 風格 PUID/PGID 的 Dockerfile。 + +### 建置並執行 + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### 環境變數 + +| 變數 | 說明 | 預設值 | +| -------------- | --------------------- | ------- | +| `PUID` | 執行時使用的使用者 ID | `1000` | +| `PGID` | 執行時使用的群組 ID | `1000` | +| `PORT` | Nginx 監聽連接埠 | `8080` | +| `DISABLE_IPV6` | 停用 IPv6 監聽 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### 運作方式 + +容器以 root 啟動,建立具有指定 PUID/PGID 的使用者,調整所有可寫入目錄的擁有權,然後使用 `su-exec` 降低權限。nginx 程序完全以您指定的使用者執行。 + +> [!NOTE] +> 標準 `Dockerfile` 使用 `nginx-unprivileged`(UID 101),建議大多數部署使用。只有在需要特定 UID/GID 時才使用 `Dockerfile.nonroot`。 + +> [!WARNING] +> PUID/PGID 不可為 `0`(root)。entrypoint 會驗證輸入,遇到無效值時會以錯誤結束。 + +## 搭配 Traefik(反向代理) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## 搭配 Caddy(反向代理) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile 設定: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## 資源限制 + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet(Systemd 整合) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) 可讓您將 Podman 容器作為 systemd 服務執行。非常適合在 Linux 系統上進行正式環境部署。 + +### 基本 Quadlet 設定 + +在 `~/.config/containers/systemd/bentopdf.container`(使用者)或 `/etc/containers/systemd/bentopdf.container`(系統)建立容器單元檔案: + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### 啟用並啟動 + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> 若為全系統部署,請使用不帶 `--user` 旗標的 `systemctl`,並將檔案放在 `/etc/containers/systemd/`。 + +### 搭配健康檢查的 Quadlet + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### 使用 Quadlet 自動更新 + +有新映像可用時,Podman 可以自動更新容器: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadlet 網路設定 + +若需自訂網路設定,請建立網路檔案 `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +然後在容器檔案中參照它: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## 更新 + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/zh-TW/self-hosting/hostinger.md b/docs/zh-TW/self-hosting/hostinger.md new file mode 100644 index 00000000..71450adc --- /dev/null +++ b/docs/zh-TW/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# 部署到 Hostinger + +[Hostinger](https://hostinger.com) 是熱門的共享主機服務商。本指南說明如何將 BentoPDF 部署到 Hostinger 的共享主機。 + +## 事前準備 + +- 可使用檔案管理員的 Hostinger 主機方案 +- 本機已安裝 Node.js 以進行建置 + +## 步驟 1:建置專案 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +建置完成的檔案會位於 `dist` 資料夾。 + +## 步驟 2:上傳到 Hostinger + +### 根網域部署 + +1. 登入您的 Hostinger 帳號 +2. 前往 **File Manager** → **public_html** +3. **刪除**所有現有檔案(如有需要請先備份) +4. 將本機 `dist` 資料夾的所有內容**上傳**到 `public_html` + +### 子目錄部署 + +若部署到子目錄(例如 `yourdomain.com/pdf-tools/`): + +1. 以正確的 base URL 建置: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. 在 Hostinger 中建立資料夾: + - 前往 **File Manager** → **public_html** + - 建立新資料夾:`pdf-tools` +3. 將 `dist` 的所有內容上傳到 `public_html/pdf-tools/` + +## 步驟 3:建立 .htaccess 檔案 + +在部署資料夾的根目錄(`public_html` 或 `public_html/pdf-tools/`)建立 `.htaccess` 檔案: + +::: warning 重要 +子目錄部署時,請將 `RewriteBase /` 改為 `RewriteBase /pdf-tools/`(或您的資料夾名稱)。 +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## 子目錄 .htaccess 範例 + +若為 `yourdomain.com/pdf-tools/`,請更新以下幾行: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## 疑難排解 + +### WASM 檔案無法載入 + +請確認 `.htaccess` 中已正確設定 MIME 類型: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice 工具無法運作 + +安全標頭對 SharedArrayBuffer 至關重要: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +如果標頭未套用,請聯絡 Hostinger 客服啟用 `mod_headers`。 + +### 重新整理頁面時出現 404 錯誤 + +請確認 `.html` 副檔名規則與語言路由設定正確。BentoPDF 使用靜態 HTML 檔案,而不是 SPA 路由: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### 檔案上傳限制 + +Hostinger 可能有檔案大小限制。若批次上傳失敗,請另外單獨上傳 WASM 檔案。 diff --git a/docs/zh-TW/self-hosting/index.md b/docs/zh-TW/self-hosting/index.md new file mode 100644 index 00000000..de7ca8cb --- /dev/null +++ b/docs/zh-TW/self-hosting/index.md @@ -0,0 +1,538 @@ +# 自行架設指南 + +BentoPDF 可以架設在您自己的基礎設施上。本指南介紹多種部署方式。 + +## 使用 Docker / Podman 快速開始 + +自行架設 BentoPDF 最快的方式: + +> [!TIP] +> BentoPDF 提供兩種建置版本: +> +> - **自行架設版**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**行銷介面(沒有主視覺、常見問題、使用者推薦與頁尾)。適合內部、團隊或組織部署。它**不是**功能縮減的「精簡」版本。 +> - **商業版**:`ghcr.io/alam00000/bentopdf:latest`。完整的行銷網站,bentopdf.com 本身以及執行公開部署的商業授權持有者都使用此版本。 +> +> 如果不確定:請使用自行架設版。 + +> [!IMPORTANT] +> Office 檔案轉換需要 `SharedArrayBuffer`,這表示應用程式必須同時具備跨來源隔離,並從安全環境提供服務。官方映像檔已會傳送所需的 COOP/COEP 標頭,但瀏覽器仍會在純 HTTP 的區域網路來源(例如 `http://192.168.x.x`)上停用 `SharedArrayBuffer`。 +> +> `http://localhost` 僅適用於同一裝置上的測試。如果使用者透過區域網路 IP 或主機名稱存取 BentoPDF,請以 HTTPS 終止連線。 + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +或使用 Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet(Linux Systemd) + +將 BentoPDF 作為 systemd 服務執行。建立 `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +完整的 Quadlet 說明請參閱 [Docker 部署指南](/zh-TW/self-hosting/docker)。 + +## 從原始碼建置 + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## 設定選項 + +### 自行架設版(Simple Mode) + +自行架設版(`bentopdf-simple` 映像檔,也稱為 Simple Mode)在**功能上與商業版完全相同**:所有 PDF 工具都在,且行為一致。它只是隱藏了僅在 bentopdf.com 本身或商業公開部署上才有意義的行銷介面。**它不是功能縮減的「精簡」版本。** + +**自行架設版隱藏的內容**(僅限外觀,未移除任何 PDF 功能): + +- 導覽列、主視覺區塊、功能區塊、常見問題、使用者推薦、頁尾 +- 將頁面標題改為「PDF 工具」 + +**自行架設版保留的內容**(所有實際處理 PDF 的部分): + +- 所有 PDF 工具(合併、分割、編輯、簽署、OCR、Office 轉換等) +- 自訂品牌支援,以及所有建置時與執行時設定 + +商業版(`ghcr.io/alam00000/bentopdf:latest`)是 bentopdf.com 本身所使用的版本,也供執行公開部署的商業授權持有者使用。它額外加入了主視覺、常見問題、使用者推薦與頁尾,這些在內部工具上並不合適。 + +如果您是為團隊、組織或作為內部工具自行架設 BentoPDF,請使用自行架設版: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +完整詳情請參閱 [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md)。 + +### 商業版(以您自己的品牌進行公開部署) + +商業版(`bentopdf` 映像檔,沒有 `-simple` 後綴)是 bentopdf.com 本身所使用的版本。它在所有 PDF 工具之外,還包含完整的行銷網站(主視覺、功能、常見問題、使用者推薦、頁尾)。當您想要**以自己的品牌將 BentoPDF 部署為公開的 PDF 服務**時,請使用此版本,例如: + +- 您在自己的網域上將 BentoPDF 作為託管 SaaS 提供給終端使用者 +- 您想要完整的登陸頁體驗(行銷區塊加上工具),而不只是單純的工具介面 +- 您是將 BentoPDF 嵌入商業產品的商業授權持有者 + +**直接執行**(使用 BentoPDF 品牌,方便預覽此版本): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**以您自己的品牌建置**(典型的商業工作流程): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +其他所有建置時選項(`BASE_URL`、`VITE_DEFAULT_LANGUAGE`、`DISABLE_TOOLS`、WASM URL 覆寫等)的運作方式都與自行架設版相同。 + +::: warning 授權 +在 BentoPDF 的兩種授權選項下,都可以執行商業版: + +- **AGPL-3.0**(免費):前提是您的部署以 AGPL 公開完整原始碼,包括任何品牌修改與周邊商業邏輯。 +- **商業授權**(終身 $79):適用於不公開品牌分支或商業程式碼的閉源或專有部署。 + +完整比較請參閱[授權頁面](https://www.bentopdf.com/licensing)。採用 AGPL 授權的 WASM 模組(PyMuPDF、Ghostscript、CoherentPDF)會在執行時從 CDN 載入,因此不會進入您的映像檔,也不會改變您的授權狀態。 +::: + +### Base URL + +部署到子目錄: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### 自訂品牌 + +在建置時將預設的 BentoPDF 標誌、名稱與頁尾文字替換為您自己的: + +| 變數 | 說明 | 預設值 | +| ------------------ | --------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | 顯示於頁首與頁尾的品牌名稱 | `BentoPDF` | +| `VITE_BRAND_LOGO` | 相對於 `public/` 的標誌路徑 | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | 自訂頁尾或版權文字 | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +或透過 Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +品牌設定在完整模式與 Simple Mode 下皆可使用,並可與其他所有建置時選項(`BASE_URL`、`SIMPLE_MODE`、`VITE_DEFAULT_LANGUAGE`)搭配使用。 + +### 停用特定工具 + +基於合規或安全考量隱藏個別工具。停用的工具會從首頁、搜尋、快捷鍵、工作流程建構器以及直接 URL 存取中移除。 + +工具 ID 是去掉 `.html` 的頁面 URL:開啟任一工具並查看 URL(例如 `edit-pdf`、`sign-pdf`、`encrypt-pdf`)。 + +**建置時**(寫入套件中): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**執行時**(無需重新建置,掛載 `config.json` 即可): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +兩種方式可以同時使用,清單會合併。 + +您也可以在 `config.json` 中加入 `editorDisabledCategories`,停用 PDF 編輯器中的特定功能(例如塗黑),而不必停用整個工具。完整類別清單請參閱 [Docker 指南](/zh-TW/self-hosting/docker#停用編輯器功能)。 + +## 部署指南 + +選擇您的平台: + +- [Vercel](/zh-TW/self-hosting/vercel) +- [Netlify](/zh-TW/self-hosting/netlify) +- [Cloudflare Pages](/zh-TW/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/zh-TW/self-hosting/aws) +- [Hostinger](/zh-TW/self-hosting/hostinger) +- [Nginx](/zh-TW/self-hosting/nginx) +- [Apache](/zh-TW/self-hosting/apache) +- [Docker](/zh-TW/self-hosting/docker) +- [Kubernetes](/zh-TW/self-hosting/kubernetes) +- [CORS 代理](/zh-TW/self-hosting/cors-proxy) - 數位簽章所需 + +## 常見問題 + +### Word / ODT / Excel / PowerPoint 轉 PDF 卡住(SharedArrayBuffer 無法使用) + +**症狀**:以 LibreOffice 為基礎的文件轉換(Word、ODT、Excel、PowerPoint 轉 PDF)卡在約 55% 或無法開始。瀏覽器主控台可能顯示: + +> `ReferenceError: SharedArrayBuffer is not defined` + +…或 `window.crossOriginIsolated` 回報 `false`,或 WASM 編譯回報 `expected magic word 00 61 73 6d, found 1f 8b 08 08`。 + +**原因**:LibreOffice WASM 需要 `SharedArrayBuffer`,而瀏覽器只有在頁面**跨來源隔離**且從**安全環境**提供時才會啟用它。這表示必須同時滿足兩個條件: + +1. 每個回應都包含以下兩個標頭: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. 頁面從 `https://...` 或 `http://localhost` 提供。區域網路 IP 上的純 HTTP(例如 `http://192.168.x.x`)不算安全環境,瀏覽器會在那裡停用 `SharedArrayBuffer`。 + +`00 61 73 6d / 1f 8b 08 08` 不符是另一個子症狀:預先壓縮的 `.wasm.gz` / `.data.gz` 檔案缺少 `Content-Encoding: gzip` 回應標頭,因此瀏覽器收到的是原始 gzip 位元組,而非解壓縮後的 WASM。 + +**修正**:請參閱您平台的部署指南以取得確切設定: + +- [Nginx →](/zh-TW/self-hosting/nginx#word-odt-excel-轉-pdf-無法運作) +- [Apache →](/zh-TW/self-hosting/apache#word-odt-excel-轉-pdf-無法運作) +- [AWS S3 + CloudFront →](/zh-TW/self-hosting/aws#步驟-3b-回應標頭政策-libreoffice-wasm-必需) +- [Cloudflare Pages →](/zh-TW/self-hosting/cloudflare#設定檔)(`_headers` 檔案) +- [Netlify →](/zh-TW/self-hosting/netlify#word-odt-excel-轉-pdf-卡在-55)(`netlify.toml`) +- [Vercel →](/zh-TW/self-hosting/vercel#word-odt-excel-轉-pdf-無法運作)(`vercel.json`) +- [Hostinger →](/zh-TW/self-hosting/hostinger#libreoffice-工具無法運作)(`.htaccess`) +- [Kubernetes →](/zh-TW/self-hosting/kubernetes#確保-sharedarraybuffer-標頭仍然有效-ingress-gateway) +- **Docker**:由內建的 nginx 設定自動處理,無需任何操作。 + +**驗證**:在任一 BentoPDF 頁面開啟開發者工具主控台並執行: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +如果頁面使用 HTTPS 或 `http://localhost`,且每個回應都帶有 COEP/COOP 兩個標頭,兩項檢查都會通過。如果您使用的是 `http://192.168.x.x` 或其他非迴路的 HTTP 來源,請以 HTTPS 終止連線,沒有僅靠標頭就能解決的方法。 + +### `.mjs` 檔案以 `application/octet-stream` 提供 + +**症狀**:簽署 PDF / 表單填寫器 / 某些其他工具顯示空白檢視器或無法載入。瀏覽器主控台回報: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**原因**:您的網頁伺服器或反向代理沒有 `.mjs` 檔案的 MIME 類型對應(內建的 PDF 檢視器以此副檔名提供 ES 模組)。許多預設伺服器設定會將無法辨識的副檔名設為 `application/octet-stream`,而瀏覽器會拒絕將其作為 ES 模組執行。 + +**修正**:請參閱您平台的部署指南以取得確切設定片段: + +- [Nginx →](/zh-TW/self-hosting/nginx#簽署-pdf-或表單填寫器顯示空白檢視器-mjs-mime-錯誤) +- [Apache →](/zh-TW/self-hosting/apache#簽署-pdf-或表單填寫工具顯示空白檢視器-mjs-mime-錯誤) +- [AWS S3 + CloudFront →](/zh-TW/self-hosting/aws#步驟-2-建置並上傳)(請參閱 `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/zh-TW/self-hosting/kubernetes#mjs-mime-類型錯誤-簽署-pdf-表單填寫器-iframe-空白) +- **Docker、Vercel、Netlify、Cloudflare Pages、Hostinger**:自動處理,無需任何操作。 + +**驗證**:開啟開發者工具 → 網路分頁,找到失敗的 `.mjs` 請求,檢查 `Content-Type` 回應標頭。它應該是 `application/javascript`。如果仍是 `application/octet-stream`,可能是外層的反向代理或 CDN 重新判斷了類型,請檢查服務鏈中的每一層。 + +## WASM 設定(AGPL 元件) + +BentoPDF 的原始碼**不內含** AGPL 授權的處理函式庫,但已**預先設定 CDN URL**,讓所有功能開箱即用,無需手動設定。 + +::: tip 預設零設定 +自 v2.0.0 起,WASM 模組已透過環境變數預先設定為從 jsDelivr CDN 載入。所有進階功能皆可立即使用,使用者無需任何設定。 +::: + +| 元件 | 授權 | 功能 | +| --------------- | -------- | ------------------------------------------ | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS 轉換、圖片擷取、表格擷取 | +| **Ghostscript** | AGPL-3.0 | PDF/A 轉換、壓縮、歪斜校正、點陣化 | +| **CoherentPDF** | AGPL-3.0 | 目錄、附件、保留書籤的 PDF 合併 | + +### 預設環境變數 + +這些設定位於 `.env.production`,並在建置時寫入: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### 覆寫 WASM URL + +您可以在建置時為自訂部署覆寫預設值: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +若要完全停用某個模組(要求使用者透過進階設定手動設定),請將其變數設為空字串。 + +對於 OCR,您可以將所有 `VITE_TESSERACT_*` 變數留空並使用預設的線上資源,或同時設定 worker/core/lang URL 以自行架設或離線使用 OCR。如果只內含特定 OCR 語言,也請將 `VITE_TESSERACT_AVAILABLE_LANGUAGES` 設為相同的逗號分隔代碼,讓介面只提供已安裝的語言,不支援的選擇則會以說明性錯誤失敗。若要完全離線產生可搜尋的 PDF,也請將 `VITE_OCR_FONT_BASE_URL` 設為提供內建 OCR 字型的內部目錄。 + +使用者也可以隨時透過介面中的**進階設定**覆寫這些預設值:儲存在瀏覽器中的使用者覆寫優先於環境預設值。 + +### 實體隔離 / 離線部署 + +適用於無法連上網際網路的網路(政府、醫療、金融等)。WASM URL 在**建置時**寫入 JavaScript,實際的 WASM 檔案則在執行時由**使用者的瀏覽器**下載。因此您需要在可連網的機器上準備好一切,再將其傳入隔離網路。 + +#### 自動化腳本(建議) + +內附的 `prepare-airgap.sh` 腳本可自動完成整個流程:下載 WASM 套件、建置 Docker 映像檔,並產生附有設定腳本的獨立套件。 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +這會產生一個套件目錄: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +透過 USB、內部成品儲存庫或核准的方式將套件傳入實體隔離網路。然後執行內附的設定腳本: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +設定腳本會載入 Docker 映像檔、解壓縮 WASM 檔案,並可選擇啟動容器。 + +**腳本選項:** + +| 旗標 | 說明 | 預設值 | +| ------------------------------ | -------------------------------------------- | -------------------------- | +| `--wasm-base-url ` | WASM 在內部的託管位置 | _(必填,缺少時會提示)_ | +| `--image-name ` | Docker 映像檔標籤 | `bentopdf` | +| `--output-dir ` | 輸出套件目錄 | `./bentopdf-airgap-bundle` | +| `--simple-mode` | 啟用 Simple Mode | 關閉 | +| `--base-url ` | 子目錄 Base URL(例如 `/pdf/`) | `/` | +| `--language ` | 預設介面語言(例如 `fr`、`de`) | _(無)_ | +| `--brand-name ` | 自訂品牌名稱 | _(無)_ | +| `--brand-logo ` | 相對於 `public/` 的標誌路徑 | _(無)_ | +| `--footer-text ` | 自訂頁尾文字 | _(無)_ | +| `--ocr-languages ` | 要內含的 OCR 語言(逗號分隔) | `eng` | +| `--list-ocr-languages` | 列出支援的 OCR 代碼與名稱後結束 | 關閉 | +| `--search-ocr-language ` | 依名稱或縮寫搜尋 OCR 代碼 | 關閉 | +| `--dockerfile ` | 要使用的 Dockerfile | `Dockerfile` | +| `--skip-docker` | 略過 Docker 建置與匯出 | 關閉 | +| `--skip-wasm` | 略過 WASM 下載(重複使用現有的 `.tgz` 檔案) | 關閉 | + +互動式提示也接受 `list` 以列出完整的 Tesseract 支援代碼清單,以及 `search ` 以尋找符合項目,例如 `search german` 或 `search chi`。 + +::: warning 同源要求 +WASM 檔案必須與 BentoPDF 應用程式從**相同來源**提供。Web Worker 使用的 `importScripts()` 無法跨來源載入腳本。例如,若 BentoPDF 執行於 `https://internal.example.com`,WASM Base URL 也應為 `https://internal.example.com/wasm`。 +::: + +#### 手動步驟 + +
+如果您偏好不使用腳本,手動完成 + +**步驟 1:下載 WASM 與 OCR 套件**(在可連網的機器上) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**步驟 2:以內部 URL 建置 Docker 映像檔** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**步驟 3:匯出 Docker 映像檔** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**步驟 4:傳入實體隔離網路** + +透過 USB、內部成品儲存庫或核准的傳輸方式複製: + +- `bentopdf.tar`:Docker 映像檔 +- 步驟 1 的五個 `.tgz` WASM/OCR 套件 +- 步驟 1 的 `tesseract-langdata/` 目錄 +- 步驟 1 的 `ocr-fonts/` 目錄 + +**步驟 5:在實體隔離網路內設定** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +請確認這些檔案可透過您在步驟 2 設定的 URL 存取,包括 `.../ocr/worker.min.js`、`.../ocr/core`、`.../ocr/lang-data` 與 `.../ocr/fonts`。 + +
+ +::: info 從原始碼建置而非使用 Docker? +在執行 `npm run build` 之前,於 `.env.production` 中設定這些變數: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### 架設您自己的 WASM 代理 + +如果您需要以正確的 CORS 標頭提供 AGPL WASM 檔案,可以部署一個簡單的代理。範例實作請參閱 [Cloudflare WASM 代理指南](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md)。 + +::: tip 為何要分開? +這種分離可確保: + +- 商業使用者有明確的法律合規性 +- BentoPDF 核心維持其雙重授權(AGPL-3.0 / 商業授權) +- WASM 檔案在執行時載入,而非內含於原始碼中 + ::: + +## 系統需求 + +| 需求 | 最低規格 | +| -------- | --------------------------------- | +| 儲存空間 | 約 100 MB(不含 AGPL 模組的核心) | +| RAM | 512 MB | +| CPU | 任何現代處理器 | + +::: tip +BentoPDF 是靜態網站,不需要資料庫或後端伺服器! +::: diff --git a/docs/zh-TW/self-hosting/kubernetes.md b/docs/zh-TW/self-hosting/kubernetes.md new file mode 100644 index 00000000..b7ccfd6d --- /dev/null +++ b/docs/zh-TW/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# 使用 Kubernetes 部署 + +對靜態網站來說,Kubernetes 可能有些大材小用,但如果您已經以 Helm + GitOps 為標準,它會是很好的選擇。 + +> [!IMPORTANT] +> **Office 檔案轉換所需的標頭** +> +> 以 LibreOffice 為基礎的工具(Word、Excel、PowerPoint 轉換)需要以下 HTTP 標頭才能支援 `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 官方 BentoPDF nginx 映像檔已包含這些標頭。在 Kubernetes 中,**Ingress/Gateway 控制器同時也是反向代理**,因此請確保這些標頭被保留(或在邊緣層加上)。 + +## 先決條件 + +- Kubernetes 叢集 +- Helm v3 +- 在 **8080 連接埠**提供服務的 BentoPDF nginx 映像檔(例如 `ghcr.io/alam00000/bentopdf:`) + +## 使用 Helm 部署 + +### 從此儲存庫安裝(本機 chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### 從 GHCR 安裝(OCI chart) + +如果 chart 已以 OCI 成品形式發佈至 GHCR: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## 對外公開 + +### 連接埠轉發(快速測試) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress(選用) + +啟用 Ingress(以 nginx-ingress 為例): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API(選用) + +此 chart 支援 Gateway API 的 `Gateway` + `HTTPRoute`。 + +範例(Cloudflare Gateway API operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## 確保 SharedArrayBuffer 標頭仍然有效(Ingress/Gateway) + +### 「應該」發生的情況 + +BentoPDF 的 nginx 設定會設置所需的回應標頭。大多數 Ingress/Gateway 控制器會**原封不動地傳遞上游回應標頭**。 + +### 可能造成問題的情況 + +- 控制器或邊緣政策**覆寫**或**移除**回應標頭 +- 「安全標頭」中介軟體設定了不同的 COOP/COEP 值 + +### 如何驗證 + +對您的公開端點執行: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +您應該會看到: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### 如果您的 Ingress 控制器沒有保留這些標頭 + +在邊緣層加上標頭(依控制器而定)。以 **nginx-ingress** 為例: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` MIME 類型錯誤(簽署 PDF / 表單填寫器 iframe 空白) + +如果瀏覽器主控台在 `.mjs` 請求上顯示 `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"`,表示 BentoPDF nginx 前方的 Ingress/Gateway 控制器將上游的 `Content-Type` 標頭替換成了 `application/octet-stream`。 + +BentoPDF 映像檔的 nginx 已將 `.mjs` 以 `application/javascript` 提供。修正方法是阻止控制器移除或替換它。對於 nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +或在 Gateway API 中使用 `ResponseHeaderModifier` 篩選器,為 `.mjs` 路徑設定 `Content-Type: application/javascript`。使用開發者工具 → 網路分頁驗證:原本失敗的 `.mjs` 請求現在應顯示 `content-type: application/javascript`。 + +### 如果您使用 Gateway API 並想強制加上標頭 + +Gateway API 支援 `ResponseHeaderModifier` 篩選器。您可以將它加在 `httpRoute.rules[*].filters` 中: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +是否支援特定篩選器取決於您的 Gateway 控制器;如果篩選器被忽略,請改在邊緣或控制器層加上標頭。 + +## 停用特定工具 + +使用 ConfigMap 在執行時停用工具,無需重新建置映像檔: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +將它掛載到提供服務的目錄中: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +工具 ID 是去掉 `.html` 的頁面 URL:開啟任一工具並查看 URL(例如 `edit-pdf`、`merge-pdf`、`compress-pdf`)。停用的工具會從首頁、搜尋、快捷鍵、工作流程建構器以及直接 URL 存取中隱藏。完整選項清單請參閱 [Docker 指南](/zh-TW/self-hosting/docker#停用特定工具)。 diff --git a/docs/zh-TW/self-hosting/netlify.md b/docs/zh-TW/self-hosting/netlify.md new file mode 100644 index 00000000..6e85fa85 --- /dev/null +++ b/docs/zh-TW/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# 部署到 Netlify + +[Netlify](https://netlify.com) 提供優秀的靜態網站託管服務,並有慷慨的免費方案。 + +## 一鍵部署 + +[![部署到 Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## 手動部署 + +### 步驟 1:連結儲存庫 + +1. 登入 [Netlify](https://app.netlify.com) +2. 點選「Add new site」→「Import an existing project」 +3. 連結您的 GitHub 帳號 +4. 選擇您的 BentoPDF 分支 + +### 步驟 2:設定建置選項 + +| 設定項目 | 值 | +| --------- | --------------- | +| 建置指令 | `npm run build` | +| 發佈目錄 | `dist` | +| Node 版本 | 18+ | + +### 步驟 3:部署 + +點選「Deploy site」並等待建置完成。 + +## 設定檔 + +在專案根目錄建立 `netlify.toml`: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning 重要 +Word/ODT/Excel/PowerPoint 轉 PDF 需要 `Cross-Origin-Embedder-Policy` 與 `Cross-Origin-Opener-Policy` 標頭。沒有它們,`SharedArrayBuffer` 將無法使用,LibreOffice WASM 引擎也會初始化失敗。 + +`.wasm.gz` 與 `.data.gz` 檔案上的 `Content-Encoding: gzip` 標頭會告訴瀏覽器自動解壓縮。少了這些標頭,瀏覽器會收到原始 gzip 位元組,導致 WASM 編譯失敗。 +::: + +## 環境變數 + +在 Site settings → Environment variables 中設定: + +| 變數 | 說明 | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | 設為 `true` 以使用精簡建置 | +| `VITE_BRAND_NAME` | 自訂品牌名稱(取代「BentoPDF」) | +| `VITE_BRAND_LOGO` | 相對於 `public/` 的標誌路徑(例如 `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | 自訂頁尾或版權文字 | +| `VITE_DEFAULT_LANGUAGE` | 預設介面語言(例如 `fr`、`de`、`es`) | + +## 自訂網域 + +1. 前往 Site settings → Domain management +2. 點選「Add custom domain」 +3. 依照 DNS 設定說明操作 + +## 大型媒體 + +對於大型 WASM 檔案,可考慮啟用 [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## 疑難排解 + +### Word/ODT/Excel 轉 PDF 卡在 55% + +如果文件轉換卡在 55%,請開啟開發者工具主控台並檢查: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +如果 `crossOriginIsolated` 為 `false`,表示 `netlify.toml` 中的 COEP/COOP 標頭沒有套用。請確認檔案位於專案根目錄,然後重新部署。 + +如果您在主控台看到 `expected magic word 00 61 73 6d, found 1f 8b 08 08`,表示 `.wasm.gz` 檔案缺少 `Content-Encoding: gzip` 標頭。請確認 `netlify.toml` 中有 `soffice.wasm.gz` 與 `soffice.data.gz` 的 `[[headers]]` 區塊。 + +### 建置失敗 + +檢查 Node 版本相容性: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### 初次載入緩慢 + +在 Site settings → Build & deploy → Asset optimization 中啟用資源最佳化。 diff --git a/docs/zh-TW/self-hosting/nginx.md b/docs/zh-TW/self-hosting/nginx.md new file mode 100644 index 00000000..ff58bb0f --- /dev/null +++ b/docs/zh-TW/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# 使用 Nginx 部署 + +使用 Nginx 在您自己的伺服器上架設 BentoPDF。 + +## 先決條件 + +- Ubuntu/Debian 伺服器 +- 已安裝 Nginx +- SSL 憑證(建議使用 Let's Encrypt) + +## 步驟 1:建置專案 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +若要自訂品牌,請在建置前設定環境變數: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## 步驟 2:複製檔案 + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## 步驟 3:Nginx 設定 + +建立 `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## 步驟 4:啟用網站 + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## 步驟 5:使用 Let's Encrypt 設定 SSL + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## 子目錄部署 + +若要架設在 `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +建置方式: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## 效能調校 + +加入 `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## 疑難排解 + +### WASM 無法載入 + +確認已設定 MIME 類型: + +```nginx +types { + application/wasm wasm; +} +``` + +### 簽署 PDF 或表單填寫器顯示空白檢視器(`.mjs` MIME 錯誤) + +如果瀏覽器主控台顯示: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +…且失敗的請求以 `.mjs` 結尾,表示您的 nginx 缺少 `.mjs → application/javascript` 對應。內建的 PDF 檢視器(簽署 PDF、表單填寫器及其他少數工具會使用)以 `.mjs` 副檔名提供 ES 模組檔案,而 nginx 預設的 `mime.types` 並未包含它們。 + +修正方法是在 `/etc/nginx/mime.types` 中現有的 `application/javascript` 那一行加上 `mjs`: + +```nginx +application/javascript js mjs; +``` + +> 請勿再新增*第二行* `application/javascript`:nginx 逐行解析 `mime.types`,且只有一個類型與副檔名的對應會生效,因此在某些版本中第二行會被默默忽略。請編輯現有的那一行,在 `js` 旁加上 `mjs`。 + +或在您的 server 區塊內進行本機覆寫(不需編輯全域檔案): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +變更後重新載入 nginx: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +確認方式:在瀏覽器開發者工具 → 網路分頁中,找到失敗的 `.mjs` 請求並檢查 `Content-Type` 回應標頭。現在它應該是 `application/javascript`,而不是 `application/octet-stream`。 + +### Word/ODT/Excel 轉 PDF 無法運作 + +LibreOffice WASM 需要 `SharedArrayBuffer`,而這需要 `Cross-Origin-Embedder-Policy` 與 `Cross-Origin-Opener-Policy` 標頭。它也需要安全環境,因此 `http://localhost` 可用於本機測試,但 `http://192.168.x.x` 或其他區域網路 IP 通常需要 HTTPS。請注意,`location` 區塊中的 nginx `add_header` 指令會**覆寫**伺服器層級的 `add_header` 指令,兩者不會合併。每個有自己 `add_header` 的 `location` 區塊都必須包含 COEP/COOP 標頭。 + +使用以下指令驗證: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +如果在 nginx 前方使用反向代理,請確保它保留這些標頭。 + +### 502 Bad Gateway + +檢查 Nginx 錯誤記錄: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/zh-TW/self-hosting/vercel.md b/docs/zh-TW/self-hosting/vercel.md new file mode 100644 index 00000000..72b433c6 --- /dev/null +++ b/docs/zh-TW/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# 部署到 Vercel + +[Vercel](https://vercel.com) 為靜態網站提供最簡單的部署體驗。 + +## 一鍵部署 + +[![使用 Vercel 部署](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## 手動部署 + +### 步驟 1:Fork 儲存庫 + +將 [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) Fork 到您的 GitHub 帳號。 + +### 步驟 2:匯入至 Vercel + +1. 前往 [vercel.com/new](https://vercel.com/new) +2. 選擇您 Fork 的儲存庫 +3. 設定專案: + +| 設定項目 | 值 | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### 步驟 3:環境變數(選用) + +視需要加入以下變數: + +| 變數 | 說明 | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | 設為 `true` 以使用精簡介面 | +| `VITE_BRAND_NAME` | 自訂品牌名稱(取代「BentoPDF」) | +| `VITE_BRAND_LOGO` | 相對於 `public/` 的標誌路徑(例如 `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | 自訂頁尾或版權文字 | +| `VITE_DEFAULT_LANGUAGE` | 預設介面語言(例如 `fr`、`de`、`es`) | + +### 步驟 4:部署 + +點選「Deploy」並等待建置完成。 + +## 自訂網域 + +1. 前往專案設定 +2. 進入「Domains」 +3. 加入您的自訂網域 +4. 依照指示設定 DNS + +## 限制 + +::: warning 大型檔案 +Vercel 的無伺服器函式有 50MB 的限制。由於 BentoPDF 是靜態網站,這應該不會影響您,但 WASM 模組很大(總計約 100MB)。請確保它們從 `/public` 資料夾提供。 +::: + +## 疑難排解 + +### 建置逾時 + +如果建置逾時,請嘗試: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 重新整理時出現 404 + +加入 `vercel.json` 以支援 SPA 路由: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel 轉 PDF 無法運作 + +LibreOffice WASM 轉換需要 `SharedArrayBuffer`,而這需要所有頁面都帶有以下回應標頭: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +預先壓縮的 `.wasm.gz` 與 `.data.gz` 檔案也需要 `Content-Encoding: gzip`,瀏覽器才會將其解壓縮。 + +將以下內容加入 `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +若要驗證,請開啟開發者工具主控台並執行 `console.log(window.crossOriginIsolated)`,應該會回傳 `true`。 diff --git a/docs/zh-TW/tools/add-attachments.md b/docs/zh-TW/tools/add-attachments.md new file mode 100644 index 00000000..964bcca2 --- /dev/null +++ b/docs/zh-TW/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: 新增附件 +description: 將任何類型的檔案嵌入 PDF,可加在文件層級或附加到特定頁面。 +--- + +# 新增附件 + +將一個或多個檔案直接嵌入 PDF 文件中。附件可以加在文件層級(在任何 PDF 閱讀器的附件面板中都看得到),也可以綁定到特定頁面。 + +## 運作方式 + +1. 上傳您要附加檔案的 PDF。 +2. 使用附件拖放區選擇要嵌入的檔案(任何檔案類型皆可)。 +3. 選擇附件層級:**文件**(預設)或**頁面**。 +4. 如果選擇頁面層級,請輸入頁面範圍(例如 `1-3` 或 `5`)。 +5. 點選處理按鈕。修改後的 PDF 會連同嵌入的檔案一起下載。 + +## 功能 + +- 可附加任何檔案類型:圖片、試算表、壓縮檔、執行檔,什麼都行 +- 可放在文件層級或頁面層級 +- 一次操作即可附加多個檔案 +- 顯示所有已選附件的檔名與大小 +- 輸出保留原始 PDF 內容,並加入嵌入的檔案 + +## 選項 + +| 選項 | 說明 | +| ------------ | ------------------------------------------ | +| **文件層級** | 將檔案附加到整份 PDF,可從附件面板存取 | +| **頁面層級** | 將檔案附加到特定頁面,透過頁面範圍輸入指定 | + +## 使用情境 + +- 將原始資料(Excel 檔案、CSV)與 PDF 報告打包在一起 +- 將原始圖片檔附加到攝影作品集 PDF +- 在合約或提案中嵌入佐證文件 +- 在訓練手冊的特定頁面加入補充資料 + +## 小技巧 + +- 文件層級附件在各種 PDF 閱讀器中支援度最高。頁面層級附件不一定能在所有檢視器中看到。 +- 附件沒有檔案大小限制,但非常大的嵌入檔案會使 PDF 大小等比例增加。 + +## 相關工具 + +- [擷取附件](./extract-attachments) +- [編輯附件](./edit-attachments) +- [合併 PDF](./merge-pdf) diff --git a/docs/zh-TW/tools/add-blank-page.md b/docs/zh-TW/tools/add-blank-page.md new file mode 100644 index 00000000..faa41f25 --- /dev/null +++ b/docs/zh-TW/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: 新增空白頁面 +description: 在 PDF 文件的任何位置插入一頁或多頁空白頁面。 +--- + +# 新增空白頁面 + +在 PDF 中您指定的位置插入空白頁面。您可以控制空白頁面插入的位置與數量。 + +## 運作方式 + +1. 上傳 PDF 檔案。工具會顯示頁數。 +2. 輸入要插入空白頁面的**位置**。使用 `0` 插入到最前面,或使用總頁數附加到最後。 +3. 輸入要新增的空白頁面**數量**(預設為 1)。 +4. 點選處理按鈕。插入空白頁面後的 PDF 會自動下載。 + +## 功能 + +- 可插入任何位置:文件開頭、中間或結尾 +- 一次操作即可新增多頁空白頁面 +- 位置提示會依上傳 PDF 的頁數動態更新 +- 標準 A4 尺寸的空白頁面 + +## 使用情境 + +- 在彙編文件的各章節之間加入空白分隔頁 +- 插入空白頁面以對齊雙面列印 +- 在列印的學習指南中加入手寫筆記的空間 +- 補足頁數以符合最低頁數要求 + +## 小技巧 + +- 位置 `0` 會插入到第一頁之前。位置等於總頁數時會附加到最後一頁之後。 +- 如果需要在特定位置插入內容(而不只是空白頁),請使用 [PDF 多功能工具](./pdf-multi-tool)在指定頁面後插入另一份 PDF。 + +## 相關工具 + +- [複製與組織](./organize-pdf) +- [PDF 多功能工具](./pdf-multi-tool) +- [合併 PDF](./merge-pdf) diff --git a/docs/zh-TW/tools/add-page-labels.md b/docs/zh-TW/tools/add-page-labels.md new file mode 100644 index 00000000..2084e79f --- /dev/null +++ b/docs/zh-TW/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: 新增頁面標籤 +description: 為 PDF 新增頁面標籤,支援羅馬數字、字母前綴、自訂編號,且每份文件可設定多條規則。 +--- + +# 新增頁面標籤 + +頁面標籤控制頁碼在 PDF 檢視器中的顯示方式(工具列中顯示的號碼,而非印在頁面上的號碼)。此工具可讓您為不同頁面範圍指定不同的標籤方案:前言使用羅馬數字、正文使用十進位數字、附錄使用字母等等。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 選項面板會出現,預設有一條標籤規則。 +3. 為每條規則設定頁面範圍、樣式、選用的前綴與起始值。 +4. 點選**新增規則**,為不同章節建立更多規則。 +5. 點選**新增頁面標籤**以套用所有規則並下載結果。 + +## 選項 + +每條標籤規則有以下設定: + +- **頁面範圍**:規則套用的頁面。留空表示所有頁面。支援 `1-4`、`7`、`odd` 或 `1-9,30-40` 等範圍。 +- **標籤樣式**:十進位阿拉伯數字、小寫羅馬數字(i、ii、iii)、大寫羅馬數字(I、II、III)、小寫字母(a、b、c)、大寫字母(A、B、C),或無標籤(僅前綴)。 +- **標籤前綴**:加在每個標籤前方的選用文字,例如「A-」可產生 A-1、A-2、A-3 這樣的標籤。 +- **起始值**:開始計數的號碼。預設為 1。設為 0 則從零開始編號。 +- **在不連續範圍間延續編號**:當規則針對不連續頁面(例如 `1-9,30-40` 或 `odd`)且您希望編號依序延續時,請啟用此選項。 +- **移除現有頁面標籤**:預設勾選。在套用新規則前清除先前的所有標籤。 + +## 功能 + +- 每份文件可設定多條標籤規則,以實現複雜的編號方案 +- 六種標籤樣式,涵蓋所有標準編號系統 +- 支援自訂前綴,方便依章節標示 +- 支援不連續範圍與連續編號 +- 可選擇保留或移除現有標籤 + +## 使用情境 + +- 為書籍的序言設定羅馬數字標籤(i、ii、iii),正文則使用十進位標籤 +- 以字母前綴標示附錄頁面,例如「A-1」、「A-2」、「B-1」、「B-2」 +- 修正掃描文件中實體頁碼與 PDF 頁面順序不符的頁面標籤 +- 為技術文件加上從零開始的編號 + +## 小技巧 + +- 頁面標籤是 PDF 檢視器在導覽工具列中顯示的中繼資料,不會印在實際頁面上。若需要可見的號碼,請使用[頁碼](./page-numbers)。 +- 此工具需要在 WASM 設定中設定 CoherentPDF(CPDF)。如果尚未設定,系統會提示您進行設定。 + +## 相關工具 + +- [頁碼](./page-numbers) +- [Bates 編號](./bates-numbering) +- [編輯書籤](./bookmark) diff --git a/docs/zh-TW/tools/add-stamps.md b/docs/zh-TW/tools/add-stamps.md new file mode 100644 index 00000000..559d3aa1 --- /dev/null +++ b/docs/zh-TW/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: 新增印章 +description: 使用整合的註解工具列在 PDF 頁面上加入圖片印章,並標示使用者名稱。 +--- + +# 新增印章 + +使用內嵌檢視器及其印章註解工具列,在 PDF 頁面上放置圖片印章。印章可以包含您的名稱以標示來源,適合用於核准流程、審閱程序與文件標記。 + +## 運作方式 + +1. 在**印章使用者名稱**欄位中輸入您的名稱。此名稱會出現在您建立的印章上。 +2. 點選或將 PDF 檔案拖曳到拖放區以上傳。 +3. 印章編輯器會開啟,並在檢視器中載入您的文件。 +4. 使用工具列的圖片印章工具,在任何頁面上選擇並放置印章。 +5. 視需要調整印章的位置與大小。 +6. 點選**儲存蓋章後的 PDF** 以下載結果。 + +## 功能 + +- 整合 PDF 檢視器與印章專用的註解工具列 +- 在建立的印章上標示使用者名稱 +- 可在任何頁面放置圖片印章 +- 拖放定位與調整大小 +- 依頁面長寬比自動調整檢視器大小 +- 顯示檔案名稱與大小資訊 + +## 使用情境 + +- 在審閱流程中為文件加上「APPROVED」或「REVIEWED」圖片印章 +- 在正式文件上放置公司印鑑或公證印章圖片 +- 以包含審閱者名稱的「RECEIVED」印章標記頁面 +- 為檢驗報告加上品質管制印章 + +## 小技巧 + +- 請在上傳 PDF 前設定印章使用者名稱。使用者名稱會嵌入印章的中繼資料中。 +- 檢視器會依 PDF 第一頁的長寬比調整高度,以獲得最佳檢視效果。 +- 若要使用文字浮水印而非圖片印章,請使用[新增浮水印](./add-watermark)工具。 + +## 相關工具 + +- [簽署 PDF](./sign-pdf) +- [新增浮水印](./add-watermark) +- [PDF 編輯器](./edit-pdf) diff --git a/docs/zh-TW/tools/add-watermark.md b/docs/zh-TW/tools/add-watermark.md new file mode 100644 index 00000000..cbf919f8 --- /dev/null +++ b/docs/zh-TW/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: 新增浮水印 +description: 使用視覺化拖放編輯器與即時預覽,在 PDF 頁面上加上文字或圖片浮水印。 +--- + +# 新增浮水印 + +使用視覺化編輯器為 PDF 頁面加上文字或圖片浮水印。您可以直接在預覽上拖曳浮水印來定位、用角落控點調整大小,並設定不透明度、旋轉、字型與顏色。每一頁可以有各自的浮水印位置,也可以一次將相同的浮水印套用到所有頁面。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 編輯器會開啟,顯示第一頁的即時預覽與可拖曳的浮水印圖層。 +3. 使用切換按鈕選擇**文字**或**圖片**浮水印模式。 +4. 在側邊欄面板中設定浮水印選項。 +5. 在預覽上拖曳浮水印,將其放在您想要的確切位置。使用角落控點調整大小。 +6. 切換頁面以設定個別頁面的浮水印,或保持勾選**套用到所有頁面**。 +7. 點選**新增浮水印**以處理並下載。 + +## 選項 + +**文字浮水印設定:** + +- **文字**:浮水印文字(例如「機密」、「草稿」)。 +- **字型大小**:從 10 到 200 點。預設為 72。 +- **顏色**:透過顏色選擇器選擇任何顏色。 +- **不透明度**:控制從完全透明到完全不透明的透明度。 +- **旋轉**:將浮水印文字旋轉 -180 到 180 度。 + +**圖片浮水印設定:** + +- **上傳圖片**:上傳 PNG、JPG 或其他圖片檔作為浮水印。 +- **不透明度**:控制圖片的透明度。 +- **縮放**:調整圖片浮水印的大小。 + +**版面配置設定:** + +- **單一**:每頁一個浮水印,可拖曳或使用位置預設值定位。 +- **平鋪**:以依循旋轉角度的斜向網格在整頁重複浮水印,讓標記從邊緣到邊緣覆蓋整份文件。 +- **水平間距**:沿文字方向的平鋪間距,以浮水印寬度的百分比表示(僅限平鋪模式)。 +- **垂直間距**:平鋪列之間的間距,以浮水印高度的百分比表示(僅限平鋪模式)。 + +**一般設定:** + +- **套用到所有頁面**:勾選時,相同的浮水印會套用到每一頁。取消勾選可為每頁設定個別浮水印。 +- **頁面範圍**:指定要加上浮水印的頁面(例如「1-3, 5, 7-9」或「all」)。 + +## 功能 + +- 在即時 PDF 預覽上以視覺化拖放定位 +- 可用角落控點調整浮水印大小 +- 文字與圖片浮水印模式 +- 單一或整頁平鋪(重複)版面配置,間距可調整 +- 可套用到個別頁面或全部頁面 +- 在預覽中逐頁切換 +- 不透明度與旋轉控制 +- 頁面範圍篩選 + +## 使用情境 + +- 在草稿文件傳閱審閱前標上「草稿」 +- 為敏感的財務報告加上「機密」浮水印 +- 以公司標誌圖片浮水印為文件加上品牌 +- 在提供給潛在客戶的產品文件上標示「SAMPLE」 +- 為發佈的 PDF 資料加上版權聲明 + +## 小技巧 + +- 若要在頁面上加上斜向浮水印,請將旋轉設為約 45 度並加大字型大小。 +- 平鋪模式讓文件在裁切後更難被再利用,因為移除一個標記後仍會留下數十個。平鋪時請降低不透明度,讓底下的文字保持可讀。 +- 透明背景的圖片浮水印(PNG 格式)能更自然地與文件內容融合。 +- 如果不同頁面需要不同的浮水印文字,請取消勾選「套用到所有頁面」並逐頁設定。 + +## 相關工具 + +- [頁首與頁尾](./header-footer) +- [新增印章](./add-stamps) +- [Bates 編號](./bates-numbering) +- [簽署 PDF](./sign-pdf) diff --git a/docs/zh-TW/tools/adjust-colors.md b/docs/zh-TW/tools/adjust-colors.md new file mode 100644 index 00000000..7a72c5fb --- /dev/null +++ b/docs/zh-TW/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: 調整顏色 +description: 微調 PDF 的亮度、對比、飽和度、色相、色溫、色調、Gamma 與復古棕褐色。 +--- + +# 調整顏色 + +完整的 PDF 色彩調整工具組。可調整八個獨立參數:亮度、對比、飽和度、色相偏移、色溫、色調、Gamma 與復古棕褐色,並在移動每個滑桿時即時更新預覽。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 編輯器會開啟,顯示第一頁的預覽與色彩設定面板。 +3. 移動滑桿以調整各項色彩參數。預覽會即時更新。 +4. 點選**重設**將所有滑桿還原到預設位置。 +5. 點選**套用**以處理所有頁面並下載調整後的 PDF。 + +## 選項 + +- **亮度**:讓整頁變亮或變暗(-100 到 +100)。 +- **對比**:增加或減少明暗區域之間的差異(-100 到 +100)。 +- **飽和度**:提高或降低色彩強度(-100 到 +100)。設為 -100 會產生灰階效果。 +- **色相偏移**:旋轉色輪,統一偏移所有顏色。 +- **色溫**:讓顏色偏暖(黃色/橘色)或偏冷(藍色)。 +- **色調**:加上綠色或洋紅色調。 +- **伽瑪值**:使用 Gamma 曲線調整中間調亮度。低於 1.0 的值會讓中間調變暗;高於 1.0 的值會讓其變亮。 +- **復古棕褐色**:套用經典的棕褐色調效果。數值越高,棕色調越強。 + +## 功能 + +- 八個可獨立調整的色彩參數 +- 即時預覽,立即反映滑桿變化 +- 重設按鈕可快速回到預設值 +- 處理文件中的所有頁面 +- 適用於任何 PDF 內容(文字、圖片、圖形) + +## 使用情境 + +- 調亮較暗的掃描檔,或修正過度曝光的頁面 +- 在列印前降低彩色文件的飽和度以減少墨水用量 +- 套用棕褐色調,為證書或獎狀營造復古風格 +- 修正 PDF 中內嵌照片的色溫 +- 提高褪色或低品質掃描文件的對比 + +## 小技巧 + +- 若要快速轉為灰階,請將飽和度滑桿拉到 -100。 +- Gamma 滑桿特別適合改善中間調過暗或過亮的掃描文件的可讀性。 +- 與其他圖片效果工具一樣,此工具會將每頁點陣化。輸出將以圖片為基礎,因此文字無法選取。 + +## 相關工具 + +- [反轉顏色](./invert-colors) +- [掃描效果](./scanner-effect) +- [背景顏色](./background-color) diff --git a/docs/zh-TW/tools/alternate-merge.md b/docs/zh-TW/tools/alternate-merge.md new file mode 100644 index 00000000..fbd8045a --- /dev/null +++ b/docs/zh-TW/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: 交錯混合頁面 +description: 以交錯順序穿插各檔案的頁面來合併 PDF,並保留書籤。 +--- + +# 交錯混合頁面 + +將多個 PDF 檔案的頁面交錯排列,讓頁面在各文件之間輪替。當一般合併只會將檔案首尾相接,而您需要的是檔案 A 的第 1 頁、檔案 B 的第 1 頁、檔案 A 的第 2 頁依此類推時,就該使用這個工具。 + +## 運作方式 + +1. 使用拖放區上傳至少兩個 PDF 檔案。 +2. 工具會顯示每個檔案的頁數與檔案大小。 +3. 拖曳握把以調整交錯順序中哪個檔案的頁面優先。 +4. 點選**混合頁面**以產生交錯輸出。 +5. 結果會下載為 `alternated-mixed.pdf`。 + +## 功能 + +- 可交錯任意數量的 PDF(至少兩個) +- 拖放重新排列檔案以控制交錯優先順序 +- 保留來源文件的書籤 +- 顯示每個上傳檔案的頁數與檔案大小 +- 透過專用的 Web Worker 處理,讓介面保持流暢 + +## 使用情境 + +- 重組奇數頁與偶數頁分開掃描的雙面掃描檔 +- 將題目卷與解答合併,讓每題後面緊接著答案 +- 逐頁合併雙語文件(例如一頁英文,下一頁譯文) +- 交錯單面掃描器掃描的正面與背面 + +## 小技巧 + +- 如果來源 PDF 的頁數不同,較短文件的頁面會先用完,較長文件的剩餘頁面會出現在最後。 +- 檔案順序很重要:清單中的第一個檔案提供輸出的第一頁。如有需要請拖曳重新排列。 + +## 相關工具 + +- [合併 PDF](./merge-pdf) +- [複製與組織](./organize-pdf) +- [分割 PDF](./split-pdf) diff --git a/docs/zh-TW/tools/background-color.md b/docs/zh-TW/tools/background-color.md new file mode 100644 index 00000000..b08cf1da --- /dev/null +++ b/docs/zh-TW/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: 背景顏色 +description: 變更 PDF 每一頁的背景顏色,同時保留上層的所有內容。 +--- + +# 背景顏色 + +在 PDF 所有現有內容的後方設定純色背景。此工具會在每頁建立一個彩色矩形,並將原始內容疊在上方,因此文字、圖片與圖形在新背景上都能完整顯示。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 使用顏色選擇器挑選背景顏色。預設為淺黃色(#FFFFCC)。 +3. 點選**變更背景顏色**以進行處理。 +4. 更新後的 PDF 會自動下載。 + +## 選項 + +- **背景顏色**:用於選擇任何純色的標準顏色選擇器。預設為淺黃色。 + +## 功能 + +- 為每一頁套用統一的背景顏色 +- 在彩色圖層上方保留所有原始內容(文字、圖片、向量圖形) +- 維持原始頁面尺寸 +- 適用於任何頁數的文件 + +## 使用情境 + +- 加上淺奶油色或象牙色背景,讓文件呈現更柔和、類似紙張的外觀 +- 為不同類別套用不同背景顏色,以顏色區分文件組 +- 為不同對象建立視覺上可區分的同一文件版本 +- 加上淺色背景,提升在螢幕上投影文件時的可讀性 + +## 小技巧 + +- 淺色、柔和的顏色效果最好。非常深的背景會讓文字難以閱讀,除非文字本身已是淺色。 +- 如果想同時變更背景與文字顏色,請先套用背景顏色,再對結果使用[更改文字顏色](./text-color)。 +- 此工具在 PDF 結構層級運作(而非點陣化),因此輸出中的文字仍可選取與搜尋。 + +## 相關工具 + +- [更改文字顏色](./text-color) +- [反轉顏色](./invert-colors) +- [調整顏色](./adjust-colors) diff --git a/docs/zh-TW/tools/bates-numbering.md b/docs/zh-TW/tools/bates-numbering.md new file mode 100644 index 00000000..ee87363d --- /dev/null +++ b/docs/zh-TW/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates 編號 +description: 為一個或多個 PDF 加上 Bates 編號,可自訂範本、補零位數、字型與位置。 +--- + +# Bates 編號 + +Bates 編號會在 PDF 的每一頁蓋上連續的識別碼。這是法律程序、稽核與合規流程中標示文件的標準方法。此工具支援多個檔案與可自訂的範本,並可產生個別編號的 PDF 或單一 ZIP 壓縮檔。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。您可以一次拖曳多個檔案。 +2. 選擇樣式預設值或建立自訂範本。 +3. 設定位置、字型、大小、顏色與起始號碼。 +4. 點選**套用 Bates 編號**以進行處理。 +5. 單一檔案會直接下載。多個檔案會以 ZIP 壓縮檔下載。 + +## 選項 + +- **樣式預設值**:從內建格式中選擇: + - 證物 + 案件 + Bates + 頁碼(例如「Exhibit 1 Case XYZ 000001 Page 1」) + - 證物 + 案件 + Bates(無頁碼) + - 案件 + Bates + - 僅 Bates 編號(例如「000001」) + - 自訂(撰寫您自己的範本) +- **自訂樣式**:使用預留位置的範本字串:`[BATES]`、`[PAGE]`、`[FILE]`、`[FILENAME]`。 +- **Bates 補零位數**:補零 Bates 編號的位數(3 到 6)。僅在自訂模式中顯示。 +- **位置**:頁首或頁尾,靠左、置中或靠右。 +- **Bates 起始號碼**:第一個 Bates 編號。預設為 1。編號會跨檔案延續。 +- **檔案計數起始號碼**:`[FILE]` 預留位置的起始號碼。 +- **字型**:Helvetica、Times New Roman 或 Courier。 +- **字型大小**:蓋印文字的大小。 +- **顏色**:Bates 編號文字的顏色選擇器。 + +## 功能 + +- 即時預覽 Bates 編號在所有上傳檔案中的呈現方式 +- 支援多個檔案,跨文件連續編號 +- 拖放重新排列檔案以控制編號順序 +- 六種位置選項(頁首/頁尾,靠左/置中/靠右) +- 依不同頁面尺寸自動計算邊界 +- 多檔案批次以 ZIP 輸出 +- 範本預留位置提供最大彈性 + +## 使用情境 + +- 為訴訟的證據開示文件蓋上連續的證物編號 +- 為橫跨數十個檔案的稽核證據包編號 +- 為合規文件加上法規參考編號 +- 以案件專屬識別碼標示專利申請證物 + +## 小技巧 + +- 處理前可在檔案清單中拖曳檔案以重新排序。Bates 編號順序會依照此順序。 +- 使用 `[FILENAME]` 預留位置在蓋印中加入原始檔名,有助於將頁面追溯回來源文件。 +- 預覽框會在您變更設定時即時更新,讓您在處理前確認格式。 + +## 相關工具 + +- [頁碼](./page-numbers) +- [新增頁面標籤](./add-page-labels) +- [頁首與頁尾](./header-footer) diff --git a/docs/zh-TW/tools/bmp-to-pdf.md b/docs/zh-TW/tools/bmp-to-pdf.md new file mode 100644 index 00000000..21d4edb3 --- /dev/null +++ b/docs/zh-TW/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP 轉 PDF +description: 直接在瀏覽器中將 BMP 點陣圖轉換為 PDF 格式,無需上傳到任何伺服器。 +--- + +# BMP 轉 PDF + +將 Windows 點陣圖(BMP)檔案轉換為 PDF。BMP 是一種未壓縮的圖片格式,至今仍常見於舊系統、醫學影像與工業掃描器。此工具無需安裝任何軟體即可將其轉換為 PDF。 + +## 支援格式 + +| 格式 | 副檔名 | +| :--- | :----- | +| BMP | `.bmp` | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 BMP 檔案。 +2. 檢查檔案清單。可新增更多檔案或移除不需要的檔案。 +3. 點選**轉換為 PDF**。輸出會下載為 `from_bmps.pdf`。 + +每個 BMP 會先繪製到畫布上、匯出為 PNG,再使用 pdf-lib 嵌入 PDF。頁面尺寸與原始圖片尺寸相同。 + +## 選項 + +此工具沒有額外的品質設定。圖片會以原始解析度、無損 PNG 的形式嵌入 PDF。 + +## 使用情境 + +- 將以 BMP 儲存的舊掃描文件轉換為可封存的 PDF +- 將舊版 Windows 應用程式的 BMP 截圖轉為可分享的文件 +- 處理預設輸出 BMP 的醫學或工業掃描器檔案 +- 將舊圖片檔案庫遷移到更通用的格式 + +## 小技巧 + +- BMP 檔案未經壓縮,因此通常很大。由於圖片在內部會重新編碼為 PNG,產生的 PDF 會明顯較小。 +- 如果 BMP 檔案與其他圖片格式混在一起,請使用[圖片轉 PDF](./image-to-pdf) 工具一次批次轉換所有檔案。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) +- [TIFF 轉 PDF](./tiff-to-pdf) diff --git a/docs/zh-TW/tools/bookmark.md b/docs/zh-TW/tools/bookmark.md new file mode 100644 index 00000000..3e1c8e71 --- /dev/null +++ b/docs/zh-TW/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: 編輯書籤 +description: 透過視覺化編輯器新增、編輯、匯入、匯出與刪除 PDF 書籤,並支援 CSV/JSON。 +--- + +# 編輯書籤 + +書籤編輯器讓您完整掌控 PDF 的導覽書籤(也稱為大綱)。您可以新增書籤、編輯現有書籤、重新整理階層,並以 CSV 和 JSON 格式匯入或匯出書籤資料。 + +## 運作方式 + +1. 點擊或將檔案拖曳到放置區以上傳 PDF。 +2. 可選擇勾選 **自動擷取現有書籤**,載入文件目前的書籤樹。 +3. 編輯器以分割畫面開啟:左側為 PDF 檢視器,右側為書籤面板。 +4. 輸入書籤標題並點擊 **新增至頁面**,即可建立指向目前頁面的新書籤。 +5. 使用工具列按鈕重新排列、設定樣式或刪除書籤。 +6. 點擊 **儲存含書籤的 PDF** 下載更新後的檔案。 + +## 功能 + +- 視覺化 PDF 檢視器,具備頁面導覽、縮放控制與跳至頁面輸入框 +- 一鍵將書籤新增至任何頁面 +- 直接點擊 PDF 以設定精確的書籤目的地(選取模式) +- 巢狀書籤階層,支援拖放重新排序 +- 批次操作:選取多個書籤,一次變更顏色、樣式或刪除 +- 書籤搜尋,可在大型書籤樹中快速找到項目 +- 所有變更皆支援復原與重做 +- 從 CSV(標題、頁碼、層級)或 JSON 檔案匯入書籤 +- 將書籤匯出為 CSV 或 JSON,以便在外部編輯 +- 書籤樣式:顏色(紅、藍、綠、黃、紫)與字型樣式(粗體、斜體、粗斜體) +- 快速導覽:使用 Page Up/Page Down 鍵捲動頁面 + +## 選項 + +- **自動擷取現有書籤**:勾選後,工具會在載入時讀取並顯示 PDF 目前的書籤。 +- **批次模式**:切換後可選取多個書籤,並批次套用顏色、樣式或刪除操作。 +- **全部展開/收合**:快速顯示或隱藏巢狀的子書籤。 + +## 使用情境 + +- 為缺少書籤的教科書或手冊加入目錄 +- 在 OCR 處理後重新整理掃描文件的書籤 +- 將書籤匯出為 CSV,在試算表中編輯後再重新匯入 +- 清理頁面參照錯誤的自動產生書籤 +- 加入彩色書籤,標示法律文書中的重要段落 + +## 提示 + +- 使用 CSV 匯入可大量建立書籤。格式很簡單:`title,page,level`,其中層級 1 為最上層。 +- 選取模式可讓您點擊 PDF 頁面上的精確位置來設定書籤目的地,比只指定頁碼更精確。 +- 進行重大變更前請先匯出書籤,以便留有備份。 + +## 相關工具 + +- [目錄](./table-of-contents) +- [PDF 編輯器](./edit-pdf) +- [新增頁面標籤](./add-page-labels) diff --git a/docs/zh-TW/tools/cbz-to-pdf.md b/docs/zh-TW/tools/cbz-to-pdf.md new file mode 100644 index 00000000..bd07b99b --- /dev/null +++ b/docs/zh-TW/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ 轉 PDF +description: 在瀏覽器中將 CBZ 和 CBR 漫畫封存檔轉換為 PDF。免費、私密,無需上傳。 +--- + +# CBZ 轉 PDF + +將漫畫封存檔轉換為 PDF。CBZ 和 CBR 是數位漫畫的標準格式,其實就是裝滿圖片的 ZIP 或 RAR 封存檔。此工具會擷取每一頁、保留閱讀順序,並產生乾淨的 PDF,每張圖片都成為一個完整尺寸的頁面。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :--- | :----- | :--------------------------------------------------- | +| CBZ | `.cbz` | 以 ZIP 為基礎的漫畫封存檔(使用 pdf-lib 在本機處理) | +| CBR | `.cbr` | 以 RAR 為基礎的漫畫封存檔(透過 PyMuPDF 引擎處理) | + +CBZ 轉換器可辨識封存檔中的 JPEG、PNG、GIF、BMP、WebP、AVIF、TIFF、HEIC 和 JXL 圖片。非標準格式會在嵌入前自動轉換為 PNG。 + +## 運作方式 + +1. 點擊上傳區域,或拖放您的 CBZ 或 CBR 檔案。同一批次中可混合兩種格式。 +2. 檢查列出的檔案。移除不需要的檔案,或點擊 **新增更多檔案** 加入更多。 +3. 點擊 **轉換為 PDF**。對於 CBZ 檔案,工具會解壓縮封存檔、依自然順序按名稱排序圖片檔、偵測每張圖片的實際格式,並使用 pdf-lib 將其嵌入 PDF。CBR 檔案則改由 PyMuPDF 引擎處理。 +4. 單一檔案會下載為 PDF。多個檔案會產生名為 `comic-converted.zip` 的 ZIP 封存檔。 + +## 選項 + +無需任何設定。每張圖片都會成為與其原始尺寸相符的頁面,因此跨頁仍保持寬幅,單頁仍保持窄幅。 + +## 使用情境 + +- 在支援 PDF 但不支援 CBZ/CBR 的平板或手機應用程式上閱讀漫畫 +- 列印數位漫畫中的特定頁面 +- 將漫畫收藏封存為任何檔案檢視器都能開啟的格式 +- 與沒有專用漫畫閱讀器的人分享漫畫 + +## 提示 + +- 封存檔中的圖片使用自然排序(因此 `page2.jpg` 會排在 `page10.jpg` 之前)。請以一致的編號命名檔案,以確保頁面順序正確。 +- 轉換器依據二進位特徵(而非副檔名)偵測圖片格式。不小心命名為 `.jpg` 的 PNG 仍能正確嵌入。 +- CBZ 檔案完全在瀏覽器中處理,不需載入 PyMuPDF 引擎,因此轉換速度比 CBR 檔案快。 + +## 相關工具 + +- [EPUB 轉 PDF](./epub-to-pdf) +- [MOBI 轉 PDF](./mobi-to-pdf) +- [圖片轉 PDF](./image-to-pdf) diff --git a/docs/zh-TW/tools/change-permissions.md b/docs/zh-TW/tools/change-permissions.md new file mode 100644 index 00000000..165136b1 --- /dev/null +++ b/docs/zh-TW/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: 變更權限 +description: 設定或修改 PDF 的列印、複製、編輯與註解使用權限。採用 256 位元 AES 加密。 +--- + +# 變更權限 + +精細調整收件者能對您的 PDF 執行的操作。不同於僅以密碼鎖住檔案的基本加密,此工具可讓您選擇性允許或禁止列印、複製、編輯、註解、填寫表單、文件組合與頁面擷取,全部透過 256 位元 AES 加密強制執行。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 如果 PDF 已加密,請輸入 **目前密碼**。 +3. 設定 **新使用者密碼**(開啟時需要)和/或 **新擁有者密碼**(控制權限)。 +4. 使用核取方塊逐一開啟或關閉權限。 +5. 點擊 **變更權限**。 +6. 下載更新後的 PDF。 + +如果兩個新密碼欄位都留空,工具會完全解密 PDF,移除所有加密與限制。 + +## 權限控制 + +| 權限 | 控制內容 | +| ---------------- | -------------------------------- | +| **允許列印** | 文件是否可以列印 | +| **允許複製** | 文字與圖片是否可以選取和複製 | +| **允許修改** | 文件內容是否可以編輯 | +| **允許註解** | 是否可以新增註解、醒目提示與印章 | +| **允許填寫表單** | 互動式表單欄位是否可以填寫 | +| **允許文件組合** | 頁面是否可以插入、刪除或旋轉 | +| **允許頁面擷取** | 個別頁面是否可以擷取 | + +所有權限都需要擁有者密碼才能強制執行。沒有擁有者密碼時,大多數 PDF 閱讀器會忽略權限旗標。 + +## PDF 權限的運作方式 + +PDF 權限是加密規格的一部分。它們以位元旗標的形式儲存在加密字典中,並由相容的 PDF 閱讀器強制執行。關鍵差異如下: + +- **使用者密碼**:開啟檔案時必須輸入。 +- **擁有者密碼**:變更權限或移除限制時必須輸入。沒有它時,權限旗標會控制使用者可執行的操作。 + +如果只設定擁有者密碼(不設使用者密碼),任何人都能開啟檔案,但只能執行允許的操作。如果兩者都設定,開啟檔案需要密碼,驗證後仍受到限制。 + +## 使用情境 + +- 發布可以檢視和列印、但不能編輯或複製的報告 +- 分享收件者可以填寫、但不能修改的合約範本 +- 發布禁止複製圖片的 PDF 型錄 +- 允許在審閱草稿上加註解,同時防止結構變更 + +## 提示 + +- 為了確保有效,請務必設定擁有者密碼。沒有擁有者密碼的權限無法強制執行。 +- 部分第三方 PDF 工具會忽略權限旗標。如需更強的保護,可考慮將 PDF 光柵化或使用 DRM。 +- 使用此工具可將舊的 RC4 加密 PDF 升級為 AES-256。 + +## 相關工具 + +- [保護 PDF](./protect-pdf):簡單的密碼保護,不含細部權限 +- [解除鎖定 PDF](./unlock-pdf):完全移除加密 +- [移除限制](./remove-restrictions):在擁有擁有者密碼時移除所有限制 diff --git a/docs/zh-TW/tools/combine-single-page.md b/docs/zh-TW/tools/combine-single-page.md new file mode 100644 index 00000000..059eb7f2 --- /dev/null +++ b/docs/zh-TW/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: 合併為單一頁面 +description: 將 PDF 的所有頁面拼接成一個連續的垂直或水平長頁。 +--- + +# 合併為單一頁面 + +將 PDF 的每一頁合併成單一長頁面。頁面可垂直拼接(像捲軸)或水平拼接(並排),在輸出中產生一個連續頁面。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 選擇版面方向:**垂直**(由上而下堆疊頁面)或 **水平**(並排放置頁面)。 +3. 以點為單位設定頁面間距。 +4. 選擇頁面間空隙的背景顏色。 +5. 可選擇啟用分隔線(頁面之間的細線),並設定其粗細與顏色。 +6. 點擊處理按鈕。輸出結果為單頁 PDF。 + +## 功能 + +- 垂直或水平拼接頁面 +- 可設定頁面間距 +- 空隙區域的背景顏色選擇器 +- 可選的分隔線,粗細與顏色皆可調整 +- 以完整解析度將每個原始頁面繪製到合併後的畫布上 + +## 選項 + +| 選項 | 說明 | +| -------------- | -------------------------- | +| **方向** | 垂直(堆疊)或水平(並排) | +| **頁面間距** | 頁面之間的空隙,以點為單位 | +| **背景顏色** | 頁面之間區域的顏色 | +| **新增分隔線** | 切換頁面之間的細線 | +| **分隔線粗細** | 線條粗細,以點為單位 | +| **分隔線顏色** | 分隔線的顏色 | + +## 使用情境 + +- 將多頁線框圖或設計模型製作成單一長圖 +- 產生可連續捲動的文件檢視,以嵌入網頁 +- 將多頁漫畫或分鏡腳本拼接成一條長條 +- 製作連續頁面的全景檢視以供審閱 + +## 提示 + +- 垂直方向最適合直式頁面的文件。橫式內容則較適合水平方向。 +- 頁數很多的大型文件會產生非常高或非常寬的輸出。部分 PDF 檢視器可能難以處理極大的單一頁面。 +- 使用對比色的分隔線,可輕鬆看出原始頁面的結束與下一頁的開始。 + +## 相關工具 + +- [多頁併一頁 (N-Up)](./n-up-pdf) +- [合併 PDF](./merge-pdf) +- [分割頁面](./divide-pages) diff --git a/docs/zh-TW/tools/compare-pdfs.md b/docs/zh-TW/tools/compare-pdfs.md new file mode 100644 index 00000000..35d4708a --- /dev/null +++ b/docs/zh-TW/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: 比較 PDF +description: 以並排或疊加模式比較兩份 PDF 文件,提供詳細的變更偵測與分類。 +--- + +# 比較 PDF + +上傳兩份 PDF,精確查看兩者之間的變更。此工具會智慧配對頁面,偵測文字、圖片、註解、頁首與格式的差異,並以並排或疊加檢視呈現。 + +## 運作方式 + +1. 上傳兩個 PDF 檔案:原始版本(左側)與修訂版本(右側)。 +2. 工具使用內容特徵在兩份文件之間配對頁面。 +3. 選擇檢視模式:**並排** 或 **疊加**。 +4. 使用分頁控制項在頁面配對之間切換。 +5. 差異會被醒目標示並分類。使用篩選面板專注於特定的變更類型。 +6. 可選擇將比較結果匯出為 PDF 報告。 + +## 功能 + +- 依內容相似度自動配對頁面 +- 並排與疊加比較檢視 +- 變更分類:文字、圖片、頁首/頁尾、註解、格式、背景 +- 依類別切換篩選,顯示或隱藏特定變更類型 +- 文字變更搜尋,支援查詢篩選 +- 支援 OCR,可比較掃描文件 +- 縮放控制,便於詳細檢查 +- 並排模式下兩個面板同步捲動 +- 將比較結果匯出為 PDF + +## 選項 + +| 選項 | 說明 | +| ------------ | ----------------------------------------------------- | +| **檢視模式** | 並排或疊加 | +| **OCR** | 啟用/停用 OCR,以比較掃描文件 | +| **OCR 語言** | 用於 OCR 文字擷取的語言 | +| **類別篩選** | 切換文字、圖片、頁首/頁尾、註解、格式與背景變更的顯示 | +| **變更範圍** | 在疊加模式中,篩選所有變更或僅內容變更 | +| **縮放** | 調整放大倍率以便詳細檢查 | + +## 使用情境 + +- 審閱合約修訂,找出版本之間的確切變更 +- 比較設計模型,確認 PDF 匯出結果符合預期 +- 在每項編輯都必須追蹤的受監管產業中稽核文件變更 +- 確認 PDF 轉換流程準確保留了原始內容 +- 對照原文檢查翻譯文件的版面變更 + +## 提示 + +- 疊加檢視會將兩份文件重疊在一起,讓空間上的差異(位移的元素、調整過大小的圖片)一目了然。 +- 比較沒有文字層的掃描文件時,請啟用 OCR。比較引擎會從頁面圖片中擷取文字。 +- 使用類別篩選專注於重要內容。例如,只在意文字內容差異時,可隱藏格式變更。 + +## 相關工具 + +- [檢視中繼資料](./view-metadata) +- [PDF 文字辨識 (OCR)](./ocr-pdf) +- [合併 PDF](./merge-pdf) diff --git a/docs/zh-TW/tools/compress-pdf.md b/docs/zh-TW/tools/compress-pdf.md new file mode 100644 index 00000000..51e1a1b6 --- /dev/null +++ b/docs/zh-TW/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: 壓縮 PDF +description: 使用 Hyper Compress 引擎將 PDF 檔案大小縮減最多 90%。支援目標檔案大小、批次處理與自訂品質設定。 +--- + +# 壓縮 PDF + +縮小 PDF 檔案而不破壞內容。壓縮 PDF 由 BentoPDF 自家的壓縮引擎 [Hyper Compress](https://www.bentopdf.com/hyper-compress) 驅動。它會重新壓縮圖片、對字型進行子集化與合併,並移除內嵌縮圖和私有應用程式資料等多餘內容。PDF 仍保有完整功能:文字依然可選取,連結與表單欄位也能正常運作。 + +Hyper Compress 編譯為 WebAssembly 並隨 BentoPDF 一起提供,因此壓縮可離線運作,也能在實體隔離的部署環境中使用,無需額外設定。 + +## 運作方式 + +1. 點擊放置區或拖曳檔案,上傳一個或多個 PDF。 +2. 選擇 **壓縮等級**:低、中、高或無損。 +3. 可選擇輸入 **目標檔案大小**,或展開 **自訂設定** 進行細部控制,包括 **轉換為灰階**。 +4. 點擊 **壓縮 PDF**。多個檔案會以單一 ZIP 下載。 + +## 特殊文件 + +- **數位簽署的 PDF** 會原封不動地傳回,因為任何變更都會使簽章失效。在自訂設定中開啟 **覆寫內容保護**,即可移除簽章並進行壓縮;頁面上的可見簽名會保留,但檔案將不再具有簽章。 +- **PDF/A 檔案** 壓縮後會移除其 PDF/A 標記,避免檔案宣稱符合已不再符合的標準。在自訂設定中開啟 **保留 PDF/A**,即可讓檔案維持合規。 +- **受密碼保護的 PDF** 會在檔案卡片上顯示密碼欄位。在此輸入密碼,Hyper Compress 即會自行開啟檔案,無需另外解鎖。有兩個以上的加密檔案時,一個共用欄位即可解鎖所有使用相同密碼的檔案。壓縮後的副本不含密碼;請使用 [保護 PDF](./protect-pdf) 重新加上密碼。 +- **沒有文字層的掃描檔** 可在自訂設定中使用 **光柵化頁面** 進一步縮小,此功能會將每個頁面替換為一張最佳化圖片。任何含有可選取文字的文件(包括經過 OCR 的掃描檔)都會略過此步驟,除非開啟 **覆寫內容保護**。開啟後,文字頁面也會變成圖片,文字將無法選取,連結也會失效。 + +## 壓縮等級 + +| 等級 | 圖片品質 | 最大解析度 | 最適合 | +| -------- | -------- | ---------- | ---------------------- | +| **低** | 80 | 200 DPI | 保留視覺品質 | +| **中** | 50 | 150 DPI | 日常文件 | +| **高** | 20 | 72 DPI | 電子郵件附件、網頁上傳 | +| **無損** | 圖片不變 | 不變 | 封存副本 | + +「高」等級還會取消嵌入 14 種標準 PDF 字型,以及在安全時取消嵌入 Arial 等相似字型。 + +## 目標檔案大小 + +輸入以 KB 或 MB 為單位的大小,Hyper Compress 會從您選擇的等級開始,搜尋仍能符合大小的最佳圖片品質。如果文件無法縮到那麼小,您會得到它能產生的最小版本,並看到相關訊息。[將 PDF 壓縮至 1MB](https://www.bentopdf.com/compress-pdf-to-1mb) 等專用頁面開啟時已預先填入目標大小。 + +## 自訂設定 + +展開自訂設定面板即可直接調整 Hyper Compress。選擇壓縮等級會將這些設定重設為該等級的值,而編輯任何一項設定都會將等級切換為自訂。 + +- **覆寫內容保護**:預設情況下,Hyper Compress 不會變更已簽署的 PDF,也不會光柵化含有文字的頁面。開啟此選項會略過這兩項限制。變更等級時此選項會保持開啟。 + +- **圖片**:圖片品質、最大解析度、強制重新取樣、色彩縮減、裁除不可見的圖片區域、移除替代圖片、簡化色彩描述檔、JPEG 2000 與無損模式 +- **字型**:子集化、合併重複字型,以及取消嵌入標準字型及其相似字型 +- **內容**:平面化註解、表單欄位或連結 +- **清理**:移除縮圖、應用程式資料、文章串、網頁擷取資訊、結構樹或輸出意圖 +- **光柵化**:以圖片取代頁面,適用於純圖片掃描檔;文件含有可選取文字時會略過 +- **輸出**:保留 PDF/A,以及供支援的 PDF 2.0 閱讀器使用的 Brotli 壓縮 + +## 使用情境 + +- 將 50 MB 的報告縮小到電子郵件附件限制以內 +- 利用目標檔案大小,讓掃描檔符合入口網站嚴格的上傳限制 +- 最佳化行銷 PDF,加快網站下載速度 +- 封存大量文件,節省儲存成本 +- 透過通訊應用程式分享 PDF 時減少行動數據用量 + +## 提示 + +- 從「中」開始。如果結果仍然太大,請設定目標檔案大小或改用「高」。 +- 對於沒有文字層的掃描檔,請在自訂設定中開啟光柵化頁面。 +- 自訂設定中的轉換為灰階,可縮小色彩豐富文件的檔案大小。 + +## 相關工具 + +- [線性化 PDF](./linearize-pdf):最佳化壓縮後的 PDF,以便快速網頁檢視 +- [光柵化 PDF](./rasterize-pdf):以特定 DPI 將頁面轉換為圖片,包括含有文字的頁面 +- [修復 PDF](./repair-pdf):修復在其他地方壓縮時損壞的 PDF +- [移除中繼資料](./remove-metadata):移除隱藏資料以保護隱私 diff --git a/docs/zh-TW/tools/crop-pdf.md b/docs/zh-TW/tools/crop-pdf.md new file mode 100644 index 00000000..fa3eb154 --- /dev/null +++ b/docs/zh-TW/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: 裁切 PDF +description: 使用 Cropper.js 驅動的編輯器,在每個頁面上繪製裁切區域,以視覺化方式裁切 PDF 頁面。 +--- + +# 裁切 PDF + +使用視覺化裁切介面修剪 PDF 頁面的邊界。直接在每個頁面上繪製裁切矩形、預覽結果並套用裁切。您可以為不同頁面設定不同的裁切區域,也可以對整份文件套用相同的裁切。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 裁切編輯器開啟,顯示第一頁及可拖曳的裁切覆蓋層。 +3. 拖曳邊緣或角落來調整裁切矩形。 +4. 使用頁面導覽按鈕在頁面間切換,並為每一頁設定裁切區域。 +5. 點擊 **裁切** 套用裁切並下載結果。 + +## 功能 + +- 由 Cropper.js 驅動的視覺化裁切編輯器,提供控點以精確調整 +- 逐頁導覽,可設定個別裁切區域 +- 儲存每頁的裁切設定,讓您為不同頁面定義不同的裁切 +- 即時預覽所選的裁切區域 +- 支援任何頁面尺寸或方向的 PDF + +## 使用情境 + +- 移除掃描文件的寬邊界,聚焦於內容區域 +- 修剪印前 PDF 中的印表機裁切標記或對位標記 +- 裁切講義投影片,移除簡報者備註區域 +- 在分享文件摘錄前,移除每一頁的頁首或頁尾 +- 調整頁面大小以符合特定顯示或列印版面 + +## 提示 + +- 裁切覆蓋層可自由調整大小與位置。拖曳角落可等比例調整,拖曳邊緣可單軸調整。 +- 若文件的每一頁都需要相同的裁切,請在第一頁設定即可,工具會在您切換頁面時記住裁切區域。 +- 如果您需要統一頁面尺寸而非視覺裁切,統一頁面尺寸工具可能更適合。 + +## 相關工具 + +- [PDF 編輯器](./edit-pdf) +- [頁碼](./page-numbers) +- [移除空白頁面](./remove-blank-pages) diff --git a/docs/zh-TW/tools/csv-to-pdf.md b/docs/zh-TW/tools/csv-to-pdf.md new file mode 100644 index 00000000..add08312 --- /dev/null +++ b/docs/zh-TW/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV 轉 PDF +description: 直接在瀏覽器中將 CSV 試算表檔案轉換為格式化的 PDF 表格。 +--- + +# CSV 轉 PDF + +將 CSV 檔案轉換為乾淨、格式化的 PDF 文件。每個 CSV 都會被解析並在輸出 PDF 中呈現為表格。當您需要列印或分享表格資料,而收件者不一定有試算表軟體時,這非常實用。 + +## 支援格式 + +| 格式 | 副檔名 | +| :--- | :----- | +| CSV | `.csv` | + +## 運作方式 + +1. 點擊上傳區域,或拖放一個或多個 CSV 檔案。 +2. 檢查檔案清單。新增更多檔案或移除不需要的檔案。 +3. 點擊 **轉換為 PDF**。進度指示器會顯示轉換狀態。 +4. 單一檔案會直接下載為 PDF。多個檔案會封裝成 `csv-converted.zip`。 + +## 選項 + +此工具沒有額外設定。CSV 會自動解析並格式化為表格。 + +## 輸出 + +| 輸入數量 | 輸出 | +| :----------- | :---------------------------------------------------- | +| 1 個檔案 | 單一 PDF 下載(例如 `data.pdf`) | +| 2 個以上檔案 | ZIP 封存檔(`csv-converted.zip`),每個檔案各一個 PDF | + +## 使用情境 + +- 將匯出的資料庫報表轉換為可列印的 PDF 表格 +- 與沒有 Excel 的人分享財務資料或庫存清單 +- 為合規文件建立 CSV 記錄檔的 PDF 版本 +- 列印地址清單、成績表或任何以 CSV 儲存的表格資料 + +## 提示 + +- 為獲得最佳結果,請確保 CSV 使用標準逗號分隔符號。此工具遵循常見的 CSV 解析慣例。 +- 如果 CSV 欄位很多,表格可能會被壓縮以符合頁面寬度。可考慮將寬資料集拆分成多個檔案。 +- 對於 Excel 檔案(`.xls`、`.xlsx`),請使用 [Excel 轉 PDF](./excel-to-pdf) 工具,它會保留試算表格式與多個工作表。 + +## 相關工具 + +- [Excel 轉 PDF](./excel-to-pdf) +- [文字轉 PDF](./txt-to-pdf) +- [JSON 轉 PDF](./json-to-pdf) diff --git a/docs/zh-TW/tools/delete-pages.md b/docs/zh-TW/tools/delete-pages.md new file mode 100644 index 00000000..e756a76d --- /dev/null +++ b/docs/zh-TW/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: 刪除頁面 +description: 依頁碼、範圍或縮圖選取,從 PDF 中移除特定頁面。 +--- + +# 刪除頁面 + +從 PDF 文件中移除不需要的頁面。輸入頁碼或範圍指定要刪除的頁面,或直接點擊頁面縮圖將其標記為移除。 + +## 運作方式 + +1. 上傳 PDF 檔案。工具會產生每一頁的縮圖預覽。 +2. 在文字欄位中使用範圍語法(例如 `2, 5-8`)輸入要刪除的頁面,或點擊縮圖切換選取。 +3. 已標記的頁面會以醒目方式顯示,方便您確認選取內容。 +4. 點擊處理按鈕。系統會建立已移除所選頁面的新 PDF。 + +## 功能 + +- 以文字選取頁面,支援範圍語法(`2, 5-8, 12`) +- 視覺化縮圖格狀檢視,點擊即可選取要刪除的頁面 +- 即時預覽並醒目標示已標記刪除的頁面 +- 依實際頁數驗證輸入 +- 所有未刪除的頁面皆保持原始順序 + +## 使用情境 + +- 移除掃描文件中的空白頁或填充頁 +- 在分享文件前移除封面頁或附錄 +- 清理不小心留在最終版 PDF 中的草稿頁 +- 在發布前移除含有敏感資訊的頁面 + +## 提示 + +- 刪除頁面不會影響其餘頁面的內容或格式。輸出結果是原始文件扣除已移除頁面後的忠實副本。 +- 如果您想只保留特定頁面而非移除特定頁面,[擷取頁面](./extract-pages) 會更合適。 +- 縮圖檢視採延遲載入,因此大型文件仍能保持流暢。 + +## 相關工具 + +- [擷取頁面](./extract-pages) +- [複製與組織](./organize-pdf) +- [分割 PDF](./split-pdf) diff --git a/docs/zh-TW/tools/deskew-pdf.md b/docs/zh-TW/tools/deskew-pdf.md new file mode 100644 index 00000000..ffb262c3 --- /dev/null +++ b/docs/zh-TW/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: PDF 歪斜修正 +description: 使用 OpenCV 歪斜偵測,自動將掃描 PDF 中傾斜的頁面拉直。可調整門檻值與 DPI 設定。 +--- + +# PDF 歪斜修正 + +掃描文件很少完全端正。即使是輕微的傾斜,也會降低 OCR 的準確度,並讓列印結果顯得凌亂。此工具使用 OpenCV 的影像處理演算法偵測每一頁的歪斜角度,並將其旋轉回水平。 + +## 運作方式 + +1. 上傳一個或多個掃描的 PDF。 +2. 設定 **歪斜門檻值**:偵測到的歪斜低於此值的頁面將維持不變。 +3. 選擇 **處理品質 (DPI)**:較高的 DPI 可提升偵測準確度,但需要較長時間。 +4. 點擊 **修正 PDF 歪斜**。 +5. 處理完成後,結果面板會顯示每一頁偵測到的角度,以及是否已修正。 + +## 選項 + +| 設定 | 數值 | 預設值 | +| -------------- | --------------------- | ------ | +| **歪斜門檻值** | 0.1、0.5、1.0、2.0 度 | 0.5 | +| **處理 DPI** | 100、150、200、300 | 150 | + +## 歪斜偵測的運作方式 + +工具會以所選的 DPI 將每一頁轉為圖片,接著使用 OpenCV 偵測內容中主要線條的角度。如果偵測到的歪斜超過門檻值,頁面會以相反角度旋轉以拉直。低於門檻值的頁面則原樣保留。 + +## 使用情境 + +- 整理批次掃描的合約或法律文件 +- 為 OCR 處理準備掃描的收據或發票 +- 拉直平台式掃描器因紙張擺放不一致而歪斜的頁面 +- 提升數位化檔案資料的視覺品質 + +## 提示 + +- 如果 OCR 需要像素級精準對齊,請將門檻值降至 0.1 度。 +- 對大多數文件而言,150 DPI 既快速又準確。文字非常小或細節豐富的頁面請使用 300 DPI。 +- 歪斜修正最適合具有清楚水平文字行的文件。對於大部分是圖片或含有斜向設計元素的頁面,效果可能較差。 + +## 相關工具 + +- [光柵化 PDF](./rasterize-pdf):將修正後的輸出轉換為扁平的圖片式 PDF +- [壓縮 PDF](./compress-pdf):修正歪斜後縮小檔案大小 +- [修復 PDF](./repair-pdf):修復掃描 PDF 的結構問題 diff --git a/docs/zh-TW/tools/digital-sign-pdf.md b/docs/zh-TW/tools/digital-sign-pdf.md new file mode 100644 index 00000000..88777139 --- /dev/null +++ b/docs/zh-TW/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: 數位簽章 +description: 使用 X.509 憑證為 PDF 加上加密數位簽章。支援 PKCS#12 與 PEM 格式,並提供可見簽章選項。 +--- + +# 數位簽章 + +數位簽章是一種加密證明,可證明特定人士簽署了文件,且文件自簽署後未被修改。不同於手繪簽名(只是一張圖片),數位簽章使用 X.509 憑證與 PKCS#7 標準,提供可驗證的真實性與完整性。 + +BentoPDF 完全在您的瀏覽器中套用數位簽章。您的私密金鑰絕不會離開您的裝置。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 上傳您的憑證檔案(.pfx、.p12 或 .pem)。 +3. 輸入憑證密碼以解鎖。工具會顯示憑證的主體、簽發者與有效期間。 +4. 可選擇設定簽章中繼資料(原因、地點、聯絡資訊)。 +5. 可選擇啟用 **可見簽章**,並自訂位置、大小、圖片與文字。 +6. 點擊 **簽署 PDF**。 + +## 支援的憑證格式 + +| 格式 | 副檔名 | 說明 | +| ----------- | ---------- | ------------------------------------------------------------------------ | +| **PKCS#12** | .pfx, .p12 | 業界標準的封裝,包含私密金鑰與憑證鏈。最常見的格式。 | +| **PEM** | .pem | 文字格式。必須在同一個檔案中同時包含憑證與私密金鑰。支援加密的私密金鑰。 | + +## 可見簽章選項 + +啟用後,PDF 頁面上會繪製可見的簽章區塊: + +- **位置**:以點為單位的 X/Y 座標與寬度/高度 +- **頁面**:第一頁、最後一頁、所有頁面或指定頁碼 +- **圖片**:上傳 PNG、JPG 或 WebP 圖片(您的手寫簽名、公司印鑑等) +- **文字**:自訂文字,可設定顏色與字型大小。如果未提供圖片或文字,工具會依憑證的一般名稱與目前日期自動產生文字。 + +## 簽章中繼資料 + +- **原因**:簽署文件的原因(例如「已核准」、「已審閱」) +- **地點**:簽署的地點(例如「New York, NY」) +- **聯絡資訊**:聯絡簽署者的方式(例如電子郵件地址) + +## 網際網路連線說明 + +簽署可能需要網際網路連線。簽署程式庫會從憑證的授權資訊存取 (AIA) 擴充中內嵌的 URL 取得憑證鏈。如果無法連線到這些伺服器,需要驗證憑證鏈的憑證將無法完成簽署。 + +## 使用情境 + +- 以具法律效力的數位簽章簽署合約、提案與協議 +- 在需要 PKI 驗證的工作流程中認證正式文件 +- 為符合法規要求簽署 PDF 發票(許多歐盟國家要求電子發票須經數位簽署) +- 為工程圖或品質文件加上組織核准 + +## 提示 + +- 自簽憑證可用於測試,但在 Adobe Reader 中會顯示警告。正式文件請使用受信任憑證授權單位核發的憑證。 +- 可見簽章純屬視覺效果。無論是否啟用可見區塊,加密簽章都會被嵌入。 +- 使用驗證簽章工具檢查已簽署的 PDF,確認簽章完好無損。 + +## 相關工具 + +- [驗證 PDF 數位簽章](./validate-signature-pdf):驗證已簽署 PDF 中的數位簽章 +- [平面化 PDF](./flatten-pdf):簽署前平面化表單以防止修改 +- [保護 PDF](./protect-pdf):在數位簽章之外再加上密碼保護 +- [移除中繼資料](./remove-metadata):簽署前移除中繼資料 diff --git a/docs/zh-TW/tools/divide-pages.md b/docs/zh-TW/tools/divide-pages.md new file mode 100644 index 00000000..c1e5487c --- /dev/null +++ b/docs/zh-TW/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: 分割頁面 +description: 將 PDF 頁面水平或垂直分割成較小的子頁面。 +--- + +# 分割頁面 + +將個別 PDF 頁面水平或垂直切成兩半。當單一頁面包含應分開成不同頁面的內容時,這非常實用,例如將雙欄版面掃描成一個寬頁面的情況。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 選擇分割方向:**垂直**(左右兩半)或 **水平**(上下兩半)。 +3. 可選擇指定頁面範圍,限制要分割的頁面。留空則分割所有頁面。 +4. 點擊處理按鈕,產生分割後的 PDF。 + +## 功能 + +- 垂直分割:將每一頁分成左右兩半 +- 水平分割:將每一頁分成上下兩半 +- 頁面範圍篩選,可選擇性分割特定頁面 +- 未指定的頁面維持不變 +- 保留內容品質,無需重新繪製 + +## 使用情境 + +- 分開雙頁掃描的頁面(例如一張紙上同時有左右兩頁的書籍掃描) +- 將內容並排的橫式 PDF 分割成個別的直式頁面 +- 將長型資訊圖表或海報分成上下兩個部分 +- 準備寬幅文件以便使用標準紙張列印 + +## 提示 + +- 即使頁面內容分布不均,分割仍會在正中央進行。若需要不對稱分割,請改用 [裁切 PDF](./crop-pdf)。 +- 如果頁面在分割前後需要旋轉,可搭配 [旋轉 PDF](./rotate-pdf) 使用。 + +## 相關工具 + +- [分割 PDF](./split-pdf) +- [裁切 PDF](./crop-pdf) +- [多頁併一頁 (N-Up)](./n-up-pdf) +- [海報化 PDF](./posterize-pdf) diff --git a/docs/zh-TW/tools/duplex-collate.md b/docs/zh-TW/tools/duplex-collate.md new file mode 100644 index 00000000..35a725b9 --- /dev/null +++ b/docs/zh-TW/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: 雙面掃描整理 +description: 將正面頁與背面頁分屬不同區塊的雙面掃描 PDF,重新排列為正確的正面/背面頁序。 +--- + +# 雙面掃描整理 + +雙面掃描整理專為 ADF 掃描流程設計,適用於一個 PDF 包含兩個頁面區塊的情況: + +- 先是所有正面 +- 接著是所有背面 + +此工具會將兩個區塊交錯排列成自然的閱讀順序:正面1、背面1、正面2、背面2,依此類推,無需手動分割再重組。 + +## 運作方式 + +1. 上傳一個由雙面堆疊掃描產生的 PDF。 +2. 設定正面區塊結束的分割點。 +3. 選擇背面區塊的處理方式: + - **反轉背面區塊**(掃描背面前翻轉紙疊時常見) + - **保持背面區塊原樣** +4. 點擊 **整理 PDF** 下載重新排序後的結果。 + +## 選項 + +- **自動偵測分割點(一半)**:將分割點設為 `ceil(totalPages / 2)`。 +- **奇數頁警告**:總頁數為奇數時發出警告(通常代表掃描不一致)。 +- **區塊不等確認**:正面/背面區塊大小不同時要求確認。 +- **分組匯出**:依原始文件的頁數,將整理後的輸出分割成多個 PDF,並以 ZIP 下載。 + +## 輸出行為 + +- **預設**:一個輸出 PDF(輸入一個 PDF,輸出一個 PDF)。 +- **分組模式**:輸出依您設定的每份文件頁數分塊;若產生多個區塊,會以一個 ZIP 下載,否則下載單一 PDF。 + +如果區塊大小不等,會先整理成對的頁面,剩下未配對的頁面則附加在最後。 + +## 常見使用情境 + +- 分兩次掃描一疊雙面表單後恢復正確順序。 +- 重建辦公室掃描器先輸出所有正面再輸出所有背面的正反面文件組。 +- 在分割成個別文件前,對封存掃描檔進行後製處理。 + +## 提示 + +- 大多數雙面批次的總頁數應為偶數。 +- 如果背面的輸出看起來順序顛倒,請在 **反轉背面區塊** 與 **保持背面區塊原樣** 之間切換。 +- 對於 2 頁的原稿(正面+背面),請使用分組匯出並設定每份文件 `2` 頁。 + +## 相關工具 + +- [交錯混合頁面](./alternate-merge) +- [分割 PDF](./split-pdf) +- [合併 PDF](./merge-pdf) +- [複製與組織](./organize-pdf) diff --git a/docs/zh-TW/tools/edit-attachments.md b/docs/zh-TW/tools/edit-attachments.md new file mode 100644 index 00000000..2a9fa166 --- /dev/null +++ b/docs/zh-TW/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: 編輯附件 +description: 檢視並選擇性移除 PDF 文件中內嵌的檔案附件。 +--- + +# 編輯附件 + +檢查並管理 PDF 中的檔案附件。此工具會列出每個內嵌檔案的名稱與附件層級,讓您標記個別附件以移除,或一次移除全部。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 工具會自動掃描附件並以清單顯示。 +3. 每個附件都會顯示檔名,以及它是文件層級還是頁面層級的附件。 +4. 點擊附件旁的垃圾桶圖示將其標記為移除(再點一次可取消標記)。 +5. 使用 **移除所有附件** 按鈕一次選取全部,或使用 **取消全選** 清除選取。 +6. 點擊處理按鈕,儲存已移除所選附件的新 PDF。 + +## 功能 + +- 列出所有文件層級與頁面層級的附件 +- 個別或批次移除附件 +- 在確認變更前可切換選取狀態 +- 標記為移除的項目會顯示刪除線並降低不透明度 +- 下載已移除所選附件的修改後 PDF + +## 使用情境 + +- 在重新發布前,移除文件中內嵌的過時或錯誤檔案 +- 分享前從 PDF 移除敏感附件(財務資料、個人資訊) +- 移除不再需要的大型內嵌檔案,以縮小 PDF 檔案大小 +- 稽核內嵌內容,並在封存前清理文件 + +## 提示 + +- 標記為移除的附件會以刪除線顯示。如果改變主意,可在處理前切換回來。 +- 如果找不到附件,工具會清楚顯示「找不到附件」訊息,表示該 PDF 本來就沒有內嵌檔案。 + +## 相關工具 + +- [新增附件](./add-attachments) +- [擷取附件](./extract-attachments) +- [檢視中繼資料](./view-metadata) diff --git a/docs/zh-TW/tools/edit-metadata.md b/docs/zh-TW/tools/edit-metadata.md new file mode 100644 index 00000000..6f1cb5ab --- /dev/null +++ b/docs/zh-TW/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: 編輯中繼資料 +description: 檢視並修改 PDF 中繼資料欄位,包括標題、作者、關鍵字、日期與自訂屬性。 +--- + +# 編輯中繼資料 + +編輯 PDF 檔案中內嵌的中繼資料。此工具會以文件現有的中繼資料預先填入表單,讓您修改任何欄位,並將變更儲存為新的 PDF。 + +## 運作方式 + +1. 上傳 PDF 檔案。工具會讀取目前的中繼資料並填入表單。 +2. 編輯任何標準欄位:標題、作者、主旨、關鍵字、建立者、產生者。 +3. 使用日期時間選擇器調整建立日期與修改日期。 +4. 點擊新增按鈕並輸入鍵值組,即可新增自訂中繼資料欄位。 +5. 點擊處理按鈕儲存修改後的 PDF。 + +## 功能 + +- 從上傳的 PDF 預先填入所有現有中繼資料 +- 標準欄位:標題、作者、主旨、關鍵字、建立者、產生者 +- 建立日期與修改日期的日期時間選擇器 +- 自訂鍵值中繼資料欄位,可設定任意屬性 +- 將變更直接儲存至 PDF 的文件資訊字典 + +## 可編輯欄位 + +| 欄位 | 說明 | +| ------------ | -------------------------------- | +| **標題** | PDF 閱讀器中顯示的文件標題 | +| **作者** | 建立文件的個人或組織 | +| **主旨** | 文件主題的簡短說明 | +| **關鍵字** | 以逗號分隔的詞彙,用於搜尋與分類 | +| **建立者** | 最初建立內容的應用程式 | +| **產生者** | 產生 PDF 的應用程式 | +| **建立日期** | 文件最初建立的時間 | +| **修改日期** | 文件最後修改的時間 | +| **自訂欄位** | 您定義的任何其他鍵值組 | + +## 使用情境 + +- 在發布文件前設定適當的標題與作者 +- 加入關鍵字,提升在文件管理系統中的可搜尋性 +- 更新修改日期以反映目前的修訂版本 +- 加入部門、專案 ID 或機密等級等自訂中繼資料欄位 +- 清理原始編寫軟體留下的中繼資料 + +## 提示 + +- 自訂欄位會直接寫入 PDF 的資訊字典。部分 PDF 閱讀器可能不會顯示自訂欄位,但它們會保留在檔案中。 +- 將欄位留空即可從中繼資料中清除它。處理按鈕會儲存表單中的所有內容。 +- 若只想檢視而不編輯中繼資料,請使用 [檢視中繼資料](./view-metadata)。若要完全移除所有中繼資料,請使用移除中繼資料。 + +## 相關工具 + +- [檢視中繼資料](./view-metadata) +- [PDF 圖層(OCG)](./pdf-layers) +- [壓縮 PDF](./compress-pdf) diff --git a/docs/zh-TW/tools/edit-pdf.md b/docs/zh-TW/tools/edit-pdf.md new file mode 100644 index 00000000..8bab6d4d --- /dev/null +++ b/docs/zh-TW/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF 編輯器 +description: 直接在瀏覽器中為 PDF 加上註解、醒目提示、塗黑、新增形狀與圖片、搜尋與檢視。 +--- + +# PDF 編輯器 + +BentoPDF 的 PDF 編輯器可讓您為 PDF 加上註解、醒目提示、塗黑、評論、新增形狀與圖片,並搜尋內容。它直接在您的瀏覽器中載入功能完整的編輯器,無需上傳到伺服器。 + +## 運作方式 + +1. 點擊放置區或將檔案拖曳到其上,上傳您的 PDF。 +2. 內嵌的 PDF 編輯器會自動開啟並載入您的文件。 +3. 使用工具列加上註解、醒目提示、塗黑、新增文字、繪製形狀或插入圖片。 +4. 點擊 **下載編輯後的 PDF** 儲存變更。 + +## 功能 + +- 完整的註解工具列,提供醒目提示、底線、刪除線與手繪 +- 插入文字與加上評論 +- 塗黑工具:套用塗黑後會永久移除標記的內容。如果您點擊 **下載編輯後的 PDF** 時仍有標記尚未套用,編輯器會提議先套用它們。 +- 形狀工具:矩形、圓形、線條與箭頭 +- 在 PDF 頁面上插入圖片 +- 內建全文件文字搜尋 +- 以分頁支援多份文件(最多可同時開啟 10 份文件) +- 拖放載入檔案 + +## 使用情境 + +- 審閱合約,以醒目提示與評論標示變更 +- 分享前塗黑身分證號碼或財務資料等機密資訊 +- 為建築平面圖或工程圖加上註解 +- 在文件頁面上插入公司標誌或印章 +- 在冗長的法律文件中搜尋特定詞彙 + +## 提示 + +- 您可以同時開啟多個 PDF,並使用編輯器頂端的分頁列在它們之間切換。 +- 編輯器會保留原始 PDF 結構,因此字型、版面與表單欄位都會保持完整。 +- 標記文字或區域以進行塗黑時,在套用塗黑之前不會移除任何內容。當您塗黑選取的文字時,該文字在檔案屬性、書籤、評論與附件中的副本也會從下載檔案中移除,除非檔案已加密。 +- 若要大量加上浮水印或頁碼,請改用專用工具,以便更精細地控制格式。 + +## 相關工具 + +- [新增浮水印](./add-watermark) +- [簽署 PDF](./sign-pdf) +- [新增印章](./add-stamps) +- [移除註解](./remove-annotations) diff --git a/docs/zh-TW/tools/email-to-pdf.md b/docs/zh-TW/tools/email-to-pdf.md new file mode 100644 index 00000000..8b2e8ee2 --- /dev/null +++ b/docs/zh-TW/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: 電子郵件轉 PDF +description: 在瀏覽器中將 EML 與 MSG 電子郵件檔案轉換為 PDF。保留標頭、內文與附件清單。 +--- + +# 電子郵件轉 PDF + +將儲存的電子郵件檔案轉換為乾淨、可列印的 PDF。此工具會解析 EML 與 MSG 檔案,擷取完整郵件內容(標頭、內文與附件中繼資料),並將所有內容轉換為結構化的 PDF。適用於法律證據開示、記錄保存,或只是列印一封重要郵件。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :--- | :----- | :------------------------------------------------- | +| EML | `.eml` | 標準 MIME 電子郵件格式(大多數郵件用戶端皆可匯出) | +| MSG | `.msg` | Microsoft Outlook 專有格式 | + +## 運作方式 + +1. 點擊上傳區域,或拖放您的 EML 或 MSG 檔案。同一批次中可混合兩種格式。 +2. 檢查檔案清單。使用垃圾桶圖示移除不需要的項目,或點擊 **新增更多檔案** 加入更多郵件。 +3. 設定轉換選項(見下方)。 +4. 點擊 **轉換為 PDF**。工具會解析每封郵件、將內容轉為帶樣式的 HTML,再透過 PyMuPDF 引擎轉換為 PDF。 +5. 單一郵件會直接下載為 PDF。多封郵件會封裝成 `emails-converted.zip`。 + +## 選項 + +| 選項 | 預設值 | 說明 | +| :--------------------- | :----- | :------------------------------------------------------------ | +| **頁面大小** | A4 | 可選擇 A4、Letter 或 Legal 頁面尺寸。 | +| **包含副本與密件副本** | 開啟 | 啟用後,副本與密件副本收件者清單會出現在 PDF 的郵件標頭區段。 | +| **包含附件清單** | 開啟 | 啟用後,PDF 中會顯示郵件的檔案附件清單(含檔名與大小)。 | + +## 使用情境 + +- 將重要的商業往來信件封存為 PDF,以符合法規或供稽核使用 +- 為法律程序或證據開示要求列印郵件往來串 +- 為透過電子郵件收到的訂單確認、收據或合約建立永久記錄 +- 將 Outlook MSG 檔案備份為不需 Outlook 即可閱讀的格式 +- 從匯出的 EML 檔案記錄客戶支援往來內容 + +## 提示 + +- 同時支援 EML(Thunderbird、Apple Mail 及大多數郵件用戶端使用)與 Outlook MSG 檔案。從郵件用戶端匯出郵件後,直接拖放到工具中即可。 +- HTML 格式的郵件在 PDF 中會保留其樣式。純文字郵件則以乾淨易讀的格式呈現。 +- 附件清單會顯示檔名與大小,但不會將實際的附件檔案嵌入 PDF。 + +## 相關工具 + +- [XML 轉 PDF](./xml-to-pdf) +- [XPS 轉 PDF](./xps-to-pdf) diff --git a/docs/zh-TW/tools/epub-to-pdf.md b/docs/zh-TW/tools/epub-to-pdf.md new file mode 100644 index 00000000..d2e7af88 --- /dev/null +++ b/docs/zh-TW/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB 轉 PDF +description: 在瀏覽器中將 EPUB 電子書轉換為 PDF。免費、無需上傳,以隱私為優先的轉換。 +--- + +# EPUB 轉 PDF + +不必離開瀏覽器即可將 EPUB 電子書轉換為 PDF 檔案。EPUB 是數位書籍的開放標準,但有時您需要固定版面的 PDF 以便列印、加上註解,或分享給沒有電子書閱讀器的人。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :--- | :------ | :-------------------- | +| EPUB | `.epub` | EPUB 2 與 EPUB 3 檔案 | + +## 運作方式 + +1. 點擊上傳區域,或拖放您的 EPUB 檔案。支援多選。 +2. 檢查已上傳的檔案。使用垃圾桶圖示移除不需要的項目,或點擊 **新增更多檔案** 擴充批次。 +3. 點擊 **轉換為 PDF**。PyMuPDF 引擎會將 EPUB 內容(文字、圖片與格式)轉換為分頁的 PDF 輸出。 +4. 單一 EPUB 會直接下載為 PDF。多個檔案會封裝成名為 `epub-converted.zip` 的 ZIP 封存檔。 + +## 選項 + +轉換採用合理的預設值,無需任何設定。文字會依標準頁面尺寸重新排列,內嵌的字型與圖片也會保留到 PDF 中。 + +## 使用情境 + +- 列印無 DRM 的電子書,以便離開螢幕閱讀 +- 將 EPUB 稿件以固定版面的 PDF 提交審閱 +- 以所有作業系統都能原生開啟的格式封存數位書籍 +- 與沒有 EPUB 閱讀器的同事分享某個章節 +- 將以 EPUB 發布的技術文件轉換為可加註解的 PDF + +## 提示 + +- 內嵌音訊與影片等 EPUB 3 功能不會保留到 PDF 中,但所有文字、圖片與表格都能順利轉換。 +- 對於樣式複雜的 EPUB,請檢查輸出的前幾頁,確認版面是否忠實呈現。 + +## 相關工具 + +- [MOBI 轉 PDF](./mobi-to-pdf) +- [FB2 轉 PDF](./fb2-to-pdf) +- [CBZ 轉 PDF](./cbz-to-pdf) diff --git a/docs/zh-TW/tools/excel-to-pdf.md b/docs/zh-TW/tools/excel-to-pdf.md new file mode 100644 index 00000000..08de5d45 --- /dev/null +++ b/docs/zh-TW/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel 轉 PDF +description: 將 Excel 試算表(XLS、XLSX)、ODS 與 CSV 檔案轉換為 PDF,並保留格式。 +--- + +# Excel 轉 PDF + +將試算表檔案轉換為 PDF。此工具支援新版 Excel 檔案、舊版 XLS 格式、OpenDocument 試算表,甚至 CSV,全部透過瀏覽器內的 LibreOffice 引擎轉換,可保留儲存格格式、公式(以計算後的值呈現)、圖表與多工作表版面。 + +## 支援格式 + +| 格式 | 副檔名 | +| :------------------ | :------ | +| Excel(新版) | `.xlsx` | +| Excel(舊版) | `.xls` | +| OpenDocument 試算表 | `.ods` | +| CSV | `.csv` | + +## 運作方式 + +1. 點擊上傳區域,或拖放您的試算表檔案。 +2. 檢查檔案清單。新增更多檔案或移除不需要的檔案。 +3. 點擊 **轉換為 PDF**。LibreOffice 引擎會在首次使用時初始化,然後處理每個檔案。 +4. 單一檔案會直接下載為 PDF。多個檔案會以 `excel-converted.zip` 提供。 + +## 選項 + +此工具沒有額外設定。LibreOffice 引擎會依據試算表內建的設定決定頁面版面、縮放比例與列印範圍。 + +## 輸出 + +| 輸入數量 | 輸出 | +| :----------- | :------------------------------------------------------ | +| 1 個檔案 | 單一 PDF 下載(原始檔名加上 `.pdf` 副檔名) | +| 2 個以上檔案 | ZIP 封存檔(`excel-converted.zip`),每個檔案各一個 PDF | + +## 使用情境 + +- 將 Excel 中的財務報表或預算轉換為 PDF 以便發布 +- 從庫存或產品型錄試算表建立可直接列印的 PDF +- 與未安裝 Excel 的利害關係人分享資料分析結果 +- 以不可編輯的格式封存季度報告 +- 將 LibreOffice Calc 的 ODS 檔案轉換為 PDF + +## 提示 + +- 試算表中內嵌的圖表會呈現在 PDF 中。轉換前請確認它們在原始檔案中顯示正確。 +- 如果試算表有多個工作表,所有工作表都會包含在 PDF 輸出中。 +- 對於沒有格式的簡單 CSV 資料,[CSV 轉 PDF](./csv-to-pdf) 工具提供更輕量的轉換。需要保留格式、圖表或多個工作表時,請使用 Excel 轉 PDF。 + +## 相關工具 + +- [CSV 轉 PDF](./csv-to-pdf) +- [Word 轉 PDF](./word-to-pdf) +- [PowerPoint 轉 PDF](./powerpoint-to-pdf) diff --git a/docs/zh-TW/tools/extract-attachments.md b/docs/zh-TW/tools/extract-attachments.md new file mode 100644 index 00000000..b16114c3 --- /dev/null +++ b/docs/zh-TW/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: 擷取附件 +description: 從一個或多個 PDF 擷取所有內嵌的檔案附件,並以 ZIP 封存檔下載。 +--- + +# 擷取附件 + +從一個或多個 PDF 檔案中取出所有內嵌附件。所有擷取的檔案都會打包成單一 ZIP 封存檔供下載。 + +## 運作方式 + +1. 上傳一個或多個含有內嵌附件的 PDF 檔案。 +2. 點擊 **擷取附件**。 +3. 工具會掃描每個 PDF 中的文件層級與頁面層級附件。 +4. 找到的所有檔案會封裝成 ZIP 封存檔並自動下載。 +5. 狀態訊息會確認找到的附件數量及其總大小。 + +## 功能 + +- 一次從多個 PDF 批次擷取 +- 同時擷取文件層級與頁面層級的附件 +- 輸出包含所有擷取檔案的單一 ZIP 檔 +- 顯示附件總數與合計檔案大小 +- 找不到附件時會顯示清楚的狀態訊息 + +## 使用情境 + +- 還原報告 PDF 中內嵌的資料檔案 +- 從作品集或規格文件中取出圖片素材 +- 從訓練或合規 PDF 中擷取補充資料 +- 稽核一批 PDF 中內嵌了哪些檔案 + +## 提示 + +- 如果工具回報沒有附件,該 PDF 可能含有的是內嵌圖片或表單資料,這些並不是檔案附件。內嵌圖片請使用 [擷取圖片](./extract-images)。 +- 處理多個 PDF 時,所有檔案的附件都會放進同一個 ZIP。檔名會沿用原始內嵌時的名稱。 + +## 相關工具 + +- [新增附件](./add-attachments) +- [編輯附件](./edit-attachments) +- [擷取圖片](./extract-images) diff --git a/docs/zh-TW/tools/extract-images.md b/docs/zh-TW/tools/extract-images.md new file mode 100644 index 00000000..db62576c --- /dev/null +++ b/docs/zh-TW/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: 擷取圖片 +description: 擷取 PDF 檔案中所有內嵌圖片。以格狀檢視預覽,並可個別下載或以 ZIP 封存檔下載。 +--- + +# 擷取圖片 + +從一個或多個 PDF 檔案中取出所有內嵌圖片。擷取的圖片會顯示在預覽格狀檢視中,您可以個別下載,或以 ZIP 一次取得全部。由 PyMuPDF 驅動。 + +## 運作方式 + +1. 點擊放置區或將檔案拖曳到其上,上傳一個或多個 PDF。可視需要新增更多檔案或移除個別檔案。 +2. 點擊 **擷取** 開始處理。 +3. 工具會掃描每個上傳 PDF 的每一頁,找出並擷取內嵌圖片。 +4. 擷取的圖片會以縮圖格狀顯示。每張圖片都有下載按鈕。 +5. 點擊 **全部下載** 將所有圖片儲存為 ZIP 封存檔。 + +## 選項 + +此工具沒有可設定的選項。所有內嵌圖片都會以其原生格式擷取(通常是 PNG、JPEG,或圖片嵌入 PDF 時所使用的任何格式)。 + +## 輸出格式 + +- 圖片會在預覽格狀檢視中顯示,名稱為 `image_1.png`、`image_2.jpg` 等。 +- **全部下載** 會產生包含所有圖片的 `extracted-images.zip`。 +- 可從格狀檢視中逐一下載個別圖片。 + +## 使用情境 + +- 從 PDF 中還原照片或圖形,以便在其他專案中重複使用。 +- 從型錄 PDF 中擷取產品圖片,用於電子商務商品頁面。 +- 從技術文件中取出圖表,用於簡報。 +- 在分享文件前,稽核其中內嵌了哪些圖片。 + +## 提示 + +- 此工具會依圖片在 PDF 中的儲存方式原樣擷取,不會將頁面重新繪製成圖片。若要如此,請使用 [PDF 轉 PNG](./pdf-to-png) 或 [PDF 轉 JPG](./pdf-to-jpg)。 +- 如果工具回報「找不到圖片」,該 PDF 可能使用向量圖形而非內嵌點陣圖片,或者它是整頁為一張大圖的掃描文件。 +- 批次處理可跨多個 PDF 進行。所有檔案的圖片會合併到同一個格狀檢視與 ZIP 中。 + +## 相關工具 + +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 JPG](./pdf-to-jpg) +- [PDF 工作流程建構器](./pdf-workflow) diff --git a/docs/zh-TW/tools/extract-pages.md b/docs/zh-TW/tools/extract-pages.md new file mode 100644 index 00000000..bc96fef5 --- /dev/null +++ b/docs/zh-TW/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: 擷取頁面 +description: 將 PDF 中特定範圍的頁面儲存為新文件。 +--- + +# 擷取頁面 + +從 PDF 中取出一組頁面並另存為新檔案。使用範圍語法精確指定您要的頁面,工具會建立只包含這些頁面的乾淨 PDF。 + +## 運作方式 + +1. 上傳 PDF 檔案。工具會顯示檔名、大小與總頁數。 +2. 使用範圍語法輸入要擷取的頁面(例如 `1-5`、`3, 7, 10-12`)。 +3. 可選擇將每個範圍分別下載為獨立的 PDF,並打包成 ZIP 封存檔。 +4. 點擊處理按鈕。擷取的頁面會下載為新的 PDF(或 ZIP)。 + +## 功能 + +- 彈性的頁面範圍語法:單頁、範圍或以逗號分隔的組合 +- 上傳後顯示總頁數,方便參考 +- 可選擇輸出為單一合併 PDF,或以 ZIP 打包的個別檔案 +- 保留原始頁面內容與格式 + +## 使用情境 + +- 從冗長報告中取出執行摘要(前幾頁) +- 從教科書 PDF 中擷取單一章節 +- 將表單套件中的特定頁面另存為獨立文件 +- 從大型檔案中選取部分頁面建立樣本文件 + +## 提示 + +- 頁碼從 1 開始。第一頁請使用 `1`,而非 `0`。 +- 若要移除頁面而非擷取,請使用 [刪除頁面](./delete-pages),這是相反的操作。 +- 如果您需要以縮圖視覺化選取頁面,請使用 [分割 PDF](./split-pdf) 的視覺選取模式。 + +## 相關工具 + +- [分割 PDF](./split-pdf) +- [刪除頁面](./delete-pages) +- [合併 PDF](./merge-pdf) diff --git a/docs/zh-TW/tools/extract-tables.md b/docs/zh-TW/tools/extract-tables.md new file mode 100644 index 00000000..16d95ceb --- /dev/null +++ b/docs/zh-TW/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: 擷取 PDF 表格 +description: 偵測並擷取 PDF 文件中的表格。可逐一表格匯出為 CSV、JSON 或 Markdown。 +--- + +# 擷取 PDF 表格 + +偵測 PDF 中的所有表格,並讓您以所選格式匯出:CSV、JSON 或 Markdown。每個表格都會個別擷取,並附上頁面與位置中繼資料。由 PyMuPDF 的表格偵測引擎驅動。 + +## 運作方式 + +1. 點擊放置區或將檔案拖曳到其上,上傳 PDF。 +2. 選擇您偏好的 **匯出格式**:CSV、JSON 或 Markdown。 +3. 點擊 **擷取** 開始處理。 +4. 如果找到一個表格,會下載為單一檔案。多個表格則會產生 ZIP 封存檔,每個表格各一個檔案。 + +## 選項 + +- **匯出格式**:可選擇: + - **CSV**:逗號分隔值,含有逗號、引號或換行的欄位會正確加上引號。適用於試算表與資料庫。 + - **JSON**:陣列的陣列結構,以 2 個空格縮排美化輸出。適用於程式處理。 + - **Markdown**:由 PyMuPDF 產生的管線分隔表格格式。適用於文件與 README 檔案。 + +## 輸出格式 + +- **單一表格**:`filename_table.csv`(或 `.json` / `.md`) +- **多個表格**:`filename_tables.zip`,內含名為 `table_1_page3.csv`、`table_2_page5.csv` 等的檔案。 + +## 使用情境 + +- 從冗長的 PDF 報告中擷取特定表格,而不必取出整份文件的資料。 +- 取得 Markdown 格式的表格,直接貼到 GitHub issue、wiki 或文件中。 +- 從 PDF 表格中取出結構化的 JSON 資料,用於 API 整合或指令碼。 +- 將不同版本 PDF 的表格都匯出為 CSV 並比對差異,以進行比較。 + +## 提示 + +- 此工具提供逐一表格的控制。如果您只想將所有表格匯出到單一 CSV,請使用 [PDF 轉 CSV](./pdf-to-csv)。如需完整的 Excel 活頁簿,請使用 [PDF 轉 Excel](./pdf-to-excel)。 +- 跨多頁的表格可能會在每一頁被偵測為獨立表格。您可能需要手動將它們串接起來。 +- 如果未偵測到任何表格,該 PDF 可能是掃描圖片。請先進行 OCR 以加入文字層。 + +## 相關工具 + +- [PDF 轉 CSV](./pdf-to-csv) +- [PDF 轉 Excel](./pdf-to-excel) +- [PDF 轉文字](./pdf-to-text) diff --git a/docs/zh-TW/tools/fb2-to-pdf.md b/docs/zh-TW/tools/fb2-to-pdf.md new file mode 100644 index 00000000..856eaf8d --- /dev/null +++ b/docs/zh-TW/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 轉 PDF +description: 在瀏覽器中將 FictionBook (FB2) 電子書檔案轉換為 PDF。免費、隱私、不上傳伺服器。 +--- + +# FB2 轉 PDF + +將 FictionBook 2 (FB2) 檔案轉換為 PDF 文件。FB2 是一種以 XML 為基礎的電子書格式,在俄羅斯與東歐相當普及。雖然在某些平台上支援良好,但在其他平台上幾乎無人知曉,轉換成 PDF 可讓您的書在任何地方都能閱讀。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :------------ | :----- | :------------------------ | +| FictionBook 2 | `.fb2` | 以 XML 為基礎的電子書格式 | + +## 運作方式 + +1. 點擊上傳區域,或將 FB2 檔案拖放進來。可一次選取多個檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除個別項目,或點擊 **新增更多檔案** 加入更多檔案。 +3. 點擊 **轉換為 PDF**。PyMuPDF 引擎會解析 FB2 的 XML 結構,並將其轉譯為分頁的 PDF 內容。 +4. 單一檔案會直接下載為 PDF。多個轉換結果會打包成 `fb2-converted.zip`。 + +## 選項 + +無需任何設定。轉換器會自動處理 FB2 的 XML 結構,並保留章節分隔、格式與所有內嵌圖片。 + +## 使用情境 + +- 在僅支援 PDF 的裝置或 App 上閱讀 FB2 電子書 +- 列印以 FB2 格式發行的俄文文學作品 +- 將 FB2 書庫封存為通用支援的格式 +- 與閱讀器不支援 FictionBook 的人分享書籍 + +## 小技巧 + +- FB2 檔案是純 XML,因此通常檔案很小,即使在瀏覽器中也能快速轉換。 +- 如果您的 FB2 檔案壓縮為 `.fb2.zip`,請先解壓縮再上傳。 + +## 相關工具 + +- [EPUB 轉 PDF](./epub-to-pdf) +- [MOBI 轉 PDF](./mobi-to-pdf) +- [XML 轉 PDF](./xml-to-pdf) diff --git a/docs/zh-TW/tools/fix-page-size.md b/docs/zh-TW/tools/fix-page-size.md new file mode 100644 index 00000000..f5c7a111 --- /dev/null +++ b/docs/zh-TW/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: 統一頁面尺寸 +description: 將 PDF 中所有頁面統一為相同尺寸。可選擇標準紙張尺寸或設定自訂尺寸。 +--- + +# 統一頁面尺寸 + +由多個來源組合而成的 PDF 經常出現頁面尺寸不一致的情況:有些是 Letter,有些是 A4,有些則完全不是標準尺寸。此工具會將每一頁強制調整為單一目標尺寸,並視需要縮放內容以符合或填滿頁面。 + +## 運作方式 + +1. 上傳一個 PDF 檔案。 +2. 從下拉選單選擇 **目標頁面尺寸**(A4、Letter、Legal、A3、A5、Tabloid 或自訂)。 +3. 選擇 **方向**:「自動」會保留每頁原本的方向,您也可以強制設為直向或橫向。 +4. 選擇 **內容縮放** 模式:符合(保留所有內容,可能會加上邊界)或填滿(填滿頁面,可能會裁切邊緣)。 +5. 可選擇為新增的邊界設定 **背景顏色**。 +6. 點擊 **統一頁面尺寸**。 + +## 選項 + +- **標準尺寸**:A4、Letter、Legal、A3、A5、Tabloid +- **自訂尺寸**:以英吋或公釐輸入寬度與高度 +- **方向**:自動、直向、橫向 +- **縮放模式**:符合或填滿(裁切) +- **背景顏色**:邊界填充可使用任何顏色 + +## 使用情境 + +- 統一合併後的 PDF,其中頁面來自不同的掃描器 +- 將 US Letter 文件轉換為 A4 以供國際發布 +- 準備需要一致裁切尺寸的印刷用 PDF +- 修正略微偏離標準的頁面(例如 8.49 x 11.02 英吋而非 8.5 x 11) + +## 小技巧 + +- 使用符合模式可確保不遺失任何內容。填滿模式看起來較整齊,但可能會裁掉邊緣。 +- 使用頁面尺寸工具檢查輸出結果,確認每一頁都符合目標尺寸。 +- 預設背景顏色為白色;如果您的文件邊界是深色,請改用深色。 + +## 相關工具 + +- [頁面尺寸](./page-dimensions):在修正前後檢查頁面尺寸 +- [壓縮 PDF](./compress-pdf):統一尺寸後縮小檔案大小 +- [裁切 PDF](./crop-pdf):手動裁切頁面,而非自動縮放 diff --git a/docs/zh-TW/tools/flatten-pdf.md b/docs/zh-TW/tools/flatten-pdf.md new file mode 100644 index 00000000..ff76c324 --- /dev/null +++ b/docs/zh-TW/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: 平面化 PDF +description: 將互動式表單與註解平面化為靜態內容。讓表單欄位無法編輯,並將註解燒錄到頁面中。 +--- + +# 平面化 PDF + +平面化會將互動元素(表單欄位、下拉選單、核取方塊、註解、螢光標記、便利貼)直接合併到頁面內容中。外觀維持不變,但所有內容都無法再編輯或擷取。這就像是把填好的表單列印出來再掃描回去,只是品質完全不會降低。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。 +2. 點擊 **平面化 PDF**。 +3. 單一檔案會直接下載。多個檔案則會產生 ZIP 壓縮檔。 + +此工具使用 pdf-lib 平面化表單欄位(透過 `form.flatten()`),並使用專用的註解平面化程式將註解燒錄到頁面串流中。兩項作業會在一次處理中完成。 + +## 會被平面化的內容 + +- **表單欄位**:文字輸入框、核取方塊、選項按鈕、下拉選單、簽名欄位 +- **註解**:評論、螢光標記、刪除線、底線、便利貼、印章、手寫註解 +- **互動元素**:按鈕、動作觸發器 + +## 維持不變的內容 + +- 文字內容(仍可選取與搜尋) +- 圖片與圖形 +- 頁面版面與尺寸 +- 書籤與目錄 +- 超連結(以註解為基礎的除外) + +## 使用情境 + +- 鎖定已完成的表單,讓收件者無法更改已提交的答案 +- 準備封存用的 PDF,不需要互動元素 +- 修正因註解在不同檢視器中呈現方式不同而造成的顯示問題 +- 確保已簽署的文件在簽名後無法被修改 +- 移除表單欄位定義與註解物件以縮小檔案大小 + +## 小技巧 + +- 請在所有編輯完成後再平面化。PDF 一旦平面化就無法還原。 +- 如果您需要平面化並同時移除中繼資料、JavaScript 與附件,請改用清理 PDF 工具,它將平面化列為選項之一。 +- 有些 PDF 會顯示「找不到表單」,如果文件只有註解而沒有表單欄位,這是正常現象。 + +## 相關工具 + +- [清理 PDF](./sanitize-pdf):平面化表單,並移除中繼資料、指令碼等 +- [光柵化 PDF](./rasterize-pdf):轉換為以圖片為基礎的 PDF,達到最徹底的平面化 +- [字型轉外框](./font-to-outline):將字型平面化為向量路徑 +- [保護 PDF](./protect-pdf):以密碼鎖定平面化後的 PDF diff --git a/docs/zh-TW/tools/font-to-outline.md b/docs/zh-TW/tools/font-to-outline.md new file mode 100644 index 00000000..0117dd23 --- /dev/null +++ b/docs/zh-TW/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: 字型轉外框 +description: 將所有 PDF 字型轉換為向量外框,在各種裝置上呈現一致。消除字型相依問題。 +--- + +# 字型轉外框 + +將字型轉為外框,會把每個文字字元從字型字符轉換為向量路徑。PDF 不再依賴任何已安裝的字型,在每台裝置、每種作業系統與每台印表機上都能呈現完全相同的效果。這是印前作業流程中的標準步驟。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。 +2. 點擊 **轉換為外框**。 +3. Ghostscript 會將所有文字轉換為向量路徑。 +4. 下載結果。多個檔案會產生 ZIP 壓縮檔。 + +無需任何設定。此工具使用 Ghostscript (WebAssembly) 在一次處理中將所有字型參照轉換為外框路徑。 + +## 會改變的地方 + +- 文字字元變成向量曲線(貝茲路徑) +- 不再需要嵌入字型,PDF 在字符層級即可自給自足 +- 檔案大小可能會增加,因為向量路徑通常比字型參照更大 +- 外觀完全保留 + +## 會失去的功能 + +- 選取文字與複製貼上 +- 文字搜尋(Ctrl+F 將無法使用) +- 編輯文字內容的能力 +- 螢幕閱讀器無障礙功能 + +## 使用情境 + +- 將 PDF 送交要求字型轉外框的印刷廠 +- 與沒有安裝自訂或授權字型的人分享使用這些字型的文件 +- 避免在其他系統上因字型替換而改變文件外觀 +- 為需要向量輸入的雷射雕刻或 CNC 切割流程準備 PDF +- 確保大量使用標誌的 PDF 在所有平台上都能正確顯示 + +## 小技巧 + +- 請保留原始 PDF。轉外框無法還原,您無法將路徑轉回可編輯的文字。 +- 如果您需要文字保持可搜尋,可考慮改用光柵化 PDF 工具,之後再進行 OCR。 +- 轉外框的 PDF 通常較大。如果在意檔案大小,之後可執行壓縮 PDF。 + +## 相關工具 + +- [平面化 PDF](./flatten-pdf):平面化表單與註解,不影響字型 +- [光柵化 PDF](./rasterize-pdf):轉換為以圖片為基礎的 PDF,而非向量外框 +- [壓縮 PDF](./compress-pdf):轉外框後縮小檔案大小 +- [PDF 轉 PDF/A](./pdf-to-pdfa):確保字型獨立後轉換為封存格式 diff --git a/docs/zh-TW/tools/form-creator.md b/docs/zh-TW/tools/form-creator.md new file mode 100644 index 00000000..b9cbfda8 --- /dev/null +++ b/docs/zh-TW/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: 建立 PDF 表單 +description: 透過拖放文字欄位、核取方塊、下拉選單、選項按鈕等元素,建立可填寫的 PDF 表單。 +--- + +# 建立 PDF 表單 + +從零開始設計專業的可填寫 PDF 表單,或在現有 PDF 中加入欄位。視覺化編輯器可讓您將表單元素(文字欄位、核取方塊、下拉選單、選項按鈕、簽名欄位等)直接拖放到頁面預覽上。設定欄位屬性、建立條件式顯示規則,並匯出完整互動式的 PDF 表單。 + +## 運作方式 + +1. 上傳現有的 PDF,**或** 點擊 **建立空白 PDF** 從零開始。 +2. 如果建立空白 PDF,請選擇頁面尺寸(Letter、A4、A5、Legal、Tabloid、A3 或自訂尺寸)。 +3. 表單編輯器會開啟,包含欄位類型工具列與頁面預覽區域。 +4. 從工具列選擇欄位類型,然後點擊頁面放置欄位。 +5. 拖曳欄位以調整位置。使用調整大小控點調整尺寸。 +6. 點擊欄位開啟屬性面板,您可以在其中設定欄位名稱、預設值、字型大小、對齊方式等。 +7. 使用頁面控制項在頁面之間切換。 +8. 點擊 **儲存** 下載完成的可填寫 PDF。 + +## 功能 + +- 拖放式欄位放置,附有視覺化的調整大小控點 +- 欄位類型:文字輸入、多行文字、核取方塊、下拉選單、選項按鈕、簽名、日期、數字與條碼 +- 屬性面板可設定每個欄位的名稱、標籤、預設值、字型大小、顏色、對齊方式與驗證 +- 欄位動作與條件式顯示規則(依其他欄位的值顯示或隱藏欄位) +- 多頁表單的頁面導覽 +- 擷取現有欄位:自動偵測並匯入已上傳 PDF 中的表單欄位 +- 可使用上傳的 PDF 或空白頁面作為表單畫布 +- 多種頁面尺寸預設值以及自訂尺寸 +- 由 bwip-js 提供的條碼產生功能 +- 選項按鈕群組管理 + +## 選項 + +**頁面尺寸預設值(適用於空白 PDF):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- 自訂(指定寬度與高度) + +**欄位屬性(依欄位類型而異):** + +- 名稱、標籤與預留位置文字 +- 預設值 +- 字型、大小與顏色 +- 文字對齊(靠左、置中、靠右) +- 必填欄位切換 +- 唯讀切換 +- 文字欄位的最大長度 +- 下拉選單與選項按鈕的選項清單 +- 條件式顯示動作 + +## 使用情境 + +- 建立新進員工到職表單,用文字欄位填寫個人資料,用核取方塊確認政策 +- 建立客戶資料問卷,以下拉選單選擇服務項目 +- 設計含計算欄位與條碼識別碼的訂購單 +- 建立以選項按鈕標示合格/不合格的檢查清單 +- 建立會依回答顯示後續問題的條件式問卷 + +## 小技巧 + +- 如果您上傳現有的 PDF,工具會嘗試擷取其中已有的表單欄位,讓您編輯或新增欄位。 +- 使用選項按鈕群組功能建立互斥選項。同一選項群組中的欄位共用一個群組名稱。 +- 下載表單並在 [PDF 表單填寫器](./form-filler) 中開啟,以測試欄位行為。 + +## 相關工具 + +- [PDF 表單填寫器](./form-filler) +- [簽署 PDF](./sign-pdf) +- [PDF 編輯器](./edit-pdf) diff --git a/docs/zh-TW/tools/form-filler.md b/docs/zh-TW/tools/form-filler.md new file mode 100644 index 00000000..a36396f2 --- /dev/null +++ b/docs/zh-TW/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF 表單填寫器 +description: 透過內嵌檢視器,直接在瀏覽器中填寫 PDF 表單,包括 XFA 表單。 +--- + +# PDF 表單填寫器 + +開啟含有表單欄位的 PDF,並直接在內嵌檢視器中填寫。此工具同時支援標準 AcroForm 欄位與舊版 XFA (XML Forms Architecture) 表單。填寫完成後,只要點一下就能下載填好的版本。 + +## 運作方式 + +1. 上傳含有表單欄位的 PDF。 +2. 文件會在整合的 PDF 檢視器中開啟,表單欄位會呈現為互動式輸入框。 +3. 點擊文字欄位、核取方塊、下拉選單與選項按鈕進行填寫。 +4. 點擊 **儲存並下載填寫的表單** 取得完成的 PDF。 + +## 功能 + +- 內嵌 PDF.js 檢視器,支援完整的表單欄位互動 +- 支援標準 AcroForm 欄位(文字輸入框、核取方塊、下拉選單、選項按鈕) +- 支援舊版以 XML 為基礎的 XFA 表單 +- 依頁面尺寸自動調整檢視器大小 +- 顯示檔案名稱與大小資訊 + +## 選項 + +沒有其他設定選項。上傳表單、填寫,然後下載即可。 + +## 使用情境 + +- 填寫稅務表單、保險申請書或政府文件 +- 填寫以 PDF 附件形式收到的求職申請表 +- 填寫供應商到職表單或供應商問卷 +- 以核取方塊欄位簽核合規檢查清單 +- 在看診前填寫醫療初診表 + +## 小技巧 + +- XFA 表單是舊版格式,只有部分 PDF 檢視器支援。如果您在 Chrome 或大多數其他工具中開啟 XFA PDF 時看到空白頁面,代表這些檢視器不支援 XFA。BentoPDF 的表單填寫器與 Firefox 都能正確處理 XFA。 +- 對於沒有表單欄位的 PDF,請先使用 [建立 PDF 表單](./form-creator) 工具新增欄位,再到這裡填寫。 +- 檢視器會自動調整大小以符合 PDF 的頁面尺寸。 + +## 相關工具 + +- [建立 PDF 表單](./form-creator) +- [簽署 PDF](./sign-pdf) +- [PDF 編輯器](./edit-pdf) diff --git a/docs/zh-TW/tools/header-footer.md b/docs/zh-TW/tools/header-footer.md new file mode 100644 index 00000000..35fa5c7c --- /dev/null +++ b/docs/zh-TW/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: 頁首與頁尾 +description: 在 PDF 頁面加入可自訂的頁首與頁尾文字,並支援動態頁碼變數。 +--- + +# 頁首與頁尾 + +在 PDF 頁面的六個位置加入文字:頁首左側、頁首中央、頁首右側、頁尾左側、頁尾中央與頁尾右側。此工具支援頁碼與總頁數的動態變數,因此您可以建立像「第 3 頁,共 10 頁」這樣會依每頁自動更新的範本。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 選項面板會出現,顯示格式控制項與六個文字輸入欄位。 +3. 在任一頁首/頁尾位置輸入您想要的文字。 +4. 使用 `{page}` 與 `{total}` 預留位置進行動態頁碼編排。 +5. 調整字型大小、字型顏色,並可選擇限制於特定頁面範圍。 +6. 點擊 **新增頁首與頁尾** 進行處理並下載。 + +## 選項 + +- **頁面範圍**:可選擇限制哪些頁面加上頁首與頁尾。留空則套用至所有頁面。格式:「1-3, 5」(以逗號分隔的範圍)。 +- **字型大小**:介於 6 到 24 點之間。預設為 10。 +- **字型顏色**:使用顏色選擇器挑選任何顏色。 +- **頁首左側/中央/右側**:每頁頂端的文字欄位。 +- **頁尾左側/中央/右側**:每頁底部的文字欄位。 + +## 功能 + +- 每頁六個獨立的文字位置 +- 動態 `{page}` 變數,插入目前頁碼 +- 動態 `{total}` 變數,插入總頁數 +- 頁面範圍篩選,可指定特定頁面 +- 可自訂字型大小與顏色 +- 使用 Helvetica 字型,輸出簡潔專業 + +## 使用情境 + +- 在報告的頁尾中央加入「第 {page} 頁,共 {total} 頁」 +- 在頁首左側放置公司名稱,並在頁首右側放置文件日期 +- 在法律文件的頁尾加入機密聲明 +- 在特定頁面範圍標上文件修訂版本號 + +## 小技巧 + +- 在同一欄位中結合 `{page}` 與 `{total}`,即可做出「第 {page} 頁,共 {total} 頁」或「{page}/{total}」等格式。 +- 大部分欄位都可以留空,只填寫您需要的位置。空白欄位會直接略過。 +- 若需要含圖片或標誌的複雜頁首,可考慮使用 [新增浮水印](./add-watermark) 工具,並將其放在頁面頂端。 + +## 相關工具 + +- [頁碼](./page-numbers) +- [新增浮水印](./add-watermark) +- [Bates 編號](./bates-numbering) diff --git a/docs/zh-TW/tools/heic-to-pdf.md b/docs/zh-TW/tools/heic-to-pdf.md new file mode 100644 index 00000000..0e15f45f --- /dev/null +++ b/docs/zh-TW/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC 轉 PDF +description: 直接在瀏覽器中將 iPhone 與 iPad 的 HEIC 和 HEIF 圖片轉換為 PDF 格式。 +--- + +# HEIC 轉 PDF + +將 HEIC/HEIF 圖片轉換為 PDF。自 iOS 11 起,HEIC 就是 iPhone 與 iPad 的預設照片格式。此工具讓您無需安裝任何桌面軟體或將檔案上傳到伺服器,就能把這些照片轉成 PDF。 + +## 支援格式 + +| 格式 | 副檔名 | +| :--- | :------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## 運作方式 + +1. 點擊上傳區域,或將 HEIC/HEIF 檔案拖放進來。 +2. 檢查檔案清單並移除不需要的檔案。 +3. 點擊 **轉換為 PDF**。結果會下載為 `from_heic.pdf`。 + +每個 HEIC 檔案都會透過 heic2any 函式庫解碼,以 92% 品質轉換為 PNG。接著使用 pdf-lib 將 PNG 嵌入 PDF,每張圖片各佔一頁,並保持完整解析度。 + +## 選項 + +此工具沒有提供其他設定。HEIC 圖片會先以高品質 (0.92) 轉換為 PNG 再嵌入。 + +## 使用情境 + +- 以 iPhone 照片建立 PDF,附加到保險理賠或報告中 +- 將房地產物件的 HEIC 照片轉換為單一可列印文件 +- 將 iPad 螢幕截圖(HEIF 格式)轉為可分享的 PDF +- 批次轉換旅遊照片製作旅行日誌 + +## 小技巧 + +- HEIC 解碼完全在瀏覽器中以 WebAssembly 進行。第一次轉換時可能需要稍候,等待解碼器載入。 +- 如果您需要將 HEIC 與其他圖片格式(JPG、PNG 等)混合,請使用 [圖片轉 PDF](./image-to-pdf) 工具,它能同時處理 HEIC 與所有其他格式。 +- iPhone 的 HEIC 檔案通常含有 EXIF 資料,包括 GPS 座標。輸出的 PDF 不會保留這些中繼資料。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [JPG 轉 PDF](./jpg-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) diff --git a/docs/zh-TW/tools/image-to-pdf.md b/docs/zh-TW/tools/image-to-pdf.md new file mode 100644 index 00000000..25b453ea --- /dev/null +++ b/docs/zh-TW/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: 圖片轉 PDF +description: 將 JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP、PSD 及其他 10 多種圖片格式轉換為單一 PDF 檔案。 +--- + +# 圖片轉 PDF + +萬用的圖片轉 PDF 轉換器。上傳幾乎任何格式的圖片,並將它們合併為單一 PDF 文件。每張圖片各佔一頁,頁面大小與原始尺寸相符。 + +## 支援格式 + +| 格式 | 副檔名 | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +這是 BentoPDF 所有圖片轉換器中支援格式最廣的一個。如果您只需要特定格式,請改用對應的專用工具。 + +## 運作方式 + +1. 點擊上傳區域,或將圖片檔案拖放進來。可一次選取多個檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除不需要的檔案,或點擊 **新增更多檔案** 加入其他圖片。 +3. 從下拉選單選擇 **PDF 品質** 等級。 +4. 點擊 **轉換為 PDF**。工具會透過 PyMuPDF 引擎處理圖片,並將結果下載為 `images_to_pdf.pdf`。 + +## 選項 + +**PDF 品質** 控制圖片嵌入 PDF 時套用的壓縮程度: + +- **高品質**:壓縮最少,檔案較大。最適合列印或封存。 +- **中等品質**(預設):壓縮程度平衡。適合大多數用途。 +- **低品質**:強力壓縮,檔案最小。適合電子郵件或快速分享。 + +HEIC 與 WebP 檔案會在嵌入前自動轉換為 PNG。這會在背後自動完成,不需要任何額外步驟。 + +## 使用情境 + +- 將用手機相機掃描的收據或文件合併為一個 PDF +- 以不同格式的圖片製作作品集或型錄 +- 無需安裝桌面軟體,就能將 iPhone 照片 (HEIC) 轉為可分享的 PDF +- 將 PSD 匯出檔與螢幕截圖組合成交付給客戶的設計樣稿 +- 將一整個資料夾的舊式圖片格式(PNM、JXR、JP2)封存為單一 PDF + +## 小技巧 + +- PDF 中的圖片順序與檔案清單中的順序相同。請依您想要的順序上傳。 +- 若要盡可能縮小檔案,請選擇低品質。對於以文字為主的掃描檔,視覺差異通常微乎其微。 +- 如果您只有一種圖片格式,專用轉換器(JPG 轉 PDF、PNG 轉 PDF 等)能以更簡單的介面提供相同結果。 + +## 相關工具 + +- [JPG 轉 PDF](./jpg-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) +- [HEIC 轉 PDF](./heic-to-pdf) +- [WebP 轉 PDF](./webp-to-pdf) diff --git a/docs/zh-TW/tools/index.md b/docs/zh-TW/tools/index.md new file mode 100644 index 00000000..b33d43c2 --- /dev/null +++ b/docs/zh-TW/tools/index.md @@ -0,0 +1,183 @@ +# 工具參考 + +BentoPDF 提供 **130 多種工具** 來處理 PDF。所有工具都完全在您的瀏覽器中執行,您的檔案絕不會離開您的裝置。 + +--- + +## 編輯與註解 + +使用完整的編輯工具組,修改、標註並強化您的 PDF 文件。 + +
+ +- [**PDF 編輯器**](./edit-pdf):註解、螢光標記、塗黑、評論、加入形狀與圖片、搜尋及檢視 PDF。 +- [**編輯書籤**](./bookmark):新增、編輯、匯入、刪除及擷取 PDF 書籤。 +- [**目錄**](./table-of-contents):從 PDF 書籤產生目錄頁。 +- [**頁碼**](./page-numbers):在文件中插入頁碼。 +- [**新增頁面標籤**](./add-page-labels):套用含羅馬數字、前綴與自訂起始值的 PDF 頁面標籤。 +- [**Bates 編號**](./bates-numbering):為一個或多個 PDF 檔案加上連續的 Bates 編號。 +- [**新增浮水印**](./add-watermark):在 PDF 頁面上蓋上文字或圖片。 +- [**頁首與頁尾**](./header-footer):在頁面頂端與底部加入文字。 +- [**反轉顏色**](./invert-colors):建立 PDF 的深色模式版本。 +- [**掃描效果**](./scanner-effect):讓 PDF 看起來像掃描文件。 +- [**調整顏色**](./adjust-colors):微調亮度、對比、飽和度等。 +- [**背景顏色**](./background-color):變更 PDF 的背景顏色。 +- [**更改文字顏色**](./text-color):變更 PDF 中文字的顏色。 +- [**簽署 PDF**](./sign-pdf):手繪、輸入或上傳您的簽名。 +- [**新增印章**](./add-stamps):使用註解工具列在 PDF 中加入圖片印章。 +- [**移除註解**](./remove-annotations):移除評論、螢光標記與連結。 +- [**裁切 PDF**](./crop-pdf):修剪 PDF 每一頁的邊界。 +- [**PDF 表單填寫器**](./form-filler):直接在瀏覽器中填寫表單。也支援 XFA 表單。 +- [**建立 PDF 表單**](./form-creator):以拖放文字欄位的方式建立可填寫的 PDF 表單。 +- [**移除空白頁面**](./remove-blank-pages):自動偵測並刪除空白頁面。 + +
+ +--- + +## 轉換為 PDF + +將圖片、文件、電子書及其他檔案格式轉換為 PDF。 + +
+ +- [**圖片轉 PDF**](./image-to-pdf):將 JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP 等轉換為 PDF。 +- [**JPG 轉 PDF**](./jpg-to-pdf):以一張或多張 JPG 圖片建立 PDF。 +- [**PNG 轉 PDF**](./png-to-pdf):以一張或多張 PNG 圖片建立 PDF。 +- [**WebP 轉 PDF**](./webp-to-pdf):以一張或多張 WebP 圖片建立 PDF。 +- [**SVG 轉 PDF**](./svg-to-pdf):以一張或多張 SVG 圖片建立 PDF。 +- [**BMP 轉 PDF**](./bmp-to-pdf):以一張或多張 BMP 圖片建立 PDF。 +- [**HEIC 轉 PDF**](./heic-to-pdf):以一張或多張 HEIC 圖片建立 PDF。 +- [**TIFF 轉 PDF**](./tiff-to-pdf):以一張或多張 TIFF 圖片建立 PDF。 +- [**文字轉 PDF**](./txt-to-pdf):將純文字檔轉換為 PDF。 +- [**Markdown 轉 PDF**](./markdown-to-pdf):將 Markdown 轉換為 PDF,支援即時預覽與語法醒目提示。 +- [**JSON 轉 PDF**](./json-to-pdf):將 JSON 檔案轉換為 PDF 格式。 +- [**ODT 轉 PDF**](./odt-to-pdf):將 ODT (OpenDocument Text) 檔案轉換為 PDF。 +- [**CSV 轉 PDF**](./csv-to-pdf):將 CSV 試算表轉換為 PDF。 +- [**RTF 轉 PDF**](./rtf-to-pdf):將 RTF (Rich Text Format) 文件轉換為 PDF。 +- [**Word 轉 PDF**](./word-to-pdf):將 Word 文件(DOCX、DOC、ODT)轉換為 PDF。 +- [**Excel 轉 PDF**](./excel-to-pdf):將 Excel 試算表(XLSX、XLS、ODS)轉換為 PDF。 +- [**PowerPoint 轉 PDF**](./powerpoint-to-pdf):將 PowerPoint 簡報(PPTX、PPT、ODP)轉換為 PDF。 +- [**XPS 轉 PDF**](./xps-to-pdf):將 XPS/OXPS 文件轉換為 PDF。 +- [**MOBI 轉 PDF**](./mobi-to-pdf):將 MOBI 電子書轉換為 PDF。 +- [**EPUB 轉 PDF**](./epub-to-pdf):將 EPUB 電子書轉換為 PDF。 +- [**FB2 轉 PDF**](./fb2-to-pdf):將 FictionBook (FB2) 電子書轉換為 PDF。 +- [**CBZ 轉 PDF**](./cbz-to-pdf):將漫畫壓縮檔(CBZ/CBR)轉換為 PDF。 +- [**WPD 轉 PDF**](./wpd-to-pdf):將 WordPerfect 文件 (WPD) 轉換為 PDF。 +- [**WPS 轉 PDF**](./wps-to-pdf):將 WPS Office 文件轉換為 PDF。 +- [**XML 轉 PDF**](./xml-to-pdf):將 XML 文件轉換為 PDF。 +- [**ODG 轉 PDF**](./odg-to-pdf):將 OpenDocument Graphics (ODG) 轉換為 PDF。 +- [**ODS 轉 PDF**](./ods-to-pdf):將 OpenDocument Spreadsheet (ODS) 轉換為 PDF。 +- [**ODP 轉 PDF**](./odp-to-pdf):將 OpenDocument Presentation (ODP) 轉換為 PDF。 +- [**PUB 轉 PDF**](./pub-to-pdf):將 Microsoft Publisher (PUB) 轉換為 PDF。 +- [**VSD 轉 PDF**](./vsd-to-pdf):將 Microsoft Visio(VSD、VSDX)轉換為 PDF。 +- [**PSD 轉 PDF**](./psd-to-pdf):將 Adobe Photoshop (PSD) 檔案轉換為 PDF。 +- [**電子郵件轉 PDF**](./email-to-pdf):將電子郵件檔案(EML、MSG)轉換為 PDF 格式。 + +
+ +--- + +## 從 PDF 轉換 + +將 PDF 內容擷取為圖片、文件與資料格式。 + +
+ +- [**PDF 轉 JPG**](./pdf-to-jpg):將每個 PDF 頁面轉換為 JPG 圖片。 +- [**PDF 轉 PNG**](./pdf-to-png):將每個 PDF 頁面轉換為 PNG 圖片。 +- [**PDF 轉 WebP**](./pdf-to-webp):將每個 PDF 頁面轉換為 WebP 圖片。 +- [**PDF 轉 BMP**](./pdf-to-bmp):將每個 PDF 頁面轉換為 BMP 圖片。 +- [**PDF 轉 TIFF**](./pdf-to-tiff):將每個 PDF 頁面轉換為 TIFF 圖片。 +- [**PDF 轉 CBZ**](./pdf-to-cbz):將 PDF 轉換為 CBZ(漫畫壓縮檔),供漫畫閱讀器與 Calibre 使用。 +- [**PDF 轉 SVG**](./pdf-to-svg):將每個 PDF 頁面轉換為可縮放向量圖形。 +- [**PDF 轉 CSV**](./pdf-to-csv):從 PDF 擷取表格並轉換為 CSV 格式。 +- [**PDF 轉 Excel**](./pdf-to-excel):從 PDF 擷取表格並轉換為 Excel (XLSX)。 +- [**PDF 轉灰階**](./pdf-to-greyscale):將所有顏色轉換為黑白。 +- [**PDF 轉 JSON**](./pdf-to-json):將 PDF 檔案轉換為 JSON 格式。 +- [**PDF 轉 Word**](./pdf-to-word):將 PDF 檔案轉換為可編輯的 Word 文件。 +- [**擷取圖片**](./extract-images):擷取 PDF 檔案中所有內嵌的圖片。 +- [**PDF 轉 Markdown**](./pdf-to-markdown):將 PDF 文字與表格轉換為 Markdown 格式。 +- [**為 AI 準備 PDF**](./prepare-pdf-for-ai):將 PDF 內容擷取為 LlamaIndex JSON,供 RAG/LLM 流程使用。 +- [**PDF 轉文字**](./pdf-to-text):從 PDF 檔案擷取文字並儲存為純文字。 +- [**擷取 PDF 表格**](./extract-tables):將 PDF 中的表格擷取為 CSV、JSON 或 Markdown。 + +
+ +--- + +## 整理與管理 + +重新排列、合併、分割及管理您的 PDF 頁面與檔案。 + +
+ +- [**PDF 工作流程建構器**](./pdf-workflow):使用視覺化節點編輯器建立自訂的 PDF 處理流程。 +- [**PDF 多功能工具**](./pdf-multi-tool):具備頁面管理功能的全功能 PDF 編輯器。 +- [**PDF 文字辨識 (OCR)**](./ocr-pdf):讓 PDF 可搜尋、可複製。 +- [**合併 PDF**](./merge-pdf):將多個 PDF 合併為一個檔案。 +- [**交錯混合頁面**](./alternate-merge):交替取用各 PDF 的頁面進行合併。 +- [**雙面掃描整理**](./duplex-collate):將正面/背面掃描區塊重新排列為正確的頁面順序。 +- [**複製與組織**](./organize-pdf):複製、重新排序及刪除頁面。 +- [**新增附件**](./add-attachments):在 PDF 中嵌入一個或多個檔案。 +- [**擷取附件**](./extract-attachments):將 PDF 中所有內嵌檔案擷取為 ZIP。 +- [**編輯附件**](./edit-attachments):檢視或移除 PDF 中的附件。 +- [**PDF 圖層(OCG)**](./pdf-layers):檢視、切換、新增及刪除 PDF 中的 OCG 圖層。 +- [**分割 PDF**](./split-pdf):將一段頁面範圍擷取為新的 PDF。 +- [**分割頁面**](./divide-pages):水平或垂直分割頁面。 +- [**擷取頁面**](./extract-pages):將選取的頁面儲存為新檔案。 +- [**刪除頁面**](./delete-pages):從文件中移除特定頁面。 +- [**新增空白頁面**](./add-blank-page):在 PDF 任意位置插入空白頁。 +- [**反轉頁面**](./reverse-pages):反轉文件中所有頁面的順序。 +- [**旋轉 PDF**](./rotate-pdf):以 90 度為單位旋轉頁面。 +- [**自訂角度旋轉**](./rotate-custom):以任意自訂角度旋轉頁面。 +- [**多頁併一頁 (N-Up)**](./n-up-pdf):將多個頁面排列在單一頁面上。 +- [**PDF 小手冊**](./pdf-booklet):重新排列頁面以進行雙面小手冊列印。 +- [**合併為單一頁面**](./combine-single-page):將所有頁面拼接成一個連續長頁。 +- [**檢視中繼資料**](./view-metadata):檢查 PDF 的隱藏屬性。 +- [**編輯中繼資料**](./edit-metadata):變更作者、標題及其他屬性。 +- [**PDF 轉 ZIP**](./pdf-to-zip):將多個 PDF 檔案打包成 ZIP 壓縮檔。 +- [**比較 PDF**](./compare-pdfs):並排比較兩個 PDF。 +- [**海報化 PDF**](./posterize-pdf):將大頁面分割為多個較小的頁面。 + +
+ +--- + +## 最佳化與修復 + +壓縮、修正及最佳化您的 PDF,以獲得更好的效能與相容性。 + +
+ +- [**壓縮 PDF**](./compress-pdf):縮小 PDF 的檔案大小。 +- [**PDF 轉 PDF/A**](./pdf-to-pdfa):將 PDF 轉換為 PDF/A 以供長期封存。 +- [**統一頁面尺寸**](./fix-page-size):將所有頁面統一為相同尺寸。 +- [**線性化 PDF**](./linearize-pdf):最佳化 PDF 以便快速網頁檢視。 +- [**頁面尺寸**](./page-dimensions):分析頁面大小、方向與單位。 +- [**移除限制**](./remove-restrictions):移除密碼保護與安全性限制。 +- [**修復 PDF**](./repair-pdf):從毀損或受損的 PDF 檔案中救回資料。 +- [**光柵化 PDF**](./rasterize-pdf):將 PDF 轉換為以圖片為基礎的 PDF。平面化圖層並移除可選取的文字。 +- [**PDF 歪斜修正**](./deskew-pdf):使用 OpenCV 自動校正歪斜的掃描頁面。 +- [**字型轉外框**](./font-to-outline):將所有字型轉換為向量外框,確保呈現一致。 + +
+ +--- + +## 安全 PDF + +保護、加密並控制 PDF 文件的存取權限。 + +
+ +- [**保護 PDF**](./protect-pdf):為 PDF 加上密碼以鎖定。 +- [**清理 PDF**](./sanitize-pdf):移除中繼資料、註解、指令碼等。 +- [**解除鎖定 PDF**](./unlock-pdf):移除密碼保護以解鎖 PDF。 +- [**平面化 PDF**](./flatten-pdf):讓表單欄位與註解無法編輯。 +- [**移除中繼資料**](./remove-metadata):移除 PDF 中的隱藏資料。 +- [**變更權限**](./change-permissions):設定或變更 PDF 的使用者權限。 +- [**為 PDF 加上數位簽章**](./digital-sign-pdf):使用 X.509 憑證加上加密數位簽章。 +- [**驗證 PDF 數位簽章**](./validate-signature-pdf):驗證數位簽章並檢視憑證詳細資料。 + +
diff --git a/docs/zh-TW/tools/invert-colors.md b/docs/zh-TW/tools/invert-colors.md new file mode 100644 index 00000000..20fa8a19 --- /dev/null +++ b/docs/zh-TW/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: 反轉顏色 +description: 反轉 PDF 中的所有顏色,為任何文件建立深色模式版本。 +--- + +# 反轉顏色 + +將 PDF 中的每種顏色翻轉為其反色。白色背景變成黑色,黑色文字變成白色,其他所有顏色則轉為互補色。這是為任何 PDF 建立「深色模式」版本最快的方法。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 點擊 **反轉顏色** 進行處理。 +3. 反轉後的 PDF 會自動下載。 + +沒有其他設定。此工具會將每頁轉譯為圖片、反轉所有像素顏色,再將結果重新組合成新的 PDF。 + +## 功能 + +- 一鍵反轉所有頁面的顏色 +- 處理文件中的每一頁 +- 保留原始頁面尺寸與版面 +- 適用於任何 PDF,不論內容類型(文字、圖片、混合) + +## 使用情境 + +- 為教科書或手冊建立深色模式版本,夜間閱讀更舒適 +- 為無障礙用途準備高對比版本的文件 +- 反轉曝光不正確的掃描文件 +- 為大量圖片的 PDF 產生負片版本以進行視覺分析 + +## 小技巧 + +- 由於此工具會將頁面光柵化以套用效果,輸出結果是以圖片為基礎的。文字將無法再選取或搜尋。如果反轉後需要可搜尋的文字,請將輸出結果交給 OCR 工具處理。 +- 若需要更細緻的顏色調整(亮度、對比、飽和度),請改用 [調整顏色](./adjust-colors) 工具。 +- 頁數多的大型 PDF 可能需要較長處理時間,因為每一頁都會個別轉譯與反轉。 + +## 相關工具 + +- [調整顏色](./adjust-colors) +- [背景顏色](./background-color) +- [掃描效果](./scanner-effect) diff --git a/docs/zh-TW/tools/jpg-to-pdf.md b/docs/zh-TW/tools/jpg-to-pdf.md new file mode 100644 index 00000000..80953c61 --- /dev/null +++ b/docs/zh-TW/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG 轉 PDF +description: 直接在瀏覽器中將一張或多張 JPG、JPEG 與 JPEG 2000 圖片轉換為單一 PDF 檔案。 +--- + +# JPG 轉 PDF + +將 JPG 圖片轉為整潔的 PDF。上傳單一檔案,或一次批次處理多張 JPG,每張圖片都會成為輸出文件中的一個完整頁面。 + +## 支援格式 + +| 格式 | 副檔名 | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## 運作方式 + +1. 點擊上傳區域,或將 JPG 檔案拖放進來。支援多選。 +2. 檢查已上傳的檔案。使用垃圾桶圖示移除個別檔案,或點擊 **新增更多檔案** 加入清單。 +3. 選擇 **PDF 品質** 等級。 +4. 點擊 **轉換為 PDF**。工具會依您的品質設定壓縮圖片,透過 PyMuPDF 引擎轉換,並下載 `from_jpgs.pdf`。 + +## 選項 + +**PDF 品質** 調整每張圖片嵌入 PDF 前套用的壓縮程度: + +- **高品質**:保留最多細節。適用於攝影或列印。 +- **中等品質**(預設):在清晰度與檔案大小之間取得良好平衡。 +- **低品質**:強力壓縮,輸出檔案最小。 + +## 使用情境 + +- 將存成 JPG 的掃描文件轉換為單一提交用 PDF +- 將產品照片打包成給客戶的型錄 +- 將 JPEG 2000 醫療或衛星影像轉為便於攜帶的 PDF +- 以相機匯出的照片製作可列印的相簿 + +## 小技巧 + +- 完整支援 JPEG 2000 檔案(`.jp2`、`.jpx`),不只是標準 JPEG。這對醫療影像與地理空間資料很有用。 +- 如果您的 JPG 來自手機相機,中等品質產生的檔案通常比高品質小 40-60%,在螢幕上看不出差異。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) +- [WebP 轉 PDF](./webp-to-pdf) diff --git a/docs/zh-TW/tools/json-to-pdf.md b/docs/zh-TW/tools/json-to-pdf.md new file mode 100644 index 00000000..158e5401 --- /dev/null +++ b/docs/zh-TW/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON 轉 PDF +description: 從 BentoPDF 的 JSON 格式重建 PDF 檔案。將 JSON 匯出檔轉換回原始 PDF 文件。 +--- + +# JSON 轉 PDF + +從先前由 BentoPDF 的 **PDF 轉 JSON** 工具建立的 JSON 檔案重建 PDF 文件。這是一個往返轉換工具,它會讀取 PDF 的結構化 JSON 表示並重建原始文件。 + +::: warning +此工具僅接受由 BentoPDF 的 PDF 轉 JSON 轉換器所產生的 JSON 檔案。不支援來自 API、資料庫或其他工具的一般 JSON 檔案。 +::: + +## 支援格式 + +| 輸入 | 說明 | +| :------ | :---------------------------------------------- | +| `.json` | 由 BentoPDF 的 PDF 轉 JSON 工具匯出的 JSON 檔案 | + +## 運作方式 + +1. 點擊上傳區域,或拖放一個或多個 JSON 檔案。 +2. 檔案清單會顯示每個已選取的檔案及其大小。 +3. 點擊 **轉換為 PDF**。工具會使用 Web Worker 與 CPDF 引擎處理所有檔案。 +4. 輸出會下載為 `jsons-to-pdf.zip`,其中每個輸入 JSON 檔案各對應一個 PDF。 + +轉換在背景 Web Worker 中執行,因此即使處理大型檔案,介面仍能保持流暢回應。 + +## 選項 + +此工具沒有可設定的選項。輸出的 PDF 完全由 JSON 結構決定。 + +## 輸出 + +轉換多個 JSON 檔案時,結果會以 ZIP 壓縮檔提供。每個 PDF 以其來源 JSON 檔案命名(例如 `report.json` 會變成 `report.pdf`)。 + +## 使用情境 + +- 從以 JSON 為基礎的備份或封存流程還原 PDF +- 將 PDF 轉為 JSON 進行檢查,再轉回 PDF +- 以程式修改 JSON 結構後重建文件 +- 透過轉換回 PDF,驗證 PDF 轉 JSON 匯出是否完整擷取所有文件內容 + +## 小技巧 + +- 如果您需要將任意 JSON 資料(例如 API 回應或設定檔)轉換為格式化的 PDF,[文字轉 PDF](./txt-to-pdf) 工具更合適。將 JSON 以文字形式貼上,就會以適當格式呈現。 +- 此工具需要 CPDF WebAssembly 引擎才能運作。自行架設的執行個體需要設定 CPDF WASM 檔案。 + +## 相關工具 + +- [文字轉 PDF](./txt-to-pdf) +- [Markdown 轉 PDF](./markdown-to-pdf) +- [CSV 轉 PDF](./csv-to-pdf) diff --git a/docs/zh-TW/tools/linearize-pdf.md b/docs/zh-TW/tools/linearize-pdf.md new file mode 100644 index 00000000..5c0d1e6c --- /dev/null +++ b/docs/zh-TW/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: 線性化 PDF +description: 最佳化 PDF 檔案,以漸進式載入加快網頁檢視。也稱為「快速網頁檢視」最佳化。 +--- + +# 線性化 PDF + +線性化會重新組織 PDF 的結構,讓第一頁在整個檔案下載完成前就能顯示。Adobe 稱之為「快速網頁檢視」(Fast Web View)。如果您在網站上提供 PDF,或透過文件入口網站提供,線性化能讓它們開啟的速度明顯變快。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。 +2. 點擊 **線性化 PDF**。 +3. 下載包含所有線性化檔案的 ZIP 壓縮檔。 + +無需任何設定。此工具使用 QPDF 的 `--linearize` 旗標,重新排列 PDF 的內部結構,而不改變其視覺內容。 + +## 線性化的作用 + +- 重新排序 PDF 物件,讓第一頁的資料出現在檔案開頭 +- 加入線性化字典與提示表,讓檢視器知道每一頁的位置 +- 支援位元組範圍請求:瀏覽器只需擷取第一頁,而不必下載整個檔案 +- 整理交叉參照表,以便有效率地隨機存取 + +## 功能 + +- 一次操作即可批次處理多個 PDF +- 輸出保留所有內容、字型、圖片與互動元素 +- 使用 QPDF (WebAssembly) 進行可靠且符合標準的線性化 +- 結果會打包成 ZIP,方便下載 + +## 使用情境 + +- 在網站上提供 PDF 報告,讓使用者能立即看到頁面 +- 在具有瀏覽器內檢視器的網頁應用程式中嵌入 PDF +- 發布透過緩慢行動網路存取的 PDF 型錄或手冊 +- 為支援位元組範圍傳輸的內容傳遞網路 (CDN) 準備文件 + +## 小技巧 + +- 請在所有其他編輯完成後再進行線性化。之後的任何修改(合併、新增頁面)都會破壞線性化。 +- 搭配壓縮 PDF 使用,可得到最小、載入最快的 PDF。 +- 線性化會讓檔案大小略微增加(通常不到 1%)。 + +## 相關工具 + +- [壓縮 PDF](./compress-pdf):在線性化前縮小檔案大小 +- [修復 PDF](./repair-pdf):修正妨礙線性化的結構問題 +- [移除中繼資料](./remove-metadata):在線上發布前移除中繼資料 diff --git a/docs/zh-TW/tools/markdown-to-pdf.md b/docs/zh-TW/tools/markdown-to-pdf.md new file mode 100644 index 00000000..727acd91 --- /dev/null +++ b/docs/zh-TW/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown 轉 PDF +description: 撰寫或貼上 Markdown,並透過即時預覽與語法醒目提示,匯出為格式專業的 PDF。 +--- + +# Markdown 轉 PDF + +功能完整的 Markdown 編輯器,具備即時預覽與一鍵匯出 PDF。您可以從頭開始撰寫、上傳現有的 `.md` 檔案,或從剪貼簿貼上內容。編輯器會即時轉譯您的 Markdown,並使用瀏覽器內建的列印引擎匯出有樣式的 PDF。 + +## 支援格式 + +| 輸入 | 說明 | +| :--------- | :------------------- | +| `.md` 檔案 | 透過上傳按鈕上傳 | +| 直接輸入 | 在編輯器中輸入或貼上 | + +## 運作方式 + +1. 開啟 Markdown 轉 PDF 工具。編輯器會以分割檢視載入:左側為 Markdown 原始碼,右側為轉譯後的預覽。 +2. 撰寫 Markdown、貼上內容,或點擊 **上傳** 載入 `.md` 檔案。 +3. 使用工具列中的主題滑桿切換淺色與深色主題。 +4. 點擊 **匯出 PDF**(或按下 `Ctrl/Cmd + S`),透過瀏覽器的列印對話框產生 PDF。 + +## 功能 + +編輯器支援的 Markdown 功能遠不只基本語法: + +- **標準 Markdown**:標題、粗體、斜體、連結、圖片、清單、引用區塊、水平線 +- **程式碼區塊**,支援 15 種以上語言的語法醒目提示(JavaScript、TypeScript、Python、Go、Rust、SQL、Java、C#、C++、YAML、Bash 等) +- **Mermaid 圖表**:流程圖、循序圖、ER 圖及其他 Mermaid 圖表類型可直接在預覽中呈現 +- **表格**,使用標準 Markdown 表格語法 +- **任務清單**,附核取方塊 +- **註腳**、**下標**、**上標** +- **定義清單**、**縮寫** +- **表情符號** 支援(`:smile:` 會呈現為表情符號) +- **醒目標示**(`==marked text==`)與 **插入文字**(`++inserted text++`) +- **自動連結網址**:純網址會轉換為可點擊的連結 +- **目錄** 產生 +- 標題上的 **錨點連結** + +## 使用情境 + +- 撰寫專案文件,並匯出精美的 PDF 給利害關係人 +- 建立含程式碼範例與 Mermaid 架構圖的技術報告 +- 將 GitHub README 轉換為 PDF,供離線使用或列印 +- 草擬含任務清單與表格的提案或規格書 +- 從以 Markdown 撰寫的課堂筆記產生有樣式的講義 + +## 小技巧 + +- PDF 輸出使用瀏覽器的「列印成 PDF」功能。在 Chrome 中,您可以在儲存前於列印對話框自訂邊界與縮放比例。 +- Mermaid 圖表會在預覽中呈現,但第一次使用時可能需要稍候初始化。 +- 使用 `Ctrl/Cmd + S` 鍵盤快速鍵即可匯出,不必點擊按鈕。 + +## 相關工具 + +- [文字轉 PDF](./txt-to-pdf) +- [Word 轉 PDF](./word-to-pdf) +- [JSON 轉 PDF](./json-to-pdf) diff --git a/docs/zh-TW/tools/merge-pdf.md b/docs/zh-TW/tools/merge-pdf.md new file mode 100644 index 00000000..6596c8b0 --- /dev/null +++ b/docs/zh-TW/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: 合併 PDF +description: 將多個 PDF 檔案合併為一份文件,支援拖放重新排序與頁面層級控制。 +--- + +# 合併 PDF + +將多個 PDF 檔案合併為單一文件。您可以依特定順序合併整個檔案,或切換到頁面模式,精細控制每個已上傳 PDF 中的個別頁面。 + +## 運作方式 + +1. 點擊放置區或將檔案拖曳進來,上傳兩個以上的 PDF 檔案。 +2. 使用頂端的切換開關,在 **檔案模式** 與 **頁面模式** 之間選擇。 +3. 在檔案模式中,拖曳檔案以重新排序,並可為每個檔案指定頁面範圍(例如 `1-3, 5`)。範圍留空則包含所有頁面。 +4. 在頁面模式中,拖放個別頁面縮圖,建立您想要的確切頁面順序。 +5. 點擊 **合併 PDF** 將所有內容合併為一個檔案。合併後的 PDF 會自動下載。 + +## 功能 + +- 兩種合併模式:檔案模式可快速合併整個檔案,頁面模式可逐頁控制 +- 兩種模式皆支援拖放重新排序,並有流暢動畫 +- 頁面範圍語法(例如 `1-3, 5, 8-10`)讓您不必切換到頁面模式也能挑選特定頁面 +- 延遲載入的頁面縮圖,即使處理大型文件也能保持介面流暢 +- 檔案數量與總頁數沒有限制 +- 保留原始 PDF 品質,不重新編碼 + +## 選項 + +| 選項 | 說明 | +| ------------ | ---------------------------------------------------------------- | +| **檔案模式** | 依自訂順序合併整個檔案,並可為每個檔案設定頁面範圍篩選 | +| **頁面模式** | 以視覺化格狀顯示所有檔案的所有頁面,拖曳縮圖建立您想要的確切順序 | +| **頁面輸入** | 每個檔案的文字欄位,可輸入如 `1-3, 5` 的範圍,只包含特定頁面 | + +## 使用情境 + +- 將各章節的 PDF 合併為一本書或一份報告 +- 將求職信與履歷合併為一份申請文件 +- 從多份來源文件中擷取特定頁面,整合成一個檔案 +- 將掃描的收據或發票彙整為一個封存 PDF +- 從多份簡報中挑選投影片製作講義 + +## 小技巧 + +- 當您需要交錯不同檔案的頁面,而非將檔案逐一接在後面時,請使用頁面模式。 +- 初次上傳後,您可以使用 **新增更多檔案** 按鈕加入更多檔案,而不會遺失目前的排列。 +- 頁面範圍從 1 開始計算,因此 `1` 代表該檔案的第一頁。 + +## 相關工具 + +- [分割 PDF](./split-pdf) +- [複製與組織](./organize-pdf) +- [交錯混合頁面](./alternate-merge) +- [刪除頁面](./delete-pages) diff --git a/docs/zh-TW/tools/mobi-to-pdf.md b/docs/zh-TW/tools/mobi-to-pdf.md new file mode 100644 index 00000000..8f0c914e --- /dev/null +++ b/docs/zh-TW/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI 轉 PDF +description: 直接在瀏覽器中將 MOBI 電子書檔案轉換為 PDF。免費、隱私、不上傳檔案。 +--- + +# MOBI 轉 PDF + +將 Amazon Kindle MOBI 電子書轉換為 PDF 文件。MOBI 檔案綁定 Kindle 裝置與 App,在其他地方很難閱讀。轉換成 PDF 後,您就有一個可攜式版本,能在任何裝置上開啟或列印。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :--- | :------ | :----------------------------- | +| MOBI | `.mobi` | Kindle 電子書格式 (Mobipocket) | + +## 運作方式 + +1. 點擊上傳區域,或拖放一個或多個 MOBI 檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除不需要的檔案,或使用 **新增更多檔案** 加入其他電子書。 +3. 點擊 **轉換為 PDF**。PyMuPDF 引擎會解析 MOBI 結構,並將每一頁轉譯為 PDF 內容。 +4. 單一檔案會下載為 PDF。轉換多個檔案時,您會得到名為 `mobi-converted.zip` 的 ZIP 壓縮檔。 + +## 選項 + +無需其他設定。轉換會保留原始 MOBI 檔案中的文字內容、格式與內嵌圖片。 + +## 使用情境 + +- 在僅支援 PDF 的非 Kindle 電子閱讀器上閱讀 Kindle 購買的內容 +- 列印電子書的章節,供離線研讀或註記 +- 以通用格式封存您的個人電子書庫 +- 與沒有安裝 Kindle App 的人分享摘錄內容 + +## 小技巧 + +- 受 DRM 保護的 MOBI 檔案無法轉換。此工具僅適用於無 DRM 的 MOBI 檔案。 +- 含有大量內嵌圖片的大型電子書可能需要多花幾秒處理,因為所有作業都在瀏覽器中進行。 + +## 相關工具 + +- [EPUB 轉 PDF](./epub-to-pdf) +- [FB2 轉 PDF](./fb2-to-pdf) +- [CBZ 轉 PDF](./cbz-to-pdf) diff --git a/docs/zh-TW/tools/n-up-pdf.md b/docs/zh-TW/tools/n-up-pdf.md new file mode 100644 index 00000000..10750563 --- /dev/null +++ b/docs/zh-TW/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: 多頁併一頁 (N-Up) +description: 將多個 PDF 頁面以格狀版面排列在單一頁面上,方便精簡列印。 +--- + +# 多頁併一頁 (N-Up) + +以格狀排列方式將多個頁面放在單一頁面上。每張紙可容納 2、4、6、8、9 或 16 頁,藉此減少列印的頁數。此工具會處理縮放、定位,並可選擇設定頁面尺寸。 + +## 運作方式 + +1. 上傳一個 PDF 檔案。 +2. 選擇每張紙的頁數(「N」值):2、4、6、8、9 或 16。 +3. 選擇輸出頁面尺寸(預設為 A4)與方向。 +4. 可選擇設定間距、邊框顏色與背景顏色。 +5. 點擊處理按鈕。工具會縮放每一頁,並將它們拼排到新的頁面上。 + +## 功能 + +- 格狀版面:2-up、4-up、6-up、8-up、9-up 與 16-up +- 可設定輸出頁面尺寸與方向 +- 可選擇拼排頁面之間的間距 +- 背景與邊框顏色設定 +- 縮放以符合版面時保留原始頁面的長寬比 + +## 選項 + +| 選項 | 說明 | +| ------------ | ------------------------------------------------- | +| **每張頁數** | 每個輸出頁面要容納的原始頁數(2、4、6、8、9、16) | +| **頁面尺寸** | 輸出頁面的尺寸(A4、Letter、Legal 等) | +| **方向** | 輸出頁面為直向或橫向 | +| **間距** | 拼排頁面之間的間隔(單位為點) | +| **背景顏色** | 輸出頁面背景的填滿顏色 | +| **邊框顏色** | 每個拼排頁面周圍的邊框顏色 | + +## 使用情境 + +- 列印每頁 4 張投影片的講義以節省紙張 +- 製作將多個參考頁面放在同一張紙上的學習單 +- 製作精簡的文件封存以便歸檔 +- 為長篇文件產生縮圖總覽頁 + +## 小技巧 + +- 2-up 版面通常較適合橫向,而 4-up 以上通常以直向最佳。 +- 增加間距有助於閱讀,但會減少每個拼排頁面的可用面積。 +- 若要進行相反操作(將一頁分割為多頁),請參閱 [海報化 PDF](./posterize-pdf)。 + +## 相關工具 + +- [海報化 PDF](./posterize-pdf) +- [PDF 小手冊](./pdf-booklet) +- [合併為單一頁面](./combine-single-page) diff --git a/docs/zh-TW/tools/ocr-pdf.md b/docs/zh-TW/tools/ocr-pdf.md new file mode 100644 index 00000000..f67b25ac --- /dev/null +++ b/docs/zh-TW/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: PDF 文字辨識 (OCR) +description: 使用 Tesseract OCR 讓掃描的 PDF 可搜尋、可複製,支援多語言與字元篩選。 +--- + +# PDF 文字辨識 (OCR) + +將掃描文件轉為可搜尋、可複製的 PDF。此工具使用 Tesseract OCR 辨識圖片中的文字,並在原始頁面上疊加一層隱形文字層,在保留視覺外觀的同時讓內容完全可搜尋。 + +## 運作方式 + +1. 上傳掃描的 PDF 或以圖片為基礎的 PDF 檔案。 +2. 從可搜尋的語言清單中,選擇文件中出現的一種或多種語言。 +3. 可選擇調整進階設定(解析度、二值化、白名單)。 +4. 點擊 **開始 OCR**,並在即時進度列中查看進度。 +5. 完成後,檢查擷取的文字,然後下載可搜尋的 PDF 或純 `.txt` 檔案。 + +## 功能 + +- 多語言 OCR,附可搜尋的語言選擇器 +- 隱形文字層保留原始文件外觀 +- 處理期間提供即時進度列與記錄輸出 +- 可將結果下載為可搜尋的 PDF 或純文字檔 +- 直接將擷取的文字複製到剪貼簿 +- 三種解析度等級,可在速度與準確度之間取得平衡 + +## 選項 + +| 設定 | 值 | 預設 | 用途 | +| ------------------ | -------------------------------------------------------- | ---- | ------------------------------------------------ | +| **解析度** | 標準 (192 DPI)、高 (288 DPI)、極高 (384 DPI) | 高 | 較高解析度可提升小字的辨識準確度,但需要更長時間 | +| **圖片二值化** | 開啟/關閉 | 關閉 | 轉換為黑白以增強對比,適用於乾淨的掃描檔 | +| **字元白名單預設** | 無、英數字、數字與貨幣、僅字母、僅數字、發票、表單、自訂 | 無 | 限制可辨識的字元,以提升特定文件類型的準確度 | +| **字元白名單** | 自由輸入文字 | 空白 | 預設設為自訂時,手動指定的字元集 | + +## 使用情境 + +- 讓掃描的合約與發票可搜尋,以便使用 Ctrl+F 查找 +- 從拍攝的文件或舊紙本紀錄中擷取文字 +- 使用發票預設處理收據,準確擷取金額與日期 +- 從純圖片掃描檔建立無障礙 PDF,以符合法規要求 +- 批次擷取掃描書籍或手冊中的文字內容 + +## 小技巧 + +- 如果文件包含多種語言的內容(例如英文標題搭配日文內文),請選擇多種語言。 +- 對於文字褪色或對比度低的文件,請使用二值化選項,它能大幅提升辨識準確度。 +- 發票與表單白名單預設會忽略無關的字元形狀,大幅減少結構化文件中的誤判。 + +## 相關工具 + +- [擷取 PDF 表格](./extract-tables) +- [合併 PDF](./merge-pdf) +- [壓縮 PDF](./compress-pdf) diff --git a/docs/zh-TW/tools/odg-to-pdf.md b/docs/zh-TW/tools/odg-to-pdf.md new file mode 100644 index 00000000..5057507a --- /dev/null +++ b/docs/zh-TW/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG 轉 PDF +description: 在瀏覽器中將 LibreOffice Draw (ODG) 檔案轉換為 PDF。免費、不上傳、完全隱私。 +--- + +# ODG 轉 PDF + +將 OpenDocument Graphics 檔案轉換為 PDF。ODG 是 LibreOffice Draw 的原生格式,用於圖表、流程圖與向量插圖。轉換為 PDF 後,這些繪圖就能輕鬆分享、列印及嵌入其他文件。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :-------------------- | :----- | :-------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw 檔案 | + +## 運作方式 + +1. 點擊上傳區域,或將 ODG 檔案拖放進來。可一次加入多個檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除個別項目,或點擊 **新增更多檔案** 加入更多繪圖。 +3. 點擊 **轉換為 PDF**。以 LibreOffice 為基礎的引擎會在瀏覽器中載入,並轉換每個 ODG 檔案,保留向量圖形、形狀與文字。 +4. 單一檔案會直接下載為 PDF。多個檔案會產生名為 `odg-to-pdf.zip` 的 ZIP 壓縮檔。 + +## 選項 + +無需其他設定。轉換會保留 ODG 原始檔中的頁面尺寸、形狀、連接線與文字方塊。 + +## 使用情境 + +- 與沒有安裝 LibreOffice 的客戶分享 LibreOffice Draw 圖表 +- 列印在 Draw 中建立的流程圖與網路圖 +- 將 ODG 插圖以內嵌 PDF 的形式放入報告或簡報 +- 以數十年後仍可讀取的格式封存技術圖面 + +## 小技巧 + +- 向量元素在 PDF 輸出中仍維持向量,因此結果可清晰縮放至任何列印尺寸。 +- LibreOffice 引擎第一次使用時需要稍候初始化。之後在同一工作階段中的轉換會更快。 + +## 相關工具 + +- [ODS 轉 PDF](./ods-to-pdf) +- [ODP 轉 PDF](./odp-to-pdf) +- [VSD 轉 PDF](./vsd-to-pdf) diff --git a/docs/zh-TW/tools/odp-to-pdf.md b/docs/zh-TW/tools/odp-to-pdf.md new file mode 100644 index 00000000..1c7d248b --- /dev/null +++ b/docs/zh-TW/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP 轉 PDF +description: 在瀏覽器中將 LibreOffice Impress (ODP) 簡報轉換為 PDF。免費、隱私、不上傳。 +--- + +# ODP 轉 PDF + +將 OpenDocument Presentation 檔案轉換為 PDF。ODP 是 LibreOffice Impress 的原生格式,也是 Google 簡報的標準匯出格式之一。將簡報轉為 PDF 後,任何人都不需要簡報軟體就能檢視,投影片也能清晰列印。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :------------------------ | :----- | :-------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google 簡報匯出檔 | + +## 運作方式 + +1. 點擊上傳區域,或將 ODP 檔案拖放進來。可一次選取多份簡報。 +2. 檢查檔案清單。使用垃圾桶圖示移除項目,或使用 **新增更多檔案** 加入其他簡報。 +3. 點擊 **轉換為 PDF**。以 LibreOffice 為基礎的引擎會處理每份簡報,產生每張投影片各為一頁的 PDF。 +4. 單一檔案會下載為 PDF。多個檔案會以名為 `odp-to-pdf.zip` 的 ZIP 壓縮檔提供。 + +## 選項 + +無需任何設定。每張投影片都會以原始尺寸轉譯,保留文字、圖片、形狀與投影片背景。 + +## 使用情境 + +- 將簡報以 PDF 講義的形式發給觀眾 +- 與偏好 PDF 而非 ODP 的人分享 Google 簡報匯出檔 +- 以唯讀格式封存研討會演講與課程 +- 為實體工作坊列印投影片 + +## 小技巧 + +- 投影片轉場與動畫屬於純視覺功能,不會帶入 PDF,但所有靜態內容都能正確呈現。 +- PDF 輸出不包含演講者備忘稿。如果您需要備忘稿,請從簡報軟體另外匯出。 +- 與其他以 LibreOffice 為基礎的工具一樣,引擎會在第一次使用時載入,並在工作階段中保持快取。 + +## 相關工具 + +- [ODG 轉 PDF](./odg-to-pdf) +- [ODS 轉 PDF](./ods-to-pdf) +- [PUB 轉 PDF](./pub-to-pdf) diff --git a/docs/zh-TW/tools/ods-to-pdf.md b/docs/zh-TW/tools/ods-to-pdf.md new file mode 100644 index 00000000..f30042e2 --- /dev/null +++ b/docs/zh-TW/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS 轉 PDF +description: 在瀏覽器中將 LibreOffice Calc(ODS)試算表轉換為 PDF。免費、私密,無需註冊。 +--- + +# ODS 轉 PDF + +將 OpenDocument 試算表檔案轉換為 PDF。ODS 是 LibreOffice Calc 的原生格式,也是 Google 試算表常見的匯出格式。此工具會將試算表的資料、格式與圖表轉成分頁的 PDF,方便列印或分享。 + +## 支援格式 + +| 格式 | 副檔名 | 說明 | +| :------------------ | :----- | :----------------------------------- | +| OpenDocument 試算表 | `.ods` | LibreOffice Calc / Google 試算表匯出 | + +## 運作方式 + +1. 點選上傳區域,或將 ODS 檔案拖放到其中。支援多個檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除檔案,或點選**新增更多檔案**擴充批次。 +3. 點選**轉換為 PDF**。以 LibreOffice 為基礎的引擎會在瀏覽器中載入,並將每份試算表轉成 PDF 頁面。 +4. 單一試算表會下載為 PDF。多個檔案會打包成 `ods-to-pdf.zip`。 + +## 選項 + +無需任何設定。轉換器會將試算表既有的列印版面、儲存格格式與欄寬套用到 PDF 輸出。 + +## 使用情境 + +- 將 LibreOffice Calc 預算表或報告分享給只接受 PDF 的人 +- 列印以 ODS 格式下載的 Google 試算表匯出檔 +- 以不可編輯的格式封存財務紀錄 +- 將以 ODS 為基礎的表單或工時表以固定版面文件提交 + +## 小技巧 + +- 如果試算表有多個工作表,所有工作表都會包含在 PDF 輸出中。 +- 非常寬的試算表可能會橫向跨越多個 PDF 頁面。若版面很重要,建議在轉換前先調整原始檔的欄寬。 +- LibreOffice 引擎會在第一次使用時初始化。同一工作階段中後續的轉換會更快。 + +## 相關工具 + +- [ODG 轉 PDF](./odg-to-pdf) +- [ODP 轉 PDF](./odp-to-pdf) +- [XML 轉 PDF](./xml-to-pdf) diff --git a/docs/zh-TW/tools/odt-to-pdf.md b/docs/zh-TW/tools/odt-to-pdf.md new file mode 100644 index 00000000..6236236e --- /dev/null +++ b/docs/zh-TW/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT 轉 PDF +description: 使用以 LibreOffice 驅動的引擎,在瀏覽器中將 OpenDocument 文字(ODT)檔案轉換為 PDF 格式。 +--- + +# ODT 轉 PDF + +將 OpenDocument 文字檔案轉換為 PDF。ODT 是 LibreOffice Writer、Apache OpenOffice 及其他開源文書處理器的原生格式。此工具使用瀏覽器端的 LibreOffice 引擎,產生能保留格式、表格、圖片與樣式的精確轉換結果。 + +## 支援格式 + +| 格式 | 副檔名 | +| :---------------- | :----- | +| OpenDocument 文字 | `.odt` | + +## 運作方式 + +1. 點選上傳區域,或拖放一個或多個 ODT 檔案。 +2. 檢查檔案清單。可新增更多檔案或移除不需要的檔案。 +3. 點選**轉換為 PDF**。LibreOffice 引擎會先初始化(進度指示器會顯示載入狀態),接著逐一轉換每個檔案。 +4. 單一檔案會直接下載為 PDF。多個檔案會打包成 `odt-converted.zip`。 + +## 選項 + +此工具沒有其他設定。轉換會盡可能保留原始文件的格式。 + +## 輸出 + +| 輸入數量 | 輸出 | +| :----------- | :-------------------------------------------------------- | +| 1 個檔案 | 單一 PDF 下載(例如 `document.pdf`) | +| 2 個以上檔案 | ZIP 壓縮檔(`odt-converted.zip`),每個檔案各對應一份 PDF | + +## 使用情境 + +- 將 LibreOffice Writer 文件轉換為 PDF,分享給 Microsoft Office 使用者 +- 從以 OpenDocument 格式撰寫的學術論文產生可供列印的 PDF +- 將整個資料夾的 ODT 範本批次轉換為 PDF 以便發送 +- 從自動化文件產生系統建立的 ODT 檔案產生 PDF + +## 小技巧 + +- LibreOffice 引擎會在第一次使用時載入,並快取供後續轉換使用。初次載入需要幾秒鐘,之後的轉換就會很快。 +- 含有內嵌 OLE 物件或特殊字型的複雜文件,呈現結果可能與桌面版 LibreOffice 略有不同。批次轉換前請先用範例測試。 +- Word 文件(`.doc`、`.docx`)請改用 [Word 轉 PDF](./word-to-pdf) 工具,它同樣使用 LibreOffice 引擎,但可直接接受 Microsoft 格式。 + +## 相關工具 + +- [Word 轉 PDF](./word-to-pdf) +- [RTF 轉 PDF](./rtf-to-pdf) +- [文字轉 PDF](./txt-to-pdf) diff --git a/docs/zh-TW/tools/organize-pdf.md b/docs/zh-TW/tools/organize-pdf.md new file mode 100644 index 00000000..9cfbe69d --- /dev/null +++ b/docs/zh-TW/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: 複製與組織 +description: 透過拖放縮圖與自訂頁面順序輸入,重新排序、複製及刪除 PDF 頁面。 +--- + +# 複製與組織 + +使用視覺化的拖放介面重新排列、複製及移除 PDF 頁面。每一頁都會以縮圖顯示,您可以在將結果儲存為新檔案前移動、複製或刪除它們。 + +## 運作方式 + +1. 上傳單一 PDF 檔案。 +2. 工具會產生顯示每一頁的縮圖網格。 +3. 拖曳縮圖來重新排序頁面,點選綠色的複製按鈕複製頁面,或點選紅色的刪除按鈕移除頁面。 +4. 您也可以在文字欄位中輸入自訂頁面順序(例如 `3, 1, 2, 4`),再點選**套用**一次重新排列所有頁面。 +5. 點選處理按鈕,產生並下載重新整理後的 PDF。 + +## 功能 + +- 拖放重新排序頁面,並附有動畫轉場 +- 每頁皆有複製與刪除按鈕 +- 自訂頁面順序輸入,精確重新排列 +- 每次變更後自動更新的頁碼標籤 +- 防止刪除最後剩下的一頁 + +## 使用情境 + +- 將報告中放錯位置的頁面移到正確位置 +- 複製表單頁面,讓一個檔案中有多份空白副本 +- 在發送文件前移除草稿或預留頁面 +- 為列印準備而反轉或調整頁面順序 +- 不需重新合併個別檔案即可建立自訂頁面順序 + +## 小技巧 + +- 自訂頁面順序欄位需要以逗號分隔的原始頁碼。每一頁都必須剛好出現一次,不可遺漏或重複。 +- 複製頁面後,兩份副本都參照同一個原始頁面索引。重新排序任一份副本都互不影響。 +- 若需要跨多個檔案的大量操作或更進階的工作流程,請考慮改用 [PDF 多功能工具](./pdf-multi-tool)。 + +## 相關工具 + +- [合併 PDF](./merge-pdf) +- [刪除頁面](./delete-pages) +- [PDF 多功能工具](./pdf-multi-tool) +- [反轉頁面](./reverse-pages) diff --git a/docs/zh-TW/tools/page-dimensions.md b/docs/zh-TW/tools/page-dimensions.md new file mode 100644 index 00000000..10fc1515 --- /dev/null +++ b/docs/zh-TW/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: 頁面尺寸 +description: 分析 PDF 頁面大小、方向、長寬比與旋轉。偵測混合尺寸文件並將資料匯出為 CSV。 +--- + +# 頁面尺寸 + +一款診斷工具,會讀取 PDF 中的每一頁,並回報其確切尺寸、方向、標準尺寸名稱、長寬比、面積與旋轉角度。適合在列印前找出尺寸不一的頁面,或記錄收到的 PDF 屬性。 + +## 運作方式 + +1. 上傳 PDF 檔案。分析會自動開始,不需按任何按鈕。 +2. 摘要面板會顯示總頁數、不同頁面尺寸的數量,以及文件是否有混合尺寸。 +3. 瀏覽包含每頁詳細資訊的完整結果表格。 +4. 在點、英吋、公釐或像素之間切換顯示單位。 +5. 點選**匯出為 CSV** 儲存資料。 + +## 回報欄位 + +| 欄位 | 說明 | +| -------- | ------------------------------------- | +| 頁碼 | 依序的頁碼 | +| 尺寸 | 以所選單位表示的寬 x 高 | +| 標準尺寸 | 對應的名稱(A4、Letter 等)或「自訂」 | +| 方向 | 直向或橫向 | +| 長寬比 | 以小數表示的寬高比 | +| 面積 | 以所選單位平方表示的頁面面積 | +| 旋轉 | 以度數表示的頁面旋轉 | + +## 功能 + +- 自動偵測標準紙張尺寸(A3、A4、A5、Letter、Legal、Tabloid 等) +- 混合尺寸文件警告,並列出出現了哪些尺寸以及各尺寸的頁數 +- 在點、英吋、公釐與像素(以 96 PPI 計)之間轉換單位 +- 匯出 CSV,可用於試算表或文件系統 + +## 使用情境 + +- 將文件送交印刷廠前,確認所有頁面都是 A4 +- 診斷合併後的 PDF 為何在某些頁面列印出非預期的邊界 +- 為中繼資料紀錄記錄大型 PDF 封存檔的頁面版面 +- 找出需要修正的旋轉頁面 + +## 小技巧 + +- 如果摘要顯示「混合尺寸」,請在列印前使用統一頁面尺寸工具將頁面標準化。 +- 旋轉欄位可協助找出顯示正常但旋轉屬性不為零的頁面,這在某些工作流程中可能造成問題。 + +## 相關工具 + +- [統一頁面尺寸](./fix-page-size):找出混合尺寸後將頁面標準化 +- [壓縮 PDF](./compress-pdf):修正頁面問題後最佳化 PDF +- [旋轉 PDF](./rotate-pdf):修正旋轉的頁面 diff --git a/docs/zh-TW/tools/page-numbers.md b/docs/zh-TW/tools/page-numbers.md new file mode 100644 index 00000000..71de21cf --- /dev/null +++ b/docs/zh-TW/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: 頁碼 +description: 在 PDF 頁面的任意位置加入可自訂的頁碼,並可設定字型、大小與顏色。 +--- + +# 頁碼 + +為 PDF 的每一頁加上可見的頁碼。您選擇位置、格式、字型大小與顏色,其餘交給工具處理。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 在出現的選項面板中設定頁碼。 +3. 點選**加入頁碼**進行處理。 +4. 加上頁碼的 PDF 會自動下載。 + +## 選項 + +- **位置**:選擇頁碼出現的位置:下方置中、左下、右下、上方置中、左上或右上。 +- **格式**:選擇簡單編號(1、2、3...)或「第 X 頁,共 Y 頁」格式(1 / 5、2 / 5...)。 +- **字型大小**:設定頁碼文字的大小。預設為 12。 +- **顏色**:使用顏色選擇器為頁碼文字挑選任意顏色。 + +## 功能 + +- 六種位置選項,涵蓋所有角落與置中位置 +- 兩種編號格式:簡單連續編號或「第 X 頁,共 Y 頁」 +- 字型大小可自訂,範圍 6 到 72 點 +- 完整的文字顏色選擇器 +- 自動處理邊界,無論頁面大小都讓頁碼保持在安全區域內 + +## 使用情境 + +- 準備需要可見頁碼參照的列印文件 +- 為由多個來源檔案合併而成的 PDF 加上頁碼 +- 在發送前為簡報講義編號 +- 為法律文件或合約加上連續編號 + +## 小技巧 + +- 「第 X 頁,共 Y 頁」格式適合讀者需要知道總長度的文件,例如提案或報告。 +- 如果不同章節需要不同的編號樣式(例如前置內容使用羅馬數字),請改用 [新增頁面標籤](./add-page-labels) 工具。 + +## 相關工具 + +- [新增頁面標籤](./add-page-labels) +- [Bates 編號](./bates-numbering) +- [頁首與頁尾](./header-footer) diff --git a/docs/zh-TW/tools/pdf-booklet.md b/docs/zh-TW/tools/pdf-booklet.md new file mode 100644 index 00000000..af19a3e1 --- /dev/null +++ b/docs/zh-TW/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF 小手冊 +description: 將 PDF 頁面重新排列為小手冊(騎馬釘)順序,以便摺疊並裝訂成實體小手冊。 +--- + +# PDF 小手冊 + +將 PDF 的頁面重新排列為小手冊拼版順序。雙面列印並對摺後,頁面就會依正確的閱讀順序排列。這是騎馬釘小手冊與小誌所使用的版面。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 設定小手冊選項:輸出頁面大小與方向。 +3. 點選**產生預覽**,查看頁面在每張紙上的排列方式。 +4. 檢查預覽,其中會顯示每張實體紙張正反面所分配的頁面。 +5. 點選**下載**,儲存已完成小手冊拼版的 PDF。 + +## 功能 + +- 自動為騎馬釘裝訂重新排序頁面 +- 可設定輸出頁面大小 +- 下載前可預覽小手冊版面 +- 頁數為奇數時,會在需要處插入空白頁 +- 縮放來源頁面以符合小手冊紙張大小 + +## 使用情境 + +- 從一般 PDF 製作可列印的小手冊或小誌 +- 準備會議議程或活動指南以便自行列印 +- 製作摺疊賀卡或小型型錄 +- 製作手工裝訂的小冊子或詩集 + +## 小技巧 + +- 來源 PDF 的頁數最好是 4 的倍數,小手冊才會整齊。若不是,系統會自動加入空白頁補滿最後一張紙。 +- 使用印表機的「短邊翻頁」設定雙面列印輸出結果,然後將所有紙張疊在一起對摺,並在書脊處裝訂。 +- 若只是要將多頁放在同一張紙上而不需小手冊排序,請改用 [多頁併一頁 (N-Up)](./n-up-pdf)。 + +## 相關工具 + +- [多頁併一頁 (N-Up)](./n-up-pdf) +- [旋轉 PDF](./rotate-pdf) +- [新增空白頁面](./add-blank-page) diff --git a/docs/zh-TW/tools/pdf-layers.md b/docs/zh-TW/tools/pdf-layers.md new file mode 100644 index 00000000..4fbc2540 --- /dev/null +++ b/docs/zh-TW/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF 圖層(OCG) +description: 檢視、切換、新增及刪除 PDF 文件中的選用內容群組(OCG)圖層。 +--- + +# PDF 圖層(OCG) + +管理 PDF 中的選用內容群組(OCG),也就是一般所稱的「圖層」。您可以切換圖層的可見性、新增圖層(包含巢狀子圖層)、刪除圖層,並儲存修改後的 PDF。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 點選處理按鈕,以 PyMuPDF 引擎載入文件。 +3. 工具會顯示所有現有圖層,以及其可見狀態、鎖定狀態與巢狀階層。 +4. 切換核取方塊來顯示或隱藏圖層。已鎖定的圖層無法切換。 +5. 輸入名稱並點選新增按鈕即可新增最上層圖層,也可以在現有的父圖層下新增子圖層。 +6. 刪除不再需要的圖層。 +7. 點選**儲存**,下載套用圖層變更後的 PDF。 + +## 功能 + +- 以適當縮排顯示巢狀圖層的階層 +- 開啟或關閉圖層可見性 +- 鎖定圖層標示可防止意外變更 +- 以自訂名稱新增最上層或子圖層 +- 刪除個別圖層 +- 將所有變更儲存為新的 PDF 檔案 + +## 使用情境 + +- 切換建築或工程圖面中標記圖層的可見性 +- 在多圖層設計文件中加入新的註解圖層 +- 在發送範本前移除過時的圖層 +- 檢查從第三方收到的複雜 PDF 中有哪些圖層 + +## 小技巧 + +- 如果 PDF 沒有圖層,工具會顯示空白狀態並提示您新增圖層。並非所有 PDF 都使用 OCG 圖層,它們最常見於 CAD 匯出檔與設計檔案。 +- 子圖層會在父圖層下方縮排顯示。圖層可以巢狀到任意深度。 +- 已鎖定的圖層會顯示鎖頭圖示,且其核取方塊會停用。這些鎖定是由 PDF 建立者設定的。 + +## 相關工具 + +- [檢視中繼資料](./view-metadata) +- [編輯中繼資料](./edit-metadata) +- [複製與組織](./organize-pdf) diff --git a/docs/zh-TW/tools/pdf-multi-tool.md b/docs/zh-TW/tools/pdf-multi-tool.md new file mode 100644 index 00000000..95765cde --- /dev/null +++ b/docs/zh-TW/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF 多功能工具 +description: 一站式頁面管理工具,可合併、分割、旋轉、複製、刪除及重新排序 PDF 頁面。 +--- + +# PDF 多功能工具 + +一個整合所有頁面層級 PDF 操作的工作區。上傳一個或多個 PDF,即可在單一視覺化網格中處理所有頁面。旋轉、重新排序、複製、刪除、插入新的 PDF、新增空白頁面並分割結果,全都不必離開此工具。 + +## 運作方式 + +1. 點選**上傳 PDF**,或將檔案拖曳到上傳區域。支援多個檔案。 +2. 所有上傳檔案的每一頁都會以縮圖顯示在可捲動的網格中。 +3. 使用工具列或每頁的操作按鈕來處理頁面。 +4. 使用每張卡片上的核取方塊選取頁面,再套用批次操作。 +5. 使用剪刀圖示標記分割點,將輸出分成多個檔案。 +6. 點選**匯出 PDF** 下載最終結果。如果有分割標記,輸出會是包含多個 PDF 的 ZIP。 + +## 功能 + +- **合併**:上傳多個 PDF,會自動合併到同一個工作區 +- **重新排序**:拖放頁面卡片來重新排列順序 +- **旋轉**:以 90 度為單位(向左或向右)旋轉單頁或批次旋轉 +- **複製**:一鍵複製任何頁面 +- **刪除**:移除個別頁面或批次刪除所選頁面 +- **插入 PDF**:在任一特定頁面之後加入新的 PDF +- **新增空白頁面**:在最後附加一張空白 A4 頁面 +- **分割**:在頁面之間放置分割標記,然後匯出為包含多個 PDF 的 ZIP +- **全選 / 取消全選**:快速選取以進行批次操作 +- **復原 / 重做**:每項操作都有完整的復原/重做歷程 +- **下載所選頁面**:僅將所選頁面匯出為獨立的 PDF +- 載入前自動修復損毀的 PDF + +## 使用情境 + +- 從多個來源 PDF 的頁面組合出自訂文件 +- 整理掃描文件:刪除空白頁、旋轉橫向掃描的頁面並重新排序章節 +- 使用視覺化分割標記,依章節分割大型 PDF +- 不需完整 PDF 編輯器即可快速進行頁面層級編輯 + +## 小技巧 + +- 復原/重做系統會追蹤每項操作。放心使用,您不會意外毀掉自己的成果。 +- 分割標記會以藍色虛線顯示在頁面之間。在您想分割文件的位置放置標記,然後匯出即可取得 ZIP。 +- 若只是單純的合併或分割,專用的 [合併 PDF](./merge-pdf) 或 [分割 PDF](./split-pdf) 工具可能更快。多功能工具的強項在於需要在同一工作階段中進行多種操作時。 + +## 相關工具 + +- [合併 PDF](./merge-pdf) +- [分割 PDF](./split-pdf) +- [複製與組織](./organize-pdf) +- [旋轉 PDF](./rotate-pdf) diff --git a/docs/zh-TW/tools/pdf-to-bmp.md b/docs/zh-TW/tools/pdf-to-bmp.md new file mode 100644 index 00000000..ce5bc2d4 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF 轉 BMP +description: 將 PDF 頁面轉換為未壓縮的 BMP 圖片。適用於需要點陣圖輸入的舊系統與列印工作流程。 +--- + +# PDF 轉 BMP + +將 PDF 的每一頁轉換為 BMP(點陣圖)圖片。BMP 是未壓縮格式,因此輸出像素完美、沒有任何品質損失,但檔案會很大。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 點選**轉換**處理檔案。 +3. 單一 `.bmp` 檔案或 ZIP 壓縮檔會自動下載。 + +## 選項 + +此工具沒有可設定的選項。頁面以固定的 2 倍比例算繪,產生的圖片約為 PDF 原始頁面尺寸的兩倍。 + +## 輸出格式 + +- **單頁**:`filename.bmp` +- **多頁**:`filename_bmps.zip`,內含 `page_1.bmp`、`page_2.bmp` 等 + +## 使用情境 + +- 將 PDF 頁面輸入只接受 BMP 的舊系統或硬體。 +- 為特定列印工作流程準備未壓縮的圖片。 +- 將點陣圖輸出用於需要原始像素資料的影像處理工具。 + +## 小技巧 + +- BMP 檔案會儲存未經壓縮的原始像素資料,因此非常大。大多數用途下,[PDF 轉 PNG](./pdf-to-png) 可提供無損品質,檔案也小得多。 +- 如果目標系統接受 PNG 或 TIFF,請優先使用這些格式以節省磁碟空間。 + +## 相關工具 + +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 TIFF](./pdf-to-tiff) +- [PDF 轉 JPG](./pdf-to-jpg) diff --git a/docs/zh-TW/tools/pdf-to-cbz.md b/docs/zh-TW/tools/pdf-to-cbz.md new file mode 100644 index 00000000..263d191e --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF 轉 CBZ +description: 將 PDF 轉換為 CBZ(漫畫封存)檔案,供 Komga、Kavita、CDisplayEx 與 Calibre 等漫畫閱讀器使用。 +--- + +# PDF 轉 CBZ + +將 PDF 轉換為 CBZ(Comic Book ZIP)檔案,這是數位漫畫的標準格式。每個 PDF 頁面都會成為封存檔中的一張圖片。工具會以三種格式產生中繼資料以達到最大相容性:ComicInfo.xml、metadata.opf 與 ComicBookInfo JSON。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 選擇圖片格式、品質、縮放比例,以及選用的中繼資料。 +3. 點選**轉換**產生 CBZ 檔案。 +4. `.cbz` 檔案會自動下載。 + +## 選項 + +| 選項 | 值 | 預設值 | 說明 | +| ------------ | --------------- | ------ | -------------------------------------------------------------- | +| 圖片格式 | JPEG, PNG, WebP | JPEG | JPEG 適合彩色漫畫,PNG 適合無損的黑白漫畫,WebP 壓縮效果最佳。 | +| 品質 | 50–100% | 85% | 控制 JPEG/WebP 壓縮。選擇 PNG 時隱藏(一律無損)。 | +| 縮放比例 | 1.0x–4.0x | 2.0x | 比例越高,圖片越清晰,適合高解析度螢幕。 | +| 灰階 | 開/關 | 關 | 將頁面轉為灰階。可縮小黑白內容的檔案大小。 | +| 漫畫模式 | 開/關 | 關 | 在中繼資料中設定由右至左的閱讀方向。 | +| 包含中繼資料 | 開/關 | 開 | 內嵌 ComicInfo.xml、metadata.opf 與 ComicBookInfo JSON。 | + +## 中繼資料欄位 + +啟用中繼資料時,您可以填寫: + +- **標題**:自動從 PDF 檔名偵測。 +- **系列**:系列名稱(例如「火影忍者」)。 +- **集數(#)**:該系列中的期數。 +- **卷數(Vol.)**:卷號。 +- **作者**:作者或創作者名稱。 +- **出版社**:出版公司。 +- **標籤 / 類型**:以逗號分隔的標籤(例如「動作, 冒險」)。 +- **出版年份**:出版年份(1900–2100)。 +- **評分**:0 到 5 的社群評分。 + +## 中繼資料相容性 + +工具會以三種格式寫入中繼資料,讓每種閱讀器都能讀取: + +| 格式 | 位置 | 支援的閱讀器 | +| ------------------ | ------------ | ------------------------------------------- | +| ComicInfo.xml | ZIP 內的檔案 | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | ZIP 內的檔案 | Calibre | +| ComicBookInfo JSON | ZIP 註解欄位 | Calibre(備援) | + +## 輸出格式 + +- `filename.cbz`:包含編號頁面圖片與中繼資料檔案的 ZIP 封存檔。 + +頁面圖片以補零的數字命名(`01.jpg`、`02.jpg` 等),讓閱讀器以正確順序顯示。 + +## 使用情境 + +- 轉換漫畫 PDF 以便在漫畫閱讀器中使用。 +- 在 Komga、Kavita 或 Calibre 中建立數位漫畫庫。 +- 將掃描的漫畫書轉換為方便閱讀器使用的格式。 +- 以保留閱讀方向與中繼資料的格式分享漫畫。 + +## 小技巧 + +- 彩色漫畫請使用 **JPEG**,黑白漫畫請使用 **PNG**,PNG 壓縮黑白內容的效率非常高。 +- 為黑白漫畫啟用**灰階**,可大幅縮小檔案大小。 +- 填寫**系列**與**集數**欄位,讓書庫管理程式(Komga、Calibre)能自動整理您的收藏。 +- **WebP** 的壓縮效果最好,但較舊的漫畫閱讀器可能不支援。 + +## 相關工具 + +- [PDF 轉 JPG](./pdf-to-jpg) +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 TIFF](./pdf-to-tiff) +- [擷取圖片](./extract-images) diff --git a/docs/zh-TW/tools/pdf-to-csv.md b/docs/zh-TW/tools/pdf-to-csv.md new file mode 100644 index 00000000..c41e4940 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF 轉 CSV +description: 從 PDF 文件擷取表格並匯出為單一 CSV 檔案。可處理多頁 PDF 並自動偵測表格。 +--- + +# PDF 轉 CSV + +從 PDF 擷取表格並匯出為 CSV 檔案。工具會使用 PyMuPDF 的表格偵測引擎掃描每一頁的表格資料,然後將找到的所有列寫入單一以逗號分隔的輸出檔。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 點選**轉換**開始擷取表格。 +3. 工具會掃描每一頁並自動辨識表格。 +4. 下載包含所有擷取表格資料的 `.csv` 檔案。 + +輸出中,不同頁面的表格以空白列分隔。含有逗號、引號或換行的儲存格會依照 RFC 4180 正確跳脫。 + +## 選項 + +此工具沒有可設定的選項。文件中找到的所有表格都會被擷取並合併為單一 CSV。 + +## 輸出格式 + +- 單一 `filename.csv` 檔案,包含所有偵測到的表格。 + +## 使用情境 + +- 將 PDF 銀行對帳單或發票中的財務資料匯入試算表。 +- 從廠商報價中擷取價目表以便比較。 +- 將 PDF 論文中的表格研究資料轉換為適合分析工具使用的格式。 +- 將舊有 PDF 報告中的資料移轉到資料庫。 + +## 小技巧 + +- 如果找不到表格,工具會顯示「找不到表格」訊息。這通常表示 PDF 使用的是看起來像表格、但並未結構化為實際表格的文字版面。 +- 若要更精細地控制個別表格,請使用 [擷取 PDF 表格](./extract-tables),可選擇 CSV、JSON 與 Markdown 輸出格式。 +- 如果需要 Excel 格式,且每個表格各自一張工作表,請使用 [PDF 轉 Excel](./pdf-to-excel)。 + +## 相關工具 + +- [PDF 轉 Excel](./pdf-to-excel) +- [擷取 PDF 表格](./extract-tables) +- [PDF 轉文字](./pdf-to-text) diff --git a/docs/zh-TW/tools/pdf-to-excel.md b/docs/zh-TW/tools/pdf-to-excel.md new file mode 100644 index 00000000..f7ed9b6b --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF 轉 Excel +description: 將 PDF 文件中的表格擷取到 Excel 試算表。每個表格各有一張工作表,並標示來源頁面。 +--- + +# PDF 轉 Excel + +從 PDF 擷取表格,並儲存為 Excel(`.xlsx`)試算表。每個偵測到的表格都會放在獨立的工作表中,並標示表格編號與來源頁面。表格偵測由 PyMuPDF 提供,Excel 產生則使用 SheetJS 函式庫。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 點選**轉換**開始擷取表格。 +3. 工具會掃描每一頁的表格,然後建立 Excel 活頁簿。 +4. 下載 `.xlsx` 檔案,每個表格一張工作表。 + +## 選項 + +此工具沒有可設定的選項。所有偵測到的表格都會自動擷取。 + +## 輸出格式 + +- 單一 `filename.xlsx` 檔案。 +- **一個表格**:單一工作表,名稱為「Table」。 +- **多個表格**:工作表名稱為「Table 1 (Page 3)」、「Table 2 (Page 5)」等。工作表名稱會截斷為 31 個字元(Excel 的上限)。 + +## 使用情境 + +- 將 PDF 財務報告轉換為可編輯的試算表,以便進一步分析。 +- 從供應商 PDF 擷取庫存或訂單表格。 +- 將 PDF 表單或型錄中的結構化資料匯入 Excel 以便排序與篩選。 +- 以非技術同事也能使用的格式封存 PDF 表格資料。 + +## 小技巧 + +- 如果工具回報「找不到表格」,表示該 PDF 很可能使用自由排列的文字版面,而非結構化表格。請改用 [PDF 轉文字](./pdf-to-text) 取得原始內容。 +- 若要更簡單的平面格式,請使用 [PDF 轉 CSV](./pdf-to-csv)。若要以多種格式逐一下載表格,請使用 [擷取 PDF 表格](./extract-tables)。 +- 查看工作表名稱即可得知每個表格來自哪一頁。 + +## 相關工具 + +- [PDF 轉 CSV](./pdf-to-csv) +- [擷取 PDF 表格](./extract-tables) +- [PDF 轉文字](./pdf-to-text) diff --git a/docs/zh-TW/tools/pdf-to-greyscale.md b/docs/zh-TW/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..bd7b9b4c --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF 轉灰階 +description: 將彩色 PDF 轉換為灰階(黑白)版本。產生每一頁都移除所有色彩的新 PDF。 +--- + +# PDF 轉灰階 + +將彩色 PDF 轉換為灰階版本。每一頁都會先算繪、去除飽和度,再以 JPEG 圖片重新嵌入新的 PDF。輸出會保留原始頁面尺寸。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 點選**轉換**處理檔案。 +3. 下載新的 `greyscale.pdf`,所有頁面皆已轉為黑白。 + +在背後,每一頁以 2 倍比例算繪,像素資料經過灰階濾鏡處理,再以 90% 品質重新編碼為 JPEG,放入全新的 PDF 文件中。 + +## 選項 + +此工具沒有可設定的選項。灰階轉換使用標準亮度公式,JPEG 品質固定為 90%。 + +## 輸出格式 + +- 單一 `greyscale.pdf` 檔案,所有頁面皆為灰階 JPEG 圖片。 + +## 使用情境 + +- 準備黑白列印文件,節省彩色墨水成本。 +- 符合法律或政府文件要求灰階的提交規定。 +- 縮小色彩豐富的 PDF 檔案大小(灰階 JPEG 圖片比彩色小)。 +- 讓彩色與黑白頁面混雜的文件呈現一致的視覺風格。 + +## 小技巧 + +- 由於每一頁都會點陣化並以 JPEG 重新嵌入,輸出是以圖片為基礎。原始 PDF 中的文字將無法再選取或搜尋。若之後需要可搜尋的文字,請將輸出交給 OCR 工具處理。 +- 若要更精細地調整色彩(亮度、對比、飽和度),請參考調整顏色工具,或 [PDF 工作流程建構器](./pdf-workflow) 中的灰階節點。 + +## 相關工具 + +- [PDF 轉 JPG](./pdf-to-jpg) +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 工作流程建構器](./pdf-workflow) diff --git a/docs/zh-TW/tools/pdf-to-jpg.md b/docs/zh-TW/tools/pdf-to-jpg.md new file mode 100644 index 00000000..ca355ed5 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF 轉 JPG +description: 將 PDF 頁面轉換為 JPG 圖片,品質可調。單頁 PDF 直接下載,多頁 PDF 則匯出為 ZIP。 +--- + +# PDF 轉 JPG + +將 PDF 的每一頁轉換為 JPG 圖片。單頁文件會下載為獨立的 `.jpg` 檔案。多頁 PDF 會產生 ZIP 壓縮檔,每頁各一張 JPG。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。工具會顯示檔名、檔案大小與頁數。 +2. 調整**品質**滑桿以控制 JPG 壓縮。 +3. 點選**轉換**開始處理。 +4. 結果會自動下載:單頁 PDF 為一張 JPG,多頁文件則為 ZIP 檔案。 + +## 選項 + +- **品質**:0% 到 100% 的滑桿(預設 90%)。數值越高,圖片越清晰,檔案也越大。數值越低,壓縮越強。 + +頁面在內部以 2 倍比例算繪,因此輸出解析度是 PDF 頁面尺寸的兩倍。標準 Letter 尺寸的頁面約會產生 1,224 x 1,584 像素的圖片。 + +## 輸出格式 + +- **單頁**:`filename.jpg` +- **多頁**:`filename_jpgs.zip`,內含 `page_1.jpg`、`page_2.jpg` 等 + +## 使用情境 + +- 為文件管理系統產生預覽縮圖。 +- 在不支援 PDF 的聊天或電子郵件中分享報告中的某一頁。 +- 從 PDF 圖表或插圖建立圖片素材。 +- 將掃描文件封存為個別圖片。 + +## 小技巧 + +- 若要無損輸出,請改用 [PDF 轉 PNG](./pdf-to-png)。 +- 80-90% 的品質設定能在檔案大小與畫質之間取得良好平衡。 +- 如果每頁需要特定格式,可以考慮 [PDF 工作流程建構器](./pdf-workflow),其中提供 PDF 轉圖片輸出節點。 + +## 相關工具 + +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 WebP](./pdf-to-webp) +- [PDF 轉 BMP](./pdf-to-bmp) +- [PDF 轉 TIFF](./pdf-to-tiff) diff --git a/docs/zh-TW/tools/pdf-to-json.md b/docs/zh-TW/tools/pdf-to-json.md new file mode 100644 index 00000000..38a5cb90 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF 轉 JSON +description: 使用 CPDF 將 PDF 檔案轉換為結構化 JSON 格式。將 PDF 內部結構匯出為機器可讀的 JSON 資料。 +--- + +# PDF 轉 JSON + +將一個或多個 PDF 檔案轉換為 JSON 格式。工具使用 CPDF(Coherent PDF)將每個 PDF 的內部結構序列化為機器可讀的 JSON 表示。輸出一律以 ZIP 壓縮檔提供。 + +## 運作方式 + +1. 使用檔案選擇器選取一個或多個 PDF 檔案。 +2. 點選**轉換**開始處理。轉換會在背景 Web Worker 中執行。 +3. 下載 ZIP 壓縮檔,其中每個輸入 PDF 各有一個 JSON 檔案。 + +狀態列會顯示轉換與 ZIP 建立階段的進度。 + +## 選項 + +此工具沒有可設定的選項。每個 PDF 都會轉換為完整的 JSON 表示。 + +## 輸出格式 + +- `pdfs-to-json.zip` 檔案,每個輸入 PDF 各對應一個 `filename.json`。 + +JSON 輸出呈現 PDF 的內部物件結構,包括頁面樹、字型參照、中繼資料與內容串流。 + +## 使用情境 + +- 檢查 PDF 的內部結構以進行除錯或驗證。 +- 以程式方式擷取結構化中繼資料與頁面屬性。 +- 將 PDF 結構資料輸入自訂處理管線。 +- 分析 PDF 文件的物件樹以稽核其合規性。 + +## 小技巧 + +- 此工具輸出的是原始 PDF 物件結構,而非擷取的文字內容。若需要 JSON 格式的頁面文字,請改用 [為 AI 準備 PDF](./prepare-pdf-for-ai)。 +- 若只要擷取純文字,[PDF 轉文字](./pdf-to-text) 更為直接。 +- 結構複雜的大型 PDF 會產生非常大的 JSON 檔案。 + +## 相關工具 + +- [PDF 轉文字](./pdf-to-text) +- [為 AI 準備 PDF](./prepare-pdf-for-ai) +- [擷取 PDF 表格](./extract-tables) diff --git a/docs/zh-TW/tools/pdf-to-markdown.md b/docs/zh-TW/tools/pdf-to-markdown.md new file mode 100644 index 00000000..f48dd105 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF 轉 Markdown +description: 將 PDF 文件轉換為 Markdown 格式,可選擇擷取圖片。支援多個檔案批次轉換。 +--- + +# PDF 轉 Markdown + +將 PDF 檔案轉換為 Markdown(`.md`)格式,保留標題、段落、清單與基本格式。可選擇擷取並納入內嵌圖片。支援單一與批次轉換。由 PyMuPDF 驅動。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳一個或多個 PDF。 +2. 可選擇開啟**包含圖片**,將擷取的圖片嵌入 Markdown 輸出。 +3. 點選**轉換**開始處理。 +4. 單一檔案會下載為 `filename.md`。多個檔案會產生 `markdown-files.zip`。 + +## 選項 + +- **包含圖片**:勾選時,會擷取 PDF 中的內嵌圖片並在 Markdown 輸出中參照。未勾選時,只轉換文字內容。 + +## 輸出格式 + +- **單一檔案**:`filename.md` +- **多個檔案**:`markdown-files.zip`,每個輸入 PDF 各有一個 `.md`。 + +## 使用情境 + +- 將 PDF 文件轉換為 Markdown,用於 VitePress、Hugo 或 Jekyll 等靜態網站產生器。 +- 將 PDF 研究論文轉成可編輯的 Markdown,用於 Obsidian 等筆記應用程式。 +- 將舊有的 PDF 知識庫移轉為適合 Git 的文字格式。 +- 從 PDF 電子書擷取結構化內容以重新排版。 + +## 小技巧 + +- 當 PDF 包含對內容不可或缺的圖表或插圖時,包含圖片選項很有用。以文字為主的文件請停用此選項,讓輸出保持簡潔。 +- 含有側欄、註腳或多欄文字的複雜版面可能產生不完美的 Markdown。請視需要檢查並調整輸出。 +- 若要不含任何格式的原始文字,請改用 [PDF 轉文字](./pdf-to-text)。 + +## 相關工具 + +- [PDF 轉文字](./pdf-to-text) +- [PDF 轉 Word](./pdf-to-word) +- [為 AI 準備 PDF](./prepare-pdf-for-ai) diff --git a/docs/zh-TW/tools/pdf-to-pdfa.md b/docs/zh-TW/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..ed063116 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF 轉 PDF/A +description: 將標準 PDF 轉換為 PDF/A 格式以便長期封存。支援 PDF/A-1b、PDF/A-2b 與 PDF/A-3b 符合性等級。 +--- + +# PDF 轉 PDF/A + +PDF/A 是經 ISO 標準化的 PDF 子集,專為長期數位保存而設計。此工具使用直接在瀏覽器中執行的 Ghostscript,將標準 PDF 轉換為符合 PDF/A 的文件。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。 +2. 從下拉選單選擇 **PDF/A 版本**。 +3. 對於一般轉換失敗的複雜檔案,可選擇啟用**預先平面化 PDF**。 +4. 點選**轉換為 PDF/A**。多個檔案會產生 ZIP 壓縮檔。 + +## PDF/A 版本 + +| 版本 | 限制 | 最適合 | +| ------------ | ---------------------------- | ------------------------------ | +| **PDF/A-1b** | 最嚴格。不允許透明度與圖層。 | 與較舊的封存系統達到最大相容性 | +| **PDF/A-2b** | 允許透明度與 JPEG2000。 | 一般用途封存(建議) | +| **PDF/A-3b** | 允許內嵌任何格式的附件。 | 封存附帶原始資料檔的文件 | + +預設選擇 PDF/A-2b,適用於絕大多數封存需求。 + +## 預先平面化選項 + +有些 PDF 包含會妨礙順利轉換為 PDF/A 的特性,例如特殊的字型編碼、複雜的透明度堆疊或損壞的內部結構。啟用**預先平面化**會在轉換前以 300 DPI 將 PDF 點陣化,雖能確保符合規範,但文字將無法選取。請在標準轉換產生錯誤時作為備援使用。 + +預先平面化需要 PyMuPDF WASM 引擎。 + +## 使用情境 + +- 符合政府或法律的封存要求(許多司法管轄區規定法院文件須使用 PDF/A) +- 將文件提交至機構典藏庫或數位圖書館 +- 保存商業紀錄,以防原始軟體十年後已不復存在 +- 為要求附帶 XML 附件之 PDF/A-3b 的電子發票標準準備發票 + +## 小技巧 + +- 請先嘗試不使用預先平面化進行轉換。只有在發生錯誤時才啟用。 +- PDF/A 會內嵌所有字型,因此輸出檔案通常比原始檔案大。 +- 如果您的工作流程要求嚴格符合規範,請使用專用的 PDF/A 驗證工具驗證輸出。 + +## 相關工具 + +- [壓縮 PDF](./compress-pdf):轉換後縮小檔案大小 +- [平面化 PDF](./flatten-pdf):轉換為 PDF/A 前先將表單平面化 +- [移除中繼資料](./remove-metadata):封存前移除中繼資料 diff --git a/docs/zh-TW/tools/pdf-to-png.md b/docs/zh-TW/tools/pdf-to-png.md new file mode 100644 index 00000000..8b9d9f95 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF 轉 PNG +description: 將 PDF 頁面轉換為無損 PNG 圖片,縮放比例可調。非常適合高品質截圖與透明背景。 +--- + +# PDF 轉 PNG + +將 PDF 的每一頁轉換為 PNG 圖片。PNG 使用無損壓縮,因此輸出會保留原始頁面的每個細節。單頁 PDF 會下載為 `.png` 檔案,多頁 PDF 則產生 ZIP。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 設定**縮放比例**滑桿以控制輸出解析度。 +3. 點選**轉換**開始處理。 +4. 單一 PNG 或 ZIP 壓縮檔會自動下載。 + +## 選項 + +- **縮放比例**:範圍為 1.0x 到 3.0x(預設 2.0x)。在 2.0x 時,標準 Letter 尺寸的頁面約會算繪為 1,224 x 1,584 像素。縮放比例越高,圖片越大越清晰,但檔案大小與處理時間也會增加。 + +## 輸出格式 + +- **單頁**:`filename.png` +- **多頁**:`filename_pngs.zip`,內含 `page_1.png`、`page_2.png` 等 + +## 使用情境 + +- 為簡報擷取高擬真度的 PDF 頁面截圖。 +- 擷取需要銳利邊緣且無壓縮瑕疵的圖表。 +- 從 PDF 設計稿準備網頁設計素材。 +- 為 OCR 前處理建立無損的頁面圖片。 + +## 小技巧 + +- PNG 檔案比 JPG 大得多。如果檔案大小比完美畫質更重要,請使用 [PDF 轉 JPG](./pdf-to-jpg) 或 [PDF 轉 WebP](./pdf-to-webp)。 +- 縮放比例為 1.0x 時,輸出與 PDF 的原生解析度相同。若要列印品質的匯出,請提高到 3.0x。 + +## 相關工具 + +- [PDF 轉 JPG](./pdf-to-jpg) +- [PDF 轉 WebP](./pdf-to-webp) +- [PDF 轉 SVG](./pdf-to-svg) diff --git a/docs/zh-TW/tools/pdf-to-svg.md b/docs/zh-TW/tools/pdf-to-svg.md new file mode 100644 index 00000000..e4259092 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF 轉 SVG +description: 將 PDF 頁面轉換為可縮放的 SVG 向量圖形。將文字與形狀保留為向量路徑,可無限縮放。 +--- + +# PDF 轉 SVG + +將 PDF 的每一頁轉換為 SVG(可縮放向量圖形)檔案。與點陣格式不同,SVG 會保留向量路徑、文字與形狀,因此輸出可縮放到任何大小而不會出現像素化。由 PyMuPDF 驅動。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳一個或多個 PDF。您可以新增多個檔案並個別管理。 +2. 點選**轉換**處理所有上傳的檔案。 +3. 單一檔案且只有一頁時,會下載為獨立的 `.svg`。其他情況則下載為 ZIP 壓縮檔。 + +## 選項 + +此工具沒有可設定的選項。每一頁都會使用 PyMuPDF 的原生向量匯出轉換為 SVG。 + +## 輸出格式 + +- **單一檔案、單頁**:`filename.svg` +- **單一檔案、多頁**:`filename_svg.zip`,內含 `page_1.svg`、`page_2.svg` 等 +- **多個檔案**:`pdf_to_svg.zip`,檔案依來源文件名稱整理。 + +## 使用情境 + +- 從 PDF 報告擷取向量圖表或插圖,用於網頁。 +- 在 Inkscape 或 Illustrator 等向量編輯器中編輯 PDF 頁面內容。 +- 在響應式網頁應用程式中嵌入可縮放的頁面預覽。 +- 從 PDF 型錄擷取標誌或圖形,同時保留銳利邊緣。 + +## 小技巧 + +- SVG 最適合含有向量內容的 PDF。掃描文件或以圖片為主的 PDF 會產生內嵌點陣資料的大型 SVG 檔案。 +- 以圖片為主的 PDF 若要點陣輸出,請改用 [PDF 轉 PNG](./pdf-to-png) 或 [PDF 轉 JPG](./pdf-to-jpg)。 +- 此工具支援批次轉換,一次上傳多個 PDF 即可在單次執行中全部轉換。 + +## 相關工具 + +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 JPG](./pdf-to-jpg) +- [PDF 轉 Markdown](./pdf-to-markdown) diff --git a/docs/zh-TW/tools/pdf-to-text.md b/docs/zh-TW/tools/pdf-to-text.md new file mode 100644 index 00000000..39a91892 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF 轉文字 +description: 從 PDF 檔案擷取純文字內容。支援多個 PDF 批次擷取,並輸出為 TXT 檔案。 +--- + +# PDF 轉文字 + +從 PDF 檔案擷取所有文字內容,並儲存為純 `.txt` 檔案。支援批次處理:上傳多個 PDF,一次操作即可擷取每個檔案的文字。由 PyMuPDF 驅動。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳一個或多個 PDF。使用新增更多與清除按鈕管理檔案清單。 +2. 點選**擷取**開始處理。 +3. 單一檔案會下載為 `filename.txt`。多個檔案會產生 `pdf-to-text.zip` 壓縮檔。 + +## 選項 + +此工具沒有可設定的選項。所有頁面的文字內容都會依閱讀順序擷取。 + +## 輸出格式 + +- **單一檔案**:`filename.txt` +- **多個檔案**:`pdf-to-text.zip`,每個輸入 PDF 各有一個 `.txt`。 + +## 使用情境 + +- 從 PDF 報告擷取內文,建立全文搜尋索引。 +- 將 PDF 電子書或文章轉換為純文字,以便在電子墨水裝置上閱讀。 +- 從合約或法律文件擷取文字進行關鍵字分析。 +- 移除 PDF 的格式,取得乾淨的文字供資料處理腳本使用。 +- 從 PDF 封存檔準備自然語言處理用的文字語料。 + +## 小技巧 + +- 掃描的 PDF(僅含圖片)會產生空白的文字檔,因為沒有可擷取的文字層。請先對掃描文件執行 OCR。 +- 輸出會保留 PyMuPDF 所判讀的閱讀順序,通常為由左至右、由上至下。多欄版面可能產生交錯的文字。 +- 若要包含標題與格式的結構化輸出,請試試 [PDF 轉 Markdown](./pdf-to-markdown)。若要適合 AI 使用的結構化 JSON,請使用 [為 AI 準備 PDF](./prepare-pdf-for-ai)。 + +## 相關工具 + +- [PDF 轉 Markdown](./pdf-to-markdown) +- [為 AI 準備 PDF](./prepare-pdf-for-ai) +- [PDF 轉 Word](./pdf-to-word) diff --git a/docs/zh-TW/tools/pdf-to-tiff.md b/docs/zh-TW/tools/pdf-to-tiff.md new file mode 100644 index 00000000..eaba062f --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF 轉 TIFF +description: 將 PDF 頁面轉換為 TIFF 圖片,常用於印刷、傳真與封存工作流程。編碼失敗時會改用 PNG。 +--- + +# PDF 轉 TIFF + +將 PDF 的每一頁轉換為 TIFF 圖片。TIFF 是印刷製作、傳真系統與文件封存的標準格式。工具使用 PackBits 壓縮進行 TIFF 編碼,若某頁編碼失敗則改用 PNG。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 點選**轉換**處理檔案。 +3. 單一 TIFF 檔案或 ZIP 壓縮檔會自動下載。 + +## 選項 + +此工具沒有可設定的選項。頁面以固定的 2 倍比例算繪。 + +## 輸出格式 + +- **單頁**:`filename.tiff` +- **多頁**:`filename_tiffs.zip`,內含 `page_1.tiff`、`page_2.tiff` 等 + +如果某一頁的 TIFF 編碼失敗(因壓縮問題),該頁會改存為 `.png` 檔案。此時 ZIP 中會同時包含 TIFF 與 PNG 檔案。 + +## 使用情境 + +- 向要求 TIFF 格式的政府機關或法律系統提交文件。 +- 準備透過數位傳真服務傳送的頁面。 +- 以廣泛支援的無損格式封存掃描文件。 +- 將頁面匯入企業文件管理系統。 + +## 小技巧 + +- TIFF 檔案很大。如果只需要用於網頁或螢幕的無損品質,[PDF 轉 PNG](./pdf-to-png) 是更好的選擇。 +- 如果有頁面需要改用 PNG,請檢查 ZIP 內容,您可能會想另外轉換這些頁面。 + +## 相關工具 + +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 BMP](./pdf-to-bmp) +- [PDF 轉 JPG](./pdf-to-jpg) diff --git a/docs/zh-TW/tools/pdf-to-webp.md b/docs/zh-TW/tools/pdf-to-webp.md new file mode 100644 index 00000000..4ebc2e74 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF 轉 WebP +description: 將 PDF 頁面轉換為 WebP 圖片,品質可調。在相近畫質下,檔案比 JPG 更小。 +--- + +# PDF 轉 WebP + +將 PDF 的每一頁轉換為 WebP 圖片。在相同的感知品質下,WebP 檔案通常比 JPG 小 25-35%,是網頁使用的絕佳選擇。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳 PDF。 +2. 調整**品質**滑桿。 +3. 點選**轉換**處理檔案。 +4. 單一 `.webp` 檔案或 ZIP 壓縮檔會自動下載。 + +## 選項 + +- **品質**:0% 到 100% 的滑桿(預設 85%)。控制有損壓縮程度。數值越高,保留的細節越多。 + +頁面在內部以 2 倍比例算繪,產生的圖片約為 PDF 原始尺寸的兩倍。 + +## 輸出格式 + +- **單頁**:`filename.webp` +- **多頁**:`filename_webps.zip`,內含 `page_1.webp`、`page_2.webp` 等 + +## 使用情境 + +- 為重視頻寬的網站準備頁面預覽。 +- 為社群媒體產生傳單或型錄的輕量圖片版本。 +- 將多頁文件批次轉換為針對網頁最佳化的圖片集。 + +## 小技巧 + +- 所有現代瀏覽器都支援 WebP。若需相容舊系統,請改用 [PDF 轉 JPG](./pdf-to-jpg)。 +- 80-85% 的品質在螢幕上通常與原圖難以分辨,同時能維持較小的檔案。 + +## 相關工具 + +- [PDF 轉 JPG](./pdf-to-jpg) +- [PDF 轉 PNG](./pdf-to-png) +- [PDF 轉 BMP](./pdf-to-bmp) diff --git a/docs/zh-TW/tools/pdf-to-word.md b/docs/zh-TW/tools/pdf-to-word.md new file mode 100644 index 00000000..86923951 --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF 轉 Word +description: 將 PDF 檔案轉換為可編輯的 Word(DOCX)文件。支援一次批次轉換多個 PDF。 +--- + +# PDF 轉 Word + +將 PDF 檔案轉換為可編輯的 Word(`.docx`)文件。工具使用 PyMuPDF 重建文件內容,保留文字、基本格式與版面。支援單一與批次轉換。 + +## 運作方式 + +1. 點選拖放區或將檔案拖曳到其中,上傳一個或多個 PDF。您可以新增更多檔案,或從清單中移除個別檔案。 +2. 點選**轉換**開始處理。 +3. 單一檔案會下載為 `filename.docx`。多個檔案會打包成 `converted-documents.zip`。 + +## 選項 + +此工具沒有可設定的選項。每個 PDF 都會使用 PyMuPDF 內建的轉換引擎轉換為 DOCX。 + +## 輸出格式 + +- **單一檔案**:`filename.docx` +- **多個檔案**:`converted-documents.zip`,每個輸入 PDF 各有一個 `.docx`。 + +## 使用情境 + +- 編輯收到後需要修改的 PDF 中的文字。 +- 將封存的 PDF 報告轉換為同事能在 Microsoft Word 或 Google 文件中編輯的格式。 +- 將 PDF 合約或提案的內容匯入 Word 以進行修訂標記。 +- 將舊有的 PDF 文件移轉為可編輯的格式。 + +## 小技巧 + +- 含有多欄文字、內嵌表單或大量圖形的複雜版面可能無法完美轉換。請檢查輸出,並在文書處理器中調整格式。 +- 掃描的 PDF(僅含圖片)會產生空白或內容極少的 DOCX 檔案。請先執行 OCR 加入文字層。 +- 批次模式能有效率地轉換整個資料夾的 PDF,一次全部上傳即可。 + +## 相關工具 + +- [PDF 轉文字](./pdf-to-text) +- [PDF 轉 Markdown](./pdf-to-markdown) +- [PDF 工作流程建構器](./pdf-workflow) diff --git a/docs/zh-TW/tools/pdf-to-zip.md b/docs/zh-TW/tools/pdf-to-zip.md new file mode 100644 index 00000000..7ebded2d --- /dev/null +++ b/docs/zh-TW/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF 轉 ZIP +description: 將多個 PDF 檔案打包成單一 ZIP 壓縮檔,方便分享與儲存。 +--- + +# PDF 轉 ZIP + +將多個 PDF 檔案打包成單一 ZIP 壓縮檔。這是一個單純的打包工具,不會轉換、壓縮或修改 PDF 本身。 + +## 運作方式 + +1. 使用拖放區上傳多個 PDF 檔案。 +2. 檢查檔案清單。移除任何不想包含的檔案。 +3. 點選處理按鈕。 +4. 包含所有已上傳 PDF 的 ZIP 壓縮檔會立即下載。 + +## 功能 + +- 接受任意數量的 PDF 檔案 +- 建立壓縮檔前可逐一移除檔案 +- 在 ZIP 中保留原始檔名 +- 不修改 PDF 內容,檔案原樣打包 +- 顯示每個已上傳 PDF 的檔名與大小 + +## 使用情境 + +- 將一組發票或收據打包成電子郵件附件 +- 打包專案交付成果(多份 PDF 報告)以便交接 +- 為一系列表單或範本建立單一下載檔 +- 將一批文件封存成一個壓縮檔 + +## 小技巧 + +- ZIP 檔案使用原始的 PDF 檔名。如果有同名檔案,請在上傳前重新命名以避免衝突。 +- 此工具不會壓縮 PDF 本身。若要縮小檔案大小,請先用壓縮 PDF 處理,再以此工具打包。 + +## 相關工具 + +- [合併 PDF](./merge-pdf) +- [分割 PDF](./split-pdf) +- [壓縮 PDF](./compress-pdf) diff --git a/docs/zh-TW/tools/pdf-workflow.md b/docs/zh-TW/tools/pdf-workflow.md new file mode 100644 index 00000000..494cbafd --- /dev/null +++ b/docs/zh-TW/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF 工作流程建構器 +description: 在畫布上連接節點,以視覺化方式建立自訂 PDF 處理管線。串接合併、壓縮、浮水印與匯出等操作。 +--- + +# PDF 工作流程建構器 + +工作流程建構器可讓您將多個 PDF 操作串接成單一自動化管線。不必一次執行一個工具,只要以視覺化方式連接節點圖(輸入、處理、輸出),一鍵即可執行全部操作。您的檔案絕不會離開瀏覽器。 + +## 運作方式 + +介面分為三個面板:左側的**節點工具箱**、中央的**畫布**,以及選取節點時出現在右側的**設定面板**。 + +1. **新增節點**:在左側邊欄點選節點,或直接拖曳到畫布上。使用工具箱頂端的搜尋列依名稱篩選。 +2. **連接節點**:從輸出插槽(節點底部)拖曳到另一個節點的輸入插槽(頂部)。連線方向為由上而下。 +3. **設定選項**:點選節點即可在右側開啟其設定面板。每種節點類型都有各自的選項(頁面範圍、品質滑桿、密碼等)。 +4. **執行工作流程**:點選工具列中的**執行**按鈕。引擎會依拓撲順序依序處理每個節點。底部的狀態列會追蹤進度。 +5. **下載結果**:終端的下載節點會儲存最終的 PDF(若產生多個檔案則為 ZIP)。 + +## 節點類別 + +節點分為六個類別,在畫布上各以不同顏色標示: + +- **輸入**(藍色):PDF 輸入、圖片輸入、Word/Excel/PowerPoint 轉 PDF,以及 15 種以上將檔案送入管線的其他格式轉換器。 +- **編輯與註解**(靛藍色):裁切、灰階、反轉顏色、浮水印、頁碼、頁首與頁尾、掃描效果、調整顏色、背景顏色、移除空白頁面、移除註解。 +- **組織與管理**(紫色):合併、分割、擷取頁面、旋轉、刪除頁面、反轉、新增空白頁面、分割頁面、N-Up、統一頁面尺寸、合併為單一頁面、小手冊、海報化、編輯中繼資料、目錄、OCR。 +- **最佳化與修復**(琥珀色):壓縮、光柵化、線性化、歪斜修正、PDF 轉 PDF/A、字型轉外框、修復。 +- **保護 PDF**(玫瑰色):加密、解密、清理、平面化、數位簽章、塗銷。 +- **輸出**(藍綠色):下載(自動判斷單一 PDF 或 ZIP)、PDF 轉圖片、PDF 轉文字、PDF 轉 DOCX、PDF 轉 XLSX、PDF 轉 CSV、PDF 轉 SVG、PDF 轉 Markdown、擷取圖片。 + +## 儲存與載入工作流程 + +工具列提供四種保存選項: + +- **儲存**:將目前的工作流程以具名範本儲存在瀏覽器的本機儲存空間中。可儲存多個範本。 +- **載入**:開啟列出所有已儲存範本的視窗。點選載入以還原範本,或刪除不再需要的範本。 +- **匯出**:將工作流程下載為 `.json` 檔案,方便分享或備份。 +- **匯入**:從磁碟載入 `.json` 工作流程檔案,還原所有節點、位置與連線。 + +範本會保存在本機儲存空間中,跨工作階段保留。匯出的 JSON 檔案可在不同瀏覽器與電腦之間攜帶使用。 + +## 執行模型 + +引擎會根據您的連線建立相依關係圖,並依拓撲順序執行節點。任何節點失敗時,執行會停止,失敗的節點會標示為紅色。請留意以下幾項規則: + +- 每個工作流程至少需要一個**輸入**節點與一個**輸出**節點。 +- 引擎會偵測循環相依,並以錯誤阻止執行。 +- **加密**節點必須是輸出節點之前的最後一個處理步驟。放在更前面會觸發驗證警告,因為下游節點無法處理加密資料。 +- 受密碼保護的 PDF 會在執行期間提示輸入密碼。 +- 支援多個 PDF 輸入:合併節點可將它們合併,批次處理節點則會逐一處理每個 PDF。 + +## 插槽類型 + +連線使用具類型的插槽,以防止無效的連接: + +- **PDF**(靛藍色):單一 PDF 文件。 +- **MultiPDF**(琥珀色):打包在一起的多個 PDF 文件。 +- **Image**(綠色):圖片 blob。 + +## 選項 + +每個節點都有各自的設定,可透過右側設定面板存取。常見的設定包括: + +- 分割、擷取頁面、刪除頁面節點上的**頁面範圍** +- 圖片轉換輸出節點上的**品質滑桿** +- 加密與解密節點上的**密碼欄位** +- 浮水印、頁首與頁尾、編輯中繼資料的**文字輸入** +- 旋轉節點上的**旋轉角度** +- 壓縮節點上的**壓縮等級** +- OCR 節點上的 **OCR 語言選擇** + +## 使用情境 + +- **發票處理管線**:PDF 輸入 -> OCR -> 擷取表格 -> 下載為 CSV。 +- **報告標準化**:Word 轉 PDF -> 統一頁面尺寸 -> 加入頁碼 -> 浮水印 -> 壓縮 -> 下載。 +- **封存準備**:PDF 輸入 -> 修復 -> 平面化 -> 清理 -> PDF 轉 PDF/A -> 下載。 +- **批次擷取圖片**:PDF 輸入(多個檔案)-> 擷取圖片 -> 下載 ZIP。 +- **可供列印的小手冊**:PDF 輸入 -> 小手冊 -> 裁切 -> 壓縮 -> 下載。 +- **安全發送**:PDF 輸入 -> 塗銷 -> 移除註解 -> 加密 -> 下載。 + +## 小技巧 + +- 使用 **Delete** 或 **Backspace** 從畫布移除所選節點。 +- 點選節點狀態列上的 **X** 按鈕可直接刪除節點。 +- 在空白處點選並拖曳即可平移畫布。平移時游標會變成抓取圖示。 +- 在行動裝置上,使用工具列中的 **+** 按鈕切換節點工具箱。 +- 如果工作流程產生多個輸出檔案,下載節點會自動將它們打包成 ZIP。 +- 從簡單開始:先建立並測試兩個節點的管線,再逐步增加複雜度。 + +## 相關工具 + +- [PDF 轉文字](./pdf-to-text) +- [PDF 轉 Excel](./pdf-to-excel) +- [擷取圖片](./extract-images) +- [PDF 轉 Markdown](./pdf-to-markdown) diff --git a/docs/zh-TW/tools/png-to-pdf.md b/docs/zh-TW/tools/png-to-pdf.md new file mode 100644 index 00000000..d4e57eb0 --- /dev/null +++ b/docs/zh-TW/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG 轉 PDF +description: 完全在瀏覽器中,將一張或多張 PNG 圖片轉換為 PDF 文件,品質可調。 +--- + +# PNG 轉 PDF + +將 PNG 圖片轉換為 PDF,同時保留完整解析度。每張 PNG 都會成為獨立的一頁,尺寸與原始圖片相符。透明度會自動處理。 + +## 支援格式 + +| 格式 | 副檔名 | +| :--- | :----- | +| PNG | `.png` | + +## 運作方式 + +1. 點選上傳區域,或拖放 PNG 檔案。可一次選取多個檔案。 +2. 管理檔案清單:移除不需要的檔案或新增更多檔案。 +3. 從下拉選單選擇 **PDF 品質**等級。 +4. 點選**轉換為 PDF**。輸出會下載為 `from_jpgs.pdf`。 + +工具使用 pdf-lib 直接嵌入每張圖片。如果某張 PNG 無法原生嵌入(例如色彩設定檔特殊),會改透過 canvas 重新算繪為 JPEG。 + +## 選項 + +**PDF 品質**控制嵌入前套用的壓縮: + +- **高品質**:壓縮最少,檔案最大。 +- **中等品質**(預設):在大小與清晰度之間取得良好平衡。 +- **低品質**:壓縮最多,輸出最小。 + +## 使用情境 + +- 將螢幕截圖轉換為多頁 PDF,用於錯誤回報或文件 +- 將 UI 設計匯出檔打包成單一檔案以供審閱 +- 將圖表匯出檔(draw.io、Excalidraw)轉換為可分享的 PDF +- 將一組圖表圖片彙整成報告 + +## 小技巧 + +- 含有透明度的 PNG 檔案在 PDF 中會使用白色背景。如果需要其他背景,請事先編輯圖片。 +- 對於邊緣銳利且含文字的螢幕截圖與圖表,高品質可避免 JPEG 壓縮瑕疵。中等或低品質可能會在內部轉換為 JPEG。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [JPG 轉 PDF](./jpg-to-pdf) +- [SVG 轉 PDF](./svg-to-pdf) diff --git a/docs/zh-TW/tools/posterize-pdf.md b/docs/zh-TW/tools/posterize-pdf.md new file mode 100644 index 00000000..5a24402b --- /dev/null +++ b/docs/zh-TW/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: 海報化 PDF +description: 將 PDF 頁面分割成較小頁面的網格,以便跨多張紙張進行大尺寸列印。 +--- + +# 海報化 PDF + +將 PDF 的每一頁劃分為由較小子頁面組成的網格。這個工具可讓您將單一頁面分散列印在多張紙上,再拼接成大型海報或橫幅。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 設定 **列數** 與 **欄數** 來定義網格(例如 2 列 x 2 欄會將每頁分割成 4 個子頁面)。 +3. 可選擇指定頁面範圍,限制要海報化的頁面。 +4. 預覽畫布會在目前頁面上顯示網格疊加層,讓您直觀看到切割位置。 +5. 在頁面之間切換,檢查不同頁面上的疊加層。 +6. 點擊處理按鈕。每個網格儲存格都會成為輸出 PDF 中的獨立頁面。 + +## 功能特色 + +- 可設定列數與欄數,靈活調整網格大小 +- 即時預覽並顯示網格疊加層,清楚呈現頁面的分割位置 +- 頁面範圍篩選,只海報化特定頁面 +- 預覽中可逐頁瀏覽 +- 快取頁面快照,讓預覽切換更快速 +- 紅色虛線網格清楚標示切割邊界 + +## 選項 + +| 選項 | 說明 | +| ------------ | --------------------------------- | +| **列數** | 水平分割數量(預設:1) | +| **欄數** | 垂直分割數量(預設:1) | +| **頁面範圍** | 要海報化的頁面(留空 = 所有頁面) | + +## 使用情境 + +- 將海報尺寸的 PDF 列印在標準 A4 或 Letter 紙張上,再貼到牆上拼接 +- 從單頁 PDF 設計製作大型橫幅 +- 將超大尺寸的技術圖面分割成可列印的圖塊 +- 在沒有大幅面印表機的情況下製作大尺寸印刷品 + +## 提示 + +- 2x2 網格會將一頁變成 4 頁,3x3 網格則變成 9 頁。請依照最終拼接成品的大小規劃網格。 +- 預覽疊加層可協助您確認重要內容不會落在切割線上。必要時請調整列數或欄數。 +- 若要進行相反的操作(將多頁放到一張紙上),請使用 [多頁併一頁 (N-Up)](./n-up-pdf)。 + +## 相關工具 + +- [多頁併一頁 (N-Up)](./n-up-pdf) +- [分割頁面](./divide-pages) +- [分割 PDF](./split-pdf) diff --git a/docs/zh-TW/tools/powerpoint-to-pdf.md b/docs/zh-TW/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..c13d6c24 --- /dev/null +++ b/docs/zh-TW/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint 轉 PDF +description: 將 PowerPoint 簡報(PPT、PPTX)與 ODP 檔案轉換為 PDF,並保留投影片格式。 +--- + +# PowerPoint 轉 PDF + +將簡報檔案轉換為 PDF。每張投影片都會成為輸出文件中的一頁,文字、圖片、圖形與轉場效果皆透過瀏覽器端的 LibreOffice 引擎轉譯。支援新版與舊版 PowerPoint 格式,以及 OpenDocument 簡報格式。 + +## 支援格式 + +| 格式 | 副檔名 | +| :----------------- | :------ | +| PowerPoint(新版) | `.pptx` | +| PowerPoint(舊版) | `.ppt` | +| OpenDocument 簡報 | `.odp` | + +## 運作方式 + +1. 點擊上傳區域,或將簡報檔案拖放到該處。 +2. 檢查檔案清單,視需要新增或移除檔案。 +3. 點擊 **轉換為 PDF**。LibreOffice 引擎會在首次使用時載入,接著轉換每個檔案。 +4. 單一檔案會直接下載為 PDF。多個檔案會打包成 `powerpoint-converted.zip`。 + +## 選項 + +此工具沒有其他設定。投影片會以原始尺寸轉譯。 + +## 輸出 + +| 輸入數量 | 輸出 | +| :----------- | :----------------------------------------------------------- | +| 1 個檔案 | 下載單一 PDF(原始檔名,副檔名為 `.pdf`) | +| 2 個以上檔案 | ZIP 壓縮檔(`powerpoint-converted.zip`),每個檔案各一個 PDF | + +## 使用情境 + +- 在分享給可能沒有 PowerPoint 的觀眾之前,先將簡報轉換為 PDF +- 為研討會或工作坊製作可列印的投影片講義 +- 以在所有裝置上都能一致呈現的格式封存簡報 +- 將 LibreOffice Impress 的 ODP 簡報批次轉換為 PDF +- 製作 PDF 版的募資簡報,作為電子郵件附件 + +## 提示 + +- 投影片動畫與轉場效果不會呈現在 PDF 中。每張投影片都會擷取為靜態頁面。 +- 內嵌影片不會出現在輸出中。如有需要,請改用螢幕截圖或預留位置圖片。 +- 預設的 PDF 匯出不包含演講者備忘稿。如需備忘稿,建議先從 PowerPoint 原生的「列印備忘稿」檢視匯出。 +- LibreOffice 引擎在首次載入後會被快取,因此在同一工作階段中轉換第二份簡報會快很多。 + +## 相關工具 + +- [Word 轉 PDF](./word-to-pdf) +- [Excel 轉 PDF](./excel-to-pdf) +- [圖片轉 PDF](./image-to-pdf) diff --git a/docs/zh-TW/tools/prepare-pdf-for-ai.md b/docs/zh-TW/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..3e9c21eb --- /dev/null +++ b/docs/zh-TW/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: 為 AI 準備 PDF +description: 將 PDF 內容擷取為針對 LLM 與 LlamaIndex 等 AI 流程最佳化的結構化 JSON。支援批次處理。 +--- + +# 為 AI 準備 PDF + +從 PDF 檔案擷取內容,並整理成針對大型語言模型(LLM)與 LlamaIndex 等 AI 框架最佳化的 JSON 結構。每頁內容都會被擷取並組織成結構化格式,可直接用於 RAG 流程、聊天機器人或語意搜尋系統。 + +## 運作方式 + +1. 點擊放置區或將檔案拖曳到該處,上傳一個或多個 PDF。 +2. 點擊 **擷取** 開始處理。 +3. 單一檔案會下載為 `filename_llm.json`。多個檔案則產生 `pdf-for-ai.zip` 壓縮檔。 + +此工具使用 PyMuPDF 的 LlamaIndex 整合功能,擷取每頁內容與中繼資料,產生可直接載入 AI 框架的輸出。 + +## 選項 + +此工具沒有可設定的選項。所有頁面都會連同完整文字與中繼資料一併擷取。 + +## 輸出格式 + +- **單一檔案**:`filename_llm.json` +- **多個檔案**:`pdf-for-ai.zip`,每個輸入 PDF 各對應一個 `_llm.json`。 + +JSON 輸出遵循 LlamaIndex 文件結構描述,包含每頁的文字內容與中繼資料欄位。 + +## 使用情境 + +- 為檢索增強生成(RAG)流程準備 PDF 文件。 +- 從 PDF 封存資料建立可供 AI 聊天機器人搜尋的知識庫。 +- 將 PDF 報告輸入以 LLM 為基礎的分析工作流程。 +- 預先處理研究論文,用於語意搜尋與問答系統。 +- 從 PDF 文件集合建立結構化訓練資料。 + +## 提示 + +- 若只需擷取純文字而不需 AI 專用格式,請使用 [PDF 轉文字](./pdf-to-text)。 +- 若需要保留標題與結構的 Markdown 輸出,請使用 [PDF 轉 Markdown](./pdf-to-markdown)。 +- 掃描的 PDF 只會產生空白或極少的輸出。請先執行 OCR 加入文字層,再進行擷取。 + +## 相關工具 + +- [PDF 轉文字](./pdf-to-text) +- [PDF 轉 Markdown](./pdf-to-markdown) +- [PDF 轉 JSON](./pdf-to-json) diff --git a/docs/zh-TW/tools/protect-pdf.md b/docs/zh-TW/tools/protect-pdf.md new file mode 100644 index 00000000..a31369a0 --- /dev/null +++ b/docs/zh-TW/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: 保護 PDF +description: 使用 256 位元 AES 加密為 PDF 檔案設定密碼保護。可設定使用者密碼與擁有者密碼,並套用使用限制。 +--- + +# 保護 PDF + +用密碼鎖住您的 PDF,只有經授權的人才能開啟。BentoPDF 使用 256 位元 AES 加密(與銀行及政府機關採用的標準相同),並透過 QPDF 完全在您的瀏覽器中套用。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 輸入 **使用者密碼**(必填)。這是其他人開啟檔案時需要的密碼。 +3. 可選擇輸入 **擁有者密碼**。設定後,PDF 會加上使用限制,禁止列印、編輯、複製與註解。 +4. 點擊 **加密 PDF**。 +5. 下載加密後的檔案。 + +## 密碼類型 + +### 使用者密碼(必填) + +使用者密碼是收件人開啟 PDF 時要輸入的密碼。沒有它,就完全無法存取文件。每個加密的 PDF 都必須設定。 + +### 擁有者密碼(選填) + +擁有者密碼控制授權使用者在開啟檔案後可以執行哪些操作。當您設定不同的擁有者密碼時,BentoPDF 會自動套用最嚴格的限制組合: + +- 禁止修改 +- 禁止擷取/複製 +- 禁止列印 +- 禁止註解 +- 禁止填寫表單 +- 禁止組合文件 + +若擁有者密碼留空,PDF 仍會加密(開啟時仍需使用者密碼),但開啟後沒有任何使用限制。 + +## 加密詳細資訊 + +- **演算法**:AES-256(256 位元進階加密標準) +- **金鑰長度**:256 位元 +- **標準**:PDF 2.0 加密(QPDF 實作) + +以目前的技術,AES-256 在運算上無法被暴力破解。加密 PDF 的安全性完全取決於您的密碼強度。 + +## 使用情境 + +- 以電子郵件寄送機密財務報告前先加以保護 +- 保護與對造律師共享的法律文件 +- 為醫療紀錄或個人識別資訊加上密碼 +- 以存取控制發布付費內容(電子書、報告) +- 遵循要求靜態資料加密的資料保護政策 + +## 提示 + +- 請使用強度高且獨一無二的密碼。理想的是 12 個字元以上、混合大小寫、數字與符號的密碼片語。 +- 請透過其他管道(電話、簡訊)分享密碼,絕對不要與 PDF 放在同一封電子郵件中。 +- 如果只需要限制操作(禁止列印、禁止複製),而不需要密碼才能開啟,請改用變更權限工具。 + +## 相關工具 + +- [解除鎖定 PDF](./unlock-pdf):在知道密碼時移除加密 +- [變更權限](./change-permissions):修改特定的使用限制 +- [移除限制](./remove-restrictions):移除 PDF 的所有安全設定 +- [清理 PDF](./sanitize-pdf):在加密前移除隱藏內容 diff --git a/docs/zh-TW/tools/psd-to-pdf.md b/docs/zh-TW/tools/psd-to-pdf.md new file mode 100644 index 00000000..d4643a72 --- /dev/null +++ b/docs/zh-TW/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD 轉 PDF +description: 在瀏覽器中將 Photoshop(PSD)檔案轉換為 PDF。免費、私密,不需要 Adobe 軟體。 +--- + +# PSD 轉 PDF + +將 Adobe Photoshop PSD 檔案轉換為 PDF 文件。PSD 是 Photoshop 的原生格式,通常需要昂貴的 Adobe 軟體才能開啟。此工具會將 PSD 檔案的平面化合成影像轉譯為全解析度的 PDF 頁面。 + +## 支援格式 + +| 格式 | 副檔名 | 備註 | +| :-------------- | :----- | :------------------- | +| Adobe Photoshop | `.psd` | 轉譯平面化的合成影像 | + +## 運作方式 + +1. 點擊上傳區域,或將 PSD 檔案拖放到該處。支援多個檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除不需要的檔案,或使用 **新增更多檔案** 加入更多檔案。 +3. 點擊 **轉換為 PDF**。PyMuPDF 引擎會讀取 PSD 檔案,並以原始解析度將合成影像嵌入 PDF 頁面。 +4. 單一 PSD 會產生一個 PDF。上傳多個 PSD 檔案時,會合併成一個名為 `psd_to_pdf.pdf` 的多頁 PDF,每個 PSD 各成為一頁。 + +## 選項 + +不需要任何設定。轉換器會使用 PSD 檔案中的平面化影像資料。 + +## 使用情境 + +- 不開啟 Photoshop 即可預覽 Photoshop 設計 +- 將設計校樣寄給沒有 Adobe Creative Suite 的客戶 +- 從 PSD 檔案列印高解析度作品 +- 從多個 PSD 設計檔建立 PDF 作品集,每個檔案都成為同一份文件中的一頁 + +## 提示 + +- 轉換會轉譯 PSD 的合成(平面化)檢視。個別圖層、調整圖層與圖層效果不會在 PDF 中保留為獨立元素。 +- 多個 PSD 檔案會合併成一個多頁 PDF,而不是各自產生 PDF。這很適合用來製作作品集或型錄。 +- 解析度非常高的 PSD 檔案(300 DPI 以上的印刷檔)會產生較大的 PDF。此工具會保留完整解析度。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) +- [VSD 轉 PDF](./vsd-to-pdf) diff --git a/docs/zh-TW/tools/pub-to-pdf.md b/docs/zh-TW/tools/pub-to-pdf.md new file mode 100644 index 00000000..01a1e1d1 --- /dev/null +++ b/docs/zh-TW/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB 轉 PDF +description: 在瀏覽器中將 Microsoft Publisher(PUB)檔案轉換為 PDF。免費、私密,不需要安裝軟體。 +--- + +# PUB 轉 PDF + +將 Microsoft Publisher 檔案轉換為 PDF。Publisher 是部分 Microsoft Office 版本隨附的桌面排版工具,但大多數人並未安裝。此工具讓任何人都能直接在瀏覽器中將 PUB 檔案轉換為 PDF,不需要任何 Microsoft 軟體。 + +## 支援格式 + +| 格式 | 副檔名 | 備註 | +| :------------------ | :----- | :----------- | +| Microsoft Publisher | `.pub` | 桌面排版文件 | + +## 運作方式 + +1. 點擊上傳區域,或將 PUB 檔案拖放到該處。可一次上傳多個檔案。 +2. 檢查檔案清單。使用垃圾桶圖示移除不需要的檔案,或點擊 **新增更多檔案** 加入更多檔案。 +3. 點擊 **轉換為 PDF**。以 LibreOffice 為基礎的引擎會在瀏覽器中載入並轉換每個 PUB 檔案,保留版面配置、圖片與文字方塊。 +4. 單一檔案會直接下載為 PDF。多個檔案會以名為 `pub-to-pdf.zip` 的 ZIP 壓縮檔提供。 + +## 選項 + +不需要其他設定。轉換器會自動處理 PUB 版面配置。 + +## 使用情境 + +- 不必購買 Microsoft Publisher,也能開啟客戶提供的 PUB 傳單或電子報 +- 轉換以 Publisher 製作的教會週報、活動節目單或學校通訊 +- 以通用格式封存 Publisher 製作的行銷素材 +- 在未安裝 Publisher 的系統上列印 PUB 檔案 + +## 提示 + +- 含有重疊文字方塊與精確定位的複雜 Publisher 版面,在轉換時可能會略有偏移。若精確位置很重要,請檢查輸出結果。 +- LibreOffice 引擎在每個工作階段只會初始化一次。第一次轉換需要較長時間,之後就會比較快。 +- 為了讓 Publisher 檔案的轉換最忠實,請確保原始檔案中使用的自訂字型為標準系統字型。 + +## 相關工具 + +- [VSD 轉 PDF](./vsd-to-pdf) +- [ODP 轉 PDF](./odp-to-pdf) diff --git a/docs/zh-TW/tools/rasterize-pdf.md b/docs/zh-TW/tools/rasterize-pdf.md new file mode 100644 index 00000000..572622df --- /dev/null +++ b/docs/zh-TW/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: 光柵化 PDF +description: 將 PDF 頁面轉換為以圖片為基礎的 PDF。平面化所有圖層、移除可選取文字,並控制 DPI 與圖片格式。 +--- + +# 光柵化 PDF + +光柵化會將 PDF 的每一頁轉換為圖片,再將這些圖片重新組合成 PDF。結果看起來與原始檔案完全相同,但沒有可選取的文字、互動元素或可編輯的圖層。實際上就像一份高品質的影印本。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。 +2. 設定光柵化輸出的 **DPI**(解析度)。 +3. 選擇 **圖片格式**:PNG 為無損品質,JPEG 則檔案較小。 +4. 可選擇勾選 **轉換為灰階**。 +5. 點擊 **光柵化 PDF**。多個檔案會以 ZIP 下載。 + +## 選項 + +| 設定 | 值 | 預設 | +| ------------ | ------------------------- | ---- | +| **DPI** | 72, 150, 200, 300, 600 | 150 | +| **圖片格式** | PNG(無損)、JPEG(較小) | PNG | +| **灰階** | 開啟/關閉 | 關閉 | + +## DPI 建議 + +- **72**:僅供螢幕檢視,檔案最小 +- **150**:一般用途的良好平衡 +- **200**:文字更清晰,檔案大小適中 +- **300**:印刷品質輸出 +- **600**:高品質封存或專業印刷 + +## 使用情境 + +- 分享機密文件前防止文字被擷取 +- 將文字轉換為像素,消除字型相依問題 +- 為含有複雜圖層或透明度、在不同檢視器中呈現不一致的 PDF 建立「平面」版本 +- 為只接受圖片輸入的系統準備 PDF +- 將 PDF 轉為純圖片,移除隱藏內容(例如追蹤修訂或表單資料) + +## 提示 + +- PNG 搭配 150 DPI 是可靠的預設值。只有在需要印刷輸出或放大檢視細節時才調高。 +- JPEG 產生的檔案明顯較小,但會在銳利的文字邊緣產生壓縮瑕疵。 +- 光柵化無法復原。如果之後可能需要可編輯的文字,請保留原始 PDF。 + +## 相關工具 + +- [壓縮 PDF](./compress-pdf):縮小光柵化 PDF 的檔案大小 +- [PDF 歪斜修正](./deskew-pdf):光柵化掃描文件前先將頁面拉正 +- [字型轉外框](./font-to-outline):若想保留可縮放性,可將字型轉換為向量路徑 +- [平面化 PDF](./flatten-pdf):平面化表單而不轉換為圖片 diff --git a/docs/zh-TW/tools/remove-annotations.md b/docs/zh-TW/tools/remove-annotations.md new file mode 100644 index 00000000..bf58cb03 --- /dev/null +++ b/docs/zh-TW/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: 移除註解 +description: 一鍵移除 PDF 中所有的留言、螢光標示、連結與其他註解。 +--- + +# 移除註解 + +移除 PDF 中所有的註解,讓文件保持乾淨,包括留言、螢光標示、便利貼、文字標記、連結、印章,以及文件中內嵌的其他註解物件。底層的頁面內容(文字、圖片、圖形)完全不受影響。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 工具會偵測文件的頁數並顯示檔案資訊。 +3. 點擊 **移除註解** 進行處理。 +4. 清理後的 PDF 會自動下載,所有註解皆已移除。 + +## 功能特色 + +- 移除所有註解類型:留言、螢光標示、底線、刪除線、便利貼、印章、連結與表單標記 +- 處理文件中的每一頁 +- 保留所有非註解內容(文字、圖片、向量圖形、表單欄位) +- 處理前顯示頁數與檔案大小 + +## 使用情境 + +- 在多位審閱者加上留言的審閱流程結束後,於最終發布前清理文件 +- 從共享的讀書指南中移除螢光標示與便利貼 +- 封存前移除文件中的連結註解 +- 為協商期間加上大量註解的法律文件準備「乾淨」版本 +- 送印前移除稿件中的審閱者留言 + +## 提示 + +- 此工具在 PDF 結構層級移除註解,因此結果會保留可選取的文字與原始品質,不涉及光柵化。 +- 如果只想移除特定註解而非全部,請使用 [PDF 編輯器](./edit-pdf) 選擇性地刪除個別註解。 +- 平面化 PDF 中的註解(已合併到頁面內容中)無法移除,因為它們已不再是獨立的物件。 + +## 相關工具 + +- [PDF 編輯器](./edit-pdf) +- [新增浮水印](./add-watermark) +- [簽署 PDF](./sign-pdf) diff --git a/docs/zh-TW/tools/remove-blank-pages.md b/docs/zh-TW/tools/remove-blank-pages.md new file mode 100644 index 00000000..9eded890 --- /dev/null +++ b/docs/zh-TW/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: 移除空白頁面 +description: 自動偵測並移除 PDF 中空白或近乎空白的頁面,可調整敏感度。 +--- + +# 移除空白頁面 + +掃描 PDF 中空白或近乎空白的頁面並自動移除。此工具會轉譯每一頁並分析其像素內容來判斷是否為空白,接著讓您在處理前確認要移除哪些頁面。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 調整 **敏感度** 滑桿,控制「空白」的判定嚴格程度。 +3. 點擊 **偵測空白頁面** 掃描文件。 +4. 工具會顯示偵測到的空白頁面縮圖,供您檢查。 +5. 確認選取項目,並下載已移除空白頁面的 PDF。 + +## 選項 + +- **敏感度**:從 0% 到 100% 的滑桿(預設 80%)。數值越高越嚴格,只會標記完全或幾乎全白的頁面。數值越低越寬鬆,也會抓出只有極少內容的頁面,例如單一圓點或淡淡的浮水印。 + +## 功能特色 + +- 逐頁進行像素層級分析以偵測空白內容 +- 可調整敏感度滑桿以微調偵測 +- 偵測到的空白頁面會顯示縮圖預覽,方便手動確認 +- 所有非空白頁面完整保留原樣 +- 可處理任何大小或頁數的文件 +- 掃描期間顯示進度 + +## 使用情境 + +- 清理掃描文件中,掃描器擷取到的單面原稿空白背面 +- 移除大量掃描文件批次中的分隔頁 +- 移除文件管理系統插入的空白頁面 +- 清理文書處理軟體匯出時有時會在結尾附加空白頁的 PDF +- 移除不必要的空白頁面以縮小檔案大小 + +## 提示 + +- 先從預設的 80% 敏感度開始,再依情況調整。如果工具漏掉了您認為是空白的頁面,請降低敏感度。如果工具標記了含有您想保留之淡色內容的頁面,請調高敏感度。 +- 此工具會轉譯每一頁來分析內容,因此處理時間會隨頁數增加。處理非常大型的文件時,請稍候片刻。 +- 確認移除前,請先在縮圖預覽中檢查偵測到的空白頁面。依敏感度設定而定,含有淡色頁首、頁尾或浮水印的頁面也可能被標記。 + +## 相關工具 + +- [裁切 PDF](./crop-pdf) +- [PDF 編輯器](./edit-pdf) +- [頁碼](./page-numbers) diff --git a/docs/zh-TW/tools/remove-metadata.md b/docs/zh-TW/tools/remove-metadata.md new file mode 100644 index 00000000..b5e3b52c --- /dev/null +++ b/docs/zh-TW/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: 移除中繼資料 +description: 移除 PDF 檔案中所有隱藏的中繼資料,包括作者、標題、建立日期、製作程式、XMP 資料與文件 ID。 +--- + +# 移除中繼資料 + +每個 PDF 都帶有中繼資料,可能透露是誰建立的、使用了什麼軟體、最後修改時間等資訊。此工具會將其全部移除,包括資訊字典、XMP 中繼資料串流、文件 ID 與應用程式專屬資料,留下一份不帶任何來源痕跡的乾淨文件。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 點擊 **移除中繼資料**。 +3. 下載清理後的檔案。 + +沒有需要設定的選項。此工具的設計就是徹底清除:它會清除所有內容。 + +## 移除的項目 + +- **資訊字典欄位**:標題、作者、主旨、關鍵字、建立者、製作程式、建立日期、修改日期 +- **XMP 中繼資料串流**:儲存在文件目錄中、以 XML 為基礎的中繼資料區塊 +- **文件 ID**:PDF trailer 中的唯一識別碼,可用來在不同系統間追蹤文件 +- **PieceInfo**:由 Illustrator 或 InDesign 等程式加入的應用程式專屬中繼資料 + +## 保留的項目 + +- 所有可見的頁面內容(文字、圖片、圖形) +- 表單欄位與註解 +- 書籤與連結 +- 文件結構本身 + +## 使用情境 + +- 匿名發布文件前移除您的姓名與所屬機構 +- 移除會透露文件準備時間的建立時間戳記 +- 清除可辨識您 PDF 軟體組合的製作程式字串 +- 為要求不含中繼資料之 PDF 的法規送件準備文件 +- 對外分享文件前移除編輯紀錄痕跡 + +## 提示 + +- 移除前,請先使用檢視中繼資料工具,確認 PDF 中究竟包含哪些中繼資料。 +- 如果需要移除中繼資料 _以及_ JavaScript、註解與內嵌檔案,請使用清理 PDF 進行更徹底的清理。 +- 移除中繼資料是永久性的。如果之後可能需要這些資料,請保留原始檔案。 + +## 相關工具 + +- [清理 PDF](./sanitize-pdf):移除中繼資料以及指令碼、附件等內容 +- [保護 PDF](./protect-pdf):以密碼保護清理後的 PDF +- [壓縮 PDF](./compress-pdf):移除中繼資料可略微縮小檔案,壓縮可節省更多空間 diff --git a/docs/zh-TW/tools/remove-restrictions.md b/docs/zh-TW/tools/remove-restrictions.md new file mode 100644 index 00000000..e3e31470 --- /dev/null +++ b/docs/zh-TW/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: 移除限制 +description: 移除 PDF 檔案的密碼保護、列印限制、編輯鎖定與複製限制。 +--- + +# 移除限制 + +PDF 可以帶有兩種密碼:使用者密碼(開啟檔案時需要)與擁有者密碼(控制您能對檔案執行的操作)。此工具會移除這兩種密碼,以及所有相關限制,包括列印、編輯、複製與註解鎖定。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 如果 PDF 設有擁有者密碼,請在 **擁有者密碼** 欄位中輸入。如果 PDF 只有使用限制而沒有密碼,請留空。 +3. 點擊 **移除限制**。 +4. 下載不受限制的 PDF。 + +此工具使用 QPDF 的 `--decrypt` 與 `--remove-restrictions` 旗標,產生乾淨且不受限制的副本。 + +## 移除的項目 + +- 密碼保護(使用者密碼與擁有者密碼) +- 列印限制 +- 編輯限制 +- 文字與圖片複製限制 +- 註解與留言限制 +- PDF 中編碼的所有其他安全限制 + +## 使用情境 + +- 解鎖您擁有、但多年前設定密碼的 PDF +- 移除您有合法存取權之文件的列印限制 +- 在參考資料上啟用複製貼上,方便做筆記 +- 為無法處理受限文件的無障礙工具準備 PDF + +## 提示 + +- 如果設有擁有者密碼,您必須知道該密碼。此工具不會破解或暴力破解密碼。 +- 如果需要保持檔案加密但變更特定權限,請改用變更權限工具。 +- 輸出檔案完全沒有加密,任何收到檔案的人都可以自由開啟。 + +## 相關工具 + +- [解除鎖定 PDF](./unlock-pdf):在知道使用者密碼時解鎖 PDF +- [保護 PDF](./protect-pdf):以新設定重新套用加密 +- [變更權限](./change-permissions):選擇性修改允許的操作 diff --git a/docs/zh-TW/tools/repair-pdf.md b/docs/zh-TW/tools/repair-pdf.md new file mode 100644 index 00000000..265f5413 --- /dev/null +++ b/docs/zh-TW/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: 修復 PDF +description: 使用 QPDF 修復引擎從毀損或損壞的 PDF 檔案中救回資料。支援批次處理。 +--- + +# 修復 PDF + +當 PDF 無法開啟、顯示亂碼內容或在檢視器中觸發錯誤時,此工具會嘗試重建其內部結構。它使用 QPDF 的修復引擎,可從許多類型的毀損中救回資料,例如損壞的交互參照表、截斷的串流、無效的物件參照等。 + +## 運作方式 + +1. 上傳一個或多個損壞的 PDF 檔案。 +2. 點擊 **修復 PDF**。 +3. 單一修復檔案會直接下載。多個檔案則產生 ZIP 壓縮檔。 + +此工具會以 `--decrypt` 旗標將每個檔案交給 QPDF 處理,強制 QPDF 讀取並重寫整個 PDF 結構,並在過程中修正可復原的問題。 + +## 功能特色 + +- 一次批次修復多個 PDF +- 自動偵測可復原與無法復原的檔案 +- 處理多個檔案時,逐一回報每個檔案的成功或失敗 +- 使用 QPDF(WebAssembly),一套久經考驗的 PDF 轉換函式庫 + +## 可修復的問題 + +- 損壞或遺失的交互參照表 +- 下載不完整造成的檔案結尾截斷 +- 無效的物件編號與串流長度 +- 有錯誤的 PDF 產生器造成的輕微結構不一致 +- 解密失敗留下的加密殘留 + +## 無法修復的問題 + +- 嚴重截斷、大部分內容資料已遺失的檔案 +- 以您沒有的密碼加密的 PDF +- 實際上不是 PDF 的檔案(副檔名錯誤) +- PDF 內的圖片毀損(結構會被修正,但不會重新產生像素資料) + +## 使用情境 + +- 救回電子郵件下載失敗的 PDF +- 開啟由舊版或非標準 PDF 產生器製作的檔案 +- 修正在某個檢視器中正常、在另一個檢視器中卻無法使用的 PDF +- 為長期保存準備損壞的封存文件 + +## 提示 + +- 如果修復失敗,請先嘗試在瀏覽器中開啟檔案。瀏覽器有自己的復原邏輯,可能可以轉譯出足夠的內容讓您重新儲存。 +- 對於修復失敗的加密 PDF,請先使用解密 PDF,再修復解密後的輸出。 + +## 相關工具 + +- [壓縮 PDF](./compress-pdf):進一步整理修復後 PDF 的結構 +- [線性化 PDF](./linearize-pdf):針對網頁傳遞最佳化修復後的檔案 +- [平面化 PDF](./flatten-pdf):平面化可能已損壞的表單 diff --git a/docs/zh-TW/tools/reverse-pages.md b/docs/zh-TW/tools/reverse-pages.md new file mode 100644 index 00000000..fdf18508 --- /dev/null +++ b/docs/zh-TW/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: 反轉頁面 +description: 反轉一個或多個 PDF 檔案的頁面順序,讓最後一頁變成第一頁。 +--- + +# 反轉頁面 + +反轉 PDF 的頁面順序,讓最後一頁變成第一頁、倒數第二頁變成第二頁,依此類推。支援一次批次處理多個檔案。 + +## 運作方式 + +1. 上傳一個或多個 PDF 檔案。 +2. 點擊處理按鈕。 +3. 每個檔案都會各自反轉。如果您上傳了多個檔案,輸出會是包含所有反轉後 PDF 的 ZIP 壓縮檔。 +4. 單一檔案會直接下載為反轉後的 PDF。 + +## 功能特色 + +- 批次處理:一次反轉多個 PDF +- 單一 PDF 輸出單一檔案,多個則輸出 ZIP +- 處理前可逐一移除檔案 +- 保留所有頁面內容與格式 + +## 使用情境 + +- 修正以相反順序掃描的文件 +- 準備從後往前閱讀的簡報 PDF +- 為以相反順序進紙的特定列印流程反轉頁面順序 +- 修正頁面不小心以相反順序組合的文件 + +## 提示 + +- 批次中的每個檔案都會各自反轉,檔案之間的相對順序不會改變。 +- 若需要更細緻的頁面重新排序(而不只是整體反轉),請使用 [複製與組織](./organize-pdf)。 + +## 相關工具 + +- [複製與組織](./organize-pdf) +- [旋轉 PDF](./rotate-pdf) +- [PDF 多功能工具](./pdf-multi-tool) diff --git a/docs/zh-TW/tools/rotate-custom.md b/docs/zh-TW/tools/rotate-custom.md new file mode 100644 index 00000000..c35a68c9 --- /dev/null +++ b/docs/zh-TW/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: 自訂角度旋轉 +description: 以任意角度旋轉 PDF 頁面,可逐頁輸入角度並使用批次旋轉控制項。 +--- + +# 自訂角度旋轉 + +以任意角度旋轉 PDF 頁面,不限於 90 度的倍數。每一頁都有自己的角度輸入欄位,也可以使用批次控制項一次將同一角度套用到所有頁面。 + +## 運作方式 + +1. 上傳 PDF 檔案。每一頁都會轉譯出縮圖。 +2. 每一頁都有一個數字輸入欄位,顯示目前的旋轉角度。 +3. 輸入任意角度值(正數或負數)來旋轉特定頁面,或使用每頁的左/右按鈕快速調整 90 度。 +4. 使用頂端的 **批次角度** 輸入欄位,為所有頁面設定一致的旋轉。 +5. 點擊處理按鈕產生旋轉後的 PDF。 + +## 功能特色 + +- 每頁可自由輸入角度(任意整數值) +- 批次角度控制項,為每一頁設定相同旋轉 +- 縮圖即時預覽旋轉效果 +- 每頁的快速旋轉按鈕,以 90 度為單位 +- 延遲載入縮圖,提升大型文件的效能 + +## 使用情境 + +- 將略微傾斜的掃描修正幾度 +- 旋轉頁面以符合非標準的方向需求 +- 對混合內容文件中的個別頁面套用精確旋轉 +- 在初步批次旋轉後微調頁面角度 + +## 提示 + +- 正值為順時針旋轉,負值為逆時針旋轉。 +- 套用批次角度時會覆寫所有逐頁角度。如有需要,請在批次操作後再進行個別調整。 +- 若只需標準的 90/180/270 度旋轉並想要更簡單的介面,請使用 [旋轉 PDF](./rotate-pdf)。 + +## 相關工具 + +- [旋轉 PDF](./rotate-pdf) +- [PDF 多功能工具](./pdf-multi-tool) +- [複製與組織](./organize-pdf) diff --git a/docs/zh-TW/tools/rotate-pdf.md b/docs/zh-TW/tools/rotate-pdf.md new file mode 100644 index 00000000..39da2694 --- /dev/null +++ b/docs/zh-TW/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: 旋轉 PDF +description: 透過視覺化縮圖介面,以 90 度為單位旋轉 PDF 中的個別頁面或所有頁面。 +--- + +# 旋轉 PDF + +將 PDF 中的頁面順時針或逆時針旋轉 90 度。此工具會顯示每一頁的縮圖預覽,讓您個別旋轉頁面,或對整份文件套用批次旋轉。 + +## 運作方式 + +1. 上傳 PDF 檔案。每一頁的縮圖會以網格方式呈現。 +2. 使用每個頁面縮圖下方的左/右旋轉按鈕旋轉該頁。 +3. 使用頂端的批次旋轉控制項一次旋轉所有頁面。 +4. 縮圖預覽會即時更新以顯示旋轉結果。 +5. 點擊處理按鈕儲存旋轉後的 PDF。 + +## 功能特色 + +- 每頁以 90 度為單位旋轉(向左或向右) +- 同時批次旋轉所有頁面 +- 縮圖即時預覽,並有旋轉動畫效果 +- 延遲載入縮圖,讓大型文件也能流暢操作 +- 保留原始頁面內容與品質 + +## 使用情境 + +- 修正側向或上下顛倒的掃描頁面 +- 將橫向頁面旋轉為直向(或反之) +- 修正部分頁面以錯誤角度掃描、方向混雜的文件 +- 為特定的顯示方向準備文件 + +## 提示 + +- 旋轉會累加。點擊順時針按鈕兩次會套用 180 度旋轉。 +- 若需要非 90 度的旋轉(例如以 45 度修正略微傾斜的掃描),請改用 [自訂角度旋轉](./rotate-custom)。 +- 批次旋轉控制項會影響所有頁面,而不只是選取的頁面。此工具沒有選取機制,如需選取功能,請使用 [PDF 多功能工具](./pdf-multi-tool)。 + +## 相關工具 + +- [自訂角度旋轉](./rotate-custom) +- [PDF 多功能工具](./pdf-multi-tool) +- [複製與組織](./organize-pdf) diff --git a/docs/zh-TW/tools/rtf-to-pdf.md b/docs/zh-TW/tools/rtf-to-pdf.md new file mode 100644 index 00000000..ed17d685 --- /dev/null +++ b/docs/zh-TW/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF 轉 PDF +description: 使用以 LibreOffice 驅動的引擎,在瀏覽器中將 RTF(Rich Text Format)檔案轉換為 PDF。 +--- + +# RTF 轉 PDF + +將 RTF(Rich Text Format)文件轉換為 PDF。RTF 是幾乎所有文書處理軟體都支援的跨平台文件格式。此工具使用瀏覽器端的 LibreOffice 引擎轉譯 RTF 檔案並完整保留格式,粗體、斜體、表格與內嵌圖片都會帶到 PDF 中。 + +## 支援格式 + +| 格式 | 副檔名 | MIME 類型 | +| :--- | :----- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## 運作方式 + +1. 點擊上傳區域,或拖放一個或多個 RTF 檔案。 +2. 檢查檔案清單,視需要新增或移除檔案。 +3. 點擊 **轉換為 PDF**。LibreOffice 引擎會在首次使用時初始化,接著處理每個檔案。 +4. 單一檔案會直接下載為 PDF。多個檔案會以 `rtf-converted.zip` 提供。 + +## 選項 + +此工具沒有其他設定。轉換會保留原始 RTF 格式。 + +## 輸出 + +| 輸入數量 | 輸出 | +| :----------- | :---------------------------------------------------- | +| 1 個檔案 | 下載單一 PDF(例如 `letter.pdf`) | +| 2 個以上檔案 | ZIP 壓縮檔(`rtf-converted.zip`),每個檔案各一個 PDF | + +## 使用情境 + +- 將舊式文書處理軟體的 RTF 文件轉換為現代 PDF +- 將 RTF 電子郵件範本轉為 PDF 預覽 +- 處理法律或醫療軟體系統輸出的 RTF +- 將文件管理系統中的 RTF 檔案批次轉換為 PDF 以便封存 + +## 提示 + +- LibreOffice 引擎只會載入一次並加以快取。工作階段中的第一次轉換會多花幾秒,之後就會比較快。 +- 含有內嵌 OLE 物件的 RTF 檔案可能無法完美轉譯所有物件。純文字、圖片與標準格式都能可靠地轉換。 +- 如果您的 RTF 檔案是以 Microsoft Word 建立的,也可以直接使用 [Word 轉 PDF](./word-to-pdf) 工具轉換,它除了 DOC 與 DOCX 之外也接受 RTF。 + +## 相關工具 + +- [Word 轉 PDF](./word-to-pdf) +- [ODT 轉 PDF](./odt-to-pdf) +- [文字轉 PDF](./txt-to-pdf) diff --git a/docs/zh-TW/tools/sanitize-pdf.md b/docs/zh-TW/tools/sanitize-pdf.md new file mode 100644 index 00000000..76199e4a --- /dev/null +++ b/docs/zh-TW/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: 清理 PDF +description: 移除 PDF 中隱藏且可能有危險的內容,包括中繼資料、JavaScript、內嵌檔案、註解與圖層。 +--- + +# 清理 PDF + +PDF 所包含的內容遠比您在螢幕上看到的多。隱藏的中繼資料、內嵌的 JavaScript、檔案附件、表單資料與圖層資訊,都可能洩漏敏感資料或帶來安全風險。清理會將這些全部移除,留下一份可以安心公開分享的乾淨文件。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 從檢查清單中選擇要移除的元素。 +3. 點擊 **清理 PDF**。 +4. 下載清理後的檔案。 + +## 清理選項 + +所有選項預設皆為啟用。取消勾選您想保留的項目。 + +| 選項 | 移除的內容 | +| ------------------- | --------------------------------------------- | +| **平面化表單** | 將互動式表單欄位轉換為靜態內容 | +| **移除中繼資料** | 移除作者、標題、建立日期、軟體資訊與 XMP 資料 | +| **移除註解** | 刪除留言、螢光標示、便利貼與標記 | +| **移除 JavaScript** | 清除開啟時可能執行的內嵌指令碼 | +| **移除內嵌檔案** | 移除 PDF 中內嵌的檔案附件 | +| **移除圖層(OCG)** | 將選擇性內容群組平面化為單一圖層 | +| **移除連結** | 移除超連結與 URL 參照 | +| **移除結構樹** | 移除用於無障礙標記的文件結構 | +| **移除 MarkInfo** | 移除標記內容資訊 | +| **移除字型** | 移除內嵌字型資料(請謹慎使用) | + +## 使用情境 + +- 移除內部中繼資料(作者姓名、軟體版本、編輯紀錄),為公開發布準備 PDF +- 開啟來自不受信任來源的 PDF 前,先移除其中的 JavaScript +- 將 PDF 寄給不應看到內嵌留言或表單欄位名稱的客戶前先加以清理 +- 分享最終版本前移除建築圖面中的隱藏圖層 +- 遵循隱私法規中的資料最小化要求 + +## 提示 + +- 除非確定 PDF 仍能正確轉譯,否則請勿勾選「移除字型」。移除字型可能會使文字在部分檢視器中無法顯示。 +- 如果只需要移除中繼資料,專用的移除中繼資料工具更快速也更專注。 +- 清理無法復原。請保留原始檔案。 + +## 相關工具 + +- [移除中繼資料](./remove-metadata):只移除中繼資料,不影響其他內容 +- [平面化 PDF](./flatten-pdf):專門平面化表單與註解 +- [保護 PDF](./protect-pdf):清理後加上密碼保護 +- [光柵化 PDF](./rasterize-pdf):最徹底的做法,轉換為圖片以消除所有隱藏內容 diff --git a/docs/zh-TW/tools/scanner-effect.md b/docs/zh-TW/tools/scanner-effect.md new file mode 100644 index 00000000..c8323959 --- /dev/null +++ b/docs/zh-TW/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: 掃描效果 +description: 透過可調整的雜訊、旋轉、模糊與紙張老化效果,讓您的 PDF 看起來像掃描文件。 +--- + +# 掃描效果 + +將乾淨的數位 PDF 轉換成看起來像是從平台式掃描器掃出來的文件。此工具會套用可設定的雜訊、輕微旋轉、模糊、亮度變化與選用的泛黃效果,模擬實體掃描的瑕疵。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 編輯器會開啟,顯示第一頁的即時預覽與設定面板。 +3. 使用滑桿與切換開關調整掃描效果參數。 +4. 變更設定時,預覽會即時更新。 +5. 點擊 **套用** 處理所有頁面並下載結果。 + +## 選項 + +- **色彩空間(灰階切換)**:將輸出轉為灰階,呈現經典的黑白掃描外觀。 +- **邊框**:在頁面邊緣加上細微的深色邊框,模擬掃描器的邊框痕跡。 +- **旋轉**:套用輕微旋轉(-5 到 +5 度),模擬進紙歪斜。 +- **旋轉變異**:為旋轉角度加入隨機變化,讓每一頁的傾斜程度略有不同。 +- **亮度**:調高或調低整體亮度。 +- **對比**:調整對比,模擬碳粉品質的差異。 +- **模糊**:套用高斯模糊柔化文字邊緣,就像低品質的掃描。 +- **雜訊**:加入隨機像素雜訊,模擬掃描器感測器的顆粒感。數值越高,顆粒越明顯。 +- **泛黃**:加入溫暖的黃色色調,模擬老舊或再生紙。 +- **解析度**:設定輸出 DPI。數值越低,越有像素感、越像掃描。 +- **重設**:將所有設定恢復為預設值。 + +## 功能特色 + +- 調整每個參數時都會即時更新預覽 +- 每頁隨機旋轉變異,呈現逼真的變化 +- 十個可獨立調整的參數 +- 灰階模式,呈現道地的黑白掃描輸出 +- 解析度控制,從低 DPI 的傳真品質到高 DPI 的封存品質 + +## 使用情境 + +- 讓數位建立的文件看起來像是經過掃描與列印 +- 模擬實體文件老化,用於重現歷史文件 +- 以劣化的掃描品質測試 OCR 軟體 +- 製作與現有掃描封存資料視覺風格一致的文件 + +## 提示 + +- 先從細微的數值開始。雜訊等級 10-20、0.5 度的輕微旋轉,加上最小的模糊,就能產生逼真的掃描外觀。 +- 結合灰階模式與輕微泛黃,可營造「影印本的影印本」效果。 +- 較低的解析度設定(100-150 DPI)最能呈現逼真的傳真機外觀。 + +## 相關工具 + +- [反轉顏色](./invert-colors) +- [調整顏色](./adjust-colors) +- [背景顏色](./background-color) diff --git a/docs/zh-TW/tools/sign-pdf.md b/docs/zh-TW/tools/sign-pdf.md new file mode 100644 index 00000000..8d33d259 --- /dev/null +++ b/docs/zh-TW/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: 簽署 PDF +description: 手繪、輸入或上傳簽名,並透過整合式檢視器將其放置在 PDF 頁面上。 +--- + +# 簽署 PDF + +在任何 PDF 文件上加上您的簽名。此工具內嵌完整的 PDF 檢視器與內建簽名工具,您可以徒手繪製簽名、以簽名字型輸入姓名,或上傳簽名圖片。在任何頁面上放置簽名並調整大小,然後儲存已簽署的文件。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 文件會在附有註解工具的整合式 PDF 檢視器中開啟。 +3. 使用檢視器的簽名工具,透過繪製、輸入或上傳圖片來建立簽名。 +4. 在要放置簽名的頁面上點擊,並調整其大小與位置。 +5. 可選擇勾選 **平面化 PDF**,將簽名永久嵌入文件。 +6. 點擊 **儲存並下載已簽署的 PDF** 取得簽署後的檔案。 + +## 選項 + +- **平面化 PDF**:勾選後,簽名會永久嵌入頁面內容,避免他人移動或刪除簽名。未勾選時,簽名會保留為註解,可在相容的檢視器中編輯。 + +## 功能特色 + +- 三種建立簽名的方式:徒手繪製、輸入文字或上傳圖片 +- 整合式 PDF 檢視器,精準放置 +- 在任何頁面上拖曳以定位並調整簽名大小 +- 可選擇平面化以永久嵌入簽名 +- 支援在同一份文件上放置多個簽名 + +## 使用情境 + +- 簽署合約、協議或核准表單後再寄回 +- 在稅務文件、保險理賠或政府表單上加上簽名 +- 在多頁協議的各頁上簽上姓名縮寫 +- 簽署以 PDF 附件寄來的保密協議或人資文件 + +## 提示 + +- 如果您要將簽署後的 PDF 寄給不應能移除或移動您簽名的人,請啟用平面化。 +- 若需要具備憑證驗證、具法律效力的數位簽章,BentoPDF 另外提供獨立的數位簽章工具。 +- 上傳背景透明的 PNG 簽名圖片,效果最乾淨。 + +## 相關工具 + +- [PDF 編輯器](./edit-pdf) +- [新增印章](./add-stamps) +- [PDF 表單填寫器](./form-filler) diff --git a/docs/zh-TW/tools/split-pdf.md b/docs/zh-TW/tools/split-pdf.md new file mode 100644 index 00000000..9a0fdad6 --- /dev/null +++ b/docs/zh-TW/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: 分割 PDF +description: 依頁面範圍、視覺化選取、書籤、奇偶頁或固定間隔,將 PDF 分割成較小的檔案。 +--- + +# 分割 PDF + +使用六種分割模式之一,將 PDF 拆分成較小的文件。從簡單的頁面範圍到依書籤分割,此工具能應付各種分割文件的情境。 + +## 運作方式 + +1. 上傳單一 PDF 檔案。 +2. 從下拉選單中選擇分割模式。 +3. 設定該模式專屬的選項(頁面範圍、選取項目等)。 +4. 點擊處理按鈕。 +5. 依模式與設定而定,結果會下載為單一 PDF 或 ZIP 壓縮檔。 + +## 分割模式 + +| 模式 | 說明 | +| -------------- | ---------------------------------------------------------------------------------------------- | +| **範圍** | 輸入頁面範圍,例如 `1-3, 5, 8-10`。多個範圍會在 ZIP 中產生個別的 PDF,單一範圍則產生一個 PDF。 | +| **視覺化選取** | 瀏覽頁面縮圖並點擊選取想要的頁面。選取的頁面會被擷取成新的 PDF。 | +| **偶數/奇數** | 只擷取偶數頁或奇數頁。 | +| **所有頁面** | 將每一頁分割成獨立的 PDF 檔案,並以 ZIP 下載。 | +| **書籤** | 在書籤邊界處分割。選擇書籤層級以控制分割位置。 | +| **每 N 頁** | 分割成每份 N 頁的區塊(例如每 5 頁)。最後一個區塊的頁數可能較少。 | + +## 功能特色 + +- 六種不同的分割模式,幾乎涵蓋所有使用情境 +- 視覺化頁面選取器,縮圖延遲載入 +- 可辨識書籤的分割功能,並可依層級篩選 +- 範圍與視覺化模式提供 ZIP 輸出選項 +- 支援混合語法的頁面範圍(`1-3, 5, 8-10`) +- 每 N 頁分割產生不均等區塊時會顯示警告 + +## 使用情境 + +- 從大型文件中擷取特定章節或段落 +- 為雙面列印流程分開奇數頁與偶數頁 +- 在書籤邊界將書籍 PDF 拆分成各章節檔案 +- 從合約中單獨取出特定頁面(例如簽名頁) +- 將彙整的報告拆分成各段落檔案以便發送 + +## 提示 + +- 以逗號分隔的多個頁面範圍(例如 `1-5, 10-15, 20-25`)會產生個別的 PDF,每個範圍一個,並打包成 ZIP。 +- 書籤分割模式需要 PDF 實際包含書籤。如果找不到任何書籤,您會收到錯誤訊息。 +- 範圍與視覺化模式中的「以 ZIP 下載」核取方塊,可讓您取得每頁各自的 PDF,而不是合併的檔案。 + +## 相關工具 + +- [合併 PDF](./merge-pdf) +- [擷取頁面](./extract-pages) +- [刪除頁面](./delete-pages) +- [PDF 多功能工具](./pdf-multi-tool) diff --git a/docs/zh-TW/tools/svg-to-pdf.md b/docs/zh-TW/tools/svg-to-pdf.md new file mode 100644 index 00000000..f69230b7 --- /dev/null +++ b/docs/zh-TW/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG 轉 PDF +description: 完全在瀏覽器中將 SVG 向量圖形轉換為 PDF,並可控制品質。 +--- + +# SVG 轉 PDF + +將 SVG(Scalable Vector Graphics)檔案轉換為 PDF。此工具會透過瀏覽器的轉譯引擎將每個 SVG 光柵化,再以原生解析度嵌入結果。適合將向量圖示、圖表與插圖轉換為可攜式文件。 + +## 支援格式 + +| 格式 | 副檔名 | +| :--- | :----- | +| SVG | `.svg` | + +## 運作方式 + +1. 點擊上傳區域,或拖放一個或多個 SVG 檔案。 +2. 檢查並管理檔案清單。 +3. 選擇 **PDF 品質** 等級。 +4. 點擊 **轉換為 PDF**。結果會下載為 `from_svgs.pdf`。 + +每個 SVG 都會以文字讀取,依其固有寬度與高度轉譯到畫布上(若未指定尺寸則預設為 800x600),並匯出為 PNG。接著使用 pdf-lib 將該 PNG 嵌入 PDF。透明區域會以白色背景填滿。 + +## 選項 + +**PDF 品質** 控制光柵化後的壓縮程度: + +- **高品質**:最接近原始轉譯效果。 +- **中等品質**(預設):良好的平衡。 +- **低品質**:檔案最小,會損失部分細節。 + +## 使用情境 + +- 將 SVG 格式的建築或工程圖表轉換為可供印刷的 PDF +- 將圖示集打包成設計系統的參考 PDF +- 將資料視覺化圖表(D3.js、圖表函式庫匯出)轉為可用於報告的 PDF +- 製作 SVG 資訊圖表的可列印版本 + +## 提示 + +- 沒有明確 `width` 與 `height` 屬性的 SVG 檔案會以 800x600 像素轉譯。為獲得最佳結果,請在轉換前於 SVG 原始碼中設定尺寸。 +- 含有外部字型參照或連結圖片的複雜 SVG 可能無法完美轉譯。請將所有資源內嵌到 SVG 中,以取得可靠的輸出。 +- 由於 SVG 會被光柵化,PDF 中包含的是點陣圖而非向量路徑。若需要真正的向量 PDF 輸出,則需要專用的向量工具。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) +- [BMP 轉 PDF](./bmp-to-pdf) diff --git a/docs/zh-TW/tools/table-of-contents.md b/docs/zh-TW/tools/table-of-contents.md new file mode 100644 index 00000000..44544001 --- /dev/null +++ b/docs/zh-TW/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: 目錄 +description: 根據 PDF 現有的書籤產生格式化的目錄頁面。 +--- + +# 目錄 + +此工具會讀取 PDF 中的書籤(大綱),並產生格式化的目錄頁面,插入到文件最前面。如果您的 PDF 已有書籤但缺少可見的目錄頁,此工具會自動建立一頁。 + +## 運作方式 + +1. 上傳含有書籤的 PDF。 +2. 自訂目錄標題、字型大小與字型系列。 +3. 可選擇勾選 **為目錄頁新增書籤**,將目錄本身加入書籤樹中。 +4. 點擊 **產生目錄** 處理檔案。 +5. 更新後的 PDF 會自動下載,目錄頁已插入在開頭。 + +## 選項 + +- **目錄標題**:顯示在產生頁面頂端的標題。預設為「目錄」。 +- **字型大小**:可選擇 10pt 到 72pt。預設為 12pt。 +- **字型系列**:可選擇 Times Roman、Helvetica 或 Courier 的各種樣式(標準、粗體、斜體、粗斜體)。預設為 Helvetica。 +- **為目錄頁新增書籤**:勾選後,會在 PDF 的大綱樹中加入指向目錄頁本身的書籤項目。 + +## 功能特色 + +- 讀取 PDF 中完整的書籤階層 +- 產生格式整齊、附有頁碼參照的目錄頁 +- 支援以縮排呈現的巢狀書籤層級 +- 可選擇 12 種內建 PDF 字型 +- 可選擇為目錄頁加入指向自身的書籤 + +## 使用情境 + +- 為只有數位書籤的電子書或報告加上可列印的目錄 +- 合併多個 PDF 後,為合併的文件建立目錄 +- 為冗長的技術手冊產生參考頁面 +- 為需要可見目錄的印刷文件做準備 + +## 提示 + +- 如果您的 PDF 沒有書籤,請先使用 [編輯書籤](./bookmark) 工具建立書籤,再回到這裡產生目錄。 +- 對於大型文件,較大的字型大小(例如 14pt 或 16pt)可提升可讀性。 + +## 相關工具 + +- [編輯書籤](./bookmark) +- [頁碼](./page-numbers) +- [頁首與頁尾](./header-footer) diff --git a/docs/zh-TW/tools/text-color.md b/docs/zh-TW/tools/text-color.md new file mode 100644 index 00000000..bf874f03 --- /dev/null +++ b/docs/zh-TW/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: 更改文字顏色 +description: 將 PDF 中所有文字的顏色變更為您選擇的任何顏色。 +--- + +# 更改文字顏色 + +替換整份 PDF 中的文字顏色。此工具會辨識每頁的文字區域,並將其重新上色為您選擇的顏色,同時保留文件版面配置與非文字內容。 + +## 運作方式 + +1. 上傳您的 PDF 檔案。 +2. 使用顏色選擇器挑選新的文字顏色。預設為藍色(#0000FF)。 +3. 點擊 **更改文字顏色** 進行處理。 +4. 重新上色的 PDF 會自動下載。進度指示器會顯示正在處理的頁面。 + +## 選項 + +- **新文字顏色**:用於選擇文件中所有文字替換顏色的顏色選擇器。 + +## 功能特色 + +- 為文件中的每一頁文字重新上色 +- 逐頁處理並顯示進度 +- 顏色選擇器完整支援十六進位色碼 +- 保留頁面版面配置與非文字元素 + +## 使用情境 + +- 將黑色文字改為深藍色,讓文件外觀更柔和、更現代 +- 發送文件前重新為文字上色,以符合品牌規範 +- 將文字轉換為特定顏色以符合無障礙要求 +- 讓文字在新套用的背景顏色上清楚可見 + +## 提示 + +- 此工具會以 2 倍比例轉譯頁面以確保品質,再重建 PDF。輸出內容以圖片為基礎,因此文字將無法再被選取或搜尋。 +- 若文件需要保留可選取的文字,建議改用 [PDF 編輯器](./edit-pdf) 直接編輯 PDF。 +- 由於每一頁都會個別轉譯,處理時間會隨頁數增加。 + +## 相關工具 + +- [背景顏色](./background-color) +- [反轉顏色](./invert-colors) +- [調整顏色](./adjust-colors) diff --git a/docs/zh-TW/tools/tiff-to-pdf.md b/docs/zh-TW/tools/tiff-to-pdf.md new file mode 100644 index 00000000..6e5970eb --- /dev/null +++ b/docs/zh-TW/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF 轉 PDF +description: 在瀏覽器中將單頁與多頁 TIFF 圖片轉換為 PDF 格式,完整支援所有頁面。 +--- + +# TIFF 轉 PDF + +將 TIFF 檔案轉換為 PDF,包括多頁 TIFF。TIFF 檔案中的每一頁(或「IFD」)都會成為輸出 PDF 中的獨立頁面。這對於常以多頁 TIFF 儲存的掃描文件、傳真與醫學影像特別實用。 + +## 支援格式 + +| 格式 | 副檔名 | +| :--- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## 運作方式 + +1. 點擊上傳區域,或將 TIFF 檔案拖放到該處。 +2. 檢查檔案清單並視需要管理。 +3. 點擊 **轉換為 PDF**。結果會下載為 `from_tiff.pdf`。 + +此工具使用 JavaScript TIFF 解碼器解碼每個 TIFF 檔案,擷取每一頁的原始 RGBA 像素資料。每一頁都會轉譯到畫布上、匯出為 PNG,再嵌入 PDF。頁面尺寸與原始 TIFF 頁面一致。 + +## 選項 + +此工具不提供其他品質設定。圖片會以原生解析度嵌入。 + +## 使用情境 + +- 將多頁傳真文件(TIFF-F)轉換為更具可攜性的 PDF 格式 +- 將以 TIFF 儲存的掃描文件封存轉為可搜尋的 PDF(之後再搭配 OCR 工具) +- 處理使用 TIFF 的醫學影像檔案(病理切片、放射影像匯出) +- 將 GIS 或衛星影像 TIFF 檔案轉換為可分享的文件 + +## 提示 + +- 完整支援多頁 TIFF。10 頁的 TIFF 會產生 10 頁的 PDF,不需要先分割 TIFF。 +- 非常大的 TIFF 檔案(數百 MB)可能需要較長的處理時間,因為整個檔案都必須在瀏覽器記憶體中解碼。 +- 如果需要對產生的 PDF 進行 OCR,請在轉換後使用 [PDF 文字辨識 (OCR)](./ocr-pdf) 工具處理。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [BMP 轉 PDF](./bmp-to-pdf) +- [JPG 轉 PDF](./jpg-to-pdf) diff --git a/docs/zh-TW/tools/txt-to-pdf.md b/docs/zh-TW/tools/txt-to-pdf.md new file mode 100644 index 00000000..9092d7d4 --- /dev/null +++ b/docs/zh-TW/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: 文字轉 PDF +description: 將純文字檔案或輸入的文字轉換為 PDF,可自訂字型、顏色與頁面尺寸。 +--- + +# 文字轉 PDF + +將純文字轉換為格式化的 PDF。您可以上傳 `.txt` 檔案,或直接在內建的文字編輯器中輸入。此工具支援多種字型、自訂文字顏色,以及廣泛的頁面尺寸,從 A0 到 A10,還有 US Letter、Legal 與 Tabloid。 + +## 支援格式 + +| 輸入 | 副檔名 | +| :----------- | :------------------- | +| 純文字檔案 | `.txt` | +| 直接輸入文字 | 在編輯器中輸入或貼上 | + +## 運作方式 + +1. 使用頂端的切換開關選擇輸入模式:**上傳檔案** 或 **輸入文字**。 +2. 如果要上傳,請拖放或點擊以選擇一個或多個 `.txt` 檔案。如果要輸入,請直接在文字區域中輸入文字。 +3. 設定格式選項:字型系列、字型大小、文字顏色與頁面尺寸。 +4. 點擊 **建立 PDF**。輸出會下載為 `text_to_pdf.pdf`。 + +上傳多個檔案時,其內容會串接在一起,中間以空白行分隔。 + +## 選項 + +| 選項 | 值 | 預設 | +| :----------- | :------------------------------------------------------------------- | :-------------- | +| **字型系列** | Helvetica(無襯線)、Tiro(襯線)、Courier(等寬)、Times(襯線) | Helvetica | +| **字型大小** | 6 到 72 pt | 12 | +| **文字顏色** | 透過顏色選擇器選擇任何顏色 | 黑色(#000000) | +| **頁面尺寸** | ISO A0–A10、B0–B10、C0–C10、US Letter、Legal、Tabloid、Ledger、11x17 | A4 | + +系統會自動偵測 RTL 語言(阿拉伯文、希伯來文、波斯文、烏爾都文)。偵測到 RTL 文字時,文字方向與對齊方式會隨之切換。 + +## 使用情境 + +- 將程式碼片段或記錄檔轉換為使用 Courier 字型的可列印 PDF +- 從當場輸入的會議筆記快速建立 PDF +- 以特定字型與頁面尺寸排版純文字稿件以便投稿 +- 製作 README 或變更記錄的 PDF 版本,供離線發送 + +## 提示 + +- 想快速轉換剪貼簿內容而不必先存成檔案時,請使用 **輸入文字** 模式。 +- Courier(等寬)是程式碼、記錄檔或任何需要欄位對齊之內容的最佳字型選擇。 +- 頁面邊界在所有方向都固定為 72 點(1 英吋)。 + +## 相關工具 + +- [Markdown 轉 PDF](./markdown-to-pdf) +- [CSV 轉 PDF](./csv-to-pdf) +- [Word 轉 PDF](./word-to-pdf) diff --git a/docs/zh-TW/tools/unlock-pdf.md b/docs/zh-TW/tools/unlock-pdf.md new file mode 100644 index 00000000..d3bc007a --- /dev/null +++ b/docs/zh-TW/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: 解除鎖定 PDF +description: 移除加密 PDF 的密碼保護。支援以單一密碼批次解密多個檔案。 +--- + +# 解除鎖定 PDF + +如果您知道加密 PDF 的密碼,此工具會完全移除加密,產生一份任何人都能直接開啟、無需憑證的解鎖副本。當多個 PDF 使用相同密碼時,也支援批次解密。 + +## 運作方式 + +1. 上傳一個或多個加密的 PDF 檔案。 +2. 輸入用來保護檔案的**密碼**。 +3. 點選**解密 PDF**。 +4. 單一檔案會直接下載。多個檔案會產生包含所有已解鎖 PDF 的 ZIP 壓縮檔。 + +## 功能 + +- 單一檔案與批次解密 +- 同時支援使用者密碼與擁有者密碼 +- 產生完全未加密、沒有殘留限制的輸出 +- 針對錯誤密碼或損毀檔案提供清楚的錯誤訊息 +- 批次模式下逐一追蹤每個檔案的成功或失敗狀態 + +## 與移除限制的差異 + +**解密 PDF** 需要密碼,並會移除所有加密。**移除限制**針對的是使用限制(列印、複製、編輯),若只設定了擁有者密碼,可能不需要密碼。當 PDF 沒有密碼就完全無法開啟時,請使用解密。 + +## 使用情境 + +- 在不再需要密碼時,永久解鎖您先前加密的 PDF +- 移除一批封存文件的加密,方便長期存取 +- 為不支援加密檔案的文件管理系統準備受密碼保護的 PDF +- 在與其他文件合併前解鎖 PDF(許多合併工具無法處理加密的輸入檔) + +## 提示 + +- 密碼欄位會套用到所有上傳的檔案。如果您的 PDF 使用不同密碼,請分批處理。 +- 如果出現「密碼錯誤」,請檢查是否有多餘的尾端空格或是否開啟了大寫鎖定。 +- 解密後的輸出完全沒有安全保護。如需設定新密碼,請使用加密 PDF 重新加密。 + +## 相關工具 + +- [保護 PDF](./protect-pdf):以新密碼重新加密 +- [移除限制](./remove-restrictions):不完整解密即可移除使用限制 +- [變更權限](./change-permissions):修改加密 PDF 的特定權限 diff --git a/docs/zh-TW/tools/validate-signature-pdf.md b/docs/zh-TW/tools/validate-signature-pdf.md new file mode 100644 index 00000000..db599b33 --- /dev/null +++ b/docs/zh-TW/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: 驗證簽章 +description: 驗證 PDF 檔案中的數位簽章。檢查憑證有效性、簽署者身分、文件完整性與信任鏈狀態。 +--- + +# 驗證簽章 + +上傳已簽署的 PDF,此工具會擷取每個數位簽章、識別簽署者、檢查憑證有效性,並回報文件在簽署後是否遭到修改。您也可以提供受信任的憑證來驗證簽章鏈。 + +## 運作方式 + +1. 上傳已簽署的 PDF 檔案。驗證會自動開始。 +2. 工具會顯示摘要:找到的簽章數量,以及其中有幾個有效。 +3. 每個簽章都有一張詳細資訊卡,顯示簽署者名稱、簽發者、日期與狀態。 +4. 可選擇上傳**受信任的憑證**(.pem、.crt、.cer、.der),以特定信任錨點驗證簽章。重新驗證會自動執行。 + +## 檢查項目 + +### 簽章解析 + +此工具會從 PDF 擷取 PKCS#7 簽章物件、解碼 ASN.1 結構,並取出簽署者的 X.509 憑證以及簽章中內嵌的任何憑證鏈。 + +### 憑證有效性 + +- **到期**:憑證目前是否在有效日期範圍內? +- **自簽偵測**:憑證是否由其自身簽發? +- **信任鏈**:提供受信任憑證時,簽署者的憑證鏈是否能追溯到該憑證? + +### 密碼學驗證 + +- 此工具會重建簽章 `/ByteRange` 涵蓋的位元組,以簽署者宣告的演算法計算雜湊,並將結果與簽章內的 `messageDigest` 屬性比對。 +- 接著將已簽署屬性重新序列化為 DER SET,並以簽署者憑證的公鑰驗證簽章。 +- **只有在上述所有檢查都通過時,簽章才會被回報為有效。** 如果 PDF 位元組在簽署後遭到修改,或內嵌簽章與簽署者的金鑰不符,狀態會顯示「無效:密碼學驗證失敗」並附上具體原因。 + +#### 支援的簽章演算法 + +| 演算法 | 驗證方式 | +| ----------------------- | ------------------------------------------------------------------------------------ | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`,並以 Web Crypto 作為備援 | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | 將 DER 簽章轉換為 IEEE P1363 格式後,使用 Web Crypto `verify({name: 'ECDSA', hash})` | + +如果簽章使用此清單以外的演算法(例如 Ed25519、SM2,或使用罕見摘要 OID 的 RSA),資訊卡會以黃色顯示 **「未驗證:不支援的簽章演算法」**,並附上具體的 OID 或原因。這是刻意設計的三種狀態區分: + +- **有效**:簽章已透過簽署者的公鑰完成密碼學驗證。 +- **無效**:驗證已執行且結果為否定(位元組已變更、金鑰不符)。 +- **未驗證**:此工具無法針對該演算法執行驗證。憑證中繼資料仍會顯示,但您應將該簽章視為「未知」,並使用 Adobe Acrobat 或 `openssl cms -verify` 進行驗證。 + +### 不安全的摘要演算法 + +- 使用 **MD5 或 SHA-1** 的簽章會被判定為無效,並標示為「不安全的摘要演算法」狀態。這兩種演算法都已有公開的碰撞攻擊,因此對 SHA-1 或 MD5 雜湊所做的簽章無法保證完整性。 +- SHA-224、SHA-256、SHA-384 與 SHA-512 皆可接受。 + +### 文件涵蓋範圍 + +- **完整涵蓋**:簽章涵蓋整個 PDF 檔案,表示簽署後沒有新增或變更任何位元組。 +- **部分涵蓋**:簽章只涵蓋檔案的一部分。這可能表示簽署後有過修改(不一定是惡意的,增量儲存也會產生部分涵蓋)。 + +## 簽章詳細資訊 + +每張簽章資訊卡會顯示: + +- **簽署者**:簽署者憑證中的一般名稱、組織與電子郵件 +- **簽發者**:簽發簽署者憑證的憑證授權單位 +- **簽署時間**:簽章中內嵌的時間戳記 +- **有效期起 / 有效期至**:憑證的有效期間 +- **原因**:簽署文件的原因(若有提供) +- **地點**:簽署的地點(若有提供) +- **涵蓋狀態**:完整或部分 +- **信任標章**:受信任或不在信任鏈中(僅在提供自訂憑證時顯示) + +### 技術細節 + +展開技術細節區塊可查看: + +- 簽署者憑證的序號 +- 摘要演算法(SHA-256、SHA-512 等) +- 簽章演算法(RSA with SHA-256、ECDSA with SHA-256 等) +- 無效簽章的錯誤訊息 + +## 使用情境 + +- 在會簽前驗證已數位簽署的合約 +- 稽核已簽署的文件,確認未遭竄改 +- 檢查憑證在文件簽署後是否已過期 +- 以您組織的根憑證驗證簽章 +- 檢視政府或法律文件的簽署詳細資訊 + +## 提示 + +- 自簽憑證並不代表簽章無效,而是表示無法透過受信任的第三方驗證簽署者身分。這在內部文件中很常見。 +- 部分涵蓋不一定代表遭到竄改。許多 PDF 工作流程會加入增量更新(例如第二個簽章),因而產生部分涵蓋。 +- 將您組織的根憑證或中繼憑證上傳為受信任的憑證,即可進行信任鏈驗證。 + +## 相關工具 + +- [數位簽章](./digital-sign-pdf):使用您自己的憑證簽署 PDF +- [平面化 PDF](./flatten-pdf):在簽署前將 PDF 平面化,以防止簽署後的修改 +- [移除中繼資料](./remove-metadata):在套用簽章前清理 PDF diff --git a/docs/zh-TW/tools/view-metadata.md b/docs/zh-TW/tools/view-metadata.md new file mode 100644 index 00000000..aeb4ab0f --- /dev/null +++ b/docs/zh-TW/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: 檢視中繼資料 +description: 檢查 PDF 的所有中繼資料屬性,包括文件資訊、XMP 資料與結構細節。 +--- + +# 檢視中繼資料 + +檢查 PDF 檔案中內嵌的隱藏屬性。此工具會以易讀的格式顯示文件資訊(標題、作者、日期)、XMP 中繼資料、頁面尺寸及其他結構資料。 + +## 運作方式 + +1. 上傳 PDF 檔案。 +2. 工具會立即解析檔案,並將所有可用的中繼資料分區顯示。 +3. 檢閱文件資訊字典、XMP 中繼資料樹與結構屬性。 +4. 不需要任何處理步驟,檔案載入後就會顯示中繼資料。 + +## 功能 + +- 顯示標準文件資訊欄位:標題、作者、主旨、關鍵字、建立者、製作程式 +- 以易讀格式顯示建立與修改日期 +- 解析並呈現完整的 XMP 中繼資料樹,包含巢狀命名空間 +- 將 PDF 日期格式(`D:20240101120000Z`)轉換為易讀的日期 +- 以可摺疊的區塊整理,方便瀏覽 + +## 中繼資料區塊 + +| 區塊 | 內容 | +| ---------------- | ---------------------------------------------------------------- | +| **文件資訊** | 標題、作者、主旨、關鍵字、建立者、製作程式、建立日期、修改日期 | +| **XMP 中繼資料** | 完整的 XML 中繼資料樹,包含 Dublin Core、XAP、PDF 與自訂命名空間 | +| **文件屬性** | 頁數、PDF 版本、檔案大小、加密狀態 | + +## 使用情境 + +- 查看 PDF 的作者以及最後修改時間 +- 在發布文件前確認中繼資料已正確設定 +- 檢查內嵌了哪些個人資訊,以稽核 PDF 的隱私 +- 調查建立或修改 PDF 所使用的軟體(透過「製作程式」欄位) +- 檢閱 XMP 中繼資料是否符合數位資產管理規範 + +## 提示 + +- 以 `D:` 開頭的 PDF 日期字串會自動轉換為您當地時區的格式。 +- 如果中繼資料欄位是空的,表示 PDF 建立者並未設定它們。並非所有 PDF 都包含豐富的中繼資料。 +- 檢視後若要修改中繼資料,請使用[編輯中繼資料](./edit-metadata)。若要完全清除,請使用移除中繼資料。 + +## 相關工具 + +- [編輯中繼資料](./edit-metadata) +- [PDF 圖層(OCG)](./pdf-layers) +- [比較 PDF](./compare-pdfs) diff --git a/docs/zh-TW/tools/vsd-to-pdf.md b/docs/zh-TW/tools/vsd-to-pdf.md new file mode 100644 index 00000000..0d7c6330 --- /dev/null +++ b/docs/zh-TW/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD 轉 PDF +description: 在瀏覽器中將 Microsoft Visio(VSD/VSDX)圖表轉換為 PDF。免費、私密,無需安裝 Visio。 +--- + +# VSD 轉 PDF + +無需安裝 Visio,即可將 Microsoft Visio 圖表轉換為 PDF。VSD 與 VSDX 檔案包含流程圖、組織圖、網路圖與平面圖,大多數人都無法開啟。此工具會將它們轉換為可在任何裝置上檢視的清晰 PDF。 + +## 支援的格式 + +| 格式 | 副檔名 | 備註 | +| :----------- | :------ | :--------------------------------------- | +| Visio 二進位 | `.vsd` | 舊版 Visio 格式(Visio 2003 及更早版本) | +| Visio XML | `.vsdx` | 新版 Visio 格式(Visio 2013 以上) | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 VSD 或 VSDX 檔案。兩種格式可混合在同一批次中。 +2. 檢閱檔案清單。使用垃圾桶圖示移除不需要的項目,或使用**新增更多檔案**加入更多圖表。 +3. 點選**轉換為 PDF**。以 LibreOffice 為基礎的引擎會在瀏覽器中載入,並將每個圖表轉換為 PDF,保留圖形、連接線、標籤與頁面版面配置。 +4. 單一圖表會直接下載為 PDF。多個檔案會產生名為 `vsd-to-pdf.zip` 的 ZIP 壓縮檔。 + +## 選項 + +不需要任何設定。轉換器會沿用 Visio 文件原本的頁面大小與方向。 + +## 使用情境 + +- 在沒有 Visio 授權的情況下檢閱同事的 Visio 圖表 +- 將網路或架構圖以 PDF 形式納入專案文件 +- 列印組織圖或流程圖作為會議講義 +- 以適合長期保存的格式封存舊版 Visio 的 VSD 檔案 + +## 提示 + +- 多頁的 Visio 文件會產生多頁 PDF,每個 Visio 頁面對應一個 PDF 頁面。 +- VSDX 檔案(新版 XML 格式)的轉換精確度通常高於舊版 VSD 二進位檔案。 +- LibreOffice 引擎在每個工作階段只會載入一次。第一次轉換需稍候片刻,之後的檔案會更快完成。 + +## 相關工具 + +- [ODG 轉 PDF](./odg-to-pdf) +- [PUB 轉 PDF](./pub-to-pdf) +- [PSD 轉 PDF](./psd-to-pdf) diff --git a/docs/zh-TW/tools/webp-to-pdf.md b/docs/zh-TW/tools/webp-to-pdf.md new file mode 100644 index 00000000..13e229ba --- /dev/null +++ b/docs/zh-TW/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP 轉 PDF +description: 直接在瀏覽器中將 WebP 圖片轉換為 PDF 格式,並可調整壓縮品質。 +--- + +# WebP 轉 PDF + +將 Google 的 WebP 圖片格式轉換為 PDF。當您從網路下載的圖片是 WebP 格式,而需要更普遍通用的格式來列印或分享時,這個工具特別實用。 + +## 支援的格式 + +| 格式 | 副檔名 | +| :--- | :------ | +| WebP | `.webp` | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 WebP 檔案。 +2. 檢閱檔案清單,並移除不需要的檔案。 +3. 選擇 **PDF 品質**等級。 +4. 點選**轉換為 PDF**。輸出檔會下載為 `from_webps.pdf`。 + +在內部,每張 WebP 圖片會先透過瀏覽器的 canvas API 解碼,再使用 pdf-lib 嵌入 PDF。因此只要瀏覽器支援 WebP 解碼(所有現代瀏覽器都支援),轉換就能運作。 + +## 選項 + +**PDF 品質**控制嵌入圖片時的壓縮程度: + +- **高品質**:保留最多細節。 +- **中等品質**(預設):輸出較為平衡。 +- **低品質**:檔案最小。 + +## 使用情境 + +- 將從網路下載並儲存為 WebP 的圖片轉換為可列印的 PDF +- 將 Chrome 或 Edge 的 WebP 螢幕截圖整理進文件中 +- 以預設輸出 WebP 的設計工具所匯出的圖片建立 PDF 作品集 +- 以更普遍可讀的格式封存 WebP 圖片 + +## 提示 + +- WebP 在嵌入 PDF 前會先在內部解碼為 PNG,因此無損 WebP 圖片在高品質設定下能保有原本的品質。 +- 如果您同時有 WebP 和其他圖片格式,請改用[圖片轉 PDF](./image-to-pdf) 工具,它可以一次接受所有格式。 + +## 相關工具 + +- [圖片轉 PDF](./image-to-pdf) +- [PNG 轉 PDF](./png-to-pdf) +- [JPG 轉 PDF](./jpg-to-pdf) diff --git a/docs/zh-TW/tools/word-to-pdf.md b/docs/zh-TW/tools/word-to-pdf.md new file mode 100644 index 00000000..bc28e83f --- /dev/null +++ b/docs/zh-TW/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word 轉 PDF +description: 在瀏覽器中將 Word 文件(DOC、DOCX)、ODT 與 RTF 檔案轉換為 PDF,完整保留格式。 +--- + +# Word 轉 PDF + +將 Microsoft Word 文件及相容格式轉換為 PDF。此工具使用在瀏覽器中執行的 LibreOffice 引擎,可處理 DOC、DOCX、ODT 與 RTF 檔案,並在輸出中保留格式、表格、圖片、頁首、頁尾與樣式。 + +## 支援的格式 + +| 格式 | 副檔名 | +| :---------------- | :------ | +| Word(新版) | `.docx` | +| Word(舊版) | `.doc` | +| OpenDocument 文字 | `.odt` | +| RTF 格式 | `.rtf` | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 Word 文件。可一次選取多個檔案。 +2. 檢閱並管理檔案清單。 +3. 點選**轉換為 PDF**。LibreOffice 引擎會在第一次使用時載入(進度指示器會顯示初始化狀態),接著逐一轉換每個檔案。 +4. 單一檔案會直接下載為 PDF。多個檔案會打包成 `word-converted.zip`。 + +## 選項 + +此工具沒有其他設定。LibreOffice 引擎會使用其預設的 PDF 匯出設定檔產生輸出。 + +## 輸出 + +| 輸入數量 | 輸出 | +| :------- | :------------------------------------------------------- | +| 1 個檔案 | 下載單一 PDF(原始檔名加上 `.pdf` 副檔名) | +| 2 個以上 | ZIP 壓縮檔(`word-converted.zip`),每個檔案對應一個 PDF | + +## 使用情境 + +- 在投遞求職申請前,將 DOCX 格式的履歷或求職信轉換為 PDF +- 批次將一組合約或提案轉換為 PDF 以交付客戶 +- 將舊版 `.doc` 檔案轉換為新式 PDF 以便長期封存 +- 將 Google Docs 的協作文件(匯出為 DOCX)轉換為 PDF +- 從自動化文件產生所使用的 Word 範本製作可供列印的 PDF + +## 提示 + +- LibreOffice 引擎在每個工作階段只會下載一次並快取。第一次轉換需要幾秒鐘載入,之後的轉換會快得多。 +- 複雜的格式(巨集、ActiveX 控制項、進階 SmartArt)可能無法完美轉換。標準文件元素(文字、表格、圖片、頁首、註腳)都能可靠地轉換。 +- 由於此工具也接受 ODT 與 RTF,您可以把它當作所有文書處理格式的一站式轉換器。 + +## 相關工具 + +- [ODT 轉 PDF](./odt-to-pdf) +- [RTF 轉 PDF](./rtf-to-pdf) +- [Excel 轉 PDF](./excel-to-pdf) +- [PowerPoint 轉 PDF](./powerpoint-to-pdf) diff --git a/docs/zh-TW/tools/wpd-to-pdf.md b/docs/zh-TW/tools/wpd-to-pdf.md new file mode 100644 index 00000000..6949377b --- /dev/null +++ b/docs/zh-TW/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD 轉 PDF +description: 使用 LibreOffice 在瀏覽器中將 WordPerfect(WPD)文件轉換為 PDF。免費且私密。 +--- + +# WPD 轉 PDF + +將 Corel WordPerfect 文件轉換為 PDF 檔案。WPD 曾是法律事務所與政府機關最主要的文書處理格式。如果您有新式軟體無法開啟的舊 WordPerfect 檔案,此工具能讓它們以標準 PDF 重獲新生。 + +## 支援的格式 + +| 格式 | 副檔名 | 備註 | +| :---------- | :----- | :-------------------------- | +| WordPerfect | `.wpd` | 所有主要的 WordPerfect 版本 | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 WPD 檔案。可一次選取多個檔案。 +2. 檢閱檔案清單。使用垃圾桶圖示移除不需要的檔案,或使用**新增更多檔案**加入更多文件。 +3. 點選**轉換為 PDF**。此工具會在您的瀏覽器中載入以 LibreOffice 為基礎的轉換引擎,解析 WPD 格式並輸出 PDF。 +4. 單一檔案會直接下載為 PDF。批次轉換會產生名為 `wpd-to-pdf.zip` 的 ZIP 壓縮檔。 + +## 選項 + +不需要任何設定。LibreOffice 引擎會自動處理 WPD 的格式、字型與版面配置。 + +## 使用情境 + +- 開啟數十年前以 WordPerfect 撰寫的法律文件 +- 將封存的 WPD 政府文件轉換為新式格式 +- 將舊有的 WordPerfect 文件庫遷移為 PDF 以便長期保存 +- 與未安裝 Corel WordPerfect 的收件者分享 WPD 檔案 + +## 提示 + +- LibreOffice 引擎會在第一次使用時載入,需要一點時間。同一工作階段中之後的轉換會更快。 +- 複雜的 WPD 巨集與顯示代碼不會保留,但視覺版面、文字內容與基本格式都會轉入 PDF。 + +## 相關工具 + +- [WPS 轉 PDF](./wps-to-pdf) +- [ODG 轉 PDF](./odg-to-pdf) diff --git a/docs/zh-TW/tools/wps-to-pdf.md b/docs/zh-TW/tools/wps-to-pdf.md new file mode 100644 index 00000000..415b8bee --- /dev/null +++ b/docs/zh-TW/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS 轉 PDF +description: 在瀏覽器中將 Microsoft Works(WPS)文件轉換為 PDF。免費、免註冊、完全私密。 +--- + +# WPS 轉 PDF + +將 Microsoft Works 文書處理檔案轉換為 PDF。Microsoft Works 在 1990 年代末到 2000 年代隨消費型電腦一起提供,至今仍有許多 WPS 檔案存放在舊硬碟與電子郵件封存中。此工具可在瀏覽器中開啟它們並產生清晰的 PDF。 + +## 支援的格式 + +| 格式 | 副檔名 | 備註 | +| :-------------- | :----- | :----------------------------- | +| Microsoft Works | `.wps` | Microsoft Works 的文書處理檔案 | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 WPS 檔案。可接受多個檔案。 +2. 檢閱檔案清單。使用垃圾桶圖示移除個別檔案,或點選**新增更多檔案**擴充批次。 +3. 點選**轉換為 PDF**。以 LibreOffice 為基礎的引擎會在瀏覽器中載入,並將每份 WPS 文件轉換為 PDF。 +4. 單一檔案會直接下載為 PDF。多個檔案會打包成名為 `wps-to-pdf.zip` 的 ZIP 壓縮檔。 + +## 選項 + +不需要其他設定。轉換器會處理 WPS 檔案中的文字、基本格式與內嵌圖片。 + +## 使用情境 + +- 救回以 Microsoft Works 格式儲存的舊學校或工作文件 +- 在未安裝 Microsoft Works 的情況下開啟 WPS 電子郵件附件 +- 轉換整批 WPS 檔案,以遷移至新式文件系統 +- 列印目前文書處理軟體無法開啟的舊文件 + +## 提示 + +- 請勿將 Microsoft Works 的 `.wps` 檔案與 WPS Office 檔案混淆。此工具專門處理較舊的 Microsoft Works 格式。 +- LibreOffice 引擎在第一次使用時需要一點時間載入。載入後,同一工作階段中的其他轉換會更快。 + +## 相關工具 + +- [WPD 轉 PDF](./wpd-to-pdf) +- [PUB 轉 PDF](./pub-to-pdf) diff --git a/docs/zh-TW/tools/xml-to-pdf.md b/docs/zh-TW/tools/xml-to-pdf.md new file mode 100644 index 00000000..8d41f576 --- /dev/null +++ b/docs/zh-TW/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML 轉 PDF +description: 在瀏覽器中將 XML 檔案轉換為結構化的 PDF 文件。免費、私密,不經伺服器處理。 +--- + +# XML 轉 PDF + +將 XML 資料檔轉換為易讀、結構化的 PDF 文件。原始 XML 功能強大,但對人來說難以閱讀。此工具會解析 XML 樹、找出重複的資料結構,並在橫向 A4 PDF 中將其呈現為格式化的表格與區段。 + +## 支援的格式 + +| 格式 | 副檔名 | 備註 | +| :--- | :----- | :---------------------- | +| XML | `.xml` | 任何格式正確的 XML 文件 | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 XML 檔案。可在單一批次中處理多個檔案。 +2. 檢閱檔案清單。使用垃圾桶圖示移除不需要的檔案,或點選**新增更多檔案**加入更多檔案。 +3. 點選**轉換為 PDF**。此工具會使用瀏覽器內建的 DOMParser 解析 XML 結構、分析資料階層,並使用 jsPDF 搭配自動表格格式將其轉換為 PDF。 +4. 單一檔案會下載為 PDF。多個轉換結果會打包成 `xml-to-pdf.zip`。 + +## 選項 + +不需要手動設定。轉換器會自動偵測 XML 結構並選擇合適的表格版面。輸出使用橫向 A4 方向,以容納較寬的資料集。 + +## 使用情境 + +- 將資料庫或 API 匯出的 XML 資料轉換為可列印的報表 +- 從 XML 設定檔建立易讀的摘要 +- 將 XML 格式的發票或交易紀錄轉換為 PDF 以便存檔 +- 讓 XML 網站地圖或 RSS 摘要以文件形式易於閱讀 + +## 提示 + +- XML 必須格式正確。如果剖析器遇到語法錯誤,轉換會失敗,並顯示指出問題所在的錯誤訊息。 +- 深層巢狀的 XML 結構會被扁平化為表格。為獲得最佳結果,資料應具有重複的同層元素,且其子元素一致。 +- 轉換期間會顯示進度更新,呈現每個階段:讀取、解析、分析與轉譯。 + +## 相關工具 + +- [FB2 轉 PDF](./fb2-to-pdf) +- [XPS 轉 PDF](./xps-to-pdf) +- [電子郵件轉 PDF](./email-to-pdf) diff --git a/docs/zh-TW/tools/xps-to-pdf.md b/docs/zh-TW/tools/xps-to-pdf.md new file mode 100644 index 00000000..0ee963c7 --- /dev/null +++ b/docs/zh-TW/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS 轉 PDF +description: 在瀏覽器中將 XPS 與 OXPS 文件轉換為 PDF 格式。無需上傳、免註冊、完全私密。 +--- + +# XPS 轉 PDF + +將 Microsoft XPS 與 OXPS 文件轉換為標準 PDF 檔案。XPS(XML Paper Specification)是 Microsoft 對抗 PDF 的格式,但各平台對它的支援已逐漸減少。此工具能讓這些文件再次在任何地方都能閱讀。 + +## 支援的格式 + +| 格式 | 副檔名 | 備註 | +| :--- | :------ | :---------------------------- | +| XPS | `.xps` | 原始的 Microsoft XPS 格式 | +| OXPS | `.oxps` | Open XPS,ECMA-388 標準的變體 | + +## 運作方式 + +1. 點選上傳區域,或拖放您的 XPS/OXPS 檔案。可一次選取多個檔案。 +2. 檢閱檔案清單。使用垃圾桶圖示移除個別檔案,或點選**新增更多檔案**附加其他文件。 +3. 點選**轉換為 PDF**。PyMuPDF 引擎會在您的瀏覽器中於本機處理每份文件。 +4. 單一檔案會直接下載為 PDF。多個檔案會打包成名為 `xps-converted.zip` 的 ZIP 壓縮檔。 + +## 選項 + +此工具直接進行格式轉換,無需其他設定。輸出會保留 XPS 來源的原始頁面尺寸、向量圖形、字型與圖片。 + +## 使用情境 + +- 開啟從預設使用 XPS 列印驅動程式的舊版 Windows 系統收到的 XPS 檔案 +- 轉換 Windows 10/11 的 OXPS 文件,以便與 macOS 或 Linux 使用者分享 +- 將舊有的 XPS 檔案封存為支援更廣泛的格式 +- 讓以 XPS 製作的政府或企業文件能供外部收件者存取 + +## 提示 + +- `.xps` 與 `.oxps` 副檔名都會自動處理,您可以在同一批次中混合使用。 +- 如果原始 XPS 檔案是由高解析度列印驅動程式建立,產生的 PDF 會保留該品質,不會重新取樣。 + +## 相關工具 + +- [Word 轉 PDF](./word-to-pdf) +- [XML 轉 PDF](./xml-to-pdf) diff --git a/docs/zh/contributing.md b/docs/zh/contributing.md new file mode 100644 index 00000000..316638c7 --- /dev/null +++ b/docs/zh/contributing.md @@ -0,0 +1,136 @@ +# 参与贡献 + +感谢您有兴趣为 BentoPDF 做出贡献!本指南将帮助您快速上手。 + +## 开始上手 + +### 前置条件 + +- Node.js 18+ +- npm 9+ +- Git + +### 环境搭建 + +```bash +# Fork and clone the repository +git clone https://github.com/YOUR_USERNAME/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 项目结构 + +``` +bentopdf/ +├── src/ +│ ├── js/ +│ │ ├── config/ # Tool definitions +│ │ ├── logic/ # Tool page logic +│ │ ├── utils/ # Shared utilities +│ │ └── ui.ts # UI helpers +│ ├── pages/ # Tool HTML pages +│ └── css/ # Styles +├── public/ +│ ├── locales/ # Translations +│ └── pymupdf-wasm/ # WASM modules +├── docs/ # Documentation (VitePress) +└── scripts/ # Build scripts +``` + +## 添加新工具 + +### 第 1 步:创建逻辑文件 + +创建 `src/js/logic/your-tool-page.ts`: + +```typescript +import { showLoader, hideLoader, showAlert } from '../ui.js'; +import { state } from '../state.js'; + +document.addEventListener('DOMContentLoaded', () => { + // Your tool logic here +}); +``` + +### 第 2 步:创建 HTML 页面 + +参照现有的工具模板,创建 `src/pages/your-tool.html`。 + +### 第 3 步:注册工具 + +添加到 `src/js/config/tools.ts`: + +```typescript +{ + href: import.meta.env.BASE_URL + 'your-tool.html', + name: 'Your Tool', + icon: 'ph-icon-name', + subtitle: 'Description of your tool.', +} +``` + +### 第 4 步:添加到构建配置 + +将页面添加到 `vite.config.ts`: + +```typescript +'your-tool': resolve(__dirname, 'src/pages/your-tool.html'), +``` + +### 第 5 步:添加翻译 + +在 `public/locales/` 下的所有语言文件中添加条目: + +```json +{ + "yourTool": { + "name": "Your Tool", + "subtitle": "Description" + } +} +``` + +## 代码风格 + +- 所有新代码都使用 TypeScript +- 遵循现有模式以保持一致 +- 提交前运行 `npm run format` +- 生产代码中不要写注释(构建时会移除注释) + +## Pull Request 流程 + +1. 创建功能分支:`git checkout -b feature/your-feature` +2. 进行修改 +3. 充分测试:`npm run build` +4. 提交 PR 并附上清晰的说明 + +## 翻译 + +添加新语言请参阅 [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md)。 + +## 贡献者许可协议 + +在您的 PR 被合并之前,需要先签署我们的 CLA: + +- [个人 CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md) +- [企业 CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md) + +## 获取帮助 + +- [GitHub Issues](https://github.com/alam00000/bentopdf/issues) +- [Discord 社区](https://discord.gg/Bgq3Ay3f2w) + +## 许可证 + +BentoPDF 采用双重许可: + +- **AGPL-3.0**:适用于公开分享完整源代码的开源项目 +- **商业许可**:适用于专有/闭源应用 - [购买终身许可,仅需 $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd) + +贡献代码即表示您同意您的贡献将按上述条款授权。 diff --git a/docs/zh/getting-started.md b/docs/zh/getting-started.md new file mode 100644 index 00000000..6c8d0aff --- /dev/null +++ b/docs/zh/getting-started.md @@ -0,0 +1,80 @@ +# 快速入门 + +欢迎使用 BentoPDF!本指南将帮助您快速上手。 + +## 什么是 BentoPDF? + +BentoPDF 是一款免费、开源、隐私优先的 PDF 工具箱,**完全在浏览器中运行**。您的文件不会离开您的设备,所有处理都通过 WebAssembly (WASM) 技术在本地完成。 + +## 快速开始 + +### 方式 1:使用托管版本 + +访问 [bentopdf.com](https://www.bentopdf.com) 即可立即使用 BentoPDF,无需安装。 + +### 方式 2:使用 Docker 自托管 + +> [!IMPORTANT] +> Office 文件转换需要 `SharedArrayBuffer`,这需要同时满足: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> - 安全上下文 +> +> `http://localhost` 可用于本地测试,因为浏览器将环回地址视为可信。`http://192.168.x.x` 等局域网 IP 通常不被视为可信,因此从网络中的其他设备访问时,Word/Excel/PowerPoint 转换需要使用 HTTPS。 + +```bash +# Pull and run the Docker image (self-hosted build) +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or use Docker Compose +curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml +docker compose up -d +``` + +> [!TIP] +> BentoPDF 提供两种构建版本:**自托管版本**(`bentopdf-simple`,上文使用的版本)适用于内部/团队/组织部署;**商业版本**(`bentopdf:latest`)由 bentopdf.com 自身使用,也供持有商业许可、运行面向公众部署的用户使用。两者的 PDF 工具完全相同,商业版本额外包含 bentopdf.com 的首页横幅、FAQ、用户评价和页脚。如果拿不准,请使用自托管版本。 + +然后在浏览器中打开 `http://localhost:3000`。 + +> [!NOTE] +> 如果您要准备离线隔离(air-gapped)的 OCR 部署,除了 Tesseract worker、核心运行时和 traineddata 文件外,还必须在内部托管 OCR 文本层字体。完整的设置步骤见[自托管](/zh/self-hosting/),其中包括 `VITE_OCR_FONT_BASE_URL` 和随附的 `ocr-fonts/` 目录。 + +### 方式 3:从源码构建 + +```bash +# Clone the repository +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Install dependencies +npm install + +# Start development server +npm run dev +``` + +## 功能一览 + +| 类别 | 工具 | +| --------------- | ------------------------------------------------------ | +| **转换为 PDF** | Word、Excel、PowerPoint、图片、Markdown、EPUB、MOBI 等 | +| **从 PDF 转换** | JPG、PNG、文本、Excel、SVG 等 | +| **编辑与批注** | 签名、高亮、涂黑、填写表单、添加印章 | +| **整理** | 合并、拆分、旋转、删除页面、重新排序 | +| **优化** | 压缩、修复、扁平化、OCR | +| **安全** | 加密、解密、移除限制 | + +## 浏览器支持 + +BentoPDF 在现代浏览器上表现最佳: + +- ✅ Chrome/Edge 90+ +- ✅ Firefox 90+ +- ✅ Safari 15+ + +## 下一步 + +- [浏览所有工具](/zh/tools/) +- [自托管 BentoPDF](/zh/self-hosting/) +- [参与项目贡献](/zh/contributing) diff --git a/docs/zh/index.md b/docs/zh/index.md new file mode 100644 index 00000000..df22713c --- /dev/null +++ b/docs/zh/index.md @@ -0,0 +1,42 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'BentoPDF' + text: '免费开源的 PDF 工具' + tagline: 完全在浏览器中处理 PDF。无需上传,无需服务器,彻底保护隐私。 + actions: + - theme: brand + text: 快速入门 + link: /zh/getting-started + - theme: alt + text: 查看工具 + link: /zh/tools/ + - theme: alt + text: 自托管 + link: /zh/self-hosting/ + - theme: alt + text: 商业许可 + link: /zh/licensing + +features: + - icon: 🔒 + title: 100% 私密 + details: 您的文件不会离开您的设备。所有处理都通过 WebAssembly 在浏览器本地完成。 + - icon: ⚡ + title: 快速且免费 + details: 无需注册,无限制,无水印。永久免费,无限量处理 PDF。 + - icon: 🛠️ + title: 50+ 款工具 + details: 转换、编辑、合并、拆分、压缩、签名、OCR 等,所需功能一应俱全。 + + - icon: 🌐 + title: 可自托管 + details: 部署在您自己的基础设施上。支持 Docker、Vercel、Netlify、AWS,也可部署在完全离线隔离的环境中,配套自托管的 OCR worker、语言数据和文本层字体。 +--- + +## 离线 OCR + +如果您在离线隔离或无网络的环境中自托管 BentoPDF,OCR 所需的不仅仅是 Tesseract worker 和 traineddata 文件。要输出可搜索的 PDF,还需要在内部提供 OCR 文本层字体。 +完整设置请参阅[自托管](/zh/self-hosting/),其中包括 `VITE_OCR_FONT_BASE_URL`、随附的 `ocr-fonts/` 目录以及更新后的离线隔离工作流程。 diff --git a/docs/zh/licensing.md b/docs/zh/licensing.md new file mode 100644 index 00000000..4f6a8979 --- /dev/null +++ b/docs/zh/licensing.md @@ -0,0 +1,92 @@ +# Commercial License + +BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications). + +::: tip Full Details +For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing). +::: + +## Get a Commercial License + +**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever. + +## When Do You Need a Commercial License? + +| Use Case | License Required | +| ------------------------------------------- | ---------------------- | +| Open-source project with public source code | AGPL-3.0 (Free) | +| Internal company tool (not distributed) | AGPL-3.0 (Free) | +| Proprietary/closed-source application | **Commercial License** | +| SaaS product without source code disclosure | **Commercial License** | +| Redistributing without AGPL compliance | **Commercial License** | + +## Delivery & Licensing Model + +- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users. +- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries. +- The source code provided is identical to the code published in our public open-source repository. + +**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf) + +## Important Notice on Third-Party Components + +::: info AGPL Components — Pre-configured via CDN +BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup. + +| Component | License | Status | +| --------------- | -------- | ---------------------- | +| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN | +| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN | +| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN | + +WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI. + +See [Self-Hosting > WASM Configuration](/zh/self-hosting/#wasm-配置-agpl-组件) for details. + +This approach ensures: + +- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial) +- WASM binaries are loaded at runtime, not included in the source +- Clear compliance boundaries for commercial users + ::: + +::: tip Commercial License & AGPL Features +The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions. +::: + +## Invoicing + +- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase. +- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number. + +**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. + +## What's Included + +| Feature | Included | +| ----------------------------- | -------------- | +| Full source code | ✅ | +| All 50+ PDF tools | ✅ | +| Self-hosting rights | ✅ | +| Lifetime updates | ✅ | +| Remove branding (Simple Mode) | ✅ | +| Commercial support | ✅ (via email) | +| Priority feature requests | ✅ | + +## FAQ + +### Do I need a license key to use BentoPDF? + +No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications. + +### Can I use BentoPDF in my SaaS product? + +Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users. + +### What about the AGPL components? + +Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations. + +### How do I get an invoice? + +Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details. diff --git a/docs/zh/self-hosting/apache.md b/docs/zh/self-hosting/apache.md new file mode 100644 index 00000000..94cefd06 --- /dev/null +++ b/docs/zh/self-hosting/apache.md @@ -0,0 +1,275 @@ +# 使用 Apache 部署 + +使用 Apache HTTP Server 托管 BentoPDF。 + +## 前置条件 + +- Apache 2.4+ +- 已启用 mod_rewrite +- SSL 证书(推荐) + +## 第 1 步:构建项目 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +如需自定义品牌,请在构建前设置环境变量: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## 第 2 步:复制文件 + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## 第 3 步:Apache 配置 + +创建 `/etc/apache2/sites-available/bentopdf.conf`: + +```apache + + ServerName your-domain.com + Redirect permanent / https://your-domain.com/ + + + + ServerName your-domain.com + DocumentRoot /var/www/bentopdf + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + # WASM MIME type + AddType application/wasm .wasm + + # Prevent double-compression of pre-compressed files + SetEnvIfNoCase Request_URI "\.gz$" no-gzip + + # Compression + + AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm + + + # Cache headers + + ExpiresActive On + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + Header always set Cross-Origin-Embedder-Policy "require-corp" + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Resource-Policy "cross-origin" + + # Security headers + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + + # Pre-compressed LibreOffice WASM files + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + + +``` + +## 第 4 步:用于路由的 .htaccess + +创建 `/var/www/bentopdf/.htaccess`: + +```apache +RewriteEngine On +RewriteBase / + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# ADD .HTML EXTENSION (ROOT LEVEL) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /404.html +``` + +## 第 5 步:启用所需模块 + +```bash +sudo a2enmod rewrite +sudo a2enmod ssl +sudo a2enmod headers +sudo a2enmod expires +sudo a2enmod deflate +``` + +## 第 6 步:启用站点 + +```bash +sudo a2ensite bentopdf.conf +sudo apache2ctl configtest +sudo systemctl reload apache2 +``` + +## 子目录部署 + +要部署在 `/pdf/` 下: + +1. 使用基础 URL 构建: + +```bash +BASE_URL=/pdf/ npm run build +``` + +2. 更新 `.htaccess`: + +```apache +RewriteEngine On +RewriteBase /pdf/ + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Language routes +RewriteRule ^en/?$ /pdf/ [R=301,L] +RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L] + +RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf/404.html +``` + +## 故障排查 + +### WASM 404 错误 + +请确认已配置 MIME 类型: + +```apache +AddType application/wasm .wasm +``` + +### 签名 PDF 或表单填写器显示空白查看器(`.mjs` MIME 错误) + +如果浏览器控制台显示: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +……并且失败的请求以 `.mjs` 结尾,说明您的 Apache 配置缺少 `.mjs → application/javascript` 的映射。内置的 PDF 查看器使用扩展名为 `.mjs` 的 ES 模块文件,而 Apache 自带的 `mime.types` 默认不包含它们。 + +将以下内容添加到您的 VirtualHost 或 `.htaccess`: + +```apache +AddType application/javascript .mjs +``` + +然后重新加载 Apache: + +```bash +sudo apache2ctl configtest && sudo systemctl reload apache2 +``` + +验证方法:在浏览器 DevTools 的 Network 标签页中找到失败的 `.mjs` 请求,检查 `Content-Type` 响应头。现在它应为 `application/javascript`,而不是 `application/octet-stream`。 + +### Rewrite 不生效 + +请检查 mod_rewrite 是否已启用: + +```bash +sudo a2enmod rewrite +``` + +### Word/ODT/Excel 转 PDF 无法使用 + +LibreOffice WASM 需要 `SharedArrayBuffer`,这需要以下响应头: + +```apache +Header always set Cross-Origin-Embedder-Policy "require-corp" +Header always set Cross-Origin-Opener-Policy "same-origin" +``` + +它还需要安全上下文。`http://localhost` 可用于本地测试,但 `http://192.168.x.x` 等局域网 IP 通常需要 HTTPS。如果响应头已存在,但 `window.crossOriginIsolated` 仍为 `false`,请检查页面是否在非环回来源上通过普通 HTTP 打开。 + +预压缩的 `.wasm.gz` 和 `.data.gz` 文件还需要正确的 `Content-Encoding`: + +```apache + + ForceType application/wasm + Header set Content-Encoding "gzip" + + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + +``` + +请确保已启用 `mod_headers`:`sudo a2enmod headers` + +### 权限被拒绝 + +```bash +sudo chown -R www-data:www-data /var/www/bentopdf +sudo chmod -R 755 /var/www/bentopdf +``` diff --git a/docs/zh/self-hosting/aws.md b/docs/zh/self-hosting/aws.md new file mode 100644 index 00000000..ed3384a9 --- /dev/null +++ b/docs/zh/self-hosting/aws.md @@ -0,0 +1,200 @@ +# 部署到 AWS S3 + CloudFront + +在 AWS 上托管 BentoPDF,获得最大的控制力和可扩展性。 + +## 架构 + +``` +User → CloudFront (CDN) → S3 (Static Files) +``` + +## 第 1 步:创建 S3 存储桶 + +```bash +# Create bucket +aws s3 mb s3://your-bentopdf-bucket --region us-east-1 + +# Enable static website hosting +aws s3 website s3://your-bentopdf-bucket \ + --index-document index.html \ + --error-document index.html +``` + +## 第 2 步:构建并上传 + +```bash +# Build the project (optionally with custom branding) +# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +npm run build + +# Sync to S3 +aws s3 sync dist/ s3://your-bentopdf-bucket \ + --delete \ + --cache-control "max-age=31536000" + +# Set correct MIME types for WASM +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.wasm" \ + --content-type "application/wasm" \ + --metadata-directive REPLACE + +# Set correct MIME type for ES module files (.mjs) +# S3 defaults .mjs to application/octet-stream, which browsers refuse to +# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler) +# ships ES modules with .mjs extensions and will fail without this step. +aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \ + --recursive \ + --exclude "*" \ + --include "*.mjs" \ + --content-type "application/javascript" \ + --metadata-directive REPLACE +``` + +## 第 3 步:创建 CloudFront 分配 + +```bash +aws cloudfront create-distribution \ + --origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \ + --default-root-object index.html +``` + +或者使用 AWS 控制台: + +1. 前往 CloudFront → Create distribution +2. Origin domain:选择您的 S3 存储桶 +3. 启用 "Origin Access Control" +4. Default root object:`index.html` +5. 创建分配 + +## 第 3b 步:响应头策略(LibreOffice WASM 必需) + +基于 LibreOffice 的转换(Word、Excel、PowerPoint 转 PDF)需要 `SharedArrayBuffer`,而这需要特定的响应头。请创建一个 CloudFront 响应头策略(Response Headers Policy): + +1. 前往 CloudFront → Policies → Response headers +2. 创建包含以下响应头的自定义策略: + +| 响应头 | 值 | +| ------------------------------ | -------------- | +| `Cross-Origin-Embedder-Policy` | `require-corp` | +| `Cross-Origin-Opener-Policy` | `same-origin` | +| `Cross-Origin-Resource-Policy` | `cross-origin` | + +3. 将该策略附加到分配的默认缓存行为 + +或者通过 CLI: + +```bash +aws cloudfront create-response-headers-policy \ + --response-headers-policy-config '{ + "Name": "BentoPDF-COEP-COOP", + "CustomHeadersConfig": { + "Quantity": 3, + "Items": [ + {"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true}, + {"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true}, + {"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true} + ] + } + }' +``` + +## 第 3c 步:预压缩 WASM 文件的 S3 元数据 + +LibreOffice WASM 文件是预压缩的(`.wasm.gz`、`.data.gz`)。请设置正确的 Content-Type 和 Content-Encoding,让浏览器能够正确解压: + +```bash +# Set correct headers for soffice.wasm.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \ + --content-type "application/wasm" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE + +# Set correct headers for soffice.data.gz +aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \ + --content-type "application/octet-stream" \ + --content-encoding "gzip" \ + --metadata-directive REPLACE +``` + +::: warning 重要 +如果没有响应头策略,`SharedArrayBuffer` 将不可用,LibreOffice WASM 转换会卡在约 55%。如果 `.gz` 文件没有正确的 Content-Encoding,浏览器会收到原始的 gzip 字节,WASM 编译将失败。 +::: + +## 第 4 步:S3 存储桶策略 + +允许 CloudFront 访问存储桶: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowCloudFrontAccess", + "Effect": "Allow", + "Principal": { + "Service": "cloudfront.amazonaws.com" + }, + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::your-bentopdf-bucket/*", + "Condition": { + "StringEquals": { + "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID" + } + } + } + ] +} +``` + +## 第 5 步:自定义错误页面 + +将 404 配置为返回 `index.html`,以支持 SPA 路由: + +1. CloudFront → Error pages +2. 创建自定义错误响应: + - HTTP error code:404 + - Response page path:`/index.html` + - HTTP response code:200 + +## 成本估算 + +| 资源 | 预估成本 | +| ----------------------- | ----------- | +| S3 存储(约 500MB) | 约 $0.01/月 | +| CloudFront(1TB 流量) | 约 $85/月 | +| CloudFront(10GB 流量) | 约 $0.85/月 | + +::: tip +对于不常访问的文件,可使用 S3 Intelligent Tiering 来优化成本。 +::: + +## 使用 Terraform 自动化 + +```hcl +# main.tf +resource "aws_s3_bucket" "bentopdf" { + bucket = "your-bentopdf-bucket" +} + +resource "aws_cloudfront_distribution" "bentopdf" { + origin { + domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name + origin_id = "S3Origin" + } + + enabled = true + default_root_object = "index.html" + + default_cache_behavior { + allowed_methods = ["GET", "HEAD"] + cached_methods = ["GET", "HEAD"] + target_origin_id = "S3Origin" + + viewer_protocol_policy = "redirect-to-https" + } +} +``` diff --git a/docs/zh/self-hosting/cloudflare.md b/docs/zh/self-hosting/cloudflare.md new file mode 100644 index 00000000..cbf78915 --- /dev/null +++ b/docs/zh/self-hosting/cloudflare.md @@ -0,0 +1,154 @@ +# 部署到 Cloudflare Pages + +[Cloudflare Pages](https://pages.cloudflare.com) 提供快速的全球静态站点托管,带宽不限量。 + +## 快速部署 + +1. 前往 [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages) +2. 点击 "Create a project" +3. 连接您的 GitHub 仓库 + +## 构建配置 + +| 设置 | 值 | +| ---------------------- | --------------- | +| Framework preset | None | +| Build command | `npm run build` | +| Build output directory | `dist` | +| Root directory | `/` | + +## 环境变量 + +在 Settings → Environment variables 中添加以下变量: + +| 变量 | 值 | +| ----------------------- | ------------------------------------- | +| `NODE_VERSION` | `18` | +| `SIMPLE_MODE` | `false`(可选) | +| `VITE_BRAND_NAME` | 自定义品牌名称(可选) | +| `VITE_BRAND_LOGO` | 相对于 `public/` 的 Logo 路径(可选) | +| `VITE_FOOTER_TEXT` | 自定义页脚/版权文本(可选) | +| `VITE_DEFAULT_LANGUAGE` | 默认界面语言,例如 `fr`(可选) | + +## 配置文件 + +在 `public` 文件夹中创建 `_headers`: + +``` +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +/* + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Resource-Policy: cross-origin + +# Pre-compressed LibreOffice WASM binary +/libreoffice-wasm/soffice.wasm.gz + Content-Type: application/wasm + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Pre-compressed LibreOffice WASM data +/libreoffice-wasm/soffice.data.gz + Content-Type: application/octet-stream + Content-Encoding: gzip + Cache-Control: public, max-age=31536000, immutable + +# Cache WASM files aggressively +/*.wasm + Cache-Control: public, max-age=31536000, immutable + Content-Type: application/wasm + +# Service worker +/sw.js + Cache-Control: no-cache +``` + +::: warning 重要 +Word/ODT/Excel/PowerPoint 转 PDF 需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 响应头。没有它们,`SharedArrayBuffer` 将不可用,LibreOffice WASM 引擎将无法初始化。 +::: + +创建 `_redirects` 以支持 SPA 路由: + +``` +/* /index.html 200 +``` + +## 自定义域名 + +1. 前往您的 Pages 项目 +2. 点击 "Custom domains" +3. 添加您的域名 +4. 如果域名托管在 Cloudflare,Cloudflare 会自动配置 DNS + +## 优势 + +- **免费且带宽不限量** +- **全球 CDN**,拥有 300+ 个边缘节点 +- **自动 HTTPS** +- 为拉取请求提供**预览部署** +- **构建速度快** + +## 故障排查 + +### 大文件上传 + +Cloudflare Pages 支持最大 25 MB 的文件。WASM 模块通常没有问题,但如果遇到限制,可以考虑: + +```bash +# Split large files during build +npm run build +``` + +### Worker 大小限制 + +如果使用 Cloudflare Workers 进行高级路由,请注意免费计划有 1 MB 的限制。 + +## CORS 代理 Worker(用于数字签名) + +数字签名工具需要 CORS 代理来获取证书链。请部署随附的 worker: + +```bash +cd cloudflare +npx wrangler login +npx wrangler deploy +``` + +### 安全特性 + +| 特性 | 说明 | +| ---------------- | ----------------------------------- | +| **URL 限制** | 仅允许证书 URL | +| **文件大小限制** | 每个请求最大 10MB | +| **速率限制** | 每个 IP 每分钟 60 次请求(需要 KV) | +| **私有 IP 拦截** | 拦截 localhost 和内部 IP | + +### 启用速率限制 + +```bash +# Create KV namespace +npx wrangler kv namespace create "RATE_LIMIT_KV" + +# Add to wrangler.toml with returned ID: +# [[kv_namespaces]] +# binding = "RATE_LIMIT_KV" +# id = "YOUR_ID" + +npx wrangler deploy +``` + +### 使用代理 URL 构建 + +```bash +VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build +``` + +或者使用 Docker: + +```bash +export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" +DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . +``` + +> **注意:** HMAC 签名的设置请参阅 [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required)。 diff --git a/docs/zh/self-hosting/cors-proxy.md b/docs/zh/self-hosting/cors-proxy.md new file mode 100644 index 00000000..91060502 --- /dev/null +++ b/docs/zh/self-hosting/cors-proxy.md @@ -0,0 +1,180 @@ +# 用于获取证书的 CORS 代理 + +数字签名工具使用 CORS 代理从外部证书颁发机构 (CA) 获取颁发者证书。这是必要的,因为许多 CA 服务器的响应中不包含 CORS 响应头,导致浏览器无法直接获取。 + +此外,许多 CA 服务器通过纯 HTTP 提供证书。当您的 BentoPDF 实例通过 HTTPS 托管时,浏览器会阻止这些 HTTP 请求(混合内容策略)。CORS 代理通过 HTTPS 端点并附带正确的响应头转发请求,从而同时解决这两个问题。 + +## 工作原理 + +使用证书为 PDF 签名时: + +1. `zgapdfsigner` 库会尝试构建完整的证书链 +2. 它从您证书的 AIA (Authority Information Access) 扩展中嵌入的 URL 获取颁发者证书 +3. 这些请求会经由 CORS 代理转发,代理会添加必要的 `Access-Control-Allow-Origin` 响应头 +4. 代理将证书数据返回给浏览器 + +## 自托管 CORS 代理 + +如果您自托管 BentoPDF,则需要部署自己的 CORS 代理,数字签名才能处理需要获取证书链的证书。 + +### 方案 1:Cloudflare Workers(推荐) + +1. **安装 Wrangler CLI**: + + ```bash + npm install -g wrangler + ``` + +2. **登录 Cloudflare**: + + ```bash + wrangler login + ``` + +3. **克隆 BentoPDF 并更新允许的来源**: + + ```bash + git clone https://github.com/alam00000/bentopdf.git + cd bentopdf/cloudflare + ``` + + 打开 `cors-proxy-worker.js`,将 `ALLOWED_ORIGINS` 数组改为您的域名: + + ```js + const ALLOWED_ORIGINS = [ + 'https://your-domain.com', + 'https://www.your-domain.com', + ]; + ``` + + ::: warning 重要 + 如果不做此修改,代理会以 **403 Forbidden** 错误拒绝来自您站点的所有请求。默认设置只允许来自 `bentopdf.com` 的请求。 + ::: + +4. **部署代理**: + + ```bash + wrangler deploy + ``` + + 记下您的 worker URL(例如 `https://bentopdf-cors-proxy.your-subdomain.workers.dev`)。 + +5. **使用代理 URL 重新构建 BentoPDF**: + + 如果使用 Docker: + + ```bash + export VITE_CORS_PROXY_URL="https://your-worker.workers.dev" + DOCKER_BUILDKIT=1 docker build \ + --secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \ + -t your-bentopdf . + ``` + + 如果从源码构建: + + ```bash + VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build + ``` + +### 方案 2:自定义后端代理 + +您也可以创建自己的代理端点。要求如下: + +1. 接受带有 `url` 查询参数的 GET 请求 +2. 从您的服务器获取该 URL(服务端不受 CORS 限制) +3. 返回响应时附带以下响应头: + - `Access-Control-Allow-Origin: https://your-domain.com` + - `Access-Control-Allow-Methods: GET, OPTIONS` + - `X-Content-Type-Options: nosniff` + +Express.js 实现示例: + +```javascript +app.get('/api/cert-proxy', async (req, res) => { + const targetUrl = req.query.url; + + // Validate it's a certificate URL + if (!isValidCertUrl(targetUrl)) { + return res.status(400).json({ error: 'Invalid URL' }); + } + + try { + const response = await fetch(targetUrl); + const data = await response.arrayBuffer(); + + res.set('Access-Control-Allow-Origin', 'https://your-domain.com'); + res.set('Content-Type', 'application/octet-stream'); + res.set('X-Content-Type-Options', 'nosniff'); + res.send(Buffer.from(data)); + } catch (error) { + res.status(500).json({ error: 'Proxy error' }); + } +}); +``` + +## 安全注意事项 + +随附的 Cloudflare Worker 包含多项安全措施: + +| 特性 | 说明 | +| --------------------- | --------------------------------------------------------------------- | +| **来源验证** | 仅允许来自 `ALLOWED_ORIGINS` 中所列域名的请求 | +| **URL 限制** | 仅允许证书 URL(`.crt`、`.cer`、`.pem`、`/certs/`、`/ocsp`、`/crl`) | +| **私有 IP 拦截** | 拦截 IPv4/IPv6 私有地址段、链路本地、环回、十进制 IP 以及云元数据地址 | +| **Content-Type 安全** | 仅返回安全的证书 MIME 类型,阻止上游 content-type 注入 | +| **文件大小限制** | 以流式方式返回响应,限制为 10MB,超出时在下载中途中止 | +| **速率限制** | 每个 IP 或 IPv6 /64 每分钟 60 次请求(需要 KV,KV 出错时放行) | +| **HMAC 签名** | 可选的客户端签名(可阻止随意滥用) | + +### DNS 重绑定(不在 Cloudflare 上自托管时) + +worker 会拒绝任何解析到私有或内部 IP 的 URL。它无法使用固定的主机白名单,因为证书链 URL 指向的是签发该证书的任意 CA(FNMT、企业 CA 等),所以目标地址事先无法确定。这就留下了一个很小的重绑定窗口:运行自己域名 DNS 的人可以在安全检查时返回公网 IP,稍后在实际请求时返回私有 IP。 + +在 Cloudflare 上这无法被利用:Workers 无法访问私有 IP 或 `169.254.169.254` 元数据端点,所以重绑定不会指向任何目标。只需注意不要给 worker 开放入口:不要附加 Tunnel、Service 或私有网络绑定(它只需要 `RATE_LIMIT_KV`)。 + +如果您在 VPC 内的 Cloudflare 之外运行它(workerd、Node 等),运行时*可以*访问内部 IP。请在它前面放置出站防火墙,并拦截私有地址段:`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`、`127.0.0.0/8`、`169.254.0.0/16`,以及它们对应的 IPv6 地址段。一旦脱离 Cloudflare,应用代码无法强制实现这一点。 + +## 禁用代理 + +如果不想使用 CORS 代理,请将环境变量设置为空字符串: + +``` +VITE_CORS_PROXY_URL= +``` + +**注意**:没有代理时,使用需要获取外部证书链的证书(如 FNMT 或某些企业 CA)进行签名会失败,并报 "Failed to fetch" 错误。 + +## 故障排查 + +### "Signing error: TypeError: Failed to fetch" + +这通常意味着以下情况之一: + +1. **未配置 CORS 代理**:设置 `VITE_CORS_PROXY_URL` 并重新构建 +2. **混合内容被阻止**:您的站点使用 HTTPS,但证书的颁发者 URL 是 HTTP。CORS 代理可解决此问题。 +3. **CORS 代理拒绝了您的来源**:请检查您的域名是否在 `cors-proxy-worker.js` 的 `ALLOWED_ORIGINS` 数组中 + +### 代理返回 "403 Forbidden" + +您的域名不在 `ALLOWED_ORIGINS` 列表中。编辑 `cors-proxy-worker.js`: + +```js +const ALLOWED_ORIGINS = ['https://your-domain.com']; +``` + +然后重新部署:`npx wrangler deploy` + +### 测试代理 + +```bash +curl -H "Origin: https://your-domain.com" \ + "https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt" +``` + +### 无需代理即可使用的证书 + +有些证书在 P12/PFX 文件中包含完整的证书链,不需要获取外部证书: + +- 自签名证书 +- 某些捆绑了中间证书的商业 CA +- 您手动组装了完整证书链的证书 diff --git a/docs/zh/self-hosting/docker.md b/docs/zh/self-hosting/docker.md new file mode 100644 index 00000000..bb06550f --- /dev/null +++ b/docs/zh/self-hosting/docker.md @@ -0,0 +1,622 @@ +# 使用 Docker / Podman 部署 + +在生产环境中自托管 BentoPDF 的最简单方式。 + +> [!IMPORTANT] +> **Office 文件转换所需的响应头** +> +> 基于 LibreOffice 的工具(Word、Excel、PowerPoint 转换)需要以下 HTTP 响应头来支持 `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 页面还必须通过安全上下文提供。`http://localhost` 可用于本地测试,但 `http://192.168.x.x` 等局域网 IP 通常不符合要求,因此即使响应头存在,通过纯 HTTP 进行 Office 转换也会失败。 +> +> 官方容器镜像已包含这些响应头。如果使用反向代理(Traefik、Caddy 等),请确保保留或添加这些响应头,并对非环回访问使用 HTTPS。 + +> [!TIP] +> **Podman 用户:** 将 `docker` 替换为 `podman`、将 `docker-compose` 替换为 `podman-compose`,所有 `docker` 命令都同样适用于 Podman。 + +## 快速开始 + +> [!TIP] +> BentoPDF 提供两种构建版本: +> +> - **自托管版本**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**营销页面元素(没有首页横幅、FAQ、用户评价和页脚)。适用于内部/团队/组织部署。它**不是**功能精简的 "lite" 版本。 +> - **商业版本**:`ghcr.io/alam00000/bentopdf:latest`。完整的营销站点,由 bentopdf.com 自身使用,也供持有商业许可、运行面向公众部署的用户使用。 +> +> 如果拿不准,请拉取自托管版本。 + +```bash +# Docker +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + --restart unless-stopped \ + ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d \ + --name bentopdf \ + -p 3000:8080 \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +## Docker Compose / Podman Compose + +创建 `docker-compose.yml`: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + container_name: bentopdf + ports: + - '3000:8080' + restart: unless-stopped + healthcheck: + test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080'] + interval: 30s + timeout: 10s + retries: 3 +``` + +运行: + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## 构建您自己的镜像 + +```dockerfile +# Dockerfile +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginxinc/nginx-unprivileged:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/nginx.conf +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] +``` + +构建并运行: + +```bash +docker build -t bentopdf:custom . +docker run -d -p 3000:8080 bentopdf:custom +``` + +## 环境变量 + +| 变量 | 说明 | 默认值 | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| `SIMPLE_MODE` | 构建自托管变体(隐藏 bentopdf.com 的营销页面元素:首页横幅、FAQ、用户评价、页脚)。所有 PDF 工具均保留。 | `false` | +| `BASE_URL` | 部署到子目录 | `/` | +| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM 模块 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` | +| `VITE_WASM_GS_URL` | Ghostscript WASM 模块 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` | +| `VITE_WASM_CPDF_URL` | CoherentPDF WASM 模块 URL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` | +| `VITE_TESSERACT_WORKER_URL` | OCR worker 脚本 URL | _(空;使用 Tesseract.js 默认 CDN)_ | +| `VITE_TESSERACT_CORE_URL` | OCR 核心运行时目录 | _(空;使用 Tesseract.js 默认 CDN)_ | +| `VITE_TESSERACT_LANG_URL` | OCR traineddata 目录 | _(空;使用 Tesseract.js 默认 CDN)_ | +| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | 在界面中提供的 OCR 语言,以逗号分隔 | _(空;显示完整列表)_ | +| `VITE_OCR_FONT_BASE_URL` | OCR 文本层字体目录 | _(空;使用远程 Noto 字体 URL)_ | +| `VITE_DEFAULT_LANGUAGE` | 默认界面语言 | `en` | +| `VITE_BRAND_NAME` | 自定义品牌名称 | `BentoPDF` | +| `VITE_BRAND_LOGO` | 相对于 `public/` 的 Logo 路径 | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | 自定义页脚/版权文本 | `© 2026 BentoPDF. All rights reserved.` | +| `DISABLE_TOOLS` | 要隐藏的工具 ID,以逗号分隔 | _(空;启用所有工具)_ | +| `DISABLE_GITHUB_STARS` | 页面加载时跳过获取 GitHub star 数量,并从 CSP 中移除 `api.github.com`。Simple Mode 构建始终会跳过。 | `false` | +| `SITE_URL` | 写入 canonical、hreflang 和站点地图链接的公开 URL。除非您希望搜索引擎将您的部署视为独立站点,否则请保持默认值。 | `https://www.bentopdf.com` | +| `ALLOW_INDEXING` | 使用自定义 `SITE_URL` 时,每个页面都会被标记为 `noindex`,以免您的副本在搜索结果中与 bentopdf.com 竞争。设为 `true` 可允许搜索引擎索引。 | `false` | + +WASM 模块 URL 已预先配置了 CDN 默认值,所有高级功能开箱即用。对于离线隔离或自托管部署,请覆盖这些值。 + +### 搜索引擎 + +默认情况下,每个页面都会让搜索引擎将 bentopdf.com 视为原始来源,因此您的部署不会作为重复内容出现。对于私有或内部实例,您无需做任何更改。 + +- **让您的实例完全不出现在搜索结果中:** 使用 `-e ROBOTS_NOINDEX=true` 运行容器。这只需要重启,无需重新构建。 +- **让您的实例在搜索结果中成为独立站点:** 使用 `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true` 构建。如果没有 `ALLOW_INDEXING=true`,自定义的 `SITE_URL` 会将每个页面标记为 `noindex`。 + +### Content-Security-Policy + +nginx 镜像自带强制执行的 `Content-Security-Policy` 响应头。CSP 的 `script-src`、`connect-src` 和 `font-src` 指令会在**构建时**根据上述 `VITE_*` URL 变量生成,您通过 `--build-arg` 传入的任何主机都会自动加入策略。 + +因此: + +- 如果在构建时覆盖 `VITE_CORS_PROXY_URL` 或 `VITE_WASM_*_URL`,CSP 会自动允许这些来源,无需额外配置。 +- 对于 `cdn.jsdelivr.net` 上的 URL,`script-src` 只允许精确到版本的包文件夹,例如 `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`,而不是整个 CDN。jsDelivr 提供任何公开的 npm 包或 GitHub 仓库,允许整个主机会让其中任何内容都能在您的实例上运行。其他主机上的 URL 则按来源允许。 +- 如果您在*运行时*通过应用内的高级设置页面配置自定义 WASM URL,这些来源**不在** CSP 中,浏览器会阻止对它们的请求。对于 `cdn.jsdelivr.net` 上同一个包的不同版本也是如此,因为只允许构建时设置的版本。运行时配置仅用于试验;要永久使用自定义 URL,请设置对应的 `VITE_*` 构建参数。 +- 覆盖全部三个 `VITE_WASM_*_URL` 值的离线隔离部署,也会从 CSP 中移除这些 `cdn.jsdelivr.net` 包文件夹(每个默认值都会被替换,而不是追加)。`cdn.jsdelivr.net` 上的 Tesseract OCR 默认值会保留在策略中,直到您同时设置三个 `VITE_TESSERACT_*` 值。同样,设置 `VITE_CORS_PROXY_URL` 会替换公共的 `bentopdf-cors-proxy.bentopdf.workers.dev` 默认值。 + +CSP 的 `script-src` 中包含 `'unsafe-eval'`,因为 LibreOffice WASM 运行时(用于 Word/Excel/PowerPoint 转换工具)和 wasm-vips 图像库(用于 PDF 转 TIFF)会在内部动态编译调度代码(通过 `new Function()`)。移除它会导致这些工具无法使用。如果您以 `SIMPLE_MODE`(不含 LibreOffice)构建,且不需要 PDF 转 TIFF,可以手动编辑生成的 `security-headers.conf` 去掉 `'unsafe-eval'`,以获得更严格的策略。 + +对于 OCR,将 `VITE_TESSERACT_*` 变量留空即可使用默认的在线资源,或者三个一起设置以用于自托管/离线 OCR。部分覆盖会被拒绝,因为 worker、核心运行时和 traineddata 目录必须相互匹配。要完全离线输出可搜索 PDF,还需设置 `VITE_OCR_FONT_BASE_URL`,让 OCR 文本层字体从您的内部服务器加载,而不是公共的 Noto 字体 URL。 + +`VITE_DEFAULT_LANGUAGE` 设置首次访问者的界面语言。支持的值:`en`、`ar`、`be`、`fr`、`de`、`es`、`zh`、`zh-TW`、`vi`、`tr`、`id`、`it`、`pt`、`nl`、`da`。用户仍可切换语言,这只会更改默认值。 + +示例: + +```bash +# Build with French as the default language +docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf . +docker run -d -p 3000:8080 bentopdf +``` + +### 自定义品牌 + +将默认的 BentoPDF 标志、名称和页脚文本替换为您自己的。将您的 Logo 文件放入 `public/` 文件夹(或使用现有图片),然后在构建时传入品牌变量: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +品牌定制在完整模式和 Simple Mode 下都可使用,并且可以与所有其他构建时选项组合。 + +### 禁用特定工具 + +出于合规或安全要求,可以在界面中隐藏工具。被禁用的工具会从主页、搜索结果、键盘快捷键和工作流构建器中移除。直接通过 URL 访问会显示"工具不可用"页面。 + +工具 ID 是去掉 `.html` 的页面 URL。例如,如果工具位于 `bentopdf.com/edit-pdf.html`,则 ID 为 `edit-pdf`。 + +#### 查找工具 ID + +最简单的方法:在 BentoPDF 中打开任意工具并查看 URL。路径的最后一部分(去掉 `.html`)就是工具 ID。 + +
+完整的工具 ID 列表 + +**编辑与批注:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages` + +**转换为 PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf` + +**从 PDF 转换:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text` + +**整理与管理:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions` + +**优化与修复:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline` + +**安全:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf` + +
+ +#### 方式 1:构建时(Docker 构建参数) + +```bash +docker build \ + --build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \ + -t bentopdf . +``` + +这会将禁用列表写入 JavaScript 包中。更改时需要重新构建。 + +#### 方式 2:运行时(config.json) + +将 `config.json` 文件挂载到提供服务的目录中,无需重新构建: + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] +} +``` + +```bash +docker run -d \ + -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +或者使用 Docker Compose: + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + volumes: + - ./config.json:/usr/share/nginx/html/config.json:ro +``` + +两种方式可以同时使用,列表会被合并。只要工具出现在任一列表中,就会被禁用。 + +#### 禁用编辑器功能 + +您还可以禁用 PDF 编辑器中的特定功能(例如涂黑、批注、表单),而无需禁用整个编辑器工具。在 `config.json` 中添加 `editorDisabledCategories`: + +```json +{ + "editorDisabledCategories": ["redaction", "annotation-stamp"] +} +``` + +
+完整的编辑器类别列表 + +**缩放:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level` + +**批注:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp` + +**形状:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline` + +**表单:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode` + +**涂黑:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear` + +**文档:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect` + +**页面:** `page`, `spread`, `rotate`, `scroll`, `navigation` + +**面板:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment` + +**工具:** `tools`, `pan`, `pointer`, `capture` + +**选择:** `selection`, `selection-copy` + +**历史记录:** `history`, `history-undo`, `history-redo` + +
+ +类别是分层级的:禁用父级(例如 `annotation`)会同时禁用它的所有子级。 + +### 禁用 GitHub Star 计数器 + +导航栏会显示实时的 GitHub star 数量,页面加载时从 `api.github.com` 获取。这是唯一一个不用于 PDF 功能的外部请求。可以在构建时禁用它,从包中移除获取代码,并从 Content-Security-Policy 中移除 `api.github.com`: + +```bash +docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf . +``` + +Simple Mode 构建(`bentopdf-simple`)始终会跳过 star 计数器,此参数只在商业版本或自定义的完整构建中需要。 + +### 自定义 WASM URL(离线隔离 / 自托管) + +> [!IMPORTANT] +> WASM URL 会在**构建时**写入 JavaScript。WASM 文件由**用户的浏览器**在运行时下载,Docker 在构建期间不会下载它们。对于离线隔离网络,您必须将 WASM 文件托管在浏览器可以访问的内部服务器上。 + +**完整的离线隔离工作流程:** + +```bash +# 1. On a machine WITH internet — download WASM packages +bash scripts/prepare-airgap.sh --list-ocr-languages +bash scripts/prepare-airgap.sh --search-ocr-language german + +# 2. Download WASM/OCR packages +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf + +# 3. Build the image with your internal server URLs +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . + +# 4. Export the image +docker save bentopdf -o bentopdf.tar + +# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network + +# 6. Inside the air-gapped network — load and run +docker load -i bentopdf.tar + +# Extract WASM packages to your internal web server +mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C /var/www/wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" /var/www/wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/ +cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +对于 `--ocr-languages`,请使用 `bash scripts/prepare-airgap.sh --list-ocr-languages` 打印出的代码,或使用 `bash scripts/prepare-airgap.sh --search-ocr-language ` 按名称搜索。当您使用受限的 OCR 子集构建时,请将相同的代码传给 `VITE_TESSERACT_AVAILABLE_LANGUAGES`,这样应用只会显示已打包的语言。要获得完整的离线 OCR 输出,还需托管随附的 `ocr-fonts/` 目录,并将 `VITE_OCR_FONT_BASE_URL` 指向它。 + +将变量设为空字符串即可禁用对应模块(用户必须通过高级设置手动配置)。 + +## 自定义端口 + +默认情况下,BentoPDF 在容器内监听 `8080` 端口。要更改此设置,请在运行时设置 `PORT` 环境变量: + +```bash +docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest +``` + +| 变量 | 说明 | 默认值 | +| ------ | --------------------- | ------ | +| `PORT` | 容器内 Nginx 监听端口 | `8080` | + +标准 Dockerfile 和 nonroot Dockerfile 都支持此设置。 + +## 自定义用户 ID(PUID/PGID) + +对于需要以特定非 root 用户运行的环境(NAS 设备、带安全上下文的 Kubernetes、组织策略),BentoPDF 提供了一个单独的 Dockerfile,支持 LSIO 风格的 PUID/PGID。 + +### 构建并运行 + +```bash +# Build the non-root image +docker build -f Dockerfile.nonroot -t bentopdf-nonroot . + +# Run with custom UID/GID +docker run -d \ + --name bentopdf \ + -p 3000:8080 \ + -e PUID=1000 \ + -e PGID=1000 \ + --restart unless-stopped \ + bentopdf-nonroot +``` + +### 环境变量 + +| 变量 | 说明 | 默认值 | +| -------------- | ------------------- | ------- | +| `PUID` | 运行时使用的用户 ID | `1000` | +| `PGID` | 运行时使用的组 ID | `1000` | +| `PORT` | Nginx 监听端口 | `8080` | +| `DISABLE_IPV6` | 禁用 IPv6 监听 | `false` | + +### Docker Compose + +```yaml +services: + bentopdf: + build: + context: . + dockerfile: Dockerfile.nonroot + container_name: bentopdf + ports: + - '3000:8080' + environment: + - PUID=1000 + - PGID=1000 + restart: unless-stopped +``` + +### 工作原理 + +容器以 root 身份启动,使用指定的 PUID/PGID 创建用户,调整所有可写目录的所有权,然后通过 `su-exec` 降低权限。nginx 进程完全以您指定的用户身份运行。 + +> [!NOTE] +> 标准 `Dockerfile` 使用 `nginx-unprivileged`(UID 101),推荐用于大多数部署。仅在需要特定 UID/GID 时才使用 `Dockerfile.nonroot`。 + +> [!WARNING] +> PUID/PGID 不能为 `0`(root)。入口脚本会验证输入,遇到无效值时会报错退出。 + +## 配合 Traefik(反向代理) + +```yaml +services: + traefik: + image: traefik:v2.10 + command: + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' + ports: + - '80:80' + - '443:443' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' + # Required headers for SharedArrayBuffer (LibreOffice WASM) + - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin' + - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp' + restart: unless-stopped +``` + +## 配合 Caddy(反向代理) + +```yaml +services: + caddy: + image: caddy:2 + ports: + - '80:80' + - '443:443' + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + restart: unless-stopped + +volumes: + caddy_data: +``` + +Caddyfile: + +``` +pdf.example.com { + reverse_proxy bentopdf:8080 + header Cross-Origin-Opener-Policy "same-origin" + header Cross-Origin-Embedder-Policy "require-corp" +} +``` + +## 资源限制 + +```yaml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + deploy: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.25' + memory: 128M +``` + +## Podman Quadlet(Systemd 集成) + +[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) 允许您将 Podman 容器作为 systemd 服务运行。这非常适合 Linux 系统上的生产部署。 + +### 基本 Quadlet 设置 + +在 `~/.config/containers/systemd/bentopdf.container`(用户级)或 `/etc/containers/systemd/bentopdf.container`(系统级)创建容器单元文件: + +```ini +[Unit] +Description=BentoPDF - Privacy-first PDF toolkit +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### 启用并启动 + +```bash +# Reload systemd to detect new unit +systemctl --user daemon-reload + +# Start the service +systemctl --user start bentopdf + +# Enable on boot +systemctl --user enable bentopdf + +# Check status +systemctl --user status bentopdf + +# View logs +journalctl --user -u bentopdf -f +``` + +> [!TIP] +> 对于系统级部署,请使用不带 `--user` 参数的 `systemctl`,并将文件放在 `/etc/containers/systemd/` 中。 + +### 带健康检查的 Quadlet + +```ini +[Unit] +Description=BentoPDF with health monitoring +After=network-online.target +Wants=network-online.target + +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry +HealthCmd=wget --spider -q http://localhost:8080 || exit 1 +HealthInterval=30s +HealthTimeout=10s +HealthRetries=3 + +[Service] +Restart=always +TimeoutStartSec=300 + +[Install] +WantedBy=default.target +``` + +### 使用 Quadlet 自动更新 + +Podman 可以在有新镜像时自动更新容器: + +```bash +# Enable auto-update timer +systemctl --user enable --now podman-auto-update.timer + +# Check for updates manually +podman auto-update + +# Dry run (check without updating) +podman auto-update --dry-run +``` + +### Quadlet 网络配置 + +如需自定义网络配置,请创建网络文件 `bentopdf.network`: + +```ini +[Network] +Subnet=10.89.0.0/24 +Gateway=10.89.0.1 +``` + +然后在您的容器文件中引用它: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +Network=bentopdf.network +``` + +## 更新 + +```bash +# Pull latest image +docker compose pull + +# Recreate container +docker compose up -d +``` diff --git a/docs/zh/self-hosting/hostinger.md b/docs/zh/self-hosting/hostinger.md new file mode 100644 index 00000000..0b700879 --- /dev/null +++ b/docs/zh/self-hosting/hostinger.md @@ -0,0 +1,266 @@ +# 部署到 Hostinger + +[Hostinger](https://hostinger.com) 是一家流行的共享主机提供商。本指南介绍如何将 BentoPDF 部署到 Hostinger 的共享主机。 + +## 前置条件 + +- 带有文件管理器访问权限的 Hostinger 主机套餐 +- 本地已安装用于构建的 Node.js + +## 第 1 步:构建项目 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +构建产物位于 `dist` 文件夹中。 + +## 第 2 步:上传到 Hostinger + +### 根域名部署 + +1. 登录您的 Hostinger 账户 +2. 前往 **File Manager** → **public_html** +3. **删除**所有现有文件(如有需要请先备份) +4. 将本地 `dist` 文件夹的全部内容**上传**到 `public_html` + +### 子目录部署 + +如果部署到子目录(例如 `yourdomain.com/pdf-tools/`): + +1. 使用正确的基础 URL 构建: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +2. 在 Hostinger 中创建文件夹: + - 前往 **File Manager** → **public_html** + - 新建文件夹:`pdf-tools` +3. 将 `dist` 的全部内容上传到 `public_html/pdf-tools/` + +## 第 3 步:创建 .htaccess 文件 + +在部署文件夹的根目录(`public_html` 或 `public_html/pdf-tools/`)中创建 `.htaccess` 文件: + +::: warning 重要 +子目录部署时,请将 `RewriteBase /` 改为 `RewriteBase /pdf-tools/`(或您的文件夹名称)。 +::: + +```apache +RewriteEngine On +RewriteBase / + +# ============================================ +# 1. SECURITY HEADERS (CRITICAL FOR WASM) +# ============================================ + + Header always set X-Frame-Options "SAMEORIGIN" + Header always set X-Content-Type-Options "nosniff" + Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # REQUIRED for soffice.js (SharedArrayBuffer) + Header always set Cross-Origin-Opener-Policy "same-origin" + Header always set Cross-Origin-Embedder-Policy "require-corp" + + +# ============================================ +# 2. BROWSER CACHING +# ============================================ + + ExpiresActive On + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType application/wasm "access plus 1 year" + ExpiresByType application/gzip "access plus 1 year" + ExpiresByType text/html "access plus 0 seconds" + + +# ============================================ +# 3. COMPRESSION (STANDARD) +# ============================================ +# Prevent server from double-compressing files +SetEnvIfNoCase Request_URI "\.gz$" no-gzip +SetEnvIfNoCase Request_URI "\.br$" no-gzip +SetEnvIfNoCase Request_URI "\.wasm$" no-gzip + + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/woff + AddOutputFilterByType DEFLATE font/ttf + + +# ============================================ +# 4. MIME TYPES & SPECIAL FILE HANDLING +# ============================================ +AddType application/javascript .js .mjs +AddType application/wasm .wasm +AddType font/woff2 .woff2 +AddType font/woff .woff +AddType image/webp .webp + +# Handle soffice.wasm.gz correctly + + ForceType application/wasm + Header set Content-Encoding "gzip" + Header set Cross-Origin-Resource-Policy "cross-origin" + Header append Vary Accept-Encoding + + +# Handle data.gz + + ForceType application/octet-stream + Header set Content-Encoding "gzip" + Header append Vary Accept-Encoding + + +# ============================================ +# 5. REDIRECTS & ROUTING +# ============================================ +# Canonical WWW (update domain as needed) +RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC] +RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301] + +# Force HTTPS +RewriteCond %{HTTPS} off +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slash (except for language root directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$ +RewriteCond %{REQUEST_URI} (.+)/$ +RewriteRule ^ %1 [R=301,L] + +# Existing files/dirs - serve directly +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# ============================================ +# 5.1. LANGUAGE ROUTES +# ============================================ +# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt +# English has no prefix - served from root + +# English prefix redirects to root (for SEO consistency) +RewriteRule ^en/?$ / [R=301,L] +RewriteRule ^en/(.+)$ /$1 [R=301,L] + +# Language prefix root (e.g., /de/ -> /de/index.html) +RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L] + +# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html) +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# ============================================ +# 5.5. DOCS ROUTING (VitePress) +# ============================================ +RewriteCond %{REQUEST_URI} ^/docs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}\.html -f +RewriteRule ^(.*)$ $1.html [L] + +# ============================================ +# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY) +# ============================================ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +# ============================================ +# 7. ERROR PAGES +# ============================================ +ErrorDocument 404 /404.html +``` + +## 子目录 .htaccess 示例 + +对于 `yourdomain.com/pdf-tools/`,请更新以下几行: + +```apache +RewriteBase /pdf-tools/ + +# ... (same content as above, but update paths) ... + +# Language prefix root +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L] + +# Language prefix with path +RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L] + +# Root level .html extension +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] + +ErrorDocument 404 /pdf-tools/404.html +``` + +## 故障排查 + +### WASM 文件无法加载 + +请确认 `.htaccess` 中已正确设置 MIME 类型: + +```apache +AddType application/wasm .wasm +``` + +### LibreOffice 工具无法使用 + +安全响应头对 SharedArrayBuffer 至关重要: + +```apache +Header always set Cross-Origin-Opener-Policy "same-origin" +Header always set Cross-Origin-Embedder-Policy "require-corp" +``` + +如果响应头没有生效,请联系 Hostinger 支持启用 `mod_headers`。 + +### 刷新页面出现 404 错误 + +请确保 `.html` 扩展名规则和语言路由配置正确。BentoPDF 使用静态 HTML 文件,而不是 SPA 路由: + +```apache +# Language routes serve actual files from language directories +RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f +RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L] + +# Root level pages +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^([^/]+)$ $1.html [L] +``` + +### 文件上传限制 + +Hostinger 可能对文件大小有限制。如果批量上传失败,请单独上传 WASM 文件。 diff --git a/docs/zh/self-hosting/index.md b/docs/zh/self-hosting/index.md new file mode 100644 index 00000000..7ed9442e --- /dev/null +++ b/docs/zh/self-hosting/index.md @@ -0,0 +1,538 @@ +# 自托管指南 + +BentoPDF 可以部署在您自己的基础设施上。本指南介绍多种部署方式。 + +## 使用 Docker / Podman 快速开始 + +自托管 BentoPDF 最快的方式: + +> [!TIP] +> BentoPDF 提供两种构建版本: +> +> - **自托管版本**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**营销页面元素(没有首页横幅、FAQ、用户评价和页脚)。适用于内部、团队或组织部署。它**不是**功能精简的“轻量”版本。 +> - **商业版本**:`ghcr.io/alam00000/bentopdf:latest`。完整的营销网站,bentopdf.com 本身以及运行面向公众部署的商业许可持有者使用该版本。 +> +> 如果拿不准,请拉取自托管版本。 + +> [!IMPORTANT] +> Office 文件转换需要 `SharedArrayBuffer`,这意味着应用必须同时满足跨源隔离,并通过安全上下文提供服务。官方镜像已经发送所需的 COOP/COEP 标头,但浏览器仍会在 `http://192.168.x.x` 这类普通 HTTP 局域网来源上禁用 `SharedArrayBuffer`。 +> +> `http://localhost` 仅用于同一设备上的测试。如果用户通过局域网 IP 或主机名访问 BentoPDF,请使用 HTTPS 终止连接。 + +```bash +# Docker +docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman +podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest +``` + +或者使用 Docker Compose / Podman Compose: + +```yaml +# docker-compose.yml +services: + bentopdf: + image: ghcr.io/alam00000/bentopdf-simple:latest + ports: + - '3000:8080' + restart: unless-stopped +``` + +```bash +# Docker Compose +docker compose up -d + +# Podman Compose +podman-compose up -d +``` + +## Podman Quadlet(Linux Systemd) + +将 BentoPDF 作为 systemd 服务运行。创建 `~/.config/containers/systemd/bentopdf.container`: + +```ini +[Container] +Image=ghcr.io/alam00000/bentopdf-simple:latest +ContainerName=bentopdf +PublishPort=3000:8080 +AutoUpdate=registry + +[Service] +Restart=always + +[Install] +WantedBy=default.target +``` + +```bash +systemctl --user daemon-reload +systemctl --user enable --now bentopdf +``` + +完整的 Quadlet 文档请参阅 [Docker 部署指南](/zh/self-hosting/docker)。 + +## 从源码构建 + +```bash +# Clone and build +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build + +# The built files are in the `dist` folder +``` + +## 配置选项 + +### 自托管版本(Simple Mode) + +自托管版本(`bentopdf-simple` 镜像,也称为 Simple Mode)与商业版本**功能完全相同**,所有 PDF 工具都在,行为也一致。它只是隐藏了仅适用于 bentopdf.com 本身或商业面向公众部署的营销页面元素。**它不是功能精简的“轻量”版本。** + +**自托管版本隐藏的内容**(仅外观层面,不会移除任何 PDF 功能): + +- 导航栏、首页横幅、功能介绍区、FAQ、用户评价、页脚 +- 页面标题更新为“PDF 工具” + +**自托管版本保留的内容**(所有真正处理 PDF 的部分): + +- 所有 PDF 工具(合并、拆分、编辑、签名、OCR、Office 转换等) +- 自定义品牌支持,以及所有构建时和运行时配置 + +商业版本(`ghcr.io/alam00000/bentopdf:latest`)是 bentopdf.com 本身所用的版本,也供运行面向公众部署的商业许可持有者使用。它额外包含首页横幅、FAQ、用户评价和页脚,这些内容在内部工具中没有意义。 + +如果您为团队、组织自托管 BentoPDF,或将其用作内部工具,请拉取自托管版本: + +```bash +# Use the pre-built image (recommended) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Or build it yourself +SIMPLE_MODE=true npm run build +``` + +详情请参阅 [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md)。 + +### 商业版本(使用自有品牌的面向公众部署) + +商业版本(`bentopdf` 镜像,没有 `-simple` 后缀)是 bentopdf.com 本身所用的版本。除所有 PDF 工具外,它还包含完整的营销网站(首页横幅、功能介绍、FAQ、用户评价、页脚)。当您想以自有品牌**将 BentoPDF 部署为面向公众的 PDF 服务**时,请使用此版本,例如: + +- 您在自己的域名上为最终用户提供托管的 SaaS 服务 +- 您想要完整的落地页体验(营销板块加工具),而不只是单纯的工具界面 +- 您是商业许可持有者,将 BentoPDF 嵌入商业产品 + +**直接运行**(BentoPDF 品牌,适合预览该版本): + +```bash +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest +``` + +**使用自有品牌构建**(典型的商业工作流): + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \ + -t acmepdf . + +docker run -p 3000:8080 acmepdf +``` + +其他所有构建时选项(`BASE_URL`、`VITE_DEFAULT_LANGUAGE`、`DISABLE_TOOLS`、WASM URL 覆盖等)的用法与自托管版本相同。 + +::: warning 许可 +BentoPDF 的两种许可方式都允许运行商业版本: + +- **AGPL-3.0**(免费):如果您的部署以 AGPL 公开完整源代码(包括任何品牌修改和周边业务逻辑),则允许使用。 +- **商业许可**($79 终身):闭源或专有部署需要此许可,即您不公开品牌分支或业务代码的情况。 + +完整对比请参阅[许可页面](https://www.bentopdf.com/licensing)。采用 AGPL 许可的 WASM 模块(PyMuPDF、Ghostscript、CoherentPDF)在运行时从 CDN 加载,因此不会进入您的镜像,也不会改变您的许可状况。 +::: + +### Base URL + +部署到子目录: + +```bash +BASE_URL=/pdf-tools/ npm run build +``` + +### 自定义品牌 + +在构建时将默认的 BentoPDF 标志、名称和页脚文字替换为您自己的: + +| 变量 | 说明 | 默认值 | +| ------------------ | --------------------------- | --------------------------------------- | +| `VITE_BRAND_NAME` | 显示在页眉和页脚的品牌名称 | `BentoPDF` | +| `VITE_BRAND_LOGO` | 相对于 `public/` 的标志路径 | `images/favicon-no-bg.svg` | +| `VITE_FOOTER_TEXT` | 自定义页脚/版权文字 | `© 2026 BentoPDF. All rights reserved.` | + +```bash +# Place your logo in public/, then build +VITE_BRAND_NAME="AcmePDF" \ +VITE_BRAND_LOGO="images/acme-logo.svg" \ +VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ +npm run build +``` + +或通过 Docker: + +```bash +docker build \ + --build-arg VITE_BRAND_NAME="AcmePDF" \ + --build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \ + --build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \ + -t acmepdf . +``` + +品牌定制在完整模式和 Simple Mode 下均可使用,并可与所有其他构建时选项(`BASE_URL`、`SIMPLE_MODE`、`VITE_DEFAULT_LANGUAGE`)组合使用。 + +### 禁用特定工具 + +出于合规或安全考虑,可以隐藏个别工具。被禁用的工具会从首页、搜索、快捷键、工作流构建器以及直接 URL 访问中移除。 + +工具 ID 即页面 URL 去掉 `.html` 的部分,打开任意工具并查看 URL 即可(例如 `edit-pdf`、`sign-pdf`、`encrypt-pdf`)。 + +**构建时**(写入打包产物): + +```bash +DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build +``` + +**运行时**(无需重新构建,挂载 `config.json`): + +```json +{ + "disabledTools": ["edit-pdf", "sign-pdf"] +} +``` + +```bash +docker run -d -p 3000:8080 \ + -v ./config.json:/usr/share/nginx/html/config.json:ro \ + ghcr.io/alam00000/bentopdf-simple:latest +``` + +两种方法可以同时使用,列表会合并。 + +您还可以在 `config.json` 中添加 `editorDisabledCategories`,在不禁用整个工具的情况下禁用 PDF 编辑器内的特定功能(例如涂黑)。完整的类别列表请参阅 [Docker 指南](/zh/self-hosting/docker#禁用编辑器功能)。 + +## 部署指南 + +选择您的平台: + +- [Vercel](/zh/self-hosting/vercel) +- [Netlify](/zh/self-hosting/netlify) +- [Cloudflare Pages](/zh/self-hosting/cloudflare) +- [AWS S3 + CloudFront](/zh/self-hosting/aws) +- [Hostinger](/zh/self-hosting/hostinger) +- [Nginx](/zh/self-hosting/nginx) +- [Apache](/zh/self-hosting/apache) +- [Docker](/zh/self-hosting/docker) +- [Kubernetes](/zh/self-hosting/kubernetes) +- [CORS 代理](/zh/self-hosting/cors-proxy):数字签名所必需 + +## 常见问题 + +### Word / ODT / Excel / PowerPoint 转 PDF 卡住(SharedArrayBuffer 不可用) + +**现象**:基于 LibreOffice 的文档转换(Word、ODT、Excel、PowerPoint 转 PDF)在约 55% 处卡住或无法启动。浏览器控制台可能显示: + +> `ReferenceError: SharedArrayBuffer is not defined` + +……或者 `window.crossOriginIsolated` 返回 `false`,或者 WASM 编译报告 `expected magic word 00 61 73 6d, found 1f 8b 08 08`。 + +**原因**:LibreOffice WASM 需要 `SharedArrayBuffer`,而浏览器只有在页面**跨源隔离**且通过**安全上下文**提供时才会启用它。这意味着必须同时满足两点: + +1. 每个响应都包含以下两个标头: + - `Cross-Origin-Embedder-Policy: require-corp` + - `Cross-Origin-Opener-Policy: same-origin` +2. 页面通过 `https://...` 或 `http://localhost` 提供。局域网 IP 上的普通 HTTP(例如 `http://192.168.x.x`)不属于安全上下文,浏览器会在那里禁用 `SharedArrayBuffer`。 + +`00 61 73 6d / 1f 8b 08 08` 不匹配是另一个子症状:预压缩的 `.wasm.gz` / `.data.gz` 文件缺少 `Content-Encoding: gzip` 响应标头,因此浏览器收到的是未解压的原始 gzip 字节,而不是 WASM。 + +**解决方法**:请参阅对应平台的部署指南以获取确切配置: + +- [Nginx →](/zh/self-hosting/nginx#word-odt-excel-转-pdf-无法使用) +- [Apache →](/zh/self-hosting/apache#word-odt-excel-转-pdf-无法使用) +- [AWS S3 + CloudFront →](/zh/self-hosting/aws#第-3b-步-响应头策略-libreoffice-wasm-必需) +- [Cloudflare Pages →](/zh/self-hosting/cloudflare#配置文件)(`_headers` 文件) +- [Netlify →](/zh/self-hosting/netlify#word-odt-excel-转-pdf-卡在-55)(`netlify.toml`) +- [Vercel →](/zh/self-hosting/vercel#word-odt-excel-转-pdf-无法使用)(`vercel.json`) +- [Hostinger →](/zh/self-hosting/hostinger#libreoffice-工具无法使用)(`.htaccess`) +- [Kubernetes →](/zh/self-hosting/kubernetes#确保-sharedarraybuffer-标头仍然有效-ingress-gateway) +- **Docker**:由内置的 nginx 配置自动处理,无需任何操作。 + +**验证**:在任意 BentoPDF 页面打开开发者工具控制台并运行: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +如果页面使用 HTTPS 或 `http://localhost`,并且每个响应都带有 COEP/COOP 标头,两项检查都会通过。如果您使用的是 `http://192.168.x.x` 或其他非回环 HTTP 来源,请使用 HTTPS 终止连接,仅靠标头无法解决。 + +### `.mjs` 文件以 `application/octet-stream` 提供 + +**现象**:签署 PDF、Form Filler 或某些其他工具显示空白查看器或无法加载。浏览器控制台报告: + +> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.` + +**原因**:您的 Web 服务器或反向代理没有 `.mjs` 文件的 MIME 类型映射(内置的 PDF 查看器使用该扩展名的 ES 模块)。许多默认服务器配置会将无法识别的扩展名归为 `application/octet-stream`,浏览器拒绝将其作为 ES 模块执行。 + +**解决方法**:请参阅对应平台的部署指南以获取确切的配置片段: + +- [Nginx →](/zh/self-hosting/nginx#签署-pdf-或-form-filler-显示空白查看器-mjs-mime-错误) +- [Apache →](/zh/self-hosting/apache#签名-pdf-或表单填写器显示空白查看器-mjs-mime-错误) +- [AWS S3 + CloudFront →](/zh/self-hosting/aws#第-2-步-构建并上传)(参见 `aws s3 cp ... --include "*.mjs"`) +- [Kubernetes →](/zh/self-hosting/kubernetes#mjs-mime-类型错误-签署-pdf-form-filler-iframe-空白) +- **Docker、Vercel、Netlify、Cloudflare Pages、Hostinger**:自动处理,无需任何操作。 + +**验证**:打开开发者工具的 Network 标签,找到失败的 `.mjs` 请求,检查 `Content-Type` 响应标头。它应为 `application/javascript`。如果仍是 `application/octet-stream`,可能是外层的反向代理或 CDN 重新判断了类型,请检查服务链路中的每一层。 + +## WASM 配置(AGPL 组件) + +BentoPDF 的源代码**不捆绑**采用 AGPL 许可的处理库,但**预先配置了 CDN URL**,因此所有功能开箱即用,无需手动设置。 + +::: tip 默认零配置 +自 v2.0.0 起,WASM 模块已通过环境变量预先配置为从 jsDelivr CDN 加载。所有高级功能无需任何用户配置即可立即使用。 +::: + +| 组件 | 许可 | 功能 | +| --------------- | -------- | ------------------------------------------ | +| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS 转换、图片提取、表格提取 | +| **Ghostscript** | AGPL-3.0 | PDF/A 转换、压缩、纠偏、光栅化 | +| **CoherentPDF** | AGPL-3.0 | 目录、附件、带书签的 PDF 合并 | + +### 默认环境变量 + +这些变量设置在 `.env.production` 中,并写入构建产物: + +```bash +VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/ +VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/ +VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/ +VITE_TESSERACT_WORKER_URL= +VITE_TESSERACT_CORE_URL= +VITE_TESSERACT_LANG_URL= +VITE_TESSERACT_AVAILABLE_LANGUAGES= +VITE_OCR_FONT_BASE_URL= +``` + +### 覆盖 WASM URL + +您可以在构建时为自定义部署覆盖默认值: + +```bash +# Via Docker build args +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \ + --build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \ + --build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \ + -t bentopdf . + +# Or via .env.production before building from source +VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build +``` + +要完全禁用某个模块(需要用户通过高级设置手动配置),请将其变量设为空字符串。 + +对于 OCR,要么将所有 `VITE_TESSERACT_*` 变量留空并使用默认的在线资源,要么同时设置 worker、core 和 lang 的 URL,以实现自托管或离线 OCR。如果您只捆绑了特定的 OCR 语言,还请将 `VITE_TESSERACT_AVAILABLE_LANGUAGES` 设为相同的逗号分隔代码,这样界面只会提供已安装的语言,选择不支持的语言时会给出明确的错误信息。若要完全离线生成可搜索的 PDF,还需将 `VITE_OCR_FONT_BASE_URL` 设为提供内置 OCR 字体的内部目录。 + +用户也可以随时通过界面中的**高级设置**覆盖这些默认值,浏览器中保存的用户覆盖设置优先于环境默认值。 + +### 离线隔离(Air-Gapped)部署 + +适用于没有互联网访问的网络(政府、医疗、金融等)。WASM URL 在**构建时**写入 JavaScript,而实际的 WASM 文件由**用户的浏览器**在运行时下载。因此您需要在有网络的机器上准备好所有内容,再传输到隔离网络中。 + +#### 自动化脚本(推荐) + +内置的 `prepare-airgap.sh` 脚本可自动完成整个流程:下载 WASM 包、构建 Docker 镜像,并生成附带安装脚本的独立压缩包。 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +# Show supported OCR language codes (for --ocr-languages) +bash scripts/prepare-airgap.sh --list-ocr-languages + +# Search OCR language codes by name or abbreviation +bash scripts/prepare-airgap.sh --search-ocr-language german + +# Interactive mode — prompts for all options +bash scripts/prepare-airgap.sh + +# Or fully automated +bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm +``` + +这会生成如下的压缩包目录: + +``` +bentopdf-airgap-bundle/ + bentopdf.tar # Docker image + *.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract) + tesseract-langdata/ # OCR traineddata files + ocr-fonts/ # OCR text-layer font files + setup.sh # Setup script for the air-gapped side + README.md # Instructions +``` + +通过 USB、内部制品库或其他获批方式将该目录传输到隔离网络中,然后运行附带的安装脚本: + +```bash +cd bentopdf-airgap-bundle +bash setup.sh +``` + +安装脚本会加载 Docker 镜像、解压 WASM 文件,并可选择启动容器。 + +**脚本选项:** + +| 标志 | 说明 | 默认值 | +| ------------------------------ | -------------------------------------- | -------------------------- | +| `--wasm-base-url ` | WASM 文件在内部托管的位置 | _(必填,缺失时会提示)_ | +| `--image-name ` | Docker 镜像标签 | `bentopdf` | +| `--output-dir ` | 输出压缩包目录 | `./bentopdf-airgap-bundle` | +| `--simple-mode` | 启用 Simple Mode | 关闭 | +| `--base-url ` | 子目录基础 URL(例如 `/pdf/`) | `/` | +| `--language ` | 默认界面语言(例如 `fr`、`de`) | _(无)_ | +| `--brand-name ` | 自定义品牌名称 | _(无)_ | +| `--brand-logo ` | 相对于 `public/` 的标志路径 | _(无)_ | +| `--footer-text ` | 自定义页脚文字 | _(无)_ | +| `--ocr-languages ` | 要捆绑的 OCR 语言,以逗号分隔 | `eng` | +| `--list-ocr-languages` | 打印支持的 OCR 代码和名称后退出 | 关闭 | +| `--search-ocr-language ` | 按名称或缩写搜索 OCR 代码 | 关闭 | +| `--dockerfile ` | 要使用的 Dockerfile | `Dockerfile` | +| `--skip-docker` | 跳过 Docker 构建和导出 | 关闭 | +| `--skip-wasm` | 跳过 WASM 下载(复用现有 `.tgz` 文件) | 关闭 | + +交互式提示也接受 `list` 以打印完整的 Tesseract 支持代码列表,以及 `search ` 以查找匹配项,例如 `search german` 或 `search chi`。 + +::: warning 同源要求 +WASM 文件必须与 BentoPDF 应用从**同一来源**提供。Web Worker 使用 `importScripts()`,无法跨源加载脚本。例如,如果 BentoPDF 运行在 `https://internal.example.com`,则 WASM 基础 URL 也应为 `https://internal.example.com/wasm`。 +::: + +#### 手动步骤 + +
+如果您不想使用脚本,希望手动操作 + +**步骤 1:下载 WASM 和 OCR 包**(在有网络的机器上) + +```bash +npm pack @bentopdf/pymupdf-wasm@0.11.14 +npm pack @bentopdf/gs-wasm +npm pack coherentpdf +npm pack tesseract.js@7.0.0 +npm pack tesseract.js-core@7.0.0 +mkdir -p tesseract-langdata +curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz +mkdir -p ocr-fonts +curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf +``` + +**步骤 2:使用内部 URL 构建 Docker 镜像** + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf + +docker build \ + --build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \ + --build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \ + --build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \ + --build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \ + --build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \ + --build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \ + --build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \ + -t bentopdf . +``` + +**步骤 3:导出 Docker 镜像** + +```bash +docker save bentopdf -o bentopdf.tar +``` + +**步骤 4:传输到隔离网络中** + +通过 USB、内部制品库或其他获批的传输方式复制: + +- `bentopdf.tar`:Docker 镜像 +- 步骤 1 中的五个 `.tgz` WASM/OCR 包 +- 步骤 1 中的 `tesseract-langdata/` 目录 +- 步骤 1 中的 `ocr-fonts/` 目录 + +**步骤 5:在隔离网络内部署** + +```bash +# Load the Docker image +docker load -i bentopdf.tar + +# Extract WASM packages +mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts +tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1 +tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1 +tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1 +TEMP_TESS=$(mktemp -d) +tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS" +cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js +rm -rf "$TEMP_TESS" +tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1 +cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/ +cp ./ocr-fonts/* ./wasm/ocr/fonts/ + +# Run BentoPDF +docker run -d -p 3000:8080 --restart unless-stopped bentopdf +``` + +请确保文件可通过您在步骤 2 中配置的 URL 访问,包括 `.../ocr/worker.min.js`、`.../ocr/core`、`.../ocr/lang-data` 和 `.../ocr/fonts`。 + +
+ +::: info 从源码而非 Docker 构建? +在运行 `npm run build` 之前,在 `.env.production` 中设置这些变量: + +```bash +VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ +VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ +VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ +VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js +VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core +VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data +VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts +``` + +::: + +### 托管您自己的 WASM 代理 + +如果您需要通过正确的 CORS 标头提供 AGPL WASM 文件,可以部署一个简单的代理。示例实现请参阅 [Cloudflare WASM 代理指南](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md)。 + +::: tip 为什么要分离? +这种分离可以确保: + +- 为商业用户提供清晰的法律合规性 +- BentoPDF 核心保持其双重许可(AGPL-3.0 / 商业) +- WASM 文件在运行时加载,而不是捆绑在源代码中 + ::: + +## 系统要求 + +| 要求 | 最低配置 | +| ---- | --------------------------------- | +| 存储 | 约 100 MB(不含 AGPL 模块的核心) | +| 内存 | 512 MB | +| CPU | 任意现代处理器 | + +::: tip +BentoPDF 是静态站点,不需要数据库或后端服务器! +::: diff --git a/docs/zh/self-hosting/kubernetes.md b/docs/zh/self-hosting/kubernetes.md new file mode 100644 index 00000000..61b79c0b --- /dev/null +++ b/docs/zh/self-hosting/kubernetes.md @@ -0,0 +1,211 @@ +# 使用 Kubernetes 部署 + +对于静态站点来说,Kubernetes 可能有些大材小用,但如果您已经统一采用 Helm + GitOps,它会非常合适。 + +> [!IMPORTANT] +> **Office 文件转换所需的标头** +> +> 基于 LibreOffice 的工具(Word、Excel、PowerPoint 转换)需要以下 HTTP 标头来支持 `SharedArrayBuffer`: +> +> - `Cross-Origin-Opener-Policy: same-origin` +> - `Cross-Origin-Embedder-Policy: require-corp` +> +> 官方 BentoPDF nginx 镜像已包含这些标头。在 Kubernetes 中,**Ingress/Gateway 控制器同样是反向代理**,因此请确保这些标头被保留(或在边缘层添加)。 + +## 前置条件 + +- Kubernetes 集群 +- Helm v3 +- 一个 BentoPDF nginx 镜像(例如 `ghcr.io/alam00000/bentopdf:`),监听 **8080 端口** + +## 使用 Helm 部署 + +### 从本仓库安装(本地 chart) + +```bash +kubectl create namespace bentopdf + +helm upgrade --install bentopdf /path/to/bentopdf/chart \ + --namespace bentopdf \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +### 从 GHCR 安装(OCI chart) + +如果 chart 已作为 OCI 制品发布到 GHCR: + +```bash +export GHCR_USERNAME="" + +helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \ + --namespace bentopdf \ + --create-namespace \ + --version 0.1.0 \ + --set image.repository=ghcr.io/alam00000/bentopdf \ + --set image.tag=latest +``` + +## 对外暴露 + +### Port-forward(快速测试) + +```bash +kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080 +``` + +### Ingress(可选) + +启用 Ingress(以 nginx-ingress 为例): + +```yaml +ingress: + enabled: true + className: nginx + hosts: + - host: pdf.example.com + paths: + - path: / + pathType: Prefix +``` + +### Gateway API(可选) + +此 chart 支持 Gateway API 的 `Gateway` 和 `HTTPRoute`。 + +示例(Cloudflare Gateway API operator): + +```yaml +gateway: + enabled: true + name: bento-tunnel + namespace: bentopdf + gatewayClassName: cloudflare + +httpRoute: + enabled: true + parentRefs: + - name: bento-tunnel + namespace: bentopdf + sectionName: http + hostnames: + - pdfs.example.com +``` + +## 确保 SharedArrayBuffer 标头仍然有效(Ingress/Gateway) + +### 正常情况下会发生什么 + +BentoPDF 的 nginx 配置会设置所需的响应标头。大多数 Ingress/Gateway 控制器会**原样透传上游响应标头**。 + +### 什么情况会导致失效 + +- 控制器或边缘策略**覆盖**或**移除**了响应标头 +- “安全标头”中间件设置了不同的 COOP/COEP 值 + +### 如何验证 + +针对您的公开端点运行: + +```bash +curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy' +``` + +您应该看到: + +- `Cross-Origin-Opener-Policy: same-origin` +- `Cross-Origin-Embedder-Policy: require-corp` + +### 如果您的 Ingress 控制器没有保留这些标头 + +在边缘层添加标头(具体做法取决于控制器)。**nginx-ingress** 示例: + +```yaml +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Embedder-Policy "require-corp" always; +``` + +## `.mjs` MIME 类型错误(签署 PDF / Form Filler iframe 空白) + +如果浏览器控制台在 `.mjs` 请求上显示 `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"`,说明 BentoPDF nginx 前面的 Ingress/Gateway 控制器把上游的 `Content-Type` 标头替换成了 `application/octet-stream`。 + +BentoPDF 镜像中的 nginx 本身已将 `.mjs` 作为 `application/javascript` 提供。解决方法是阻止控制器移除或替换它。对于 nginx-ingress: + +```yaml +ingress: + annotations: + nginx.ingress.kubernetes.io/configuration-snippet: | + location ~* \.mjs$ { + types {} default_type application/javascript; + } +``` + +或者在 Gateway API 中使用 `ResponseHeaderModifier` 过滤器,为 `.mjs` 路径设置 `Content-Type: application/javascript`。使用开发者工具的 Network 标签验证:失败的 `.mjs` 请求现在应显示 `content-type: application/javascript`。 + +### 如果您使用 Gateway API 并想强制添加标头 + +Gateway API 支持 `ResponseHeaderModifier` 过滤器。您可以将其附加到 `httpRoute.rules[*].filters`: + +```yaml +httpRoute: + enabled: true + hostnames: [pdf.example.com] + parentRefs: + - name: bento-tunnel + namespace: misc + sectionName: http + rules: + - matches: + - path: { type: PathPrefix, value: / } + filters: + - type: ResponseHeaderModifier + responseHeaderModifier: + set: + - name: Cross-Origin-Opener-Policy + value: same-origin + - name: Cross-Origin-Embedder-Policy + value: require-corp +``` + +对特定过滤器的支持取决于您的 Gateway 控制器;如果某个过滤器被忽略,请改为在边缘或控制器层添加标头。 + +## 禁用特定工具 + +使用 ConfigMap 在运行时禁用工具,无需重新构建镜像: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: bentopdf-config + namespace: bentopdf +data: + config.json: | + { + "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"] + } +``` + +将其挂载到提供服务的目录中: + +```yaml +spec: + containers: + - name: bentopdf + volumeMounts: + - name: config + mountPath: /usr/share/nginx/html/config.json + subPath: config.json + readOnly: true + volumes: + - name: config + configMap: + name: bentopdf-config +``` + +工具 ID 即页面 URL 去掉 `.html` 的部分,打开任意工具并查看 URL 即可(例如 `edit-pdf`、`merge-pdf`、`compress-pdf`)。被禁用的工具会从首页、搜索、快捷键、工作流构建器以及直接 URL 访问中隐藏。完整选项请参阅 [Docker 指南](/zh/self-hosting/docker#禁用特定工具)。 diff --git a/docs/zh/self-hosting/netlify.md b/docs/zh/self-hosting/netlify.md new file mode 100644 index 00000000..f7ecb9cc --- /dev/null +++ b/docs/zh/self-hosting/netlify.md @@ -0,0 +1,139 @@ +# 部署到 Netlify + +[Netlify](https://netlify.com) 提供出色的静态站点托管,并有慷慨的免费额度。 + +## 一键部署 + +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf) + +## 手动部署 + +### 步骤 1:连接仓库 + +1. 登录 [Netlify](https://app.netlify.com) +2. 点击 "Add new site" → "Import an existing project" +3. 连接您的 GitHub 账户 +4. 选择您的 BentoPDF 分支 + +### 步骤 2:配置构建设置 + +| 设置 | 值 | +| --------- | --------------- | +| 构建命令 | `npm run build` | +| 发布目录 | `dist` | +| Node 版本 | 18+ | + +### 步骤 3:部署 + +点击 "Deploy site" 并等待构建完成。 + +## 配置文件 + +在项目根目录创建 `netlify.toml`: + +```toml +[build] + command = "npm run build" + publish = "dist" + +[build.environment] + NODE_VERSION = "18" + +# Required security headers for SharedArrayBuffer (used by LibreOffice WASM) +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" + Cross-Origin-Resource-Policy = "cross-origin" + +# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.wasm.gz" + [headers.values] + Content-Type = "application/wasm" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding +[[headers]] + for = "/libreoffice-wasm/soffice.data.gz" + [headers.values] + Content-Type = "application/octet-stream" + Content-Encoding = "gzip" + Cache-Control = "public, max-age=31536000, immutable" + +# Cache other WASM files +[[headers]] + for = "*.wasm" + [headers.values] + Cache-Control = "public, max-age=31536000, immutable" + Content-Type = "application/wasm" + +# SPA routing +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +::: warning 重要 +Word/ODT/Excel/PowerPoint 转 PDF 需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 标头。缺少它们时,`SharedArrayBuffer` 不可用,LibreOffice WASM 引擎将无法初始化。 + +`.wasm.gz` 和 `.data.gz` 文件上的 `Content-Encoding: gzip` 标头会告诉浏览器自动解压。缺少这些标头时,浏览器收到的是原始 gzip 字节,WASM 编译会失败。 +::: + +## 环境变量 + +在 Site settings → Environment variables 中设置: + +| 变量 | 说明 | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | 设为 `true` 以使用精简构建 | +| `VITE_BRAND_NAME` | 自定义品牌名称(替换 "BentoPDF") | +| `VITE_BRAND_LOGO` | 相对于 `public/` 的标志路径(例如 `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | 自定义页脚/版权文字 | +| `VITE_DEFAULT_LANGUAGE` | 默认界面语言(例如 `fr`、`de`、`es`) | + +## 自定义域名 + +1. 前往 Site settings → Domain management +2. 点击 "Add custom domain" +3. 按照说明配置 DNS + +## 大型媒体文件 + +对于较大的 WASM 文件,可以考虑启用 [Netlify Large Media](https://docs.netlify.com/large-media/overview/): + +```bash +netlify lm:setup +git lfs track "*.wasm" +``` + +## 故障排除 + +### Word/ODT/Excel 转 PDF 卡在 55% + +如果文档转换卡在 55%,请打开开发者工具控制台并检查: + +```js +console.log(window.crossOriginIsolated); // should be true +console.log(typeof SharedArrayBuffer); // should be "function" +``` + +如果 `crossOriginIsolated` 为 `false`,说明 `netlify.toml` 中的 COEP/COOP 标头没有生效。请确认该文件位于项目根目录,然后重新部署。 + +如果您在控制台看到 `expected magic word 00 61 73 6d, found 1f 8b 08 08`,说明 `.wasm.gz` 文件缺少 `Content-Encoding: gzip` 标头。请确保 `netlify.toml` 中包含 `soffice.wasm.gz` 和 `soffice.data.gz` 的 `[[headers]]` 块。 + +### 构建失败 + +检查 Node 版本兼容性: + +```toml +[build.environment] + NODE_VERSION = "20" +``` + +### 首次加载缓慢 + +在 Site settings → Build & deploy → Asset optimization 中启用资源优化。 diff --git a/docs/zh/self-hosting/nginx.md b/docs/zh/self-hosting/nginx.md new file mode 100644 index 00000000..80462c1a --- /dev/null +++ b/docs/zh/self-hosting/nginx.md @@ -0,0 +1,232 @@ +# 使用 Nginx 部署 + +使用 Nginx 在您自己的服务器上托管 BentoPDF。 + +## 前置条件 + +- Ubuntu/Debian 服务器 +- 已安装 Nginx +- SSL 证书(推荐:Let's Encrypt) + +## 步骤 1:构建项目 + +```bash +git clone https://github.com/alam00000/bentopdf.git +cd bentopdf +npm install +npm run build +``` + +如需自定义品牌,请在构建前设置环境变量: + +```bash +VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build +``` + +## 步骤 2:复制文件 + +```bash +sudo mkdir -p /var/www/bentopdf +sudo cp -r dist/* /var/www/bentopdf/ +sudo chown -R www-data:www-data /var/www/bentopdf +``` + +## 步骤 3:Nginx 配置 + +创建 `/etc/nginx/sites-available/bentopdf`: + +```nginx +server { + listen 80; + server_name your-domain.com; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL Configuration + ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; + + root /var/www/bentopdf; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm; + gzip_min_length 1000; + + # WASM MIME type + types { + application/wasm wasm; + } + + # Required headers for SharedArrayBuffer (LibreOffice WASM) + # These must be on every response - especially HTML pages + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # Pre-compressed LibreOffice WASM binary + location ~* /libreoffice-wasm/soffice\.wasm\.gz$ { + gzip off; + types {} default_type application/wasm; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Pre-compressed LibreOffice WASM data + location ~* /libreoffice-wasm/soffice\.data\.gz$ { + gzip off; + types {} default_type application/octet-stream; + add_header Content-Encoding gzip; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } + + # SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ /index.html; + add_header Cross-Origin-Embedder-Policy "require-corp" always; + add_header Cross-Origin-Opener-Policy "same-origin" always; + } +} +``` + +## 步骤 4:启用站点 + +```bash +sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +## 步骤 5:使用 Let's Encrypt 配置 SSL + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d your-domain.com +``` + +## 子目录部署 + +要托管在 `/pdf/`: + +```nginx +location /pdf/ { + alias /var/www/bentopdf/; + try_files $uri $uri/ /pdf/index.html; +} +``` + +构建命令: + +```bash +BASE_URL=/pdf/ npm run build +``` + +## 性能调优 + +添加到 `nginx.conf`: + +```nginx +http { + # Enable sendfile + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + # Increase buffer sizes + client_max_body_size 100M; + + # Worker connections + worker_connections 2048; +} +``` + +## 故障排除 + +### WASM 无法加载 + +确保已设置 MIME 类型: + +```nginx +types { + application/wasm wasm; +} +``` + +### 签署 PDF 或 Form Filler 显示空白查看器(`.mjs` MIME 错误) + +如果浏览器控制台显示: + +``` +Failed to load module script: The server responded with a non-JavaScript +MIME type of "application/octet-stream". Strict MIME type checking is +enforced for module scripts per HTML spec. +``` + +……并且失败的请求以 `.mjs` 结尾,说明您的 nginx 缺少 `.mjs → application/javascript` 的映射。内置的 PDF 查看器(签署 PDF、Form Filler 和其他一些工具使用)附带扩展名为 `.mjs` 的 ES 模块文件,而 nginx 默认的 `mime.types` 不包含它们。 + +解决方法:在 `/etc/nginx/mime.types` 中,将 `mjs` 加到现有的 `application/javascript` 行: + +```nginx +application/javascript js mjs; +``` + +> 请勿再追加*第二行* `application/javascript`。nginx 逐行解析 `mime.types`,每种类型只有一个扩展名映射生效,因此在某些版本中第二行会被静默忽略。请编辑现有的行,把 `mjs` 与 `js` 放在一起。 + +或者在您的 server 块内局部覆盖(无需修改全局文件): + +```nginx +types { + application/javascript js mjs; + application/wasm wasm; +} +``` + +修改后重新加载 nginx: + +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +确认方法:在浏览器开发者工具的 Network 标签中,找到失败的 `.mjs` 请求并检查 `Content-Type` 响应标头。它现在应为 `application/javascript`,而不是 `application/octet-stream`。 + +### Word/ODT/Excel 转 PDF 无法使用 + +LibreOffice WASM 需要 `SharedArrayBuffer`,而这需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 标头。它还需要安全上下文,因此 `http://localhost` 可用于本地测试,但 `http://192.168.x.x` 或其他局域网 IP 通常需要 HTTPS。请注意,`location` 块中的 nginx `add_header` 指令会**覆盖**server 级别的 `add_header` 指令,而不是合并。每个带有自己 `add_header` 的 `location` 块都必须包含 COEP/COOP 标头。 + +验证方法: + +```bash +curl -I https://your-domain.com/ | grep -i cross-origin +``` + +如果 nginx 前面有反向代理,请确保它保留这些标头。 + +### 502 Bad Gateway + +查看 Nginx 错误日志: + +```bash +sudo tail -f /var/log/nginx/error.log +``` diff --git a/docs/zh/self-hosting/vercel.md b/docs/zh/self-hosting/vercel.md new file mode 100644 index 00000000..4e0edf05 --- /dev/null +++ b/docs/zh/self-hosting/vercel.md @@ -0,0 +1,122 @@ +# 部署到 Vercel + +[Vercel](https://vercel.com) 为静态站点提供最简单的部署体验。 + +## 一键部署 + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf) + +## 手动部署 + +### 步骤 1:Fork 仓库 + +将 [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) Fork 到您的 GitHub 账户。 + +### 步骤 2:导入到 Vercel + +1. 前往 [vercel.com/new](https://vercel.com/new) +2. 选择您 Fork 的仓库 +3. 配置项目: + +| 设置 | 值 | +| ---------------- | --------------- | +| Framework Preset | Vite | +| Build Command | `npm run build` | +| Output Directory | `dist` | +| Install Command | `npm install` | + +### 步骤 3:环境变量(可选) + +如有需要,添加以下变量: + +| 变量 | 说明 | +| ----------------------- | -------------------------------------------------------- | +| `SIMPLE_MODE` | 设为 `true` 以使用精简界面 | +| `VITE_BRAND_NAME` | 自定义品牌名称(替换 "BentoPDF") | +| `VITE_BRAND_LOGO` | 相对于 `public/` 的标志路径(例如 `images/my-logo.svg`) | +| `VITE_FOOTER_TEXT` | 自定义页脚/版权文字 | +| `VITE_DEFAULT_LANGUAGE` | 默认界面语言(例如 `fr`、`de`、`es`) | + +### 步骤 4:部署 + +点击 "Deploy" 并等待构建完成。 + +## 自定义域名 + +1. 前往项目设置 +2. 进入 "Domains" +3. 添加您的自定义域名 +4. 按说明配置 DNS + +## 限制 + +::: warning 大文件 +Vercel 的 serverless 函数有 50MB 的限制。由于 BentoPDF 是静态站点,这通常不会影响您,但 WASM 模块很大(总计约 100MB)。请确保它们从 `/public` 文件夹提供。 +::: + +## 故障排除 + +### 构建超时 + +如果构建超时,请尝试: + +```json +// vercel.json +{ + "buildCommand": "npm run build", + "outputDirectory": "dist" +} +``` + +### 刷新后出现 404 + +添加 `vercel.json` 以支持 SPA 路由: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] +} +``` + +### Word/ODT/Excel 转 PDF 无法使用 + +LibreOffice WASM 转换需要 `SharedArrayBuffer`,这要求所有页面都带有以下响应标头: + +- `Cross-Origin-Embedder-Policy: require-corp` +- `Cross-Origin-Opener-Policy: same-origin` + +预压缩的 `.wasm.gz` 和 `.data.gz` 文件还需要 `Content-Encoding: gzip`,浏览器才会对其解压。 + +将以下内容添加到您的 `vercel.json`: + +```json +{ + "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }], + "headers": [ + { + "source": "/(.*)", + "headers": [ + { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" }, + { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" }, + { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.wasm.gz", + "headers": [ + { "key": "Content-Type", "value": "application/wasm" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + }, + { + "source": "/libreoffice-wasm/soffice.data.gz", + "headers": [ + { "key": "Content-Type", "value": "application/octet-stream" }, + { "key": "Content-Encoding", "value": "gzip" } + ] + } + ] +} +``` + +要验证,请打开开发者工具控制台并运行 `console.log(window.crossOriginIsolated)`,它应返回 `true`。 diff --git a/docs/zh/tools/add-attachments.md b/docs/zh/tools/add-attachments.md new file mode 100644 index 00000000..157a6336 --- /dev/null +++ b/docs/zh/tools/add-attachments.md @@ -0,0 +1,49 @@ +--- +title: 添加附件 +description: 将任意类型的文件嵌入 PDF,可附加到整个文档或特定页面。 +--- + +# 添加附件 + +将一个或多个文件直接嵌入 PDF 文档。附件可以添加到文档级别(在任何 PDF 阅读器的附件面板中可见),也可以绑定到特定页面。 + +## 工作原理 + +1. 上传要添加附件的 PDF。 +2. 使用附件拖放区选择要嵌入的文件(任意文件类型)。 +3. 选择附件级别:**文档**(默认)或**页面**。 +4. 如果选择页面级别,请输入页面范围(例如 `1-3` 或 `5`)。 +5. 点击处理按钮。嵌入了您的文件的 PDF 会自动下载。 + +## 功能 + +- 可附加任意文件类型:图片、电子表格、压缩包、可执行文件等 +- 支持文档级或页面级附件位置 +- 一次操作可附加多个文件 +- 显示所有已选附件的文件名和大小 +- 输出保留原始 PDF 内容,并加入嵌入的文件 + +## 选项 + +| 选项 | 说明 | +| ------------ | ------------------------------------------ | +| **文档级别** | 将文件附加到整个 PDF,可从附件面板访问 | +| **页面级别** | 将文件附加到特定页面,通过页面范围输入指定 | + +## 使用场景 + +- 将源数据(Excel 文件、CSV)与 PDF 报告打包在一起 +- 将原始图片文件附加到摄影作品集 PDF +- 在合同或提案中嵌入支持文档 +- 为培训手册的特定页面添加补充材料 + +## 提示 + +- 文档级附件在各 PDF 阅读器中的支持最广泛。页面级附件可能无法在所有查看器中显示。 +- 附件没有文件大小限制,但嵌入非常大的文件会使 PDF 按比例增大。 + +## 相关工具 + +- [提取附件](./extract-attachments) +- [编辑附件](./edit-attachments) +- [合并 PDF](./merge-pdf) diff --git a/docs/zh/tools/add-blank-page.md b/docs/zh/tools/add-blank-page.md new file mode 100644 index 00000000..23236817 --- /dev/null +++ b/docs/zh/tools/add-blank-page.md @@ -0,0 +1,40 @@ +--- +title: 添加空白页 +description: 在 PDF 文档的任意位置插入一个或多个空白页。 +--- + +# 添加空白页 + +在您指定的位置向 PDF 插入空白页。您可以控制空白页的插入位置和数量。 + +## 工作原理 + +1. 上传 PDF 文件。工具会显示页数。 +2. 输入要插入空白页的**位置**。使用 `0` 在最开头插入,或使用总页数在末尾追加。 +3. 输入要添加的空白页**数量**(默认为 1)。 +4. 点击处理按钮。插入了空白页的 PDF 会自动下载。 + +## 功能 + +- 可在任意位置插入:文档开头、中间或末尾 +- 一次操作添加多个空白页 +- 位置提示会根据上传 PDF 的页数动态更新 +- 标准 A4 尺寸的空白页 + +## 使用场景 + +- 在合编文档的各部分之间添加空白分隔页 +- 插入空白页以对齐双面打印 +- 为打印的学习指南添加手写笔记空间 +- 补页以满足最低页数要求 + +## 提示 + +- 位置 `0` 表示插入到第一页之前。位置等于总页数表示追加到最后一页之后。 +- 如果需要在特定位置插入内容(而不只是空白页),请使用 [PDF 多功能工具](./pdf-multi-tool)在指定页后插入另一个 PDF。 + +## 相关工具 + +- [整理与复制](./organize-pdf) +- [PDF 多功能工具](./pdf-multi-tool) +- [合并 PDF](./merge-pdf) diff --git a/docs/zh/tools/add-page-labels.md b/docs/zh/tools/add-page-labels.md new file mode 100644 index 00000000..976d0c4f --- /dev/null +++ b/docs/zh/tools/add-page-labels.md @@ -0,0 +1,53 @@ +--- +title: 添加页面标签 +description: 添加 PDF 页面标签,支持罗马数字、字母前缀、自定义编号,以及每个文档多条规则。 +--- + +# 添加页面标签 + +页面标签控制页码在 PDF 查看器中的显示方式(显示在工具栏中的数字,而不是印在页面上的数字)。此工具可以为不同的页面范围分配不同的标签方案:前言使用罗马数字,正文使用十进制数字,附录使用字母等。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 出现选项面板,默认带有一条标签规则。 +3. 为每条规则配置页面范围、样式、可选前缀和起始值。 +4. 点击**添加规则**为不同部分创建更多规则。 +5. 点击**添加页面标签**应用所有规则并下载结果。 + +## 选项 + +每条标签规则有以下设置: + +- **页面范围**:规则适用的页面。留空表示所有页面。支持 `1-4`、`7`、`odd` 或 `1-9,30-40` 等范围。 +- **标签样式**:十进制阿拉伯数字、小写罗马数字(i, ii, iii)、大写罗马数字(I, II, III)、小写字母(a, b, c)、大写字母(A, B, C),或无标签(仅前缀)。 +- **标签前缀**:添加在每个标签前的可选文本,例如 "A-" 可生成 A-1、A-2、A-3 这样的标签。 +- **起始值**:开始计数的数字。默认为 1。设为 0 可使用从零开始的编号。 +- **跨不连续范围继续编号**:当规则针对不连续的页面(如 `1-9,30-40` 或 `odd`)并且希望编号顺序延续时启用。 +- **移除现有页面标签**:默认勾选。在应用新规则之前清除之前的所有标签。 + +## 功能 + +- 每个文档可设置多条标签规则,适应复杂的编号方案 +- 六种标签样式,涵盖所有标准编号系统 +- 支持自定义前缀,用于按章节标注 +- 支持不连续范围并可连续编号 +- 可选择保留或移除现有标签 + +## 使用场景 + +- 为书籍的前言设置罗马数字标签(i, ii, iii),正文使用十进制标签 +- 使用 "A-1"、"A-2"、"B-1"、"B-2" 等字母前缀标注附录页 +- 修正扫描文档中实体页码与 PDF 页面顺序不一致的页面标签 +- 为技术文档添加从零开始的编号 + +## 提示 + +- 页面标签是元数据,PDF 查看器会在导航工具栏中显示,它们不会打印在实际页面上。如需可见的页码,请使用[页码](./page-numbers)。 +- 此工具需要在 WASM 设置中配置 CoherentPDF (CPDF)。如果尚未设置,系统会提示您进行配置。 + +## 相关工具 + +- [页码](./page-numbers) +- [Bates 编号](./bates-numbering) +- [编辑书签](./bookmark) diff --git a/docs/zh/tools/add-stamps.md b/docs/zh/tools/add-stamps.md new file mode 100644 index 00000000..ee625017 --- /dev/null +++ b/docs/zh/tools/add-stamps.md @@ -0,0 +1,45 @@ +--- +title: 添加印章 +description: 使用集成的注释工具栏为 PDF 页面添加图片印章,并附带用户名署名。 +--- + +# 添加印章 + +使用带有印章注释工具栏的内嵌查看器,在 PDF 页面上放置图片印章。印章可以包含您的姓名以便署名,适用于审批流程、审阅流程和文档标记。 + +## 工作原理 + +1. 在**印章用户名**字段中输入您的姓名。此名称会显示在您创建的印章上。 +2. 点击或将 PDF 文件拖入拖放区进行上传。 +3. 印章编辑器打开,文档加载到查看器中。 +4. 使用工具栏中的图片印章工具,在任意页面选择并放置印章。 +5. 根据需要调整印章的位置和大小。 +6. 点击**保存已盖章的 PDF** 下载结果。 + +## 功能 + +- 集成的 PDF 查看器,带有印章专用注释工具栏 +- 为创建的印章署名用户名 +- 可在任意页面放置图片印章 +- 拖放定位和调整大小 +- 根据页面宽高比自动调整查看器尺寸 +- 显示文件名称和大小信息 + +## 使用场景 + +- 在审阅流程中为文档添加 "APPROVED" 或 "REVIEWED" 图片印章 +- 在正式文件上放置公司公章或公证印章图片 +- 为页面添加包含审阅者姓名的 "RECEIVED" 印章 +- 为检验报告添加质量控制印章 + +## 提示 + +- 请在上传 PDF 之前设置印章用户名。用户名会嵌入印章元数据中。 +- 查看器会根据 PDF 第一页的宽高比调整高度,以获得最佳查看效果。 +- 如需基于文本的水印而不是图片印章,请使用[添加水印](./add-watermark)工具。 + +## 相关工具 + +- [签署 PDF](./sign-pdf) +- [添加水印](./add-watermark) +- [PDF 编辑器](./edit-pdf) diff --git a/docs/zh/tools/add-watermark.md b/docs/zh/tools/add-watermark.md new file mode 100644 index 00000000..e2e150b7 --- /dev/null +++ b/docs/zh/tools/add-watermark.md @@ -0,0 +1,79 @@ +--- +title: 添加水印 +description: 通过可视化拖放编辑器和实时预览,在 PDF 页面上添加文字或图片水印。 +--- + +# 添加水印 + +使用可视化编辑器为 PDF 页面添加文字或图片水印。您可以直接在预览中拖动水印来定位,使用角点手柄调整大小,并配置不透明度、旋转、字体和颜色。每个页面可以有各自的水印位置,也可以一次性对所有页面应用相同的水印。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 编辑器打开,显示第一页的实时预览和可拖动的水印叠层。 +3. 使用切换按钮在**文字**或**图片**水印模式之间选择。 +4. 在侧边栏面板中配置水印设置。 +5. 在预览中拖动水印到您想要的位置。使用角点手柄调整大小。 +6. 在页面之间切换以设置每页的水印,或保持勾选**应用到所有页面**。 +7. 点击**添加水印**进行处理并下载。 + +## 选项 + +**文字水印设置:** + +- **文字**:水印文字(例如“机密”、“草稿”)。 +- **字号**:10 到 200 点。默认为 72。 +- **颜色**:通过取色器选择任意颜色。 +- **不透明度**:控制透明度,从完全透明到完全不透明。 +- **旋转**:将水印文字旋转 -180 到 180 度。 + +**图片水印设置:** + +- **图片上传**:上传 PNG、JPG 或其他图片文件用作水印。 +- **不透明度**:控制图片透明度。 +- **缩放**:调整图片水印的大小。 + +**布局设置:** + +- **单个**:每页一个水印,通过拖动或位置预设来定位。 +- **平铺**:沿着旋转角度以对角网格在整页重复水印,使水印从边缘到边缘覆盖整个文档。 +- **水平间距**:沿文字方向的平铺间距,以水印宽度的百分比表示(仅平铺模式)。 +- **垂直间距**:平铺行之间的间距,以水印高度的百分比表示(仅平铺模式)。 + +**通用设置:** + +- **应用到所有页面**:勾选后,同一水印应用于每一页。取消勾选可为每页单独设置水印。 +- **页面范围**:指定哪些页面添加水印(例如 "1-3, 5, 7-9" 或 "all")。 + +## 功能 + +- 在实时 PDF 预览上进行可视化拖放定位 +- 水印可通过角点手柄调整大小 +- 文字和图片水印模式 +- 单个或整页平铺(重复)布局,间距可调 +- 按页或全局应用水印 +- 在预览中逐页浏览 +- 不透明度和旋转控制 +- 页面范围筛选 + +## 使用场景 + +- 在分发审阅前为草稿文档标记“草稿” +- 为敏感财务报告添加“机密”水印 +- 使用公司标志图片水印为文档添加品牌标识 +- 在向潜在客户分享的产品文档上加盖 "SAMPLE" +- 为分发的 PDF 资料添加版权声明 + +## 提示 + +- 若要在页面上添加对角水印,请将旋转设为约 45 度并增大字号。 +- 平铺模式让文档裁剪后更难被重复使用,因为去掉一个水印仍会留下几十个。平铺时请降低不透明度,以保持底层文字清晰可读。 +- 带透明背景的图片水印(PNG 格式)与文档内容的融合更自然。 +- 如果需要在不同页面使用不同的水印文字,请取消勾选"应用到所有页面",然后逐页操作。 + +## 相关工具 + +- [页眉和页脚](./header-footer) +- [添加印章](./add-stamps) +- [Bates 编号](./bates-numbering) +- [签署 PDF](./sign-pdf) diff --git a/docs/zh/tools/adjust-colors.md b/docs/zh/tools/adjust-colors.md new file mode 100644 index 00000000..1309499b --- /dev/null +++ b/docs/zh/tools/adjust-colors.md @@ -0,0 +1,55 @@ +--- +title: 调整颜色 +description: 精细调整 PDF 的亮度、对比度、饱和度、色相、色温、色调、伽马和棕褐色。 +--- + +# 调整颜色 + +面向 PDF 的完整调色工具集。可调整八个独立参数:亮度、对比度、饱和度、色相偏移、色温、色调、伽马和棕褐色,拖动每个滑块时实时预览都会更新。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 编辑器打开,显示第一页的预览和颜色设置面板。 +3. 移动滑块调整各项颜色参数。预览会实时更新。 +4. 点击**重置**将所有滑块恢复到默认位置。 +5. 点击**应用**处理所有页面并下载调整后的 PDF。 + +## 选项 + +- **亮度**:使整个页面变亮或变暗(-100 到 +100)。 +- **对比度**:增大或减小明暗区域之间的差异(-100 到 +100)。 +- **饱和度**:增强或降低颜色强度(-100 到 +100)。设为 -100 会得到灰度效果。 +- **色相偏移**:旋转色轮,统一改变所有颜色。 +- **色温**:使颜色偏暖(黄/橙)或偏冷(蓝)。 +- **色调**:添加绿色或洋红色偏色。 +- **伽马**:使用伽马曲线调整中间调亮度。小于 1.0 的值会使中间调变暗,大于 1.0 的值会使其变亮。 +- **棕褐色**:应用经典的棕褐色调效果。数值越高,棕色色调越强。 + +## 功能 + +- 八个可独立调整的颜色参数 +- 实时预览,对滑块变化立即响应 +- 重置按钮可快速恢复默认值 +- 处理文档中的所有页面 +- 适用于任何 PDF 内容(文字、图片、图形) + +## 使用场景 + +- 提亮较暗的扫描件或校正曝光过度的页面 +- 在打印前降低彩色文档的饱和度以节省墨水 +- 应用棕褐色调,为证书或奖状营造复古外观 +- 校正 PDF 中嵌入照片的色温 +- 增强褪色或低质量扫描文档的对比度 + +## 提示 + +- 若要快速转换为灰度,请将饱和度滑块一直拖到 -100。 +- 对于中间调过暗或过亮的扫描文档,伽马滑块对提升可读性特别有用。 +- 与其他图像效果工具一样,此工具会将每一页栅格化。输出将基于图像,因此文字无法选中。 + +## 相关工具 + +- [反转颜色](./invert-colors) +- [扫描效果](./scanner-effect) +- [背景颜色](./background-color) diff --git a/docs/zh/tools/alternate-merge.md b/docs/zh/tools/alternate-merge.md new file mode 100644 index 00000000..aab18d36 --- /dev/null +++ b/docs/zh/tools/alternate-merge.md @@ -0,0 +1,42 @@ +--- +title: 交替混合页面 +description: 通过按交替顺序穿插各文件的页面来合并 PDF,并保留书签。 +--- + +# 交替混合页面 + +将多个 PDF 文件的页面交错排列,使页面在各文档之间交替出现。标准合并只会把文件首尾相接,而当您需要文件 A 的第 1 页、文件 B 的第 1 页、文件 A 的第 2 页,依此类推时,就该使用此工具。 + +## 工作原理 + +1. 使用拖放区上传至少两个 PDF 文件。 +2. 工具会显示每个文件的页数和文件大小。 +3. 拖动抓取手柄,调整交错顺序中哪个文件的页面排在前面。 +4. 点击**混合页面**生成交错后的输出。 +5. 结果会以 `alternated-mixed.pdf` 下载。 + +## 功能 + +- 可对任意数量的 PDF 交错页面(至少两个) +- 拖放重新排序文件,以控制交错优先级 +- 保留源文档中的书签 +- 显示每个已上传文件的页数和文件大小 +- 通过专用的 Web Worker 处理,界面保持流畅 + +## 使用场景 + +- 重新组合奇数页和偶数页分别扫描的双面扫描件 +- 将试题与答案合并,使每道题后面紧跟答案 +- 逐页合并双语文档(例如一面英文,下一面译文) +- 交错合并单面扫描仪扫出的正面和背面 + +## 提示 + +- 如果源 PDF 的页数不同,较短文档的页面会先用完,较长文档剩余的页面会出现在末尾。 +- 文件顺序很重要:列表中的第一个文件提供输出的第一页。如有需要,请拖动重新排列。 + +## 相关工具 + +- [合并 PDF](./merge-pdf) +- [整理与复制](./organize-pdf) +- [分割 PDF](./split-pdf) diff --git a/docs/zh/tools/background-color.md b/docs/zh/tools/background-color.md new file mode 100644 index 00000000..b6ceb9a2 --- /dev/null +++ b/docs/zh/tools/background-color.md @@ -0,0 +1,45 @@ +--- +title: 背景颜色 +description: 更改 PDF 每一页的背景颜色,同时保留其上的所有内容。 +--- + +# 背景颜色 + +在 PDF 所有现有内容后面设置纯色背景。工具会在每页创建一个彩色矩形,并将原始内容叠放在其上,因此文字、图片和图形在新背景上仍然完全可见。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 使用颜色选择器选取背景颜色。默认为浅黄色 (#FFFFCC)。 +3. 点击**更改背景颜色**进行处理。 +4. 更新后的 PDF 会自动下载。 + +## 选项 + +- **背景颜色**:标准取色器,可选择任意纯色。默认为浅黄色。 + +## 功能 + +- 为每一页应用统一的背景颜色 +- 将所有原始内容(文字、图片、矢量图形)完整保留在彩色图层之上 +- 保持原始页面尺寸 +- 适用于任意页数的文档 + +## 使用场景 + +- 添加浅奶油色或象牙色背景,使文档呈现更柔和的纸质外观 +- 为不同类别应用不同的背景颜色,对文档集进行颜色编码 +- 为不同受众创建同一文档的视觉区分版本 +- 添加浅色背景色调,提升文档在屏幕上投影时的可读性 + +## 提示 + +- 浅色、柔和的颜色效果最佳。除非文字本身是浅色,否则很深的背景会使文字难以阅读。 +- 如果想同时更改背景和文字颜色,请先应用背景颜色,然后对结果使用[更改文字颜色](./text-color)。 +- 此工具在 PDF 结构层面工作(不进行栅格化),因此输出中的文字仍可选中和搜索。 + +## 相关工具 + +- [更改文字颜色](./text-color) +- [反转颜色](./invert-colors) +- [调整颜色](./adjust-colors) diff --git a/docs/zh/tools/bates-numbering.md b/docs/zh/tools/bates-numbering.md new file mode 100644 index 00000000..ab52765b --- /dev/null +++ b/docs/zh/tools/bates-numbering.md @@ -0,0 +1,62 @@ +--- +title: Bates 编号 +description: 为一个或多个 PDF 添加 Bates 编号,支持自定义模板、补零位数、字体和位置。 +--- + +# Bates 编号 + +Bates 编号会在 PDF 的每一页上加盖顺序标识符。它是法律程序、审计和合规工作流中标注文档的标准方法。此工具支持多个文件和自定义模板,可输出分别编号的 PDF 或单个 ZIP 压缩包。 + +## 工作原理 + +1. 上传一个或多个 PDF 文件。可以一次拖入多个文件。 +2. 选择样式预设或创建自定义模板。 +3. 配置位置、字体、大小、颜色和起始编号。 +4. 点击**应用 Bates 编号**进行处理。 +5. 单个文件直接下载。多个文件会作为 ZIP 压缩包下载。 + +## 选项 + +- **样式预设**:从内置格式中选择: + - 证据 + 案件 + Bates + 页码(例如“Exhibit 1 Case XYZ 000001 Page 1”) + - 证据 + 案件 + Bates(无页码) + - 案件 + Bates + - 仅 Bates 编号(例如 "000001") + - 自定义(编写您自己的模板) +- **自定义样式**:使用占位符的模板字符串:`[BATES]`、`[PAGE]`、`[FILE]`、`[FILENAME]`。 +- **Bates 补零位数**:补零的 Bates 编号的位数(3 到 6)。仅在自定义模式下可见。 +- **位置**:页眉或页脚,左、中或右。 +- **Bates 起始编号**:第一个 Bates 编号。默认为 1。编号会在各文件之间延续。 +- **文件计数器起始值**:`[FILE]` 占位符的起始数字。 +- **字体**:Helvetica、Times New Roman 或 Courier。 +- **字号**:加盖文字的大小。 +- **颜色**:Bates 编号文字的取色器。 + +## 功能 + +- 实时预览,显示 Bates 编号在所有已上传文件中的显示效果 +- 支持多个文件,编号在各文档之间连续 +- 拖放重新排序文件,以控制编号顺序 +- 六种位置选项(页眉/页脚,左/中/右) +- 自适应页边距计算,适应不同的页面尺寸 +- 多文件批量处理时输出 ZIP +- 模板占位符提供最大灵活性 + +## 使用场景 + +- 为诉讼的证据开示文档加盖顺序证据编号 +- 为跨越数十个文件的审计证据包编号 +- 为合规文档应用监管参考编号 +- 使用案件专属标识符标注专利申请的附件 + +## 提示 + +- 处理前,在文件列表中拖动文件可重新排序。Bates 编号顺序遵循此排列。 +- 使用 `[FILENAME]` 占位符可在印章中包含原始文件名,有助于将页面追溯到源文档。 +- 更改设置时,预览框会实时更新,因此您可以在处理前核对格式。 + +## 相关工具 + +- [页码](./page-numbers) +- [添加页面标签](./add-page-labels) +- [页眉和页脚](./header-footer) diff --git a/docs/zh/tools/bmp-to-pdf.md b/docs/zh/tools/bmp-to-pdf.md new file mode 100644 index 00000000..5dee08ea --- /dev/null +++ b/docs/zh/tools/bmp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: BMP 转 PDF +description: 直接在浏览器中将 BMP 位图图像转换为 PDF 格式,无需上传到任何服务器。 +--- + +# BMP 转 PDF + +将 Windows 位图 (BMP) 文件转换为 PDF。BMP 是一种未压缩的图像格式,至今仍见于旧系统、医学影像和工业扫描仪中。此工具无需安装任何软件即可将它们转换为 PDF。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :----- | +| BMP | `.bmp` | + +## 工作原理 + +1. 点击上传区域或拖放您的 BMP 文件。 +2. 查看文件列表。可以添加更多文件或移除不需要的文件。 +3. 点击**转换为 PDF**。输出会以 `from_bmps.pdf` 下载。 + +每个 BMP 会被绘制到画布上,导出为 PNG,然后使用 pdf-lib 嵌入 PDF。页面尺寸与原始图像尺寸一致。 + +## 选项 + +此工具不提供额外的质量设置。图像以原始分辨率作为无损 PNG 嵌入 PDF。 + +## 使用场景 + +- 将以 BMP 存储的旧扫描文档转换为存档 PDF +- 将旧版 Windows 应用程序的 BMP 截图转为便于分享的文档 +- 处理默认输出 BMP 的医学或工业扫描仪结果 +- 将旧的图像档案迁移到更便于移植的格式 + +## 提示 + +- BMP 文件未经压缩,因此通常很大。由于图像在内部重新编码为 PNG,生成的 PDF 会小得多。 +- 如果您的 BMP 文件与其他图像格式混在一起,请使用[图片转 PDF](./image-to-pdf)工具一次性批量转换。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [PNG 转 PDF](./png-to-pdf) +- [TIFF 转 PDF](./tiff-to-pdf) diff --git a/docs/zh/tools/bookmark.md b/docs/zh/tools/bookmark.md new file mode 100644 index 00000000..1313fe72 --- /dev/null +++ b/docs/zh/tools/bookmark.md @@ -0,0 +1,57 @@ +--- +title: 编辑书签 +description: 通过可视化编辑器添加、编辑、导入、导出和删除 PDF 书签,支持 CSV/JSON。 +--- + +# 编辑书签 + +书签编辑器让您完全掌控 PDF 的导航书签(也称为大纲)。您可以添加新书签、编辑现有书签、调整层级结构,并以 CSV 和 JSON 格式导入或导出书签数据。 + +## 使用方法 + +1. 点击或将文件拖入上传区域,上传您的 PDF。 +2. 可选:勾选 **自动提取现有书签**,载入文档当前的书签树。 +3. 编辑器会以分屏视图打开:左侧是 PDF 查看器,右侧是书签面板。 +4. 输入书签标题并点击 **添加到页面**,即可创建指向当前页面的新书签。 +5. 使用工具栏按钮重新排列、设置样式或删除书签。 +6. 点击 **保存带书签的 PDF** 下载更新后的文件。 + +## 功能 + +- 可视化 PDF 查看器,支持页面导航、缩放控制和跳转到指定页码 +- 一键为任意页面添加书签 +- 直接在 PDF 上点击以设置精确的书签目标位置(拾取模式) +- 支持嵌套书签层级,可拖放排序 +- 批量操作:选择多个书签,一次性更改颜色、样式或删除 +- 书签搜索,可在大型书签树中快速找到条目 +- 所有更改均支持撤销和重做 +- 从 CSV(标题、页码、层级)或 JSON 文件导入书签 +- 将书签导出为 CSV 或 JSON,便于在外部编辑 +- 书签样式:颜色(红、蓝、绿、黄、紫)和字体样式(粗体、斜体、粗斜体) +- 快速导航:使用 Page Up/Page Down 键滚动页面 + +## 选项 + +- **自动提取现有书签**:勾选后,工具会在加载时读取并显示 PDF 当前的书签。 +- **批量模式**:切换后可选择多个书签,并批量应用颜色、样式或删除操作。 +- **全部展开/折叠**:快速显示或隐藏嵌套的子书签。 + +## 使用场景 + +- 为缺少书签的教材或手册添加目录 +- 在 OCR 处理后重新整理扫描文档的书签结构 +- 将书签导出为 CSV,在电子表格中编辑后再重新导入 +- 清理页码引用错误的自动生成书签 +- 在法律文书中添加彩色书签来标记重要章节 + +## 小提示 + +- 批量创建书签时请使用 CSV 导入。格式很简单:`title,page,level`,其中 level 1 表示顶层。 +- 拾取模式可以让您点击 PDF 页面上的确切位置来设置书签目标,比只指定页码更精确。 +- 在进行大幅修改之前先导出书签,作为备份。 + +## 相关工具 + +- [目录](./table-of-contents) +- [PDF 编辑器](./edit-pdf) +- [添加页面标签](./add-page-labels) diff --git a/docs/zh/tools/cbz-to-pdf.md b/docs/zh/tools/cbz-to-pdf.md new file mode 100644 index 00000000..daf5a6e4 --- /dev/null +++ b/docs/zh/tools/cbz-to-pdf.md @@ -0,0 +1,47 @@ +--- +title: CBZ 转 PDF +description: 在浏览器中将 CBZ 和 CBR 漫画压缩包转换为 PDF。免费、私密,无需上传。 +--- + +# CBZ 转 PDF + +将漫画压缩包文件转换为 PDF。CBZ 和 CBR 是数字漫画的标准格式,本质上就是装满图片的 ZIP 或 RAR 压缩包。此工具会提取每一页,保留阅读顺序,并生成干净的 PDF,每张图片都会变成一个全尺寸页面。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :--- | :----- | :----------------------------------------------- | +| CBZ | `.cbz` | 基于 ZIP 的漫画压缩包(使用 pdf-lib 在本地处理) | +| CBR | `.cbr` | 基于 RAR 的漫画压缩包(通过 PyMuPDF 引擎处理) | + +CBZ 转换器可识别压缩包内的 JPEG、PNG、GIF、BMP、WebP、AVIF、TIFF、HEIC 和 JXL 图片。非标准格式会在嵌入前自动转换为 PNG。 + +## 使用方法 + +1. 点击上传区域,或拖放您的 CBZ 或 CBR 文件。可以在同一批次中混用两种格式。 +2. 查看文件列表。移除不需要的文件,或点击 **添加更多文件** 继续添加。 +3. 点击 **转换为 PDF**。对于 CBZ 文件,工具会解压压缩包,按自然顺序按名称排序图片文件,检测每张图片的实际格式,并使用 pdf-lib 将它们嵌入 PDF。CBR 文件则改由 PyMuPDF 引擎处理。 +4. 单个文件会直接下载为 PDF。多个文件会生成名为 `comic-converted.zip` 的 ZIP 压缩包。 + +## 选项 + +无需任何配置。每张图片都会成为与其原始尺寸一致的页面,因此跨页大图保持宽幅,单页保持窄幅。 + +## 使用场景 + +- 在支持 PDF 但不支持 CBZ/CBR 的平板或手机应用中阅读漫画 +- 打印数字漫画中的特定页面 +- 将漫画收藏归档为任何文件查看器都能打开的格式 +- 与没有专用漫画阅读器的人分享漫画 + +## 小提示 + +- 压缩包内的图片按自然顺序排序(因此 `page2.jpg` 会排在 `page10.jpg` 之前)。请使用编号一致的文件名,以确保页面顺序正确。 +- 转换器通过二进制签名而不是文件扩展名来检测图片格式。即使 PNG 被误命名为 `.jpg`,也能正确嵌入。 +- CBZ 文件完全在浏览器中处理,无需加载 PyMuPDF 引擎,因此转换速度比 CBR 文件更快。 + +## 相关工具 + +- [EPUB 转 PDF](./epub-to-pdf) +- [MOBI 转 PDF](./mobi-to-pdf) +- [图片转 PDF](./image-to-pdf) diff --git a/docs/zh/tools/change-permissions.md b/docs/zh/tools/change-permissions.md new file mode 100644 index 00000000..93f649a8 --- /dev/null +++ b/docs/zh/tools/change-permissions.md @@ -0,0 +1,61 @@ +--- +title: 更改权限 +description: 设置或修改 PDF 的打印、复制、编辑和批注使用权限。使用 256 位 AES 加密。 +--- + +# 更改权限 + +精细控制接收者可以对您的 PDF 执行哪些操作。与仅用密码锁定文件的基本加密不同,此工具允许您有选择地允许或禁止打印、复制、编辑、批注、填写表单、文档组装和页面提取,所有这些都通过 256 位 AES 加密强制执行。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 如果 PDF 已加密,请输入 **当前密码**。 +3. 设置 **新用户密码**(打开文件所需)和/或 **新所有者密码**(控制权限)。 +4. 使用复选框逐项开启或关闭权限。 +5. 点击 **更改权限**。 +6. 下载更新后的 PDF。 + +如果两个新密码字段都留空,工具会完全解密 PDF,移除所有加密和限制。 + +## 权限控制 + +| 权限 | 控制内容 | +| ---------------- | ------------------------------ | +| **允许打印** | 文档是否可以打印 | +| **允许复制** | 文本和图片是否可以被选择和复制 | +| **允许修改** | 文档内容是否可以编辑 | +| **允许批注** | 是否可以添加评论、高亮和印章 | +| **允许填写表单** | 交互式表单字段是否可以填写 | +| **允许文档组装** | 页面是否可以插入、删除或旋转 | +| **允许提取页面** | 单个页面是否可以被提取 | + +所有权限都需要设置所有者密码才能生效。没有所有者密码时,大多数 PDF 阅读器会忽略权限标志。 + +## PDF 中的权限机制 + +PDF 权限是加密规范的一部分。它们以位标志的形式存储在加密字典中,并由合规的 PDF 阅读器强制执行。关键区别如下: + +- **用户密码**:打开文件所必需。 +- **所有者密码**:更改权限或移除限制所必需。没有它时,权限标志决定用户可以执行哪些操作。 + +如果只设置所有者密码(不设置用户密码),任何人都可以打开文件,但只能执行被允许的操作。如果两者都设置,则打开文件需要密码,且验证之后仍受限制。 + +## 使用场景 + +- 分发可查看和打印但不能编辑或复制的报告 +- 分享接收者可以填写但不能修改的合同模板 +- 发布禁止复制图片的 PDF 目录 +- 允许在审阅草稿上添加批注,同时防止结构性更改 + +## 小提示 + +- 为了确保有效,请始终设置所有者密码。没有所有者密码的权限无法强制执行。 +- 某些第三方 PDF 工具会忽略权限标志。如需更强的保护,可以考虑将 PDF 栅格化或使用 DRM。 +- 使用此工具可将旧的 RC4 加密 PDF 升级为 AES-256。 + +## 相关工具 + +- [加密 PDF](./protect-pdf):简单的密码保护,没有细粒度权限 +- [解密 PDF](./unlock-pdf):完全移除加密 +- [移除限制](./remove-restrictions):在拥有所有者密码时,去除所有限制 diff --git a/docs/zh/tools/combine-single-page.md b/docs/zh/tools/combine-single-page.md new file mode 100644 index 00000000..779f5d2f --- /dev/null +++ b/docs/zh/tools/combine-single-page.md @@ -0,0 +1,55 @@ +--- +title: 合并为单页 +description: 将 PDF 的所有页面拼接成一个连续的垂直或水平长页面。 +--- + +# 合并为单页 + +将 PDF 的每一页合并成一个长页面。页面会垂直拼接(像卷轴一样)或水平拼接(并排放置),输出为一个连续的单页。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 选择排列方向:**垂直**(页面从上到下堆叠)或 **水平**(页面并排放置)。 +3. 以点为单位设置页面之间的间距。 +4. 为页面之间的间隙选择背景颜色。 +5. 可选:启用分隔线(页面之间的细线),并配置其粗细和颜色。 +6. 点击处理按钮。输出为单页 PDF。 + +## 功能 + +- 垂直或水平拼接页面 +- 可配置页面间距 +- 为间隙区域提供背景颜色选择器 +- 可选分隔线,粗细和颜色可调 +- 将每个原始页面以完整分辨率渲染到合并后的画布上 + +## 选项 + +| 选项 | 说明 | +| -------------- | -------------------------- | +| **方向** | 垂直(堆叠)或水平(并排) | +| **页面间距** | 页面之间的间隙,单位为点 | +| **背景颜色** | 页面之间区域的颜色 | +| **添加分隔线** | 切换页面之间的细线 | +| **分隔线粗细** | 线条粗细,单位为点 | +| **分隔线颜色** | 分隔线的颜色 | + +## 使用场景 + +- 将多页线框图或设计稿制作成一张长图 +- 生成可连续滚动的文档视图,用于网页嵌入 +- 将多页漫画或分镜拼接成一条长带 +- 生成连续页面的全景视图,便于审阅 + +## 小提示 + +- 垂直方向最适合纵向页面的文档。横向内容则更适合水平方向。 +- 页数很多的大型文档会生成非常高或非常宽的输出。某些 PDF 查看器可能无法处理特别大的单页。 +- 使用对比色的分隔线,可以轻松看出一个原始页面在哪里结束、下一页从哪里开始。 + +## 相关工具 + +- [N-Up PDF](./n-up-pdf) +- [合并 PDF](./merge-pdf) +- [分割页面](./divide-pages) diff --git a/docs/zh/tools/compare-pdfs.md b/docs/zh/tools/compare-pdfs.md new file mode 100644 index 00000000..2da96e88 --- /dev/null +++ b/docs/zh/tools/compare-pdfs.md @@ -0,0 +1,60 @@ +--- +title: 比较 PDF +description: 以并排或叠加模式比较两个 PDF 文档,提供详细的变更检测和分类。 +--- + +# 比较 PDF + +上传两个 PDF,准确查看它们之间发生了哪些变化。工具会智能配对页面,检测文本、图片、批注、页眉和格式的差异,并以并排或叠加视图呈现。 + +## 使用方法 + +1. 上传两个 PDF 文件:原始版本(左)和修订版本(右)。 +2. 工具使用内容签名在两个文档之间配对页面。 +3. 选择视图模式:**并排** 或 **叠加**。 +4. 使用分页控件在页面对之间切换。 +5. 差异会被高亮并分类。使用筛选面板专注于特定的变更类型。 +6. 可选:将比较结果导出为 PDF 报告。 + +## 功能 + +- 基于内容相似度自动配对页面 +- 并排和叠加两种比较视图 +- 变更分类:文本、图片、页眉/页脚、批注、格式、背景 +- 按类别切换筛选,显示或隐藏特定类型的变更 +- 支持带查询过滤的文本变更搜索 +- 支持 OCR,可比较扫描文档 +- 缩放控制,便于详细检查 +- 并排模式下两个面板同步滚动 +- 将比较结果导出为 PDF + +## 选项 + +| 选项 | 说明 | +| ------------ | ------------------------------------------------------- | +| **视图模式** | 并排或叠加 | +| **OCR** | 启用/禁用 OCR 以比较扫描文档 | +| **OCR 语言** | OCR 文本提取所用的语言 | +| **类别筛选** | 切换文本、图片、页眉/页脚、批注、格式和背景变更的可见性 | +| **变更范围** | 在叠加模式下,在全部变更或仅内容变更之间筛选 | +| **缩放** | 调整放大级别以便详细检查 | + +## 使用场景 + +- 审阅合同修订,准确找出不同版本之间的变化 +- 比较设计稿,验证 PDF 导出结果是否符合预期 +- 在受监管行业中审计文档变更,确保每次编辑都可追溯 +- 验证 PDF 转换流程是否准确保留了原始内容 +- 对照原文检查翻译文档的版面变化 + +## 小提示 + +- 叠加视图会将两个文档相互重叠,使空间上的差异(元素位移、图片尺寸变化)一目了然。 +- 比较没有文本层的扫描文档时请启用 OCR。比较引擎会从页面图像中提取文本。 +- 使用类别筛选专注于重要内容。例如,只关心文本内容差异时,可以隐藏格式变更。 + +## 相关工具 + +- [查看元数据](./view-metadata) +- [OCR PDF](./ocr-pdf) +- [合并 PDF](./merge-pdf) diff --git a/docs/zh/tools/compress-pdf.md b/docs/zh/tools/compress-pdf.md new file mode 100644 index 00000000..8c318c2f --- /dev/null +++ b/docs/zh/tools/compress-pdf.md @@ -0,0 +1,73 @@ +--- +title: 压缩 PDF +description: 使用 Hyper Compress 引擎将 PDF 文件体积减小多达 90%。支持目标文件大小、批量处理和自定义质量设置。 +--- + +# 压缩 PDF + +在不破坏文件的前提下缩小 PDF。压缩 PDF 由 [Hyper Compress](https://www.bentopdf.com/hyper-compress) 驱动,这是 BentoPDF 自研的压缩引擎。它会重新压缩图片,对字体进行子集化和合并,并清除嵌入缩略图和私有应用数据等冗余内容。PDF 仍然功能完整:文本依然可选,链接和表单字段继续可用。 + +Hyper Compress 已编译为 WebAssembly 并随 BentoPDF 一同发布,因此压缩可离线运行,在隔离网络的部署中也无需额外设置。 + +## 使用方法 + +1. 点击拖放区域或将文件拖入,上传一个或多个 PDF。 +2. 选择 **压缩级别**:低、中、高或无损。 +3. 可选:输入 **目标文件大小**,或展开 **自定义设置** 进行精细控制,包括 **转换为灰度**。 +4. 点击 **压缩 PDF**。处理多个文件时,您会得到一个 ZIP 下载。 + +## 特殊文档 + +- **带数字签名的 PDF** 会原样返回,因为任何更改都会使签名失效。在自定义设置中开启 **覆盖内容保护**,即可移除签名并进行压缩;可见的签名仍会留在页面上,但文件不再处于签名状态。 +- **PDF/A 文件** 在压缩后会失去 PDF/A 标记,这样文件就不会声称自己符合已不再满足的一致性要求。在自定义设置中开启 **保留 PDF/A**,可让文件保持合规。 +- **受密码保护的 PDF** 的文件卡片上会显示密码字段。在此输入密码,Hyper Compress 会自行打开文件,无需单独的解锁步骤。如果有两个或更多锁定的文件,一个共用的字段即可解锁所有使用相同密码的文件。压缩后的副本没有密码;可使用 [加密 PDF](./protect-pdf) 重新添加。 +- **没有文本层的扫描件** 可以通过自定义设置中的 **栅格化页面** 进一步缩小,它会将每一页替换为一张优化后的图片。对于任何含有可选文本的文档(包括经过 OCR 的扫描件),此项会被跳过,除非开启了 **覆盖内容保护**。开启后,文本页面也会变成图片,因此文本将无法选择,链接也会失效。 + +## 压缩级别 + +| 级别 | 图片质量 | 最大分辨率 | 适用场景 | +| -------- | -------- | ---------- | ------------------ | +| **低** | 80 | 200 DPI | 保持视觉质量 | +| **中** | 50 | 150 DPI | 日常文档 | +| **高** | 20 | 72 DPI | 邮件附件、网页上传 | +| **无损** | 图片不变 | 不变 | 归档副本 | + +高级别还会取消嵌入 14 种标准 PDF 字体,以及在安全时取消嵌入 Arial 等相似字体。 + +## 目标文件大小 + +以 KB 或 MB 输入大小,Hyper Compress 会从您选择的级别开始,搜索仍能满足该大小的最佳图片质量。如果文档无法缩小到该大小,您会得到它能生成的最小版本,并看到相应提示。诸如 [压缩 PDF 至 1MB](https://www.bentopdf.com/compress-pdf-to-1mb) 之类的专用页面打开时,目标大小已预先填好。 + +## 自定义设置 + +展开自定义设置面板,可直接调整 Hyper Compress。选择压缩级别会将这些设置重置为该级别的值,而修改其中任何一项都会将级别切换为自定义。 + +- **覆盖内容保护**:默认情况下,Hyper Compress 不会改动已签名的 PDF,也不会栅格化含有文本的页面。开启后将绕过这两项限制。更改级别时它会保持开启。 + +- **图片**:图片质量、最大分辨率、强制重采样、颜色缩减、裁剪不可见的图片区域、移除备用图片、简化颜色配置文件、JPEG 2000 和无损模式 +- **字体**:子集化、合并重复字体,以及取消嵌入标准字体及其相似字体 +- **内容**:拼合批注、表单字段或链接 +- **清理**:移除缩略图、应用数据、文章线程、网页抓取信息、结构树或输出意图 +- **栅格化**:将页面替换为图片,适用于纯图像扫描件;文档含有可选文本时会跳过 +- **输出**:保留 PDF/A,以及面向支持 Brotli 的 PDF 2.0 阅读器的 Brotli 压缩 + +## 使用场景 + +- 将 50 MB 的报告压缩到邮件附件限制以内 +- 通过目标文件大小,让扫描件满足门户网站严格的上传限制 +- 优化营销 PDF,加快网站下载速度 +- 归档大量文档,节省存储成本 +- 通过即时通讯应用分享 PDF 时减少移动数据用量 + +## 小提示 + +- 先从中级别开始。如果结果仍然太大,可设置目标文件大小或升级到高级别。 +- 对于没有文本层的扫描件,请在自定义设置中开启栅格化页面。 +- 自定义设置中的转换为灰度,可以显著减小以彩色内容为主的文档体积。 + +## 相关工具 + +- [线性化 PDF](./linearize-pdf):优化压缩后的 PDF,便于快速网页浏览 +- [栅格化 PDF](./rasterize-pdf):以指定 DPI 将页面(包括含文本的页面)转换为图片 +- [修复 PDF](./repair-pdf):修复在其他地方压缩时损坏的 PDF +- [移除元数据](./remove-metadata):清除隐藏数据以保护隐私 diff --git a/docs/zh/tools/crop-pdf.md b/docs/zh/tools/crop-pdf.md new file mode 100644 index 00000000..1c8004ec --- /dev/null +++ b/docs/zh/tools/crop-pdf.md @@ -0,0 +1,44 @@ +--- +title: 裁剪 PDF +description: 使用基于 Cropper.js 的编辑器,在每个页面上绘制裁剪区域,直观地裁剪 PDF 页面。 +--- + +# 裁剪 PDF + +通过可视化裁剪界面修剪 PDF 页面的边距。直接在每个页面上绘制裁剪矩形,预览结果并应用裁剪。您可以为不同页面设置不同的裁剪区域,也可以对整个文档应用相同的裁剪。 + +## 使用方法 + +1. 上传您的 PDF 文件。 +2. 裁剪编辑器打开,显示第一页和可拖动的裁剪叠加层。 +3. 拖动边缘或角点来调整裁剪矩形。 +4. 使用页面导航按钮在页面之间切换,并为每页设置裁剪区域。 +5. 点击 **裁剪** 应用裁剪并下载结果。 + +## 功能 + +- 基于 Cropper.js 的可视化裁剪编辑器,带有用于精确调整的手柄 +- 逐页导航,可设置各自的裁剪区域 +- 按页面保存裁剪设置,因此可以为不同页面定义不同的裁剪 +- 实时预览所选裁剪区域 +- 支持任意页面尺寸或方向的 PDF + +## 使用场景 + +- 去除扫描文档的宽边距,聚焦内容区域 +- 从印前 PDF 中修剪打印裁切标记或套准标记 +- 裁剪讲义幻灯片,去除演讲者备注区域 +- 在分享文档节选前,去除每页的页眉或页脚 +- 调整页面大小,以适应特定的显示或打印版式 + +## 小提示 + +- 裁剪叠加层可以自由调整大小和位置。拖动角点可按比例缩放,拖动边缘可沿单个轴调整。 +- 如果每页都需要相同的裁剪,请在第一页上设置,工具会在您切换页面时记住裁剪区域。 +- 如果您需要统一页面尺寸而不是可视化裁剪,修正页面尺寸工具可能更合适。 + +## 相关工具 + +- [PDF 编辑器](./edit-pdf) +- [页码](./page-numbers) +- [移除空白页](./remove-blank-pages) diff --git a/docs/zh/tools/csv-to-pdf.md b/docs/zh/tools/csv-to-pdf.md new file mode 100644 index 00000000..db4974c4 --- /dev/null +++ b/docs/zh/tools/csv-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: CSV 转 PDF +description: 直接在浏览器中将 CSV 电子表格文件转换为格式化的 PDF 表格。 +--- + +# CSV 转 PDF + +将 CSV 文件转换为整洁、格式化的 PDF 文档。每个 CSV 都会被解析并在输出的 PDF 中渲染为表格。当您需要打印或分享表格数据,而接收者没有电子表格软件时,这会很有用。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :----- | +| CSV | `.csv` | + +## 使用方法 + +1. 点击上传区域,或拖放一个或多个 CSV 文件。 +2. 查看文件列表。可添加更多文件或移除不需要的文件。 +3. 点击 **转换为 PDF**。进度指示器会显示转换状态。 +4. 单个文件会直接下载为 PDF。多个文件会打包成 `csv-converted.zip`。 + +## 选项 + +此工具没有额外配置。CSV 会被自动解析并格式化为表格。 + +## 输出 + +| 输入数量 | 输出 | +| :------- | :------------------------------------------------------ | +| 1 个文件 | 下载单个 PDF(例如 `data.pdf`) | +| 2 个以上 | ZIP 压缩包(`csv-converted.zip`),每个文件对应一个 PDF | + +## 使用场景 + +- 将导出的数据库报表转换为可打印的 PDF 表格 +- 与没有 Excel 的人分享财务数据或库存清单 +- 为合规文档创建 CSV 日志文件的 PDF 版本 +- 打印地址列表、成绩单,或任何以 CSV 存储的表格数据 + +## 小提示 + +- 为获得最佳效果,请确保您的 CSV 使用标准的逗号分隔符。工具遵循常见的 CSV 解析约定。 +- 如果 CSV 列数很多,表格可能会被压缩以适应页面宽度。可考虑将过宽的数据集拆分为多个文件。 +- 对于 Excel 文件(`.xls`、`.xlsx`),请使用 [Excel 转 PDF](./excel-to-pdf) 工具,它会保留电子表格格式和多个工作表。 + +## 相关工具 + +- [Excel 转 PDF](./excel-to-pdf) +- [文本转 PDF](./txt-to-pdf) +- [JSON 转 PDF](./json-to-pdf) diff --git a/docs/zh/tools/delete-pages.md b/docs/zh/tools/delete-pages.md new file mode 100644 index 00000000..2deb3918 --- /dev/null +++ b/docs/zh/tools/delete-pages.md @@ -0,0 +1,42 @@ +--- +title: 删除页面 +description: 按页码、范围或可视化缩略图选择,从 PDF 中移除指定页面。 +--- + +# 删除页面 + +从 PDF 文档中移除不需要的页面。您可以输入页码或范围来指定要删除的页面,也可以直接点击页面缩略图将其标记为删除。 + +## 使用方法 + +1. 上传 PDF 文件。工具会渲染每一页的缩略图预览。 +2. 在文本框中使用范围语法(例如 `2, 5-8`)输入要删除的页面,或点击缩略图进行切换。 +3. 被标记的页面会高亮显示,方便您确认选择。 +4. 点击处理按钮。系统会创建一个已移除所选页面的新 PDF。 + +## 功能 + +- 基于文本的页面选择,支持范围语法(`2, 5-8, 12`) +- 可视化缩略图网格,点击即可选择要删除的页面 +- 实时预览高亮显示被标记删除的页面 +- 根据实际页数验证输入 +- 未删除的页面保持原有顺序 + +## 使用场景 + +- 从扫描文档中移除空白页或填充页 +- 在分享文档前去除封面页或附录 +- 清理不小心留在最终 PDF 中的草稿页 +- 在分发前移除含有敏感信息的页面 + +## 小提示 + +- 删除页面不会影响其余页面的内容或格式。输出是原始文档去掉被移除页面后的忠实副本。 +- 如果您想只保留特定页面,而不是移除特定页面,[提取页面](./extract-pages) 更合适。 +- 缩略图视图采用延迟加载,因此大型文档也能保持流畅响应。 + +## 相关工具 + +- [提取页面](./extract-pages) +- [整理与复制](./organize-pdf) +- [分割 PDF](./split-pdf) diff --git a/docs/zh/tools/deskew-pdf.md b/docs/zh/tools/deskew-pdf.md new file mode 100644 index 00000000..a269bb6e --- /dev/null +++ b/docs/zh/tools/deskew-pdf.md @@ -0,0 +1,46 @@ +--- +title: 校正 PDF +description: 使用 OpenCV 倾斜检测自动校正扫描 PDF 中的倾斜页面。阈值和 DPI 设置可调。 +--- + +# 校正 PDF + +扫描文档很少是完全端正的。即使轻微的倾斜也会降低 OCR 的准确性,并让打印效果显得草率。此工具使用 OpenCV 的图像处理算法检测每页的倾斜角度,并将其旋转回水平。 + +## 使用方法 + +1. 上传一个或多个扫描 PDF。 +2. 设置 **倾斜阈值**:检测到的倾斜低于该值的页面不会被改动。 +3. 选择 **处理质量 (DPI)**:DPI 越高,检测越准确,但耗时更长。 +4. 点击 **校正 PDF**。 +5. 处理完成后,结果面板会显示每页检测到的角度以及是否已校正。 + +## 选项 + +| 设置 | 取值 | 默认值 | +| ------------ | --------------------- | ------ | +| **倾斜阈值** | 0.1、0.5、1.0、2.0 度 | 0.5 | +| **处理 DPI** | 100、150、200、300 | 150 | + +## 倾斜检测原理 + +工具会以所选 DPI 将每页渲染为图像,然后使用 OpenCV 检测内容中的主要线条角度。如果检测到的倾斜超过阈值,页面会按相反角度旋转以摆正。低于阈值的页面保持不变。 + +## 使用场景 + +- 整理批量扫描的合同或法律文件 +- 为 OCR 处理准备扫描的收据或发票 +- 校正平板扫描仪上纸张放置不一致的页面 +- 提升数字化档案资料的视觉质量 + +## 小提示 + +- 如果需要为 OCR 实现像素级对齐,请将阈值降低到 0.1 度。 +- 对大多数文档来说,150 DPI 速度快且准确。对于文字非常小或细节丰富的页面,请使用 300 DPI。 +- 校正功能最适合带有清晰水平文本行的文档。对于以图片为主或带有斜向设计元素的页面,效果可能不佳。 + +## 相关工具 + +- [栅格化 PDF](./rasterize-pdf):将校正后的输出转换为扁平的图像型 PDF +- [压缩 PDF](./compress-pdf):校正后减小文件大小 +- [修复 PDF](./repair-pdf):修复扫描 PDF 中的结构问题 diff --git a/docs/zh/tools/digital-sign-pdf.md b/docs/zh/tools/digital-sign-pdf.md new file mode 100644 index 00000000..c343e77b --- /dev/null +++ b/docs/zh/tools/digital-sign-pdf.md @@ -0,0 +1,65 @@ +--- +title: 数字签名 +description: 使用 X.509 证书为 PDF 添加加密数字签名。支持 PKCS#12 和 PEM 格式,并提供可见签名选项。 +--- + +# 数字签名 + +数字签名是加密证明:特定的人签署了文档,且文档自签署以来未被更改。与手绘签名(只是一张图片)不同,数字签名使用 X.509 证书和 PKCS#7 标准,提供可验证的真实性和完整性。 + +BentoPDF 完全在您的浏览器中应用数字签名。您的私钥不会离开您的设备。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 上传您的证书文件(.pfx、.p12 或 .pem)。 +3. 输入证书密码以解锁。工具会显示证书主体、颁发者和有效期。 +4. 可选:配置签名元数据(原因、地点、联系信息)。 +5. 可选:启用 **可见签名**,并自定义位置、大小、图片和文本。 +6. 点击 **签署 PDF**。 + +## 支持的证书格式 + +| 格式 | 扩展名 | 说明 | +| ----------- | ---------- | -------------------------------------------------------------------- | +| **PKCS#12** | .pfx, .p12 | 包含私钥和证书链的行业标准捆绑包。最常见的格式。 | +| **PEM** | .pem | 基于文本的格式。必须在同一文件中同时包含证书和私钥。支持加密的私钥。 | + +## 可见签名选项 + +启用后,PDF 页面上会渲染一个可见的签名块: + +- **位置**:X/Y 坐标以及宽度/高度,单位为点 +- **页面**:第一页、最后一页、所有页面或指定页码 +- **图片**:上传 PNG、JPG 或 WebP 图片(您的手写签名、公司印章等) +- **文本**:自定义文本,颜色和字号可配置。如果未提供图片或文本,工具会根据证书的通用名称和当前日期自动生成文本。 + +## 签名元数据 + +- **原因**:签署文档的原因(例如“已批准”“已审阅”) +- **地点**:签署发生的地点(例如“New York, NY”) +- **联系信息**:联系签署人的方式(例如电子邮件地址) + +## 网络连接说明 + +签署可能需要网络连接。签名库会从证书的颁发机构信息访问 (AIA) 扩展中嵌入的 URL 获取证书链。如果这些服务器无法访问,需要证书链验证的证书将无法签署。 + +## 使用场景 + +- 使用具有法律效力的数字签名签署合同、提案和协议 +- 在需要基于 PKI 认证的工作流程中认证官方文件 +- 为满足监管要求而签署 PDF 发票(许多欧盟国家要求电子发票带有数字签名) +- 为工程图纸或质量文件添加组织批准 + +## 小提示 + +- 自签名证书可用于测试,但在 Adobe Reader 中会显示警告。正式文档请使用受信任证书颁发机构签发的证书。 +- 可见签名纯粹是视觉效果。无论是否启用可见签名块,加密签名都会被嵌入。 +- 使用验证签名工具检查已签署的 PDF,确认签名完好无损。 + +## 相关工具 + +- [验证签名](./validate-signature-pdf):验证已签署 PDF 中的数字签名 +- [拼合 PDF](./flatten-pdf):在签署前拼合表单,防止被修改 +- [加密 PDF](./protect-pdf):在数字签名之上添加密码保护 +- [移除元数据](./remove-metadata):在签署前清除元数据 diff --git a/docs/zh/tools/divide-pages.md b/docs/zh/tools/divide-pages.md new file mode 100644 index 00000000..4eb8c270 --- /dev/null +++ b/docs/zh/tools/divide-pages.md @@ -0,0 +1,42 @@ +--- +title: 分割页面 +description: 将 PDF 页面水平或垂直分割为更小的子页面。 +--- + +# 分割页面 + +通过水平或垂直分割,将单个 PDF 页面切成两半。当一个页面包含应分开成独立页面的内容时,这会很有用,例如被扫描成一张宽页的双栏版式。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 选择分割方向:**垂直**(左/右两半)或 **水平**(上/下两半)。 +3. 可选:指定页面范围,限定要分割的页面。留空则分割所有页面。 +4. 点击处理按钮,生成分割后的 PDF。 + +## 功能 + +- 垂直分割:将每页分成左右两半 +- 水平分割:将每页分成上下两半 +- 页面范围过滤,可有选择地分割特定页面 +- 未选中的页面保持不变 +- 无需重新渲染,保持内容质量 + +## 使用场景 + +- 分开双页扫描件(例如一张纸上同时包含左右两页的书籍扫描) +- 将带有并排内容的横向 PDF 拆分为单独的纵向页面 +- 将较高的信息图或海报分成上下两个独立部分 +- 为标准纸张打印准备宽幅文档 + +## 小提示 + +- 如果页面内容分布不均,分割仍会在精确的中点进行。如需非对称分割,可考虑改用 [裁剪 PDF](./crop-pdf)。 +- 如果页面在分割前或分割后需要旋转,可将此工具与 [旋转 PDF](./rotate-pdf) 结合使用。 + +## 相关工具 + +- [分割 PDF](./split-pdf) +- [裁剪 PDF](./crop-pdf) +- [N-Up PDF](./n-up-pdf) +- [海报化 PDF](./posterize-pdf) diff --git a/docs/zh/tools/duplex-collate.md b/docs/zh/tools/duplex-collate.md new file mode 100644 index 00000000..6d87819f --- /dev/null +++ b/docs/zh/tools/duplex-collate.md @@ -0,0 +1,55 @@ +--- +title: 双面扫描整理 +description: 将正面页和背面页分成两个区块的双面扫描 PDF,重新排列为正确的正反面页序。 +--- + +# 双面扫描整理 + +双面扫描整理专为 ADF 扫描流程设计,适用于一个 PDF 包含两个页面区块的情况: + +- 先是所有正面 +- 然后是所有背面 + +无需手动拆分再重新组装,此工具会将两个区块交错排列成自然的阅读顺序:正面 1、背面 1、正面 2、背面 2,依此类推。 + +## 使用方法 + +1. 上传一个由双面纸堆扫描生成的 PDF。 +2. 设置正面区块结束的分割点。 +3. 选择背面区块的处理方式: + - **反转背面区块**(扫描背面前翻转了纸堆时常用) + - **保持背面区块原样** +4. 点击 **整理 PDF**,下载重新排序后的结果。 + +## 选项 + +- **自动检测分割点(一半)**:将分割点设置为 `ceil(totalPages / 2)`。 +- **奇数页警告**:总页数为奇数时发出警告(通常意味着扫描不匹配)。 +- **区块不均等确认**:正面和背面区块大小不同时,要求确认。 +- **分组导出**:根据原始文档页数,将整理后的输出拆分为多个 PDF,并以 ZIP 下载。 + +## 输出行为 + +- **默认**:输出一个 PDF(输入单个 PDF,输出单个 PDF)。 +- **分组模式**:输出按您设置的每文档页数分块;如果产生多个分块,会作为一个 ZIP 下载,否则下载单个 PDF。 + +如果区块大小不均等,会先整理成对的页面,剩余未配对的页面则追加在末尾。 + +## 常见使用场景 + +- 分两次扫描一堆双面表格后恢复页面顺序。 +- 为先输出所有正面再输出所有背面的办公扫描仪重建正反面文档包。 +- 在拆分为单个文档文件之前,对归档扫描件进行后期处理。 + +## 小提示 + +- 大多数双面批次的总页数应为偶数。 +- 如果背面看起来是颠倒的,请在 **反转背面区块** 和 **保持背面区块原样** 之间切换。 +- 对于 2 页的原件(正面加背面),请使用分组导出,并将每文档页数设为 `2`。 + +## 相关工具 + +- [交替与混合页面](./alternate-merge) +- [分割 PDF](./split-pdf) +- [合并 PDF](./merge-pdf) +- [整理与复制](./organize-pdf) diff --git a/docs/zh/tools/edit-attachments.md b/docs/zh/tools/edit-attachments.md new file mode 100644 index 00000000..1896f0ad --- /dev/null +++ b/docs/zh/tools/edit-attachments.md @@ -0,0 +1,43 @@ +--- +title: 编辑附件 +description: 查看并有选择地移除嵌入在 PDF 文档中的文件附件。 +--- + +# 编辑附件 + +检查并管理 PDF 内部的文件附件。工具会列出每个嵌入文件的名称和附件级别,然后让您将单个附件标记为移除,或一次性清除全部附件。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 工具会自动扫描附件并以列表显示。 +3. 每个附件都会显示其文件名,以及它是文档级还是页面级附件。 +4. 点击附件旁的垃圾桶图标将其标记为移除(再次点击可取消标记)。 +5. 使用 **移除所有附件** 按钮一次性全选,或使用 **取消全选** 清除选择。 +6. 点击处理按钮,保存已移除所选附件的新 PDF。 + +## 功能 + +- 列出所有文档级和页面级附件 +- 单个或批量移除附件 +- 在提交更改前可开关选择状态 +- 标记为移除的项目会显示删除线并降低不透明度 +- 下载已清除所选附件的修改后 PDF + +## 使用场景 + +- 在重新分发之前,移除嵌入文档中的过时或错误文件 +- 在分享前,从 PDF 中清除敏感附件(财务数据、个人信息) +- 通过移除不再需要的大型嵌入文件来减小 PDF 体积 +- 在归档前审查嵌入内容并清理文档 + +## 小提示 + +- 标记为移除的附件会以删除线显示。如果您改变主意,可以在处理前将其切换回来。 +- 如果没有找到附件,工具会显示明确的“未找到附件”消息,说明该 PDF 不包含嵌入文件。 + +## 相关工具 + +- [添加附件](./add-attachments) +- [提取附件](./extract-attachments) +- [查看元数据](./view-metadata) diff --git a/docs/zh/tools/edit-metadata.md b/docs/zh/tools/edit-metadata.md new file mode 100644 index 00000000..c4cb0163 --- /dev/null +++ b/docs/zh/tools/edit-metadata.md @@ -0,0 +1,58 @@ +--- +title: 编辑元数据 +description: 查看并修改 PDF 元数据字段,包括标题、作者、关键词、日期和自定义属性。 +--- + +# 编辑元数据 + +编辑嵌入在 PDF 文件中的元数据。工具会用文档现有的元数据预先填充表单,让您修改任何字段,并将更改保存到新的 PDF 中。 + +## 使用方法 + +1. 上传 PDF 文件。工具会读取其当前元数据并填充表单。 +2. 编辑任意标准字段:标题、作者、主题、关键词、创建者、生成器。 +3. 使用日期时间选择器调整创建日期和修改日期。 +4. 点击添加按钮并输入键值对,即可添加自定义元数据字段。 +5. 点击处理按钮保存修改后的 PDF。 + +## 功能 + +- 预先填入上传 PDF 的所有现有元数据 +- 标准字段:标题、作者、主题、关键词、创建者、生成器 +- 创建日期和修改日期的日期时间选择器 +- 自定义键值元数据字段,可用于任意属性 +- 将更改直接保存到 PDF 的文档信息字典中 + +## 可编辑字段 + +| 字段 | 说明 | +| -------------- | -------------------------------- | +| **标题** | PDF 阅读器中显示的文档标题 | +| **作者** | 创建文档的个人或组织 | +| **主题** | 对文档主题的简要描述 | +| **关键词** | 以逗号分隔的词语,用于搜索和分类 | +| **创建者** | 最初创建内容的应用程序 | +| **生成器** | 生成该 PDF 的应用程序 | +| **创建日期** | 文档最初创建的时间 | +| **修改日期** | 文档最后修改的时间 | +| **自定义字段** | 您定义的任何其他键值对 | + +## 使用场景 + +- 在发布文档前设置恰当的标题和作者 +- 添加关键词,以提高文档管理系统中的可搜索性 +- 更新修改日期以反映当前修订版本 +- 添加部门、项目 ID 或密级等自定义元数据字段 +- 清理原始创作软件留下的元数据 + +## 小提示 + +- 自定义字段会直接写入 PDF 的信息字典。某些 PDF 阅读器可能不会显示自定义字段,但它们会保留在文件中。 +- 将字段留空即可从元数据中清除它。处理按钮会保存表单中的所有内容。 +- 如果只想查看元数据而不编辑,请使用 [查看元数据](./view-metadata)。如需完全移除所有元数据,请使用移除元数据。 + +## 相关工具 + +- [查看元数据](./view-metadata) +- [PDF 图层 (OCG)](./pdf-layers) +- [压缩 PDF](./compress-pdf) diff --git a/docs/zh/tools/edit-pdf.md b/docs/zh/tools/edit-pdf.md new file mode 100644 index 00000000..ac3f7a50 --- /dev/null +++ b/docs/zh/tools/edit-pdf.md @@ -0,0 +1,48 @@ +--- +title: PDF 编辑器 +description: 直接在浏览器中批注、高亮、涂黑、添加形状和图片、搜索并查看 PDF。 +--- + +# PDF 编辑器 + +BentoPDF 的 PDF 编辑器让您可以批注、高亮、涂黑、评论、添加形状和图片,并在 PDF 中搜索。它直接在浏览器中加载功能齐全的编辑器,无需上传到服务器。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上,上传您的 PDF。 +2. 内嵌的 PDF 编辑器会自动打开并载入您的文档。 +3. 使用工具栏进行批注、高亮、涂黑、添加文本、绘制形状或插入图片。 +4. 点击 **下载已编辑的 PDF** 保存您的更改。 + +## 功能 + +- 完整的批注工具栏,支持高亮、下划线、删除线和手绘 +- 文本插入和评论 +- 涂黑工具,在应用涂黑后会永久移除被标记的内容。如果点击 **下载已编辑的 PDF** 时仍有标记尚未应用,编辑器会提示先应用它们。 +- 矩形、圆形、直线和箭头等形状工具 +- 在 PDF 页面上插入图片 +- 内置的全文档文本搜索 +- 支持多文档标签页(最多同时打开 10 个文档) +- 支持拖放加载文件 + +## 使用场景 + +- 审阅合同,并用高亮和评论标记修改 +- 在分享前涂黑社会安全号码或财务数据等机密信息 +- 为建筑平面图或工程图纸添加批注 +- 在文档页面上插入公司标志或印章 +- 在冗长的法律文件中搜索特定术语 + +## 小提示 + +- 您可以同时打开多个 PDF,并使用编辑器顶部的标签栏在它们之间切换。 +- 编辑器会保留原始 PDF 的结构,因此字体、版面和表单字段保持完好。 +- 标记文本或区域用于涂黑,在应用涂黑之前不会移除任何内容。涂黑所选文本时,文件属性、书签、评论和附件中的副本也会从下载文件中一并移除,除非文件已加密。 +- 对于批量水印或页码,请改用专用工具,以便更好地控制格式。 + +## 相关工具 + +- [添加水印](./add-watermark) +- [签署 PDF](./sign-pdf) +- [添加印章](./add-stamps) +- [移除批注](./remove-annotations) diff --git a/docs/zh/tools/email-to-pdf.md b/docs/zh/tools/email-to-pdf.md new file mode 100644 index 00000000..81ec1eec --- /dev/null +++ b/docs/zh/tools/email-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: 邮件转 PDF +description: 在浏览器中将 EML 和 MSG 邮件文件转换为 PDF。保留邮件头、正文和附件列表。 +--- + +# 邮件转 PDF + +将保存的邮件文件转换为整洁、可打印的 PDF。工具会解析 EML 和 MSG 文件,提取完整的邮件内容(邮件头、正文和附件元数据),并将所有内容渲染成结构化的 PDF。适用于法律取证、记录保存,或只是打印一封重要邮件。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :--- | :----- | :--------------------------------------------- | +| EML | `.eml` | 标准 MIME 邮件格式(大多数邮件客户端均可导出) | +| MSG | `.msg` | Microsoft Outlook 专有格式 | + +## 使用方法 + +1. 点击上传区域,或拖放您的 EML 或 MSG 文件。可以在同一批次中混用两种格式。 +2. 查看文件列表。使用垃圾桶图标移除不需要的条目,或点击 **添加更多文件** 加入更多邮件。 +3. 配置转换选项(见下文)。 +4. 点击 **转换为 PDF**。工具会解析每封邮件,将内容渲染为带样式的 HTML,并通过 PyMuPDF 引擎转换为 PDF。 +5. 单封邮件会直接下载为 PDF。多封邮件会打包成 `emails-converted.zip`。 + +## 选项 + +| 选项 | 默认值 | 说明 | +| :----------------- | :----- | :------------------------------------------------------------ | +| **页面大小** | A4 | 在 A4、Letter 或 Legal 页面尺寸之间选择。 | +| **包含抄送和密送** | 开启 | 启用后,抄送和密送收件人列表会显示在 PDF 的邮件头部分。 | +| **包含附件列表** | 开启 | 启用后,邮件的文件附件列表(含文件名和大小)会显示在 PDF 中。 | + +## 使用场景 + +- 将重要的商务往来邮件归档为 PDF,用于合规或审计 +- 为法律程序或取证请求打印邮件往来 +- 为通过邮件收到的订单确认、收据或合同创建永久记录 +- 以无需 Outlook 即可阅读的格式备份 Outlook MSG 文件 +- 根据导出的 EML 文件记录客户支持沟通 + +## 小提示 + +- 同时支持 EML(Thunderbird、Apple Mail 和大多数邮件客户端使用)和 Outlook MSG 文件。从邮件客户端导出邮件,然后直接拖入工具即可。 +- HTML 格式的邮件会在 PDF 中保留其样式。纯文本邮件则以整洁易读的格式渲染。 +- 附件列表会显示文件名和大小,但不会将实际的附件文件嵌入 PDF。 + +## 相关工具 + +- [XML 转 PDF](./xml-to-pdf) +- [XPS 转 PDF](./xps-to-pdf) diff --git a/docs/zh/tools/epub-to-pdf.md b/docs/zh/tools/epub-to-pdf.md new file mode 100644 index 00000000..62661ce6 --- /dev/null +++ b/docs/zh/tools/epub-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: EPUB 转 PDF +description: 在浏览器中将 EPUB 电子书转换为 PDF。免费,无需上传,隐私优先的转换。 +--- + +# EPUB 转 PDF + +无需离开浏览器,即可将 EPUB 电子书转换为 PDF 文件。EPUB 是数字图书的开放标准,但有时您需要固定版式的 PDF,用于打印、批注,或分享给没有电子书阅读器的人。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :--- | :------ | :-------------------- | +| EPUB | `.epub` | EPUB 2 和 EPUB 3 文件 | + +## 使用方法 + +1. 点击上传区域,或拖放您的 EPUB 文件。支持多选。 +2. 查看已上传的文件。使用垃圾桶图标移除不需要的条目,或点击 **添加更多文件** 扩充批次。 +3. 点击 **转换为 PDF**。PyMuPDF 引擎会将 EPUB 内容(文本、图片和格式)渲染为分页的 PDF 输出。 +4. 单个 EPUB 会直接下载为 PDF。多个文件会打包成名为 `epub-converted.zip` 的 ZIP 压缩包。 + +## 选项 + +转换使用合理的默认值运行,无需任何配置。文本会重排为标准页面尺寸,嵌入的字体和图片会带入 PDF。 + +## 使用场景 + +- 打印无 DRM 的电子书,以便离开屏幕阅读 +- 将 EPUB 稿件以固定版式 PDF 提交审阅 +- 以每个操作系统都能原生打开的格式归档数字图书 +- 与没有 EPUB 阅读器的同事分享某一章节 +- 将以 EPUB 分发的技术文档转换为可批注的 PDF + +## 小提示 + +- 嵌入的音频和视频等 EPUB 3 功能无法带入 PDF,但所有文本、图片和表格都能干净地转换。 +- 对于样式繁多的 EPUB,为获得最佳效果,请检查输出的前几页,确认版式是否还原。 + +## 相关工具 + +- [MOBI 转 PDF](./mobi-to-pdf) +- [FB2 转 PDF](./fb2-to-pdf) +- [CBZ 转 PDF](./cbz-to-pdf) diff --git a/docs/zh/tools/excel-to-pdf.md b/docs/zh/tools/excel-to-pdf.md new file mode 100644 index 00000000..e74954f4 --- /dev/null +++ b/docs/zh/tools/excel-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: Excel 转 PDF +description: 将 Excel 电子表格(XLS、XLSX)、ODS 和 CSV 文件转换为 PDF,并保留格式。 +--- + +# Excel 转 PDF + +将电子表格文件转换为 PDF。此工具可处理现代 Excel 文件、旧版 XLS 格式、OpenDocument 电子表格,甚至 CSV,全部通过基于浏览器的 LibreOffice 引擎渲染,保留单元格格式、公式(以计算值呈现)、图表和多工作表版式。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :-------------------- | :------ | +| Excel(新版) | `.xlsx` | +| Excel(旧版) | `.xls` | +| OpenDocument 电子表格 | `.ods` | +| CSV | `.csv` | + +## 使用方法 + +1. 点击上传区域,或拖放您的电子表格文件。 +2. 查看文件列表。可添加更多文件或移除不需要的文件。 +3. 点击 **转换为 PDF**。LibreOffice 引擎会在首次使用时初始化,然后处理每个文件。 +4. 单个文件会直接下载为 PDF。多个文件会以 `excel-converted.zip` 提供。 + +## 选项 + +此工具没有额外配置。LibreOffice 引擎根据电子表格的内置设置确定页面布局、缩放和打印区域。 + +## 输出 + +| 输入数量 | 输出 | +| :------- | :-------------------------------------------------------- | +| 1 个文件 | 下载单个 PDF(原文件名,扩展名为 `.pdf`) | +| 2 个以上 | ZIP 压缩包(`excel-converted.zip`),每个文件对应一个 PDF | + +## 使用场景 + +- 将财务报告或预算从 Excel 转换为 PDF 以便分发 +- 根据库存或产品目录电子表格创建可直接打印的 PDF +- 与未安装 Excel 的相关方分享数据分析结果 +- 以不可编辑的格式归档季度报告 +- 将 LibreOffice Calc 的 ODS 文件转换为 PDF + +## 小提示 + +- 电子表格中嵌入的图表会在 PDF 中渲染。转换前请确保它们在源文件中显示正确。 +- 如果电子表格有多个工作表,所有工作表都会包含在 PDF 输出中。 +- 对于没有格式的简单 CSV 数据,[CSV 转 PDF](./csv-to-pdf) 工具提供更轻量的转换。当您需要保留格式、图表或多个工作表时,请使用 Excel 转 PDF。 + +## 相关工具 + +- [CSV 转 PDF](./csv-to-pdf) +- [Word 转 PDF](./word-to-pdf) +- [PowerPoint 转 PDF](./powerpoint-to-pdf) diff --git a/docs/zh/tools/extract-attachments.md b/docs/zh/tools/extract-attachments.md new file mode 100644 index 00000000..c117531e --- /dev/null +++ b/docs/zh/tools/extract-attachments.md @@ -0,0 +1,42 @@ +--- +title: 提取附件 +description: 从一个或多个 PDF 中提取所有嵌入的文件附件,并以 ZIP 压缩包下载。 +--- + +# 提取附件 + +从一个或多个 PDF 文件中取出所有嵌入的附件。所有提取的文件会打包成单个 ZIP 压缩包供下载。 + +## 使用方法 + +1. 上传一个或多个包含嵌入附件的 PDF 文件。 +2. 点击 **提取附件**。 +3. 工具会扫描每个 PDF 中的文档级和页面级附件。 +4. 找到的所有文件会被打包成 ZIP 压缩包并自动下载。 +5. 状态消息会确认找到了多少个附件及其总大小。 + +## 功能 + +- 一次性从多个 PDF 批量提取 +- 同时提取文档级和页面级附件 +- 输出包含所有提取文件的单个 ZIP 文件 +- 显示附件总数和合计文件大小 +- 未找到附件时给出明确的状态消息 + +## 使用场景 + +- 恢复嵌入在报告 PDF 中的数据文件 +- 从作品集或规格文档中取出图片素材 +- 从培训或合规 PDF 中提取补充材料 +- 审查一批 PDF 中嵌入了哪些文件 + +## 小提示 + +- 如果工具提示没有附件,PDF 中可能包含的是嵌入图片或表单数据,它们不属于文件附件。嵌入的图片请使用 [提取图片](./extract-images)。 +- 处理多个 PDF 时,所有文件的附件都会汇集到一个 ZIP 中。文件名会保留原始嵌入时的名称。 + +## 相关工具 + +- [添加附件](./add-attachments) +- [编辑附件](./edit-attachments) +- [提取图片](./extract-images) diff --git a/docs/zh/tools/extract-images.md b/docs/zh/tools/extract-images.md new file mode 100644 index 00000000..49259d60 --- /dev/null +++ b/docs/zh/tools/extract-images.md @@ -0,0 +1,45 @@ +--- +title: 提取图片 +description: 提取 PDF 文件中所有嵌入的图片。在网格中预览,可单独下载或打包为 ZIP 压缩包下载。 +--- + +# 提取图片 + +从一个或多个 PDF 文件中取出所有嵌入的图片。提取的图片会显示在预览网格中,您可以逐个下载,也可以一次性打包为 ZIP 下载。由 PyMuPDF 提供支持。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上,上传一个或多个 PDF。可根据需要添加更多文件或移除单个文件。 +2. 点击 **提取** 开始处理。 +3. 工具会扫描每个已上传 PDF 的每一页,查找并提取嵌入的图片。 +4. 提取的图片以缩略图形式显示在网格中。每张图片都有下载按钮。 +5. 点击 **全部下载**,将所有内容保存为 ZIP 压缩包。 + +## 选项 + +此工具没有可配置的选项。所有嵌入的图片都会以其原生格式提取(通常是 PNG、JPEG,或图片嵌入 PDF 时使用的任何格式)。 + +## 输出格式 + +- 图片在预览网格中以 `image_1.png`、`image_2.jpg` 等名称显示。 +- **全部下载** 会生成包含所有图片的 `extracted-images.zip`。 +- 可以从网格中逐个下载单张图片。 + +## 使用场景 + +- 从 PDF 中恢复照片或图形,以便在其他项目中重复使用。 +- 从产品目录 PDF 中提取产品图片,用于电商商品列表。 +- 从技术文档中取出图表,用于演示文稿。 +- 在分享文档前,审查其中嵌入了哪些图片。 + +## 小提示 + +- 此工具会按图片在 PDF 中的存储方式原样提取。它不会将页面重新渲染为图片。如需那样做,请使用 [PDF 转 PNG](./pdf-to-png) 或 [PDF 转 JPG](./pdf-to-jpg)。 +- 如果工具提示“未找到图片”,则 PDF 可能使用的是矢量图形而非嵌入的光栅图片,或者它是整页为一张大图的扫描文档。 +- 批量处理可跨多个 PDF 进行。所有文件的全部图片会合并到同一个网格和 ZIP 中。 + +## 相关工具 + +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 JPG](./pdf-to-jpg) +- [PDF 工作流构建器](./pdf-workflow) diff --git a/docs/zh/tools/extract-pages.md b/docs/zh/tools/extract-pages.md new file mode 100644 index 00000000..ec818d4e --- /dev/null +++ b/docs/zh/tools/extract-pages.md @@ -0,0 +1,41 @@ +--- +title: 提取页面 +description: 将 PDF 中指定范围的页面保存为新文档。 +--- + +# 提取页面 + +从 PDF 中取出一组页面并保存为新文件。使用范围语法准确指定所需页面,工具会创建仅包含这些页面的干净 PDF。 + +## 使用方法 + +1. 上传 PDF 文件。工具会显示文件名、大小和总页数。 +2. 使用范围语法输入要提取的页面(例如 `1-5`、`3, 7, 10-12`)。 +3. 可选:选择将每个范围作为单独的 PDF 放入 ZIP 压缩包下载。 +4. 点击处理按钮。提取的页面会下载为新的 PDF(或 ZIP)。 + +## 功能 + +- 灵活的页面范围语法:单个页面、范围或以逗号分隔的组合 +- 上传后显示总页数,方便参考 +- 可选择输出为单个合并 PDF,或 ZIP 中的多个独立文件 +- 保留原始页面内容和格式 + +## 使用场景 + +- 从冗长的报告中取出执行摘要(前几页) +- 从教科书 PDF 中提取单个章节 +- 将表单包中的特定页面保存为独立文档 +- 从较大文件的选定页面创建示例文档 + +## 小提示 + +- 页码从 1 开始。第一页请使用 `1`,而不是 `0`。 +- 如果要移除页面而不是提取页面,请使用 [删除页面](./delete-pages),它是相反的操作。 +- 如果您需要带缩略图的可视化页面选择,请在可视化选择模式下使用 [分割 PDF](./split-pdf)。 + +## 相关工具 + +- [分割 PDF](./split-pdf) +- [删除页面](./delete-pages) +- [合并 PDF](./merge-pdf) diff --git a/docs/zh/tools/extract-tables.md b/docs/zh/tools/extract-tables.md new file mode 100644 index 00000000..ece28588 --- /dev/null +++ b/docs/zh/tools/extract-tables.md @@ -0,0 +1,46 @@ +--- +title: 提取 PDF 表格 +description: 检测并提取 PDF 文档中的表格。可按单个表格导出为 CSV、JSON 或 Markdown。 +--- + +# 提取 PDF 表格 + +检测 PDF 中的所有表格,并让您选择导出格式:CSV、JSON 或 Markdown。每个表格都会被单独提取,并附带页面和位置元数据。由 PyMuPDF 的表格检测引擎提供支持。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上,上传 PDF。 +2. 选择您偏好的 **导出格式**:CSV、JSON 或 Markdown。 +3. 点击 **提取** 开始处理。 +4. 如果找到一个表格,它会作为单个文件下载。找到多个表格时,会生成每个表格一个文件的 ZIP 压缩包。 + +## 选项 + +- **导出格式**:可在以下选项中选择: + - **CSV**:以逗号分隔的值,对包含逗号、引号或换行符的字段进行了正确的引用处理。适用于电子表格和数据库。 + - **JSON**:数组的数组结构,以 2 个空格缩进格式化输出。适用于程序化使用。 + - **Markdown**:由 PyMuPDF 渲染的竖线分隔表格格式。适用于文档和 README 文件。 + +## 输出格式 + +- **单个表格**:`filename_table.csv`(或 `.json` / `.md`) +- **多个表格**:`filename_tables.zip`,其中包含名为 `table_1_page3.csv`、`table_2_page5.csv` 等的文件 + +## 使用场景 + +- 从冗长的 PDF 报告中提取特定表格,而无需取出整个文档的数据。 +- 获取 Markdown 格式的表格,直接粘贴到 GitHub issue、wiki 或文档中。 +- 从 PDF 表格中提取结构化的 JSON 数据,用于 API 集成或脚本。 +- 将不同版本的 PDF 表格导出为 CSV 后进行差异比对,从而比较表格。 + +## 小提示 + +- 此工具让您按表格逐个控制。如果您只想将所有表格导出到单个 CSV,请使用 [PDF 转 CSV](./pdf-to-csv)。如需完整的 Excel 工作簿,请使用 [PDF 转 Excel](./pdf-to-excel)。 +- 跨多页的表格可能会被检测为每页一个独立的表格。您可能需要手动将它们拼接起来。 +- 如果没有检测到表格,PDF 可能是扫描图像。请先运行 OCR 以添加文本层。 + +## 相关工具 + +- [PDF 转 CSV](./pdf-to-csv) +- [PDF 转 Excel](./pdf-to-excel) +- [PDF 转文本](./pdf-to-text) diff --git a/docs/zh/tools/fb2-to-pdf.md b/docs/zh/tools/fb2-to-pdf.md new file mode 100644 index 00000000..fad5920a --- /dev/null +++ b/docs/zh/tools/fb2-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: FB2 转 PDF +description: 在浏览器中将 FictionBook (FB2) 电子书文件转换为 PDF。免费、私密,无需上传到服务器。 +--- + +# FB2 转 PDF + +将 FictionBook 2 (FB2) 文件转换为 PDF 文档。FB2 是一种基于 XML 的电子书格式,在俄罗斯和东欧很流行。它在某些平台上支持良好,在其他平台上却几乎无人知晓,转换为 PDF 后,您的书籍就可以在任何地方阅读。 + +## 支持的格式 + +| 格式 | 扩展名 | 备注 | +| :------------ | :----- | :-------------------- | +| FictionBook 2 | `.fb2` | 基于 XML 的电子书格式 | + +## 使用方法 + +1. 点击上传区域或将 FB2 文件拖放进来。支持批量选择多个文件。 +2. 查看文件列表。使用垃圾桶图标移除单个文件,或点击 **添加更多文件** 加入更多文件。 +3. 点击 **转换为 PDF**。PyMuPDF 引擎会解析 FB2 的 XML 结构,并将其渲染为分页的 PDF 内容。 +4. 单个文件会直接下载为 PDF。转换多个文件时,会打包为 `fb2-converted.zip`。 + +## 选项 + +无需任何配置。转换器会自动处理 FB2 的 XML 结构,并保留章节分隔、格式和所有嵌入的图片。 + +## 使用场景 + +- 在只支持 PDF 的设备或应用上阅读 FB2 电子书 +- 打印以 FB2 格式发布的俄语文学作品 +- 将 FB2 藏书归档为通用支持的格式 +- 与阅读器不支持 FictionBook 的人分享一本书 + +## 小贴士 + +- FB2 文件是纯 XML,因此通常体积很小,即使在浏览器中也能快速转换。 +- 如果您的 FB2 文件被压缩为 `.fb2.zip`,请先解压再上传。 + +## 相关工具 + +- [EPUB 转 PDF](./epub-to-pdf) +- [MOBI 转 PDF](./mobi-to-pdf) +- [XML 转 PDF](./xml-to-pdf) diff --git a/docs/zh/tools/fix-page-size.md b/docs/zh/tools/fix-page-size.md new file mode 100644 index 00000000..d3157672 --- /dev/null +++ b/docs/zh/tools/fix-page-size.md @@ -0,0 +1,44 @@ +--- +title: 修复页面尺寸 +description: 将 PDF 中的所有页面统一为相同尺寸。可选择标准纸张尺寸或设置自定义尺寸。 +--- + +# 修复页面尺寸 + +由多个来源拼合而成的 PDF,页面尺寸往往不一致:有的是 Letter,有的是 A4,有的完全是非标准尺寸。此工具会将每一页统一为同一个目标尺寸,并按需缩放内容以适应或填满页面。 + +## 使用方法 + +1. 上传一个 PDF 文件。 +2. 从下拉菜单中选择 **目标页面尺寸**(A4、Letter、Legal、A3、A5、Tabloid 或自定义)。 +3. 选择 **方向**:自动会保留每页原有的方向,也可以强制设为纵向或横向。 +4. 选择 **内容缩放** 模式:适应(保留全部内容,可能添加边距)或填充(铺满页面,可能裁掉边缘)。 +5. 可选:为新增的边距设置 **背景颜色**。 +6. 点击 **修正页面尺寸**。 + +## 选项 + +- **标准尺寸**:A4、Letter、Legal、A3、A5、Tabloid +- **自定义尺寸**:以英寸或毫米输入宽度和高度 +- **方向**:自动、纵向、横向 +- **缩放模式**:适应或填充(裁剪) +- **背景颜色**:用于填充边距的任意颜色 + +## 使用场景 + +- 统一来自不同扫描仪的页面合并而成的 PDF +- 将美国 Letter 文档转换为 A4,便于国际分发 +- 准备要求裁切尺寸一致的可印刷 PDF +- 修正略微偏离标准的页面(例如 8.49 x 11.02 英寸而不是 8.5 x 11) + +## 小贴士 + +- 使用适应模式可确保不丢失任何内容。填充模式看起来更整洁,但可能裁掉边缘。 +- 使用页面尺寸工具检查输出结果,确认每一页都与目标尺寸一致。 +- 默认背景色为白色;如果文档带有深色边距,请改用深色。 + +## 相关工具 + +- [页面尺寸](./page-dimensions):修正前后检查页面尺寸 +- [压缩 PDF](./compress-pdf):统一尺寸后减小文件体积 +- [裁剪 PDF](./crop-pdf):手动裁剪页面,而不是自动缩放 diff --git a/docs/zh/tools/flatten-pdf.md b/docs/zh/tools/flatten-pdf.md new file mode 100644 index 00000000..307deb44 --- /dev/null +++ b/docs/zh/tools/flatten-pdf.md @@ -0,0 +1,51 @@ +--- +title: 扁平化 PDF +description: 将交互式表单和注释展平为静态内容。使表单字段不可编辑,并将注释烧录到页面中。 +--- + +# 扁平化 PDF + +展平会将交互元素(表单字段、下拉菜单、复选框、注释、高亮、便签)直接合并到页面内容中。外观保持不变,但内容不再可编辑或可提取。这相当于把填好的表单打印出来再扫描回去,只不过质量依然完美。 + +## 使用方法 + +1. 上传一个或多个 PDF 文件。 +2. 点击 **展平 PDF**。 +3. 单个文件会直接下载,多个文件会生成 ZIP 压缩包。 + +该工具使用 pdf-lib 展平表单字段(通过 `form.flatten()`),并使用专用的注释展平器将注释烧录到页面流中。两项操作在一次处理中完成。 + +## 会被展平的内容 + +- **表单字段**:文本输入框、复选框、单选按钮、下拉菜单、签名字段 +- **注释**:批注、高亮、删除线、下划线、便签、图章、墨迹注释 +- **交互元素**:按钮、动作触发器 + +## 保持不变的内容 + +- 文本内容(仍可选择和搜索) +- 图片和图形 +- 页面布局和尺寸 +- 书签和目录 +- 超链接(基于注释的除外) + +## 使用场景 + +- 锁定已填写的表单,使收件人无法更改已提交的答案 +- 为归档准备 PDF,此时不需要交互元素 +- 修复因注释在不同查看器中渲染不一致而导致的显示问题 +- 确保已签名的文档在签名后无法被修改 +- 通过去除表单字段定义和注释对象来减小文件体积 + +## 小贴士 + +- 请在所有编辑完成后再展平。PDF 无法取消展平。 +- 如果您需要在展平的同时清除元数据、JavaScript 和附件,请改用清理 PDF 工具,它的选项中包含展平。 +- 有些 PDF 会提示“未找到表单”,如果文档只有注释而没有表单字段,这是正常现象。 + +## 相关工具 + +- [清理 PDF](./sanitize-pdf):展平表单,同时移除元数据、脚本等 +- [栅格化 PDF](./rasterize-pdf):转换为基于图像的 PDF,实现最彻底的展平 +- [字体转轮廓](./font-to-outline):将字体展平为矢量路径 +- [加密 PDF](./protect-pdf):用密码锁定展平后的 PDF diff --git a/docs/zh/tools/font-to-outline.md b/docs/zh/tools/font-to-outline.md new file mode 100644 index 00000000..7ca67118 --- /dev/null +++ b/docs/zh/tools/font-to-outline.md @@ -0,0 +1,52 @@ +--- +title: 字体转轮廓 +description: 将 PDF 中的所有字体转换为矢量轮廓,使其在各种设备上渲染一致,彻底消除字体依赖问题。 +--- + +# 字体转轮廓 + +将字体转换为轮廓,会把每个文字字符从基于字体的字形变为矢量路径。PDF 不再依赖任何已安装的字体,在每台设备、每种操作系统和每台打印机上的呈现都完全相同。这是印前工作流程中的标准步骤。 + +## 使用方法 + +1. 上传一个或多个 PDF 文件。 +2. 点击 **转换为轮廓**。 +3. Ghostscript 会将所有文字转换为矢量路径。 +4. 下载结果。多个文件会生成 ZIP 压缩包。 + +无需任何设置。该工具使用 Ghostscript (WebAssembly),在一次处理中将所有字体引用转换为轮廓路径。 + +## 会发生的变化 + +- 文字字符变为矢量曲线(贝塞尔路径) +- 不再需要嵌入字体,PDF 在字形层面是自包含的 +- 文件体积可能增大,因为矢量路径通常比字体引用更大 +- 视觉外观完全保持不变 + +## 会失去的功能 + +- 文本选择和复制粘贴 +- 文本可搜索性(Ctrl+F 将失效) +- 编辑文本内容的能力 +- 屏幕阅读器的无障碍访问 + +## 使用场景 + +- 将 PDF 发送给要求字体转曲的印刷厂 +- 与没有相应字体的人分享使用自定义或授权字体的文档 +- 防止字体替换导致文档在其他系统上外观改变 +- 为需要矢量输入的激光雕刻或 CNC 切割流程准备 PDF +- 确保含有大量徽标的 PDF 在所有平台上正确显示 + +## 小贴士 + +- 请保留原始 PDF。转轮廓不可逆,无法将路径转换回可编辑的文本。 +- 如果您需要文本仍可搜索,可以考虑改用栅格化 PDF 工具,之后再进行 OCR。 +- 转轮廓后的 PDF 往往更大。如果文件体积很重要,请随后运行压缩 PDF。 + +## 相关工具 + +- [展平 PDF](./flatten-pdf):展平表单和注释,不触及字体 +- [栅格化 PDF](./rasterize-pdf):转换为基于图像的 PDF,而不是矢量轮廓 +- [压缩 PDF](./compress-pdf):转轮廓后减小文件体积 +- [PDF 转 PDF/A](./pdf-to-pdfa):确保字体独立后转换为归档格式 diff --git a/docs/zh/tools/form-creator.md b/docs/zh/tools/form-creator.md new file mode 100644 index 00000000..c4001cc0 --- /dev/null +++ b/docs/zh/tools/form-creator.md @@ -0,0 +1,76 @@ +--- +title: 创建 PDF 表单 +description: 通过拖放文本字段、复选框、下拉菜单、单选按钮等,构建可填写的 PDF 表单。 +--- + +# 创建 PDF 表单 + +从零开始,或在现有 PDF 上添加字段,设计专业的可填写 PDF 表单。可视化编辑器让您将文本字段、复选框、下拉菜单、单选按钮、签名字段等表单元素直接拖放到页面预览上。配置字段属性,设置条件显示规则,并导出完全交互式的 PDF 表单。 + +## 使用方法 + +1. 上传现有 PDF,**或** 点击 **创建空白 PDF** 从头开始。 +2. 如果创建空白 PDF,请选择页面尺寸(Letter、A4、A5、Legal、Tabloid、A3 或自定义尺寸)。 +3. 表单编辑器打开后,会显示字段类型工具栏和页面预览区域。 +4. 从工具栏选择字段类型,然后在页面上点击以放置。 +5. 拖动字段以调整位置,使用缩放手柄调整大小。 +6. 点击字段打开属性面板,可设置字段名称、默认值、字体大小、对齐方式等。 +7. 使用页面控件在各页之间切换。 +8. 点击 **保存** 下载完成的可填写 PDF。 + +## 功能 + +- 拖放放置字段,带有可视化的缩放手柄 +- 字段类型:文本输入、多行文本、复选框、下拉菜单、单选按钮、签名、日期、数字和条形码 +- 属性面板,用于配置每个字段的名称、标签、默认值、字体大小、颜色、对齐方式和验证 +- 字段动作和条件显示规则(根据其他字段的值显示或隐藏字段) +- 多页表单的页面导航 +- 现有字段提取:自动检测并导入上传 PDF 中的表单字段 +- 支持将上传的 PDF 和空白页面作为表单画布 +- 多种页面尺寸预设,以及自定义尺寸 +- 由 bwip-js 提供支持的条形码生成 +- 单选按钮组管理 + +## 选项 + +**页面尺寸预设(适用于空白 PDF):** + +- Letter (8.5" x 11") +- A4 (210mm x 297mm) +- A5 (148mm x 210mm) +- Legal (8.5" x 14") +- Tabloid (11" x 17") +- A3 (297mm x 420mm) +- 自定义(指定宽度和高度) + +**字段属性(因字段类型而异):** + +- 名称、标签和占位文本 +- 默认值 +- 字体、大小和颜色 +- 文本对齐(左、中、右) +- 必填字段开关 +- 只读开关 +- 文本字段的最大长度 +- 下拉菜单和单选按钮的选项列表 +- 条件显示动作 + +## 使用场景 + +- 构建员工入职表单,包含个人信息文本字段和政策确认复选框 +- 创建客户登记问卷,使用下拉菜单选择服务 +- 设计带有计算字段和条形码标识的订单表 +- 构建使用单选按钮进行合格或不合格评级的检查清单 +- 创建调查表单,根据回答显示条件式的后续问题 + +## 小贴士 + +- 如果您上传了现有 PDF,工具会尝试提取其中已有的表单字段,让您可以编辑或补充它们。 +- 使用单选按钮组功能创建互斥选项。同一单选组中的字段共享一个组名。 +- 下载表单后在 [PDF 表单填写](./form-filler) 中打开测试,以验证字段行为。 + +## 相关工具 + +- [PDF 表单填写](./form-filler) +- [签署 PDF](./sign-pdf) +- [PDF 编辑器](./edit-pdf) diff --git a/docs/zh/tools/form-filler.md b/docs/zh/tools/form-filler.md new file mode 100644 index 00000000..998e736d --- /dev/null +++ b/docs/zh/tools/form-filler.md @@ -0,0 +1,47 @@ +--- +title: PDF 表单填写器 +description: 在浏览器中通过内嵌查看器填写 PDF 表单,包括 XFA 表单。 +--- + +# PDF 表单填写器 + +打开带有表单字段的 PDF,并在内嵌查看器中直接填写。该工具同时支持标准 AcroForm 字段和旧版 XFA (XML Forms Architecture) 表单。填写完成后,一键下载已填写的版本。 + +## 使用方法 + +1. 上传包含表单字段的 PDF。 +2. 文档会在集成的 PDF 查看器中打开,表单字段呈现为可交互的输入控件。 +3. 点击文本字段、复选框、下拉菜单和单选按钮进行填写。 +4. 点击 **保存并下载已填写表单** 获取完成的 PDF。 + +## 功能 + +- 内嵌 PDF.js 查看器,支持完整的表单字段交互 +- 支持标准 AcroForm 字段(文本输入、复选框、下拉菜单、单选按钮) +- 支持基于 XML 的旧版 XFA 表单 +- 根据页面尺寸自动调整查看器大小 +- 显示文件名称和大小信息 + +## 选项 + +没有其他配置选项。上传表单,填写,然后下载即可。 + +## 使用场景 + +- 填写税务表格、保险申请表或政府文书 +- 填写以 PDF 附件形式收到的求职申请表 +- 填写供应商入驻表单或供应商问卷 +- 通过复选框字段签署合规检查清单 +- 就诊前填写医疗登记表 + +## 小贴士 + +- XFA 表单是仅被部分 PDF 查看器支持的旧版格式。如果您在 Chrome 或大多数其他工具中打开 XFA PDF 后看到空白页,说明这些查看器不支持 XFA。BentoPDF 的表单填写工具和 Firefox 都能正确处理 XFA。 +- 对于没有现成表单字段的 PDF,请先使用 [创建 PDF 表单](./form-creator) 工具添加字段,再在此处填写。 +- 查看器会自动调整大小以匹配 PDF 的页面尺寸。 + +## 相关工具 + +- [创建 PDF 表单](./form-creator) +- [签署 PDF](./sign-pdf) +- [PDF 编辑器](./edit-pdf) diff --git a/docs/zh/tools/header-footer.md b/docs/zh/tools/header-footer.md new file mode 100644 index 00000000..87c87b67 --- /dev/null +++ b/docs/zh/tools/header-footer.md @@ -0,0 +1,53 @@ +--- +title: 页眉和页脚 +description: 为 PDF 页面添加可自定义的页眉和页脚文本,支持动态页码变量。 +--- + +# 页眉和页脚 + +在 PDF 页面的六个位置添加文本:页眉左、页眉中、页眉右、页脚左、页脚中和页脚右。该工具支持页码和总页数的动态变量,因此您可以创建类似“第 3 页,共 10 页”的模板,并按页自动更新。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 出现选项面板,显示格式控件和六个文本输入框。 +3. 在任意页眉或页脚位置输入所需文本。 +4. 使用 `{page}` 和 `{total}` 占位符实现动态页码。 +5. 调整字体大小、字体颜色,也可以选择限制在特定页面范围内。 +6. 点击 **添加页眉和页脚** 进行处理并下载。 + +## 选项 + +- **页面范围**:可选,限制哪些页面添加页眉和页脚。留空则应用于所有页面。格式:"1-3, 5"(以逗号分隔的范围)。 +- **字体大小**:6 到 24 磅之间。默认为 10。 +- **字体颜色**:使用颜色选择器选取任意颜色。 +- **页眉左 / 中 / 右**:每页顶部的文本字段。 +- **页脚左 / 中 / 右**:每页底部的文本字段。 + +## 功能 + +- 每页六个独立的文本位置 +- 动态 `{page}` 变量,插入当前页码 +- 动态 `{total}` 变量,插入总页数 +- 页面范围过滤,针对特定页面 +- 可自定义字体大小和颜色 +- 使用 Helvetica 字体,输出整洁专业 + +## 使用场景 + +- 在报告的页脚中间添加“第 {page} 页,共 {total} 页” +- 在页眉左侧放置公司名称,在页眉右侧放置文档日期 +- 在法律文件的页脚添加保密声明 +- 在特定页面范围上标注文档修订编号 + +## 小贴士 + +- 可以在同一个字段中组合 `{page}` 和 `{total}`,例如“第 {page} 页,共 {total} 页”或“{page}/{total}”。 +- 大多数字段可以留空,只填写需要的位置。空字段会被直接跳过。 +- 对于包含图片或徽标的更复杂页眉,可以考虑使用 [添加水印](./add-watermark) 工具,并将其放置在页面顶部。 + +## 相关工具 + +- [页码](./page-numbers) +- [添加水印](./add-watermark) +- [Bates 编号](./bates-numbering) diff --git a/docs/zh/tools/heic-to-pdf.md b/docs/zh/tools/heic-to-pdf.md new file mode 100644 index 00000000..778c2d4a --- /dev/null +++ b/docs/zh/tools/heic-to-pdf.md @@ -0,0 +1,46 @@ +--- +title: HEIC 转 PDF +description: 在浏览器中将 iPhone 和 iPad 的 HEIC 和 HEIF 图片转换为 PDF 格式。 +--- + +# HEIC 转 PDF + +将 HEIC/HEIF 图片转换为 PDF。自 iOS 11 起,HEIC 就是 iPhone 和 iPad 的默认照片格式。借助此工具,您无需安装任何桌面软件,也无需将文件上传到服务器,就能把这些照片变成 PDF。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :------ | +| HEIC | `.heic` | +| HEIF | `.heif` | + +## 使用方法 + +1. 点击上传区域或将 HEIC/HEIF 文件拖放进来。 +2. 查看文件列表,移除不需要的文件。 +3. 点击 **转换为 PDF**。结果会以 `from_heic.pdf` 下载。 + +每个 HEIC 文件都使用 heic2any 库解码,并以 92% 的质量转换为 PNG。随后使用 pdf-lib 将 PNG 嵌入 PDF,每张图片独占一页,保持完整分辨率。 + +## 选项 + +此工具不提供额外设置。HEIC 图片在嵌入前以高质量 (0.92) 转换为 PNG。 + +## 使用场景 + +- 用 iPhone 照片创建 PDF,附在保险理赔申请或报告中 +- 将房地产房源的 HEIC 照片转换为一份可打印的文档 +- 将 iPad 截图(HEIF 格式)变成可分享的 PDF +- 批量转换度假照片,制作旅行日志 + +## 小贴士 + +- HEIC 解码完全在浏览器中使用 WebAssembly 完成。解码器加载期间,首次转换可能需要稍等片刻。 +- 如果您需要混合 HEIC 与其他图片格式(JPG、PNG 等),请使用 [图片转 PDF](./image-to-pdf) 工具,它可以同时处理 HEIC 和所有其他格式。 +- iPhone 的 HEIC 文件通常包含 EXIF 数据,其中有 GPS 坐标。PDF 输出不会保留这些元数据。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [JPG 转 PDF](./jpg-to-pdf) +- [PNG 转 PDF](./png-to-pdf) diff --git a/docs/zh/tools/image-to-pdf.md b/docs/zh/tools/image-to-pdf.md new file mode 100644 index 00000000..949ac973 --- /dev/null +++ b/docs/zh/tools/image-to-pdf.md @@ -0,0 +1,65 @@ +--- +title: 图片转 PDF +description: 将 JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP、PSD 以及 10 多种其他图片格式合并为一个 PDF 文件。 +--- + +# 图片转 PDF + +通用的图片转 PDF 转换器。上传几乎任何格式的图片,并将它们合并为一个 PDF 文档。每张图片独占一页,页面大小与原始尺寸一致。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :-------------- | :------------------------------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | +| PNG | `.png` | +| BMP | `.bmp` | +| GIF | `.gif` | +| TIFF | `.tiff`, `.tif` | +| SVG | `.svg` | +| HEIC/HEIF | `.heic`, `.heif` | +| WebP | `.webp` | +| PSD | `.psd` | +| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` | +| JPEG XR | `.jxr` | + +这是 BentoPDF 所有图片转换器中支持格式最广的一个。如果您只需要某一种特定格式,可以改用对应的专用工具。 + +## 使用方法 + +1. 点击上传区域或将图片文件拖放进来。可以一次选择多个文件。 +2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或点击 **添加更多文件** 加入更多图片。 +3. 从下拉菜单中选择 **PDF 质量** 级别。 +4. 点击 **转换为 PDF**。该工具通过 PyMuPDF 引擎处理图片,并将结果下载为 `images_to_pdf.pdf`。 + +## 选项 + +**PDF 质量** 控制将图片嵌入 PDF 时应用的图片压缩: + +- **高质量**:压缩最少,文件较大。最适合打印或归档。 +- **中等质量**(默认):均衡压缩。适合大多数用途。 +- **低质量**:激进压缩,文件最小。适合邮件发送或快速分享。 + +HEIC 和 WebP 文件在嵌入前会自动转换为 PNG。这一过程是透明的,无需任何额外操作。 + +## 使用场景 + +- 将手机相机拍摄的扫描收据或文档合并为一个 PDF +- 用多种格式的图片制作摄影作品集或产品画册 +- 无需安装桌面软件,即可将 iPhone 照片 (HEIC) 转换为可分享的 PDF +- 将 PSD 导出文件和截图汇总为交付给客户的设计稿 +- 将一个文件夹中的旧版图片格式 (PNM、JXR、JP2) 归档为单个 PDF + +## 小贴士 + +- 图片在 PDF 中的顺序与它们在文件列表中的顺序一致。请按您想要的顺序上传。 +- 若要获得尽可能小的文件,请选择低质量。对于以文字为主的扫描件,视觉差异通常可以忽略。 +- 如果您只有一种图片格式,专用转换器(JPG 转 PDF、PNG 转 PDF 等)能以更简单的界面得到相同的结果。 + +## 相关工具 + +- [JPG 转 PDF](./jpg-to-pdf) +- [PNG 转 PDF](./png-to-pdf) +- [HEIC 转 PDF](./heic-to-pdf) +- [WebP 转 PDF](./webp-to-pdf) diff --git a/docs/zh/tools/index.md b/docs/zh/tools/index.md new file mode 100644 index 00000000..7d91049f --- /dev/null +++ b/docs/zh/tools/index.md @@ -0,0 +1,183 @@ +# 工具参考 + +BentoPDF 提供 **130 多种工具** 来处理 PDF。所有工具完全在您的浏览器中运行,您的文件永远不会离开您的设备。 + +--- + +## 编辑与批注 + +使用一整套编辑工具修改、标记和增强您的 PDF 文档。 + +
+ +- [**PDF 编辑器**](./edit-pdf):批注、高亮、涂黑、评论、添加形状和图片、搜索和查看 PDF。 +- [**编辑书签**](./bookmark):添加、编辑、导入、删除和提取 PDF 书签。 +- [**目录**](./table-of-contents):根据 PDF 书签生成目录页。 +- [**页码**](./page-numbers):在文档中插入页码。 +- [**添加页面标签**](./add-page-labels):应用带有罗马数字、前缀和自定义起始值的 PDF 页面标签。 +- [**Bates 编号**](./bates-numbering):在一个或多个 PDF 文件中添加连续的 Bates 编号。 +- [**添加水印**](./add-watermark):在 PDF 页面上叠加文字或图片。 +- [**页眉和页脚**](./header-footer):在页面顶部和底部添加文本。 +- [**反转颜色**](./invert-colors):创建 PDF 的深色模式版本。 +- [**扫描效果**](./scanner-effect):让您的 PDF 看起来像扫描文档。 +- [**调整颜色**](./adjust-colors):微调亮度、对比度、饱和度等。 +- [**背景颜色**](./background-color):更改 PDF 的背景颜色。 +- [**更改文字颜色**](./text-color):更改 PDF 中文字的颜色。 +- [**签署 PDF**](./sign-pdf):绘制、输入或上传您的签名。 +- [**添加图章**](./add-stamps):使用批注工具栏为 PDF 添加图片图章。 +- [**移除批注**](./remove-annotations):清除评论、高亮和链接。 +- [**裁剪 PDF**](./crop-pdf):裁掉 PDF 中每一页的边距。 +- [**PDF 表单填写**](./form-filler):直接在浏览器中填写表单。也支持 XFA 表单。 +- [**创建 PDF 表单**](./form-creator):通过拖放文本字段创建可填写的 PDF 表单。 +- [**移除空白页**](./remove-blank-pages):自动检测并删除空白页。 + +
+ +--- + +## 转换为 PDF + +将图片、文档、电子书和其他文件格式转换为 PDF。 + +
+ +- [**图片转 PDF**](./image-to-pdf):将 JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP 等转换为 PDF。 +- [**JPG 转 PDF**](./jpg-to-pdf):用一张或多张 JPG 图片创建 PDF。 +- [**PNG 转 PDF**](./png-to-pdf):用一张或多张 PNG 图片创建 PDF。 +- [**WebP 转 PDF**](./webp-to-pdf):用一张或多张 WebP 图片创建 PDF。 +- [**SVG 转 PDF**](./svg-to-pdf):用一张或多张 SVG 图片创建 PDF。 +- [**BMP 转 PDF**](./bmp-to-pdf):用一张或多张 BMP 图片创建 PDF。 +- [**HEIC 转 PDF**](./heic-to-pdf):用一张或多张 HEIC 图片创建 PDF。 +- [**TIFF 转 PDF**](./tiff-to-pdf):用一张或多张 TIFF 图片创建 PDF。 +- [**文本转 PDF**](./txt-to-pdf):将纯文本文件转换为 PDF。 +- [**Markdown 转 PDF**](./markdown-to-pdf):将 Markdown 转换为 PDF,支持实时预览和语法高亮。 +- [**JSON 转 PDF**](./json-to-pdf):将 JSON 文件转换为 PDF 格式。 +- [**ODT 转 PDF**](./odt-to-pdf):将 ODT (OpenDocument Text) 文件转换为 PDF。 +- [**CSV 转 PDF**](./csv-to-pdf):将 CSV 电子表格转换为 PDF。 +- [**RTF 转 PDF**](./rtf-to-pdf):将 RTF (Rich Text Format) 文档转换为 PDF。 +- [**Word 转 PDF**](./word-to-pdf):将 Word 文档 (DOCX、DOC、ODT) 转换为 PDF。 +- [**Excel 转 PDF**](./excel-to-pdf):将 Excel 电子表格 (XLSX、XLS、ODS) 转换为 PDF。 +- [**PowerPoint 转 PDF**](./powerpoint-to-pdf):将 PowerPoint 演示文稿 (PPTX、PPT、ODP) 转换为 PDF。 +- [**XPS 转 PDF**](./xps-to-pdf):将 XPS/OXPS 文档转换为 PDF。 +- [**MOBI 转 PDF**](./mobi-to-pdf):将 MOBI 电子书转换为 PDF。 +- [**EPUB 转 PDF**](./epub-to-pdf):将 EPUB 电子书转换为 PDF。 +- [**FB2 转 PDF**](./fb2-to-pdf):将 FictionBook (FB2) 电子书转换为 PDF。 +- [**CBZ 转 PDF**](./cbz-to-pdf):将漫画压缩包 (CBZ/CBR) 转换为 PDF。 +- [**WPD 转 PDF**](./wpd-to-pdf):将 WordPerfect 文档 (WPD) 转换为 PDF。 +- [**WPS 转 PDF**](./wps-to-pdf):将 WPS Office 文档转换为 PDF。 +- [**XML 转 PDF**](./xml-to-pdf):将 XML 文档转换为 PDF。 +- [**ODG 转 PDF**](./odg-to-pdf):将 OpenDocument Graphics (ODG) 转换为 PDF。 +- [**ODS 转 PDF**](./ods-to-pdf):将 OpenDocument Spreadsheet (ODS) 转换为 PDF。 +- [**ODP 转 PDF**](./odp-to-pdf):将 OpenDocument Presentation (ODP) 转换为 PDF。 +- [**PUB 转 PDF**](./pub-to-pdf):将 Microsoft Publisher (PUB) 转换为 PDF。 +- [**VSD 转 PDF**](./vsd-to-pdf):将 Microsoft Visio (VSD、VSDX) 转换为 PDF。 +- [**PSD 转 PDF**](./psd-to-pdf):将 Adobe Photoshop (PSD) 文件转换为 PDF。 +- [**邮件转 PDF**](./email-to-pdf):将邮件文件 (EML、MSG) 转换为 PDF 格式。 + +
+ +--- + +## 从 PDF 转换 + +将 PDF 中的内容提取为图片、文档和数据格式。 + +
+ +- [**PDF 转 JPG**](./pdf-to-jpg):将每个 PDF 页面转换为 JPG 图片。 +- [**PDF 转 PNG**](./pdf-to-png):将每个 PDF 页面转换为 PNG 图片。 +- [**PDF 转 WebP**](./pdf-to-webp):将每个 PDF 页面转换为 WebP 图片。 +- [**PDF 转 BMP**](./pdf-to-bmp):将每个 PDF 页面转换为 BMP 图片。 +- [**PDF 转 TIFF**](./pdf-to-tiff):将每个 PDF 页面转换为 TIFF 图片。 +- [**PDF 转 CBZ**](./pdf-to-cbz):将 PDF 转换为 CBZ(漫画压缩包),适用于漫画阅读器和 Calibre。 +- [**PDF 转 SVG**](./pdf-to-svg):将每个 PDF 页面转换为可缩放矢量图形。 +- [**PDF 转 CSV**](./pdf-to-csv):从 PDF 中提取表格并转换为 CSV 格式。 +- [**PDF 转 Excel**](./pdf-to-excel):从 PDF 中提取表格并转换为 Excel (XLSX)。 +- [**PDF 转灰度**](./pdf-to-greyscale):将所有颜色转换为黑白。 +- [**PDF 转 JSON**](./pdf-to-json):将 PDF 文件转换为 JSON 格式。 +- [**PDF 转 Word**](./pdf-to-word):将 PDF 文件转换为可编辑的 Word 文档。 +- [**提取图片**](./extract-images):从 PDF 文件中提取所有嵌入的图片。 +- [**PDF 转 Markdown**](./pdf-to-markdown):将 PDF 文本和表格转换为 Markdown 格式。 +- [**为 AI 准备 PDF**](./prepare-pdf-for-ai):将 PDF 内容提取为 LlamaIndex JSON,用于 RAG/LLM 流程。 +- [**PDF 转文本**](./pdf-to-text):从 PDF 文件中提取文本并保存为纯文本。 +- [**提取表格**](./extract-tables):将 PDF 中的表格提取为 CSV、JSON 或 Markdown。 + +
+ +--- + +## 整理与管理 + +重新排列、合并、拆分和管理您的 PDF 页面和文件。 + +
+ +- [**PDF 工作流构建器**](./pdf-workflow):使用可视化节点编辑器构建自定义 PDF 处理流水线。 +- [**PDF 多功能工具**](./pdf-multi-tool):功能齐全的 PDF 编辑器,支持页面管理。 +- [**OCR PDF**](./ocr-pdf):让 PDF 可搜索、可复制。 +- [**合并 PDF**](./merge-pdf):将多个 PDF 合并为一个文件。 +- [**交替混合页面**](./alternate-merge):通过交替取每个 PDF 的页面来合并 PDF。 +- [**双面整理**](./duplex-collate):将正反面扫描块重新排列为正确的页面顺序。 +- [**整理和复制页面**](./organize-pdf):复制、重新排序和删除页面。 +- [**添加附件**](./add-attachments):将一个或多个文件嵌入您的 PDF。 +- [**提取附件**](./extract-attachments):将 PDF 中所有嵌入的文件提取为 ZIP。 +- [**编辑附件**](./edit-attachments):查看或移除 PDF 中的附件。 +- [**PDF 图层 (OCG)**](./pdf-layers):查看、切换、添加和删除 PDF 中的 OCG 图层。 +- [**分割 PDF**](./split-pdf):将一段页面范围提取为新的 PDF。 +- [**分割页面**](./divide-pages):水平或垂直分割页面。 +- [**提取页面**](./extract-pages):将选定的页面保存为新文件。 +- [**删除页面**](./delete-pages):从文档中移除特定页面。 +- [**添加空白页**](./add-blank-page):在 PDF 的任意位置插入一个空白页。 +- [**反转页面**](./reverse-pages):颠倒文档中所有页面的顺序。 +- [**旋转 PDF**](./rotate-pdf):以 90 度为单位旋转页面。 +- [**自定义角度旋转**](./rotate-custom):按任意自定义角度旋转页面。 +- [**N-Up PDF**](./n-up-pdf):将多个页面排列到同一张纸上。 +- [**PDF 小册子**](./pdf-booklet):重新排列页面,用于双面小册子打印。 +- [**合并为单页**](./combine-single-page):将所有页面拼接为一个连续的长页。 +- [**查看元数据**](./view-metadata):检查 PDF 的隐藏属性。 +- [**编辑元数据**](./edit-metadata):更改作者、标题和其他属性。 +- [**PDF 转 ZIP**](./pdf-to-zip):将多个 PDF 文件打包为 ZIP 压缩包。 +- [**比较 PDF**](./compare-pdfs):并排比较两个 PDF。 +- [**海报化 PDF**](./posterize-pdf):将一个大页面拆分为多个较小的页面。 + +
+ +--- + +## 优化与修复 + +压缩、修复和优化您的 PDF,以获得更好的性能和兼容性。 + +
+ +- [**压缩 PDF**](./compress-pdf):减小 PDF 的文件大小。 +- [**PDF 转 PDF/A**](./pdf-to-pdfa):将 PDF 转换为 PDF/A,用于长期归档。 +- [**修正页面尺寸**](./fix-page-size):将所有页面统一为相同尺寸。 +- [**线性化 PDF**](./linearize-pdf):优化 PDF,实现快速网页查看。 +- [**页面尺寸**](./page-dimensions):分析页面尺寸、方向和单位。 +- [**移除限制**](./remove-restrictions):移除密码保护和安全限制。 +- [**修复 PDF**](./repair-pdf):从损坏或受损的 PDF 文件中恢复数据。 +- [**栅格化 PDF**](./rasterize-pdf):将 PDF 转换为基于图像的 PDF。展平图层并移除可选文本。 +- [**校正 PDF**](./deskew-pdf):使用 OpenCV 自动矫正倾斜的扫描页面。 +- [**字体转轮廓**](./font-to-outline):将所有字体转换为矢量轮廓,实现一致的渲染。 + +
+ +--- + +## 保护 PDF + +保护、加密并控制对 PDF 文档的访问。 + +
+ +- [**加密 PDF**](./protect-pdf):添加密码以锁定您的 PDF。 +- [**清理 PDF**](./sanitize-pdf):移除元数据、批注、脚本等。 +- [**解密 PDF**](./unlock-pdf):移除密码保护以解锁 PDF。 +- [**展平 PDF**](./flatten-pdf):使表单字段和批注不可编辑。 +- [**移除元数据**](./remove-metadata):清除 PDF 中的隐藏数据。 +- [**更改权限**](./change-permissions):设置或更改 PDF 的用户权限。 +- [**数字签名**](./digital-sign-pdf):使用 X.509 证书添加加密数字签名。 +- [**验证签名**](./validate-signature-pdf):验证数字签名并查看证书详情。 + +
diff --git a/docs/zh/tools/invert-colors.md b/docs/zh/tools/invert-colors.md new file mode 100644 index 00000000..00c78cf6 --- /dev/null +++ b/docs/zh/tools/invert-colors.md @@ -0,0 +1,42 @@ +--- +title: 反转颜色 +description: 反转 PDF 中的所有颜色,为任何文档创建深色模式版本。 +--- + +# 反转颜色 + +将 PDF 中的每种颜色翻转为其反色。白色背景变为黑色,黑色文字变为白色,所有其他颜色则转为其互补色。这是为任何 PDF 创建“深色模式”版本的最快方法。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 点击 **反转颜色** 开始处理。 +3. 反转后的 PDF 会自动下载。 + +没有其他设置。该工具会将每一页渲染为图像,反转所有像素颜色,并将结果重新组装为新的 PDF。 + +## 功能 + +- 一键反转所有页面的颜色 +- 处理文档中的每一页 +- 保持原有的页面尺寸和布局 +- 适用于任何 PDF,无论内容类型(文本、图片或混合) + +## 使用场景 + +- 为教科书或手册创建深色模式版本,方便夜间舒适阅读 +- 为无障碍需求准备高对比度版本的文档 +- 反转因曝光不当而扫描的文档 +- 为以图片为主的 PDF 生成负片版本,用于视觉分析 + +## 小贴士 + +- 由于该工具通过栅格化页面来应用效果,输出结果是基于图像的。文本将不再可选择或可搜索。如果您在反转后需要可搜索的文本,请将输出结果交给 OCR 工具处理。 +- 如需更精细的颜色调整(亮度、对比度、饱和度),请改用 [调整颜色](./adjust-colors) 工具。 +- 页数较多的大型 PDF 可能需要更长的处理时间,因为每一页都要单独渲染和反转。 + +## 相关工具 + +- [调整颜色](./adjust-colors) +- [背景颜色](./background-color) +- [扫描效果](./scanner-effect) diff --git a/docs/zh/tools/jpg-to-pdf.md b/docs/zh/tools/jpg-to-pdf.md new file mode 100644 index 00000000..9c9806ec --- /dev/null +++ b/docs/zh/tools/jpg-to-pdf.md @@ -0,0 +1,48 @@ +--- +title: JPG 转 PDF +description: 在浏览器中将一张或多张 JPG、JPEG 和 JPEG 2000 图片转换为单个 PDF 文件。 +--- + +# JPG 转 PDF + +将 JPG 图片变成整洁的 PDF。可以上传单个文件,也可以批量上传多张 JPG,每张图片都会成为输出文档中的一个整页。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :-------- | :-------------- | +| JPEG | `.jpg`, `.jpeg` | +| JPEG 2000 | `.jp2`, `.jpx` | + +## 使用方法 + +1. 点击上传区域或将 JPG 文件拖放进来。支持多选。 +2. 查看已上传的文件。使用垃圾桶图标移除单个文件,或点击 **添加更多文件** 追加到列表。 +3. 选择 **PDF 质量** 级别。 +4. 点击 **转换为 PDF**。该工具会按照您的质量设置压缩图片,通过 PyMuPDF 引擎进行转换,并下载 `from_jpgs.pdf`。 + +## 选项 + +**PDF 质量** 用于调整图片嵌入 PDF 之前应用的压缩程度: + +- **高质量**:保留最多细节。适用于摄影作品或打印。 +- **中等质量**(默认):在清晰度和文件大小之间取得良好平衡。 +- **低质量**:激进压缩,输出最小。 + +## 使用场景 + +- 将保存为 JPG 的扫描文档转换为一份用于提交的 PDF +- 将产品照片整理成给客户的目录 +- 将 JPEG 2000 格式的医学或卫星图像转为便携的 PDF +- 用相机导出的照片创建可打印的相册 + +## 小贴士 + +- 完整支持 JPEG 2000 文件(`.jp2`、`.jpx`),而不仅仅是标准 JPEG。这对医学影像和地理空间数据很有用。 +- 如果您的 JPG 来自手机相机,中等质量生成的文件通常比高质量小 40-60%,而在屏幕上看不出明显差异。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [PNG 转 PDF](./png-to-pdf) +- [WebP 转 PDF](./webp-to-pdf) diff --git a/docs/zh/tools/json-to-pdf.md b/docs/zh/tools/json-to-pdf.md new file mode 100644 index 00000000..e10c079d --- /dev/null +++ b/docs/zh/tools/json-to-pdf.md @@ -0,0 +1,53 @@ +--- +title: JSON 转 PDF +description: 从 BentoPDF 的 JSON 格式重建 PDF 文件。将 JSON 导出文件转换回原始 PDF 文档。 +--- + +# JSON 转 PDF + +从之前由 BentoPDF 的 **PDF 转 JSON** 工具创建的 JSON 文件中重建 PDF 文档。这是一个往返转换工具:它读取 PDF 的结构化 JSON 表示,并重建原始文档。 + +::: warning +此工具只接受由 BentoPDF 的 PDF 转 JSON 转换器生成的 JSON 文件。来自 API、数据库或其他工具的标准 JSON 文件不受支持。 +::: + +## 支持的格式 + +| 输入 | 说明 | +| :------ | :---------------------------------------------- | +| `.json` | 由 BentoPDF 的 PDF 转 JSON 工具导出的 JSON 文件 | + +## 使用方法 + +1. 点击上传区域或拖放一个或多个 JSON 文件。 +2. 文件列表会显示每个已选文件及其大小。 +3. 点击 **转换为 PDF**。该工具使用 Web Worker 和 CPDF 引擎处理所有文件。 +4. 输出会下载为 `jsons-to-pdf.zip`,其中每个输入 JSON 文件对应一个 PDF。 + +转换在后台 Web Worker 中运行,因此即使处理大文件,界面也能保持响应。 + +## 选项 + +此工具没有可配置的选项。输出的 PDF 完全由 JSON 结构决定。 + +## 输出 + +转换多个 JSON 文件时,结果会以 ZIP 压缩包形式提供。每个 PDF 都以其源 JSON 文件命名(例如 `report.json` 会变为 `report.pdf`)。 + +## 使用场景 + +- 从基于 JSON 的备份或归档流程中还原 PDF +- 将 PDF 转为 JSON 进行检查,再转回 PDF +- 在以编程方式修改 JSON 结构后重建文档 +- 通过转换回 PDF,验证 PDF 转 JSON 的导出是否捕获了全部文档内容 + +## 小贴士 + +- 如果您需要将任意 JSON 数据(如 API 响应或配置文件)转换为格式化的 PDF,[文本转 PDF](./txt-to-pdf) 工具更合适。将 JSON 作为文本粘贴进去,它会以合适的格式渲染。 +- 此工具要求 CPDF WebAssembly 引擎可用。自托管实例需要配置 CPDF WASM 文件。 + +## 相关工具 + +- [文本转 PDF](./txt-to-pdf) +- [Markdown 转 PDF](./markdown-to-pdf) +- [CSV 转 PDF](./csv-to-pdf) diff --git a/docs/zh/tools/linearize-pdf.md b/docs/zh/tools/linearize-pdf.md new file mode 100644 index 00000000..a2f6f950 --- /dev/null +++ b/docs/zh/tools/linearize-pdf.md @@ -0,0 +1,49 @@ +--- +title: 线性化 PDF +description: 优化 PDF 文件以支持渐进加载和快速网页查看,也称为“快速网页视图”优化。 +--- + +# 线性化 PDF + +线性化会重新组织 PDF 的结构,使第一页无需等待整个文件下载完毕即可显示。Adobe 将此称为“快速网页视图”。如果您在网站上托管 PDF,或通过文档门户提供 PDF,线性化会让它们打开起来明显更快。 + +## 使用方法 + +1. 上传一个或多个 PDF 文件。 +2. 点击 **线性化 PDF**。 +3. 下载包含所有线性化文件的 ZIP 压缩包。 + +无需任何设置。该工具使用 QPDF 的 `--linearize` 标志,在不改变视觉内容的前提下重新排列 PDF 的内部结构。 + +## 线性化的作用 + +- 重新排列 PDF 对象,使第一页的数据位于文件开头 +- 添加线性化字典和提示表,让查看器知道每一页的位置 +- 支持字节范围请求:浏览器只需获取第一页,而无需下载整个文件 +- 整理交叉引用表,以便高效地随机访问 + +## 功能 + +- 一次操作批量处理多个 PDF +- 输出保留所有内容、字体、图片和交互元素 +- 使用 QPDF (WebAssembly) 实现可靠且符合标准的线性化 +- 结果打包为 ZIP,便于下载 + +## 使用场景 + +- 在网站上托管 PDF 报告,让用户立即看到页面 +- 在带有浏览器内查看器的 Web 应用中嵌入 PDF +- 发布在慢速移动网络下访问的 PDF 目录或手册 +- 为支持字节范围服务的内容分发网络 (CDN) 准备文档 + +## 小贴士 + +- 请在完成所有其他编辑之后再线性化。之后的任何修改(合并、添加页面)都会破坏线性化。 +- 与压缩 PDF 结合使用,可得到体积最小、加载最快的 PDF。 +- 线性化会让文件体积略有增加(通常不到 1%)。 + +## 相关工具 + +- [压缩 PDF](./compress-pdf):线性化之前先减小文件体积 +- [修复 PDF](./repair-pdf):修复阻碍线性化的结构问题 +- [移除元数据](./remove-metadata):在线发布前清除元数据 diff --git a/docs/zh/tools/markdown-to-pdf.md b/docs/zh/tools/markdown-to-pdf.md new file mode 100644 index 00000000..0a68b687 --- /dev/null +++ b/docs/zh/tools/markdown-to-pdf.md @@ -0,0 +1,59 @@ +--- +title: Markdown 转 PDF +description: 编写或粘贴 Markdown,并导出为排版精美的 PDF,支持实时预览和语法高亮。 +--- + +# Markdown 转 PDF + +功能齐全的 Markdown 编辑器,带有实时预览和一键导出 PDF。您可以从零开始编写、上传现有的 `.md` 文件,或从剪贴板粘贴内容。编辑器会实时渲染您的 Markdown,并使用浏览器内置的打印引擎导出带样式的 PDF。 + +## 支持的格式 + +| 输入 | 说明 | +| :--------- | :------------------- | +| `.md` 文件 | 通过上传按钮上传 | +| 直接输入 | 在编辑器中输入或粘贴 | + +## 使用方法 + +1. 打开 Markdown 转 PDF 工具。编辑器以分栏视图加载:左侧是 Markdown 源码,右侧是渲染后的预览。 +2. 编写您的 Markdown、粘贴内容,或点击 **上传** 加载 `.md` 文件。 +3. 使用工具栏中的主题滑块在浅色和深色主题之间切换。 +4. 点击 **导出 PDF**(或按 `Ctrl/Cmd + S`),通过浏览器的打印对话框生成 PDF。 + +## 功能 + +除基础语法外,编辑器还支持大量 Markdown 功能: + +- **标准 Markdown**:标题、粗体、斜体、链接、图片、列表、引用块、分隔线 +- **代码块**,支持 15 种以上语言的语法高亮(JavaScript、TypeScript、Python、Go、Rust、SQL、Java、C#、C++、YAML、Bash 等) +- **Mermaid 图表**:流程图、时序图、ER 图和其他 Mermaid 图表类型可直接在预览中渲染 +- **表格**,使用标准 Markdown 表格语法 +- **任务列表**,带复选框 +- **脚注**、**下标**、**上标** +- **定义列表**、**缩写** +- **表情符号** 支持(`:smile:` 会渲染为表情符号) +- **高亮**(`==marked text==`)和 **插入**(`++inserted text++`) +- **自动链接 URL**:纯 URL 会被转换为可点击的链接 +- **目录** 生成 +- 标题上的 **锚点链接** + +## 使用场景 + +- 编写项目文档,并为相关方导出精美的 PDF +- 创建包含代码示例和 Mermaid 架构图的技术报告 +- 将 GitHub README 转换为 PDF,以便离线使用或打印 +- 使用任务列表和表格起草提案或规格说明 +- 根据用 Markdown 写成的课堂笔记生成带样式的讲义 + +## 小贴士 + +- PDF 输出使用浏览器的打印为 PDF 功能。在 Chrome 中,您可以在保存前于打印对话框中自定义页边距和缩放。 +- Mermaid 图表会在预览中渲染,但首次使用时可能需要稍等片刻进行初始化。 +- 使用 `Ctrl/Cmd + S` 键盘快捷键即可导出,无需去点按钮。 + +## 相关工具 + +- [文本转 PDF](./txt-to-pdf) +- [Word 转 PDF](./word-to-pdf) +- [JSON 转 PDF](./json-to-pdf) diff --git a/docs/zh/tools/merge-pdf.md b/docs/zh/tools/merge-pdf.md new file mode 100644 index 00000000..c5c7b47b --- /dev/null +++ b/docs/zh/tools/merge-pdf.md @@ -0,0 +1,54 @@ +--- +title: 合并 PDF +description: 将多个 PDF 文件合并为一个文档,支持拖放排序和页面级控制。 +--- + +# 合并 PDF + +将多个 PDF 文件合并为一个文档。您可以按指定顺序合并整个文件,也可以切换到页面模式,对每个上传 PDF 中的单个页面进行精细控制。 + +## 使用方法 + +1. 点击拖放区域或将文件拖入,上传两个或更多 PDF 文件。 +2. 使用顶部的切换开关在 **文件模式** 和 **页面模式** 之间选择。 +3. 在文件模式下,拖动文件重新排序,并可为每个文件指定页面范围(例如 `1-3, 5`)。范围留空则包含所有页面。 +4. 在页面模式下,拖放单个页面缩略图来构建您想要的页面顺序。 +5. 点击 **合并 PDF**,将所有内容合并为一个文件。合并后的 PDF 会自动下载。 + +## 功能 + +- 两种合并模式:文件模式用于快速合并整个文件,页面模式用于逐页控制 +- 两种模式都支持拖放排序,动画流畅 +- 页面范围语法(例如 `1-3, 5, 8-10`)让您无需切换到页面模式即可挑选页面 +- 页面缩略图懒加载,即使处理大型文档,界面也保持响应 +- 文件数量和总页数均无限制 +- 保留原始 PDF 质量,不会重新编码 + +## 选项 + +| 选项 | 说明 | +| -------------- | ------------------------------------------------------------ | +| **文件模式** | 按自定义顺序合并整个文件,可为每个文件设置页面范围过滤 | +| **页面模式** | 以网格形式显示所有文件的所有页面,拖动缩略图构建您想要的顺序 | +| **页面输入框** | 每个文件的文本字段,接受类似 `1-3, 5` 的范围,只包含特定页面 | + +## 使用场景 + +- 将各章节的 PDF 合并为一本书或一份报告 +- 将求职信和简历合并为一份申请文档 +- 从多个源文档中提取特定页面,汇总为一个文件 +- 将扫描的收据或发票整理为一个归档 PDF +- 用多份幻灯片中的页面制作演示文稿讲义 + +## 小贴士 + +- 当您需要将不同文件的页面交错排列,而不是一个文件接着一个文件追加时,请使用页面模式。 +- 初次上传后,您可以使用 **添加更多文件** 按钮继续添加文件,而不会丢失当前的排列。 +- 页码从 1 开始,因此 `1` 指该文件的第一页。 + +## 相关工具 + +- [分割 PDF](./split-pdf) +- [整理和复制页面](./organize-pdf) +- [交替混合页面](./alternate-merge) +- [删除页面](./delete-pages) diff --git a/docs/zh/tools/mobi-to-pdf.md b/docs/zh/tools/mobi-to-pdf.md new file mode 100644 index 00000000..0dbbed91 --- /dev/null +++ b/docs/zh/tools/mobi-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: MOBI 转 PDF +description: 在浏览器中直接将 MOBI 电子书文件转换为 PDF。免费、私密,无需上传文件。 +--- + +# MOBI 转 PDF + +将亚马逊 Kindle 的 MOBI 电子书转换为 PDF 文档。MOBI 文件与 Kindle 设备和应用绑定,难以在其他地方阅读。转换为 PDF 后,您就得到一个可在任何设备上打开或打印的便携版本。 + +## 支持的格式 + +| 格式 | 扩展名 | 备注 | +| :--- | :------ | :----------------------------- | +| MOBI | `.mobi` | Kindle 电子书格式 (Mobipocket) | + +## 使用方法 + +1. 点击上传区域或拖放一个或多个 MOBI 文件。 +2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或使用 **添加更多文件** 加入更多电子书。 +3. 点击 **转换为 PDF**。PyMuPDF 引擎会解析 MOBI 结构,并将每一页渲染为 PDF 内容。 +4. 单个文件会下载为 PDF。转换多个文件时,您会得到名为 `mobi-converted.zip` 的 ZIP 压缩包。 + +## 选项 + +无需额外设置。转换会保留原始 MOBI 文件中的文本内容、格式和嵌入的图片。 + +## 使用场景 + +- 在只支持 PDF 的非 Kindle 电子阅读器上阅读在 Kindle 购买的内容 +- 打印电子书中的章节,用于离线学习或批注 +- 将个人电子书库归档为通用格式 +- 与没有安装 Kindle 应用的人分享摘录 + +## 小贴士 + +- 受 DRM 保护的 MOBI 文件无法转换。该工具只适用于无 DRM 的 MOBI 文件。 +- 带有大量嵌入图片的大型电子书可能需要多花几秒钟,因为所有处理都在浏览器中进行。 + +## 相关工具 + +- [EPUB 转 PDF](./epub-to-pdf) +- [FB2 转 PDF](./fb2-to-pdf) +- [CBZ 转 PDF](./cbz-to-pdf) diff --git a/docs/zh/tools/n-up-pdf.md b/docs/zh/tools/n-up-pdf.md new file mode 100644 index 00000000..74455d2e --- /dev/null +++ b/docs/zh/tools/n-up-pdf.md @@ -0,0 +1,54 @@ +--- +title: N-Up PDF +description: 将多个 PDF 页面按网格布局排列到同一张纸上,便于紧凑打印。 +--- + +# N-Up PDF + +将多个页面按网格排列到同一张纸上。每张纸可容纳 2、4、6、8、9 或 16 页,从而减少打印的页数。该工具会处理缩放、定位和可选的页面尺寸配置。 + +## 使用方法 + +1. 上传一个 PDF 文件。 +2. 选择每张纸上的页数(即“N”值):2、4、6、8、9 或 16。 +3. 选择输出页面尺寸(默认为 A4)和方向。 +4. 可选:配置间距、边框颜色和背景颜色。 +5. 点击处理按钮。该工具会缩放每一页,并将它们平铺到新的纸张上。 + +## 功能 + +- 网格布局:2 合 1、4 合 1、6 合 1、8 合 1、9 合 1 和 16 合 1 +- 可配置的输出页面尺寸和方向 +- 平铺页面之间可选的间距 +- 背景和边框颜色设置 +- 缩放以适应时保持原始页面的宽高比 + +## 选项 + +| 选项 | 说明 | +| ------------ | ------------------------------------------------- | +| **每张页数** | 每个输出页面上容纳的原始页数(2、4、6、8、9、16) | +| **页面尺寸** | 输出纸张的尺寸(A4、Letter、Legal 等) | +| **方向** | 输出纸张为纵向或横向 | +| **间距** | 平铺页面之间的间隙,单位为磅 | +| **背景颜色** | 输出纸张背景的填充颜色 | +| **边框颜色** | 每个平铺页面周围边框的颜色 | + +## 使用场景 + +- 打印每页 4 张幻灯片的讲义以节省纸张 +- 创建在一张纸上放置多页参考资料的学习资料 +- 制作紧凑的文档归档以便存档 +- 为长文档生成缩略图概览页 + +## 小贴士 + +- 对于 2 合 1 布局,横向通常效果更好,而 4 合 1 及以上的布局通常最适合纵向。 +- 增加间距有助于提高可读性,但会减少每个平铺页面的可用区域。 +- 若要执行相反的操作(将一页拆分为多页),请参阅 [海报化 PDF](./posterize-pdf)。 + +## 相关工具 + +- [海报化 PDF](./posterize-pdf) +- [PDF 小册子](./pdf-booklet) +- [合并为单页](./combine-single-page) diff --git a/docs/zh/tools/ocr-pdf.md b/docs/zh/tools/ocr-pdf.md new file mode 100644 index 00000000..1447c11c --- /dev/null +++ b/docs/zh/tools/ocr-pdf.md @@ -0,0 +1,54 @@ +--- +title: OCR PDF +description: 使用 Tesseract OCR 让扫描版 PDF 可搜索、可复制,支持多语言和字符过滤。 +--- + +# OCR PDF + +将扫描文档变成可搜索、可复制的 PDF。该工具使用 Tesseract OCR 识别图像中的文字,并在原始页面上叠加一层不可见的文本层,在保留视觉外观的同时,让内容完全可搜索。 + +## 使用方法 + +1. 上传扫描版 PDF 或基于图像的 PDF 文件。 +2. 从可搜索的语言列表中选择文档中出现的一种或多种语言。 +3. 可选:调整高级设置(分辨率、二值化、白名单)。 +4. 点击 **开始 OCR**,并通过实时进度条监控进度。 +5. 完成后,查看提取的文本,然后下载可搜索的 PDF 或纯文本 `.txt` 文件。 + +## 功能 + +- 多语言 OCR,带可搜索的语言选择器 +- 不可见的文本层保留原始文档外观 +- 处理期间显示实时进度条和日志输出 +- 可将结果下载为可搜索的 PDF 或纯文本文件 +- 可直接将提取的文本复制到剪贴板 +- 三档分辨率,在速度和准确度之间取得平衡 + +## 选项 + +| 设置 | 取值 | 默认值 | 用途 | +| ------------------ | ------------------------------------------------------------- | ------ | ---------------------------------------------- | +| **分辨率** | 标准 (192 DPI)、高 (288 DPI)、超高 (384 DPI) | 高 | 更高的分辨率可提高小字的准确度,但耗时更长 | +| **二值化图像** | 开 / 关 | 关 | 通过转换为黑白来增强清晰扫描件的对比度 | +| **字符白名单预设** | 无、字母数字、数字 + 货币、仅字母、仅数字、发票、表单、自定义 | 无 | 限制识别的字符范围,以提高特定类型文档的准确度 | +| **字符白名单** | 自由文本 | 空 | 当预设设为自定义时,手动指定字符集 | + +## 使用场景 + +- 让扫描的合同和发票可搜索,这样您就可以用 Ctrl+F 查找内容 +- 从拍摄的文档或旧纸质记录中提取文本 +- 使用发票预设处理收据,准确识别金额和日期 +- 为满足合规要求,将仅含图像的扫描件制作为无障碍 PDF +- 批量提取扫描书籍或手册中的文本内容 + +## 小贴士 + +- 如果文档包含多种语言的内容(例如英文标题搭配日文正文),请选择多种语言。 +- 对于文字褪色或对比度低的文档,请使用二值化选项,它可以显著提高识别准确度。 +- 发票和表单白名单预设会忽略不相关的字符形状,从而大幅减少结构化文档上的误识别。 + +## 相关工具 + +- [提取表格](./extract-tables) +- [合并 PDF](./merge-pdf) +- [压缩 PDF](./compress-pdf) diff --git a/docs/zh/tools/odg-to-pdf.md b/docs/zh/tools/odg-to-pdf.md new file mode 100644 index 00000000..04cebf51 --- /dev/null +++ b/docs/zh/tools/odg-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: ODG 转 PDF +description: 在浏览器中将 LibreOffice Draw (ODG) 文件转换为 PDF。免费、无需上传、完全私密。 +--- + +# ODG 转 PDF + +将 OpenDocument Graphics 文件转换为 PDF。ODG 是 LibreOffice Draw 的原生格式,用于图表、流程图和矢量插图。转换为 PDF 后,这些绘图更便于分享、打印和嵌入其他文档。 + +## 支持的格式 + +| 格式 | 扩展名 | 备注 | +| :-------------------- | :----- | :-------------------------------------- | +| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw 文件 | + +## 使用方法 + +1. 点击上传区域或将 ODG 文件拖放进来。可以一次添加多个文件。 +2. 查看文件列表。使用垃圾桶图标移除单个条目,或点击 **添加更多文件** 添加更多绘图。 +3. 点击 **转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载并转换每个 ODG 文件,同时保留矢量图形、形状和文字。 +4. 单个文件会直接下载为 PDF。多个文件会生成名为 `odg-to-pdf.zip` 的 ZIP 压缩包。 + +## 选项 + +无需额外设置。转换会保留 ODG 源文件中原有的页面尺寸、形状、连接线和文本框。 + +## 使用场景 + +- 与没有安装 LibreOffice 的客户分享 LibreOffice Draw 图表 +- 打印在 Draw 中创建的流程图和网络图 +- 将 ODG 插图作为嵌入的 PDF 加入报告或演示文稿 +- 将技术图纸归档为数十年后仍可读取的格式 + +## 小贴士 + +- 矢量元素在 PDF 输出中仍保持矢量,因此结果可以清晰地缩放到任何打印尺寸。 +- LibreOffice 引擎在首次使用时需要一点时间初始化。在同一会话中,之后的转换会更快。 + +## 相关工具 + +- [ODS 转 PDF](./ods-to-pdf) +- [ODP 转 PDF](./odp-to-pdf) +- [VSD 转 PDF](./vsd-to-pdf) diff --git a/docs/zh/tools/odp-to-pdf.md b/docs/zh/tools/odp-to-pdf.md new file mode 100644 index 00000000..afe26162 --- /dev/null +++ b/docs/zh/tools/odp-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODP 转 PDF +description: 在浏览器中将 LibreOffice Impress (ODP) 演示文稿转换为 PDF。免费、私密,无需上传。 +--- + +# ODP 转 PDF + +将 OpenDocument Presentation 文件转换为 PDF。ODP 是 LibreOffice Impress 的原生格式,也是 Google Slides 的标准导出格式。将演示文稿转为 PDF 后,任何人都无需演示软件即可查看,幻灯片也能整洁地打印。 + +## 支持的格式 + +| 格式 | 扩展名 | 备注 | +| :------------------------ | :----- | :--------------------------------------- | +| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides 导出 | + +## 使用方法 + +1. 点击上传区域或将 ODP 文件拖放进来。可以一次选择多个演示文稿。 +2. 查看文件列表。使用垃圾桶图标移除条目,或使用 **添加更多文件** 加入更多演示文稿。 +3. 点击 **转换为 PDF**。基于 LibreOffice 的引擎会处理每个演示文稿,并生成每张幻灯片对应一页的 PDF。 +4. 单个文件会下载为 PDF。多个文件会打包在名为 `odp-to-pdf.zip` 的 ZIP 压缩包中。 + +## 选项 + +无需配置。每张幻灯片都按原始尺寸渲染,并保留文字、图片、形状和幻灯片背景。 + +## 使用场景 + +- 将演示文稿作为讲义 PDF 分发给听众 +- 与更喜欢 PDF 而非 ODP 的人分享 Google Slides 导出文件 +- 将会议演讲和讲座以只读格式归档 +- 为线下工作坊打印幻灯片 + +## 小贴士 + +- 幻灯片切换和动画属于仅限视觉的功能,不会带入 PDF,但所有静态内容都能正确渲染。 +- 演讲者备注不会包含在 PDF 输出中。如果您需要备注,请从演示软件中单独导出。 +- 与其他基于 LibreOffice 的工具一样,引擎在首次使用时加载,并在会话期间保持缓存。 + +## 相关工具 + +- [ODG 转 PDF](./odg-to-pdf) +- [ODS 转 PDF](./ods-to-pdf) +- [PUB 转 PDF](./pub-to-pdf) diff --git a/docs/zh/tools/ods-to-pdf.md b/docs/zh/tools/ods-to-pdf.md new file mode 100644 index 00000000..e63083e3 --- /dev/null +++ b/docs/zh/tools/ods-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: ODS 转 PDF +description: 在浏览器中将 LibreOffice Calc (ODS) 电子表格转换为 PDF。免费、私密、无需注册。 +--- + +# ODS 转 PDF + +将 OpenDocument 电子表格文件转换为 PDF。ODS 是 LibreOffice Calc 的原生格式,也是 Google Sheets 常见的导出格式。此工具会把电子表格的数据、格式和图表渲染为分页 PDF,方便打印或分享。 + +## 支持的格式 + +| 格式 | 扩展名 | 备注 | +| :-------------------- | :----- | :------------------------------------ | +| OpenDocument 电子表格 | `.ods` | LibreOffice Calc / Google Sheets 导出 | + +## 使用方法 + +1. 点击上传区域或拖放 ODS 文件,支持多个文件。 +2. 查看文件列表。使用垃圾桶图标移除文件,或点击 **添加更多文件** 扩充批次。 +3. 点击 **转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载,并将每个电子表格渲染为 PDF 页面。 +4. 单个电子表格会直接下载为 PDF。多个文件会打包为 `ods-to-pdf.zip`。 + +## 选项 + +无需任何配置。转换器会将电子表格现有的打印布局、单元格格式和列宽应用到 PDF 输出中。 + +## 使用场景 + +- 将 LibreOffice Calc 的预算或报告分享给只接受 PDF 的人 +- 打印以 ODS 格式下载的 Google Sheets 导出文件 +- 以不可编辑的格式归档财务记录 +- 以固定版式文档的形式提交基于 ODS 的表单或工时表 + +## 小技巧 + +- 如果电子表格包含多个工作表,所有工作表都会包含在 PDF 输出中。 +- 非常宽的电子表格可能会在水平方向跨越多个 PDF 页面。如果版面很重要,建议在转换前先调整源文件中的列宽。 +- LibreOffice 引擎在首次使用时初始化。同一会话中后续的转换会更快。 + +## 相关工具 + +- [ODG 转 PDF](./odg-to-pdf) +- [ODP 转 PDF](./odp-to-pdf) +- [XML 转 PDF](./xml-to-pdf) diff --git a/docs/zh/tools/odt-to-pdf.md b/docs/zh/tools/odt-to-pdf.md new file mode 100644 index 00000000..634e7450 --- /dev/null +++ b/docs/zh/tools/odt-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: ODT 转 PDF +description: 使用 LibreOffice 驱动的引擎,在浏览器中将 OpenDocument 文本 (ODT) 文件转换为 PDF 格式。 +--- + +# ODT 转 PDF + +将 OpenDocument 文本文件转换为 PDF。ODT 是 LibreOffice Writer、Apache OpenOffice 和其他开源文字处理软件的原生格式。此工具使用浏览器中的 LibreOffice 引擎,生成保留格式、表格、图片和样式的精确转换结果。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :---------------- | :----- | +| OpenDocument 文本 | `.odt` | + +## 使用方法 + +1. 点击上传区域或拖放一个或多个 ODT 文件。 +2. 查看文件列表。可添加更多文件或移除不需要的文件。 +3. 点击 **转换为 PDF**。LibreOffice 引擎会先初始化(进度指示器显示加载状态),然后转换每个文件。 +4. 单个文件会直接下载为 PDF。多个文件会打包为 `odt-converted.zip`。 + +## 选项 + +此工具没有额外配置。转换会尽可能保留原始文档的格式。 + +## 输出 + +| 输入数量 | 输出 | +| :------- | :------------------------------------------------------ | +| 1 个文件 | 下载单个 PDF(例如 `document.pdf`) | +| 2 个以上 | ZIP 压缩包(`odt-converted.zip`),每个文件对应一个 PDF | + +## 使用场景 + +- 将 LibreOffice Writer 文档转换为 PDF,以便分享给 Microsoft Office 用户 +- 从用 OpenDocument 格式撰写的学术论文生成可直接打印的 PDF +- 批量将一批 ODT 模板转换为 PDF 用于分发 +- 从自动文档生成系统创建的 ODT 文件生成 PDF + +## 小技巧 + +- LibreOffice 引擎在首次使用时加载,并会缓存以供后续转换使用。首次加载需要几秒钟,之后转换会很快。 +- 包含嵌入式 OLE 对象或特殊字体的复杂文档,渲染效果可能与桌面版 LibreOffice 略有不同。批量转换前请先用样本测试。 +- 对于 Word 文档(`.doc`、`.docx`),请改用 [Word 转 PDF](./word-to-pdf) 工具,它同样使用 LibreOffice 引擎,但可直接接受 Microsoft 格式。 + +## 相关工具 + +- [Word 转 PDF](./word-to-pdf) +- [RTF 转 PDF](./rtf-to-pdf) +- [文本转 PDF](./txt-to-pdf) diff --git a/docs/zh/tools/organize-pdf.md b/docs/zh/tools/organize-pdf.md new file mode 100644 index 00000000..678147c8 --- /dev/null +++ b/docs/zh/tools/organize-pdf.md @@ -0,0 +1,45 @@ +--- +title: 复制与组织 +description: 通过拖放缩略图和自定义页面顺序输入,对 PDF 页面重新排序、复制和删除。 +--- + +# 复制与组织 + +通过可视化的拖放界面,对 PDF 的页面进行重新排列、复制和删除。每个页面都以缩略图显示,您可以在保存为新文件之前移动、克隆或删除它们。 + +## 使用方法 + +1. 上传单个 PDF 文件。 +2. 工具会渲染显示所有页面的缩略图网格。 +3. 拖动缩略图以重新排序页面,点击绿色复制按钮克隆页面,或点击红色删除按钮移除页面。 +4. 或者,在文本框中输入自定义页面顺序(例如 `3, 1, 2, 4`),然后点击 **应用** 一次性重新排列所有页面。 +5. 点击处理按钮,生成并下载重新组织后的 PDF。 + +## 功能 + +- 带动画过渡的拖放页面重新排序 +- 每个页面都有复制和删除按钮 +- 自定义页面顺序输入,实现精确排列 +- 页码标签在每次更改后自动更新 +- 防止删除最后一个剩余页面 + +## 使用场景 + +- 将报告中放错位置的页面移到正确位置 +- 复制表单页面,在一个文件中获得多份空白副本 +- 在分发文档之前移除草稿页或占位页 +- 为打印准备而反转或打乱页面顺序 +- 无需重新合并单独的文件,即可构建自定义页面序列 + +## 小技巧 + +- 自定义页面顺序字段需要以逗号分隔的原始页码。必须恰好包含每个页面一次,不能遗漏或重复。 +- 复制页面后,两个副本引用相同的原始页面索引。对任一副本重新排序都是相互独立的。 +- 如需跨多个文件的批量操作或更高级的工作流,请考虑改用 [PDF 多功能工具](./pdf-multi-tool)。 + +## 相关工具 + +- [合并 PDF](./merge-pdf) +- [删除页面](./delete-pages) +- [PDF 多功能工具](./pdf-multi-tool) +- [反转页面](./reverse-pages) diff --git a/docs/zh/tools/page-dimensions.md b/docs/zh/tools/page-dimensions.md new file mode 100644 index 00000000..43dbc41e --- /dev/null +++ b/docs/zh/tools/page-dimensions.md @@ -0,0 +1,53 @@ +--- +title: 页面尺寸 +description: 分析 PDF 页面尺寸、方向、宽高比和旋转。检测混合尺寸文档并将数据导出为 CSV。 +--- + +# 页面尺寸 + +一款诊断工具,会读取 PDF 中的每个页面,并报告其精确尺寸、方向、标准尺寸名称、宽高比、面积和旋转角度。适合在打印前发现混合尺寸页面,或记录收到的 PDF 的属性。 + +## 使用方法 + +1. 上传 PDF 文件。分析会自动开始,无需点击按钮。 +2. 摘要面板会显示总页数、唯一页面尺寸的数量,以及文档是否包含混合尺寸。 +3. 浏览包含每页详细信息的完整结果表。 +4. 在点、英寸、毫米或像素之间切换显示单位。 +5. 点击 **导出为 CSV** 保存数据。 + +## 报告字段 + +| 列 | 说明 | +| -------- | ------------------------------------- | +| 页码 # | 连续页码 | +| 尺寸 | 所选单位下的宽 x 高 | +| 标准尺寸 | 匹配的名称(A4、Letter 等)或“自定义” | +| 方向 | 纵向或横向 | +| 宽高比 | 以小数表示的宽高比 | +| 面积 | 所选单位平方下的页面面积 | +| 旋转 | 页面旋转角度(度) | + +## 功能 + +- 自动检测标准纸张尺寸(A3、A4、A5、Letter、Legal、Tabloid 等) +- 混合尺寸文档警告,并详细列出出现了哪些尺寸以及每种尺寸使用的页数 +- 在点、英寸、毫米和像素(按 96 PPI)之间转换单位 +- 导出 CSV,可用于电子表格或文档系统 + +## 使用场景 + +- 在将文档提交给印刷店之前,确认所有页面都是 A4 +- 诊断合并后的 PDF 为何在某些页面上打印出意外的页边距 +- 为元数据记录整理大型 PDF 档案的页面布局 +- 找出需要修正的已旋转页面 + +## 小技巧 + +- 如果摘要显示“混合尺寸”,请在打印前使用修复页面尺寸工具进行统一。 +- 旋转字段有助于识别显示正常但旋转属性非零的页面,这在某些工作流中可能引发问题。 + +## 相关工具 + +- [修复页面尺寸](./fix-page-size):发现混合尺寸后统一页面 +- [压缩 PDF](./compress-pdf):修复页面问题后优化 PDF +- [旋转 PDF](./rotate-pdf):纠正已旋转的页面 diff --git a/docs/zh/tools/page-numbers.md b/docs/zh/tools/page-numbers.md new file mode 100644 index 00000000..bdcaa0c4 --- /dev/null +++ b/docs/zh/tools/page-numbers.md @@ -0,0 +1,48 @@ +--- +title: 页码 +description: 在 PDF 页面的任意位置添加可自定义的页码,可配置字体、大小和颜色。 +--- + +# 页码 + +为 PDF 的每一页添加可见的页码。您可以选择位置、格式、字号和颜色,其余交给工具处理。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 在出现的选项面板中配置页码设置。 +3. 点击 **添加页码** 进行处理。 +4. 带页码的 PDF 会自动下载。 + +## 选项 + +- **位置**:选择页码出现的位置,包括底部居中、底部左侧、底部右侧、顶部居中、顶部左侧或顶部右侧。 +- **格式**:可选简单编号(1、2、3...)或“第 X 页,共 Y 页”格式(1 / 5、2 / 5...)。 +- **字号**:设置页码文本的大小。默认为 12。 +- **颜色**:使用取色器为页码文本选择任意颜色。 + +## 功能 + +- 六种位置选项,涵盖所有角落和居中位置 +- 两种编号格式:简单顺序编号或“第 X 页,共 Y 页” +- 可自定义字号,范围为 6 到 72 点 +- 完整的文本颜色取色器 +- 自动处理边距,无论页面大小如何都能让页码保持在安全区域内 + +## 使用场景 + +- 为需要可见页面引用的文档准备打印 +- 为由多个源文件合并而成的 PDF 添加页码 +- 在分发前为演示讲义编号 +- 为法律文件或合同添加连续编号 + +## 小技巧 + +- “第 X 页,共 Y 页”格式适用于读者需要了解总长度的文档,例如提案或报告。 +- 如果不同部分需要不同的编号样式(例如前言部分使用罗马数字),请改用 [添加页面标签](./add-page-labels) 工具。 + +## 相关工具 + +- [添加页面标签](./add-page-labels) +- [Bates 编号](./bates-numbering) +- [页眉和页脚](./header-footer) diff --git a/docs/zh/tools/pdf-booklet.md b/docs/zh/tools/pdf-booklet.md new file mode 100644 index 00000000..42dceb45 --- /dev/null +++ b/docs/zh/tools/pdf-booklet.md @@ -0,0 +1,43 @@ +--- +title: PDF 小册子 +description: 将 PDF 页面重新排列为小册子(骑马钉)顺序,用于折叠和装订成实体小册子。 +--- + +# PDF 小册子 + +将 PDF 的页面重新排列为小册子拼版顺序。双面打印并对折后,页面会呈现正确的阅读顺序。这是骑马钉小册子和独立杂志常用的版式。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 配置小册子设置:输出页面大小和方向。 +3. 点击 **生成预览**,查看页面在每张纸上的排列方式。 +4. 查看预览,其中显示每张实体纸张及其正反面的页面分配。 +5. 点击 **下载** 保存已拼版的小册子 PDF。 + +## 功能 + +- 自动为骑马钉装订重新排列页面 +- 可配置输出页面大小 +- 下载前可视化预览小册子布局 +- 页数为奇数时,会在需要的位置插入空白页 +- 缩放源页面以适应小册子纸张大小 + +## 使用场景 + +- 将普通 PDF 制作成可打印的小册子或独立杂志 +- 准备会议议程或活动指南用于内部打印 +- 制作折叠贺卡或小型目录 +- 制作用于手工装订的小诗集 + +## 小技巧 + +- 源 PDF 的页数最好是 4 的倍数,这样小册子更整齐。如果不是,会自动添加空白页来补满最后一张纸。 +- 在打印机上选择“短边翻转”进行双面打印,然后将所有纸张一起对折,并在书脊处装订。 +- 如果只是将多个页面放在一张纸上而不需要小册子排序,请改用 [N-Up PDF](./n-up-pdf)。 + +## 相关工具 + +- [N-Up PDF](./n-up-pdf) +- [旋转 PDF](./rotate-pdf) +- [添加空白页](./add-blank-page) diff --git a/docs/zh/tools/pdf-layers.md b/docs/zh/tools/pdf-layers.md new file mode 100644 index 00000000..5bd2c277 --- /dev/null +++ b/docs/zh/tools/pdf-layers.md @@ -0,0 +1,46 @@ +--- +title: PDF 图层 (OCG) +description: 查看、切换、添加和删除 PDF 文档中的可选内容组 (OCG) 图层。 +--- + +# PDF 图层 (OCG) + +管理 PDF 中的可选内容组 (OCG),通常称为“图层”。您可以切换图层可见性、添加新图层(包括嵌套的子图层)、删除图层,并保存修改后的 PDF。 + +## 使用方法 + +1. 上传 PDF 文件。 +2. 点击处理按钮,使用 PyMuPDF 引擎加载文档。 +3. 工具会显示所有现有图层及其可见状态、锁定状态和嵌套层级。 +4. 勾选或取消勾选复选框以显示或隐藏图层。锁定的图层无法切换。 +5. 输入名称并点击添加按钮来添加新的顶级图层,或在现有父图层下添加子图层。 +6. 删除不再需要的图层。 +7. 点击 **保存**,下载应用了图层更改的修改后 PDF。 + +## 功能 + +- 以适当的缩进显示图层层级和嵌套图层 +- 切换图层可见性的开或关 +- 锁定图层标识可防止意外更改 +- 使用自定义名称添加顶级或子图层 +- 删除单个图层 +- 将所有更改保存到新的 PDF 文件中 + +## 使用场景 + +- 切换建筑或工程图纸中标注图层的可见性 +- 为多图层设计文档添加新的注释图层 +- 在分发模板之前移除过时的图层 +- 检查从第三方收到的复杂 PDF 中包含哪些图层 + +## 小技巧 + +- 如果 PDF 没有图层,工具会显示空状态并提示添加图层。并非所有 PDF 都使用 OCG 图层,它们在 CAD 导出文件和设计文件中最为常见。 +- 子图层会在其父图层下缩进显示。您可以嵌套任意深度的图层。 +- 锁定的图层会显示锁图标,其复选框被禁用。这些锁定由 PDF 创建者设置。 + +## 相关工具 + +- [查看元数据](./view-metadata) +- [编辑元数据](./edit-metadata) +- [复制与组织](./organize-pdf) diff --git a/docs/zh/tools/pdf-multi-tool.md b/docs/zh/tools/pdf-multi-tool.md new file mode 100644 index 00000000..f9f8f485 --- /dev/null +++ b/docs/zh/tools/pdf-multi-tool.md @@ -0,0 +1,52 @@ +--- +title: PDF 多功能工具 +description: 一体化页面管理器,用于合并、分割、旋转、复制、删除和重新排序 PDF 页面。 +--- + +# PDF 多功能工具 + +一个统一的工作区,涵盖所有页面级 PDF 操作。上传一个或多个 PDF,并在单个可视化网格中处理它们的所有页面。无需离开工具,即可旋转、重新排序、复制、删除、插入新的 PDF、添加空白页并分割结果。 + +## 使用方法 + +1. 点击 **上传 PDF** 或将文件拖到上传区域。支持多个文件。 +2. 所有上传文件的全部页面会以缩略图形式显示在可滚动的网格中。 +3. 使用工具栏或每页的操作按钮来处理页面。 +4. 使用每张卡片上的复选框选择页面,然后应用批量操作。 +5. 使用剪刀图标标记分割点,将输出划分为多个单独的文件。 +6. 点击 **导出 PDF** 下载最终结果。如果存在分割标记,输出将是包含多个 PDF 的 ZIP。 + +## 功能 + +- **合并**:上传多个 PDF,它们会自动合并到一个工作区 +- **重新排序**:拖放页面卡片以重新排列顺序 +- **旋转**:按 90 度增量(向左或向右)对单页或批量旋转 +- **复制**:一键克隆任意页面 +- **删除**:移除单个页面或批量删除所选页面 +- **插入 PDF**:在任意指定页面之后添加新的 PDF +- **添加空白页**:在末尾追加一个空白 A4 页面 +- **分割**:在页面之间放置分割标记,然后导出为单独 PDF 的 ZIP +- **全选 / 取消全选**:快速选择以进行批量操作 +- **撤销 / 重做**:每项操作都有完整的撤销和重做历史 +- **下载所选**:仅将所选页面导出为独立的 PDF +- 加载前自动修复损坏的 PDF + +## 使用场景 + +- 使用多个源 PDF 中的页面构建自定义文档 +- 通过删除空白页、旋转横向扫描页和重新排序章节来整理扫描文档 +- 使用可视化分割标记,在章节边界处分割大型 PDF +- 无需完整的 PDF 编辑器,即可快速进行页面级编辑 + +## 小技巧 + +- 撤销和重做系统会记录每项操作。请放心使用,您不会意外毁掉自己的工作。 +- 分割标记显示为页面之间的蓝色虚线。请直观地将其放在您想要划分文档的位置,然后导出以获得 ZIP。 +- 对于简单的合并或分割任务,专用的 [合并 PDF](./merge-pdf) 或 [分割 PDF](./split-pdf) 工具可能更快。当您需要在一次会话中完成多项操作时,多功能工具最能发挥优势。 + +## 相关工具 + +- [合并 PDF](./merge-pdf) +- [分割 PDF](./split-pdf) +- [复制与组织](./organize-pdf) +- [旋转 PDF](./rotate-pdf) diff --git a/docs/zh/tools/pdf-to-bmp.md b/docs/zh/tools/pdf-to-bmp.md new file mode 100644 index 00000000..77e16f0a --- /dev/null +++ b/docs/zh/tools/pdf-to-bmp.md @@ -0,0 +1,40 @@ +--- +title: PDF 转 BMP +description: 将 PDF 页面转换为未压缩的 BMP 图像。适用于需要位图输入的旧系统和打印工作流。 +--- + +# PDF 转 BMP + +将 PDF 的每一页转换为 BMP(位图)图像。BMP 是未压缩格式,因此输出逐像素精确且无质量损失,但文件很大。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 点击 **转换** 处理文件。 +3. 单个 `.bmp` 文件或 ZIP 压缩包会自动下载。 + +## 选项 + +此工具没有可配置的选项。页面以固定的 2 倍比例渲染,生成的图像尺寸约为 PDF 原始页面尺寸的两倍。 + +## 输出格式 + +- **单页**:`filename.bmp` +- **多页**:`filename_bmps.zip`,包含 `page_1.bmp`、`page_2.bmp` 等。 + +## 使用场景 + +- 将 PDF 页面输入只接受 BMP 的旧系统或硬件。 +- 为特定打印工作流准备未压缩图像。 +- 将位图输出用作需要原始像素数据的图像处理工具的输入。 + +## 小技巧 + +- BMP 文件非常大,因为它们存储未经压缩的原始像素数据。在大多数情况下,[PDF 转 PNG](./pdf-to-png) 能以小得多的文件提供无损质量。 +- 如果目标系统接受 PNG 或 TIFF,请优先使用这些格式以节省磁盘空间。 + +## 相关工具 + +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 TIFF](./pdf-to-tiff) +- [PDF 转 JPG](./pdf-to-jpg) diff --git a/docs/zh/tools/pdf-to-cbz.md b/docs/zh/tools/pdf-to-cbz.md new file mode 100644 index 00000000..382ac062 --- /dev/null +++ b/docs/zh/tools/pdf-to-cbz.md @@ -0,0 +1,77 @@ +--- +title: PDF 转 CBZ +description: 将 PDF 转换为 CBZ(漫画书压缩包)文件,适用于 Komga、Kavita、CDisplayEx 和 Calibre 等漫画阅读器。 +--- + +# PDF 转 CBZ + +将 PDF 转换为 CBZ(Comic Book ZIP)文件,这是数字漫画和日本漫画的标准格式。每个 PDF 页面都会成为压缩包内的一张图片。工具会生成三种格式的元数据以获得最佳兼容性:ComicInfo.xml、metadata.opf 和 ComicBookInfo JSON。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 选择图片格式、质量、缩放比例和可选的元数据。 +3. 点击 **转换** 生成 CBZ 文件。 +4. `.cbz` 文件会自动下载。 + +## 选项 + +| 选项 | 值 | 默认值 | 说明 | +| ---------- | --------------- | ------ | -------------------------------------------------------------------- | +| 图片格式 | JPEG, PNG, WebP | JPEG | JPEG 适用于彩色漫画,PNG 适用于无损黑白日本漫画,WebP 压缩效果最佳。 | +| 质量 | 50–100% | 85% | 控制 JPEG/WebP 压缩。PNG 不显示此项(始终无损)。 | +| 缩放 | 1.0x–4.0x | 2.0x | 缩放比例越高,图像在高分辨率屏幕上越清晰。 | +| 灰度 | 开/关 | 关 | 将页面转换为灰度。可减小黑白内容的文件大小。 | +| 日漫模式 | 开/关 | 关 | 在元数据中设置从右到左的阅读方向。 | +| 包含元数据 | 开/关 | 开 | 嵌入 ComicInfo.xml、metadata.opf 和 ComicBookInfo JSON。 | + +## 元数据字段 + +启用元数据后,您可以填写: + +- **标题**:从 PDF 文件名自动检测。 +- **系列**:系列名称(例如“Naruto”)。 +- **编号 (#)**:系列中的期号。 +- **卷 (Vol.)**:卷号。 +- **作者**:作者或创作者姓名。 +- **出版商**:出版公司。 +- **标签 / 类型**:以逗号分隔的标签(例如“Action, Adventure”)。 +- **出版年份**:出版年份(1900–2100)。 +- **评分**:社区评分,范围 0 到 5。 + +## 元数据兼容性 + +工具会以三种格式写入元数据,以便每个阅读器都能找到它: + +| 格式 | 位置 | 支持的软件 | +| ------------------ | ------------ | ------------------------------------------- | +| ComicInfo.xml | ZIP 内的文件 | Komga, Kavita, CDisplayEx, Mylar, ComicRack | +| metadata.opf | ZIP 内的文件 | Calibre | +| ComicBookInfo JSON | ZIP 注释字段 | Calibre(备用) | + +## 输出格式 + +- `filename.cbz`:包含编号页面图片和元数据文件的 ZIP 压缩包。 + +页面图片以补零的编号命名(`01.jpg`、`02.jpg` 等),以便阅读器按正确顺序显示。 + +## 使用场景 + +- 转换日本漫画或漫画 PDF,以便在漫画阅读器中使用。 +- 在 Komga、Kavita 或 Calibre 中建立数字漫画库。 +- 将扫描的漫画书转换为便于阅读器使用的格式。 +- 以保留阅读方向和元数据的格式分享漫画。 + +## 小技巧 + +- 彩色漫画使用 **JPEG**,黑白日本漫画使用 **PNG**,PNG 能非常高效地压缩黑白内容。 +- 对日本漫画启用 **灰度** 可显著减小文件大小。 +- 填写 **系列** 和 **编号** 字段,以便库管理器(Komga、Calibre)自动整理您的收藏。 +- **WebP** 压缩效果最佳,但较旧的漫画阅读器可能不支持。 + +## 相关工具 + +- [PDF 转 JPG](./pdf-to-jpg) +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 TIFF](./pdf-to-tiff) +- [提取图片](./extract-images) diff --git a/docs/zh/tools/pdf-to-csv.md b/docs/zh/tools/pdf-to-csv.md new file mode 100644 index 00000000..12c470aa --- /dev/null +++ b/docs/zh/tools/pdf-to-csv.md @@ -0,0 +1,44 @@ +--- +title: PDF 转 CSV +description: 从 PDF 文档中提取表格并导出为单个 CSV 文件。通过自动表格检测处理多页 PDF。 +--- + +# PDF 转 CSV + +从 PDF 中提取表格并导出为 CSV 文件。工具使用 PyMuPDF 的表格检测引擎扫描每一页的表格数据,然后将找到的所有行写入单个逗号分隔的输出中。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 点击 **转换** 开始提取表格。 +3. 工具会扫描每一页并自动识别表格。 +4. 包含所有提取的表格数据的 `.csv` 文件会下载。 + +输出中,来自不同页面的表格以空行分隔。包含逗号、引号或换行符的单元格会按照 RFC 4180 正确转义。 + +## 选项 + +此工具没有可配置的选项。文档中找到的所有表格都会被提取并合并为单个 CSV。 + +## 输出格式 + +- 一个包含所有检测到的表格的 `filename.csv` 文件。 + +## 使用场景 + +- 将 PDF 银行对账单或发票中的财务数据导入电子表格。 +- 从供应商报价单中提取价格表进行比较。 +- 将 PDF 论文中的表格研究数据转换为适合分析工具的格式。 +- 将旧版 PDF 报告中的数据迁移到数据库。 + +## 小技巧 + +- 如果未找到表格,工具会显示“未找到表格”消息。这通常意味着 PDF 使用的文本布局看起来像表格,但并非真正结构化的表格。 +- 如需对单个表格进行更多控制,请使用 [提取 PDF 表格](./extract-tables),它允许您在 CSV、JSON 和 Markdown 输出格式之间选择。 +- 如果您需要 Excel 格式的数据,并让每个表格位于单独的工作表,请使用 [PDF 转 Excel](./pdf-to-excel)。 + +## 相关工具 + +- [PDF 转 Excel](./pdf-to-excel) +- [提取 PDF 表格](./extract-tables) +- [PDF 转文本](./pdf-to-text) diff --git a/docs/zh/tools/pdf-to-excel.md b/docs/zh/tools/pdf-to-excel.md new file mode 100644 index 00000000..d13a9039 --- /dev/null +++ b/docs/zh/tools/pdf-to-excel.md @@ -0,0 +1,44 @@ +--- +title: PDF 转 Excel +description: 将 PDF 文档中的表格提取到 Excel 电子表格中。每个表格都有自己的工作表,并附带页面引用。 +--- + +# PDF 转 Excel + +从 PDF 中提取表格并保存为 Excel (`.xlsx`) 电子表格。每个检测到的表格都放在单独的工作表中,并标有表格编号和来源页面。表格检测由 PyMuPDF 提供支持,Excel 生成由 SheetJS 库提供支持。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 点击 **转换** 开始提取表格。 +3. 工具会扫描每一页的表格,然后构建 Excel 工作簿。 +4. 下载 `.xlsx` 文件,每个表格对应一个工作表。 + +## 选项 + +此工具没有可配置的选项。所有检测到的表格都会被自动提取。 + +## 输出格式 + +- 一个 `filename.xlsx` 文件。 +- **一个表格**:一个名为“Table”的工作表。 +- **多个表格**:工作表名称为“Table 1 (Page 3)”、“Table 2 (Page 5)”等。工作表名称会被截断为 31 个字符(Excel 的限制)。 + +## 使用场景 + +- 将 PDF 财务报告转换为可编辑的电子表格以便进一步分析。 +- 从供应商 PDF 中提取库存或订单表格。 +- 将 PDF 表单或目录中的结构化数据导入 Excel 进行排序和筛选。 +- 以非技术同事可以处理的格式归档 PDF 中的表格数据。 + +## 小技巧 + +- 如果工具报告“未找到表格”,说明 PDF 可能使用自由流动的文本布局,而不是结构化表格。请尝试 [PDF 转文本](./pdf-to-text) 来获取原始内容。 +- 如需更简单的扁平格式,请使用 [PDF 转 CSV](./pdf-to-csv)。如需以多种格式按表格下载,请使用 [提取 PDF 表格](./extract-tables)。 +- 查看工作表名称,以确定每个表格来自哪一页。 + +## 相关工具 + +- [PDF 转 CSV](./pdf-to-csv) +- [提取 PDF 表格](./extract-tables) +- [PDF 转文本](./pdf-to-text) diff --git a/docs/zh/tools/pdf-to-greyscale.md b/docs/zh/tools/pdf-to-greyscale.md new file mode 100644 index 00000000..60c9fc79 --- /dev/null +++ b/docs/zh/tools/pdf-to-greyscale.md @@ -0,0 +1,42 @@ +--- +title: PDF 转灰度 +description: 将彩色 PDF 转换为灰度(黑白)版本。生成一个每页都去除了所有颜色的新 PDF。 +--- + +# PDF 转灰度 + +将彩色 PDF 转换为灰度版本。每个页面都会被渲染、去饱和,并作为 JPEG 图像重新嵌入到新的 PDF 中。输出保留原始页面尺寸。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 点击 **转换** 处理文件。 +3. 新的 `greyscale.pdf` 会下载,所有页面都已转换为黑白。 + +在底层,每个页面以 2 倍比例渲染,像素数据经过灰度滤镜处理,然后以 90% 质量重新编码为 JPEG,并放入全新的 PDF 文档中。 + +## 选项 + +此工具没有可配置的选项。灰度转换使用标准亮度公式,JPEG 质量固定为 90%。 + +## 输出格式 + +- 一个 `greyscale.pdf` 文件,其中所有页面均为灰度 JPEG 图像。 + +## 使用场景 + +- 准备黑白打印的文档,以节省彩色墨水成本。 +- 满足要求使用灰度的法律或政府文件的提交要求。 +- 减小色彩丰富的 PDF 的文件大小(JPEG 灰度图像比彩色图像更小)。 +- 为混合了彩色和黑白页面的文档创建一致的视觉风格。 + +## 小技巧 + +- 由于每个页面都被栅格化并重新嵌入为 JPEG,输出是基于图像的。原始 PDF 中的文本将不再可选择或可搜索。如果之后需要可搜索的文本,请将输出通过 OCR 工具处理。 +- 如需对颜色调整(亮度、对比度、饱和度)进行更多控制,请查看调整颜色工具,或 [PDF 工作流构建器](./pdf-workflow) 中的灰度节点。 + +## 相关工具 + +- [PDF 转 JPG](./pdf-to-jpg) +- [PDF 转 PNG](./pdf-to-png) +- [PDF 工作流构建器](./pdf-workflow) diff --git a/docs/zh/tools/pdf-to-jpg.md b/docs/zh/tools/pdf-to-jpg.md new file mode 100644 index 00000000..9e2c59c8 --- /dev/null +++ b/docs/zh/tools/pdf-to-jpg.md @@ -0,0 +1,46 @@ +--- +title: PDF 转 JPG +description: 将 PDF 页面转换为质量可调的 JPG 图像。单页 PDF 直接下载,多页 PDF 导出为 ZIP。 +--- + +# PDF 转 JPG + +将 PDF 的每一页转换为 JPG 图像。单页文档会下载为独立的 `.jpg` 文件。多页 PDF 会生成一个 ZIP 压缩包,其中每页对应一个 JPG。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。工具会显示文件名、文件大小和页数。 +2. 调整 **质量** 滑块以控制 JPG 压缩。 +3. 点击 **转换** 开始处理。 +4. 结果会自动下载:单页 PDF 为单个 JPG,多页文档为 ZIP 文件。 + +## 选项 + +- **质量**:从 0% 到 100% 的滑块(默认 90%)。数值越高,图像越清晰,文件也越大。数值越低,压缩越激进。 + +页面在内部以 2 倍比例渲染,因此输出分辨率是 PDF 页面尺寸的两倍。标准 Letter 尺寸的页面会生成约 1,224 x 1,584 像素的图像。 + +## 输出格式 + +- **单页**:`filename.jpg` +- **多页**:`filename_jpgs.zip`,包含 `page_1.jpg`、`page_2.jpg` 等。 + +## 使用场景 + +- 为文档管理系统生成预览缩略图。 +- 在不支持 PDF 的聊天或电子邮件中分享报告的某一页。 +- 从 PDF 图表或插图创建图像素材。 +- 将扫描文档作为单独的图像归档。 + +## 小技巧 + +- 如需无损输出,请改用 [PDF 转 PNG](./pdf-to-png)。 +- 80-90% 的质量设置能在文件大小和视觉保真度之间取得良好平衡。 +- 如果您需要为每页指定格式,可以考虑 [PDF 工作流构建器](./pdf-workflow),它提供 PDF 转图片输出节点。 + +## 相关工具 + +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 WebP](./pdf-to-webp) +- [PDF 转 BMP](./pdf-to-bmp) +- [PDF 转 TIFF](./pdf-to-tiff) diff --git a/docs/zh/tools/pdf-to-json.md b/docs/zh/tools/pdf-to-json.md new file mode 100644 index 00000000..918b8c3a --- /dev/null +++ b/docs/zh/tools/pdf-to-json.md @@ -0,0 +1,45 @@ +--- +title: PDF 转 JSON +description: 使用 CPDF 将 PDF 文件转换为结构化 JSON 格式。将 PDF 内部结构导出为机器可读的 JSON 数据。 +--- + +# PDF 转 JSON + +将一个或多个 PDF 文件转换为 JSON 格式。工具使用 CPDF (Coherent PDF) 将每个 PDF 的内部结构序列化为机器可读的 JSON 表示。输出始终以 ZIP 压缩包的形式提供。 + +## 使用方法 + +1. 使用文件选择器选择一个或多个 PDF 文件。 +2. 点击 **转换** 开始处理。转换在后台 Web Worker 中运行。 +3. 下载 ZIP 压缩包,其中每个输入 PDF 对应一个 JSON 文件。 + +状态栏会显示转换和 ZIP 创建阶段的进度。 + +## 选项 + +此工具没有可配置的选项。每个 PDF 都会被转换为其完整的 JSON 表示。 + +## 输出格式 + +- 一个 `pdfs-to-json.zip` 文件,其中包含每个输入 PDF 对应的 `filename.json`。 + +JSON 输出表示 PDF 的内部对象结构,包括页面树、字体引用、元数据和内容流。 + +## 使用场景 + +- 检查 PDF 的内部结构,用于调试或验证。 +- 以编程方式提取结构化元数据和页面属性。 +- 将 PDF 结构数据输入自定义处理流水线。 +- 通过分析对象树来审核 PDF 文档的合规性。 + +## 小技巧 + +- 此工具输出的是原始 PDF 对象结构,而不是提取的文本内容。如果您需要 JSON 格式的页面文本,请改用 [为 AI 准备 PDF](./prepare-pdf-for-ai)。 +- 对于纯文本提取,[PDF 转文本](./pdf-to-text) 更直接。 +- 结构复杂的大型 PDF 会生成非常大的 JSON 文件。 + +## 相关工具 + +- [PDF 转文本](./pdf-to-text) +- [为 AI 准备 PDF](./prepare-pdf-for-ai) +- [提取 PDF 表格](./extract-tables) diff --git a/docs/zh/tools/pdf-to-markdown.md b/docs/zh/tools/pdf-to-markdown.md new file mode 100644 index 00000000..e9b19f34 --- /dev/null +++ b/docs/zh/tools/pdf-to-markdown.md @@ -0,0 +1,43 @@ +--- +title: PDF 转 Markdown +description: 将 PDF 文档转换为 Markdown 格式,可选提取图片。支持批量转换多个文件。 +--- + +# PDF 转 Markdown + +将 PDF 文件转换为 Markdown (`.md`) 格式,保留标题、段落、列表和基本格式。可选择提取并包含嵌入的图片。支持单个和批量转换。由 PyMuPDF 提供支持。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。 +2. 可选择切换 **包含图片**,将提取的图片嵌入 Markdown 输出。 +3. 点击 **转换** 开始处理。 +4. 单个文件会下载为 `filename.md`。多个文件会生成 `markdown-files.zip`。 + +## 选项 + +- **包含图片**:勾选后,会提取 PDF 中的嵌入图片并在 Markdown 输出中引用。取消勾选时,仅转换文本内容。 + +## 输出格式 + +- **单个文件**:`filename.md` +- **多个文件**:`markdown-files.zip`,每个输入 PDF 对应一个 `.md`。 + +## 使用场景 + +- 将 PDF 文档转换为 Markdown,用于 VitePress、Hugo 或 Jekyll 等静态站点生成器。 +- 将 PDF 研究论文转换为可编辑的 Markdown,用于 Obsidian 等笔记应用。 +- 将旧版 PDF 知识库迁移为对 Git 友好的文本格式。 +- 从 PDF 电子书中提取结构化内容以便重新排版。 + +## 小技巧 + +- 当 PDF 包含对内容至关重要的图表或插图时,包含图片选项很有用。对于以文本为主的文档,请禁用它以保持输出整洁。 +- 带有侧边栏、脚注或多栏文本的复杂布局可能会生成不完美的 Markdown。请根据需要检查并调整输出。 +- 如需不带任何格式的原始文本,请改用 [PDF 转文本](./pdf-to-text)。 + +## 相关工具 + +- [PDF 转文本](./pdf-to-text) +- [PDF 转 Word](./pdf-to-word) +- [为 AI 准备 PDF](./prepare-pdf-for-ai) diff --git a/docs/zh/tools/pdf-to-pdfa.md b/docs/zh/tools/pdf-to-pdfa.md new file mode 100644 index 00000000..5c2bf693 --- /dev/null +++ b/docs/zh/tools/pdf-to-pdfa.md @@ -0,0 +1,50 @@ +--- +title: PDF 转 PDF/A +description: 将标准 PDF 转换为用于长期归档的 PDF/A 格式。支持 PDF/A-1b、PDF/A-2b 和 PDF/A-3b 合规级别。 +--- + +# PDF 转 PDF/A + +PDF/A 是 PDF 的 ISO 标准化子集,专为长期数字保存而设计。此工具使用直接在浏览器中运行的 Ghostscript,将您的标准 PDF 转换为符合 PDF/A 的文档。 + +## 使用方法 + +1. 上传一个或多个 PDF 文件。 +2. 从下拉菜单中选择 **PDF/A 版本**。 +3. 对于正常转换失败的复杂文件,可选择启用 **预先扁平化 PDF**。 +4. 点击 **转换为 PDF/A**。多个文件会生成 ZIP 压缩包。 + +## PDF/A 版本 + +| 版本 | 限制 | 最适合 | +| ------------ | -------------------------- | -------------------------- | +| **PDF/A-1b** | 最严格。无透明度,无图层。 | 与较旧归档系统的最大兼容性 | +| **PDF/A-2b** | 允许透明度和 JPEG2000。 | 通用归档(推荐) | +| **PDF/A-3b** | 允许嵌入任何格式的附件。 | 归档带有源数据文件的文档 | + +默认选择 PDF/A-2b,可满足绝大多数归档需求。 + +## 预先扁平化选项 + +某些 PDF 包含会妨碍干净地转换为 PDF/A 的特性,例如不常见的字体编码、复杂的透明度堆叠或损坏的内部结构。启用 **预先扁平化** 会在转换前以 300 DPI 栅格化 PDF,这能保证合规,但代价是文本将无法选择。当标准转换出错时,请将其用作备用方案。 + +预先扁平化需要 PyMuPDF WASM 引擎。 + +## 使用场景 + +- 满足政府或法律的归档要求(许多司法管辖区要求法院文件使用 PDF/A) +- 向机构存储库或数字图书馆提交文档 +- 保存十年后原始软件可能已不存在的业务记录 +- 为要求带有 XML 附件的 PDF/A-3b 的电子发票标准准备发票 + +## 小技巧 + +- 请先尝试不使用预先扁平化进行转换。仅在出现错误时才启用它。 +- PDF/A 会嵌入所有字体,因此输出文件通常比原始文件更大。 +- 如果您的工作流需要严格合规,请在专门的 PDF/A 验证器中验证输出。 + +## 相关工具 + +- [压缩 PDF](./compress-pdf):转换后减小文件大小 +- [扁平化 PDF](./flatten-pdf):转换为 PDF/A 之前扁平化表单 +- [移除元数据](./remove-metadata):归档前清除元数据 diff --git a/docs/zh/tools/pdf-to-png.md b/docs/zh/tools/pdf-to-png.md new file mode 100644 index 00000000..3585c7a4 --- /dev/null +++ b/docs/zh/tools/pdf-to-png.md @@ -0,0 +1,42 @@ +--- +title: PDF 转 PNG +description: 将 PDF 页面转换为缩放比例可调的无损 PNG 图像。非常适合高质量截图和透明背景。 +--- + +# PDF 转 PNG + +将 PDF 的每一页转换为 PNG 图像。PNG 使用无损压缩,因此输出会保留原始页面的每一个细节。单页 PDF 会下载为 `.png` 文件,多页 PDF 会生成 ZIP。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 设置 **缩放** 滑块以控制输出分辨率。 +3. 点击 **转换** 开始处理。 +4. 单个 PNG 或 ZIP 压缩包会自动下载。 + +## 选项 + +- **缩放**:范围从 1.0x 到 3.0x(默认 2.0x)。在 2.0x 时,标准 Letter 尺寸的页面渲染为约 1,224 x 1,584 像素。更高的缩放值会生成更大、更清晰的图像,但代价是文件大小和处理时间。 + +## 输出格式 + +- **单页**:`filename.png` +- **多页**:`filename_pngs.zip`,包含 `page_1.png`、`page_2.png` 等。 + +## 使用场景 + +- 为演示文稿捕获 PDF 页面的高保真截图。 +- 提取需要清晰边缘且无压缩伪影的图表或示意图。 +- 从 PDF 原型图准备网页设计素材。 +- 为 OCR 预处理创建无损页面图像。 + +## 小技巧 + +- PNG 文件比 JPG 大得多。如果文件大小比完美质量更重要,请使用 [PDF 转 JPG](./pdf-to-jpg) 或 [PDF 转 WebP](./pdf-to-webp)。 +- 在 1.0x 缩放时,输出与 PDF 的原生分辨率一致。如需印刷质量的导出,请提高到 3.0x。 + +## 相关工具 + +- [PDF 转 JPG](./pdf-to-jpg) +- [PDF 转 WebP](./pdf-to-webp) +- [PDF 转 SVG](./pdf-to-svg) diff --git a/docs/zh/tools/pdf-to-svg.md b/docs/zh/tools/pdf-to-svg.md new file mode 100644 index 00000000..56e037ed --- /dev/null +++ b/docs/zh/tools/pdf-to-svg.md @@ -0,0 +1,43 @@ +--- +title: PDF 转 SVG +description: 将 PDF 页面转换为可缩放的 SVG 矢量图形。将文本和形状保留为矢量路径,可无限缩放。 +--- + +# PDF 转 SVG + +将 PDF 的每一页转换为 SVG(可缩放矢量图形)文件。与栅格格式不同,SVG 会保留矢量路径、文本和形状,因此输出可缩放到任意大小而不会出现像素化。由 PyMuPDF 提供支持。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。您可以添加多个文件并分别管理。 +2. 点击 **转换** 处理所有已上传的文件。 +3. 单文件单页的转换会下载为独立的 `.svg`。其他情况都会下载为 ZIP 压缩包。 + +## 选项 + +此工具没有可配置的选项。每个页面都使用 PyMuPDF 的原生矢量导出转换为 SVG。 + +## 输出格式 + +- **单文件,单页**:`filename.svg` +- **单文件,多页**:`filename_svg.zip`,包含 `page_1.svg`、`page_2.svg` 等。 +- **多个文件**:`pdf_to_svg.zip`,文件按源文档名称组织。 + +## 使用场景 + +- 从 PDF 报告中提取矢量图表、图示或插图,用于网页。 +- 在 Inkscape 或 Illustrator 等矢量编辑器中编辑 PDF 页面内容。 +- 在响应式网络应用中嵌入可缩放的页面预览。 +- 从 PDF 宣传册中提取徽标或图形,同时保持边缘锐利。 + +## 小技巧 + +- SVG 最适合包含矢量内容的 PDF。扫描文档或图像较多的 PDF 会生成包含嵌入栅格数据的大型 SVG 文件。 +- 对于图像较多的 PDF,如需栅格输出,请改用 [PDF 转 PNG](./pdf-to-png) 或 [PDF 转 JPG](./pdf-to-jpg)。 +- 此工具支持批量转换:一次上传多个 PDF,即可一次性全部转换。 + +## 相关工具 + +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 JPG](./pdf-to-jpg) +- [PDF 转 Markdown](./pdf-to-markdown) diff --git a/docs/zh/tools/pdf-to-text.md b/docs/zh/tools/pdf-to-text.md new file mode 100644 index 00000000..2f711074 --- /dev/null +++ b/docs/zh/tools/pdf-to-text.md @@ -0,0 +1,43 @@ +--- +title: PDF 转文本 +description: 从 PDF 文件中提取纯文本内容。支持批量提取多个 PDF,并输出为 TXT 文件。 +--- + +# PDF 转文本 + +从 PDF 文件中提取所有文本内容,并保存为纯 `.txt` 文件。支持批量处理:上传多个 PDF,一次操作即可提取每个文件的文本。由 PyMuPDF 提供支持。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。使用“添加更多”和“清除”按钮管理文件列表。 +2. 点击 **提取** 开始处理。 +3. 单个文件会下载为 `filename.txt`。多个文件会生成 `pdf-to-text.zip` 压缩包。 + +## 选项 + +此工具没有可配置的选项。会按阅读顺序提取每一页的所有文本内容。 + +## 输出格式 + +- **单个文件**:`filename.txt` +- **多个文件**:`pdf-to-text.zip`,每个输入 PDF 对应一个 `.txt`。 + +## 使用场景 + +- 从 PDF 报告中提取正文,用于全文搜索索引。 +- 将 PDF 电子书或文章转换为纯文本,以便在电子墨水设备上阅读。 +- 从合同或法律文件中提取文本,用于关键词分析。 +- 去除 PDF 的格式,获得干净的文本,供数据处理脚本使用。 +- 从 PDF 档案中准备用于自然语言处理的文本语料库。 + +## 小技巧 + +- 扫描的 PDF(仅有图像)会生成空的文本文件,因为没有可提取的文本层。请先对扫描文档进行 OCR。 +- 输出保留 PyMuPDF 所解读的阅读顺序,通常是从左到右、从上到下。多栏布局可能会生成交错的文本。 +- 如需带有标题和格式的结构化输出,请尝试 [PDF 转 Markdown](./pdf-to-markdown)。如需适用于 AI 的结构化 JSON,请使用 [为 AI 准备 PDF](./prepare-pdf-for-ai)。 + +## 相关工具 + +- [PDF 转 Markdown](./pdf-to-markdown) +- [为 AI 准备 PDF](./prepare-pdf-for-ai) +- [PDF 转 Word](./pdf-to-word) diff --git a/docs/zh/tools/pdf-to-tiff.md b/docs/zh/tools/pdf-to-tiff.md new file mode 100644 index 00000000..e7bde1b6 --- /dev/null +++ b/docs/zh/tools/pdf-to-tiff.md @@ -0,0 +1,43 @@ +--- +title: PDF 转 TIFF +description: 将 PDF 页面转换为 TIFF 图像,常用于印刷、传真和归档工作流。编码失败时回退为 PNG。 +--- + +# PDF 转 TIFF + +将 PDF 的每一页转换为 TIFF 图像。TIFF 是印刷制作、传真系统和文档归档的标准格式。工具使用 PackBits 压缩进行 TIFF 编码,如果某个页面编码失败,则回退为 PNG。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 点击 **转换** 处理文件。 +3. 单个 TIFF 文件或 ZIP 压缩包会自动下载。 + +## 选项 + +此工具没有可配置的选项。页面以固定的 2 倍比例渲染。 + +## 输出格式 + +- **单页**:`filename.tiff` +- **多页**:`filename_tiffs.zip`,包含 `page_1.tiff`、`page_2.tiff` 等。 + +如果某个特定页面的 TIFF 编码失败(由于压缩问题),该页面会改为保存为 `.png` 文件。在这种情况下,ZIP 中会混合包含 TIFF 和 PNG 文件。 + +## 使用场景 + +- 向要求 TIFF 格式的政府机构或法律系统提交文档。 +- 准备页面,通过数字传真服务进行传真传输。 +- 以广泛支持的无损格式归档扫描文档。 +- 将页面输入企业文档管理系统。 + +## 小技巧 + +- TIFF 文件很大。如果您只需要用于网页或屏幕的无损质量,[PDF 转 PNG](./pdf-to-png) 是更好的选择。 +- 如果某些页面需要使用 PNG 回退,请检查 ZIP 内容,您可能需要单独转换这些页面。 + +## 相关工具 + +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 BMP](./pdf-to-bmp) +- [PDF 转 JPG](./pdf-to-jpg) diff --git a/docs/zh/tools/pdf-to-webp.md b/docs/zh/tools/pdf-to-webp.md new file mode 100644 index 00000000..2331e49a --- /dev/null +++ b/docs/zh/tools/pdf-to-webp.md @@ -0,0 +1,43 @@ +--- +title: PDF 转 WebP +description: 将 PDF 页面转换为质量可调的 WebP 图像。在视觉质量相当的情况下,文件比 JPG 更小。 +--- + +# PDF 转 WebP + +将 PDF 的每一页转换为 WebP 图像。在相同的感知质量下,WebP 生成的文件通常比 JPG 小 25-35%,是网页使用的理想选择。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传 PDF。 +2. 调整 **质量** 滑块。 +3. 点击 **转换** 处理文件。 +4. 单个 `.webp` 文件或 ZIP 压缩包会自动下载。 + +## 选项 + +- **质量**:从 0% 到 100% 的滑块(默认 85%)。控制有损压缩级别。数值越高,保留的细节越多。 + +页面在内部以 2 倍比例渲染,生成的图像尺寸大约是 PDF 原始尺寸的两倍。 + +## 输出格式 + +- **单页**:`filename.webp` +- **多页**:`filename_webps.zip`,包含 `page_1.webp`、`page_2.webp` 等。 + +## 使用场景 + +- 为带宽有限的网站准备页面预览。 +- 为社交媒体生成传单或宣传册的轻量图像版本。 +- 将多页文档批量转换为经过网页优化的图像集。 + +## 小技巧 + +- 所有现代浏览器都支持 WebP。如需兼容旧版浏览器,请回退使用 [PDF 转 JPG](./pdf-to-jpg)。 +- 80-85% 的质量在屏幕上通常与原图难以区分,同时能保持较小的文件大小。 + +## 相关工具 + +- [PDF 转 JPG](./pdf-to-jpg) +- [PDF 转 PNG](./pdf-to-png) +- [PDF 转 BMP](./pdf-to-bmp) diff --git a/docs/zh/tools/pdf-to-word.md b/docs/zh/tools/pdf-to-word.md new file mode 100644 index 00000000..d1e5488f --- /dev/null +++ b/docs/zh/tools/pdf-to-word.md @@ -0,0 +1,42 @@ +--- +title: PDF 转 Word +description: 将 PDF 文件转换为可编辑的 Word (DOCX) 文档。支持一次批量转换多个 PDF。 +--- + +# PDF 转 Word + +将 PDF 文件转换为可编辑的 Word (`.docx`) 文档。工具使用 PyMuPDF 重建文档内容,保留文本、基本格式和布局。支持单个和批量转换。 + +## 使用方法 + +1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。您可以添加更多文件,或从列表中移除单个文件。 +2. 点击 **转换** 开始处理。 +3. 单个文件会下载为 `filename.docx`。多个文件会打包为 `converted-documents.zip`。 + +## 选项 + +此工具没有可配置的选项。每个 PDF 都使用 PyMuPDF 的内置转换引擎转换为 DOCX。 + +## 输出格式 + +- **单个文件**:`filename.docx` +- **多个文件**:`converted-documents.zip`,每个输入 PDF 对应一个 `.docx`。 + +## 使用场景 + +- 编辑您收到并需要修改的 PDF 中的文本。 +- 将归档的 PDF 报告转换为同事可在 Microsoft Word 或 Google Docs 中编辑的格式。 +- 将 PDF 合同或提案中的内容提取到 Word 中进行修订。 +- 将旧版 PDF 文档迁移为可编辑格式。 + +## 小技巧 + +- 带有多栏文本、嵌入式表单或大量图形的复杂布局可能无法完美转换。请检查输出,并在文字处理软件中调整格式。 +- 扫描的 PDF(仅有图像)会生成空的或内容极少的 DOCX 文件。请先对其进行 OCR 以添加文本层。 +- 批量模式可高效转换整个文件夹的 PDF,一次上传全部即可。 + +## 相关工具 + +- [PDF 转文本](./pdf-to-text) +- [PDF 转 Markdown](./pdf-to-markdown) +- [PDF 工作流构建器](./pdf-workflow) diff --git a/docs/zh/tools/pdf-to-zip.md b/docs/zh/tools/pdf-to-zip.md new file mode 100644 index 00000000..24dd47a8 --- /dev/null +++ b/docs/zh/tools/pdf-to-zip.md @@ -0,0 +1,41 @@ +--- +title: PDF 转 ZIP +description: 将多个 PDF 文件打包为单个 ZIP 压缩包,便于分享和存储。 +--- + +# PDF 转 ZIP + +将多个 PDF 文件打成单个 ZIP 压缩包。这是一个简单的打包工具,不会对 PDF 本身进行转换、压缩或修改。 + +## 使用方法 + +1. 使用拖放区域上传多个 PDF 文件。 +2. 查看文件列表。移除您不想包含的文件。 +3. 点击处理按钮。 +4. 包含所有已上传 PDF 的 ZIP 压缩包会立即下载。 + +## 功能 + +- 接受任意数量的 PDF 文件 +- 创建压缩包前可逐个移除文件 +- 在 ZIP 内保留原始文件名 +- 不修改 PDF 内容,文件按原样打包 +- 显示每个已上传 PDF 的文件名和大小 + +## 使用场景 + +- 将一组发票或收据打包,作为电子邮件附件 +- 打包项目交付物(多个 PDF 报告)以便交接 +- 为一组表单或模板创建单个下载文件 +- 将一批文档归档为一个压缩文件 + +## 小技巧 + +- ZIP 文件使用原始的 PDF 文件名。如果有同名文件,请在上传前重命名以避免冲突。 +- 此工具不会压缩 PDF 本身。如需减小文件大小,请先使用压缩 PDF 处理,然后再用此工具打包。 + +## 相关工具 + +- [合并 PDF](./merge-pdf) +- [分割 PDF](./split-pdf) +- [压缩 PDF](./compress-pdf) diff --git a/docs/zh/tools/pdf-workflow.md b/docs/zh/tools/pdf-workflow.md new file mode 100644 index 00000000..64cf2cf6 --- /dev/null +++ b/docs/zh/tools/pdf-workflow.md @@ -0,0 +1,95 @@ +--- +title: PDF 工作流构建器 +description: 通过在画布上连接节点,以可视化方式构建自定义 PDF 处理流水线。串联合并、压缩、水印和导出等操作。 +--- + +# PDF 工作流构建器 + +工作流构建器可让您将多个 PDF 操作串联成一个自动化流水线。无需逐个运行工具,您只需连接由输入、处理和输出节点组成的可视化图,然后一键执行所有操作。您的文件始终不会离开浏览器。 + +## 使用方法 + +界面分为三个面板:左侧的 **节点工具箱**,中间的 **画布**,以及选中节点时出现在右侧的 **设置面板**。 + +1. **添加节点**:点击左侧边栏中的节点,或将其直接拖到画布上。使用工具箱顶部的搜索栏按名称筛选。 +2. **连接节点**:从一个节点的输出接口(节点底部)拖动到另一个节点的输入接口(节点顶部)。连接自上而下流动。 +3. **配置设置**:点击节点以打开右侧的设置面板。每种节点类型都有自己的选项(页面范围、质量滑块、密码等)。 +4. **运行工作流**:点击工具栏中的 **运行** 按钮。引擎会按拓扑顺序执行节点,依次处理每个节点。底部的状态栏会跟踪进度。 +5. **下载结果**:末端的下载节点会保存最终的 PDF(如果生成多个文件则为 ZIP)。 + +## 节点类别 + +节点分为六个类别,在画布上以不同颜色标识: + +- **输入**(蓝色):PDF 输入、图片输入、Word/Excel/PowerPoint 转 PDF,以及其他 15 种以上将文件送入流水线的格式转换器。 +- **编辑与注释**(靛蓝色):裁剪、灰度、反转颜色、水印、页码、页眉和页脚、扫描效果、调整颜色、背景颜色、移除空白页、移除注释。 +- **组织与管理**(紫色):合并、分割、提取页面、旋转、删除页面、反转、添加空白页、分割页面、N-Up、修复页面尺寸、合并为单页、小册子、海报化、编辑元数据、目录、OCR。 +- **优化与修复**(琥珀色):压缩、栅格化、线性化、校正、PDF 转 PDF/A、字体转轮廓、修复。 +- **PDF 安全**(玫红色):加密、解密、清理、扁平化、数字签名、涂黑。 +- **输出**(青色):下载(自动检测单个 PDF 还是 ZIP)、PDF 转图片、PDF 转文本、PDF 转 DOCX、PDF 转 XLSX、PDF 转 CSV、PDF 转 SVG、PDF 转 Markdown、提取图片。 + +## 保存和加载工作流 + +工具栏提供四种持久化选项: + +- **保存**:将当前工作流作为命名模板存储在浏览器的本地存储中。您可以保存多个模板。 +- **加载**:打开一个列出所有已保存模板的弹窗。点击加载以恢复某个模板,或删除不再需要的模板。 +- **导出**:将工作流下载为 `.json` 文件,以便分享或备份。 +- **导入**:从磁盘加载 `.json` 工作流文件,恢复所有节点、位置和连接。 + +模板会在本地存储中跨会话保留。导出的 JSON 文件可在不同浏览器和机器之间移植。 + +## 执行模型 + +引擎会根据您的连接构建依赖图,并按拓扑顺序执行节点。如果任何节点失败,执行会停止,失败的节点会被标红。需要记住几条规则: + +- 每个工作流至少需要一个 **输入** 节点和一个 **输出** 节点。 +- 引擎会检测循环依赖,并以错误阻止执行。 +- **加密** 节点必须是输出节点之前的最后一个处理步骤。将其放在更前面会触发验证警告,因为下游节点无法处理已加密的数据。 +- 受密码保护的 PDF 会在执行期间提示输入密码。 +- 支持多 PDF 输入:合并节点可以将它们合并,批处理节点则会逐个处理每个 PDF。 + +## 接口类型 + +连接使用带类型的接口,以防止无效连线: + +- **PDF**(靛蓝色):单个 PDF 文档。 +- **MultiPDF**(琥珀色):打包在一起的多个 PDF 文档。 +- **Image**(绿色):图片二进制数据。 + +## 选项 + +每个节点都有自己的配置,可通过右侧设置面板访问。常见模式包括: + +- 分割、提取页面、删除页面节点上的 **页面范围** +- 图片转换输出节点上的 **质量滑块** +- 加密和解密节点上的 **密码字段** +- 水印、页眉和页脚、编辑元数据的 **文本输入** +- 旋转节点上的 **旋转角度** +- 压缩节点上的 **压缩级别** +- OCR 节点上的 **OCR 语言选择** + +## 使用场景 + +- **发票处理流水线**:PDF 输入 -> OCR -> 提取 PDF 表格 -> 下载为 CSV。 +- **报告标准化**:Word 转 PDF -> 修复页面尺寸 -> 添加页码 -> 水印 -> 压缩 -> 下载。 +- **归档准备**:PDF 输入 -> 修复 -> 扁平化 -> 清理 -> PDF 转 PDF/A -> 下载。 +- **批量图片提取**:PDF 输入(多个文件) -> 提取图片 -> 下载 ZIP。 +- **可直接印刷的小册子**:PDF 输入 -> 小册子 -> 裁剪 -> 压缩 -> 下载。 +- **安全分发**:PDF 输入 -> 涂黑 -> 移除注释 -> 加密 -> 下载。 + +## 小技巧 + +- 使用 **Delete** 或 **Backspace** 从画布上移除选中的节点。 +- 点击节点状态栏上的 **X** 按钮可直接将其删除。 +- 点击并拖动空白处即可平移画布。平移时光标会变为抓取图标。 +- 在移动设备上,使用工具栏中的 **+** 按钮切换节点工具箱。 +- 如果您的工作流生成多个输出文件,下载节点会自动将它们打包为 ZIP。 +- 从简单开始:在增加复杂度之前,先构建并测试一个包含两个节点的流水线。 + +## 相关工具 + +- [PDF 转文本](./pdf-to-text) +- [PDF 转 Excel](./pdf-to-excel) +- [提取图片](./extract-images) +- [PDF 转 Markdown](./pdf-to-markdown) diff --git a/docs/zh/tools/png-to-pdf.md b/docs/zh/tools/png-to-pdf.md new file mode 100644 index 00000000..b9798b36 --- /dev/null +++ b/docs/zh/tools/png-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: PNG 转 PDF +description: 完全在浏览器中,将一张或多张 PNG 图片转换为质量可调的 PDF 文档。 +--- + +# PNG 转 PDF + +将 PNG 图片转换为 PDF,并保留其完整分辨率。每张 PNG 都会成为单独的一页,页面大小与原始图片尺寸一致。透明度会被自动处理。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :----- | +| PNG | `.png` | + +## 使用方法 + +1. 点击上传区域或拖放 PNG 文件。您可以一次选择多个文件。 +2. 管理文件列表:移除不需要的文件或添加更多文件。 +3. 从下拉菜单中选择 **PDF 质量** 级别。 +4. 点击 **转换为 PDF**。输出会下载为 `from_jpgs.pdf`。 + +工具使用 pdf-lib 直接嵌入每张图片。如果某张 PNG 无法原生嵌入(例如由于不常见的颜色配置文件),则会回退为通过画布重新渲染为 JPEG。 + +## 选项 + +**PDF 质量** 控制嵌入之前应用的压缩: + +- **高质量**:压缩最少,文件最大。 +- **中等质量**(默认):在大小和清晰度之间取得良好平衡。 +- **低质量**:压缩最强,输出最小。 + +## 使用场景 + +- 将截图转换为多页 PDF,用于错误报告或文档 +- 将 UI 设计导出文件打包为单个文件以供审阅 +- 将图表导出文件(draw.io、Excalidraw)转换为可分享的 PDF +- 将一组图表图片汇编为报告 + +## 小技巧 + +- 带透明度的 PNG 文件在 PDF 中会获得白色背景。如果您需要不同的背景,请事先编辑图片。 +- 对于带有锐利边缘和文字的截图和图表,高质量可避免 JPEG 压缩伪影。中等或低质量可能会在内部转换为 JPEG。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [JPG 转 PDF](./jpg-to-pdf) +- [SVG 转 PDF](./svg-to-pdf) diff --git a/docs/zh/tools/posterize-pdf.md b/docs/zh/tools/posterize-pdf.md new file mode 100644 index 00000000..a17fd7e6 --- /dev/null +++ b/docs/zh/tools/posterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: 海报化 PDF +description: 将 PDF 页面拆分为由较小页面组成的网格,以便在多张纸上进行大幅面打印。 +--- + +# 海报化 PDF + +将 PDF 的每一页划分为由较小子页面组成的网格。使用此工具可以把单个页面打印到多张纸上,再将它们拼接起来,制作成大型海报或横幅。 + +## 工作原理 + +1. 上传 PDF 文件。 +2. 设置**行数**和**列数**来定义网格(例如,2 行 x 2 列会将每页拆分为 4 个子页面)。 +3. 可选:指定页面范围,限制要海报化的页面。 +4. 预览画布会在当前页面上显示网格叠加层,方便您直观查看切割位置。 +5. 在页面之间切换,查看其他页面上的叠加层。 +6. 点击处理按钮。每个网格单元都会成为输出 PDF 中的一个独立页面。 + +## 功能 + +- 可配置行数和列数,网格尺寸灵活 +- 实时预览,网格叠加层精确显示页面的分割位置 +- 页面范围筛选,仅对指定页面进行海报化 +- 在预览中逐页浏览 +- 缓存页面快照,预览切换更快 +- 红色虚线网格线清晰标出切割边界 + +## 选项 + +| 选项 | 说明 | +| ------------ | --------------------------------- | +| **行数** | 水平分割数量(默认:1) | +| **列数** | 垂直分割数量(默认:1) | +| **页面范围** | 要海报化的页面(留空 = 所有页面) | + +## 使用场景 + +- 将海报尺寸的 PDF 打印到多张标准 A4 或 Letter 纸上,拼贴到墙上 +- 用单页 PDF 设计制作大型横幅 +- 将超大的技术图纸拆分为可打印的分块 +- 在没有宽幅打印机的情况下完成大幅面打印 + +## 提示 + +- 2x2 网格会将一页变成 4 页,3x3 网格会将一页变成 9 页。请根据最终拼接成品的大小规划网格。 +- 预览叠加层可帮助您确认重要内容不会落在切割线上。如有需要,请调整行数和列数。 +- 如需相反的操作(将多个页面放到一张纸上),请使用 [N-Up PDF](./n-up-pdf)。 + +## 相关工具 + +- [N-Up PDF](./n-up-pdf) +- [分割页面](./divide-pages) +- [分割 PDF](./split-pdf) diff --git a/docs/zh/tools/powerpoint-to-pdf.md b/docs/zh/tools/powerpoint-to-pdf.md new file mode 100644 index 00000000..1882e4ae --- /dev/null +++ b/docs/zh/tools/powerpoint-to-pdf.md @@ -0,0 +1,55 @@ +--- +title: PowerPoint 转 PDF +description: 将 PowerPoint 演示文稿(PPT、PPTX)和 ODP 文件转换为 PDF,并保留幻灯片格式。 +--- + +# PowerPoint 转 PDF + +将演示文稿文件转换为 PDF。每张幻灯片都会成为输出文档中的一页,文本、图片、形状和切换效果通过浏览器内的 LibreOffice 引擎渲染。同时支持新版和旧版 PowerPoint 格式,以及 OpenDocument 演示文稿格式。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :-------------------- | :------ | +| PowerPoint(新版) | `.pptx` | +| PowerPoint(旧版) | `.ppt` | +| OpenDocument 演示文稿 | `.odp` | + +## 工作原理 + +1. 点击上传区域,或将演示文稿文件拖放到此处。 +2. 查看文件列表。可根据需要添加或移除文件。 +3. 点击**转换为 PDF**。LibreOffice 引擎会在首次使用时加载,然后转换每个文件。 +4. 单个文件会直接下载为 PDF。多个文件会打包为 `powerpoint-converted.zip`。 + +## 选项 + +此工具没有额外设置。幻灯片按其原始尺寸渲染。 + +## 输出 + +| 输入数量 | 输出 | +| :------- | :------------------------------------------------------------- | +| 1 个文件 | 下载单个 PDF(原文件名,扩展名为 `.pdf`) | +| 2 个以上 | ZIP 压缩包(`powerpoint-converted.zip`),每个文件对应一个 PDF | + +## 使用场景 + +- 在分享给可能没有 PowerPoint 的观众之前,先将演示文稿转换为 PDF +- 为会议或研讨会制作可打印的幻灯片讲义版本 +- 以在所有设备上显示一致的格式归档演示文稿 +- 批量将 LibreOffice Impress 的 ODP 演示文稿库转换为 PDF +- 制作用于邮件附件的融资演示文稿 PDF 版本 + +## 提示 + +- 幻灯片动画和切换效果不会体现在 PDF 中,每张幻灯片都会被截取为静态页面。 +- 嵌入的视频不会出现在输出中。如有需要,请用截图或占位图片替换。 +- 默认的 PDF 导出不包含演讲者备注。如果需要备注,请先通过 PowerPoint 原生的“打印备注”视图导出。 +- LibreOffice 引擎在首次加载后会被缓存,因此在同一会话中转换第二个演示文稿会快得多。 + +## 相关工具 + +- [Word 转 PDF](./word-to-pdf) +- [Excel 转 PDF](./excel-to-pdf) +- [图片转 PDF](./image-to-pdf) diff --git a/docs/zh/tools/prepare-pdf-for-ai.md b/docs/zh/tools/prepare-pdf-for-ai.md new file mode 100644 index 00000000..71ed2e71 --- /dev/null +++ b/docs/zh/tools/prepare-pdf-for-ai.md @@ -0,0 +1,47 @@ +--- +title: 为 AI 准备 PDF +description: 将 PDF 内容提取为针对 LLM 和 LlamaIndex 等 AI 管道优化的结构化 JSON。支持批量处理。 +--- + +# 为 AI 准备 PDF + +从 PDF 文件中提取内容,并将其整理为适合大型语言模型(LLM)和 LlamaIndex 等 AI 框架摄取的 JSON。每一页的内容都会被提取并组织成结构化格式,可直接用于 RAG 管道、聊天机器人或语义搜索系统。 + +## 工作原理 + +1. 点击拖放区域或将文件拖到其上,上传一个或多个 PDF。 +2. 点击**提取**开始处理。 +3. 单个文件会下载为 `filename_llm.json`。多个文件会生成 `pdf-for-ai.zip` 压缩包。 + +此工具使用 PyMuPDF 的 LlamaIndex 集成来提取带元数据的页面级内容,生成的输出可直接加载到 AI 框架中。 + +## 选项 + +此工具没有可配置的选项。所有页面都会提取完整文本和元数据。 + +## 输出格式 + +- **单个文件**:`filename_llm.json` +- **多个文件**:`pdf-for-ai.zip`,每个输入 PDF 对应一个 `_llm.json`。 + +JSON 输出遵循 LlamaIndex 文档模式,包含每页的文本内容和元数据字段。 + +## 使用场景 + +- 为检索增强生成(RAG)管道准备 PDF 文档。 +- 利用 PDF 档案为 AI 聊天机器人构建可搜索的知识库。 +- 将 PDF 报告输入基于 LLM 的分析工作流。 +- 为语义搜索和问答系统预处理研究论文。 +- 从 PDF 文档集合中创建结构化的训练数据。 + +## 提示 + +- 如果只需要不含 AI 专用格式的纯文本提取,请使用 [PDF 转文本](./pdf-to-text)。 +- 如果需要保留标题和结构的 Markdown 输出,请使用 [PDF 转 Markdown](./pdf-to-markdown)。 +- 扫描版 PDF 的输出会为空或内容极少。请先通过 OCR 添加文本层,再进行提取。 + +## 相关工具 + +- [PDF 转文本](./pdf-to-text) +- [PDF 转 Markdown](./pdf-to-markdown) +- [PDF 转 JSON](./pdf-to-json) diff --git a/docs/zh/tools/protect-pdf.md b/docs/zh/tools/protect-pdf.md new file mode 100644 index 00000000..6031cfd4 --- /dev/null +++ b/docs/zh/tools/protect-pdf.md @@ -0,0 +1,64 @@ +--- +title: 保护 PDF +description: 使用 256 位 AES 加密为 PDF 文件设置密码保护。可设置用户密码和所有者密码,并配置使用限制。 +--- + +# 保护 PDF + +用密码锁定您的 PDF,使只有获得授权的人才能打开。BentoPDF 使用 256 位 AES 加密(银行和政府机构使用的同一标准),并通过 QPDF 完全在您的浏览器中完成。 + +## 工作原理 + +1. 上传 PDF 文件。 +2. 输入**用户密码**(必填)。这是他人打开文件时需要输入的密码。 +3. 可选:输入**所有者密码**。设置后,PDF 将获得使用限制,禁止打印、编辑、复制和批注。 +4. 点击**加密 PDF**。 +5. 下载加密后的文件。 + +## 密码类型 + +### 用户密码(必填) + +用户密码是收件人打开 PDF 时需要输入的密码。没有它,文档将完全无法访问。每个加密的 PDF 都必须有用户密码。 + +### 所有者密码(可选) + +所有者密码用于控制获得授权的用户在打开文件后可以执行的操作。当您设置了不同的所有者密码时,BentoPDF 会自动应用最严格的限制集: + +- 禁止修改 +- 禁止提取/复制 +- 禁止打印 +- 禁止批注 +- 禁止填写表单 +- 禁止文档组装 + +如果您将所有者密码留空,PDF 仍会被加密(打开时仍需要用户密码),但打开后没有任何使用限制。 + +## 加密详情 + +- **算法**:AES-256(256 位高级加密标准) +- **密钥长度**:256 位 +- **标准**:PDF 2.0 加密(QPDF 实现) + +以当前技术,暴力破解 AES-256 在计算上是不可行的。加密 PDF 的安全性完全取决于密码的强度。 + +## 使用场景 + +- 在通过邮件发送之前保护机密财务报告 +- 保护与对方律师共享的法律文件 +- 为医疗记录或个人身份信息添加密码 +- 通过访问控制分发付费内容(电子书、报告) +- 遵守要求静态数据加密的数据保护政策 + +## 提示 + +- 使用强度高且唯一的密码。包含大小写字母、数字和符号的 12 位以上口令最为理想。 +- 通过单独的渠道(电话、短信)分享密码,切勿与 PDF 放在同一封邮件中。 +- 如果您只想限制操作(禁止打印、禁止复制),而不需要密码才能打开,请改用“更改权限”工具。 + +## 相关工具 + +- [解密 PDF](./unlock-pdf):已知密码时移除加密 +- [更改权限](./change-permissions):修改特定的使用限制 +- [移除限制](./remove-restrictions):移除 PDF 的所有安全设置 +- [清理 PDF](./sanitize-pdf):在加密前移除隐藏内容 diff --git a/docs/zh/tools/psd-to-pdf.md b/docs/zh/tools/psd-to-pdf.md new file mode 100644 index 00000000..e1b265b4 --- /dev/null +++ b/docs/zh/tools/psd-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: PSD 转 PDF +description: 在浏览器中将 Photoshop(PSD)文件转换为 PDF。免费、私密,无需 Adobe 软件。 +--- + +# PSD 转 PDF + +将 Adobe Photoshop PSD 文件转换为 PDF 文档。PSD 是 Photoshop 的原生格式,通常需要昂贵的 Adobe 软件才能打开。此工具会将 PSD 文件的合并图像以完整分辨率渲染为 PDF 页面。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :-------------- | :----- | :------------------- | +| Adobe Photoshop | `.psd` | 渲染合并后的复合图像 | + +## 工作原理 + +1. 点击上传区域或将 PSD 文件拖放到此处。支持多个文件。 +2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或使用**添加更多文件**加入更多文件。 +3. 点击**转换为 PDF**。PyMuPDF 引擎会读取 PSD 文件,并以原始分辨率将合并图像嵌入 PDF 页面。 +4. 单个 PSD 生成一个 PDF。上传多个 PSD 文件时,它们会合并为一个名为 `psd_to_pdf.pdf` 的多页 PDF,每个 PSD 成为其中一页。 + +## 选项 + +无需任何设置。转换器使用 PSD 文件中合并后的图像数据。 + +## 使用场景 + +- 无需打开 Photoshop 即可预览设计稿 +- 向没有 Adobe Creative Suite 的客户发送设计样稿 +- 打印 PSD 文件中的高分辨率作品 +- 用多个 PSD 设计文件创建 PDF 作品集,每个文件成为单个文档中的一页 + +## 提示 + +- 转换渲染的是 PSD 的合并(扁平化)视图。单独的图层、调整图层和图层效果不会作为独立元素保留在 PDF 中。 +- 多个 PSD 文件会合并为一个多页 PDF,而不是单独的 PDF。这对于制作作品集或样册很有用。 +- 分辨率很高的 PSD 文件(300 DPI 以上的印刷文件)会生成较大的 PDF。该工具会保留完整分辨率。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [PNG 转 PDF](./png-to-pdf) +- [VSD 转 PDF](./vsd-to-pdf) diff --git a/docs/zh/tools/pub-to-pdf.md b/docs/zh/tools/pub-to-pdf.md new file mode 100644 index 00000000..d3e719ae --- /dev/null +++ b/docs/zh/tools/pub-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: PUB 转 PDF +description: 在浏览器中将 Microsoft Publisher(PUB)文件转换为 PDF。免费、私密,无需安装软件。 +--- + +# PUB 转 PDF + +将 Microsoft Publisher 文件转换为 PDF。Publisher 是部分 Microsoft Office 版本附带的桌面排版工具,但大多数人并没有安装。使用此工具,任何人都可以直接在浏览器中将 PUB 文件转换为 PDF,无需 Microsoft 软件。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :------------------ | :----- | :----------- | +| Microsoft Publisher | `.pub` | 桌面排版文档 | + +## 工作原理 + +1. 点击上传区域或将 PUB 文件拖放到此处。可一次上传多个文件。 +2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或点击**添加更多文件**加入更多文件。 +3. 点击**转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载并转换每个 PUB 文件,保留版面、图片和文本框。 +4. 单个文件会直接下载为 PDF。多个文件会打包为名为 `pub-to-pdf.zip` 的 ZIP 压缩包。 + +## 选项 + +无需额外配置。转换器会自动处理 PUB 排版引擎。 + +## 使用场景 + +- 无需购买 Microsoft Publisher,即可打开客户发来的 PUB 传单或简报 +- 转换用 Publisher 制作的教会公告、活动节目单或学校通讯 +- 将 Publisher 制作的营销材料以通用格式归档 +- 在未安装 Publisher 的系统上打印 PUB 文件 + +## 提示 + +- 包含多层文本框和精确定位的复杂 Publisher 版面在转换过程中可能会有轻微位移。如果精确位置很重要,请检查输出结果。 +- LibreOffice 引擎每个会话只初始化一次。第一次转换耗时较长,之后会更快。 +- 为了让 Publisher 文件的转换最为忠实,请确保原文件中使用的自定义字体是标准系统字体。 + +## 相关工具 + +- [VSD 转 PDF](./vsd-to-pdf) +- [ODP 转 PDF](./odp-to-pdf) diff --git a/docs/zh/tools/rasterize-pdf.md b/docs/zh/tools/rasterize-pdf.md new file mode 100644 index 00000000..b9111449 --- /dev/null +++ b/docs/zh/tools/rasterize-pdf.md @@ -0,0 +1,53 @@ +--- +title: 栅格化 PDF +description: 将 PDF 页面转换为基于图像的 PDF。扁平化所有图层,移除可选择的文本,并可控制 DPI 和图像格式。 +--- + +# 栅格化 PDF + +栅格化会将 PDF 的每一页转换为图像,再将这些图像重新组合成 PDF。结果看起来与原件完全相同,但不包含可选择的文本、交互元素和可编辑图层,相当于一份高质量的复印件。 + +## 工作原理 + +1. 上传一个或多个 PDF 文件。 +2. 设置栅格化输出的 **DPI**(分辨率)。 +3. 选择**图像格式**:PNG 为无损质量,JPEG 文件更小。 +4. 可选:勾选**转换为灰度**。 +5. 点击**栅格化 PDF**。多个文件会以 ZIP 下载。 + +## 选项 + +| 设置 | 取值 | 默认值 | +| ------------ | ------------------------- | ------ | +| **DPI** | 72、150、200、300、600 | 150 | +| **图像格式** | PNG(无损)、JPEG(更小) | PNG | +| **灰度** | 开/关 | 关 | + +## DPI 参考 + +- **72**:仅用于屏幕查看,文件最小 +- **150**:适合一般用途的良好平衡 +- **200**:文字更清晰,文件大小适中 +- **300**:印刷品质输出 +- **600**:高质量归档或专业印刷 + +## 使用场景 + +- 在分享前防止机密文档的文本被提取 +- 通过将文本转换为像素,消除字体依赖问题 +- 为包含复杂图层或透明度、在不同阅读器中渲染不一致的 PDF 创建“扁平”版本 +- 为只接受图像输入的系统准备 PDF +- 将 PDF 简化为纯图像,从而剥离隐藏内容(如修订记录或表单数据) + +## 提示 + +- 150 DPI 搭配 PNG 是可靠的默认选择。只有在需要打印输出或放大查看细节时才提高。 +- JPEG 生成的文件明显更小,但会在锐利的文字边缘产生压缩伪影。 +- 栅格化不可逆,如果以后可能需要可编辑的文本,请保留原始 PDF。 + +## 相关工具 + +- [压缩 PDF](./compress-pdf):减小栅格化 PDF 的文件大小 +- [校正 PDF](./deskew-pdf):在栅格化扫描文档之前先将页面摆正 +- [字体转轮廓](./font-to-outline):如果想保持可缩放性,可将字体转换为矢量路径 +- [扁平化 PDF](./flatten-pdf):扁平化表单而不转换为图像 diff --git a/docs/zh/tools/remove-annotations.md b/docs/zh/tools/remove-annotations.md new file mode 100644 index 00000000..4d5b79fc --- /dev/null +++ b/docs/zh/tools/remove-annotations.md @@ -0,0 +1,42 @@ +--- +title: 移除注释 +description: 一键清除 PDF 中的所有评论、高亮、链接和其他注释。 +--- + +# 移除注释 + +通过移除所有注释来清理您的 PDF,包括评论、高亮、便签、文本标记、链接、印章以及文档中嵌入的任何其他注释对象。页面的底层内容(文本、图片、图形)保持不变。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 工具会检测文档的页数并显示文件信息。 +3. 点击**移除注释**开始处理。 +4. 清理后的 PDF 会自动下载,所有注释均已清除。 + +## 功能 + +- 移除所有注释类型:评论、高亮、下划线、删除线、便签、印章、链接和表单标记 +- 处理文档中的每一页 +- 保留所有非注释内容(文本、图片、矢量图形、表单字段) +- 处理前显示页数和文件大小 + +## 使用场景 + +- 在多位审阅者添加评论的审阅周期结束后,于最终分发前清理文档 +- 移除共享学习指南中的高亮标记和便签 +- 在归档前清除文档中的链接注释 +- 为谈判期间被大量批注的法律文件准备“干净”版本 +- 在送印前移除稿件中的审阅者评论 + +## 提示 + +- 此工具在 PDF 结构层面移除注释,因此结果保留可选择的文本和原始质量,不涉及栅格化。 +- 如果只想移除特定注释而不是全部,请使用 [PDF 编辑器](./edit-pdf) 选择性地删除单个注释。 +- 已扁平化的 PDF(注释已合并到页面内容中)中的注释无法移除,因为它们不再是独立对象。 + +## 相关工具 + +- [PDF 编辑器](./edit-pdf) +- [添加水印](./add-watermark) +- [签署 PDF](./sign-pdf) diff --git a/docs/zh/tools/remove-blank-pages.md b/docs/zh/tools/remove-blank-pages.md new file mode 100644 index 00000000..719f4a30 --- /dev/null +++ b/docs/zh/tools/remove-blank-pages.md @@ -0,0 +1,49 @@ +--- +title: 移除空白页 +description: 自动检测并移除 PDF 中的空白或近乎空白的页面,灵敏度可调。 +--- + +# 移除空白页 + +扫描 PDF 中的空白或近乎空白的页面并自动移除。该工具会渲染每一页并分析其像素内容,以判断是否为空白,然后让您在处理前确认要移除哪些页面。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 调整**灵敏度**滑块,控制“空白”的判定标准有多严格。 +3. 点击**检测空白页**扫描文档。 +4. 工具会显示检测到的空白页缩略图,供您查看。 +5. 确认所选页面,然后下载已移除空白页的清理后 PDF。 + +## 选项 + +- **灵敏度**:0% 到 100% 的滑块(默认 80%)。数值越高越严格,只标记完全或近乎全白的页面。数值越低越宽松,会捕获仅含极少内容(如一个点或淡淡的水印)的页面。 + +## 功能 + +- 对每一页进行像素级分析以检测空白内容 +- 可调节灵敏度滑块,精细调整检测效果 +- 检测到的空白页缩略图预览,便于手动核对 +- 所有非空白页面完全保持原样 +- 可处理任意大小或页数的文档 +- 扫描期间显示进度反馈 + +## 使用场景 + +- 清理扫描文档中扫描仪捕获到的单面原件空白背面 +- 移除批量扫描文档中的分隔页 +- 清除文档管理系统插入的空白页 +- 清理从文字处理软件导出、有时会带有末尾空白页的 PDF +- 通过移除不必要的空白页来减小文件大小 + +## 提示 + +- 从默认的 80% 灵敏度开始,再逐步调整。如果工具漏掉了您认为空白的页面,请降低灵敏度。如果它标记了包含您想保留的少量内容的页面,请提高灵敏度。 +- 工具需要渲染每一页来分析其内容,因此处理时间会随页数增加。对于非常大的文档,需要稍等片刻。 +- 在确认移除之前,请在缩略图预览中检查检测到的空白页。根据灵敏度设置,带有淡淡页眉、页脚或水印的页面可能会被标记。 + +## 相关工具 + +- [裁剪 PDF](./crop-pdf) +- [PDF 编辑器](./edit-pdf) +- [页码](./page-numbers) diff --git a/docs/zh/tools/remove-metadata.md b/docs/zh/tools/remove-metadata.md new file mode 100644 index 00000000..6b1da00d --- /dev/null +++ b/docs/zh/tools/remove-metadata.md @@ -0,0 +1,50 @@ +--- +title: 移除元数据 +description: 清除 PDF 文件中的所有隐藏元数据,包括作者、标题、创建日期、生成程序、XMP 数据和文档 ID。 +--- + +# 移除元数据 + +每个 PDF 都带有元数据,可能会泄露创建者、使用的软件、最后修改时间等信息。此工具会将其全部清除,包括信息字典、XMP 元数据流、文档 ID 和应用程序专用数据,留下一份不带任何来源痕迹的干净文档。 + +## 工作原理 + +1. 上传 PDF 文件。 +2. 点击**移除元数据**。 +3. 下载清理后的文件。 + +无需配置选项。该工具在设计上追求彻底:清除一切。 + +## 会被移除的内容 + +- **信息字典字段**:标题、作者、主题、关键词、创建者、生成程序、创建日期、修改日期 +- **XMP 元数据流**:存储在文档目录中的基于 XML 的元数据块 +- **文档 ID**:PDF 尾部中的唯一标识符,可用于跨系统追踪文档 +- **PieceInfo**:由 Illustrator 或 InDesign 等程序添加的应用程序专用元数据 + +## 会保留的内容 + +- 所有可见的页面内容(文本、图片、图形) +- 表单字段和注释 +- 书签和链接 +- 文档结构本身 + +## 使用场景 + +- 在匿名发布文档之前移除您的姓名和所属组织 +- 清除会暴露文档准备时间的创建时间戳 +- 清理标识您 PDF 软件栈的生成程序字符串 +- 为要求无元数据 PDF 的监管提交准备文档 +- 在对外分享文档之前移除编辑历史痕迹 + +## 提示 + +- 在清除之前,请先使用查看元数据工具,确切了解您的 PDF 包含哪些元数据。 +- 如果您需要同时移除元数据以及 JavaScript、注释和嵌入文件,请使用清理 PDF 进行更彻底的清理。 +- 元数据移除是永久性的。如果以后可能需要这些数据,请保留原始文件。 + +## 相关工具 + +- [清理 PDF](./sanitize-pdf):移除元数据以及脚本、附件等 +- [加密 PDF](./protect-pdf):用密码保护清理后的 PDF +- [压缩 PDF](./compress-pdf):移除元数据可略微减小文件大小,压缩可节省更多 diff --git a/docs/zh/tools/remove-restrictions.md b/docs/zh/tools/remove-restrictions.md new file mode 100644 index 00000000..1f27fe8a --- /dev/null +++ b/docs/zh/tools/remove-restrictions.md @@ -0,0 +1,45 @@ +--- +title: 移除限制 +description: 移除 PDF 文件的密码保护、打印限制、编辑锁定和复制限制。 +--- + +# 移除限制 + +PDF 可以带有两种密码:用户密码(打开文件时需要)和所有者密码(控制您可以对文件执行的操作)。此工具会同时移除这两种密码以及所有相关限制,包括打印、编辑、复制和注释锁定。 + +## 工作原理 + +1. 上传 PDF 文件。 +2. 如果 PDF 设置了所有者密码,请在**所有者密码**字段中输入。如果 PDF 只有使用限制而没有密码,请留空。 +3. 点击**移除限制**。 +4. 下载无限制的 PDF。 + +此工具使用 QPDF 的 `--decrypt` 和 `--remove-restrictions` 参数,生成干净且无限制的副本。 + +## 会被移除的内容 + +- 密码保护(用户密码和所有者密码) +- 打印限制 +- 编辑限制 +- 文本和图像复制限制 +- 注释和评论限制 +- PDF 中编码的所有其他安全限制 + +## 使用场景 + +- 解锁您自己拥有、但多年前设置的密码已记不清的 PDF +- 移除您有合法访问权限的文档的打印限制 +- 为便于做笔记,启用参考资料的复制粘贴 +- 为无法处理受限文档的无障碍工具准备 PDF + +## 提示 + +- 如果设置了所有者密码,您必须知道该密码。此工具不会破解或暴力枚举密码。 +- 如果您需要保持文件加密状态,只修改特定权限,请改用“更改权限”工具。 +- 输出文件没有任何加密,收到它的人都可以随意打开。 + +## 相关工具 + +- [解密 PDF](./unlock-pdf):已知用户密码时解锁 PDF +- [加密 PDF](./protect-pdf):以新设置重新应用加密 +- [更改权限](./change-permissions):有选择地修改允许的操作 diff --git a/docs/zh/tools/repair-pdf.md b/docs/zh/tools/repair-pdf.md new file mode 100644 index 00000000..6d5b5a42 --- /dev/null +++ b/docs/zh/tools/repair-pdf.md @@ -0,0 +1,56 @@ +--- +title: 修复 PDF +description: 使用 QPDF 的修复引擎从损坏或受损的 PDF 文件中恢复数据。支持批量处理。 +--- + +# 修复 PDF + +当 PDF 无法打开、显示乱码或在阅读器中触发错误时,此工具会尝试重建其内部结构。它使用 QPDF 的修复引擎,可以从多种类型的损坏中恢复数据,包括损坏的交叉引用表、被截断的数据流、无效的对象引用等。 + +## 工作原理 + +1. 上传一个或多个受损的 PDF 文件。 +2. 点击**修复 PDF**。 +3. 单个修复后的文件会直接下载。多个文件会生成 ZIP 压缩包。 + +该工具会使用 `--decrypt` 参数让每个文件通过 QPDF,这会强制 QPDF 读取并重写整个 PDF 结构,在此过程中修复可恢复的问题。 + +## 功能 + +- 一次操作批量修复多个 PDF +- 自动判断文件是否可恢复 +- 处理多个文件时按文件报告成功或失败 +- 使用 QPDF(WebAssembly),一个久经考验的 PDF 转换库 + +## 可以修复的问题 + +- 损坏或缺失的交叉引用表 +- 因下载不完整而被截断的文件结尾 +- 无效的对象编号和数据流长度 +- 有缺陷的 PDF 生成器造成的轻微结构不一致 +- 解密尝试失败留下的加密痕迹 + +## 无法修复的问题 + +- 大部分内容数据缺失的严重截断文件 +- 使用您不知道的密码加密的 PDF +- 实际上并非 PDF 的文件(扩展名错误) +- PDF 内部的图像损坏(结构会被修复,但不会重新生成像素数据) + +## 使用场景 + +- 从失败的邮件下载中恢复 PDF +- 打开由旧版或非标准 PDF 生成器生成的文件 +- 修复在某个阅读器中可用、在另一个阅读器中无法打开的 PDF +- 为长期存储准备受损的归档文档 + +## 提示 + +- 如果修复失败,请先尝试在浏览器中打开文件。浏览器有自己的恢复逻辑,可能会渲染出足够的内容以便重新保存。 +- 对于修复失败的加密 PDF,请先尝试解密 PDF,再修复解密后的输出。 + +## 相关工具 + +- [压缩 PDF](./compress-pdf):进一步整理修复后 PDF 的结构 +- [线性化 PDF](./linearize-pdf):优化修复后的文件以便网络传输 +- [扁平化 PDF](./flatten-pdf):扁平化可能已损坏的表单 diff --git a/docs/zh/tools/reverse-pages.md b/docs/zh/tools/reverse-pages.md new file mode 100644 index 00000000..dc21af6e --- /dev/null +++ b/docs/zh/tools/reverse-pages.md @@ -0,0 +1,40 @@ +--- +title: 反转页面 +description: 反转一个或多个 PDF 文件的页面顺序,使最后一页变为第一页。 +--- + +# 反转页面 + +反转 PDF 的页面顺序,使最后一页变为第一页,倒数第二页变为第二页,依此类推。支持一次批量处理多个文件。 + +## 工作原理 + +1. 上传一个或多个 PDF 文件。 +2. 点击处理按钮。 +3. 每个文件会被独立反转。如果上传了多个文件,输出为包含所有反转后 PDF 的 ZIP 压缩包。 +4. 单个文件会直接下载为反转后的 PDF。 + +## 功能 + +- 批量处理:一次操作反转多个 PDF +- 单个 PDF 输出单个文件,多个 PDF 输出 ZIP +- 处理前可通过每个文件的移除按钮移除文件 +- 保留所有页面内容和格式 + +## 使用场景 + +- 修复以相反顺序扫描的文档 +- 准备需要从后往前阅读的演示文稿 PDF +- 为需要倒序送纸的特定打印流程反转页面顺序 +- 纠正页面被意外反向装订的文档 + +## 提示 + +- 批量中的每个文件都是独立反转的,文件彼此之间的顺序不会改变。 +- 如需更精细的页面重新排序(而不仅仅是完全反转),请使用[复制与组织](./organize-pdf)。 + +## 相关工具 + +- [复制与组织](./organize-pdf) +- [旋转 PDF](./rotate-pdf) +- [PDF 多功能工具](./pdf-multi-tool) diff --git a/docs/zh/tools/rotate-custom.md b/docs/zh/tools/rotate-custom.md new file mode 100644 index 00000000..15bc9691 --- /dev/null +++ b/docs/zh/tools/rotate-custom.md @@ -0,0 +1,43 @@ +--- +title: 按自定义角度旋转 +description: 将 PDF 页面旋转任意角度,支持逐页角度输入和批量旋转控制。 +--- + +# 按自定义角度旋转 + +将 PDF 页面旋转任意角度,而不仅限于 90 度的倍数。每个页面都有自己的角度输入,您也可以使用批量控制一次性对所有页面应用同一角度。 + +## 工作原理 + +1. 上传 PDF 文件。每个页面都会渲染缩略图。 +2. 每个页面都有一个数字输入框,显示其当前旋转角度。 +3. 输入任意度数(正数或负数)来旋转特定页面,或使用每页的左/右按钮快速调整 90 度。 +4. 使用顶部的**批量角度**输入为所有页面设置统一的旋转角度。 +5. 点击处理按钮生成旋转后的 PDF。 + +## 功能 + +- 每页可自由输入度数(任意整数) +- 批量角度控制,可为每个页面设置相同的旋转 +- 缩略图中实时预览旋转效果 +- 每页快速旋转按钮,以 90 度为单位 +- 缩略图延迟加载,使大型文档也能流畅运行 + +## 使用场景 + +- 将略微倾斜的扫描件校正几度 +- 旋转页面以满足非标准的方向要求 +- 对混合内容文档中的单个页面应用精确旋转 +- 在初次批量旋转之后微调页面角度 + +## 提示 + +- 正值为顺时针旋转,负值为逆时针旋转。 +- 应用批量角度字段时会覆盖所有页面各自的角度。如有需要,请在批量操作之后再设置单个页面的调整。 +- 如需使用更简单的界面进行标准的 90/180/270 度旋转,请使用[旋转 PDF](./rotate-pdf)。 + +## 相关工具 + +- [旋转 PDF](./rotate-pdf) +- [PDF 多功能工具](./pdf-multi-tool) +- [复制与组织](./organize-pdf) diff --git a/docs/zh/tools/rotate-pdf.md b/docs/zh/tools/rotate-pdf.md new file mode 100644 index 00000000..236c0a9f --- /dev/null +++ b/docs/zh/tools/rotate-pdf.md @@ -0,0 +1,43 @@ +--- +title: 旋转 PDF +description: 通过可视化缩略图界面,以 90 度为单位旋转 PDF 中的单个页面或所有页面。 +--- + +# 旋转 PDF + +将 PDF 中的页面顺时针或逆时针旋转 90 度。该工具会显示每个页面的缩略图预览,让您可以逐页旋转,也可以对整个文档进行批量旋转。 + +## 工作原理 + +1. 上传 PDF 文件。每个页面的缩略图会以网格形式渲染。 +2. 使用每个页面缩略图下方的左/右旋转按钮旋转该页面。 +3. 使用顶部的批量旋转控件一次旋转所有页面。 +4. 缩略图预览会实时更新以显示旋转效果。 +5. 点击处理按钮保存旋转后的 PDF。 + +## 功能 + +- 每页以 90 度为单位旋转(向左或向右) +- 同时对所有页面进行批量旋转 +- 实时缩略图预览,带有旋转过渡动画 +- 缩略图延迟加载,使大型文档也能流畅运行 +- 保留原始页面内容和质量 + +## 使用场景 + +- 修复侧向或上下颠倒的扫描页面 +- 将横向页面旋转为纵向(或反之) +- 纠正混合方向的文档,其中部分页面以错误的角度扫描 +- 为特定的显示方向准备文档 + +## 提示 + +- 旋转是累积的。点击两次顺时针按钮会应用 180 度旋转。 +- 如需非 90 度的旋转(例如用 45 度修正略微倾斜的扫描件),请改用[按自定义角度旋转](./rotate-custom)。 +- 批量旋转控件会影响所有页面,而不仅仅是选定的页面。此工具没有选择机制,如需选择,请使用 [PDF 多功能工具](./pdf-multi-tool)。 + +## 相关工具 + +- [按自定义角度旋转](./rotate-custom) +- [PDF 多功能工具](./pdf-multi-tool) +- [复制与组织](./organize-pdf) diff --git a/docs/zh/tools/rtf-to-pdf.md b/docs/zh/tools/rtf-to-pdf.md new file mode 100644 index 00000000..09e9edbb --- /dev/null +++ b/docs/zh/tools/rtf-to-pdf.md @@ -0,0 +1,51 @@ +--- +title: RTF 转 PDF +description: 使用由 LibreOffice 驱动的引擎,在浏览器中将富文本格式(RTF)文件转换为 PDF。 +--- + +# RTF 转 PDF + +将富文本格式文档转换为 PDF。RTF 是一种跨平台的文档格式,几乎所有文字处理软件都支持。此工具使用浏览器内的 LibreOffice 引擎渲染 RTF 文件并保留其格式,粗体、斜体、表格和嵌入图片都会带到 PDF 中。 + +## 支持的格式 + +| 格式 | 扩展名 | MIME 类型 | +| :--- | :----- | :---------------------------- | +| RTF | `.rtf` | `text/rtf`, `application/rtf` | + +## 工作原理 + +1. 点击上传区域,或拖放一个或多个 RTF 文件。 +2. 查看文件列表。可根据需要添加或移除文件。 +3. 点击**转换为 PDF**。LibreOffice 引擎会在首次使用时初始化,然后处理每个文件。 +4. 单个文件会直接下载为 PDF。多个文件会以 `rtf-converted.zip` 的形式提供。 + +## 选项 + +此工具没有额外设置。转换会保留原始 RTF 格式。 + +## 输出 + +| 输入数量 | 输出 | +| :------- | :------------------------------------------------------ | +| 1 个文件 | 下载单个 PDF(例如 `letter.pdf`) | +| 2 个以上 | ZIP 压缩包(`rtf-converted.zip`),每个文件对应一个 PDF | + +## 使用场景 + +- 将旧版文字处理软件中的 RTF 文档转换为现代 PDF +- 将 RTF 邮件模板转为 PDF 预览 +- 处理法律或医疗软件系统输出的 RTF +- 将文档管理系统中的 RTF 文件批量转换为 PDF 进行归档 + +## 提示 + +- LibreOffice 引擎只加载一次并被缓存。会话中的第一次转换会多花几秒,之后会更快。 +- 带有嵌入 OLE 对象的 RTF 文件可能无法完美渲染所有对象。纯文本、图片和标准格式可以可靠转换。 +- 如果您的 RTF 文件由 Microsoft Word 创建,也可以直接使用 [Word 转 PDF](./word-to-pdf) 工具转换,它除了 DOC 和 DOCX 外也接受 RTF。 + +## 相关工具 + +- [Word 转 PDF](./word-to-pdf) +- [ODT 转 PDF](./odt-to-pdf) +- [文本转 PDF](./txt-to-pdf) diff --git a/docs/zh/tools/sanitize-pdf.md b/docs/zh/tools/sanitize-pdf.md new file mode 100644 index 00000000..1f97bb6e --- /dev/null +++ b/docs/zh/tools/sanitize-pdf.md @@ -0,0 +1,53 @@ +--- +title: 清理 PDF +description: 移除 PDF 中的隐藏内容和潜在危险内容,包括元数据、JavaScript、嵌入文件、注释和图层。 +--- + +# 清理 PDF + +PDF 所携带的内容远不止屏幕上看到的那些。隐藏的元数据、嵌入的 JavaScript、文件附件、表单数据和图层信息都可能泄露敏感数据或带来安全风险。清理会将这些全部清除,让您得到一份可以安全公开分享的干净文档。 + +## 工作原理 + +1. 上传 PDF 文件。 +2. 在清单中选择要移除的元素。 +3. 点击**清理 PDF**。 +4. 下载清理后的文件。 + +## 清理选项 + +所有选项默认启用。取消勾选您想保留的选项。 + +| 选项 | 移除的内容 | +| ------------------- | --------------------------------------------- | +| **扁平化表单** | 将交互式表单字段转换为静态内容 | +| **移除元数据** | 清除作者、标题、创建日期、软件信息和 XMP 数据 | +| **移除注释** | 删除评论、高亮、便签和标记 | +| **移除 JavaScript** | 清除打开时可能执行的嵌入脚本 | +| **移除嵌入文件** | 清除 PDF 中嵌入的文件附件 | +| **移除图层 (OCG)** | 将可选内容组扁平化为单一图层 | +| **移除链接** | 清除超链接和 URL 引用 | +| **移除结构树** | 移除用于无障碍标记的文档结构 | +| **移除 MarkInfo** | 清除标记内容信息 | +| **移除字体** | 移除嵌入的字体数据(请谨慎使用) | + +## 使用场景 + +- 通过清除内部元数据(作者姓名、软件版本、编辑历史)为公开发布准备 PDF +- 在打开来自不可信来源的 PDF 之前移除其中的 JavaScript +- 在发送给客户之前清理 PDF,避免对方看到嵌入的评论或表单字段名称 +- 在分享最终版本之前清除建筑图纸中的隐藏图层 +- 满足隐私法规下的数据最小化要求 + +## 提示 + +- 除非您确定 PDF 仍能正确渲染,否则请不要勾选“移除字体”。移除字体可能会使文本在某些阅读器中不可见。 +- 如果您只需要清除元数据,专用的移除元数据工具更快、更专注。 +- 清理是不可逆的。请保留您的原始文件。 + +## 相关工具 + +- [移除元数据](./remove-metadata):只清除元数据,不触及其他内容 +- [扁平化 PDF](./flatten-pdf):专门扁平化表单和注释 +- [加密 PDF](./protect-pdf):清理后添加密码保护 +- [栅格化 PDF](./rasterize-pdf):终极手段,转换为图像以消除所有隐藏内容 diff --git a/docs/zh/tools/scanner-effect.md b/docs/zh/tools/scanner-effect.md new file mode 100644 index 00000000..dc7a4a58 --- /dev/null +++ b/docs/zh/tools/scanner-effect.md @@ -0,0 +1,57 @@ +--- +title: 扫描效果 +description: 通过可调节的噪点、旋转、模糊和纸张老化效果,让您的 PDF 看起来像扫描文档。 +--- + +# 扫描效果 + +将干净的数字 PDF 变成看起来像是从平板扫描仪中出来的文档。该工具会应用可配置的噪点、轻微旋转、模糊、亮度偏移以及可选的泛黄效果,模拟实体扫描的瑕疵。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 编辑器打开后,会在设置面板旁显示第一页的实时预览。 +3. 使用滑块和开关调整扫描效果参数。 +4. 更改设置时,预览会实时更新。 +5. 点击**应用**处理所有页面并下载结果。 + +## 选项 + +- **色彩空间(灰度开关)**:将输出转换为灰度,呈现经典的黑白扫描效果。 +- **边框**:在页面边缘添加一圈淡淡的深色边框,模拟扫描仪的边框伪影。 +- **旋转**:应用轻微旋转(-5 到 +5 度),模拟纸张送入时没有对齐。 +- **旋转变化**:为旋转角度添加随机变化,使每页的倾斜略有不同。 +- **亮度**:整体调高或调低亮度。 +- **对比度**:调整对比度,模拟碳粉质量的差异。 +- **模糊**:应用高斯模糊,使文字边缘变得柔和,如同低质量的扫描。 +- **噪点**:添加随机像素噪点,模拟扫描仪传感器的颗粒感。数值越高,颗粒感越强。 +- **泛黄**:添加暖黄色调,模拟老化或再生纸张。 +- **分辨率**:设置输出 DPI。数值越低,画面越像素化,越像扫描件。 +- **重置**:将所有设置恢复为默认值。 + +## 功能 + +- 实时预览,随每个参数的调整而更新 +- 每页随机旋转变化,效果更逼真 +- 十个可独立调节的参数 +- 灰度模式,呈现真实的黑白扫描输出 +- 分辨率可控,从低 DPI 的传真质量到高 DPI 的归档质量 + +## 使用场景 + +- 让数字创建的文档看起来像是经过扫描和打印的 +- 模拟实体文档的老化,用于历史文档的复原 +- 针对劣化的扫描质量测试 OCR 软件 +- 制作与现有扫描档案视觉风格一致的文档 + +## 提示 + +- 从细微的数值开始。10-20 的噪点级别、0.5 度的轻微旋转和极少的模糊,就已能产生逼真的扫描效果。 +- 将灰度模式与轻微泛黄结合,可获得“复印件的复印件”效果。 +- 较低的分辨率设置(100-150 DPI)最能呈现真实的传真机效果。 + +## 相关工具 + +- [反转颜色](./invert-colors) +- [调整颜色](./adjust-colors) +- [背景颜色](./background-color) diff --git a/docs/zh/tools/sign-pdf.md b/docs/zh/tools/sign-pdf.md new file mode 100644 index 00000000..eeccf710 --- /dev/null +++ b/docs/zh/tools/sign-pdf.md @@ -0,0 +1,48 @@ +--- +title: 签署 PDF +description: 手绘、键入或上传签名,并通过集成的查看器将其放置在 PDF 页面上。 +--- + +# 签署 PDF + +为任意 PDF 文档添加您的签名。该工具嵌入了完整的 PDF 查看器和内置签名工具,您可以手绘签名、用签名字体键入姓名,或上传签名图片。可在任意页面放置并调整签名大小,然后保存已签署的文档。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 文档会在带有注释工具的集成 PDF 查看器中打开。 +3. 使用查看器的签名工具,通过手绘、键入或上传图片来创建签名。 +4. 点击页面上想要放置签名的位置,并调整其大小和位置。 +5. 可选:勾选**扁平化 PDF**,将签名永久嵌入文档。 +6. 点击**保存并下载已签署的 PDF** 获取已签署的文件。 + +## 选项 + +- **扁平化 PDF**:勾选后,签名会被永久嵌入页面内容。这可以防止他人移动或删除签名。未勾选时,签名仍是注释,可在兼容的查看器中编辑。 + +## 功能 + +- 三种创建签名的方式:手绘、键入文本或上传图片 +- 集成的 PDF 查看器,放置位置准确 +- 可在任意页面拖动定位并调整签名大小 +- 可选扁平化,永久嵌入签名 +- 支持在同一文档中添加多个签名 + +## 使用场景 + +- 在寄回合同、协议或审批表之前进行签署 +- 在税务文件、保险理赔或政府表格上添加您的签名 +- 在多页协议的各页上签署姓名缩写 +- 签署以 PDF 附件形式收到的保密协议或人事文件 + +## 提示 + +- 如果您要将已签署的 PDF 发送给不应能够移除或重新定位您签名的人,请启用扁平化。 +- 如需具有法律约束力、基于证书验证的数字签名,BentoPDF 还提供独立的 PDF 数字签名工具。 +- 上传背景透明的 PNG 签名图片可获得最干净的效果。 + +## 相关工具 + +- [PDF 编辑器](./edit-pdf) +- [添加印章](./add-stamps) +- [表单填写器](./form-filler) diff --git a/docs/zh/tools/split-pdf.md b/docs/zh/tools/split-pdf.md new file mode 100644 index 00000000..5042a48a --- /dev/null +++ b/docs/zh/tools/split-pdf.md @@ -0,0 +1,57 @@ +--- +title: 分割 PDF +description: 按页面范围、可视化选择、书签、偶数/奇数页或固定间隔将 PDF 拆分为较小的文件。 +--- + +# 分割 PDF + +使用六种拆分模式之一将 PDF 拆分为较小的文档。从简单的页面范围到基于书签的拆分,此工具可应对各种文档分割场景。 + +## 工作原理 + +1. 上传单个 PDF 文件。 +2. 从下拉菜单中选择拆分模式。 +3. 配置该模式的专属选项(页面范围、选择内容等)。 +4. 点击处理按钮。 +5. 根据模式和设置,结果会以单个 PDF 或 ZIP 压缩包的形式下载。 + +## 拆分模式 + +| 模式 | 说明 | +| --------------- | -------------------------------------------------------------------------------------------- | +| **范围** | 输入页面范围,如 `1-3, 5, 8-10`。多个范围会在 ZIP 中生成多个独立 PDF,单个范围生成一个 PDF。 | +| **可视化选择** | 浏览页面缩略图并点击选择所需页面。所选页面会被提取到新的 PDF 中。 | +| **偶数 / 奇数** | 仅提取偶数页或奇数页。 | +| **所有页面** | 将每一页拆分为独立的 PDF 文件,以 ZIP 下载。 | +| **书签** | 在书签边界处拆分。可选择书签级别来控制拆分位置。 | +| **每 N 页** | 按每 N 页一组拆分(例如每 5 页)。最后一组的页数可能较少。 | + +## 功能 + +- 六种不同的拆分模式,几乎涵盖所有使用场景 +- 可视化页面选择器,缩略图延迟加载 +- 支持按书签拆分,并可筛选级别 +- 范围和可视化模式可选 ZIP 输出 +- 支持混合语法的页面范围(`1-3, 5, 8-10`) +- 按 N 页拆分导致分组不均时给出警告 + +## 使用场景 + +- 从大型文档中提取特定章节或部分 +- 为双面打印流程分离奇数页和偶数页 +- 在书签边界处将整本书的 PDF 拆分为单独的章节文件 +- 从合同中单独取出特定页面(如签字页) +- 将汇编的报告拆分为按部分划分的文件以便分发 + +## 提示 + +- 以逗号分隔的多个页面范围(例如 `1-5, 10-15, 20-25`)会生成多个独立的 PDF(每个范围一个),并打包在 ZIP 中。 +- 书签拆分模式要求 PDF 确实包含书签。如果未找到书签,您将看到错误消息。 +- 在范围和可视化模式中,“下载为 ZIP”复选框可让您获得每页一个的独立 PDF,而不是合并的文件。 + +## 相关工具 + +- [合并 PDF](./merge-pdf) +- [提取页面](./extract-pages) +- [删除页面](./delete-pages) +- [PDF 多功能工具](./pdf-multi-tool) diff --git a/docs/zh/tools/svg-to-pdf.md b/docs/zh/tools/svg-to-pdf.md new file mode 100644 index 00000000..c30641b3 --- /dev/null +++ b/docs/zh/tools/svg-to-pdf.md @@ -0,0 +1,50 @@ +--- +title: SVG 转 PDF +description: 完全在浏览器中将 SVG 矢量图形转换为 PDF,并可控制质量。 +--- + +# SVG 转 PDF + +将可缩放矢量图形(SVG)文件转换为 PDF。该工具通过浏览器的渲染引擎对每个 SVG 进行栅格化,然后以其原始分辨率嵌入结果。适用于将矢量图标、图表和插图变成便携文档。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :----- | +| SVG | `.svg` | + +## 工作原理 + +1. 点击上传区域,或拖放一个或多个 SVG 文件。 +2. 查看并管理文件列表。 +3. 选择 **PDF 质量**级别。 +4. 点击**转换为 PDF**。结果会以 `from_svgs.pdf` 下载。 + +每个 SVG 会被作为文本读取,按其固有宽度和高度渲染到画布上(未指定尺寸时默认为 800x600),并导出为 PNG。然后使用 pdf-lib 将该 PNG 嵌入 PDF。透明区域会以白色背景填充。 + +## 选项 + +**PDF 质量**控制栅格化之后的压缩: + +- **高质量**:最接近原始渲染效果。 +- **中等质量**(默认):良好的平衡。 +- **低质量**:文件最小,会损失一些细节。 + +## 使用场景 + +- 将建筑或工程图表从 SVG 转换为可直接打印的 PDF +- 将图标集打包成设计系统的参考 PDF +- 将数据可视化(D3.js、图表库导出)转换为可用于报告的 PDF +- 创建基于 SVG 的信息图的可打印版本 + +## 提示 + +- 没有明确 `width` 和 `height` 属性的 SVG 文件会以 800x600 像素渲染。为获得最佳效果,请在转换前在 SVG 源码中设置尺寸。 +- 带有外部字体引用或链接图片的复杂 SVG 可能无法完美渲染。请将所有资源内联到 SVG 中,以获得可靠的输出。 +- 由于 SVG 会被栅格化,PDF 将包含位图图像而不是矢量路径。如需真正的矢量 PDF 输出,需要专用的矢量工具。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [PNG 转 PDF](./png-to-pdf) +- [BMP 转 PDF](./bmp-to-pdf) diff --git a/docs/zh/tools/table-of-contents.md b/docs/zh/tools/table-of-contents.md new file mode 100644 index 00000000..265c1104 --- /dev/null +++ b/docs/zh/tools/table-of-contents.md @@ -0,0 +1,49 @@ +--- +title: 目录 +description: 根据 PDF 现有的书签生成格式化的目录页。 +--- + +# 目录 + +此工具会读取 PDF 中的书签(大纲),并生成一页格式化的目录,将其添加到文档开头。如果您的 PDF 已有书签但缺少可见的目录页,此工具会自动为您创建一个。 + +## 工作原理 + +1. 上传包含书签的 PDF。 +2. 自定义目录标题、字号和字体。 +3. 可选:勾选**为目录页添加书签**,将目录本身加入书签树。 +4. 点击**生成目录**处理文件。 +5. 更新后的 PDF 会自动下载,目录页已插入到开头。 + +## 选项 + +- **目录标题**:显示在生成页面顶部的标题。默认为“目录”。 +- **字号**:可选 10pt 到 72pt。默认为 12pt。 +- **字体**:可选 Times Roman、Helvetica 或 Courier 的变体(常规、粗体、斜体、粗斜体)。默认为 Helvetica。 +- **为目录页添加书签**:勾选后,会在 PDF 的大纲树中为目录页本身添加一个书签条目。 + +## 功能 + +- 读取 PDF 中完整的书签层级 +- 生成格式清晰、带有页码引用的目录页 +- 支持带缩进的嵌套书签级别 +- 可选 12 种内置 PDF 字体 +- 可选为目录页添加指向自身的书签 + +## 使用场景 + +- 为只有数字书签的电子书或报告添加可打印的目录 +- 合并多个 PDF 后,为合并文档创建目录 +- 为篇幅较长的技术手册生成参考页 +- 为需要可见目录的印刷准备文档 + +## 提示 + +- 如果您的 PDF 没有书签,请先使用[编辑书签](./bookmark)工具创建,然后再回到这里生成目录。 +- 对于大型文档,使用 14pt 或 16pt 等较大的字号可提高可读性。 + +## 相关工具 + +- [编辑书签](./bookmark) +- [页码](./page-numbers) +- [页眉和页脚](./header-footer) diff --git a/docs/zh/tools/text-color.md b/docs/zh/tools/text-color.md new file mode 100644 index 00000000..943ddb5c --- /dev/null +++ b/docs/zh/tools/text-color.md @@ -0,0 +1,45 @@ +--- +title: 更改文本颜色 +description: 将 PDF 中所有文本的颜色更改为您选择的任意颜色。 +--- + +# 更改文本颜色 + +替换整个 PDF 中文本的颜色。该工具会识别每页上的文本区域,并将其重新着色为您选择的颜色,同时保留文档版面和非文本内容。 + +## 工作原理 + +1. 上传您的 PDF 文件。 +2. 使用颜色选择器选取新的文本颜色。默认为蓝色(#0000FF)。 +3. 点击**更改文本颜色**开始处理。 +4. 重新着色后的 PDF 会自动下载。进度指示器会显示正在处理的页面。 + +## 选项 + +- **新文本颜色**:颜色选择器,用于选择文档中所有文本的替换颜色。 + +## 功能 + +- 对文档中每一页的文本重新着色 +- 逐页处理并提供进度反馈 +- 颜色选择器完整支持十六进制颜色 +- 保留页面版面和非文本元素 + +## 使用场景 + +- 将黑色文本改为深蓝色,使文档外观更柔和、更现代 +- 在分发文档之前,将文本重新着色以符合品牌规范 +- 为满足无障碍合规要求,将文本转换为特定颜色 +- 让文本在新应用的背景颜色上清晰可见 + +## 提示 + +- 此工具会以 2 倍比例渲染页面以保证质量,然后重建 PDF。输出是基于图像的,因此文本将不再可选择或可搜索。 +- 如果文档需要保留可选择的文本,请考虑改用 [PDF 编辑器](./edit-pdf) 直接编辑 PDF。 +- 由于每一页都是单独渲染的,处理时间会随页数增加。 + +## 相关工具 + +- [背景颜色](./background-color) +- [反转颜色](./invert-colors) +- [调整颜色](./adjust-colors) diff --git a/docs/zh/tools/tiff-to-pdf.md b/docs/zh/tools/tiff-to-pdf.md new file mode 100644 index 00000000..f9af631b --- /dev/null +++ b/docs/zh/tools/tiff-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: TIFF 转 PDF +description: 在浏览器中将单页和多页 TIFF 图像转换为 PDF 格式,完整支持多页。 +--- + +# TIFF 转 PDF + +将 TIFF 文件转换为 PDF,包括多页 TIFF。TIFF 文件中的每一页(即“IFD”)都会成为输出 PDF 中的单独一页。这对于通常以多页 TIFF 存储的扫描文档、传真和医学图像尤其有用。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :-------------- | +| TIFF | `.tiff`, `.tif` | + +## 工作原理 + +1. 点击上传区域,或将 TIFF 文件拖放到此处。 +2. 查看文件列表,并根据需要进行管理。 +3. 点击**转换为 PDF**。结果会以 `from_tiff.pdf` 下载。 + +该工具使用 JavaScript TIFF 解码器解码每个 TIFF 文件,提取每一页的原始 RGBA 像素数据。每一页会被渲染到画布上,导出为 PNG,并嵌入 PDF。页面尺寸与原始 TIFF 页面一致。 + +## 选项 + +此工具不提供额外的质量设置。图像以其原始分辨率嵌入。 + +## 使用场景 + +- 将多页传真文档(TIFF-F)转换为更便于携带的 PDF 格式 +- 将以 TIFF 存储的扫描文档档案转换为可搜索的 PDF(之后配合 OCR 工具使用) +- 处理使用 TIFF 的医学影像文件(病理切片、放射学导出文件) +- 将 GIS 或卫星影像 TIFF 文件转换为可分享的文档 + +## 提示 + +- 完整支持多页 TIFF。10 页的 TIFF 会生成 10 页的 PDF,无需先拆分 TIFF。 +- 非常大的 TIFF 文件(数百兆字节)可能需要更长的处理时间,因为整个文件必须在浏览器内存中解码。 +- 如果需要对生成的 PDF 进行 OCR,请在转换后使用 [OCR PDF](./ocr-pdf) 工具处理。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [BMP 转 PDF](./bmp-to-pdf) +- [JPG 转 PDF](./jpg-to-pdf) diff --git a/docs/zh/tools/txt-to-pdf.md b/docs/zh/tools/txt-to-pdf.md new file mode 100644 index 00000000..b4caadeb --- /dev/null +++ b/docs/zh/tools/txt-to-pdf.md @@ -0,0 +1,54 @@ +--- +title: 文本转 PDF +description: 将纯文本文件或键入的文本转换为 PDF,可自定义字体、颜色和页面尺寸。 +--- + +# 文本转 PDF + +将纯文本转换为格式化的 PDF。您可以上传 `.txt` 文件,也可以直接在内置文本编辑器中输入。该工具支持多种字体、自定义文本颜色和各种页面尺寸,从 A0 到 A10,以及 US Letter、Legal 和 Tabloid。 + +## 支持的格式 + +| 输入 | 扩展名 | +| :----------- | :------------------- | +| 纯文本文件 | `.txt` | +| 直接输入文本 | 在编辑器中键入或粘贴 | + +## 工作原理 + +1. 使用顶部的开关选择输入模式:**上传文件**或**键入文本**。 +2. 如果选择上传,请拖放或点击选择一个或多个 `.txt` 文件。如果选择键入,请直接在文本框中输入文本。 +3. 配置格式选项:字体、字号、文本颜色和页面尺寸。 +4. 点击**创建 PDF**。输出会以 `text_to_pdf.pdf` 下载。 + +上传多个文件时,它们的内容会被拼接在一起,中间以空行分隔。 + +## 选项 + +| 选项 | 取值 | 默认值 | +| :----------- | :---------------------------------------------------------------------------- | :-------------- | +| **字体** | Helvetica(无衬线)、Tiro(衬线)、Courier(等宽)、Times(衬线) | Helvetica | +| **字号** | 6 至 72 pt | 12 | +| **文本颜色** | 通过颜色选择器选择任意颜色 | 黑色(#000000) | +| **页面尺寸** | ISO A0 至 A10、B0 至 B10、C0 至 C10、US Letter、Legal、Tabloid、Ledger、11x17 | A4 | + +系统会自动检测从右到左(RTL)的语言(阿拉伯语、希伯来语、波斯语、乌尔都语)。发现 RTL 文本时,文本方向和对齐方式会相应切换。 + +## 使用场景 + +- 使用 Courier 字体将代码片段或日志文件转换为可打印的 PDF +- 用当场键入的会议记录快速创建 PDF +- 以特定的字体和页面尺寸排版纯文本稿件以供提交 +- 制作 README 或更新日志的 PDF 版本,用于离线分发 + +## 提示 + +- 想快速转换剪贴板内容而不先将其保存为文件时,请使用**键入文本**模式。 +- Courier(等宽)是代码、日志或任何需要列对齐的内容的最佳字体选择。 +- 页边距固定为四周各 72 点(1 英寸)。 + +## 相关工具 + +- [Markdown 转 PDF](./markdown-to-pdf) +- [CSV 转 PDF](./csv-to-pdf) +- [Word 转 PDF](./word-to-pdf) diff --git a/docs/zh/tools/unlock-pdf.md b/docs/zh/tools/unlock-pdf.md new file mode 100644 index 00000000..aed26d59 --- /dev/null +++ b/docs/zh/tools/unlock-pdf.md @@ -0,0 +1,46 @@ +--- +title: 解锁 PDF +description: 移除加密 PDF 的密码保护。支持使用同一密码批量解密多个文件。 +--- + +# 解锁 PDF + +如果您知道加密 PDF 的密码,此工具可以完全移除加密,生成任何人无需凭据即可打开的解锁副本。当多个 PDF 使用同一密码时,支持批量解密。 + +## 工作原理 + +1. 上传一个或多个加密的 PDF 文件。 +2. 输入用于保护这些文件的**密码**。 +3. 点击**解密 PDF**。 +4. 单个文件会直接下载。多个文件会生成包含所有已解锁 PDF 的 ZIP 压缩包。 + +## 功能特点 + +- 支持单文件和批量解密 +- 同时支持用户密码和所有者密码 +- 输出完全未加密,不残留任何限制 +- 对密码错误或文件损坏给出清晰的错误提示 +- 批量模式下按文件记录成功/失败状态 + +## 与移除限制的区别 + +**解密 PDF** 需要密码,并会移除所有加密。**移除限制**针对使用限制(打印、复制、编辑),如果只设置了所有者密码,可能不需要密码。当 PDF 没有密码就完全无法打开时,请使用解密。 + +## 使用场景 + +- 当不再需要密码时,永久解锁您之前加密的 PDF +- 移除一批归档文档的加密,方便长期访问 +- 为不支持加密文件的文档管理系统准备受密码保护的 PDF +- 在与其他文档合并之前解锁 PDF(许多合并工具无法处理加密的输入) + +## 提示 + +- 密码字段适用于所有上传的文件。如果您的 PDF 密码各不相同,请分批处理。 +- 如果出现“密码错误”提示,请检查是否有多余的空格或是否开启了大写锁定。 +- 解密后,输出文件没有任何安全保护。如果需要设置新密码,请使用加密 PDF 重新加密。 + +## 相关工具 + +- [加密 PDF](./protect-pdf):使用新密码重新加密 +- [移除限制](./remove-restrictions):无需完全解密即可移除使用限制 +- [更改权限](./change-permissions):修改加密 PDF 的特定权限 diff --git a/docs/zh/tools/validate-signature-pdf.md b/docs/zh/tools/validate-signature-pdf.md new file mode 100644 index 00000000..dc184f63 --- /dev/null +++ b/docs/zh/tools/validate-signature-pdf.md @@ -0,0 +1,99 @@ +--- +title: 验证签名 +description: 验证 PDF 文件中的数字签名。检查证书有效性、签名者身份、文档完整性和信任链状态。 +--- + +# 验证签名 + +上传已签名的 PDF,此工具会提取每个数字签名,识别签名者,检查证书有效性,并报告文档在签名后是否被修改。您还可以提供受信任的证书来验证签名链。 + +## 工作原理 + +1. 上传已签名的 PDF 文件。验证会自动开始。 +2. 工具会显示摘要:找到的签名数量,以及其中有效的数量。 +3. 每个签名都有一张详细卡片,显示签名者姓名、颁发者、日期和状态。 +4. 可选择上传**受信任的证书**(.pem、.crt、.cer、.der),以针对特定信任锚验证签名。系统会自动重新验证。 + +## 检查内容 + +### 签名解析 + +工具会从 PDF 中提取 PKCS#7 签名对象,解码 ASN.1 结构,并取出签名者的 X.509 证书以及签名中嵌入的所有证书链。 + +### 证书有效性 + +- **有效期**:证书当前是否在有效日期范围内? +- **自签名检测**:证书是否是自己的颁发者? +- **信任链**:提供受信任的证书后,签名者的证书是否能链接到该证书? + +### 密码学验证 + +- 工具会重建签名 `/ByteRange` 所覆盖的字节,使用签名者声明的算法对其进行哈希,并将结果与签名内的 `messageDigest` 属性进行比较。 +- 然后将已签名的属性重新序列化为 DER SET,并使用签名者证书的公钥验证签名。 +- 只有以上全部通过,签名才会被报告为有效。如果 PDF 字节在签名后被修改,或嵌入的签名与签名者的密钥不匹配,状态会显示“无效,密码学验证失败”并给出具体原因。 + +#### 支持的签名算法 + +| 算法 | 验证路径 | +| ----------------------- | ----------------------------------------------------------------------------- | +| RSA (PKCS#1 v1.5) | node-forge `publicKey.verify`,并以 Web Crypto 作为后备 | +| RSA-PSS (RSASSA-PSS) | Web Crypto `verify({name: 'RSA-PSS', saltLength})` | +| ECDSA P-256/P-384/P-521 | 在 DER → IEEE P1363 签名转换后使用 Web Crypto `verify({name: 'ECDSA', hash})` | + +如果签名使用的算法不在此列表中(例如 Ed25519、SM2,或使用不常见摘要 OID 的 RSA),卡片会以黄色显示“未验证,不支持的签名算法”,并附上具体的 OID 或原因。这是有意设计的三态区分: + +- **有效**:签名已通过签名者公钥的密码学验证。 +- **无效**:验证已运行并得出否定结果(字节被更改、密钥不匹配)。 +- **未验证**:工具无法对该算法运行验证。证书元数据仍会显示,但您应将该签名视为“未知”,并使用 Adobe Acrobat 或 `openssl cms -verify` 进行验证。 + +### 不安全的摘要算法 + +- 使用 **MD5 或 SHA-1** 的签名会被判定为无效,并标记为“不安全的摘要”状态。这两种算法都已有公开的碰撞攻击,因此基于 SHA-1 或 MD5 哈希的签名无法保证完整性。 +- SHA-224、SHA-256、SHA-384 和 SHA-512 均被接受。 + +### 文档覆盖范围 + +- **完全覆盖**:签名覆盖整个 PDF 文件,意味着签名后没有任何字节被添加或更改。 +- **部分覆盖**:签名只覆盖文件的一部分。这可能表示签名后有过修改(不一定是恶意的,增量保存也会产生部分覆盖)。 + +## 签名详情 + +每张签名卡片显示: + +- **签名者**:签名者证书中的通用名称、组织和电子邮件 +- **颁发者**:为签名者证书签发的证书颁发机构 +- **签名时间**:签名中嵌入的时间戳 +- **有效期起 / 有效期至**:证书的有效期 +- **原因**:签署文档的原因(如有提供) +- **地点**:签署地点(如有提供) +- **覆盖状态**:完全或部分 +- **信任徽章**:受信任或不在信任链中(仅在提供自定义证书时显示) + +### 技术详情 + +展开技术详情部分可查看: + +- 签名者证书的序列号 +- 摘要算法(SHA-256、SHA-512 等) +- 签名算法(RSA with SHA-256、ECDSA with SHA-256 等) +- 无效签名的错误信息 + +## 使用场景 + +- 在会签之前验证已数字签名的合同 +- 审计已签名的文档,确认其未被篡改 +- 检查证书在文档签署之后是否已过期 +- 使用贵组织的根证书验证签名 +- 检查政府或法律文件的签名详情 + +## 提示 + +- 自签名证书并不意味着签名无效,只是说明无法通过受信任的第三方验证签名者的身份。这在内部文档中很常见。 +- 部分覆盖并不总是意味着被篡改。许多 PDF 工作流会添加增量更新(例如第二个签名),从而产生部分覆盖。 +- 将贵组织的根证书或中间证书作为受信任的证书上传,即可获得信任链验证。 + +## 相关工具 + +- [PDF 数字签名](./digital-sign-pdf):使用您自己的证书签署 PDF +- [扁平化 PDF](./flatten-pdf):签名前先扁平化 PDF,以防止签名后的修改 +- [移除元数据](./remove-metadata):在应用签名之前清理 PDF diff --git a/docs/zh/tools/view-metadata.md b/docs/zh/tools/view-metadata.md new file mode 100644 index 00000000..cb405bb6 --- /dev/null +++ b/docs/zh/tools/view-metadata.md @@ -0,0 +1,51 @@ +--- +title: 查看元数据 +description: 检查 PDF 的所有元数据属性,包括文档信息、XMP 数据和结构详情。 +--- + +# 查看元数据 + +查看嵌入在 PDF 文件中的隐藏属性。该工具会以易读的格式显示文档信息(标题、作者、日期)、XMP 元数据、页面尺寸和其他结构数据。 + +## 工作原理 + +1. 上传 PDF 文件。 +2. 工具会立即解析文件,并分区显示所有可用的元数据。 +3. 查看文档信息字典、XMP 元数据树和结构属性。 +4. 无需处理步骤:文件加载后即会显示元数据。 + +## 功能特点 + +- 显示标准文档信息字段:标题、作者、主题、关键词、创建者、生成器 +- 以易读格式显示创建和修改日期 +- 解析并呈现包含嵌套命名空间的完整 XMP 元数据树 +- 将 PDF 日期格式(`D:20240101120000Z`)转换为易读的日期 +- 按可折叠分区组织,便于浏览 + +## 元数据分区 + +| 分区 | 内容 | +| -------------- | -------------------------------------------------------------------- | +| **文档信息** | 标题、作者、主题、关键词、创建者、生成器、创建日期、修改日期 | +| **XMP 元数据** | 基于 XML 的完整元数据树,包含 Dublin Core、XAP、PDF 和自定义命名空间 | +| **文档属性** | 页数、PDF 版本、文件大小、加密状态 | + +## 使用场景 + +- 查看 PDF 的作者以及最后修改时间 +- 在发布文档之前确认元数据已正确设置 +- 通过检查嵌入了哪些个人信息来审计 PDF 的隐私 +- 通过生成器字段调查创建或修改 PDF 所用的软件 +- 查看 XMP 元数据以满足数字资产管理的合规要求 + +## 提示 + +- 以 `D:` 开头的 PDF 日期字符串会自动转换为您本地时区的格式。 +- 如果元数据字段为空,说明 PDF 的创建者没有设置它们。并非所有 PDF 都包含丰富的元数据。 +- 检查之后如需修改元数据,请使用[编辑元数据](./edit-metadata)。如需完全清除,请使用移除元数据。 + +## 相关工具 + +- [编辑元数据](./edit-metadata) +- [PDF 图层 (OCG)](./pdf-layers) +- [比较 PDF](./compare-pdfs) diff --git a/docs/zh/tools/vsd-to-pdf.md b/docs/zh/tools/vsd-to-pdf.md new file mode 100644 index 00000000..77188f57 --- /dev/null +++ b/docs/zh/tools/vsd-to-pdf.md @@ -0,0 +1,45 @@ +--- +title: VSD 转 PDF +description: 在浏览器中将 Microsoft Visio (VSD/VSDX) 图表转换为 PDF。免费、私密,无需 Visio。 +--- + +# VSD 转 PDF + +无需安装 Visio,即可将 Microsoft Visio 图表转换为 PDF。VSD 和 VSDX 文件包含流程图、组织结构图、网络图和平面图,大多数人无法打开。此工具会将它们渲染为简洁的 PDF,可在任何设备上查看。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :----------- | :------ | :----------------------------------- | +| Visio 二进制 | `.vsd` | 旧版 Visio 格式(Visio 2003 及更早) | +| Visio XML | `.vsdx` | 现代 Visio 格式(Visio 2013+) | + +## 工作原理 + +1. 点击上传区域,或拖放您的 VSD 或 VSDX 文件。两种格式可以在同一批次中混用。 +2. 查看文件列表。使用垃圾桶图标移除不需要的条目,或使用**添加更多文件**添加更多图表。 +3. 点击**转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载,并将每个图表渲染为 PDF,保留形状、连接线、标签和页面布局。 +4. 单个图表会直接下载为 PDF。多个文件会生成名为 `vsd-to-pdf.zip` 的 ZIP 压缩包。 + +## 选项 + +无需任何配置。转换器会遵循 Visio 文档原有的页面大小和方向。 + +## 使用场景 + +- 在没有 Visio 许可证时查看同事发来的 Visio 图表 +- 将网络图或架构图以 PDF 形式加入项目文档 +- 打印组织结构图或流程图,作为会议资料 +- 将旧版 Visio 的 VSD 文件归档为面向未来的格式 + +## 提示 + +- 多页 Visio 文档会生成多页 PDF,每个 Visio 页面对应一个 PDF 页面。 +- VSDX 文件(基于 XML 的现代格式)的转换保真度通常高于较旧的 VSD 二进制文件。 +- LibreOffice 引擎每个会话只加载一次。首次转换需要稍等片刻,之后的文件会更快。 + +## 相关工具 + +- [ODG 转 PDF](./odg-to-pdf) +- [PUB 转 PDF](./pub-to-pdf) +- [PSD 转 PDF](./psd-to-pdf) diff --git a/docs/zh/tools/webp-to-pdf.md b/docs/zh/tools/webp-to-pdf.md new file mode 100644 index 00000000..87dd6ec1 --- /dev/null +++ b/docs/zh/tools/webp-to-pdf.md @@ -0,0 +1,49 @@ +--- +title: WebP 转 PDF +description: 直接在浏览器中将 WebP 图片转换为 PDF,并可调整压缩质量。 +--- + +# WebP 转 PDF + +将 Google 的 WebP 图片格式转换为 PDF。当您从网上下载了 WebP 格式的图片,并需要将其转为更通用的格式用于打印或分享时,这特别有用。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :--- | :------ | +| WebP | `.webp` | + +## 工作原理 + +1. 点击上传区域,或拖放您的 WebP 文件。 +2. 查看文件列表,移除不需要的文件。 +3. 选择 **PDF 质量**级别。 +4. 点击**转换为 PDF**。输出文件将以 `from_webps.pdf` 为名下载。 + +在内部,每张 WebP 图片都会通过浏览器的 canvas API 解码,然后使用 pdf-lib 嵌入 PDF。这意味着转换可在任何支持 WebP 解码的浏览器上运行(所有现代浏览器都支持)。 + +## 选项 + +**PDF 质量**控制嵌入图片时的压缩: + +- **高质量**:保留最多细节。 +- **中等质量**(默认):均衡的输出。 +- **低质量**:文件最小。 + +## 使用场景 + +- 将从网上下载并保存为 WebP 的图片转换为可打印的 PDF +- 将 Chrome 或 Edge 中的 WebP 截图整理进文档 +- 用默认导出 WebP 的设计工具所导出的图片创建 PDF 作品集 +- 将 WebP 图片归档为更通用、更易读取的格式 + +## 提示 + +- WebP 在嵌入 PDF 之前会在内部解码为 PNG,因此无损 WebP 图片在高质量设置下可保持其画质。 +- 如果您同时有 WebP 和其他图片格式,请改用[图片转 PDF](./image-to-pdf)工具,它可以一次性接受所有格式。 + +## 相关工具 + +- [图片转 PDF](./image-to-pdf) +- [PNG 转 PDF](./png-to-pdf) +- [JPG 转 PDF](./jpg-to-pdf) diff --git a/docs/zh/tools/word-to-pdf.md b/docs/zh/tools/word-to-pdf.md new file mode 100644 index 00000000..6afe3a09 --- /dev/null +++ b/docs/zh/tools/word-to-pdf.md @@ -0,0 +1,56 @@ +--- +title: Word 转 PDF +description: 在浏览器中将 Word 文档(DOC、DOCX)、ODT 和 RTF 文件转换为 PDF,并完整保留格式。 +--- + +# Word 转 PDF + +将 Microsoft Word 文档及兼容格式转换为 PDF。该工具使用基于浏览器的 LibreOffice 引擎,可处理 DOC、DOCX、ODT 和 RTF 文件,并在输出中保留格式、表格、图片、页眉、页脚和样式。 + +## 支持的格式 + +| 格式 | 扩展名 | +| :---------------- | :------ | +| Word(现代) | `.docx` | +| Word(旧版) | `.doc` | +| OpenDocument 文本 | `.odt` | +| 富文本格式 | `.rtf` | + +## 工作原理 + +1. 点击上传区域,或拖放您的 Word 文档。可以一次选择多个文件。 +2. 查看并管理文件列表。 +3. 点击**转换为 PDF**。LibreOffice 引擎会在首次使用时加载(进度指示器会显示初始化状态),然后依次转换每个文件。 +4. 单个文件会直接下载为 PDF。多个文件会打包为 `word-converted.zip`。 + +## 选项 + +此工具没有额外设置。LibreOffice 引擎使用其默认的 PDF 导出配置生成输出。 + +## 输出 + +| 输入数量 | 输出 | +| :------- | :------------------------------------------------------- | +| 1 个文件 | 下载单个 PDF(原文件名加 `.pdf` 扩展名) | +| 2 个以上 | ZIP 压缩包(`word-converted.zip`),每个文件对应一个 PDF | + +## 使用场景 + +- 在提交求职申请之前,将简历或求职信从 DOCX 转换为 PDF +- 批量将一组合同或方案转换为 PDF,交付给客户 +- 将旧版 `.doc` 文件转为现代 PDF,便于长期归档 +- 将 Google Docs 中协作的文档(导出为 DOCX)转换为 PDF +- 从自动生成文档所用的 Word 模板制作可直接打印的 PDF + +## 提示 + +- LibreOffice 引擎每个会话只下载一次并缓存。首次转换需要几秒钟的加载时间,之后的转换会快得多。 +- 复杂格式(宏、ActiveX 控件、高级 SmartArt)可能无法完美转换。标准文档元素,如文本、表格、图片、页眉和脚注,可以可靠转换。 +- 由于此工具也接受 ODT 和 RTF,您可以把它当作所有文字处理格式的一站式转换器。 + +## 相关工具 + +- [ODT 转 PDF](./odt-to-pdf) +- [RTF 转 PDF](./rtf-to-pdf) +- [Excel 转 PDF](./excel-to-pdf) +- [PowerPoint 转 PDF](./powerpoint-to-pdf) diff --git a/docs/zh/tools/wpd-to-pdf.md b/docs/zh/tools/wpd-to-pdf.md new file mode 100644 index 00000000..f7b92e23 --- /dev/null +++ b/docs/zh/tools/wpd-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPD 转 PDF +description: 使用 LibreOffice 在浏览器中将 WordPerfect (WPD) 文档转换为 PDF。免费且私密。 +--- + +# WPD 转 PDF + +将 Corel WordPerfect 文档转换为 PDF 文件。WPD 曾是律师事务所和政府机构中占主导地位的文字处理格式。如果您有旧的 WordPerfect 文件,而现代软件拒绝打开它们,此工具可以把它们变回标准 PDF。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :---------- | :----- | :-------------------------- | +| WordPerfect | `.wpd` | 所有主要的 WordPerfect 版本 | + +## 工作原理 + +1. 点击上传区域,或拖放您的 WPD 文件。可以一次选择多个文件。 +2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或使用**添加更多文件**添加更多文档。 +3. 点击**转换为 PDF**。工具会在浏览器中加载基于 LibreOffice 的转换引擎,解析 WPD 格式并输出 PDF。 +4. 单个文件会直接下载为 PDF。批量转换会生成名为 `wpd-to-pdf.zip` 的 ZIP 压缩包。 + +## 选项 + +无需任何配置。LibreOffice 引擎会自动处理 WPD 的格式、字体和布局。 + +## 使用场景 + +- 打开几十年前用 WordPerfect 写成的法律文件 +- 将归档的政府申报文件从 WPD 转换为现代格式 +- 将旧的 WordPerfect 文档库迁移为 PDF 以便长期存储 +- 与没有安装 Corel WordPerfect 的收件人分享 WPD 文件 + +## 提示 + +- LibreOffice 引擎在首次使用时加载,需要一点时间。同一会话中之后的转换会更快。 +- 复杂的 WPD 宏和显示代码不会保留,但视觉布局、文本内容和基本格式会带入 PDF。 + +## 相关工具 + +- [WPS 转 PDF](./wps-to-pdf) +- [ODG 转 PDF](./odg-to-pdf) diff --git a/docs/zh/tools/wps-to-pdf.md b/docs/zh/tools/wps-to-pdf.md new file mode 100644 index 00000000..8e33a3a7 --- /dev/null +++ b/docs/zh/tools/wps-to-pdf.md @@ -0,0 +1,42 @@ +--- +title: WPS 转 PDF +description: 在浏览器中将 Microsoft Works (WPS) 文档转换为 PDF。免费,无需注册,完全私密。 +--- + +# WPS 转 PDF + +将 Microsoft Works 文字处理文件转换为 PDF。Microsoft Works 在 20 世纪 90 年代末至 21 世纪初预装在大量家用电脑上,许多 WPS 文件仍保存在旧硬盘和邮件存档中。此工具可在浏览器中打开它们,并生成简洁的 PDF。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :-------------- | :----- | :----------------------------- | +| Microsoft Works | `.wps` | Microsoft Works 的文字处理文件 | + +## 工作原理 + +1. 点击上传区域,或拖放您的 WPS 文件。支持多个文件。 +2. 查看文件列表。使用垃圾桶图标移除单个文件,或点击**添加更多文件**扩充批次。 +3. 点击**转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载,并将每个 WPS 文档转换为 PDF。 +4. 单个文件会直接下载为 PDF。多个文件会打包为名为 `wps-to-pdf.zip` 的 ZIP 压缩包。 + +## 选项 + +无需额外设置。转换器会处理 WPS 文件中的文本、基本格式和嵌入的图片。 + +## 使用场景 + +- 恢复以 Microsoft Works 格式保存的旧学校或工作文档 +- 在没有安装 Microsoft Works 时打开 WPS 邮件附件 +- 转换一批 WPS 文件,以便迁移到现代文档系统 +- 打印当前文字处理软件无法打开的旧文档 + +## 提示 + +- 请勿将 Microsoft Works 的 `.wps` 文件与 WPS Office 文件混淆。此工具专用于较旧的 Microsoft Works 格式。 +- LibreOffice 引擎在首次使用时需要一点时间加载。加载完成后,同一会话中的后续转换会更快。 + +## 相关工具 + +- [WPD 转 PDF](./wpd-to-pdf) +- [PUB 转 PDF](./pub-to-pdf) diff --git a/docs/zh/tools/xml-to-pdf.md b/docs/zh/tools/xml-to-pdf.md new file mode 100644 index 00000000..6a47802f --- /dev/null +++ b/docs/zh/tools/xml-to-pdf.md @@ -0,0 +1,44 @@ +--- +title: XML 转 PDF +description: 在浏览器中将 XML 文件转换为结构化的 PDF 文档。免费、私密,无需服务器处理。 +--- + +# XML 转 PDF + +将 XML 数据文件转换为易读的结构化 PDF 文档。原始 XML 功能强大,但对人类来说很难阅读。此工具会解析 XML 树,识别重复的数据结构,并将其渲染为横向 A4 PDF 中格式化的表格和章节。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :--- | :----- | :---------------------- | +| XML | `.xml` | 任何格式良好的 XML 文档 | + +## 工作原理 + +1. 点击上传区域,或拖放您的 XML 文件。可以在同一批次中处理多个文件。 +2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或点击**添加更多文件**加入更多文件。 +3. 点击**转换为 PDF**。工具使用浏览器内置的 DOMParser 解析 XML 结构,分析数据层次,并使用 jsPDF 的 auto-table 格式将其渲染为 PDF。 +4. 单个文件会下载为 PDF。多个转换结果会打包为 `xml-to-pdf.zip`。 + +## 选项 + +无需手动配置。转换器会自动检测 XML 结构并选择合适的表格布局。输出使用横向 A4 方向,以容纳较宽的数据集。 + +## 使用场景 + +- 将数据库或 API 导出的 XML 数据转为可打印的报告 +- 从 XML 配置文件创建易读的摘要 +- 将基于 XML 的发票或交易日志转换为 PDF 以便留存记录 +- 让 XML 站点地图或 RSS 订阅源以文档形式易于阅读 + +## 提示 + +- XML 必须格式良好。如果解析器遇到语法错误,转换会失败,并给出指明问题的描述性错误信息。 +- 嵌套很深的 XML 结构会被展平为表格。为获得最佳效果,数据应包含子元素一致的重复同级元素。 +- 转换过程中会显示进度更新,展示每个阶段:读取、解析、分析和渲染。 + +## 相关工具 + +- [FB2 转 PDF](./fb2-to-pdf) +- [XPS 转 PDF](./xps-to-pdf) +- [电子邮件转 PDF](./email-to-pdf) diff --git a/docs/zh/tools/xps-to-pdf.md b/docs/zh/tools/xps-to-pdf.md new file mode 100644 index 00000000..152e787d --- /dev/null +++ b/docs/zh/tools/xps-to-pdf.md @@ -0,0 +1,43 @@ +--- +title: XPS 转 PDF +description: 在浏览器中将 XPS 和 OXPS 文档转换为 PDF 格式。无需上传,无需注册,完全私密。 +--- + +# XPS 转 PDF + +将 Microsoft XPS 和 OXPS 文档转换为标准 PDF 文件。XPS(XML Paper Specification)是微软对 PDF 的回应,但各平台对它的支持已日渐减少。此工具让这些文档重新变得人人可读。 + +## 支持的格式 + +| 格式 | 扩展名 | 说明 | +| :--- | :------ | :---------------------------- | +| XPS | `.xps` | 原始的 Microsoft XPS 格式 | +| OXPS | `.oxps` | Open XPS,ECMA-388 标准的变体 | + +## 工作原理 + +1. 点击上传区域,或拖放您的 XPS/OXPS 文件。可以一次选择多个文件。 +2. 查看文件列表。使用垃圾桶图标移除单个文件,或点击**添加更多文件**追加文档。 +3. 点击**转换为 PDF**。PyMuPDF 引擎会在您的浏览器中本地处理每个文档。 +4. 单个文件会直接下载为 PDF。多个文件会打包为名为 `xps-converted.zip` 的 ZIP 压缩包。 + +## 选项 + +此工具执行直接的格式转换,无需额外配置。输出会保留 XPS 源文件中的原始页面尺寸、矢量图形、字体和图片。 + +## 使用场景 + +- 打开从默认使用 XPS 打印驱动的旧 Windows 系统收到的 XPS 文件 +- 转换 Windows 10/11 中的 OXPS 文档,以便与 macOS 或 Linux 用户共享 +- 将旧的 XPS 文件归档为支持更广泛的格式 +- 让基于 XPS 的政府或企业文档可供外部收件人访问 + +## 提示 + +- `.xps` 和 `.oxps` 扩展名都会被自动处理,您可以在同一批次中混用。 +- 如果原始 XPS 文件由高分辨率打印驱动创建,生成的 PDF 会保持该质量。不会进行重新采样。 + +## 相关工具 + +- [Word 转 PDF](./word-to-pdf) +- [XML 转 PDF](./xml-to-pdf) diff --git a/nginx.conf b/nginx.conf index 2fc61166..76c55bd3 100644 --- a/nginx.conf +++ b/nginx.conf @@ -50,16 +50,19 @@ http { return 301 /$1; } - if ($request_uri ~ ^(/(?:ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/src/pages/([a-z0-9][a-z0-9-]*)\.html(\?.*)?$) { + if ($request_uri ~ ^(/(?:ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/src/pages/([a-z0-9][a-z0-9-]*)\.html(\?.*)?$) { return 301 $1/$2$3; } - if ($request_uri ~ ^(/(?:ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/change-text-color(?:\.html)?/?(\?.*)?$) { + if ($request_uri ~ ^(/(?:ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/change-text-color(?:\.html)?/?(\?.*)?$) { return 301 $1/text-color$2; } - if ($request_uri ~ ^/tools/$) { - return 301 /tools; + if ($request_uri ~ ^/tools/?(\?.*)?$) { + return 301 /$1; + } + if ($request_uri ~ ^(/(?:ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))/tools/?(\?.*)?$) { + return 301 $1$2; } if ($request_uri ~ ^/tools/([a-z0-9][a-z0-9-]+?)(?:\.html)?(\?.*)?$) { return 301 /$1$2; @@ -93,20 +96,20 @@ http { return 301 /docs/tools/protect-pdf$1; } - if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/index\.html(\?.*)?$) { + if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/index\.html(\?.*)?$) { return 301 $1/$2; } - if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/pdf-to-docx(?:\.html)?/?(\?.*)?$) { + if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/pdf-to-docx(?:\.html)?/?(\?.*)?$) { return 301 $1/pdf-to-word$2; } - if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/decrypt-pdf(?:\.html)?/?(\?.*)?$) { + if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/decrypt-pdf(?:\.html)?/?(\?.*)?$) { return 301 $1/unlock-pdf$2; } - if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/encrypt-pdf(?:\.html)?/?(\?.*)?$) { + if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/encrypt-pdf(?:\.html)?/?(\?.*)?$) { return 301 $1/protect-pdf$2; } - if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca))?/([a-z0-9][a-z0-9-]*)\.html(\?.*)?$) { + if ($request_uri ~ ^(/(?:en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa))?/([a-z0-9][a-z0-9-]*)\.html(\?.*)?$) { return 301 $1/$2$3; } @@ -118,7 +121,7 @@ http { return 404; } - location ~ ^/(en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca)(/.*)?$ { + location ~ ^/(en|ar|be|da|de|es|fr|id|it|ko|nl|pl|pt|ru|sk|sv|tr|vi|zh|zh-TW|uk|ja|ca|fa)(/.*)?$ { try_files $uri $uri.html $uri/index.html =404; expires 5m; } diff --git a/package.json b/package.json index c0ae3528..ded8b635 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "scripts": { "predev": "node scripts/generate-blog.mjs && node scripts/generate-static-tool-links.mjs", "dev": "vite", - "build": "node scripts/generate-blog.mjs && node scripts/generate-static-tool-links.mjs && tsc && vite build && node scripts/enhance-seo-pages.mjs && NODE_OPTIONS='--max-old-space-size=3072' node scripts/generate-i18n-pages.mjs && node scripts/generate-sitemap.mjs && node scripts/generate-security-headers.mjs && node scripts/seo-audit.mjs", + "build": "node scripts/generate-blog.mjs && node scripts/generate-static-tool-links.mjs && tsc && vite build && node scripts/enhance-seo-pages.mjs && NODE_OPTIONS='--max-old-space-size=3072' node scripts/generate-i18n-pages.mjs && node scripts/generate-sitemap.mjs && node scripts/generate-security-headers.mjs && node scripts/apply-indexing-policy.mjs && node scripts/recompress-html.mjs && node scripts/seo-audit.mjs", "seo-audit": "node scripts/seo-audit.mjs", - "build:with-docs": "npm run build && npm run docs:build && node scripts/include-docs-in-dist.js", + "build:with-docs": "npm run build && npm run docs:build && node scripts/include-docs-in-dist.js && node scripts/apply-indexing-policy.mjs && node scripts/recompress-html.mjs", "build:gzip": "COMPRESSION_MODE=g npm run build", "build:brotli": "COMPRESSION_MODE=b npm run build", "build:original": "COMPRESSION_MODE=o npm run build", diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 400af7d4..416ee59d 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -9,7 +9,8 @@ "openMainMenu": "فتح القائمة الرئيسية", "language": "اللغة", "searchLanguage": "البحث عن لغة…", - "noLanguagesFound": "لم يتم العثور على لغات" + "noLanguagesFound": "لم يتم العثور على لغات", + "breadcrumb": "مسار التنقل" }, "donation": { "message": "أعجبك BentoPDF؟ ساعدنا في إبقائه مجانيًا ومفتوح المصدر!", @@ -236,6 +237,10 @@ "aboutUs": "من نحن", "faqLink": "الأسئلة الشائعة", "contactUs": "اتصل بنا", + "tools": "الأدوات", + "pdfConverter": "محول PDF", + "pdfSecurity": "أمان PDF", + "mergeSplit": "دمج وتقسيم PDF", "legal": "قانوني", "termsAndConditions": "الشروط والأحكام", "privacyPolicy": "سياسة الخصوصية", diff --git a/public/locales/ar/tools.json b/public/locales/ar/tools.json index 367dd317..314887a2 100644 --- a/public/locales/ar/tools.json +++ b/public/locales/ar/tools.json @@ -27,7 +27,22 @@ "name": "دمج PDF", "subtitle": "دمج عدة ملفات PDF في ملف واحد. يحافظ على الإشارات المرجعية.", "retainPageLabels": "الاحتفاظ بتسميات الصفحات الأصلية لكل ملف", - "retainPageLabelsHint": "غير مفعّل (افتراضي): يستخدم ملف PDF المدمج ترقيمًا طبيعيًا من 1 إلى N. مفعّل: يتم الاحتفاظ بتسميات الصفحات الأصلية لكل ملف (قد ينتج عن ذلك تسميات مكررة)." + "retainPageLabelsHint": "غير مفعّل (افتراضي): يستخدم ملف PDF المدمج ترقيمًا طبيعيًا من 1 إلى N. مفعّل: يتم الاحتفاظ بتسميات الصفحات الأصلية لكل ملف (قد ينتج عن ذلك تسميات مكررة).", + "removeDuplicateFonts": "إزالة الخطوط المكررة", + "alert": { + "thumbnailError": "فشل عرض الصور المصغرة للصفحات", + "noSelection": "لم يتم تحديد أي ملفات أو صفحات للدمج.", + "mergeSuccess": "تم دمج ملفات PDF بنجاح!", + "mergeFailed": "فشل دمج ملفات PDF.", + "mergeError": "فشل دمج ملفات PDF. يرجى التأكد من أن جميع الملفات صالحة وغير محمية بكلمة مرور.", + "workerError": "حدث خطأ غير متوقع في عملية الدمج.", + "loadError": "فشل تحميل ملف PDF واحد أو أكثر" + }, + "loader": { + "renderingPreviews": "جارٍ عرض معاينات الصفحات...", + "merging": "جارٍ دمج ملفات PDF...", + "loadingDocuments": "جارٍ تحميل مستندات PDF..." + } }, "splitPdf": { "name": "تقسيم PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "إعادة (⇧⌘Z)", "tipFileDetails": "تفاصيل الملف", "tipEditExistingContent": "تحرير المحتوى الحالي", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "ما تتأثر به أداة التحرير — ضيّق النطاق في الصفحات المزدحمة", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "ما تتأثر به أداة التحرير: ضيّق النطاق في الصفحات المزدحمة", "tipClickThePageToAddATextBox": "انقر على الصفحة لإضافة مربع نص", "tipSpellCheckLanguage": "لغة التدقيق الإملائي", "tipFindAndReplace": "بحث واستبدال", @@ -503,7 +518,8 @@ "noFile": "لا يوجد ملف", "noFileExplanation": "يرجى تحميل ملف PDF أولاً.", "conversionSuccess": "تم تحويل PDF إلى TIFF بنجاح!", - "conversionError": "فشل تحويل PDF إلى TIFF. قد يكون الملف تالفًا." + "conversionError": "فشل تحويل PDF إلى TIFF. قد يكون الملف تالفًا.", + "conversionOutOfMemory": "نفدت ذاكرة المتصفح أثناء التحويل. جرّب قيمة DPI أقل، أو ألغِ تحديد خيار TIFF متعدد الصفحات لتحويل الصفحات واحدة تلو الأخرى." } }, "pdfToCbz": { @@ -990,8 +1006,7 @@ "subtitle": "استخراج النص من ملفات PDF وحفظه كنص عادي (.txt). يدعم عدة ملفات.", "noteLabel": "ملاحظة:", "noteText": "تعمل هذه الأداة فقط مع ملفات PDF التي تم إنشاؤها رقميًا. للمستندات الممسوحة ضوئيًا أو ملفات PDF القائمة على الصور، استخدم أداة OCR PDF بدلاً من ذلك.", - "convertButton": "استخراج النص", - "note": "تعمل هذه الأداة فقط مع ملفات PDF المنشأة رقميًا. للمستندات الممسوحة ضوئيًا أو ملفات PDF المبنية على الصور، استخدم أداة التعرف الضوئي." + "convertButton": "استخراج النص" }, "digitalSignPdf": { "name": "توقيع رقمي لـ PDF", @@ -1189,7 +1204,7 @@ "workerError": "خطأ في العامل: {{message}}", "alternateMergeWorkerError": "خطأ في عامل الدمج المتناوب: {{message}}", "noPdfFilesUploaded": "لم يتم تحميل ملفات PDF في عقدة إدخال PDF", - "failedToLoadFile": "فشل تحميل \"{{file}}\" — قد يكون الملف تالفًا", + "failedToLoadFile": "فشل تحميل \"{{file}}\"، قد يكون الملف تالفًا", "noImagesUploaded": "لم يتم تحميل صور في عقدة إدخال الصور", "noWordDocsUploaded": "لم يتم تحميل مستندات في عقدة إدخال Word", "noExcelUploaded": "لم يتم تحميل جداول بيانات في عقدة إدخال Excel", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "بالتأكيد! تتم جميع المعالجة في متصفحك. لا تغادر ملفاتك جهازك أبداً، مما يضمن خصوصية كاملة." }, "unlockPdf": { - "name": "فك تشفير PDF", + "name": "إلغاء قفل PDF", "subtitle": "فتح PDF بإزالة حماية كلمة المرور." }, "protectPdf": { - "name": "تشفير PDF", + "name": "حماية PDF", "subtitle": "قفل PDF بإضافة كلمة مرور." } } diff --git a/public/locales/ar/ui.json b/public/locales/ar/ui.json new file mode 100644 index 00000000..fded43a6 --- /dev/null +++ b/public/locales/ar/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(تم التصحيح)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} أخرى...", + "- Error parsing XMP XML. Displaying raw. -": "- خطأ في تحليل XMP XML. يتم عرض النص الخام. -", + "- No Info Dictionary data found -": "- لم يتم العثور على بيانات قاموس المعلومات -", + "- No XMP metadata found -": "- لم يتم العثور على بيانات XMP الوصفية -", + "- No interactive form fields found -": "- لم يتم العثور على حقول نموذج تفاعلية -", + "- No parseable XMP properties found -": "- لم يتم العثور على خصائص XMP قابلة للتحليل -", + "-- Select existing group --": "-- اختر مجموعة موجودة --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1° (حساسية عالية جدًا)", + "0.5° (Default)": "0.5° (افتراضي)", + "1.0° (Normal)": "1.0° (عادي)", + "100 (Fast)": "100 (سريع)", + "150 (Default)": "150 (افتراضي)", + "1x2 (Booklet)": "1x2 (كتيّب)", + "2.0° (Less Sensitive)": "2.0° (حساسية أقل)", + "200 (Better)": "200 (أفضل)", + "200 (Good)": "200 (جيد)", + "2x2 (4-up)": "2x2 (4 في الصفحة)", + "2x4 (8-up)": "2x4 (8 في الصفحة)", + "300 (Best Quality)": "300 (أفضل جودة)", + "300 (Print)": "300 (للطباعة)", + "4x4 (16-up)": "4x4 (16 في الصفحة)", + "600 (High Quality)": "600 (جودة عالية)", + "72 (Screen)": "72 (للشاشة)", + "90° Clockwise": "90° باتجاه عقارب الساعة", + "90° Counter-clockwise": "90° عكس اتجاه عقارب الساعة", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "يوجد حقل باسم \"{{fieldName}}\" بالفعل. يرجى تغيير اسم هذا الحقل إلى اسم فريد قبل التنزيل.", + "A new version of BentoPDF is available. Reload to update?": "يتوفر إصدار جديد من BentoPDF. هل تريد إعادة التحميل للتحديث؟", + "A single PDF file": "ملف PDF واحد", + "A template with this name already exists.": "يوجد قالب بهذا الاسم بالفعل.", + "ASCII characters (letters, numbers, symbols)": "أحرف ASCII (حروف وأرقام ورموز)", + "Action": "الإجراء", + "Add Blank Page": "إضافة صفحة فارغة", + "Add Bookmark": "إضافة إشارة مرجعية", + "Add Child Bookmark": "إضافة إشارة مرجعية فرعية", + "Add Child Layer": "إضافة طبقة فرعية", + "Add More Comics": "إضافة قصص مصورة أخرى", + "Add More Documents": "إضافة مستندات أخرى", + "Add More EPUB Files": "إضافة ملفات EPUB أخرى", + "Add More Email Files": "إضافة ملفات بريد إلكتروني أخرى", + "Add More FB2 Files": "إضافة ملفات FB2 أخرى", + "Add More Files": "إضافة ملفات أخرى", + "Add More Images": "إضافة صور أخرى", + "Add More JSON Files": "إضافة ملفات JSON أخرى", + "Add More MOBI Files": "إضافة ملفات MOBI أخرى", + "Add More Markdown Files": "إضافة ملفات Markdown أخرى", + "Add More ODG Files": "إضافة ملفات ODG أخرى", + "Add More PUB Files": "إضافة ملفات PUB أخرى", + "Add More Pages Files": "إضافة ملفات Pages أخرى", + "Add More Presentations": "إضافة عروض تقديمية أخرى", + "Add More SVG Files": "إضافة ملفات SVG أخرى", + "Add More Spreadsheets": "إضافة جداول بيانات أخرى", + "Add More Text Files": "إضافة ملفات نصية أخرى", + "Add More Visio Files": "إضافة ملفات Visio أخرى", + "Add More WPD Files": "إضافة ملفات WPD أخرى", + "Add More WPS Files": "إضافة ملفات WPS أخرى", + "Add More XML Files": "إضافة ملفات XML أخرى", + "Add More XPS Files": "إضافة ملفات XPS أخرى", + "Add a new layer to get started!": "أضف طبقة جديدة للبدء!", + "Add a text box": "إضافة مربع نص", + "Add an RFC 3161 document timestamp": "إضافة ختم زمني للمستند وفق RFC 3161", + "Add an image": "إضافة صورة", + "Add at least one node to run the workflow.": "أضف عقدة واحدة على الأقل لتشغيل سير العمل.", + "Add child": "إضافة عنصر فرعي", + "Add child layer": "إضافة طبقة فرعية", + "Add header and footer text": "إضافة نص الرأس والتذييل", + "Add page numbers": "إضافة أرقام الصفحات", + "Add searchable text layer via OCR": "إضافة طبقة نص قابلة للبحث عبر OCR", + "Add text watermark": "إضافة علامة مائية نصية", + "Add/Edit/Extract Attachments": "إضافة/تعديل/استخراج المرفقات", + "Added": "مضاف", + "Added \"{{afterText}}\"": "تمت إضافة \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "تمت إضافة صورة ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "تمت إضافة {{insertCount}} صفحة فارغة بنجاح!", + "Added {{insertCount}} blank pages successfully!": "تمت إضافة {{insertCount}} صفحات فارغة بنجاح!", + "Adding header & footer...": "جارٍ إضافة الرأس والتذييل...", + "Adding page numbers...": "جارٍ إضافة أرقام الصفحات...", + "Adding watermark...": "جارٍ إضافة العلامة المائية...", + "Adding {{insertCount}} blank page...": "جارٍ إضافة {{insertCount}} صفحة فارغة...", + "Adding {{insertCount}} blank pages...": "جارٍ إضافة {{insertCount}} صفحات فارغة...", + "Adding {{name}} ({{n}}/{{length}})...": "جارٍ إضافة {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "ضبط الألوان", + "Adjust brightness, contrast, and colors": "اضبط السطوع والتباين والألوان", + "Advanced": "متقدم", + "Advanced Feature Required": "ميزة متقدمة مطلوبة", + "Advanced Settings": "إعدادات متقدمة", + "After Page": "بعد الصفحة", + "After Page...": "بعد الصفحة...", + "Align Objects": "محاذاة العناصر", + "Alignment": "المحاذاة", + "All": "الكل", + "All files repaired successfully!": "تم إصلاح جميع الملفات بنجاح!", + "Alternate Merge": "دمج بالتناوب", + "Alternating and mixing pages...": "جارٍ تبديل الصفحات ودمجها...", + "Always resample to that resolution": "أعد أخذ العينات دائمًا إلى هذه الدقة", + "An error occurred during compression. Error: {{error}}": "حدث خطأ أثناء الضغط. الخطأ: {{error}}", + "An error occurred during conversion. Error: {{error}}": "حدث خطأ أثناء التحويل. الخطأ: {{error}}", + "An error occurred during conversion. Error: {{message}}": "حدث خطأ أثناء التحويل. الخطأ: {{message}}", + "An error occurred during cropping.": "حدث خطأ أثناء القص.", + "An error occurred during extraction. Error: {{error}}": "حدث خطأ أثناء الاستخراج. الخطأ: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "حدث خطأ أثناء التحويل إلى صور نقطية. الخطأ: {{error}}", + "An error occurred during sanitization: {{msg}}": "حدث خطأ أثناء التنقية: {{msg}}", + "An error occurred while combining pages.": "حدث خطأ أثناء دمج الصفحات.", + "An error occurred while creating the N-Up PDF.": "حدث خطأ أثناء إنشاء ملف PDF بتخطيط N-Up.", + "An error occurred while creating the booklet.": "حدث خطأ أثناء إنشاء الكتيّب.", + "An error occurred while dividing the PDF.": "حدث خطأ أثناء تقسيم ملف PDF.", + "An error occurred while mixing the PDFs.": "حدث خطأ أثناء دمج ملفات PDF بالتناوب.", + "An error occurred while standardizing pages.": "حدث خطأ أثناء توحيد الصفحات.", + "An error occurred while trying to remove metadata.": "حدث خطأ أثناء محاولة إزالة البيانات الوصفية.", + "An error occurred: {{error}}": "حدث خطأ: {{error}}", + "An error occurred: {{error}}.": "حدث خطأ: {{error}}.", + "An owner password is required when setting permissions": "كلمة مرور المالك مطلوبة عند تعيين الأذونات", + "An unexpected error occurred during the repair process.": "حدث خطأ غير متوقع أثناء عملية الإصلاح.", + "An unexpected error occurred.": "حدث خطأ غير متوقع.", + "Analyzing data structure...": "جارٍ تحليل بنية البيانات...", + "Analyzing full PDF metadata...": "جارٍ تحليل البيانات الوصفية الكاملة لملف PDF...", + "Analyzing signatures...": "جارٍ تحليل التوقيعات...", + "Angle": "الزاوية", + "Annotations removed successfully!": "تمت إزالة التعليقات التوضيحية بنجاح!", + "Any text, URL, or data": "أي نص أو رابط أو بيانات", + "Application": "التطبيق", + "Apply a digital signature to PDF": "تطبيق توقيع رقمي على ملف PDF", + "Apply and download": "تطبيق وتنزيل", + "Apply redactions?": "هل تريد تطبيق التنقيحات؟", + "Apply scanner simulation effect": "تطبيق تأثير محاكاة الماسح الضوئي", + "Applying Bates numbers...": "جارٍ تطبيق أرقام Bates...", + "Applying color adjustments...": "جارٍ تطبيق تعديلات الألوان...", + "Applying crop...": "جارٍ تطبيق القص...", + "Applying redactions...": "جارٍ تطبيق التنقيحات...", + "Applying rotations...": "جارٍ تطبيق التدويرات...", + "Applying scanner effect...": "جارٍ تطبيق تأثير الماسح الضوئي...", + "Applying timestamp...": "جارٍ تطبيق الختم الزمني...", + "Applying {{replace}}...": "جارٍ تطبيق {{replace}}...", + "Archive contains an oversized image entry.": "يحتوي الأرشيف على صورة كبيرة جدًا.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "يحتوي الأرشيف على صور كثيرة جدًا (الحد الأقصى {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "الأرشيف كبير جدًا بعد فك الضغط.", + "Are you sure you want to reset? All your work will be lost.": "هل أنت متأكد من أنك تريد إعادة التعيين؟ ستفقد كل عملك.", + "Area (Coordinates)": "المساحة (الإحداثيات)", + "Area ({{unit}}²)": "المساحة ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "يتم ربط Arial وTimes New Roman وCourier New بما يعادلها من الخطوط المضمّنة. يُطبَّق ذلك فقط عندما يكون آمنًا.", + "Arrange multiple pages per sheet": "ترتيب عدة صفحات في الورقة الواحدة", + "Arrange pages for booklet printing": "ترتيب الصفحات للطباعة على شكل كتيّب", + "Aspect Ratio": "نسبة العرض إلى الارتفاع", + "At least one PDF document is required for export.": "مطلوب مستند PDF واحد على الأقل للتصدير.", + "At least two valid PDFs are required.": "مطلوب ملفا PDF صالحان على الأقل.", + "Attaching files to PDF...": "جارٍ إرفاق الملفات بملف PDF...", + "Attachments updated successfully!": "تم تحديث المرفقات بنجاح!", + "Author": "المؤلف", + "Auto (Keep Original)": "تلقائي (الإبقاء على الأصل)", + "Back": "الوجه الخلفي", + "Back to Home": "العودة إلى الرئيسية", + "Background Color": "لون الخلفية", + "Background color changed successfully!": "تم تغيير لون الخلفية بنجاح!", + "Barcode": "باركود", + "Barcode Format": "صيغة الباركود", + "Barcode Value": "قيمة الباركود", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "تم تطبيق أرقام Bates بنجاح! ({{batesStart}} إلى {{n}})", + "Beginning": "البداية", + "Binarize": "تحويل إلى أبيض وأسود", + "Blank Position": "موضع الصفحة الفارغة", + "Blue": "أزرق", + "Blur": "تمويه", + "Bold": "غامق", + "Bold & Italic": "غامق ومائل", + "Booklet": "كتيّب", + "Booklet created with {{numSheets}} sheets!": "تم إنشاء الكتيّب بـ {{numSheets}} ورقة!", + "Bookmarks imported from JSON!": "تم استيراد الإشارات المرجعية من JSON!", + "Bookmarks page": "صفحة الإشارات المرجعية", + "Border": "الحدود", + "Border Color": "لون الحدود", + "Bottom": "أسفل", + "Bottom Center": "أسفل الوسط", + "Bottom Left": "أسفل اليسار", + "Bottom Right": "أسفل اليمين", + "Bottom edge in points": "الحافة السفلية بالنقاط", + "Brightness": "السطوع", + "Brotli and rasterizing were skipped to keep it PDF/A.": "تم تخطي ضغط Brotli والتحويل إلى صور نقطية للحفاظ على توافق PDF/A.", + "Brotli compression (PDF 2.0)": "ضغط Brotli (PDF 2.0)", + "Browser Note:": "ملاحظة المتصفح:", + "Building new PDF...": "جارٍ إنشاء ملف PDF جديد...", + "Building page pairing model...": "جارٍ بناء نموذج مطابقة الصفحات...", + "Button": "زر", + "ByteRange does not start at the beginning of the file": "لا يبدأ ByteRange من بداية الملف", + "ByteRange out of bounds": "ByteRange خارج الحدود", + "CBZ to PDF": "CBZ إلى PDF", + "CSV Loaded": "تم تحميل CSV", + "CSV file is empty": "ملف CSV فارغ", + "Cancel": "إلغاء", + "Cannot Delete": "لا يمكن الحذف", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "لا يمكن الوصول إلى عناصر التحكم في العارض. يرجى استخدام زر التنزيل في شريط أدوات عارض PDF أعلاه.", + "Cannot delete all pages": "لا يمكن حذف جميع الصفحات", + "Cannot delete all pages.": "لا يمكن حذف جميع الصفحات.", + "Canvas context failed": "فشل سياق Canvas", + "Canvas context unavailable": "سياق Canvas غير متاح", + "Canvas toBlob conversion failed.": "فشل تحويل Canvas toBlob.", + "Canvas toBlob failed": "فشل Canvas toBlob", + "Center": "وسط", + "Certificate (.pfx, .p12, .pem)": "الشهادة (.pfx, .p12, .pem)", + "Certificate Expired": "الشهادة منتهية الصلاحية", + "Certificate Password": "كلمة مرور الشهادة", + "Certificate unlocked": "تم فتح قفل الشهادة", + "Change Certificate": "تغيير الشهادة", + "Change background color": "تغيير لون الخلفية", + "Changing background color...": "جارٍ تغيير لون الخلفية...", + "Changing text color...": "جارٍ تغيير لون النص...", + "Character": "الحرف", + "Checked State": "حالة التحديد", + "Choose a valid page range.": "اختر نطاق صفحات صالحًا.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "اختر إحدى اللغات المضمّنة أو أعد بناء الحزمة المعزولة عن الإنترنت مع إضافة اللغة الناقصة إلى --ocr-languages.", + "Cleanup": "التنظيف", + "Click on PDF to Pick Location": "انقر على PDF لاختيار الموضع", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "انقر على الزر أعلاه، ثم انقر على المكان في PDF الذي تريد أن تنتقل إليه الإشارة المرجعية", + "Click to Upload Image": "انقر لرفع صورة", + "Clicking this field in the PDF will open a file picker to upload an image.": "النقر على هذا الحقل في PDF سيفتح نافذة اختيار ملف لرفع صورة.", + "Clip invisible parts of images": "اقتطاع الأجزاء غير المرئية من الصور", + "Close": "إغلاق", + "Close (Esc)": "إغلاق (Esc)", + "Close panel": "إغلاق اللوحة", + "Closes tab": "يغلق التبويب", + "Closes window": "يغلق النافذة", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (الإشارات المرجعية والبيانات الوصفية)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF غير مهيأ. يرجى تهيئته في إعدادات WASM.", + "CoherentPDF produced an empty decrypted file.": "أنتج CoherentPDF ملفًا مفكوك التشفير فارغًا.", + "CoherentPDF: not configured.": "CoherentPDF: غير مهيأ.", + "Color": "اللون", + "Color adjustments applied successfully!": "تم تطبيق تعديلات الألوان بنجاح!", + "Colors inverted successfully!": "تم عكس الألوان بنجاح!", + "Cols": "الأعمدة", + "Combine multiple PDFs into one": "دمج عدة ملفات PDF في ملف واحد", + "Combine to Single Page": "دمج في صفحة واحدة", + "Combining pages...": "جارٍ دمج الصفحات...", + "Comic Archives": "أرشيفات القصص المصورة", + "Comments and markup become part of the page. Form fields and links keep working.": "تصبح التعليقات والعلامات جزءًا من الصفحة. تبقى حقول النماذج والروابط تعمل.", + "Complete": "اكتمل", + "Complete!": "اكتمل!", + "Compress": "ضغط", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "تم ضغط {{compressedCount}} من ملفات PDF. انخفض الحجم الإجمالي من {{totalOriginalSize}} إلى {{totalCompressedSize}} (تم توفير {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "تم ضغط {{compressedCount}} من ملفات PDF. الحجم الإجمالي: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "جارٍ ضغط عدة ملفات PDF...", + "Compressing to {{size}}...": "جارٍ الضغط إلى {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "جارٍ ضغط {{n}}/{{length}}: {{name}}...", + "Compressing...": "جارٍ الضغط...", + "Compression Complete": "اكتمل الضغط", + "Compression Finished": "انتهى الضغط", + "Compression Level": "مستوى الضغط", + "Configure": "ضبط", + "Confirm": "تأكيد", + "Confirm Action": "تأكيد الإجراء", + "Conformance": "المطابقة", + "Connected": "متصل", + "Contact Info": "معلومات الاتصال", + "Content": "المحتوى", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "تجزئة المحتوى لا تطابق سمة messageDigest: تم تعديل PDF بعد التوقيع", + "Contrast": "التباين", + "Conversion Complete": "اكتمل التحويل", + "Conversion Error": "خطأ في التحويل", + "Conversion engine ready!": "محرك التحويل جاهز!", + "Conversion failed: could not create PDF/A definition": "فشل التحويل: تعذر إنشاء تعريف PDF/A", + "Convert Apple Pages documents to PDF": "تحويل مستندات Apple Pages إلى PDF", + "Convert EPUB ebooks to PDF": "تحويل كتب EPUB الإلكترونية إلى PDF", + "Convert Excel spreadsheets to PDF": "تحويل جداول Excel إلى PDF", + "Convert FB2 e-books to PDF": "تحويل كتب FB2 الإلكترونية إلى PDF", + "Convert JSON files to PDF": "تحويل ملفات JSON إلى PDF", + "Convert MOBI e-books to PDF": "تحويل كتب MOBI الإلكترونية إلى PDF", + "Convert Markdown files to PDF": "تحويل ملفات Markdown إلى PDF", + "Convert Microsoft Publisher to PDF": "تحويل ملفات Microsoft Publisher إلى PDF", + "Convert OpenDocument Graphics to PDF": "تحويل رسومات OpenDocument إلى PDF", + "Convert PDF pages to SVG": "تحويل صفحات PDF إلى SVG", + "Convert PDF pages to images (ZIP)": "تحويل صفحات PDF إلى صور (ZIP)", + "Convert PDF tables to CSV": "تحويل جداول PDF إلى CSV", + "Convert PDF tables to Excel": "تحويل جداول PDF إلى Excel", + "Convert PDF to Markdown text": "تحويل PDF إلى نص Markdown", + "Convert PDF to PDF/A for archiving": "تحويل PDF إلى PDF/A للأرشفة", + "Convert PDF to Word document": "تحويل PDF إلى مستند Word", + "Convert PowerPoint presentations to PDF": "تحويل عروض PowerPoint التقديمية إلى PDF", + "Convert SVG files to PDF": "تحويل ملفات SVG إلى PDF", + "Convert To Grayscale": "تحويل إلى تدرج الرمادي", + "Convert Visio diagrams (VSD/VSDX) to PDF": "تحويل مخططات Visio (VSD/VSDX) إلى PDF", + "Convert WPS Office documents to PDF": "تحويل مستندات WPS Office إلى PDF", + "Convert Word documents to PDF": "تحويل مستندات Word إلى PDF", + "Convert WordPerfect documents to PDF": "تحويل مستندات WordPerfect إلى PDF", + "Convert XML documents to PDF": "تحويل مستندات XML إلى PDF", + "Convert XPS/OXPS documents to PDF": "تحويل مستندات XPS/OXPS إلى PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "تحويل أرشيفات القصص المصورة (CBZ/CBR) إلى PDF", + "Convert email files (.eml, .msg) to PDF": "تحويل ملفات البريد الإلكتروني (.eml, .msg) إلى PDF", + "Convert fonts to vector outlines": "تحويل الخطوط إلى مخططات متجهة", + "Convert plain text to PDF": "تحويل النص العادي إلى PDF", + "Convert to grayscale": "تحويل إلى تدرج الرمادي", + "Convert to greyscale": "تحويل إلى تدرج الرمادي", + "Convert to image-based PDF": "تحويل إلى PDF قائم على الصور", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "تم تحويل {{length}} ملفات ({{totalPages}} صفحة) إلى SVG!", + "Converted {{pageCount}} pages to SVG!": "تم تحويل {{pageCount}} صفحة إلى SVG!", + "Converter not initialized": "المحوّل غير مهيأ", + "Converting BMP to PDF...": "جارٍ تحويل BMP إلى PDF...", + "Converting HEIC to PDF...": "جارٍ تحويل HEIC إلى PDF...", + "Converting TIFF to PDF...": "جارٍ تحويل TIFF إلى PDF...", + "Converting emails...": "جارٍ تحويل رسائل البريد الإلكتروني...", + "Converting files...": "جارٍ تحويل الملفات...", + "Converting fonts to outlines...": "جارٍ تحويل الخطوط إلى مخططات...", + "Converting images to PDF...": "جارٍ تحويل الصور إلى PDF...", + "Converting multiple PDFs to PDF/A...": "جارٍ تحويل عدة ملفات PDF إلى PDF/A...", + "Converting multiple RTF files to PDF...": "جارٍ تحويل عدة ملفات RTF إلى PDF...", + "Converting multiple files...": "جارٍ تحويل عدة ملفات...", + "Converting page {{n}} of {{pageCount}}...": "جارٍ تحويل الصفحة {{n}} من {{pageCount}}...", + "Converting to Markdown...": "جارٍ التحويل إلى Markdown...", + "Converting to SVG...": "جارٍ التحويل إلى SVG...", + "Converting to greyscale...": "جارٍ التحويل إلى تدرج الرمادي...", + "Converting to {{level}}...": "جارٍ التحويل إلى {{level}}...", + "Converting {{name}}...": "جارٍ تحويل {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "جارٍ تحويل {{n}}/{{length}}: {{name}}...", + "Converting...": "جارٍ التحويل...", + "Copied": "تم النسخ", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "تعذر الوصول إلى مصدّر ملفات PDF المختومة. يرجى استخدام زر تصدير ← PDF في شريط أدوات العارض كبديل.", + "Could not add blank page.": "تعذرت إضافة الصفحة الفارغة.", + "Could not add blank pages.": "تعذرت إضافة الصفحات الفارغة.", + "Could not add header or footer.": "تعذرت إضافة الرأس أو التذييل.", + "Could not add page numbers.": "تعذرت إضافة أرقام الصفحات.", + "Could not add the watermark.": "تعذرت إضافة العلامة المائية.", + "Could not apply rotations.": "تعذر تطبيق التدويرات.", + "Could not change text color.": "تعذر تغيير لون النص.", + "Could not change the background color.": "تعذر تغيير لون الخلفية.", + "Could not create ZIP archive.": "تعذر إنشاء أرشيف ZIP.", + "Could not create canvas context.": "تعذر إنشاء سياق Canvas.", + "Could not create comparison canvas context.": "تعذر إنشاء سياق Canvas للمقارنة.", + "Could not create offscreen comparison canvas.": "تعذر إنشاء Canvas خارج الشاشة للمقارنة.", + "Could not create visual diff context.": "تعذر إنشاء سياق الفروقات المرئية.", + "Could not create visual diff overlay context.": "تعذر إنشاء سياق طبقة الفروقات المرئية.", + "Could not detect blank pages.": "تعذر اكتشاف الصفحات الفارغة.", + "Could not display the page.": "تعذر عرض الصفحة.", + "Could not export comparison PDF.": "تعذر تصدير PDF المقارنة.", + "Could not export the signed PDF. Please try again.": "تعذر تصدير PDF الموقّع. يرجى المحاولة مرة أخرى.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "تعذر تصدير PDF المختوم. يرجى استخدام زر تصدير ← PDF في شريط أدوات العارض كبديل.", + "Could not extract signer public key": "تعذر استخراج المفتاح العام للموقّع", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "تعذر العثور على {{testFile}} في الرابط المحدد (HTTP {{status}}). تأكد من وجود الملف.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "تعذر تحليل PDF بالكامل. قد يكون تالفًا أو ذا بنية غير معتادة.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "تعذر إنشاء معاينة. قد يكون الملف تالفًا أو يحتوي على ميزات غير مدعومة. الخطأ: {{message}}", + "Could not get canvas context": "تعذر الحصول على سياق Canvas", + "Could not invert PDF colors.": "تعذر عكس ألوان PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "تعذر تحميل PDF. قد يكون تالفًا أو محميًا بكلمة مرور.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "تعذر تحميل PDF. قد يكون الملف غير صالح أو تالفًا أو محميًا بكلمة مرور.", + "Could not load the PDF engine. Please refresh the page and try again.": "تعذر تحميل محرك PDF. يرجى تحديث الصفحة والمحاولة مرة أخرى.", + "Could not parse signer info": "تعذر تحليل معلومات الموقّع", + "Could not posterize the PDF.": "تعذر تقليل ألوان ملف PDF (Posterize).", + "Could not process \"{{name}}\". The file may be corrupted.": "تعذرت معالجة \"{{name}}\". قد يكون الملف تالفًا.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "تعذر تقليل حجم الملف أكثر. الأصلي: {{originalSize}}، الجديد: {{compressedSize}}.", + "Could not remove annotations.": "تعذرت إزالة التعليقات التوضيحية.", + "Could not remove blank pages.": "تعذرت إزالة الصفحات الفارغة.", + "Could not remove leftover data from the PDF.": "تعذرت إزالة البيانات المتبقية من PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "تعذرت إزالة النص المنقّح من بيانات المستند، لذلك لم يتم تنزيل الملف.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "تعذر عكس ترتيب صفحات PDF. يرجى التأكد من أن ملفاتك صالحة.", + "Could not update metadata. Please check that date formats are correct.": "تعذر تحديث البيانات الوصفية. يرجى التأكد من صحة صيغ التواريخ.", + "Count": "العدد", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "تاريخ الإنشاء", + "Creating Booklet...": "جارٍ إنشاء الكتيّب...", + "Creating Excel file...": "جارٍ إنشاء ملف Excel...", + "Creating N-Up PDF...": "جارٍ إنشاء PDF بتخطيط N-Up...", + "Creating PDF from JPGs...": "جارٍ إنشاء PDF من صور JPG...", + "Creating PDF from SVG files...": "جارٍ إنشاء PDF من ملفات SVG...", + "Creating PDF...": "جارٍ إنشاء PDF...", + "Creating ZIP archive...": "جارٍ إنشاء أرشيف ZIP...", + "Creating ZIP file...": "جارٍ إنشاء ملف ZIP...", + "Creating ZIP...": "جارٍ إنشاء ZIP...", + "Creating table...": "جارٍ إنشاء الجدول...", + "Creator": "المنشئ", + "Crop": "قص", + "Crop complete! Your download has started.": "اكتمل القص! بدأ التنزيل.", + "Cryptographic verification failed": "فشل التحقق التشفيري", + "Custom": "مخصص", + "Custom Format": "صيغة مخصصة", + "Custom Height": "ارتفاع مخصص", + "Custom Units": "وحدات مخصصة", + "Custom Width": "عرض مخصص", + "Custom Zoom": "تكبير مخصص", + "Custom...": "مخصص...", + "DataMatrix": "DataMatrix", + "Date Format": "صيغة التاريخ", + "Decrease size": "تصغير الحجم", + "Decrypt": "فك التشفير", + "Decrypting PDF...": "جارٍ فك تشفير PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "جارٍ فك تشفير {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "جارٍ فك تشفير {{n}} من {{length}}: {{name}}", + "Decrypting...": "جارٍ فك التشفير...", + "Decryption Failed": "فشل فك التشفير", + "Delete": "حذف", + "Delete \"{{title}}\"?": "هل تريد حذف \"{{title}}\"؟", + "Delete Field": "حذف الحقل", + "Delete Page": "حذف الصفحة", + "Delete Pages": "حذف الصفحات", + "Delete all {{length}} bookmark(s) ? ": "هل تريد حذف جميع الإشارات المرجعية ({{length}})؟ ", + "Delete layer": "حذف الطبقة", + "Delete {{size}} bookmark(s) ? ": "هل تريد حذف الإشارات المرجعية ({{size}})؟ ", + "Deleted": "محذوف", + "Deleted {{size}} page(s) successfully!": "تم حذف {{size}} من الصفحات بنجاح!", + "Deleting pages...": "جارٍ حذف الصفحات...", + "Description": "الوصف", + "Description for screen readers": "وصف لقارئات الشاشة", + "Deselect All": "إلغاء تحديد الكل", + "Deskew": "تقويم الميل", + "Deskew PDF": "تقويم ميل PDF", + "Deskewed {{length}} file(s). {{value}}": "تم تقويم ميل {{length}} من الملفات. {{value}}", + "Deskewing {{name}}...": "جارٍ تقويم ميل {{name}}...", + "Destination": "الوجهة", + "Detecting blank pages...": "جارٍ اكتشاف الصفحات الفارغة...", + "Digest Algorithm:": "خوارزمية التجزئة:", + "Digital Sign": "توقيع رقمي", + "Direction": "الاتجاه", + "Divide Pages": "تقسيم الصفحات", + "Divide into boxes (0 to disable)": "التقسيم إلى مربعات (0 للتعطيل)", + "Document Properties": "خصائص المستند", + "Document Type": "نوع المستند", + "Document properties": "خصائص المستند", + "Document-level attachment": "مرفق على مستوى المستند", + "Done: back to tools": "تم، العودة إلى الأدوات", + "Download": "تنزيل", + "Download Edited PDF": "تنزيل PDF المعدّل", + "Download anyway": "التنزيل على أي حال", + "Download as PDF or ZIP automatically": "التنزيل تلقائيًا كملف PDF أو ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "تم تنزيل {{length}} من ملفات PDF في أرشيف ZIP.", + "Downloads started for all files.": "بدأ تنزيل جميع الملفات.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "يزيل الوسوم التي تعتمد عليها قارئات الشاشة.", + "Duplicate Field Name": "اسم حقل مكرر", + "Duplicate Field Names": "أسماء حقول مكررة", + "Duplicate Page": "تكرار الصفحة", + "Duplicate Page Numbers": "أرقام صفحات مكررة", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "توقيع ECDSA لا يطابق المفتاح العام للموقّع", + "EPUB Files": "ملفات EPUB", + "EPUB to PDF": "EPUB إلى PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ إلى PDF", + "Edit": "تعديل", + "Edit All": "تعديل الكل", + "Edit Bookmark": "تعديل الإشارة المرجعية", + "Edit Bookmarks": "تعديل الإشارات المرجعية", + "Edit Images": "تعديل الصور", + "Edit Metadata": "تعديل البيانات الوصفية", + "Edit PDF metadata": "تعديل البيانات الوصفية لملف PDF", + "Edit Scope": "نطاق التعديل", + "Edit Shapes": "تعديل الأشكال", + "Edit Text": "تعديل النص", + "Edit tool": "أداة التعديل", + "Edit {{scopes}}": "تعديل {{scopes}}", + "Email Files": "ملفات البريد الإلكتروني", + "Email to PDF": "البريد الإلكتروني إلى PDF", + "Embedding files into PDF...": "جارٍ تضمين الملفات في PDF...", + "Empty signature bytes": "بايتات التوقيع فارغة", + "Encrypt": "تشفير", + "Encrypt PDF with password": "تشفير PDF بكلمة مرور", + "Encrypted file": "ملف مشفّر", + "Encrypting PDF with 256-bit AES...": "جارٍ تشفير PDF باستخدام AES بطول 256 بت...", + "Encryption Failed": "فشل التشفير", + "Encryption resulted in an empty file.": "أدى التشفير إلى ملف فارغ.", + "End": "النهاية", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "أدخل 0 للإدراج في البداية، أو {{pageCount}} للإدراج في النهاية.", + "Enter bookmark title": "أدخل عنوان الإشارة المرجعية", + "Enter name for child layer under \"{{Layer}}\":": "أدخل اسم الطبقة الفرعية تحت \"{{Layer}}\":", + "Enter password": "أدخل كلمة المرور", + "Enter password...": "أدخل كلمة المرور...", + "Enter passwords for each encrypted file": "أدخل كلمات المرور لكل ملف مشفّر", + "Error": "خطأ", + "Error during execution": "حدث خطأ أثناء التنفيذ", + "Error generating PDF: {{error}}": "خطأ في إنشاء PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "خطأ في تحميل ملف PDF. يرجى المحاولة مرة أخرى بملف PDF صالح.", + "Error reading files: {{error}}": "خطأ في قراءة الملفات: {{error}}", + "Error saving PDF. Check console for details.": "خطأ في حفظ PDF. راجع وحدة التحكم للتفاصيل.", + "Error: {{error}}": "خطأ: {{error}}", + "Exactly 11 or 12 digits": "11 أو 12 رقمًا بالضبط", + "Exactly 12 or 13 digits": "12 أو 13 رقمًا بالضبط", + "Example of current format:": "مثال على الصيغة الحالية:", + "Excel to PDF": "Excel إلى PDF", + "Existing Radio Groups": "مجموعات الأزرار الاختيارية الموجودة", + "Export Error": "خطأ في التصدير", + "Export Value": "قيمة التصدير", + "Export failed": "فشل التصدير", + "External processing module needed": "مطلوب وحدة معالجة خارجية", + "Extract Images": "استخراج الصور", + "Extract Pages": "استخراج الصفحات", + "Extract Tables": "استخراج الجداول", + "Extract a range of pages": "استخراج نطاق من الصفحات", + "Extract all images from PDF": "استخراج كل الصور من PDF", + "Extract pages as separate PDFs": "استخراج الصفحات كملفات PDF منفصلة", + "Extract text from PDF": "استخراج النص من PDF", + "Extracted 1 table successfully!": "تم استخراج جدول واحد بنجاح!", + "Extracted text from {{length}} PDF files!": "تم استخراج النص من {{length}} من ملفات PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "تم استخراج {{completed}} من ملفات PDF، وفشل {{failed}}.", + "Extracted {{length}} page(s) successfully!": "تم استخراج {{length}} من الصفحات بنجاح!", + "Extracted {{length}} table(s) to Excel!": "تم استخراج {{length}} من الجداول إلى Excel!", + "Extracted {{length}} tables successfully!": "تم استخراج {{length}} من الجداول بنجاح!", + "Extracting attachments from {{length}} file(s)...": "جارٍ استخراج المرفقات من {{length}} من الملفات...", + "Extracting images from {{name}}...": "جارٍ استخراج الصور من {{name}}...", + "Extracting pages...": "جارٍ استخراج الصفحات...", + "Extracting tables...": "جارٍ استخراج الجداول...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "جارٍ استخراج النص من الملف {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "جارٍ استخراج النص من عدة ملفات...", + "Extracting text from {{name}}...": "جارٍ استخراج النص من {{name}}...", + "Extracting text...": "جارٍ استخراج النص...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "جارٍ استخراج {{name}} للذكاء الاصطناعي ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "جارٍ استخراج {{name}} للذكاء الاصطناعي...", + "Extracting...": "جارٍ الاستخراج...", + "Extraction Complete": "اكتمل الاستخراج", + "Extraction Error": "خطأ في الاستخراج", + "Extraction Partial": "استخراج جزئي", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "اكتمل الاستخراج! {{length}} من المرفقات في ملف ZIP ({{totalSize}}). بدأ التنزيل.", + "FB2 Files": "ملفات FB2", + "FB2 to PDF": "FB2 إلى PDF", + "Failed": "فشل", + "Failed to acquire 2D canvas context": "تعذر الحصول على سياق Canvas ثنائي الأبعاد", + "Failed to add child layer": "تعذرت إضافة الطبقة الفرعية", + "Failed to apply Bates numbers.": "تعذر تطبيق أرقام Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "تعذر تطبيق تعديلات الألوان. قد يكون الملف تالفًا.", + "Failed to apply redactions.": "تعذر تطبيق التنقيحات.", + "Failed to apply scanner effect. The file might be corrupted.": "تعذر تطبيق تأثير الماسح الضوئي. قد يكون الملف تالفًا.", + "Failed to attach files: {{error}}": "تعذر إرفاق الملفات: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "تعذر تحويل BMP إلى PDF. قد يكون أحد الملفات غير صالح.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "تعذر تحويل HEIC إلى PDF. قد يكون أحد الملفات غير صالح.", + "Failed to convert PDF to CSV. {{message}}": "تعذر تحويل PDF إلى CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "تعذر تحويل PDF إلى Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "تعذر تحويل PDF إلى SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "تعذر تحويل PDF إلى تدرج الرمادي. قد يكون الملف تالفًا.", + "Failed to convert PDF. It may be image-based or corrupted.": "تعذر تحويل PDF. قد يكون قائمًا على الصور أو تالفًا.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "تعذر تحويل TIFF إلى PDF. قد يكون أحد الملفات غير صالح.", + "Failed to convert images to PDF.": "تعذر تحويل الصور إلى PDF.", + "Failed to convert text to PDF. {{error}}": "تعذر تحويل النص إلى PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "تعذر تحويل {{filename}} إلى PNG", + "Failed to copy metadata to clipboard.": "تعذر نسخ البيانات الوصفية إلى الحافظة.", + "Failed to create PDF.": "تعذر إنشاء PDF.", + "Failed to create PNG blob": "تعذر إنشاء كائن PNG blob", + "Failed to create canvas context": "تعذر إنشاء سياق Canvas", + "Failed to create split PDFs.": "تعذر إنشاء ملفات PDF المقسّمة.", + "Failed to decode image: {{name}}": "تعذر فك ترميز الصورة: {{name}}", + "Failed to decrypt private key": "تعذر فك تشفير المفتاح الخاص", + "Failed to decrypt. Try the Decrypt tool instead.": "تعذر فك التشفير. جرّب أداة فك التشفير بدلًا من ذلك.", + "Failed to delete layer": "تعذر حذف الطبقة", + "Failed to delete pages.": "تعذر حذف الصفحات.", + "Failed to deskew PDF: {{error}}": "تعذر تقويم ميل PDF: {{error}}", + "Failed to download the edited PDF.": "تعذر تنزيل PDF المعدّل.", + "Failed to edit attachments.": "تعذر تعديل المرفقات.", + "Failed to extract certificate from PFX file": "تعذر استخراج الشهادة من ملف PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "تعذر استخراج الصفحات (رمز خروج qpdf {{exitCode}}).", + "Failed to extract pages.": "تعذر استخراج الصفحات.", + "Failed to extract tables. {{message}}": "تعذر استخراج الجداول. {{message}}", + "Failed to extract text from PDF.": "تعذر استخراج النص من PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "تعذر جلب ملف ICC من {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "تعذر جلب ملف الخط: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "تعذر جلب gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "تعذر جلب {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "تعذر الحصول على سياق ثنائي الأبعاد للصفحة {{pageNumber}}", + "Failed to get canvas context": "تعذر الحصول على سياق Canvas", + "Failed to insert PDF. The file may be corrupted.": "تعذر إدراج PDF. قد يكون الملف تالفًا.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "تعذر تحميل Ghostscript من {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "تعذر تحميل ملف PDF.", + "Failed to load PDF for cropping.": "تعذر تحميل PDF للقص.", + "Failed to load PDF for preview.": "تعذر تحميل PDF للمعاينة.", + "Failed to load PDF form viewer.": "تعذر تحميل عارض نماذج PDF.", + "Failed to load PDF layers": "تعذر تحميل طبقات PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "تعذر تحميل PyMuPDF من CDN: {{msg}}", + "Failed to load SVG image": "تعذر تحميل صورة SVG", + "Failed to load WebP image": "تعذر تحميل صورة WebP", + "Failed to load attachments from PDF.": "تعذر تحميل المرفقات من PDF.", + "Failed to load files: {{error}}": "تعذر تحميل الملفات: {{error}}", + "Failed to load image.": "تعذر تحميل الصورة.", + "Failed to load image: {{filename}}": "تعذر تحميل الصورة: {{filename}}", + "Failed to load one or more PDF files.": "تعذر تحميل ملف PDF واحد أو أكثر.", + "Failed to load script: {{url}}": "تعذر تحميل السكربت: {{url}}", + "Failed to load template.": "تعذر تحميل القالب.", + "Failed to load the PDF Editor.": "تعذر تحميل محرر PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "تعذر تحميل معالج الصور. يرجى التأكد من أن متصفحك يدعم SharedArrayBuffer (يتطلب HTTPS أو localhost).", + "Failed to parse CSV: {{error}}": "تعذر تحليل CSV: {{error}}", + "Failed to parse signature": "تعذر تحليل التوقيع", + "Failed to parse the certificate file.": "تعذر تحليل ملف الشهادة.", + "Failed to process HEIC file: {{name}}": "تعذرت معالجة ملف HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "تعذرت معالجة ملف WebP: {{name}}", + "Failed to read file.": "تعذرت قراءة الملف.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "تعذرت إزالة القيود. قد يتطلب PDF كلمة مرور المالك الصحيحة.", + "Failed to render page": "تعذر عرض الصفحة", + "Failed to render page previews": "تعذر عرض معاينات الصفحات", + "Failed to render page previews.": "تعذر عرض معاينات الصفحات.", + "Failed to render page.": "تعذر عرض الصفحة.", + "Failed to save changes.": "تعذر حفظ التغييرات.", + "Failed to save the new PDF. Check console for details.": "تعذر حفظ PDF الجديد. راجع وحدة التحكم للتفاصيل.", + "Failed to split PDF. Please check your selection.": "تعذر تقسيم PDF. يرجى التحقق من تحديدك.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "تعذر ختم PDF زمنيًا: {{message}}\n\nجرّب خادم TSA آخر أو تحقق من اتصالك بالإنترنت.", + "Failed to toggle layer visibility": "تعذر تبديل ظهور الطبقة", + "Failed to validate signatures. The file may be corrupted.": "تعذر التحقق من التوقيعات. قد يكون الملف تالفًا.", + "Features enabled by this module:": "الميزات التي تفعّلها هذه الوحدة:", + "Field Name": "اسم الحقل", + "Field Name (Group Name)": "اسم الحقل (اسم المجموعة)", + "Field Name Conflict": "تعارض في اسم الحقل", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "اسم الحقل \"{{newName}}\" موجود بالفعل في هذا {{value}}. يرجى استخدام اسم فريد.", + "Field name cannot be empty": "لا يمكن أن يكون اسم الحقل فارغًا", + "File": "ملف", + "File Size": "حجم الملف", + "File exists but could not be read. Check CORS configuration.": "الملف موجود لكن تعذرت قراءته. تحقق من إعدادات CORS.", + "File list not found": "قائمة الملفات غير موجودة", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "انخفض حجم الملف من {{originalSize}} إلى {{compressedSize}} (تم توفير {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "الملف {{n}}/{{length}}: الصفحة {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "الملف {{n}}/{{length}}: {{message}}", + "Filename": "اسم الملف", + "Files that failed: {{errorCount}}.": "الملفات التي فشلت: {{errorCount}}.", + "Fill (cover full target page)": "ملء (تغطية الصفحة الهدف بالكامل)", + "Fill Color": "لون التعبئة", + "Finalizing PDF...": "جارٍ إنهاء PDF...", + "Find & replace": "بحث واستبدال", + "Finds the best quality under this size. 0 means no target.": "يبحث عن أفضل جودة ضمن هذا الحجم. القيمة 0 تعني بلا حجم مستهدف.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "قد يعرض Firefox وChrome صيغة منتقي التاريخ الأصلية أثناء الاختيار. ستُطبَّق الصيغة الصحيحة عند الانتهاء من إدخال التاريخ.", + "First Indent": "إزاحة السطر الأول", + "Fit (keep full page visible)": "احتواء (إبقاء الصفحة كاملة ظاهرة)", + "Fit Page": "ملاءمة الصفحة", + "Fix Page Size": "تصحيح حجم الصفحة", + "Flatten": "تسطيح", + "Flatten Forms": "تسطيح النماذج", + "Flatten annotations": "تسطيح التعليقات التوضيحية", + "Flatten form fields": "تسطيح حقول النماذج", + "Flatten forms and annotations": "تسطيح النماذج والتعليقات التوضيحية", + "Flatten links": "تسطيح الروابط", + "Flattening PDF...": "جارٍ تسطيح PDF...", + "Flattening and saving PDF...": "جارٍ تسطيح PDF وحفظه...", + "Flattening multiple PDFs...": "جارٍ تسطيح عدة ملفات PDF...", + "Flattening page {{i}} of {{totalPages}}...": "جارٍ تسطيح الصفحة {{i}} من {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "جارٍ تسطيح {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "يركّز على شريط العنوان", + "Font": "الخط", + "Font Color": "لون الخط", + "Font Family": "عائلة الخط", + "Font Size": "حجم الخط", + "Font size: {{bSize}} → {{aSize}}": "حجم الخط: {{bSize}} ← {{aSize}}", + "Font to Outline": "تحويل الخط إلى مخطط", + "Font: {{bFont}} → {{aFont}}": "الخط: {{bFont}} ← {{aFont}}", + "Fonts": "الخطوط", + "Footer Center": "وسط التذييل", + "Footer Left": "يسار التذييل", + "Footer Right": "يمين التذييل", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "لملفات PDF المكوّنة من صور فقط مثل المسح الضوئي. يتم تخطيه عندما يحتوي المستند على نص قابل للتحديد، ما لم يكن خيار تجاوز حماية المحتوى مفعّلًا.", + "Form fields stop being fillable.": "لا تعود حقول النماذج قابلة للتعبئة.", + "Format": "الصيغة", + "Found {{length}} blank page(s). Click on a page to deselect it.": "تم العثور على {{length}} من الصفحات الفارغة. انقر على صفحة لإلغاء تحديدها.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "تم العثور على {{length}} من الإشارات المرجعية الموجودة. هل تريد استبدال الإشارات المرجعية الحالية؟", + "Found {{length}} image(s) in {{length2}} PDF(s).": "تم العثور على {{length}} من الصور في {{length2}} من ملفات PDF.", + "Front": "الوجه الأمامي", + "Full Coverage": "تغطية كاملة", + "Gamma": "غاما", + "Generate table of contents from bookmarks": "إنشاء جدول محتويات من الإشارات المرجعية", + "Generating High-Quality PDF...": "جارٍ إنشاء PDF عالي الجودة...", + "Generating PDF...": "جارٍ إنشاء PDF...", + "Generating ZIP file...": "جارٍ إنشاء ملف ZIP...", + "Generating formatted content...": "جارٍ إنشاء المحتوى المنسّق...", + "Generating preview...": "جارٍ إنشاء المعاينة...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (تحويل PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "فشل تحويل Ghostscript RGB برمز الخروج {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "فشل تحويل Ghostscript برمز الخروج {{exitCode}}", + "Ghostscript did not produce output file": "لم ينتج Ghostscript ملف إخراج", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript غير مهيأ. يرجى تهيئته في الإعدادات المتقدمة.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript غير مهيأ. يرجى تهيئته في إعدادات WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript غير مهيأ. يتطلب PyMuPDF وجود Ghostscript في بعض العمليات. يرجى تهيئة كليهما في الإعدادات المتقدمة.", + "Ghostscript threw an exception: {{e}}": "أطلق Ghostscript استثناءً: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "لم تُظهر حزمة Ghostscript الواجهة المتوقعة. المتوقع هو loadGS() أو الصنف GhostscriptWASM.", + "Go": "انتقال", + "Go to page": "الانتقال إلى صفحة", + "Grayscale": "تدرج الرمادي", + "Green": "أخضر", + "Greyscale": "تدرج الرمادي", + "Grid Mode": "وضع الشبكة", + "Group Name (Must be same for group)": "اسم المجموعة (يجب أن يكون متطابقًا لأفراد المجموعة)", + "H-Scale %": "التحجيم الأفقي %", + "Hanging Indent": "إزاحة معلّقة", + "Hard reloads page": "يعيد تحميل الصفحة بالكامل", + "Header & Footer": "الرأس والتذييل", + "Header & Footer added successfully!": "تمت إضافة الرأس والتذييل بنجاح!", + "Header Center": "وسط الرأس", + "Header Left": "يسار الرأس", + "Header Right": "يمين الرأس", + "Height ({{unit}})": "الارتفاع ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "إخفاء", + "Hide Border": "إخفاء الحدود", + "Hide password": "إخفاء كلمة المرور", + "Hides window": "يخفي النافذة", + "High (288 DPI)": "عالية (288 DPI)", + "High (Smallest Files)": "عالية (أصغر الملفات)", + "Horizontal": "أفقي", + "Hue Shift": "إزاحة تدرج اللون", + "Image Format": "صيغة الصورة", + "Image Input": "إدخال الصور", + "Image quality": "جودة الصورة", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "تم تغيير حجم الصورة من {{width}}×{{height}} إلى {{width2}}×{{height2}}", + "Images": "الصور", + "Images above this are resampled down. None leaves resolution alone.": "يتم خفض دقة الصور التي تتجاوز هذه القيمة. الخيار \"بدون\" يترك الدقة كما هي.", + "Imported {{length}} bookmarks!": "تم استيراد {{length}} من الإشارات المرجعية!", + "Inches (in)": "بوصات (in)", + "Include Attachments": "تضمين المرفقات", + "Include Cc Bcc": "تضمين النسخة الكربونية والمخفية", + "Include this file": "تضمين هذا الملف", + "Incorrect Page Count": "عدد الصفحات غير صحيح", + "Incorrect Password": "كلمة مرور غير صحيحة", + "Incorrect password": "كلمة مرور غير صحيحة", + "Incorrect password. Please try again.": "كلمة المرور غير صحيحة. يرجى المحاولة مرة أخرى.", + "Increase size": "تكبير الحجم", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "جارٍ فهرسة PDF 1، الصفحة {{pageNumber}} من {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "جارٍ فهرسة PDF 2، الصفحة {{pageNumber}} من {{totalPages}}...", + "Info": "معلومات", + "Info Dictionary": "قاموس المعلومات", + "Inherit": "وراثة", + "Initialization Error": "خطأ في التهيئة", + "Initializing Ghostscript...": "جارٍ تهيئة Ghostscript...", + "Initializing PDF engine...": "جارٍ تهيئة محرك PDF...", + "Initializing PyMuPDF...": "جارٍ تهيئة PyMuPDF...", + "Initializing decryption...": "جارٍ تهيئة فك التشفير...", + "Initializing encryption...": "جارٍ تهيئة التشفير...", + "Initializing repair engine...": "جارٍ تهيئة محرك الإصلاح...", + "Initializing...": "جارٍ التهيئة...", + "Input Required": "إدخال مطلوب", + "Insecure Digest (MD5 / SHA-1)": "تجزئة غير آمنة (MD5 / SHA-1)", + "Insert blank pages": "إدراج صفحات فارغة", + "Insert blank pages after this page number": "إدراج صفحات فارغة بعد رقم الصفحة هذا", + "Interactive Form Fields": "حقول النماذج التفاعلية", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "دمج صفحات من عدة ملفات PDF بالتناوب (مثل الصفحات الفردية مع الزوجية بترتيب معكوس من مسح ضوئي أحادي الوجه)", + "Invalid Certificate": "شهادة غير صالحة", + "Invalid File": "ملف غير صالح", + "Invalid Files": "ملفات غير صالحة", + "Invalid Input": "إدخال غير صالح", + "Invalid JSON format": "صيغة JSON غير صالحة", + "Invalid Name": "اسم غير صالح", + "Invalid Order": "ترتيب غير صالح", + "Invalid PDF password.": "كلمة مرور PDF غير صالحة.", + "Invalid Page Numbers": "أرقام صفحات غير صالحة", + "Invalid Page Order": "ترتيب صفحات غير صالح", + "Invalid Pages": "صفحات غير صالحة", + "Invalid Range": "نطاق غير صالح", + "Invalid Signature": "توقيع غير صالح", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "رابط TSA غير صالح. يجب أن تكون سلطة الختم الزمني رابطًا صالحًا يبدأ بـ http:// أو https://.", + "Invalid URL": "رابط غير صالح", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "صيغة الرابط غير صالحة. يرجى إدخال رابط صالح (مثل https://example.com/wasm/)", + "Invalid XML: no root element": "XML غير صالح: لا يوجد عنصر جذر", + "Invalid data": "بيانات غير صالحة", + "Invalid hex string in content stream": "سلسلة سداسية عشرية غير صالحة في تدفق المحتوى", + "Invalid page range specified.": "تم تحديد نطاق صفحات غير صالح.", + "Invalid shortcut format": "صيغة الاختصار غير صالحة", + "Invalid: Cryptographic Verification Failed": "غير صالح: فشل التحقق التشفيري", + "Invert Colors": "عكس الألوان", + "Invert all colors": "عكس جميع الألوان", + "Inverting PDF colors...": "جارٍ عكس ألوان PDF...", + "Issuer": "الجهة المصدِرة", + "It fits the {{targetBytes}} target.": "يناسب الحجم المستهدف {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "لا يزال أكبر من الحجم المستهدف {{targetBytes}} لأن خيار الحفاظ على PDF/A يحدّ من مدى إمكانية ضغطه.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "لم يعد يدّعي التوافق مع PDF/A. فعّل خيار الحفاظ على PDF/A ضمن الإعدادات المخصصة للإبقاء عليه.", + "Italic": "مائل", + "Item 1": "العنصر 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "تمت إزالة توقيعاته الرقمية لكي يمكن ضغطه. وقّعه مرة أخرى عند الحاجة.", + "JPEG (Smaller file size)": "JPEG (حجم ملف أصغر)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "جودة JPEG للصور المعاد ترميزها، من 20 إلى 100. القيم الأقل تعني ملفات أصغر وتشوهات أوضح.", + "JPG": "JPG", + "JSON Files": "ملفات JSON", + "JSON Loaded": "تم تحميل JSON", + "JSON to PDF": "JSON إلى PDF", + "Javascript Code": "كود Javascript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "يُبقي ملف PDF/A متوافقًا. يتم تخطي Brotli والتحويل إلى صور نقطية عند تفعيله.", + "Keeps only the characters the document uses.": "يُبقي فقط الأحرف التي يستخدمها المستند.", + "Key (e.g., Department)": "المفتاح (مثل: القسم)", + "Keywords": "الكلمات المفتاحية", + "Label": "التسمية", + "Label / Prompt": "التسمية / النص التوضيحي", + "Landscape": "أفقي", + "Language": "اللغة", + "Layer not found": "الطبقة غير موجودة", + "Layer {{number}}": "الطبقة {{number}}", + "Leave blank for all pages": "اتركه فارغًا لجميع الصفحات", + "Left": "يسار", + "Left edge in points (1 inch = 72 pts)": "الحافة اليسرى بالنقاط (1 بوصة = 72 نقطة)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "المستوى", + "Limit recognized characters (leave empty for all)": "تحديد الأحرف المعروفة (اتركه فارغًا لجميع الأحرف)", + "Line": "خط", + "Linearization Failed": "فشل التحسين للعرض السريع", + "Linearize": "تحسين للعرض السريع", + "Links stop being clickable.": "لا تعود الروابط قابلة للنقر.", + "Lists": "القوائم", + "Load": "تحميل", + "Load system fonts": "تحميل خطوط النظام", + "Load system fonts…": "تحميل خطوط النظام…", + "Loaded": "تم التحميل", + "Loaded bookmarks from JSON. Now upload your PDF.": "تم تحميل الإشارات المرجعية من JSON. ارفع ملف PDF الآن.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "تم تحميل {{length}} من الإشارات المرجعية من CSV. ارفع ملف PDF الآن.", + "Loading Engine...": "جارٍ تحميل المحرك...", + "Loading Ghostscript...": "جارٍ تحميل Ghostscript...", + "Loading PDF Editor...": "جارٍ تحميل محرر PDF...", + "Loading PDF Text Editor...": "جارٍ تحميل محرر نصوص PDF...", + "Loading PDF converter...": "جارٍ تحميل محوّل PDF...", + "Loading PDF documents...": "جارٍ تحميل مستندات PDF...", + "Loading PDF engine...": "جارٍ تحميل محرك PDF...", + "Loading PDF files...": "جارٍ تحميل ملفات PDF...", + "Loading PDF form...": "جارٍ تحميل نموذج PDF...", + "Loading PDF processor...": "جارٍ تحميل معالج PDF...", + "Loading PDF viewer...": "جارٍ تحميل عارض PDF...", + "Loading PDF...": "جارٍ تحميل PDF...", + "Loading PDFs...": "جارٍ تحميل ملفات PDF...", + "Loading attachments...": "جارٍ تحميل المرفقات...", + "Loading comparison {{currentPage}} of {{length}}...": "جارٍ تحميل المقارنة {{currentPage}} من {{length}}...", + "Loading conversion engine ({{percent}}%)...": "جارٍ تحميل محرك التحويل ({{percent}}%)...", + "Loading conversion engine...": "جارٍ تحميل محرك التحويل...", + "Loading engine...": "جارٍ تحميل المحرك...", + "Loading fonts...": "جارٍ تحميل الخطوط...", + "Loading layers from {{name}}...": "جارٍ تحميل الطبقات من {{name}}...", + "Loading page {{num}}...": "جارٍ تحميل الصفحة {{num}}...", + "Loading preview...": "جارٍ تحميل المعاينة...", + "Loading {{name}}...": "جارٍ تحميل {{name}}...", + "Loading...": "جارٍ التحميل...", + "Location": "الموقع", + "Lossless (No Quality Loss)": "بلا فقدان (بدون فقدان في الجودة)", + "Lossless (no image re-encoding)": "بلا فقدان (بدون إعادة ترميز الصور)", + "Low (Best Quality)": "منخفضة (أفضل جودة)", + "MOBI Files": "ملفات MOBI", + "MOBI to PDF": "MOBI إلى PDF", + "Malformed ByteRange": "ByteRange مشوّه", + "Malformed ECDSA signature (could not parse r,s)": "توقيع ECDSA مشوّه (تعذر تحليل r,s)", + "Malformed inline image in content stream": "صورة مضمّنة مشوّهة في تدفق المحتوى", + "Malformed signatureAlgorithm": "signatureAlgorithm مشوّه", + "Margins": "الهوامش", + "Markdown Files": "ملفات Markdown", + "Markdown to PDF": "Markdown إلى PDF", + "Max Length (0 for unlimited)": "الحد الأقصى للطول (0 لغير محدود)", + "Maximum resolution": "أقصى دقة", + "Medium (Recommended)": "متوسطة (موصى بها)", + "Merge PDF": "دمج PDF", + "Merge PDFs": "دمج ملفات PDF", + "Merge duplicate fonts": "دمج الخطوط المكررة", + "Mermaid Error: {{error}}": "خطأ Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "تم نسخ البيانات الوصفية إلى الحافظة بصيغة JSON.", + "Metadata removed successfully!": "تمت إزالة البيانات الوصفية بنجاح!", + "Metadata updated successfully!": "تم تحديث البيانات الوصفية بنجاح!", + "Millimeters (mm)": "ملليمترات (mm)", + "Minimizes window": "يصغّر النافذة", + "Missing Files": "ملفات مفقودة", + "Missing signatureAlgorithm": "signatureAlgorithm مفقود", + "Mixed Page Sizes Detected": "تم اكتشاف أحجام صفحات مختلفة", + "Mixed Sizes": "أحجام مختلفة", + "Mode": "الوضع", + "Modified": "معدل", + "Modified After Signing (signed part intact)": "تم التعديل بعد التوقيع (الجزء الموقّع سليم)", + "More": "المزيد", + "Moved": "منقول", + "Moved \"{{value}}\"": "تم نقل \"{{value}}\"", + "Multi-line": "متعدد الأسطر", + "Must be a positive integer": "يجب أن يكون عددًا صحيحًا موجبًا", + "Must be a positive number": "يجب أن يكون رقمًا موجبًا", + "N must be at least 1.": "يجب ألا تقل N عن 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "تم إنشاء PDF بتخطيط N-Up بنجاح!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "خطأ في الشبكة: تعذر الاتصال بالرابط. تحقق من صحة الرابط وأن الخادم يسمح بطلبات CORS.", + "Network error: {{error}}": "خطأ في الشبكة: {{error}}", + "Next page": "الصفحة التالية", + "No Area Selected": "لم يتم تحديد منطقة", + "No Attachments": "لا توجد مرفقات", + "No Changes": "لا توجد تغييرات", + "No Crop Area": "لا توجد منطقة قص", + "No File": "لا يوجد ملف", + "No Files": "لا توجد ملفات", + "No Images Found": "لم يتم العثور على صور", + "No PDF Files": "لا توجد ملفات PDF", + "No PDF document loaded": "لم يتم تحميل مستند PDF", + "No PDF document loaded.": "لم يتم تحميل مستند PDF.", + "No PDF file loaded.": "لم يتم تحميل ملف PDF.", + "No PDF files could be decrypted. The password may be incorrect.": "تعذر فك تشفير أي ملف PDF. قد تكون كلمة المرور غير صحيحة.", + "No PDF files could be linearized.": "تعذر تحسين أي ملف PDF للعرض السريع.", + "No PDFs could be processed.": "تعذرت معالجة أي ملف PDF.", + "No Pages": "لا توجد صفحات", + "No Selection": "لا يوجد تحديد", + "No Signatures Found": "لم يتم العثور على توقيعات", + "No Tables Found": "لم يتم العثور على جداول", + "No Text": "لا يوجد نص", + "No URL configured": "لم يتم تكوين رابط", + "No attachments found in this PDF.": "لم يتم العثور على مرفقات في ملف PDF هذا.", + "No attachments selected for removal.": "لم يتم تحديد مرفقات للإزالة.", + "No blank pages detected in this PDF.": "لم يتم اكتشاف صفحات فارغة في ملف PDF هذا.", + "No bookmarks found at the selected level.": "لم يتم العثور على إشارات مرجعية في المستوى المحدد.", + "No bookmarks to delete.": "لا توجد إشارات مرجعية للحذف.", + "No bookmarks to export!": "لا توجد إشارات مرجعية للتصدير!", + "No certificate found in PEM file": "لم يتم العثور على شهادة في ملف PEM", + "No certificate found in PFX file": "لم يتم العثور على شهادة في ملف PFX", + "No certificates found in signature": "لم يتم العثور على شهادات في التوقيع", + "No changes match the current filter.": "لا توجد تغييرات تطابق المرشح الحالي.", + "No configurable settings for this node.": "لا توجد إعدادات قابلة للضبط لهذه العقدة.", + "No differences detected on this page.": "لم يتم اكتشاف فروقات في هذه الصفحة.", + "No embedded images were found in the selected PDF(s).": "لم يتم العثور على صور مضمّنة في ملفات PDF المحددة.", + "No existing bookmarks found in this PDF.": "لم يتم العثور على إشارات مرجعية موجودة في ملف PDF هذا.", + "No items were selected for removal or none were found in the PDF.": "لم يتم تحديد أي عناصر للإزالة أو لم يتم العثور عليها في PDF.", + "No page pairs to export.": "لا توجد أزواج صفحات للتصدير.", + "No pages found. Please create a blank PDF or upload one.": "لم يتم العثور على صفحات. يرجى إنشاء PDF فارغ أو رفع ملف.", + "No pages selected for removal.": "لم يتم تحديد صفحات للإزالة.", + "No pages were selected for splitting.": "لم يتم تحديد صفحات للتقسيم.", + "No paired page for this side.": "لا توجد صفحة مقابلة لهذا الجانب.", + "No private key found in PEM file": "لم يتم العثور على مفتاح خاص في ملف PEM", + "No private key found in PFX file": "لم يتم العثور على مفتاح خاص في ملف PFX", + "No tables were detected in this PDF.": "لم يتم اكتشاف جداول في ملف PDF هذا.", + "No valid page numbers found.": "لم يتم العثور على أرقام صفحات صالحة.", + "No valid pages to save.": "لا توجد صفحات صالحة للحفظ.", + "No worker": "لا يوجد عامل معالجة", + "Noise": "تشويش", + "None": "بدون", + "None of the files could be compressed: {{join}}.": "تعذر ضغط أي من الملفات: {{join}}.", + "Normal": "عادي", + "Not Enough Files": "عدد الملفات غير كافٍ", + "Not a PDF": "ليس ملف PDF", + "Not connected": "غير متصل", + "Not in trust chain": "ليس ضمن سلسلة الثقة", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "ملاحظة: بدون كلمة مرور مالك منفصلة، لا تكون لملف PDF أي قيود استخدام.", + "Number Format": "صيغة الأرقام", + "Number of Pages": "عدد الصفحات", + "OCR": "OCR", + "OCR aborted before any page was processed": "تم إيقاف OCR قبل معالجة أي صفحة", + "OCR recognize timed out after {{timeoutMs}}ms": "انتهت مهلة التعرف في OCR بعد {{timeoutMs}} مللي ثانية", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ملفات ODG", + "ODG to PDF": "ODG إلى PDF", + "OK": "موافق", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "إيقاف (الافتراضي): ترقيم طبيعي من 1 إلى N. تشغيل: يتم الإبقاء على تسميات الصفحات الأصلية لكل ملف (قد تنتج تسميات مكررة).", + "One PDF per page": "ملف PDF لكل صفحة", + "One PDF per range": "ملف PDF لكل نطاق", + "Only a substitute font was available": "كان متاحًا خط بديل فقط", + "Only where it does not change how the image looks.": "فقط حيث لا يغيّر ذلك مظهر الصورة.", + "Opacity": "الشفافية", + "Open URL": "فتح الرابط", + "Opens incognito window": "يفتح نافذة التصفح المتخفي", + "Opens new tab": "يفتح تبويبًا جديدًا", + "Opens new window": "يفتح نافذة جديدة", + "Operation Failed": "فشلت العملية", + "Operation resulted in an empty file.": "أدت العملية إلى ملف فارغ.", + "Optimize PDF for fast web viewing": "تحسين PDF للعرض السريع على الويب", + "Optimizing PDFs for web view (linearizing)...": "جارٍ تحسين ملفات PDF للعرض على الويب (التحسين للعرض السريع)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "جارٍ تحسين {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "الخيارات (واحد في كل سطر أو مفصولة بفواصل)", + "Orientation": "الاتجاه", + "Outline": "المخطط", + "Output": "الإخراج", + "Overlay": "طبقة علوية", + "Overlay or underlay pages from one PDF onto another": "وضع صفحات من ملف PDF كطبقة علوية أو سفلية فوق ملف آخر", + "Owner Password": "كلمة مرور المالك", + "Owner Password Required": "كلمة مرور المالك مطلوبة", + "PDF": "PDF", + "PDF Files": "ملفات PDF", + "PDF Input": "إدخال PDF", + "PDF Layers": "طبقات PDF", + "PDF Metadata": "البيانات الوصفية لـ PDF", + "PDF Producer": "منتج PDF", + "PDF converted to CSV successfully!": "تم تحويل PDF إلى CSV بنجاح!", + "PDF converted to SVG successfully!": "تم تحويل PDF إلى SVG بنجاح!", + "PDF converted to greyscale successfully!": "تم تحويل PDF إلى تدرج الرمادي بنجاح!", + "PDF created successfully!": "تم إنشاء PDF بنجاح!", + "PDF decrypted successfully! All encryption and restrictions removed.": "تم فك تشفير PDF بنجاح! أُزيل كل التشفير والقيود.", + "PDF decrypted successfully! Your download has started.": "تم فك تشفير PDF بنجاح! بدأ التنزيل.", + "PDF downloaded successfully.": "تم تنزيل PDF بنجاح.", + "PDF encrypted successfully with 256-bit AES!": "تم تشفير PDF بنجاح باستخدام AES بطول 256 بت!", + "PDF has been sanitized and downloaded.": "تمت تنقية PDF وتنزيله.", + "PDF has no pages": "لا يحتوي PDF على صفحات", + "PDF organized successfully!": "تم تنظيم PDF بنجاح!", + "PDF permissions changed successfully!": "تم تغيير أذونات PDF بنجاح!", + "PDF readers supply the 14 standard PDF fonts themselves.": "قارئات PDF توفّر خطوط PDF القياسية الـ 14 بنفسها.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "تمت إزالة قيود PDF بنجاح! أصبح الملف قابلًا للتعديل والطباعة بالكامل.", + "PDF saved successfully!": "تم حفظ PDF بنجاح!", + "PDF split successfully!": "تم تقسيم PDF بنجاح!", + "PDF to CSV": "PDF إلى CSV", + "PDF to DOCX": "PDF إلى DOCX", + "PDF to Excel/CSV": "PDF إلى Excel/CSV", + "PDF to Images": "PDF إلى صور", + "PDF to Images (High Quality)": "PDF إلى صور (جودة عالية)", + "PDF to JSON": "PDF إلى JSON", + "PDF to Markdown": "PDF إلى Markdown", + "PDF to PDF/A": "PDF إلى PDF/A", + "PDF to SVG": "PDF إلى SVG", + "PDF to Text": "PDF إلى نص", + "PDF to XLSX": "PDF إلى XLSX", + "PDF with layer changes saved!": "تم حفظ PDF مع تغييرات الطبقات!", + "PDF {{modeLabel}} applied successfully.": "تم تطبيق {{modeLabel}} على PDF بنجاح.", + "PDF/A Conversion": "تحويل PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (صارم، بدون شفافية)", + "PDF/A-2b (Recommended)": "PDF/A-2b (موصى به)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (حديث، يسمح بالمرفقات)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "تم دمج ملفات PDF بالتناوب بنجاح!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (بلا فقدان)", + "PUB to PDF": "PUB إلى PDF", + "Page": "الصفحة", + "Page #": "رقم الصفحة #", + "Page Added": "تمت إضافة صفحة", + "Page Numbers": "أرقام الصفحات", + "Page Removed": "تمت إزالة صفحة", + "Page Size": "حجم الصفحة", + "Page X of Y": "الصفحة X من Y", + "Page background or layout changed": "تغيّرت خلفية الصفحة أو تخطيطها", + "Page container not found": "حاوية الصفحة غير موجودة", + "Page extraction produced an empty PDF.": "أنتج استخراج الصفحات ملف PDF فارغًا.", + "Page number": "رقم الصفحة", + "Page numbers added successfully!": "تمت إضافة أرقام الصفحات بنجاح!", + "Page sizes standardized successfully!": "تم توحيد أحجام الصفحات بنجاح!", + "Page {{currentPageNum}} of {{numPages}}": "الصفحة {{currentPageNum}} من {{numPages}}", + "Page {{num}} / {{numPages}}": "الصفحة {{num}} / {{numPages}}", + "Page {{n}} ": "الصفحة {{n}} ", + "Page {{n}} of {{length}}": "الصفحة {{n}} من {{length}}", + "Page {{n}}:": "الصفحة {{n}}:", + "Page {{pageNumber}}": "الصفحة {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "الصفحة {{pageNumber}} موجودة في ملف PDF الأول فقط.", + "Page {{pageNumber}} exists only in the second PDF.": "الصفحة {{pageNumber}} موجودة في ملف PDF الثاني فقط.", + "Page {{pageNumber}} of {{totalPages}}": "الصفحة {{pageNumber}} من {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "الصفحة {{pageNum}} غير موجودة في ملف PDF هذا.", + "Page {{page}}": "الصفحة {{page}}", + "Page {{page}} attachment": "مرفق الصفحة {{page}}", + "Pages": "الصفحات", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "الصفحات (مثل 1-3, 5) - الإجمالي: {{pageCount}}", + "Pages Files": "ملفات Pages", + "Pages Per Sheet": "الصفحات في الورقة", + "Pages combined successfully!": "تم دمج الصفحات بنجاح!", + "Pages have been divided successfully!": "تم تقسيم الصفحات بنجاح!", + "Pages have been reordered.": "تمت إعادة ترتيب الصفحات.", + "Pages have been reversed successfully!": "تم عكس ترتيب الصفحات بنجاح!", + "Pages to PDF": "Pages إلى PDF", + "Paper Size": "حجم الورق", + "Paragraph": "الفقرة", + "Parsing XML structure...": "جارٍ تحليل بنية XML...", + "Parsing {{name}}...": "جارٍ تحليل {{name}}...", + "Partial Coverage": "تغطية جزئية", + "Partial Success": "نجاح جزئي", + "Password": "كلمة المرور", + "Password Error": "خطأ في كلمة المرور", + "Password Needed": "كلمة المرور مطلوبة", + "Password Required": "كلمة المرور مطلوبة", + "Password for all files": "كلمة مرور لجميع الملفات", + "Password for all locked files": "كلمة مرور لجميع الملفات المقفلة", + "Password for {{name}}": "كلمة مرور {{name}}", + "Password protected": "محمي بكلمة مرور", + "Password required for encrypted private key": "كلمة المرور مطلوبة للمفتاح الخاص المشفّر", + "Path Stroke": "حد المسار", + "Please add at least one field before downloading.": "يرجى إضافة حقل واحد على الأقل قبل التنزيل.", + "Please draw a rectangle on at least one page to select the crop area.": "يرجى رسم مستطيل على صفحة واحدة على الأقل لتحديد منطقة القص.", + "Please ensure all page numbers in the order are unique.": "يرجى التأكد من أن جميع أرقام الصفحات في الترتيب فريدة.", + "Please enter a layer name": "يرجى إدخال اسم الطبقة", + "Please enter a name.": "يرجى إدخال اسم.", + "Please enter a number between 0 and {{totalPages}}.": "يرجى إدخال رقم بين 0 و{{totalPages}}.", + "Please enter a page order.": "يرجى إدخال ترتيب الصفحات.", + "Please enter a password": "يرجى إدخال كلمة مرور", + "Please enter a password for {{i}} or skip it": "يرجى إدخال كلمة مرور لـ {{i}} أو تخطيه", + "Please enter a title.": "يرجى إدخال عنوان.", + "Please enter a user password.": "يرجى إدخال كلمة مرور المستخدم.", + "Please enter a valid number of pages (1 or more).": "يرجى إدخال عدد صفحات صالح (1 أو أكثر).", + "Please enter a valid page number between 1 and {{total}}": "يرجى إدخال رقم صفحة صالح بين 1 و{{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "يرجى إدخال نطاق صفحات صالح (مثل 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "يرجى إدخال أرقام الصفحات المراد استخراجها.", + "Please enter positive numbers.": "يرجى إدخال أرقام موجبة.", + "Please enter some text to convert.": "يرجى إدخال نص لتحويله.", + "Please enter text for the watermark.": "يرجى إدخال نص العلامة المائية.", + "Please enter the PDF password.": "يرجى إدخال كلمة مرور PDF.", + "Please load a PDF first.": "يرجى تحميل ملف PDF أولًا.", + "Please select PDF files to create a ZIP archive.": "يرجى اختيار ملفات PDF لإنشاء أرشيف ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "يرجى اختيار ملف شهادة بصيغة .pem أو .crt أو .cer أو .der.", + "Please select a PDF file.": "يرجى اختيار ملف PDF.", + "Please select a valid PDF file.": "يرجى اختيار ملف PDF صالح.", + "Please select an area on at least one page to crop.": "يرجى تحديد منطقة على صفحة واحدة على الأقل للقص.", + "Please select an area to crop first.": "يرجى تحديد منطقة للقص أولًا.", + "Please select an area to crop.": "يرجى تحديد منطقة للقص.", + "Please select an image file for the watermark.": "يرجى اختيار ملف صورة للعلامة المائية.", + "Please select at least one BMP file.": "يرجى اختيار ملف BMP واحد على الأقل.", + "Please select at least one CSV file.": "يرجى اختيار ملف CSV واحد على الأقل.", + "Please select at least one Excel file.": "يرجى اختيار ملف Excel واحد على الأقل.", + "Please select at least one HEIC file.": "يرجى اختيار ملف HEIC واحد على الأقل.", + "Please select at least one JPG file.": "يرجى اختيار ملف JPG واحد على الأقل.", + "Please select at least one JPG or JPEG2000 image.": "يرجى اختيار صورة JPG أو JPEG2000 واحدة على الأقل.", + "Please select at least one ODT file.": "يرجى اختيار ملف ODT واحد على الأقل.", + "Please select at least one PDF file.": "يرجى اختيار ملف PDF واحد على الأقل.", + "Please select at least one PowerPoint file.": "يرجى اختيار ملف PowerPoint واحد على الأقل.", + "Please select at least one RTF file.": "يرجى اختيار ملف RTF واحد على الأقل.", + "Please select at least one SVG file.": "يرجى اختيار ملف SVG واحد على الأقل.", + "Please select at least one TIFF file.": "يرجى اختيار ملف TIFF واحد على الأقل.", + "Please select at least one Word document.": "يرجى اختيار مستند Word واحد على الأقل.", + "Please select at least one file to attach.": "يرجى اختيار ملف واحد على الأقل لإرفاقه.", + "Please select at least one image file.": "يرجى اختيار ملف صورة واحد على الأقل.", + "Please select at least one text file.": "يرجى اختيار ملف نصي واحد على الأقل.", + "Please select at least one {{FILETYPE_NAME}} file.": "يرجى اختيار ملف {{FILETYPE_NAME}} واحد على الأقل.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "يرجى اختيار ملف {{TOOL_NAME}} واحد على الأقل (.eml أو .msg).", + "Please select at least one {{TOOL_NAME}} file.": "يرجى اختيار ملف {{TOOL_NAME}} واحد على الأقل.", + "Please select even or odd pages.": "يرجى اختيار الصفحات الزوجية أو الفردية.", + "Please select one or more PDF files.": "يرجى اختيار ملف PDF واحد أو أكثر.", + "Please select pages to delete.": "يرجى اختيار الصفحات المراد حذفها.", + "Please select pages to duplicate.": "يرجى اختيار الصفحات المراد تكرارها.", + "Please select pages to mark for splitting.": "يرجى اختيار الصفحات المراد تحديدها للتقسيم.", + "Please select pages to rotate.": "يرجى اختيار الصفحات المراد تدويرها.", + "Please specify a page range for page-level attachments.": "يرجى تحديد نطاق صفحات للمرفقات على مستوى الصفحة.", + "Please upload PDF files.": "يرجى رفع ملفات PDF.", + "Please upload PDFs first.": "يرجى رفع ملفات PDF أولًا.", + "Please upload a .docx file first.": "يرجى رفع ملف .docx أولًا.", + "Please upload a PDF file first.": "يرجى رفع ملف PDF أولًا.", + "Please upload a PDF file.": "يرجى رفع ملف PDF.", + "Please upload a PDF first.": "يرجى رفع ملف PDF أولًا.", + "Please upload a valid PDF file.": "يرجى رفع ملف PDF صالح.", + "Please upload at least one PDF file.": "يرجى رفع ملف PDF واحد على الأقل.", + "Please upload at least two PDF files to alternate and mix.": "يرجى رفع ملفي PDF على الأقل للتبديل والدمج.", + "Please upload both a base PDF and an overlay/underlay PDF.": "يرجى رفع ملف PDF أساسي وملف PDF للطبقة العلوية/السفلية.", + "Please upload valid PDF files.": "يرجى رفع ملفات PDF صالحة.", + "Please use the Download button in the PDF viewer toolbar above.": "يرجى استخدام زر التنزيل في شريط أدوات عارض PDF أعلاه.", + "Please wait for the PDF viewer to load.": "يرجى الانتظار حتى يتم تحميل عارض PDF.", + "Please wait for the form to finish loading.": "يرجى الانتظار حتى ينتهي تحميل النموذج.", + "Portrait": "عمودي", + "Position": "الموضع", + "Post-processing for transparency compliance...": "معالجة لاحقة للتوافق مع الشفافية...", + "Posterize": "تقليل الألوان (Posterize)", + "Posterizing PDF...": "جارٍ تقليل ألوان PDF...", + "PowerPoint to PDF": "PowerPoint إلى PDF", + "Pre Flatten": "تسطيح مسبق", + "Pre-flattening PDF...": "جارٍ التسطيح المسبق لـ PDF...", + "Prefer JPEG 2000 for photos": "تفضيل JPEG 2000 للصور الفوتوغرافية", + "Preparing PDF export...": "جارٍ تجهيز تصدير PDF...", + "Preparing conversion...": "جارٍ تجهيز التحويل...", + "Preparing download...": "جارٍ تجهيز التنزيل...", + "Preparing preview...": "جارٍ تجهيز المعاينة...", + "Presentations": "العروض التقديمية", + "Preserve PDF/A": "الحفاظ على PDF/A", + "Preview": "معاينة", + "Preview Error": "خطأ في المعاينة", + "Preview Text": "معاينة النص", + "Previous page": "الصفحة السابقة", + "Print Form": "طباعة النموذج", + "Private data that editing apps store inside the PDF.": "بيانات خاصة تخزنها تطبيقات التحرير داخل PDF.", + "Processed {{processedCount}} PDFs.": "تمت معالجة {{processedCount}} من ملفات PDF.", + "Processing Complete": "اكتملت المعالجة", + "Processing Dpi": "DPI المعالجة", + "Processing Failed": "فشلت المعالجة", + "Processing PDF permissions...": "جارٍ معالجة أذونات PDF...", + "Processing attachments...": "جارٍ معالجة المرفقات...", + "Processing failed for {{name}}.": "فشلت معالجة {{name}}.", + "Processing file {{n}} of {{length}}...": "جارٍ معالجة الملف {{n}} من {{length}}...", + "Processing images...": "جارٍ معالجة الصور...", + "Processing multiple PDFs...": "جارٍ معالجة عدة ملفات PDF...", + "Processing page {{i}} of {{numPages}}": "جارٍ معالجة الصفحة {{i}} من {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "جارٍ معالجة الصفحة {{i}} من {{numPages}}...", + "Processing page {{n}} of {{length}}...": "جارٍ معالجة الصفحة {{n}} من {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "جارٍ معالجة الصفحة {{pageNum}} من {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "جارٍ معالجة الصفحة {{pageNum}} من {{totalPages}}...", + "Processing produced an empty file.": "أنتجت المعالجة ملفًا فارغًا.", + "Processing resulted in an empty file.": "أدت المعالجة إلى ملف فارغ.", + "Processing sheet {{n}}...": "جارٍ معالجة الورقة {{n}}...", + "Processing {{name}}...": "جارٍ معالجة {{name}}...", + "Processing {{nodeName}}...": "جارٍ معالجة {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "جارٍ معالجة {{n}}/{{length}}: {{name}}...", + "Processing...": "جارٍ المعالجة...", + "Producer": "المُنتِج", + "Publisher Files": "ملفات Publisher", + "Purple": "بنفسجي", + "PyMuPDF (Document Processing)": "PyMuPDF (معالجة المستندات)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF غير مهيأ. يرجى تهيئته في الإعدادات المتقدمة.", + "PyMuPDF module did not export expected PyMuPDF class.": "لم تصدّر وحدة PyMuPDF الصنف PyMuPDF المتوقع.", + "PyMuPDF produced an empty decrypted file.": "أنتج PyMuPDF ملفًا مفكوك التشفير فارغًا.", + "PyMuPDF: not configured.": "PyMuPDF: غير مهيأ.", + "QR Code": "رمز QR", + "Quality": "الجودة", + "Quits application (cannot be overridden)": "يغلق التطبيق (لا يمكن تجاوزه)", + "RSA-PKCS1 signature does not verify against signer public key": "توقيع RSA-PKCS1 لا يطابق المفتاح العام للموقّع", + "RSA-PSS signature does not verify against signer public key": "توقيع RSA-PSS لا يطابق المفتاح العام للموقّع", + "Rasterization Complete": "اكتمل التحويل إلى صور نقطية", + "Rasterization Partial": "تحويل جزئي إلى صور نقطية", + "Rasterize": "تحويل إلى صور نقطية", + "Rasterize Dpi": "DPI التحويل إلى صور نقطية", + "Rasterize pages to images": "تحويل الصفحات إلى صور نقطية", + "Rasterize quality": "جودة التحويل إلى صور نقطية", + "Rasterize resolution (DPI)": "دقة التحويل إلى صور نقطية (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "تم تحويل {{completed}} من ملفات PDF إلى صور نقطية، وفشل {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "جارٍ تحويل {{name}} إلى صور نقطية ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "جارٍ تحويل {{name}} إلى صور نقطية...", + "Rasterizing...": "جارٍ التحويل إلى صور نقطية...", + "Rating must be between 0 and 5": "يجب أن يكون التقييم بين 0 و5", + "Read Only": "للقراءة فقط", + "Reading CSV file...": "جارٍ قراءة ملف CSV...", + "Reading PDF...": "جارٍ قراءة PDF...", + "Reading XML file...": "جارٍ قراءة ملف XML...", + "Reading encrypted PDF...": "جارٍ قراءة PDF المشفّر...", + "Reading files...": "جارٍ قراءة الملفات...", + "Reading layer configuration...": "جارٍ قراءة إعدادات الطبقات...", + "Reading {{name}} ({{n}}/{{length}})...": "جارٍ قراءة {{name}} ({{n}}/{{length}})...", + "Ready": "جاهز", + "Reason": "السبب", + "Red": "أحمر", + "Redact": "تنقيح", + "Redact Mode": "وضع التنقيح", + "Redact text from PDF": "تنقيح النص من PDF", + "Redaction Failed": "فشل التنقيح", + "Reduce PDF file size": "تقليل حجم ملف PDF", + "Reduce color complexity": "تقليل تعقيد الألوان", + "Reduces file size by removing color information.": "يقلل حجم الملف بإزالة معلومات الألوان.", + "Reloads page": "يعيد تحميل الصفحة", + "Remove": "إزالة", + "Remove All Attachments": "إزالة جميع المرفقات", + "Remove Annotations": "إزالة التعليقات التوضيحية", + "Remove Blank Pages": "إزالة الصفحات الفارغة", + "Remove Embedded Files": "إزالة الملفات المضمّنة", + "Remove Fonts": "إزالة الخطوط", + "Remove Javascript": "إزالة Javascript", + "Remove Layers": "إزالة الطبقات", + "Remove Links": "إزالة الروابط", + "Remove Mark Info": "إزالة Mark Info", + "Remove Metadata": "إزالة البيانات الوصفية", + "Remove PDF password protection": "إزالة حماية PDF بكلمة المرور", + "Remove Structure Tree": "إزالة شجرة البنية", + "Remove alternate images": "إزالة الصور البديلة", + "Remove application data": "إزالة بيانات التطبيقات", + "Remove article threads": "إزالة سلاسل المقالات", + "Remove attachment": "إزالة المرفق", + "Remove blank pages automatically": "إزالة الصفحات الفارغة تلقائيًا", + "Remove document structure tree": "إزالة شجرة بنية المستند", + "Remove file": "إزالة الملف", + "Remove metadata, scripts, and hidden data": "إزالة البيانات الوصفية والسكربتات والبيانات المخفية", + "Remove output intents": "إزالة نوايا الإخراج", + "Remove page thumbnails": "إزالة الصور المصغرة للصفحات", + "Remove specific pages": "إزالة صفحات محددة", + "Remove web capture information": "إزالة معلومات التقاط الويب", + "Remove {{name}}": "إزالة {{name}}", + "Removed \"{{beforeText}}\"": "تمت إزالة \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "تمت إزالة صورة ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "تمت إزالة {{length}} من الصفحات الفارغة بنجاح!", + "Removing all metadata...": "جارٍ إزالة جميع البيانات الوصفية...", + "Removing annotations...": "جارٍ إزالة التعليقات التوضيحية...", + "Removing redacted text from document data...": "جارٍ إزالة النص المنقّح من بيانات المستند...", + "Removing restrictions...": "جارٍ إزالة القيود...", + "Removing {{length}} blank page(s)...": "جارٍ إزالة {{length}} من الصفحات الفارغة...", + "Render Error": "خطأ في العرض", + "Rendering Page {{num}}...": "جارٍ عرض الصفحة {{num}}...", + "Rendering page previews...": "جارٍ عرض معاينات الصفحات...", + "Rendering page previews: {{current}}/{{total}}": "جارٍ عرض معاينات الصفحات: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "جارٍ عرض الصفحة {{n}} من {{length}}...", + "Rendering preview for page {{pageNum}}...": "جارٍ عرض معاينة الصفحة {{pageNum}}...", + "Reopens closed tab": "يعيد فتح التبويب المغلق", + "Repair": "إصلاح", + "Repair Failed": "فشل الإصلاح", + "Repair corrupted PDF": "إصلاح PDF التالف", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "تم إصلاح {{length}} من الملفات. تعذر إصلاح: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "جارٍ إصلاح {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "جارٍ إصلاح {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "تم استبدال \"{{beforeText}}\" بـ \"{{afterText}}\"", + "Required": "مطلوب", + "Resamples even when an image is only slightly above the limit.": "يعيد أخذ العينات حتى لو تجاوزت الصورة الحد بقدر طفيف.", + "Reset Form": "إعادة تعيين النموذج", + "Reset and go back to file uploader? All unsaved changes will be lost.": "هل تريد إعادة التعيين والعودة إلى رفع الملفات؟ ستفقد جميع التغييرات غير المحفوظة.", + "Resolution": "الدقة", + "Retain Page Labels": "الإبقاء على تسميات الصفحات", + "Retry Failed": "إعادة محاولة الفاشل", + "Reverse Pages": "عكس الصفحات", + "Reverse page order": "عكس ترتيب الصفحات", + "Reversing page order...": "جارٍ عكس ترتيب الصفحات...", + "Reversing {{name}} ({{n}}/{{length}})...": "جارٍ عكس ترتيب {{name}} ({{n}}/{{length}})...", + "Right": "يمين", + "Right edge in points": "الحافة اليمنى بالنقاط", + "Rotate": "تدوير", + "Rotate +90°": "تدوير +90°", + "Rotate all pages": "تدوير جميع الصفحات", + "Rotation": "التدوير", + "Rotation Variance": "تباين التدوير", + "Rotations applied successfully!": "تم تطبيق التدويرات بنجاح!", + "Rows": "الصفوف", + "Run Javascript": "تشغيل Javascript", + "Running OCR on page {{pageNum}}...": "جارٍ تشغيل OCR على الصفحة {{pageNum}}...", + "Running...": "قيد التشغيل...", + "SVG": "SVG", + "SVG Files": "ملفات SVG", + "SVG to PDF": "SVG إلى PDF", + "Sanitize": "تنقية", + "Sanitized With Warnings": "تمت التنقية مع تحذيرات", + "Sanitizing PDF...": "جارٍ تنقية PDF...", + "Saturation": "التشبع", + "Saved": "تم الحفظ", + "Saving PDF with layer changes...": "جارٍ حفظ PDF مع تغييرات الطبقات...", + "Scaling Mode": "وضع التحجيم", + "Scanner Effect": "تأثير الماسح الضوئي", + "Scanner effect applied successfully!": "تم تطبيق تأثير الماسح الضوئي بنجاح!", + "Scanning page {{n}} of {{pageCount}}...": "جارٍ فحص الصفحة {{n}} من {{pageCount}}...", + "Search Text": "بحث في النص", + "Search languages...": "البحث عن لغات...", + "Select Font": "اختر الخط", + "Select a field to edit properties": "اختر حقلًا لتعديل خصائصه", + "Select a field...": "اختر حقلًا...", + "Select to add this button to an existing group": "حدّد لإضافة هذا الزر إلى مجموعة موجودة", + "Selected Option": "الخيار المحدد", + "Self-Signed: Signer Identity Not Verified": "موقّع ذاتيًا: لم يتم التحقق من هوية الموقّع", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "موارد OCR المستضافة ذاتيًا مهيأة جزئيًا. اضبط {{missing}} مع روابط موارد Tesseract الأخرى.", + "Separator": "الفاصل", + "Separator Color": "لون الفاصل", + "Separator Thickness": "سمك الفاصل", + "Sepia": "بني داكن (سيبيا)", + "Serial Number:": "الرقم التسلسلي:", + "Set custom destination": "تعيين وجهة مخصصة", + "Shapes": "الأشكال", + "Sheet {{n}} {{sideLabel}}": "الورقة {{n}} {{sideLabel}}", + "Show": "إظهار", + "Show password": "إظهار كلمة المرور", + "Show/Hide Field": "إظهار/إخفاء الحقل", + "Sign Here": "وقّع هنا", + "Signature /Contents is not a single DER object followed by zero padding": "محتويات التوقيع /Contents ليست كائن DER واحدًا يتبعه حشو من الأصفار", + "Signature Algorithm:": "خوارزمية التوقيع:", + "Signature Intact: Signer Identity Not Verified": "التوقيع سليم: لم يتم التحقق من هوية الموقّع", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "حقول التوقيع هي حقول توقيع AcroForm ولن تكون مرئية إلا في عارض PDF متقدم.", + "Signature has a missing or malformed /ByteRange": "التوقيع يفتقد /ByteRange أو أنه مشوّه", + "Signature scheme {{kind}} not implemented": "مخطط التوقيع {{kind}} غير مدعوم", + "Signature {{n}}": "التوقيع {{n}}", + "Signatures": "التوقيعات", + "Signed By": "وقّعه", + "Signed On": "تاريخ التوقيع", + "Signed PDF Not Changed": "لم يتغير PDF الموقّع", + "Signed PDF downloaded successfully!": "تم تنزيل PDF الموقّع بنجاح!", + "Signed PDF saved successfully!": "تم حفظ PDF الموقّع بنجاح!", + "Simple (1, 2, 3)": "بسيط (1، 2، 3)", + "Simplify large color profiles": "تبسيط ملفات تعريف الألوان الكبيرة", + "Skew Threshold": "حد الميل", + "Skip": "تخطي", + "Skip All": "تخطي الكل", + "Skip Remaining": "تخطي المتبقي", + "Skip this file": "تخطي هذا الملف", + "Skipped: {{join}}.": "تم التخطي: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "ملفات أصغر، لكن لا يفتحها إلا القارئات التي تدعم Brotli، مثل Firefox وMuPDF 1.26+ وGhostscript 10.06+.", + "Some files were skipped because they are not supported images.": "تم تخطي بعض الملفات لأنها ليست صورًا مدعومة.", + "Some files were skipped. Only BMP files are allowed.": "تم تخطي بعض الملفات. يُسمح بملفات BMP فقط.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "تم تخطي بعض الملفات. يُسمح بملفات HEIC/HEIF فقط.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "تم تخطي بعض الملفات. يُسمح بملفات JPG وJPEG وJP2 وJPX فقط.", + "Some files were skipped. Only PDF files are allowed.": "تم تخطي بعض الملفات. يُسمح بملفات PDF فقط.", + "Some files were skipped. Only PNG images are allowed.": "تم تخطي بعض الملفات. يُسمح بصور PNG فقط.", + "Some files were skipped. Only SVG graphics are allowed.": "تم تخطي بعض الملفات. يُسمح برسومات SVG فقط.", + "Some files were skipped. Only TIFF files are allowed.": "تم تخطي بعض الملفات. يُسمح بملفات TIFF فقط.", + "Some files were skipped. Only WebP images are allowed.": "تم تخطي بعض الملفات. يُسمح بصور WebP فقط.", + "Some files were skipped. Only supported image formats are allowed.": "تم تخطي بعض الملفات. يُسمح بصيغ الصور المدعومة فقط.", + "Some files were skipped. Only text files are allowed.": "تم تخطي بعض الملفات. يُسمح بالملفات النصية فقط.", + "Some pages could not be processed. Please try again.": "تعذرت معالجة بعض الصفحات. يرجى المحاولة مرة أخرى.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "تعذر تطبيق بعض علامات التنقيح، لذلك لم يتم تنزيل الملف. طبّقها أو أزلها في المحرر ثم حاول مرة أخرى.", + "Spacing": "التباعد", + "Split PDF": "تقسيم PDF", + "Split by Bookmarks": "التقسيم حسب الإشارات المرجعية", + "Split pages into tile grid for poster printing": "تقسيم الصفحات إلى شبكة من البلاطات لطباعة الملصقات", + "Split pages vertically or horizontally": "تقسيم الصفحات عموديًا أو أفقيًا", + "Splitting PDF pages...": "جارٍ تقسيم صفحات PDF...", + "Splitting PDF...": "جارٍ تقسيم PDF...", + "Spreadsheets": "جداول البيانات", + "Standard (192 DPI)": "قياسية (192 DPI)", + "Standard Size": "الحجم القياسي", + "Standardize all pages to a target size": "توحيد جميع الصفحات إلى حجم مستهدف", + "Standardizing pages...": "جارٍ توحيد الصفحات...", + "Stitch all pages into one continuous page": "دمج كل الصفحات في صفحة واحدة متصلة", + "Straighten skewed PDF pages": "تقويم صفحات PDF المائلة", + "Strip all annotations": "إزالة جميع التعليقات التوضيحية", + "Style": "النمط", + "Style Changed": "تم تغيير النمط", + "Style changed ({{length}} regions)": "تم تغيير النمط ({{length}} من المناطق)", + "Subject": "الموضوع", + "Subset embedded fonts": "تقليص الخطوط المضمّنة إلى المستخدم منها فقط", + "Success": "تم بنجاح", + "Success!": "تم بنجاح!", + "Successfully converted {{length}} CSV file(s) to PDF.": "تم تحويل {{length}} من ملفات CSV إلى PDF بنجاح.", + "Successfully converted {{length}} Excel file(s) to PDF.": "تم تحويل {{length}} من ملفات Excel إلى PDF بنجاح.", + "Successfully converted {{length}} ODT file(s) to PDF.": "تم تحويل {{length}} من ملفات ODT إلى PDF بنجاح.", + "Successfully converted {{length}} PDF(s) to DOCX.": "تم تحويل {{length}} من ملفات PDF إلى DOCX بنجاح.", + "Successfully converted {{length}} PDF(s) to Markdown.": "تم تحويل {{length}} من ملفات PDF إلى Markdown بنجاح.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "تم تحويل {{length}} من ملفات PDF إلى {{level}} بنجاح.", + "Successfully converted {{length}} PSD files to a single PDF.": "تم تحويل {{length}} من ملفات PSD إلى ملف PDF واحد بنجاح.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "تم تحويل {{length}} من ملفات PowerPoint إلى PDF بنجاح.", + "Successfully converted {{length}} RTF file(s) to PDF.": "تم تحويل {{length}} من ملفات RTF إلى PDF بنجاح.", + "Successfully converted {{length}} Word document(s) to PDF.": "تم تحويل {{length}} من مستندات Word إلى PDF بنجاح.", + "Successfully converted {{length}} files to PDF.": "تم تحويل {{length}} من الملفات إلى PDF بنجاح.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "تم تحويل {{length}} من ملفات {{TOOL_NAME}} إلى PDF بنجاح.", + "Successfully converted {{name}} to DOCX.": "تم تحويل {{name}} إلى DOCX بنجاح.", + "Successfully converted {{name}} to Markdown.": "تم تحويل {{name}} إلى Markdown بنجاح.", + "Successfully converted {{name}} to PDF.": "تم تحويل {{name}} إلى PDF بنجاح.", + "Successfully converted {{name}} to {{level}}.": "تم تحويل {{name}} إلى {{level}} بنجاح.", + "Successfully extracted PDF for AI/LLM use.": "تم استخراج PDF لاستخدام الذكاء الاصطناعي/النماذج اللغوية بنجاح.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "تم استخراج {{completed}} من ملفات PDF لاستخدام الذكاء الاصطناعي/النماذج اللغوية بنجاح.", + "Successfully rasterized PDF at {{dpi}} DPI.": "تم تحويل PDF إلى صور نقطية بدقة {{dpi}} DPI بنجاح.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "تم تحويل {{completed}} من ملفات PDF إلى صور نقطية بدقة {{dpi}} DPI بنجاح.", + "Supported: CBZ, CBR": "المدعوم: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "المدعوم: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "المدعوم: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "المدعوم: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "المدعوم: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "المدعوم: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "المدعوم: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "المدعوم: XPS, OXPS", + "Switches apps": "يبدّل بين التطبيقات", + "Switches tabs": "يبدّل بين التبويبات", + "Table of Contents": "جدول المحتويات", + "Table {{n}} (Page {{page}})": "الجدول {{n}} (الصفحة {{page}})", + "Tabloid": "Tabloid", + "Target Field": "الحقل المستهدف", + "Target Kilobytes": "الكيلوبايت المستهدفة", + "Target Not Reached": "لم يتم بلوغ الهدف", + "Target Size": "الحجم المستهدف", + "Technical Details": "تفاصيل تقنية", + "Temperature": "درجة الحرارة اللونية", + "Template \"{{name}}\" loaded.": "تم تحميل القالب \"{{name}}\".", + "Template \"{{name}}\" saved.": "تم حفظ القالب \"{{name}}\".", + "Text": "النص", + "Text Color": "لون النص", + "Text Files": "ملفات نصية", + "Text color changed successfully!": "تم تغيير لون النص بنجاح!", + "Text converted to PDF successfully!": "تم تحويل النص إلى PDF بنجاح!", + "Text extracted successfully!": "تم استخراج النص بنجاح!", + "Text to PDF": "نص إلى PDF", + "That password did not open any of the remaining files.": "كلمة المرور هذه لم تفتح أيًّا من الملفات المتبقية.", + "The PDF file(s) do not contain any attachments to extract.": "لا تحتوي ملفات PDF على أي مرفقات لاستخراجها.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "يحتوي PDF على {{totalPages}} صفحة، ولا يقبل القسمة بالتساوي على {{nValue}}. سيحتوي ملف PDF الأخير على {{remainder}} من الصفحات.", + "The PDF might be corrupted or password protected.": "قد يكون PDF تالفًا أو محميًا بكلمة مرور.", + "The PDF might be corrupted or password-protected.": "قد يكون PDF تالفًا أو محميًا بكلمة مرور.", + "The PDF might be corrupted.": "قد يكون PDF تالفًا.", + "The PDF viewer is still initializing.": "عارض PDF لا يزال قيد التهيئة.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "تم تنزيل PDF، لكن تعذر إكمال هذه الخطوات: {{join}}. قد يكون المحتوى الذي تشمله لا يزال في الملف.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "أعاد الرابط نوع محتوى غير متوقع: {{contentType}}. المتوقع ملف JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "البايتات المستثناة بواسطة /ByteRange ليست توقيعًا مشفّرًا بالنظام السداسي العشري بالضبط", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "البايتات المستثناة بواسطة /ByteRange ليست /Contents لهذا التوقيع", + "The compression engine returned an unreadable result.": "أعاد محرك الضغط نتيجة غير قابلة للقراءة.", + "The compression engine stopped unexpectedly.": "توقف محرك الضغط بشكل غير متوقع.", + "The current password you entered is incorrect. Please try again.": "كلمة المرور الحالية التي أدخلتها غير صحيحة. يرجى المحاولة مرة أخرى.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "أسماء الحقول التالية موجودة بالفعل في PDF المرفوع: {{conflictList}}. يرجى تغيير أسماء هذه الحقول قبل التنزيل.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "أسماء الحقول التالية مستخدمة أكثر من مرة: {{duplicateList}}. يرجى تغيير أسماء هذه الحقول لتكون فريدة قبل التنزيل.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "عدد الصفحات المحدد ({{length}}) لا يطابق العدد الحالي للصفحات في المستند ({{currentGridCount}}). يرجى تقديم ترتيب كامل لجميع الصفحات.", + "The password you entered is incorrect. Please try again.": "كلمة المرور التي أدخلتها غير صحيحة. يرجى المحاولة مرة أخرى.", + "The password you entered is wrong or the file is corrupted.": "كلمة المرور التي أدخلتها خاطئة أو أن الملف تالف.", + "The provided file could not be loaded as an image. It may be corrupted.": "تعذر تحميل الملف المقدَّم كصورة. قد يكون تالفًا.", + "The requested OCR language is not available: {{unavailableText}}.": "لغة OCR المطلوبة غير متاحة: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "ترتيب الصفحات المحدد ناقص أو يحتوي على أرقام صفحات غير صالحة. يرجى التأكد من تقديم موضع جديد لكل صفحة أصلية.", + "These files are not valid PDFs, so they were not added: {{names}}.": "هذه الملفات ليست ملفات PDF صالحة، لذلك لم تتم إضافتها: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "هذه الملفات محمية بكلمة مرور: {{names}}. أدخل كلمات مرورها على بطاقات الملفات أو أزلها، ثم اضغط مرة أخرى.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "يتضمن هذا الإصدار من BentoPDF بيانات OCR للغات {{availableText}} فقط.", + "This PDF does not contain any digital signatures.": "لا يحتوي ملف PDF هذا على أي توقيعات رقمية.", + "This PDF has no layers (OCG).": "لا يحتوي ملف PDF هذا على طبقات (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "ملف PDF هذا محمي بكلمة مرور. يرجى إدخال كلمة المرور الحالية للمتابعة.", + "This document contains pages with different dimensions:": "يحتوي هذا المستند على صفحات بأبعاد مختلفة:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "يحتوي هذا المستند على علامة تنقيح واحدة لم تُطبَّق بعد. إلى أن تُطبَّق العلامة، يبقى المحتوى الذي تحتها في الملف. هل تريد تطبيق كل العلامات والتنزيل؟", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "يحتوي هذا المستند على علامات تنقيح لم تُطبَّق بعد (العدد: {{count}}). إلى أن تُطبَّق العلامة، يبقى المحتوى الذي تحتها في الملف. هل تريد تطبيق كل العلامات والتنزيل؟", + "This feature requires {{name}} to be configured.": "تتطلب هذه الميزة تهيئة {{name}}.", + "This file is not a valid PDF.": "هذا الملف ليس PDF صالحًا.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "هذه الوحدة مرخّصة بموجب AGPL-3.0. بتهيئتها فإنك توافق على شروط ترخيصها.", + "This tool has been disabled": "تم تعطيل هذه الأداة", + "This tool is not available in your deployment. Contact your administrator for more information.": "هذه الأداة غير متاحة في نشرك. تواصل مع المسؤول لمزيد من المعلومات.", + "Threshold": "الحد", + "Tile": "تجزئة", + "Tile Gap X": "التباعد الأفقي بين البلاطات", + "Tile Gap Y": "التباعد الرأسي بين البلاطات", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "الختم الزمني", + "Timestamp Failed": "فشل الختم الزمني", + "Tint": "الصبغة", + "Title": "العنوان", + "To actually fill or change the options, use our PDF Form Filler tool.": "لملء الخيارات أو تغييرها فعليًا، استخدم أداة تعبئة نماذج PDF لدينا.", + "Toggle": "تبديل", + "Toggle style": "تبديل النمط", + "Toggle sync scroll": "تبديل التمرير المتزامن", + "Tool Unavailable": "الأداة غير متاحة", + "Tooltip / Help Text": "التلميح / نص المساعدة", + "Top": "أعلى", + "Top Center": "أعلى الوسط", + "Top Left": "أعلى اليسار", + "Top Right": "أعلى اليمين", + "Top edge in points": "الحافة العلوية بالنقاط", + "Total Pages": "إجمالي الصفحات", + "Transparent Background": "خلفية شفافة", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "يجرّب JPEG 2000 مقابل JPEG لكل صورة ويُبقي الأصغر.", + "Trim margins from all pages": "قص الهوامش من جميع الصفحات", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "التحقق من الثقة: تم التحقق من {{trustVerified}}/{{length}} من التوقيعات مقابل الشهادة المخصصة", + "Trusted": "موثوق", + "Trusted certificate loaded": "تم تحميل الشهادة الموثوقة", + "Tsa Url": "رابط TSA", + "Turns off quality, resolution and every other lossy image step.": "يوقف الجودة والدقة وكل خطوات الصور الأخرى ذات الفقد.", + "UPC-A": "UPC-A", + "URL": "الرابط", + "URL must start with http:// or https://": "يجب أن يبدأ الرابط بـ http:// أو https://", + "Ultra (384 DPI)": "فائقة (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "تعذر فك تشفير PDF بكلمة المرور المقدمة.", + "Unable to repair any of the uploaded PDF files.": "تعذر إصلاح أي من ملفات PDF المرفوعة.", + "Unembed standard fonts": "إلغاء تضمين الخطوط القياسية", + "Unembed standard-font look-alikes": "إلغاء تضمين الخطوط المشابهة للخطوط القياسية", + "Unexpected delimiter in content stream": "فاصل غير متوقع في تدفق المحتوى", + "Unexpected reply from the engine.": "رد غير متوقع من المحرك.", + "Uniform": "موحّد", + "Unique Page Sizes": "أحجام الصفحات الفريدة", + "Unknown": "غير معروف", + "Unknown error": "خطأ غير معروف", + "Unknown error occurred in worker.": "حدث خطأ غير معروف في العامل.", + "Unknown error occurred.": "حدث خطأ غير معروف.", + "Unlock": "فتح القفل", + "Unlock All": "فتح قفل الكل", + "Unlock Remaining ({{remaining}})": "فتح قفل المتبقي ({{remaining}})", + "Unlocked": "تم فتح القفل", + "Unlocked {{unlocked}} of {{length}} files.": "تم فتح قفل {{unlocked}} من {{length}} من الملفات.", + "Unlocking...": "جارٍ فتح القفل...", + "Unresolved optional content reference": "مرجع محتوى اختياري غير محلول", + "Unsupported ECDSA curve in signer certificate": "منحنى ECDSA غير مدعوم في شهادة الموقّع", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "صورة غير مدعومة. يرجى استخدام PNG أو JPG للعلامة المائية.", + "Unsupported digest OID {{digestOid}}": "معرّف تجزئة غير مدعوم {{digestOid}}", + "Unsupported file type: .{{ext}}": "نوع الملف غير مدعوم: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "معرّف خوارزمية توقيع غير مدعوم {{oid}}", + "Unterminated array or dictionary in content stream": "مصفوفة أو قاموس غير منتهٍ في تدفق المحتوى", + "Unterminated hex string in content stream": "سلسلة سداسية عشرية غير منتهية في تدفق المحتوى", + "Unterminated inline image in content stream": "صورة مضمّنة غير منتهية في تدفق المحتوى", + "Unterminated string in content stream": "سلسلة نصية غير منتهية في تدفق المحتوى", + "Unverified: Unsupported Signature Algorithm": "لم يتم التحقق: خوارزمية توقيع غير مدعومة", + "Updating metadata...": "جارٍ تحديث البيانات الوصفية...", + "Upload Certificate": "رفع الشهادة", + "Upload Comics": "رفع القصص المصورة", + "Upload Documents": "رفع المستندات", + "Upload EPUB Files": "رفع ملفات EPUB", + "Upload Email Files": "رفع ملفات البريد الإلكتروني", + "Upload FB2 Files": "رفع ملفات FB2", + "Upload Images": "رفع الصور", + "Upload JSON Files": "رفع ملفات JSON", + "Upload MOBI Files": "رفع ملفات MOBI", + "Upload Markdown Files": "رفع ملفات Markdown", + "Upload ODG Files": "رفع ملفات ODG", + "Upload PDFs": "رفع ملفات PDF", + "Upload PUB Files": "رفع ملفات PUB", + "Upload Pages Files": "رفع ملفات Pages", + "Upload Presentations": "رفع العروض التقديمية", + "Upload SVG Files": "رفع ملفات SVG", + "Upload Spreadsheets": "رفع جداول البيانات", + "Upload Text Files": "رفع ملفات نصية", + "Upload Visio Files": "رفع ملفات Visio", + "Upload WPD Files": "رفع ملفات WPD", + "Upload WPS Files": "رفع ملفات WPS", + "Upload XML Files": "رفع ملفات XML", + "Upload XPS Files": "رفع ملفات XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "ارفع ملف PDF وانقر على \"إنشاء المعاينة\" لرؤية تخطيط الكتيّب", + "Upload images and convert to PDF": "ارفع الصور وحوّلها إلى PDF", + "Upload one or more PDF files": "ارفع ملف PDF واحدًا أو أكثر", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "الأحرف الكبيرة A-Z والأرقام 0-9 والرموز - . $ / + % والمسافة", + "Use same password for all files": "استخدام نفس كلمة المرور لجميع الملفات", + "User Password": "كلمة مرور المستخدم", + "VSD to PDF": "VSD إلى PDF", + "Valid From": "صالحة من", + "Valid Signature": "توقيع صالح", + "Valid Until": "صالحة حتى", + "Validating {{n}} of {{length}}: {{name}}": "جارٍ التحقق من {{n}} من {{length}}: {{name}}", + "Validating...": "جارٍ التحقق...", + "Value": "القيمة", + "Value (e.g., Marketing)": "القيمة (مثل: التسويق)", + "Vertical": "رأسي", + "Viewer not ready": "العارض غير جاهز", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "العارض غير جاهز. يرجى رفع ملف PDF والانتظار حتى ينتهي تحميله.", + "Visibility": "الظهور", + "Visio Files": "ملفات Visio", + "WPD to PDF": "WPD إلى PDF", + "WPS Files": "ملفات WPS", + "WPS to PDF": "WPS إلى PDF", + "Watermark": "علامة مائية", + "Watermark added successfully!": "تمت إضافة العلامة المائية بنجاح!", + "Web Crypto API not available in this context": "واجهة Web Crypto API غير متاحة في هذا السياق", + "Web Crypto import/verify failed: {{error}}": "فشل استيراد/تحقق Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "القائمة البيضاء", + "Width ({{unit}})": "العرض ({{unit}})", + "Word": "Word", + "Word Documents": "مستندات Word", + "Word to PDF": "Word إلى PDF", + "WordPerfect Files": "ملفات WordPerfect", + "Worker crashed": "تعطل العامل", + "Worker error occurred. Check console for details.": "حدث خطأ في العامل. راجع وحدة التحكم للتفاصيل.", + "Workflow completed": "اكتمل سير العمل", + "Wrong password": "كلمة مرور خاطئة", + "Wrong password for: {{join}}": "كلمة المرور خاطئة لـ: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "كلمة المرور خاطئة أو تعذر فك تشفير \"{{name}}\".", + "X Position": "الموضع الأفقي (X)", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}، Y: {{pdfY}} ", + "XML Files": "ملفات XML", + "XML to PDF": "XML إلى PDF", + "XMP Metadata": "بيانات XMP الوصفية", + "XPS Files": "ملفات XPS", + "XPS to PDF": "XPS إلى PDF", + "Y Position": "الموضع الرأسي (Y)", + "Year must be between 1900 and 2100": "يجب أن تكون السنة بين 1900 و2100", + "Yellow": "أصفر", + "Yellowish": "مائل للاصفرار", + "You cannot delete the last page of the document.": "لا يمكنك حذف آخر صفحة في المستند.", + "Your PDF has been cropped and the download has started.": "تم قص PDF وبدأ التنزيل.", + "Your PDF has been downloaded successfully.": "تم تنزيل PDF بنجاح.", + "Your PDF has been posterized.": "تم تقليل ألوان PDF.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "تم تطبيق التنقيحات على الصفحات، لكن هذا الملف مشفّر، لذلك لا يستطيع BentoPDF إزالة نسخ النص المنقّح من خصائصه وإشاراته المرجعية ومرفقاته. للحصول على تنظيف كامل، نقّح نسخة غير مشفّرة ثم أضف كلمة مرور لاحقًا باستخدام حماية PDF. هل تريد التنزيل على أي حال؟", + "Your workflow needs at least one input node and one output node to run.": "يحتاج سير العمل إلى عقدة إدخال واحدة وعقدة إخراج واحدة على الأقل ليعمل.", + "ZIP archive created successfully!": "تم إنشاء أرشيف ZIP بنجاح!", + "Zoom(%)": "التكبير (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "مثال: dd/mm/yyyy HH:MM:ss", + "form": "نموذج", + "https://example.com": "https://example.com", + "signature found": "توقيع تم العثور عليه", + "signatures found": "توقيعات تم العثور عليها", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} عقدة", + "{{count}} nodes": "{{count}} من العقد", + "{{fileSize}} • 1 page": "{{fileSize}} • صفحة واحدة", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • عدد الصفحات: {{pageCount}}", + "{{length}} Files Need a Password": "{{length}} من الملفات تحتاج إلى كلمة مرور", + "{{length}} PDF file(s) selected": "تم تحديد {{length}} من ملفات PDF", + "{{length}} PDF files selected": "تم تحديد {{length}} من ملفات PDF", + "{{length}} attachment(s) extracted successfully!": "تم استخراج {{length}} من المرفقات بنجاح!", + "{{length}} file • {{totalPages}} total pages": "ملف {{length}} • {{totalPages}} صفحة إجمالًا", + "{{length}} file(s) attached successfully.": "تم إرفاق {{length}} من الملفات بنجاح.", + "{{length}} files • {{totalPages}} total pages": "{{length}} من الملفات • {{totalPages}} صفحة إجمالًا", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} كان الملف محميًا بكلمة مرور، لذلك لا تحتوي النسخة المضغوطة على كلمة مرور. استخدم حماية PDF لإضافتها مرة أخرى.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}، {{totalPageCount}} صفحة)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} موقّع رقميًا، لذلك تُرك كما هو. ضغطه سيُبطل التوقيع. لضغطه رغم ذلك، فعّل تجاوز حماية المحتوى ضمن الإعدادات المخصصة، وسيتم حذف توقيعاته.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} ليس PDF صالحًا، لذلك لم تتم إضافته.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} محمي بكلمة مرور. أدخل كلمة مروره على بطاقة الملف، ثم اضغط مرة أخرى.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (ص{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • تعذر تحميل عدد الصفحات", + "{{size}} • Loading pages...": "{{size}} • جارٍ تحميل الصفحات...", + "{{size}} • Loading...": "{{size}} • جارٍ التحميل...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} صفحة", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} صفحة", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} صفحة", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} صفحة", + "{{size}} • {{value}} pages": "{{size}} • {{value}} صفحة", + "{{successCount}} PDF(s) decrypted successfully.": "تم فك تشفير {{successCount}} من ملفات PDF بنجاح.", + "{{successCount}} PDF(s) linearized successfully.": "تم تحسين {{successCount}} من ملفات PDF للعرض السريع بنجاح.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} صفحة ← {{numSheets}} ورقة إخراج", + "{{validCount}} valid": "{{validCount}} صالح", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: صفحة واحدة", + "• {{label}}: {{count}} pages": "• {{label}}: عدد الصفحات: {{count}}" +} diff --git a/public/locales/be/common.json b/public/locales/be/common.json index d2f6f21d..fef842ca 100644 --- a/public/locales/be/common.json +++ b/public/locales/be/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Адкрыць галоўнае меню", "language": "Мова", "searchLanguage": "Пошук мовы…", - "noLanguagesFound": "Мовы не знойдзены" + "noLanguagesFound": "Мовы не знойдзены", + "breadcrumb": "Навігацыйная цепачка" }, "donation": { "message": "Падабаецца BentoPDF? Падтрымайце, каб ён заставаўся бясплатным і з адкрытым зыходным кодам!", @@ -211,12 +212,12 @@ "answer": "Звычайна інструменты PDF запампоўваюць вашы файлы на сервер для апрацоўкі. BentoPDF ніколі так не робіць. Мы выкарыстоўваем бяспечныя сучасныя вэб-тэхналогіі, каб апрацоўваць вашы файлы непасрэдна ў браўзеры. Гэта азначае большую хуткасць, лепшую прыватнасць і поўны спакой." }, "browserBased": { - "question": "Чаму апрацоўка ў браўзеры — гэта бяспечна?", - "answer": "Працуючы цалкам у браўзеры, BentoPDF гарантуе, што вашы файлы ніколі не пакінуць вашу прыладу. Гэта ліквідуе рызыкі ўзлому сервераў, уцечак даных або несанкцыянаванага доступу. Вашы файлы застаюцца вашымі — заўсёды." + "question": "Чаму апрацоўка ў браўзеры гэта бяспечна?", + "answer": "Працуючы цалкам у браўзеры, BentoPDF гарантуе, што вашы файлы ніколі не пакінуць вашу прыладу. Гэта ліквідуе рызыкі ўзлому сервераў, уцечак даных або несанкцыянаванага доступу. Вашы файлы застаюцца вашымі. Заўсёды." }, "analytics": { "question": "Вы выкарыстоўваеце cookies або аналітыку, каб сачыць за мной?", - "answer": "Не. BentoPDF вас ніяк не адсочвае. Мы не выкарыстоўваем файлы cookie, аналітыку ці скрыпты адсочвання — нават на працоўным сайце bentopdf.com. Мы ніколі не ведаем, хто вы і што вы робіце з інструментамі." + "answer": "Не. BentoPDF вас ніяк не адсочвае. Мы не выкарыстоўваем файлы cookie, аналітыку ці скрыпты адсочвання, нават на працоўным сайце bentopdf.com. Мы ніколі не ведаем, хто вы і што вы робіце з інструментамі." } }, "testimonials": { @@ -226,7 +227,7 @@ }, "support": { "title": "Спадабалася мая праца?", - "description": "BentoPDF — гэта праект, створаны на энтузіязме з мэтай, каб кожны меў бясплатны, прыватны і магутны набор інструментаў PDF. Калі ён прыносіць вам карысць, падтрымайце распрацоўку. Дапамагае кожная кава!", + "description": "BentoPDF: гэта праект, створаны на энтузіязме з мэтай, каб кожны меў бясплатны, прыватны і магутны набор інструментаў PDF. Калі ён прыносіць вам карысць, падтрымайце распрацоўку. Дапамагае кожная кава!", "buyMeCoffee": "Пачастуйце мяне кавай" }, "footer": { @@ -236,6 +237,10 @@ "aboutUs": "Пра нас", "faqLink": "Частыя пытанні", "contactUs": "Звязацца з намі", + "tools": "Інструменты", + "pdfConverter": "Канвертар PDF", + "pdfSecurity": "Бяспека PDF", + "mergeSplit": "Аб'яднанне і падзел PDF", "legal": "Прававая інфармацыя", "termsAndConditions": "Умовы выкарыстання", "privacyPolicy": "Палітыка прыватнасці", @@ -295,7 +300,7 @@ "philosophy": { "label": "Наша асноўная філасофія", "title": "Прыватнасць на першым месцы. Заўсёды.", - "description": "У эпоху, калі даныя — гэта тавар, мы выбіраем іншы шлях. Уся апрацоўка інструментаў BentoPDF адбываецца лакальна ў вашым браўзеры. Гэта значыць, што вашы файлы ніколі не трапляюць на нашы серверы, мы не бачым вашых дакументаў і не адсочваем, што вы робіце. Вашы дакументы застаюцца цалкам і безумоўна прыватнымі. Гэта не проста функцыя — гэта наш падмурак." + "description": "У эпоху, калі даныя сталі таварам, мы выбіраем іншы шлях. Уся апрацоўка інструментаў BentoPDF адбываецца лакальна ў вашым браўзеры. Гэта значыць, што вашы файлы ніколі не трапляюць на нашы серверы, мы не бачым вашых дакументаў і не адсочваем, што вы робіце. Вашы дакументы застаюцца цалкам і безумоўна прыватнымі. Гэта не проста функцыя, гэта наш падмурак." }, "whyBentopdf": { "title": "Чаму", diff --git a/public/locales/be/tools.json b/public/locales/be/tools.json index 45e8ff53..2c920c7d 100644 --- a/public/locales/be/tools.json +++ b/public/locales/be/tools.json @@ -28,7 +28,21 @@ "subtitle": "Аб'яднаць некалькі PDF у адзін файл. Закладкі захоўваюцца.", "retainPageLabels": "Захоўваць арыгінальныя пазнакі старонак з кожнага файла", "retainPageLabelsHint": "Выключана (прадвызначана): аб'яднаны PDF выкарыстоўвае натуральную нумарацыю 1–N. Уключана: арыгінальныя пазнакі старонак кожнага файла захоўваюцца (могуць узнікнуць паўторы).", - "removeDuplicateFonts": "Выдаліць дублікаты шрыфтоў" + "removeDuplicateFonts": "Выдаліць дублікаты шрыфтоў", + "alert": { + "thumbnailError": "Не ўдалося адлюстраваць мініяцюры старонак", + "noSelection": "Не выбрана ні файлаў, ні старонак для аб'яднання.", + "mergeSuccess": "PDF паспяхова аб'яднаны!", + "mergeFailed": "Не ўдалося аб'яднаць PDF.", + "mergeError": "Не ўдалося аб'яднаць PDF. Праверце, што ўсе файлы правільныя і не абаронены паролем.", + "workerError": "Падчас аб'яднання адбылася нечаканая памылка.", + "loadError": "Не ўдалося загрузіць адзін або некалькі файлаў PDF" + }, + "loader": { + "renderingPreviews": "Стварэнне перадпрагляду старонак...", + "merging": "Аб'яднанне PDF...", + "loadingDocuments": "Загрузка дакументаў PDF..." + } }, "splitPdf": { "name": "Падзяліць PDF", @@ -44,7 +58,7 @@ }, "editPdfText": { "name": "Рэдагаваць тэкст PDF", - "subtitle": "Рэдагаваць любы абзац на месцы — з імгненнай перакампаноўкай тэксту, шрыфтамі і стылямі.", + "subtitle": "Рэдагаваць любы абзац на месцы: з імгненнай перакампаноўкай тэксту, шрыфтамі і стылямі.", "saved": "PDF паспяхова захаваны! ({{size}} КБ)", "failedToLoad": "Не ўдалося загрузіць рэдактар тэксту PDF.", "loadingFonts": "Загрузка шрыфтоў...", @@ -92,7 +106,7 @@ "tipRedoZ": "Узнавіць (⇧⌘Z)", "tipFileDetails": "Звесткі пра файл", "tipEditExistingContent": "Рэдагаваць наяўнае змесціва", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "На што дзейнічае інструмент рэдагавання — звузьце вобласць на насычаных старонках", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "На што дзейнічае інструмент рэдагавання: звузьце вобласць на насычаных старонках", "tipClickThePageToAddATextBox": "Націсніце на старонку, каб дадаць тэкставае поле", "tipSpellCheckLanguage": "Мова праверкі правапісу", "tipFindAndReplace": "Знайсці і замяніць", @@ -238,7 +252,7 @@ "howItWorksDownloadDescription": "Захавайце абноўлены PDF з новымі пазнакамі старонак.", "relatedToolsTitle": "Звязаныя інструменты PDF", "faqWhatIsQuestion": "Што такое пазнака старонкі?", - "faqWhatIsAnswer": "Пазнака старонкі — гэта нумарацыя, якую чытальнікі PDF паказваюць у мініяцюрах, навігацыі па старонках і дыялогах друку. Яна не друкуе новы тэкст на самой старонцы.", + "faqWhatIsAnswer": "Пазнака старонкі: гэта нумарацыя, якую чытальнікі PDF паказваюць у мініяцюрах, навігацыі па старонках і дыялогах друку. Яна не друкуе новы тэкст на самой старонцы.", "faqMixQuestion": "Ці можна спалучаць рымскія і звычайныя лічбы?", "faqMixAnswer": "Так. Дадайце некалькі правіл, напрыклад 1-4 з LowercaseRoman і 5-20 з DecimalArabic.", "faqPrivacyQuestion": "Ці застаюцца мае файлы прыватнымі?", @@ -348,7 +362,7 @@ "subtitle": "Запоўніць форму непасрэдна ў браўзеры. Таксама падтрымліваюцца формы XFA.", "uploadHint": "Запампуйце PDF з палямі формы. Запоўніце іх непасрэдна ў праглядальніку ніжэй, а затым націсніце кнопку, каб захаваць і спампаваць запоўненую форму. Таксама падтрымліваюцца формы XFA.", "xfaNoteTitle": "Заўвага па формах XFA:", - "xfaNoteDescription": "XFA (XML Forms Architecture) — састарэлы фармат, што падтрымліваецца толькі некаторымі праглядальнікамі PDF, напрыклад BentoPDF і Firefox. Калі адкрыць PDF XFA ў іншай праграме і ўбачыць пустыя старонкі або адсутнасць палёў формы, гэта азначае, што праглядальнік не падтрымлівае XFA. Для правільнага прагляду і запаўнення XFA выкарыстоўвайце Firefox або праграму запаўнення формаў BentoPDF." + "xfaNoteDescription": "XFA (XML Forms Architecture): састарэлы фармат, што падтрымліваецца толькі некаторымі праглядальнікамі PDF, напрыклад BentoPDF і Firefox. Калі адкрыць PDF XFA ў іншай праграме і ўбачыць пустыя старонкі або адсутнасць палёў формы, гэта азначае, што праглядальнік не падтрымлівае XFA. Для правільнага прагляду і запаўнення XFA выкарыстоўвайце Firefox або праграму запаўнення формаў BentoPDF." }, "createPdfForm": { "name": "Стварыць форму PDF", @@ -493,7 +507,7 @@ "dpi": "DPI (Раздзяляльнасць)", "dpiExplanation": "Вышэйшы DPI = лепшая якасць для друку, большы памер файла", "compression": "Сцісканне", - "compressionExplanation": "LZW і Deflate — без страт. CCITT Group 4 лепш за ўсё падыходзіць для чорна-белых сканаваных дакументаў.", + "compressionExplanation": "LZW і Deflate: без страт. CCITT Group 4 лепш за ўсё падыходзіць для чорна-белых сканаваных дакументаў.", "colorMode": "Каляровы рэжым", "multiPage": "Захаваць як шматстаронкавы TIFF (адзін файл)", "loadingVips": "Загрузка апрацоўшчыка відарысаў...", @@ -647,7 +661,7 @@ "invalidSplitTitle": "Памылковы пункт падзелу", "invalidSplitMessage": "Пункт падзелу павінен быць паміж старонкай 1 і старонкай {{maxSplit}}.", "unevenConfirmTitle": "Няроўныя блокі", - "unevenConfirmMessage": "У блоку пярэдніх бакоў {{frontCount}} стар., у блоку адваротных — {{backCount}} стар.\nЗвычайна гэта азначае, што старонка адсканавана двойчы або яе не хапае.\n\nСтаронкі без пары ({{extraCount}}) будуць дададзены ў канец.\n\nУсё роўна працягнуць?", + "unevenConfirmMessage": "У блоку пярэдніх бакоў {{frontCount}} стар., у блоку адваротных: {{backCount}} стар.\nЗвычайна гэта азначае, што старонка адсканавана двойчы або яе не хапае.\n\nСтаронкі без пары ({{extraCount}}) будуць дададзены ў канец.\n\nУсё роўна працягнуць?", "invalidGroupTitle": "Памылковы памер групы", "invalidGroupMessage": "Увядзіце правільную колькасць старонак у зыходным дакуменце.", "collatingLoader": "Збор двухбаковага сканавання...", @@ -663,7 +677,7 @@ "faqOddPagesQuestion": "Што рабіць, калі ў скане няцотная колькасць старонак?", "faqOddPagesAnswer": "Двухбаковае сканаванне павінна мець цотную колькасць старонак. Калі гэта не так, старонка, хутчэй за ўсё, адсканавана двойчы або прапушчана. Інструмент папярэдзіць вас перад апрацоўкай, а старонкі без пары будуць дададзены ў канец, каб нічога не згубілася.", "faqBackOrderQuestion": "Навошта пакідаць блок адваротных бакоў без змен?", - "faqBackOrderAnswer": "Гэта залежыць ад таго, як стос падавалі на другім праходзе. Калі перавярнуць увесь стос, адваротныя бакі ідуць у адваротным парадку — гэта прадвызначаны варыянт. Калі сканер выдаў іх у тым самым парадку, што і пярэднія бакі, выберыце пакінуць блок без змен." + "faqBackOrderAnswer": "Гэта залежыць ад таго, як стос падавалі на другім праходзе. Калі перавярнуць увесь стос, адваротныя бакі ідуць у адваротным парадку, гэта прадвызначаны варыянт. Калі сканер выдаў іх у тым самым парадку, што і пярэднія бакі, выберыце пакінуць блок без змен." }, "addAttachments": { "name": "Дадаць далучэнні", @@ -787,7 +801,7 @@ }, "encryptPdf": { "name": "Зашыфраваць PDF", - "subtitle": "Заблакіраваць PDF, дадаўшы пароль." + "subtitle": "Абараніць PDF, дадаўшы пароль." }, "sanitizePdf": { "name": "Ачысціць PDF", @@ -795,7 +809,7 @@ }, "decryptPdf": { "name": "Расшыфраваць PDF", - "subtitle": "Разблакіраваць PDF, выдаліўшы пароль." + "subtitle": "Разблакаваць PDF, выдаліўшы пароль." }, "flattenPdf": { "name": "Звесці PDF", @@ -1068,7 +1082,7 @@ "relatedSanitizeDesc": "Выдаліць схаваныя даныя", "relatedPermissionsDesc": "Задаць дазволы PDF", "faqWhatIsQuestion": "Што такое лічбавы подпіс?", - "faqWhatIsAnswer": "Лічбавы подпіс — гэта крыптаграфічны механізм, які правярае сапраўднасць і цэласнасць дакумента. У адрозненне ад намаляванага подпісу, ён выкарыстоўвае крыптаграфію з адкрытым ключом (сертыфікаты X.509), каб пацвердзіць асобу падпісанта.", + "faqWhatIsAnswer": "Лічбавы подпіс: гэта крыптаграфічны механізм, які правярае сапраўднасць і цэласнасць дакумента. У адрозненне ад намаляванага подпісу, ён выкарыстоўвае крыптаграфію з адкрытым ключом (сертыфікаты X.509), каб пацвердзіць асобу падпісанта.", "faqFormatsQuestion": "Якія фарматы сертыфікатаў падтрымліваюцца?", "faqFormatsAnswer": "Падтрымліваюцца сертыфікаты фармату PKCS#12 (.pfx, .p12), якія змяшчаюць сертыфікат і закрыты ключ карыстальніка ў адным зашыфраваным файле. Такія сертыфікаты звычайна выдаюцца цэнтрамі сертыфікацыі.", "faqPrivateKeyQuestion": "Ці ў бяспецы мой закрыты ключ?", @@ -1190,7 +1204,7 @@ "workerError": "Памылка апрацоўшчыка: {{message}}", "alternateMergeWorkerError": "Памылка апрацоўшчыка паслядоўнага зліцця: {{message}}", "noPdfFilesUploaded": "У вузел «Увод PDF» не запампаваны PDF-файлы", - "failedToLoadFile": "Не атрымалася загрузіць «{{file}}» — файл можа быць пашкоджаны", + "failedToLoadFile": "Не атрымалася загрузіць «{{file}}»: файл можа быць пашкоджаны", "noImagesUploaded": "У вузел уводу відарысаў не запампаваны відарысы", "noWordDocsUploaded": "У вузел уводу Word не запампаваны дакументы", "noExcelUploaded": "У вузел уводу Excel не запампаваны табліцы", @@ -1303,11 +1317,11 @@ "faqPrivacyAnswer": "Безумоўна! Уся апрацоўка адбываецца ў вашым браўзеры. Вашы файлы ніколі не пакідаюць вашу прыладу, забяспечваючы поўную прыватнасць." }, "unlockPdf": { - "name": "Расшыфраваць PDF", - "subtitle": "Разблакіраваць PDF, выдаліўшы пароль." + "name": "Разблакаваць PDF", + "subtitle": "Разблакаваць PDF, выдаліўшы пароль." }, "protectPdf": { - "name": "Зашыфраваць PDF", - "subtitle": "Заблакіраваць PDF, дадаўшы пароль." + "name": "Абараніць PDF", + "subtitle": "Абараніць PDF, дадаўшы пароль." } } diff --git a/public/locales/be/ui.json b/public/locales/be/ui.json new file mode 100644 index 00000000..2166e0b2 --- /dev/null +++ b/public/locales/be/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(выпраўлена)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} КБ)", + "+ {{n}} more...": "+ яшчэ {{n}}...", + "- Error parsing XMP XML. Displaying raw. -": "- Памылка аналізу XMP XML. Паказваецца неапрацаваны тэкст. -", + "- No Info Dictionary data found -": "- Даных Info Dictionary не знойдзена -", + "- No XMP metadata found -": "- Метаданых XMP не знойдзена -", + "- No interactive form fields found -": "- Інтэрактыўных палёў формы не знойдзена -", + "- No parseable XMP properties found -": "- Уласцівасцей XMP, якія можна прачытаць, не знойдзена -", + "-- Select existing group --": "-- Выберыце існуючую групу --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (вельмі адчувальна)", + "0.5° (Default)": "0,5° (па змаўчанні)", + "1.0° (Normal)": "1,0° (звычайна)", + "100 (Fast)": "100 (хутка)", + "150 (Default)": "150 (па змаўчанні)", + "1x2 (Booklet)": "1x2 (буклет)", + "2.0° (Less Sensitive)": "2,0° (менш адчувальна)", + "200 (Better)": "200 (лепш)", + "200 (Good)": "200 (добра)", + "2x2 (4-up)": "2x2 (4 на лісце)", + "2x4 (8-up)": "2x4 (8 на лісце)", + "300 (Best Quality)": "300 (найлепшая якасць)", + "300 (Print)": "300 (для друку)", + "4x4 (16-up)": "4x4 (16 на лісце)", + "600 (High Quality)": "600 (высокая якасць)", + "72 (Screen)": "72 (для экрана)", + "90° Clockwise": "90° па гадзіннікавай стрэлцы", + "90° Counter-clockwise": "90° супраць гадзіннікавай стрэлкі", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Поле з назвай \"{{fieldName}}\" ужо існуе. Перайменуйце гэта поле, каб яго назва была ўнікальнай, перш чым спампоўваць.", + "A new version of BentoPDF is available. Reload to update?": "Даступная новая версія BentoPDF. Перазагрузіць для абнаўлення?", + "A single PDF file": "Адзін файл PDF", + "A template with this name already exists.": "Шаблон з такой назвай ужо існуе.", + "ASCII characters (letters, numbers, symbols)": "Сімвалы ASCII (літары, лічбы, знакі)", + "Action": "Дзеянне", + "Add Blank Page": "Дадаць пустую старонку", + "Add Bookmark": "Дадаць закладку", + "Add Child Bookmark": "Дадаць даччыную закладку", + "Add Child Layer": "Дадаць даччыны слой", + "Add More Comics": "Дадаць яшчэ коміксы", + "Add More Documents": "Дадаць яшчэ дакументы", + "Add More EPUB Files": "Дадаць яшчэ файлы EPUB", + "Add More Email Files": "Дадаць яшчэ файлы электроннай пошты", + "Add More FB2 Files": "Дадаць яшчэ файлы FB2", + "Add More Files": "Дадаць яшчэ файлы", + "Add More Images": "Дадаць яшчэ відарысы", + "Add More JSON Files": "Дадаць яшчэ файлы JSON", + "Add More MOBI Files": "Дадаць яшчэ файлы MOBI", + "Add More Markdown Files": "Дадаць яшчэ файлы Markdown", + "Add More ODG Files": "Дадаць яшчэ файлы ODG", + "Add More PUB Files": "Дадаць яшчэ файлы PUB", + "Add More Pages Files": "Дадаць яшчэ файлы Pages", + "Add More Presentations": "Дадаць яшчэ прэзентацыі", + "Add More SVG Files": "Дадаць яшчэ файлы SVG", + "Add More Spreadsheets": "Дадаць яшчэ табліцы", + "Add More Text Files": "Дадаць яшчэ тэкставыя файлы", + "Add More Visio Files": "Дадаць яшчэ файлы Visio", + "Add More WPD Files": "Дадаць яшчэ файлы WPD", + "Add More WPS Files": "Дадаць яшчэ файлы WPS", + "Add More XML Files": "Дадаць яшчэ файлы XML", + "Add More XPS Files": "Дадаць яшчэ файлы XPS", + "Add a new layer to get started!": "Дадайце новы слой, каб пачаць!", + "Add a text box": "Дадаць тэкставае поле", + "Add an RFC 3161 document timestamp": "Дадаць адзнаку часу дакумента RFC 3161", + "Add an image": "Дадаць відарыс", + "Add at least one node to run the workflow.": "Дадайце хаця б адзін вузел, каб запусціць працоўны працэс.", + "Add child": "Дадаць даччыны", + "Add child layer": "Дадаць даччыны слой", + "Add header and footer text": "Дадаць тэкст верхняга і ніжняга калантытула", + "Add page numbers": "Дадаць нумары старонак", + "Add searchable text layer via OCR": "Дадаць тэкставы слой для пошуку праз OCR", + "Add text watermark": "Дадаць тэкставы вадзяны знак", + "Add/Edit/Extract Attachments": "Дадаць, рэдагаваць і здабываць далучэнні", + "Added": "Дададзена", + "Added \"{{afterText}}\"": "Дададзена \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Дададзены відарыс ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "Пустая старонка ({{insertCount}}) паспяхова дададзена!", + "Added {{insertCount}} blank pages successfully!": "Пустыя старонкі ({{insertCount}}) паспяхова дададзены!", + "Adding header & footer...": "Дадаецца верхні і ніжні калантытул...", + "Adding page numbers...": "Дадаюцца нумары старонак...", + "Adding watermark...": "Дадаецца вадзяны знак...", + "Adding {{insertCount}} blank page...": "Дадаецца пустая старонка ({{insertCount}})...", + "Adding {{insertCount}} blank pages...": "Дадаюцца пустыя старонкі ({{insertCount}})...", + "Adding {{name}} ({{n}}/{{length}})...": "Дадаецца {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Наладзіць колеры", + "Adjust brightness, contrast, and colors": "Наладзіць яркасць, кантраснасць і колеры", + "Advanced": "Дадаткова", + "Advanced Feature Required": "Патрэбна пашыраная функцыя", + "Advanced Settings": "Дадатковыя налады", + "After Page": "Пасля старонкі", + "After Page...": "Пасля старонкі...", + "Align Objects": "Выраўнаваць аб'екты", + "Alignment": "Выраўноўванне", + "All": "Усе", + "All files repaired successfully!": "Усе файлы паспяхова адноўлены!", + "Alternate Merge": "Чаргавае аб'яднанне", + "Alternating and mixing pages...": "Чаргаванне і змешванне старонак...", + "Always resample to that resolution": "Заўсёды змяняць дыскрэтызацыю да гэтага разрашэння", + "An error occurred during compression. Error: {{error}}": "Падчас сціскання адбылася памылка. Памылка: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Падчас канвертацыі адбылася памылка. Памылка: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Падчас канвертацыі адбылася памылка. Памылка: {{message}}", + "An error occurred during cropping.": "Падчас абрэзкі адбылася памылка.", + "An error occurred during extraction. Error: {{error}}": "Падчас вымання адбылася памылка. Памылка: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Падчас растарызацыі адбылася памылка. Памылка: {{error}}", + "An error occurred during sanitization: {{msg}}": "Падчас ачысткі адбылася памылка: {{msg}}", + "An error occurred while combining pages.": "Падчас аб'яднання старонак адбылася памылка.", + "An error occurred while creating the N-Up PDF.": "Падчас стварэння N-Up PDF адбылася памылка.", + "An error occurred while creating the booklet.": "Падчас стварэння буклета адбылася памылка.", + "An error occurred while dividing the PDF.": "Падчас падзелу PDF адбылася памылка.", + "An error occurred while mixing the PDFs.": "Падчас змешвання PDF адбылася памылка.", + "An error occurred while standardizing pages.": "Падчас уніфікацыі старонак адбылася памылка.", + "An error occurred while trying to remove metadata.": "Падчас выдалення метаданых адбылася памылка.", + "An error occurred: {{error}}": "Адбылася памылка: {{error}}", + "An error occurred: {{error}}.": "Адбылася памылка: {{error}}.", + "An owner password is required when setting permissions": "Для налады дазволаў патрэбны пароль уладальніка", + "An unexpected error occurred during the repair process.": "Падчас аднаўлення адбылася нечаканая памылка.", + "An unexpected error occurred.": "Адбылася нечаканая памылка.", + "Analyzing data structure...": "Аналіз структуры даных...", + "Analyzing full PDF metadata...": "Поўны аналіз метаданых PDF...", + "Analyzing signatures...": "Аналіз подпісаў...", + "Angle": "Вугал", + "Annotations removed successfully!": "Анатацыі паспяхова выдалены!", + "Any text, URL, or data": "Любы тэкст, URL або даныя", + "Application": "Праграма", + "Apply a digital signature to PDF": "Дадаць лічбавы подпіс у PDF", + "Apply and download": "Ужыць і спампаваць", + "Apply redactions?": "Ужыць рэдагаванне?", + "Apply scanner simulation effect": "Ужыць эфект імітацыі сканера", + "Applying Bates numbers...": "Ужыванне нумароў Бейтса...", + "Applying color adjustments...": "Ужыванне наладаў колераў...", + "Applying crop...": "Ужыванне абрэзкі...", + "Applying redactions...": "Ужыванне рэдагавання...", + "Applying rotations...": "Ужыванне паваротаў...", + "Applying scanner effect...": "Ужыванне эфекту сканера...", + "Applying timestamp...": "Ужыванне адзнакі часу...", + "Applying {{replace}}...": "Ужыванне {{replace}}...", + "Archive contains an oversized image entry.": "Архіў змяшчае занадта вялікі відарыс.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "У архіве занадта шмат відарысаў (максімум {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Архіў занадта вялікі пасля распакавання.", + "Are you sure you want to reset? All your work will be lost.": "Вы ўпэўнены, што хочаце скінуць? Уся ваша праца будзе страчана.", + "Area (Coordinates)": "Вобласць (каардынаты)", + "Area ({{unit}}²)": "Плошча ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman і Courier New замяняюцца ўбудаванымі эквівалентамі. Ужываецца, толькі калі гэта бяспечна.", + "Arrange multiple pages per sheet": "Размясціць некалькі старонак на адным лісце", + "Arrange pages for booklet printing": "Размясціць старонкі для друку буклета", + "Aspect Ratio": "Суадносіны бакоў", + "At least one PDF document is required for export.": "Для экспарту патрэбны хаця б адзін дакумент PDF.", + "At least two valid PDFs are required.": "Патрэбны хаця б два сапраўдныя PDF.", + "Attaching files to PDF...": "Далучэнне файлаў да PDF...", + "Attachments updated successfully!": "Далучэнні паспяхова абноўлены!", + "Author": "Аўтар", + "Auto (Keep Original)": "Аўта (захаваць арыгінал)", + "Back": "Адваротны бок", + "Back to Home": "Назад на галоўную", + "Background Color": "Колер фону", + "Background color changed successfully!": "Колер фону паспяхова зменены!", + "Barcode": "Штрых-код", + "Barcode Format": "Фармат штрых-кода", + "Barcode Value": "Значэнне штрых-кода", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Нумары Бейтса паспяхова ўжыты! (з {{batesStart}} па {{n}})", + "Beginning": "Пачатак", + "Binarize": "Бінарызаваць", + "Blank Position": "Месца пустой старонкі", + "Blue": "Сіні", + "Blur": "Размыццё", + "Bold": "Тоўсты", + "Bold & Italic": "Тоўсты і курсіў", + "Booklet": "Буклет", + "Booklet created with {{numSheets}} sheets!": "Буклет створаны з лістоў: {{numSheets}}!", + "Bookmarks imported from JSON!": "Закладкі імпартаваны з JSON!", + "Bookmarks page": "Старонка закладак", + "Border": "Рамка", + "Border Color": "Колер рамкі", + "Bottom": "Знізу", + "Bottom Center": "Знізу па цэнтры", + "Bottom Left": "Знізу злева", + "Bottom Right": "Знізу справа", + "Bottom edge in points": "Ніжні край у пунктах", + "Brightness": "Яркасць", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli і растарызацыя прапушчаны, каб захаваць PDF/A.", + "Brotli compression (PDF 2.0)": "Сцісканне Brotli (PDF 2.0)", + "Browser Note:": "Заўвага пра браўзер:", + "Building new PDF...": "Стварэнне новага PDF...", + "Building page pairing model...": "Пабудова мадэлі спалучэння старонак...", + "Button": "Кнопка", + "ByteRange does not start at the beginning of the file": "ByteRange не пачынаецца з пачатку файла", + "ByteRange out of bounds": "ByteRange выходзіць за межы", + "CBZ to PDF": "CBZ у PDF", + "CSV Loaded": "CSV загружаны", + "CSV file is empty": "Файл CSV пусты", + "Cancel": "Скасаваць", + "Cannot Delete": "Немагчыма выдаліць", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Няма доступу да элементаў кіравання праглядальніка. Скарыстайцеся кнопкай «Спампаваць» на панэлі інструментаў PDF вышэй.", + "Cannot delete all pages": "Немагчыма выдаліць усе старонкі", + "Cannot delete all pages.": "Немагчыма выдаліць усе старонкі.", + "Canvas context failed": "Не ўдалося атрымаць кантэкст canvas", + "Canvas context unavailable": "Кантэкст canvas недаступны", + "Canvas toBlob conversion failed.": "Не ўдалося пераўтварыць canvas праз toBlob.", + "Canvas toBlob failed": "Збой canvas toBlob", + "Center": "Па цэнтры", + "Certificate (.pfx, .p12, .pem)": "Сертыфікат (.pfx, .p12, .pem)", + "Certificate Expired": "Тэрмін дзеяння сертыфіката скончыўся", + "Certificate Password": "Пароль сертыфіката", + "Certificate unlocked": "Сертыфікат разблакіраваны", + "Change Certificate": "Змяніць сертыфікат", + "Change background color": "Змяніць колер фону", + "Changing background color...": "Змяненне колеру фону...", + "Changing text color...": "Змяненне колеру тэксту...", + "Character": "Сімвал", + "Checked State": "Стан адзнакі", + "Choose a valid page range.": "Выберыце сапраўдны дыяпазон старонак.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Выберыце адну з убудаваных моў або перабудуйце аўтаномны пакет, дадаўшы патрэбную мову ў --ocr-languages.", + "Cleanup": "Ачыстка", + "Click on PDF to Pick Location": "Націсніце на PDF, каб выбраць месца", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Націсніце кнопку вышэй, затым націсніце на PDF у тым месцы, куды павінна пераходзіць закладка", + "Click to Upload Image": "Націсніце, каб загрузіць відарыс", + "Clicking this field in the PDF will open a file picker to upload an image.": "Націск на гэта поле ў PDF адкрые акно выбару файла для загрузкі відарыса.", + "Clip invisible parts of images": "Абрэзаць нябачныя часткі відарысаў", + "Close": "Закрыць", + "Close (Esc)": "Закрыць (Esc)", + "Close panel": "Закрыць панэль", + "Closes tab": "Закрывае ўкладку", + "Closes window": "Закрывае акно", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (закладкі і метаданыя)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF не наладжаны. Наладзьце яго ў наладах WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF вярнуў пусты расшыфраваны файл.", + "CoherentPDF: not configured.": "CoherentPDF: не наладжаны.", + "Color": "Колер", + "Color adjustments applied successfully!": "Налады колераў паспяхова ўжыты!", + "Colors inverted successfully!": "Колеры паспяхова інвертаваны!", + "Cols": "Слупкі", + "Combine multiple PDFs into one": "Аб'яднаць некалькі PDF у адзін", + "Combine to Single Page": "Аб'яднаць у адну старонку", + "Combining pages...": "Аб'яднанне старонак...", + "Comic Archives": "Архівы коміксаў", + "Comments and markup become part of the page. Form fields and links keep working.": "Каментарыі і разметка становяцца часткай старонкі. Палі формы і спасылкі застаюцца працоўнымі.", + "Complete": "Гатова", + "Complete!": "Гатова!", + "Compress": "Сціснуць", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Сціснута PDF: {{compressedCount}}. Агульны памер паменшаны з {{totalOriginalSize}} да {{totalCompressedSize}} (эканомія {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Сціснута PDF: {{compressedCount}}. Агульны памер: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Сціск некалькіх PDF...", + "Compressing to {{size}}...": "Сціск да {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Сціск {{n}}/{{length}}: {{name}}...", + "Compressing...": "Сціск...", + "Compression Complete": "Сціск завершаны", + "Compression Finished": "Сціск завершаны", + "Compression Level": "Узровень сціску", + "Configure": "Наладзіць", + "Confirm": "Пацвердзіць", + "Confirm Action": "Пацвердзіце дзеянне", + "Conformance": "Адпаведнасць", + "Connected": "Падключана", + "Contact Info": "Кантактныя даныя", + "Content": "Змест", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Хэш змесціва не супадае з атрыбутам messageDigest: PDF быў зменены пасля падпісання", + "Contrast": "Кантраснасць", + "Conversion Complete": "Канвертацыя завершана", + "Conversion Error": "Памылка канвертацыі", + "Conversion engine ready!": "Рухавік канвертацыі гатовы!", + "Conversion failed: could not create PDF/A definition": "Канвертацыя не ўдалася: не атрымалася стварыць азначэнне PDF/A", + "Convert Apple Pages documents to PDF": "Канвертаваць дакументы Apple Pages у PDF", + "Convert EPUB ebooks to PDF": "Канвертаваць электронныя кнігі EPUB у PDF", + "Convert Excel spreadsheets to PDF": "Канвертаваць электронныя табліцы Excel у PDF", + "Convert FB2 e-books to PDF": "Канвертаваць электронныя кнігі FB2 у PDF", + "Convert JSON files to PDF": "Канвертаваць файлы JSON у PDF", + "Convert MOBI e-books to PDF": "Канвертаваць электронныя кнігі MOBI у PDF", + "Convert Markdown files to PDF": "Канвертаваць файлы Markdown у PDF", + "Convert Microsoft Publisher to PDF": "Канвертаваць Microsoft Publisher у PDF", + "Convert OpenDocument Graphics to PDF": "Канвертаваць OpenDocument Graphics у PDF", + "Convert PDF pages to SVG": "Канвертаваць старонкі PDF у SVG", + "Convert PDF pages to images (ZIP)": "Канвертаваць старонкі PDF у відарысы (ZIP)", + "Convert PDF tables to CSV": "Канвертаваць табліцы PDF у CSV", + "Convert PDF tables to Excel": "Канвертаваць табліцы PDF у Excel", + "Convert PDF to Markdown text": "Канвертаваць PDF у тэкст Markdown", + "Convert PDF to PDF/A for archiving": "Канвертаваць PDF у PDF/A для архіву", + "Convert PDF to Word document": "Канвертаваць PDF у дакумент Word", + "Convert PowerPoint presentations to PDF": "Канвертаваць прэзентацыі PowerPoint у PDF", + "Convert SVG files to PDF": "Канвертаваць файлы SVG у PDF", + "Convert To Grayscale": "Канвертаваць у адценні шэрага", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Канвертаваць дыяграмы Visio (VSD/VSDX) у PDF", + "Convert WPS Office documents to PDF": "Канвертаваць дакументы WPS Office у PDF", + "Convert Word documents to PDF": "Канвертаваць дакументы Word у PDF", + "Convert WordPerfect documents to PDF": "Канвертаваць дакументы WordPerfect у PDF", + "Convert XML documents to PDF": "Канвертаваць дакументы XML у PDF", + "Convert XPS/OXPS documents to PDF": "Канвертаваць дакументы XPS/OXPS у PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Канвертаваць архівы коміксаў (CBZ/CBR) у PDF", + "Convert email files (.eml, .msg) to PDF": "Канвертаваць файлы электроннай пошты (.eml, .msg) у PDF", + "Convert fonts to vector outlines": "Канвертаваць шрыфты ў вектарныя контуры", + "Convert plain text to PDF": "Канвертаваць просты тэкст у PDF", + "Convert to grayscale": "Канвертаваць у адценні шэрага", + "Convert to greyscale": "Канвертаваць у адценні шэрага", + "Convert to image-based PDF": "Канвертаваць у PDF з відарысаў", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "Канвертавана файлаў: {{length}} (старонак: {{totalPages}}) у SVG!", + "Converted {{pageCount}} pages to SVG!": "Канвертавана старонак: {{pageCount}} у SVG!", + "Converter not initialized": "Канвертар не ініцыялізаваны", + "Converting BMP to PDF...": "Канвертацыя BMP у PDF...", + "Converting HEIC to PDF...": "Канвертацыя HEIC у PDF...", + "Converting TIFF to PDF...": "Канвертацыя TIFF у PDF...", + "Converting emails...": "Канвертацыя лістоў...", + "Converting files...": "Канвертацыя файлаў...", + "Converting fonts to outlines...": "Канвертацыя шрыфтоў у контуры...", + "Converting images to PDF...": "Канвертацыя відарысаў у PDF...", + "Converting multiple PDFs to PDF/A...": "Канвертацыя некалькіх PDF у PDF/A...", + "Converting multiple RTF files to PDF...": "Канвертацыя некалькіх файлаў RTF у PDF...", + "Converting multiple files...": "Канвертацыя некалькіх файлаў...", + "Converting page {{n}} of {{pageCount}}...": "Канвертацыя старонкі {{n}} з {{pageCount}}...", + "Converting to Markdown...": "Канвертацыя ў Markdown...", + "Converting to SVG...": "Канвертацыя ў SVG...", + "Converting to greyscale...": "Канвертацыя ў адценні шэрага...", + "Converting to {{level}}...": "Канвертацыя ў {{level}}...", + "Converting {{name}}...": "Канвертацыя {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Канвертацыя {{n}}/{{length}}: {{name}}...", + "Converting...": "Канвертацыя...", + "Copied": "Скапіравана", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Не ўдалося атрымаць доступ да экспарту PDF са штампамі. Скарыстайцеся кнопкай «Экспарт → PDF» на панэлі інструментаў праглядальніка.", + "Could not add blank page.": "Не ўдалося дадаць пустую старонку.", + "Could not add blank pages.": "Не ўдалося дадаць пустыя старонкі.", + "Could not add header or footer.": "Не ўдалося дадаць верхні або ніжні калантытул.", + "Could not add page numbers.": "Не ўдалося дадаць нумары старонак.", + "Could not add the watermark.": "Не ўдалося дадаць вадзяны знак.", + "Could not apply rotations.": "Не ўдалося ўжыць павароты.", + "Could not change text color.": "Не ўдалося змяніць колер тэксту.", + "Could not change the background color.": "Не ўдалося змяніць колер фону.", + "Could not create ZIP archive.": "Не ўдалося стварыць архіў ZIP.", + "Could not create canvas context.": "Не ўдалося стварыць кантэкст canvas.", + "Could not create comparison canvas context.": "Не ўдалося стварыць кантэкст canvas для параўнання.", + "Could not create offscreen comparison canvas.": "Не ўдалося стварыць пазаэкранны canvas для параўнання.", + "Could not create visual diff context.": "Не ўдалося стварыць кантэкст візуальнага адрозніцтва.", + "Could not create visual diff overlay context.": "Не ўдалося стварыць кантэкст накладкі візуальнага адрозніцтва.", + "Could not detect blank pages.": "Не ўдалося выявіць пустыя старонкі.", + "Could not display the page.": "Не ўдалося паказаць старонку.", + "Could not export comparison PDF.": "Не ўдалося экспартаваць PDF параўнання.", + "Could not export the signed PDF. Please try again.": "Не ўдалося экспартаваць падпісаны PDF. Паспрабуйце яшчэ раз.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Не ўдалося экспартаваць PDF са штампамі. Скарыстайцеся кнопкай «Экспарт → PDF» на панэлі інструментаў праглядальніка.", + "Could not extract signer public key": "Не ўдалося атрымаць адкрыты ключ падпісанта", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Не ўдалося знайсці {{testFile}} па ўказаным URL (HTTP {{status}}). Пераканайцеся, што файл існуе.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Не ўдалося цалкам прааналізаваць PDF. Магчыма, ён пашкоджаны або мае незвычайную структуру.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Не ўдалося стварыць перадпрагляд. Файл можа быць пашкоджаны або ўтрымліваць функцыі, якія не падтрымліваюцца. Памылка: {{message}}", + "Could not get canvas context": "Не ўдалося атрымаць кантэкст canvas", + "Could not invert PDF colors.": "Не ўдалося інвертаваць колеры PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Не ўдалося загрузіць PDF. Ён можа быць пашкоджаны або абаронены паролем.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Не ўдалося загрузіць PDF. Файл можа быць няправільным, пашкоджаным або абароненым паролем.", + "Could not load the PDF engine. Please refresh the page and try again.": "Не ўдалося загрузіць рухавік PDF. Абнавіце старонку і паспрабуйце яшчэ раз.", + "Could not parse signer info": "Не ўдалося прааналізаваць даныя падпісанта", + "Could not posterize the PDF.": "Не ўдалося пераўтварыць PDF у постэр.", + "Could not process \"{{name}}\". The file may be corrupted.": "Не ўдалося апрацаваць \"{{name}}\". Файл можа быць пашкоджаны.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Не ўдалося яшчэ больш паменшыць памер файла. Зыходны: {{originalSize}}, новы: {{compressedSize}}.", + "Could not remove annotations.": "Не ўдалося выдаліць анатацыі.", + "Could not remove blank pages.": "Не ўдалося выдаліць пустыя старонкі.", + "Could not remove leftover data from the PDF.": "Не ўдалося выдаліць астаткавыя даныя з PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Не ўдалося выдаліць закрэслены тэкст з даных дакумента, таму файл не быў спампаваны.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Не ўдалося змяніць парадак старонак PDF на адваротны. Праверце, што вашы файлы з'яўляюцца сапраўднымі PDF.", + "Could not update metadata. Please check that date formats are correct.": "Не ўдалося абнавіць метаданыя. Праверце, што фарматы дат правільныя.", + "Count": "Колькасць", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Створана", + "Creating Booklet...": "Стварэнне буклета...", + "Creating Excel file...": "Стварэнне файла Excel...", + "Creating N-Up PDF...": "Стварэнне N-Up PDF...", + "Creating PDF from JPGs...": "Стварэнне PDF з JPG...", + "Creating PDF from SVG files...": "Стварэнне PDF з файлаў SVG...", + "Creating PDF...": "Стварэнне PDF...", + "Creating ZIP archive...": "Стварэнне архіва ZIP...", + "Creating ZIP file...": "Стварэнне файла ZIP...", + "Creating ZIP...": "Стварэнне ZIP...", + "Creating table...": "Стварэнне табліцы...", + "Creator": "Стваральнік", + "Crop": "Абрэзаць", + "Crop complete! Your download has started.": "Абрэзка завершана! Спампоўванне пачалося.", + "Cryptographic verification failed": "Крыптаграфічная праверка не ўдалася", + "Custom": "Свой", + "Custom Format": "Свой фармат", + "Custom Height": "Свая вышыня", + "Custom Units": "Свае адзінкі", + "Custom Width": "Свая шырыня", + "Custom Zoom": "Свой маштаб", + "Custom...": "Свой...", + "DataMatrix": "DataMatrix", + "Date Format": "Фармат даты", + "Decrease size": "Паменшыць памер", + "Decrypt": "Расшыфраваць", + "Decrypting PDF...": "Расшыфроўка PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Расшыфроўка {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Расшыфроўка {{n}} з {{length}}: {{name}}", + "Decrypting...": "Расшыфроўка...", + "Decryption Failed": "Не ўдалося расшыфраваць", + "Delete": "Выдаліць", + "Delete \"{{title}}\"?": "Выдаліць \"{{title}}\"?", + "Delete Field": "Выдаліць поле", + "Delete Page": "Выдаліць старонку", + "Delete Pages": "Выдаліць старонкі", + "Delete all {{length}} bookmark(s) ? ": "Выдаліць усе закладкі ({{length}})? ", + "Delete layer": "Выдаліць слой", + "Delete {{size}} bookmark(s) ? ": "Выдаліць закладкі ({{size}})? ", + "Deleted": "Выдалена", + "Deleted {{size}} page(s) successfully!": "Старонак паспяхова выдалена: {{size}}!", + "Deleting pages...": "Выдаленне старонак...", + "Description": "Апісанне", + "Description for screen readers": "Апісанне для праграм чытання з экрана", + "Deselect All": "Зняць выбар з усіх", + "Deskew": "Выпрастаць", + "Deskew PDF": "Выпрастаць PDF", + "Deskewed {{length}} file(s). {{value}}": "Выпраўлена файлаў: {{length}}. {{value}}", + "Deskewing {{name}}...": "Выпрастанне {{name}}...", + "Destination": "Прызначэнне", + "Detecting blank pages...": "Пошук пустых старонак...", + "Digest Algorithm:": "Алгарытм хэшу:", + "Digital Sign": "Лічбавы подпіс", + "Direction": "Кірунак", + "Divide Pages": "Падзяліць старонкі", + "Divide into boxes (0 to disable)": "Падзяліць на блокі (0, каб выключыць)", + "Document Properties": "Уласцівасці дакумента", + "Document Type": "Тып дакумента", + "Document properties": "Уласцівасці дакумента", + "Document-level attachment": "Далучэнне на ўзроўні дакумента", + "Done: back to tools": "Гатова, назад да інструментаў", + "Download": "Спампаваць", + "Download Edited PDF": "Спампаваць адрэдагаваны PDF", + "Download anyway": "Усё роўна спампаваць", + "Download as PDF or ZIP automatically": "Аўтаматычна спампоўваць як PDF або ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Файлы PDF ({{length}}) спампаваны ў архіве ZIP.", + "Downloads started for all files.": "Спампоўванне ўсіх файлаў пачалося.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Выдаляе тэгі, на якія абапіраюцца праграмы чытання з экрана.", + "Duplicate Field Name": "Паўторная назва поля", + "Duplicate Field Names": "Паўторныя назвы палёў", + "Duplicate Page": "Дубліраваць старонку", + "Duplicate Page Numbers": "Паўторныя нумары старонак", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Подпіс ECDSA не супадае з адкрытым ключом падпісанта", + "EPUB Files": "Файлы EPUB", + "EPUB to PDF": "EPUB у PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ у PDF", + "Edit": "Рэдагаваць", + "Edit All": "Рэдагаваць усё", + "Edit Bookmark": "Рэдагаваць закладку", + "Edit Bookmarks": "Рэдагаваць закладкі", + "Edit Images": "Рэдагаваць відарысы", + "Edit Metadata": "Рэдагаваць метаданыя", + "Edit PDF metadata": "Рэдагаваць метаданыя PDF", + "Edit Scope": "Вобласць рэдагавання", + "Edit Shapes": "Рэдагаваць фігуры", + "Edit Text": "Рэдагаваць тэкст", + "Edit tool": "Інструмент рэдагавання", + "Edit {{scopes}}": "Рэдагаваць: {{scopes}}", + "Email Files": "Файлы электроннай пошты", + "Email to PDF": "Email у PDF", + "Embedding files into PDF...": "Убудова файлаў у PDF...", + "Empty signature bytes": "Пустыя байты подпісу", + "Encrypt": "Зашыфраваць", + "Encrypt PDF with password": "Зашыфраваць PDF паролем", + "Encrypted file": "Зашыфраваны файл", + "Encrypting PDF with 256-bit AES...": "Шыфраванне PDF з 256-бітным AES...", + "Encryption Failed": "Не ўдалося зашыфраваць", + "Encryption resulted in an empty file.": "Шыфраванне вярнула пусты файл.", + "End": "Канец", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Увядзіце 0, каб уставіць у пачатак, або {{pageCount}}, каб уставіць у канец.", + "Enter bookmark title": "Увядзіце назву закладкі", + "Enter name for child layer under \"{{Layer}}\":": "Увядзіце назву даччынага слоя пад \"{{Layer}}\":", + "Enter password": "Увядзіце пароль", + "Enter password...": "Увядзіце пароль...", + "Enter passwords for each encrypted file": "Увядзіце паролі для кожнага зашыфраванага файла", + "Error": "Памылка", + "Error during execution": "Памылка падчас выканання", + "Error generating PDF: {{error}}": "Памылка стварэння PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Памылка загрузкі файла PDF. Паспрабуйце яшчэ раз з сапраўдным PDF.", + "Error reading files: {{error}}": "Памылка чытання файлаў: {{error}}", + "Error saving PDF. Check console for details.": "Памылка захавання PDF. Падрабязнасці глядзіце ў кансолі.", + "Error: {{error}}": "Памылка: {{error}}", + "Exactly 11 or 12 digits": "Роўна 11 або 12 лічбаў", + "Exactly 12 or 13 digits": "Роўна 12 або 13 лічбаў", + "Example of current format:": "Прыклад бягучага фармату:", + "Excel to PDF": "Excel у PDF", + "Existing Radio Groups": "Існуючыя групы пераключальнікаў", + "Export Error": "Памылка экспарту", + "Export Value": "Значэнне экспарту", + "Export failed": "Не ўдалося экспартаваць", + "External processing module needed": "Патрэбны знешні модуль апрацоўкі", + "Extract Images": "Выняць відарысы", + "Extract Pages": "Выняць старонкі", + "Extract Tables": "Выняць табліцы", + "Extract a range of pages": "Выняць дыяпазон старонак", + "Extract all images from PDF": "Выняць усе відарысы з PDF", + "Extract pages as separate PDFs": "Выняць старонкі як асобныя PDF", + "Extract text from PDF": "Выняць тэкст з PDF", + "Extracted 1 table successfully!": "1 табліца паспяхова вынята!", + "Extracted text from {{length}} PDF files!": "Тэкст вынят з файлаў PDF: {{length}}!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Вынята PDF: {{completed}}, не ўдалося: {{failed}}.", + "Extracted {{length}} page(s) successfully!": "Старонак паспяхова вынята: {{length}}!", + "Extracted {{length}} table(s) to Excel!": "Табліц вынята ў Excel: {{length}}!", + "Extracted {{length}} tables successfully!": "Табліц паспяхова вынята: {{length}}!", + "Extracting attachments from {{length}} file(s)...": "Выманне далучэнняў з файлаў: {{length}}...", + "Extracting images from {{name}}...": "Выманне відарысаў з {{name}}...", + "Extracting pages...": "Выманне старонак...", + "Extracting tables...": "Выманне табліц...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Выманне тэксту з файла {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Выманне тэксту з некалькіх файлаў...", + "Extracting text from {{name}}...": "Выманне тэксту з {{name}}...", + "Extracting text...": "Выманне тэксту...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Выманне {{name}} для ШІ ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Выманне {{name}} для ШІ...", + "Extracting...": "Выманне...", + "Extraction Complete": "Выманне завершана", + "Extraction Error": "Памылка вымання", + "Extraction Partial": "Часткова вынята", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Выманне завершана! Далучэнняў у архіве ZIP: {{length}} ({{totalSize}}). Спампоўванне пачалося.", + "FB2 Files": "Файлы FB2", + "FB2 to PDF": "FB2 у PDF", + "Failed": "Не ўдалося", + "Failed to acquire 2D canvas context": "Не ўдалося атрымаць 2D-кантэкст canvas", + "Failed to add child layer": "Не ўдалося дадаць даччыны слой", + "Failed to apply Bates numbers.": "Не ўдалося ўжыць нумары Бейтса.", + "Failed to apply color adjustments. The file might be corrupted.": "Не ўдалося ўжыць налады колераў. Файл можа быць пашкоджаны.", + "Failed to apply redactions.": "Не ўдалося ўжыць рэдагаванне.", + "Failed to apply scanner effect. The file might be corrupted.": "Не ўдалося ўжыць эфект сканера. Файл можа быць пашкоджаны.", + "Failed to attach files: {{error}}": "Не ўдалося далучыць файлы: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Не ўдалося канвертаваць BMP у PDF. Адзін з файлаў можа быць няправільным.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Не ўдалося канвертаваць HEIC у PDF. Адзін з файлаў можа быць няправільным.", + "Failed to convert PDF to CSV. {{message}}": "Не ўдалося канвертаваць PDF у CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Не ўдалося канвертаваць PDF у Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Не ўдалося канвертаваць PDF у SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Не ўдалося канвертаваць PDF у адценні шэрага. Файл можа быць пашкоджаны.", + "Failed to convert PDF. It may be image-based or corrupted.": "Не ўдалося канвертаваць PDF. Ён можа складацца з відарысаў або быць пашкоджаным.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Не ўдалося канвертаваць TIFF у PDF. Адзін з файлаў можа быць няправільным.", + "Failed to convert images to PDF.": "Не ўдалося канвертаваць відарысы ў PDF.", + "Failed to convert text to PDF. {{error}}": "Не ўдалося канвертаваць тэкст у PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Не ўдалося канвертаваць {{filename}} у PNG", + "Failed to copy metadata to clipboard.": "Не ўдалося скапіраваць метаданыя ў буфер абмену.", + "Failed to create PDF.": "Не ўдалося стварыць PDF.", + "Failed to create PNG blob": "Не ўдалося стварыць blob PNG", + "Failed to create canvas context": "Не ўдалося стварыць кантэкст canvas", + "Failed to create split PDFs.": "Не ўдалося стварыць падзеленыя PDF.", + "Failed to decode image: {{name}}": "Не ўдалося дэкадзіраваць відарыс: {{name}}", + "Failed to decrypt private key": "Не ўдалося расшыфраваць закрыты ключ", + "Failed to decrypt. Try the Decrypt tool instead.": "Не ўдалося расшыфраваць. Паспрабуйце замест гэтага інструмент расшыфроўкі.", + "Failed to delete layer": "Не ўдалося выдаліць слой", + "Failed to delete pages.": "Не ўдалося выдаліць старонкі.", + "Failed to deskew PDF: {{error}}": "Не ўдалося выпрастаць PDF: {{error}}", + "Failed to download the edited PDF.": "Не ўдалося спампаваць адрэдагаваны PDF.", + "Failed to edit attachments.": "Не ўдалося адрэдагаваць далучэнні.", + "Failed to extract certificate from PFX file": "Не ўдалося вынуць сертыфікат з файла PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Не ўдалося выняць старонкі (код завяршэння qpdf: {{exitCode}}).", + "Failed to extract pages.": "Не ўдалося выняць старонкі.", + "Failed to extract tables. {{message}}": "Не ўдалося выняць табліцы. {{message}}", + "Failed to extract text from PDF.": "Не ўдалося выняць тэкст з PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Не ўдалося атрымаць профіль ICC з {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Не ўдалося атрымаць файл шрыфта: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Не ўдалося атрымаць gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Не ўдалося атрымаць {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Не ўдалося атрымаць 2D-кантэкст для старонкі {{pageNumber}}", + "Failed to get canvas context": "Не ўдалося атрымаць кантэкст canvas", + "Failed to insert PDF. The file may be corrupted.": "Не ўдалося ўставіць PDF. Файл можа быць пашкоджаны.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Не ўдалося загрузіць Ghostscript з {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Не ўдалося загрузіць файл PDF.", + "Failed to load PDF for cropping.": "Не ўдалося загрузіць PDF для абрэзкі.", + "Failed to load PDF for preview.": "Не ўдалося загрузіць PDF для перадпрагляду.", + "Failed to load PDF form viewer.": "Не ўдалося загрузіць праглядальнік формаў PDF.", + "Failed to load PDF layers": "Не ўдалося загрузіць слаі PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Не ўдалося загрузіць PyMuPDF з CDN: {{msg}}", + "Failed to load SVG image": "Не ўдалося загрузіць відарыс SVG", + "Failed to load WebP image": "Не ўдалося загрузіць відарыс WebP", + "Failed to load attachments from PDF.": "Не ўдалося загрузіць далучэнні з PDF.", + "Failed to load files: {{error}}": "Не ўдалося загрузіць файлы: {{error}}", + "Failed to load image.": "Не ўдалося загрузіць відарыс.", + "Failed to load image: {{filename}}": "Не ўдалося загрузіць відарыс: {{filename}}", + "Failed to load one or more PDF files.": "Не ўдалося загрузіць адзін або некалькі файлаў PDF.", + "Failed to load script: {{url}}": "Не ўдалося загрузіць скрыпт: {{url}}", + "Failed to load template.": "Не ўдалося загрузіць шаблон.", + "Failed to load the PDF Editor.": "Не ўдалося загрузіць Рэдактар PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Не ўдалося загрузіць апрацоўшчык відарысаў. Пераканайцеся, што ваш браўзер падтрымлівае SharedArrayBuffer (патрэбны HTTPS або localhost).", + "Failed to parse CSV: {{error}}": "Не ўдалося прааналізаваць CSV: {{error}}", + "Failed to parse signature": "Не ўдалося прааналізаваць подпіс", + "Failed to parse the certificate file.": "Не ўдалося прааналізаваць файл сертыфіката.", + "Failed to process HEIC file: {{name}}": "Не ўдалося апрацаваць файл HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Не ўдалося апрацаваць файл WebP: {{name}}", + "Failed to read file.": "Не ўдалося прачытаць файл.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Не ўдалося выдаліць абмежаванні. Для PDF можа спатрэбіцца правільны пароль уладальніка.", + "Failed to render page": "Не ўдалося адлюстраваць старонку", + "Failed to render page previews": "Не ўдалося адлюстраваць перадпрагляд старонак", + "Failed to render page previews.": "Не ўдалося адлюстраваць перадпрагляд старонак.", + "Failed to render page.": "Не ўдалося адлюстраваць старонку.", + "Failed to save changes.": "Не ўдалося захаваць змены.", + "Failed to save the new PDF. Check console for details.": "Не ўдалося захаваць новы PDF. Падрабязнасці глядзіце ў кансолі.", + "Failed to split PDF. Please check your selection.": "Не ўдалося падзяліць PDF. Праверце свой выбар.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Не ўдалося дадаць адзнаку часу ў PDF: {{message}}\n\nПаспрабуйце іншы сервер TSA або праверце падключэнне да інтэрнэту.", + "Failed to toggle layer visibility": "Не ўдалося пераключыць бачнасць слоя", + "Failed to validate signatures. The file may be corrupted.": "Не ўдалося праверыць подпісы. Файл можа быць пашкоджаны.", + "Features enabled by this module:": "Функцыі, якія ўключае гэты модуль:", + "Field Name": "Назва поля", + "Field Name (Group Name)": "Назва поля (Назва групы)", + "Field Name Conflict": "Канфлікт назваў палёў", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Поле з назвай \"{{newName}}\" ужо існуе ў гэтым элеменце ({{value}}). Выкарыстайце ўнікальную назву.", + "Field name cannot be empty": "Назва поля не можа быць пустой", + "File": "Файл", + "File Size": "Памер файла", + "File exists but could not be read. Check CORS configuration.": "Файл існуе, але яго не ўдалося прачытаць. Праверце налады CORS.", + "File list not found": "Спіс файлаў не знойдзены", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Памер файла паменшаны з {{originalSize}} да {{compressedSize}} (эканомія {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Файл {{n}}/{{length}}: старонка {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Файл {{n}}/{{length}}: {{message}}", + "Filename": "Імя файла", + "Files that failed: {{errorCount}}.": "Файлы з памылкамі: {{errorCount}}.", + "Fill (cover full target page)": "Запоўніць (запоўніць усю мэтавую старонку)", + "Fill Color": "Колер залівання", + "Finalizing PDF...": "Завяршэнне PDF...", + "Find & replace": "Знайсці і замяніць", + "Finds the best quality under this size. 0 means no target.": "Знаходзіць лепшую якасць у межах гэтага памеру. 0 азначае, што мэты няма.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox і Chrome падчас выбару могуць паказваць уласны фармат сродку выбару даты. Правільны фармат будзе ўжыты, калі вы скончыце ўвод даты.", + "First Indent": "Водступ першага радка", + "Fit (keep full page visible)": "Умясціць (захаваць старонку цалкам бачнай)", + "Fit Page": "Умясціць старонку", + "Fix Page Size": "Уніфікаваць памер старонак", + "Flatten": "Звесці", + "Flatten Forms": "Звесці формы", + "Flatten annotations": "Звесці анатацыі", + "Flatten form fields": "Звесці палі формы", + "Flatten forms and annotations": "Звесці формы і анатацыі", + "Flatten links": "Звесці спасылкі", + "Flattening PDF...": "Звядзенне PDF...", + "Flattening and saving PDF...": "Звядзенне і захаванне PDF...", + "Flattening multiple PDFs...": "Звядзенне некалькіх PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Звядзенне старонкі {{i}} з {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Звядзенне {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Пераводзіць фокус на адрасны радок", + "Font": "Шрыфт", + "Font Color": "Колер шрыфта", + "Font Family": "Сямейства шрыфтоў", + "Font Size": "Памер шрыфта", + "Font size: {{bSize}} → {{aSize}}": "Памер шрыфта: {{bSize}} → {{aSize}}", + "Font to Outline": "Шрыфт у контуры", + "Font: {{bFont}} → {{aFont}}": "Шрыфт: {{bFont}} → {{aFont}}", + "Fonts": "Шрыфты", + "Footer Center": "Ніжні калантытул па цэнтры", + "Footer Left": "Ніжні калантытул злева", + "Footer Right": "Ніжні калантытул справа", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Для PDF толькі з відарысаў, напрыклад сканаў. Прапускаецца, калі ў дакуменце ёсць тэкст, які можна вылучыць, акрамя выпадку, калі ўключана «Перакрыць абарону змесціва».", + "Form fields stop being fillable.": "Палі формы больш нельга запаўняць.", + "Format": "Фармат", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Знойдзена пустых старонак: {{length}}. Націсніце на старонку, каб зняць выбар.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Знойдзена існуючых закладак: {{length}}. Замяніць бягучыя закладкі?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Знойдзена відарысаў: {{length}} у PDF: {{length2}}.", + "Front": "Ліцавы бок", + "Full Coverage": "Поўнае пакрыццё", + "Gamma": "Гама", + "Generate table of contents from bookmarks": "Стварыць змест з закладак", + "Generating High-Quality PDF...": "Стварэнне PDF высокай якасці...", + "Generating PDF...": "Стварэнне PDF...", + "Generating ZIP file...": "Стварэнне файла ZIP...", + "Generating formatted content...": "Стварэнне адфарматаванага змесціва...", + "Generating preview...": "Стварэнне перадпрагляду...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (канвертацыя ў PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Канвертацыя RGB праз Ghostscript не ўдалася з кодам завяршэння {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Канвертацыя праз Ghostscript не ўдалася з кодам завяршэння {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript не стварыў выходны файл", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript не наладжаны. Наладзьце яго ў дадатковых наладах.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript не наладжаны. Наладзьце яго ў наладах WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript не наладжаны. PyMuPDF патрабуе Ghostscript для некаторых аперацый. Наладзьце абодва ў дадатковых наладах.", + "Ghostscript threw an exception: {{e}}": "Ghostscript выклікаў выключэнне: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Абгортка Ghostscript не прадставіла чаканы інтэрфейс. Чакаўся loadGS() або клас GhostscriptWASM.", + "Go": "Перайсці", + "Go to page": "Перайсці да старонкі", + "Grayscale": "Адценні шэрага", + "Green": "Зялёны", + "Greyscale": "Адценні шэрага", + "Grid Mode": "Рэжым сеткі", + "Group Name (Must be same for group)": "Назва групы (павінна быць аднолькавай для групы)", + "H-Scale %": "Гарызантальны маштаб, %", + "Hanging Indent": "Выступ", + "Hard reloads page": "Поўнасцю перазагружае старонку", + "Header & Footer": "Верхні і ніжні калантытул", + "Header & Footer added successfully!": "Верхні і ніжні калантытул паспяхова дададзены!", + "Header Center": "Верхні калантытул па цэнтры", + "Header Left": "Верхні калантытул злева", + "Header Right": "Верхні калантытул справа", + "Height ({{unit}})": "Вышыня ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Схаваць", + "Hide Border": "Схаваць рамку", + "Hide password": "Схаваць пароль", + "Hides window": "Хавае акно", + "High (288 DPI)": "Высокае (288 DPI)", + "High (Smallest Files)": "Высокае (найменшыя файлы)", + "Horizontal": "Гарызантальна", + "Hue Shift": "Зрух адцення", + "Image Format": "Фармат відарыса", + "Image Input": "Уваход відарыса", + "Image quality": "Якасць відарыса", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Памер відарыса зменены з {{width}}×{{height}} на {{width2}}×{{height2}}", + "Images": "Відарысы", + "Images above this are resampled down. None leaves resolution alone.": "Відарысы вышэй за гэта значэнне памяншаюцца. «Няма» пакідае разрашэнне без змен.", + "Imported {{length}} bookmarks!": "Закладак імпартавана: {{length}}!", + "Inches (in)": "Цалі (in)", + "Include Attachments": "Уключыць далучэнні", + "Include Cc Bcc": "Уключыць Cc і Bcc", + "Include this file": "Уключыць гэты файл", + "Incorrect Page Count": "Няправільная колькасць старонак", + "Incorrect Password": "Няправільны пароль", + "Incorrect password": "Няправільны пароль", + "Incorrect password. Please try again.": "Няправільны пароль. Паспрабуйце яшчэ раз.", + "Increase size": "Павялічыць памер", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Індэксацыя старонкі {{pageNumber}} з {{totalPages}} у PDF 1...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Індэксацыя старонкі {{pageNumber}} з {{totalPages}} у PDF 2...", + "Info": "Інфармацыя", + "Info Dictionary": "Info Dictionary", + "Inherit": "Успадкаваць", + "Initialization Error": "Памылка ініцыялізацыі", + "Initializing Ghostscript...": "Ініцыялізацыя Ghostscript...", + "Initializing PDF engine...": "Ініцыялізацыя рухавіка PDF...", + "Initializing PyMuPDF...": "Ініцыялізацыя PyMuPDF...", + "Initializing decryption...": "Ініцыялізацыя расшыфроўкі...", + "Initializing encryption...": "Ініцыялізацыя шыфравання...", + "Initializing repair engine...": "Ініцыялізацыя рухавіка аднаўлення...", + "Initializing...": "Ініцыялізацыя...", + "Input Required": "Патрэбны ўвод", + "Insecure Digest (MD5 / SHA-1)": "Ненадзейны хэш (MD5 / SHA-1)", + "Insert blank pages": "Уставіць пустыя старонкі", + "Insert blank pages after this page number": "Уставіць пустыя старонкі пасля старонкі з гэтым нумарам", + "Interactive Form Fields": "Інтэрактыўныя палі формы", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Чаргаваць старонкі некалькіх PDF (напрыклад, няцотныя і зваротныя цотныя з аднабаковага скана)", + "Invalid Certificate": "Няправільны сертыфікат", + "Invalid File": "Няправільны файл", + "Invalid Files": "Няправільныя файлы", + "Invalid Input": "Няправільны ўвод", + "Invalid JSON format": "Няправільны фармат JSON", + "Invalid Name": "Няправільная назва", + "Invalid Order": "Няправільны парадак", + "Invalid PDF password.": "Няправільны пароль PDF.", + "Invalid Page Numbers": "Няправільныя нумары старонак", + "Invalid Page Order": "Няправільны парадак старонак", + "Invalid Pages": "Няправільныя старонкі", + "Invalid Range": "Няправільны дыяпазон", + "Invalid Signature": "Няправільны подпіс", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Няправільны URL TSA. Цэнтр адзнакі часу павінен быць сапраўдным URL з http:// або https://.", + "Invalid URL": "Няправільны URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Няправільны фармат URL. Увядзіце сапраўдны URL (напрыклад, https://example.com/wasm/)", + "Invalid XML: no root element": "Няправільны XML: няма каранёвага элемента", + "Invalid data": "Няправільныя даныя", + "Invalid hex string in content stream": "Няправільны hex-радок у струмені змесціва", + "Invalid page range specified.": "Указаны няправільны дыяпазон старонак.", + "Invalid shortcut format": "Няправільны фармат спалучэння клавіш", + "Invalid: Cryptographic Verification Failed": "Няправільны: крыптаграфічная праверка не ўдалася", + "Invert Colors": "Інвертаваць колеры", + "Invert all colors": "Інвертаваць усе колеры", + "Inverting PDF colors...": "Інвертаванне колераў PDF...", + "Issuer": "Выдавец", + "It fits the {{targetBytes}} target.": "Ён уладкоўваецца ў мэту {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Ён усё яшчэ перавышае мэту {{targetBytes}}, бо параметр «Захаваць PDF/A» абмяжоўвае ступень сціску.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Ён больш не заяўляе пра адпаведнасць PDF/A. Каб захаваць яе, уключыце «Захаваць PDF/A» у наладах карыстальніка.", + "Italic": "Курсіў", + "Item 1": "Элемент 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Яго лічбавыя подпісы былі выдалены, каб яго можна было сціснуць. Падпішыце яго зноў, калі трэба.", + "JPEG (Smaller file size)": "JPEG (меншы памер файла)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Якасць JPEG для паўторна закадзіраваных відарысаў, ад 20 да 100. Чым ніжэй, тым меншыя файлы і больш прыкметныя артэфакты.", + "JPG": "JPG", + "JSON Files": "Файлы JSON", + "JSON Loaded": "JSON загружаны", + "JSON to PDF": "JSON у PDF", + "Javascript Code": "Код Javascript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Захоўвае адпаведнасць файла PDF/A. Пакуль гэта ўключана, Brotli і растарызацыя прапускаюцца.", + "Keeps only the characters the document uses.": "Пакідае толькі сімвалы, якія выкарыстоўвае дакумент.", + "Key (e.g., Department)": "Ключ (напрыклад, Аддзел)", + "Keywords": "Ключавыя словы", + "Label": "Пазнака", + "Label / Prompt": "Пазнака / падказка", + "Landscape": "Альбомная", + "Language": "Мова", + "Layer not found": "Слой не знойдзены", + "Layer {{number}}": "Слой {{number}}", + "Leave blank for all pages": "Пакіньце пустым для ўсіх старонак", + "Left": "Злева", + "Left edge in points (1 inch = 72 pts)": "Левы край у пунктах (1 цаля = 72 пункты)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Узровень", + "Limit recognized characters (leave empty for all)": "Абмежаваць распазнаваныя сімвалы (пакіньце пустым для ўсіх)", + "Line": "Лінія", + "Linearization Failed": "Не ўдалося зрабіць лінейным", + "Linearize": "Зрабіць лінейным", + "Links stop being clickable.": "Спасылкі больш нельга націскаць.", + "Lists": "Спісы", + "Load": "Загрузіць", + "Load system fonts": "Загрузіць сістэмныя шрыфты", + "Load system fonts…": "Загрузіць сістэмныя шрыфты…", + "Loaded": "Загружана", + "Loaded bookmarks from JSON. Now upload your PDF.": "Закладкі загружаны з JSON. Цяпер загрузіце свой PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Закладак загружана з CSV: {{length}}. Цяпер загрузіце свой PDF.", + "Loading Engine...": "Загрузка рухавіка...", + "Loading Ghostscript...": "Загрузка Ghostscript...", + "Loading PDF Editor...": "Загрузка Рэдактара PDF...", + "Loading PDF Text Editor...": "Загрузка тэкставага рэдактара PDF...", + "Loading PDF converter...": "Загрузка канвертара PDF...", + "Loading PDF documents...": "Загрузка дакументаў PDF...", + "Loading PDF engine...": "Загрузка рухавіка PDF...", + "Loading PDF files...": "Загрузка файлаў PDF...", + "Loading PDF form...": "Загрузка формы PDF...", + "Loading PDF processor...": "Загрузка апрацоўшчыка PDF...", + "Loading PDF viewer...": "Загрузка праглядальніка PDF...", + "Loading PDF...": "Загрузка PDF...", + "Loading PDFs...": "Загрузка PDF...", + "Loading attachments...": "Загрузка далучэнняў...", + "Loading comparison {{currentPage}} of {{length}}...": "Загрузка параўнання {{currentPage}} з {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Загрузка рухавіка канвертацыі ({{percent}}%)...", + "Loading conversion engine...": "Загрузка рухавіка канвертацыі...", + "Loading engine...": "Загрузка рухавіка...", + "Loading fonts...": "Загрузка шрыфтоў...", + "Loading layers from {{name}}...": "Загрузка слаёў з {{name}}...", + "Loading page {{num}}...": "Загрузка старонкі {{num}}...", + "Loading preview...": "Загрузка перадпрагляду...", + "Loading {{name}}...": "Загрузка {{name}}...", + "Loading...": "Загрузка...", + "Location": "Месцазнаходжанне", + "Lossless (No Quality Loss)": "Без страт (без страты якасці)", + "Lossless (no image re-encoding)": "Без страт (без паўторнага кадзіравання відарысаў)", + "Low (Best Quality)": "Нізкае (найлепшая якасць)", + "MOBI Files": "Файлы MOBI", + "MOBI to PDF": "MOBI у PDF", + "Malformed ByteRange": "Няправільны ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Няправільны подпіс ECDSA (не ўдалося прааналізаваць r,s)", + "Malformed inline image in content stream": "Няправільны ўбудаваны відарыс у струмені змесціва", + "Malformed signatureAlgorithm": "Няправільны signatureAlgorithm", + "Margins": "Палі", + "Markdown Files": "Файлы Markdown", + "Markdown to PDF": "Markdown у PDF", + "Max Length (0 for unlimited)": "Максімальная даўжыня (0 без абмежавання)", + "Maximum resolution": "Максімальнае разрашэнне", + "Medium (Recommended)": "Сярэдняе (рэкамендуецца)", + "Merge PDF": "Аб'яднаць PDF", + "Merge PDFs": "Аб'яднаць PDF", + "Merge duplicate fonts": "Аб'яднаць дублікаты шрыфтоў", + "Mermaid Error: {{error}}": "Памылка Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Метаданыя скапіраваны ў буфер абмену як JSON.", + "Metadata removed successfully!": "Метаданыя паспяхова выдалены!", + "Metadata updated successfully!": "Метаданыя паспяхова абноўлены!", + "Millimeters (mm)": "Міліметры (мм)", + "Minimizes window": "Згортвае акно", + "Missing Files": "Адсутнічаюць файлы", + "Missing signatureAlgorithm": "Адсутнічае signatureAlgorithm", + "Mixed Page Sizes Detected": "Выяўлены розныя памеры старонак", + "Mixed Sizes": "Розныя памеры", + "Mode": "Рэжым", + "Modified": "Зменена", + "Modified After Signing (signed part intact)": "Зменены пасля падпісання (падпісаная частка не пашкоджана)", + "More": "Яшчэ", + "Moved": "Перамешчана", + "Moved \"{{value}}\"": "Перамешчана \"{{value}}\"", + "Multi-line": "Некалькі радкоў", + "Must be a positive integer": "Павінна быць дадатным цэлым лікам", + "Must be a positive number": "Павінна быць дадатным лікам", + "N must be at least 1.": "N павінна быць не менш за 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF паспяхова створаны!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Памылка сеткі: не ўдалося падключыцца да URL. Праверце, што URL правільны і сервер дазваляе запыты CORS.", + "Network error: {{error}}": "Памылка сеткі: {{error}}", + "Next page": "Наступная старонка", + "No Area Selected": "Вобласць не выбрана", + "No Attachments": "Няма далучэнняў", + "No Changes": "Няма змен", + "No Crop Area": "Няма вобласці абрэзкі", + "No File": "Няма файла", + "No Files": "Няма файлаў", + "No Images Found": "Відарысы не знойдзены", + "No PDF Files": "Няма файлаў PDF", + "No PDF document loaded": "Дакумент PDF не загружаны", + "No PDF document loaded.": "Дакумент PDF не загружаны.", + "No PDF file loaded.": "Файл PDF не загружаны.", + "No PDF files could be decrypted. The password may be incorrect.": "Не ўдалося расшыфраваць ніводзін файл PDF. Пароль можа быць няправільным.", + "No PDF files could be linearized.": "Не ўдалося зрабіць лінейным ніводзін файл PDF.", + "No PDFs could be processed.": "Не ўдалося апрацаваць ніводзін PDF.", + "No Pages": "Няма старонак", + "No Selection": "Нічога не выбрана", + "No Signatures Found": "Подпісы не знойдзены", + "No Tables Found": "Табліцы не знойдзены", + "No Text": "Няма тэксту", + "No URL configured": "URL не наладжаны", + "No attachments found in this PDF.": "У гэтым PDF не знойдзена далучэнняў.", + "No attachments selected for removal.": "Не выбрана далучэнняў для выдалення.", + "No blank pages detected in this PDF.": "У гэтым PDF пустых старонак не выяўлена.", + "No bookmarks found at the selected level.": "На выбраным узроўні закладак не знойдзена.", + "No bookmarks to delete.": "Няма закладак для выдалення.", + "No bookmarks to export!": "Няма закладак для экспарту!", + "No certificate found in PEM file": "У файле PEM сертыфікат не знойдзены", + "No certificate found in PFX file": "У файле PFX сертыфікат не знойдзены", + "No certificates found in signature": "У подпісе сертыфікаты не знойдзены", + "No changes match the current filter.": "Няма змен, якія адпавядаюць бягучаму фільтру.", + "No configurable settings for this node.": "Для гэтага вузла няма наладжвальных параметраў.", + "No differences detected on this page.": "На гэтай старонцы адрозненняў не выяўлена.", + "No embedded images were found in the selected PDF(s).": "У выбраных PDF убудаваных відарысаў не знойдзена.", + "No existing bookmarks found in this PDF.": "У гэтым PDF існуючых закладак не знойдзена.", + "No items were selected for removal or none were found in the PDF.": "Нічога не выбрана для выдалення, або гэтага няма ў PDF.", + "No page pairs to export.": "Няма пар старонак для экспарту.", + "No pages found. Please create a blank PDF or upload one.": "Старонкі не знойдзены. Стварыце пусты PDF або загрузіце ўласны.", + "No pages selected for removal.": "Не выбрана старонак для выдалення.", + "No pages were selected for splitting.": "Не выбрана старонак для падзелу.", + "No paired page for this side.": "Для гэтага боку няма парнай старонкі.", + "No private key found in PEM file": "У файле PEM закрыты ключ не знойдзены", + "No private key found in PFX file": "У файле PFX закрыты ключ не знойдзены", + "No tables were detected in this PDF.": "У гэтым PDF табліц не выяўлена.", + "No valid page numbers found.": "Сапраўдных нумароў старонак не знойдзена.", + "No valid pages to save.": "Няма сапраўдных старонак для захавання.", + "No worker": "Няма worker", + "Noise": "Шум", + "None": "Няма", + "None of the files could be compressed: {{join}}.": "Не ўдалося сціснуць ніводзін з файлаў: {{join}}.", + "Normal": "Звычайны", + "Not Enough Files": "Недастаткова файлаў", + "Not a PDF": "Не PDF", + "Not connected": "Не падключана", + "Not in trust chain": "Не ў ланцужку даверу", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Заўвага: без асобнага пароля ўладальніка ў PDF няма абмежаванняў на выкарыстанне.", + "Number Format": "Фармат нумарацыі", + "Number of Pages": "Колькасць старонак", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR спынены да апрацоўкі любой старонкі", + "OCR recognize timed out after {{timeoutMs}}ms": "Час чакання распазнавання OCR скончыўся праз {{timeoutMs}} мс", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Файлы ODG", + "ODG to PDF": "ODG у PDF", + "OK": "Добра", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Выключана (па змаўчанні): натуральная нумарацыя ад 1 да N. Уключана: захоўваюцца зыходныя пазнакі старонак кожнага файла (могуць паўтарацца).", + "One PDF per page": "Адзін PDF на старонку", + "One PDF per range": "Адзін PDF на дыяпазон", + "Only a substitute font was available": "Быў даступны толькі шрыфт-замена", + "Only where it does not change how the image looks.": "Толькі там, дзе гэта не змяняе выгляд відарыса.", + "Opacity": "Непразрыстасць", + "Open URL": "Адкрыць URL", + "Opens incognito window": "Адкрывае акно інкогніта", + "Opens new tab": "Адкрывае новую ўкладку", + "Opens new window": "Адкрывае новае акно", + "Operation Failed": "Аперацыя не ўдалася", + "Operation resulted in an empty file.": "Аперацыя вярнула пусты файл.", + "Optimize PDF for fast web viewing": "Аптымізаваць PDF для хуткага прагляду ў сетцы", + "Optimizing PDFs for web view (linearizing)...": "Аптымізацыя PDF для прагляду ў сетцы (лінеарызацыя)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Аптымізацыя {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Параметры (па адным у радку або праз коску)", + "Orientation": "Арыентацыя", + "Outline": "Контур", + "Output": "Вынік", + "Overlay": "Накладка", + "Overlay or underlay pages from one PDF onto another": "Накласці старонкі аднаго PDF зверху або знізу на іншы", + "Owner Password": "Пароль уладальніка", + "Owner Password Required": "Патрэбны пароль уладальніка", + "PDF": "PDF", + "PDF Files": "Файлы PDF", + "PDF Input": "Уваход PDF", + "PDF Layers": "Слаі PDF", + "PDF Metadata": "Метаданыя PDF", + "PDF Producer": "Праграма-стваральнік PDF", + "PDF converted to CSV successfully!": "PDF паспяхова канвертаваны ў CSV!", + "PDF converted to SVG successfully!": "PDF паспяхова канвертаваны ў SVG!", + "PDF converted to greyscale successfully!": "PDF паспяхова канвертаваны ў адценні шэрага!", + "PDF created successfully!": "PDF паспяхова створаны!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF паспяхова расшыфраваны! Усё шыфраванне і абмежаванні выдалены.", + "PDF decrypted successfully! Your download has started.": "PDF паспяхова расшыфраваны! Спампоўванне пачалося.", + "PDF downloaded successfully.": "PDF паспяхова спампаваны.", + "PDF encrypted successfully with 256-bit AES!": "PDF паспяхова зашыфраваны 256-бітным AES!", + "PDF has been sanitized and downloaded.": "PDF ачышчаны і спампаваны.", + "PDF has no pages": "У PDF няма старонак", + "PDF organized successfully!": "PDF паспяхова арганізаваны!", + "PDF permissions changed successfully!": "Дазволы PDF паспяхова зменены!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Праграмы для чытання PDF самі змяшчаюць 14 стандартных шрыфтоў PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Абмежаванні PDF паспяхова выдалены! Файл цяпер можна поўнасцю рэдагаваць і друкаваць.", + "PDF saved successfully!": "PDF паспяхова захаваны!", + "PDF split successfully!": "PDF паспяхова падзелены!", + "PDF to CSV": "PDF у CSV", + "PDF to DOCX": "PDF у DOCX", + "PDF to Excel/CSV": "PDF у Excel/CSV", + "PDF to Images": "PDF у відарысы", + "PDF to Images (High Quality)": "PDF у відарысы (высокая якасць)", + "PDF to JSON": "PDF у JSON", + "PDF to Markdown": "PDF у Markdown", + "PDF to PDF/A": "PDF у PDF/A", + "PDF to SVG": "PDF у SVG", + "PDF to Text": "PDF у тэкст", + "PDF to XLSX": "PDF у XLSX", + "PDF with layer changes saved!": "PDF са зменамі слаёў захаваны!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} паспяхова ўжыты.", + "PDF/A Conversion": "Канвертацыя ў PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (строгі, без празрыстасці)", + "PDF/A-2b (Recommended)": "PDF/A-2b (рэкамендуецца)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (сучасны, дазваляе далучэнні)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF паспяхова змешаны!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (без страт)", + "PUB to PDF": "PUB у PDF", + "Page": "Старонка", + "Page #": "Старонка №", + "Page Added": "Старонка дададзена", + "Page Numbers": "Нумары старонак", + "Page Removed": "Старонка выдалена", + "Page Size": "Памер старонкі", + "Page X of Y": "Старонка X з Y", + "Page background or layout changed": "Фон або макет старонкі зменены", + "Page container not found": "Кантэйнер старонкі не знойдзены", + "Page extraction produced an empty PDF.": "Выманне старонак вярнула пусты PDF.", + "Page number": "Нумар старонкі", + "Page numbers added successfully!": "Нумары старонак паспяхова дададзены!", + "Page sizes standardized successfully!": "Памеры старонак паспяхова ўніфікаваны!", + "Page {{currentPageNum}} of {{numPages}}": "Старонка {{currentPageNum}} з {{numPages}}", + "Page {{num}} / {{numPages}}": "Старонка {{num}} / {{numPages}}", + "Page {{n}} ": "Старонка {{n}} ", + "Page {{n}} of {{length}}": "Старонка {{n}} з {{length}}", + "Page {{n}}:": "Старонка {{n}}:", + "Page {{pageNumber}}": "Старонка {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Старонка {{pageNumber}} ёсць толькі ў першым PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Старонка {{pageNumber}} ёсць толькі ў другім PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Старонка {{pageNumber}} з {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Старонкі {{pageNum}} у гэтым PDF няма.", + "Page {{page}}": "Старонка {{page}}", + "Page {{page}} attachment": "Далучэнне старонкі {{page}}", + "Pages": "Старонкі", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Старонкі (напрыклад, 1-3, 5), усяго: {{pageCount}}", + "Pages Files": "Файлы Pages", + "Pages Per Sheet": "Старонак на ліст", + "Pages combined successfully!": "Старонкі паспяхова аб'яднаны!", + "Pages have been divided successfully!": "Старонкі паспяхова падзелены!", + "Pages have been reordered.": "Парадак старонак зменены.", + "Pages have been reversed successfully!": "Парадак старонак паспяхова зменены на адваротны!", + "Pages to PDF": "Pages у PDF", + "Paper Size": "Памер паперы", + "Paragraph": "Абзац", + "Parsing XML structure...": "Аналіз структуры XML...", + "Parsing {{name}}...": "Аналіз {{name}}...", + "Partial Coverage": "Частковае пакрыццё", + "Partial Success": "Часткова паспяхова", + "Password": "Пароль", + "Password Error": "Памылка пароля", + "Password Needed": "Патрэбны пароль", + "Password Required": "Патрэбны пароль", + "Password for all files": "Пароль для ўсіх файлаў", + "Password for all locked files": "Пароль для ўсіх заблакіраваных файлаў", + "Password for {{name}}": "Пароль для {{name}}", + "Password protected": "Абаронена паролем", + "Password required for encrypted private key": "Для зашыфраванага закрытага ключа патрэбны пароль", + "Path Stroke": "Контур шляху", + "Please add at least one field before downloading.": "Дадайце хаця б адно поле, перш чым спампоўваць.", + "Please draw a rectangle on at least one page to select the crop area.": "Намалюйце прамавугольнік хаця б на адной старонцы, каб выбраць вобласць абрэзкі.", + "Please ensure all page numbers in the order are unique.": "Пераканайцеся, што ўсе нумары старонак у парадку ўнікальныя.", + "Please enter a layer name": "Увядзіце назву слоя", + "Please enter a name.": "Увядзіце назву.", + "Please enter a number between 0 and {{totalPages}}.": "Увядзіце лік ад 0 да {{totalPages}}.", + "Please enter a page order.": "Увядзіце парадак старонак.", + "Please enter a password": "Увядзіце пароль", + "Please enter a password for {{i}} or skip it": "Увядзіце пароль для {{i}} або прапусціце яго", + "Please enter a title.": "Увядзіце загаловак.", + "Please enter a user password.": "Увядзіце пароль карыстальніка.", + "Please enter a valid number of pages (1 or more).": "Увядзіце правільную колькасць старонак (1 або больш).", + "Please enter a valid page number between 1 and {{total}}": "Увядзіце правільны нумар старонкі ад 1 да {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Увядзіце правільны дыяпазон старонак (напрыклад, 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Увядзіце нумары старонак для вымання.", + "Please enter positive numbers.": "Увядзіце дадатныя лікі.", + "Please enter some text to convert.": "Увядзіце тэкст для канвертацыі.", + "Please enter text for the watermark.": "Увядзіце тэкст для вадзянога знака.", + "Please enter the PDF password.": "Увядзіце пароль PDF.", + "Please load a PDF first.": "Спачатку загрузіце PDF.", + "Please select PDF files to create a ZIP archive.": "Выберыце файлы PDF для стварэння архіва ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Выберыце файл сертыфіката .pem, .crt, .cer або .der.", + "Please select a PDF file.": "Выберыце файл PDF.", + "Please select a valid PDF file.": "Выберыце сапраўдны файл PDF.", + "Please select an area on at least one page to crop.": "Выберыце вобласць хаця б на адной старонцы для абрэзкі.", + "Please select an area to crop first.": "Спачатку выберыце вобласць для абрэзкі.", + "Please select an area to crop.": "Выберыце вобласць для абрэзкі.", + "Please select an image file for the watermark.": "Выберыце файл відарыса для вадзянога знака.", + "Please select at least one BMP file.": "Выберыце хаця б адзін файл BMP.", + "Please select at least one CSV file.": "Выберыце хаця б адзін файл CSV.", + "Please select at least one Excel file.": "Выберыце хаця б адзін файл Excel.", + "Please select at least one HEIC file.": "Выберыце хаця б адзін файл HEIC.", + "Please select at least one JPG file.": "Выберыце хаця б адзін файл JPG.", + "Please select at least one JPG or JPEG2000 image.": "Выберыце хаця б адзін відарыс JPG або JPEG2000.", + "Please select at least one ODT file.": "Выберыце хаця б адзін файл ODT.", + "Please select at least one PDF file.": "Выберыце хаця б адзін файл PDF.", + "Please select at least one PowerPoint file.": "Выберыце хаця б адзін файл PowerPoint.", + "Please select at least one RTF file.": "Выберыце хаця б адзін файл RTF.", + "Please select at least one SVG file.": "Выберыце хаця б адзін файл SVG.", + "Please select at least one TIFF file.": "Выберыце хаця б адзін файл TIFF.", + "Please select at least one Word document.": "Выберыце хаця б адзін дакумент Word.", + "Please select at least one file to attach.": "Выберыце хаця б адзін файл для далучэння.", + "Please select at least one image file.": "Выберыце хаця б адзін файл відарыса.", + "Please select at least one text file.": "Выберыце хаця б адзін тэкставы файл.", + "Please select at least one {{FILETYPE_NAME}} file.": "Выберыце хаця б адзін файл: {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Выберыце хаця б адзін файл {{TOOL_NAME}} (.eml або .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Выберыце хаця б адзін файл: {{TOOL_NAME}}.", + "Please select even or odd pages.": "Выберыце цотныя або няцотныя старонкі.", + "Please select one or more PDF files.": "Выберыце адзін або некалькі файлаў PDF.", + "Please select pages to delete.": "Выберыце старонкі для выдалення.", + "Please select pages to duplicate.": "Выберыце старонкі для дубліравання.", + "Please select pages to mark for splitting.": "Выберыце старонкі, пасля якіх трэба падзяліць.", + "Please select pages to rotate.": "Выберыце старонкі для павароту.", + "Please specify a page range for page-level attachments.": "Укажыце дыяпазон старонак для далучэнняў на ўзроўні старонак.", + "Please upload PDF files.": "Загрузіце файлы PDF.", + "Please upload PDFs first.": "Спачатку загрузіце PDF.", + "Please upload a .docx file first.": "Спачатку загрузіце файл .docx.", + "Please upload a PDF file first.": "Спачатку загрузіце файл PDF.", + "Please upload a PDF file.": "Загрузіце файл PDF.", + "Please upload a PDF first.": "Спачатку загрузіце PDF.", + "Please upload a valid PDF file.": "Загрузіце сапраўдны файл PDF.", + "Please upload at least one PDF file.": "Загрузіце хаця б адзін файл PDF.", + "Please upload at least two PDF files to alternate and mix.": "Загрузіце хаця б два файлы PDF для чаргавання і змешвання.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Загрузіце і асноўны PDF, і PDF для накладкі.", + "Please upload valid PDF files.": "Загрузіце сапраўдныя файлы PDF.", + "Please use the Download button in the PDF viewer toolbar above.": "Скарыстайцеся кнопкай «Спампаваць» на панэлі інструментаў праглядальніка PDF вышэй.", + "Please wait for the PDF viewer to load.": "Пачакайце, пакуль загрузіцца праглядальнік PDF.", + "Please wait for the form to finish loading.": "Пачакайце, пакуль форма скончыць загрузку.", + "Portrait": "Кніжная", + "Position": "Пазіцыя", + "Post-processing for transparency compliance...": "Пасляапрацоўка для адпаведнасці празрыстасці...", + "Posterize": "Постэр", + "Posterizing PDF...": "Стварэнне постэра з PDF...", + "PowerPoint to PDF": "PowerPoint у PDF", + "Pre Flatten": "Папярэдняе звядзенне", + "Pre-flattening PDF...": "Папярэдняе звядзенне PDF...", + "Prefer JPEG 2000 for photos": "Аддаваць перавагу JPEG 2000 для фота", + "Preparing PDF export...": "Падрыхтоўка экспарту PDF...", + "Preparing conversion...": "Падрыхтоўка канвертацыі...", + "Preparing download...": "Падрыхтоўка спампоўвання...", + "Preparing preview...": "Падрыхтоўка перадпрагляду...", + "Presentations": "Прэзентацыі", + "Preserve PDF/A": "Захаваць PDF/A", + "Preview": "Перадпрагляд", + "Preview Error": "Памылка перадпрагляду", + "Preview Text": "Тэкст перадпрагляду", + "Previous page": "Папярэдняя старонка", + "Print Form": "Друкаваць форму", + "Private data that editing apps store inside the PDF.": "Прыватныя даныя, якія праграмы рэдагавання захоўваюць унутры PDF.", + "Processed {{processedCount}} PDFs.": "Апрацавана PDF: {{processedCount}}.", + "Processing Complete": "Апрацоўка завершана", + "Processing Dpi": "DPI апрацоўкі", + "Processing Failed": "Не ўдалося апрацаваць", + "Processing PDF permissions...": "Апрацоўка дазволаў PDF...", + "Processing attachments...": "Апрацоўка далучэнняў...", + "Processing failed for {{name}}.": "Не ўдалося апрацаваць {{name}}.", + "Processing file {{n}} of {{length}}...": "Апрацоўка файла {{n}} з {{length}}...", + "Processing images...": "Апрацоўка відарысаў...", + "Processing multiple PDFs...": "Апрацоўка некалькіх PDF...", + "Processing page {{i}} of {{numPages}}": "Апрацоўка старонкі {{i}} з {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Апрацоўка старонкі {{i}} з {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Апрацоўка старонкі {{n}} з {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Апрацоўка старонкі {{pageNum}} з {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Апрацоўка старонкі {{pageNum}} з {{totalPages}}...", + "Processing produced an empty file.": "Апрацоўка вярнула пусты файл.", + "Processing resulted in an empty file.": "Апрацоўка вярнула пусты файл.", + "Processing sheet {{n}}...": "Апрацоўка ліста {{n}}...", + "Processing {{name}}...": "Апрацоўка {{name}}...", + "Processing {{nodeName}}...": "Апрацоўка {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Апрацоўка {{n}}/{{length}}: {{name}}...", + "Processing...": "Апрацоўка...", + "Producer": "Праграма-стваральнік", + "Publisher Files": "Файлы Publisher", + "Purple": "Фіялетавы", + "PyMuPDF (Document Processing)": "PyMuPDF (апрацоўка дакументаў)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF не наладжаны. Наладзьце яго ў дадатковых наладах.", + "PyMuPDF module did not export expected PyMuPDF class.": "Модуль PyMuPDF не экспартаваў чаканы клас PyMuPDF.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF вярнуў пусты расшыфраваны файл.", + "PyMuPDF: not configured.": "PyMuPDF: не наладжаны.", + "QR Code": "QR-код", + "Quality": "Якасць", + "Quits application (cannot be overridden)": "Закрывае праграму (нельга перазначыць)", + "RSA-PKCS1 signature does not verify against signer public key": "Подпіс RSA-PKCS1 не супадае з адкрытым ключом падпісанта", + "RSA-PSS signature does not verify against signer public key": "Подпіс RSA-PSS не супадае з адкрытым ключом падпісанта", + "Rasterization Complete": "Растарызацыя завершана", + "Rasterization Partial": "Растарызацыя часткова завершана", + "Rasterize": "Растарызаваць", + "Rasterize Dpi": "DPI растарызацыі", + "Rasterize pages to images": "Растарызаваць старонкі ў відарысы", + "Rasterize quality": "Якасць растарызацыі", + "Rasterize resolution (DPI)": "Разрашэнне растарызацыі (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Растарызавана PDF: {{completed}}, не ўдалося: {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Растарызацыя {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Растарызацыя {{name}}...", + "Rasterizing...": "Растарызацыя...", + "Rating must be between 0 and 5": "Рэйтынг павінен быць ад 0 да 5", + "Read Only": "Толькі чытанне", + "Reading CSV file...": "Чытанне файла CSV...", + "Reading PDF...": "Чытанне PDF...", + "Reading XML file...": "Чытанне файла XML...", + "Reading encrypted PDF...": "Чытанне зашыфраванага PDF...", + "Reading files...": "Чытанне файлаў...", + "Reading layer configuration...": "Чытанне канфігурацыі слаёў...", + "Reading {{name}} ({{n}}/{{length}})...": "Чытанне {{name}} ({{n}}/{{length}})...", + "Ready": "Гатова", + "Reason": "Прычына", + "Red": "Чырвоны", + "Redact": "Закрэсліць", + "Redact Mode": "Рэжым закрэслівання", + "Redact text from PDF": "Закрэсліць тэкст у PDF", + "Redaction Failed": "Не ўдалося закрэсліць", + "Reduce PDF file size": "Паменшыць памер файла PDF", + "Reduce color complexity": "Паменшыць складанасць колераў", + "Reduces file size by removing color information.": "Памяншае памер файла, выдаляючы інфармацыю пра колер.", + "Reloads page": "Перазагружае старонку", + "Remove": "Выдаліць", + "Remove All Attachments": "Выдаліць усе далучэнні", + "Remove Annotations": "Выдаліць анатацыі", + "Remove Blank Pages": "Выдаліць пустыя старонкі", + "Remove Embedded Files": "Выдаліць убудаваныя файлы", + "Remove Fonts": "Выдаліць шрыфты", + "Remove Javascript": "Выдаліць Javascript", + "Remove Layers": "Выдаліць слаі", + "Remove Links": "Выдаліць спасылкі", + "Remove Mark Info": "Выдаліць Mark Info", + "Remove Metadata": "Выдаліць метаданыя", + "Remove PDF password protection": "Выдаліць абарону PDF паролем", + "Remove Structure Tree": "Выдаліць дрэва структуры", + "Remove alternate images": "Выдаліць альтэрнатыўныя відарысы", + "Remove application data": "Выдаліць даныя праграм", + "Remove article threads": "Выдаліць ланцужкі артыкулаў", + "Remove attachment": "Выдаліць далучэнне", + "Remove blank pages automatically": "Аўтаматычна выдаліць пустыя старонкі", + "Remove document structure tree": "Выдаліць дрэва структуры дакумента", + "Remove file": "Выдаліць файл", + "Remove metadata, scripts, and hidden data": "Выдаліць метаданыя, скрыпты і схаваныя даныя", + "Remove output intents": "Выдаліць output intents", + "Remove page thumbnails": "Выдаліць мініяцюры старонак", + "Remove specific pages": "Выдаліць пэўныя старонкі", + "Remove web capture information": "Выдаліць звесткі пра захоп вэб-старонкі", + "Remove {{name}}": "Выдаліць {{name}}", + "Removed \"{{beforeText}}\"": "Выдалена \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Выдалены відарыс ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Пустых старонак паспяхова выдалена: {{length}}!", + "Removing all metadata...": "Выдаленне ўсіх метаданых...", + "Removing annotations...": "Выдаленне анатацый...", + "Removing redacted text from document data...": "Выдаленне закрэсленага тэксту з даных дакумента...", + "Removing restrictions...": "Выдаленне абмежаванняў...", + "Removing {{length}} blank page(s)...": "Выдаленне пустых старонак: {{length}}...", + "Render Error": "Памылка адлюстравання", + "Rendering Page {{num}}...": "Адлюстраванне старонкі {{num}}...", + "Rendering page previews...": "Адлюстраванне перадпрагляду старонак...", + "Rendering page previews: {{current}}/{{total}}": "Адлюстраванне перадпрагляду старонак: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Адлюстраванне старонкі {{n}} з {{length}}...", + "Rendering preview for page {{pageNum}}...": "Адлюстраванне перадпрагляду старонкі {{pageNum}}...", + "Reopens closed tab": "Адкрывае закрытую ўкладку", + "Repair": "Аднавіць", + "Repair Failed": "Не ўдалося аднавіць", + "Repair corrupted PDF": "Аднавіць пашкоджаны PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Адноўлена файлаў: {{length}}. Не ўдалося аднавіць: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Аднаўленне {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Аднаўленне {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Заменена \"{{beforeText}}\" на \"{{afterText}}\"", + "Required": "Абавязкова", + "Resamples even when an image is only slightly above the limit.": "Змяняе разрашэнне, нават калі відарыс толькі крыху перавышае абмежаванне.", + "Reset Form": "Скінуць форму", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Скінуць і вярнуцца да загрузкі файлаў? Усе незахаваныя змены будуць страчаны.", + "Resolution": "Разрашэнне", + "Retain Page Labels": "Захаваць пазнакі старонак", + "Retry Failed": "Паўтарыць няўдалыя", + "Reverse Pages": "Адваротны парадак старонак", + "Reverse page order": "Змяніць парадак старонак на адваротны", + "Reversing page order...": "Змяненне парадку старонак на адваротны...", + "Reversing {{name}} ({{n}}/{{length}})...": "Змяненне парадку {{name}} на адваротны ({{n}}/{{length}})...", + "Right": "Справа", + "Right edge in points": "Правы край у пунктах", + "Rotate": "Павярнуць", + "Rotate +90°": "Павярнуць на +90°", + "Rotate all pages": "Павярнуць усе старонкі", + "Rotation": "Паварот", + "Rotation Variance": "Варыяцыя павароту", + "Rotations applied successfully!": "Паваротам паспяхова ўжыты!", + "Rows": "Радкі", + "Run Javascript": "Запусціць Javascript", + "Running OCR on page {{pageNum}}...": "Запуск OCR на старонцы {{pageNum}}...", + "Running...": "Выконваецца...", + "SVG": "SVG", + "SVG Files": "Файлы SVG", + "SVG to PDF": "SVG у PDF", + "Sanitize": "Ачысціць", + "Sanitized With Warnings": "Ачышчана з папярэджаннямі", + "Sanitizing PDF...": "Ачыстка PDF...", + "Saturation": "Насычанасць", + "Saved": "Захавана", + "Saving PDF with layer changes...": "Захаванне PDF са зменамі слаёў...", + "Scaling Mode": "Рэжым маштабавання", + "Scanner Effect": "Эфект сканера", + "Scanner effect applied successfully!": "Эфект сканера паспяхова ўжыты!", + "Scanning page {{n}} of {{pageCount}}...": "Сканаванне старонкі {{n}} з {{pageCount}}...", + "Search Text": "Пошук тэксту", + "Search languages...": "Пошук моў...", + "Select Font": "Выберыце шрыфт", + "Select a field to edit properties": "Выберыце поле, каб рэдагаваць уласцівасці", + "Select a field...": "Выберыце поле...", + "Select to add this button to an existing group": "Выберыце, каб дадаць гэтую кнопку ў існуючую групу", + "Selected Option": "Выбраны варыянт", + "Self-Signed: Signer Identity Not Verified": "Самападпісаны: асоба падпісанта не пацверджана", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Рэсурсы ўласнага OCR наладжаны не цалкам. Укажыце {{missing}} разам з астатнімі URL рэсурсаў Tesseract.", + "Separator": "Раздзяляльнік", + "Separator Color": "Колер раздзяляльніка", + "Separator Thickness": "Таўшчыня раздзяляльніка", + "Sepia": "Сэпія", + "Serial Number:": "Серыйны нумар:", + "Set custom destination": "Задаць свой пункт прызначэння", + "Shapes": "Фігуры", + "Sheet {{n}} {{sideLabel}}": "Ліст {{n}} {{sideLabel}}", + "Show": "Паказаць", + "Show password": "Паказаць пароль", + "Show/Hide Field": "Паказаць/схаваць поле", + "Sign Here": "Падпішыце тут", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents не з'яўляецца адным аб'ектам DER з нулявым запаўненнем", + "Signature Algorithm:": "Алгарытм подпісу:", + "Signature Intact: Signer Identity Not Verified": "Подпіс не пашкоджаны: асоба падпісанта не пацверджана", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Поля подпісу ў PDF з'яўляюцца палямі подпісу AcroForm і будуць бачныя толькі ў пашыраным праглядальніку PDF.", + "Signature has a missing or malformed /ByteRange": "У подпісе адсутнічае або няправільны /ByteRange", + "Signature scheme {{kind}} not implemented": "Схема подпісу {{kind}} не рэалізавана", + "Signature {{n}}": "Подпіс {{n}}", + "Signatures": "Подпісы", + "Signed By": "Падпісана", + "Signed On": "Дата подпісу", + "Signed PDF Not Changed": "Падпісаны PDF не зменены", + "Signed PDF downloaded successfully!": "Падпісаны PDF паспяхова спампаваны!", + "Signed PDF saved successfully!": "Падпісаны PDF паспяхова захаваны!", + "Simple (1, 2, 3)": "Просты (1, 2, 3)", + "Simplify large color profiles": "Спрасціць вялікія каляровыя профілі", + "Skew Threshold": "Парог перакосу", + "Skip": "Прапусціць", + "Skip All": "Прапусціць усе", + "Skip Remaining": "Прапусціць астатнія", + "Skip this file": "Прапусціць гэты файл", + "Skipped: {{join}}.": "Прапушчана: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Файлы меншага памеру, але адкрыць іх могуць толькі праграмы з падтрымкай Brotli, напрыклад Firefox, MuPDF 1.26+ і Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Некаторыя файлы прапушчаны, бо гэта не відарысы, якія падтрымліваюцца.", + "Some files were skipped. Only BMP files are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі файлы BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі файлы HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі файлы JPG, JPEG, JP2 і JPX.", + "Some files were skipped. Only PDF files are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі файлы PDF.", + "Some files were skipped. Only PNG images are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі відарысы PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Некаторыя файлы прапушчаны. Дазволена толькі графіка SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі файлы TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі відарысы WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі фарматы відарысаў, якія падтрымліваюцца.", + "Some files were skipped. Only text files are allowed.": "Некаторыя файлы прапушчаны. Дазволены толькі тэкставыя файлы.", + "Some pages could not be processed. Please try again.": "Не ўдалося апрацаваць некаторыя старонкі. Паспрабуйце яшчэ раз.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Не ўдалося ўжыць некаторыя адзнакі закрэслівання, таму файл не быў спампаваны. Ужыце або выдаліце іх у рэдактары і паспрабуйце яшчэ раз.", + "Spacing": "Прамежак", + "Split PDF": "Падзяліць PDF", + "Split by Bookmarks": "Падзяліць па закладках", + "Split pages into tile grid for poster printing": "Падзяліць старонкі на сетку плітак для друку постэра", + "Split pages vertically or horizontally": "Падзяліць старонкі вертыкальна або гарызантальна", + "Splitting PDF pages...": "Падзел старонак PDF...", + "Splitting PDF...": "Падзел PDF...", + "Spreadsheets": "Табліцы", + "Standard (192 DPI)": "Стандартнае (192 DPI)", + "Standard Size": "Стандартны памер", + "Standardize all pages to a target size": "Прывесці ўсе старонкі да мэтавага памеру", + "Standardizing pages...": "Уніфікацыя старонак...", + "Stitch all pages into one continuous page": "Зшыць усе старонкі ў адну бесперапынную старонку", + "Straighten skewed PDF pages": "Выправіць перакошаныя старонкі PDF", + "Strip all annotations": "Выдаліць усе анатацыі", + "Style": "Стыль", + "Style Changed": "Стыль зменены", + "Style changed ({{length}} regions)": "Стыль зменены (абласцей: {{length}})", + "Subject": "Тэма", + "Subset embedded fonts": "Пакінуць толькі патрэбныя сімвалы ў убудаваных шрыфтах", + "Success": "Поспех", + "Success!": "Гатова!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Файлаў CSV паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Файлаў Excel паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Файлаў ODT паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} PDF(s) to DOCX.": "PDF паспяхова канвертавана ў DOCX: {{length}}.", + "Successfully converted {{length}} PDF(s) to Markdown.": "PDF паспяхова канвертавана ў Markdown: {{length}}.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "PDF паспяхова канвертавана ў {{level}}: {{length}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Файлаў PSD паспяхова канвертавана ў адзін PDF: {{length}}.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Файлаў PowerPoint паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Файлаў RTF паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} Word document(s) to PDF.": "Дакументаў Word паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} files to PDF.": "Файлаў паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Файлаў {{TOOL_NAME}} паспяхова канвертавана ў PDF: {{length}}.", + "Successfully converted {{name}} to DOCX.": "{{name}} паспяхова канвертаваны ў DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} паспяхова канвертаваны ў Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} паспяхова канвертаваны ў PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} паспяхова канвертаваны ў {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF паспяхова вынят для выкарыстання з ШІ/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "PDF паспяхова вынята для выкарыстання з ШІ/LLM: {{completed}}.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF паспяхова растарызаваны з {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "PDF паспяхова растарызавана з {{dpi}} DPI: {{completed}}.", + "Supported: CBZ, CBR": "Падтрымліваюцца: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Падтрымліваюцца: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Падтрымліваюцца: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Падтрымліваюцца: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Падтрымліваюцца: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Падтрымліваюцца: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Падтрымліваюцца: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Падтрымліваюцца: XPS, OXPS", + "Switches apps": "Пераключае праграмы", + "Switches tabs": "Пераключае ўкладкі", + "Table of Contents": "Змест", + "Table {{n}} (Page {{page}})": "Табліца {{n}} (старонка {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Мэтавае поле", + "Target Kilobytes": "Мэтавы памер у кілабайтах", + "Target Not Reached": "Мэта не дасягнута", + "Target Size": "Мэтавы памер", + "Technical Details": "Тэхнічныя падрабязнасці", + "Temperature": "Тэмпература", + "Template \"{{name}}\" loaded.": "Шаблон \"{{name}}\" загружаны.", + "Template \"{{name}}\" saved.": "Шаблон \"{{name}}\" захаваны.", + "Text": "Тэкст", + "Text Color": "Колер тэксту", + "Text Files": "Тэкставыя файлы", + "Text color changed successfully!": "Колер тэксту паспяхова зменены!", + "Text converted to PDF successfully!": "Тэкст паспяхова канвертаваны ў PDF!", + "Text extracted successfully!": "Тэкст паспяхова вынят!", + "Text to PDF": "Тэкст у PDF", + "That password did not open any of the remaining files.": "Гэты пароль не падышоў ні да аднаго з астатніх файлаў.", + "The PDF file(s) do not contain any attachments to extract.": "У файлах PDF няма далучэнняў для вымання.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "У PDF {{totalPages}} стар., што не дзеліцца нацэла на {{nValue}}. Апошні PDF будзе змяшчаць старонак: {{remainder}}.", + "The PDF might be corrupted or password protected.": "PDF можа быць пашкоджаны або абаронены паролем.", + "The PDF might be corrupted or password-protected.": "PDF можа быць пашкоджаны або абаронены паролем.", + "The PDF might be corrupted.": "PDF можа быць пашкоджаны.", + "The PDF viewer is still initializing.": "Праглядальнік PDF яшчэ ініцыялізуецца.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF спампаваны, але не ўдалося выканаць наступныя крокі: {{join}}. Змесціва, якога яны тычацца, можа заставацца ў файле.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL вярнуў нечаканы тып змесціва: {{contentType}}. Чакаўся файл JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Байты, выключаныя з /ByteRange, не з'яўляюцца дакладна подпісам у hex-кадзіроўцы", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Байты, выключаныя з /ByteRange, не з'яўляюцца /Contents гэтага подпісу", + "The compression engine returned an unreadable result.": "Рухавік сціску вярнуў нечытэльны вынік.", + "The compression engine stopped unexpectedly.": "Рухавік сціску нечакана спыніўся.", + "The current password you entered is incorrect. Please try again.": "Уведзены бягучы пароль няправільны. Паспрабуйце яшчэ раз.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Наступныя назвы палёў ужо існуюць у загружаным PDF: {{conflictList}}. Перайменуйце гэтыя палі, перш чым спампоўваць.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Наступныя назвы палёў выкарыстоўваюцца больш за адзін раз: {{duplicateList}}. Перайменуйце гэтыя палі, каб назвы былі ўнікальнымі, перш чым спампоўваць.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Колькасць указаных старонак ({{length}}) не супадае з бягучай колькасцю старонак у дакуменце ({{currentGridCount}}). Укажыце поўны парадак для ўсіх старонак.", + "The password you entered is incorrect. Please try again.": "Уведзены пароль няправільны. Паспрабуйце яшчэ раз.", + "The password you entered is wrong or the file is corrupted.": "Уведзены пароль няправільны або файл пашкоджаны.", + "The provided file could not be loaded as an image. It may be corrupted.": "Не ўдалося загрузіць указаны файл як відарыс. Ён можа быць пашкоджаны.", + "The requested OCR language is not available: {{unavailableText}}.": "Запатрабаваная мова OCR недаступная: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Указаны парадак старонак няпоўны або змяшчае няправільныя нумары старонак. Пераканайцеся, што вы ўказалі новую пазіцыю для кожнай зыходнай старонкі.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Гэтыя файлы не з'яўляюцца сапраўднымі PDF, таму не былі дададзены: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Гэтыя файлы абаронены паролем: {{names}}. Увядзіце іх паролі на картках файлаў або выдаліце іх, затым сціскайце яшчэ раз.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Гэтая зборка BentoPDF змяшчае даныя OCR толькі для: {{availableText}}.", + "This PDF does not contain any digital signatures.": "У гэтым PDF няма лічбавых подпісаў.", + "This PDF has no layers (OCG).": "У гэтым PDF няма слаёў (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Гэты PDF абаронены паролем. Каб працягнуць, увядзіце бягучы пароль.", + "This document contains pages with different dimensions:": "У гэтым дакуменце ёсць старонкі розных памераў:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "У дакуменце ёсць 1 пазнака хавання, якую яшчэ не ўжылі. Пакуль пазнаку не ўжылі, змесціва пад ёй застаецца ў файле. Ужыць усе пазнакі і спампаваць?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "У дакуменце ёсць няўжытыя пазнакі хавання (усяго: {{count}}). Пакуль пазнаку не ўжылі, змесціва пад ёй застаецца ў файле. Ужыць усе пазнакі і спампаваць?", + "This feature requires {{name}} to be configured.": "Для гэтай функцыі трэба наладзіць {{name}}.", + "This file is not a valid PDF.": "Гэты файл не з'яўляецца сапраўдным PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Гэты модуль ліцэнзаваны па AGPL-3.0. Наладжваючы яго, вы згаджаецеся з умовамі яго ліцэнзіі.", + "This tool has been disabled": "Гэты інструмент адключаны", + "This tool is not available in your deployment. Contact your administrator for more information.": "Гэты інструмент недаступны ў вашым разгортванні. Звярніцеся да адміністратара, каб атрымаць больш інфармацыі.", + "Threshold": "Парог", + "Tile": "Плітка", + "Tile Gap X": "Прамежак пліткі па X", + "Tile Gap Y": "Прамежак пліткі па Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Адзнака часу", + "Timestamp Failed": "Не ўдалося дадаць адзнаку часу", + "Tint": "Адценне", + "Title": "Загаловак", + "To actually fill or change the options, use our PDF Form Filler tool.": "Каб запоўніць форму або змяніць параметры, скарыстайцеся нашым інструментам «Запоўніць форму PDF».", + "Toggle": "Пераключыць", + "Toggle style": "Пераключыць стыль", + "Toggle sync scroll": "Пераключыць сінхроннае пракручванне", + "Tool Unavailable": "Інструмент недаступны", + "Tooltip / Help Text": "Падказка / даведачны тэкст", + "Top": "Зверху", + "Top Center": "Зверху па цэнтры", + "Top Left": "Зверху злева", + "Top Right": "Зверху справа", + "Top edge in points": "Верхні край у пунктах", + "Total Pages": "Усяго старонак", + "Transparent Background": "Празрысты фон", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Спрабуе JPEG 2000 замест JPEG для кожнага відарыса і пакідае меншы вынік.", + "Trim margins from all pages": "Абрэзаць палі на ўсіх старонках", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Праверка даверу: подпісаў, праверанных па ўласным сертыфікаце, {{trustVerified}}/{{length}}", + "Trusted": "Давераны", + "Trusted certificate loaded": "Давераны сертыфікат загружаны", + "Tsa Url": "URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Выключае якасць, разрашэнне і ўсе іншыя крокі апрацоўкі відарысаў са стратамі.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL павінен пачынацца з http:// або https://", + "Ultra (384 DPI)": "Ультра (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Не ўдалося расшыфраваць PDF з указаным паролем.", + "Unable to repair any of the uploaded PDF files.": "Не ўдалося аднавіць ніводзін з загружаных файлаў PDF.", + "Unembed standard fonts": "Выдаліць стандартныя шрыфты з файла", + "Unembed standard-font look-alikes": "Выдаліць падобныя на стандартныя шрыфты", + "Unexpected delimiter in content stream": "Нечаканы раздзяляльнік у струмені змесціва", + "Unexpected reply from the engine.": "Нечаканы адказ ад рухавіка.", + "Uniform": "Аднолькавы", + "Unique Page Sizes": "Унікальныя памеры старонак", + "Unknown": "Невядома", + "Unknown error": "Невядомая памылка", + "Unknown error occurred in worker.": "Невядомая памылка ў worker.", + "Unknown error occurred.": "Адбылася невядомая памылка.", + "Unlock": "Разблакіраваць", + "Unlock All": "Разблакіраваць усе", + "Unlock Remaining ({{remaining}})": "Разблакіраваць астатнія ({{remaining}})", + "Unlocked": "Разблакіравана", + "Unlocked {{unlocked}} of {{length}} files.": "Разблакіравана {{unlocked}} з {{length}} файлаў.", + "Unlocking...": "Разблакіроўка...", + "Unresolved optional content reference": "Неразвязаная спасылка на дадатковае змесціва", + "Unsupported ECDSA curve in signer certificate": "Крывая ECDSA ў сертыфікаце падпісанта не падтрымліваецца", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Відарыс не падтрымліваецца. Для вадзянога знака выкарыстоўвайце PNG або JPG.", + "Unsupported digest OID {{digestOid}}": "OID хэшу {{digestOid}} не падтрымліваецца", + "Unsupported file type: .{{ext}}": "Тып файла не падтрымліваецца: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID алгарытму подпісу {{oid}} не падтрымліваецца", + "Unterminated array or dictionary in content stream": "Незавершаны масіў або слоўнік у струмені змесціва", + "Unterminated hex string in content stream": "Незавершаны hex-радок у струмені змесціва", + "Unterminated inline image in content stream": "Незавершаны ўбудаваны відарыс у струмені змесціва", + "Unterminated string in content stream": "Незавершаны радок у струмені змесціва", + "Unverified: Unsupported Signature Algorithm": "Не правераны: алгарытм подпісу не падтрымліваецца", + "Updating metadata...": "Абнаўленне метаданых...", + "Upload Certificate": "Загрузіць сертыфікат", + "Upload Comics": "Загрузіць коміксы", + "Upload Documents": "Загрузіць дакументы", + "Upload EPUB Files": "Загрузіць файлы EPUB", + "Upload Email Files": "Загрузіць файлы электроннай пошты", + "Upload FB2 Files": "Загрузіць файлы FB2", + "Upload Images": "Загрузіць відарысы", + "Upload JSON Files": "Загрузіць файлы JSON", + "Upload MOBI Files": "Загрузіць файлы MOBI", + "Upload Markdown Files": "Загрузіць файлы Markdown", + "Upload ODG Files": "Загрузіць файлы ODG", + "Upload PDFs": "Загрузіць PDF", + "Upload PUB Files": "Загрузіць файлы PUB", + "Upload Pages Files": "Загрузіць файлы Pages", + "Upload Presentations": "Загрузіць прэзентацыі", + "Upload SVG Files": "Загрузіць файлы SVG", + "Upload Spreadsheets": "Загрузіць табліцы", + "Upload Text Files": "Загрузіць тэкставыя файлы", + "Upload Visio Files": "Загрузіць файлы Visio", + "Upload WPD Files": "Загрузіць файлы WPD", + "Upload WPS Files": "Загрузіць файлы WPS", + "Upload XML Files": "Загрузіць файлы XML", + "Upload XPS Files": "Загрузіць файлы XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Загрузіце PDF і націсніце «Стварыць перадпрагляд», каб убачыць макет буклета", + "Upload images and convert to PDF": "Загрузіце відарысы і канвертуйце іх у PDF", + "Upload one or more PDF files": "Загрузіце адзін або некалькі файлаў PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Вялікія літары A-Z, лічбы 0-9 і - . $ / + % ПРАБЕЛ", + "Use same password for all files": "Выкарыстоўваць адзін пароль для ўсіх файлаў", + "User Password": "Пароль карыстальніка", + "VSD to PDF": "VSD у PDF", + "Valid From": "Дзейнічае з", + "Valid Signature": "Сапраўдны подпіс", + "Valid Until": "Дзейнічае да", + "Validating {{n}} of {{length}}: {{name}}": "Праверка {{n}} з {{length}}: {{name}}", + "Validating...": "Праверка...", + "Value": "Значэнне", + "Value (e.g., Marketing)": "Значэнне (напрыклад, Маркетынг)", + "Vertical": "Вертыкальна", + "Viewer not ready": "Праглядальнік не гатовы", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Праглядальнік не гатовы. Загрузіце PDF і пачакайце, пакуль ён скончыць загрузку.", + "Visibility": "Бачнасць", + "Visio Files": "Файлы Visio", + "WPD to PDF": "WPD у PDF", + "WPS Files": "Файлы WPS", + "WPS to PDF": "WPS у PDF", + "Watermark": "Вадзяны знак", + "Watermark added successfully!": "Вадзяны знак паспяхова дададзены!", + "Web Crypto API not available in this context": "Web Crypto API недаступны ў гэтым кантэксце", + "Web Crypto import/verify failed: {{error}}": "Памылка імпарту або праверкі Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "Белы спіс", + "Width ({{unit}})": "Шырыня ({{unit}})", + "Word": "Word", + "Word Documents": "Дакументы Word", + "Word to PDF": "Word у PDF", + "WordPerfect Files": "Файлы WordPerfect", + "Worker crashed": "Worker аварыйна завяршыўся", + "Worker error occurred. Check console for details.": "Памылка worker. Падрабязнасці глядзіце ў кансолі.", + "Workflow completed": "Працоўны працэс завершаны", + "Wrong password": "Няправільны пароль", + "Wrong password for: {{join}}": "Няправільны пароль для: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Няправільны пароль, або не ўдалося расшыфраваць \"{{name}}\".", + "X Position": "Пазіцыя X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Файлы XML", + "XML to PDF": "XML у PDF", + "XMP Metadata": "Метаданыя XMP", + "XPS Files": "Файлы XPS", + "XPS to PDF": "XPS у PDF", + "Y Position": "Пазіцыя Y", + "Year must be between 1900 and 2100": "Год павінен быць ад 1900 да 2100", + "Yellow": "Жоўты", + "Yellowish": "Жаўтаваты", + "You cannot delete the last page of the document.": "Нельга выдаліць апошнюю старонку дакумента.", + "Your PDF has been cropped and the download has started.": "Ваш PDF абрэзаны, спампоўванне пачалося.", + "Your PDF has been downloaded successfully.": "Ваш PDF паспяхова спампаваны.", + "Your PDF has been posterized.": "З вашага PDF створаны постэр.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Закрэсліванне ўжыта да старонак, але гэты файл зашыфраваны, таму BentoPDF не можа выдаліць копіі закрэсленага тэксту з яго ўласцівасцей, закладак і далучэнняў. Для поўнай ачысткі закрэсліце незашыфраваную копію і потым дадайце пароль праз «Зашыфраваць PDF». Усё роўна спампаваць?", + "Your workflow needs at least one input node and one output node to run.": "Каб запусціць працоўны працэс, патрэбны хаця б адзін вузел уводу і адзін вузел вываду.", + "ZIP archive created successfully!": "Архіў ZIP паспяхова створаны!", + "Zoom(%)": "Маштаб (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "напр. dd/mm/yyyy HH:MM:ss", + "form": "форма", + "https://example.com": "https://example.com", + "signature found": "подпіс знойдзены", + "signatures found": "подпісы знойдзены", + "{{brandName}} - {{title}}": "{{brandName}} | {{title}}", + "{{count}} node": "{{count}} вузел", + "{{count}} nodes": "Вузлоў: {{count}}", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 старонка", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • старонак: {{pageCount}}", + "{{length}} Files Need a Password": "Файлаў, якім патрэбны пароль: {{length}}", + "{{length}} PDF file(s) selected": "Выбрана файлаў PDF: {{length}}", + "{{length}} PDF files selected": "Выбрана файлаў PDF: {{length}}", + "{{length}} attachment(s) extracted successfully!": "Далучэнняў паспяхова вынята: {{length}}!", + "{{length}} file • {{totalPages}} total pages": "Файлаў: {{length}} • усяго старонак: {{totalPages}}", + "{{length}} file(s) attached successfully.": "Файлаў паспяхова далучана: {{length}}.", + "{{length}} files • {{totalPages}} total pages": "Файлаў: {{length}} • усяго старонак: {{totalPages}}", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Файл быў абаронены паролем, таму сціснутая копія не мае пароля. Дадайце яго зноў праз «Абараніць PDF».", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, старонак: {{totalPageCount}})", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} мае лічбавы подпіс, таму быў пакінуты без змен. Сціск парушыў бы подпіс. Каб усё роўна сціснуць яго, уключыце «Перакрыць абарону змесціва» ў наладах карыстальніка; яго подпісы будуць выдалены.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} не з'яўляецца сапраўдным PDF, таму не быў дададзены.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} абаронены паролем. Увядзіце яго пароль на карце файла, затым сціскайце яшчэ раз.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (с. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Не ўдалося загрузіць колькасць старонак", + "{{size}} • Loading pages...": "{{size}} • Загрузка старонак...", + "{{size}} • Loading...": "{{size}} • Загрузка...", + "{{size}} • {{getPageCount}} pages": "{{size}} • старонак: {{getPageCount}}", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • старонак: {{numPages}}", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • старонак: {{pageCount}}", + "{{size}} • {{totalPages}} pages": "{{size}} • старонак: {{totalPages}}", + "{{size}} • {{value}} pages": "{{size}} • старонак: {{value}}", + "{{successCount}} PDF(s) decrypted successfully.": "PDF паспяхова расшыфравана: {{successCount}}.", + "{{successCount}} PDF(s) linearized successfully.": "PDF паспяхова зроблена лінейнымі: {{successCount}}.", + "{{totalPages}} pages → {{numSheets}} output sheets": "Старонак: {{totalPages}} → выходных лістоў: {{numSheets}}", + "{{validCount}} valid": "сапраўдных: {{validCount}}", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 старонка", + "• {{label}}: {{count}} pages": "• {{label}}: старонак: {{count}}" +} diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index b0a867e0..57972ac4 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Obre el menú principal", "language": "Idioma", "searchLanguage": "Cerca un idioma…", - "noLanguagesFound": "No s'ha trobat cap idioma" + "noLanguagesFound": "No s'ha trobat cap idioma", + "breadcrumb": "Ruta de navegació" }, "donation": { "message": "T'agrada BentoPDF? Ajuda'ns a mantenir-lo gratuït i de codi obert!", @@ -236,6 +237,10 @@ "aboutUs": "Sobre nosaltres", "faqLink": "Preguntes freqüents", "contactUs": "Contacta amb nosaltres", + "tools": "Eines", + "pdfConverter": "Convertidor de PDF", + "pdfSecurity": "Seguretat de PDF", + "mergeSplit": "Combina i divideix PDF", "legal": "Informació legal", "termsAndConditions": "Termes i condicions", "privacyPolicy": "Política de privadesa", diff --git a/public/locales/ca/tools.json b/public/locales/ca/tools.json index cede54fe..3e549e3c 100644 --- a/public/locales/ca/tools.json +++ b/public/locales/ca/tools.json @@ -28,7 +28,21 @@ "subtitle": "Combina diversos PDF en un sol fitxer. Conserva els marcadors.", "retainPageLabels": "Conserva les etiquetes de pàgina originals de cada fitxer", "retainPageLabelsHint": "Desactivat (predeterminat): el PDF fusionat utilitza la numeració natural de pàgines, d'1 a N. Activat: es conserven les etiquetes originals de cada fitxer (pot generar etiquetes duplicades).", - "removeDuplicateFonts": "Elimina els tipus de lletra duplicats" + "removeDuplicateFonts": "Elimina els tipus de lletra duplicats", + "alert": { + "thumbnailError": "No s'han pogut generar les miniatures de les pàgines", + "noSelection": "No hi ha cap fitxer ni pàgina seleccionats per fusionar.", + "mergeSuccess": "Els PDF s'han fusionat correctament!", + "mergeFailed": "No s'han pogut fusionar els PDF.", + "mergeError": "No s'han pogut fusionar els PDF. Comprova que tots els fitxers siguin vàlids i que no estiguin protegits amb contrasenya.", + "workerError": "S'ha produït un error inesperat durant la fusió.", + "loadError": "No s'han pogut carregar un o més fitxers PDF" + }, + "loader": { + "renderingPreviews": "S'estan generant les previsualitzacions de les pàgines...", + "merging": "S'estan fusionant els PDF...", + "loadingDocuments": "S'estan carregant els documents PDF..." + } }, "splitPdf": { "name": "Divideix PDF", @@ -36,29 +50,7 @@ }, "compressPdf": { "name": "Comprimeix PDF", - "subtitle": "Redueix la mida del fitxer PDF.", - "algorithmLabel": "Algorisme de compressió", - "condense": "Condense (recomanat)", - "photon": "Photon (per a PDF amb moltes fotografies)", - "condenseInfo": "Condense utilitza compressió avançada: elimina dades innecessàries, optimitza les imatges i redueix els tipus de lletra als caràcters utilitzats. És l'opció ideal per a la majoria de PDF.", - "photonInfo": "Photon converteix les pàgines en imatges. Utilitza'l per a PDF amb moltes fotografies o documents escanejats.", - "photonWarning": "Advertiment: el text deixarà de ser seleccionable i els enllaços no funcionaran.", - "levelLabel": "Nivell de compressió", - "light": "Lleugera (conserva la qualitat)", - "balanced": "Equilibrada (recomanada)", - "aggressive": "Agressiva (fitxers més petits)", - "extreme": "Extrema (compressió màxima)", - "grayscale": "Converteix a escala de grisos", - "grayscaleHint": "Redueix la mida del fitxer eliminant la informació de color", - "customSettings": "Configuració personalitzada", - "customSettingsHint": "Ajusta els paràmetres de compressió:", - "outputQuality": "Qualitat de sortida", - "resizeImagesTo": "Redimensiona les imatges a", - "onlyProcessAbove": "Processa només les que superin", - "removeMetadata": "Elimina les metadades", - "subsetFonts": "Redueix els tipus de lletra (elimina els glifs no utilitzats)", - "removeThumbnails": "Elimina les miniatures incrustades", - "compressButton": "Comprimeix PDF" + "subtitle": "Redueix la mida del fitxer PDF." }, "pdfEditor": { "name": "Editor de PDF", diff --git a/public/locales/ca/ui.json b/public/locales/ca/ui.json new file mode 100644 index 00000000..9b054669 --- /dev/null +++ b/public/locales/ca/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(corregit)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} més...", + "- Error parsing XMP XML. Displaying raw. -": "- Error en analitzar l'XML d'XMP. Es mostra sense processar. -", + "- No Info Dictionary data found -": "- No s'han trobat dades del diccionari d'informació -", + "- No XMP metadata found -": "- No s'han trobat metadades XMP -", + "- No interactive form fields found -": "- No s'han trobat camps de formulari interactius -", + "- No parseable XMP properties found -": "- No s'han trobat propietats XMP analitzables -", + "-- Select existing group --": "-- Selecciona un grup existent --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (molt sensible)", + "0.5° (Default)": "0,5° (per defecte)", + "1.0° (Normal)": "1,0° (normal)", + "100 (Fast)": "100 (ràpid)", + "150 (Default)": "150 (per defecte)", + "1x2 (Booklet)": "1x2 (quadern)", + "2.0° (Less Sensitive)": "2,0° (menys sensible)", + "200 (Better)": "200 (millor)", + "200 (Good)": "200 (bo)", + "2x2 (4-up)": "2x2 (4 per full)", + "2x4 (8-up)": "2x4 (8 per full)", + "300 (Best Quality)": "300 (màxima qualitat)", + "300 (Print)": "300 (impressió)", + "4x4 (16-up)": "4x4 (16 per full)", + "600 (High Quality)": "600 (alta qualitat)", + "72 (Screen)": "72 (pantalla)", + "90° Clockwise": "90° en sentit horari", + "90° Counter-clockwise": "90° en sentit antihorari", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Ja existeix un camp anomenat «{{fieldName}}». Canvia el nom d'aquest camp perquè sigui únic abans de baixar el fitxer.", + "A new version of BentoPDF is available. Reload to update?": "Hi ha una versió nova de BentoPDF disponible. Vols tornar a carregar per actualitzar?", + "A single PDF file": "Un sol fitxer PDF", + "A template with this name already exists.": "Ja existeix una plantilla amb aquest nom.", + "ASCII characters (letters, numbers, symbols)": "Caràcters ASCII (lletres, números, símbols)", + "Action": "Acció", + "Add Blank Page": "Afegeix una pàgina en blanc", + "Add Bookmark": "Afegeix un marcador", + "Add Child Bookmark": "Afegeix un marcador fill", + "Add Child Layer": "Afegeix una capa filla", + "Add More Comics": "Afegeix més còmics", + "Add More Documents": "Afegeix més documents", + "Add More EPUB Files": "Afegeix més fitxers EPUB", + "Add More Email Files": "Afegeix més fitxers de correu electrònic", + "Add More FB2 Files": "Afegeix més fitxers FB2", + "Add More Files": "Afegeix més fitxers", + "Add More Images": "Afegeix més imatges", + "Add More JSON Files": "Afegeix més fitxers JSON", + "Add More MOBI Files": "Afegeix més fitxers MOBI", + "Add More Markdown Files": "Afegeix més fitxers Markdown", + "Add More ODG Files": "Afegeix més fitxers ODG", + "Add More PUB Files": "Afegeix més fitxers PUB", + "Add More Pages Files": "Afegeix més fitxers Pages", + "Add More Presentations": "Afegeix més presentacions", + "Add More SVG Files": "Afegeix més fitxers SVG", + "Add More Spreadsheets": "Afegeix més fulls de càlcul", + "Add More Text Files": "Afegeix més fitxers de text", + "Add More Visio Files": "Afegeix més fitxers Visio", + "Add More WPD Files": "Afegeix més fitxers WPD", + "Add More WPS Files": "Afegeix més fitxers WPS", + "Add More XML Files": "Afegeix més fitxers XML", + "Add More XPS Files": "Afegeix més fitxers XPS", + "Add a new layer to get started!": "Afegeix una capa nova per començar!", + "Add a text box": "Afegeix un quadre de text", + "Add an RFC 3161 document timestamp": "Afegeix un segell de temps de document RFC 3161", + "Add an image": "Afegeix una imatge", + "Add at least one node to run the workflow.": "Afegeix almenys un node per executar el flux de treball.", + "Add child": "Afegeix un fill", + "Add child layer": "Afegeix una capa filla", + "Add header and footer text": "Afegeix text de capçalera i peu de pàgina", + "Add page numbers": "Afegeix números de pàgina", + "Add searchable text layer via OCR": "Afegeix una capa de text cercable amb OCR", + "Add text watermark": "Afegeix una marca d'aigua de text", + "Add/Edit/Extract Attachments": "Afegeix/edita/extreu fitxers adjunts", + "Added": "Afegit", + "Added \"{{afterText}}\"": "S'ha afegit «{{afterText}}»", + "Added image ({{width}}×{{height}})": "S'ha afegit una imatge ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "S'ha afegit {{insertCount}} pàgina en blanc correctament!", + "Added {{insertCount}} blank pages successfully!": "S'han afegit {{insertCount}} pàgines en blanc correctament!", + "Adding header & footer...": "Afegint capçalera i peu de pàgina...", + "Adding page numbers...": "Afegint números de pàgina...", + "Adding watermark...": "Afegint la marca d'aigua...", + "Adding {{insertCount}} blank page...": "Afegint {{insertCount}} pàgina en blanc...", + "Adding {{insertCount}} blank pages...": "Afegint {{insertCount}} pàgines en blanc...", + "Adding {{name}} ({{n}}/{{length}})...": "Afegint {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Ajusta els colors", + "Adjust brightness, contrast, and colors": "Ajusta la brillantor, el contrast i els colors", + "Advanced": "Avançat", + "Advanced Feature Required": "Cal una funció avançada", + "Advanced Settings": "Configuració avançada", + "After Page": "Després de la pàgina", + "After Page...": "Després de la pàgina...", + "Align Objects": "Alinea els objectes", + "Alignment": "Alineació", + "All": "Tot", + "All files repaired successfully!": "Tots els fitxers s'han reparat correctament!", + "Alternate Merge": "Fusió alterna", + "Alternating and mixing pages...": "Alternant i barrejant pàgines...", + "Always resample to that resolution": "Remostreja sempre a aquesta resolució", + "An error occurred during compression. Error: {{error}}": "S'ha produït un error durant la compressió. Error: {{error}}", + "An error occurred during conversion. Error: {{error}}": "S'ha produït un error durant la conversió. Error: {{error}}", + "An error occurred during conversion. Error: {{message}}": "S'ha produït un error durant la conversió. Error: {{message}}", + "An error occurred during cropping.": "S'ha produït un error durant el retall.", + "An error occurred during extraction. Error: {{error}}": "S'ha produït un error durant l'extracció. Error: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "S'ha produït un error durant la rasterització. Error: {{error}}", + "An error occurred during sanitization: {{msg}}": "S'ha produït un error durant el sanejament: {{msg}}", + "An error occurred while combining pages.": "S'ha produït un error en combinar les pàgines.", + "An error occurred while creating the N-Up PDF.": "S'ha produït un error en crear el PDF N-Up.", + "An error occurred while creating the booklet.": "S'ha produït un error en crear el quadern.", + "An error occurred while dividing the PDF.": "S'ha produït un error en dividir el PDF.", + "An error occurred while mixing the PDFs.": "S'ha produït un error en barrejar els PDF.", + "An error occurred while standardizing pages.": "S'ha produït un error en estandarditzar les pàgines.", + "An error occurred while trying to remove metadata.": "S'ha produït un error en intentar eliminar les metadades.", + "An error occurred: {{error}}": "S'ha produït un error: {{error}}", + "An error occurred: {{error}}.": "S'ha produït un error: {{error}}.", + "An owner password is required when setting permissions": "Cal una contrasenya de propietari per definir permisos", + "An unexpected error occurred during the repair process.": "S'ha produït un error inesperat durant el procés de reparació.", + "An unexpected error occurred.": "S'ha produït un error inesperat.", + "Analyzing data structure...": "Analitzant l'estructura de dades...", + "Analyzing full PDF metadata...": "Analitzant totes les metadades del PDF...", + "Analyzing signatures...": "Analitzant les signatures...", + "Angle": "Angle", + "Annotations removed successfully!": "Anotacions eliminades correctament!", + "Any text, URL, or data": "Qualsevol text, URL o dades", + "Application": "Aplicació", + "Apply a digital signature to PDF": "Aplica una signatura digital al PDF", + "Apply and download": "Aplica i baixa", + "Apply redactions?": "Vols aplicar les censures?", + "Apply scanner simulation effect": "Aplica un efecte de simulació d'escàner", + "Applying Bates numbers...": "Aplicant números Bates...", + "Applying color adjustments...": "Aplicant els ajustos de color...", + "Applying crop...": "Aplicant el retall...", + "Applying redactions...": "Aplicant les censures...", + "Applying rotations...": "Aplicant els girs...", + "Applying scanner effect...": "Aplicant l'efecte d'escàner...", + "Applying timestamp...": "Aplicant el segell de temps...", + "Applying {{replace}}...": "Aplicant {{replace}}...", + "Archive contains an oversized image entry.": "L'arxiu conté una imatge massa gran.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "L'arxiu té massa imatges (màx. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "L'arxiu és massa gran un cop descomprimit.", + "Are you sure you want to reset? All your work will be lost.": "Segur que vols restablir-ho? Perdràs tot el teu treball.", + "Area (Coordinates)": "Àrea (coordenades)", + "Area ({{unit}}²)": "Àrea ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman i Courier New s'assignen als equivalents integrats. Només s'aplica quan és segur.", + "Arrange multiple pages per sheet": "Disposa diverses pàgines per full", + "Arrange pages for booklet printing": "Disposa les pàgines per imprimir un quadern", + "Aspect Ratio": "Relació d'aspecte", + "At least one PDF document is required for export.": "Cal almenys un document PDF per exportar.", + "At least two valid PDFs are required.": "Calen almenys dos PDF vàlids.", + "Attaching files to PDF...": "Adjuntant fitxers al PDF...", + "Attachments updated successfully!": "Fitxers adjunts actualitzats correctament!", + "Author": "Autor", + "Auto (Keep Original)": "Automàtic (conserva l'original)", + "Back": "Revers", + "Back to Home": "Torna a l'inici", + "Background Color": "Color de fons", + "Background color changed successfully!": "El color de fons s'ha canviat correctament!", + "Barcode": "Codi de barres", + "Barcode Format": "Format del codi de barres", + "Barcode Value": "Valor del codi de barres", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Números Bates aplicats correctament! ({{batesStart}} a {{n}})", + "Beginning": "Al principi", + "Binarize": "Binaritza", + "Blank Position": "Posició de la pàgina en blanc", + "Blue": "Blau", + "Blur": "Desenfocament", + "Bold": "Negreta", + "Bold & Italic": "Negreta i cursiva", + "Booklet": "Quadern", + "Booklet created with {{numSheets}} sheets!": "S'ha creat el quadern amb {{numSheets}} fulls!", + "Bookmarks imported from JSON!": "Marcadors importats des de JSON!", + "Bookmarks page": "Pàgina de marcadors", + "Border": "Vora", + "Border Color": "Color de la vora", + "Bottom": "A baix", + "Bottom Center": "Baix al centre", + "Bottom Left": "Baix a l'esquerra", + "Bottom Right": "Baix a la dreta", + "Bottom edge in points": "Vora inferior en punts", + "Brightness": "Brillantor", + "Brotli and rasterizing were skipped to keep it PDF/A.": "S'han ometut Brotli i la rasterització per mantenir el PDF/A.", + "Brotli compression (PDF 2.0)": "Compressió Brotli (PDF 2.0)", + "Browser Note:": "Nota sobre el navegador:", + "Building new PDF...": "Creant el PDF nou...", + "Building page pairing model...": "Construint el model d'aparellament de pàgines...", + "Button": "Botó", + "ByteRange does not start at the beginning of the file": "ByteRange no comença a l'inici del fitxer", + "ByteRange out of bounds": "ByteRange fora dels límits", + "CBZ to PDF": "CBZ a PDF", + "CSV Loaded": "CSV carregat", + "CSV file is empty": "El fitxer CSV està buit", + "Cancel": "Cancel·la", + "Cannot Delete": "No es pot suprimir", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "No es pot accedir als controls del visualitzador. Utilitza el botó de baixada de la barra d'eines del visualitzador de PDF de dalt.", + "Cannot delete all pages": "No es poden suprimir totes les pàgines", + "Cannot delete all pages.": "No es poden suprimir totes les pàgines.", + "Canvas context failed": "Ha fallat el context del llenç", + "Canvas context unavailable": "El context del llenç no està disponible", + "Canvas toBlob conversion failed.": "Ha fallat la conversió amb toBlob del llenç.", + "Canvas toBlob failed": "Ha fallat toBlob del llenç", + "Center": "Al centre", + "Certificate (.pfx, .p12, .pem)": "Certificat (.pfx, .p12, .pem)", + "Certificate Expired": "Certificat caducat", + "Certificate Password": "Contrasenya del certificat", + "Certificate unlocked": "Certificat desbloquejat", + "Change Certificate": "Canvia el certificat", + "Change background color": "Canvia el color de fons", + "Changing background color...": "Canviant el color de fons...", + "Changing text color...": "Canviant el color del text...", + "Character": "Caràcter", + "Checked State": "Estat marcat", + "Choose a valid page range.": "Tria un interval de pàgines vàlid.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Tria un dels idiomes inclosos o torna a crear el paquet aïllat afegint l'idioma que falta a --ocr-languages.", + "Cleanup": "Neteja", + "Click on PDF to Pick Location": "Fes clic al PDF per triar la ubicació", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Fes clic al botó de dalt i després al PDF, al lloc on vols que apunti el marcador", + "Click to Upload Image": "Fes clic per pujar una imatge", + "Clicking this field in the PDF will open a file picker to upload an image.": "En fer clic en aquest camp del PDF s'obrirà un selector de fitxers per pujar una imatge.", + "Clip invisible parts of images": "Retalla les parts invisibles de les imatges", + "Close": "Tanca", + "Close (Esc)": "Tanca (Esc)", + "Close panel": "Tanca el tauler", + "Closes tab": "Tanca la pestanya", + "Closes window": "Tanca la finestra", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (marcadors i metadades)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF no està configurat. Configura'l a la configuració de WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF ha produït un fitxer desxifrat buit.", + "CoherentPDF: not configured.": "CoherentPDF: no configurat.", + "Color": "Color", + "Color adjustments applied successfully!": "Ajustos de color aplicats correctament!", + "Colors inverted successfully!": "Colors invertits correctament!", + "Cols": "Cols.", + "Combine multiple PDFs into one": "Combina diversos PDF en un", + "Combine to Single Page": "Combina en una sola pàgina", + "Combining pages...": "Combinant pàgines...", + "Comic Archives": "Arxius de còmics", + "Comments and markup become part of the page. Form fields and links keep working.": "Els comentaris i el marcat passen a formar part de la pàgina. Els camps de formulari i els enllaços continuen funcionant.", + "Complete": "Completat", + "Complete!": "Completat!", + "Compress": "Comprimeix", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "S'han comprimit {{compressedCount}} PDF. La mida total s'ha reduït de {{totalOriginalSize}} a {{totalCompressedSize}} (s'ha estalviat un {{value}} %).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "S'han comprimit {{compressedCount}} PDF. Mida total: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Comprimint diversos PDF...", + "Compressing to {{size}}...": "Comprimint a {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Comprimint {{n}}/{{length}}: {{name}}...", + "Compressing...": "Comprimint...", + "Compression Complete": "Compressió completada", + "Compression Finished": "Compressió acabada", + "Compression Level": "Nivell de compressió", + "Configure": "Configura", + "Confirm": "Confirma", + "Confirm Action": "Confirma l'acció", + "Conformance": "Conformitat", + "Connected": "Connectat", + "Contact Info": "Informació de contacte", + "Content": "Contingut", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "El hash del contingut no coincideix amb l'atribut messageDigest: el PDF s'ha modificat després de signar-lo", + "Contrast": "Contrast", + "Conversion Complete": "Conversió completada", + "Conversion Error": "Error de conversió", + "Conversion engine ready!": "El motor de conversió està a punt!", + "Conversion failed: could not create PDF/A definition": "Ha fallat la conversió: no s'ha pogut crear la definició PDF/A", + "Convert Apple Pages documents to PDF": "Converteix documents d'Apple Pages a PDF", + "Convert EPUB ebooks to PDF": "Converteix llibres electrònics EPUB a PDF", + "Convert Excel spreadsheets to PDF": "Converteix fulls de càlcul d'Excel a PDF", + "Convert FB2 e-books to PDF": "Converteix llibres electrònics FB2 a PDF", + "Convert JSON files to PDF": "Converteix fitxers JSON a PDF", + "Convert MOBI e-books to PDF": "Converteix llibres electrònics MOBI a PDF", + "Convert Markdown files to PDF": "Converteix fitxers Markdown a PDF", + "Convert Microsoft Publisher to PDF": "Converteix Microsoft Publisher a PDF", + "Convert OpenDocument Graphics to PDF": "Converteix OpenDocument Graphics a PDF", + "Convert PDF pages to SVG": "Converteix pàgines de PDF a SVG", + "Convert PDF pages to images (ZIP)": "Converteix pàgines de PDF a imatges (ZIP)", + "Convert PDF tables to CSV": "Converteix taules de PDF a CSV", + "Convert PDF tables to Excel": "Converteix taules de PDF a Excel", + "Convert PDF to Markdown text": "Converteix PDF a text Markdown", + "Convert PDF to PDF/A for archiving": "Converteix PDF a PDF/A per arxivar", + "Convert PDF to Word document": "Converteix PDF a document de Word", + "Convert PowerPoint presentations to PDF": "Converteix presentacions de PowerPoint a PDF", + "Convert SVG files to PDF": "Converteix fitxers SVG a PDF", + "Convert To Grayscale": "Converteix a escala de grisos", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Converteix diagrames de Visio (VSD/VSDX) a PDF", + "Convert WPS Office documents to PDF": "Converteix documents de WPS Office a PDF", + "Convert Word documents to PDF": "Converteix documents de Word a PDF", + "Convert WordPerfect documents to PDF": "Converteix documents de WordPerfect a PDF", + "Convert XML documents to PDF": "Converteix documents XML a PDF", + "Convert XPS/OXPS documents to PDF": "Converteix documents XPS/OXPS a PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Converteix arxius de còmics (CBZ/CBR) a PDF", + "Convert email files (.eml, .msg) to PDF": "Converteix fitxers de correu (.eml, .msg) a PDF", + "Convert fonts to vector outlines": "Converteix tipus de lletra a contorns vectorials", + "Convert plain text to PDF": "Converteix text pla a PDF", + "Convert to grayscale": "Converteix a escala de grisos", + "Convert to greyscale": "Converteix a escala de grisos", + "Convert to image-based PDF": "Converteix a PDF basat en imatges", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "S'han convertit {{length}} fitxers ({{totalPages}} pàgines) a SVG!", + "Converted {{pageCount}} pages to SVG!": "S'han convertit {{pageCount}} pàgines a SVG!", + "Converter not initialized": "El convertidor no s'ha inicialitzat", + "Converting BMP to PDF...": "Convertint BMP a PDF...", + "Converting HEIC to PDF...": "Convertint HEIC a PDF...", + "Converting TIFF to PDF...": "Convertint TIFF a PDF...", + "Converting emails...": "Convertint correus...", + "Converting files...": "Convertint fitxers...", + "Converting fonts to outlines...": "Convertint tipus de lletra a contorns...", + "Converting images to PDF...": "Convertint imatges a PDF...", + "Converting multiple PDFs to PDF/A...": "Convertint diversos PDF a PDF/A...", + "Converting multiple RTF files to PDF...": "Convertint diversos fitxers RTF a PDF...", + "Converting multiple files...": "Convertint diversos fitxers...", + "Converting page {{n}} of {{pageCount}}...": "Convertint la pàgina {{n}} de {{pageCount}}...", + "Converting to Markdown...": "Convertint a Markdown...", + "Converting to SVG...": "Convertint a SVG...", + "Converting to greyscale...": "Convertint a escala de grisos...", + "Converting to {{level}}...": "Convertint a {{level}}...", + "Converting {{name}}...": "Convertint {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Convertint {{n}}/{{length}}: {{name}}...", + "Converting...": "Convertint...", + "Copied": "Copiat", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "No s'ha pogut accedir a l'exportador del PDF amb segells. Utilitza el botó Exporta → PDF de la barra d'eines del visualitzador.", + "Could not add blank page.": "No s'ha pogut afegir la pàgina en blanc.", + "Could not add blank pages.": "No s'han pogut afegir les pàgines en blanc.", + "Could not add header or footer.": "No s'ha pogut afegir la capçalera o el peu de pàgina.", + "Could not add page numbers.": "No s'han pogut afegir els números de pàgina.", + "Could not add the watermark.": "No s'ha pogut afegir la marca d'aigua.", + "Could not apply rotations.": "No s'han pogut aplicar els girs.", + "Could not change text color.": "No s'ha pogut canviar el color del text.", + "Could not change the background color.": "No s'ha pogut canviar el color de fons.", + "Could not create ZIP archive.": "No s'ha pogut crear l'arxiu ZIP.", + "Could not create canvas context.": "No s'ha pogut crear el context del llenç.", + "Could not create comparison canvas context.": "No s'ha pogut crear el context del llenç de comparació.", + "Could not create offscreen comparison canvas.": "No s'ha pogut crear el llenç de comparació fora de pantalla.", + "Could not create visual diff context.": "No s'ha pogut crear el context de la diferència visual.", + "Could not create visual diff overlay context.": "No s'ha pogut crear el context de la superposició de la diferència visual.", + "Could not detect blank pages.": "No s'han pogut detectar les pàgines en blanc.", + "Could not display the page.": "No s'ha pogut mostrar la pàgina.", + "Could not export comparison PDF.": "No s'ha pogut exportar el PDF de comparació.", + "Could not export the signed PDF. Please try again.": "No s'ha pogut exportar el PDF signat. Torna-ho a provar.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "No s'ha pogut exportar el PDF amb segells. Utilitza el botó Exporta → PDF de la barra d'eines del visualitzador.", + "Could not extract signer public key": "No s'ha pogut extreure la clau pública del signant", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "No s'ha trobat {{testFile}} a l'URL indicat (HTTP {{status}}). Comprova que el fitxer existeixi.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "No s'ha pogut analitzar el PDF del tot. Pot estar malmès o tenir una estructura poc habitual.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "No s'ha pogut generar una previsualització. Pot ser que el fitxer estigui malmès o tingui funcions no compatibles. Error: {{message}}", + "Could not get canvas context": "No s'ha pogut obtenir el context del llenç", + "Could not invert PDF colors.": "No s'han pogut invertir els colors del PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "No s'ha pogut carregar el PDF. Pot estar malmès o protegit amb contrasenya.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "No s'ha pogut carregar el PDF. El fitxer pot ser invàlid, estar malmès o protegit amb contrasenya.", + "Could not load the PDF engine. Please refresh the page and try again.": "No s'ha pogut carregar el motor de PDF. Actualitza la pàgina i torna-ho a provar.", + "Could not parse signer info": "No s'ha pogut analitzar la informació del signant", + "Could not posterize the PDF.": "No s'ha pogut posteritzar el PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "No s'ha pogut processar «{{name}}». Pot ser que el fitxer estigui malmès.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "No s'ha pogut reduir més la mida del fitxer. Original: {{originalSize}}, nou: {{compressedSize}}.", + "Could not remove annotations.": "No s'han pogut eliminar les anotacions.", + "Could not remove blank pages.": "No s'han pogut eliminar les pàgines en blanc.", + "Could not remove leftover data from the PDF.": "No s'han pogut eliminar les dades residuals del PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "No s'ha pogut eliminar el text censurat de les dades del document, de manera que el fitxer no s'ha baixat.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "No s'han pogut invertir les pàgines del PDF. Comprova que els fitxers siguin PDF vàlids.", + "Could not update metadata. Please check that date formats are correct.": "No s'han pogut actualitzar les metadades. Comprova que els formats de data siguin correctes.", + "Count": "Nombre", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Creat", + "Creating Booklet...": "Creant el quadern...", + "Creating Excel file...": "Creant el fitxer d'Excel...", + "Creating N-Up PDF...": "Creant el PDF N-Up...", + "Creating PDF from JPGs...": "Creant un PDF a partir de JPG...", + "Creating PDF from SVG files...": "Creant un PDF a partir de fitxers SVG...", + "Creating PDF...": "Creant el PDF...", + "Creating ZIP archive...": "Creant l'arxiu ZIP...", + "Creating ZIP file...": "Creant el fitxer ZIP...", + "Creating ZIP...": "Creant el ZIP...", + "Creating table...": "Creant la taula...", + "Creator": "Creador", + "Crop": "Retalla", + "Crop complete! Your download has started.": "Retall completat! S'ha iniciat la baixada.", + "Cryptographic verification failed": "Ha fallat la verificació criptogràfica", + "Custom": "Personalitzat", + "Custom Format": "Format personalitzat", + "Custom Height": "Alçada personalitzada", + "Custom Units": "Unitats personalitzades", + "Custom Width": "Amplada personalitzada", + "Custom Zoom": "Zoom personalitzat", + "Custom...": "Personalitzat...", + "DataMatrix": "DataMatrix", + "Date Format": "Format de data", + "Decrease size": "Redueix la mida", + "Decrypt": "Desxifra", + "Decrypting PDF...": "Desxifrant el PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Desxifrant {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Desxifrant {{n}} de {{length}}: {{name}}", + "Decrypting...": "Desxifrant...", + "Decryption Failed": "Ha fallat el desxifratge", + "Delete": "Suprimeix", + "Delete \"{{title}}\"?": "Vols suprimir «{{title}}»?", + "Delete Field": "Suprimeix el camp", + "Delete Page": "Suprimeix la pàgina", + "Delete Pages": "Suprimeix pàgines", + "Delete all {{length}} bookmark(s) ? ": "Vols suprimir els {{length}} marcadors?", + "Delete layer": "Suprimeix la capa", + "Delete {{size}} bookmark(s) ? ": "Vols suprimir {{size}} marcadors?", + "Deleted": "Suprimit", + "Deleted {{size}} page(s) successfully!": "S'han suprimit {{size}} pàgines correctament!", + "Deleting pages...": "Suprimint pàgines...", + "Description": "Descripció", + "Description for screen readers": "Descripció per als lectors de pantalla", + "Deselect All": "Desselecciona-ho tot", + "Deskew": "Endreça la inclinació", + "Deskew PDF": "Endreça la inclinació del PDF", + "Deskewed {{length}} file(s). {{value}}": "S'han endreçat {{length}} fitxers. {{value}}", + "Deskewing {{name}}...": "Endreçant la inclinació de {{name}}...", + "Destination": "Destinació", + "Detecting blank pages...": "Detectant pàgines en blanc...", + "Digest Algorithm:": "Algorisme de resum:", + "Digital Sign": "Signatura digital", + "Direction": "Direcció", + "Divide Pages": "Divideix pàgines", + "Divide into boxes (0 to disable)": "Divideix en caixes (0 per desactivar)", + "Document Properties": "Propietats del document", + "Document Type": "Tipus de document", + "Document properties": "Propietats del document", + "Document-level attachment": "Fitxer adjunt a nivell de document", + "Done: back to tools": "Fet: torna a les eines", + "Download": "Baixa", + "Download Edited PDF": "Baixa el PDF editat", + "Download anyway": "Baixa igualment", + "Download as PDF or ZIP automatically": "Baixa automàticament com a PDF o ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "S'han baixat {{length}} fitxers PDF en un arxiu ZIP.", + "Downloads started for all files.": "S'han iniciat les baixades de tots els fitxers.", + "Dpi": "Ppp", + "Drops tagging, which screen readers rely on.": "Elimina l'etiquetatge, en què es basen els lectors de pantalla.", + "Duplicate Field Name": "Nom de camp duplicat", + "Duplicate Field Names": "Noms de camp duplicats", + "Duplicate Page": "Duplica la pàgina", + "Duplicate Page Numbers": "Números de pàgina duplicats", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "La signatura ECDSA no es verifica amb la clau pública del signant", + "EPUB Files": "Fitxers EPUB", + "EPUB to PDF": "EPUB a PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ a PDF", + "Edit": "Edita", + "Edit All": "Edita-ho tot", + "Edit Bookmark": "Edita el marcador", + "Edit Bookmarks": "Edita els marcadors", + "Edit Images": "Edita les imatges", + "Edit Metadata": "Edita les metadades", + "Edit PDF metadata": "Edita les metadades del PDF", + "Edit Scope": "Àmbit d'edició", + "Edit Shapes": "Edita les formes", + "Edit Text": "Edita el text", + "Edit tool": "Eina d'edició", + "Edit {{scopes}}": "Edita {{scopes}}", + "Email Files": "Fitxers de correu", + "Email to PDF": "Correu a PDF", + "Embedding files into PDF...": "Incrustant fitxers al PDF...", + "Empty signature bytes": "Bytes de signatura buits", + "Encrypt": "Xifra", + "Encrypt PDF with password": "Xifra el PDF amb contrasenya", + "Encrypted file": "Fitxer xifrat", + "Encrypting PDF with 256-bit AES...": "Xifrant el PDF amb AES de 256 bits...", + "Encryption Failed": "Ha fallat el xifratge", + "Encryption resulted in an empty file.": "El xifratge ha generat un fitxer buit.", + "End": "Final", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Introdueix 0 per inserir-ho al principi, o {{pageCount}} per inserir-ho al final.", + "Enter bookmark title": "Introdueix el títol del marcador", + "Enter name for child layer under \"{{Layer}}\":": "Introdueix el nom de la capa filla de «{{Layer}}»:", + "Enter password": "Introdueix la contrasenya", + "Enter password...": "Introdueix la contrasenya...", + "Enter passwords for each encrypted file": "Introdueix les contrasenyes de cada fitxer xifrat", + "Error": "Error", + "Error during execution": "Error durant l'execució", + "Error generating PDF: {{error}}": "Error en generar el PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Error en carregar el fitxer PDF. Torna-ho a provar amb un PDF vàlid.", + "Error reading files: {{error}}": "Error en llegir els fitxers: {{error}}", + "Error saving PDF. Check console for details.": "Error en desar el PDF. Consulta la consola per als detalls.", + "Error: {{error}}": "Error: {{error}}", + "Exactly 11 or 12 digits": "Exactament 11 o 12 dígits", + "Exactly 12 or 13 digits": "Exactament 12 o 13 dígits", + "Example of current format:": "Exemple del format actual:", + "Excel to PDF": "Excel a PDF", + "Existing Radio Groups": "Grups de botons d'opció existents", + "Export Error": "Error d'exportació", + "Export Value": "Valor d'exportació", + "Export failed": "Ha fallat l'exportació", + "External processing module needed": "Cal un mòdul de processament extern", + "Extract Images": "Extreu imatges", + "Extract Pages": "Extreu pàgines", + "Extract Tables": "Extreu taules", + "Extract a range of pages": "Extreu un interval de pàgines", + "Extract all images from PDF": "Extreu totes les imatges del PDF", + "Extract pages as separate PDFs": "Extreu pàgines com a PDF separats", + "Extract text from PDF": "Extreu el text del PDF", + "Extracted 1 table successfully!": "S'ha extret 1 taula correctament!", + "Extracted text from {{length}} PDF files!": "S'ha extret el text de {{length}} fitxers PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "S'han extret {{completed}} PDF, {{failed}} han fallat.", + "Extracted {{length}} page(s) successfully!": "S'han extret {{length}} pàgines correctament!", + "Extracted {{length}} table(s) to Excel!": "S'han extret {{length}} taules a Excel!", + "Extracted {{length}} tables successfully!": "S'han extret {{length}} taules correctament!", + "Extracting attachments from {{length}} file(s)...": "Extraient els fitxers adjunts de {{length}} fitxers...", + "Extracting images from {{name}}...": "Extraient les imatges de {{name}}...", + "Extracting pages...": "Extraient pàgines...", + "Extracting tables...": "Extraient taules...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Extraient el text del fitxer {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Extraient el text de diversos fitxers...", + "Extracting text from {{name}}...": "Extraient el text de {{name}}...", + "Extracting text...": "Extraient el text...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Extraient {{name}} per a IA ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Extraient {{name}} per a IA...", + "Extracting...": "Extraient...", + "Extraction Complete": "Extracció completada", + "Extraction Error": "Error d'extracció", + "Extraction Partial": "Extracció parcial", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extracció completada! {{length}} fitxers adjunts en un fitxer ZIP ({{totalSize}}). S'ha iniciat la baixada.", + "FB2 Files": "Fitxers FB2", + "FB2 to PDF": "FB2 a PDF", + "Failed": "Ha fallat", + "Failed to acquire 2D canvas context": "No s'ha pogut obtenir el context del llenç 2D", + "Failed to add child layer": "No s'ha pogut afegir la capa filla", + "Failed to apply Bates numbers.": "No s'han pogut aplicar els números Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "No s'han pogut aplicar els ajustos de color. Pot ser que el fitxer estigui malmès.", + "Failed to apply redactions.": "No s'han pogut aplicar les censures.", + "Failed to apply scanner effect. The file might be corrupted.": "No s'ha pogut aplicar l'efecte d'escàner. Pot ser que el fitxer estigui malmès.", + "Failed to attach files: {{error}}": "No s'han pogut adjuntar els fitxers: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "No s'ha pogut convertir BMP a PDF. Pot ser que algun dels fitxers no sigui vàlid.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "No s'ha pogut convertir HEIC a PDF. Pot ser que algun dels fitxers no sigui vàlid.", + "Failed to convert PDF to CSV. {{message}}": "No s'ha pogut convertir PDF a CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "No s'ha pogut convertir PDF a Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "No s'ha pogut convertir PDF a SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "No s'ha pogut convertir el PDF a escala de grisos. Pot ser que el fitxer estigui malmès.", + "Failed to convert PDF. It may be image-based or corrupted.": "No s'ha pogut convertir el PDF. Pot estar basat en imatges o malmès.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "No s'ha pogut convertir TIFF a PDF. Pot ser que algun dels fitxers no sigui vàlid.", + "Failed to convert images to PDF.": "No s'han pogut convertir les imatges a PDF.", + "Failed to convert text to PDF. {{error}}": "No s'ha pogut convertir el text a PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "No s'ha pogut convertir {{filename}} a PNG", + "Failed to copy metadata to clipboard.": "No s'han pogut copiar les metadades al porta-retalls.", + "Failed to create PDF.": "No s'ha pogut crear el PDF.", + "Failed to create PNG blob": "No s'ha pogut crear el blob PNG", + "Failed to create canvas context": "No s'ha pogut crear el context del llenç", + "Failed to create split PDFs.": "No s'han pogut crear els PDF dividits.", + "Failed to decode image: {{name}}": "No s'ha pogut descodificar la imatge: {{name}}", + "Failed to decrypt private key": "No s'ha pogut desxifrar la clau privada", + "Failed to decrypt. Try the Decrypt tool instead.": "No s'ha pogut desxifrar. Prova l'eina Desxifra.", + "Failed to delete layer": "No s'ha pogut suprimir la capa", + "Failed to delete pages.": "No s'han pogut suprimir les pàgines.", + "Failed to deskew PDF: {{error}}": "No s'ha pogut endreçar la inclinació del PDF: {{error}}", + "Failed to download the edited PDF.": "No s'ha pogut baixar el PDF editat.", + "Failed to edit attachments.": "No s'han pogut editar els fitxers adjunts.", + "Failed to extract certificate from PFX file": "No s'ha pogut extreure el certificat del fitxer PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "No s'han pogut extreure les pàgines (codi de sortida de qpdf {{exitCode}}).", + "Failed to extract pages.": "No s'han pogut extreure les pàgines.", + "Failed to extract tables. {{message}}": "No s'han pogut extreure les taules. {{message}}", + "Failed to extract text from PDF.": "No s'ha pogut extreure el text del PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "No s'ha pogut obtenir el perfil ICC de {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "No s'ha pogut obtenir el fitxer de tipus de lletra: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "No s'ha pogut obtenir gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "No s'ha pogut obtenir {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "No s'ha pogut obtenir el context 2D de la pàgina {{pageNumber}}", + "Failed to get canvas context": "No s'ha pogut obtenir el context del llenç", + "Failed to insert PDF. The file may be corrupted.": "No s'ha pogut inserir el PDF. Pot ser que el fitxer estigui malmès.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "No s'ha pogut carregar Ghostscript des de {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "No s'ha pogut carregar el fitxer PDF.", + "Failed to load PDF for cropping.": "No s'ha pogut carregar el PDF per retallar-lo.", + "Failed to load PDF for preview.": "No s'ha pogut carregar el PDF per a la previsualització.", + "Failed to load PDF form viewer.": "No s'ha pogut carregar el visualitzador de formularis PDF.", + "Failed to load PDF layers": "No s'han pogut carregar les capes del PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "No s'ha pogut carregar PyMuPDF des de la CDN: {{msg}}", + "Failed to load SVG image": "No s'ha pogut carregar la imatge SVG", + "Failed to load WebP image": "No s'ha pogut carregar la imatge WebP", + "Failed to load attachments from PDF.": "No s'han pogut carregar els fitxers adjunts del PDF.", + "Failed to load files: {{error}}": "No s'han pogut carregar els fitxers: {{error}}", + "Failed to load image.": "No s'ha pogut carregar la imatge.", + "Failed to load image: {{filename}}": "No s'ha pogut carregar la imatge: {{filename}}", + "Failed to load one or more PDF files.": "No s'han pogut carregar un o més fitxers PDF.", + "Failed to load script: {{url}}": "No s'ha pogut carregar l'script: {{url}}", + "Failed to load template.": "No s'ha pogut carregar la plantilla.", + "Failed to load the PDF Editor.": "No s'ha pogut carregar l'editor de PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "No s'ha pogut carregar el processador d'imatges. Assegura't que el navegador admeti SharedArrayBuffer (requereix HTTPS o localhost).", + "Failed to parse CSV: {{error}}": "No s'ha pogut analitzar el CSV: {{error}}", + "Failed to parse signature": "No s'ha pogut analitzar la signatura", + "Failed to parse the certificate file.": "No s'ha pogut analitzar el fitxer de certificat.", + "Failed to process HEIC file: {{name}}": "No s'ha pogut processar el fitxer HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "No s'ha pogut processar el fitxer WebP: {{name}}", + "Failed to read file.": "No s'ha pogut llegir el fitxer.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "No s'han pogut eliminar les restriccions. Pot ser que el PDF requereixi la contrasenya de propietari correcta.", + "Failed to render page": "No s'ha pogut representar la pàgina", + "Failed to render page previews": "No s'han pogut representar les previsualitzacions de les pàgines", + "Failed to render page previews.": "No s'han pogut representar les previsualitzacions de les pàgines.", + "Failed to render page.": "No s'ha pogut representar la pàgina.", + "Failed to save changes.": "No s'han pogut desar els canvis.", + "Failed to save the new PDF. Check console for details.": "No s'ha pogut desar el PDF nou. Consulta la consola per als detalls.", + "Failed to split PDF. Please check your selection.": "No s'ha pogut dividir el PDF. Comprova la selecció.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "No s'ha pogut afegir el segell de temps al PDF: {{message}}\n\nProva un altre servidor TSA o comprova la connexió a Internet.", + "Failed to toggle layer visibility": "No s'ha pogut canviar la visibilitat de la capa", + "Failed to validate signatures. The file may be corrupted.": "No s'han pogut validar les signatures. Pot ser que el fitxer estigui malmès.", + "Features enabled by this module:": "Funcions que activa aquest mòdul:", + "Field Name": "Nom del camp", + "Field Name (Group Name)": "Nom del camp (Nom del grup)", + "Field Name Conflict": "Conflicte de nom de camp", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "El nom de camp «{{newName}}» ja existeix en aquest {{value}}. Prova d'utilitzar un nom únic.", + "Field name cannot be empty": "El nom del camp no pot estar buit", + "File": "Fitxer", + "File Size": "Mida del fitxer", + "File exists but could not be read. Check CORS configuration.": "El fitxer existeix però no s'ha pogut llegir. Comprova la configuració de CORS.", + "File list not found": "No s'ha trobat la llista de fitxers", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "La mida del fitxer s'ha reduït de {{originalSize}} a {{compressedSize}} (s'ha estalviat un {{percent}} %).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Fitxer {{n}}/{{length}}: pàgina {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Fitxer {{n}}/{{length}}: {{message}}", + "Filename": "Nom del fitxer", + "Files that failed: {{errorCount}}.": "Fitxers que han fallat: {{errorCount}}.", + "Fill (cover full target page)": "Omple (cobreix tota la pàgina de destinació)", + "Fill Color": "Color d'emplenament", + "Finalizing PDF...": "Finalitzant el PDF...", + "Find & replace": "Cerca i substitueix", + "Finds the best quality under this size. 0 means no target.": "Cerca la millor qualitat per sota d'aquesta mida. 0 vol dir sense objectiu.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox i Chrome poden mostrar el format natiu del selector de dates mentre selecciones. El format correcte s'aplicarà quan acabis d'introduir la data.", + "First Indent": "Sagnat de primera línia", + "Fit (keep full page visible)": "Ajusta (mantén tota la pàgina visible)", + "Fit Page": "Ajusta a la pàgina", + "Fix Page Size": "Corregeix la mida de pàgina", + "Flatten": "Aplana", + "Flatten Forms": "Aplana formularis", + "Flatten annotations": "Aplana les anotacions", + "Flatten form fields": "Aplana els camps de formulari", + "Flatten forms and annotations": "Aplana formularis i anotacions", + "Flatten links": "Aplana els enllaços", + "Flattening PDF...": "Aplanant el PDF...", + "Flattening and saving PDF...": "Aplanant i desant el PDF...", + "Flattening multiple PDFs...": "Aplanant diversos PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Aplanant la pàgina {{i}} de {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Aplanant {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Posa el focus a la barra d'adreces", + "Font": "Tipus de lletra", + "Font Color": "Color de la lletra", + "Font Family": "Família de tipus de lletra", + "Font Size": "Mida de la lletra", + "Font size: {{bSize}} → {{aSize}}": "Mida de la lletra: {{bSize}} → {{aSize}}", + "Font to Outline": "Lletra a contorn", + "Font: {{bFont}} → {{aFont}}": "Tipus de lletra: {{bFont}} → {{aFont}}", + "Fonts": "Tipus de lletra", + "Footer Center": "Peu de pàgina centrat", + "Footer Left": "Peu de pàgina a l'esquerra", + "Footer Right": "Peu de pàgina a la dreta", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Per a PDF només d'imatge, com els escanejats. S'omet quan el document té text seleccionable, tret que l'opció Ignora la protecció del contingut estigui activada.", + "Form fields stop being fillable.": "Els camps de formulari deixen de ser emplenables.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "S'han trobat {{length}} pàgines en blanc. Fes clic en una pàgina per desseleccionar-la.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "S'han trobat {{length}} marcadors existents. Vols substituir els marcadors actuals?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "S'han trobat {{length}} imatges en {{length2}} PDF.", + "Front": "Anvers", + "Full Coverage": "Cobertura completa", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Genera la taula de continguts a partir dels marcadors", + "Generating High-Quality PDF...": "Generant un PDF d'alta qualitat...", + "Generating PDF...": "Generant el PDF...", + "Generating ZIP file...": "Generant el fitxer ZIP...", + "Generating formatted content...": "Generant el contingut amb format...", + "Generating preview...": "Generant la previsualització...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (conversió a PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ha fallat la conversió RGB de Ghostscript amb el codi de sortida {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ha fallat la conversió de Ghostscript amb el codi de sortida {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript no ha generat el fitxer de sortida", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript no està configurat. Configura'l a la configuració avançada.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript no està configurat. Configura'l a la configuració de WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript no està configurat. PyMuPDF necessita Ghostscript per a algunes operacions. Configura'ls tots dos a la configuració avançada.", + "Ghostscript threw an exception: {{e}}": "Ghostscript ha generat una excepció: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "El wrapper de Ghostscript no exposava la interfície esperada. S'esperava loadGS() o la classe GhostscriptWASM.", + "Go": "Vés", + "Go to page": "Vés a la pàgina", + "Grayscale": "Escala de grisos", + "Green": "Verd", + "Greyscale": "Escala de grisos", + "Grid Mode": "Mode de graella", + "Group Name (Must be same for group)": "Nom del grup (ha de ser el mateix per al grup)", + "H-Scale %": "Escala horitzontal %", + "Hanging Indent": "Sagnat francès", + "Hard reloads page": "Recarrega la pàgina completament", + "Header & Footer": "Capçalera i peu de pàgina", + "Header & Footer added successfully!": "Capçalera i peu de pàgina afegits correctament!", + "Header Center": "Capçalera centrada", + "Header Left": "Capçalera a l'esquerra", + "Header Right": "Capçalera a la dreta", + "Height ({{unit}})": "Alçada ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Amaga", + "Hide Border": "Amaga la vora", + "Hide password": "Amaga la contrasenya", + "Hides window": "Amaga la finestra", + "High (288 DPI)": "Alta (288 DPI)", + "High (Smallest Files)": "Alta (fitxers més petits)", + "Horizontal": "Horitzontal", + "Hue Shift": "Desplaçament del to", + "Image Format": "Format d'imatge", + "Image Input": "Entrada d'imatge", + "Image quality": "Qualitat de la imatge", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "La imatge s'ha redimensionat de {{width}}×{{height}} a {{width2}}×{{height2}}", + "Images": "Imatges", + "Images above this are resampled down. None leaves resolution alone.": "Les imatges per sobre d'això es remostregen a la baixa. Cap deixa la resolució tal com està.", + "Imported {{length}} bookmarks!": "S'han importat {{length}} marcadors!", + "Inches (in)": "Polzades (in)", + "Include Attachments": "Inclou els fitxers adjunts", + "Include Cc Bcc": "Inclou Cc i Cco", + "Include this file": "Inclou aquest fitxer", + "Incorrect Page Count": "Nombre de pàgines incorrecte", + "Incorrect Password": "Contrasenya incorrecta", + "Incorrect password": "Contrasenya incorrecta", + "Incorrect password. Please try again.": "Contrasenya incorrecta. Torna-ho a provar.", + "Increase size": "Augmenta la mida", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indexant la pàgina {{pageNumber}} de {{totalPages}} del PDF 1...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indexant la pàgina {{pageNumber}} de {{totalPages}} del PDF 2...", + "Info": "Informació", + "Info Dictionary": "Diccionari d'informació", + "Inherit": "Hereta", + "Initialization Error": "Error d'inicialització", + "Initializing Ghostscript...": "Inicialitzant Ghostscript...", + "Initializing PDF engine...": "Inicialitzant el motor de PDF...", + "Initializing PyMuPDF...": "Inicialitzant PyMuPDF...", + "Initializing decryption...": "Inicialitzant el desxifratge...", + "Initializing encryption...": "Inicialitzant el xifratge...", + "Initializing repair engine...": "Inicialitzant el motor de reparació...", + "Initializing...": "Inicialitzant...", + "Input Required": "Cal una entrada", + "Insecure Digest (MD5 / SHA-1)": "Resum insegur (MD5 / SHA-1)", + "Insert blank pages": "Insereix pàgines en blanc", + "Insert blank pages after this page number": "Insereix pàgines en blanc després d'aquest número de pàgina", + "Interactive Form Fields": "Camps de formulari interactius", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Intercala pàgines de diversos PDF (p. ex., imparells + parells invertits d'un escaneig d'una sola cara)", + "Invalid Certificate": "Certificat no vàlid", + "Invalid File": "Fitxer no vàlid", + "Invalid Files": "Fitxers no vàlids", + "Invalid Input": "Entrada no vàlida", + "Invalid JSON format": "Format JSON no vàlid", + "Invalid Name": "Nom no vàlid", + "Invalid Order": "Ordre no vàlid", + "Invalid PDF password.": "Contrasenya del PDF no vàlida.", + "Invalid Page Numbers": "Números de pàgina no vàlids", + "Invalid Page Order": "Ordre de pàgines no vàlid", + "Invalid Pages": "Pàgines no vàlides", + "Invalid Range": "Interval no vàlid", + "Invalid Signature": "Signatura no vàlida", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL de TSA no vàlid. L'autoritat de segell de temps ha de ser un URL http:// o https:// vàlid.", + "Invalid URL": "URL no vàlid", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Format d'URL no vàlid. Introdueix un URL vàlid (p. ex., https://example.com/wasm/)", + "Invalid XML: no root element": "XML no vàlid: no hi ha cap element arrel", + "Invalid data": "Dades no vàlides", + "Invalid hex string in content stream": "Cadena hexadecimal no vàlida al flux de contingut", + "Invalid page range specified.": "L'interval de pàgines indicat no és vàlid.", + "Invalid shortcut format": "Format de drecera no vàlid", + "Invalid: Cryptographic Verification Failed": "No vàlida: ha fallat la verificació criptogràfica", + "Invert Colors": "Inverteix els colors", + "Invert all colors": "Inverteix tots els colors", + "Inverting PDF colors...": "Invertint els colors del PDF...", + "Issuer": "Emissor", + "It fits the {{targetBytes}} target.": "Compleix l'objectiu de {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Encara supera l'objectiu de {{targetBytes}} perquè Conserva el PDF/A limita fins on es pot comprimir.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Ja no declara la conformitat amb PDF/A. Activa Conserva el PDF/A a Configuració personalitzada per mantenir-la.", + "Italic": "Cursiva", + "Item 1": "Element 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "S'han eliminat les signatures digitals per poder comprimir-lo. Torna a signar-lo si cal.", + "JPEG (Smaller file size)": "JPEG (fitxer més petit)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Qualitat JPEG de les imatges recodificades, de 20 a 100. Com més baixa, fitxers més petits i més artefactes visibles.", + "JPG": "JPG", + "JSON Files": "Fitxers JSON", + "JSON Loaded": "JSON carregat", + "JSON to PDF": "JSON a PDF", + "Javascript Code": "Codi JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Manté un fitxer PDF/A conforme. Brotli i la rasterització s'ometen mentre està activat.", + "Keeps only the characters the document uses.": "Conserva només els caràcters que utilitza el document.", + "Key (e.g., Department)": "Clau (p. ex., Departament)", + "Keywords": "Paraules clau", + "Label": "Etiqueta", + "Label / Prompt": "Etiqueta / indicació", + "Landscape": "Horitzontal", + "Language": "Idioma", + "Layer not found": "No s'ha trobat la capa", + "Layer {{number}}": "Capa {{number}}", + "Leave blank for all pages": "Deixa-ho en blanc per a totes les pàgines", + "Left": "Esquerra", + "Left edge in points (1 inch = 72 pts)": "Vora esquerra en punts (1 polzada = 72 pt)", + "Legal": "Legal", + "Letter": "Carta", + "Level": "Nivell", + "Limit recognized characters (leave empty for all)": "Limita els caràcters reconeguts (deixa-ho buit per a tots)", + "Line": "Línia", + "Linearization Failed": "Ha fallat la linearització", + "Linearize": "Linearitza", + "Links stop being clickable.": "Els enllaços deixen de ser clicables.", + "Lists": "Llistes", + "Load": "Carrega", + "Load system fonts": "Carrega els tipus de lletra del sistema", + "Load system fonts…": "Carrega els tipus de lletra del sistema…", + "Loaded": "Carregat", + "Loaded bookmarks from JSON. Now upload your PDF.": "S'han carregat els marcadors des de JSON. Ara puja el PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "S'han carregat {{length}} marcadors des de CSV. Ara puja el PDF.", + "Loading Engine...": "Carregant el motor...", + "Loading Ghostscript...": "Carregant Ghostscript...", + "Loading PDF Editor...": "Carregant l'editor de PDF...", + "Loading PDF Text Editor...": "Carregant l'editor de text de PDF...", + "Loading PDF converter...": "Carregant el convertidor de PDF...", + "Loading PDF documents...": "Carregant els documents PDF...", + "Loading PDF engine...": "Carregant el motor de PDF...", + "Loading PDF files...": "Carregant els fitxers PDF...", + "Loading PDF form...": "Carregant el formulari PDF...", + "Loading PDF processor...": "Carregant el processador de PDF...", + "Loading PDF viewer...": "Carregant el visualitzador de PDF...", + "Loading PDF...": "Carregant el PDF...", + "Loading PDFs...": "Carregant els PDF...", + "Loading attachments...": "Carregant els fitxers adjunts...", + "Loading comparison {{currentPage}} of {{length}}...": "Carregant la comparació {{currentPage}} de {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Carregant el motor de conversió ({{percent}} %)...", + "Loading conversion engine...": "Carregant el motor de conversió...", + "Loading engine...": "Carregant el motor...", + "Loading fonts...": "Carregant els tipus de lletra...", + "Loading layers from {{name}}...": "Carregant les capes de {{name}}...", + "Loading page {{num}}...": "Carregant la pàgina {{num}}...", + "Loading preview...": "Carregant la previsualització...", + "Loading {{name}}...": "Carregant {{name}}...", + "Loading...": "Carregant...", + "Location": "Ubicació", + "Lossless (No Quality Loss)": "Sense pèrdua (sense pèrdua de qualitat)", + "Lossless (no image re-encoding)": "Sense pèrdua (sense recodificar les imatges)", + "Low (Best Quality)": "Baixa (millor qualitat)", + "MOBI Files": "Fitxers MOBI", + "MOBI to PDF": "MOBI a PDF", + "Malformed ByteRange": "ByteRange mal format", + "Malformed ECDSA signature (could not parse r,s)": "Signatura ECDSA mal formada (no s'ha pogut analitzar r,s)", + "Malformed inline image in content stream": "Imatge en línia mal formada al flux de contingut", + "Malformed signatureAlgorithm": "signatureAlgorithm mal format", + "Margins": "Marges", + "Markdown Files": "Fitxers Markdown", + "Markdown to PDF": "Markdown a PDF", + "Max Length (0 for unlimited)": "Longitud màxima (0 per il·limitada)", + "Maximum resolution": "Resolució màxima", + "Medium (Recommended)": "Mitjana (recomanada)", + "Merge PDF": "Fusiona PDF", + "Merge PDFs": "Fusiona PDF", + "Merge duplicate fonts": "Fusiona els tipus de lletra duplicats", + "Mermaid Error: {{error}}": "Error de Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadades copiades al porta-retalls com a JSON.", + "Metadata removed successfully!": "Metadades eliminades correctament!", + "Metadata updated successfully!": "Metadades actualitzades correctament!", + "Millimeters (mm)": "Mil·límetres (mm)", + "Minimizes window": "Minimitza la finestra", + "Missing Files": "Falten fitxers", + "Missing signatureAlgorithm": "Falta signatureAlgorithm", + "Mixed Page Sizes Detected": "S'han detectat mides de pàgina barrejades", + "Mixed Sizes": "Mides barrejades", + "Mode": "Mode", + "Modified": "Modificat", + "Modified After Signing (signed part intact)": "Modificat després de signar (la part signada és intacta)", + "More": "Més", + "Moved": "Mogut", + "Moved \"{{value}}\"": "S'ha mogut «{{value}}»", + "Multi-line": "Diverses línies", + "Must be a positive integer": "Ha de ser un nombre enter positiu", + "Must be a positive number": "Ha de ser un nombre positiu", + "N must be at least 1.": "N ha de ser com a mínim 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "PDF N-Up creat correctament!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Error de xarxa: no s'ha pogut connectar a l'URL. Comprova que l'URL sigui correcte i que el servidor permeti sol·licituds CORS.", + "Network error: {{error}}": "Error de xarxa: {{error}}", + "Next page": "Pàgina següent", + "No Area Selected": "Cap àrea seleccionada", + "No Attachments": "Cap fitxer adjunt", + "No Changes": "Cap canvi", + "No Crop Area": "Cap àrea de retall", + "No File": "Cap fitxer", + "No Files": "Cap fitxer", + "No Images Found": "No s'ha trobat cap imatge", + "No PDF Files": "Cap fitxer PDF", + "No PDF document loaded": "No s'ha carregat cap document PDF", + "No PDF document loaded.": "No s'ha carregat cap document PDF.", + "No PDF file loaded.": "No s'ha carregat cap fitxer PDF.", + "No PDF files could be decrypted. The password may be incorrect.": "No s'ha pogut desxifrar cap fitxer PDF. Pot ser que la contrasenya sigui incorrecta.", + "No PDF files could be linearized.": "No s'ha pogut linearitzar cap fitxer PDF.", + "No PDFs could be processed.": "No s'ha pogut processar cap PDF.", + "No Pages": "Cap pàgina", + "No Selection": "Cap selecció", + "No Signatures Found": "No s'ha trobat cap signatura", + "No Tables Found": "No s'ha trobat cap taula", + "No Text": "Cap text", + "No URL configured": "Cap URL configurat", + "No attachments found in this PDF.": "No s'ha trobat cap fitxer adjunt en aquest PDF.", + "No attachments selected for removal.": "No s'ha seleccionat cap fitxer adjunt per eliminar.", + "No blank pages detected in this PDF.": "No s'ha detectat cap pàgina en blanc en aquest PDF.", + "No bookmarks found at the selected level.": "No s'ha trobat cap marcador al nivell seleccionat.", + "No bookmarks to delete.": "No hi ha marcadors per suprimir.", + "No bookmarks to export!": "No hi ha marcadors per exportar!", + "No certificate found in PEM file": "No s'ha trobat cap certificat al fitxer PEM", + "No certificate found in PFX file": "No s'ha trobat cap certificat al fitxer PFX", + "No certificates found in signature": "No s'ha trobat cap certificat a la signatura", + "No changes match the current filter.": "Cap canvi coincideix amb el filtre actual.", + "No configurable settings for this node.": "Aquest node no té opcions configurables.", + "No differences detected on this page.": "No s'ha detectat cap diferència en aquesta pàgina.", + "No embedded images were found in the selected PDF(s).": "No s'ha trobat cap imatge incrustada als PDF seleccionats.", + "No existing bookmarks found in this PDF.": "No s'ha trobat cap marcador existent en aquest PDF.", + "No items were selected for removal or none were found in the PDF.": "No s'ha seleccionat cap element per eliminar o no se n'ha trobat cap al PDF.", + "No page pairs to export.": "No hi ha parells de pàgines per exportar.", + "No pages found. Please create a blank PDF or upload one.": "No s'ha trobat cap pàgina. Crea un PDF en blanc o puja'n un.", + "No pages selected for removal.": "No s'ha seleccionat cap pàgina per eliminar.", + "No pages were selected for splitting.": "No s'ha seleccionat cap pàgina per dividir.", + "No paired page for this side.": "No hi ha pàgina aparellada per a aquest costat.", + "No private key found in PEM file": "No s'ha trobat cap clau privada al fitxer PEM", + "No private key found in PFX file": "No s'ha trobat cap clau privada al fitxer PFX", + "No tables were detected in this PDF.": "No s'ha detectat cap taula en aquest PDF.", + "No valid page numbers found.": "No s'ha trobat cap número de pàgina vàlid.", + "No valid pages to save.": "No hi ha pàgines vàlides per desar.", + "No worker": "Cap worker", + "Noise": "Soroll", + "None": "Cap", + "None of the files could be compressed: {{join}}.": "No s'ha pogut comprimir cap dels fitxers: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "No hi ha prou fitxers", + "Not a PDF": "No és un PDF", + "Not connected": "No connectat", + "Not in trust chain": "No és a la cadena de confiança", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Nota: sense una contrasenya de propietari independent, el PDF no té restriccions d'ús.", + "Number Format": "Format de número", + "Number of Pages": "Nombre de pàgines", + "OCR": "OCR", + "OCR aborted before any page was processed": "L'OCR s'ha interromput abans de processar cap pàgina", + "OCR recognize timed out after {{timeoutMs}}ms": "El reconeixement OCR ha superat el temps d'espera de {{timeoutMs}} ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Fitxers ODG", + "ODG to PDF": "ODG a PDF", + "OK": "D'acord", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Desactivat (per defecte): numeració natural d'1 a N. Activat: es conserven les etiquetes de pàgina originals de cada fitxer (pot generar etiquetes duplicades).", + "One PDF per page": "Un PDF per pàgina", + "One PDF per range": "Un PDF per interval", + "Only a substitute font was available": "Només hi havia disponible un tipus de lletra substitut", + "Only where it does not change how the image looks.": "Només quan no canvia l'aspecte de la imatge.", + "Opacity": "Opacitat", + "Open URL": "Obre l'URL", + "Opens incognito window": "Obre una finestra d'incògnit", + "Opens new tab": "Obre una pestanya nova", + "Opens new window": "Obre una finestra nova", + "Operation Failed": "L'operació ha fallat", + "Operation resulted in an empty file.": "L'operació ha generat un fitxer buit.", + "Optimize PDF for fast web viewing": "Optimitza el PDF per veure'l ràpidament al web", + "Optimizing PDFs for web view (linearizing)...": "Optimitzant PDF per a la visualització web (linearitzant)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optimitzant {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opcions (una per línia o separades per comes)", + "Orientation": "Orientació", + "Outline": "Contorn", + "Output": "Sortida", + "Overlay": "Superposició", + "Overlay or underlay pages from one PDF onto another": "Superposa pàgines d'un PDF sobre un altre, per sobre o per sota", + "Owner Password": "Contrasenya de propietari", + "Owner Password Required": "Cal la contrasenya de propietari", + "PDF": "PDF", + "PDF Files": "Fitxers PDF", + "PDF Input": "Entrada de PDF", + "PDF Layers": "Capes del PDF", + "PDF Metadata": "Metadades del PDF", + "PDF Producer": "Productor de PDF", + "PDF converted to CSV successfully!": "PDF convertit a CSV correctament!", + "PDF converted to SVG successfully!": "PDF convertit a SVG correctament!", + "PDF converted to greyscale successfully!": "PDF convertit a escala de grisos correctament!", + "PDF created successfully!": "PDF creat correctament!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF desxifrat correctament! S'han eliminat tot el xifratge i les restriccions.", + "PDF decrypted successfully! Your download has started.": "PDF desxifrat correctament! S'ha iniciat la baixada.", + "PDF downloaded successfully.": "PDF baixat correctament.", + "PDF encrypted successfully with 256-bit AES!": "PDF xifrat correctament amb AES de 256 bits!", + "PDF has been sanitized and downloaded.": "El PDF s'ha sanejat i baixat.", + "PDF has no pages": "El PDF no té pàgines", + "PDF organized successfully!": "PDF organitzat correctament!", + "PDF permissions changed successfully!": "Permisos del PDF canviats correctament!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Els lectors de PDF ja inclouen les 14 fonts PDF estàndard.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Restriccions del PDF eliminades correctament! Ara el fitxer es pot editar i imprimir sense límits.", + "PDF saved successfully!": "PDF desat correctament!", + "PDF split successfully!": "PDF dividit correctament!", + "PDF to CSV": "PDF a CSV", + "PDF to DOCX": "PDF a DOCX", + "PDF to Excel/CSV": "PDF a Excel/CSV", + "PDF to Images": "PDF a imatges", + "PDF to Images (High Quality)": "PDF a imatges (alta qualitat)", + "PDF to JSON": "PDF a JSON", + "PDF to Markdown": "PDF a Markdown", + "PDF to PDF/A": "PDF a PDF/A", + "PDF to SVG": "PDF a SVG", + "PDF to Text": "PDF a text", + "PDF to XLSX": "PDF a XLSX", + "PDF with layer changes saved!": "PDF amb els canvis de capes desat!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} aplicat correctament.", + "PDF/A Conversion": "Conversió a PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (estricte, sense transparència)", + "PDF/A-2b (Recommended)": "PDF/A-2b (recomanat)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (modern, admet fitxers adjunts)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "Els PDF s'han barrejat correctament!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (sense pèrdua)", + "PUB to PDF": "PUB a PDF", + "Page": "Pàgina", + "Page #": "Pàgina núm.", + "Page Added": "Pàgina afegida", + "Page Numbers": "Números de pàgina", + "Page Removed": "Pàgina eliminada", + "Page Size": "Mida de pàgina", + "Page X of Y": "Pàgina X de Y", + "Page background or layout changed": "S'ha canviat el fons o la disposició de la pàgina", + "Page container not found": "No s'ha trobat el contenidor de pàgines", + "Page extraction produced an empty PDF.": "L'extracció de pàgines ha generat un PDF buit.", + "Page number": "Número de pàgina", + "Page numbers added successfully!": "Números de pàgina afegits correctament!", + "Page sizes standardized successfully!": "Mides de pàgina estandarditzades correctament!", + "Page {{currentPageNum}} of {{numPages}}": "Pàgina {{currentPageNum}} de {{numPages}}", + "Page {{num}} / {{numPages}}": "Pàgina {{num}} / {{numPages}}", + "Page {{n}} ": "Pàgina {{n}} ", + "Page {{n}} of {{length}}": "Pàgina {{n}} de {{length}}", + "Page {{n}}:": "Pàgina {{n}}:", + "Page {{pageNumber}}": "Pàgina {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "La pàgina {{pageNumber}} només existeix al primer PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "La pàgina {{pageNumber}} només existeix al segon PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Pàgina {{pageNumber}} de {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "La pàgina {{pageNum}} no existeix en aquest PDF.", + "Page {{page}}": "Pàgina {{page}}", + "Page {{page}} attachment": "Fitxer adjunt de la pàgina {{page}}", + "Pages": "Pàgines", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Pàgines (p. ex., 1-3, 5) - Total: {{pageCount}}", + "Pages Files": "Fitxers Pages", + "Pages Per Sheet": "Pàgines per full", + "Pages combined successfully!": "Pàgines combinades correctament!", + "Pages have been divided successfully!": "Pàgines dividides correctament!", + "Pages have been reordered.": "S'han reordenat les pàgines.", + "Pages have been reversed successfully!": "Pàgines invertides correctament!", + "Pages to PDF": "Pages a PDF", + "Paper Size": "Mida del paper", + "Paragraph": "Paràgraf", + "Parsing XML structure...": "Analitzant l'estructura XML...", + "Parsing {{name}}...": "Analitzant {{name}}...", + "Partial Coverage": "Cobertura parcial", + "Partial Success": "Èxit parcial", + "Password": "Contrasenya", + "Password Error": "Error de contrasenya", + "Password Needed": "Cal una contrasenya", + "Password Required": "Cal una contrasenya", + "Password for all files": "Contrasenya per a tots els fitxers", + "Password for all locked files": "Contrasenya per a tots els fitxers bloquejats", + "Password for {{name}}": "Contrasenya per a {{name}}", + "Password protected": "Protegit amb contrasenya", + "Password required for encrypted private key": "Cal una contrasenya per a la clau privada xifrada", + "Path Stroke": "Traç del camí", + "Please add at least one field before downloading.": "Afegeix almenys un camp abans de baixar.", + "Please draw a rectangle on at least one page to select the crop area.": "Dibuixa un rectangle en almenys una pàgina per seleccionar l'àrea de retall.", + "Please ensure all page numbers in the order are unique.": "Assegura't que tots els números de pàgina de l'ordre siguin únics.", + "Please enter a layer name": "Introdueix un nom de capa", + "Please enter a name.": "Introdueix un nom.", + "Please enter a number between 0 and {{totalPages}}.": "Introdueix un número entre 0 i {{totalPages}}.", + "Please enter a page order.": "Introdueix un ordre de pàgines.", + "Please enter a password": "Introdueix una contrasenya", + "Please enter a password for {{i}} or skip it": "Introdueix una contrasenya per a {{i}} o omet-lo", + "Please enter a title.": "Introdueix un títol.", + "Please enter a user password.": "Introdueix una contrasenya d'usuari.", + "Please enter a valid number of pages (1 or more).": "Introdueix un nombre de pàgines vàlid (1 o més).", + "Please enter a valid page number between 1 and {{total}}": "Introdueix un número de pàgina vàlid entre 1 i {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Introdueix un interval de pàgines vàlid (p. ex., 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Introdueix els números de pàgina que vols extreure.", + "Please enter positive numbers.": "Introdueix nombres positius.", + "Please enter some text to convert.": "Introdueix el text que vols convertir.", + "Please enter text for the watermark.": "Introdueix el text de la marca d'aigua.", + "Please enter the PDF password.": "Introdueix la contrasenya del PDF.", + "Please load a PDF first.": "Carrega primer un PDF.", + "Please select PDF files to create a ZIP archive.": "Selecciona fitxers PDF per crear un arxiu ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Selecciona un fitxer de certificat .pem, .crt, .cer o .der.", + "Please select a PDF file.": "Selecciona un fitxer PDF.", + "Please select a valid PDF file.": "Selecciona un fitxer PDF vàlid.", + "Please select an area on at least one page to crop.": "Selecciona una àrea en almenys una pàgina per retallar.", + "Please select an area to crop first.": "Selecciona primer una àrea per retallar.", + "Please select an area to crop.": "Selecciona una àrea per retallar.", + "Please select an image file for the watermark.": "Selecciona un fitxer d'imatge per a la marca d'aigua.", + "Please select at least one BMP file.": "Selecciona almenys un fitxer BMP.", + "Please select at least one CSV file.": "Selecciona almenys un fitxer CSV.", + "Please select at least one Excel file.": "Selecciona almenys un fitxer d'Excel.", + "Please select at least one HEIC file.": "Selecciona almenys un fitxer HEIC.", + "Please select at least one JPG file.": "Selecciona almenys un fitxer JPG.", + "Please select at least one JPG or JPEG2000 image.": "Selecciona almenys una imatge JPG o JPEG2000.", + "Please select at least one ODT file.": "Selecciona almenys un fitxer ODT.", + "Please select at least one PDF file.": "Selecciona almenys un fitxer PDF.", + "Please select at least one PowerPoint file.": "Selecciona almenys un fitxer de PowerPoint.", + "Please select at least one RTF file.": "Selecciona almenys un fitxer RTF.", + "Please select at least one SVG file.": "Selecciona almenys un fitxer SVG.", + "Please select at least one TIFF file.": "Selecciona almenys un fitxer TIFF.", + "Please select at least one Word document.": "Selecciona almenys un document de Word.", + "Please select at least one file to attach.": "Selecciona almenys un fitxer per adjuntar.", + "Please select at least one image file.": "Selecciona almenys un fitxer d'imatge.", + "Please select at least one text file.": "Selecciona almenys un fitxer de text.", + "Please select at least one {{FILETYPE_NAME}} file.": "Selecciona almenys un fitxer {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Selecciona almenys un fitxer {{TOOL_NAME}} (.eml o .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Selecciona almenys un fitxer {{TOOL_NAME}}.", + "Please select even or odd pages.": "Selecciona pàgines parelles o imparelles.", + "Please select one or more PDF files.": "Selecciona un o més fitxers PDF.", + "Please select pages to delete.": "Selecciona les pàgines que vols suprimir.", + "Please select pages to duplicate.": "Selecciona les pàgines que vols duplicar.", + "Please select pages to mark for splitting.": "Selecciona les pàgines que vols marcar per dividir.", + "Please select pages to rotate.": "Selecciona les pàgines que vols girar.", + "Please specify a page range for page-level attachments.": "Indica un interval de pàgines per als fitxers adjunts a nivell de pàgina.", + "Please upload PDF files.": "Puja fitxers PDF.", + "Please upload PDFs first.": "Puja primer els PDF.", + "Please upload a .docx file first.": "Puja primer un fitxer .docx.", + "Please upload a PDF file first.": "Puja primer un fitxer PDF.", + "Please upload a PDF file.": "Puja un fitxer PDF.", + "Please upload a PDF first.": "Puja primer un PDF.", + "Please upload a valid PDF file.": "Puja un fitxer PDF vàlid.", + "Please upload at least one PDF file.": "Puja almenys un fitxer PDF.", + "Please upload at least two PDF files to alternate and mix.": "Puja almenys dos fitxers PDF per alternar-los i barrejar-los.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Puja un PDF base i un PDF de superposició o de fons.", + "Please upload valid PDF files.": "Puja fitxers PDF vàlids.", + "Please use the Download button in the PDF viewer toolbar above.": "Utilitza el botó de baixada de la barra d'eines del visualitzador de PDF de dalt.", + "Please wait for the PDF viewer to load.": "Espera que es carregui el visualitzador de PDF.", + "Please wait for the form to finish loading.": "Espera que el formulari acabi de carregar-se.", + "Portrait": "Vertical", + "Position": "Posició", + "Post-processing for transparency compliance...": "Postprocessament per complir els requisits de transparència...", + "Posterize": "Posteritza", + "Posterizing PDF...": "Posteritzant el PDF...", + "PowerPoint to PDF": "PowerPoint a PDF", + "Pre Flatten": "Aplanament previ", + "Pre-flattening PDF...": "Aplanant prèviament el PDF...", + "Prefer JPEG 2000 for photos": "Prefereix JPEG 2000 per a les fotos", + "Preparing PDF export...": "Preparant l'exportació del PDF...", + "Preparing conversion...": "Preparant la conversió...", + "Preparing download...": "Preparant la baixada...", + "Preparing preview...": "Preparant la previsualització...", + "Presentations": "Presentacions", + "Preserve PDF/A": "Conserva el PDF/A", + "Preview": "Previsualització", + "Preview Error": "Error de previsualització", + "Preview Text": "Previsualitza el text", + "Previous page": "Pàgina anterior", + "Print Form": "Imprimeix el formulari", + "Private data that editing apps store inside the PDF.": "Dades privades que les aplicacions d'edició desen dins del PDF.", + "Processed {{processedCount}} PDFs.": "S'han processat {{processedCount}} PDF.", + "Processing Complete": "Processament completat", + "Processing Dpi": "Ppp de processament", + "Processing Failed": "Ha fallat el processament", + "Processing PDF permissions...": "Processant els permisos del PDF...", + "Processing attachments...": "Processant els fitxers adjunts...", + "Processing failed for {{name}}.": "Ha fallat el processament de {{name}}.", + "Processing file {{n}} of {{length}}...": "Processant el fitxer {{n}} de {{length}}...", + "Processing images...": "Processant les imatges...", + "Processing multiple PDFs...": "Processant diversos PDF...", + "Processing page {{i}} of {{numPages}}": "Processant la pàgina {{i}} de {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Processant la pàgina {{i}} de {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Processant la pàgina {{n}} de {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Processant la pàgina {{pageNum}} de {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Processant la pàgina {{pageNum}} de {{totalPages}}...", + "Processing produced an empty file.": "El processament ha generat un fitxer buit.", + "Processing resulted in an empty file.": "El processament ha donat un fitxer buit.", + "Processing sheet {{n}}...": "Processant el full {{n}}...", + "Processing {{name}}...": "Processant {{name}}...", + "Processing {{nodeName}}...": "Processant {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Processant {{n}}/{{length}}: {{name}}...", + "Processing...": "Processant...", + "Producer": "Productor", + "Publisher Files": "Fitxers Publisher", + "Purple": "Lila", + "PyMuPDF (Document Processing)": "PyMuPDF (processament de documents)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF no està configurat. Configura'l a la configuració avançada.", + "PyMuPDF module did not export expected PyMuPDF class.": "El mòdul de PyMuPDF no ha exportat la classe PyMuPDF esperada.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF ha produït un fitxer desxifrat buit.", + "PyMuPDF: not configured.": "PyMuPDF: no configurat.", + "QR Code": "Codi QR", + "Quality": "Qualitat", + "Quits application (cannot be overridden)": "Tanca l'aplicació (no es pot substituir)", + "RSA-PKCS1 signature does not verify against signer public key": "La signatura RSA-PKCS1 no es verifica amb la clau pública del signant", + "RSA-PSS signature does not verify against signer public key": "La signatura RSA-PSS no es verifica amb la clau pública del signant", + "Rasterization Complete": "Rasterització completada", + "Rasterization Partial": "Rasterització parcial", + "Rasterize": "Rasteritza", + "Rasterize Dpi": "Ppp de rasterització", + "Rasterize pages to images": "Rasteritza les pàgines a imatges", + "Rasterize quality": "Qualitat de rasterització", + "Rasterize resolution (DPI)": "Resolució de rasterització (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "S'han rasteritzat {{completed}} PDF, {{failed}} han fallat.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rasteritzant {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rasteritzant {{name}}...", + "Rasterizing...": "Rasteritzant...", + "Rating must be between 0 and 5": "La valoració ha d'estar entre 0 i 5", + "Read Only": "Només lectura", + "Reading CSV file...": "Llegint el fitxer CSV...", + "Reading PDF...": "Llegint el PDF...", + "Reading XML file...": "Llegint el fitxer XML...", + "Reading encrypted PDF...": "Llegint el PDF xifrat...", + "Reading files...": "Llegint els fitxers...", + "Reading layer configuration...": "Llegint la configuració de les capes...", + "Reading {{name}} ({{n}}/{{length}})...": "Llegint {{name}} ({{n}}/{{length}})...", + "Ready": "A punt", + "Reason": "Motiu", + "Red": "Vermell", + "Redact": "Censura", + "Redact Mode": "Mode de censura", + "Redact text from PDF": "Censura el text del PDF", + "Redaction Failed": "Ha fallat la censura", + "Reduce PDF file size": "Redueix la mida del fitxer PDF", + "Reduce color complexity": "Redueix la complexitat del color", + "Reduces file size by removing color information.": "Redueix la mida del fitxer eliminant la informació de color.", + "Reloads page": "Recarrega la pàgina", + "Remove": "Elimina", + "Remove All Attachments": "Elimina tots els fitxers adjunts", + "Remove Annotations": "Elimina les anotacions", + "Remove Blank Pages": "Elimina les pàgines en blanc", + "Remove Embedded Files": "Elimina els fitxers incrustats", + "Remove Fonts": "Elimina els tipus de lletra", + "Remove Javascript": "Elimina el JavaScript", + "Remove Layers": "Elimina les capes", + "Remove Links": "Elimina els enllaços", + "Remove Mark Info": "Elimina la informació de marcatge", + "Remove Metadata": "Elimina les metadades", + "Remove PDF password protection": "Elimina la protecció amb contrasenya del PDF", + "Remove Structure Tree": "Elimina l'arbre d'estructura", + "Remove alternate images": "Elimina les imatges alternatives", + "Remove application data": "Elimina les dades de l'aplicació", + "Remove article threads": "Elimina els fils d'articles", + "Remove attachment": "Elimina el fitxer adjunt", + "Remove blank pages automatically": "Elimina les pàgines en blanc automàticament", + "Remove document structure tree": "Elimina l'arbre d'estructura del document", + "Remove file": "Elimina el fitxer", + "Remove metadata, scripts, and hidden data": "Elimina metadades, scripts i dades ocultes", + "Remove output intents": "Elimina les intencions de sortida", + "Remove page thumbnails": "Elimina les miniatures de pàgina", + "Remove specific pages": "Elimina pàgines concretes", + "Remove web capture information": "Elimina la informació de captura web", + "Remove {{name}}": "Elimina {{name}}", + "Removed \"{{beforeText}}\"": "S'ha eliminat «{{beforeText}}»", + "Removed image ({{width}}×{{height}})": "S'ha eliminat una imatge ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "S'han eliminat {{length}} pàgines en blanc correctament!", + "Removing all metadata...": "Eliminant totes les metadades...", + "Removing annotations...": "Eliminant les anotacions...", + "Removing redacted text from document data...": "Eliminant el text censurat de les dades del document...", + "Removing restrictions...": "Eliminant les restriccions...", + "Removing {{length}} blank page(s)...": "Eliminant {{length}} pàgines en blanc...", + "Render Error": "Error de representació", + "Rendering Page {{num}}...": "Representant la pàgina {{num}}...", + "Rendering page previews...": "Representant les previsualitzacions de les pàgines...", + "Rendering page previews: {{current}}/{{total}}": "Representant les previsualitzacions de les pàgines: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Representant la pàgina {{n}} de {{length}}...", + "Rendering preview for page {{pageNum}}...": "Representant la previsualització de la pàgina {{pageNum}}...", + "Reopens closed tab": "Torna a obrir la pestanya tancada", + "Repair": "Repara", + "Repair Failed": "Ha fallat la reparació", + "Repair corrupted PDF": "Repara un PDF malmès", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "S'han reparat {{length}} fitxers. No s'han pogut reparar: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Reparant {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Reparant {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "S'ha substituït «{{beforeText}}» per «{{afterText}}»", + "Required": "Obligatori", + "Resamples even when an image is only slightly above the limit.": "Remostreja fins i tot quan una imatge només supera una mica el límit.", + "Reset Form": "Restableix el formulari", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Vols restablir-ho i tornar al selector de fitxers? Es perdran tots els canvis no desats.", + "Resolution": "Resolució", + "Retain Page Labels": "Conserva les etiquetes de pàgina", + "Retry Failed": "Reintenta els fallits", + "Reverse Pages": "Inverteix les pàgines", + "Reverse page order": "Inverteix l'ordre de les pàgines", + "Reversing page order...": "Invertint l'ordre de les pàgines...", + "Reversing {{name}} ({{n}}/{{length}})...": "Invertint {{name}} ({{n}}/{{length}})...", + "Right": "Dreta", + "Right edge in points": "Vora dreta en punts", + "Rotate": "Gira", + "Rotate +90°": "Gira +90°", + "Rotate all pages": "Gira totes les pàgines", + "Rotation": "Gir", + "Rotation Variance": "Variància del gir", + "Rotations applied successfully!": "Girs aplicats correctament!", + "Rows": "Files", + "Run Javascript": "Executa JavaScript", + "Running OCR on page {{pageNum}}...": "Executant l'OCR a la pàgina {{pageNum}}...", + "Running...": "En execució...", + "SVG": "SVG", + "SVG Files": "Fitxers SVG", + "SVG to PDF": "SVG a PDF", + "Sanitize": "Sanieja", + "Sanitized With Warnings": "Sanejat amb advertències", + "Sanitizing PDF...": "Sanejant el PDF...", + "Saturation": "Saturació", + "Saved": "Desat", + "Saving PDF with layer changes...": "Desant el PDF amb els canvis de capes...", + "Scaling Mode": "Mode d'escalat", + "Scanner Effect": "Efecte d'escàner", + "Scanner effect applied successfully!": "Efecte d'escàner aplicat correctament!", + "Scanning page {{n}} of {{pageCount}}...": "Escanejant la pàgina {{n}} de {{pageCount}}...", + "Search Text": "Cerca text", + "Search languages...": "Cerca idiomes...", + "Select Font": "Selecciona un tipus de lletra", + "Select a field to edit properties": "Selecciona un camp per editar-ne les propietats", + "Select a field...": "Selecciona un camp...", + "Select to add this button to an existing group": "Selecciona-ho per afegir aquest botó a un grup existent", + "Selected Option": "Opció seleccionada", + "Self-Signed: Signer Identity Not Verified": "Autosignat: identitat del signant no verificada", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Els recursos d'OCR autoallotjats estan configurats parcialment. Defineix {{missing}} juntament amb els altres URL de recursos de Tesseract.", + "Separator": "Separador", + "Separator Color": "Color del separador", + "Separator Thickness": "Gruix del separador", + "Sepia": "Sèpia", + "Serial Number:": "Número de sèrie:", + "Set custom destination": "Defineix una destinació personalitzada", + "Shapes": "Formes", + "Sheet {{n}} {{sideLabel}}": "Full {{n}} {{sideLabel}}", + "Show": "Mostra", + "Show password": "Mostra la contrasenya", + "Show/Hide Field": "Mostra/amaga el camp", + "Sign Here": "Signa aquí", + "Signature /Contents is not a single DER object followed by zero padding": "La signatura /Contents no és un únic objecte DER seguit de farciment de zeros", + "Signature Algorithm:": "Algorisme de signatura:", + "Signature Intact: Signer Identity Not Verified": "Signatura intacta: identitat del signant no verificada", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Els camps de signatura són camps de signatura AcroForm i només serien visibles en un visualitzador de PDF avançat.", + "Signature has a missing or malformed /ByteRange": "La signatura té un /ByteRange absent o mal format", + "Signature scheme {{kind}} not implemented": "L'esquema de signatura {{kind}} no està implementat", + "Signature {{n}}": "Signatura {{n}}", + "Signatures": "Signatures", + "Signed By": "Signat per", + "Signed On": "Signat el", + "Signed PDF Not Changed": "PDF signat sense canvis", + "Signed PDF downloaded successfully!": "PDF signat baixat correctament!", + "Signed PDF saved successfully!": "PDF signat desat correctament!", + "Simple (1, 2, 3)": "Simple (1, 2, 3)", + "Simplify large color profiles": "Simplifica els perfils de color grans", + "Skew Threshold": "Llindar d'inclinació", + "Skip": "Omet", + "Skip All": "Omet-ho tot", + "Skip Remaining": "Omet els restants", + "Skip this file": "Omet aquest fitxer", + "Skipped: {{join}}.": "S'han omès: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Fitxers més petits, però només els poden obrir els lectors compatibles amb Brotli, com Firefox, MuPDF 1.26+ i Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "S'han omès alguns fitxers perquè no són imatges compatibles.", + "Some files were skipped. Only BMP files are allowed.": "S'han omès alguns fitxers. Només es permeten fitxers BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "S'han omès alguns fitxers. Només es permeten fitxers HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "S'han omès alguns fitxers. Només es permeten fitxers JPG, JPEG, JP2 i JPX.", + "Some files were skipped. Only PDF files are allowed.": "S'han omès alguns fitxers. Només es permeten fitxers PDF.", + "Some files were skipped. Only PNG images are allowed.": "S'han omès alguns fitxers. Només es permeten imatges PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "S'han omès alguns fitxers. Només es permeten gràfics SVG.", + "Some files were skipped. Only TIFF files are allowed.": "S'han omès alguns fitxers. Només es permeten fitxers TIFF.", + "Some files were skipped. Only WebP images are allowed.": "S'han omès alguns fitxers. Només es permeten imatges WebP.", + "Some files were skipped. Only supported image formats are allowed.": "S'han omès alguns fitxers. Només es permeten formats d'imatge compatibles.", + "Some files were skipped. Only text files are allowed.": "S'han omès alguns fitxers. Només es permeten fitxers de text.", + "Some pages could not be processed. Please try again.": "No s'han pogut processar algunes pàgines. Torna-ho a provar.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "No s'han pogut aplicar algunes marques de censura, de manera que el fitxer no s'ha baixat. Aplica-les o elimina-les a l'editor i torna-ho a provar.", + "Spacing": "Espaiat", + "Split PDF": "Divideix PDF", + "Split by Bookmarks": "Divideix per marcadors", + "Split pages into tile grid for poster printing": "Divideix les pàgines en una quadrícula de mosaics per imprimir pòsters", + "Split pages vertically or horizontally": "Divideix les pàgines en vertical o en horitzontal", + "Splitting PDF pages...": "Dividint les pàgines del PDF...", + "Splitting PDF...": "Dividint el PDF...", + "Spreadsheets": "Fulls de càlcul", + "Standard (192 DPI)": "Estàndard (192 DPI)", + "Standard Size": "Mida estàndard", + "Standardize all pages to a target size": "Estandarditza totes les pàgines a una mida de destinació", + "Standardizing pages...": "Estandarditzant les pàgines...", + "Stitch all pages into one continuous page": "Uneix totes les pàgines en una sola pàgina contínua", + "Straighten skewed PDF pages": "Endreça les pàgines de PDF inclinades", + "Strip all annotations": "Elimina totes les anotacions", + "Style": "Estil", + "Style Changed": "Estil canviat", + "Style changed ({{length}} regions)": "Estil canviat ({{length}} regions)", + "Subject": "Assumpte", + "Subset embedded fonts": "Crea un subconjunt dels tipus de lletra incrustats", + "Success": "Èxit", + "Success!": "Fet!", + "Successfully converted {{length}} CSV file(s) to PDF.": "S'han convertit {{length}} fitxers CSV a PDF correctament.", + "Successfully converted {{length}} Excel file(s) to PDF.": "S'han convertit {{length}} fitxers d'Excel a PDF correctament.", + "Successfully converted {{length}} ODT file(s) to PDF.": "S'han convertit {{length}} fitxers ODT a PDF correctament.", + "Successfully converted {{length}} PDF(s) to DOCX.": "S'han convertit {{length}} PDF a DOCX correctament.", + "Successfully converted {{length}} PDF(s) to Markdown.": "S'han convertit {{length}} PDF a Markdown correctament.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "S'han convertit {{length}} PDF a {{level}} correctament.", + "Successfully converted {{length}} PSD files to a single PDF.": "S'han convertit {{length}} fitxers PSD en un sol PDF correctament.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "S'han convertit {{length}} fitxers de PowerPoint a PDF correctament.", + "Successfully converted {{length}} RTF file(s) to PDF.": "S'han convertit {{length}} fitxers RTF a PDF correctament.", + "Successfully converted {{length}} Word document(s) to PDF.": "S'han convertit {{length}} documents de Word a PDF correctament.", + "Successfully converted {{length}} files to PDF.": "S'han convertit {{length}} fitxers a PDF correctament.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "S'han convertit {{length}} fitxers {{TOOL_NAME}} a PDF correctament.", + "Successfully converted {{name}} to DOCX.": "S'ha convertit {{name}} a DOCX correctament.", + "Successfully converted {{name}} to Markdown.": "S'ha convertit {{name}} a Markdown correctament.", + "Successfully converted {{name}} to PDF.": "S'ha convertit {{name}} a PDF correctament.", + "Successfully converted {{name}} to {{level}}.": "S'ha convertit {{name}} a {{level}} correctament.", + "Successfully extracted PDF for AI/LLM use.": "S'ha extret el PDF correctament per a ús amb IA/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "S'han extret {{completed}} PDF correctament per a ús amb IA/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "S'ha rasteritzat el PDF a {{dpi}} DPI correctament.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "S'han rasteritzat {{completed}} PDF a {{dpi}} DPI correctament.", + "Supported: CBZ, CBR": "Admesos: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Admesos: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Admesos: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Admesos: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Admesos: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Admesos: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Admesos: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Admesos: XPS, OXPS", + "Switches apps": "Canvia d'aplicació", + "Switches tabs": "Canvia de pestanya", + "Table of Contents": "Taula de continguts", + "Table {{n}} (Page {{page}})": "Taula {{n}} (pàgina {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Camp de destinació", + "Target Kilobytes": "Kilobytes de destinació", + "Target Not Reached": "No s'ha assolit l'objectiu", + "Target Size": "Mida de destinació", + "Technical Details": "Detalls tècnics", + "Temperature": "Temperatura", + "Template \"{{name}}\" loaded.": "S'ha carregat la plantilla «{{name}}».", + "Template \"{{name}}\" saved.": "S'ha desat la plantilla «{{name}}».", + "Text": "Text", + "Text Color": "Color del text", + "Text Files": "Fitxers de text", + "Text color changed successfully!": "El color del text s'ha canviat correctament!", + "Text converted to PDF successfully!": "Text convertit a PDF correctament!", + "Text extracted successfully!": "Text extret correctament!", + "Text to PDF": "Text a PDF", + "That password did not open any of the remaining files.": "Aquesta contrasenya no ha obert cap dels fitxers restants.", + "The PDF file(s) do not contain any attachments to extract.": "Els fitxers PDF no contenen cap fitxer adjunt per extreure.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "El PDF té {{totalPages}} pàgines, que no es pot dividir exactament entre {{nValue}}. L'últim PDF contindrà {{remainder}} pàgines.", + "The PDF might be corrupted or password protected.": "Pot ser que el PDF estigui malmès o protegit amb contrasenya.", + "The PDF might be corrupted or password-protected.": "Pot ser que el PDF estigui malmès o protegit amb contrasenya.", + "The PDF might be corrupted.": "Pot ser que el PDF estigui malmès.", + "The PDF viewer is still initializing.": "El visualitzador de PDF encara s'està inicialitzant.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "El PDF s'ha baixat, però no s'han pogut completar aquests passos: {{join}}. És possible que el contingut que cobreixen encara sigui al fitxer.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "L'URL ha retornat un tipus de contingut inesperat: {{contentType}}. S'esperava un fitxer JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Els bytes exclosos per /ByteRange no són exactament una signatura codificada en hexadecimal", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Els bytes exclosos per /ByteRange no són el /Contents d'aquesta signatura", + "The compression engine returned an unreadable result.": "El motor de compressió ha retornat un resultat il·legible.", + "The compression engine stopped unexpectedly.": "El motor de compressió s'ha aturat de manera inesperada.", + "The current password you entered is incorrect. Please try again.": "La contrasenya actual que has introduït és incorrecta. Torna-ho a provar.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Aquests noms de camp ja existeixen al PDF pujat: {{conflictList}}. Canvia el nom d'aquests camps abans de baixar el fitxer.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Aquests noms de camp s'utilitzen més d'una vegada: {{duplicateList}}. Canvia el nom d'aquests camps perquè siguin únics abans de baixar el fitxer.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "El nombre de pàgines indicat ({{length}}) no coincideix amb el nombre actual de pàgines del document ({{currentGridCount}}). Indica un ordre complet per a totes les pàgines.", + "The password you entered is incorrect. Please try again.": "La contrasenya que has introduït és incorrecta. Torna-ho a provar.", + "The password you entered is wrong or the file is corrupted.": "La contrasenya que has introduït és incorrecta o el fitxer està malmès.", + "The provided file could not be loaded as an image. It may be corrupted.": "No s'ha pogut carregar el fitxer proporcionat com a imatge. Pot estar malmès.", + "The requested OCR language is not available: {{unavailableText}}.": "L'idioma d'OCR sol·licitat no està disponible: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "L'ordre de pàgines indicat és incomplet o conté números de pàgina no vàlids. Assegura't d'indicar una posició nova per a cada pàgina original.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Aquests fitxers no són PDF vàlids, de manera que no s'han afegit: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Aquests fitxers estan protegits amb contrasenya: {{names}}. Introdueix-ne les contrasenyes a les targetes dels fitxers o elimina'ls, i torna a comprimir.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Aquesta compilació de BentoPDF només inclou dades d'OCR per a {{availableText}}.", + "This PDF does not contain any digital signatures.": "Aquest PDF no conté cap signatura digital.", + "This PDF has no layers (OCG).": "Aquest PDF no té capes (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Aquest PDF està protegit amb contrasenya. Introdueix la contrasenya actual per continuar.", + "This document contains pages with different dimensions:": "Aquest document conté pàgines de dimensions diferents:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Aquest document té 1 marca de censura que encara no s'ha aplicat. Mentre una marca no s'apliqui, el contingut de sota continua al fitxer. Voleu aplicar totes les marques i baixar-lo?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Aquest document té {{count}} marques de censura que encara no s'han aplicat. Mentre una marca no s'apliqui, el contingut de sota continua al fitxer. Voleu aplicar totes les marques i baixar-lo?", + "This feature requires {{name}} to be configured.": "Aquesta funció requereix que {{name}} estigui configurat.", + "This file is not a valid PDF.": "Aquest fitxer no és un PDF vàlid.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Aquest mòdul té llicència AGPL-3.0. En configurar-lo, acceptes els termes de la llicència.", + "This tool has been disabled": "Aquesta eina s'ha desactivat", + "This tool is not available in your deployment. Contact your administrator for more information.": "Aquesta eina no està disponible en el teu desplegament. Contacta amb l'administrador per obtenir més informació.", + "Threshold": "Llindar", + "Tile": "Mosaic", + "Tile Gap X": "Espai entre mosaics X", + "Tile Gap Y": "Espai entre mosaics Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Segell de temps", + "Timestamp Failed": "Ha fallat el segell de temps", + "Tint": "Tint", + "Title": "Títol", + "To actually fill or change the options, use our PDF Form Filler tool.": "Per omplir o canviar realment les opcions, utilitza la nostra eina Formulari PDF.", + "Toggle": "Alterna", + "Toggle style": "Alterna l'estil", + "Toggle sync scroll": "Alterna el desplaçament sincronitzat", + "Tool Unavailable": "Eina no disponible", + "Tooltip / Help Text": "Informació sobre eina / text d'ajuda", + "Top": "A dalt", + "Top Center": "Dalt al centre", + "Top Left": "Dalt a l'esquerra", + "Top Right": "Dalt a la dreta", + "Top edge in points": "Vora superior en punts", + "Total Pages": "Total de pàgines", + "Transparent Background": "Fons transparent", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Prova JPEG 2000 davant de JPEG per a cada imatge i es queda amb la més petita.", + "Trim margins from all pages": "Retalla els marges de totes les pàgines", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Verificació de confiança: {{trustVerified}}/{{length}} signatures verificades amb el certificat personalitzat", + "Trusted": "De confiança", + "Trusted certificate loaded": "Certificat de confiança carregat", + "Tsa Url": "URL de TSA", + "Turns off quality, resolution and every other lossy image step.": "Desactiva la qualitat, la resolució i qualsevol altre pas d'imatge amb pèrdua.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "L'URL ha de començar amb http:// o https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "No s'ha pogut desxifrar el PDF amb la contrasenya indicada.", + "Unable to repair any of the uploaded PDF files.": "No s'ha pogut reparar cap dels fitxers PDF pujats.", + "Unembed standard fonts": "Deixa de incrustar els tipus de lletra estàndard", + "Unembed standard-font look-alikes": "Deixa de incrustar els tipus de lletra semblants als estàndard", + "Unexpected delimiter in content stream": "Delimitador inesperat al flux de contingut", + "Unexpected reply from the engine.": "Resposta inesperada del motor.", + "Uniform": "Uniforme", + "Unique Page Sizes": "Mides de pàgina úniques", + "Unknown": "Desconegut", + "Unknown error": "Error desconegut", + "Unknown error occurred in worker.": "S'ha produït un error desconegut al worker.", + "Unknown error occurred.": "S'ha produït un error desconegut.", + "Unlock": "Desbloqueja", + "Unlock All": "Desbloqueja-ho tot", + "Unlock Remaining ({{remaining}})": "Desbloqueja els restants ({{remaining}})", + "Unlocked": "Desbloquejat", + "Unlocked {{unlocked}} of {{length}} files.": "S'han desbloquejat {{unlocked}} de {{length}} fitxers.", + "Unlocking...": "Desbloquejant...", + "Unresolved optional content reference": "Referència de contingut opcional sense resoldre", + "Unsupported ECDSA curve in signer certificate": "Corba ECDSA no admesa al certificat del signant", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Imatge no admesa. Utilitza un PNG o JPG per a la marca d'aigua.", + "Unsupported digest OID {{digestOid}}": "OID de resum no admès {{digestOid}}", + "Unsupported file type: .{{ext}}": "Tipus de fitxer no admès: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID d'algorisme de signatura no admès {{oid}}", + "Unterminated array or dictionary in content stream": "Matriu o diccionari sense tancar al flux de contingut", + "Unterminated hex string in content stream": "Cadena hexadecimal sense tancar al flux de contingut", + "Unterminated inline image in content stream": "Imatge en línia sense tancar al flux de contingut", + "Unterminated string in content stream": "Cadena sense tancar al flux de contingut", + "Unverified: Unsupported Signature Algorithm": "No verificada: algorisme de signatura no admès", + "Updating metadata...": "Actualitzant les metadades...", + "Upload Certificate": "Puja el certificat", + "Upload Comics": "Puja còmics", + "Upload Documents": "Puja documents", + "Upload EPUB Files": "Puja fitxers EPUB", + "Upload Email Files": "Puja fitxers de correu electrònic", + "Upload FB2 Files": "Puja fitxers FB2", + "Upload Images": "Puja imatges", + "Upload JSON Files": "Puja fitxers JSON", + "Upload MOBI Files": "Puja fitxers MOBI", + "Upload Markdown Files": "Puja fitxers Markdown", + "Upload ODG Files": "Puja fitxers ODG", + "Upload PDFs": "Puja PDF", + "Upload PUB Files": "Puja fitxers PUB", + "Upload Pages Files": "Puja fitxers Pages", + "Upload Presentations": "Puja presentacions", + "Upload SVG Files": "Puja fitxers SVG", + "Upload Spreadsheets": "Puja fulls de càlcul", + "Upload Text Files": "Puja fitxers de text", + "Upload Visio Files": "Puja fitxers Visio", + "Upload WPD Files": "Puja fitxers WPD", + "Upload WPS Files": "Puja fitxers WPS", + "Upload XML Files": "Puja fitxers XML", + "Upload XPS Files": "Puja fitxers XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Puja un PDF i fes clic a «Genera la previsualització» per veure la disposició del quadern", + "Upload images and convert to PDF": "Puja imatges i converteix-les a PDF", + "Upload one or more PDF files": "Puja un o més fitxers PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Majúscules A-Z, dígits 0-9 i - . $ / + % ESPAI", + "Use same password for all files": "Utilitza la mateixa contrasenya per a tots els fitxers", + "User Password": "Contrasenya d'usuari", + "VSD to PDF": "VSD a PDF", + "Valid From": "Vàlid des de", + "Valid Signature": "Signatura vàlida", + "Valid Until": "Vàlid fins a", + "Validating {{n}} of {{length}}: {{name}}": "Validant {{n}} de {{length}}: {{name}}", + "Validating...": "Validant...", + "Value": "Valor", + "Value (e.g., Marketing)": "Valor (p. ex., Màrqueting)", + "Vertical": "Vertical", + "Viewer not ready": "El visualitzador no està a punt", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "El visualitzador no està a punt. Puja un PDF i espera que acabi de carregar-se.", + "Visibility": "Visibilitat", + "Visio Files": "Fitxers Visio", + "WPD to PDF": "WPD a PDF", + "WPS Files": "Fitxers WPS", + "WPS to PDF": "WPS a PDF", + "Watermark": "Marca d'aigua", + "Watermark added successfully!": "Marca d'aigua afegida correctament!", + "Web Crypto API not available in this context": "L'API Web Crypto no està disponible en aquest context", + "Web Crypto import/verify failed: {{error}}": "Ha fallat la importació o verificació amb Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "Llista de permesos", + "Width ({{unit}})": "Amplada ({{unit}})", + "Word": "Word", + "Word Documents": "Documents de Word", + "Word to PDF": "Word a PDF", + "WordPerfect Files": "Fitxers WordPerfect", + "Worker crashed": "El worker s'ha bloquejat", + "Worker error occurred. Check console for details.": "S'ha produït un error al worker. Consulta la consola per als detalls.", + "Workflow completed": "Flux de treball completat", + "Wrong password": "Contrasenya incorrecta", + "Wrong password for: {{join}}": "Contrasenya incorrecta per a: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Contrasenya incorrecta o no s'ha pogut desxifrar «{{name}}».", + "X Position": "Posició X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Fitxers XML", + "XML to PDF": "XML a PDF", + "XMP Metadata": "Metadades XMP", + "XPS Files": "Fitxers XPS", + "XPS to PDF": "XPS a PDF", + "Y Position": "Posició Y", + "Year must be between 1900 and 2100": "L'any ha d'estar entre 1900 i 2100", + "Yellow": "Groc", + "Yellowish": "Groguenc", + "You cannot delete the last page of the document.": "No pots suprimir l'última pàgina del document.", + "Your PDF has been cropped and the download has started.": "El PDF s'ha retallat i s'ha iniciat la baixada.", + "Your PDF has been downloaded successfully.": "El PDF s'ha baixat correctament.", + "Your PDF has been posterized.": "El PDF s'ha posteritzat.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Les censures s'han aplicat a les pàgines, però aquest fitxer està xifrat, de manera que BentoPDF no pot eliminar també les còpies del text censurat de les seves propietats, marcadors i fitxers adjunts. Per a una neteja completa, censura una còpia sense xifrar i afegeix-hi una contrasenya després amb Protegeix PDF. Vols baixar-lo igualment?", + "Your workflow needs at least one input node and one output node to run.": "El flux de treball necessita almenys un node d'entrada i un de sortida per executar-se.", + "ZIP archive created successfully!": "Arxiu ZIP creat correctament!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "p. ex., dd/mm/aaaa HH:MM:ss", + "form": "formulari", + "https://example.com": "https://example.com", + "signature found": "signatura trobada", + "signatures found": "signatures trobades", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} node", + "{{count}} nodes": "{{count}} nodes", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 pàgina", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} pàgines", + "{{length}} Files Need a Password": "{{length}} fitxers necessiten una contrasenya", + "{{length}} PDF file(s) selected": "{{length}} fitxers PDF seleccionats", + "{{length}} PDF files selected": "{{length}} fitxers PDF seleccionats", + "{{length}} attachment(s) extracted successfully!": "{{length}} fitxers adjunts extrets correctament!", + "{{length}} file • {{totalPages}} total pages": "{{length}} fitxer • {{totalPages}} pàgines en total", + "{{length}} file(s) attached successfully.": "{{length}} fitxers adjuntats correctament.", + "{{length}} files • {{totalPages}} total pages": "{{length}} fitxers • {{totalPages}} pàgines en total", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Estava protegit amb contrasenya, de manera que la còpia comprimida no en té. Utilitza Protegeix PDF per afegir-ne una de nou.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} pàgines)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} està signat digitalment, de manera que s'ha deixat tal com està. Comprimir-lo trencaria la signatura. Per comprimir-lo igualment, activa Ignora la protecció del contingut a Configuració personalitzada; se n'eliminaran les signatures.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} no és un PDF vàlid, de manera que no s'ha afegit.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} està protegit amb contrasenya. Introdueix-ne la contrasenya a la targeta del fitxer i torna a comprimir.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • No s'ha pogut carregar el nombre de pàgines", + "{{size}} • Loading pages...": "{{size}} • Carregant pàgines...", + "{{size}} • Loading...": "{{size}} • Carregant...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} pàgines", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} pàgines", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} pàgines", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} pàgines", + "{{size}} • {{value}} pages": "{{size}} • {{value}} pàgines", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF desxifrats correctament.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF linearitzats correctament.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} pàgines → {{numSheets}} fulls de sortida", + "{{validCount}} valid": "{{validCount}} vàlides", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}} %", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 pàgina", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} pàgines" +} diff --git a/public/locales/da/common.json b/public/locales/da/common.json index 762fbf8e..37372dac 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Åbn hovedmenu", "language": "Sprog", "searchLanguage": "Søg sprog…", - "noLanguagesFound": "Ingen sprog fundet" + "noLanguagesFound": "Ingen sprog fundet", + "breadcrumb": "Brødkrummesti" }, "donation": { "message": "Elsker du BentoPDF? Hjælp os med at holde det gratis og open source!", @@ -171,7 +172,7 @@ "processingLocal": "Al behandling foregår lokalt på din enhed.", "gdpr": { "title": "GDPR-overholdelse", - "description": "Beskytter persondata og privatliv for personer i EU." + "description": "Beskytter personoplysninger og privatliv for enkeltpersoner i Den Europæiske Union." }, "ccpa": { "title": "CCPA-overholdelse", @@ -188,31 +189,31 @@ "sectionTitle": "Ofte stillede spørgsmål", "isFree": { "question": "Er BentoPDF virkelig gratis?", - "answer": "Ja, absolut. Alle værktøjer er 100% gratis at bruge, uden filgrænser, uden tilmeldinger og uden vandmærker." + "answer": "Ja, helt sikkert. Alle værktøjer på BentoPDF er 100% gratis at bruge, uden filgrænser, uden tilmelding og uden vandmærker. Vi mener, at alle fortjener adgang til enkle, kraftfulde PDF-værktøjer uden betalingsmur." }, "areFilesSecure": { "question": "Er mine filer sikre? Hvor bliver de behandlet?", - "answer": "Dine filer er så sikre som muligt, fordi de aldrig forlader din computer. Alt behandles direkte i din browser." + "answer": "Dine filer er så sikre som muligt, fordi de aldrig forlader din computer. Al behandling sker direkte i din webbrowser (på klientsiden). Vi uploader aldrig dine filer til en server, så du bevarer fuldt privatliv og fuld kontrol over dine dokumenter." }, "platforms": { "question": "Virker det på Mac, Windows og mobil?", - "answer": "Ja! BentoPDF virker på alle moderne browsere, uanset styresystem." + "answer": "Ja! Da BentoPDF kører helt i din browser, virker det på ethvert styresystem med en moderne webbrowser, herunder Windows, macOS, Linux, iOS og Android." }, "gdprCompliant": { "question": "Er BentoPDF GDPR-kompatibel?", - "answer": "Ja. Da vi ikke indsamler eller behandler dine filer på vores servere, er dine data altid under din kontrol." + "answer": "Ja. BentoPDF overholder GDPR fuldt ud. Da al filbehandling sker lokalt i din browser, og vi aldrig indsamler eller sender dine filer til en server, har vi ingen adgang til dine data. Du har altid kontrollen over dine dokumenter." }, "dataStorage": { "question": "Gemmer eller sporer I mine filer?", - "answer": "Nej. Vi gemmer eller sporer aldrig dine filer. Alt foregår i din browser." + "answer": "Nej. Vi gemmer, sporer eller logger aldrig dine filer. Alt, hvad du gør på BentoPDF, foregår i din browsers hukommelse og forsvinder, når du lukker siden. Der er ingen uploads, ingen historiklogge og ingen servere involveret." }, "different": { - "question": "Hvad gør BentoPDF anderledes?", - "answer": "De fleste PDF-værktøjer uploader dine filer til en server. BentoPDF gør det hele lokalt i din browser." + "question": "Hvad gør BentoPDF anderledes end andre PDF-værktøjer?", + "answer": "De fleste PDF-værktøjer uploader dine filer til en server til behandling. Det gør BentoPDF aldrig. Vi bruger sikker, moderne webteknologi til at behandle dine filer direkte i din browser. Det giver hurtigere ydeevne, stærkere privatliv og fuld ro i sindet." }, "browserBased": { "question": "Hvordan gør browserbaseret behandling mig sikker?", - "answer": "Dine filer forlader aldrig enheden, hvilket fjerner risikoen for datalæk, hacks eller uautoriseret adgang." + "answer": "Fordi BentoPDF kører helt i din browser, forlader dine filer aldrig din enhed. Det fjerner risikoen for serverhack, datalæk og uautoriseret adgang. Dine filer forbliver dine, altid." }, "analytics": { "question": "Bruger I cookies eller analyseværktøjer?", @@ -226,7 +227,7 @@ }, "support": { "title": "Kan du lide mit arbejde?", - "description": "BentoPDF er et passioneret projekt, bygget for at tilbyde et gratis og privat PDF-værktøj til alle.", + "description": "BentoPDF er et passionsprojekt, bygget for at give alle et gratis, privat og kraftfuldt PDF-værktøjssæt. Hvis du finder det nyttigt, så overvej at støtte udviklingen. Hver kop kaffe hjælper!", "buyMeCoffee": "Køb en kaffe til mig" }, "footer": { @@ -236,9 +237,13 @@ "aboutUs": "Om os", "faqLink": "FAQ", "contactUs": "Kontakt os", + "tools": "Værktøjer", + "pdfConverter": "PDF-konverter", + "pdfSecurity": "PDF-sikkerhed", + "mergeSplit": "Flet og opdel PDF", "legal": "Juridisk", - "termsAndConditions": "Terms and Conditions", - "privacyPolicy": "Privacy Policy", + "termsAndConditions": "Vilkår og betingelser", + "privacyPolicy": "Privatlivspolitik", "followUs": "Følg os", "privacyShort": "Privatliv", "termsShort": "Vilkår" @@ -251,12 +256,12 @@ "howItWorks": "Sådan fungerer det:", "fileModeInstructions": [ "Klik og træk ikonet for at ændre rækkefølge.", - "I \"Sider\"-feltet kan du angive intervaller (fx \"1-3, 5\").", + "I feltet \"Sider\" for hver fil kan du angive intervaller (fx \"1-3, 5\") for kun at flette de sider.", "Lad feltet stå tomt for at inkludere alle sider." ], "pageModeInstructions": [ "Alle sider fra dine PDF’er vises nedenfor.", - "Træk og slip siderne for at lave den ønskede rækkefølge." + "Træk og slip de enkelte sideminiaturer for at skabe præcis den rækkefølge, du ønsker i din nye fil." ], "mergePdfs": "Flet PDF'er" }, @@ -290,41 +295,41 @@ "mission": { "title": "Vores", "titleDim": "mission", - "description": "At give den mest komplette PDF-værktøjskasse uden betaling og med fuldt fokus på privatliv." + "description": "At levere den mest komplette PDF-værktøjskasse, der respekterer dit privatliv og aldrig beder om betaling. Vi mener, at vigtige dokumentværktøjer skal være tilgængelige for alle, overalt, uden barrierer." }, "philosophy": { "label": "Vores kernefilosofi", "title": "Privatliv først. Altid.", - "description": "Alt sker lokalt i din browser. Dine dokumenter er 100% private." + "description": "Alle BentoPDF-værktøjer kører lokalt i din browser. Dine filer uploades aldrig, ingen andre ser dine dokumenter, og intet sporer, hvad du gør." }, "whyBentopdf": { "title": "Hvorfor", "speed": { "title": "Bygget til hastighed", - "description": "Ingen ventetid på uploads eller downloads — alt behandles lokalt." + "description": "Der er intet upload- eller downloadtrin. Filerne behandles direkte i din browser med WebAssembly, så du venter aldrig på en server." }, "free": { "title": "Fuldstændig gratis", - "description": "Ingen abonnementer, ingen skjulte gebyrer, ingen premiumlås." + "description": "Alle værktøjer er gratis, uden prøveperioder, abonnementer eller vandmærker. Udviklingen finansieres af kommercielle licenser." }, "noAccount": { "title": "Ingen konto nødvendig", - "description": "Brug værktøjerne med det samme — helt uden login." + "description": "Åbn et hvilket som helst værktøj, og kom i gang med det samme. Ingen e-mail, ingen adgangskode, ingen personlige oplysninger." }, "openSource": { "title": "Open source-ånd", - "description": "Bygget med gennemsigtighed og baseret på stærke open source-biblioteker." + "description": "Koden er offentlig på GitHub under AGPL-3.0, så du kan se præcis, hvordan dine filer håndteres. Den bygger på open source-projekter som PDF.js, pdf-lib, qpdf og LibreOffice." } }, "cta": { "title": "Klar til at komme i gang?", - "description": "Prøv selv den hurtige og private PDF-oplevelse.", + "description": "Slut dig til tusindvis af brugere, der stoler på BentoPDF til deres daglige dokumentbehov. Oplev, hvilken forskel privatliv og ydeevne kan gøre.", "button": "Udforsk alle værktøjer" } }, "contact": { "title": "Kontakt os", - "subtitle": "Vi vil gerne høre fra dig — spørgsmål, feedback eller ønsker er velkomne.", + "subtitle": "Vi vil meget gerne høre fra dig. Uanset om du har et spørgsmål, feedback eller et ønske om en funktion, så tøv ikke med at kontakte os.", "email": "Du kan kontakte os direkte på:" }, "licensing": { diff --git a/public/locales/da/tools.json b/public/locales/da/tools.json index 31a9eae6..f2d764c5 100644 --- a/public/locales/da/tools.json +++ b/public/locales/da/tools.json @@ -20,21 +20,36 @@ }, "convertToPdf": "Konvertér til PDF", "pdfMultiTool": { - "name": "PDF Multi-værktøj", + "name": "PDF-multiværktøj", "subtitle": "Flet, opdel, organisér, slet, roter, tilføj tomme sider, udtræk og duplikér i én samlet grænseflade." }, "mergePdf": { "name": "Flet PDF", "subtitle": "Kombinér flere PDF’er til én fil. Bevarer bogmærker.", "retainPageLabels": "Behold de oprindelige sideetiketter fra hver fil", - "retainPageLabelsHint": "Fra (standard): den sammenflettede PDF bruger naturlig sidenummerering 1–N. Til: hver fils oprindelige sideetiketter bevares (kan give dublerede etiketter)." + "retainPageLabelsHint": "Fra (standard): den sammenflettede PDF bruger naturlig sidenummerering 1–N. Til: hver fils oprindelige sideetiketter bevares (kan give dublerede etiketter).", + "removeDuplicateFonts": "Fjern dublerede skrifttyper", + "alert": { + "thumbnailError": "Kunne ikke gengive sideminiaturer", + "noSelection": "Ingen filer eller sider er valgt til fletning.", + "mergeSuccess": "PDF'erne blev flettet!", + "mergeFailed": "Kunne ikke flette PDF'erne.", + "mergeError": "Kunne ikke flette PDF'erne. Kontrollér, at alle filer er gyldige og ikke adgangskodebeskyttede.", + "workerError": "Der opstod en uventet fejl i flettefunktionen.", + "loadError": "En eller flere PDF-filer kunne ikke indlæses" + }, + "loader": { + "renderingPreviews": "Gengiver sideeksempler...", + "merging": "Fletter PDF'er...", + "loadingDocuments": "Indlæser PDF-dokumenter..." + } }, "splitPdf": { "name": "Opdel PDF", "subtitle": "Udtræk et sideinterval til en ny PDF." }, "compressPdf": { - "name": "Komprimér PDF", + "name": "Komprimer PDF", "subtitle": "Reducer filstørrelsen på din PDF." }, "pdfEditor": { @@ -91,7 +106,7 @@ "tipRedoZ": "Gentag (⇧⌘Z)", "tipFileDetails": "Filoplysninger", "tipEditExistingContent": "Rediger eksisterende indhold", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Hvad Rediger-værktøjet berører — begræns omfanget på travle sider", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Hvad Rediger-værktøjet berører: begræns omfanget på travle sider", "tipClickThePageToAddATextBox": "Klik på siden for at tilføje et tekstfelt", "tipSpellCheckLanguage": "Sprog for stavekontrol", "tipFindAndReplace": "Søg og erstat", @@ -503,7 +518,8 @@ "noFile": "Ingen fil", "noFileExplanation": "Upload venligst en PDF-fil først.", "conversionSuccess": "PDF konverteret til TIFF!", - "conversionError": "Kunne ikke konvertere PDF til TIFF. Filen kan være beskadiget." + "conversionError": "Kunne ikke konvertere PDF til TIFF. Filen kan være beskadiget.", + "conversionOutOfMemory": "Browseren løb tør for hukommelse under konverteringen. Prøv en lavere DPI, eller fjern markeringen ved flersidet TIFF for at konvertere én side ad gangen." } }, "pdfToCbz": { @@ -793,10 +809,10 @@ }, "decryptPdf": { "name": "Dekryptér PDF", - "subtitle": "Fjern adgangskodebeskyttelse." + "subtitle": "Fjern adgangskoden fra en PDF, så den kan åbnes frit. Kræver den nuværende adgangskode." }, "flattenPdf": { - "name": "Flatten PDF", + "name": "Fladgør PDF", "subtitle": "Gør formularfelter og annotationer ikke-redigerbare." }, "removeMetadata": { @@ -833,7 +849,7 @@ }, "excelToPdf": { "name": "Excel til PDF", - "subtitle": "Konverter Excel-filer (XLSX, XLS, ODS, CSV) til PDF.", + "subtitle": "Konverter Excel-regneark (XLSX, XLS, ODS, CSV) til PDF. Understøtter flere filer.", "acceptedFormats": "XLSX, XLS, ODS, CSV-filer", "convertButton": "Konverter til PDF" }, @@ -917,7 +933,7 @@ }, "wpsToPdf": { "name": "WPS til PDF", - "subtitle": "Konverter WPS Office-dokumenter til PDF.", + "subtitle": "Konverter WPS Office-dokumenter til PDF. Understøtter flere filer.", "acceptedFormats": "WPS-filer", "convertButton": "Konverter til PDF" }, @@ -929,7 +945,7 @@ }, "pagesToPdf": { "name": "Pages til PDF", - "subtitle": "Konverter Apple Pages-dokumenter til PDF.", + "subtitle": "Konverter Apple Pages-dokumenter til PDF. Understøtter flere filer.", "acceptedFormats": "Pages-filer", "convertButton": "Konverter til PDF" }, @@ -990,11 +1006,10 @@ "subtitle": "Udtræk tekst fra PDF og gem som almindelig tekst (.txt). Understøtter flere filer.", "noteLabel": "Bemærk:", "noteText": "Dette værktøj fungerer KUN med digitalt oprettede PDF'er. Brug i stedet vores OCR PDF-værktøj til scannede dokumenter eller billedbaserede PDF'er.", - "convertButton": "Udtræk tekst", - "note": "Dette værktøj virker KUN med digitalt oprettede PDF’er. Brug OCR PDF til scannede dokumenter." + "convertButton": "Udtræk tekst" }, "digitalSignPdf": { - "name": "Digital signatur PDF", + "name": "Digital PDF-signatur", "pageTitle": "Digital signatur PDF - Tilføj kryptografisk signatur | BentoPDF", "subtitle": "Tilføj en digital signatur til din PDF med X.509-certifikater. Understøtter PKCS#12 (.pfx, .p12) og PEM. Din private nøgle forlader aldrig browseren.", "certificateSection": "Certifikat", @@ -1094,7 +1109,7 @@ "successMessage": "PDF tidsstemplet med succes! Tidsstemplet kan verificeres i enhver PDF-læser." }, "emailToPdf": { - "name": "Email til PDF", + "name": "E-mail til PDF", "subtitle": "Konverter e-mailfiler (EML, MSG) til PDF. Understøtter Outlook-formater.", "acceptedFormats": "EML, MSG-filer", "convertButton": "Konverter til PDF" @@ -1136,7 +1151,7 @@ "subtitle": "Konverter PDF til en billedbaseret PDF. Flatten lag og fjern valgbare tekster." }, "pdfWorkflow": { - "name": "PDF Workflow-bygger", + "name": "PDF-workflowbygger", "subtitle": "Byg tilpassede PDF-behandlingspipelines med en visuel nodeeditor.", "nodes": "Noder", "searchNodes": "Søg noder...", @@ -1189,7 +1204,7 @@ "workerError": "Worker-fejl: {{message}}", "alternateMergeWorkerError": "Fejl i alternerende sammenflettnings-worker: {{message}}", "noPdfFilesUploaded": "Ingen PDF-filer uploadet i PDF Input-noden", - "failedToLoadFile": "Kunne ikke indlæse \"{{file}}\" — filen kan være beskadiget", + "failedToLoadFile": "Kunne ikke indlæse \"{{file}}\": filen kan være beskadiget", "noImagesUploaded": "Ingen billeder uploadet i Image Input-noden", "noWordDocsUploaded": "Ingen dokumenter uploadet i Word Input-noden", "noExcelUploaded": "Ingen regneark uploadet i Excel Input-noden", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Absolut! Al behandling sker i din browser. Dine filer forlader aldrig din enhed, hvilket sikrer fuldstændig privatliv." }, "unlockPdf": { - "name": "Dekryptér PDF", - "subtitle": "Fjern adgangskodebeskyttelse." + "name": "Lås PDF op", + "subtitle": "Fjern adgangskoden fra en PDF, så den kan åbnes frit. Kræver den nuværende adgangskode." }, "protectPdf": { - "name": "Kryptér PDF", + "name": "Beskyt PDF", "subtitle": "Lås din PDF med en adgangskode." } } diff --git a/public/locales/da/ui.json b/public/locales/da/ui.json new file mode 100644 index 00000000..7d8cd4c3 --- /dev/null +++ b/public/locales/da/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(rettet)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} mere...", + "- Error parsing XMP XML. Displaying raw. -": "- Fejl ved parsing af XMP XML. Viser rå data. -", + "- No Info Dictionary data found -": "- Ingen Info Dictionary-data fundet -", + "- No XMP metadata found -": "- Ingen XMP-metadata fundet -", + "- No interactive form fields found -": "- Ingen interaktive formularfelter fundet -", + "- No parseable XMP properties found -": "- Ingen læsbare XMP-egenskaber fundet -", + "-- Select existing group --": "-- Vælg eksisterende gruppe --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (Meget følsom)", + "0.5° (Default)": "0,5° (Standard)", + "1.0° (Normal)": "1,0° (Normal)", + "100 (Fast)": "100 (Hurtig)", + "150 (Default)": "150 (Standard)", + "1x2 (Booklet)": "1x2 (Hæfte)", + "2.0° (Less Sensitive)": "2,0° (Mindre følsom)", + "200 (Better)": "200 (Bedre)", + "200 (Good)": "200 (God)", + "2x2 (4-up)": "2x2 (4 pr. side)", + "2x4 (8-up)": "2x4 (8 pr. side)", + "300 (Best Quality)": "300 (Bedste kvalitet)", + "300 (Print)": "300 (Udskrift)", + "4x4 (16-up)": "4x4 (16 pr. side)", + "600 (High Quality)": "600 (Høj kvalitet)", + "72 (Screen)": "72 (Skærm)", + "90° Clockwise": "90° med uret", + "90° Counter-clockwise": "90° mod uret", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Et felt med navnet \"{{fieldName}}\" findes allerede. Omdøb feltet, så navnet er unikt, før du downloader.", + "A new version of BentoPDF is available. Reload to update?": "Der er en ny version af BentoPDF. Genindlæs for at opdatere?", + "A single PDF file": "Én PDF-fil", + "A template with this name already exists.": "En skabelon med dette navn findes allerede.", + "ASCII characters (letters, numbers, symbols)": "ASCII-tegn (bogstaver, tal, symboler)", + "Action": "Handling", + "Add Blank Page": "Tilføj tom side", + "Add Bookmark": "Tilføj bogmærke", + "Add Child Bookmark": "Tilføj underbogmærke", + "Add Child Layer": "Tilføj underlag", + "Add More Comics": "Tilføj flere tegneserier", + "Add More Documents": "Tilføj flere dokumenter", + "Add More EPUB Files": "Tilføj flere EPUB-filer", + "Add More Email Files": "Tilføj flere e-mailfiler", + "Add More FB2 Files": "Tilføj flere FB2-filer", + "Add More Files": "Tilføj flere filer", + "Add More Images": "Tilføj flere billeder", + "Add More JSON Files": "Tilføj flere JSON-filer", + "Add More MOBI Files": "Tilføj flere MOBI-filer", + "Add More Markdown Files": "Tilføj flere Markdown-filer", + "Add More ODG Files": "Tilføj flere ODG-filer", + "Add More PUB Files": "Tilføj flere PUB-filer", + "Add More Pages Files": "Tilføj flere Pages-filer", + "Add More Presentations": "Tilføj flere præsentationer", + "Add More SVG Files": "Tilføj flere SVG-filer", + "Add More Spreadsheets": "Tilføj flere regneark", + "Add More Text Files": "Tilføj flere tekstfiler", + "Add More Visio Files": "Tilføj flere Visio-filer", + "Add More WPD Files": "Tilføj flere WPD-filer", + "Add More WPS Files": "Tilføj flere WPS-filer", + "Add More XML Files": "Tilføj flere XML-filer", + "Add More XPS Files": "Tilføj flere XPS-filer", + "Add a new layer to get started!": "Tilføj et nyt lag for at komme i gang!", + "Add a text box": "Tilføj en tekstboks", + "Add an RFC 3161 document timestamp": "Tilføj et RFC 3161-dokumenttidsstempel", + "Add an image": "Tilføj et billede", + "Add at least one node to run the workflow.": "Tilføj mindst én node for at køre arbejdsgangen.", + "Add child": "Tilføj underelement", + "Add child layer": "Tilføj underlag", + "Add header and footer text": "Tilføj tekst i sidehoved og sidefod", + "Add page numbers": "Tilføj sidetal", + "Add searchable text layer via OCR": "Tilføj søgbart tekstlag via OCR", + "Add text watermark": "Tilføj tekstvandmærke", + "Add/Edit/Extract Attachments": "Tilføj/redigér/udtræk vedhæftninger", + "Added": "Tilføjet", + "Added \"{{afterText}}\"": "Tilføjede \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Tilføjede billede ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} tom side er tilføjet!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} tomme sider er tilføjet!", + "Adding header & footer...": "Tilføjer sidehoved og sidefod...", + "Adding page numbers...": "Tilføjer sidetal...", + "Adding watermark...": "Tilføjer vandmærke...", + "Adding {{insertCount}} blank page...": "Tilføjer {{insertCount}} tom side...", + "Adding {{insertCount}} blank pages...": "Tilføjer {{insertCount}} tomme sider...", + "Adding {{name}} ({{n}}/{{length}})...": "Tilføjer {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Justér farver", + "Adjust brightness, contrast, and colors": "Juster lysstyrke, kontrast og farver", + "Advanced": "Avanceret", + "Advanced Feature Required": "Avanceret funktion påkrævet", + "Advanced Settings": "Avancerede indstillinger", + "After Page": "Efter side", + "After Page...": "Efter side...", + "Align Objects": "Justér objekter", + "Alignment": "Justering", + "All": "Alle", + "All files repaired successfully!": "Alle filer er repareret!", + "Alternate Merge": "Skiftevis flet", + "Alternating and mixing pages...": "Veksler og blander sider...", + "Always resample to that resolution": "Resample altid til denne opløsning", + "An error occurred during compression. Error: {{error}}": "Der opstod en fejl under komprimeringen. Fejl: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Der opstod en fejl under konverteringen. Fejl: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Der opstod en fejl under konverteringen. Fejl: {{message}}", + "An error occurred during cropping.": "Der opstod en fejl under beskæringen.", + "An error occurred during extraction. Error: {{error}}": "Der opstod en fejl under udtrækningen. Fejl: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Der opstod en fejl under rasteriseringen. Fejl: {{error}}", + "An error occurred during sanitization: {{msg}}": "Der opstod en fejl under rensningen: {{msg}}", + "An error occurred while combining pages.": "Der opstod en fejl under kombinering af siderne.", + "An error occurred while creating the N-Up PDF.": "Der opstod en fejl under oprettelse af N-Up PDF'en.", + "An error occurred while creating the booklet.": "Der opstod en fejl under oprettelse af hæftet.", + "An error occurred while dividing the PDF.": "Der opstod en fejl under opdeling af PDF'en.", + "An error occurred while mixing the PDFs.": "Der opstod en fejl under blanding af PDF'erne.", + "An error occurred while standardizing pages.": "Der opstod en fejl under standardisering af siderne.", + "An error occurred while trying to remove metadata.": "Der opstod en fejl under fjernelse af metadata.", + "An error occurred: {{error}}": "Der opstod en fejl: {{error}}", + "An error occurred: {{error}}.": "Der opstod en fejl: {{error}}.", + "An owner password is required when setting permissions": "Der kræves en ejeradgangskode, når du angiver tilladelser", + "An unexpected error occurred during the repair process.": "Der opstod en uventet fejl under reparationen.", + "An unexpected error occurred.": "Der opstod en uventet fejl.", + "Analyzing data structure...": "Analyserer datastruktur...", + "Analyzing full PDF metadata...": "Analyserer fulde PDF-metadata...", + "Analyzing signatures...": "Analyserer signaturer...", + "Angle": "Vinkel", + "Annotations removed successfully!": "Annotationer er fjernet!", + "Any text, URL, or data": "Enhver tekst, URL eller data", + "Application": "Program", + "Apply a digital signature to PDF": "Anvend en digital signatur på PDF", + "Apply and download": "Anvend og download", + "Apply redactions?": "Anvend sløringer?", + "Apply scanner simulation effect": "Anvend scannersimuleringseffekt", + "Applying Bates numbers...": "Anvender Bates-numre...", + "Applying color adjustments...": "Anvender farvejusteringer...", + "Applying crop...": "Anvender beskæring...", + "Applying redactions...": "Anvender sløringer...", + "Applying rotations...": "Anvender rotationer...", + "Applying scanner effect...": "Anvender scannereffekt...", + "Applying timestamp...": "Anvender tidsstempel...", + "Applying {{replace}}...": "Anvender {{replace}}...", + "Archive contains an oversized image entry.": "Arkivet indeholder et for stort billede.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Arkivet har for mange billeder (maks. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Arkivet er for stort, når det pakkes ud.", + "Are you sure you want to reset? All your work will be lost.": "Er du sikker på, at du vil nulstille? Alt dit arbejde går tabt.", + "Area (Coordinates)": "Område (koordinater)", + "Area ({{unit}}²)": "Areal ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman og Courier New erstattes af de indbyggede tilsvarende skrifttyper. Anvendes kun, når det er sikkert.", + "Arrange multiple pages per sheet": "Placér flere sider på hvert ark", + "Arrange pages for booklet printing": "Arranger sider til hæfteprint", + "Aspect Ratio": "Billedformat", + "At least one PDF document is required for export.": "Mindst ét PDF-dokument er påkrævet for eksport.", + "At least two valid PDFs are required.": "Mindst to gyldige PDF'er er påkrævet.", + "Attaching files to PDF...": "Vedhæfter filer til PDF...", + "Attachments updated successfully!": "Vedhæftninger er opdateret!", + "Author": "Forfatter", + "Auto (Keep Original)": "Auto (behold original)", + "Back": "Bagside", + "Back to Home": "Tilbage til forsiden", + "Background Color": "Baggrundsfarve", + "Background color changed successfully!": "Baggrundsfarven er ændret!", + "Barcode": "Stregkode", + "Barcode Format": "Stregkodeformat", + "Barcode Value": "Stregkodeværdi", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Bates-numre er anvendt! ({{batesStart}} til {{n}})", + "Beginning": "Begyndelse", + "Binarize": "Binariser", + "Blank Position": "Tom placering", + "Blue": "Blå", + "Blur": "Sløring", + "Bold": "Fed", + "Bold & Italic": "Fed og kursiv", + "Booklet": "Hæfte", + "Booklet created with {{numSheets}} sheets!": "Hæfte oprettet med {{numSheets}} ark!", + "Bookmarks imported from JSON!": "Bogmærker er importeret fra JSON!", + "Bookmarks page": "Bogmærkeside", + "Border": "Kant", + "Border Color": "Kantfarve", + "Bottom": "Nederst", + "Bottom Center": "Nederst i midten", + "Bottom Left": "Nederst til venstre", + "Bottom Right": "Nederst til højre", + "Bottom edge in points": "Nederste kant i punkter", + "Brightness": "Lysstyrke", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli og rasterisering blev sprunget over for at beholde PDF/A.", + "Brotli compression (PDF 2.0)": "Brotli-komprimering (PDF 2.0)", + "Browser Note:": "Browserbemærkning:", + "Building new PDF...": "Opbygger ny PDF...", + "Building page pairing model...": "Opbygger model for sideparring...", + "Button": "Knap", + "ByteRange does not start at the beginning of the file": "ByteRange starter ikke i begyndelsen af filen", + "ByteRange out of bounds": "ByteRange uden for grænserne", + "CBZ to PDF": "CBZ til PDF", + "CSV Loaded": "CSV indlæst", + "CSV file is empty": "CSV-filen er tom", + "Cancel": "Annullér", + "Cannot Delete": "Kan ikke slette", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Kan ikke få adgang til viewerens kontroller. Brug knappen Download i PDF-viewerens værktøjslinje ovenfor.", + "Cannot delete all pages": "Kan ikke slette alle sider", + "Cannot delete all pages.": "Kan ikke slette alle sider.", + "Canvas context failed": "Canvas-kontekst mislykkedes", + "Canvas context unavailable": "Canvas-kontekst er ikke tilgængelig", + "Canvas toBlob conversion failed.": "Canvas toBlob-konvertering mislykkedes.", + "Canvas toBlob failed": "Canvas toBlob mislykkedes", + "Center": "Centreret", + "Certificate (.pfx, .p12, .pem)": "Certifikat (.pfx, .p12, .pem)", + "Certificate Expired": "Certifikatet er udløbet", + "Certificate Password": "Certifikatadgangskode", + "Certificate unlocked": "Certifikat låst op", + "Change Certificate": "Skift certifikat", + "Change background color": "Skift baggrundsfarve", + "Changing background color...": "Ændrer baggrundsfarve...", + "Changing text color...": "Ændrer tekstfarve...", + "Character": "Tegn", + "Checked State": "Afkrydset tilstand", + "Choose a valid page range.": "Vælg et gyldigt sideinterval.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Vælg et af de medfølgende sprog, eller genopbyg air-gapped-pakken med det manglende sprog tilføjet til --ocr-languages.", + "Cleanup": "Oprydning", + "Click on PDF to Pick Location": "Klik på PDF'en for at vælge placering", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Klik på knappen ovenfor, og klik derefter på PDF'en, hvor bogmærket skal pege hen", + "Click to Upload Image": "Klik for at uploade billede", + "Clicking this field in the PDF will open a file picker to upload an image.": "Når du klikker på dette felt i PDF'en, åbnes en filvælger til upload af et billede.", + "Clip invisible parts of images": "Beskær usynlige dele af billeder", + "Close": "Luk", + "Close (Esc)": "Luk (Esc)", + "Close panel": "Luk panel", + "Closes tab": "Lukker fanen", + "Closes window": "Lukker vinduet", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (bogmærker og metadata)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF er ikke konfigureret. Konfigurér det i WASM-indstillinger.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF producerede en tom dekrypteret fil.", + "CoherentPDF: not configured.": "CoherentPDF: ikke konfigureret.", + "Color": "Farve", + "Color adjustments applied successfully!": "Farvejusteringer er anvendt!", + "Colors inverted successfully!": "Farverne er inverteret!", + "Cols": "Kolonner", + "Combine multiple PDFs into one": "Kombinér flere PDF'er til én", + "Combine to Single Page": "Kombinér til én side", + "Combining pages...": "Kombinerer sider...", + "Comic Archives": "Tegneserie-arkiver", + "Comments and markup become part of the page. Form fields and links keep working.": "Kommentarer og markeringer bliver en del af siden. Formularfelter og links virker stadig.", + "Complete": "Færdig", + "Complete!": "Færdig!", + "Compress": "Komprimer", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF(er) komprimeret. Samlet størrelse reduceret fra {{totalOriginalSize}} til {{totalCompressedSize}} (sparede {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF(er) komprimeret. Samlet størrelse: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Komprimerer flere PDF'er...", + "Compressing to {{size}}...": "Komprimerer til {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Komprimerer {{n}}/{{length}}: {{name}}...", + "Compressing...": "Komprimerer...", + "Compression Complete": "Komprimering fuldført", + "Compression Finished": "Komprimering afsluttet", + "Compression Level": "Komprimeringsniveau", + "Configure": "Konfigurér", + "Confirm": "Bekræft", + "Confirm Action": "Bekræft handling", + "Conformance": "Overensstemmelse", + "Connected": "Forbundet", + "Contact Info": "Kontaktoplysninger", + "Content": "Indhold", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Indholdshashen matcher ikke messageDigest-attributten: PDF'en blev ændret efter signering", + "Contrast": "Kontrast", + "Conversion Complete": "Konvertering fuldført", + "Conversion Error": "Konverteringsfejl", + "Conversion engine ready!": "Konverteringsmotoren er klar!", + "Conversion failed: could not create PDF/A definition": "Konvertering mislykkedes: kunne ikke oprette PDF/A-definition", + "Convert Apple Pages documents to PDF": "Konvertér Apple Pages-dokumenter til PDF", + "Convert EPUB ebooks to PDF": "Konvertér EPUB-e-bøger til PDF", + "Convert Excel spreadsheets to PDF": "Konvertér Excel-regneark til PDF", + "Convert FB2 e-books to PDF": "Konvertér FB2-e-bøger til PDF", + "Convert JSON files to PDF": "Konvertér JSON-filer til PDF", + "Convert MOBI e-books to PDF": "Konvertér MOBI-e-bøger til PDF", + "Convert Markdown files to PDF": "Konvertér Markdown-filer til PDF", + "Convert Microsoft Publisher to PDF": "Konvertér Microsoft Publisher til PDF", + "Convert OpenDocument Graphics to PDF": "Konvertér OpenDocument Graphics til PDF", + "Convert PDF pages to SVG": "Konvertér PDF-sider til SVG", + "Convert PDF pages to images (ZIP)": "Konvertér PDF-sider til billeder (ZIP)", + "Convert PDF tables to CSV": "Konvertér PDF-tabeller til CSV", + "Convert PDF tables to Excel": "Konvertér PDF-tabeller til Excel", + "Convert PDF to Markdown text": "Konvertér PDF til Markdown-tekst", + "Convert PDF to PDF/A for archiving": "Konvertér PDF til PDF/A til arkivering", + "Convert PDF to Word document": "Konvertér PDF til Word-dokument", + "Convert PowerPoint presentations to PDF": "Konvertér PowerPoint-præsentationer til PDF", + "Convert SVG files to PDF": "Konvertér SVG-filer til PDF", + "Convert To Grayscale": "Konvertér til gråtoner", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Konvertér Visio-diagrammer (VSD/VSDX) til PDF", + "Convert WPS Office documents to PDF": "Konvertér WPS Office-dokumenter til PDF", + "Convert Word documents to PDF": "Konvertér Word-dokumenter til PDF", + "Convert WordPerfect documents to PDF": "Konvertér WordPerfect-dokumenter til PDF", + "Convert XML documents to PDF": "Konvertér XML-dokumenter til PDF", + "Convert XPS/OXPS documents to PDF": "Konvertér XPS/OXPS-dokumenter til PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Konvertér tegneserie-arkiver (CBZ/CBR) til PDF", + "Convert email files (.eml, .msg) to PDF": "Konvertér e-mailfiler (.eml, .msg) til PDF", + "Convert fonts to vector outlines": "Konvertér skrifttyper til vektorkonturer", + "Convert plain text to PDF": "Konvertér ren tekst til PDF", + "Convert to grayscale": "Konvertér til gråtoner", + "Convert to greyscale": "Konvertér til gråtoner", + "Convert to image-based PDF": "Konvertér til billedbaseret PDF", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} filer ({{totalPages}} sider) er konverteret til SVG!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} sider er konverteret til SVG!", + "Converter not initialized": "Konverteren er ikke initialiseret", + "Converting BMP to PDF...": "Konverterer BMP til PDF...", + "Converting HEIC to PDF...": "Konverterer HEIC til PDF...", + "Converting TIFF to PDF...": "Konverterer TIFF til PDF...", + "Converting emails...": "Konverterer e-mails...", + "Converting files...": "Konverterer filer...", + "Converting fonts to outlines...": "Konverterer skrifttyper til konturer...", + "Converting images to PDF...": "Konverterer billeder til PDF...", + "Converting multiple PDFs to PDF/A...": "Konverterer flere PDF'er til PDF/A...", + "Converting multiple RTF files to PDF...": "Konverterer flere RTF-filer til PDF...", + "Converting multiple files...": "Konverterer flere filer...", + "Converting page {{n}} of {{pageCount}}...": "Konverterer side {{n}} af {{pageCount}}...", + "Converting to Markdown...": "Konverterer til Markdown...", + "Converting to SVG...": "Konverterer til SVG...", + "Converting to greyscale...": "Konverterer til gråtoner...", + "Converting to {{level}}...": "Konverterer til {{level}}...", + "Converting {{name}}...": "Konverterer {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Konverterer {{n}}/{{length}}: {{name}}...", + "Converting...": "Konverterer...", + "Copied": "Kopieret", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Kunne ikke få adgang til eksportfunktionen for stemplede PDF'er. Brug knappen Eksportér → PDF i viewerens værktøjslinje i stedet.", + "Could not add blank page.": "Kunne ikke tilføje tom side.", + "Could not add blank pages.": "Kunne ikke tilføje tomme sider.", + "Could not add header or footer.": "Kunne ikke tilføje sidehoved eller sidefod.", + "Could not add page numbers.": "Kunne ikke tilføje sidetal.", + "Could not add the watermark.": "Kunne ikke tilføje vandmærket.", + "Could not apply rotations.": "Kunne ikke anvende rotationer.", + "Could not change text color.": "Kunne ikke ændre tekstfarven.", + "Could not change the background color.": "Kunne ikke ændre baggrundsfarven.", + "Could not create ZIP archive.": "Kunne ikke oprette ZIP-arkiv.", + "Could not create canvas context.": "Kunne ikke oprette canvas-kontekst.", + "Could not create comparison canvas context.": "Kunne ikke oprette canvas-kontekst til sammenligning.", + "Could not create offscreen comparison canvas.": "Kunne ikke oprette offscreen-canvas til sammenligning.", + "Could not create visual diff context.": "Kunne ikke oprette kontekst til visuel forskel.", + "Could not create visual diff overlay context.": "Kunne ikke oprette overlay-kontekst til visuel forskel.", + "Could not detect blank pages.": "Kunne ikke finde tomme sider.", + "Could not display the page.": "Kunne ikke vise siden.", + "Could not export comparison PDF.": "Kunne ikke eksportere sammenlignings-PDF.", + "Could not export the signed PDF. Please try again.": "Kunne ikke eksportere den signerede PDF. Prøv igen.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Kunne ikke eksportere den stemplede PDF. Brug knappen Eksportér → PDF i viewerens værktøjslinje i stedet.", + "Could not extract signer public key": "Kunne ikke udtrække underskriverens offentlige nøgle", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Kunne ikke finde {{testFile}} på den angivne URL (HTTP {{status}}). Kontrollér, at filen findes.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Kunne ikke analysere PDF'en fuldstændigt. Den kan være beskadiget eller have en usædvanlig struktur.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Kunne ikke generere en forhåndsvisning. Filen kan være beskadiget eller indeholde funktioner, der ikke understøttes. Fejl: {{message}}", + "Could not get canvas context": "Kunne ikke hente canvas-kontekst", + "Could not invert PDF colors.": "Kunne ikke invertere PDF-farver.", + "Could not load PDF. It may be corrupt or password-protected.": "Kunne ikke indlæse PDF'en. Den kan være beskadiget eller adgangskodebeskyttet.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Kunne ikke indlæse PDF'en. Filen kan være ugyldig, beskadiget eller adgangskodebeskyttet.", + "Could not load the PDF engine. Please refresh the page and try again.": "Kunne ikke indlæse PDF-motoren. Opdatér siden, og prøv igen.", + "Could not parse signer info": "Kunne ikke læse underskriveroplysninger", + "Could not posterize the PDF.": "Kunne ikke posterisere PDF'en.", + "Could not process \"{{name}}\". The file may be corrupted.": "Kunne ikke behandle \"{{name}}\". Filen kan være beskadiget.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Filstørrelsen kunne ikke reduceres yderligere. Original: {{originalSize}}, ny: {{compressedSize}}.", + "Could not remove annotations.": "Kunne ikke fjerne annotationer.", + "Could not remove blank pages.": "Kunne ikke fjerne tomme sider.", + "Could not remove leftover data from the PDF.": "Kunne ikke fjerne overskydende data fra PDF'en.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Kunne ikke fjerne den sløjfede tekst fra dokumentets data, så filen blev ikke downloadet.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Kunne ikke vende PDF-siderne. Kontrollér, at dine filer er gyldige PDF'er.", + "Could not update metadata. Please check that date formats are correct.": "Kunne ikke opdatere metadata. Kontrollér, at datoformaterne er korrekte.", + "Count": "Antal", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Oprettet", + "Creating Booklet...": "Opretter hæfte...", + "Creating Excel file...": "Opretter Excel-fil...", + "Creating N-Up PDF...": "Opretter N-Up PDF...", + "Creating PDF from JPGs...": "Opretter PDF fra JPG-filer...", + "Creating PDF from SVG files...": "Opretter PDF fra SVG-filer...", + "Creating PDF...": "Opretter PDF...", + "Creating ZIP archive...": "Opretter ZIP-arkiv...", + "Creating ZIP file...": "Opretter ZIP-fil...", + "Creating ZIP...": "Opretter ZIP...", + "Creating table...": "Opretter tabel...", + "Creator": "Oprettet af", + "Crop": "Beskær", + "Crop complete! Your download has started.": "Beskæring fuldført! Din download er startet.", + "Cryptographic verification failed": "Kryptografisk verificering mislykkedes", + "Custom": "Brugerdefineret", + "Custom Format": "Brugerdefineret format", + "Custom Height": "Brugerdefineret højde", + "Custom Units": "Brugerdefinerede enheder", + "Custom Width": "Brugerdefineret bredde", + "Custom Zoom": "Brugerdefineret zoom", + "Custom...": "Brugerdefineret...", + "DataMatrix": "DataMatrix", + "Date Format": "Datoformat", + "Decrease size": "Gør mindre", + "Decrypt": "Dekryptér", + "Decrypting PDF...": "Dekrypterer PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Dekrypterer {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Dekrypterer {{n}} af {{length}}: {{name}}", + "Decrypting...": "Dekrypterer...", + "Decryption Failed": "Dekryptering mislykkedes", + "Delete": "Slet", + "Delete \"{{title}}\"?": "Slet \"{{title}}\"?", + "Delete Field": "Slet felt", + "Delete Page": "Slet side", + "Delete Pages": "Slet sider", + "Delete all {{length}} bookmark(s) ? ": "Slet alle {{length}} bogmærker?", + "Delete layer": "Slet lag", + "Delete {{size}} bookmark(s) ? ": "Slet {{size}} bogmærker?", + "Deleted": "Slettet", + "Deleted {{size}} page(s) successfully!": "{{size}} side(r) er slettet!", + "Deleting pages...": "Sletter sider...", + "Description": "Beskrivelse", + "Description for screen readers": "Beskrivelse til skærmlæsere", + "Deselect All": "Fravælg alle", + "Deskew": "Ret skævhed", + "Deskew PDF": "Ret skæve sider", + "Deskewed {{length}} file(s). {{value}}": "Skævhed rettet i {{length}} fil(er). {{value}}", + "Deskewing {{name}}...": "Retter skævhed i {{name}}...", + "Destination": "Destination", + "Detecting blank pages...": "Finder tomme sider...", + "Digest Algorithm:": "Digest-algoritme:", + "Digital Sign": "Digital signatur", + "Direction": "Retning", + "Divide Pages": "Opdel sider", + "Divide into boxes (0 to disable)": "Opdel i felter (0 for at slå fra)", + "Document Properties": "Dokumentegenskaber", + "Document Type": "Dokumenttype", + "Document properties": "Dokumentegenskaber", + "Document-level attachment": "Vedhæftning på dokumentniveau", + "Done: back to tools": "Færdig: tilbage til værktøjer", + "Download": "Download", + "Download Edited PDF": "Download redigeret PDF", + "Download anyway": "Download alligevel", + "Download as PDF or ZIP automatically": "Download automatisk som PDF eller ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} PDF-filer er downloadet i et ZIP-arkiv.", + "Downloads started for all files.": "Download er startet for alle filer.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Fjerner tagging, som skærmlæsere bruger.", + "Duplicate Field Name": "Dobbelt feltnavn", + "Duplicate Field Names": "Dobbelte feltnavne", + "Duplicate Page": "Dupliker side", + "Duplicate Page Numbers": "Dobbelte sidetal", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA-signaturen kan ikke verificeres mod underskriverens offentlige nøgle", + "EPUB Files": "EPUB-filer", + "EPUB to PDF": "EPUB til PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ til PDF", + "Edit": "Redigér", + "Edit All": "Redigér alle", + "Edit Bookmark": "Redigér bogmærke", + "Edit Bookmarks": "Redigér bogmærker", + "Edit Images": "Redigér billeder", + "Edit Metadata": "Redigér metadata", + "Edit PDF metadata": "Redigér PDF-metadata", + "Edit Scope": "Redigeringsomfang", + "Edit Shapes": "Redigér figurer", + "Edit Text": "Redigér tekst", + "Edit tool": "Redigeringsværktøj", + "Edit {{scopes}}": "Redigér {{scopes}}", + "Email Files": "E-mailfiler", + "Email to PDF": "E-mail til PDF", + "Embedding files into PDF...": "Indlejrer filer i PDF...", + "Empty signature bytes": "Tomme signaturbytes", + "Encrypt": "Kryptér", + "Encrypt PDF with password": "Kryptér PDF med adgangskode", + "Encrypted file": "Krypteret fil", + "Encrypting PDF with 256-bit AES...": "Krypterer PDF med 256-bit AES...", + "Encryption Failed": "Kryptering mislykkedes", + "Encryption resulted in an empty file.": "Krypteringen gav en tom fil.", + "End": "Slut", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Indtast 0 for at indsætte i begyndelsen eller {{pageCount}} for at indsætte til sidst.", + "Enter bookmark title": "Indtast bogmærketitel", + "Enter name for child layer under \"{{Layer}}\":": "Indtast navn på underlag under \"{{Layer}}\":", + "Enter password": "Indtast adgangskode", + "Enter password...": "Indtast adgangskode...", + "Enter passwords for each encrypted file": "Indtast adgangskoder til hver krypteret fil", + "Error": "Fejl", + "Error during execution": "Fejl under kørsel", + "Error generating PDF: {{error}}": "Fejl ved generering af PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Fejl ved indlæsning af PDF-filen. Prøv igen med en gyldig PDF.", + "Error reading files: {{error}}": "Fejl ved læsning af filer: {{error}}", + "Error saving PDF. Check console for details.": "Fejl ved lagring af PDF. Se konsollen for detaljer.", + "Error: {{error}}": "Fejl: {{error}}", + "Exactly 11 or 12 digits": "Præcis 11 eller 12 cifre", + "Exactly 12 or 13 digits": "Præcis 12 eller 13 cifre", + "Example of current format:": "Eksempel på det aktuelle format:", + "Excel to PDF": "Excel til PDF", + "Existing Radio Groups": "Eksisterende radiogrupper", + "Export Error": "Eksportfejl", + "Export Value": "Eksportværdi", + "Export failed": "Eksport mislykkedes", + "External processing module needed": "Eksternt behandlingsmodul påkrævet", + "Extract Images": "Udtræk billeder", + "Extract Pages": "Udtræk sider", + "Extract Tables": "Udtræk tabeller", + "Extract a range of pages": "Udtræk et interval af sider", + "Extract all images from PDF": "Udtræk alle billeder fra PDF", + "Extract pages as separate PDFs": "Udtræk sider som separate PDF'er", + "Extract text from PDF": "Udtræk tekst fra PDF", + "Extracted 1 table successfully!": "1 tabel er udtrukket!", + "Extracted text from {{length}} PDF files!": "Tekst er udtrukket fra {{length}} PDF-filer!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF(er) udtrukket, {{failed}} mislykkedes.", + "Extracted {{length}} page(s) successfully!": "{{length}} side(r) er udtrukket!", + "Extracted {{length}} table(s) to Excel!": "{{length}} tabel(ler) er udtrukket til Excel!", + "Extracted {{length}} tables successfully!": "{{length}} tabeller er udtrukket!", + "Extracting attachments from {{length}} file(s)...": "Udtrækker vedhæftninger fra {{length}} fil(er)...", + "Extracting images from {{name}}...": "Udtrækker billeder fra {{name}}...", + "Extracting pages...": "Udtrækker sider...", + "Extracting tables...": "Udtrækker tabeller...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Udtrækker tekst fra fil {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Udtrækker tekst fra flere filer...", + "Extracting text from {{name}}...": "Udtrækker tekst fra {{name}}...", + "Extracting text...": "Udtrækker tekst...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Udtrækker {{name}} til AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Udtrækker {{name}} til AI...", + "Extracting...": "Udtrækker...", + "Extraction Complete": "Udtrækning fuldført", + "Extraction Error": "Udtrækningsfejl", + "Extraction Partial": "Delvis udtrækning", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Udtrækning fuldført! {{length}} vedhæftning(er) i zip-filen ({{totalSize}}). Download er startet.", + "FB2 Files": "FB2-filer", + "FB2 to PDF": "FB2 til PDF", + "Failed": "Mislykkedes", + "Failed to acquire 2D canvas context": "Kunne ikke hente 2D-canvas-kontekst", + "Failed to add child layer": "Kunne ikke tilføje underlag", + "Failed to apply Bates numbers.": "Kunne ikke anvende Bates-numre.", + "Failed to apply color adjustments. The file might be corrupted.": "Kunne ikke anvende farvejusteringer. Filen kan være beskadiget.", + "Failed to apply redactions.": "Kunne ikke anvende sløringer.", + "Failed to apply scanner effect. The file might be corrupted.": "Kunne ikke anvende scannereffekt. Filen kan være beskadiget.", + "Failed to attach files: {{error}}": "Kunne ikke vedhæfte filer: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Kunne ikke konvertere BMP til PDF. En af filerne kan være ugyldig.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Kunne ikke konvertere HEIC til PDF. En af filerne kan være ugyldig.", + "Failed to convert PDF to CSV. {{message}}": "Kunne ikke konvertere PDF til CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Kunne ikke konvertere PDF til Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Kunne ikke konvertere PDF til SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Kunne ikke konvertere PDF til gråtoner. Filen kan være beskadiget.", + "Failed to convert PDF. It may be image-based or corrupted.": "Kunne ikke konvertere PDF'en. Den kan være billedbaseret eller beskadiget.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Kunne ikke konvertere TIFF til PDF. En af filerne kan være ugyldig.", + "Failed to convert images to PDF.": "Kunne ikke konvertere billeder til PDF.", + "Failed to convert text to PDF. {{error}}": "Kunne ikke konvertere tekst til PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Kunne ikke konvertere {{filename}} til PNG", + "Failed to copy metadata to clipboard.": "Kunne ikke kopiere metadata til udklipsholderen.", + "Failed to create PDF.": "Kunne ikke oprette PDF.", + "Failed to create PNG blob": "Kunne ikke oprette PNG-blob", + "Failed to create canvas context": "Kunne ikke oprette canvas-kontekst", + "Failed to create split PDFs.": "Kunne ikke oprette opdelte PDF'er.", + "Failed to decode image: {{name}}": "Kunne ikke afkode billede: {{name}}", + "Failed to decrypt private key": "Kunne ikke dekryptere privat nøgle", + "Failed to decrypt. Try the Decrypt tool instead.": "Kunne ikke dekryptere. Prøv værktøjet Dekryptér i stedet.", + "Failed to delete layer": "Kunne ikke slette lag", + "Failed to delete pages.": "Kunne ikke slette sider.", + "Failed to deskew PDF: {{error}}": "Kunne ikke rette skævhed i PDF: {{error}}", + "Failed to download the edited PDF.": "Kunne ikke downloade den redigerede PDF.", + "Failed to edit attachments.": "Kunne ikke redigere vedhæftninger.", + "Failed to extract certificate from PFX file": "Kunne ikke udtrække certifikat fra PFX-filen", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Kunne ikke udtrække sider (qpdf-afslutningskode {{exitCode}}).", + "Failed to extract pages.": "Kunne ikke udtrække sider.", + "Failed to extract tables. {{message}}": "Kunne ikke udtrække tabeller. {{message}}", + "Failed to extract text from PDF.": "Kunne ikke udtrække tekst fra PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Kunne ikke hente ICC-profil fra {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Kunne ikke hente skrifttypefil: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Kunne ikke hente gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Kunne ikke hente {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Kunne ikke hente 2D-kontekst til side {{pageNumber}}", + "Failed to get canvas context": "Kunne ikke hente canvas-kontekst", + "Failed to insert PDF. The file may be corrupted.": "Kunne ikke indsætte PDF. Filen kan være beskadiget.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Kunne ikke indlæse Ghostscript fra {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Kunne ikke indlæse PDF-filen.", + "Failed to load PDF for cropping.": "Kunne ikke indlæse PDF til beskæring.", + "Failed to load PDF for preview.": "Kunne ikke indlæse PDF til forhåndsvisning.", + "Failed to load PDF form viewer.": "Kunne ikke indlæse PDF-formularvieweren.", + "Failed to load PDF layers": "Kunne ikke indlæse PDF-lag", + "Failed to load PyMuPDF from CDN: {{msg}}": "Kunne ikke indlæse PyMuPDF fra CDN: {{msg}}", + "Failed to load SVG image": "Kunne ikke indlæse SVG-billede", + "Failed to load WebP image": "Kunne ikke indlæse WebP-billede", + "Failed to load attachments from PDF.": "Kunne ikke indlæse vedhæftninger fra PDF'en.", + "Failed to load files: {{error}}": "Kunne ikke indlæse filer: {{error}}", + "Failed to load image.": "Kunne ikke indlæse billedet.", + "Failed to load image: {{filename}}": "Kunne ikke indlæse billede: {{filename}}", + "Failed to load one or more PDF files.": "Kunne ikke indlæse en eller flere PDF-filer.", + "Failed to load script: {{url}}": "Kunne ikke indlæse script: {{url}}", + "Failed to load template.": "Kunne ikke indlæse skabelonen.", + "Failed to load the PDF Editor.": "Kunne ikke indlæse PDF-editoren.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Kunne ikke indlæse billedbehandleren. Sørg for, at din browser understøtter SharedArrayBuffer (kræver HTTPS eller localhost).", + "Failed to parse CSV: {{error}}": "Kunne ikke parse CSV: {{error}}", + "Failed to parse signature": "Kunne ikke parse signatur", + "Failed to parse the certificate file.": "Kunne ikke parse certifikatfilen.", + "Failed to process HEIC file: {{name}}": "Kunne ikke behandle HEIC-fil: {{name}}", + "Failed to process WebP file: {{name}}": "Kunne ikke behandle WebP-fil: {{name}}", + "Failed to read file.": "Kunne ikke læse filen.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Kunne ikke fjerne begrænsninger. PDF'en kan kræve den korrekte ejeradgangskode.", + "Failed to render page": "Kunne ikke gengive siden", + "Failed to render page previews": "Kunne ikke gengive sideforhåndsvisninger", + "Failed to render page previews.": "Kunne ikke gengive sideforhåndsvisninger.", + "Failed to render page.": "Kunne ikke gengive siden.", + "Failed to save changes.": "Kunne ikke gemme ændringer.", + "Failed to save the new PDF. Check console for details.": "Kunne ikke gemme den nye PDF. Se konsollen for detaljer.", + "Failed to split PDF. Please check your selection.": "Kunne ikke opdele PDF'en. Kontrollér dit valg.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Kunne ikke tidsstemple PDF: {{message}}\\n\\nPrøv en anden TSA-server, eller kontrollér din internetforbindelse.", + "Failed to toggle layer visibility": "Kunne ikke skifte lagets synlighed", + "Failed to validate signatures. The file may be corrupted.": "Kunne ikke validere signaturer. Filen kan være beskadiget.", + "Features enabled by this module:": "Funktioner, der aktiveres af dette modul:", + "Field Name": "Feltnavn", + "Field Name (Group Name)": "Feltnavn (Gruppenavn)", + "Field Name Conflict": "Konflikt i feltnavn", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Feltnavnet \"{{newName}}\" findes allerede i denne {{value}}. Prøv et unikt navn.", + "Field name cannot be empty": "Feltnavnet må ikke være tomt", + "File": "Fil", + "File Size": "Filstørrelse", + "File exists but could not be read. Check CORS configuration.": "Filen findes, men kunne ikke læses. Kontrollér CORS-konfigurationen.", + "File list not found": "Filliste ikke fundet", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Filstørrelsen er reduceret fra {{originalSize}} til {{compressedSize}} (sparede {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Fil {{n}}/{{length}}: side {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Fil {{n}}/{{length}}: {{message}}", + "Filename": "Filnavn", + "Files that failed: {{errorCount}}.": "Filer, der mislykkedes: {{errorCount}}.", + "Fill (cover full target page)": "Udfyld (dæk hele målsiden)", + "Fill Color": "Udfyldningsfarve", + "Finalizing PDF...": "Færdiggør PDF...", + "Find & replace": "Find og erstat", + "Finds the best quality under this size. 0 means no target.": "Finder den bedste kvalitet under denne størrelse. 0 betyder intet mål.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox og Chrome kan vise deres egen datovælger under valget. Det korrekte format anvendes, når du er færdig med at indtaste datoen.", + "First Indent": "Første indrykning", + "Fit (keep full page visible)": "Tilpas (hele siden synlig)", + "Fit Page": "Tilpas side", + "Fix Page Size": "Ret sidestørrelse", + "Flatten": "Flatten", + "Flatten Forms": "Flatten formularer", + "Flatten annotations": "Flatten annotationer", + "Flatten form fields": "Flatten formularfelter", + "Flatten forms and annotations": "Flatten formularer og annotationer", + "Flatten links": "Fladgør links", + "Flattening PDF...": "Flatter PDF...", + "Flattening and saving PDF...": "Flatter og gemmer PDF...", + "Flattening multiple PDFs...": "Flatter flere PDF'er...", + "Flattening page {{i}} of {{totalPages}}...": "Flatter side {{i}} af {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Flatter {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Fokuserer adresselinjen", + "Font": "Skrifttype", + "Font Color": "Skriftfarve", + "Font Family": "Skrifttypefamilie", + "Font Size": "Skriftstørrelse", + "Font size: {{bSize}} → {{aSize}}": "Skriftstørrelse: {{bSize}} → {{aSize}}", + "Font to Outline": "Skrifttype til kontur", + "Font: {{bFont}} → {{aFont}}": "Skrifttype: {{bFont}} → {{aFont}}", + "Fonts": "Skrifttyper", + "Footer Center": "Sidefod i midten", + "Footer Left": "Sidefod til venstre", + "Footer Right": "Sidefod til højre", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Til PDF'er med kun billeder, f.eks. scanninger. Springes over, når dokumentet har markerbar tekst, medmindre Tilsidesæt indholdsbeskyttelse er slået til.", + "Form fields stop being fillable.": "Formularfelter kan ikke længere udfyldes.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Fandt {{length}} tom(me) side(r). Klik på en side for at fravælge den.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Fandt {{length}} eksisterende bogmærker. Erstat de nuværende bogmærker?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Fandt {{length}} billede(r) i {{length2}} PDF(er).", + "Front": "Forside", + "Full Coverage": "Fuld dækning", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Opret indholdsfortegnelse fra bogmærker", + "Generating High-Quality PDF...": "Genererer PDF i høj kvalitet...", + "Generating PDF...": "Genererer PDF...", + "Generating ZIP file...": "Genererer ZIP-fil...", + "Generating formatted content...": "Genererer formateret indhold...", + "Generating preview...": "Genererer forhåndsvisning...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (PDF/A-konvertering)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB-konvertering mislykkedes med afslutningskode {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript-konvertering mislykkedes med afslutningskode {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript producerede ingen outputfil", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript er ikke konfigureret. Konfigurér det i Avancerede indstillinger.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript er ikke konfigureret. Konfigurér det i WASM-indstillinger.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript er ikke konfigureret. PyMuPDF kræver Ghostscript til nogle handlinger. Konfigurér begge i Avancerede indstillinger.", + "Ghostscript threw an exception: {{e}}": "Ghostscript udløste en undtagelse: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript-wrapperen eksponerede ikke den forventede grænseflade. Forventede loadGS() eller klassen GhostscriptWASM.", + "Go": "Gå", + "Go to page": "Gå til side", + "Grayscale": "Gråtoner", + "Green": "Grøn", + "Greyscale": "Gråtoner", + "Grid Mode": "Gittertilstand", + "Group Name (Must be same for group)": "Gruppenavn (skal være ens for gruppen)", + "H-Scale %": "V-skala %", + "Hanging Indent": "Hængende indrykning", + "Hard reloads page": "Genindlæser siden helt", + "Header & Footer": "Sidehoved og sidefod", + "Header & Footer added successfully!": "Sidehoved og sidefod er tilføjet!", + "Header Center": "Sidehoved i midten", + "Header Left": "Sidehoved til venstre", + "Header Right": "Sidehoved til højre", + "Height ({{unit}})": "Højde ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Skjul", + "Hide Border": "Skjul kant", + "Hide password": "Skjul adgangskode", + "Hides window": "Skjuler vinduet", + "High (288 DPI)": "Høj (288 DPI)", + "High (Smallest Files)": "Høj (mindste filer)", + "Horizontal": "Vandret", + "Hue Shift": "Farvetoneskift", + "Image Format": "Billedformat", + "Image Input": "Billedinput", + "Image quality": "Billedkvalitet", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Billedet er ændret fra {{width}}×{{height}} til {{width2}}×{{height2}}", + "Images": "Billeder", + "Images above this are resampled down. None leaves resolution alone.": "Billeder over denne grænse nedskaleres. Ingen lader opløsningen være.", + "Imported {{length}} bookmarks!": "{{length}} bogmærker er importeret!", + "Inches (in)": "Tommer (in)", + "Include Attachments": "Inkludér vedhæftninger", + "Include Cc Bcc": "Inkludér Cc og Bcc", + "Include this file": "Inkludér denne fil", + "Incorrect Page Count": "Forkert sideantal", + "Incorrect Password": "Forkert adgangskode", + "Incorrect password": "Forkert adgangskode", + "Incorrect password. Please try again.": "Forkert adgangskode. Prøv igen.", + "Increase size": "Gør større", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indekserer PDF 1, side {{pageNumber}} af {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indekserer PDF 2, side {{pageNumber}} af {{totalPages}}...", + "Info": "Info", + "Info Dictionary": "Info Dictionary", + "Inherit": "Arv", + "Initialization Error": "Initialiseringsfejl", + "Initializing Ghostscript...": "Initialiserer Ghostscript...", + "Initializing PDF engine...": "Initialiserer PDF-motor...", + "Initializing PyMuPDF...": "Initialiserer PyMuPDF...", + "Initializing decryption...": "Initialiserer dekryptering...", + "Initializing encryption...": "Initialiserer kryptering...", + "Initializing repair engine...": "Initialiserer reparationsmotor...", + "Initializing...": "Initialiserer...", + "Input Required": "Input påkrævet", + "Insecure Digest (MD5 / SHA-1)": "Usikker digest (MD5 / SHA-1)", + "Insert blank pages": "Indsæt tomme sider", + "Insert blank pages after this page number": "Indsæt tomme sider efter dette sidetal", + "Interactive Form Fields": "Interaktive formularfelter", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Flet sider fra flere PDF'er skiftevis (f.eks. ulige + omvendte lige sider fra en enkeltsidet scanning)", + "Invalid Certificate": "Ugyldigt certifikat", + "Invalid File": "Ugyldig fil", + "Invalid Files": "Ugyldige filer", + "Invalid Input": "Ugyldigt input", + "Invalid JSON format": "Ugyldigt JSON-format", + "Invalid Name": "Ugyldigt navn", + "Invalid Order": "Ugyldig rækkefølge", + "Invalid PDF password.": "Ugyldig PDF-adgangskode.", + "Invalid Page Numbers": "Ugyldige sidetal", + "Invalid Page Order": "Ugyldig siderækkefølge", + "Invalid Pages": "Ugyldige sider", + "Invalid Range": "Ugyldigt interval", + "Invalid Signature": "Ugyldig signatur", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Ugyldig TSA-URL. Tidsstempelmyndigheden skal være en gyldig http://- eller https://-URL.", + "Invalid URL": "Ugyldig URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Ugyldigt URL-format. Indtast en gyldig URL (f.eks. https://example.com/wasm/)", + "Invalid XML: no root element": "Ugyldig XML: intet rodelement", + "Invalid data": "Ugyldige data", + "Invalid hex string in content stream": "Ugyldig hex-streng i indholdsstrøm", + "Invalid page range specified.": "Ugyldigt sideinterval angivet.", + "Invalid shortcut format": "Ugyldigt genvejsformat", + "Invalid: Cryptographic Verification Failed": "Ugyldig: kryptografisk verificering mislykkedes", + "Invert Colors": "Invertér farver", + "Invert all colors": "Invertér alle farver", + "Inverting PDF colors...": "Inverterer PDF-farver...", + "Issuer": "Udsteder", + "It fits the {{targetBytes}} target.": "Den passer til målet på {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Den er stadig over målet på {{targetBytes}}, fordi Bevar PDF/A begrænser, hvor meget den kan komprimeres.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Den hævder ikke længere PDF/A-overensstemmelse. Slå Bevar PDF/A til under Brugerdefinerede indstillinger for at beholde den.", + "Italic": "Kursiv", + "Item 1": "Punkt 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Dens digitale signaturer blev fjernet, så den kunne komprimeres. Underskriv den igen, hvis det er nødvendigt.", + "JPEG (Smaller file size)": "JPEG (mindre filstørrelse)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "JPEG-kvalitet for genkodede billeder, 20 til 100. Lavere værdi giver mindre filer og mere synlige artefakter.", + "JPG": "JPG", + "JSON Files": "JSON-filer", + "JSON Loaded": "JSON indlæst", + "JSON to PDF": "JSON til PDF", + "Javascript Code": "JavaScript-kode", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Holder en PDF/A-fil i overensstemmelse. Brotli og rasterisering springes over, mens dette er slået til.", + "Keeps only the characters the document uses.": "Beholder kun de tegn, dokumentet bruger.", + "Key (e.g., Department)": "Nøgle (f.eks. Afdeling)", + "Keywords": "Nøgleord", + "Label": "Etiket", + "Label / Prompt": "Etiket / prompt", + "Landscape": "Liggende", + "Language": "Sprog", + "Layer not found": "Lag ikke fundet", + "Layer {{number}}": "Lag {{number}}", + "Leave blank for all pages": "Lad stå tomt for alle sider", + "Left": "Venstre", + "Left edge in points (1 inch = 72 pts)": "Venstre kant i punkter (1 tomme = 72 pt)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Niveau", + "Limit recognized characters (leave empty for all)": "Begræns genkendte tegn (lad stå tomt for alle)", + "Line": "Linje", + "Linearization Failed": "Linearisering mislykkedes", + "Linearize": "Lineariser", + "Links stop being clickable.": "Links kan ikke længere klikkes på.", + "Lists": "Lister", + "Load": "Indlæs", + "Load system fonts": "Indlæs systemskrifttyper", + "Load system fonts…": "Indlæs systemskrifttyper…", + "Loaded": "Indlæst", + "Loaded bookmarks from JSON. Now upload your PDF.": "Bogmærker er indlæst fra JSON. Upload nu din PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} bogmærker er indlæst fra CSV. Upload nu din PDF.", + "Loading Engine...": "Indlæser motor...", + "Loading Ghostscript...": "Indlæser Ghostscript...", + "Loading PDF Editor...": "Indlæser PDF-editor...", + "Loading PDF Text Editor...": "Indlæser PDF-teksteditor...", + "Loading PDF converter...": "Indlæser PDF-konverter...", + "Loading PDF documents...": "Indlæser PDF-dokumenter...", + "Loading PDF engine...": "Indlæser PDF-motor...", + "Loading PDF files...": "Indlæser PDF-filer...", + "Loading PDF form...": "Indlæser PDF-formular...", + "Loading PDF processor...": "Indlæser PDF-processor...", + "Loading PDF viewer...": "Indlæser PDF-viewer...", + "Loading PDF...": "Indlæser PDF...", + "Loading PDFs...": "Indlæser PDF'er...", + "Loading attachments...": "Indlæser vedhæftninger...", + "Loading comparison {{currentPage}} of {{length}}...": "Indlæser sammenligning {{currentPage}} af {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Indlæser konverteringsmotor ({{percent}}%)...", + "Loading conversion engine...": "Indlæser konverteringsmotor...", + "Loading engine...": "Indlæser motor...", + "Loading fonts...": "Indlæser skrifttyper...", + "Loading layers from {{name}}...": "Indlæser lag fra {{name}}...", + "Loading page {{num}}...": "Indlæser side {{num}}...", + "Loading preview...": "Indlæser forhåndsvisning...", + "Loading {{name}}...": "Indlæser {{name}}...", + "Loading...": "Indlæser...", + "Location": "Placering", + "Lossless (No Quality Loss)": "Tabsfri (intet kvalitetstab)", + "Lossless (no image re-encoding)": "Tabsfri (ingen genkodning af billeder)", + "Low (Best Quality)": "Lav (bedste kvalitet)", + "MOBI Files": "MOBI-filer", + "MOBI to PDF": "MOBI til PDF", + "Malformed ByteRange": "Ugyldigt udformet ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Ugyldigt udformet ECDSA-signatur (kunne ikke parse r,s)", + "Malformed inline image in content stream": "Ugyldigt udformet inline-billede i indholdsstrøm", + "Malformed signatureAlgorithm": "Ugyldigt udformet signatureAlgorithm", + "Margins": "Margener", + "Markdown Files": "Markdown-filer", + "Markdown to PDF": "Markdown til PDF", + "Max Length (0 for unlimited)": "Maks. længde (0 for ubegrænset)", + "Maximum resolution": "Maksimal opløsning", + "Medium (Recommended)": "Mellem (anbefalet)", + "Merge PDF": "Flet PDF", + "Merge PDFs": "Flet PDF'er", + "Merge duplicate fonts": "Flet dubletskrifttyper", + "Mermaid Error: {{error}}": "Mermaid-fejl: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadata er kopieret til udklipsholderen som JSON.", + "Metadata removed successfully!": "Metadata er fjernet!", + "Metadata updated successfully!": "Metadata er opdateret!", + "Millimeters (mm)": "Millimeter (mm)", + "Minimizes window": "Minimerer vinduet", + "Missing Files": "Manglende filer", + "Missing signatureAlgorithm": "Manglende signatureAlgorithm", + "Mixed Page Sizes Detected": "Forskellige sidestørrelser fundet", + "Mixed Sizes": "Forskellige størrelser", + "Mode": "Tilstand", + "Modified": "Ændret", + "Modified After Signing (signed part intact)": "Ændret efter signering (den signerede del er intakt)", + "More": "Mere", + "Moved": "Flyttet", + "Moved \"{{value}}\"": "Flyttede \"{{value}}\"", + "Multi-line": "Flere linjer", + "Must be a positive integer": "Skal være et positivt heltal", + "Must be a positive number": "Skal være et positivt tal", + "N must be at least 1.": "N skal være mindst 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF er oprettet!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Netværksfejl: Kunne ikke oprette forbindelse til URL'en. Kontrollér, at URL'en er korrekt, og at serveren tillader CORS-forespørgsler.", + "Network error: {{error}}": "Netværksfejl: {{error}}", + "Next page": "Næste side", + "No Area Selected": "Intet område valgt", + "No Attachments": "Ingen vedhæftninger", + "No Changes": "Ingen ændringer", + "No Crop Area": "Intet beskæringsområde", + "No File": "Ingen fil", + "No Files": "Ingen filer", + "No Images Found": "Ingen billeder fundet", + "No PDF Files": "Ingen PDF-filer", + "No PDF document loaded": "Intet PDF-dokument indlæst", + "No PDF document loaded.": "Intet PDF-dokument indlæst.", + "No PDF file loaded.": "Ingen PDF-fil indlæst.", + "No PDF files could be decrypted. The password may be incorrect.": "Ingen PDF-filer kunne dekrypteres. Adgangskoden kan være forkert.", + "No PDF files could be linearized.": "Ingen PDF-filer kunne lineariseres.", + "No PDFs could be processed.": "Ingen PDF'er kunne behandles.", + "No Pages": "Ingen sider", + "No Selection": "Intet valgt", + "No Signatures Found": "Ingen signaturer fundet", + "No Tables Found": "Ingen tabeller fundet", + "No Text": "Ingen tekst", + "No URL configured": "Ingen URL konfigureret", + "No attachments found in this PDF.": "Ingen vedhæftninger fundet i denne PDF.", + "No attachments selected for removal.": "Ingen vedhæftninger valgt til fjernelse.", + "No blank pages detected in this PDF.": "Ingen tomme sider fundet i denne PDF.", + "No bookmarks found at the selected level.": "Ingen bogmærker fundet på det valgte niveau.", + "No bookmarks to delete.": "Ingen bogmærker at slette.", + "No bookmarks to export!": "Ingen bogmærker at eksportere!", + "No certificate found in PEM file": "Intet certifikat fundet i PEM-filen", + "No certificate found in PFX file": "Intet certifikat fundet i PFX-filen", + "No certificates found in signature": "Ingen certifikater fundet i signaturen", + "No changes match the current filter.": "Ingen ændringer matcher det aktuelle filter.", + "No configurable settings for this node.": "Ingen indstillinger at konfigurere for denne node.", + "No differences detected on this page.": "Ingen forskelle fundet på denne side.", + "No embedded images were found in the selected PDF(s).": "Der blev ikke fundet indlejrede billeder i de valgte PDF'er.", + "No existing bookmarks found in this PDF.": "Ingen eksisterende bogmærker fundet i denne PDF.", + "No items were selected for removal or none were found in the PDF.": "Der blev ikke valgt noget til fjernelse, eller intet blev fundet i PDF'en.", + "No page pairs to export.": "Ingen sidepar at eksportere.", + "No pages found. Please create a blank PDF or upload one.": "Ingen sider fundet. Opret en tom PDF, eller upload en.", + "No pages selected for removal.": "Ingen sider valgt til fjernelse.", + "No pages were selected for splitting.": "Ingen sider blev valgt til opdeling.", + "No paired page for this side.": "Ingen parret side til denne side.", + "No private key found in PEM file": "Ingen privat nøgle fundet i PEM-filen", + "No private key found in PFX file": "Ingen privat nøgle fundet i PFX-filen", + "No tables were detected in this PDF.": "Der blev ikke fundet tabeller i denne PDF.", + "No valid page numbers found.": "Ingen gyldige sidetal fundet.", + "No valid pages to save.": "Ingen gyldige sider at gemme.", + "No worker": "Ingen worker", + "Noise": "Støj", + "None": "Ingen", + "None of the files could be compressed: {{join}}.": "Ingen af filerne kunne komprimeres: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "Ikke nok filer", + "Not a PDF": "Ikke en PDF", + "Not connected": "Ikke forbundet", + "Not in trust chain": "Ikke i tillidskæden", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Bemærk: Uden en separat ejeradgangskode har PDF'en ingen brugsbegrænsninger.", + "Number Format": "Talformat", + "Number of Pages": "Antal sider", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR blev afbrudt, før nogen side var behandlet", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR-genkendelse fik timeout efter {{timeoutMs}}ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODG-filer", + "ODG to PDF": "ODG til PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Fra (standard): naturlig nummerering 1–N. Til: hver fils oprindelige sideetiketter bevares (kan give dobbelte etiketter).", + "One PDF per page": "Én PDF pr. side", + "One PDF per range": "Én PDF pr. interval", + "Only a substitute font was available": "Kun en erstatningsskrifttype var tilgængelig", + "Only where it does not change how the image looks.": "Kun hvor det ikke ændrer billedets udseende.", + "Opacity": "Gennemsigtighed", + "Open URL": "Åbn URL", + "Opens incognito window": "Åbner inkognitovindue", + "Opens new tab": "Åbner ny fane", + "Opens new window": "Åbner nyt vindue", + "Operation Failed": "Handlingen mislykkedes", + "Operation resulted in an empty file.": "Handlingen resulterede i en tom fil.", + "Optimize PDF for fast web viewing": "Optimér PDF til hurtig visning på nettet", + "Optimizing PDFs for web view (linearizing)...": "Optimerer PDF'er til webvisning (linearisering)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optimerer {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Valgmuligheder (én pr. linje eller adskilt med komma)", + "Orientation": "Orientering", + "Outline": "Kontur", + "Output": "Output", + "Overlay": "Overlay", + "Overlay or underlay pages from one PDF onto another": "Læg sider fra én PDF oven på eller under en anden", + "Owner Password": "Ejeradgangskode", + "Owner Password Required": "Ejeradgangskode påkrævet", + "PDF": "PDF", + "PDF Files": "PDF-filer", + "PDF Input": "PDF-input", + "PDF Layers": "PDF-lag", + "PDF Metadata": "PDF-metadata", + "PDF Producer": "PDF-producent", + "PDF converted to CSV successfully!": "PDF er konverteret til CSV!", + "PDF converted to SVG successfully!": "PDF er konverteret til SVG!", + "PDF converted to greyscale successfully!": "PDF er konverteret til gråtoner!", + "PDF created successfully!": "PDF er oprettet!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF er dekrypteret! Al kryptering og alle begrænsninger er fjernet.", + "PDF decrypted successfully! Your download has started.": "PDF er dekrypteret! Din download er startet.", + "PDF downloaded successfully.": "PDF er downloadet.", + "PDF encrypted successfully with 256-bit AES!": "PDF er krypteret med 256-bit AES!", + "PDF has been sanitized and downloaded.": "PDF'en er renset og downloadet.", + "PDF has no pages": "PDF'en har ingen sider", + "PDF organized successfully!": "PDF er organiseret!", + "PDF permissions changed successfully!": "PDF-tilladelser er ændret!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF-læsere har selv de 14 standard PDF-skrifttyper.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF-begrænsninger er fjernet! Filen kan nu redigeres og udskrives frit.", + "PDF saved successfully!": "PDF er gemt!", + "PDF split successfully!": "PDF er opdelt!", + "PDF to CSV": "PDF til CSV", + "PDF to DOCX": "PDF til DOCX", + "PDF to Excel/CSV": "PDF til Excel/CSV", + "PDF to Images": "PDF til billeder", + "PDF to Images (High Quality)": "PDF til billeder (høj kvalitet)", + "PDF to JSON": "PDF til JSON", + "PDF to Markdown": "PDF til Markdown", + "PDF to PDF/A": "PDF til PDF/A", + "PDF to SVG": "PDF til SVG", + "PDF to Text": "PDF til tekst", + "PDF to XLSX": "PDF til XLSX", + "PDF with layer changes saved!": "PDF med laglændringer er gemt!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} er anvendt.", + "PDF/A Conversion": "PDF/A-konvertering", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (streng, ingen transparens)", + "PDF/A-2b (Recommended)": "PDF/A-2b (anbefalet)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (moderne, tillader vedhæftninger)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF'erne er blandet!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (tabsfri)", + "PUB to PDF": "PUB til PDF", + "Page": "Side", + "Page #": "Side nr.", + "Page Added": "Side tilføjet", + "Page Numbers": "Sidetal", + "Page Removed": "Side fjernet", + "Page Size": "Sidestørrelse", + "Page X of Y": "Side X af Y", + "Page background or layout changed": "Sidebaggrund eller layout ændret", + "Page container not found": "Sidebeholder ikke fundet", + "Page extraction produced an empty PDF.": "Sideudtrækningen gav en tom PDF.", + "Page number": "Sidetal", + "Page numbers added successfully!": "Sidetal er tilføjet!", + "Page sizes standardized successfully!": "Sidestørrelser er standardiseret!", + "Page {{currentPageNum}} of {{numPages}}": "Side {{currentPageNum}} af {{numPages}}", + "Page {{num}} / {{numPages}}": "Side {{num}} / {{numPages}}", + "Page {{n}} ": "Side {{n}} ", + "Page {{n}} of {{length}}": "Side {{n}} af {{length}}", + "Page {{n}}:": "Side {{n}}:", + "Page {{pageNumber}}": "Side {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Side {{pageNumber}} findes kun i den første PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Side {{pageNumber}} findes kun i den anden PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Side {{pageNumber}} af {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Side {{pageNum}} findes ikke i denne PDF.", + "Page {{page}}": "Side {{page}}", + "Page {{page}} attachment": "Vedhæftning på side {{page}}", + "Pages": "Sider", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Sider (f.eks. 1-3, 5) - i alt: {{pageCount}}", + "Pages Files": "Pages-filer", + "Pages Per Sheet": "Sider pr. ark", + "Pages combined successfully!": "Siderne er kombineret!", + "Pages have been divided successfully!": "Siderne er opdelt!", + "Pages have been reordered.": "Siderne er omarrangeret.", + "Pages have been reversed successfully!": "Siderne er vendt!", + "Pages to PDF": "Pages til PDF", + "Paper Size": "Papirstørrelse", + "Paragraph": "Afsnit", + "Parsing XML structure...": "Parser XML-struktur...", + "Parsing {{name}}...": "Parser {{name}}...", + "Partial Coverage": "Delvis dækning", + "Partial Success": "Delvist lykkedes", + "Password": "Adgangskode", + "Password Error": "Fejl med adgangskode", + "Password Needed": "Adgangskode påkrævet", + "Password Required": "Adgangskode påkrævet", + "Password for all files": "Adgangskode til alle filer", + "Password for all locked files": "Adgangskode til alle låste filer", + "Password for {{name}}": "Adgangskode til {{name}}", + "Password protected": "Adgangskodebeskyttet", + "Password required for encrypted private key": "Adgangskode påkrævet til krypteret privat nøgle", + "Path Stroke": "Stregbane", + "Please add at least one field before downloading.": "Tilføj mindst ét felt, før du downloader.", + "Please draw a rectangle on at least one page to select the crop area.": "Tegn et rektangel på mindst én side for at vælge beskæringsområdet.", + "Please ensure all page numbers in the order are unique.": "Sørg for, at alle sidetal i rækkefølgen er unikke.", + "Please enter a layer name": "Indtast et lagnavn", + "Please enter a name.": "Indtast et navn.", + "Please enter a number between 0 and {{totalPages}}.": "Indtast et tal mellem 0 og {{totalPages}}.", + "Please enter a page order.": "Indtast en siderækkefølge.", + "Please enter a password": "Indtast en adgangskode", + "Please enter a password for {{i}} or skip it": "Indtast en adgangskode til {{i}}, eller spring den over", + "Please enter a title.": "Indtast en titel.", + "Please enter a user password.": "Indtast en brugeradgangskode.", + "Please enter a valid number of pages (1 or more).": "Indtast et gyldigt antal sider (1 eller flere).", + "Please enter a valid page number between 1 and {{total}}": "Indtast et gyldigt sidetal mellem 1 og {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Indtast et gyldigt sideinterval (f.eks. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Indtast de sidetal, der skal udtrækkes.", + "Please enter positive numbers.": "Indtast positive tal.", + "Please enter some text to convert.": "Indtast tekst, der skal konverteres.", + "Please enter text for the watermark.": "Indtast tekst til vandmærket.", + "Please enter the PDF password.": "Indtast PDF-adgangskoden.", + "Please load a PDF first.": "Indlæs først en PDF.", + "Please select PDF files to create a ZIP archive.": "Vælg PDF-filer for at oprette et ZIP-arkiv.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Vælg en .pem-, .crt-, .cer- eller .der-certifikatfil.", + "Please select a PDF file.": "Vælg en PDF-fil.", + "Please select a valid PDF file.": "Vælg en gyldig PDF-fil.", + "Please select an area on at least one page to crop.": "Vælg et område på mindst én side for at beskære.", + "Please select an area to crop first.": "Vælg først et område at beskære.", + "Please select an area to crop.": "Vælg et område at beskære.", + "Please select an image file for the watermark.": "Vælg en billedfil til vandmærket.", + "Please select at least one BMP file.": "Vælg mindst én BMP-fil.", + "Please select at least one CSV file.": "Vælg mindst én CSV-fil.", + "Please select at least one Excel file.": "Vælg mindst én Excel-fil.", + "Please select at least one HEIC file.": "Vælg mindst én HEIC-fil.", + "Please select at least one JPG file.": "Vælg mindst én JPG-fil.", + "Please select at least one JPG or JPEG2000 image.": "Vælg mindst ét JPG- eller JPEG2000-billede.", + "Please select at least one ODT file.": "Vælg mindst én ODT-fil.", + "Please select at least one PDF file.": "Vælg mindst én PDF-fil.", + "Please select at least one PowerPoint file.": "Vælg mindst én PowerPoint-fil.", + "Please select at least one RTF file.": "Vælg mindst én RTF-fil.", + "Please select at least one SVG file.": "Vælg mindst én SVG-fil.", + "Please select at least one TIFF file.": "Vælg mindst én TIFF-fil.", + "Please select at least one Word document.": "Vælg mindst ét Word-dokument.", + "Please select at least one file to attach.": "Vælg mindst én fil at vedhæfte.", + "Please select at least one image file.": "Vælg mindst én billedfil.", + "Please select at least one text file.": "Vælg mindst én tekstfil.", + "Please select at least one {{FILETYPE_NAME}} file.": "Vælg mindst én {{FILETYPE_NAME}}-fil.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Vælg mindst én {{TOOL_NAME}}-fil (.eml eller .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Vælg mindst én {{TOOL_NAME}}-fil.", + "Please select even or odd pages.": "Vælg lige eller ulige sider.", + "Please select one or more PDF files.": "Vælg en eller flere PDF-filer.", + "Please select pages to delete.": "Vælg sider, der skal slettes.", + "Please select pages to duplicate.": "Vælg sider, der skal duplikeres.", + "Please select pages to mark for splitting.": "Vælg sider, der skal markeres til opdeling.", + "Please select pages to rotate.": "Vælg sider, der skal roteres.", + "Please specify a page range for page-level attachments.": "Angiv et sideinterval til vedhæftninger på sideniveau.", + "Please upload PDF files.": "Upload PDF-filer.", + "Please upload PDFs first.": "Upload først PDF'er.", + "Please upload a .docx file first.": "Upload først en .docx-fil.", + "Please upload a PDF file first.": "Upload først en PDF-fil.", + "Please upload a PDF file.": "Upload en PDF-fil.", + "Please upload a PDF first.": "Upload først en PDF.", + "Please upload a valid PDF file.": "Upload en gyldig PDF-fil.", + "Please upload at least one PDF file.": "Upload mindst én PDF-fil.", + "Please upload at least two PDF files to alternate and mix.": "Upload mindst to PDF-filer for at veksle og blande.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Upload både en basis-PDF og en overlay/underlay-PDF.", + "Please upload valid PDF files.": "Upload gyldige PDF-filer.", + "Please use the Download button in the PDF viewer toolbar above.": "Brug knappen Download i PDF-viewerens værktøjslinje ovenfor.", + "Please wait for the PDF viewer to load.": "Vent, til PDF-vieweren er indlæst.", + "Please wait for the form to finish loading.": "Vent, til formularen er færdig med at indlæse.", + "Portrait": "Stående", + "Position": "Position", + "Post-processing for transparency compliance...": "Efterbehandling for overholdelse af transparenskrav...", + "Posterize": "Posteriser", + "Posterizing PDF...": "Posteriserer PDF...", + "PowerPoint to PDF": "PowerPoint til PDF", + "Pre Flatten": "Flatten først", + "Pre-flattening PDF...": "Flatter PDF på forhånd...", + "Prefer JPEG 2000 for photos": "Foretræk JPEG 2000 til fotos", + "Preparing PDF export...": "Forbereder PDF-eksport...", + "Preparing conversion...": "Forbereder konvertering...", + "Preparing download...": "Forbereder download...", + "Preparing preview...": "Forbereder forhåndsvisning...", + "Presentations": "Præsentationer", + "Preserve PDF/A": "Bevar PDF/A", + "Preview": "Forhåndsvisning", + "Preview Error": "Fejl i forhåndsvisning", + "Preview Text": "Forhåndsvis tekst", + "Previous page": "Forrige side", + "Print Form": "Udskriv formular", + "Private data that editing apps store inside the PDF.": "Private data, som redigeringsprogrammer gemmer i PDF'en.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF'er er behandlet.", + "Processing Complete": "Behandling fuldført", + "Processing Dpi": "Behandlings-DPI", + "Processing Failed": "Behandlingen mislykkedes", + "Processing PDF permissions...": "Behandler PDF-tilladelser...", + "Processing attachments...": "Behandler vedhæftninger...", + "Processing failed for {{name}}.": "Behandlingen mislykkedes for {{name}}.", + "Processing file {{n}} of {{length}}...": "Behandler fil {{n}} af {{length}}...", + "Processing images...": "Behandler billeder...", + "Processing multiple PDFs...": "Behandler flere PDF'er...", + "Processing page {{i}} of {{numPages}}": "Behandler side {{i}} af {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Behandler side {{i}} af {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Behandler side {{n}} af {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Behandler side {{pageNum}} af {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Behandler side {{pageNum}} af {{totalPages}}...", + "Processing produced an empty file.": "Behandlingen gav en tom fil.", + "Processing resulted in an empty file.": "Behandlingen resulterede i en tom fil.", + "Processing sheet {{n}}...": "Behandler ark {{n}}...", + "Processing {{name}}...": "Behandler {{name}}...", + "Processing {{nodeName}}...": "Behandler {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Behandler {{n}}/{{length}}: {{name}}...", + "Processing...": "Behandler...", + "Producer": "Producent", + "Publisher Files": "Publisher-filer", + "Purple": "Lilla", + "PyMuPDF (Document Processing)": "PyMuPDF (dokumentbehandling)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF er ikke konfigureret. Konfigurér det i Avancerede indstillinger.", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDF-modulet eksporterede ikke den forventede PyMuPDF-klasse.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF producerede en tom dekrypteret fil.", + "PyMuPDF: not configured.": "PyMuPDF: ikke konfigureret.", + "QR Code": "QR-kode", + "Quality": "Kvalitet", + "Quits application (cannot be overridden)": "Afslutter programmet (kan ikke tilsidesættes)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1-signaturen kan ikke verificeres mod underskriverens offentlige nøgle", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS-signaturen kan ikke verificeres mod underskriverens offentlige nøgle", + "Rasterization Complete": "Rasterisering fuldført", + "Rasterization Partial": "Delvis rasterisering", + "Rasterize": "Rasterisér", + "Rasterize Dpi": "Rasteriserings-DPI", + "Rasterize pages to images": "Rasterisér sider til billeder", + "Rasterize quality": "Rasteriseringskvalitet", + "Rasterize resolution (DPI)": "Rasteriseringsopløsning (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF(er) rasteriseret, {{failed}} mislykkedes.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rasteriserer {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rasteriserer {{name}}...", + "Rasterizing...": "Rasteriserer...", + "Rating must be between 0 and 5": "Vurderingen skal være mellem 0 og 5", + "Read Only": "Skrivebeskyttet", + "Reading CSV file...": "Læser CSV-fil...", + "Reading PDF...": "Læser PDF...", + "Reading XML file...": "Læser XML-fil...", + "Reading encrypted PDF...": "Læser krypteret PDF...", + "Reading files...": "Læser filer...", + "Reading layer configuration...": "Læser lagkonfiguration...", + "Reading {{name}} ({{n}}/{{length}})...": "Læser {{name}} ({{n}}/{{length}})...", + "Ready": "Klar", + "Reason": "Årsag", + "Red": "Rød", + "Redact": "Sløring", + "Redact Mode": "Sløringstilstand", + "Redact text from PDF": "Slør tekst i PDF", + "Redaction Failed": "Sløring mislykkedes", + "Reduce PDF file size": "Reducér PDF-filstørrelse", + "Reduce color complexity": "Reducér farvekompleksitet", + "Reduces file size by removing color information.": "Reducerer filstørrelsen ved at fjerne farveoplysninger.", + "Reloads page": "Genindlæser siden", + "Remove": "Fjern", + "Remove All Attachments": "Fjern alle vedhæftninger", + "Remove Annotations": "Fjern annotationer", + "Remove Blank Pages": "Fjern tomme sider", + "Remove Embedded Files": "Fjern indlejrede filer", + "Remove Fonts": "Fjern skrifttyper", + "Remove Javascript": "Fjern JavaScript", + "Remove Layers": "Fjern lag", + "Remove Links": "Fjern links", + "Remove Mark Info": "Fjern Mark Info", + "Remove Metadata": "Fjern metadata", + "Remove PDF password protection": "Fjern PDF-adgangskodebeskyttelse", + "Remove Structure Tree": "Fjern strukturtræ", + "Remove alternate images": "Fjern alternative billeder", + "Remove application data": "Fjern programdata", + "Remove article threads": "Fjern artikeltråde", + "Remove attachment": "Fjern vedhæftning", + "Remove blank pages automatically": "Fjern tomme sider automatisk", + "Remove document structure tree": "Fjern dokumentets strukturtræ", + "Remove file": "Fjern fil", + "Remove metadata, scripts, and hidden data": "Fjern metadata, scripts og skjulte data", + "Remove output intents": "Fjern output intents", + "Remove page thumbnails": "Fjern sideminiaturer", + "Remove specific pages": "Fjern bestemte sider", + "Remove web capture information": "Fjern oplysninger om webindsamling", + "Remove {{name}}": "Fjern {{name}}", + "Removed \"{{beforeText}}\"": "Fjernede \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Fjernede billede ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} tom(me) side(r) er fjernet!", + "Removing all metadata...": "Fjerner al metadata...", + "Removing annotations...": "Fjerner annotationer...", + "Removing redacted text from document data...": "Fjerner sløret tekst fra dokumentdata...", + "Removing restrictions...": "Fjerner begrænsninger...", + "Removing {{length}} blank page(s)...": "Fjerner {{length}} tom(me) side(r)...", + "Render Error": "Gengivelsesfejl", + "Rendering Page {{num}}...": "Gengiver side {{num}}...", + "Rendering page previews...": "Gengiver sideforhåndsvisninger...", + "Rendering page previews: {{current}}/{{total}}": "Gengiver sideforhåndsvisninger: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Gengiver side {{n}} af {{length}}...", + "Rendering preview for page {{pageNum}}...": "Gengiver forhåndsvisning af side {{pageNum}}...", + "Reopens closed tab": "Genåbner lukket fane", + "Repair": "Reparér", + "Repair Failed": "Reparation mislykkedes", + "Repair corrupted PDF": "Reparér beskadiget PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} fil(er) repareret. Kunne ikke reparere: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Reparerer {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Reparerer {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Erstattede \"{{beforeText}}\" med \"{{afterText}}\"", + "Required": "Påkrævet", + "Resamples even when an image is only slightly above the limit.": "Resampler, selv når et billede kun ligger lidt over grænsen.", + "Reset Form": "Nulstil formular", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Nulstil og gå tilbage til filuploaderen? Alle ugemte ændringer går tabt.", + "Resolution": "Opløsning", + "Retain Page Labels": "Behold sideetiketter", + "Retry Failed": "Prøv mislykkede igen", + "Reverse Pages": "Vend sider", + "Reverse page order": "Vend siderækkefølgen", + "Reversing page order...": "Vender siderækkefølgen...", + "Reversing {{name}} ({{n}}/{{length}})...": "Vender {{name}} ({{n}}/{{length}})...", + "Right": "Højre", + "Right edge in points": "Højre kant i punkter", + "Rotate": "Roter", + "Rotate +90°": "Roter +90°", + "Rotate all pages": "Roter alle sider", + "Rotation": "Rotation", + "Rotation Variance": "Rotationsvariation", + "Rotations applied successfully!": "Rotationer er anvendt!", + "Rows": "Rækker", + "Run Javascript": "Kør JavaScript", + "Running OCR on page {{pageNum}}...": "Kører OCR på side {{pageNum}}...", + "Running...": "Kører...", + "SVG": "SVG", + "SVG Files": "SVG-filer", + "SVG to PDF": "SVG til PDF", + "Sanitize": "Rens", + "Sanitized With Warnings": "Renset med advarsler", + "Sanitizing PDF...": "Renser PDF...", + "Saturation": "Mætning", + "Saved": "Gemt", + "Saving PDF with layer changes...": "Gemmer PDF med laglændringer...", + "Scaling Mode": "Skaleringstilstand", + "Scanner Effect": "Scannereffekt", + "Scanner effect applied successfully!": "Scannereffekt er anvendt!", + "Scanning page {{n}} of {{pageCount}}...": "Scanner side {{n}} af {{pageCount}}...", + "Search Text": "Søg efter tekst", + "Search languages...": "Søg sprog...", + "Select Font": "Vælg skrifttype", + "Select a field to edit properties": "Vælg et felt for at redigere egenskaber", + "Select a field...": "Vælg et felt...", + "Select to add this button to an existing group": "Vælg for at føje denne knap til en eksisterende gruppe", + "Selected Option": "Valgt mulighed", + "Self-Signed: Signer Identity Not Verified": "Selvsigneret: underskriverens identitet er ikke verificeret", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Selvhostede OCR-ressourcer er kun delvist konfigureret. Angiv {{missing}} sammen med de øvrige URL'er til Tesseract-ressourcer.", + "Separator": "Skillelinje", + "Separator Color": "Skillelinjens farve", + "Separator Thickness": "Skillelinjens tykkelse", + "Sepia": "Sepia", + "Serial Number:": "Serienummer:", + "Set custom destination": "Angiv brugerdefineret destination", + "Shapes": "Figurer", + "Sheet {{n}} {{sideLabel}}": "Ark {{n}} {{sideLabel}}", + "Show": "Vis", + "Show password": "Vis adgangskode", + "Show/Hide Field": "Vis/skjul felt", + "Sign Here": "Underskriv her", + "Signature /Contents is not a single DER object followed by zero padding": "Signaturens /Contents er ikke ét enkelt DER-objekt efterfulgt af nul-padding", + "Signature Algorithm:": "Signaturalgoritme:", + "Signature Intact: Signer Identity Not Verified": "Signatur intakt: underskriverens identitet er ikke verificeret", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Signaturfelter er AcroForm-signaturfelter og vises kun i en avanceret PDF-viewer.", + "Signature has a missing or malformed /ByteRange": "Signaturen mangler /ByteRange eller har en ugyldig /ByteRange", + "Signature scheme {{kind}} not implemented": "Signaturskema {{kind}} er ikke implementeret", + "Signature {{n}}": "Signatur {{n}}", + "Signatures": "Signaturer", + "Signed By": "Underskrevet af", + "Signed On": "Underskrevet den", + "Signed PDF Not Changed": "Underskrevet PDF er uændret", + "Signed PDF downloaded successfully!": "Underskrevet PDF er downloadet!", + "Signed PDF saved successfully!": "Underskrevet PDF er gemt!", + "Simple (1, 2, 3)": "Enkel (1, 2, 3)", + "Simplify large color profiles": "Forenkl store farveprofiler", + "Skew Threshold": "Skævhedsgrænse", + "Skip": "Spring over", + "Skip All": "Spring alle over", + "Skip Remaining": "Spring resten over", + "Skip this file": "Spring denne fil over", + "Skipped: {{join}}.": "Sprunget over: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Mindre filer, men kun læsere med Brotli-understøttelse kan åbne dem, f.eks. Firefox, MuPDF 1.26+ og Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Nogle filer blev sprunget over, fordi de ikke er understøttede billeder.", + "Some files were skipped. Only BMP files are allowed.": "Nogle filer blev sprunget over. Kun BMP-filer er tilladt.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Nogle filer blev sprunget over. Kun HEIC/HEIF-filer er tilladt.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Nogle filer blev sprunget over. Kun JPG-, JPEG-, JP2- og JPX-filer er tilladt.", + "Some files were skipped. Only PDF files are allowed.": "Nogle filer blev sprunget over. Kun PDF-filer er tilladt.", + "Some files were skipped. Only PNG images are allowed.": "Nogle filer blev sprunget over. Kun PNG-billeder er tilladt.", + "Some files were skipped. Only SVG graphics are allowed.": "Nogle filer blev sprunget over. Kun SVG-grafik er tilladt.", + "Some files were skipped. Only TIFF files are allowed.": "Nogle filer blev sprunget over. Kun TIFF-filer er tilladt.", + "Some files were skipped. Only WebP images are allowed.": "Nogle filer blev sprunget over. Kun WebP-billeder er tilladt.", + "Some files were skipped. Only supported image formats are allowed.": "Nogle filer blev sprunget over. Kun understøttede billedformater er tilladt.", + "Some files were skipped. Only text files are allowed.": "Nogle filer blev sprunget over. Kun tekstfiler er tilladt.", + "Some pages could not be processed. Please try again.": "Nogle sider kunne ikke behandles. Prøv igen.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Nogle sløringsmarkeringer kunne ikke anvendes, så filen blev ikke downloadet. Anvend eller fjern dem i editoren, og prøv igen.", + "Spacing": "Afstand", + "Split PDF": "Opdel PDF", + "Split by Bookmarks": "Opdel efter bogmærker", + "Split pages into tile grid for poster printing": "Opdel sider i et fliseraster til plakatprint", + "Split pages vertically or horizontally": "Opdel sider lodret eller vandret", + "Splitting PDF pages...": "Opdeler PDF-sider...", + "Splitting PDF...": "Opdeler PDF...", + "Spreadsheets": "Regneark", + "Standard (192 DPI)": "Standard (192 DPI)", + "Standard Size": "Standardstørrelse", + "Standardize all pages to a target size": "Standardisér alle sider til en målstørrelse", + "Standardizing pages...": "Standardiserer sider...", + "Stitch all pages into one continuous page": "Sammensæt alle sider til én sammenhængende side", + "Straighten skewed PDF pages": "Ret skæve PDF-sider op", + "Strip all annotations": "Fjern alle annotationer", + "Style": "Stil", + "Style Changed": "Stil ændret", + "Style changed ({{length}} regions)": "Stil ændret ({{length}} områder)", + "Subject": "Emne", + "Subset embedded fonts": "Subsæt indlejrede skrifttyper", + "Success": "Succes", + "Success!": "Succes!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} CSV-fil(er) er konverteret til PDF.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} Excel-fil(er) er konverteret til PDF.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} ODT-fil(er) er konverteret til PDF.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF(er) er konverteret til DOCX.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF(er) er konverteret til Markdown.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF(er) er konverteret til {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} PSD-filer er konverteret til én PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} PowerPoint-fil(er) er konverteret til PDF.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} RTF-fil(er) er konverteret til PDF.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} Word-dokument(er) er konverteret til PDF.", + "Successfully converted {{length}} files to PDF.": "{{length}} filer er konverteret til PDF.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} {{TOOL_NAME}}-fil(er) er konverteret til PDF.", + "Successfully converted {{name}} to DOCX.": "{{name}} er konverteret til DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} er konverteret til Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} er konverteret til PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} er konverteret til {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF'en er udtrukket til brug med AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF(er) er udtrukket til brug med AI/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF'en er rasteriseret ved {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF(er) er rasteriseret ved {{dpi}} DPI.", + "Supported: CBZ, CBR": "Understøttet: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Understøttet: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Understøttet: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Understøttet: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Understøttet: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Understøttet: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Understøttet: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Understøttet: XPS, OXPS", + "Switches apps": "Skifter programmer", + "Switches tabs": "Skifter faner", + "Table of Contents": "Indholdsfortegnelse", + "Table {{n}} (Page {{page}})": "Tabel {{n}} (side {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Målfelt", + "Target Kilobytes": "Mål i kilobytes", + "Target Not Reached": "Målet blev ikke nået", + "Target Size": "Målstørrelse", + "Technical Details": "Tekniske detaljer", + "Temperature": "Temperatur", + "Template \"{{name}}\" loaded.": "Skabelonen \"{{name}}\" er indlæst.", + "Template \"{{name}}\" saved.": "Skabelonen \"{{name}}\" er gemt.", + "Text": "Tekst", + "Text Color": "Tekstfarve", + "Text Files": "Tekstfiler", + "Text color changed successfully!": "Tekstfarven er ændret!", + "Text converted to PDF successfully!": "Tekst er konverteret til PDF!", + "Text extracted successfully!": "Tekst er udtrukket!", + "Text to PDF": "Tekst til PDF", + "That password did not open any of the remaining files.": "Den adgangskode åbnede ingen af de resterende filer.", + "The PDF file(s) do not contain any attachments to extract.": "PDF-filen/filerne indeholder ingen vedhæftninger, der kan udtrækkes.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF'en har {{totalPages}} sider, hvilket ikke kan deles jævnt med {{nValue}}. Den sidste PDF vil indeholde {{remainder}} side(r).", + "The PDF might be corrupted or password protected.": "PDF'en kan være beskadiget eller adgangskodebeskyttet.", + "The PDF might be corrupted or password-protected.": "PDF'en kan være beskadiget eller adgangskodebeskyttet.", + "The PDF might be corrupted.": "PDF'en kan være beskadiget.", + "The PDF viewer is still initializing.": "PDF-vieweren initialiseres stadig.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF'en blev downloadet, men disse trin kunne ikke gennemføres: {{join}}. Det indhold, de dækker, kan stadig være i filen.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL'en returnerede en uventet indholdstype: {{contentType}}. Forventede en JavaScript-fil.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "De bytes, som /ByteRange udelukker, er ikke præcis en hex-kodet signatur", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "De bytes, som /ByteRange udelukker, er ikke /Contents for denne signatur", + "The compression engine returned an unreadable result.": "Komprimeringsmotoren returnerede et ulæseligt resultat.", + "The compression engine stopped unexpectedly.": "Komprimeringsmotoren stoppede uventet.", + "The current password you entered is incorrect. Please try again.": "Den nuværende adgangskode, du indtastede, er forkert. Prøv igen.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Følgende feltnavne findes allerede i den uploadede PDF: {{conflictList}}. Omdøb disse felter, før du downloader.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Følgende feltnavne bruges mere end én gang: {{duplicateList}}. Omdøb disse felter, så navnene er unikke, før du downloader.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Det angivne antal sider ({{length}}) svarer ikke til det nuværende antal sider i dokumentet ({{currentGridCount}}). Angiv en komplet rækkefølge for alle sider.", + "The password you entered is incorrect. Please try again.": "Den adgangskode, du indtastede, er forkert. Prøv igen.", + "The password you entered is wrong or the file is corrupted.": "Den adgangskode, du indtastede, er forkert, eller filen er beskadiget.", + "The provided file could not be loaded as an image. It may be corrupted.": "Den angivne fil kunne ikke indlæses som billede. Den kan være beskadiget.", + "The requested OCR language is not available: {{unavailableText}}.": "Det ønskede OCR-sprog er ikke tilgængeligt: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Den angivne siderækkefølge er ufuldstændig eller indeholder ugyldige sidetal. Sørg for at angive en ny position for hver oprindelig side.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Disse filer er ikke gyldige PDF'er, så de blev ikke tilføjet: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Disse filer er adgangskodebeskyttede: {{names}}. Indtast deres adgangskoder på filkortene, eller fjern dem, og komprimer derefter igen.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Dette BentoPDF-build indeholder kun OCR-data til {{availableText}}.", + "This PDF does not contain any digital signatures.": "Denne PDF indeholder ingen digitale signaturer.", + "This PDF has no layers (OCG).": "Denne PDF har ingen lag (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Denne PDF er adgangskodebeskyttet. Indtast den nuværende adgangskode for at fortsætte.", + "This document contains pages with different dimensions:": "Dette dokument indeholder sider med forskellige dimensioner:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dokumentet har 1 sværtningsmarkering, der ikke er anvendt endnu. Indtil en markering er anvendt, ligger indholdet under den stadig i filen. Vil du anvende alle markeringer og downloade?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dokumentet har {{count}} sværtningsmarkeringer, der ikke er anvendt endnu. Indtil en markering er anvendt, ligger indholdet under den stadig i filen. Vil du anvende alle markeringer og downloade?", + "This feature requires {{name}} to be configured.": "Denne funktion kræver, at {{name}} er konfigureret.", + "This file is not a valid PDF.": "Denne fil er ikke en gyldig PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Dette modul er licenseret under AGPL-3.0. Ved at konfigurere det accepterer du dets licensvilkår.", + "This tool has been disabled": "Dette værktøj er deaktiveret", + "This tool is not available in your deployment. Contact your administrator for more information.": "Dette værktøj er ikke tilgængeligt i din installation. Kontakt din administrator for at få flere oplysninger.", + "Threshold": "Tærskel", + "Tile": "Flise", + "Tile Gap X": "Flisemellemrum X", + "Tile Gap Y": "Flisemellemrum Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Tidsstempel", + "Timestamp Failed": "Tidsstempling mislykkedes", + "Tint": "Nuance", + "Title": "Titel", + "To actually fill or change the options, use our PDF Form Filler tool.": "Brug vores værktøj PDF-formularudfylder for faktisk at udfylde eller ændre valgmulighederne.", + "Toggle": "Skift", + "Toggle style": "Skift typografi", + "Toggle sync scroll": "Slå synkron rulning til/fra", + "Tool Unavailable": "Værktøjet er ikke tilgængeligt", + "Tooltip / Help Text": "Værktøjstip / hjælpetekst", + "Top": "Øverst", + "Top Center": "Øverst i midten", + "Top Left": "Øverst til venstre", + "Top Right": "Øverst til højre", + "Top edge in points": "Øverste kant i punkter", + "Total Pages": "Sider i alt", + "Transparent Background": "Gennemsigtig baggrund", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Prøver JPEG 2000 mod JPEG for hvert billede og beholder den mindste.", + "Trim margins from all pages": "Beskær margener fra alle sider", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Tillidsverificering: {{trustVerified}}/{{length}} signaturer verificeret mod brugerdefineret certifikat", + "Trusted": "Betroet", + "Trusted certificate loaded": "Betroet certifikat indlæst", + "Tsa Url": "TSA-URL", + "Turns off quality, resolution and every other lossy image step.": "Slår kvalitet, opløsning og alle andre tabsgivende billedtrin fra.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL'en skal starte med http:// eller https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "PDF'en kunne ikke dekrypteres med den angivne adgangskode.", + "Unable to repair any of the uploaded PDF files.": "Ingen af de uploadede PDF-filer kunne repareres.", + "Unembed standard fonts": "Fjern indlejring af standardskrifttyper", + "Unembed standard-font look-alikes": "Fjern indlejring af skrifttyper, der ligner standardskrifttyper", + "Unexpected delimiter in content stream": "Uventet skilletegn i indholdsstrøm", + "Unexpected reply from the engine.": "Uventet svar fra motoren.", + "Uniform": "Ensartet", + "Unique Page Sizes": "Unikke sidestørrelser", + "Unknown": "Ukendt", + "Unknown error": "Ukendt fejl", + "Unknown error occurred in worker.": "Der opstod en ukendt fejl i workeren.", + "Unknown error occurred.": "Der opstod en ukendt fejl.", + "Unlock": "Lås op", + "Unlock All": "Lås alle op", + "Unlock Remaining ({{remaining}})": "Lås resterende op ({{remaining}})", + "Unlocked": "Låst op", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} af {{length}} filer er låst op.", + "Unlocking...": "Låser op...", + "Unresolved optional content reference": "Uløst reference til valgfrit indhold", + "Unsupported ECDSA curve in signer certificate": "ECDSA-kurve i underskrivercertifikatet understøttes ikke", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Billedet understøttes ikke. Brug en PNG eller JPG til vandmærket.", + "Unsupported digest OID {{digestOid}}": "Digest-OID {{digestOid}} understøttes ikke", + "Unsupported file type: .{{ext}}": "Filtypen understøttes ikke: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Signaturalgoritme-OID {{oid}} understøttes ikke", + "Unterminated array or dictionary in content stream": "Uafsluttet array eller dictionary i indholdsstrøm", + "Unterminated hex string in content stream": "Uafsluttet hex-streng i indholdsstrøm", + "Unterminated inline image in content stream": "Uafsluttet inline-billede i indholdsstrøm", + "Unterminated string in content stream": "Uafsluttet streng i indholdsstrøm", + "Unverified: Unsupported Signature Algorithm": "Ikke verificeret: signaturalgoritmen understøttes ikke", + "Updating metadata...": "Opdaterer metadata...", + "Upload Certificate": "Upload certifikat", + "Upload Comics": "Upload tegneserier", + "Upload Documents": "Upload dokumenter", + "Upload EPUB Files": "Upload EPUB-filer", + "Upload Email Files": "Upload e-mailfiler", + "Upload FB2 Files": "Upload FB2-filer", + "Upload Images": "Upload billeder", + "Upload JSON Files": "Upload JSON-filer", + "Upload MOBI Files": "Upload MOBI-filer", + "Upload Markdown Files": "Upload Markdown-filer", + "Upload ODG Files": "Upload ODG-filer", + "Upload PDFs": "Upload PDF'er", + "Upload PUB Files": "Upload PUB-filer", + "Upload Pages Files": "Upload Pages-filer", + "Upload Presentations": "Upload præsentationer", + "Upload SVG Files": "Upload SVG-filer", + "Upload Spreadsheets": "Upload regneark", + "Upload Text Files": "Upload tekstfiler", + "Upload Visio Files": "Upload Visio-filer", + "Upload WPD Files": "Upload WPD-filer", + "Upload WPS Files": "Upload WPS-filer", + "Upload XML Files": "Upload XML-filer", + "Upload XPS Files": "Upload XPS-filer", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Upload en PDF, og klik på \"Generate Preview\" for at se hæftets layout", + "Upload images and convert to PDF": "Upload billeder, og konvertér dem til PDF", + "Upload one or more PDF files": "Upload en eller flere PDF-filer", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Store bogstaver A-Z, cifre 0-9 og - . $ / + % MELLEMRUM", + "Use same password for all files": "Brug samme adgangskode til alle filer", + "User Password": "Brugeradgangskode", + "VSD to PDF": "VSD til PDF", + "Valid From": "Gyldig fra", + "Valid Signature": "Gyldig signatur", + "Valid Until": "Gyldig til", + "Validating {{n}} of {{length}}: {{name}}": "Validerer {{n}} af {{length}}: {{name}}", + "Validating...": "Validerer...", + "Value": "Værdi", + "Value (e.g., Marketing)": "Værdi (f.eks. Marketing)", + "Vertical": "Lodret", + "Viewer not ready": "Viewer er ikke klar", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Viewer er ikke klar. Upload en PDF, og vent, til den er færdig med at indlæse.", + "Visibility": "Synlighed", + "Visio Files": "Visio-filer", + "WPD to PDF": "WPD til PDF", + "WPS Files": "WPS-filer", + "WPS to PDF": "WPS til PDF", + "Watermark": "Vandmærke", + "Watermark added successfully!": "Vandmærke er tilføjet!", + "Web Crypto API not available in this context": "Web Crypto API er ikke tilgængelig i denne kontekst", + "Web Crypto import/verify failed: {{error}}": "Web Crypto-import/verificering mislykkedes: {{error}}", + "WebP": "WebP", + "Whitelist": "Hvidliste", + "Width ({{unit}})": "Bredde ({{unit}})", + "Word": "Word", + "Word Documents": "Word-dokumenter", + "Word to PDF": "Word til PDF", + "WordPerfect Files": "WordPerfect-filer", + "Worker crashed": "Worker gik ned", + "Worker error occurred. Check console for details.": "Der opstod en worker-fejl. Se konsollen for detaljer.", + "Workflow completed": "Arbejdsgang fuldført", + "Wrong password": "Forkert adgangskode", + "Wrong password for: {{join}}": "Forkert adgangskode til: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Forkert adgangskode, eller \"{{name}}\" kunne ikke dekrypteres.", + "X Position": "X-position", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XML-filer", + "XML to PDF": "XML til PDF", + "XMP Metadata": "XMP-metadata", + "XPS Files": "XPS-filer", + "XPS to PDF": "XPS til PDF", + "Y Position": "Y-position", + "Year must be between 1900 and 2100": "Året skal være mellem 1900 og 2100", + "Yellow": "Gul", + "Yellowish": "Gullig", + "You cannot delete the last page of the document.": "Du kan ikke slette dokumentets sidste side.", + "Your PDF has been cropped and the download has started.": "Din PDF er beskåret, og downloaden er startet.", + "Your PDF has been downloaded successfully.": "Din PDF er downloadet.", + "Your PDF has been posterized.": "Din PDF er posteriseret.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Dine sløringer er anvendt på siderne, men denne fil er krypteret, så BentoPDF kan ikke også fjerne kopier af den slørede tekst fra egenskaber, bogmærker og vedhæftninger. For en fuld oprydning skal du slø en ukrypteret kopi og derefter tilføje en adgangskode med Beskyt PDF. Download alligevel?", + "Your workflow needs at least one input node and one output node to run.": "Din arbejdsgang kræver mindst én input-node og én output-node for at køre.", + "ZIP archive created successfully!": "ZIP-arkiv er oprettet!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "f.eks. dd/mm/åååå TT:MM:ss", + "form": "formular", + "https://example.com": "https://example.com", + "signature found": "signatur fundet", + "signatures found": "signaturer fundet", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} node", + "{{count}} nodes": "{{count}} noder", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 side", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} sider", + "{{length}} Files Need a Password": "{{length}} filer kræver en adgangskode", + "{{length}} PDF file(s) selected": "{{length}} PDF-fil(er) valgt", + "{{length}} PDF files selected": "{{length}} PDF-filer valgt", + "{{length}} attachment(s) extracted successfully!": "{{length}} vedhæftning(er) er udtrukket!", + "{{length}} file • {{totalPages}} total pages": "{{length}} fil • {{totalPages}} sider i alt", + "{{length}} file(s) attached successfully.": "{{length}} fil(er) er vedhæftet.", + "{{length}} files • {{totalPages}} total pages": "{{length}} filer • {{totalPages}} sider i alt", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Den var adgangskodebeskyttet, så den komprimerede kopi har ingen adgangskode. Brug Beskyt PDF til at tilføje en igen.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} sider)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} er digitalt signeret, så den blev ladet uændret. Komprimering ville ødelægge signaturen. For at komprimere den alligevel skal du slå Tilsidesæt indholdsbeskyttelse til under Brugerdefinerede indstillinger. Dens signaturer fjernes så.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} er ikke en gyldig PDF, så den blev ikke tilføjet.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} er adgangskodebeskyttet. Indtast adgangskoden på filkortet, og komprimer derefter igen.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Kunne ikke indlæse sideantal", + "{{size}} • Loading pages...": "{{size}} • Indlæser sider...", + "{{size}} • Loading...": "{{size}} • Indlæser...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} sider", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} sider", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} sider", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} sider", + "{{size}} • {{value}} pages": "{{size}} • {{value}} sider", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF(er) er dekrypteret.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF(er) er lineariseret.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} sider → {{numSheets}} outputark", + "{{validCount}} valid": "{{validCount}} gyldige", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 side", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} sider" +} diff --git a/public/locales/de/common.json b/public/locales/de/common.json index c80d818d..954b263b 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -9,10 +9,11 @@ "openMainMenu": "Hauptmenü öffnen", "language": "Sprache", "searchLanguage": "Sprache suchen…", - "noLanguagesFound": "Keine Sprachen gefunden" + "noLanguagesFound": "Keine Sprachen gefunden", + "breadcrumb": "Brotkrumennavigation" }, "donation": { - "message": "Liebst du BentoPDF? Hilf uns, es kostenlos und Open Source zu halten!", + "message": "Gefällt Ihnen BentoPDF? Helfen Sie uns, es kostenlos und Open Source zu halten!", "button": "Spenden" }, "hero": { @@ -36,7 +37,7 @@ }, "noUploads": { "title": "Kein Upload", - "description": "100% clientseitig, deine Dateien verlassen nie dein Gerät." + "description": "100% clientseitig, Ihre Dateien verlassen nie Ihr Gerät." }, "foreverFree": { "title": "Für immer kostenlos", @@ -44,7 +45,7 @@ }, "noLimits": { "title": "Keine Limits", - "description": "Nutz es so viel du willst, ohne versteckte Grenzen." + "description": "Nutzen Sie es so viel Sie wollen, ohne versteckte Grenzen." }, "batchProcessing": { "title": "Stapelverarbeitung", @@ -56,18 +57,18 @@ } }, "tools": { - "title": "Starte mit", + "title": "Starten Sie mit", "toolsLabel": "Tools", - "subtitle": "Klick auf ein Tool, um den Datei-Uploader zu öffnen", + "subtitle": "Klicken Sie auf ein Werkzeug, um den Datei-Uploader zu öffnen", "searchPlaceholder": "Tool suchen (z.B. 'teilen', 'organisieren'...)", "backToTools": "Zurück zu den Tools", "firstLoadNotice": "Der erste Ladevorgang dauert einen Moment, da wir unsere Konvertierungs-Engine herunterladen. Danach erfolgt jedes Laden sofort." }, "upload": { - "clickToSelect": "Klick hier, um eine Datei auszuwählen", + "clickToSelect": "Klicken Sie hier, um eine Datei auszuwählen", "orDragAndDrop": "oder per Drag & Drop reinziehen", "pdfOrImages": "PDFs oder Bilder", - "filesNeverLeave": "Deine Dateien verlassen nie dein Gerät.", + "filesNeverLeave": "Ihre Dateien verlassen nie Ihr Gerät.", "addMore": "Weitere Dateien hinzufügen", "clearAll": "Alle löschen", "clearFiles": "Dateien löschen", @@ -128,30 +129,30 @@ "preferences": "Voreinstellungen", "displayPreferences": "Anzeige-Einstellungen", "searchShortcuts": "Tastenkürzel suchen...", - "shortcutsInfo": "Halte die gewünschten Tasten gedrückt, um ein Kürzel festzulegen. Änderungen werden automatisch gespeichert.", + "shortcutsInfo": "Halten Sie die gewünschten Tasten gedrückt, um ein Kürzel festzulegen. Änderungen werden automatisch gespeichert.", "shortcutsWarning": "⚠️ Vermeide gängige Browser-Tastenkürzel (Strg+W, Strg+T, Strg+N usw.), da diese möglicherweise nicht zuverlässig funktionieren.", "import": "Importieren", "export": "Exportieren", "resetToDefaults": "Auf Standard zurücksetzen", "fullWidthMode": "Volle Breite", - "fullWidthDescription": "Verwende die volle Bildschirmbreite für alle Werkzeuge anstelle eines zentrierten Containers", + "fullWidthDescription": "Volle Bildschirmbreite für alle Werkzeuge anstelle eines zentrierten Containers verwenden", "compactMode": "Kompaktmodus", "compactModeDescription": "Werkzeuge als kompakte Liste statt als Karten anzeigen", "advancedSettings": "Erweiterte Einstellungen", "advancedSettingsDescription": "Externe Verarbeitungsmodule konfigurieren (PyMuPDF, Ghostscript, CoherentPDF)", "settingsAutoSaved": "Einstellungen werden automatisch gespeichert", - "clickToSet": "Klicke zum Festlegen", + "clickToSet": "Zum Festlegen klicken", "pressKeys": "Tasten drücken...", "warnings": { "alreadyInUse": "Tastenkombination bereits vergeben", "assignedTo": "ist bereits zugewiesen an:", - "chooseDifferent": "Bitte wähle eine andere Tastenkombination.", + "chooseDifferent": "Bitte wählen Sie eine andere Tastenkombination.", "reserved": "Warnung: Reservierte Tastenkombination", "commonlyUsed": "wird häufig verwendet für:", "unreliable": "Diese Tastenkombination funktioniert möglicherweise nicht zuverlässig oder könnte mit Browser-/Systemfunktionen in Konflikt geraten.", - "useAnyway": "Möchtest du diese trotzdem verwenden?", + "useAnyway": "Möchten Sie diese trotzdem verwenden?", "resetTitle": "Tastenkombinationen zurücksetzen", - "resetMessage": "Bist du dir sicher, dass du alle Tastenkombinationen auf die Standardwerte zurücksetzen möchtest?

Diese Aktion kann nicht rückgängig gemacht werden.", + "resetMessage": "Sind Sie sicher, dass Sie alle Tastenkombinationen auf die Standardwerte zurücksetzen möchten?

Diese Aktion kann nicht rückgängig gemacht werden.", "importSuccessTitle": "Import erfolgreich", "importSuccessMessage": "Tastenkombinationen erfolgreich importiert!", "importFailTitle": "Import fehlgeschlagen", @@ -164,11 +165,11 @@ "proceed": "Fortfahren" }, "compliance": { - "title": "Deine Daten verlassen nie dein Gerät", + "title": "Ihre Daten verlassen nie Ihr Gerät", "weKeep": "Wir schützen", - "yourInfoSafe": "deine Informationen", + "yourInfoSafe": "Ihre Informationen", "byFollowingStandards": "nach globalen Sicherheitsstandards.", - "processingLocal": "Die gesamte Verarbeitung erfolgt lokal auf deinem Gerät.", + "processingLocal": "Die gesamte Verarbeitung erfolgt lokal auf Ihrem Gerät.", "gdpr": { "title": "DSGVO-konform", "description": "Schützt die personenbezogenen Daten und die Privatsphäre von Personen innerhalb der Europäischen Union." @@ -192,27 +193,27 @@ }, "areFilesSecure": { "question": "Sind meine Dateien sicher? Wo werden sie verarbeitet?", - "answer": "Deine Dateien sind so sicher wie möglich, da sie nie deinen Computer verlassen. Die gesamte Verarbeitung erfolgt direkt im Webbrowser (clientseitig). Wir laden deine Dateien nie auf einen Server hoch, sodass du die volle Privatsphäre und Kontrolle über deine Dokumente behältst." + "answer": "Ihre Dateien sind so sicher wie möglich, da sie nie Ihren Computer verlassen. Die gesamte Verarbeitung erfolgt direkt im Webbrowser (clientseitig). Wir laden Ihre Dateien nie auf einen Server hoch, sodass Sie die volle Privatsphäre und Kontrolle über Ihre Dokumente behalten." }, "platforms": { "question": "Funktioniert es auf Mac, Windows und Mobilgeräten?", - "answer": "Ja! Da BentoPDF vollständig in deinem Browser läuft, funktioniert es auf jedem Betriebssystem mit einem modernen Webbrowser, einschließlich Windows, macOS, Linux, iOS und Android." + "answer": "Ja! Da BentoPDF vollständig in Ihrem Browser läuft, funktioniert es auf jedem Betriebssystem mit einem modernen Webbrowser, einschließlich Windows, macOS, Linux, iOS und Android." }, "gdprCompliant": { "question": "Ist BentoPDF DSGVO-konform?", - "answer": "Ja. BentoPDF ist vollständig DSGVO-konform. Da die gesamte Dateiverarbeitung lokal in deinem Browser erfolgt und wir deine Dateien nie sammeln oder übertragen, haben wir keinen Zugang zu deinen Daten. Dies stellt sicher, dass du immer die Kontrolle über deine Dokumente hast." + "answer": "Ja. BentoPDF ist vollständig DSGVO-konform. Da die gesamte Dateiverarbeitung lokal in Ihrem Browser erfolgt und wir Ihre Dateien nie sammeln oder übertragen, haben wir keinen Zugang zu Ihren Daten. Dies stellt sicher, dass Sie immer die Kontrolle über Ihre Dokumente haben." }, "dataStorage": { "question": "Speichert oder verfolgt ihr meine Dateien?", - "answer": "Nein. Wir speichern, verfolgen oder protokollieren deine Dateien niemals. Alles, was du auf BentoPDF tust, geschieht im Speicher deines Browsers und verschwindet, sobald du die Seite schließt. Es gibt keine Uploads, keine Verlaufsprotokolle und keine Server." + "answer": "Nein. Wir speichern, verfolgen oder protokollieren Ihre Dateien niemals. Alles, was Sie in BentoPDF tun, geschieht im Speicher Ihres Browsers und verschwindet, sobald Sie die Seite schließen. Es gibt keine Uploads, keine Verlaufsprotokolle und keine Server." }, "different": { "question": "Was unterscheidet BentoPDF von anderen PDF-Werkzeugen?", - "answer": "Die meisten PDF-Werkzeuge laden deine Dateien zur Verarbeitung auf einen Server hoch. BentoPDF tut das nie. Wir verwenden sichere, moderne Webtechnologie, um Dateien direkt in deinem Browser zu verarbeiten. Das bedeutet schnellere Verarbeitung, stärkere Privatsphäre und vollständige Sicherheit." + "answer": "Die meisten PDF-Werkzeuge laden Ihre Dateien zur Verarbeitung auf einen Server hoch. BentoPDF tut das nie. Wir verwenden sichere, moderne Webtechnologie, um Dateien direkt in Ihrem Browser zu verarbeiten. Das bedeutet schnellere Verarbeitung, stärkere Privatsphäre und vollständige Sicherheit." }, "browserBased": { "question": "Wie schützt mich die browserbasierte Verarbeitung?", - "answer": "Durch die vollständige Ausführung in deinem Browser stellt BentoPDF sicher, dass deine Dateien nie dein Gerät verlassen. Dies eliminiert die Risiken von Server-Hacks, Datenschutzverletzungen oder unbefugtem Zugriff. Deine Dateien gehören dir — Immer." + "answer": "Durch die vollständige Ausführung in Ihrem Browser stellt BentoPDF sicher, dass Ihre Dateien nie Ihr Gerät verlassen. Dies eliminiert die Risiken von Server-Hacks, Datenschutzverletzungen oder unbefugtem Zugriff. Ihre Dateien gehören Ihnen, immer." }, "analytics": { "question": "Verwendet ihr Cookies oder Analysen, um mich zu verfolgen?", @@ -225,8 +226,8 @@ "say": "sagen" }, "support": { - "title": "Gefällt dir meine Arbeit?", - "description": "BentoPDF ist eine Herzensangelegenheit, entwickelt, um ein kostenloses, privates und leistungsstarkes PDF-Toolkit für alle bereitzustellen. Wenn du es nützlich findest, erwäge gerne, die Entwicklung zu unterstützen. Jeder Kaffee hilft!", + "title": "Gefällt Ihnen meine Arbeit?", + "description": "BentoPDF ist eine Herzensangelegenheit, entwickelt, um ein kostenloses, privates und leistungsstarkes PDF-Toolkit für alle bereitzustellen. Wenn Sie es nützlich finden, erwägen Sie gerne, die Entwicklung zu unterstützen. Jeder Kaffee hilft!", "buyMeCoffee": "Kauf mir einen Kaffee" }, "footer": { @@ -236,27 +237,31 @@ "aboutUs": "Über uns", "faqLink": "FAQ", "contactUs": "Kontakt", + "tools": "Werkzeuge", + "pdfConverter": "PDF-Konverter", + "pdfSecurity": "PDF-Sicherheit", + "mergeSplit": "PDF zusammenführen und teilen", "legal": "Rechtliches", "termsAndConditions": "Nutzungsbedingungen", "privacyPolicy": "Datenschutzrichtlinie", - "followUs": "Folge uns", + "followUs": "Folgen Sie uns", "privacyShort": "Datenschutz", "termsShort": "AGB" }, "merge": { "title": "PDFs zusammenführen", - "description": "Kombiniere ganze Dateien oder wähle bestimmte Seiten zum Zusammenführen in ein neues Dokument.", + "description": "Kombinieren Sie ganze Dateien oder wählen Sie bestimmte Seiten zum Zusammenführen in ein neues Dokument.", "fileMode": "Datei-Modus", "pageMode": "Seiten-Modus", "howItWorks": "So funktioniert es:", "fileModeInstructions": [ - "Klick und ziehe das Symbol, um die Reihenfolge der Dateien zu ändern.", - "Im Feld \"Seiten\" für jede Datei kannst du Bereiche angeben (z.B. \"1-3, 5\"), um nur diese Seiten zusammenzuführen.", - "Lass das Feld \"Seiten\" leer, um alle Seiten dieser Datei einzuschließen." + "Klicken und ziehen Sie das Symbol, um die Reihenfolge der Dateien zu ändern.", + "Im Feld \"Seiten\" für jede Datei können Sie Bereiche angeben (z. B. \"1-3, 5\"), um nur diese Seiten zusammenzuführen.", + "Lassen Sie das Feld \"Seiten\" leer, um alle Seiten dieser Datei einzuschließen." ], "pageModeInstructions": [ - "Alle Seiten deiner hochgeladenen PDFs werden unten angezeigt.", - "Ziehe einfach die einzelnen Seitenvorschauen per Drag & Drop, um die gewünschte Reihenfolge für die neue Datei zu erstellen." + "Alle Seiten Ihrer hochgeladenen PDFs werden unten angezeigt.", + "Ziehen Sie einfach die einzelnen Seitenvorschauen per Drag & Drop, um die gewünschte Reihenfolge für die neue Datei zu erstellen." ], "mergePdfs": "PDFs zusammenführen" }, @@ -290,18 +295,18 @@ "mission": { "title": "Unsere", "titleDim": "Mission", - "description": "Die umfassendste PDF-Toolbox bereitzustellen, die deine Privatsphäre respektiert und niemals Geld kostet. Wir glauben, dass wichtige Dokumentenwerkzeuge für jede*n, überall und ohne Barrieren zugänglich sein sollten." + "description": "Die umfassendste PDF-Toolbox bereitzustellen, die Ihre Privatsphäre respektiert und niemals Geld kostet. Wir glauben, dass wichtige Dokumentenwerkzeuge für alle, überall und ohne Barrieren zugänglich sein sollten." }, "philosophy": { "label": "Unsere Kernphilosophie", "title": "Privatsphäre zuerst. Immer.", - "description": "In einer Zeit, in der Daten eine Ware sind, gehen wir einen anderen Weg. Die gesamte Verarbeitung für BentoPDF-Werkzeuge erfolgt lokal in deinem Browser. Das bedeutet, deine Dateien berühren niemals unsere Server, wir sehen deine Dokumente nie und verfolgen nicht, was du tust. Deine Dokumente bleiben voll und ganz privat, ohne Hintertürchen. Privatsphäre ist nicht nur eine Funktion; es ist unser Fundament." + "description": "In einer Zeit, in der Daten eine Ware sind, gehen wir einen anderen Weg. Die gesamte Verarbeitung für BentoPDF-Werkzeuge erfolgt lokal in Ihrem Browser. Das bedeutet, Ihre Dateien berühren niemals unsere Server, wir sehen Ihre Dokumente nie und verfolgen nicht, was Sie tun. Ihre Dokumente bleiben voll und ganz privat, ohne Hintertürchen. Privatsphäre ist nicht nur eine Funktion, sie ist unser Fundament." }, "whyBentopdf": { "title": "Warum", "speed": { "title": "Für Schnelligkeit gebaut", - "description": "Kein Warten auf Uploads oder Downloads zu einem Server. Durch die Verarbeitung von Dateien direkt in deinem Browser mit modernen Webtechnologien wie WebAssembly bieten wir unvergleichliche Geschwindigkeit für alle unsere Werkzeuge." + "description": "Kein Warten auf Uploads oder Downloads zu einem Server. Durch die Verarbeitung von Dateien direkt in Ihrem Browser mit modernen Webtechnologien wie WebAssembly bieten wir unvergleichliche Geschwindigkeit für alle unsere Werkzeuge." }, "free": { "title": "Komplett kostenlos", @@ -309,7 +314,7 @@ }, "noAccount": { "title": "Kein Konto erforderlich", - "description": "Beginne sofort mit der Nutzung eines beliebigen Werkzeugs. Wir brauchen weder deine E-Mail, noch ein Passwort oder sonstige persönliche Informationen. Deine Arbeit sollte reibungslos und anonym sein." + "description": "Beginnen Sie sofort mit der Nutzung eines beliebigen Werkzeugs. Wir brauchen weder Ihre E-Mail noch ein Passwort oder sonstige persönliche Informationen. Ihre Arbeit sollte reibungslos und anonym sein." }, "openSource": { "title": "Open-Source-Geist", @@ -318,18 +323,18 @@ }, "cta": { "title": "Bereit loszulegen?", - "description": "Schließ dich Tausenden von Benutzer*innen an, die BentoPDF für ihre tägliche Arbeit vertrauen. Erlebe den Unterschied, den Privatsphäre und Leistung machen können.", + "description": "Schließen Sie sich Tausenden von Nutzern an, die BentoPDF bei ihrer täglichen Arbeit vertrauen. Erleben Sie den Unterschied, den Privatsphäre und Leistung machen können.", "button": "Alle Werkzeuge erkunden" } }, "contact": { "title": "Kontakt aufnehmen", - "subtitle": "Wir freuen uns, von dir zu hören. Ob du eine Frage, Feedback oder einen Funktionswunsch hast, schreib uns gerne!", - "email": "Du kannst uns per E-Mail unter dieser Adresse erreichen:" + "subtitle": "Wir freuen uns, von Ihnen zu hören. Ob Sie eine Frage, Feedback oder einen Funktionswunsch haben, schreiben Sie uns gerne!", + "email": "Sie können uns per E-Mail unter dieser Adresse erreichen:" }, "licensing": { "title": "Lizenzierung für", - "subtitle": "Wähle die Lizenz, die deinen Anforderungen entspricht." + "subtitle": "Wählen Sie die Lizenz, die Ihren Anforderungen entspricht." }, "multiTool": { "uploadPdfs": "PDFs hochladen", @@ -369,7 +374,7 @@ "pleaseWait": "Bitte warten", "pagesRendering": "Seiten werden noch gerendert. Bitte warten...", "noPagesSelected": "Keine Seiten ausgewählt", - "selectOnePage": "Bitte wähle mindestens eine Seite zum Herunterladen aus.", + "selectOnePage": "Bitte wählen Sie mindestens eine Seite zum Herunterladen aus.", "noPages": "Keine Seiten", "noPagesToExport": "Keine Seiten zum Exportieren vorhanden.", "renderingTitle": "Seitenvorschau wird gerendert", diff --git a/public/locales/de/tools.json b/public/locales/de/tools.json index 001eac54..f73c0922 100644 --- a/public/locales/de/tools.json +++ b/public/locales/de/tools.json @@ -15,19 +15,34 @@ "add": "Zu Favoriten hinzufügen", "remove": "Aus Favoriten entfernen", "hintLabel": "Tipp", - "hint": "Halte ein Werkzeug gedrückt, um es zu deinen Favoriten hinzuzufügen.", + "hint": "Halten Sie ein Werkzeug gedrückt, um es zu Ihren Favoriten hinzuzufügen.", "hideHint": "Tipp ausblenden" }, "convertToPdf": "In PDF konvertieren", "pdfMultiTool": { - "name": "PDF Multi-Werkzeug", + "name": "PDF-Multitool", "subtitle": "Zusammenführen, Teilen, Organisieren, Löschen, Drehen, Leere Seiten hinzufügen, Extrahieren und Duplizieren in einer einheitlichen Oberfläche." }, "mergePdf": { "name": "PDF zusammenführen", "subtitle": "Mehrere PDFs zu einer Datei kombinieren. Lesezeichen werden beibehalten.", "retainPageLabels": "Originale Seitenbeschriftungen jeder Datei beibehalten", - "retainPageLabelsHint": "Aus (Standard): Das zusammengeführte PDF verwendet die natürliche Seitennummerierung 1–N. An: Die ursprünglichen Seitenbeschriftungen jeder Datei bleiben erhalten (kann zu doppelten Beschriftungen führen)." + "retainPageLabelsHint": "Aus (Standard): Die zusammengeführte PDF verwendet die natürliche Seitennummerierung 1–N. An: Die ursprünglichen Seitenbeschriftungen jeder Datei bleiben erhalten (kann zu doppelten Beschriftungen führen).", + "removeDuplicateFonts": "Doppelte Schriftarten entfernen", + "alert": { + "thumbnailError": "Seitenminiaturen konnten nicht dargestellt werden", + "noSelection": "Keine Dateien oder Seiten zum Zusammenführen ausgewählt.", + "mergeSuccess": "PDFs erfolgreich zusammengeführt!", + "mergeFailed": "PDFs konnten nicht zusammengeführt werden.", + "mergeError": "PDFs konnten nicht zusammengeführt werden. Bitte prüfen Sie, ob alle Dateien gültig und nicht passwortgeschützt sind.", + "workerError": "Beim Zusammenführen ist ein unerwarteter Fehler aufgetreten.", + "loadError": "Eine oder mehrere PDF-Dateien konnten nicht geladen werden" + }, + "loader": { + "renderingPreviews": "Seitenvorschauen werden erstellt...", + "merging": "PDFs werden zusammengeführt...", + "loadingDocuments": "PDF-Dokumente werden geladen..." + } }, "splitPdf": { "name": "PDF teilen", @@ -47,7 +62,7 @@ "saved": "PDF erfolgreich gespeichert! ({{size}} KB)", "failedToLoad": "Der PDF-Texteditor konnte nicht geladen werden.", "loadingFonts": "Schriftarten werden geladen...", - "fontsUnavailable": "Eine für einige Zeichen benötigte Schriftart konnte nicht heruntergeladen werden. Prüfen Sie Ihre Verbindung und versuchen Sie es erneut, sonst werden diese Zeichen im gespeicherten PDF möglicherweise nicht korrekt angezeigt.", + "fontsUnavailable": "Eine für einige Zeichen benötigte Schriftart konnte nicht heruntergeladen werden. Prüfen Sie Ihre Verbindung und versuchen Sie es erneut, sonst werden diese Zeichen in der gespeicherten PDF möglicherweise nicht korrekt angezeigt.", "howToUpload": "PDF hochladen", "howToClick": "Absatz anklicken", "howToRestyle": "Alles umgestalten", @@ -293,7 +308,7 @@ }, "scannerEffect": { "name": "Scanner-Effekt", - "subtitle": "Lassen Sie Ihr PDF wie ein gescanntes Dokument aussehen.", + "subtitle": "Lassen Sie Ihre PDF wie ein gescanntes Dokument aussehen.", "scanSettings": "Scan-Einstellungen", "colorspace": "Farbraum", "gray": "Grau", @@ -310,7 +325,7 @@ }, "adjustColors": { "name": "Farben anpassen", - "subtitle": "Helligkeit, Kontrast, Sättigung und mehr in Ihrem PDF feinabstimmen.", + "subtitle": "Helligkeit, Kontrast, Sättigung und mehr in Ihrer PDF feinabstimmen.", "colorSettings": "Farbeinstellungen", "brightness": "Helligkeit", "contrast": "Kontrast", @@ -427,9 +442,9 @@ "imageQualityExplanation": "Höhere Qualität = größere Dateigröße", "alert": { "invalidFile": "Ungültige Datei", - "invalidFileExplanation": "Bitte wähle eine PDF Datei aus.", + "invalidFileExplanation": "Bitte wählen Sie eine PDF Datei aus.", "noFile": "Keine Datei", - "noFileExplanation": "Bitte lade zuerst eine PDF-Datei hoch.", + "noFileExplanation": "Bitte laden Sie zuerst eine PDF-Datei hoch.", "conversionSuccess": "PDF erfolgreich in JPGs konvertiert!", "conversionError": "Konvertierung in JPG fehlgeschlagen. Die Datei könnte beschädigt sein." }, @@ -444,9 +459,9 @@ "imageScaleExplanation": "Höhere Skalierung = bessere Qualität, aber größere Dateigröße", "alert": { "invalidFile": "Ungültige Datei", - "invalidFileExplanation": "Bitte wähle eine PDF Datei aus.", + "invalidFileExplanation": "Bitte wählen Sie eine PDF Datei aus.", "noFile": "Keine Datei", - "noFileExplanation": "Bitte lade zuerst eine PDF-Datei hoch.", + "noFileExplanation": "Bitte laden Sie zuerst eine PDF-Datei hoch.", "conversionSuccess": "PDF erfolgreich in PNGs konvertiert!", "conversionError": "Konvertierung in PNG fehlgeschlagen. Die Datei könnte beschädigt sein." }, @@ -461,9 +476,9 @@ "imageQualityExplanation": "Höhere Qualität = größere Dateigröße", "alert": { "invalidFile": "Ungültige Datei", - "invalidFileExplanation": "Bitte wähle eine PDF Datei aus.", + "invalidFileExplanation": "Bitte wählen Sie eine PDF Datei aus.", "noFile": "Keine Datei", - "noFileExplanation": "Bitte lade zuerst eine PDF-Datei hoch.", + "noFileExplanation": "Bitte laden Sie zuerst eine PDF-Datei hoch.", "conversionSuccess": "PDF erfolgreich in WebPs konvertiert!", "conversionError": "Konvertierung in WebP fehlgeschlagen. Die Datei könnte beschädigt sein." }, @@ -476,9 +491,9 @@ "subtitle": "Jede PDF-Seite in ein BMP-Bild konvertieren.", "alert": { "invalidFile": "Ungültige Datei", - "invalidFileExplanation": "Bitte wähle eine PDF Datei aus.", + "invalidFileExplanation": "Bitte wählen Sie eine PDF Datei aus.", "noFile": "Keine Datei", - "noFileExplanation": "Bitte lade zuerst eine PDF-Datei hoch.", + "noFileExplanation": "Bitte laden Sie zuerst eine PDF-Datei hoch.", "conversionSuccess": "PDF erfolgreich in BMPs konvertiert!", "conversionError": "Konvertierung in BMP fehlgeschlagen. Die Datei könnte beschädigt sein." }, @@ -503,12 +518,13 @@ "noFile": "Keine Datei", "noFileExplanation": "Bitte laden Sie zuerst eine PDF-Datei hoch.", "conversionSuccess": "PDF erfolgreich in TIFF konvertiert!", - "conversionError": "PDF konnte nicht in TIFF konvertiert werden. Die Datei könnte beschädigt sein." + "conversionError": "PDF konnte nicht in TIFF konvertiert werden. Die Datei könnte beschädigt sein.", + "conversionOutOfMemory": "Dem Browser ist während der Konvertierung der Speicher ausgegangen. Versuchen Sie eine niedrigere DPI oder deaktivieren Sie die Option für mehrseitiges TIFF, um die Seiten einzeln zu konvertieren." } }, "pdfToCbz": { "name": "PDF zu CBZ", - "subtitle": "Konvertieren Sie ein PDF in eine CBZ-Datei (Comic-Bucharchiv) für Comic-Reader.", + "subtitle": "Konvertieren Sie eine PDF in eine CBZ-Datei (Comic-Bucharchiv) für Comic-Reader.", "imageFormat": "Bildformat", "quality": "Bildqualität", "qualityExplanation": "Höhere Qualität = größere Dateigröße", @@ -614,13 +630,13 @@ }, "alternateMerge": { "name": "Seiten abwechselnd mischen", - "subtitle": "PDFs durch abwechselnde Seiten aus jedem PDF zusammenführen. Lesezeichen werden beibehalten.", + "subtitle": "PDFs durch abwechselnde Seiten aus jeder PDF zusammenführen. Lesezeichen werden beibehalten.", "retainPageLabels": "Originale Seitenbeschriftungen jeder Datei beibehalten", - "retainPageLabelsHint": "Aus (Standard): Das zusammengeführte PDF verwendet die natürliche Seitennummerierung 1–N. An: Die ursprünglichen Seitenbeschriftungen jeder Datei bleiben erhalten (kann zu doppelten Beschriftungen führen)." + "retainPageLabelsHint": "Aus (Standard): Die zusammengeführte PDF verwendet die natürliche Seitennummerierung 1–N. An: Die ursprünglichen Seitenbeschriftungen jeder Datei bleiben erhalten (kann zu doppelten Beschriftungen führen)." }, "duplexCollate": { - "name": "Seitenfolge für Duplex-Scans neu anordnen", - "subtitle": "Ein PDF, das in zwei Blöcken gescannt wurde (erst alle Vorderseiten, dann alle Rückseiten), in die richtige Vorder-/Rückseiten-Reihenfolge bringen.", + "name": "Duplex-Zusammenführung", + "subtitle": "Eine PDF, die in zwei Blöcken gescannt wurde (erst alle Vorderseiten, dann alle Rückseiten), in die richtige Vorder-/Rückseiten-Reihenfolge bringen.", "totalPagesLabel": "Seiten gesamt:", "splitAfterPageLabel": "Teilen nach Seite", "splitAfterPagePlaceholder": "z. B. 50", @@ -641,7 +657,7 @@ "previewSummary": "Vorderseiten-Block: {{frontCount}} Seite(n), Rückseiten-Block: {{backCount}} Seite(n). Ausgabe: {{outputCount}} Seite(n) in Vorder-/Rückseiten-Reihenfolge.", "previewMismatchWarning": "Die Blocklängen von Vorder- und Rückseiten unterscheiden sich ({{frontCount}} Vorderseiten gegenüber {{backCount}} Rückseiten). Die {{extraCount}} überzähligen Seite(n) der längeren Seite werden ohne Gegenstück am Ende angehängt.", "missingFileTitle": "Fehlende Datei", - "missingFileMessage": "Bitte laden Sie vor der Verarbeitung ein PDF mit mindestens 2 Seiten hoch.", + "missingFileMessage": "Bitte laden Sie vor der Verarbeitung eine PDF mit mindestens 2 Seiten hoch.", "invalidSplitTitle": "Ungültiger Teilungspunkt", "invalidSplitMessage": "Der Teilungspunkt muss zwischen Seite 1 und Seite {{maxSplit}} liegen.", "unevenConfirmTitle": "Ungleiche Blöcke", @@ -653,7 +669,7 @@ "successGroupedMessage": "Zusammenführung abgeschlossen. {{fileCount}} gruppierte Datei(en) erstellt.", "processErrorMessage": "PDF konnte nicht zusammengeführt werden.", "howItWorksStep1Title": "Scan hochladen", - "howItWorksStep1": "Laden Sie das einzelne PDF hoch, das erst alle Vorderseiten und danach alle Rückseiten enthält.", + "howItWorksStep1": "Laden Sie die einzelne PDF hoch, das erst alle Vorderseiten und danach alle Rückseiten enthält.", "howItWorksStep2Title": "Teilungspunkt festlegen", "howItWorksStep2": "Geben Sie an, wo der Vorderseiten-Block endet, und wählen Sie, ob der Rückseiten-Block umgekehrt werden muss.", "howItWorksStep3Title": "Zusammenführen und herunterladen", @@ -1059,7 +1075,7 @@ "howToStep2Title": "Zertifikat hochladen", "howToStep2Text": "Stellen Sie Ihre .pfx- oder .p12-Zertifikatsdatei und das Passwort bereit", "howToStep3Title": "Signieren & herunterladen", - "howToStep3Text": "Wenden Sie die digitale Signatur an und laden Sie Ihr signiertes PDF herunter", + "howToStep3Text": "Wenden Sie die digitale Signatur an und laden Sie Ihre signierte PDF herunter", "relatedEncryptDesc": "PDF mit Passwort schützen", "relatedDecryptDesc": "PDF-Passwort entfernen", "relatedFlattenDesc": "Anmerkungen dauerhaft machen", @@ -1086,7 +1102,7 @@ "timestampPdf": { "name": "PDF mit Zeitstempel versehen", "pageTitle": "PDF-Zeitstempel online kostenlos - RFC 3161 Dokumentenzeitstempel | BentoPDF", - "subtitle": "Fügen Sie Ihrem PDF einen RFC 3161-Zeitstempel über einen vertrauenswürdigen Zeitstempelserver (TSA) hinzu. Beweist, dass Ihr Dokument zu einem bestimmten Zeitpunkt existierte. Kein Zertifikat erforderlich.", + "subtitle": "Fügen Sie Ihrer PDF einen RFC 3161-Zeitstempel über einen vertrauenswürdigen Zeitstempelserver (TSA) hinzu. Beweist, dass Ihr Dokument zu einem bestimmten Zeitpunkt existierte. Kein Zertifikat erforderlich.", "tsaSectionTitle": "Zeitstempelserver (TSA)", "selectTsa": "TSA-Server auswählen", "applyTimestamp": "Zeitstempel anwenden", @@ -1124,7 +1140,7 @@ }, "pdfOcg": { "name": "PDF-Ebenen (OCG)", - "subtitle": "OCG-Ebenen in Ihrem PDF anzeigen, umschalten, hinzufügen und löschen." + "subtitle": "OCG-Ebenen in Ihrer PDF anzeigen, umschalten, hinzufügen und löschen." }, "pdfToPdfa": { "name": "PDF zu PDF/A", @@ -1188,7 +1204,7 @@ "workerError": "Worker-Fehler: {{message}}", "alternateMergeWorkerError": "Fehler im alternierenden Zusammenführungs-Worker: {{message}}", "noPdfFilesUploaded": "Keine PDF-Dateien im PDF-Eingabeknoten hochgeladen", - "failedToLoadFile": "\"{{file}}\" konnte nicht geladen werden — Datei möglicherweise beschädigt", + "failedToLoadFile": "\"{{file}}\" konnte nicht geladen werden: Datei möglicherweise beschädigt", "noImagesUploaded": "Keine Bilder im Bild-Eingabeknoten hochgeladen", "noWordDocsUploaded": "Keine Dokumente im Word-Eingabeknoten hochgeladen", "noExcelUploaded": "Keine Tabellen im Excel-Eingabeknoten hochgeladen", @@ -1217,7 +1233,7 @@ "extractImagesNoneFound": "Keine Bilder in den verbundenen PDFs gefunden", "invertColorsFailedReadImage": "Bilddaten konnten nicht gelesen werden", "overlayRequiresPdf": "Der Overlay-Knoten benötigt eine Overlay-PDF-Eingabe.", - "pdfToCsvNoTables": "Keine Tabellen im PDF gefunden", + "pdfToCsvNoTables": "Keine Tabellen in der PDF gefunden", "pdfToXlsxNoTables": "Keine Tabellen in {{file}} gefunden", "posterizeFailedTileCanvas": "Kachel-Canvas-Kontext konnte nicht abgerufen werden", "redactNoText": "Schwärzen: Kein Text zum Schwärzen angegeben", @@ -1275,7 +1291,7 @@ }, "pdfOverlay": { "name": "PDF-Überlagerung", - "subtitle": "Seiten eines PDFs über oder unter die Seiten eines anderen PDFs legen.", + "subtitle": "Seiten einer PDF über oder unter die Seiten einer anderen PDF legen.", "basePdfLabel": "Basis-PDF", "uploadBasePdf": "Basis-PDF hochladen", "overlayPdfLabel": "Überlagerungs- / Unterlagerungs-PDF", @@ -1288,24 +1304,24 @@ "repeatLabel": "Überlagerungs-/Unterlagerungsseiten wiederholen, wenn Basis länger ist", "processButton": "Überlagerung / Unterlagerung anwenden", "howItWorksUploadTitle": "Zwei PDFs hochladen", - "howItWorksUploadDescription": "Laden Sie Ihr Basis-PDF und das PDF hoch, das Sie überlagern oder unterlagern möchten.", + "howItWorksUploadDescription": "Laden Sie Ihr Basis-PDF und die PDF hoch, das Sie überlagern oder unterlagern möchten.", "howItWorksModeTitle": "Modus wählen", "howItWorksModeDescription": "Wählen Sie Überlagerung (darüber) oder Unterlagerung (dahinter). Optional Seitenbereich und Wiederholung festlegen.", "howItWorksDownloadTitle": "Herunterladen", - "howItWorksDownloadDescription": "Laden Sie Ihr PDF mit angewandter Überlagerung oder Unterlagerung herunter.", + "howItWorksDownloadDescription": "Laden Sie Ihre PDF mit angewandter Überlagerung oder Unterlagerung herunter.", "faqDifferenceQuestion": "Was ist der Unterschied zwischen Überlagerung und Unterlagerung?", "faqDifferenceAnswer": "Überlagerung platziert Seiten über Ihr Basis-PDF (wie ein Wasserzeichen). Unterlagerung platziert Seiten hinter Ihr Basis-PDF (wie ein Briefkopf oder Hintergrund).", - "faqSinglePageQuestion": "Kann ich ein einseitiges PDF als Überlagerung für alle Seiten verwenden?", + "faqSinglePageQuestion": "Kann ich eine einseitige PDF als Überlagerung für alle Seiten verwenden?", "faqSinglePageAnswer": "Ja! Aktivieren Sie die Option \"Wiederholen\" und Ihre Überlagerungsseiten werden auf allen Basisseiten wiederholt. Ein einseitiges Wasserzeichen wird auf jeder Seite angewendet.", "faqPrivacyQuestion": "Sind meine Dateien privat und sicher?", "faqPrivacyAnswer": "Absolut! Die gesamte Verarbeitung findet in Ihrem Browser statt. Ihre Dateien verlassen niemals Ihr Gerät, was vollständige Privatsphäre gewährleistet." }, "unlockPdf": { - "name": "PDF entschlüsseln", + "name": "PDF entsperren", "subtitle": "PDF durch Entfernen des Passwortschutzes entsperren." }, "protectPdf": { - "name": "PDF verschlüsseln", + "name": "PDF schützen", "subtitle": "Ihre PDF durch Hinzufügen eines Passworts sperren." } } diff --git a/public/locales/de/ui.json b/public/locales/de/ui.json new file mode 100644 index 00000000..114d5b17 --- /dev/null +++ b/public/locales/de/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(korrigiert)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} weitere...", + "- Error parsing XMP XML. Displaying raw. -": "- Fehler beim Parsen von XMP-XML. Rohdaten werden angezeigt. -", + "- No Info Dictionary data found -": "- Keine Info-Dictionary-Daten gefunden -", + "- No XMP metadata found -": "- Keine XMP-Metadaten gefunden -", + "- No interactive form fields found -": "- Keine interaktiven Formularfelder gefunden -", + "- No parseable XMP properties found -": "- Keine auslesbaren XMP-Eigenschaften gefunden -", + "-- Select existing group --": "-- Bestehende Gruppe auswählen --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (sehr empfindlich)", + "0.5° (Default)": "0,5° (Standard)", + "1.0° (Normal)": "1,0° (normal)", + "100 (Fast)": "100 (schnell)", + "150 (Default)": "150 (Standard)", + "1x2 (Booklet)": "1x2 (Broschüre)", + "2.0° (Less Sensitive)": "2,0° (weniger empfindlich)", + "200 (Better)": "200 (besser)", + "200 (Good)": "200 (gut)", + "2x2 (4-up)": "2x2 (4-up)", + "2x4 (8-up)": "2x4 (8-up)", + "300 (Best Quality)": "300 (beste Qualität)", + "300 (Print)": "300 (Druck)", + "4x4 (16-up)": "4x4 (16-up)", + "600 (High Quality)": "600 (hohe Qualität)", + "72 (Screen)": "72 (Bildschirm)", + "90° Clockwise": "90° im Uhrzeigersinn", + "90° Counter-clockwise": "90° gegen den Uhrzeigersinn", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Ein Feld mit dem Namen \"{{fieldName}}\" existiert bereits. Bitte benennen Sie dieses Feld vor dem Herunterladen eindeutig um.", + "A new version of BentoPDF is available. Reload to update?": "Eine neue Version von BentoPDF ist verfügbar. Neu laden, um zu aktualisieren?", + "A single PDF file": "Eine einzelne PDF-Datei", + "A template with this name already exists.": "Eine Vorlage mit diesem Namen existiert bereits.", + "ASCII characters (letters, numbers, symbols)": "ASCII-Zeichen (Buchstaben, Zahlen, Symbole)", + "Action": "Aktion", + "Add Blank Page": "Leere Seite hinzufügen", + "Add Bookmark": "Lesezeichen hinzufügen", + "Add Child Bookmark": "Unterlesezeichen hinzufügen", + "Add Child Layer": "Unterebene hinzufügen", + "Add More Comics": "Weitere Comics hinzufügen", + "Add More Documents": "Weitere Dokumente hinzufügen", + "Add More EPUB Files": "Weitere EPUB-Dateien hinzufügen", + "Add More Email Files": "Weitere E-Mail-Dateien hinzufügen", + "Add More FB2 Files": "Weitere FB2-Dateien hinzufügen", + "Add More Files": "Weitere Dateien hinzufügen", + "Add More Images": "Weitere Bilder hinzufügen", + "Add More JSON Files": "Weitere JSON-Dateien hinzufügen", + "Add More MOBI Files": "Weitere MOBI-Dateien hinzufügen", + "Add More Markdown Files": "Weitere Markdown-Dateien hinzufügen", + "Add More ODG Files": "Weitere ODG-Dateien hinzufügen", + "Add More PUB Files": "Weitere PUB-Dateien hinzufügen", + "Add More Pages Files": "Weitere Pages-Dateien hinzufügen", + "Add More Presentations": "Weitere Präsentationen hinzufügen", + "Add More SVG Files": "Weitere SVG-Dateien hinzufügen", + "Add More Spreadsheets": "Weitere Tabellen hinzufügen", + "Add More Text Files": "Weitere Textdateien hinzufügen", + "Add More Visio Files": "Weitere Visio-Dateien hinzufügen", + "Add More WPD Files": "Weitere WPD-Dateien hinzufügen", + "Add More WPS Files": "Weitere WPS-Dateien hinzufügen", + "Add More XML Files": "Weitere XML-Dateien hinzufügen", + "Add More XPS Files": "Weitere XPS-Dateien hinzufügen", + "Add a new layer to get started!": "Fügen Sie eine neue Ebene hinzu, um loszulegen!", + "Add a text box": "Textfeld hinzufügen", + "Add an RFC 3161 document timestamp": "Einen RFC-3161-Dokumentzeitstempel hinzufügen", + "Add an image": "Bild hinzufügen", + "Add at least one node to run the workflow.": "Fügen Sie mindestens einen Knoten hinzu, um den Workflow auszuführen.", + "Add child": "Unterelement hinzufügen", + "Add child layer": "Unterebene hinzufügen", + "Add header and footer text": "Kopf- und Fußzeilentext hinzufügen", + "Add page numbers": "Seitenzahlen hinzufügen", + "Add searchable text layer via OCR": "Durchsuchbare Textebene per OCR hinzufügen", + "Add text watermark": "Text-Wasserzeichen hinzufügen", + "Add/Edit/Extract Attachments": "Anhänge hinzufügen/bearbeiten/extrahieren", + "Added": "Hinzugefügt", + "Added \"{{afterText}}\"": "\"{{afterText}}\" hinzugefügt", + "Added image ({{width}}×{{height}})": "Bild hinzugefügt ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} leere Seite erfolgreich hinzugefügt!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} leere Seiten erfolgreich hinzugefügt!", + "Adding header & footer...": "Kopf- und Fußzeile werden hinzugefügt...", + "Adding page numbers...": "Seitenzahlen werden hinzugefügt...", + "Adding watermark...": "Wasserzeichen wird hinzugefügt...", + "Adding {{insertCount}} blank page...": "{{insertCount}} leere Seite wird hinzugefügt...", + "Adding {{insertCount}} blank pages...": "{{insertCount}} leere Seiten werden hinzugefügt...", + "Adding {{name}} ({{n}}/{{length}})...": "{{name}} wird hinzugefügt ({{n}}/{{length}})...", + "Adjust Colors": "Farben anpassen", + "Adjust brightness, contrast, and colors": "Helligkeit, Kontrast und Farben anpassen", + "Advanced": "Erweitert", + "Advanced Feature Required": "Erweiterte Funktion erforderlich", + "Advanced Settings": "Erweiterte Einstellungen", + "After Page": "Nach Seite", + "After Page...": "Nach Seite...", + "Align Objects": "Objekte ausrichten", + "Alignment": "Ausrichtung", + "All": "Alle", + "All files repaired successfully!": "Alle Dateien erfolgreich repariert!", + "Alternate Merge": "Abwechselnd zusammenführen", + "Alternating and mixing pages...": "Seiten werden abwechselnd gemischt...", + "Always resample to that resolution": "Immer auf diese Auflösung neu berechnen", + "An error occurred during compression. Error: {{error}}": "Bei der Komprimierung ist ein Fehler aufgetreten. Fehler: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Bei der Konvertierung ist ein Fehler aufgetreten. Fehler: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Bei der Konvertierung ist ein Fehler aufgetreten. Fehler: {{message}}", + "An error occurred during cropping.": "Beim Zuschneiden ist ein Fehler aufgetreten.", + "An error occurred during extraction. Error: {{error}}": "Beim Extrahieren ist ein Fehler aufgetreten. Fehler: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Beim Rastern ist ein Fehler aufgetreten. Fehler: {{error}}", + "An error occurred during sanitization: {{msg}}": "Bei der Bereinigung ist ein Fehler aufgetreten: {{msg}}", + "An error occurred while combining pages.": "Beim Kombinieren der Seiten ist ein Fehler aufgetreten.", + "An error occurred while creating the N-Up PDF.": "Beim Erstellen des N-Up-PDFs ist ein Fehler aufgetreten.", + "An error occurred while creating the booklet.": "Beim Erstellen der Broschüre ist ein Fehler aufgetreten.", + "An error occurred while dividing the PDF.": "Beim Teilen der PDF ist ein Fehler aufgetreten.", + "An error occurred while mixing the PDFs.": "Beim Mischen der PDFs ist ein Fehler aufgetreten.", + "An error occurred while standardizing pages.": "Beim Vereinheitlichen der Seiten ist ein Fehler aufgetreten.", + "An error occurred while trying to remove metadata.": "Beim Entfernen der Metadaten ist ein Fehler aufgetreten.", + "An error occurred: {{error}}": "Ein Fehler ist aufgetreten: {{error}}", + "An error occurred: {{error}}.": "Ein Fehler ist aufgetreten: {{error}}.", + "An owner password is required when setting permissions": "Beim Festlegen von Berechtigungen ist ein Besitzerpasswort erforderlich", + "An unexpected error occurred during the repair process.": "Bei der Reparatur ist ein unerwarteter Fehler aufgetreten.", + "An unexpected error occurred.": "Ein unerwarteter Fehler ist aufgetreten.", + "Analyzing data structure...": "Datenstruktur wird analysiert...", + "Analyzing full PDF metadata...": "Vollständige PDF-Metadaten werden analysiert...", + "Analyzing signatures...": "Signaturen werden analysiert...", + "Angle": "Winkel", + "Annotations removed successfully!": "Annotationen erfolgreich entfernt!", + "Any text, URL, or data": "Beliebiger Text, URL oder beliebige Daten", + "Application": "Anwendung", + "Apply a digital signature to PDF": "Eine digitale Signatur auf die PDF anwenden", + "Apply and download": "Anwenden und herunterladen", + "Apply redactions?": "Schwärzungen anwenden?", + "Apply scanner simulation effect": "Scanner-Simulationseffekt anwenden", + "Applying Bates numbers...": "Bates-Nummern werden angewendet...", + "Applying color adjustments...": "Farbanpassungen werden angewendet...", + "Applying crop...": "Zuschnitt wird angewendet...", + "Applying redactions...": "Schwärzungen werden angewendet...", + "Applying rotations...": "Drehungen werden angewendet...", + "Applying scanner effect...": "Scanner-Effekt wird angewendet...", + "Applying timestamp...": "Zeitstempel wird angewendet...", + "Applying {{replace}}...": "{{replace}} wird angewendet...", + "Archive contains an oversized image entry.": "Das Archiv enthält ein zu großes Bild.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Das Archiv enthält zu viele Bilder (max. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Das Archiv ist entpackt zu groß.", + "Are you sure you want to reset? All your work will be lost.": "Möchten Sie wirklich zurücksetzen? Ihre gesamte Arbeit geht verloren.", + "Area (Coordinates)": "Fläche (Koordinaten)", + "Area ({{unit}}²)": "Fläche ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman und Courier New werden den integrierten Entsprechungen zugeordnet. Wird nur angewendet, wenn es sicher ist.", + "Arrange multiple pages per sheet": "Mehrere Seiten pro Blatt anordnen", + "Arrange pages for booklet printing": "Seiten für den Broschürendruck anordnen", + "Aspect Ratio": "Seitenverhältnis", + "At least one PDF document is required for export.": "Für den Export ist mindestens ein PDF-Dokument erforderlich.", + "At least two valid PDFs are required.": "Es sind mindestens zwei gültige PDFs erforderlich.", + "Attaching files to PDF...": "Dateien werden an die PDF angehängt...", + "Attachments updated successfully!": "Anhänge erfolgreich aktualisiert!", + "Author": "Autor", + "Auto (Keep Original)": "Automatisch (Original beibehalten)", + "Back": "Rückseite", + "Back to Home": "Zurück zur Startseite", + "Background Color": "Hintergrundfarbe", + "Background color changed successfully!": "Hintergrundfarbe erfolgreich geändert!", + "Barcode": "Barcode", + "Barcode Format": "Barcode-Format", + "Barcode Value": "Barcode-Wert", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Bates-Nummern erfolgreich angewendet! ({{batesStart}} bis {{n}})", + "Beginning": "Anfang", + "Binarize": "Binarisieren", + "Blank Position": "Position der Leerseite", + "Blue": "Blau", + "Blur": "Weichzeichnen", + "Bold": "Fett", + "Bold & Italic": "Fett & Kursiv", + "Booklet": "Broschüre", + "Booklet created with {{numSheets}} sheets!": "Broschüre mit {{numSheets}} Blättern erstellt!", + "Bookmarks imported from JSON!": "Lesezeichen aus JSON importiert!", + "Bookmarks page": "Lesezeichen-Seite", + "Border": "Rahmen", + "Border Color": "Rahmenfarbe", + "Bottom": "Unten", + "Bottom Center": "Unten Mitte", + "Bottom Left": "Unten links", + "Bottom Right": "Unten rechts", + "Bottom edge in points": "Unterer Rand in Punkten", + "Brightness": "Helligkeit", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli und Rastern wurden übersprungen, damit es PDF/A bleibt.", + "Brotli compression (PDF 2.0)": "Brotli-Komprimierung (PDF 2.0)", + "Browser Note:": "Browser-Hinweis:", + "Building new PDF...": "Neues PDF wird erstellt...", + "Building page pairing model...": "Modell für die Seitenzuordnung wird erstellt...", + "Button": "Schaltfläche", + "ByteRange does not start at the beginning of the file": "ByteRange beginnt nicht am Anfang der Datei", + "ByteRange out of bounds": "ByteRange außerhalb der Grenzen", + "CBZ to PDF": "CBZ zu PDF", + "CSV Loaded": "CSV geladen", + "CSV file is empty": "Die CSV-Datei ist leer", + "Cancel": "Abbrechen", + "Cannot Delete": "Löschen nicht möglich", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Auf die Steuerelemente des Viewers kann nicht zugegriffen werden. Nutzen Sie die Schaltfläche \"Herunterladen\" in der PDF-Viewer-Symbolleiste oben.", + "Cannot delete all pages": "Es können nicht alle Seiten gelöscht werden", + "Cannot delete all pages.": "Es können nicht alle Seiten gelöscht werden.", + "Canvas context failed": "Canvas-Kontext fehlgeschlagen", + "Canvas context unavailable": "Canvas-Kontext nicht verfügbar", + "Canvas toBlob conversion failed.": "Canvas-toBlob-Konvertierung fehlgeschlagen.", + "Canvas toBlob failed": "Canvas-toBlob fehlgeschlagen", + "Center": "Zentriert", + "Certificate (.pfx, .p12, .pem)": "Zertifikat (.pfx, .p12, .pem)", + "Certificate Expired": "Zertifikat abgelaufen", + "Certificate Password": "Zertifikatspasswort", + "Certificate unlocked": "Zertifikat entsperrt", + "Change Certificate": "Zertifikat ändern", + "Change background color": "Hintergrundfarbe ändern", + "Changing background color...": "Hintergrundfarbe wird geändert...", + "Changing text color...": "Textfarbe wird geändert...", + "Character": "Zeichen", + "Checked State": "Aktivierter Zustand", + "Choose a valid page range.": "Wählen Sie einen gültigen Seitenbereich.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Wählen Sie eine der mitgelieferten Sprachen oder erstellen Sie das Air-Gap-Bundle neu und fügen Sie die fehlende Sprache zu --ocr-languages hinzu.", + "Cleanup": "Bereinigung", + "Click on PDF to Pick Location": "Klicken Sie auf die PDF, um die Position zu wählen", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Klicken Sie auf die Schaltfläche oben und dann auf die Stelle in der PDF, zu der das Lesezeichen springen soll", + "Click to Upload Image": "Zum Hochladen eines Bildes klicken", + "Clicking this field in the PDF will open a file picker to upload an image.": "Ein Klick auf dieses Feld in der PDF öffnet eine Dateiauswahl zum Hochladen eines Bildes.", + "Clip invisible parts of images": "Unsichtbare Teile von Bildern abschneiden", + "Close": "Schließen", + "Close (Esc)": "Schließen (Esc)", + "Close panel": "Bereich schließen", + "Closes tab": "Schließt den Tab", + "Closes window": "Schließt das Fenster", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (Lesezeichen & Metadaten)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF ist nicht konfiguriert. Konfigurieren Sie es in den WASM-Einstellungen.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF hat eine leere entschlüsselte Datei erzeugt.", + "CoherentPDF: not configured.": "CoherentPDF: nicht konfiguriert.", + "Color": "Farbe", + "Color adjustments applied successfully!": "Farbanpassungen erfolgreich angewendet!", + "Colors inverted successfully!": "Farben erfolgreich invertiert!", + "Cols": "Spalten", + "Combine multiple PDFs into one": "Mehrere PDFs zu einem kombinieren", + "Combine to Single Page": "Zu einer Seite kombinieren", + "Combining pages...": "Seiten werden kombiniert...", + "Comic Archives": "Comic-Archive", + "Comments and markup become part of the page. Form fields and links keep working.": "Kommentare und Markierungen werden Teil der Seite. Formularfelder und Links funktionieren weiterhin.", + "Complete": "Abgeschlossen", + "Complete!": "Fertig!", + "Compress": "Komprimieren", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF(s) komprimiert. Gesamtgröße von {{totalOriginalSize}} auf {{totalCompressedSize}} reduziert ({{value}}% gespart).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF(s) komprimiert. Gesamtgröße: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Mehrere PDFs werden komprimiert...", + "Compressing to {{size}}...": "Komprimierung auf {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Komprimierung {{n}}/{{length}}: {{name}}...", + "Compressing...": "Wird komprimiert...", + "Compression Complete": "Komprimierung abgeschlossen", + "Compression Finished": "Komprimierung beendet", + "Compression Level": "Komprimierungsstufe", + "Configure": "Konfigurieren", + "Confirm": "Bestätigen", + "Confirm Action": "Aktion bestätigen", + "Conformance": "Konformität", + "Connected": "Verbunden", + "Contact Info": "Kontaktinformationen", + "Content": "Inhalt", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Der Inhalts-Hash stimmt nicht mit dem Attribut messageDigest überein: Die PDF wurde nach dem Signieren verändert", + "Contrast": "Kontrast", + "Conversion Complete": "Konvertierung abgeschlossen", + "Conversion Error": "Konvertierungsfehler", + "Conversion engine ready!": "Konvertierungs-Engine bereit!", + "Conversion failed: could not create PDF/A definition": "Konvertierung fehlgeschlagen: PDF/A-Definition konnte nicht erstellt werden", + "Convert Apple Pages documents to PDF": "Apple-Pages-Dokumente in PDF konvertieren", + "Convert EPUB ebooks to PDF": "EPUB-E-Books in PDF konvertieren", + "Convert Excel spreadsheets to PDF": "Excel-Tabellen in PDF konvertieren", + "Convert FB2 e-books to PDF": "FB2-E-Books in PDF konvertieren", + "Convert JSON files to PDF": "JSON-Dateien in PDF konvertieren", + "Convert MOBI e-books to PDF": "MOBI-E-Books in PDF konvertieren", + "Convert Markdown files to PDF": "Markdown-Dateien in PDF konvertieren", + "Convert Microsoft Publisher to PDF": "Microsoft Publisher in PDF konvertieren", + "Convert OpenDocument Graphics to PDF": "OpenDocument-Grafiken in PDF konvertieren", + "Convert PDF pages to SVG": "PDF-Seiten in SVG konvertieren", + "Convert PDF pages to images (ZIP)": "PDF-Seiten in Bilder konvertieren (ZIP)", + "Convert PDF tables to CSV": "PDF-Tabellen in CSV konvertieren", + "Convert PDF tables to Excel": "PDF-Tabellen in Excel konvertieren", + "Convert PDF to Markdown text": "PDF in Markdown-Text konvertieren", + "Convert PDF to PDF/A for archiving": "PDF zur Archivierung in PDF/A konvertieren", + "Convert PDF to Word document": "PDF in ein Word-Dokument konvertieren", + "Convert PowerPoint presentations to PDF": "PowerPoint-Präsentationen in PDF konvertieren", + "Convert SVG files to PDF": "SVG-Dateien in PDF konvertieren", + "Convert To Grayscale": "In Graustufen umwandeln", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Visio-Diagramme (VSD/VSDX) in PDF konvertieren", + "Convert WPS Office documents to PDF": "WPS-Office-Dokumente in PDF konvertieren", + "Convert Word documents to PDF": "Word-Dokumente in PDF konvertieren", + "Convert WordPerfect documents to PDF": "WordPerfect-Dokumente in PDF konvertieren", + "Convert XML documents to PDF": "XML-Dokumente in PDF konvertieren", + "Convert XPS/OXPS documents to PDF": "XPS/OXPS-Dokumente in PDF konvertieren", + "Convert comic book archives (CBZ/CBR) to PDF": "Comic-Archive (CBZ/CBR) in PDF konvertieren", + "Convert email files (.eml, .msg) to PDF": "E-Mail-Dateien (.eml, .msg) in PDF konvertieren", + "Convert fonts to vector outlines": "Schriften in Vektorumrisse umwandeln", + "Convert plain text to PDF": "Reinen Text in PDF konvertieren", + "Convert to grayscale": "In Graustufen umwandeln", + "Convert to greyscale": "In Graustufen umwandeln", + "Convert to image-based PDF": "In bildbasiertes PDF umwandeln", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} Dateien ({{totalPages}} Seiten) in SVG konvertiert!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} Seiten in SVG konvertiert!", + "Converter not initialized": "Konverter nicht initialisiert", + "Converting BMP to PDF...": "BMP wird in PDF konvertiert...", + "Converting HEIC to PDF...": "HEIC wird in PDF konvertiert...", + "Converting TIFF to PDF...": "TIFF wird in PDF konvertiert...", + "Converting emails...": "E-Mails werden konvertiert...", + "Converting files...": "Dateien werden konvertiert...", + "Converting fonts to outlines...": "Schriften werden in Umrisse umgewandelt...", + "Converting images to PDF...": "Bilder werden in PDF konvertiert...", + "Converting multiple PDFs to PDF/A...": "Mehrere PDFs werden in PDF/A konvertiert...", + "Converting multiple RTF files to PDF...": "Mehrere RTF-Dateien werden in PDF konvertiert...", + "Converting multiple files...": "Mehrere Dateien werden konvertiert...", + "Converting page {{n}} of {{pageCount}}...": "Seite {{n}} von {{pageCount}} wird konvertiert...", + "Converting to Markdown...": "Wird in Markdown konvertiert...", + "Converting to SVG...": "Wird in SVG konvertiert...", + "Converting to greyscale...": "Wird in Graustufen umgewandelt...", + "Converting to {{level}}...": "Wird in {{level}} konvertiert...", + "Converting {{name}}...": "{{name}} wird konvertiert...", + "Converting {{n}}/{{length}}: {{name}}...": "Konvertierung {{n}}/{{length}}: {{name}}...", + "Converting...": "Wird konvertiert...", + "Copied": "Kopiert", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Auf den Exporter für gestempelte PDFs konnte nicht zugegriffen werden. Nutzen Sie stattdessen die Schaltfläche Exportieren → PDF in der Viewer-Symbolleiste.", + "Could not add blank page.": "Die leere Seite konnte nicht hinzugefügt werden.", + "Could not add blank pages.": "Die leeren Seiten konnten nicht hinzugefügt werden.", + "Could not add header or footer.": "Kopf- oder Fußzeile konnte nicht hinzugefügt werden.", + "Could not add page numbers.": "Seitenzahlen konnten nicht hinzugefügt werden.", + "Could not add the watermark.": "Das Wasserzeichen konnte nicht hinzugefügt werden.", + "Could not apply rotations.": "Drehungen konnten nicht angewendet werden.", + "Could not change text color.": "Textfarbe konnte nicht geändert werden.", + "Could not change the background color.": "Hintergrundfarbe konnte nicht geändert werden.", + "Could not create ZIP archive.": "ZIP-Archiv konnte nicht erstellt werden.", + "Could not create canvas context.": "Canvas-Kontext konnte nicht erstellt werden.", + "Could not create comparison canvas context.": "Vergleichs-Canvas-Kontext konnte nicht erstellt werden.", + "Could not create offscreen comparison canvas.": "Offscreen-Vergleichs-Canvas konnte nicht erstellt werden.", + "Could not create visual diff context.": "Visueller Diff-Kontext konnte nicht erstellt werden.", + "Could not create visual diff overlay context.": "Kontext der visuellen Diff-Überlagerung konnte nicht erstellt werden.", + "Could not detect blank pages.": "Leere Seiten konnten nicht erkannt werden.", + "Could not display the page.": "Die Seite konnte nicht angezeigt werden.", + "Could not export comparison PDF.": "Vergleichs-PDF konnte nicht exportiert werden.", + "Could not export the signed PDF. Please try again.": "Die signierte PDF konnte nicht exportiert werden. Bitte versuche es erneut.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Die gestempelte PDF konnte nicht exportiert werden. Nutzen Sie stattdessen die Schaltfläche Exportieren → PDF in der Viewer-Symbolleiste.", + "Could not extract signer public key": "Öffentlicher Schlüssel des Unterzeichners konnte nicht extrahiert werden", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "{{testFile}} konnte unter der angegebenen URL nicht gefunden werden (HTTP {{status}}). Stellen Sie sicher, dass die Datei existiert.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Die PDF konnte nicht vollständig analysiert werden. Sie ist möglicherweise beschädigt oder hat eine ungewöhnliche Struktur.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Es konnte keine Vorschau erstellt werden. Die Datei ist möglicherweise beschädigt oder enthält nicht unterstützte Funktionen. Fehler: {{message}}", + "Could not get canvas context": "Canvas-Kontext konnte nicht abgerufen werden", + "Could not invert PDF colors.": "Die PDF-Farben konnten nicht invertiert werden.", + "Could not load PDF. It may be corrupt or password-protected.": "Die PDF konnte nicht geladen werden. Sie ist möglicherweise beschädigt oder passwortgeschützt.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Die PDF konnte nicht geladen werden. Die Datei ist möglicherweise ungültig, beschädigt oder passwortgeschützt.", + "Could not load the PDF engine. Please refresh the page and try again.": "Die PDF-Engine konnte nicht geladen werden. Laden Sie die Seite neu und versuchen Sie es erneut.", + "Could not parse signer info": "Unterzeichnerinformationen konnten nicht geparst werden", + "Could not posterize the PDF.": "Die PDF konnte nicht posterisiert werden.", + "Could not process \"{{name}}\". The file may be corrupted.": "\"{{name}}\" konnte nicht verarbeitet werden. Die Datei ist möglicherweise beschädigt.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Die Dateigröße konnte nicht weiter reduziert werden. Original: {{originalSize}}, neu: {{compressedSize}}.", + "Could not remove annotations.": "Annotationen konnten nicht entfernt werden.", + "Could not remove blank pages.": "Leere Seiten konnten nicht entfernt werden.", + "Could not remove leftover data from the PDF.": "Übrig gebliebene Daten konnten nicht aus der PDF entfernt werden.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Der geschwärzte Text konnte nicht aus den Dokumentdaten entfernt werden, deshalb wurde die Datei nicht heruntergeladen.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Die PDF-Seiten konnten nicht umgekehrt werden. Bitte prüfen Sie, ob Ihre Dateien gültige PDFs sind.", + "Could not update metadata. Please check that date formats are correct.": "Metadaten konnten nicht aktualisiert werden. Prüfen Sie, ob die Datumsformate korrekt sind.", + "Count": "Anzahl", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Erstellt", + "Creating Booklet...": "Broschüre wird erstellt...", + "Creating Excel file...": "Excel-Datei wird erstellt...", + "Creating N-Up PDF...": "N-Up-PDF wird erstellt...", + "Creating PDF from JPGs...": "PDF wird aus JPGs erstellt...", + "Creating PDF from SVG files...": "PDF wird aus SVG-Dateien erstellt...", + "Creating PDF...": "PDF wird erstellt...", + "Creating ZIP archive...": "ZIP-Archiv wird erstellt...", + "Creating ZIP file...": "ZIP-Datei wird erstellt...", + "Creating ZIP...": "ZIP wird erstellt...", + "Creating table...": "Tabelle wird erstellt...", + "Creator": "Ersteller", + "Crop": "Zuschneiden", + "Crop complete! Your download has started.": "Zuschnitt abgeschlossen! Ihr Download hat begonnen.", + "Cryptographic verification failed": "Kryptografische Überprüfung fehlgeschlagen", + "Custom": "Benutzerdefiniert", + "Custom Format": "Benutzerdefiniertes Format", + "Custom Height": "Benutzerdefinierte Höhe", + "Custom Units": "Benutzerdefinierte Einheiten", + "Custom Width": "Benutzerdefinierte Breite", + "Custom Zoom": "Benutzerdefinierter Zoom", + "Custom...": "Benutzerdefiniert...", + "DataMatrix": "DataMatrix", + "Date Format": "Datumsformat", + "Decrease size": "Verkleinern", + "Decrypt": "Entschlüsseln", + "Decrypting PDF...": "PDF wird entschlüsselt...", + "Decrypting {{name}} ({{n}}/{{length}})...": "{{name}} wird entschlüsselt ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Entschlüssele {{n}} von {{length}}: {{name}}", + "Decrypting...": "Wird entschlüsselt...", + "Decryption Failed": "Entschlüsselung fehlgeschlagen", + "Delete": "Löschen", + "Delete \"{{title}}\"?": "\"{{title}}\" löschen?", + "Delete Field": "Feld löschen", + "Delete Page": "Seite löschen", + "Delete Pages": "Seiten löschen", + "Delete all {{length}} bookmark(s) ? ": "Alle {{length}} Lesezeichen löschen? ", + "Delete layer": "Ebene löschen", + "Delete {{size}} bookmark(s) ? ": "{{size}} Lesezeichen löschen? ", + "Deleted": "Gelöscht", + "Deleted {{size}} page(s) successfully!": "{{size}} Seite(n) erfolgreich gelöscht!", + "Deleting pages...": "Seiten werden gelöscht...", + "Description": "Beschreibung", + "Description for screen readers": "Beschreibung für Screenreader", + "Deselect All": "Auswahl aufheben", + "Deskew": "Entzerren", + "Deskew PDF": "PDF entzerren", + "Deskewed {{length}} file(s). {{value}}": "{{length}} Datei(en) entzerrt. {{value}}", + "Deskewing {{name}}...": "{{name}} wird entzerrt...", + "Destination": "Ziel", + "Detecting blank pages...": "Leere Seiten werden erkannt...", + "Digest Algorithm:": "Digest-Algorithmus:", + "Digital Sign": "Digital signieren", + "Direction": "Richtung", + "Divide Pages": "Seiten teilen", + "Divide into boxes (0 to disable)": "In Felder aufteilen (0 zum Deaktivieren)", + "Document Properties": "Dokumenteigenschaften", + "Document Type": "Dokumenttyp", + "Document properties": "Dokumenteigenschaften", + "Document-level attachment": "Anhang auf Dokumentebene", + "Done: back to tools": "Fertig, zurück zu den Werkzeugen", + "Download": "Herunterladen", + "Download Edited PDF": "Bearbeitetes PDF herunterladen", + "Download anyway": "Trotzdem herunterladen", + "Download as PDF or ZIP automatically": "Automatisch als PDF oder ZIP herunterladen", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} PDF-Dateien als ZIP-Archiv heruntergeladen.", + "Downloads started for all files.": "Downloads für alle Dateien gestartet.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Entfernt die Tags, auf die Screenreader angewiesen sind.", + "Duplicate Field Name": "Doppelter Feldname", + "Duplicate Field Names": "Doppelte Feldnamen", + "Duplicate Page": "Seite duplizieren", + "Duplicate Page Numbers": "Doppelte Seitenzahlen", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Die ECDSA-Signatur stimmt nicht mit dem öffentlichen Schlüssel des Unterzeichners überein", + "EPUB Files": "EPUB-Dateien", + "EPUB to PDF": "EPUB zu PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ zu PDF", + "Edit": "Bearbeiten", + "Edit All": "Alle bearbeiten", + "Edit Bookmark": "Lesezeichen bearbeiten", + "Edit Bookmarks": "Lesezeichen bearbeiten", + "Edit Images": "Bilder bearbeiten", + "Edit Metadata": "Metadaten bearbeiten", + "Edit PDF metadata": "PDF-Metadaten bearbeiten", + "Edit Scope": "Bearbeitungsbereich", + "Edit Shapes": "Formen bearbeiten", + "Edit Text": "Text bearbeiten", + "Edit tool": "Bearbeitungswerkzeug", + "Edit {{scopes}}": "{{scopes}} bearbeiten", + "Email Files": "E-Mail-Dateien", + "Email to PDF": "E-Mail zu PDF", + "Embedding files into PDF...": "Dateien werden in die PDF eingebettet...", + "Empty signature bytes": "Leere Signatur-Bytes", + "Encrypt": "Verschlüsseln", + "Encrypt PDF with password": "PDF mit Passwort verschlüsseln", + "Encrypted file": "Verschlüsselte Datei", + "Encrypting PDF with 256-bit AES...": "PDF wird mit 256-Bit-AES verschlüsselt...", + "Encryption Failed": "Verschlüsselung fehlgeschlagen", + "Encryption resulted in an empty file.": "Die Verschlüsselung hat eine leere Datei ergeben.", + "End": "Ende", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Geben Sie 0 ein, um am Anfang einzufügen, oder {{pageCount}}, um am Ende einzufügen.", + "Enter bookmark title": "Lesezeichentitel eingeben", + "Enter name for child layer under \"{{Layer}}\":": "Geben Sie einen Namen für die Unterebene unter \"{{Layer}}\" ein:", + "Enter password": "Passwort eingeben", + "Enter password...": "Passwort eingeben...", + "Enter passwords for each encrypted file": "Geben Sie die Passwörter für jede verschlüsselte Datei ein", + "Error": "Fehler", + "Error during execution": "Fehler bei der Ausführung", + "Error generating PDF: {{error}}": "Fehler beim Erstellen der PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Fehler beim Laden der PDF-Datei. Versuchen Sie es erneut mit einer gültigen PDF.", + "Error reading files: {{error}}": "Fehler beim Lesen der Dateien: {{error}}", + "Error saving PDF. Check console for details.": "Fehler beim Speichern der PDF. Details finden Sie in der Konsole.", + "Error: {{error}}": "Fehler: {{error}}", + "Exactly 11 or 12 digits": "Genau 11 oder 12 Ziffern", + "Exactly 12 or 13 digits": "Genau 12 oder 13 Ziffern", + "Example of current format:": "Beispiel für das aktuelle Format:", + "Excel to PDF": "Excel zu PDF", + "Existing Radio Groups": "Vorhandene Optionsgruppen", + "Export Error": "Exportfehler", + "Export Value": "Exportwert", + "Export failed": "Export fehlgeschlagen", + "External processing module needed": "Externes Verarbeitungsmodul erforderlich", + "Extract Images": "Bilder extrahieren", + "Extract Pages": "Seiten extrahieren", + "Extract Tables": "Tabellen extrahieren", + "Extract a range of pages": "Einen Seitenbereich extrahieren", + "Extract all images from PDF": "Alle Bilder aus der PDF extrahieren", + "Extract pages as separate PDFs": "Seiten als einzelne PDFs extrahieren", + "Extract text from PDF": "Text aus PDF extrahieren", + "Extracted 1 table successfully!": "1 Tabelle erfolgreich extrahiert!", + "Extracted text from {{length}} PDF files!": "Text aus {{length}} PDF-Dateien extrahiert!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF(s) extrahiert, {{failed}} fehlgeschlagen.", + "Extracted {{length}} page(s) successfully!": "{{length}} Seite(n) erfolgreich extrahiert!", + "Extracted {{length}} table(s) to Excel!": "{{length}} Tabelle(n) nach Excel extrahiert!", + "Extracted {{length}} tables successfully!": "{{length}} Tabellen erfolgreich extrahiert!", + "Extracting attachments from {{length}} file(s)...": "Anhänge aus {{length}} Datei(en) werden extrahiert...", + "Extracting images from {{name}}...": "Bilder aus {{name}} werden extrahiert...", + "Extracting pages...": "Seiten werden extrahiert...", + "Extracting tables...": "Tabellen werden extrahiert...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Text aus Datei {{n}}/{{length}} wird extrahiert: {{name}}...", + "Extracting text from multiple files...": "Text aus mehreren Dateien wird extrahiert...", + "Extracting text from {{name}}...": "Text aus {{name}} wird extrahiert...", + "Extracting text...": "Text wird extrahiert...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "{{name}} wird für KI extrahiert ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "{{name}} wird für KI extrahiert...", + "Extracting...": "Wird extrahiert...", + "Extraction Complete": "Extraktion abgeschlossen", + "Extraction Error": "Extraktionsfehler", + "Extraction Partial": "Extraktion teilweise abgeschlossen", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extraktion abgeschlossen! {{length}} Anhang/Anhänge in der ZIP-Datei ({{totalSize}}). Der Download hat begonnen.", + "FB2 Files": "FB2-Dateien", + "FB2 to PDF": "FB2 zu PDF", + "Failed": "Fehlgeschlagen", + "Failed to acquire 2D canvas context": "2D-Canvas-Kontext konnte nicht abgerufen werden", + "Failed to add child layer": "Unterebene konnte nicht hinzugefügt werden", + "Failed to apply Bates numbers.": "Bates-Nummern konnten nicht angewendet werden.", + "Failed to apply color adjustments. The file might be corrupted.": "Farbanpassungen konnten nicht angewendet werden. Die Datei ist möglicherweise beschädigt.", + "Failed to apply redactions.": "Schwärzungen konnten nicht angewendet werden.", + "Failed to apply scanner effect. The file might be corrupted.": "Scanner-Effekt konnte nicht angewendet werden. Die Datei ist möglicherweise beschädigt.", + "Failed to attach files: {{error}}": "Dateien konnten nicht angehängt werden: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "BMP konnte nicht in PDF konvertiert werden. Eine der Dateien ist möglicherweise ungültig.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "HEIC konnte nicht in PDF konvertiert werden. Eine der Dateien ist möglicherweise ungültig.", + "Failed to convert PDF to CSV. {{message}}": "PDF konnte nicht in CSV konvertiert werden. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "PDF konnte nicht in Excel konvertiert werden. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "PDF konnte nicht in SVG konvertiert werden. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "PDF konnte nicht in Graustufen umgewandelt werden. Die Datei ist möglicherweise beschädigt.", + "Failed to convert PDF. It may be image-based or corrupted.": "Die PDF konnte nicht konvertiert werden. Sie ist möglicherweise bildbasiert oder beschädigt.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "TIFF konnte nicht in PDF konvertiert werden. Eine der Dateien ist möglicherweise ungültig.", + "Failed to convert images to PDF.": "Bilder konnten nicht in PDF konvertiert werden.", + "Failed to convert text to PDF. {{error}}": "Text konnte nicht in PDF konvertiert werden. {{error}}", + "Failed to convert {{filename}} to PNG": "{{filename}} konnte nicht in PNG konvertiert werden", + "Failed to copy metadata to clipboard.": "Metadaten konnten nicht in die Zwischenablage kopiert werden.", + "Failed to create PDF.": "Die PDF konnte nicht erstellt werden.", + "Failed to create PNG blob": "PNG-Blob konnte nicht erstellt werden", + "Failed to create canvas context": "Canvas-Kontext konnte nicht erstellt werden", + "Failed to create split PDFs.": "Die geteilten PDFs konnten nicht erstellt werden.", + "Failed to decode image: {{name}}": "Bild konnte nicht dekodiert werden: {{name}}", + "Failed to decrypt private key": "Privater Schlüssel konnte nicht entschlüsselt werden", + "Failed to decrypt. Try the Decrypt tool instead.": "Entschlüsselung fehlgeschlagen. Versuchen Sie stattdessen das Werkzeug zum Entschlüsseln.", + "Failed to delete layer": "Ebene konnte nicht gelöscht werden", + "Failed to delete pages.": "Seiten konnten nicht gelöscht werden.", + "Failed to deskew PDF: {{error}}": "PDF konnte nicht entzerrt werden: {{error}}", + "Failed to download the edited PDF.": "Die bearbeitete PDF konnte nicht heruntergeladen werden.", + "Failed to edit attachments.": "Anhänge konnten nicht bearbeitet werden.", + "Failed to extract certificate from PFX file": "Zertifikat konnte nicht aus der PFX-Datei extrahiert werden", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Seiten konnten nicht extrahiert werden (qpdf-Exitcode {{exitCode}}).", + "Failed to extract pages.": "Seiten konnten nicht extrahiert werden.", + "Failed to extract tables. {{message}}": "Tabellen konnten nicht extrahiert werden. {{message}}", + "Failed to extract text from PDF.": "Text konnte nicht aus der PDF extrahiert werden.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "ICC-Profil konnte nicht von {{iccUrl}} abgerufen werden: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Schriftdatei konnte nicht abgerufen werden: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "gs.js konnte nicht abgerufen werden: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "{{url}} konnte nicht abgerufen werden: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "2D-Kontext für Seite {{pageNumber}} konnte nicht abgerufen werden", + "Failed to get canvas context": "Canvas-Kontext konnte nicht abgerufen werden", + "Failed to insert PDF. The file may be corrupted.": "Die PDF konnte nicht eingefügt werden. Die Datei ist möglicherweise beschädigt.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Ghostscript konnte nicht von {{normalizedUrl}} geladen werden: {{msg}}", + "Failed to load PDF file.": "Die PDF-Datei konnte nicht geladen werden.", + "Failed to load PDF for cropping.": "Die PDF konnte nicht zum Zuschneiden geladen werden.", + "Failed to load PDF for preview.": "Die PDF konnte nicht für die Vorschau geladen werden.", + "Failed to load PDF form viewer.": "Der PDF-Formular-Viewer konnte nicht geladen werden.", + "Failed to load PDF layers": "PDF-Ebenen konnten nicht geladen werden", + "Failed to load PyMuPDF from CDN: {{msg}}": "PyMuPDF konnte nicht vom CDN geladen werden: {{msg}}", + "Failed to load SVG image": "SVG-Bild konnte nicht geladen werden", + "Failed to load WebP image": "WebP-Bild konnte nicht geladen werden", + "Failed to load attachments from PDF.": "Anhänge konnten nicht aus der PDF geladen werden.", + "Failed to load files: {{error}}": "Dateien konnten nicht geladen werden: {{error}}", + "Failed to load image.": "Das Bild konnte nicht geladen werden.", + "Failed to load image: {{filename}}": "Bild konnte nicht geladen werden: {{filename}}", + "Failed to load one or more PDF files.": "Eine oder mehrere PDF-Dateien konnten nicht geladen werden.", + "Failed to load script: {{url}}": "Skript konnte nicht geladen werden: {{url}}", + "Failed to load template.": "Die Vorlage konnte nicht geladen werden.", + "Failed to load the PDF Editor.": "Der PDF-Editor konnte nicht geladen werden.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Der Bildprozessor konnte nicht geladen werden. Bitte stellen Sie sicher, dass Ihr Browser SharedArrayBuffer unterstützt (erfordert HTTPS oder localhost).", + "Failed to parse CSV: {{error}}": "CSV konnte nicht geparst werden: {{error}}", + "Failed to parse signature": "Signatur konnte nicht geparst werden", + "Failed to parse the certificate file.": "Die Zertifikatsdatei konnte nicht geparst werden.", + "Failed to process HEIC file: {{name}}": "HEIC-Datei konnte nicht verarbeitet werden: {{name}}", + "Failed to process WebP file: {{name}}": "WebP-Datei konnte nicht verarbeitet werden: {{name}}", + "Failed to read file.": "Die Datei konnte nicht gelesen werden.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Beschränkungen konnten nicht entfernt werden. Die PDF erfordert möglicherweise das richtige Besitzerpasswort.", + "Failed to render page": "Seite konnte nicht gerendert werden", + "Failed to render page previews": "Seitenvorschauen konnten nicht gerendert werden", + "Failed to render page previews.": "Seitenvorschauen konnten nicht gerendert werden.", + "Failed to render page.": "Die Seite konnte nicht gerendert werden.", + "Failed to save changes.": "Änderungen konnten nicht gespeichert werden.", + "Failed to save the new PDF. Check console for details.": "Die neue PDF konnte nicht gespeichert werden. Details finden Sie in der Konsole.", + "Failed to split PDF. Please check your selection.": "Die PDF konnte nicht geteilt werden. Bitte prüfen Sie Ihre Auswahl.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Zeitstempel konnte der PDF nicht hinzugefügt werden: {{message}}\n\nVersuchen Sie einen anderen TSA-Server oder prüfen Sie Ihre Internetverbindung.", + "Failed to toggle layer visibility": "Sichtbarkeit der Ebene konnte nicht umgeschaltet werden", + "Failed to validate signatures. The file may be corrupted.": "Signaturen konnten nicht überprüft werden. Die Datei ist möglicherweise beschädigt.", + "Features enabled by this module:": "Von diesem Modul aktivierte Funktionen:", + "Field Name": "Feldname", + "Field Name (Group Name)": "Feldname (Gruppenname)", + "Field Name Conflict": "Feldnamenskonflikt", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Der Feldname \"{{newName}}\" existiert bereits in diesem {{value}}. Verwenden Sie bitte einen eindeutigen Namen.", + "Field name cannot be empty": "Der Feldname darf nicht leer sein", + "File": "Datei", + "File Size": "Dateigröße", + "File exists but could not be read. Check CORS configuration.": "Die Datei existiert, konnte aber nicht gelesen werden. Prüfen Sie die CORS-Konfiguration.", + "File list not found": "Dateiliste nicht gefunden", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Dateigröße von {{originalSize}} auf {{compressedSize}} reduziert ({{percent}}% gespart).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Datei {{n}}/{{length}}: Seite {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Datei {{n}}/{{length}}: {{message}}", + "Filename": "Dateiname", + "Files that failed: {{errorCount}}.": "Fehlgeschlagene Dateien: {{errorCount}}.", + "Fill (cover full target page)": "Füllen (gesamte Zielseite abdecken)", + "Fill Color": "Füllfarbe", + "Finalizing PDF...": "PDF wird abgeschlossen...", + "Find & replace": "Suchen & Ersetzen", + "Finds the best quality under this size. 0 means no target.": "Findet die beste Qualität unter dieser Größe. 0 bedeutet kein Ziel.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox und Chrome zeigen bei der Auswahl möglicherweise ihr eigenes Datumsformat an. Das richtige Format wird angewendet, sobald Sie die Eingabe des Datums abschließen.", + "First Indent": "Erstzeileneinzug", + "Fit (keep full page visible)": "Einpassen (ganze Seite sichtbar lassen)", + "Fit Page": "Seite einpassen", + "Fix Page Size": "Seitengröße reparieren", + "Flatten": "Reduzieren", + "Flatten Forms": "Formulare reduzieren", + "Flatten annotations": "Annotationen reduzieren", + "Flatten form fields": "Formularfelder reduzieren", + "Flatten forms and annotations": "Formulare und Annotationen reduzieren", + "Flatten links": "Links reduzieren", + "Flattening PDF...": "PDF wird reduziert...", + "Flattening and saving PDF...": "PDF wird reduziert und gespeichert...", + "Flattening multiple PDFs...": "Mehrere PDFs werden reduziert...", + "Flattening page {{i}} of {{totalPages}}...": "Seite {{i}} von {{totalPages}} wird reduziert...", + "Flattening {{n}}/{{length}}: {{name}}...": "Reduzierung {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Setzt den Fokus auf die Adressleiste", + "Font": "Schriftart", + "Font Color": "Schriftfarbe", + "Font Family": "Schriftfamilie", + "Font Size": "Schriftgröße", + "Font size: {{bSize}} → {{aSize}}": "Schriftgröße: {{bSize}} → {{aSize}}", + "Font to Outline": "Schriftart zu Umriss", + "Font: {{bFont}} → {{aFont}}": "Schriftart: {{bFont}} → {{aFont}}", + "Fonts": "Schriften", + "Footer Center": "Fußzeile Mitte", + "Footer Left": "Fußzeile links", + "Footer Right": "Fußzeile rechts", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Für reine Bild-PDFs wie Scans. Wird übersprungen, wenn das Dokument auswählbaren Text enthält, es sei denn, \"Inhaltsschutz überschreiben\" ist aktiviert.", + "Form fields stop being fillable.": "Formularfelder sind nicht mehr ausfüllbar.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}} leere Seite(n) gefunden. Klicken Sie auf eine Seite, um sie abzuwählen.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "{{length}} vorhandene Lesezeichen gefunden. Aktuelle Lesezeichen ersetzen?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length}} Bild(er) in {{length2}} PDF(s) gefunden.", + "Front": "Vorderseite", + "Full Coverage": "Vollständige Abdeckung", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Inhaltsverzeichnis aus Lesezeichen erstellen", + "Generating High-Quality PDF...": "Hochwertiges PDF wird erstellt...", + "Generating PDF...": "PDF wird erstellt...", + "Generating ZIP file...": "ZIP-Datei wird erstellt...", + "Generating formatted content...": "Formatierter Inhalt wird erstellt...", + "Generating preview...": "Vorschau wird erstellt...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (PDF/A-Konvertierung)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Die Ghostscript-RGB-Konvertierung ist mit Exitcode {{exitCode}} fehlgeschlagen", + "Ghostscript conversion failed with exit code {{exitCode}}": "Die Ghostscript-Konvertierung ist mit Exitcode {{exitCode}} fehlgeschlagen", + "Ghostscript did not produce output file": "Ghostscript hat keine Ausgabedatei erzeugt", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript ist nicht konfiguriert. Konfigurieren Sie es in den erweiterten Einstellungen.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript ist nicht konfiguriert. Konfigurieren Sie es in den WASM-Einstellungen.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript ist nicht konfiguriert. PyMuPDF benötigt Ghostscript für einige Vorgänge. Konfigurieren Sie beide in den erweiterten Einstellungen.", + "Ghostscript threw an exception: {{e}}": "Ghostscript hat eine Ausnahme ausgelöst: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Der Ghostscript-Wrapper hat die erwartete Schnittstelle nicht bereitgestellt. Erwartet wurde loadGS() oder die Klasse GhostscriptWASM.", + "Go": "Los", + "Go to page": "Zur Seite", + "Grayscale": "Graustufen", + "Green": "Grün", + "Greyscale": "Graustufen", + "Grid Mode": "Rastermodus", + "Group Name (Must be same for group)": "Gruppenname (muss für die Gruppe identisch sein)", + "H-Scale %": "H-Skalierung %", + "Hanging Indent": "Hängender Einzug", + "Hard reloads page": "Lädt die Seite komplett neu", + "Header & Footer": "Kopf- & Fußzeile", + "Header & Footer added successfully!": "Kopf- und Fußzeile erfolgreich hinzugefügt!", + "Header Center": "Kopfzeile Mitte", + "Header Left": "Kopfzeile links", + "Header Right": "Kopfzeile rechts", + "Height ({{unit}})": "Höhe ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Ausblenden", + "Hide Border": "Rahmen ausblenden", + "Hide password": "Passwort verbergen", + "Hides window": "Blendet das Fenster aus", + "High (288 DPI)": "Hoch (288 DPI)", + "High (Smallest Files)": "Hoch (kleinste Dateien)", + "Horizontal": "Horizontal", + "Hue Shift": "Farbtonverschiebung", + "Image Format": "Bildformat", + "Image Input": "Bildeingabe", + "Image quality": "Bildqualität", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Bildgröße von {{width}}×{{height}} auf {{width2}}×{{height2}} geändert", + "Images": "Bilder", + "Images above this are resampled down. None leaves resolution alone.": "Bilder über diesem Wert werden herunterskaliert. \"Keine\" lässt die Auflösung unverändert.", + "Imported {{length}} bookmarks!": "{{length}} Lesezeichen importiert!", + "Inches (in)": "Zoll (in)", + "Include Attachments": "Anhänge einbeziehen", + "Include Cc Bcc": "Cc und Bcc einbeziehen", + "Include this file": "Diese Datei einbeziehen", + "Incorrect Page Count": "Falsche Seitenanzahl", + "Incorrect Password": "Falsches Passwort", + "Incorrect password": "Falsches Passwort", + "Incorrect password. Please try again.": "Falsches Passwort. Bitte versuche es erneut.", + "Increase size": "Vergrößern", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "PDF 1, Seite {{pageNumber}} von {{totalPages}} wird indiziert...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "PDF 2, Seite {{pageNumber}} von {{totalPages}} wird indiziert...", + "Info": "Info", + "Info Dictionary": "Info-Dictionary", + "Inherit": "Erben", + "Initialization Error": "Initialisierungsfehler", + "Initializing Ghostscript...": "Ghostscript wird initialisiert...", + "Initializing PDF engine...": "PDF-Engine wird initialisiert...", + "Initializing PyMuPDF...": "PyMuPDF wird initialisiert...", + "Initializing decryption...": "Entschlüsselung wird initialisiert...", + "Initializing encryption...": "Verschlüsselung wird initialisiert...", + "Initializing repair engine...": "Reparatur-Engine wird initialisiert...", + "Initializing...": "Wird initialisiert...", + "Input Required": "Eingabe erforderlich", + "Insecure Digest (MD5 / SHA-1)": "Unsicherer Digest (MD5 / SHA-1)", + "Insert blank pages": "Leere Seiten einfügen", + "Insert blank pages after this page number": "Leere Seiten nach dieser Seitenzahl einfügen", + "Interactive Form Fields": "Interaktive Formularfelder", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Seiten mehrerer PDFs verschränken (z. B. ungerade + umgekehrte gerade Seiten aus einem einseitigen Scan)", + "Invalid Certificate": "Ungültiges Zertifikat", + "Invalid File": "Ungültige Datei", + "Invalid Files": "Ungültige Dateien", + "Invalid Input": "Ungültige Eingabe", + "Invalid JSON format": "Ungültiges JSON-Format", + "Invalid Name": "Ungültiger Name", + "Invalid Order": "Ungültige Reihenfolge", + "Invalid PDF password.": "Ungültiges PDF-Passwort.", + "Invalid Page Numbers": "Ungültige Seitenzahlen", + "Invalid Page Order": "Ungültige Seitenreihenfolge", + "Invalid Pages": "Ungültige Seiten", + "Invalid Range": "Ungültiger Bereich", + "Invalid Signature": "Ungültige Signatur", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Ungültige TSA-URL. Die Zeitstempelbehörde muss eine gültige http://- oder https://-URL sein.", + "Invalid URL": "Ungültige URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Ungültiges URL-Format. Geben Sie eine gültige URL ein (z. B. https://example.com/wasm/)", + "Invalid XML: no root element": "Ungültiges XML: kein Wurzelelement", + "Invalid data": "Ungültige Daten", + "Invalid hex string in content stream": "Ungültiger Hex-String im Inhaltsstream", + "Invalid page range specified.": "Ungültiger Seitenbereich angegeben.", + "Invalid shortcut format": "Ungültiges Tastenkürzel-Format", + "Invalid: Cryptographic Verification Failed": "Ungültig: Kryptografische Überprüfung fehlgeschlagen", + "Invert Colors": "Farben invertieren", + "Invert all colors": "Alle Farben invertieren", + "Inverting PDF colors...": "PDF-Farben werden invertiert...", + "Issuer": "Aussteller", + "It fits the {{targetBytes}} target.": "Es erreicht das Ziel von {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Es liegt weiterhin über dem Ziel von {{targetBytes}}, weil \"PDF/A beibehalten\" die mögliche Komprimierung begrenzt.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Es erfüllt PDF/A nicht mehr. Aktivieren Sie unter \"Benutzerdefinierte Einstellungen\" die Option \"PDF/A beibehalten\", um dies zu vermeiden.", + "Italic": "Kursiv", + "Item 1": "Element 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Die digitalen Signaturen wurden entfernt, damit es komprimiert werden konnte. Signieren Sie es bei Bedarf erneut.", + "JPEG (Smaller file size)": "JPEG (kleinere Dateigröße)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "JPEG-Qualität für neu kodierte Bilder, 20 bis 100. Niedriger bedeutet kleinere Dateien und sichtbarere Artefakte.", + "JPG": "JPG", + "JSON Files": "JSON-Dateien", + "JSON Loaded": "JSON geladen", + "JSON to PDF": "JSON zu PDF", + "Javascript Code": "JavaScript-Code", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Hält eine PDF/A-Datei konform. Brotli und Rastern werden übersprungen, solange dies aktiviert ist.", + "Keeps only the characters the document uses.": "Behält nur die Zeichen, die das Dokument verwendet.", + "Key (e.g., Department)": "Schlüssel (z. B. Abteilung)", + "Keywords": "Schlüsselwörter", + "Label": "Beschriftung", + "Label / Prompt": "Beschriftung / Eingabeaufforderung", + "Landscape": "Querformat", + "Language": "Sprache", + "Layer not found": "Ebene nicht gefunden", + "Layer {{number}}": "Ebene {{number}}", + "Leave blank for all pages": "Für alle Seiten leer lassen", + "Left": "Links", + "Left edge in points (1 inch = 72 pts)": "Linker Rand in Punkten (1 Zoll = 72 Pkt.)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Stufe", + "Limit recognized characters (leave empty for all)": "Erkannte Zeichen einschränken (für alle leer lassen)", + "Line": "Linie", + "Linearization Failed": "Linearisierung fehlgeschlagen", + "Linearize": "Linearisieren", + "Links stop being clickable.": "Links sind nicht mehr anklickbar.", + "Lists": "Listen", + "Load": "Laden", + "Load system fonts": "Systemschriften laden", + "Load system fonts…": "Systemschriften laden…", + "Loaded": "Geladen", + "Loaded bookmarks from JSON. Now upload your PDF.": "Lesezeichen aus JSON geladen. Laden Sie jetzt Ihre PDF hoch.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} Lesezeichen aus CSV geladen. Laden Sie jetzt Ihre PDF hoch.", + "Loading Engine...": "Engine wird geladen...", + "Loading Ghostscript...": "Ghostscript wird geladen...", + "Loading PDF Editor...": "PDF-Editor wird geladen...", + "Loading PDF Text Editor...": "PDF-Texteditor wird geladen...", + "Loading PDF converter...": "PDF-Konverter wird geladen...", + "Loading PDF documents...": "PDF-Dokumente werden geladen...", + "Loading PDF engine...": "PDF-Engine wird geladen...", + "Loading PDF files...": "PDF-Dateien werden geladen...", + "Loading PDF form...": "PDF-Formular wird geladen...", + "Loading PDF processor...": "PDF-Prozessor wird geladen...", + "Loading PDF viewer...": "PDF-Viewer wird geladen...", + "Loading PDF...": "PDF wird geladen...", + "Loading PDFs...": "PDFs werden geladen...", + "Loading attachments...": "Anhänge werden geladen...", + "Loading comparison {{currentPage}} of {{length}}...": "Vergleich {{currentPage}} von {{length}} wird geladen...", + "Loading conversion engine ({{percent}}%)...": "Konvertierungs-Engine wird geladen ({{percent}}%)...", + "Loading conversion engine...": "Konvertierungs-Engine wird geladen...", + "Loading engine...": "Engine wird geladen...", + "Loading fonts...": "Schriften werden geladen...", + "Loading layers from {{name}}...": "Ebenen aus {{name}} werden geladen...", + "Loading page {{num}}...": "Seite {{num}} wird geladen...", + "Loading preview...": "Vorschau wird geladen...", + "Loading {{name}}...": "{{name}} wird geladen...", + "Loading...": "Wird geladen...", + "Location": "Ort", + "Lossless (No Quality Loss)": "Verlustfrei (kein Qualitätsverlust)", + "Lossless (no image re-encoding)": "Verlustfrei (keine erneute Bildkodierung)", + "Low (Best Quality)": "Niedrig (beste Qualität)", + "MOBI Files": "MOBI-Dateien", + "MOBI to PDF": "MOBI zu PDF", + "Malformed ByteRange": "Fehlerhafter ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Fehlerhafte ECDSA-Signatur (r,s konnten nicht geparst werden)", + "Malformed inline image in content stream": "Fehlerhaftes Inline-Bild im Inhaltsstream", + "Malformed signatureAlgorithm": "Fehlerhafter signatureAlgorithm", + "Margins": "Ränder", + "Markdown Files": "Markdown-Dateien", + "Markdown to PDF": "Markdown zu PDF", + "Max Length (0 for unlimited)": "Maximale Länge (0 für unbegrenzt)", + "Maximum resolution": "Maximale Auflösung", + "Medium (Recommended)": "Mittel (empfohlen)", + "Merge PDF": "PDF zusammenführen", + "Merge PDFs": "PDFs zusammenführen", + "Merge duplicate fonts": "Doppelte Schriften zusammenführen", + "Mermaid Error: {{error}}": "Mermaid-Fehler: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadaten als JSON in die Zwischenablage kopiert.", + "Metadata removed successfully!": "Metadaten erfolgreich entfernt!", + "Metadata updated successfully!": "Metadaten erfolgreich aktualisiert!", + "Millimeters (mm)": "Millimeter (mm)", + "Minimizes window": "Minimiert das Fenster", + "Missing Files": "Fehlende Dateien", + "Missing signatureAlgorithm": "signatureAlgorithm fehlt", + "Mixed Page Sizes Detected": "Gemischte Seitengrößen erkannt", + "Mixed Sizes": "Gemischte Größen", + "Mode": "Modus", + "Modified": "Geändert", + "Modified After Signing (signed part intact)": "Nach dem Signieren verändert (signierter Teil intakt)", + "More": "Mehr", + "Moved": "Verschoben", + "Moved \"{{value}}\"": "\"{{value}}\" verschoben", + "Multi-line": "Mehrzeilig", + "Must be a positive integer": "Muss eine positive ganze Zahl sein", + "Must be a positive number": "Muss eine positive Zahl sein", + "N must be at least 1.": "N muss mindestens 1 sein.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up-PDF erfolgreich erstellt!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Netzwerkfehler: Es konnte keine Verbindung zur URL hergestellt werden. Prüfen Sie, ob die URL korrekt ist und der Server CORS-Anfragen erlaubt.", + "Network error: {{error}}": "Netzwerkfehler: {{error}}", + "Next page": "Nächste Seite", + "No Area Selected": "Kein Bereich ausgewählt", + "No Attachments": "Keine Anhänge", + "No Changes": "Keine Änderungen", + "No Crop Area": "Kein Zuschnittbereich", + "No File": "Keine Datei", + "No Files": "Keine Dateien", + "No Images Found": "Keine Bilder gefunden", + "No PDF Files": "Keine PDF-Dateien", + "No PDF document loaded": "Kein PDF-Dokument geladen", + "No PDF document loaded.": "Kein PDF-Dokument geladen.", + "No PDF file loaded.": "Keine PDF-Datei geladen.", + "No PDF files could be decrypted. The password may be incorrect.": "Keine PDF-Dateien konnten entschlüsselt werden. Das Passwort ist möglicherweise falsch.", + "No PDF files could be linearized.": "Keine PDF-Dateien konnten linearisiert werden.", + "No PDFs could be processed.": "Keine PDFs konnten verarbeitet werden.", + "No Pages": "Keine Seiten", + "No Selection": "Keine Auswahl", + "No Signatures Found": "Keine Signaturen gefunden", + "No Tables Found": "Keine Tabellen gefunden", + "No Text": "Kein Text", + "No URL configured": "Keine URL konfiguriert", + "No attachments found in this PDF.": "In dieser PDF wurden keine Anhänge gefunden.", + "No attachments selected for removal.": "Keine Anhänge zum Entfernen ausgewählt.", + "No blank pages detected in this PDF.": "In dieser PDF wurden keine leeren Seiten erkannt.", + "No bookmarks found at the selected level.": "Auf der ausgewählten Ebene wurden keine Lesezeichen gefunden.", + "No bookmarks to delete.": "Keine Lesezeichen zum Löschen vorhanden.", + "No bookmarks to export!": "Keine Lesezeichen zum Exportieren vorhanden!", + "No certificate found in PEM file": "Kein Zertifikat in der PEM-Datei gefunden", + "No certificate found in PFX file": "Kein Zertifikat in der PFX-Datei gefunden", + "No certificates found in signature": "Keine Zertifikate in der Signatur gefunden", + "No changes match the current filter.": "Keine Änderungen entsprechen dem aktuellen Filter.", + "No configurable settings for this node.": "Für diesen Knoten gibt es keine konfigurierbaren Einstellungen.", + "No differences detected on this page.": "Auf dieser Seite wurden keine Unterschiede erkannt.", + "No embedded images were found in the selected PDF(s).": "In den ausgewählten PDF(s) wurden keine eingebetteten Bilder gefunden.", + "No existing bookmarks found in this PDF.": "In dieser PDF wurden keine vorhandenen Lesezeichen gefunden.", + "No items were selected for removal or none were found in the PDF.": "Es wurden keine Elemente zum Entfernen ausgewählt oder in der PDF gefunden.", + "No page pairs to export.": "Keine Seitenpaare zum Exportieren vorhanden.", + "No pages found. Please create a blank PDF or upload one.": "Keine Seiten gefunden. Erstellen Sie eine leere PDF oder laden Sie eine hoch.", + "No pages selected for removal.": "Keine Seiten zum Entfernen ausgewählt.", + "No pages were selected for splitting.": "Keine Seiten zum Teilen ausgewählt.", + "No paired page for this side.": "Für diese Seite gibt es keine zugeordnete Seite.", + "No private key found in PEM file": "Kein privater Schlüssel in der PEM-Datei gefunden", + "No private key found in PFX file": "Kein privater Schlüssel in der PFX-Datei gefunden", + "No tables were detected in this PDF.": "In dieser PDF wurden keine Tabellen erkannt.", + "No valid page numbers found.": "Keine gültigen Seitenzahlen gefunden.", + "No valid pages to save.": "Keine gültigen Seiten zum Speichern.", + "No worker": "Kein Worker", + "Noise": "Rauschen", + "None": "Keine", + "None of the files could be compressed: {{join}}.": "Keine der Dateien konnte komprimiert werden: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "Nicht genügend Dateien", + "Not a PDF": "Keine PDF", + "Not connected": "Nicht verbunden", + "Not in trust chain": "Nicht in der Vertrauenskette", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Hinweis: Ohne separates Besitzerpasswort hat die PDF keine Nutzungsbeschränkungen.", + "Number Format": "Zahlenformat", + "Number of Pages": "Seitenanzahl", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR wurde abgebrochen, bevor eine Seite verarbeitet wurde", + "OCR recognize timed out after {{timeoutMs}}ms": "Zeitüberschreitung bei der OCR-Erkennung nach {{timeoutMs}} ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODG-Dateien", + "ODG to PDF": "ODG zu PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Aus (Standard): natürliche Nummerierung 1–N. Ein: Die ursprünglichen Seitenbeschriftungen jeder Datei bleiben erhalten (kann doppelte Beschriftungen erzeugen).", + "One PDF per page": "Eine PDF pro Seite", + "One PDF per range": "Eine PDF pro Bereich", + "Only a substitute font was available": "Es war nur eine Ersatzschrift verfügbar", + "Only where it does not change how the image looks.": "Nur dort, wo sich das Aussehen des Bildes nicht ändert.", + "Opacity": "Deckkraft", + "Open URL": "URL öffnen", + "Opens incognito window": "Öffnet ein Inkognito-Fenster", + "Opens new tab": "Öffnet einen neuen Tab", + "Opens new window": "Öffnet ein neues Fenster", + "Operation Failed": "Vorgang fehlgeschlagen", + "Operation resulted in an empty file.": "Der Vorgang hat eine leere Datei ergeben.", + "Optimize PDF for fast web viewing": "PDF für schnelle Webansicht optimieren", + "Optimizing PDFs for web view (linearizing)...": "PDFs werden für die Webansicht optimiert (Linearisierung)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "{{name}} wird optimiert ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Optionen (eine pro Zeile oder durch Komma getrennt)", + "Orientation": "Ausrichtung", + "Outline": "Umriss", + "Output": "Ausgabe", + "Overlay": "Überlagerung", + "Overlay or underlay pages from one PDF onto another": "Seiten einer PDF über oder unter eine andere PDF legen", + "Owner Password": "Besitzerpasswort", + "Owner Password Required": "Besitzerpasswort erforderlich", + "PDF": "PDF", + "PDF Files": "PDF-Dateien", + "PDF Input": "PDF-Eingabe", + "PDF Layers": "PDF-Ebenen", + "PDF Metadata": "PDF-Metadaten", + "PDF Producer": "PDF-Erzeuger", + "PDF converted to CSV successfully!": "PDF erfolgreich in CSV konvertiert!", + "PDF converted to SVG successfully!": "PDF erfolgreich in SVG konvertiert!", + "PDF converted to greyscale successfully!": "PDF erfolgreich in Graustufen umgewandelt!", + "PDF created successfully!": "PDF erfolgreich erstellt!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF erfolgreich entschlüsselt! Alle Verschlüsselungen und Beschränkungen wurden entfernt.", + "PDF decrypted successfully! Your download has started.": "PDF erfolgreich entschlüsselt! Ihr Download hat begonnen.", + "PDF downloaded successfully.": "PDF erfolgreich heruntergeladen.", + "PDF encrypted successfully with 256-bit AES!": "PDF erfolgreich mit 256-Bit-AES verschlüsselt!", + "PDF has been sanitized and downloaded.": "Die PDF wurde bereinigt und heruntergeladen.", + "PDF has no pages": "Die PDF hat keine Seiten", + "PDF organized successfully!": "PDF erfolgreich organisiert!", + "PDF permissions changed successfully!": "PDF-Berechtigungen erfolgreich geändert!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF-Reader bringen die 14 Standard-PDF-Schriften selbst mit.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF-Beschränkungen erfolgreich entfernt! Die Datei ist jetzt vollständig bearbeitbar und druckbar.", + "PDF saved successfully!": "PDF erfolgreich gespeichert!", + "PDF split successfully!": "PDF erfolgreich geteilt!", + "PDF to CSV": "PDF zu CSV", + "PDF to DOCX": "PDF zu DOCX", + "PDF to Excel/CSV": "PDF zu Excel/CSV", + "PDF to Images": "PDF zu Bildern", + "PDF to Images (High Quality)": "PDF zu Bildern (hohe Qualität)", + "PDF to JSON": "PDF zu JSON", + "PDF to Markdown": "PDF zu Markdown", + "PDF to PDF/A": "PDF zu PDF/A", + "PDF to SVG": "PDF zu SVG", + "PDF to Text": "PDF zu Text", + "PDF to XLSX": "PDF zu XLSX", + "PDF with layer changes saved!": "PDF mit Ebenenänderungen gespeichert!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} erfolgreich angewendet.", + "PDF/A Conversion": "PDF/A-Konvertierung", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (streng, keine Transparenz)", + "PDF/A-2b (Recommended)": "PDF/A-2b (empfohlen)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (modern, erlaubt Anhänge)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "Die PDFs wurden erfolgreich gemischt!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (verlustfrei)", + "PUB to PDF": "PUB zu PDF", + "Page": "Seite", + "Page #": "Seite Nr.", + "Page Added": "Seite hinzugefügt", + "Page Numbers": "Seitenzahlen", + "Page Removed": "Seite entfernt", + "Page Size": "Seitengröße", + "Page X of Y": "Seite X von Y", + "Page background or layout changed": "Seitenhintergrund oder Layout geändert", + "Page container not found": "Seitencontainer nicht gefunden", + "Page extraction produced an empty PDF.": "Die Seitenextraktion hat eine leere PDF ergeben.", + "Page number": "Seitenzahl", + "Page numbers added successfully!": "Seitenzahlen erfolgreich hinzugefügt!", + "Page sizes standardized successfully!": "Seitengrößen erfolgreich vereinheitlicht!", + "Page {{currentPageNum}} of {{numPages}}": "Seite {{currentPageNum}} von {{numPages}}", + "Page {{num}} / {{numPages}}": "Seite {{num}} / {{numPages}}", + "Page {{n}} ": "Seite {{n}} ", + "Page {{n}} of {{length}}": "Seite {{n}} von {{length}}", + "Page {{n}}:": "Seite {{n}}:", + "Page {{pageNumber}}": "Seite {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Seite {{pageNumber}} existiert nur in der ersten PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Seite {{pageNumber}} existiert nur in der zweiten PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Seite {{pageNumber}} von {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Seite {{pageNum}} existiert in dieser PDF nicht.", + "Page {{page}}": "Seite {{page}}", + "Page {{page}} attachment": "Anhang auf Seite {{page}}", + "Pages": "Seiten", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Seiten (z. B. 1-3, 5), insgesamt: {{pageCount}}", + "Pages Files": "Pages-Dateien", + "Pages Per Sheet": "Seiten pro Blatt", + "Pages combined successfully!": "Seiten erfolgreich kombiniert!", + "Pages have been divided successfully!": "Die Seiten wurden erfolgreich geteilt!", + "Pages have been reordered.": "Die Seiten wurden neu angeordnet.", + "Pages have been reversed successfully!": "Die Seiten wurden erfolgreich umgekehrt!", + "Pages to PDF": "Pages zu PDF", + "Paper Size": "Papierformat", + "Paragraph": "Absatz", + "Parsing XML structure...": "XML-Struktur wird geparst...", + "Parsing {{name}}...": "{{name}} wird geparst...", + "Partial Coverage": "Teilweise Abdeckung", + "Partial Success": "Teilweise erfolgreich", + "Password": "Passwort", + "Password Error": "Passwortfehler", + "Password Needed": "Passwort erforderlich", + "Password Required": "Passwort erforderlich", + "Password for all files": "Passwort für alle Dateien", + "Password for all locked files": "Passwort für alle gesperrten Dateien", + "Password for {{name}}": "Passwort für {{name}}", + "Password protected": "Passwortgeschützt", + "Password required for encrypted private key": "Für den verschlüsselten privaten Schlüssel ist ein Passwort erforderlich", + "Path Stroke": "Pfadkontur", + "Please add at least one field before downloading.": "Fügen Sie vor dem Herunterladen mindestens ein Feld hinzu.", + "Please draw a rectangle on at least one page to select the crop area.": "Zeichnen Sie auf mindestens einer Seite ein Rechteck, um den Zuschnittbereich auszuwählen.", + "Please ensure all page numbers in the order are unique.": "Stellen Sie sicher, dass alle Seitenzahlen in der Reihenfolge eindeutig sind.", + "Please enter a layer name": "Geben Sie einen Ebenennamen ein", + "Please enter a name.": "Geben Sie einen Namen ein.", + "Please enter a number between 0 and {{totalPages}}.": "Geben Sie eine Zahl zwischen 0 und {{totalPages}} ein.", + "Please enter a page order.": "Geben Sie eine Seitenreihenfolge ein.", + "Please enter a password": "Geben Sie ein Passwort ein", + "Please enter a password for {{i}} or skip it": "Geben Sie ein Passwort für {{i}} ein oder überspringen Sie es", + "Please enter a title.": "Geben Sie einen Titel ein.", + "Please enter a user password.": "Geben Sie ein Benutzerpasswort ein.", + "Please enter a valid number of pages (1 or more).": "Geben Sie eine gültige Seitenanzahl ein (1 oder mehr).", + "Please enter a valid page number between 1 and {{total}}": "Geben Sie eine gültige Seitenzahl zwischen 1 und {{total}} ein", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Geben Sie einen gültigen Seitenbereich ein (z. B. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Geben Sie die zu extrahierenden Seitenzahlen ein.", + "Please enter positive numbers.": "Geben Sie positive Zahlen ein.", + "Please enter some text to convert.": "Geben Sie Text zum Konvertieren ein.", + "Please enter text for the watermark.": "Geben Sie einen Text für das Wasserzeichen ein.", + "Please enter the PDF password.": "Geben Sie das PDF-Passwort ein.", + "Please load a PDF first.": "Laden Sie zuerst eine PDF.", + "Please select PDF files to create a ZIP archive.": "Wählen Sie PDF-Dateien aus, um ein ZIP-Archiv zu erstellen.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Wählen Sie eine Zertifikatsdatei (.pem, .crt, .cer oder .der) aus.", + "Please select a PDF file.": "Wählen Sie eine PDF-Datei aus.", + "Please select a valid PDF file.": "Wählen Sie eine gültige PDF-Datei aus.", + "Please select an area on at least one page to crop.": "Wählen Sie auf mindestens einer Seite einen Bereich zum Zuschneiden aus.", + "Please select an area to crop first.": "Wählen Sie zuerst einen Bereich zum Zuschneiden aus.", + "Please select an area to crop.": "Wählen Sie einen Bereich zum Zuschneiden aus.", + "Please select an image file for the watermark.": "Wählen Sie eine Bilddatei für das Wasserzeichen aus.", + "Please select at least one BMP file.": "Wählen Sie mindestens eine BMP-Datei aus.", + "Please select at least one CSV file.": "Wählen Sie mindestens eine CSV-Datei aus.", + "Please select at least one Excel file.": "Wählen Sie mindestens eine Excel-Datei aus.", + "Please select at least one HEIC file.": "Wählen Sie mindestens eine HEIC-Datei aus.", + "Please select at least one JPG file.": "Wählen Sie mindestens eine JPG-Datei aus.", + "Please select at least one JPG or JPEG2000 image.": "Wählen Sie mindestens ein JPG- oder JPEG-2000-Bild aus.", + "Please select at least one ODT file.": "Wählen Sie mindestens eine ODT-Datei aus.", + "Please select at least one PDF file.": "Wählen Sie mindestens eine PDF-Datei aus.", + "Please select at least one PowerPoint file.": "Wählen Sie mindestens eine PowerPoint-Datei aus.", + "Please select at least one RTF file.": "Wählen Sie mindestens eine RTF-Datei aus.", + "Please select at least one SVG file.": "Wählen Sie mindestens eine SVG-Datei aus.", + "Please select at least one TIFF file.": "Wählen Sie mindestens eine TIFF-Datei aus.", + "Please select at least one Word document.": "Wählen Sie mindestens ein Word-Dokument aus.", + "Please select at least one file to attach.": "Wählen Sie mindestens eine Datei zum Anhängen aus.", + "Please select at least one image file.": "Wählen Sie mindestens eine Bilddatei aus.", + "Please select at least one text file.": "Wählen Sie mindestens eine Textdatei aus.", + "Please select at least one {{FILETYPE_NAME}} file.": "Wählen Sie mindestens eine {{FILETYPE_NAME}}-Datei aus.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Wählen Sie mindestens eine {{TOOL_NAME}}-Datei (.eml oder .msg) aus.", + "Please select at least one {{TOOL_NAME}} file.": "Wählen Sie mindestens eine {{TOOL_NAME}}-Datei aus.", + "Please select even or odd pages.": "Wählen Sie gerade oder ungerade Seiten aus.", + "Please select one or more PDF files.": "Wählen Sie eine oder mehrere PDF-Dateien aus.", + "Please select pages to delete.": "Wählen Sie die zu löschenden Seiten aus.", + "Please select pages to duplicate.": "Wählen Sie die zu duplizierenden Seiten aus.", + "Please select pages to mark for splitting.": "Wählen Sie die Seiten aus, die zum Teilen markiert werden sollen.", + "Please select pages to rotate.": "Wählen Sie die zu drehenden Seiten aus.", + "Please specify a page range for page-level attachments.": "Geben Sie einen Seitenbereich für Anhänge auf Seitenebene an.", + "Please upload PDF files.": "Laden Sie PDF-Dateien hoch.", + "Please upload PDFs first.": "Laden Sie zuerst PDFs hoch.", + "Please upload a .docx file first.": "Laden Sie zuerst eine .docx-Datei hoch.", + "Please upload a PDF file first.": "Laden Sie zuerst eine PDF-Datei hoch.", + "Please upload a PDF file.": "Laden Sie eine PDF-Datei hoch.", + "Please upload a PDF first.": "Laden Sie zuerst eine PDF hoch.", + "Please upload a valid PDF file.": "Laden Sie eine gültige PDF-Datei hoch.", + "Please upload at least one PDF file.": "Laden Sie mindestens eine PDF-Datei hoch.", + "Please upload at least two PDF files to alternate and mix.": "Laden Sie mindestens zwei PDF-Dateien zum abwechselnden Mischen hoch.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Laden Sie sowohl ein Basis-PDF als auch ein Überlagerungs-/Unterlagen-PDF hoch.", + "Please upload valid PDF files.": "Laden Sie gültige PDF-Dateien hoch.", + "Please use the Download button in the PDF viewer toolbar above.": "Nutzen Sie die Schaltfläche \"Herunterladen\" in der PDF-Viewer-Symbolleiste oben.", + "Please wait for the PDF viewer to load.": "Warten Sie, bis der PDF-Viewer geladen ist.", + "Please wait for the form to finish loading.": "Warten Sie, bis das Formular fertig geladen ist.", + "Portrait": "Hochformat", + "Position": "Position", + "Post-processing for transparency compliance...": "Nachbearbeitung für die Transparenzkonformität...", + "Posterize": "Posterisieren", + "Posterizing PDF...": "PDF wird posterisiert...", + "PowerPoint to PDF": "PowerPoint zu PDF", + "Pre Flatten": "Vorab reduzieren", + "Pre-flattening PDF...": "PDF wird vorab reduziert...", + "Prefer JPEG 2000 for photos": "JPEG 2000 für Fotos bevorzugen", + "Preparing PDF export...": "PDF-Export wird vorbereitet...", + "Preparing conversion...": "Konvertierung wird vorbereitet...", + "Preparing download...": "Download wird vorbereitet...", + "Preparing preview...": "Vorschau wird vorbereitet...", + "Presentations": "Präsentationen", + "Preserve PDF/A": "PDF/A beibehalten", + "Preview": "Vorschau", + "Preview Error": "Vorschaufehler", + "Preview Text": "Textvorschau", + "Previous page": "Vorherige Seite", + "Print Form": "Formular drucken", + "Private data that editing apps store inside the PDF.": "Private Daten, die Bearbeitungsprogramme in der PDF speichern.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDFs verarbeitet.", + "Processing Complete": "Verarbeitung abgeschlossen", + "Processing Dpi": "Verarbeitungs-DPI", + "Processing Failed": "Verarbeitung fehlgeschlagen", + "Processing PDF permissions...": "PDF-Berechtigungen werden verarbeitet...", + "Processing attachments...": "Anhänge werden verarbeitet...", + "Processing failed for {{name}}.": "Verarbeitung von {{name}} fehlgeschlagen.", + "Processing file {{n}} of {{length}}...": "Datei {{n}} von {{length}} wird verarbeitet...", + "Processing images...": "Bilder werden verarbeitet...", + "Processing multiple PDFs...": "Mehrere PDFs werden verarbeitet...", + "Processing page {{i}} of {{numPages}}": "Seite {{i}} von {{numPages}} wird verarbeitet", + "Processing page {{i}} of {{numPages}}...": "Seite {{i}} von {{numPages}} wird verarbeitet...", + "Processing page {{n}} of {{length}}...": "Seite {{n}} von {{length}} wird verarbeitet...", + "Processing page {{pageNum}} of {{length}}...": "Seite {{pageNum}} von {{length}} wird verarbeitet...", + "Processing page {{pageNum}} of {{totalPages}}...": "Seite {{pageNum}} von {{totalPages}} wird verarbeitet...", + "Processing produced an empty file.": "Die Verarbeitung hat eine leere Datei erzeugt.", + "Processing resulted in an empty file.": "Die Verarbeitung hat eine leere Datei ergeben.", + "Processing sheet {{n}}...": "Blatt {{n}} wird verarbeitet...", + "Processing {{name}}...": "{{name}} wird verarbeitet...", + "Processing {{nodeName}}...": "{{nodeName}} wird verarbeitet...", + "Processing {{n}}/{{length}}: {{name}}...": "Verarbeitung {{n}}/{{length}}: {{name}}...", + "Processing...": "Wird verarbeitet...", + "Producer": "Erzeugt von", + "Publisher Files": "Publisher-Dateien", + "Purple": "Lila", + "PyMuPDF (Document Processing)": "PyMuPDF (Dokumentverarbeitung)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF ist nicht konfiguriert. Konfigurieren Sie es in den erweiterten Einstellungen.", + "PyMuPDF module did not export expected PyMuPDF class.": "Das PyMuPDF-Modul hat die erwartete PyMuPDF-Klasse nicht exportiert.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF hat eine leere entschlüsselte Datei erzeugt.", + "PyMuPDF: not configured.": "PyMuPDF: nicht konfiguriert.", + "QR Code": "QR-Code", + "Quality": "Qualität", + "Quits application (cannot be overridden)": "Beendet die Anwendung (kann nicht überschrieben werden)", + "RSA-PKCS1 signature does not verify against signer public key": "Die RSA-PKCS1-Signatur stimmt nicht mit dem öffentlichen Schlüssel des Unterzeichners überein", + "RSA-PSS signature does not verify against signer public key": "Die RSA-PSS-Signatur stimmt nicht mit dem öffentlichen Schlüssel des Unterzeichners überein", + "Rasterization Complete": "Rastern abgeschlossen", + "Rasterization Partial": "Rastern teilweise abgeschlossen", + "Rasterize": "Rastern", + "Rasterize Dpi": "Raster-DPI", + "Rasterize pages to images": "Seiten in Bilder rastern", + "Rasterize quality": "Rasterqualität", + "Rasterize resolution (DPI)": "Rasterauflösung (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF(s) gerastert, {{failed}} fehlgeschlagen.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "{{name}} wird gerastert ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "{{name}} wird gerastert...", + "Rasterizing...": "Wird gerastert...", + "Rating must be between 0 and 5": "Die Bewertung muss zwischen 0 und 5 liegen", + "Read Only": "Schreibgeschützt", + "Reading CSV file...": "CSV-Datei wird gelesen...", + "Reading PDF...": "PDF wird gelesen...", + "Reading XML file...": "XML-Datei wird gelesen...", + "Reading encrypted PDF...": "Verschlüsseltes PDF wird gelesen...", + "Reading files...": "Dateien werden gelesen...", + "Reading layer configuration...": "Ebenenkonfiguration wird gelesen...", + "Reading {{name}} ({{n}}/{{length}})...": "{{name}} wird gelesen ({{n}}/{{length}})...", + "Ready": "Bereit", + "Reason": "Grund", + "Red": "Rot", + "Redact": "Schwärzen", + "Redact Mode": "Schwärzungsmodus", + "Redact text from PDF": "Text in der PDF schwärzen", + "Redaction Failed": "Schwärzung fehlgeschlagen", + "Reduce PDF file size": "PDF-Dateigröße reduzieren", + "Reduce color complexity": "Farbkomplexität reduzieren", + "Reduces file size by removing color information.": "Reduziert die Dateigröße, indem Farbinformationen entfernt werden.", + "Reloads page": "Lädt die Seite neu", + "Remove": "Entfernen", + "Remove All Attachments": "Alle Anhänge entfernen", + "Remove Annotations": "Annotationen entfernen", + "Remove Blank Pages": "Leere Seiten entfernen", + "Remove Embedded Files": "Eingebettete Dateien entfernen", + "Remove Fonts": "Schriften entfernen", + "Remove Javascript": "JavaScript entfernen", + "Remove Layers": "Ebenen entfernen", + "Remove Links": "Links entfernen", + "Remove Mark Info": "Mark-Info entfernen", + "Remove Metadata": "Metadaten entfernen", + "Remove PDF password protection": "PDF-Passwortschutz entfernen", + "Remove Structure Tree": "Strukturbaum entfernen", + "Remove alternate images": "Alternative Bilder entfernen", + "Remove application data": "Anwendungsdaten entfernen", + "Remove article threads": "Artikel-Threads entfernen", + "Remove attachment": "Anhang entfernen", + "Remove blank pages automatically": "Leere Seiten automatisch entfernen", + "Remove document structure tree": "Dokumentstrukturbaum entfernen", + "Remove file": "Datei entfernen", + "Remove metadata, scripts, and hidden data": "Metadaten, Skripte und versteckte Daten entfernen", + "Remove output intents": "Ausgabeabsichten entfernen", + "Remove page thumbnails": "Seiten-Miniaturansichten entfernen", + "Remove specific pages": "Bestimmte Seiten entfernen", + "Remove web capture information": "Web-Capture-Informationen entfernen", + "Remove {{name}}": "{{name}} entfernen", + "Removed \"{{beforeText}}\"": "\"{{beforeText}}\" entfernt", + "Removed image ({{width}}×{{height}})": "Bild entfernt ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} leere Seite(n) erfolgreich entfernt!", + "Removing all metadata...": "Alle Metadaten werden entfernt...", + "Removing annotations...": "Annotationen werden entfernt...", + "Removing redacted text from document data...": "Geschwärzter Text wird aus den Dokumentdaten entfernt...", + "Removing restrictions...": "Beschränkungen werden entfernt...", + "Removing {{length}} blank page(s)...": "{{length}} leere Seite(n) werden entfernt...", + "Render Error": "Renderfehler", + "Rendering Page {{num}}...": "Seite {{num}} wird gerendert...", + "Rendering page previews...": "Seitenvorschauen werden gerendert...", + "Rendering page previews: {{current}}/{{total}}": "Seitenvorschauen werden gerendert: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Seite {{n}} von {{length}} wird gerendert...", + "Rendering preview for page {{pageNum}}...": "Vorschau für Seite {{pageNum}} wird gerendert...", + "Reopens closed tab": "Öffnet den zuletzt geschlossenen Tab erneut", + "Repair": "Reparieren", + "Repair Failed": "Reparatur fehlgeschlagen", + "Repair corrupted PDF": "Beschädigtes PDF reparieren", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} Datei(en) repariert. Reparatur fehlgeschlagen: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "{{name}} wird repariert ({{n}}/{{length}})...", + "Repairing {{name}}...": "{{name}} wird repariert...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "\"{{beforeText}}\" durch \"{{afterText}}\" ersetzt", + "Required": "Erforderlich", + "Resamples even when an image is only slightly above the limit.": "Berechnet auch dann neu, wenn ein Bild das Limit nur geringfügig überschreitet.", + "Reset Form": "Formular zurücksetzen", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Zurücksetzen und zum Datei-Upload zurückkehren? Alle nicht gespeicherten Änderungen gehen verloren.", + "Resolution": "Auflösung", + "Retain Page Labels": "Seitenbeschriftungen beibehalten", + "Retry Failed": "Wiederholen fehlgeschlagen", + "Reverse Pages": "Seiten umkehren", + "Reverse page order": "Seitenreihenfolge umkehren", + "Reversing page order...": "Seitenreihenfolge wird umgekehrt...", + "Reversing {{name}} ({{n}}/{{length}})...": "{{name}} wird umgekehrt ({{n}}/{{length}})...", + "Right": "Rechts", + "Right edge in points": "Rechter Rand in Punkten", + "Rotate": "Drehen", + "Rotate +90°": "+90° drehen", + "Rotate all pages": "Alle Seiten drehen", + "Rotation": "Drehung", + "Rotation Variance": "Drehungsabweichung", + "Rotations applied successfully!": "Drehungen erfolgreich angewendet!", + "Rows": "Zeilen", + "Run Javascript": "JavaScript ausführen", + "Running OCR on page {{pageNum}}...": "OCR wird auf Seite {{pageNum}} ausgeführt...", + "Running...": "Läuft...", + "SVG": "SVG", + "SVG Files": "SVG-Dateien", + "SVG to PDF": "SVG zu PDF", + "Sanitize": "Bereinigen", + "Sanitized With Warnings": "Mit Warnungen bereinigt", + "Sanitizing PDF...": "PDF wird bereinigt...", + "Saturation": "Sättigung", + "Saved": "Gespeichert", + "Saving PDF with layer changes...": "PDF mit Ebenenänderungen wird gespeichert...", + "Scaling Mode": "Skalierungsmodus", + "Scanner Effect": "Scanner-Effekt", + "Scanner effect applied successfully!": "Scanner-Effekt erfolgreich angewendet!", + "Scanning page {{n}} of {{pageCount}}...": "Seite {{n}} von {{pageCount}} wird gescannt...", + "Search Text": "Text suchen", + "Search languages...": "Sprachen suchen...", + "Select Font": "Schriftart auswählen", + "Select a field to edit properties": "Wählen Sie ein Feld, um Eigenschaften zu bearbeiten", + "Select a field...": "Feld auswählen...", + "Select to add this button to an existing group": "Auswählen, um diese Schaltfläche zu einer bestehenden Gruppe hinzuzufügen", + "Selected Option": "Ausgewählte Option", + "Self-Signed: Signer Identity Not Verified": "Selbstsigniert: Identität des Unterzeichners nicht überprüft", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Selbst gehostete OCR-Ressourcen sind nur teilweise konfiguriert. Setzen Sie {{missing}} zusammen mit den anderen Tesseract-Ressourcen-URLs.", + "Separator": "Trennlinie", + "Separator Color": "Farbe der Trennlinie", + "Separator Thickness": "Stärke der Trennlinie", + "Sepia": "Sepia", + "Serial Number:": "Seriennummer:", + "Set custom destination": "Benutzerdefiniertes Ziel festlegen", + "Shapes": "Formen", + "Sheet {{n}} {{sideLabel}}": "Blatt {{n}} {{sideLabel}}", + "Show": "Anzeigen", + "Show password": "Passwort anzeigen", + "Show/Hide Field": "Feld ein-/ausblenden", + "Sign Here": "Hier unterschreiben", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents ist kein einzelnes DER-Objekt gefolgt von Null-Padding", + "Signature Algorithm:": "Signaturalgorithmus:", + "Signature Intact: Signer Identity Not Verified": "Signatur intakt: Identität des Unterzeichners nicht überprüft", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Signaturfelder sind AcroForm-Signaturfelder und wären nur in einem erweiterten PDF-Viewer sichtbar.", + "Signature has a missing or malformed /ByteRange": "Die Signatur hat einen fehlenden oder fehlerhaften /ByteRange", + "Signature scheme {{kind}} not implemented": "Signaturschema {{kind}} nicht implementiert", + "Signature {{n}}": "Signatur {{n}}", + "Signatures": "Signaturen", + "Signed By": "Signiert von", + "Signed On": "Signiert am", + "Signed PDF Not Changed": "Signiertes PDF nicht verändert", + "Signed PDF downloaded successfully!": "Signiertes PDF erfolgreich heruntergeladen!", + "Signed PDF saved successfully!": "Signiertes PDF erfolgreich gespeichert!", + "Simple (1, 2, 3)": "Einfach (1, 2, 3)", + "Simplify large color profiles": "Große Farbprofile vereinfachen", + "Skew Threshold": "Schwellenwert für Schräglage", + "Skip": "Überspringen", + "Skip All": "Alle überspringen", + "Skip Remaining": "Übrige überspringen", + "Skip this file": "Diese Datei überspringen", + "Skipped: {{join}}.": "Übersprungen: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Kleinere Dateien, die aber nur Reader mit Brotli-Unterstützung öffnen können, etwa Firefox, MuPDF 1.26+ und Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Einige Dateien wurden übersprungen, weil sie keine unterstützten Bilder sind.", + "Some files were skipped. Only BMP files are allowed.": "Einige Dateien wurden übersprungen. Es sind nur BMP-Dateien erlaubt.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Einige Dateien wurden übersprungen. Es sind nur HEIC/HEIF-Dateien erlaubt.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Einige Dateien wurden übersprungen. Es sind nur JPG-, JPEG-, JP2- und JPX-Dateien erlaubt.", + "Some files were skipped. Only PDF files are allowed.": "Einige Dateien wurden übersprungen. Es sind nur PDF-Dateien erlaubt.", + "Some files were skipped. Only PNG images are allowed.": "Einige Dateien wurden übersprungen. Es sind nur PNG-Bilder erlaubt.", + "Some files were skipped. Only SVG graphics are allowed.": "Einige Dateien wurden übersprungen. Es sind nur SVG-Grafiken erlaubt.", + "Some files were skipped. Only TIFF files are allowed.": "Einige Dateien wurden übersprungen. Es sind nur TIFF-Dateien erlaubt.", + "Some files were skipped. Only WebP images are allowed.": "Einige Dateien wurden übersprungen. Es sind nur WebP-Bilder erlaubt.", + "Some files were skipped. Only supported image formats are allowed.": "Einige Dateien wurden übersprungen. Es sind nur unterstützte Bildformate erlaubt.", + "Some files were skipped. Only text files are allowed.": "Einige Dateien wurden übersprungen. Es sind nur Textdateien erlaubt.", + "Some pages could not be processed. Please try again.": "Einige Seiten konnten nicht verarbeitet werden. Bitte versuche es erneut.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Einige Schwärzungsmarkierungen konnten nicht angewendet werden, deshalb wurde die Datei nicht heruntergeladen. Wenden Sie sie im Editor an oder entfernen Sie sie und versuchen Sie es erneut.", + "Spacing": "Abstand", + "Split PDF": "PDF teilen", + "Split by Bookmarks": "Nach Lesezeichen teilen", + "Split pages into tile grid for poster printing": "Seiten für den Posterdruck in ein Kachelraster teilen", + "Split pages vertically or horizontally": "Seiten vertikal oder horizontal teilen", + "Splitting PDF pages...": "PDF-Seiten werden geteilt...", + "Splitting PDF...": "PDF wird geteilt...", + "Spreadsheets": "Tabellen", + "Standard (192 DPI)": "Standard (192 DPI)", + "Standard Size": "Standardgröße", + "Standardize all pages to a target size": "Alle Seiten auf eine Zielgröße vereinheitlichen", + "Standardizing pages...": "Seiten werden vereinheitlicht...", + "Stitch all pages into one continuous page": "Alle Seiten zu einer durchgehenden Seite zusammenfügen", + "Straighten skewed PDF pages": "Schiefe PDF-Seiten geraderichten", + "Strip all annotations": "Alle Annotationen entfernen", + "Style": "Stil", + "Style Changed": "Stil geändert", + "Style changed ({{length}} regions)": "Stil geändert ({{length}} Bereiche)", + "Subject": "Betreff", + "Subset embedded fonts": "Eingebettete Schriften als Teilmenge speichern", + "Success": "Erfolg", + "Success!": "Erfolgreich!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} CSV-Datei(en) erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} Excel-Datei(en) erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} ODT-Datei(en) erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF(s) erfolgreich in DOCX konvertiert.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF(s) erfolgreich in Markdown konvertiert.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF(s) erfolgreich in {{level}} konvertiert.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} PSD-Dateien erfolgreich in eine einzelne PDF konvertiert.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} PowerPoint-Datei(en) erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} RTF-Datei(en) erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} Word-Dokument(e) erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} files to PDF.": "{{length}} Dateien erfolgreich in PDF konvertiert.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} {{TOOL_NAME}}-Datei(en) erfolgreich in PDF konvertiert.", + "Successfully converted {{name}} to DOCX.": "{{name}} erfolgreich in DOCX konvertiert.", + "Successfully converted {{name}} to Markdown.": "{{name}} erfolgreich in Markdown konvertiert.", + "Successfully converted {{name}} to PDF.": "{{name}} erfolgreich in PDF konvertiert.", + "Successfully converted {{name}} to {{level}}.": "{{name}} erfolgreich in {{level}} konvertiert.", + "Successfully extracted PDF for AI/LLM use.": "PDF erfolgreich für die Nutzung mit KI/LLMs extrahiert.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF(s) erfolgreich für die Nutzung mit KI/LLMs extrahiert.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF erfolgreich mit {{dpi}} DPI gerastert.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF(s) erfolgreich mit {{dpi}} DPI gerastert.", + "Supported: CBZ, CBR": "Unterstützt: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Unterstützt: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Unterstützt: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Unterstützt: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Unterstützt: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Unterstützt: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Unterstützt: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Unterstützt: XPS, OXPS", + "Switches apps": "Wechselt zwischen Apps", + "Switches tabs": "Wechselt zwischen Tabs", + "Table of Contents": "Inhaltsverzeichnis", + "Table {{n}} (Page {{page}})": "Tabelle {{n}} (Seite {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Zielfeld", + "Target Kilobytes": "Ziel in Kilobyte", + "Target Not Reached": "Ziel nicht erreicht", + "Target Size": "Zielgröße", + "Technical Details": "Technische Details", + "Temperature": "Temperatur", + "Template \"{{name}}\" loaded.": "Vorlage \"{{name}}\" geladen.", + "Template \"{{name}}\" saved.": "Vorlage \"{{name}}\" gespeichert.", + "Text": "Text", + "Text Color": "Textfarbe", + "Text Files": "Textdateien", + "Text color changed successfully!": "Textfarbe erfolgreich geändert!", + "Text converted to PDF successfully!": "Text erfolgreich in PDF konvertiert!", + "Text extracted successfully!": "Text erfolgreich extrahiert!", + "Text to PDF": "Text zu PDF", + "That password did not open any of the remaining files.": "Dieses Passwort hat keine der übrigen Dateien geöffnet.", + "The PDF file(s) do not contain any attachments to extract.": "Die PDF-Datei(en) enthalten keine Anhänge zum Extrahieren.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "Die PDF hat {{totalPages}} Seiten, was nicht gleichmäßig durch {{nValue}} teilbar ist. Die letzte PDF enthält {{remainder}} Seite(n).", + "The PDF might be corrupted or password protected.": "Die PDF ist möglicherweise beschädigt oder passwortgeschützt.", + "The PDF might be corrupted or password-protected.": "Die PDF ist möglicherweise beschädigt oder passwortgeschützt.", + "The PDF might be corrupted.": "Die PDF ist möglicherweise beschädigt.", + "The PDF viewer is still initializing.": "Der PDF-Viewer wird noch initialisiert.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "Die PDF wurde heruntergeladen, aber diese Schritte konnten nicht abgeschlossen werden: {{join}}. Die dadurch abgedeckten Inhalte befinden sich möglicherweise noch in der Datei.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "Die URL hat einen unerwarteten Inhaltstyp zurückgegeben: {{contentType}}. Erwartet wurde eine JavaScript-Datei.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Die von /ByteRange ausgeschlossenen Bytes sind keine exakt hexkodierte Signatur", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Die von /ByteRange ausgeschlossenen Bytes sind nicht der /Contents dieser Signatur", + "The compression engine returned an unreadable result.": "Die Komprimierungs-Engine hat ein nicht lesbares Ergebnis geliefert.", + "The compression engine stopped unexpectedly.": "Die Komprimierungs-Engine wurde unerwartet beendet.", + "The current password you entered is incorrect. Please try again.": "Das eingegebene aktuelle Passwort ist falsch. Bitte versuche es erneut.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Die folgenden Feldnamen existieren bereits in der hochgeladenen PDF: {{conflictList}}. Benennen Sie diese Felder vor dem Herunterladen um.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Die folgenden Feldnamen werden mehrfach verwendet: {{duplicateList}}. Benennen Sie diese Felder vor dem Herunterladen um, damit sie eindeutige Namen haben.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Die angegebene Seitenzahl ({{length}}) stimmt nicht mit der aktuellen Seitenzahl des Dokuments ({{currentGridCount}}) überein. Geben Sie eine vollständige Reihenfolge für alle Seiten an.", + "The password you entered is incorrect. Please try again.": "Das eingegebene Passwort ist falsch. Bitte versuche es erneut.", + "The password you entered is wrong or the file is corrupted.": "Das eingegebene Passwort ist falsch oder die Datei ist beschädigt.", + "The provided file could not be loaded as an image. It may be corrupted.": "Die angegebene Datei konnte nicht als Bild geladen werden. Sie ist möglicherweise beschädigt.", + "The requested OCR language is not available: {{unavailableText}}.": "Die angeforderte OCR-Sprache ist nicht verfügbar: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Die angegebene Seitenreihenfolge ist unvollständig oder enthält ungültige Seitenzahlen. Geben Sie für jede ursprüngliche Seite eine neue Position an.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Diese Dateien sind keine gültigen PDFs und wurden daher nicht hinzugefügt: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Diese Dateien sind passwortgeschützt: {{names}}. Geben Sie ihre Passwörter auf den Dateikarten ein oder entfernen Sie sie und komprimieren Sie dann erneut.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Dieser BentoPDF-Build enthält OCR-Daten nur für {{availableText}}.", + "This PDF does not contain any digital signatures.": "Diese PDF enthält keine digitalen Signaturen.", + "This PDF has no layers (OCG).": "Diese PDF hat keine Ebenen (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Diese PDF ist passwortgeschützt. Geben Sie das aktuelle Passwort ein, um fortzufahren.", + "This document contains pages with different dimensions:": "Dieses Dokument enthält Seiten mit unterschiedlichen Abmessungen:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dieses Dokument enthält 1 Schwärzungsmarkierung, die noch nicht angewendet wurde. Solange eine Markierung nicht angewendet ist, bleibt der Inhalt darunter in der Datei. Alle Markierungen anwenden und herunterladen?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dieses Dokument enthält {{count}} Schwärzungsmarkierungen, die noch nicht angewendet wurden. Solange eine Markierung nicht angewendet ist, bleibt der Inhalt darunter in der Datei. Alle Markierungen anwenden und herunterladen?", + "This feature requires {{name}} to be configured.": "Diese Funktion erfordert, dass {{name}} konfiguriert ist.", + "This file is not a valid PDF.": "Diese Datei ist keine gültige PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Dieses Modul steht unter der AGPL-3.0-Lizenz. Mit der Konfiguration stimmen Sie den Lizenzbedingungen zu.", + "This tool has been disabled": "Dieses Werkzeug wurde deaktiviert", + "This tool is not available in your deployment. Contact your administrator for more information.": "Dieses Werkzeug ist in Ihrer Bereitstellung nicht verfügbar. Wenden Sie sich für weitere Informationen an Ihre Administration.", + "Threshold": "Schwellenwert", + "Tile": "Kachel", + "Tile Gap X": "Kachelabstand X", + "Tile Gap Y": "Kachelabstand Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Zeitstempel", + "Timestamp Failed": "Zeitstempel fehlgeschlagen", + "Tint": "Tönung", + "Title": "Titel", + "To actually fill or change the options, use our PDF Form Filler tool.": "Um die Optionen tatsächlich auszufüllen oder zu ändern, nutzen Sie unser Werkzeug PDF-Formular ausfüllen.", + "Toggle": "Umschalten", + "Toggle style": "Stil umschalten", + "Toggle sync scroll": "Synchrones Scrollen umschalten", + "Tool Unavailable": "Werkzeug nicht verfügbar", + "Tooltip / Help Text": "Tooltip / Hilfetext", + "Top": "Oben", + "Top Center": "Oben Mitte", + "Top Left": "Oben links", + "Top Right": "Oben rechts", + "Top edge in points": "Oberer Rand in Punkten", + "Total Pages": "Seiten insgesamt", + "Transparent Background": "Transparenter Hintergrund", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Probiert für jedes Bild JPEG 2000 gegen JPEG und behält die kleinere Variante.", + "Trim margins from all pages": "Ränder aller Seiten abschneiden", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Vertrauensprüfung: {{trustVerified}}/{{length}} Signaturen anhand des benutzerdefinierten Zertifikats überprüft", + "Trusted": "Vertrauenswürdig", + "Trusted certificate loaded": "Vertrauenswürdiges Zertifikat geladen", + "Tsa Url": "TSA-URL", + "Turns off quality, resolution and every other lossy image step.": "Schaltet Qualität, Auflösung und alle anderen verlustbehafteten Bildschritte ab.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "Die URL muss mit http:// oder https:// beginnen", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Die PDF konnte mit dem angegebenen Passwort nicht entschlüsselt werden.", + "Unable to repair any of the uploaded PDF files.": "Keine der hochgeladenen PDF-Dateien konnte repariert werden.", + "Unembed standard fonts": "Standardschriften nicht einbetten", + "Unembed standard-font look-alikes": "Ersatz für Standardschriften nicht einbetten", + "Unexpected delimiter in content stream": "Unerwartetes Trennzeichen im Inhaltsstream", + "Unexpected reply from the engine.": "Unerwartete Antwort der Engine.", + "Uniform": "Einheitlich", + "Unique Page Sizes": "Eindeutige Seitengrößen", + "Unknown": "Unbekannt", + "Unknown error": "Unbekannter Fehler", + "Unknown error occurred in worker.": "Im Worker ist ein unbekannter Fehler aufgetreten.", + "Unknown error occurred.": "Ein unbekannter Fehler ist aufgetreten.", + "Unlock": "Entsperren", + "Unlock All": "Alle entsperren", + "Unlock Remaining ({{remaining}})": "Übrige entsperren ({{remaining}})", + "Unlocked": "Entsperrt", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} von {{length}} Dateien entsperrt.", + "Unlocking...": "Wird entsperrt...", + "Unresolved optional content reference": "Nicht aufgelöste Referenz auf optionalen Inhalt", + "Unsupported ECDSA curve in signer certificate": "Nicht unterstützte ECDSA-Kurve im Zertifikat des Unterzeichners", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Nicht unterstütztes Bild. Verwenden Sie für das Wasserzeichen ein PNG oder JPG.", + "Unsupported digest OID {{digestOid}}": "Nicht unterstützte Digest-OID {{digestOid}}", + "Unsupported file type: .{{ext}}": "Nicht unterstützter Dateityp: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Nicht unterstützte Signaturalgorithmus-OID {{oid}}", + "Unterminated array or dictionary in content stream": "Nicht abgeschlossenes Array oder Dictionary im Inhaltsstream", + "Unterminated hex string in content stream": "Nicht abgeschlossener Hex-String im Inhaltsstream", + "Unterminated inline image in content stream": "Nicht abgeschlossenes Inline-Bild im Inhaltsstream", + "Unterminated string in content stream": "Nicht abgeschlossener String im Inhaltsstream", + "Unverified: Unsupported Signature Algorithm": "Nicht überprüft: Nicht unterstützter Signaturalgorithmus", + "Updating metadata...": "Metadaten werden aktualisiert...", + "Upload Certificate": "Zertifikat hochladen", + "Upload Comics": "Comics hochladen", + "Upload Documents": "Dokumente hochladen", + "Upload EPUB Files": "EPUB-Dateien hochladen", + "Upload Email Files": "E-Mail-Dateien hochladen", + "Upload FB2 Files": "FB2-Dateien hochladen", + "Upload Images": "Bilder hochladen", + "Upload JSON Files": "JSON-Dateien hochladen", + "Upload MOBI Files": "MOBI-Dateien hochladen", + "Upload Markdown Files": "Markdown-Dateien hochladen", + "Upload ODG Files": "ODG-Dateien hochladen", + "Upload PDFs": "PDFs hochladen", + "Upload PUB Files": "PUB-Dateien hochladen", + "Upload Pages Files": "Pages-Dateien hochladen", + "Upload Presentations": "Präsentationen hochladen", + "Upload SVG Files": "SVG-Dateien hochladen", + "Upload Spreadsheets": "Tabellen hochladen", + "Upload Text Files": "Textdateien hochladen", + "Upload Visio Files": "Visio-Dateien hochladen", + "Upload WPD Files": "WPD-Dateien hochladen", + "Upload WPS Files": "WPS-Dateien hochladen", + "Upload XML Files": "XML-Dateien hochladen", + "Upload XPS Files": "XPS-Dateien hochladen", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Laden Sie eine PDF hoch und klicken Sie auf \"Vorschau erstellen\", um das Broschürenlayout zu sehen", + "Upload images and convert to PDF": "Bilder hochladen und in PDF konvertieren", + "Upload one or more PDF files": "Eine oder mehrere PDF-Dateien hochladen", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Großbuchstaben A-Z, Ziffern 0-9 und - . $ / + % LEERZEICHEN", + "Use same password for all files": "Dasselbe Passwort für alle Dateien verwenden", + "User Password": "Benutzerpasswort", + "VSD to PDF": "VSD zu PDF", + "Valid From": "Gültig ab", + "Valid Signature": "Gültige Signatur", + "Valid Until": "Gültig bis", + "Validating {{n}} of {{length}}: {{name}}": "Überprüfung {{n}} von {{length}}: {{name}}", + "Validating...": "Wird überprüft...", + "Value": "Wert", + "Value (e.g., Marketing)": "Wert (z. B. Marketing)", + "Vertical": "Vertikal", + "Viewer not ready": "Viewer nicht bereit", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Viewer nicht bereit. Laden Sie eine PDF hoch und warten Sie, bis sie fertig geladen ist.", + "Visibility": "Sichtbarkeit", + "Visio Files": "Visio-Dateien", + "WPD to PDF": "WPD zu PDF", + "WPS Files": "WPS-Dateien", + "WPS to PDF": "WPS zu PDF", + "Watermark": "Wasserzeichen", + "Watermark added successfully!": "Wasserzeichen erfolgreich hinzugefügt!", + "Web Crypto API not available in this context": "Die Web Crypto API ist in diesem Kontext nicht verfügbar", + "Web Crypto import/verify failed: {{error}}": "Web-Crypto-Import/Überprüfung fehlgeschlagen: {{error}}", + "WebP": "WebP", + "Whitelist": "Zulassungsliste", + "Width ({{unit}})": "Breite ({{unit}})", + "Word": "Word", + "Word Documents": "Word-Dokumente", + "Word to PDF": "Word zu PDF", + "WordPerfect Files": "WordPerfect-Dateien", + "Worker crashed": "Worker abgestürzt", + "Worker error occurred. Check console for details.": "Im Worker ist ein Fehler aufgetreten. Details finden Sie in der Konsole.", + "Workflow completed": "Workflow abgeschlossen", + "Wrong password": "Falsches Passwort", + "Wrong password for: {{join}}": "Falsches Passwort für: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Falsches Passwort oder Entschlüsselung von \"{{name}}\" fehlgeschlagen.", + "X Position": "X-Position", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XML-Dateien", + "XML to PDF": "XML zu PDF", + "XMP Metadata": "XMP-Metadaten", + "XPS Files": "XPS-Dateien", + "XPS to PDF": "XPS zu PDF", + "Y Position": "Y-Position", + "Year must be between 1900 and 2100": "Das Jahr muss zwischen 1900 und 2100 liegen", + "Yellow": "Gelb", + "Yellowish": "Gelblich", + "You cannot delete the last page of the document.": "Sie können die letzte Seite des Dokuments nicht löschen.", + "Your PDF has been cropped and the download has started.": "Ihre PDF wurde zugeschnitten und der Download hat begonnen.", + "Your PDF has been downloaded successfully.": "Ihre PDF wurde erfolgreich heruntergeladen.", + "Your PDF has been posterized.": "Ihre PDF wurde posterisiert.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Ihre Schwärzungen sind auf die Seiten angewendet, aber diese Datei ist verschlüsselt, daher kann BentoPDF Kopien des geschwärzten Textes in den Eigenschaften, Lesezeichen und Anhängen nicht ebenfalls entfernen. Schwärzen Sie für eine vollständige Bereinigung eine unverschlüsselte Kopie und fügen Sie danach mit \"PDF schützen\" ein Passwort hinzu. Trotzdem herunterladen?", + "Your workflow needs at least one input node and one output node to run.": "Ihr Workflow benötigt mindestens einen Eingabe- und einen Ausgabeknoten, um ausgeführt zu werden.", + "ZIP archive created successfully!": "ZIP-Archiv erfolgreich erstellt!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "z. B. TT/MM/JJJJ HH:MM:ss", + "form": "Formular", + "https://example.com": "https://example.com", + "signature found": "Signatur gefunden", + "signatures found": "Signaturen gefunden", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} Knoten", + "{{count}} nodes": "{{count}} Knoten", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 Seite", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} Seiten", + "{{length}} Files Need a Password": "{{length}} Dateien benötigen ein Passwort", + "{{length}} PDF file(s) selected": "{{length}} PDF-Datei(en) ausgewählt", + "{{length}} PDF files selected": "{{length}} PDF-Dateien ausgewählt", + "{{length}} attachment(s) extracted successfully!": "{{length}} Anhang/Anhänge erfolgreich extrahiert!", + "{{length}} file • {{totalPages}} total pages": "{{length}} Datei • {{totalPages}} Seiten insgesamt", + "{{length}} file(s) attached successfully.": "{{length}} Datei(en) erfolgreich angehängt.", + "{{length}} files • {{totalPages}} total pages": "{{length}} Dateien • {{totalPages}} Seiten insgesamt", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Sie war passwortgeschützt, daher hat die komprimierte Kopie kein Passwort. Nutzen Sie \"PDF schützen\", um erneut eines hinzuzufügen.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} Seiten)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} ist digital signiert und wurde daher unverändert gelassen. Eine Komprimierung würde die Signatur zerstören. Um trotzdem zu komprimieren, aktivieren Sie unter \"Benutzerdefinierte Einstellungen\" die Option \"Inhaltsschutz überschreiben\"; die Signaturen werden dann entfernt.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} ist keine gültige PDF und wurde daher nicht hinzugefügt.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} ist passwortgeschützt. Geben Sie das Passwort auf der Dateikarte ein und komprimieren Sie dann erneut.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (S. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Seitenanzahl konnte nicht geladen werden", + "{{size}} • Loading pages...": "{{size}} • Seiten werden geladen...", + "{{size}} • Loading...": "{{size}} • Wird geladen...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} Seiten", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} Seiten", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} Seiten", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} Seiten", + "{{size}} • {{value}} pages": "{{size}} • {{value}} Seiten", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF(s) erfolgreich entschlüsselt.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF(s) erfolgreich linearisiert.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} Seiten → {{numSheets}} Ausgabeblätter", + "{{validCount}} valid": "{{validCount}} gültig", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 Seite", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} Seiten" +} diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 2ef0d526..d194046f 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Open main menu", "language": "Language", "searchLanguage": "Search language…", - "noLanguagesFound": "No languages found" + "noLanguagesFound": "No languages found", + "breadcrumb": "Breadcrumb" }, "donation": { "message": "Love BentoPDF? Help us keep it free and open source!", @@ -236,6 +237,10 @@ "aboutUs": "About Us", "faqLink": "FAQ", "contactUs": "Contact Us", + "tools": "Tools", + "pdfConverter": "PDF Converter", + "pdfSecurity": "PDF Security", + "mergeSplit": "Merge and Split PDF", "legal": "Legal", "termsAndConditions": "Terms and Conditions", "privacyPolicy": "Privacy Policy", diff --git a/public/locales/en/tools.json b/public/locales/en/tools.json index 609be47d..1ef00543 100644 --- a/public/locales/en/tools.json +++ b/public/locales/en/tools.json @@ -106,7 +106,7 @@ "tipRedoZ": "Redo (⇧⌘Z)", "tipFileDetails": "File details", "tipEditExistingContent": "Edit existing content", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "What the Edit tool touches — narrow the scope on busy pages", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "What the Edit tool touches. Narrow the scope on busy pages.", "tipClickThePageToAddATextBox": "Click the page to add a text box", "tipSpellCheckLanguage": "Spell-check language", "tipFindAndReplace": "Find & replace", diff --git a/public/locales/es/common.json b/public/locales/es/common.json index ce3d81c0..19bfed2c 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Abrir menú principal", "language": "Idioma", "searchLanguage": "Buscar idioma…", - "noLanguagesFound": "No se encontraron idiomas" + "noLanguagesFound": "No se encontraron idiomas", + "breadcrumb": "Ruta de navegación" }, "donation": { "message": "¿Te encanta BentoPDF? ¡Ayúdanos a mantenerlo gratis y de código abierto!", @@ -230,12 +231,16 @@ "buyMeCoffee": "Cómprame un Café" }, "footer": { - "copyright": "© 2025 BentoPDF. Todos los derechos reservados.", + "copyright": "© 2026 BentoPDF. Todos los derechos reservados.", "version": "Versión", "company": "Empresa", "aboutUs": "Acerca de Nosotros", "faqLink": "Preguntas Frecuentes", "contactUs": "Contáctanos", + "tools": "Herramientas", + "pdfConverter": "Convertidor de PDF", + "pdfSecurity": "Seguridad de PDF", + "mergeSplit": "Unir y dividir PDF", "legal": "Legal", "termsAndConditions": "Términos y Condiciones", "privacyPolicy": "Política de Privacidad", diff --git a/public/locales/es/tools.json b/public/locales/es/tools.json index d5008004..7b0cadad 100644 --- a/public/locales/es/tools.json +++ b/public/locales/es/tools.json @@ -27,7 +27,22 @@ "name": "Fusionar PDF", "subtitle": "Combina múltiples PDFs en un solo archivo. Preserva Marcadores.", "retainPageLabels": "Conservar las etiquetas de página originales de cada archivo", - "retainPageLabelsHint": "Desactivado (predeterminado): el PDF combinado usa numeración natural 1–N. Activado: se conservan las etiquetas de página originales de cada archivo (puede producir etiquetas duplicadas)." + "retainPageLabelsHint": "Desactivado (predeterminado): el PDF combinado usa numeración natural 1–N. Activado: se conservan las etiquetas de página originales de cada archivo (puede producir etiquetas duplicadas).", + "removeDuplicateFonts": "Eliminar fuentes duplicadas", + "alert": { + "thumbnailError": "No se pudieron generar las miniaturas de las páginas", + "noSelection": "No hay archivos ni páginas seleccionados para combinar.", + "mergeSuccess": "¡PDFs combinados correctamente!", + "mergeFailed": "Error al combinar los PDFs.", + "mergeError": "Error al combinar los PDFs. Comprueba que todos los archivos sean válidos y no estén protegidos con contraseña.", + "workerError": "Se produjo un error inesperado durante la combinación.", + "loadError": "No se pudieron cargar uno o más archivos PDF" + }, + "loader": { + "renderingPreviews": "Generando vistas previas de las páginas...", + "merging": "Combinando PDFs...", + "loadingDocuments": "Cargando documentos PDF..." + } }, "splitPdf": { "name": "Dividir PDF", @@ -172,20 +187,20 @@ "subtitle": "Recorta los márgenes de cada página en tu PDF." }, "extractPages": { - "name": "Extraer Páginas", + "name": "Extraer páginas", "subtitle": "Guarda una selección de páginas como nuevos archivos." }, "duplicateOrganize": { - "name": "Duplicar y Organizar", + "name": "Duplicar y organizar", "subtitle": "Duplica, reordena y elimina páginas.", "saveChanges": "Guardar cambios" }, "deletePages": { - "name": "Eliminar Páginas", + "name": "Eliminar páginas", "subtitle": "Elimina páginas específicas de tu documento." }, "editBookmarks": { - "name": "Editar Marcadores", + "name": "Editar marcadores", "subtitle": "Agrega, edita, importa, elimina y extrae marcadores PDF.", "autoExtractExisting": "Extraer automáticamente marcadores existentes", "importSectionTitle": "O importar marcadores", @@ -196,7 +211,7 @@ "orDragHere": "o arrastra aquí" }, "tableOfContents": { - "name": "Tabla de Contenidos", + "name": "Índice", "subtitle": "Genera una página de tabla de contenidos desde los marcadores PDF.", "titleLabel": "Título de TDC", "fontSize": "Tamaño de fuente", @@ -212,7 +227,7 @@ "workerErrorOccurred": "Ocurrió un error en el worker. Consulta la consola para más detalles." }, "pageNumbers": { - "name": "Números de Página", + "name": "Números de página", "subtitle": "Inserta números de página en tu documento." }, "addPageLabels": { @@ -279,16 +294,16 @@ "subtitle": "Añadir números Bates secuenciales en uno o más archivos PDF." }, "addWatermark": { - "name": "Agregar Marca de Agua", + "name": "Agregar marca de agua", "subtitle": "Estampa texto o una imagen sobre tus páginas PDF.", "applyToAllPages": "Aplicar a todas las páginas" }, "headerFooter": { - "name": "Encabezado y Pie de Página", + "name": "Encabezado y pie de página", "subtitle": "Agrega texto en la parte superior e inferior de las páginas." }, "invertColors": { - "name": "Invertir Colores", + "name": "Invertir colores", "subtitle": "Crea una versión en \"modo oscuro\" de tu PDF." }, "scannerEffect": { @@ -323,15 +338,15 @@ "processButton": "Aplicar ajustes de color" }, "backgroundColor": { - "name": "Color de Fondo", + "name": "Color de fondo", "subtitle": "Cambia el color de fondo de tu PDF." }, "changeTextColor": { - "name": "Cambiar Color de Texto", + "name": "Cambiar color de texto", "subtitle": "Cambia el color del texto en tu PDF." }, "addStamps": { - "name": "Agregar Sellos", + "name": "Agregar sellos", "subtitle": "Agrega sellos de imagen a tu PDF usando la barra de herramientas de anotación.", "usernameLabel": "Nombre de Usuario del Sello", "usernamePlaceholder": "Ingresa tu nombre (para sellos)", @@ -339,24 +354,24 @@ "saveButton": "Guardar PDF sellado" }, "removeAnnotations": { - "name": "Eliminar Anotaciones", + "name": "Eliminar anotaciones", "subtitle": "Elimina comentarios, resaltados y enlaces." }, "pdfFormFiller": { - "name": "Rellenar Formularios PDF", + "name": "Rellenar formularios PDF", "subtitle": "Rellena formularios directamente en el navegador. También soporta formularios XFA.", "uploadHint": "Sube un PDF con campos de formulario. Rellénalos directamente en el visor de abajo, luego haz clic en el botón para guardar y descargar el formulario completado. También admite formularios XFA.", "xfaNoteTitle": "Nota sobre formularios XFA:", "xfaNoteDescription": "XFA (XML Forms Architecture) es un formato heredado solo compatible con ciertos visores de PDF como BentoPDF y Firefox. Si abres un PDF XFA en otro software y ves páginas en blanco o ningún campo de formulario, significa que ese visor no admite XFA. Para ver y rellenar correctamente formularios XFA, usa Firefox o el llenador de formularios de BentoPDF." }, "createPdfForm": { - "name": "Crear Formulario PDF", + "name": "Crear formulario PDF", "subtitle": "Crea formularios PDF rellenables con campos de texto arrastrables.", "orSeparator": "O", "createBlankPdf": "Crear PDF en blanco" }, "removeBlankPages": { - "name": "Eliminar Páginas en Blanco", + "name": "Eliminar páginas en blanco", "subtitle": "Detecta y elimina automáticamente páginas en blanco.", "sensitivityHint": "Mayor = más estricto, solo páginas completamente en blanco. Menor = permite páginas con algo de contenido." }, @@ -503,7 +518,8 @@ "noFile": "Sin archivo", "noFileExplanation": "Por favor sube primero un archivo PDF.", "conversionSuccess": "¡PDF convertido a TIFF correctamente!", - "conversionError": "Error al convertir PDF a TIFF. El archivo podría estar dañado." + "conversionError": "Error al convertir PDF a TIFF. El archivo podría estar dañado.", + "conversionOutOfMemory": "El navegador se quedó sin memoria durante la conversión. Prueba con un PPP más bajo o desmarca la opción de TIFF multipágina para convertir las páginas una a una." } }, "pdfToCbz": { @@ -537,7 +553,7 @@ } }, "pdfToGreyscale": { - "name": "PDF a Escala de Grises", + "name": "PDF a escala de grises", "subtitle": "Convierte todos los colores a blanco y negro." }, "pdfToJson": { @@ -613,7 +629,7 @@ "multiLanguageSupportDescription": "Selecciona varios idiomas para documentos que contengan contenido en idiomas mixtos." }, "alternateMerge": { - "name": "Alternar y Mezclar Páginas", + "name": "Alternar y mezclar páginas", "subtitle": "Fusiona PDFs alternando páginas de cada PDF. Preserva Marcadores.", "retainPageLabels": "Conservar las etiquetas de página originales de cada archivo", "retainPageLabelsHint": "Desactivado (predeterminado): el PDF combinado usa numeración natural 1–N. Activado: se conservan las etiquetas de página originales de cada archivo (puede producir etiquetas duplicadas)." @@ -664,27 +680,27 @@ "faqBackOrderAnswer": "Depende de cómo se colocó la pila en la segunda pasada. Girar la pila entera produce reversos en orden inverso, que es la opción predeterminada. Si tu escáner los devolvió en el mismo orden que los anversos, elige mantener el bloque tal cual." }, "addAttachments": { - "name": "Agregar Adjuntos", + "name": "Agregar adjuntos", "subtitle": "Incrusta uno o más archivos en tu PDF." }, "extractAttachments": { - "name": "Extraer Adjuntos", + "name": "Extraer adjuntos", "subtitle": "Extrae todos los archivos incrustados de PDF(s) como un ZIP." }, "editAttachments": { - "name": "Editar Adjuntos", + "name": "Editar adjuntos", "subtitle": "Ve o elimina adjuntos en tu PDF." }, "dividePages": { - "name": "Dividir Páginas", + "name": "Dividir páginas", "subtitle": "Divide páginas horizontal o verticalmente." }, "addBlankPage": { - "name": "Agregar Página en Blanco", + "name": "Agregar página en blanco", "subtitle": "Inserta una página vacía en cualquier lugar de tu PDF." }, "reversePages": { - "name": "Invertir Páginas", + "name": "Invertir páginas", "subtitle": "Invierte el orden de todas las páginas en tu documento." }, "rotatePdf": { @@ -692,7 +708,7 @@ "subtitle": "Gira páginas en incrementos de 90 grados." }, "rotateCustom": { - "name": "Rotar por Grados Personalizados", + "name": "Rotar por grados personalizados", "subtitle": "Rota páginas por cualquier ángulo personalizado." }, "nUpPdf": { @@ -700,15 +716,15 @@ "subtitle": "Organiza múltiples páginas en una sola hoja." }, "combineToSinglePage": { - "name": "Combinar en Una Sola Página", + "name": "Combinar en una sola página", "subtitle": "Une todas las páginas en un desplazamiento continuo." }, "viewMetadata": { - "name": "Ver Metadatos", + "name": "Ver metadatos", "subtitle": "Inspecciona las propiedades ocultas de tu PDF." }, "editMetadata": { - "name": "Editar Metadatos", + "name": "Editar metadatos", "subtitle": "Cambia el autor, título y otras propiedades." }, "pdfsToZip": { @@ -764,7 +780,7 @@ "subtitle": "Divide una página grande en múltiples páginas más pequeñas." }, "fixPageSize": { - "name": "Fijar Tamaño de Página", + "name": "Ajustar tamaño de página", "subtitle": "Estandariza todas las páginas a un tamaño uniforme." }, "linearizePdf": { @@ -772,11 +788,11 @@ "subtitle": "Optimiza el PDF para visualización web rápida." }, "pageDimensions": { - "name": "Dimensiones de Página", + "name": "Dimensiones de página", "subtitle": "Analiza el tamaño, orientación y unidades de página." }, "removeRestrictions": { - "name": "Eliminar Restricciones", + "name": "Eliminar restricciones", "subtitle": "Elimina la protección por contraseña y las restricciones de seguridad asociadas con archivos PDF firmados digitalmente." }, "repairPdf": { @@ -800,11 +816,11 @@ "subtitle": "Hace que los campos de formulario y las anotaciones no sean editables." }, "removeMetadata": { - "name": "Eliminar Metadatos", + "name": "Eliminar metadatos", "subtitle": "Elimina datos ocultos de tu PDF." }, "changePermissions": { - "name": "Cambiar Permisos", + "name": "Cambiar permisos", "subtitle": "Establece o cambia los permisos de usuario en un PDF." }, "odtToPdf": { @@ -974,7 +990,7 @@ "subtitle": "Convierte cada página de un archivo PDF en un gráfico vectorial escalable (SVG) para calidad perfecta a cualquier tamaño." }, "extractTables": { - "name": "Extraer Tablas de PDF", + "name": "Extraer tablas de PDF", "subtitle": "Extrae tablas de archivos PDF y exporta como CSV, JSON o Markdown." }, "pdfToCsv": { @@ -986,15 +1002,14 @@ "subtitle": "Extrae tablas de PDF y convierte a formato Excel (XLSX)." }, "pdfToText": { - "name": "PDF a Texto", + "name": "PDF a texto", "subtitle": "Extrae texto de archivos PDF y guarda como texto plano (.txt). Soporta múltiples archivos.", "noteLabel": "Nota:", "noteText": "Esta herramienta funciona SOLO con PDF creados digitalmente. Para documentos escaneados o PDF basados en imágenes, usa nuestra herramienta OCR PDF.", - "convertButton": "Extraer Texto", - "note": "Esta herramienta funciona SOLO con PDFs creados digitalmente. Para documentos escaneados o PDFs basados en imágenes, usa nuestra herramienta OCR PDF en su lugar." + "convertButton": "Extraer Texto" }, "digitalSignPdf": { - "name": "Firma Digital PDF", + "name": "Firma digital PDF", "pageTitle": "Firma Digital PDF - Agregar Firma Criptográfica | BentoPDF", "subtitle": "Agrega una firma digital criptográfica a tu PDF usando certificados X.509. Soporta formatos PKCS#12 (.pfx, .p12) y PEM. Tu clave privada nunca sale de tu navegador.", "certificateSection": "Certificado", @@ -1012,7 +1027,7 @@ "location": "Ubicación", "locationPlaceholder": "ej., Madrid, España", "contactInfo": "Información de Contacto", - "contactPlaceholder": "ej., email@ejemplo.com", + "contactPlaceholder": "ej., email@example.com", "visibleSignature": "Firma visible", "visibleSignatureDescription": "Cuando está habilitado, aparece un cuadro de firma visible en el PDF. Puedes subir una imagen/logo o añadir texto. Si no se proporciona ninguno, se mostrará automáticamente el nombre del firmante del certificado.", "signatureImage": "Imagen/Logo de firma (opcional)", @@ -1080,7 +1095,7 @@ "internetRequiredDescription": "La firma puede necesitar obtener información de la cadena de certificados del servidor de tu emisor para validar la firma." }, "validateSignaturePdf": { - "name": "Validar Firma PDF", + "name": "Validar firma PDF", "pageTitle": "Validar Firma PDF - Verificar Firmas Digitales | BentoPDF", "subtitle": "Verifica firmas digitales en tus archivos PDF. Comprueba la validez del certificado, ve los detalles del firmante y confirma la integridad del documento." }, @@ -1100,7 +1115,7 @@ "convertButton": "Convertir a PDF" }, "fontToOutline": { - "name": "Fuente a Contorno", + "name": "Fuente a contorno", "subtitle": "Convierte todas las fuentes a contornos vectoriales para una renderización consistente en todos los dispositivos." }, "deskewPdf": { @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "¡Por supuesto! Todo el procesamiento ocurre en su navegador. Sus archivos nunca abandonan su dispositivo, garantizando total privacidad." }, "unlockPdf": { - "name": "Descifrar PDF", + "name": "Desbloquear PDF", "subtitle": "Desbloquea PDF eliminando la protección por contraseña." }, "protectPdf": { - "name": "Cifrar PDF", + "name": "Proteger PDF", "subtitle": "Bloquea tu PDF agregando una contraseña." } } diff --git a/public/locales/es/ui.json b/public/locales/es/ui.json new file mode 100644 index 00000000..d723ef2c --- /dev/null +++ b/public/locales/es/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(corregido)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} más...", + "- Error parsing XMP XML. Displaying raw. -": "- Error al analizar el XML de XMP. Mostrando datos sin procesar. -", + "- No Info Dictionary data found -": "- No se encontraron datos del diccionario Info -", + "- No XMP metadata found -": "- No se encontraron metadatos XMP -", + "- No interactive form fields found -": "- No se encontraron campos de formulario interactivos -", + "- No parseable XMP properties found -": "- No se encontraron propiedades XMP analizables -", + "-- Select existing group --": "-- Selecciona un grupo existente --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1° (Muy sensible)", + "0.5° (Default)": "0.5° (Predeterminado)", + "1.0° (Normal)": "1.0° (Normal)", + "100 (Fast)": "100 (Rápido)", + "150 (Default)": "150 (Predeterminado)", + "1x2 (Booklet)": "1x2 (Folleto)", + "2.0° (Less Sensitive)": "2.0° (Menos sensible)", + "200 (Better)": "200 (Mejor)", + "200 (Good)": "200 (Buena)", + "2x2 (4-up)": "2x2 (4 por hoja)", + "2x4 (8-up)": "2x4 (8 por hoja)", + "300 (Best Quality)": "300 (Mejor calidad)", + "300 (Print)": "300 (Impresión)", + "4x4 (16-up)": "4x4 (16 por hoja)", + "600 (High Quality)": "600 (Alta calidad)", + "72 (Screen)": "72 (Pantalla)", + "90° Clockwise": "90° en sentido horario", + "90° Counter-clockwise": "90° en sentido antihorario", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Ya existe un campo llamado \"{{fieldName}}\". Cambia el nombre de este campo para que sea único antes de descargar.", + "A new version of BentoPDF is available. Reload to update?": "Hay una nueva versión de BentoPDF disponible. ¿Recargar para actualizar?", + "A single PDF file": "Un solo archivo PDF", + "A template with this name already exists.": "Ya existe una plantilla con este nombre.", + "ASCII characters (letters, numbers, symbols)": "Caracteres ASCII (letras, números, símbolos)", + "Action": "Acción", + "Add Blank Page": "Agregar página en blanco", + "Add Bookmark": "Agregar marcador", + "Add Child Bookmark": "Agregar marcador secundario", + "Add Child Layer": "Agregar capa secundaria", + "Add More Comics": "Agregar más cómics", + "Add More Documents": "Agregar más documentos", + "Add More EPUB Files": "Agregar más archivos EPUB", + "Add More Email Files": "Agregar más archivos de correo electrónico", + "Add More FB2 Files": "Agregar más archivos FB2", + "Add More Files": "Agregar más archivos", + "Add More Images": "Agregar más imágenes", + "Add More JSON Files": "Agregar más archivos JSON", + "Add More MOBI Files": "Agregar más archivos MOBI", + "Add More Markdown Files": "Agregar más archivos Markdown", + "Add More ODG Files": "Agregar más archivos ODG", + "Add More PUB Files": "Agregar más archivos PUB", + "Add More Pages Files": "Agregar más archivos de Pages", + "Add More Presentations": "Agregar más presentaciones", + "Add More SVG Files": "Agregar más archivos SVG", + "Add More Spreadsheets": "Agregar más hojas de cálculo", + "Add More Text Files": "Agregar más archivos de texto", + "Add More Visio Files": "Agregar más archivos de Visio", + "Add More WPD Files": "Agregar más archivos WPD", + "Add More WPS Files": "Agregar más archivos WPS", + "Add More XML Files": "Agregar más archivos XML", + "Add More XPS Files": "Agregar más archivos XPS", + "Add a new layer to get started!": "¡Agrega una capa nueva para empezar!", + "Add a text box": "Agregar un cuadro de texto", + "Add an RFC 3161 document timestamp": "Agregar una marca de tiempo de documento RFC 3161", + "Add an image": "Agregar una imagen", + "Add at least one node to run the workflow.": "Agrega al menos un nodo para ejecutar el flujo de trabajo.", + "Add child": "Agregar secundario", + "Add child layer": "Agregar capa secundaria", + "Add header and footer text": "Agregar texto de encabezado y pie de página", + "Add page numbers": "Agregar números de página", + "Add searchable text layer via OCR": "Agregar capa de texto con búsqueda mediante OCR", + "Add text watermark": "Agregar marca de agua de texto", + "Add/Edit/Extract Attachments": "Agregar/Editar/Extraer adjuntos", + "Added": "Añadido", + "Added \"{{afterText}}\"": "Se agregó \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Imagen agregada ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "¡Se agregó {{insertCount}} página en blanco correctamente!", + "Added {{insertCount}} blank pages successfully!": "¡Se agregaron {{insertCount}} páginas en blanco correctamente!", + "Adding header & footer...": "Agregando encabezado y pie de página...", + "Adding page numbers...": "Agregando números de página...", + "Adding watermark...": "Agregando marca de agua...", + "Adding {{insertCount}} blank page...": "Agregando {{insertCount}} página en blanco...", + "Adding {{insertCount}} blank pages...": "Agregando {{insertCount}} páginas en blanco...", + "Adding {{name}} ({{n}}/{{length}})...": "Agregando {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Ajustar colores", + "Adjust brightness, contrast, and colors": "Ajusta el brillo, el contraste y los colores", + "Advanced": "Avanzado", + "Advanced Feature Required": "Se requiere una función avanzada", + "Advanced Settings": "Ajustes avanzados", + "After Page": "Después de la página", + "After Page...": "Después de la página...", + "Align Objects": "Alinear objetos", + "Alignment": "Alineación", + "All": "Todo", + "All files repaired successfully!": "¡Todos los archivos se repararon correctamente!", + "Alternate Merge": "Combinación alterna", + "Alternating and mixing pages...": "Alternando y mezclando páginas...", + "Always resample to that resolution": "Remuestrear siempre a esa resolución", + "An error occurred during compression. Error: {{error}}": "Ocurrió un error durante la compresión. Error: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Ocurrió un error durante la conversión. Error: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Ocurrió un error durante la conversión. Error: {{message}}", + "An error occurred during cropping.": "Ocurrió un error durante el recorte.", + "An error occurred during extraction. Error: {{error}}": "Ocurrió un error durante la extracción. Error: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Ocurrió un error durante la rasterización. Error: {{error}}", + "An error occurred during sanitization: {{msg}}": "Ocurrió un error durante el saneamiento: {{msg}}", + "An error occurred while combining pages.": "Ocurrió un error al combinar las páginas.", + "An error occurred while creating the N-Up PDF.": "Ocurrió un error al crear el PDF N-Up.", + "An error occurred while creating the booklet.": "Ocurrió un error al crear el folleto.", + "An error occurred while dividing the PDF.": "Ocurrió un error al dividir el PDF.", + "An error occurred while mixing the PDFs.": "Ocurrió un error al mezclar los PDF.", + "An error occurred while standardizing pages.": "Ocurrió un error al estandarizar las páginas.", + "An error occurred while trying to remove metadata.": "Ocurrió un error al intentar eliminar los metadatos.", + "An error occurred: {{error}}": "Ocurrió un error: {{error}}", + "An error occurred: {{error}}.": "Ocurrió un error: {{error}}.", + "An owner password is required when setting permissions": "Se requiere una contraseña de propietario para establecer permisos", + "An unexpected error occurred during the repair process.": "Ocurrió un error inesperado durante el proceso de reparación.", + "An unexpected error occurred.": "Ocurrió un error inesperado.", + "Analyzing data structure...": "Analizando la estructura de datos...", + "Analyzing full PDF metadata...": "Analizando los metadatos completos del PDF...", + "Analyzing signatures...": "Analizando firmas...", + "Angle": "Ángulo", + "Annotations removed successfully!": "¡Anotaciones eliminadas correctamente!", + "Any text, URL, or data": "Cualquier texto, URL o dato", + "Application": "Aplicación", + "Apply a digital signature to PDF": "Aplicar una firma digital al PDF", + "Apply and download": "Aplicar y descargar", + "Apply redactions?": "¿Aplicar las redacciones?", + "Apply scanner simulation effect": "Aplicar efecto de simulación de escáner", + "Applying Bates numbers...": "Aplicando números Bates...", + "Applying color adjustments...": "Aplicando ajustes de color...", + "Applying crop...": "Aplicando recorte...", + "Applying redactions...": "Aplicando redacciones...", + "Applying rotations...": "Aplicando rotaciones...", + "Applying scanner effect...": "Aplicando efecto de escáner...", + "Applying timestamp...": "Aplicando marca de tiempo...", + "Applying {{replace}}...": "Aplicando {{replace}}...", + "Archive contains an oversized image entry.": "El archivo contiene una imagen demasiado grande.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "El archivo tiene demasiadas imágenes (máx. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "El archivo es demasiado grande al descomprimirse.", + "Are you sure you want to reset? All your work will be lost.": "¿Seguro que quieres restablecer? Perderás todo tu trabajo.", + "Area (Coordinates)": "Área (coordenadas)", + "Area ({{unit}}²)": "Área ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman y Courier New se asignan a sus equivalentes integrados. Solo se aplica cuando es seguro.", + "Arrange multiple pages per sheet": "Organiza varias páginas por hoja", + "Arrange pages for booklet printing": "Organiza las páginas para imprimir un folleto", + "Aspect Ratio": "Relación de aspecto", + "At least one PDF document is required for export.": "Se requiere al menos un documento PDF para exportar.", + "At least two valid PDFs are required.": "Se requieren al menos dos PDF válidos.", + "Attaching files to PDF...": "Adjuntando archivos al PDF...", + "Attachments updated successfully!": "¡Adjuntos actualizados correctamente!", + "Author": "Autor", + "Auto (Keep Original)": "Automático (mantener original)", + "Back": "Reverso", + "Back to Home": "Volver al inicio", + "Background Color": "Color de fondo", + "Background color changed successfully!": "¡Color de fondo cambiado correctamente!", + "Barcode": "Código de barras", + "Barcode Format": "Formato de código de barras", + "Barcode Value": "Valor del código de barras", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "¡Números Bates aplicados correctamente! ({{batesStart}} a {{n}})", + "Beginning": "Al principio", + "Binarize": "Binarizar", + "Blank Position": "Posición de la página en blanco", + "Blue": "Azul", + "Blur": "Desenfoque", + "Bold": "Negrita", + "Bold & Italic": "Negrita y cursiva", + "Booklet": "Folleto", + "Booklet created with {{numSheets}} sheets!": "¡Folleto creado con {{numSheets}} hojas!", + "Bookmarks imported from JSON!": "¡Marcadores importados desde JSON!", + "Bookmarks page": "Página de marcadores", + "Border": "Borde", + "Border Color": "Color del borde", + "Bottom": "Abajo", + "Bottom Center": "Abajo al centro", + "Bottom Left": "Abajo a la izquierda", + "Bottom Right": "Abajo a la derecha", + "Bottom edge in points": "Borde inferior en puntos", + "Brightness": "Brillo", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Se omitieron Brotli y la rasterización para mantener el formato PDF/A.", + "Brotli compression (PDF 2.0)": "Compresión Brotli (PDF 2.0)", + "Browser Note:": "Nota del navegador:", + "Building new PDF...": "Creando nuevo PDF...", + "Building page pairing model...": "Creando el modelo de emparejamiento de páginas...", + "Button": "Botón", + "ByteRange does not start at the beginning of the file": "ByteRange no comienza al principio del archivo", + "ByteRange out of bounds": "ByteRange fuera de los límites", + "CBZ to PDF": "CBZ a PDF", + "CSV Loaded": "CSV cargado", + "CSV file is empty": "El archivo CSV está vacío", + "Cancel": "Cancelar", + "Cannot Delete": "No se puede eliminar", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "No se puede acceder a los controles del visor. Usa el botón Descargar de la barra de herramientas del visor de PDF de arriba.", + "Cannot delete all pages": "No se pueden eliminar todas las páginas", + "Cannot delete all pages.": "No se pueden eliminar todas las páginas.", + "Canvas context failed": "Falló el contexto del lienzo", + "Canvas context unavailable": "Contexto del lienzo no disponible", + "Canvas toBlob conversion failed.": "Falló la conversión de canvas toBlob.", + "Canvas toBlob failed": "Falló canvas toBlob", + "Center": "Centro", + "Certificate (.pfx, .p12, .pem)": "Certificado (.pfx, .p12, .pem)", + "Certificate Expired": "Certificado vencido", + "Certificate Password": "Contraseña del certificado", + "Certificate unlocked": "Certificado desbloqueado", + "Change Certificate": "Cambiar certificado", + "Change background color": "Cambiar color de fondo", + "Changing background color...": "Cambiando el color de fondo...", + "Changing text color...": "Cambiando el color del texto...", + "Character": "Carácter", + "Checked State": "Estado marcado", + "Choose a valid page range.": "Elige un rango de páginas válido.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Elige uno de los idiomas incluidos o reconstruye el paquete aislado con el idioma que falta agregado a --ocr-languages.", + "Cleanup": "Limpieza", + "Click on PDF to Pick Location": "Haz clic en el PDF para elegir la ubicación", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Haz clic en el botón de arriba y luego en el PDF donde quieras que salte el marcador", + "Click to Upload Image": "Haz clic para subir una imagen", + "Clicking this field in the PDF will open a file picker to upload an image.": "Al hacer clic en este campo del PDF se abrirá un selector de archivos para subir una imagen.", + "Clip invisible parts of images": "Recortar las partes invisibles de las imágenes", + "Close": "Cerrar", + "Close (Esc)": "Cerrar (Esc)", + "Close panel": "Cerrar panel", + "Closes tab": "Cierra la pestaña", + "Closes window": "Cierra la ventana", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (marcadores y metadatos)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF no está configurado. Configúralo en los ajustes de WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF produjo un archivo descifrado vacío.", + "CoherentPDF: not configured.": "CoherentPDF: no configurado.", + "Color": "Color", + "Color adjustments applied successfully!": "¡Ajustes de color aplicados correctamente!", + "Colors inverted successfully!": "¡Colores invertidos correctamente!", + "Cols": "Columnas", + "Combine multiple PDFs into one": "Combina varios PDF en uno", + "Combine to Single Page": "Combinar en una sola página", + "Combining pages...": "Combinando páginas...", + "Comic Archives": "Archivos de cómics", + "Comments and markup become part of the page. Form fields and links keep working.": "Los comentarios y las marcas pasan a formar parte de la página. Los campos de formulario y los enlaces siguen funcionando.", + "Complete": "Completado", + "Complete!": "¡Completado!", + "Compress": "Comprimir", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Se comprimieron {{compressedCount}} PDF. El tamaño total se redujo de {{totalOriginalSize}} a {{totalCompressedSize}} (ahorro del {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Se comprimieron {{compressedCount}} PDF. Tamaño total: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Comprimiendo varios PDF...", + "Compressing to {{size}}...": "Comprimiendo a {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Comprimiendo {{n}}/{{length}}: {{name}}...", + "Compressing...": "Comprimiendo...", + "Compression Complete": "Compresión completada", + "Compression Finished": "Compresión finalizada", + "Compression Level": "Nivel de compresión", + "Configure": "Configurar", + "Confirm": "Confirmar", + "Confirm Action": "Confirmar acción", + "Conformance": "Conformidad", + "Connected": "Conectado", + "Contact Info": "Información de contacto", + "Content": "Contenido", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "El hash del contenido no coincide con el atributo messageDigest: el PDF se modificó después de firmarse", + "Contrast": "Contraste", + "Conversion Complete": "Conversión completada", + "Conversion Error": "Error de conversión", + "Conversion engine ready!": "¡Motor de conversión listo!", + "Conversion failed: could not create PDF/A definition": "Falló la conversión: no se pudo crear la definición PDF/A", + "Convert Apple Pages documents to PDF": "Convierte documentos de Apple Pages a PDF", + "Convert EPUB ebooks to PDF": "Convierte libros electrónicos EPUB a PDF", + "Convert Excel spreadsheets to PDF": "Convierte hojas de cálculo de Excel a PDF", + "Convert FB2 e-books to PDF": "Convierte libros electrónicos FB2 a PDF", + "Convert JSON files to PDF": "Convierte archivos JSON a PDF", + "Convert MOBI e-books to PDF": "Convierte libros electrónicos MOBI a PDF", + "Convert Markdown files to PDF": "Convierte archivos Markdown a PDF", + "Convert Microsoft Publisher to PDF": "Convierte Microsoft Publisher a PDF", + "Convert OpenDocument Graphics to PDF": "Convierte gráficos OpenDocument a PDF", + "Convert PDF pages to SVG": "Convierte páginas de PDF a SVG", + "Convert PDF pages to images (ZIP)": "Convierte páginas de PDF a imágenes (ZIP)", + "Convert PDF tables to CSV": "Convierte tablas de PDF a CSV", + "Convert PDF tables to Excel": "Convierte tablas de PDF a Excel", + "Convert PDF to Markdown text": "Convierte PDF a texto Markdown", + "Convert PDF to PDF/A for archiving": "Convierte PDF a PDF/A para archivado", + "Convert PDF to Word document": "Convierte PDF a documento de Word", + "Convert PowerPoint presentations to PDF": "Convierte presentaciones de PowerPoint a PDF", + "Convert SVG files to PDF": "Convierte archivos SVG a PDF", + "Convert To Grayscale": "Convertir a escala de grises", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Convierte diagramas de Visio (VSD/VSDX) a PDF", + "Convert WPS Office documents to PDF": "Convierte documentos de WPS Office a PDF", + "Convert Word documents to PDF": "Convierte documentos de Word a PDF", + "Convert WordPerfect documents to PDF": "Convierte documentos de WordPerfect a PDF", + "Convert XML documents to PDF": "Convierte documentos XML a PDF", + "Convert XPS/OXPS documents to PDF": "Convierte documentos XPS/OXPS a PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Convierte archivos de cómics (CBZ/CBR) a PDF", + "Convert email files (.eml, .msg) to PDF": "Convierte archivos de correo (.eml, .msg) a PDF", + "Convert fonts to vector outlines": "Convierte fuentes a contornos vectoriales", + "Convert plain text to PDF": "Convierte texto sin formato a PDF", + "Convert to grayscale": "Convertir a escala de grises", + "Convert to greyscale": "Convertir a escala de grises", + "Convert to image-based PDF": "Convertir a PDF basado en imágenes", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "¡Se convirtieron {{length}} archivos ({{totalPages}} páginas) a SVG!", + "Converted {{pageCount}} pages to SVG!": "¡Se convirtieron {{pageCount}} páginas a SVG!", + "Converter not initialized": "Convertidor no inicializado", + "Converting BMP to PDF...": "Convirtiendo BMP a PDF...", + "Converting HEIC to PDF...": "Convirtiendo HEIC a PDF...", + "Converting TIFF to PDF...": "Convirtiendo TIFF a PDF...", + "Converting emails...": "Convirtiendo correos...", + "Converting files...": "Convirtiendo archivos...", + "Converting fonts to outlines...": "Convirtiendo fuentes a contornos...", + "Converting images to PDF...": "Convirtiendo imágenes a PDF...", + "Converting multiple PDFs to PDF/A...": "Convirtiendo varios PDF a PDF/A...", + "Converting multiple RTF files to PDF...": "Convirtiendo varios archivos RTF a PDF...", + "Converting multiple files...": "Convirtiendo varios archivos...", + "Converting page {{n}} of {{pageCount}}...": "Convirtiendo la página {{n}} de {{pageCount}}...", + "Converting to Markdown...": "Convirtiendo a Markdown...", + "Converting to SVG...": "Convirtiendo a SVG...", + "Converting to greyscale...": "Convirtiendo a escala de grises...", + "Converting to {{level}}...": "Convirtiendo a {{level}}...", + "Converting {{name}}...": "Convirtiendo {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Convirtiendo {{n}}/{{length}}: {{name}}...", + "Converting...": "Convirtiendo...", + "Copied": "Copiado", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "No se pudo acceder al exportador de PDF con sellos. Usa el botón Exportar → PDF de la barra de herramientas del visor como alternativa.", + "Could not add blank page.": "No se pudo agregar la página en blanco.", + "Could not add blank pages.": "No se pudieron agregar las páginas en blanco.", + "Could not add header or footer.": "No se pudo agregar el encabezado o el pie de página.", + "Could not add page numbers.": "No se pudieron agregar los números de página.", + "Could not add the watermark.": "No se pudo agregar la marca de agua.", + "Could not apply rotations.": "No se pudieron aplicar las rotaciones.", + "Could not change text color.": "No se pudo cambiar el color del texto.", + "Could not change the background color.": "No se pudo cambiar el color de fondo.", + "Could not create ZIP archive.": "No se pudo crear el archivo ZIP.", + "Could not create canvas context.": "No se pudo crear el contexto del lienzo.", + "Could not create comparison canvas context.": "No se pudo crear el contexto del lienzo de comparación.", + "Could not create offscreen comparison canvas.": "No se pudo crear el lienzo de comparación fuera de pantalla.", + "Could not create visual diff context.": "No se pudo crear el contexto de la diferencia visual.", + "Could not create visual diff overlay context.": "No se pudo crear el contexto de la superposición de diferencia visual.", + "Could not detect blank pages.": "No se pudieron detectar las páginas en blanco.", + "Could not display the page.": "No se pudo mostrar la página.", + "Could not export comparison PDF.": "No se pudo exportar el PDF de comparación.", + "Could not export the signed PDF. Please try again.": "No se pudo exportar el PDF firmado. Inténtalo de nuevo.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "No se pudo exportar el PDF con sellos. Usa el botón Exportar → PDF de la barra de herramientas del visor como alternativa.", + "Could not extract signer public key": "No se pudo extraer la clave pública del firmante", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "No se encontró {{testFile}} en la URL indicada (HTTP {{status}}). Comprueba que el archivo exista.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "No se pudo analizar el PDF por completo. Puede estar dañado o tener una estructura poco común.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "No se pudo generar una vista previa. El archivo puede estar dañado o contener funciones no compatibles. Error: {{message}}", + "Could not get canvas context": "No se pudo obtener el contexto del lienzo", + "Could not invert PDF colors.": "No se pudieron invertir los colores del PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "No se pudo cargar el PDF. Puede estar dañado o protegido con contraseña.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "No se pudo cargar el PDF. El archivo puede ser inválido, estar dañado o protegido con contraseña.", + "Could not load the PDF engine. Please refresh the page and try again.": "No se pudo cargar el motor de PDF. Actualiza la página e inténtalo de nuevo.", + "Could not parse signer info": "No se pudo analizar la información del firmante", + "Could not posterize the PDF.": "No se pudo posterizar el PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "No se pudo procesar \"{{name}}\". El archivo puede estar dañado.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "No se pudo reducir más el tamaño del archivo. Original: {{originalSize}}, nuevo: {{compressedSize}}.", + "Could not remove annotations.": "No se pudieron eliminar las anotaciones.", + "Could not remove blank pages.": "No se pudieron eliminar las páginas en blanco.", + "Could not remove leftover data from the PDF.": "No se pudieron eliminar los datos residuales del PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "No se pudo eliminar el texto redactado de los datos del documento, por lo que el archivo no se descargó.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "No se pudieron invertir las páginas del PDF. Comprueba que tus archivos sean PDF válidos.", + "Could not update metadata. Please check that date formats are correct.": "No se pudieron actualizar los metadatos. Comprueba que los formatos de fecha sean correctos.", + "Count": "Cantidad", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Creado", + "Creating Booklet...": "Creando folleto...", + "Creating Excel file...": "Creando archivo de Excel...", + "Creating N-Up PDF...": "Creando PDF N-Up...", + "Creating PDF from JPGs...": "Creando PDF a partir de JPG...", + "Creating PDF from SVG files...": "Creando PDF a partir de archivos SVG...", + "Creating PDF...": "Creando PDF...", + "Creating ZIP archive...": "Creando archivo ZIP...", + "Creating ZIP file...": "Creando archivo ZIP...", + "Creating ZIP...": "Creando ZIP...", + "Creating table...": "Creando tabla...", + "Creator": "Creador", + "Crop": "Recortar", + "Crop complete! Your download has started.": "¡Recorte completado! Tu descarga ha comenzado.", + "Cryptographic verification failed": "Falló la verificación criptográfica", + "Custom": "Personalizado", + "Custom Format": "Formato personalizado", + "Custom Height": "Alto personalizado", + "Custom Units": "Unidades personalizadas", + "Custom Width": "Ancho personalizado", + "Custom Zoom": "Zoom personalizado", + "Custom...": "Personalizado...", + "DataMatrix": "DataMatrix", + "Date Format": "Formato de fecha", + "Decrease size": "Reducir tamaño", + "Decrypt": "Descifrar", + "Decrypting PDF...": "Descifrando PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Descifrando {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Descifrando {{n}} de {{length}}: {{name}}", + "Decrypting...": "Descifrando...", + "Decryption Failed": "Falló el descifrado", + "Delete": "Eliminar", + "Delete \"{{title}}\"?": "¿Eliminar \"{{title}}\"?", + "Delete Field": "Eliminar campo", + "Delete Page": "Eliminar página", + "Delete Pages": "Eliminar páginas", + "Delete all {{length}} bookmark(s) ? ": "¿Eliminar los {{length}} marcadores?", + "Delete layer": "Eliminar capa", + "Delete {{size}} bookmark(s) ? ": "¿Eliminar {{size}} marcadores?", + "Deleted": "Eliminado", + "Deleted {{size}} page(s) successfully!": "¡Se eliminaron {{size}} páginas correctamente!", + "Deleting pages...": "Eliminando páginas...", + "Description": "Descripción", + "Description for screen readers": "Descripción para lectores de pantalla", + "Deselect All": "Deseleccionar todo", + "Deskew": "Enderezar", + "Deskew PDF": "Enderezar PDF", + "Deskewed {{length}} file(s). {{value}}": "Se enderezaron {{length}} archivos. {{value}}", + "Deskewing {{name}}...": "Enderezando {{name}}...", + "Destination": "Destino", + "Detecting blank pages...": "Detectando páginas en blanco...", + "Digest Algorithm:": "Algoritmo de resumen:", + "Digital Sign": "Firma digital", + "Direction": "Dirección", + "Divide Pages": "Dividir páginas", + "Divide into boxes (0 to disable)": "Dividir en cuadros (0 para desactivar)", + "Document Properties": "Propiedades del documento", + "Document Type": "Tipo de documento", + "Document properties": "Propiedades del documento", + "Document-level attachment": "Adjunto a nivel de documento", + "Done: back to tools": "Listo: volver a las herramientas", + "Download": "Descargar", + "Download Edited PDF": "Descargar PDF editado", + "Download anyway": "Descargar de todos modos", + "Download as PDF or ZIP automatically": "Descargar automáticamente como PDF o ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Se descargaron {{length}} archivos PDF en un archivo ZIP.", + "Downloads started for all files.": "Se iniciaron las descargas de todos los archivos.", + "Dpi": "PPP", + "Drops tagging, which screen readers rely on.": "Elimina el etiquetado, en el que se basan los lectores de pantalla.", + "Duplicate Field Name": "Nombre de campo duplicado", + "Duplicate Field Names": "Nombres de campo duplicados", + "Duplicate Page": "Duplicar página", + "Duplicate Page Numbers": "Números de página duplicados", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "La firma ECDSA no se verifica con la clave pública del firmante", + "EPUB Files": "Archivos EPUB", + "EPUB to PDF": "EPUB a PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ a PDF", + "Edit": "Editar", + "Edit All": "Editar todo", + "Edit Bookmark": "Editar marcador", + "Edit Bookmarks": "Editar marcadores", + "Edit Images": "Editar imágenes", + "Edit Metadata": "Editar metadatos", + "Edit PDF metadata": "Edita los metadatos del PDF", + "Edit Scope": "Alcance de edición", + "Edit Shapes": "Editar formas", + "Edit Text": "Editar texto", + "Edit tool": "Herramienta de edición", + "Edit {{scopes}}": "Editar {{scopes}}", + "Email Files": "Archivos de correo", + "Email to PDF": "Email a PDF", + "Embedding files into PDF...": "Incrustando archivos en el PDF...", + "Empty signature bytes": "Bytes de firma vacíos", + "Encrypt": "Cifrar", + "Encrypt PDF with password": "Cifra el PDF con contraseña", + "Encrypted file": "Archivo cifrado", + "Encrypting PDF with 256-bit AES...": "Cifrando PDF con AES de 256 bits...", + "Encryption Failed": "Falló el cifrado", + "Encryption resulted in an empty file.": "El cifrado dio como resultado un archivo vacío.", + "End": "Final", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Introduce 0 para insertar al principio, o {{pageCount}} para insertar al final.", + "Enter bookmark title": "Introduce el título del marcador", + "Enter name for child layer under \"{{Layer}}\":": "Introduce el nombre de la capa secundaria bajo \"{{Layer}}\":", + "Enter password": "Introduce la contraseña", + "Enter password...": "Introduce la contraseña...", + "Enter passwords for each encrypted file": "Introduce las contraseñas de cada archivo cifrado", + "Error": "Error", + "Error during execution": "Error durante la ejecución", + "Error generating PDF: {{error}}": "Error al generar el PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Error al cargar el archivo PDF. Inténtalo de nuevo con un PDF válido.", + "Error reading files: {{error}}": "Error al leer los archivos: {{error}}", + "Error saving PDF. Check console for details.": "Error al guardar el PDF. Consulta la consola para más detalles.", + "Error: {{error}}": "Error: {{error}}", + "Exactly 11 or 12 digits": "Exactamente 11 o 12 dígitos", + "Exactly 12 or 13 digits": "Exactamente 12 o 13 dígitos", + "Example of current format:": "Ejemplo del formato actual:", + "Excel to PDF": "Excel a PDF", + "Existing Radio Groups": "Grupos de opciones existentes", + "Export Error": "Error de exportación", + "Export Value": "Valor de exportación", + "Export failed": "Falló la exportación", + "External processing module needed": "Se necesita un módulo de procesamiento externo", + "Extract Images": "Extraer imágenes", + "Extract Pages": "Extraer páginas", + "Extract Tables": "Extraer tablas", + "Extract a range of pages": "Extrae un rango de páginas", + "Extract all images from PDF": "Extrae todas las imágenes del PDF", + "Extract pages as separate PDFs": "Extrae las páginas como PDF independientes", + "Extract text from PDF": "Extrae el texto del PDF", + "Extracted 1 table successfully!": "¡Se extrajo 1 tabla correctamente!", + "Extracted text from {{length}} PDF files!": "¡Se extrajo el texto de {{length}} archivos PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Se extrajeron {{completed}} PDF, fallaron {{failed}}.", + "Extracted {{length}} page(s) successfully!": "¡Se extrajeron {{length}} páginas correctamente!", + "Extracted {{length}} table(s) to Excel!": "¡Se extrajeron {{length}} tablas a Excel!", + "Extracted {{length}} tables successfully!": "¡Se extrajeron {{length}} tablas correctamente!", + "Extracting attachments from {{length}} file(s)...": "Extrayendo adjuntos de {{length}} archivos...", + "Extracting images from {{name}}...": "Extrayendo imágenes de {{name}}...", + "Extracting pages...": "Extrayendo páginas...", + "Extracting tables...": "Extrayendo tablas...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Extrayendo texto del archivo {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Extrayendo texto de varios archivos...", + "Extracting text from {{name}}...": "Extrayendo texto de {{name}}...", + "Extracting text...": "Extrayendo texto...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Extrayendo {{name}} para IA ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Extrayendo {{name}} para IA...", + "Extracting...": "Extrayendo...", + "Extraction Complete": "Extracción completada", + "Extraction Error": "Error de extracción", + "Extraction Partial": "Extracción parcial", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "¡Extracción completada! {{length}} adjuntos en el archivo zip ({{totalSize}}). La descarga ha comenzado.", + "FB2 Files": "Archivos FB2", + "FB2 to PDF": "FB2 a PDF", + "Failed": "Falló", + "Failed to acquire 2D canvas context": "No se pudo obtener el contexto 2D del lienzo", + "Failed to add child layer": "No se pudo agregar la capa secundaria", + "Failed to apply Bates numbers.": "No se pudieron aplicar los números Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "No se pudieron aplicar los ajustes de color. El archivo puede estar dañado.", + "Failed to apply redactions.": "No se pudieron aplicar las redacciones.", + "Failed to apply scanner effect. The file might be corrupted.": "No se pudo aplicar el efecto de escáner. El archivo puede estar dañado.", + "Failed to attach files: {{error}}": "No se pudieron adjuntar los archivos: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "No se pudo convertir BMP a PDF. Puede que uno de los archivos no sea válido.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "No se pudo convertir HEIC a PDF. Puede que uno de los archivos no sea válido.", + "Failed to convert PDF to CSV. {{message}}": "No se pudo convertir PDF a CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "No se pudo convertir PDF a Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "No se pudo convertir PDF a SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "No se pudo convertir el PDF a escala de grises. El archivo puede estar dañado.", + "Failed to convert PDF. It may be image-based or corrupted.": "No se pudo convertir el PDF. Puede estar basado en imágenes o dañado.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "No se pudo convertir TIFF a PDF. Puede que uno de los archivos no sea válido.", + "Failed to convert images to PDF.": "No se pudieron convertir las imágenes a PDF.", + "Failed to convert text to PDF. {{error}}": "No se pudo convertir el texto a PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "No se pudo convertir {{filename}} a PNG", + "Failed to copy metadata to clipboard.": "No se pudieron copiar los metadatos al portapapeles.", + "Failed to create PDF.": "No se pudo crear el PDF.", + "Failed to create PNG blob": "No se pudo crear el blob PNG", + "Failed to create canvas context": "No se pudo crear el contexto del lienzo", + "Failed to create split PDFs.": "No se pudieron crear los PDF divididos.", + "Failed to decode image: {{name}}": "No se pudo decodificar la imagen: {{name}}", + "Failed to decrypt private key": "No se pudo descifrar la clave privada", + "Failed to decrypt. Try the Decrypt tool instead.": "No se pudo descifrar. Prueba con la herramienta Descifrar.", + "Failed to delete layer": "No se pudo eliminar la capa", + "Failed to delete pages.": "No se pudieron eliminar las páginas.", + "Failed to deskew PDF: {{error}}": "No se pudo enderezar el PDF: {{error}}", + "Failed to download the edited PDF.": "No se pudo descargar el PDF editado.", + "Failed to edit attachments.": "No se pudieron editar los adjuntos.", + "Failed to extract certificate from PFX file": "No se pudo extraer el certificado del archivo PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "No se pudieron extraer las páginas (código de salida de qpdf {{exitCode}}).", + "Failed to extract pages.": "No se pudieron extraer las páginas.", + "Failed to extract tables. {{message}}": "No se pudieron extraer las tablas. {{message}}", + "Failed to extract text from PDF.": "No se pudo extraer el texto del PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "No se pudo obtener el perfil ICC de {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "No se pudo obtener el archivo de fuente: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "No se pudo obtener gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "No se pudo obtener {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "No se pudo obtener el contexto 2D de la página {{pageNumber}}", + "Failed to get canvas context": "No se pudo obtener el contexto del lienzo", + "Failed to insert PDF. The file may be corrupted.": "No se pudo insertar el PDF. El archivo puede estar dañado.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "No se pudo cargar Ghostscript desde {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "No se pudo cargar el archivo PDF.", + "Failed to load PDF for cropping.": "No se pudo cargar el PDF para recortarlo.", + "Failed to load PDF for preview.": "No se pudo cargar el PDF para la vista previa.", + "Failed to load PDF form viewer.": "No se pudo cargar el visor de formularios PDF.", + "Failed to load PDF layers": "No se pudieron cargar las capas del PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "No se pudo cargar PyMuPDF desde la CDN: {{msg}}", + "Failed to load SVG image": "No se pudo cargar la imagen SVG", + "Failed to load WebP image": "No se pudo cargar la imagen WebP", + "Failed to load attachments from PDF.": "No se pudieron cargar los adjuntos del PDF.", + "Failed to load files: {{error}}": "No se pudieron cargar los archivos: {{error}}", + "Failed to load image.": "No se pudo cargar la imagen.", + "Failed to load image: {{filename}}": "No se pudo cargar la imagen: {{filename}}", + "Failed to load one or more PDF files.": "No se pudieron cargar uno o más archivos PDF.", + "Failed to load script: {{url}}": "No se pudo cargar el script: {{url}}", + "Failed to load template.": "No se pudo cargar la plantilla.", + "Failed to load the PDF Editor.": "No se pudo cargar el Editor PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "No se pudo cargar el procesador de imágenes. Asegúrate de que tu navegador sea compatible con SharedArrayBuffer (requiere HTTPS o localhost).", + "Failed to parse CSV: {{error}}": "No se pudo analizar el CSV: {{error}}", + "Failed to parse signature": "No se pudo analizar la firma", + "Failed to parse the certificate file.": "No se pudo analizar el archivo de certificado.", + "Failed to process HEIC file: {{name}}": "No se pudo procesar el archivo HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "No se pudo procesar el archivo WebP: {{name}}", + "Failed to read file.": "No se pudo leer el archivo.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "No se pudieron eliminar las restricciones. Puede que el PDF requiera la contraseña de propietario correcta.", + "Failed to render page": "No se pudo renderizar la página", + "Failed to render page previews": "No se pudieron renderizar las vistas previas de las páginas", + "Failed to render page previews.": "No se pudieron renderizar las vistas previas de las páginas.", + "Failed to render page.": "No se pudo renderizar la página.", + "Failed to save changes.": "No se pudieron guardar los cambios.", + "Failed to save the new PDF. Check console for details.": "No se pudo guardar el nuevo PDF. Consulta la consola para más detalles.", + "Failed to split PDF. Please check your selection.": "No se pudo dividir el PDF. Comprueba tu selección.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "No se pudo sellar el PDF con marca de tiempo: {{message}}\n\nPrueba con otro servidor TSA o comprueba tu conexión a internet.", + "Failed to toggle layer visibility": "No se pudo cambiar la visibilidad de la capa", + "Failed to validate signatures. The file may be corrupted.": "No se pudieron validar las firmas. El archivo puede estar dañado.", + "Features enabled by this module:": "Funciones habilitadas por este módulo:", + "Field Name": "Nombre de campo", + "Field Name (Group Name)": "Nombre de campo (Nombre del grupo)", + "Field Name Conflict": "Conflicto de nombre de campo", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "El nombre de campo \"{{newName}}\" ya existe en este {{value}}. Prueba con un nombre único.", + "Field name cannot be empty": "El nombre del campo no puede estar vacío", + "File": "Archivo", + "File Size": "Tamaño del archivo", + "File exists but could not be read. Check CORS configuration.": "El archivo existe pero no se pudo leer. Revisa la configuración de CORS.", + "File list not found": "No se encontró la lista de archivos", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "El tamaño del archivo se redujo de {{originalSize}} a {{compressedSize}} (ahorro del {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Archivo {{n}}/{{length}}: página {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Archivo {{n}}/{{length}}: {{message}}", + "Filename": "Nombre de archivo", + "Files that failed: {{errorCount}}.": "Archivos con errores: {{errorCount}}.", + "Fill (cover full target page)": "Rellenar (cubrir toda la página de destino)", + "Fill Color": "Color de relleno", + "Finalizing PDF...": "Finalizando PDF...", + "Find & replace": "Buscar y reemplazar", + "Finds the best quality under this size. 0 means no target.": "Busca la mejor calidad por debajo de este tamaño. 0 significa sin objetivo.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox y Chrome pueden mostrar su propio formato de selector de fecha al elegir. El formato correcto se aplicará cuando termines de introducir la fecha.", + "First Indent": "Sangría de primera línea", + "Fit (keep full page visible)": "Ajustar (mantener la página completa visible)", + "Fit Page": "Ajustar página", + "Fix Page Size": "Fijar tamaño de página", + "Flatten": "Aplanar", + "Flatten Forms": "Aplanar formularios", + "Flatten annotations": "Aplanar anotaciones", + "Flatten form fields": "Aplanar campos de formulario", + "Flatten forms and annotations": "Aplanar formularios y anotaciones", + "Flatten links": "Aplanar enlaces", + "Flattening PDF...": "Aplanando PDF...", + "Flattening and saving PDF...": "Aplanando y guardando PDF...", + "Flattening multiple PDFs...": "Aplanando varios PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Aplanando la página {{i}} de {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Aplanando {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Enfoca la barra de direcciones", + "Font": "Fuente", + "Font Color": "Color de fuente", + "Font Family": "Familia de fuente", + "Font Size": "Tamaño de fuente", + "Font size: {{bSize}} → {{aSize}}": "Tamaño de fuente: {{bSize}} → {{aSize}}", + "Font to Outline": "Fuente a contorno", + "Font: {{bFont}} → {{aFont}}": "Fuente: {{bFont}} → {{aFont}}", + "Fonts": "Fuentes", + "Footer Center": "Pie de página centro", + "Footer Left": "Pie de página izquierda", + "Footer Right": "Pie de página derecha", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Para PDF solo de imágenes, como los escaneos. Se omite cuando el documento tiene texto seleccionable, salvo que \"Anular protección de contenido\" esté activada.", + "Form fields stop being fillable.": "Los campos de formulario dejan de poder rellenarse.", + "Format": "Formato", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Se encontraron {{length}} páginas en blanco. Haz clic en una página para deseleccionarla.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Se encontraron {{length}} marcadores existentes. ¿Reemplazar los marcadores actuales?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Se encontraron {{length}} imágenes en {{length2}} PDF.", + "Front": "Anverso", + "Full Coverage": "Cobertura completa", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Genera una tabla de contenidos a partir de los marcadores", + "Generating High-Quality PDF...": "Generando PDF de alta calidad...", + "Generating PDF...": "Generando PDF...", + "Generating ZIP file...": "Generando archivo ZIP...", + "Generating formatted content...": "Generando contenido con formato...", + "Generating preview...": "Generando vista previa...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (conversión a PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "La conversión RGB de Ghostscript falló con el código de salida {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "La conversión de Ghostscript falló con el código de salida {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript no generó el archivo de salida", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript no está configurado. Configúralo en los ajustes avanzados.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript no está configurado. Configúralo en los ajustes de WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript no está configurado. PyMuPDF requiere Ghostscript para algunas operaciones. Configura ambos en los ajustes avanzados.", + "Ghostscript threw an exception: {{e}}": "Ghostscript lanzó una excepción: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "El wrapper de Ghostscript no expuso la interfaz esperada. Se esperaba loadGS() o la clase GhostscriptWASM.", + "Go": "Ir", + "Go to page": "Ir a la página", + "Grayscale": "Escala de grises", + "Green": "Verde", + "Greyscale": "Escala de grises", + "Grid Mode": "Modo cuadrícula", + "Group Name (Must be same for group)": "Nombre del grupo (debe ser el mismo para el grupo)", + "H-Scale %": "Escala H %", + "Hanging Indent": "Sangría francesa", + "Hard reloads page": "Recarga la página por completo", + "Header & Footer": "Encabezado y pie de página", + "Header & Footer added successfully!": "¡Encabezado y pie de página agregados correctamente!", + "Header Center": "Encabezado centro", + "Header Left": "Encabezado izquierda", + "Header Right": "Encabezado derecha", + "Height ({{unit}})": "Alto ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Ocultar", + "Hide Border": "Ocultar borde", + "Hide password": "Ocultar contraseña", + "Hides window": "Oculta la ventana", + "High (288 DPI)": "Alta (288 DPI)", + "High (Smallest Files)": "Alta (archivos más pequeños)", + "Horizontal": "Horizontal", + "Hue Shift": "Cambio de tono", + "Image Format": "Formato de imagen", + "Image Input": "Entrada de imagen", + "Image quality": "Calidad de imagen", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Imagen redimensionada de {{width}}×{{height}} a {{width2}}×{{height2}}", + "Images": "Imágenes", + "Images above this are resampled down. None leaves resolution alone.": "Las imágenes por encima de este valor se remuestrean a menor resolución. Ninguno deja la resolución como está.", + "Imported {{length}} bookmarks!": "¡Se importaron {{length}} marcadores!", + "Inches (in)": "Pulgadas (in)", + "Include Attachments": "Incluir adjuntos", + "Include Cc Bcc": "Incluir Cc y Cco", + "Include this file": "Incluir este archivo", + "Incorrect Page Count": "Número de páginas incorrecto", + "Incorrect Password": "Contraseña incorrecta", + "Incorrect password": "Contraseña incorrecta", + "Incorrect password. Please try again.": "Contraseña incorrecta. Inténtalo de nuevo.", + "Increase size": "Aumentar tamaño", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indexando la página {{pageNumber}} de {{totalPages}} del PDF 1...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indexando la página {{pageNumber}} de {{totalPages}} del PDF 2...", + "Info": "Información", + "Info Dictionary": "Diccionario Info", + "Inherit": "Heredar", + "Initialization Error": "Error de inicialización", + "Initializing Ghostscript...": "Inicializando Ghostscript...", + "Initializing PDF engine...": "Inicializando el motor de PDF...", + "Initializing PyMuPDF...": "Inicializando PyMuPDF...", + "Initializing decryption...": "Inicializando el descifrado...", + "Initializing encryption...": "Inicializando el cifrado...", + "Initializing repair engine...": "Inicializando el motor de reparación...", + "Initializing...": "Inicializando...", + "Input Required": "Se requiere una entrada", + "Insecure Digest (MD5 / SHA-1)": "Resumen inseguro (MD5 / SHA-1)", + "Insert blank pages": "Insertar páginas en blanco", + "Insert blank pages after this page number": "Insertar páginas en blanco después de este número de página", + "Interactive Form Fields": "Campos de formulario interactivos", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Intercala páginas de varios PDF (por ejemplo, impares + pares invertidas de un escaneo a una cara)", + "Invalid Certificate": "Certificado no válido", + "Invalid File": "Archivo no válido", + "Invalid Files": "Archivos no válidos", + "Invalid Input": "Entrada no válida", + "Invalid JSON format": "Formato JSON no válido", + "Invalid Name": "Nombre no válido", + "Invalid Order": "Orden no válido", + "Invalid PDF password.": "Contraseña de PDF no válida.", + "Invalid Page Numbers": "Números de página no válidos", + "Invalid Page Order": "Orden de páginas no válido", + "Invalid Pages": "Páginas no válidas", + "Invalid Range": "Rango no válido", + "Invalid Signature": "Firma no válida", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL de TSA no válida. La autoridad de marcas de tiempo debe ser una URL http:// o https:// válida.", + "Invalid URL": "URL no válida", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Formato de URL no válido. Introduce una URL válida (p. ej., https://example.com/wasm/)", + "Invalid XML: no root element": "XML no válido: no hay elemento raíz", + "Invalid data": "Datos no válidos", + "Invalid hex string in content stream": "Cadena hexadecimal no válida en el flujo de contenido", + "Invalid page range specified.": "Se especificó un rango de páginas no válido.", + "Invalid shortcut format": "Formato de atajo no válido", + "Invalid: Cryptographic Verification Failed": "No válida: falló la verificación criptográfica", + "Invert Colors": "Invertir colores", + "Invert all colors": "Invierte todos los colores", + "Inverting PDF colors...": "Invirtiendo los colores del PDF...", + "Issuer": "Emisor", + "It fits the {{targetBytes}} target.": "Cumple el objetivo de {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Sigue por encima del objetivo de {{targetBytes}} porque Conservar PDF/A limita cuánto se puede comprimir.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Ya no declara conformidad con PDF/A. Activa Conservar PDF/A en Ajustes personalizados para mantenerla.", + "Italic": "Cursiva", + "Item 1": "Elemento 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Se eliminaron sus firmas digitales para poder comprimirlo. Fírmalo de nuevo si es necesario.", + "JPEG (Smaller file size)": "JPEG (archivo más pequeño)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Calidad JPEG de las imágenes recodificadas, de 20 a 100. Un valor menor significa archivos más pequeños y más artefactos visibles.", + "JPG": "JPG", + "JSON Files": "Archivos JSON", + "JSON Loaded": "JSON cargado", + "JSON to PDF": "JSON a PDF", + "Javascript Code": "Código JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Mantiene un archivo PDF/A conforme. Mientras esté activado, se omiten Brotli y la rasterización.", + "Keeps only the characters the document uses.": "Conserva solo los caracteres que usa el documento.", + "Key (e.g., Department)": "Clave (p. ej., Departamento)", + "Keywords": "Palabras clave", + "Label": "Etiqueta", + "Label / Prompt": "Etiqueta / Indicación", + "Landscape": "Horizontal", + "Language": "Idioma", + "Layer not found": "Capa no encontrada", + "Layer {{number}}": "Capa {{number}}", + "Leave blank for all pages": "Déjalo en blanco para todas las páginas", + "Left": "Izquierda", + "Left edge in points (1 inch = 72 pts)": "Borde izquierdo en puntos (1 pulgada = 72 pts)", + "Legal": "Legal", + "Letter": "Carta", + "Level": "Nivel", + "Limit recognized characters (leave empty for all)": "Limitar los caracteres reconocidos (déjalo vacío para todos)", + "Line": "Línea", + "Linearization Failed": "Falló la linealización", + "Linearize": "Linealizar", + "Links stop being clickable.": "Los enlaces dejan de poder pulsarse.", + "Lists": "Listas", + "Load": "Cargar", + "Load system fonts": "Cargar fuentes del sistema", + "Load system fonts…": "Cargar fuentes del sistema…", + "Loaded": "Cargado", + "Loaded bookmarks from JSON. Now upload your PDF.": "Marcadores cargados desde JSON. Ahora sube tu PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Se cargaron {{length}} marcadores desde CSV. Ahora sube tu PDF.", + "Loading Engine...": "Cargando motor...", + "Loading Ghostscript...": "Cargando Ghostscript...", + "Loading PDF Editor...": "Cargando Editor PDF...", + "Loading PDF Text Editor...": "Cargando Editor de texto PDF...", + "Loading PDF converter...": "Cargando convertidor de PDF...", + "Loading PDF documents...": "Cargando documentos PDF...", + "Loading PDF engine...": "Cargando motor de PDF...", + "Loading PDF files...": "Cargando archivos PDF...", + "Loading PDF form...": "Cargando formulario PDF...", + "Loading PDF processor...": "Cargando procesador de PDF...", + "Loading PDF viewer...": "Cargando visor de PDF...", + "Loading PDF...": "Cargando PDF...", + "Loading PDFs...": "Cargando PDF...", + "Loading attachments...": "Cargando adjuntos...", + "Loading comparison {{currentPage}} of {{length}}...": "Cargando comparación {{currentPage}} de {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Cargando motor de conversión ({{percent}}%)...", + "Loading conversion engine...": "Cargando motor de conversión...", + "Loading engine...": "Cargando motor...", + "Loading fonts...": "Cargando fuentes...", + "Loading layers from {{name}}...": "Cargando capas de {{name}}...", + "Loading page {{num}}...": "Cargando página {{num}}...", + "Loading preview...": "Cargando vista previa...", + "Loading {{name}}...": "Cargando {{name}}...", + "Loading...": "Cargando...", + "Location": "Ubicación", + "Lossless (No Quality Loss)": "Sin pérdida (sin pérdida de calidad)", + "Lossless (no image re-encoding)": "Sin pérdida (sin recodificar imágenes)", + "Low (Best Quality)": "Baja (mejor calidad)", + "MOBI Files": "Archivos MOBI", + "MOBI to PDF": "MOBI a PDF", + "Malformed ByteRange": "ByteRange mal formado", + "Malformed ECDSA signature (could not parse r,s)": "Firma ECDSA mal formada (no se pudo analizar r,s)", + "Malformed inline image in content stream": "Imagen en línea mal formada en el flujo de contenido", + "Malformed signatureAlgorithm": "signatureAlgorithm mal formado", + "Margins": "Márgenes", + "Markdown Files": "Archivos Markdown", + "Markdown to PDF": "Markdown a PDF", + "Max Length (0 for unlimited)": "Longitud máxima (0 para ilimitada)", + "Maximum resolution": "Resolución máxima", + "Medium (Recommended)": "Media (recomendada)", + "Merge PDF": "Fusionar PDF", + "Merge PDFs": "Fusionar PDF", + "Merge duplicate fonts": "Combinar fuentes duplicadas", + "Mermaid Error: {{error}}": "Error de Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadatos copiados al portapapeles como JSON.", + "Metadata removed successfully!": "¡Metadatos eliminados correctamente!", + "Metadata updated successfully!": "¡Metadatos actualizados correctamente!", + "Millimeters (mm)": "Milímetros (mm)", + "Minimizes window": "Minimiza la ventana", + "Missing Files": "Archivos faltantes", + "Missing signatureAlgorithm": "Falta signatureAlgorithm", + "Mixed Page Sizes Detected": "Se detectaron tamaños de página mixtos", + "Mixed Sizes": "Tamaños mixtos", + "Mode": "Modo", + "Modified": "Modificado", + "Modified After Signing (signed part intact)": "Modificado tras la firma (la parte firmada está intacta)", + "More": "Más", + "Moved": "Movido", + "Moved \"{{value}}\"": "Se movió \"{{value}}\"", + "Multi-line": "Varias líneas", + "Must be a positive integer": "Debe ser un entero positivo", + "Must be a positive number": "Debe ser un número positivo", + "N must be at least 1.": "N debe ser al menos 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "¡PDF N-Up creado correctamente!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Error de red: no se pudo conectar a la URL. Comprueba que la URL sea correcta y que el servidor permita solicitudes CORS.", + "Network error: {{error}}": "Error de red: {{error}}", + "Next page": "Página siguiente", + "No Area Selected": "Ningún área seleccionada", + "No Attachments": "Sin adjuntos", + "No Changes": "Sin cambios", + "No Crop Area": "Sin área de recorte", + "No File": "Ningún archivo", + "No Files": "Ningún archivo", + "No Images Found": "No se encontraron imágenes", + "No PDF Files": "Ningún archivo PDF", + "No PDF document loaded": "No hay ningún documento PDF cargado", + "No PDF document loaded.": "No hay ningún documento PDF cargado.", + "No PDF file loaded.": "No hay ningún archivo PDF cargado.", + "No PDF files could be decrypted. The password may be incorrect.": "No se pudo descifrar ningún archivo PDF. Puede que la contraseña sea incorrecta.", + "No PDF files could be linearized.": "No se pudo linealizar ningún archivo PDF.", + "No PDFs could be processed.": "No se pudo procesar ningún PDF.", + "No Pages": "Sin páginas", + "No Selection": "Sin selección", + "No Signatures Found": "No se encontraron firmas", + "No Tables Found": "No se encontraron tablas", + "No Text": "Sin texto", + "No URL configured": "No hay ninguna URL configurada", + "No attachments found in this PDF.": "No se encontraron adjuntos en este PDF.", + "No attachments selected for removal.": "No se seleccionó ningún adjunto para eliminar.", + "No blank pages detected in this PDF.": "No se detectaron páginas en blanco en este PDF.", + "No bookmarks found at the selected level.": "No se encontraron marcadores en el nivel seleccionado.", + "No bookmarks to delete.": "No hay marcadores que eliminar.", + "No bookmarks to export!": "¡No hay marcadores que exportar!", + "No certificate found in PEM file": "No se encontró ningún certificado en el archivo PEM", + "No certificate found in PFX file": "No se encontró ningún certificado en el archivo PFX", + "No certificates found in signature": "No se encontraron certificados en la firma", + "No changes match the current filter.": "Ningún cambio coincide con el filtro actual.", + "No configurable settings for this node.": "Este nodo no tiene ajustes configurables.", + "No differences detected on this page.": "No se detectaron diferencias en esta página.", + "No embedded images were found in the selected PDF(s).": "No se encontraron imágenes incrustadas en los PDF seleccionados.", + "No existing bookmarks found in this PDF.": "No se encontraron marcadores existentes en este PDF.", + "No items were selected for removal or none were found in the PDF.": "No se seleccionó ningún elemento para eliminar o no se encontró ninguno en el PDF.", + "No page pairs to export.": "No hay pares de páginas que exportar.", + "No pages found. Please create a blank PDF or upload one.": "No se encontraron páginas. Crea un PDF en blanco o sube uno.", + "No pages selected for removal.": "No se seleccionó ninguna página para eliminar.", + "No pages were selected for splitting.": "No se seleccionó ninguna página para dividir.", + "No paired page for this side.": "No hay página emparejada para este lado.", + "No private key found in PEM file": "No se encontró ninguna clave privada en el archivo PEM", + "No private key found in PFX file": "No se encontró ninguna clave privada en el archivo PFX", + "No tables were detected in this PDF.": "No se detectaron tablas en este PDF.", + "No valid page numbers found.": "No se encontraron números de página válidos.", + "No valid pages to save.": "No hay páginas válidas que guardar.", + "No worker": "Sin worker", + "Noise": "Ruido", + "None": "Ninguno", + "None of the files could be compressed: {{join}}.": "No se pudo comprimir ninguno de los archivos: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "No hay suficientes archivos", + "Not a PDF": "No es un PDF", + "Not connected": "No conectado", + "Not in trust chain": "No está en la cadena de confianza", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Nota: sin una contraseña de propietario independiente, el PDF no tiene restricciones de uso.", + "Number Format": "Formato de número", + "Number of Pages": "Número de páginas", + "OCR": "OCR", + "OCR aborted before any page was processed": "El OCR se canceló antes de procesar ninguna página", + "OCR recognize timed out after {{timeoutMs}}ms": "El reconocimiento OCR agotó el tiempo de espera tras {{timeoutMs}} ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Archivos ODG", + "ODG to PDF": "ODG a PDF", + "OK": "Aceptar", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Desactivado (predeterminado): numeración natural de 1 a N. Activado: se conservan las etiquetas de página originales de cada archivo (puede producir etiquetas duplicadas).", + "One PDF per page": "Un PDF por página", + "One PDF per range": "Un PDF por rango", + "Only a substitute font was available": "Solo había una fuente sustituta disponible", + "Only where it does not change how the image looks.": "Solo donde no cambia el aspecto de la imagen.", + "Opacity": "Opacidad", + "Open URL": "Abrir URL", + "Opens incognito window": "Abre una ventana de incógnito", + "Opens new tab": "Abre una pestaña nueva", + "Opens new window": "Abre una ventana nueva", + "Operation Failed": "Falló la operación", + "Operation resulted in an empty file.": "La operación dio como resultado un archivo vacío.", + "Optimize PDF for fast web viewing": "Optimiza el PDF para verlo rápido en la web", + "Optimizing PDFs for web view (linearizing)...": "Optimizando PDF para la vista web (linealizando)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optimizando {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opciones (una por línea o separadas por comas)", + "Orientation": "Orientación", + "Outline": "Contorno", + "Output": "Salida", + "Overlay": "Superponer", + "Overlay or underlay pages from one PDF onto another": "Superpone o subpone páginas de un PDF sobre otro", + "Owner Password": "Contraseña de propietario", + "Owner Password Required": "Se requiere la contraseña de propietario", + "PDF": "PDF", + "PDF Files": "Archivos PDF", + "PDF Input": "Entrada de PDF", + "PDF Layers": "Capas PDF", + "PDF Metadata": "Metadatos del PDF", + "PDF Producer": "Productor de PDF", + "PDF converted to CSV successfully!": "¡PDF convertido a CSV correctamente!", + "PDF converted to SVG successfully!": "¡PDF convertido a SVG correctamente!", + "PDF converted to greyscale successfully!": "¡PDF convertido a escala de grises correctamente!", + "PDF created successfully!": "¡PDF creado correctamente!", + "PDF decrypted successfully! All encryption and restrictions removed.": "¡PDF descifrado correctamente! Se eliminaron todo el cifrado y las restricciones.", + "PDF decrypted successfully! Your download has started.": "¡PDF descifrado correctamente! Tu descarga ha comenzado.", + "PDF downloaded successfully.": "PDF descargado correctamente.", + "PDF encrypted successfully with 256-bit AES!": "¡PDF cifrado correctamente con AES de 256 bits!", + "PDF has been sanitized and downloaded.": "El PDF se saneó y se descargó.", + "PDF has no pages": "El PDF no tiene páginas", + "PDF organized successfully!": "¡PDF organizado correctamente!", + "PDF permissions changed successfully!": "¡Permisos del PDF cambiados correctamente!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Los lectores de PDF incluyen por sí mismos las 14 fuentes estándar de PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "¡Restricciones del PDF eliminadas correctamente! Ahora el archivo se puede editar e imprimir sin límites.", + "PDF saved successfully!": "¡PDF guardado correctamente!", + "PDF split successfully!": "¡PDF dividido correctamente!", + "PDF to CSV": "PDF a CSV", + "PDF to DOCX": "PDF a DOCX", + "PDF to Excel/CSV": "PDF a Excel/CSV", + "PDF to Images": "PDF a imágenes", + "PDF to Images (High Quality)": "PDF a imágenes (alta calidad)", + "PDF to JSON": "PDF a JSON", + "PDF to Markdown": "PDF a Markdown", + "PDF to PDF/A": "PDF a PDF/A", + "PDF to SVG": "PDF a SVG", + "PDF to Text": "PDF a texto", + "PDF to XLSX": "PDF a XLSX", + "PDF with layer changes saved!": "¡PDF con cambios de capas guardado!", + "PDF {{modeLabel}} applied successfully.": "{{modeLabel}} del PDF aplicado correctamente.", + "PDF/A Conversion": "Conversión a PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (estricto, sin transparencia)", + "PDF/A-2b (Recommended)": "PDF/A-2b (recomendado)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (moderno, permite adjuntos)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "¡Los PDF se mezclaron correctamente!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (sin pérdida)", + "PUB to PDF": "PUB a PDF", + "Page": "Página", + "Page #": "N.º de página", + "Page Added": "Página agregada", + "Page Numbers": "Números de página", + "Page Removed": "Página eliminada", + "Page Size": "Tamaño de página", + "Page X of Y": "Página X de Y", + "Page background or layout changed": "Se cambió el fondo o el diseño de la página", + "Page container not found": "No se encontró el contenedor de la página", + "Page extraction produced an empty PDF.": "La extracción de páginas produjo un PDF vacío.", + "Page number": "Número de página", + "Page numbers added successfully!": "¡Números de página agregados correctamente!", + "Page sizes standardized successfully!": "¡Tamaños de página estandarizados correctamente!", + "Page {{currentPageNum}} of {{numPages}}": "Página {{currentPageNum}} de {{numPages}}", + "Page {{num}} / {{numPages}}": "Página {{num}} / {{numPages}}", + "Page {{n}} ": "Página {{n}} ", + "Page {{n}} of {{length}}": "Página {{n}} de {{length}}", + "Page {{n}}:": "Página {{n}}:", + "Page {{pageNumber}}": "Página {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "La página {{pageNumber}} solo existe en el primer PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "La página {{pageNumber}} solo existe en el segundo PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Página {{pageNumber}} de {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "La página {{pageNum}} no existe en este PDF.", + "Page {{page}}": "Página {{page}}", + "Page {{page}} attachment": "Adjunto de la página {{page}}", + "Pages": "Páginas", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Páginas (p. ej., 1-3, 5) - Total: {{pageCount}}", + "Pages Files": "Archivos de Pages", + "Pages Per Sheet": "Páginas por hoja", + "Pages combined successfully!": "¡Páginas combinadas correctamente!", + "Pages have been divided successfully!": "¡Las páginas se dividieron correctamente!", + "Pages have been reordered.": "Las páginas se reordenaron.", + "Pages have been reversed successfully!": "¡Las páginas se invirtieron correctamente!", + "Pages to PDF": "Pages a PDF", + "Paper Size": "Tamaño de papel", + "Paragraph": "Párrafo", + "Parsing XML structure...": "Analizando la estructura XML...", + "Parsing {{name}}...": "Analizando {{name}}...", + "Partial Coverage": "Cobertura parcial", + "Partial Success": "Éxito parcial", + "Password": "Contraseña", + "Password Error": "Error de contraseña", + "Password Needed": "Se necesita una contraseña", + "Password Required": "Se requiere contraseña", + "Password for all files": "Contraseña para todos los archivos", + "Password for all locked files": "Contraseña para todos los archivos bloqueados", + "Password for {{name}}": "Contraseña de {{name}}", + "Password protected": "Protegido con contraseña", + "Password required for encrypted private key": "Se requiere contraseña para la clave privada cifrada", + "Path Stroke": "Trazo del contorno", + "Please add at least one field before downloading.": "Agrega al menos un campo antes de descargar.", + "Please draw a rectangle on at least one page to select the crop area.": "Dibuja un rectángulo en al menos una página para seleccionar el área de recorte.", + "Please ensure all page numbers in the order are unique.": "Asegúrate de que todos los números de página del orden sean únicos.", + "Please enter a layer name": "Introduce un nombre de capa", + "Please enter a name.": "Introduce un nombre.", + "Please enter a number between 0 and {{totalPages}}.": "Introduce un número entre 0 y {{totalPages}}.", + "Please enter a page order.": "Introduce un orden de páginas.", + "Please enter a password": "Introduce una contraseña", + "Please enter a password for {{i}} or skip it": "Introduce una contraseña para {{i}} u omítelo", + "Please enter a title.": "Introduce un título.", + "Please enter a user password.": "Introduce una contraseña de usuario.", + "Please enter a valid number of pages (1 or more).": "Introduce un número de páginas válido (1 o más).", + "Please enter a valid page number between 1 and {{total}}": "Introduce un número de página válido entre 1 y {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Introduce un rango de páginas válido (p. ej., 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Introduce los números de página que quieres extraer.", + "Please enter positive numbers.": "Introduce números positivos.", + "Please enter some text to convert.": "Introduce algo de texto para convertir.", + "Please enter text for the watermark.": "Introduce el texto de la marca de agua.", + "Please enter the PDF password.": "Introduce la contraseña del PDF.", + "Please load a PDF first.": "Carga un PDF primero.", + "Please select PDF files to create a ZIP archive.": "Selecciona archivos PDF para crear un archivo ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Selecciona un archivo de certificado .pem, .crt, .cer o .der.", + "Please select a PDF file.": "Selecciona un archivo PDF.", + "Please select a valid PDF file.": "Selecciona un archivo PDF válido.", + "Please select an area on at least one page to crop.": "Selecciona un área en al menos una página para recortar.", + "Please select an area to crop first.": "Selecciona primero un área para recortar.", + "Please select an area to crop.": "Selecciona un área para recortar.", + "Please select an image file for the watermark.": "Selecciona un archivo de imagen para la marca de agua.", + "Please select at least one BMP file.": "Selecciona al menos un archivo BMP.", + "Please select at least one CSV file.": "Selecciona al menos un archivo CSV.", + "Please select at least one Excel file.": "Selecciona al menos un archivo de Excel.", + "Please select at least one HEIC file.": "Selecciona al menos un archivo HEIC.", + "Please select at least one JPG file.": "Selecciona al menos un archivo JPG.", + "Please select at least one JPG or JPEG2000 image.": "Selecciona al menos una imagen JPG o JPEG2000.", + "Please select at least one ODT file.": "Selecciona al menos un archivo ODT.", + "Please select at least one PDF file.": "Selecciona al menos un archivo PDF.", + "Please select at least one PowerPoint file.": "Selecciona al menos un archivo de PowerPoint.", + "Please select at least one RTF file.": "Selecciona al menos un archivo RTF.", + "Please select at least one SVG file.": "Selecciona al menos un archivo SVG.", + "Please select at least one TIFF file.": "Selecciona al menos un archivo TIFF.", + "Please select at least one Word document.": "Selecciona al menos un documento de Word.", + "Please select at least one file to attach.": "Selecciona al menos un archivo para adjuntar.", + "Please select at least one image file.": "Selecciona al menos un archivo de imagen.", + "Please select at least one text file.": "Selecciona al menos un archivo de texto.", + "Please select at least one {{FILETYPE_NAME}} file.": "Selecciona al menos un archivo {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Selecciona al menos un archivo {{TOOL_NAME}} (.eml o .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Selecciona al menos un archivo {{TOOL_NAME}}.", + "Please select even or odd pages.": "Selecciona páginas pares o impares.", + "Please select one or more PDF files.": "Selecciona uno o más archivos PDF.", + "Please select pages to delete.": "Selecciona las páginas que quieres eliminar.", + "Please select pages to duplicate.": "Selecciona las páginas que quieres duplicar.", + "Please select pages to mark for splitting.": "Selecciona las páginas que quieres marcar para dividir.", + "Please select pages to rotate.": "Selecciona las páginas que quieres rotar.", + "Please specify a page range for page-level attachments.": "Especifica un rango de páginas para los adjuntos a nivel de página.", + "Please upload PDF files.": "Sube archivos PDF.", + "Please upload PDFs first.": "Sube primero los PDF.", + "Please upload a .docx file first.": "Sube primero un archivo .docx.", + "Please upload a PDF file first.": "Sube primero un archivo PDF.", + "Please upload a PDF file.": "Sube un archivo PDF.", + "Please upload a PDF first.": "Sube primero un PDF.", + "Please upload a valid PDF file.": "Sube un archivo PDF válido.", + "Please upload at least one PDF file.": "Sube al menos un archivo PDF.", + "Please upload at least two PDF files to alternate and mix.": "Sube al menos dos archivos PDF para alternar y mezclar.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Sube un PDF base y un PDF de superposición o subposición.", + "Please upload valid PDF files.": "Sube archivos PDF válidos.", + "Please use the Download button in the PDF viewer toolbar above.": "Usa el botón Descargar de la barra de herramientas del visor de PDF de arriba.", + "Please wait for the PDF viewer to load.": "Espera a que se cargue el visor de PDF.", + "Please wait for the form to finish loading.": "Espera a que termine de cargarse el formulario.", + "Portrait": "Vertical", + "Position": "Posición", + "Post-processing for transparency compliance...": "Posprocesamiento para cumplir con la transparencia...", + "Posterize": "Posterizar", + "Posterizing PDF...": "Posterizando PDF...", + "PowerPoint to PDF": "PowerPoint a PDF", + "Pre Flatten": "Aplanado previo", + "Pre-flattening PDF...": "Aplanando PDF previamente...", + "Prefer JPEG 2000 for photos": "Preferir JPEG 2000 para fotos", + "Preparing PDF export...": "Preparando la exportación del PDF...", + "Preparing conversion...": "Preparando la conversión...", + "Preparing download...": "Preparando la descarga...", + "Preparing preview...": "Preparando la vista previa...", + "Presentations": "Presentaciones", + "Preserve PDF/A": "Conservar PDF/A", + "Preview": "Vista previa", + "Preview Error": "Error de vista previa", + "Preview Text": "Vista previa del texto", + "Previous page": "Página anterior", + "Print Form": "Imprimir formulario", + "Private data that editing apps store inside the PDF.": "Datos privados que las aplicaciones de edición guardan dentro del PDF.", + "Processed {{processedCount}} PDFs.": "Se procesaron {{processedCount}} PDF.", + "Processing Complete": "Procesamiento completado", + "Processing Dpi": "PPP de procesamiento", + "Processing Failed": "Falló el procesamiento", + "Processing PDF permissions...": "Procesando permisos del PDF...", + "Processing attachments...": "Procesando adjuntos...", + "Processing failed for {{name}}.": "Falló el procesamiento de {{name}}.", + "Processing file {{n}} of {{length}}...": "Procesando archivo {{n}} de {{length}}...", + "Processing images...": "Procesando imágenes...", + "Processing multiple PDFs...": "Procesando varios PDF...", + "Processing page {{i}} of {{numPages}}": "Procesando página {{i}} de {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Procesando página {{i}} de {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Procesando página {{n}} de {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Procesando página {{pageNum}} de {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Procesando página {{pageNum}} de {{totalPages}}...", + "Processing produced an empty file.": "El procesamiento produjo un archivo vacío.", + "Processing resulted in an empty file.": "El procesamiento dio como resultado un archivo vacío.", + "Processing sheet {{n}}...": "Procesando hoja {{n}}...", + "Processing {{name}}...": "Procesando {{name}}...", + "Processing {{nodeName}}...": "Procesando {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Procesando {{n}}/{{length}}: {{name}}...", + "Processing...": "Procesando...", + "Producer": "Productor", + "Publisher Files": "Archivos de Publisher", + "Purple": "Morado", + "PyMuPDF (Document Processing)": "PyMuPDF (procesamiento de documentos)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF no está configurado. Configúralo en los ajustes avanzados.", + "PyMuPDF module did not export expected PyMuPDF class.": "El módulo PyMuPDF no exportó la clase PyMuPDF esperada.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF produjo un archivo descifrado vacío.", + "PyMuPDF: not configured.": "PyMuPDF: no configurado.", + "QR Code": "Código QR", + "Quality": "Calidad", + "Quits application (cannot be overridden)": "Cierra la aplicación (no se puede anular)", + "RSA-PKCS1 signature does not verify against signer public key": "La firma RSA-PKCS1 no se verifica con la clave pública del firmante", + "RSA-PSS signature does not verify against signer public key": "La firma RSA-PSS no se verifica con la clave pública del firmante", + "Rasterization Complete": "Rasterización completada", + "Rasterization Partial": "Rasterización parcial", + "Rasterize": "Rasterizar", + "Rasterize Dpi": "PPP de rasterización", + "Rasterize pages to images": "Rasteriza las páginas a imágenes", + "Rasterize quality": "Calidad de rasterización", + "Rasterize resolution (DPI)": "Resolución de rasterización (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Se rasterizaron {{completed}} PDF, fallaron {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rasterizando {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rasterizando {{name}}...", + "Rasterizing...": "Rasterizando...", + "Rating must be between 0 and 5": "La valoración debe estar entre 0 y 5", + "Read Only": "Solo lectura", + "Reading CSV file...": "Leyendo archivo CSV...", + "Reading PDF...": "Leyendo PDF...", + "Reading XML file...": "Leyendo archivo XML...", + "Reading encrypted PDF...": "Leyendo PDF cifrado...", + "Reading files...": "Leyendo archivos...", + "Reading layer configuration...": "Leyendo la configuración de capas...", + "Reading {{name}} ({{n}}/{{length}})...": "Leyendo {{name}} ({{n}}/{{length}})...", + "Ready": "Listo", + "Reason": "Motivo", + "Red": "Rojo", + "Redact": "Redactar", + "Redact Mode": "Modo de redacción", + "Redact text from PDF": "Redacta texto del PDF", + "Redaction Failed": "Falló la redacción", + "Reduce PDF file size": "Reduce el tamaño del archivo PDF", + "Reduce color complexity": "Reducir la complejidad del color", + "Reduces file size by removing color information.": "Reduce el tamaño del archivo eliminando la información de color.", + "Reloads page": "Recarga la página", + "Remove": "Quitar", + "Remove All Attachments": "Quitar todos los adjuntos", + "Remove Annotations": "Eliminar anotaciones", + "Remove Blank Pages": "Eliminar páginas en blanco", + "Remove Embedded Files": "Quitar archivos incrustados", + "Remove Fonts": "Quitar fuentes", + "Remove Javascript": "Quitar JavaScript", + "Remove Layers": "Quitar capas", + "Remove Links": "Quitar enlaces", + "Remove Mark Info": "Quitar Mark Info", + "Remove Metadata": "Eliminar metadatos", + "Remove PDF password protection": "Quita la protección con contraseña del PDF", + "Remove Structure Tree": "Quitar árbol de estructura", + "Remove alternate images": "Quitar imágenes alternativas", + "Remove application data": "Quitar datos de la aplicación", + "Remove article threads": "Quitar hilos de artículos", + "Remove attachment": "Quitar adjunto", + "Remove blank pages automatically": "Elimina las páginas en blanco automáticamente", + "Remove document structure tree": "Quitar el árbol de estructura del documento", + "Remove file": "Quitar archivo", + "Remove metadata, scripts, and hidden data": "Elimina metadatos, scripts y datos ocultos", + "Remove output intents": "Quitar intenciones de salida", + "Remove page thumbnails": "Quitar miniaturas de página", + "Remove specific pages": "Elimina páginas específicas", + "Remove web capture information": "Quitar información de captura web", + "Remove {{name}}": "Quitar {{name}}", + "Removed \"{{beforeText}}\"": "Se quitó \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Imagen quitada ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "¡Se eliminaron {{length}} páginas en blanco correctamente!", + "Removing all metadata...": "Eliminando todos los metadatos...", + "Removing annotations...": "Eliminando anotaciones...", + "Removing redacted text from document data...": "Eliminando el texto redactado de los datos del documento...", + "Removing restrictions...": "Eliminando restricciones...", + "Removing {{length}} blank page(s)...": "Eliminando {{length}} páginas en blanco...", + "Render Error": "Error de renderizado", + "Rendering Page {{num}}...": "Renderizando página {{num}}...", + "Rendering page previews...": "Renderizando vistas previas de páginas...", + "Rendering page previews: {{current}}/{{total}}": "Renderizando vistas previas de páginas: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Renderizando página {{n}} de {{length}}...", + "Rendering preview for page {{pageNum}}...": "Renderizando vista previa de la página {{pageNum}}...", + "Reopens closed tab": "Reabre la pestaña cerrada", + "Repair": "Reparar", + "Repair Failed": "Falló la reparación", + "Repair corrupted PDF": "Repara un PDF dañado", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Se repararon {{length}} archivos. No se pudieron reparar: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Reparando {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Reparando {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Se reemplazó \"{{beforeText}}\" por \"{{afterText}}\"", + "Required": "Obligatorio", + "Resamples even when an image is only slightly above the limit.": "Remuestrea incluso cuando una imagen solo supera un poco el límite.", + "Reset Form": "Restablecer formulario", + "Reset and go back to file uploader? All unsaved changes will be lost.": "¿Restablecer y volver al cargador de archivos? Se perderán todos los cambios sin guardar.", + "Resolution": "Resolución", + "Retain Page Labels": "Conservar etiquetas de página", + "Retry Failed": "Reintentar los fallidos", + "Reverse Pages": "Invertir páginas", + "Reverse page order": "Invierte el orden de las páginas", + "Reversing page order...": "Invirtiendo el orden de las páginas...", + "Reversing {{name}} ({{n}}/{{length}})...": "Invirtiendo {{name}} ({{n}}/{{length}})...", + "Right": "Derecha", + "Right edge in points": "Borde derecho en puntos", + "Rotate": "Rotar", + "Rotate +90°": "Rotar +90°", + "Rotate all pages": "Rotar todas las páginas", + "Rotation": "Rotación", + "Rotation Variance": "Variación de rotación", + "Rotations applied successfully!": "¡Rotaciones aplicadas correctamente!", + "Rows": "Filas", + "Run Javascript": "Ejecutar JavaScript", + "Running OCR on page {{pageNum}}...": "Ejecutando OCR en la página {{pageNum}}...", + "Running...": "Ejecutando...", + "SVG": "SVG", + "SVG Files": "Archivos SVG", + "SVG to PDF": "SVG a PDF", + "Sanitize": "Sanear", + "Sanitized With Warnings": "Saneado con advertencias", + "Sanitizing PDF...": "Saneando PDF...", + "Saturation": "Saturación", + "Saved": "Guardado", + "Saving PDF with layer changes...": "Guardando PDF con los cambios de capas...", + "Scaling Mode": "Modo de escala", + "Scanner Effect": "Efecto escáner", + "Scanner effect applied successfully!": "¡Efecto de escáner aplicado correctamente!", + "Scanning page {{n}} of {{pageCount}}...": "Escaneando página {{n}} de {{pageCount}}...", + "Search Text": "Buscar texto", + "Search languages...": "Buscar idiomas...", + "Select Font": "Seleccionar fuente", + "Select a field to edit properties": "Selecciona un campo para editar sus propiedades", + "Select a field...": "Selecciona un campo...", + "Select to add this button to an existing group": "Selecciona para agregar este botón a un grupo existente", + "Selected Option": "Opción seleccionada", + "Self-Signed: Signer Identity Not Verified": "Autofirmado: no se verificó la identidad del firmante", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Los recursos de OCR autoalojados están configurados parcialmente. Define {{missing}} junto con las demás URL de recursos de Tesseract.", + "Separator": "Separador", + "Separator Color": "Color del separador", + "Separator Thickness": "Grosor del separador", + "Sepia": "Sepia", + "Serial Number:": "Número de serie:", + "Set custom destination": "Establecer destino personalizado", + "Shapes": "Formas", + "Sheet {{n}} {{sideLabel}}": "Hoja {{n}} {{sideLabel}}", + "Show": "Mostrar", + "Show password": "Mostrar contraseña", + "Show/Hide Field": "Mostrar/Ocultar campo", + "Sign Here": "Firmar aquí", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents no es un único objeto DER seguido de relleno de ceros", + "Signature Algorithm:": "Algoritmo de firma:", + "Signature Intact: Signer Identity Not Verified": "Firma intacta: no se verificó la identidad del firmante", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Los campos de firma son campos de firma de AcroForm y solo serían visibles en un visor de PDF avanzado.", + "Signature has a missing or malformed /ByteRange": "La firma tiene un /ByteRange ausente o mal formado", + "Signature scheme {{kind}} not implemented": "Esquema de firma {{kind}} no implementado", + "Signature {{n}}": "Firma {{n}}", + "Signatures": "Firmas", + "Signed By": "Firmado por", + "Signed On": "Firmado el", + "Signed PDF Not Changed": "PDF firmado sin cambios", + "Signed PDF downloaded successfully!": "¡PDF firmado descargado correctamente!", + "Signed PDF saved successfully!": "¡PDF firmado guardado correctamente!", + "Simple (1, 2, 3)": "Simple (1, 2, 3)", + "Simplify large color profiles": "Simplificar perfiles de color grandes", + "Skew Threshold": "Umbral de inclinación", + "Skip": "Omitir", + "Skip All": "Omitir todo", + "Skip Remaining": "Omitir el resto", + "Skip this file": "Omitir este archivo", + "Skipped: {{join}}.": "Omitidos: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Archivos más pequeños, pero solo pueden abrirlos los lectores compatibles con Brotli, como Firefox, MuPDF 1.26+ y Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Se omitieron algunos archivos porque no son imágenes compatibles.", + "Some files were skipped. Only BMP files are allowed.": "Se omitieron algunos archivos. Solo se permiten archivos BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Se omitieron algunos archivos. Solo se permiten archivos HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Se omitieron algunos archivos. Solo se permiten archivos JPG, JPEG, JP2 y JPX.", + "Some files were skipped. Only PDF files are allowed.": "Se omitieron algunos archivos. Solo se permiten archivos PDF.", + "Some files were skipped. Only PNG images are allowed.": "Se omitieron algunos archivos. Solo se permiten imágenes PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Se omitieron algunos archivos. Solo se permiten gráficos SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Se omitieron algunos archivos. Solo se permiten archivos TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Se omitieron algunos archivos. Solo se permiten imágenes WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Se omitieron algunos archivos. Solo se permiten formatos de imagen compatibles.", + "Some files were skipped. Only text files are allowed.": "Se omitieron algunos archivos. Solo se permiten archivos de texto.", + "Some pages could not be processed. Please try again.": "No se pudieron procesar algunas páginas. Inténtalo de nuevo.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "No se pudieron aplicar algunas marcas de redacción, por lo que el archivo no se descargó. Aplícalas o quítalas en el editor e inténtalo de nuevo.", + "Spacing": "Espaciado", + "Split PDF": "Dividir PDF", + "Split by Bookmarks": "Dividir por marcadores", + "Split pages into tile grid for poster printing": "Divide las páginas en una cuadrícula de mosaicos para imprimir pósteres", + "Split pages vertically or horizontally": "Divide las páginas vertical u horizontalmente", + "Splitting PDF pages...": "Dividiendo páginas del PDF...", + "Splitting PDF...": "Dividiendo PDF...", + "Spreadsheets": "Hojas de cálculo", + "Standard (192 DPI)": "Estándar (192 DPI)", + "Standard Size": "Tamaño estándar", + "Standardize all pages to a target size": "Estandariza todas las páginas a un tamaño objetivo", + "Standardizing pages...": "Estandarizando páginas...", + "Stitch all pages into one continuous page": "Une todas las páginas en una sola página continua", + "Straighten skewed PDF pages": "Endereza páginas de PDF inclinadas", + "Strip all annotations": "Quita todas las anotaciones", + "Style": "Estilo", + "Style Changed": "Estilo cambiado", + "Style changed ({{length}} regions)": "Estilo cambiado ({{length}} regiones)", + "Subject": "Asunto", + "Subset embedded fonts": "Crear subconjunto de las fuentes incrustadas", + "Success": "Éxito", + "Success!": "¡Éxito!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Se convirtieron correctamente {{length}} archivos CSV a PDF.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Se convirtieron correctamente {{length}} archivos de Excel a PDF.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Se convirtieron correctamente {{length}} archivos ODT a PDF.", + "Successfully converted {{length}} PDF(s) to DOCX.": "Se convirtieron correctamente {{length}} PDF a DOCX.", + "Successfully converted {{length}} PDF(s) to Markdown.": "Se convirtieron correctamente {{length}} PDF a Markdown.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "Se convirtieron correctamente {{length}} PDF a {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Se convirtieron correctamente {{length}} archivos PSD en un solo PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Se convirtieron correctamente {{length}} archivos de PowerPoint a PDF.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Se convirtieron correctamente {{length}} archivos RTF a PDF.", + "Successfully converted {{length}} Word document(s) to PDF.": "Se convirtieron correctamente {{length}} documentos de Word a PDF.", + "Successfully converted {{length}} files to PDF.": "Se convirtieron correctamente {{length}} archivos a PDF.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Se convirtieron correctamente {{length}} archivos {{TOOL_NAME}} a PDF.", + "Successfully converted {{name}} to DOCX.": "{{name}} se convirtió correctamente a DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} se convirtió correctamente a Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} se convirtió correctamente a PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} se convirtió correctamente a {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF extraído correctamente para uso con IA/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "Se extrajeron correctamente {{completed}} PDF para uso con IA/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF rasterizado correctamente a {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "Se rasterizaron correctamente {{completed}} PDF a {{dpi}} DPI.", + "Supported: CBZ, CBR": "Compatibles: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Compatibles: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Compatibles: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Compatibles: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Compatibles: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Compatibles: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Compatibles: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Compatibles: XPS, OXPS", + "Switches apps": "Cambia de aplicación", + "Switches tabs": "Cambia de pestaña", + "Table of Contents": "Tabla de contenidos", + "Table {{n}} (Page {{page}})": "Tabla {{n}} (página {{page}})", + "Tabloid": "Tabloide", + "Target Field": "Campo de destino", + "Target Kilobytes": "Kilobytes objetivo", + "Target Not Reached": "No se alcanzó el objetivo", + "Target Size": "Tamaño objetivo", + "Technical Details": "Detalles técnicos", + "Temperature": "Temperatura", + "Template \"{{name}}\" loaded.": "Plantilla \"{{name}}\" cargada.", + "Template \"{{name}}\" saved.": "Plantilla \"{{name}}\" guardada.", + "Text": "Texto", + "Text Color": "Color del texto", + "Text Files": "Archivos de texto", + "Text color changed successfully!": "¡Color del texto cambiado correctamente!", + "Text converted to PDF successfully!": "¡Texto convertido a PDF correctamente!", + "Text extracted successfully!": "¡Texto extraído correctamente!", + "Text to PDF": "Texto a PDF", + "That password did not open any of the remaining files.": "Esa contraseña no abrió ninguno de los archivos restantes.", + "The PDF file(s) do not contain any attachments to extract.": "Los archivos PDF no contienen adjuntos que extraer.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "El PDF tiene {{totalPages}} páginas, que no es divisible exactamente entre {{nValue}}. El último PDF contendrá {{remainder}} página(s).", + "The PDF might be corrupted or password protected.": "Puede que el PDF esté dañado o protegido con contraseña.", + "The PDF might be corrupted or password-protected.": "Puede que el PDF esté dañado o protegido con contraseña.", + "The PDF might be corrupted.": "Puede que el PDF esté dañado.", + "The PDF viewer is still initializing.": "El visor de PDF todavía se está inicializando.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "El PDF se descargó, pero no se pudieron completar estos pasos: {{join}}. Es posible que el contenido que cubren siga en el archivo.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "La URL devolvió un tipo de contenido inesperado: {{contentType}}. Se esperaba un archivo JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Los bytes excluidos por /ByteRange no son exactamente una firma codificada en hexadecimal", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Los bytes excluidos por /ByteRange no son el /Contents de esta firma", + "The compression engine returned an unreadable result.": "El motor de compresión devolvió un resultado ilegible.", + "The compression engine stopped unexpectedly.": "El motor de compresión se detuvo de forma inesperada.", + "The current password you entered is incorrect. Please try again.": "La contraseña actual que introdujiste es incorrecta. Inténtalo de nuevo.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Los siguientes nombres de campo ya existen en el PDF subido: {{conflictList}}. Cambia el nombre de estos campos antes de descargar.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Los siguientes nombres de campo se usan más de una vez: {{duplicateList}}. Cambia el nombre de estos campos para que sean únicos antes de descargar.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "El número de páginas indicado ({{length}}) no coincide con el número actual de páginas del documento ({{currentGridCount}}). Indica un orden completo para todas las páginas.", + "The password you entered is incorrect. Please try again.": "La contraseña que introdujiste es incorrecta. Inténtalo de nuevo.", + "The password you entered is wrong or the file is corrupted.": "La contraseña que introdujiste es incorrecta o el archivo está dañado.", + "The provided file could not be loaded as an image. It may be corrupted.": "No se pudo cargar el archivo proporcionado como imagen. Puede estar dañado.", + "The requested OCR language is not available: {{unavailableText}}.": "El idioma de OCR solicitado no está disponible: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "El orden de páginas indicado está incompleto o contiene números de página no válidos. Asegúrate de indicar una nueva posición para cada página original.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Estos archivos no son PDF válidos, por lo que no se agregaron: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Estos archivos están protegidos con contraseña: {{names}}. Introduce sus contraseñas en las tarjetas de archivo o quítalos, y vuelve a comprimir.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Esta compilación de BentoPDF solo incluye datos de OCR para {{availableText}}.", + "This PDF does not contain any digital signatures.": "Este PDF no contiene firmas digitales.", + "This PDF has no layers (OCG).": "Este PDF no tiene capas (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Este PDF está protegido con contraseña. Introduce la contraseña actual para continuar.", + "This document contains pages with different dimensions:": "Este documento contiene páginas con dimensiones distintas:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Este documento tiene 1 marca de censura que aún no se ha aplicado. Mientras una marca no se aplique, el contenido que hay debajo sigue en el archivo. ¿Aplicar todas las marcas y descargar?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Este documento tiene {{count}} marcas de censura que aún no se han aplicado. Mientras una marca no se aplique, el contenido que hay debajo sigue en el archivo. ¿Aplicar todas las marcas y descargar?", + "This feature requires {{name}} to be configured.": "Esta función requiere que {{name}} esté configurado.", + "This file is not a valid PDF.": "Este archivo no es un PDF válido.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Este módulo tiene licencia AGPL-3.0. Al configurarlo, aceptas los términos de su licencia.", + "This tool has been disabled": "Esta herramienta está deshabilitada", + "This tool is not available in your deployment. Contact your administrator for more information.": "Esta herramienta no está disponible en tu implementación. Ponte en contacto con tu administrador para más información.", + "Threshold": "Umbral", + "Tile": "Mosaico", + "Tile Gap X": "Separación X del mosaico", + "Tile Gap Y": "Separación Y del mosaico", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Marca de tiempo", + "Timestamp Failed": "Falló la marca de tiempo", + "Tint": "Tinte", + "Title": "Título", + "To actually fill or change the options, use our PDF Form Filler tool.": "Para rellenar o cambiar las opciones, usa nuestra herramienta Rellenar Formularios PDF.", + "Toggle": "Alternar", + "Toggle style": "Alternar estilo", + "Toggle sync scroll": "Alternar desplazamiento sincronizado", + "Tool Unavailable": "Herramienta no disponible", + "Tooltip / Help Text": "Información sobre herramientas / Texto de ayuda", + "Top": "Arriba", + "Top Center": "Arriba al centro", + "Top Left": "Arriba a la izquierda", + "Top Right": "Arriba a la derecha", + "Top edge in points": "Borde superior en puntos", + "Total Pages": "Total de páginas", + "Transparent Background": "Fondo transparente", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Prueba JPEG 2000 frente a JPEG para cada imagen y conserva la más pequeña.", + "Trim margins from all pages": "Recorta los márgenes de todas las páginas", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Verificación de confianza: {{trustVerified}}/{{length}} firmas verificadas con el certificado personalizado", + "Trusted": "De confianza", + "Trusted certificate loaded": "Certificado de confianza cargado", + "Tsa Url": "URL de TSA", + "Turns off quality, resolution and every other lossy image step.": "Desactiva la calidad, la resolución y cualquier otro paso de imagen con pérdida.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "La URL debe comenzar con http:// o https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "No se pudo descifrar el PDF con la contraseña proporcionada.", + "Unable to repair any of the uploaded PDF files.": "No se pudo reparar ninguno de los archivos PDF subidos.", + "Unembed standard fonts": "Desincrustar fuentes estándar", + "Unembed standard-font look-alikes": "Desincrustar fuentes similares a las estándar", + "Unexpected delimiter in content stream": "Delimitador inesperado en el flujo de contenido", + "Unexpected reply from the engine.": "Respuesta inesperada del motor.", + "Uniform": "Uniforme", + "Unique Page Sizes": "Tamaños de página únicos", + "Unknown": "Desconocido", + "Unknown error": "Error desconocido", + "Unknown error occurred in worker.": "Ocurrió un error desconocido en el worker.", + "Unknown error occurred.": "Ocurrió un error desconocido.", + "Unlock": "Desbloquear", + "Unlock All": "Desbloquear todo", + "Unlock Remaining ({{remaining}})": "Desbloquear los restantes ({{remaining}})", + "Unlocked": "Desbloqueado", + "Unlocked {{unlocked}} of {{length}} files.": "Se desbloquearon {{unlocked}} de {{length}} archivos.", + "Unlocking...": "Desbloqueando...", + "Unresolved optional content reference": "Referencia de contenido opcional sin resolver", + "Unsupported ECDSA curve in signer certificate": "Curva ECDSA no compatible en el certificado del firmante", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Imagen no compatible. Usa un PNG o JPG para la marca de agua.", + "Unsupported digest OID {{digestOid}}": "OID de resumen {{digestOid}} no compatible", + "Unsupported file type: .{{ext}}": "Tipo de archivo no compatible: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID de algoritmo de firma {{oid}} no compatible", + "Unterminated array or dictionary in content stream": "Matriz o diccionario sin terminar en el flujo de contenido", + "Unterminated hex string in content stream": "Cadena hexadecimal sin terminar en el flujo de contenido", + "Unterminated inline image in content stream": "Imagen en línea sin terminar en el flujo de contenido", + "Unterminated string in content stream": "Cadena sin terminar en el flujo de contenido", + "Unverified: Unsupported Signature Algorithm": "No verificada: algoritmo de firma no compatible", + "Updating metadata...": "Actualizando metadatos...", + "Upload Certificate": "Subir certificado", + "Upload Comics": "Subir cómics", + "Upload Documents": "Subir documentos", + "Upload EPUB Files": "Subir archivos EPUB", + "Upload Email Files": "Subir archivos de correo electrónico", + "Upload FB2 Files": "Subir archivos FB2", + "Upload Images": "Subir imágenes", + "Upload JSON Files": "Subir archivos JSON", + "Upload MOBI Files": "Subir archivos MOBI", + "Upload Markdown Files": "Subir archivos Markdown", + "Upload ODG Files": "Subir archivos ODG", + "Upload PDFs": "Subir PDF", + "Upload PUB Files": "Subir archivos PUB", + "Upload Pages Files": "Subir archivos de Pages", + "Upload Presentations": "Subir presentaciones", + "Upload SVG Files": "Subir archivos SVG", + "Upload Spreadsheets": "Subir hojas de cálculo", + "Upload Text Files": "Subir archivos de texto", + "Upload Visio Files": "Subir archivos de Visio", + "Upload WPD Files": "Subir archivos WPD", + "Upload WPS Files": "Subir archivos WPS", + "Upload XML Files": "Subir archivos XML", + "Upload XPS Files": "Subir archivos XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Sube un PDF y haz clic en \"Generar vista previa\" para ver el diseño del folleto", + "Upload images and convert to PDF": "Sube imágenes y conviértelas a PDF", + "Upload one or more PDF files": "Sube uno o más archivos PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Mayúsculas A-Z, dígitos 0-9 y - . $ / + % ESPACIO", + "Use same password for all files": "Usar la misma contraseña para todos los archivos", + "User Password": "Contraseña de usuario", + "VSD to PDF": "VSD a PDF", + "Valid From": "Válido desde", + "Valid Signature": "Firma válida", + "Valid Until": "Válido hasta", + "Validating {{n}} of {{length}}: {{name}}": "Validando {{n}} de {{length}}: {{name}}", + "Validating...": "Validando...", + "Value": "Valor", + "Value (e.g., Marketing)": "Valor (p. ej., Marketing)", + "Vertical": "Vertical", + "Viewer not ready": "Visor no listo", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Visor no listo. Sube un PDF y espera a que termine de cargarse.", + "Visibility": "Visibilidad", + "Visio Files": "Archivos de Visio", + "WPD to PDF": "WPD a PDF", + "WPS Files": "Archivos WPS", + "WPS to PDF": "WPS a PDF", + "Watermark": "Marca de agua", + "Watermark added successfully!": "¡Marca de agua agregada correctamente!", + "Web Crypto API not available in this context": "La API Web Crypto no está disponible en este contexto", + "Web Crypto import/verify failed: {{error}}": "Falló la importación/verificación de Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "Lista de permitidos", + "Width ({{unit}})": "Ancho ({{unit}})", + "Word": "Word", + "Word Documents": "Documentos de Word", + "Word to PDF": "Word a PDF", + "WordPerfect Files": "Archivos de WordPerfect", + "Worker crashed": "El worker falló", + "Worker error occurred. Check console for details.": "Ocurrió un error en el worker. Consulta la consola para más detalles.", + "Workflow completed": "Flujo de trabajo completado", + "Wrong password": "Contraseña incorrecta", + "Wrong password for: {{join}}": "Contraseña incorrecta para: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Contraseña incorrecta o no se pudo descifrar \"{{name}}\".", + "X Position": "Posición X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Archivos XML", + "XML to PDF": "XML a PDF", + "XMP Metadata": "Metadatos XMP", + "XPS Files": "Archivos XPS", + "XPS to PDF": "XPS a PDF", + "Y Position": "Posición Y", + "Year must be between 1900 and 2100": "El año debe estar entre 1900 y 2100", + "Yellow": "Amarillo", + "Yellowish": "Amarillento", + "You cannot delete the last page of the document.": "No puedes eliminar la última página del documento.", + "Your PDF has been cropped and the download has started.": "Tu PDF se recortó y la descarga ha comenzado.", + "Your PDF has been downloaded successfully.": "Tu PDF se descargó correctamente.", + "Your PDF has been posterized.": "Tu PDF se posterizó.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Tus redacciones se aplican a las páginas, pero este archivo está cifrado, por lo que BentoPDF no puede eliminar también las copias del texto redactado de sus propiedades, marcadores y adjuntos. Para una limpieza completa, redacta una copia sin cifrar y agrega una contraseña después con Proteger PDF. ¿Descargar de todos modos?", + "Your workflow needs at least one input node and one output node to run.": "Tu flujo de trabajo necesita al menos un nodo de entrada y uno de salida para ejecutarse.", + "ZIP archive created successfully!": "¡Archivo ZIP creado correctamente!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "p. ej. dd/mm/aaaa HH:MM:ss", + "form": "formulario", + "https://example.com": "https://example.com", + "signature found": "firma encontrada", + "signatures found": "firmas encontradas", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} nodo", + "{{count}} nodes": "{{count}} nodos", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 página", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} páginas", + "{{length}} Files Need a Password": "{{length}} archivos necesitan contraseña", + "{{length}} PDF file(s) selected": "{{length}} archivos PDF seleccionados", + "{{length}} PDF files selected": "{{length}} archivos PDF seleccionados", + "{{length}} attachment(s) extracted successfully!": "¡{{length}} adjuntos extraídos correctamente!", + "{{length}} file • {{totalPages}} total pages": "{{length}} archivo • {{totalPages}} páginas en total", + "{{length}} file(s) attached successfully.": "{{length}} archivos adjuntados correctamente.", + "{{length}} files • {{totalPages}} total pages": "{{length}} archivos • {{totalPages}} páginas en total", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Estaba protegido con contraseña, así que la copia comprimida no tiene contraseña. Usa Proteger PDF para agregarla de nuevo.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} páginas)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} está firmado digitalmente, por lo que se dejó tal cual. Comprimirlo rompería la firma. Para comprimirlo de todos modos, activa Anular protección de contenido en Ajustes personalizados; se eliminarán sus firmas.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} no es un PDF válido, por lo que no se agregó.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} está protegido con contraseña. Introduce su contraseña en la tarjeta del archivo y vuelve a comprimir.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • No se pudo cargar el número de páginas", + "{{size}} • Loading pages...": "{{size}} • Cargando páginas...", + "{{size}} • Loading...": "{{size}} • Cargando...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} páginas", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} páginas", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} páginas", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} páginas", + "{{size}} • {{value}} pages": "{{size}} • {{value}} páginas", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF descifrados correctamente.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF linealizados correctamente.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} páginas → {{numSheets}} hojas de salida", + "{{validCount}} valid": "{{validCount}} válidas", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 página", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} páginas" +} diff --git a/public/locales/fa/common.json b/public/locales/fa/common.json index 4a1d3ac3..6732ed59 100644 --- a/public/locales/fa/common.json +++ b/public/locales/fa/common.json @@ -9,7 +9,8 @@ "openMainMenu": "باز کردن منوی اصلی", "language": "زبان", "searchLanguage": "جستجوی زبان…", - "noLanguagesFound": "زبانی یافت نشد" + "noLanguagesFound": "زبانی یافت نشد", + "breadcrumb": "مسیر صفحه" }, "donation": { "message": "BentoPDF را دوست دارید؟ کمک کنید رایگان و متن‌باز بماند!", @@ -236,6 +237,10 @@ "aboutUs": "دربارهٔ ما", "faqLink": "سؤالات متداول", "contactUs": "تماس با ما", + "tools": "ابزارها", + "pdfConverter": "مبدل PDF", + "pdfSecurity": "امنیت PDF", + "mergeSplit": "ادغام و تقسیم PDF", "legal": "حقوقی", "termsAndConditions": "شرایط و ضوابط", "privacyPolicy": "سیاست حفظ حریم خصوصی", diff --git a/public/locales/fa/tools.json b/public/locales/fa/tools.json index 560417fa..b0332032 100644 --- a/public/locales/fa/tools.json +++ b/public/locales/fa/tools.json @@ -106,7 +106,7 @@ "tipRedoZ": "ازنو (⇧⌘Z)", "tipFileDetails": "جزئیات فایل", "tipEditExistingContent": "ویرایش محتوای موجود", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "آنچه ابزار ویرایش تغییر می‌دهد — دامنه را در صفحات شلوغ محدود کنید", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "آنچه ابزار ویرایش تغییر می‌دهد: دامنه را در صفحات شلوغ محدود کنید", "tipClickThePageToAddATextBox": "برای افزودن کادر متن روی صفحه کلیک کنید", "tipSpellCheckLanguage": "زبان غلط‌یاب", "tipFindAndReplace": "یافتن و جایگزینی", diff --git a/public/locales/fa/ui.json b/public/locales/fa/ui.json new file mode 100644 index 00000000..d62a814d --- /dev/null +++ b/public/locales/fa/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(اصلاح‌شده)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} مورد دیگر...", + "- Error parsing XMP XML. Displaying raw. -": "- خطا در تجزیهٔ XMP XML. نمایش خام. -", + "- No Info Dictionary data found -": "- داده‌ای در Info Dictionary یافت نشد -", + "- No XMP metadata found -": "- فرادادهٔ XMP یافت نشد -", + "- No interactive form fields found -": "- فیلد فرم تعاملی یافت نشد -", + "- No parseable XMP properties found -": "- ویژگی XMP قابل تجزیه یافت نشد -", + "-- Select existing group --": "-- انتخاب گروه موجود --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1° (بسیار حساس)", + "0.5° (Default)": "0.5° (پیش‌فرض)", + "1.0° (Normal)": "1.0° (عادی)", + "100 (Fast)": "100 (سریع)", + "150 (Default)": "150 (پیش‌فرض)", + "1x2 (Booklet)": "1x2 (دفترچه)", + "2.0° (Less Sensitive)": "2.0° (کم‌حساس)", + "200 (Better)": "200 (بهتر)", + "200 (Good)": "200 (خوب)", + "2x2 (4-up)": "2x2 (چهار صفحه در یک برگ)", + "2x4 (8-up)": "2x4 (هشت صفحه در یک برگ)", + "300 (Best Quality)": "300 (بهترین کیفیت)", + "300 (Print)": "300 (چاپ)", + "4x4 (16-up)": "4x4 (شانزده صفحه در یک برگ)", + "600 (High Quality)": "600 (کیفیت بالا)", + "72 (Screen)": "72 (صفحه‌نمایش)", + "90° Clockwise": "90° ساعتگرد", + "90° Counter-clockwise": "90° پادساعتگرد", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "فیلدی با نام «{{fieldName}}» از قبل وجود دارد. پیش از دانلود، نام این فیلد را به یک نام یکتا تغییر دهید.", + "A new version of BentoPDF is available. Reload to update?": "نسخهٔ جدیدی از BentoPDF در دسترس است. برای به‌روزرسانی بارگذاری مجدد شود؟", + "A single PDF file": "یک فایل PDF", + "A template with this name already exists.": "قالبی با این نام از قبل وجود دارد.", + "ASCII characters (letters, numbers, symbols)": "نویسه‌های ASCII (حروف، اعداد، نمادها)", + "Action": "عملیات", + "Add Blank Page": "افزودن صفحهٔ خالی", + "Add Bookmark": "افزودن نشانک", + "Add Child Bookmark": "افزودن نشانک فرزند", + "Add Child Layer": "افزودن لایهٔ فرزند", + "Add More Comics": "افزودن کمیک‌های بیشتر", + "Add More Documents": "افزودن اسناد بیشتر", + "Add More EPUB Files": "افزودن فایل‌های EPUB بیشتر", + "Add More Email Files": "افزودن فایل‌های ایمیل بیشتر", + "Add More FB2 Files": "افزودن فایل‌های FB2 بیشتر", + "Add More Files": "افزودن فایل‌های بیشتر", + "Add More Images": "افزودن تصاویر بیشتر", + "Add More JSON Files": "افزودن فایل‌های JSON بیشتر", + "Add More MOBI Files": "افزودن فایل‌های MOBI بیشتر", + "Add More Markdown Files": "افزودن فایل‌های Markdown بیشتر", + "Add More ODG Files": "افزودن فایل‌های ODG بیشتر", + "Add More PUB Files": "افزودن فایل‌های PUB بیشتر", + "Add More Pages Files": "افزودن فایل‌های Pages بیشتر", + "Add More Presentations": "افزودن ارائه‌های بیشتر", + "Add More SVG Files": "افزودن فایل‌های SVG بیشتر", + "Add More Spreadsheets": "افزودن صفحه‌گسترده‌های بیشتر", + "Add More Text Files": "افزودن فایل‌های متنی بیشتر", + "Add More Visio Files": "افزودن فایل‌های Visio بیشتر", + "Add More WPD Files": "افزودن فایل‌های WPD بیشتر", + "Add More WPS Files": "افزودن فایل‌های WPS بیشتر", + "Add More XML Files": "افزودن فایل‌های XML بیشتر", + "Add More XPS Files": "افزودن فایل‌های XPS بیشتر", + "Add a new layer to get started!": "برای شروع، یک لایهٔ جدید اضافه کنید!", + "Add a text box": "افزودن کادر متن", + "Add an RFC 3161 document timestamp": "افزودن مُهر زمانی سند طبق RFC 3161", + "Add an image": "افزودن تصویر", + "Add at least one node to run the workflow.": "برای اجرای گردش کار، دست‌کم یک گره اضافه کنید.", + "Add child": "افزودن فرزند", + "Add child layer": "افزودن لایهٔ فرزند", + "Add header and footer text": "افزودن متن سرصفحه و پاصفحه", + "Add page numbers": "افزودن شماره صفحه", + "Add searchable text layer via OCR": "افزودن لایهٔ متن قابل جستجو با OCR", + "Add text watermark": "افزودن واترمارک متنی", + "Add/Edit/Extract Attachments": "افزودن/ویرایش/استخراج پیوست‌ها", + "Added": "افزوده‌شده", + "Added \"{{afterText}}\"": "«{{afterText}}» اضافه شد", + "Added image ({{width}}×{{height}})": "تصویر اضافه شد ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} صفحهٔ خالی با موفقیت اضافه شد!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} صفحهٔ خالی با موفقیت اضافه شد!", + "Adding header & footer...": "در حال افزودن سرصفحه و پاصفحه...", + "Adding page numbers...": "در حال افزودن شماره صفحه...", + "Adding watermark...": "در حال افزودن واترمارک...", + "Adding {{insertCount}} blank page...": "در حال افزودن {{insertCount}} صفحهٔ خالی...", + "Adding {{insertCount}} blank pages...": "در حال افزودن {{insertCount}} صفحهٔ خالی...", + "Adding {{name}} ({{n}}/{{length}})...": "در حال افزودن {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "تنظیم رنگ‌ها", + "Adjust brightness, contrast, and colors": "تنظیم روشنایی، کنتراست و رنگ‌ها", + "Advanced": "پیشرفته", + "Advanced Feature Required": "قابلیت پیشرفته لازم است", + "Advanced Settings": "تنظیمات پیشرفته", + "After Page": "بعد از صفحه", + "After Page...": "بعد از صفحه...", + "Align Objects": "تراز کردن اشیا", + "Alignment": "ترازبندی", + "All": "همه", + "All files repaired successfully!": "همهٔ فایل‌ها با موفقیت ترمیم شدند!", + "Alternate Merge": "ادغام یک‌درمیان", + "Alternating and mixing pages...": "در حال ادغام یک‌درمیان صفحات...", + "Always resample to that resolution": "همیشه با آن وضوح بازنمونه‌برداری شود", + "An error occurred during compression. Error: {{error}}": "هنگام فشرده‌سازی خطایی رخ داد. خطا: {{error}}", + "An error occurred during conversion. Error: {{error}}": "هنگام تبدیل خطایی رخ داد. خطا: {{error}}", + "An error occurred during conversion. Error: {{message}}": "هنگام تبدیل خطایی رخ داد. خطا: {{message}}", + "An error occurred during cropping.": "هنگام برش خطایی رخ داد.", + "An error occurred during extraction. Error: {{error}}": "هنگام استخراج خطایی رخ داد. خطا: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "هنگام رستر کردن خطایی رخ داد. خطا: {{error}}", + "An error occurred during sanitization: {{msg}}": "هنگام پاک‌سازی خطایی رخ داد: {{msg}}", + "An error occurred while combining pages.": "هنگام ترکیب صفحات خطایی رخ داد.", + "An error occurred while creating the N-Up PDF.": "هنگام ساخت PDF با چند صفحه در هر برگ (N-Up) خطایی رخ داد.", + "An error occurred while creating the booklet.": "هنگام ساخت دفترچه خطایی رخ داد.", + "An error occurred while dividing the PDF.": "هنگام تقسیم PDF خطایی رخ داد.", + "An error occurred while mixing the PDFs.": "هنگام ادغام یک‌درمیان PDFها خطایی رخ داد.", + "An error occurred while standardizing pages.": "هنگام یکسان‌سازی صفحات خطایی رخ داد.", + "An error occurred while trying to remove metadata.": "هنگام حذف فراداده خطایی رخ داد.", + "An error occurred: {{error}}": "خطایی رخ داد: {{error}}", + "An error occurred: {{error}}.": "خطایی رخ داد: {{error}}.", + "An owner password is required when setting permissions": "برای تنظیم مجوزها، رمز عبور مالک لازم است", + "An unexpected error occurred during the repair process.": "هنگام ترمیم خطای غیرمنتظره‌ای رخ داد.", + "An unexpected error occurred.": "خطای غیرمنتظره‌ای رخ داد.", + "Analyzing data structure...": "در حال تحلیل ساختار داده...", + "Analyzing full PDF metadata...": "در حال تحلیل کامل فرادادهٔ PDF...", + "Analyzing signatures...": "در حال تحلیل امضاها...", + "Angle": "زاویه", + "Annotations removed successfully!": "حاشیه‌نویسی‌ها با موفقیت حذف شدند!", + "Any text, URL, or data": "هر متن، URL یا داده", + "Application": "برنامه", + "Apply a digital signature to PDF": "اعمال امضای دیجیتال روی PDF", + "Apply and download": "اعمال و دانلود", + "Apply redactions?": "ردگیری‌ها اعمال شوند؟", + "Apply scanner simulation effect": "اعمال جلوهٔ شبیه‌سازی اسکنر", + "Applying Bates numbers...": "در حال اعمال شماره‌های Bates...", + "Applying color adjustments...": "در حال اعمال تنظیمات رنگ...", + "Applying crop...": "در حال اعمال برش...", + "Applying redactions...": "در حال اعمال ردگیری‌ها...", + "Applying rotations...": "در حال اعمال چرخش‌ها...", + "Applying scanner effect...": "در حال اعمال جلوهٔ اسکنر...", + "Applying timestamp...": "در حال اعمال مُهر زمانی...", + "Applying {{replace}}...": "در حال اعمال {{replace}}...", + "Archive contains an oversized image entry.": "آرشیو شامل یک تصویر بیش‌ازحد بزرگ است.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "آرشیو تصاویر بسیار زیادی دارد (حداکثر {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "آرشیو پس از استخراج بیش‌ازحد بزرگ است.", + "Are you sure you want to reset? All your work will be lost.": "مطمئنید می‌خواهید بازنشانی کنید؟ همهٔ کارهای شما از بین می‌رود.", + "Area (Coordinates)": "ناحیه (مختصات)", + "Area ({{unit}}²)": "مساحت ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial، Times New Roman و Courier New به معادل‌های داخلی نگاشت می‌شوند. فقط در صورت امن بودن اعمال می‌شود.", + "Arrange multiple pages per sheet": "چیدن چند صفحه در هر برگ", + "Arrange pages for booklet printing": "چیدن صفحات برای چاپ دفترچه", + "Aspect Ratio": "نسبت ابعاد", + "At least one PDF document is required for export.": "برای خروجی گرفتن دست‌کم یک سند PDF لازم است.", + "At least two valid PDFs are required.": "دست‌کم دو PDF معتبر لازم است.", + "Attaching files to PDF...": "در حال پیوست کردن فایل‌ها به PDF...", + "Attachments updated successfully!": "پیوست‌ها با موفقیت به‌روزرسانی شدند!", + "Author": "نویسنده", + "Auto (Keep Original)": "خودکار (حفظ اصل)", + "Back": "پشت", + "Back to Home": "بازگشت به خانه", + "Background Color": "رنگ پس‌زمینه", + "Background color changed successfully!": "رنگ پس‌زمینه با موفقیت تغییر کرد!", + "Barcode": "بارکد", + "Barcode Format": "قالب بارکد", + "Barcode Value": "مقدار بارکد", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "شماره‌های Bates اعمال شد! ({{batesStart}} تا {{n}})", + "Beginning": "ابتدا", + "Binarize": "دودویی‌سازی", + "Blank Position": "موقعیت صفحهٔ خالی", + "Blue": "آبی", + "Blur": "محو کردن", + "Bold": "توپر", + "Bold & Italic": "توپر و مورب", + "Booklet": "دفترچه", + "Booklet created with {{numSheets}} sheets!": "دفترچه با {{numSheets}} برگ ساخته شد!", + "Bookmarks imported from JSON!": "نشانک‌ها از JSON درون‌ریزی شدند!", + "Bookmarks page": "صفحهٔ نشانک‌ها", + "Border": "کادر", + "Border Color": "رنگ کادر", + "Bottom": "پایین", + "Bottom Center": "پایین وسط", + "Bottom Left": "پایین چپ", + "Bottom Right": "پایین راست", + "Bottom edge in points": "لبهٔ پایین (بر حسب پوینت)", + "Brightness": "روشنایی", + "Brotli and rasterizing were skipped to keep it PDF/A.": "برای حفظ PDF/A، Brotli و رستر کردن نادیده گرفته شدند.", + "Brotli compression (PDF 2.0)": "فشرده‌سازی Brotli (PDF 2.0)", + "Browser Note:": "نکتهٔ مرورگر:", + "Building new PDF...": "در حال ساخت PDF جدید...", + "Building page pairing model...": "در حال ساخت مدل جفت‌سازی صفحات...", + "Button": "دکمه", + "ByteRange does not start at the beginning of the file": "ByteRange از ابتدای فایل شروع نمی‌شود", + "ByteRange out of bounds": "ByteRange خارج از محدوده است", + "CBZ to PDF": "CBZ به PDF", + "CSV Loaded": "CSV بارگذاری شد", + "CSV file is empty": "فایل CSV خالی است", + "Cancel": "لغو", + "Cannot Delete": "حذف ممکن نیست", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "دسترسی به کنترل‌های نمایشگر ممکن نیست. لطفاً از دکمهٔ دانلود در نوار ابزار نمایشگر PDF بالا استفاده کنید.", + "Cannot delete all pages": "نمی‌توان همهٔ صفحات را حذف کرد", + "Cannot delete all pages.": "نمی‌توان همهٔ صفحات را حذف کرد.", + "Canvas context failed": "زمینهٔ Canvas ناموفق بود", + "Canvas context unavailable": "زمینهٔ Canvas در دسترس نیست", + "Canvas toBlob conversion failed.": "تبدیل Canvas toBlob ناموفق بود.", + "Canvas toBlob failed": "Canvas toBlob ناموفق بود", + "Center": "وسط", + "Certificate (.pfx, .p12, .pem)": "گواهی (.pfx، .p12، .pem)", + "Certificate Expired": "گواهی منقضی شده است", + "Certificate Password": "رمز عبور گواهی", + "Certificate unlocked": "قفل گواهی باز شد", + "Change Certificate": "تغییر گواهی", + "Change background color": "تغییر رنگ پس‌زمینه", + "Changing background color...": "در حال تغییر رنگ پس‌زمینه...", + "Changing text color...": "در حال تغییر رنگ متن...", + "Character": "نویسه", + "Checked State": "حالت انتخاب‌شده", + "Choose a valid page range.": "یک بازهٔ صفحهٔ معتبر انتخاب کنید.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "یکی از زبان‌های همراه برنامه را انتخاب کنید یا بستهٔ بدون اینترنت را با افزودن زبان موردنظر به --ocr-languages دوباره بسازید.", + "Cleanup": "پاکسازی", + "Click on PDF to Pick Location": "برای انتخاب مکان روی PDF کلیک کنید", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "روی دکمهٔ بالا کلیک کنید، سپس روی جایی از PDF که می‌خواهید نشانک به آن برود کلیک کنید", + "Click to Upload Image": "برای بارگذاری تصویر کلیک کنید", + "Clicking this field in the PDF will open a file picker to upload an image.": "کلیک روی این فیلد در PDF، انتخابگر فایل را برای بارگذاری تصویر باز می‌کند.", + "Clip invisible parts of images": "برش بخش‌های نامرئی تصاویر", + "Close": "بستن", + "Close (Esc)": "بستن (Esc)", + "Close panel": "بستن پنل", + "Closes tab": "برگه را می‌بندد", + "Closes window": "پنجره را می‌بندد", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (نشانک‌ها و فراداده)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF پیکربندی نشده است. لطفاً آن را در تنظیمات WASM پیکربندی کنید.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF یک فایل رمزگشایی‌شدهٔ خالی تولید کرد.", + "CoherentPDF: not configured.": "CoherentPDF: پیکربندی نشده است.", + "Color": "رنگ", + "Color adjustments applied successfully!": "تنظیمات رنگ با موفقیت اعمال شد!", + "Colors inverted successfully!": "رنگ‌ها با موفقیت وارونه شدند!", + "Cols": "ستون‌ها", + "Combine multiple PDFs into one": "ترکیب چند PDF در یک فایل", + "Combine to Single Page": "ترکیب در یک صفحه", + "Combining pages...": "در حال ترکیب صفحات...", + "Comic Archives": "آرشیوهای کمیک", + "Comments and markup become part of the page. Form fields and links keep working.": "نظرات و نشانه‌گذاری‌ها بخشی از صفحه می‌شوند. فیلدهای فرم و پیوندها همچنان کار می‌کنند.", + "Complete": "کامل شد", + "Complete!": "کامل شد!", + "Compress": "فشرده‌سازی", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF فشرده شد. حجم کل از {{totalOriginalSize}} به {{totalCompressedSize}} کاهش یافت ({{value}}٪ صرفه‌جویی).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF فشرده شد. حجم کل: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "در حال فشرده‌سازی چند PDF...", + "Compressing to {{size}}...": "در حال فشرده‌سازی تا {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "در حال فشرده‌سازی {{n}}/{{length}}: {{name}}...", + "Compressing...": "در حال فشرده‌سازی...", + "Compression Complete": "فشرده‌سازی کامل شد", + "Compression Finished": "فشرده‌سازی تمام شد", + "Compression Level": "سطح فشرده‌سازی", + "Configure": "پیکربندی", + "Confirm": "تأیید", + "Confirm Action": "تأیید عملیات", + "Conformance": "انطباق", + "Connected": "متصل", + "Contact Info": "اطلاعات تماس", + "Content": "محتوا", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "هش محتوا با ویژگی messageDigest مطابقت ندارد: PDF پس از امضا تغییر کرده است", + "Contrast": "کنتراست", + "Conversion Complete": "تبدیل کامل شد", + "Conversion Error": "خطای تبدیل", + "Conversion engine ready!": "موتور تبدیل آماده است!", + "Conversion failed: could not create PDF/A definition": "تبدیل ناموفق بود: ساخت تعریف PDF/A ممکن نشد", + "Convert Apple Pages documents to PDF": "تبدیل اسناد Apple Pages به PDF", + "Convert EPUB ebooks to PDF": "تبدیل کتاب‌های الکترونیکی EPUB به PDF", + "Convert Excel spreadsheets to PDF": "تبدیل صفحات گسترده Excel به PDF", + "Convert FB2 e-books to PDF": "تبدیل کتاب‌های الکترونیکی FB2 به PDF", + "Convert JSON files to PDF": "تبدیل فایل‌های JSON به PDF", + "Convert MOBI e-books to PDF": "تبدیل کتاب‌های الکترونیکی MOBI به PDF", + "Convert Markdown files to PDF": "تبدیل فایل‌های Markdown به PDF", + "Convert Microsoft Publisher to PDF": "تبدیل Microsoft Publisher به PDF", + "Convert OpenDocument Graphics to PDF": "تبدیل OpenDocument Graphics به PDF", + "Convert PDF pages to SVG": "تبدیل صفحات PDF به SVG", + "Convert PDF pages to images (ZIP)": "تبدیل صفحات PDF به تصویر (ZIP)", + "Convert PDF tables to CSV": "تبدیل جدول‌های PDF به CSV", + "Convert PDF tables to Excel": "تبدیل جدول‌های PDF به Excel", + "Convert PDF to Markdown text": "تبدیل PDF به متن Markdown", + "Convert PDF to PDF/A for archiving": "تبدیل PDF به PDF/A برای بایگانی", + "Convert PDF to Word document": "تبدیل PDF به سند Word", + "Convert PowerPoint presentations to PDF": "تبدیل ارائه‌های PowerPoint به PDF", + "Convert SVG files to PDF": "تبدیل فایل‌های SVG به PDF", + "Convert To Grayscale": "تبدیل به خاکستری", + "Convert Visio diagrams (VSD/VSDX) to PDF": "تبدیل نمودارهای Visio (VSD/VSDX) به PDF", + "Convert WPS Office documents to PDF": "تبدیل اسناد WPS Office به PDF", + "Convert Word documents to PDF": "تبدیل اسناد Word به PDF", + "Convert WordPerfect documents to PDF": "تبدیل اسناد WordPerfect به PDF", + "Convert XML documents to PDF": "تبدیل اسناد XML به PDF", + "Convert XPS/OXPS documents to PDF": "تبدیل اسناد XPS/OXPS به PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "تبدیل آرشیوهای کمیک (CBZ/CBR) به PDF", + "Convert email files (.eml, .msg) to PDF": "تبدیل فایل‌های ایمیل (.eml، .msg) به PDF", + "Convert fonts to vector outlines": "تبدیل قلم‌ها به خطوط برداری", + "Convert plain text to PDF": "تبدیل متن ساده به PDF", + "Convert to grayscale": "تبدیل به خاکستری", + "Convert to greyscale": "تبدیل به خاکستری", + "Convert to image-based PDF": "تبدیل به PDF مبتنی بر تصویر", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} فایل ({{totalPages}} صفحه) به SVG تبدیل شد!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} صفحه به SVG تبدیل شد!", + "Converter not initialized": "مبدل راه‌اندازی نشده است", + "Converting BMP to PDF...": "در حال تبدیل BMP به PDF...", + "Converting HEIC to PDF...": "در حال تبدیل HEIC به PDF...", + "Converting TIFF to PDF...": "در حال تبدیل TIFF به PDF...", + "Converting emails...": "در حال تبدیل ایمیل‌ها...", + "Converting files...": "در حال تبدیل فایل‌ها...", + "Converting fonts to outlines...": "در حال تبدیل قلم‌ها به خطوط برداری...", + "Converting images to PDF...": "در حال تبدیل تصاویر به PDF...", + "Converting multiple PDFs to PDF/A...": "در حال تبدیل چند PDF به PDF/A...", + "Converting multiple RTF files to PDF...": "در حال تبدیل چند فایل RTF به PDF...", + "Converting multiple files...": "در حال تبدیل چند فایل...", + "Converting page {{n}} of {{pageCount}}...": "در حال تبدیل صفحهٔ {{n}} از {{pageCount}}...", + "Converting to Markdown...": "در حال تبدیل به Markdown...", + "Converting to SVG...": "در حال تبدیل به SVG...", + "Converting to greyscale...": "در حال تبدیل به خاکستری...", + "Converting to {{level}}...": "در حال تبدیل به {{level}}...", + "Converting {{name}}...": "در حال تبدیل {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "در حال تبدیل {{n}}/{{length}}: {{name}}...", + "Converting...": "در حال تبدیل...", + "Copied": "کپی شد", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "دسترسی به خروجی‌گیر PDF مُهرشده ممکن نشد. لطفاً به‌جای آن از دکمهٔ Export → PDF در نوار ابزار نمایشگر استفاده کنید.", + "Could not add blank page.": "افزودن صفحهٔ خالی ممکن نشد.", + "Could not add blank pages.": "افزودن صفحه‌های خالی ممکن نشد.", + "Could not add header or footer.": "افزودن سرصفحه یا پاصفحه ممکن نشد.", + "Could not add page numbers.": "افزودن شماره صفحه ممکن نشد.", + "Could not add the watermark.": "افزودن واترمارک ممکن نشد.", + "Could not apply rotations.": "اعمال چرخش‌ها ممکن نشد.", + "Could not change text color.": "تغییر رنگ متن ممکن نشد.", + "Could not change the background color.": "تغییر رنگ پس‌زمینه ممکن نشد.", + "Could not create ZIP archive.": "ساخت آرشیو ZIP ممکن نشد.", + "Could not create canvas context.": "ساخت زمینهٔ Canvas ممکن نشد.", + "Could not create comparison canvas context.": "ساخت زمینهٔ Canvas مقایسه ممکن نشد.", + "Could not create offscreen comparison canvas.": "ساخت Canvas مقایسهٔ خارج از صفحه ممکن نشد.", + "Could not create visual diff context.": "ساخت زمینهٔ تفاوت بصری ممکن نشد.", + "Could not create visual diff overlay context.": "ساخت زمینهٔ پوشش تفاوت بصری ممکن نشد.", + "Could not detect blank pages.": "تشخیص صفحه‌های خالی ممکن نشد.", + "Could not display the page.": "نمایش صفحه ممکن نشد.", + "Could not export comparison PDF.": "خروجی گرفتن از PDF مقایسه ممکن نشد.", + "Could not export the signed PDF. Please try again.": "خروجی گرفتن از PDF امضاشده ممکن نشد. لطفاً دوباره تلاش کنید.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "خروجی گرفتن از PDF مُهرشده ممکن نشد. لطفاً به‌جای آن از دکمهٔ Export → PDF در نوار ابزار نمایشگر استفاده کنید.", + "Could not extract signer public key": "استخراج کلید عمومی امضاکننده ممکن نشد", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "{{testFile}} در نشانی داده‌شده پیدا نشد (HTTP {{status}}). مطمئن شوید فایل وجود دارد.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "تحلیل کامل PDF ممکن نشد. ممکن است خراب باشد یا ساختار غیرمعمولی داشته باشد.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "ساخت پیش‌نمایش ممکن نشد. ممکن است فایل خراب باشد یا ویژگی‌های پشتیبانی‌نشده داشته باشد. خطا: {{message}}", + "Could not get canvas context": "دریافت زمینهٔ Canvas ممکن نشد", + "Could not invert PDF colors.": "وارونه‌سازی رنگ‌های PDF ممکن نشد.", + "Could not load PDF. It may be corrupt or password-protected.": "بارگذاری PDF ممکن نشد. ممکن است خراب یا دارای رمز عبور باشد.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "بارگذاری PDF ممکن نشد. ممکن است فایل نامعتبر، خراب یا دارای رمز عبور باشد.", + "Could not load the PDF engine. Please refresh the page and try again.": "بارگذاری موتور PDF ممکن نشد. لطفاً صفحه را تازه‌سازی کنید و دوباره تلاش کنید.", + "Could not parse signer info": "تجزیهٔ اطلاعات امضاکننده ممکن نشد", + "Could not posterize the PDF.": "پوستری‌کردن PDF ممکن نشد.", + "Could not process \"{{name}}\". The file may be corrupted.": "پردازش «{{name}}» ممکن نشد. ممکن است فایل خراب باشد.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "کاهش بیشتر حجم فایل ممکن نشد. اصلی: {{originalSize}}، جدید: {{compressedSize}}.", + "Could not remove annotations.": "حذف حاشیه‌نویسی‌ها ممکن نشد.", + "Could not remove blank pages.": "حذف صفحه‌های خالی ممکن نشد.", + "Could not remove leftover data from the PDF.": "حذف دادهٔ باقی‌مانده از PDF ممکن نشد.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "متن ردگیری‌شده از داده‌های سند حذف نشد، بنابراین فایل دانلود نشد.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "وارونه‌سازی ترتیب صفحات PDF ممکن نشد. لطفاً بررسی کنید فایل‌هایتان PDF معتبر باشند.", + "Could not update metadata. Please check that date formats are correct.": "به‌روزرسانی فراداده ممکن نشد. لطفاً درستی قالب تاریخ‌ها را بررسی کنید.", + "Count": "تعداد", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "تاریخ ایجاد", + "Creating Booklet...": "در حال ساخت دفترچه...", + "Creating Excel file...": "در حال ساخت فایل Excel...", + "Creating N-Up PDF...": "در حال ساخت PDF چند صفحه در هر برگ (N-Up)...", + "Creating PDF from JPGs...": "در حال ساخت PDF از JPGها...", + "Creating PDF from SVG files...": "در حال ساخت PDF از فایل‌های SVG...", + "Creating PDF...": "در حال ساخت PDF...", + "Creating ZIP archive...": "در حال ساخت آرشیو ZIP...", + "Creating ZIP file...": "در حال ساخت فایل ZIP...", + "Creating ZIP...": "در حال ساخت ZIP...", + "Creating table...": "در حال ساخت جدول...", + "Creator": "سازنده", + "Crop": "برش", + "Crop complete! Your download has started.": "برش کامل شد! دانلود شروع شد.", + "Cryptographic verification failed": "راستی‌آزمایی رمزنگاری ناموفق بود", + "Custom": "سفارشی", + "Custom Format": "قالب سفارشی", + "Custom Height": "ارتفاع سفارشی", + "Custom Units": "واحدهای سفارشی", + "Custom Width": "عرض سفارشی", + "Custom Zoom": "بزرگ‌نمایی سفارشی", + "Custom...": "سفارشی...", + "DataMatrix": "DataMatrix", + "Date Format": "قالب تاریخ", + "Decrease size": "کاهش اندازه", + "Decrypt": "رمزگشایی", + "Decrypting PDF...": "در حال رمزگشایی PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "در حال رمزگشایی {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "رمزگشایی {{n}} از {{length}}: {{name}}", + "Decrypting...": "در حال رمزگشایی...", + "Decryption Failed": "رمزگشایی ناموفق بود", + "Delete": "حذف", + "Delete \"{{title}}\"?": "«{{title}}» حذف شود؟", + "Delete Field": "حذف فیلد", + "Delete Page": "حذف صفحه", + "Delete Pages": "حذف صفحات", + "Delete all {{length}} bookmark(s) ? ": "همهٔ {{length}} نشانک حذف شوند؟", + "Delete layer": "حذف لایه", + "Delete {{size}} bookmark(s) ? ": "{{size}} نشانک حذف شوند؟", + "Deleted": "حذف‌شده", + "Deleted {{size}} page(s) successfully!": "{{size}} صفحه با موفقیت حذف شد!", + "Deleting pages...": "در حال حذف صفحات...", + "Description": "توضیحات", + "Description for screen readers": "توضیح برای صفحه‌خوان‌ها", + "Deselect All": "لغو انتخاب همه", + "Deskew": "صاف‌کردن", + "Deskew PDF": "صاف‌کردن PDF", + "Deskewed {{length}} file(s). {{value}}": "{{length}} فایل صاف شد. {{value}}", + "Deskewing {{name}}...": "در حال صاف‌کردن {{name}}...", + "Destination": "مقصد", + "Detecting blank pages...": "در حال تشخیص صفحه‌های خالی...", + "Digest Algorithm:": "الگوریتم هش:", + "Digital Sign": "امضای دیجیتال", + "Direction": "جهت", + "Divide Pages": "تقسیم صفحات", + "Divide into boxes (0 to disable)": "تقسیم به کادرها (برای غیرفعال‌سازی 0)", + "Document Properties": "ویژگی‌های سند", + "Document Type": "نوع سند", + "Document properties": "ویژگی‌های سند", + "Document-level attachment": "پیوست در سطح سند", + "Done: back to tools": "تمام شد، بازگشت به ابزارها", + "Download": "دانلود", + "Download Edited PDF": "دانلود PDF ویرایش‌شده", + "Download anyway": "به‌هرحال دانلود شود", + "Download as PDF or ZIP automatically": "دانلود خودکار به‌صورت PDF یا ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} فایل PDF در یک آرشیو ZIP دانلود شد.", + "Downloads started for all files.": "دانلود همهٔ فایل‌ها شروع شد.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "برچسب‌گذاری حذف می‌شود که صفحه‌خوان‌ها به آن وابسته‌اند.", + "Duplicate Field Name": "نام فیلد تکراری", + "Duplicate Field Names": "نام‌های فیلد تکراری", + "Duplicate Page": "تکثیر صفحه", + "Duplicate Page Numbers": "شماره صفحه‌های تکراری", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "امضای ECDSA با کلید عمومی امضاکننده تأیید نمی‌شود", + "EPUB Files": "فایل‌های EPUB", + "EPUB to PDF": "EPUB به PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ به PDF", + "Edit": "ویرایش", + "Edit All": "ویرایش همه", + "Edit Bookmark": "ویرایش نشانک", + "Edit Bookmarks": "ویرایش نشانک‌ها", + "Edit Images": "ویرایش تصاویر", + "Edit Metadata": "ویرایش فراداده", + "Edit PDF metadata": "ویرایش فرادادهٔ PDF", + "Edit Scope": "دامنهٔ ویرایش", + "Edit Shapes": "ویرایش شکل‌ها", + "Edit Text": "ویرایش متن", + "Edit tool": "ابزار ویرایش", + "Edit {{scopes}}": "ویرایش {{scopes}}", + "Email Files": "فایل‌های ایمیل", + "Email to PDF": "ایمیل به PDF", + "Embedding files into PDF...": "در حال جاسازی فایل‌ها در PDF...", + "Empty signature bytes": "بایت‌های امضا خالی است", + "Encrypt": "رمزگذاری", + "Encrypt PDF with password": "رمزگذاری PDF با رمز عبور", + "Encrypted file": "فایل رمزگذاری‌شده", + "Encrypting PDF with 256-bit AES...": "در حال رمزگذاری PDF با AES 256 بیتی...", + "Encryption Failed": "رمزگذاری ناموفق بود", + "Encryption resulted in an empty file.": "رمزگذاری به فایل خالی انجامید.", + "End": "انتها", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "برای درج در ابتدا 0 و برای درج در انتها {{pageCount}} را وارد کنید.", + "Enter bookmark title": "عنوان نشانک را وارد کنید", + "Enter name for child layer under \"{{Layer}}\":": "نام لایهٔ فرزند زیر «{{Layer}}» را وارد کنید:", + "Enter password": "رمز عبور را وارد کنید", + "Enter password...": "رمز عبور را وارد کنید...", + "Enter passwords for each encrypted file": "رمز عبور هر فایل رمزگذاری‌شده را وارد کنید", + "Error": "خطا", + "Error during execution": "خطا هنگام اجرا", + "Error generating PDF: {{error}}": "خطا در ساخت PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "خطا در بارگذاری فایل PDF. لطفاً با یک PDF معتبر دوباره تلاش کنید.", + "Error reading files: {{error}}": "خطا در خواندن فایل‌ها: {{error}}", + "Error saving PDF. Check console for details.": "خطا در ذخیرهٔ PDF. جزئیات را در کنسول ببینید.", + "Error: {{error}}": "خطا: {{error}}", + "Exactly 11 or 12 digits": "دقیقاً 11 یا 12 رقم", + "Exactly 12 or 13 digits": "دقیقاً 12 یا 13 رقم", + "Example of current format:": "نمونه‌ای از قالب فعلی:", + "Excel to PDF": "Excel به PDF", + "Existing Radio Groups": "گروه‌های رادیویی موجود", + "Export Error": "خطای خروجی گرفتن", + "Export Value": "مقدار خروجی", + "Export failed": "خروجی گرفتن ناموفق بود", + "External processing module needed": "ماژول پردازش خارجی لازم است", + "Extract Images": "استخراج تصاویر", + "Extract Pages": "استخراج صفحات", + "Extract Tables": "استخراج جدول‌ها", + "Extract a range of pages": "استخراج یک بازه از صفحات", + "Extract all images from PDF": "استخراج همهٔ تصاویر از PDF", + "Extract pages as separate PDFs": "استخراج صفحات به‌صورت PDFهای جداگانه", + "Extract text from PDF": "استخراج متن از PDF", + "Extracted 1 table successfully!": "یک جدول با موفقیت استخراج شد!", + "Extracted text from {{length}} PDF files!": "متن از {{length}} فایل PDF استخراج شد!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF استخراج شد، {{failed}} ناموفق بود.", + "Extracted {{length}} page(s) successfully!": "{{length}} صفحه با موفقیت استخراج شد!", + "Extracted {{length}} table(s) to Excel!": "{{length}} جدول به Excel استخراج شد!", + "Extracted {{length}} tables successfully!": "{{length}} جدول با موفقیت استخراج شد!", + "Extracting attachments from {{length}} file(s)...": "در حال استخراج پیوست‌ها از {{length}} فایل...", + "Extracting images from {{name}}...": "در حال استخراج تصاویر از {{name}}...", + "Extracting pages...": "در حال استخراج صفحات...", + "Extracting tables...": "در حال استخراج جدول‌ها...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "در حال استخراج متن از فایل {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "در حال استخراج متن از چند فایل...", + "Extracting text from {{name}}...": "در حال استخراج متن از {{name}}...", + "Extracting text...": "در حال استخراج متن...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "در حال استخراج {{name}} برای هوش مصنوعی ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "در حال استخراج {{name}} برای هوش مصنوعی...", + "Extracting...": "در حال استخراج...", + "Extraction Complete": "استخراج کامل شد", + "Extraction Error": "خطای استخراج", + "Extraction Partial": "استخراج ناقص", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "استخراج کامل شد! {{length}} پیوست در فایل ZIP ({{totalSize}}). دانلود شروع شد.", + "FB2 Files": "فایل‌های FB2", + "FB2 to PDF": "FB2 به PDF", + "Failed": "ناموفق", + "Failed to acquire 2D canvas context": "دریافت زمینهٔ Canvas دوبعدی ناموفق بود", + "Failed to add child layer": "افزودن لایهٔ فرزند ناموفق بود", + "Failed to apply Bates numbers.": "اعمال شماره‌های Bates ناموفق بود.", + "Failed to apply color adjustments. The file might be corrupted.": "اعمال تنظیمات رنگ ناموفق بود. ممکن است فایل خراب باشد.", + "Failed to apply redactions.": "اعمال ردگیری‌ها ناموفق بود.", + "Failed to apply scanner effect. The file might be corrupted.": "اعمال جلوهٔ اسکنر ناموفق بود. ممکن است فایل خراب باشد.", + "Failed to attach files: {{error}}": "پیوست کردن فایل‌ها ناموفق بود: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "تبدیل BMP به PDF ناموفق بود. ممکن است یکی از فایل‌ها نامعتبر باشد.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "تبدیل HEIC به PDF ناموفق بود. ممکن است یکی از فایل‌ها نامعتبر باشد.", + "Failed to convert PDF to CSV. {{message}}": "تبدیل PDF به CSV ناموفق بود. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "تبدیل PDF به Excel ناموفق بود. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "تبدیل PDF به SVG ناموفق بود. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "تبدیل PDF به خاکستری ناموفق بود. ممکن است فایل خراب باشد.", + "Failed to convert PDF. It may be image-based or corrupted.": "تبدیل PDF ناموفق بود. ممکن است مبتنی بر تصویر یا خراب باشد.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "تبدیل TIFF به PDF ناموفق بود. ممکن است یکی از فایل‌ها نامعتبر باشد.", + "Failed to convert images to PDF.": "تبدیل تصاویر به PDF ناموفق بود.", + "Failed to convert text to PDF. {{error}}": "تبدیل متن به PDF ناموفق بود. {{error}}", + "Failed to convert {{filename}} to PNG": "تبدیل {{filename}} به PNG ناموفق بود", + "Failed to copy metadata to clipboard.": "کپی فراداده در کلیپ‌بورد ناموفق بود.", + "Failed to create PDF.": "ساخت PDF ناموفق بود.", + "Failed to create PNG blob": "ساخت Blob از PNG ناموفق بود", + "Failed to create canvas context": "ساخت زمینهٔ Canvas ناموفق بود", + "Failed to create split PDFs.": "ساخت PDFهای تقسیم‌شده ناموفق بود.", + "Failed to decode image: {{name}}": "رمزگشایی تصویر ناموفق بود: {{name}}", + "Failed to decrypt private key": "رمزگشایی کلید خصوصی ناموفق بود", + "Failed to decrypt. Try the Decrypt tool instead.": "رمزگشایی ناموفق بود. به‌جای آن از ابزار رمزگشایی استفاده کنید.", + "Failed to delete layer": "حذف لایه ناموفق بود", + "Failed to delete pages.": "حذف صفحات ناموفق بود.", + "Failed to deskew PDF: {{error}}": "صاف‌کردن PDF ناموفق بود: {{error}}", + "Failed to download the edited PDF.": "دانلود PDF ویرایش‌شده ناموفق بود.", + "Failed to edit attachments.": "ویرایش پیوست‌ها ناموفق بود.", + "Failed to extract certificate from PFX file": "استخراج گواهی از فایل PFX ناموفق بود", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "استخراج صفحات ناموفق بود (کد خروج qpdf: {{exitCode}}).", + "Failed to extract pages.": "استخراج صفحات ناموفق بود.", + "Failed to extract tables. {{message}}": "استخراج جدول‌ها ناموفق بود. {{message}}", + "Failed to extract text from PDF.": "استخراج متن از PDF ناموفق بود.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "دریافت پروفایل ICC از {{iccUrl}} ناموفق بود: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "دریافت فایل قلم ناموفق بود: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "دریافت gs.js ناموفق بود: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "دریافت {{url}} ناموفق بود: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "دریافت زمینهٔ دوبعدی برای صفحهٔ {{pageNumber}} ناموفق بود", + "Failed to get canvas context": "دریافت زمینهٔ Canvas ناموفق بود", + "Failed to insert PDF. The file may be corrupted.": "درج PDF ناموفق بود. ممکن است فایل خراب باشد.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "بارگذاری Ghostscript از {{normalizedUrl}} ناموفق بود: {{msg}}", + "Failed to load PDF file.": "بارگذاری فایل PDF ناموفق بود.", + "Failed to load PDF for cropping.": "بارگذاری PDF برای برش ناموفق بود.", + "Failed to load PDF for preview.": "بارگذاری PDF برای پیش‌نمایش ناموفق بود.", + "Failed to load PDF form viewer.": "بارگذاری نمایشگر فرم PDF ناموفق بود.", + "Failed to load PDF layers": "بارگذاری لایه‌های PDF ناموفق بود", + "Failed to load PyMuPDF from CDN: {{msg}}": "بارگذاری PyMuPDF از CDN ناموفق بود: {{msg}}", + "Failed to load SVG image": "بارگذاری تصویر SVG ناموفق بود", + "Failed to load WebP image": "بارگذاری تصویر WebP ناموفق بود", + "Failed to load attachments from PDF.": "بارگذاری پیوست‌ها از PDF ناموفق بود.", + "Failed to load files: {{error}}": "بارگذاری فایل‌ها ناموفق بود: {{error}}", + "Failed to load image.": "بارگذاری تصویر ناموفق بود.", + "Failed to load image: {{filename}}": "بارگذاری تصویر ناموفق بود: {{filename}}", + "Failed to load one or more PDF files.": "بارگذاری یک یا چند فایل PDF ناموفق بود.", + "Failed to load script: {{url}}": "بارگذاری اسکریپت ناموفق بود: {{url}}", + "Failed to load template.": "بارگذاری قالب ناموفق بود.", + "Failed to load the PDF Editor.": "بارگذاری ویرایشگر PDF ناموفق بود.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "بارگذاری پردازشگر تصویر ناموفق بود. مطمئن شوید مرورگر شما از SharedArrayBuffer پشتیبانی می‌کند (نیازمند HTTPS یا localhost).", + "Failed to parse CSV: {{error}}": "تجزیهٔ CSV ناموفق بود: {{error}}", + "Failed to parse signature": "تجزیهٔ امضا ناموفق بود", + "Failed to parse the certificate file.": "تجزیهٔ فایل گواهی ناموفق بود.", + "Failed to process HEIC file: {{name}}": "پردازش فایل HEIC ناموفق بود: {{name}}", + "Failed to process WebP file: {{name}}": "پردازش فایل WebP ناموفق بود: {{name}}", + "Failed to read file.": "خواندن فایل ناموفق بود.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "حذف محدودیت‌ها ناموفق بود. ممکن است PDF به رمز عبور مالک صحیح نیاز داشته باشد.", + "Failed to render page": "نمایش صفحه ناموفق بود", + "Failed to render page previews": "نمایش پیش‌نمایش صفحه‌ها ناموفق بود", + "Failed to render page previews.": "نمایش پیش‌نمایش صفحه‌ها ناموفق بود.", + "Failed to render page.": "نمایش صفحه ناموفق بود.", + "Failed to save changes.": "ذخیرهٔ تغییرات ناموفق بود.", + "Failed to save the new PDF. Check console for details.": "ذخیرهٔ PDF جدید ناموفق بود. جزئیات را در کنسول ببینید.", + "Failed to split PDF. Please check your selection.": "تقسیم PDF ناموفق بود. لطفاً انتخاب خود را بررسی کنید.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "زدن مُهر زمانی روی PDF ناموفق بود: {{message}} لطفاً سرور TSA دیگری را امتحان کنید یا اتصال اینترنت خود را بررسی کنید.", + "Failed to toggle layer visibility": "تغییر نمایان‌بودن لایه ناموفق بود", + "Failed to validate signatures. The file may be corrupted.": "اعتبارسنجی امضاها ناموفق بود. ممکن است فایل خراب باشد.", + "Features enabled by this module:": "قابلیت‌هایی که این ماژول فعال می‌کند:", + "Field Name": "نام فیلد", + "Field Name (Group Name)": "نام فیلد (نام گروه)", + "Field Name Conflict": "تعارض نام فیلد", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "نام فیلد «{{newName}}» از قبل در این {{value}} وجود دارد. لطفاً از یک نام یکتا استفاده کنید.", + "Field name cannot be empty": "نام فیلد نمی‌تواند خالی باشد", + "File": "فایل", + "File Size": "اندازهٔ فایل", + "File exists but could not be read. Check CORS configuration.": "فایل وجود دارد اما خوانده نشد. پیکربندی CORS را بررسی کنید.", + "File list not found": "فهرست فایل‌ها پیدا نشد", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "حجم فایل از {{originalSize}} به {{compressedSize}} کاهش یافت ({{percent}}٪ صرفه‌جویی).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "فایل {{n}}/{{length}}: صفحهٔ {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "فایل {{n}}/{{length}}: {{message}}", + "Filename": "نام فایل", + "Files that failed: {{errorCount}}.": "فایل‌های ناموفق: {{errorCount}}.", + "Fill (cover full target page)": "پر کردن (پوشاندن کل صفحهٔ مقصد)", + "Fill Color": "رنگ پرکردن", + "Finalizing PDF...": "در حال نهایی‌سازی PDF...", + "Find & replace": "یافتن و جایگزینی", + "Finds the best quality under this size. 0 means no target.": "بهترین کیفیت را زیر این حجم پیدا می‌کند. 0 یعنی بدون هدف.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox و Chrome ممکن است هنگام انتخاب، قالب بومی انتخابگر تاریخ خود را نشان دهند. قالب درست پس از پایان وارد کردن تاریخ اعمال می‌شود.", + "First Indent": "تورفتگی اول", + "Fit (keep full page visible)": "جا دادن (کل صفحه نمایان بماند)", + "Fit Page": "جا دادن صفحه", + "Fix Page Size": "اصلاح اندازهٔ صفحه", + "Flatten": "مسطح‌سازی", + "Flatten Forms": "مسطح‌سازی فرم‌ها", + "Flatten annotations": "مسطح‌سازی حاشیه‌نویسی‌ها", + "Flatten form fields": "مسطح‌سازی فیلدهای فرم", + "Flatten forms and annotations": "مسطح‌سازی فرم‌ها و حاشیه‌نویسی‌ها", + "Flatten links": "مسطح‌سازی پیوندها", + "Flattening PDF...": "در حال مسطح‌سازی PDF...", + "Flattening and saving PDF...": "در حال مسطح‌سازی و ذخیرهٔ PDF...", + "Flattening multiple PDFs...": "در حال مسطح‌سازی چند PDF...", + "Flattening page {{i}} of {{totalPages}}...": "در حال مسطح‌سازی صفحهٔ {{i}} از {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "در حال مسطح‌سازی {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "نوار نشانی را فعال می‌کند", + "Font": "قلم", + "Font Color": "رنگ قلم", + "Font Family": "خانوادهٔ قلم", + "Font Size": "اندازهٔ قلم", + "Font size: {{bSize}} → {{aSize}}": "اندازهٔ قلم: {{bSize}} ← {{aSize}}", + "Font to Outline": "تبدیل قلم به خطوط برداری", + "Font: {{bFont}} → {{aFont}}": "قلم: {{bFont}} ← {{aFont}}", + "Fonts": "قلم‌ها", + "Footer Center": "پاصفحهٔ وسط", + "Footer Left": "پاصفحهٔ چپ", + "Footer Right": "پاصفحهٔ راست", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "برای PDFهای فقط‌تصویری مانند اسکن‌ها. اگر سند متن انتخاب‌پذیر داشته باشد رد می‌شود، مگر اینکه «نادیده گرفتن محافظت محتوا» روشن باشد.", + "Form fields stop being fillable.": "فیلدهای فرم دیگر قابل پر شدن نیستند.", + "Format": "قالب", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}} صفحهٔ خالی پیدا شد. برای لغو انتخاب یک صفحه، روی آن کلیک کنید.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "{{length}} نشانک موجود پیدا شد. نشانک‌های فعلی جایگزین شوند؟", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length}} تصویر در {{length2}} PDF پیدا شد.", + "Front": "رو", + "Full Coverage": "پوشش کامل", + "Gamma": "گاما", + "Generate table of contents from bookmarks": "ساخت فهرست مطالب از نشانک‌ها", + "Generating High-Quality PDF...": "در حال ساخت PDF با کیفیت بالا...", + "Generating PDF...": "در حال ساخت PDF...", + "Generating ZIP file...": "در حال ساخت فایل ZIP...", + "Generating formatted content...": "در حال ساخت محتوای قالب‌بندی‌شده...", + "Generating preview...": "در حال ساخت پیش‌نمایش...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (تبدیل به PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "تبدیل RGB با Ghostscript با کد خروج {{exitCode}} ناموفق بود", + "Ghostscript conversion failed with exit code {{exitCode}}": "تبدیل با Ghostscript با کد خروج {{exitCode}} ناموفق بود", + "Ghostscript did not produce output file": "Ghostscript فایل خروجی تولید نکرد", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript پیکربندی نشده است. لطفاً آن را در تنظیمات پیشرفته پیکربندی کنید.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript پیکربندی نشده است. لطفاً آن را در تنظیمات WASM پیکربندی کنید.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript پیکربندی نشده است. PyMuPDF برای برخی عملیات به Ghostscript نیاز دارد. لطفاً هر دو را در تنظیمات پیشرفته پیکربندی کنید.", + "Ghostscript threw an exception: {{e}}": "Ghostscript استثنا ایجاد کرد: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "پوشش Ghostscript رابط مورد انتظار را ارائه نکرد. انتظار می‌رفت loadGS() یا کلاس GhostscriptWASM وجود داشته باشد.", + "Go": "برو", + "Go to page": "رفتن به صفحه", + "Grayscale": "خاکستری", + "Green": "سبز", + "Greyscale": "خاکستری", + "Grid Mode": "حالت شبکه‌ای", + "Group Name (Must be same for group)": "نام گروه (باید برای گروه یکسان باشد)", + "H-Scale %": "مقیاس افقی ٪", + "Hanging Indent": "تورفتگی آویزان", + "Hard reloads page": "صفحه را با بارگذاری کامل تازه می‌کند", + "Header & Footer": "سرصفحه و پاصفحه", + "Header & Footer added successfully!": "سرصفحه و پاصفحه با موفقیت اضافه شد!", + "Header Center": "سرصفحهٔ وسط", + "Header Left": "سرصفحهٔ چپ", + "Header Right": "سرصفحهٔ راست", + "Height ({{unit}})": "ارتفاع ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "پنهان کردن", + "Hide Border": "پنهان کردن کادر", + "Hide password": "پنهان کردن رمز عبور", + "Hides window": "پنجره را پنهان می‌کند", + "High (288 DPI)": "زیاد (288 DPI)", + "High (Smallest Files)": "زیاد (کوچک‌ترین فایل‌ها)", + "Horizontal": "افقی", + "Hue Shift": "جابه‌جایی فام", + "Image Format": "قالب تصویر", + "Image Input": "ورودی تصویر", + "Image quality": "کیفیت تصویر", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "اندازهٔ تصویر از {{width}}×{{height}} به {{width2}}×{{height2}} تغییر کرد", + "Images": "تصاویر", + "Images above this are resampled down. None leaves resolution alone.": "تصاویر بزرگ‌تر از این مقدار کوچک‌تر نمونه‌برداری می‌شوند. «هیچ‌کدام» وضوح را بدون تغییر می‌گذارد.", + "Imported {{length}} bookmarks!": "{{length}} نشانک درون‌ریزی شد!", + "Inches (in)": "اینچ (in)", + "Include Attachments": "شامل پیوست‌ها", + "Include Cc Bcc": "شامل Cc و Bcc", + "Include this file": "شامل این فایل", + "Incorrect Page Count": "تعداد صفحات نادرست", + "Incorrect Password": "رمز عبور نادرست", + "Incorrect password": "رمز عبور نادرست", + "Incorrect password. Please try again.": "رمز عبور نادرست است. لطفاً دوباره تلاش کنید.", + "Increase size": "افزایش اندازه", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "در حال نمایه‌سازی صفحهٔ {{pageNumber}} از {{totalPages}} در PDF اول...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "در حال نمایه‌سازی صفحهٔ {{pageNumber}} از {{totalPages}} در PDF دوم...", + "Info": "اطلاعات", + "Info Dictionary": "Info Dictionary", + "Inherit": "ارث‌بری", + "Initialization Error": "خطای راه‌اندازی", + "Initializing Ghostscript...": "در حال راه‌اندازی Ghostscript...", + "Initializing PDF engine...": "در حال راه‌اندازی موتور PDF...", + "Initializing PyMuPDF...": "در حال راه‌اندازی PyMuPDF...", + "Initializing decryption...": "در حال راه‌اندازی رمزگشایی...", + "Initializing encryption...": "در حال راه‌اندازی رمزگذاری...", + "Initializing repair engine...": "در حال راه‌اندازی موتور ترمیم...", + "Initializing...": "در حال راه‌اندازی...", + "Input Required": "ورودی لازم است", + "Insecure Digest (MD5 / SHA-1)": "هش ناامن (MD5 / SHA-1)", + "Insert blank pages": "درج صفحه‌های خالی", + "Insert blank pages after this page number": "درج صفحه‌های خالی بعد از این شمارهٔ صفحه", + "Interactive Form Fields": "فیلدهای فرم تعاملی", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "ادغام یک‌درمیان صفحات چند PDF (مثلاً صفحات فرد و صفحات زوج وارونه از یک اسکن یک‌رو)", + "Invalid Certificate": "گواهی نامعتبر", + "Invalid File": "فایل نامعتبر", + "Invalid Files": "فایل‌های نامعتبر", + "Invalid Input": "ورودی نامعتبر", + "Invalid JSON format": "قالب JSON نامعتبر", + "Invalid Name": "نام نامعتبر", + "Invalid Order": "ترتیب نامعتبر", + "Invalid PDF password.": "رمز عبور PDF نامعتبر است.", + "Invalid Page Numbers": "شماره صفحه‌های نامعتبر", + "Invalid Page Order": "ترتیب صفحهٔ نامعتبر", + "Invalid Pages": "صفحه‌های نامعتبر", + "Invalid Range": "بازهٔ نامعتبر", + "Invalid Signature": "امضای نامعتبر", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL سرور TSA نامعتبر است. مرجع مُهر زمانی باید یک URL معتبر با http:// یا https:// باشد.", + "Invalid URL": "URL نامعتبر", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "قالب URL نامعتبر است. لطفاً یک URL معتبر وارد کنید (مثلاً https://example.com/wasm/)", + "Invalid XML: no root element": "XML نامعتبر: عنصر ریشه وجود ندارد", + "Invalid data": "داده نامعتبر", + "Invalid hex string in content stream": "رشتهٔ هگز نامعتبر در جریان محتوا", + "Invalid page range specified.": "بازهٔ صفحهٔ مشخص‌شده نامعتبر است.", + "Invalid shortcut format": "قالب میان‌بر نامعتبر", + "Invalid: Cryptographic Verification Failed": "نامعتبر: راستی‌آزمایی رمزنگاری ناموفق بود", + "Invert Colors": "وارونه‌سازی رنگ‌ها", + "Invert all colors": "وارونه کردن همهٔ رنگ‌ها", + "Inverting PDF colors...": "در حال وارونه‌سازی رنگ‌های PDF...", + "Issuer": "صادرکننده", + "It fits the {{targetBytes}} target.": "با هدف {{targetBytes}} سازگار است.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "هنوز بالاتر از هدف {{targetBytes}} است، چون گزینهٔ حفظ PDF/A میزان فشرده‌سازی را محدود می‌کند.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "دیگر ادعای انطباق با PDF/A ندارد. برای حفظ آن، «حفظ PDF/A» را در تنظیمات سفارشی روشن کنید.", + "Italic": "مورب", + "Item 1": "مورد 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "امضاهای دیجیتال آن برای فشرده‌سازی حذف شدند. در صورت نیاز دوباره امضا کنید.", + "JPEG (Smaller file size)": "JPEG (حجم کمتر)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "کیفیت JPEG برای تصاویر بازکدگذاری‌شده، از 20 تا 100. مقدار کمتر یعنی فایل کوچک‌تر و آثار تصویری بیشتر.", + "JPG": "JPG", + "JSON Files": "فایل‌های JSON", + "JSON Loaded": "JSON بارگذاری شد", + "JSON to PDF": "JSON به PDF", + "Javascript Code": "کد Javascript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "فایل PDF/A را منطبق نگه می‌دارد. تا وقتی این گزینه روشن است، Brotli و رستر کردن نادیده گرفته می‌شوند.", + "Keeps only the characters the document uses.": "فقط نویسه‌هایی را نگه می‌دارد که سند استفاده کرده است.", + "Key (e.g., Department)": "کلید (مثلاً بخش)", + "Keywords": "کلیدواژه‌ها", + "Label": "برچسب", + "Label / Prompt": "برچسب / راهنما", + "Landscape": "افقی", + "Language": "زبان", + "Layer not found": "لایه پیدا نشد", + "Layer {{number}}": "لایهٔ {{number}}", + "Leave blank for all pages": "برای همهٔ صفحه‌ها خالی بگذارید", + "Left": "چپ", + "Left edge in points (1 inch = 72 pts)": "لبهٔ چپ بر حسب پوینت (1 اینچ = 72 پوینت)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "سطح", + "Limit recognized characters (leave empty for all)": "محدود کردن نویسه‌های شناسایی‌شده (برای همه خالی بگذارید)", + "Line": "خط", + "Linearization Failed": "خطی‌سازی ناموفق بود", + "Linearize": "خطی‌سازی", + "Links stop being clickable.": "پیوندها دیگر قابل کلیک نیستند.", + "Lists": "فهرست‌ها", + "Load": "بارگذاری", + "Load system fonts": "بارگذاری قلم‌های سیستم", + "Load system fonts…": "بارگذاری قلم‌های سیستم…", + "Loaded": "بارگذاری شد", + "Loaded bookmarks from JSON. Now upload your PDF.": "نشانک‌ها از JSON بارگذاری شدند. حالا PDF خود را بارگذاری کنید.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} نشانک از CSV بارگذاری شد. حالا PDF خود را بارگذاری کنید.", + "Loading Engine...": "در حال بارگذاری موتور...", + "Loading Ghostscript...": "در حال بارگذاری Ghostscript...", + "Loading PDF Editor...": "در حال بارگذاری ویرایشگر PDF...", + "Loading PDF Text Editor...": "در حال بارگذاری ویرایشگر متن PDF...", + "Loading PDF converter...": "در حال بارگذاری مبدل PDF...", + "Loading PDF documents...": "در حال بارگذاری اسناد PDF...", + "Loading PDF engine...": "در حال بارگذاری موتور PDF...", + "Loading PDF files...": "در حال بارگذاری فایل‌های PDF...", + "Loading PDF form...": "در حال بارگذاری فرم PDF...", + "Loading PDF processor...": "در حال بارگذاری پردازشگر PDF...", + "Loading PDF viewer...": "در حال بارگذاری نمایشگر PDF...", + "Loading PDF...": "در حال بارگذاری PDF...", + "Loading PDFs...": "در حال بارگذاری PDFها...", + "Loading attachments...": "در حال بارگذاری پیوست‌ها...", + "Loading comparison {{currentPage}} of {{length}}...": "در حال بارگذاری مقایسهٔ {{currentPage}} از {{length}}...", + "Loading conversion engine ({{percent}}%)...": "در حال بارگذاری موتور تبدیل ({{percent}}٪)...", + "Loading conversion engine...": "در حال بارگذاری موتور تبدیل...", + "Loading engine...": "در حال بارگذاری موتور...", + "Loading fonts...": "در حال بارگذاری قلم‌ها...", + "Loading layers from {{name}}...": "در حال بارگذاری لایه‌ها از {{name}}...", + "Loading page {{num}}...": "در حال بارگذاری صفحهٔ {{num}}...", + "Loading preview...": "در حال بارگذاری پیش‌نمایش...", + "Loading {{name}}...": "در حال بارگذاری {{name}}...", + "Loading...": "در حال بارگذاری...", + "Location": "مکان", + "Lossless (No Quality Loss)": "بدون اتلاف (بدون افت کیفیت)", + "Lossless (no image re-encoding)": "بدون اتلاف (بدون کدگذاری مجدد تصاویر)", + "Low (Best Quality)": "کم (بهترین کیفیت)", + "MOBI Files": "فایل‌های MOBI", + "MOBI to PDF": "MOBI به PDF", + "Malformed ByteRange": "ByteRange ناقص", + "Malformed ECDSA signature (could not parse r,s)": "امضای ECDSA ناقص (تجزیهٔ r,s ممکن نشد)", + "Malformed inline image in content stream": "تصویر درون‌خطی ناقص در جریان محتوا", + "Malformed signatureAlgorithm": "signatureAlgorithm ناقص", + "Margins": "حاشیه‌ها", + "Markdown Files": "فایل‌های Markdown", + "Markdown to PDF": "Markdown به PDF", + "Max Length (0 for unlimited)": "حداکثر طول (برای نامحدود 0)", + "Maximum resolution": "حداکثر وضوح", + "Medium (Recommended)": "متوسط (توصیه‌شده)", + "Merge PDF": "ادغام PDF", + "Merge PDFs": "ادغام PDFها", + "Merge duplicate fonts": "ادغام قلم‌های تکراری", + "Mermaid Error: {{error}}": "خطای Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "فراداده به‌صورت JSON در کلیپ‌بورد کپی شد.", + "Metadata removed successfully!": "فراداده با موفقیت حذف شد!", + "Metadata updated successfully!": "فراداده با موفقیت به‌روزرسانی شد!", + "Millimeters (mm)": "میلی‌متر (mm)", + "Minimizes window": "پنجره را کوچک می‌کند", + "Missing Files": "فایل‌های ناموجود", + "Missing signatureAlgorithm": "signatureAlgorithm وجود ندارد", + "Mixed Page Sizes Detected": "اندازه‌های صفحهٔ ناهمسان شناسایی شد", + "Mixed Sizes": "اندازه‌های ناهمسان", + "Mode": "حالت", + "Modified": "تغییریافته", + "Modified After Signing (signed part intact)": "پس از امضا تغییر کرده است (بخش امضاشده سالم است)", + "More": "بیشتر", + "Moved": "جابه‌جاشده", + "Moved \"{{value}}\"": "«{{value}}» جابه‌جا شد", + "Multi-line": "چندخطی", + "Must be a positive integer": "باید عدد صحیح مثبت باشد", + "Must be a positive number": "باید عدد مثبت باشد", + "N must be at least 1.": "N باید دست‌کم 1 باشد.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "PDF چند صفحه در هر برگ (N-Up) با موفقیت ساخته شد!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "خطای شبکه: اتصال به URL ممکن نشد. بررسی کنید URL درست باشد و سرور درخواست‌های CORS را مجاز بداند.", + "Network error: {{error}}": "خطای شبکه: {{error}}", + "Next page": "صفحهٔ بعد", + "No Area Selected": "ناحیه‌ای انتخاب نشده است", + "No Attachments": "بدون پیوست", + "No Changes": "بدون تغییر", + "No Crop Area": "ناحیهٔ برشی وجود ندارد", + "No File": "بدون فایل", + "No Files": "بدون فایل", + "No Images Found": "تصویری پیدا نشد", + "No PDF Files": "فایل PDF وجود ندارد", + "No PDF document loaded": "هیچ سند PDF بارگذاری نشده است", + "No PDF document loaded.": "هیچ سند PDF بارگذاری نشده است.", + "No PDF file loaded.": "هیچ فایل PDF بارگذاری نشده است.", + "No PDF files could be decrypted. The password may be incorrect.": "هیچ فایل PDF رمزگشایی نشد. ممکن است رمز عبور نادرست باشد.", + "No PDF files could be linearized.": "هیچ فایل PDF خطی‌سازی نشد.", + "No PDFs could be processed.": "هیچ PDF پردازش نشد.", + "No Pages": "بدون صفحه", + "No Selection": "بدون انتخاب", + "No Signatures Found": "امضایی پیدا نشد", + "No Tables Found": "جدولی پیدا نشد", + "No Text": "بدون متن", + "No URL configured": "URL پیکربندی نشده است", + "No attachments found in this PDF.": "پیوستی در این PDF پیدا نشد.", + "No attachments selected for removal.": "پیوستی برای حذف انتخاب نشده است.", + "No blank pages detected in this PDF.": "صفحهٔ خالی‌ای در این PDF شناسایی نشد.", + "No bookmarks found at the selected level.": "نشانکی در سطح انتخاب‌شده پیدا نشد.", + "No bookmarks to delete.": "نشانکی برای حذف وجود ندارد.", + "No bookmarks to export!": "نشانکی برای خروجی گرفتن وجود ندارد!", + "No certificate found in PEM file": "گواهی‌ای در فایل PEM پیدا نشد", + "No certificate found in PFX file": "گواهی‌ای در فایل PFX پیدا نشد", + "No certificates found in signature": "گواهی‌ای در امضا پیدا نشد", + "No changes match the current filter.": "هیچ تغییری با فیلتر فعلی مطابقت ندارد.", + "No configurable settings for this node.": "این گره تنظیمات قابل پیکربندی ندارد.", + "No differences detected on this page.": "تفاوتی در این صفحه شناسایی نشد.", + "No embedded images were found in the selected PDF(s).": "تصویر جاسازی‌شده‌ای در PDF(های) انتخاب‌شده پیدا نشد.", + "No existing bookmarks found in this PDF.": "نشانک موجودی در این PDF پیدا نشد.", + "No items were selected for removal or none were found in the PDF.": "موردی برای حذف انتخاب نشده بود یا در PDF پیدا نشد.", + "No page pairs to export.": "جفت صفحه‌ای برای خروجی گرفتن وجود ندارد.", + "No pages found. Please create a blank PDF or upload one.": "صفحه‌ای پیدا نشد. لطفاً یک PDF خالی بسازید یا یکی بارگذاری کنید.", + "No pages selected for removal.": "صفحه‌ای برای حذف انتخاب نشده است.", + "No pages were selected for splitting.": "صفحه‌ای برای تقسیم انتخاب نشده است.", + "No paired page for this side.": "برای این طرف صفحهٔ جفتی وجود ندارد.", + "No private key found in PEM file": "کلید خصوصی‌ای در فایل PEM پیدا نشد", + "No private key found in PFX file": "کلید خصوصی‌ای در فایل PFX پیدا نشد", + "No tables were detected in this PDF.": "جدولی در این PDF شناسایی نشد.", + "No valid page numbers found.": "شمارهٔ صفحهٔ معتبری پیدا نشد.", + "No valid pages to save.": "صفحهٔ معتبری برای ذخیره وجود ندارد.", + "No worker": "بدون Worker", + "Noise": "نویز", + "None": "هیچ‌کدام", + "None of the files could be compressed: {{join}}.": "هیچ‌یک از فایل‌ها فشرده نشدند: {{join}}.", + "Normal": "عادی", + "Not Enough Files": "فایل کافی نیست", + "Not a PDF": "PDF نیست", + "Not connected": "متصل نیست", + "Not in trust chain": "در زنجیرهٔ اعتماد نیست", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "توجه: بدون رمز عبور مالک جداگانه، PDF هیچ محدودیتی در استفاده ندارد.", + "Number Format": "قالب عدد", + "Number of Pages": "تعداد صفحات", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR پیش از پردازش هر صفحه متوقف شد", + "OCR recognize timed out after {{timeoutMs}}ms": "تشخیص OCR پس از {{timeoutMs}} میلی‌ثانیه زمان‌بر شد و متوقف شد", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "فایل‌های ODG", + "ODG to PDF": "ODG به PDF", + "OK": "تأیید", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "خاموش (پیش‌فرض): شماره‌گذاری طبیعی 1 تا N. روشن: برچسب صفحهٔ اصلی هر فایل حفظ می‌شود (ممکن است برچسب‌های تکراری ایجاد شود).", + "One PDF per page": "یک PDF برای هر صفحه", + "One PDF per range": "یک PDF برای هر بازه", + "Only a substitute font was available": "فقط یک قلم جایگزین در دسترس بود", + "Only where it does not change how the image looks.": "فقط جایی که ظاهر تصویر را تغییر نمی‌دهد.", + "Opacity": "شفافیت", + "Open URL": "باز کردن URL", + "Opens incognito window": "پنجرهٔ ناشناس باز می‌کند", + "Opens new tab": "برگهٔ جدید باز می‌کند", + "Opens new window": "پنجرهٔ جدید باز می‌کند", + "Operation Failed": "عملیات ناموفق بود", + "Operation resulted in an empty file.": "عملیات به فایل خالی انجامید.", + "Optimize PDF for fast web viewing": "بهینه‌سازی PDF برای نمایش سریع در وب", + "Optimizing PDFs for web view (linearizing)...": "در حال بهینه‌سازی PDFها برای نمایش در وب (خطی‌سازی)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "در حال بهینه‌سازی {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "گزینه‌ها (هر کدام در یک خط یا جداشده با ویرگول)", + "Orientation": "جهت صفحه", + "Outline": "طرح کلی", + "Output": "خروجی", + "Overlay": "روکش", + "Overlay or underlay pages from one PDF onto another": "قرار دادن صفحات یک PDF روی یا زیر PDF دیگر", + "Owner Password": "رمز عبور مالک", + "Owner Password Required": "رمز عبور مالک لازم است", + "PDF": "PDF", + "PDF Files": "فایل‌های PDF", + "PDF Input": "ورودی PDF", + "PDF Layers": "لایه‌های PDF", + "PDF Metadata": "فرادادهٔ PDF", + "PDF Producer": "تولیدکنندهٔ PDF", + "PDF converted to CSV successfully!": "PDF با موفقیت به CSV تبدیل شد!", + "PDF converted to SVG successfully!": "PDF با موفقیت به SVG تبدیل شد!", + "PDF converted to greyscale successfully!": "PDF با موفقیت به خاکستری تبدیل شد!", + "PDF created successfully!": "PDF با موفقیت ساخته شد!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF با موفقیت رمزگشایی شد! همهٔ رمزگذاری‌ها و محدودیت‌ها حذف شد.", + "PDF decrypted successfully! Your download has started.": "PDF با موفقیت رمزگشایی شد! دانلود شما شروع شد.", + "PDF downloaded successfully.": "PDF با موفقیت دانلود شد.", + "PDF encrypted successfully with 256-bit AES!": "PDF با موفقیت با AES 256 بیتی رمزگذاری شد!", + "PDF has been sanitized and downloaded.": "PDF پاک‌سازی و دانلود شد.", + "PDF has no pages": "PDF صفحه‌ای ندارد", + "PDF organized successfully!": "PDF با موفقیت سازماندهی شد!", + "PDF permissions changed successfully!": "مجوزهای PDF با موفقیت تغییر کرد!", + "PDF readers supply the 14 standard PDF fonts themselves.": "نمایشگرهای PDF 14 قلم استاندارد PDF را خودشان فراهم می‌کنند.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "محدودیت‌های PDF با موفقیت حذف شد! فایل اکنون کاملاً قابل ویرایش و چاپ است.", + "PDF saved successfully!": "PDF با موفقیت ذخیره شد!", + "PDF split successfully!": "PDF با موفقیت تقسیم شد!", + "PDF to CSV": "PDF به CSV", + "PDF to DOCX": "PDF به DOCX", + "PDF to Excel/CSV": "PDF به Excel/CSV", + "PDF to Images": "PDF به تصاویر", + "PDF to Images (High Quality)": "PDF به تصاویر (کیفیت بالا)", + "PDF to JSON": "PDF به JSON", + "PDF to Markdown": "PDF به Markdown", + "PDF to PDF/A": "PDF به PDF/A", + "PDF to SVG": "PDF به SVG", + "PDF to Text": "PDF به متن", + "PDF to XLSX": "PDF به XLSX", + "PDF with layer changes saved!": "PDF با تغییرات لایه ذخیره شد!", + "PDF {{modeLabel}} applied successfully.": "{{modeLabel}} PDF با موفقیت اعمال شد.", + "PDF/A Conversion": "تبدیل به PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (سخت‌گیرانه، بدون شفافیت)", + "PDF/A-2b (Recommended)": "PDF/A-2b (توصیه‌شده)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (مدرن، پیوست را مجاز می‌کند)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDFها با موفقیت یک‌درمیان ادغام شدند!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (بدون اتلاف)", + "PUB to PDF": "PUB به PDF", + "Page": "صفحه", + "Page #": "شمارهٔ صفحه", + "Page Added": "صفحه اضافه شد", + "Page Numbers": "شمارهٔ صفحه", + "Page Removed": "صفحه حذف شد", + "Page Size": "اندازهٔ صفحه", + "Page X of Y": "صفحهٔ X از Y", + "Page background or layout changed": "پس‌زمینه یا چیدمان صفحه تغییر کرده است", + "Page container not found": "محفظهٔ صفحه پیدا نشد", + "Page extraction produced an empty PDF.": "استخراج صفحه به PDF خالی انجامید.", + "Page number": "شمارهٔ صفحه", + "Page numbers added successfully!": "شماره صفحه‌ها با موفقیت اضافه شد!", + "Page sizes standardized successfully!": "اندازهٔ صفحات با موفقیت یکسان شد!", + "Page {{currentPageNum}} of {{numPages}}": "صفحهٔ {{currentPageNum}} از {{numPages}}", + "Page {{num}} / {{numPages}}": "صفحهٔ {{num}} / {{numPages}}", + "Page {{n}} ": "صفحهٔ {{n}}", + "Page {{n}} of {{length}}": "صفحهٔ {{n}} از {{length}}", + "Page {{n}}:": "صفحهٔ {{n}}:", + "Page {{pageNumber}}": "صفحهٔ {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "صفحهٔ {{pageNumber}} فقط در PDF اول وجود دارد.", + "Page {{pageNumber}} exists only in the second PDF.": "صفحهٔ {{pageNumber}} فقط در PDF دوم وجود دارد.", + "Page {{pageNumber}} of {{totalPages}}": "صفحهٔ {{pageNumber}} از {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "صفحهٔ {{pageNum}} در این PDF وجود ندارد.", + "Page {{page}}": "صفحهٔ {{page}}", + "Page {{page}} attachment": "پیوست صفحهٔ {{page}}", + "Pages": "صفحات", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "صفحات (مثلاً 1-3، 5) - مجموع: {{pageCount}}", + "Pages Files": "فایل‌های Pages", + "Pages Per Sheet": "صفحه در هر برگ", + "Pages combined successfully!": "صفحات با موفقیت ترکیب شدند!", + "Pages have been divided successfully!": "صفحات با موفقیت تقسیم شدند!", + "Pages have been reordered.": "ترتیب صفحات تغییر کرد.", + "Pages have been reversed successfully!": "ترتیب صفحات با موفقیت وارونه شد!", + "Pages to PDF": "Pages به PDF", + "Paper Size": "اندازهٔ کاغذ", + "Paragraph": "بند", + "Parsing XML structure...": "در حال تجزیهٔ ساختار XML...", + "Parsing {{name}}...": "در حال تجزیهٔ {{name}}...", + "Partial Coverage": "پوشش جزئی", + "Partial Success": "موفقیت نسبی", + "Password": "رمز عبور", + "Password Error": "خطای رمز عبور", + "Password Needed": "رمز عبور لازم است", + "Password Required": "رمز عبور لازم است", + "Password for all files": "رمز عبور برای همهٔ فایل‌ها", + "Password for all locked files": "رمز عبور برای همهٔ فایل‌های قفل‌شده", + "Password for {{name}}": "رمز عبور {{name}}", + "Password protected": "دارای رمز عبور", + "Password required for encrypted private key": "برای کلید خصوصی رمزگذاری‌شده، رمز عبور لازم است", + "Path Stroke": "خط دور مسیر", + "Please add at least one field before downloading.": "لطفاً پیش از دانلود دست‌کم یک فیلد اضافه کنید.", + "Please draw a rectangle on at least one page to select the crop area.": "لطفاً برای انتخاب ناحیهٔ برش، روی دست‌کم یک صفحه مستطیلی رسم کنید.", + "Please ensure all page numbers in the order are unique.": "لطفاً مطمئن شوید همهٔ شماره‌های صفحه در ترتیب یکتا هستند.", + "Please enter a layer name": "لطفاً نام لایه را وارد کنید", + "Please enter a name.": "لطفاً یک نام وارد کنید.", + "Please enter a number between 0 and {{totalPages}}.": "لطفاً عددی بین 0 و {{totalPages}} وارد کنید.", + "Please enter a page order.": "لطفاً ترتیب صفحات را وارد کنید.", + "Please enter a password": "لطفاً رمز عبور را وارد کنید", + "Please enter a password for {{i}} or skip it": "لطفاً رمز عبور {{i}} را وارد کنید یا از آن بگذرید", + "Please enter a title.": "لطفاً یک عنوان وارد کنید.", + "Please enter a user password.": "لطفاً رمز عبور کاربر را وارد کنید.", + "Please enter a valid number of pages (1 or more).": "لطفاً تعداد صفحهٔ معتبر (1 یا بیشتر) وارد کنید.", + "Please enter a valid page number between 1 and {{total}}": "لطفاً شمارهٔ صفحهٔ معتبری بین 1 و {{total}} وارد کنید", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "لطفاً بازهٔ صفحهٔ معتبری وارد کنید (مثلاً 1-5، 8، 11-13).", + "Please enter page numbers to extract.": "لطفاً شمارهٔ صفحه‌هایی را که می‌خواهید استخراج شوند وارد کنید.", + "Please enter positive numbers.": "لطفاً اعداد مثبت وارد کنید.", + "Please enter some text to convert.": "لطفاً متنی برای تبدیل وارد کنید.", + "Please enter text for the watermark.": "لطفاً متن واترمارک را وارد کنید.", + "Please enter the PDF password.": "لطفاً رمز عبور PDF را وارد کنید.", + "Please load a PDF first.": "لطفاً ابتدا یک PDF بارگذاری کنید.", + "Please select PDF files to create a ZIP archive.": "لطفاً برای ساخت آرشیو ZIP فایل‌های PDF را انتخاب کنید.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "لطفاً یک فایل گواهی با پسوند .pem، .crt، .cer یا .der انتخاب کنید.", + "Please select a PDF file.": "لطفاً یک فایل PDF انتخاب کنید.", + "Please select a valid PDF file.": "لطفاً یک فایل PDF معتبر انتخاب کنید.", + "Please select an area on at least one page to crop.": "لطفاً برای برش، ناحیه‌ای را روی دست‌کم یک صفحه انتخاب کنید.", + "Please select an area to crop first.": "لطفاً ابتدا ناحیه‌ای را برای برش انتخاب کنید.", + "Please select an area to crop.": "لطفاً ناحیه‌ای را برای برش انتخاب کنید.", + "Please select an image file for the watermark.": "لطفاً یک فایل تصویر برای واترمارک انتخاب کنید.", + "Please select at least one BMP file.": "لطفاً دست‌کم یک فایل BMP انتخاب کنید.", + "Please select at least one CSV file.": "لطفاً دست‌کم یک فایل CSV انتخاب کنید.", + "Please select at least one Excel file.": "لطفاً دست‌کم یک فایل Excel انتخاب کنید.", + "Please select at least one HEIC file.": "لطفاً دست‌کم یک فایل HEIC انتخاب کنید.", + "Please select at least one JPG file.": "لطفاً دست‌کم یک فایل JPG انتخاب کنید.", + "Please select at least one JPG or JPEG2000 image.": "لطفاً دست‌کم یک تصویر JPG یا JPEG2000 انتخاب کنید.", + "Please select at least one ODT file.": "لطفاً دست‌کم یک فایل ODT انتخاب کنید.", + "Please select at least one PDF file.": "لطفاً دست‌کم یک فایل PDF انتخاب کنید.", + "Please select at least one PowerPoint file.": "لطفاً دست‌کم یک فایل PowerPoint انتخاب کنید.", + "Please select at least one RTF file.": "لطفاً دست‌کم یک فایل RTF انتخاب کنید.", + "Please select at least one SVG file.": "لطفاً دست‌کم یک فایل SVG انتخاب کنید.", + "Please select at least one TIFF file.": "لطفاً دست‌کم یک فایل TIFF انتخاب کنید.", + "Please select at least one Word document.": "لطفاً دست‌کم یک سند Word انتخاب کنید.", + "Please select at least one file to attach.": "لطفاً دست‌کم یک فایل برای پیوست انتخاب کنید.", + "Please select at least one image file.": "لطفاً دست‌کم یک فایل تصویر انتخاب کنید.", + "Please select at least one text file.": "لطفاً دست‌کم یک فایل متنی انتخاب کنید.", + "Please select at least one {{FILETYPE_NAME}} file.": "لطفاً دست‌کم یک فایل {{FILETYPE_NAME}} انتخاب کنید.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "لطفاً دست‌کم یک فایل {{TOOL_NAME}} (.eml یا .msg) انتخاب کنید.", + "Please select at least one {{TOOL_NAME}} file.": "لطفاً دست‌کم یک فایل {{TOOL_NAME}} انتخاب کنید.", + "Please select even or odd pages.": "لطفاً صفحه‌های زوج یا فرد را انتخاب کنید.", + "Please select one or more PDF files.": "لطفاً یک یا چند فایل PDF انتخاب کنید.", + "Please select pages to delete.": "لطفاً صفحه‌های موردنظر برای حذف را انتخاب کنید.", + "Please select pages to duplicate.": "لطفاً صفحه‌های موردنظر برای تکثیر را انتخاب کنید.", + "Please select pages to mark for splitting.": "لطفاً صفحه‌هایی را که می‌خواهید برای تقسیم علامت بزنید انتخاب کنید.", + "Please select pages to rotate.": "لطفاً صفحه‌های موردنظر برای چرخاندن را انتخاب کنید.", + "Please specify a page range for page-level attachments.": "لطفاً برای پیوست‌های سطح صفحه، یک بازهٔ صفحه مشخص کنید.", + "Please upload PDF files.": "لطفاً فایل‌های PDF را بارگذاری کنید.", + "Please upload PDFs first.": "لطفاً ابتدا PDFها را بارگذاری کنید.", + "Please upload a .docx file first.": "لطفاً ابتدا یک فایل .docx بارگذاری کنید.", + "Please upload a PDF file first.": "لطفاً ابتدا یک فایل PDF بارگذاری کنید.", + "Please upload a PDF file.": "لطفاً یک فایل PDF بارگذاری کنید.", + "Please upload a PDF first.": "لطفاً ابتدا یک PDF بارگذاری کنید.", + "Please upload a valid PDF file.": "لطفاً یک فایل PDF معتبر بارگذاری کنید.", + "Please upload at least one PDF file.": "لطفاً دست‌کم یک فایل PDF بارگذاری کنید.", + "Please upload at least two PDF files to alternate and mix.": "لطفاً برای ادغام یک‌درمیان، دست‌کم دو فایل PDF بارگذاری کنید.", + "Please upload both a base PDF and an overlay/underlay PDF.": "لطفاً هم یک PDF پایه و هم یک PDF روکش/زیرلایه بارگذاری کنید.", + "Please upload valid PDF files.": "لطفاً فایل‌های PDF معتبر بارگذاری کنید.", + "Please use the Download button in the PDF viewer toolbar above.": "لطفاً از دکمهٔ دانلود در نوار ابزار نمایشگر PDF بالا استفاده کنید.", + "Please wait for the PDF viewer to load.": "لطفاً منتظر بارگذاری نمایشگر PDF بمانید.", + "Please wait for the form to finish loading.": "لطفاً منتظر بمانید تا بارگذاری فرم تمام شود.", + "Portrait": "عمودی", + "Position": "موقعیت", + "Post-processing for transparency compliance...": "پس‌پردازش برای رعایت شفافیت...", + "Posterize": "پوستری‌کردن", + "Posterizing PDF...": "در حال پوستری‌کردن PDF...", + "PowerPoint to PDF": "PowerPoint به PDF", + "Pre Flatten": "مسطح‌سازی اولیه", + "Pre-flattening PDF...": "در حال مسطح‌سازی اولیهٔ PDF...", + "Prefer JPEG 2000 for photos": "ترجیح JPEG 2000 برای عکس‌ها", + "Preparing PDF export...": "در حال آماده‌سازی خروجی PDF...", + "Preparing conversion...": "در حال آماده‌سازی تبدیل...", + "Preparing download...": "در حال آماده‌سازی دانلود...", + "Preparing preview...": "در حال آماده‌سازی پیش‌نمایش...", + "Presentations": "ارائه‌ها", + "Preserve PDF/A": "حفظ PDF/A", + "Preview": "پیش‌نمایش", + "Preview Error": "خطای پیش‌نمایش", + "Preview Text": "متن پیش‌نمایش", + "Previous page": "صفحهٔ قبل", + "Print Form": "چاپ فرم", + "Private data that editing apps store inside the PDF.": "دادهٔ خصوصی که برنامه‌های ویرایش درون PDF ذخیره می‌کنند.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF پردازش شد.", + "Processing Complete": "پردازش کامل شد", + "Processing Dpi": "DPI پردازش", + "Processing Failed": "پردازش ناموفق بود", + "Processing PDF permissions...": "در حال پردازش مجوزهای PDF...", + "Processing attachments...": "در حال پردازش پیوست‌ها...", + "Processing failed for {{name}}.": "پردازش {{name}} ناموفق بود.", + "Processing file {{n}} of {{length}}...": "در حال پردازش فایل {{n}} از {{length}}...", + "Processing images...": "در حال پردازش تصاویر...", + "Processing multiple PDFs...": "در حال پردازش چند PDF...", + "Processing page {{i}} of {{numPages}}": "در حال پردازش صفحهٔ {{i}} از {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "در حال پردازش صفحهٔ {{i}} از {{numPages}}...", + "Processing page {{n}} of {{length}}...": "در حال پردازش صفحهٔ {{n}} از {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "در حال پردازش صفحهٔ {{pageNum}} از {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "در حال پردازش صفحهٔ {{pageNum}} از {{totalPages}}...", + "Processing produced an empty file.": "پردازش به فایل خالی انجامید.", + "Processing resulted in an empty file.": "پردازش به فایل خالی انجامید.", + "Processing sheet {{n}}...": "در حال پردازش برگ {{n}}...", + "Processing {{name}}...": "در حال پردازش {{name}}...", + "Processing {{nodeName}}...": "در حال پردازش {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "در حال پردازش {{n}}/{{length}}: {{name}}...", + "Processing...": "در حال پردازش...", + "Producer": "تولیدکننده", + "Publisher Files": "فایل‌های Publisher", + "Purple": "بنفش", + "PyMuPDF (Document Processing)": "PyMuPDF (پردازش سند)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF پیکربندی نشده است. لطفاً آن را در تنظیمات پیشرفته پیکربندی کنید.", + "PyMuPDF module did not export expected PyMuPDF class.": "ماژول PyMuPDF کلاس مورد انتظار PyMuPDF را صادر نکرد.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF یک فایل رمزگشایی‌شدهٔ خالی تولید کرد.", + "PyMuPDF: not configured.": "PyMuPDF: پیکربندی نشده است.", + "QR Code": "کد QR", + "Quality": "کیفیت", + "Quits application (cannot be overridden)": "از برنامه خارج می‌شود (قابل تغییر نیست)", + "RSA-PKCS1 signature does not verify against signer public key": "امضای RSA-PKCS1 با کلید عمومی امضاکننده تأیید نمی‌شود", + "RSA-PSS signature does not verify against signer public key": "امضای RSA-PSS با کلید عمومی امضاکننده تأیید نمی‌شود", + "Rasterization Complete": "رستر کردن کامل شد", + "Rasterization Partial": "رستر کردن ناقص", + "Rasterize": "رستر کردن", + "Rasterize Dpi": "DPI رستر", + "Rasterize pages to images": "تبدیل صفحات به تصویر (رستر)", + "Rasterize quality": "کیفیت رستر", + "Rasterize resolution (DPI)": "وضوح رستر (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF رستر شد، {{failed}} ناموفق بود.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "در حال رستر کردن {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "در حال رستر کردن {{name}}...", + "Rasterizing...": "در حال رستر کردن...", + "Rating must be between 0 and 5": "امتیاز باید بین 0 و 5 باشد", + "Read Only": "فقط خواندنی", + "Reading CSV file...": "در حال خواندن فایل CSV...", + "Reading PDF...": "در حال خواندن PDF...", + "Reading XML file...": "در حال خواندن فایل XML...", + "Reading encrypted PDF...": "در حال خواندن PDF رمزگذاری‌شده...", + "Reading files...": "در حال خواندن فایل‌ها...", + "Reading layer configuration...": "در حال خواندن پیکربندی لایه‌ها...", + "Reading {{name}} ({{n}}/{{length}})...": "در حال خواندن {{name}} ({{n}}/{{length}})...", + "Ready": "آماده", + "Reason": "دلیل", + "Red": "قرمز", + "Redact": "ردگیری", + "Redact Mode": "حالت ردگیری", + "Redact text from PDF": "ردگیری متن از PDF", + "Redaction Failed": "ردگیری ناموفق بود", + "Reduce PDF file size": "کاهش حجم فایل PDF", + "Reduce color complexity": "کاهش پیچیدگی رنگ", + "Reduces file size by removing color information.": "با حذف اطلاعات رنگ، حجم فایل را کاهش می‌دهد.", + "Reloads page": "صفحه را دوباره بارگذاری می‌کند", + "Remove": "حذف", + "Remove All Attachments": "حذف همهٔ پیوست‌ها", + "Remove Annotations": "حذف حاشیه‌نویسی‌ها", + "Remove Blank Pages": "حذف صفحات خالی", + "Remove Embedded Files": "حذف فایل‌های جاسازی‌شده", + "Remove Fonts": "حذف قلم‌ها", + "Remove Javascript": "حذف Javascript", + "Remove Layers": "حذف لایه‌ها", + "Remove Links": "حذف پیوندها", + "Remove Mark Info": "حذف Mark Info", + "Remove Metadata": "حذف فراداده", + "Remove PDF password protection": "حذف محافظت رمز عبور از PDF", + "Remove Structure Tree": "حذف درخت ساختار", + "Remove alternate images": "حذف تصاویر جایگزین", + "Remove application data": "حذف دادهٔ برنامه", + "Remove article threads": "حذف رشته‌های مقاله", + "Remove attachment": "حذف پیوست", + "Remove blank pages automatically": "حذف خودکار صفحات خالی", + "Remove document structure tree": "حذف درخت ساختار سند", + "Remove file": "حذف فایل", + "Remove metadata, scripts, and hidden data": "حذف فراداده، اسکریپت‌ها و داده‌های پنهان", + "Remove output intents": "حذف Output Intent ها", + "Remove page thumbnails": "حذف تصاویر بندانگشتی صفحه", + "Remove specific pages": "حذف صفحه‌های مشخص", + "Remove web capture information": "حذف اطلاعات ثبت وب", + "Remove {{name}}": "حذف {{name}}", + "Removed \"{{beforeText}}\"": "«{{beforeText}}» حذف شد", + "Removed image ({{width}}×{{height}})": "تصویر حذف شد ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} صفحهٔ خالی با موفقیت حذف شد!", + "Removing all metadata...": "در حال حذف همهٔ فراداده...", + "Removing annotations...": "در حال حذف حاشیه‌نویسی‌ها...", + "Removing redacted text from document data...": "در حال حذف متن ردگیری‌شده از داده‌های سند...", + "Removing restrictions...": "در حال حذف محدودیت‌ها...", + "Removing {{length}} blank page(s)...": "در حال حذف {{length}} صفحهٔ خالی...", + "Render Error": "خطای نمایش", + "Rendering Page {{num}}...": "در حال نمایش صفحهٔ {{num}}...", + "Rendering page previews...": "در حال نمایش پیش‌نمایش صفحه‌ها...", + "Rendering page previews: {{current}}/{{total}}": "نمایش پیش‌نمایش صفحه‌ها: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "در حال نمایش صفحهٔ {{n}} از {{length}}...", + "Rendering preview for page {{pageNum}}...": "در حال نمایش پیش‌نمایش صفحهٔ {{pageNum}}...", + "Reopens closed tab": "برگهٔ بسته‌شده را دوباره باز می‌کند", + "Repair": "ترمیم", + "Repair Failed": "ترمیم ناموفق بود", + "Repair corrupted PDF": "ترمیم PDF خراب", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} فایل ترمیم شد. ترمیم ناموفق: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "در حال ترمیم {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "در حال ترمیم {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "«{{beforeText}}» با «{{afterText}}» جایگزین شد", + "Required": "الزامی", + "Resamples even when an image is only slightly above the limit.": "حتی وقتی تصویر فقط کمی از حد بالاتر است، دوباره نمونه‌برداری می‌کند.", + "Reset Form": "بازنشانی فرم", + "Reset and go back to file uploader? All unsaved changes will be lost.": "بازنشانی و بازگشت به بارگذاری فایل؟ همهٔ تغییرات ذخیره‌نشده از بین می‌رود.", + "Resolution": "وضوح", + "Retain Page Labels": "حفظ برچسب‌های صفحه", + "Retry Failed": "تلاش مجدد ناموفق بود", + "Reverse Pages": "وارونه‌سازی ترتیب صفحات", + "Reverse page order": "وارونه کردن ترتیب صفحات", + "Reversing page order...": "در حال وارونه‌سازی ترتیب صفحات...", + "Reversing {{name}} ({{n}}/{{length}})...": "در حال وارونه‌سازی {{name}} ({{n}}/{{length}})...", + "Right": "راست", + "Right edge in points": "لبهٔ راست بر حسب پوینت", + "Rotate": "چرخاندن", + "Rotate +90°": "چرخاندن 90+ درجه", + "Rotate all pages": "چرخاندن همهٔ صفحات", + "Rotation": "چرخش", + "Rotation Variance": "تغییرپذیری چرخش", + "Rotations applied successfully!": "چرخش‌ها با موفقیت اعمال شد!", + "Rows": "ردیف‌ها", + "Run Javascript": "اجرای Javascript", + "Running OCR on page {{pageNum}}...": "در حال اجرای OCR روی صفحهٔ {{pageNum}}...", + "Running...": "در حال اجرا...", + "SVG": "SVG", + "SVG Files": "فایل‌های SVG", + "SVG to PDF": "SVG به PDF", + "Sanitize": "پاک‌سازی", + "Sanitized With Warnings": "پاک‌سازی با هشدار", + "Sanitizing PDF...": "در حال پاک‌سازی PDF...", + "Saturation": "اشباع", + "Saved": "ذخیره شد", + "Saving PDF with layer changes...": "در حال ذخیرهٔ PDF با تغییرات لایه...", + "Scaling Mode": "حالت مقیاس‌بندی", + "Scanner Effect": "جلوهٔ اسکنر", + "Scanner effect applied successfully!": "جلوهٔ اسکنر با موفقیت اعمال شد!", + "Scanning page {{n}} of {{pageCount}}...": "در حال پویش صفحهٔ {{n}} از {{pageCount}}...", + "Search Text": "جستجوی متن", + "Search languages...": "جستجوی زبان‌ها...", + "Select Font": "انتخاب قلم", + "Select a field to edit properties": "برای ویرایش ویژگی‌ها یک فیلد انتخاب کنید", + "Select a field...": "یک فیلد انتخاب کنید...", + "Select to add this button to an existing group": "برای افزودن این دکمه به یک گروه موجود، انتخاب کنید", + "Selected Option": "گزینهٔ انتخاب‌شده", + "Self-Signed: Signer Identity Not Verified": "امضای خودصادرشده: هویت امضاکننده تأیید نشده است", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "دارایی‌های OCR خودمیزبان به‌طور ناقص پیکربندی شده‌اند. {{missing}} را همراه با سایر URLهای دارایی Tesseract تنظیم کنید.", + "Separator": "جداکننده", + "Separator Color": "رنگ جداکننده", + "Separator Thickness": "ضخامت جداکننده", + "Sepia": "قهوه‌ای کهنه", + "Serial Number:": "شمارهٔ سریال:", + "Set custom destination": "تنظیم مقصد سفارشی", + "Shapes": "شکل‌ها", + "Sheet {{n}} {{sideLabel}}": "برگ {{n}} {{sideLabel}}", + "Show": "نمایش", + "Show password": "نمایش رمز عبور", + "Show/Hide Field": "نمایش/پنهان کردن فیلد", + "Sign Here": "اینجا را امضا کنید", + "Signature /Contents is not a single DER object followed by zero padding": "Contents امضا یک شیء DER واحد به‌همراه صفرهای انتهایی نیست", + "Signature Algorithm:": "الگوریتم امضا:", + "Signature Intact: Signer Identity Not Verified": "امضا سالم است: هویت امضاکننده تأیید نشده است", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "فیلدهای امضا فیلدهای امضای AcroForm هستند و فقط در یک نمایشگر PDF پیشرفته دیده می‌شوند.", + "Signature has a missing or malformed /ByteRange": "امضا فاقد /ByteRange است یا /ByteRange آن ناقص است", + "Signature scheme {{kind}} not implemented": "طرح امضای {{kind}} پیاده‌سازی نشده است", + "Signature {{n}}": "امضای {{n}}", + "Signatures": "امضاها", + "Signed By": "امضاکننده", + "Signed On": "تاریخ امضا", + "Signed PDF Not Changed": "PDF امضاشده تغییر نکرده است", + "Signed PDF downloaded successfully!": "PDF امضاشده با موفقیت دانلود شد!", + "Signed PDF saved successfully!": "PDF امضاشده با موفقیت ذخیره شد!", + "Simple (1, 2, 3)": "ساده (1، 2، 3)", + "Simplify large color profiles": "ساده‌سازی پروفایل‌های رنگ بزرگ", + "Skew Threshold": "آستانهٔ کجی", + "Skip": "رد کردن", + "Skip All": "رد کردن همه", + "Skip Remaining": "رد کردن بقیه", + "Skip this file": "رد کردن این فایل", + "Skipped: {{join}}.": "ردشده: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "فایل‌های کوچک‌تر، اما فقط نمایشگرهایی که از Brotli پشتیبانی می‌کنند می‌توانند آن‌ها را باز کنند، مانند Firefox، MuPDF 1.26+ و Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "برخی فایل‌ها رد شدند، چون تصویر پشتیبانی‌شده نیستند.", + "Some files were skipped. Only BMP files are allowed.": "برخی فایل‌ها رد شدند. فقط فایل‌های BMP مجاز هستند.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "برخی فایل‌ها رد شدند. فقط فایل‌های HEIC/HEIF مجاز هستند.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "برخی فایل‌ها رد شدند. فقط فایل‌های JPG، JPEG، JP2 و JPX مجاز هستند.", + "Some files were skipped. Only PDF files are allowed.": "برخی فایل‌ها رد شدند. فقط فایل‌های PDF مجاز هستند.", + "Some files were skipped. Only PNG images are allowed.": "برخی فایل‌ها رد شدند. فقط تصاویر PNG مجاز هستند.", + "Some files were skipped. Only SVG graphics are allowed.": "برخی فایل‌ها رد شدند. فقط تصاویر SVG مجاز هستند.", + "Some files were skipped. Only TIFF files are allowed.": "برخی فایل‌ها رد شدند. فقط فایل‌های TIFF مجاز هستند.", + "Some files were skipped. Only WebP images are allowed.": "برخی فایل‌ها رد شدند. فقط تصاویر WebP مجاز هستند.", + "Some files were skipped. Only supported image formats are allowed.": "برخی فایل‌ها رد شدند. فقط قالب‌های تصویری پشتیبانی‌شده مجاز هستند.", + "Some files were skipped. Only text files are allowed.": "برخی فایل‌ها رد شدند. فقط فایل‌های متنی مجاز هستند.", + "Some pages could not be processed. Please try again.": "برخی صفحات پردازش نشدند. لطفاً دوباره تلاش کنید.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "برخی نشانه‌های ردگیری اعمال نشدند، بنابراین فایل دانلود نشد. آن‌ها را در ویرایشگر اعمال یا حذف کنید و دوباره تلاش کنید.", + "Spacing": "فاصله‌گذاری", + "Split PDF": "تقسیم PDF", + "Split by Bookmarks": "تقسیم بر اساس نشانک‌ها", + "Split pages into tile grid for poster printing": "تقسیم صفحات به شبکهٔ کاشی برای چاپ پوستر", + "Split pages vertically or horizontally": "تقسیم صفحات به‌صورت عمودی یا افقی", + "Splitting PDF pages...": "در حال تقسیم صفحات PDF...", + "Splitting PDF...": "در حال تقسیم PDF...", + "Spreadsheets": "صفحه‌گسترده‌ها", + "Standard (192 DPI)": "استاندارد (192 DPI)", + "Standard Size": "اندازهٔ استاندارد", + "Standardize all pages to a target size": "یکسان‌سازی همهٔ صفحات با یک اندازهٔ هدف", + "Standardizing pages...": "در حال یکسان‌سازی صفحات...", + "Stitch all pages into one continuous page": "اتصال همهٔ صفحات به یک صفحهٔ پیوسته", + "Straighten skewed PDF pages": "صاف‌کردن صفحات کج PDF", + "Strip all annotations": "حذف همهٔ حاشیه‌نویسی‌ها", + "Style": "سبک", + "Style Changed": "سبک تغییر کرد", + "Style changed ({{length}} regions)": "سبک تغییر کرد ({{length}} ناحیه)", + "Subject": "موضوع", + "Subset embedded fonts": "زیرمجموعه‌سازی قلم‌های جاسازی‌شده", + "Success": "موفق", + "Success!": "موفق شد!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} فایل CSV با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} فایل Excel با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} فایل ODT با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF با موفقیت به DOCX تبدیل شد.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF با موفقیت به Markdown تبدیل شد.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF با موفقیت به {{level}} تبدیل شد.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} فایل PSD با موفقیت به یک PDF تبدیل شد.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} فایل PowerPoint با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} فایل RTF با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} سند Word با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} files to PDF.": "{{length}} فایل با موفقیت به PDF تبدیل شد.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} فایل {{TOOL_NAME}} با موفقیت به PDF تبدیل شد.", + "Successfully converted {{name}} to DOCX.": "{{name}} با موفقیت به DOCX تبدیل شد.", + "Successfully converted {{name}} to Markdown.": "{{name}} با موفقیت به Markdown تبدیل شد.", + "Successfully converted {{name}} to PDF.": "{{name}} با موفقیت به PDF تبدیل شد.", + "Successfully converted {{name}} to {{level}}.": "{{name}} با موفقیت به {{level}} تبدیل شد.", + "Successfully extracted PDF for AI/LLM use.": "PDF برای استفادهٔ هوش مصنوعی/LLM با موفقیت استخراج شد.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF برای استفادهٔ هوش مصنوعی/LLM با موفقیت استخراج شد.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF با موفقیت با {{dpi}} DPI رستر شد.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF با موفقیت با {{dpi}} DPI رستر شد.", + "Supported: CBZ, CBR": "پشتیبانی‌شده: CBZ، CBR", + "Supported: DOC, DOCX, ODT, RTF": "پشتیبانی‌شده: DOC، DOCX، ODT، RTF", + "Supported: EML, MSG": "پشتیبانی‌شده: EML، MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "پشتیبانی‌شده: JPG، PNG، BMP، GIF، TIFF، WebP، HEIC، PSD، SVG، PNM، PGM، PBM، PPM، PAM، JXR، JPX، JP2", + "Supported: PPT, PPTX, ODP": "پشتیبانی‌شده: PPT، PPTX، ODP", + "Supported: VSD, VSDX": "پشتیبانی‌شده: VSD، VSDX", + "Supported: XLSX, XLS, ODS, CSV": "پشتیبانی‌شده: XLSX، XLS، ODS، CSV", + "Supported: XPS, OXPS": "پشتیبانی‌شده: XPS، OXPS", + "Switches apps": "بین برنامه‌ها جابه‌جا می‌شود", + "Switches tabs": "بین برگه‌ها جابه‌جا می‌شود", + "Table of Contents": "فهرست مطالب", + "Table {{n}} (Page {{page}})": "جدول {{n}} (صفحهٔ {{page}})", + "Tabloid": "Tabloid", + "Target Field": "فیلد هدف", + "Target Kilobytes": "کیلوبایت هدف", + "Target Not Reached": "به هدف نرسید", + "Target Size": "حجم هدف", + "Technical Details": "جزئیات فنی", + "Temperature": "دما", + "Template \"{{name}}\" loaded.": "قالب «{{name}}» بارگذاری شد.", + "Template \"{{name}}\" saved.": "قالب «{{name}}» ذخیره شد.", + "Text": "متن", + "Text Color": "رنگ متن", + "Text Files": "فایل‌های متنی", + "Text color changed successfully!": "رنگ متن با موفقیت تغییر کرد!", + "Text converted to PDF successfully!": "متن با موفقیت به PDF تبدیل شد!", + "Text extracted successfully!": "متن با موفقیت استخراج شد!", + "Text to PDF": "متن به PDF", + "That password did not open any of the remaining files.": "این رمز عبور هیچ‌یک از فایل‌های باقی‌مانده را باز نکرد.", + "The PDF file(s) do not contain any attachments to extract.": "فایل(های) PDF پیوستی برای استخراج ندارند.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF دارای {{totalPages}} صفحه است که بر {{nValue}} بخش‌پذیر نیست. آخرین PDF شامل {{remainder}} صفحه خواهد بود.", + "The PDF might be corrupted or password protected.": "ممکن است PDF خراب یا دارای رمز عبور باشد.", + "The PDF might be corrupted or password-protected.": "ممکن است PDF خراب یا دارای رمز عبور باشد.", + "The PDF might be corrupted.": "ممکن است PDF خراب باشد.", + "The PDF viewer is still initializing.": "نمایشگر PDF هنوز در حال راه‌اندازی است.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF دانلود شد، اما این مراحل کامل نشدند: {{join}}. ممکن است محتوایی که پوشش می‌دهند هنوز در فایل باشد.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL نوع محتوای غیرمنتظره‌ای برگرداند: {{contentType}}. انتظار یک فایل JavaScript می‌رفت.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "بایت‌های خارج از /ByteRange دقیقاً یک امضای کدگذاری‌شدهٔ هگز نیستند", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "بایت‌های خارج از /ByteRange همان /Contents این امضا نیستند", + "The compression engine returned an unreadable result.": "موتور فشرده‌سازی نتیجه‌ای ناخوانا برگرداند.", + "The compression engine stopped unexpectedly.": "موتور فشرده‌سازی به‌طور غیرمنتظره متوقف شد.", + "The current password you entered is incorrect. Please try again.": "رمز عبور فعلی که وارد کردید نادرست است. لطفاً دوباره تلاش کنید.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "نام فیلدهای زیر از قبل در PDF بارگذاری‌شده وجود دارند: {{conflictList}}. لطفاً پیش از دانلود نام این فیلدها را تغییر دهید.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "نام فیلدهای زیر بیش از یک بار استفاده شده‌اند: {{duplicateList}}. لطفاً پیش از دانلود نام این فیلدها را به نام‌های یکتا تغییر دهید.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "تعداد صفحه‌های مشخص‌شده ({{length}}) با تعداد فعلی صفحه‌های سند ({{currentGridCount}}) برابر نیست. لطفاً ترتیب کاملی برای همهٔ صفحه‌ها بدهید.", + "The password you entered is incorrect. Please try again.": "رمز عبوری که وارد کردید نادرست است. لطفاً دوباره تلاش کنید.", + "The password you entered is wrong or the file is corrupted.": "رمز عبوری که وارد کردید نادرست است یا فایل خراب است.", + "The provided file could not be loaded as an image. It may be corrupted.": "فایل داده‌شده را نمی‌توان به‌عنوان تصویر بارگذاری کرد. ممکن است خراب باشد.", + "The requested OCR language is not available: {{unavailableText}}.": "زبان OCR درخواستی در دسترس نیست: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "ترتیب صفحهٔ مشخص‌شده ناقص است یا شمارهٔ صفحه‌های نامعتبر دارد. لطفاً برای هر صفحهٔ اصلی یک جایگاه جدید مشخص کنید.", + "These files are not valid PDFs, so they were not added: {{names}}.": "این فایل‌ها PDF معتبر نیستند و اضافه نشدند: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "این فایل‌ها دارای رمز عبور هستند: {{names}}. رمز عبور آن‌ها را روی کارت فایل‌ها وارد کنید یا آن‌ها را حذف کنید، سپس دوباره فشرده کنید.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "این نسخهٔ BentoPDF فقط دادهٔ OCR مربوط به {{availableText}} را در خود دارد.", + "This PDF does not contain any digital signatures.": "این PDF هیچ امضای دیجیتالی ندارد.", + "This PDF has no layers (OCG).": "این PDF لایه‌ای (OCG) ندارد.", + "This PDF is password-protected. Please enter the current password to proceed.": "این PDF دارای رمز عبور است. برای ادامه، رمز عبور فعلی را وارد کنید.", + "This document contains pages with different dimensions:": "این سند شامل صفحه‌هایی با ابعاد متفاوت است:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "این سند ۱ علامت پنهان‌سازی دارد که هنوز اعمال نشده است. تا وقتی علامت اعمال نشود، محتوای زیر آن در فایل باقی می‌ماند. همهٔ علامت‌ها اعمال و دانلود شود؟", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "این سند {{count}} علامت پنهان‌سازی دارد که هنوز اعمال نشده‌اند. تا وقتی علامت اعمال نشود، محتوای زیر آن در فایل باقی می‌ماند. همهٔ علامت‌ها اعمال و دانلود شود؟", + "This feature requires {{name}} to be configured.": "این قابلیت نیاز دارد که {{name}} پیکربندی شود.", + "This file is not a valid PDF.": "این فایل یک PDF معتبر نیست.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "این ماژول تحت مجوز AGPL-3.0 است. با پیکربندی آن، شرایط مجوزش را می‌پذیرید.", + "This tool has been disabled": "این ابزار غیرفعال شده است", + "This tool is not available in your deployment. Contact your administrator for more information.": "این ابزار در استقرار شما در دسترس نیست. برای اطلاعات بیشتر با مدیر خود تماس بگیرید.", + "Threshold": "آستانه", + "Tile": "کاشی", + "Tile Gap X": "فاصلهٔ افقی کاشی‌ها", + "Tile Gap Y": "فاصلهٔ عمودی کاشی‌ها", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "مُهر زمانی", + "Timestamp Failed": "مُهر زمانی ناموفق بود", + "Tint": "ته‌رنگ", + "Title": "عنوان", + "To actually fill or change the options, use our PDF Form Filler tool.": "برای پر کردن یا تغییر گزینه‌ها، از ابزار «پرکنندهٔ فرم PDF» ما استفاده کنید.", + "Toggle": "تغییر وضعیت", + "Toggle style": "تغییر سبک", + "Toggle sync scroll": "تغییر همگام‌سازی پیمایش", + "Tool Unavailable": "ابزار در دسترس نیست", + "Tooltip / Help Text": "راهنمای کوتاه / متن کمکی", + "Top": "بالا", + "Top Center": "بالا وسط", + "Top Left": "بالا چپ", + "Top Right": "بالا راست", + "Top edge in points": "لبهٔ بالا بر حسب پوینت", + "Total Pages": "مجموع صفحات", + "Transparent Background": "پس‌زمینهٔ شفاف", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "برای هر تصویر JPEG 2000 را با JPEG مقایسه می‌کند و کوچک‌تر را نگه می‌دارد.", + "Trim margins from all pages": "برش حاشیه‌ها از همهٔ صفحه‌ها", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "راستی‌آزمایی اعتماد: {{trustVerified}}/{{length}} امضا با گواهی سفارشی تأیید شد", + "Trusted": "مورد اعتماد", + "Trusted certificate loaded": "گواهی مورد اعتماد بارگذاری شد", + "Tsa Url": "URL سرور TSA", + "Turns off quality, resolution and every other lossy image step.": "کیفیت، وضوح و هر مرحلهٔ دیگر کاهش‌دهندهٔ کیفیت تصویر را خاموش می‌کند.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL باید با http:// یا https:// شروع شود", + "Ultra (384 DPI)": "فوق‌العاده (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "رمزگشایی PDF با رمز عبور داده‌شده ممکن نیست.", + "Unable to repair any of the uploaded PDF files.": "ترمیم هیچ‌یک از فایل‌های PDF بارگذاری‌شده ممکن نیست.", + "Unembed standard fonts": "حذف جاسازی قلم‌های استاندارد", + "Unembed standard-font look-alikes": "حذف جاسازی قلم‌های شبیه قلم‌های استاندارد", + "Unexpected delimiter in content stream": "جداکنندهٔ غیرمنتظره در جریان محتوا", + "Unexpected reply from the engine.": "پاسخ غیرمنتظره از موتور.", + "Uniform": "یکنواخت", + "Unique Page Sizes": "اندازه‌های صفحهٔ یکتا", + "Unknown": "نامشخص", + "Unknown error": "خطای ناشناخته", + "Unknown error occurred in worker.": "خطای ناشناخته در Worker رخ داد.", + "Unknown error occurred.": "خطای ناشناخته رخ داد.", + "Unlock": "باز کردن قفل", + "Unlock All": "باز کردن قفل همه", + "Unlock Remaining ({{remaining}})": "باز کردن قفل بقیه ({{remaining}})", + "Unlocked": "قفل باز شد", + "Unlocked {{unlocked}} of {{length}} files.": "قفل {{unlocked}} فایل از {{length}} فایل باز شد.", + "Unlocking...": "در حال باز کردن قفل...", + "Unresolved optional content reference": "ارجاع محتوای اختیاری حل‌نشده", + "Unsupported ECDSA curve in signer certificate": "منحنی ECDSA در گواهی امضاکننده پشتیبانی نمی‌شود", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "تصویر پشتیبانی‌نشده. لطفاً برای واترمارک از PNG یا JPG استفاده کنید.", + "Unsupported digest OID {{digestOid}}": "OID هش پشتیبانی‌نشده {{digestOid}}", + "Unsupported file type: .{{ext}}": "نوع فایل پشتیبانی‌نشده: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID الگوریتم امضای پشتیبانی‌نشده {{oid}}", + "Unterminated array or dictionary in content stream": "آرایه یا دیکشنری ناتمام در جریان محتوا", + "Unterminated hex string in content stream": "رشتهٔ هگز ناتمام در جریان محتوا", + "Unterminated inline image in content stream": "تصویر درون‌خطی ناتمام در جریان محتوا", + "Unterminated string in content stream": "رشتهٔ ناتمام در جریان محتوا", + "Unverified: Unsupported Signature Algorithm": "تأییدنشده: الگوریتم امضا پشتیبانی نمی‌شود", + "Updating metadata...": "در حال به‌روزرسانی فراداده...", + "Upload Certificate": "بارگذاری گواهی", + "Upload Comics": "بارگذاری کمیک‌ها", + "Upload Documents": "بارگذاری اسناد", + "Upload EPUB Files": "بارگذاری فایل‌های EPUB", + "Upload Email Files": "بارگذاری فایل‌های ایمیل", + "Upload FB2 Files": "بارگذاری فایل‌های FB2", + "Upload Images": "بارگذاری تصاویر", + "Upload JSON Files": "بارگذاری فایل‌های JSON", + "Upload MOBI Files": "بارگذاری فایل‌های MOBI", + "Upload Markdown Files": "بارگذاری فایل‌های Markdown", + "Upload ODG Files": "بارگذاری فایل‌های ODG", + "Upload PDFs": "بارگذاری PDFها", + "Upload PUB Files": "بارگذاری فایل‌های PUB", + "Upload Pages Files": "بارگذاری فایل‌های Pages", + "Upload Presentations": "بارگذاری ارائه‌ها", + "Upload SVG Files": "بارگذاری فایل‌های SVG", + "Upload Spreadsheets": "بارگذاری صفحه‌گسترده‌ها", + "Upload Text Files": "بارگذاری فایل‌های متنی", + "Upload Visio Files": "بارگذاری فایل‌های Visio", + "Upload WPD Files": "بارگذاری فایل‌های WPD", + "Upload WPS Files": "بارگذاری فایل‌های WPS", + "Upload XML Files": "بارگذاری فایل‌های XML", + "Upload XPS Files": "بارگذاری فایل‌های XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "یک PDF بارگذاری کنید و برای دیدن چیدمان دفترچه روی «ساخت پیش‌نمایش» کلیک کنید", + "Upload images and convert to PDF": "بارگذاری تصاویر و تبدیل به PDF", + "Upload one or more PDF files": "یک یا چند فایل PDF بارگذاری کنید", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "حروف بزرگ A-Z، ارقام 0-9 و - . $ / + % SPACE", + "Use same password for all files": "استفاده از یک رمز عبور برای همهٔ فایل‌ها", + "User Password": "رمز عبور کاربر", + "VSD to PDF": "VSD به PDF", + "Valid From": "معتبر از", + "Valid Signature": "امضای معتبر", + "Valid Until": "معتبر تا", + "Validating {{n}} of {{length}}: {{name}}": "در حال اعتبارسنجی {{n}} از {{length}}: {{name}}", + "Validating...": "در حال اعتبارسنجی...", + "Value": "مقدار", + "Value (e.g., Marketing)": "مقدار (مثلاً بازاریابی)", + "Vertical": "عمودی", + "Viewer not ready": "نمایشگر آماده نیست", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "نمایشگر آماده نیست. لطفاً یک PDF بارگذاری کنید و منتظر بمانید تا بارگذاری تمام شود.", + "Visibility": "نمایان‌بودن", + "Visio Files": "فایل‌های Visio", + "WPD to PDF": "WPD به PDF", + "WPS Files": "فایل‌های WPS", + "WPS to PDF": "WPS به PDF", + "Watermark": "واترمارک", + "Watermark added successfully!": "واترمارک با موفقیت اضافه شد!", + "Web Crypto API not available in this context": "Web Crypto API در این زمینه در دسترس نیست", + "Web Crypto import/verify failed: {{error}}": "درون‌ریزی/راستی‌آزمایی Web Crypto ناموفق بود: {{error}}", + "WebP": "WebP", + "Whitelist": "فهرست مجاز", + "Width ({{unit}})": "عرض ({{unit}})", + "Word": "Word", + "Word Documents": "اسناد Word", + "Word to PDF": "Word به PDF", + "WordPerfect Files": "فایل‌های WordPerfect", + "Worker crashed": "Worker از کار افتاد", + "Worker error occurred. Check console for details.": "در Worker خطایی رخ داد. جزئیات را در کنسول ببینید.", + "Workflow completed": "گردش کار کامل شد", + "Wrong password": "رمز عبور اشتباه", + "Wrong password for: {{join}}": "رمز عبور اشتباه برای: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "رمز عبور اشتباه است یا رمزگشایی «{{name}}» ناموفق بود.", + "X Position": "موقعیت X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}، Y: {{pdfY}}", + "XML Files": "فایل‌های XML", + "XML to PDF": "XML به PDF", + "XMP Metadata": "فرادادهٔ XMP", + "XPS Files": "فایل‌های XPS", + "XPS to PDF": "XPS به PDF", + "Y Position": "موقعیت Y", + "Year must be between 1900 and 2100": "سال باید بین 1900 و 2100 باشد", + "Yellow": "زرد", + "Yellowish": "مایل به زرد", + "You cannot delete the last page of the document.": "نمی‌توانید آخرین صفحهٔ سند را حذف کنید.", + "Your PDF has been cropped and the download has started.": "PDF شما برش خورد و دانلود شروع شد.", + "Your PDF has been downloaded successfully.": "PDF شما با موفقیت دانلود شد.", + "Your PDF has been posterized.": "PDF شما پوستری شد.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "ردگیری‌های شما روی صفحه‌ها اعمال شد، اما این فایل رمزگذاری شده است و BentoPDF نمی‌تواند نسخه‌های متن ردگیری‌شده را از ویژگی‌ها، نشانک‌ها و پیوست‌های آن نیز حذف کند. برای پاک‌سازی کامل، یک نسخهٔ رمزگذاری‌نشده را ردگیری کنید و بعداً با «محافظت از PDF» رمز عبور اضافه کنید. به‌هرحال دانلود شود؟", + "Your workflow needs at least one input node and one output node to run.": "گردش کار شما برای اجرا دست‌کم به یک گرهٔ ورودی و یک گرهٔ خروجی نیاز دارد.", + "ZIP archive created successfully!": "آرشیو ZIP با موفقیت ساخته شد!", + "Zoom(%)": "بزرگ‌نمایی (٪)", + "e.g. dd/mm/yyyy HH:MM:ss": "مثلاً dd/mm/yyyy HH:MM:ss", + "form": "فرم", + "https://example.com": "https://example.com", + "signature found": "امضا پیدا شد", + "signatures found": "امضا پیدا شد", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} گره", + "{{count}} nodes": "{{count}} گره", + "{{fileSize}} • 1 page": "{{fileSize}} • ۱ صفحه", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} صفحه", + "{{length}} Files Need a Password": "{{length}} فایل به رمز عبور نیاز دارند", + "{{length}} PDF file(s) selected": "{{length}} فایل PDF انتخاب شد", + "{{length}} PDF files selected": "{{length}} فایل PDF انتخاب شد", + "{{length}} attachment(s) extracted successfully!": "{{length}} پیوست با موفقیت استخراج شد!", + "{{length}} file • {{totalPages}} total pages": "{{length}} فایل • مجموع {{totalPages}} صفحه", + "{{length}} file(s) attached successfully.": "{{length}} فایل با موفقیت پیوست شد.", + "{{length}} files • {{totalPages}} total pages": "{{length}} فایل • مجموع {{totalPages}} صفحه", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} این فایل رمز عبور داشت، بنابراین نسخهٔ فشرده رمز عبور ندارد. برای افزودن دوبارهٔ آن از «محافظت از PDF» استفاده کنید.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}، {{totalPageCount}} صفحه)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} امضای دیجیتال دارد، بنابراین بدون تغییر ماند. فشرده‌سازی آن امضا را از بین می‌برد. برای فشرده‌سازی به‌هرحال، «نادیده گرفتن محافظت محتوا» را در تنظیمات سفارشی روشن کنید؛ امضاهای آن حذف خواهد شد.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} یک PDF معتبر نیست و اضافه نشد.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} رمز عبور دارد. رمز عبور آن را روی کارت فایل وارد کنید، سپس دوباره فشرده کنید.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (ص{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}٪", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • بارگذاری تعداد صفحات ممکن نشد", + "{{size}} • Loading pages...": "{{size}} • در حال بارگذاری صفحات...", + "{{size}} • Loading...": "{{size}} • در حال بارگذاری...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} صفحه", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} صفحه", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} صفحه", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} صفحه", + "{{size}} • {{value}} pages": "{{size}} • {{value}} صفحه", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF با موفقیت رمزگشایی شد.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF با موفقیت خطی‌سازی شد.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} صفحه ← {{numSheets}} برگ خروجی", + "{{validCount}} valid": "{{validCount}} معتبر", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}٪", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: ۱ صفحه", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} صفحه" +} diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 5df1f22a..adb3a3e9 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Ouvrir le menu principal", "language": "Langue", "searchLanguage": "Rechercher une langue…", - "noLanguagesFound": "Aucune langue trouvée" + "noLanguagesFound": "Aucune langue trouvée", + "breadcrumb": "Fil d'Ariane" }, "donation": { "message": "Vous aimez BentoPDF ? Aidez-nous à le garder open source !", @@ -236,6 +237,10 @@ "aboutUs": "À propos", "faqLink": "FAQ", "contactUs": "Nous contacter", + "tools": "Outils", + "pdfConverter": "Convertisseur PDF", + "pdfSecurity": "Sécurité PDF", + "mergeSplit": "Fusionner et diviser des PDF", "legal": "Mentions légales", "termsAndConditions": "Conditions générales", "privacyPolicy": "Politique de confidentialité", diff --git a/public/locales/fr/tools.json b/public/locales/fr/tools.json index d0059ee0..94de1c3f 100644 --- a/public/locales/fr/tools.json +++ b/public/locales/fr/tools.json @@ -106,7 +106,7 @@ "tipRedoZ": "Rétablir (⇧⌘Z)", "tipFileDetails": "Détails du fichier", "tipEditExistingContent": "Modifier le contenu existant", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Ce que l'outil Modifier affecte — restreindre la portée sur les pages chargées", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Ce que l'outil Modifier affecte : restreindre la portée sur les pages chargées", "tipClickThePageToAddATextBox": "Cliquez sur la page pour ajouter une zone de texte", "tipSpellCheckLanguage": "Langue du correcteur orthographique", "tipFindAndReplace": "Rechercher et remplacer", @@ -518,11 +518,12 @@ "noFile": "Aucun fichier", "noFileExplanation": "Veuillez d'abord téléverser un fichier PDF.", "conversionSuccess": "PDF converti en TIFF avec succès !", - "conversionError": "Échec de la conversion du PDF en TIFF. Le fichier est peut-être corrompu." + "conversionError": "Échec de la conversion du PDF en TIFF. Le fichier est peut-être corrompu.", + "conversionOutOfMemory": "Le navigateur a manqué de mémoire pendant la conversion. Essayez une résolution (PPP) plus faible, ou décochez l'option TIFF multipage pour convertir les pages une par une." } }, "pdfToCbz": { - "name": "PDF en CBZ", + "name": "PDF vers CBZ", "subtitle": "Convertir un PDF en fichier CBZ (archive de bande dessinée) pour les lecteurs de comics.", "imageFormat": "Format d'image", "quality": "Qualité d'image", @@ -807,7 +808,7 @@ "subtitle": "Supprimer les métadonnées, annotations, scripts et autres éléments sensibles." }, "decryptPdf": { - "name": "Déverrouiller un PDF", + "name": "Déchiffrer un PDF", "subtitle": "Supprimer la protection par mot de passe." }, "flattenPdf": { @@ -1005,8 +1006,7 @@ "subtitle": "Extraire le texte des fichiers PDF et l’enregistrer en texte brut (.txt). Prend en charge plusieurs fichiers.", "noteLabel": "Note :", "noteText": "Cet outil ne fonctionne QUE avec des PDF créés numériquement. Pour les documents numérisés ou les PDF basés sur des images, utilisez plutôt notre outil OCR PDF.", - "convertButton": "Extraire le texte", - "note": "Cet outil fonctionne UNIQUEMENT avec des PDF créés numériquement. Pour les documents scannés ou les PDF basés sur des images, utilisez plutôt notre outil OCR PDF." + "convertButton": "Extraire le texte" }, "digitalSignPdf": { "name": "Signature numérique PDF", @@ -1204,7 +1204,7 @@ "workerError": "Erreur du worker : {{message}}", "alternateMergeWorkerError": "Erreur du worker de fusion alternée : {{message}}", "noPdfFilesUploaded": "Aucun fichier PDF téléversé dans le nœud d’entrée PDF", - "failedToLoadFile": "Impossible de charger « {{file}} » — le fichier est peut-être corrompu", + "failedToLoadFile": "Impossible de charger « {{file}} » : le fichier est peut-être corrompu", "noImagesUploaded": "Aucune image téléversée dans le nœud d’entrée Image", "noWordDocsUploaded": "Aucun document téléversé dans le nœud d’entrée Word", "noExcelUploaded": "Aucun tableur téléversé dans le nœud d’entrée Excel", @@ -1321,7 +1321,7 @@ "subtitle": "Supprimer la protection par mot de passe." }, "protectPdf": { - "name": "Chiffrer un PDF", + "name": "Protéger un PDF", "subtitle": "Protéger le PDF en ajoutant un mot de passe." } } diff --git a/public/locales/fr/ui.json b/public/locales/fr/ui.json new file mode 100644 index 00000000..dccf4b05 --- /dev/null +++ b/public/locales/fr/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(corrigé)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} Ko)", + "+ {{n}} more...": "+ {{n}} de plus...", + "- Error parsing XMP XML. Displaying raw. -": "- Erreur d’analyse du XML XMP. Affichage brut. -", + "- No Info Dictionary data found -": "- Aucune donnée de dictionnaire d’informations trouvée -", + "- No XMP metadata found -": "- Aucune métadonnée XMP trouvée -", + "- No interactive form fields found -": "- Aucun champ de formulaire interactif trouvé -", + "- No parseable XMP properties found -": "- Aucune propriété XMP analysable trouvée -", + "-- Select existing group --": "-- Choisir un groupe existant --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (très sensible)", + "0.5° (Default)": "0,5° (par défaut)", + "1.0° (Normal)": "1,0° (normal)", + "100 (Fast)": "100 (rapide)", + "150 (Default)": "150 (par défaut)", + "1x2 (Booklet)": "1x2 (livret)", + "2.0° (Less Sensitive)": "2,0° (moins sensible)", + "200 (Better)": "200 (mieux)", + "200 (Good)": "200 (bien)", + "2x2 (4-up)": "2x2 (4 par feuille)", + "2x4 (8-up)": "2x4 (8 par feuille)", + "300 (Best Quality)": "300 (meilleure qualité)", + "300 (Print)": "300 (impression)", + "4x4 (16-up)": "4x4 (16 par feuille)", + "600 (High Quality)": "600 (haute qualité)", + "72 (Screen)": "72 (écran)", + "90° Clockwise": "90° sens horaire", + "90° Counter-clockwise": "90° sens antihoraire", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Un champ nommé « {{fieldName}} » existe déjà. Renommez ce champ avec un nom unique avant de télécharger.", + "A new version of BentoPDF is available. Reload to update?": "Une nouvelle version de BentoPDF est disponible. Recharger pour mettre à jour ?", + "A single PDF file": "Un seul fichier PDF", + "A template with this name already exists.": "Un modèle portant ce nom existe déjà.", + "ASCII characters (letters, numbers, symbols)": "Caractères ASCII (lettres, chiffres, symboles)", + "Action": "Action", + "Add Blank Page": "Ajouter une page vierge", + "Add Bookmark": "Ajouter un signet", + "Add Child Bookmark": "Ajouter un signet enfant", + "Add Child Layer": "Ajouter un calque enfant", + "Add More Comics": "Ajouter d’autres bandes dessinées", + "Add More Documents": "Ajouter d’autres documents", + "Add More EPUB Files": "Ajouter d’autres fichiers EPUB", + "Add More Email Files": "Ajouter d’autres fichiers d’e-mail", + "Add More FB2 Files": "Ajouter d’autres fichiers FB2", + "Add More Files": "Ajouter d’autres fichiers", + "Add More Images": "Ajouter d’autres images", + "Add More JSON Files": "Ajouter d’autres fichiers JSON", + "Add More MOBI Files": "Ajouter d’autres fichiers MOBI", + "Add More Markdown Files": "Ajouter d’autres fichiers Markdown", + "Add More ODG Files": "Ajouter d’autres fichiers ODG", + "Add More PUB Files": "Ajouter d’autres fichiers PUB", + "Add More Pages Files": "Ajouter d’autres fichiers Pages", + "Add More Presentations": "Ajouter d’autres présentations", + "Add More SVG Files": "Ajouter d’autres fichiers SVG", + "Add More Spreadsheets": "Ajouter d’autres feuilles de calcul", + "Add More Text Files": "Ajouter d’autres fichiers texte", + "Add More Visio Files": "Ajouter d’autres fichiers Visio", + "Add More WPD Files": "Ajouter d’autres fichiers WPD", + "Add More WPS Files": "Ajouter d’autres fichiers WPS", + "Add More XML Files": "Ajouter d’autres fichiers XML", + "Add More XPS Files": "Ajouter d’autres fichiers XPS", + "Add a new layer to get started!": "Ajoutez un nouveau calque pour commencer !", + "Add a text box": "Ajouter une zone de texte", + "Add an RFC 3161 document timestamp": "Ajouter un horodatage de document RFC 3161", + "Add an image": "Ajouter une image", + "Add at least one node to run the workflow.": "Ajoutez au moins un nœud pour exécuter le workflow.", + "Add child": "Ajouter un enfant", + "Add child layer": "Ajouter un calque enfant", + "Add header and footer text": "Ajouter du texte d’en-tête et de pied de page", + "Add page numbers": "Ajouter des numéros de page", + "Add searchable text layer via OCR": "Ajouter une couche de texte recherchable via OCR", + "Add text watermark": "Ajouter un filigrane texte", + "Add/Edit/Extract Attachments": "Ajouter/modifier/extraire des pièces jointes", + "Added": "Ajouté", + "Added \"{{afterText}}\"": "« {{afterText}} » ajouté", + "Added image ({{width}}×{{height}})": "Image ajoutée ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} page blanche ajoutée avec succès !", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} pages blanches ajoutées avec succès !", + "Adding header & footer...": "Ajout de l’en-tête et du pied de page...", + "Adding page numbers...": "Ajout des numéros de page...", + "Adding watermark...": "Ajout du filigrane...", + "Adding {{insertCount}} blank page...": "Ajout de {{insertCount}} page blanche...", + "Adding {{insertCount}} blank pages...": "Ajout de {{insertCount}} pages blanches...", + "Adding {{name}} ({{n}}/{{length}})...": "Ajout de {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Ajuster les couleurs", + "Adjust brightness, contrast, and colors": "Ajustez la luminosité, le contraste et les couleurs", + "Advanced": "Avancé", + "Advanced Feature Required": "Fonctionnalité avancée requise", + "Advanced Settings": "Paramètres avancés", + "After Page": "Après la page", + "After Page...": "Après la page...", + "Align Objects": "Aligner les objets", + "Alignment": "Alignement", + "All": "Tout", + "All files repaired successfully!": "Tous les fichiers ont été réparés avec succès !", + "Alternate Merge": "Fusion alternée", + "Alternating and mixing pages...": "Alternance et mélange des pages...", + "Always resample to that resolution": "Toujours rééchantillonner à cette résolution", + "An error occurred during compression. Error: {{error}}": "Une erreur s’est produite pendant la compression. Erreur : {{error}}", + "An error occurred during conversion. Error: {{error}}": "Une erreur s’est produite pendant la conversion. Erreur : {{error}}", + "An error occurred during conversion. Error: {{message}}": "Une erreur s’est produite pendant la conversion. Erreur : {{message}}", + "An error occurred during cropping.": "Une erreur s’est produite pendant le recadrage.", + "An error occurred during extraction. Error: {{error}}": "Une erreur s’est produite pendant l’extraction. Erreur : {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Une erreur s’est produite pendant la rastérisation. Erreur : {{error}}", + "An error occurred during sanitization: {{msg}}": "Une erreur s’est produite pendant la sanitisation : {{msg}}", + "An error occurred while combining pages.": "Une erreur s’est produite lors de la combinaison des pages.", + "An error occurred while creating the N-Up PDF.": "Une erreur s’est produite lors de la création du PDF N-Up.", + "An error occurred while creating the booklet.": "Une erreur s’est produite lors de la création du livret.", + "An error occurred while dividing the PDF.": "Une erreur s’est produite lors de la division du PDF.", + "An error occurred while mixing the PDFs.": "Une erreur s’est produite lors du mélange des PDF.", + "An error occurred while standardizing pages.": "Une erreur s’est produite lors de l’uniformisation des pages.", + "An error occurred while trying to remove metadata.": "Une erreur s’est produite lors de la suppression des métadonnées.", + "An error occurred: {{error}}": "Une erreur s’est produite : {{error}}", + "An error occurred: {{error}}.": "Une erreur s’est produite : {{error}}.", + "An owner password is required when setting permissions": "Un mot de passe propriétaire est requis pour définir des permissions", + "An unexpected error occurred during the repair process.": "Une erreur inattendue s’est produite pendant la réparation.", + "An unexpected error occurred.": "Une erreur inattendue s’est produite.", + "Analyzing data structure...": "Analyse de la structure des données...", + "Analyzing full PDF metadata...": "Analyse complète des métadonnées du PDF...", + "Analyzing signatures...": "Analyse des signatures...", + "Angle": "Angle", + "Annotations removed successfully!": "Annotations supprimées avec succès !", + "Any text, URL, or data": "N’importe quel texte, URL ou donnée", + "Application": "Application", + "Apply a digital signature to PDF": "Appliquer une signature numérique au PDF", + "Apply and download": "Appliquer et télécharger", + "Apply redactions?": "Appliquer les caviardages ?", + "Apply scanner simulation effect": "Appliquer un effet de simulation de scanner", + "Applying Bates numbers...": "Application des numéros Bates...", + "Applying color adjustments...": "Application des ajustements de couleurs...", + "Applying crop...": "Application du recadrage...", + "Applying redactions...": "Application des caviardages...", + "Applying rotations...": "Application des rotations...", + "Applying scanner effect...": "Application de l’effet scanner...", + "Applying timestamp...": "Application de l’horodatage...", + "Applying {{replace}}...": "Application de {{replace}}...", + "Archive contains an oversized image entry.": "L’archive contient une image trop volumineuse.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "L’archive contient trop d’images (maximum {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "L’archive est trop volumineuse une fois décompressée.", + "Are you sure you want to reset? All your work will be lost.": "Voulez-vous vraiment réinitialiser ? Tout votre travail sera perdu.", + "Area (Coordinates)": "Zone (coordonnées)", + "Area ({{unit}}²)": "Surface ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman et Courier New correspondent aux équivalents intégrés. Appliqué uniquement lorsque c’est sûr.", + "Arrange multiple pages per sheet": "Disposer plusieurs pages par feuille", + "Arrange pages for booklet printing": "Organiser les pages pour l’impression en livret", + "Aspect Ratio": "Rapport d’aspect", + "At least one PDF document is required for export.": "Au moins un document PDF est requis pour l’export.", + "At least two valid PDFs are required.": "Au moins deux PDF valides sont requis.", + "Attaching files to PDF...": "Jointure des fichiers au PDF...", + "Attachments updated successfully!": "Pièces jointes mises à jour avec succès !", + "Author": "Auteur", + "Auto (Keep Original)": "Auto (conserver l’original)", + "Back": "Verso", + "Back to Home": "Retour à l’accueil", + "Background Color": "Couleur d’arrière-plan", + "Background color changed successfully!": "Couleur d’arrière-plan modifiée avec succès !", + "Barcode": "Code-barres", + "Barcode Format": "Format du code-barres", + "Barcode Value": "Valeur du code-barres", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Numéros Bates appliqués avec succès ! ({{batesStart}} à {{n}})", + "Beginning": "Début", + "Binarize": "Binariser", + "Blank Position": "Position de la page blanche", + "Blue": "Bleu", + "Blur": "Flou", + "Bold": "Gras", + "Bold & Italic": "Gras et italique", + "Booklet": "Livret", + "Booklet created with {{numSheets}} sheets!": "Livret créé avec {{numSheets}} feuilles !", + "Bookmarks imported from JSON!": "Signets importés depuis le JSON !", + "Bookmarks page": "Page des signets", + "Border": "Bordure", + "Border Color": "Couleur de bordure", + "Bottom": "Bas", + "Bottom Center": "Bas centre", + "Bottom Left": "Bas gauche", + "Bottom Right": "Bas droite", + "Bottom edge in points": "Bord inférieur en points", + "Brightness": "Luminosité", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli et la rastérisation ont été ignorés pour conserver le format PDF/A.", + "Brotli compression (PDF 2.0)": "Compression Brotli (PDF 2.0)", + "Browser Note:": "Remarque sur le navigateur :", + "Building new PDF...": "Création du nouveau PDF...", + "Building page pairing model...": "Construction du modèle d’appariement des pages...", + "Button": "Bouton", + "ByteRange does not start at the beginning of the file": "ByteRange ne commence pas au début du fichier", + "ByteRange out of bounds": "ByteRange hors limites", + "CBZ to PDF": "CBZ en PDF", + "CSV Loaded": "CSV chargé", + "CSV file is empty": "Le fichier CSV est vide", + "Cancel": "Annuler", + "Cannot Delete": "Suppression impossible", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Impossible d’accéder aux contrôles du visualiseur. Utilisez le bouton Télécharger dans la barre d’outils du visualiseur PDF ci-dessus.", + "Cannot delete all pages": "Impossible de supprimer toutes les pages", + "Cannot delete all pages.": "Impossible de supprimer toutes les pages.", + "Canvas context failed": "Échec du contexte canvas", + "Canvas context unavailable": "Contexte canvas indisponible", + "Canvas toBlob conversion failed.": "Échec de la conversion canvas toBlob.", + "Canvas toBlob failed": "Échec de canvas toBlob", + "Center": "Centre", + "Certificate (.pfx, .p12, .pem)": "Certificat (.pfx, .p12, .pem)", + "Certificate Expired": "Certificat expiré", + "Certificate Password": "Mot de passe du certificat", + "Certificate unlocked": "Certificat déverrouillé", + "Change Certificate": "Changer de certificat", + "Change background color": "Changer la couleur d’arrière-plan", + "Changing background color...": "Changement de la couleur d’arrière-plan...", + "Changing text color...": "Changement de la couleur du texte...", + "Character": "Caractère", + "Checked State": "État coché", + "Choose a valid page range.": "Choisissez une plage de pages valide.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Choisissez l’une des langues incluses ou reconstruisez le bundle hors ligne en ajoutant la langue manquante à --ocr-languages.", + "Cleanup": "Nettoyage", + "Click on PDF to Pick Location": "Cliquez sur le PDF pour choisir l’emplacement", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Cliquez sur le bouton ci-dessus, puis cliquez sur le PDF à l’endroit où le signet doit mener", + "Click to Upload Image": "Cliquer pour téléverser une image", + "Clicking this field in the PDF will open a file picker to upload an image.": "Cliquer sur ce champ dans le PDF ouvrira un sélecteur de fichiers pour téléverser une image.", + "Clip invisible parts of images": "Rogner les parties invisibles des images", + "Close": "Fermer", + "Close (Esc)": "Fermer (Échap)", + "Close panel": "Fermer le panneau", + "Closes tab": "Ferme l’onglet", + "Closes window": "Ferme la fenêtre", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (signets et métadonnées)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF n’est pas configuré. Configurez-le dans les paramètres WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF a produit un fichier déchiffré vide.", + "CoherentPDF: not configured.": "CoherentPDF : non configuré.", + "Color": "Couleur", + "Color adjustments applied successfully!": "Ajustements de couleurs appliqués avec succès !", + "Colors inverted successfully!": "Couleurs inversées avec succès !", + "Cols": "Col.", + "Combine multiple PDFs into one": "Combiner plusieurs PDF en un seul", + "Combine to Single Page": "Combiner en une seule page", + "Combining pages...": "Combinaison des pages...", + "Comic Archives": "Archives de bandes dessinées", + "Comments and markup become part of the page. Form fields and links keep working.": "Les commentaires et les annotations font partie de la page. Les champs de formulaire et les liens continuent de fonctionner.", + "Complete": "Terminé", + "Complete!": "Terminé !", + "Compress": "Compresser", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF compressé(s). Taille totale réduite de {{totalOriginalSize}} à {{totalCompressedSize}} ({{value}} % économisés).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF compressé(s). Taille totale : {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Compression de plusieurs PDF...", + "Compressing to {{size}}...": "Compression à {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Compression de {{n}}/{{length}} : {{name}}...", + "Compressing...": "Compression...", + "Compression Complete": "Compression terminée", + "Compression Finished": "Compression terminée", + "Compression Level": "Niveau de compression", + "Configure": "Configurer", + "Confirm": "Confirmer", + "Confirm Action": "Confirmer l’action", + "Conformance": "Conformité", + "Connected": "Connecté", + "Contact Info": "Coordonnées", + "Content": "Contenu", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Le hachage du contenu ne correspond pas à l’attribut messageDigest : le PDF a été modifié après la signature", + "Contrast": "Contraste", + "Conversion Complete": "Conversion terminée", + "Conversion Error": "Erreur de conversion", + "Conversion engine ready!": "Moteur de conversion prêt !", + "Conversion failed: could not create PDF/A definition": "Échec de la conversion : impossible de créer la définition PDF/A", + "Convert Apple Pages documents to PDF": "Convertir des documents Apple Pages en PDF", + "Convert EPUB ebooks to PDF": "Convertir des livres numériques EPUB en PDF", + "Convert Excel spreadsheets to PDF": "Convertir des feuilles de calcul Excel en PDF", + "Convert FB2 e-books to PDF": "Convertir des livres numériques FB2 en PDF", + "Convert JSON files to PDF": "Convertir des fichiers JSON en PDF", + "Convert MOBI e-books to PDF": "Convertir des livres numériques MOBI en PDF", + "Convert Markdown files to PDF": "Convertir des fichiers Markdown en PDF", + "Convert Microsoft Publisher to PDF": "Convertir Microsoft Publisher en PDF", + "Convert OpenDocument Graphics to PDF": "Convertir des OpenDocument Graphics en PDF", + "Convert PDF pages to SVG": "Convertir des pages PDF en SVG", + "Convert PDF pages to images (ZIP)": "Convertir des pages PDF en images (ZIP)", + "Convert PDF tables to CSV": "Convertir des tableaux PDF en CSV", + "Convert PDF tables to Excel": "Convertir des tableaux PDF en Excel", + "Convert PDF to Markdown text": "Convertir un PDF en texte Markdown", + "Convert PDF to PDF/A for archiving": "Convertir un PDF en PDF/A pour l’archivage", + "Convert PDF to Word document": "Convertir un PDF en document Word", + "Convert PowerPoint presentations to PDF": "Convertir des présentations PowerPoint en PDF", + "Convert SVG files to PDF": "Convertir des fichiers SVG en PDF", + "Convert To Grayscale": "Convertir en niveaux de gris", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Convertir des diagrammes Visio (VSD/VSDX) en PDF", + "Convert WPS Office documents to PDF": "Convertir des documents WPS Office en PDF", + "Convert Word documents to PDF": "Convertir des documents Word en PDF", + "Convert WordPerfect documents to PDF": "Convertir des documents WordPerfect en PDF", + "Convert XML documents to PDF": "Convertir des documents XML en PDF", + "Convert XPS/OXPS documents to PDF": "Convertir des documents XPS/OXPS en PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Convertir des archives de bandes dessinées (CBZ/CBR) en PDF", + "Convert email files (.eml, .msg) to PDF": "Convertir des e-mails (.eml, .msg) en PDF", + "Convert fonts to vector outlines": "Convertir les polices en contours vectoriels", + "Convert plain text to PDF": "Convertir du texte brut en PDF", + "Convert to grayscale": "Convertir en niveaux de gris", + "Convert to greyscale": "Convertir en niveaux de gris", + "Convert to image-based PDF": "Convertir en PDF basé sur des images", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} fichiers ({{totalPages}} pages) convertis en SVG !", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} pages converties en SVG !", + "Converter not initialized": "Convertisseur non initialisé", + "Converting BMP to PDF...": "Conversion de BMP en PDF...", + "Converting HEIC to PDF...": "Conversion de HEIC en PDF...", + "Converting TIFF to PDF...": "Conversion de TIFF en PDF...", + "Converting emails...": "Conversion des e-mails...", + "Converting files...": "Conversion des fichiers...", + "Converting fonts to outlines...": "Conversion des polices en contours...", + "Converting images to PDF...": "Conversion des images en PDF...", + "Converting multiple PDFs to PDF/A...": "Conversion de plusieurs PDF en PDF/A...", + "Converting multiple RTF files to PDF...": "Conversion de plusieurs fichiers RTF en PDF...", + "Converting multiple files...": "Conversion de plusieurs fichiers...", + "Converting page {{n}} of {{pageCount}}...": "Conversion de la page {{n}} sur {{pageCount}}...", + "Converting to Markdown...": "Conversion en Markdown...", + "Converting to SVG...": "Conversion en SVG...", + "Converting to greyscale...": "Conversion en niveaux de gris...", + "Converting to {{level}}...": "Conversion en {{level}}...", + "Converting {{name}}...": "Conversion de {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Conversion de {{n}}/{{length}} : {{name}}...", + "Converting...": "Conversion...", + "Copied": "Copié", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Impossible d’accéder à l’exportateur de PDF tamponné. Utilisez à la place le bouton Exporter → PDF de la barre d’outils du visualiseur.", + "Could not add blank page.": "Impossible d’ajouter une page blanche.", + "Could not add blank pages.": "Impossible d’ajouter des pages blanches.", + "Could not add header or footer.": "Impossible d’ajouter l’en-tête ou le pied de page.", + "Could not add page numbers.": "Impossible d’ajouter les numéros de page.", + "Could not add the watermark.": "Impossible d’ajouter le filigrane.", + "Could not apply rotations.": "Impossible d’appliquer les rotations.", + "Could not change text color.": "Impossible de changer la couleur du texte.", + "Could not change the background color.": "Impossible de changer la couleur d’arrière-plan.", + "Could not create ZIP archive.": "Impossible de créer l’archive ZIP.", + "Could not create canvas context.": "Impossible de créer le contexte canvas.", + "Could not create comparison canvas context.": "Impossible de créer le contexte canvas de comparaison.", + "Could not create offscreen comparison canvas.": "Impossible de créer le canvas de comparaison hors écran.", + "Could not create visual diff context.": "Impossible de créer le contexte de différence visuelle.", + "Could not create visual diff overlay context.": "Impossible de créer le contexte de superposition de différence visuelle.", + "Could not detect blank pages.": "Impossible de détecter les pages blanches.", + "Could not display the page.": "Impossible d’afficher la page.", + "Could not export comparison PDF.": "Impossible d’exporter le PDF de comparaison.", + "Could not export the signed PDF. Please try again.": "Impossible d’exporter le PDF signé. Veuillez réessayer.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Impossible d’exporter le PDF tamponné. Utilisez à la place le bouton Exporter → PDF de la barre d’outils du visualiseur.", + "Could not extract signer public key": "Impossible d’extraire la clé publique du signataire", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Impossible de trouver {{testFile}} à l’URL indiquée (HTTP {{status}}). Vérifiez que le fichier existe.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Impossible d’analyser entièrement le PDF. Il est peut-être corrompu ou a une structure inhabituelle.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Impossible de générer un aperçu. Le fichier est peut-être corrompu ou contient des fonctionnalités non prises en charge. Erreur : {{message}}", + "Could not get canvas context": "Impossible d’obtenir le contexte canvas", + "Could not invert PDF colors.": "Impossible d’inverser les couleurs du PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Impossible de charger le PDF. Il est peut-être corrompu ou protégé par mot de passe.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Impossible de charger le PDF. Le fichier est peut-être invalide, corrompu ou protégé par mot de passe.", + "Could not load the PDF engine. Please refresh the page and try again.": "Impossible de charger le moteur PDF. Actualisez la page et réessayez.", + "Could not parse signer info": "Impossible d’analyser les informations du signataire", + "Could not posterize the PDF.": "Impossible de posteriser le PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Impossible de traiter « {{name}} ». Le fichier est peut-être corrompu.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Impossible de réduire davantage la taille du fichier. Original : {{originalSize}}, nouveau : {{compressedSize}}.", + "Could not remove annotations.": "Impossible de supprimer les annotations.", + "Could not remove blank pages.": "Impossible de supprimer les pages blanches.", + "Could not remove leftover data from the PDF.": "Impossible de supprimer les données résiduelles du PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Impossible de supprimer le texte caviardé des données du document, le fichier n’a donc pas été téléchargé.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Impossible d’inverser les pages du PDF. Vérifiez que vos fichiers sont des PDF valides.", + "Could not update metadata. Please check that date formats are correct.": "Impossible de mettre à jour les métadonnées. Vérifiez que les formats de date sont corrects.", + "Count": "Nombre", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Créé le", + "Creating Booklet...": "Création du livret...", + "Creating Excel file...": "Création du fichier Excel...", + "Creating N-Up PDF...": "Création du PDF N-Up...", + "Creating PDF from JPGs...": "Création du PDF à partir des JPG...", + "Creating PDF from SVG files...": "Création du PDF à partir des fichiers SVG...", + "Creating PDF...": "Création du PDF...", + "Creating ZIP archive...": "Création de l’archive ZIP...", + "Creating ZIP file...": "Création du fichier ZIP...", + "Creating ZIP...": "Création du ZIP...", + "Creating table...": "Création du tableau...", + "Creator": "Créateur", + "Crop": "Recadrer", + "Crop complete! Your download has started.": "Recadrage terminé ! Votre téléchargement a démarré.", + "Cryptographic verification failed": "Échec de la vérification cryptographique", + "Custom": "Personnalisé", + "Custom Format": "Format personnalisé", + "Custom Height": "Hauteur personnalisée", + "Custom Units": "Unités personnalisées", + "Custom Width": "Largeur personnalisée", + "Custom Zoom": "Zoom personnalisé", + "Custom...": "Personnalisé...", + "DataMatrix": "DataMatrix", + "Date Format": "Format de date", + "Decrease size": "Réduire la taille", + "Decrypt": "Déchiffrer", + "Decrypting PDF...": "Déchiffrement du PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Déchiffrement de {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Déchiffrement de {{n}} sur {{length}} : {{name}}", + "Decrypting...": "Déchiffrement...", + "Decryption Failed": "Échec du déchiffrement", + "Delete": "Supprimer", + "Delete \"{{title}}\"?": "Supprimer « {{title}} » ?", + "Delete Field": "Supprimer le champ", + "Delete Page": "Supprimer la page", + "Delete Pages": "Supprimer des pages", + "Delete all {{length}} bookmark(s) ? ": "Supprimer les {{length}} signet(s) ? ", + "Delete layer": "Supprimer le calque", + "Delete {{size}} bookmark(s) ? ": "Supprimer {{size}} signet(s) ? ", + "Deleted": "Supprimé", + "Deleted {{size}} page(s) successfully!": "{{size}} page(s) supprimée(s) avec succès !", + "Deleting pages...": "Suppression des pages...", + "Description": "Description", + "Description for screen readers": "Description pour les lecteurs d’écran", + "Deselect All": "Tout désélectionner", + "Deskew": "Redresser", + "Deskew PDF": "Redresser un PDF", + "Deskewed {{length}} file(s). {{value}}": "{{length}} fichier(s) redressé(s). {{value}}", + "Deskewing {{name}}...": "Redressement de {{name}}...", + "Destination": "Destination", + "Detecting blank pages...": "Détection des pages blanches...", + "Digest Algorithm:": "Algorithme de hachage :", + "Digital Sign": "Signature numérique", + "Direction": "Direction", + "Divide Pages": "Diviser les pages", + "Divide into boxes (0 to disable)": "Diviser en cases (0 pour désactiver)", + "Document Properties": "Propriétés du document", + "Document Type": "Type de document", + "Document properties": "Propriétés du document", + "Document-level attachment": "Pièce jointe au niveau du document", + "Done: back to tools": "Terminé, retour aux outils", + "Download": "Télécharger", + "Download Edited PDF": "Télécharger le PDF modifié", + "Download anyway": "Télécharger quand même", + "Download as PDF or ZIP automatically": "Télécharger automatiquement en PDF ou ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} fichiers PDF téléchargés dans une archive ZIP.", + "Downloads started for all files.": "Téléchargements lancés pour tous les fichiers.", + "Dpi": "Ppp", + "Drops tagging, which screen readers rely on.": "Supprime le balisage, sur lequel s’appuient les lecteurs d’écran.", + "Duplicate Field Name": "Nom de champ en double", + "Duplicate Field Names": "Noms de champs en double", + "Duplicate Page": "Dupliquer la page", + "Duplicate Page Numbers": "Numéros de page en double", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "La signature ECDSA ne correspond pas à la clé publique du signataire", + "EPUB Files": "Fichiers EPUB", + "EPUB to PDF": "EPUB en PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ en PDF", + "Edit": "Modifier", + "Edit All": "Tout modifier", + "Edit Bookmark": "Modifier le signet", + "Edit Bookmarks": "Modifier les signets", + "Edit Images": "Modifier les images", + "Edit Metadata": "Modifier les métadonnées", + "Edit PDF metadata": "Modifier les métadonnées du PDF", + "Edit Scope": "Portée de la modification", + "Edit Shapes": "Modifier les formes", + "Edit Text": "Modifier le texte", + "Edit tool": "Outil de modification", + "Edit {{scopes}}": "Modifier {{scopes}}", + "Email Files": "Fichiers d’e-mail", + "Email to PDF": "E-mail en PDF", + "Embedding files into PDF...": "Intégration des fichiers dans le PDF...", + "Empty signature bytes": "Octets de signature vides", + "Encrypt": "Chiffrer", + "Encrypt PDF with password": "Chiffrer le PDF avec un mot de passe", + "Encrypted file": "Fichier chiffré", + "Encrypting PDF with 256-bit AES...": "Chiffrement du PDF en AES 256 bits...", + "Encryption Failed": "Échec du chiffrement", + "Encryption resulted in an empty file.": "Le chiffrement a produit un fichier vide.", + "End": "Fin", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Saisissez 0 pour insérer au début, ou {{pageCount}} pour insérer à la fin.", + "Enter bookmark title": "Saisissez le titre du signet", + "Enter name for child layer under \"{{Layer}}\":": "Saisissez le nom du calque enfant sous « {{Layer}} » :", + "Enter password": "Saisissez le mot de passe", + "Enter password...": "Saisissez le mot de passe...", + "Enter passwords for each encrypted file": "Saisissez les mots de passe de chaque fichier chiffré", + "Error": "Erreur", + "Error during execution": "Erreur pendant l’exécution", + "Error generating PDF: {{error}}": "Erreur lors de la génération du PDF : {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Erreur lors du chargement du fichier PDF. Réessayez avec un PDF valide.", + "Error reading files: {{error}}": "Erreur lors de la lecture des fichiers : {{error}}", + "Error saving PDF. Check console for details.": "Erreur lors de l’enregistrement du PDF. Consultez la console pour plus de détails.", + "Error: {{error}}": "Erreur : {{error}}", + "Exactly 11 or 12 digits": "Exactement 11 ou 12 chiffres", + "Exactly 12 or 13 digits": "Exactement 12 ou 13 chiffres", + "Example of current format:": "Exemple du format actuel :", + "Excel to PDF": "Excel en PDF", + "Existing Radio Groups": "Groupes de boutons radio existants", + "Export Error": "Erreur d’export", + "Export Value": "Valeur d’export", + "Export failed": "Échec de l’export", + "External processing module needed": "Module de traitement externe requis", + "Extract Images": "Extraire les images", + "Extract Pages": "Extraire des pages", + "Extract Tables": "Extraire les tableaux", + "Extract a range of pages": "Extraire une plage de pages", + "Extract all images from PDF": "Extraire toutes les images du PDF", + "Extract pages as separate PDFs": "Extraire les pages en PDF séparés", + "Extract text from PDF": "Extraire le texte du PDF", + "Extracted 1 table successfully!": "1 tableau extrait avec succès !", + "Extracted text from {{length}} PDF files!": "Texte extrait de {{length}} fichiers PDF !", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF extrait(s), {{failed}} échec(s).", + "Extracted {{length}} page(s) successfully!": "{{length}} page(s) extraite(s) avec succès !", + "Extracted {{length}} table(s) to Excel!": "{{length}} tableau(x) extrait(s) vers Excel !", + "Extracted {{length}} tables successfully!": "{{length}} tableaux extraits avec succès !", + "Extracting attachments from {{length}} file(s)...": "Extraction des pièces jointes de {{length}} fichier(s)...", + "Extracting images from {{name}}...": "Extraction des images de {{name}}...", + "Extracting pages...": "Extraction des pages...", + "Extracting tables...": "Extraction des tableaux...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Extraction du texte du fichier {{n}}/{{length}} : {{name}}...", + "Extracting text from multiple files...": "Extraction du texte de plusieurs fichiers...", + "Extracting text from {{name}}...": "Extraction du texte de {{name}}...", + "Extracting text...": "Extraction du texte...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Extraction de {{name}} pour l’IA ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Extraction de {{name}} pour l’IA...", + "Extracting...": "Extraction...", + "Extraction Complete": "Extraction terminée", + "Extraction Error": "Erreur d’extraction", + "Extraction Partial": "Extraction partielle", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extraction terminée ! {{length}} pièce(s) jointe(s) dans le fichier zip ({{totalSize}}). Le téléchargement a démarré.", + "FB2 Files": "Fichiers FB2", + "FB2 to PDF": "FB2 en PDF", + "Failed": "Échec", + "Failed to acquire 2D canvas context": "Impossible d’obtenir le contexte canvas 2D", + "Failed to add child layer": "Impossible d’ajouter le calque enfant", + "Failed to apply Bates numbers.": "Impossible d’appliquer les numéros Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "Impossible d’appliquer les ajustements de couleurs. Le fichier est peut-être corrompu.", + "Failed to apply redactions.": "Impossible d’appliquer les caviardages.", + "Failed to apply scanner effect. The file might be corrupted.": "Impossible d’appliquer l’effet scanner. Le fichier est peut-être corrompu.", + "Failed to attach files: {{error}}": "Impossible de joindre les fichiers : {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Impossible de convertir BMP en PDF. L’un des fichiers est peut-être invalide.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Impossible de convertir HEIC en PDF. L’un des fichiers est peut-être invalide.", + "Failed to convert PDF to CSV. {{message}}": "Impossible de convertir le PDF en CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Impossible de convertir le PDF en Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Impossible de convertir le PDF en SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Impossible de convertir le PDF en niveaux de gris. Le fichier est peut-être corrompu.", + "Failed to convert PDF. It may be image-based or corrupted.": "Impossible de convertir le PDF. Il est peut-être basé sur des images ou corrompu.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Impossible de convertir TIFF en PDF. L’un des fichiers est peut-être invalide.", + "Failed to convert images to PDF.": "Impossible de convertir les images en PDF.", + "Failed to convert text to PDF. {{error}}": "Impossible de convertir le texte en PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Impossible de convertir {{filename}} en PNG", + "Failed to copy metadata to clipboard.": "Impossible de copier les métadonnées dans le presse-papiers.", + "Failed to create PDF.": "Impossible de créer le PDF.", + "Failed to create PNG blob": "Impossible de créer le blob PNG", + "Failed to create canvas context": "Impossible de créer le contexte canvas", + "Failed to create split PDFs.": "Impossible de créer les PDF divisés.", + "Failed to decode image: {{name}}": "Impossible de décoder l’image : {{name}}", + "Failed to decrypt private key": "Impossible de déchiffrer la clé privée", + "Failed to decrypt. Try the Decrypt tool instead.": "Échec du déchiffrement. Essayez plutôt l’outil Déchiffrer.", + "Failed to delete layer": "Impossible de supprimer le calque", + "Failed to delete pages.": "Impossible de supprimer les pages.", + "Failed to deskew PDF: {{error}}": "Impossible de redresser le PDF : {{error}}", + "Failed to download the edited PDF.": "Impossible de télécharger le PDF modifié.", + "Failed to edit attachments.": "Impossible de modifier les pièces jointes.", + "Failed to extract certificate from PFX file": "Impossible d’extraire le certificat du fichier PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Impossible d’extraire les pages (code de sortie qpdf {{exitCode}}).", + "Failed to extract pages.": "Impossible d’extraire les pages.", + "Failed to extract tables. {{message}}": "Impossible d’extraire les tableaux. {{message}}", + "Failed to extract text from PDF.": "Impossible d’extraire le texte du PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Impossible de récupérer le profil ICC depuis {{iccUrl}} : HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Impossible de récupérer le fichier de police : {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Impossible de récupérer gs.js : HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Impossible de récupérer {{url}} : HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Impossible d’obtenir le contexte 2D pour la page {{pageNumber}}", + "Failed to get canvas context": "Impossible d’obtenir le contexte canvas", + "Failed to insert PDF. The file may be corrupted.": "Impossible d’insérer le PDF. Le fichier est peut-être corrompu.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Impossible de charger Ghostscript depuis {{normalizedUrl}} : {{msg}}", + "Failed to load PDF file.": "Impossible de charger le fichier PDF.", + "Failed to load PDF for cropping.": "Impossible de charger le PDF pour le recadrage.", + "Failed to load PDF for preview.": "Impossible de charger le PDF pour l’aperçu.", + "Failed to load PDF form viewer.": "Impossible de charger le visualiseur de formulaires PDF.", + "Failed to load PDF layers": "Impossible de charger les calques du PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Impossible de charger PyMuPDF depuis le CDN : {{msg}}", + "Failed to load SVG image": "Impossible de charger l’image SVG", + "Failed to load WebP image": "Impossible de charger l’image WebP", + "Failed to load attachments from PDF.": "Impossible de charger les pièces jointes du PDF.", + "Failed to load files: {{error}}": "Impossible de charger les fichiers : {{error}}", + "Failed to load image.": "Impossible de charger l’image.", + "Failed to load image: {{filename}}": "Impossible de charger l’image : {{filename}}", + "Failed to load one or more PDF files.": "Impossible de charger un ou plusieurs fichiers PDF.", + "Failed to load script: {{url}}": "Impossible de charger le script : {{url}}", + "Failed to load template.": "Impossible de charger le modèle.", + "Failed to load the PDF Editor.": "Impossible de charger l’éditeur PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Impossible de charger le processeur d’images. Vérifiez que votre navigateur prend en charge SharedArrayBuffer (nécessite HTTPS ou localhost).", + "Failed to parse CSV: {{error}}": "Impossible d’analyser le CSV : {{error}}", + "Failed to parse signature": "Impossible d’analyser la signature", + "Failed to parse the certificate file.": "Impossible d’analyser le fichier de certificat.", + "Failed to process HEIC file: {{name}}": "Impossible de traiter le fichier HEIC : {{name}}", + "Failed to process WebP file: {{name}}": "Impossible de traiter le fichier WebP : {{name}}", + "Failed to read file.": "Impossible de lire le fichier.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Impossible de supprimer les restrictions. Le PDF peut nécessiter le bon mot de passe propriétaire.", + "Failed to render page": "Impossible d’afficher la page", + "Failed to render page previews": "Impossible d’afficher les aperçus des pages", + "Failed to render page previews.": "Impossible d’afficher les aperçus des pages.", + "Failed to render page.": "Impossible d’afficher la page.", + "Failed to save changes.": "Impossible d’enregistrer les modifications.", + "Failed to save the new PDF. Check console for details.": "Impossible d’enregistrer le nouveau PDF. Consultez la console pour plus de détails.", + "Failed to split PDF. Please check your selection.": "Impossible de diviser le PDF. Vérifiez votre sélection.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Impossible d’horodater le PDF : {{message}}\n\nEssayez un autre serveur TSA ou vérifiez votre connexion Internet.", + "Failed to toggle layer visibility": "Impossible de basculer la visibilité du calque", + "Failed to validate signatures. The file may be corrupted.": "Impossible de valider les signatures. Le fichier est peut-être corrompu.", + "Features enabled by this module:": "Fonctionnalités activées par ce module :", + "Field Name": "Nom du champ", + "Field Name (Group Name)": "Nom du champ (Nom du groupe)", + "Field Name Conflict": "Conflit de nom de champ", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Le nom de champ « {{newName}} » existe déjà dans ce {{value}}. Essayez d’utiliser un nom unique.", + "Field name cannot be empty": "Le nom du champ ne peut pas être vide", + "File": "Fichier", + "File Size": "Taille du fichier", + "File exists but could not be read. Check CORS configuration.": "Le fichier existe mais n’a pas pu être lu. Vérifiez la configuration CORS.", + "File list not found": "Liste de fichiers introuvable", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Taille du fichier réduite de {{originalSize}} à {{compressedSize}} ({{percent}} % économisés).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Fichier {{n}}/{{length}} : page {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Fichier {{n}}/{{length}} : {{message}}", + "Filename": "Nom du fichier", + "Files that failed: {{errorCount}}.": "Fichiers en échec : {{errorCount}}.", + "Fill (cover full target page)": "Remplir (couvrir toute la page cible)", + "Fill Color": "Couleur de remplissage", + "Finalizing PDF...": "Finalisation du PDF...", + "Find & replace": "Rechercher et remplacer", + "Finds the best quality under this size. 0 means no target.": "Trouve la meilleure qualité sous cette taille. 0 signifie aucune cible.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox et Chrome peuvent afficher leur sélecteur de date natif pendant la sélection. Le bon format sera appliqué une fois la saisie de la date terminée.", + "First Indent": "Retrait de première ligne", + "Fit (keep full page visible)": "Ajuster (garder la page entière visible)", + "Fit Page": "Ajuster à la page", + "Fix Page Size": "Uniformiser la taille des pages", + "Flatten": "Aplatir", + "Flatten Forms": "Aplatir les formulaires", + "Flatten annotations": "Aplatir les annotations", + "Flatten form fields": "Aplatir les champs de formulaire", + "Flatten forms and annotations": "Aplatir les formulaires et les annotations", + "Flatten links": "Aplatir les liens", + "Flattening PDF...": "Aplatissement du PDF...", + "Flattening and saving PDF...": "Aplatissement et enregistrement du PDF...", + "Flattening multiple PDFs...": "Aplatissement de plusieurs PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Aplatissement de la page {{i}} sur {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Aplatissement de {{n}}/{{length}} : {{name}}...", + "Focuses address bar": "Met le focus sur la barre d’adresse", + "Font": "Police", + "Font Color": "Couleur de police", + "Font Family": "Famille de police", + "Font Size": "Taille de police", + "Font size: {{bSize}} → {{aSize}}": "Taille de police : {{bSize}} → {{aSize}}", + "Font to Outline": "Police en contours", + "Font: {{bFont}} → {{aFont}}": "Police : {{bFont}} → {{aFont}}", + "Fonts": "Polices", + "Footer Center": "Pied de page centre", + "Footer Left": "Pied de page gauche", + "Footer Right": "Pied de page droite", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Pour les PDF composés uniquement d’images, comme les numérisations. Ignoré lorsque le document contient du texte sélectionnable, sauf si Outrepasser la protection du contenu est activé.", + "Form fields stop being fillable.": "Les champs de formulaire ne sont plus remplissables.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}} page(s) blanche(s) trouvée(s). Cliquez sur une page pour la désélectionner.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "{{length}} signets existants trouvés. Remplacer les signets actuels ?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length}} image(s) trouvée(s) dans {{length2}} PDF.", + "Front": "Recto", + "Full Coverage": "Couverture complète", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Générer une table des matières à partir des signets", + "Generating High-Quality PDF...": "Génération du PDF haute qualité...", + "Generating PDF...": "Génération du PDF...", + "Generating ZIP file...": "Génération du fichier ZIP...", + "Generating formatted content...": "Génération du contenu mis en forme...", + "Generating preview...": "Génération de l’aperçu...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (conversion PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Échec de la conversion RVB Ghostscript avec le code de sortie {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Échec de la conversion Ghostscript avec le code de sortie {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript n’a produit aucun fichier de sortie", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript n’est pas configuré. Configurez-le dans les paramètres avancés.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript n’est pas configuré. Configurez-le dans les paramètres WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript n’est pas configuré. PyMuPDF nécessite Ghostscript pour certaines opérations. Configurez les deux dans les paramètres avancés.", + "Ghostscript threw an exception: {{e}}": "Ghostscript a levé une exception : {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Le wrapper Ghostscript n’expose pas l’interface attendue. Attendu : loadGS() ou la classe GhostscriptWASM.", + "Go": "OK", + "Go to page": "Aller à la page", + "Grayscale": "Niveaux de gris", + "Green": "Vert", + "Greyscale": "Niveaux de gris", + "Grid Mode": "Mode grille", + "Group Name (Must be same for group)": "Nom du groupe (identique pour tout le groupe)", + "H-Scale %": "Échelle H %", + "Hanging Indent": "Retrait suspendu", + "Hard reloads page": "Recharge la page sans cache", + "Header & Footer": "En-tête et pied de page", + "Header & Footer added successfully!": "En-tête et pied de page ajoutés avec succès !", + "Header Center": "En-tête centre", + "Header Left": "En-tête gauche", + "Header Right": "En-tête droite", + "Height ({{unit}})": "Hauteur ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Masquer", + "Hide Border": "Masquer la bordure", + "Hide password": "Masquer le mot de passe", + "Hides window": "Masque la fenêtre", + "High (288 DPI)": "Élevée (288 ppp)", + "High (Smallest Files)": "Élevée (fichiers les plus petits)", + "Horizontal": "Horizontal", + "Hue Shift": "Décalage de teinte", + "Image Format": "Format d’image", + "Image Input": "Entrée d’image", + "Image quality": "Qualité d’image", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Image redimensionnée de {{width}}×{{height}} à {{width2}}×{{height2}}", + "Images": "Images", + "Images above this are resampled down. None leaves resolution alone.": "Les images au-dessus de cette valeur sont rééchantillonnées à la baisse. Aucune laisse la résolution inchangée.", + "Imported {{length}} bookmarks!": "{{length}} signets importés !", + "Inches (in)": "Pouces (in)", + "Include Attachments": "Inclure les pièces jointes", + "Include Cc Bcc": "Inclure Cc et Cci", + "Include this file": "Inclure ce fichier", + "Incorrect Page Count": "Nombre de pages incorrect", + "Incorrect Password": "Mot de passe incorrect", + "Incorrect password": "Mot de passe incorrect", + "Incorrect password. Please try again.": "Mot de passe incorrect. Veuillez réessayer.", + "Increase size": "Augmenter la taille", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indexation du PDF 1, page {{pageNumber}} sur {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indexation du PDF 2, page {{pageNumber}} sur {{totalPages}}...", + "Info": "Infos", + "Info Dictionary": "Dictionnaire d’informations", + "Inherit": "Hériter", + "Initialization Error": "Erreur d’initialisation", + "Initializing Ghostscript...": "Initialisation de Ghostscript...", + "Initializing PDF engine...": "Initialisation du moteur PDF...", + "Initializing PyMuPDF...": "Initialisation de PyMuPDF...", + "Initializing decryption...": "Initialisation du déchiffrement...", + "Initializing encryption...": "Initialisation du chiffrement...", + "Initializing repair engine...": "Initialisation du moteur de réparation...", + "Initializing...": "Initialisation...", + "Input Required": "Saisie requise", + "Insecure Digest (MD5 / SHA-1)": "Hachage non sécurisé (MD5 / SHA-1)", + "Insert blank pages": "Insérer des pages blanches", + "Insert blank pages after this page number": "Insérer des pages blanches après ce numéro de page", + "Interactive Form Fields": "Champs de formulaire interactifs", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Entrelacer les pages de plusieurs PDF (par ex. pages impaires + paires inversées d’une numérisation recto seul)", + "Invalid Certificate": "Certificat invalide", + "Invalid File": "Fichier invalide", + "Invalid Files": "Fichiers invalides", + "Invalid Input": "Saisie invalide", + "Invalid JSON format": "Format JSON invalide", + "Invalid Name": "Nom invalide", + "Invalid Order": "Ordre invalide", + "Invalid PDF password.": "Mot de passe PDF invalide.", + "Invalid Page Numbers": "Numéros de page invalides", + "Invalid Page Order": "Ordre des pages invalide", + "Invalid Pages": "Pages invalides", + "Invalid Range": "Plage invalide", + "Invalid Signature": "Signature invalide", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL TSA invalide. L’autorité d’horodatage doit être une URL http:// ou https:// valide.", + "Invalid URL": "URL invalide", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Format d’URL invalide. Saisissez une URL valide (par ex. https://example.com/wasm/)", + "Invalid XML: no root element": "XML invalide : aucun élément racine", + "Invalid data": "Données invalides", + "Invalid hex string in content stream": "Chaîne hexadécimale invalide dans le flux de contenu", + "Invalid page range specified.": "Plage de pages invalide.", + "Invalid shortcut format": "Format de raccourci invalide", + "Invalid: Cryptographic Verification Failed": "Invalide : échec de la vérification cryptographique", + "Invert Colors": "Inverser les couleurs", + "Invert all colors": "Inverser toutes les couleurs", + "Inverting PDF colors...": "Inversion des couleurs du PDF...", + "Issuer": "Émetteur", + "It fits the {{targetBytes}} target.": "Il respecte la cible de {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Il reste au-dessus de la cible de {{targetBytes}}, car Préserver PDF/A limite la compression possible.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Il ne déclare plus la conformité PDF/A. Activez Préserver PDF/A dans les paramètres personnalisés pour la conserver.", + "Italic": "Italique", + "Item 1": "Élément 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Ses signatures numériques ont été supprimées pour permettre la compression. Signez-le à nouveau si nécessaire.", + "JPEG (Smaller file size)": "JPEG (fichier plus petit)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Qualité JPEG des images réencodées, de 20 à 100. Plus bas signifie des fichiers plus petits et des artefacts plus visibles.", + "JPG": "JPG", + "JSON Files": "Fichiers JSON", + "JSON Loaded": "JSON chargé", + "JSON to PDF": "JSON en PDF", + "Javascript Code": "Code JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Garde un fichier PDF/A conforme. Brotli et la rastérisation sont ignorés tant que cette option est activée.", + "Keeps only the characters the document uses.": "Conserve uniquement les caractères utilisés par le document.", + "Key (e.g., Department)": "Clé (par ex. Département)", + "Keywords": "Mots-clés", + "Label": "Libellé", + "Label / Prompt": "Libellé / invite", + "Landscape": "Paysage", + "Language": "Langue", + "Layer not found": "Calque introuvable", + "Layer {{number}}": "Calque {{number}}", + "Leave blank for all pages": "Laisser vide pour toutes les pages", + "Left": "Gauche", + "Left edge in points (1 inch = 72 pts)": "Bord gauche en points (1 pouce = 72 pts)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Niveau", + "Limit recognized characters (leave empty for all)": "Limiter les caractères reconnus (laisser vide pour tous)", + "Line": "Ligne", + "Linearization Failed": "Échec de la linéarisation", + "Linearize": "Linéariser", + "Links stop being clickable.": "Les liens ne sont plus cliquables.", + "Lists": "Listes", + "Load": "Charger", + "Load system fonts": "Charger les polices système", + "Load system fonts…": "Charger les polices système…", + "Loaded": "Chargé", + "Loaded bookmarks from JSON. Now upload your PDF.": "Signets chargés depuis le JSON. Importez maintenant votre PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} signets chargés depuis le CSV. Importez maintenant votre PDF.", + "Loading Engine...": "Chargement du moteur...", + "Loading Ghostscript...": "Chargement de Ghostscript...", + "Loading PDF Editor...": "Chargement de l’éditeur PDF...", + "Loading PDF Text Editor...": "Chargement de l’éditeur de texte PDF...", + "Loading PDF converter...": "Chargement du convertisseur PDF...", + "Loading PDF documents...": "Chargement des documents PDF...", + "Loading PDF engine...": "Chargement du moteur PDF...", + "Loading PDF files...": "Chargement des fichiers PDF...", + "Loading PDF form...": "Chargement du formulaire PDF...", + "Loading PDF processor...": "Chargement du processeur PDF...", + "Loading PDF viewer...": "Chargement du visualiseur PDF...", + "Loading PDF...": "Chargement du PDF...", + "Loading PDFs...": "Chargement des PDF...", + "Loading attachments...": "Chargement des pièces jointes...", + "Loading comparison {{currentPage}} of {{length}}...": "Chargement de la comparaison {{currentPage}} sur {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Chargement du moteur de conversion ({{percent}} %)...", + "Loading conversion engine...": "Chargement du moteur de conversion...", + "Loading engine...": "Chargement du moteur...", + "Loading fonts...": "Chargement des polices...", + "Loading layers from {{name}}...": "Chargement des calques de {{name}}...", + "Loading page {{num}}...": "Chargement de la page {{num}}...", + "Loading preview...": "Chargement de l’aperçu...", + "Loading {{name}}...": "Chargement de {{name}}...", + "Loading...": "Chargement...", + "Location": "Emplacement", + "Lossless (No Quality Loss)": "Sans perte (aucune perte de qualité)", + "Lossless (no image re-encoding)": "Sans perte (sans réencodage des images)", + "Low (Best Quality)": "Faible (meilleure qualité)", + "MOBI Files": "Fichiers MOBI", + "MOBI to PDF": "MOBI en PDF", + "Malformed ByteRange": "ByteRange mal formé", + "Malformed ECDSA signature (could not parse r,s)": "Signature ECDSA mal formée (impossible d’analyser r,s)", + "Malformed inline image in content stream": "Image en ligne mal formée dans le flux de contenu", + "Malformed signatureAlgorithm": "signatureAlgorithm mal formé", + "Margins": "Marges", + "Markdown Files": "Fichiers Markdown", + "Markdown to PDF": "Markdown en PDF", + "Max Length (0 for unlimited)": "Longueur max. (0 pour illimité)", + "Maximum resolution": "Résolution maximale", + "Medium (Recommended)": "Moyenne (recommandée)", + "Merge PDF": "Fusionner des PDF", + "Merge PDFs": "Fusionner des PDF", + "Merge duplicate fonts": "Fusionner les polices en double", + "Mermaid Error: {{error}}": "Erreur Mermaid : {{error}}", + "Metadata copied to clipboard as JSON.": "Métadonnées copiées dans le presse-papiers au format JSON.", + "Metadata removed successfully!": "Métadonnées supprimées avec succès !", + "Metadata updated successfully!": "Métadonnées mises à jour avec succès !", + "Millimeters (mm)": "Millimètres (mm)", + "Minimizes window": "Réduit la fenêtre", + "Missing Files": "Fichiers manquants", + "Missing signatureAlgorithm": "signatureAlgorithm manquant", + "Mixed Page Sizes Detected": "Tailles de page mixtes détectées", + "Mixed Sizes": "Tailles mixtes", + "Mode": "Mode", + "Modified": "Modifié", + "Modified After Signing (signed part intact)": "Modifié après la signature (partie signée intacte)", + "More": "Plus", + "Moved": "Déplacé", + "Moved \"{{value}}\"": "« {{value}} » déplacé", + "Multi-line": "Multiligne", + "Must be a positive integer": "Doit être un entier positif", + "Must be a positive number": "Doit être un nombre positif", + "N must be at least 1.": "N doit être au moins égal à 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "PDF N-Up créé avec succès !", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Erreur réseau : impossible de se connecter à l’URL. Vérifiez que l’URL est correcte et que le serveur autorise les requêtes CORS.", + "Network error: {{error}}": "Erreur réseau : {{error}}", + "Next page": "Page suivante", + "No Area Selected": "Aucune zone sélectionnée", + "No Attachments": "Aucune pièce jointe", + "No Changes": "Aucune modification", + "No Crop Area": "Aucune zone de recadrage", + "No File": "Aucun fichier", + "No Files": "Aucun fichier", + "No Images Found": "Aucune image trouvée", + "No PDF Files": "Aucun fichier PDF", + "No PDF document loaded": "Aucun document PDF chargé", + "No PDF document loaded.": "Aucun document PDF chargé.", + "No PDF file loaded.": "Aucun fichier PDF chargé.", + "No PDF files could be decrypted. The password may be incorrect.": "Aucun fichier PDF n’a pu être déchiffré. Le mot de passe est peut-être incorrect.", + "No PDF files could be linearized.": "Aucun fichier PDF n’a pu être linéarisé.", + "No PDFs could be processed.": "Aucun PDF n’a pu être traité.", + "No Pages": "Aucune page", + "No Selection": "Aucune sélection", + "No Signatures Found": "Aucune signature trouvée", + "No Tables Found": "Aucun tableau trouvé", + "No Text": "Aucun texte", + "No URL configured": "Aucune URL configurée", + "No attachments found in this PDF.": "Aucune pièce jointe trouvée dans ce PDF.", + "No attachments selected for removal.": "Aucune pièce jointe sélectionnée pour la suppression.", + "No blank pages detected in this PDF.": "Aucune page blanche détectée dans ce PDF.", + "No bookmarks found at the selected level.": "Aucun signet trouvé au niveau sélectionné.", + "No bookmarks to delete.": "Aucun signet à supprimer.", + "No bookmarks to export!": "Aucun signet à exporter !", + "No certificate found in PEM file": "Aucun certificat trouvé dans le fichier PEM", + "No certificate found in PFX file": "Aucun certificat trouvé dans le fichier PFX", + "No certificates found in signature": "Aucun certificat trouvé dans la signature", + "No changes match the current filter.": "Aucune modification ne correspond au filtre actuel.", + "No configurable settings for this node.": "Aucun paramètre configurable pour ce nœud.", + "No differences detected on this page.": "Aucune différence détectée sur cette page.", + "No embedded images were found in the selected PDF(s).": "Aucune image intégrée n’a été trouvée dans le ou les PDF sélectionnés.", + "No existing bookmarks found in this PDF.": "Aucun signet existant trouvé dans ce PDF.", + "No items were selected for removal or none were found in the PDF.": "Aucun élément n’a été sélectionné pour la suppression ou aucun n’a été trouvé dans le PDF.", + "No page pairs to export.": "Aucune paire de pages à exporter.", + "No pages found. Please create a blank PDF or upload one.": "Aucune page trouvée. Créez un PDF vierge ou importez-en un.", + "No pages selected for removal.": "Aucune page sélectionnée pour la suppression.", + "No pages were selected for splitting.": "Aucune page n’a été sélectionnée pour la division.", + "No paired page for this side.": "Aucune page associée pour ce côté.", + "No private key found in PEM file": "Aucune clé privée trouvée dans le fichier PEM", + "No private key found in PFX file": "Aucune clé privée trouvée dans le fichier PFX", + "No tables were detected in this PDF.": "Aucun tableau n’a été détecté dans ce PDF.", + "No valid page numbers found.": "Aucun numéro de page valide trouvé.", + "No valid pages to save.": "Aucune page valide à enregistrer.", + "No worker": "Aucun worker", + "Noise": "Bruit", + "None": "Aucun", + "None of the files could be compressed: {{join}}.": "Aucun des fichiers n’a pu être compressé : {{join}}.", + "Normal": "Normal", + "Not Enough Files": "Pas assez de fichiers", + "Not a PDF": "Ce n’est pas un PDF", + "Not connected": "Non connecté", + "Not in trust chain": "Hors de la chaîne de confiance", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Remarque : sans mot de passe propriétaire distinct, le PDF n’a aucune restriction d’utilisation.", + "Number Format": "Format des numéros", + "Number of Pages": "Nombre de pages", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR interrompu avant le traitement de toute page", + "OCR recognize timed out after {{timeoutMs}}ms": "La reconnaissance OCR a expiré après {{timeoutMs}} ms", + "OCR: {{status}}": "OCR : {{status}}", + "ODG Files": "Fichiers ODG", + "ODG to PDF": "ODG en PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Désactivé (par défaut) : numérotation naturelle de 1 à N. Activé : les étiquettes de page d’origine de chaque fichier sont conservées (peut produire des étiquettes en double).", + "One PDF per page": "Un PDF par page", + "One PDF per range": "Un PDF par plage", + "Only a substitute font was available": "Seule une police de remplacement était disponible", + "Only where it does not change how the image looks.": "Uniquement lorsque l’aspect de l’image ne change pas.", + "Opacity": "Opacité", + "Open URL": "Ouvrir l’URL", + "Opens incognito window": "Ouvre une fenêtre de navigation privée", + "Opens new tab": "Ouvre un nouvel onglet", + "Opens new window": "Ouvre une nouvelle fenêtre", + "Operation Failed": "Échec de l’opération", + "Operation resulted in an empty file.": "L’opération a produit un fichier vide.", + "Optimize PDF for fast web viewing": "Optimiser le PDF pour un affichage web rapide", + "Optimizing PDFs for web view (linearizing)...": "Optimisation des PDF pour l’affichage web (linéarisation)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optimisation de {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Options (une par ligne ou séparées par des virgules)", + "Orientation": "Orientation", + "Outline": "Plan", + "Output": "Sortie", + "Overlay": "Superposition", + "Overlay or underlay pages from one PDF onto another": "Superposer ou placer en arrière-plan les pages d’un PDF sur un autre", + "Owner Password": "Mot de passe propriétaire", + "Owner Password Required": "Mot de passe propriétaire requis", + "PDF": "PDF", + "PDF Files": "Fichiers PDF", + "PDF Input": "Entrée PDF", + "PDF Layers": "Calques PDF", + "PDF Metadata": "Métadonnées PDF", + "PDF Producer": "Producteur PDF", + "PDF converted to CSV successfully!": "PDF converti en CSV avec succès !", + "PDF converted to SVG successfully!": "PDF converti en SVG avec succès !", + "PDF converted to greyscale successfully!": "PDF converti en niveaux de gris avec succès !", + "PDF created successfully!": "PDF créé avec succès !", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF déchiffré avec succès ! Tout le chiffrement et toutes les restrictions ont été supprimés.", + "PDF decrypted successfully! Your download has started.": "PDF déchiffré avec succès ! Votre téléchargement a démarré.", + "PDF downloaded successfully.": "PDF téléchargé avec succès.", + "PDF encrypted successfully with 256-bit AES!": "PDF chiffré avec succès en AES 256 bits !", + "PDF has been sanitized and downloaded.": "Le PDF a été sanitisé et téléchargé.", + "PDF has no pages": "Le PDF n’a aucune page", + "PDF organized successfully!": "PDF organisé avec succès !", + "PDF permissions changed successfully!": "Permissions du PDF modifiées avec succès !", + "PDF readers supply the 14 standard PDF fonts themselves.": "Les lecteurs PDF fournissent eux-mêmes les 14 polices PDF standard.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Restrictions du PDF supprimées avec succès ! Le fichier est maintenant entièrement modifiable et imprimable.", + "PDF saved successfully!": "PDF enregistré avec succès !", + "PDF split successfully!": "PDF divisé avec succès !", + "PDF to CSV": "PDF en CSV", + "PDF to DOCX": "PDF en DOCX", + "PDF to Excel/CSV": "PDF en Excel/CSV", + "PDF to Images": "PDF en images", + "PDF to Images (High Quality)": "PDF en images (haute qualité)", + "PDF to JSON": "PDF en JSON", + "PDF to Markdown": "PDF en Markdown", + "PDF to PDF/A": "PDF en PDF/A", + "PDF to SVG": "PDF en SVG", + "PDF to Text": "PDF en texte", + "PDF to XLSX": "PDF en XLSX", + "PDF with layer changes saved!": "PDF avec modifications des calques enregistré !", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} appliqué avec succès.", + "PDF/A Conversion": "Conversion PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (strict, sans transparence)", + "PDF/A-2b (Recommended)": "PDF/A-2b (recommandé)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (moderne, autorise les pièces jointes)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "Les PDF ont été mélangés avec succès !", + "PNG": "PNG", + "PNG (Lossless)": "PNG (sans perte)", + "PUB to PDF": "PUB en PDF", + "Page": "Page", + "Page #": "Page n°", + "Page Added": "Page ajoutée", + "Page Numbers": "Numéros de page", + "Page Removed": "Page supprimée", + "Page Size": "Taille de page", + "Page X of Y": "Page X sur Y", + "Page background or layout changed": "Arrière-plan ou mise en page modifié", + "Page container not found": "Conteneur de page introuvable", + "Page extraction produced an empty PDF.": "L’extraction des pages a produit un PDF vide.", + "Page number": "Numéro de page", + "Page numbers added successfully!": "Numéros de page ajoutés avec succès !", + "Page sizes standardized successfully!": "Tailles de page uniformisées avec succès !", + "Page {{currentPageNum}} of {{numPages}}": "Page {{currentPageNum}} sur {{numPages}}", + "Page {{num}} / {{numPages}}": "Page {{num}} / {{numPages}}", + "Page {{n}} ": "Page {{n}} ", + "Page {{n}} of {{length}}": "Page {{n}} sur {{length}}", + "Page {{n}}:": "Page {{n}} :", + "Page {{pageNumber}}": "Page {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "La page {{pageNumber}} n’existe que dans le premier PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "La page {{pageNumber}} n’existe que dans le second PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Page {{pageNumber}} sur {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "La page {{pageNum}} n’existe pas dans ce PDF.", + "Page {{page}}": "Page {{page}}", + "Page {{page}} attachment": "Pièce jointe de la page {{page}}", + "Pages": "Pages", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Pages (par ex. 1-3, 5) - Total : {{pageCount}}", + "Pages Files": "Fichiers Pages", + "Pages Per Sheet": "Pages par feuille", + "Pages combined successfully!": "Pages combinées avec succès !", + "Pages have been divided successfully!": "Les pages ont été divisées avec succès !", + "Pages have been reordered.": "Les pages ont été réordonnées.", + "Pages have been reversed successfully!": "Les pages ont été inversées avec succès !", + "Pages to PDF": "Pages en PDF", + "Paper Size": "Format du papier", + "Paragraph": "Paragraphe", + "Parsing XML structure...": "Analyse de la structure XML...", + "Parsing {{name}}...": "Analyse de {{name}}...", + "Partial Coverage": "Couverture partielle", + "Partial Success": "Succès partiel", + "Password": "Mot de passe", + "Password Error": "Erreur de mot de passe", + "Password Needed": "Mot de passe nécessaire", + "Password Required": "Mot de passe requis", + "Password for all files": "Mot de passe pour tous les fichiers", + "Password for all locked files": "Mot de passe pour tous les fichiers verrouillés", + "Password for {{name}}": "Mot de passe pour {{name}}", + "Password protected": "Protégé par mot de passe", + "Password required for encrypted private key": "Mot de passe requis pour la clé privée chiffrée", + "Path Stroke": "Contour du tracé", + "Please add at least one field before downloading.": "Veuillez ajouter au moins un champ avant de télécharger.", + "Please draw a rectangle on at least one page to select the crop area.": "Veuillez dessiner un rectangle sur au moins une page pour sélectionner la zone de recadrage.", + "Please ensure all page numbers in the order are unique.": "Veuillez vous assurer que tous les numéros de page de l’ordre sont uniques.", + "Please enter a layer name": "Veuillez saisir un nom de calque", + "Please enter a name.": "Veuillez saisir un nom.", + "Please enter a number between 0 and {{totalPages}}.": "Veuillez saisir un nombre entre 0 et {{totalPages}}.", + "Please enter a page order.": "Veuillez saisir un ordre des pages.", + "Please enter a password": "Veuillez saisir un mot de passe", + "Please enter a password for {{i}} or skip it": "Veuillez saisir un mot de passe pour {{i}} ou l’ignorer", + "Please enter a title.": "Veuillez saisir un titre.", + "Please enter a user password.": "Veuillez saisir un mot de passe utilisateur.", + "Please enter a valid number of pages (1 or more).": "Veuillez saisir un nombre de pages valide (1 ou plus).", + "Please enter a valid page number between 1 and {{total}}": "Veuillez saisir un numéro de page valide entre 1 et {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Veuillez saisir une plage de pages valide (par ex. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Veuillez saisir les numéros des pages à extraire.", + "Please enter positive numbers.": "Veuillez saisir des nombres positifs.", + "Please enter some text to convert.": "Veuillez saisir du texte à convertir.", + "Please enter text for the watermark.": "Veuillez saisir le texte du filigrane.", + "Please enter the PDF password.": "Veuillez saisir le mot de passe du PDF.", + "Please load a PDF first.": "Veuillez d’abord charger un PDF.", + "Please select PDF files to create a ZIP archive.": "Veuillez sélectionner des fichiers PDF pour créer une archive ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Veuillez sélectionner un fichier de certificat .pem, .crt, .cer ou .der.", + "Please select a PDF file.": "Veuillez sélectionner un fichier PDF.", + "Please select a valid PDF file.": "Veuillez sélectionner un fichier PDF valide.", + "Please select an area on at least one page to crop.": "Veuillez sélectionner une zone à recadrer sur au moins une page.", + "Please select an area to crop first.": "Veuillez d’abord sélectionner une zone à recadrer.", + "Please select an area to crop.": "Veuillez sélectionner une zone à recadrer.", + "Please select an image file for the watermark.": "Veuillez sélectionner un fichier image pour le filigrane.", + "Please select at least one BMP file.": "Veuillez sélectionner au moins un fichier BMP.", + "Please select at least one CSV file.": "Veuillez sélectionner au moins un fichier CSV.", + "Please select at least one Excel file.": "Veuillez sélectionner au moins un fichier Excel.", + "Please select at least one HEIC file.": "Veuillez sélectionner au moins un fichier HEIC.", + "Please select at least one JPG file.": "Veuillez sélectionner au moins un fichier JPG.", + "Please select at least one JPG or JPEG2000 image.": "Veuillez sélectionner au moins une image JPG ou JPEG2000.", + "Please select at least one ODT file.": "Veuillez sélectionner au moins un fichier ODT.", + "Please select at least one PDF file.": "Veuillez sélectionner au moins un fichier PDF.", + "Please select at least one PowerPoint file.": "Veuillez sélectionner au moins un fichier PowerPoint.", + "Please select at least one RTF file.": "Veuillez sélectionner au moins un fichier RTF.", + "Please select at least one SVG file.": "Veuillez sélectionner au moins un fichier SVG.", + "Please select at least one TIFF file.": "Veuillez sélectionner au moins un fichier TIFF.", + "Please select at least one Word document.": "Veuillez sélectionner au moins un document Word.", + "Please select at least one file to attach.": "Veuillez sélectionner au moins un fichier à joindre.", + "Please select at least one image file.": "Veuillez sélectionner au moins un fichier image.", + "Please select at least one text file.": "Veuillez sélectionner au moins un fichier texte.", + "Please select at least one {{FILETYPE_NAME}} file.": "Veuillez sélectionner au moins un fichier {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Veuillez sélectionner au moins un fichier {{TOOL_NAME}} (.eml ou .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Veuillez sélectionner au moins un fichier {{TOOL_NAME}}.", + "Please select even or odd pages.": "Veuillez sélectionner les pages paires ou impaires.", + "Please select one or more PDF files.": "Veuillez sélectionner un ou plusieurs fichiers PDF.", + "Please select pages to delete.": "Veuillez sélectionner les pages à supprimer.", + "Please select pages to duplicate.": "Veuillez sélectionner les pages à dupliquer.", + "Please select pages to mark for splitting.": "Veuillez sélectionner les pages à marquer pour la division.", + "Please select pages to rotate.": "Veuillez sélectionner les pages à pivoter.", + "Please specify a page range for page-level attachments.": "Veuillez indiquer une plage de pages pour les pièces jointes au niveau des pages.", + "Please upload PDF files.": "Veuillez importer des fichiers PDF.", + "Please upload PDFs first.": "Veuillez d’abord importer des PDF.", + "Please upload a .docx file first.": "Veuillez d’abord importer un fichier .docx.", + "Please upload a PDF file first.": "Veuillez d’abord importer un fichier PDF.", + "Please upload a PDF file.": "Veuillez importer un fichier PDF.", + "Please upload a PDF first.": "Veuillez d’abord importer un PDF.", + "Please upload a valid PDF file.": "Veuillez importer un fichier PDF valide.", + "Please upload at least one PDF file.": "Veuillez importer au moins un fichier PDF.", + "Please upload at least two PDF files to alternate and mix.": "Veuillez importer au moins deux fichiers PDF à alterner et mélanger.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Veuillez importer à la fois un PDF de base et un PDF de superposition ou d’arrière-plan.", + "Please upload valid PDF files.": "Veuillez importer des fichiers PDF valides.", + "Please use the Download button in the PDF viewer toolbar above.": "Veuillez utiliser le bouton Télécharger dans la barre d’outils du visualiseur PDF ci-dessus.", + "Please wait for the PDF viewer to load.": "Veuillez attendre le chargement du visualiseur PDF.", + "Please wait for the form to finish loading.": "Veuillez attendre la fin du chargement du formulaire.", + "Portrait": "Portrait", + "Position": "Position", + "Post-processing for transparency compliance...": "Post-traitement pour la conformité de la transparence...", + "Posterize": "Postériser", + "Posterizing PDF...": "Postérisation du PDF...", + "PowerPoint to PDF": "PowerPoint en PDF", + "Pre Flatten": "Pré-aplatissement", + "Pre-flattening PDF...": "Pré-aplatissement du PDF...", + "Prefer JPEG 2000 for photos": "Privilégier JPEG 2000 pour les photos", + "Preparing PDF export...": "Préparation de l’export PDF...", + "Preparing conversion...": "Préparation de la conversion...", + "Preparing download...": "Préparation du téléchargement...", + "Preparing preview...": "Préparation de l’aperçu...", + "Presentations": "Présentations", + "Preserve PDF/A": "Préserver PDF/A", + "Preview": "Aperçu", + "Preview Error": "Erreur d’aperçu", + "Preview Text": "Aperçu du texte", + "Previous page": "Page précédente", + "Print Form": "Imprimer le formulaire", + "Private data that editing apps store inside the PDF.": "Données privées que les applications d’édition stockent dans le PDF.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF traités.", + "Processing Complete": "Traitement terminé", + "Processing Dpi": "Ppp de traitement", + "Processing Failed": "Échec du traitement", + "Processing PDF permissions...": "Traitement des permissions du PDF...", + "Processing attachments...": "Traitement des pièces jointes...", + "Processing failed for {{name}}.": "Échec du traitement de {{name}}.", + "Processing file {{n}} of {{length}}...": "Traitement du fichier {{n}} sur {{length}}...", + "Processing images...": "Traitement des images...", + "Processing multiple PDFs...": "Traitement de plusieurs PDF...", + "Processing page {{i}} of {{numPages}}": "Traitement de la page {{i}} sur {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Traitement de la page {{i}} sur {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Traitement de la page {{n}} sur {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Traitement de la page {{pageNum}} sur {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Traitement de la page {{pageNum}} sur {{totalPages}}...", + "Processing produced an empty file.": "Le traitement a produit un fichier vide.", + "Processing resulted in an empty file.": "Le traitement a produit un fichier vide.", + "Processing sheet {{n}}...": "Traitement de la feuille {{n}}...", + "Processing {{name}}...": "Traitement de {{name}}...", + "Processing {{nodeName}}...": "Traitement de {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Traitement de {{n}}/{{length}} : {{name}}...", + "Processing...": "Traitement...", + "Producer": "Producteur", + "Publisher Files": "Fichiers Publisher", + "Purple": "Violet", + "PyMuPDF (Document Processing)": "PyMuPDF (traitement de documents)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF n’est pas configuré. Configurez-le dans les paramètres avancés.", + "PyMuPDF module did not export expected PyMuPDF class.": "Le module PyMuPDF n’a pas exporté la classe PyMuPDF attendue.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF a produit un fichier déchiffré vide.", + "PyMuPDF: not configured.": "PyMuPDF : non configuré.", + "QR Code": "Code QR", + "Quality": "Qualité", + "Quits application (cannot be overridden)": "Quitte l’application (ne peut pas être remplacé)", + "RSA-PKCS1 signature does not verify against signer public key": "La signature RSA-PKCS1 ne correspond pas à la clé publique du signataire", + "RSA-PSS signature does not verify against signer public key": "La signature RSA-PSS ne correspond pas à la clé publique du signataire", + "Rasterization Complete": "Rastérisation terminée", + "Rasterization Partial": "Rastérisation partielle", + "Rasterize": "Rastériser", + "Rasterize Dpi": "Ppp de rastérisation", + "Rasterize pages to images": "Rastériser les pages en images", + "Rasterize quality": "Qualité de rastérisation", + "Rasterize resolution (DPI)": "Résolution de rastérisation (ppp)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF rastérisé(s), {{failed}} échec(s).", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rastérisation de {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rastérisation de {{name}}...", + "Rasterizing...": "Rastérisation...", + "Rating must be between 0 and 5": "La note doit être comprise entre 0 et 5", + "Read Only": "Lecture seule", + "Reading CSV file...": "Lecture du fichier CSV...", + "Reading PDF...": "Lecture du PDF...", + "Reading XML file...": "Lecture du fichier XML...", + "Reading encrypted PDF...": "Lecture du PDF chiffré...", + "Reading files...": "Lecture des fichiers...", + "Reading layer configuration...": "Lecture de la configuration des calques...", + "Reading {{name}} ({{n}}/{{length}})...": "Lecture de {{name}} ({{n}}/{{length}})...", + "Ready": "Prêt", + "Reason": "Motif", + "Red": "Rouge", + "Redact": "Caviarder", + "Redact Mode": "Mode caviardage", + "Redact text from PDF": "Caviarder du texte dans le PDF", + "Redaction Failed": "Échec du caviardage", + "Reduce PDF file size": "Réduire la taille du fichier PDF", + "Reduce color complexity": "Réduire la complexité des couleurs", + "Reduces file size by removing color information.": "Réduit la taille du fichier en supprimant les informations de couleur.", + "Reloads page": "Recharge la page", + "Remove": "Supprimer", + "Remove All Attachments": "Supprimer toutes les pièces jointes", + "Remove Annotations": "Supprimer les annotations", + "Remove Blank Pages": "Supprimer les pages blanches", + "Remove Embedded Files": "Supprimer les fichiers intégrés", + "Remove Fonts": "Supprimer les polices", + "Remove Javascript": "Supprimer le JavaScript", + "Remove Layers": "Supprimer les calques", + "Remove Links": "Supprimer les liens", + "Remove Mark Info": "Supprimer Mark Info", + "Remove Metadata": "Supprimer les métadonnées", + "Remove PDF password protection": "Supprimer la protection par mot de passe du PDF", + "Remove Structure Tree": "Supprimer l’arborescence de structure", + "Remove alternate images": "Supprimer les images alternatives", + "Remove application data": "Supprimer les données d’application", + "Remove article threads": "Supprimer les fils d’articles", + "Remove attachment": "Supprimer la pièce jointe", + "Remove blank pages automatically": "Supprimer automatiquement les pages blanches", + "Remove document structure tree": "Supprimer l’arborescence de structure du document", + "Remove file": "Supprimer le fichier", + "Remove metadata, scripts, and hidden data": "Supprimer les métadonnées, scripts et données cachées", + "Remove output intents": "Supprimer les intentions de sortie", + "Remove page thumbnails": "Supprimer les vignettes de pages", + "Remove specific pages": "Supprimer des pages précises", + "Remove web capture information": "Supprimer les informations de capture web", + "Remove {{name}}": "Supprimer {{name}}", + "Removed \"{{beforeText}}\"": "« {{beforeText}} » supprimé", + "Removed image ({{width}}×{{height}})": "Image supprimée ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} page(s) blanche(s) supprimée(s) avec succès !", + "Removing all metadata...": "Suppression de toutes les métadonnées...", + "Removing annotations...": "Suppression des annotations...", + "Removing redacted text from document data...": "Suppression du texte caviardé des données du document...", + "Removing restrictions...": "Suppression des restrictions...", + "Removing {{length}} blank page(s)...": "Suppression de {{length}} page(s) blanche(s)...", + "Render Error": "Erreur de rendu", + "Rendering Page {{num}}...": "Rendu de la page {{num}}...", + "Rendering page previews...": "Rendu des aperçus des pages...", + "Rendering page previews: {{current}}/{{total}}": "Rendu des aperçus des pages : {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Rendu de la page {{n}} sur {{length}}...", + "Rendering preview for page {{pageNum}}...": "Rendu de l’aperçu de la page {{pageNum}}...", + "Reopens closed tab": "Rouvre l’onglet fermé", + "Repair": "Réparer", + "Repair Failed": "Échec de la réparation", + "Repair corrupted PDF": "Réparer un PDF corrompu", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} fichier(s) réparé(s). Échec de la réparation : {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Réparation de {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Réparation de {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "« {{beforeText}} » remplacé par « {{afterText}} »", + "Required": "Obligatoire", + "Resamples even when an image is only slightly above the limit.": "Rééchantillonne même lorsqu’une image dépasse à peine la limite.", + "Reset Form": "Réinitialiser le formulaire", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Réinitialiser et revenir à l’import de fichiers ? Toutes les modifications non enregistrées seront perdues.", + "Resolution": "Résolution", + "Retain Page Labels": "Conserver les étiquettes de page", + "Retry Failed": "Réessayer les échecs", + "Reverse Pages": "Inverser les pages", + "Reverse page order": "Inverser l’ordre des pages", + "Reversing page order...": "Inversion de l’ordre des pages...", + "Reversing {{name}} ({{n}}/{{length}})...": "Inversion de {{name}} ({{n}}/{{length}})...", + "Right": "Droite", + "Right edge in points": "Bord droit en points", + "Rotate": "Pivoter", + "Rotate +90°": "Pivoter de +90°", + "Rotate all pages": "Pivoter toutes les pages", + "Rotation": "Rotation", + "Rotation Variance": "Variance de rotation", + "Rotations applied successfully!": "Rotations appliquées avec succès !", + "Rows": "Lignes", + "Run Javascript": "Exécuter du JavaScript", + "Running OCR on page {{pageNum}}...": "OCR en cours sur la page {{pageNum}}...", + "Running...": "En cours d’exécution...", + "SVG": "SVG", + "SVG Files": "Fichiers SVG", + "SVG to PDF": "SVG en PDF", + "Sanitize": "Sanitiser", + "Sanitized With Warnings": "Sanitisé avec avertissements", + "Sanitizing PDF...": "Sanitisation du PDF...", + "Saturation": "Saturation", + "Saved": "Enregistré", + "Saving PDF with layer changes...": "Enregistrement du PDF avec les modifications des calques...", + "Scaling Mode": "Mode de mise à l’échelle", + "Scanner Effect": "Effet scanner", + "Scanner effect applied successfully!": "Effet scanner appliqué avec succès !", + "Scanning page {{n}} of {{pageCount}}...": "Numérisation de la page {{n}} sur {{pageCount}}...", + "Search Text": "Rechercher du texte", + "Search languages...": "Rechercher des langues...", + "Select Font": "Choisir une police", + "Select a field to edit properties": "Sélectionnez un champ pour modifier ses propriétés", + "Select a field...": "Sélectionnez un champ...", + "Select to add this button to an existing group": "Sélectionnez pour ajouter ce bouton à un groupe existant", + "Selected Option": "Option sélectionnée", + "Self-Signed: Signer Identity Not Verified": "Auto-signé : identité du signataire non vérifiée", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Les ressources OCR auto-hébergées sont partiellement configurées. Définissez {{missing}} avec les autres URL des ressources Tesseract.", + "Separator": "Séparateur", + "Separator Color": "Couleur du séparateur", + "Separator Thickness": "Épaisseur du séparateur", + "Sepia": "Sépia", + "Serial Number:": "Numéro de série :", + "Set custom destination": "Définir une destination personnalisée", + "Shapes": "Formes", + "Sheet {{n}} {{sideLabel}}": "Feuille {{n}} {{sideLabel}}", + "Show": "Afficher", + "Show password": "Afficher le mot de passe", + "Show/Hide Field": "Afficher/masquer le champ", + "Sign Here": "Signer ici", + "Signature /Contents is not a single DER object followed by zero padding": "Le /Contents de la signature n’est pas un objet DER unique suivi de zéros de remplissage", + "Signature Algorithm:": "Algorithme de signature :", + "Signature Intact: Signer Identity Not Verified": "Signature intacte : identité du signataire non vérifiée", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Les champs de signature sont des champs de signature AcroForm et ne seraient visibles que dans un lecteur PDF avancé.", + "Signature has a missing or malformed /ByteRange": "La signature a un /ByteRange manquant ou mal formé", + "Signature scheme {{kind}} not implemented": "Schéma de signature {{kind}} non implémenté", + "Signature {{n}}": "Signature {{n}}", + "Signatures": "Signatures", + "Signed By": "Signé par", + "Signed On": "Signé le", + "Signed PDF Not Changed": "PDF signé non modifié", + "Signed PDF downloaded successfully!": "PDF signé téléchargé avec succès !", + "Signed PDF saved successfully!": "PDF signé enregistré avec succès !", + "Simple (1, 2, 3)": "Simple (1, 2, 3)", + "Simplify large color profiles": "Simplifier les profils de couleurs volumineux", + "Skew Threshold": "Seuil d’inclinaison", + "Skip": "Ignorer", + "Skip All": "Tout ignorer", + "Skip Remaining": "Ignorer le reste", + "Skip this file": "Ignorer ce fichier", + "Skipped: {{join}}.": "Ignorés : {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Fichiers plus petits, mais seuls les lecteurs prenant en charge Brotli peuvent les ouvrir, comme Firefox, MuPDF 1.26+ et Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Certains fichiers ont été ignorés car ce ne sont pas des images prises en charge.", + "Some files were skipped. Only BMP files are allowed.": "Certains fichiers ont été ignorés. Seuls les fichiers BMP sont autorisés.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Certains fichiers ont été ignorés. Seuls les fichiers HEIC/HEIF sont autorisés.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Certains fichiers ont été ignorés. Seuls les fichiers JPG, JPEG, JP2 et JPX sont autorisés.", + "Some files were skipped. Only PDF files are allowed.": "Certains fichiers ont été ignorés. Seuls les fichiers PDF sont autorisés.", + "Some files were skipped. Only PNG images are allowed.": "Certains fichiers ont été ignorés. Seules les images PNG sont autorisées.", + "Some files were skipped. Only SVG graphics are allowed.": "Certains fichiers ont été ignorés. Seuls les graphiques SVG sont autorisés.", + "Some files were skipped. Only TIFF files are allowed.": "Certains fichiers ont été ignorés. Seuls les fichiers TIFF sont autorisés.", + "Some files were skipped. Only WebP images are allowed.": "Certains fichiers ont été ignorés. Seules les images WebP sont autorisées.", + "Some files were skipped. Only supported image formats are allowed.": "Certains fichiers ont été ignorés. Seuls les formats d’image pris en charge sont autorisés.", + "Some files were skipped. Only text files are allowed.": "Certains fichiers ont été ignorés. Seuls les fichiers texte sont autorisés.", + "Some pages could not be processed. Please try again.": "Certaines pages n’ont pas pu être traitées. Veuillez réessayer.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Certaines marques de caviardage n’ont pas pu être appliquées, le fichier n’a donc pas été téléchargé. Appliquez-les ou supprimez-les dans l’éditeur, puis réessayez.", + "Spacing": "Espacement", + "Split PDF": "Scinder un PDF", + "Split by Bookmarks": "Diviser par signets", + "Split pages into tile grid for poster printing": "Diviser les pages en grille de tuiles pour l’impression d’affiches", + "Split pages vertically or horizontally": "Diviser les pages verticalement ou horizontalement", + "Splitting PDF pages...": "Division des pages du PDF...", + "Splitting PDF...": "Division du PDF...", + "Spreadsheets": "Feuilles de calcul", + "Standard (192 DPI)": "Standard (192 ppp)", + "Standard Size": "Taille standard", + "Standardize all pages to a target size": "Uniformiser toutes les pages à une taille cible", + "Standardizing pages...": "Uniformisation des pages...", + "Stitch all pages into one continuous page": "Assembler toutes les pages en une seule page continue", + "Straighten skewed PDF pages": "Redresser les pages PDF inclinées", + "Strip all annotations": "Supprimer toutes les annotations", + "Style": "Style", + "Style Changed": "Style modifié", + "Style changed ({{length}} regions)": "Style modifié ({{length}} zones)", + "Subject": "Sujet", + "Subset embedded fonts": "Créer un sous-ensemble des polices intégrées", + "Success": "Succès", + "Success!": "Succès !", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} fichier(s) CSV converti(s) en PDF avec succès.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} fichier(s) Excel converti(s) en PDF avec succès.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} fichier(s) ODT converti(s) en PDF avec succès.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF converti(s) en DOCX avec succès.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF converti(s) en Markdown avec succès.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF converti(s) en {{level}} avec succès.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} fichiers PSD convertis en un seul PDF avec succès.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} fichier(s) PowerPoint converti(s) en PDF avec succès.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} fichier(s) RTF converti(s) en PDF avec succès.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} document(s) Word converti(s) en PDF avec succès.", + "Successfully converted {{length}} files to PDF.": "{{length}} fichiers convertis en PDF avec succès.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} fichier(s) {{TOOL_NAME}} converti(s) en PDF avec succès.", + "Successfully converted {{name}} to DOCX.": "{{name}} converti en DOCX avec succès.", + "Successfully converted {{name}} to Markdown.": "{{name}} converti en Markdown avec succès.", + "Successfully converted {{name}} to PDF.": "{{name}} converti en PDF avec succès.", + "Successfully converted {{name}} to {{level}}.": "{{name}} converti en {{level}} avec succès.", + "Successfully extracted PDF for AI/LLM use.": "PDF extrait avec succès pour une utilisation avec l’IA/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF extrait(s) avec succès pour une utilisation avec l’IA/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF rastérisé avec succès à {{dpi}} ppp.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF rastérisé(s) avec succès à {{dpi}} ppp.", + "Supported: CBZ, CBR": "Pris en charge : CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Pris en charge : DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Pris en charge : EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Pris en charge : JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Pris en charge : PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Pris en charge : VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Pris en charge : XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Pris en charge : XPS, OXPS", + "Switches apps": "Change d’application", + "Switches tabs": "Change d’onglet", + "Table of Contents": "Table des matières", + "Table {{n}} (Page {{page}})": "Tableau {{n}} (page {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Champ cible", + "Target Kilobytes": "Kilo-octets cibles", + "Target Not Reached": "Cible non atteinte", + "Target Size": "Taille cible", + "Technical Details": "Détails techniques", + "Temperature": "Température", + "Template \"{{name}}\" loaded.": "Modèle « {{name}} » chargé.", + "Template \"{{name}}\" saved.": "Modèle « {{name}} » enregistré.", + "Text": "Texte", + "Text Color": "Couleur du texte", + "Text Files": "Fichiers texte", + "Text color changed successfully!": "Couleur du texte modifiée avec succès !", + "Text converted to PDF successfully!": "Texte converti en PDF avec succès !", + "Text extracted successfully!": "Texte extrait avec succès !", + "Text to PDF": "Texte en PDF", + "That password did not open any of the remaining files.": "Ce mot de passe n’a ouvert aucun des fichiers restants.", + "The PDF file(s) do not contain any attachments to extract.": "Le ou les fichiers PDF ne contiennent aucune pièce jointe à extraire.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "Le PDF compte {{totalPages}} pages, ce qui n’est pas divisible par {{nValue}}. Le dernier PDF contiendra {{remainder}} page(s).", + "The PDF might be corrupted or password protected.": "Le PDF est peut-être corrompu ou protégé par mot de passe.", + "The PDF might be corrupted or password-protected.": "Le PDF est peut-être corrompu ou protégé par mot de passe.", + "The PDF might be corrupted.": "Le PDF est peut-être corrompu.", + "The PDF viewer is still initializing.": "Le visualiseur PDF est encore en cours d’initialisation.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "Le PDF a été téléchargé, mais ces étapes n’ont pas pu être menées à bien : {{join}}. Le contenu concerné peut encore se trouver dans le fichier.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "L’URL a renvoyé un type de contenu inattendu : {{contentType}}. Un fichier JavaScript était attendu.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Les octets exclus par /ByteRange ne forment pas exactement une signature encodée en hexadécimal", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Les octets exclus par /ByteRange ne sont pas le /Contents de cette signature", + "The compression engine returned an unreadable result.": "Le moteur de compression a renvoyé un résultat illisible.", + "The compression engine stopped unexpectedly.": "Le moteur de compression s’est arrêté de façon inattendue.", + "The current password you entered is incorrect. Please try again.": "Le mot de passe actuel que vous avez saisi est incorrect. Veuillez réessayer.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Les noms de champs suivants existent déjà dans le PDF importé : {{conflictList}}. Renommez ces champs avant de télécharger.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Les noms de champs suivants sont utilisés plusieurs fois : {{duplicateList}}. Renommez ces champs pour utiliser des noms uniques avant de télécharger.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Le nombre de pages indiqué ({{length}}) ne correspond pas au nombre actuel de pages du document ({{currentGridCount}}). Veuillez fournir un ordre complet pour toutes les pages.", + "The password you entered is incorrect. Please try again.": "Le mot de passe que vous avez saisi est incorrect. Veuillez réessayer.", + "The password you entered is wrong or the file is corrupted.": "Le mot de passe que vous avez saisi est incorrect ou le fichier est corrompu.", + "The provided file could not be loaded as an image. It may be corrupted.": "Le fichier fourni n’a pas pu être chargé comme image. Il est peut-être corrompu.", + "The requested OCR language is not available: {{unavailableText}}.": "La langue OCR demandée n’est pas disponible : {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "L’ordre des pages indiqué est incomplet ou contient des numéros de page invalides. Veuillez indiquer une nouvelle position pour chaque page d’origine.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Ces fichiers ne sont pas des PDF valides, ils n’ont donc pas été ajoutés : {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Ces fichiers sont protégés par mot de passe : {{names}}. Saisissez leurs mots de passe sur les cartes de fichiers, ou retirez-les, puis compressez à nouveau.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Cette version de BentoPDF n’inclut les données OCR que pour {{availableText}}.", + "This PDF does not contain any digital signatures.": "Ce PDF ne contient aucune signature numérique.", + "This PDF has no layers (OCG).": "Ce PDF n’a aucun calque (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Ce PDF est protégé par mot de passe. Veuillez saisir le mot de passe actuel pour continuer.", + "This document contains pages with different dimensions:": "Ce document contient des pages de dimensions différentes :", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Ce document contient 1 marque de caviardage qui n'a pas encore été appliquée. Tant qu'une marque n'est pas appliquée, le contenu en dessous reste dans le fichier. Appliquer toutes les marques et télécharger ?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Ce document contient {{count}} marques de caviardage qui n'ont pas encore été appliquées. Tant qu'une marque n'est pas appliquée, le contenu en dessous reste dans le fichier. Appliquer toutes les marques et télécharger ?", + "This feature requires {{name}} to be configured.": "Cette fonctionnalité nécessite que {{name}} soit configuré.", + "This file is not a valid PDF.": "Ce fichier n’est pas un PDF valide.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Ce module est sous licence AGPL-3.0. En le configurant, vous acceptez les termes de sa licence.", + "This tool has been disabled": "Cet outil a été désactivé", + "This tool is not available in your deployment. Contact your administrator for more information.": "Cet outil n’est pas disponible dans votre déploiement. Contactez votre administrateur pour plus d’informations.", + "Threshold": "Seuil", + "Tile": "Mosaïque", + "Tile Gap X": "Écart de mosaïque X", + "Tile Gap Y": "Écart de mosaïque Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Horodatage", + "Timestamp Failed": "Échec de l’horodatage", + "Tint": "Teinte", + "Title": "Titre", + "To actually fill or change the options, use our PDF Form Filler tool.": "Pour réellement remplir le formulaire ou modifier ses options, utilisez notre outil Remplisseur de formulaires PDF.", + "Toggle": "Basculer", + "Toggle style": "Basculer le style", + "Toggle sync scroll": "Basculer le défilement synchronisé", + "Tool Unavailable": "Outil indisponible", + "Tooltip / Help Text": "Info-bulle / texte d’aide", + "Top": "Haut", + "Top Center": "Haut centre", + "Top Left": "Haut gauche", + "Top Right": "Haut droite", + "Top edge in points": "Bord supérieur en points", + "Total Pages": "Total des pages", + "Transparent Background": "Arrière-plan transparent", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Essaie JPEG 2000 par rapport à JPEG pour chaque image et conserve le plus petit.", + "Trim margins from all pages": "Rogner les marges de toutes les pages", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Vérification de confiance : {{trustVerified}}/{{length}} signatures vérifiées avec le certificat personnalisé", + "Trusted": "Approuvé", + "Trusted certificate loaded": "Certificat de confiance chargé", + "Tsa Url": "URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Désactive la qualité, la résolution et toutes les autres étapes d’image avec perte.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "L’URL doit commencer par http:// ou https://", + "Ultra (384 DPI)": "Ultra (384 ppp)", + "Unable to decrypt the PDF with the provided password.": "Impossible de déchiffrer le PDF avec le mot de passe fourni.", + "Unable to repair any of the uploaded PDF files.": "Impossible de réparer aucun des fichiers PDF importés.", + "Unembed standard fonts": "Désintégrer les polices standard", + "Unembed standard-font look-alikes": "Désintégrer les polices équivalentes aux polices standard", + "Unexpected delimiter in content stream": "Délimiteur inattendu dans le flux de contenu", + "Unexpected reply from the engine.": "Réponse inattendue du moteur.", + "Uniform": "Uniforme", + "Unique Page Sizes": "Tailles de page uniques", + "Unknown": "Inconnu", + "Unknown error": "Erreur inconnue", + "Unknown error occurred in worker.": "Erreur inconnue survenue dans le worker.", + "Unknown error occurred.": "Erreur inconnue survenue.", + "Unlock": "Déverrouiller", + "Unlock All": "Tout déverrouiller", + "Unlock Remaining ({{remaining}})": "Déverrouiller le reste ({{remaining}})", + "Unlocked": "Déverrouillé", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} fichier(s) sur {{length}} déverrouillé(s).", + "Unlocking...": "Déverrouillage...", + "Unresolved optional content reference": "Référence de contenu facultatif non résolue", + "Unsupported ECDSA curve in signer certificate": "Courbe ECDSA non prise en charge dans le certificat du signataire", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Image non prise en charge. Utilisez un PNG ou un JPG pour le filigrane.", + "Unsupported digest OID {{digestOid}}": "OID de hachage {{digestOid}} non pris en charge", + "Unsupported file type: .{{ext}}": "Type de fichier non pris en charge : .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID d’algorithme de signature {{oid}} non pris en charge", + "Unterminated array or dictionary in content stream": "Tableau ou dictionnaire non terminé dans le flux de contenu", + "Unterminated hex string in content stream": "Chaîne hexadécimale non terminée dans le flux de contenu", + "Unterminated inline image in content stream": "Image en ligne non terminée dans le flux de contenu", + "Unterminated string in content stream": "Chaîne non terminée dans le flux de contenu", + "Unverified: Unsupported Signature Algorithm": "Non vérifiée : algorithme de signature non pris en charge", + "Updating metadata...": "Mise à jour des métadonnées...", + "Upload Certificate": "Importer un certificat", + "Upload Comics": "Importer des bandes dessinées", + "Upload Documents": "Importer des documents", + "Upload EPUB Files": "Importer des fichiers EPUB", + "Upload Email Files": "Importer des fichiers d’e-mail", + "Upload FB2 Files": "Importer des fichiers FB2", + "Upload Images": "Importer des images", + "Upload JSON Files": "Importer des fichiers JSON", + "Upload MOBI Files": "Importer des fichiers MOBI", + "Upload Markdown Files": "Importer des fichiers Markdown", + "Upload ODG Files": "Importer des fichiers ODG", + "Upload PDFs": "Importer des PDF", + "Upload PUB Files": "Importer des fichiers PUB", + "Upload Pages Files": "Importer des fichiers Pages", + "Upload Presentations": "Importer des présentations", + "Upload SVG Files": "Importer des fichiers SVG", + "Upload Spreadsheets": "Importer des feuilles de calcul", + "Upload Text Files": "Importer des fichiers texte", + "Upload Visio Files": "Importer des fichiers Visio", + "Upload WPD Files": "Importer des fichiers WPD", + "Upload WPS Files": "Importer des fichiers WPS", + "Upload XML Files": "Importer des fichiers XML", + "Upload XPS Files": "Importer des fichiers XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Importez un PDF et cliquez sur « Générer l’aperçu » pour voir la disposition du livret", + "Upload images and convert to PDF": "Importez des images et convertissez-les en PDF", + "Upload one or more PDF files": "Importez un ou plusieurs fichiers PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Majuscules A-Z, chiffres 0-9 et - . $ / + % ESPACE", + "Use same password for all files": "Utiliser le même mot de passe pour tous les fichiers", + "User Password": "Mot de passe utilisateur", + "VSD to PDF": "VSD en PDF", + "Valid From": "Valide à partir du", + "Valid Signature": "Signature valide", + "Valid Until": "Valide jusqu’au", + "Validating {{n}} of {{length}}: {{name}}": "Validation de {{n}} sur {{length}} : {{name}}", + "Validating...": "Validation...", + "Value": "Valeur", + "Value (e.g., Marketing)": "Valeur (par ex. Marketing)", + "Vertical": "Vertical", + "Viewer not ready": "Visualiseur non prêt", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Visualiseur non prêt. Importez un PDF et attendez la fin de son chargement.", + "Visibility": "Visibilité", + "Visio Files": "Fichiers Visio", + "WPD to PDF": "WPD en PDF", + "WPS Files": "Fichiers WPS", + "WPS to PDF": "WPS en PDF", + "Watermark": "Filigrane", + "Watermark added successfully!": "Filigrane ajouté avec succès !", + "Web Crypto API not available in this context": "L’API Web Crypto n’est pas disponible dans ce contexte", + "Web Crypto import/verify failed: {{error}}": "Échec de l’import/vérification Web Crypto : {{error}}", + "WebP": "WebP", + "Whitelist": "Liste blanche", + "Width ({{unit}})": "Largeur ({{unit}})", + "Word": "Word", + "Word Documents": "Documents Word", + "Word to PDF": "Word en PDF", + "WordPerfect Files": "Fichiers WordPerfect", + "Worker crashed": "Le worker a planté", + "Worker error occurred. Check console for details.": "Une erreur de worker s’est produite. Consultez la console pour plus de détails.", + "Workflow completed": "Workflow terminé", + "Wrong password": "Mot de passe incorrect", + "Wrong password for: {{join}}": "Mot de passe incorrect pour : {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Mot de passe incorrect ou échec du déchiffrement de « {{name}} ».", + "X Position": "Position X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X : {{pdfX}}, Y : {{pdfY}} ", + "XML Files": "Fichiers XML", + "XML to PDF": "XML en PDF", + "XMP Metadata": "Métadonnées XMP", + "XPS Files": "Fichiers XPS", + "XPS to PDF": "XPS en PDF", + "Y Position": "Position Y", + "Year must be between 1900 and 2100": "L’année doit être comprise entre 1900 et 2100", + "Yellow": "Jaune", + "Yellowish": "Jaunâtre", + "You cannot delete the last page of the document.": "Vous ne pouvez pas supprimer la dernière page du document.", + "Your PDF has been cropped and the download has started.": "Votre PDF a été recadré et le téléchargement a démarré.", + "Your PDF has been downloaded successfully.": "Votre PDF a été téléchargé avec succès.", + "Your PDF has been posterized.": "Votre PDF a été postérisé.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Vos caviardages sont appliqués aux pages, mais ce fichier est chiffré : BentoPDF ne peut donc pas supprimer aussi les copies du texte caviardé dans ses propriétés, ses signets et ses pièces jointes. Pour un nettoyage complet, caviardez une copie non chiffrée, puis ajoutez un mot de passe ensuite avec Protéger un PDF. Télécharger quand même ?", + "Your workflow needs at least one input node and one output node to run.": "Votre workflow a besoin d’au moins un nœud d’entrée et un nœud de sortie pour s’exécuter.", + "ZIP archive created successfully!": "Archive ZIP créée avec succès !", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "par ex. jj/mm/aaaa HH:MM:ss", + "form": "formulaire", + "https://example.com": "https://example.com", + "signature found": "signature trouvée", + "signatures found": "signatures trouvées", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} nœud", + "{{count}} nodes": "{{count}} nœuds", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 page", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} pages", + "{{length}} Files Need a Password": "{{length}} fichiers nécessitent un mot de passe", + "{{length}} PDF file(s) selected": "{{length}} fichier(s) PDF sélectionné(s)", + "{{length}} PDF files selected": "{{length}} fichiers PDF sélectionnés", + "{{length}} attachment(s) extracted successfully!": "{{length}} pièce(s) jointe(s) extraite(s) avec succès !", + "{{length}} file • {{totalPages}} total pages": "{{length}} fichier • {{totalPages}} pages au total", + "{{length}} file(s) attached successfully.": "{{length}} fichier(s) joint(s) avec succès.", + "{{length}} files • {{totalPages}} total pages": "{{length}} fichiers • {{totalPages}} pages au total", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Il était protégé par mot de passe, la copie compressée n’a donc aucun mot de passe. Utilisez Protéger un PDF pour en ajouter un à nouveau.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} pages)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} est signé numériquement, il a donc été laissé tel quel. Le compresser casserait la signature. Pour le compresser quand même, activez Outrepasser la protection du contenu dans les paramètres personnalisés ; ses signatures seront supprimées.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} n’est pas un PDF valide, il n’a donc pas été ajouté.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} est protégé par mot de passe. Saisissez son mot de passe sur la carte du fichier, puis compressez à nouveau.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Impossible de charger le nombre de pages", + "{{size}} • Loading pages...": "{{size}} • Chargement des pages...", + "{{size}} • Loading...": "{{size}} • Chargement...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} pages", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} pages", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} pages", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} pages", + "{{size}} • {{value}} pages": "{{size}} • {{value}} pages", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF déchiffré(s) avec succès.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF linéarisé(s) avec succès.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} pages → {{numSheets}} feuilles de sortie", + "{{validCount}} valid": "{{validCount}} valide(s)", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}} : 1 page", + "• {{label}}: {{count}} pages": "• {{label}} : {{count}} pages" +} diff --git a/public/locales/id/common.json b/public/locales/id/common.json index e631a8da..644b428e 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Buka menu utama", "language": "Bahasa", "searchLanguage": "Cari bahasa…", - "noLanguagesFound": "Bahasa tidak ditemukan" + "noLanguagesFound": "Bahasa tidak ditemukan", + "breadcrumb": "Navigasi breadcrumb" }, "donation": { "message": "Suka BentoPDF? Bantu kami menjaganya tetap gratis dan sumber terbuka!", @@ -236,6 +237,10 @@ "aboutUs": "Tentang Kami", "faqLink": "FAQ", "contactUs": "Hubungi Kami", + "tools": "Alat", + "pdfConverter": "Konverter PDF", + "pdfSecurity": "Keamanan PDF", + "mergeSplit": "Gabung dan pisah PDF", "legal": "Hukum", "termsAndConditions": "Syarat dan Ketentuan", "privacyPolicy": "Kebijakan Privasi", @@ -336,8 +341,8 @@ "upload": "Unggah", "addBlankPage": "Tambah Halaman Kosong", "edit": "Edit:", - "undo": "Undo", - "redo": "Redo", + "undo": "Urungkan", + "redo": "Ulangi", "reset": "Atur Ulang", "selection": "Pilihan:", "selectAll": "Pilih Semua", @@ -345,7 +350,7 @@ "rotate": "Putar:", "rotateLeft": "Kiri", "rotateRight": "Kanan", - "transform": "Transform:", + "transform": "Transformasi:", "duplicate": "Duplikat", "split": "Pisah", "clear": "Hapus:", diff --git a/public/locales/id/tools.json b/public/locales/id/tools.json index 0b32483b..02058f3a 100644 --- a/public/locales/id/tools.json +++ b/public/locales/id/tools.json @@ -27,7 +27,22 @@ "name": "Gabung PDF", "subtitle": "Gabungkan beberapa PDF menjadi satu file. Mempertahankan Bookmark.", "retainPageLabels": "Pertahankan label halaman asli dari setiap file", - "retainPageLabelsHint": "Mati (default): PDF yang digabungkan menggunakan penomoran halaman alami 1–N. Aktif: label halaman asli setiap file dipertahankan (dapat menghasilkan label ganda)." + "retainPageLabelsHint": "Mati (default): PDF yang digabungkan menggunakan penomoran halaman alami 1–N. Aktif: label halaman asli setiap file dipertahankan (dapat menghasilkan label ganda).", + "removeDuplicateFonts": "Hapus font duplikat", + "alert": { + "thumbnailError": "Gagal merender thumbnail halaman", + "noSelection": "Tidak ada file atau halaman yang dipilih untuk digabungkan.", + "mergeSuccess": "PDF berhasil digabungkan!", + "mergeFailed": "Gagal menggabungkan PDF.", + "mergeError": "Gagal menggabungkan PDF. Pastikan semua file valid dan tidak dilindungi kata sandi.", + "workerError": "Terjadi kesalahan tak terduga saat proses penggabungan.", + "loadError": "Gagal memuat satu atau beberapa file PDF" + }, + "loader": { + "renderingPreviews": "Merender pratinjau halaman...", + "merging": "Menggabungkan PDF...", + "loadingDocuments": "Memuat dokumen PDF..." + } }, "splitPdf": { "name": "Pisah PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "Ulangi (⇧⌘Z)", "tipFileDetails": "Detail file", "tipEditExistingContent": "Edit konten yang ada", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Yang dipengaruhi alat Edit — persempit cakupan pada halaman yang padat", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Yang dipengaruhi alat Edit: persempit cakupan pada halaman yang padat", "tipClickThePageToAddATextBox": "Klik halaman untuk menambahkan kotak teks", "tipSpellCheckLanguage": "Bahasa pemeriksa ejaan", "tipFindAndReplace": "Cari dan ganti", @@ -284,7 +299,7 @@ "applyToAllPages": "Terapkan ke semua halaman" }, "headerFooter": { - "name": "Header & Footer", + "name": "Kepala & Kaki Halaman", "subtitle": "Tambah teks ke bagian atas dan bawah halaman." }, "invertColors": { @@ -302,8 +317,8 @@ "rotateVariance": "Variasi Putaran", "brightness": "Kecerahan", "contrast": "Kontras", - "blur": "Blur", - "noise": "Noise", + "blur": "Buram", + "noise": "Derau", "yellowish": "Kekuningan", "resolution": "Resolusi", "processButton": "Terapkan Efek Pemindai" @@ -503,7 +518,8 @@ "noFile": "Tidak Ada File", "noFileExplanation": "Silakan unggah file PDF terlebih dahulu.", "conversionSuccess": "PDF berhasil dikonversi ke TIFF!", - "conversionError": "Gagal mengonversi PDF ke TIFF. File mungkin rusak." + "conversionError": "Gagal mengonversi PDF ke TIFF. File mungkin rusak.", + "conversionOutOfMemory": "Memori browser habis saat konversi. Coba DPI yang lebih rendah, atau hapus centang opsi TIFF multi-halaman untuk mengonversi halaman satu per satu." } }, "pdfToCbz": { @@ -613,7 +629,7 @@ "multiLanguageSupportDescription": "Pilih beberapa bahasa untuk dokumen yang berisi konten bahasa campuran." }, "alternateMerge": { - "name": "Alternatif & Campur Halaman", + "name": "Selang-seling & Campur Halaman", "subtitle": "Gabung PDF dengan menggantikan halaman dari setiap PDF. Mempertahankan Bookmark.", "retainPageLabels": "Pertahankan label halaman asli dari setiap file", "retainPageLabelsHint": "Mati (default): PDF yang digabungkan menggunakan penomoran halaman alami 1–N. Aktif: label halaman asli setiap file dipertahankan (dapat menghasilkan label ganda)." @@ -990,8 +1006,7 @@ "subtitle": "Ekstrak teks dari file PDF dan simpan sebagai teks biasa (.txt). Mendukung beberapa file.", "noteLabel": "Catatan:", "noteText": "Alat ini HANYA bekerja dengan PDF yang dibuat secara digital. Untuk dokumen pindai atau PDF berbasis gambar, gunakan alat OCR PDF kami sebagai gantinya.", - "convertButton": "Ekstrak Teks", - "note": "Alat ini bekerja HANYA dengan PDF yang dibuat secara digital. Untuk dokumen terpindai atau PDF berbasis gambar, gunakan alat OCR PDF kami sebagai gantinya." + "convertButton": "Ekstrak Teks" }, "digitalSignPdf": { "name": "Tanda Tangan Digital PDF", @@ -1012,7 +1027,7 @@ "location": "Lokasi", "locationPlaceholder": "misalnya, Jakarta, Indonesia", "contactInfo": "Info Kontak", - "contactPlaceholder": "misalnya, email@contoh.com", + "contactPlaceholder": "misalnya, email@example.com", "visibleSignature": "Tanda Tangan Terlihat", "visibleSignatureDescription": "Saat diaktifkan, kotak tanda tangan terlihat muncul di PDF. Anda dapat mengunggah gambar/logo atau menambahkan teks. Jika tidak ada yang diberikan, nama penanda tangan dari sertifikat akan ditampilkan secara otomatis.", "signatureImage": "Gambar/Logo Tanda Tangan (Opsional)", @@ -1189,7 +1204,7 @@ "workerError": "Kesalahan worker: {{message}}", "alternateMergeWorkerError": "Kesalahan worker penggabungan bergantian: {{message}}", "noPdfFilesUploaded": "Tidak ada berkas PDF yang diunggah di node PDF Input", - "failedToLoadFile": "Gagal memuat \"{{file}}\" — berkas mungkin rusak", + "failedToLoadFile": "Gagal memuat \"{{file}}\", berkas mungkin rusak", "noImagesUploaded": "Tidak ada gambar yang diunggah di node Image Input", "noWordDocsUploaded": "Tidak ada dokumen yang diunggah di node Word Input", "noExcelUploaded": "Tidak ada lembar kerja yang diunggah di node Excel Input", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Tentu saja! Semua pemrosesan terjadi di browser Anda. File Anda tidak pernah meninggalkan perangkat Anda, memastikan privasi penuh." }, "unlockPdf": { - "name": "Dekripsi PDF", + "name": "Buka Kunci PDF", "subtitle": "Buka kunci PDF dengan menghapus perlindungan kata sandi." }, "protectPdf": { - "name": "Enkripsi PDF", + "name": "Lindungi PDF", "subtitle": "Kunci PDF Anda dengan menambahkan kata sandi." } } diff --git a/public/locales/id/ui.json b/public/locales/id/ui.json new file mode 100644 index 00000000..3eb289dd --- /dev/null +++ b/public/locales/id/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(dikoreksi)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} lainnya...", + "- Error parsing XMP XML. Displaying raw. -": "- Gagal mengurai XMP XML. Menampilkan data mentah. -", + "- No Info Dictionary data found -": "- Data Info Dictionary tidak ditemukan -", + "- No XMP metadata found -": "- Metadata XMP tidak ditemukan -", + "- No interactive form fields found -": "- Bidang formulir interaktif tidak ditemukan -", + "- No parseable XMP properties found -": "- Properti XMP yang dapat diurai tidak ditemukan -", + "-- Select existing group --": "-- Pilih grup yang ada --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (Sangat Sensitif)", + "0.5° (Default)": "0,5° (Default)", + "1.0° (Normal)": "1,0° (Normal)", + "100 (Fast)": "100 (Cepat)", + "150 (Default)": "150 (Default)", + "1x2 (Booklet)": "1x2 (Buku Kecil)", + "2.0° (Less Sensitive)": "2,0° (Kurang Sensitif)", + "200 (Better)": "200 (Lebih Baik)", + "200 (Good)": "200 (Baik)", + "2x2 (4-up)": "2x2 (4 per lembar)", + "2x4 (8-up)": "2x4 (8 per lembar)", + "300 (Best Quality)": "300 (Kualitas Terbaik)", + "300 (Print)": "300 (Cetak)", + "4x4 (16-up)": "4x4 (16 per lembar)", + "600 (High Quality)": "600 (Kualitas Tinggi)", + "72 (Screen)": "72 (Layar)", + "90° Clockwise": "90° Searah Jarum Jam", + "90° Counter-clockwise": "90° Berlawanan Arah Jarum Jam", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Bidang bernama \"{{fieldName}}\" sudah ada. Ganti nama bidang ini agar unik sebelum mengunduh.", + "A new version of BentoPDF is available. Reload to update?": "Versi baru BentoPDF tersedia. Muat ulang untuk memperbarui?", + "A single PDF file": "Satu file PDF", + "A template with this name already exists.": "Templat dengan nama ini sudah ada.", + "ASCII characters (letters, numbers, symbols)": "Karakter ASCII (huruf, angka, simbol)", + "Action": "Aksi", + "Add Blank Page": "Tambah Halaman Kosong", + "Add Bookmark": "Tambah Bookmark", + "Add Child Bookmark": "Tambah Bookmark Turunan", + "Add Child Layer": "Tambah Layer Turunan", + "Add More Comics": "Tambah Komik Lainnya", + "Add More Documents": "Tambah Dokumen Lainnya", + "Add More EPUB Files": "Tambah File EPUB Lainnya", + "Add More Email Files": "Tambah File Email Lainnya", + "Add More FB2 Files": "Tambah File FB2 Lainnya", + "Add More Files": "Tambah File Lainnya", + "Add More Images": "Tambah Gambar Lainnya", + "Add More JSON Files": "Tambah File JSON Lainnya", + "Add More MOBI Files": "Tambah File MOBI Lainnya", + "Add More Markdown Files": "Tambah File Markdown Lainnya", + "Add More ODG Files": "Tambah File ODG Lainnya", + "Add More PUB Files": "Tambah File PUB Lainnya", + "Add More Pages Files": "Tambah File Pages Lainnya", + "Add More Presentations": "Tambah Presentasi Lainnya", + "Add More SVG Files": "Tambah File SVG Lainnya", + "Add More Spreadsheets": "Tambah Spreadsheet Lainnya", + "Add More Text Files": "Tambah File Teks Lainnya", + "Add More Visio Files": "Tambah File Visio Lainnya", + "Add More WPD Files": "Tambah File WPD Lainnya", + "Add More WPS Files": "Tambah File WPS Lainnya", + "Add More XML Files": "Tambah File XML Lainnya", + "Add More XPS Files": "Tambah File XPS Lainnya", + "Add a new layer to get started!": "Tambahkan layer baru untuk memulai!", + "Add a text box": "Tambah kotak teks", + "Add an RFC 3161 document timestamp": "Tambahkan stempel waktu dokumen RFC 3161", + "Add an image": "Tambah gambar", + "Add at least one node to run the workflow.": "Tambahkan setidaknya satu node untuk menjalankan alur kerja.", + "Add child": "Tambah turunan", + "Add child layer": "Tambah layer turunan", + "Add header and footer text": "Tambahkan teks header dan footer", + "Add page numbers": "Tambahkan nomor halaman", + "Add searchable text layer via OCR": "Tambahkan lapisan teks yang dapat dicari melalui OCR", + "Add text watermark": "Tambah watermark teks", + "Add/Edit/Extract Attachments": "Tambah/Edit/Ekstrak Lampiran", + "Added": "Ditambahkan", + "Added \"{{afterText}}\"": "Menambahkan \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Gambar ditambahkan ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} halaman kosong berhasil ditambahkan!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} halaman kosong berhasil ditambahkan!", + "Adding header & footer...": "Menambahkan kepala & kaki halaman...", + "Adding page numbers...": "Menambahkan nomor halaman...", + "Adding watermark...": "Menambahkan watermark...", + "Adding {{insertCount}} blank page...": "Menambahkan {{insertCount}} halaman kosong...", + "Adding {{insertCount}} blank pages...": "Menambahkan {{insertCount}} halaman kosong...", + "Adding {{name}} ({{n}}/{{length}})...": "Menambahkan {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Sesuaikan Warna", + "Adjust brightness, contrast, and colors": "Atur kecerahan, kontras, dan warna", + "Advanced": "Lanjutan", + "Advanced Feature Required": "Fitur Lanjutan Diperlukan", + "Advanced Settings": "Pengaturan Lanjutan", + "After Page": "Setelah Halaman", + "After Page...": "Setelah Halaman...", + "Align Objects": "Ratakan Objek", + "Alignment": "Perataan", + "All": "Semua", + "All files repaired successfully!": "Semua file berhasil diperbaiki!", + "Alternate Merge": "Gabung Selang-seling", + "Alternating and mixing pages...": "Menyelang-seling dan mencampur halaman...", + "Always resample to that resolution": "Selalu ubah resolusi ke nilai tersebut", + "An error occurred during compression. Error: {{error}}": "Terjadi kesalahan saat kompresi. Kesalahan: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Terjadi kesalahan saat konversi. Kesalahan: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Terjadi kesalahan saat konversi. Kesalahan: {{message}}", + "An error occurred during cropping.": "Terjadi kesalahan saat memotong.", + "An error occurred during extraction. Error: {{error}}": "Terjadi kesalahan saat ekstraksi. Kesalahan: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Terjadi kesalahan saat rasterisasi. Kesalahan: {{error}}", + "An error occurred during sanitization: {{msg}}": "Terjadi kesalahan saat sanitasi: {{msg}}", + "An error occurred while combining pages.": "Terjadi kesalahan saat menggabungkan halaman.", + "An error occurred while creating the N-Up PDF.": "Terjadi kesalahan saat membuat PDF N-Up.", + "An error occurred while creating the booklet.": "Terjadi kesalahan saat membuat buku kecil.", + "An error occurred while dividing the PDF.": "Terjadi kesalahan saat membagi PDF.", + "An error occurred while mixing the PDFs.": "Terjadi kesalahan saat mencampur PDF.", + "An error occurred while standardizing pages.": "Terjadi kesalahan saat menyeragamkan halaman.", + "An error occurred while trying to remove metadata.": "Terjadi kesalahan saat mencoba menghapus metadata.", + "An error occurred: {{error}}": "Terjadi kesalahan: {{error}}", + "An error occurred: {{error}}.": "Terjadi kesalahan: {{error}}.", + "An owner password is required when setting permissions": "Kata sandi pemilik diperlukan saat mengatur izin", + "An unexpected error occurred during the repair process.": "Terjadi kesalahan tak terduga saat proses perbaikan.", + "An unexpected error occurred.": "Terjadi kesalahan tak terduga.", + "Analyzing data structure...": "Menganalisis struktur data...", + "Analyzing full PDF metadata...": "Menganalisis metadata PDF lengkap...", + "Analyzing signatures...": "Menganalisis tanda tangan...", + "Angle": "Sudut", + "Annotations removed successfully!": "Anotasi berhasil dihapus!", + "Any text, URL, or data": "Teks, URL, atau data apa pun", + "Application": "Aplikasi", + "Apply a digital signature to PDF": "Terapkan tanda tangan digital pada PDF", + "Apply and download": "Terapkan dan unduh", + "Apply redactions?": "Terapkan redaksi?", + "Apply scanner simulation effect": "Terapkan efek simulasi pemindai", + "Applying Bates numbers...": "Menerapkan nomor Bates...", + "Applying color adjustments...": "Menerapkan penyesuaian warna...", + "Applying crop...": "Menerapkan pemotongan...", + "Applying redactions...": "Menerapkan redaksi...", + "Applying rotations...": "Menerapkan rotasi...", + "Applying scanner effect...": "Menerapkan efek pemindai...", + "Applying timestamp...": "Menerapkan stempel waktu...", + "Applying {{replace}}...": "Menerapkan {{replace}}...", + "Archive contains an oversized image entry.": "Arsip berisi entri gambar yang terlalu besar.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Arsip memiliki terlalu banyak gambar (maks {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Arsip terlalu besar setelah didekompresi.", + "Are you sure you want to reset? All your work will be lost.": "Yakin ingin mengatur ulang? Semua pekerjaan Anda akan hilang.", + "Area (Coordinates)": "Area (Koordinat)", + "Area ({{unit}}²)": "Area ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman, dan Courier New dipetakan ke padanan bawaan. Hanya diterapkan bila aman.", + "Arrange multiple pages per sheet": "Susun beberapa halaman per lembar", + "Arrange pages for booklet printing": "Susun halaman untuk pencetakan buku kecil", + "Aspect Ratio": "Rasio Aspek", + "At least one PDF document is required for export.": "Setidaknya satu dokumen PDF diperlukan untuk ekspor.", + "At least two valid PDFs are required.": "Setidaknya dua PDF yang valid diperlukan.", + "Attaching files to PDF...": "Melampirkan file ke PDF...", + "Attachments updated successfully!": "Lampiran berhasil diperbarui!", + "Author": "Penulis", + "Auto (Keep Original)": "Otomatis (Pertahankan Asli)", + "Back": "Belakang", + "Back to Home": "Kembali ke Beranda", + "Background Color": "Warna Latar Belakang", + "Background color changed successfully!": "Warna latar belakang berhasil diubah!", + "Barcode": "Barcode", + "Barcode Format": "Format Barcode", + "Barcode Value": "Nilai Barcode", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Nomor Bates berhasil diterapkan! ({{batesStart}} sampai {{n}})", + "Beginning": "Awal", + "Binarize": "Binerisasi", + "Blank Position": "Posisi Halaman Kosong", + "Blue": "Biru", + "Blur": "Buram", + "Bold": "Tebal", + "Bold & Italic": "Tebal & Miring", + "Booklet": "Buku Kecil", + "Booklet created with {{numSheets}} sheets!": "Buku kecil dibuat dengan {{numSheets}} lembar!", + "Bookmarks imported from JSON!": "Bookmark berhasil diimpor dari JSON!", + "Bookmarks page": "Halaman bookmark", + "Border": "Bingkai", + "Border Color": "Warna Bingkai", + "Bottom": "Bawah", + "Bottom Center": "Bawah Tengah", + "Bottom Left": "Bawah Kiri", + "Bottom Right": "Bawah Kanan", + "Bottom edge in points": "Tepi bawah dalam poin", + "Brightness": "Kecerahan", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli dan rasterisasi dilewati agar tetap PDF/A.", + "Brotli compression (PDF 2.0)": "Kompresi Brotli (PDF 2.0)", + "Browser Note:": "Catatan Browser:", + "Building new PDF...": "Membuat PDF baru...", + "Building page pairing model...": "Membangun model pemasangan halaman...", + "Button": "Tombol", + "ByteRange does not start at the beginning of the file": "ByteRange tidak dimulai dari awal file", + "ByteRange out of bounds": "ByteRange di luar batas", + "CBZ to PDF": "CBZ ke PDF", + "CSV Loaded": "CSV Dimuat", + "CSV file is empty": "File CSV kosong", + "Cancel": "Batal", + "Cannot Delete": "Tidak Dapat Menghapus", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Tidak dapat mengakses kontrol penampil. Gunakan tombol Unduh di toolbar penampil PDF di atas.", + "Cannot delete all pages": "Tidak dapat menghapus semua halaman", + "Cannot delete all pages.": "Tidak dapat menghapus semua halaman.", + "Canvas context failed": "Konteks kanvas gagal", + "Canvas context unavailable": "Konteks kanvas tidak tersedia", + "Canvas toBlob conversion failed.": "Konversi toBlob kanvas gagal.", + "Canvas toBlob failed": "toBlob kanvas gagal", + "Center": "Tengah", + "Certificate (.pfx, .p12, .pem)": "Sertifikat (.pfx, .p12, .pem)", + "Certificate Expired": "Sertifikat Kedaluwarsa", + "Certificate Password": "Kata Sandi Sertifikat", + "Certificate unlocked": "Sertifikat dibuka", + "Change Certificate": "Ganti Sertifikat", + "Change background color": "Ubah warna latar belakang", + "Changing background color...": "Mengubah warna latar belakang...", + "Changing text color...": "Mengubah warna teks...", + "Character": "Karakter", + "Checked State": "Status Dicentang", + "Choose a valid page range.": "Pilih rentang halaman yang valid.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Pilih salah satu bahasa bawaan atau bangun ulang bundel air-gapped dengan menambahkan bahasa yang kurang ke --ocr-languages.", + "Cleanup": "Pembersihan", + "Click on PDF to Pick Location": "Klik pada PDF untuk Memilih Lokasi", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Klik tombol di atas, lalu klik pada PDF di tempat yang ingin dituju bookmark", + "Click to Upload Image": "Klik untuk Mengunggah Gambar", + "Clicking this field in the PDF will open a file picker to upload an image.": "Mengeklik bidang ini di PDF akan membuka pemilih file untuk mengunggah gambar.", + "Clip invisible parts of images": "Potong bagian gambar yang tidak terlihat", + "Close": "Tutup", + "Close (Esc)": "Tutup (Esc)", + "Close panel": "Tutup panel", + "Closes tab": "Menutup tab", + "Closes window": "Menutup jendela", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (Bookmark & Metadata)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF belum dikonfigurasi. Konfigurasikan di Pengaturan WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF menghasilkan file hasil dekripsi yang kosong.", + "CoherentPDF: not configured.": "CoherentPDF: belum dikonfigurasi.", + "Color": "Warna", + "Color adjustments applied successfully!": "Penyesuaian warna berhasil diterapkan!", + "Colors inverted successfully!": "Warna berhasil dibalik!", + "Cols": "Kolom", + "Combine multiple PDFs into one": "Gabungkan beberapa PDF menjadi satu", + "Combine to Single Page": "Gabung ke Halaman Tunggal", + "Combining pages...": "Menggabungkan halaman...", + "Comic Archives": "Arsip Komik", + "Comments and markup become part of the page. Form fields and links keep working.": "Komentar dan markup menjadi bagian dari halaman. Bidang formulir dan tautan tetap berfungsi.", + "Complete": "Selesai", + "Complete!": "Selesai!", + "Compress": "Kompres", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF dikompres. Ukuran total berkurang dari {{totalOriginalSize}} menjadi {{totalCompressedSize}} (Hemat {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF dikompres. Ukuran total: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Mengompres beberapa PDF...", + "Compressing to {{size}}...": "Mengompres ke {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Mengompres {{n}}/{{length}}: {{name}}...", + "Compressing...": "Mengompres...", + "Compression Complete": "Kompresi Selesai", + "Compression Finished": "Kompresi Selesai", + "Compression Level": "Tingkat Kompresi", + "Configure": "Konfigurasi", + "Confirm": "Konfirmasi", + "Confirm Action": "Konfirmasi Tindakan", + "Conformance": "Kesesuaian", + "Connected": "Terhubung", + "Contact Info": "Info Kontak", + "Content": "Konten", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Hash konten tidak cocok dengan atribut messageDigest: PDF diubah setelah ditandatangani", + "Contrast": "Kontras", + "Conversion Complete": "Konversi Selesai", + "Conversion Error": "Kesalahan Konversi", + "Conversion engine ready!": "Mesin konversi siap!", + "Conversion failed: could not create PDF/A definition": "Konversi gagal: tidak dapat membuat definisi PDF/A", + "Convert Apple Pages documents to PDF": "Konversi dokumen Apple Pages ke PDF", + "Convert EPUB ebooks to PDF": "Konversi ebook EPUB ke PDF", + "Convert Excel spreadsheets to PDF": "Konversi spreadsheet Excel ke PDF", + "Convert FB2 e-books to PDF": "Konversi e-book FB2 ke PDF", + "Convert JSON files to PDF": "Konversi file JSON ke PDF", + "Convert MOBI e-books to PDF": "Konversi e-book MOBI ke PDF", + "Convert Markdown files to PDF": "Konversi file Markdown ke PDF", + "Convert Microsoft Publisher to PDF": "Konversi Microsoft Publisher ke PDF", + "Convert OpenDocument Graphics to PDF": "Konversi OpenDocument Graphics ke PDF", + "Convert PDF pages to SVG": "Konversi halaman PDF ke SVG", + "Convert PDF pages to images (ZIP)": "Konversi halaman PDF ke gambar (ZIP)", + "Convert PDF tables to CSV": "Konversi tabel PDF ke CSV", + "Convert PDF tables to Excel": "Konversi tabel PDF ke Excel", + "Convert PDF to Markdown text": "Konversi PDF ke teks Markdown", + "Convert PDF to PDF/A for archiving": "Konversi PDF ke PDF/A untuk pengarsipan", + "Convert PDF to Word document": "Konversi PDF ke dokumen Word", + "Convert PowerPoint presentations to PDF": "Konversi presentasi PowerPoint ke PDF", + "Convert SVG files to PDF": "Konversi file SVG ke PDF", + "Convert To Grayscale": "Konversi ke Skala Abu-abu", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Konversi diagram Visio (VSD/VSDX) ke PDF", + "Convert WPS Office documents to PDF": "Konversi dokumen WPS Office ke PDF", + "Convert Word documents to PDF": "Konversi dokumen Word ke PDF", + "Convert WordPerfect documents to PDF": "Konversi dokumen WordPerfect ke PDF", + "Convert XML documents to PDF": "Konversi dokumen XML ke PDF", + "Convert XPS/OXPS documents to PDF": "Konversi dokumen XPS/OXPS ke PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Konversi arsip buku komik (CBZ/CBR) ke PDF", + "Convert email files (.eml, .msg) to PDF": "Konversi file email (.eml, .msg) ke PDF", + "Convert fonts to vector outlines": "Konversi font menjadi garis tepi vektor", + "Convert plain text to PDF": "Konversi teks biasa ke PDF", + "Convert to grayscale": "Konversi ke skala abu-abu", + "Convert to greyscale": "Konversi ke skala abu-abu", + "Convert to image-based PDF": "Konversi ke PDF berbasis gambar", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} file ({{totalPages}} halaman) dikonversi ke SVG!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} halaman dikonversi ke SVG!", + "Converter not initialized": "Konverter belum diinisialisasi", + "Converting BMP to PDF...": "Mengonversi BMP ke PDF...", + "Converting HEIC to PDF...": "Mengonversi HEIC ke PDF...", + "Converting TIFF to PDF...": "Mengonversi TIFF ke PDF...", + "Converting emails...": "Mengonversi email...", + "Converting files...": "Mengonversi file...", + "Converting fonts to outlines...": "Mengonversi font menjadi garis tepi...", + "Converting images to PDF...": "Mengonversi gambar ke PDF...", + "Converting multiple PDFs to PDF/A...": "Mengonversi beberapa PDF ke PDF/A...", + "Converting multiple RTF files to PDF...": "Mengonversi beberapa file RTF ke PDF...", + "Converting multiple files...": "Mengonversi beberapa file...", + "Converting page {{n}} of {{pageCount}}...": "Mengonversi halaman {{n}} dari {{pageCount}}...", + "Converting to Markdown...": "Mengonversi ke Markdown...", + "Converting to SVG...": "Mengonversi ke SVG...", + "Converting to greyscale...": "Mengonversi ke skala abu-abu...", + "Converting to {{level}}...": "Mengonversi ke {{level}}...", + "Converting {{name}}...": "Mengonversi {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Mengonversi {{n}}/{{length}}: {{name}}...", + "Converting...": "Mengonversi...", + "Copied": "Disalin", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Tidak dapat mengakses pengekspor PDF bercap. Gunakan tombol Ekspor → PDF di toolbar penampil sebagai alternatif.", + "Could not add blank page.": "Tidak dapat menambahkan halaman kosong.", + "Could not add blank pages.": "Tidak dapat menambahkan halaman kosong.", + "Could not add header or footer.": "Tidak dapat menambahkan header atau footer.", + "Could not add page numbers.": "Tidak dapat menambahkan nomor halaman.", + "Could not add the watermark.": "Tidak dapat menambahkan watermark.", + "Could not apply rotations.": "Tidak dapat menerapkan rotasi.", + "Could not change text color.": "Tidak dapat mengubah warna teks.", + "Could not change the background color.": "Tidak dapat mengubah warna latar belakang.", + "Could not create ZIP archive.": "Tidak dapat membuat arsip ZIP.", + "Could not create canvas context.": "Tidak dapat membuat konteks kanvas.", + "Could not create comparison canvas context.": "Tidak dapat membuat konteks kanvas perbandingan.", + "Could not create offscreen comparison canvas.": "Tidak dapat membuat kanvas perbandingan offscreen.", + "Could not create visual diff context.": "Tidak dapat membuat konteks visual diff.", + "Could not create visual diff overlay context.": "Tidak dapat membuat konteks overlay visual diff.", + "Could not detect blank pages.": "Tidak dapat mendeteksi halaman kosong.", + "Could not display the page.": "Tidak dapat menampilkan halaman.", + "Could not export comparison PDF.": "Tidak dapat mengekspor PDF perbandingan.", + "Could not export the signed PDF. Please try again.": "Tidak dapat mengekspor PDF yang ditandatangani. Silakan coba lagi.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Tidak dapat mengekspor PDF bercap. Gunakan tombol Ekspor → PDF di toolbar penampil sebagai alternatif.", + "Could not extract signer public key": "Tidak dapat mengekstrak kunci publik penanda tangan", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Tidak dapat menemukan {{testFile}} di URL yang ditentukan (HTTP {{status}}). Pastikan file tersebut ada.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Tidak dapat menganalisis PDF sepenuhnya. File mungkin rusak atau memiliki struktur yang tidak biasa.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Tidak dapat membuat pratinjau. File mungkin rusak atau berisi fitur yang tidak didukung. Kesalahan: {{message}}", + "Could not get canvas context": "Tidak dapat mengambil konteks kanvas", + "Could not invert PDF colors.": "Tidak dapat membalik warna PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Tidak dapat memuat PDF. File mungkin rusak atau dilindungi kata sandi.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Tidak dapat memuat PDF. File mungkin tidak valid, rusak, atau dilindungi kata sandi.", + "Could not load the PDF engine. Please refresh the page and try again.": "Tidak dapat memuat mesin PDF. Silakan muat ulang halaman dan coba lagi.", + "Could not parse signer info": "Tidak dapat membaca info penandatangan", + "Could not posterize the PDF.": "Tidak dapat memposterisasi PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Tidak dapat memproses \"{{name}}\". File mungkin rusak.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Tidak dapat memperkecil ukuran file lebih lanjut. Asli: {{originalSize}}, Baru: {{compressedSize}}.", + "Could not remove annotations.": "Tidak dapat menghapus anotasi.", + "Could not remove blank pages.": "Tidak dapat menghapus halaman kosong.", + "Could not remove leftover data from the PDF.": "Tidak dapat menghapus data sisa dari PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Tidak dapat menghapus teks yang disamarkan dari data dokumen, sehingga file tidak diunduh.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Tidak dapat membalik urutan halaman PDF. Pastikan file Anda adalah PDF yang valid.", + "Could not update metadata. Please check that date formats are correct.": "Tidak dapat memperbarui metadata. Pastikan format tanggal sudah benar.", + "Count": "Jumlah", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Dibuat", + "Creating Booklet...": "Membuat buklet...", + "Creating Excel file...": "Membuat file Excel...", + "Creating N-Up PDF...": "Membuat PDF N-Up...", + "Creating PDF from JPGs...": "Membuat PDF dari JPG...", + "Creating PDF from SVG files...": "Membuat PDF dari file SVG...", + "Creating PDF...": "Membuat PDF...", + "Creating ZIP archive...": "Membuat arsip ZIP...", + "Creating ZIP file...": "Membuat file ZIP...", + "Creating ZIP...": "Membuat ZIP...", + "Creating table...": "Membuat tabel...", + "Creator": "Pembuat", + "Crop": "Pangkas", + "Crop complete! Your download has started.": "Pemangkasan selesai! Unduhan Anda telah dimulai.", + "Cryptographic verification failed": "Verifikasi kriptografi gagal", + "Custom": "Kustom", + "Custom Format": "Format Kustom", + "Custom Height": "Tinggi Kustom", + "Custom Units": "Satuan Kustom", + "Custom Width": "Lebar Kustom", + "Custom Zoom": "Zoom Kustom", + "Custom...": "Kustom...", + "DataMatrix": "DataMatrix", + "Date Format": "Format Tanggal", + "Decrease size": "Perkecil ukuran", + "Decrypt": "Dekripsi", + "Decrypting PDF...": "Mendekripsi PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Mendekripsi {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Mendekripsi {{n}} dari {{length}}: {{name}}", + "Decrypting...": "Mendekripsi...", + "Decryption Failed": "Dekripsi Gagal", + "Delete": "Hapus", + "Delete \"{{title}}\"?": "Hapus \"{{title}}\"?", + "Delete Field": "Hapus Kolom", + "Delete Page": "Hapus Halaman", + "Delete Pages": "Hapus Halaman", + "Delete all {{length}} bookmark(s) ? ": "Hapus semua {{length}} bookmark?", + "Delete layer": "Hapus layer", + "Delete {{size}} bookmark(s) ? ": "Hapus {{size}} bookmark?", + "Deleted": "Dihapus", + "Deleted {{size}} page(s) successfully!": "Berhasil menghapus {{size}} halaman!", + "Deleting pages...": "Menghapus halaman...", + "Description": "Deskripsi", + "Description for screen readers": "Deskripsi untuk pembaca layar", + "Deselect All": "Batalkan Pilih Semua", + "Deskew": "Luruskan", + "Deskew PDF": "Luruskan PDF", + "Deskewed {{length}} file(s). {{value}}": "Meluruskan {{length}} file. {{value}}", + "Deskewing {{name}}...": "Meluruskan {{name}}...", + "Destination": "Tujuan", + "Detecting blank pages...": "Mendeteksi halaman kosong...", + "Digest Algorithm:": "Algoritma Digest:", + "Digital Sign": "Tanda Tangan Digital", + "Direction": "Arah", + "Divide Pages": "Bagi Halaman", + "Divide into boxes (0 to disable)": "Bagi menjadi kotak (0 untuk menonaktifkan)", + "Document Properties": "Properti Dokumen", + "Document Type": "Jenis Dokumen", + "Document properties": "Properti dokumen", + "Document-level attachment": "Lampiran tingkat dokumen", + "Done: back to tools": "Selesai, kembali ke alat", + "Download": "Unduh", + "Download Edited PDF": "Unduh PDF yang Diedit", + "Download anyway": "Tetap unduh", + "Download as PDF or ZIP automatically": "Unduh otomatis sebagai PDF atau ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Mengunduh {{length}} file PDF dalam arsip ZIP.", + "Downloads started for all files.": "Unduhan dimulai untuk semua file.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Menghapus tag, yang diandalkan oleh pembaca layar.", + "Duplicate Field Name": "Nama Kolom Duplikat", + "Duplicate Field Names": "Nama Kolom Duplikat", + "Duplicate Page": "Duplikat Halaman", + "Duplicate Page Numbers": "Nomor Halaman Duplikat", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Tanda tangan ECDSA tidak cocok dengan kunci publik penandatangan", + "EPUB Files": "File EPUB", + "EPUB to PDF": "EPUB ke PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ ke PDF", + "Edit": "Edit", + "Edit All": "Edit Semua", + "Edit Bookmark": "Edit Bookmark", + "Edit Bookmarks": "Edit Bookmark", + "Edit Images": "Edit Gambar", + "Edit Metadata": "Edit Metadata", + "Edit PDF metadata": "Edit metadata PDF", + "Edit Scope": "Cakupan Edit", + "Edit Shapes": "Edit Bentuk", + "Edit Text": "Edit Teks", + "Edit tool": "Alat edit", + "Edit {{scopes}}": "Edit {{scopes}}", + "Email Files": "File Email", + "Email to PDF": "Email ke PDF", + "Embedding files into PDF...": "Menyematkan file ke PDF...", + "Empty signature bytes": "Byte tanda tangan kosong", + "Encrypt": "Enkripsi", + "Encrypt PDF with password": "Enkripsi PDF dengan kata sandi", + "Encrypted file": "File terenkripsi", + "Encrypting PDF with 256-bit AES...": "Mengenkripsi PDF dengan AES 256-bit...", + "Encryption Failed": "Enkripsi Gagal", + "Encryption resulted in an empty file.": "Enkripsi menghasilkan file kosong.", + "End": "Akhir", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Masukkan 0 untuk menyisipkan di awal, atau {{pageCount}} untuk menyisipkan di akhir.", + "Enter bookmark title": "Masukkan judul bookmark", + "Enter name for child layer under \"{{Layer}}\":": "Masukkan nama untuk layer turunan di bawah \"{{Layer}}\":", + "Enter password": "Masukkan kata sandi", + "Enter password...": "Masukkan kata sandi...", + "Enter passwords for each encrypted file": "Masukkan kata sandi untuk setiap file terenkripsi", + "Error": "Kesalahan", + "Error during execution": "Kesalahan saat eksekusi", + "Error generating PDF: {{error}}": "Kesalahan saat membuat PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Kesalahan saat memuat file PDF. Silakan coba lagi dengan PDF yang valid.", + "Error reading files: {{error}}": "Kesalahan saat membaca file: {{error}}", + "Error saving PDF. Check console for details.": "Kesalahan saat menyimpan PDF. Periksa konsol untuk detailnya.", + "Error: {{error}}": "Kesalahan: {{error}}", + "Exactly 11 or 12 digits": "Tepat 11 atau 12 digit", + "Exactly 12 or 13 digits": "Tepat 12 atau 13 digit", + "Example of current format:": "Contoh format saat ini:", + "Excel to PDF": "Excel ke PDF", + "Existing Radio Groups": "Grup Radio yang Ada", + "Export Error": "Kesalahan Ekspor", + "Export Value": "Nilai Ekspor", + "Export failed": "Ekspor gagal", + "External processing module needed": "Modul pemrosesan eksternal diperlukan", + "Extract Images": "Ekstrak Gambar", + "Extract Pages": "Ekstrak Halaman", + "Extract Tables": "Ekstrak Tabel", + "Extract a range of pages": "Ekstrak rentang halaman", + "Extract all images from PDF": "Ekstrak semua gambar dari PDF", + "Extract pages as separate PDFs": "Ekstrak halaman sebagai PDF terpisah", + "Extract text from PDF": "Ekstrak teks dari PDF", + "Extracted 1 table successfully!": "Berhasil mengekstrak 1 tabel!", + "Extracted text from {{length}} PDF files!": "Teks diekstrak dari {{length}} file PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Mengekstrak {{completed}} PDF, {{failed}} gagal.", + "Extracted {{length}} page(s) successfully!": "Berhasil mengekstrak {{length}} halaman!", + "Extracted {{length}} table(s) to Excel!": "Mengekstrak {{length}} tabel ke Excel!", + "Extracted {{length}} tables successfully!": "Berhasil mengekstrak {{length}} tabel!", + "Extracting attachments from {{length}} file(s)...": "Mengekstrak lampiran dari {{length}} file...", + "Extracting images from {{name}}...": "Mengekstrak gambar dari {{name}}...", + "Extracting pages...": "Mengekstrak halaman...", + "Extracting tables...": "Mengekstrak tabel...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Mengekstrak teks dari file {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Mengekstrak teks dari beberapa file...", + "Extracting text from {{name}}...": "Mengekstrak teks dari {{name}}...", + "Extracting text...": "Mengekstrak teks...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Mengekstrak {{name}} untuk AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Mengekstrak {{name}} untuk AI...", + "Extracting...": "Mengekstrak...", + "Extraction Complete": "Ekstraksi Selesai", + "Extraction Error": "Kesalahan Ekstraksi", + "Extraction Partial": "Ekstraksi Sebagian", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Ekstraksi selesai! {{length}} lampiran dalam file ZIP ({{totalSize}}). Unduhan dimulai.", + "FB2 Files": "File FB2", + "FB2 to PDF": "FB2 ke PDF", + "Failed": "Gagal", + "Failed to acquire 2D canvas context": "Gagal mengambil konteks kanvas 2D", + "Failed to add child layer": "Gagal menambahkan layer turunan", + "Failed to apply Bates numbers.": "Gagal menerapkan nomor Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "Gagal menerapkan penyesuaian warna. File mungkin rusak.", + "Failed to apply redactions.": "Gagal menerapkan redaksi.", + "Failed to apply scanner effect. The file might be corrupted.": "Gagal menerapkan efek pemindai. File mungkin rusak.", + "Failed to attach files: {{error}}": "Gagal melampirkan file: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Gagal mengonversi BMP ke PDF. Salah satu file mungkin tidak valid.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Gagal mengonversi HEIC ke PDF. Salah satu file mungkin tidak valid.", + "Failed to convert PDF to CSV. {{message}}": "Gagal mengonversi PDF ke CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Gagal mengonversi PDF ke Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Gagal mengonversi PDF ke SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Gagal mengonversi PDF ke skala abu-abu. File mungkin rusak.", + "Failed to convert PDF. It may be image-based or corrupted.": "Gagal mengonversi PDF. File mungkin berbasis gambar atau rusak.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Gagal mengonversi TIFF ke PDF. Salah satu file mungkin tidak valid.", + "Failed to convert images to PDF.": "Gagal mengonversi gambar ke PDF.", + "Failed to convert text to PDF. {{error}}": "Gagal mengonversi teks ke PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Gagal mengonversi {{filename}} ke PNG", + "Failed to copy metadata to clipboard.": "Gagal menyalin metadata ke papan klip.", + "Failed to create PDF.": "Gagal membuat PDF.", + "Failed to create PNG blob": "Gagal membuat blob PNG", + "Failed to create canvas context": "Gagal membuat konteks kanvas", + "Failed to create split PDFs.": "Gagal membuat PDF hasil pemisahan.", + "Failed to decode image: {{name}}": "Gagal mendekode gambar: {{name}}", + "Failed to decrypt private key": "Gagal mendekripsi kunci privat", + "Failed to decrypt. Try the Decrypt tool instead.": "Gagal mendekripsi. Coba gunakan alat Dekripsi.", + "Failed to delete layer": "Gagal menghapus layer", + "Failed to delete pages.": "Gagal menghapus halaman.", + "Failed to deskew PDF: {{error}}": "Gagal meluruskan PDF: {{error}}", + "Failed to download the edited PDF.": "Gagal mengunduh PDF yang diedit.", + "Failed to edit attachments.": "Gagal mengedit lampiran.", + "Failed to extract certificate from PFX file": "Gagal mengekstrak sertifikat dari file PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Gagal mengekstrak halaman (kode keluar qpdf {{exitCode}}).", + "Failed to extract pages.": "Gagal mengekstrak halaman.", + "Failed to extract tables. {{message}}": "Gagal mengekstrak tabel. {{message}}", + "Failed to extract text from PDF.": "Gagal mengekstrak teks dari PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Gagal mengambil profil ICC dari {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Gagal mengambil file font: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Gagal mengambil gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Gagal mengambil {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Gagal mengambil konteks 2D untuk halaman {{pageNumber}}", + "Failed to get canvas context": "Gagal mengambil konteks kanvas", + "Failed to insert PDF. The file may be corrupted.": "Gagal menyisipkan PDF. File mungkin rusak.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Gagal memuat Ghostscript dari {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Gagal memuat file PDF.", + "Failed to load PDF for cropping.": "Gagal memuat PDF untuk dipangkas.", + "Failed to load PDF for preview.": "Gagal memuat PDF untuk pratinjau.", + "Failed to load PDF form viewer.": "Gagal memuat penampil formulir PDF.", + "Failed to load PDF layers": "Gagal memuat layer PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Gagal memuat PyMuPDF dari CDN: {{msg}}", + "Failed to load SVG image": "Gagal memuat gambar SVG", + "Failed to load WebP image": "Gagal memuat gambar WebP", + "Failed to load attachments from PDF.": "Gagal memuat lampiran dari PDF.", + "Failed to load files: {{error}}": "Gagal memuat file: {{error}}", + "Failed to load image.": "Gagal memuat gambar.", + "Failed to load image: {{filename}}": "Gagal memuat gambar: {{filename}}", + "Failed to load one or more PDF files.": "Gagal memuat satu atau beberapa file PDF.", + "Failed to load script: {{url}}": "Gagal memuat skrip: {{url}}", + "Failed to load template.": "Gagal memuat templat.", + "Failed to load the PDF Editor.": "Gagal memuat Editor PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Gagal memuat pemroses gambar. Pastikan browser Anda mendukung SharedArrayBuffer (memerlukan HTTPS atau localhost).", + "Failed to parse CSV: {{error}}": "Gagal mengurai CSV: {{error}}", + "Failed to parse signature": "Gagal mengurai tanda tangan", + "Failed to parse the certificate file.": "Gagal mengurai file sertifikat.", + "Failed to process HEIC file: {{name}}": "Gagal memproses file HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Gagal memproses file WebP: {{name}}", + "Failed to read file.": "Gagal membaca file.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Gagal menghapus pembatasan. PDF mungkin memerlukan kata sandi pemilik yang benar.", + "Failed to render page": "Gagal merender halaman", + "Failed to render page previews": "Gagal merender pratinjau halaman", + "Failed to render page previews.": "Gagal merender pratinjau halaman.", + "Failed to render page.": "Gagal merender halaman.", + "Failed to save changes.": "Gagal menyimpan perubahan.", + "Failed to save the new PDF. Check console for details.": "Gagal menyimpan PDF baru. Periksa konsol untuk detailnya.", + "Failed to split PDF. Please check your selection.": "Gagal memisahkan PDF. Silakan periksa pilihan Anda.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Gagal memberi stempel waktu pada PDF: {{message}}\n\nSilakan coba server TSA lain atau periksa koneksi internet Anda.", + "Failed to toggle layer visibility": "Gagal mengubah visibilitas layer", + "Failed to validate signatures. The file may be corrupted.": "Gagal memvalidasi tanda tangan. File mungkin rusak.", + "Features enabled by this module:": "Fitur yang diaktifkan oleh modul ini:", + "Field Name": "Nama Kolom", + "Field Name (Group Name)": "Nama Kolom (Nama Grup)", + "Field Name Conflict": "Konflik Nama Kolom", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Nama kolom \"{{newName}}\" sudah ada di {{value}} ini. Silakan gunakan nama yang unik.", + "Field name cannot be empty": "Nama kolom tidak boleh kosong", + "File": "File", + "File Size": "Ukuran File", + "File exists but could not be read. Check CORS configuration.": "File ada tetapi tidak dapat dibaca. Periksa konfigurasi CORS.", + "File list not found": "Daftar file tidak ditemukan", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Ukuran file berkurang dari {{originalSize}} menjadi {{compressedSize}} (Hemat {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "File {{n}}/{{length}}: Halaman {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "File {{n}}/{{length}}: {{message}}", + "Filename": "Nama file", + "Files that failed: {{errorCount}}.": "File yang gagal: {{errorCount}}.", + "Fill (cover full target page)": "Isi (menutupi seluruh halaman target)", + "Fill Color": "Warna Isian", + "Finalizing PDF...": "Menyelesaikan PDF...", + "Find & replace": "Cari & ganti", + "Finds the best quality under this size. 0 means no target.": "Mencari kualitas terbaik di bawah ukuran ini. 0 berarti tanpa target.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox dan Chrome mungkin menampilkan format pemilih tanggal bawaannya saat memilih. Format yang benar akan diterapkan setelah Anda selesai memasukkan tanggal.", + "First Indent": "Indentasi Baris Pertama", + "Fit (keep full page visible)": "Pas (seluruh halaman tetap terlihat)", + "Fit Page": "Pas Halaman", + "Fix Page Size": "Perbaiki Ukuran Halaman", + "Flatten": "Ratakan", + "Flatten Forms": "Ratakan Formulir", + "Flatten annotations": "Ratakan anotasi", + "Flatten form fields": "Ratakan kolom formulir", + "Flatten forms and annotations": "Ratakan formulir dan anotasi", + "Flatten links": "Ratakan tautan", + "Flattening PDF...": "Meratakan PDF...", + "Flattening and saving PDF...": "Meratakan dan menyimpan PDF...", + "Flattening multiple PDFs...": "Meratakan beberapa PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Meratakan halaman {{i}} dari {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Meratakan {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Memfokuskan bilah alamat", + "Font": "Font", + "Font Color": "Warna Font", + "Font Family": "Keluarga Font", + "Font Size": "Ukuran Font", + "Font size: {{bSize}} → {{aSize}}": "Ukuran font: {{bSize}} → {{aSize}}", + "Font to Outline": "Font ke Kontur", + "Font: {{bFont}} → {{aFont}}": "Font: {{bFont}} → {{aFont}}", + "Fonts": "Font", + "Footer Center": "Footer Tengah", + "Footer Left": "Footer Kiri", + "Footer Right": "Footer Kanan", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Untuk PDF berisi gambar saja seperti hasil pindai. Dilewati jika dokumen memiliki teks yang dapat dipilih, kecuali Timpa perlindungan konten diaktifkan.", + "Form fields stop being fillable.": "Kolom formulir tidak lagi dapat diisi.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Ditemukan {{length}} halaman kosong. Klik halaman untuk membatalkan pilihannya.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Ditemukan {{length}} bookmark yang ada. Ganti bookmark saat ini?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Ditemukan {{length}} gambar di {{length2}} PDF.", + "Front": "Depan", + "Full Coverage": "Cakupan Penuh", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Buat daftar isi dari bookmark", + "Generating High-Quality PDF...": "Membuat PDF Berkualitas Tinggi...", + "Generating PDF...": "Membuat PDF...", + "Generating ZIP file...": "Membuat file ZIP...", + "Generating formatted content...": "Membuat konten terformat...", + "Generating preview...": "Membuat pratinjau...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (Konversi PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Konversi RGB Ghostscript gagal dengan kode keluar {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Konversi Ghostscript gagal dengan kode keluar {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript tidak menghasilkan file keluaran", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript belum dikonfigurasi. Silakan konfigurasikan di Pengaturan Lanjutan.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript belum dikonfigurasi. Silakan konfigurasikan di Pengaturan WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript belum dikonfigurasi. PyMuPDF memerlukan Ghostscript untuk beberapa operasi. Silakan konfigurasikan keduanya di Pengaturan Lanjutan.", + "Ghostscript threw an exception: {{e}}": "Ghostscript mengalami pengecualian: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Wrapper Ghostscript tidak menyediakan antarmuka yang diharapkan. Diharapkan loadGS() atau kelas GhostscriptWASM.", + "Go": "Buka", + "Go to page": "Buka halaman", + "Grayscale": "Skala Abu-abu", + "Green": "Hijau", + "Greyscale": "Skala Abu-abu", + "Grid Mode": "Mode Kisi", + "Group Name (Must be same for group)": "Nama Grup (Harus sama untuk satu grup)", + "H-Scale %": "Skala H %", + "Hanging Indent": "Indentasi Menggantung", + "Hard reloads page": "Memuat ulang halaman secara paksa", + "Header & Footer": "Kepala & Kaki Halaman", + "Header & Footer added successfully!": "Kepala & kaki halaman berhasil ditambahkan!", + "Header Center": "Header Tengah", + "Header Left": "Header Kiri", + "Header Right": "Header Kanan", + "Height ({{unit}})": "Tinggi ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Sembunyikan", + "Hide Border": "Sembunyikan Batas", + "Hide password": "Sembunyikan kata sandi", + "Hides window": "Menyembunyikan jendela", + "High (288 DPI)": "Tinggi (288 DPI)", + "High (Smallest Files)": "Tinggi (File Terkecil)", + "Horizontal": "Horizontal", + "Hue Shift": "Pergeseran Rona", + "Image Format": "Format Gambar", + "Image Input": "Masukan Gambar", + "Image quality": "Kualitas gambar", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Ukuran gambar diubah dari {{width}}×{{height}} menjadi {{width2}}×{{height2}}", + "Images": "Gambar", + "Images above this are resampled down. None leaves resolution alone.": "Gambar di atas nilai ini akan diperkecil resolusinya. Pilih Tidak Ada untuk membiarkan resolusi apa adanya.", + "Imported {{length}} bookmarks!": "Berhasil mengimpor {{length}} bookmark!", + "Inches (in)": "Inci (in)", + "Include Attachments": "Sertakan Lampiran", + "Include Cc Bcc": "Sertakan Cc Bcc", + "Include this file": "Sertakan file ini", + "Incorrect Page Count": "Jumlah Halaman Salah", + "Incorrect Password": "Kata Sandi Salah", + "Incorrect password": "Kata sandi salah", + "Incorrect password. Please try again.": "Kata sandi salah. Silakan coba lagi.", + "Increase size": "Perbesar ukuran", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Mengindeks PDF 1 halaman {{pageNumber}} dari {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Mengindeks PDF 2 halaman {{pageNumber}} dari {{totalPages}}...", + "Info": "Info", + "Info Dictionary": "Kamus Info", + "Inherit": "Warisi", + "Initialization Error": "Kesalahan Inisialisasi", + "Initializing Ghostscript...": "Menginisialisasi Ghostscript...", + "Initializing PDF engine...": "Menginisialisasi mesin PDF...", + "Initializing PyMuPDF...": "Menginisialisasi PyMuPDF...", + "Initializing decryption...": "Menginisialisasi dekripsi...", + "Initializing encryption...": "Menginisialisasi enkripsi...", + "Initializing repair engine...": "Menginisialisasi mesin perbaikan...", + "Initializing...": "Menginisialisasi...", + "Input Required": "Masukan Diperlukan", + "Insecure Digest (MD5 / SHA-1)": "Digest Tidak Aman (MD5 / SHA-1)", + "Insert blank pages": "Sisipkan halaman kosong", + "Insert blank pages after this page number": "Sisipkan halaman kosong setelah nomor halaman ini", + "Interactive Form Fields": "Kolom Formulir Interaktif", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Selang-seling halaman dari beberapa PDF (mis. ganjil + genap terbalik dari satu pindaian satu sisi)", + "Invalid Certificate": "Sertifikat Tidak Valid", + "Invalid File": "File Tidak Valid", + "Invalid Files": "File Tidak Valid", + "Invalid Input": "Masukan Tidak Valid", + "Invalid JSON format": "Format JSON tidak valid", + "Invalid Name": "Nama Tidak Valid", + "Invalid Order": "Urutan Tidak Valid", + "Invalid PDF password.": "Kata sandi PDF tidak valid.", + "Invalid Page Numbers": "Nomor Halaman Tidak Valid", + "Invalid Page Order": "Urutan Halaman Tidak Valid", + "Invalid Pages": "Halaman Tidak Valid", + "Invalid Range": "Rentang Tidak Valid", + "Invalid Signature": "Tanda Tangan Tidak Valid", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL TSA tidak valid. Otoritas stempel waktu harus berupa URL http:// atau https:// yang valid.", + "Invalid URL": "URL Tidak Valid", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Format URL tidak valid. Silakan masukkan URL yang valid (mis. https://example.com/wasm/)", + "Invalid XML: no root element": "XML tidak valid: tidak ada elemen akar", + "Invalid data": "Data tidak valid", + "Invalid hex string in content stream": "String hex tidak valid di aliran konten", + "Invalid page range specified.": "Rentang halaman yang ditentukan tidak valid.", + "Invalid shortcut format": "Format pintasan tidak valid", + "Invalid: Cryptographic Verification Failed": "Tidak valid: Verifikasi Kriptografi Gagal", + "Invert Colors": "Balik Warna", + "Invert all colors": "Balik semua warna", + "Inverting PDF colors...": "Membalik warna PDF...", + "Issuer": "Penerbit", + "It fits the {{targetBytes}} target.": "Sesuai dengan target {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Ukurannya masih di atas target {{targetBytes}} karena Pertahankan PDF/A membatasi seberapa jauh file dapat dikompres.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "File ini tidak lagi mengklaim kesesuaian PDF/A. Aktifkan Pertahankan PDF/A di Pengaturan Kustom untuk mempertahankannya.", + "Italic": "Miring", + "Item 1": "Item 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Tanda tangan digitalnya dihapus agar dapat dikompres. Tanda tangani lagi jika perlu.", + "JPEG (Smaller file size)": "JPEG (Ukuran file lebih kecil)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Kualitas JPEG untuk gambar yang dienkode ulang, 20 hingga 100. Semakin rendah, semakin kecil file dan semakin terlihat artefaknya.", + "JPG": "JPG", + "JSON Files": "File JSON", + "JSON Loaded": "JSON Dimuat", + "JSON to PDF": "JSON ke PDF", + "Javascript Code": "Kode JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Menjaga file PDF/A tetap sesuai standar. Brotli dan rasterisasi dilewati saat opsi ini aktif.", + "Keeps only the characters the document uses.": "Hanya mempertahankan karakter yang digunakan dokumen.", + "Key (e.g., Department)": "Kunci (mis., Departemen)", + "Keywords": "Kata Kunci", + "Label": "Label", + "Label / Prompt": "Label / Petunjuk", + "Landscape": "Lanskap", + "Language": "Bahasa", + "Layer not found": "Lapisan tidak ditemukan", + "Layer {{number}}": "Lapisan {{number}}", + "Leave blank for all pages": "Kosongkan untuk semua halaman", + "Left": "Kiri", + "Left edge in points (1 inch = 72 pts)": "Tepi kiri dalam poin (1 inci = 72 poin)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Tingkat", + "Limit recognized characters (leave empty for all)": "Batasi karakter yang dikenali (kosongkan untuk semua)", + "Line": "Garis", + "Linearization Failed": "Linearisasi Gagal", + "Linearize": "Linearisasi", + "Links stop being clickable.": "Tautan tidak lagi dapat diklik.", + "Lists": "Daftar", + "Load": "Muat", + "Load system fonts": "Muat font sistem", + "Load system fonts…": "Muat font sistem…", + "Loaded": "Dimuat", + "Loaded bookmarks from JSON. Now upload your PDF.": "Bookmark dimuat dari JSON. Sekarang unggah PDF Anda.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} bookmark dimuat dari CSV. Sekarang unggah PDF Anda.", + "Loading Engine...": "Memuat Mesin...", + "Loading Ghostscript...": "Memuat Ghostscript...", + "Loading PDF Editor...": "Memuat Editor PDF...", + "Loading PDF Text Editor...": "Memuat Editor Teks PDF...", + "Loading PDF converter...": "Memuat pengonversi PDF...", + "Loading PDF documents...": "Memuat dokumen PDF...", + "Loading PDF engine...": "Memuat mesin PDF...", + "Loading PDF files...": "Memuat file PDF...", + "Loading PDF form...": "Memuat formulir PDF...", + "Loading PDF processor...": "Memuat pemroses PDF...", + "Loading PDF viewer...": "Memuat penampil PDF...", + "Loading PDF...": "Memuat PDF...", + "Loading PDFs...": "Memuat PDF...", + "Loading attachments...": "Memuat lampiran...", + "Loading comparison {{currentPage}} of {{length}}...": "Memuat perbandingan {{currentPage}} dari {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Memuat mesin konversi ({{percent}}%)...", + "Loading conversion engine...": "Memuat mesin konversi...", + "Loading engine...": "Memuat mesin...", + "Loading fonts...": "Memuat font...", + "Loading layers from {{name}}...": "Memuat layer dari {{name}}...", + "Loading page {{num}}...": "Memuat halaman {{num}}...", + "Loading preview...": "Memuat pratinjau...", + "Loading {{name}}...": "Memuat {{name}}...", + "Loading...": "Memuat...", + "Location": "Lokasi", + "Lossless (No Quality Loss)": "Lossless (Tanpa Kehilangan Kualitas)", + "Lossless (no image re-encoding)": "Lossless (tanpa pengenkodean ulang gambar)", + "Low (Best Quality)": "Rendah (Kualitas Terbaik)", + "MOBI Files": "File MOBI", + "MOBI to PDF": "MOBI ke PDF", + "Malformed ByteRange": "ByteRange rusak", + "Malformed ECDSA signature (could not parse r,s)": "Tanda tangan ECDSA rusak (tidak dapat mengurai r,s)", + "Malformed inline image in content stream": "Gambar inline rusak di aliran konten", + "Malformed signatureAlgorithm": "signatureAlgorithm rusak", + "Margins": "Margin", + "Markdown Files": "File Markdown", + "Markdown to PDF": "Markdown ke PDF", + "Max Length (0 for unlimited)": "Panjang Maks (0 untuk tanpa batas)", + "Maximum resolution": "Resolusi maksimum", + "Medium (Recommended)": "Sedang (Disarankan)", + "Merge PDF": "Gabung PDF", + "Merge PDFs": "Gabung PDF", + "Merge duplicate fonts": "Gabungkan font duplikat", + "Mermaid Error: {{error}}": "Kesalahan Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadata disalin ke papan klip sebagai JSON.", + "Metadata removed successfully!": "Metadata berhasil dihapus!", + "Metadata updated successfully!": "Metadata berhasil diperbarui!", + "Millimeters (mm)": "Milimeter (mm)", + "Minimizes window": "Meminimalkan jendela", + "Missing Files": "File Hilang", + "Missing signatureAlgorithm": "signatureAlgorithm tidak ada", + "Mixed Page Sizes Detected": "Ukuran Halaman Campuran Terdeteksi", + "Mixed Sizes": "Ukuran Campuran", + "Mode": "Mode", + "Modified": "Diubah", + "Modified After Signing (signed part intact)": "Diubah Setelah Ditandatangani (bagian yang ditandatangani utuh)", + "More": "Lainnya", + "Moved": "Dipindahkan", + "Moved \"{{value}}\"": "\"{{value}}\" dipindahkan", + "Multi-line": "Multibaris", + "Must be a positive integer": "Harus berupa bilangan bulat positif", + "Must be a positive number": "Harus berupa angka positif", + "N must be at least 1.": "N minimal 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "PDF N-Up berhasil dibuat!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Kesalahan jaringan: Tidak dapat terhubung ke URL. Pastikan URL benar dan server mengizinkan permintaan CORS.", + "Network error: {{error}}": "Kesalahan jaringan: {{error}}", + "Next page": "Halaman berikutnya", + "No Area Selected": "Tidak Ada Area yang Dipilih", + "No Attachments": "Tidak Ada Lampiran", + "No Changes": "Tidak Ada Perubahan", + "No Crop Area": "Tidak Ada Area Pangkas", + "No File": "Tidak Ada File", + "No Files": "Tidak Ada File", + "No Images Found": "Gambar Tidak Ditemukan", + "No PDF Files": "Tidak Ada File PDF", + "No PDF document loaded": "Tidak ada dokumen PDF yang dimuat", + "No PDF document loaded.": "Tidak ada dokumen PDF yang dimuat.", + "No PDF file loaded.": "Tidak ada file PDF yang dimuat.", + "No PDF files could be decrypted. The password may be incorrect.": "Tidak ada file PDF yang dapat didekripsi. Kata sandi mungkin salah.", + "No PDF files could be linearized.": "Tidak ada file PDF yang dapat dilinearisasi.", + "No PDFs could be processed.": "Tidak ada PDF yang dapat diproses.", + "No Pages": "Tidak Ada Halaman", + "No Selection": "Tidak Ada Pilihan", + "No Signatures Found": "Tanda Tangan Tidak Ditemukan", + "No Tables Found": "Tabel Tidak Ditemukan", + "No Text": "Tidak Ada Teks", + "No URL configured": "Tidak ada URL yang dikonfigurasi", + "No attachments found in this PDF.": "Tidak ada lampiran di PDF ini.", + "No attachments selected for removal.": "Tidak ada lampiran yang dipilih untuk dihapus.", + "No blank pages detected in this PDF.": "Tidak ada halaman kosong yang terdeteksi di PDF ini.", + "No bookmarks found at the selected level.": "Tidak ada bookmark di tingkat yang dipilih.", + "No bookmarks to delete.": "Tidak ada bookmark untuk dihapus.", + "No bookmarks to export!": "Tidak ada bookmark untuk diekspor!", + "No certificate found in PEM file": "Sertifikat tidak ditemukan di file PEM", + "No certificate found in PFX file": "Sertifikat tidak ditemukan di file PFX", + "No certificates found in signature": "Sertifikat tidak ditemukan di tanda tangan", + "No changes match the current filter.": "Tidak ada perubahan yang cocok dengan filter saat ini.", + "No configurable settings for this node.": "Tidak ada pengaturan yang dapat dikonfigurasi untuk node ini.", + "No differences detected on this page.": "Tidak ada perbedaan yang terdeteksi di halaman ini.", + "No embedded images were found in the selected PDF(s).": "Tidak ada gambar tersemat yang ditemukan di PDF yang dipilih.", + "No existing bookmarks found in this PDF.": "Tidak ada bookmark yang ada di PDF ini.", + "No items were selected for removal or none were found in the PDF.": "Tidak ada item yang dipilih untuk dihapus atau tidak ada yang ditemukan di PDF.", + "No page pairs to export.": "Tidak ada pasangan halaman untuk diekspor.", + "No pages found. Please create a blank PDF or upload one.": "Halaman tidak ditemukan. Silakan buat PDF kosong atau unggah satu PDF.", + "No pages selected for removal.": "Tidak ada halaman yang dipilih untuk dihapus.", + "No pages were selected for splitting.": "Tidak ada halaman yang dipilih untuk dipisahkan.", + "No paired page for this side.": "Tidak ada halaman pasangan untuk sisi ini.", + "No private key found in PEM file": "Kunci privat tidak ditemukan di file PEM", + "No private key found in PFX file": "Kunci privat tidak ditemukan di file PFX", + "No tables were detected in this PDF.": "Tidak ada tabel yang terdeteksi di PDF ini.", + "No valid page numbers found.": "Tidak ada nomor halaman yang valid.", + "No valid pages to save.": "Tidak ada halaman valid untuk disimpan.", + "No worker": "Tidak ada worker", + "Noise": "Derau", + "None": "Tidak ada", + "None of the files could be compressed: {{join}}.": "Tidak ada file yang dapat dikompres: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "File Tidak Cukup", + "Not a PDF": "Bukan PDF", + "Not connected": "Tidak terhubung", + "Not in trust chain": "Tidak ada dalam rantai kepercayaan", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Catatan: Tanpa kata sandi pemilik terpisah, PDF tidak memiliki pembatasan penggunaan.", + "Number Format": "Format Angka", + "Number of Pages": "Jumlah Halaman", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR dibatalkan sebelum halaman apa pun diproses", + "OCR recognize timed out after {{timeoutMs}}ms": "Pengenalan OCR habis waktu setelah {{timeoutMs}}ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "File ODG", + "ODG to PDF": "ODG ke PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Mati (default): penomoran alami 1–N. Aktif: label halaman asli setiap file dipertahankan (dapat menghasilkan label ganda).", + "One PDF per page": "Satu PDF per halaman", + "One PDF per range": "Satu PDF per rentang", + "Only a substitute font was available": "Hanya font pengganti yang tersedia", + "Only where it does not change how the image looks.": "Hanya jika tidak mengubah tampilan gambar.", + "Opacity": "Opasitas", + "Open URL": "Buka URL", + "Opens incognito window": "Membuka jendela penyamaran", + "Opens new tab": "Membuka tab baru", + "Opens new window": "Membuka jendela baru", + "Operation Failed": "Operasi Gagal", + "Operation resulted in an empty file.": "Operasi menghasilkan file kosong.", + "Optimize PDF for fast web viewing": "Optimalkan PDF untuk tampilan web yang cepat", + "Optimizing PDFs for web view (linearizing)...": "Mengoptimalkan PDF untuk tampilan web (linearisasi)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Mengoptimalkan {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opsi (Satu per baris atau dipisahkan koma)", + "Orientation": "Orientasi", + "Outline": "Kerangka", + "Output": "Keluaran", + "Overlay": "Overlay", + "Overlay or underlay pages from one PDF onto another": "Tumpuk halaman dari satu PDF di atas atau di bawah PDF lain", + "Owner Password": "Kata Sandi Pemilik", + "Owner Password Required": "Kata Sandi Pemilik Diperlukan", + "PDF": "PDF", + "PDF Files": "File PDF", + "PDF Input": "Masukan PDF", + "PDF Layers": "Layer PDF", + "PDF Metadata": "Metadata PDF", + "PDF Producer": "Produsen PDF", + "PDF converted to CSV successfully!": "PDF berhasil dikonversi ke CSV!", + "PDF converted to SVG successfully!": "PDF berhasil dikonversi ke SVG!", + "PDF converted to greyscale successfully!": "PDF berhasil dikonversi ke skala abu-abu!", + "PDF created successfully!": "PDF berhasil dibuat!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF berhasil didekripsi! Semua enkripsi dan pembatasan dihapus.", + "PDF decrypted successfully! Your download has started.": "PDF berhasil didekripsi! Unduhan Anda telah dimulai.", + "PDF downloaded successfully.": "PDF berhasil diunduh.", + "PDF encrypted successfully with 256-bit AES!": "PDF berhasil dienkripsi dengan AES 256-bit!", + "PDF has been sanitized and downloaded.": "PDF telah disanitasi dan diunduh.", + "PDF has no pages": "PDF tidak memiliki halaman", + "PDF organized successfully!": "PDF berhasil diatur!", + "PDF permissions changed successfully!": "Izin PDF berhasil diubah!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Pembaca PDF menyediakan sendiri 14 font PDF standar.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Pembatasan PDF berhasil dihapus! File kini dapat diedit dan dicetak sepenuhnya.", + "PDF saved successfully!": "PDF berhasil disimpan!", + "PDF split successfully!": "PDF berhasil dipisahkan!", + "PDF to CSV": "PDF ke CSV", + "PDF to DOCX": "PDF ke DOCX", + "PDF to Excel/CSV": "PDF ke Excel/CSV", + "PDF to Images": "PDF ke Gambar", + "PDF to Images (High Quality)": "PDF ke Gambar (Kualitas Tinggi)", + "PDF to JSON": "PDF ke JSON", + "PDF to Markdown": "PDF ke Markdown", + "PDF to PDF/A": "PDF ke PDF/A", + "PDF to SVG": "PDF ke SVG", + "PDF to Text": "PDF ke Teks", + "PDF to XLSX": "PDF ke XLSX", + "PDF with layer changes saved!": "PDF dengan perubahan layer telah disimpan!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} berhasil diterapkan.", + "PDF/A Conversion": "Konversi PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (Ketat, tanpa transparansi)", + "PDF/A-2b (Recommended)": "PDF/A-2b (Disarankan)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (Modern, mengizinkan lampiran)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF berhasil dicampur!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (Lossless)", + "PUB to PDF": "PUB ke PDF", + "Page": "Halaman", + "Page #": "Halaman #", + "Page Added": "Halaman Ditambahkan", + "Page Numbers": "Nomor Halaman", + "Page Removed": "Halaman Dihapus", + "Page Size": "Ukuran Halaman", + "Page X of Y": "Halaman X dari Y", + "Page background or layout changed": "Latar belakang atau tata letak halaman berubah", + "Page container not found": "Kontainer halaman tidak ditemukan", + "Page extraction produced an empty PDF.": "Ekstraksi halaman menghasilkan PDF kosong.", + "Page number": "Nomor halaman", + "Page numbers added successfully!": "Nomor halaman berhasil ditambahkan!", + "Page sizes standardized successfully!": "Ukuran halaman berhasil distandarkan!", + "Page {{currentPageNum}} of {{numPages}}": "Halaman {{currentPageNum}} dari {{numPages}}", + "Page {{num}} / {{numPages}}": "Halaman {{num}} / {{numPages}}", + "Page {{n}} ": "Halaman {{n}} ", + "Page {{n}} of {{length}}": "Halaman {{n}} dari {{length}}", + "Page {{n}}:": "Halaman {{n}}:", + "Page {{pageNumber}}": "Halaman {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Halaman {{pageNumber}} hanya ada di PDF pertama.", + "Page {{pageNumber}} exists only in the second PDF.": "Halaman {{pageNumber}} hanya ada di PDF kedua.", + "Page {{pageNumber}} of {{totalPages}}": "Halaman {{pageNumber}} dari {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Halaman {{pageNum}} tidak ada di PDF ini.", + "Page {{page}}": "Halaman {{page}}", + "Page {{page}} attachment": "Lampiran halaman {{page}}", + "Pages": "Halaman", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Halaman (mis., 1-3, 5) - Total: {{pageCount}}", + "Pages Files": "File Pages", + "Pages Per Sheet": "Halaman Per Lembar", + "Pages combined successfully!": "Halaman berhasil digabungkan!", + "Pages have been divided successfully!": "Halaman berhasil dibagi!", + "Pages have been reordered.": "Halaman telah diurutkan ulang.", + "Pages have been reversed successfully!": "Halaman berhasil dibalik!", + "Pages to PDF": "Pages ke PDF", + "Paper Size": "Ukuran Kertas", + "Paragraph": "Paragraf", + "Parsing XML structure...": "Mengurai struktur XML...", + "Parsing {{name}}...": "Mengurai {{name}}...", + "Partial Coverage": "Cakupan Sebagian", + "Partial Success": "Sebagian Berhasil", + "Password": "Kata Sandi", + "Password Error": "Kesalahan Kata Sandi", + "Password Needed": "Kata Sandi Diperlukan", + "Password Required": "Kata Sandi Diperlukan", + "Password for all files": "Kata sandi untuk semua file", + "Password for all locked files": "Kata sandi untuk semua file yang terkunci", + "Password for {{name}}": "Kata sandi untuk {{name}}", + "Password protected": "Dilindungi kata sandi", + "Password required for encrypted private key": "Kata sandi diperlukan untuk kunci privat terenkripsi", + "Path Stroke": "Goresan Jalur", + "Please add at least one field before downloading.": "Silakan tambahkan setidaknya satu kolom sebelum mengunduh.", + "Please draw a rectangle on at least one page to select the crop area.": "Silakan gambar persegi panjang di setidaknya satu halaman untuk memilih area pangkas.", + "Please ensure all page numbers in the order are unique.": "Pastikan semua nomor halaman dalam urutan bersifat unik.", + "Please enter a layer name": "Silakan masukkan nama layer", + "Please enter a name.": "Silakan masukkan nama.", + "Please enter a number between 0 and {{totalPages}}.": "Silakan masukkan angka antara 0 dan {{totalPages}}.", + "Please enter a page order.": "Silakan masukkan urutan halaman.", + "Please enter a password": "Silakan masukkan kata sandi", + "Please enter a password for {{i}} or skip it": "Silakan masukkan kata sandi untuk {{i}} atau lewati", + "Please enter a title.": "Silakan masukkan judul.", + "Please enter a user password.": "Silakan masukkan kata sandi pengguna.", + "Please enter a valid number of pages (1 or more).": "Silakan masukkan jumlah halaman yang valid (1 atau lebih).", + "Please enter a valid page number between 1 and {{total}}": "Silakan masukkan nomor halaman yang valid antara 1 dan {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Silakan masukkan rentang halaman yang valid (mis., 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Silakan masukkan nomor halaman yang akan diekstrak.", + "Please enter positive numbers.": "Silakan masukkan angka positif.", + "Please enter some text to convert.": "Silakan masukkan teks yang akan dikonversi.", + "Please enter text for the watermark.": "Silakan masukkan teks untuk watermark.", + "Please enter the PDF password.": "Silakan masukkan kata sandi PDF.", + "Please load a PDF first.": "Silakan muat PDF terlebih dahulu.", + "Please select PDF files to create a ZIP archive.": "Silakan pilih file PDF untuk membuat arsip ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Silakan pilih file sertifikat .pem, .crt, .cer, atau .der.", + "Please select a PDF file.": "Silakan pilih file PDF.", + "Please select a valid PDF file.": "Silakan pilih file PDF yang valid.", + "Please select an area on at least one page to crop.": "Silakan pilih area di setidaknya satu halaman untuk dipangkas.", + "Please select an area to crop first.": "Silakan pilih area yang akan dipangkas terlebih dahulu.", + "Please select an area to crop.": "Silakan pilih area yang akan dipangkas.", + "Please select an image file for the watermark.": "Silakan pilih file gambar untuk watermark.", + "Please select at least one BMP file.": "Silakan pilih setidaknya satu file BMP.", + "Please select at least one CSV file.": "Silakan pilih setidaknya satu file CSV.", + "Please select at least one Excel file.": "Silakan pilih setidaknya satu file Excel.", + "Please select at least one HEIC file.": "Silakan pilih setidaknya satu file HEIC.", + "Please select at least one JPG file.": "Silakan pilih setidaknya satu file JPG.", + "Please select at least one JPG or JPEG2000 image.": "Silakan pilih setidaknya satu gambar JPG atau JPEG2000.", + "Please select at least one ODT file.": "Silakan pilih setidaknya satu file ODT.", + "Please select at least one PDF file.": "Silakan pilih setidaknya satu file PDF.", + "Please select at least one PowerPoint file.": "Silakan pilih setidaknya satu file PowerPoint.", + "Please select at least one RTF file.": "Silakan pilih setidaknya satu file RTF.", + "Please select at least one SVG file.": "Silakan pilih setidaknya satu file SVG.", + "Please select at least one TIFF file.": "Silakan pilih setidaknya satu file TIFF.", + "Please select at least one Word document.": "Silakan pilih setidaknya satu dokumen Word.", + "Please select at least one file to attach.": "Silakan pilih setidaknya satu file untuk dilampirkan.", + "Please select at least one image file.": "Silakan pilih setidaknya satu file gambar.", + "Please select at least one text file.": "Silakan pilih setidaknya satu file teks.", + "Please select at least one {{FILETYPE_NAME}} file.": "Silakan pilih setidaknya satu file {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Silakan pilih setidaknya satu file {{TOOL_NAME}} (.eml atau .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Silakan pilih setidaknya satu file {{TOOL_NAME}}.", + "Please select even or odd pages.": "Silakan pilih halaman genap atau ganjil.", + "Please select one or more PDF files.": "Silakan pilih satu atau beberapa file PDF.", + "Please select pages to delete.": "Silakan pilih halaman yang akan dihapus.", + "Please select pages to duplicate.": "Silakan pilih halaman yang akan diduplikasi.", + "Please select pages to mark for splitting.": "Silakan pilih halaman yang akan ditandai untuk dipisahkan.", + "Please select pages to rotate.": "Silakan pilih halaman yang akan diputar.", + "Please specify a page range for page-level attachments.": "Silakan tentukan rentang halaman untuk lampiran tingkat halaman.", + "Please upload PDF files.": "Silakan unggah file PDF.", + "Please upload PDFs first.": "Silakan unggah PDF terlebih dahulu.", + "Please upload a .docx file first.": "Silakan unggah file .docx terlebih dahulu.", + "Please upload a PDF file first.": "Silakan unggah file PDF terlebih dahulu.", + "Please upload a PDF file.": "Silakan unggah file PDF.", + "Please upload a PDF first.": "Silakan unggah PDF terlebih dahulu.", + "Please upload a valid PDF file.": "Silakan unggah file PDF yang valid.", + "Please upload at least one PDF file.": "Silakan unggah setidaknya satu file PDF.", + "Please upload at least two PDF files to alternate and mix.": "Silakan unggah setidaknya dua file PDF untuk diselang-seling dan dicampur.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Silakan unggah PDF dasar sekaligus PDF overlay/underlay.", + "Please upload valid PDF files.": "Silakan unggah file PDF yang valid.", + "Please use the Download button in the PDF viewer toolbar above.": "Silakan gunakan tombol Unduh di bilah alat penampil PDF di atas.", + "Please wait for the PDF viewer to load.": "Silakan tunggu hingga penampil PDF selesai dimuat.", + "Please wait for the form to finish loading.": "Silakan tunggu hingga formulir selesai dimuat.", + "Portrait": "Potret", + "Position": "Posisi", + "Post-processing for transparency compliance...": "Pascapemrosesan untuk kepatuhan transparansi...", + "Posterize": "Posterisasi", + "Posterizing PDF...": "Memposterisasi PDF...", + "PowerPoint to PDF": "PowerPoint ke PDF", + "Pre Flatten": "Ratakan Dulu", + "Pre-flattening PDF...": "Meratakan PDF terlebih dahulu...", + "Prefer JPEG 2000 for photos": "Utamakan JPEG 2000 untuk foto", + "Preparing PDF export...": "Menyiapkan ekspor PDF...", + "Preparing conversion...": "Menyiapkan konversi...", + "Preparing download...": "Menyiapkan unduhan...", + "Preparing preview...": "Menyiapkan pratinjau...", + "Presentations": "Presentasi", + "Preserve PDF/A": "Pertahankan PDF/A", + "Preview": "Pratinjau", + "Preview Error": "Kesalahan Pratinjau", + "Preview Text": "Pratinjau Teks", + "Previous page": "Halaman sebelumnya", + "Print Form": "Cetak Formulir", + "Private data that editing apps store inside the PDF.": "Data privat yang disimpan aplikasi pengedit di dalam PDF.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF diproses.", + "Processing Complete": "Pemrosesan Selesai", + "Processing Dpi": "DPI Pemrosesan", + "Processing Failed": "Pemrosesan Gagal", + "Processing PDF permissions...": "Memproses izin PDF...", + "Processing attachments...": "Memproses lampiran...", + "Processing failed for {{name}}.": "Pemrosesan gagal untuk {{name}}.", + "Processing file {{n}} of {{length}}...": "Memproses file {{n}} dari {{length}}...", + "Processing images...": "Memproses gambar...", + "Processing multiple PDFs...": "Memproses beberapa PDF...", + "Processing page {{i}} of {{numPages}}": "Memproses halaman {{i}} dari {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Memproses halaman {{i}} dari {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Memproses halaman {{n}} dari {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Memproses halaman {{pageNum}} dari {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Memproses halaman {{pageNum}} dari {{totalPages}}...", + "Processing produced an empty file.": "Pemrosesan menghasilkan file kosong.", + "Processing resulted in an empty file.": "Pemrosesan menghasilkan file kosong.", + "Processing sheet {{n}}...": "Memproses lembar {{n}}...", + "Processing {{name}}...": "Memproses {{name}}...", + "Processing {{nodeName}}...": "Memproses {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Memproses {{n}}/{{length}}: {{name}}...", + "Processing...": "Memproses...", + "Producer": "Produsen", + "Publisher Files": "File Publisher", + "Purple": "Ungu", + "PyMuPDF (Document Processing)": "PyMuPDF (Pemrosesan Dokumen)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF belum dikonfigurasi. Silakan konfigurasikan di Pengaturan Lanjutan.", + "PyMuPDF module did not export expected PyMuPDF class.": "Modul PyMuPDF tidak mengekspor kelas PyMuPDF yang diharapkan.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF menghasilkan file hasil dekripsi yang kosong.", + "PyMuPDF: not configured.": "PyMuPDF: belum dikonfigurasi.", + "QR Code": "Kode QR", + "Quality": "Kualitas", + "Quits application (cannot be overridden)": "Menutup aplikasi (tidak dapat ditimpa)", + "RSA-PKCS1 signature does not verify against signer public key": "Tanda tangan RSA-PKCS1 tidak cocok dengan kunci publik penandatangan", + "RSA-PSS signature does not verify against signer public key": "Tanda tangan RSA-PSS tidak cocok dengan kunci publik penandatangan", + "Rasterization Complete": "Rasterisasi Selesai", + "Rasterization Partial": "Rasterisasi Sebagian", + "Rasterize": "Rasterisasi", + "Rasterize Dpi": "DPI Rasterisasi", + "Rasterize pages to images": "Rasterisasi halaman menjadi gambar", + "Rasterize quality": "Kualitas rasterisasi", + "Rasterize resolution (DPI)": "Resolusi rasterisasi (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Merasterisasi {{completed}} PDF, {{failed}} gagal.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Merasterisasi {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Merasterisasi {{name}}...", + "Rasterizing...": "Merasterisasi...", + "Rating must be between 0 and 5": "Peringkat harus antara 0 dan 5", + "Read Only": "Hanya Baca", + "Reading CSV file...": "Membaca file CSV...", + "Reading PDF...": "Membaca PDF...", + "Reading XML file...": "Membaca file XML...", + "Reading encrypted PDF...": "Membaca PDF terenkripsi...", + "Reading files...": "Membaca file...", + "Reading layer configuration...": "Membaca konfigurasi layer...", + "Reading {{name}} ({{n}}/{{length}})...": "Membaca {{name}} ({{n}}/{{length}})...", + "Ready": "Siap", + "Reason": "Alasan", + "Red": "Merah", + "Redact": "Redaksi", + "Redact Mode": "Mode Redaksi", + "Redact text from PDF": "Redaksi teks dari PDF", + "Redaction Failed": "Redaksi Gagal", + "Reduce PDF file size": "Perkecil ukuran file PDF", + "Reduce color complexity": "Kurangi kompleksitas warna", + "Reduces file size by removing color information.": "Memperkecil ukuran file dengan menghapus informasi warna.", + "Reloads page": "Memuat ulang halaman", + "Remove": "Hapus", + "Remove All Attachments": "Hapus Semua Lampiran", + "Remove Annotations": "Hapus Anotasi", + "Remove Blank Pages": "Hapus Halaman Kosong", + "Remove Embedded Files": "Hapus File Tersemat", + "Remove Fonts": "Hapus Font", + "Remove Javascript": "Hapus JavaScript", + "Remove Layers": "Hapus Layer", + "Remove Links": "Hapus Tautan", + "Remove Mark Info": "Hapus Info Tanda", + "Remove Metadata": "Hapus Metadata", + "Remove PDF password protection": "Hapus perlindungan kata sandi PDF", + "Remove Structure Tree": "Hapus Pohon Struktur", + "Remove alternate images": "Hapus gambar alternatif", + "Remove application data": "Hapus data aplikasi", + "Remove article threads": "Hapus thread artikel", + "Remove attachment": "Hapus lampiran", + "Remove blank pages automatically": "Hapus halaman kosong secara otomatis", + "Remove document structure tree": "Hapus pohon struktur dokumen", + "Remove file": "Hapus file", + "Remove metadata, scripts, and hidden data": "Hapus metadata, skrip, dan data tersembunyi", + "Remove output intents": "Hapus output intent", + "Remove page thumbnails": "Hapus thumbnail halaman", + "Remove specific pages": "Hapus halaman tertentu", + "Remove web capture information": "Hapus informasi tangkapan web", + "Remove {{name}}": "Hapus {{name}}", + "Removed \"{{beforeText}}\"": "\"{{beforeText}}\" dihapus", + "Removed image ({{width}}×{{height}})": "Gambar dihapus ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Berhasil menghapus {{length}} halaman kosong!", + "Removing all metadata...": "Menghapus semua metadata...", + "Removing annotations...": "Menghapus anotasi...", + "Removing redacted text from document data...": "Menghapus teks yang disamarkan dari data dokumen...", + "Removing restrictions...": "Menghapus pembatasan...", + "Removing {{length}} blank page(s)...": "Menghapus {{length}} halaman kosong...", + "Render Error": "Kesalahan Render", + "Rendering Page {{num}}...": "Merender Halaman {{num}}...", + "Rendering page previews...": "Merender pratinjau halaman...", + "Rendering page previews: {{current}}/{{total}}": "Merender pratinjau halaman: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Merender halaman {{n}} dari {{length}}...", + "Rendering preview for page {{pageNum}}...": "Merender pratinjau untuk halaman {{pageNum}}...", + "Reopens closed tab": "Membuka kembali tab yang ditutup", + "Repair": "Perbaiki", + "Repair Failed": "Perbaikan Gagal", + "Repair corrupted PDF": "Perbaiki PDF yang rusak", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} file diperbaiki. Gagal diperbaiki: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Memperbaiki {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Memperbaiki {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "\"{{beforeText}}\" diganti dengan \"{{afterText}}\"", + "Required": "Wajib", + "Resamples even when an image is only slightly above the limit.": "Resampling dilakukan bahkan saat gambar hanya sedikit melebihi batas.", + "Reset Form": "Reset Formulir", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Reset dan kembali ke pengunggah file? Semua perubahan yang belum disimpan akan hilang.", + "Resolution": "Resolusi", + "Retain Page Labels": "Pertahankan Label Halaman", + "Retry Failed": "Coba Lagi yang Gagal", + "Reverse Pages": "Balik Halaman", + "Reverse page order": "Balik urutan halaman", + "Reversing page order...": "Membalik urutan halaman...", + "Reversing {{name}} ({{n}}/{{length}})...": "Membalik {{name}} ({{n}}/{{length}})...", + "Right": "Kanan", + "Right edge in points": "Tepi kanan dalam poin", + "Rotate": "Putar", + "Rotate +90°": "Putar +90°", + "Rotate all pages": "Putar semua halaman", + "Rotation": "Rotasi", + "Rotation Variance": "Variasi Rotasi", + "Rotations applied successfully!": "Rotasi berhasil diterapkan!", + "Rows": "Baris", + "Run Javascript": "Jalankan JavaScript", + "Running OCR on page {{pageNum}}...": "Menjalankan OCR pada halaman {{pageNum}}...", + "Running...": "Berjalan...", + "SVG": "SVG", + "SVG Files": "File SVG", + "SVG to PDF": "SVG ke PDF", + "Sanitize": "Sanitasi", + "Sanitized With Warnings": "Disanitasi dengan Peringatan", + "Sanitizing PDF...": "Menyanitasi PDF...", + "Saturation": "Saturasi", + "Saved": "Tersimpan", + "Saving PDF with layer changes...": "Menyimpan PDF dengan perubahan layer...", + "Scaling Mode": "Mode Skala", + "Scanner Effect": "Efek Pemindai", + "Scanner effect applied successfully!": "Efek pemindai berhasil diterapkan!", + "Scanning page {{n}} of {{pageCount}}...": "Memindai halaman {{n}} dari {{pageCount}}...", + "Search Text": "Cari Teks", + "Search languages...": "Cari bahasa...", + "Select Font": "Pilih Font", + "Select a field to edit properties": "Pilih kolom untuk mengedit properti", + "Select a field...": "Pilih kolom...", + "Select to add this button to an existing group": "Pilih untuk menambahkan tombol ini ke grup yang ada", + "Selected Option": "Opsi Terpilih", + "Self-Signed: Signer Identity Not Verified": "Ditandatangani Sendiri: Identitas Penandatangan Belum Diverifikasi", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Aset OCR yang dihosting sendiri hanya dikonfigurasi sebagian. Setel {{missing}} bersama dengan URL aset Tesseract lainnya.", + "Separator": "Pemisah", + "Separator Color": "Warna Pemisah", + "Separator Thickness": "Ketebalan Pemisah", + "Sepia": "Sepia", + "Serial Number:": "Nomor Seri:", + "Set custom destination": "Atur tujuan kustom", + "Shapes": "Bentuk", + "Sheet {{n}} {{sideLabel}}": "Lembar {{n}} {{sideLabel}}", + "Show": "Tampilkan", + "Show password": "Tampilkan kata sandi", + "Show/Hide Field": "Tampilkan/Sembunyikan Kolom", + "Sign Here": "Tanda Tangan Di Sini", + "Signature /Contents is not a single DER object followed by zero padding": "/Contents tanda tangan bukan satu objek DER yang diikuti padding nol", + "Signature Algorithm:": "Algoritma Tanda Tangan:", + "Signature Intact: Signer Identity Not Verified": "Tanda Tangan Utuh: Identitas Penandatangan Belum Diverifikasi", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Kolom tanda tangan adalah kolom tanda tangan AcroForm dan hanya akan terlihat di penampil PDF tingkat lanjut.", + "Signature has a missing or malformed /ByteRange": "Tanda tangan memiliki /ByteRange yang hilang atau rusak", + "Signature scheme {{kind}} not implemented": "Skema tanda tangan {{kind}} belum diimplementasikan", + "Signature {{n}}": "Tanda Tangan {{n}}", + "Signatures": "Tanda Tangan", + "Signed By": "Ditandatangani Oleh", + "Signed On": "Ditandatangani Pada", + "Signed PDF Not Changed": "PDF Bertanda Tangan Tidak Berubah", + "Signed PDF downloaded successfully!": "PDF bertanda tangan berhasil diunduh!", + "Signed PDF saved successfully!": "PDF bertanda tangan berhasil disimpan!", + "Simple (1, 2, 3)": "Sederhana (1, 2, 3)", + "Simplify large color profiles": "Sederhanakan profil warna besar", + "Skew Threshold": "Ambang Kemiringan", + "Skip": "Lewati", + "Skip All": "Lewati Semua", + "Skip Remaining": "Lewati Sisanya", + "Skip this file": "Lewati file ini", + "Skipped: {{join}}.": "Dilewati: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "File lebih kecil, tetapi hanya pembaca dengan dukungan Brotli yang dapat membukanya, seperti Firefox, MuPDF 1.26+ dan Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Beberapa file dilewati karena bukan gambar yang didukung.", + "Some files were skipped. Only BMP files are allowed.": "Beberapa file dilewati. Hanya file BMP yang diizinkan.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Beberapa file dilewati. Hanya file HEIC/HEIF yang diizinkan.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Beberapa file dilewati. Hanya file JPG, JPEG, JP2, dan JPX yang diizinkan.", + "Some files were skipped. Only PDF files are allowed.": "Beberapa file dilewati. Hanya file PDF yang diizinkan.", + "Some files were skipped. Only PNG images are allowed.": "Beberapa file dilewati. Hanya gambar PNG yang diizinkan.", + "Some files were skipped. Only SVG graphics are allowed.": "Beberapa file dilewati. Hanya grafik SVG yang diizinkan.", + "Some files were skipped. Only TIFF files are allowed.": "Beberapa file dilewati. Hanya file TIFF yang diizinkan.", + "Some files were skipped. Only WebP images are allowed.": "Beberapa file dilewati. Hanya gambar WebP yang diizinkan.", + "Some files were skipped. Only supported image formats are allowed.": "Beberapa file dilewati. Hanya format gambar yang didukung yang diizinkan.", + "Some files were skipped. Only text files are allowed.": "Beberapa file dilewati. Hanya file teks yang diizinkan.", + "Some pages could not be processed. Please try again.": "Beberapa halaman tidak dapat diproses. Silakan coba lagi.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Beberapa tanda redaksi tidak dapat diterapkan, sehingga file tidak diunduh. Terapkan atau hapus tanda tersebut di editor lalu coba lagi.", + "Spacing": "Spasi", + "Split PDF": "Pisah PDF", + "Split by Bookmarks": "Pisah Berdasarkan Bookmark", + "Split pages into tile grid for poster printing": "Pisahkan halaman menjadi kisi ubin untuk pencetakan poster", + "Split pages vertically or horizontally": "Pisahkan halaman secara vertikal atau horizontal", + "Splitting PDF pages...": "Memisahkan halaman PDF...", + "Splitting PDF...": "Memisahkan PDF...", + "Spreadsheets": "Spreadsheet", + "Standard (192 DPI)": "Standar (192 DPI)", + "Standard Size": "Ukuran Standar", + "Standardize all pages to a target size": "Standarkan semua halaman ke ukuran target", + "Standardizing pages...": "Menstandarkan halaman...", + "Stitch all pages into one continuous page": "Gabungkan semua halaman menjadi satu halaman berkelanjutan", + "Straighten skewed PDF pages": "Luruskan halaman PDF yang miring", + "Strip all annotations": "Hapus semua anotasi", + "Style": "Gaya", + "Style Changed": "Gaya Diubah", + "Style changed ({{length}} regions)": "Gaya diubah ({{length}} wilayah)", + "Subject": "Subjek", + "Subset embedded fonts": "Subset font tersemat", + "Success": "Berhasil", + "Success!": "Berhasil!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Berhasil mengonversi {{length}} file CSV ke PDF.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Berhasil mengonversi {{length}} file Excel ke PDF.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Berhasil mengonversi {{length}} file ODT ke PDF.", + "Successfully converted {{length}} PDF(s) to DOCX.": "Berhasil mengonversi {{length}} PDF ke DOCX.", + "Successfully converted {{length}} PDF(s) to Markdown.": "Berhasil mengonversi {{length}} PDF ke Markdown.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "Berhasil mengonversi {{length}} PDF ke {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Berhasil mengonversi {{length}} file PSD menjadi satu PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Berhasil mengonversi {{length}} file PowerPoint ke PDF.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Berhasil mengonversi {{length}} file RTF ke PDF.", + "Successfully converted {{length}} Word document(s) to PDF.": "Berhasil mengonversi {{length}} dokumen Word ke PDF.", + "Successfully converted {{length}} files to PDF.": "Berhasil mengonversi {{length}} file ke PDF.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Berhasil mengonversi {{length}} file {{TOOL_NAME}} ke PDF.", + "Successfully converted {{name}} to DOCX.": "Berhasil mengonversi {{name}} ke DOCX.", + "Successfully converted {{name}} to Markdown.": "Berhasil mengonversi {{name}} ke Markdown.", + "Successfully converted {{name}} to PDF.": "Berhasil mengonversi {{name}} ke PDF.", + "Successfully converted {{name}} to {{level}}.": "Berhasil mengonversi {{name}} ke {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "Berhasil mengekstrak PDF untuk penggunaan AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "Berhasil mengekstrak {{completed}} PDF untuk penggunaan AI/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "Berhasil merasterisasi PDF pada {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "Berhasil merasterisasi {{completed}} PDF pada {{dpi}} DPI.", + "Supported: CBZ, CBR": "Didukung: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Didukung: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Didukung: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Didukung: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Didukung: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Didukung: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Didukung: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Didukung: XPS, OXPS", + "Switches apps": "Berpindah antar aplikasi", + "Switches tabs": "Berpindah antar tab", + "Table of Contents": "Daftar Isi", + "Table {{n}} (Page {{page}})": "Tabel {{n}} (Halaman {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Kolom Target", + "Target Kilobytes": "Kilobyte Target", + "Target Not Reached": "Target Tidak Tercapai", + "Target Size": "Ukuran Target", + "Technical Details": "Detail Teknis", + "Temperature": "Suhu Warna", + "Template \"{{name}}\" loaded.": "Templat \"{{name}}\" dimuat.", + "Template \"{{name}}\" saved.": "Templat \"{{name}}\" disimpan.", + "Text": "Teks", + "Text Color": "Warna Teks", + "Text Files": "File Teks", + "Text color changed successfully!": "Warna teks berhasil diubah!", + "Text converted to PDF successfully!": "Teks berhasil dikonversi ke PDF!", + "Text extracted successfully!": "Teks berhasil diekstrak!", + "Text to PDF": "Teks ke PDF", + "That password did not open any of the remaining files.": "Kata sandi tersebut tidak dapat membuka file yang tersisa.", + "The PDF file(s) do not contain any attachments to extract.": "File PDF tidak berisi lampiran yang dapat diekstrak.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF memiliki {{totalPages}} halaman, yang tidak habis dibagi {{nValue}}. PDF terakhir akan berisi {{remainder}} halaman.", + "The PDF might be corrupted or password protected.": "PDF mungkin rusak atau dilindungi kata sandi.", + "The PDF might be corrupted or password-protected.": "PDF mungkin rusak atau dilindungi kata sandi.", + "The PDF might be corrupted.": "PDF mungkin rusak.", + "The PDF viewer is still initializing.": "Penampil PDF masih diinisialisasi.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF telah diunduh, tetapi langkah berikut tidak dapat diselesaikan: {{join}}. Konten yang tercakup mungkin masih ada di file.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL mengembalikan jenis konten yang tidak terduga: {{contentType}}. Yang diharapkan adalah file JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Byte yang dikecualikan oleh /ByteRange bukan tanda tangan berenkode heksadesimal secara utuh", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Byte yang dikecualikan oleh /ByteRange bukan /Contents dari tanda tangan ini", + "The compression engine returned an unreadable result.": "Mesin kompresi mengembalikan hasil yang tidak dapat dibaca.", + "The compression engine stopped unexpectedly.": "Mesin kompresi berhenti secara tak terduga.", + "The current password you entered is incorrect. Please try again.": "Kata sandi saat ini yang Anda masukkan salah. Silakan coba lagi.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Nama kolom berikut sudah ada di PDF yang diunggah: {{conflictList}}. Silakan ganti nama kolom tersebut sebelum mengunduh.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Nama kolom berikut digunakan lebih dari sekali: {{duplicateList}}. Silakan ganti nama kolom tersebut agar unik sebelum mengunduh.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Jumlah halaman yang ditentukan ({{length}}) tidak sesuai dengan jumlah halaman dokumen saat ini ({{currentGridCount}}). Silakan berikan urutan lengkap untuk semua halaman.", + "The password you entered is incorrect. Please try again.": "Kata sandi yang Anda masukkan salah. Silakan coba lagi.", + "The password you entered is wrong or the file is corrupted.": "Kata sandi yang Anda masukkan salah atau file rusak.", + "The provided file could not be loaded as an image. It may be corrupted.": "File yang diberikan tidak dapat dimuat sebagai gambar. File mungkin rusak.", + "The requested OCR language is not available: {{unavailableText}}.": "Bahasa OCR yang diminta tidak tersedia: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Urutan halaman yang ditentukan tidak lengkap atau berisi nomor halaman yang tidak valid. Pastikan Anda memberikan posisi baru untuk setiap halaman asli.", + "These files are not valid PDFs, so they were not added: {{names}}.": "File berikut bukan PDF yang valid, sehingga tidak ditambahkan: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "File berikut dilindungi kata sandi: {{names}}. Masukkan kata sandinya pada kartu file, atau hapus file tersebut, lalu kompres lagi.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Build BentoPDF ini hanya menyertakan data OCR untuk {{availableText}}.", + "This PDF does not contain any digital signatures.": "PDF ini tidak berisi tanda tangan digital.", + "This PDF has no layers (OCG).": "PDF ini tidak memiliki layer (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "PDF ini dilindungi kata sandi. Silakan masukkan kata sandi saat ini untuk melanjutkan.", + "This document contains pages with different dimensions:": "Dokumen ini berisi halaman dengan dimensi berbeda:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dokumen ini memiliki 1 tanda redaksi yang belum diterapkan. Selama tanda belum diterapkan, konten di bawahnya masih ada di dalam file. Terapkan semua tanda dan unduh?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dokumen ini memiliki {{count}} tanda redaksi yang belum diterapkan. Selama tanda belum diterapkan, konten di bawahnya masih ada di dalam file. Terapkan semua tanda dan unduh?", + "This feature requires {{name}} to be configured.": "Fitur ini memerlukan {{name}} untuk dikonfigurasi.", + "This file is not a valid PDF.": "File ini bukan PDF yang valid.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Modul ini dilisensikan di bawah AGPL-3.0. Dengan mengonfigurasinya, Anda menyetujui ketentuan lisensinya.", + "This tool has been disabled": "Alat ini telah dinonaktifkan", + "This tool is not available in your deployment. Contact your administrator for more information.": "Alat ini tidak tersedia di deployment Anda. Hubungi administrator Anda untuk informasi lebih lanjut.", + "Threshold": "Ambang Batas", + "Tile": "Ubin", + "Tile Gap X": "Jarak Ubin X", + "Tile Gap Y": "Jarak Ubin Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Stempel Waktu", + "Timestamp Failed": "Stempel Waktu Gagal", + "Tint": "Tint", + "Title": "Judul", + "To actually fill or change the options, use our PDF Form Filler tool.": "Untuk benar-benar mengisi atau mengubah opsinya, gunakan alat Pengisi Formulir PDF kami.", + "Toggle": "Alihkan", + "Toggle style": "Alihkan gaya", + "Toggle sync scroll": "Alihkan gulir sinkron", + "Tool Unavailable": "Alat Tidak Tersedia", + "Tooltip / Help Text": "Tooltip / Teks Bantuan", + "Top": "Atas", + "Top Center": "Atas Tengah", + "Top Left": "Kiri Atas", + "Top Right": "Kanan Atas", + "Top edge in points": "Tepi atas dalam poin", + "Total Pages": "Total Halaman", + "Transparent Background": "Latar Belakang Transparan", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Mencoba JPEG 2000 dibandingkan JPEG untuk setiap gambar dan mempertahankan yang lebih kecil.", + "Trim margins from all pages": "Pangkas margin dari semua halaman", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Verifikasi kepercayaan: {{trustVerified}}/{{length}} tanda tangan terverifikasi terhadap sertifikat kustom", + "Trusted": "Tepercaya", + "Trusted certificate loaded": "Sertifikat tepercaya dimuat", + "Tsa Url": "URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Menonaktifkan kualitas, resolusi, dan semua langkah gambar lossy lainnya.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL harus diawali dengan http:// atau https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Tidak dapat mendekripsi PDF dengan kata sandi yang diberikan.", + "Unable to repair any of the uploaded PDF files.": "Tidak dapat memperbaiki satu pun file PDF yang diunggah.", + "Unembed standard fonts": "Lepas font standar yang tersemat", + "Unembed standard-font look-alikes": "Lepas font yang menyerupai font standar", + "Unexpected delimiter in content stream": "Pembatas tak terduga di aliran konten", + "Unexpected reply from the engine.": "Balasan tak terduga dari mesin.", + "Uniform": "Seragam", + "Unique Page Sizes": "Ukuran Halaman Unik", + "Unknown": "Tidak diketahui", + "Unknown error": "Kesalahan tidak diketahui", + "Unknown error occurred in worker.": "Terjadi kesalahan tidak diketahui di worker.", + "Unknown error occurred.": "Terjadi kesalahan tidak diketahui.", + "Unlock": "Buka Kunci", + "Unlock All": "Buka Kunci Semua", + "Unlock Remaining ({{remaining}})": "Buka Kunci Sisanya ({{remaining}})", + "Unlocked": "Tidak Terkunci", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} dari {{length}} file berhasil dibuka kuncinya.", + "Unlocking...": "Membuka kunci...", + "Unresolved optional content reference": "Referensi konten opsional tidak terselesaikan", + "Unsupported ECDSA curve in signer certificate": "Kurva ECDSA tidak didukung di sertifikat penandatangan", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Gambar tidak didukung. Silakan gunakan PNG atau JPG untuk watermark.", + "Unsupported digest OID {{digestOid}}": "OID digest tidak didukung {{digestOid}}", + "Unsupported file type: .{{ext}}": "Jenis file tidak didukung: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID algoritma tanda tangan tidak didukung {{oid}}", + "Unterminated array or dictionary in content stream": "Array atau kamus tidak ditutup di aliran konten", + "Unterminated hex string in content stream": "String hex tidak ditutup di aliran konten", + "Unterminated inline image in content stream": "Gambar inline tidak ditutup di aliran konten", + "Unterminated string in content stream": "String tidak ditutup di aliran konten", + "Unverified: Unsupported Signature Algorithm": "Tidak Terverifikasi: Algoritma Tanda Tangan Tidak Didukung", + "Updating metadata...": "Memperbarui metadata...", + "Upload Certificate": "Unggah Sertifikat", + "Upload Comics": "Unggah Komik", + "Upload Documents": "Unggah Dokumen", + "Upload EPUB Files": "Unggah File EPUB", + "Upload Email Files": "Unggah File Email", + "Upload FB2 Files": "Unggah File FB2", + "Upload Images": "Unggah Gambar", + "Upload JSON Files": "Unggah File JSON", + "Upload MOBI Files": "Unggah File MOBI", + "Upload Markdown Files": "Unggah File Markdown", + "Upload ODG Files": "Unggah File ODG", + "Upload PDFs": "Unggah PDF", + "Upload PUB Files": "Unggah File PUB", + "Upload Pages Files": "Unggah File Pages", + "Upload Presentations": "Unggah Presentasi", + "Upload SVG Files": "Unggah File SVG", + "Upload Spreadsheets": "Unggah Spreadsheet", + "Upload Text Files": "Unggah File Teks", + "Upload Visio Files": "Unggah File Visio", + "Upload WPD Files": "Unggah File WPD", + "Upload WPS Files": "Unggah File WPS", + "Upload XML Files": "Unggah File XML", + "Upload XPS Files": "Unggah File XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Unggah PDF lalu klik \"Buat Pratinjau\" untuk melihat tata letak buklet", + "Upload images and convert to PDF": "Unggah gambar dan konversi ke PDF", + "Upload one or more PDF files": "Unggah satu atau beberapa file PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Huruf besar A-Z, angka 0-9, dan - . $ / + % SPASI", + "Use same password for all files": "Gunakan kata sandi yang sama untuk semua file", + "User Password": "Kata Sandi Pengguna", + "VSD to PDF": "VSD ke PDF", + "Valid From": "Berlaku Dari", + "Valid Signature": "Tanda Tangan Valid", + "Valid Until": "Berlaku Hingga", + "Validating {{n}} of {{length}}: {{name}}": "Memvalidasi {{n}} dari {{length}}: {{name}}", + "Validating...": "Memvalidasi...", + "Value": "Nilai", + "Value (e.g., Marketing)": "Nilai (mis., Pemasaran)", + "Vertical": "Vertikal", + "Viewer not ready": "Penampil belum siap", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Penampil belum siap. Silakan unggah PDF dan tunggu hingga selesai dimuat.", + "Visibility": "Visibilitas", + "Visio Files": "File Visio", + "WPD to PDF": "WPD ke PDF", + "WPS Files": "File WPS", + "WPS to PDF": "WPS ke PDF", + "Watermark": "Watermark", + "Watermark added successfully!": "Watermark berhasil ditambahkan!", + "Web Crypto API not available in this context": "Web Crypto API tidak tersedia dalam konteks ini", + "Web Crypto import/verify failed: {{error}}": "Impor/verifikasi Web Crypto gagal: {{error}}", + "WebP": "WebP", + "Whitelist": "Daftar Putih", + "Width ({{unit}})": "Lebar ({{unit}})", + "Word": "Word", + "Word Documents": "Dokumen Word", + "Word to PDF": "Word ke PDF", + "WordPerfect Files": "File WordPerfect", + "Worker crashed": "Worker mengalami crash", + "Worker error occurred. Check console for details.": "Terjadi kesalahan pada worker. Periksa konsol untuk detailnya.", + "Workflow completed": "Alur kerja selesai", + "Wrong password": "Kata sandi salah", + "Wrong password for: {{join}}": "Kata sandi salah untuk: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Kata sandi salah atau gagal mendekripsi \"{{name}}\".", + "X Position": "Posisi X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "File XML", + "XML to PDF": "XML ke PDF", + "XMP Metadata": "Metadata XMP", + "XPS Files": "File XPS", + "XPS to PDF": "XPS ke PDF", + "Y Position": "Posisi Y", + "Year must be between 1900 and 2100": "Tahun harus antara 1900 dan 2100", + "Yellow": "Kuning", + "Yellowish": "Kekuningan", + "You cannot delete the last page of the document.": "Anda tidak dapat menghapus halaman terakhir dokumen.", + "Your PDF has been cropped and the download has started.": "PDF Anda telah dipangkas dan unduhan telah dimulai.", + "Your PDF has been downloaded successfully.": "PDF Anda berhasil diunduh.", + "Your PDF has been posterized.": "PDF Anda telah diposterisasi.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Redaksi Anda diterapkan pada halaman, tetapi file ini terenkripsi, sehingga BentoPDF tidak dapat sekaligus menghapus salinan teks yang diredaksi dari properti, bookmark, dan lampirannya. Untuk pembersihan menyeluruh, redaksi salinan yang tidak terenkripsi lalu tambahkan kata sandi dengan Lindungi PDF. Tetap unduh?", + "Your workflow needs at least one input node and one output node to run.": "Alur kerja Anda memerlukan setidaknya satu node masukan dan satu node keluaran agar dapat berjalan.", + "ZIP archive created successfully!": "Arsip ZIP berhasil dibuat!", + "Zoom(%)": "Zoom(%)", + "e.g. dd/mm/yyyy HH:MM:ss": "mis. dd/mm/yyyy HH:MM:ss", + "form": "formulir", + "https://example.com": "https://example.com", + "signature found": "tanda tangan ditemukan", + "signatures found": "tanda tangan ditemukan", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} node", + "{{count}} nodes": "{{count}} node", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 halaman", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} halaman", + "{{length}} Files Need a Password": "{{length}} File Memerlukan Kata Sandi", + "{{length}} PDF file(s) selected": "{{length}} file PDF dipilih", + "{{length}} PDF files selected": "{{length}} file PDF dipilih", + "{{length}} attachment(s) extracted successfully!": "{{length}} lampiran berhasil diekstrak!", + "{{length}} file • {{totalPages}} total pages": "{{length}} file • {{totalPages}} total halaman", + "{{length}} file(s) attached successfully.": "{{length}} file berhasil dilampirkan.", + "{{length}} files • {{totalPages}} total pages": "{{length}} file • {{totalPages}} total halaman", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} File ini dilindungi kata sandi, sehingga salinan terkompresnya tidak memiliki kata sandi. Gunakan Lindungi PDF untuk menambahkannya kembali.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} halaman)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} ditandatangani secara digital, sehingga dibiarkan apa adanya. Mengompresnya akan merusak tanda tangan. Untuk tetap mengompresnya, aktifkan Timpa perlindungan konten di Pengaturan Kustom; tanda tangannya akan dihapus.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} bukan PDF yang valid, sehingga tidak ditambahkan.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} dilindungi kata sandi. Masukkan kata sandinya pada kartu file, lalu kompres lagi.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (hal. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Tidak dapat memuat jumlah halaman", + "{{size}} • Loading pages...": "{{size}} • Memuat halaman...", + "{{size}} • Loading...": "{{size}} • Memuat...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} halaman", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} halaman", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} halaman", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} halaman", + "{{size}} • {{value}} pages": "{{size}} • {{value}} halaman", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF berhasil didekripsi.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF berhasil dilinearisasi.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} halaman → {{numSheets}} lembar keluaran", + "{{validCount}} valid": "{{validCount}} valid", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 halaman", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} halaman" +} diff --git a/public/locales/it/common.json b/public/locales/it/common.json index aa7e9e1f..a8ab73f6 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Apri il menu principale", "language": "Lingua", "searchLanguage": "Cerca lingua…", - "noLanguagesFound": "Nessuna lingua trovata" + "noLanguagesFound": "Nessuna lingua trovata", + "breadcrumb": "Breadcrumb" }, "donation": { "message": "Ti piace BentoPDF? Aiutaci a mantenerlo gratuito e open source!", @@ -236,6 +237,10 @@ "aboutUs": "Chi siamo", "faqLink": "FAQ", "contactUs": "Contattaci", + "tools": "Strumenti", + "pdfConverter": "Convertitore PDF", + "pdfSecurity": "Sicurezza PDF", + "mergeSplit": "Unisci e dividi PDF", "legal": "Legale", "termsAndConditions": "Termini e condizioni", "privacyPolicy": "Informativa sulla privacy", diff --git a/public/locales/it/tools.json b/public/locales/it/tools.json index 8a4a1479..6c016d8d 100644 --- a/public/locales/it/tools.json +++ b/public/locales/it/tools.json @@ -27,7 +27,22 @@ "name": "Unisci PDF", "subtitle": "Unisci più PDF in un unico file. Conserva i segnalibri.", "retainPageLabels": "Mantieni le etichette di pagina originali di ogni file", - "retainPageLabelsHint": "Disattivato (predefinito): il PDF unito usa la numerazione naturale 1–N. Attivato: le etichette di pagina originali di ogni file vengono mantenute (può produrre etichette duplicate)." + "retainPageLabelsHint": "Disattivato (predefinito): il PDF unito usa la numerazione naturale 1–N. Attivato: le etichette di pagina originali di ogni file vengono mantenute (può produrre etichette duplicate).", + "removeDuplicateFonts": "Rimuovi i font duplicati", + "alert": { + "thumbnailError": "Impossibile generare le miniature delle pagine", + "noSelection": "Nessun file o pagina selezionata da unire.", + "mergeSuccess": "PDF uniti con successo!", + "mergeFailed": "Impossibile unire i PDF.", + "mergeError": "Impossibile unire i PDF. Verifica che tutti i file siano validi e non protetti da password.", + "workerError": "Si è verificato un errore imprevisto durante l'unione.", + "loadError": "Impossibile caricare uno o più file PDF" + }, + "loader": { + "renderingPreviews": "Generazione anteprime delle pagine...", + "merging": "Unione dei PDF...", + "loadingDocuments": "Caricamento documenti PDF..." + } }, "splitPdf": { "name": "Dividi PDF", @@ -172,20 +187,20 @@ "subtitle": "Rimuovi i margini di ogni pagina del tuo PDF." }, "extractPages": { - "name": "Estrai Pagine", + "name": "Estrai pagine", "subtitle": "Salva una selezione di pagine come nuovi file." }, "duplicateOrganize": { - "name": "Duplica e Organizza", + "name": "Duplica e organizza", "subtitle": "Duplica, riordina ed elimina pagine.", "saveChanges": "Salva modifiche" }, "deletePages": { - "name": "Elimina Pagine", + "name": "Elimina pagine", "subtitle": "Rimuovi pagine specifiche dal tuo documento." }, "editBookmarks": { - "name": "Modifica Segnalibri", + "name": "Modifica segnalibri", "subtitle": "Aggiungi, modifica, importa, elimina ed estrai segnalibri PDF.", "autoExtractExisting": "Estrai automaticamente segnalibri esistenti", "importSectionTitle": "Oppure importa segnalibri", @@ -212,7 +227,7 @@ "workerErrorOccurred": "Si è verificato un errore worker. Controlla la console per i dettagli." }, "pageNumbers": { - "name": "Numeri di Pagina", + "name": "Numeri di pagina", "subtitle": "Inserisci i numeri di pagina nel tuo documento." }, "addPageLabels": { @@ -279,16 +294,16 @@ "subtitle": "Aggiungi numeri Bates sequenziali su uno o più file PDF." }, "addWatermark": { - "name": "Aggiungi Filigrana", + "name": "Aggiungi filigrana", "subtitle": "Applica testo o un'immagine sulle pagine del tuo PDF.", "applyToAllPages": "Applica a tutte le pagine" }, "headerFooter": { - "name": "Intestazione e Piè di Pagina", + "name": "Intestazione e piè di pagina", "subtitle": "Aggiungi testo nella parte superiore e inferiore delle pagine." }, "invertColors": { - "name": "Inverti Colori", + "name": "Inverti colori", "subtitle": "Crea una versione \"modalità scura\" del tuo PDF." }, "scannerEffect": { @@ -323,15 +338,15 @@ "processButton": "Applica regolazioni colore" }, "backgroundColor": { - "name": "Colore di Sfondo", + "name": "Colore di sfondo", "subtitle": "Cambia il colore di sfondo del tuo PDF." }, "changeTextColor": { - "name": "Cambia Colore Testo", + "name": "Cambia colore testo", "subtitle": "Cambia il colore del testo nel tuo PDF." }, "addStamps": { - "name": "Aggiungi Timbri", + "name": "Aggiungi timbri", "subtitle": "Aggiungi timbri immagine al tuo PDF usando la barra degli strumenti di annotazione.", "usernameLabel": "Nome sul timbro", "usernamePlaceholder": "Inserisci il tuo nome (per i timbri)", @@ -339,24 +354,24 @@ "saveButton": "Salva PDF timbrato" }, "removeAnnotations": { - "name": "Rimuovi Annotazioni", + "name": "Rimuovi annotazioni", "subtitle": "Rimuovi commenti, evidenziazioni e link." }, "pdfFormFiller": { - "name": "Compilatore Moduli PDF", + "name": "Compilatore moduli PDF", "subtitle": "Compila i moduli direttamente nel browser. Supporta anche i moduli XFA.", "uploadHint": "Carica un PDF con campi modulo. Compilali direttamente nel visualizzatore qui sotto, quindi clicca sul pulsante per salvare e scaricare il modulo compilato. Supporta anche moduli XFA.", "xfaNoteTitle": "Nota sui moduli XFA:", "xfaNoteDescription": "XFA (XML Forms Architecture) è un formato legacy supportato solo da alcuni visualizzatori PDF come BentoPDF e Firefox. Se apri un PDF XFA in altri software e vedi pagine vuote o nessun campo modulo, significa che quel visualizzatore non supporta XFA. Per visualizzare e compilare correttamente i moduli XFA, usa Firefox o il Form Filler di BentoPDF." }, "createPdfForm": { - "name": "Crea Modulo PDF", + "name": "Crea modulo PDF", "subtitle": "Crea moduli PDF compilabili con campi di testo drag-and-drop.", "orSeparator": "O", "createBlankPdf": "Crea PDF vuoto" }, "removeBlankPages": { - "name": "Rimuovi Pagine Vuote", + "name": "Rimuovi pagine vuote", "subtitle": "Rileva e elimina automaticamente le pagine vuote.", "sensitivityHint": "Più alto = più rigoroso, solo pagine completamente vuote. Più basso = consente pagine con qualche contenuto." }, @@ -503,7 +518,8 @@ "noFile": "Nessun file", "noFileExplanation": "Carica prima un file PDF.", "conversionSuccess": "PDF convertito in TIFF con successo!", - "conversionError": "Impossibile convertire il PDF in TIFF. Il file potrebbe essere danneggiato." + "conversionError": "Impossibile convertire il PDF in TIFF. Il file potrebbe essere danneggiato.", + "conversionOutOfMemory": "Il browser ha esaurito la memoria durante la conversione. Prova con un DPI più basso oppure deseleziona l'opzione TIFF multipagina per convertire le pagine una alla volta." } }, "pdfToCbz": { @@ -537,7 +553,7 @@ } }, "pdfToGreyscale": { - "name": "PDF in Scala di Grigi", + "name": "PDF in scala di grigi", "subtitle": "Converti tutti i colori in scala di grigi." }, "pdfToJson": { @@ -613,7 +629,7 @@ "multiLanguageSupportDescription": "Seleziona più lingue per documenti contenenti contenuto in lingue miste." }, "alternateMerge": { - "name": "Alterna e Riordina Pagine", + "name": "Alterna e mescola pagine", "subtitle": "Unisci i PDF alternando le pagine di ogni file. Conserva i segnalibri.", "retainPageLabels": "Mantieni le etichette di pagina originali di ogni file", "retainPageLabelsHint": "Disattivato (predefinito): il PDF unito usa la numerazione naturale 1–N. Attivato: le etichette di pagina originali di ogni file vengono mantenute (può produrre etichette duplicate)." @@ -664,27 +680,27 @@ "faqBackOrderAnswer": "Dipende da come è stata inserita la pila nel secondo passaggio. Girando l'intera pila i retri risultano in ordine inverso, che è l'impostazione predefinita. Se il tuo scanner li ha restituiti nello stesso ordine dei fronti, scegli di mantenere il blocco così com'è." }, "addAttachments": { - "name": "Aggiungi Allegati", + "name": "Aggiungi allegati", "subtitle": "Incorpora uno o più file nel tuo PDF." }, "extractAttachments": { - "name": "Estrai Allegati", + "name": "Estrai allegati", "subtitle": "Estrai tutti i file incorporati dai PDF come archivio ZIP." }, "editAttachments": { - "name": "Modifica Allegati", + "name": "Modifica allegati", "subtitle": "Visualizza o rimuovi gli allegati nel tuo PDF." }, "dividePages": { - "name": "Dividi Pagine", + "name": "Dividi pagine", "subtitle": "Dividi le pagine orizzontalmente o verticalmente." }, "addBlankPage": { - "name": "Aggiungi Pagina Vuota", + "name": "Aggiungi pagina vuota", "subtitle": "Inserisci una pagina vuota in qualsiasi punto del tuo PDF." }, "reversePages": { - "name": "Inverti Pagine", + "name": "Inverti pagine", "subtitle": "Inverti l'ordine di tutte le pagine del documento." }, "rotatePdf": { @@ -692,7 +708,7 @@ "subtitle": "Ruota le pagine per multipli di 90 gradi." }, "rotateCustom": { - "name": "Ruota di Gradi Personalizzati", + "name": "Ruota di gradi personalizzati", "subtitle": "Ruota le pagine di un angolo personalizzato." }, "nUpPdf": { @@ -700,15 +716,15 @@ "subtitle": "Disponi più pagine su un unico foglio." }, "combineToSinglePage": { - "name": "Combina in Una Pagina", + "name": "Combina in una pagina", "subtitle": "Unisci tutte le pagine in un'unica pagina continua." }, "viewMetadata": { - "name": "Visualizza Metadati", + "name": "Visualizza metadati", "subtitle": "Ispeziona le proprietà nascoste del tuo PDF." }, "editMetadata": { - "name": "Modifica Metadati", + "name": "Modifica metadati", "subtitle": "Modifica autore, titolo e altre proprietà." }, "pdfsToZip": { @@ -764,7 +780,7 @@ "subtitle": "Dividi una pagina grande in più pagine più piccole." }, "fixPageSize": { - "name": "Correggi Dimensione Pagina", + "name": "Correggi dimensione pagina", "subtitle": "Uniforma tutte le pagine a una dimensione standard." }, "linearizePdf": { @@ -772,11 +788,11 @@ "subtitle": "Ottimizza il PDF per una visualizzazione web più veloce." }, "pageDimensions": { - "name": "Dimensioni Pagina", + "name": "Dimensioni pagina", "subtitle": "Analizza dimensione, orientamento e unità delle pagine." }, "removeRestrictions": { - "name": "Rimuovi Restrizioni", + "name": "Rimuovi restrizioni", "subtitle": "Rimuovi la protezione tramite password e le restrizioni di sicurezza associate ai PDF firmati digitalmente." }, "repairPdf": { @@ -990,8 +1006,7 @@ "subtitle": "Estrai il testo dai file PDF e salvalo come testo semplice (.txt). Supporta più file.", "noteLabel": "Nota:", "noteText": "Questo strumento funziona SOLO con PDF creati digitalmente. Per documenti scansionati o PDF basati su immagini, usa invece il nostro strumento OCR PDF.", - "convertButton": "Estrai testo", - "note": "Questo strumento funziona SOLO con PDF creati digitalmente. Per documenti scansionati o basati su immagini, usa invece il nostro strumento OCR PDF." + "convertButton": "Estrai testo" }, "digitalSignPdf": { "name": "Firma digitale PDF", @@ -1100,7 +1115,7 @@ "convertButton": "Converti in PDF" }, "fontToOutline": { - "name": "Font in Contorni", + "name": "Font in contorni", "subtitle": "Converti tutti i font in contorni vettoriali per una visualizzazione coerente su tutti i dispositivi." }, "deskewPdf": { @@ -1189,7 +1204,7 @@ "workerError": "Errore del worker: {{message}}", "alternateMergeWorkerError": "Errore del worker di unione alternata: {{message}}", "noPdfFilesUploaded": "Nessun file PDF caricato nel nodo di input PDF", - "failedToLoadFile": "Impossibile caricare \"{{file}}\" — il file potrebbe essere danneggiato", + "failedToLoadFile": "Impossibile caricare \"{{file}}\": il file potrebbe essere danneggiato", "noImagesUploaded": "Nessuna immagine caricata nel nodo di input Immagine", "noWordDocsUploaded": "Nessun documento caricato nel nodo di input Word", "noExcelUploaded": "Nessun foglio di calcolo caricato nel nodo di input Excel", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Assolutamente! Tutta l'elaborazione avviene nel tuo browser. I tuoi file non lasciano mai il tuo dispositivo, garantendo la massima privacy." }, "unlockPdf": { - "name": "Decrittografa PDF", + "name": "Sblocca PDF", "subtitle": "Sblocca il PDF rimuovendo la protezione tramite password." }, "protectPdf": { - "name": "Cripta PDF", + "name": "Proteggi PDF", "subtitle": "Proteggi il tuo PDF aggiungendo una password." } } diff --git a/public/locales/it/ui.json b/public/locales/it/ui.json new file mode 100644 index 00000000..ae926b9d --- /dev/null +++ b/public/locales/it/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(corretto)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ altri {{n}}...", + "- Error parsing XMP XML. Displaying raw. -": "- Errore nell'analisi dell'XML XMP. Visualizzazione dei dati grezzi. -", + "- No Info Dictionary data found -": "- Nessun dato del dizionario Info trovato -", + "- No XMP metadata found -": "- Nessun metadato XMP trovato -", + "- No interactive form fields found -": "- Nessun campo modulo interattivo trovato -", + "- No parseable XMP properties found -": "- Nessuna proprietà XMP analizzabile trovata -", + "-- Select existing group --": "-- Seleziona un gruppo esistente --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (molto sensibile)", + "0.5° (Default)": "0,5° (predefinito)", + "1.0° (Normal)": "1,0° (normale)", + "100 (Fast)": "100 (veloce)", + "150 (Default)": "150 (predefinito)", + "1x2 (Booklet)": "1x2 (opuscolo)", + "2.0° (Less Sensitive)": "2,0° (meno sensibile)", + "200 (Better)": "200 (migliore)", + "200 (Good)": "200 (buona)", + "2x2 (4-up)": "2x2 (4 per foglio)", + "2x4 (8-up)": "2x4 (8 per foglio)", + "300 (Best Quality)": "300 (qualità massima)", + "300 (Print)": "300 (stampa)", + "4x4 (16-up)": "4x4 (16 per foglio)", + "600 (High Quality)": "600 (alta qualità)", + "72 (Screen)": "72 (schermo)", + "90° Clockwise": "90° in senso orario", + "90° Counter-clockwise": "90° in senso antiorario", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Esiste già un campo chiamato \"{{fieldName}}\". Rinomina questo campo con un nome univoco prima di scaricare.", + "A new version of BentoPDF is available. Reload to update?": "È disponibile una nuova versione di BentoPDF. Ricaricare per aggiornare?", + "A single PDF file": "Un singolo file PDF", + "A template with this name already exists.": "Esiste già un modello con questo nome.", + "ASCII characters (letters, numbers, symbols)": "Caratteri ASCII (lettere, numeri, simboli)", + "Action": "Azione", + "Add Blank Page": "Aggiungi pagina vuota", + "Add Bookmark": "Aggiungi segnalibro", + "Add Child Bookmark": "Aggiungi segnalibro secondario", + "Add Child Layer": "Aggiungi livello secondario", + "Add More Comics": "Aggiungi altri fumetti", + "Add More Documents": "Aggiungi altri documenti", + "Add More EPUB Files": "Aggiungi altri file EPUB", + "Add More Email Files": "Aggiungi altri file email", + "Add More FB2 Files": "Aggiungi altri file FB2", + "Add More Files": "Aggiungi altri file", + "Add More Images": "Aggiungi altre immagini", + "Add More JSON Files": "Aggiungi altri file JSON", + "Add More MOBI Files": "Aggiungi altri file MOBI", + "Add More Markdown Files": "Aggiungi altri file Markdown", + "Add More ODG Files": "Aggiungi altri file ODG", + "Add More PUB Files": "Aggiungi altri file PUB", + "Add More Pages Files": "Aggiungi altri file Pages", + "Add More Presentations": "Aggiungi altre presentazioni", + "Add More SVG Files": "Aggiungi altri file SVG", + "Add More Spreadsheets": "Aggiungi altri fogli di calcolo", + "Add More Text Files": "Aggiungi altri file di testo", + "Add More Visio Files": "Aggiungi altri file Visio", + "Add More WPD Files": "Aggiungi altri file WPD", + "Add More WPS Files": "Aggiungi altri file WPS", + "Add More XML Files": "Aggiungi altri file XML", + "Add More XPS Files": "Aggiungi altri file XPS", + "Add a new layer to get started!": "Aggiungi un nuovo livello per iniziare!", + "Add a text box": "Aggiungi una casella di testo", + "Add an RFC 3161 document timestamp": "Aggiungi una marca temporale RFC 3161 al documento", + "Add an image": "Aggiungi un'immagine", + "Add at least one node to run the workflow.": "Aggiungi almeno un nodo per eseguire il workflow.", + "Add child": "Aggiungi elemento secondario", + "Add child layer": "Aggiungi livello secondario", + "Add header and footer text": "Aggiungi testo di intestazione e piè di pagina", + "Add page numbers": "Aggiungi i numeri di pagina", + "Add searchable text layer via OCR": "Aggiungi un livello di testo ricercabile tramite OCR", + "Add text watermark": "Aggiungi una filigrana di testo", + "Add/Edit/Extract Attachments": "Aggiungi/Modifica/Estrai allegati", + "Added": "Aggiunto", + "Added \"{{afterText}}\"": "Aggiunto \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Immagine aggiunta ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} pagina vuota aggiunta con successo!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} pagine vuote aggiunte con successo!", + "Adding header & footer...": "Aggiunta di intestazione e piè di pagina...", + "Adding page numbers...": "Aggiunta dei numeri di pagina...", + "Adding watermark...": "Aggiunta della filigrana...", + "Adding {{insertCount}} blank page...": "Aggiunta di {{insertCount}} pagina vuota...", + "Adding {{insertCount}} blank pages...": "Aggiunta di {{insertCount}} pagine vuote...", + "Adding {{name}} ({{n}}/{{length}})...": "Aggiunta di {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Regola colori", + "Adjust brightness, contrast, and colors": "Regola luminosità, contrasto e colori", + "Advanced": "Avanzate", + "Advanced Feature Required": "Funzione avanzata richiesta", + "Advanced Settings": "Impostazioni avanzate", + "After Page": "Dopo la pagina", + "After Page...": "Dopo la pagina...", + "Align Objects": "Allinea oggetti", + "Alignment": "Allineamento", + "All": "Tutto", + "All files repaired successfully!": "Tutti i file sono stati riparati con successo!", + "Alternate Merge": "Unione alternata", + "Alternating and mixing pages...": "Alternanza e mescolamento delle pagine...", + "Always resample to that resolution": "Ricampiona sempre a quella risoluzione", + "An error occurred during compression. Error: {{error}}": "Si è verificato un errore durante la compressione. Errore: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Si è verificato un errore durante la conversione. Errore: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Si è verificato un errore durante la conversione. Errore: {{message}}", + "An error occurred during cropping.": "Si è verificato un errore durante il ritaglio.", + "An error occurred during extraction. Error: {{error}}": "Si è verificato un errore durante l'estrazione. Errore: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Si è verificato un errore durante la rasterizzazione. Errore: {{error}}", + "An error occurred during sanitization: {{msg}}": "Si è verificato un errore durante la sanitizzazione: {{msg}}", + "An error occurred while combining pages.": "Si è verificato un errore durante la combinazione delle pagine.", + "An error occurred while creating the N-Up PDF.": "Si è verificato un errore durante la creazione del PDF N-Up.", + "An error occurred while creating the booklet.": "Si è verificato un errore durante la creazione dell'opuscolo.", + "An error occurred while dividing the PDF.": "Si è verificato un errore durante la divisione del PDF.", + "An error occurred while mixing the PDFs.": "Si è verificato un errore durante il mescolamento dei PDF.", + "An error occurred while standardizing pages.": "Si è verificato un errore durante l'uniformazione delle pagine.", + "An error occurred while trying to remove metadata.": "Si è verificato un errore durante la rimozione dei metadati.", + "An error occurred: {{error}}": "Si è verificato un errore: {{error}}", + "An error occurred: {{error}}.": "Si è verificato un errore: {{error}}.", + "An owner password is required when setting permissions": "Per impostare i permessi è necessaria una password proprietario", + "An unexpected error occurred during the repair process.": "Si è verificato un errore imprevisto durante la riparazione.", + "An unexpected error occurred.": "Si è verificato un errore imprevisto.", + "Analyzing data structure...": "Analisi della struttura dei dati...", + "Analyzing full PDF metadata...": "Analisi completa dei metadati del PDF...", + "Analyzing signatures...": "Analisi delle firme...", + "Angle": "Angolo", + "Annotations removed successfully!": "Annotazioni rimosse con successo!", + "Any text, URL, or data": "Qualsiasi testo, URL o dato", + "Application": "Applicazione", + "Apply a digital signature to PDF": "Applica una firma digitale al PDF", + "Apply and download": "Applica e scarica", + "Apply redactions?": "Applicare le redazioni?", + "Apply scanner simulation effect": "Applica l'effetto di simulazione scanner", + "Applying Bates numbers...": "Applicazione della numerazione Bates...", + "Applying color adjustments...": "Applicazione delle regolazioni dei colori...", + "Applying crop...": "Applicazione del ritaglio...", + "Applying redactions...": "Applicazione delle redazioni...", + "Applying rotations...": "Applicazione delle rotazioni...", + "Applying scanner effect...": "Applicazione dell'effetto scanner...", + "Applying timestamp...": "Applicazione della marca temporale...", + "Applying {{replace}}...": "Applicazione di {{replace}}...", + "Archive contains an oversized image entry.": "L'archivio contiene un'immagine troppo grande.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "L'archivio contiene troppe immagini (massimo {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "L'archivio è troppo grande una volta decompresso.", + "Are you sure you want to reset? All your work will be lost.": "Vuoi davvero reimpostare? Tutto il tuo lavoro andrà perso.", + "Area (Coordinates)": "Area (coordinate)", + "Area ({{unit}}²)": "Area ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman e Courier New vengono associati agli equivalenti integrati. Applicato solo quando è sicuro.", + "Arrange multiple pages per sheet": "Disponi più pagine per foglio", + "Arrange pages for booklet printing": "Disponi le pagine per la stampa a opuscolo", + "Aspect Ratio": "Proporzioni", + "At least one PDF document is required for export.": "Per l'esportazione è richiesto almeno un documento PDF.", + "At least two valid PDFs are required.": "Sono necessari almeno due PDF validi.", + "Attaching files to PDF...": "Allegare i file al PDF...", + "Attachments updated successfully!": "Allegati aggiornati con successo!", + "Author": "Autore", + "Auto (Keep Original)": "Auto (mantieni originale)", + "Back": "Retro", + "Back to Home": "Torna alla home", + "Background Color": "Colore di sfondo", + "Background color changed successfully!": "Colore di sfondo modificato con successo!", + "Barcode": "Codice a barre", + "Barcode Format": "Formato del codice a barre", + "Barcode Value": "Valore del codice a barre", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Numerazione Bates applicata con successo! (da {{batesStart}} a {{n}})", + "Beginning": "Inizio", + "Binarize": "Binarizza", + "Blank Position": "Posizione della pagina vuota", + "Blue": "Blu", + "Blur": "Sfocatura", + "Bold": "Grassetto", + "Bold & Italic": "Grassetto e corsivo", + "Booklet": "Opuscolo", + "Booklet created with {{numSheets}} sheets!": "Opuscolo creato con {{numSheets}} fogli!", + "Bookmarks imported from JSON!": "Segnalibri importati da JSON!", + "Bookmarks page": "Pagina dei segnalibri", + "Border": "Bordo", + "Border Color": "Colore del bordo", + "Bottom": "In basso", + "Bottom Center": "In basso al centro", + "Bottom Left": "In basso a sinistra", + "Bottom Right": "In basso a destra", + "Bottom edge in points": "Margine inferiore in punti", + "Brightness": "Luminosità", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli e la rasterizzazione sono stati saltati per mantenere il formato PDF/A.", + "Brotli compression (PDF 2.0)": "Compressione Brotli (PDF 2.0)", + "Browser Note:": "Nota sul browser:", + "Building new PDF...": "Creazione del nuovo PDF...", + "Building page pairing model...": "Creazione del modello di abbinamento delle pagine...", + "Button": "Pulsante", + "ByteRange does not start at the beginning of the file": "ByteRange non inizia all'inizio del file", + "ByteRange out of bounds": "ByteRange fuori dai limiti", + "CBZ to PDF": "CBZ in PDF", + "CSV Loaded": "CSV caricato", + "CSV file is empty": "Il file CSV è vuoto", + "Cancel": "Annulla", + "Cannot Delete": "Impossibile eliminare", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Impossibile accedere ai controlli del visualizzatore. Usa il pulsante Scarica nella barra degli strumenti del visualizzatore PDF qui sopra.", + "Cannot delete all pages": "Impossibile eliminare tutte le pagine", + "Cannot delete all pages.": "Impossibile eliminare tutte le pagine.", + "Canvas context failed": "Contesto canvas non riuscito", + "Canvas context unavailable": "Contesto canvas non disponibile", + "Canvas toBlob conversion failed.": "Conversione canvas toBlob non riuscita.", + "Canvas toBlob failed": "Canvas toBlob non riuscito", + "Center": "Centro", + "Certificate (.pfx, .p12, .pem)": "Certificato (.pfx, .p12, .pem)", + "Certificate Expired": "Certificato scaduto", + "Certificate Password": "Password del certificato", + "Certificate unlocked": "Certificato sbloccato", + "Change Certificate": "Cambia certificato", + "Change background color": "Cambia colore di sfondo", + "Changing background color...": "Modifica del colore di sfondo...", + "Changing text color...": "Modifica del colore del testo...", + "Character": "Carattere", + "Checked State": "Stato selezionato", + "Choose a valid page range.": "Scegli un intervallo di pagine valido.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Scegli una delle lingue incluse oppure ricompila il bundle air-gapped aggiungendo la lingua mancante a --ocr-languages.", + "Cleanup": "Pulizia", + "Click on PDF to Pick Location": "Clicca sul PDF per scegliere la posizione", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Clicca il pulsante qui sopra, poi clicca sul PDF dove vuoi che il segnalibro punti", + "Click to Upload Image": "Clicca per caricare un'immagine", + "Clicking this field in the PDF will open a file picker to upload an image.": "Cliccando su questo campo nel PDF si aprirà un selettore di file per caricare un'immagine.", + "Clip invisible parts of images": "Taglia le parti invisibili delle immagini", + "Close": "Chiudi", + "Close (Esc)": "Chiudi (Esc)", + "Close panel": "Chiudi pannello", + "Closes tab": "Chiude la scheda", + "Closes window": "Chiude la finestra", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (segnalibri e metadati)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF non è configurato. Configuralo nelle impostazioni WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF ha prodotto un file decrittografato vuoto.", + "CoherentPDF: not configured.": "CoherentPDF: non configurato.", + "Color": "Colore", + "Color adjustments applied successfully!": "Regolazioni dei colori applicate con successo!", + "Colors inverted successfully!": "Colori invertiti con successo!", + "Cols": "Colonne", + "Combine multiple PDFs into one": "Unisci più PDF in uno solo", + "Combine to Single Page": "Combina in una pagina", + "Combining pages...": "Combinazione delle pagine...", + "Comic Archives": "Archivi di fumetti", + "Comments and markup become part of the page. Form fields and links keep working.": "Commenti e annotazioni diventano parte della pagina. I campi modulo e i link continuano a funzionare.", + "Complete": "Completato", + "Complete!": "Completato!", + "Compress": "Comprimi", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF compressi. Dimensione totale ridotta da {{totalOriginalSize}} a {{totalCompressedSize}} (risparmio del {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF compressi. Dimensione totale: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Compressione di più PDF...", + "Compressing to {{size}}...": "Compressione a {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Compressione {{n}}/{{length}}: {{name}}...", + "Compressing...": "Compressione...", + "Compression Complete": "Compressione completata", + "Compression Finished": "Compressione terminata", + "Compression Level": "Livello di compressione", + "Configure": "Configura", + "Confirm": "Conferma", + "Confirm Action": "Conferma azione", + "Conformance": "Conformità", + "Connected": "Connesso", + "Contact Info": "Informazioni di contatto", + "Content": "Contenuto", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "L'hash del contenuto non corrisponde all'attributo messageDigest: il PDF è stato modificato dopo la firma", + "Contrast": "Contrasto", + "Conversion Complete": "Conversione completata", + "Conversion Error": "Errore di conversione", + "Conversion engine ready!": "Motore di conversione pronto!", + "Conversion failed: could not create PDF/A definition": "Conversione non riuscita: impossibile creare la definizione PDF/A", + "Convert Apple Pages documents to PDF": "Converti documenti Apple Pages in PDF", + "Convert EPUB ebooks to PDF": "Converti ebook EPUB in PDF", + "Convert Excel spreadsheets to PDF": "Converti fogli di calcolo Excel in PDF", + "Convert FB2 e-books to PDF": "Converti ebook FB2 in PDF", + "Convert JSON files to PDF": "Converti file JSON in PDF", + "Convert MOBI e-books to PDF": "Converti ebook MOBI in PDF", + "Convert Markdown files to PDF": "Converti file Markdown in PDF", + "Convert Microsoft Publisher to PDF": "Converti Microsoft Publisher in PDF", + "Convert OpenDocument Graphics to PDF": "Converti OpenDocument Graphics in PDF", + "Convert PDF pages to SVG": "Converti le pagine PDF in SVG", + "Convert PDF pages to images (ZIP)": "Converti le pagine PDF in immagini (ZIP)", + "Convert PDF tables to CSV": "Converti le tabelle PDF in CSV", + "Convert PDF tables to Excel": "Converti le tabelle PDF in Excel", + "Convert PDF to Markdown text": "Converti il PDF in testo Markdown", + "Convert PDF to PDF/A for archiving": "Converti il PDF in PDF/A per l'archiviazione", + "Convert PDF to Word document": "Converti il PDF in documento Word", + "Convert PowerPoint presentations to PDF": "Converti presentazioni PowerPoint in PDF", + "Convert SVG files to PDF": "Converti file SVG in PDF", + "Convert To Grayscale": "Converti in scala di grigi", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Converti diagrammi Visio (VSD/VSDX) in PDF", + "Convert WPS Office documents to PDF": "Converti documenti WPS Office in PDF", + "Convert Word documents to PDF": "Converti documenti Word in PDF", + "Convert WordPerfect documents to PDF": "Converti documenti WordPerfect in PDF", + "Convert XML documents to PDF": "Converti documenti XML in PDF", + "Convert XPS/OXPS documents to PDF": "Converti documenti XPS/OXPS in PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Converti archivi di fumetti (CBZ/CBR) in PDF", + "Convert email files (.eml, .msg) to PDF": "Converti file email (.eml, .msg) in PDF", + "Convert fonts to vector outlines": "Converti i font in contorni vettoriali", + "Convert plain text to PDF": "Converti testo semplice in PDF", + "Convert to grayscale": "Converti in scala di grigi", + "Convert to greyscale": "Converti in scala di grigi", + "Convert to image-based PDF": "Converti in PDF basato su immagini", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} file convertiti ({{totalPages}} pagine) in SVG!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} pagine convertite in SVG!", + "Converter not initialized": "Convertitore non inizializzato", + "Converting BMP to PDF...": "Conversione da BMP a PDF...", + "Converting HEIC to PDF...": "Conversione da HEIC a PDF...", + "Converting TIFF to PDF...": "Conversione da TIFF a PDF...", + "Converting emails...": "Conversione delle email...", + "Converting files...": "Conversione dei file...", + "Converting fonts to outlines...": "Conversione dei font in contorni...", + "Converting images to PDF...": "Conversione delle immagini in PDF...", + "Converting multiple PDFs to PDF/A...": "Conversione di più PDF in PDF/A...", + "Converting multiple RTF files to PDF...": "Conversione di più file RTF in PDF...", + "Converting multiple files...": "Conversione di più file...", + "Converting page {{n}} of {{pageCount}}...": "Conversione della pagina {{n}} di {{pageCount}}...", + "Converting to Markdown...": "Conversione in Markdown...", + "Converting to SVG...": "Conversione in SVG...", + "Converting to greyscale...": "Conversione in scala di grigi...", + "Converting to {{level}}...": "Conversione in {{level}}...", + "Converting {{name}}...": "Conversione di {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Conversione {{n}}/{{length}}: {{name}}...", + "Converting...": "Conversione...", + "Copied": "Copiato", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Impossibile accedere all'esportatore del PDF con timbri. Usa il pulsante Esporta → PDF nella barra degli strumenti del visualizzatore come alternativa.", + "Could not add blank page.": "Impossibile aggiungere la pagina vuota.", + "Could not add blank pages.": "Impossibile aggiungere le pagine vuote.", + "Could not add header or footer.": "Impossibile aggiungere l'intestazione o il piè di pagina.", + "Could not add page numbers.": "Impossibile aggiungere i numeri di pagina.", + "Could not add the watermark.": "Impossibile aggiungere la filigrana.", + "Could not apply rotations.": "Impossibile applicare le rotazioni.", + "Could not change text color.": "Impossibile cambiare il colore del testo.", + "Could not change the background color.": "Impossibile cambiare il colore di sfondo.", + "Could not create ZIP archive.": "Impossibile creare l'archivio ZIP.", + "Could not create canvas context.": "Impossibile creare il contesto canvas.", + "Could not create comparison canvas context.": "Impossibile creare il contesto canvas di confronto.", + "Could not create offscreen comparison canvas.": "Impossibile creare il canvas di confronto fuori schermo.", + "Could not create visual diff context.": "Impossibile creare il contesto della differenza visiva.", + "Could not create visual diff overlay context.": "Impossibile creare il contesto dell'overlay della differenza visiva.", + "Could not detect blank pages.": "Impossibile rilevare le pagine vuote.", + "Could not display the page.": "Impossibile visualizzare la pagina.", + "Could not export comparison PDF.": "Impossibile esportare il PDF di confronto.", + "Could not export the signed PDF. Please try again.": "Impossibile esportare il PDF firmato. Riprova.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Impossibile esportare il PDF con timbri. Usa il pulsante Esporta → PDF nella barra degli strumenti del visualizzatore come alternativa.", + "Could not extract signer public key": "Impossibile estrarre la chiave pubblica del firmatario", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Impossibile trovare {{testFile}} all'URL indicato (HTTP {{status}}). Assicurati che il file esista.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Impossibile analizzare completamente il PDF. Potrebbe essere danneggiato o avere una struttura insolita.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Impossibile generare un'anteprima. Il file potrebbe essere danneggiato o contenere funzioni non supportate. Errore: {{message}}", + "Could not get canvas context": "Impossibile ottenere il contesto canvas", + "Could not invert PDF colors.": "Impossibile invertire i colori del PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Impossibile caricare il PDF. Potrebbe essere danneggiato o protetto da password.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Impossibile caricare il PDF. Il file potrebbe non essere valido, essere danneggiato o protetto da password.", + "Could not load the PDF engine. Please refresh the page and try again.": "Impossibile caricare il motore PDF. Aggiorna la pagina e riprova.", + "Could not parse signer info": "Impossibile analizzare le informazioni del firmatario", + "Could not posterize the PDF.": "Impossibile posterizzare il PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Impossibile elaborare \"{{name}}\". Il file potrebbe essere danneggiato.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Impossibile ridurre ulteriormente le dimensioni del file. Originale: {{originalSize}}, nuovo: {{compressedSize}}.", + "Could not remove annotations.": "Impossibile rimuovere le annotazioni.", + "Could not remove blank pages.": "Impossibile rimuovere le pagine vuote.", + "Could not remove leftover data from the PDF.": "Impossibile rimuovere i dati residui dal PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Impossibile rimuovere il testo oscurato dai dati del documento, quindi il file non è stato scaricato.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Impossibile invertire le pagine del PDF. Controlla che i tuoi file siano PDF validi.", + "Could not update metadata. Please check that date formats are correct.": "Impossibile aggiornare i metadati. Controlla che i formati delle date siano corretti.", + "Count": "Conteggio", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Creato", + "Creating Booklet...": "Creazione dell'opuscolo...", + "Creating Excel file...": "Creazione del file Excel...", + "Creating N-Up PDF...": "Creazione del PDF N-Up...", + "Creating PDF from JPGs...": "Creazione del PDF dai JPG...", + "Creating PDF from SVG files...": "Creazione del PDF dai file SVG...", + "Creating PDF...": "Creazione del PDF...", + "Creating ZIP archive...": "Creazione dell'archivio ZIP...", + "Creating ZIP file...": "Creazione del file ZIP...", + "Creating ZIP...": "Creazione dello ZIP...", + "Creating table...": "Creazione della tabella...", + "Creator": "Creatore", + "Crop": "Ritaglia", + "Crop complete! Your download has started.": "Ritaglio completato! Il download è iniziato.", + "Cryptographic verification failed": "Verifica crittografica non riuscita", + "Custom": "Personalizzato", + "Custom Format": "Formato personalizzato", + "Custom Height": "Altezza personalizzata", + "Custom Units": "Unità personalizzate", + "Custom Width": "Larghezza personalizzata", + "Custom Zoom": "Zoom personalizzato", + "Custom...": "Personalizzato...", + "DataMatrix": "DataMatrix", + "Date Format": "Formato data", + "Decrease size": "Riduci dimensione", + "Decrypt": "Decrittografa", + "Decrypting PDF...": "Decrittografia del PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Decrittografia di {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Decrittografia di {{n}} su {{length}}: {{name}}", + "Decrypting...": "Decrittografia...", + "Decryption Failed": "Decrittografia non riuscita", + "Delete": "Elimina", + "Delete \"{{title}}\"?": "Eliminare \"{{title}}\"?", + "Delete Field": "Elimina campo", + "Delete Page": "Elimina pagina", + "Delete Pages": "Elimina pagine", + "Delete all {{length}} bookmark(s) ? ": "Eliminare tutti i {{length}} segnalibri?", + "Delete layer": "Elimina livello", + "Delete {{size}} bookmark(s) ? ": "Eliminare {{size}} segnalibri?", + "Deleted": "Eliminato", + "Deleted {{size}} page(s) successfully!": "{{size}} pagine eliminate con successo!", + "Deleting pages...": "Eliminazione delle pagine...", + "Description": "Descrizione", + "Description for screen readers": "Descrizione per gli screen reader", + "Deselect All": "Deseleziona tutto", + "Deskew": "Raddrizza", + "Deskew PDF": "Raddrizza PDF", + "Deskewed {{length}} file(s). {{value}}": "Raddrizzati {{length}} file. {{value}}", + "Deskewing {{name}}...": "Raddrizzamento di {{name}}...", + "Destination": "Destinazione", + "Detecting blank pages...": "Rilevamento delle pagine vuote...", + "Digest Algorithm:": "Algoritmo di digest:", + "Digital Sign": "Firma digitale", + "Direction": "Direzione", + "Divide Pages": "Dividi pagine", + "Divide into boxes (0 to disable)": "Dividi in riquadri (0 per disattivare)", + "Document Properties": "Proprietà del documento", + "Document Type": "Tipo di documento", + "Document properties": "Proprietà del documento", + "Document-level attachment": "Allegato a livello di documento", + "Done: back to tools": "Fatto, torna agli strumenti", + "Download": "Scarica", + "Download Edited PDF": "Scarica il PDF modificato", + "Download anyway": "Scarica comunque", + "Download as PDF or ZIP automatically": "Scarica automaticamente come PDF o ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} file PDF scaricati in un archivio ZIP.", + "Downloads started for all files.": "Download avviato per tutti i file.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Rimuove i tag, su cui si basano gli screen reader.", + "Duplicate Field Name": "Nome campo duplicato", + "Duplicate Field Names": "Nomi campo duplicati", + "Duplicate Page": "Duplica pagina", + "Duplicate Page Numbers": "Numeri di pagina duplicati", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "La firma ECDSA non è verificabile con la chiave pubblica del firmatario", + "EPUB Files": "File EPUB", + "EPUB to PDF": "EPUB in PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ in PDF", + "Edit": "Modifica", + "Edit All": "Modifica tutto", + "Edit Bookmark": "Modifica segnalibro", + "Edit Bookmarks": "Modifica segnalibri", + "Edit Images": "Modifica immagini", + "Edit Metadata": "Modifica metadati", + "Edit PDF metadata": "Modifica i metadati del PDF", + "Edit Scope": "Ambito di modifica", + "Edit Shapes": "Modifica forme", + "Edit Text": "Modifica testo", + "Edit tool": "Strumento di modifica", + "Edit {{scopes}}": "Modifica {{scopes}}", + "Email Files": "File email", + "Email to PDF": "Email in PDF", + "Embedding files into PDF...": "Incorporamento dei file nel PDF...", + "Empty signature bytes": "Byte della firma vuoti", + "Encrypt": "Cripta", + "Encrypt PDF with password": "Cripta il PDF con una password", + "Encrypted file": "File criptato", + "Encrypting PDF with 256-bit AES...": "Crittografia del PDF con AES a 256 bit...", + "Encryption Failed": "Crittografia non riuscita", + "Encryption resulted in an empty file.": "La crittografia ha prodotto un file vuoto.", + "End": "Fine", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Inserisci 0 per inserire all'inizio, oppure {{pageCount}} per inserire alla fine.", + "Enter bookmark title": "Inserisci il titolo del segnalibro", + "Enter name for child layer under \"{{Layer}}\":": "Inserisci il nome del livello secondario sotto \"{{Layer}}\":", + "Enter password": "Inserisci la password", + "Enter password...": "Inserisci la password...", + "Enter passwords for each encrypted file": "Inserisci le password per ogni file criptato", + "Error": "Errore", + "Error during execution": "Errore durante l'esecuzione", + "Error generating PDF: {{error}}": "Errore nella generazione del PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Errore nel caricamento del file PDF. Riprova con un PDF valido.", + "Error reading files: {{error}}": "Errore nella lettura dei file: {{error}}", + "Error saving PDF. Check console for details.": "Errore nel salvataggio del PDF. Controlla la console per i dettagli.", + "Error: {{error}}": "Errore: {{error}}", + "Exactly 11 or 12 digits": "Esattamente 11 o 12 cifre", + "Exactly 12 or 13 digits": "Esattamente 12 o 13 cifre", + "Example of current format:": "Esempio del formato attuale:", + "Excel to PDF": "Excel in PDF", + "Existing Radio Groups": "Gruppi di opzioni esistenti", + "Export Error": "Errore di esportazione", + "Export Value": "Valore di esportazione", + "Export failed": "Esportazione non riuscita", + "External processing module needed": "Modulo di elaborazione esterno necessario", + "Extract Images": "Estrai immagini", + "Extract Pages": "Estrai pagine", + "Extract Tables": "Estrai tabelle", + "Extract a range of pages": "Estrai un intervallo di pagine", + "Extract all images from PDF": "Estrai tutte le immagini dal PDF", + "Extract pages as separate PDFs": "Estrai le pagine come PDF separati", + "Extract text from PDF": "Estrai il testo dal PDF", + "Extracted 1 table successfully!": "1 tabella estratta con successo!", + "Extracted text from {{length}} PDF files!": "Testo estratto da {{length}} file PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF estratti, {{failed}} non riusciti.", + "Extracted {{length}} page(s) successfully!": "{{length}} pagine estratte con successo!", + "Extracted {{length}} table(s) to Excel!": "{{length}} tabelle estratte in Excel!", + "Extracted {{length}} tables successfully!": "{{length}} tabelle estratte con successo!", + "Extracting attachments from {{length}} file(s)...": "Estrazione degli allegati da {{length}} file...", + "Extracting images from {{name}}...": "Estrazione delle immagini da {{name}}...", + "Extracting pages...": "Estrazione delle pagine...", + "Extracting tables...": "Estrazione delle tabelle...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Estrazione del testo dal file {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Estrazione del testo da più file...", + "Extracting text from {{name}}...": "Estrazione del testo da {{name}}...", + "Extracting text...": "Estrazione del testo...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Estrazione di {{name}} per l'IA ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Estrazione di {{name}} per l'IA...", + "Extracting...": "Estrazione...", + "Extraction Complete": "Estrazione completata", + "Extraction Error": "Errore di estrazione", + "Extraction Partial": "Estrazione parziale", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Estrazione completata! {{length}} allegati nel file ZIP ({{totalSize}}). Download avviato.", + "FB2 Files": "File FB2", + "FB2 to PDF": "FB2 in PDF", + "Failed": "Non riuscito", + "Failed to acquire 2D canvas context": "Impossibile ottenere il contesto canvas 2D", + "Failed to add child layer": "Impossibile aggiungere il livello secondario", + "Failed to apply Bates numbers.": "Impossibile applicare la numerazione Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "Impossibile applicare le regolazioni dei colori. Il file potrebbe essere danneggiato.", + "Failed to apply redactions.": "Impossibile applicare le redazioni.", + "Failed to apply scanner effect. The file might be corrupted.": "Impossibile applicare l'effetto scanner. Il file potrebbe essere danneggiato.", + "Failed to attach files: {{error}}": "Impossibile allegare i file: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Impossibile convertire BMP in PDF. Uno dei file potrebbe non essere valido.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Impossibile convertire HEIC in PDF. Uno dei file potrebbe non essere valido.", + "Failed to convert PDF to CSV. {{message}}": "Impossibile convertire il PDF in CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Impossibile convertire il PDF in Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Impossibile convertire il PDF in SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Impossibile convertire il PDF in scala di grigi. Il file potrebbe essere danneggiato.", + "Failed to convert PDF. It may be image-based or corrupted.": "Impossibile convertire il PDF. Potrebbe essere basato su immagini o danneggiato.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Impossibile convertire TIFF in PDF. Uno dei file potrebbe non essere valido.", + "Failed to convert images to PDF.": "Impossibile convertire le immagini in PDF.", + "Failed to convert text to PDF. {{error}}": "Impossibile convertire il testo in PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Impossibile convertire {{filename}} in PNG", + "Failed to copy metadata to clipboard.": "Impossibile copiare i metadati negli appunti.", + "Failed to create PDF.": "Impossibile creare il PDF.", + "Failed to create PNG blob": "Impossibile creare il blob PNG", + "Failed to create canvas context": "Impossibile creare il contesto canvas", + "Failed to create split PDFs.": "Impossibile creare i PDF divisi.", + "Failed to decode image: {{name}}": "Impossibile decodificare l'immagine: {{name}}", + "Failed to decrypt private key": "Impossibile decrittografare la chiave privata", + "Failed to decrypt. Try the Decrypt tool instead.": "Impossibile decrittografare. Prova invece lo strumento Decrittografa.", + "Failed to delete layer": "Impossibile eliminare il livello", + "Failed to delete pages.": "Impossibile eliminare le pagine.", + "Failed to deskew PDF: {{error}}": "Impossibile raddrizzare il PDF: {{error}}", + "Failed to download the edited PDF.": "Impossibile scaricare il PDF modificato.", + "Failed to edit attachments.": "Impossibile modificare gli allegati.", + "Failed to extract certificate from PFX file": "Impossibile estrarre il certificato dal file PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Impossibile estrarre le pagine (codice di uscita qpdf {{exitCode}}).", + "Failed to extract pages.": "Impossibile estrarre le pagine.", + "Failed to extract tables. {{message}}": "Impossibile estrarre le tabelle. {{message}}", + "Failed to extract text from PDF.": "Impossibile estrarre il testo dal PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Impossibile recuperare il profilo ICC da {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Impossibile recuperare il file del font: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Impossibile recuperare gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Impossibile recuperare {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Impossibile ottenere il contesto 2D per la pagina {{pageNumber}}", + "Failed to get canvas context": "Impossibile ottenere il contesto canvas", + "Failed to insert PDF. The file may be corrupted.": "Impossibile inserire il PDF. Il file potrebbe essere danneggiato.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Impossibile caricare Ghostscript da {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Impossibile caricare il file PDF.", + "Failed to load PDF for cropping.": "Impossibile caricare il PDF per il ritaglio.", + "Failed to load PDF for preview.": "Impossibile caricare il PDF per l'anteprima.", + "Failed to load PDF form viewer.": "Impossibile caricare il visualizzatore di moduli PDF.", + "Failed to load PDF layers": "Impossibile caricare i livelli del PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Impossibile caricare PyMuPDF dalla CDN: {{msg}}", + "Failed to load SVG image": "Impossibile caricare l'immagine SVG", + "Failed to load WebP image": "Impossibile caricare l'immagine WebP", + "Failed to load attachments from PDF.": "Impossibile caricare gli allegati dal PDF.", + "Failed to load files: {{error}}": "Impossibile caricare i file: {{error}}", + "Failed to load image.": "Impossibile caricare l'immagine.", + "Failed to load image: {{filename}}": "Impossibile caricare l'immagine: {{filename}}", + "Failed to load one or more PDF files.": "Impossibile caricare uno o più file PDF.", + "Failed to load script: {{url}}": "Impossibile caricare lo script: {{url}}", + "Failed to load template.": "Impossibile caricare il modello.", + "Failed to load the PDF Editor.": "Impossibile caricare l'editor PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Impossibile caricare il processore di immagini. Assicurati che il tuo browser supporti SharedArrayBuffer (richiede HTTPS o localhost).", + "Failed to parse CSV: {{error}}": "Impossibile analizzare il CSV: {{error}}", + "Failed to parse signature": "Impossibile analizzare la firma", + "Failed to parse the certificate file.": "Impossibile analizzare il file del certificato.", + "Failed to process HEIC file: {{name}}": "Impossibile elaborare il file HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Impossibile elaborare il file WebP: {{name}}", + "Failed to read file.": "Impossibile leggere il file.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Impossibile rimuovere le restrizioni. Il PDF potrebbe richiedere la password proprietario corretta.", + "Failed to render page": "Impossibile renderizzare la pagina", + "Failed to render page previews": "Impossibile renderizzare le anteprime delle pagine", + "Failed to render page previews.": "Impossibile renderizzare le anteprime delle pagine.", + "Failed to render page.": "Impossibile renderizzare la pagina.", + "Failed to save changes.": "Impossibile salvare le modifiche.", + "Failed to save the new PDF. Check console for details.": "Impossibile salvare il nuovo PDF. Controlla la console per i dettagli.", + "Failed to split PDF. Please check your selection.": "Impossibile dividere il PDF. Controlla la tua selezione.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Impossibile applicare la marca temporale al PDF: {{message}}\n\nProva un altro server TSA o controlla la tua connessione a internet.", + "Failed to toggle layer visibility": "Impossibile cambiare la visibilità del livello", + "Failed to validate signatures. The file may be corrupted.": "Impossibile convalidare le firme. Il file potrebbe essere danneggiato.", + "Features enabled by this module:": "Funzioni abilitate da questo modulo:", + "Field Name": "Nome campo", + "Field Name (Group Name)": "Nome campo (Nome gruppo)", + "Field Name Conflict": "Conflitto di nomi dei campi", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Il nome campo \"{{newName}}\" esiste già in questo {{value}}. Prova a usare un nome univoco.", + "Field name cannot be empty": "Il nome del campo non può essere vuoto", + "File": "File", + "File Size": "Dimensione file", + "File exists but could not be read. Check CORS configuration.": "Il file esiste ma non è stato possibile leggerlo. Controlla la configurazione CORS.", + "File list not found": "Elenco dei file non trovato", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Dimensione del file ridotta da {{originalSize}} a {{compressedSize}} (risparmio del {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "File {{n}}/{{length}}: pagina {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "File {{n}}/{{length}}: {{message}}", + "Filename": "Nome file", + "Files that failed: {{errorCount}}.": "File non riusciti: {{errorCount}}.", + "Fill (cover full target page)": "Riempi (copri l'intera pagina di destinazione)", + "Fill Color": "Colore di riempimento", + "Finalizing PDF...": "Finalizzazione del PDF...", + "Find & replace": "Trova e sostituisci", + "Finds the best quality under this size. 0 means no target.": "Trova la migliore qualità entro questa dimensione. 0 significa nessun obiettivo.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox e Chrome possono mostrare il formato nativo del selettore di date durante la selezione. Il formato corretto verrà applicato quando avrai finito di inserire la data.", + "First Indent": "Rientro prima riga", + "Fit (keep full page visible)": "Adatta (mantieni visibile l'intera pagina)", + "Fit Page": "Adatta alla pagina", + "Fix Page Size": "Correggi dimensione pagina", + "Flatten": "Appiattisci", + "Flatten Forms": "Appiattisci moduli", + "Flatten annotations": "Appiattisci annotazioni", + "Flatten form fields": "Appiattisci campi modulo", + "Flatten forms and annotations": "Appiattisci moduli e annotazioni", + "Flatten links": "Appiattisci link", + "Flattening PDF...": "Appiattimento del PDF...", + "Flattening and saving PDF...": "Appiattimento e salvataggio del PDF...", + "Flattening multiple PDFs...": "Appiattimento di più PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Appiattimento della pagina {{i}} di {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Appiattimento {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Porta il cursore sulla barra degli indirizzi", + "Font": "Font", + "Font Color": "Colore del font", + "Font Family": "Famiglia di font", + "Font Size": "Dimensione del font", + "Font size: {{bSize}} → {{aSize}}": "Dimensione del font: {{bSize}} → {{aSize}}", + "Font to Outline": "Font in contorni", + "Font: {{bFont}} → {{aFont}}": "Font: {{bFont}} → {{aFont}}", + "Fonts": "Font", + "Footer Center": "Piè di pagina al centro", + "Footer Left": "Piè di pagina a sinistra", + "Footer Right": "Piè di pagina a destra", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Per PDF composti solo da immagini, come le scansioni. Viene saltato quando il documento ha testo selezionabile, a meno che sia attivo Ignora la protezione dei contenuti.", + "Form fields stop being fillable.": "I campi modulo non sono più compilabili.", + "Format": "Formato", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Trovate {{length}} pagine vuote. Clicca su una pagina per deselezionarla.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Trovati {{length}} segnalibri esistenti. Sostituire i segnalibri attuali?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Trovate {{length}} immagini in {{length2}} PDF.", + "Front": "Fronte", + "Full Coverage": "Copertura completa", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Genera l'indice dai segnalibri", + "Generating High-Quality PDF...": "Generazione del PDF ad alta qualità...", + "Generating PDF...": "Generazione del PDF...", + "Generating ZIP file...": "Generazione del file ZIP...", + "Generating formatted content...": "Generazione del contenuto formattato...", + "Generating preview...": "Generazione dell'anteprima...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (conversione PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "La conversione RGB di Ghostscript non è riuscita con codice di uscita {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "La conversione di Ghostscript non è riuscita con codice di uscita {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript non ha prodotto il file di output", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript non è configurato. Configuralo nelle Impostazioni avanzate.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript non è configurato. Configuralo nelle impostazioni WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript non è configurato. PyMuPDF richiede Ghostscript per alcune operazioni. Configura entrambi nelle Impostazioni avanzate.", + "Ghostscript threw an exception: {{e}}": "Ghostscript ha generato un'eccezione: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Il wrapper di Ghostscript non espone l'interfaccia prevista. Previsto loadGS() o la classe GhostscriptWASM.", + "Go": "Vai", + "Go to page": "Vai alla pagina", + "Grayscale": "Scala di grigi", + "Green": "Verde", + "Greyscale": "Scala di grigi", + "Grid Mode": "Modalità griglia", + "Group Name (Must be same for group)": "Nome del gruppo (deve essere uguale per il gruppo)", + "H-Scale %": "Scala orizz. %", + "Hanging Indent": "Rientro sporgente", + "Hard reloads page": "Ricarica la pagina da zero", + "Header & Footer": "Intestazione e piè di pagina", + "Header & Footer added successfully!": "Intestazione e piè di pagina aggiunti con successo!", + "Header Center": "Intestazione al centro", + "Header Left": "Intestazione a sinistra", + "Header Right": "Intestazione a destra", + "Height ({{unit}})": "Altezza ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Nascondi", + "Hide Border": "Nascondi bordo", + "Hide password": "Nascondi password", + "Hides window": "Nasconde la finestra", + "High (288 DPI)": "Alta (288 DPI)", + "High (Smallest Files)": "Alta (file più piccoli)", + "Horizontal": "Orizzontale", + "Hue Shift": "Variazione di tonalità", + "Image Format": "Formato immagine", + "Image Input": "Immagine di input", + "Image quality": "Qualità dell'immagine", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Immagine ridimensionata da {{width}}×{{height}} a {{width2}}×{{height2}}", + "Images": "Immagini", + "Images above this are resampled down. None leaves resolution alone.": "Le immagini oltre questo valore vengono ricampionate. Nessuno lascia invariata la risoluzione.", + "Imported {{length}} bookmarks!": "{{length}} segnalibri importati!", + "Inches (in)": "Pollici (in)", + "Include Attachments": "Includi allegati", + "Include Cc Bcc": "Includi Cc e Ccn", + "Include this file": "Includi questo file", + "Incorrect Page Count": "Numero di pagine non corretto", + "Incorrect Password": "Password errata", + "Incorrect password": "Password errata", + "Incorrect password. Please try again.": "Password errata. Riprova.", + "Increase size": "Aumenta dimensione", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indicizzazione del PDF 1, pagina {{pageNumber}} di {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indicizzazione del PDF 2, pagina {{pageNumber}} di {{totalPages}}...", + "Info": "Info", + "Info Dictionary": "Dizionario Info", + "Inherit": "Eredita", + "Initialization Error": "Errore di inizializzazione", + "Initializing Ghostscript...": "Inizializzazione di Ghostscript...", + "Initializing PDF engine...": "Inizializzazione del motore PDF...", + "Initializing PyMuPDF...": "Inizializzazione di PyMuPDF...", + "Initializing decryption...": "Inizializzazione della decrittografia...", + "Initializing encryption...": "Inizializzazione della crittografia...", + "Initializing repair engine...": "Inizializzazione del motore di riparazione...", + "Initializing...": "Inizializzazione...", + "Input Required": "Input richiesto", + "Insecure Digest (MD5 / SHA-1)": "Digest non sicuro (MD5 / SHA-1)", + "Insert blank pages": "Inserisci pagine vuote", + "Insert blank pages after this page number": "Inserisci pagine vuote dopo questo numero di pagina", + "Interactive Form Fields": "Campi modulo interattivi", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Alterna le pagine di più PDF (ad es. dispari + pari invertite da una scansione fronte singolo)", + "Invalid Certificate": "Certificato non valido", + "Invalid File": "File non valido", + "Invalid Files": "File non validi", + "Invalid Input": "Input non valido", + "Invalid JSON format": "Formato JSON non valido", + "Invalid Name": "Nome non valido", + "Invalid Order": "Ordine non valido", + "Invalid PDF password.": "Password del PDF non valida.", + "Invalid Page Numbers": "Numeri di pagina non validi", + "Invalid Page Order": "Ordine delle pagine non valido", + "Invalid Pages": "Pagine non valide", + "Invalid Range": "Intervallo non valido", + "Invalid Signature": "Firma non valida", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL TSA non valido. L'autorità di marca temporale deve essere un URL http:// o https:// valido.", + "Invalid URL": "URL non valido", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Formato URL non valido. Inserisci un URL valido (ad es. https://example.com/wasm/)", + "Invalid XML: no root element": "XML non valido: nessun elemento radice", + "Invalid data": "Dati non validi", + "Invalid hex string in content stream": "Stringa esadecimale non valida nel flusso di contenuto", + "Invalid page range specified.": "Intervallo di pagine specificato non valido.", + "Invalid shortcut format": "Formato della scorciatoia non valido", + "Invalid: Cryptographic Verification Failed": "Non valida: verifica crittografica non riuscita", + "Invert Colors": "Inverti colori", + "Invert all colors": "Inverti tutti i colori", + "Inverting PDF colors...": "Inversione dei colori del PDF...", + "Issuer": "Emittente", + "It fits the {{targetBytes}} target.": "Rientra nell'obiettivo di {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "È ancora sopra l'obiettivo di {{targetBytes}} perché Mantieni PDF/A limita quanto può essere compresso.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Non dichiara più la conformità PDF/A. Attiva Mantieni PDF/A in Impostazioni personalizzate per conservarla.", + "Italic": "Corsivo", + "Item 1": "Elemento 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Le sue firme digitali sono state rimosse per poterlo comprimere. Firmalo di nuovo se necessario.", + "JPEG (Smaller file size)": "JPEG (file più piccolo)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Qualità JPEG per le immagini ricodificate, da 20 a 100. Un valore più basso significa file più piccoli e artefatti più visibili.", + "JPG": "JPG", + "JSON Files": "File JSON", + "JSON Loaded": "JSON caricato", + "JSON to PDF": "JSON in PDF", + "Javascript Code": "Codice JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Mantiene conforme un file PDF/A. Brotli e la rasterizzazione vengono saltati finché è attivo.", + "Keeps only the characters the document uses.": "Mantiene solo i caratteri usati dal documento.", + "Key (e.g., Department)": "Chiave (ad es. Reparto)", + "Keywords": "Parole chiave", + "Label": "Etichetta", + "Label / Prompt": "Etichetta / Messaggio", + "Landscape": "Orizzontale", + "Language": "Lingua", + "Layer not found": "Livello non trovato", + "Layer {{number}}": "Livello {{number}}", + "Leave blank for all pages": "Lascia vuoto per tutte le pagine", + "Left": "Sinistra", + "Left edge in points (1 inch = 72 pts)": "Margine sinistro in punti (1 pollice = 72 pt)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Livello", + "Limit recognized characters (leave empty for all)": "Limita i caratteri riconosciuti (lascia vuoto per tutti)", + "Line": "Linea", + "Linearization Failed": "Linearizzazione non riuscita", + "Linearize": "Linearizza", + "Links stop being clickable.": "I link non sono più cliccabili.", + "Lists": "Elenchi", + "Load": "Carica", + "Load system fonts": "Carica i font di sistema", + "Load system fonts…": "Carica i font di sistema…", + "Loaded": "Caricato", + "Loaded bookmarks from JSON. Now upload your PDF.": "Segnalibri caricati da JSON. Ora carica il tuo PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} segnalibri caricati da CSV. Ora carica il tuo PDF.", + "Loading Engine...": "Caricamento del motore...", + "Loading Ghostscript...": "Caricamento di Ghostscript...", + "Loading PDF Editor...": "Caricamento dell'editor PDF...", + "Loading PDF Text Editor...": "Caricamento dell'editor di testo PDF...", + "Loading PDF converter...": "Caricamento del convertitore PDF...", + "Loading PDF documents...": "Caricamento dei documenti PDF...", + "Loading PDF engine...": "Caricamento del motore PDF...", + "Loading PDF files...": "Caricamento dei file PDF...", + "Loading PDF form...": "Caricamento del modulo PDF...", + "Loading PDF processor...": "Caricamento del processore PDF...", + "Loading PDF viewer...": "Caricamento del visualizzatore PDF...", + "Loading PDF...": "Caricamento del PDF...", + "Loading PDFs...": "Caricamento dei PDF...", + "Loading attachments...": "Caricamento degli allegati...", + "Loading comparison {{currentPage}} of {{length}}...": "Caricamento del confronto {{currentPage}} di {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Caricamento del motore di conversione ({{percent}}%)...", + "Loading conversion engine...": "Caricamento del motore di conversione...", + "Loading engine...": "Caricamento del motore...", + "Loading fonts...": "Caricamento dei font...", + "Loading layers from {{name}}...": "Caricamento dei livelli da {{name}}...", + "Loading page {{num}}...": "Caricamento della pagina {{num}}...", + "Loading preview...": "Caricamento dell'anteprima...", + "Loading {{name}}...": "Caricamento di {{name}}...", + "Loading...": "Caricamento...", + "Location": "Posizione", + "Lossless (No Quality Loss)": "Senza perdita (nessuna perdita di qualità)", + "Lossless (no image re-encoding)": "Senza perdita (nessuna ricodifica delle immagini)", + "Low (Best Quality)": "Bassa (qualità migliore)", + "MOBI Files": "File MOBI", + "MOBI to PDF": "MOBI in PDF", + "Malformed ByteRange": "ByteRange non valido", + "Malformed ECDSA signature (could not parse r,s)": "Firma ECDSA non valida (impossibile analizzare r,s)", + "Malformed inline image in content stream": "Immagine inline non valida nel flusso di contenuto", + "Malformed signatureAlgorithm": "signatureAlgorithm non valido", + "Margins": "Margini", + "Markdown Files": "File Markdown", + "Markdown to PDF": "Markdown in PDF", + "Max Length (0 for unlimited)": "Lunghezza massima (0 per illimitata)", + "Maximum resolution": "Risoluzione massima", + "Medium (Recommended)": "Media (consigliata)", + "Merge PDF": "Unisci PDF", + "Merge PDFs": "Unisci PDF", + "Merge duplicate fonts": "Unisci i font duplicati", + "Mermaid Error: {{error}}": "Errore Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadati copiati negli appunti come JSON.", + "Metadata removed successfully!": "Metadati rimossi con successo!", + "Metadata updated successfully!": "Metadati aggiornati con successo!", + "Millimeters (mm)": "Millimetri (mm)", + "Minimizes window": "Riduce a icona la finestra", + "Missing Files": "File mancanti", + "Missing signatureAlgorithm": "signatureAlgorithm mancante", + "Mixed Page Sizes Detected": "Rilevati formati di pagina misti", + "Mixed Sizes": "Formati misti", + "Mode": "Modalità", + "Modified": "Modificato", + "Modified After Signing (signed part intact)": "Modificato dopo la firma (parte firmata intatta)", + "More": "Altro", + "Moved": "Spostato", + "Moved \"{{value}}\"": "Spostato \"{{value}}\"", + "Multi-line": "Più righe", + "Must be a positive integer": "Deve essere un numero intero positivo", + "Must be a positive number": "Deve essere un numero positivo", + "N must be at least 1.": "N deve essere almeno 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "PDF N-Up creato con successo!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Errore di rete: impossibile connettersi all'URL. Controlla che l'URL sia corretto e che il server consenta le richieste CORS.", + "Network error: {{error}}": "Errore di rete: {{error}}", + "Next page": "Pagina successiva", + "No Area Selected": "Nessuna area selezionata", + "No Attachments": "Nessun allegato", + "No Changes": "Nessuna modifica", + "No Crop Area": "Nessuna area di ritaglio", + "No File": "Nessun file", + "No Files": "Nessun file", + "No Images Found": "Nessuna immagine trovata", + "No PDF Files": "Nessun file PDF", + "No PDF document loaded": "Nessun documento PDF caricato", + "No PDF document loaded.": "Nessun documento PDF caricato.", + "No PDF file loaded.": "Nessun file PDF caricato.", + "No PDF files could be decrypted. The password may be incorrect.": "Nessun file PDF è stato decrittografato. La password potrebbe essere errata.", + "No PDF files could be linearized.": "Nessun file PDF è stato linearizzato.", + "No PDFs could be processed.": "Nessun PDF è stato elaborato.", + "No Pages": "Nessuna pagina", + "No Selection": "Nessuna selezione", + "No Signatures Found": "Nessuna firma trovata", + "No Tables Found": "Nessuna tabella trovata", + "No Text": "Nessun testo", + "No URL configured": "Nessun URL configurato", + "No attachments found in this PDF.": "Nessun allegato trovato in questo PDF.", + "No attachments selected for removal.": "Nessun allegato selezionato per la rimozione.", + "No blank pages detected in this PDF.": "Nessuna pagina vuota rilevata in questo PDF.", + "No bookmarks found at the selected level.": "Nessun segnalibro trovato al livello selezionato.", + "No bookmarks to delete.": "Nessun segnalibro da eliminare.", + "No bookmarks to export!": "Nessun segnalibro da esportare!", + "No certificate found in PEM file": "Nessun certificato trovato nel file PEM", + "No certificate found in PFX file": "Nessun certificato trovato nel file PFX", + "No certificates found in signature": "Nessun certificato trovato nella firma", + "No changes match the current filter.": "Nessuna modifica corrisponde al filtro attuale.", + "No configurable settings for this node.": "Nessuna impostazione configurabile per questo nodo.", + "No differences detected on this page.": "Nessuna differenza rilevata in questa pagina.", + "No embedded images were found in the selected PDF(s).": "Nessuna immagine incorporata trovata nei PDF selezionati.", + "No existing bookmarks found in this PDF.": "Nessun segnalibro esistente trovato in questo PDF.", + "No items were selected for removal or none were found in the PDF.": "Nessun elemento è stato selezionato per la rimozione oppure non ne sono stati trovati nel PDF.", + "No page pairs to export.": "Nessuna coppia di pagine da esportare.", + "No pages found. Please create a blank PDF or upload one.": "Nessuna pagina trovata. Crea un PDF vuoto o caricane uno.", + "No pages selected for removal.": "Nessuna pagina selezionata per la rimozione.", + "No pages were selected for splitting.": "Nessuna pagina selezionata per la divisione.", + "No paired page for this side.": "Nessuna pagina abbinata per questo lato.", + "No private key found in PEM file": "Nessuna chiave privata trovata nel file PEM", + "No private key found in PFX file": "Nessuna chiave privata trovata nel file PFX", + "No tables were detected in this PDF.": "Nessuna tabella rilevata in questo PDF.", + "No valid page numbers found.": "Nessun numero di pagina valido trovato.", + "No valid pages to save.": "Nessuna pagina valida da salvare.", + "No worker": "Nessun worker", + "Noise": "Rumore", + "None": "Nessuno", + "None of the files could be compressed: {{join}}.": "Nessuno dei file ha potuto essere compresso: {{join}}.", + "Normal": "Normale", + "Not Enough Files": "File insufficienti", + "Not a PDF": "Non è un PDF", + "Not connected": "Non connesso", + "Not in trust chain": "Non nella catena di fiducia", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Nota: senza una password proprietario separata, il PDF non ha restrizioni d'uso.", + "Number Format": "Formato numerico", + "Number of Pages": "Numero di pagine", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR interrotto prima dell'elaborazione di qualsiasi pagina", + "OCR recognize timed out after {{timeoutMs}}ms": "Riconoscimento OCR scaduto dopo {{timeoutMs}}ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "File ODG", + "ODG to PDF": "ODG in PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Disattivato (predefinito): numerazione naturale 1–N. Attivato: vengono conservate le etichette di pagina originali di ogni file (possono comparire etichette duplicate).", + "One PDF per page": "Un PDF per pagina", + "One PDF per range": "Un PDF per intervallo", + "Only a substitute font was available": "Era disponibile solo un font sostitutivo", + "Only where it does not change how the image looks.": "Solo dove non cambia l'aspetto dell'immagine.", + "Opacity": "Opacità", + "Open URL": "Apri URL", + "Opens incognito window": "Apre una finestra in incognito", + "Opens new tab": "Apre una nuova scheda", + "Opens new window": "Apre una nuova finestra", + "Operation Failed": "Operazione non riuscita", + "Operation resulted in an empty file.": "L'operazione ha prodotto un file vuoto.", + "Optimize PDF for fast web viewing": "Ottimizza il PDF per la visualizzazione web veloce", + "Optimizing PDFs for web view (linearizing)...": "Ottimizzazione dei PDF per il web (linearizzazione)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Ottimizzazione di {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opzioni (una per riga o separate da virgola)", + "Orientation": "Orientamento", + "Outline": "Contorno", + "Output": "Output", + "Overlay": "Sovrapposizione", + "Overlay or underlay pages from one PDF onto another": "Sovrapponi o sottoponi le pagine di un PDF a un altro", + "Owner Password": "Password proprietario", + "Owner Password Required": "Password proprietario richiesta", + "PDF": "PDF", + "PDF Files": "File PDF", + "PDF Input": "PDF di input", + "PDF Layers": "Livelli PDF", + "PDF Metadata": "Metadati PDF", + "PDF Producer": "Produttore PDF", + "PDF converted to CSV successfully!": "PDF convertito in CSV con successo!", + "PDF converted to SVG successfully!": "PDF convertito in SVG con successo!", + "PDF converted to greyscale successfully!": "PDF convertito in scala di grigi con successo!", + "PDF created successfully!": "PDF creato con successo!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF decrittografato con successo! Tutta la crittografia e le restrizioni sono state rimosse.", + "PDF decrypted successfully! Your download has started.": "PDF decrittografato con successo! Il download è iniziato.", + "PDF downloaded successfully.": "PDF scaricato con successo.", + "PDF encrypted successfully with 256-bit AES!": "PDF criptato con successo con AES a 256 bit!", + "PDF has been sanitized and downloaded.": "Il PDF è stato sanitizzato e scaricato.", + "PDF has no pages": "Il PDF non ha pagine", + "PDF organized successfully!": "PDF organizzato con successo!", + "PDF permissions changed successfully!": "Permessi del PDF modificati con successo!", + "PDF readers supply the 14 standard PDF fonts themselves.": "I lettori PDF forniscono da soli i 14 font PDF standard.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Restrizioni del PDF rimosse con successo! Il file ora è completamente modificabile e stampabile.", + "PDF saved successfully!": "PDF salvato con successo!", + "PDF split successfully!": "PDF diviso con successo!", + "PDF to CSV": "PDF in CSV", + "PDF to DOCX": "PDF in DOCX", + "PDF to Excel/CSV": "PDF in Excel/CSV", + "PDF to Images": "PDF in immagini", + "PDF to Images (High Quality)": "PDF in immagini (alta qualità)", + "PDF to JSON": "PDF in JSON", + "PDF to Markdown": "PDF in Markdown", + "PDF to PDF/A": "PDF in PDF/A", + "PDF to SVG": "PDF in SVG", + "PDF to Text": "PDF in testo", + "PDF to XLSX": "PDF in XLSX", + "PDF with layer changes saved!": "PDF con modifiche ai livelli salvato!", + "PDF {{modeLabel}} applied successfully.": "{{modeLabel}} del PDF applicato con successo.", + "PDF/A Conversion": "Conversione in PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (rigoroso, senza trasparenza)", + "PDF/A-2b (Recommended)": "PDF/A-2b (consigliato)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (moderno, consente allegati)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "I PDF sono stati mescolati con successo!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (senza perdita)", + "PUB to PDF": "PUB in PDF", + "Page": "Pagina", + "Page #": "Pagina n.", + "Page Added": "Pagina aggiunta", + "Page Numbers": "Numeri di pagina", + "Page Removed": "Pagina rimossa", + "Page Size": "Formato pagina", + "Page X of Y": "Pagina X di Y", + "Page background or layout changed": "Sfondo o layout della pagina modificato", + "Page container not found": "Contenitore della pagina non trovato", + "Page extraction produced an empty PDF.": "L'estrazione delle pagine ha prodotto un PDF vuoto.", + "Page number": "Numero di pagina", + "Page numbers added successfully!": "Numeri di pagina aggiunti con successo!", + "Page sizes standardized successfully!": "Formati di pagina uniformati con successo!", + "Page {{currentPageNum}} of {{numPages}}": "Pagina {{currentPageNum}} di {{numPages}}", + "Page {{num}} / {{numPages}}": "Pagina {{num}} / {{numPages}}", + "Page {{n}} ": "Pagina {{n}}", + "Page {{n}} of {{length}}": "Pagina {{n}} di {{length}}", + "Page {{n}}:": "Pagina {{n}}:", + "Page {{pageNumber}}": "Pagina {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "La pagina {{pageNumber}} esiste solo nel primo PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "La pagina {{pageNumber}} esiste solo nel secondo PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Pagina {{pageNumber}} di {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "La pagina {{pageNum}} non esiste in questo PDF.", + "Page {{page}}": "Pagina {{page}}", + "Page {{page}} attachment": "Allegato della pagina {{page}}", + "Pages": "Pagine", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Pagine (ad es. 1-3, 5) - Totale: {{pageCount}}", + "Pages Files": "File Pages", + "Pages Per Sheet": "Pagine per foglio", + "Pages combined successfully!": "Pagine combinate con successo!", + "Pages have been divided successfully!": "Le pagine sono state divise con successo!", + "Pages have been reordered.": "Le pagine sono state riordinate.", + "Pages have been reversed successfully!": "Le pagine sono state invertite con successo!", + "Pages to PDF": "Pages in PDF", + "Paper Size": "Formato carta", + "Paragraph": "Paragrafo", + "Parsing XML structure...": "Analisi della struttura XML...", + "Parsing {{name}}...": "Analisi di {{name}}...", + "Partial Coverage": "Copertura parziale", + "Partial Success": "Successo parziale", + "Password": "Password", + "Password Error": "Errore della password", + "Password Needed": "Password necessaria", + "Password Required": "Password richiesta", + "Password for all files": "Password per tutti i file", + "Password for all locked files": "Password per tutti i file bloccati", + "Password for {{name}}": "Password per {{name}}", + "Password protected": "Protetto da password", + "Password required for encrypted private key": "Password richiesta per la chiave privata criptata", + "Path Stroke": "Tracciato del percorso", + "Please add at least one field before downloading.": "Aggiungi almeno un campo prima di scaricare.", + "Please draw a rectangle on at least one page to select the crop area.": "Disegna un rettangolo su almeno una pagina per selezionare l'area di ritaglio.", + "Please ensure all page numbers in the order are unique.": "Assicurati che tutti i numeri di pagina nell'ordine siano univoci.", + "Please enter a layer name": "Inserisci il nome del livello", + "Please enter a name.": "Inserisci un nome.", + "Please enter a number between 0 and {{totalPages}}.": "Inserisci un numero compreso tra 0 e {{totalPages}}.", + "Please enter a page order.": "Inserisci un ordine delle pagine.", + "Please enter a password": "Inserisci una password", + "Please enter a password for {{i}} or skip it": "Inserisci una password per {{i}} oppure saltalo", + "Please enter a title.": "Inserisci un titolo.", + "Please enter a user password.": "Inserisci una password utente.", + "Please enter a valid number of pages (1 or more).": "Inserisci un numero di pagine valido (1 o più).", + "Please enter a valid page number between 1 and {{total}}": "Inserisci un numero di pagina valido tra 1 e {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Inserisci un intervallo di pagine valido (ad es. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Inserisci i numeri delle pagine da estrarre.", + "Please enter positive numbers.": "Inserisci numeri positivi.", + "Please enter some text to convert.": "Inserisci del testo da convertire.", + "Please enter text for the watermark.": "Inserisci il testo per la filigrana.", + "Please enter the PDF password.": "Inserisci la password del PDF.", + "Please load a PDF first.": "Carica prima un PDF.", + "Please select PDF files to create a ZIP archive.": "Seleziona i file PDF per creare un archivio ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Seleziona un file di certificato .pem, .crt, .cer o .der.", + "Please select a PDF file.": "Seleziona un file PDF.", + "Please select a valid PDF file.": "Seleziona un file PDF valido.", + "Please select an area on at least one page to crop.": "Seleziona un'area su almeno una pagina da ritagliare.", + "Please select an area to crop first.": "Seleziona prima un'area da ritagliare.", + "Please select an area to crop.": "Seleziona un'area da ritagliare.", + "Please select an image file for the watermark.": "Seleziona un file immagine per la filigrana.", + "Please select at least one BMP file.": "Seleziona almeno un file BMP.", + "Please select at least one CSV file.": "Seleziona almeno un file CSV.", + "Please select at least one Excel file.": "Seleziona almeno un file Excel.", + "Please select at least one HEIC file.": "Seleziona almeno un file HEIC.", + "Please select at least one JPG file.": "Seleziona almeno un file JPG.", + "Please select at least one JPG or JPEG2000 image.": "Seleziona almeno un'immagine JPG o JPEG2000.", + "Please select at least one ODT file.": "Seleziona almeno un file ODT.", + "Please select at least one PDF file.": "Seleziona almeno un file PDF.", + "Please select at least one PowerPoint file.": "Seleziona almeno un file PowerPoint.", + "Please select at least one RTF file.": "Seleziona almeno un file RTF.", + "Please select at least one SVG file.": "Seleziona almeno un file SVG.", + "Please select at least one TIFF file.": "Seleziona almeno un file TIFF.", + "Please select at least one Word document.": "Seleziona almeno un documento Word.", + "Please select at least one file to attach.": "Seleziona almeno un file da allegare.", + "Please select at least one image file.": "Seleziona almeno un file immagine.", + "Please select at least one text file.": "Seleziona almeno un file di testo.", + "Please select at least one {{FILETYPE_NAME}} file.": "Seleziona almeno un file {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Seleziona almeno un file {{TOOL_NAME}} (.eml o .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Seleziona almeno un file {{TOOL_NAME}}.", + "Please select even or odd pages.": "Seleziona le pagine pari o dispari.", + "Please select one or more PDF files.": "Seleziona uno o più file PDF.", + "Please select pages to delete.": "Seleziona le pagine da eliminare.", + "Please select pages to duplicate.": "Seleziona le pagine da duplicare.", + "Please select pages to mark for splitting.": "Seleziona le pagine da contrassegnare per la divisione.", + "Please select pages to rotate.": "Seleziona le pagine da ruotare.", + "Please specify a page range for page-level attachments.": "Specifica un intervallo di pagine per gli allegati a livello di pagina.", + "Please upload PDF files.": "Carica i file PDF.", + "Please upload PDFs first.": "Carica prima i PDF.", + "Please upload a .docx file first.": "Carica prima un file .docx.", + "Please upload a PDF file first.": "Carica prima un file PDF.", + "Please upload a PDF file.": "Carica un file PDF.", + "Please upload a PDF first.": "Carica prima un PDF.", + "Please upload a valid PDF file.": "Carica un file PDF valido.", + "Please upload at least one PDF file.": "Carica almeno un file PDF.", + "Please upload at least two PDF files to alternate and mix.": "Carica almeno due file PDF da alternare e mescolare.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Carica sia un PDF di base sia un PDF di sovrapposizione/sottoposizione.", + "Please upload valid PDF files.": "Carica file PDF validi.", + "Please use the Download button in the PDF viewer toolbar above.": "Usa il pulsante Scarica nella barra degli strumenti del visualizzatore PDF qui sopra.", + "Please wait for the PDF viewer to load.": "Attendi il caricamento del visualizzatore PDF.", + "Please wait for the form to finish loading.": "Attendi il termine del caricamento del modulo.", + "Portrait": "Verticale", + "Position": "Posizione", + "Post-processing for transparency compliance...": "Post-elaborazione per la conformità della trasparenza...", + "Posterize": "Posterizza", + "Posterizing PDF...": "Posterizzazione del PDF...", + "PowerPoint to PDF": "PowerPoint in PDF", + "Pre Flatten": "Pre-appiattimento", + "Pre-flattening PDF...": "Pre-appiattimento del PDF...", + "Prefer JPEG 2000 for photos": "Preferisci JPEG 2000 per le foto", + "Preparing PDF export...": "Preparazione dell'esportazione PDF...", + "Preparing conversion...": "Preparazione della conversione...", + "Preparing download...": "Preparazione del download...", + "Preparing preview...": "Preparazione dell'anteprima...", + "Presentations": "Presentazioni", + "Preserve PDF/A": "Mantieni PDF/A", + "Preview": "Anteprima", + "Preview Error": "Errore di anteprima", + "Preview Text": "Anteprima del testo", + "Previous page": "Pagina precedente", + "Print Form": "Stampa modulo", + "Private data that editing apps store inside the PDF.": "Dati privati che le app di modifica salvano all'interno del PDF.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF elaborati.", + "Processing Complete": "Elaborazione completata", + "Processing Dpi": "DPI di elaborazione", + "Processing Failed": "Elaborazione non riuscita", + "Processing PDF permissions...": "Elaborazione dei permessi del PDF...", + "Processing attachments...": "Elaborazione degli allegati...", + "Processing failed for {{name}}.": "Elaborazione non riuscita per {{name}}.", + "Processing file {{n}} of {{length}}...": "Elaborazione del file {{n}} di {{length}}...", + "Processing images...": "Elaborazione delle immagini...", + "Processing multiple PDFs...": "Elaborazione di più PDF...", + "Processing page {{i}} of {{numPages}}": "Elaborazione della pagina {{i}} di {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Elaborazione della pagina {{i}} di {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Elaborazione della pagina {{n}} di {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Elaborazione della pagina {{pageNum}} di {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Elaborazione della pagina {{pageNum}} di {{totalPages}}...", + "Processing produced an empty file.": "L'elaborazione ha prodotto un file vuoto.", + "Processing resulted in an empty file.": "L'elaborazione ha prodotto un file vuoto.", + "Processing sheet {{n}}...": "Elaborazione del foglio {{n}}...", + "Processing {{name}}...": "Elaborazione di {{name}}...", + "Processing {{nodeName}}...": "Elaborazione di {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Elaborazione {{n}}/{{length}}: {{name}}...", + "Processing...": "Elaborazione...", + "Producer": "Produttore", + "Publisher Files": "File Publisher", + "Purple": "Viola", + "PyMuPDF (Document Processing)": "PyMuPDF (elaborazione dei documenti)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF non è configurato. Configuralo nelle Impostazioni avanzate.", + "PyMuPDF module did not export expected PyMuPDF class.": "Il modulo PyMuPDF non ha esportato la classe PyMuPDF prevista.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF ha prodotto un file decrittografato vuoto.", + "PyMuPDF: not configured.": "PyMuPDF: non configurato.", + "QR Code": "Codice QR", + "Quality": "Qualità", + "Quits application (cannot be overridden)": "Chiude l'applicazione (non può essere sovrascritto)", + "RSA-PKCS1 signature does not verify against signer public key": "La firma RSA-PKCS1 non è verificabile con la chiave pubblica del firmatario", + "RSA-PSS signature does not verify against signer public key": "La firma RSA-PSS non è verificabile con la chiave pubblica del firmatario", + "Rasterization Complete": "Rasterizzazione completata", + "Rasterization Partial": "Rasterizzazione parziale", + "Rasterize": "Rasterizza", + "Rasterize Dpi": "DPI di rasterizzazione", + "Rasterize pages to images": "Rasterizza le pagine in immagini", + "Rasterize quality": "Qualità di rasterizzazione", + "Rasterize resolution (DPI)": "Risoluzione di rasterizzazione (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF rasterizzati, {{failed}} non riusciti.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rasterizzazione di {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rasterizzazione di {{name}}...", + "Rasterizing...": "Rasterizzazione...", + "Rating must be between 0 and 5": "La valutazione deve essere compresa tra 0 e 5", + "Read Only": "Sola lettura", + "Reading CSV file...": "Lettura del file CSV...", + "Reading PDF...": "Lettura del PDF...", + "Reading XML file...": "Lettura del file XML...", + "Reading encrypted PDF...": "Lettura del PDF criptato...", + "Reading files...": "Lettura dei file...", + "Reading layer configuration...": "Lettura della configurazione dei livelli...", + "Reading {{name}} ({{n}}/{{length}})...": "Lettura di {{name}} ({{n}}/{{length}})...", + "Ready": "Pronto", + "Reason": "Motivo", + "Red": "Rosso", + "Redact": "Oscura", + "Redact Mode": "Modalità redazione", + "Redact text from PDF": "Oscura il testo nel PDF", + "Redaction Failed": "Redazione non riuscita", + "Reduce PDF file size": "Riduci le dimensioni del file PDF", + "Reduce color complexity": "Riduci la complessità dei colori", + "Reduces file size by removing color information.": "Riduce le dimensioni del file rimuovendo le informazioni sui colori.", + "Reloads page": "Ricarica la pagina", + "Remove": "Rimuovi", + "Remove All Attachments": "Rimuovi tutti gli allegati", + "Remove Annotations": "Rimuovi annotazioni", + "Remove Blank Pages": "Rimuovi pagine vuote", + "Remove Embedded Files": "Rimuovi file incorporati", + "Remove Fonts": "Rimuovi font", + "Remove Javascript": "Rimuovi JavaScript", + "Remove Layers": "Rimuovi livelli", + "Remove Links": "Rimuovi link", + "Remove Mark Info": "Rimuovi Mark Info", + "Remove Metadata": "Rimuovi metadati", + "Remove PDF password protection": "Rimuovi la protezione con password dal PDF", + "Remove Structure Tree": "Rimuovi l'albero delle strutture", + "Remove alternate images": "Rimuovi le immagini alternative", + "Remove application data": "Rimuovi i dati dell'applicazione", + "Remove article threads": "Rimuovi i thread degli articoli", + "Remove attachment": "Rimuovi allegato", + "Remove blank pages automatically": "Rimuovi automaticamente le pagine vuote", + "Remove document structure tree": "Rimuovi l'albero della struttura del documento", + "Remove file": "Rimuovi file", + "Remove metadata, scripts, and hidden data": "Rimuovi metadati, script e dati nascosti", + "Remove output intents": "Rimuovi gli output intent", + "Remove page thumbnails": "Rimuovi le miniature delle pagine", + "Remove specific pages": "Rimuovi pagine specifiche", + "Remove web capture information": "Rimuovi le informazioni di acquisizione web", + "Remove {{name}}": "Rimuovi {{name}}", + "Removed \"{{beforeText}}\"": "Rimosso \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Immagine rimossa ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} pagine vuote rimosse con successo!", + "Removing all metadata...": "Rimozione di tutti i metadati...", + "Removing annotations...": "Rimozione delle annotazioni...", + "Removing redacted text from document data...": "Rimozione del testo oscurato dai dati del documento...", + "Removing restrictions...": "Rimozione delle restrizioni...", + "Removing {{length}} blank page(s)...": "Rimozione di {{length}} pagine vuote...", + "Render Error": "Errore di rendering", + "Rendering Page {{num}}...": "Rendering della pagina {{num}}...", + "Rendering page previews...": "Rendering delle anteprime delle pagine...", + "Rendering page previews: {{current}}/{{total}}": "Rendering delle anteprime delle pagine: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Rendering della pagina {{n}} di {{length}}...", + "Rendering preview for page {{pageNum}}...": "Rendering dell'anteprima per la pagina {{pageNum}}...", + "Reopens closed tab": "Riapre la scheda chiusa", + "Repair": "Ripara", + "Repair Failed": "Riparazione non riuscita", + "Repair corrupted PDF": "Ripara un PDF danneggiato", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} file riparati. Riparazione non riuscita per: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Riparazione di {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Riparazione di {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Sostituito \"{{beforeText}}\" con \"{{afterText}}\"", + "Required": "Obbligatorio", + "Resamples even when an image is only slightly above the limit.": "Ricampiona anche quando un'immagine supera il limite solo di poco.", + "Reset Form": "Reimposta modulo", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Reimpostare e tornare al caricamento dei file? Tutte le modifiche non salvate andranno perse.", + "Resolution": "Risoluzione", + "Retain Page Labels": "Mantieni le etichette di pagina", + "Retry Failed": "Riprova non riuscita", + "Reverse Pages": "Inverti pagine", + "Reverse page order": "Inverti l'ordine delle pagine", + "Reversing page order...": "Inversione dell'ordine delle pagine...", + "Reversing {{name}} ({{n}}/{{length}})...": "Inversione di {{name}} ({{n}}/{{length}})...", + "Right": "Destra", + "Right edge in points": "Margine destro in punti", + "Rotate": "Ruota", + "Rotate +90°": "Ruota di +90°", + "Rotate all pages": "Ruota tutte le pagine", + "Rotation": "Rotazione", + "Rotation Variance": "Variazione della rotazione", + "Rotations applied successfully!": "Rotazioni applicate con successo!", + "Rows": "Righe", + "Run Javascript": "Esegui JavaScript", + "Running OCR on page {{pageNum}}...": "Esecuzione dell'OCR sulla pagina {{pageNum}}...", + "Running...": "In esecuzione...", + "SVG": "SVG", + "SVG Files": "File SVG", + "SVG to PDF": "SVG in PDF", + "Sanitize": "Sanitizza", + "Sanitized With Warnings": "Sanitizzato con avvisi", + "Sanitizing PDF...": "Sanitizzazione del PDF...", + "Saturation": "Saturazione", + "Saved": "Salvato", + "Saving PDF with layer changes...": "Salvataggio del PDF con le modifiche ai livelli...", + "Scaling Mode": "Modalità di scala", + "Scanner Effect": "Effetto scanner", + "Scanner effect applied successfully!": "Effetto scanner applicato con successo!", + "Scanning page {{n}} of {{pageCount}}...": "Scansione della pagina {{n}} di {{pageCount}}...", + "Search Text": "Cerca testo", + "Search languages...": "Cerca lingua…", + "Select Font": "Seleziona font", + "Select a field to edit properties": "Seleziona un campo per modificarne le proprietà", + "Select a field...": "Seleziona un campo...", + "Select to add this button to an existing group": "Seleziona per aggiungere questo pulsante a un gruppo esistente", + "Selected Option": "Opzione selezionata", + "Self-Signed: Signer Identity Not Verified": "Autofirmato: identità del firmatario non verificata", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Le risorse OCR self-hosted sono configurate solo in parte. Imposta {{missing}} insieme agli altri URL delle risorse Tesseract.", + "Separator": "Separatore", + "Separator Color": "Colore del separatore", + "Separator Thickness": "Spessore del separatore", + "Sepia": "Seppia", + "Serial Number:": "Numero di serie:", + "Set custom destination": "Imposta destinazione personalizzata", + "Shapes": "Forme", + "Sheet {{n}} {{sideLabel}}": "Foglio {{n}} {{sideLabel}}", + "Show": "Mostra", + "Show password": "Mostra password", + "Show/Hide Field": "Mostra/Nascondi campo", + "Sign Here": "Firma qui", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents non è un singolo oggetto DER seguito da zero di riempimento", + "Signature Algorithm:": "Algoritmo di firma:", + "Signature Intact: Signer Identity Not Verified": "Firma integra: identità del firmatario non verificata", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "I campi firma sono campi firma AcroForm e sarebbero visibili solo in un visualizzatore PDF avanzato.", + "Signature has a missing or malformed /ByteRange": "La firma ha un /ByteRange mancante o non valido", + "Signature scheme {{kind}} not implemented": "Schema di firma {{kind}} non implementato", + "Signature {{n}}": "Firma {{n}}", + "Signatures": "Firme", + "Signed By": "Firmato da", + "Signed On": "Firmato il", + "Signed PDF Not Changed": "PDF firmato non modificato", + "Signed PDF downloaded successfully!": "PDF firmato scaricato con successo!", + "Signed PDF saved successfully!": "PDF firmato salvato con successo!", + "Simple (1, 2, 3)": "Semplice (1, 2, 3)", + "Simplify large color profiles": "Semplifica i profili colore di grandi dimensioni", + "Skew Threshold": "Soglia di inclinazione", + "Skip": "Salta", + "Skip All": "Salta tutto", + "Skip Remaining": "Salta i restanti", + "Skip this file": "Salta questo file", + "Skipped: {{join}}.": "Saltati: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "File più piccoli, ma possono aprirli solo i lettori con supporto Brotli, come Firefox, MuPDF 1.26+ e Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Alcuni file sono stati saltati perché non sono immagini supportate.", + "Some files were skipped. Only BMP files are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo file BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo file HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo file JPG, JPEG, JP2 e JPX.", + "Some files were skipped. Only PDF files are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo file PDF.", + "Some files were skipped. Only PNG images are allowed.": "Alcuni file sono stati saltati. Sono consentite solo immagini PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Alcuni file sono stati saltati. Sono consentite solo grafiche SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo file TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Alcuni file sono stati saltati. Sono consentite solo immagini WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo i formati di immagine supportati.", + "Some files were skipped. Only text files are allowed.": "Alcuni file sono stati saltati. Sono consentiti solo file di testo.", + "Some pages could not be processed. Please try again.": "Non è stato possibile elaborare alcune pagine. Riprova.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Non è stato possibile applicare alcuni segni di redazione, quindi il file non è stato scaricato. Applicali o rimuovili nell'editor e riprova.", + "Spacing": "Spaziatura", + "Split PDF": "Dividi PDF", + "Split by Bookmarks": "Dividi per segnalibri", + "Split pages into tile grid for poster printing": "Dividi le pagine in una griglia di riquadri per la stampa di poster", + "Split pages vertically or horizontally": "Dividi le pagine in verticale o in orizzontale", + "Splitting PDF pages...": "Divisione delle pagine del PDF...", + "Splitting PDF...": "Divisione del PDF...", + "Spreadsheets": "Fogli di calcolo", + "Standard (192 DPI)": "Standard (192 DPI)", + "Standard Size": "Formato standard", + "Standardize all pages to a target size": "Uniforma tutte le pagine a un formato di destinazione", + "Standardizing pages...": "Uniformazione delle pagine...", + "Stitch all pages into one continuous page": "Unisci tutte le pagine in un'unica pagina continua", + "Straighten skewed PDF pages": "Raddrizza le pagine PDF inclinate", + "Strip all annotations": "Rimuovi tutte le annotazioni", + "Style": "Stile", + "Style Changed": "Stile modificato", + "Style changed ({{length}} regions)": "Stile modificato ({{length}} regioni)", + "Subject": "Oggetto", + "Subset embedded fonts": "Crea un sottoinsieme dei font incorporati", + "Success": "Operazione riuscita", + "Success!": "Operazione riuscita!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} file CSV convertiti in PDF con successo.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} file Excel convertiti in PDF con successo.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} file ODT convertiti in PDF con successo.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF convertiti in DOCX con successo.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF convertiti in Markdown con successo.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF convertiti in {{level}} con successo.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} file PSD convertiti in un unico PDF con successo.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} file PowerPoint convertiti in PDF con successo.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} file RTF convertiti in PDF con successo.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} documenti Word convertiti in PDF con successo.", + "Successfully converted {{length}} files to PDF.": "{{length}} file convertiti in PDF con successo.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} file {{TOOL_NAME}} convertiti in PDF con successo.", + "Successfully converted {{name}} to DOCX.": "{{name}} convertito in DOCX con successo.", + "Successfully converted {{name}} to Markdown.": "{{name}} convertito in Markdown con successo.", + "Successfully converted {{name}} to PDF.": "{{name}} convertito in PDF con successo.", + "Successfully converted {{name}} to {{level}}.": "{{name}} convertito in {{level}} con successo.", + "Successfully extracted PDF for AI/LLM use.": "PDF estratto con successo per l'uso con IA/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF estratti con successo per l'uso con IA/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF rasterizzato con successo a {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF rasterizzati con successo a {{dpi}} DPI.", + "Supported: CBZ, CBR": "Supportati: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Supportati: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Supportati: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Supportati: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Supportati: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Supportati: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Supportati: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Supportati: XPS, OXPS", + "Switches apps": "Cambia app", + "Switches tabs": "Cambia scheda", + "Table of Contents": "Indice", + "Table {{n}} (Page {{page}})": "Tabella {{n}} (pagina {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Campo di destinazione", + "Target Kilobytes": "Kilobyte di destinazione", + "Target Not Reached": "Obiettivo non raggiunto", + "Target Size": "Dimensione di destinazione", + "Technical Details": "Dettagli tecnici", + "Temperature": "Temperatura", + "Template \"{{name}}\" loaded.": "Modello \"{{name}}\" caricato.", + "Template \"{{name}}\" saved.": "Modello \"{{name}}\" salvato.", + "Text": "Testo", + "Text Color": "Colore del testo", + "Text Files": "File di testo", + "Text color changed successfully!": "Colore del testo modificato con successo!", + "Text converted to PDF successfully!": "Testo convertito in PDF con successo!", + "Text extracted successfully!": "Testo estratto con successo!", + "Text to PDF": "Testo in PDF", + "That password did not open any of the remaining files.": "Quella password non ha aperto nessuno dei file rimanenti.", + "The PDF file(s) do not contain any attachments to extract.": "I file PDF non contengono allegati da estrarre.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "Il PDF ha {{totalPages}} pagine, un numero non divisibile in modo uniforme per {{nValue}}. L'ultimo PDF conterrà {{remainder}} pagine.", + "The PDF might be corrupted or password protected.": "Il PDF potrebbe essere danneggiato o protetto da password.", + "The PDF might be corrupted or password-protected.": "Il PDF potrebbe essere danneggiato o protetto da password.", + "The PDF might be corrupted.": "Il PDF potrebbe essere danneggiato.", + "The PDF viewer is still initializing.": "Il visualizzatore PDF è ancora in fase di inizializzazione.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "Il PDF è stato scaricato, ma non è stato possibile completare questi passaggi: {{join}}. Il contenuto che riguardano potrebbe essere ancora nel file.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "L'URL ha restituito un tipo di contenuto inatteso: {{contentType}}. Era previsto un file JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "I byte esclusi da /ByteRange non sono esattamente una firma codificata in esadecimale", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "I byte esclusi da /ByteRange non sono il /Contents di questa firma", + "The compression engine returned an unreadable result.": "Il motore di compressione ha restituito un risultato illeggibile.", + "The compression engine stopped unexpectedly.": "Il motore di compressione si è interrotto in modo imprevisto.", + "The current password you entered is incorrect. Please try again.": "La password attuale che hai inserito non è corretta. Riprova.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "I seguenti nomi di campo esistono già nel PDF caricato: {{conflictList}}. Rinomina questi campi prima di scaricare.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "I seguenti nomi di campo sono usati più di una volta: {{duplicateList}}. Rinomina questi campi con nomi univoci prima di scaricare.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Il numero di pagine specificato ({{length}}) non corrisponde al numero attuale di pagine del documento ({{currentGridCount}}). Indica un ordinamento completo per tutte le pagine.", + "The password you entered is incorrect. Please try again.": "La password che hai inserito non è corretta. Riprova.", + "The password you entered is wrong or the file is corrupted.": "La password che hai inserito è errata oppure il file è danneggiato.", + "The provided file could not be loaded as an image. It may be corrupted.": "Non è stato possibile caricare il file fornito come immagine. Potrebbe essere danneggiato.", + "The requested OCR language is not available: {{unavailableText}}.": "La lingua OCR richiesta non è disponibile: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "L'ordine delle pagine specificato è incompleto o contiene numeri di pagina non validi. Indica una nuova posizione per ogni pagina originale.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Questi file non sono PDF validi, quindi non sono stati aggiunti: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Questi file sono protetti da password: {{names}}. Inserisci le password nelle schede dei file, oppure rimuovili, poi comprimi di nuovo.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Questa versione di BentoPDF include i dati OCR solo per {{availableText}}.", + "This PDF does not contain any digital signatures.": "Questo PDF non contiene firme digitali.", + "This PDF has no layers (OCG).": "Questo PDF non ha livelli (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Questo PDF è protetto da password. Inserisci la password attuale per procedere.", + "This document contains pages with different dimensions:": "Questo documento contiene pagine con dimensioni diverse:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Questo documento ha 1 segno di oscuramento non ancora applicato. Finché un segno non viene applicato, il contenuto sottostante resta nel file. Applicare tutti i segni e scaricare?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Questo documento ha {{count}} segni di oscuramento non ancora applicati. Finché un segno non viene applicato, il contenuto sottostante resta nel file. Applicare tutti i segni e scaricare?", + "This feature requires {{name}} to be configured.": "Questa funzione richiede che {{name}} sia configurato.", + "This file is not a valid PDF.": "Questo file non è un PDF valido.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Questo modulo è concesso in licenza AGPL-3.0. Configurandolo, accetti i termini della sua licenza.", + "This tool has been disabled": "Questo strumento è stato disattivato", + "This tool is not available in your deployment. Contact your administrator for more information.": "Questo strumento non è disponibile nella tua installazione. Contatta il tuo amministratore per maggiori informazioni.", + "Threshold": "Soglia", + "Tile": "Affianca", + "Tile Gap X": "Spazio tra i riquadri X", + "Tile Gap Y": "Spazio tra i riquadri Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Marca temporale", + "Timestamp Failed": "Marca temporale non riuscita", + "Tint": "Tinta", + "Title": "Titolo", + "To actually fill or change the options, use our PDF Form Filler tool.": "Per compilare o modificare davvero le opzioni, usa il nostro strumento Compilatore Moduli PDF.", + "Toggle": "Attiva/disattiva", + "Toggle style": "Attiva/disattiva stile", + "Toggle sync scroll": "Attiva/disattiva scorrimento sincronizzato", + "Tool Unavailable": "Strumento non disponibile", + "Tooltip / Help Text": "Suggerimento / Testo di aiuto", + "Top": "In alto", + "Top Center": "In alto al centro", + "Top Left": "In alto a sinistra", + "Top Right": "In alto a destra", + "Top edge in points": "Margine superiore in punti", + "Total Pages": "Pagine totali", + "Transparent Background": "Sfondo trasparente", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Prova JPEG 2000 contro JPEG per ogni immagine e mantiene il file più piccolo.", + "Trim margins from all pages": "Rimuovi i margini da tutte le pagine", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Verifica di attendibilità: {{trustVerified}}/{{length}} firme verificate con il certificato personalizzato", + "Trusted": "Attendibile", + "Trusted certificate loaded": "Certificato attendibile caricato", + "Tsa Url": "URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Disattiva qualità, risoluzione e ogni altro passaggio che comporta perdita sulle immagini.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "L'URL deve iniziare con http:// o https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Impossibile decrittografare il PDF con la password fornita.", + "Unable to repair any of the uploaded PDF files.": "Impossibile riparare nessuno dei file PDF caricati.", + "Unembed standard fonts": "Rimuovi l'incorporamento dei font standard", + "Unembed standard-font look-alikes": "Rimuovi l'incorporamento dei font simili ai font standard", + "Unexpected delimiter in content stream": "Delimitatore inatteso nel flusso di contenuto", + "Unexpected reply from the engine.": "Risposta inattesa dal motore.", + "Uniform": "Uniforme", + "Unique Page Sizes": "Formati di pagina unici", + "Unknown": "Sconosciuto", + "Unknown error": "Errore sconosciuto", + "Unknown error occurred in worker.": "Errore sconosciuto nel worker.", + "Unknown error occurred.": "Si è verificato un errore sconosciuto.", + "Unlock": "Sblocca", + "Unlock All": "Sblocca tutto", + "Unlock Remaining ({{remaining}})": "Sblocca i restanti ({{remaining}})", + "Unlocked": "Sbloccato", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} file su {{length}} sbloccati.", + "Unlocking...": "Sblocco...", + "Unresolved optional content reference": "Riferimento al contenuto opzionale non risolto", + "Unsupported ECDSA curve in signer certificate": "Curva ECDSA non supportata nel certificato del firmatario", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Immagine non supportata. Usa un file PNG o JPG per la filigrana.", + "Unsupported digest OID {{digestOid}}": "OID del digest non supportato {{digestOid}}", + "Unsupported file type: .{{ext}}": "Tipo di file non supportato: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID dell'algoritmo di firma non supportato {{oid}}", + "Unterminated array or dictionary in content stream": "Array o dizionario non terminato nel flusso di contenuto", + "Unterminated hex string in content stream": "Stringa esadecimale non terminata nel flusso di contenuto", + "Unterminated inline image in content stream": "Immagine inline non terminata nel flusso di contenuto", + "Unterminated string in content stream": "Stringa non terminata nel flusso di contenuto", + "Unverified: Unsupported Signature Algorithm": "Non verificata: algoritmo di firma non supportato", + "Updating metadata...": "Aggiornamento dei metadati...", + "Upload Certificate": "Carica certificato", + "Upload Comics": "Carica fumetti", + "Upload Documents": "Carica documenti", + "Upload EPUB Files": "Carica file EPUB", + "Upload Email Files": "Carica file email", + "Upload FB2 Files": "Carica file FB2", + "Upload Images": "Carica immagini", + "Upload JSON Files": "Carica file JSON", + "Upload MOBI Files": "Carica file MOBI", + "Upload Markdown Files": "Carica file Markdown", + "Upload ODG Files": "Carica file ODG", + "Upload PDFs": "Carica PDF", + "Upload PUB Files": "Carica file PUB", + "Upload Pages Files": "Carica file Pages", + "Upload Presentations": "Carica presentazioni", + "Upload SVG Files": "Carica file SVG", + "Upload Spreadsheets": "Carica fogli di calcolo", + "Upload Text Files": "Carica file di testo", + "Upload Visio Files": "Carica file Visio", + "Upload WPD Files": "Carica file WPD", + "Upload WPS Files": "Carica file WPS", + "Upload XML Files": "Carica file XML", + "Upload XPS Files": "Carica file XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Carica un PDF e clicca su \"Genera anteprima\" per vedere il layout dell'opuscolo", + "Upload images and convert to PDF": "Carica immagini e convertile in PDF", + "Upload one or more PDF files": "Carica uno o più file PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Maiuscole A-Z, cifre 0-9 e - . $ / + % SPAZIO", + "Use same password for all files": "Usa la stessa password per tutti i file", + "User Password": "Password utente", + "VSD to PDF": "VSD in PDF", + "Valid From": "Valido dal", + "Valid Signature": "Firma valida", + "Valid Until": "Valido fino al", + "Validating {{n}} of {{length}}: {{name}}": "Convalida {{n}} di {{length}}: {{name}}", + "Validating...": "Convalida...", + "Value": "Valore", + "Value (e.g., Marketing)": "Valore (ad es. Marketing)", + "Vertical": "Verticale", + "Viewer not ready": "Visualizzatore non pronto", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Visualizzatore non pronto. Carica un PDF e attendi il termine del caricamento.", + "Visibility": "Visibilità", + "Visio Files": "File Visio", + "WPD to PDF": "WPD in PDF", + "WPS Files": "File WPS", + "WPS to PDF": "WPS in PDF", + "Watermark": "Filigrana", + "Watermark added successfully!": "Filigrana aggiunta con successo!", + "Web Crypto API not available in this context": "Web Crypto API non disponibile in questo contesto", + "Web Crypto import/verify failed: {{error}}": "Importazione/verifica Web Crypto non riuscita: {{error}}", + "WebP": "WebP", + "Whitelist": "Lista consentiti", + "Width ({{unit}})": "Larghezza ({{unit}})", + "Word": "Word", + "Word Documents": "Documenti Word", + "Word to PDF": "Word in PDF", + "WordPerfect Files": "File WordPerfect", + "Worker crashed": "Worker arrestato in modo anomalo", + "Worker error occurred. Check console for details.": "Errore del worker. Controlla la console per i dettagli.", + "Workflow completed": "Workflow completato", + "Wrong password": "Password errata", + "Wrong password for: {{join}}": "Password errata per: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Password errata o decrittografia non riuscita per \"{{name}}\".", + "X Position": "Posizione X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "File XML", + "XML to PDF": "XML in PDF", + "XMP Metadata": "Metadati XMP", + "XPS Files": "File XPS", + "XPS to PDF": "XPS in PDF", + "Y Position": "Posizione Y", + "Year must be between 1900 and 2100": "L'anno deve essere compreso tra 1900 e 2100", + "Yellow": "Giallo", + "Yellowish": "Giallastro", + "You cannot delete the last page of the document.": "Non puoi eliminare l'ultima pagina del documento.", + "Your PDF has been cropped and the download has started.": "Il tuo PDF è stato ritagliato e il download è iniziato.", + "Your PDF has been downloaded successfully.": "Il tuo PDF è stato scaricato con successo.", + "Your PDF has been posterized.": "Il tuo PDF è stato posterizzato.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Le redazioni sono applicate alle pagine, ma questo file è criptato, quindi BentoPDF non può rimuovere anche le copie del testo oscurato dalle proprietà, dai segnalibri e dagli allegati. Per una pulizia completa, oscura il testo in una copia non criptata e aggiungi poi una password con Cripta PDF. Scaricare comunque?", + "Your workflow needs at least one input node and one output node to run.": "Il tuo workflow ha bisogno di almeno un nodo di input e un nodo di output per essere eseguito.", + "ZIP archive created successfully!": "Archivio ZIP creato con successo!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "ad es. gg/mm/aaaa HH:MM:ss", + "form": "modulo", + "https://example.com": "https://example.com", + "signature found": "firma trovata", + "signatures found": "firme trovate", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} nodo", + "{{count}} nodes": "{{count}} nodi", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 pagina", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} pagine", + "{{length}} Files Need a Password": "{{length}} file richiedono una password", + "{{length}} PDF file(s) selected": "{{length}} file PDF selezionati", + "{{length}} PDF files selected": "{{length}} file PDF selezionati", + "{{length}} attachment(s) extracted successfully!": "{{length}} allegati estratti con successo!", + "{{length}} file • {{totalPages}} total pages": "{{length}} file • {{totalPages}} pagine totali", + "{{length}} file(s) attached successfully.": "{{length}} file allegati con successo.", + "{{length}} files • {{totalPages}} total pages": "{{length}} file • {{totalPages}} pagine totali", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Era protetto da password, quindi la copia compressa non ha password. Usa Cripta PDF per aggiungerne di nuovo una.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} pagine)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} è firmato digitalmente, quindi è stato lasciato così com'è. Comprimerlo invaliderebbe la firma. Per comprimerlo comunque, attiva Ignora la protezione dei contenuti in Impostazioni personalizzate; le sue firme verranno rimosse.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} non è un PDF valido, quindi non è stato aggiunto.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} è protetto da password. Inserisci la password nella scheda del file, poi comprimi di nuovo.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Impossibile caricare il numero di pagine", + "{{size}} • Loading pages...": "{{size}} • Caricamento delle pagine...", + "{{size}} • Loading...": "{{size}} • Caricamento...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} pagine", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} pagine", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} pagine", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} pagine", + "{{size}} • {{value}} pages": "{{size}} • {{value}} pagine", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF decrittografati con successo.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF linearizzati con successo.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} pagine → {{numSheets}} fogli di output", + "{{validCount}} valid": "{{validCount}} validi", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 pagina", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} pagine" +} diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 904270b5..1847d62c 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -9,7 +9,8 @@ "openMainMenu": "メインメニューを開く", "language": "言語", "searchLanguage": "言語を検索…", - "noLanguagesFound": "言語が見つかりません" + "noLanguagesFound": "言語が見つかりません", + "breadcrumb": "パンくずリスト" }, "donation": { "message": "BentoPDFは好きですか?無料かつオープンソースを維持するためにご協力ください!", @@ -236,6 +237,10 @@ "aboutUs": "当社について", "faqLink": "よくある質問", "contactUs": "お問い合わせ", + "tools": "ツール", + "pdfConverter": "PDF変換", + "pdfSecurity": "PDFセキュリティ", + "mergeSplit": "PDFの結合と分割", "legal": "法的情報", "termsAndConditions": "利用規約", "privacyPolicy": "プライバシーポリシー", diff --git a/public/locales/ja/tools.json b/public/locales/ja/tools.json index 2cb20578..161c55fb 100644 --- a/public/locales/ja/tools.json +++ b/public/locales/ja/tools.json @@ -27,7 +27,22 @@ "name": "PDFの結合", "subtitle": "複数のPDFを1つのファイルに結合します。しおりを保存します。", "retainPageLabels": "各ファイルの元のページラベルを保持する", - "retainPageLabelsHint": "オフ(デフォルト): マージされたPDFは1–Nの自然なページ番号を使用します。オン: 各ファイルの元のページラベルが保持されます(ラベルが重複する可能性があります)。" + "retainPageLabelsHint": "オフ(デフォルト): マージされたPDFは1–Nの自然なページ番号を使用します。オン: 各ファイルの元のページラベルが保持されます(ラベルが重複する可能性があります)。", + "removeDuplicateFonts": "重複したフォントを削除", + "alert": { + "thumbnailError": "ページのサムネイルを表示できませんでした", + "noSelection": "結合するファイルまたはページが選択されていません。", + "mergeSuccess": "PDFを結合しました。", + "mergeFailed": "PDFの結合に失敗しました。", + "mergeError": "PDFの結合に失敗しました。すべてのファイルが有効で、パスワードで保護されていないことを確認してください。", + "workerError": "結合処理中に予期しないエラーが発生しました。", + "loadError": "1つ以上のPDFファイルを読み込めませんでした" + }, + "loader": { + "renderingPreviews": "ページのプレビューを生成中...", + "merging": "PDFを結合中...", + "loadingDocuments": "PDFドキュメントを読み込み中..." + } }, "splitPdf": { "name": "PDFの分割", @@ -91,7 +106,7 @@ "tipRedoZ": "やり直す (⇧⌘Z)", "tipFileDetails": "ファイル情報", "tipEditExistingContent": "既存のコンテンツを編集", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "編集ツールの対象範囲 — 要素の多いページでは範囲を絞り込みます", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "編集ツールの対象範囲(要素の多いページでは範囲を絞り込みます)", "tipClickThePageToAddATextBox": "ページをクリックしてテキストボックスを追加", "tipSpellCheckLanguage": "スペルチェックの言語", "tipFindAndReplace": "検索と置換", @@ -385,7 +400,7 @@ "subtitle": "1つ以上のHEIC画像からPDFを作成します。" }, "tiffToPdf": { - "name": "TIFFからPDFへ", + "name": "TIFFからPDF", "subtitle": "1つ以上の TIFF 画像からPDFを作成します。" }, "textToPdf": { @@ -503,11 +518,12 @@ "noFile": "ファイルがありません", "noFileExplanation": "まずはPDFファイルをアップロードしてください。", "conversionSuccess": "PDFからTIFFへの変換に成功しました。", - "conversionError": "PDFからTIFFへの変換に失敗しました。ファイルが破損している可能性があります。" + "conversionError": "PDFからTIFFへの変換に失敗しました。ファイルが破損している可能性があります。", + "conversionOutOfMemory": "変換中にブラウザのメモリが不足しました。DPIを下げるか、マルチページTIFFのオプションをオフにしてページを1つずつ変換してください。" } }, "pdfToCbz": { - "name": "PDFからCBZへ", + "name": "PDFからCBZ", "subtitle": "PDFをコミックリーダー用のCBZ (Comic Book Archive)ファイルに変換します。", "imageFormat": "画像フォーマット", "quality": "画質", @@ -613,7 +629,7 @@ "multiLanguageSupportDescription": "複数言語が混在する文書のために複数の言語を選択します。" }, "alternateMerge": { - "name": "代替ページと混合ページ", + "name": "ページの交互結合と混合", "subtitle": "各PDFのページを交互に配置してPDFを結合します。ブックマークを保存します。", "retainPageLabels": "各ファイルの元のページラベルを保持する", "retainPageLabelsHint": "オフ(デフォルト): マージされたPDFは1–Nの自然なページ番号を使用します。オン: 各ファイルの元のページラベルが保持されます(ラベルが重複する可能性があります)。" @@ -886,7 +902,7 @@ "convertButton": "PDFに変換" }, "mobiToPdf": { - "name": "MOBIからPDFへの変換", + "name": "MOBIからPDF", "subtitle": "MOBI電子書籍をPDF形式に変換します。複数のファイルをサポートします。", "acceptedFormats": "MOBIファイル", "convertButton": "PDFに変換" @@ -928,7 +944,7 @@ "convertButton": "PDFに変換" }, "pagesToPdf": { - "name": "PagesをPDFに変換", + "name": "PagesからPDF", "subtitle": "Apple PagesドキュメントをPDF形式に変換します。複数のファイルをサポートします。", "acceptedFormats": "Pagesファイル", "convertButton": "PDFに変換" @@ -958,7 +974,7 @@ "convertButton": "PDFに変換" }, "vsdToPdf": { - "name": "VSDからPDFへのファイル変換", + "name": "VSDからPDF", "subtitle": "Microsoft Visio(VSD, VSDX)ファイルをPDF形式に変換します。複数のファイルをサポートします。", "acceptedFormats": "VSD, VSDXファイル", "convertButton": "PDFに変換" @@ -990,8 +1006,7 @@ "subtitle": "PDFファイルからテキストを抽出し、プレーンテキスト (.txt) として保存します。複数のファイルをサポートします。", "noteLabel": "注:", "noteText": "このツールはデジタルで作成されたPDFのみで動作します。スキャン文書や画像ベースのPDFには、代わりにOCR PDFツールを使用してください。", - "convertButton": "テキストの抽出", - "note": "このツールはデジタルで作成されたPDFでのみ機能します。スキャンされたドキュメントまたは画像ベースのPDFの場合は、代わりにOCR PDFツールを使用してください。" + "convertButton": "テキストの抽出" }, "digitalSignPdf": { "name": "PDFへの電子署名", @@ -1085,7 +1100,7 @@ "subtitle": "PDFファイルのデジタル署名を検証します。証明書の有効性を確認、署名者の詳細を表示し、文書の整合性を確認します。すべての処理はブラウザ内で行われます。" }, "timestampPdf": { - "name": "タイムスタンプPDF", + "name": "PDFのタイムスタンプ", "pageTitle": "タイムスタンプPDFオンライン無料 - RFC 3161ドキュメント タイムスタンプ | BentoPDF", "subtitle": "信頼できる Time Stamp Authority(TSA) サーバーを使用して、RFC 3161ドキュメントのタイムスタンプをPDFに追加します。文書が特定の時点で存在していたことを証明します。証明書は必要ありません。", "tsaSectionTitle": "タイムスタンプサーバー(TSA)", @@ -1189,7 +1204,7 @@ "workerError": "ワーカーエラー: {{message}}", "alternateMergeWorkerError": "交互マージワーカーエラー: {{message}}", "noPdfFilesUploaded": "PDF入力ノードにPDFファイルがアップロードされていません", - "failedToLoadFile": "\"{{file}}\"を読み込めませんでした — ファイルが破損している可能性があります", + "failedToLoadFile": "\"{{file}}\"を読み込めませんでした。ファイルが破損している可能性があります", "noImagesUploaded": "画像入力ノードに画像がアップロードされていません", "noWordDocsUploaded": "Word入力ノードにドキュメントがアップロードされていません", "noExcelUploaded": "Excel入力ノードにスプレッドシートがアップロードされていません", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "絶対に!すべての処理はブラウザ内で行われます。ファイルがデバイスの外に出ることはなく、完全なプライバシーが確保されます。" }, "unlockPdf": { - "name": "PDFの復号化", + "name": "PDFのロック解除", "subtitle": "パスワード保護を解除してPDFのロックを解除します。" }, "protectPdf": { - "name": "PDFの暗号化", + "name": "PDFの保護", "subtitle": "パスワードを追加してPDFをロックします。" } } diff --git a/public/locales/ja/ui.json b/public/locales/ja/ui.json new file mode 100644 index 00000000..f46b1a42 --- /dev/null +++ b/public/locales/ja/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(修正済み)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ 他{{n}}件...", + "- Error parsing XMP XML. Displaying raw. -": "- XMP XMLの解析エラー。生データを表示しています。 -", + "- No Info Dictionary data found -": "- 情報辞書のデータが見つかりません -", + "- No XMP metadata found -": "- XMPメタデータが見つかりません -", + "- No interactive form fields found -": "- インタラクティブなフォームフィールドが見つかりません -", + "- No parseable XMP properties found -": "- 解析可能なXMPプロパティが見つかりません -", + "-- Select existing group --": "-- 既存のグループを選択 --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1°(非常に敏感)", + "0.5° (Default)": "0.5°(デフォルト)", + "1.0° (Normal)": "1.0°(標準)", + "100 (Fast)": "100(高速)", + "150 (Default)": "150(デフォルト)", + "1x2 (Booklet)": "1x2(小冊子)", + "2.0° (Less Sensitive)": "2.0°(やや鈍感)", + "200 (Better)": "200(より高画質)", + "200 (Good)": "200(良好)", + "2x2 (4-up)": "2x2(4アップ)", + "2x4 (8-up)": "2x4(8アップ)", + "300 (Best Quality)": "300(最高画質)", + "300 (Print)": "300(印刷用)", + "4x4 (16-up)": "4x4(16アップ)", + "600 (High Quality)": "600(高画質)", + "72 (Screen)": "72(画面用)", + "90° Clockwise": "時計回りに90°", + "90° Counter-clockwise": "反時計回りに90°", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "「{{fieldName}}」という名前のフィールドはすでに存在します。ダウンロードする前に、このフィールドの名前を重複しないものに変更してください。", + "A new version of BentoPDF is available. Reload to update?": "BentoPDFの新しいバージョンがあります。再読み込みして更新しますか?", + "A single PDF file": "単一のPDFファイル", + "A template with this name already exists.": "この名前のテンプレートはすでに存在します。", + "ASCII characters (letters, numbers, symbols)": "ASCII文字(英字、数字、記号)", + "Action": "アクション", + "Add Blank Page": "空白ページを追加", + "Add Bookmark": "しおりを追加", + "Add Child Bookmark": "子しおりを追加", + "Add Child Layer": "子レイヤーを追加", + "Add More Comics": "コミックをさらに追加", + "Add More Documents": "ドキュメントをさらに追加", + "Add More EPUB Files": "EPUBファイルをさらに追加", + "Add More Email Files": "メールファイルをさらに追加", + "Add More FB2 Files": "FB2ファイルをさらに追加", + "Add More Files": "ファイルをさらに追加", + "Add More Images": "画像をさらに追加", + "Add More JSON Files": "JSONファイルをさらに追加", + "Add More MOBI Files": "MOBIファイルをさらに追加", + "Add More Markdown Files": "Markdownファイルをさらに追加", + "Add More ODG Files": "ODGファイルをさらに追加", + "Add More PUB Files": "PUBファイルをさらに追加", + "Add More Pages Files": "Pagesファイルをさらに追加", + "Add More Presentations": "プレゼンテーションをさらに追加", + "Add More SVG Files": "SVGファイルをさらに追加", + "Add More Spreadsheets": "スプレッドシートをさらに追加", + "Add More Text Files": "テキストファイルをさらに追加", + "Add More Visio Files": "Visioファイルをさらに追加", + "Add More WPD Files": "WPDファイルをさらに追加", + "Add More WPS Files": "WPSファイルをさらに追加", + "Add More XML Files": "XMLファイルをさらに追加", + "Add More XPS Files": "XPSファイルをさらに追加", + "Add a new layer to get started!": "新しいレイヤーを追加して始めましょう!", + "Add a text box": "テキストボックスを追加", + "Add an RFC 3161 document timestamp": "RFC 3161文書タイムスタンプを追加", + "Add an image": "画像を追加", + "Add at least one node to run the workflow.": "ワークフローを実行するには、ノードを1つ以上追加してください。", + "Add child": "子を追加", + "Add child layer": "子レイヤーを追加", + "Add header and footer text": "ヘッダーとフッターのテキストを追加", + "Add page numbers": "ページ番号を追加", + "Add searchable text layer via OCR": "OCRで検索可能なテキストレイヤーを追加", + "Add text watermark": "テキスト透かしを追加", + "Add/Edit/Extract Attachments": "添付ファイルの追加・編集・抽出", + "Added": "追加", + "Added \"{{afterText}}\"": "「{{afterText}}」を追加しました", + "Added image ({{width}}×{{height}})": "画像を追加しました({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "空白ページを{{insertCount}}ページ追加しました!", + "Added {{insertCount}} blank pages successfully!": "空白ページを{{insertCount}}ページ追加しました!", + "Adding header & footer...": "ヘッダーとフッターを追加しています...", + "Adding page numbers...": "ページ番号を追加しています...", + "Adding watermark...": "透かしを追加しています...", + "Adding {{insertCount}} blank page...": "空白ページを{{insertCount}}ページ追加しています...", + "Adding {{insertCount}} blank pages...": "空白ページを{{insertCount}}ページ追加しています...", + "Adding {{name}} ({{n}}/{{length}})...": "{{name}}を追加しています({{n}}/{{length}})...", + "Adjust Colors": "色を調整", + "Adjust brightness, contrast, and colors": "明るさ、コントラスト、色を調整", + "Advanced": "詳細", + "Advanced Feature Required": "高度な機能が必要です", + "Advanced Settings": "詳細設定", + "After Page": "次のページの後", + "After Page...": "次のページの後...", + "Align Objects": "オブジェクトを整列", + "Alignment": "配置", + "All": "すべて", + "All files repaired successfully!": "すべてのファイルを修復しました!", + "Alternate Merge": "交互に結合", + "Alternating and mixing pages...": "ページを交互に混ぜています...", + "Always resample to that resolution": "常にその解像度にリサンプリング", + "An error occurred during compression. Error: {{error}}": "圧縮中にエラーが発生しました。エラー: {{error}}", + "An error occurred during conversion. Error: {{error}}": "変換中にエラーが発生しました。エラー: {{error}}", + "An error occurred during conversion. Error: {{message}}": "変換中にエラーが発生しました。エラー: {{message}}", + "An error occurred during cropping.": "トリミング中にエラーが発生しました。", + "An error occurred during extraction. Error: {{error}}": "抽出中にエラーが発生しました。エラー: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "ラスタライズ中にエラーが発生しました。エラー: {{error}}", + "An error occurred during sanitization: {{msg}}": "サニタイズ中にエラーが発生しました: {{msg}}", + "An error occurred while combining pages.": "ページの結合中にエラーが発生しました。", + "An error occurred while creating the N-Up PDF.": "N-Up PDFの作成中にエラーが発生しました。", + "An error occurred while creating the booklet.": "小冊子の作成中にエラーが発生しました。", + "An error occurred while dividing the PDF.": "PDFの分割中にエラーが発生しました。", + "An error occurred while mixing the PDFs.": "PDFの混合中にエラーが発生しました。", + "An error occurred while standardizing pages.": "ページの標準化中にエラーが発生しました。", + "An error occurred while trying to remove metadata.": "メタデータの削除中にエラーが発生しました。", + "An error occurred: {{error}}": "エラーが発生しました: {{error}}", + "An error occurred: {{error}}.": "エラーが発生しました: {{error}}", + "An owner password is required when setting permissions": "権限を設定するにはオーナーパスワードが必要です", + "An unexpected error occurred during the repair process.": "修復処理中に予期しないエラーが発生しました。", + "An unexpected error occurred.": "予期しないエラーが発生しました。", + "Analyzing data structure...": "データ構造を分析しています...", + "Analyzing full PDF metadata...": "PDFメタデータ全体を分析しています...", + "Analyzing signatures...": "署名を分析しています...", + "Angle": "角度", + "Annotations removed successfully!": "注釈を削除しました!", + "Any text, URL, or data": "任意のテキスト、URL、データ", + "Application": "アプリケーション", + "Apply a digital signature to PDF": "PDFにデジタル署名を適用", + "Apply and download": "適用してダウンロード", + "Apply redactions?": "墨消しを適用しますか?", + "Apply scanner simulation effect": "スキャナーシミュレーション効果を適用", + "Applying Bates numbers...": "ベイツ番号を適用しています...", + "Applying color adjustments...": "色調整を適用しています...", + "Applying crop...": "トリミングを適用しています...", + "Applying redactions...": "墨消しを適用しています...", + "Applying rotations...": "回転を適用しています...", + "Applying scanner effect...": "スキャナー効果を適用しています...", + "Applying timestamp...": "タイムスタンプを適用しています...", + "Applying {{replace}}...": "{{replace}}を適用しています...", + "Archive contains an oversized image entry.": "アーカイブに大きすぎる画像が含まれています。", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "アーカイブ内の画像が多すぎます(最大{{MAX_CBZ_PAGES}}枚)。", + "Archive is too large when decompressed.": "アーカイブは解凍すると大きすぎます。", + "Are you sure you want to reset? All your work will be lost.": "リセットしてもよろしいですか?作業内容はすべて失われます。", + "Area (Coordinates)": "領域(座標)", + "Area ({{unit}}²)": "面積({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial、Times New Roman、Courier Newは内蔵の同等フォントに置き換えられます。安全な場合のみ適用されます。", + "Arrange multiple pages per sheet": "1枚のシートに複数ページを配置", + "Arrange pages for booklet printing": "小冊子印刷用にページを配置", + "Aspect Ratio": "縦横比", + "At least one PDF document is required for export.": "エクスポートするには、PDFドキュメントが1つ以上必要です。", + "At least two valid PDFs are required.": "有効なPDFが2つ以上必要です。", + "Attaching files to PDF...": "PDFにファイルを添付しています...", + "Attachments updated successfully!": "添付ファイルを更新しました!", + "Author": "作成者", + "Auto (Keep Original)": "自動(元のまま)", + "Back": "裏面", + "Back to Home": "ホームに戻る", + "Background Color": "背景色", + "Background color changed successfully!": "背景色を変更しました!", + "Barcode": "バーコード", + "Barcode Format": "バーコード形式", + "Barcode Value": "バーコードの値", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "ベイツ番号を適用しました!({{batesStart}}から{{n}}まで)", + "Beginning": "先頭", + "Binarize": "二値化", + "Blank Position": "空白の位置", + "Blue": "青", + "Blur": "ぼかし", + "Bold": "太字", + "Bold & Italic": "太字と斜体", + "Booklet": "小冊子", + "Booklet created with {{numSheets}} sheets!": "{{numSheets}}枚のシートで小冊子を作成しました!", + "Bookmarks imported from JSON!": "JSONからしおりをインポートしました!", + "Bookmarks page": "しおりページ", + "Border": "枠線", + "Border Color": "枠線の色", + "Bottom": "下", + "Bottom Center": "下中央", + "Bottom Left": "左下", + "Bottom Right": "右下", + "Bottom edge in points": "下端(ポイント)", + "Brightness": "明るさ", + "Brotli and rasterizing were skipped to keep it PDF/A.": "PDF/Aを維持するため、Brotliとラスタライズはスキップされました。", + "Brotli compression (PDF 2.0)": "Brotli圧縮(PDF 2.0)", + "Browser Note:": "ブラウザーに関する注意:", + "Building new PDF...": "新しいPDFを作成しています...", + "Building page pairing model...": "ページのペアリングモデルを構築しています...", + "Button": "ボタン", + "ByteRange does not start at the beginning of the file": "ByteRangeがファイルの先頭から始まっていません", + "ByteRange out of bounds": "ByteRangeが範囲外です", + "CBZ to PDF": "CBZからPDF", + "CSV Loaded": "CSVを読み込みました", + "CSV file is empty": "CSVファイルが空です", + "Cancel": "キャンセル", + "Cannot Delete": "削除できません", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "ビューアーのコントロールにアクセスできません。上のPDFビューアーのツールバーにあるダウンロードボタンを使用してください。", + "Cannot delete all pages": "すべてのページは削除できません", + "Cannot delete all pages.": "すべてのページは削除できません。", + "Canvas context failed": "キャンバスコンテキストの作成に失敗しました", + "Canvas context unavailable": "キャンバスコンテキストを利用できません", + "Canvas toBlob conversion failed.": "キャンバスのtoBlob変換に失敗しました。", + "Canvas toBlob failed": "キャンバスのtoBlobに失敗しました", + "Center": "中央", + "Certificate (.pfx, .p12, .pem)": "証明書(.pfx、.p12、.pem)", + "Certificate Expired": "証明書の有効期限切れ", + "Certificate Password": "証明書のパスワード", + "Certificate unlocked": "証明書のロックを解除しました", + "Change Certificate": "証明書を変更", + "Change background color": "背景色を変更", + "Changing background color...": "背景色を変更しています...", + "Changing text color...": "テキストの色を変更しています...", + "Character": "文字", + "Checked State": "チェック状態", + "Choose a valid page range.": "有効なページ範囲を選択してください。", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "付属の言語から選ぶか、不足している言語を--ocr-languagesに追加してエアギャップ版バンドルを再ビルドしてください。", + "Cleanup": "クリーンアップ", + "Click on PDF to Pick Location": "PDFをクリックして位置を指定", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "上のボタンをクリックしてから、しおりのジャンプ先にしたいPDF上の位置をクリックしてください", + "Click to Upload Image": "クリックして画像をアップロード", + "Clicking this field in the PDF will open a file picker to upload an image.": "PDF内でこのフィールドをクリックすると、画像をアップロードするためのファイル選択ダイアログが開きます。", + "Clip invisible parts of images": "画像の見えない部分を切り取る", + "Close": "閉じる", + "Close (Esc)": "閉じる(Esc)", + "Close panel": "パネルを閉じる", + "Closes tab": "タブを閉じます", + "Closes window": "ウィンドウを閉じます", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF(しおりとメタデータ)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDFが設定されていません。WASM設定で設定してください。", + "CoherentPDF produced an empty decrypted file.": "CoherentPDFが空の復号ファイルを生成しました。", + "CoherentPDF: not configured.": "CoherentPDF: 未設定です。", + "Color": "色", + "Color adjustments applied successfully!": "色調整を適用しました!", + "Colors inverted successfully!": "色を反転しました!", + "Cols": "列", + "Combine multiple PDFs into one": "複数のPDFを1つに結合", + "Combine to Single Page": "1ページに結合", + "Combining pages...": "ページを結合しています...", + "Comic Archives": "コミックアーカイブ", + "Comments and markup become part of the page. Form fields and links keep working.": "コメントとマークアップはページの一部になります。フォームフィールドとリンクは引き続き使えます。", + "Complete": "完了", + "Complete!": "完了しました!", + "Compress": "圧縮", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}}個のPDFを圧縮しました。合計サイズは{{totalOriginalSize}}から{{totalCompressedSize}}に縮小されました({{value}}%削減)。", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}}個のPDFを圧縮しました。合計サイズ: {{totalCompressedSize}}。", + "Compressing multiple PDFs...": "複数のPDFを圧縮しています...", + "Compressing to {{size}}...": "{{size}}に圧縮しています...", + "Compressing {{n}}/{{length}}: {{name}}...": "圧縮中 {{n}}/{{length}}: {{name}}...", + "Compressing...": "圧縮しています...", + "Compression Complete": "圧縮完了", + "Compression Finished": "圧縮が完了しました", + "Compression Level": "圧縮レベル", + "Configure": "設定", + "Confirm": "確認", + "Confirm Action": "操作の確認", + "Conformance": "準拠規格", + "Connected": "接続済み", + "Contact Info": "連絡先情報", + "Content": "コンテンツ", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "コンテンツのハッシュがmessageDigest属性と一致しません。署名後にPDFが変更されています", + "Contrast": "コントラスト", + "Conversion Complete": "変換完了", + "Conversion Error": "変換エラー", + "Conversion engine ready!": "変換エンジンの準備ができました!", + "Conversion failed: could not create PDF/A definition": "変換に失敗しました: PDF/A定義を作成できませんでした", + "Convert Apple Pages documents to PDF": "Apple PagesドキュメントをPDFに変換", + "Convert EPUB ebooks to PDF": "EPUB電子書籍をPDFに変換", + "Convert Excel spreadsheets to PDF": "ExcelスプレッドシートをPDFに変換", + "Convert FB2 e-books to PDF": "FB2電子書籍をPDFに変換", + "Convert JSON files to PDF": "JSONファイルをPDFに変換", + "Convert MOBI e-books to PDF": "MOBI電子書籍をPDFに変換", + "Convert Markdown files to PDF": "MarkdownファイルをPDFに変換", + "Convert Microsoft Publisher to PDF": "Microsoft PublisherをPDFに変換", + "Convert OpenDocument Graphics to PDF": "OpenDocument GraphicsをPDFに変換", + "Convert PDF pages to SVG": "PDFのページをSVGに変換", + "Convert PDF pages to images (ZIP)": "PDFのページを画像(ZIP)に変換", + "Convert PDF tables to CSV": "PDFの表をCSVに変換", + "Convert PDF tables to Excel": "PDFの表をExcelに変換", + "Convert PDF to Markdown text": "PDFをMarkdownテキストに変換", + "Convert PDF to PDF/A for archiving": "アーカイブ用にPDFをPDF/Aに変換", + "Convert PDF to Word document": "PDFをWord文書に変換", + "Convert PowerPoint presentations to PDF": "PowerPointプレゼンテーションをPDFに変換", + "Convert SVG files to PDF": "SVGファイルをPDFに変換", + "Convert To Grayscale": "グレースケールに変換", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Visio図(VSD/VSDX)をPDFに変換", + "Convert WPS Office documents to PDF": "WPS OfficeドキュメントをPDFに変換", + "Convert Word documents to PDF": "Word文書をPDFに変換", + "Convert WordPerfect documents to PDF": "WordPerfectドキュメントをPDFに変換", + "Convert XML documents to PDF": "XMLドキュメントをPDFに変換", + "Convert XPS/OXPS documents to PDF": "XPS/OXPSドキュメントをPDFに変換", + "Convert comic book archives (CBZ/CBR) to PDF": "コミックブックアーカイブ(CBZ/CBR)をPDFに変換", + "Convert email files (.eml, .msg) to PDF": "メールファイル(.eml、.msg)をPDFに変換", + "Convert fonts to vector outlines": "フォントをベクターアウトラインに変換", + "Convert plain text to PDF": "プレーンテキストをPDFに変換", + "Convert to grayscale": "グレースケールに変換", + "Convert to greyscale": "グレースケールに変換", + "Convert to image-based PDF": "画像ベースのPDFに変換", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}}個のファイル({{totalPages}}ページ)をSVGに変換しました!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}}ページをSVGに変換しました!", + "Converter not initialized": "コンバーターが初期化されていません", + "Converting BMP to PDF...": "BMPをPDFに変換しています...", + "Converting HEIC to PDF...": "HEICをPDFに変換しています...", + "Converting TIFF to PDF...": "TIFFをPDFに変換しています...", + "Converting emails...": "メールを変換しています...", + "Converting files...": "ファイルを変換しています...", + "Converting fonts to outlines...": "フォントをアウトラインに変換しています...", + "Converting images to PDF...": "画像をPDFに変換しています...", + "Converting multiple PDFs to PDF/A...": "複数のPDFをPDF/Aに変換しています...", + "Converting multiple RTF files to PDF...": "複数のRTFファイルをPDFに変換しています...", + "Converting multiple files...": "複数のファイルを変換しています...", + "Converting page {{n}} of {{pageCount}}...": "{{n}}/{{pageCount}}ページを変換しています...", + "Converting to Markdown...": "Markdownに変換しています...", + "Converting to SVG...": "SVGに変換しています...", + "Converting to greyscale...": "グレースケールに変換しています...", + "Converting to {{level}}...": "{{level}}に変換しています...", + "Converting {{name}}...": "{{name}}を変換しています...", + "Converting {{n}}/{{length}}: {{name}}...": "変換中 {{n}}/{{length}}: {{name}}...", + "Converting...": "変換しています...", + "Copied": "コピーしました", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "スタンプ付きPDFのエクスポーターにアクセスできませんでした。代わりにビューアーのツールバーにあるエクスポート → PDFボタンを使用してください。", + "Could not add blank page.": "空白ページを追加できませんでした。", + "Could not add blank pages.": "空白ページを追加できませんでした。", + "Could not add header or footer.": "ヘッダーまたはフッターを追加できませんでした。", + "Could not add page numbers.": "ページ番号を追加できませんでした。", + "Could not add the watermark.": "透かしを追加できませんでした。", + "Could not apply rotations.": "回転を適用できませんでした。", + "Could not change text color.": "テキストの色を変更できませんでした。", + "Could not change the background color.": "背景色を変更できませんでした。", + "Could not create ZIP archive.": "ZIPアーカイブを作成できませんでした。", + "Could not create canvas context.": "キャンバスコンテキストを作成できませんでした。", + "Could not create comparison canvas context.": "比較用キャンバスコンテキストを作成できませんでした。", + "Could not create offscreen comparison canvas.": "比較用のオフスクリーンキャンバスを作成できませんでした。", + "Could not create visual diff context.": "ビジュアル差分のコンテキストを作成できませんでした。", + "Could not create visual diff overlay context.": "ビジュアル差分のオーバーレイコンテキストを作成できませんでした。", + "Could not detect blank pages.": "空白ページを検出できませんでした。", + "Could not display the page.": "ページを表示できませんでした。", + "Could not export comparison PDF.": "比較PDFをエクスポートできませんでした。", + "Could not export the signed PDF. Please try again.": "署名済みPDFをエクスポートできませんでした。もう一度お試しください。", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "スタンプ付きPDFをエクスポートできませんでした。代わりにビューアーのツールバーにあるエクスポート → PDFボタンを使用してください。", + "Could not extract signer public key": "署名者の公開鍵を抽出できませんでした", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "指定されたURLで{{testFile}}が見つかりませんでした(HTTP {{status}})。ファイルが存在することを確認してください。", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "PDFを完全に分析できませんでした。破損しているか、特殊な構造の可能性があります。", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "プレビューを生成できませんでした。ファイルが破損しているか、未対応の機能が含まれている可能性があります。エラー: {{message}}", + "Could not get canvas context": "キャンバスコンテキストを取得できませんでした", + "Could not invert PDF colors.": "PDFの色を反転できませんでした。", + "Could not load PDF. It may be corrupt or password-protected.": "PDFを読み込めませんでした。破損しているか、パスワードで保護されている可能性があります。", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "PDFを読み込めませんでした。ファイルが無効、破損、またはパスワードで保護されている可能性があります。", + "Could not load the PDF engine. Please refresh the page and try again.": "PDFエンジンを読み込めませんでした。ページを更新してもう一度お試しください。", + "Could not parse signer info": "署名者情報を解析できませんでした", + "Could not posterize the PDF.": "PDFをポスタライズできませんでした。", + "Could not process \"{{name}}\". The file may be corrupted.": "「{{name}}」を処理できませんでした。ファイルが破損している可能性があります。", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "これ以上ファイルサイズを減らせませんでした。元のサイズ: {{originalSize}}、新しいサイズ: {{compressedSize}}。", + "Could not remove annotations.": "注釈を削除できませんでした。", + "Could not remove blank pages.": "空白ページを削除できませんでした。", + "Could not remove leftover data from the PDF.": "PDFから残りのデータを削除できませんでした。", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "墨消しされたテキストをドキュメントデータから削除できなかったため、ファイルはダウンロードされませんでした。", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "PDFのページを逆順にできませんでした。ファイルが有効なPDFか確認してください。", + "Could not update metadata. Please check that date formats are correct.": "メタデータを更新できませんでした。日付の形式が正しいか確認してください。", + "Count": "件数", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "作成日", + "Creating Booklet...": "小冊子を作成しています...", + "Creating Excel file...": "Excelファイルを作成しています...", + "Creating N-Up PDF...": "N-Up PDFを作成しています...", + "Creating PDF from JPGs...": "JPGからPDFを作成しています...", + "Creating PDF from SVG files...": "SVGファイルからPDFを作成しています...", + "Creating PDF...": "PDFを作成しています...", + "Creating ZIP archive...": "ZIPアーカイブを作成しています...", + "Creating ZIP file...": "ZIPファイルを作成しています...", + "Creating ZIP...": "ZIPを作成しています...", + "Creating table...": "表を作成しています...", + "Creator": "作成アプリ", + "Crop": "トリミング", + "Crop complete! Your download has started.": "トリミングが完了しました!ダウンロードを開始しました。", + "Cryptographic verification failed": "暗号化検証に失敗しました", + "Custom": "カスタム", + "Custom Format": "カスタム形式", + "Custom Height": "カスタムの高さ", + "Custom Units": "カスタム単位", + "Custom Width": "カスタムの幅", + "Custom Zoom": "カスタムズーム", + "Custom...": "カスタム...", + "DataMatrix": "DataMatrix", + "Date Format": "日付形式", + "Decrease size": "サイズを小さく", + "Decrypt": "復号化", + "Decrypting PDF...": "PDFを復号化しています...", + "Decrypting {{name}} ({{n}}/{{length}})...": "{{name}}を復号化しています({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "復号化中 {{n}}/{{length}}: {{name}}", + "Decrypting...": "復号化しています...", + "Decryption Failed": "復号化に失敗しました", + "Delete": "削除", + "Delete \"{{title}}\"?": "「{{title}}」を削除しますか?", + "Delete Field": "フィールドを削除", + "Delete Page": "ページを削除", + "Delete Pages": "ページを削除", + "Delete all {{length}} bookmark(s) ? ": "{{length}}件のしおりをすべて削除しますか?", + "Delete layer": "レイヤーを削除", + "Delete {{size}} bookmark(s) ? ": "{{size}}件のしおりを削除しますか?", + "Deleted": "削除", + "Deleted {{size}} page(s) successfully!": "{{size}}ページを削除しました!", + "Deleting pages...": "ページを削除しています...", + "Description": "説明", + "Description for screen readers": "スクリーンリーダー用の説明", + "Deselect All": "すべて選択解除", + "Deskew": "傾き補正", + "Deskew PDF": "PDFの傾き補正", + "Deskewed {{length}} file(s). {{value}}": "{{length}}個のファイルの傾きを補正しました。{{value}}", + "Deskewing {{name}}...": "{{name}}の傾きを補正しています...", + "Destination": "リンク先", + "Detecting blank pages...": "空白ページを検出しています...", + "Digest Algorithm:": "ダイジェストアルゴリズム:", + "Digital Sign": "電子署名", + "Direction": "方向", + "Divide Pages": "ページを分割", + "Divide into boxes (0 to disable)": "ボックスに分割(0で無効)", + "Document Properties": "ドキュメントのプロパティ", + "Document Type": "ドキュメントの種類", + "Document properties": "ドキュメントのプロパティ", + "Document-level attachment": "ドキュメントレベルの添付ファイル", + "Done: back to tools": "完了、ツールに戻る", + "Download": "ダウンロード", + "Download Edited PDF": "編集したPDFをダウンロード", + "Download anyway": "そのままダウンロード", + "Download as PDF or ZIP automatically": "PDFまたはZIPで自動的にダウンロード", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}}個のPDFファイルをZIPアーカイブでダウンロードしました。", + "Downloads started for all files.": "すべてのファイルのダウンロードを開始しました。", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "スクリーンリーダーが利用するタグ付けが削除されます。", + "Duplicate Field Name": "フィールド名の重複", + "Duplicate Field Names": "フィールド名の重複", + "Duplicate Page": "ページを複製", + "Duplicate Page Numbers": "ページ番号の重複", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA署名が署名者の公開鍵で検証できません", + "EPUB Files": "EPUBファイル", + "EPUB to PDF": "EPUBからPDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZからPDF", + "Edit": "編集", + "Edit All": "すべて編集", + "Edit Bookmark": "しおりを編集", + "Edit Bookmarks": "しおりを編集", + "Edit Images": "画像を編集", + "Edit Metadata": "メタデータを編集", + "Edit PDF metadata": "PDFのメタデータを編集", + "Edit Scope": "編集範囲", + "Edit Shapes": "図形を編集", + "Edit Text": "テキストを編集", + "Edit tool": "編集ツール", + "Edit {{scopes}}": "{{scopes}}を編集", + "Email Files": "メールファイル", + "Email to PDF": "メールからPDF", + "Embedding files into PDF...": "PDFにファイルを埋め込んでいます...", + "Empty signature bytes": "署名のバイト列が空です", + "Encrypt": "暗号化", + "Encrypt PDF with password": "パスワードでPDFを暗号化", + "Encrypted file": "暗号化されたファイル", + "Encrypting PDF with 256-bit AES...": "256ビットAESでPDFを暗号化しています...", + "Encryption Failed": "暗号化に失敗しました", + "Encryption resulted in an empty file.": "暗号化の結果、空のファイルになりました。", + "End": "末尾", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "先頭に挿入するには0、末尾に挿入するには{{pageCount}}を入力してください。", + "Enter bookmark title": "しおりのタイトルを入力", + "Enter name for child layer under \"{{Layer}}\":": "「{{Layer}}」の下の子レイヤーの名前を入力してください:", + "Enter password": "パスワードを入力", + "Enter password...": "パスワードを入力...", + "Enter passwords for each encrypted file": "暗号化された各ファイルのパスワードを入力してください", + "Error": "エラー", + "Error during execution": "実行中にエラーが発生しました", + "Error generating PDF: {{error}}": "PDFの生成中にエラーが発生しました: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "PDFファイルの読み込み中にエラーが発生しました。有効なPDFでもう一度お試しください。", + "Error reading files: {{error}}": "ファイルの読み込み中にエラーが発生しました: {{error}}", + "Error saving PDF. Check console for details.": "PDFの保存中にエラーが発生しました。詳細はコンソールを確認してください。", + "Error: {{error}}": "エラー: {{error}}", + "Exactly 11 or 12 digits": "ちょうど11桁または12桁", + "Exactly 12 or 13 digits": "ちょうど12桁または13桁", + "Example of current format:": "現在の形式の例:", + "Excel to PDF": "ExcelからPDF", + "Existing Radio Groups": "既存のラジオグループ", + "Export Error": "エクスポートエラー", + "Export Value": "エクスポート値", + "Export failed": "エクスポートに失敗しました", + "External processing module needed": "外部処理モジュールが必要です", + "Extract Images": "画像を抽出", + "Extract Pages": "ページを抽出", + "Extract Tables": "表を抽出", + "Extract a range of pages": "ページ範囲を抽出", + "Extract all images from PDF": "PDFからすべての画像を抽出", + "Extract pages as separate PDFs": "ページを個別のPDFとして抽出", + "Extract text from PDF": "PDFからテキストを抽出", + "Extracted 1 table successfully!": "1つの表を抽出しました!", + "Extracted text from {{length}} PDF files!": "{{length}}個のPDFファイルからテキストを抽出しました!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}}個のPDFを抽出しました。失敗: {{failed}}個。", + "Extracted {{length}} page(s) successfully!": "{{length}}ページを抽出しました!", + "Extracted {{length}} table(s) to Excel!": "{{length}}個の表をExcelに抽出しました!", + "Extracted {{length}} tables successfully!": "{{length}}個の表を抽出しました!", + "Extracting attachments from {{length}} file(s)...": "{{length}}個のファイルから添付ファイルを抽出しています...", + "Extracting images from {{name}}...": "{{name}}から画像を抽出しています...", + "Extracting pages...": "ページを抽出しています...", + "Extracting tables...": "表を抽出しています...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "ファイル{{n}}/{{length}}からテキストを抽出しています: {{name}}...", + "Extracting text from multiple files...": "複数のファイルからテキストを抽出しています...", + "Extracting text from {{name}}...": "{{name}}からテキストを抽出しています...", + "Extracting text...": "テキストを抽出しています...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "AI用に{{name}}を抽出しています({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "AI用に{{name}}を抽出しています...", + "Extracting...": "抽出しています...", + "Extraction Complete": "抽出完了", + "Extraction Error": "抽出エラー", + "Extraction Partial": "一部のみ抽出", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "抽出が完了しました!{{length}}個の添付ファイルをZIPファイルにまとめました({{totalSize}})。ダウンロードを開始しました。", + "FB2 Files": "FB2ファイル", + "FB2 to PDF": "FB2からPDF", + "Failed": "失敗", + "Failed to acquire 2D canvas context": "2Dキャンバスコンテキストを取得できませんでした", + "Failed to add child layer": "子レイヤーを追加できませんでした", + "Failed to apply Bates numbers.": "ベイツ番号を適用できませんでした。", + "Failed to apply color adjustments. The file might be corrupted.": "色調整を適用できませんでした。ファイルが破損している可能性があります。", + "Failed to apply redactions.": "墨消しを適用できませんでした。", + "Failed to apply scanner effect. The file might be corrupted.": "スキャナー効果を適用できませんでした。ファイルが破損している可能性があります。", + "Failed to attach files: {{error}}": "ファイルを添付できませんでした: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "BMPをPDFに変換できませんでした。ファイルのいずれかが無効な可能性があります。", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "HEICをPDFに変換できませんでした。ファイルのいずれかが無効な可能性があります。", + "Failed to convert PDF to CSV. {{message}}": "PDFをCSVに変換できませんでした。{{message}}", + "Failed to convert PDF to Excel. {{message}}": "PDFをExcelに変換できませんでした。{{message}}", + "Failed to convert PDF to SVG. {{message}}": "PDFをSVGに変換できませんでした。{{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "PDFをグレースケールに変換できませんでした。ファイルが破損している可能性があります。", + "Failed to convert PDF. It may be image-based or corrupted.": "PDFを変換できませんでした。画像ベースか、破損している可能性があります。", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "TIFFをPDFに変換できませんでした。ファイルのいずれかが無効な可能性があります。", + "Failed to convert images to PDF.": "画像をPDFに変換できませんでした。", + "Failed to convert text to PDF. {{error}}": "テキストをPDFに変換できませんでした。{{error}}", + "Failed to convert {{filename}} to PNG": "{{filename}}をPNGに変換できませんでした", + "Failed to copy metadata to clipboard.": "メタデータをクリップボードにコピーできませんでした。", + "Failed to create PDF.": "PDFを作成できませんでした。", + "Failed to create PNG blob": "PNG Blobを作成できませんでした", + "Failed to create canvas context": "キャンバスコンテキストを作成できませんでした", + "Failed to create split PDFs.": "分割したPDFを作成できませんでした。", + "Failed to decode image: {{name}}": "画像をデコードできませんでした: {{name}}", + "Failed to decrypt private key": "秘密鍵を復号化できませんでした", + "Failed to decrypt. Try the Decrypt tool instead.": "復号化できませんでした。代わりに復号化ツールをお試しください。", + "Failed to delete layer": "レイヤーを削除できませんでした", + "Failed to delete pages.": "ページを削除できませんでした。", + "Failed to deskew PDF: {{error}}": "PDFの傾き補正に失敗しました: {{error}}", + "Failed to download the edited PDF.": "編集したPDFをダウンロードできませんでした。", + "Failed to edit attachments.": "添付ファイルを編集できませんでした。", + "Failed to extract certificate from PFX file": "PFXファイルから証明書を抽出できませんでした", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "ページを抽出できませんでした(qpdf終了コード {{exitCode}})。", + "Failed to extract pages.": "ページを抽出できませんでした。", + "Failed to extract tables. {{message}}": "表を抽出できませんでした。{{message}}", + "Failed to extract text from PDF.": "PDFからテキストを抽出できませんでした。", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "{{iccUrl}}からICCプロファイルを取得できませんでした: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "フォントファイルを取得できませんでした: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "gs.jsを取得できませんでした: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "{{url}}を取得できませんでした: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "{{pageNumber}}ページの2Dコンテキストを取得できませんでした", + "Failed to get canvas context": "キャンバスコンテキストを取得できませんでした", + "Failed to insert PDF. The file may be corrupted.": "PDFを挿入できませんでした。ファイルが破損している可能性があります。", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "{{normalizedUrl}}からGhostscriptを読み込めませんでした: {{msg}}", + "Failed to load PDF file.": "PDFファイルを読み込めませんでした。", + "Failed to load PDF for cropping.": "トリミング用のPDFを読み込めませんでした。", + "Failed to load PDF for preview.": "プレビュー用のPDFを読み込めませんでした。", + "Failed to load PDF form viewer.": "PDFフォームビューアーを読み込めませんでした。", + "Failed to load PDF layers": "PDFのレイヤーを読み込めませんでした", + "Failed to load PyMuPDF from CDN: {{msg}}": "CDNからPyMuPDFを読み込めませんでした: {{msg}}", + "Failed to load SVG image": "SVG画像を読み込めませんでした", + "Failed to load WebP image": "WebP画像を読み込めませんでした", + "Failed to load attachments from PDF.": "PDFから添付ファイルを読み込めませんでした。", + "Failed to load files: {{error}}": "ファイルを読み込めませんでした: {{error}}", + "Failed to load image.": "画像を読み込めませんでした。", + "Failed to load image: {{filename}}": "画像を読み込めませんでした: {{filename}}", + "Failed to load one or more PDF files.": "1つ以上のPDFファイルを読み込めませんでした。", + "Failed to load script: {{url}}": "スクリプトを読み込めませんでした: {{url}}", + "Failed to load template.": "テンプレートを読み込めませんでした。", + "Failed to load the PDF Editor.": "PDFエディターを読み込めませんでした。", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "画像プロセッサーを読み込めませんでした。ブラウザーがSharedArrayBufferに対応していることを確認してください(HTTPSまたはlocalhostが必要です)。", + "Failed to parse CSV: {{error}}": "CSVを解析できませんでした: {{error}}", + "Failed to parse signature": "署名を解析できませんでした", + "Failed to parse the certificate file.": "証明書ファイルを解析できませんでした。", + "Failed to process HEIC file: {{name}}": "HEICファイルを処理できませんでした: {{name}}", + "Failed to process WebP file: {{name}}": "WebPファイルを処理できませんでした: {{name}}", + "Failed to read file.": "ファイルを読み取れませんでした。", + "Failed to remove restrictions. The PDF may require the correct owner password.": "制限を解除できませんでした。PDFには正しいオーナーパスワードが必要な可能性があります。", + "Failed to render page": "ページを描画できませんでした", + "Failed to render page previews": "ページのプレビューを描画できませんでした", + "Failed to render page previews.": "ページのプレビューを描画できませんでした。", + "Failed to render page.": "ページを描画できませんでした。", + "Failed to save changes.": "変更を保存できませんでした。", + "Failed to save the new PDF. Check console for details.": "新しいPDFを保存できませんでした。詳細はコンソールを確認してください。", + "Failed to split PDF. Please check your selection.": "PDFを分割できませんでした。選択内容を確認してください。", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "PDFにタイムスタンプを付与できませんでした: {{message}}\n\n別のTSAサーバーを試すか、インターネット接続を確認してください。", + "Failed to toggle layer visibility": "レイヤーの表示切り替えに失敗しました", + "Failed to validate signatures. The file may be corrupted.": "署名を検証できませんでした。ファイルが破損している可能性があります。", + "Features enabled by this module:": "このモジュールで有効になる機能:", + "Field Name": "フィールド名", + "Field Name (Group Name)": "フィールド名(グループ名)", + "Field Name Conflict": "フィールド名の競合", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "フィールド名「{{newName}}」はこの{{value}}にすでに存在します。重複しない名前を使用してください。", + "Field name cannot be empty": "フィールド名は空にできません", + "File": "ファイル", + "File Size": "ファイルサイズ", + "File exists but could not be read. Check CORS configuration.": "ファイルは存在しますが、読み取れませんでした。CORSの設定を確認してください。", + "File list not found": "ファイルリストが見つかりません", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "ファイルサイズが{{originalSize}}から{{compressedSize}}に縮小されました({{percent}}%削減)。", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "ファイル{{n}}/{{length}}: ページ{{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "ファイル{{n}}/{{length}}: {{message}}", + "Filename": "ファイル名", + "Files that failed: {{errorCount}}.": "失敗したファイル: {{errorCount}} 件。", + "Fill (cover full target page)": "塗りつぶし(ページ全体を覆う)", + "Fill Color": "塗りつぶしの色", + "Finalizing PDF...": "PDFを仕上げています...", + "Find & replace": "検索と置換", + "Finds the best quality under this size. 0 means no target.": "このサイズ以下で最高の画質を探します。0は目標なしを意味します。", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "FirefoxやChromeでは、選択中にブラウザー標準の日付ピッカーの形式が表示されることがあります。日付の入力が終わると、正しい形式が適用されます。", + "First Indent": "1行目のインデント", + "Fit (keep full page visible)": "収める(ページ全体を表示)", + "Fit Page": "ページに合わせる", + "Fix Page Size": "ページサイズを固定", + "Flatten": "フラット化", + "Flatten Forms": "フォームをフラット化", + "Flatten annotations": "注釈をフラット化", + "Flatten form fields": "フォームフィールドをフラット化", + "Flatten forms and annotations": "フォームと注釈をフラット化", + "Flatten links": "リンクをフラット化", + "Flattening PDF...": "PDFをフラット化しています...", + "Flattening and saving PDF...": "PDFをフラット化して保存しています...", + "Flattening multiple PDFs...": "複数のPDFをフラット化しています...", + "Flattening page {{i}} of {{totalPages}}...": "{{i}}/{{totalPages}}ページをフラット化しています...", + "Flattening {{n}}/{{length}}: {{name}}...": "フラット化中 {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "アドレスバーにフォーカスします", + "Font": "フォント", + "Font Color": "フォントの色", + "Font Family": "フォントファミリー", + "Font Size": "フォントサイズ", + "Font size: {{bSize}} → {{aSize}}": "フォントサイズ: {{bSize}} → {{aSize}}", + "Font to Outline": "フォントをアウトライン化", + "Font: {{bFont}} → {{aFont}}": "フォント: {{bFont}} → {{aFont}}", + "Fonts": "フォント", + "Footer Center": "フッター中央", + "Footer Left": "フッター左", + "Footer Right": "フッター右", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "スキャンなど、画像のみのPDF向けです。選択可能なテキストがある場合は、コンテンツ保護を無視がオンでない限りスキップされます。", + "Form fields stop being fillable.": "フォームフィールドに入力できなくなります。", + "Format": "形式", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}}ページの空白ページが見つかりました。ページをクリックすると選択を解除できます。", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "既存のしおりが{{length}}件見つかりました。現在のしおりを置き換えますか?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length2}}個のPDFから{{length}}個の画像が見つかりました。", + "Front": "表面", + "Full Coverage": "全面を覆う", + "Gamma": "ガンマ", + "Generate table of contents from bookmarks": "しおりから目次を生成", + "Generating High-Quality PDF...": "高品質なPDFを生成しています...", + "Generating PDF...": "PDFを生成しています...", + "Generating ZIP file...": "ZIPファイルを生成しています...", + "Generating formatted content...": "フォーマット済みのコンテンツを生成しています...", + "Generating preview...": "プレビューを生成しています...", + "Ghostscript (PDF/A Conversion)": "Ghostscript(PDF/A変換)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "GhostscriptのRGB変換が終了コード{{exitCode}}で失敗しました", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscriptの変換が終了コード{{exitCode}}で失敗しました", + "Ghostscript did not produce output file": "Ghostscriptが出力ファイルを生成しませんでした", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscriptが設定されていません。詳細設定で設定してください。", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscriptが設定されていません。WASM設定で設定してください。", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscriptが設定されていません。PyMuPDFは一部の処理にGhostscriptを必要とします。詳細設定で両方を設定してください。", + "Ghostscript threw an exception: {{e}}": "Ghostscriptで例外が発生しました: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscriptラッパーが想定されたインターフェースを公開していません。loadGS()またはGhostscriptWASMクラスが必要です。", + "Go": "移動", + "Go to page": "ページへ移動", + "Grayscale": "グレースケール", + "Green": "緑", + "Greyscale": "グレースケール", + "Grid Mode": "グリッドモード", + "Group Name (Must be same for group)": "グループ名(グループ内で同じ名前にする必要があります)", + "H-Scale %": "水平比率 %", + "Hanging Indent": "ぶら下げインデント", + "Hard reloads page": "ページを強制再読み込みします", + "Header & Footer": "ヘッダーとフッター", + "Header & Footer added successfully!": "ヘッダーとフッターを追加しました!", + "Header Center": "ヘッダー中央", + "Header Left": "ヘッダー左", + "Header Right": "ヘッダー右", + "Height ({{unit}})": "高さ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "非表示", + "Hide Border": "枠線を非表示", + "Hide password": "パスワードを非表示", + "Hides window": "ウィンドウを隠します", + "High (288 DPI)": "高(288 DPI)", + "High (Smallest Files)": "高(最小ファイル)", + "Horizontal": "水平", + "Hue Shift": "色相シフト", + "Image Format": "画像形式", + "Image Input": "画像入力", + "Image quality": "画像品質", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "画像を{{width}}×{{height}}から{{width2}}×{{height2}}にリサイズしました", + "Images": "画像", + "Images above this are resampled down. None leaves resolution alone.": "これを超える画像はダウンサンプリングされます。「なし」の場合は解像度を変更しません。", + "Imported {{length}} bookmarks!": "{{length}}件のしおりをインポートしました!", + "Inches (in)": "インチ(in)", + "Include Attachments": "添付ファイルを含める", + "Include Cc Bcc": "CcとBccを含める", + "Include this file": "このファイルを含める", + "Incorrect Page Count": "ページ数が正しくありません", + "Incorrect Password": "パスワードが正しくありません", + "Incorrect password": "パスワードが正しくありません", + "Incorrect password. Please try again.": "パスワードが正しくありません。もう一度お試しください。", + "Increase size": "サイズを大きく", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "PDF 1のページ{{pageNumber}}/{{totalPages}}をインデックス化しています...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "PDF 2のページ{{pageNumber}}/{{totalPages}}をインデックス化しています...", + "Info": "情報", + "Info Dictionary": "情報辞書", + "Inherit": "継承", + "Initialization Error": "初期化エラー", + "Initializing Ghostscript...": "Ghostscriptを初期化しています...", + "Initializing PDF engine...": "PDFエンジンを初期化しています...", + "Initializing PyMuPDF...": "PyMuPDFを初期化しています...", + "Initializing decryption...": "復号化を初期化しています...", + "Initializing encryption...": "暗号化を初期化しています...", + "Initializing repair engine...": "修復エンジンを初期化しています...", + "Initializing...": "初期化しています...", + "Input Required": "入力が必要です", + "Insecure Digest (MD5 / SHA-1)": "安全でないダイジェスト(MD5 / SHA-1)", + "Insert blank pages": "空白ページを挿入", + "Insert blank pages after this page number": "このページ番号の後に空白ページを挿入", + "Interactive Form Fields": "インタラクティブなフォームフィールド", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "複数のPDFのページを交互に配置(例: 片面スキャンの奇数ページと逆順の偶数ページ)", + "Invalid Certificate": "無効な証明書", + "Invalid File": "無効なファイル", + "Invalid Files": "無効なファイル", + "Invalid Input": "無効な入力", + "Invalid JSON format": "無効なJSON形式", + "Invalid Name": "無効な名前", + "Invalid Order": "無効な順序", + "Invalid PDF password.": "PDFのパスワードが無効です。", + "Invalid Page Numbers": "無効なページ番号", + "Invalid Page Order": "無効なページ順", + "Invalid Pages": "無効なページ", + "Invalid Range": "無効な範囲", + "Invalid Signature": "無効な署名", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "TSAのURLが無効です。タイムスタンプ局は有効なhttp://またはhttps://のURLである必要があります。", + "Invalid URL": "無効なURL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "URL形式が無効です。有効なURLを入力してください(例: https://example.com/wasm/)", + "Invalid XML: no root element": "無効なXML: ルート要素がありません", + "Invalid data": "無効なデータ", + "Invalid hex string in content stream": "コンテンツストリーム内の16進文字列が無効です", + "Invalid page range specified.": "無効なページ範囲が指定されました。", + "Invalid shortcut format": "ショートカットの形式が無効です", + "Invalid: Cryptographic Verification Failed": "無効: 暗号化検証に失敗しました", + "Invert Colors": "色を反転", + "Invert all colors": "すべての色を反転", + "Inverting PDF colors...": "PDFの色を反転しています...", + "Issuer": "発行者", + "It fits the {{targetBytes}} target.": "目標の{{targetBytes}}に収まっています。", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "PDF/Aを維持する設定により圧縮できる範囲が限られるため、目標の{{targetBytes}}をまだ上回っています。", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "PDF/A準拠とは表示されなくなります。維持するには、カスタム設定でPDF/Aを維持をオンにしてください。", + "Italic": "斜体", + "Item 1": "項目1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "圧縮するため、電子署名は削除されました。必要に応じて再度署名してください。", + "JPEG (Smaller file size)": "JPEG(小さいファイルサイズ)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "再エンコードされる画像のJPEG品質(20~100)。低いほどファイルは小さくなり、ノイズが目立ちます。", + "JPG": "JPG", + "JSON Files": "JSONファイル", + "JSON Loaded": "JSONを読み込みました", + "JSON to PDF": "JSONからPDF", + "Javascript Code": "JavaScriptコード", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "PDF/Aファイルの準拠を維持します。オンの間、Brotliとラスタライズはスキップされます。", + "Keeps only the characters the document uses.": "ドキュメントで使われている文字だけを残します。", + "Key (e.g., Department)": "キー(例: 部署)", + "Keywords": "キーワード", + "Label": "ラベル", + "Label / Prompt": "ラベル / プロンプト", + "Landscape": "横向き", + "Language": "言語", + "Layer not found": "レイヤーが見つかりません", + "Layer {{number}}": "レイヤー{{number}}", + "Leave blank for all pages": "空白のままにするとすべてのページが対象です", + "Left": "左", + "Left edge in points (1 inch = 72 pts)": "左端(ポイント、1インチ = 72ポイント)", + "Legal": "リーガル", + "Letter": "レター", + "Level": "レベル", + "Limit recognized characters (leave empty for all)": "認識する文字を制限(空欄ですべて)", + "Line": "線", + "Linearization Failed": "リニア化に失敗しました", + "Linearize": "リニア化", + "Links stop being clickable.": "リンクをクリックできなくなります。", + "Lists": "リスト", + "Load": "読み込む", + "Load system fonts": "システムフォントを読み込む", + "Load system fonts…": "システムフォントを読み込む…", + "Loaded": "読み込み済み", + "Loaded bookmarks from JSON. Now upload your PDF.": "JSONからしおりを読み込みました。次にPDFをアップロードしてください。", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "CSVから{{length}}件のしおりを読み込みました。次にPDFをアップロードしてください。", + "Loading Engine...": "エンジンを読み込んでいます...", + "Loading Ghostscript...": "Ghostscriptを読み込んでいます...", + "Loading PDF Editor...": "PDFエディターを読み込んでいます...", + "Loading PDF Text Editor...": "PDFテキストエディターを読み込んでいます...", + "Loading PDF converter...": "PDFコンバーターを読み込んでいます...", + "Loading PDF documents...": "PDFドキュメントを読み込んでいます...", + "Loading PDF engine...": "PDFエンジンを読み込んでいます...", + "Loading PDF files...": "PDFファイルを読み込んでいます...", + "Loading PDF form...": "PDFフォームを読み込んでいます...", + "Loading PDF processor...": "PDFプロセッサーを読み込んでいます...", + "Loading PDF viewer...": "PDFビューアーを読み込んでいます...", + "Loading PDF...": "PDFを読み込んでいます...", + "Loading PDFs...": "PDFを読み込んでいます...", + "Loading attachments...": "添付ファイルを読み込んでいます...", + "Loading comparison {{currentPage}} of {{length}}...": "比較{{currentPage}}/{{length}}を読み込んでいます...", + "Loading conversion engine ({{percent}}%)...": "変換エンジンを読み込んでいます({{percent}}%)...", + "Loading conversion engine...": "変換エンジンを読み込んでいます...", + "Loading engine...": "エンジンを読み込んでいます...", + "Loading fonts...": "フォントを読み込んでいます...", + "Loading layers from {{name}}...": "{{name}}からレイヤーを読み込んでいます...", + "Loading page {{num}}...": "ページ{{num}}を読み込んでいます...", + "Loading preview...": "プレビューを読み込んでいます...", + "Loading {{name}}...": "{{name}}を読み込んでいます...", + "Loading...": "読み込み中...", + "Location": "場所", + "Lossless (No Quality Loss)": "ロスレス(画質劣化なし)", + "Lossless (no image re-encoding)": "ロスレス(画像を再エンコードしない)", + "Low (Best Quality)": "低(最高画質)", + "MOBI Files": "MOBIファイル", + "MOBI to PDF": "MOBIからPDF", + "Malformed ByteRange": "ByteRangeの形式が正しくありません", + "Malformed ECDSA signature (could not parse r,s)": "ECDSA署名の形式が正しくありません(r,sを解析できませんでした)", + "Malformed inline image in content stream": "コンテンツストリーム内のインライン画像の形式が正しくありません", + "Malformed signatureAlgorithm": "signatureAlgorithmの形式が正しくありません", + "Margins": "余白", + "Markdown Files": "Markdownファイル", + "Markdown to PDF": "MarkdownからPDF", + "Max Length (0 for unlimited)": "最大長(0で無制限)", + "Maximum resolution": "最大解像度", + "Medium (Recommended)": "中(推奨)", + "Merge PDF": "PDFを結合", + "Merge PDFs": "PDFを結合", + "Merge duplicate fonts": "重複するフォントを統合", + "Mermaid Error: {{error}}": "Mermaidエラー: {{error}}", + "Metadata copied to clipboard as JSON.": "メタデータをJSONとしてクリップボードにコピーしました。", + "Metadata removed successfully!": "メタデータを削除しました!", + "Metadata updated successfully!": "メタデータを更新しました!", + "Millimeters (mm)": "ミリメートル(mm)", + "Minimizes window": "ウィンドウを最小化します", + "Missing Files": "ファイルがありません", + "Missing signatureAlgorithm": "signatureAlgorithmがありません", + "Mixed Page Sizes Detected": "ページサイズが混在しています", + "Mixed Sizes": "サイズ混在", + "Mode": "モード", + "Modified": "変更", + "Modified After Signing (signed part intact)": "署名後に変更あり(署名部分は無傷)", + "More": "その他", + "Moved": "移動", + "Moved \"{{value}}\"": "「{{value}}」を移動しました", + "Multi-line": "複数行", + "Must be a positive integer": "正の整数を入力してください", + "Must be a positive number": "正の数を入力してください", + "N must be at least 1.": "Nは1以上にしてください。", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDFを作成しました!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "ネットワークエラー: URLに接続できませんでした。URLが正しいこと、およびサーバーがCORSリクエストを許可していることを確認してください。", + "Network error: {{error}}": "ネットワークエラー: {{error}}", + "Next page": "次のページ", + "No Area Selected": "領域が選択されていません", + "No Attachments": "添付ファイルなし", + "No Changes": "変更なし", + "No Crop Area": "トリミング領域なし", + "No File": "ファイルなし", + "No Files": "ファイルなし", + "No Images Found": "画像が見つかりません", + "No PDF Files": "PDFファイルなし", + "No PDF document loaded": "PDFドキュメントが読み込まれていません", + "No PDF document loaded.": "PDFドキュメントが読み込まれていません。", + "No PDF file loaded.": "PDFファイルが読み込まれていません。", + "No PDF files could be decrypted. The password may be incorrect.": "復号化できるPDFファイルがありませんでした。パスワードが正しくない可能性があります。", + "No PDF files could be linearized.": "リニア化できるPDFファイルがありませんでした。", + "No PDFs could be processed.": "処理できるPDFがありませんでした。", + "No Pages": "ページなし", + "No Selection": "選択なし", + "No Signatures Found": "署名が見つかりません", + "No Tables Found": "表が見つかりません", + "No Text": "テキストなし", + "No URL configured": "URLが設定されていません", + "No attachments found in this PDF.": "このPDFには添付ファイルがありません。", + "No attachments selected for removal.": "削除する添付ファイルが選択されていません。", + "No blank pages detected in this PDF.": "このPDFでは空白ページが検出されませんでした。", + "No bookmarks found at the selected level.": "選択したレベルにしおりが見つかりません。", + "No bookmarks to delete.": "削除するしおりがありません。", + "No bookmarks to export!": "エクスポートするしおりがありません!", + "No certificate found in PEM file": "PEMファイルに証明書が見つかりません", + "No certificate found in PFX file": "PFXファイルに証明書が見つかりません", + "No certificates found in signature": "署名に証明書が見つかりません", + "No changes match the current filter.": "現在のフィルターに一致する変更はありません。", + "No configurable settings for this node.": "このノードには設定できる項目がありません。", + "No differences detected on this page.": "このページでは差異が検出されませんでした。", + "No embedded images were found in the selected PDF(s).": "選択したPDFに埋め込み画像は見つかりませんでした。", + "No existing bookmarks found in this PDF.": "このPDFに既存のしおりは見つかりません。", + "No items were selected for removal or none were found in the PDF.": "削除する項目が選択されていないか、PDF内に見つかりませんでした。", + "No page pairs to export.": "エクスポートするページペアがありません。", + "No pages found. Please create a blank PDF or upload one.": "ページが見つかりません。空白のPDFを作成するか、PDFをアップロードしてください。", + "No pages selected for removal.": "削除するページが選択されていません。", + "No pages were selected for splitting.": "分割するページが選択されていません。", + "No paired page for this side.": "この側に対応するページはありません。", + "No private key found in PEM file": "PEMファイルに秘密鍵が見つかりません", + "No private key found in PFX file": "PFXファイルに秘密鍵が見つかりません", + "No tables were detected in this PDF.": "このPDFでは表が検出されませんでした。", + "No valid page numbers found.": "有効なページ番号が見つかりません。", + "No valid pages to save.": "保存できる有効なページがありません。", + "No worker": "ワーカーなし", + "Noise": "ノイズ", + "None": "なし", + "None of the files could be compressed: {{join}}.": "圧縮できたファイルはありませんでした: {{join}}。", + "Normal": "標準", + "Not Enough Files": "ファイルが足りません", + "Not a PDF": "PDFではありません", + "Not connected": "未接続", + "Not in trust chain": "信頼チェーンに含まれていません", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "注: 別のオーナーパスワードがない場合、PDFには利用制限がありません。", + "Number Format": "番号の形式", + "Number of Pages": "ページ数", + "OCR": "OCR", + "OCR aborted before any page was processed": "ページが処理される前にOCRが中断されました", + "OCR recognize timed out after {{timeoutMs}}ms": "OCRの認識が{{timeoutMs}}ミリ秒でタイムアウトしました", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODGファイル", + "ODG to PDF": "ODGからPDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "オフ(デフォルト): 1~Nの通し番号になります。オン: 各ファイルの元のページラベルを保持します(ラベルが重複する場合があります)。", + "One PDF per page": "ページごとに1つのPDF", + "One PDF per range": "範囲ごとに1つのPDF", + "Only a substitute font was available": "代替フォントしか利用できませんでした", + "Only where it does not change how the image looks.": "画像の見た目が変わらない場合のみ適用します。", + "Opacity": "不透明度", + "Open URL": "URLを開く", + "Opens incognito window": "シークレットウィンドウを開きます", + "Opens new tab": "新しいタブを開きます", + "Opens new window": "新しいウィンドウを開きます", + "Operation Failed": "操作に失敗しました", + "Operation resulted in an empty file.": "操作の結果、空のファイルになりました。", + "Optimize PDF for fast web viewing": "高速なWeb表示のためにPDFを最適化", + "Optimizing PDFs for web view (linearizing)...": "Web表示用にPDFを最適化しています(リニア化)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "{{name}}を最適化しています({{n}}/{{length}})...", + "Options (One per line or comma separated)": "オプション(1行に1つ、またはカンマ区切り)", + "Orientation": "向き", + "Outline": "アウトライン", + "Output": "出力", + "Overlay": "オーバーレイ", + "Overlay or underlay pages from one PDF onto another": "あるPDFのページを別のPDFの上または下に重ねる", + "Owner Password": "オーナーパスワード", + "Owner Password Required": "オーナーパスワードが必要です", + "PDF": "PDF", + "PDF Files": "PDFファイル", + "PDF Input": "PDF入力", + "PDF Layers": "PDFレイヤー", + "PDF Metadata": "PDFメタデータ", + "PDF Producer": "PDF変換元", + "PDF converted to CSV successfully!": "PDFをCSVに変換しました!", + "PDF converted to SVG successfully!": "PDFをSVGに変換しました!", + "PDF converted to greyscale successfully!": "PDFをグレースケールに変換しました!", + "PDF created successfully!": "PDFを作成しました!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDFを復号化しました!すべての暗号化と制限が解除されました。", + "PDF decrypted successfully! Your download has started.": "PDFを復号化しました!ダウンロードを開始しました。", + "PDF downloaded successfully.": "PDFをダウンロードしました。", + "PDF encrypted successfully with 256-bit AES!": "PDFを256ビットAESで暗号化しました!", + "PDF has been sanitized and downloaded.": "PDFをサニタイズしてダウンロードしました。", + "PDF has no pages": "PDFにページがありません", + "PDF organized successfully!": "PDFを整理しました!", + "PDF permissions changed successfully!": "PDFの権限を変更しました!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDFリーダーは14種類の標準PDFフォントを自前で備えています。", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDFの制限を解除しました!ファイルの編集と印刷が自由にできるようになりました。", + "PDF saved successfully!": "PDFを保存しました!", + "PDF split successfully!": "PDFを分割しました!", + "PDF to CSV": "PDFからCSV", + "PDF to DOCX": "PDFからDOCX", + "PDF to Excel/CSV": "PDFからExcel/CSV", + "PDF to Images": "PDFから画像", + "PDF to Images (High Quality)": "PDFから画像(高画質)", + "PDF to JSON": "PDFからJSON", + "PDF to Markdown": "PDFからMarkdown", + "PDF to PDF/A": "PDFからPDF/A", + "PDF to SVG": "PDFからSVG", + "PDF to Text": "PDFからテキスト", + "PDF to XLSX": "PDFからXLSX", + "PDF with layer changes saved!": "レイヤーの変更を加えたPDFを保存しました!", + "PDF {{modeLabel}} applied successfully.": "PDFの{{modeLabel}}を適用しました。", + "PDF/A Conversion": "PDF/A変換", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b(厳格、透明効果なし)", + "PDF/A-2b (Recommended)": "PDF/A-2b(推奨)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b(最新、添付ファイル可)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDFを混合しました!", + "PNG": "PNG", + "PNG (Lossless)": "PNG(ロスレス)", + "PUB to PDF": "PUBからPDF", + "Page": "ページ", + "Page #": "ページ番号", + "Page Added": "ページを追加しました", + "Page Numbers": "ページ番号", + "Page Removed": "ページを削除しました", + "Page Size": "ページサイズ", + "Page X of Y": "ページ X / Y", + "Page background or layout changed": "ページの背景またはレイアウトが変更されました", + "Page container not found": "ページコンテナが見つかりません", + "Page extraction produced an empty PDF.": "ページの抽出結果が空のPDFになりました。", + "Page number": "ページ番号", + "Page numbers added successfully!": "ページ番号を追加しました!", + "Page sizes standardized successfully!": "ページサイズを統一しました!", + "Page {{currentPageNum}} of {{numPages}}": "ページ{{currentPageNum}}/{{numPages}}", + "Page {{num}} / {{numPages}}": "ページ{{num}}/{{numPages}}", + "Page {{n}} ": "ページ{{n}} ", + "Page {{n}} of {{length}}": "ページ{{n}}/{{length}}", + "Page {{n}}:": "ページ{{n}}:", + "Page {{pageNumber}}": "ページ{{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "ページ{{pageNumber}}は1つ目のPDFにのみ存在します。", + "Page {{pageNumber}} exists only in the second PDF.": "ページ{{pageNumber}}は2つ目のPDFにのみ存在します。", + "Page {{pageNumber}} of {{totalPages}}": "ページ{{pageNumber}}/{{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "ページ{{pageNum}}はこのPDFに存在しません。", + "Page {{page}}": "ページ{{page}}", + "Page {{page}} attachment": "ページ{{page}}の添付ファイル", + "Pages": "ページ", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "ページ(例: 1-3, 5)- 合計: {{pageCount}}", + "Pages Files": "Pagesファイル", + "Pages Per Sheet": "1シートあたりのページ数", + "Pages combined successfully!": "ページを結合しました!", + "Pages have been divided successfully!": "ページを分割しました!", + "Pages have been reordered.": "ページを並べ替えました。", + "Pages have been reversed successfully!": "ページを逆順にしました!", + "Pages to PDF": "PagesからPDF", + "Paper Size": "用紙サイズ", + "Paragraph": "段落", + "Parsing XML structure...": "XML構造を解析しています...", + "Parsing {{name}}...": "{{name}}を解析しています...", + "Partial Coverage": "一部を覆う", + "Partial Success": "一部成功", + "Password": "パスワード", + "Password Error": "パスワードエラー", + "Password Needed": "パスワードが必要です", + "Password Required": "パスワードが必要です", + "Password for all files": "すべてのファイルのパスワード", + "Password for all locked files": "ロックされたすべてのファイルのパスワード", + "Password for {{name}}": "{{name}}のパスワード", + "Password protected": "パスワード保護あり", + "Password required for encrypted private key": "暗号化された秘密鍵にはパスワードが必要です", + "Path Stroke": "パスのストローク", + "Please add at least one field before downloading.": "ダウンロードする前に、フィールドを1つ以上追加してください。", + "Please draw a rectangle on at least one page to select the crop area.": "トリミング範囲を選択するには、1ページ以上で四角形を描いてください。", + "Please ensure all page numbers in the order are unique.": "順序内のページ番号がすべて重複していないことを確認してください。", + "Please enter a layer name": "レイヤー名を入力してください", + "Please enter a name.": "名前を入力してください。", + "Please enter a number between 0 and {{totalPages}}.": "0から{{totalPages}}までの数字を入力してください。", + "Please enter a page order.": "ページ順を入力してください。", + "Please enter a password": "パスワードを入力してください", + "Please enter a password for {{i}} or skip it": "{{i}}のパスワードを入力するか、スキップしてください", + "Please enter a title.": "タイトルを入力してください。", + "Please enter a user password.": "ユーザーパスワードを入力してください。", + "Please enter a valid number of pages (1 or more).": "有効なページ数(1以上)を入力してください。", + "Please enter a valid page number between 1 and {{total}}": "1から{{total}}までの有効なページ番号を入力してください", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "有効なページ範囲を入力してください(例: 1-5, 8, 11-13)。", + "Please enter page numbers to extract.": "抽出するページ番号を入力してください。", + "Please enter positive numbers.": "正の数を入力してください。", + "Please enter some text to convert.": "変換するテキストを入力してください。", + "Please enter text for the watermark.": "透かしのテキストを入力してください。", + "Please enter the PDF password.": "PDFのパスワードを入力してください。", + "Please load a PDF first.": "先にPDFを読み込んでください。", + "Please select PDF files to create a ZIP archive.": "ZIPアーカイブを作成するPDFファイルを選択してください。", + "Please select a .pem, .crt, .cer, or .der certificate file.": ".pem、.crt、.cer、.derのいずれかの証明書ファイルを選択してください。", + "Please select a PDF file.": "PDFファイルを選択してください。", + "Please select a valid PDF file.": "有効なPDFファイルを選択してください。", + "Please select an area on at least one page to crop.": "トリミングするには、1ページ以上で範囲を選択してください。", + "Please select an area to crop first.": "先にトリミングする範囲を選択してください。", + "Please select an area to crop.": "トリミングする範囲を選択してください。", + "Please select an image file for the watermark.": "透かしに使う画像ファイルを選択してください。", + "Please select at least one BMP file.": "BMPファイルを1つ以上選択してください。", + "Please select at least one CSV file.": "CSVファイルを1つ以上選択してください。", + "Please select at least one Excel file.": "Excelファイルを1つ以上選択してください。", + "Please select at least one HEIC file.": "HEICファイルを1つ以上選択してください。", + "Please select at least one JPG file.": "JPGファイルを1つ以上選択してください。", + "Please select at least one JPG or JPEG2000 image.": "JPGまたはJPEG2000の画像を1つ以上選択してください。", + "Please select at least one ODT file.": "ODTファイルを1つ以上選択してください。", + "Please select at least one PDF file.": "PDFファイルを1つ以上選択してください。", + "Please select at least one PowerPoint file.": "PowerPointファイルを1つ以上選択してください。", + "Please select at least one RTF file.": "RTFファイルを1つ以上選択してください。", + "Please select at least one SVG file.": "SVGファイルを1つ以上選択してください。", + "Please select at least one TIFF file.": "TIFFファイルを1つ以上選択してください。", + "Please select at least one Word document.": "Word文書を1つ以上選択してください。", + "Please select at least one file to attach.": "添付するファイルを1つ以上選択してください。", + "Please select at least one image file.": "画像ファイルを1つ以上選択してください。", + "Please select at least one text file.": "テキストファイルを1つ以上選択してください。", + "Please select at least one {{FILETYPE_NAME}} file.": "{{FILETYPE_NAME}}ファイルを1つ以上選択してください。", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "{{TOOL_NAME}}ファイル(.emlまたは.msg)を1つ以上選択してください。", + "Please select at least one {{TOOL_NAME}} file.": "{{TOOL_NAME}}ファイルを1つ以上選択してください。", + "Please select even or odd pages.": "偶数ページか奇数ページを選択してください。", + "Please select one or more PDF files.": "PDFファイルを1つ以上選択してください。", + "Please select pages to delete.": "削除するページを選択してください。", + "Please select pages to duplicate.": "複製するページを選択してください。", + "Please select pages to mark for splitting.": "分割位置にするページを選択してください。", + "Please select pages to rotate.": "回転するページを選択してください。", + "Please specify a page range for page-level attachments.": "ページ単位の添付ファイルには、ページ範囲を指定してください。", + "Please upload PDF files.": "PDFファイルをアップロードしてください。", + "Please upload PDFs first.": "先にPDFをアップロードしてください。", + "Please upload a .docx file first.": "先に.docxファイルをアップロードしてください。", + "Please upload a PDF file first.": "先にPDFファイルをアップロードしてください。", + "Please upload a PDF file.": "PDFファイルをアップロードしてください。", + "Please upload a PDF first.": "先にPDFをアップロードしてください。", + "Please upload a valid PDF file.": "有効なPDFファイルをアップロードしてください。", + "Please upload at least one PDF file.": "PDFファイルを1つ以上アップロードしてください。", + "Please upload at least two PDF files to alternate and mix.": "交互に混ぜるには、PDFファイルを2つ以上アップロードしてください。", + "Please upload both a base PDF and an overlay/underlay PDF.": "ベースのPDFと、オーバーレイ/アンダーレイ用のPDFの両方をアップロードしてください。", + "Please upload valid PDF files.": "有効なPDFファイルをアップロードしてください。", + "Please use the Download button in the PDF viewer toolbar above.": "上のPDFビューアーのツールバーにあるダウンロードボタンを使用してください。", + "Please wait for the PDF viewer to load.": "PDFビューアーの読み込みが完了するまでお待ちください。", + "Please wait for the form to finish loading.": "フォームの読み込みが完了するまでお待ちください。", + "Portrait": "縦向き", + "Position": "位置", + "Post-processing for transparency compliance...": "透明度の準拠のための後処理中...", + "Posterize": "ポスタライズ", + "Posterizing PDF...": "PDFをポスタライズしています...", + "PowerPoint to PDF": "PowerPointからPDF", + "Pre Flatten": "事前フラット化", + "Pre-flattening PDF...": "PDFを事前にフラット化しています...", + "Prefer JPEG 2000 for photos": "写真にはJPEG 2000を優先", + "Preparing PDF export...": "PDFのエクスポートを準備しています...", + "Preparing conversion...": "変換を準備しています...", + "Preparing download...": "ダウンロードを準備しています...", + "Preparing preview...": "プレビューを準備しています...", + "Presentations": "プレゼンテーション", + "Preserve PDF/A": "PDF/Aを維持", + "Preview": "プレビュー", + "Preview Error": "プレビューエラー", + "Preview Text": "テキストのプレビュー", + "Previous page": "前のページ", + "Print Form": "フォームを印刷", + "Private data that editing apps store inside the PDF.": "編集アプリがPDF内に保存する非公開データ。", + "Processed {{processedCount}} PDFs.": "{{processedCount}}個のPDFを処理しました。", + "Processing Complete": "処理完了", + "Processing Dpi": "処理DPI", + "Processing Failed": "処理に失敗しました", + "Processing PDF permissions...": "PDFの権限を処理しています...", + "Processing attachments...": "添付ファイルを処理しています...", + "Processing failed for {{name}}.": "{{name}}の処理に失敗しました。", + "Processing file {{n}} of {{length}}...": "ファイル{{n}}/{{length}}を処理しています...", + "Processing images...": "画像を処理しています...", + "Processing multiple PDFs...": "複数のPDFを処理しています...", + "Processing page {{i}} of {{numPages}}": "ページ{{i}}/{{numPages}}を処理中", + "Processing page {{i}} of {{numPages}}...": "ページ{{i}}/{{numPages}}を処理しています...", + "Processing page {{n}} of {{length}}...": "ページ{{n}}/{{length}}を処理しています...", + "Processing page {{pageNum}} of {{length}}...": "ページ{{pageNum}}/{{length}}を処理しています...", + "Processing page {{pageNum}} of {{totalPages}}...": "ページ{{pageNum}}/{{totalPages}}を処理しています...", + "Processing produced an empty file.": "処理の結果、空のファイルになりました。", + "Processing resulted in an empty file.": "処理の結果、空のファイルになりました。", + "Processing sheet {{n}}...": "シート{{n}}を処理しています...", + "Processing {{name}}...": "{{name}}を処理しています...", + "Processing {{nodeName}}...": "{{nodeName}}を処理しています...", + "Processing {{n}}/{{length}}: {{name}}...": "処理中 {{n}}/{{length}}: {{name}}...", + "Processing...": "処理しています...", + "Producer": "PDF変換元", + "Publisher Files": "Publisherファイル", + "Purple": "紫", + "PyMuPDF (Document Processing)": "PyMuPDF(ドキュメント処理)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDFが設定されていません。詳細設定で設定してください。", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDFモジュールが想定されたPyMuPDFクラスをエクスポートしていません。", + "PyMuPDF produced an empty decrypted file.": "PyMuPDFが空の復号ファイルを生成しました。", + "PyMuPDF: not configured.": "PyMuPDF: 未設定です。", + "QR Code": "QRコード", + "Quality": "品質", + "Quits application (cannot be overridden)": "アプリケーションを終了します(上書き不可)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1署名が署名者の公開鍵で検証できません", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS署名が署名者の公開鍵で検証できません", + "Rasterization Complete": "ラスタライズ完了", + "Rasterization Partial": "ラスタライズ一部完了", + "Rasterize": "ラスタライズ", + "Rasterize Dpi": "ラスタライズDPI", + "Rasterize pages to images": "ページを画像にラスタライズ", + "Rasterize quality": "ラスタライズ品質", + "Rasterize resolution (DPI)": "ラスタライズ解像度(DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}}個のPDFをラスタライズしました。失敗: {{failed}}個。", + "Rasterizing {{name}} ({{n}}/{{total}})...": "{{name}}をラスタライズしています({{n}}/{{total}})...", + "Rasterizing {{name}}...": "{{name}}をラスタライズしています...", + "Rasterizing...": "ラスタライズしています...", + "Rating must be between 0 and 5": "評価は0から5の間にしてください", + "Read Only": "読み取り専用", + "Reading CSV file...": "CSVファイルを読み込んでいます...", + "Reading PDF...": "PDFを読み込んでいます...", + "Reading XML file...": "XMLファイルを読み込んでいます...", + "Reading encrypted PDF...": "暗号化されたPDFを読み込んでいます...", + "Reading files...": "ファイルを読み込んでいます...", + "Reading layer configuration...": "レイヤー設定を読み込んでいます...", + "Reading {{name}} ({{n}}/{{length}})...": "{{name}}を読み込んでいます({{n}}/{{length}})...", + "Ready": "準備完了", + "Reason": "理由", + "Red": "赤", + "Redact": "墨消し", + "Redact Mode": "墨消しモード", + "Redact text from PDF": "PDFのテキストを墨消し", + "Redaction Failed": "墨消しに失敗しました", + "Reduce PDF file size": "PDFのファイルサイズを縮小", + "Reduce color complexity": "色の複雑さを減らす", + "Reduces file size by removing color information.": "色情報を削除してファイルサイズを縮小します。", + "Reloads page": "ページを再読み込みします", + "Remove": "削除", + "Remove All Attachments": "すべての添付ファイルを削除", + "Remove Annotations": "注釈を削除", + "Remove Blank Pages": "空白ページを削除", + "Remove Embedded Files": "埋め込みファイルを削除", + "Remove Fonts": "フォントを削除", + "Remove Javascript": "JavaScriptを削除", + "Remove Layers": "レイヤーを削除", + "Remove Links": "リンクを削除", + "Remove Mark Info": "Mark情報を削除", + "Remove Metadata": "メタデータを削除", + "Remove PDF password protection": "PDFのパスワード保護を解除", + "Remove Structure Tree": "構造ツリーを削除", + "Remove alternate images": "代替画像を削除", + "Remove application data": "アプリケーションデータを削除", + "Remove article threads": "記事スレッドを削除", + "Remove attachment": "添付ファイルを削除", + "Remove blank pages automatically": "空白ページを自動的に削除", + "Remove document structure tree": "ドキュメントの構造ツリーを削除", + "Remove file": "ファイルを削除", + "Remove metadata, scripts, and hidden data": "メタデータ、スクリプト、隠しデータを削除", + "Remove output intents": "出力インテントを削除", + "Remove page thumbnails": "ページのサムネイルを削除", + "Remove specific pages": "特定のページを削除", + "Remove web capture information": "Webキャプチャ情報を削除", + "Remove {{name}}": "{{name}}を削除", + "Removed \"{{beforeText}}\"": "「{{beforeText}}」を削除しました", + "Removed image ({{width}}×{{height}})": "画像を削除しました({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "空白ページを{{length}}ページ削除しました!", + "Removing all metadata...": "すべてのメタデータを削除しています...", + "Removing annotations...": "注釈を削除しています...", + "Removing redacted text from document data...": "ドキュメントデータから墨消しされたテキストを削除しています...", + "Removing restrictions...": "制限を解除しています...", + "Removing {{length}} blank page(s)...": "空白ページを{{length}}ページ削除しています...", + "Render Error": "描画エラー", + "Rendering Page {{num}}...": "ページ{{num}}を描画しています...", + "Rendering page previews...": "ページのプレビューを描画しています...", + "Rendering page previews: {{current}}/{{total}}": "ページのプレビューを描画中: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "ページ{{n}}/{{length}}を描画しています...", + "Rendering preview for page {{pageNum}}...": "ページ{{pageNum}}のプレビューを描画しています...", + "Reopens closed tab": "閉じたタブを再度開きます", + "Repair": "修復", + "Repair Failed": "修復に失敗しました", + "Repair corrupted PDF": "破損したPDFを修復", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}}個のファイルを修復しました。修復に失敗: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "{{name}}を修復しています({{n}}/{{length}})...", + "Repairing {{name}}...": "{{name}}を修復しています...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "「{{beforeText}}」を「{{afterText}}」に置き換えました", + "Required": "必須", + "Resamples even when an image is only slightly above the limit.": "画像が上限をわずかに超えている場合でもリサンプリングします。", + "Reset Form": "フォームをリセット", + "Reset and go back to file uploader? All unsaved changes will be lost.": "リセットしてファイルのアップロード画面に戻りますか?保存していない変更はすべて失われます。", + "Resolution": "解像度", + "Retain Page Labels": "ページラベルを保持", + "Retry Failed": "失敗したものを再試行", + "Reverse Pages": "ページを逆順にする", + "Reverse page order": "ページの順序を逆にする", + "Reversing page order...": "ページの順序を逆にしています...", + "Reversing {{name}} ({{n}}/{{length}})...": "{{name}}を逆順にしています({{n}}/{{length}})...", + "Right": "右", + "Right edge in points": "右端(ポイント)", + "Rotate": "回転", + "Rotate +90°": "+90°回転", + "Rotate all pages": "すべてのページを回転", + "Rotation": "回転", + "Rotation Variance": "回転分散", + "Rotations applied successfully!": "回転を適用しました!", + "Rows": "行", + "Run Javascript": "JavaScriptを実行", + "Running OCR on page {{pageNum}}...": "ページ{{pageNum}}でOCRを実行しています...", + "Running...": "実行中...", + "SVG": "SVG", + "SVG Files": "SVGファイル", + "SVG to PDF": "SVGからPDF", + "Sanitize": "サニタイズ", + "Sanitized With Warnings": "警告付きでサニタイズしました", + "Sanitizing PDF...": "PDFをサニタイズしています...", + "Saturation": "彩度", + "Saved": "保存しました", + "Saving PDF with layer changes...": "レイヤーの変更を加えたPDFを保存しています...", + "Scaling Mode": "拡大縮小モード", + "Scanner Effect": "スキャナー効果", + "Scanner effect applied successfully!": "スキャナー効果を適用しました!", + "Scanning page {{n}} of {{pageCount}}...": "ページ{{n}}/{{pageCount}}をスキャンしています...", + "Search Text": "テキストを検索", + "Search languages...": "言語を検索...", + "Select Font": "フォントを選択", + "Select a field to edit properties": "プロパティを編集するフィールドを選択", + "Select a field...": "フィールドを選択...", + "Select to add this button to an existing group": "選択すると、このボタンを既存のグループに追加します", + "Selected Option": "選択したオプション", + "Self-Signed: Signer Identity Not Verified": "自己署名: 署名者の身元は未検証", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "セルフホストのOCRアセットが一部だけ設定されています。{{missing}}を、ほかのTesseractアセットのURLと合わせて設定してください。", + "Separator": "区切り", + "Separator Color": "区切りの色", + "Separator Thickness": "区切りの太さ", + "Sepia": "セピア", + "Serial Number:": "シリアル番号:", + "Set custom destination": "カスタム宛先を設定", + "Shapes": "図形", + "Sheet {{n}} {{sideLabel}}": "シート{{n}} {{sideLabel}}", + "Show": "表示", + "Show password": "パスワードを表示", + "Show/Hide Field": "フィールドの表示/非表示", + "Sign Here": "ここに署名", + "Signature /Contents is not a single DER object followed by zero padding": "署名の/Contentsが、単一のDERオブジェクトとそれに続くゼロパディングになっていません", + "Signature Algorithm:": "署名アルゴリズム:", + "Signature Intact: Signer Identity Not Verified": "署名は無傷: 署名者の身元は未検証", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "署名フィールドはAcroFormの署名フィールドで、高度なPDFビューアーでのみ表示されます。", + "Signature has a missing or malformed /ByteRange": "署名の/ByteRangeがないか、形式が正しくありません", + "Signature scheme {{kind}} not implemented": "署名方式{{kind}}は実装されていません", + "Signature {{n}}": "署名{{n}}", + "Signatures": "署名", + "Signed By": "署名者", + "Signed On": "署名日時", + "Signed PDF Not Changed": "署名済みPDFに変更なし", + "Signed PDF downloaded successfully!": "署名済みPDFをダウンロードしました!", + "Signed PDF saved successfully!": "署名済みPDFを保存しました!", + "Simple (1, 2, 3)": "シンプル(1, 2, 3)", + "Simplify large color profiles": "大きなカラープロファイルを簡略化", + "Skew Threshold": "傾きのしきい値", + "Skip": "スキップ", + "Skip All": "すべてスキップ", + "Skip Remaining": "残りをスキップ", + "Skip this file": "このファイルをスキップ", + "Skipped: {{join}}.": "スキップしました: {{join}}。", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "ファイルは小さくなりますが、Firefox、MuPDF 1.26以降、Ghostscript 10.06以降など、Brotliに対応したリーダーでしか開けません。", + "Some files were skipped because they are not supported images.": "対応していない画像のファイルがあったため、一部のファイルをスキップしました。", + "Some files were skipped. Only BMP files are allowed.": "一部のファイルをスキップしました。BMPファイルのみ使用できます。", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "一部のファイルをスキップしました。HEIC/HEIFファイルのみ使用できます。", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "一部のファイルをスキップしました。JPG、JPEG、JP2、JPXファイルのみ使用できます。", + "Some files were skipped. Only PDF files are allowed.": "一部のファイルをスキップしました。PDFファイルのみ使用できます。", + "Some files were skipped. Only PNG images are allowed.": "一部のファイルをスキップしました。PNG画像のみ使用できます。", + "Some files were skipped. Only SVG graphics are allowed.": "一部のファイルをスキップしました。SVGグラフィックのみ使用できます。", + "Some files were skipped. Only TIFF files are allowed.": "一部のファイルをスキップしました。TIFFファイルのみ使用できます。", + "Some files were skipped. Only WebP images are allowed.": "一部のファイルをスキップしました。WebP画像のみ使用できます。", + "Some files were skipped. Only supported image formats are allowed.": "一部のファイルをスキップしました。対応している画像形式のみ使用できます。", + "Some files were skipped. Only text files are allowed.": "一部のファイルをスキップしました。テキストファイルのみ使用できます。", + "Some pages could not be processed. Please try again.": "一部のページを処理できませんでした。もう一度お試しください。", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "一部の墨消しマークを適用できなかったため、ファイルはダウンロードされませんでした。エディターで適用または削除してから、もう一度お試しください。", + "Spacing": "間隔", + "Split PDF": "PDFを分割", + "Split by Bookmarks": "しおりで分割", + "Split pages into tile grid for poster printing": "ポスター印刷用にページをタイルグリッドに分割", + "Split pages vertically or horizontally": "ページを縦または横に分割", + "Splitting PDF pages...": "PDFのページを分割しています...", + "Splitting PDF...": "PDFを分割しています...", + "Spreadsheets": "スプレッドシート", + "Standard (192 DPI)": "標準(192 DPI)", + "Standard Size": "標準サイズ", + "Standardize all pages to a target size": "すべてのページを指定サイズに統一", + "Standardizing pages...": "ページサイズを統一しています...", + "Stitch all pages into one continuous page": "すべてのページを1つの連続したページにつなげる", + "Straighten skewed PDF pages": "傾いたPDFのページをまっすぐにする", + "Strip all annotations": "すべての注釈を削除", + "Style": "スタイル", + "Style Changed": "スタイルを変更しました", + "Style changed ({{length}} regions)": "スタイルを変更しました({{length}}か所)", + "Subject": "件名", + "Subset embedded fonts": "埋め込みフォントをサブセット化", + "Success": "成功", + "Success!": "成功しました!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}}個のCSVファイルをPDFに変換しました。", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}}個のExcelファイルをPDFに変換しました。", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}}個のODTファイルをPDFに変換しました。", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}}個のPDFをDOCXに変換しました。", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}}個のPDFをMarkdownに変換しました。", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}}個のPDFを{{level}}に変換しました。", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}}個のPSDファイルを1つのPDFに変換しました。", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}}個のPowerPointファイルをPDFに変換しました。", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}}個のRTFファイルをPDFに変換しました。", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}}個のWord文書をPDFに変換しました。", + "Successfully converted {{length}} files to PDF.": "{{length}}個のファイルをPDFに変換しました。", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}}個の{{TOOL_NAME}}ファイルをPDFに変換しました。", + "Successfully converted {{name}} to DOCX.": "{{name}}をDOCXに変換しました。", + "Successfully converted {{name}} to Markdown.": "{{name}}をMarkdownに変換しました。", + "Successfully converted {{name}} to PDF.": "{{name}}をPDFに変換しました。", + "Successfully converted {{name}} to {{level}}.": "{{name}}を{{level}}に変換しました。", + "Successfully extracted PDF for AI/LLM use.": "AI/LLM向けにPDFを抽出しました。", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "AI/LLM向けに{{completed}}個のPDFを抽出しました。", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDFを{{dpi}} DPIでラスタライズしました。", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}}個のPDFを{{dpi}} DPIでラスタライズしました。", + "Supported: CBZ, CBR": "対応形式: CBZ、CBR", + "Supported: DOC, DOCX, ODT, RTF": "対応形式: DOC、DOCX、ODT、RTF", + "Supported: EML, MSG": "対応形式: EML、MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "対応形式: JPG、PNG、BMP、GIF、TIFF、WebP、HEIC、PSD、SVG、PNM、PGM、PBM、PPM、PAM、JXR、JPX、JP2", + "Supported: PPT, PPTX, ODP": "対応形式: PPT、PPTX、ODP", + "Supported: VSD, VSDX": "対応形式: VSD、VSDX", + "Supported: XLSX, XLS, ODS, CSV": "対応形式: XLSX、XLS、ODS、CSV", + "Supported: XPS, OXPS": "対応形式: XPS、OXPS", + "Switches apps": "アプリを切り替えます", + "Switches tabs": "タブを切り替えます", + "Table of Contents": "目次", + "Table {{n}} (Page {{page}})": "表{{n}}(ページ{{page}})", + "Tabloid": "タブロイド", + "Target Field": "対象フィールド", + "Target Kilobytes": "目標キロバイト", + "Target Not Reached": "目標に届きませんでした", + "Target Size": "目標サイズ", + "Technical Details": "技術的な詳細", + "Temperature": "色温度", + "Template \"{{name}}\" loaded.": "テンプレート「{{name}}」を読み込みました。", + "Template \"{{name}}\" saved.": "テンプレート「{{name}}」を保存しました。", + "Text": "テキスト", + "Text Color": "テキストの色", + "Text Files": "テキストファイル", + "Text color changed successfully!": "テキストの色を変更しました!", + "Text converted to PDF successfully!": "テキストをPDFに変換しました!", + "Text extracted successfully!": "テキストを抽出しました!", + "Text to PDF": "テキストからPDF", + "That password did not open any of the remaining files.": "そのパスワードでは、残りのどのファイルも開けませんでした。", + "The PDF file(s) do not contain any attachments to extract.": "PDFファイルには、抽出できる添付ファイルがありません。", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "このPDFは{{totalPages}}ページで、{{nValue}}で割り切れません。最後のPDFは{{remainder}}ページになります。", + "The PDF might be corrupted or password protected.": "PDFが破損しているか、パスワードで保護されている可能性があります。", + "The PDF might be corrupted or password-protected.": "PDFが破損しているか、パスワードで保護されている可能性があります。", + "The PDF might be corrupted.": "PDFが破損している可能性があります。", + "The PDF viewer is still initializing.": "PDFビューアーはまだ初期化中です。", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDFをダウンロードしましたが、次の手順を完了できませんでした: {{join}}。対象の内容がファイルに残っている可能性があります。", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URLが想定外のコンテンツタイプを返しました: {{contentType}}。JavaScriptファイルが必要です。", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "/ByteRangeで除外されたバイトが、16進エンコードされた署名と正確に一致しません", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "/ByteRangeで除外されたバイトが、この署名の/Contentsではありません", + "The compression engine returned an unreadable result.": "圧縮エンジンが読み取れない結果を返しました。", + "The compression engine stopped unexpectedly.": "圧縮エンジンが予期せず停止しました。", + "The current password you entered is incorrect. Please try again.": "入力した現在のパスワードが正しくありません。もう一度お試しください。", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "アップロードしたPDFに次のフィールド名がすでに存在します: {{conflictList}}。ダウンロードする前に、これらのフィールドの名前を変更してください。", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "次のフィールド名が複数回使われています: {{duplicateList}}。ダウンロードする前に、重複しない名前に変更してください。", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "指定されたページ数({{length}})が、ドキュメントの現在のページ数({{currentGridCount}})と一致しません。すべてのページについて完全な順序を指定してください。", + "The password you entered is incorrect. Please try again.": "入力したパスワードが正しくありません。もう一度お試しください。", + "The password you entered is wrong or the file is corrupted.": "入力したパスワードが間違っているか、ファイルが破損しています。", + "The provided file could not be loaded as an image. It may be corrupted.": "指定されたファイルを画像として読み込めませんでした。破損している可能性があります。", + "The requested OCR language is not available: {{unavailableText}}.": "指定されたOCR言語は利用できません: {{unavailableText}}。", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "指定されたページ順が不完全か、無効なページ番号が含まれています。元のすべてのページに新しい位置を指定してください。", + "These files are not valid PDFs, so they were not added: {{names}}.": "これらのファイルは有効なPDFではないため、追加されませんでした: {{names}}。", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "これらのファイルはパスワードで保護されています: {{names}}。ファイルカードにパスワードを入力するか、ファイルを削除してから、もう一度圧縮してください。", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "このBentoPDFのビルドには、{{availableText}}のOCRデータのみが含まれています。", + "This PDF does not contain any digital signatures.": "このPDFには電子署名がありません。", + "This PDF has no layers (OCG).": "このPDFにはレイヤー(OCG)がありません。", + "This PDF is password-protected. Please enter the current password to proceed.": "このPDFはパスワードで保護されています。続行するには現在のパスワードを入力してください。", + "This document contains pages with different dimensions:": "このドキュメントには、サイズの異なるページが含まれています:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "このドキュメントには、まだ適用されていない墨消しマークが 1 個あります。マークを適用するまで、その下の内容はファイルに残ります。すべてのマークを適用してダウンロードしますか?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "このドキュメントには、まだ適用されていない墨消しマークが {{count}} 個あります。マークを適用するまで、その下の内容はファイルに残ります。すべてのマークを適用してダウンロードしますか?", + "This feature requires {{name}} to be configured.": "この機能を使用するには {{name}} の設定が必要です。", + "This file is not a valid PDF.": "このファイルは有効なPDFではありません。", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "このモジュールはAGPL-3.0でライセンスされています。設定すると、そのライセンス条項に同意したことになります。", + "This tool has been disabled": "このツールは無効になっています", + "This tool is not available in your deployment. Contact your administrator for more information.": "このツールはお使いの環境では利用できません。詳細は管理者にお問い合わせください。", + "Threshold": "しきい値", + "Tile": "タイル", + "Tile Gap X": "タイル間隔 X", + "Tile Gap Y": "タイル間隔 Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "タイムスタンプ", + "Timestamp Failed": "タイムスタンプの付与に失敗しました", + "Tint": "色合い", + "Title": "タイトル", + "To actually fill or change the options, use our PDF Form Filler tool.": "実際に入力したり選択肢を変更したりするには、PDFフォーム入力ツールを使用してください。", + "Toggle": "切り替え", + "Toggle style": "スタイルを切り替え", + "Toggle sync scroll": "同期スクロールを切り替え", + "Tool Unavailable": "ツールは利用できません", + "Tooltip / Help Text": "ツールチップ / ヘルプテキスト", + "Top": "上", + "Top Center": "上中央", + "Top Left": "左上", + "Top Right": "右上", + "Top edge in points": "上端(ポイント)", + "Total Pages": "総ページ数", + "Transparent Background": "透明な背景", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "各画像についてJPEG 2000とJPEGを試し、小さいほうを残します。", + "Trim margins from all pages": "すべてのページの余白を削除", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "信頼性の検証: {{length}}件中{{trustVerified}}件の署名がカスタム証明書で検証されました", + "Trusted": "信頼済み", + "Trusted certificate loaded": "信頼済み証明書を読み込みました", + "Tsa Url": "TSA URL", + "Turns off quality, resolution and every other lossy image step.": "品質、解像度、その他すべての非可逆な画像処理をオフにします。", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URLはhttp://またはhttps://で始まる必要があります", + "Ultra (384 DPI)": "超高(384 DPI)", + "Unable to decrypt the PDF with the provided password.": "指定されたパスワードではPDFを復号化できません。", + "Unable to repair any of the uploaded PDF files.": "アップロードされたPDFファイルはどれも修復できませんでした。", + "Unembed standard fonts": "標準フォントの埋め込みを解除", + "Unembed standard-font look-alikes": "標準フォントに似たフォントの埋め込みを解除", + "Unexpected delimiter in content stream": "コンテンツストリームに予期しない区切り文字があります", + "Unexpected reply from the engine.": "エンジンから予期しない応答がありました。", + "Uniform": "均一", + "Unique Page Sizes": "ページサイズの種類", + "Unknown": "不明", + "Unknown error": "不明なエラー", + "Unknown error occurred in worker.": "ワーカーで不明なエラーが発生しました。", + "Unknown error occurred.": "不明なエラーが発生しました。", + "Unlock": "ロック解除", + "Unlock All": "すべてロック解除", + "Unlock Remaining ({{remaining}})": "残りをロック解除({{remaining}})", + "Unlocked": "ロック解除済み", + "Unlocked {{unlocked}} of {{length}} files.": "{{length}}個のファイルのうち{{unlocked}}個のロックを解除しました。", + "Unlocking...": "ロックを解除しています...", + "Unresolved optional content reference": "解決できないオプションコンテンツ参照", + "Unsupported ECDSA curve in signer certificate": "署名者の証明書のECDSA曲線は未対応です", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "未対応の画像です。透かしにはPNGまたはJPGを使用してください。", + "Unsupported digest OID {{digestOid}}": "未対応のダイジェストOID {{digestOid}}", + "Unsupported file type: .{{ext}}": "未対応のファイル形式: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "未対応の署名アルゴリズムOID {{oid}}", + "Unterminated array or dictionary in content stream": "コンテンツストリームの配列または辞書が閉じられていません", + "Unterminated hex string in content stream": "コンテンツストリームの16進文字列が閉じられていません", + "Unterminated inline image in content stream": "コンテンツストリームのインライン画像が閉じられていません", + "Unterminated string in content stream": "コンテンツストリームの文字列が閉じられていません", + "Unverified: Unsupported Signature Algorithm": "未検証: 未対応の署名アルゴリズム", + "Updating metadata...": "メタデータを更新しています...", + "Upload Certificate": "証明書をアップロード", + "Upload Comics": "コミックをアップロード", + "Upload Documents": "ドキュメントをアップロード", + "Upload EPUB Files": "EPUBファイルをアップロード", + "Upload Email Files": "メールファイルをアップロード", + "Upload FB2 Files": "FB2ファイルをアップロード", + "Upload Images": "画像をアップロード", + "Upload JSON Files": "JSONファイルをアップロード", + "Upload MOBI Files": "MOBIファイルをアップロード", + "Upload Markdown Files": "Markdownファイルをアップロード", + "Upload ODG Files": "ODGファイルをアップロード", + "Upload PDFs": "PDFをアップロード", + "Upload PUB Files": "PUBファイルをアップロード", + "Upload Pages Files": "Pagesファイルをアップロード", + "Upload Presentations": "プレゼンテーションをアップロード", + "Upload SVG Files": "SVGファイルをアップロード", + "Upload Spreadsheets": "スプレッドシートをアップロード", + "Upload Text Files": "テキストファイルをアップロード", + "Upload Visio Files": "Visioファイルをアップロード", + "Upload WPD Files": "WPDファイルをアップロード", + "Upload WPS Files": "WPSファイルをアップロード", + "Upload XML Files": "XMLファイルをアップロード", + "Upload XPS Files": "XPSファイルをアップロード", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "PDFをアップロードして「プレビューを生成」をクリックすると、小冊子のレイアウトが表示されます", + "Upload images and convert to PDF": "画像をアップロードしてPDFに変換", + "Upload one or more PDF files": "PDFファイルを1つ以上アップロード", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "大文字A-Z、数字0-9、および - . $ / + % スペース", + "Use same password for all files": "すべてのファイルに同じパスワードを使用", + "User Password": "ユーザーパスワード", + "VSD to PDF": "VSDからPDF", + "Valid From": "有効開始日", + "Valid Signature": "有効な署名", + "Valid Until": "有効期限", + "Validating {{n}} of {{length}}: {{name}}": "検証中 {{n}}/{{length}}: {{name}}", + "Validating...": "検証しています...", + "Value": "値", + "Value (e.g., Marketing)": "値(例: マーケティング)", + "Vertical": "垂直", + "Viewer not ready": "ビューアーの準備ができていません", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "ビューアーの準備ができていません。PDFをアップロードして、読み込みが完了するまでお待ちください。", + "Visibility": "表示設定", + "Visio Files": "Visioファイル", + "WPD to PDF": "WPDからPDF", + "WPS Files": "WPSファイル", + "WPS to PDF": "WPSからPDF", + "Watermark": "透かし", + "Watermark added successfully!": "透かしを追加しました!", + "Web Crypto API not available in this context": "このコンテキストではWeb Crypto APIを利用できません", + "Web Crypto import/verify failed: {{error}}": "Web Cryptoのインポート/検証に失敗しました: {{error}}", + "WebP": "WebP", + "Whitelist": "許可リスト", + "Width ({{unit}})": "幅({{unit}})", + "Word": "Word", + "Word Documents": "Word文書", + "Word to PDF": "WordからPDF", + "WordPerfect Files": "WordPerfectファイル", + "Worker crashed": "ワーカーがクラッシュしました", + "Worker error occurred. Check console for details.": "ワーカーでエラーが発生しました。詳細はコンソールを確認してください。", + "Workflow completed": "ワークフローが完了しました", + "Wrong password": "パスワードが間違っています", + "Wrong password for: {{join}}": "パスワードが間違っています: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "パスワードが間違っているか、「{{name}}」を復号化できませんでした。", + "X Position": "X位置", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XMLファイル", + "XML to PDF": "XMLからPDF", + "XMP Metadata": "XMPメタデータ", + "XPS Files": "XPSファイル", + "XPS to PDF": "XPSからPDF", + "Y Position": "Y位置", + "Year must be between 1900 and 2100": "年は1900から2100の間にしてください", + "Yellow": "黄", + "Yellowish": "黄みがかった色", + "You cannot delete the last page of the document.": "ドキュメントの最後のページは削除できません。", + "Your PDF has been cropped and the download has started.": "PDFをトリミングし、ダウンロードを開始しました。", + "Your PDF has been downloaded successfully.": "PDFをダウンロードしました。", + "Your PDF has been posterized.": "PDFをポスタライズしました。", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "墨消しはページに適用されますが、このファイルは暗号化されているため、BentoPDFはプロパティ、しおり、添付ファイルに残る墨消しテキストのコピーを削除できません。完全にクリーンアップするには、暗号化されていないコピーを墨消しし、あとでPDFを保護でパスワードを追加してください。それでもダウンロードしますか?", + "Your workflow needs at least one input node and one output node to run.": "ワークフローを実行するには、入力ノードと出力ノードがそれぞれ1つ以上必要です。", + "ZIP archive created successfully!": "ZIPアーカイブを作成しました!", + "Zoom(%)": "ズーム(%)", + "e.g. dd/mm/yyyy HH:MM:ss": "例: dd/mm/yyyy HH:MM:ss", + "form": "フォーム", + "https://example.com": "https://example.com", + "signature found": "件の署名が見つかりました", + "signatures found": "件の署名が見つかりました", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}}個のノード", + "{{count}} nodes": "{{count}}個のノード", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 ページ", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} ページ", + "{{length}} Files Need a Password": "{{length}}個のファイルにパスワードが必要です", + "{{length}} PDF file(s) selected": "{{length}}個のPDFファイルを選択中", + "{{length}} PDF files selected": "{{length}}個のPDFファイルを選択中", + "{{length}} attachment(s) extracted successfully!": "{{length}}個の添付ファイルを抽出しました!", + "{{length}} file • {{totalPages}} total pages": "{{length}}個のファイル • 合計{{totalPages}}ページ", + "{{length}} file(s) attached successfully.": "{{length}}個のファイルを添付しました。", + "{{length}} files • {{totalPages}} total pages": "{{length}}個のファイル • 合計{{totalPages}}ページ", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} パスワードで保護されていたため、圧縮後のコピーにはパスワードがありません。PDFを保護でもう一度設定してください。", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}}({{size}}、{{totalPageCount}}ページ)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}}は電子署名されているため、そのままにしました。圧縮すると署名が壊れます。それでも圧縮するには、カスタム設定でコンテンツ保護を無視をオンにしてください。署名は削除されます。", + "{{name}} is not a valid PDF, so it was not added.": "{{name}}は有効なPDFではないため、追加されませんでした。", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}}はパスワードで保護されています。ファイルカードにパスワードを入力してから、もう一度圧縮してください。", + "{{name}}... (p{{pageNumber}})": "{{name}}...(ページ{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • ページ数を読み込めませんでした", + "{{size}} • Loading pages...": "{{size}} • ページを読み込んでいます...", + "{{size}} • Loading...": "{{size}} • 読み込み中...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}}ページ", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}}ページ", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}}ページ", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}}ページ", + "{{size}} • {{value}} pages": "{{size}} • {{value}}ページ", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}}個のPDFを復号化しました。", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}}個のPDFをリニア化しました。", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}}ページ → 出力{{numSheets}}シート", + "{{validCount}} valid": "{{validCount}}件が有効", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 ページ", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} ページ" +} diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index f0f162e7..b389792a 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -9,7 +9,8 @@ "openMainMenu": "메인 메뉴 열기", "language": "언어", "searchLanguage": "언어 검색…", - "noLanguagesFound": "언어를 찾을 수 없습니다" + "noLanguagesFound": "언어를 찾을 수 없습니다", + "breadcrumb": "탐색 경로" }, "donation": { "message": "BentoPDF가 마음에 드셨나요? 무료 오픈소스로 유지될 수 있도록 도와주세요!", @@ -230,12 +231,16 @@ "buyMeCoffee": "커피 한 잔 사주기" }, "footer": { - "copyright": "© 2026 BentoPDF. All rights reserved.", + "copyright": "© 2026 BentoPDF. 모든 권리 보유.", "version": "버전", "company": "회사", "aboutUs": "소개", "faqLink": "FAQ", "contactUs": "문의하기", + "tools": "도구", + "pdfConverter": "PDF 변환기", + "pdfSecurity": "PDF 보안", + "mergeSplit": "PDF 병합 및 분할", "legal": "법적 고지", "termsAndConditions": "이용약관", "privacyPolicy": "개인정보처리방침", diff --git a/public/locales/ko/tools.json b/public/locales/ko/tools.json index d7d4d81d..12828b1b 100644 --- a/public/locales/ko/tools.json +++ b/public/locales/ko/tools.json @@ -27,7 +27,22 @@ "name": "PDF 병합", "subtitle": "여러 PDF를 하나로 합칩니다. 북마크도 유지됩니다.", "retainPageLabels": "각 파일의 원래 페이지 레이블 유지", - "retainPageLabelsHint": "꺼짐(기본): 병합된 PDF는 1–N의 자연스러운 페이지 번호를 사용합니다. 켜짐: 각 파일의 원래 페이지 레이블이 유지됩니다(중복 레이블이 발생할 수 있음)." + "retainPageLabelsHint": "꺼짐(기본): 병합된 PDF는 1–N의 자연스러운 페이지 번호를 사용합니다. 켜짐: 각 파일의 원래 페이지 레이블이 유지됩니다(중복 레이블이 발생할 수 있음).", + "removeDuplicateFonts": "중복 글꼴 제거", + "alert": { + "thumbnailError": "페이지 썸네일을 렌더링하지 못했습니다", + "noSelection": "병합할 파일이나 페이지가 선택되지 않았습니다.", + "mergeSuccess": "PDF가 병합되었습니다!", + "mergeFailed": "PDF를 병합하지 못했습니다.", + "mergeError": "PDF를 병합하지 못했습니다. 모든 파일이 유효하고 비밀번호로 보호되어 있지 않은지 확인하세요.", + "workerError": "병합 작업자에서 예기치 않은 오류가 발생했습니다.", + "loadError": "하나 이상의 PDF 파일을 불러오지 못했습니다" + }, + "loader": { + "renderingPreviews": "페이지 미리보기 렌더링 중...", + "merging": "PDF 병합 중...", + "loadingDocuments": "PDF 문서 불러오는 중..." + } }, "splitPdf": { "name": "PDF 분할", @@ -91,7 +106,7 @@ "tipRedoZ": "다시 실행 (⇧⌘Z)", "tipFileDetails": "파일 정보", "tipEditExistingContent": "기존 콘텐츠 편집", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "편집 도구가 적용되는 대상 — 복잡한 페이지에서는 범위를 좁히세요", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "편집 도구가 적용되는 대상: 복잡한 페이지에서는 범위를 좁히세요", "tipClickThePageToAddATextBox": "페이지를 클릭해 텍스트 상자를 추가하세요", "tipSpellCheckLanguage": "맞춤법 검사 언어", "tipFindAndReplace": "찾기 및 바꾸기", @@ -503,7 +518,8 @@ "noFile": "파일 없음", "noFileExplanation": "먼저 PDF 파일을 업로드하세요.", "conversionSuccess": "PDF가 TIFF로 변환되었습니다!", - "conversionError": "PDF를 TIFF로 변환하지 못했습니다. 파일이 손상되었을 수 있습니다." + "conversionError": "PDF를 TIFF로 변환하지 못했습니다. 파일이 손상되었을 수 있습니다.", + "conversionOutOfMemory": "변환 중 브라우저의 메모리가 부족합니다. DPI를 낮추거나 다중 페이지 TIFF 옵션을 해제하여 페이지를 하나씩 변환해 보세요." } }, "pdfToCbz": { @@ -990,8 +1006,7 @@ "subtitle": "PDF에서 텍스트를 추출하여 텍스트 파일(.txt)로 저장합니다. 여러 파일 지원.", "noteLabel": "참고:", "noteText": "이 도구는 디지털로 만든 PDF에서만 작동합니다. 스캔된 문서나 이미지 기반 PDF의 경우 OCR PDF 도구를 사용하세요.", - "convertButton": "텍스트 추출", - "note": "이 도구는 디지털로 생성된 PDF에서만 작동합니다. 스캔 문서나 이미지 기반 PDF는 OCR PDF 도구를 사용해 주세요." + "convertButton": "텍스트 추출" }, "digitalSignPdf": { "name": "PDF 디지털 서명", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "물론입니다! 모든 처리는 브라우저에서 이루어집니다. 파일이 기기를 떠나지 않아 완전한 개인정보 보호가 보장됩니다." }, "unlockPdf": { - "name": "PDF 복호화", + "name": "PDF 잠금 해제", "subtitle": "비밀번호를 제거하여 PDF 잠금을 해제합니다." }, "protectPdf": { - "name": "PDF 암호화", + "name": "PDF 보호", "subtitle": "비밀번호를 설정하여 PDF를 보호합니다." } } diff --git a/public/locales/ko/ui.json b/public/locales/ko/ui.json new file mode 100644 index 00000000..b24c1f56 --- /dev/null +++ b/public/locales/ko/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(수정됨)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}}개 더...", + "- Error parsing XMP XML. Displaying raw. -": "- XMP XML을 분석하는 중 오류가 발생했습니다. 원본을 표시합니다. -", + "- No Info Dictionary data found -": "- 정보 사전 데이터를 찾을 수 없습니다 -", + "- No XMP metadata found -": "- XMP 메타데이터를 찾을 수 없습니다 -", + "- No interactive form fields found -": "- 대화형 양식 필드를 찾을 수 없습니다 -", + "- No parseable XMP properties found -": "- 분석 가능한 XMP 속성을 찾을 수 없습니다 -", + "-- Select existing group --": "-- 기존 그룹 선택 --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1° (매우 민감)", + "0.5° (Default)": "0.5° (기본값)", + "1.0° (Normal)": "1.0° (보통)", + "100 (Fast)": "100 (빠름)", + "150 (Default)": "150 (기본값)", + "1x2 (Booklet)": "1x2 (소책자)", + "2.0° (Less Sensitive)": "2.0° (덜 민감)", + "200 (Better)": "200 (더 좋음)", + "200 (Good)": "200 (좋음)", + "2x2 (4-up)": "2x2 (4-up)", + "2x4 (8-up)": "2x4 (8-up)", + "300 (Best Quality)": "300 (최고 품질)", + "300 (Print)": "300 (인쇄용)", + "4x4 (16-up)": "4x4 (16-up)", + "600 (High Quality)": "600 (고품질)", + "72 (Screen)": "72 (화면용)", + "90° Clockwise": "시계 방향 90°", + "90° Counter-clockwise": "반시계 방향 90°", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "\"{{fieldName}}\" 이름의 필드가 이미 있습니다. 다운로드하기 전에 이 필드의 이름을 고유한 이름으로 바꿔 주세요.", + "A new version of BentoPDF is available. Reload to update?": "BentoPDF의 새 버전이 있습니다. 새로고침하여 업데이트할까요?", + "A single PDF file": "단일 PDF 파일", + "A template with this name already exists.": "같은 이름의 템플릿이 이미 있습니다.", + "ASCII characters (letters, numbers, symbols)": "ASCII 문자 (영문자, 숫자, 기호)", + "Action": "동작", + "Add Blank Page": "빈 페이지 추가", + "Add Bookmark": "북마크 추가", + "Add Child Bookmark": "하위 북마크 추가", + "Add Child Layer": "하위 레이어 추가", + "Add More Comics": "만화 더 추가", + "Add More Documents": "문서 더 추가", + "Add More EPUB Files": "EPUB 파일 더 추가", + "Add More Email Files": "이메일 파일 더 추가", + "Add More FB2 Files": "FB2 파일 더 추가", + "Add More Files": "파일 더 추가", + "Add More Images": "이미지 더 추가", + "Add More JSON Files": "JSON 파일 더 추가", + "Add More MOBI Files": "MOBI 파일 더 추가", + "Add More Markdown Files": "Markdown 파일 더 추가", + "Add More ODG Files": "ODG 파일 더 추가", + "Add More PUB Files": "PUB 파일 더 추가", + "Add More Pages Files": "Pages 파일 더 추가", + "Add More Presentations": "프레젠테이션 더 추가", + "Add More SVG Files": "SVG 파일 더 추가", + "Add More Spreadsheets": "스프레드시트 더 추가", + "Add More Text Files": "텍스트 파일 더 추가", + "Add More Visio Files": "Visio 파일 더 추가", + "Add More WPD Files": "WPD 파일 더 추가", + "Add More WPS Files": "WPS 파일 더 추가", + "Add More XML Files": "XML 파일 더 추가", + "Add More XPS Files": "XPS 파일 더 추가", + "Add a new layer to get started!": "새 레이어를 추가해서 시작해 보세요!", + "Add a text box": "텍스트 상자 추가", + "Add an RFC 3161 document timestamp": "RFC 3161 문서 타임스탬프 추가", + "Add an image": "이미지 추가", + "Add at least one node to run the workflow.": "워크플로우를 실행하려면 노드를 하나 이상 추가하세요.", + "Add child": "하위 항목 추가", + "Add child layer": "하위 레이어 추가", + "Add header and footer text": "머리글 및 바닥글 텍스트 추가", + "Add page numbers": "페이지 번호 추가", + "Add searchable text layer via OCR": "OCR로 검색 가능한 텍스트 레이어 추가", + "Add text watermark": "텍스트 워터마크 추가", + "Add/Edit/Extract Attachments": "첨부파일 추가/편집/추출", + "Added": "추가됨", + "Added \"{{afterText}}\"": "\"{{afterText}}\" 추가됨", + "Added image ({{width}}×{{height}})": "이미지 추가됨 ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "빈 페이지 {{insertCount}}개를 추가했습니다!", + "Added {{insertCount}} blank pages successfully!": "빈 페이지 {{insertCount}}개를 추가했습니다!", + "Adding header & footer...": "머리글 및 바닥글 추가 중...", + "Adding page numbers...": "페이지 번호 추가 중...", + "Adding watermark...": "워터마크 추가 중...", + "Adding {{insertCount}} blank page...": "빈 페이지 {{insertCount}}개 추가 중...", + "Adding {{insertCount}} blank pages...": "빈 페이지 {{insertCount}}개 추가 중...", + "Adding {{name}} ({{n}}/{{length}})...": "{{name}} 추가 중 ({{n}}/{{length}})...", + "Adjust Colors": "색상 조정", + "Adjust brightness, contrast, and colors": "밝기, 대비, 색상 조정", + "Advanced": "고급", + "Advanced Feature Required": "고급 기능 필요", + "Advanced Settings": "고급 설정", + "After Page": "페이지 뒤", + "After Page...": "페이지 뒤...", + "Align Objects": "개체 정렬", + "Alignment": "정렬", + "All": "전체", + "All files repaired successfully!": "모든 파일을 복구했습니다!", + "Alternate Merge": "교차 병합", + "Alternating and mixing pages...": "페이지를 교차하여 섞는 중...", + "Always resample to that resolution": "항상 해당 해상도로 리샘플링", + "An error occurred during compression. Error: {{error}}": "압축하는 중 오류가 발생했습니다. 오류: {{error}}", + "An error occurred during conversion. Error: {{error}}": "변환하는 중 오류가 발생했습니다. 오류: {{error}}", + "An error occurred during conversion. Error: {{message}}": "변환하는 중 오류가 발생했습니다. 오류: {{message}}", + "An error occurred during cropping.": "자르는 중 오류가 발생했습니다.", + "An error occurred during extraction. Error: {{error}}": "추출하는 중 오류가 발생했습니다. 오류: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "래스터화하는 중 오류가 발생했습니다. 오류: {{error}}", + "An error occurred during sanitization: {{msg}}": "정리하는 중 오류가 발생했습니다: {{msg}}", + "An error occurred while combining pages.": "페이지를 합치는 중 오류가 발생했습니다.", + "An error occurred while creating the N-Up PDF.": "N-Up PDF를 만드는 중 오류가 발생했습니다.", + "An error occurred while creating the booklet.": "소책자를 만드는 중 오류가 발생했습니다.", + "An error occurred while dividing the PDF.": "PDF를 분할하는 중 오류가 발생했습니다.", + "An error occurred while mixing the PDFs.": "PDF를 섞는 중 오류가 발생했습니다.", + "An error occurred while standardizing pages.": "페이지 크기를 통일하는 중 오류가 발생했습니다.", + "An error occurred while trying to remove metadata.": "메타데이터를 제거하는 중 오류가 발생했습니다.", + "An error occurred: {{error}}": "오류가 발생했습니다: {{error}}", + "An error occurred: {{error}}.": "오류가 발생했습니다: {{error}}.", + "An owner password is required when setting permissions": "권한을 설정하려면 소유자 비밀번호가 필요합니다", + "An unexpected error occurred during the repair process.": "복구 중 예기치 않은 오류가 발생했습니다.", + "An unexpected error occurred.": "예기치 않은 오류가 발생했습니다.", + "Analyzing data structure...": "데이터 구조 분석 중...", + "Analyzing full PDF metadata...": "전체 PDF 메타데이터 분석 중...", + "Analyzing signatures...": "서명 분석 중...", + "Angle": "각도", + "Annotations removed successfully!": "주석을 제거했습니다!", + "Any text, URL, or data": "모든 텍스트, URL 또는 데이터", + "Application": "응용 프로그램", + "Apply a digital signature to PDF": "PDF에 디지털 서명 적용", + "Apply and download": "적용 후 다운로드", + "Apply redactions?": "교정을 적용할까요?", + "Apply scanner simulation effect": "스캐너 시뮬레이션 효과 적용", + "Applying Bates numbers...": "베이츠 번호 적용 중...", + "Applying color adjustments...": "색상 조정 적용 중...", + "Applying crop...": "자르기 적용 중...", + "Applying redactions...": "교정 적용 중...", + "Applying rotations...": "회전 적용 중...", + "Applying scanner effect...": "스캐너 효과 적용 중...", + "Applying timestamp...": "타임스탬프 적용 중...", + "Applying {{replace}}...": "{{replace}} 적용 중...", + "Archive contains an oversized image entry.": "압축 파일에 크기가 너무 큰 이미지 항목이 있습니다.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "압축 파일에 이미지가 너무 많습니다 (최대 {{MAX_CBZ_PAGES}}개).", + "Archive is too large when decompressed.": "압축을 풀면 크기가 너무 큽니다.", + "Are you sure you want to reset? All your work will be lost.": "정말 초기화하시겠습니까? 모든 작업 내용이 사라집니다.", + "Area (Coordinates)": "영역 (좌표)", + "Area ({{unit}}²)": "영역 ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman, Courier New는 내장된 동등 글꼴로 대체됩니다. 안전한 경우에만 적용됩니다.", + "Arrange multiple pages per sheet": "한 장에 여러 페이지 배치", + "Arrange pages for booklet printing": "소책자 인쇄용으로 페이지 배열", + "Aspect Ratio": "가로세로 비율", + "At least one PDF document is required for export.": "내보내려면 PDF 문서가 하나 이상 필요합니다.", + "At least two valid PDFs are required.": "올바른 PDF가 두 개 이상 필요합니다.", + "Attaching files to PDF...": "PDF에 파일 첨부 중...", + "Attachments updated successfully!": "첨부파일을 업데이트했습니다!", + "Author": "작성자", + "Auto (Keep Original)": "자동 (원본 유지)", + "Back": "뒷면", + "Back to Home": "홈으로 돌아가기", + "Background Color": "배경색", + "Background color changed successfully!": "배경색을 변경했습니다!", + "Barcode": "바코드", + "Barcode Format": "바코드 형식", + "Barcode Value": "바코드 값", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "베이츠 번호를 적용했습니다! ({{batesStart}}부터 {{n}}까지)", + "Beginning": "처음", + "Binarize": "이진화", + "Blank Position": "빈 페이지 위치", + "Blue": "파란색", + "Blur": "흐림", + "Bold": "굵게", + "Bold & Italic": "굵게 및 기울임꼴", + "Booklet": "소책자", + "Booklet created with {{numSheets}} sheets!": "{{numSheets}}장으로 소책자를 만들었습니다!", + "Bookmarks imported from JSON!": "JSON에서 북마크를 가져왔습니다!", + "Bookmarks page": "북마크 페이지", + "Border": "테두리", + "Border Color": "테두리 색상", + "Bottom": "아래", + "Bottom Center": "아래 가운데", + "Bottom Left": "아래 왼쪽", + "Bottom Right": "아래 오른쪽", + "Bottom edge in points": "아래쪽 여백 (포인트)", + "Brightness": "밝기", + "Brotli and rasterizing were skipped to keep it PDF/A.": "PDF/A를 유지하기 위해 Brotli와 래스터화는 건너뛰었습니다.", + "Brotli compression (PDF 2.0)": "Brotli 압축 (PDF 2.0)", + "Browser Note:": "브라우저 참고:", + "Building new PDF...": "새 PDF 만드는 중...", + "Building page pairing model...": "페이지 짝 모델 구성 중...", + "Button": "버튼", + "ByteRange does not start at the beginning of the file": "ByteRange가 파일의 시작 부분에서 시작하지 않습니다", + "ByteRange out of bounds": "ByteRange가 범위를 벗어났습니다", + "CBZ to PDF": "CBZ를 PDF로", + "CSV Loaded": "CSV를 불러왔습니다", + "CSV file is empty": "CSV 파일이 비어 있습니다", + "Cancel": "취소", + "Cannot Delete": "삭제할 수 없음", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "뷰어 컨트롤에 접근할 수 없습니다. 위쪽 PDF 뷰어 도구 모음의 다운로드 버튼을 사용해 주세요.", + "Cannot delete all pages": "모든 페이지를 삭제할 수 없습니다", + "Cannot delete all pages.": "모든 페이지를 삭제할 수 없습니다.", + "Canvas context failed": "캔버스 컨텍스트 생성에 실패했습니다", + "Canvas context unavailable": "캔버스 컨텍스트를 사용할 수 없습니다", + "Canvas toBlob conversion failed.": "캔버스 toBlob 변환에 실패했습니다.", + "Canvas toBlob failed": "캔버스 toBlob에 실패했습니다", + "Center": "가운데", + "Certificate (.pfx, .p12, .pem)": "인증서 (.pfx, .p12, .pem)", + "Certificate Expired": "인증서 만료됨", + "Certificate Password": "인증서 비밀번호", + "Certificate unlocked": "인증서 잠금 해제됨", + "Change Certificate": "인증서 변경", + "Change background color": "배경색 변경", + "Changing background color...": "배경색 변경 중...", + "Changing text color...": "텍스트 색상 변경 중...", + "Character": "문자", + "Checked State": "선택 상태", + "Choose a valid page range.": "올바른 페이지 범위를 선택하세요.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "내장된 언어 중에서 선택하거나, 누락된 언어를 --ocr-languages에 추가하여 에어갭 번들을 다시 빌드하세요.", + "Cleanup": "정리", + "Click on PDF to Pick Location": "PDF를 클릭하여 위치 선택", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "위 버튼을 클릭한 다음, 북마크가 이동할 PDF 위치를 클릭하세요", + "Click to Upload Image": "클릭하여 이미지 업로드", + "Clicking this field in the PDF will open a file picker to upload an image.": "PDF에서 이 필드를 클릭하면 이미지를 업로드할 파일 선택 창이 열립니다.", + "Clip invisible parts of images": "이미지의 보이지 않는 부분 잘라내기", + "Close": "닫기", + "Close (Esc)": "닫기 (Esc)", + "Close panel": "패널 닫기", + "Closes tab": "탭을 닫습니다", + "Closes window": "창을 닫습니다", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (북마크 및 메타데이터)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF가 설정되지 않았습니다. WASM 설정에서 설정해 주세요.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF가 빈 복호화 파일을 만들었습니다.", + "CoherentPDF: not configured.": "CoherentPDF: 설정되지 않았습니다.", + "Color": "색상", + "Color adjustments applied successfully!": "색상 조정을 적용했습니다!", + "Colors inverted successfully!": "색상을 반전했습니다!", + "Cols": "열", + "Combine multiple PDFs into one": "여러 PDF를 하나로 합치기", + "Combine to Single Page": "한 페이지로 합치기", + "Combining pages...": "페이지 합치는 중...", + "Comic Archives": "만화 압축 파일", + "Comments and markup become part of the page. Form fields and links keep working.": "댓글과 마크업이 페이지의 일부가 됩니다. 양식 필드와 링크는 계속 작동합니다.", + "Complete": "완료", + "Complete!": "완료!", + "Compress": "압축", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "PDF {{compressedCount}}개를 압축했습니다. 전체 크기가 {{totalOriginalSize}}에서 {{totalCompressedSize}}(으)로 줄었습니다 ({{value}}% 절약).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "PDF {{compressedCount}}개를 압축했습니다. 전체 크기: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "여러 PDF 압축 중...", + "Compressing to {{size}}...": "{{size}}(으)로 압축 중...", + "Compressing {{n}}/{{length}}: {{name}}...": "압축 중 {{n}}/{{length}}: {{name}}...", + "Compressing...": "압축 중...", + "Compression Complete": "압축 완료", + "Compression Finished": "압축 완료", + "Compression Level": "압축 수준", + "Configure": "설정", + "Confirm": "확인", + "Confirm Action": "작업 확인", + "Conformance": "준수 규격", + "Connected": "연결됨", + "Contact Info": "연락처 정보", + "Content": "내용", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "콘텐츠 해시가 messageDigest 속성과 일치하지 않습니다. 서명 후 PDF가 수정되었습니다", + "Contrast": "대비", + "Conversion Complete": "변환 완료", + "Conversion Error": "변환 오류", + "Conversion engine ready!": "변환 엔진이 준비되었습니다!", + "Conversion failed: could not create PDF/A definition": "변환 실패: PDF/A 정의를 만들 수 없습니다", + "Convert Apple Pages documents to PDF": "Apple Pages 문서를 PDF로 변환", + "Convert EPUB ebooks to PDF": "EPUB 전자책을 PDF로 변환", + "Convert Excel spreadsheets to PDF": "Excel 스프레드시트를 PDF로 변환", + "Convert FB2 e-books to PDF": "FB2 전자책을 PDF로 변환", + "Convert JSON files to PDF": "JSON 파일을 PDF로 변환", + "Convert MOBI e-books to PDF": "MOBI 전자책을 PDF로 변환", + "Convert Markdown files to PDF": "Markdown 파일을 PDF로 변환", + "Convert Microsoft Publisher to PDF": "Microsoft Publisher를 PDF로 변환", + "Convert OpenDocument Graphics to PDF": "OpenDocument 그래픽을 PDF로 변환", + "Convert PDF pages to SVG": "PDF 페이지를 SVG로 변환", + "Convert PDF pages to images (ZIP)": "PDF 페이지를 이미지(ZIP)로 변환", + "Convert PDF tables to CSV": "PDF 표를 CSV로 변환", + "Convert PDF tables to Excel": "PDF 표를 Excel로 변환", + "Convert PDF to Markdown text": "PDF를 Markdown 텍스트로 변환", + "Convert PDF to PDF/A for archiving": "보관용으로 PDF를 PDF/A로 변환", + "Convert PDF to Word document": "PDF를 Word 문서로 변환", + "Convert PowerPoint presentations to PDF": "PowerPoint 프레젠테이션을 PDF로 변환", + "Convert SVG files to PDF": "SVG 파일을 PDF로 변환", + "Convert To Grayscale": "흑백으로 변환", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Visio 다이어그램(VSD/VSDX)을 PDF로 변환", + "Convert WPS Office documents to PDF": "WPS Office 문서를 PDF로 변환", + "Convert Word documents to PDF": "Word 문서를 PDF로 변환", + "Convert WordPerfect documents to PDF": "WordPerfect 문서를 PDF로 변환", + "Convert XML documents to PDF": "XML 문서를 PDF로 변환", + "Convert XPS/OXPS documents to PDF": "XPS/OXPS 문서를 PDF로 변환", + "Convert comic book archives (CBZ/CBR) to PDF": "만화책 압축 파일(CBZ/CBR)을 PDF로 변환", + "Convert email files (.eml, .msg) to PDF": "이메일 파일(.eml, .msg)을 PDF로 변환", + "Convert fonts to vector outlines": "폰트를 벡터 윤곽선으로 변환", + "Convert plain text to PDF": "일반 텍스트를 PDF로 변환", + "Convert to grayscale": "흑백으로 변환", + "Convert to greyscale": "흑백으로 변환", + "Convert to image-based PDF": "이미지 기반 PDF로 변환", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "파일 {{length}}개({{totalPages}}페이지)를 SVG로 변환했습니다!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}}페이지를 SVG로 변환했습니다!", + "Converter not initialized": "변환기가 초기화되지 않았습니다", + "Converting BMP to PDF...": "BMP를 PDF로 변환 중...", + "Converting HEIC to PDF...": "HEIC를 PDF로 변환 중...", + "Converting TIFF to PDF...": "TIFF를 PDF로 변환 중...", + "Converting emails...": "이메일 변환 중...", + "Converting files...": "파일 변환 중...", + "Converting fonts to outlines...": "폰트를 윤곽선으로 변환 중...", + "Converting images to PDF...": "이미지를 PDF로 변환 중...", + "Converting multiple PDFs to PDF/A...": "여러 PDF를 PDF/A로 변환 중...", + "Converting multiple RTF files to PDF...": "여러 RTF 파일을 PDF로 변환 중...", + "Converting multiple files...": "여러 파일 변환 중...", + "Converting page {{n}} of {{pageCount}}...": "{{n}}/{{pageCount}}페이지 변환 중...", + "Converting to Markdown...": "Markdown으로 변환 중...", + "Converting to SVG...": "SVG로 변환 중...", + "Converting to greyscale...": "흑백으로 변환 중...", + "Converting to {{level}}...": "{{level}}(으)로 변환 중...", + "Converting {{name}}...": "{{name}} 변환 중...", + "Converting {{n}}/{{length}}: {{name}}...": "변환 중 {{n}}/{{length}}: {{name}}...", + "Converting...": "변환 중...", + "Copied": "복사됨", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "스탬프가 찍힌 PDF 내보내기 기능에 접근할 수 없습니다. 대신 뷰어 도구 모음의 내보내기 → PDF 버튼을 사용해 주세요.", + "Could not add blank page.": "빈 페이지를 추가할 수 없습니다.", + "Could not add blank pages.": "빈 페이지를 추가할 수 없습니다.", + "Could not add header or footer.": "머리글 또는 바닥글을 추가할 수 없습니다.", + "Could not add page numbers.": "페이지 번호를 추가할 수 없습니다.", + "Could not add the watermark.": "워터마크를 추가할 수 없습니다.", + "Could not apply rotations.": "회전을 적용할 수 없습니다.", + "Could not change text color.": "텍스트 색상을 변경할 수 없습니다.", + "Could not change the background color.": "배경색을 변경할 수 없습니다.", + "Could not create ZIP archive.": "ZIP 압축 파일을 만들 수 없습니다.", + "Could not create canvas context.": "캔버스 컨텍스트를 만들 수 없습니다.", + "Could not create comparison canvas context.": "비교용 캔버스 컨텍스트를 만들 수 없습니다.", + "Could not create offscreen comparison canvas.": "오프스크린 비교 캔버스를 만들 수 없습니다.", + "Could not create visual diff context.": "시각적 차이 컨텍스트를 만들 수 없습니다.", + "Could not create visual diff overlay context.": "시각적 차이 오버레이 컨텍스트를 만들 수 없습니다.", + "Could not detect blank pages.": "빈 페이지를 감지할 수 없습니다.", + "Could not display the page.": "페이지를 표시할 수 없습니다.", + "Could not export comparison PDF.": "비교 PDF를 내보낼 수 없습니다.", + "Could not export the signed PDF. Please try again.": "서명된 PDF를 내보낼 수 없습니다. 다시 시도해 주세요.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "스탬프가 찍힌 PDF를 내보낼 수 없습니다. 대신 뷰어 도구 모음의 내보내기 → PDF 버튼을 사용해 주세요.", + "Could not extract signer public key": "서명자의 공개 키를 추출할 수 없습니다", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "지정한 URL에서 {{testFile}}을(를) 찾을 수 없습니다 (HTTP {{status}}). 파일이 있는지 확인해 주세요.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "PDF를 완전히 분석할 수 없습니다. 파일이 손상되었거나 구조가 특이할 수 있습니다.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "미리보기를 생성할 수 없습니다. 파일이 손상되었거나 지원되지 않는 기능이 포함되어 있을 수 있습니다. 오류: {{message}}", + "Could not get canvas context": "캔버스 컨텍스트를 가져올 수 없습니다", + "Could not invert PDF colors.": "PDF 색상을 반전할 수 없습니다.", + "Could not load PDF. It may be corrupt or password-protected.": "PDF를 불러올 수 없습니다. 파일이 손상되었거나 비밀번호로 보호되어 있을 수 있습니다.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "PDF를 불러올 수 없습니다. 파일이 올바르지 않거나, 손상되었거나, 비밀번호로 보호되어 있을 수 있습니다.", + "Could not load the PDF engine. Please refresh the page and try again.": "PDF 엔진을 불러올 수 없습니다. 페이지를 새로고침한 후 다시 시도해 주세요.", + "Could not parse signer info": "서명자 정보를 분석할 수 없습니다", + "Could not posterize the PDF.": "PDF를 포스터화할 수 없습니다.", + "Could not process \"{{name}}\". The file may be corrupted.": "\"{{name}}\" 파일을 처리할 수 없습니다. 파일이 손상되었을 수 있습니다.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "파일 크기를 더 이상 줄일 수 없습니다. 원본: {{originalSize}}, 결과: {{compressedSize}}.", + "Could not remove annotations.": "주석을 제거할 수 없습니다.", + "Could not remove blank pages.": "빈 페이지를 제거할 수 없습니다.", + "Could not remove leftover data from the PDF.": "PDF에서 남은 데이터를 제거할 수 없습니다.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "문서 데이터에서 교정된 텍스트를 제거할 수 없어 파일을 다운로드하지 않았습니다.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "PDF 페이지를 역순으로 정렬할 수 없습니다. 파일이 올바른 PDF인지 확인해 주세요.", + "Could not update metadata. Please check that date formats are correct.": "메타데이터를 업데이트할 수 없습니다. 날짜 형식이 올바른지 확인해 주세요.", + "Count": "개수", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "만든 날짜", + "Creating Booklet...": "소책자 만드는 중...", + "Creating Excel file...": "Excel 파일 만드는 중...", + "Creating N-Up PDF...": "N-Up PDF 만드는 중...", + "Creating PDF from JPGs...": "JPG로 PDF 만드는 중...", + "Creating PDF from SVG files...": "SVG 파일로 PDF 만드는 중...", + "Creating PDF...": "PDF 만드는 중...", + "Creating ZIP archive...": "ZIP 압축 파일 만드는 중...", + "Creating ZIP file...": "ZIP 파일 만드는 중...", + "Creating ZIP...": "ZIP 만드는 중...", + "Creating table...": "표 만드는 중...", + "Creator": "제작 프로그램", + "Crop": "자르기", + "Crop complete! Your download has started.": "자르기가 완료되었습니다! 다운로드가 시작되었습니다.", + "Cryptographic verification failed": "암호화 검증에 실패했습니다", + "Custom": "사용자 지정", + "Custom Format": "사용자 지정 형식", + "Custom Height": "사용자 지정 높이", + "Custom Units": "사용자 지정 단위", + "Custom Width": "사용자 지정 너비", + "Custom Zoom": "사용자 지정 확대/축소", + "Custom...": "사용자 지정...", + "DataMatrix": "DataMatrix", + "Date Format": "날짜 형식", + "Decrease size": "크기 줄이기", + "Decrypt": "복호화", + "Decrypting PDF...": "PDF 복호화 중...", + "Decrypting {{name}} ({{n}}/{{length}})...": "{{name}} 복호화 중 ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "{{length}}개 중 {{n}}번째 복호화 중: {{name}}", + "Decrypting...": "복호화 중...", + "Decryption Failed": "복호화 실패", + "Delete": "삭제", + "Delete \"{{title}}\"?": "\"{{title}}\"을(를) 삭제할까요?", + "Delete Field": "필드 삭제", + "Delete Page": "페이지 삭제", + "Delete Pages": "페이지 삭제", + "Delete all {{length}} bookmark(s) ? ": "북마크 {{length}}개를 모두 삭제할까요? ", + "Delete layer": "레이어 삭제", + "Delete {{size}} bookmark(s) ? ": "북마크 {{size}}개를 삭제할까요? ", + "Deleted": "삭제됨", + "Deleted {{size}} page(s) successfully!": "페이지 {{size}}개를 삭제했습니다!", + "Deleting pages...": "페이지 삭제 중...", + "Description": "설명", + "Description for screen readers": "스크린 리더용 설명", + "Deselect All": "모두 선택 해제", + "Deskew": "기울기 보정", + "Deskew PDF": "PDF 기울기 보정", + "Deskewed {{length}} file(s). {{value}}": "파일 {{length}}개의 기울기를 보정했습니다. {{value}}", + "Deskewing {{name}}...": "{{name}} 기울기 보정 중...", + "Destination": "대상", + "Detecting blank pages...": "빈 페이지 감지 중...", + "Digest Algorithm:": "다이제스트 알고리즘:", + "Digital Sign": "디지털 서명", + "Direction": "방향", + "Divide Pages": "페이지 분할", + "Divide into boxes (0 to disable)": "상자로 나누기 (0이면 사용 안 함)", + "Document Properties": "문서 속성", + "Document Type": "문서 유형", + "Document properties": "문서 속성", + "Document-level attachment": "문서 수준 첨부파일", + "Done: back to tools": "완료, 도구로 돌아가기", + "Download": "다운로드", + "Download Edited PDF": "편집한 PDF 다운로드", + "Download anyway": "그래도 다운로드", + "Download as PDF or ZIP automatically": "PDF 또는 ZIP으로 자동 다운로드", + "Downloaded {{length}} PDF files in a ZIP archive.": "PDF 파일 {{length}}개를 ZIP 압축 파일로 다운로드했습니다.", + "Downloads started for all files.": "모든 파일의 다운로드가 시작되었습니다.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "스크린 리더가 사용하는 태그가 제거됩니다.", + "Duplicate Field Name": "중복된 필드 이름", + "Duplicate Field Names": "중복된 필드 이름", + "Duplicate Page": "페이지 복제", + "Duplicate Page Numbers": "중복된 페이지 번호", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA 서명이 서명자의 공개 키로 검증되지 않습니다", + "EPUB Files": "EPUB 파일", + "EPUB to PDF": "EPUB를 PDF로", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ를 PDF로", + "Edit": "편집", + "Edit All": "모두 편집", + "Edit Bookmark": "북마크 편집", + "Edit Bookmarks": "북마크 편집", + "Edit Images": "이미지 편집", + "Edit Metadata": "메타데이터 편집", + "Edit PDF metadata": "PDF 메타데이터 편집", + "Edit Scope": "편집 범위", + "Edit Shapes": "도형 편집", + "Edit Text": "텍스트 편집", + "Edit tool": "편집 도구", + "Edit {{scopes}}": "{{scopes}} 편집", + "Email Files": "이메일 파일", + "Email to PDF": "이메일을 PDF로", + "Embedding files into PDF...": "PDF에 파일 삽입 중...", + "Empty signature bytes": "서명 바이트가 비어 있습니다", + "Encrypt": "암호화", + "Encrypt PDF with password": "비밀번호로 PDF 암호화", + "Encrypted file": "암호화된 파일", + "Encrypting PDF with 256-bit AES...": "256비트 AES로 PDF 암호화 중...", + "Encryption Failed": "암호화 실패", + "Encryption resulted in an empty file.": "암호화 결과 빈 파일이 만들어졌습니다.", + "End": "끝", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "맨 앞에 삽입하려면 0을, 맨 뒤에 삽입하려면 {{pageCount}}을(를) 입력하세요.", + "Enter bookmark title": "북마크 제목 입력", + "Enter name for child layer under \"{{Layer}}\":": "\"{{Layer}}\" 아래의 하위 레이어 이름을 입력하세요:", + "Enter password": "비밀번호 입력", + "Enter password...": "비밀번호 입력...", + "Enter passwords for each encrypted file": "암호화된 각 파일의 비밀번호를 입력하세요", + "Error": "오류", + "Error during execution": "실행 중 오류", + "Error generating PDF: {{error}}": "PDF 생성 중 오류: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "PDF 파일을 불러오는 중 오류가 발생했습니다. 올바른 PDF로 다시 시도해 주세요.", + "Error reading files: {{error}}": "파일을 읽는 중 오류: {{error}}", + "Error saving PDF. Check console for details.": "PDF를 저장하는 중 오류가 발생했습니다. 자세한 내용은 콘솔을 확인하세요.", + "Error: {{error}}": "오류: {{error}}", + "Exactly 11 or 12 digits": "정확히 11자리 또는 12자리", + "Exactly 12 or 13 digits": "정확히 12자리 또는 13자리", + "Example of current format:": "현재 형식 예시:", + "Excel to PDF": "Excel을 PDF로", + "Existing Radio Groups": "기존 라디오 그룹", + "Export Error": "내보내기 오류", + "Export Value": "내보내기 값", + "Export failed": "내보내기 실패", + "External processing module needed": "외부 처리 모듈이 필요합니다", + "Extract Images": "이미지 추출", + "Extract Pages": "페이지 추출", + "Extract Tables": "표 추출", + "Extract a range of pages": "페이지 범위 추출", + "Extract all images from PDF": "PDF의 모든 이미지 추출", + "Extract pages as separate PDFs": "페이지를 개별 PDF로 추출", + "Extract text from PDF": "PDF에서 텍스트 추출", + "Extracted 1 table successfully!": "표 1개를 추출했습니다!", + "Extracted text from {{length}} PDF files!": "PDF 파일 {{length}}개에서 텍스트를 추출했습니다!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "PDF {{completed}}개 추출 완료, {{failed}}개 실패.", + "Extracted {{length}} page(s) successfully!": "페이지 {{length}}개를 추출했습니다!", + "Extracted {{length}} table(s) to Excel!": "표 {{length}}개를 Excel로 추출했습니다!", + "Extracted {{length}} tables successfully!": "표 {{length}}개를 추출했습니다!", + "Extracting attachments from {{length}} file(s)...": "파일 {{length}}개에서 첨부파일 추출 중...", + "Extracting images from {{name}}...": "{{name}}에서 이미지 추출 중...", + "Extracting pages...": "페이지 추출 중...", + "Extracting tables...": "표 추출 중...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "{{n}}/{{length}}번째 파일에서 텍스트 추출 중: {{name}}...", + "Extracting text from multiple files...": "여러 파일에서 텍스트 추출 중...", + "Extracting text from {{name}}...": "{{name}}에서 텍스트 추출 중...", + "Extracting text...": "텍스트 추출 중...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "AI용으로 {{name}} 추출 중 ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "AI용으로 {{name}} 추출 중...", + "Extracting...": "추출 중...", + "Extraction Complete": "추출 완료", + "Extraction Error": "추출 오류", + "Extraction Partial": "일부만 추출됨", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "추출이 완료되었습니다! 첨부파일 {{length}}개가 ZIP 파일({{totalSize}})에 담겼습니다. 다운로드가 시작되었습니다.", + "FB2 Files": "FB2 파일", + "FB2 to PDF": "FB2를 PDF로", + "Failed": "실패", + "Failed to acquire 2D canvas context": "2D 캔버스 컨텍스트를 가져오지 못했습니다", + "Failed to add child layer": "하위 레이어를 추가하지 못했습니다", + "Failed to apply Bates numbers.": "베이츠 번호를 적용하지 못했습니다.", + "Failed to apply color adjustments. The file might be corrupted.": "색상 조정을 적용하지 못했습니다. 파일이 손상되었을 수 있습니다.", + "Failed to apply redactions.": "교정을 적용하지 못했습니다.", + "Failed to apply scanner effect. The file might be corrupted.": "스캐너 효과를 적용하지 못했습니다. 파일이 손상되었을 수 있습니다.", + "Failed to attach files: {{error}}": "파일을 첨부하지 못했습니다: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "BMP를 PDF로 변환하지 못했습니다. 파일 중 하나가 올바르지 않을 수 있습니다.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "HEIC를 PDF로 변환하지 못했습니다. 파일 중 하나가 올바르지 않을 수 있습니다.", + "Failed to convert PDF to CSV. {{message}}": "PDF를 CSV로 변환하지 못했습니다. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "PDF를 Excel로 변환하지 못했습니다. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "PDF를 SVG로 변환하지 못했습니다. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "PDF를 흑백으로 변환하지 못했습니다. 파일이 손상되었을 수 있습니다.", + "Failed to convert PDF. It may be image-based or corrupted.": "PDF를 변환하지 못했습니다. 이미지 기반이거나 손상된 파일일 수 있습니다.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "TIFF를 PDF로 변환하지 못했습니다. 파일 중 하나가 올바르지 않을 수 있습니다.", + "Failed to convert images to PDF.": "이미지를 PDF로 변환하지 못했습니다.", + "Failed to convert text to PDF. {{error}}": "텍스트를 PDF로 변환하지 못했습니다. {{error}}", + "Failed to convert {{filename}} to PNG": "{{filename}}을(를) PNG로 변환하지 못했습니다", + "Failed to copy metadata to clipboard.": "메타데이터를 클립보드에 복사하지 못했습니다.", + "Failed to create PDF.": "PDF를 만들지 못했습니다.", + "Failed to create PNG blob": "PNG blob을 만들지 못했습니다", + "Failed to create canvas context": "캔버스 컨텍스트를 만들지 못했습니다", + "Failed to create split PDFs.": "분할된 PDF를 만들지 못했습니다.", + "Failed to decode image: {{name}}": "이미지를 디코딩하지 못했습니다: {{name}}", + "Failed to decrypt private key": "개인 키를 복호화하지 못했습니다", + "Failed to decrypt. Try the Decrypt tool instead.": "복호화하지 못했습니다. 대신 PDF 복호화 도구를 사용해 보세요.", + "Failed to delete layer": "레이어를 삭제하지 못했습니다", + "Failed to delete pages.": "페이지를 삭제하지 못했습니다.", + "Failed to deskew PDF: {{error}}": "PDF 기울기를 보정하지 못했습니다: {{error}}", + "Failed to download the edited PDF.": "편집한 PDF를 다운로드하지 못했습니다.", + "Failed to edit attachments.": "첨부파일을 편집하지 못했습니다.", + "Failed to extract certificate from PFX file": "PFX 파일에서 인증서를 추출하지 못했습니다", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "페이지를 추출하지 못했습니다 (qpdf 종료 코드 {{exitCode}}).", + "Failed to extract pages.": "페이지를 추출하지 못했습니다.", + "Failed to extract tables. {{message}}": "표를 추출하지 못했습니다. {{message}}", + "Failed to extract text from PDF.": "PDF에서 텍스트를 추출하지 못했습니다.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "{{iccUrl}}에서 ICC 프로필을 가져오지 못했습니다: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "글꼴 파일을 가져오지 못했습니다: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "gs.js를 가져오지 못했습니다: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "{{url}}을(를) 가져오지 못했습니다: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "{{pageNumber}}페이지의 2D 컨텍스트를 가져오지 못했습니다", + "Failed to get canvas context": "캔버스 컨텍스트를 가져오지 못했습니다", + "Failed to insert PDF. The file may be corrupted.": "PDF를 삽입하지 못했습니다. 파일이 손상되었을 수 있습니다.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "{{normalizedUrl}}에서 Ghostscript를 불러오지 못했습니다: {{msg}}", + "Failed to load PDF file.": "PDF 파일을 불러오지 못했습니다.", + "Failed to load PDF for cropping.": "자르기용 PDF를 불러오지 못했습니다.", + "Failed to load PDF for preview.": "미리보기용 PDF를 불러오지 못했습니다.", + "Failed to load PDF form viewer.": "PDF 양식 뷰어를 불러오지 못했습니다.", + "Failed to load PDF layers": "PDF 레이어를 불러오지 못했습니다", + "Failed to load PyMuPDF from CDN: {{msg}}": "CDN에서 PyMuPDF를 불러오지 못했습니다: {{msg}}", + "Failed to load SVG image": "SVG 이미지를 불러오지 못했습니다", + "Failed to load WebP image": "WebP 이미지를 불러오지 못했습니다", + "Failed to load attachments from PDF.": "PDF에서 첨부파일을 불러오지 못했습니다.", + "Failed to load files: {{error}}": "파일을 불러오지 못했습니다: {{error}}", + "Failed to load image.": "이미지를 불러오지 못했습니다.", + "Failed to load image: {{filename}}": "이미지를 불러오지 못했습니다: {{filename}}", + "Failed to load one or more PDF files.": "PDF 파일을 하나 이상 불러오지 못했습니다.", + "Failed to load script: {{url}}": "스크립트를 불러오지 못했습니다: {{url}}", + "Failed to load template.": "템플릿을 불러오지 못했습니다.", + "Failed to load the PDF Editor.": "PDF 편집기를 불러오지 못했습니다.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "이미지 처리기를 불러오지 못했습니다. 브라우저가 SharedArrayBuffer를 지원하는지 확인해 주세요 (HTTPS 또는 localhost 필요).", + "Failed to parse CSV: {{error}}": "CSV를 분석하지 못했습니다: {{error}}", + "Failed to parse signature": "서명을 분석하지 못했습니다", + "Failed to parse the certificate file.": "인증서 파일을 분석하지 못했습니다.", + "Failed to process HEIC file: {{name}}": "HEIC 파일을 처리하지 못했습니다: {{name}}", + "Failed to process WebP file: {{name}}": "WebP 파일을 처리하지 못했습니다: {{name}}", + "Failed to read file.": "파일을 읽지 못했습니다.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "제한을 해제하지 못했습니다. PDF에 올바른 소유자 비밀번호가 필요할 수 있습니다.", + "Failed to render page": "페이지를 렌더링하지 못했습니다", + "Failed to render page previews": "페이지 미리보기를 렌더링하지 못했습니다", + "Failed to render page previews.": "페이지 미리보기를 렌더링하지 못했습니다.", + "Failed to render page.": "페이지를 렌더링하지 못했습니다.", + "Failed to save changes.": "변경 사항을 저장하지 못했습니다.", + "Failed to save the new PDF. Check console for details.": "새 PDF를 저장하지 못했습니다. 자세한 내용은 콘솔을 확인하세요.", + "Failed to split PDF. Please check your selection.": "PDF를 분할하지 못했습니다. 선택 항목을 확인해 주세요.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "PDF에 타임스탬프를 찍지 못했습니다: {{message}}\n\n다른 TSA 서버를 사용하거나 인터넷 연결을 확인해 주세요.", + "Failed to toggle layer visibility": "레이어 표시 상태를 전환하지 못했습니다", + "Failed to validate signatures. The file may be corrupted.": "서명을 검증하지 못했습니다. 파일이 손상되었을 수 있습니다.", + "Features enabled by this module:": "이 모듈로 사용할 수 있는 기능:", + "Field Name": "필드 이름", + "Field Name (Group Name)": "필드 이름 (그룹 이름)", + "Field Name Conflict": "필드 이름 충돌", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "\"{{newName}}\" 필드 이름이 이 {{value}}에 이미 있습니다. 고유한 이름을 사용해 주세요.", + "Field name cannot be empty": "필드 이름은 비워 둘 수 없습니다", + "File": "파일", + "File Size": "파일 크기", + "File exists but could not be read. Check CORS configuration.": "파일은 있지만 읽을 수 없습니다. CORS 설정을 확인하세요.", + "File list not found": "파일 목록을 찾을 수 없습니다", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "파일 크기가 {{originalSize}}에서 {{compressedSize}}(으)로 줄었습니다 ({{percent}}% 절약).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "파일 {{n}}/{{length}}: {{n2}}/{{pageCount}}페이지", + "File {{n}}/{{length}}: {{message}}": "파일 {{n}}/{{length}}: {{message}}", + "Filename": "파일 이름", + "Files that failed: {{errorCount}}.": "실패한 파일: {{errorCount}}개.", + "Fill (cover full target page)": "채우기 (대상 페이지 전체 덮기)", + "Fill Color": "채우기 색상", + "Finalizing PDF...": "PDF 마무리 중...", + "Find & replace": "찾기 및 바꾸기", + "Finds the best quality under this size. 0 means no target.": "이 크기 이하에서 가장 좋은 품질을 찾습니다. 0은 목표 없음을 의미합니다.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox와 Chrome은 선택하는 동안 자체 날짜 선택기 형식을 표시할 수 있습니다. 날짜 입력을 마치면 올바른 형식이 적용됩니다.", + "First Indent": "첫 줄 들여쓰기", + "Fit (keep full page visible)": "맞춤 (전체 페이지가 보이도록 유지)", + "Fit Page": "페이지 맞춤", + "Fix Page Size": "페이지 크기 통일", + "Flatten": "평탄화", + "Flatten Forms": "양식 평탄화", + "Flatten annotations": "주석 평탄화", + "Flatten form fields": "양식 필드 평탄화", + "Flatten forms and annotations": "양식과 주석 평탄화", + "Flatten links": "링크 평탄화", + "Flattening PDF...": "PDF 평탄화 중...", + "Flattening and saving PDF...": "PDF 평탄화 및 저장 중...", + "Flattening multiple PDFs...": "여러 PDF 평탄화 중...", + "Flattening page {{i}} of {{totalPages}}...": "{{i}}/{{totalPages}}페이지 평탄화 중...", + "Flattening {{n}}/{{length}}: {{name}}...": "평탄화 중 {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "주소 표시줄로 이동합니다", + "Font": "글꼴", + "Font Color": "글꼴 색상", + "Font Family": "글꼴 패밀리", + "Font Size": "글꼴 크기", + "Font size: {{bSize}} → {{aSize}}": "글꼴 크기: {{bSize}} → {{aSize}}", + "Font to Outline": "폰트 윤곽선 변환", + "Font: {{bFont}} → {{aFont}}": "글꼴: {{bFont}} → {{aFont}}", + "Fonts": "글꼴", + "Footer Center": "바닥글 가운데", + "Footer Left": "바닥글 왼쪽", + "Footer Right": "바닥글 오른쪽", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "스캔본 같은 이미지 전용 PDF에 사용합니다. 문서에 선택 가능한 텍스트가 있으면 건너뜁니다. 단, 콘텐츠 보호 무시가 켜져 있으면 건너뛰지 않습니다.", + "Form fields stop being fillable.": "양식 필드를 더 이상 작성할 수 없게 됩니다.", + "Format": "형식", + "Found {{length}} blank page(s). Click on a page to deselect it.": "빈 페이지 {{length}}개를 찾았습니다. 페이지를 클릭하면 선택이 해제됩니다.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "기존 북마크 {{length}}개를 찾았습니다. 현재 북마크를 바꿀까요?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "PDF {{length2}}개에서 이미지 {{length}}개를 찾았습니다.", + "Front": "앞면", + "Full Coverage": "전체 덮기", + "Gamma": "감마", + "Generate table of contents from bookmarks": "북마크에서 목차 생성", + "Generating High-Quality PDF...": "고품질 PDF 생성 중...", + "Generating PDF...": "PDF 생성 중...", + "Generating ZIP file...": "ZIP 파일 생성 중...", + "Generating formatted content...": "서식이 적용된 콘텐츠 생성 중...", + "Generating preview...": "미리보기 생성 중...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (PDF/A 변환)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB 변환이 종료 코드 {{exitCode}}(으)로 실패했습니다", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript 변환이 종료 코드 {{exitCode}}(으)로 실패했습니다", + "Ghostscript did not produce output file": "Ghostscript가 출력 파일을 만들지 않았습니다", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript가 설정되지 않았습니다. 고급 설정에서 설정해 주세요.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript가 설정되지 않았습니다. WASM 설정에서 설정해 주세요.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript가 설정되지 않았습니다. 일부 작업에는 PyMuPDF에 Ghostscript가 필요합니다. 고급 설정에서 둘 다 설정해 주세요.", + "Ghostscript threw an exception: {{e}}": "Ghostscript에서 예외가 발생했습니다: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript 래퍼가 예상한 인터페이스를 제공하지 않았습니다. loadGS() 또는 GhostscriptWASM 클래스가 필요합니다.", + "Go": "이동", + "Go to page": "페이지로 이동", + "Grayscale": "그레이스케일", + "Green": "초록색", + "Greyscale": "흑백", + "Grid Mode": "격자 모드", + "Group Name (Must be same for group)": "그룹 이름 (그룹 내에서 동일해야 함)", + "H-Scale %": "가로 배율 %", + "Hanging Indent": "내어쓰기", + "Hard reloads page": "페이지를 강제로 새로고침합니다", + "Header & Footer": "머리글 및 바닥글", + "Header & Footer added successfully!": "머리글 및 바닥글을 추가했습니다!", + "Header Center": "머리글 가운데", + "Header Left": "머리글 왼쪽", + "Header Right": "머리글 오른쪽", + "Height ({{unit}})": "높이 ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "숨기기", + "Hide Border": "테두리 숨기기", + "Hide password": "비밀번호 숨기기", + "Hides window": "창을 숨깁니다", + "High (288 DPI)": "높음 (288 DPI)", + "High (Smallest Files)": "높음 (가장 작은 파일)", + "Horizontal": "가로", + "Hue Shift": "색조 이동", + "Image Format": "이미지 형식", + "Image Input": "이미지 입력", + "Image quality": "이미지 품질", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "이미지 크기를 {{width}}×{{height}}에서 {{width2}}×{{height2}}(으)로 조정했습니다", + "Images": "이미지", + "Images above this are resampled down. None leaves resolution alone.": "이 값을 넘는 이미지는 해상도를 낮춥니다. 없음을 선택하면 해상도를 그대로 둡니다.", + "Imported {{length}} bookmarks!": "북마크 {{length}}개를 가져왔습니다!", + "Inches (in)": "인치 (in)", + "Include Attachments": "첨부파일 포함", + "Include Cc Bcc": "참조 및 숨은 참조 포함", + "Include this file": "이 파일 포함", + "Incorrect Page Count": "페이지 수가 올바르지 않음", + "Incorrect Password": "비밀번호가 올바르지 않음", + "Incorrect password": "비밀번호가 올바르지 않습니다", + "Incorrect password. Please try again.": "비밀번호가 올바르지 않습니다. 다시 시도해 주세요.", + "Increase size": "크기 늘리기", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "PDF 1 인덱싱 중, {{pageNumber}}/{{totalPages}}페이지...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "PDF 2 인덱싱 중, {{pageNumber}}/{{totalPages}}페이지...", + "Info": "정보", + "Info Dictionary": "정보 사전", + "Inherit": "상속", + "Initialization Error": "초기화 오류", + "Initializing Ghostscript...": "Ghostscript 초기화 중...", + "Initializing PDF engine...": "PDF 엔진 초기화 중...", + "Initializing PyMuPDF...": "PyMuPDF 초기화 중...", + "Initializing decryption...": "복호화 초기화 중...", + "Initializing encryption...": "암호화 초기화 중...", + "Initializing repair engine...": "복구 엔진 초기화 중...", + "Initializing...": "초기화 중...", + "Input Required": "입력 필요", + "Insecure Digest (MD5 / SHA-1)": "안전하지 않은 다이제스트 (MD5 / SHA-1)", + "Insert blank pages": "빈 페이지 삽입", + "Insert blank pages after this page number": "이 페이지 번호 뒤에 빈 페이지 삽입", + "Interactive Form Fields": "대화형 양식 필드", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "여러 PDF의 페이지를 번갈아 배치 (예: 단면 스캔의 홀수 페이지와 역순 짝수 페이지)", + "Invalid Certificate": "올바르지 않은 인증서", + "Invalid File": "올바르지 않은 파일", + "Invalid Files": "올바르지 않은 파일", + "Invalid Input": "올바르지 않은 입력", + "Invalid JSON format": "올바르지 않은 JSON 형식", + "Invalid Name": "올바르지 않은 이름", + "Invalid Order": "올바르지 않은 순서", + "Invalid PDF password.": "PDF 비밀번호가 올바르지 않습니다.", + "Invalid Page Numbers": "올바르지 않은 페이지 번호", + "Invalid Page Order": "올바르지 않은 페이지 순서", + "Invalid Pages": "올바르지 않은 페이지", + "Invalid Range": "올바르지 않은 범위", + "Invalid Signature": "올바르지 않은 서명", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "올바르지 않은 TSA URL입니다. 타임스탬프 기관은 올바른 http:// 또는 https:// URL이어야 합니다.", + "Invalid URL": "올바르지 않은 URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "URL 형식이 올바르지 않습니다. 올바른 URL을 입력해 주세요 (예: https://example.com/wasm/)", + "Invalid XML: no root element": "올바르지 않은 XML: 루트 요소가 없습니다", + "Invalid data": "올바르지 않은 데이터", + "Invalid hex string in content stream": "콘텐츠 스트림에 올바르지 않은 16진수 문자열이 있습니다", + "Invalid page range specified.": "지정한 페이지 범위가 올바르지 않습니다.", + "Invalid shortcut format": "올바르지 않은 단축키 형식", + "Invalid: Cryptographic Verification Failed": "올바르지 않음: 암호화 검증 실패", + "Invert Colors": "색상 반전", + "Invert all colors": "모든 색상 반전", + "Inverting PDF colors...": "PDF 색상 반전 중...", + "Issuer": "발급자", + "It fits the {{targetBytes}} target.": "목표 크기 {{targetBytes}} 이내입니다.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "PDF/A 유지 설정 때문에 압축에 한계가 있어 목표 크기 {{targetBytes}}보다 큽니다.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "더 이상 PDF/A 준수를 표시하지 않습니다. 유지하려면 사용자 지정 설정에서 PDF/A 유지를 켜세요.", + "Italic": "기울임꼴", + "Item 1": "항목 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "압축하기 위해 디지털 서명을 제거했습니다. 필요하면 다시 서명하세요.", + "JPEG (Smaller file size)": "JPEG (작은 파일 크기)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "다시 인코딩하는 이미지의 JPEG 품질, 20~100. 낮을수록 파일이 작아지고 열화가 눈에 띕니다.", + "JPG": "JPG", + "JSON Files": "JSON 파일", + "JSON Loaded": "JSON을 불러왔습니다", + "JSON to PDF": "JSON을 PDF로", + "Javascript Code": "JavaScript 코드", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "PDF/A 파일이 규격을 유지하게 합니다. 이 옵션이 켜져 있으면 Brotli와 래스터화는 건너뜁니다.", + "Keeps only the characters the document uses.": "문서에서 사용하는 문자만 남깁니다.", + "Key (e.g., Department)": "키 (예: 부서)", + "Keywords": "키워드", + "Label": "레이블", + "Label / Prompt": "레이블 / 안내 문구", + "Landscape": "가로 방향", + "Language": "언어", + "Layer not found": "레이어를 찾을 수 없습니다", + "Layer {{number}}": "레이어 {{number}}", + "Leave blank for all pages": "비워 두면 모든 페이지", + "Left": "왼쪽", + "Left edge in points (1 inch = 72 pts)": "왼쪽 여백 (포인트, 1인치 = 72포인트)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "수준", + "Limit recognized characters (leave empty for all)": "인식할 문자 제한 (비워 두면 모두 인식)", + "Line": "선", + "Linearization Failed": "선형화 실패", + "Linearize": "선형화", + "Links stop being clickable.": "링크를 더 이상 클릭할 수 없게 됩니다.", + "Lists": "목록", + "Load": "불러오기", + "Load system fonts": "시스템 글꼴 불러오기", + "Load system fonts…": "시스템 글꼴 불러오기…", + "Loaded": "불러옴", + "Loaded bookmarks from JSON. Now upload your PDF.": "JSON에서 북마크를 불러왔습니다. 이제 PDF를 업로드하세요.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "CSV에서 북마크 {{length}}개를 불러왔습니다. 이제 PDF를 업로드하세요.", + "Loading Engine...": "엔진 불러오는 중...", + "Loading Ghostscript...": "Ghostscript 불러오는 중...", + "Loading PDF Editor...": "PDF 편집기 불러오는 중...", + "Loading PDF Text Editor...": "PDF 텍스트 편집기 불러오는 중...", + "Loading PDF converter...": "PDF 변환기 불러오는 중...", + "Loading PDF documents...": "PDF 문서 불러오는 중...", + "Loading PDF engine...": "PDF 엔진 불러오는 중...", + "Loading PDF files...": "PDF 파일 불러오는 중...", + "Loading PDF form...": "PDF 양식 불러오는 중...", + "Loading PDF processor...": "PDF 처리기 불러오는 중...", + "Loading PDF viewer...": "PDF 뷰어 불러오는 중...", + "Loading PDF...": "PDF 불러오는 중...", + "Loading PDFs...": "PDF 불러오는 중...", + "Loading attachments...": "첨부파일 불러오는 중...", + "Loading comparison {{currentPage}} of {{length}}...": "비교 {{currentPage}}/{{length}} 불러오는 중...", + "Loading conversion engine ({{percent}}%)...": "변환 엔진 불러오는 중 ({{percent}}%)...", + "Loading conversion engine...": "변환 엔진 불러오는 중...", + "Loading engine...": "엔진 불러오는 중...", + "Loading fonts...": "글꼴 불러오는 중...", + "Loading layers from {{name}}...": "{{name}}에서 레이어 불러오는 중...", + "Loading page {{num}}...": "{{num}}페이지 불러오는 중...", + "Loading preview...": "미리보기 불러오는 중...", + "Loading {{name}}...": "{{name}} 불러오는 중...", + "Loading...": "불러오는 중...", + "Location": "위치", + "Lossless (No Quality Loss)": "무손실 (품질 손실 없음)", + "Lossless (no image re-encoding)": "무손실 (이미지 재인코딩 없음)", + "Low (Best Quality)": "낮음 (최고 품질)", + "MOBI Files": "MOBI 파일", + "MOBI to PDF": "MOBI를 PDF로", + "Malformed ByteRange": "ByteRange 형식이 올바르지 않습니다", + "Malformed ECDSA signature (could not parse r,s)": "ECDSA 서명 형식이 올바르지 않습니다 (r, s를 분석할 수 없음)", + "Malformed inline image in content stream": "콘텐츠 스트림의 인라인 이미지 형식이 올바르지 않습니다", + "Malformed signatureAlgorithm": "signatureAlgorithm 형식이 올바르지 않습니다", + "Margins": "여백", + "Markdown Files": "Markdown 파일", + "Markdown to PDF": "Markdown을 PDF로", + "Max Length (0 for unlimited)": "최대 길이 (0이면 제한 없음)", + "Maximum resolution": "최대 해상도", + "Medium (Recommended)": "보통 (권장)", + "Merge PDF": "PDF 병합", + "Merge PDFs": "PDF 병합", + "Merge duplicate fonts": "중복 글꼴 병합", + "Mermaid Error: {{error}}": "Mermaid 오류: {{error}}", + "Metadata copied to clipboard as JSON.": "메타데이터를 JSON으로 클립보드에 복사했습니다.", + "Metadata removed successfully!": "메타데이터를 제거했습니다!", + "Metadata updated successfully!": "메타데이터를 업데이트했습니다!", + "Millimeters (mm)": "밀리미터 (mm)", + "Minimizes window": "창을 최소화합니다", + "Missing Files": "누락된 파일", + "Missing signatureAlgorithm": "signatureAlgorithm이 없습니다", + "Mixed Page Sizes Detected": "서로 다른 페이지 크기가 감지되었습니다", + "Mixed Sizes": "혼합 크기", + "Mode": "모드", + "Modified": "수정됨", + "Modified After Signing (signed part intact)": "서명 후 수정됨 (서명된 부분은 그대로)", + "More": "더 보기", + "Moved": "이동됨", + "Moved \"{{value}}\"": "\"{{value}}\"을(를) 이동했습니다", + "Multi-line": "여러 줄", + "Must be a positive integer": "양의 정수여야 합니다", + "Must be a positive number": "양수여야 합니다", + "N must be at least 1.": "N은 1 이상이어야 합니다.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF를 만들었습니다!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "네트워크 오류: URL에 연결할 수 없습니다. URL이 올바른지, 서버가 CORS 요청을 허용하는지 확인하세요.", + "Network error: {{error}}": "네트워크 오류: {{error}}", + "Next page": "다음 페이지", + "No Area Selected": "선택된 영역 없음", + "No Attachments": "첨부파일 없음", + "No Changes": "변경 사항 없음", + "No Crop Area": "자르기 영역 없음", + "No File": "파일 없음", + "No Files": "파일 없음", + "No Images Found": "이미지를 찾을 수 없음", + "No PDF Files": "PDF 파일 없음", + "No PDF document loaded": "불러온 PDF 문서가 없습니다", + "No PDF document loaded.": "불러온 PDF 문서가 없습니다.", + "No PDF file loaded.": "불러온 PDF 파일이 없습니다.", + "No PDF files could be decrypted. The password may be incorrect.": "복호화할 수 있는 PDF 파일이 없습니다. 비밀번호가 올바르지 않을 수 있습니다.", + "No PDF files could be linearized.": "선형화할 수 있는 PDF 파일이 없습니다.", + "No PDFs could be processed.": "처리할 수 있는 PDF가 없습니다.", + "No Pages": "페이지 없음", + "No Selection": "선택 항목 없음", + "No Signatures Found": "서명을 찾을 수 없음", + "No Tables Found": "표를 찾을 수 없음", + "No Text": "텍스트 없음", + "No URL configured": "설정된 URL이 없습니다", + "No attachments found in this PDF.": "이 PDF에서 첨부파일을 찾을 수 없습니다.", + "No attachments selected for removal.": "제거할 첨부파일이 선택되지 않았습니다.", + "No blank pages detected in this PDF.": "이 PDF에서 빈 페이지가 감지되지 않았습니다.", + "No bookmarks found at the selected level.": "선택한 수준에서 북마크를 찾을 수 없습니다.", + "No bookmarks to delete.": "삭제할 북마크가 없습니다.", + "No bookmarks to export!": "내보낼 북마크가 없습니다!", + "No certificate found in PEM file": "PEM 파일에서 인증서를 찾을 수 없습니다", + "No certificate found in PFX file": "PFX 파일에서 인증서를 찾을 수 없습니다", + "No certificates found in signature": "서명에서 인증서를 찾을 수 없습니다", + "No changes match the current filter.": "현재 필터와 일치하는 변경 사항이 없습니다.", + "No configurable settings for this node.": "이 노드에는 설정할 항목이 없습니다.", + "No differences detected on this page.": "이 페이지에서 차이점이 감지되지 않았습니다.", + "No embedded images were found in the selected PDF(s).": "선택한 PDF에서 포함된 이미지를 찾을 수 없습니다.", + "No existing bookmarks found in this PDF.": "이 PDF에서 기존 북마크를 찾을 수 없습니다.", + "No items were selected for removal or none were found in the PDF.": "제거할 항목이 선택되지 않았거나 PDF에서 찾을 수 없습니다.", + "No page pairs to export.": "내보낼 페이지 쌍이 없습니다.", + "No pages found. Please create a blank PDF or upload one.": "페이지가 없습니다. 빈 PDF를 만들거나 PDF를 업로드하세요.", + "No pages selected for removal.": "제거할 페이지가 선택되지 않았습니다.", + "No pages were selected for splitting.": "분할할 페이지가 선택되지 않았습니다.", + "No paired page for this side.": "이쪽에는 짝이 되는 페이지가 없습니다.", + "No private key found in PEM file": "PEM 파일에서 개인 키를 찾을 수 없습니다", + "No private key found in PFX file": "PFX 파일에서 개인 키를 찾을 수 없습니다", + "No tables were detected in this PDF.": "이 PDF에서 표가 감지되지 않았습니다.", + "No valid page numbers found.": "올바른 페이지 번호를 찾을 수 없습니다.", + "No valid pages to save.": "저장할 올바른 페이지가 없습니다.", + "No worker": "워커 없음", + "Noise": "노이즈", + "None": "없음", + "None of the files could be compressed: {{join}}.": "압축할 수 있는 파일이 없습니다: {{join}}.", + "Normal": "보통", + "Not Enough Files": "파일이 부족합니다", + "Not a PDF": "PDF가 아닙니다", + "Not connected": "연결되지 않음", + "Not in trust chain": "신뢰 체인에 없음", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "참고: 별도의 소유자 비밀번호가 없으면 PDF에 사용 제한이 적용되지 않습니다.", + "Number Format": "번호 형식", + "Number of Pages": "페이지 수", + "OCR": "OCR", + "OCR aborted before any page was processed": "페이지를 처리하기 전에 OCR이 중단되었습니다", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR 인식이 {{timeoutMs}}ms 후 시간 초과되었습니다", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODG 파일", + "ODG to PDF": "ODG를 PDF로", + "OK": "확인", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "끔 (기본값): 1~N 순서로 자연스럽게 번호를 매깁니다. 켬: 각 파일의 원래 페이지 레이블을 유지합니다 (중복 레이블이 생길 수 있음).", + "One PDF per page": "페이지당 PDF 하나", + "One PDF per range": "범위당 PDF 하나", + "Only a substitute font was available": "대체 글꼴만 사용할 수 있었습니다", + "Only where it does not change how the image looks.": "이미지 모양이 바뀌지 않는 경우에만 적용합니다.", + "Opacity": "불투명도", + "Open URL": "URL 열기", + "Opens incognito window": "시크릿 창을 엽니다", + "Opens new tab": "새 탭을 엽니다", + "Opens new window": "새 창을 엽니다", + "Operation Failed": "작업 실패", + "Operation resulted in an empty file.": "작업 결과 빈 파일이 만들어졌습니다.", + "Optimize PDF for fast web viewing": "빠른 웹 보기를 위해 PDF 최적화", + "Optimizing PDFs for web view (linearizing)...": "웹 보기용으로 PDF 최적화(선형화) 중...", + "Optimizing {{name}} ({{n}}/{{length}})...": "{{name}} 최적화 중 ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "옵션 (한 줄에 하나씩 또는 쉼표로 구분)", + "Orientation": "방향", + "Outline": "윤곽선", + "Output": "출력", + "Overlay": "오버레이", + "Overlay or underlay pages from one PDF onto another": "한 PDF의 페이지를 다른 PDF 위나 아래에 겹치기", + "Owner Password": "소유자 비밀번호", + "Owner Password Required": "소유자 비밀번호 필요", + "PDF": "PDF", + "PDF Files": "PDF 파일", + "PDF Input": "PDF 입력", + "PDF Layers": "PDF 레이어", + "PDF Metadata": "PDF 메타데이터", + "PDF Producer": "PDF 생성 도구", + "PDF converted to CSV successfully!": "PDF를 CSV로 변환했습니다!", + "PDF converted to SVG successfully!": "PDF를 SVG로 변환했습니다!", + "PDF converted to greyscale successfully!": "PDF를 흑백으로 변환했습니다!", + "PDF created successfully!": "PDF를 만들었습니다!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF를 복호화했습니다! 모든 암호화와 제한이 제거되었습니다.", + "PDF decrypted successfully! Your download has started.": "PDF를 복호화했습니다! 다운로드가 시작되었습니다.", + "PDF downloaded successfully.": "PDF를 다운로드했습니다.", + "PDF encrypted successfully with 256-bit AES!": "256비트 AES로 PDF를 암호화했습니다!", + "PDF has been sanitized and downloaded.": "PDF를 정리하여 다운로드했습니다.", + "PDF has no pages": "PDF에 페이지가 없습니다", + "PDF organized successfully!": "PDF를 정리했습니다!", + "PDF permissions changed successfully!": "PDF 권한을 변경했습니다!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF 리더가 14가지 표준 PDF 글꼴을 직접 제공합니다.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF 제한을 해제했습니다! 이제 파일을 자유롭게 편집하고 인쇄할 수 있습니다.", + "PDF saved successfully!": "PDF를 저장했습니다!", + "PDF split successfully!": "PDF를 분할했습니다!", + "PDF to CSV": "PDF를 CSV로", + "PDF to DOCX": "PDF를 DOCX로", + "PDF to Excel/CSV": "PDF를 Excel/CSV로", + "PDF to Images": "PDF를 이미지로", + "PDF to Images (High Quality)": "PDF를 이미지로 (고품질)", + "PDF to JSON": "PDF를 JSON으로", + "PDF to Markdown": "PDF를 Markdown으로", + "PDF to PDF/A": "PDF를 PDF/A로", + "PDF to SVG": "PDF를 SVG로", + "PDF to Text": "PDF를 텍스트로", + "PDF to XLSX": "PDF를 XLSX로", + "PDF with layer changes saved!": "레이어 변경 사항이 적용된 PDF를 저장했습니다!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}}을(를) 적용했습니다.", + "PDF/A Conversion": "PDF/A 변환", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (엄격, 투명도 없음)", + "PDF/A-2b (Recommended)": "PDF/A-2b (권장)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (최신, 첨부파일 허용)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF를 섞었습니다!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (무손실)", + "PUB to PDF": "PUB를 PDF로", + "Page": "페이지", + "Page #": "페이지 번호", + "Page Added": "페이지 추가됨", + "Page Numbers": "페이지 번호", + "Page Removed": "페이지 제거됨", + "Page Size": "페이지 크기", + "Page X of Y": "페이지 X / Y", + "Page background or layout changed": "페이지 배경 또는 레이아웃이 변경됨", + "Page container not found": "페이지 컨테이너를 찾을 수 없습니다", + "Page extraction produced an empty PDF.": "페이지 추출 결과 빈 PDF가 만들어졌습니다.", + "Page number": "페이지 번호", + "Page numbers added successfully!": "페이지 번호를 추가했습니다!", + "Page sizes standardized successfully!": "페이지 크기를 통일했습니다!", + "Page {{currentPageNum}} of {{numPages}}": "{{currentPageNum}}/{{numPages}}페이지", + "Page {{num}} / {{numPages}}": "{{num}} / {{numPages}}페이지", + "Page {{n}} ": "{{n}}페이지 ", + "Page {{n}} of {{length}}": "{{n}}/{{length}}페이지", + "Page {{n}}:": "{{n}}페이지:", + "Page {{pageNumber}}": "{{pageNumber}}페이지", + "Page {{pageNumber}} exists only in the first PDF.": "{{pageNumber}}페이지는 첫 번째 PDF에만 있습니다.", + "Page {{pageNumber}} exists only in the second PDF.": "{{pageNumber}}페이지는 두 번째 PDF에만 있습니다.", + "Page {{pageNumber}} of {{totalPages}}": "{{pageNumber}}/{{totalPages}}페이지", + "Page {{pageNum}} does not exist in this PDF.": "이 PDF에는 {{pageNum}}페이지가 없습니다.", + "Page {{page}}": "{{page}}페이지", + "Page {{page}} attachment": "{{page}}페이지 첨부파일", + "Pages": "페이지", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "페이지 (예: 1-3, 5) - 전체: {{pageCount}}", + "Pages Files": "Pages 파일", + "Pages Per Sheet": "시트당 페이지 수", + "Pages combined successfully!": "페이지를 합쳤습니다!", + "Pages have been divided successfully!": "페이지를 분할했습니다!", + "Pages have been reordered.": "페이지 순서를 변경했습니다.", + "Pages have been reversed successfully!": "페이지를 역순으로 정렬했습니다!", + "Pages to PDF": "Pages를 PDF로", + "Paper Size": "용지 크기", + "Paragraph": "단락", + "Parsing XML structure...": "XML 구조 분석 중...", + "Parsing {{name}}...": "{{name}} 분석 중...", + "Partial Coverage": "부분 덮기", + "Partial Success": "부분 성공", + "Password": "비밀번호", + "Password Error": "비밀번호 오류", + "Password Needed": "비밀번호 필요", + "Password Required": "비밀번호 필요", + "Password for all files": "모든 파일의 비밀번호", + "Password for all locked files": "잠긴 모든 파일의 비밀번호", + "Password for {{name}}": "{{name}}의 비밀번호", + "Password protected": "비밀번호로 보호됨", + "Password required for encrypted private key": "암호화된 개인 키에는 비밀번호가 필요합니다", + "Path Stroke": "경로 선", + "Please add at least one field before downloading.": "다운로드하기 전에 필드를 하나 이상 추가해 주세요.", + "Please draw a rectangle on at least one page to select the crop area.": "자르기 영역을 선택하려면 페이지 하나 이상에 사각형을 그려 주세요.", + "Please ensure all page numbers in the order are unique.": "순서에 있는 모든 페이지 번호가 고유한지 확인해 주세요.", + "Please enter a layer name": "레이어 이름을 입력해 주세요", + "Please enter a name.": "이름을 입력해 주세요.", + "Please enter a number between 0 and {{totalPages}}.": "0에서 {{totalPages}} 사이의 숫자를 입력해 주세요.", + "Please enter a page order.": "페이지 순서를 입력해 주세요.", + "Please enter a password": "비밀번호를 입력해 주세요", + "Please enter a password for {{i}} or skip it": "{{i}}의 비밀번호를 입력하거나 건너뛰세요", + "Please enter a title.": "제목을 입력해 주세요.", + "Please enter a user password.": "사용자 비밀번호를 입력해 주세요.", + "Please enter a valid number of pages (1 or more).": "올바른 페이지 수(1 이상)를 입력해 주세요.", + "Please enter a valid page number between 1 and {{total}}": "1에서 {{total}} 사이의 올바른 페이지 번호를 입력해 주세요", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "올바른 페이지 범위를 입력해 주세요 (예: 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "추출할 페이지 번호를 입력해 주세요.", + "Please enter positive numbers.": "양수를 입력해 주세요.", + "Please enter some text to convert.": "변환할 텍스트를 입력해 주세요.", + "Please enter text for the watermark.": "워터마크로 사용할 텍스트를 입력해 주세요.", + "Please enter the PDF password.": "PDF 비밀번호를 입력해 주세요.", + "Please load a PDF first.": "먼저 PDF를 불러와 주세요.", + "Please select PDF files to create a ZIP archive.": "ZIP 압축 파일을 만들 PDF 파일을 선택해 주세요.", + "Please select a .pem, .crt, .cer, or .der certificate file.": ".pem, .crt, .cer 또는 .der 인증서 파일을 선택해 주세요.", + "Please select a PDF file.": "PDF 파일을 선택해 주세요.", + "Please select a valid PDF file.": "올바른 PDF 파일을 선택해 주세요.", + "Please select an area on at least one page to crop.": "자를 영역을 페이지 하나 이상에서 선택해 주세요.", + "Please select an area to crop first.": "먼저 자를 영역을 선택해 주세요.", + "Please select an area to crop.": "자를 영역을 선택해 주세요.", + "Please select an image file for the watermark.": "워터마크로 사용할 이미지 파일을 선택해 주세요.", + "Please select at least one BMP file.": "BMP 파일을 하나 이상 선택해 주세요.", + "Please select at least one CSV file.": "CSV 파일을 하나 이상 선택해 주세요.", + "Please select at least one Excel file.": "Excel 파일을 하나 이상 선택해 주세요.", + "Please select at least one HEIC file.": "HEIC 파일을 하나 이상 선택해 주세요.", + "Please select at least one JPG file.": "JPG 파일을 하나 이상 선택해 주세요.", + "Please select at least one JPG or JPEG2000 image.": "JPG 또는 JPEG2000 이미지를 하나 이상 선택해 주세요.", + "Please select at least one ODT file.": "ODT 파일을 하나 이상 선택해 주세요.", + "Please select at least one PDF file.": "PDF 파일을 하나 이상 선택해 주세요.", + "Please select at least one PowerPoint file.": "PowerPoint 파일을 하나 이상 선택해 주세요.", + "Please select at least one RTF file.": "RTF 파일을 하나 이상 선택해 주세요.", + "Please select at least one SVG file.": "SVG 파일을 하나 이상 선택해 주세요.", + "Please select at least one TIFF file.": "TIFF 파일을 하나 이상 선택해 주세요.", + "Please select at least one Word document.": "Word 문서를 하나 이상 선택해 주세요.", + "Please select at least one file to attach.": "첨부할 파일을 하나 이상 선택해 주세요.", + "Please select at least one image file.": "이미지 파일을 하나 이상 선택해 주세요.", + "Please select at least one text file.": "텍스트 파일을 하나 이상 선택해 주세요.", + "Please select at least one {{FILETYPE_NAME}} file.": "{{FILETYPE_NAME}} 파일을 하나 이상 선택해 주세요.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "{{TOOL_NAME}} 파일(.eml 또는 .msg)을 하나 이상 선택해 주세요.", + "Please select at least one {{TOOL_NAME}} file.": "{{TOOL_NAME}} 파일을 하나 이상 선택해 주세요.", + "Please select even or odd pages.": "짝수 또는 홀수 페이지를 선택해 주세요.", + "Please select one or more PDF files.": "PDF 파일을 하나 이상 선택해 주세요.", + "Please select pages to delete.": "삭제할 페이지를 선택해 주세요.", + "Please select pages to duplicate.": "복제할 페이지를 선택해 주세요.", + "Please select pages to mark for splitting.": "분할 지점으로 표시할 페이지를 선택해 주세요.", + "Please select pages to rotate.": "회전할 페이지를 선택해 주세요.", + "Please specify a page range for page-level attachments.": "페이지 단위 첨부파일의 페이지 범위를 지정해 주세요.", + "Please upload PDF files.": "PDF 파일을 업로드해 주세요.", + "Please upload PDFs first.": "먼저 PDF를 업로드해 주세요.", + "Please upload a .docx file first.": "먼저 .docx 파일을 업로드해 주세요.", + "Please upload a PDF file first.": "먼저 PDF 파일을 업로드해 주세요.", + "Please upload a PDF file.": "PDF 파일을 업로드해 주세요.", + "Please upload a PDF first.": "먼저 PDF를 업로드해 주세요.", + "Please upload a valid PDF file.": "올바른 PDF 파일을 업로드해 주세요.", + "Please upload at least one PDF file.": "PDF 파일을 하나 이상 업로드해 주세요.", + "Please upload at least two PDF files to alternate and mix.": "교차 병합하려면 PDF 파일을 두 개 이상 업로드해 주세요.", + "Please upload both a base PDF and an overlay/underlay PDF.": "기본 PDF와 오버레이/언더레이 PDF를 모두 업로드해 주세요.", + "Please upload valid PDF files.": "올바른 PDF 파일을 업로드해 주세요.", + "Please use the Download button in the PDF viewer toolbar above.": "위쪽 PDF 뷰어 도구 모음의 다운로드 버튼을 사용해 주세요.", + "Please wait for the PDF viewer to load.": "PDF 뷰어가 로드될 때까지 기다려 주세요.", + "Please wait for the form to finish loading.": "양식 로딩이 끝날 때까지 기다려 주세요.", + "Portrait": "세로 방향", + "Position": "위치", + "Post-processing for transparency compliance...": "투명도 규격 준수를 위한 후처리 중...", + "Posterize": "포스터화", + "Posterizing PDF...": "PDF 포스터화 중...", + "PowerPoint to PDF": "PowerPoint를 PDF로", + "Pre Flatten": "사전 평탄화", + "Pre-flattening PDF...": "PDF 사전 평탄화 중...", + "Prefer JPEG 2000 for photos": "사진에는 JPEG 2000 우선 사용", + "Preparing PDF export...": "PDF 내보내기 준비 중...", + "Preparing conversion...": "변환 준비 중...", + "Preparing download...": "다운로드 준비 중...", + "Preparing preview...": "미리보기 준비 중...", + "Presentations": "프레젠테이션", + "Preserve PDF/A": "PDF/A 유지", + "Preview": "미리보기", + "Preview Error": "미리보기 오류", + "Preview Text": "텍스트 미리보기", + "Previous page": "이전 페이지", + "Print Form": "양식 인쇄", + "Private data that editing apps store inside the PDF.": "편집 앱이 PDF 안에 저장하는 비공개 데이터입니다.", + "Processed {{processedCount}} PDFs.": "PDF {{processedCount}}개를 처리했습니다.", + "Processing Complete": "처리 완료", + "Processing Dpi": "처리 DPI", + "Processing Failed": "처리 실패", + "Processing PDF permissions...": "PDF 권한 처리 중...", + "Processing attachments...": "첨부파일 처리 중...", + "Processing failed for {{name}}.": "{{name}} 처리에 실패했습니다.", + "Processing file {{n}} of {{length}}...": "{{n}}/{{length}}번째 파일 처리 중...", + "Processing images...": "이미지 처리 중...", + "Processing multiple PDFs...": "여러 PDF 처리 중...", + "Processing page {{i}} of {{numPages}}": "{{i}}/{{numPages}}페이지 처리 중", + "Processing page {{i}} of {{numPages}}...": "{{i}}/{{numPages}}페이지 처리 중...", + "Processing page {{n}} of {{length}}...": "{{n}}/{{length}}페이지 처리 중...", + "Processing page {{pageNum}} of {{length}}...": "{{pageNum}}/{{length}}페이지 처리 중...", + "Processing page {{pageNum}} of {{totalPages}}...": "{{pageNum}}/{{totalPages}}페이지 처리 중...", + "Processing produced an empty file.": "처리 결과 빈 파일이 만들어졌습니다.", + "Processing resulted in an empty file.": "처리 결과 빈 파일이 만들어졌습니다.", + "Processing sheet {{n}}...": "{{n}}번째 시트 처리 중...", + "Processing {{name}}...": "{{name}} 처리 중...", + "Processing {{nodeName}}...": "{{nodeName}} 처리 중...", + "Processing {{n}}/{{length}}: {{name}}...": "처리 중 {{n}}/{{length}}: {{name}}...", + "Processing...": "처리 중...", + "Producer": "생성 도구", + "Publisher Files": "Publisher 파일", + "Purple": "보라색", + "PyMuPDF (Document Processing)": "PyMuPDF (문서 처리)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF가 설정되지 않았습니다. 고급 설정에서 설정해 주세요.", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDF 모듈이 예상한 PyMuPDF 클래스를 내보내지 않았습니다.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF가 빈 복호화 파일을 만들었습니다.", + "PyMuPDF: not configured.": "PyMuPDF: 설정되지 않았습니다.", + "QR Code": "QR 코드", + "Quality": "품질", + "Quits application (cannot be overridden)": "앱을 종료합니다 (변경할 수 없음)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1 서명이 서명자의 공개 키로 검증되지 않습니다", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS 서명이 서명자의 공개 키로 검증되지 않습니다", + "Rasterization Complete": "래스터화 완료", + "Rasterization Partial": "일부만 래스터화됨", + "Rasterize": "래스터화", + "Rasterize Dpi": "래스터화 DPI", + "Rasterize pages to images": "페이지를 이미지로 래스터화", + "Rasterize quality": "래스터화 품질", + "Rasterize resolution (DPI)": "래스터화 해상도 (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "PDF {{completed}}개 래스터화 완료, {{failed}}개 실패.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "{{name}} 래스터화 중 ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "{{name}} 래스터화 중...", + "Rasterizing...": "래스터화 중...", + "Rating must be between 0 and 5": "평점은 0에서 5 사이여야 합니다", + "Read Only": "읽기 전용", + "Reading CSV file...": "CSV 파일 읽는 중...", + "Reading PDF...": "PDF 읽는 중...", + "Reading XML file...": "XML 파일 읽는 중...", + "Reading encrypted PDF...": "암호화된 PDF 읽는 중...", + "Reading files...": "파일 읽는 중...", + "Reading layer configuration...": "레이어 설정 읽는 중...", + "Reading {{name}} ({{n}}/{{length}})...": "{{name}} 읽는 중 ({{n}}/{{length}})...", + "Ready": "준비됨", + "Reason": "사유", + "Red": "빨간색", + "Redact": "교정", + "Redact Mode": "교정 모드", + "Redact text from PDF": "PDF에서 텍스트 교정", + "Redaction Failed": "교정 실패", + "Reduce PDF file size": "PDF 파일 크기 줄이기", + "Reduce color complexity": "색상 복잡도 줄이기", + "Reduces file size by removing color information.": "색상 정보를 제거하여 파일 크기를 줄입니다.", + "Reloads page": "페이지를 새로고침합니다", + "Remove": "제거", + "Remove All Attachments": "모든 첨부파일 제거", + "Remove Annotations": "주석 제거", + "Remove Blank Pages": "빈 페이지 제거", + "Remove Embedded Files": "포함된 파일 제거", + "Remove Fonts": "글꼴 제거", + "Remove Javascript": "JavaScript 제거", + "Remove Layers": "레이어 제거", + "Remove Links": "링크 제거", + "Remove Mark Info": "마크 정보 제거", + "Remove Metadata": "메타데이터 제거", + "Remove PDF password protection": "PDF 비밀번호 보호 제거", + "Remove Structure Tree": "구조 트리 제거", + "Remove alternate images": "대체 이미지 제거", + "Remove application data": "애플리케이션 데이터 제거", + "Remove article threads": "기사 스레드 제거", + "Remove attachment": "첨부파일 제거", + "Remove blank pages automatically": "빈 페이지 자동 제거", + "Remove document structure tree": "문서 구조 트리 제거", + "Remove file": "파일 제거", + "Remove metadata, scripts, and hidden data": "메타데이터, 스크립트, 숨겨진 데이터 제거", + "Remove output intents": "출력 인텐트 제거", + "Remove page thumbnails": "페이지 썸네일 제거", + "Remove specific pages": "특정 페이지 제거", + "Remove web capture information": "웹 캡처 정보 제거", + "Remove {{name}}": "{{name}} 제거", + "Removed \"{{beforeText}}\"": "\"{{beforeText}}\" 제거됨", + "Removed image ({{width}}×{{height}})": "이미지 제거됨 ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "빈 페이지 {{length}}개를 제거했습니다!", + "Removing all metadata...": "모든 메타데이터 제거 중...", + "Removing annotations...": "주석 제거 중...", + "Removing redacted text from document data...": "문서 데이터에서 교정된 텍스트 제거 중...", + "Removing restrictions...": "제한 해제 중...", + "Removing {{length}} blank page(s)...": "빈 페이지 {{length}}개 제거 중...", + "Render Error": "렌더링 오류", + "Rendering Page {{num}}...": "{{num}}페이지 렌더링 중...", + "Rendering page previews...": "페이지 미리보기 렌더링 중...", + "Rendering page previews: {{current}}/{{total}}": "페이지 미리보기 렌더링 중: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "{{n}}/{{length}}페이지 렌더링 중...", + "Rendering preview for page {{pageNum}}...": "{{pageNum}}페이지 미리보기 렌더링 중...", + "Reopens closed tab": "닫은 탭을 다시 엽니다", + "Repair": "복구", + "Repair Failed": "복구 실패", + "Repair corrupted PDF": "손상된 PDF 복구", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "파일 {{length}}개를 복구했습니다. 복구 실패: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "{{name}} 복구 중 ({{n}}/{{length}})...", + "Repairing {{name}}...": "{{name}} 복구 중...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "\"{{beforeText}}\"을(를) \"{{afterText}}\"(으)로 바꿨습니다", + "Required": "필수", + "Resamples even when an image is only slightly above the limit.": "이미지가 제한을 조금만 넘어도 리샘플링합니다.", + "Reset Form": "양식 초기화", + "Reset and go back to file uploader? All unsaved changes will be lost.": "초기화하고 파일 업로드 화면으로 돌아갈까요? 저장하지 않은 변경 사항은 모두 사라집니다.", + "Resolution": "해상도", + "Retain Page Labels": "페이지 레이블 유지", + "Retry Failed": "실패한 항목 다시 시도", + "Reverse Pages": "페이지 역순 정렬", + "Reverse page order": "페이지 순서 뒤집기", + "Reversing page order...": "페이지 순서 뒤집는 중...", + "Reversing {{name}} ({{n}}/{{length}})...": "{{name}} 역순 정렬 중 ({{n}}/{{length}})...", + "Right": "오른쪽", + "Right edge in points": "오른쪽 여백 (포인트)", + "Rotate": "회전", + "Rotate +90°": "+90° 회전", + "Rotate all pages": "모든 페이지 회전", + "Rotation": "회전", + "Rotation Variance": "회전 편차", + "Rotations applied successfully!": "회전을 적용했습니다!", + "Rows": "행", + "Run Javascript": "JavaScript 실행", + "Running OCR on page {{pageNum}}...": "{{pageNum}}페이지에서 OCR 실행 중...", + "Running...": "실행 중...", + "SVG": "SVG", + "SVG Files": "SVG 파일", + "SVG to PDF": "SVG를 PDF로", + "Sanitize": "정리", + "Sanitized With Warnings": "경고와 함께 정리됨", + "Sanitizing PDF...": "PDF 정리 중...", + "Saturation": "채도", + "Saved": "저장됨", + "Saving PDF with layer changes...": "레이어 변경 사항이 적용된 PDF 저장 중...", + "Scaling Mode": "배율 모드", + "Scanner Effect": "스캔 효과", + "Scanner effect applied successfully!": "스캐너 효과를 적용했습니다!", + "Scanning page {{n}} of {{pageCount}}...": "{{n}}/{{pageCount}}페이지 스캔 중...", + "Search Text": "텍스트 검색", + "Search languages...": "언어 검색...", + "Select Font": "글꼴 선택", + "Select a field to edit properties": "속성을 편집할 필드를 선택하세요", + "Select a field...": "필드 선택...", + "Select to add this button to an existing group": "이 버튼을 기존 그룹에 추가하려면 선택하세요", + "Selected Option": "선택된 옵션", + "Self-Signed: Signer Identity Not Verified": "자체 서명됨: 서명자 신원 미확인", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "자체 호스팅 OCR 에셋이 일부만 설정되어 있습니다. 다른 Tesseract 에셋 URL과 함께 {{missing}}도 설정해 주세요.", + "Separator": "구분선", + "Separator Color": "구분선 색상", + "Separator Thickness": "구분선 두께", + "Sepia": "세피아", + "Serial Number:": "일련번호:", + "Set custom destination": "사용자 지정 대상 설정", + "Shapes": "도형", + "Sheet {{n}} {{sideLabel}}": "시트 {{n}} {{sideLabel}}", + "Show": "표시", + "Show password": "비밀번호 표시", + "Show/Hide Field": "필드 표시/숨기기", + "Sign Here": "여기에 서명", + "Signature /Contents is not a single DER object followed by zero padding": "서명 /Contents가 0 패딩이 뒤따르는 단일 DER 개체가 아닙니다", + "Signature Algorithm:": "서명 알고리즘:", + "Signature Intact: Signer Identity Not Verified": "서명 온전함: 서명자 신원 미확인", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "서명 필드는 AcroForm 서명 필드이며 고급 PDF 뷰어에서만 표시됩니다.", + "Signature has a missing or malformed /ByteRange": "서명에 /ByteRange가 없거나 형식이 올바르지 않습니다", + "Signature scheme {{kind}} not implemented": "서명 방식 {{kind}}은(는) 구현되지 않았습니다", + "Signature {{n}}": "서명 {{n}}", + "Signatures": "서명", + "Signed By": "서명자", + "Signed On": "서명 일시", + "Signed PDF Not Changed": "서명된 PDF 변경 없음", + "Signed PDF downloaded successfully!": "서명된 PDF를 다운로드했습니다!", + "Signed PDF saved successfully!": "서명된 PDF를 저장했습니다!", + "Simple (1, 2, 3)": "단순 (1, 2, 3)", + "Simplify large color profiles": "큰 색상 프로필 단순화", + "Skew Threshold": "기울기 임계값", + "Skip": "건너뛰기", + "Skip All": "모두 건너뛰기", + "Skip Remaining": "나머지 건너뛰기", + "Skip this file": "이 파일 건너뛰기", + "Skipped: {{join}}.": "건너뜀: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "파일이 작아지지만 Firefox, MuPDF 1.26 이상, Ghostscript 10.06 이상처럼 Brotli를 지원하는 리더에서만 열 수 있습니다.", + "Some files were skipped because they are not supported images.": "지원하지 않는 이미지라서 일부 파일을 건너뛰었습니다.", + "Some files were skipped. Only BMP files are allowed.": "일부 파일을 건너뛰었습니다. BMP 파일만 사용할 수 있습니다.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "일부 파일을 건너뛰었습니다. HEIC/HEIF 파일만 사용할 수 있습니다.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "일부 파일을 건너뛰었습니다. JPG, JPEG, JP2, JPX 파일만 사용할 수 있습니다.", + "Some files were skipped. Only PDF files are allowed.": "일부 파일을 건너뛰었습니다. PDF 파일만 사용할 수 있습니다.", + "Some files were skipped. Only PNG images are allowed.": "일부 파일을 건너뛰었습니다. PNG 이미지만 사용할 수 있습니다.", + "Some files were skipped. Only SVG graphics are allowed.": "일부 파일을 건너뛰었습니다. SVG 그래픽만 사용할 수 있습니다.", + "Some files were skipped. Only TIFF files are allowed.": "일부 파일을 건너뛰었습니다. TIFF 파일만 사용할 수 있습니다.", + "Some files were skipped. Only WebP images are allowed.": "일부 파일을 건너뛰었습니다. WebP 이미지만 사용할 수 있습니다.", + "Some files were skipped. Only supported image formats are allowed.": "일부 파일을 건너뛰었습니다. 지원되는 이미지 형식만 사용할 수 있습니다.", + "Some files were skipped. Only text files are allowed.": "일부 파일을 건너뛰었습니다. 텍스트 파일만 사용할 수 있습니다.", + "Some pages could not be processed. Please try again.": "일부 페이지를 처리할 수 없었습니다. 다시 시도해 주세요.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "일부 교정 표시를 적용할 수 없어 파일을 다운로드하지 않았습니다. 편집기에서 적용하거나 제거한 후 다시 시도해 주세요.", + "Spacing": "간격", + "Split PDF": "PDF 분할", + "Split by Bookmarks": "북마크별로 분할", + "Split pages into tile grid for poster printing": "포스터 인쇄용으로 페이지를 타일 격자로 분할", + "Split pages vertically or horizontally": "페이지를 세로 또는 가로로 분할", + "Splitting PDF pages...": "PDF 페이지 분할 중...", + "Splitting PDF...": "PDF 분할 중...", + "Spreadsheets": "스프레드시트", + "Standard (192 DPI)": "표준 (192 DPI)", + "Standard Size": "표준 크기", + "Standardize all pages to a target size": "모든 페이지를 목표 크기로 통일", + "Standardizing pages...": "페이지 크기 통일 중...", + "Stitch all pages into one continuous page": "모든 페이지를 이어 붙여 하나의 연속된 페이지로 만들기", + "Straighten skewed PDF pages": "기울어진 PDF 페이지 바로잡기", + "Strip all annotations": "모든 주석 제거", + "Style": "스타일", + "Style Changed": "스타일 변경됨", + "Style changed ({{length}} regions)": "스타일 변경됨 ({{length}}개 영역)", + "Subject": "제목", + "Subset embedded fonts": "포함된 글꼴 서브셋 만들기", + "Success": "성공", + "Success!": "성공!", + "Successfully converted {{length}} CSV file(s) to PDF.": "CSV 파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Excel 파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} ODT file(s) to PDF.": "ODT 파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} PDF(s) to DOCX.": "PDF {{length}}개를 DOCX로 변환했습니다.", + "Successfully converted {{length}} PDF(s) to Markdown.": "PDF {{length}}개를 Markdown으로 변환했습니다.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "PDF {{length}}개를 {{level}}(으)로 변환했습니다.", + "Successfully converted {{length}} PSD files to a single PDF.": "PSD 파일 {{length}}개를 하나의 PDF로 변환했습니다.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "PowerPoint 파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} RTF file(s) to PDF.": "RTF 파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} Word document(s) to PDF.": "Word 문서 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} files to PDF.": "파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{TOOL_NAME}} 파일 {{length}}개를 PDF로 변환했습니다.", + "Successfully converted {{name}} to DOCX.": "{{name}}을(를) DOCX로 변환했습니다.", + "Successfully converted {{name}} to Markdown.": "{{name}}을(를) Markdown으로 변환했습니다.", + "Successfully converted {{name}} to PDF.": "{{name}}을(를) PDF로 변환했습니다.", + "Successfully converted {{name}} to {{level}}.": "{{name}}을(를) {{level}}(으)로 변환했습니다.", + "Successfully extracted PDF for AI/LLM use.": "AI/LLM에서 사용할 수 있도록 PDF를 추출했습니다.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "AI/LLM에서 사용할 수 있도록 PDF {{completed}}개를 추출했습니다.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF를 {{dpi}} DPI로 래스터화했습니다.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "PDF {{completed}}개를 {{dpi}} DPI로 래스터화했습니다.", + "Supported: CBZ, CBR": "지원 형식: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "지원 형식: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "지원 형식: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "지원 형식: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "지원 형식: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "지원 형식: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "지원 형식: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "지원 형식: XPS, OXPS", + "Switches apps": "앱을 전환합니다", + "Switches tabs": "탭을 전환합니다", + "Table of Contents": "목차", + "Table {{n}} (Page {{page}})": "표 {{n}} ({{page}}페이지)", + "Tabloid": "Tabloid", + "Target Field": "대상 필드", + "Target Kilobytes": "목표 킬로바이트", + "Target Not Reached": "목표에 도달하지 못함", + "Target Size": "목표 크기", + "Technical Details": "기술 세부 정보", + "Temperature": "색온도", + "Template \"{{name}}\" loaded.": "템플릿 \"{{name}}\"을(를) 불러왔습니다.", + "Template \"{{name}}\" saved.": "템플릿 \"{{name}}\"을(를) 저장했습니다.", + "Text": "텍스트", + "Text Color": "텍스트 색상", + "Text Files": "텍스트 파일", + "Text color changed successfully!": "텍스트 색상을 변경했습니다!", + "Text converted to PDF successfully!": "텍스트를 PDF로 변환했습니다!", + "Text extracted successfully!": "텍스트를 추출했습니다!", + "Text to PDF": "텍스트를 PDF로", + "That password did not open any of the remaining files.": "해당 비밀번호로는 남은 파일을 열 수 없습니다.", + "The PDF file(s) do not contain any attachments to extract.": "PDF 파일에 추출할 첨부파일이 없습니다.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF는 {{totalPages}}페이지라서 {{nValue}}(으)로 나누어떨어지지 않습니다. 마지막 PDF는 {{remainder}}페이지로 구성됩니다.", + "The PDF might be corrupted or password protected.": "PDF가 손상되었거나 비밀번호로 보호되어 있을 수 있습니다.", + "The PDF might be corrupted or password-protected.": "PDF가 손상되었거나 비밀번호로 보호되어 있을 수 있습니다.", + "The PDF might be corrupted.": "PDF가 손상되었을 수 있습니다.", + "The PDF viewer is still initializing.": "PDF 뷰어가 아직 초기화 중입니다.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF를 다운로드했지만 다음 단계를 완료하지 못했습니다: {{join}}. 해당 내용이 파일에 남아 있을 수 있습니다.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL이 예상하지 못한 콘텐츠 유형을 반환했습니다: {{contentType}}. JavaScript 파일이 필요합니다.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "/ByteRange에서 제외된 바이트가 16진수로 인코딩된 서명과 정확히 일치하지 않습니다", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "/ByteRange에서 제외된 바이트가 이 서명의 /Contents가 아닙니다", + "The compression engine returned an unreadable result.": "압축 엔진이 읽을 수 없는 결과를 반환했습니다.", + "The compression engine stopped unexpectedly.": "압축 엔진이 예기치 않게 중지되었습니다.", + "The current password you entered is incorrect. Please try again.": "입력한 현재 비밀번호가 올바르지 않습니다. 다시 시도해 주세요.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "업로드한 PDF에 다음 필드 이름이 이미 있습니다: {{conflictList}}. 다운로드하기 전에 이 필드의 이름을 바꿔 주세요.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "다음 필드 이름이 두 번 이상 사용되었습니다: {{duplicateList}}. 다운로드하기 전에 고유한 이름으로 바꿔 주세요.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "지정한 페이지 수({{length}})가 문서의 현재 페이지 수({{currentGridCount}})와 일치하지 않습니다. 모든 페이지의 순서를 빠짐없이 입력해 주세요.", + "The password you entered is incorrect. Please try again.": "입력한 비밀번호가 올바르지 않습니다. 다시 시도해 주세요.", + "The password you entered is wrong or the file is corrupted.": "입력한 비밀번호가 틀렸거나 파일이 손상되었습니다.", + "The provided file could not be loaded as an image. It may be corrupted.": "제공한 파일을 이미지로 불러올 수 없습니다. 파일이 손상되었을 수 있습니다.", + "The requested OCR language is not available: {{unavailableText}}.": "요청한 OCR 언어를 사용할 수 없습니다: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "지정한 페이지 순서가 불완전하거나 올바르지 않은 페이지 번호가 포함되어 있습니다. 원래의 모든 페이지에 새 위치를 지정해 주세요.", + "These files are not valid PDFs, so they were not added: {{names}}.": "다음 파일은 올바른 PDF가 아니어서 추가하지 않았습니다: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "다음 파일은 비밀번호로 보호되어 있습니다: {{names}}. 파일 카드에서 비밀번호를 입력하거나 파일을 제거한 후 다시 압축해 주세요.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "이 BentoPDF 빌드에는 {{availableText}}의 OCR 데이터만 포함되어 있습니다.", + "This PDF does not contain any digital signatures.": "이 PDF에는 디지털 서명이 없습니다.", + "This PDF has no layers (OCG).": "이 PDF에는 레이어(OCG)가 없습니다.", + "This PDF is password-protected. Please enter the current password to proceed.": "이 PDF는 비밀번호로 보호되어 있습니다. 계속하려면 현재 비밀번호를 입력해 주세요.", + "This document contains pages with different dimensions:": "이 문서에는 크기가 다른 페이지가 있습니다:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "이 문서에 아직 적용되지 않은 가림 표시가 1개 있습니다. 표시를 적용하기 전까지는 그 아래의 내용이 파일에 남아 있습니다. 모든 표시를 적용하고 다운로드할까요?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "이 문서에 아직 적용되지 않은 가림 표시가 {{count}}개 있습니다. 표시를 적용하기 전까지는 그 아래의 내용이 파일에 남아 있습니다. 모든 표시를 적용하고 다운로드할까요?", + "This feature requires {{name}} to be configured.": "이 기능을 사용하려면 {{name}}을(를) 설정해야 합니다.", + "This file is not a valid PDF.": "올바른 PDF 파일이 아닙니다.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "이 모듈은 AGPL-3.0 라이선스로 제공됩니다. 설정하면 해당 라이선스 조건에 동의하는 것으로 간주됩니다.", + "This tool has been disabled": "이 도구는 사용할 수 없도록 설정되어 있습니다", + "This tool is not available in your deployment. Contact your administrator for more information.": "이 도구는 현재 배포 환경에서 사용할 수 없습니다. 자세한 내용은 관리자에게 문의하세요.", + "Threshold": "임계값", + "Tile": "타일", + "Tile Gap X": "타일 가로 간격", + "Tile Gap Y": "타일 세로 간격", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "타임스탬프", + "Timestamp Failed": "타임스탬프 실패", + "Tint": "색조", + "Title": "제목", + "To actually fill or change the options, use our PDF Form Filler tool.": "옵션을 실제로 작성하거나 변경하려면 PDF 양식 작성 도구를 사용하세요.", + "Toggle": "전환", + "Toggle style": "스타일 전환", + "Toggle sync scroll": "동기 스크롤 전환", + "Tool Unavailable": "도구를 사용할 수 없음", + "Tooltip / Help Text": "툴팁 / 도움말 텍스트", + "Top": "위", + "Top Center": "위 가운데", + "Top Left": "위 왼쪽", + "Top Right": "위 오른쪽", + "Top edge in points": "위쪽 여백 (포인트)", + "Total Pages": "전체 페이지 수", + "Transparent Background": "투명 배경", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "각 이미지에 JPEG 2000과 JPEG를 모두 시도하여 더 작은 쪽을 사용합니다.", + "Trim margins from all pages": "모든 페이지의 여백 다듬기", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "신뢰 검증: 사용자 지정 인증서로 서명 {{length}}개 중 {{trustVerified}}개 검증됨", + "Trusted": "신뢰함", + "Trusted certificate loaded": "신뢰할 수 있는 인증서를 불러왔습니다", + "Tsa Url": "TSA URL", + "Turns off quality, resolution and every other lossy image step.": "품질, 해상도 등 이미지 손실 압축 단계를 모두 끕니다.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL은 http:// 또는 https://로 시작해야 합니다", + "Ultra (384 DPI)": "울트라 (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "입력한 비밀번호로 PDF를 복호화할 수 없습니다.", + "Unable to repair any of the uploaded PDF files.": "업로드한 PDF 파일을 하나도 복구할 수 없습니다.", + "Unembed standard fonts": "표준 글꼴 포함 해제", + "Unembed standard-font look-alikes": "표준 글꼴과 비슷한 글꼴 포함 해제", + "Unexpected delimiter in content stream": "콘텐츠 스트림에 예기치 않은 구분 기호가 있습니다", + "Unexpected reply from the engine.": "엔진에서 예기치 않은 응답이 왔습니다.", + "Uniform": "균일", + "Unique Page Sizes": "고유한 페이지 크기", + "Unknown": "알 수 없음", + "Unknown error": "알 수 없는 오류", + "Unknown error occurred in worker.": "워커에서 알 수 없는 오류가 발생했습니다.", + "Unknown error occurred.": "알 수 없는 오류가 발생했습니다.", + "Unlock": "잠금 해제", + "Unlock All": "모두 잠금 해제", + "Unlock Remaining ({{remaining}})": "나머지 잠금 해제 ({{remaining}})", + "Unlocked": "잠금 해제됨", + "Unlocked {{unlocked}} of {{length}} files.": "파일 {{length}}개 중 {{unlocked}}개의 잠금을 해제했습니다.", + "Unlocking...": "잠금 해제 중...", + "Unresolved optional content reference": "확인되지 않은 선택적 콘텐츠 참조", + "Unsupported ECDSA curve in signer certificate": "서명자 인증서의 ECDSA 곡선을 지원하지 않습니다", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "지원하지 않는 이미지입니다. 워터마크에는 PNG 또는 JPG를 사용해 주세요.", + "Unsupported digest OID {{digestOid}}": "지원하지 않는 다이제스트 OID {{digestOid}}", + "Unsupported file type: .{{ext}}": "지원하지 않는 파일 형식: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "지원하지 않는 서명 알고리즘 OID {{oid}}", + "Unterminated array or dictionary in content stream": "콘텐츠 스트림의 배열 또는 사전이 닫히지 않았습니다", + "Unterminated hex string in content stream": "콘텐츠 스트림의 16진수 문자열이 닫히지 않았습니다", + "Unterminated inline image in content stream": "콘텐츠 스트림의 인라인 이미지가 닫히지 않았습니다", + "Unterminated string in content stream": "콘텐츠 스트림의 문자열이 닫히지 않았습니다", + "Unverified: Unsupported Signature Algorithm": "미검증: 지원하지 않는 서명 알고리즘", + "Updating metadata...": "메타데이터 업데이트 중...", + "Upload Certificate": "인증서 업로드", + "Upload Comics": "만화 업로드", + "Upload Documents": "문서 업로드", + "Upload EPUB Files": "EPUB 파일 업로드", + "Upload Email Files": "이메일 파일 업로드", + "Upload FB2 Files": "FB2 파일 업로드", + "Upload Images": "이미지 업로드", + "Upload JSON Files": "JSON 파일 업로드", + "Upload MOBI Files": "MOBI 파일 업로드", + "Upload Markdown Files": "Markdown 파일 업로드", + "Upload ODG Files": "ODG 파일 업로드", + "Upload PDFs": "PDF 업로드", + "Upload PUB Files": "PUB 파일 업로드", + "Upload Pages Files": "Pages 파일 업로드", + "Upload Presentations": "프레젠테이션 업로드", + "Upload SVG Files": "SVG 파일 업로드", + "Upload Spreadsheets": "스프레드시트 업로드", + "Upload Text Files": "텍스트 파일 업로드", + "Upload Visio Files": "Visio 파일 업로드", + "Upload WPD Files": "WPD 파일 업로드", + "Upload WPS Files": "WPS 파일 업로드", + "Upload XML Files": "XML 파일 업로드", + "Upload XPS Files": "XPS 파일 업로드", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "PDF를 업로드하고 \"미리보기 생성\"을 클릭하면 소책자 레이아웃을 볼 수 있습니다", + "Upload images and convert to PDF": "이미지를 업로드하여 PDF로 변환", + "Upload one or more PDF files": "PDF 파일을 하나 이상 업로드하세요", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "대문자 A-Z, 숫자 0-9, 그리고 - . $ / + % 공백", + "Use same password for all files": "모든 파일에 같은 비밀번호 사용", + "User Password": "사용자 비밀번호", + "VSD to PDF": "VSD를 PDF로", + "Valid From": "유효 시작일", + "Valid Signature": "유효한 서명", + "Valid Until": "유효 종료일", + "Validating {{n}} of {{length}}: {{name}}": "검증 중 {{n}}/{{length}}: {{name}}", + "Validating...": "검증 중...", + "Value": "값", + "Value (e.g., Marketing)": "값 (예: 마케팅)", + "Vertical": "세로", + "Viewer not ready": "뷰어가 준비되지 않았습니다", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "뷰어가 준비되지 않았습니다. PDF를 업로드하고 로딩이 끝날 때까지 기다려 주세요.", + "Visibility": "표시 여부", + "Visio Files": "Visio 파일", + "WPD to PDF": "WPD를 PDF로", + "WPS Files": "WPS 파일", + "WPS to PDF": "WPS를 PDF로", + "Watermark": "워터마크", + "Watermark added successfully!": "워터마크를 추가했습니다!", + "Web Crypto API not available in this context": "이 환경에서는 Web Crypto API를 사용할 수 없습니다", + "Web Crypto import/verify failed: {{error}}": "Web Crypto 가져오기/검증 실패: {{error}}", + "WebP": "WebP", + "Whitelist": "허용 목록", + "Width ({{unit}})": "너비 ({{unit}})", + "Word": "Word", + "Word Documents": "Word 문서", + "Word to PDF": "Word를 PDF로", + "WordPerfect Files": "WordPerfect 파일", + "Worker crashed": "워커가 중단되었습니다", + "Worker error occurred. Check console for details.": "워커 오류가 발생했습니다. 자세한 내용은 콘솔을 확인하세요.", + "Workflow completed": "워크플로우 완료", + "Wrong password": "비밀번호가 틀렸습니다", + "Wrong password for: {{join}}": "비밀번호가 틀린 파일: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "\"{{name}}\"의 비밀번호가 틀렸거나 복호화하지 못했습니다.", + "X Position": "X 위치", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XML 파일", + "XML to PDF": "XML을 PDF로", + "XMP Metadata": "XMP 메타데이터", + "XPS Files": "XPS 파일", + "XPS to PDF": "XPS를 PDF로", + "Y Position": "Y 위치", + "Year must be between 1900 and 2100": "연도는 1900에서 2100 사이여야 합니다", + "Yellow": "노란색", + "Yellowish": "노란빛", + "You cannot delete the last page of the document.": "문서의 마지막 페이지는 삭제할 수 없습니다.", + "Your PDF has been cropped and the download has started.": "PDF를 잘랐고 다운로드가 시작되었습니다.", + "Your PDF has been downloaded successfully.": "PDF를 다운로드했습니다.", + "Your PDF has been posterized.": "PDF를 포스터화했습니다.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "교정 내용을 페이지에 적용했지만, 이 파일은 암호화되어 있어 BentoPDF가 속성, 북마크, 첨부파일에 남아 있는 교정된 텍스트의 사본까지 제거할 수는 없습니다. 완전히 정리하려면 암호화되지 않은 사본을 교정한 뒤 PDF 보호로 비밀번호를 추가하세요. 그래도 다운로드할까요?", + "Your workflow needs at least one input node and one output node to run.": "워크플로우를 실행하려면 입력 노드와 출력 노드가 각각 하나 이상 필요합니다.", + "ZIP archive created successfully!": "ZIP 압축 파일을 만들었습니다!", + "Zoom(%)": "확대/축소(%)", + "e.g. dd/mm/yyyy HH:MM:ss": "예: dd/mm/yyyy HH:MM:ss", + "form": "양식", + "https://example.com": "https://example.com", + "signature found": "개의 서명을 찾았습니다", + "signatures found": "개의 서명을 찾았습니다", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "노드 {{count}}개", + "{{count}} nodes": "노드 {{count}}개", + "{{fileSize}} • 1 page": "{{fileSize}} • 1페이지", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}}페이지", + "{{length}} Files Need a Password": "파일 {{length}}개에 비밀번호가 필요합니다", + "{{length}} PDF file(s) selected": "PDF 파일 {{length}}개 선택됨", + "{{length}} PDF files selected": "PDF 파일 {{length}}개 선택됨", + "{{length}} attachment(s) extracted successfully!": "첨부파일 {{length}}개를 추출했습니다!", + "{{length}} file • {{totalPages}} total pages": "파일 {{length}}개 • 총 {{totalPages}}페이지", + "{{length}} file(s) attached successfully.": "파일 {{length}}개를 첨부했습니다.", + "{{length}} files • {{totalPages}} total pages": "파일 {{length}}개 • 총 {{totalPages}}페이지", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} 비밀번호로 보호된 파일이었으므로 압축본에는 비밀번호가 없습니다. PDF 보호로 다시 추가하세요.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}}페이지)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}}은(는) 디지털 서명이 되어 있어 그대로 두었습니다. 압축하면 서명이 손상됩니다. 그래도 압축하려면 사용자 지정 설정에서 콘텐츠 보호 무시를 켜세요. 서명은 제거됩니다.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}}은(는) 올바른 PDF가 아니어서 추가하지 않았습니다.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}}은(는) 비밀번호로 보호되어 있습니다. 파일 카드에서 비밀번호를 입력한 후 다시 압축해 주세요.", + "{{name}}... (p{{pageNumber}})": "{{name}}... ({{pageNumber}}페이지)", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • 페이지 수를 불러올 수 없습니다", + "{{size}} • Loading pages...": "{{size}} • 페이지 불러오는 중...", + "{{size}} • Loading...": "{{size}} • 불러오는 중...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}}페이지", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}}페이지", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}}페이지", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}}페이지", + "{{size}} • {{value}} pages": "{{size}} • {{value}}페이지", + "{{successCount}} PDF(s) decrypted successfully.": "PDF {{successCount}}개를 복호화했습니다.", + "{{successCount}} PDF(s) linearized successfully.": "PDF {{successCount}}개를 선형화했습니다.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}}페이지 → 출력 시트 {{numSheets}}장", + "{{validCount}} valid": "유효 {{validCount}}개", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1페이지", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}}페이지" +} diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 8f9c5fc8..94d1b512 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Hoofdmenu openen", "language": "Taal", "searchLanguage": "Taal zoeken…", - "noLanguagesFound": "Geen talen gevonden" + "noLanguagesFound": "Geen talen gevonden", + "breadcrumb": "Broodkruimelpad" }, "donation": { "message": "Vind je BentoPDF geweldig? Help ons het gratis en open source te houden!", @@ -236,6 +237,10 @@ "aboutUs": "Over ons", "faqLink": "Veelgestelde vragen", "contactUs": "Contact", + "tools": "Tools", + "pdfConverter": "PDF-converter", + "pdfSecurity": "PDF-beveiliging", + "mergeSplit": "PDF samenvoegen en splitsen", "legal": "Juridisch", "termsAndConditions": "Algemene voorwaarden", "privacyPolicy": "Privacybeleid", diff --git a/public/locales/nl/tools.json b/public/locales/nl/tools.json index 44c3e6c9..e0e5f0d0 100644 --- a/public/locales/nl/tools.json +++ b/public/locales/nl/tools.json @@ -20,29 +20,44 @@ }, "convertToPdf": "Naar PDF converteren", "pdfMultiTool": { - "name": "PDF Multi-tool", + "name": "PDF-multitool", "subtitle": "Samenvoegen, Splitsen, Organiseren, Verwijderen, Roteren, Blanco pagina's toevoegen, Extraheren and Dupliceren in één enkele werkomgeving." }, "mergePdf": { - "name": "PDF Samenvoegen", + "name": "PDF samenvoegen", "subtitle": "Meerdere PDF's combineren tot één bestand. Bladwijzers behouden.", "retainPageLabels": "Originele pagina-labels van elk bestand behouden", - "retainPageLabelsHint": "Uit (standaard): de samengevoegde PDF gebruikt natuurlijke paginanummering 1–N. Aan: de originele pagina-labels van elk bestand blijven behouden (kan dubbele labels opleveren)." + "retainPageLabelsHint": "Uit (standaard): de samengevoegde PDF gebruikt natuurlijke paginanummering 1–N. Aan: de originele pagina-labels van elk bestand blijven behouden (kan dubbele labels opleveren).", + "removeDuplicateFonts": "Dubbele lettertypen verwijderen", + "alert": { + "thumbnailError": "Paginaminiaturen konden niet worden weergegeven", + "noSelection": "Geen bestanden of pagina's geselecteerd om samen te voegen.", + "mergeSuccess": "PDF's succesvol samengevoegd!", + "mergeFailed": "Samenvoegen van PDF's mislukt.", + "mergeError": "Samenvoegen van PDF's mislukt. Controleer of alle bestanden geldig zijn en niet met een wachtwoord zijn beveiligd.", + "workerError": "Er is een onverwachte fout opgetreden in de samenvoeg-worker.", + "loadError": "Een of meer PDF-bestanden konden niet worden geladen" + }, + "loader": { + "renderingPreviews": "Paginavoorbeelden weergeven...", + "merging": "PDF's samenvoegen...", + "loadingDocuments": "PDF-documenten laden..." + } }, "splitPdf": { - "name": "PDF Splitsen", + "name": "PDF splitsen", "subtitle": "Een reeks pagina's opslaan in een nieuwe PDF." }, "compressPdf": { - "name": "PDF Comprimeren", + "name": "PDF comprimeren", "subtitle": "De bestandsgrootte van een PDF verkleinen." }, "pdfEditor": { - "name": "PDF Bewerken", + "name": "PDF bewerken", "subtitle": "PDF's annoteren, markeren, redigeren, commentaar toevoegen, vormen/afbeelding toevoegen, doorzoeken and weergeven." }, "editPdfText": { - "name": "PDF-tekst Bewerken", + "name": "PDF-tekst bewerken", "subtitle": "Klik op een alinea en bewerk deze direct, met live tekstomloop, lettertypen en opmaak.", "saved": "PDF is opgeslagen! ({{size}} KB)", "failedToLoad": "Kan de PDF-teksteditor niet laden.", @@ -91,7 +106,7 @@ "tipRedoZ": "Opnieuw (⇧⌘Z)", "tipFileDetails": "Bestandsgegevens", "tipEditExistingContent": "Bestaande inhoud bewerken", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Wat het hulpmiddel Bewerken raakt — beperk het bereik op drukke pagina's", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Wat het hulpmiddel Bewerken raakt: beperk het bereik op drukke pagina's", "tipClickThePageToAddATextBox": "Klik op de pagina om een tekstvak toe te voegen", "tipSpellCheckLanguage": "Taal van de spellingcontrole", "tipFindAndReplace": "Zoeken en vervangen", @@ -164,28 +179,28 @@ "subtitle": "Een of meer JPG-afbeeldingen opslaan als PDF." }, "signPdf": { - "name": "PDF Ondertekenen", + "name": "PDF ondertekenen", "subtitle": "Een handtekening tekenen, typen, of invoegen." }, "cropPdf": { - "name": "PDF Bijsnijden", + "name": "PDF bijsnijden", "subtitle": "De marges aanpassen van alle pagina's in een PDF." }, "extractPages": { - "name": "Pagina's Extraheren", + "name": "Pagina's extraheren", "subtitle": "Een selectie van pagina's opslaan als nieuw bestand." }, "duplicateOrganize": { - "name": "Dupliceren & Organiseren", + "name": "Dupliceren en organiseren", "subtitle": "Pagina's dupliceren, ordenen en verwijderen.", "saveChanges": "Wijzigingen opslaan" }, "deletePages": { - "name": "Pagina's Verwijderen", + "name": "Pagina's verwijderen", "subtitle": "Specifieke pagina's uit een dodocument verwijderen." }, "editBookmarks": { - "name": "Bladwijzers Bewerken", + "name": "Bladwijzers bewerken", "subtitle": "PDF-bladwijzers toevoegen, bewerken, importeren, verwijderen and extraheren.", "autoExtractExisting": "Bestaande bladwijzers automatisch extraheren", "importSectionTitle": "Of bladwijzers importeren", @@ -284,11 +299,11 @@ "applyToAllPages": "Op alle pagina's toepassen" }, "headerFooter": { - "name": "Koptekst & Voettekst", + "name": "Koptekst en voettekst", "subtitle": "Tekst boven- of onderaan de pagina's toevoegen." }, "invertColors": { - "name": "Kleuren Omkeren", + "name": "Kleuren omkeren", "subtitle": "Een \"donkere modus\"-versie van een PDF maken." }, "scannerEffect": { @@ -309,7 +324,7 @@ "processButton": "Scannereffect toepassen" }, "adjustColors": { - "name": "Kleuren Aanpassen", + "name": "Kleuren aanpassen", "subtitle": "Helderheid, contrast, verzadiging en meer aanpassen in een PDF.", "colorSettings": "Kleurinstellingen", "brightness": "Helderheid", @@ -331,7 +346,7 @@ "subtitle": "De tekstkleur van een PDF wijzigen." }, "addStamps": { - "name": "Stempels Toevoegen", + "name": "Stempels toevoegen", "subtitle": "Afbeeldingsstempels toevoegen aan een PDF met de werkbalk Annotatie.", "usernameLabel": "Gebruikersnaam stempelen", "usernamePlaceholder": "Voer je naam in (voor stempels)", @@ -339,24 +354,24 @@ "saveButton": "Gestempelde PDF opslaan" }, "removeAnnotations": { - "name": "Annotaties Verwijderen", + "name": "Annotaties verwijderen", "subtitle": "Commentaar, markeringen en links verwijderen." }, "pdfFormFiller": { - "name": "PDF-formulier Invullen", + "name": "PDF-formulier invullen", "subtitle": "Formulieren invullen vanuit de browser, incl. ondersteuning voor XFA-formulieren.", "uploadHint": "Upload een PDF met formuliervelden. Vul ze direct in in de viewer hieronder en klik op de knop om het ingevulde formulier op te slaan en te downloaden. Ondersteunt ook XFA-formulieren.", "xfaNoteTitle": "Opmerking over XFA-formulieren:", "xfaNoteDescription": "XFA (XML Forms Architecture) is een verouderd formaat dat alleen door bepaalde PDF-viewers zoals BentoPDF en Firefox wordt ondersteund. Als je een XFA-PDF in andere software opent en lege pagina's of geen formuliervelden ziet, betekent dat dat die viewer XFA niet ondersteunt. Om XFA-formulieren correct te bekijken en in te vullen, gebruik je Firefox of de Form Filler van BentoPDF." }, "createPdfForm": { - "name": "PDF-formulier Aanmaken", + "name": "PDF-formulier aanmaken", "subtitle": "Invulbare PDF-formulieren aanmaken met drag-and-drop tekstvelden.", "orSeparator": "OF", "createBlankPdf": "Lege PDF maken" }, "removeBlankPages": { - "name": "Blanco pagina's Verwijderen", + "name": "Blanco pagina's verwijderen", "subtitle": "Blanco pagina's automatisch detecteren en verwijderen.", "sensitivityHint": "Hoger = strenger, alleen volledig lege pagina's. Lager = staat pagina's met enige inhoud toe." }, @@ -503,7 +518,8 @@ "noFile": "Geen bestand", "noFileExplanation": "Laad eerst een PDF-bestand.", "conversionSuccess": "PDF met succes omgezet naar TIFF's!", - "conversionError": "Conversie van PDF naar TIFF is mislukt. Het bestand kan beschadigd zijn." + "conversionError": "Conversie van PDF naar TIFF is mislukt. Het bestand kan beschadigd zijn.", + "conversionOutOfMemory": "De browser had onvoldoende geheugen tijdens het converteren. Probeer een lagere DPI, of schakel de optie voor meerpagina-TIFF uit om pagina's een voor een te converteren." } }, "pdfToCbz": { @@ -537,7 +553,7 @@ } }, "pdfToGreyscale": { - "name": "PDF naar Grijswaarden", + "name": "PDF naar grijswaarden", "subtitle": "Converteer alle kleuren naar zwart-wit." }, "pdfToJson": { @@ -559,7 +575,7 @@ } }, "ocrPdf": { - "name": "OCR PDF", + "name": "PDF OCR", "subtitle": "Maak een PDF doorzoekbaar en kopieerbaar.", "languagesInDocument": "Talen in document", "searchLanguagesPlaceholder": "Talen zoeken...", @@ -613,7 +629,7 @@ "multiLanguageSupportDescription": "Selecteer meerdere talen voor documenten met inhoud in gemengde talen." }, "alternateMerge": { - "name": "Pagina's Afwisselen & Mixen", + "name": "Pagina's afwisselen en mixen", "subtitle": "PDF's samenvoegen met afwisselende pagina's vanuit elke PDF. Bladwijzers behouden.", "retainPageLabels": "Originele pagina-labels van elk bestand behouden", "retainPageLabelsHint": "Uit (standaard): de samengevoegde PDF gebruikt natuurlijke paginanummering 1–N. Aan: de originele pagina-labels van elk bestand blijven behouden (kan dubbele labels opleveren)." @@ -664,31 +680,31 @@ "faqBackOrderAnswer": "Dat hangt af van hoe de stapel bij de tweede ronde is ingevoerd. De hele stapel omdraaien levert achterkanten in omgekeerde volgorde op; dat is de standaardinstelling. Gaf je scanner ze in dezelfde volgorde als de voorkanten terug, kies dan om het blok ongewijzigd te laten." }, "addAttachments": { - "name": "Bijlagen Toevoegen", + "name": "Bijlagen toevoegen", "subtitle": "Een of meer bestanden toevoegen aan een PDF." }, "extractAttachments": { - "name": "Bijlagen Extraheren", + "name": "Bijlagen extraheren", "subtitle": "Extraheer alle ingevoegde bestanden als ZIP uit PDF('s)." }, "editAttachments": { - "name": "Bijlagen Bewerken", + "name": "Bijlagen bewerken", "subtitle": "Bijlagen in een PDF weergeven of verwijderen." }, "dividePages": { - "name": "Paginas Opdelen", + "name": "Pagina's opdelen", "subtitle": "Pagina's horizontaal of verticaal opdelen." }, "addBlankPage": { - "name": "Blanco pagina Toevoegen", + "name": "Blanco pagina toevoegen", "subtitle": "Een blanco pagina ergens in een PDF invoegen." }, "reversePages": { - "name": "Paginavolgorde Omkeren", + "name": "Paginavolgorde omkeren", "subtitle": "De volgorde omkeren van alle pagina's in een document." }, "rotatePdf": { - "name": "PDF Roteren", + "name": "PDF roteren", "subtitle": "Pagina's roteren in stappen van 90 graden." }, "rotateCustom": { @@ -696,27 +712,27 @@ "subtitle": "Pagina's roteren met elke gewenste hoek." }, "nUpPdf": { - "name": "N+ PDF", + "name": "N-up PDF", "subtitle": "Meerdere pagina's op één vel arrangeren." }, "combineToSinglePage": { - "name": "Combineren tot Enkele pagina", + "name": "Combineren tot één pagina", "subtitle": "Alle pagina's aan elkaar plakken tot een doorlopende rol." }, "viewMetadata": { - "name": "Metadata Weergeven", + "name": "Metadata weergeven", "subtitle": "De verborgen eigenschappen van een PDF weergeven." }, "editMetadata": { - "name": "Metadata Bewerken", + "name": "Metadata bewerken", "subtitle": "Auteur, titel en andere eigenschappen aanpassen." }, "pdfsToZip": { - "name": "PDF naar ZIP", + "name": "PDF's naar ZIP", "subtitle": "Meerdere PDF's archiveren in een ZIP-bestand." }, "comparePdfs": { - "name": "PDF's Vergelijken", + "name": "PDF's vergelijken", "subtitle": "Twee PDF's zij-aan-zij vergelijken.", "firstPdf": "Eerste PDF", "secondPdf": "Twede PDF", @@ -760,51 +776,51 @@ "loadError": "Kan PDF niet laden. Mogelijk is het beschadigd of beveiligd." }, "posterizePdf": { - "name": "PDF-Poster", + "name": "PDF-poster", "subtitle": "Een grote pagina opdelen in meerdere kleinere pagina's." }, "fixPageSize": { - "name": "Paginagrootte Fiksen", + "name": "Paginagrootte corrigeren", "subtitle": "Alle pagina's aanpassen tot een uniform formaat." }, "linearizePdf": { - "name": "PDF Lineariseren", + "name": "PDF lineariseren", "subtitle": "Een PDF optimaliseren voor snelle webweergave." }, "pageDimensions": { - "name": "Pagina Afmetingen", + "name": "Paginaafmetingen", "subtitle": "Paginagrootte, oriëntatie en eenheden analyseren." }, "removeRestrictions": { - "name": "Beperkingen Verwijderen", + "name": "Beperkingen verwijderen", "subtitle": "Beveiligingswachtwoord en -beperkingen verwijderen van digitaal ondertekende PDF-bestanden." }, "repairPdf": { - "name": "PDF Repareren", + "name": "PDF repareren", "subtitle": "Gegevens herstellen van beschadigde PDF-bestanden." }, "encryptPdf": { - "name": "PDF Versleutelen", + "name": "PDF versleutelen", "subtitle": "Een PDF vergrendelen door toevoeging van een toegangswachtwoord." }, "sanitizePdf": { - "name": "PDF Opschonen", + "name": "PDF opschonen", "subtitle": "Metadata, annotaties, scripts en meer verwijderen." }, "decryptPdf": { - "name": "PDF Ontgrendelen", + "name": "PDF ontsleutelen", "subtitle": "Een PDF ontgrendelen door het verwijderen van de wachtwoordbeveiliging." }, "flattenPdf": { - "name": "PDF Platmaken", + "name": "PDF platmaken", "subtitle": "Formuliervelden en annotaties onbewerkbaar maken." }, "removeMetadata": { - "name": "Metadata Verwijderen", + "name": "Metadata verwijderen", "subtitle": "Verborgen gegevens verwijderen uit een PDF." }, "changePermissions": { - "name": "Rechten Aanpassen", + "name": "Rechten aanpassen", "subtitle": "Gebruikersrechten van een PDF instellen of aanpasssen." }, "odtToPdf": { @@ -864,7 +880,7 @@ "optTypographer": "Typograaf (slimme aanhalingstekens, etc.)" }, "pdfBooklet": { - "name": "PDF Boekje", + "name": "PDF-boekje", "subtitle": "De pagina's opnieuw ordenen voor het afdrukken van een dubbelzijdig boekje. Vouw en niet ze om een boekje te maken.", "howItWorks": "Het werkt zo:", "step1": "Laad een PDF-bestand.", @@ -974,7 +990,7 @@ "subtitle": "Converteer elke pagina van een PDF-bestand naar een schaalbare vectorafbeelding (SVG) voor perfecte kwaliteit op elke grootte." }, "extractTables": { - "name": "PDF-tabellen Extraheren", + "name": "PDF-tabellen extraheren", "subtitle": "Tabellen uit PDF-bestanden halen en exporteren als CSV, JSON of Markdown." }, "pdfToCsv": { @@ -986,12 +1002,11 @@ "subtitle": "Tabellen uit een PDF halen en converten naar Excel (XLSX) formaat." }, "pdfToText": { - "name": "PDF naar Text", + "name": "PDF naar tekst", "subtitle": "Tekst uit een PDF-bestanden halen en opslaan als gewone tekst (.txt). Ondersteunt meerdere bestanden.", "noteLabel": "Opmerking:", "noteText": "Deze tool werkt ALLEEN met digitaal aangemaakte PDF's. Voor gescande documenten of PDF's op basis van afbeeldingen gebruik je in plaats daarvan onze OCR PDF-tool.", - "convertButton": "Tekst extraheren", - "note": "Dit hulpmiddel werkt ALLEEN met digitaal gemaakte PDF's. Gebruik voor gescande documenten of op afbeeldingen gebaseerde PDF's in plaats hiervan de OCR PDF-tool." + "convertButton": "Tekst extraheren" }, "digitalSignPdf": { "name": "Digitale handtekening", @@ -1080,12 +1095,12 @@ "internetRequiredDescription": "Bij het ondertekenen kan certificaatkeeninformatie van de server van je certificaatuitgever worden opgehaald om de handtekening te valideren." }, "validateSignaturePdf": { - "name": "PDF-handtekening Valideren", + "name": "PDF-handtekening valideren", "pageTitle": "PDF-handtekening valideren - Digitale handtekeningen verifiëren | BentoPDF", "subtitle": "Digitale handtekeningen in een PDF-bestanden verifiëren. Controleer de geldigheid van het certificaat, bekijk de gegevens van de ondertekenaar en bevestig de integriteit van het document. Alle verwerking gebeurt binnen jouw browser." }, "timestampPdf": { - "name": "PDF Tijdstempelen", + "name": "PDF tijdstempelen", "pageTitle": "PDF tijdstempel gratis online - RFC 3161 documenttijdstempel | BentoPDF", "subtitle": "Voeg een RFC 3161 tijdstempel toe aan je PDF via een vertrouwde TSA-server. Dit bewijst dat jouw document op een specifiek moment bestond. Geen certificaat vereist.", "tsaSectionTitle": "Tijdstempelserver (TSA)", @@ -1100,11 +1115,11 @@ "convertButton": "Omzetten naar PDF" }, "fontToOutline": { - "name": "Lettertype naar Contour", + "name": "Lettertype naar contouren", "subtitle": "Converteer alle lettertypen naar vector-contouren voor consistente weergave over alle apparaten." }, "deskewPdf": { - "name": "PDF Rechttrekken", + "name": "PDF rechttrekken", "subtitle": "Scheef gescande pagina's automatisch rechttrekken met OpenCV." }, "pdfToWord": { @@ -1132,11 +1147,11 @@ "subtitle": "Converteer PDF naar PDF/A voor langetermijnarchivering." }, "rasterizePdf": { - "name": "PDF Rasteren", + "name": "PDF rasteren", "subtitle": "Converteer PDF naar beeldgebaseerde PDF. Lagen afvlakken en selecteerbare tekst verwijderen." }, "pdfWorkflow": { - "name": "PDF Werkproces Samenstellen", + "name": "PDF-workflowbouwer", "subtitle": "Bouw specifieke PDF-verwerkingsprocessen met een visuele knooppunten-bewerking.", "nodes": "Knooppunten", "searchNodes": "Knooppunten zoeken...", @@ -1189,7 +1204,7 @@ "workerError": "Worker-fout: {{message}}", "alternateMergeWorkerError": "Fout in afwisselende samenvoeg-worker: {{message}}", "noPdfFilesUploaded": "Geen PDF-bestanden geüpload in PDF-invoer", - "failedToLoadFile": "Kan \"{{file}}\" niet laden — bestand is mogelijk beschadigd", + "failedToLoadFile": "Kan \"{{file}}\" niet laden, bestand is mogelijk beschadigd", "noImagesUploaded": "Geen afbeeldingen geüpload in Afbeelding-invoer", "noWordDocsUploaded": "Geen documenten geüpload in Word-invoer", "noExcelUploaded": "Geen spreadsheets geüpload in Excel-invoer", @@ -1279,7 +1294,7 @@ "subtitle": "Pagina's van een PDF boven of achter een andere PDF plaatsen.", "basePdfLabel": "Basis-PDF", "uploadBasePdf": "Basis-PDF laden", - "overlayPdfLabel": "Overlay / Underlay PDF", + "overlayPdfLabel": "Overlay-/underlay-PDF", "uploadOverlayPdf": "Overlay/underlay PDF laden", "modeLabel": "Modus", "overlayOption": "Overlay (boven de pagina's)", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Absoluut! Alle verwerking vindt plaats in jouw browser. Jouw bestanden verlaten nooit jouw apparaat, wat volledige privacy garandeert." }, "unlockPdf": { - "name": "PDF Ontgrendelen", + "name": "PDF ontgrendelen", "subtitle": "Een PDF ontgrendelen door het verwijderen van de wachtwoordbeveiliging." }, "protectPdf": { - "name": "PDF Versleutelen", + "name": "PDF beveiligen", "subtitle": "Een PDF vergrendelen door toevoeging van een toegangswachtwoord." } } diff --git a/public/locales/nl/ui.json b/public/locales/nl/ui.json new file mode 100644 index 00000000..0cfc3d0a --- /dev/null +++ b/public/locales/nl/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(gecorrigeerd)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ nog {{n}}...", + "- Error parsing XMP XML. Displaying raw. -": "- Fout bij het lezen van XMP XML. Ruwe weergave. -", + "- No Info Dictionary data found -": "- Geen Info Dictionary-gegevens gevonden -", + "- No XMP metadata found -": "- Geen XMP-metadata gevonden -", + "- No interactive form fields found -": "- Geen interactieve formuliervelden gevonden -", + "- No parseable XMP properties found -": "- Geen leesbare XMP-eigenschappen gevonden -", + "-- Select existing group --": "-- Kies bestaande groep --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (Zeer gevoelig)", + "0.5° (Default)": "0,5° (Standaard)", + "1.0° (Normal)": "1,0° (Normaal)", + "100 (Fast)": "100 (Snel)", + "150 (Default)": "150 (Standaard)", + "1x2 (Booklet)": "1x2 (Boekje)", + "2.0° (Less Sensitive)": "2,0° (Minder gevoelig)", + "200 (Better)": "200 (Beter)", + "200 (Good)": "200 (Goed)", + "2x2 (4-up)": "2x2 (4 per vel)", + "2x4 (8-up)": "2x4 (8 per vel)", + "300 (Best Quality)": "300 (Beste kwaliteit)", + "300 (Print)": "300 (Afdrukken)", + "4x4 (16-up)": "4x4 (16 per vel)", + "600 (High Quality)": "600 (Hoge kwaliteit)", + "72 (Screen)": "72 (Scherm)", + "90° Clockwise": "90° rechtsom", + "90° Counter-clockwise": "90° linksom", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Er bestaat al een veld met de naam \"{{fieldName}}\". Geef dit veld een unieke naam voordat je downloadt.", + "A new version of BentoPDF is available. Reload to update?": "Er is een nieuwe versie van BentoPDF beschikbaar. Opnieuw laden om bij te werken?", + "A single PDF file": "Een enkel PDF-bestand", + "A template with this name already exists.": "Er bestaat al een sjabloon met deze naam.", + "ASCII characters (letters, numbers, symbols)": "ASCII-tekens (letters, cijfers, symbolen)", + "Action": "Actie", + "Add Blank Page": "Blanco pagina toevoegen", + "Add Bookmark": "Bladwijzer toevoegen", + "Add Child Bookmark": "Onderliggende bladwijzer toevoegen", + "Add Child Layer": "Onderliggende laag toevoegen", + "Add More Comics": "Meer strips toevoegen", + "Add More Documents": "Meer documenten toevoegen", + "Add More EPUB Files": "Meer EPUB-bestanden toevoegen", + "Add More Email Files": "Meer e-mailbestanden toevoegen", + "Add More FB2 Files": "Meer FB2-bestanden toevoegen", + "Add More Files": "Meer bestanden toevoegen", + "Add More Images": "Meer afbeeldingen toevoegen", + "Add More JSON Files": "Meer JSON-bestanden toevoegen", + "Add More MOBI Files": "Meer MOBI-bestanden toevoegen", + "Add More Markdown Files": "Meer Markdown-bestanden toevoegen", + "Add More ODG Files": "Meer ODG-bestanden toevoegen", + "Add More PUB Files": "Meer PUB-bestanden toevoegen", + "Add More Pages Files": "Meer Pages-bestanden toevoegen", + "Add More Presentations": "Meer presentaties toevoegen", + "Add More SVG Files": "Meer SVG-bestanden toevoegen", + "Add More Spreadsheets": "Meer spreadsheets toevoegen", + "Add More Text Files": "Meer tekstbestanden toevoegen", + "Add More Visio Files": "Meer Visio-bestanden toevoegen", + "Add More WPD Files": "Meer WPD-bestanden toevoegen", + "Add More WPS Files": "Meer WPS-bestanden toevoegen", + "Add More XML Files": "Meer XML-bestanden toevoegen", + "Add More XPS Files": "Meer XPS-bestanden toevoegen", + "Add a new layer to get started!": "Voeg een nieuwe laag toe om te beginnen!", + "Add a text box": "Tekstvak toevoegen", + "Add an RFC 3161 document timestamp": "Een RFC 3161-documenttijdstempel toevoegen", + "Add an image": "Afbeelding toevoegen", + "Add at least one node to run the workflow.": "Voeg minstens één knooppunt toe om de workflow uit te voeren.", + "Add child": "Onderliggende toevoegen", + "Add child layer": "Onderliggende laag toevoegen", + "Add header and footer text": "Koptekst en voettekst toevoegen", + "Add page numbers": "Paginanummers toevoegen", + "Add searchable text layer via OCR": "Doorzoekbare tekstlaag toevoegen met OCR", + "Add text watermark": "Tekstwatermerk toevoegen", + "Add/Edit/Extract Attachments": "Bijlagen toevoegen/bewerken/extraheren", + "Added": "Toegevoegd", + "Added \"{{afterText}}\"": "\"{{afterText}}\" toegevoegd", + "Added image ({{width}}×{{height}})": "Afbeelding toegevoegd ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} blanco pagina toegevoegd!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} blanco pagina's toegevoegd!", + "Adding header & footer...": "Koptekst en voettekst toevoegen...", + "Adding page numbers...": "Paginanummers toevoegen...", + "Adding watermark...": "Watermerk toevoegen...", + "Adding {{insertCount}} blank page...": "{{insertCount}} blanco pagina toevoegen...", + "Adding {{insertCount}} blank pages...": "{{insertCount}} blanco pagina's toevoegen...", + "Adding {{name}} ({{n}}/{{length}})...": "{{name}} toevoegen ({{n}}/{{length}})...", + "Adjust Colors": "Kleuren aanpassen", + "Adjust brightness, contrast, and colors": "Helderheid, contrast en kleuren aanpassen", + "Advanced": "Geavanceerd", + "Advanced Feature Required": "Geavanceerde functie vereist", + "Advanced Settings": "Geavanceerde instellingen", + "After Page": "Na pagina", + "After Page...": "Na pagina...", + "Align Objects": "Objecten uitlijnen", + "Alignment": "Uitlijning", + "All": "Alles", + "All files repaired successfully!": "Alle bestanden zijn gerepareerd!", + "Alternate Merge": "Afwisselend samenvoegen", + "Alternating and mixing pages...": "Pagina's afwisselen en mixen...", + "Always resample to that resolution": "Altijd opnieuw samplen op die resolutie", + "An error occurred during compression. Error: {{error}}": "Er is een fout opgetreden tijdens het comprimeren. Fout: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Er is een fout opgetreden tijdens de conversie. Fout: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Er is een fout opgetreden tijdens de conversie. Fout: {{message}}", + "An error occurred during cropping.": "Er is een fout opgetreden tijdens het bijsnijden.", + "An error occurred during extraction. Error: {{error}}": "Er is een fout opgetreden tijdens het extraheren. Fout: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Er is een fout opgetreden tijdens het rasteren. Fout: {{error}}", + "An error occurred during sanitization: {{msg}}": "Er is een fout opgetreden tijdens het opschonen: {{msg}}", + "An error occurred while combining pages.": "Er is een fout opgetreden bij het combineren van pagina's.", + "An error occurred while creating the N-Up PDF.": "Er is een fout opgetreden bij het maken van de N-Up PDF.", + "An error occurred while creating the booklet.": "Er is een fout opgetreden bij het maken van het boekje.", + "An error occurred while dividing the PDF.": "Er is een fout opgetreden bij het opdelen van de PDF.", + "An error occurred while mixing the PDFs.": "Er is een fout opgetreden bij het mixen van de PDF's.", + "An error occurred while standardizing pages.": "Er is een fout opgetreden bij het standaardiseren van pagina's.", + "An error occurred while trying to remove metadata.": "Er is een fout opgetreden bij het verwijderen van metadata.", + "An error occurred: {{error}}": "Er is een fout opgetreden: {{error}}", + "An error occurred: {{error}}.": "Er is een fout opgetreden: {{error}}.", + "An owner password is required when setting permissions": "Een eigenaarswachtwoord is vereist bij het instellen van rechten", + "An unexpected error occurred during the repair process.": "Er is een onverwachte fout opgetreden tijdens het repareren.", + "An unexpected error occurred.": "Er is een onverwachte fout opgetreden.", + "Analyzing data structure...": "Gegevensstructuur analyseren...", + "Analyzing full PDF metadata...": "Volledige PDF-metadata analyseren...", + "Analyzing signatures...": "Handtekeningen analyseren...", + "Angle": "Hoek", + "Annotations removed successfully!": "Annotaties verwijderd!", + "Any text, URL, or data": "Elke tekst, URL of gegevens", + "Application": "Toepassing", + "Apply a digital signature to PDF": "Een digitale handtekening op de PDF aanbrengen", + "Apply and download": "Toepassen en downloaden", + "Apply redactions?": "Redacties toepassen?", + "Apply scanner simulation effect": "Scannersimulatie-effect toepassen", + "Applying Bates numbers...": "Bates-nummers toepassen...", + "Applying color adjustments...": "Kleuraanpassingen toepassen...", + "Applying crop...": "Bijsnijden toepassen...", + "Applying redactions...": "Redacties toepassen...", + "Applying rotations...": "Rotaties toepassen...", + "Applying scanner effect...": "Scannereffect toepassen...", + "Applying timestamp...": "Tijdstempel toepassen...", + "Applying {{replace}}...": "{{replace}} toepassen...", + "Archive contains an oversized image entry.": "Het archief bevat een te grote afbeelding.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Het archief bevat te veel afbeeldingen (max. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Het archief is te groot na uitpakken.", + "Are you sure you want to reset? All your work will be lost.": "Weet je zeker dat je wilt resetten? Al je werk gaat verloren.", + "Area (Coordinates)": "Gebied (coördinaten)", + "Area ({{unit}}²)": "Oppervlakte ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman en Courier New worden gekoppeld aan de ingebouwde equivalenten. Alleen toegepast wanneer dat veilig is.", + "Arrange multiple pages per sheet": "Meerdere pagina's per vel rangschikken", + "Arrange pages for booklet printing": "Pagina's rangschikken voor boekjes afdrukken", + "Aspect Ratio": "Beeldverhouding", + "At least one PDF document is required for export.": "Minstens één PDF-document is vereist voor export.", + "At least two valid PDFs are required.": "Minstens twee geldige PDF's zijn vereist.", + "Attaching files to PDF...": "Bestanden aan PDF toevoegen...", + "Attachments updated successfully!": "Bijlagen bijgewerkt!", + "Author": "Auteur", + "Auto (Keep Original)": "Automatisch (origineel behouden)", + "Back": "Achterkant", + "Back to Home": "Terug naar startpagina", + "Background Color": "Achtergrondkleur", + "Background color changed successfully!": "Achtergrondkleur gewijzigd!", + "Barcode": "Streepjescode", + "Barcode Format": "Streepjescodeformaat", + "Barcode Value": "Streepjescodewaarde", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Bates-nummers toegepast! ({{batesStart}} tot en met {{n}})", + "Beginning": "Begin", + "Binarize": "Binariseren", + "Blank Position": "Positie blanco pagina", + "Blue": "Blauw", + "Blur": "Vervagen", + "Bold": "Vet", + "Bold & Italic": "Vet en cursief", + "Booklet": "Boekje", + "Booklet created with {{numSheets}} sheets!": "Boekje gemaakt met {{numSheets}} vellen!", + "Bookmarks imported from JSON!": "Bladwijzers geïmporteerd uit JSON!", + "Bookmarks page": "Bladwijzerpagina", + "Border": "Rand", + "Border Color": "Randkleur", + "Bottom": "Onder", + "Bottom Center": "Onder midden", + "Bottom Left": "Linksonder", + "Bottom Right": "Rechtsonder", + "Bottom edge in points": "Onderrand in punten", + "Brightness": "Helderheid", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli en rasteren zijn overgeslagen om PDF/A te behouden.", + "Brotli compression (PDF 2.0)": "Brotli-compressie (PDF 2.0)", + "Browser Note:": "Browseropmerking:", + "Building new PDF...": "Nieuwe PDF opbouwen...", + "Building page pairing model...": "Paginakoppelingsmodel opbouwen...", + "Button": "Knop", + "ByteRange does not start at the beginning of the file": "ByteRange begint niet aan het begin van het bestand", + "ByteRange out of bounds": "ByteRange valt buiten het bereik", + "CBZ to PDF": "CBZ naar PDF", + "CSV Loaded": "CSV geladen", + "CSV file is empty": "Het CSV-bestand is leeg", + "Cancel": "Annuleren", + "Cannot Delete": "Kan niet verwijderen", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Geen toegang tot de viewerbediening. Gebruik de downloadknop in de werkbalk van de PDF-viewer hierboven.", + "Cannot delete all pages": "Kan niet alle pagina's verwijderen", + "Cannot delete all pages.": "Kan niet alle pagina's verwijderen.", + "Canvas context failed": "Canvascontext mislukt", + "Canvas context unavailable": "Canvascontext niet beschikbaar", + "Canvas toBlob conversion failed.": "Canvas toBlob-conversie mislukt.", + "Canvas toBlob failed": "Canvas toBlob mislukt", + "Center": "Midden", + "Certificate (.pfx, .p12, .pem)": "Certificaat (.pfx, .p12, .pem)", + "Certificate Expired": "Certificaat verlopen", + "Certificate Password": "Certificaatwachtwoord", + "Certificate unlocked": "Certificaat ontgrendeld", + "Change Certificate": "Certificaat wijzigen", + "Change background color": "Achtergrondkleur wijzigen", + "Changing background color...": "Achtergrondkleur wijzigen...", + "Changing text color...": "Tekstkleur wijzigen...", + "Character": "Teken", + "Checked State": "Aangevinkte status", + "Choose a valid page range.": "Kies een geldig paginabereik.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Kies een van de meegeleverde talen of bouw de air-gapped bundel opnieuw met de ontbrekende taal toegevoegd aan --ocr-languages.", + "Cleanup": "Opschonen", + "Click on PDF to Pick Location": "Klik op de PDF om een locatie te kiezen", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Klik op de knop hierboven en klik dan op de PDF op de plek waar de bladwijzer naartoe moet springen", + "Click to Upload Image": "Klik om een afbeelding te uploaden", + "Clicking this field in the PDF will open a file picker to upload an image.": "Als je in de PDF op dit veld klikt, opent een bestandskiezer om een afbeelding te uploaden.", + "Clip invisible parts of images": "Onzichtbare delen van afbeeldingen afknippen", + "Close": "Sluiten", + "Close (Esc)": "Sluiten (Esc)", + "Close panel": "Paneel sluiten", + "Closes tab": "Sluit het tabblad", + "Closes window": "Sluit het venster", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (bladwijzers en metadata)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF is niet geconfigureerd. Configureer het in de WASM-instellingen.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF heeft een leeg ontsleuteld bestand opgeleverd.", + "CoherentPDF: not configured.": "CoherentPDF: niet geconfigureerd.", + "Color": "Kleur", + "Color adjustments applied successfully!": "Kleuraanpassingen toegepast!", + "Colors inverted successfully!": "Kleuren omgekeerd!", + "Cols": "Kolommen", + "Combine multiple PDFs into one": "Meerdere PDF's combineren tot één", + "Combine to Single Page": "Combineren tot één pagina", + "Combining pages...": "Pagina's combineren...", + "Comic Archives": "Stripboekarchieven", + "Comments and markup become part of the page. Form fields and links keep working.": "Opmerkingen en markeringen worden onderdeel van de pagina. Formuliervelden en koppelingen blijven werken.", + "Complete": "Voltooid", + "Complete!": "Voltooid!", + "Compress": "Comprimeren", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF('s) gecomprimeerd. Totale grootte verkleind van {{totalOriginalSize}} naar {{totalCompressedSize}} ({{value}}% bespaard).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF('s) gecomprimeerd. Totale grootte: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Meerdere PDF's comprimeren...", + "Compressing to {{size}}...": "Comprimeren naar {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Comprimeren {{n}}/{{length}}: {{name}}...", + "Compressing...": "Comprimeren...", + "Compression Complete": "Comprimeren voltooid", + "Compression Finished": "Comprimeren afgerond", + "Compression Level": "Compressieniveau", + "Configure": "Configureren", + "Confirm": "Bevestigen", + "Confirm Action": "Actie bevestigen", + "Conformance": "Conformiteit", + "Connected": "Verbonden", + "Contact Info": "Contactgegevens", + "Content": "Inhoud", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "De inhoudshash komt niet overeen met het messageDigest-kenmerk: de PDF is na het ondertekenen gewijzigd", + "Contrast": "Contrast", + "Conversion Complete": "Conversie voltooid", + "Conversion Error": "Conversiefout", + "Conversion engine ready!": "Conversie-engine gereed!", + "Conversion failed: could not create PDF/A definition": "Conversie mislukt: kon de PDF/A-definitie niet maken", + "Convert Apple Pages documents to PDF": "Apple Pages-documenten naar PDF converteren", + "Convert EPUB ebooks to PDF": "EPUB-e-books naar PDF converteren", + "Convert Excel spreadsheets to PDF": "Excel-spreadsheets naar PDF converteren", + "Convert FB2 e-books to PDF": "FB2-e-books naar PDF converteren", + "Convert JSON files to PDF": "JSON-bestanden naar PDF converteren", + "Convert MOBI e-books to PDF": "MOBI-e-books naar PDF converteren", + "Convert Markdown files to PDF": "Markdown-bestanden naar PDF converteren", + "Convert Microsoft Publisher to PDF": "Microsoft Publisher naar PDF converteren", + "Convert OpenDocument Graphics to PDF": "OpenDocument Graphics naar PDF converteren", + "Convert PDF pages to SVG": "PDF-pagina's naar SVG converteren", + "Convert PDF pages to images (ZIP)": "PDF-pagina's naar afbeeldingen (ZIP) converteren", + "Convert PDF tables to CSV": "PDF-tabellen naar CSV converteren", + "Convert PDF tables to Excel": "PDF-tabellen naar Excel converteren", + "Convert PDF to Markdown text": "PDF naar Markdown-tekst converteren", + "Convert PDF to PDF/A for archiving": "PDF naar PDF/A converteren voor archivering", + "Convert PDF to Word document": "PDF naar Word-document converteren", + "Convert PowerPoint presentations to PDF": "PowerPoint-presentaties naar PDF converteren", + "Convert SVG files to PDF": "SVG-bestanden naar PDF converteren", + "Convert To Grayscale": "Naar grijswaarden converteren", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Visio-diagrammen (VSD/VSDX) naar PDF converteren", + "Convert WPS Office documents to PDF": "WPS Office-documenten naar PDF converteren", + "Convert Word documents to PDF": "Word-documenten naar PDF converteren", + "Convert WordPerfect documents to PDF": "WordPerfect-documenten naar PDF converteren", + "Convert XML documents to PDF": "XML-documenten naar PDF converteren", + "Convert XPS/OXPS documents to PDF": "XPS/OXPS-documenten naar PDF converteren", + "Convert comic book archives (CBZ/CBR) to PDF": "Stripboekarchieven (CBZ/CBR) naar PDF converteren", + "Convert email files (.eml, .msg) to PDF": "E-mailbestanden (.eml, .msg) naar PDF converteren", + "Convert fonts to vector outlines": "Lettertypen naar vectorcontouren converteren", + "Convert plain text to PDF": "Platte tekst naar PDF converteren", + "Convert to grayscale": "Naar grijswaarden converteren", + "Convert to greyscale": "Naar grijswaarden converteren", + "Convert to image-based PDF": "Naar afbeeldingsgebaseerde PDF converteren", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} bestanden ({{totalPages}} pagina's) naar SVG geconverteerd!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} pagina's naar SVG geconverteerd!", + "Converter not initialized": "Converter niet geïnitialiseerd", + "Converting BMP to PDF...": "BMP naar PDF converteren...", + "Converting HEIC to PDF...": "HEIC naar PDF converteren...", + "Converting TIFF to PDF...": "TIFF naar PDF converteren...", + "Converting emails...": "E-mails converteren...", + "Converting files...": "Bestanden converteren...", + "Converting fonts to outlines...": "Lettertypen naar contouren converteren...", + "Converting images to PDF...": "Afbeeldingen naar PDF converteren...", + "Converting multiple PDFs to PDF/A...": "Meerdere PDF's naar PDF/A converteren...", + "Converting multiple RTF files to PDF...": "Meerdere RTF-bestanden naar PDF converteren...", + "Converting multiple files...": "Meerdere bestanden converteren...", + "Converting page {{n}} of {{pageCount}}...": "Pagina {{n}} van {{pageCount}} converteren...", + "Converting to Markdown...": "Naar Markdown converteren...", + "Converting to SVG...": "Naar SVG converteren...", + "Converting to greyscale...": "Naar grijswaarden converteren...", + "Converting to {{level}}...": "Naar {{level}} converteren...", + "Converting {{name}}...": "{{name}} converteren...", + "Converting {{n}}/{{length}}: {{name}}...": "Converteren {{n}}/{{length}}: {{name}}...", + "Converting...": "Converteren...", + "Copied": "Gekopieerd", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Geen toegang tot de exporter voor gestempelde PDF's. Gebruik als alternatief de knop Exporteren → PDF in de werkbalk van de viewer.", + "Could not add blank page.": "Kon geen blanco pagina toevoegen.", + "Could not add blank pages.": "Kon geen blanco pagina's toevoegen.", + "Could not add header or footer.": "Kon geen koptekst of voettekst toevoegen.", + "Could not add page numbers.": "Kon geen paginanummers toevoegen.", + "Could not add the watermark.": "Kon het watermerk niet toevoegen.", + "Could not apply rotations.": "Kon rotaties niet toepassen.", + "Could not change text color.": "Kon de tekstkleur niet wijzigen.", + "Could not change the background color.": "Kon de achtergrondkleur niet wijzigen.", + "Could not create ZIP archive.": "Kon geen ZIP-archief maken.", + "Could not create canvas context.": "Kon geen canvascontext maken.", + "Could not create comparison canvas context.": "Kon geen canvascontext voor vergelijking maken.", + "Could not create offscreen comparison canvas.": "Kon geen offscreen vergelijkingscanvas maken.", + "Could not create visual diff context.": "Kon geen visuele diff-context maken.", + "Could not create visual diff overlay context.": "Kon geen visuele diff-overlaycontext maken.", + "Could not detect blank pages.": "Kon blanco pagina's niet detecteren.", + "Could not display the page.": "Kon de pagina niet weergeven.", + "Could not export comparison PDF.": "Kon de vergelijkings-PDF niet exporteren.", + "Could not export the signed PDF. Please try again.": "Kon de ondertekende PDF niet exporteren. Probeer het opnieuw.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Kon de gestempelde PDF niet exporteren. Gebruik als alternatief de knop Exporteren → PDF in de werkbalk van de viewer.", + "Could not extract signer public key": "Kon de openbare sleutel van de ondertekenaar niet extraheren", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Kon {{testFile}} niet vinden op de opgegeven URL (HTTP {{status}}). Controleer of het bestand bestaat.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Kon de PDF niet volledig analyseren. Het bestand is mogelijk beschadigd of heeft een ongebruikelijke structuur.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Kon geen voorbeeld maken. Het bestand is mogelijk beschadigd of bevat niet-ondersteunde functies. Fout: {{message}}", + "Could not get canvas context": "Kon de canvascontext niet ophalen", + "Could not invert PDF colors.": "Kon de PDF-kleuren niet omkeren.", + "Could not load PDF. It may be corrupt or password-protected.": "Kon de PDF niet laden. Het bestand is mogelijk beschadigd of beveiligd met een wachtwoord.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Kon de PDF niet laden. Het bestand is mogelijk ongeldig, beschadigd of beveiligd met een wachtwoord.", + "Could not load the PDF engine. Please refresh the page and try again.": "Kon de PDF-engine niet laden. Vernieuw de pagina en probeer het opnieuw.", + "Could not parse signer info": "Kon de ondertekenaarsgegevens niet lezen", + "Could not posterize the PDF.": "Kon de PDF niet posteriseren.", + "Could not process \"{{name}}\". The file may be corrupted.": "Kon \"{{name}}\" niet verwerken. Het bestand is mogelijk beschadigd.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Kon de bestandsgrootte niet verder verkleinen. Origineel: {{originalSize}}, nieuw: {{compressedSize}}.", + "Could not remove annotations.": "Kon annotaties niet verwijderen.", + "Could not remove blank pages.": "Kon blanco pagina's niet verwijderen.", + "Could not remove leftover data from the PDF.": "Kon overgebleven gegevens niet uit de PDF verwijderen.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Kon de geredigeerde tekst niet uit de documentgegevens verwijderen, dus het bestand is niet gedownload.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Kon de PDF-pagina's niet omkeren. Controleer of je bestanden geldige PDF's zijn.", + "Could not update metadata. Please check that date formats are correct.": "Kon metadata niet bijwerken. Controleer of de datumnotaties kloppen.", + "Count": "Aantal", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Gemaakt", + "Creating Booklet...": "Boekje maken...", + "Creating Excel file...": "Excel-bestand maken...", + "Creating N-Up PDF...": "N-Up PDF maken...", + "Creating PDF from JPGs...": "PDF maken van JPG's...", + "Creating PDF from SVG files...": "PDF maken van SVG-bestanden...", + "Creating PDF...": "PDF maken...", + "Creating ZIP archive...": "ZIP-archief maken...", + "Creating ZIP file...": "ZIP-bestand maken...", + "Creating ZIP...": "ZIP maken...", + "Creating table...": "Tabel maken...", + "Creator": "Maker", + "Crop": "Bijsnijden", + "Crop complete! Your download has started.": "Bijsnijden voltooid! Je download is gestart.", + "Cryptographic verification failed": "Cryptografische verificatie mislukt", + "Custom": "Aangepast", + "Custom Format": "Aangepast formaat", + "Custom Height": "Aangepaste hoogte", + "Custom Units": "Aangepaste eenheden", + "Custom Width": "Aangepaste breedte", + "Custom Zoom": "Aangepaste zoom", + "Custom...": "Aangepast...", + "DataMatrix": "DataMatrix", + "Date Format": "Datumnotatie", + "Decrease size": "Verkleinen", + "Decrypt": "Ontsleutelen", + "Decrypting PDF...": "PDF ontsleutelen...", + "Decrypting {{name}} ({{n}}/{{length}})...": "{{name}} ontsleutelen ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "{{n}} van {{length}} ontsleutelen: {{name}}", + "Decrypting...": "Ontsleutelen...", + "Decryption Failed": "Ontsleutelen mislukt", + "Delete": "Verwijderen", + "Delete \"{{title}}\"?": "\"{{title}}\" verwijderen?", + "Delete Field": "Veld verwijderen", + "Delete Page": "Pagina verwijderen", + "Delete Pages": "Pagina's verwijderen", + "Delete all {{length}} bookmark(s) ? ": "Alle {{length}} bladwijzer(s) verwijderen?", + "Delete layer": "Laag verwijderen", + "Delete {{size}} bookmark(s) ? ": "{{size}} bladwijzer(s) verwijderen?", + "Deleted": "Verwijderd", + "Deleted {{size}} page(s) successfully!": "{{size}} pagina('s) verwijderd!", + "Deleting pages...": "Pagina's verwijderen...", + "Description": "Beschrijving", + "Description for screen readers": "Beschrijving voor schermlezers", + "Deselect All": "Alles deselecteren", + "Deskew": "Rechttrekken", + "Deskew PDF": "PDF rechttrekken", + "Deskewed {{length}} file(s). {{value}}": "{{length}} bestand(en) rechtgetrokken. {{value}}", + "Deskewing {{name}}...": "{{name}} rechttrekken...", + "Destination": "Bestemming", + "Detecting blank pages...": "Blanco pagina's detecteren...", + "Digest Algorithm:": "Digestalgoritme:", + "Digital Sign": "Digitaal ondertekenen", + "Direction": "Richting", + "Divide Pages": "Pagina's opdelen", + "Divide into boxes (0 to disable)": "Opdelen in vakken (0 om uit te schakelen)", + "Document Properties": "Documenteigenschappen", + "Document Type": "Documenttype", + "Document properties": "Documenteigenschappen", + "Document-level attachment": "Bijlage op documentniveau", + "Done: back to tools": "Klaar, terug naar de tools", + "Download": "Downloaden", + "Download Edited PDF": "Bewerkte PDF downloaden", + "Download anyway": "Toch downloaden", + "Download as PDF or ZIP automatically": "Automatisch downloaden als PDF of ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} PDF-bestanden gedownload in een ZIP-archief.", + "Downloads started for all files.": "Downloads gestart voor alle bestanden.", + "Dpi": "Dpi", + "Drops tagging, which screen readers rely on.": "Verwijdert de tagging waar schermlezers op vertrouwen.", + "Duplicate Field Name": "Dubbele veldnaam", + "Duplicate Field Names": "Dubbele veldnamen", + "Duplicate Page": "Pagina dupliceren", + "Duplicate Page Numbers": "Dubbele paginanummers", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "De ECDSA-handtekening komt niet overeen met de openbare sleutel van de ondertekenaar", + "EPUB Files": "EPUB-bestanden", + "EPUB to PDF": "EPUB naar PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ naar PDF", + "Edit": "Bewerken", + "Edit All": "Alles bewerken", + "Edit Bookmark": "Bladwijzer bewerken", + "Edit Bookmarks": "Bladwijzers bewerken", + "Edit Images": "Afbeeldingen bewerken", + "Edit Metadata": "Metadata bewerken", + "Edit PDF metadata": "PDF-metadata bewerken", + "Edit Scope": "Bewerkingsbereik", + "Edit Shapes": "Vormen bewerken", + "Edit Text": "Tekst bewerken", + "Edit tool": "Bewerkingstool", + "Edit {{scopes}}": "{{scopes}} bewerken", + "Email Files": "E-mailbestanden", + "Email to PDF": "E-mail naar PDF", + "Embedding files into PDF...": "Bestanden in PDF insluiten...", + "Empty signature bytes": "Lege handtekeningbytes", + "Encrypt": "Versleutelen", + "Encrypt PDF with password": "PDF versleutelen met wachtwoord", + "Encrypted file": "Versleuteld bestand", + "Encrypting PDF with 256-bit AES...": "PDF versleutelen met 256-bit AES...", + "Encryption Failed": "Versleutelen mislukt", + "Encryption resulted in an empty file.": "Het versleutelen leverde een leeg bestand op.", + "End": "Einde", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Voer 0 in om aan het begin in te voegen, of {{pageCount}} om aan het einde in te voegen.", + "Enter bookmark title": "Voer een bladwijzertitel in", + "Enter name for child layer under \"{{Layer}}\":": "Voer een naam in voor de onderliggende laag onder \"{{Layer}}\":", + "Enter password": "Voer wachtwoord in", + "Enter password...": "Voer wachtwoord in...", + "Enter passwords for each encrypted file": "Voer wachtwoorden in voor elk versleuteld bestand", + "Error": "Fout", + "Error during execution": "Fout tijdens uitvoering", + "Error generating PDF: {{error}}": "Fout bij het genereren van de PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Fout bij het laden van het PDF-bestand. Probeer het opnieuw met een geldige PDF.", + "Error reading files: {{error}}": "Fout bij het lezen van bestanden: {{error}}", + "Error saving PDF. Check console for details.": "Fout bij het opslaan van de PDF. Bekijk de console voor details.", + "Error: {{error}}": "Fout: {{error}}", + "Exactly 11 or 12 digits": "Precies 11 of 12 cijfers", + "Exactly 12 or 13 digits": "Precies 12 of 13 cijfers", + "Example of current format:": "Voorbeeld van de huidige notatie:", + "Excel to PDF": "Excel naar PDF", + "Existing Radio Groups": "Bestaande radiogroepen", + "Export Error": "Exportfout", + "Export Value": "Exportwaarde", + "Export failed": "Exporteren mislukt", + "External processing module needed": "Externe verwerkingsmodule nodig", + "Extract Images": "Afbeeldingen extraheren", + "Extract Pages": "Pagina's extraheren", + "Extract Tables": "Tabellen extraheren", + "Extract a range of pages": "Een paginabereik extraheren", + "Extract all images from PDF": "Alle afbeeldingen uit de PDF extraheren", + "Extract pages as separate PDFs": "Pagina's als aparte PDF's extraheren", + "Extract text from PDF": "Tekst uit PDF extraheren", + "Extracted 1 table successfully!": "1 tabel geëxtraheerd!", + "Extracted text from {{length}} PDF files!": "Tekst geëxtraheerd uit {{length}} PDF-bestanden!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF('s) geëxtraheerd, {{failed}} mislukt.", + "Extracted {{length}} page(s) successfully!": "{{length}} pagina('s) geëxtraheerd!", + "Extracted {{length}} table(s) to Excel!": "{{length}} tabel(len) naar Excel geëxtraheerd!", + "Extracted {{length}} tables successfully!": "{{length}} tabellen geëxtraheerd!", + "Extracting attachments from {{length}} file(s)...": "Bijlagen extraheren uit {{length}} bestand(en)...", + "Extracting images from {{name}}...": "Afbeeldingen extraheren uit {{name}}...", + "Extracting pages...": "Pagina's extraheren...", + "Extracting tables...": "Tabellen extraheren...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Tekst extraheren uit bestand {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Tekst extraheren uit meerdere bestanden...", + "Extracting text from {{name}}...": "Tekst extraheren uit {{name}}...", + "Extracting text...": "Tekst extraheren...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "{{name}} extraheren voor AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "{{name}} extraheren voor AI...", + "Extracting...": "Extraheren...", + "Extraction Complete": "Extraheren voltooid", + "Extraction Error": "Extractiefout", + "Extraction Partial": "Gedeeltelijk geëxtraheerd", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extraheren voltooid! {{length}} bijlage(n) in zip-bestand ({{totalSize}}). Download gestart.", + "FB2 Files": "FB2-bestanden", + "FB2 to PDF": "FB2 naar PDF", + "Failed": "Mislukt", + "Failed to acquire 2D canvas context": "Kon de 2D-canvascontext niet verkrijgen", + "Failed to add child layer": "Onderliggende laag toevoegen mislukt", + "Failed to apply Bates numbers.": "Bates-nummers toepassen mislukt.", + "Failed to apply color adjustments. The file might be corrupted.": "Kleuraanpassingen toepassen mislukt. Het bestand is mogelijk beschadigd.", + "Failed to apply redactions.": "Redacties toepassen mislukt.", + "Failed to apply scanner effect. The file might be corrupted.": "Scannereffect toepassen mislukt. Het bestand is mogelijk beschadigd.", + "Failed to attach files: {{error}}": "Bestanden bijvoegen mislukt: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "BMP naar PDF converteren mislukt. Een van de bestanden is mogelijk ongeldig.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "HEIC naar PDF converteren mislukt. Een van de bestanden is mogelijk ongeldig.", + "Failed to convert PDF to CSV. {{message}}": "PDF naar CSV converteren mislukt. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "PDF naar Excel converteren mislukt. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "PDF naar SVG converteren mislukt. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "PDF naar grijswaarden converteren mislukt. Het bestand is mogelijk beschadigd.", + "Failed to convert PDF. It may be image-based or corrupted.": "PDF converteren mislukt. De PDF is mogelijk afbeeldingsgebaseerd of beschadigd.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "TIFF naar PDF converteren mislukt. Een van de bestanden is mogelijk ongeldig.", + "Failed to convert images to PDF.": "Afbeeldingen naar PDF converteren mislukt.", + "Failed to convert text to PDF. {{error}}": "Tekst naar PDF converteren mislukt. {{error}}", + "Failed to convert {{filename}} to PNG": "{{filename}} naar PNG converteren mislukt", + "Failed to copy metadata to clipboard.": "Metadata kopiëren naar klembord mislukt.", + "Failed to create PDF.": "PDF maken mislukt.", + "Failed to create PNG blob": "PNG-blob maken mislukt", + "Failed to create canvas context": "Canvascontext maken mislukt", + "Failed to create split PDFs.": "Gesplitste PDF's maken mislukt.", + "Failed to decode image: {{name}}": "Afbeelding decoderen mislukt: {{name}}", + "Failed to decrypt private key": "Privésleutel ontsleutelen mislukt", + "Failed to decrypt. Try the Decrypt tool instead.": "Ontsleutelen mislukt. Probeer in plaats daarvan de tool Ontsleutelen.", + "Failed to delete layer": "Laag verwijderen mislukt", + "Failed to delete pages.": "Pagina's verwijderen mislukt.", + "Failed to deskew PDF: {{error}}": "PDF rechttrekken mislukt: {{error}}", + "Failed to download the edited PDF.": "Bewerkte PDF downloaden mislukt.", + "Failed to edit attachments.": "Bijlagen bewerken mislukt.", + "Failed to extract certificate from PFX file": "Certificaat uit PFX-bestand extraheren mislukt", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Pagina's extraheren mislukt (qpdf-afsluitcode {{exitCode}}).", + "Failed to extract pages.": "Pagina's extraheren mislukt.", + "Failed to extract tables. {{message}}": "Tabellen extraheren mislukt. {{message}}", + "Failed to extract text from PDF.": "Tekst uit PDF extraheren mislukt.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "ICC-profiel ophalen van {{iccUrl}} mislukt: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Lettertypebestand ophalen mislukt: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "gs.js ophalen mislukt: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "{{url}} ophalen mislukt: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "2D-context ophalen voor pagina {{pageNumber}} mislukt", + "Failed to get canvas context": "Canvascontext ophalen mislukt", + "Failed to insert PDF. The file may be corrupted.": "PDF invoegen mislukt. Het bestand is mogelijk beschadigd.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Ghostscript laden van {{normalizedUrl}} mislukt: {{msg}}", + "Failed to load PDF file.": "PDF-bestand laden mislukt.", + "Failed to load PDF for cropping.": "PDF laden voor bijsnijden mislukt.", + "Failed to load PDF for preview.": "PDF laden voor voorbeeld mislukt.", + "Failed to load PDF form viewer.": "PDF-formulierviewer laden mislukt.", + "Failed to load PDF layers": "PDF-lagen laden mislukt", + "Failed to load PyMuPDF from CDN: {{msg}}": "PyMuPDF laden vanaf CDN mislukt: {{msg}}", + "Failed to load SVG image": "SVG-afbeelding laden mislukt", + "Failed to load WebP image": "WebP-afbeelding laden mislukt", + "Failed to load attachments from PDF.": "Bijlagen uit PDF laden mislukt.", + "Failed to load files: {{error}}": "Bestanden laden mislukt: {{error}}", + "Failed to load image.": "Afbeelding laden mislukt.", + "Failed to load image: {{filename}}": "Afbeelding laden mislukt: {{filename}}", + "Failed to load one or more PDF files.": "Een of meer PDF-bestanden laden mislukt.", + "Failed to load script: {{url}}": "Script laden mislukt: {{url}}", + "Failed to load template.": "Sjabloon laden mislukt.", + "Failed to load the PDF Editor.": "PDF-editor laden mislukt.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Afbeeldingsverwerker laden mislukt. Controleer of je browser SharedArrayBuffer ondersteunt (vereist HTTPS of localhost).", + "Failed to parse CSV: {{error}}": "CSV verwerken mislukt: {{error}}", + "Failed to parse signature": "Handtekening verwerken mislukt", + "Failed to parse the certificate file.": "Certificaatbestand verwerken mislukt.", + "Failed to process HEIC file: {{name}}": "HEIC-bestand verwerken mislukt: {{name}}", + "Failed to process WebP file: {{name}}": "WebP-bestand verwerken mislukt: {{name}}", + "Failed to read file.": "Bestand lezen mislukt.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Beperkingen verwijderen mislukt. De PDF vereist mogelijk het juiste eigenaarswachtwoord.", + "Failed to render page": "Pagina weergeven mislukt", + "Failed to render page previews": "Paginavoorbeelden weergeven mislukt", + "Failed to render page previews.": "Paginavoorbeelden weergeven mislukt.", + "Failed to render page.": "Pagina weergeven mislukt.", + "Failed to save changes.": "Wijzigingen opslaan mislukt.", + "Failed to save the new PDF. Check console for details.": "Nieuwe PDF opslaan mislukt. Bekijk de console voor details.", + "Failed to split PDF. Please check your selection.": "PDF splitsen mislukt. Controleer je selectie.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "PDF van tijdstempel voorzien mislukt: {{message}}\n\nProbeer een andere TSA-server of controleer je internetverbinding.", + "Failed to toggle layer visibility": "Laagzichtbaarheid wisselen mislukt", + "Failed to validate signatures. The file may be corrupted.": "Handtekeningen valideren mislukt. Het bestand is mogelijk beschadigd.", + "Features enabled by this module:": "Functies die door deze module worden ingeschakeld:", + "Field Name": "Veldnaam", + "Field Name (Group Name)": "Veldnaam (Groepsnaam)", + "Field Name Conflict": "Conflict in veldnaam", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "De veldnaam \"{{newName}}\" bestaat al in deze {{value}}. Probeer een unieke naam.", + "Field name cannot be empty": "De veldnaam mag niet leeg zijn", + "File": "Bestand", + "File Size": "Bestandsgrootte", + "File exists but could not be read. Check CORS configuration.": "Het bestand bestaat maar kon niet worden gelezen. Controleer de CORS-configuratie.", + "File list not found": "Bestandslijst niet gevonden", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Bestandsgrootte verkleind van {{originalSize}} naar {{compressedSize}} ({{percent}}% bespaard).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Bestand {{n}}/{{length}}: pagina {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Bestand {{n}}/{{length}}: {{message}}", + "Filename": "Bestandsnaam", + "Files that failed: {{errorCount}}.": "Mislukte bestanden: {{errorCount}}.", + "Fill (cover full target page)": "Vullen (hele doelpagina bedekken)", + "Fill Color": "Vulkleur", + "Finalizing PDF...": "PDF afronden...", + "Find & replace": "Zoeken en vervangen", + "Finds the best quality under this size. 0 means no target.": "Zoekt de beste kwaliteit onder dit formaat. 0 betekent geen doel.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox en Chrome kunnen tijdens het kiezen hun eigen datumkiezernotatie tonen. De juiste notatie wordt toegepast zodra je de datum hebt ingevoerd.", + "First Indent": "Eerste inspringing", + "Fit (keep full page visible)": "Passend (hele pagina zichtbaar houden)", + "Fit Page": "Pagina passend maken", + "Fix Page Size": "Paginagrootte fiksen", + "Flatten": "Platmaken", + "Flatten Forms": "Formulieren platmaken", + "Flatten annotations": "Annotaties platmaken", + "Flatten form fields": "Formuliervelden platmaken", + "Flatten forms and annotations": "Formulieren en annotaties platmaken", + "Flatten links": "Koppelingen platmaken", + "Flattening PDF...": "PDF platmaken...", + "Flattening and saving PDF...": "PDF platmaken en opslaan...", + "Flattening multiple PDFs...": "Meerdere PDF's platmaken...", + "Flattening page {{i}} of {{totalPages}}...": "Pagina {{i}} van {{totalPages}} platmaken...", + "Flattening {{n}}/{{length}}: {{name}}...": "Platmaken {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Zet de focus op de adresbalk", + "Font": "Lettertype", + "Font Color": "Letterkleur", + "Font Family": "Lettertypefamilie", + "Font Size": "Lettergrootte", + "Font size: {{bSize}} → {{aSize}}": "Lettergrootte: {{bSize}} → {{aSize}}", + "Font to Outline": "Lettertype naar contour", + "Font: {{bFont}} → {{aFont}}": "Lettertype: {{bFont}} → {{aFont}}", + "Fonts": "Lettertypen", + "Footer Center": "Voettekst midden", + "Footer Left": "Voettekst links", + "Footer Right": "Voettekst rechts", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Voor PDF's met alleen afbeeldingen, zoals scans. Wordt overgeslagen als het document selecteerbare tekst heeft, tenzij Inhoudsbeveiliging negeren aanstaat.", + "Form fields stop being fillable.": "Formuliervelden zijn niet meer invulbaar.", + "Format": "Indeling", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}} blanco pagina('s) gevonden. Klik op een pagina om de selectie op te heffen.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "{{length}} bestaande bladwijzers gevonden. Huidige bladwijzers vervangen?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length}} afbeelding(en) gevonden in {{length2}} PDF('s).", + "Front": "Voorkant", + "Full Coverage": "Volledige dekking", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Inhoudsopgave genereren uit bladwijzers", + "Generating High-Quality PDF...": "PDF van hoge kwaliteit genereren...", + "Generating PDF...": "PDF genereren...", + "Generating ZIP file...": "ZIP-bestand genereren...", + "Generating formatted content...": "Opgemaakte inhoud genereren...", + "Generating preview...": "Voorbeeld genereren...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (PDF/A-conversie)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB-conversie mislukt met afsluitcode {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript-conversie mislukt met afsluitcode {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript heeft geen uitvoerbestand gemaakt", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript is niet geconfigureerd. Configureer het in de geavanceerde instellingen.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript is niet geconfigureerd. Configureer het in de WASM-instellingen.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript is niet geconfigureerd. PyMuPDF heeft Ghostscript nodig voor sommige bewerkingen. Configureer beide in de geavanceerde instellingen.", + "Ghostscript threw an exception: {{e}}": "Ghostscript gaf een uitzondering: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "De Ghostscript-wrapper bood niet de verwachte interface. Verwacht: loadGS() of de klasse GhostscriptWASM.", + "Go": "Ga", + "Go to page": "Ga naar pagina", + "Grayscale": "Grijswaarden", + "Green": "Groen", + "Greyscale": "Grijswaarden", + "Grid Mode": "Rastermodus", + "Group Name (Must be same for group)": "Groepsnaam (moet voor de groep gelijk zijn)", + "H-Scale %": "Horizontale schaal %", + "Hanging Indent": "Hangende inspringing", + "Hard reloads page": "Laadt de pagina geforceerd opnieuw", + "Header & Footer": "Koptekst en voettekst", + "Header & Footer added successfully!": "Koptekst en voettekst toegevoegd!", + "Header Center": "Koptekst midden", + "Header Left": "Koptekst links", + "Header Right": "Koptekst rechts", + "Height ({{unit}})": "Hoogte ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Verbergen", + "Hide Border": "Rand verbergen", + "Hide password": "Wachtwoord verbergen", + "Hides window": "Verbergt het venster", + "High (288 DPI)": "Hoog (288 DPI)", + "High (Smallest Files)": "Hoog (kleinste bestanden)", + "Horizontal": "Horizontaal", + "Hue Shift": "Tintverschuiving", + "Image Format": "Afbeeldingsformaat", + "Image Input": "Afbeeldingsinvoer", + "Image quality": "Afbeeldingskwaliteit", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Afbeelding verkleind van {{width}}×{{height}} naar {{width2}}×{{height2}}", + "Images": "Afbeeldingen", + "Images above this are resampled down. None leaves resolution alone.": "Afbeeldingen boven deze waarde worden lager gesampled. Geen laat de resolutie ongemoeid.", + "Imported {{length}} bookmarks!": "{{length}} bladwijzers geïmporteerd!", + "Inches (in)": "Inches (in)", + "Include Attachments": "Bijlagen opnemen", + "Include Cc Bcc": "Cc en Bcc opnemen", + "Include this file": "Dit bestand opnemen", + "Incorrect Page Count": "Onjuist aantal pagina's", + "Incorrect Password": "Onjuist wachtwoord", + "Incorrect password": "Onjuist wachtwoord", + "Incorrect password. Please try again.": "Onjuist wachtwoord. Probeer het opnieuw.", + "Increase size": "Vergroten", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "PDF 1 indexeren, pagina {{pageNumber}} van {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "PDF 2 indexeren, pagina {{pageNumber}} van {{totalPages}}...", + "Info": "Info", + "Info Dictionary": "Info Dictionary", + "Inherit": "Overnemen", + "Initialization Error": "Initialisatiefout", + "Initializing Ghostscript...": "Ghostscript initialiseren...", + "Initializing PDF engine...": "PDF-engine initialiseren...", + "Initializing PyMuPDF...": "PyMuPDF initialiseren...", + "Initializing decryption...": "Ontsleuteling initialiseren...", + "Initializing encryption...": "Versleuteling initialiseren...", + "Initializing repair engine...": "Reparatie-engine initialiseren...", + "Initializing...": "Initialiseren...", + "Input Required": "Invoer vereist", + "Insecure Digest (MD5 / SHA-1)": "Onveilige digest (MD5 / SHA-1)", + "Insert blank pages": "Blanco pagina's invoegen", + "Insert blank pages after this page number": "Blanco pagina's invoegen na dit paginanummer", + "Interactive Form Fields": "Interactieve formuliervelden", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Pagina's van meerdere PDF's afwisselen (bijvoorbeeld oneven + omgekeerde even pagina's van een enkelzijdige scan)", + "Invalid Certificate": "Ongeldig certificaat", + "Invalid File": "Ongeldig bestand", + "Invalid Files": "Ongeldige bestanden", + "Invalid Input": "Ongeldige invoer", + "Invalid JSON format": "Ongeldig JSON-formaat", + "Invalid Name": "Ongeldige naam", + "Invalid Order": "Ongeldige volgorde", + "Invalid PDF password.": "Ongeldig PDF-wachtwoord.", + "Invalid Page Numbers": "Ongeldige paginanummers", + "Invalid Page Order": "Ongeldige paginavolgorde", + "Invalid Pages": "Ongeldige pagina's", + "Invalid Range": "Ongeldig bereik", + "Invalid Signature": "Ongeldige handtekening", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Ongeldige TSA-URL. De tijdstempelautoriteit moet een geldige http://- of https://-URL zijn.", + "Invalid URL": "Ongeldige URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Ongeldig URL-formaat. Voer een geldige URL in (bijvoorbeeld https://example.com/wasm/)", + "Invalid XML: no root element": "Ongeldige XML: geen hoofdelement", + "Invalid data": "Ongeldige gegevens", + "Invalid hex string in content stream": "Ongeldige hex-tekenreeks in de inhoudsstroom", + "Invalid page range specified.": "Ongeldig paginabereik opgegeven.", + "Invalid shortcut format": "Ongeldig sneltoetsformaat", + "Invalid: Cryptographic Verification Failed": "Ongeldig: cryptografische verificatie mislukt", + "Invert Colors": "Kleuren omkeren", + "Invert all colors": "Alle kleuren omkeren", + "Inverting PDF colors...": "PDF-kleuren omkeren...", + "Issuer": "Uitgever", + "It fits the {{targetBytes}} target.": "Het past binnen het doel van {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Het zit nog boven het doel van {{targetBytes}}, omdat PDF/A behouden beperkt hoeveel er gecomprimeerd kan worden.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Het claimt niet langer PDF/A-conformiteit. Zet PDF/A behouden aan onder Aangepaste instellingen om dat te behouden.", + "Italic": "Cursief", + "Item 1": "Item 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "De digitale handtekeningen zijn verwijderd om te kunnen comprimeren. Onderteken het opnieuw indien nodig.", + "JPEG (Smaller file size)": "JPEG (kleinere bestandsgrootte)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "JPEG-kwaliteit voor opnieuw gecodeerde afbeeldingen, 20 tot 100. Lager betekent kleinere bestanden en meer zichtbare artefacten.", + "JPG": "JPG", + "JSON Files": "JSON-bestanden", + "JSON Loaded": "JSON geladen", + "JSON to PDF": "JSON naar PDF", + "Javascript Code": "JavaScript-code", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Houdt een PDF/A-bestand conform. Brotli en rasteren worden overgeslagen zolang dit aanstaat.", + "Keeps only the characters the document uses.": "Houdt alleen de tekens die het document gebruikt.", + "Key (e.g., Department)": "Sleutel (bijvoorbeeld Afdeling)", + "Keywords": "Trefwoorden", + "Label": "Label", + "Label / Prompt": "Label / Prompt", + "Landscape": "Liggend", + "Language": "Taal", + "Layer not found": "Laag niet gevonden", + "Layer {{number}}": "Laag {{number}}", + "Leave blank for all pages": "Leeg laten voor alle pagina's", + "Left": "Links", + "Left edge in points (1 inch = 72 pts)": "Linkerrand in punten (1 inch = 72 pt)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Niveau", + "Limit recognized characters (leave empty for all)": "Herkende tekens beperken (leeg laten voor alle)", + "Line": "Lijn", + "Linearization Failed": "Lineariseren mislukt", + "Linearize": "Lineariseren", + "Links stop being clickable.": "Koppelingen zijn niet meer klikbaar.", + "Lists": "Lijsten", + "Load": "Laden", + "Load system fonts": "Systeemlettertypen laden", + "Load system fonts…": "Systeemlettertypen laden…", + "Loaded": "Geladen", + "Loaded bookmarks from JSON. Now upload your PDF.": "Bladwijzers geladen uit JSON. Upload nu je PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} bladwijzers geladen uit CSV. Upload nu je PDF.", + "Loading Engine...": "Engine laden...", + "Loading Ghostscript...": "Ghostscript laden...", + "Loading PDF Editor...": "PDF-editor laden...", + "Loading PDF Text Editor...": "PDF-teksteditor laden...", + "Loading PDF converter...": "PDF-converter laden...", + "Loading PDF documents...": "PDF-documenten laden...", + "Loading PDF engine...": "PDF-engine laden...", + "Loading PDF files...": "PDF-bestanden laden...", + "Loading PDF form...": "PDF-formulier laden...", + "Loading PDF processor...": "PDF-verwerker laden...", + "Loading PDF viewer...": "PDF-viewer laden...", + "Loading PDF...": "PDF laden...", + "Loading PDFs...": "PDF's laden...", + "Loading attachments...": "Bijlagen laden...", + "Loading comparison {{currentPage}} of {{length}}...": "Vergelijking {{currentPage}} van {{length}} laden...", + "Loading conversion engine ({{percent}}%)...": "Conversie-engine laden ({{percent}}%)...", + "Loading conversion engine...": "Conversie-engine laden...", + "Loading engine...": "Engine laden...", + "Loading fonts...": "Lettertypen laden...", + "Loading layers from {{name}}...": "Lagen uit {{name}} laden...", + "Loading page {{num}}...": "Pagina {{num}} laden...", + "Loading preview...": "Voorbeeld laden...", + "Loading {{name}}...": "{{name}} laden...", + "Loading...": "Laden...", + "Location": "Locatie", + "Lossless (No Quality Loss)": "Verliesvrij (geen kwaliteitsverlies)", + "Lossless (no image re-encoding)": "Verliesvrij (geen heroding van afbeeldingen)", + "Low (Best Quality)": "Laag (beste kwaliteit)", + "MOBI Files": "MOBI-bestanden", + "MOBI to PDF": "MOBI naar PDF", + "Malformed ByteRange": "Onjuist opgebouwde ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Onjuist opgebouwde ECDSA-handtekening (r,s kon niet worden gelezen)", + "Malformed inline image in content stream": "Onjuist opgebouwde inline-afbeelding in de inhoudsstroom", + "Malformed signatureAlgorithm": "Onjuist opgebouwde signatureAlgorithm", + "Margins": "Marges", + "Markdown Files": "Markdown-bestanden", + "Markdown to PDF": "Markdown naar PDF", + "Max Length (0 for unlimited)": "Maximale lengte (0 voor onbeperkt)", + "Maximum resolution": "Maximale resolutie", + "Medium (Recommended)": "Gemiddeld (aanbevolen)", + "Merge PDF": "PDF samenvoegen", + "Merge PDFs": "PDF's samenvoegen", + "Merge duplicate fonts": "Dubbele lettertypen samenvoegen", + "Mermaid Error: {{error}}": "Mermaid-fout: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadata als JSON naar het klembord gekopieerd.", + "Metadata removed successfully!": "Metadata verwijderd!", + "Metadata updated successfully!": "Metadata bijgewerkt!", + "Millimeters (mm)": "Millimeters (mm)", + "Minimizes window": "Minimaliseert het venster", + "Missing Files": "Ontbrekende bestanden", + "Missing signatureAlgorithm": "signatureAlgorithm ontbreekt", + "Mixed Page Sizes Detected": "Gemengde paginaformaten gedetecteerd", + "Mixed Sizes": "Gemengde formaten", + "Mode": "Modus", + "Modified": "Gewijzigd", + "Modified After Signing (signed part intact)": "Gewijzigd na ondertekening (ondertekende deel intact)", + "More": "Meer", + "Moved": "Verplaatst", + "Moved \"{{value}}\"": "\"{{value}}\" verplaatst", + "Multi-line": "Meerdere regels", + "Must be a positive integer": "Moet een positief geheel getal zijn", + "Must be a positive number": "Moet een positief getal zijn", + "N must be at least 1.": "N moet minstens 1 zijn.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF gemaakt!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Netwerkfout: kon geen verbinding maken met de URL. Controleer of de URL klopt en of de server CORS-verzoeken toestaat.", + "Network error: {{error}}": "Netwerkfout: {{error}}", + "Next page": "Volgende pagina", + "No Area Selected": "Geen gebied geselecteerd", + "No Attachments": "Geen bijlagen", + "No Changes": "Geen wijzigingen", + "No Crop Area": "Geen bijsnijdgebied", + "No File": "Geen bestand", + "No Files": "Geen bestanden", + "No Images Found": "Geen afbeeldingen gevonden", + "No PDF Files": "Geen PDF-bestanden", + "No PDF document loaded": "Geen PDF-document geladen", + "No PDF document loaded.": "Geen PDF-document geladen.", + "No PDF file loaded.": "Geen PDF-bestand geladen.", + "No PDF files could be decrypted. The password may be incorrect.": "Er kon geen PDF-bestand worden ontsleuteld. Het wachtwoord is mogelijk onjuist.", + "No PDF files could be linearized.": "Er kon geen PDF-bestand worden gelineariseerd.", + "No PDFs could be processed.": "Er kon geen PDF worden verwerkt.", + "No Pages": "Geen pagina's", + "No Selection": "Geen selectie", + "No Signatures Found": "Geen handtekeningen gevonden", + "No Tables Found": "Geen tabellen gevonden", + "No Text": "Geen tekst", + "No URL configured": "Geen URL geconfigureerd", + "No attachments found in this PDF.": "Geen bijlagen gevonden in deze PDF.", + "No attachments selected for removal.": "Geen bijlagen geselecteerd om te verwijderen.", + "No blank pages detected in this PDF.": "Geen blanco pagina's gedetecteerd in deze PDF.", + "No bookmarks found at the selected level.": "Geen bladwijzers gevonden op het geselecteerde niveau.", + "No bookmarks to delete.": "Geen bladwijzers om te verwijderen.", + "No bookmarks to export!": "Geen bladwijzers om te exporteren!", + "No certificate found in PEM file": "Geen certificaat gevonden in PEM-bestand", + "No certificate found in PFX file": "Geen certificaat gevonden in PFX-bestand", + "No certificates found in signature": "Geen certificaten gevonden in handtekening", + "No changes match the current filter.": "Geen wijzigingen komen overeen met het huidige filter.", + "No configurable settings for this node.": "Geen configureerbare instellingen voor dit knooppunt.", + "No differences detected on this page.": "Geen verschillen gevonden op deze pagina.", + "No embedded images were found in the selected PDF(s).": "Geen ingesloten afbeeldingen gevonden in de geselecteerde PDF('s).", + "No existing bookmarks found in this PDF.": "Geen bestaande bladwijzers gevonden in deze PDF.", + "No items were selected for removal or none were found in the PDF.": "Er zijn geen items geselecteerd om te verwijderen of er zijn er geen gevonden in de PDF.", + "No page pairs to export.": "Geen paginaparen om te exporteren.", + "No pages found. Please create a blank PDF or upload one.": "Geen pagina's gevonden. Maak een blanco PDF of upload er een.", + "No pages selected for removal.": "Geen pagina's geselecteerd om te verwijderen.", + "No pages were selected for splitting.": "Er zijn geen pagina's geselecteerd om te splitsen.", + "No paired page for this side.": "Geen gekoppelde pagina voor deze kant.", + "No private key found in PEM file": "Geen privésleutel gevonden in PEM-bestand", + "No private key found in PFX file": "Geen privésleutel gevonden in PFX-bestand", + "No tables were detected in this PDF.": "Er zijn geen tabellen gedetecteerd in deze PDF.", + "No valid page numbers found.": "Geen geldige paginanummers gevonden.", + "No valid pages to save.": "Geen geldige pagina's om op te slaan.", + "No worker": "Geen worker", + "Noise": "Ruis", + "None": "Geen", + "None of the files could be compressed: {{join}}.": "Geen van de bestanden kon worden gecomprimeerd: {{join}}.", + "Normal": "Normaal", + "Not Enough Files": "Te weinig bestanden", + "Not a PDF": "Geen PDF", + "Not connected": "Niet verbonden", + "Not in trust chain": "Niet in de vertrouwensketen", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Let op: zonder apart eigenaarswachtwoord heeft de PDF geen gebruiksbeperkingen.", + "Number Format": "Getalnotatie", + "Number of Pages": "Aantal pagina's", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR afgebroken voordat er een pagina was verwerkt", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR-herkenning is verlopen na {{timeoutMs}} ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODG-bestanden", + "ODG to PDF": "ODG naar PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Uit (standaard): natuurlijke nummering van 1 tot N. Aan: de oorspronkelijke paginalabels van elk bestand blijven behouden (kan dubbele labels geven).", + "One PDF per page": "Eén PDF per pagina", + "One PDF per range": "Eén PDF per bereik", + "Only a substitute font was available": "Alleen een vervangend lettertype was beschikbaar", + "Only where it does not change how the image looks.": "Alleen waar het de weergave van de afbeelding niet verandert.", + "Opacity": "Dekking", + "Open URL": "URL openen", + "Opens incognito window": "Opent een incognitovenster", + "Opens new tab": "Opent een nieuw tabblad", + "Opens new window": "Opent een nieuw venster", + "Operation Failed": "Bewerking mislukt", + "Operation resulted in an empty file.": "De bewerking leverde een leeg bestand op.", + "Optimize PDF for fast web viewing": "PDF optimaliseren voor snel bekijken op het web", + "Optimizing PDFs for web view (linearizing)...": "PDF's optimaliseren voor webweergave (lineariseren)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "{{name}} optimaliseren ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opties (één per regel of gescheiden door komma's)", + "Orientation": "Oriëntatie", + "Outline": "Contour", + "Output": "Uitvoer", + "Overlay": "Overlay", + "Overlay or underlay pages from one PDF onto another": "Pagina's van de ene PDF over of onder een andere PDF leggen", + "Owner Password": "Eigenaarswachtwoord", + "Owner Password Required": "Eigenaarswachtwoord vereist", + "PDF": "PDF", + "PDF Files": "PDF-bestanden", + "PDF Input": "PDF-invoer", + "PDF Layers": "PDF-lagen", + "PDF Metadata": "PDF-metadata", + "PDF Producer": "PDF-producent", + "PDF converted to CSV successfully!": "PDF naar CSV geconverteerd!", + "PDF converted to SVG successfully!": "PDF naar SVG geconverteerd!", + "PDF converted to greyscale successfully!": "PDF naar grijswaarden geconverteerd!", + "PDF created successfully!": "PDF gemaakt!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF ontsleuteld! Alle versleuteling en beperkingen zijn verwijderd.", + "PDF decrypted successfully! Your download has started.": "PDF ontsleuteld! Je download is gestart.", + "PDF downloaded successfully.": "PDF gedownload.", + "PDF encrypted successfully with 256-bit AES!": "PDF versleuteld met 256-bit AES!", + "PDF has been sanitized and downloaded.": "De PDF is opgeschoond en gedownload.", + "PDF has no pages": "De PDF heeft geen pagina's", + "PDF organized successfully!": "PDF georganiseerd!", + "PDF permissions changed successfully!": "PDF-rechten gewijzigd!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF-lezers leveren de 14 standaard PDF-lettertypen zelf mee.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF-beperkingen verwijderd! Het bestand is nu volledig bewerkbaar en afdrukbaar.", + "PDF saved successfully!": "PDF opgeslagen!", + "PDF split successfully!": "PDF gesplitst!", + "PDF to CSV": "PDF naar CSV", + "PDF to DOCX": "PDF naar DOCX", + "PDF to Excel/CSV": "PDF naar Excel/CSV", + "PDF to Images": "PDF naar afbeeldingen", + "PDF to Images (High Quality)": "PDF naar afbeeldingen (hoge kwaliteit)", + "PDF to JSON": "PDF naar JSON", + "PDF to Markdown": "PDF naar Markdown", + "PDF to PDF/A": "PDF naar PDF/A", + "PDF to SVG": "PDF naar SVG", + "PDF to Text": "PDF naar Text", + "PDF to XLSX": "PDF naar XLSX", + "PDF with layer changes saved!": "PDF met laagwijzigingen opgeslagen!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} toegepast.", + "PDF/A Conversion": "PDF/A-conversie", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (strikt, geen transparantie)", + "PDF/A-2b (Recommended)": "PDF/A-2b (aanbevolen)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (modern, staat bijlagen toe)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "De PDF's zijn gemixt!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (verliesvrij)", + "PUB to PDF": "PUB naar PDF", + "Page": "Pagina", + "Page #": "Pagina #", + "Page Added": "Pagina toegevoegd", + "Page Numbers": "Paginanummers", + "Page Removed": "Pagina verwijderd", + "Page Size": "Paginaformaat", + "Page X of Y": "Pagina X van Y", + "Page background or layout changed": "Pagina-achtergrond of lay-out gewijzigd", + "Page container not found": "Paginacontainer niet gevonden", + "Page extraction produced an empty PDF.": "Het extraheren van pagina's leverde een lege PDF op.", + "Page number": "Paginanummer", + "Page numbers added successfully!": "Paginanummers toegevoegd!", + "Page sizes standardized successfully!": "Paginaformaten gestandaardiseerd!", + "Page {{currentPageNum}} of {{numPages}}": "Pagina {{currentPageNum}} van {{numPages}}", + "Page {{num}} / {{numPages}}": "Pagina {{num}} / {{numPages}}", + "Page {{n}} ": "Pagina {{n}}", + "Page {{n}} of {{length}}": "Pagina {{n}} van {{length}}", + "Page {{n}}:": "Pagina {{n}}:", + "Page {{pageNumber}}": "Pagina {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Pagina {{pageNumber}} bestaat alleen in de eerste PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Pagina {{pageNumber}} bestaat alleen in de tweede PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Pagina {{pageNumber}} van {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Pagina {{pageNum}} bestaat niet in deze PDF.", + "Page {{page}}": "Pagina {{page}}", + "Page {{page}} attachment": "Bijlage bij pagina {{page}}", + "Pages": "Pagina's", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Pagina's (bijvoorbeeld 1-3, 5) - Totaal: {{pageCount}}", + "Pages Files": "Pages-bestanden", + "Pages Per Sheet": "Pagina's per vel", + "Pages combined successfully!": "Pagina's gecombineerd!", + "Pages have been divided successfully!": "Pagina's opgedeeld!", + "Pages have been reordered.": "Pagina's opnieuw gerangschikt.", + "Pages have been reversed successfully!": "Pagina's omgekeerd!", + "Pages to PDF": "Pages naar PDF", + "Paper Size": "Papierformaat", + "Paragraph": "Alinea", + "Parsing XML structure...": "XML-structuur verwerken...", + "Parsing {{name}}...": "{{name}} verwerken...", + "Partial Coverage": "Gedeeltelijke dekking", + "Partial Success": "Gedeeltelijk gelukt", + "Password": "Wachtwoord", + "Password Error": "Wachtwoordfout", + "Password Needed": "Wachtwoord nodig", + "Password Required": "Wachtwoord vereist", + "Password for all files": "Wachtwoord voor alle bestanden", + "Password for all locked files": "Wachtwoord voor alle vergrendelde bestanden", + "Password for {{name}}": "Wachtwoord voor {{name}}", + "Password protected": "Beveiligd met wachtwoord", + "Password required for encrypted private key": "Wachtwoord vereist voor versleutelde privésleutel", + "Path Stroke": "Padlijn", + "Please add at least one field before downloading.": "Voeg minstens één veld toe voordat je downloadt.", + "Please draw a rectangle on at least one page to select the crop area.": "Teken een rechthoek op minstens één pagina om het bijsnijdgebied te selecteren.", + "Please ensure all page numbers in the order are unique.": "Zorg dat alle paginanummers in de volgorde uniek zijn.", + "Please enter a layer name": "Voer een laagnaam in", + "Please enter a name.": "Voer een naam in.", + "Please enter a number between 0 and {{totalPages}}.": "Voer een getal in tussen 0 en {{totalPages}}.", + "Please enter a page order.": "Voer een paginavolgorde in.", + "Please enter a password": "Voer een wachtwoord in", + "Please enter a password for {{i}} or skip it": "Voer een wachtwoord in voor {{i}} of sla het over", + "Please enter a title.": "Voer een titel in.", + "Please enter a user password.": "Voer een gebruikerswachtwoord in.", + "Please enter a valid number of pages (1 or more).": "Voer een geldig aantal pagina's in (1 of meer).", + "Please enter a valid page number between 1 and {{total}}": "Voer een geldig paginanummer in tussen 1 en {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Voer een geldig paginabereik in (bijvoorbeeld 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Voer de paginanummers in die je wilt extraheren.", + "Please enter positive numbers.": "Voer positieve getallen in.", + "Please enter some text to convert.": "Voer tekst in om te converteren.", + "Please enter text for the watermark.": "Voer tekst in voor het watermerk.", + "Please enter the PDF password.": "Voer het PDF-wachtwoord in.", + "Please load a PDF first.": "Laad eerst een PDF.", + "Please select PDF files to create a ZIP archive.": "Selecteer PDF-bestanden om een ZIP-archief te maken.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Selecteer een certificaatbestand van het type .pem, .crt, .cer of .der.", + "Please select a PDF file.": "Selecteer een PDF-bestand.", + "Please select a valid PDF file.": "Selecteer een geldig PDF-bestand.", + "Please select an area on at least one page to crop.": "Selecteer op minstens één pagina een gebied om bij te snijden.", + "Please select an area to crop first.": "Selecteer eerst een gebied om bij te snijden.", + "Please select an area to crop.": "Selecteer een gebied om bij te snijden.", + "Please select an image file for the watermark.": "Selecteer een afbeeldingsbestand voor het watermerk.", + "Please select at least one BMP file.": "Selecteer minstens één BMP-bestand.", + "Please select at least one CSV file.": "Selecteer minstens één CSV-bestand.", + "Please select at least one Excel file.": "Selecteer minstens één Excel-bestand.", + "Please select at least one HEIC file.": "Selecteer minstens één HEIC-bestand.", + "Please select at least one JPG file.": "Selecteer minstens één JPG-bestand.", + "Please select at least one JPG or JPEG2000 image.": "Selecteer minstens één JPG- of JPEG2000-afbeelding.", + "Please select at least one ODT file.": "Selecteer minstens één ODT-bestand.", + "Please select at least one PDF file.": "Selecteer minstens één PDF-bestand.", + "Please select at least one PowerPoint file.": "Selecteer minstens één PowerPoint-bestand.", + "Please select at least one RTF file.": "Selecteer minstens één RTF-bestand.", + "Please select at least one SVG file.": "Selecteer minstens één SVG-bestand.", + "Please select at least one TIFF file.": "Selecteer minstens één TIFF-bestand.", + "Please select at least one Word document.": "Selecteer minstens één Word-document.", + "Please select at least one file to attach.": "Selecteer minstens één bestand om bij te voegen.", + "Please select at least one image file.": "Selecteer minstens één afbeeldingsbestand.", + "Please select at least one text file.": "Selecteer minstens één tekstbestand.", + "Please select at least one {{FILETYPE_NAME}} file.": "Selecteer minstens één {{FILETYPE_NAME}}-bestand.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Selecteer minstens één {{TOOL_NAME}}-bestand (.eml of .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Selecteer minstens één {{TOOL_NAME}}-bestand.", + "Please select even or odd pages.": "Kies even of oneven pagina's.", + "Please select one or more PDF files.": "Selecteer een of meer PDF-bestanden.", + "Please select pages to delete.": "Selecteer pagina's om te verwijderen.", + "Please select pages to duplicate.": "Selecteer pagina's om te dupliceren.", + "Please select pages to mark for splitting.": "Selecteer pagina's om te markeren voor splitsen.", + "Please select pages to rotate.": "Selecteer pagina's om te roteren.", + "Please specify a page range for page-level attachments.": "Geef een paginabereik op voor bijlagen op paginaniveau.", + "Please upload PDF files.": "Upload PDF-bestanden.", + "Please upload PDFs first.": "Upload eerst PDF's.", + "Please upload a .docx file first.": "Upload eerst een .docx-bestand.", + "Please upload a PDF file first.": "Upload eerst een PDF-bestand.", + "Please upload a PDF file.": "Upload een PDF-bestand.", + "Please upload a PDF first.": "Upload eerst een PDF.", + "Please upload a valid PDF file.": "Upload een geldig PDF-bestand.", + "Please upload at least one PDF file.": "Upload minstens één PDF-bestand.", + "Please upload at least two PDF files to alternate and mix.": "Upload minstens twee PDF-bestanden om af te wisselen en te mixen.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Upload zowel een basis-PDF als een overlay-/underlay-PDF.", + "Please upload valid PDF files.": "Upload geldige PDF-bestanden.", + "Please use the Download button in the PDF viewer toolbar above.": "Gebruik de downloadknop in de werkbalk van de PDF-viewer hierboven.", + "Please wait for the PDF viewer to load.": "Wacht tot de PDF-viewer is geladen.", + "Please wait for the form to finish loading.": "Wacht tot het formulier klaar is met laden.", + "Portrait": "Staand", + "Position": "Positie", + "Post-processing for transparency compliance...": "Nabewerking voor transparantiecompliance...", + "Posterize": "Posteriseren", + "Posterizing PDF...": "PDF posteriseren...", + "PowerPoint to PDF": "PowerPoint naar PDF", + "Pre Flatten": "Vooraf platmaken", + "Pre-flattening PDF...": "PDF vooraf platmaken...", + "Prefer JPEG 2000 for photos": "JPEG 2000 verkiezen voor foto's", + "Preparing PDF export...": "PDF-export voorbereiden...", + "Preparing conversion...": "Conversie voorbereiden...", + "Preparing download...": "Download voorbereiden...", + "Preparing preview...": "Voorbeeld voorbereiden...", + "Presentations": "Presentaties", + "Preserve PDF/A": "PDF/A behouden", + "Preview": "Voorbeeld", + "Preview Error": "Voorbeeldfout", + "Preview Text": "Voorbeeldtekst", + "Previous page": "Vorige pagina", + "Print Form": "Formulier afdrukken", + "Private data that editing apps store inside the PDF.": "Privégegevens die bewerkingsapps in de PDF opslaan.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF's verwerkt.", + "Processing Complete": "Verwerking voltooid", + "Processing Dpi": "Verwerkings-dpi", + "Processing Failed": "Verwerking mislukt", + "Processing PDF permissions...": "PDF-rechten verwerken...", + "Processing attachments...": "Bijlagen verwerken...", + "Processing failed for {{name}}.": "Verwerking mislukt voor {{name}}.", + "Processing file {{n}} of {{length}}...": "Bestand {{n}} van {{length}} verwerken...", + "Processing images...": "Afbeeldingen verwerken...", + "Processing multiple PDFs...": "Meerdere PDF's verwerken...", + "Processing page {{i}} of {{numPages}}": "Pagina {{i}} van {{numPages}} verwerken", + "Processing page {{i}} of {{numPages}}...": "Pagina {{i}} van {{numPages}} verwerken...", + "Processing page {{n}} of {{length}}...": "Pagina {{n}} van {{length}} verwerken...", + "Processing page {{pageNum}} of {{length}}...": "Pagina {{pageNum}} van {{length}} verwerken...", + "Processing page {{pageNum}} of {{totalPages}}...": "Pagina {{pageNum}} van {{totalPages}} verwerken...", + "Processing produced an empty file.": "De verwerking leverde een leeg bestand op.", + "Processing resulted in an empty file.": "De verwerking leverde een leeg bestand op.", + "Processing sheet {{n}}...": "Vel {{n}} verwerken...", + "Processing {{name}}...": "{{name}} verwerken...", + "Processing {{nodeName}}...": "{{nodeName}} verwerken...", + "Processing {{n}}/{{length}}: {{name}}...": "Verwerken {{n}}/{{length}}: {{name}}...", + "Processing...": "Verwerken...", + "Producer": "Producent", + "Publisher Files": "Publisher-bestanden", + "Purple": "Paars", + "PyMuPDF (Document Processing)": "PyMuPDF (documentverwerking)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF is niet geconfigureerd. Configureer het in de geavanceerde instellingen.", + "PyMuPDF module did not export expected PyMuPDF class.": "De PyMuPDF-module exporteerde niet de verwachte PyMuPDF-klasse.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF heeft een leeg ontsleuteld bestand opgeleverd.", + "PyMuPDF: not configured.": "PyMuPDF: niet geconfigureerd.", + "QR Code": "QR-code", + "Quality": "Kwaliteit", + "Quits application (cannot be overridden)": "Sluit de applicatie af (kan niet worden overschreven)", + "RSA-PKCS1 signature does not verify against signer public key": "De RSA-PKCS1-handtekening komt niet overeen met de openbare sleutel van de ondertekenaar", + "RSA-PSS signature does not verify against signer public key": "De RSA-PSS-handtekening komt niet overeen met de openbare sleutel van de ondertekenaar", + "Rasterization Complete": "Rasteren voltooid", + "Rasterization Partial": "Gedeeltelijk gerasterd", + "Rasterize": "Rasteren", + "Rasterize Dpi": "Raster-dpi", + "Rasterize pages to images": "Pagina's rasteren naar afbeeldingen", + "Rasterize quality": "Rasterkwaliteit", + "Rasterize resolution (DPI)": "Rasterresolutie (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF('s) gerasterd, {{failed}} mislukt.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "{{name}} rasteren ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "{{name}} rasteren...", + "Rasterizing...": "Rasteren...", + "Rating must be between 0 and 5": "De waardering moet tussen 0 en 5 liggen", + "Read Only": "Alleen lezen", + "Reading CSV file...": "CSV-bestand lezen...", + "Reading PDF...": "PDF lezen...", + "Reading XML file...": "XML-bestand lezen...", + "Reading encrypted PDF...": "Versleutelde PDF lezen...", + "Reading files...": "Bestanden lezen...", + "Reading layer configuration...": "Laagconfiguratie lezen...", + "Reading {{name}} ({{n}}/{{length}})...": "{{name}} lezen ({{n}}/{{length}})...", + "Ready": "Gereed", + "Reason": "Reden", + "Red": "Rood", + "Redact": "Redigeren", + "Redact Mode": "Redactiemodus", + "Redact text from PDF": "Tekst uit PDF redigeren", + "Redaction Failed": "Redigeren mislukt", + "Reduce PDF file size": "PDF-bestandsgrootte verkleinen", + "Reduce color complexity": "Kleurcomplexiteit verminderen", + "Reduces file size by removing color information.": "Verkleint de bestandsgrootte door kleurinformatie te verwijderen.", + "Reloads page": "Laadt de pagina opnieuw", + "Remove": "Verwijderen", + "Remove All Attachments": "Alle bijlagen verwijderen", + "Remove Annotations": "Annotaties verwijderen", + "Remove Blank Pages": "Blanco pagina's verwijderen", + "Remove Embedded Files": "Ingesloten bestanden verwijderen", + "Remove Fonts": "Lettertypen verwijderen", + "Remove Javascript": "JavaScript verwijderen", + "Remove Layers": "Lagen verwijderen", + "Remove Links": "Koppelingen verwijderen", + "Remove Mark Info": "Mark Info verwijderen", + "Remove Metadata": "Metadata verwijderen", + "Remove PDF password protection": "Wachtwoordbeveiliging van PDF verwijderen", + "Remove Structure Tree": "Structuurboom verwijderen", + "Remove alternate images": "Alternatieve afbeeldingen verwijderen", + "Remove application data": "Applicatiegegevens verwijderen", + "Remove article threads": "Artikelthreads verwijderen", + "Remove attachment": "Bijlage verwijderen", + "Remove blank pages automatically": "Blanco pagina's automatisch verwijderen", + "Remove document structure tree": "Documentstructuurboom verwijderen", + "Remove file": "Bestand verwijderen", + "Remove metadata, scripts, and hidden data": "Metadata, scripts en verborgen gegevens verwijderen", + "Remove output intents": "Output intents verwijderen", + "Remove page thumbnails": "Paginaminiaturen verwijderen", + "Remove specific pages": "Specifieke pagina's verwijderen", + "Remove web capture information": "Webcapture-informatie verwijderen", + "Remove {{name}}": "{{name}} verwijderen", + "Removed \"{{beforeText}}\"": "\"{{beforeText}}\" verwijderd", + "Removed image ({{width}}×{{height}})": "Afbeelding verwijderd ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} blanco pagina('s) verwijderd!", + "Removing all metadata...": "Alle metadata verwijderen...", + "Removing annotations...": "Annotaties verwijderen...", + "Removing redacted text from document data...": "Geredigeerde tekst uit documentgegevens verwijderen...", + "Removing restrictions...": "Beperkingen verwijderen...", + "Removing {{length}} blank page(s)...": "{{length}} blanco pagina('s) verwijderen...", + "Render Error": "Weergavefout", + "Rendering Page {{num}}...": "Pagina {{num}} weergeven...", + "Rendering page previews...": "Paginavoorbeelden weergeven...", + "Rendering page previews: {{current}}/{{total}}": "Paginavoorbeelden weergeven: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Pagina {{n}} van {{length}} weergeven...", + "Rendering preview for page {{pageNum}}...": "Voorbeeld voor pagina {{pageNum}} weergeven...", + "Reopens closed tab": "Heropent het gesloten tabblad", + "Repair": "Repareren", + "Repair Failed": "Repareren mislukt", + "Repair corrupted PDF": "Beschadigde PDF repareren", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} bestand(en) gerepareerd. Repareren mislukt: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "{{name}} repareren ({{n}}/{{length}})...", + "Repairing {{name}}...": "{{name}} repareren...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "\"{{beforeText}}\" vervangen door \"{{afterText}}\"", + "Required": "Vereist", + "Resamples even when an image is only slightly above the limit.": "Samplet opnieuw, ook als een afbeelding maar net boven de limiet zit.", + "Reset Form": "Formulier resetten", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Resetten en teruggaan naar de bestandsuploader? Alle niet-opgeslagen wijzigingen gaan verloren.", + "Resolution": "Resolutie", + "Retain Page Labels": "Paginalabels behouden", + "Retry Failed": "Opnieuw proberen mislukt", + "Reverse Pages": "Pagina's omkeren", + "Reverse page order": "Paginavolgorde omkeren", + "Reversing page order...": "Paginavolgorde omkeren...", + "Reversing {{name}} ({{n}}/{{length}})...": "{{name}} omkeren ({{n}}/{{length}})...", + "Right": "Rechts", + "Right edge in points": "Rechterrand in punten", + "Rotate": "Roteren", + "Rotate +90°": "+90° roteren", + "Rotate all pages": "Alle pagina's roteren", + "Rotation": "Rotatie", + "Rotation Variance": "Rotatievariantie", + "Rotations applied successfully!": "Rotaties toegepast!", + "Rows": "Rijen", + "Run Javascript": "JavaScript uitvoeren", + "Running OCR on page {{pageNum}}...": "OCR uitvoeren op pagina {{pageNum}}...", + "Running...": "Bezig...", + "SVG": "SVG", + "SVG Files": "SVG-bestanden", + "SVG to PDF": "SVG naar PDF", + "Sanitize": "Opschonen", + "Sanitized With Warnings": "Opgeschoond met waarschuwingen", + "Sanitizing PDF...": "PDF opschonen...", + "Saturation": "Verzadiging", + "Saved": "Opgeslagen", + "Saving PDF with layer changes...": "PDF met laagwijzigingen opslaan...", + "Scaling Mode": "Schaalmodus", + "Scanner Effect": "Scannereffect", + "Scanner effect applied successfully!": "Scannereffect toegepast!", + "Scanning page {{n}} of {{pageCount}}...": "Pagina {{n}} van {{pageCount}} scannen...", + "Search Text": "Tekst zoeken", + "Search languages...": "Talen zoeken...", + "Select Font": "Lettertype kiezen", + "Select a field to edit properties": "Selecteer een veld om de eigenschappen te bewerken", + "Select a field...": "Selecteer een veld...", + "Select to add this button to an existing group": "Selecteer om deze knop aan een bestaande groep toe te voegen", + "Selected Option": "Geselecteerde optie", + "Self-Signed: Signer Identity Not Verified": "Zelfondertekend: identiteit van de ondertekenaar niet geverifieerd", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Zelf gehoste OCR-assets zijn gedeeltelijk geconfigureerd. Stel {{missing}} samen met de andere Tesseract-asset-URL's in.", + "Separator": "Scheidingslijn", + "Separator Color": "Kleur van scheidingslijn", + "Separator Thickness": "Dikte van scheidingslijn", + "Sepia": "Sepia", + "Serial Number:": "Serienummer:", + "Set custom destination": "Aangepaste bestemming instellen", + "Shapes": "Vormen", + "Sheet {{n}} {{sideLabel}}": "Vel {{n}} {{sideLabel}}", + "Show": "Tonen", + "Show password": "Wachtwoord tonen", + "Show/Hide Field": "Veld tonen/verbergen", + "Sign Here": "Hier ondertekenen", + "Signature /Contents is not a single DER object followed by zero padding": "De handtekening /Contents is niet één enkel DER-object gevolgd door nulopvulling", + "Signature Algorithm:": "Handtekeningalgoritme:", + "Signature Intact: Signer Identity Not Verified": "Handtekening intact: identiteit van de ondertekenaar niet geverifieerd", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Handtekeningvelden zijn AcroForm-handtekeningvelden en zijn alleen zichtbaar in een geavanceerde PDF-viewer.", + "Signature has a missing or malformed /ByteRange": "De handtekening heeft een ontbrekende of onjuiste /ByteRange", + "Signature scheme {{kind}} not implemented": "Handtekeningschema {{kind}} is niet geïmplementeerd", + "Signature {{n}}": "Handtekening {{n}}", + "Signatures": "Handtekeningen", + "Signed By": "Ondertekend door", + "Signed On": "Ondertekend op", + "Signed PDF Not Changed": "Ondertekende PDF niet gewijzigd", + "Signed PDF downloaded successfully!": "Ondertekende PDF gedownload!", + "Signed PDF saved successfully!": "Ondertekende PDF opgeslagen!", + "Simple (1, 2, 3)": "Eenvoudig (1, 2, 3)", + "Simplify large color profiles": "Grote kleurprofielen vereenvoudigen", + "Skew Threshold": "Scheefstandsdrempel", + "Skip": "Overslaan", + "Skip All": "Alles overslaan", + "Skip Remaining": "Rest overslaan", + "Skip this file": "Dit bestand overslaan", + "Skipped: {{join}}.": "Overgeslagen: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Kleinere bestanden, maar alleen lezers met Brotli-ondersteuning kunnen ze openen, zoals Firefox, MuPDF 1.26+ en Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Sommige bestanden zijn overgeslagen omdat het geen ondersteunde afbeeldingen zijn.", + "Some files were skipped. Only BMP files are allowed.": "Sommige bestanden zijn overgeslagen. Alleen BMP-bestanden zijn toegestaan.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Sommige bestanden zijn overgeslagen. Alleen HEIC/HEIF-bestanden zijn toegestaan.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Sommige bestanden zijn overgeslagen. Alleen JPG-, JPEG-, JP2- en JPX-bestanden zijn toegestaan.", + "Some files were skipped. Only PDF files are allowed.": "Sommige bestanden zijn overgeslagen. Alleen PDF-bestanden zijn toegestaan.", + "Some files were skipped. Only PNG images are allowed.": "Sommige bestanden zijn overgeslagen. Alleen PNG-afbeeldingen zijn toegestaan.", + "Some files were skipped. Only SVG graphics are allowed.": "Sommige bestanden zijn overgeslagen. Alleen SVG-afbeeldingen zijn toegestaan.", + "Some files were skipped. Only TIFF files are allowed.": "Sommige bestanden zijn overgeslagen. Alleen TIFF-bestanden zijn toegestaan.", + "Some files were skipped. Only WebP images are allowed.": "Sommige bestanden zijn overgeslagen. Alleen WebP-afbeeldingen zijn toegestaan.", + "Some files were skipped. Only supported image formats are allowed.": "Sommige bestanden zijn overgeslagen. Alleen ondersteunde afbeeldingsformaten zijn toegestaan.", + "Some files were skipped. Only text files are allowed.": "Sommige bestanden zijn overgeslagen. Alleen tekstbestanden zijn toegestaan.", + "Some pages could not be processed. Please try again.": "Sommige pagina's konden niet worden verwerkt. Probeer het opnieuw.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Sommige redactiemarkeringen konden niet worden toegepast, dus het bestand is niet gedownload. Pas ze toe of verwijder ze in de editor en probeer het opnieuw.", + "Spacing": "Tussenruimte", + "Split PDF": "PDF splitsen", + "Split by Bookmarks": "Splitsen op bladwijzers", + "Split pages into tile grid for poster printing": "Pagina's opdelen in een tegelraster voor posterafdrukken", + "Split pages vertically or horizontally": "Pagina's verticaal of horizontaal splitsen", + "Splitting PDF pages...": "PDF-pagina's splitsen...", + "Splitting PDF...": "PDF splitsen...", + "Spreadsheets": "Spreadsheets", + "Standard (192 DPI)": "Standaard (192 DPI)", + "Standard Size": "Standaardformaat", + "Standardize all pages to a target size": "Alle pagina's standaardiseren naar een doelformaat", + "Standardizing pages...": "Pagina's standaardiseren...", + "Stitch all pages into one continuous page": "Alle pagina's samenvoegen tot één doorlopende pagina", + "Straighten skewed PDF pages": "Scheve PDF-pagina's rechtzetten", + "Strip all annotations": "Alle annotaties verwijderen", + "Style": "Stijl", + "Style Changed": "Stijl gewijzigd", + "Style changed ({{length}} regions)": "Stijl gewijzigd ({{length}} gebieden)", + "Subject": "Onderwerp", + "Subset embedded fonts": "Ingesloten lettertypen subsetten", + "Success": "Gelukt", + "Success!": "Gelukt!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} CSV-bestand(en) geconverteerd naar PDF.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} Excel-bestand(en) geconverteerd naar PDF.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} ODT-bestand(en) geconverteerd naar PDF.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF('s) geconverteerd naar DOCX.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF('s) geconverteerd naar Markdown.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF('s) geconverteerd naar {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} PSD-bestanden geconverteerd naar één PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} PowerPoint-bestand(en) geconverteerd naar PDF.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} RTF-bestand(en) geconverteerd naar PDF.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} Word-document(en) geconverteerd naar PDF.", + "Successfully converted {{length}} files to PDF.": "{{length}} bestanden geconverteerd naar PDF.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} {{TOOL_NAME}}-bestand(en) geconverteerd naar PDF.", + "Successfully converted {{name}} to DOCX.": "{{name}} geconverteerd naar DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} geconverteerd naar Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} geconverteerd naar PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} geconverteerd naar {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF geëxtraheerd voor gebruik met AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF('s) geëxtraheerd voor gebruik met AI/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF gerasterd op {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF('s) gerasterd op {{dpi}} DPI.", + "Supported: CBZ, CBR": "Ondersteund: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Ondersteund: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Ondersteund: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Ondersteund: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Ondersteund: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Ondersteund: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Ondersteund: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Ondersteund: XPS, OXPS", + "Switches apps": "Wisselt tussen apps", + "Switches tabs": "Wisselt tussen tabbladen", + "Table of Contents": "Inhoudsopgave", + "Table {{n}} (Page {{page}})": "Tabel {{n}} (pagina {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Doelveld", + "Target Kilobytes": "Doel in kilobytes", + "Target Not Reached": "Doel niet bereikt", + "Target Size": "Doelgrootte", + "Technical Details": "Technische details", + "Temperature": "Temperatuur", + "Template \"{{name}}\" loaded.": "Sjabloon \"{{name}}\" geladen.", + "Template \"{{name}}\" saved.": "Sjabloon \"{{name}}\" opgeslagen.", + "Text": "Tekst", + "Text Color": "Tekstkleur", + "Text Files": "Tekstbestanden", + "Text color changed successfully!": "Tekstkleur gewijzigd!", + "Text converted to PDF successfully!": "Tekst naar PDF geconverteerd!", + "Text extracted successfully!": "Tekst geëxtraheerd!", + "Text to PDF": "Tekst naar PDF", + "That password did not open any of the remaining files.": "Dat wachtwoord opende geen van de resterende bestanden.", + "The PDF file(s) do not contain any attachments to extract.": "De PDF-bestanden bevatten geen bijlagen om te extraheren.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "De PDF heeft {{totalPages}} pagina's, wat niet gelijkmatig deelbaar is door {{nValue}}. De laatste PDF bevat {{remainder}} pagina('s).", + "The PDF might be corrupted or password protected.": "De PDF is mogelijk beschadigd of beveiligd met een wachtwoord.", + "The PDF might be corrupted or password-protected.": "De PDF is mogelijk beschadigd of beveiligd met een wachtwoord.", + "The PDF might be corrupted.": "De PDF is mogelijk beschadigd.", + "The PDF viewer is still initializing.": "De PDF-viewer wordt nog geïnitialiseerd.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "De PDF is gedownload, maar deze stappen konden niet worden voltooid: {{join}}. De inhoud die ze behandelen kan nog in het bestand staan.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "De URL gaf een onverwacht inhoudstype terug: {{contentType}}. Verwacht werd een JavaScript-bestand.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "De bytes die door /ByteRange worden uitgesloten, zijn niet precies een hex-gecodeerde handtekening", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "De bytes die door /ByteRange worden uitgesloten, zijn niet de /Contents van deze handtekening", + "The compression engine returned an unreadable result.": "De compressie-engine gaf een onleesbaar resultaat terug.", + "The compression engine stopped unexpectedly.": "De compressie-engine is onverwacht gestopt.", + "The current password you entered is incorrect. Please try again.": "Het huidige wachtwoord dat je hebt ingevoerd is onjuist. Probeer het opnieuw.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "De volgende veldnamen bestaan al in de geüploade PDF: {{conflictList}}. Geef deze velden een andere naam voordat je downloadt.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "De volgende veldnamen worden meer dan eens gebruikt: {{duplicateList}}. Geef deze velden unieke namen voordat je downloadt.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Het opgegeven aantal pagina's ({{length}}) komt niet overeen met het huidige aantal pagina's in het document ({{currentGridCount}}). Geef een volledige volgorde op voor alle pagina's.", + "The password you entered is incorrect. Please try again.": "Het wachtwoord dat je hebt ingevoerd is onjuist. Probeer het opnieuw.", + "The password you entered is wrong or the file is corrupted.": "Het wachtwoord dat je hebt ingevoerd is onjuist of het bestand is beschadigd.", + "The provided file could not be loaded as an image. It may be corrupted.": "Het opgegeven bestand kon niet als afbeelding worden geladen. Het is mogelijk beschadigd.", + "The requested OCR language is not available: {{unavailableText}}.": "De gevraagde OCR-taal is niet beschikbaar: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "De opgegeven paginavolgorde is onvolledig of bevat ongeldige paginanummers. Geef voor elke oorspronkelijke pagina een nieuwe positie op.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Deze bestanden zijn geen geldige PDF's en zijn daarom niet toegevoegd: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Deze bestanden zijn beveiligd met een wachtwoord: {{names}}. Voer hun wachtwoorden in op de bestandskaarten of verwijder ze, en comprimeer daarna opnieuw.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Deze BentoPDF-build bevat alleen OCR-gegevens voor {{availableText}}.", + "This PDF does not contain any digital signatures.": "Deze PDF bevat geen digitale handtekeningen.", + "This PDF has no layers (OCG).": "Deze PDF heeft geen lagen (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Deze PDF is beveiligd met een wachtwoord. Voer het huidige wachtwoord in om door te gaan.", + "This document contains pages with different dimensions:": "Dit document bevat pagina's met verschillende afmetingen:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dit document bevat 1 redactiemarkering die nog niet is toegepast. Zolang een markering niet is toegepast, staat de inhoud eronder nog in het bestand. Alle markeringen toepassen en downloaden?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dit document bevat {{count}} redactiemarkeringen die nog niet zijn toegepast. Zolang een markering niet is toegepast, staat de inhoud eronder nog in het bestand. Alle markeringen toepassen en downloaden?", + "This feature requires {{name}} to be configured.": "Deze functie vereist dat {{name}} is geconfigureerd.", + "This file is not a valid PDF.": "Dit bestand is geen geldige PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Deze module is gelicentieerd onder AGPL-3.0. Door hem te configureren ga je akkoord met de licentievoorwaarden.", + "This tool has been disabled": "Deze tool is uitgeschakeld", + "This tool is not available in your deployment. Contact your administrator for more information.": "Deze tool is niet beschikbaar in jouw omgeving. Neem contact op met je beheerder voor meer informatie.", + "Threshold": "Drempel", + "Tile": "Tegel", + "Tile Gap X": "Tegelafstand X", + "Tile Gap Y": "Tegelafstand Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Tijdstempel", + "Timestamp Failed": "Tijdstempelen mislukt", + "Tint": "Tint", + "Title": "Titel", + "To actually fill or change the options, use our PDF Form Filler tool.": "Gebruik onze tool PDF-formulier invullen om de opties echt in te vullen of te wijzigen.", + "Toggle": "Schakelaar", + "Toggle style": "Schakelaarstijl", + "Toggle sync scroll": "Gesynchroniseerd scrollen wisselen", + "Tool Unavailable": "Tool niet beschikbaar", + "Tooltip / Help Text": "Knopinfo / Helptekst", + "Top": "Boven", + "Top Center": "Boven midden", + "Top Left": "Linksboven", + "Top Right": "Rechtsboven", + "Top edge in points": "Bovenrand in punten", + "Total Pages": "Totaal aantal pagina's", + "Transparent Background": "Transparante achtergrond", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Probeert JPEG 2000 tegen JPEG voor elke afbeelding en houdt de kleinste.", + "Trim margins from all pages": "Marges van alle pagina's bijsnijden", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Vertrouwensverificatie: {{trustVerified}}/{{length}} handtekeningen geverifieerd met aangepast certificaat", + "Trusted": "Vertrouwd", + "Trusted certificate loaded": "Vertrouwd certificaat geladen", + "Tsa Url": "TSA-URL", + "Turns off quality, resolution and every other lossy image step.": "Schakelt kwaliteit, resolutie en elke andere verliesgevende afbeeldingsstap uit.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "De URL moet beginnen met http:// of https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Kan de PDF niet ontsleutelen met het opgegeven wachtwoord.", + "Unable to repair any of the uploaded PDF files.": "Kan geen van de geüploade PDF-bestanden repareren.", + "Unembed standard fonts": "Standaardlettertypen niet insluiten", + "Unembed standard-font look-alikes": "Lookalikes van standaardlettertypen niet insluiten", + "Unexpected delimiter in content stream": "Onverwacht scheidingsteken in de inhoudsstroom", + "Unexpected reply from the engine.": "Onverwacht antwoord van de engine.", + "Uniform": "Uniform", + "Unique Page Sizes": "Unieke paginaformaten", + "Unknown": "Onbekend", + "Unknown error": "Onbekende fout", + "Unknown error occurred in worker.": "Onbekende fout opgetreden in de worker.", + "Unknown error occurred.": "Onbekende fout opgetreden.", + "Unlock": "Ontgrendelen", + "Unlock All": "Alles ontgrendelen", + "Unlock Remaining ({{remaining}})": "Rest ontgrendelen ({{remaining}})", + "Unlocked": "Ontgrendeld", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} van {{length}} bestanden ontgrendeld.", + "Unlocking...": "Ontgrendelen...", + "Unresolved optional content reference": "Onopgeloste verwijzing naar optionele inhoud", + "Unsupported ECDSA curve in signer certificate": "Niet-ondersteunde ECDSA-curve in het certificaat van de ondertekenaar", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Niet-ondersteunde afbeelding. Gebruik een PNG of JPG voor het watermerk.", + "Unsupported digest OID {{digestOid}}": "Niet-ondersteunde digest-OID {{digestOid}}", + "Unsupported file type: .{{ext}}": "Niet-ondersteund bestandstype: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Niet-ondersteunde handtekeningalgoritme-OID {{oid}}", + "Unterminated array or dictionary in content stream": "Niet afgesloten array of dictionary in de inhoudsstroom", + "Unterminated hex string in content stream": "Niet afgesloten hex-tekenreeks in de inhoudsstroom", + "Unterminated inline image in content stream": "Niet afgesloten inline-afbeelding in de inhoudsstroom", + "Unterminated string in content stream": "Niet afgesloten tekenreeks in de inhoudsstroom", + "Unverified: Unsupported Signature Algorithm": "Niet geverifieerd: niet-ondersteund handtekeningalgoritme", + "Updating metadata...": "Metadata bijwerken...", + "Upload Certificate": "Certificaat uploaden", + "Upload Comics": "Strips uploaden", + "Upload Documents": "Documenten uploaden", + "Upload EPUB Files": "EPUB-bestanden uploaden", + "Upload Email Files": "E-mailbestanden uploaden", + "Upload FB2 Files": "FB2-bestanden uploaden", + "Upload Images": "Afbeeldingen uploaden", + "Upload JSON Files": "JSON-bestanden uploaden", + "Upload MOBI Files": "MOBI-bestanden uploaden", + "Upload Markdown Files": "Markdown-bestanden uploaden", + "Upload ODG Files": "ODG-bestanden uploaden", + "Upload PDFs": "PDF's uploaden", + "Upload PUB Files": "PUB-bestanden uploaden", + "Upload Pages Files": "Pages-bestanden uploaden", + "Upload Presentations": "Presentaties uploaden", + "Upload SVG Files": "SVG-bestanden uploaden", + "Upload Spreadsheets": "Spreadsheets uploaden", + "Upload Text Files": "Tekstbestanden uploaden", + "Upload Visio Files": "Visio-bestanden uploaden", + "Upload WPD Files": "WPD-bestanden uploaden", + "Upload WPS Files": "WPS-bestanden uploaden", + "Upload XML Files": "XML-bestanden uploaden", + "Upload XPS Files": "XPS-bestanden uploaden", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Upload een PDF en klik op \"Voorbeeld genereren\" om de boekjesindeling te zien", + "Upload images and convert to PDF": "Upload afbeeldingen en converteer ze naar PDF", + "Upload one or more PDF files": "Upload een of meer PDF-bestanden", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Hoofdletters A-Z, cijfers 0-9 en - . $ / + % SPATIE", + "Use same password for all files": "Hetzelfde wachtwoord voor alle bestanden gebruiken", + "User Password": "Gebruikerswachtwoord", + "VSD to PDF": "VSD naar PDF", + "Valid From": "Geldig vanaf", + "Valid Signature": "Geldige handtekening", + "Valid Until": "Geldig tot", + "Validating {{n}} of {{length}}: {{name}}": "Valideren {{n}} van {{length}}: {{name}}", + "Validating...": "Valideren...", + "Value": "Waarde", + "Value (e.g., Marketing)": "Waarde (bijvoorbeeld Marketing)", + "Vertical": "Verticaal", + "Viewer not ready": "Viewer niet gereed", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Viewer niet gereed. Upload een PDF en wacht tot het laden is voltooid.", + "Visibility": "Zichtbaarheid", + "Visio Files": "Visio-bestanden", + "WPD to PDF": "WPD naar PDF", + "WPS Files": "WPS-bestanden", + "WPS to PDF": "WPS naar PDF", + "Watermark": "Watermerk", + "Watermark added successfully!": "Watermerk toegevoegd!", + "Web Crypto API not available in this context": "Web Crypto API is niet beschikbaar in deze context", + "Web Crypto import/verify failed: {{error}}": "Web Crypto-import/-verificatie mislukt: {{error}}", + "WebP": "WebP", + "Whitelist": "Toegestane lijst", + "Width ({{unit}})": "Breedte ({{unit}})", + "Word": "Word", + "Word Documents": "Word-documenten", + "Word to PDF": "Word naar PDF", + "WordPerfect Files": "WordPerfect-bestanden", + "Worker crashed": "Worker is gecrasht", + "Worker error occurred. Check console for details.": "Er is een workerfout opgetreden. Bekijk de console voor details.", + "Workflow completed": "Workflow voltooid", + "Wrong password": "Verkeerd wachtwoord", + "Wrong password for: {{join}}": "Verkeerd wachtwoord voor: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Verkeerd wachtwoord of ontsleutelen van \"{{name}}\" mislukt.", + "X Position": "X-positie", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}}", + "XML Files": "XML-bestanden", + "XML to PDF": "XML naar PDF", + "XMP Metadata": "XMP-metadata", + "XPS Files": "XPS-bestanden", + "XPS to PDF": "XPS naar PDF", + "Y Position": "Y-positie", + "Year must be between 1900 and 2100": "Het jaar moet tussen 1900 en 2100 liggen", + "Yellow": "Geel", + "Yellowish": "Geelachtig", + "You cannot delete the last page of the document.": "Je kunt de laatste pagina van het document niet verwijderen.", + "Your PDF has been cropped and the download has started.": "Je PDF is bijgesneden en de download is gestart.", + "Your PDF has been downloaded successfully.": "Je PDF is gedownload.", + "Your PDF has been posterized.": "Je PDF is geposteriseerd.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Je redacties zijn op de pagina's toegepast, maar dit bestand is versleuteld, dus BentoPDF kan niet ook kopieën van de geredigeerde tekst uit de eigenschappen, bladwijzers en bijlagen verwijderen. Redigeer voor een volledige opschoning een onversleutelde kopie en voeg daarna een wachtwoord toe met PDF versleutelen. Toch downloaden?", + "Your workflow needs at least one input node and one output node to run.": "Je workflow heeft minstens één invoerknooppunt en één uitvoerknooppunt nodig om te kunnen draaien.", + "ZIP archive created successfully!": "ZIP-archief gemaakt!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "bijv. dd/mm/jjjj UU:MM:ss", + "form": "formulier", + "https://example.com": "https://example.com", + "signature found": "handtekening gevonden", + "signatures found": "handtekeningen gevonden", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} knooppunt", + "{{count}} nodes": "{{count}} knooppunten", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 pagina", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} pagina's", + "{{length}} Files Need a Password": "{{length}} bestanden hebben een wachtwoord nodig", + "{{length}} PDF file(s) selected": "{{length}} PDF-bestand(en) geselecteerd", + "{{length}} PDF files selected": "{{length}} PDF-bestanden geselecteerd", + "{{length}} attachment(s) extracted successfully!": "{{length}} bijlage(n) geëxtraheerd!", + "{{length}} file • {{totalPages}} total pages": "{{length}} bestand • {{totalPages}} pagina's in totaal", + "{{length}} file(s) attached successfully.": "{{length}} bestand(en) bijgevoegd.", + "{{length}} files • {{totalPages}} total pages": "{{length}} bestanden • {{totalPages}} pagina's in totaal", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Het was beveiligd met een wachtwoord, dus de gecomprimeerde kopie heeft geen wachtwoord. Gebruik PDF versleutelen om er opnieuw een toe te voegen.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} pagina's)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} is digitaal ondertekend en is daarom ongemoeid gelaten. Comprimeren zou de handtekening breken. Wil je toch comprimeren, zet dan Inhoudsbeveiliging negeren aan onder Aangepaste instellingen; de handtekeningen worden dan verwijderd.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} is geen geldige PDF en is daarom niet toegevoegd.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} is beveiligd met een wachtwoord. Voer het wachtwoord in op de bestandskaart en comprimeer daarna opnieuw.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Kon het aantal pagina's niet laden", + "{{size}} • Loading pages...": "{{size}} • Pagina's laden...", + "{{size}} • Loading...": "{{size}} • Laden...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} pagina's", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} pagina's", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} pagina's", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} pagina's", + "{{size}} • {{value}} pages": "{{size}} • {{value}} pagina's", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF('s) ontsleuteld.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF('s) gelineariseerd.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} pagina's → {{numSheets}} uitvoervellen", + "{{validCount}} valid": "{{validCount}} geldig", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 pagina", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} pagina's" +} diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index e200c2f4..811df0a7 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Otwórz menu główne", "language": "Język", "searchLanguage": "Szukaj języka…", - "noLanguagesFound": "Nie znaleziono języków" + "noLanguagesFound": "Nie znaleziono języków", + "breadcrumb": "Ścieżka nawigacji" }, "donation": { "message": "Uwielbiasz BentoPDF? Pomóż nam utrzymać go jako darmowe i otwarte oprogramowanie!", @@ -212,7 +213,7 @@ }, "browserBased": { "question": "W jaki sposób przetwarzanie w oparciu o przeglądarkę zapewnia mi bezpieczeństwo?", - "answer": "Działając całkowicie wewnątrz Twojej przeglądarki, BentoPDF gwarantuje, że Twoje pliki nigdy nie opuszczą Twojego urządzenia. Eliminuje to ryzyko ataków hakerskich na serwery, naruszeń bezpieczeństwa danych czy nieautoryzowanego dostępu. Twoje pliki pozostają Twoje — zawsze." + "answer": "Działając całkowicie wewnątrz Twojej przeglądarki, BentoPDF gwarantuje, że Twoje pliki nigdy nie opuszczą Twojego urządzenia. Eliminuje to ryzyko ataków hakerskich na serwery, naruszeń bezpieczeństwa danych czy nieautoryzowanego dostępu. Twoje pliki pozostają Twoje. Zawsze." }, "analytics": { "question": "Czy używacie plików cookie lub analityki do mojego śledzenia?", @@ -236,10 +237,16 @@ "aboutUs": "O nas", "faqLink": "FAQ", "contactUs": "Kontakt", + "tools": "Narzędzia", + "pdfConverter": "Konwerter PDF", + "pdfSecurity": "Bezpieczeństwo PDF", + "mergeSplit": "Scalanie i dzielenie PDF", "legal": "Kwestie prawne", "termsAndConditions": "Zasady i warunki", "privacyPolicy": "Polityka prywatności", - "followUs": "Śledź nas" + "followUs": "Śledź nas", + "privacyShort": "Prywatność", + "termsShort": "Warunki" }, "merge": { "title": "Połącz pliki PDF", @@ -286,8 +293,9 @@ "noCompromises": "Bez kompromisów." }, "mission": { - "title": "Nasza misja", - "description": "Zapewnienie najbardziej wszechstronnego zestawu narzędzi PDF, który szanuje Twoją prywatność i nigdy nie prosi o płatność. Wierzymy, że podstawowe narzędzia do dokumentów powinny być dostępne dla każdego, wszędzie i bez barier." + "title": "Nasza", + "description": "Zapewnienie najbardziej wszechstronnego zestawu narzędzi PDF, który szanuje Twoją prywatność i nigdy nie prosi o płatność. Wierzymy, że podstawowe narzędzia do dokumentów powinny być dostępne dla każdego, wszędzie i bez barier.", + "titleDim": "misja" }, "philosophy": { "label": "Nasza główna filozofia", diff --git a/public/locales/pl/tools.json b/public/locales/pl/tools.json index d765e941..02cde648 100644 --- a/public/locales/pl/tools.json +++ b/public/locales/pl/tools.json @@ -27,7 +27,22 @@ "name": "Połącz PDF", "subtitle": "Połącz wiele plików PDF w jeden plik. Zachowuje zakładki.", "retainPageLabels": "Zachowaj oryginalne etykiety stron z każdego pliku", - "retainPageLabelsHint": "Wyłączone (domyślnie): połączony PDF używa naturalnej numeracji stron 1–N. Włączone: oryginalne etykiety stron z każdego pliku są zachowane (może to powodować duplikaty etykiet)." + "retainPageLabelsHint": "Wyłączone (domyślnie): połączony PDF używa naturalnej numeracji stron 1–N. Włączone: oryginalne etykiety stron z każdego pliku są zachowane (może to powodować duplikaty etykiet).", + "removeDuplicateFonts": "Usuń zduplikowane czcionki", + "alert": { + "thumbnailError": "Nie udało się wygenerować miniatur stron", + "noSelection": "Nie wybrano plików ani stron do połączenia.", + "mergeSuccess": "Pomyślnie połączono pliki PDF!", + "mergeFailed": "Nie udało się połączyć plików PDF.", + "mergeError": "Nie udało się połączyć plików PDF. Sprawdź, czy wszystkie pliki są prawidłowe i nie są chronione hasłem.", + "workerError": "W procesie łączenia wystąpił nieoczekiwany błąd.", + "loadError": "Nie udało się wczytać co najmniej jednego pliku PDF" + }, + "loader": { + "renderingPreviews": "Generowanie podglądów stron...", + "merging": "Łączenie plików PDF...", + "loadingDocuments": "Wczytywanie dokumentów PDF..." + } }, "splitPdf": { "name": "Podziel PDF", @@ -166,7 +181,7 @@ "applyToAllPages": "Zastosuj do wszystkich stron" }, "headerFooter": { - "name": "Nagłówek i Stopka", + "name": "Nagłówek i stopka", "subtitle": "Dodaj tekst na górze i na dole stron." }, "invertColors": { @@ -385,7 +400,8 @@ "noFile": "Brak pliku", "noFileExplanation": "Proszę najpierw przesłać plik PDF.", "conversionSuccess": "Pomyślnie przekonwertowano PDF na pliki TIFF!", - "conversionError": "Nie udało się przekonwertować PDF na TIFF. Plik może być uszkodzony." + "conversionError": "Nie udało się przekonwertować PDF na TIFF. Plik może być uszkodzony.", + "conversionOutOfMemory": "Przeglądarce zabrakło pamięci podczas konwersji. Spróbuj niższego DPI lub odznacz opcję wielostronicowego TIFF, aby konwertować strony pojedynczo." } }, "pdfToCbz": { @@ -823,7 +839,7 @@ "subtitle": "Wyodrębnij tabele z PDF i skonwertuj je do formatu Excel (XLSX)." }, "pdfToText": { - "name": "PDF na Tekst", + "name": "PDF na tekst", "subtitle": "Wyodrębnij tekst z plików PDF i zapisz jako zwykły tekst (.txt). Obsługuje wiele plików.", "noteLabel": "Uwaga:", "noteText": "To narzędzie działa WYŁĄCZNIE z cyfrowo utworzonymi plikami PDF. W przypadku zeskanowanych dokumentów lub plików PDF opartych na obrazach użyj naszego narzędzia OCR PDF.", @@ -1136,5 +1152,176 @@ "faqSinglePageAnswer": "Tak! Włącz opcję \"Zapętl\", a strony Twojego PDF-a z nakładką będą powtarzane na wszystkich stronach bazowych. Jednostronicowy znak wodny zostanie nałożony na każdą stronę.", "faqPrivacyQuestion": "Czy moje pliki są prywatne i bezpieczne?", "faqPrivacyAnswer": "Zdecydowanie tak! Całe przetwarzanie odbywa się w Twojej przeglądarce. Twoje pliki nigdy nie opuszczają Twojego urządzenia, co zapewnia całkowitą prywatność." + }, + "editPdfText": { + "name": "Edytuj tekst PDF", + "subtitle": "Kliknij dowolny akapit i edytuj go na miejscu z automatycznym przepływem tekstu, czcionkami i formatowaniem.", + "saved": "Pomyślnie zapisano PDF! ({{size}} KB)", + "failedToLoad": "Nie udało się wczytać edytora tekstu PDF.", + "loadingFonts": "Wczytywanie czcionek...", + "fontsUnavailable": "Nie udało się pobrać czcionki potrzebnej dla niektórych znaków. Sprawdź połączenie i spróbuj ponownie, w przeciwnym razie te znaki mogą nie wyświetlać się poprawnie w zapisanym pliku PDF.", + "howToUpload": "Prześlij PDF", + "howToClick": "Kliknij akapit", + "howToRestyle": "Zmień styl czegokolwiek", + "relatedPdfEditor": "Dodawaj adnotacje i oznaczenia w PDF", + "relatedSignPdf": "Narysuj, wpisz lub prześlij podpis", + "relatedWatermark": "Odbij tekst lub obrazy", + "relatedStamps": "Umieść pieczątki na stronach", + "relatedCompress": "Zmniejsz rozmiar pliku", + "relatedOrganizeName": "Organizuj PDF", + "relatedOrganize": "Zmieniaj kolejność stron i zarządzaj nimi", + "open": "Otwórz", + "export": "Eksportuj", + "filterAll": "Wszystko", + "filterText": "Tekst", + "filterImages": "Obrazy", + "filterShapes": "Kształty", + "addText": "Dodaj tekst", + "langAuto": "Auto", + "change": "Zmień", + "ignore": "Ignoruj", + "next": "Dalej", + "replace": "Zamień", + "replaceAll": "Zamień wszystko", + "emptyState": "Otwórz PDF, aby edytować jego tekst, obrazy i kształty.", + "choosePdf": "Wybierz PDF…", + "font": "Czcionka", + "systemFonts": "Czcionki systemowe", + "color": "Kolor", + "alignment": "Wyrównanie", + "style": "Styl", + "lists": "Listy", + "outline": "Obrys", + "spacing": "Odstępy", + "direction": "Kierunek", + "dirAuto": "Auto", + "pathStroke": "Obrys ścieżki", + "tipBackToUpload": "Wróć do przesyłania", + "tipOpenAnotherPdf": "Otwórz inny PDF", + "tipExportS": "Eksportuj (⌘S)", + "tipUndoZ": "Cofnij (⌘Z)", + "tipRedoZ": "Ponów (⇧⌘Z)", + "tipFileDetails": "Szczegóły pliku", + "tipEditExistingContent": "Edytuj istniejącą zawartość", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Czego dotyczy narzędzie edycji. Zawęź zakres na zatłoczonych stronach", + "tipClickThePageToAddATextBox": "Kliknij stronę, aby dodać pole tekstowe", + "tipSpellCheckLanguage": "Język sprawdzania pisowni", + "tipFindAndReplace": "Znajdź i zamień", + "tipAddAnImage": "Dodaj obraz", + "tipCopyThisPageSTextInReadingOrder": "Kopiuj tekst tej strony w kolejności czytania", + "tipCheckTheSpellingOfThisPage": "Sprawdź pisownię na tej stronie", + "tipShowOrHideTheFormatPanel": "Pokaż lub ukryj panel formatowania", + "phReplaceWith": "Zamień na", + "tipAddToYourDictionary": "Dodaj do słownika", + "tipClose": "Zamknij", + "phFind": "Znajdź", + "tipPreviousMatch": "Poprzednie wystąpienie", + "tipNextMatch": "Następne wystąpienie", + "tipRotateLeft90": "Obróć w lewo o 90°", + "tipRotateRight90": "Obróć w prawo o 90°", + "tipFlipHorizontal": "Odbij w poziomie", + "tipFlipVertical": "Odbij w pionie", + "tipReplaceThisImageKeepingItsPlacement": "Zastąp ten obraz, zachowując jego położenie", + "tipAlternateTextForAccessibilityTaggedPdfs": "Tekst alternatywny dla dostępności (otagowane pliki PDF)", + "tipBringToFront": "Przenieś na wierzch", + "tipSendToBack": "Przenieś na spód", + "tipDuplicate": "Duplikuj", + "tipDelete": "Usuń", + "tipAlignLeftEdges": "Wyrównaj do lewych krawędzi", + "tipAlignHorizontalCenters": "Wyrównaj środki w poziomie", + "tipAlignRightEdges": "Wyrównaj do prawych krawędzi", + "tipAlignTops": "Wyrównaj do góry", + "tipAlignVerticalCenters": "Wyrównaj środki w pionie", + "tipAlignBottoms": "Wyrównaj do dołu", + "tipDistributeHorizontally": "Rozłóż w poziomie", + "tipDistributeVertically": "Rozłóż w pionie", + "tipFontSize": "Rozmiar czcionki", + "tipListFontsInstalledOnThisDeviceChromium": "Pokaż czcionki zainstalowane na tym urządzeniu (Chromium)", + "tipCustomTextColor": "Niestandardowy kolor tekstu", + "tipAlignLeft": "Wyrównaj do lewej", + "tipAlignCenter": "Wyśrodkuj", + "tipAlignRight": "Wyrównaj do prawej", + "tipJustify": "Wyjustuj", + "tipBold": "Pogrubienie", + "tipItalic": "Kursywa", + "tipUnderline": "Podkreślenie", + "tipStrikethrough": "Przekreślenie", + "tipSuperscript": "Indeks górny", + "tipSubscript": "Indeks dolny", + "tipToggleBulletedItem": "Przełącz element punktowany", + "tipToggleNumberedItem": "Przełącz element numerowany", + "tipNumberedListMarkerStyle": "Styl numeracji listy", + "tipDecreaseListIndentTab": "Zmniejsz wcięcie listy (⇧Tab)", + "tipIncreaseListIndentTab": "Zwiększ wcięcie listy (Tab)", + "tipTextOutlineColor": "Kolor obrysu tekstu", + "tipOutlineWidth0None": "Grubość obrysu (0 = brak)", + "tipFromContent": "Według zawartości", + "tipLeftToRight": "Od lewej do prawej", + "tipRightToLeft": "Od prawej do lewej", + "tipStrokeColor": "Kolor obrysu", + "tipStrokeWidth": "Grubość obrysu", + "tipZoomPresets": "Ustawienia powiększenia", + "tipZoomOut": "Pomniejsz", + "tipZoomIn": "Powiększ", + "tipFitPage": "Dopasuj stronę", + "tipPreviousPage": "Poprzednia strona", + "tipTypeAPageNumberAndPressEnter": "Wpisz numer strony i naciśnij Enter", + "tipNextPage": "Następna strona", + "tipDocumentProperties": "Właściwości dokumentu", + "tipHideBar": "Ukryj pasek", + "tipShowBar": "Pokaż pasek" + }, + "duplexCollate": { + "name": "Sortowanie skanu dwustronnego", + "subtitle": "Uporządkuj PDF zeskanowany jako dwa bloki (najpierw wszystkie przody, potem wszystkie tyły) we właściwej kolejności przód/tył.", + "totalPagesLabel": "Łączna liczba stron:", + "splitAfterPageLabel": "Podziel po stronie", + "splitAfterPagePlaceholder": "np. 50", + "backBlockOrderLabel": "Kolejność bloku tyłów", + "backBlockReverseOption": "Odwróć blok tyłów (typowe dla odwróconych stosów)", + "backBlockKeepOption": "Zachowaj blok tyłów bez zmian", + "autoSplitButton": "Wykryj podział automatycznie (połowa)", + "exportGroupedLabel": "Eksportuj pliki pogrupowane według długości oryginalnego dokumentu", + "pagesPerDocumentLabel": "Stron na oryginalny dokument", + "groupedHelp": "Po włączeniu wynikiem jest plik ZIP zawierający jeden PDF na każdy pogrupowany dokument.", + "collateButton": "Sortuj PDF", + "invalidFileTitle": "Nieprawidłowy plik", + "invalidFileMessage": "Wybierz plik PDF.", + "loadingPdf": "Wczytywanie pliku PDF...", + "loadErrorMessage": "Nie udało się wczytać pliku PDF.", + "fileMeta": "{{size}} - stron: {{count}}", + "oddPageWarning": "Nieparzysta liczba stron ({{count}}). Skan dwustronny powinien mieć parzystą liczbę stron; może brakować jednej strony lub jedna jest nadmiarowa.", + "previewSummary": "Blok przodów: {{frontCount}} str., blok tyłów: {{backCount}} str. Wynik: {{outputCount}} str. w kolejności przód/tył.", + "previewMismatchWarning": "Długości bloków przodów i tyłów się różnią ({{frontCount}} przodów, {{backCount}} tyłów). Nadmiarowe strony z dłuższego bloku ({{extraCount}}) zostaną dołączone bez pary na końcu.", + "missingFileTitle": "Brak pliku", + "missingFileMessage": "Przed przetwarzaniem prześlij PDF zawierający co najmniej 2 strony.", + "invalidSplitTitle": "Nieprawidłowy punkt podziału", + "invalidSplitMessage": "Punkt podziału musi mieścić się między stroną 1 a stroną {{maxSplit}}.", + "unevenConfirmTitle": "Nierówne bloki", + "unevenConfirmMessage": "Blok przodów ma {{frontCount}} str., a blok tyłów {{backCount}} str.\nZwykle oznacza to, że jakaś strona została zeskanowana dwukrotnie lub jej brakuje.\n\nStrony bez pary ({{extraCount}}) zostaną dołączone na końcu.\n\nKontynuować mimo to?", + "invalidGroupTitle": "Nieprawidłowy rozmiar grupy", + "invalidGroupMessage": "Wprowadź prawidłową liczbę stron na oryginalny dokument.", + "collatingLoader": "Sortowanie skanu dwustronnego...", + "successMessage": "Pomyślnie wygenerowano posortowany PDF.", + "successGroupedMessage": "Sortowanie zakończone. Wygenerowane pogrupowane pliki: {{fileCount}}.", + "processErrorMessage": "Nie udało się posortować PDF.", + "howItWorksStep1Title": "Prześlij skan", + "howItWorksStep1": "Upuść pojedynczy PDF zawierający wszystkie przednie strony, a po nich wszystkie tylne.", + "howItWorksStep2Title": "Ustaw punkt podziału", + "howItWorksStep2": "Zaznacz, gdzie kończy się blok przodów, a następnie wybierz, czy blok tyłów trzeba odwrócić.", + "howItWorksStep3Title": "Sortuj i pobierz", + "howItWorksStep3": "Otrzymaj jeden PDF z przeplecionymi stronami lub plik ZIP z osobnym plikiem dla każdego oryginalnego dokumentu.", + "faqOddPagesQuestion": "Co jeśli mój skan ma nieparzystą liczbę stron?", + "faqOddPagesAnswer": "Skan dwustronny powinien mieć parzystą liczbę stron. Jeśli tak nie jest, prawdopodobnie jakaś strona została zeskanowana dwukrotnie lub pominięta. Narzędzie ostrzega przed przetwarzaniem, a strony bez pary są dołączane na końcu, więc nic nie ginie.", + "faqBackOrderQuestion": "Dlaczego miałbym zachować blok tyłów bez zmian?", + "faqBackOrderAnswer": "Zależy to od tego, jak stos został podany przy drugim przebiegu. Odwrócenie całego stosu daje tylne strony w odwrotnej kolejności, co jest ustawieniem domyślnym. Jeśli skaner zwrócił je w tej samej kolejności co przednie, wybierz zachowanie bloku bez zmian." + }, + "unlockPdf": { + "name": "Odblokuj PDF", + "subtitle": "Usuń hasło z pliku PDF, aby otwierał się bez ograniczeń. Wymaga podania obecnego hasła." + }, + "protectPdf": { + "name": "Zabezpiecz PDF", + "subtitle": "Zabezpiecz PDF hasłem z silnym szyfrowaniem AES." } } diff --git a/public/locales/pl/ui.json b/public/locales/pl/ui.json new file mode 100644 index 00000000..fc945970 --- /dev/null +++ b/public/locales/pl/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(poprawiono)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} więcej...", + "- Error parsing XMP XML. Displaying raw. -": "- Błąd analizy XMP XML. Wyświetlam surowe dane. -", + "- No Info Dictionary data found -": "- Nie znaleziono danych słownika Info -", + "- No XMP metadata found -": "- Nie znaleziono metadanych XMP -", + "- No interactive form fields found -": "- Nie znaleziono interaktywnych pól formularza -", + "- No parseable XMP properties found -": "- Nie znaleziono właściwości XMP możliwych do odczytu -", + "-- Select existing group --": "-- Wybierz istniejącą grupę --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (bardzo czuły)", + "0.5° (Default)": "0,5° (domyślnie)", + "1.0° (Normal)": "1,0° (normalny)", + "100 (Fast)": "100 (szybko)", + "150 (Default)": "150 (domyślnie)", + "1x2 (Booklet)": "1x2 (broszura)", + "2.0° (Less Sensitive)": "2,0° (mniej czuły)", + "200 (Better)": "200 (lepsza)", + "200 (Good)": "200 (dobra)", + "2x2 (4-up)": "2x2 (4 na arkusz)", + "2x4 (8-up)": "2x4 (8 na arkusz)", + "300 (Best Quality)": "300 (najlepsza jakość)", + "300 (Print)": "300 (druk)", + "4x4 (16-up)": "4x4 (16 na arkusz)", + "600 (High Quality)": "600 (wysoka jakość)", + "72 (Screen)": "72 (ekran)", + "90° Clockwise": "90° w prawo", + "90° Counter-clockwise": "90° w lewo", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Pole o nazwie \"{{fieldName}}\" już istnieje. Zmień nazwę tego pola na unikalną przed pobraniem.", + "A new version of BentoPDF is available. Reload to update?": "Dostępna jest nowa wersja BentoPDF. Odświeżyć stronę, aby zaktualizować?", + "A single PDF file": "Pojedynczy plik PDF", + "A template with this name already exists.": "Szablon o tej nazwie już istnieje.", + "ASCII characters (letters, numbers, symbols)": "Znaki ASCII (litery, cyfry, symbole)", + "Action": "Akcja", + "Add Blank Page": "Dodaj pustą stronę", + "Add Bookmark": "Dodaj zakładkę", + "Add Child Bookmark": "Dodaj zakładkę podrzędną", + "Add Child Layer": "Dodaj warstwę podrzędną", + "Add More Comics": "Dodaj więcej komiksów", + "Add More Documents": "Dodaj więcej dokumentów", + "Add More EPUB Files": "Dodaj więcej plików EPUB", + "Add More Email Files": "Dodaj więcej plików wiadomości e-mail", + "Add More FB2 Files": "Dodaj więcej plików FB2", + "Add More Files": "Dodaj więcej plików", + "Add More Images": "Dodaj więcej obrazów", + "Add More JSON Files": "Dodaj więcej plików JSON", + "Add More MOBI Files": "Dodaj więcej plików MOBI", + "Add More Markdown Files": "Dodaj więcej plików Markdown", + "Add More ODG Files": "Dodaj więcej plików ODG", + "Add More PUB Files": "Dodaj więcej plików PUB", + "Add More Pages Files": "Dodaj więcej plików Pages", + "Add More Presentations": "Dodaj więcej prezentacji", + "Add More SVG Files": "Dodaj więcej plików SVG", + "Add More Spreadsheets": "Dodaj więcej arkuszy kalkulacyjnych", + "Add More Text Files": "Dodaj więcej plików tekstowych", + "Add More Visio Files": "Dodaj więcej plików Visio", + "Add More WPD Files": "Dodaj więcej plików WPD", + "Add More WPS Files": "Dodaj więcej plików WPS", + "Add More XML Files": "Dodaj więcej plików XML", + "Add More XPS Files": "Dodaj więcej plików XPS", + "Add a new layer to get started!": "Dodaj nową warstwę, aby zacząć!", + "Add a text box": "Dodaj pole tekstowe", + "Add an RFC 3161 document timestamp": "Dodaj znacznik czasu dokumentu RFC 3161", + "Add an image": "Dodaj obraz", + "Add at least one node to run the workflow.": "Dodaj co najmniej jeden węzeł, aby uruchomić przepływ pracy.", + "Add child": "Dodaj element podrzędny", + "Add child layer": "Dodaj warstwę podrzędną", + "Add header and footer text": "Dodaj tekst nagłówka i stopki", + "Add page numbers": "Dodaj numery stron", + "Add searchable text layer via OCR": "Dodaj przeszukiwalną warstwę tekstu przez OCR", + "Add text watermark": "Dodaj tekstowy znak wodny", + "Add/Edit/Extract Attachments": "Dodaj/edytuj/wyodrębnij załączniki", + "Added": "Dodano", + "Added \"{{afterText}}\"": "Dodano \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Dodano obraz ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "Dodano {{insertCount}} pustą stronę!", + "Added {{insertCount}} blank pages successfully!": "Dodano {{insertCount}} pustych stron!", + "Adding header & footer...": "Dodawanie nagłówka i stopki...", + "Adding page numbers...": "Dodawanie numerów stron...", + "Adding watermark...": "Dodawanie znaku wodnego...", + "Adding {{insertCount}} blank page...": "Dodawanie {{insertCount}} pustej strony...", + "Adding {{insertCount}} blank pages...": "Dodawanie {{insertCount}} pustych stron...", + "Adding {{name}} ({{n}}/{{length}})...": "Dodawanie {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Dostosuj kolory", + "Adjust brightness, contrast, and colors": "Dostosuj jasność, kontrast i kolory", + "Advanced": "Zaawansowane", + "Advanced Feature Required": "Wymagana funkcja zaawansowana", + "Advanced Settings": "Ustawienia zaawansowane", + "After Page": "Po stronie", + "After Page...": "Po stronie...", + "Align Objects": "Wyrównaj obiekty", + "Alignment": "Wyrównanie", + "All": "Wszystko", + "All files repaired successfully!": "Wszystkie pliki zostały naprawione!", + "Alternate Merge": "Scalanie naprzemienne", + "Alternating and mixing pages...": "Naprzemienne mieszanie stron...", + "Always resample to that resolution": "Zawsze próbkuj ponownie do tej rozdzielczości", + "An error occurred during compression. Error: {{error}}": "Wystąpił błąd podczas kompresji. Błąd: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Wystąpił błąd podczas konwersji. Błąd: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Wystąpił błąd podczas konwersji. Błąd: {{message}}", + "An error occurred during cropping.": "Wystąpił błąd podczas przycinania.", + "An error occurred during extraction. Error: {{error}}": "Wystąpił błąd podczas wyodrębniania. Błąd: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Wystąpił błąd podczas rasteryzacji. Błąd: {{error}}", + "An error occurred during sanitization: {{msg}}": "Wystąpił błąd podczas sanityzacji: {{msg}}", + "An error occurred while combining pages.": "Wystąpił błąd podczas łączenia stron.", + "An error occurred while creating the N-Up PDF.": "Wystąpił błąd podczas tworzenia pliku PDF N-Up.", + "An error occurred while creating the booklet.": "Wystąpił błąd podczas tworzenia broszury.", + "An error occurred while dividing the PDF.": "Wystąpił błąd podczas dzielenia pliku PDF.", + "An error occurred while mixing the PDFs.": "Wystąpił błąd podczas mieszania plików PDF.", + "An error occurred while standardizing pages.": "Wystąpił błąd podczas ujednolicania stron.", + "An error occurred while trying to remove metadata.": "Wystąpił błąd podczas usuwania metadanych.", + "An error occurred: {{error}}": "Wystąpił błąd: {{error}}", + "An error occurred: {{error}}.": "Wystąpił błąd: {{error}}.", + "An owner password is required when setting permissions": "Ustawienie uprawnień wymaga hasła właściciela", + "An unexpected error occurred during the repair process.": "Podczas naprawy wystąpił nieoczekiwany błąd.", + "An unexpected error occurred.": "Wystąpił nieoczekiwany błąd.", + "Analyzing data structure...": "Analizowanie struktury danych...", + "Analyzing full PDF metadata...": "Analizowanie pełnych metadanych PDF...", + "Analyzing signatures...": "Analizowanie podpisów...", + "Angle": "Kąt", + "Annotations removed successfully!": "Adnotacje zostały usunięte!", + "Any text, URL, or data": "Dowolny tekst, adres URL lub dane", + "Application": "Aplikacja", + "Apply a digital signature to PDF": "Zastosuj podpis cyfrowy w pliku PDF", + "Apply and download": "Zastosuj i pobierz", + "Apply redactions?": "Zastosować redakcje?", + "Apply scanner simulation effect": "Zastosuj efekt symulacji skanera", + "Applying Bates numbers...": "Stosowanie numeracji Batesa...", + "Applying color adjustments...": "Stosowanie korekty kolorów...", + "Applying crop...": "Stosowanie przycięcia...", + "Applying redactions...": "Stosowanie redakcji...", + "Applying rotations...": "Stosowanie obrotów...", + "Applying scanner effect...": "Stosowanie efektu skanera...", + "Applying timestamp...": "Stosowanie znacznika czasu...", + "Applying {{replace}}...": "Stosowanie: {{replace}}...", + "Archive contains an oversized image entry.": "Archiwum zawiera zbyt duży obraz.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Archiwum zawiera zbyt wiele obrazów (maks. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Archiwum jest zbyt duże po rozpakowaniu.", + "Are you sure you want to reset? All your work will be lost.": "Na pewno chcesz zresetować? Cała Twoja praca zostanie utracona.", + "Area (Coordinates)": "Obszar (współrzędne)", + "Area ({{unit}}²)": "Powierzchnia ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman i Courier New są zastępowane wbudowanymi odpowiednikami. Stosowane tylko wtedy, gdy jest to bezpieczne.", + "Arrange multiple pages per sheet": "Ułóż wiele stron na jednym arkuszu", + "Arrange pages for booklet printing": "Ułóż strony do druku broszury", + "Aspect Ratio": "Proporcje", + "At least one PDF document is required for export.": "Do eksportu wymagany jest co najmniej jeden dokument PDF.", + "At least two valid PDFs are required.": "Wymagane są co najmniej dwa prawidłowe pliki PDF.", + "Attaching files to PDF...": "Dołączanie plików do PDF...", + "Attachments updated successfully!": "Załączniki zostały zaktualizowane!", + "Author": "Autor", + "Auto (Keep Original)": "Auto (zachowaj oryginał)", + "Back": "Tył", + "Back to Home": "Wróć na stronę główną", + "Background Color": "Kolor tła", + "Background color changed successfully!": "Kolor tła został zmieniony!", + "Barcode": "Kod kreskowy", + "Barcode Format": "Format kodu kreskowego", + "Barcode Value": "Wartość kodu kreskowego", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Numeracja Batesa została zastosowana! ({{batesStart}} do {{n}})", + "Beginning": "Początek", + "Binarize": "Binaryzuj", + "Blank Position": "Pozycja pustej strony", + "Blue": "Niebieski", + "Blur": "Rozmycie", + "Bold": "Pogrubienie", + "Bold & Italic": "Pogrubienie i kursywa", + "Booklet": "Broszura", + "Booklet created with {{numSheets}} sheets!": "Utworzono broszurę z {{numSheets}} arkuszy!", + "Bookmarks imported from JSON!": "Zakładki zostały zaimportowane z JSON!", + "Bookmarks page": "Strona zakładek", + "Border": "Obramowanie", + "Border Color": "Kolor obramowania", + "Bottom": "Dół", + "Bottom Center": "Dół, środek", + "Bottom Left": "Dół, lewo", + "Bottom Right": "Dół, prawo", + "Bottom edge in points": "Dolna krawędź w punktach", + "Brightness": "Jasność", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Pominięto Brotli i rasteryzację, aby zachować zgodność z PDF/A.", + "Brotli compression (PDF 2.0)": "Kompresja Brotli (PDF 2.0)", + "Browser Note:": "Uwaga dotycząca przeglądarki:", + "Building new PDF...": "Tworzenie nowego pliku PDF...", + "Building page pairing model...": "Budowanie modelu parowania stron...", + "Button": "Przycisk", + "ByteRange does not start at the beginning of the file": "ByteRange nie zaczyna się na początku pliku", + "ByteRange out of bounds": "ByteRange wykracza poza zakres", + "CBZ to PDF": "CBZ na PDF", + "CSV Loaded": "Wczytano CSV", + "CSV file is empty": "Plik CSV jest pusty", + "Cancel": "Anuluj", + "Cannot Delete": "Nie można usunąć", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Brak dostępu do elementów sterujących przeglądarki. Użyj przycisku Pobierz na pasku narzędzi przeglądarki PDF powyżej.", + "Cannot delete all pages": "Nie można usunąć wszystkich stron", + "Cannot delete all pages.": "Nie można usunąć wszystkich stron.", + "Canvas context failed": "Nie udało się utworzyć kontekstu canvas", + "Canvas context unavailable": "Kontekst canvas jest niedostępny", + "Canvas toBlob conversion failed.": "Konwersja canvas toBlob nie powiodła się.", + "Canvas toBlob failed": "Operacja canvas toBlob nie powiodła się", + "Center": "Środek", + "Certificate (.pfx, .p12, .pem)": "Certyfikat (.pfx, .p12, .pem)", + "Certificate Expired": "Certyfikat wygasł", + "Certificate Password": "Hasło certyfikatu", + "Certificate unlocked": "Certyfikat odblokowany", + "Change Certificate": "Zmień certyfikat", + "Change background color": "Zmień kolor tła", + "Changing background color...": "Zmienianie koloru tła...", + "Changing text color...": "Zmienianie koloru tekstu...", + "Character": "Znak", + "Checked State": "Stan zaznaczenia", + "Choose a valid page range.": "Wybierz prawidłowy zakres stron.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Wybierz jeden z dołączonych języków lub przebuduj pakiet offline, dodając brakujący język do --ocr-languages.", + "Cleanup": "Czyszczenie", + "Click on PDF to Pick Location": "Kliknij w PDF, aby wybrać miejsce", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Kliknij przycisk powyżej, a następnie kliknij w PDF miejsce, do którego ma prowadzić zakładka", + "Click to Upload Image": "Kliknij, aby wgrać obraz", + "Clicking this field in the PDF will open a file picker to upload an image.": "Kliknięcie tego pola w pliku PDF otworzy okno wyboru pliku, aby wgrać obraz.", + "Clip invisible parts of images": "Przytnij niewidoczne części obrazów", + "Close": "Zamknij", + "Close (Esc)": "Zamknij (Esc)", + "Close panel": "Zamknij panel", + "Closes tab": "Zamyka kartę", + "Closes window": "Zamyka okno", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (zakładki i metadane)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF nie jest skonfigurowany. Skonfiguruj go w ustawieniach WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF zwrócił pusty odszyfrowany plik.", + "CoherentPDF: not configured.": "CoherentPDF: nie skonfigurowano.", + "Color": "Kolor", + "Color adjustments applied successfully!": "Korekta kolorów została zastosowana!", + "Colors inverted successfully!": "Kolory zostały odwrócone!", + "Cols": "Kolumny", + "Combine multiple PDFs into one": "Połącz wiele plików PDF w jeden", + "Combine to Single Page": "Połącz w jedną stronę", + "Combining pages...": "Łączenie stron...", + "Comic Archives": "Archiwa komiksów", + "Comments and markup become part of the page. Form fields and links keep working.": "Komentarze i oznaczenia stają się częścią strony. Pola formularzy i linki nadal działają.", + "Complete": "Zakończono", + "Complete!": "Gotowe!", + "Compress": "Kompresuj", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Skompresowano plików PDF: {{compressedCount}}. Łączny rozmiar zmniejszono z {{totalOriginalSize}} do {{totalCompressedSize}} (oszczędność {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Skompresowano plików PDF: {{compressedCount}}. Łączny rozmiar: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Kompresowanie wielu plików PDF...", + "Compressing to {{size}}...": "Kompresowanie do {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Kompresowanie {{n}}/{{length}}: {{name}}...", + "Compressing...": "Kompresowanie...", + "Compression Complete": "Kompresja zakończona", + "Compression Finished": "Kompresja zakończona", + "Compression Level": "Poziom kompresji", + "Configure": "Konfiguruj", + "Confirm": "Potwierdź", + "Confirm Action": "Potwierdź akcję", + "Conformance": "Zgodność", + "Connected": "Połączono", + "Contact Info": "Dane kontaktowe", + "Content": "Treść", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Skrót treści nie zgadza się z atrybutem messageDigest: plik PDF został zmodyfikowany po podpisaniu", + "Contrast": "Kontrast", + "Conversion Complete": "Konwersja zakończona", + "Conversion Error": "Błąd konwersji", + "Conversion engine ready!": "Silnik konwersji jest gotowy!", + "Conversion failed: could not create PDF/A definition": "Konwersja nie powiodła się: nie udało się utworzyć definicji PDF/A", + "Convert Apple Pages documents to PDF": "Konwertuj dokumenty Apple Pages na PDF", + "Convert EPUB ebooks to PDF": "Konwertuj e-booki EPUB na PDF", + "Convert Excel spreadsheets to PDF": "Konwertuj arkusze kalkulacyjne Excel na PDF", + "Convert FB2 e-books to PDF": "Konwertuj e-booki FB2 na PDF", + "Convert JSON files to PDF": "Konwertuj pliki JSON na PDF", + "Convert MOBI e-books to PDF": "Konwertuj e-booki MOBI na PDF", + "Convert Markdown files to PDF": "Konwertuj pliki Markdown na PDF", + "Convert Microsoft Publisher to PDF": "Konwertuj pliki Microsoft Publisher na PDF", + "Convert OpenDocument Graphics to PDF": "Konwertuj grafiki OpenDocument na PDF", + "Convert PDF pages to SVG": "Konwertuj strony PDF na SVG", + "Convert PDF pages to images (ZIP)": "Konwertuj strony PDF na obrazy (ZIP)", + "Convert PDF tables to CSV": "Konwertuj tabele z PDF na CSV", + "Convert PDF tables to Excel": "Konwertuj tabele z PDF na Excel", + "Convert PDF to Markdown text": "Konwertuj PDF na tekst Markdown", + "Convert PDF to PDF/A for archiving": "Konwertuj PDF na PDF/A do archiwizacji", + "Convert PDF to Word document": "Konwertuj PDF na dokument Word", + "Convert PowerPoint presentations to PDF": "Konwertuj prezentacje PowerPoint na PDF", + "Convert SVG files to PDF": "Konwertuj pliki SVG na PDF", + "Convert To Grayscale": "Konwertuj na skalę szarości", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Konwertuj diagramy Visio (VSD/VSDX) na PDF", + "Convert WPS Office documents to PDF": "Konwertuj dokumenty WPS Office na PDF", + "Convert Word documents to PDF": "Konwertuj dokumenty Word na PDF", + "Convert WordPerfect documents to PDF": "Konwertuj dokumenty WordPerfect na PDF", + "Convert XML documents to PDF": "Konwertuj dokumenty XML na PDF", + "Convert XPS/OXPS documents to PDF": "Konwertuj dokumenty XPS/OXPS na PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Konwertuj archiwa komiksów (CBZ/CBR) na PDF", + "Convert email files (.eml, .msg) to PDF": "Konwertuj pliki e-mail (.eml, .msg) na PDF", + "Convert fonts to vector outlines": "Konwertuj czcionki na krzywe wektorowe", + "Convert plain text to PDF": "Konwertuj zwykły tekst na PDF", + "Convert to grayscale": "Konwertuj na skalę szarości", + "Convert to greyscale": "Konwertuj na odcienie szarości", + "Convert to image-based PDF": "Konwertuj na PDF oparty na obrazach", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "Skonwertowano pliki ({{length}}, łącznie stron: {{totalPages}}) na SVG!", + "Converted {{pageCount}} pages to SVG!": "Skonwertowano strony ({{pageCount}}) na SVG!", + "Converter not initialized": "Konwerter nie został zainicjowany", + "Converting BMP to PDF...": "Konwertowanie BMP na PDF...", + "Converting HEIC to PDF...": "Konwertowanie HEIC na PDF...", + "Converting TIFF to PDF...": "Konwertowanie TIFF na PDF...", + "Converting emails...": "Konwertowanie wiadomości e-mail...", + "Converting files...": "Konwertowanie plików...", + "Converting fonts to outlines...": "Konwertowanie czcionek na krzywe...", + "Converting images to PDF...": "Konwertowanie obrazów na PDF...", + "Converting multiple PDFs to PDF/A...": "Konwertowanie wielu plików PDF na PDF/A...", + "Converting multiple RTF files to PDF...": "Konwertowanie wielu plików RTF na PDF...", + "Converting multiple files...": "Konwertowanie wielu plików...", + "Converting page {{n}} of {{pageCount}}...": "Konwertowanie strony {{n}} z {{pageCount}}...", + "Converting to Markdown...": "Konwertowanie na Markdown...", + "Converting to SVG...": "Konwertowanie na SVG...", + "Converting to greyscale...": "Konwertowanie na odcienie szarości...", + "Converting to {{level}}...": "Konwertowanie na {{level}}...", + "Converting {{name}}...": "Konwertowanie: {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Konwertowanie {{n}}/{{length}}: {{name}}...", + "Converting...": "Konwertowanie...", + "Copied": "Skopiowano", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Brak dostępu do eksportera PDF ze stemplami. Użyj w zamian przycisku Eksport → PDF na pasku narzędzi przeglądarki.", + "Could not add blank page.": "Nie udało się dodać pustej strony.", + "Could not add blank pages.": "Nie udało się dodać pustych stron.", + "Could not add header or footer.": "Nie udało się dodać nagłówka ani stopki.", + "Could not add page numbers.": "Nie udało się dodać numerów stron.", + "Could not add the watermark.": "Nie udało się dodać znaku wodnego.", + "Could not apply rotations.": "Nie udało się zastosować obrotów.", + "Could not change text color.": "Nie udało się zmienić koloru tekstu.", + "Could not change the background color.": "Nie udało się zmienić koloru tła.", + "Could not create ZIP archive.": "Nie udało się utworzyć archiwum ZIP.", + "Could not create canvas context.": "Nie udało się utworzyć kontekstu canvas.", + "Could not create comparison canvas context.": "Nie udało się utworzyć kontekstu canvas porównania.", + "Could not create offscreen comparison canvas.": "Nie udało się utworzyć canvas porównania poza ekranem.", + "Could not create visual diff context.": "Nie udało się utworzyć kontekstu różnic wizualnych.", + "Could not create visual diff overlay context.": "Nie udało się utworzyć kontekstu nakładki różnic wizualnych.", + "Could not detect blank pages.": "Nie udało się wykryć pustych stron.", + "Could not display the page.": "Nie udało się wyświetlić strony.", + "Could not export comparison PDF.": "Nie udało się wyeksportować porównania PDF.", + "Could not export the signed PDF. Please try again.": "Nie udało się wyeksportować podpisanego pliku PDF. Spróbuj ponownie.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Nie udało się wyeksportować pliku PDF ze stemplami. Użyj w zamian przycisku Eksport → PDF na pasku narzędzi przeglądarki.", + "Could not extract signer public key": "Nie udało się wyodrębnić klucza publicznego podpisującego", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Nie znaleziono pliku {{testFile}} pod podanym adresem URL (HTTP {{status}}). Upewnij się, że plik istnieje.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Nie udało się w pełni przeanalizować pliku PDF. Może być uszkodzony lub mieć nietypową strukturę.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Nie udało się wygenerować podglądu. Plik może być uszkodzony lub zawierać nieobsługiwane funkcje. Błąd: {{message}}", + "Could not get canvas context": "Nie udało się uzyskać kontekstu canvas", + "Could not invert PDF colors.": "Nie udało się odwrócić kolorów PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Nie udało się wczytać pliku PDF. Może być uszkodzony lub chroniony hasłem.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Nie udało się wczytać pliku PDF. Plik może być nieprawidłowy, uszkodzony lub chroniony hasłem.", + "Could not load the PDF engine. Please refresh the page and try again.": "Nie udało się wczytać silnika PDF. Odśwież stronę i spróbuj ponownie.", + "Could not parse signer info": "Nie udało się przeanalizować danych podpisującego", + "Could not posterize the PDF.": "Nie udało się wykonać plakatowania PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Nie udało się przetworzyć pliku \"{{name}}\". Plik może być uszkodzony.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Nie udało się dalej zmniejszyć rozmiaru pliku. Oryginał: {{originalSize}}, nowy: {{compressedSize}}.", + "Could not remove annotations.": "Nie udało się usunąć adnotacji.", + "Could not remove blank pages.": "Nie udało się usunąć pustych stron.", + "Could not remove leftover data from the PDF.": "Nie udało się usunąć pozostałych danych z pliku PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Nie udało się usunąć zredagowanego tekstu z danych dokumentu, więc plik nie został pobrany.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Nie udało się odwrócić stron PDF. Sprawdź, czy pliki są prawidłowymi plikami PDF.", + "Could not update metadata. Please check that date formats are correct.": "Nie udało się zaktualizować metadanych. Sprawdź, czy formaty dat są poprawne.", + "Count": "Liczba", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Utworzono", + "Creating Booklet...": "Tworzenie broszury...", + "Creating Excel file...": "Tworzenie pliku Excel...", + "Creating N-Up PDF...": "Tworzenie pliku PDF N-Up...", + "Creating PDF from JPGs...": "Tworzenie PDF z plików JPG...", + "Creating PDF from SVG files...": "Tworzenie PDF z plików SVG...", + "Creating PDF...": "Tworzenie PDF...", + "Creating ZIP archive...": "Tworzenie archiwum ZIP...", + "Creating ZIP file...": "Tworzenie pliku ZIP...", + "Creating ZIP...": "Tworzenie ZIP...", + "Creating table...": "Tworzenie tabeli...", + "Creator": "Twórca", + "Crop": "Przytnij", + "Crop complete! Your download has started.": "Przycinanie zakończone! Pobieranie się rozpoczęło.", + "Cryptographic verification failed": "Weryfikacja kryptograficzna nie powiodła się", + "Custom": "Niestandardowy", + "Custom Format": "Format niestandardowy", + "Custom Height": "Wysokość niestandardowa", + "Custom Units": "Jednostki niestandardowe", + "Custom Width": "Szerokość niestandardowa", + "Custom Zoom": "Powiększenie niestandardowe", + "Custom...": "Niestandardowy...", + "DataMatrix": "DataMatrix", + "Date Format": "Format daty", + "Decrease size": "Zmniejsz rozmiar", + "Decrypt": "Odszyfruj", + "Decrypting PDF...": "Odszyfrowywanie PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Odszyfrowywanie {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Odszyfrowywanie {{n}} z {{length}}: {{name}}", + "Decrypting...": "Odszyfrowywanie...", + "Decryption Failed": "Odszyfrowanie nie powiodło się", + "Delete": "Usuń", + "Delete \"{{title}}\"?": "Usunąć \"{{title}}\"?", + "Delete Field": "Usuń pole", + "Delete Page": "Usuń stronę", + "Delete Pages": "Usuń strony", + "Delete all {{length}} bookmark(s) ? ": "Usunąć wszystkie zakładki ({{length}})? ", + "Delete layer": "Usuń warstwę", + "Delete {{size}} bookmark(s) ? ": "Usunąć zakładki ({{size}})? ", + "Deleted": "Usunięto", + "Deleted {{size}} page(s) successfully!": "Usunięto stron: {{size}}!", + "Deleting pages...": "Usuwanie stron...", + "Description": "Opis", + "Description for screen readers": "Opis dla czytników ekranu", + "Deselect All": "Odznacz wszystko", + "Deskew": "Prostowanie", + "Deskew PDF": "Wyprostuj PDF", + "Deskewed {{length}} file(s). {{value}}": "Wyprostowano plików: {{length}}. {{value}}", + "Deskewing {{name}}...": "Prostowanie: {{name}}...", + "Destination": "Cel", + "Detecting blank pages...": "Wykrywanie pustych stron...", + "Digest Algorithm:": "Algorytm skrótu:", + "Digital Sign": "Podpis cyfrowy", + "Direction": "Kierunek", + "Divide Pages": "Podziel strony", + "Divide into boxes (0 to disable)": "Podziel na pola (0 wyłącza)", + "Document Properties": "Właściwości dokumentu", + "Document Type": "Typ dokumentu", + "Document properties": "Właściwości dokumentu", + "Document-level attachment": "Załącznik na poziomie dokumentu", + "Done: back to tools": "Gotowe, wróć do narzędzi", + "Download": "Pobierz", + "Download Edited PDF": "Pobierz edytowany PDF", + "Download anyway": "Pobierz mimo to", + "Download as PDF or ZIP automatically": "Pobierz automatycznie jako PDF lub ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Pobrano pliki PDF ({{length}}) w archiwum ZIP.", + "Downloads started for all files.": "Rozpoczęto pobieranie wszystkich plików.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Usuwa tagowanie, na którym polegają czytniki ekranu.", + "Duplicate Field Name": "Zduplikowana nazwa pola", + "Duplicate Field Names": "Zduplikowane nazwy pól", + "Duplicate Page": "Duplikuj stronę", + "Duplicate Page Numbers": "Zduplikowane numery stron", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Podpis ECDSA nie przechodzi weryfikacji względem klucza publicznego podpisującego", + "EPUB Files": "Pliki EPUB", + "EPUB to PDF": "EPUB na PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ na PDF", + "Edit": "Edytuj", + "Edit All": "Edytuj wszystko", + "Edit Bookmark": "Edytuj zakładkę", + "Edit Bookmarks": "Edytuj zakładki", + "Edit Images": "Edytuj obrazy", + "Edit Metadata": "Edytuj metadane", + "Edit PDF metadata": "Edytuj metadane PDF", + "Edit Scope": "Zakres edycji", + "Edit Shapes": "Edytuj kształty", + "Edit Text": "Edytuj tekst", + "Edit tool": "Narzędzie edycji", + "Edit {{scopes}}": "Edytuj: {{scopes}}", + "Email Files": "Pliki e-mail", + "Email to PDF": "E-mail na PDF", + "Embedding files into PDF...": "Osadzanie plików w PDF...", + "Empty signature bytes": "Puste bajty podpisu", + "Encrypt": "Szyfruj", + "Encrypt PDF with password": "Zaszyfruj PDF hasłem", + "Encrypted file": "Zaszyfrowany plik", + "Encrypting PDF with 256-bit AES...": "Szyfrowanie PDF 256-bitowym AES...", + "Encryption Failed": "Szyfrowanie nie powiodło się", + "Encryption resulted in an empty file.": "Szyfrowanie zwróciło pusty plik.", + "End": "Koniec", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Wpisz 0, aby wstawić na początku, lub {{pageCount}}, aby wstawić na końcu.", + "Enter bookmark title": "Wpisz tytuł zakładki", + "Enter name for child layer under \"{{Layer}}\":": "Wpisz nazwę warstwy podrzędnej w \"{{Layer}}\":", + "Enter password": "Wpisz hasło", + "Enter password...": "Wpisz hasło...", + "Enter passwords for each encrypted file": "Wpisz hasła dla każdego zaszyfrowanego pliku", + "Error": "Błąd", + "Error during execution": "Błąd podczas wykonywania", + "Error generating PDF: {{error}}": "Błąd generowania PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Błąd wczytywania pliku PDF. Spróbuj ponownie z prawidłowym plikiem PDF.", + "Error reading files: {{error}}": "Błąd odczytu plików: {{error}}", + "Error saving PDF. Check console for details.": "Błąd zapisu PDF. Szczegóły znajdziesz w konsoli.", + "Error: {{error}}": "Błąd: {{error}}", + "Exactly 11 or 12 digits": "Dokładnie 11 lub 12 cyfr", + "Exactly 12 or 13 digits": "Dokładnie 12 lub 13 cyfr", + "Example of current format:": "Przykład bieżącego formatu:", + "Excel to PDF": "Excel na PDF", + "Existing Radio Groups": "Istniejące grupy przycisków opcji", + "Export Error": "Błąd eksportu", + "Export Value": "Wartość eksportu", + "Export failed": "Eksport nie powiódł się", + "External processing module needed": "Wymagany zewnętrzny moduł przetwarzania", + "Extract Images": "Wyodrębnij obrazy", + "Extract Pages": "Wyodrębnij strony", + "Extract Tables": "Wyodrębnij tabele", + "Extract a range of pages": "Wyodrębnij zakres stron", + "Extract all images from PDF": "Wyodrębnij wszystkie obrazy z PDF", + "Extract pages as separate PDFs": "Wyodrębnij strony jako osobne pliki PDF", + "Extract text from PDF": "Wyodrębnij tekst z PDF", + "Extracted 1 table successfully!": "Wyodrębniono 1 tabelę!", + "Extracted text from {{length}} PDF files!": "Wyodrębniono tekst z plików PDF ({{length}})!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Wyodrębniono plików PDF: {{completed}}, niepowodzeń: {{failed}}.", + "Extracted {{length}} page(s) successfully!": "Wyodrębniono stron: {{length}}!", + "Extracted {{length}} table(s) to Excel!": "Wyodrębniono tabel do Excela: {{length}}!", + "Extracted {{length}} tables successfully!": "Wyodrębniono tabel: {{length}}!", + "Extracting attachments from {{length}} file(s)...": "Wyodrębnianie załączników z plików ({{length}})...", + "Extracting images from {{name}}...": "Wyodrębnianie obrazów z {{name}}...", + "Extracting pages...": "Wyodrębnianie stron...", + "Extracting tables...": "Wyodrębnianie tabel...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Wyodrębnianie tekstu z pliku {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Wyodrębnianie tekstu z wielu plików...", + "Extracting text from {{name}}...": "Wyodrębnianie tekstu z {{name}}...", + "Extracting text...": "Wyodrębnianie tekstu...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Wyodrębnianie {{name}} dla AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Wyodrębnianie {{name}} dla AI...", + "Extracting...": "Wyodrębnianie...", + "Extraction Complete": "Wyodrębnianie zakończone", + "Extraction Error": "Błąd wyodrębniania", + "Extraction Partial": "Wyodrębnianie częściowe", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Wyodrębnianie zakończone! Załączników w pliku ZIP: {{length}} ({{totalSize}}). Pobieranie się rozpoczęło.", + "FB2 Files": "Pliki FB2", + "FB2 to PDF": "FB2 na PDF", + "Failed": "Niepowodzenie", + "Failed to acquire 2D canvas context": "Nie udało się uzyskać kontekstu canvas 2D", + "Failed to add child layer": "Nie udało się dodać warstwy podrzędnej", + "Failed to apply Bates numbers.": "Nie udało się zastosować numeracji Batesa.", + "Failed to apply color adjustments. The file might be corrupted.": "Nie udało się zastosować korekty kolorów. Plik może być uszkodzony.", + "Failed to apply redactions.": "Nie udało się zastosować redakcji.", + "Failed to apply scanner effect. The file might be corrupted.": "Nie udało się zastosować efektu skanera. Plik może być uszkodzony.", + "Failed to attach files: {{error}}": "Nie udało się dołączyć plików: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Nie udało się skonwertować BMP na PDF. Jeden z plików może być nieprawidłowy.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Nie udało się skonwertować HEIC na PDF. Jeden z plików może być nieprawidłowy.", + "Failed to convert PDF to CSV. {{message}}": "Nie udało się skonwertować PDF na CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Nie udało się skonwertować PDF na Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Nie udało się skonwertować PDF na SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Nie udało się skonwertować PDF na odcienie szarości. Plik może być uszkodzony.", + "Failed to convert PDF. It may be image-based or corrupted.": "Nie udało się skonwertować PDF. Może być oparty na obrazach lub uszkodzony.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Nie udało się skonwertować TIFF na PDF. Jeden z plików może być nieprawidłowy.", + "Failed to convert images to PDF.": "Nie udało się skonwertować obrazów na PDF.", + "Failed to convert text to PDF. {{error}}": "Nie udało się skonwertować tekstu na PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Nie udało się skonwertować {{filename}} na PNG", + "Failed to copy metadata to clipboard.": "Nie udało się skopiować metadanych do schowka.", + "Failed to create PDF.": "Nie udało się utworzyć PDF.", + "Failed to create PNG blob": "Nie udało się utworzyć blob PNG", + "Failed to create canvas context": "Nie udało się utworzyć kontekstu canvas", + "Failed to create split PDFs.": "Nie udało się utworzyć podzielonych plików PDF.", + "Failed to decode image: {{name}}": "Nie udało się zdekodować obrazu: {{name}}", + "Failed to decrypt private key": "Nie udało się odszyfrować klucza prywatnego", + "Failed to decrypt. Try the Decrypt tool instead.": "Nie udało się odszyfrować. Spróbuj użyć narzędzia Odszyfruj.", + "Failed to delete layer": "Nie udało się usunąć warstwy", + "Failed to delete pages.": "Nie udało się usunąć stron.", + "Failed to deskew PDF: {{error}}": "Nie udało się wyprostować PDF: {{error}}", + "Failed to download the edited PDF.": "Nie udało się pobrać edytowanego PDF.", + "Failed to edit attachments.": "Nie udało się edytować załączników.", + "Failed to extract certificate from PFX file": "Nie udało się wyodrębnić certyfikatu z pliku PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Nie udało się wyodrębnić stron (kod wyjścia qpdf: {{exitCode}}).", + "Failed to extract pages.": "Nie udało się wyodrębnić stron.", + "Failed to extract tables. {{message}}": "Nie udało się wyodrębnić tabel. {{message}}", + "Failed to extract text from PDF.": "Nie udało się wyodrębnić tekstu z PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Nie udało się pobrać profilu ICC z {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Nie udało się pobrać pliku czcionki: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Nie udało się pobrać gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Nie udało się pobrać {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Nie udało się uzyskać kontekstu 2D dla strony {{pageNumber}}", + "Failed to get canvas context": "Nie udało się uzyskać kontekstu canvas", + "Failed to insert PDF. The file may be corrupted.": "Nie udało się wstawić PDF. Plik może być uszkodzony.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Nie udało się wczytać Ghostscript z {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Nie udało się wczytać pliku PDF.", + "Failed to load PDF for cropping.": "Nie udało się wczytać PDF do przycięcia.", + "Failed to load PDF for preview.": "Nie udało się wczytać PDF do podglądu.", + "Failed to load PDF form viewer.": "Nie udało się wczytać przeglądarki formularzy PDF.", + "Failed to load PDF layers": "Nie udało się wczytać warstw PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Nie udało się wczytać PyMuPDF z CDN: {{msg}}", + "Failed to load SVG image": "Nie udało się wczytać obrazu SVG", + "Failed to load WebP image": "Nie udało się wczytać obrazu WebP", + "Failed to load attachments from PDF.": "Nie udało się wczytać załączników z PDF.", + "Failed to load files: {{error}}": "Nie udało się wczytać plików: {{error}}", + "Failed to load image.": "Nie udało się wczytać obrazu.", + "Failed to load image: {{filename}}": "Nie udało się wczytać obrazu: {{filename}}", + "Failed to load one or more PDF files.": "Nie udało się wczytać jednego lub kilku plików PDF.", + "Failed to load script: {{url}}": "Nie udało się wczytać skryptu: {{url}}", + "Failed to load template.": "Nie udało się wczytać szablonu.", + "Failed to load the PDF Editor.": "Nie udało się wczytać edytora PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Nie udało się wczytać procesora obrazów. Upewnij się, że przeglądarka obsługuje SharedArrayBuffer (wymaga HTTPS lub localhost).", + "Failed to parse CSV: {{error}}": "Nie udało się przeanalizować CSV: {{error}}", + "Failed to parse signature": "Nie udało się przeanalizować podpisu", + "Failed to parse the certificate file.": "Nie udało się przeanalizować pliku certyfikatu.", + "Failed to process HEIC file: {{name}}": "Nie udało się przetworzyć pliku HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Nie udało się przetworzyć pliku WebP: {{name}}", + "Failed to read file.": "Nie udało się odczytać pliku.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Nie udało się usunąć ograniczeń. PDF może wymagać prawidłowego hasła właściciela.", + "Failed to render page": "Nie udało się wyrenderować strony", + "Failed to render page previews": "Nie udało się wyrenderować podglądów stron", + "Failed to render page previews.": "Nie udało się wyrenderować podglądów stron.", + "Failed to render page.": "Nie udało się wyrenderować strony.", + "Failed to save changes.": "Nie udało się zapisać zmian.", + "Failed to save the new PDF. Check console for details.": "Nie udało się zapisać nowego PDF. Szczegóły znajdziesz w konsoli.", + "Failed to split PDF. Please check your selection.": "Nie udało się podzielić PDF. Sprawdź swój wybór.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Nie udało się dodać znacznika czasu do PDF: {{message}}\n\nSpróbuj użyć innego serwera TSA lub sprawdź połączenie z internetem.", + "Failed to toggle layer visibility": "Nie udało się przełączyć widoczności warstwy", + "Failed to validate signatures. The file may be corrupted.": "Nie udało się zweryfikować podpisów. Plik może być uszkodzony.", + "Features enabled by this module:": "Funkcje włączane przez ten moduł:", + "Field Name": "Nazwa pola", + "Field Name (Group Name)": "Nazwa pola (Nazwa grupy)", + "Field Name Conflict": "Konflikt nazw pól", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Nazwa pola \"{{newName}}\" już istnieje w tym elemencie ({{value}}). Użyj unikalnej nazwy.", + "Field name cannot be empty": "Nazwa pola nie może być pusta", + "File": "Plik", + "File Size": "Rozmiar pliku", + "File exists but could not be read. Check CORS configuration.": "Plik istnieje, ale nie udało się go odczytać. Sprawdź konfigurację CORS.", + "File list not found": "Nie znaleziono listy plików", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Rozmiar pliku zmniejszono z {{originalSize}} do {{compressedSize}} (oszczędność {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Plik {{n}}/{{length}}: strona {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Plik {{n}}/{{length}}: {{message}}", + "Filename": "Nazwa pliku", + "Files that failed: {{errorCount}}.": "Pliki z błędami: {{errorCount}}.", + "Fill (cover full target page)": "Wypełnij (pokryj całą stronę docelową)", + "Fill Color": "Kolor wypełnienia", + "Finalizing PDF...": "Finalizowanie PDF...", + "Find & replace": "Znajdź i zamień", + "Finds the best quality under this size. 0 means no target.": "Znajduje najlepszą jakość w tym rozmiarze. 0 oznacza brak celu.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox i Chrome mogą podczas wyboru pokazywać własny format selektora dat. Właściwy format zostanie zastosowany po zakończeniu wpisywania daty.", + "First Indent": "Wcięcie pierwszego wiersza", + "Fit (keep full page visible)": "Dopasuj (zachowaj widoczną całą stronę)", + "Fit Page": "Dopasuj do strony", + "Fix Page Size": "Napraw rozmiar strony", + "Flatten": "Spłaszcz", + "Flatten Forms": "Spłaszcz formularze", + "Flatten annotations": "Spłaszcz adnotacje", + "Flatten form fields": "Spłaszcz pola formularza", + "Flatten forms and annotations": "Spłaszcz formularze i adnotacje", + "Flatten links": "Spłaszcz linki", + "Flattening PDF...": "Spłaszczanie PDF...", + "Flattening and saving PDF...": "Spłaszczanie i zapisywanie PDF...", + "Flattening multiple PDFs...": "Spłaszczanie wielu plików PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Spłaszczanie strony {{i}} z {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Spłaszczanie {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Aktywuje pasek adresu", + "Font": "Czcionka", + "Font Color": "Kolor czcionki", + "Font Family": "Rodzina czcionek", + "Font Size": "Rozmiar czcionki", + "Font size: {{bSize}} → {{aSize}}": "Rozmiar czcionki: {{bSize}} → {{aSize}}", + "Font to Outline": "Czcionka na krzywe", + "Font: {{bFont}} → {{aFont}}": "Czcionka: {{bFont}} → {{aFont}}", + "Fonts": "Czcionki", + "Footer Center": "Stopka, środek", + "Footer Left": "Stopka, lewo", + "Footer Right": "Stopka, prawo", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Dla plików PDF zawierających tylko obrazy, np. skanów. Pomijane, gdy dokument ma zaznaczalny tekst, chyba że włączono Zastąp ochronę treści.", + "Form fields stop being fillable.": "Pola formularza przestają być edytowalne.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Znaleziono pustych stron: {{length}}. Kliknij stronę, aby usunąć jej zaznaczenie.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Znaleziono istniejących zakładek: {{length}}. Zastąpić obecne zakładki?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Znaleziono obrazów: {{length}} w plikach PDF: {{length2}}.", + "Front": "Przód", + "Full Coverage": "Pełne pokrycie", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Wygeneruj spis treści z zakładek", + "Generating High-Quality PDF...": "Generowanie PDF wysokiej jakości...", + "Generating PDF...": "Generowanie PDF...", + "Generating ZIP file...": "Generowanie pliku ZIP...", + "Generating formatted content...": "Generowanie sformatowanej treści...", + "Generating preview...": "Generowanie podglądu...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (konwersja do PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Konwersja RGB w Ghostscript nie powiodła się, kod wyjścia: {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Konwersja Ghostscript nie powiodła się, kod wyjścia: {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript nie utworzył pliku wyjściowego", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript nie jest skonfigurowany. Skonfiguruj go w ustawieniach zaawansowanych.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript nie jest skonfigurowany. Skonfiguruj go w ustawieniach WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript nie jest skonfigurowany. PyMuPDF wymaga Ghostscript do niektórych operacji. Skonfiguruj oba w ustawieniach zaawansowanych.", + "Ghostscript threw an exception: {{e}}": "Ghostscript zgłosił wyjątek: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Wrapper Ghostscript nie udostępnia oczekiwanego interfejsu. Oczekiwano loadGS() lub klasy GhostscriptWASM.", + "Go": "Przejdź", + "Go to page": "Przejdź do strony", + "Grayscale": "Skala szarości", + "Green": "Zielony", + "Greyscale": "Odcienie szarości", + "Grid Mode": "Tryb siatki", + "Group Name (Must be same for group)": "Nazwa grupy (musi być taka sama dla grupy)", + "H-Scale %": "Skala w poziomie %", + "Hanging Indent": "Wysunięcie", + "Hard reloads page": "Wymusza pełne przeładowanie strony", + "Header & Footer": "Nagłówek i stopka", + "Header & Footer added successfully!": "Nagłówek i stopka zostały dodane!", + "Header Center": "Nagłówek, środek", + "Header Left": "Nagłówek, lewo", + "Header Right": "Nagłówek, prawo", + "Height ({{unit}})": "Wysokość ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Ukryj", + "Hide Border": "Ukryj obramowanie", + "Hide password": "Ukryj hasło", + "Hides window": "Ukrywa okno", + "High (288 DPI)": "Wysoka (288 DPI)", + "High (Smallest Files)": "Wysoka (najmniejsze pliki)", + "Horizontal": "Poziomo", + "Hue Shift": "Przesunięcie odcienia", + "Image Format": "Format obrazu", + "Image Input": "Wejście obrazów", + "Image quality": "Jakość obrazu", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Zmieniono rozmiar obrazu z {{width}}×{{height}} na {{width2}}×{{height2}}", + "Images": "Obrazy", + "Images above this are resampled down. None leaves resolution alone.": "Obrazy powyżej tej wartości są próbkowane w dół. Brak pozostawia rozdzielczość bez zmian.", + "Imported {{length}} bookmarks!": "Zaimportowano zakładki: {{length}}!", + "Inches (in)": "Cale (in)", + "Include Attachments": "Dołącz załączniki", + "Include Cc Bcc": "Dołącz Cc i Bcc", + "Include this file": "Uwzględnij ten plik", + "Incorrect Page Count": "Nieprawidłowa liczba stron", + "Incorrect Password": "Nieprawidłowe hasło", + "Incorrect password": "Nieprawidłowe hasło", + "Incorrect password. Please try again.": "Nieprawidłowe hasło. Spróbuj ponownie.", + "Increase size": "Zwiększ rozmiar", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indeksowanie PDF 1, strona {{pageNumber}} z {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indeksowanie PDF 2, strona {{pageNumber}} z {{totalPages}}...", + "Info": "Informacje", + "Info Dictionary": "Słownik Info", + "Inherit": "Dziedzicz", + "Initialization Error": "Błąd inicjalizacji", + "Initializing Ghostscript...": "Inicjalizowanie Ghostscript...", + "Initializing PDF engine...": "Inicjalizowanie silnika PDF...", + "Initializing PyMuPDF...": "Inicjalizowanie PyMuPDF...", + "Initializing decryption...": "Inicjalizowanie odszyfrowywania...", + "Initializing encryption...": "Inicjalizowanie szyfrowania...", + "Initializing repair engine...": "Inicjalizowanie silnika naprawy...", + "Initializing...": "Inicjalizowanie...", + "Input Required": "Wymagane dane", + "Insecure Digest (MD5 / SHA-1)": "Niebezpieczny skrót (MD5 / SHA-1)", + "Insert blank pages": "Wstaw puste strony", + "Insert blank pages after this page number": "Wstaw puste strony po tym numerze strony", + "Interactive Form Fields": "Interaktywne pola formularza", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Przeplataj strony z wielu plików PDF (np. nieparzyste + odwrócone parzyste ze skanu jednostronnego)", + "Invalid Certificate": "Nieprawidłowy certyfikat", + "Invalid File": "Nieprawidłowy plik", + "Invalid Files": "Nieprawidłowe pliki", + "Invalid Input": "Nieprawidłowe dane wejściowe", + "Invalid JSON format": "Nieprawidłowy format JSON", + "Invalid Name": "Nieprawidłowa nazwa", + "Invalid Order": "Nieprawidłowa kolejność", + "Invalid PDF password.": "Nieprawidłowe hasło PDF.", + "Invalid Page Numbers": "Nieprawidłowe numery stron", + "Invalid Page Order": "Nieprawidłowa kolejność stron", + "Invalid Pages": "Nieprawidłowe strony", + "Invalid Range": "Nieprawidłowy zakres", + "Invalid Signature": "Nieprawidłowy podpis", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Nieprawidłowy adres URL TSA. Urząd znakowania czasem musi mieć prawidłowy adres URL http:// lub https://.", + "Invalid URL": "Nieprawidłowy adres URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Nieprawidłowy format adresu URL. Wpisz prawidłowy adres URL (np. https://example.com/wasm/)", + "Invalid XML: no root element": "Nieprawidłowy XML: brak elementu głównego", + "Invalid data": "Nieprawidłowe dane", + "Invalid hex string in content stream": "Nieprawidłowy ciąg szesnastkowy w strumieniu treści", + "Invalid page range specified.": "Podano nieprawidłowy zakres stron.", + "Invalid shortcut format": "Nieprawidłowy format skrótu", + "Invalid: Cryptographic Verification Failed": "Nieprawidłowy: weryfikacja kryptograficzna nie powiodła się", + "Invert Colors": "Odwróć kolory", + "Invert all colors": "Odwróć wszystkie kolory", + "Inverting PDF colors...": "Odwracanie kolorów PDF...", + "Issuer": "Wystawca", + "It fits the {{targetBytes}} target.": "Mieści się w docelowym rozmiarze {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Nadal przekracza docelowy rozmiar {{targetBytes}}, ponieważ opcja Zachowaj PDF/A ogranicza stopień kompresji.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Plik nie deklaruje już zgodności z PDF/A. Włącz Zachowaj PDF/A w ustawieniach niestandardowych, aby ją zachować.", + "Italic": "Kursywa", + "Item 1": "Element 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Jego podpisy cyfrowe zostały usunięte, aby można go było skompresować. W razie potrzeby podpisz go ponownie.", + "JPEG (Smaller file size)": "JPEG (mniejszy rozmiar pliku)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Jakość JPEG ponownie kodowanych obrazów, od 20 do 100. Niższa wartość oznacza mniejsze pliki i bardziej widoczne artefakty.", + "JPG": "JPG", + "JSON Files": "Pliki JSON", + "JSON Loaded": "Wczytano JSON", + "JSON to PDF": "JSON na PDF", + "Javascript Code": "Kod JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Zachowuje zgodność pliku PDF/A. Gdy ta opcja jest włączona, Brotli i rasteryzacja są pomijane.", + "Keeps only the characters the document uses.": "Zachowuje tylko znaki użyte w dokumencie.", + "Key (e.g., Department)": "Klucz (np. Dział)", + "Keywords": "Słowa kluczowe", + "Label": "Etykieta", + "Label / Prompt": "Etykieta / podpowiedź", + "Landscape": "Pozioma", + "Language": "Język", + "Layer not found": "Nie znaleziono warstwy", + "Layer {{number}}": "Warstwa {{number}}", + "Leave blank for all pages": "Pozostaw puste dla wszystkich stron", + "Left": "Lewo", + "Left edge in points (1 inch = 72 pts)": "Lewa krawędź w punktach (1 cal = 72 pkt)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Poziom", + "Limit recognized characters (leave empty for all)": "Ogranicz rozpoznawane znaki (pozostaw puste dla wszystkich)", + "Line": "Linia", + "Linearization Failed": "Linearyzacja nie powiodła się", + "Linearize": "Linearyzuj", + "Links stop being clickable.": "Linki przestają być klikalne.", + "Lists": "Listy", + "Load": "Wczytaj", + "Load system fonts": "Wczytaj czcionki systemowe", + "Load system fonts…": "Wczytaj czcionki systemowe…", + "Loaded": "Wczytano", + "Loaded bookmarks from JSON. Now upload your PDF.": "Wczytano zakładki z JSON. Teraz wgraj swój PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Wczytano zakładki z CSV: {{length}}. Teraz wgraj swój PDF.", + "Loading Engine...": "Wczytywanie silnika...", + "Loading Ghostscript...": "Wczytywanie Ghostscript...", + "Loading PDF Editor...": "Wczytywanie edytora PDF...", + "Loading PDF Text Editor...": "Wczytywanie edytora tekstu PDF...", + "Loading PDF converter...": "Wczytywanie konwertera PDF...", + "Loading PDF documents...": "Wczytywanie dokumentów PDF...", + "Loading PDF engine...": "Wczytywanie silnika PDF...", + "Loading PDF files...": "Wczytywanie plików PDF...", + "Loading PDF form...": "Wczytywanie formularza PDF...", + "Loading PDF processor...": "Wczytywanie procesora PDF...", + "Loading PDF viewer...": "Wczytywanie przeglądarki PDF...", + "Loading PDF...": "Wczytywanie PDF...", + "Loading PDFs...": "Wczytywanie plików PDF...", + "Loading attachments...": "Wczytywanie załączników...", + "Loading comparison {{currentPage}} of {{length}}...": "Wczytywanie porównania {{currentPage}} z {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Wczytywanie silnika konwersji ({{percent}}%)...", + "Loading conversion engine...": "Wczytywanie silnika konwersji...", + "Loading engine...": "Wczytywanie silnika...", + "Loading fonts...": "Wczytywanie czcionek...", + "Loading layers from {{name}}...": "Wczytywanie warstw z {{name}}...", + "Loading page {{num}}...": "Wczytywanie strony {{num}}...", + "Loading preview...": "Wczytywanie podglądu...", + "Loading {{name}}...": "Wczytywanie {{name}}...", + "Loading...": "Wczytywanie...", + "Location": "Lokalizacja", + "Lossless (No Quality Loss)": "Bezstratna (bez utraty jakości)", + "Lossless (no image re-encoding)": "Bezstratna (bez ponownego kodowania obrazów)", + "Low (Best Quality)": "Niska (najlepsza jakość)", + "MOBI Files": "Pliki MOBI", + "MOBI to PDF": "MOBI na PDF", + "Malformed ByteRange": "Nieprawidłowy ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Nieprawidłowy podpis ECDSA (nie udało się odczytać r,s)", + "Malformed inline image in content stream": "Nieprawidłowy obraz inline w strumieniu treści", + "Malformed signatureAlgorithm": "Nieprawidłowy signatureAlgorithm", + "Margins": "Marginesy", + "Markdown Files": "Pliki Markdown", + "Markdown to PDF": "Markdown na PDF", + "Max Length (0 for unlimited)": "Maks. długość (0 oznacza bez limitu)", + "Maximum resolution": "Maksymalna rozdzielczość", + "Medium (Recommended)": "Średnia (zalecana)", + "Merge PDF": "Połącz PDF", + "Merge PDFs": "Połącz pliki PDF", + "Merge duplicate fonts": "Scal zduplikowane czcionki", + "Mermaid Error: {{error}}": "Błąd Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadane skopiowano do schowka jako JSON.", + "Metadata removed successfully!": "Metadane zostały usunięte!", + "Metadata updated successfully!": "Metadane zostały zaktualizowane!", + "Millimeters (mm)": "Milimetry (mm)", + "Minimizes window": "Minimalizuje okno", + "Missing Files": "Brakujące pliki", + "Missing signatureAlgorithm": "Brak signatureAlgorithm", + "Mixed Page Sizes Detected": "Wykryto różne rozmiary stron", + "Mixed Sizes": "Różne rozmiary", + "Mode": "Tryb", + "Modified": "Zmieniono", + "Modified After Signing (signed part intact)": "Zmodyfikowano po podpisaniu (podpisana część nienaruszona)", + "More": "Więcej", + "Moved": "Przeniesiono", + "Moved \"{{value}}\"": "Przeniesiono \"{{value}}\"", + "Multi-line": "Wiele wierszy", + "Must be a positive integer": "Musi być dodatnią liczbą całkowitą", + "Must be a positive number": "Musi być liczbą dodatnią", + "N must be at least 1.": "N musi wynosić co najmniej 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "Plik PDF N-Up został utworzony!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Błąd sieci: nie udało się połączyć z adresem URL. Sprawdź, czy adres jest poprawny i czy serwer zezwala na żądania CORS.", + "Network error: {{error}}": "Błąd sieci: {{error}}", + "Next page": "Następna strona", + "No Area Selected": "Nie wybrano obszaru", + "No Attachments": "Brak załączników", + "No Changes": "Brak zmian", + "No Crop Area": "Brak obszaru przycinania", + "No File": "Brak pliku", + "No Files": "Brak plików", + "No Images Found": "Nie znaleziono obrazów", + "No PDF Files": "Brak plików PDF", + "No PDF document loaded": "Nie wczytano dokumentu PDF", + "No PDF document loaded.": "Nie wczytano dokumentu PDF.", + "No PDF file loaded.": "Nie wczytano pliku PDF.", + "No PDF files could be decrypted. The password may be incorrect.": "Nie udało się odszyfrować żadnego pliku PDF. Hasło może być nieprawidłowe.", + "No PDF files could be linearized.": "Nie udało się zlinearyzować żadnego pliku PDF.", + "No PDFs could be processed.": "Nie udało się przetworzyć żadnego pliku PDF.", + "No Pages": "Brak stron", + "No Selection": "Brak zaznaczenia", + "No Signatures Found": "Nie znaleziono podpisów", + "No Tables Found": "Nie znaleziono tabel", + "No Text": "Brak tekstu", + "No URL configured": "Nie skonfigurowano adresu URL", + "No attachments found in this PDF.": "W tym pliku PDF nie znaleziono załączników.", + "No attachments selected for removal.": "Nie wybrano załączników do usunięcia.", + "No blank pages detected in this PDF.": "W tym pliku PDF nie wykryto pustych stron.", + "No bookmarks found at the selected level.": "Nie znaleziono zakładek na wybranym poziomie.", + "No bookmarks to delete.": "Brak zakładek do usunięcia.", + "No bookmarks to export!": "Brak zakładek do wyeksportowania!", + "No certificate found in PEM file": "Nie znaleziono certyfikatu w pliku PEM", + "No certificate found in PFX file": "Nie znaleziono certyfikatu w pliku PFX", + "No certificates found in signature": "Nie znaleziono certyfikatów w podpisie", + "No changes match the current filter.": "Żadne zmiany nie pasują do bieżącego filtra.", + "No configurable settings for this node.": "Ten węzeł nie ma ustawień do skonfigurowania.", + "No differences detected on this page.": "Na tej stronie nie wykryto różnic.", + "No embedded images were found in the selected PDF(s).": "W wybranych plikach PDF nie znaleziono osadzonych obrazów.", + "No existing bookmarks found in this PDF.": "W tym pliku PDF nie znaleziono istniejących zakładek.", + "No items were selected for removal or none were found in the PDF.": "Nie wybrano elementów do usunięcia lub nie znaleziono ich w pliku PDF.", + "No page pairs to export.": "Brak par stron do wyeksportowania.", + "No pages found. Please create a blank PDF or upload one.": "Nie znaleziono stron. Utwórz pusty PDF lub wgraj istniejący.", + "No pages selected for removal.": "Nie wybrano stron do usunięcia.", + "No pages were selected for splitting.": "Nie wybrano stron do podziału.", + "No paired page for this side.": "Brak sparowanej strony po tej stronie.", + "No private key found in PEM file": "Nie znaleziono klucza prywatnego w pliku PEM", + "No private key found in PFX file": "Nie znaleziono klucza prywatnego w pliku PFX", + "No tables were detected in this PDF.": "W tym pliku PDF nie wykryto tabel.", + "No valid page numbers found.": "Nie znaleziono prawidłowych numerów stron.", + "No valid pages to save.": "Brak prawidłowych stron do zapisania.", + "No worker": "Brak workera", + "Noise": "Szum", + "None": "Brak", + "None of the files could be compressed: {{join}}.": "Nie udało się skompresować żadnego z plików: {{join}}.", + "Normal": "Zwykły", + "Not Enough Files": "Za mało plików", + "Not a PDF": "To nie jest PDF", + "Not connected": "Brak połączenia", + "Not in trust chain": "Poza łańcuchem zaufania", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Uwaga: bez osobnego hasła właściciela plik PDF nie ma żadnych ograniczeń użytkowania.", + "Number Format": "Format numeracji", + "Number of Pages": "Liczba stron", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR przerwano przed przetworzeniem jakiejkolwiek strony", + "OCR recognize timed out after {{timeoutMs}}ms": "Rozpoznawanie OCR przekroczyło limit czasu ({{timeoutMs}} ms)", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Pliki ODG", + "ODG to PDF": "ODG na PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Wyłączone (domyślnie): naturalna numeracja 1-N. Włączone: zachowywane są oryginalne etykiety stron każdego pliku (mogą powstać zduplikowane etykiety).", + "One PDF per page": "Jeden PDF na stronę", + "One PDF per range": "Jeden PDF na zakres", + "Only a substitute font was available": "Dostępna była tylko czcionka zastępcza", + "Only where it does not change how the image looks.": "Tylko tam, gdzie nie zmienia to wyglądu obrazu.", + "Opacity": "Krycie", + "Open URL": "Otwórz adres URL", + "Opens incognito window": "Otwiera okno incognito", + "Opens new tab": "Otwiera nową kartę", + "Opens new window": "Otwiera nowe okno", + "Operation Failed": "Operacja nie powiodła się", + "Operation resulted in an empty file.": "Operacja zwróciła pusty plik.", + "Optimize PDF for fast web viewing": "Zoptymalizuj PDF do szybkiego przeglądania w sieci", + "Optimizing PDFs for web view (linearizing)...": "Optymalizowanie plików PDF do przeglądania w sieci (linearyzacja)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optymalizowanie {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opcje (jedna na wiersz lub oddzielone przecinkami)", + "Orientation": "Orientacja", + "Outline": "Kontur", + "Output": "Wynik", + "Overlay": "Nakładka", + "Overlay or underlay pages from one PDF onto another": "Nałóż strony z jednego pliku PDF na inny lub podłóż je pod spód", + "Owner Password": "Hasło właściciela", + "Owner Password Required": "Wymagane hasło właściciela", + "PDF": "PDF", + "PDF Files": "Pliki PDF", + "PDF Input": "Wejście PDF", + "PDF Layers": "Warstwy PDF", + "PDF Metadata": "Metadane PDF", + "PDF Producer": "Producent PDF", + "PDF converted to CSV successfully!": "PDF został skonwertowany na CSV!", + "PDF converted to SVG successfully!": "PDF został skonwertowany na SVG!", + "PDF converted to greyscale successfully!": "PDF został skonwertowany na odcienie szarości!", + "PDF created successfully!": "PDF został utworzony!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF został odszyfrowany! Usunięto całe szyfrowanie i ograniczenia.", + "PDF decrypted successfully! Your download has started.": "PDF został odszyfrowany! Pobieranie się rozpoczęło.", + "PDF downloaded successfully.": "PDF został pobrany.", + "PDF encrypted successfully with 256-bit AES!": "PDF został zaszyfrowany 256-bitowym AES!", + "PDF has been sanitized and downloaded.": "PDF został oczyszczony i pobrany.", + "PDF has no pages": "PDF nie ma stron", + "PDF organized successfully!": "PDF został uporządkowany!", + "PDF permissions changed successfully!": "Uprawnienia PDF zostały zmienione!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Czytniki PDF same udostępniają 14 standardowych czcionek PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Ograniczenia PDF zostały usunięte! Plik można teraz w pełni edytować i drukować.", + "PDF saved successfully!": "PDF został zapisany!", + "PDF split successfully!": "PDF został podzielony!", + "PDF to CSV": "PDF na CSV", + "PDF to DOCX": "PDF na DOCX", + "PDF to Excel/CSV": "PDF na Excel/CSV", + "PDF to Images": "PDF na obrazy", + "PDF to Images (High Quality)": "PDF na obrazy (wysoka jakość)", + "PDF to JSON": "PDF na JSON", + "PDF to Markdown": "PDF na Markdown", + "PDF to PDF/A": "PDF na PDF/A", + "PDF to SVG": "PDF na SVG", + "PDF to Text": "PDF na tekst", + "PDF to XLSX": "PDF na XLSX", + "PDF with layer changes saved!": "PDF ze zmianami warstw został zapisany!", + "PDF {{modeLabel}} applied successfully.": "Zastosowano PDF: {{modeLabel}}.", + "PDF/A Conversion": "Konwersja do PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (ścisły, bez przezroczystości)", + "PDF/A-2b (Recommended)": "PDF/A-2b (zalecany)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (nowoczesny, dopuszcza załączniki)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "Pliki PDF zostały wymieszane!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (bezstratny)", + "PUB to PDF": "PUB na PDF", + "Page": "Strona", + "Page #": "Strona nr", + "Page Added": "Dodano stronę", + "Page Numbers": "Numery stron", + "Page Removed": "Usunięto stronę", + "Page Size": "Rozmiar strony", + "Page X of Y": "Strona X z Y", + "Page background or layout changed": "Zmieniono tło lub układ strony", + "Page container not found": "Nie znaleziono kontenera strony", + "Page extraction produced an empty PDF.": "Wyodrębnianie stron zwróciło pusty PDF.", + "Page number": "Numer strony", + "Page numbers added successfully!": "Numery stron zostały dodane!", + "Page sizes standardized successfully!": "Rozmiary stron zostały ujednolicone!", + "Page {{currentPageNum}} of {{numPages}}": "Strona {{currentPageNum}} z {{numPages}}", + "Page {{num}} / {{numPages}}": "Strona {{num}} / {{numPages}}", + "Page {{n}} ": "Strona {{n}} ", + "Page {{n}} of {{length}}": "Strona {{n}} z {{length}}", + "Page {{n}}:": "Strona {{n}}:", + "Page {{pageNumber}}": "Strona {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Strona {{pageNumber}} istnieje tylko w pierwszym PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Strona {{pageNumber}} istnieje tylko w drugim PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Strona {{pageNumber}} z {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Strona {{pageNum}} nie istnieje w tym PDF.", + "Page {{page}}": "Strona {{page}}", + "Page {{page}} attachment": "Załącznik strony {{page}}", + "Pages": "Strony", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Strony (np. 1-3, 5), łącznie: {{pageCount}}", + "Pages Files": "Pliki Pages", + "Pages Per Sheet": "Stron na arkusz", + "Pages combined successfully!": "Strony zostały połączone!", + "Pages have been divided successfully!": "Strony zostały podzielone!", + "Pages have been reordered.": "Kolejność stron została zmieniona.", + "Pages have been reversed successfully!": "Strony zostały odwrócone!", + "Pages to PDF": "Pages na PDF", + "Paper Size": "Rozmiar papieru", + "Paragraph": "Akapit", + "Parsing XML structure...": "Analizowanie struktury XML...", + "Parsing {{name}}...": "Analizowanie: {{name}}...", + "Partial Coverage": "Częściowe pokrycie", + "Partial Success": "Częściowy sukces", + "Password": "Hasło", + "Password Error": "Błąd hasła", + "Password Needed": "Wymagane hasło", + "Password Required": "Wymagane hasło", + "Password for all files": "Hasło dla wszystkich plików", + "Password for all locked files": "Hasło dla wszystkich zablokowanych plików", + "Password for {{name}}": "Hasło dla: {{name}}", + "Password protected": "Chroniony hasłem", + "Password required for encrypted private key": "Zaszyfrowany klucz prywatny wymaga hasła", + "Path Stroke": "Obrys ścieżki", + "Please add at least one field before downloading.": "Przed pobraniem dodaj co najmniej jedno pole.", + "Please draw a rectangle on at least one page to select the crop area.": "Narysuj prostokąt na co najmniej jednej stronie, aby wybrać obszar przycinania.", + "Please ensure all page numbers in the order are unique.": "Upewnij się, że wszystkie numery stron w kolejności są unikalne.", + "Please enter a layer name": "Wpisz nazwę warstwy", + "Please enter a name.": "Wpisz nazwę.", + "Please enter a number between 0 and {{totalPages}}.": "Wpisz liczbę od 0 do {{totalPages}}.", + "Please enter a page order.": "Wpisz kolejność stron.", + "Please enter a password": "Wpisz hasło", + "Please enter a password for {{i}} or skip it": "Wpisz hasło dla {{i}} lub pomiń", + "Please enter a title.": "Wpisz tytuł.", + "Please enter a user password.": "Wpisz hasło użytkownika.", + "Please enter a valid number of pages (1 or more).": "Wpisz prawidłową liczbę stron (1 lub więcej).", + "Please enter a valid page number between 1 and {{total}}": "Wpisz prawidłowy numer strony od 1 do {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Wpisz prawidłowy zakres stron (np. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Wpisz numery stron do wyodrębnienia.", + "Please enter positive numbers.": "Wpisz liczby dodatnie.", + "Please enter some text to convert.": "Wpisz tekst do konwersji.", + "Please enter text for the watermark.": "Wpisz tekst znaku wodnego.", + "Please enter the PDF password.": "Wpisz hasło do PDF.", + "Please load a PDF first.": "Najpierw wczytaj PDF.", + "Please select PDF files to create a ZIP archive.": "Wybierz pliki PDF, aby utworzyć archiwum ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Wybierz plik certyfikatu .pem, .crt, .cer lub .der.", + "Please select a PDF file.": "Wybierz plik PDF.", + "Please select a valid PDF file.": "Wybierz prawidłowy plik PDF.", + "Please select an area on at least one page to crop.": "Zaznacz obszar na co najmniej jednej stronie, aby go przyciąć.", + "Please select an area to crop first.": "Najpierw zaznacz obszar do przycięcia.", + "Please select an area to crop.": "Zaznacz obszar do przycięcia.", + "Please select an image file for the watermark.": "Wybierz plik obrazu dla znaku wodnego.", + "Please select at least one BMP file.": "Wybierz co najmniej jeden plik BMP.", + "Please select at least one CSV file.": "Wybierz co najmniej jeden plik CSV.", + "Please select at least one Excel file.": "Wybierz co najmniej jeden plik Excel.", + "Please select at least one HEIC file.": "Wybierz co najmniej jeden plik HEIC.", + "Please select at least one JPG file.": "Wybierz co najmniej jeden plik JPG.", + "Please select at least one JPG or JPEG2000 image.": "Wybierz co najmniej jeden obraz JPG lub JPEG2000.", + "Please select at least one ODT file.": "Wybierz co najmniej jeden plik ODT.", + "Please select at least one PDF file.": "Wybierz co najmniej jeden plik PDF.", + "Please select at least one PowerPoint file.": "Wybierz co najmniej jeden plik PowerPoint.", + "Please select at least one RTF file.": "Wybierz co najmniej jeden plik RTF.", + "Please select at least one SVG file.": "Wybierz co najmniej jeden plik SVG.", + "Please select at least one TIFF file.": "Wybierz co najmniej jeden plik TIFF.", + "Please select at least one Word document.": "Wybierz co najmniej jeden dokument Word.", + "Please select at least one file to attach.": "Wybierz co najmniej jeden plik do dołączenia.", + "Please select at least one image file.": "Wybierz co najmniej jeden plik obrazu.", + "Please select at least one text file.": "Wybierz co najmniej jeden plik tekstowy.", + "Please select at least one {{FILETYPE_NAME}} file.": "Wybierz co najmniej jeden plik {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Wybierz co najmniej jeden plik {{TOOL_NAME}} (.eml lub .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Wybierz co najmniej jeden plik {{TOOL_NAME}}.", + "Please select even or odd pages.": "Wybierz strony parzyste lub nieparzyste.", + "Please select one or more PDF files.": "Wybierz jeden lub kilka plików PDF.", + "Please select pages to delete.": "Wybierz strony do usunięcia.", + "Please select pages to duplicate.": "Wybierz strony do zduplikowania.", + "Please select pages to mark for splitting.": "Wybierz strony, które mają oznaczać podział.", + "Please select pages to rotate.": "Wybierz strony do obrócenia.", + "Please specify a page range for page-level attachments.": "Podaj zakres stron dla załączników na poziomie strony.", + "Please upload PDF files.": "Wgraj pliki PDF.", + "Please upload PDFs first.": "Najpierw wgraj pliki PDF.", + "Please upload a .docx file first.": "Najpierw wgraj plik .docx.", + "Please upload a PDF file first.": "Najpierw wgraj plik PDF.", + "Please upload a PDF file.": "Wgraj plik PDF.", + "Please upload a PDF first.": "Najpierw wgraj PDF.", + "Please upload a valid PDF file.": "Wgraj prawidłowy plik PDF.", + "Please upload at least one PDF file.": "Wgraj co najmniej jeden plik PDF.", + "Please upload at least two PDF files to alternate and mix.": "Wgraj co najmniej dwa pliki PDF, aby je przeplatać i mieszać.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Wgraj zarówno bazowy PDF, jak i PDF nakładki lub podkładu.", + "Please upload valid PDF files.": "Wgraj prawidłowe pliki PDF.", + "Please use the Download button in the PDF viewer toolbar above.": "Użyj przycisku Pobierz na pasku narzędzi przeglądarki PDF powyżej.", + "Please wait for the PDF viewer to load.": "Poczekaj na wczytanie przeglądarki PDF.", + "Please wait for the form to finish loading.": "Poczekaj, aż formularz się wczyta.", + "Portrait": "Pionowa", + "Position": "Pozycja", + "Post-processing for transparency compliance...": "Przetwarzanie końcowe pod kątem zgodności z przezroczystością...", + "Posterize": "Plakatuj", + "Posterizing PDF...": "Plakatowanie PDF...", + "PowerPoint to PDF": "PowerPoint na PDF", + "Pre Flatten": "Wstępne spłaszczenie", + "Pre-flattening PDF...": "Wstępne spłaszczanie PDF...", + "Prefer JPEG 2000 for photos": "Preferuj JPEG 2000 dla zdjęć", + "Preparing PDF export...": "Przygotowywanie eksportu PDF...", + "Preparing conversion...": "Przygotowywanie konwersji...", + "Preparing download...": "Przygotowywanie pobierania...", + "Preparing preview...": "Przygotowywanie podglądu...", + "Presentations": "Prezentacje", + "Preserve PDF/A": "Zachowaj PDF/A", + "Preview": "Podgląd", + "Preview Error": "Błąd podglądu", + "Preview Text": "Podgląd tekstu", + "Previous page": "Poprzednia strona", + "Print Form": "Drukuj formularz", + "Private data that editing apps store inside the PDF.": "Prywatne dane, które aplikacje do edycji zapisują wewnątrz pliku PDF.", + "Processed {{processedCount}} PDFs.": "Przetworzono pliki PDF: {{processedCount}}.", + "Processing Complete": "Przetwarzanie zakończone", + "Processing Dpi": "DPI przetwarzania", + "Processing Failed": "Przetwarzanie nie powiodło się", + "Processing PDF permissions...": "Przetwarzanie uprawnień PDF...", + "Processing attachments...": "Przetwarzanie załączników...", + "Processing failed for {{name}}.": "Przetwarzanie nie powiodło się dla: {{name}}.", + "Processing file {{n}} of {{length}}...": "Przetwarzanie pliku {{n}} z {{length}}...", + "Processing images...": "Przetwarzanie obrazów...", + "Processing multiple PDFs...": "Przetwarzanie wielu plików PDF...", + "Processing page {{i}} of {{numPages}}": "Przetwarzanie strony {{i}} z {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Przetwarzanie strony {{i}} z {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Przetwarzanie strony {{n}} z {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Przetwarzanie strony {{pageNum}} z {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Przetwarzanie strony {{pageNum}} z {{totalPages}}...", + "Processing produced an empty file.": "Przetwarzanie zwróciło pusty plik.", + "Processing resulted in an empty file.": "Przetwarzanie zwróciło pusty plik.", + "Processing sheet {{n}}...": "Przetwarzanie arkusza {{n}}...", + "Processing {{name}}...": "Przetwarzanie: {{name}}...", + "Processing {{nodeName}}...": "Przetwarzanie: {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Przetwarzanie {{n}}/{{length}}: {{name}}...", + "Processing...": "Przetwarzanie...", + "Producer": "Producent", + "Publisher Files": "Pliki Publisher", + "Purple": "Fioletowy", + "PyMuPDF (Document Processing)": "PyMuPDF (przetwarzanie dokumentów)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF nie jest skonfigurowany. Skonfiguruj go w ustawieniach zaawansowanych.", + "PyMuPDF module did not export expected PyMuPDF class.": "Moduł PyMuPDF nie wyeksportował oczekiwanej klasy PyMuPDF.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF zwrócił pusty odszyfrowany plik.", + "PyMuPDF: not configured.": "PyMuPDF: nie skonfigurowano.", + "QR Code": "Kod QR", + "Quality": "Jakość", + "Quits application (cannot be overridden)": "Zamyka aplikację (nie można tego zmienić)", + "RSA-PKCS1 signature does not verify against signer public key": "Podpis RSA-PKCS1 nie przechodzi weryfikacji względem klucza publicznego podpisującego", + "RSA-PSS signature does not verify against signer public key": "Podpis RSA-PSS nie przechodzi weryfikacji względem klucza publicznego podpisującego", + "Rasterization Complete": "Rasteryzacja zakończona", + "Rasterization Partial": "Rasteryzacja częściowa", + "Rasterize": "Rasteryzuj", + "Rasterize Dpi": "DPI rasteryzacji", + "Rasterize pages to images": "Rasteryzuj strony do obrazów", + "Rasterize quality": "Jakość rasteryzacji", + "Rasterize resolution (DPI)": "Rozdzielczość rasteryzacji (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Zrasteryzowano pliki PDF: {{completed}}, niepowodzeń: {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rasteryzowanie {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rasteryzowanie: {{name}}...", + "Rasterizing...": "Rasteryzowanie...", + "Rating must be between 0 and 5": "Ocena musi mieścić się w zakresie od 0 do 5", + "Read Only": "Tylko do odczytu", + "Reading CSV file...": "Odczytywanie pliku CSV...", + "Reading PDF...": "Odczytywanie PDF...", + "Reading XML file...": "Odczytywanie pliku XML...", + "Reading encrypted PDF...": "Odczytywanie zaszyfrowanego PDF...", + "Reading files...": "Odczytywanie plików...", + "Reading layer configuration...": "Odczytywanie konfiguracji warstw...", + "Reading {{name}} ({{n}}/{{length}})...": "Odczytywanie {{name}} ({{n}}/{{length}})...", + "Ready": "Gotowe", + "Reason": "Powód", + "Red": "Czerwony", + "Redact": "Redaguj", + "Redact Mode": "Tryb redakcji", + "Redact text from PDF": "Zredaguj tekst w PDF", + "Redaction Failed": "Redakcja nie powiodła się", + "Reduce PDF file size": "Zmniejsz rozmiar pliku PDF", + "Reduce color complexity": "Zmniejsz złożoność kolorów", + "Reduces file size by removing color information.": "Zmniejsza rozmiar pliku przez usunięcie informacji o kolorach.", + "Reloads page": "Przeładowuje stronę", + "Remove": "Usuń", + "Remove All Attachments": "Usuń wszystkie załączniki", + "Remove Annotations": "Usuń adnotacje", + "Remove Blank Pages": "Usuń puste strony", + "Remove Embedded Files": "Usuń osadzone pliki", + "Remove Fonts": "Usuń czcionki", + "Remove Javascript": "Usuń JavaScript", + "Remove Layers": "Usuń warstwy", + "Remove Links": "Usuń linki", + "Remove Mark Info": "Usuń informacje Mark Info", + "Remove Metadata": "Usuń metadane", + "Remove PDF password protection": "Usuń ochronę hasłem z PDF", + "Remove Structure Tree": "Usuń drzewo struktury", + "Remove alternate images": "Usuń obrazy alternatywne", + "Remove application data": "Usuń dane aplikacji", + "Remove article threads": "Usuń wątki artykułów", + "Remove attachment": "Usuń załącznik", + "Remove blank pages automatically": "Usuń puste strony automatycznie", + "Remove document structure tree": "Usuń drzewo struktury dokumentu", + "Remove file": "Usuń plik", + "Remove metadata, scripts, and hidden data": "Usuń metadane, skrypty i ukryte dane", + "Remove output intents": "Usuń intencje wyjściowe", + "Remove page thumbnails": "Usuń miniatury stron", + "Remove specific pages": "Usuń wybrane strony", + "Remove web capture information": "Usuń informacje o przechwyceniu ze strony internetowej", + "Remove {{name}}": "Usuń: {{name}}", + "Removed \"{{beforeText}}\"": "Usunięto \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Usunięto obraz ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Usunięto pustych stron: {{length}}!", + "Removing all metadata...": "Usuwanie wszystkich metadanych...", + "Removing annotations...": "Usuwanie adnotacji...", + "Removing redacted text from document data...": "Usuwanie zredagowanego tekstu z danych dokumentu...", + "Removing restrictions...": "Usuwanie ograniczeń...", + "Removing {{length}} blank page(s)...": "Usuwanie pustych stron: {{length}}...", + "Render Error": "Błąd renderowania", + "Rendering Page {{num}}...": "Renderowanie strony {{num}}...", + "Rendering page previews...": "Renderowanie podglądów stron...", + "Rendering page previews: {{current}}/{{total}}": "Renderowanie podglądów stron: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Renderowanie strony {{n}} z {{length}}...", + "Rendering preview for page {{pageNum}}...": "Renderowanie podglądu strony {{pageNum}}...", + "Reopens closed tab": "Otwiera ponownie zamkniętą kartę", + "Repair": "Napraw", + "Repair Failed": "Naprawa nie powiodła się", + "Repair corrupted PDF": "Napraw uszkodzony PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Naprawiono pliki: {{length}}. Nie udało się naprawić: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Naprawianie {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Naprawianie: {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Zamieniono \"{{beforeText}}\" na \"{{afterText}}\"", + "Required": "Wymagane", + "Resamples even when an image is only slightly above the limit.": "Próbkuje ponownie, nawet gdy obraz tylko nieznacznie przekracza limit.", + "Reset Form": "Zresetuj formularz", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Zresetować i wrócić do wgrywania plików? Wszystkie niezapisane zmiany zostaną utracone.", + "Resolution": "Rozdzielczość", + "Retain Page Labels": "Zachowaj etykiety stron", + "Retry Failed": "Ponów nieudane", + "Reverse Pages": "Odwróć strony", + "Reverse page order": "Odwróć kolejność stron", + "Reversing page order...": "Odwracanie kolejności stron...", + "Reversing {{name}} ({{n}}/{{length}})...": "Odwracanie {{name}} ({{n}}/{{length}})...", + "Right": "Prawo", + "Right edge in points": "Prawa krawędź w punktach", + "Rotate": "Obróć", + "Rotate +90°": "Obróć o +90°", + "Rotate all pages": "Obróć wszystkie strony", + "Rotation": "Obrót", + "Rotation Variance": "Wariancja obrotu", + "Rotations applied successfully!": "Obroty zostały zastosowane!", + "Rows": "Wiersze", + "Run Javascript": "Uruchom JavaScript", + "Running OCR on page {{pageNum}}...": "Uruchamianie OCR na stronie {{pageNum}}...", + "Running...": "Uruchamianie...", + "SVG": "SVG", + "SVG Files": "Pliki SVG", + "SVG to PDF": "SVG na PDF", + "Sanitize": "Sanityzuj", + "Sanitized With Warnings": "Sanityzacja z ostrzeżeniami", + "Sanitizing PDF...": "Sanityzowanie PDF...", + "Saturation": "Nasycenie", + "Saved": "Zapisano", + "Saving PDF with layer changes...": "Zapisywanie PDF ze zmianami warstw...", + "Scaling Mode": "Tryb skalowania", + "Scanner Effect": "Efekt skanera", + "Scanner effect applied successfully!": "Efekt skanera został zastosowany!", + "Scanning page {{n}} of {{pageCount}}...": "Skanowanie strony {{n}} z {{pageCount}}...", + "Search Text": "Szukaj tekstu", + "Search languages...": "Szukaj języków...", + "Select Font": "Wybierz czcionkę", + "Select a field to edit properties": "Wybierz pole, aby edytować właściwości", + "Select a field...": "Wybierz pole...", + "Select to add this button to an existing group": "Wybierz, aby dodać ten przycisk do istniejącej grupy", + "Selected Option": "Wybrana opcja", + "Self-Signed: Signer Identity Not Verified": "Podpisany samodzielnie: tożsamość podpisującego nie została zweryfikowana", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Zasoby OCR na własnym hostingu są skonfigurowane częściowo. Ustaw {{missing}} razem z pozostałymi adresami URL zasobów Tesseract.", + "Separator": "Separator", + "Separator Color": "Kolor separatora", + "Separator Thickness": "Grubość separatora", + "Sepia": "Sepia", + "Serial Number:": "Numer seryjny:", + "Set custom destination": "Ustaw niestandardowy cel", + "Shapes": "Kształty", + "Sheet {{n}} {{sideLabel}}": "Arkusz {{n}} {{sideLabel}}", + "Show": "Pokaż", + "Show password": "Pokaż hasło", + "Show/Hide Field": "Pokaż/ukryj pole", + "Sign Here": "Podpisz tutaj", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents nie jest pojedynczym obiektem DER, po którym następuje wypełnienie zerami", + "Signature Algorithm:": "Algorytm podpisu:", + "Signature Intact: Signer Identity Not Verified": "Podpis nienaruszony: tożsamość podpisującego nie została zweryfikowana", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Pola podpisu to pola podpisu AcroForm i byłyby widoczne tylko w zaawansowanej przeglądarce PDF.", + "Signature has a missing or malformed /ByteRange": "Podpis ma brakujący lub nieprawidłowy /ByteRange", + "Signature scheme {{kind}} not implemented": "Schemat podpisu {{kind}} nie jest zaimplementowany", + "Signature {{n}}": "Podpis {{n}}", + "Signatures": "Podpisy", + "Signed By": "Podpisał", + "Signed On": "Data podpisu", + "Signed PDF Not Changed": "Podpisany PDF nie został zmieniony", + "Signed PDF downloaded successfully!": "Podpisany PDF został pobrany!", + "Signed PDF saved successfully!": "Podpisany PDF został zapisany!", + "Simple (1, 2, 3)": "Prosta (1, 2, 3)", + "Simplify large color profiles": "Uprość duże profile kolorów", + "Skew Threshold": "Próg skosu", + "Skip": "Pomiń", + "Skip All": "Pomiń wszystkie", + "Skip Remaining": "Pomiń pozostałe", + "Skip this file": "Pomiń ten plik", + "Skipped: {{join}}.": "Pominięto: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Mniejsze pliki, ale otworzą je tylko czytniki obsługujące Brotli, takie jak Firefox, MuPDF 1.26+ i Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Niektóre pliki pominięto, ponieważ nie są obsługiwanymi obrazami.", + "Some files were skipped. Only BMP files are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko pliki BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko pliki HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko pliki JPG, JPEG, JP2 i JPX.", + "Some files were skipped. Only PDF files are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko pliki PDF.", + "Some files were skipped. Only PNG images are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko obrazy PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Niektóre pliki pominięto. Dozwolona jest tylko grafika SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko pliki TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko obrazy WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko obsługiwane formaty obrazów.", + "Some files were skipped. Only text files are allowed.": "Niektóre pliki pominięto. Dozwolone są tylko pliki tekstowe.", + "Some pages could not be processed. Please try again.": "Nie udało się przetworzyć niektórych stron. Spróbuj ponownie.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Nie udało się zastosować niektórych znaczników redakcji, więc plik nie został pobrany. Zastosuj je lub usuń w edytorze i spróbuj ponownie.", + "Spacing": "Odstępy", + "Split PDF": "Podziel PDF", + "Split by Bookmarks": "Podziel według zakładek", + "Split pages into tile grid for poster printing": "Podziel strony na siatkę kafelków do druku plakatów", + "Split pages vertically or horizontally": "Podziel strony w pionie lub w poziomie", + "Splitting PDF pages...": "Dzielenie stron PDF...", + "Splitting PDF...": "Dzielenie PDF...", + "Spreadsheets": "Arkusze kalkulacyjne", + "Standard (192 DPI)": "Standardowa (192 DPI)", + "Standard Size": "Rozmiar standardowy", + "Standardize all pages to a target size": "Ujednolić wszystkie strony do rozmiaru docelowego", + "Standardizing pages...": "Ujednolicanie stron...", + "Stitch all pages into one continuous page": "Zszyj wszystkie strony w jedną ciągłą stronę", + "Straighten skewed PDF pages": "Wyprostuj przekrzywione strony PDF", + "Strip all annotations": "Usuń wszystkie adnotacje", + "Style": "Styl", + "Style Changed": "Zmieniono styl", + "Style changed ({{length}} regions)": "Zmieniono styl (obszarów: {{length}})", + "Subject": "Temat", + "Subset embedded fonts": "Twórz podzbiory osadzonych czcionek", + "Success": "Sukces", + "Success!": "Sukces!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Skonwertowano pliki CSV na PDF: {{length}}.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Skonwertowano pliki Excel na PDF: {{length}}.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Skonwertowano pliki ODT na PDF: {{length}}.", + "Successfully converted {{length}} PDF(s) to DOCX.": "Skonwertowano pliki PDF na DOCX: {{length}}.", + "Successfully converted {{length}} PDF(s) to Markdown.": "Skonwertowano pliki PDF na Markdown: {{length}}.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "Skonwertowano pliki PDF ({{length}}) na {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Skonwertowano pliki PSD ({{length}}) na jeden PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Skonwertowano pliki PowerPoint na PDF: {{length}}.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Skonwertowano pliki RTF na PDF: {{length}}.", + "Successfully converted {{length}} Word document(s) to PDF.": "Skonwertowano dokumenty Word na PDF: {{length}}.", + "Successfully converted {{length}} files to PDF.": "Skonwertowano pliki na PDF: {{length}}.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Skonwertowano pliki {{TOOL_NAME}} na PDF: {{length}}.", + "Successfully converted {{name}} to DOCX.": "Skonwertowano {{name}} na DOCX.", + "Successfully converted {{name}} to Markdown.": "Skonwertowano {{name}} na Markdown.", + "Successfully converted {{name}} to PDF.": "Skonwertowano {{name}} na PDF.", + "Successfully converted {{name}} to {{level}}.": "Skonwertowano {{name}} na {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "Wyodrębniono PDF do użycia z AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "Wyodrębniono pliki PDF do użycia z AI/LLM: {{completed}}.", + "Successfully rasterized PDF at {{dpi}} DPI.": "Zrasteryzowano PDF w {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "Zrasteryzowano pliki PDF w {{dpi}} DPI: {{completed}}.", + "Supported: CBZ, CBR": "Obsługiwane: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Obsługiwane: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Obsługiwane: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Obsługiwane: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Obsługiwane: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Obsługiwane: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Obsługiwane: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Obsługiwane: XPS, OXPS", + "Switches apps": "Przełącza aplikacje", + "Switches tabs": "Przełącza karty", + "Table of Contents": "Spis treści", + "Table {{n}} (Page {{page}})": "Tabela {{n}} (strona {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Pole docelowe", + "Target Kilobytes": "Docelowa liczba kilobajtów", + "Target Not Reached": "Nie osiągnięto celu", + "Target Size": "Rozmiar docelowy", + "Technical Details": "Szczegóły techniczne", + "Temperature": "Temperatura", + "Template \"{{name}}\" loaded.": "Wczytano szablon \"{{name}}\".", + "Template \"{{name}}\" saved.": "Zapisano szablon \"{{name}}\".", + "Text": "Tekst", + "Text Color": "Kolor tekstu", + "Text Files": "Pliki tekstowe", + "Text color changed successfully!": "Kolor tekstu został zmieniony!", + "Text converted to PDF successfully!": "Tekst został skonwertowany na PDF!", + "Text extracted successfully!": "Tekst został wyodrębniony!", + "Text to PDF": "Tekst na PDF", + "That password did not open any of the remaining files.": "To hasło nie otworzyło żadnego z pozostałych plików.", + "The PDF file(s) do not contain any attachments to extract.": "Pliki PDF nie zawierają załączników do wyodrębnienia.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF ma {{totalPages}} stron, których liczba nie dzieli się równo przez {{nValue}}. Ostatni PDF będzie zawierał stron: {{remainder}}.", + "The PDF might be corrupted or password protected.": "PDF może być uszkodzony lub chroniony hasłem.", + "The PDF might be corrupted or password-protected.": "PDF może być uszkodzony lub chroniony hasłem.", + "The PDF might be corrupted.": "PDF może być uszkodzony.", + "The PDF viewer is still initializing.": "Przeglądarka PDF nadal się inicjalizuje.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF został pobrany, ale nie udało się wykonać tych kroków: {{join}}. Objęta nimi treść może nadal znajdować się w pliku.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "Adres URL zwrócił nieoczekiwany typ treści: {{contentType}}. Oczekiwano pliku JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Bajty wykluczone przez /ByteRange nie są dokładnie podpisem zakodowanym szesnastkowo", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Bajty wykluczone przez /ByteRange nie są /Contents tego podpisu", + "The compression engine returned an unreadable result.": "Silnik kompresji zwrócił nieczytelny wynik.", + "The compression engine stopped unexpectedly.": "Silnik kompresji nieoczekiwanie przestał działać.", + "The current password you entered is incorrect. Please try again.": "Wpisane obecne hasło jest nieprawidłowe. Spróbuj ponownie.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Te nazwy pól już istnieją we wgranym PDF: {{conflictList}}. Zmień nazwy tych pól przed pobraniem.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Te nazwy pól są użyte więcej niż raz: {{duplicateList}}. Zmień nazwy tych pól na unikalne przed pobraniem.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Podana liczba stron ({{length}}) nie zgadza się z obecną liczbą stron w dokumencie ({{currentGridCount}}). Podaj pełną kolejność dla wszystkich stron.", + "The password you entered is incorrect. Please try again.": "Wpisane hasło jest nieprawidłowe. Spróbuj ponownie.", + "The password you entered is wrong or the file is corrupted.": "Wpisane hasło jest nieprawidłowe lub plik jest uszkodzony.", + "The provided file could not be loaded as an image. It may be corrupted.": "Nie udało się wczytać podanego pliku jako obrazu. Może być uszkodzony.", + "The requested OCR language is not available: {{unavailableText}}.": "Żądany język OCR jest niedostępny: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Podana kolejność stron jest niepełna lub zawiera nieprawidłowe numery stron. Upewnij się, że podano nową pozycję dla każdej oryginalnej strony.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Te pliki nie są prawidłowymi plikami PDF, więc nie zostały dodane: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Te pliki są chronione hasłem: {{names}}. Wpisz ich hasła na kartach plików lub usuń je, a następnie skompresuj ponownie.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Ta wersja BentoPDF zawiera dane OCR tylko dla: {{availableText}}.", + "This PDF does not contain any digital signatures.": "Ten PDF nie zawiera żadnych podpisów cyfrowych.", + "This PDF has no layers (OCG).": "Ten PDF nie ma warstw (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Ten PDF jest chroniony hasłem. Wpisz obecne hasło, aby kontynuować.", + "This document contains pages with different dimensions:": "Ten dokument zawiera strony o różnych wymiarach:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Ten dokument zawiera 1 znacznik redakcji, który nie został jeszcze zastosowany. Dopóki znacznik nie zostanie zastosowany, zawartość pod nim pozostaje w pliku. Zastosować wszystkie znaczniki i pobrać?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Ten dokument zawiera znaczniki redakcji, które nie zostały jeszcze zastosowane (liczba: {{count}}). Dopóki znacznik nie zostanie zastosowany, zawartość pod nim pozostaje w pliku. Zastosować wszystkie znaczniki i pobrać?", + "This feature requires {{name}} to be configured.": "Ta funkcja wymaga skonfigurowania {{name}}.", + "This file is not a valid PDF.": "Ten plik nie jest prawidłowym PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Ten moduł jest objęty licencją AGPL-3.0. Konfigurując go, akceptujesz jego warunki licencji.", + "This tool has been disabled": "To narzędzie zostało wyłączone", + "This tool is not available in your deployment. Contact your administrator for more information.": "To narzędzie nie jest dostępne w Twojej instalacji. Skontaktuj się z administratorem, aby uzyskać więcej informacji.", + "Threshold": "Próg", + "Tile": "Kafelki", + "Tile Gap X": "Odstęp kafelków X", + "Tile Gap Y": "Odstęp kafelków Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Znacznik czasu", + "Timestamp Failed": "Znakowanie czasem nie powiodło się", + "Tint": "Odcień", + "Title": "Tytuł", + "To actually fill or change the options, use our PDF Form Filler tool.": "Aby faktycznie wypełnić lub zmienić opcje, użyj naszego narzędzia Wypełnianie formularzy PDF.", + "Toggle": "Przełącz", + "Toggle style": "Przełącz styl", + "Toggle sync scroll": "Przełącz synchronizację przewijania", + "Tool Unavailable": "Narzędzie niedostępne", + "Tooltip / Help Text": "Podpowiedź / tekst pomocy", + "Top": "Góra", + "Top Center": "Góra, środek", + "Top Left": "Góra, lewo", + "Top Right": "Góra, prawo", + "Top edge in points": "Górna krawędź w punktach", + "Total Pages": "Łączna liczba stron", + "Transparent Background": "Przezroczyste tło", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Dla każdego obrazu porównuje JPEG 2000 z JPEG i zachowuje mniejszy wynik.", + "Trim margins from all pages": "Przytnij marginesy na wszystkich stronach", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Weryfikacja zaufania: podpisy zweryfikowane względem własnego certyfikatu: {{trustVerified}}/{{length}}", + "Trusted": "Zaufany", + "Trusted certificate loaded": "Wczytano zaufany certyfikat", + "Tsa Url": "Adres URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Wyłącza jakość, rozdzielczość i wszystkie inne stratne kroki przetwarzania obrazów.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "Adres URL musi zaczynać się od http:// lub https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Nie udało się odszyfrować PDF podanym hasłem.", + "Unable to repair any of the uploaded PDF files.": "Nie udało się naprawić żadnego z wgranych plików PDF.", + "Unembed standard fonts": "Usuń osadzenie czcionek standardowych", + "Unembed standard-font look-alikes": "Usuń osadzenie odpowiedników czcionek standardowych", + "Unexpected delimiter in content stream": "Nieoczekiwany ogranicznik w strumieniu treści", + "Unexpected reply from the engine.": "Nieoczekiwana odpowiedź silnika.", + "Uniform": "Jednolity", + "Unique Page Sizes": "Unikalne rozmiary stron", + "Unknown": "Nieznany", + "Unknown error": "Nieznany błąd", + "Unknown error occurred in worker.": "W workerze wystąpił nieznany błąd.", + "Unknown error occurred.": "Wystąpił nieznany błąd.", + "Unlock": "Odblokuj", + "Unlock All": "Odblokuj wszystkie", + "Unlock Remaining ({{remaining}})": "Odblokuj pozostałe ({{remaining}})", + "Unlocked": "Odblokowano", + "Unlocked {{unlocked}} of {{length}} files.": "Odblokowano {{unlocked}} z {{length}} plików.", + "Unlocking...": "Odblokowywanie...", + "Unresolved optional content reference": "Nierozwiązane odwołanie do treści opcjonalnej", + "Unsupported ECDSA curve in signer certificate": "Nieobsługiwana krzywa ECDSA w certyfikacie podpisującego", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Nieobsługiwany obraz. Użyj pliku PNG lub JPG dla znaku wodnego.", + "Unsupported digest OID {{digestOid}}": "Nieobsługiwany OID skrótu {{digestOid}}", + "Unsupported file type: .{{ext}}": "Nieobsługiwany typ pliku: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Nieobsługiwany OID algorytmu podpisu {{oid}}", + "Unterminated array or dictionary in content stream": "Niezakończona tablica lub słownik w strumieniu treści", + "Unterminated hex string in content stream": "Niezakończony ciąg szesnastkowy w strumieniu treści", + "Unterminated inline image in content stream": "Niezakończony obraz inline w strumieniu treści", + "Unterminated string in content stream": "Niezakończony ciąg znaków w strumieniu treści", + "Unverified: Unsupported Signature Algorithm": "Niezweryfikowany: nieobsługiwany algorytm podpisu", + "Updating metadata...": "Aktualizowanie metadanych...", + "Upload Certificate": "Wgraj certyfikat", + "Upload Comics": "Wgraj komiksy", + "Upload Documents": "Wgraj dokumenty", + "Upload EPUB Files": "Wgraj pliki EPUB", + "Upload Email Files": "Wgraj pliki wiadomości e-mail", + "Upload FB2 Files": "Wgraj pliki FB2", + "Upload Images": "Wgraj obrazy", + "Upload JSON Files": "Wgraj pliki JSON", + "Upload MOBI Files": "Wgraj pliki MOBI", + "Upload Markdown Files": "Wgraj pliki Markdown", + "Upload ODG Files": "Wgraj pliki ODG", + "Upload PDFs": "Wgraj pliki PDF", + "Upload PUB Files": "Wgraj pliki PUB", + "Upload Pages Files": "Wgraj pliki Pages", + "Upload Presentations": "Wgraj prezentacje", + "Upload SVG Files": "Wgraj pliki SVG", + "Upload Spreadsheets": "Wgraj arkusze kalkulacyjne", + "Upload Text Files": "Wgraj pliki tekstowe", + "Upload Visio Files": "Wgraj pliki Visio", + "Upload WPD Files": "Wgraj pliki WPD", + "Upload WPS Files": "Wgraj pliki WPS", + "Upload XML Files": "Wgraj pliki XML", + "Upload XPS Files": "Wgraj pliki XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Wgraj PDF i kliknij \"Generuj podgląd\", aby zobaczyć układ broszury", + "Upload images and convert to PDF": "Wgraj obrazy i skonwertuj je na PDF", + "Upload one or more PDF files": "Wgraj jeden lub kilka plików PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Wielkie litery A-Z, cyfry 0-9 oraz - . $ / + % SPACJA", + "Use same password for all files": "Użyj tego samego hasła dla wszystkich plików", + "User Password": "Hasło użytkownika", + "VSD to PDF": "VSD na PDF", + "Valid From": "Ważny od", + "Valid Signature": "Prawidłowy podpis", + "Valid Until": "Ważny do", + "Validating {{n}} of {{length}}: {{name}}": "Weryfikowanie {{n}} z {{length}}: {{name}}", + "Validating...": "Weryfikowanie...", + "Value": "Wartość", + "Value (e.g., Marketing)": "Wartość (np. Marketing)", + "Vertical": "Pionowo", + "Viewer not ready": "Przeglądarka nie jest gotowa", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Przeglądarka nie jest gotowa. Wgraj PDF i poczekaj, aż się wczyta.", + "Visibility": "Widoczność", + "Visio Files": "Pliki Visio", + "WPD to PDF": "WPD na PDF", + "WPS Files": "Pliki WPS", + "WPS to PDF": "WPS na PDF", + "Watermark": "Znak wodny", + "Watermark added successfully!": "Znak wodny został dodany!", + "Web Crypto API not available in this context": "Web Crypto API nie jest dostępne w tym kontekście", + "Web Crypto import/verify failed: {{error}}": "Import/weryfikacja Web Crypto nie powiodła się: {{error}}", + "WebP": "WebP", + "Whitelist": "Lista dozwolonych", + "Width ({{unit}})": "Szerokość ({{unit}})", + "Word": "Word", + "Word Documents": "Dokumenty Word", + "Word to PDF": "Word na PDF", + "WordPerfect Files": "Pliki WordPerfect", + "Worker crashed": "Worker uległ awarii", + "Worker error occurred. Check console for details.": "Wystąpił błąd workera. Szczegóły znajdziesz w konsoli.", + "Workflow completed": "Przepływ pracy zakończony", + "Wrong password": "Nieprawidłowe hasło", + "Wrong password for: {{join}}": "Nieprawidłowe hasło dla: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Nieprawidłowe hasło lub nie udało się odszyfrować \"{{name}}\".", + "X Position": "Pozycja X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Pliki XML", + "XML to PDF": "XML na PDF", + "XMP Metadata": "Metadane XMP", + "XPS Files": "Pliki XPS", + "XPS to PDF": "XPS na PDF", + "Y Position": "Pozycja Y", + "Year must be between 1900 and 2100": "Rok musi mieścić się w zakresie od 1900 do 2100", + "Yellow": "Żółty", + "Yellowish": "Żółtawy", + "You cannot delete the last page of the document.": "Nie można usunąć ostatniej strony dokumentu.", + "Your PDF has been cropped and the download has started.": "PDF został przycięty, a pobieranie się rozpoczęło.", + "Your PDF has been downloaded successfully.": "PDF został pobrany.", + "Your PDF has been posterized.": "PDF został poddany plakatowaniu.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Redakcje zostały zastosowane na stronach, ale ten plik jest zaszyfrowany, więc BentoPDF nie może dodatkowo usunąć kopii zredagowanego tekstu z jego właściwości, zakładek i załączników. Aby wykonać pełne czyszczenie, zredaguj niezaszyfrowaną kopię, a następnie dodaj hasło za pomocą narzędzia Chroń PDF. Pobrać mimo to?", + "Your workflow needs at least one input node and one output node to run.": "Przepływ pracy wymaga co najmniej jednego węzła wejściowego i jednego węzła wyjściowego, aby mógł działać.", + "ZIP archive created successfully!": "Archiwum ZIP zostało utworzone!", + "Zoom(%)": "Powiększenie (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "np. dd/mm/rrrr GG:MM:ss", + "form": "formularz", + "https://example.com": "https://example.com", + "signature found": "znaleziono podpis", + "signatures found": "znaleziono podpisy", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} węzeł", + "{{count}} nodes": "{{count}} węzłów", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 strona", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • stron: {{pageCount}}", + "{{length}} Files Need a Password": "Pliki wymagające hasła: {{length}}", + "{{length}} PDF file(s) selected": "Wybrano pliki PDF: {{length}}", + "{{length}} PDF files selected": "Wybrano pliki PDF: {{length}}", + "{{length}} attachment(s) extracted successfully!": "Wyodrębniono załączniki: {{length}}!", + "{{length}} file • {{totalPages}} total pages": "{{length}} plik • łącznie stron: {{totalPages}}", + "{{length}} file(s) attached successfully.": "Dołączono pliki: {{length}}.", + "{{length}} files • {{totalPages}} total pages": "Pliki: {{length}} • łącznie stron: {{totalPages}}", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Był chroniony hasłem, więc skompresowana kopia nie ma hasła. Użyj narzędzia Chroń PDF, aby dodać je ponownie.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, stron: {{totalPageCount}})", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "Plik {{name}} jest podpisany cyfrowo, więc pozostawiono go bez zmian. Kompresja uszkodziłaby podpis. Aby mimo to go skompresować, włącz Zastąp ochronę treści w ustawieniach niestandardowych. Jego podpisy zostaną usunięte.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} nie jest prawidłowym plikiem PDF, więc nie został dodany.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "Plik {{name}} jest chroniony hasłem. Wpisz jego hasło na karcie pliku, a następnie skompresuj ponownie.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (s. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Nie udało się wczytać liczby stron", + "{{size}} • Loading pages...": "{{size}} • Wczytywanie stron...", + "{{size}} • Loading...": "{{size}} • Wczytywanie...", + "{{size}} • {{getPageCount}} pages": "{{size}} • stron: {{getPageCount}}", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • stron: {{numPages}}", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • stron: {{pageCount}}", + "{{size}} • {{totalPages}} pages": "{{size}} • stron: {{totalPages}}", + "{{size}} • {{value}} pages": "{{size}} • stron: {{value}}", + "{{successCount}} PDF(s) decrypted successfully.": "Odszyfrowano pliki PDF: {{successCount}}.", + "{{successCount}} PDF(s) linearized successfully.": "Zlinearyzowano pliki PDF: {{successCount}}.", + "{{totalPages}} pages → {{numSheets}} output sheets": "Strony: {{totalPages}} → arkusze wyjściowe: {{numSheets}}", + "{{validCount}} valid": "Prawidłowe: {{validCount}}", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 strona", + "• {{label}}: {{count}} pages": "• {{label}}: stron: {{count}}" +} diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 03909f86..0ab68ba9 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Abrir menu principal", "language": "Idioma", "searchLanguage": "Buscar idioma…", - "noLanguagesFound": "Nenhum idioma encontrado" + "noLanguagesFound": "Nenhum idioma encontrado", + "breadcrumb": "Trilha de navegação" }, "donation": { "message": "Adora o BentoPDF? Ajude-nos a mantê-lo gratuito e de código aberto!", @@ -212,7 +213,7 @@ }, "browserBased": { "question": "Como o processamento no navegador me mantém seguro?", - "answer": "Ao rodar no seu dispositivo, eliminamos riscos de ataques a servidores ou vazamentos de dados de terceiros. Seus arquivos permanecem seus — sempre." + "answer": "Ao rodar no seu dispositivo, eliminamos riscos de ataques a servidores ou vazamentos de dados de terceiros. Seus arquivos permanecem seus, sempre." }, "analytics": { "question": "Vocês usam cookies ou rastreamento?", @@ -236,6 +237,10 @@ "aboutUs": "Sobre Nós", "faqLink": "FAQ", "contactUs": "Contato", + "tools": "Ferramentas", + "pdfConverter": "Conversor de PDF", + "pdfSecurity": "Segurança de PDF", + "mergeSplit": "Juntar e dividir PDF", "legal": "Jurídico", "termsAndConditions": "Termos e Condições", "privacyPolicy": "Política de Privacidade", diff --git a/public/locales/pt/tools.json b/public/locales/pt/tools.json index 41b287c2..4d958737 100644 --- a/public/locales/pt/tools.json +++ b/public/locales/pt/tools.json @@ -26,8 +26,23 @@ "mergePdf": { "name": "Mesclar PDF", "subtitle": "Combine vários PDFs em um único arquivo. Preserva os favoritos (bookmarks).", - "retainPageLabels": "Manter os rótulos de página originais de cada ficheiro", - "retainPageLabelsHint": "Desligado (padrão): o PDF mesclado usa numeração natural 1–N. Ligado: os rótulos de página originais de cada ficheiro são preservados (pode produzir rótulos duplicados)." + "retainPageLabels": "Manter os rótulos de página originais de cada arquivo", + "retainPageLabelsHint": "Desligado (padrão): o PDF mesclado usa numeração natural 1–N. Ligado: os rótulos de página originais de cada arquivo são preservados (pode produzir rótulos duplicados).", + "removeDuplicateFonts": "Remover fontes duplicadas", + "alert": { + "thumbnailError": "Falha ao renderizar as miniaturas das páginas", + "noSelection": "Nenhum arquivo ou página selecionado para mesclar.", + "mergeSuccess": "PDFs mesclados com sucesso!", + "mergeFailed": "Falha ao mesclar os PDFs.", + "mergeError": "Falha ao mesclar os PDFs. Verifique se todos os arquivos são válidos e não estão protegidos por senha.", + "workerError": "Ocorreu um erro inesperado no processo de mesclagem.", + "loadError": "Falha ao carregar um ou mais arquivos PDF" + }, + "loader": { + "renderingPreviews": "Renderizando pré-visualizações das páginas...", + "merging": "Mesclando PDFs...", + "loadingDocuments": "Carregando documentos PDF..." + } }, "splitPdf": { "name": "Dividir PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "Refazer (⇧⌘Z)", "tipFileDetails": "Detalhes do arquivo", "tipEditExistingContent": "Editar conteúdo existente", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "O que a ferramenta Editar afeta — restrinja o alcance em páginas cheias", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "O que a ferramenta Editar afeta: restrinja o alcance em páginas cheias", "tipClickThePageToAddATextBox": "Clique na página para adicionar uma caixa de texto", "tipSpellCheckLanguage": "Idioma do corretor ortográfico", "tipFindAndReplace": "Localizar e substituir", @@ -172,20 +187,20 @@ "subtitle": "Corte as margens de cada página do seu PDF." }, "extractPages": { - "name": "Extrair Páginas", + "name": "Extrair páginas", "subtitle": "Salve uma seleção de páginas como novos arquivos." }, "duplicateOrganize": { - "name": "Duplicar e Organizar", + "name": "Duplicar e organizar", "subtitle": "Duplique, reordene e exclua páginas.", "saveChanges": "Salvar alterações" }, "deletePages": { - "name": "Excluir Páginas", + "name": "Excluir páginas", "subtitle": "Remova páginas específicas do seu documento." }, "editBookmarks": { - "name": "Editar Favoritos", + "name": "Editar marcadores", "subtitle": "Adicione, edite, importe, exclua e extraia favoritos de PDF.", "autoExtractExisting": "Extrair automaticamente marcadores existentes", "importSectionTitle": "Ou importar marcadores", @@ -212,7 +227,7 @@ "workerErrorOccurred": "Ocorreu erro de worker. Verifique o console para detalhes." }, "pageNumbers": { - "name": "Números de Página", + "name": "Números de página", "subtitle": "Insira números de página no seu documento." }, "addPageLabels": { @@ -279,20 +294,20 @@ "subtitle": "Adicionar números Bates sequenciais em um ou mais arquivos PDF." }, "addWatermark": { - "name": "Adicionar Marca d'Água", + "name": "Adicionar marca d'água", "subtitle": "Carimbe texto ou uma imagem sobre as páginas do seu PDF.", "applyToAllPages": "Aplicar a todas as páginas" }, "headerFooter": { - "name": "Cabeçalho e Rodapé", + "name": "Cabeçalho e rodapé", "subtitle": "Adicione texto no topo e no final das páginas." }, "invertColors": { - "name": "Inverter Cores", + "name": "Inverter cores", "subtitle": "Crie uma versão em \"modo escuro\" do seu PDF." }, "scannerEffect": { - "name": "Efeito Scanner", + "name": "Efeito scanner", "subtitle": "Faça seu PDF parecer um documento digitalizado.", "scanSettings": "Configurações de Digitalização", "colorspace": "Espaço de Cor", @@ -309,7 +324,7 @@ "processButton": "Aplicar Efeito Scanner" }, "adjustColors": { - "name": "Ajustar Cores", + "name": "Ajustar cores", "subtitle": "Ajuste brilho, contraste, saturação e mais no seu PDF.", "colorSettings": "Configurações de Cor", "brightness": "Brilho", @@ -323,15 +338,15 @@ "processButton": "Aplicar Ajustes de Cor" }, "backgroundColor": { - "name": "Cor de Fundo", + "name": "Cor de fundo", "subtitle": "Altere a cor de fundo do seu PDF." }, "changeTextColor": { - "name": "Alterar Cor do Texto", + "name": "Alterar cor do texto", "subtitle": "Altere a cor do texto no seu PDF." }, "addStamps": { - "name": "Adicionar Carimbos", + "name": "Adicionar carimbos", "subtitle": "Adicione carimbos de imagem ao seu PDF usando a barra de ferramentas de anotação.", "usernameLabel": "Nome do Usuário no Carimbo", "usernamePlaceholder": "Digite seu nome (para os carimbos)", @@ -339,29 +354,29 @@ "saveButton": "Salvar PDF carimbado" }, "removeAnnotations": { - "name": "Remover Anotações", + "name": "Remover anotações", "subtitle": "Remova comentários, destaques e links." }, "pdfFormFiller": { - "name": "Preenchimento de Formulário", + "name": "Preenchimento de formulário PDF", "subtitle": "Preencha formulários diretamente no navegador. Também suporta formulários XFA.", "uploadHint": "Envie um PDF com campos de formulário. Preencha-os diretamente no visualizador abaixo, depois clique no botão para salvar e baixar o formulário preenchido. Também suporta formulários XFA.", "xfaNoteTitle": "Nota sobre formulários XFA:", "xfaNoteDescription": "XFA (XML Forms Architecture) é um formato legado suportado apenas por certos visualizadores de PDF como BentoPDF e Firefox. Se você abrir um PDF XFA em outro software e ver páginas em branco ou nenhum campo de formulário, significa que esse visualizador não suporta XFA. Para visualizar e preencher corretamente formulários XFA, use Firefox ou o preenchedor de formulários do BentoPDF." }, "createPdfForm": { - "name": "Criar Formulário PDF", + "name": "Criar formulário PDF", "subtitle": "Crie formulários PDF preenchíveis com campos de texto de arrastar e soltar.", "orSeparator": "OU", "createBlankPdf": "Criar PDF em branco" }, "removeBlankPages": { - "name": "Remover Páginas em Branco", + "name": "Remover páginas em branco", "subtitle": "Detecte e exclua automaticamente páginas em branco.", "sensitivityHint": "Maior = mais rigoroso, apenas páginas totalmente em branco. Menor = permite páginas com algum conteúdo." }, "imageToPdf": { - "name": "Imagem para PDF", + "name": "Imagens para PDF", "subtitle": "Converta JPG, PNG, WebP, BMP, TIFF, SVG, HEIC para PDF." }, "pngToPdf": { @@ -503,7 +518,8 @@ "noFile": "Sem arquivo", "noFileExplanation": "Por favor envie um arquivo PDF primeiro.", "conversionSuccess": "PDF convertido para TIFF com sucesso!", - "conversionError": "Falha ao converter PDF para TIFF. O arquivo pode estar corrompido." + "conversionError": "Falha ao converter PDF para TIFF. O arquivo pode estar corrompido.", + "conversionOutOfMemory": "O navegador ficou sem memória durante a conversão. Tente um DPI menor ou desmarque a opção de TIFF de várias páginas para converter uma página por vez." } }, "pdfToCbz": { @@ -537,7 +553,7 @@ } }, "pdfToGreyscale": { - "name": "PDF para Tons de Cinza", + "name": "PDF para tons de cinza", "subtitle": "Converta todas as cores para preto e branco." }, "pdfToJson": { @@ -559,7 +575,7 @@ } }, "ocrPdf": { - "name": "OCR para PDF", + "name": "OCR em PDF", "subtitle": "Torne um PDF pesquisável e copiável (reconhecimento de texto).", "languagesInDocument": "Idiomas no documento", "searchLanguagesPlaceholder": "Buscar idiomas...", @@ -613,10 +629,10 @@ "multiLanguageSupportDescription": "Selecione vários idiomas para documentos com conteúdo em idiomas mistos." }, "alternateMerge": { - "name": "Alternar e Misturar Páginas", + "name": "Alternar e misturar páginas", "subtitle": "Mescle PDFs alternando as páginas de cada arquivo. Preserva os favoritos.", - "retainPageLabels": "Manter os rótulos de página originais de cada ficheiro", - "retainPageLabelsHint": "Desligado (padrão): o PDF mesclado usa numeração natural 1–N. Ligado: os rótulos de página originais de cada ficheiro são preservados (pode produzir rótulos duplicados)." + "retainPageLabels": "Manter os rótulos de página originais de cada arquivo", + "retainPageLabelsHint": "Desligado (padrão): o PDF mesclado usa numeração natural 1–N. Ligado: os rótulos de página originais de cada arquivo são preservados (pode produzir rótulos duplicados)." }, "duplexCollate": { "name": "Intercalar digitalização frente e verso", @@ -664,27 +680,27 @@ "faqBackOrderAnswer": "Depende de como a pilha foi inserida na segunda passagem. Virar a pilha inteira produz versos em ordem invertida, que é a opção padrão. Se o seu scanner os devolveu na mesma ordem das frentes, escolha manter o bloco como está." }, "addAttachments": { - "name": "Adicionar Anexos", + "name": "Adicionar anexos", "subtitle": "Incorpore um ou mais arquivos dentro do seu PDF." }, "extractAttachments": { - "name": "Extrair Anexos", + "name": "Extrair anexos", "subtitle": "Extraia todos os arquivos incorporados de PDF(s) como um ZIP." }, "editAttachments": { - "name": "Editar Anexos", + "name": "Editar anexos", "subtitle": "Visualize ou remova anexos do seu PDF." }, "dividePages": { - "name": "Dividir Páginas", + "name": "Dividir páginas", "subtitle": "Divida as páginas horizontalmente ou verticalmente." }, "addBlankPage": { - "name": "Adicionar Página em Branco", + "name": "Adicionar página em branco", "subtitle": "Insira uma página vazia em qualquer lugar do seu PDF." }, "reversePages": { - "name": "Inverter Páginas", + "name": "Inverter ordem das páginas", "subtitle": "Inverta a ordem de todas as páginas do seu documento." }, "rotatePdf": { @@ -692,7 +708,7 @@ "subtitle": "Gire as páginas em incrementos de 90 graus." }, "rotateCustom": { - "name": "Rotacionar em Graus Customizáveis", + "name": "Girar em graus personalizados", "subtitle": "Rotaciona páginas em qualquer ângulo customizado." }, "nUpPdf": { @@ -700,15 +716,15 @@ "subtitle": "Organize várias páginas em uma única folha de impressão." }, "combineToSinglePage": { - "name": "Combinar em Página Única", + "name": "Combinar em página única", "subtitle": "Costure todas as páginas em um único fluxo contínuo." }, "viewMetadata": { - "name": "Ver Metadados", + "name": "Ver metadados", "subtitle": "Inspecione as propriedades ocultas do seu PDF." }, "editMetadata": { - "name": "Editar Metadados", + "name": "Editar metadados", "subtitle": "Altere o autor, título e outras propriedades." }, "pdfsToZip": { @@ -764,7 +780,7 @@ "subtitle": "Divida uma página grande em várias páginas menores." }, "fixPageSize": { - "name": "Ajustar Tamanho da Página", + "name": "Ajustar tamanho da página", "subtitle": "Padronize todas as páginas para um tamanho uniforme." }, "linearizePdf": { @@ -772,11 +788,11 @@ "subtitle": "Otimize o PDF para visualização rápida na web." }, "pageDimensions": { - "name": "Dimensões da Página", + "name": "Dimensões da página", "subtitle": "Analise o tamanho, orientação e unidades das páginas." }, "removeRestrictions": { - "name": "Remover Restrições", + "name": "Remover restrições", "subtitle": "Remova proteção por senha e restrições de segurança de arquivos assinados digitalmente." }, "repairPdf": { @@ -796,15 +812,15 @@ "subtitle": "Desbloqueie o PDF removendo a proteção por senha." }, "flattenPdf": { - "name": "Achatar PDF (Flatten)", + "name": "Achatar PDF", "subtitle": "Torne os campos de formulário e anotações não editáveis." }, "removeMetadata": { - "name": "Remover Metadados", + "name": "Remover metadados", "subtitle": "Limpe dados ocultos do seu PDF." }, "changePermissions": { - "name": "Alterar Permissões", + "name": "Alterar permissões", "subtitle": "Defina ou altere as permissões de usuário em um PDF." }, "odtToPdf": { @@ -864,7 +880,7 @@ "optTypographer": "Tipógrafo (aspas inteligentes, etc.)" }, "pdfBooklet": { - "name": "PDF Booklet", + "name": "Livreto PDF", "subtitle": "Reordena páginas para impressão de livreto frente e verso. Dobre e grampeie para criar um livreto.", "howItWorks": "Como funciona:", "step1": "Faça o upload de um arquivo PDF.", @@ -974,7 +990,7 @@ "subtitle": "Converte cada página de um arquivo PDF em um scalable vector graphic (SVG) para qualidade perfeita em qualquer tamanho." }, "extractTables": { - "name": "Extrair Tabelas PDF", + "name": "Extrair tabelas de PDF", "subtitle": "Extrai tabelas de arquivos PDF e exporta como CSV, JSON, ou Markdown." }, "pdfToCsv": { @@ -986,15 +1002,14 @@ "subtitle": "Extrai tabelas do PDF e converte em Excel (XLSX)." }, "pdfToText": { - "name": "PDF para Texto", + "name": "PDF para texto", "subtitle": "Extrai texto de arquivos PDF e salva como texto simples (.txt). Suporta múltiplos arquivos.", "noteLabel": "Nota:", - "noteText": "Esta ferramenta funciona APENAS com PDFs criados digitalmente. Para documentos digitalizados ou PDFs baseados em imagens, use nossa ferramenta OCR PDF.", - "convertButton": "Extrair Texto", - "note": "Esta ferrament funciona SOMENTE com PDFs criados digitalmente. Para documentos escaneados ou PDFs baseados em imagens, use nossa ferramenta OCR para PDF no lugar." + "noteText": "Esta ferramenta funciona APENAS com PDFs criados digitalmente. Para documentos digitalizados ou PDFs baseados em imagens, use nossa ferramenta OCR em PDF.", + "convertButton": "Extrair Texto" }, "digitalSignPdf": { - "name": "Assinatura Digital PDF", + "name": "Assinatura digital de PDF", "pageTitle": "Assinatura Digital PDF - Adicionar Assinatura Criptográfica | BentoPDF", "subtitle": "Adicione uma assinatura digital criptográfica ao seu PDF usando certificados X.509. Suporta formatos PKCS#12 (.pfx, .p12) e PEM. Sua chave privada nunca sai do seu navegador.", "certificateSection": "Certificado", @@ -1012,7 +1027,7 @@ "location": "Localização", "locationPlaceholder": "ex: Lisboa, Portugal", "contactInfo": "Contato", - "contactPlaceholder": "ex: email@exemplo.com", + "contactPlaceholder": "ex: email@example.com", "visibleSignature": "Assinatura visível", "visibleSignatureDescription": "Quando habilitado, uma caixa de assinatura visível aparece no PDF. Você pode carregar uma imagem/logo ou adicionar texto. Se nenhum for fornecido, o nome do assinante do certificado será exibido automaticamente.", "signatureImage": "Imagem/Logo de assinatura (opcional)", @@ -1080,12 +1095,12 @@ "internetRequiredDescription": "A assinatura pode precisar obter informações da cadeia de certificados do servidor do emissor para validar a assinatura." }, "validateSignaturePdf": { - "name": "Validar Assinatura PDF", + "name": "Validar assinatura de PDF", "pageTitle": "Validar Assinatura PDF - Verificar Assinaturas Digitais | BentoPDF", "subtitle": "Verifique assinaturas digitais em seus arquivos PDF. Verifique a validade do certificado e a integridade do documento." }, "timestampPdf": { - "name": "Carimbo de tempo PDF", + "name": "Carimbo de tempo em PDF", "pageTitle": "Carimbo de tempo PDF grátis online - RFC 3161 | BentoPDF", "subtitle": "Adicione um carimbo de tempo RFC 3161 ao seu PDF usando um servidor TSA confiável. Prova que o seu documento existia num momento específico. Sem necessidade de certificado.", "tsaSectionTitle": "Servidor de carimbo de tempo (TSA)", @@ -1094,13 +1109,13 @@ "successMessage": "PDF carimbado com sucesso! O carimbo de hora pode ser verificado em qualquer leitor de PDF." }, "emailToPdf": { - "name": "Email para PDF", + "name": "E-mail para PDF", "subtitle": "Converta arquivos de email (EML, MSG) para PDF. Suporta exportações do Outlook e formatos de email padrão.", "acceptedFormats": "Arquivos EML, MSG", "convertButton": "Converter para PDF" }, "fontToOutline": { - "name": "Fonte para Contorno", + "name": "Fonte para contorno", "subtitle": "Converta todas as fontes em contornos vetoriais para renderização consistente em todos os dispositivos." }, "deskewPdf": { @@ -1112,7 +1127,7 @@ "subtitle": "Converter arquivos PDF em documentos Word editáveis." }, "extractImages": { - "name": "Extrair Imagens", + "name": "Extrair imagens", "subtitle": "Extrair todas as imagens incorporadas dos seus arquivos PDF." }, "pdfToMarkdown": { @@ -1124,7 +1139,7 @@ "subtitle": "Extrair conteúdo PDF como JSON LlamaIndex para pipelines RAG/LLM." }, "pdfOcg": { - "name": "Camadas PDF (OCG)", + "name": "Camadas de PDF (OCG)", "subtitle": "Visualizar, alternar, adicionar e excluir camadas OCG no seu PDF." }, "pdfToPdfa": { @@ -1189,7 +1204,7 @@ "workerError": "Erro do worker: {{message}}", "alternateMergeWorkerError": "Erro do worker de mesclagem alternada: {{message}}", "noPdfFilesUploaded": "Nenhum arquivo PDF enviado no nó de entrada PDF", - "failedToLoadFile": "Falha ao carregar \"{{file}}\" — o arquivo pode estar corrompido", + "failedToLoadFile": "Falha ao carregar \"{{file}}\": o arquivo pode estar corrompido", "noImagesUploaded": "Nenhuma imagem enviada no nó de entrada de imagem", "noWordDocsUploaded": "Nenhum documento enviado no nó de entrada Word", "noExcelUploaded": "Nenhuma planilha enviada no nó de entrada Excel", @@ -1298,15 +1313,15 @@ "faqDifferenceAnswer": "A sobreposição coloca páginas acima do seu PDF base (como uma marca d'água). O fundo coloca páginas atrás do seu PDF base (como um cabeçalho ou fundo).", "faqSinglePageQuestion": "Posso usar um PDF de uma única página como sobreposição para todas as páginas?", "faqSinglePageAnswer": "Sim! Ative a opção \"Repetir\" e as páginas de sobreposição se repetirão em todas as páginas base. Uma marca d'água de uma página será aplicada a cada página.", - "faqPrivacyQuestion": "Os meus ficheiros são privados e seguros?", - "faqPrivacyAnswer": "Com certeza! Todo o processamento acontece no seu navegador. Os seus ficheiros nunca saem do seu dispositivo, garantindo total privacidade." + "faqPrivacyQuestion": "Meus arquivos são privados e seguros?", + "faqPrivacyAnswer": "Com certeza! Todo o processamento acontece no seu navegador. Seus arquivos nunca saem do seu dispositivo, garantindo total privacidade." }, "unlockPdf": { - "name": "Descriptografar PDF", + "name": "Desbloquear PDF", "subtitle": "Desbloqueie o PDF removendo a proteção por senha." }, "protectPdf": { - "name": "Criptografar PDF", + "name": "Proteger PDF", "subtitle": "Bloqueie seu PDF adicionando uma senha." } } diff --git a/public/locales/pt/ui.json b/public/locales/pt/ui.json new file mode 100644 index 00000000..3469350c --- /dev/null +++ b/public/locales/pt/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(corrigido)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ mais {{n}}...", + "- Error parsing XMP XML. Displaying raw. -": "- Erro ao analisar o XML XMP. Exibindo o conteúdo bruto. -", + "- No Info Dictionary data found -": "- Nenhum dado de Info Dictionary encontrado -", + "- No XMP metadata found -": "- Nenhum metadado XMP encontrado -", + "- No interactive form fields found -": "- Nenhum campo de formulário interativo encontrado -", + "- No parseable XMP properties found -": "- Nenhuma propriedade XMP analisável encontrada -", + "-- Select existing group --": "-- Selecione um grupo existente --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (Muito sensível)", + "0.5° (Default)": "0,5° (Padrão)", + "1.0° (Normal)": "1,0° (Normal)", + "100 (Fast)": "100 (Rápido)", + "150 (Default)": "150 (Padrão)", + "1x2 (Booklet)": "1x2 (Livreto)", + "2.0° (Less Sensitive)": "2,0° (Menos sensível)", + "200 (Better)": "200 (Melhor)", + "200 (Good)": "200 (Bom)", + "2x2 (4-up)": "2x2 (4-up)", + "2x4 (8-up)": "2x4 (8-up)", + "300 (Best Quality)": "300 (Melhor qualidade)", + "300 (Print)": "300 (Impressão)", + "4x4 (16-up)": "4x4 (16-up)", + "600 (High Quality)": "600 (Alta qualidade)", + "72 (Screen)": "72 (Tela)", + "90° Clockwise": "90° no sentido horário", + "90° Counter-clockwise": "90° no sentido anti-horário", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Já existe um campo chamado \"{{fieldName}}\". Renomeie este campo para usar um nome único antes de baixar.", + "A new version of BentoPDF is available. Reload to update?": "Há uma nova versão do BentoPDF disponível. Recarregar para atualizar?", + "A single PDF file": "Um único arquivo PDF", + "A template with this name already exists.": "Já existe um modelo com este nome.", + "ASCII characters (letters, numbers, symbols)": "Caracteres ASCII (letras, números, símbolos)", + "Action": "Ação", + "Add Blank Page": "Adicionar Página em Branco", + "Add Bookmark": "Adicionar favorito", + "Add Child Bookmark": "Adicionar favorito filho", + "Add Child Layer": "Adicionar camada filha", + "Add More Comics": "Adicionar mais quadrinhos", + "Add More Documents": "Adicionar mais documentos", + "Add More EPUB Files": "Adicionar mais arquivos EPUB", + "Add More Email Files": "Adicionar mais arquivos de e-mail", + "Add More FB2 Files": "Adicionar mais arquivos FB2", + "Add More Files": "Adicionar mais arquivos", + "Add More Images": "Adicionar mais imagens", + "Add More JSON Files": "Adicionar mais arquivos JSON", + "Add More MOBI Files": "Adicionar mais arquivos MOBI", + "Add More Markdown Files": "Adicionar mais arquivos Markdown", + "Add More ODG Files": "Adicionar mais arquivos ODG", + "Add More PUB Files": "Adicionar mais arquivos PUB", + "Add More Pages Files": "Adicionar mais arquivos Pages", + "Add More Presentations": "Adicionar mais apresentações", + "Add More SVG Files": "Adicionar mais arquivos SVG", + "Add More Spreadsheets": "Adicionar mais planilhas", + "Add More Text Files": "Adicionar mais arquivos de texto", + "Add More Visio Files": "Adicionar mais arquivos Visio", + "Add More WPD Files": "Adicionar mais arquivos WPD", + "Add More WPS Files": "Adicionar mais arquivos WPS", + "Add More XML Files": "Adicionar mais arquivos XML", + "Add More XPS Files": "Adicionar mais arquivos XPS", + "Add a new layer to get started!": "Adicione uma nova camada para começar!", + "Add a text box": "Adicionar uma caixa de texto", + "Add an RFC 3161 document timestamp": "Adicionar um carimbo de data/hora RFC 3161 ao documento", + "Add an image": "Adicionar uma imagem", + "Add at least one node to run the workflow.": "Adicione pelo menos um nó para executar o fluxo de trabalho.", + "Add child": "Adicionar filho", + "Add child layer": "Adicionar camada filha", + "Add header and footer text": "Adicionar texto de cabeçalho e rodapé", + "Add page numbers": "Adicionar números de página", + "Add searchable text layer via OCR": "Adicionar camada de texto pesquisável via OCR", + "Add text watermark": "Adicionar marca d'água de texto", + "Add/Edit/Extract Attachments": "Adicionar/Editar/Extrair Anexos", + "Added": "Adicionado", + "Added \"{{afterText}}\"": "\"{{afterText}}\" adicionado", + "Added image ({{width}}×{{height}})": "Imagem adicionada ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} página em branco adicionada com sucesso!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} páginas em branco adicionadas com sucesso!", + "Adding header & footer...": "Adicionando cabeçalho e rodapé...", + "Adding page numbers...": "Adicionando números de página...", + "Adding watermark...": "Adicionando marca d'água...", + "Adding {{insertCount}} blank page...": "Adicionando {{insertCount}} página em branco...", + "Adding {{insertCount}} blank pages...": "Adicionando {{insertCount}} páginas em branco...", + "Adding {{name}} ({{n}}/{{length}})...": "Adicionando {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Ajustar Cores", + "Adjust brightness, contrast, and colors": "Ajuste o brilho, o contraste e as cores", + "Advanced": "Avançado", + "Advanced Feature Required": "Recurso avançado necessário", + "Advanced Settings": "Configurações avançadas", + "After Page": "Após a página", + "After Page...": "Após a página...", + "Align Objects": "Alinhar objetos", + "Alignment": "Alinhamento", + "All": "Tudo", + "All files repaired successfully!": "Todos os arquivos foram reparados com sucesso!", + "Alternate Merge": "Mesclagem alternada", + "Alternating and mixing pages...": "Alternando e misturando páginas...", + "Always resample to that resolution": "Sempre reamostrar para essa resolução", + "An error occurred during compression. Error: {{error}}": "Ocorreu um erro durante a compressão. Erro: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Ocorreu um erro durante a conversão. Erro: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Ocorreu um erro durante a conversão. Erro: {{message}}", + "An error occurred during cropping.": "Ocorreu um erro durante o corte.", + "An error occurred during extraction. Error: {{error}}": "Ocorreu um erro durante a extração. Erro: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Ocorreu um erro durante a rasterização. Erro: {{error}}", + "An error occurred during sanitization: {{msg}}": "Ocorreu um erro durante a higienização: {{msg}}", + "An error occurred while combining pages.": "Ocorreu um erro ao combinar as páginas.", + "An error occurred while creating the N-Up PDF.": "Ocorreu um erro ao criar o PDF N-Up.", + "An error occurred while creating the booklet.": "Ocorreu um erro ao criar o livreto.", + "An error occurred while dividing the PDF.": "Ocorreu um erro ao dividir o PDF.", + "An error occurred while mixing the PDFs.": "Ocorreu um erro ao misturar os PDFs.", + "An error occurred while standardizing pages.": "Ocorreu um erro ao padronizar as páginas.", + "An error occurred while trying to remove metadata.": "Ocorreu um erro ao tentar remover os metadados.", + "An error occurred: {{error}}": "Ocorreu um erro: {{error}}", + "An error occurred: {{error}}.": "Ocorreu um erro: {{error}}.", + "An owner password is required when setting permissions": "É necessária uma senha de proprietário para definir permissões", + "An unexpected error occurred during the repair process.": "Ocorreu um erro inesperado durante o processo de reparo.", + "An unexpected error occurred.": "Ocorreu um erro inesperado.", + "Analyzing data structure...": "Analisando a estrutura dos dados...", + "Analyzing full PDF metadata...": "Analisando os metadados completos do PDF...", + "Analyzing signatures...": "Analisando assinaturas...", + "Angle": "Ângulo", + "Annotations removed successfully!": "Anotações removidas com sucesso!", + "Any text, URL, or data": "Qualquer texto, URL ou dado", + "Application": "Aplicativo", + "Apply a digital signature to PDF": "Aplicar uma assinatura digital ao PDF", + "Apply and download": "Aplicar e baixar", + "Apply redactions?": "Aplicar as edições de tarja?", + "Apply scanner simulation effect": "Aplicar efeito de simulação de scanner", + "Applying Bates numbers...": "Aplicando numeração Bates...", + "Applying color adjustments...": "Aplicando ajustes de cor...", + "Applying crop...": "Aplicando corte...", + "Applying redactions...": "Aplicando tarjas...", + "Applying rotations...": "Aplicando rotações...", + "Applying scanner effect...": "Aplicando efeito de scanner...", + "Applying timestamp...": "Aplicando carimbo de data/hora...", + "Applying {{replace}}...": "Aplicando {{replace}}...", + "Archive contains an oversized image entry.": "O arquivo compactado contém uma imagem grande demais.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "O arquivo compactado tem imagens demais (máx. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "O arquivo compactado fica grande demais ao ser descompactado.", + "Are you sure you want to reset? All your work will be lost.": "Tem certeza de que deseja redefinir? Todo o seu trabalho será perdido.", + "Area (Coordinates)": "Área (Coordenadas)", + "Area ({{unit}}²)": "Área ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman e Courier New são mapeadas para as equivalentes integradas. Aplicado apenas quando seguro.", + "Arrange multiple pages per sheet": "Organize várias páginas por folha", + "Arrange pages for booklet printing": "Organize as páginas para impressão em livreto", + "Aspect Ratio": "Proporção", + "At least one PDF document is required for export.": "É necessário pelo menos um documento PDF para exportar.", + "At least two valid PDFs are required.": "São necessários pelo menos dois PDFs válidos.", + "Attaching files to PDF...": "Anexando arquivos ao PDF...", + "Attachments updated successfully!": "Anexos atualizados com sucesso!", + "Author": "Autor", + "Auto (Keep Original)": "Auto (manter original)", + "Back": "Verso", + "Back to Home": "Voltar ao início", + "Background Color": "Cor de Fundo", + "Background color changed successfully!": "Cor de fundo alterada com sucesso!", + "Barcode": "Código de barras", + "Barcode Format": "Formato do código de barras", + "Barcode Value": "Valor do código de barras", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Numeração Bates aplicada com sucesso! ({{batesStart}} a {{n}})", + "Beginning": "Início", + "Binarize": "Binarizar", + "Blank Position": "Posição da página em branco", + "Blue": "Azul", + "Blur": "Desfoque", + "Bold": "Negrito", + "Bold & Italic": "Negrito e itálico", + "Booklet": "Livreto", + "Booklet created with {{numSheets}} sheets!": "Livreto criado com {{numSheets}} folhas!", + "Bookmarks imported from JSON!": "Favoritos importados do JSON!", + "Bookmarks page": "Página de favoritos", + "Border": "Borda", + "Border Color": "Cor da borda", + "Bottom": "Inferior", + "Bottom Center": "Inferior central", + "Bottom Left": "Inferior esquerdo", + "Bottom Right": "Inferior direito", + "Bottom edge in points": "Margem inferior em pontos", + "Brightness": "Brilho", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli e a rasterização foram ignorados para manter o PDF/A.", + "Brotli compression (PDF 2.0)": "Compressão Brotli (PDF 2.0)", + "Browser Note:": "Observação sobre o navegador:", + "Building new PDF...": "Criando novo PDF...", + "Building page pairing model...": "Criando o modelo de pareamento de páginas...", + "Button": "Botão", + "ByteRange does not start at the beginning of the file": "O ByteRange não começa no início do arquivo", + "ByteRange out of bounds": "ByteRange fora dos limites", + "CBZ to PDF": "CBZ para PDF", + "CSV Loaded": "CSV carregado", + "CSV file is empty": "O arquivo CSV está vazio", + "Cancel": "Cancelar", + "Cannot Delete": "Não é possível excluir", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Não foi possível acessar os controles do visualizador. Use o botão Baixar na barra de ferramentas do visualizador de PDF acima.", + "Cannot delete all pages": "Não é possível excluir todas as páginas", + "Cannot delete all pages.": "Não é possível excluir todas as páginas.", + "Canvas context failed": "Falha no contexto do canvas", + "Canvas context unavailable": "Contexto do canvas indisponível", + "Canvas toBlob conversion failed.": "Falha na conversão do canvas toBlob.", + "Canvas toBlob failed": "Falha no canvas toBlob", + "Center": "Centro", + "Certificate (.pfx, .p12, .pem)": "Certificado (.pfx, .p12, .pem)", + "Certificate Expired": "Certificado expirado", + "Certificate Password": "Senha do certificado", + "Certificate unlocked": "Certificado desbloqueado", + "Change Certificate": "Alterar certificado", + "Change background color": "Alterar cor de fundo", + "Changing background color...": "Alterando a cor de fundo...", + "Changing text color...": "Alterando a cor do texto...", + "Character": "Caractere", + "Checked State": "Estado marcado", + "Choose a valid page range.": "Escolha um intervalo de páginas válido.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Escolha um dos idiomas incluídos ou recompile o pacote isolado (air-gapped) com o idioma que falta adicionado a --ocr-languages.", + "Cleanup": "Limpeza", + "Click on PDF to Pick Location": "Clique no PDF para escolher o local", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Clique no botão acima e depois clique no PDF onde você quer que o favorito leve", + "Click to Upload Image": "Clique para enviar imagem", + "Clicking this field in the PDF will open a file picker to upload an image.": "Clicar neste campo no PDF abrirá um seletor de arquivos para enviar uma imagem.", + "Clip invisible parts of images": "Recortar partes invisíveis das imagens", + "Close": "Fechar", + "Close (Esc)": "Fechar (Esc)", + "Close panel": "Fechar painel", + "Closes tab": "Fecha a aba", + "Closes window": "Fecha a janela", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (Favoritos e Metadados)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "O CoherentPDF não está configurado. Configure-o em Configurações do WASM.", + "CoherentPDF produced an empty decrypted file.": "O CoherentPDF gerou um arquivo descriptografado vazio.", + "CoherentPDF: not configured.": "CoherentPDF: não configurado.", + "Color": "Cor", + "Color adjustments applied successfully!": "Ajustes de cor aplicados com sucesso!", + "Colors inverted successfully!": "Cores invertidas com sucesso!", + "Cols": "Colunas", + "Combine multiple PDFs into one": "Combine vários PDFs em um só", + "Combine to Single Page": "Combinar em Página Única", + "Combining pages...": "Combinando páginas...", + "Comic Archives": "Arquivos de quadrinhos", + "Comments and markup become part of the page. Form fields and links keep working.": "Comentários e marcações passam a fazer parte da página. Campos de formulário e links continuam funcionando.", + "Complete": "Concluído", + "Complete!": "Concluído!", + "Compress": "Comprimir", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF(s) comprimido(s). O tamanho total foi reduzido de {{totalOriginalSize}} para {{totalCompressedSize}} (economia de {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF(s) comprimido(s). Tamanho total: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Comprimindo vários PDFs...", + "Compressing to {{size}}...": "Comprimindo para {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Comprimindo {{n}}/{{length}}: {{name}}...", + "Compressing...": "Comprimindo...", + "Compression Complete": "Compressão concluída", + "Compression Finished": "Compressão finalizada", + "Compression Level": "Nível de compressão", + "Configure": "Configurar", + "Confirm": "Confirmar", + "Confirm Action": "Confirmar ação", + "Conformance": "Conformidade", + "Connected": "Conectado", + "Contact Info": "Informações de contato", + "Content": "Conteúdo", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "O hash do conteúdo não corresponde ao atributo messageDigest: o PDF foi modificado após a assinatura", + "Contrast": "Contraste", + "Conversion Complete": "Conversão concluída", + "Conversion Error": "Erro de conversão", + "Conversion engine ready!": "Mecanismo de conversão pronto!", + "Conversion failed: could not create PDF/A definition": "Falha na conversão: não foi possível criar a definição de PDF/A", + "Convert Apple Pages documents to PDF": "Converta documentos do Apple Pages em PDF", + "Convert EPUB ebooks to PDF": "Converta e-books EPUB em PDF", + "Convert Excel spreadsheets to PDF": "Converta planilhas do Excel em PDF", + "Convert FB2 e-books to PDF": "Converta e-books FB2 em PDF", + "Convert JSON files to PDF": "Converta arquivos JSON em PDF", + "Convert MOBI e-books to PDF": "Converta e-books MOBI em PDF", + "Convert Markdown files to PDF": "Converta arquivos Markdown em PDF", + "Convert Microsoft Publisher to PDF": "Converta documentos do Microsoft Publisher em PDF", + "Convert OpenDocument Graphics to PDF": "Converta OpenDocument Graphics em PDF", + "Convert PDF pages to SVG": "Converta páginas de PDF em SVG", + "Convert PDF pages to images (ZIP)": "Converta páginas de PDF em imagens (ZIP)", + "Convert PDF tables to CSV": "Converta tabelas de PDF em CSV", + "Convert PDF tables to Excel": "Converta tabelas de PDF em Excel", + "Convert PDF to Markdown text": "Converta PDF em texto Markdown", + "Convert PDF to PDF/A for archiving": "Converta PDF em PDF/A para arquivamento", + "Convert PDF to Word document": "Converta PDF em documento Word", + "Convert PowerPoint presentations to PDF": "Converta apresentações do PowerPoint em PDF", + "Convert SVG files to PDF": "Converta arquivos SVG em PDF", + "Convert To Grayscale": "Converter para tons de cinza", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Converta diagramas do Visio (VSD/VSDX) em PDF", + "Convert WPS Office documents to PDF": "Converta documentos do WPS Office em PDF", + "Convert Word documents to PDF": "Converta documentos do Word em PDF", + "Convert WordPerfect documents to PDF": "Converta documentos do WordPerfect em PDF", + "Convert XML documents to PDF": "Converta documentos XML em PDF", + "Convert XPS/OXPS documents to PDF": "Converta documentos XPS/OXPS em PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Converta arquivos de quadrinhos (CBZ/CBR) em PDF", + "Convert email files (.eml, .msg) to PDF": "Converta arquivos de e-mail (.eml, .msg) em PDF", + "Convert fonts to vector outlines": "Converta fontes em contornos vetoriais", + "Convert plain text to PDF": "Converta texto simples em PDF", + "Convert to grayscale": "Converter para tons de cinza", + "Convert to greyscale": "Converter para tons de cinza", + "Convert to image-based PDF": "Converter para PDF baseado em imagem", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} arquivos ({{totalPages}} páginas) convertidos para SVG!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} páginas convertidas para SVG!", + "Converter not initialized": "Conversor não inicializado", + "Converting BMP to PDF...": "Convertendo BMP para PDF...", + "Converting HEIC to PDF...": "Convertendo HEIC para PDF...", + "Converting TIFF to PDF...": "Convertendo TIFF para PDF...", + "Converting emails...": "Convertendo e-mails...", + "Converting files...": "Convertendo arquivos...", + "Converting fonts to outlines...": "Convertendo fontes em contornos...", + "Converting images to PDF...": "Convertendo imagens para PDF...", + "Converting multiple PDFs to PDF/A...": "Convertendo vários PDFs para PDF/A...", + "Converting multiple RTF files to PDF...": "Convertendo vários arquivos RTF para PDF...", + "Converting multiple files...": "Convertendo vários arquivos...", + "Converting page {{n}} of {{pageCount}}...": "Convertendo página {{n}} de {{pageCount}}...", + "Converting to Markdown...": "Convertendo para Markdown...", + "Converting to SVG...": "Convertendo para SVG...", + "Converting to greyscale...": "Convertendo para tons de cinza...", + "Converting to {{level}}...": "Convertendo para {{level}}...", + "Converting {{name}}...": "Convertendo {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Convertendo {{n}}/{{length}}: {{name}}...", + "Converting...": "Convertendo...", + "Copied": "Copiado", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Não foi possível acessar o exportador de PDF com carimbos. Use o botão Exportar → PDF na barra de ferramentas do visualizador como alternativa.", + "Could not add blank page.": "Não foi possível adicionar a página em branco.", + "Could not add blank pages.": "Não foi possível adicionar as páginas em branco.", + "Could not add header or footer.": "Não foi possível adicionar o cabeçalho ou rodapé.", + "Could not add page numbers.": "Não foi possível adicionar os números de página.", + "Could not add the watermark.": "Não foi possível adicionar a marca d'água.", + "Could not apply rotations.": "Não foi possível aplicar as rotações.", + "Could not change text color.": "Não foi possível alterar a cor do texto.", + "Could not change the background color.": "Não foi possível alterar a cor de fundo.", + "Could not create ZIP archive.": "Não foi possível criar o arquivo ZIP.", + "Could not create canvas context.": "Não foi possível criar o contexto do canvas.", + "Could not create comparison canvas context.": "Não foi possível criar o contexto do canvas de comparação.", + "Could not create offscreen comparison canvas.": "Não foi possível criar o canvas de comparação fora da tela.", + "Could not create visual diff context.": "Não foi possível criar o contexto da diferença visual.", + "Could not create visual diff overlay context.": "Não foi possível criar o contexto da sobreposição da diferença visual.", + "Could not detect blank pages.": "Não foi possível detectar páginas em branco.", + "Could not display the page.": "Não foi possível exibir a página.", + "Could not export comparison PDF.": "Não foi possível exportar o PDF de comparação.", + "Could not export the signed PDF. Please try again.": "Não foi possível exportar o PDF assinado. Tente novamente.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Não foi possível exportar o PDF com carimbos. Use o botão Exportar → PDF na barra de ferramentas do visualizador como alternativa.", + "Could not extract signer public key": "Não foi possível extrair a chave pública do signatário", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Não foi possível encontrar {{testFile}} na URL especificada (HTTP {{status}}). Verifique se o arquivo existe.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Não foi possível analisar o PDF por completo. Ele pode estar corrompido ou ter uma estrutura incomum.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Não foi possível gerar uma prévia. O arquivo pode estar corrompido ou conter recursos não compatíveis. Erro: {{message}}", + "Could not get canvas context": "Não foi possível obter o contexto do canvas", + "Could not invert PDF colors.": "Não foi possível inverter as cores do PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Não foi possível carregar o PDF. Ele pode estar corrompido ou protegido por senha.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Não foi possível carregar o PDF. O arquivo pode ser inválido, estar corrompido ou protegido por senha.", + "Could not load the PDF engine. Please refresh the page and try again.": "Não foi possível carregar o mecanismo de PDF. Atualize a página e tente novamente.", + "Could not parse signer info": "Não foi possível analisar as informações do signatário", + "Could not posterize the PDF.": "Não foi possível posterizar o PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Não foi possível processar \"{{name}}\". O arquivo pode estar corrompido.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Não foi possível reduzir mais o tamanho do arquivo. Original: {{originalSize}}, novo: {{compressedSize}}.", + "Could not remove annotations.": "Não foi possível remover as anotações.", + "Could not remove blank pages.": "Não foi possível remover as páginas em branco.", + "Could not remove leftover data from the PDF.": "Não foi possível remover os dados residuais do PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Não foi possível remover o texto tarjado dos dados do documento, por isso o arquivo não foi baixado.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Não foi possível inverter as páginas do PDF. Verifique se os seus arquivos são PDFs válidos.", + "Could not update metadata. Please check that date formats are correct.": "Não foi possível atualizar os metadados. Verifique se os formatos de data estão corretos.", + "Count": "Contagem", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Criado em", + "Creating Booklet...": "Criando livreto...", + "Creating Excel file...": "Criando arquivo Excel...", + "Creating N-Up PDF...": "Criando PDF N-Up...", + "Creating PDF from JPGs...": "Criando PDF a partir de JPGs...", + "Creating PDF from SVG files...": "Criando PDF a partir de arquivos SVG...", + "Creating PDF...": "Criando PDF...", + "Creating ZIP archive...": "Criando arquivo ZIP...", + "Creating ZIP file...": "Criando arquivo ZIP...", + "Creating ZIP...": "Criando ZIP...", + "Creating table...": "Criando tabela...", + "Creator": "Criador", + "Crop": "Cortar", + "Crop complete! Your download has started.": "Corte concluído! Seu download foi iniciado.", + "Cryptographic verification failed": "Falha na verificação criptográfica", + "Custom": "Personalizado", + "Custom Format": "Formato personalizado", + "Custom Height": "Altura personalizada", + "Custom Units": "Unidades personalizadas", + "Custom Width": "Largura personalizada", + "Custom Zoom": "Zoom personalizado", + "Custom...": "Personalizado...", + "DataMatrix": "DataMatrix", + "Date Format": "Formato de data", + "Decrease size": "Diminuir tamanho", + "Decrypt": "Descriptografar", + "Decrypting PDF...": "Descriptografando PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Descriptografando {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Descriptografando {{n}} de {{length}}: {{name}}", + "Decrypting...": "Descriptografando...", + "Decryption Failed": "Falha na descriptografia", + "Delete": "Excluir", + "Delete \"{{title}}\"?": "Excluir \"{{title}}\"?", + "Delete Field": "Excluir campo", + "Delete Page": "Excluir página", + "Delete Pages": "Excluir páginas", + "Delete all {{length}} bookmark(s) ? ": "Excluir todos os {{length}} favoritos? ", + "Delete layer": "Excluir camada", + "Delete {{size}} bookmark(s) ? ": "Excluir {{size}} favorito(s)? ", + "Deleted": "Excluído", + "Deleted {{size}} page(s) successfully!": "{{size}} página(s) excluída(s) com sucesso!", + "Deleting pages...": "Excluindo páginas...", + "Description": "Descrição", + "Description for screen readers": "Descrição para leitores de tela", + "Deselect All": "Desmarcar tudo", + "Deskew": "Endireitar", + "Deskew PDF": "Endireitar PDF", + "Deskewed {{length}} file(s). {{value}}": "{{length}} arquivo(s) endireitado(s). {{value}}", + "Deskewing {{name}}...": "Endireitando {{name}}...", + "Destination": "Destino", + "Detecting blank pages...": "Detectando páginas em branco...", + "Digest Algorithm:": "Algoritmo de resumo (digest):", + "Digital Sign": "Assinar digitalmente", + "Direction": "Direção", + "Divide Pages": "Dividir páginas", + "Divide into boxes (0 to disable)": "Dividir em caixas (0 para desativar)", + "Document Properties": "Propriedades do documento", + "Document Type": "Tipo de documento", + "Document properties": "Propriedades do documento", + "Document-level attachment": "Anexo no nível do documento", + "Done: back to tools": "Pronto, voltar às ferramentas", + "Download": "Baixar", + "Download Edited PDF": "Baixar PDF editado", + "Download anyway": "Baixar mesmo assim", + "Download as PDF or ZIP automatically": "Baixar automaticamente como PDF ou ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} arquivos PDF baixados em um arquivo ZIP.", + "Downloads started for all files.": "Downloads iniciados para todos os arquivos.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Remove a marcação (tagging), da qual os leitores de tela dependem.", + "Duplicate Field Name": "Nome de campo duplicado", + "Duplicate Field Names": "Nomes de campo duplicados", + "Duplicate Page": "Duplicar página", + "Duplicate Page Numbers": "Números de página duplicados", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "A assinatura ECDSA não confere com a chave pública do signatário", + "EPUB Files": "Arquivos EPUB", + "EPUB to PDF": "EPUB para PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ para PDF", + "Edit": "Editar", + "Edit All": "Editar tudo", + "Edit Bookmark": "Editar favorito", + "Edit Bookmarks": "Editar Favoritos", + "Edit Images": "Editar imagens", + "Edit Metadata": "Editar Metadados", + "Edit PDF metadata": "Editar metadados do PDF", + "Edit Scope": "Escopo da edição", + "Edit Shapes": "Editar formas", + "Edit Text": "Editar texto", + "Edit tool": "Ferramenta de edição", + "Edit {{scopes}}": "Editar {{scopes}}", + "Email Files": "Arquivos de e-mail", + "Email to PDF": "E-mail para PDF", + "Embedding files into PDF...": "Incorporando arquivos ao PDF...", + "Empty signature bytes": "Bytes da assinatura vazios", + "Encrypt": "Criptografar", + "Encrypt PDF with password": "Criptografar PDF com senha", + "Encrypted file": "Arquivo criptografado", + "Encrypting PDF with 256-bit AES...": "Criptografando PDF com AES de 256 bits...", + "Encryption Failed": "Falha na criptografia", + "Encryption resulted in an empty file.": "A criptografia resultou em um arquivo vazio.", + "End": "Fim", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Digite 0 para inserir no início ou {{pageCount}} para inserir no final.", + "Enter bookmark title": "Digite o título do favorito", + "Enter name for child layer under \"{{Layer}}\":": "Digite o nome da camada filha em \"{{Layer}}\":", + "Enter password": "Digite a senha", + "Enter password...": "Digite a senha...", + "Enter passwords for each encrypted file": "Digite as senhas de cada arquivo criptografado", + "Error": "Erro", + "Error during execution": "Erro durante a execução", + "Error generating PDF: {{error}}": "Erro ao gerar o PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Erro ao carregar o arquivo PDF. Tente novamente com um PDF válido.", + "Error reading files: {{error}}": "Erro ao ler os arquivos: {{error}}", + "Error saving PDF. Check console for details.": "Erro ao salvar o PDF. Verifique o console para mais detalhes.", + "Error: {{error}}": "Erro: {{error}}", + "Exactly 11 or 12 digits": "Exatamente 11 ou 12 dígitos", + "Exactly 12 or 13 digits": "Exatamente 12 ou 13 dígitos", + "Example of current format:": "Exemplo do formato atual:", + "Excel to PDF": "Excel para PDF", + "Existing Radio Groups": "Grupos de opção existentes", + "Export Error": "Erro de exportação", + "Export Value": "Valor de exportação", + "Export failed": "Falha na exportação", + "External processing module needed": "Módulo de processamento externo necessário", + "Extract Images": "Extrair Imagens", + "Extract Pages": "Extrair Páginas", + "Extract Tables": "Extrair Tabelas", + "Extract a range of pages": "Extraia um intervalo de páginas", + "Extract all images from PDF": "Extraia todas as imagens do PDF", + "Extract pages as separate PDFs": "Extraia páginas como PDFs separados", + "Extract text from PDF": "Extraia texto do PDF", + "Extracted 1 table successfully!": "1 tabela extraída com sucesso!", + "Extracted text from {{length}} PDF files!": "Texto extraído de {{length}} arquivos PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF(s) extraído(s), {{failed}} com falha.", + "Extracted {{length}} page(s) successfully!": "{{length}} página(s) extraída(s) com sucesso!", + "Extracted {{length}} table(s) to Excel!": "{{length}} tabela(s) extraída(s) para o Excel!", + "Extracted {{length}} tables successfully!": "{{length}} tabelas extraídas com sucesso!", + "Extracting attachments from {{length}} file(s)...": "Extraindo anexos de {{length}} arquivo(s)...", + "Extracting images from {{name}}...": "Extraindo imagens de {{name}}...", + "Extracting pages...": "Extraindo páginas...", + "Extracting tables...": "Extraindo tabelas...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Extraindo texto do arquivo {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Extraindo texto de vários arquivos...", + "Extracting text from {{name}}...": "Extraindo texto de {{name}}...", + "Extracting text...": "Extraindo texto...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Extraindo {{name}} para IA ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Extraindo {{name}} para IA...", + "Extracting...": "Extraindo...", + "Extraction Complete": "Extração concluída", + "Extraction Error": "Erro de extração", + "Extraction Partial": "Extração parcial", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extração concluída! {{length}} anexo(s) no arquivo ZIP ({{totalSize}}). Download iniciado.", + "FB2 Files": "Arquivos FB2", + "FB2 to PDF": "FB2 para PDF", + "Failed": "Falhou", + "Failed to acquire 2D canvas context": "Falha ao obter o contexto 2D do canvas", + "Failed to add child layer": "Falha ao adicionar a camada filha", + "Failed to apply Bates numbers.": "Falha ao aplicar a numeração Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "Falha ao aplicar os ajustes de cor. O arquivo pode estar corrompido.", + "Failed to apply redactions.": "Falha ao aplicar as tarjas.", + "Failed to apply scanner effect. The file might be corrupted.": "Falha ao aplicar o efeito de scanner. O arquivo pode estar corrompido.", + "Failed to attach files: {{error}}": "Falha ao anexar arquivos: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Falha ao converter BMP para PDF. Um dos arquivos pode ser inválido.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Falha ao converter HEIC para PDF. Um dos arquivos pode ser inválido.", + "Failed to convert PDF to CSV. {{message}}": "Falha ao converter PDF para CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Falha ao converter PDF para Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Falha ao converter PDF para SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Falha ao converter o PDF para tons de cinza. O arquivo pode estar corrompido.", + "Failed to convert PDF. It may be image-based or corrupted.": "Falha ao converter o PDF. Ele pode ser baseado em imagem ou estar corrompido.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Falha ao converter TIFF para PDF. Um dos arquivos pode ser inválido.", + "Failed to convert images to PDF.": "Falha ao converter imagens para PDF.", + "Failed to convert text to PDF. {{error}}": "Falha ao converter texto para PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Falha ao converter {{filename}} para PNG", + "Failed to copy metadata to clipboard.": "Falha ao copiar os metadados para a área de transferência.", + "Failed to create PDF.": "Falha ao criar o PDF.", + "Failed to create PNG blob": "Falha ao criar o blob PNG", + "Failed to create canvas context": "Falha ao criar o contexto do canvas", + "Failed to create split PDFs.": "Falha ao criar os PDFs divididos.", + "Failed to decode image: {{name}}": "Falha ao decodificar a imagem: {{name}}", + "Failed to decrypt private key": "Falha ao descriptografar a chave privada", + "Failed to decrypt. Try the Decrypt tool instead.": "Falha ao descriptografar. Tente usar a ferramenta Descriptografar.", + "Failed to delete layer": "Falha ao excluir a camada", + "Failed to delete pages.": "Falha ao excluir as páginas.", + "Failed to deskew PDF: {{error}}": "Falha ao endireitar o PDF: {{error}}", + "Failed to download the edited PDF.": "Falha ao baixar o PDF editado.", + "Failed to edit attachments.": "Falha ao editar os anexos.", + "Failed to extract certificate from PFX file": "Falha ao extrair o certificado do arquivo PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Falha ao extrair as páginas (código de saída do qpdf {{exitCode}}).", + "Failed to extract pages.": "Falha ao extrair as páginas.", + "Failed to extract tables. {{message}}": "Falha ao extrair as tabelas. {{message}}", + "Failed to extract text from PDF.": "Falha ao extrair o texto do PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Falha ao buscar o perfil ICC em {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Falha ao buscar o arquivo de fonte: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Falha ao buscar gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Falha ao buscar {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Falha ao obter o contexto 2D da página {{pageNumber}}", + "Failed to get canvas context": "Falha ao obter o contexto do canvas", + "Failed to insert PDF. The file may be corrupted.": "Falha ao inserir o PDF. O arquivo pode estar corrompido.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Falha ao carregar o Ghostscript de {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Falha ao carregar o arquivo PDF.", + "Failed to load PDF for cropping.": "Falha ao carregar o PDF para corte.", + "Failed to load PDF for preview.": "Falha ao carregar o PDF para prévia.", + "Failed to load PDF form viewer.": "Falha ao carregar o visualizador de formulários PDF.", + "Failed to load PDF layers": "Falha ao carregar as camadas do PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Falha ao carregar o PyMuPDF pela CDN: {{msg}}", + "Failed to load SVG image": "Falha ao carregar a imagem SVG", + "Failed to load WebP image": "Falha ao carregar a imagem WebP", + "Failed to load attachments from PDF.": "Falha ao carregar os anexos do PDF.", + "Failed to load files: {{error}}": "Falha ao carregar os arquivos: {{error}}", + "Failed to load image.": "Falha ao carregar a imagem.", + "Failed to load image: {{filename}}": "Falha ao carregar a imagem: {{filename}}", + "Failed to load one or more PDF files.": "Falha ao carregar um ou mais arquivos PDF.", + "Failed to load script: {{url}}": "Falha ao carregar o script: {{url}}", + "Failed to load template.": "Falha ao carregar o modelo.", + "Failed to load the PDF Editor.": "Falha ao carregar o Editor de PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Falha ao carregar o processador de imagens. Verifique se o seu navegador oferece suporte a SharedArrayBuffer (requer HTTPS ou localhost).", + "Failed to parse CSV: {{error}}": "Falha ao analisar o CSV: {{error}}", + "Failed to parse signature": "Falha ao analisar a assinatura", + "Failed to parse the certificate file.": "Falha ao analisar o arquivo de certificado.", + "Failed to process HEIC file: {{name}}": "Falha ao processar o arquivo HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Falha ao processar o arquivo WebP: {{name}}", + "Failed to read file.": "Falha ao ler o arquivo.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Falha ao remover as restrições. O PDF pode exigir a senha de proprietário correta.", + "Failed to render page": "Falha ao renderizar a página", + "Failed to render page previews": "Falha ao renderizar as prévias das páginas", + "Failed to render page previews.": "Falha ao renderizar as prévias das páginas.", + "Failed to render page.": "Falha ao renderizar a página.", + "Failed to save changes.": "Falha ao salvar as alterações.", + "Failed to save the new PDF. Check console for details.": "Falha ao salvar o novo PDF. Verifique o console para mais detalhes.", + "Failed to split PDF. Please check your selection.": "Falha ao dividir o PDF. Verifique sua seleção.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Falha ao aplicar o carimbo de data/hora ao PDF: {{message}}\n\nTente outro servidor TSA ou verifique sua conexão com a internet.", + "Failed to toggle layer visibility": "Falha ao alternar a visibilidade da camada", + "Failed to validate signatures. The file may be corrupted.": "Falha ao validar as assinaturas. O arquivo pode estar corrompido.", + "Features enabled by this module:": "Recursos ativados por este módulo:", + "Field Name": "Nome do campo", + "Field Name (Group Name)": "Nome do campo (Nome do grupo)", + "Field Name Conflict": "Conflito de nome de campo", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "O nome de campo \"{{newName}}\" já existe neste {{value}}. Tente usar um nome único.", + "Field name cannot be empty": "O nome do campo não pode ficar vazio", + "File": "Arquivo", + "File Size": "Tamanho do arquivo", + "File exists but could not be read. Check CORS configuration.": "O arquivo existe, mas não foi possível lê-lo. Verifique a configuração de CORS.", + "File list not found": "Lista de arquivos não encontrada", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Tamanho do arquivo reduzido de {{originalSize}} para {{compressedSize}} (economia de {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Arquivo {{n}}/{{length}}: página {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Arquivo {{n}}/{{length}}: {{message}}", + "Filename": "Nome do arquivo", + "Files that failed: {{errorCount}}.": "Arquivos com falha: {{errorCount}}.", + "Fill (cover full target page)": "Preencher (cobrir a página de destino inteira)", + "Fill Color": "Cor de preenchimento", + "Finalizing PDF...": "Finalizando o PDF...", + "Find & replace": "Localizar e substituir", + "Finds the best quality under this size. 0 means no target.": "Encontra a melhor qualidade abaixo deste tamanho. 0 significa sem meta.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "O Firefox e o Chrome podem mostrar o formato nativo do seletor de data durante a seleção. O formato correto será aplicado quando você terminar de inserir a data.", + "First Indent": "Recuo da primeira linha", + "Fit (keep full page visible)": "Ajustar (manter a página inteira visível)", + "Fit Page": "Ajustar à página", + "Fix Page Size": "Corrigir Tamanho da Página", + "Flatten": "Achatar", + "Flatten Forms": "Achatar Formulários", + "Flatten annotations": "Achatar anotações", + "Flatten form fields": "Achatar campos de formulário", + "Flatten forms and annotations": "Achatar formulários e anotações", + "Flatten links": "Achatar links", + "Flattening PDF...": "Achatando PDF...", + "Flattening and saving PDF...": "Achatando e salvando o PDF...", + "Flattening multiple PDFs...": "Achatando vários PDFs...", + "Flattening page {{i}} of {{totalPages}}...": "Achatando página {{i}} de {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Achatando {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Foca a barra de endereços", + "Font": "Fonte", + "Font Color": "Cor da fonte", + "Font Family": "Família da fonte", + "Font Size": "Tamanho da fonte", + "Font size: {{bSize}} → {{aSize}}": "Tamanho da fonte: {{bSize}} → {{aSize}}", + "Font to Outline": "Fonte para Contorno", + "Font: {{bFont}} → {{aFont}}": "Fonte: {{bFont}} → {{aFont}}", + "Fonts": "Fontes", + "Footer Center": "Rodapé central", + "Footer Left": "Rodapé esquerdo", + "Footer Right": "Rodapé direito", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Para PDFs somente com imagens, como digitalizações. Ignorado quando o documento tem texto selecionável, a menos que Substituir proteção de conteúdo esteja ativado.", + "Form fields stop being fillable.": "Os campos de formulário deixam de ser preenchíveis.", + "Format": "Formato", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}} página(s) em branco encontrada(s). Clique em uma página para desmarcá-la.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "{{length}} favoritos existentes encontrados. Substituir os favoritos atuais?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length}} imagem(ns) encontrada(s) em {{length2}} PDF(s).", + "Front": "Frente", + "Full Coverage": "Cobertura total", + "Gamma": "Gama", + "Generate table of contents from bookmarks": "Gerar sumário a partir dos favoritos", + "Generating High-Quality PDF...": "Gerando PDF de alta qualidade...", + "Generating PDF...": "Gerando PDF...", + "Generating ZIP file...": "Gerando arquivo ZIP...", + "Generating formatted content...": "Gerando conteúdo formatado...", + "Generating preview...": "Gerando prévia...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (Conversão para PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "A conversão RGB do Ghostscript falhou com o código de saída {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "A conversão do Ghostscript falhou com o código de saída {{exitCode}}", + "Ghostscript did not produce output file": "O Ghostscript não gerou o arquivo de saída", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "O Ghostscript não está configurado. Configure-o em Configurações Avançadas.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "O Ghostscript não está configurado. Configure-o em Configurações do WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "O Ghostscript não está configurado. O PyMuPDF precisa do Ghostscript para algumas operações. Configure ambos em Configurações Avançadas.", + "Ghostscript threw an exception: {{e}}": "O Ghostscript lançou uma exceção: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "O wrapper do Ghostscript não expôs a interface esperada. Esperado: loadGS() ou a classe GhostscriptWASM.", + "Go": "Ir", + "Go to page": "Ir para a página", + "Grayscale": "Tons de cinza", + "Green": "Verde", + "Greyscale": "Tons de cinza", + "Grid Mode": "Modo de grade", + "Group Name (Must be same for group)": "Nome do grupo (deve ser o mesmo para o grupo)", + "H-Scale %": "Escala H %", + "Hanging Indent": "Recuo deslocado", + "Hard reloads page": "Recarrega a página ignorando o cache", + "Header & Footer": "Cabeçalho e Rodapé", + "Header & Footer added successfully!": "Cabeçalho e rodapé adicionados com sucesso!", + "Header Center": "Cabeçalho central", + "Header Left": "Cabeçalho esquerdo", + "Header Right": "Cabeçalho direito", + "Height ({{unit}})": "Altura ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Ocultar", + "Hide Border": "Ocultar borda", + "Hide password": "Ocultar senha", + "Hides window": "Oculta a janela", + "High (288 DPI)": "Alta (288 DPI)", + "High (Smallest Files)": "Alta (menores arquivos)", + "Horizontal": "Horizontal", + "Hue Shift": "Deslocamento de matiz", + "Image Format": "Formato da imagem", + "Image Input": "Entrada de imagem", + "Image quality": "Qualidade da imagem", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Imagem redimensionada de {{width}}×{{height}} para {{width2}}×{{height2}}", + "Images": "Imagens", + "Images above this are resampled down. None leaves resolution alone.": "Imagens acima deste valor são reamostradas para baixo. Nenhum mantém a resolução.", + "Imported {{length}} bookmarks!": "{{length}} favoritos importados!", + "Inches (in)": "Polegadas (in)", + "Include Attachments": "Incluir anexos", + "Include Cc Bcc": "Incluir Cc e Cco", + "Include this file": "Incluir este arquivo", + "Incorrect Page Count": "Contagem de páginas incorreta", + "Incorrect Password": "Senha incorreta", + "Incorrect password": "Senha incorreta", + "Incorrect password. Please try again.": "Senha incorreta. Tente novamente.", + "Increase size": "Aumentar tamanho", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indexando a página {{pageNumber}} de {{totalPages}} do PDF 1...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indexando a página {{pageNumber}} de {{totalPages}} do PDF 2...", + "Info": "Informações", + "Info Dictionary": "Info Dictionary", + "Inherit": "Herdar", + "Initialization Error": "Erro de inicialização", + "Initializing Ghostscript...": "Inicializando o Ghostscript...", + "Initializing PDF engine...": "Inicializando o mecanismo de PDF...", + "Initializing PyMuPDF...": "Inicializando o PyMuPDF...", + "Initializing decryption...": "Inicializando a descriptografia...", + "Initializing encryption...": "Inicializando a criptografia...", + "Initializing repair engine...": "Inicializando o mecanismo de reparo...", + "Initializing...": "Inicializando...", + "Input Required": "Entrada necessária", + "Insecure Digest (MD5 / SHA-1)": "Resumo inseguro (MD5 / SHA-1)", + "Insert blank pages": "Inserir páginas em branco", + "Insert blank pages after this page number": "Inserir páginas em branco após este número de página", + "Interactive Form Fields": "Campos de formulário interativos", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Intercale páginas de vários PDFs (por exemplo, ímpares + pares invertidas de uma digitalização em um só lado)", + "Invalid Certificate": "Certificado inválido", + "Invalid File": "Arquivo inválido", + "Invalid Files": "Arquivos inválidos", + "Invalid Input": "Entrada inválida", + "Invalid JSON format": "Formato JSON inválido", + "Invalid Name": "Nome inválido", + "Invalid Order": "Ordem inválida", + "Invalid PDF password.": "Senha do PDF inválida.", + "Invalid Page Numbers": "Números de página inválidos", + "Invalid Page Order": "Ordem de páginas inválida", + "Invalid Pages": "Páginas inválidas", + "Invalid Range": "Intervalo inválido", + "Invalid Signature": "Assinatura inválida", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL de TSA inválida. A autoridade de carimbo de data/hora deve ser uma URL http:// ou https:// válida.", + "Invalid URL": "URL inválida", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Formato de URL inválido. Digite uma URL válida (por exemplo, https://example.com/wasm/)", + "Invalid XML: no root element": "XML inválido: sem elemento raiz", + "Invalid data": "Dados inválidos", + "Invalid hex string in content stream": "String hexadecimal inválida no fluxo de conteúdo", + "Invalid page range specified.": "Intervalo de páginas especificado inválido.", + "Invalid shortcut format": "Formato de atalho inválido", + "Invalid: Cryptographic Verification Failed": "Inválido: falha na verificação criptográfica", + "Invert Colors": "Inverter Cores", + "Invert all colors": "Inverta todas as cores", + "Inverting PDF colors...": "Invertendo as cores do PDF...", + "Issuer": "Emissor", + "It fits the {{targetBytes}} target.": "Ele atinge a meta de {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Ele ainda está acima da meta de {{targetBytes}} porque Preservar PDF/A limita o quanto ele pode ser comprimido.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Ele não declara mais conformidade com PDF/A. Ative Preservar PDF/A em Configurações Personalizadas para mantê-la.", + "Italic": "Itálico", + "Item 1": "Item 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "As assinaturas digitais foram removidas para que ele pudesse ser comprimido. Assine-o novamente, se necessário.", + "JPEG (Smaller file size)": "JPEG (arquivo menor)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Qualidade JPEG das imagens recodificadas, de 20 a 100. Menor significa arquivos menores e mais artefatos visíveis.", + "JPG": "JPG", + "JSON Files": "Arquivos JSON", + "JSON Loaded": "JSON carregado", + "JSON to PDF": "JSON para PDF", + "Javascript Code": "Código JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Mantém um arquivo PDF/A em conformidade. Brotli e a rasterização são ignorados enquanto esta opção estiver ativada.", + "Keeps only the characters the document uses.": "Mantém apenas os caracteres usados pelo documento.", + "Key (e.g., Department)": "Chave (ex.: Departamento)", + "Keywords": "Palavras-chave", + "Label": "Rótulo", + "Label / Prompt": "Rótulo / Instrução", + "Landscape": "Paisagem", + "Language": "Idioma", + "Layer not found": "Camada não encontrada", + "Layer {{number}}": "Camada {{number}}", + "Leave blank for all pages": "Deixe em branco para todas as páginas", + "Left": "Esquerda", + "Left edge in points (1 inch = 72 pts)": "Margem esquerda em pontos (1 polegada = 72 pts)", + "Legal": "Ofício", + "Letter": "Carta", + "Level": "Nível", + "Limit recognized characters (leave empty for all)": "Limitar caracteres reconhecidos (deixe vazio para todos)", + "Line": "Linha", + "Linearization Failed": "Falha na linearização", + "Linearize": "Linearizar", + "Links stop being clickable.": "Os links deixam de ser clicáveis.", + "Lists": "Listas", + "Load": "Carregar", + "Load system fonts": "Carregar fontes do sistema", + "Load system fonts…": "Carregar fontes do sistema…", + "Loaded": "Carregado", + "Loaded bookmarks from JSON. Now upload your PDF.": "Favoritos carregados do JSON. Agora envie seu PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} favoritos carregados do CSV. Agora envie seu PDF.", + "Loading Engine...": "Carregando mecanismo...", + "Loading Ghostscript...": "Carregando o Ghostscript...", + "Loading PDF Editor...": "Carregando o Editor de PDF...", + "Loading PDF Text Editor...": "Carregando o Editor de Texto de PDF...", + "Loading PDF converter...": "Carregando o conversor de PDF...", + "Loading PDF documents...": "Carregando documentos PDF...", + "Loading PDF engine...": "Carregando o mecanismo de PDF...", + "Loading PDF files...": "Carregando arquivos PDF...", + "Loading PDF form...": "Carregando formulário PDF...", + "Loading PDF processor...": "Carregando o processador de PDF...", + "Loading PDF viewer...": "Carregando o visualizador de PDF...", + "Loading PDF...": "Carregando PDF...", + "Loading PDFs...": "Carregando PDFs...", + "Loading attachments...": "Carregando anexos...", + "Loading comparison {{currentPage}} of {{length}}...": "Carregando comparação {{currentPage}} de {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Carregando o mecanismo de conversão ({{percent}}%)...", + "Loading conversion engine...": "Carregando o mecanismo de conversão...", + "Loading engine...": "Carregando mecanismo...", + "Loading fonts...": "Carregando fontes...", + "Loading layers from {{name}}...": "Carregando camadas de {{name}}...", + "Loading page {{num}}...": "Carregando página {{num}}...", + "Loading preview...": "Carregando prévia...", + "Loading {{name}}...": "Carregando {{name}}...", + "Loading...": "Carregando...", + "Location": "Local", + "Lossless (No Quality Loss)": "Sem perdas (sem perda de qualidade)", + "Lossless (no image re-encoding)": "Sem perdas (sem recodificar imagens)", + "Low (Best Quality)": "Baixa (melhor qualidade)", + "MOBI Files": "Arquivos MOBI", + "MOBI to PDF": "MOBI para PDF", + "Malformed ByteRange": "ByteRange malformado", + "Malformed ECDSA signature (could not parse r,s)": "Assinatura ECDSA malformada (não foi possível analisar r,s)", + "Malformed inline image in content stream": "Imagem inline malformada no fluxo de conteúdo", + "Malformed signatureAlgorithm": "signatureAlgorithm malformado", + "Margins": "Margens", + "Markdown Files": "Arquivos Markdown", + "Markdown to PDF": "Markdown para PDF", + "Max Length (0 for unlimited)": "Comprimento máximo (0 para ilimitado)", + "Maximum resolution": "Resolução máxima", + "Medium (Recommended)": "Média (recomendado)", + "Merge PDF": "Mesclar PDF", + "Merge PDFs": "Mesclar PDFs", + "Merge duplicate fonts": "Mesclar fontes duplicadas", + "Mermaid Error: {{error}}": "Erro do Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadados copiados para a área de transferência como JSON.", + "Metadata removed successfully!": "Metadados removidos com sucesso!", + "Metadata updated successfully!": "Metadados atualizados com sucesso!", + "Millimeters (mm)": "Milímetros (mm)", + "Minimizes window": "Minimiza a janela", + "Missing Files": "Arquivos ausentes", + "Missing signatureAlgorithm": "signatureAlgorithm ausente", + "Mixed Page Sizes Detected": "Tamanhos de página variados detectados", + "Mixed Sizes": "Tamanhos variados", + "Mode": "Modo", + "Modified": "Modificado", + "Modified After Signing (signed part intact)": "Modificado após a assinatura (parte assinada intacta)", + "More": "Mais", + "Moved": "Movido", + "Moved \"{{value}}\"": "\"{{value}}\" movido", + "Multi-line": "Várias linhas", + "Must be a positive integer": "Deve ser um número inteiro positivo", + "Must be a positive number": "Deve ser um número positivo", + "N must be at least 1.": "N deve ser pelo menos 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "PDF N-Up criado com sucesso!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Erro de rede: não foi possível conectar à URL. Verifique se a URL está correta e se o servidor permite requisições CORS.", + "Network error: {{error}}": "Erro de rede: {{error}}", + "Next page": "Próxima página", + "No Area Selected": "Nenhuma área selecionada", + "No Attachments": "Nenhum anexo", + "No Changes": "Nenhuma alteração", + "No Crop Area": "Nenhuma área de corte", + "No File": "Nenhum arquivo", + "No Files": "Nenhum arquivo", + "No Images Found": "Nenhuma imagem encontrada", + "No PDF Files": "Nenhum arquivo PDF", + "No PDF document loaded": "Nenhum documento PDF carregado", + "No PDF document loaded.": "Nenhum documento PDF carregado.", + "No PDF file loaded.": "Nenhum arquivo PDF carregado.", + "No PDF files could be decrypted. The password may be incorrect.": "Nenhum arquivo PDF pôde ser descriptografado. A senha pode estar incorreta.", + "No PDF files could be linearized.": "Nenhum arquivo PDF pôde ser linearizado.", + "No PDFs could be processed.": "Nenhum PDF pôde ser processado.", + "No Pages": "Nenhuma página", + "No Selection": "Nenhuma seleção", + "No Signatures Found": "Nenhuma assinatura encontrada", + "No Tables Found": "Nenhuma tabela encontrada", + "No Text": "Sem texto", + "No URL configured": "Nenhuma URL configurada", + "No attachments found in this PDF.": "Nenhum anexo encontrado neste PDF.", + "No attachments selected for removal.": "Nenhum anexo selecionado para remoção.", + "No blank pages detected in this PDF.": "Nenhuma página em branco detectada neste PDF.", + "No bookmarks found at the selected level.": "Nenhum favorito encontrado no nível selecionado.", + "No bookmarks to delete.": "Nenhum favorito para excluir.", + "No bookmarks to export!": "Nenhum favorito para exportar!", + "No certificate found in PEM file": "Nenhum certificado encontrado no arquivo PEM", + "No certificate found in PFX file": "Nenhum certificado encontrado no arquivo PFX", + "No certificates found in signature": "Nenhum certificado encontrado na assinatura", + "No changes match the current filter.": "Nenhuma alteração corresponde ao filtro atual.", + "No configurable settings for this node.": "Não há configurações ajustáveis para este nó.", + "No differences detected on this page.": "Nenhuma diferença detectada nesta página.", + "No embedded images were found in the selected PDF(s).": "Nenhuma imagem incorporada foi encontrada no(s) PDF(s) selecionado(s).", + "No existing bookmarks found in this PDF.": "Nenhum favorito existente encontrado neste PDF.", + "No items were selected for removal or none were found in the PDF.": "Nenhum item foi selecionado para remoção ou nenhum foi encontrado no PDF.", + "No page pairs to export.": "Nenhum par de páginas para exportar.", + "No pages found. Please create a blank PDF or upload one.": "Nenhuma página encontrada. Crie um PDF em branco ou envie um.", + "No pages selected for removal.": "Nenhuma página selecionada para remoção.", + "No pages were selected for splitting.": "Nenhuma página foi selecionada para dividir.", + "No paired page for this side.": "Nenhuma página pareada para este lado.", + "No private key found in PEM file": "Nenhuma chave privada encontrada no arquivo PEM", + "No private key found in PFX file": "Nenhuma chave privada encontrada no arquivo PFX", + "No tables were detected in this PDF.": "Nenhuma tabela foi detectada neste PDF.", + "No valid page numbers found.": "Nenhum número de página válido encontrado.", + "No valid pages to save.": "Nenhuma página válida para salvar.", + "No worker": "Nenhum worker", + "Noise": "Ruído", + "None": "Nenhum", + "None of the files could be compressed: {{join}}.": "Nenhum dos arquivos pôde ser comprimido: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "Arquivos insuficientes", + "Not a PDF": "Não é um PDF", + "Not connected": "Não conectado", + "Not in trust chain": "Fora da cadeia de confiança", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Observação: sem uma senha de proprietário separada, o PDF não tem restrições de uso.", + "Number Format": "Formato do número", + "Number of Pages": "Número de páginas", + "OCR": "OCR", + "OCR aborted before any page was processed": "O OCR foi interrompido antes de qualquer página ser processada", + "OCR recognize timed out after {{timeoutMs}}ms": "O reconhecimento do OCR expirou após {{timeoutMs}}ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Arquivos ODG", + "ODG to PDF": "ODG para PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Desativado (padrão): numeração natural de 1 a N. Ativado: os rótulos de página originais de cada arquivo são preservados (pode gerar rótulos duplicados).", + "One PDF per page": "Um PDF por página", + "One PDF per range": "Um PDF por intervalo", + "Only a substitute font was available": "Só havia uma fonte substituta disponível", + "Only where it does not change how the image looks.": "Apenas onde não altera a aparência da imagem.", + "Opacity": "Opacidade", + "Open URL": "Abrir URL", + "Opens incognito window": "Abre uma janela anônima", + "Opens new tab": "Abre uma nova aba", + "Opens new window": "Abre uma nova janela", + "Operation Failed": "Falha na operação", + "Operation resulted in an empty file.": "A operação resultou em um arquivo vazio.", + "Optimize PDF for fast web viewing": "Otimize o PDF para visualização rápida na web", + "Optimizing PDFs for web view (linearizing)...": "Otimizando PDFs para visualização na web (linearizando)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Otimizando {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Opções (uma por linha ou separadas por vírgula)", + "Orientation": "Orientação", + "Outline": "Contorno", + "Output": "Saída", + "Overlay": "Sobreposição", + "Overlay or underlay pages from one PDF onto another": "Sobreponha ou coloque por baixo as páginas de um PDF sobre outro", + "Owner Password": "Senha de proprietário", + "Owner Password Required": "Senha de proprietário necessária", + "PDF": "PDF", + "PDF Files": "Arquivos PDF", + "PDF Input": "Entrada de PDF", + "PDF Layers": "Camadas do PDF", + "PDF Metadata": "Metadados do PDF", + "PDF Producer": "Produtor do PDF", + "PDF converted to CSV successfully!": "PDF convertido para CSV com sucesso!", + "PDF converted to SVG successfully!": "PDF convertido para SVG com sucesso!", + "PDF converted to greyscale successfully!": "PDF convertido para tons de cinza com sucesso!", + "PDF created successfully!": "PDF criado com sucesso!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF descriptografado com sucesso! Toda a criptografia e as restrições foram removidas.", + "PDF decrypted successfully! Your download has started.": "PDF descriptografado com sucesso! Seu download foi iniciado.", + "PDF downloaded successfully.": "PDF baixado com sucesso.", + "PDF encrypted successfully with 256-bit AES!": "PDF criptografado com sucesso usando AES de 256 bits!", + "PDF has been sanitized and downloaded.": "O PDF foi higienizado e baixado.", + "PDF has no pages": "O PDF não tem páginas", + "PDF organized successfully!": "PDF organizado com sucesso!", + "PDF permissions changed successfully!": "Permissões do PDF alteradas com sucesso!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Os leitores de PDF já fornecem por conta própria as 14 fontes padrão do PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Restrições do PDF removidas com sucesso! O arquivo agora pode ser totalmente editado e impresso.", + "PDF saved successfully!": "PDF salvo com sucesso!", + "PDF split successfully!": "PDF dividido com sucesso!", + "PDF to CSV": "PDF para CSV", + "PDF to DOCX": "PDF para DOCX", + "PDF to Excel/CSV": "PDF para Excel/CSV", + "PDF to Images": "PDF para Imagens", + "PDF to Images (High Quality)": "PDF para Imagens (Alta Qualidade)", + "PDF to JSON": "PDF para JSON", + "PDF to Markdown": "PDF para Markdown", + "PDF to PDF/A": "PDF para PDF/A", + "PDF to SVG": "PDF para SVG", + "PDF to Text": "PDF para Texto", + "PDF to XLSX": "PDF para XLSX", + "PDF with layer changes saved!": "PDF com alterações de camada salvo!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} aplicado com sucesso.", + "PDF/A Conversion": "Conversão para PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (rígido, sem transparência)", + "PDF/A-2b (Recommended)": "PDF/A-2b (recomendado)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (moderno, permite anexos)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "Os PDFs foram misturados com sucesso!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (sem perdas)", + "PUB to PDF": "PUB para PDF", + "Page": "Página", + "Page #": "Página nº", + "Page Added": "Página adicionada", + "Page Numbers": "Números de Página", + "Page Removed": "Página removida", + "Page Size": "Tamanho da página", + "Page X of Y": "Página X de Y", + "Page background or layout changed": "Plano de fundo ou layout da página alterado", + "Page container not found": "Contêiner da página não encontrado", + "Page extraction produced an empty PDF.": "A extração de páginas gerou um PDF vazio.", + "Page number": "Número da página", + "Page numbers added successfully!": "Números de página adicionados com sucesso!", + "Page sizes standardized successfully!": "Tamanhos de página padronizados com sucesso!", + "Page {{currentPageNum}} of {{numPages}}": "Página {{currentPageNum}} de {{numPages}}", + "Page {{num}} / {{numPages}}": "Página {{num}} / {{numPages}}", + "Page {{n}} ": "Página {{n}} ", + "Page {{n}} of {{length}}": "Página {{n}} de {{length}}", + "Page {{n}}:": "Página {{n}}:", + "Page {{pageNumber}}": "Página {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "A página {{pageNumber}} existe apenas no primeiro PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "A página {{pageNumber}} existe apenas no segundo PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Página {{pageNumber}} de {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "A página {{pageNum}} não existe neste PDF.", + "Page {{page}}": "Página {{page}}", + "Page {{page}} attachment": "Anexo da página {{page}}", + "Pages": "Páginas", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Páginas (ex.: 1-3, 5) - Total: {{pageCount}}", + "Pages Files": "Arquivos Pages", + "Pages Per Sheet": "Páginas por folha", + "Pages combined successfully!": "Páginas combinadas com sucesso!", + "Pages have been divided successfully!": "As páginas foram divididas com sucesso!", + "Pages have been reordered.": "As páginas foram reordenadas.", + "Pages have been reversed successfully!": "As páginas foram invertidas com sucesso!", + "Pages to PDF": "Pages para PDF", + "Paper Size": "Tamanho do papel", + "Paragraph": "Parágrafo", + "Parsing XML structure...": "Analisando a estrutura do XML...", + "Parsing {{name}}...": "Analisando {{name}}...", + "Partial Coverage": "Cobertura parcial", + "Partial Success": "Sucesso parcial", + "Password": "Senha", + "Password Error": "Erro de senha", + "Password Needed": "Senha necessária", + "Password Required": "Senha necessária", + "Password for all files": "Senha para todos os arquivos", + "Password for all locked files": "Senha para todos os arquivos bloqueados", + "Password for {{name}}": "Senha de {{name}}", + "Password protected": "Protegido por senha", + "Password required for encrypted private key": "Senha necessária para a chave privada criptografada", + "Path Stroke": "Traço do caminho", + "Please add at least one field before downloading.": "Adicione pelo menos um campo antes de baixar.", + "Please draw a rectangle on at least one page to select the crop area.": "Desenhe um retângulo em pelo menos uma página para selecionar a área de corte.", + "Please ensure all page numbers in the order are unique.": "Verifique se todos os números de página na ordem são únicos.", + "Please enter a layer name": "Digite um nome para a camada", + "Please enter a name.": "Digite um nome.", + "Please enter a number between 0 and {{totalPages}}.": "Digite um número entre 0 e {{totalPages}}.", + "Please enter a page order.": "Digite uma ordem de páginas.", + "Please enter a password": "Digite uma senha", + "Please enter a password for {{i}} or skip it": "Digite uma senha para {{i}} ou pule este arquivo", + "Please enter a title.": "Digite um título.", + "Please enter a user password.": "Digite uma senha de usuário.", + "Please enter a valid number of pages (1 or more).": "Digite um número de páginas válido (1 ou mais).", + "Please enter a valid page number between 1 and {{total}}": "Digite um número de página válido entre 1 e {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Digite um intervalo de páginas válido (ex.: 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Digite os números das páginas a extrair.", + "Please enter positive numbers.": "Digite números positivos.", + "Please enter some text to convert.": "Digite algum texto para converter.", + "Please enter text for the watermark.": "Digite o texto da marca d'água.", + "Please enter the PDF password.": "Digite a senha do PDF.", + "Please load a PDF first.": "Carregue um PDF primeiro.", + "Please select PDF files to create a ZIP archive.": "Selecione arquivos PDF para criar um arquivo ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Selecione um arquivo de certificado .pem, .crt, .cer ou .der.", + "Please select a PDF file.": "Selecione um arquivo PDF.", + "Please select a valid PDF file.": "Selecione um arquivo PDF válido.", + "Please select an area on at least one page to crop.": "Selecione uma área em pelo menos uma página para cortar.", + "Please select an area to crop first.": "Selecione primeiro uma área para cortar.", + "Please select an area to crop.": "Selecione uma área para cortar.", + "Please select an image file for the watermark.": "Selecione um arquivo de imagem para a marca d'água.", + "Please select at least one BMP file.": "Selecione pelo menos um arquivo BMP.", + "Please select at least one CSV file.": "Selecione pelo menos um arquivo CSV.", + "Please select at least one Excel file.": "Selecione pelo menos um arquivo do Excel.", + "Please select at least one HEIC file.": "Selecione pelo menos um arquivo HEIC.", + "Please select at least one JPG file.": "Selecione pelo menos um arquivo JPG.", + "Please select at least one JPG or JPEG2000 image.": "Selecione pelo menos uma imagem JPG ou JPEG2000.", + "Please select at least one ODT file.": "Selecione pelo menos um arquivo ODT.", + "Please select at least one PDF file.": "Selecione pelo menos um arquivo PDF.", + "Please select at least one PowerPoint file.": "Selecione pelo menos um arquivo do PowerPoint.", + "Please select at least one RTF file.": "Selecione pelo menos um arquivo RTF.", + "Please select at least one SVG file.": "Selecione pelo menos um arquivo SVG.", + "Please select at least one TIFF file.": "Selecione pelo menos um arquivo TIFF.", + "Please select at least one Word document.": "Selecione pelo menos um documento do Word.", + "Please select at least one file to attach.": "Selecione pelo menos um arquivo para anexar.", + "Please select at least one image file.": "Selecione pelo menos um arquivo de imagem.", + "Please select at least one text file.": "Selecione pelo menos um arquivo de texto.", + "Please select at least one {{FILETYPE_NAME}} file.": "Selecione pelo menos um arquivo {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Selecione pelo menos um arquivo {{TOOL_NAME}} (.eml ou .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Selecione pelo menos um arquivo {{TOOL_NAME}}.", + "Please select even or odd pages.": "Selecione páginas pares ou ímpares.", + "Please select one or more PDF files.": "Selecione um ou mais arquivos PDF.", + "Please select pages to delete.": "Selecione as páginas a excluir.", + "Please select pages to duplicate.": "Selecione as páginas a duplicar.", + "Please select pages to mark for splitting.": "Selecione as páginas a marcar para divisão.", + "Please select pages to rotate.": "Selecione as páginas a girar.", + "Please specify a page range for page-level attachments.": "Especifique um intervalo de páginas para os anexos por página.", + "Please upload PDF files.": "Envie arquivos PDF.", + "Please upload PDFs first.": "Envie PDFs primeiro.", + "Please upload a .docx file first.": "Envie um arquivo .docx primeiro.", + "Please upload a PDF file first.": "Envie um arquivo PDF primeiro.", + "Please upload a PDF file.": "Envie um arquivo PDF.", + "Please upload a PDF first.": "Envie um PDF primeiro.", + "Please upload a valid PDF file.": "Envie um arquivo PDF válido.", + "Please upload at least one PDF file.": "Envie pelo menos um arquivo PDF.", + "Please upload at least two PDF files to alternate and mix.": "Envie pelo menos dois arquivos PDF para alternar e misturar.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Envie um PDF base e um PDF de sobreposição/subposição.", + "Please upload valid PDF files.": "Envie arquivos PDF válidos.", + "Please use the Download button in the PDF viewer toolbar above.": "Use o botão Baixar na barra de ferramentas do visualizador de PDF acima.", + "Please wait for the PDF viewer to load.": "Aguarde o visualizador de PDF carregar.", + "Please wait for the form to finish loading.": "Aguarde o formulário terminar de carregar.", + "Portrait": "Retrato", + "Position": "Posição", + "Post-processing for transparency compliance...": "Pós-processamento para conformidade de transparência...", + "Posterize": "Posterizar", + "Posterizing PDF...": "Posterizando o PDF...", + "PowerPoint to PDF": "PowerPoint para PDF", + "Pre Flatten": "Achatar antes", + "Pre-flattening PDF...": "Achatando o PDF previamente...", + "Prefer JPEG 2000 for photos": "Preferir JPEG 2000 para fotos", + "Preparing PDF export...": "Preparando a exportação do PDF...", + "Preparing conversion...": "Preparando a conversão...", + "Preparing download...": "Preparando o download...", + "Preparing preview...": "Preparando a prévia...", + "Presentations": "Apresentações", + "Preserve PDF/A": "Preservar PDF/A", + "Preview": "Prévia", + "Preview Error": "Erro na prévia", + "Preview Text": "Prévia do texto", + "Previous page": "Página anterior", + "Print Form": "Imprimir formulário", + "Private data that editing apps store inside the PDF.": "Dados privados que aplicativos de edição guardam dentro do PDF.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDFs processados.", + "Processing Complete": "Processamento concluído", + "Processing Dpi": "DPI de processamento", + "Processing Failed": "Falha no processamento", + "Processing PDF permissions...": "Processando as permissões do PDF...", + "Processing attachments...": "Processando anexos...", + "Processing failed for {{name}}.": "Falha no processamento de {{name}}.", + "Processing file {{n}} of {{length}}...": "Processando o arquivo {{n}} de {{length}}...", + "Processing images...": "Processando imagens...", + "Processing multiple PDFs...": "Processando vários PDFs...", + "Processing page {{i}} of {{numPages}}": "Processando a página {{i}} de {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Processando a página {{i}} de {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Processando a página {{n}} de {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Processando a página {{pageNum}} de {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Processando a página {{pageNum}} de {{totalPages}}...", + "Processing produced an empty file.": "O processamento gerou um arquivo vazio.", + "Processing resulted in an empty file.": "O processamento resultou em um arquivo vazio.", + "Processing sheet {{n}}...": "Processando a folha {{n}}...", + "Processing {{name}}...": "Processando {{name}}...", + "Processing {{nodeName}}...": "Processando {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Processando {{n}}/{{length}}: {{name}}...", + "Processing...": "Processando...", + "Producer": "Produtor", + "Publisher Files": "Arquivos do Publisher", + "Purple": "Roxo", + "PyMuPDF (Document Processing)": "PyMuPDF (Processamento de documentos)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "O PyMuPDF não está configurado. Configure-o em Configurações Avançadas.", + "PyMuPDF module did not export expected PyMuPDF class.": "O módulo do PyMuPDF não exportou a classe PyMuPDF esperada.", + "PyMuPDF produced an empty decrypted file.": "O PyMuPDF gerou um arquivo descriptografado vazio.", + "PyMuPDF: not configured.": "PyMuPDF: não configurado.", + "QR Code": "Código QR", + "Quality": "Qualidade", + "Quits application (cannot be overridden)": "Encerra o aplicativo (não pode ser substituído)", + "RSA-PKCS1 signature does not verify against signer public key": "A assinatura RSA-PKCS1 não confere com a chave pública do signatário", + "RSA-PSS signature does not verify against signer public key": "A assinatura RSA-PSS não confere com a chave pública do signatário", + "Rasterization Complete": "Rasterização concluída", + "Rasterization Partial": "Rasterização parcial", + "Rasterize": "Rasterizar", + "Rasterize Dpi": "DPI de rasterização", + "Rasterize pages to images": "Rasterize as páginas em imagens", + "Rasterize quality": "Qualidade da rasterização", + "Rasterize resolution (DPI)": "Resolução da rasterização (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF(s) rasterizado(s), {{failed}} com falha.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rasterizando {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rasterizando {{name}}...", + "Rasterizing...": "Rasterizando...", + "Rating must be between 0 and 5": "A avaliação deve estar entre 0 e 5", + "Read Only": "Somente leitura", + "Reading CSV file...": "Lendo o arquivo CSV...", + "Reading PDF...": "Lendo o PDF...", + "Reading XML file...": "Lendo o arquivo XML...", + "Reading encrypted PDF...": "Lendo o PDF criptografado...", + "Reading files...": "Lendo arquivos...", + "Reading layer configuration...": "Lendo a configuração de camadas...", + "Reading {{name}} ({{n}}/{{length}})...": "Lendo {{name}} ({{n}}/{{length}})...", + "Ready": "Pronto", + "Reason": "Motivo", + "Red": "Vermelho", + "Redact": "Tarjar", + "Redact Mode": "Modo de tarja", + "Redact text from PDF": "Tarje texto do PDF", + "Redaction Failed": "Falha na tarja", + "Reduce PDF file size": "Reduza o tamanho do arquivo PDF", + "Reduce color complexity": "Reduzir a complexidade de cores", + "Reduces file size by removing color information.": "Reduz o tamanho do arquivo removendo informações de cor.", + "Reloads page": "Recarrega a página", + "Remove": "Remover", + "Remove All Attachments": "Remover todos os anexos", + "Remove Annotations": "Remover Anotações", + "Remove Blank Pages": "Remover Páginas em Branco", + "Remove Embedded Files": "Remover arquivos incorporados", + "Remove Fonts": "Remover fontes", + "Remove Javascript": "Remover JavaScript", + "Remove Layers": "Remover camadas", + "Remove Links": "Remover links", + "Remove Mark Info": "Remover Mark Info", + "Remove Metadata": "Remover Metadados", + "Remove PDF password protection": "Remova a proteção por senha do PDF", + "Remove Structure Tree": "Remover árvore de estrutura", + "Remove alternate images": "Remover imagens alternativas", + "Remove application data": "Remover dados de aplicativos", + "Remove article threads": "Remover fios de artigo", + "Remove attachment": "Remover anexo", + "Remove blank pages automatically": "Remova páginas em branco automaticamente", + "Remove document structure tree": "Remover a árvore de estrutura do documento", + "Remove file": "Remover arquivo", + "Remove metadata, scripts, and hidden data": "Remova metadados, scripts e dados ocultos", + "Remove output intents": "Remover intenções de saída", + "Remove page thumbnails": "Remover miniaturas de página", + "Remove specific pages": "Remover páginas específicas", + "Remove web capture information": "Remover informações de captura da web", + "Remove {{name}}": "Remover {{name}}", + "Removed \"{{beforeText}}\"": "\"{{beforeText}}\" removido", + "Removed image ({{width}}×{{height}})": "Imagem removida ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} página(s) em branco removida(s) com sucesso!", + "Removing all metadata...": "Removendo todos os metadados...", + "Removing annotations...": "Removendo anotações...", + "Removing redacted text from document data...": "Removendo o texto tarjado dos dados do documento...", + "Removing restrictions...": "Removendo restrições...", + "Removing {{length}} blank page(s)...": "Removendo {{length}} página(s) em branco...", + "Render Error": "Erro de renderização", + "Rendering Page {{num}}...": "Renderizando a página {{num}}...", + "Rendering page previews...": "Renderizando prévias das páginas...", + "Rendering page previews: {{current}}/{{total}}": "Renderizando prévias das páginas: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Renderizando a página {{n}} de {{length}}...", + "Rendering preview for page {{pageNum}}...": "Renderizando a prévia da página {{pageNum}}...", + "Reopens closed tab": "Reabre a aba fechada", + "Repair": "Reparar", + "Repair Failed": "Falha no reparo", + "Repair corrupted PDF": "Repare PDFs corrompidos", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} arquivo(s) reparado(s). Falha ao reparar: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Reparando {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Reparando {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "\"{{beforeText}}\" substituído por \"{{afterText}}\"", + "Required": "Obrigatório", + "Resamples even when an image is only slightly above the limit.": "Reamostra mesmo quando a imagem está apenas um pouco acima do limite.", + "Reset Form": "Redefinir formulário", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Redefinir e voltar ao envio de arquivos? Todas as alterações não salvas serão perdidas.", + "Resolution": "Resolução", + "Retain Page Labels": "Manter rótulos de página", + "Retry Failed": "Tentar novamente os que falharam", + "Reverse Pages": "Inverter Páginas", + "Reverse page order": "Inverta a ordem das páginas", + "Reversing page order...": "Invertendo a ordem das páginas...", + "Reversing {{name}} ({{n}}/{{length}})...": "Invertendo {{name}} ({{n}}/{{length}})...", + "Right": "Direita", + "Right edge in points": "Margem direita em pontos", + "Rotate": "Girar", + "Rotate +90°": "Girar +90°", + "Rotate all pages": "Girar todas as páginas", + "Rotation": "Rotação", + "Rotation Variance": "Variação de rotação", + "Rotations applied successfully!": "Rotações aplicadas com sucesso!", + "Rows": "Linhas", + "Run Javascript": "Executar JavaScript", + "Running OCR on page {{pageNum}}...": "Executando OCR na página {{pageNum}}...", + "Running...": "Executando...", + "SVG": "SVG", + "SVG Files": "Arquivos SVG", + "SVG to PDF": "SVG para PDF", + "Sanitize": "Higienizar", + "Sanitized With Warnings": "Higienizado com avisos", + "Sanitizing PDF...": "Higienizando o PDF...", + "Saturation": "Saturação", + "Saved": "Salvo", + "Saving PDF with layer changes...": "Salvando o PDF com as alterações de camada...", + "Scaling Mode": "Modo de escala", + "Scanner Effect": "Efeito Scanner", + "Scanner effect applied successfully!": "Efeito de scanner aplicado com sucesso!", + "Scanning page {{n}} of {{pageCount}}...": "Digitalizando a página {{n}} de {{pageCount}}...", + "Search Text": "Buscar texto", + "Search languages...": "Buscar idiomas...", + "Select Font": "Selecionar fonte", + "Select a field to edit properties": "Selecione um campo para editar as propriedades", + "Select a field...": "Selecione um campo...", + "Select to add this button to an existing group": "Selecione para adicionar este botão a um grupo existente", + "Selected Option": "Opção selecionada", + "Self-Signed: Signer Identity Not Verified": "Autoassinado: identidade do signatário não verificada", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Os recursos de OCR hospedados por você estão parcialmente configurados. Defina {{missing}} junto com as outras URLs de recursos do Tesseract.", + "Separator": "Separador", + "Separator Color": "Cor do separador", + "Separator Thickness": "Espessura do separador", + "Sepia": "Sépia", + "Serial Number:": "Número de série:", + "Set custom destination": "Definir destino personalizado", + "Shapes": "Formas", + "Sheet {{n}} {{sideLabel}}": "Folha {{n}} {{sideLabel}}", + "Show": "Mostrar", + "Show password": "Mostrar senha", + "Show/Hide Field": "Mostrar/Ocultar campo", + "Sign Here": "Assine aqui", + "Signature /Contents is not a single DER object followed by zero padding": "O /Contents da assinatura não é um único objeto DER seguido de preenchimento com zeros", + "Signature Algorithm:": "Algoritmo de assinatura:", + "Signature Intact: Signer Identity Not Verified": "Assinatura íntegra: identidade do signatário não verificada", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Campos de assinatura são campos de assinatura AcroForm e só seriam visíveis em um visualizador de PDF avançado.", + "Signature has a missing or malformed /ByteRange": "A assinatura tem um /ByteRange ausente ou malformado", + "Signature scheme {{kind}} not implemented": "Esquema de assinatura {{kind}} não implementado", + "Signature {{n}}": "Assinatura {{n}}", + "Signatures": "Assinaturas", + "Signed By": "Assinado por", + "Signed On": "Assinado em", + "Signed PDF Not Changed": "PDF assinado não alterado", + "Signed PDF downloaded successfully!": "PDF assinado baixado com sucesso!", + "Signed PDF saved successfully!": "PDF assinado salvo com sucesso!", + "Simple (1, 2, 3)": "Simples (1, 2, 3)", + "Simplify large color profiles": "Simplificar perfis de cor grandes", + "Skew Threshold": "Limite de inclinação", + "Skip": "Pular", + "Skip All": "Pular todos", + "Skip Remaining": "Pular os restantes", + "Skip this file": "Pular este arquivo", + "Skipped: {{join}}.": "Ignorados: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Arquivos menores, mas só leitores com suporte a Brotli conseguem abri-los, como Firefox, MuPDF 1.26+ e Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Alguns arquivos foram ignorados porque não são imagens compatíveis.", + "Some files were skipped. Only BMP files are allowed.": "Alguns arquivos foram ignorados. Apenas arquivos BMP são permitidos.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Alguns arquivos foram ignorados. Apenas arquivos HEIC/HEIF são permitidos.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Alguns arquivos foram ignorados. Apenas arquivos JPG, JPEG, JP2 e JPX são permitidos.", + "Some files were skipped. Only PDF files are allowed.": "Alguns arquivos foram ignorados. Apenas arquivos PDF são permitidos.", + "Some files were skipped. Only PNG images are allowed.": "Alguns arquivos foram ignorados. Apenas imagens PNG são permitidas.", + "Some files were skipped. Only SVG graphics are allowed.": "Alguns arquivos foram ignorados. Apenas gráficos SVG são permitidos.", + "Some files were skipped. Only TIFF files are allowed.": "Alguns arquivos foram ignorados. Apenas arquivos TIFF são permitidos.", + "Some files were skipped. Only WebP images are allowed.": "Alguns arquivos foram ignorados. Apenas imagens WebP são permitidas.", + "Some files were skipped. Only supported image formats are allowed.": "Alguns arquivos foram ignorados. Apenas formatos de imagem compatíveis são permitidos.", + "Some files were skipped. Only text files are allowed.": "Alguns arquivos foram ignorados. Apenas arquivos de texto são permitidos.", + "Some pages could not be processed. Please try again.": "Algumas páginas não puderam ser processadas. Tente novamente.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Algumas marcas de tarja não puderam ser aplicadas, por isso o arquivo não foi baixado. Aplique ou remova-as no editor e tente novamente.", + "Spacing": "Espaçamento", + "Split PDF": "Dividir PDF", + "Split by Bookmarks": "Dividir por favoritos", + "Split pages into tile grid for poster printing": "Divida as páginas em uma grade de blocos para impressão de pôster", + "Split pages vertically or horizontally": "Divida as páginas na vertical ou na horizontal", + "Splitting PDF pages...": "Dividindo as páginas do PDF...", + "Splitting PDF...": "Dividindo o PDF...", + "Spreadsheets": "Planilhas", + "Standard (192 DPI)": "Padrão (192 DPI)", + "Standard Size": "Tamanho padrão", + "Standardize all pages to a target size": "Padronize todas as páginas para um tamanho alvo", + "Standardizing pages...": "Padronizando as páginas...", + "Stitch all pages into one continuous page": "Una todas as páginas em uma única página contínua", + "Straighten skewed PDF pages": "Endireite páginas de PDF inclinadas", + "Strip all annotations": "Remova todas as anotações", + "Style": "Estilo", + "Style Changed": "Estilo alterado", + "Style changed ({{length}} regions)": "Estilo alterado ({{length}} regiões)", + "Subject": "Assunto", + "Subset embedded fonts": "Reduzir fontes incorporadas a subconjuntos", + "Success": "Sucesso", + "Success!": "Sucesso!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} arquivo(s) CSV convertido(s) para PDF com sucesso.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} arquivo(s) do Excel convertido(s) para PDF com sucesso.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} arquivo(s) ODT convertido(s) para PDF com sucesso.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF(s) convertido(s) para DOCX com sucesso.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF(s) convertido(s) para Markdown com sucesso.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF(s) convertido(s) para {{level}} com sucesso.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} arquivos PSD convertidos em um único PDF com sucesso.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} arquivo(s) do PowerPoint convertido(s) para PDF com sucesso.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} arquivo(s) RTF convertido(s) para PDF com sucesso.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} documento(s) do Word convertido(s) para PDF com sucesso.", + "Successfully converted {{length}} files to PDF.": "{{length}} arquivos convertidos para PDF com sucesso.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} arquivo(s) {{TOOL_NAME}} convertido(s) para PDF com sucesso.", + "Successfully converted {{name}} to DOCX.": "{{name}} convertido para DOCX com sucesso.", + "Successfully converted {{name}} to Markdown.": "{{name}} convertido para Markdown com sucesso.", + "Successfully converted {{name}} to PDF.": "{{name}} convertido para PDF com sucesso.", + "Successfully converted {{name}} to {{level}}.": "{{name}} convertido para {{level}} com sucesso.", + "Successfully extracted PDF for AI/LLM use.": "PDF extraído com sucesso para uso com IA/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF(s) extraído(s) com sucesso para uso com IA/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF rasterizado com sucesso a {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF(s) rasterizado(s) com sucesso a {{dpi}} DPI.", + "Supported: CBZ, CBR": "Compatíveis: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Compatíveis: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Compatíveis: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Compatíveis: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Compatíveis: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Compatíveis: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Compatíveis: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Compatíveis: XPS, OXPS", + "Switches apps": "Alterna entre aplicativos", + "Switches tabs": "Alterna entre abas", + "Table of Contents": "Sumário", + "Table {{n}} (Page {{page}})": "Tabela {{n}} (página {{page}})", + "Tabloid": "Tabloide", + "Target Field": "Campo de destino", + "Target Kilobytes": "Quilobytes alvo", + "Target Not Reached": "Meta não alcançada", + "Target Size": "Tamanho alvo", + "Technical Details": "Detalhes técnicos", + "Temperature": "Temperatura", + "Template \"{{name}}\" loaded.": "Modelo \"{{name}}\" carregado.", + "Template \"{{name}}\" saved.": "Modelo \"{{name}}\" salvo.", + "Text": "Texto", + "Text Color": "Cor do texto", + "Text Files": "Arquivos de texto", + "Text color changed successfully!": "Cor do texto alterada com sucesso!", + "Text converted to PDF successfully!": "Texto convertido para PDF com sucesso!", + "Text extracted successfully!": "Texto extraído com sucesso!", + "Text to PDF": "Texto para PDF", + "That password did not open any of the remaining files.": "Essa senha não abriu nenhum dos arquivos restantes.", + "The PDF file(s) do not contain any attachments to extract.": "O(s) arquivo(s) PDF não contêm anexos para extrair.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "O PDF tem {{totalPages}} páginas, o que não é divisível por {{nValue}}. O último PDF terá {{remainder}} página(s).", + "The PDF might be corrupted or password protected.": "O PDF pode estar corrompido ou protegido por senha.", + "The PDF might be corrupted or password-protected.": "O PDF pode estar corrompido ou protegido por senha.", + "The PDF might be corrupted.": "O PDF pode estar corrompido.", + "The PDF viewer is still initializing.": "O visualizador de PDF ainda está inicializando.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "O PDF foi baixado, mas estas etapas não puderam ser concluídas: {{join}}. O conteúdo que elas cobrem ainda pode estar no arquivo.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "A URL retornou um tipo de conteúdo inesperado: {{contentType}}. Era esperado um arquivo JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Os bytes excluídos pelo /ByteRange não são exatamente uma assinatura codificada em hexadecimal", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Os bytes excluídos pelo /ByteRange não são o /Contents desta assinatura", + "The compression engine returned an unreadable result.": "O mecanismo de compressão retornou um resultado ilegível.", + "The compression engine stopped unexpectedly.": "O mecanismo de compressão parou inesperadamente.", + "The current password you entered is incorrect. Please try again.": "A senha atual que você digitou está incorreta. Tente novamente.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Os seguintes nomes de campo já existem no PDF enviado: {{conflictList}}. Renomeie esses campos antes de baixar.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Os seguintes nomes de campo são usados mais de uma vez: {{duplicateList}}. Renomeie esses campos para usar nomes únicos antes de baixar.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "O número de páginas especificado ({{length}}) não corresponde ao número atual de páginas do documento ({{currentGridCount}}). Informe uma ordem completa para todas as páginas.", + "The password you entered is incorrect. Please try again.": "A senha que você digitou está incorreta. Tente novamente.", + "The password you entered is wrong or the file is corrupted.": "A senha que você digitou está errada ou o arquivo está corrompido.", + "The provided file could not be loaded as an image. It may be corrupted.": "Não foi possível carregar o arquivo fornecido como imagem. Ele pode estar corrompido.", + "The requested OCR language is not available: {{unavailableText}}.": "O idioma de OCR solicitado não está disponível: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "A ordem de páginas especificada está incompleta ou contém números de página inválidos. Informe uma nova posição para cada página original.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Estes arquivos não são PDFs válidos, por isso não foram adicionados: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Estes arquivos são protegidos por senha: {{names}}. Digite as senhas nos cartões dos arquivos ou remova-os e comprima novamente.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Esta versão do BentoPDF inclui dados de OCR apenas para {{availableText}}.", + "This PDF does not contain any digital signatures.": "Este PDF não contém nenhuma assinatura digital.", + "This PDF has no layers (OCG).": "Este PDF não tem camadas (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Este PDF é protegido por senha. Digite a senha atual para continuar.", + "This document contains pages with different dimensions:": "Este documento contém páginas com dimensões diferentes:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Este documento tem 1 marca de ocultação que ainda não foi aplicada. Enquanto uma marca não for aplicada, o conteúdo sob ela continua no arquivo. Aplicar todas as marcas e baixar?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Este documento tem {{count}} marcas de ocultação que ainda não foram aplicadas. Enquanto uma marca não for aplicada, o conteúdo sob ela continua no arquivo. Aplicar todas as marcas e baixar?", + "This feature requires {{name}} to be configured.": "Este recurso requer que {{name}} esteja configurado.", + "This file is not a valid PDF.": "Este arquivo não é um PDF válido.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Este módulo é licenciado sob AGPL-3.0. Ao configurá-lo, você concorda com os termos da licença.", + "This tool has been disabled": "Esta ferramenta foi desativada", + "This tool is not available in your deployment. Contact your administrator for more information.": "Esta ferramenta não está disponível na sua instalação. Entre em contato com o administrador para mais informações.", + "Threshold": "Limiar", + "Tile": "Ladrilho", + "Tile Gap X": "Espaço entre blocos X", + "Tile Gap Y": "Espaço entre blocos Y", + "Times Bold": "Times Negrito", + "Times Bold Italic": "Times Negrito Itálico", + "Times Italic": "Times Itálico", + "Times Roman": "Times Normal", + "Timestamp": "Carimbo de data/hora", + "Timestamp Failed": "Falha no carimbo de data/hora", + "Tint": "Tonalidade", + "Title": "Título", + "To actually fill or change the options, use our PDF Form Filler tool.": "Para realmente preencher ou alterar as opções, use nossa ferramenta Preenchimento de Formulário.", + "Toggle": "Alternar", + "Toggle style": "Alternar estilo", + "Toggle sync scroll": "Alternar rolagem sincronizada", + "Tool Unavailable": "Ferramenta indisponível", + "Tooltip / Help Text": "Dica / Texto de ajuda", + "Top": "Superior", + "Top Center": "Superior central", + "Top Left": "Superior esquerdo", + "Top Right": "Superior direito", + "Top edge in points": "Margem superior em pontos", + "Total Pages": "Total de páginas", + "Transparent Background": "Fundo transparente", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Testa JPEG 2000 contra JPEG para cada imagem e mantém o menor.", + "Trim margins from all pages": "Apare as margens de todas as páginas", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Verificação de confiança: {{trustVerified}}/{{length}} assinaturas verificadas com o certificado personalizado", + "Trusted": "Confiável", + "Trusted certificate loaded": "Certificado confiável carregado", + "Tsa Url": "URL do TSA", + "Turns off quality, resolution and every other lossy image step.": "Desativa a qualidade, a resolução e todas as demais etapas de imagem com perdas.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "A URL deve começar com http:// ou https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Não foi possível descriptografar o PDF com a senha fornecida.", + "Unable to repair any of the uploaded PDF files.": "Não foi possível reparar nenhum dos arquivos PDF enviados.", + "Unembed standard fonts": "Desincorporar fontes padrão", + "Unembed standard-font look-alikes": "Desincorporar fontes semelhantes às padrão", + "Unexpected delimiter in content stream": "Delimitador inesperado no fluxo de conteúdo", + "Unexpected reply from the engine.": "Resposta inesperada do mecanismo.", + "Uniform": "Uniforme", + "Unique Page Sizes": "Tamanhos de página únicos", + "Unknown": "Desconhecido", + "Unknown error": "Erro desconhecido", + "Unknown error occurred in worker.": "Ocorreu um erro desconhecido no worker.", + "Unknown error occurred.": "Ocorreu um erro desconhecido.", + "Unlock": "Desbloquear", + "Unlock All": "Desbloquear todos", + "Unlock Remaining ({{remaining}})": "Desbloquear restantes ({{remaining}})", + "Unlocked": "Desbloqueado", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} de {{length}} arquivos desbloqueados.", + "Unlocking...": "Desbloqueando...", + "Unresolved optional content reference": "Referência de conteúdo opcional não resolvida", + "Unsupported ECDSA curve in signer certificate": "Curva ECDSA não compatível no certificado do signatário", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Imagem não compatível. Use um PNG ou JPG para a marca d'água.", + "Unsupported digest OID {{digestOid}}": "OID de resumo não compatível {{digestOid}}", + "Unsupported file type: .{{ext}}": "Tipo de arquivo não compatível: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "OID de algoritmo de assinatura não compatível {{oid}}", + "Unterminated array or dictionary in content stream": "Array ou dicionário não finalizado no fluxo de conteúdo", + "Unterminated hex string in content stream": "String hexadecimal não finalizada no fluxo de conteúdo", + "Unterminated inline image in content stream": "Imagem inline não finalizada no fluxo de conteúdo", + "Unterminated string in content stream": "String não finalizada no fluxo de conteúdo", + "Unverified: Unsupported Signature Algorithm": "Não verificada: algoritmo de assinatura não compatível", + "Updating metadata...": "Atualizando metadados...", + "Upload Certificate": "Enviar certificado", + "Upload Comics": "Enviar quadrinhos", + "Upload Documents": "Enviar documentos", + "Upload EPUB Files": "Enviar arquivos EPUB", + "Upload Email Files": "Enviar arquivos de e-mail", + "Upload FB2 Files": "Enviar arquivos FB2", + "Upload Images": "Enviar imagens", + "Upload JSON Files": "Enviar arquivos JSON", + "Upload MOBI Files": "Enviar arquivos MOBI", + "Upload Markdown Files": "Enviar arquivos Markdown", + "Upload ODG Files": "Enviar arquivos ODG", + "Upload PDFs": "Enviar PDFs", + "Upload PUB Files": "Enviar arquivos PUB", + "Upload Pages Files": "Enviar arquivos Pages", + "Upload Presentations": "Enviar apresentações", + "Upload SVG Files": "Enviar arquivos SVG", + "Upload Spreadsheets": "Enviar planilhas", + "Upload Text Files": "Enviar arquivos de texto", + "Upload Visio Files": "Enviar arquivos Visio", + "Upload WPD Files": "Enviar arquivos WPD", + "Upload WPS Files": "Enviar arquivos WPS", + "Upload XML Files": "Enviar arquivos XML", + "Upload XPS Files": "Enviar arquivos XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Envie um PDF e clique em \"Gerar prévia\" para ver o layout do livreto", + "Upload images and convert to PDF": "Envie imagens e converta em PDF", + "Upload one or more PDF files": "Envie um ou mais arquivos PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Maiúsculas A-Z, dígitos 0-9 e - . $ / + % ESPAÇO", + "Use same password for all files": "Usar a mesma senha para todos os arquivos", + "User Password": "Senha de usuário", + "VSD to PDF": "VSD para PDF", + "Valid From": "Válido de", + "Valid Signature": "Assinatura válida", + "Valid Until": "Válido até", + "Validating {{n}} of {{length}}: {{name}}": "Validando {{n}} de {{length}}: {{name}}", + "Validating...": "Validando...", + "Value": "Valor", + "Value (e.g., Marketing)": "Valor (ex.: Marketing)", + "Vertical": "Vertical", + "Viewer not ready": "Visualizador não está pronto", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Visualizador não está pronto. Envie um PDF e aguarde o carregamento terminar.", + "Visibility": "Visibilidade", + "Visio Files": "Arquivos Visio", + "WPD to PDF": "WPD para PDF", + "WPS Files": "Arquivos WPS", + "WPS to PDF": "WPS para PDF", + "Watermark": "Marca d'água", + "Watermark added successfully!": "Marca d'água adicionada com sucesso!", + "Web Crypto API not available in this context": "A Web Crypto API não está disponível neste contexto", + "Web Crypto import/verify failed: {{error}}": "Falha na importação/verificação do Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "Lista de permissões", + "Width ({{unit}})": "Largura ({{unit}})", + "Word": "Word", + "Word Documents": "Documentos do Word", + "Word to PDF": "Word para PDF", + "WordPerfect Files": "Arquivos do WordPerfect", + "Worker crashed": "O worker travou", + "Worker error occurred. Check console for details.": "Ocorreu um erro no worker. Verifique o console para mais detalhes.", + "Workflow completed": "Fluxo de trabalho concluído", + "Wrong password": "Senha incorreta", + "Wrong password for: {{join}}": "Senha incorreta para: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Senha incorreta ou falha ao descriptografar \"{{name}}\".", + "X Position": "Posição X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Arquivos XML", + "XML to PDF": "XML para PDF", + "XMP Metadata": "Metadados XMP", + "XPS Files": "Arquivos XPS", + "XPS to PDF": "XPS para PDF", + "Y Position": "Posição Y", + "Year must be between 1900 and 2100": "O ano deve estar entre 1900 e 2100", + "Yellow": "Amarelo", + "Yellowish": "Amarelado", + "You cannot delete the last page of the document.": "Você não pode excluir a última página do documento.", + "Your PDF has been cropped and the download has started.": "Seu PDF foi cortado e o download foi iniciado.", + "Your PDF has been downloaded successfully.": "Seu PDF foi baixado com sucesso.", + "Your PDF has been posterized.": "Seu PDF foi posterizado.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Suas tarjas foram aplicadas às páginas, mas este arquivo está criptografado, então o BentoPDF não consegue remover também as cópias do texto tarjado de suas propriedades, favoritos e anexos. Para uma limpeza completa, tarje uma cópia sem criptografia e adicione uma senha depois com Proteger PDF. Baixar mesmo assim?", + "Your workflow needs at least one input node and one output node to run.": "Seu fluxo de trabalho precisa de pelo menos um nó de entrada e um nó de saída para ser executado.", + "ZIP archive created successfully!": "Arquivo ZIP criado com sucesso!", + "Zoom(%)": "Zoom(%)", + "e.g. dd/mm/yyyy HH:MM:ss": "ex.: dd/mm/yyyy HH:MM:ss", + "form": "formulário", + "https://example.com": "https://example.com", + "signature found": "assinatura encontrada", + "signatures found": "assinaturas encontradas", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} nó", + "{{count}} nodes": "{{count}} nós", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 página", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} páginas", + "{{length}} Files Need a Password": "{{length}} arquivos precisam de senha", + "{{length}} PDF file(s) selected": "{{length}} arquivo(s) PDF selecionado(s)", + "{{length}} PDF files selected": "{{length}} arquivos PDF selecionados", + "{{length}} attachment(s) extracted successfully!": "{{length}} anexo(s) extraído(s) com sucesso!", + "{{length}} file • {{totalPages}} total pages": "{{length}} arquivo • {{totalPages}} páginas no total", + "{{length}} file(s) attached successfully.": "{{length}} arquivo(s) anexado(s) com sucesso.", + "{{length}} files • {{totalPages}} total pages": "{{length}} arquivos • {{totalPages}} páginas no total", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Ele era protegido por senha, então a cópia comprimida não tem senha. Use Proteger PDF para adicioná-la novamente.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} páginas)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} está assinado digitalmente, por isso foi mantido como está. Comprimi-lo quebraria a assinatura. Para comprimi-lo mesmo assim, ative Substituir proteção de conteúdo em Configurações Personalizadas; as assinaturas serão removidas.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} não é um PDF válido, por isso não foi adicionado.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} é protegido por senha. Digite a senha no cartão do arquivo e comprima novamente.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Não foi possível carregar a contagem de páginas", + "{{size}} • Loading pages...": "{{size}} • Carregando páginas...", + "{{size}} • Loading...": "{{size}} • Carregando...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} páginas", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} páginas", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} páginas", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} páginas", + "{{size}} • {{value}} pages": "{{size}} • {{value}} páginas", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF(s) descriptografado(s) com sucesso.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF(s) linearizado(s) com sucesso.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} páginas → {{numSheets}} folhas de saída", + "{{validCount}} valid": "{{validCount}} válido(s)", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 página", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} páginas" +} diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 3fb9277e..2a2f1fe6 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Открыть главное меню", "language": "Язык", "searchLanguage": "Поиск языка…", - "noLanguagesFound": "Языки не найдены" + "noLanguagesFound": "Языки не найдены", + "breadcrumb": "Навигационная цепочка" }, "donation": { "message": "Нравится BentoPDF? Помогите ему оставаться бесплатным и с открытым исходным кодом!", @@ -236,6 +237,10 @@ "aboutUs": "Про нас", "faqLink": "Частые вопросы", "contactUs": "Связаться с нами", + "tools": "Инструменты", + "pdfConverter": "Конвертер PDF", + "pdfSecurity": "Безопасность PDF", + "mergeSplit": "Объединение и разделение PDF", "legal": "Правовая информация", "termsAndConditions": "Условия предоставления услуг", "privacyPolicy": "Политика приватности", diff --git a/public/locales/ru/tools.json b/public/locales/ru/tools.json index 60b37754..354fd42b 100644 --- a/public/locales/ru/tools.json +++ b/public/locales/ru/tools.json @@ -27,7 +27,22 @@ "name": "Объединение PDF", "subtitle": "Объединить несколько PDF в один файл с сохранением закладок.", "retainPageLabels": "Сохранять исходные метки страниц из каждого файла", - "retainPageLabelsHint": "Выкл (по умолчанию): объединённый PDF использует естественную нумерацию страниц 1–N. Вкл: исходные метки страниц каждого файла сохраняются (могут появиться дубликаты)." + "retainPageLabelsHint": "Выкл (по умолчанию): объединённый PDF использует естественную нумерацию страниц 1–N. Вкл: исходные метки страниц каждого файла сохраняются (могут появиться дубликаты).", + "removeDuplicateFonts": "Удалить повторяющиеся шрифты", + "alert": { + "thumbnailError": "Не удалось отрисовать миниатюры страниц", + "noSelection": "Не выбраны файлы или страницы для объединения.", + "mergeSuccess": "PDF успешно объединены!", + "mergeFailed": "Не удалось объединить PDF.", + "mergeError": "Не удалось объединить PDF. Убедитесь, что все файлы корректны и не защищены паролем.", + "workerError": "В процессе объединения произошла непредвиденная ошибка.", + "loadError": "Не удалось загрузить один или несколько PDF-файлов" + }, + "loader": { + "renderingPreviews": "Создание превью страниц...", + "merging": "Объединение PDF...", + "loadingDocuments": "Загрузка PDF-документов..." + } }, "splitPdf": { "name": "Разделение PDF", @@ -43,7 +58,7 @@ }, "editPdfText": { "name": "Редактирование текста PDF", - "subtitle": "Нажать на любой абзац и отредактировать его на месте — с мгновенной перекомпоновкой текста, шрифтами и стилями.", + "subtitle": "Нажать на любой абзац и отредактировать его на месте, с мгновенной перекомпоновкой текста, шрифтами и стилями.", "saved": "PDF успешно сохранён! ({{size}} КБ)", "failedToLoad": "Не удалось загрузить редактор текста PDF.", "loadingFonts": "Загрузка шрифтов...", @@ -91,7 +106,7 @@ "tipRedoZ": "Повторить (⇧⌘Z)", "tipFileDetails": "Сведения о файле", "tipEditExistingContent": "Редактировать существующее содержимое", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "На что действует инструмент редактирования — сузьте область на насыщенных страницах", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "На что действует инструмент редактирования: сузьте область на насыщенных страницах", "tipClickThePageToAddATextBox": "Нажмите на страницу, чтобы добавить текстовое поле", "tipSpellCheckLanguage": "Язык проверки орфографии", "tipFindAndReplace": "Найти и заменить", @@ -237,7 +252,7 @@ "howItWorksDownloadDescription": "Сохраните обновлённый PDF с новыми метками страниц.", "relatedToolsTitle": "Похожие PDF-инструменты", "faqWhatIsQuestion": "Что такое метка страницы?", - "faqWhatIsAnswer": "Метка страницы — это нумерация, которую PDF-ридеры показывают в миниатюрах, навигации по страницам и диалогах печати. Она не печатает новый текст на самой странице.", + "faqWhatIsAnswer": "Метка страницы: это нумерация, которую PDF-ридеры показывают в миниатюрах, навигации по страницам и диалогах печати. Она не печатает новый текст на самой странице.", "faqMixQuestion": "Можно ли смешивать римские цифры и обычные числа?", "faqMixAnswer": "Да. Добавьте несколько правил, например 1-4 с LowercaseRoman и 5-20 с DecimalArabic.", "faqPrivacyQuestion": "Мои файлы останутся приватными?", @@ -347,7 +362,7 @@ "subtitle": "Заполнить форму прямо в браузере. Поддерживает формы XFA.", "uploadHint": "Загрузите PDF с полями формы. Заполните их прямо в просмотрщике ниже, затем нажмите кнопку, чтобы сохранить и скачать заполненную форму. Также поддерживаются формы XFA.", "xfaNoteTitle": "Примечание о формах XFA:", - "xfaNoteDescription": "XFA (XML Forms Architecture) — устаревший формат, поддерживаемый только некоторыми PDF-просмотрщиками, такими как BentoPDF и Firefox. Если вы открываете XFA PDF в другом ПО и видите пустые страницы или отсутствие полей формы, значит этот просмотрщик не поддерживает XFA. Для корректного просмотра и заполнения XFA-форм используйте Firefox или заполнитель форм BentoPDF." + "xfaNoteDescription": "XFA (XML Forms Architecture) это устаревший формат, поддерживаемый только некоторыми PDF-просмотрщиками, такими как BentoPDF и Firefox. Если вы открываете XFA PDF в другом ПО и видите пустые страницы или отсутствие полей формы, значит этот просмотрщик не поддерживает XFA. Для корректного просмотра и заполнения XFA-форм используйте Firefox или заполнитель форм BentoPDF." }, "createPdfForm": { "name": "Создание PDF-форм", @@ -492,7 +507,7 @@ "dpi": "DPI (Разрешение)", "dpiExplanation": "Более высокий DPI = лучшее качество печати, больший размер файла", "compression": "Сжатие", - "compressionExplanation": "LZW и Deflate — сжатие без потерь. CCITT Group 4 лучше всего подходит для чёрно-белых отсканированных документов.", + "compressionExplanation": "LZW и Deflate: сжатие без потерь. CCITT Group 4 лучше всего подходит для чёрно-белых отсканированных документов.", "colorMode": "Цветовой режим", "multiPage": "Сохранить как многостраничный TIFF (один файл)", "loadingVips": "Загрузка обработчика изображений...", @@ -503,7 +518,8 @@ "noFile": "Нет файла", "noFileExplanation": "Сначала загрузите PDF-файл.", "conversionSuccess": "PDF успешно конвертирован в TIFF!", - "conversionError": "Не удалось конвертировать PDF в TIFF. Файл может быть повреждён." + "conversionError": "Не удалось конвертировать PDF в TIFF. Файл может быть повреждён.", + "conversionOutOfMemory": "Браузеру не хватило памяти при конвертации. Попробуйте уменьшить DPI или отключите опцию многостраничного TIFF, чтобы конвертировать страницы по одной." } }, "pdfToCbz": { @@ -537,7 +553,7 @@ } }, "pdfToGreyscale": { - "name": "Градации серого", + "name": "PDF в оттенки серого", "subtitle": "Преобразовать все цвета в градации серого." }, "pdfToJson": { @@ -645,7 +661,7 @@ "invalidSplitTitle": "Недопустимая точка разделения", "invalidSplitMessage": "Точка разделения должна быть между страницей 1 и страницей {{maxSplit}}.", "unevenConfirmTitle": "Неравные блоки", - "unevenConfirmMessage": "В блоке лицевых сторон {{frontCount}} стр., в блоке оборотов — {{backCount}} стр.\nОбычно это означает, что страница отсканирована дважды или отсутствует.\n\nСтраницы без пары ({{extraCount}}) будут добавлены в конец.\n\nВсё равно продолжить?", + "unevenConfirmMessage": "В блоке лицевых сторон {{frontCount}} стр., в блоке оборотов {{backCount}} стр.\nОбычно это означает, что страница отсканирована дважды или отсутствует.\n\nСтраницы без пары ({{extraCount}}) будут добавлены в конец.\n\nВсё равно продолжить?", "invalidGroupTitle": "Недопустимый размер группы", "invalidGroupMessage": "Введите допустимое число страниц в исходном документе.", "collatingLoader": "Сборка двустороннего сканирования...", @@ -661,7 +677,7 @@ "faqOddPagesQuestion": "Что делать, если в скане нечётное число страниц?", "faqOddPagesAnswer": "При двустороннем сканировании число страниц должно быть чётным. Если это не так, страница, скорее всего, отсканирована дважды или пропущена. Инструмент предупредит вас перед обработкой, а страницы без пары будут добавлены в конец, чтобы ничего не потерялось.", "faqBackOrderQuestion": "Зачем оставлять блок оборотов без изменений?", - "faqBackOrderAnswer": "Это зависит от того, как стопка подавалась на втором проходе. Если перевернуть всю стопку целиком, обороты идут в обратном порядке — это вариант по умолчанию. Если сканер выдал их в том же порядке, что и лицевые стороны, выберите вариант «оставить без изменений»." + "faqBackOrderAnswer": "Это зависит от того, как стопка подавалась на втором проходе. Если перевернуть всю стопку целиком, обороты идут в обратном порядке: это вариант по умолчанию. Если сканер выдал их в том же порядке, что и лицевые стороны, выберите вариант «оставить без изменений»." }, "addAttachments": { "name": "Добавление вложений", @@ -990,8 +1006,7 @@ "subtitle": "Извлечь текст из документа в текстовом формате (.txt). Поддерживает несколько файлов.", "noteLabel": "Примечание:", "noteText": "Этот инструмент работает ТОЛЬКО с PDF-файлами, созданными в цифровой форме. Для отсканированных документов или PDF на основе изображений используйте наш инструмент OCR PDF.", - "convertButton": "Извлечь текст", - "note": "Данный инструмент работает ТОЛЬКО с PDF-файлами, созданными электронно. Для отсканированных документов или PDF-файлов, основывающихся на изображениях, используйте инструмент «Распознавание текста в PDF»." + "convertButton": "Извлечь текст" }, "digitalSignPdf": { "name": "Цифровая подпись PDF", @@ -1067,7 +1082,7 @@ "relatedSanitizeDesc": "Удалить скрытые данные", "relatedPermissionsDesc": "Установить права PDF", "faqWhatIsQuestion": "Что такое цифровая подпись?", - "faqWhatIsAnswer": "Цифровая подпись — это криптографический механизм, проверяющий подлинность и целостность документа. В отличие от нарисованной подписи, она использует криптографию с открытым ключом (сертификаты X.509) для подтверждения личности подписавшего.", + "faqWhatIsAnswer": "Цифровая подпись: это криптографический механизм, проверяющий подлинность и целостность документа. В отличие от нарисованной подписи, она использует криптографию с открытым ключом (сертификаты X.509) для подтверждения личности подписавшего.", "faqFormatsQuestion": "Какие форматы сертификатов поддерживаются?", "faqFormatsAnswer": "Мы поддерживаем сертификаты в формате PKCS#12 (.pfx, .p12), которые содержат ваш сертификат и закрытый ключ в одном зашифрованном файле. Обычно их выдают центры сертификации.", "faqPrivateKeyQuestion": "Безопасен ли мой закрытый ключ?", @@ -1082,7 +1097,7 @@ "validateSignaturePdf": { "name": "Проверка подписи в PDF", "pageTitle": "Проверить подпись в PDF - проверить цифровые подписи | BentoPDF", - "subtitle": "Проверить цифровые подписи в документах. Проверить срок действия сертификата, просмотреть сведения о подписанте и подтвердить действительность документа — всё это, не покидая браузер." + "subtitle": "Проверить цифровые подписи в документах. Проверить срок действия сертификата, просмотреть сведения о подписанте и подтвердить действительность документа, и всё это, не покидая браузер." }, "timestampPdf": { "name": "Метка времени PDF", @@ -1189,7 +1204,7 @@ "workerError": "Ошибка worker: {{message}}", "alternateMergeWorkerError": "Ошибка worker чередующегося слияния: {{message}}", "noPdfFilesUploaded": "В узел PDF-вход не загружены PDF-файлы", - "failedToLoadFile": "Не удалось загрузить \"{{file}}\" — файл может быть повреждён", + "failedToLoadFile": "Не удалось загрузить \"{{file}}\": файл может быть повреждён", "noImagesUploaded": "В узел Изображение-вход не загружены изображения", "noWordDocsUploaded": "В узел Word-вход не загружены документы", "noExcelUploaded": "В узел Excel-вход не загружены электронные таблицы", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Безусловно! Вся обработка происходит в вашем браузере. Ваши файлы никогда не покидают ваше устройство, обеспечивая полную конфиденциальность." }, "unlockPdf": { - "name": "Расшифровка документа", + "name": "Разблокировка PDF", "subtitle": "Снять защиту документа, удалив пароль." }, "protectPdf": { - "name": "Шифрование документа", + "name": "Защита PDF", "subtitle": "Защитить документ с помощью пароля." } } diff --git a/public/locales/ru/ui.json b/public/locales/ru/ui.json new file mode 100644 index 00000000..99dbe20e --- /dev/null +++ b/public/locales/ru/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(исправлено)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} КБ)", + "+ {{n}} more...": "+ ещё {{n}}...", + "- Error parsing XMP XML. Displaying raw. -": "- Ошибка разбора XMP XML. Показан исходный текст. -", + "- No Info Dictionary data found -": "- Данные Info Dictionary не найдены -", + "- No XMP metadata found -": "- Метаданные XMP не найдены -", + "- No interactive form fields found -": "- Интерактивные поля формы не найдены -", + "- No parseable XMP properties found -": "- Читаемые свойства XMP не найдены -", + "-- Select existing group --": "-- Выберите существующую группу --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (очень чувствительно)", + "0.5° (Default)": "0,5° (по умолчанию)", + "1.0° (Normal)": "1,0° (обычная)", + "100 (Fast)": "100 (быстро)", + "150 (Default)": "150 (по умолчанию)", + "1x2 (Booklet)": "1x2 (буклет)", + "2.0° (Less Sensitive)": "2,0° (менее чувствительно)", + "200 (Better)": "200 (лучше)", + "200 (Good)": "200 (хорошо)", + "2x2 (4-up)": "2x2 (4 на лист)", + "2x4 (8-up)": "2x4 (8 на лист)", + "300 (Best Quality)": "300 (наилучшее качество)", + "300 (Print)": "300 (печать)", + "4x4 (16-up)": "4x4 (16 на лист)", + "600 (High Quality)": "600 (высокое качество)", + "72 (Screen)": "72 (экран)", + "90° Clockwise": "90° по часовой стрелке", + "90° Counter-clockwise": "90° против часовой стрелки", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Поле с именем \"{{fieldName}}\" уже существует. Переименуйте это поле, чтобы имя было уникальным, и только потом скачивайте файл.", + "A new version of BentoPDF is available. Reload to update?": "Доступна новая версия BentoPDF. Перезагрузить страницу для обновления?", + "A single PDF file": "Один PDF-файл", + "A template with this name already exists.": "Шаблон с таким именем уже существует.", + "ASCII characters (letters, numbers, symbols)": "Символы ASCII (буквы, цифры, знаки)", + "Action": "Действие", + "Add Blank Page": "Добавить пустую страницу", + "Add Bookmark": "Добавить закладку", + "Add Child Bookmark": "Добавить дочернюю закладку", + "Add Child Layer": "Добавить дочерний слой", + "Add More Comics": "Добавить ещё комиксы", + "Add More Documents": "Добавить ещё документы", + "Add More EPUB Files": "Добавить ещё файлы EPUB", + "Add More Email Files": "Добавить ещё файлы электронной почты", + "Add More FB2 Files": "Добавить ещё файлы FB2", + "Add More Files": "Добавить ещё файлы", + "Add More Images": "Добавить ещё изображения", + "Add More JSON Files": "Добавить ещё файлы JSON", + "Add More MOBI Files": "Добавить ещё файлы MOBI", + "Add More Markdown Files": "Добавить ещё файлы Markdown", + "Add More ODG Files": "Добавить ещё файлы ODG", + "Add More PUB Files": "Добавить ещё файлы PUB", + "Add More Pages Files": "Добавить ещё файлы Pages", + "Add More Presentations": "Добавить ещё презентации", + "Add More SVG Files": "Добавить ещё файлы SVG", + "Add More Spreadsheets": "Добавить ещё таблицы", + "Add More Text Files": "Добавить ещё текстовые файлы", + "Add More Visio Files": "Добавить ещё файлы Visio", + "Add More WPD Files": "Добавить ещё файлы WPD", + "Add More WPS Files": "Добавить ещё файлы WPS", + "Add More XML Files": "Добавить ещё файлы XML", + "Add More XPS Files": "Добавить ещё файлы XPS", + "Add a new layer to get started!": "Добавьте новый слой, чтобы начать!", + "Add a text box": "Добавить текстовое поле", + "Add an RFC 3161 document timestamp": "Добавить метку времени RFC 3161 к документу", + "Add an image": "Добавить изображение", + "Add at least one node to run the workflow.": "Добавьте хотя бы один узел, чтобы запустить рабочий процесс.", + "Add child": "Добавить дочерний", + "Add child layer": "Добавить дочерний слой", + "Add header and footer text": "Добавить текст верхнего и нижнего колонтитулов", + "Add page numbers": "Добавить номера страниц", + "Add searchable text layer via OCR": "Добавить слой с возможностью поиска через OCR", + "Add text watermark": "Добавить текстовый водяной знак", + "Add/Edit/Extract Attachments": "Добавление, редактирование и извлечение вложений", + "Added": "Добавлено", + "Added \"{{afterText}}\"": "Добавлено \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Добавлено изображение ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "Пустая страница успешно добавлена: {{insertCount}}!", + "Added {{insertCount}} blank pages successfully!": "Пустые страницы успешно добавлены: {{insertCount}}!", + "Adding header & footer...": "Добавление колонтитулов...", + "Adding page numbers...": "Добавление номеров страниц...", + "Adding watermark...": "Добавление водяного знака...", + "Adding {{insertCount}} blank page...": "Добавление пустой страницы ({{insertCount}})...", + "Adding {{insertCount}} blank pages...": "Добавление пустых страниц ({{insertCount}})...", + "Adding {{name}} ({{n}}/{{length}})...": "Добавление {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Настройка цветов", + "Adjust brightness, contrast, and colors": "Настройте яркость, контраст и цвета", + "Advanced": "Дополнительно", + "Advanced Feature Required": "Нужна расширенная функция", + "Advanced Settings": "Расширенные настройки", + "After Page": "После страницы", + "After Page...": "После страницы...", + "Align Objects": "Выравнивание объектов", + "Alignment": "Выравнивание", + "All": "Все", + "All files repaired successfully!": "Все файлы успешно восстановлены!", + "Alternate Merge": "Чередующееся объединение", + "Alternating and mixing pages...": "Чередование и смешивание страниц...", + "Always resample to that resolution": "Всегда пересэмплировать до этого разрешения", + "An error occurred during compression. Error: {{error}}": "Ошибка при сжатии. Ошибка: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Ошибка при конвертации. Ошибка: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Ошибка при конвертации. Ошибка: {{message}}", + "An error occurred during cropping.": "Ошибка при обрезке.", + "An error occurred during extraction. Error: {{error}}": "Ошибка при извлечении. Ошибка: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Ошибка при растеризации. Ошибка: {{error}}", + "An error occurred during sanitization: {{msg}}": "Ошибка при очистке: {{msg}}", + "An error occurred while combining pages.": "Ошибка при объединении страниц.", + "An error occurred while creating the N-Up PDF.": "Ошибка при создании PDF с несколькими страницами на листе.", + "An error occurred while creating the booklet.": "Ошибка при создании буклета.", + "An error occurred while dividing the PDF.": "Ошибка при разделении PDF.", + "An error occurred while mixing the PDFs.": "Ошибка при смешивании PDF.", + "An error occurred while standardizing pages.": "Ошибка при приведении страниц к единому размеру.", + "An error occurred while trying to remove metadata.": "Ошибка при удалении метаданных.", + "An error occurred: {{error}}": "Произошла ошибка: {{error}}", + "An error occurred: {{error}}.": "Произошла ошибка: {{error}}.", + "An owner password is required when setting permissions": "Для настройки разрешений необходим пароль владельца", + "An unexpected error occurred during the repair process.": "Во время восстановления произошла непредвиденная ошибка.", + "An unexpected error occurred.": "Произошла непредвиденная ошибка.", + "Analyzing data structure...": "Анализ структуры данных...", + "Analyzing full PDF metadata...": "Анализ полных метаданных PDF...", + "Analyzing signatures...": "Анализ подписей...", + "Angle": "Угол", + "Annotations removed successfully!": "Примечания успешно удалены!", + "Any text, URL, or data": "Любой текст, URL или данные", + "Application": "Приложение", + "Apply a digital signature to PDF": "Применить цифровую подпись к PDF", + "Apply and download": "Применить и скачать", + "Apply redactions?": "Применить вымарывание?", + "Apply scanner simulation effect": "Применить эффект имитации сканера", + "Applying Bates numbers...": "Применение нумерации Бейтса...", + "Applying color adjustments...": "Применение настроек цвета...", + "Applying crop...": "Применение обрезки...", + "Applying redactions...": "Применение вымарывания...", + "Applying rotations...": "Применение поворотов...", + "Applying scanner effect...": "Применение эффекта сканера...", + "Applying timestamp...": "Применение метки времени...", + "Applying {{replace}}...": "Применение: {{replace}}...", + "Archive contains an oversized image entry.": "Архив содержит слишком большое изображение.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "В архиве слишком много изображений (максимум {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Архив слишком велик после распаковки.", + "Are you sure you want to reset? All your work will be lost.": "Точно сбросить? Вся ваша работа будет потеряна.", + "Area (Coordinates)": "Область (координаты)", + "Area ({{unit}}²)": "Площадь ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman и Courier New заменяются встроенными аналогами. Применяется, только если это безопасно.", + "Arrange multiple pages per sheet": "Расположить несколько страниц на одном листе", + "Arrange pages for booklet printing": "Расположить страницы для печати буклета", + "Aspect Ratio": "Соотношение сторон", + "At least one PDF document is required for export.": "Для экспорта нужен хотя бы один документ PDF.", + "At least two valid PDFs are required.": "Нужно как минимум два корректных PDF.", + "Attaching files to PDF...": "Прикрепление файлов к PDF...", + "Attachments updated successfully!": "Вложения успешно обновлены!", + "Author": "Автор", + "Auto (Keep Original)": "Авто (сохранить исходный)", + "Back": "Оборот", + "Back to Home": "Назад на главную", + "Background Color": "Цвет фона", + "Background color changed successfully!": "Цвет фона успешно изменён!", + "Barcode": "Штрихкод", + "Barcode Format": "Формат штрихкода", + "Barcode Value": "Значение штрихкода", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Нумерация Бейтса применена успешно! (с {{batesStart}} по {{n}})", + "Beginning": "В начало", + "Binarize": "Бинаризация", + "Blank Position": "Положение пустой страницы", + "Blue": "Синий", + "Blur": "Размытие", + "Bold": "Полужирный", + "Bold & Italic": "Жирный курсив", + "Booklet": "Буклет", + "Booklet created with {{numSheets}} sheets!": "Буклет создан, листов: {{numSheets}}!", + "Bookmarks imported from JSON!": "Закладки импортированы из JSON!", + "Bookmarks page": "Страница закладок", + "Border": "Граница", + "Border Color": "Цвет границы", + "Bottom": "Снизу", + "Bottom Center": "Снизу по центру", + "Bottom Left": "Снизу слева", + "Bottom Right": "Снизу справа", + "Bottom edge in points": "Нижний край в пунктах", + "Brightness": "Яркость", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli и растеризация пропущены, чтобы сохранить PDF/A.", + "Brotli compression (PDF 2.0)": "Сжатие Brotli (PDF 2.0)", + "Browser Note:": "Примечание о браузере:", + "Building new PDF...": "Создание нового PDF...", + "Building page pairing model...": "Построение модели парных страниц...", + "Button": "Кнопка", + "ByteRange does not start at the beginning of the file": "ByteRange не начинается с начала файла", + "ByteRange out of bounds": "ByteRange выходит за границы", + "CBZ to PDF": "CBZ в PDF", + "CSV Loaded": "CSV загружен", + "CSV file is empty": "Файл CSV пуст", + "Cancel": "Отмена", + "Cannot Delete": "Удаление невозможно", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Нет доступа к элементам управления просмотрщика. Используйте кнопку «Скачать» на панели инструментов просмотрщика PDF выше.", + "Cannot delete all pages": "Нельзя удалить все страницы", + "Cannot delete all pages.": "Нельзя удалить все страницы.", + "Canvas context failed": "Не удалось создать контекст холста", + "Canvas context unavailable": "Контекст холста недоступен", + "Canvas toBlob conversion failed.": "Не удалось преобразовать холст в Blob.", + "Canvas toBlob failed": "Не удалось выполнить toBlob для холста", + "Center": "По центру", + "Certificate (.pfx, .p12, .pem)": "Сертификат (.pfx, .p12, .pem)", + "Certificate Expired": "Срок действия сертификата истёк", + "Certificate Password": "Пароль сертификата", + "Certificate unlocked": "Сертификат разблокирован", + "Change Certificate": "Сменить сертификат", + "Change background color": "Изменить цвет фона", + "Changing background color...": "Изменение цвета фона...", + "Changing text color...": "Изменение цвета текста...", + "Character": "Символ", + "Checked State": "Состояние «отмечено»", + "Choose a valid page range.": "Выберите корректный диапазон страниц.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Выберите один из встроенных языков или пересоберите изолированный пакет, добавив нужный язык в --ocr-languages.", + "Cleanup": "Очистка", + "Click on PDF to Pick Location": "Нажмите на PDF, чтобы выбрать место", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Нажмите кнопку выше, затем нажмите на PDF в том месте, куда должна вести закладка", + "Click to Upload Image": "Нажмите, чтобы загрузить изображение", + "Clicking this field in the PDF will open a file picker to upload an image.": "Нажатие на это поле в PDF откроет окно выбора файла для загрузки изображения.", + "Clip invisible parts of images": "Обрезать невидимые части изображений", + "Close": "Закрыть", + "Close (Esc)": "Закрыть (Esc)", + "Close panel": "Закрыть панель", + "Closes tab": "Закрывает вкладку", + "Closes window": "Закрывает окно", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (закладки и метаданные)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF не настроен. Настройте его в параметрах WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF вернул пустой расшифрованный файл.", + "CoherentPDF: not configured.": "CoherentPDF: не настроен.", + "Color": "Цвет", + "Color adjustments applied successfully!": "Настройки цвета успешно применены!", + "Colors inverted successfully!": "Цвета успешно инвертированы!", + "Cols": "Столбцы", + "Combine multiple PDFs into one": "Объединить несколько PDF в один", + "Combine to Single Page": "Объединить на одну страницу", + "Combining pages...": "Объединение страниц...", + "Comic Archives": "Архивы комиксов", + "Comments and markup become part of the page. Form fields and links keep working.": "Комментарии и разметка становятся частью страницы. Поля форм и ссылки продолжают работать.", + "Complete": "Готово", + "Complete!": "Готово!", + "Compress": "Сжать", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Сжато PDF: {{compressedCount}}. Общий размер уменьшен с {{totalOriginalSize}} до {{totalCompressedSize}} (экономия {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Сжато PDF: {{compressedCount}}. Общий размер: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Сжатие нескольких PDF...", + "Compressing to {{size}}...": "Сжатие до {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Сжатие {{n}}/{{length}}: {{name}}...", + "Compressing...": "Сжатие...", + "Compression Complete": "Сжатие завершено", + "Compression Finished": "Сжатие завершено", + "Compression Level": "Уровень сжатия", + "Configure": "Настроить", + "Confirm": "Подтвердить", + "Confirm Action": "Подтверждение действия", + "Conformance": "Соответствие", + "Connected": "Подключено", + "Contact Info": "Контактная информация", + "Content": "Содержимое", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Хеш содержимого не совпадает с атрибутом messageDigest: PDF был изменён после подписания", + "Contrast": "Контраст", + "Conversion Complete": "Конвертация завершена", + "Conversion Error": "Ошибка конвертации", + "Conversion engine ready!": "Движок конвертации готов!", + "Conversion failed: could not create PDF/A definition": "Конвертация не удалась: не удалось создать определение PDF/A", + "Convert Apple Pages documents to PDF": "Конвертировать документы Apple Pages в PDF", + "Convert EPUB ebooks to PDF": "Конвертировать электронные книги EPUB в PDF", + "Convert Excel spreadsheets to PDF": "Конвертировать таблицы Excel в PDF", + "Convert FB2 e-books to PDF": "Конвертировать электронные книги FB2 в PDF", + "Convert JSON files to PDF": "Конвертировать файлы JSON в PDF", + "Convert MOBI e-books to PDF": "Конвертировать электронные книги MOBI в PDF", + "Convert Markdown files to PDF": "Конвертировать файлы Markdown в PDF", + "Convert Microsoft Publisher to PDF": "Конвертировать документы Microsoft Publisher в PDF", + "Convert OpenDocument Graphics to PDF": "Конвертировать графику OpenDocument в PDF", + "Convert PDF pages to SVG": "Конвертировать страницы PDF в SVG", + "Convert PDF pages to images (ZIP)": "Конвертировать страницы PDF в изображения (ZIP)", + "Convert PDF tables to CSV": "Конвертировать таблицы из PDF в CSV", + "Convert PDF tables to Excel": "Конвертировать таблицы из PDF в Excel", + "Convert PDF to Markdown text": "Конвертировать PDF в текст Markdown", + "Convert PDF to PDF/A for archiving": "Конвертировать PDF в PDF/A для архивного хранения", + "Convert PDF to Word document": "Конвертировать PDF в документ Word", + "Convert PowerPoint presentations to PDF": "Конвертировать презентации PowerPoint в PDF", + "Convert SVG files to PDF": "Конвертировать файлы SVG в PDF", + "Convert To Grayscale": "Конвертировать в оттенки серого", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Конвертировать диаграммы Visio (VSD/VSDX) в PDF", + "Convert WPS Office documents to PDF": "Конвертировать документы WPS Office в PDF", + "Convert Word documents to PDF": "Конвертировать документы Word в PDF", + "Convert WordPerfect documents to PDF": "Конвертировать документы WordPerfect в PDF", + "Convert XML documents to PDF": "Конвертировать документы XML в PDF", + "Convert XPS/OXPS documents to PDF": "Конвертировать документы XPS/OXPS в PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Конвертировать архивы комиксов (CBZ/CBR) в PDF", + "Convert email files (.eml, .msg) to PDF": "Конвертировать файлы электронной почты (.eml, .msg) в PDF", + "Convert fonts to vector outlines": "Конвертировать шрифты в векторные контуры", + "Convert plain text to PDF": "Конвертировать простой текст в PDF", + "Convert to grayscale": "Конвертировать в оттенки серого", + "Convert to greyscale": "Конвертировать в оттенки серого", + "Convert to image-based PDF": "Конвертировать в PDF на основе изображений", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "Конвертировано файлов: {{length}} (страниц: {{totalPages}}) в SVG!", + "Converted {{pageCount}} pages to SVG!": "Конвертировано страниц в SVG: {{pageCount}}!", + "Converter not initialized": "Конвертер не инициализирован", + "Converting BMP to PDF...": "Конвертация BMP в PDF...", + "Converting HEIC to PDF...": "Конвертация HEIC в PDF...", + "Converting TIFF to PDF...": "Конвертация TIFF в PDF...", + "Converting emails...": "Конвертация писем...", + "Converting files...": "Конвертация файлов...", + "Converting fonts to outlines...": "Конвертация шрифтов в контуры...", + "Converting images to PDF...": "Конвертация изображений в PDF...", + "Converting multiple PDFs to PDF/A...": "Конвертация нескольких PDF в PDF/A...", + "Converting multiple RTF files to PDF...": "Конвертация нескольких файлов RTF в PDF...", + "Converting multiple files...": "Конвертация нескольких файлов...", + "Converting page {{n}} of {{pageCount}}...": "Конвертация страницы {{n}} из {{pageCount}}...", + "Converting to Markdown...": "Конвертация в Markdown...", + "Converting to SVG...": "Конвертация в SVG...", + "Converting to greyscale...": "Конвертация в оттенки серого...", + "Converting to {{level}}...": "Конвертация в {{level}}...", + "Converting {{name}}...": "Конвертация {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Конвертация {{n}}/{{length}}: {{name}}...", + "Converting...": "Конвертация...", + "Copied": "Скопировано", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Нет доступа к экспорту PDF со штампами. Воспользуйтесь кнопкой «Экспорт → PDF» на панели инструментов просмотрщика.", + "Could not add blank page.": "Не удалось добавить пустую страницу.", + "Could not add blank pages.": "Не удалось добавить пустые страницы.", + "Could not add header or footer.": "Не удалось добавить колонтитулы.", + "Could not add page numbers.": "Не удалось добавить номера страниц.", + "Could not add the watermark.": "Не удалось добавить водяной знак.", + "Could not apply rotations.": "Не удалось применить повороты.", + "Could not change text color.": "Не удалось изменить цвет текста.", + "Could not change the background color.": "Не удалось изменить цвет фона.", + "Could not create ZIP archive.": "Не удалось создать ZIP-архив.", + "Could not create canvas context.": "Не удалось создать контекст холста.", + "Could not create comparison canvas context.": "Не удалось создать контекст холста для сравнения.", + "Could not create offscreen comparison canvas.": "Не удалось создать внеэкранный холст для сравнения.", + "Could not create visual diff context.": "Не удалось создать контекст визуального сравнения.", + "Could not create visual diff overlay context.": "Не удалось создать контекст наложения визуального сравнения.", + "Could not detect blank pages.": "Не удалось обнаружить пустые страницы.", + "Could not display the page.": "Не удалось отобразить страницу.", + "Could not export comparison PDF.": "Не удалось экспортировать PDF сравнения.", + "Could not export the signed PDF. Please try again.": "Не удалось экспортировать подписанный PDF. Попробуйте ещё раз.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Не удалось экспортировать PDF со штампами. Воспользуйтесь кнопкой «Экспорт → PDF» на панели инструментов просмотрщика.", + "Could not extract signer public key": "Не удалось извлечь открытый ключ подписанта", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Не удалось найти {{testFile}} по указанному URL (HTTP {{status}}). Убедитесь, что файл существует.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Не удалось полностью проанализировать PDF. Возможно, файл повреждён или имеет необычную структуру.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Не удалось создать предпросмотр. Файл может быть повреждён или содержать неподдерживаемые функции. Ошибка: {{message}}", + "Could not get canvas context": "Не удалось получить контекст холста", + "Could not invert PDF colors.": "Не удалось инвертировать цвета PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Не удалось загрузить PDF. Файл может быть повреждён или защищён паролем.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Не удалось загрузить PDF. Файл может быть недействительным, повреждённым или защищённым паролем.", + "Could not load the PDF engine. Please refresh the page and try again.": "Не удалось загрузить движок PDF. Обновите страницу и повторите попытку.", + "Could not parse signer info": "Не удалось разобрать сведения о подписанте", + "Could not posterize the PDF.": "Не удалось постеризовать PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Не удалось обработать «{{name}}». Файл может быть повреждён.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Не удалось уменьшить размер файла ещё сильнее. Исходный: {{originalSize}}, новый: {{compressedSize}}.", + "Could not remove annotations.": "Не удалось удалить примечания.", + "Could not remove blank pages.": "Не удалось удалить пустые страницы.", + "Could not remove leftover data from the PDF.": "Не удалось удалить остаточные данные из PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Не удалось удалить вымаранный текст из данных документа, поэтому файл не был скачан.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Не удалось перевернуть порядок страниц PDF. Проверьте, что ваши файлы являются корректными PDF.", + "Could not update metadata. Please check that date formats are correct.": "Не удалось обновить метаданные. Проверьте правильность форматов дат.", + "Count": "Количество", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Создан", + "Creating Booklet...": "Создание буклета...", + "Creating Excel file...": "Создание файла Excel...", + "Creating N-Up PDF...": "Создание PDF с несколькими страницами на листе...", + "Creating PDF from JPGs...": "Создание PDF из JPG...", + "Creating PDF from SVG files...": "Создание PDF из файлов SVG...", + "Creating PDF...": "Создание PDF...", + "Creating ZIP archive...": "Создание ZIP-архива...", + "Creating ZIP file...": "Создание ZIP-файла...", + "Creating ZIP...": "Создание ZIP...", + "Creating table...": "Создание таблицы...", + "Creator": "Создатель", + "Crop": "Обрезка", + "Crop complete! Your download has started.": "Обрезка завершена! Скачивание началось.", + "Cryptographic verification failed": "Криптографическая проверка не пройдена", + "Custom": "Свой", + "Custom Format": "Свой формат", + "Custom Height": "Своя высота", + "Custom Units": "Свои единицы", + "Custom Width": "Своя ширина", + "Custom Zoom": "Свой масштаб", + "Custom...": "Свой...", + "DataMatrix": "DataMatrix", + "Date Format": "Формат даты", + "Decrease size": "Уменьшить размер", + "Decrypt": "Расшифровать", + "Decrypting PDF...": "Расшифровка PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Расшифровка {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Расшифровка {{n}} из {{length}}: {{name}}", + "Decrypting...": "Расшифровка...", + "Decryption Failed": "Не удалось расшифровать", + "Delete": "Удалить", + "Delete \"{{title}}\"?": "Удалить «{{title}}»?", + "Delete Field": "Удалить поле", + "Delete Page": "Удалить страницу", + "Delete Pages": "Удалить страницы", + "Delete all {{length}} bookmark(s) ? ": "Удалить все закладки ({{length}})? ", + "Delete layer": "Удалить слой", + "Delete {{size}} bookmark(s) ? ": "Удалить закладки ({{size}})? ", + "Deleted": "Удалено", + "Deleted {{size}} page(s) successfully!": "Страниц успешно удалено: {{size}}!", + "Deleting pages...": "Удаление страниц...", + "Description": "Описание", + "Description for screen readers": "Описание для программ чтения с экрана", + "Deselect All": "Снять выделение", + "Deskew": "Выравнивание", + "Deskew PDF": "Выравнивание PDF", + "Deskewed {{length}} file(s). {{value}}": "Выровнено файлов: {{length}}. {{value}}", + "Deskewing {{name}}...": "Выравнивание {{name}}...", + "Destination": "Назначение", + "Detecting blank pages...": "Поиск пустых страниц...", + "Digest Algorithm:": "Алгоритм хеширования:", + "Digital Sign": "Цифровая подпись", + "Direction": "Направление", + "Divide Pages": "Разделить страницы", + "Divide into boxes (0 to disable)": "Разделить на блоки (0, чтобы отключить)", + "Document Properties": "Свойства документа", + "Document Type": "Тип документа", + "Document properties": "Свойства документа", + "Document-level attachment": "Вложение уровня документа", + "Done: back to tools": "Готово, вернуться к инструментам", + "Download": "Скачать", + "Download Edited PDF": "Скачать изменённый PDF", + "Download anyway": "Всё равно скачать", + "Download as PDF or ZIP automatically": "Скачивать автоматически как PDF или ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Файлов PDF скачано в ZIP-архиве: {{length}}.", + "Downloads started for all files.": "Скачивание всех файлов началось.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Удаляет теги, на которые опираются программы чтения с экрана.", + "Duplicate Field Name": "Повторяющееся имя поля", + "Duplicate Field Names": "Повторяющиеся имена полей", + "Duplicate Page": "Дублировать страницу", + "Duplicate Page Numbers": "Повторяющиеся номера страниц", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Подпись ECDSA не подтверждается открытым ключом подписанта", + "EPUB Files": "Файлы EPUB", + "EPUB to PDF": "EPUB в PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ в PDF", + "Edit": "Изменить", + "Edit All": "Изменить всё", + "Edit Bookmark": "Изменить закладку", + "Edit Bookmarks": "Редактирование закладок", + "Edit Images": "Редактировать изображения", + "Edit Metadata": "Редактирование метаданных", + "Edit PDF metadata": "Редактировать метаданные PDF", + "Edit Scope": "Область редактирования", + "Edit Shapes": "Редактировать фигуры", + "Edit Text": "Редактировать текст", + "Edit tool": "Инструмент редактирования", + "Edit {{scopes}}": "Редактировать: {{scopes}}", + "Email Files": "Файлы электронной почты", + "Email to PDF": "Email в PDF", + "Embedding files into PDF...": "Встраивание файлов в PDF...", + "Empty signature bytes": "Пустые байты подписи", + "Encrypt": "Зашифровать", + "Encrypt PDF with password": "Зашифровать PDF паролем", + "Encrypted file": "Зашифрованный файл", + "Encrypting PDF with 256-bit AES...": "Шифрование PDF с помощью 256-битного AES...", + "Encryption Failed": "Не удалось зашифровать", + "Encryption resulted in an empty file.": "Шифрование привело к пустому файлу.", + "End": "В конец", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Введите 0, чтобы вставить в начало, или {{pageCount}}, чтобы вставить в конец.", + "Enter bookmark title": "Введите название закладки", + "Enter name for child layer under \"{{Layer}}\":": "Введите имя для дочернего слоя в «{{Layer}}»:", + "Enter password": "Введите пароль", + "Enter password...": "Введите пароль...", + "Enter passwords for each encrypted file": "Введите пароли для каждого зашифрованного файла", + "Error": "Ошибка", + "Error during execution": "Ошибка при выполнении", + "Error generating PDF: {{error}}": "Ошибка при создании PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Ошибка при загрузке файла PDF. Повторите попытку с корректным PDF.", + "Error reading files: {{error}}": "Ошибка при чтении файлов: {{error}}", + "Error saving PDF. Check console for details.": "Ошибка при сохранении PDF. Подробности в консоли.", + "Error: {{error}}": "Ошибка: {{error}}", + "Exactly 11 or 12 digits": "Ровно 11 или 12 цифр", + "Exactly 12 or 13 digits": "Ровно 12 или 13 цифр", + "Example of current format:": "Пример текущего формата:", + "Excel to PDF": "Excel в PDF", + "Existing Radio Groups": "Существующие группы переключателей", + "Export Error": "Ошибка экспорта", + "Export Value": "Экспортируемое значение", + "Export failed": "Не удалось экспортировать", + "External processing module needed": "Нужен внешний модуль обработки", + "Extract Images": "Извлечение изображений", + "Extract Pages": "Извлечение страниц", + "Extract Tables": "Извлечение таблиц", + "Extract a range of pages": "Извлечь диапазон страниц", + "Extract all images from PDF": "Извлечь все изображения из PDF", + "Extract pages as separate PDFs": "Извлечь страницы как отдельные PDF", + "Extract text from PDF": "Извлечь текст из PDF", + "Extracted 1 table successfully!": "Таблица успешно извлечена!", + "Extracted text from {{length}} PDF files!": "Текст извлечён из файлов PDF: {{length}}!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Извлечено PDF: {{completed}}, не удалось: {{failed}}.", + "Extracted {{length}} page(s) successfully!": "Страниц успешно извлечено: {{length}}!", + "Extracted {{length}} table(s) to Excel!": "Таблиц извлечено в Excel: {{length}}!", + "Extracted {{length}} tables successfully!": "Таблиц успешно извлечено: {{length}}!", + "Extracting attachments from {{length}} file(s)...": "Извлечение вложений из файлов: {{length}}...", + "Extracting images from {{name}}...": "Извлечение изображений из {{name}}...", + "Extracting pages...": "Извлечение страниц...", + "Extracting tables...": "Извлечение таблиц...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Извлечение текста из файла {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Извлечение текста из нескольких файлов...", + "Extracting text from {{name}}...": "Извлечение текста из {{name}}...", + "Extracting text...": "Извлечение текста...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Подготовка {{name}} для ИИ ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Подготовка {{name}} для ИИ...", + "Extracting...": "Извлечение...", + "Extraction Complete": "Извлечение завершено", + "Extraction Error": "Ошибка извлечения", + "Extraction Partial": "Извлечено частично", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Извлечение завершено! Вложений в ZIP-файле: {{length}} ({{totalSize}}). Скачивание началось.", + "FB2 Files": "Файлы FB2", + "FB2 to PDF": "FB2 в PDF", + "Failed": "Ошибка", + "Failed to acquire 2D canvas context": "Не удалось получить 2D-контекст холста", + "Failed to add child layer": "Не удалось добавить дочерний слой", + "Failed to apply Bates numbers.": "Не удалось применить нумерацию Бейтса.", + "Failed to apply color adjustments. The file might be corrupted.": "Не удалось применить настройки цвета. Файл может быть повреждён.", + "Failed to apply redactions.": "Не удалось применить вымарывание.", + "Failed to apply scanner effect. The file might be corrupted.": "Не удалось применить эффект сканера. Файл может быть повреждён.", + "Failed to attach files: {{error}}": "Не удалось прикрепить файлы: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Не удалось конвертировать BMP в PDF. Один из файлов может быть недействительным.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Не удалось конвертировать HEIC в PDF. Один из файлов может быть недействительным.", + "Failed to convert PDF to CSV. {{message}}": "Не удалось конвертировать PDF в CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Не удалось конвертировать PDF в Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Не удалось конвертировать PDF в SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Не удалось конвертировать PDF в оттенки серого. Файл может быть повреждён.", + "Failed to convert PDF. It may be image-based or corrupted.": "Не удалось конвертировать PDF. Возможно, он состоит из изображений или повреждён.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Не удалось конвертировать TIFF в PDF. Один из файлов может быть недействительным.", + "Failed to convert images to PDF.": "Не удалось конвертировать изображения в PDF.", + "Failed to convert text to PDF. {{error}}": "Не удалось конвертировать текст в PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Не удалось конвертировать {{filename}} в PNG", + "Failed to copy metadata to clipboard.": "Не удалось скопировать метаданные в буфер обмена.", + "Failed to create PDF.": "Не удалось создать PDF.", + "Failed to create PNG blob": "Не удалось создать PNG blob", + "Failed to create canvas context": "Не удалось создать контекст холста", + "Failed to create split PDFs.": "Не удалось создать разделённые PDF.", + "Failed to decode image: {{name}}": "Не удалось декодировать изображение: {{name}}", + "Failed to decrypt private key": "Не удалось расшифровать закрытый ключ", + "Failed to decrypt. Try the Decrypt tool instead.": "Не удалось расшифровать. Попробуйте вместо этого инструмент расшифровки.", + "Failed to delete layer": "Не удалось удалить слой", + "Failed to delete pages.": "Не удалось удалить страницы.", + "Failed to deskew PDF: {{error}}": "Не удалось выровнять PDF: {{error}}", + "Failed to download the edited PDF.": "Не удалось скачать изменённый PDF.", + "Failed to edit attachments.": "Не удалось изменить вложения.", + "Failed to extract certificate from PFX file": "Не удалось извлечь сертификат из файла PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Не удалось извлечь страницы (код выхода qpdf: {{exitCode}}).", + "Failed to extract pages.": "Не удалось извлечь страницы.", + "Failed to extract tables. {{message}}": "Не удалось извлечь таблицы. {{message}}", + "Failed to extract text from PDF.": "Не удалось извлечь текст из PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Не удалось получить профиль ICC с {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Не удалось получить файл шрифта: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Не удалось получить gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Не удалось получить {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Не удалось получить 2D-контекст для страницы {{pageNumber}}", + "Failed to get canvas context": "Не удалось получить контекст холста", + "Failed to insert PDF. The file may be corrupted.": "Не удалось вставить PDF. Файл может быть повреждён.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Не удалось загрузить Ghostscript с {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Не удалось загрузить файл PDF.", + "Failed to load PDF for cropping.": "Не удалось загрузить PDF для обрезки.", + "Failed to load PDF for preview.": "Не удалось загрузить PDF для предпросмотра.", + "Failed to load PDF form viewer.": "Не удалось загрузить просмотрщик форм PDF.", + "Failed to load PDF layers": "Не удалось загрузить слои PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Не удалось загрузить PyMuPDF с CDN: {{msg}}", + "Failed to load SVG image": "Не удалось загрузить изображение SVG", + "Failed to load WebP image": "Не удалось загрузить изображение WebP", + "Failed to load attachments from PDF.": "Не удалось загрузить вложения из PDF.", + "Failed to load files: {{error}}": "Не удалось загрузить файлы: {{error}}", + "Failed to load image.": "Не удалось загрузить изображение.", + "Failed to load image: {{filename}}": "Не удалось загрузить изображение: {{filename}}", + "Failed to load one or more PDF files.": "Не удалось загрузить один или несколько файлов PDF.", + "Failed to load script: {{url}}": "Не удалось загрузить скрипт: {{url}}", + "Failed to load template.": "Не удалось загрузить шаблон.", + "Failed to load the PDF Editor.": "Не удалось загрузить редактор PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Не удалось загрузить обработчик изображений. Убедитесь, что ваш браузер поддерживает SharedArrayBuffer (нужен HTTPS или localhost).", + "Failed to parse CSV: {{error}}": "Не удалось разобрать CSV: {{error}}", + "Failed to parse signature": "Не удалось разобрать подпись", + "Failed to parse the certificate file.": "Не удалось разобрать файл сертификата.", + "Failed to process HEIC file: {{name}}": "Не удалось обработать файл HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Не удалось обработать файл WebP: {{name}}", + "Failed to read file.": "Не удалось прочитать файл.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Не удалось снять ограничения. Для этого PDF может потребоваться правильный пароль владельца.", + "Failed to render page": "Не удалось отобразить страницу", + "Failed to render page previews": "Не удалось отобразить превью страниц", + "Failed to render page previews.": "Не удалось отобразить превью страниц.", + "Failed to render page.": "Не удалось отобразить страницу.", + "Failed to save changes.": "Не удалось сохранить изменения.", + "Failed to save the new PDF. Check console for details.": "Не удалось сохранить новый PDF. Подробности в консоли.", + "Failed to split PDF. Please check your selection.": "Не удалось разделить PDF. Проверьте свой выбор.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Не удалось поставить метку времени на PDF: {{message}}\n\nПопробуйте другой сервер TSA или проверьте подключение к интернету.", + "Failed to toggle layer visibility": "Не удалось переключить видимость слоя", + "Failed to validate signatures. The file may be corrupted.": "Не удалось проверить подписи. Файл может быть повреждён.", + "Features enabled by this module:": "Возможности, которые включает этот модуль:", + "Field Name": "Имя поля", + "Field Name (Group Name)": "Имя поля (Имя группы)", + "Field Name Conflict": "Конфликт имён полей", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Имя поля «{{newName}}» уже существует в этом элементе ({{value}}). Попробуйте использовать уникальное имя.", + "Field name cannot be empty": "Имя поля не может быть пустым", + "File": "Файл", + "File Size": "Размер файла", + "File exists but could not be read. Check CORS configuration.": "Файл существует, но его не удалось прочитать. Проверьте настройку CORS.", + "File list not found": "Список файлов не найден", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Размер файла уменьшен с {{originalSize}} до {{compressedSize}} (экономия {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Файл {{n}}/{{length}}: страница {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Файл {{n}}/{{length}}: {{message}}", + "Filename": "Имя файла", + "Files that failed: {{errorCount}}.": "Файлы с ошибками: {{errorCount}}.", + "Fill (cover full target page)": "Заполнить (покрыть всю страницу)", + "Fill Color": "Цвет заливки", + "Finalizing PDF...": "Завершение PDF...", + "Find & replace": "Найти и заменить", + "Finds the best quality under this size. 0 means no target.": "Подбирает наилучшее качество в пределах этого размера. 0 означает отсутствие цели.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox и Chrome могут показывать собственный формат выбора даты во время выбора. Правильный формат будет применён, когда вы закончите ввод даты.", + "First Indent": "Отступ первой строки", + "Fit (keep full page visible)": "Вписать (страница видна целиком)", + "Fit Page": "По размеру страницы", + "Fix Page Size": "Исправление размера страниц", + "Flatten": "Свести", + "Flatten Forms": "Свести формы", + "Flatten annotations": "Свести примечания", + "Flatten form fields": "Свести поля формы", + "Flatten forms and annotations": "Свести формы и примечания", + "Flatten links": "Свести ссылки", + "Flattening PDF...": "Сведение PDF...", + "Flattening and saving PDF...": "Сведение и сохранение PDF...", + "Flattening multiple PDFs...": "Сведение нескольких PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Сведение страницы {{i}} из {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Сведение {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Переводит фокус на адресную строку", + "Font": "Шрифт", + "Font Color": "Цвет шрифта", + "Font Family": "Семейство шрифтов", + "Font Size": "Размер шрифта", + "Font size: {{bSize}} → {{aSize}}": "Размер шрифта: {{bSize}} → {{aSize}}", + "Font to Outline": "Шрифты в контуры", + "Font: {{bFont}} → {{aFont}}": "Шрифт: {{bFont}} → {{aFont}}", + "Fonts": "Шрифты", + "Footer Center": "Нижний колонтитул по центру", + "Footer Left": "Нижний колонтитул слева", + "Footer Right": "Нижний колонтитул справа", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Для PDF только из изображений, например сканов. Пропускается, если в документе есть выделяемый текст, если не включено «Обойти защиту содержимого».", + "Form fields stop being fillable.": "Поля формы перестанут быть заполняемыми.", + "Format": "Формат", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Найдено пустых страниц: {{length}}. Нажмите на страницу, чтобы снять с неё выделение.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Найдено закладок: {{length}}. Заменить текущие закладки?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Найдено изображений: {{length}} (PDF: {{length2}}).", + "Front": "Лицевая сторона", + "Full Coverage": "Полное покрытие", + "Gamma": "Гамма", + "Generate table of contents from bookmarks": "Создать оглавление из закладок", + "Generating High-Quality PDF...": "Создание PDF высокого качества...", + "Generating PDF...": "Создание PDF...", + "Generating ZIP file...": "Создание ZIP-файла...", + "Generating formatted content...": "Создание форматированного содержимого...", + "Generating preview...": "Создание предпросмотра...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (конвертация в PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Конвертация RGB в Ghostscript завершилась с кодом выхода {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Конвертация Ghostscript завершилась с кодом выхода {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript не создал выходной файл", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript не настроен. Настройте его в расширенных настройках.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript не настроен. Настройте его в параметрах WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript не настроен. Для некоторых операций PyMuPDF требуется Ghostscript. Настройте оба в расширенных настройках.", + "Ghostscript threw an exception: {{e}}": "Ghostscript выбросил исключение: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Обёртка Ghostscript не предоставила ожидаемый интерфейс. Ожидался loadGS() или класс GhostscriptWASM.", + "Go": "Перейти", + "Go to page": "Перейти к странице", + "Grayscale": "Оттенки серого", + "Green": "Зелёный", + "Greyscale": "Оттенки серого", + "Grid Mode": "Режим сетки", + "Group Name (Must be same for group)": "Имя группы (должно совпадать для группы)", + "H-Scale %": "Масштаб по горизонтали, %", + "Hanging Indent": "Выступ", + "Hard reloads page": "Полностью перезагружает страницу", + "Header & Footer": "Колонтитулы", + "Header & Footer added successfully!": "Колонтитулы успешно добавлены!", + "Header Center": "Верхний колонтитул по центру", + "Header Left": "Верхний колонтитул слева", + "Header Right": "Верхний колонтитул справа", + "Height ({{unit}})": "Высота ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Скрыть", + "Hide Border": "Скрыть границу", + "Hide password": "Скрыть пароль", + "Hides window": "Скрывает окно", + "High (288 DPI)": "Высокое (288 DPI)", + "High (Smallest Files)": "Высокое (наименьшие файлы)", + "Horizontal": "По горизонтали", + "Hue Shift": "Сдвиг оттенка", + "Image Format": "Формат изображения", + "Image Input": "Ввод изображений", + "Image quality": "Качество изображения", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Размер изображения изменён с {{width}}×{{height}} до {{width2}}×{{height2}}", + "Images": "Изображения", + "Images above this are resampled down. None leaves resolution alone.": "Изображения выше этого значения уменьшаются. «Нет» оставляет разрешение без изменений.", + "Imported {{length}} bookmarks!": "Закладок импортировано: {{length}}!", + "Inches (in)": "Дюймы (in)", + "Include Attachments": "Включить вложения", + "Include Cc Bcc": "Включить копию и скрытую копию", + "Include this file": "Включить этот файл", + "Incorrect Page Count": "Неверное количество страниц", + "Incorrect Password": "Неверный пароль", + "Incorrect password": "Неверный пароль", + "Incorrect password. Please try again.": "Неверный пароль. Попробуйте ещё раз.", + "Increase size": "Увеличить размер", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Индексация PDF 1, страница {{pageNumber}} из {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Индексация PDF 2, страница {{pageNumber}} из {{totalPages}}...", + "Info": "Сведения", + "Info Dictionary": "Info Dictionary", + "Inherit": "Наследовать", + "Initialization Error": "Ошибка инициализации", + "Initializing Ghostscript...": "Инициализация Ghostscript...", + "Initializing PDF engine...": "Инициализация движка PDF...", + "Initializing PyMuPDF...": "Инициализация PyMuPDF...", + "Initializing decryption...": "Подготовка к расшифровке...", + "Initializing encryption...": "Подготовка к шифрованию...", + "Initializing repair engine...": "Инициализация движка восстановления...", + "Initializing...": "Инициализация...", + "Input Required": "Требуется ввод", + "Insecure Digest (MD5 / SHA-1)": "Небезопасный хеш (MD5 / SHA-1)", + "Insert blank pages": "Вставить пустые страницы", + "Insert blank pages after this page number": "Вставить пустые страницы после страницы с этим номером", + "Interactive Form Fields": "Интерактивные поля формы", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Чередовать страницы из нескольких PDF (например, нечётные + обратный порядок чётных из односторонней сканированной копии)", + "Invalid Certificate": "Недействительный сертификат", + "Invalid File": "Недействительный файл", + "Invalid Files": "Недействительные файлы", + "Invalid Input": "Недопустимый ввод", + "Invalid JSON format": "Недопустимый формат JSON", + "Invalid Name": "Недопустимое имя", + "Invalid Order": "Недопустимый порядок", + "Invalid PDF password.": "Недопустимый пароль PDF.", + "Invalid Page Numbers": "Недопустимые номера страниц", + "Invalid Page Order": "Недопустимый порядок страниц", + "Invalid Pages": "Недопустимые страницы", + "Invalid Range": "Недопустимый диапазон", + "Invalid Signature": "Недействительная подпись", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Недопустимый URL TSA. Служба меток времени должна быть корректным URL http:// или https://.", + "Invalid URL": "Недопустимый URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Недопустимый формат URL. Введите корректный URL (например, https://example.com/wasm/)", + "Invalid XML: no root element": "Недопустимый XML: нет корневого элемента", + "Invalid data": "Недопустимые данные", + "Invalid hex string in content stream": "Недопустимая шестнадцатеричная строка в потоке содержимого", + "Invalid page range specified.": "Указан недопустимый диапазон страниц.", + "Invalid shortcut format": "Недопустимый формат сочетания клавиш", + "Invalid: Cryptographic Verification Failed": "Недействительна: криптографическая проверка не пройдена", + "Invert Colors": "Инвертировать цвета", + "Invert all colors": "Инвертировать все цвета", + "Inverting PDF colors...": "Инвертирование цветов PDF...", + "Issuer": "Издатель", + "It fits the {{targetBytes}} target.": "Укладывается в целевой размер {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Всё ещё больше целевого размера {{targetBytes}}, потому что «Сохранить PDF/A» ограничивает степень сжатия.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Он больше не заявляет о соответствии PDF/A. Включите «Сохранить PDF/A» в пользовательских настройках, чтобы сохранить его.", + "Italic": "Курсив", + "Item 1": "Элемент 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Его цифровые подписи были удалены, чтобы его можно было сжать. При необходимости подпишите его снова.", + "JPEG (Smaller file size)": "JPEG (меньший размер файла)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Качество JPEG для перекодируемых изображений, от 20 до 100. Чем ниже, тем меньше файлы и заметнее артефакты.", + "JPG": "JPG", + "JSON Files": "Файлы JSON", + "JSON Loaded": "JSON загружен", + "JSON to PDF": "JSON в PDF", + "Javascript Code": "Код JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Сохраняет соответствие PDF/A. Пока опция включена, Brotli и растеризация пропускаются.", + "Keeps only the characters the document uses.": "Оставляет только символы, которые используются в документе.", + "Key (e.g., Department)": "Ключ (например, Отдел)", + "Keywords": "Ключевые слова", + "Label": "Метка", + "Label / Prompt": "Метка / подсказка", + "Landscape": "Альбомная", + "Language": "Язык", + "Layer not found": "Слой не найден", + "Layer {{number}}": "Слой {{number}}", + "Leave blank for all pages": "Оставьте пустым для всех страниц", + "Left": "Слева", + "Left edge in points (1 inch = 72 pts)": "Левый край в пунктах (1 дюйм = 72 пт)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Уровень", + "Limit recognized characters (leave empty for all)": "Ограничить распознаваемые символы (оставьте пустым для всех)", + "Line": "Линия", + "Linearization Failed": "Не удалось линеаризовать", + "Linearize": "Линеаризовать", + "Links stop being clickable.": "Ссылки перестанут быть кликабельными.", + "Lists": "Списки", + "Load": "Загрузить", + "Load system fonts": "Загрузить системные шрифты", + "Load system fonts…": "Загрузить системные шрифты…", + "Loaded": "Загружено", + "Loaded bookmarks from JSON. Now upload your PDF.": "Закладки загружены из JSON. Теперь загрузите свой PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Закладок загружено из CSV: {{length}}. Теперь загрузите свой PDF.", + "Loading Engine...": "Загрузка движка...", + "Loading Ghostscript...": "Загрузка Ghostscript...", + "Loading PDF Editor...": "Загрузка редактора PDF...", + "Loading PDF Text Editor...": "Загрузка редактора текста PDF...", + "Loading PDF converter...": "Загрузка конвертера PDF...", + "Loading PDF documents...": "Загрузка документов PDF...", + "Loading PDF engine...": "Загрузка движка PDF...", + "Loading PDF files...": "Загрузка файлов PDF...", + "Loading PDF form...": "Загрузка формы PDF...", + "Loading PDF processor...": "Загрузка обработчика PDF...", + "Loading PDF viewer...": "Загрузка просмотрщика PDF...", + "Loading PDF...": "Загрузка PDF...", + "Loading PDFs...": "Загрузка PDF...", + "Loading attachments...": "Загрузка вложений...", + "Loading comparison {{currentPage}} of {{length}}...": "Загрузка сравнения {{currentPage}} из {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Загрузка движка конвертации ({{percent}}%)...", + "Loading conversion engine...": "Загрузка движка конвертации...", + "Loading engine...": "Загрузка движка...", + "Loading fonts...": "Загрузка шрифтов...", + "Loading layers from {{name}}...": "Загрузка слоёв из {{name}}...", + "Loading page {{num}}...": "Загрузка страницы {{num}}...", + "Loading preview...": "Загрузка предпросмотра...", + "Loading {{name}}...": "Загрузка {{name}}...", + "Loading...": "Загрузка...", + "Location": "Расположение", + "Lossless (No Quality Loss)": "Без потерь (без потери качества)", + "Lossless (no image re-encoding)": "Без потерь (без перекодирования изображений)", + "Low (Best Quality)": "Низкое (наилучшее качество)", + "MOBI Files": "Файлы MOBI", + "MOBI to PDF": "MOBI в PDF", + "Malformed ByteRange": "Некорректный ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Некорректная подпись ECDSA (не удалось разобрать r, s)", + "Malformed inline image in content stream": "Некорректное встроенное изображение в потоке содержимого", + "Malformed signatureAlgorithm": "Некорректный signatureAlgorithm", + "Margins": "Поля", + "Markdown Files": "Файлы Markdown", + "Markdown to PDF": "Markdown в PDF", + "Max Length (0 for unlimited)": "Максимальная длина (0 без ограничений)", + "Maximum resolution": "Максимальное разрешение", + "Medium (Recommended)": "Среднее (рекомендуется)", + "Merge PDF": "Объединение PDF", + "Merge PDFs": "Объединить PDF", + "Merge duplicate fonts": "Объединить повторяющиеся шрифты", + "Mermaid Error: {{error}}": "Ошибка Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Метаданные скопированы в буфер обмена в формате JSON.", + "Metadata removed successfully!": "Метаданные успешно удалены!", + "Metadata updated successfully!": "Метаданные успешно обновлены!", + "Millimeters (mm)": "Миллиметры (мм)", + "Minimizes window": "Сворачивает окно", + "Missing Files": "Отсутствуют файлы", + "Missing signatureAlgorithm": "Отсутствует signatureAlgorithm", + "Mixed Page Sizes Detected": "Обнаружены страницы разных размеров", + "Mixed Sizes": "Разные размеры", + "Mode": "Режим", + "Modified": "Изменено", + "Modified After Signing (signed part intact)": "Изменён после подписания (подписанная часть не затронута)", + "More": "Ещё", + "Moved": "Перемещено", + "Moved \"{{value}}\"": "Перемещено: «{{value}}»", + "Multi-line": "Многострочное", + "Must be a positive integer": "Должно быть положительным целым числом", + "Must be a positive number": "Должно быть положительным числом", + "N must be at least 1.": "N должно быть не меньше 1.", + "N-Up": "Несколько страниц на листе", + "N-Up PDF created successfully!": "PDF с несколькими страницами на листе успешно создан!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Ошибка сети: не удалось подключиться по URL. Проверьте, что URL указан верно и сервер разрешает запросы CORS.", + "Network error: {{error}}": "Ошибка сети: {{error}}", + "Next page": "Следующая страница", + "No Area Selected": "Область не выбрана", + "No Attachments": "Нет вложений", + "No Changes": "Нет изменений", + "No Crop Area": "Нет области обрезки", + "No File": "Нет файла", + "No Files": "Нет файлов", + "No Images Found": "Изображения не найдены", + "No PDF Files": "Нет файлов PDF", + "No PDF document loaded": "Документ PDF не загружен", + "No PDF document loaded.": "Документ PDF не загружен.", + "No PDF file loaded.": "Файл PDF не загружен.", + "No PDF files could be decrypted. The password may be incorrect.": "Не удалось расшифровать ни один файл PDF. Возможно, пароль неверный.", + "No PDF files could be linearized.": "Не удалось линеаризовать ни один файл PDF.", + "No PDFs could be processed.": "Не удалось обработать ни один PDF.", + "No Pages": "Нет страниц", + "No Selection": "Ничего не выбрано", + "No Signatures Found": "Подписи не найдены", + "No Tables Found": "Таблицы не найдены", + "No Text": "Нет текста", + "No URL configured": "URL не настроен", + "No attachments found in this PDF.": "В этом PDF вложений не найдено.", + "No attachments selected for removal.": "Не выбрано вложений для удаления.", + "No blank pages detected in this PDF.": "В этом PDF пустых страниц не обнаружено.", + "No bookmarks found at the selected level.": "На выбранном уровне закладок не найдено.", + "No bookmarks to delete.": "Нет закладок для удаления.", + "No bookmarks to export!": "Нет закладок для экспорта!", + "No certificate found in PEM file": "В файле PEM сертификат не найден", + "No certificate found in PFX file": "В файле PFX сертификат не найден", + "No certificates found in signature": "В подписи сертификаты не найдены", + "No changes match the current filter.": "Нет изменений, соответствующих текущему фильтру.", + "No configurable settings for this node.": "У этого узла нет настраиваемых параметров.", + "No differences detected on this page.": "На этой странице различий не обнаружено.", + "No embedded images were found in the selected PDF(s).": "В выбранных PDF встроенные изображения не найдены.", + "No existing bookmarks found in this PDF.": "В этом PDF существующих закладок не найдено.", + "No items were selected for removal or none were found in the PDF.": "Не выбрано ни одного элемента для удаления, или в PDF они не найдены.", + "No page pairs to export.": "Нет пар страниц для экспорта.", + "No pages found. Please create a blank PDF or upload one.": "Страницы не найдены. Создайте пустой PDF или загрузите свой.", + "No pages selected for removal.": "Не выбрано страниц для удаления.", + "No pages were selected for splitting.": "Не выбрано страниц для разделения.", + "No paired page for this side.": "Для этой стороны нет парной страницы.", + "No private key found in PEM file": "В файле PEM закрытый ключ не найден", + "No private key found in PFX file": "В файле PFX закрытый ключ не найден", + "No tables were detected in this PDF.": "В этом PDF таблицы не обнаружены.", + "No valid page numbers found.": "Допустимые номера страниц не найдены.", + "No valid pages to save.": "Нет допустимых страниц для сохранения.", + "No worker": "Нет обработчика", + "Noise": "Шум", + "None": "Нет", + "None of the files could be compressed: {{join}}.": "Не удалось сжать ни один из файлов: {{join}}.", + "Normal": "Обычный", + "Not Enough Files": "Недостаточно файлов", + "Not a PDF": "Это не PDF", + "Not connected": "Нет подключения", + "Not in trust chain": "Не входит в цепочку доверия", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Примечание: без отдельного пароля владельца у PDF нет ограничений на использование.", + "Number Format": "Формат номера", + "Number of Pages": "Количество страниц", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR прерван до обработки каких-либо страниц", + "OCR recognize timed out after {{timeoutMs}}ms": "Время ожидания распознавания OCR истекло через {{timeoutMs}} мс", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Файлы ODG", + "ODG to PDF": "ODG в PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Выкл (по умолчанию): естественная нумерация 1–N. Вкл: исходные метки страниц каждого файла сохраняются (могут появиться дубликаты).", + "One PDF per page": "Один PDF на страницу", + "One PDF per range": "Один PDF на диапазон", + "Only a substitute font was available": "Был доступен только замещающий шрифт", + "Only where it does not change how the image looks.": "Только там, где это не меняет вид изображения.", + "Opacity": "Непрозрачность", + "Open URL": "Открыть URL", + "Opens incognito window": "Открывает окно инкогнито", + "Opens new tab": "Открывает новую вкладку", + "Opens new window": "Открывает новое окно", + "Operation Failed": "Операция не удалась", + "Operation resulted in an empty file.": "Операция привела к пустому файлу.", + "Optimize PDF for fast web viewing": "Оптимизировать PDF для быстрого просмотра в вебе", + "Optimizing PDFs for web view (linearizing)...": "Оптимизация PDF для просмотра в вебе (линеаризация)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Оптимизация {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Варианты (по одному в строке или через запятую)", + "Orientation": "Ориентация", + "Outline": "Контур", + "Output": "Вывод", + "Overlay": "Наложение", + "Overlay or underlay pages from one PDF onto another": "Наложить страницы одного PDF поверх или под страницы другого", + "Owner Password": "Пароль владельца", + "Owner Password Required": "Требуется пароль владельца", + "PDF": "PDF", + "PDF Files": "Файлы PDF", + "PDF Input": "Ввод PDF", + "PDF Layers": "Слои PDF", + "PDF Metadata": "Метаданные PDF", + "PDF Producer": "Создатель PDF", + "PDF converted to CSV successfully!": "PDF успешно конвертирован в CSV!", + "PDF converted to SVG successfully!": "PDF успешно конвертирован в SVG!", + "PDF converted to greyscale successfully!": "PDF успешно конвертирован в оттенки серого!", + "PDF created successfully!": "PDF успешно создан!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF успешно расшифрован! Всё шифрование и ограничения сняты.", + "PDF decrypted successfully! Your download has started.": "PDF успешно расшифрован! Скачивание началось.", + "PDF downloaded successfully.": "PDF успешно скачан.", + "PDF encrypted successfully with 256-bit AES!": "PDF успешно зашифрован с помощью 256-битного AES!", + "PDF has been sanitized and downloaded.": "PDF очищен и скачан.", + "PDF has no pages": "В PDF нет страниц", + "PDF organized successfully!": "PDF успешно упорядочен!", + "PDF permissions changed successfully!": "Разрешения PDF успешно изменены!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Программы для чтения PDF сами предоставляют 14 стандартных шрифтов PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Ограничения PDF успешно сняты! Теперь файл можно свободно редактировать и печатать.", + "PDF saved successfully!": "PDF успешно сохранён!", + "PDF split successfully!": "PDF успешно разделён!", + "PDF to CSV": "PDF в CSV", + "PDF to DOCX": "PDF в DOCX", + "PDF to Excel/CSV": "PDF в Excel/CSV", + "PDF to Images": "PDF в изображения", + "PDF to Images (High Quality)": "PDF в изображения (высокое качество)", + "PDF to JSON": "PDF в JSON", + "PDF to Markdown": "PDF в Markdown", + "PDF to PDF/A": "PDF в PDF/A", + "PDF to SVG": "PDF в SVG", + "PDF to Text": "PDF в текст", + "PDF to XLSX": "PDF в XLSX", + "PDF with layer changes saved!": "PDF с изменениями слоёв сохранён!", + "PDF {{modeLabel}} applied successfully.": "Для PDF успешно применено: {{modeLabel}}.", + "PDF/A Conversion": "Конвертация в PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (строгий, без прозрачности)", + "PDF/A-2b (Recommended)": "PDF/A-2b (рекомендуется)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (современный, допускает вложения)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF успешно смешаны!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (без потерь)", + "PUB to PDF": "PUB в PDF", + "Page": "Страница", + "Page #": "Стр. №", + "Page Added": "Страница добавлена", + "Page Numbers": "Номера страниц", + "Page Removed": "Страница удалена", + "Page Size": "Размер страницы", + "Page X of Y": "Страница X из Y", + "Page background or layout changed": "Изменён фон или макет страницы", + "Page container not found": "Контейнер страницы не найден", + "Page extraction produced an empty PDF.": "Извлечение страниц дало пустой PDF.", + "Page number": "Номер страницы", + "Page numbers added successfully!": "Номера страниц успешно добавлены!", + "Page sizes standardized successfully!": "Размеры страниц успешно приведены к единому виду!", + "Page {{currentPageNum}} of {{numPages}}": "Страница {{currentPageNum}} из {{numPages}}", + "Page {{num}} / {{numPages}}": "Страница {{num}} / {{numPages}}", + "Page {{n}} ": "Страница {{n}} ", + "Page {{n}} of {{length}}": "Страница {{n}} из {{length}}", + "Page {{n}}:": "Страница {{n}}:", + "Page {{pageNumber}}": "Страница {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Страница {{pageNumber}} есть только в первом PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Страница {{pageNumber}} есть только во втором PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Страница {{pageNumber}} из {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Страницы {{pageNum}} в этом PDF не существует.", + "Page {{page}}": "Страница {{page}}", + "Page {{page}} attachment": "Вложение страницы {{page}}", + "Pages": "Страницы", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Страницы (например, 1-3, 5), всего: {{pageCount}}", + "Pages Files": "Файлы Pages", + "Pages Per Sheet": "Страниц на листе", + "Pages combined successfully!": "Страницы успешно объединены!", + "Pages have been divided successfully!": "Страницы успешно разделены!", + "Pages have been reordered.": "Порядок страниц изменён.", + "Pages have been reversed successfully!": "Страницы успешно развёрнуты в обратном порядке!", + "Pages to PDF": "Pages в PDF", + "Paper Size": "Размер бумаги", + "Paragraph": "Абзац", + "Parsing XML structure...": "Разбор структуры XML...", + "Parsing {{name}}...": "Разбор {{name}}...", + "Partial Coverage": "Частичное покрытие", + "Partial Success": "Частичный успех", + "Password": "Пароль", + "Password Error": "Ошибка пароля", + "Password Needed": "Нужен пароль", + "Password Required": "Требуется пароль", + "Password for all files": "Пароль для всех файлов", + "Password for all locked files": "Пароль для всех заблокированных файлов", + "Password for {{name}}": "Пароль для {{name}}", + "Password protected": "Защищено паролем", + "Password required for encrypted private key": "Для зашифрованного закрытого ключа требуется пароль", + "Path Stroke": "Контур по траектории", + "Please add at least one field before downloading.": "Добавьте хотя бы одно поле перед скачиванием.", + "Please draw a rectangle on at least one page to select the crop area.": "Нарисуйте прямоугольник хотя бы на одной странице, чтобы выбрать область обрезки.", + "Please ensure all page numbers in the order are unique.": "Убедитесь, что все номера страниц в порядке уникальны.", + "Please enter a layer name": "Введите название слоя", + "Please enter a name.": "Введите имя.", + "Please enter a number between 0 and {{totalPages}}.": "Введите число от 0 до {{totalPages}}.", + "Please enter a page order.": "Введите порядок страниц.", + "Please enter a password": "Введите пароль", + "Please enter a password for {{i}} or skip it": "Введите пароль для {{i}} или пропустите его", + "Please enter a title.": "Введите название.", + "Please enter a user password.": "Введите пользовательский пароль.", + "Please enter a valid number of pages (1 or more).": "Введите корректное количество страниц (1 или больше).", + "Please enter a valid page number between 1 and {{total}}": "Введите корректный номер страницы от 1 до {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Введите корректный диапазон страниц (например, 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Введите номера страниц для извлечения.", + "Please enter positive numbers.": "Введите положительные числа.", + "Please enter some text to convert.": "Введите текст для конвертации.", + "Please enter text for the watermark.": "Введите текст водяного знака.", + "Please enter the PDF password.": "Введите пароль PDF.", + "Please load a PDF first.": "Сначала загрузите PDF.", + "Please select PDF files to create a ZIP archive.": "Выберите файлы PDF для создания ZIP-архива.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Выберите файл сертификата .pem, .crt, .cer или .der.", + "Please select a PDF file.": "Выберите файл PDF.", + "Please select a valid PDF file.": "Выберите корректный файл PDF.", + "Please select an area on at least one page to crop.": "Выберите область хотя бы на одной странице для обрезки.", + "Please select an area to crop first.": "Сначала выберите область для обрезки.", + "Please select an area to crop.": "Выберите область для обрезки.", + "Please select an image file for the watermark.": "Выберите файл изображения для водяного знака.", + "Please select at least one BMP file.": "Выберите хотя бы один файл BMP.", + "Please select at least one CSV file.": "Выберите хотя бы один файл CSV.", + "Please select at least one Excel file.": "Выберите хотя бы один файл Excel.", + "Please select at least one HEIC file.": "Выберите хотя бы один файл HEIC.", + "Please select at least one JPG file.": "Выберите хотя бы один файл JPG.", + "Please select at least one JPG or JPEG2000 image.": "Выберите хотя бы одно изображение JPG или JPEG2000.", + "Please select at least one ODT file.": "Выберите хотя бы один файл ODT.", + "Please select at least one PDF file.": "Выберите хотя бы один файл PDF.", + "Please select at least one PowerPoint file.": "Выберите хотя бы один файл PowerPoint.", + "Please select at least one RTF file.": "Выберите хотя бы один файл RTF.", + "Please select at least one SVG file.": "Выберите хотя бы один файл SVG.", + "Please select at least one TIFF file.": "Выберите хотя бы один файл TIFF.", + "Please select at least one Word document.": "Выберите хотя бы один документ Word.", + "Please select at least one file to attach.": "Выберите хотя бы один файл для прикрепления.", + "Please select at least one image file.": "Выберите хотя бы один файл изображения.", + "Please select at least one text file.": "Выберите хотя бы один текстовый файл.", + "Please select at least one {{FILETYPE_NAME}} file.": "Выберите хотя бы один файл {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Выберите хотя бы один файл {{TOOL_NAME}} (.eml или .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Выберите хотя бы один файл {{TOOL_NAME}}.", + "Please select even or odd pages.": "Выберите чётные или нечётные страницы.", + "Please select one or more PDF files.": "Выберите один или несколько файлов PDF.", + "Please select pages to delete.": "Выберите страницы для удаления.", + "Please select pages to duplicate.": "Выберите страницы для дублирования.", + "Please select pages to mark for splitting.": "Выберите страницы, после которых нужно разделить.", + "Please select pages to rotate.": "Выберите страницы для поворота.", + "Please specify a page range for page-level attachments.": "Укажите диапазон страниц для вложений уровня страницы.", + "Please upload PDF files.": "Загрузите файлы PDF.", + "Please upload PDFs first.": "Сначала загрузите PDF.", + "Please upload a .docx file first.": "Сначала загрузите файл .docx.", + "Please upload a PDF file first.": "Сначала загрузите файл PDF.", + "Please upload a PDF file.": "Загрузите файл PDF.", + "Please upload a PDF first.": "Сначала загрузите PDF.", + "Please upload a valid PDF file.": "Загрузите корректный файл PDF.", + "Please upload at least one PDF file.": "Загрузите хотя бы один файл PDF.", + "Please upload at least two PDF files to alternate and mix.": "Загрузите хотя бы два файла PDF для чередования и смешивания.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Загрузите и основной PDF, и PDF для наложения или подложки.", + "Please upload valid PDF files.": "Загрузите корректные файлы PDF.", + "Please use the Download button in the PDF viewer toolbar above.": "Используйте кнопку «Скачать» на панели инструментов просмотрщика PDF выше.", + "Please wait for the PDF viewer to load.": "Подождите, пока загрузится просмотрщик PDF.", + "Please wait for the form to finish loading.": "Подождите, пока форма загрузится.", + "Portrait": "Книжная", + "Position": "Положение", + "Post-processing for transparency compliance...": "Постобработка для соответствия требованиям прозрачности...", + "Posterize": "Постеризация", + "Posterizing PDF...": "Постеризация PDF...", + "PowerPoint to PDF": "PowerPoint в PDF", + "Pre Flatten": "Предварительное сведение", + "Pre-flattening PDF...": "Предварительное сведение PDF...", + "Prefer JPEG 2000 for photos": "Предпочитать JPEG 2000 для фотографий", + "Preparing PDF export...": "Подготовка экспорта PDF...", + "Preparing conversion...": "Подготовка конвертации...", + "Preparing download...": "Подготовка к скачиванию...", + "Preparing preview...": "Подготовка предпросмотра...", + "Presentations": "Презентации", + "Preserve PDF/A": "Сохранить PDF/A", + "Preview": "Предпросмотр", + "Preview Error": "Ошибка предпросмотра", + "Preview Text": "Предпросмотр текста", + "Previous page": "Предыдущая страница", + "Print Form": "Печать формы", + "Private data that editing apps store inside the PDF.": "Закрытые данные, которые приложения для редактирования хранят внутри PDF.", + "Processed {{processedCount}} PDFs.": "Обработано PDF: {{processedCount}}.", + "Processing Complete": "Обработка завершена", + "Processing Dpi": "DPI обработки", + "Processing Failed": "Обработка не удалась", + "Processing PDF permissions...": "Обработка разрешений PDF...", + "Processing attachments...": "Обработка вложений...", + "Processing failed for {{name}}.": "Не удалось обработать {{name}}.", + "Processing file {{n}} of {{length}}...": "Обработка файла {{n}} из {{length}}...", + "Processing images...": "Обработка изображений...", + "Processing multiple PDFs...": "Обработка нескольких PDF...", + "Processing page {{i}} of {{numPages}}": "Обработка страницы {{i}} из {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Обработка страницы {{i}} из {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Обработка страницы {{n}} из {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Обработка страницы {{pageNum}} из {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Обработка страницы {{pageNum}} из {{totalPages}}...", + "Processing produced an empty file.": "Обработка дала пустой файл.", + "Processing resulted in an empty file.": "Обработка привела к пустому файлу.", + "Processing sheet {{n}}...": "Обработка листа {{n}}...", + "Processing {{name}}...": "Обработка {{name}}...", + "Processing {{nodeName}}...": "Обработка {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Обработка {{n}}/{{length}}: {{name}}...", + "Processing...": "Обработка...", + "Producer": "Создатель PDF", + "Publisher Files": "Файлы Publisher", + "Purple": "Фиолетовый", + "PyMuPDF (Document Processing)": "PyMuPDF (обработка документов)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF не настроен. Настройте его в расширенных настройках.", + "PyMuPDF module did not export expected PyMuPDF class.": "Модуль PyMuPDF не экспортировал ожидаемый класс PyMuPDF.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF вернул пустой расшифрованный файл.", + "PyMuPDF: not configured.": "PyMuPDF: не настроен.", + "QR Code": "QR-код", + "Quality": "Качество", + "Quits application (cannot be overridden)": "Закрывает приложение (нельзя переопределить)", + "RSA-PKCS1 signature does not verify against signer public key": "Подпись RSA-PKCS1 не подтверждается открытым ключом подписанта", + "RSA-PSS signature does not verify against signer public key": "Подпись RSA-PSS не подтверждается открытым ключом подписанта", + "Rasterization Complete": "Растеризация завершена", + "Rasterization Partial": "Растеризация выполнена частично", + "Rasterize": "Растеризовать", + "Rasterize Dpi": "DPI растеризации", + "Rasterize pages to images": "Растеризовать страницы в изображения", + "Rasterize quality": "Качество растеризации", + "Rasterize resolution (DPI)": "Разрешение растеризации (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Растеризовано PDF: {{completed}}, не удалось: {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Растеризация {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Растеризация {{name}}...", + "Rasterizing...": "Растеризация...", + "Rating must be between 0 and 5": "Рейтинг должен быть от 0 до 5", + "Read Only": "Только чтение", + "Reading CSV file...": "Чтение файла CSV...", + "Reading PDF...": "Чтение PDF...", + "Reading XML file...": "Чтение файла XML...", + "Reading encrypted PDF...": "Чтение зашифрованного PDF...", + "Reading files...": "Чтение файлов...", + "Reading layer configuration...": "Чтение конфигурации слоёв...", + "Reading {{name}} ({{n}}/{{length}})...": "Чтение {{name}} ({{n}}/{{length}})...", + "Ready": "Готово", + "Reason": "Причина", + "Red": "Красный", + "Redact": "Вымарать", + "Redact Mode": "Режим вымарывания", + "Redact text from PDF": "Вымарать текст в PDF", + "Redaction Failed": "Не удалось вымарать", + "Reduce PDF file size": "Уменьшить размер файла PDF", + "Reduce color complexity": "Уменьшить сложность цветов", + "Reduces file size by removing color information.": "Уменьшает размер файла, удаляя информацию о цвете.", + "Reloads page": "Перезагружает страницу", + "Remove": "Удалить", + "Remove All Attachments": "Удалить все вложения", + "Remove Annotations": "Удаление примечаний", + "Remove Blank Pages": "Удаление пустых страниц", + "Remove Embedded Files": "Удалить встроенные файлы", + "Remove Fonts": "Удалить шрифты", + "Remove Javascript": "Удалить JavaScript", + "Remove Layers": "Удалить слои", + "Remove Links": "Удалить ссылки", + "Remove Mark Info": "Удалить Mark Info", + "Remove Metadata": "Удаление метаданных", + "Remove PDF password protection": "Снять защиту паролем с PDF", + "Remove Structure Tree": "Удалить дерево структуры", + "Remove alternate images": "Удалить альтернативные изображения", + "Remove application data": "Удалить данные приложений", + "Remove article threads": "Удалить цепочки статей", + "Remove attachment": "Удалить вложение", + "Remove blank pages automatically": "Автоматически удалять пустые страницы", + "Remove document structure tree": "Удалить дерево структуры документа", + "Remove file": "Удалить файл", + "Remove metadata, scripts, and hidden data": "Удалить метаданные, скрипты и скрытые данные", + "Remove output intents": "Удалить Output Intents", + "Remove page thumbnails": "Удалить миниатюры страниц", + "Remove specific pages": "Удалить выбранные страницы", + "Remove web capture information": "Удалить сведения о веб-захвате", + "Remove {{name}}": "Удалить {{name}}", + "Removed \"{{beforeText}}\"": "Удалено «{{beforeText}}»", + "Removed image ({{width}}×{{height}})": "Удалено изображение ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Пустых страниц успешно удалено: {{length}}!", + "Removing all metadata...": "Удаление всех метаданных...", + "Removing annotations...": "Удаление примечаний...", + "Removing redacted text from document data...": "Удаление вымаранного текста из данных документа...", + "Removing restrictions...": "Снятие ограничений...", + "Removing {{length}} blank page(s)...": "Удаление пустых страниц ({{length}})...", + "Render Error": "Ошибка отображения", + "Rendering Page {{num}}...": "Отображение страницы {{num}}...", + "Rendering page previews...": "Отображение превью страниц...", + "Rendering page previews: {{current}}/{{total}}": "Отображение превью страниц: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Отображение страницы {{n}} из {{length}}...", + "Rendering preview for page {{pageNum}}...": "Отображение превью страницы {{pageNum}}...", + "Reopens closed tab": "Открывает закрытую вкладку заново", + "Repair": "Восстановить", + "Repair Failed": "Не удалось восстановить", + "Repair corrupted PDF": "Восстановить повреждённый PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Восстановлено файлов: {{length}}. Не удалось восстановить: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Восстановление {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Восстановление {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "«{{beforeText}}» заменено на «{{afterText}}»", + "Required": "Обязательно", + "Resamples even when an image is only slightly above the limit.": "Пересэмплирует, даже если изображение лишь немного превышает предел.", + "Reset Form": "Сбросить форму", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Сбросить и вернуться к загрузке файлов? Все несохранённые изменения будут потеряны.", + "Resolution": "Разрешение", + "Retain Page Labels": "Сохранять метки страниц", + "Retry Failed": "Повторить неудавшиеся", + "Reverse Pages": "Обратный порядок страниц", + "Reverse page order": "Изменить порядок страниц на обратный", + "Reversing page order...": "Изменение порядка страниц на обратный...", + "Reversing {{name}} ({{n}}/{{length}})...": "Изменение порядка страниц на обратный: {{name}} ({{n}}/{{length}})...", + "Right": "Справа", + "Right edge in points": "Правый край в пунктах", + "Rotate": "Повернуть", + "Rotate +90°": "Повернуть на +90°", + "Rotate all pages": "Повернуть все страницы", + "Rotation": "Поворот", + "Rotation Variance": "Разброс поворота", + "Rotations applied successfully!": "Повороты успешно применены!", + "Rows": "Строки", + "Run Javascript": "Запустить JavaScript", + "Running OCR on page {{pageNum}}...": "Распознавание OCR на странице {{pageNum}}...", + "Running...": "Выполняется...", + "SVG": "SVG", + "SVG Files": "Файлы SVG", + "SVG to PDF": "SVG в PDF", + "Sanitize": "Очистить", + "Sanitized With Warnings": "Очищено с предупреждениями", + "Sanitizing PDF...": "Очистка PDF...", + "Saturation": "Насыщенность", + "Saved": "Сохранено", + "Saving PDF with layer changes...": "Сохранение PDF с изменениями слоёв...", + "Scaling Mode": "Режим масштабирования", + "Scanner Effect": "Эффект сканера", + "Scanner effect applied successfully!": "Эффект сканера успешно применён!", + "Scanning page {{n}} of {{pageCount}}...": "Сканирование страницы {{n}} из {{pageCount}}...", + "Search Text": "Поиск текста", + "Search languages...": "Поиск языков...", + "Select Font": "Выбрать шрифт", + "Select a field to edit properties": "Выберите поле, чтобы изменить его свойства", + "Select a field...": "Выберите поле...", + "Select to add this button to an existing group": "Выберите, чтобы добавить эту кнопку в существующую группу", + "Selected Option": "Выбранный вариант", + "Self-Signed: Signer Identity Not Verified": "Самоподписанная: личность подписанта не подтверждена", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Самостоятельно размещённые ресурсы OCR настроены не полностью. Укажите {{missing}} вместе с остальными URL ресурсов Tesseract.", + "Separator": "Разделитель", + "Separator Color": "Цвет разделителя", + "Separator Thickness": "Толщина разделителя", + "Sepia": "Сепия", + "Serial Number:": "Серийный номер:", + "Set custom destination": "Задать своё назначение", + "Shapes": "Фигуры", + "Sheet {{n}} {{sideLabel}}": "Лист {{n}} {{sideLabel}}", + "Show": "Показать", + "Show password": "Показать пароль", + "Show/Hide Field": "Показать/скрыть поле", + "Sign Here": "Подписать здесь", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents не является одним объектом DER, за которым следует нулевое заполнение", + "Signature Algorithm:": "Алгоритм подписи:", + "Signature Intact: Signer Identity Not Verified": "Подпись не нарушена: личность подписанта не подтверждена", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Поля подписи являются полями подписи AcroForm и будут видны только в расширенном просмотрщике PDF.", + "Signature has a missing or malformed /ByteRange": "В подписи отсутствует или некорректен /ByteRange", + "Signature scheme {{kind}} not implemented": "Схема подписи {{kind}} не реализована", + "Signature {{n}}": "Подпись {{n}}", + "Signatures": "Подписи", + "Signed By": "Подписал", + "Signed On": "Дата подписи", + "Signed PDF Not Changed": "Подписанный PDF не изменён", + "Signed PDF downloaded successfully!": "Подписанный PDF успешно скачан!", + "Signed PDF saved successfully!": "Подписанный PDF успешно сохранён!", + "Simple (1, 2, 3)": "Простая (1, 2, 3)", + "Simplify large color profiles": "Упростить большие цветовые профили", + "Skew Threshold": "Порог перекоса", + "Skip": "Пропустить", + "Skip All": "Пропустить все", + "Skip Remaining": "Пропустить остальные", + "Skip this file": "Пропустить этот файл", + "Skipped: {{join}}.": "Пропущено: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Файлы меньше, но открыть их смогут только программы с поддержкой Brotli, например Firefox, MuPDF 1.26+ и Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Некоторые файлы пропущены, потому что это неподдерживаемые изображения.", + "Some files were skipped. Only BMP files are allowed.": "Некоторые файлы пропущены. Разрешены только файлы BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Некоторые файлы пропущены. Разрешены только файлы HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Некоторые файлы пропущены. Разрешены только файлы JPG, JPEG, JP2 и JPX.", + "Some files were skipped. Only PDF files are allowed.": "Некоторые файлы пропущены. Разрешены только файлы PDF.", + "Some files were skipped. Only PNG images are allowed.": "Некоторые файлы пропущены. Разрешены только изображения PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Некоторые файлы пропущены. Разрешена только графика SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Некоторые файлы пропущены. Разрешены только файлы TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Некоторые файлы пропущены. Разрешены только изображения WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Некоторые файлы пропущены. Разрешены только поддерживаемые форматы изображений.", + "Some files were skipped. Only text files are allowed.": "Некоторые файлы пропущены. Разрешены только текстовые файлы.", + "Some pages could not be processed. Please try again.": "Некоторые страницы не удалось обработать. Повторите попытку.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Некоторые метки вымарывания не удалось применить, поэтому файл не был скачан. Примените или удалите их в редакторе и повторите попытку.", + "Spacing": "Интервал", + "Split PDF": "Разделение PDF", + "Split by Bookmarks": "Разделить по закладкам", + "Split pages into tile grid for poster printing": "Разбить страницы на сетку плиток для печати постера", + "Split pages vertically or horizontally": "Разделить страницы по вертикали или горизонтали", + "Splitting PDF pages...": "Разделение страниц PDF...", + "Splitting PDF...": "Разделение PDF...", + "Spreadsheets": "Таблицы", + "Standard (192 DPI)": "Стандартное (192 DPI)", + "Standard Size": "Стандартный размер", + "Standardize all pages to a target size": "Привести все страницы к целевому размеру", + "Standardizing pages...": "Приведение страниц к единому размеру...", + "Stitch all pages into one continuous page": "Склеить все страницы в одну непрерывную страницу", + "Straighten skewed PDF pages": "Выровнять перекошенные страницы PDF", + "Strip all annotations": "Удалить все примечания", + "Style": "Стиль", + "Style Changed": "Стиль изменён", + "Style changed ({{length}} regions)": "Стиль изменён (областей: {{length}})", + "Subject": "Тема", + "Subset embedded fonts": "Оставить только используемые символы во встроенных шрифтах", + "Success": "Успешно", + "Success!": "Успешно!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Успешно конвертировано файлов CSV в PDF: {{length}}.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Успешно конвертировано файлов Excel в PDF: {{length}}.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Успешно конвертировано файлов ODT в PDF: {{length}}.", + "Successfully converted {{length}} PDF(s) to DOCX.": "Успешно конвертировано PDF в DOCX: {{length}}.", + "Successfully converted {{length}} PDF(s) to Markdown.": "Успешно конвертировано PDF в Markdown: {{length}}.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "Успешно конвертировано PDF в {{level}}: {{length}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Успешно конвертировано файлов PSD в один PDF: {{length}}.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Успешно конвертировано файлов PowerPoint в PDF: {{length}}.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Успешно конвертировано файлов RTF в PDF: {{length}}.", + "Successfully converted {{length}} Word document(s) to PDF.": "Успешно конвертировано документов Word в PDF: {{length}}.", + "Successfully converted {{length}} files to PDF.": "Успешно конвертировано файлов в PDF: {{length}}.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Успешно конвертировано файлов {{TOOL_NAME}} в PDF: {{length}}.", + "Successfully converted {{name}} to DOCX.": "{{name}} успешно конвертирован в DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} успешно конвертирован в Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} успешно конвертирован в PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} успешно конвертирован в {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF для ИИ/LLM успешно извлечён.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "Успешно извлечено PDF для ИИ/LLM: {{completed}}.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF успешно растеризован при {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "Успешно растеризовано PDF при {{dpi}} DPI: {{completed}}.", + "Supported: CBZ, CBR": "Поддерживаются: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Поддерживаются: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Поддерживаются: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Поддерживаются: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Поддерживаются: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Поддерживаются: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Поддерживаются: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Поддерживаются: XPS, OXPS", + "Switches apps": "Переключает приложения", + "Switches tabs": "Переключает вкладки", + "Table of Contents": "Оглавление", + "Table {{n}} (Page {{page}})": "Таблица {{n}} (страница {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Целевое поле", + "Target Kilobytes": "Целевой размер в килобайтах", + "Target Not Reached": "Цель не достигнута", + "Target Size": "Целевой размер", + "Technical Details": "Технические подробности", + "Temperature": "Температура", + "Template \"{{name}}\" loaded.": "Шаблон «{{name}}» загружен.", + "Template \"{{name}}\" saved.": "Шаблон «{{name}}» сохранён.", + "Text": "Текст", + "Text Color": "Цвет текста", + "Text Files": "Текстовые файлы", + "Text color changed successfully!": "Цвет текста успешно изменён!", + "Text converted to PDF successfully!": "Текст успешно конвертирован в PDF!", + "Text extracted successfully!": "Текст успешно извлечён!", + "Text to PDF": "Текст в PDF", + "That password did not open any of the remaining files.": "Этот пароль не подошёл ни к одному из оставшихся файлов.", + "The PDF file(s) do not contain any attachments to extract.": "В файлах PDF нет вложений для извлечения.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "В PDF страниц: {{totalPages}}, это число не делится на {{nValue}} без остатка. В последнем PDF будет страниц: {{remainder}}.", + "The PDF might be corrupted or password protected.": "Возможно, PDF повреждён или защищён паролем.", + "The PDF might be corrupted or password-protected.": "Возможно, PDF повреждён или защищён паролем.", + "The PDF might be corrupted.": "Возможно, PDF повреждён.", + "The PDF viewer is still initializing.": "Просмотрщик PDF ещё инициализируется.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF скачан, но не удалось выполнить следующие шаги: {{join}}. Связанное с ними содержимое может остаться в файле.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL вернул неожиданный тип содержимого: {{contentType}}. Ожидался файл JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Байты, исключённые /ByteRange, не являются в точности подписью в шестнадцатеричной кодировке", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Байты, исключённые /ByteRange, не являются /Contents этой подписи", + "The compression engine returned an unreadable result.": "Движок сжатия вернул нечитаемый результат.", + "The compression engine stopped unexpectedly.": "Движок сжатия неожиданно остановился.", + "The current password you entered is incorrect. Please try again.": "Введённый вами текущий пароль неверен. Попробуйте ещё раз.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Следующие имена полей уже есть в загруженном PDF: {{conflictList}}. Переименуйте эти поля перед скачиванием.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Следующие имена полей используются более одного раза: {{duplicateList}}. Переименуйте эти поля, чтобы имена были уникальными, перед скачиванием.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Указанное число страниц ({{length}}) не совпадает с текущим числом страниц в документе ({{currentGridCount}}). Задайте полный порядок для всех страниц.", + "The password you entered is incorrect. Please try again.": "Введённый вами пароль неверен. Попробуйте ещё раз.", + "The password you entered is wrong or the file is corrupted.": "Введённый вами пароль неверен, или файл повреждён.", + "The provided file could not be loaded as an image. It may be corrupted.": "Не удалось загрузить указанный файл как изображение. Возможно, он повреждён.", + "The requested OCR language is not available: {{unavailableText}}.": "Запрошенный язык OCR недоступен: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Указанный порядок страниц неполон или содержит недопустимые номера страниц. Укажите новую позицию для каждой исходной страницы.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Эти файлы не являются корректными PDF, поэтому не были добавлены: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Эти файлы защищены паролем: {{names}}. Введите их пароли на карточках файлов или удалите их, затем снова запустите сжатие.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "В этой сборке BentoPDF есть данные OCR только для: {{availableText}}.", + "This PDF does not contain any digital signatures.": "В этом PDF нет цифровых подписей.", + "This PDF has no layers (OCG).": "В этом PDF нет слоёв (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Этот PDF защищён паролем. Введите текущий пароль, чтобы продолжить.", + "This document contains pages with different dimensions:": "В этом документе есть страницы разных размеров:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "В документе есть 1 метка скрытия, которая ещё не применена. Пока метка не применена, содержимое под ней остаётся в файле. Применить все метки и скачать?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "В документе есть неприменённые метки скрытия (всего: {{count}}). Пока метка не применена, содержимое под ней остаётся в файле. Применить все метки и скачать?", + "This feature requires {{name}} to be configured.": "Для этой функции требуется настроить {{name}}.", + "This file is not a valid PDF.": "Этот файл не является корректным PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Этот модуль распространяется по лицензии AGPL-3.0. Настраивая его, вы соглашаетесь с условиями лицензии.", + "This tool has been disabled": "Этот инструмент отключён", + "This tool is not available in your deployment. Contact your administrator for more information.": "Этот инструмент недоступен в вашей установке. Для получения подробностей свяжитесь с администратором.", + "Threshold": "Порог", + "Tile": "Плитка", + "Tile Gap X": "Промежуток плитки по X", + "Tile Gap Y": "Промежуток плитки по Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Метка времени", + "Timestamp Failed": "Не удалось поставить метку времени", + "Tint": "Оттенок", + "Title": "Название", + "To actually fill or change the options, use our PDF Form Filler tool.": "Чтобы действительно заполнить или изменить варианты, используйте наш инструмент заполнения форм PDF.", + "Toggle": "Переключить", + "Toggle style": "Переключить стиль", + "Toggle sync scroll": "Переключить синхронную прокрутку", + "Tool Unavailable": "Инструмент недоступен", + "Tooltip / Help Text": "Подсказка / справка", + "Top": "Сверху", + "Top Center": "Сверху по центру", + "Top Left": "Сверху слева", + "Top Right": "Сверху справа", + "Top edge in points": "Верхний край в пунктах", + "Total Pages": "Всего страниц", + "Transparent Background": "Прозрачный фон", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Пробует JPEG 2000 вместо JPEG для каждого изображения и оставляет меньший вариант.", + "Trim margins from all pages": "Обрезать поля на всех страницах", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Проверка доверия: подписей, проверенных по своему сертификату: {{trustVerified}}/{{length}}", + "Trusted": "Доверенный", + "Trusted certificate loaded": "Доверенный сертификат загружен", + "Tsa Url": "URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Отключает качество, разрешение и все остальные шаги сжатия изображений с потерями.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL должен начинаться с http:// или https://", + "Ultra (384 DPI)": "Ультра (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Не удалось расшифровать PDF с указанным паролем.", + "Unable to repair any of the uploaded PDF files.": "Не удалось восстановить ни один из загруженных файлов PDF.", + "Unembed standard fonts": "Убрать встраивание стандартных шрифтов", + "Unembed standard-font look-alikes": "Убрать встраивание шрифтов, похожих на стандартные", + "Unexpected delimiter in content stream": "Неожиданный разделитель в потоке содержимого", + "Unexpected reply from the engine.": "Неожиданный ответ от движка.", + "Uniform": "Единый", + "Unique Page Sizes": "Уникальные размеры страниц", + "Unknown": "Неизвестно", + "Unknown error": "Неизвестная ошибка", + "Unknown error occurred in worker.": "В обработчике произошла неизвестная ошибка.", + "Unknown error occurred.": "Произошла неизвестная ошибка.", + "Unlock": "Разблокировать", + "Unlock All": "Разблокировать все", + "Unlock Remaining ({{remaining}})": "Разблокировать оставшиеся ({{remaining}})", + "Unlocked": "Разблокировано", + "Unlocked {{unlocked}} of {{length}} files.": "Разблокировано файлов: {{unlocked}} из {{length}}.", + "Unlocking...": "Разблокировка...", + "Unresolved optional content reference": "Неразрешённая ссылка на необязательное содержимое", + "Unsupported ECDSA curve in signer certificate": "Неподдерживаемая кривая ECDSA в сертификате подписанта", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Неподдерживаемое изображение. Используйте для водяного знака PNG или JPG.", + "Unsupported digest OID {{digestOid}}": "Неподдерживаемый OID хеша {{digestOid}}", + "Unsupported file type: .{{ext}}": "Неподдерживаемый тип файла: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Неподдерживаемый OID алгоритма подписи {{oid}}", + "Unterminated array or dictionary in content stream": "Незавершённый массив или словарь в потоке содержимого", + "Unterminated hex string in content stream": "Незавершённая шестнадцатеричная строка в потоке содержимого", + "Unterminated inline image in content stream": "Незавершённое встроенное изображение в потоке содержимого", + "Unterminated string in content stream": "Незавершённая строка в потоке содержимого", + "Unverified: Unsupported Signature Algorithm": "Не проверена: неподдерживаемый алгоритм подписи", + "Updating metadata...": "Обновление метаданных...", + "Upload Certificate": "Загрузить сертификат", + "Upload Comics": "Загрузить комиксы", + "Upload Documents": "Загрузить документы", + "Upload EPUB Files": "Загрузить файлы EPUB", + "Upload Email Files": "Загрузить файлы электронной почты", + "Upload FB2 Files": "Загрузить файлы FB2", + "Upload Images": "Загрузить изображения", + "Upload JSON Files": "Загрузить файлы JSON", + "Upload MOBI Files": "Загрузить файлы MOBI", + "Upload Markdown Files": "Загрузить файлы Markdown", + "Upload ODG Files": "Загрузить файлы ODG", + "Upload PDFs": "Загрузить PDF", + "Upload PUB Files": "Загрузить файлы PUB", + "Upload Pages Files": "Загрузить файлы Pages", + "Upload Presentations": "Загрузить презентации", + "Upload SVG Files": "Загрузить файлы SVG", + "Upload Spreadsheets": "Загрузить таблицы", + "Upload Text Files": "Загрузить текстовые файлы", + "Upload Visio Files": "Загрузить файлы Visio", + "Upload WPD Files": "Загрузить файлы WPD", + "Upload WPS Files": "Загрузить файлы WPS", + "Upload XML Files": "Загрузить файлы XML", + "Upload XPS Files": "Загрузить файлы XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Загрузите PDF и нажмите «Создать предпросмотр», чтобы увидеть раскладку буклета", + "Upload images and convert to PDF": "Загрузите изображения и конвертируйте их в PDF", + "Upload one or more PDF files": "Загрузите один или несколько файлов PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Заглавные A-Z, цифры 0-9 и - . $ / + % ПРОБЕЛ", + "Use same password for all files": "Использовать один пароль для всех файлов", + "User Password": "Пароль пользователя", + "VSD to PDF": "VSD в PDF", + "Valid From": "Действительна с", + "Valid Signature": "Действительная подпись", + "Valid Until": "Действительна до", + "Validating {{n}} of {{length}}: {{name}}": "Проверка {{n}} из {{length}}: {{name}}", + "Validating...": "Проверка...", + "Value": "Значение", + "Value (e.g., Marketing)": "Значение (например, Маркетинг)", + "Vertical": "По вертикали", + "Viewer not ready": "Просмотрщик не готов", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Просмотрщик не готов. Загрузите PDF и дождитесь окончания загрузки.", + "Visibility": "Видимость", + "Visio Files": "Файлы Visio", + "WPD to PDF": "WPD в PDF", + "WPS Files": "Файлы WPS", + "WPS to PDF": "WPS в PDF", + "Watermark": "Водяной знак", + "Watermark added successfully!": "Водяной знак успешно добавлен!", + "Web Crypto API not available in this context": "Web Crypto API недоступен в этом контексте", + "Web Crypto import/verify failed: {{error}}": "Ошибка импорта/проверки Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "Белый список", + "Width ({{unit}})": "Ширина ({{unit}})", + "Word": "Word", + "Word Documents": "Документы Word", + "Word to PDF": "Word в PDF", + "WordPerfect Files": "Файлы WordPerfect", + "Worker crashed": "Обработчик аварийно завершился", + "Worker error occurred. Check console for details.": "Ошибка обработчика. Подробности в консоли.", + "Workflow completed": "Рабочий процесс завершён", + "Wrong password": "Неверный пароль", + "Wrong password for: {{join}}": "Неверный пароль для: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Неверный пароль, или не удалось расшифровать «{{name}}».", + "X Position": "Позиция по X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Файлы XML", + "XML to PDF": "XML в PDF", + "XMP Metadata": "Метаданные XMP", + "XPS Files": "Файлы XPS", + "XPS to PDF": "XPS в PDF", + "Y Position": "Позиция по Y", + "Year must be between 1900 and 2100": "Год должен быть от 1900 до 2100", + "Yellow": "Жёлтый", + "Yellowish": "Желтоватый", + "You cannot delete the last page of the document.": "Нельзя удалить последнюю страницу документа.", + "Your PDF has been cropped and the download has started.": "PDF обрезан, скачивание началось.", + "Your PDF has been downloaded successfully.": "PDF успешно скачан.", + "Your PDF has been posterized.": "PDF постеризован.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Ваши вымарывания применены к страницам, но этот файл зашифрован, поэтому BentoPDF не может заодно удалить копии вымаранного текста из его свойств, закладок и вложений. Для полной очистки вымарайте текст в незашифрованной копии, а затем добавьте пароль через «Защита PDF». Всё равно скачать?", + "Your workflow needs at least one input node and one output node to run.": "Для запуска рабочему процессу нужен хотя бы один входной и один выходной узел.", + "ZIP archive created successfully!": "ZIP-архив успешно создан!", + "Zoom(%)": "Масштаб (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "например, дд.мм.гггг ЧЧ:ММ:сс", + "form": "форма", + "https://example.com": "https://example.com", + "signature found": "подпись найдена", + "signatures found": "подписи найдены", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "Узлов: {{count}}", + "{{count}} nodes": "Узлов: {{count}}", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 страница", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • страниц: {{pageCount}}", + "{{length}} Files Need a Password": "Файлам нужен пароль: {{length}}", + "{{length}} PDF file(s) selected": "Выбрано файлов PDF: {{length}}", + "{{length}} PDF files selected": "Выбрано файлов PDF: {{length}}", + "{{length}} attachment(s) extracted successfully!": "Вложений успешно извлечено: {{length}}!", + "{{length}} file • {{totalPages}} total pages": "Файлов: {{length}} • всего страниц: {{totalPages}}", + "{{length}} file(s) attached successfully.": "Файлов успешно прикреплено: {{length}}.", + "{{length}} files • {{totalPages}} total pages": "Файлов: {{length}} • всего страниц: {{totalPages}}", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Файл был защищён паролем, поэтому у сжатой копии пароля нет. Добавьте его снова через «Защита PDF».", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, страниц: {{totalPageCount}})", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} подписан цифровой подписью, поэтому его оставили как есть. Сжатие нарушило бы подпись. Чтобы всё равно сжать его, включите «Обойти защиту содержимого» в пользовательских настройках; его подписи будут удалены.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} не является корректным PDF, поэтому не был добавлен.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} защищён паролем. Введите пароль на карточке файла, затем снова запустите сжатие.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (p{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Не удалось загрузить число страниц", + "{{size}} • Loading pages...": "{{size}} • Загрузка страниц...", + "{{size}} • Loading...": "{{size}} • Загрузка...", + "{{size}} • {{getPageCount}} pages": "{{size}} • страниц: {{getPageCount}}", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • страниц: {{numPages}}", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • страниц: {{pageCount}}", + "{{size}} • {{totalPages}} pages": "{{size}} • страниц: {{totalPages}}", + "{{size}} • {{value}} pages": "{{size}} • страниц: {{value}}", + "{{successCount}} PDF(s) decrypted successfully.": "Успешно расшифровано PDF: {{successCount}}.", + "{{successCount}} PDF(s) linearized successfully.": "Успешно линеаризовано PDF: {{successCount}}.", + "{{totalPages}} pages → {{numSheets}} output sheets": "Страниц: {{totalPages}} → выходных листов: {{numSheets}}", + "{{validCount}} valid": "Действительных: {{validCount}}", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 страница", + "• {{label}}: {{count}} pages": "• {{label}}: страниц: {{count}}" +} diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 5c68104f..96d6c1b0 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Otvoriť hlavné menu", "language": "Jazyk", "searchLanguage": "Hľadať jazyk…", - "noLanguagesFound": "Nenašli sa žiadne jazyky" + "noLanguagesFound": "Nenašli sa žiadne jazyky", + "breadcrumb": "Navigačná cesta" }, "donation": { "message": "Páči sa vám BentoPDF? Pomôžte nám udržať ho bezplatný a open source!", @@ -236,6 +237,10 @@ "aboutUs": "O nás", "faqLink": "Časté otázky", "contactUs": "Kontaktujte nás", + "tools": "Nástroje", + "pdfConverter": "Konvertor PDF", + "pdfSecurity": "Zabezpečenie PDF", + "mergeSplit": "Zlúčenie a rozdelenie PDF", "legal": "Právne informácie", "termsAndConditions": "Obchodné podmienky", "privacyPolicy": "Zásady ochrany osobných údajov", diff --git a/public/locales/sk/tools.json b/public/locales/sk/tools.json index 248a877d..5d84144c 100644 --- a/public/locales/sk/tools.json +++ b/public/locales/sk/tools.json @@ -20,14 +20,29 @@ }, "convertToPdf": "Previesť do PDF", "pdfMultiTool": { - "name": "PDF Multi Nástroj", + "name": "Multinástroj PDF", "subtitle": "Spojiť, rozdeliť, organizovať, mazať, otáčať, pridávať prázdne strany, extrahovať a duplikovať v jednotnom rozhraní." }, "mergePdf": { "name": "Spojiť PDF", "subtitle": "Spojiť viacero PDF do jedného súboru. Zachováva záložky.", "retainPageLabels": "Zachovať pôvodné označenia strán z každého súboru", - "retainPageLabelsHint": "Vypnuté (predvolené): spojené PDF používa prirodzené číslovanie strán 1–N. Zapnuté: zachovajú sa pôvodné označenia strán každého súboru (môže produkovať duplicitné označenia)." + "retainPageLabelsHint": "Vypnuté (predvolené): spojené PDF používa prirodzené číslovanie strán 1–N. Zapnuté: zachovajú sa pôvodné označenia strán každého súboru (môže produkovať duplicitné označenia).", + "removeDuplicateFonts": "Odstrániť duplicitné písma", + "alert": { + "thumbnailError": "Nepodarilo sa vykresliť náhľady strán", + "noSelection": "Nie sú vybrané žiadne súbory ani strany na spojenie.", + "mergeSuccess": "PDF boli úspešne spojené!", + "mergeFailed": "Nepodarilo sa spojiť PDF.", + "mergeError": "Nepodarilo sa spojiť PDF. Skontrolujte, či sú všetky súbory platné a nie sú chránené heslom.", + "workerError": "Pri spájaní nastala neočakávaná chyba.", + "loadError": "Nepodarilo sa načítať jeden alebo viac súborov PDF" + }, + "loader": { + "renderingPreviews": "Vykresľujú sa náhľady strán...", + "merging": "Spájajú sa PDF...", + "loadingDocuments": "Načítavajú sa dokumenty PDF..." + } }, "splitPdf": { "name": "Rozdeliť PDF", @@ -38,7 +53,7 @@ "subtitle": "Zmenšiť veľkosť súboru vášho PDF." }, "pdfEditor": { - "name": "PDF Editor", + "name": "Editor PDF", "subtitle": "Anotovať, zvýrazňovať, redigovať, komentovať, pridávať tvary/obrázky, vyhľadávať a prezerať PDF." }, "editPdfText": { @@ -503,7 +518,8 @@ "noFile": "Žiadny súbor", "noFileExplanation": "Najskôr nahrajte PDF súbor.", "conversionSuccess": "PDF bolo úspešne skonvertované do TIFF!", - "conversionError": "Nepodarilo sa skonvertovať PDF do TIFF. Súbor môže byť poškodený." + "conversionError": "Nepodarilo sa skonvertovať PDF do TIFF. Súbor môže byť poškodený.", + "conversionOutOfMemory": "Prehliadaču počas konverzie došla pamäť. Skúste nižšie DPI alebo zrušte možnosť viacstranového TIFF a konvertujte strany po jednej." } }, "pdfToCbz": { @@ -793,10 +809,10 @@ }, "decryptPdf": { "name": "Dešifrovať PDF", - "subtitle": "Odomknúť PDF odstránením ochrany heslom." + "subtitle": "Odstráňte heslo z PDF, aby sa dalo voľne otvoriť. Vyžaduje sa aktuálne heslo." }, "flattenPdf": { - "name": "Zlúčiť vrstvy PDF", + "name": "Sploštiť PDF", "subtitle": "Urobiť formulárové polia a anotácie neupraviteľnými." }, "removeMetadata": { @@ -864,7 +880,7 @@ "optTypographer": "Typografia (chytré úvodzovky, atď.)" }, "pdfBooklet": { - "name": "PDF Brožúra", + "name": "PDF brožúra", "subtitle": "Preusporiadať strany pre obojstrannú tlač brožúry. Preložte a zošijte, aby ste vytvorili brožúru.", "howItWorks": "Ako to funguje:", "step1": "Nahrajte PDF súbor.", @@ -986,7 +1002,7 @@ "subtitle": "Extrahovať tabuľky z PDF a previesť ich do formátu Excel (XLSX)." }, "pdfToText": { - "name": "PDF do Textu", + "name": "PDF do textu", "subtitle": "Extrahovať text z PDF súborov a uložiť ho ako obyčajný text (.txt). Podporuje viacero súborov.", "noteLabel": "Poznámka:", "noteText": "Tento nástroj funguje IBA s digitálne vytvorenými PDF. Pre naskenované dokumenty alebo PDF založené na obrázkoch použite radšej náš nástroj Rozpoznávanie textu (OCR) PDF.", @@ -1079,7 +1095,7 @@ "internetRequiredDescription": "Podpisovanie môže vyžadovať načítanie informácií o reťazci certifikátov zo servera vydavateľa vášho certifikátu, aby sa podpis overil." }, "validateSignaturePdf": { - "name": "Overiť PDF podpis", + "name": "Overiť podpis PDF", "pageTitle": "Overiť PDF podpis - Verifikácia digitálnych podpisov | BentoPDF", "subtitle": "Overte digitálne podpisy vo vašich PDF súboroch. Skontrolujte platnosť certifikátu, zobrazte údaje o podpisujúcom a potvrďte integritu dokumentu. Všetko spracovanie prebieha vo vašom prehliadači." }, @@ -1123,7 +1139,7 @@ "subtitle": "Extrahovať obsah PDF ako LlamaIndex JSON pre RAG/LLM procesy." }, "pdfOcg": { - "name": "PDF OCG (Vrstvy)", + "name": "PDF OCG (vrstvy)", "subtitle": "Zobraziť, prepínať, pridávať a odstraňovať vrstvy OCG vo vašom PDF." }, "pdfToPdfa": { @@ -1301,11 +1317,11 @@ "faqPrivacyAnswer": "Absolútne! Všetko spracovanie prebieha vo vašom prehliadači. Vaše súbory nikdy neopustia vaše zariadenie, čo zabezpečuje úplné súkromie." }, "unlockPdf": { - "name": "Dešifrovať PDF", + "name": "Odomknúť PDF", "subtitle": "Odomknúť PDF odstránením ochrany heslom." }, "protectPdf": { - "name": "Zašifrovať PDF", + "name": "Chrániť PDF heslom", "subtitle": "Uzamknúť vaše PDF pridaním hesla." } } diff --git a/public/locales/sk/ui.json b/public/locales/sk/ui.json new file mode 100644 index 00000000..8582c64a --- /dev/null +++ b/public/locales/sk/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(opravené)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} ďalších...", + "- Error parsing XMP XML. Displaying raw. -": "- Chyba pri spracovaní XMP XML. Zobrazujú sa nespracované údaje. -", + "- No Info Dictionary data found -": "- Nenašli sa žiadne údaje informačného slovníka -", + "- No XMP metadata found -": "- Nenašli sa žiadne metadáta XMP -", + "- No interactive form fields found -": "- Nenašli sa žiadne interaktívne polia formulára -", + "- No parseable XMP properties found -": "- Nenašli sa žiadne spracovateľné vlastnosti XMP -", + "-- Select existing group --": "-- Vybrať existujúcu skupinu --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (veľmi citlivé)", + "0.5° (Default)": "0,5° (predvolené)", + "1.0° (Normal)": "1,0° (normálne)", + "100 (Fast)": "100 (rýchle)", + "150 (Default)": "150 (predvolené)", + "1x2 (Booklet)": "1x2 (brožúra)", + "2.0° (Less Sensitive)": "2,0° (menej citlivé)", + "200 (Better)": "200 (lepšie)", + "200 (Good)": "200 (dobré)", + "2x2 (4-up)": "2x2 (4 na stranu)", + "2x4 (8-up)": "2x4 (8 na stranu)", + "300 (Best Quality)": "300 (najlepšia kvalita)", + "300 (Print)": "300 (tlač)", + "4x4 (16-up)": "4x4 (16 na stranu)", + "600 (High Quality)": "600 (vysoká kvalita)", + "72 (Screen)": "72 (obrazovka)", + "90° Clockwise": "90° v smere hodinových ručičiek", + "90° Counter-clockwise": "90° proti smeru hodinových ručičiek", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Pole s názvom „{{fieldName}}“ už existuje. Pred stiahnutím toto pole premenujte, aby malo jedinečný názov.", + "A new version of BentoPDF is available. Reload to update?": "Je dostupná nová verzia BentoPDF. Načítať znova a aktualizovať?", + "A single PDF file": "Jeden súbor PDF", + "A template with this name already exists.": "Šablóna s týmto názvom už existuje.", + "ASCII characters (letters, numbers, symbols)": "Znaky ASCII (písmená, čísla, symboly)", + "Action": "Akcia", + "Add Blank Page": "Pridať prázdnu stranu", + "Add Bookmark": "Pridať záložku", + "Add Child Bookmark": "Pridať podriadenú záložku", + "Add Child Layer": "Pridať podriadenú vrstvu", + "Add More Comics": "Pridať ďalšie komiksy", + "Add More Documents": "Pridať ďalšie dokumenty", + "Add More EPUB Files": "Pridať ďalšie súbory EPUB", + "Add More Email Files": "Pridať ďalšie e-mailové súbory", + "Add More FB2 Files": "Pridať ďalšie súbory FB2", + "Add More Files": "Pridať ďalšie súbory", + "Add More Images": "Pridať ďalšie obrázky", + "Add More JSON Files": "Pridať ďalšie súbory JSON", + "Add More MOBI Files": "Pridať ďalšie súbory MOBI", + "Add More Markdown Files": "Pridať ďalšie súbory Markdown", + "Add More ODG Files": "Pridať ďalšie súbory ODG", + "Add More PUB Files": "Pridať ďalšie súbory PUB", + "Add More Pages Files": "Pridať ďalšie súbory Pages", + "Add More Presentations": "Pridať ďalšie prezentácie", + "Add More SVG Files": "Pridať ďalšie súbory SVG", + "Add More Spreadsheets": "Pridať ďalšie tabuľky", + "Add More Text Files": "Pridať ďalšie textové súbory", + "Add More Visio Files": "Pridať ďalšie súbory Visio", + "Add More WPD Files": "Pridať ďalšie súbory WPD", + "Add More WPS Files": "Pridať ďalšie súbory WPS", + "Add More XML Files": "Pridať ďalšie súbory XML", + "Add More XPS Files": "Pridať ďalšie súbory XPS", + "Add a new layer to get started!": "Začnite pridaním novej vrstvy!", + "Add a text box": "Pridať textové pole", + "Add an RFC 3161 document timestamp": "Pridať časovú pečiatku dokumentu RFC 3161", + "Add an image": "Pridať obrázok", + "Add at least one node to run the workflow.": "Na spustenie pracovného postupu pridajte aspoň jeden uzol.", + "Add child": "Pridať podriadený prvok", + "Add child layer": "Pridať podriadenú vrstvu", + "Add header and footer text": "Pridať text hlavičky a päty", + "Add page numbers": "Pridať čísla strán", + "Add searchable text layer via OCR": "Pridať vyhľadateľnú textovú vrstvu pomocou OCR", + "Add text watermark": "Pridať textový vodoznak", + "Add/Edit/Extract Attachments": "Pridať/upraviť/extrahovať prílohy", + "Added": "Pridané", + "Added \"{{afterText}}\"": "Pridané „{{afterText}}“", + "Added image ({{width}}×{{height}})": "Pridaný obrázok ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "Prázdna strana ({{insertCount}}) bola úspešne pridaná!", + "Added {{insertCount}} blank pages successfully!": "Prázdne strany ({{insertCount}}) boli úspešne pridané!", + "Adding header & footer...": "Pridáva sa hlavička a päta...", + "Adding page numbers...": "Pridávajú sa čísla strán...", + "Adding watermark...": "Pridáva sa vodoznak...", + "Adding {{insertCount}} blank page...": "Pridáva sa prázdna strana ({{insertCount}})...", + "Adding {{insertCount}} blank pages...": "Pridávajú sa prázdne strany ({{insertCount}})...", + "Adding {{name}} ({{n}}/{{length}})...": "Pridáva sa {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Upraviť farby", + "Adjust brightness, contrast, and colors": "Upravte jas, kontrast a farby", + "Advanced": "Rozšírené", + "Advanced Feature Required": "Vyžaduje sa pokročilá funkcia", + "Advanced Settings": "Rozšírené nastavenia", + "After Page": "Za stranou", + "After Page...": "Za stranou...", + "Align Objects": "Zarovnať objekty", + "Alignment": "Zarovnanie", + "All": "Všetko", + "All files repaired successfully!": "Všetky súbory boli úspešne opravené!", + "Alternate Merge": "Striedavé spojenie", + "Alternating and mixing pages...": "Striedajú sa a miešajú strany...", + "Always resample to that resolution": "Vždy prevzorkovať na toto rozlíšenie", + "An error occurred during compression. Error: {{error}}": "Pri kompresii sa vyskytla chyba. Chyba: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Pri konverzii sa vyskytla chyba. Chyba: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Pri konverzii sa vyskytla chyba. Chyba: {{message}}", + "An error occurred during cropping.": "Pri orezávaní sa vyskytla chyba.", + "An error occurred during extraction. Error: {{error}}": "Pri extrakcii sa vyskytla chyba. Chyba: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Pri rastrovaní sa vyskytla chyba. Chyba: {{error}}", + "An error occurred during sanitization: {{msg}}": "Pri čistení sa vyskytla chyba: {{msg}}", + "An error occurred while combining pages.": "Pri spájaní strán sa vyskytla chyba.", + "An error occurred while creating the N-Up PDF.": "Pri vytváraní N-Up PDF sa vyskytla chyba.", + "An error occurred while creating the booklet.": "Pri vytváraní brožúry sa vyskytla chyba.", + "An error occurred while dividing the PDF.": "Pri rozdeľovaní PDF sa vyskytla chyba.", + "An error occurred while mixing the PDFs.": "Pri miešaní PDF sa vyskytla chyba.", + "An error occurred while standardizing pages.": "Pri zjednocovaní strán sa vyskytla chyba.", + "An error occurred while trying to remove metadata.": "Pri odstraňovaní metadát sa vyskytla chyba.", + "An error occurred: {{error}}": "Vyskytla sa chyba: {{error}}", + "An error occurred: {{error}}.": "Vyskytla sa chyba: {{error}}.", + "An owner password is required when setting permissions": "Pri nastavovaní oprávnení je potrebné heslo vlastníka", + "An unexpected error occurred during the repair process.": "Pri oprave sa vyskytla neočakávaná chyba.", + "An unexpected error occurred.": "Vyskytla sa neočakávaná chyba.", + "Analyzing data structure...": "Analyzuje sa štruktúra údajov...", + "Analyzing full PDF metadata...": "Analyzujú sa kompletné metadáta PDF...", + "Analyzing signatures...": "Analyzujú sa podpisy...", + "Angle": "Uhol", + "Annotations removed successfully!": "Poznámky boli úspešne odstránené!", + "Any text, URL, or data": "Ľubovoľný text, URL alebo údaje", + "Application": "Aplikácia", + "Apply a digital signature to PDF": "Použiť digitálny podpis na PDF", + "Apply and download": "Použiť a stiahnuť", + "Apply redactions?": "Použiť začiernenia?", + "Apply scanner simulation effect": "Použiť efekt simulácie skenera", + "Applying Bates numbers...": "Používajú sa Batesove čísla...", + "Applying color adjustments...": "Používajú sa úpravy farieb...", + "Applying crop...": "Používa sa orezanie...", + "Applying redactions...": "Používajú sa začiernenia...", + "Applying rotations...": "Používajú sa otočenia...", + "Applying scanner effect...": "Používa sa efekt skenera...", + "Applying timestamp...": "Pridáva sa časová pečiatka...", + "Applying {{replace}}...": "Používa sa {{replace}}...", + "Archive contains an oversized image entry.": "Archív obsahuje príliš veľký obrázok.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Archív obsahuje príliš veľa obrázkov (max. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Archív je po rozbalení príliš veľký.", + "Are you sure you want to reset? All your work will be lost.": "Naozaj chcete obnoviť pôvodný stav? Všetka vaša práca sa stratí.", + "Area (Coordinates)": "Oblasť (súradnice)", + "Area ({{unit}}²)": "Oblasť ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman a Courier New sa nahradia vstavanými ekvivalentmi. Použije sa len vtedy, keď je to bezpečné.", + "Arrange multiple pages per sheet": "Usporiadať viac strán na jeden list", + "Arrange pages for booklet printing": "Usporiadať strany na tlač brožúry", + "Aspect Ratio": "Pomer strán", + "At least one PDF document is required for export.": "Na export je potrebný aspoň jeden dokument PDF.", + "At least two valid PDFs are required.": "Sú potrebné aspoň dva platné súbory PDF.", + "Attaching files to PDF...": "Pripájajú sa súbory k PDF...", + "Attachments updated successfully!": "Prílohy boli úspešne aktualizované!", + "Author": "Autor", + "Auto (Keep Original)": "Automaticky (ponechať pôvodné)", + "Back": "Zadná strana", + "Back to Home": "Späť domov", + "Background Color": "Farba pozadia", + "Background color changed successfully!": "Farba pozadia bola úspešne zmenená!", + "Barcode": "Čiarový kód", + "Barcode Format": "Formát čiarového kódu", + "Barcode Value": "Hodnota čiarového kódu", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Batesove čísla boli úspešne použité! ({{batesStart}} až {{n}})", + "Beginning": "Začiatok", + "Binarize": "Binarizovať", + "Blank Position": "Poloha prázdnej strany", + "Blue": "Modrá", + "Blur": "Rozmazanie", + "Bold": "Tučné", + "Bold & Italic": "Tučné a kurzíva", + "Booklet": "Brožúra", + "Booklet created with {{numSheets}} sheets!": "Brožúra bola vytvorená s {{numSheets}} listami!", + "Bookmarks imported from JSON!": "Záložky boli importované z JSON!", + "Bookmarks page": "Strana so záložkami", + "Border": "Orámovanie", + "Border Color": "Farba orámovania", + "Bottom": "Dole", + "Bottom Center": "Dole na stred", + "Bottom Left": "Dole vľavo", + "Bottom Right": "Dole vpravo", + "Bottom edge in points": "Spodný okraj v bodoch", + "Brightness": "Jas", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli a rastrovanie boli preskočené, aby zostal zachovaný formát PDF/A.", + "Brotli compression (PDF 2.0)": "Kompresia Brotli (PDF 2.0)", + "Browser Note:": "Poznámka k prehliadaču:", + "Building new PDF...": "Vytvára sa nové PDF...", + "Building page pairing model...": "Vytvára sa model párovania strán...", + "Button": "Tlačidlo", + "ByteRange does not start at the beginning of the file": "ByteRange nezačína na začiatku súboru", + "ByteRange out of bounds": "ByteRange je mimo rozsahu", + "CBZ to PDF": "CBZ do PDF", + "CSV Loaded": "CSV bolo načítané", + "CSV file is empty": "Súbor CSV je prázdny", + "Cancel": "Zrušiť", + "Cannot Delete": "Nedá sa odstrániť", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "K ovládacím prvkom prehliadača sa nedá pristúpiť. Použite tlačidlo Stiahnuť na paneli nástrojov prehliadača PDF vyššie.", + "Cannot delete all pages": "Nie je možné odstrániť všetky strany", + "Cannot delete all pages.": "Nie je možné odstrániť všetky strany.", + "Canvas context failed": "Kontext canvasu zlyhal", + "Canvas context unavailable": "Kontext canvasu nie je dostupný", + "Canvas toBlob conversion failed.": "Konverzia canvas toBlob zlyhala.", + "Canvas toBlob failed": "Canvas toBlob zlyhal", + "Center": "Na stred", + "Certificate (.pfx, .p12, .pem)": "Certifikát (.pfx, .p12, .pem)", + "Certificate Expired": "Platnosť certifikátu vypršala", + "Certificate Password": "Heslo certifikátu", + "Certificate unlocked": "Certifikát bol odomknutý", + "Change Certificate": "Zmeniť certifikát", + "Change background color": "Zmeniť farbu pozadia", + "Changing background color...": "Mení sa farba pozadia...", + "Changing text color...": "Mení sa farba textu...", + "Character": "Znak", + "Checked State": "Stav začiarknutia", + "Choose a valid page range.": "Vyberte platný rozsah strán.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Vyberte jeden z priložených jazykov alebo znova zostavte offline balík s chýbajúcim jazykom pridaným do --ocr-languages.", + "Cleanup": "Čistenie", + "Click on PDF to Pick Location": "Kliknutím na PDF vyberte miesto", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Kliknite na tlačidlo vyššie a potom na miesto v PDF, kam má záložka smerovať", + "Click to Upload Image": "Kliknutím nahrajte obrázok", + "Clicking this field in the PDF will open a file picker to upload an image.": "Kliknutím na toto pole v PDF sa otvorí výber súboru na nahratie obrázka.", + "Clip invisible parts of images": "Orezať neviditeľné časti obrázkov", + "Close": "Zavrieť", + "Close (Esc)": "Zavrieť (Esc)", + "Close panel": "Zavrieť panel", + "Closes tab": "Zatvorí kartu", + "Closes window": "Zatvorí okno", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (záložky a metadáta)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF nie je nakonfigurovaný. Nakonfigurujte ho v nastaveniach WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF vytvoril prázdny dešifrovaný súbor.", + "CoherentPDF: not configured.": "CoherentPDF: nie je nakonfigurovaný.", + "Color": "Farba", + "Color adjustments applied successfully!": "Úpravy farieb boli úspešne použité!", + "Colors inverted successfully!": "Farby boli úspešne invertované!", + "Cols": "Stĺpce", + "Combine multiple PDFs into one": "Spojiť viac súborov PDF do jedného", + "Combine to Single Page": "Spojiť do jednej strany", + "Combining pages...": "Spájajú sa strany...", + "Comic Archives": "Archívy komiksov", + "Comments and markup become part of the page. Form fields and links keep working.": "Komentáre a značky sa stanú súčasťou strany. Polia formulára a odkazy zostanú funkčné.", + "Complete": "Dokončené", + "Complete!": "Hotovo!", + "Compress": "Komprimovať", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Skomprimované PDF: {{compressedCount}}. Celková veľkosť sa znížila z {{totalOriginalSize}} na {{totalCompressedSize}} (ušetrených {{value}} %).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Skomprimované PDF: {{compressedCount}}. Celková veľkosť: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Komprimuje sa viac súborov PDF...", + "Compressing to {{size}}...": "Komprimuje sa na {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Komprimuje sa {{n}}/{{length}}: {{name}}...", + "Compressing...": "Komprimuje sa...", + "Compression Complete": "Kompresia dokončená", + "Compression Finished": "Kompresia skončila", + "Compression Level": "Úroveň kompresie", + "Configure": "Konfigurovať", + "Confirm": "Potvrdiť", + "Confirm Action": "Potvrdiť akciu", + "Conformance": "Súlad", + "Connected": "Pripojené", + "Contact Info": "Kontaktné údaje", + "Content": "Obsah", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Hash obsahu sa nezhoduje s atribútom messageDigest: PDF bolo po podpísaní zmenené", + "Contrast": "Kontrast", + "Conversion Complete": "Konverzia dokončená", + "Conversion Error": "Chyba konverzie", + "Conversion engine ready!": "Konverzný nástroj je pripravený!", + "Conversion failed: could not create PDF/A definition": "Konverzia zlyhala: nepodarilo sa vytvoriť definíciu PDF/A", + "Convert Apple Pages documents to PDF": "Konvertovať dokumenty Apple Pages do PDF", + "Convert EPUB ebooks to PDF": "Konvertovať e-knihy EPUB do PDF", + "Convert Excel spreadsheets to PDF": "Konvertovať tabuľky Excel do PDF", + "Convert FB2 e-books to PDF": "Konvertovať e-knihy FB2 do PDF", + "Convert JSON files to PDF": "Konvertovať súbory JSON do PDF", + "Convert MOBI e-books to PDF": "Konvertovať e-knihy MOBI do PDF", + "Convert Markdown files to PDF": "Konvertovať súbory Markdown do PDF", + "Convert Microsoft Publisher to PDF": "Konvertovať Microsoft Publisher do PDF", + "Convert OpenDocument Graphics to PDF": "Konvertovať OpenDocument Graphics do PDF", + "Convert PDF pages to SVG": "Konvertovať strany PDF do SVG", + "Convert PDF pages to images (ZIP)": "Konvertovať strany PDF na obrázky (ZIP)", + "Convert PDF tables to CSV": "Konvertovať tabuľky z PDF do CSV", + "Convert PDF tables to Excel": "Konvertovať tabuľky z PDF do Excelu", + "Convert PDF to Markdown text": "Konvertovať PDF na text Markdown", + "Convert PDF to PDF/A for archiving": "Konvertovať PDF do PDF/A na archiváciu", + "Convert PDF to Word document": "Konvertovať PDF na dokument Word", + "Convert PowerPoint presentations to PDF": "Konvertovať prezentácie PowerPoint do PDF", + "Convert SVG files to PDF": "Konvertovať súbory SVG do PDF", + "Convert To Grayscale": "Konvertovať na odtiene sivej", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Konvertovať diagramy Visio (VSD/VSDX) do PDF", + "Convert WPS Office documents to PDF": "Konvertovať dokumenty WPS Office do PDF", + "Convert Word documents to PDF": "Konvertovať dokumenty Word do PDF", + "Convert WordPerfect documents to PDF": "Konvertovať dokumenty WordPerfect do PDF", + "Convert XML documents to PDF": "Konvertovať dokumenty XML do PDF", + "Convert XPS/OXPS documents to PDF": "Konvertovať dokumenty XPS/OXPS do PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Konvertovať archívy komiksov (CBZ/CBR) do PDF", + "Convert email files (.eml, .msg) to PDF": "Konvertovať e-mailové súbory (.eml, .msg) do PDF", + "Convert fonts to vector outlines": "Konvertovať písma na vektorové krivky", + "Convert plain text to PDF": "Konvertovať obyčajný text do PDF", + "Convert to grayscale": "Konvertovať na odtiene sivej", + "Convert to greyscale": "Konvertovať na odtiene sivej", + "Convert to image-based PDF": "Konvertovať na PDF založené na obrázkoch", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "Súbory ({{length}}) so stranami ({{totalPages}}) boli konvertované do SVG!", + "Converted {{pageCount}} pages to SVG!": "Strany ({{pageCount}}) boli konvertované do SVG!", + "Converter not initialized": "Konvertor nie je inicializovaný", + "Converting BMP to PDF...": "Konvertuje sa BMP do PDF...", + "Converting HEIC to PDF...": "Konvertuje sa HEIC do PDF...", + "Converting TIFF to PDF...": "Konvertuje sa TIFF do PDF...", + "Converting emails...": "Konvertujú sa e-maily...", + "Converting files...": "Konvertujú sa súbory...", + "Converting fonts to outlines...": "Konvertujú sa písma na krivky...", + "Converting images to PDF...": "Konvertujú sa obrázky do PDF...", + "Converting multiple PDFs to PDF/A...": "Konvertuje sa viac súborov PDF do PDF/A...", + "Converting multiple RTF files to PDF...": "Konvertuje sa viac súborov RTF do PDF...", + "Converting multiple files...": "Konvertuje sa viac súborov...", + "Converting page {{n}} of {{pageCount}}...": "Konvertuje sa strana {{n}} z {{pageCount}}...", + "Converting to Markdown...": "Konvertuje sa do Markdownu...", + "Converting to SVG...": "Konvertuje sa do SVG...", + "Converting to greyscale...": "Konvertuje sa na odtiene sivej...", + "Converting to {{level}}...": "Konvertuje sa na {{level}}...", + "Converting {{name}}...": "Konvertuje sa {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Konvertuje sa {{n}}/{{length}}: {{name}}...", + "Converting...": "Konvertuje sa...", + "Copied": "Skopírované", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Nepodarilo sa pristúpiť k exportu opečiatkovaného PDF. Použite náhradne tlačidlo Export → PDF na paneli nástrojov prehliadača.", + "Could not add blank page.": "Nepodarilo sa pridať prázdnu stranu.", + "Could not add blank pages.": "Nepodarilo sa pridať prázdne strany.", + "Could not add header or footer.": "Nepodarilo sa pridať hlavičku ani pätu.", + "Could not add page numbers.": "Nepodarilo sa pridať čísla strán.", + "Could not add the watermark.": "Nepodarilo sa pridať vodoznak.", + "Could not apply rotations.": "Nepodarilo sa použiť otočenia.", + "Could not change text color.": "Nepodarilo sa zmeniť farbu textu.", + "Could not change the background color.": "Nepodarilo sa zmeniť farbu pozadia.", + "Could not create ZIP archive.": "Nepodarilo sa vytvoriť archív ZIP.", + "Could not create canvas context.": "Nepodarilo sa vytvoriť kontext canvasu.", + "Could not create comparison canvas context.": "Nepodarilo sa vytvoriť kontext canvasu na porovnanie.", + "Could not create offscreen comparison canvas.": "Nepodarilo sa vytvoriť mimoobrazovkový canvas na porovnanie.", + "Could not create visual diff context.": "Nepodarilo sa vytvoriť kontext vizuálneho porovnania.", + "Could not create visual diff overlay context.": "Nepodarilo sa vytvoriť kontext prekrytia vizuálneho porovnania.", + "Could not detect blank pages.": "Nepodarilo sa zistiť prázdne strany.", + "Could not display the page.": "Nepodarilo sa zobraziť stranu.", + "Could not export comparison PDF.": "Nepodarilo sa exportovať porovnávacie PDF.", + "Could not export the signed PDF. Please try again.": "Nepodarilo sa exportovať podpísané PDF. Skúste to znova.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Nepodarilo sa exportovať opečiatkované PDF. Použite náhradne tlačidlo Export → PDF na paneli nástrojov prehliadača.", + "Could not extract signer public key": "Nepodarilo sa extrahovať verejný kľúč podpisovateľa", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Súbor {{testFile}} sa na zadanej adrese URL nenašiel (HTTP {{status}}). Skontrolujte, či súbor existuje.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "PDF sa nepodarilo úplne analyzovať. Môže byť poškodené alebo mať nezvyčajnú štruktúru.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Nepodarilo sa vytvoriť náhľad. Súbor môže byť poškodený alebo obsahovať nepodporované funkcie. Chyba: {{message}}", + "Could not get canvas context": "Nepodarilo sa získať kontext canvasu", + "Could not invert PDF colors.": "Nepodarilo sa invertovať farby PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "PDF sa nepodarilo načítať. Môže byť poškodené alebo chránené heslom.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "PDF sa nepodarilo načítať. Súbor môže byť neplatný, poškodený alebo chránený heslom.", + "Could not load the PDF engine. Please refresh the page and try again.": "Nepodarilo sa načítať jadro PDF. Obnovte stránku a skúste to znova.", + "Could not parse signer info": "Nepodarilo sa spracovať údaje o podpisovateľovi", + "Could not posterize the PDF.": "Nepodarilo sa posterizovať PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Súbor „{{name}}“ sa nepodarilo spracovať. Môže byť poškodený.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Veľkosť súboru sa nepodarilo ďalej zmenšiť. Pôvodná: {{originalSize}}, nová: {{compressedSize}}.", + "Could not remove annotations.": "Nepodarilo sa odstrániť poznámky.", + "Could not remove blank pages.": "Nepodarilo sa odstrániť prázdne strany.", + "Could not remove leftover data from the PDF.": "Nepodarilo sa odstrániť zvyškové údaje z PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Nepodarilo sa odstrániť začiernený text z údajov dokumentu, preto sa súbor nestiahol.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Nepodarilo sa obrátiť poradie strán PDF. Skontrolujte, či sú vaše súbory platné PDF.", + "Could not update metadata. Please check that date formats are correct.": "Nepodarilo sa aktualizovať metadáta. Skontrolujte, či sú formáty dátumov správne.", + "Count": "Počet", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Vytvorené", + "Creating Booklet...": "Vytvára sa brožúra...", + "Creating Excel file...": "Vytvára sa súbor Excel...", + "Creating N-Up PDF...": "Vytvára sa N-Up PDF...", + "Creating PDF from JPGs...": "Vytvára sa PDF z obrázkov JPG...", + "Creating PDF from SVG files...": "Vytvára sa PDF zo súborov SVG...", + "Creating PDF...": "Vytvára sa PDF...", + "Creating ZIP archive...": "Vytvára sa archív ZIP...", + "Creating ZIP file...": "Vytvára sa súbor ZIP...", + "Creating ZIP...": "Vytvára sa ZIP...", + "Creating table...": "Vytvára sa tabuľka...", + "Creator": "Tvorca", + "Crop": "Orezať", + "Crop complete! Your download has started.": "Orezanie dokončené! Sťahovanie sa začalo.", + "Cryptographic verification failed": "Kryptografické overenie zlyhalo", + "Custom": "Vlastné", + "Custom Format": "Vlastný formát", + "Custom Height": "Vlastná výška", + "Custom Units": "Vlastné jednotky", + "Custom Width": "Vlastná šírka", + "Custom Zoom": "Vlastné priblíženie", + "Custom...": "Vlastná...", + "DataMatrix": "DataMatrix", + "Date Format": "Formát dátumu", + "Decrease size": "Zmenšiť", + "Decrypt": "Dešifrovať", + "Decrypting PDF...": "Dešifruje sa PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Dešifruje sa {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Dešifruje sa {{n}} z {{length}}: {{name}}", + "Decrypting...": "Dešifruje sa...", + "Decryption Failed": "Dešifrovanie zlyhalo", + "Delete": "Odstrániť", + "Delete \"{{title}}\"?": "Odstrániť „{{title}}“?", + "Delete Field": "Odstrániť pole", + "Delete Page": "Odstrániť stranu", + "Delete Pages": "Odstrániť strany", + "Delete all {{length}} bookmark(s) ? ": "Odstrániť všetky záložky ({{length}})?", + "Delete layer": "Odstrániť vrstvu", + "Delete {{size}} bookmark(s) ? ": "Odstrániť záložky ({{size}})?", + "Deleted": "Odstránené", + "Deleted {{size}} page(s) successfully!": "Odstránené strany: {{size}}. Hotovo!", + "Deleting pages...": "Odstraňujú sa strany...", + "Description": "Popis", + "Description for screen readers": "Popis pre čítačky obrazovky", + "Deselect All": "Zrušiť výber všetkých", + "Deskew": "Zarovnať", + "Deskew PDF": "Zarovnať naklonené PDF", + "Deskewed {{length}} file(s). {{value}}": "Zarovnané súbory: {{length}}. {{value}}", + "Deskewing {{name}}...": "Zarovnáva sa {{name}}...", + "Destination": "Cieľ", + "Detecting blank pages...": "Zisťujú sa prázdne strany...", + "Digest Algorithm:": "Algoritmus hashu:", + "Digital Sign": "Digitálny podpis", + "Direction": "Smer", + "Divide Pages": "Rozdeliť strany", + "Divide into boxes (0 to disable)": "Rozdeliť na polia (0 vypne)", + "Document Properties": "Vlastnosti dokumentu", + "Document Type": "Typ dokumentu", + "Document properties": "Vlastnosti dokumentu", + "Document-level attachment": "Príloha na úrovni dokumentu", + "Done: back to tools": "Hotovo, späť k nástrojom", + "Download": "Stiahnuť", + "Download Edited PDF": "Stiahnuť upravené PDF", + "Download anyway": "Stiahnuť aj tak", + "Download as PDF or ZIP automatically": "Automaticky stiahnuť ako PDF alebo ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Súbory PDF ({{length}}) boli stiahnuté v archíve ZIP.", + "Downloads started for all files.": "Sťahovanie všetkých súborov sa začalo.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Odstráni označenie (tagging), na ktoré sa spoliehajú čítačky obrazovky.", + "Duplicate Field Name": "Duplicitný názov poľa", + "Duplicate Field Names": "Duplicitné názvy polí", + "Duplicate Page": "Duplikovať stranu", + "Duplicate Page Numbers": "Duplicitné čísla strán", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Podpis ECDSA sa nedá overiť pomocou verejného kľúča podpisovateľa", + "EPUB Files": "Súbory EPUB", + "EPUB to PDF": "EPUB do PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ do PDF", + "Edit": "Upraviť", + "Edit All": "Upraviť všetko", + "Edit Bookmark": "Upraviť záložku", + "Edit Bookmarks": "Upraviť záložky", + "Edit Images": "Upraviť obrázky", + "Edit Metadata": "Upraviť metadáta", + "Edit PDF metadata": "Upraviť metadáta PDF", + "Edit Scope": "Rozsah úprav", + "Edit Shapes": "Upraviť tvary", + "Edit Text": "Upraviť text", + "Edit tool": "Nástroj na úpravy", + "Edit {{scopes}}": "Upraviť: {{scopes}}", + "Email Files": "E-mailové súbory", + "Email to PDF": "E-mail do PDF", + "Embedding files into PDF...": "Vkladajú sa súbory do PDF...", + "Empty signature bytes": "Prázdne bajty podpisu", + "Encrypt": "Zašifrovať", + "Encrypt PDF with password": "Zašifrovať PDF heslom", + "Encrypted file": "Zašifrovaný súbor", + "Encrypting PDF with 256-bit AES...": "Šifruje sa PDF pomocou 256-bitového AES...", + "Encryption Failed": "Šifrovanie zlyhalo", + "Encryption resulted in an empty file.": "Šifrovaním vznikol prázdny súbor.", + "End": "Koniec", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Zadajte 0 na vloženie na začiatok alebo {{pageCount}} na vloženie na koniec.", + "Enter bookmark title": "Zadajte názov záložky", + "Enter name for child layer under \"{{Layer}}\":": "Zadajte názov podriadenej vrstvy pod „{{Layer}}“:", + "Enter password": "Zadajte heslo", + "Enter password...": "Zadajte heslo...", + "Enter passwords for each encrypted file": "Zadajte heslá pre každý zašifrovaný súbor", + "Error": "Chyba", + "Error during execution": "Chyba pri vykonávaní", + "Error generating PDF: {{error}}": "Chyba pri vytváraní PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Chyba pri načítaní súboru PDF. Skúste to znova s platným PDF.", + "Error reading files: {{error}}": "Chyba pri čítaní súborov: {{error}}", + "Error saving PDF. Check console for details.": "Chyba pri ukladaní PDF. Podrobnosti nájdete v konzole.", + "Error: {{error}}": "Chyba: {{error}}", + "Exactly 11 or 12 digits": "Presne 11 alebo 12 číslic", + "Exactly 12 or 13 digits": "Presne 12 alebo 13 číslic", + "Example of current format:": "Príklad aktuálneho formátu:", + "Excel to PDF": "Excel do PDF", + "Existing Radio Groups": "Existujúce skupiny prepínačov", + "Export Error": "Chyba exportu", + "Export Value": "Exportná hodnota", + "Export failed": "Export zlyhal", + "External processing module needed": "Je potrebný externý spracovateľský modul", + "Extract Images": "Extrahovať obrázky", + "Extract Pages": "Extrahovať strany", + "Extract Tables": "Extrahovať tabuľky", + "Extract a range of pages": "Extrahovať rozsah strán", + "Extract all images from PDF": "Extrahovať všetky obrázky z PDF", + "Extract pages as separate PDFs": "Extrahovať strany ako samostatné PDF", + "Extract text from PDF": "Extrahovať text z PDF", + "Extracted 1 table successfully!": "Tabuľka bola úspešne extrahovaná!", + "Extracted text from {{length}} PDF files!": "Text bol extrahovaný z {{length}} súborov PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Extrahované PDF: {{completed}}, zlyhalo: {{failed}}.", + "Extracted {{length}} page(s) successfully!": "Extrahované strany: {{length}}. Hotovo!", + "Extracted {{length}} table(s) to Excel!": "Tabuľky ({{length}}) boli extrahované do Excelu!", + "Extracted {{length}} tables successfully!": "Tabuľky ({{length}}) boli úspešne extrahované!", + "Extracting attachments from {{length}} file(s)...": "Extrahujú sa prílohy zo súborov ({{length}})...", + "Extracting images from {{name}}...": "Extrahujú sa obrázky zo súboru {{name}}...", + "Extracting pages...": "Extrahujú sa strany...", + "Extracting tables...": "Extrahujú sa tabuľky...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Extrahuje sa text zo súboru {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Extrahuje sa text z viacerých súborov...", + "Extracting text from {{name}}...": "Extrahuje sa text zo súboru {{name}}...", + "Extracting text...": "Extrahuje sa text...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Extrahuje sa {{name}} pre AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Extrahuje sa {{name}} pre AI...", + "Extracting...": "Extrahuje sa...", + "Extraction Complete": "Extrakcia dokončená", + "Extraction Error": "Chyba extrakcie", + "Extraction Partial": "Čiastočná extrakcia", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extrakcia dokončená! Prílohy v súbore ZIP: {{length}} ({{totalSize}}). Sťahovanie sa začalo.", + "FB2 Files": "Súbory FB2", + "FB2 to PDF": "FB2 do PDF", + "Failed": "Zlyhalo", + "Failed to acquire 2D canvas context": "Nepodarilo sa získať 2D kontext canvasu", + "Failed to add child layer": "Nepodarilo sa pridať podriadenú vrstvu", + "Failed to apply Bates numbers.": "Nepodarilo sa použiť Batesove čísla.", + "Failed to apply color adjustments. The file might be corrupted.": "Nepodarilo sa použiť úpravy farieb. Súbor môže byť poškodený.", + "Failed to apply redactions.": "Nepodarilo sa použiť začiernenia.", + "Failed to apply scanner effect. The file might be corrupted.": "Nepodarilo sa použiť efekt skenera. Súbor môže byť poškodený.", + "Failed to attach files: {{error}}": "Nepodarilo sa pripojiť súbory: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Nepodarilo sa konvertovať BMP do PDF. Niektorý zo súborov môže byť neplatný.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Nepodarilo sa konvertovať HEIC do PDF. Niektorý zo súborov môže byť neplatný.", + "Failed to convert PDF to CSV. {{message}}": "Nepodarilo sa konvertovať PDF do CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Nepodarilo sa konvertovať PDF do Excelu. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Nepodarilo sa konvertovať PDF do SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Nepodarilo sa konvertovať PDF na odtiene sivej. Súbor môže byť poškodený.", + "Failed to convert PDF. It may be image-based or corrupted.": "Nepodarilo sa konvertovať PDF. Môže byť založené na obrázkoch alebo poškodené.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Nepodarilo sa konvertovať TIFF do PDF. Niektorý zo súborov môže byť neplatný.", + "Failed to convert images to PDF.": "Nepodarilo sa konvertovať obrázky do PDF.", + "Failed to convert text to PDF. {{error}}": "Nepodarilo sa konvertovať text do PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Nepodarilo sa konvertovať {{filename}} do PNG", + "Failed to copy metadata to clipboard.": "Nepodarilo sa skopírovať metadáta do schránky.", + "Failed to create PDF.": "Nepodarilo sa vytvoriť PDF.", + "Failed to create PNG blob": "Nepodarilo sa vytvoriť blob PNG", + "Failed to create canvas context": "Nepodarilo sa vytvoriť kontext canvasu", + "Failed to create split PDFs.": "Nepodarilo sa vytvoriť rozdelené PDF.", + "Failed to decode image: {{name}}": "Nepodarilo sa dekódovať obrázok: {{name}}", + "Failed to decrypt private key": "Nepodarilo sa dešifrovať súkromný kľúč", + "Failed to decrypt. Try the Decrypt tool instead.": "Dešifrovanie zlyhalo. Skúste namiesto toho nástroj Dešifrovať.", + "Failed to delete layer": "Nepodarilo sa odstrániť vrstvu", + "Failed to delete pages.": "Nepodarilo sa odstrániť strany.", + "Failed to deskew PDF: {{error}}": "Nepodarilo sa zarovnať naklonené PDF: {{error}}", + "Failed to download the edited PDF.": "Nepodarilo sa stiahnuť upravené PDF.", + "Failed to edit attachments.": "Nepodarilo sa upraviť prílohy.", + "Failed to extract certificate from PFX file": "Nepodarilo sa extrahovať certifikát zo súboru PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Nepodarilo sa extrahovať strany (kód ukončenia qpdf {{exitCode}}).", + "Failed to extract pages.": "Nepodarilo sa extrahovať strany.", + "Failed to extract tables. {{message}}": "Nepodarilo sa extrahovať tabuľky. {{message}}", + "Failed to extract text from PDF.": "Nepodarilo sa extrahovať text z PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Nepodarilo sa načítať profil ICC z {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Nepodarilo sa načítať súbor písma: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Nepodarilo sa načítať gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Nepodarilo sa načítať {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Nepodarilo sa získať 2D kontext pre stranu {{pageNumber}}", + "Failed to get canvas context": "Nepodarilo sa získať kontext canvasu", + "Failed to insert PDF. The file may be corrupted.": "Nepodarilo sa vložiť PDF. Súbor môže byť poškodený.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Nepodarilo sa načítať Ghostscript z {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Nepodarilo sa načítať súbor PDF.", + "Failed to load PDF for cropping.": "Nepodarilo sa načítať PDF na orezanie.", + "Failed to load PDF for preview.": "Nepodarilo sa načítať PDF na náhľad.", + "Failed to load PDF form viewer.": "Nepodarilo sa načítať prehliadač PDF formulárov.", + "Failed to load PDF layers": "Nepodarilo sa načítať vrstvy PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Nepodarilo sa načítať PyMuPDF z CDN: {{msg}}", + "Failed to load SVG image": "Nepodarilo sa načítať obrázok SVG", + "Failed to load WebP image": "Nepodarilo sa načítať obrázok WebP", + "Failed to load attachments from PDF.": "Nepodarilo sa načítať prílohy z PDF.", + "Failed to load files: {{error}}": "Nepodarilo sa načítať súbory: {{error}}", + "Failed to load image.": "Nepodarilo sa načítať obrázok.", + "Failed to load image: {{filename}}": "Nepodarilo sa načítať obrázok: {{filename}}", + "Failed to load one or more PDF files.": "Nepodarilo sa načítať jeden alebo viac súborov PDF.", + "Failed to load script: {{url}}": "Nepodarilo sa načítať skript: {{url}}", + "Failed to load template.": "Nepodarilo sa načítať šablónu.", + "Failed to load the PDF Editor.": "Nepodarilo sa načítať Editor PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Nepodarilo sa načítať spracovanie obrázkov. Uistite sa, že váš prehliadač podporuje SharedArrayBuffer (vyžaduje HTTPS alebo localhost).", + "Failed to parse CSV: {{error}}": "Nepodarilo sa spracovať CSV: {{error}}", + "Failed to parse signature": "Nepodarilo sa spracovať podpis", + "Failed to parse the certificate file.": "Nepodarilo sa spracovať súbor certifikátu.", + "Failed to process HEIC file: {{name}}": "Nepodarilo sa spracovať súbor HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Nepodarilo sa spracovať súbor WebP: {{name}}", + "Failed to read file.": "Nepodarilo sa prečítať súbor.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Nepodarilo sa odstrániť obmedzenia. PDF môže vyžadovať správne heslo vlastníka.", + "Failed to render page": "Nepodarilo sa vykresliť stranu", + "Failed to render page previews": "Nepodarilo sa vykresliť náhľady strán", + "Failed to render page previews.": "Nepodarilo sa vykresliť náhľady strán.", + "Failed to render page.": "Nepodarilo sa vykresliť stranu.", + "Failed to save changes.": "Nepodarilo sa uložiť zmeny.", + "Failed to save the new PDF. Check console for details.": "Nepodarilo sa uložiť nové PDF. Podrobnosti nájdete v konzole.", + "Failed to split PDF. Please check your selection.": "Nepodarilo sa rozdeliť PDF. Skontrolujte svoj výber.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Nepodarilo sa pridať časovú pečiatku do PDF: {{message}}\n\nSkúste iný server TSA alebo skontrolujte pripojenie na internet.", + "Failed to toggle layer visibility": "Nepodarilo sa prepnúť viditeľnosť vrstvy", + "Failed to validate signatures. The file may be corrupted.": "Nepodarilo sa overiť podpisy. Súbor môže byť poškodený.", + "Features enabled by this module:": "Funkcie povolené týmto modulom:", + "Field Name": "Názov poľa", + "Field Name (Group Name)": "Názov poľa (Názov skupiny)", + "Field Name Conflict": "Konflikt názvov polí", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Názov poľa „{{newName}}“ už v tomto objekte ({{value}}) existuje. Skúste použiť jedinečný názov.", + "Field name cannot be empty": "Názov poľa nemôže byť prázdny", + "File": "Súbor", + "File Size": "Veľkosť súboru", + "File exists but could not be read. Check CORS configuration.": "Súbor existuje, ale nedal sa prečítať. Skontrolujte konfiguráciu CORS.", + "File list not found": "Zoznam súborov sa nenašiel", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Veľkosť súboru sa znížila z {{originalSize}} na {{compressedSize}} (ušetrených {{percent}} %).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Súbor {{n}}/{{length}}: strana {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Súbor {{n}}/{{length}}: {{message}}", + "Filename": "Názov súboru", + "Files that failed: {{errorCount}}.": "Neúspešné súbory: {{errorCount}}.", + "Fill (cover full target page)": "Vyplniť (pokryť celú cieľovú stranu)", + "Fill Color": "Farba výplne", + "Finalizing PDF...": "Dokončuje sa PDF...", + "Find & replace": "Nájsť a nahradiť", + "Finds the best quality under this size. 0 means no target.": "Nájde najlepšiu kvalitu pod touto veľkosťou. 0 znamená bez cieľa.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox a Chrome môžu počas výberu zobraziť svoj vlastný formát výberu dátumu. Správny formát sa použije po dokončení zadávania dátumu.", + "First Indent": "Odsadenie prvého riadka", + "Fit (keep full page visible)": "Prispôsobiť (celá strana zostane viditeľná)", + "Fit Page": "Prispôsobiť stranu", + "Fix Page Size": "Opraviť veľkosť strán", + "Flatten": "Sploštiť", + "Flatten Forms": "Sploštiť formuláre", + "Flatten annotations": "Sploštiť poznámky", + "Flatten form fields": "Sploštiť polia formulára", + "Flatten forms and annotations": "Sploštiť formuláre a poznámky", + "Flatten links": "Sploštiť odkazy", + "Flattening PDF...": "Splošťuje sa PDF...", + "Flattening and saving PDF...": "Splošťuje sa a ukladá PDF...", + "Flattening multiple PDFs...": "Splošťuje sa viac súborov PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Splošťuje sa strana {{i}} z {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Splošťuje sa {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Prejde na adresný riadok", + "Font": "Písmo", + "Font Color": "Farba písma", + "Font Family": "Rodina písma", + "Font Size": "Veľkosť písma", + "Font size: {{bSize}} → {{aSize}}": "Veľkosť písma: {{bSize}} → {{aSize}}", + "Font to Outline": "Písmo na krivky", + "Font: {{bFont}} → {{aFont}}": "Písmo: {{bFont}} → {{aFont}}", + "Fonts": "Písma", + "Footer Center": "Päta na stred", + "Footer Left": "Päta vľavo", + "Footer Right": "Päta vpravo", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Pre PDF obsahujúce len obrázky, napríklad skeny. Preskočí sa, ak dokument obsahuje vyberateľný text, pokiaľ nie je zapnuté Prepísať ochranu obsahu.", + "Form fields stop being fillable.": "Polia formulára prestanú byť vyplniteľné.", + "Format": "Formát", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Nájdené prázdne strany: {{length}}. Kliknutím na stranu zrušíte jej výber.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Našli sa existujúce záložky ({{length}}). Nahradiť aktuálne záložky?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Nájdené obrázky: {{length}} v {{length2}} PDF.", + "Front": "Predná strana", + "Full Coverage": "Plné pokrytie", + "Gamma": "Gama", + "Generate table of contents from bookmarks": "Vytvoriť obsah zo záložiek", + "Generating High-Quality PDF...": "Vytvára sa vysokokvalitné PDF...", + "Generating PDF...": "Vytvára sa PDF...", + "Generating ZIP file...": "Vytvára sa súbor ZIP...", + "Generating formatted content...": "Vytvára sa formátovaný obsah...", + "Generating preview...": "Vytvára sa náhľad...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (konverzia PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Konverzia RGB v Ghostscripte zlyhala s kódom ukončenia {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Konverzia v Ghostscripte zlyhala s kódom ukončenia {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript nevytvoril výstupný súbor", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript nie je nakonfigurovaný. Nakonfigurujte ho v rozšírených nastaveniach.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript nie je nakonfigurovaný. Nakonfigurujte ho v nastaveniach WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript nie je nakonfigurovaný. PyMuPDF vyžaduje Ghostscript pre niektoré operácie. Nakonfigurujte oba v rozšírených nastaveniach.", + "Ghostscript threw an exception: {{e}}": "Ghostscript vyvolal výnimku: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Obálka Ghostscriptu nepredstavila očakávané rozhranie. Očakávala sa funkcia loadGS() alebo trieda GhostscriptWASM.", + "Go": "Prejsť", + "Go to page": "Prejsť na stranu", + "Grayscale": "Odtiene sivej", + "Green": "Zelená", + "Greyscale": "Odtiene sivej", + "Grid Mode": "Režim mriežky", + "Group Name (Must be same for group)": "Názov skupiny (musí byť rovnaký pre skupinu)", + "H-Scale %": "Horizontálna mierka v %", + "Hanging Indent": "Predsadenie", + "Hard reloads page": "Znova načíta stránku bez vyrovnávacej pamäte", + "Header & Footer": "Hlavička a päta", + "Header & Footer added successfully!": "Hlavička a päta boli úspešne pridané!", + "Header Center": "Hlavička na stred", + "Header Left": "Hlavička vľavo", + "Header Right": "Hlavička vpravo", + "Height ({{unit}})": "Výška ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Skryť", + "Hide Border": "Skryť orámovanie", + "Hide password": "Skryť heslo", + "Hides window": "Skryje okno", + "High (288 DPI)": "Vysoká (288 DPI)", + "High (Smallest Files)": "Vysoká (najmenšie súbory)", + "Horizontal": "Vodorovne", + "Hue Shift": "Posun odtieňa", + "Image Format": "Formát obrázka", + "Image Input": "Vstup obrázka", + "Image quality": "Kvalita obrázka", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Veľkosť obrázka bola zmenená z {{width}}×{{height}} na {{width2}}×{{height2}}", + "Images": "Obrázky", + "Images above this are resampled down. None leaves resolution alone.": "Obrázky s vyšším rozlíšením sa prevzorkujú nadol. Pri možnosti Žiadne sa rozlíšenie nemení.", + "Imported {{length}} bookmarks!": "Importované záložky: {{length}}!", + "Inches (in)": "Palce (in)", + "Include Attachments": "Zahrnúť prílohy", + "Include Cc Bcc": "Zahrnúť Cc a Bcc", + "Include this file": "Zahrnúť tento súbor", + "Incorrect Page Count": "Nesprávny počet strán", + "Incorrect Password": "Nesprávne heslo", + "Incorrect password": "Nesprávne heslo", + "Incorrect password. Please try again.": "Nesprávne heslo. Skúste to znova.", + "Increase size": "Zväčšiť", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indexuje sa PDF 1, strana {{pageNumber}} z {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indexuje sa PDF 2, strana {{pageNumber}} z {{totalPages}}...", + "Info": "Informácie", + "Info Dictionary": "Informačný slovník", + "Inherit": "Zdediť", + "Initialization Error": "Chyba inicializácie", + "Initializing Ghostscript...": "Inicializuje sa Ghostscript...", + "Initializing PDF engine...": "Inicializuje sa jadro PDF...", + "Initializing PyMuPDF...": "Inicializuje sa PyMuPDF...", + "Initializing decryption...": "Inicializuje sa dešifrovanie...", + "Initializing encryption...": "Inicializuje sa šifrovanie...", + "Initializing repair engine...": "Inicializuje sa nástroj na opravu...", + "Initializing...": "Inicializuje sa...", + "Input Required": "Vyžaduje sa vstup", + "Insecure Digest (MD5 / SHA-1)": "Nezabezpečený hash (MD5 / SHA-1)", + "Insert blank pages": "Vložiť prázdne strany", + "Insert blank pages after this page number": "Vložiť prázdne strany za toto číslo strany", + "Interactive Form Fields": "Interaktívne polia formulára", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Prekladať strany z viacerých PDF (napr. nepárne + obrátené párne z jednostranného skenu)", + "Invalid Certificate": "Neplatný certifikát", + "Invalid File": "Neplatný súbor", + "Invalid Files": "Neplatné súbory", + "Invalid Input": "Neplatný vstup", + "Invalid JSON format": "Neplatný formát JSON", + "Invalid Name": "Neplatný názov", + "Invalid Order": "Neplatné poradie", + "Invalid PDF password.": "Neplatné heslo PDF.", + "Invalid Page Numbers": "Neplatné čísla strán", + "Invalid Page Order": "Neplatné poradie strán", + "Invalid Pages": "Neplatné strany", + "Invalid Range": "Neplatný rozsah", + "Invalid Signature": "Neplatný podpis", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Neplatná adresa URL servera TSA. Autorita časových pečiatok musí byť platná adresa URL http:// alebo https://.", + "Invalid URL": "Neplatná adresa URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Neplatný formát adresy URL. Zadajte platnú adresu URL (napr. https://example.com/wasm/)", + "Invalid XML: no root element": "Neplatný XML: chýba koreňový prvok", + "Invalid data": "Neplatné údaje", + "Invalid hex string in content stream": "Neplatný hexadecimálny reťazec v obsahovom prúde", + "Invalid page range specified.": "Zadaný rozsah strán je neplatný.", + "Invalid shortcut format": "Neplatný formát skratky", + "Invalid: Cryptographic Verification Failed": "Neplatný: kryptografické overenie zlyhalo", + "Invert Colors": "Invertovať farby", + "Invert all colors": "Invertovať všetky farby", + "Inverting PDF colors...": "Invertujú sa farby PDF...", + "Issuer": "Vydavateľ", + "It fits the {{targetBytes}} target.": "Zmestí sa do cieľa {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Stále je nad cieľom {{targetBytes}}, pretože možnosť Zachovať PDF/A obmedzuje mieru kompresie.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Už sa nehlási k zhode s PDF/A. Ak ju chcete zachovať, zapnite Zachovať PDF/A v časti Vlastné nastavenia.", + "Italic": "Kurzíva", + "Item 1": "Položka 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Jeho digitálne podpisy boli odstránené, aby sa dal skomprimovať. V prípade potreby ho podpíšte znova.", + "JPEG (Smaller file size)": "JPEG (menšia veľkosť súboru)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Kvalita JPEG pre znova kódované obrázky, 20 až 100. Nižšia hodnota znamená menšie súbory a viditeľnejšie artefakty.", + "JPG": "JPG", + "JSON Files": "Súbory JSON", + "JSON Loaded": "JSON bol načítaný", + "JSON to PDF": "JSON do PDF", + "Javascript Code": "Kód JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Zachová zhodu súboru PDF/A. Kým je zapnuté, Brotli a rastrovanie sa preskočia.", + "Keeps only the characters the document uses.": "Ponechá iba znaky, ktoré dokument používa.", + "Key (e.g., Department)": "Kľúč (napr. Oddelenie)", + "Keywords": "Kľúčové slová", + "Label": "Popisok", + "Label / Prompt": "Popisok / výzva", + "Landscape": "Na šírku", + "Language": "Jazyk", + "Layer not found": "Vrstva sa nenašla", + "Layer {{number}}": "Vrstva {{number}}", + "Leave blank for all pages": "Nechajte prázdne pre všetky strany", + "Left": "Vľavo", + "Left edge in points (1 inch = 72 pts)": "Ľavý okraj v bodoch (1 palec = 72 bodov)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Úroveň", + "Limit recognized characters (leave empty for all)": "Obmedziť rozpoznávané znaky (nechajte prázdne pre všetky)", + "Line": "Čiara", + "Linearization Failed": "Linearizácia zlyhala", + "Linearize": "Linearizovať", + "Links stop being clickable.": "Odkazy prestanú byť klikateľné.", + "Lists": "Zoznamy", + "Load": "Načítať", + "Load system fonts": "Načítať systémové písma", + "Load system fonts…": "Načítať systémové písma…", + "Loaded": "Načítané", + "Loaded bookmarks from JSON. Now upload your PDF.": "Záložky boli načítané z JSON. Teraz nahrajte svoje PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Záložky načítané z CSV: {{length}}. Teraz nahrajte svoje PDF.", + "Loading Engine...": "Načítava sa jadro...", + "Loading Ghostscript...": "Načítava sa Ghostscript...", + "Loading PDF Editor...": "Načítava sa Editor PDF...", + "Loading PDF Text Editor...": "Načítava sa textový editor PDF...", + "Loading PDF converter...": "Načítava sa konvertor PDF...", + "Loading PDF documents...": "Načítavajú sa dokumenty PDF...", + "Loading PDF engine...": "Načítava sa jadro PDF...", + "Loading PDF files...": "Načítavajú sa súbory PDF...", + "Loading PDF form...": "Načítava sa formulár PDF...", + "Loading PDF processor...": "Načítava sa spracovanie PDF...", + "Loading PDF viewer...": "Načítava sa prehliadač PDF...", + "Loading PDF...": "Načítava sa PDF...", + "Loading PDFs...": "Načítavajú sa PDF...", + "Loading attachments...": "Načítavajú sa prílohy...", + "Loading comparison {{currentPage}} of {{length}}...": "Načítava sa porovnanie {{currentPage}} z {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Načítava sa konverzný nástroj ({{percent}} %)...", + "Loading conversion engine...": "Načítava sa konverzný nástroj...", + "Loading engine...": "Načítava sa jadro...", + "Loading fonts...": "Načítavajú sa písma...", + "Loading layers from {{name}}...": "Načítavajú sa vrstvy zo súboru {{name}}...", + "Loading page {{num}}...": "Načítava sa strana {{num}}...", + "Loading preview...": "Načítava sa náhľad...", + "Loading {{name}}...": "Načítava sa {{name}}...", + "Loading...": "Načítava sa...", + "Location": "Umiestnenie", + "Lossless (No Quality Loss)": "Bezstratová (bez straty kvality)", + "Lossless (no image re-encoding)": "Bezstratová (bez opätovného kódovania obrázkov)", + "Low (Best Quality)": "Nízka (najlepšia kvalita)", + "MOBI Files": "Súbory MOBI", + "MOBI to PDF": "MOBI do PDF", + "Malformed ByteRange": "Nesprávne formátovaný ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Nesprávne formátovaný podpis ECDSA (nepodarilo sa spracovať r, s)", + "Malformed inline image in content stream": "Nesprávne formátovaný vložený obrázok v obsahovom prúde", + "Malformed signatureAlgorithm": "Nesprávne formátovaný signatureAlgorithm", + "Margins": "Okraje", + "Markdown Files": "Súbory Markdown", + "Markdown to PDF": "Markdown do PDF", + "Max Length (0 for unlimited)": "Maximálna dĺžka (0 = bez obmedzenia)", + "Maximum resolution": "Maximálne rozlíšenie", + "Medium (Recommended)": "Stredná (odporúčané)", + "Merge PDF": "Spojiť PDF", + "Merge PDFs": "Spojiť PDF", + "Merge duplicate fonts": "Zlúčiť duplicitné písma", + "Mermaid Error: {{error}}": "Chyba Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadáta boli skopírované do schránky ako JSON.", + "Metadata removed successfully!": "Metadáta boli úspešne odstránené!", + "Metadata updated successfully!": "Metadáta boli úspešne aktualizované!", + "Millimeters (mm)": "Milimetre (mm)", + "Minimizes window": "Minimalizuje okno", + "Missing Files": "Chýbajúce súbory", + "Missing signatureAlgorithm": "Chýba signatureAlgorithm", + "Mixed Page Sizes Detected": "Zistené rôzne veľkosti strán", + "Mixed Sizes": "Rôzne veľkosti", + "Mode": "Režim", + "Modified": "Zmenené", + "Modified After Signing (signed part intact)": "Zmenené po podpísaní (podpísaná časť je neporušená)", + "More": "Viac", + "Moved": "Presunuté", + "Moved \"{{value}}\"": "Presunuté: „{{value}}“", + "Multi-line": "Viacriadkové", + "Must be a positive integer": "Musí byť kladné celé číslo", + "Must be a positive number": "Musí byť kladné číslo", + "N must be at least 1.": "N musí byť aspoň 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF bolo úspešne vytvorené!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Chyba siete: Nepodarilo sa pripojiť k adrese URL. Skontrolujte, či je adresa správna a server povoľuje požiadavky CORS.", + "Network error: {{error}}": "Chyba siete: {{error}}", + "Next page": "Nasledujúca strana", + "No Area Selected": "Nie je vybraná žiadna oblasť", + "No Attachments": "Žiadne prílohy", + "No Changes": "Žiadne zmeny", + "No Crop Area": "Žiadna oblasť orezania", + "No File": "Žiadny súbor", + "No Files": "Žiadne súbory", + "No Images Found": "Nenašli sa žiadne obrázky", + "No PDF Files": "Žiadne súbory PDF", + "No PDF document loaded": "Nie je načítaný žiadny dokument PDF", + "No PDF document loaded.": "Nie je načítaný žiadny dokument PDF.", + "No PDF file loaded.": "Nie je načítaný žiadny súbor PDF.", + "No PDF files could be decrypted. The password may be incorrect.": "Nepodarilo sa dešifrovať žiadny súbor PDF. Heslo môže byť nesprávne.", + "No PDF files could be linearized.": "Nepodarilo sa linearizovať žiadny súbor PDF.", + "No PDFs could be processed.": "Nepodarilo sa spracovať žiadne PDF.", + "No Pages": "Žiadne strany", + "No Selection": "Nič nie je vybrané", + "No Signatures Found": "Nenašli sa žiadne podpisy", + "No Tables Found": "Nenašli sa žiadne tabuľky", + "No Text": "Žiadny text", + "No URL configured": "Nie je nastavená žiadna adresa URL", + "No attachments found in this PDF.": "V tomto PDF sa nenašli žiadne prílohy.", + "No attachments selected for removal.": "Na odstránenie nie sú vybrané žiadne prílohy.", + "No blank pages detected in this PDF.": "V tomto PDF sa nezistili žiadne prázdne strany.", + "No bookmarks found at the selected level.": "Na vybranej úrovni sa nenašli žiadne záložky.", + "No bookmarks to delete.": "Nie sú žiadne záložky na odstránenie.", + "No bookmarks to export!": "Nie sú žiadne záložky na export!", + "No certificate found in PEM file": "V súbore PEM sa nenašiel žiadny certifikát", + "No certificate found in PFX file": "V súbore PFX sa nenašiel žiadny certifikát", + "No certificates found in signature": "V podpise sa nenašli žiadne certifikáty", + "No changes match the current filter.": "Aktuálnemu filtru nezodpovedajú žiadne zmeny.", + "No configurable settings for this node.": "Tento uzol nemá žiadne nastaviteľné možnosti.", + "No differences detected on this page.": "Na tejto strane sa nezistili žiadne rozdiely.", + "No embedded images were found in the selected PDF(s).": "Vo vybraných PDF sa nenašli žiadne vložené obrázky.", + "No existing bookmarks found in this PDF.": "V tomto PDF sa nenašli žiadne existujúce záložky.", + "No items were selected for removal or none were found in the PDF.": "Na odstránenie neboli vybrané žiadne položky alebo sa v PDF nenašli.", + "No page pairs to export.": "Nie sú žiadne páry strán na export.", + "No pages found. Please create a blank PDF or upload one.": "Nenašli sa žiadne strany. Vytvorte prázdne PDF alebo nahrajte nejaké.", + "No pages selected for removal.": "Na odstránenie nie sú vybrané žiadne strany.", + "No pages were selected for splitting.": "Na rozdelenie neboli vybrané žiadne strany.", + "No paired page for this side.": "Pre túto stranu nie je párová strana.", + "No private key found in PEM file": "V súbore PEM sa nenašiel žiadny súkromný kľúč", + "No private key found in PFX file": "V súbore PFX sa nenašiel žiadny súkromný kľúč", + "No tables were detected in this PDF.": "V tomto PDF sa nezistili žiadne tabuľky.", + "No valid page numbers found.": "Nenašli sa žiadne platné čísla strán.", + "No valid pages to save.": "Nie sú žiadne platné strany na uloženie.", + "No worker": "Žiadny worker", + "Noise": "Šum", + "None": "Žiadne", + "None of the files could be compressed: {{join}}.": "Nepodarilo sa skomprimovať žiadny zo súborov: {{join}}.", + "Normal": "Normálne", + "Not Enough Files": "Nedostatok súborov", + "Not a PDF": "Nie je PDF", + "Not connected": "Nepripojené", + "Not in trust chain": "Nie je v reťazci dôvery", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Poznámka: Bez samostatného hesla vlastníka nemá PDF žiadne obmedzenia používania.", + "Number Format": "Formát čísel", + "Number of Pages": "Počet strán", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR bolo prerušené skôr, než sa spracovala nejaká strana", + "OCR recognize timed out after {{timeoutMs}}ms": "Rozpoznávanie OCR vypršalo po {{timeoutMs}} ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Súbory ODG", + "ODG to PDF": "ODG do PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Vypnuté (predvolené): prirodzené číslovanie 1–N. Zapnuté: zachovajú sa pôvodné popisky strán každého súboru (môžu vzniknúť duplicitné popisky).", + "One PDF per page": "Jedno PDF na stranu", + "One PDF per range": "Jedno PDF na rozsah", + "Only a substitute font was available": "K dispozícii bolo iba náhradné písmo", + "Only where it does not change how the image looks.": "Iba tam, kde sa nezmení vzhľad obrázka.", + "Opacity": "Priehľadnosť", + "Open URL": "Otvoriť adresu URL", + "Opens incognito window": "Otvorí okno inkognito", + "Opens new tab": "Otvorí novú kartu", + "Opens new window": "Otvorí nové okno", + "Operation Failed": "Operácia zlyhala", + "Operation resulted in an empty file.": "Operáciou vznikol prázdny súbor.", + "Optimize PDF for fast web viewing": "Optimalizovať PDF na rýchle zobrazenie na webe", + "Optimizing PDFs for web view (linearizing)...": "Optimalizujú sa PDF na zobrazenie na webe (linearizácia)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optimalizuje sa {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Možnosti (jedna na riadok alebo oddelené čiarkou)", + "Orientation": "Orientácia", + "Outline": "Osnova", + "Output": "Výstup", + "Overlay": "Prekrytie", + "Overlay or underlay pages from one PDF onto another": "Prekryť strany z jedného PDF na iné alebo ich podložiť", + "Owner Password": "Heslo vlastníka", + "Owner Password Required": "Vyžaduje sa heslo vlastníka", + "PDF": "PDF", + "PDF Files": "Súbory PDF", + "PDF Input": "Vstup PDF", + "PDF Layers": "Vrstvy PDF", + "PDF Metadata": "Metadáta PDF", + "PDF Producer": "Producent PDF", + "PDF converted to CSV successfully!": "PDF bolo úspešne konvertované do CSV!", + "PDF converted to SVG successfully!": "PDF bolo úspešne konvertované do SVG!", + "PDF converted to greyscale successfully!": "PDF bolo úspešne konvertované na odtiene sivej!", + "PDF created successfully!": "PDF bolo úspešne vytvorené!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF bolo úspešne dešifrované! Všetko šifrovanie a obmedzenia boli odstránené.", + "PDF decrypted successfully! Your download has started.": "PDF bolo úspešne dešifrované! Sťahovanie sa začalo.", + "PDF downloaded successfully.": "PDF bolo úspešne stiahnuté.", + "PDF encrypted successfully with 256-bit AES!": "PDF bolo úspešne zašifrované 256-bitovým AES!", + "PDF has been sanitized and downloaded.": "PDF bolo vyčistené a stiahnuté.", + "PDF has no pages": "PDF nemá žiadne strany", + "PDF organized successfully!": "PDF bolo úspešne usporiadané!", + "PDF permissions changed successfully!": "Oprávnenia PDF boli úspešne zmenené!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Čítačky PDF si 14 štandardných písiem PDF zabezpečujú samy.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Obmedzenia PDF boli úspešne odstránené! Súbor je teraz plne upraviteľný a tlačiteľný.", + "PDF saved successfully!": "PDF bolo úspešne uložené!", + "PDF split successfully!": "PDF bolo úspešne rozdelené!", + "PDF to CSV": "PDF do CSV", + "PDF to DOCX": "PDF do DOCX", + "PDF to Excel/CSV": "PDF do Excelu/CSV", + "PDF to Images": "PDF do obrázkov", + "PDF to Images (High Quality)": "PDF do obrázkov (vysoká kvalita)", + "PDF to JSON": "PDF do JSON", + "PDF to Markdown": "PDF do Markdownu", + "PDF to PDF/A": "PDF do PDF/A", + "PDF to SVG": "PDF do SVG", + "PDF to Text": "PDF do Textu", + "PDF to XLSX": "PDF do XLSX", + "PDF with layer changes saved!": "PDF so zmenami vrstiev bolo uložené!", + "PDF {{modeLabel}} applied successfully.": "PDF: {{modeLabel}} bolo úspešne použité.", + "PDF/A Conversion": "Konverzia PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (prísne, bez priehľadnosti)", + "PDF/A-2b (Recommended)": "PDF/A-2b (odporúčané)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (moderné, umožňuje prílohy)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF boli úspešne zmiešané!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (bezstratový)", + "PUB to PDF": "PUB do PDF", + "Page": "Strana", + "Page #": "Strana č.", + "Page Added": "Strana pridaná", + "Page Numbers": "Čísla strán", + "Page Removed": "Strana odstránená", + "Page Size": "Veľkosť strany", + "Page X of Y": "Strana X z Y", + "Page background or layout changed": "Zmenilo sa pozadie alebo rozloženie strany", + "Page container not found": "Kontajner strany sa nenašiel", + "Page extraction produced an empty PDF.": "Extrakciou strán vzniklo prázdne PDF.", + "Page number": "Číslo strany", + "Page numbers added successfully!": "Čísla strán boli úspešne pridané!", + "Page sizes standardized successfully!": "Veľkosti strán boli úspešne zjednotené!", + "Page {{currentPageNum}} of {{numPages}}": "Strana {{currentPageNum}} z {{numPages}}", + "Page {{num}} / {{numPages}}": "Strana {{num}} / {{numPages}}", + "Page {{n}} ": "Strana {{n}} ", + "Page {{n}} of {{length}}": "Strana {{n}} z {{length}}", + "Page {{n}}:": "Strana {{n}}:", + "Page {{pageNumber}}": "Strana {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Strana {{pageNumber}} existuje iba v prvom PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Strana {{pageNumber}} existuje iba v druhom PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Strana {{pageNumber}} z {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Strana {{pageNum}} v tomto PDF neexistuje.", + "Page {{page}}": "Strana {{page}}", + "Page {{page}} attachment": "Príloha strany {{page}}", + "Pages": "Strany", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Strany (napr. 1-3, 5), spolu: {{pageCount}}", + "Pages Files": "Súbory Pages", + "Pages Per Sheet": "Strán na list", + "Pages combined successfully!": "Strany boli úspešne spojené!", + "Pages have been divided successfully!": "Strany boli úspešne rozdelené!", + "Pages have been reordered.": "Poradie strán bolo zmenené.", + "Pages have been reversed successfully!": "Poradie strán bolo úspešne obrátené!", + "Pages to PDF": "Pages do PDF", + "Paper Size": "Veľkosť papiera", + "Paragraph": "Odsek", + "Parsing XML structure...": "Spracúva sa štruktúra XML...", + "Parsing {{name}}...": "Spracúva sa {{name}}...", + "Partial Coverage": "Čiastočné pokrytie", + "Partial Success": "Čiastočný úspech", + "Password": "Heslo", + "Password Error": "Chyba hesla", + "Password Needed": "Je potrebné heslo", + "Password Required": "Vyžaduje sa heslo", + "Password for all files": "Heslo pre všetky súbory", + "Password for all locked files": "Heslo pre všetky uzamknuté súbory", + "Password for {{name}}": "Heslo pre {{name}}", + "Password protected": "Chránené heslom", + "Password required for encrypted private key": "Pre zašifrovaný súkromný kľúč sa vyžaduje heslo", + "Path Stroke": "Obrys cesty", + "Please add at least one field before downloading.": "Pred stiahnutím pridajte aspoň jedno pole.", + "Please draw a rectangle on at least one page to select the crop area.": "Nakreslite obdĺžnik aspoň na jednej strane a vyberte tak oblasť orezania.", + "Please ensure all page numbers in the order are unique.": "Uistite sa, že všetky čísla strán v poradí sú jedinečné.", + "Please enter a layer name": "Zadajte názov vrstvy", + "Please enter a name.": "Zadajte názov.", + "Please enter a number between 0 and {{totalPages}}.": "Zadajte číslo od 0 do {{totalPages}}.", + "Please enter a page order.": "Zadajte poradie strán.", + "Please enter a password": "Zadajte heslo", + "Please enter a password for {{i}} or skip it": "Zadajte heslo pre {{i}} alebo ho preskočte", + "Please enter a title.": "Zadajte názov.", + "Please enter a user password.": "Zadajte heslo používateľa.", + "Please enter a valid number of pages (1 or more).": "Zadajte platný počet strán (1 alebo viac).", + "Please enter a valid page number between 1 and {{total}}": "Zadajte platné číslo strany od 1 do {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Zadajte platný rozsah strán (napr. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Zadajte čísla strán na extrakciu.", + "Please enter positive numbers.": "Zadajte kladné čísla.", + "Please enter some text to convert.": "Zadajte text na konverziu.", + "Please enter text for the watermark.": "Zadajte text vodoznaku.", + "Please enter the PDF password.": "Zadajte heslo k PDF.", + "Please load a PDF first.": "Najprv načítajte PDF.", + "Please select PDF files to create a ZIP archive.": "Vyberte súbory PDF, z ktorých sa vytvorí archív ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Vyberte súbor certifikátu .pem, .crt, .cer alebo .der.", + "Please select a PDF file.": "Vyberte súbor PDF.", + "Please select a valid PDF file.": "Vyberte platný súbor PDF.", + "Please select an area on at least one page to crop.": "Vyberte oblasť na orezanie aspoň na jednej strane.", + "Please select an area to crop first.": "Najprv vyberte oblasť na orezanie.", + "Please select an area to crop.": "Vyberte oblasť na orezanie.", + "Please select an image file for the watermark.": "Vyberte obrázok pre vodoznak.", + "Please select at least one BMP file.": "Vyberte aspoň jeden súbor BMP.", + "Please select at least one CSV file.": "Vyberte aspoň jeden súbor CSV.", + "Please select at least one Excel file.": "Vyberte aspoň jeden súbor Excel.", + "Please select at least one HEIC file.": "Vyberte aspoň jeden súbor HEIC.", + "Please select at least one JPG file.": "Vyberte aspoň jeden súbor JPG.", + "Please select at least one JPG or JPEG2000 image.": "Vyberte aspoň jeden obrázok JPG alebo JPEG2000.", + "Please select at least one ODT file.": "Vyberte aspoň jeden súbor ODT.", + "Please select at least one PDF file.": "Vyberte aspoň jeden súbor PDF.", + "Please select at least one PowerPoint file.": "Vyberte aspoň jeden súbor PowerPoint.", + "Please select at least one RTF file.": "Vyberte aspoň jeden súbor RTF.", + "Please select at least one SVG file.": "Vyberte aspoň jeden súbor SVG.", + "Please select at least one TIFF file.": "Vyberte aspoň jeden súbor TIFF.", + "Please select at least one Word document.": "Vyberte aspoň jeden dokument Word.", + "Please select at least one file to attach.": "Vyberte aspoň jeden súbor na pripojenie.", + "Please select at least one image file.": "Vyberte aspoň jeden obrázok.", + "Please select at least one text file.": "Vyberte aspoň jeden textový súbor.", + "Please select at least one {{FILETYPE_NAME}} file.": "Vyberte aspoň jeden súbor {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Vyberte aspoň jeden súbor {{TOOL_NAME}} (.eml alebo .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Vyberte aspoň jeden súbor {{TOOL_NAME}}.", + "Please select even or odd pages.": "Vyberte párne alebo nepárne strany.", + "Please select one or more PDF files.": "Vyberte jeden alebo viac súborov PDF.", + "Please select pages to delete.": "Vyberte strany na odstránenie.", + "Please select pages to duplicate.": "Vyberte strany na duplikovanie.", + "Please select pages to mark for splitting.": "Vyberte strany, pri ktorých sa má rozdeliť.", + "Please select pages to rotate.": "Vyberte strany na otočenie.", + "Please specify a page range for page-level attachments.": "Zadajte rozsah strán pre prílohy na úrovni strán.", + "Please upload PDF files.": "Nahrajte súbory PDF.", + "Please upload PDFs first.": "Najprv nahrajte PDF.", + "Please upload a .docx file first.": "Najprv nahrajte súbor .docx.", + "Please upload a PDF file first.": "Najprv nahrajte súbor PDF.", + "Please upload a PDF file.": "Nahrajte súbor PDF.", + "Please upload a PDF first.": "Najprv nahrajte PDF.", + "Please upload a valid PDF file.": "Nahrajte platný súbor PDF.", + "Please upload at least one PDF file.": "Nahrajte aspoň jeden súbor PDF.", + "Please upload at least two PDF files to alternate and mix.": "Na striedanie a miešanie nahrajte aspoň dva súbory PDF.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Nahrajte základné PDF aj PDF na prekrytie/podloženie.", + "Please upload valid PDF files.": "Nahrajte platné súbory PDF.", + "Please use the Download button in the PDF viewer toolbar above.": "Použite tlačidlo Stiahnuť na paneli nástrojov prehliadača PDF vyššie.", + "Please wait for the PDF viewer to load.": "Počkajte, kým sa načíta prehliadač PDF.", + "Please wait for the form to finish loading.": "Počkajte, kým sa formulár dokončí načítavať.", + "Portrait": "Na výšku", + "Position": "Poloha", + "Post-processing for transparency compliance...": "Dodatočné spracovanie pre zhodu s transparentnosťou...", + "Posterize": "Posterizovať", + "Posterizing PDF...": "Posterizuje sa PDF...", + "PowerPoint to PDF": "PowerPoint do PDF", + "Pre Flatten": "Predbežné sploštenie", + "Pre-flattening PDF...": "Predbežne sa splošťuje PDF...", + "Prefer JPEG 2000 for photos": "Uprednostniť JPEG 2000 pre fotografie", + "Preparing PDF export...": "Pripravuje sa export PDF...", + "Preparing conversion...": "Pripravuje sa konverzia...", + "Preparing download...": "Pripravuje sa sťahovanie...", + "Preparing preview...": "Pripravuje sa náhľad...", + "Presentations": "Prezentácie", + "Preserve PDF/A": "Zachovať PDF/A", + "Preview": "Náhľad", + "Preview Error": "Chyba náhľadu", + "Preview Text": "Náhľad textu", + "Previous page": "Predchádzajúca strana", + "Print Form": "Vytlačiť formulár", + "Private data that editing apps store inside the PDF.": "Súkromné údaje, ktoré aplikácie na úpravy ukladajú do PDF.", + "Processed {{processedCount}} PDFs.": "Spracované PDF: {{processedCount}}.", + "Processing Complete": "Spracovanie dokončené", + "Processing Dpi": "DPI spracovania", + "Processing Failed": "Spracovanie zlyhalo", + "Processing PDF permissions...": "Spracúvajú sa oprávnenia PDF...", + "Processing attachments...": "Spracúvajú sa prílohy...", + "Processing failed for {{name}}.": "Spracovanie súboru {{name}} zlyhalo.", + "Processing file {{n}} of {{length}}...": "Spracúva sa súbor {{n}} z {{length}}...", + "Processing images...": "Spracúvajú sa obrázky...", + "Processing multiple PDFs...": "Spracúva sa viac súborov PDF...", + "Processing page {{i}} of {{numPages}}": "Spracúva sa strana {{i}} z {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Spracúva sa strana {{i}} z {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Spracúva sa strana {{n}} z {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Spracúva sa strana {{pageNum}} z {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Spracúva sa strana {{pageNum}} z {{totalPages}}...", + "Processing produced an empty file.": "Spracovaním vznikol prázdny súbor.", + "Processing resulted in an empty file.": "Spracovaním vznikol prázdny súbor.", + "Processing sheet {{n}}...": "Spracúva sa list {{n}}...", + "Processing {{name}}...": "Spracúva sa {{name}}...", + "Processing {{nodeName}}...": "Spracúva sa {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Spracúva sa {{n}}/{{length}}: {{name}}...", + "Processing...": "Spracúva sa...", + "Producer": "Producent", + "Publisher Files": "Súbory Publisher", + "Purple": "Fialová", + "PyMuPDF (Document Processing)": "PyMuPDF (spracovanie dokumentov)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF nie je nakonfigurovaný. Nakonfigurujte ho v rozšírených nastaveniach.", + "PyMuPDF module did not export expected PyMuPDF class.": "Modul PyMuPDF neexportoval očakávanú triedu PyMuPDF.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF vytvoril prázdny dešifrovaný súbor.", + "PyMuPDF: not configured.": "PyMuPDF: nie je nakonfigurovaný.", + "QR Code": "QR kód", + "Quality": "Kvalita", + "Quits application (cannot be overridden)": "Ukončí aplikáciu (nedá sa prepísať)", + "RSA-PKCS1 signature does not verify against signer public key": "Podpis RSA-PKCS1 sa nedá overiť pomocou verejného kľúča podpisovateľa", + "RSA-PSS signature does not verify against signer public key": "Podpis RSA-PSS sa nedá overiť pomocou verejného kľúča podpisovateľa", + "Rasterization Complete": "Rastrovanie dokončené", + "Rasterization Partial": "Čiastočné rastrovanie", + "Rasterize": "Rastrovať", + "Rasterize Dpi": "DPI rastrovania", + "Rasterize pages to images": "Rastrovať strany na obrázky", + "Rasterize quality": "Kvalita rastrovania", + "Rasterize resolution (DPI)": "Rozlíšenie rastrovania (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Rastrované PDF: {{completed}}, zlyhalo: {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rastruje sa {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rastruje sa {{name}}...", + "Rasterizing...": "Rastruje sa...", + "Rating must be between 0 and 5": "Hodnotenie musí byť od 0 do 5", + "Read Only": "Len na čítanie", + "Reading CSV file...": "Číta sa súbor CSV...", + "Reading PDF...": "Číta sa PDF...", + "Reading XML file...": "Číta sa súbor XML...", + "Reading encrypted PDF...": "Číta sa zašifrované PDF...", + "Reading files...": "Čítajú sa súbory...", + "Reading layer configuration...": "Číta sa konfigurácia vrstiev...", + "Reading {{name}} ({{n}}/{{length}})...": "Číta sa {{name}} ({{n}}/{{length}})...", + "Ready": "Pripravené", + "Reason": "Dôvod", + "Red": "Červená", + "Redact": "Začierniť", + "Redact Mode": "Režim začiernenia", + "Redact text from PDF": "Začierniť text v PDF", + "Redaction Failed": "Začiernenie zlyhalo", + "Reduce PDF file size": "Zmenšiť veľkosť súboru PDF", + "Reduce color complexity": "Znížiť zložitosť farieb", + "Reduces file size by removing color information.": "Zmenší veľkosť súboru odstránením farebných informácií.", + "Reloads page": "Znova načíta stránku", + "Remove": "Odstrániť", + "Remove All Attachments": "Odstrániť všetky prílohy", + "Remove Annotations": "Odstrániť poznámky", + "Remove Blank Pages": "Odstrániť prázdne strany", + "Remove Embedded Files": "Odstrániť vložené súbory", + "Remove Fonts": "Odstrániť písma", + "Remove Javascript": "Odstrániť JavaScript", + "Remove Layers": "Odstrániť vrstvy", + "Remove Links": "Odstrániť odkazy", + "Remove Mark Info": "Odstrániť informácie o značkovaní", + "Remove Metadata": "Odstrániť metadáta", + "Remove PDF password protection": "Odstrániť ochranu PDF heslom", + "Remove Structure Tree": "Odstrániť štruktúrny strom", + "Remove alternate images": "Odstrániť alternatívne obrázky", + "Remove application data": "Odstrániť údaje aplikácií", + "Remove article threads": "Odstrániť články (article threads)", + "Remove attachment": "Odstrániť prílohu", + "Remove blank pages automatically": "Automaticky odstrániť prázdne strany", + "Remove document structure tree": "Odstrániť štruktúrny strom dokumentu", + "Remove file": "Odstrániť súbor", + "Remove metadata, scripts, and hidden data": "Odstrániť metadáta, skripty a skryté údaje", + "Remove output intents": "Odstrániť výstupné zámery", + "Remove page thumbnails": "Odstrániť miniatúry strán", + "Remove specific pages": "Odstrániť vybrané strany", + "Remove web capture information": "Odstrániť informácie o webovom zachytení", + "Remove {{name}}": "Odstrániť {{name}}", + "Removed \"{{beforeText}}\"": "Odstránené „{{beforeText}}“", + "Removed image ({{width}}×{{height}})": "Odstránený obrázok ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Odstránené prázdne strany: {{length}}. Hotovo!", + "Removing all metadata...": "Odstraňujú sa všetky metadáta...", + "Removing annotations...": "Odstraňujú sa poznámky...", + "Removing redacted text from document data...": "Odstraňuje sa začiernený text z údajov dokumentu...", + "Removing restrictions...": "Odstraňujú sa obmedzenia...", + "Removing {{length}} blank page(s)...": "Odstraňujú sa prázdne strany ({{length}})...", + "Render Error": "Chyba vykresľovania", + "Rendering Page {{num}}...": "Vykresľuje sa strana {{num}}...", + "Rendering page previews...": "Vykresľujú sa náhľady strán...", + "Rendering page previews: {{current}}/{{total}}": "Vykresľujú sa náhľady strán: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Vykresľuje sa strana {{n}} z {{length}}...", + "Rendering preview for page {{pageNum}}...": "Vykresľuje sa náhľad strany {{pageNum}}...", + "Reopens closed tab": "Znova otvorí zatvorenú kartu", + "Repair": "Opraviť", + "Repair Failed": "Oprava zlyhala", + "Repair corrupted PDF": "Opraviť poškodené PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Opravené súbory: {{length}}. Nepodarilo sa opraviť: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Opravuje sa {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Opravuje sa {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "„{{beforeText}}“ nahradené textom „{{afterText}}“", + "Required": "Povinné", + "Resamples even when an image is only slightly above the limit.": "Prevzorkuje aj vtedy, keď je obrázok len mierne nad limitom.", + "Reset Form": "Obnoviť formulár", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Obnoviť pôvodný stav a vrátiť sa k nahrávaniu súborov? Všetky neuložené zmeny sa stratia.", + "Resolution": "Rozlíšenie", + "Retain Page Labels": "Zachovať popisky strán", + "Retry Failed": "Zopakovať neúspešné", + "Reverse Pages": "Obrátiť poradie strán", + "Reverse page order": "Obrátiť poradie strán", + "Reversing page order...": "Obracia sa poradie strán...", + "Reversing {{name}} ({{n}}/{{length}})...": "Obracia sa poradie strán v súbore {{name}} ({{n}}/{{length}})...", + "Right": "Vpravo", + "Right edge in points": "Pravý okraj v bodoch", + "Rotate": "Otočiť", + "Rotate +90°": "Otočiť o +90°", + "Rotate all pages": "Otočiť všetky strany", + "Rotation": "Otočenie", + "Rotation Variance": "Variancia otočenia", + "Rotations applied successfully!": "Otočenia boli úspešne použité!", + "Rows": "Riadky", + "Run Javascript": "Spustiť JavaScript", + "Running OCR on page {{pageNum}}...": "Spúšťa sa OCR na strane {{pageNum}}...", + "Running...": "Spúšťa sa...", + "SVG": "SVG", + "SVG Files": "Súbory SVG", + "SVG to PDF": "SVG do PDF", + "Sanitize": "Vyčistiť", + "Sanitized With Warnings": "Vyčistené s upozorneniami", + "Sanitizing PDF...": "Čistí sa PDF...", + "Saturation": "Sýtosť", + "Saved": "Uložené", + "Saving PDF with layer changes...": "Ukladá sa PDF so zmenami vrstiev...", + "Scaling Mode": "Režim škálovania", + "Scanner Effect": "Efekt skenera", + "Scanner effect applied successfully!": "Efekt skenera bol úspešne použitý!", + "Scanning page {{n}} of {{pageCount}}...": "Skenuje sa strana {{n}} z {{pageCount}}...", + "Search Text": "Hľadať text", + "Search languages...": "Hľadať jazyky...", + "Select Font": "Vybrať písmo", + "Select a field to edit properties": "Vyberte pole, ktorého vlastnosti chcete upraviť", + "Select a field...": "Vyberte pole...", + "Select to add this button to an existing group": "Vyberte, ak chcete toto tlačidlo pridať do existujúcej skupiny", + "Selected Option": "Vybraná možnosť", + "Self-Signed: Signer Identity Not Verified": "Samopodpísané: identita podpisovateľa nebola overená", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Vlastné OCR zdroje sú nakonfigurované len čiastočne. Nastavte {{missing}} spolu s ostatnými adresami URL zdrojov Tesseract.", + "Separator": "Oddeľovač", + "Separator Color": "Farba oddeľovača", + "Separator Thickness": "Hrúbka oddeľovača", + "Sepia": "Sépia", + "Serial Number:": "Sériové číslo:", + "Set custom destination": "Nastaviť vlastný cieľ", + "Shapes": "Tvary", + "Sheet {{n}} {{sideLabel}}": "List {{n}} {{sideLabel}}", + "Show": "Zobraziť", + "Show password": "Zobraziť heslo", + "Show/Hide Field": "Zobraziť/skryť pole", + "Sign Here": "Podpísať tu", + "Signature /Contents is not a single DER object followed by zero padding": "Podpis /Contents nie je jeden objekt DER nasledovaný nulovým doplnením", + "Signature Algorithm:": "Algoritmus podpisu:", + "Signature Intact: Signer Identity Not Verified": "Podpis je neporušený: identita podpisovateľa nebola overená", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Polia podpisu sú polia podpisu AcroForm a zobrazia sa len v pokročilom prehliadači PDF.", + "Signature has a missing or malformed /ByteRange": "Podpis má chýbajúci alebo nesprávne formátovaný /ByteRange", + "Signature scheme {{kind}} not implemented": "Schéma podpisu {{kind}} nie je implementovaná", + "Signature {{n}}": "Podpis {{n}}", + "Signatures": "Podpisy", + "Signed By": "Podpísal", + "Signed On": "Podpísané dňa", + "Signed PDF Not Changed": "Podpísané PDF nebolo zmenené", + "Signed PDF downloaded successfully!": "Podpísané PDF bolo úspešne stiahnuté!", + "Signed PDF saved successfully!": "Podpísané PDF bolo úspešne uložené!", + "Simple (1, 2, 3)": "Jednoduché (1, 2, 3)", + "Simplify large color profiles": "Zjednodušiť veľké farebné profily", + "Skew Threshold": "Prah naklonenia", + "Skip": "Preskočiť", + "Skip All": "Preskočiť všetko", + "Skip Remaining": "Preskočiť zvyšok", + "Skip this file": "Preskočiť tento súbor", + "Skipped: {{join}}.": "Preskočené: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Menšie súbory, ale otvoriť ich môžu len čítačky s podporou Brotli, napríklad Firefox, MuPDF 1.26+ a Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Niektoré súbory boli preskočené, pretože nie sú podporované obrázky.", + "Some files were skipped. Only BMP files are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba súbory BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba súbory HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba súbory JPG, JPEG, JP2 a JPX.", + "Some files were skipped. Only PDF files are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba súbory PDF.", + "Some files were skipped. Only PNG images are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba obrázky PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Niektoré súbory boli preskočené. Povolená je iba grafika SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba súbory TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba obrázky WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba podporované formáty obrázkov.", + "Some files were skipped. Only text files are allowed.": "Niektoré súbory boli preskočené. Povolené sú iba textové súbory.", + "Some pages could not be processed. Please try again.": "Niektoré strany sa nepodarilo spracovať. Skúste to znova.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Niektoré značky začiernenia sa nepodarilo použiť, preto sa súbor nestiahol. Použite alebo odstráňte ich v editore a skúste to znova.", + "Spacing": "Rozostupy", + "Split PDF": "Rozdeliť PDF", + "Split by Bookmarks": "Rozdeliť podľa záložiek", + "Split pages into tile grid for poster printing": "Rozdeliť strany na mriežku dielov na tlač plagátu", + "Split pages vertically or horizontally": "Rozdeliť strany zvislo alebo vodorovne", + "Splitting PDF pages...": "Rozdeľujú sa strany PDF...", + "Splitting PDF...": "Rozdeľuje sa PDF...", + "Spreadsheets": "Tabuľky", + "Standard (192 DPI)": "Štandardná (192 DPI)", + "Standard Size": "Štandardná veľkosť", + "Standardize all pages to a target size": "Zjednotiť všetky strany na cieľovú veľkosť", + "Standardizing pages...": "Zjednocujú sa strany...", + "Stitch all pages into one continuous page": "Spojiť všetky strany do jednej súvislej strany", + "Straighten skewed PDF pages": "Vyrovnať naklonené strany PDF", + "Strip all annotations": "Odstrániť všetky poznámky", + "Style": "Štýl", + "Style Changed": "Štýl zmenený", + "Style changed ({{length}} regions)": "Štýl zmenený (oblasti: {{length}})", + "Subject": "Predmet", + "Subset embedded fonts": "Vytvoriť podmnožinu vložených písem", + "Success": "Úspech", + "Success!": "Úspech!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Súbory CSV ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Súbory Excel ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Súbory ODT ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} PDF(s) to DOCX.": "PDF ({{length}}) bolo úspešne konvertovaných do DOCX.", + "Successfully converted {{length}} PDF(s) to Markdown.": "PDF ({{length}}) bolo úspešne konvertovaných do Markdownu.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "PDF ({{length}}) bolo úspešne konvertovaných na {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Súbory PSD ({{length}}) boli úspešne konvertované do jedného PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Súbory PowerPoint ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Súbory RTF ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} Word document(s) to PDF.": "Dokumenty Word ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} files to PDF.": "Súbory ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Súbory {{TOOL_NAME}} ({{length}}) boli úspešne konvertované do PDF.", + "Successfully converted {{name}} to DOCX.": "Súbor {{name}} bol úspešne konvertovaný do DOCX.", + "Successfully converted {{name}} to Markdown.": "Súbor {{name}} bol úspešne konvertovaný do Markdownu.", + "Successfully converted {{name}} to PDF.": "Súbor {{name}} bol úspešne konvertovaný do PDF.", + "Successfully converted {{name}} to {{level}}.": "Súbor {{name}} bol úspešne konvertovaný na {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF bolo úspešne extrahované na použitie s AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "PDF ({{completed}}) bolo úspešne extrahovaných na použitie s AI/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF bolo úspešne rastrované pri {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "PDF ({{completed}}) bolo úspešne rastrovaných pri {{dpi}} DPI.", + "Supported: CBZ, CBR": "Podporované: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Podporované: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Podporované: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Podporované: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Podporované: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Podporované: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Podporované: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Podporované: XPS, OXPS", + "Switches apps": "Prepína aplikácie", + "Switches tabs": "Prepína karty", + "Table of Contents": "Obsah", + "Table {{n}} (Page {{page}})": "Tabuľka {{n}} (strana {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Cieľové pole", + "Target Kilobytes": "Cieľové kilobajty", + "Target Not Reached": "Cieľ nebol dosiahnutý", + "Target Size": "Cieľová veľkosť", + "Technical Details": "Technické podrobnosti", + "Temperature": "Teplota", + "Template \"{{name}}\" loaded.": "Šablóna „{{name}}“ bola načítaná.", + "Template \"{{name}}\" saved.": "Šablóna „{{name}}“ bola uložená.", + "Text": "Text", + "Text Color": "Farba textu", + "Text Files": "Textové súbory", + "Text color changed successfully!": "Farba textu bola úspešne zmenená!", + "Text converted to PDF successfully!": "Text bol úspešne konvertovaný do PDF!", + "Text extracted successfully!": "Text bol úspešne extrahovaný!", + "Text to PDF": "Text do PDF", + "That password did not open any of the remaining files.": "Toto heslo neodomklo žiadny zo zostávajúcich súborov.", + "The PDF file(s) do not contain any attachments to extract.": "Súbory PDF neobsahujú žiadne prílohy na extrakciu.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF má {{totalPages}} strán, čo nie je rovnomerne deliteľné číslom {{nValue}}. Posledné PDF bude obsahovať {{remainder}} strán.", + "The PDF might be corrupted or password protected.": "PDF môže byť poškodené alebo chránené heslom.", + "The PDF might be corrupted or password-protected.": "PDF môže byť poškodené alebo chránené heslom.", + "The PDF might be corrupted.": "PDF môže byť poškodené.", + "The PDF viewer is still initializing.": "Prehliadač PDF sa ešte inicializuje.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF bolo stiahnuté, ale tieto kroky sa nepodarilo dokončiť: {{join}}. Obsah, ktorého sa týkajú, môže byť stále v súbore.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "Adresa URL vrátila neočakávaný typ obsahu: {{contentType}}. Očakával sa súbor JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Bajty vylúčené z /ByteRange nie sú presne podpis zakódovaný v hexadecimálnom tvare", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Bajty vylúčené z /ByteRange nie sú /Contents tohto podpisu", + "The compression engine returned an unreadable result.": "Kompresný nástroj vrátil nečitateľný výsledok.", + "The compression engine stopped unexpectedly.": "Kompresný nástroj sa neočakávane zastavil.", + "The current password you entered is incorrect. Please try again.": "Zadané aktuálne heslo je nesprávne. Skúste to znova.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Nasledujúce názvy polí už v nahratom PDF existujú: {{conflictList}}. Pred stiahnutím tieto polia premenujte.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Nasledujúce názvy polí sú použité viackrát: {{duplicateList}}. Pred stiahnutím tieto polia premenujte, aby mali jedinečné názvy.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Počet zadaných strán ({{length}}) sa nezhoduje s aktuálnym počtom strán v dokumente ({{currentGridCount}}). Zadajte úplné poradie všetkých strán.", + "The password you entered is incorrect. Please try again.": "Zadané heslo je nesprávne. Skúste to znova.", + "The password you entered is wrong or the file is corrupted.": "Zadané heslo je nesprávne alebo je súbor poškodený.", + "The provided file could not be loaded as an image. It may be corrupted.": "Zadaný súbor sa nepodarilo načítať ako obrázok. Môže byť poškodený.", + "The requested OCR language is not available: {{unavailableText}}.": "Požadovaný jazyk OCR nie je dostupný: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Zadané poradie strán je neúplné alebo obsahuje neplatné čísla strán. Uveďte novú pozíciu pre každú pôvodnú stranu.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Tieto súbory nie sú platné PDF, preto neboli pridané: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Tieto súbory sú chránené heslom: {{names}}. Zadajte ich heslá na kartách súborov alebo ich odstráňte a potom znova komprimujte.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Tento build BentoPDF obsahuje údaje OCR iba pre: {{availableText}}.", + "This PDF does not contain any digital signatures.": "Toto PDF neobsahuje žiadne digitálne podpisy.", + "This PDF has no layers (OCG).": "Toto PDF nemá žiadne vrstvy (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Toto PDF je chránené heslom. Ak chcete pokračovať, zadajte aktuálne heslo.", + "This document contains pages with different dimensions:": "Tento dokument obsahuje strany s rôznymi rozmermi:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Tento dokument obsahuje 1 značku začiernenia, ktorá ešte nebola použitá. Kým značka nie je použitá, obsah pod ňou zostáva v súbore. Použiť všetky značky a stiahnuť?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Tento dokument obsahuje nepoužité značky začiernenia (počet: {{count}}). Kým značka nie je použitá, obsah pod ňou zostáva v súbore. Použiť všetky značky a stiahnuť?", + "This feature requires {{name}} to be configured.": "Táto funkcia vyžaduje nakonfigurovanie {{name}}.", + "This file is not a valid PDF.": "Tento súbor nie je platné PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Tento modul je licencovaný pod AGPL-3.0. Jeho nakonfigurovaním súhlasíte s podmienkami licencie.", + "This tool has been disabled": "Tento nástroj bol vypnutý", + "This tool is not available in your deployment. Contact your administrator for more information.": "Tento nástroj nie je vo vašom nasadení dostupný. Ďalšie informácie vám poskytne váš správca.", + "Threshold": "Prah", + "Tile": "Dlaždica", + "Tile Gap X": "Medzera dlaždíc X", + "Tile Gap Y": "Medzera dlaždíc Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Časová pečiatka", + "Timestamp Failed": "Pridanie časovej pečiatky zlyhalo", + "Tint": "Odtieň", + "Title": "Názov", + "To actually fill or change the options, use our PDF Form Filler tool.": "Ak chcete možnosti skutočne vyplniť alebo zmeniť, použite náš nástroj Vypĺňanie PDF formulárov.", + "Toggle": "Prepnúť", + "Toggle style": "Prepnúť štýl", + "Toggle sync scroll": "Prepnúť synchronizované posúvanie", + "Tool Unavailable": "Nástroj nie je dostupný", + "Tooltip / Help Text": "Popis / text pomocníka", + "Top": "Hore", + "Top Center": "Hore na stred", + "Top Left": "Hore vľavo", + "Top Right": "Hore vpravo", + "Top edge in points": "Horný okraj v bodoch", + "Total Pages": "Celkový počet strán", + "Transparent Background": "Priehľadné pozadie", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Pri každom obrázku skúsi JPEG 2000 oproti JPEG a ponechá menší výsledok.", + "Trim margins from all pages": "Orezať okraje na všetkých stranách", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Overenie dôvery: {{trustVerified}}/{{length}} podpisov overených voči vlastnému certifikátu", + "Trusted": "Dôveryhodný", + "Trusted certificate loaded": "Dôveryhodný certifikát bol načítaný", + "Tsa Url": "URL servera TSA", + "Turns off quality, resolution and every other lossy image step.": "Vypne kvalitu, rozlíšenie a všetky ostatné stratové kroky pri obrázkoch.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL musí začínať na http:// alebo https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "PDF sa nepodarilo dešifrovať zadaným heslom.", + "Unable to repair any of the uploaded PDF files.": "Nepodarilo sa opraviť žiadny z nahratých súborov PDF.", + "Unembed standard fonts": "Odstrániť vloženie štandardných písiem", + "Unembed standard-font look-alikes": "Odstrániť vloženie písiem podobných štandardným", + "Unexpected delimiter in content stream": "Neočakávaný oddeľovač v obsahovom prúde", + "Unexpected reply from the engine.": "Neočakávaná odpoveď z jadra.", + "Uniform": "Jednotné", + "Unique Page Sizes": "Jedinečné veľkosti strán", + "Unknown": "Neznáme", + "Unknown error": "Neznáma chyba", + "Unknown error occurred in worker.": "Vo workeri sa vyskytla neznáma chyba.", + "Unknown error occurred.": "Vyskytla sa neznáma chyba.", + "Unlock": "Odomknúť", + "Unlock All": "Odomknúť všetko", + "Unlock Remaining ({{remaining}})": "Odomknúť zvyšok ({{remaining}})", + "Unlocked": "Odomknuté", + "Unlocked {{unlocked}} of {{length}} files.": "Odomknuté súbory: {{unlocked}} z {{length}}.", + "Unlocking...": "Odomyká sa...", + "Unresolved optional content reference": "Nevyriešený odkaz na voliteľný obsah", + "Unsupported ECDSA curve in signer certificate": "Nepodporovaná krivka ECDSA v certifikáte podpisovateľa", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Nepodporovaný obrázok. Pre vodoznak použite PNG alebo JPG.", + "Unsupported digest OID {{digestOid}}": "Nepodporovaný OID hashu {{digestOid}}", + "Unsupported file type: .{{ext}}": "Nepodporovaný typ súboru: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Nepodporovaný OID algoritmu podpisu {{oid}}", + "Unterminated array or dictionary in content stream": "Neukončené pole alebo slovník v obsahovom prúde", + "Unterminated hex string in content stream": "Neukončený hexadecimálny reťazec v obsahovom prúde", + "Unterminated inline image in content stream": "Neukončený vložený obrázok v obsahovom prúde", + "Unterminated string in content stream": "Neukončený reťazec v obsahovom prúde", + "Unverified: Unsupported Signature Algorithm": "Neoverené: nepodporovaný algoritmus podpisu", + "Updating metadata...": "Aktualizujú sa metadáta...", + "Upload Certificate": "Nahrať certifikát", + "Upload Comics": "Nahrať komiksy", + "Upload Documents": "Nahrať dokumenty", + "Upload EPUB Files": "Nahrať súbory EPUB", + "Upload Email Files": "Nahrať e-mailové súbory", + "Upload FB2 Files": "Nahrať súbory FB2", + "Upload Images": "Nahrať obrázky", + "Upload JSON Files": "Nahrať súbory JSON", + "Upload MOBI Files": "Nahrať súbory MOBI", + "Upload Markdown Files": "Nahrať súbory Markdown", + "Upload ODG Files": "Nahrať súbory ODG", + "Upload PDFs": "Nahrať PDF", + "Upload PUB Files": "Nahrať súbory PUB", + "Upload Pages Files": "Nahrať súbory Pages", + "Upload Presentations": "Nahrať prezentácie", + "Upload SVG Files": "Nahrať súbory SVG", + "Upload Spreadsheets": "Nahrať tabuľky", + "Upload Text Files": "Nahrať textové súbory", + "Upload Visio Files": "Nahrať súbory Visio", + "Upload WPD Files": "Nahrať súbory WPD", + "Upload WPS Files": "Nahrať súbory WPS", + "Upload XML Files": "Nahrať súbory XML", + "Upload XPS Files": "Nahrať súbory XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Nahrajte PDF a kliknutím na „Vygenerovať náhľad“ zobrazte rozloženie brožúry", + "Upload images and convert to PDF": "Nahrajte obrázky a konvertujte ich do PDF", + "Upload one or more PDF files": "Nahrajte jeden alebo viac súborov PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Veľké písmená A-Z, číslice 0-9 a - . $ / + % MEDZERA", + "Use same password for all files": "Použiť rovnaké heslo pre všetky súbory", + "User Password": "Heslo používateľa", + "VSD to PDF": "VSD do PDF", + "Valid From": "Platné od", + "Valid Signature": "Platný podpis", + "Valid Until": "Platné do", + "Validating {{n}} of {{length}}: {{name}}": "Overuje sa {{n}} z {{length}}: {{name}}", + "Validating...": "Overuje sa...", + "Value": "Hodnota", + "Value (e.g., Marketing)": "Hodnota (napr. Marketing)", + "Vertical": "Zvislo", + "Viewer not ready": "Prehliadač nie je pripravený", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Prehliadač nie je pripravený. Nahrajte PDF a počkajte, kým sa dokončí načítanie.", + "Visibility": "Viditeľnosť", + "Visio Files": "Súbory Visio", + "WPD to PDF": "WPD do PDF", + "WPS Files": "Súbory WPS", + "WPS to PDF": "WPS do PDF", + "Watermark": "Vodoznak", + "Watermark added successfully!": "Vodoznak bol úspešne pridaný!", + "Web Crypto API not available in this context": "Web Crypto API nie je v tomto kontexte dostupné", + "Web Crypto import/verify failed: {{error}}": "Import/overenie Web Crypto zlyhalo: {{error}}", + "WebP": "WebP", + "Whitelist": "Zoznam povolených", + "Width ({{unit}})": "Šírka ({{unit}})", + "Word": "Word", + "Word Documents": "Dokumenty Word", + "Word to PDF": "Word do PDF", + "WordPerfect Files": "Súbory WordPerfect", + "Worker crashed": "Worker spadol", + "Worker error occurred. Check console for details.": "Vyskytla sa chyba workera. Podrobnosti nájdete v konzole.", + "Workflow completed": "Pracovný postup dokončený", + "Wrong password": "Nesprávne heslo", + "Wrong password for: {{join}}": "Nesprávne heslo pre: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Nesprávne heslo alebo sa nepodarilo dešifrovať súbor „{{name}}“.", + "X Position": "Poloha X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Súbory XML", + "XML to PDF": "XML do PDF", + "XMP Metadata": "Metadáta XMP", + "XPS Files": "Súbory XPS", + "XPS to PDF": "XPS do PDF", + "Y Position": "Poloha Y", + "Year must be between 1900 and 2100": "Rok musí byť od 1900 do 2100", + "Yellow": "Žltá", + "Yellowish": "Nažltlé", + "You cannot delete the last page of the document.": "Poslednú stranu dokumentu nie je možné odstrániť.", + "Your PDF has been cropped and the download has started.": "Vaše PDF bolo orezané a sťahovanie sa začalo.", + "Your PDF has been downloaded successfully.": "Vaše PDF bolo úspešne stiahnuté.", + "Your PDF has been posterized.": "Vaše PDF bolo posterizované.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Vaše začiernenia sú použité na stranách, ale tento súbor je zašifrovaný, takže BentoPDF nemôže odstrániť ani kópie začierneného textu z jeho vlastností, záložiek a príloh. Pre úplné vyčistenie začierňujte nezašifrovanú kópiu a heslo pridajte potom nástrojom Zašifrovať PDF. Stiahnuť aj tak?", + "Your workflow needs at least one input node and one output node to run.": "Váš pracovný postup potrebuje na spustenie aspoň jeden vstupný a jeden výstupný uzol.", + "ZIP archive created successfully!": "Archív ZIP bol úspešne vytvorený!", + "Zoom(%)": "Priblíženie (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "napr. dd/mm/rrrr HH:MM:ss", + "form": "formulár", + "https://example.com": "https://example.com", + "signature found": "nájdený podpis", + "signatures found": "nájdené podpisy", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "Uzol: {{count}}", + "{{count}} nodes": "Uzly: {{count}}", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 strana", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • počet strán: {{pageCount}}", + "{{length}} Files Need a Password": "Súbory vyžadujúce heslo: {{length}}", + "{{length}} PDF file(s) selected": "Vybrané súbory PDF: {{length}}", + "{{length}} PDF files selected": "Vybrané súbory PDF: {{length}}", + "{{length}} attachment(s) extracted successfully!": "Prílohy ({{length}}) boli úspešne extrahované!", + "{{length}} file • {{totalPages}} total pages": "Súbory: {{length}} • strán spolu: {{totalPages}}", + "{{length}} file(s) attached successfully.": "Súbory ({{length}}) boli úspešne pripojené.", + "{{length}} files • {{totalPages}} total pages": "Súbory: {{length}} • strán spolu: {{totalPages}}", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Bolo chránené heslom, takže skomprimovaná kópia heslo nemá. Heslo pridajte znova nástrojom Zašifrovať PDF.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, strán: {{totalPageCount}})", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "Súbor {{name}} je digitálne podpísaný, preto zostal nezmenený. Kompresia by porušila podpis. Ak ho chcete aj tak skomprimovať, zapnite Prepísať ochranu obsahu v časti Vlastné nastavenia; jeho podpisy sa odstránia.", + "{{name}} is not a valid PDF, so it was not added.": "Súbor {{name}} nie je platné PDF, preto nebol pridaný.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "Súbor {{name}} je chránený heslom. Zadajte jeho heslo na karte súboru a potom znova komprimujte.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (s. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}} %", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Nepodarilo sa načítať počet strán", + "{{size}} • Loading pages...": "{{size}} • Načítavajú sa strany...", + "{{size}} • Loading...": "{{size}} • Načítava sa...", + "{{size}} • {{getPageCount}} pages": "{{size}} • strán: {{getPageCount}}", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • strán: {{numPages}}", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • strán: {{pageCount}}", + "{{size}} • {{totalPages}} pages": "{{size}} • strán: {{totalPages}}", + "{{size}} • {{value}} pages": "{{size}} • strán: {{value}}", + "{{successCount}} PDF(s) decrypted successfully.": "PDF ({{successCount}}) bolo úspešne dešifrovaných.", + "{{successCount}} PDF(s) linearized successfully.": "PDF ({{successCount}}) bolo úspešne linearizovaných.", + "{{totalPages}} pages → {{numSheets}} output sheets": "Strany: {{totalPages}} → výstupné listy: {{numSheets}}", + "{{validCount}} valid": "Platné: {{validCount}}", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}} %", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 strana", + "• {{label}}: {{count}} pages": "• {{label}}: počet strán: {{count}}" +} diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 59be0923..ca58373b 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Öppna huvudmenyn", "language": "Språk", "searchLanguage": "Sök språk…", - "noLanguagesFound": "Inga språk hittades" + "noLanguagesFound": "Inga språk hittades", + "breadcrumb": "Sökväg" }, "donation": { "message": "Gillar du BentoPDF? Hjälp oss att hålla det gratis och öppen källkod!", @@ -227,7 +228,7 @@ "support": { "title": "Gillar du mitt arbete?", "description": "BentoPDF är ett passionerat projekt, byggt för att erbjuda en gratis, privat och kraftfull PDF-verktygslåda för alla. Om du tycker det är användbart, överväg att stödja utvecklingen. Varje kaffe hjälper!", - "buyMeCoffee": "Buy Me a Coffee" + "buyMeCoffee": "Bjud mig på en kaffe" }, "footer": { "copyright": "© 2026 BentoPDF. Alla rättigheter reserverade.", @@ -236,6 +237,10 @@ "aboutUs": "Om oss", "faqLink": "FAQ", "contactUs": "Kontakta oss", + "tools": "Verktyg", + "pdfConverter": "PDF-konverterare", + "pdfSecurity": "PDF-säkerhet", + "mergeSplit": "Slå ihop och dela PDF", "legal": "Juridiskt", "termsAndConditions": "Villkor", "privacyPolicy": "Integritetspolicy", diff --git a/public/locales/sv/tools.json b/public/locales/sv/tools.json index 805a9bdb..33b62909 100644 --- a/public/locales/sv/tools.json +++ b/public/locales/sv/tools.json @@ -20,14 +20,29 @@ }, "convertToPdf": "Konvertera till PDF", "pdfMultiTool": { - "name": "PDF multiverktyg", + "name": "PDF-multiverktyg", "subtitle": "Sammanfoga, dela, organisera, ta bort, rotera, lägg till tomma sidor, extrahera och duplicera i ett enhetligt gränssnitt." }, "mergePdf": { "name": "Sammanfoga PDF", "subtitle": "Kombinera flera PDF-filer till en fil. Bevarar bokmärken.", "retainPageLabels": "Behåll de ursprungliga sidetiketterna från varje fil", - "retainPageLabelsHint": "Av (standard): den sammanslagna PDF:en använder naturlig sidnumrering 1–N. På: varje fils ursprungliga sidetiketter bevaras (kan ge duplicerade etiketter)." + "retainPageLabelsHint": "Av (standard): den sammanslagna PDF:en använder naturlig sidnumrering 1–N. På: varje fils ursprungliga sidetiketter bevaras (kan ge duplicerade etiketter).", + "removeDuplicateFonts": "Ta bort dubbletter av typsnitt", + "alert": { + "thumbnailError": "Kunde inte rendera sidminiatyrer", + "noSelection": "Inga filer eller sidor har valts för sammanfogning.", + "mergeSuccess": "PDF-filerna har sammanfogats!", + "mergeFailed": "Kunde inte sammanfoga PDF-filerna.", + "mergeError": "Kunde inte sammanfoga PDF-filerna. Kontrollera att alla filer är giltiga och inte lösenordsskyddade.", + "workerError": "Ett oväntat fel uppstod vid sammanfogningen.", + "loadError": "Kunde inte läsa in en eller flera PDF-filer" + }, + "loader": { + "renderingPreviews": "Renderar förhandsvisningar av sidor...", + "merging": "Sammanfogar PDF-filer...", + "loadingDocuments": "Läser in PDF-dokument..." + } }, "splitPdf": { "name": "Dela PDF", @@ -503,7 +518,8 @@ "noFile": "Ingen fil", "noFileExplanation": "Ladda upp en PDF-fil först.", "conversionSuccess": "PDF konverterad till TIFF!", - "conversionError": "Kunde inte konvertera PDF till TIFF. Filen kan vara skadad." + "conversionError": "Kunde inte konvertera PDF till TIFF. Filen kan vara skadad.", + "conversionOutOfMemory": "Webbläsaren fick slut på minne under konverteringen. Prova en lägre DPI, eller avmarkera alternativet för flersidig TIFF för att konvertera en sida i taget." } }, "pdfToCbz": { @@ -684,7 +700,7 @@ "subtitle": "Infoga en tom sida var som helst i din PDF." }, "reversePages": { - "name": "Omvänd sidor", + "name": "Vänd sidordning", "subtitle": "Vänd ordningen på alla sidor i ditt dokument." }, "rotatePdf": { @@ -692,7 +708,7 @@ "subtitle": "Vrid sidor i 90-graderssteg." }, "rotateCustom": { - "name": "Rotera efter anpassade grader", + "name": "Rotera med valfri vinkel", "subtitle": "Rotera sidor efter valfri vinkel." }, "nUpPdf": { @@ -700,7 +716,7 @@ "subtitle": "Ordna flera sidor på ett enda ark." }, "combineToSinglePage": { - "name": "Kombinera till enskild sida", + "name": "Kombinera till en sida", "subtitle": "Sy ihop alla sidor till en kontinuerlig rullning." }, "viewMetadata": { @@ -768,7 +784,7 @@ "subtitle": "Standardisera alla sidor till en enhetlig storlek." }, "linearizePdf": { - "name": "Linearizera PDF", + "name": "Linjärisera PDF", "subtitle": "Optimera PDF för snabb webbvisning." }, "pageDimensions": { @@ -990,8 +1006,7 @@ "subtitle": "Extrahera text från PDF-filer och spara som vanlig text (.txt). Stöder flera filer.", "noteLabel": "Obs:", "noteText": "Detta verktyg fungerar ENDAST med digitalt skapade PDF:er. För skannade dokument eller bildbaserade PDF:er, använd istället vårt OCR PDF-verktyg.", - "convertButton": "Extrahera text", - "note": "Detta verktyg fungerar ENDAST med digitalt skapade PDF:er. För scannade dokument eller bildbaserade PDF:er, använd vårt OCR PDF-verktyg istället." + "convertButton": "Extrahera text" }, "digitalSignPdf": { "name": "Digital signatur PDF", @@ -1189,7 +1204,7 @@ "workerError": "Worker-fel: {{message}}", "alternateMergeWorkerError": "Fel i växelvis sammanslagnings-worker: {{message}}", "noPdfFilesUploaded": "Inga PDF-filer uppladdade i PDF Input-noden", - "failedToLoadFile": "Kunde inte läsa in \"{{file}}\" — filen kan vara skadad", + "failedToLoadFile": "Kunde inte läsa in \"{{file}}\", filen kan vara skadad", "noImagesUploaded": "Inga bilder uppladdade i Image Input-noden", "noWordDocsUploaded": "Inga dokument uppladdade i Word Input-noden", "noExcelUploaded": "Inga kalkylblad uppladdade i Excel Input-noden", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Absolut! All bearbetning sker i din webbläsare. Dina filer lämnar aldrig din enhet, vilket garanterar fullständig integritet." }, "unlockPdf": { - "name": "Dekryptera PDF", + "name": "Lås upp PDF", "subtitle": "Lås upp PDF genom att ta bort lösenordsskydd." }, "protectPdf": { - "name": "Kryptera PDF", + "name": "Skydda PDF", "subtitle": "Lås din PDF genom att lägga till ett lösenord." } } diff --git a/public/locales/sv/ui.json b/public/locales/sv/ui.json new file mode 100644 index 00000000..7ed252ac --- /dev/null +++ b/public/locales/sv/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(korrigerad)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} till...", + "- Error parsing XMP XML. Displaying raw. -": "- Fel vid tolkning av XMP XML. Visar råtext. -", + "- No Info Dictionary data found -": "- Ingen Info Dictionary-data hittades -", + "- No XMP metadata found -": "- Ingen XMP-metadata hittades -", + "- No interactive form fields found -": "- Inga interaktiva formulärfält hittades -", + "- No parseable XMP properties found -": "- Inga tolkningsbara XMP-egenskaper hittades -", + "-- Select existing group --": "-- Välj befintlig grupp --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (Mycket känslig)", + "0.5° (Default)": "0,5° (Standard)", + "1.0° (Normal)": "1,0° (Normal)", + "100 (Fast)": "100 (Snabb)", + "150 (Default)": "150 (Standard)", + "1x2 (Booklet)": "1x2 (Broschyr)", + "2.0° (Less Sensitive)": "2,0° (Mindre känslig)", + "200 (Better)": "200 (Bättre)", + "200 (Good)": "200 (Bra)", + "2x2 (4-up)": "2x2 (4 per sida)", + "2x4 (8-up)": "2x4 (8 per sida)", + "300 (Best Quality)": "300 (Bästa kvalitet)", + "300 (Print)": "300 (Utskrift)", + "4x4 (16-up)": "4x4 (16 per sida)", + "600 (High Quality)": "600 (Hög kvalitet)", + "72 (Screen)": "72 (Skärm)", + "90° Clockwise": "90° medurs", + "90° Counter-clockwise": "90° moturs", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Ett fält med namnet \"{{fieldName}}\" finns redan. Byt namn på fältet så att det är unikt innan du laddar ned.", + "A new version of BentoPDF is available. Reload to update?": "En ny version av BentoPDF finns tillgänglig. Ladda om för att uppdatera?", + "A single PDF file": "En enda PDF-fil", + "A template with this name already exists.": "En mall med det här namnet finns redan.", + "ASCII characters (letters, numbers, symbols)": "ASCII-tecken (bokstäver, siffror, symboler)", + "Action": "Åtgärd", + "Add Blank Page": "Lägg till tom sida", + "Add Bookmark": "Lägg till bokmärke", + "Add Child Bookmark": "Lägg till underordnat bokmärke", + "Add Child Layer": "Lägg till underordnat lager", + "Add More Comics": "Lägg till fler serier", + "Add More Documents": "Lägg till fler dokument", + "Add More EPUB Files": "Lägg till fler EPUB-filer", + "Add More Email Files": "Lägg till fler e-postfiler", + "Add More FB2 Files": "Lägg till fler FB2-filer", + "Add More Files": "Lägg till fler filer", + "Add More Images": "Lägg till fler bilder", + "Add More JSON Files": "Lägg till fler JSON-filer", + "Add More MOBI Files": "Lägg till fler MOBI-filer", + "Add More Markdown Files": "Lägg till fler Markdown-filer", + "Add More ODG Files": "Lägg till fler ODG-filer", + "Add More PUB Files": "Lägg till fler PUB-filer", + "Add More Pages Files": "Lägg till fler Pages-filer", + "Add More Presentations": "Lägg till fler presentationer", + "Add More SVG Files": "Lägg till fler SVG-filer", + "Add More Spreadsheets": "Lägg till fler kalkylblad", + "Add More Text Files": "Lägg till fler textfiler", + "Add More Visio Files": "Lägg till fler Visio-filer", + "Add More WPD Files": "Lägg till fler WPD-filer", + "Add More WPS Files": "Lägg till fler WPS-filer", + "Add More XML Files": "Lägg till fler XML-filer", + "Add More XPS Files": "Lägg till fler XPS-filer", + "Add a new layer to get started!": "Lägg till ett nytt lager för att komma igång!", + "Add a text box": "Lägg till en textruta", + "Add an RFC 3161 document timestamp": "Lägg till en RFC 3161-tidsstämpel för dokumentet", + "Add an image": "Lägg till en bild", + "Add at least one node to run the workflow.": "Lägg till minst en nod för att köra arbetsflödet.", + "Add child": "Lägg till underordnad", + "Add child layer": "Lägg till underordnat lager", + "Add header and footer text": "Lägg till text i sidhuvud och sidfot", + "Add page numbers": "Lägg till sidnummer", + "Add searchable text layer via OCR": "Lägg till sökbart textlager via OCR", + "Add text watermark": "Lägg till textvattenstämpel", + "Add/Edit/Extract Attachments": "Lägg till/redigera/extrahera bilagor", + "Added": "Tillagd", + "Added \"{{afterText}}\"": "Lade till \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Lade till bild ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} tom sida har lagts till!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} tomma sidor har lagts till!", + "Adding header & footer...": "Lägger till sidhuvud och sidfot...", + "Adding page numbers...": "Lägger till sidnummer...", + "Adding watermark...": "Lägger till vattenstämpel...", + "Adding {{insertCount}} blank page...": "Lägger till {{insertCount}} tom sida...", + "Adding {{insertCount}} blank pages...": "Lägger till {{insertCount}} tomma sidor...", + "Adding {{name}} ({{n}}/{{length}})...": "Lägger till {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Justera färger", + "Adjust brightness, contrast, and colors": "Justera ljusstyrka, kontrast och färger", + "Advanced": "Avancerat", + "Advanced Feature Required": "Avancerad funktion krävs", + "Advanced Settings": "Avancerade inställningar", + "After Page": "Efter sida", + "After Page...": "Efter sida...", + "Align Objects": "Justera objekt", + "Alignment": "Justering", + "All": "Alla", + "All files repaired successfully!": "Alla filer har reparerats!", + "Alternate Merge": "Växelvis sammanfogning", + "Alternating and mixing pages...": "Varvar och blandar sidor...", + "Always resample to that resolution": "Samplas alltid om till den upplösningen", + "An error occurred during compression. Error: {{error}}": "Ett fel uppstod under komprimeringen. Fel: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Ett fel uppstod under konverteringen. Fel: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Ett fel uppstod under konverteringen. Fel: {{message}}", + "An error occurred during cropping.": "Ett fel uppstod under beskärningen.", + "An error occurred during extraction. Error: {{error}}": "Ett fel uppstod under extraheringen. Fel: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Ett fel uppstod under rastreringen. Fel: {{error}}", + "An error occurred during sanitization: {{msg}}": "Ett fel uppstod under saneringen: {{msg}}", + "An error occurred while combining pages.": "Ett fel uppstod när sidorna kombinerades.", + "An error occurred while creating the N-Up PDF.": "Ett fel uppstod när N-Up-PDF:en skapades.", + "An error occurred while creating the booklet.": "Ett fel uppstod när broschyren skapades.", + "An error occurred while dividing the PDF.": "Ett fel uppstod när PDF:en delades.", + "An error occurred while mixing the PDFs.": "Ett fel uppstod när PDF-filerna blandades.", + "An error occurred while standardizing pages.": "Ett fel uppstod när sidorna standardiserades.", + "An error occurred while trying to remove metadata.": "Ett fel uppstod när metadatan skulle tas bort.", + "An error occurred: {{error}}": "Ett fel uppstod: {{error}}", + "An error occurred: {{error}}.": "Ett fel uppstod: {{error}}.", + "An owner password is required when setting permissions": "Ett ägarlösenord krävs när du anger behörigheter", + "An unexpected error occurred during the repair process.": "Ett oväntat fel uppstod under reparationen.", + "An unexpected error occurred.": "Ett oväntat fel uppstod.", + "Analyzing data structure...": "Analyserar datastruktur...", + "Analyzing full PDF metadata...": "Analyserar all PDF-metadata...", + "Analyzing signatures...": "Analyserar signaturer...", + "Angle": "Vinkel", + "Annotations removed successfully!": "Kommentarerna har tagits bort!", + "Any text, URL, or data": "Valfri text, URL eller data", + "Application": "Program", + "Apply a digital signature to PDF": "Lägg till en digital signatur i PDF", + "Apply and download": "Verkställ och ladda ned", + "Apply redactions?": "Verkställa maskeringarna?", + "Apply scanner simulation effect": "Tillämpa skannersimuleringseffekt", + "Applying Bates numbers...": "Tillämpar Bates-nummer...", + "Applying color adjustments...": "Tillämpar färgjusteringar...", + "Applying crop...": "Tillämpar beskärning...", + "Applying redactions...": "Verkställer maskeringar...", + "Applying rotations...": "Tillämpar rotationer...", + "Applying scanner effect...": "Tillämpar skannereffekt...", + "Applying timestamp...": "Tillämpar tidsstämpel...", + "Applying {{replace}}...": "Tillämpar {{replace}}...", + "Archive contains an oversized image entry.": "Arkivet innehåller en för stor bildpost.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Arkivet har för många bilder (max {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Arkivet är för stort när det packas upp.", + "Are you sure you want to reset? All your work will be lost.": "Är du säker på att du vill återställa? Allt ditt arbete går förlorat.", + "Area (Coordinates)": "Område (koordinater)", + "Area ({{unit}}²)": "Yta ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman och Courier New mappas till inbyggda motsvarigheter. Tillämpas bara när det är säkert.", + "Arrange multiple pages per sheet": "Ordna flera sidor per ark", + "Arrange pages for booklet printing": "Ordna sidor för broschyrutskrift", + "Aspect Ratio": "Bildförhållande", + "At least one PDF document is required for export.": "Minst ett PDF-dokument krävs för export.", + "At least two valid PDFs are required.": "Minst två giltiga PDF-filer krävs.", + "Attaching files to PDF...": "Bifogar filer till PDF...", + "Attachments updated successfully!": "Bilagorna har uppdaterats!", + "Author": "Författare", + "Auto (Keep Original)": "Auto (behåll original)", + "Back": "Baksida", + "Back to Home": "Tillbaka till startsidan", + "Background Color": "Bakgrundsfärg", + "Background color changed successfully!": "Bakgrundsfärgen har ändrats!", + "Barcode": "Streckkod", + "Barcode Format": "Streckkodsformat", + "Barcode Value": "Streckkodsvärde", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Bates-numren har tillämpats! ({{batesStart}} till {{n}})", + "Beginning": "Början", + "Binarize": "Binärisera", + "Blank Position": "Position för tom sida", + "Blue": "Blå", + "Blur": "Oskärpa", + "Bold": "Fet", + "Bold & Italic": "Fet & kursiv", + "Booklet": "Broschyr", + "Booklet created with {{numSheets}} sheets!": "Broschyr skapad med {{numSheets}} ark!", + "Bookmarks imported from JSON!": "Bokmärken har importerats från JSON!", + "Bookmarks page": "Bokmärkessida", + "Border": "Kantlinje", + "Border Color": "Kantlinjefärg", + "Bottom": "Botten", + "Bottom Center": "Nere i mitten", + "Bottom Left": "Nere till vänster", + "Bottom Right": "Nere till höger", + "Bottom edge in points": "Nederkant i punkter", + "Brightness": "Ljusstyrka", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli och rastrering hoppades över för att behålla PDF/A.", + "Brotli compression (PDF 2.0)": "Brotli-komprimering (PDF 2.0)", + "Browser Note:": "Webbläsarnotis:", + "Building new PDF...": "Bygger ny PDF...", + "Building page pairing model...": "Bygger modell för sidparning...", + "Button": "Knapp", + "ByteRange does not start at the beginning of the file": "ByteRange börjar inte i början av filen", + "ByteRange out of bounds": "ByteRange ligger utanför gränserna", + "CBZ to PDF": "CBZ till PDF", + "CSV Loaded": "CSV inläst", + "CSV file is empty": "CSV-filen är tom", + "Cancel": "Avbryt", + "Cannot Delete": "Kan inte ta bort", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Det går inte att komma åt visarens kontroller. Använd nedladdningsknappen i PDF-visarens verktygsfält ovan.", + "Cannot delete all pages": "Det går inte att ta bort alla sidor", + "Cannot delete all pages.": "Det går inte att ta bort alla sidor.", + "Canvas context failed": "Canvas-kontexten misslyckades", + "Canvas context unavailable": "Canvas-kontexten är inte tillgänglig", + "Canvas toBlob conversion failed.": "Canvas toBlob-konverteringen misslyckades.", + "Canvas toBlob failed": "Canvas toBlob misslyckades", + "Center": "Centrera", + "Certificate (.pfx, .p12, .pem)": "Certifikat (.pfx, .p12, .pem)", + "Certificate Expired": "Certifikatet har gått ut", + "Certificate Password": "Certifikatlösenord", + "Certificate unlocked": "Certifikatet är upplåst", + "Change Certificate": "Byt certifikat", + "Change background color": "Ändra bakgrundsfärg", + "Changing background color...": "Ändrar bakgrundsfärg...", + "Changing text color...": "Ändrar textfärg...", + "Character": "Tecken", + "Checked State": "Markerat läge", + "Choose a valid page range.": "Välj ett giltigt sidintervall.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Välj ett av de medföljande språken eller bygg om det isolerade paketet med det saknade språket tillagt i --ocr-languages.", + "Cleanup": "Rensning", + "Click on PDF to Pick Location": "Klicka på PDF:en för att välja plats", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Klicka på knappen ovan och sedan på PDF:en där du vill att bokmärket ska leda", + "Click to Upload Image": "Klicka för att ladda upp bild", + "Clicking this field in the PDF will open a file picker to upload an image.": "Om du klickar på det här fältet i PDF:en öppnas en filväljare för att ladda upp en bild.", + "Clip invisible parts of images": "Beskär osynliga delar av bilder", + "Close": "Stäng", + "Close (Esc)": "Stäng (Esc)", + "Close panel": "Stäng panelen", + "Closes tab": "Stänger fliken", + "Closes window": "Stänger fönstret", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (bokmärken & metadata)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF är inte konfigurerat. Konfigurera det i WASM-inställningarna.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF skapade en tom dekrypterad fil.", + "CoherentPDF: not configured.": "CoherentPDF: inte konfigurerat.", + "Color": "Färg", + "Color adjustments applied successfully!": "Färgjusteringarna har tillämpats!", + "Colors inverted successfully!": "Färgerna har inverterats!", + "Cols": "Kolumner", + "Combine multiple PDFs into one": "Kombinera flera PDF-filer till en", + "Combine to Single Page": "Kombinera till en sida", + "Combining pages...": "Kombinerar sidor...", + "Comic Archives": "Serietidningsarkiv", + "Comments and markup become part of the page. Form fields and links keep working.": "Kommentarer och markeringar blir en del av sidan. Formulärfält och länkar fungerar fortfarande.", + "Complete": "Klart", + "Complete!": "Klart!", + "Compress": "Komprimera", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Komprimerade {{compressedCount}} PDF(er). Total storlek minskade från {{totalOriginalSize}} till {{totalCompressedSize}} (sparade {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Komprimerade {{compressedCount}} PDF(er). Total storlek: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Komprimerar flera PDF-filer...", + "Compressing to {{size}}...": "Komprimerar till {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Komprimerar {{n}}/{{length}}: {{name}}...", + "Compressing...": "Komprimerar...", + "Compression Complete": "Komprimeringen är klar", + "Compression Finished": "Komprimeringen är slutförd", + "Compression Level": "Komprimeringsnivå", + "Configure": "Konfigurera", + "Confirm": "Bekräfta", + "Confirm Action": "Bekräfta åtgärd", + "Conformance": "Överensstämmelse", + "Connected": "Ansluten", + "Contact Info": "Kontaktinformation", + "Content": "Innehåll", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Innehållets hash matchar inte attributet messageDigest. PDF-filen ändrades efter signeringen", + "Contrast": "Kontrast", + "Conversion Complete": "Konverteringen är klar", + "Conversion Error": "Konverteringsfel", + "Conversion engine ready!": "Konverteringsmotorn är redo!", + "Conversion failed: could not create PDF/A definition": "Konverteringen misslyckades: det gick inte att skapa PDF/A-definitionen", + "Convert Apple Pages documents to PDF": "Konvertera Apple Pages-dokument till PDF", + "Convert EPUB ebooks to PDF": "Konvertera EPUB-e-böcker till PDF", + "Convert Excel spreadsheets to PDF": "Konvertera Excel-kalkylblad till PDF", + "Convert FB2 e-books to PDF": "Konvertera FB2-e-böcker till PDF", + "Convert JSON files to PDF": "Konvertera JSON-filer till PDF", + "Convert MOBI e-books to PDF": "Konvertera MOBI-e-böcker till PDF", + "Convert Markdown files to PDF": "Konvertera Markdown-filer till PDF", + "Convert Microsoft Publisher to PDF": "Konvertera Microsoft Publisher till PDF", + "Convert OpenDocument Graphics to PDF": "Konvertera OpenDocument Graphics till PDF", + "Convert PDF pages to SVG": "Konvertera PDF-sidor till SVG", + "Convert PDF pages to images (ZIP)": "Konvertera PDF-sidor till bilder (ZIP)", + "Convert PDF tables to CSV": "Konvertera PDF-tabeller till CSV", + "Convert PDF tables to Excel": "Konvertera PDF-tabeller till Excel", + "Convert PDF to Markdown text": "Konvertera PDF till Markdown-text", + "Convert PDF to PDF/A for archiving": "Konvertera PDF till PDF/A för arkivering", + "Convert PDF to Word document": "Konvertera PDF till Word-dokument", + "Convert PowerPoint presentations to PDF": "Konvertera PowerPoint-presentationer till PDF", + "Convert SVG files to PDF": "Konvertera SVG-filer till PDF", + "Convert To Grayscale": "Konvertera till gråskala", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Konvertera Visio-diagram (VSD/VSDX) till PDF", + "Convert WPS Office documents to PDF": "Konvertera WPS Office-dokument till PDF", + "Convert Word documents to PDF": "Konvertera Word-dokument till PDF", + "Convert WordPerfect documents to PDF": "Konvertera WordPerfect-dokument till PDF", + "Convert XML documents to PDF": "Konvertera XML-dokument till PDF", + "Convert XPS/OXPS documents to PDF": "Konvertera XPS/OXPS-dokument till PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Konvertera serietidningsarkiv (CBZ/CBR) till PDF", + "Convert email files (.eml, .msg) to PDF": "Konvertera e-postfiler (.eml, .msg) till PDF", + "Convert fonts to vector outlines": "Konvertera typsnitt till vektorkonturer", + "Convert plain text to PDF": "Konvertera oformaterad text till PDF", + "Convert to grayscale": "Konvertera till gråskala", + "Convert to greyscale": "Konvertera till gråskala", + "Convert to image-based PDF": "Konvertera till bildbaserad PDF", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} filer ({{totalPages}} sidor) har konverterats till SVG!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} sidor har konverterats till SVG!", + "Converter not initialized": "Konverteraren är inte initierad", + "Converting BMP to PDF...": "Konverterar BMP till PDF...", + "Converting HEIC to PDF...": "Konverterar HEIC till PDF...", + "Converting TIFF to PDF...": "Konverterar TIFF till PDF...", + "Converting emails...": "Konverterar e-postmeddelanden...", + "Converting files...": "Konverterar filer...", + "Converting fonts to outlines...": "Konverterar typsnitt till konturer...", + "Converting images to PDF...": "Konverterar bilder till PDF...", + "Converting multiple PDFs to PDF/A...": "Konverterar flera PDF-filer till PDF/A...", + "Converting multiple RTF files to PDF...": "Konverterar flera RTF-filer till PDF...", + "Converting multiple files...": "Konverterar flera filer...", + "Converting page {{n}} of {{pageCount}}...": "Konverterar sida {{n}} av {{pageCount}}...", + "Converting to Markdown...": "Konverterar till Markdown...", + "Converting to SVG...": "Konverterar till SVG...", + "Converting to greyscale...": "Konverterar till gråskala...", + "Converting to {{level}}...": "Konverterar till {{level}}...", + "Converting {{name}}...": "Konverterar {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Konverterar {{n}}/{{length}}: {{name}}...", + "Converting...": "Konverterar...", + "Copied": "Kopierat", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Det gick inte att komma åt exportören för stämplade PDF-filer. Använd knappen Exportera → PDF i visarens verktygsfält i stället.", + "Could not add blank page.": "Det gick inte att lägga till en tom sida.", + "Could not add blank pages.": "Det gick inte att lägga till tomma sidor.", + "Could not add header or footer.": "Det gick inte att lägga till sidhuvud eller sidfot.", + "Could not add page numbers.": "Det gick inte att lägga till sidnummer.", + "Could not add the watermark.": "Det gick inte att lägga till vattenstämpeln.", + "Could not apply rotations.": "Det gick inte att tillämpa rotationerna.", + "Could not change text color.": "Det gick inte att ändra textfärgen.", + "Could not change the background color.": "Det gick inte att ändra bakgrundsfärgen.", + "Could not create ZIP archive.": "Det gick inte att skapa ZIP-arkivet.", + "Could not create canvas context.": "Det gick inte att skapa canvas-kontext.", + "Could not create comparison canvas context.": "Det gick inte att skapa canvas-kontext för jämförelsen.", + "Could not create offscreen comparison canvas.": "Det gick inte att skapa en canvas utanför skärmen för jämförelsen.", + "Could not create visual diff context.": "Det gick inte att skapa kontext för visuell skillnad.", + "Could not create visual diff overlay context.": "Det gick inte att skapa kontext för överlägg av visuell skillnad.", + "Could not detect blank pages.": "Det gick inte att identifiera tomma sidor.", + "Could not display the page.": "Det gick inte att visa sidan.", + "Could not export comparison PDF.": "Det gick inte att exportera jämförelse-PDF:en.", + "Could not export the signed PDF. Please try again.": "Det gick inte att exportera den signerade PDF-filen. Försök igen.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Det gick inte att exportera den stämplade PDF-filen. Använd knappen Exportera → PDF i visarens verktygsfält i stället.", + "Could not extract signer public key": "Det gick inte att extrahera signerarens publika nyckel", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Det gick inte att hitta {{testFile}} på den angivna URL:en (HTTP {{status}}). Kontrollera att filen finns.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Det gick inte att analysera PDF-filen fullständigt. Den kan vara skadad eller ha en ovanlig struktur.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Det gick inte att skapa en förhandsvisning. Filen kan vara skadad eller innehålla funktioner som inte stöds. Fel: {{message}}", + "Could not get canvas context": "Det gick inte att hämta canvas-kontext", + "Could not invert PDF colors.": "Det gick inte att invertera PDF-färgerna.", + "Could not load PDF. It may be corrupt or password-protected.": "Det gick inte att läsa in PDF-filen. Den kan vara skadad eller lösenordsskyddad.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Det gick inte att läsa in PDF-filen. Filen kan vara ogiltig, skadad eller lösenordsskyddad.", + "Could not load the PDF engine. Please refresh the page and try again.": "Det gick inte att läsa in PDF-motorn. Uppdatera sidan och försök igen.", + "Could not parse signer info": "Det gick inte att tolka signerarinformationen", + "Could not posterize the PDF.": "Det gick inte att postera PDF-filen.", + "Could not process \"{{name}}\". The file may be corrupted.": "Det gick inte att bearbeta \"{{name}}\". Filen kan vara skadad.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Det gick inte att minska filstorleken ytterligare. Original: {{originalSize}}, ny: {{compressedSize}}.", + "Could not remove annotations.": "Det gick inte att ta bort kommentarerna.", + "Could not remove blank pages.": "Det gick inte att ta bort tomma sidor.", + "Could not remove leftover data from the PDF.": "Det gick inte att ta bort kvarvarande data från PDF-filen.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Det gick inte att ta bort den maskerade texten ur dokumentdatan, så filen laddades inte ned.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Det gick inte att vända sidordningen i PDF-filen. Kontrollera att filerna är giltiga PDF-filer.", + "Could not update metadata. Please check that date formats are correct.": "Det gick inte att uppdatera metadatan. Kontrollera att datumformaten är korrekta.", + "Count": "Antal", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Skapad", + "Creating Booklet...": "Skapar broschyr...", + "Creating Excel file...": "Skapar Excel-fil...", + "Creating N-Up PDF...": "Skapar N-Up-PDF...", + "Creating PDF from JPGs...": "Skapar PDF från JPG-filer...", + "Creating PDF from SVG files...": "Skapar PDF från SVG-filer...", + "Creating PDF...": "Skapar PDF...", + "Creating ZIP archive...": "Skapar ZIP-arkiv...", + "Creating ZIP file...": "Skapar ZIP-fil...", + "Creating ZIP...": "Skapar ZIP...", + "Creating table...": "Skapar tabell...", + "Creator": "Skapare", + "Crop": "Beskär", + "Crop complete! Your download has started.": "Beskärningen är klar! Nedladdningen har startat.", + "Cryptographic verification failed": "Den kryptografiska verifieringen misslyckades", + "Custom": "Anpassad", + "Custom Format": "Anpassat format", + "Custom Height": "Anpassad höjd", + "Custom Units": "Anpassade enheter", + "Custom Width": "Anpassad bredd", + "Custom Zoom": "Anpassad zoom", + "Custom...": "Anpassad...", + "DataMatrix": "DataMatrix", + "Date Format": "Datumformat", + "Decrease size": "Minska storleken", + "Decrypt": "Dekryptera", + "Decrypting PDF...": "Dekrypterar PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Dekrypterar {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Dekrypterar {{n}} av {{length}}: {{name}}", + "Decrypting...": "Dekrypterar...", + "Decryption Failed": "Dekrypteringen misslyckades", + "Delete": "Ta bort", + "Delete \"{{title}}\"?": "Ta bort \"{{title}}\"?", + "Delete Field": "Ta bort fält", + "Delete Page": "Ta bort sida", + "Delete Pages": "Ta bort sidor", + "Delete all {{length}} bookmark(s) ? ": "Ta bort alla {{length}} bokmärken?", + "Delete layer": "Ta bort lager", + "Delete {{size}} bookmark(s) ? ": "Ta bort {{size}} bokmärken?", + "Deleted": "Borttagen", + "Deleted {{size}} page(s) successfully!": "{{size}} sidor har tagits bort!", + "Deleting pages...": "Tar bort sidor...", + "Description": "Beskrivning", + "Description for screen readers": "Beskrivning för skärmläsare", + "Deselect All": "Avmarkera alla", + "Deskew": "Räta upp", + "Deskew PDF": "Räta upp PDF", + "Deskewed {{length}} file(s). {{value}}": "Rätade upp {{length}} fil(er). {{value}}", + "Deskewing {{name}}...": "Rätar upp {{name}}...", + "Destination": "Mål", + "Detecting blank pages...": "Identifierar tomma sidor...", + "Digest Algorithm:": "Sammandragsalgoritm:", + "Digital Sign": "Digital signatur", + "Direction": "Riktning", + "Divide Pages": "Dela sidor", + "Divide into boxes (0 to disable)": "Dela upp i rutor (0 för att inaktivera)", + "Document Properties": "Dokumentegenskaper", + "Document Type": "Dokumenttyp", + "Document properties": "Dokumentegenskaper", + "Document-level attachment": "Bilaga på dokumentnivå", + "Done: back to tools": "Klart, tillbaka till verktygen", + "Download": "Ladda ned", + "Download Edited PDF": "Ladda ned redigerad PDF", + "Download anyway": "Ladda ned ändå", + "Download as PDF or ZIP automatically": "Ladda ned automatiskt som PDF eller ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} PDF-filer laddades ned i ett ZIP-arkiv.", + "Downloads started for all files.": "Nedladdningarna har startat för alla filer.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Tar bort taggning, som skärmläsare förlitar sig på.", + "Duplicate Field Name": "Dubblettfältnamn", + "Duplicate Field Names": "Dubblettfältnamn", + "Duplicate Page": "Duplicera sida", + "Duplicate Page Numbers": "Dubbla sidnummer", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA-signaturen kan inte verifieras mot signerarens publika nyckel", + "EPUB Files": "EPUB-filer", + "EPUB to PDF": "EPUB till PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ till PDF", + "Edit": "Redigera", + "Edit All": "Redigera alla", + "Edit Bookmark": "Redigera bokmärke", + "Edit Bookmarks": "Redigera bokmärken", + "Edit Images": "Redigera bilder", + "Edit Metadata": "Redigera metadata", + "Edit PDF metadata": "Redigera PDF-metadata", + "Edit Scope": "Redigeringsomfång", + "Edit Shapes": "Redigera former", + "Edit Text": "Redigera text", + "Edit tool": "Redigeringsverktyg", + "Edit {{scopes}}": "Redigera {{scopes}}", + "Email Files": "E-postfiler", + "Email to PDF": "E-post till PDF", + "Embedding files into PDF...": "Bäddar in filer i PDF...", + "Empty signature bytes": "Tomma signaturbyte", + "Encrypt": "Kryptera", + "Encrypt PDF with password": "Kryptera PDF med lösenord", + "Encrypted file": "Krypterad fil", + "Encrypting PDF with 256-bit AES...": "Krypterar PDF med 256-bitars AES...", + "Encryption Failed": "Krypteringen misslyckades", + "Encryption resulted in an empty file.": "Krypteringen gav en tom fil.", + "End": "Slut", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Ange 0 för att infoga i början eller {{pageCount}} för att infoga i slutet.", + "Enter bookmark title": "Ange bokmärkestitel", + "Enter name for child layer under \"{{Layer}}\":": "Ange namn för underordnat lager under \"{{Layer}}\":", + "Enter password": "Ange lösenord", + "Enter password...": "Ange lösenord...", + "Enter passwords for each encrypted file": "Ange lösenord för varje krypterad fil", + "Error": "Fel", + "Error during execution": "Fel under körning", + "Error generating PDF: {{error}}": "Fel när PDF skapades: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Fel när PDF-filen lästes in. Försök igen med en giltig PDF.", + "Error reading files: {{error}}": "Fel när filerna lästes: {{error}}", + "Error saving PDF. Check console for details.": "Fel när PDF-filen sparades. Se konsolen för detaljer.", + "Error: {{error}}": "Fel: {{error}}", + "Exactly 11 or 12 digits": "Exakt 11 eller 12 siffror", + "Exactly 12 or 13 digits": "Exakt 12 eller 13 siffror", + "Example of current format:": "Exempel på aktuellt format:", + "Excel to PDF": "Excel till PDF", + "Existing Radio Groups": "Befintliga radiogrupper", + "Export Error": "Exportfel", + "Export Value": "Exportvärde", + "Export failed": "Exporten misslyckades", + "External processing module needed": "Extern bearbetningsmodul behövs", + "Extract Images": "Extrahera bilder", + "Extract Pages": "Extrahera sidor", + "Extract Tables": "Extrahera tabeller", + "Extract a range of pages": "Extrahera ett intervall av sidor", + "Extract all images from PDF": "Extrahera alla bilder från PDF", + "Extract pages as separate PDFs": "Extrahera sidor som separata PDF-filer", + "Extract text from PDF": "Extrahera text från PDF", + "Extracted 1 table successfully!": "1 tabell har extraherats!", + "Extracted text from {{length}} PDF files!": "Text har extraherats från {{length}} PDF-filer!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Extraherade {{completed}} PDF(er), {{failed}} misslyckades.", + "Extracted {{length}} page(s) successfully!": "{{length}} sidor har extraherats!", + "Extracted {{length}} table(s) to Excel!": "{{length}} tabeller har extraherats till Excel!", + "Extracted {{length}} tables successfully!": "{{length}} tabeller har extraherats!", + "Extracting attachments from {{length}} file(s)...": "Extraherar bilagor från {{length}} fil(er)...", + "Extracting images from {{name}}...": "Extraherar bilder från {{name}}...", + "Extracting pages...": "Extraherar sidor...", + "Extracting tables...": "Extraherar tabeller...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Extraherar text från fil {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Extraherar text från flera filer...", + "Extracting text from {{name}}...": "Extraherar text från {{name}}...", + "Extracting text...": "Extraherar text...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Extraherar {{name}} för AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Extraherar {{name}} för AI...", + "Extracting...": "Extraherar...", + "Extraction Complete": "Extraheringen är klar", + "Extraction Error": "Extraheringsfel", + "Extraction Partial": "Delvis extraherat", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Extraheringen är klar! {{length}} bilaga/bilagor i zip-filen ({{totalSize}}). Nedladdningen har startat.", + "FB2 Files": "FB2-filer", + "FB2 to PDF": "FB2 till PDF", + "Failed": "Misslyckades", + "Failed to acquire 2D canvas context": "Det gick inte att hämta 2D-canvas-kontext", + "Failed to add child layer": "Det gick inte att lägga till underordnat lager", + "Failed to apply Bates numbers.": "Det gick inte att tillämpa Bates-nummer.", + "Failed to apply color adjustments. The file might be corrupted.": "Det gick inte att tillämpa färgjusteringarna. Filen kan vara skadad.", + "Failed to apply redactions.": "Det gick inte att verkställa maskeringarna.", + "Failed to apply scanner effect. The file might be corrupted.": "Det gick inte att tillämpa skannereffekten. Filen kan vara skadad.", + "Failed to attach files: {{error}}": "Det gick inte att bifoga filer: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Det gick inte att konvertera BMP till PDF. En av filerna kan vara ogiltig.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Det gick inte att konvertera HEIC till PDF. En av filerna kan vara ogiltig.", + "Failed to convert PDF to CSV. {{message}}": "Det gick inte att konvertera PDF till CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Det gick inte att konvertera PDF till Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Det gick inte att konvertera PDF till SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Det gick inte att konvertera PDF till gråskala. Filen kan vara skadad.", + "Failed to convert PDF. It may be image-based or corrupted.": "Det gick inte att konvertera PDF-filen. Den kan vara bildbaserad eller skadad.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Det gick inte att konvertera TIFF till PDF. En av filerna kan vara ogiltig.", + "Failed to convert images to PDF.": "Det gick inte att konvertera bilderna till PDF.", + "Failed to convert text to PDF. {{error}}": "Det gick inte att konvertera text till PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Det gick inte att konvertera {{filename}} till PNG", + "Failed to copy metadata to clipboard.": "Det gick inte att kopiera metadatan till urklipp.", + "Failed to create PDF.": "Det gick inte att skapa PDF.", + "Failed to create PNG blob": "Det gick inte att skapa PNG-blob", + "Failed to create canvas context": "Det gick inte att skapa canvas-kontext", + "Failed to create split PDFs.": "Det gick inte att skapa de delade PDF-filerna.", + "Failed to decode image: {{name}}": "Det gick inte att avkoda bilden: {{name}}", + "Failed to decrypt private key": "Det gick inte att dekryptera den privata nyckeln", + "Failed to decrypt. Try the Decrypt tool instead.": "Det gick inte att dekryptera. Prova verktyget Dekryptera i stället.", + "Failed to delete layer": "Det gick inte att ta bort lagret", + "Failed to delete pages.": "Det gick inte att ta bort sidorna.", + "Failed to deskew PDF: {{error}}": "Det gick inte att räta upp PDF-filen: {{error}}", + "Failed to download the edited PDF.": "Det gick inte att ladda ned den redigerade PDF-filen.", + "Failed to edit attachments.": "Det gick inte att redigera bilagorna.", + "Failed to extract certificate from PFX file": "Det gick inte att extrahera certifikatet från PFX-filen", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Det gick inte att extrahera sidorna (qpdf-slutkod {{exitCode}}).", + "Failed to extract pages.": "Det gick inte att extrahera sidorna.", + "Failed to extract tables. {{message}}": "Det gick inte att extrahera tabellerna. {{message}}", + "Failed to extract text from PDF.": "Det gick inte att extrahera text från PDF-filen.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Det gick inte att hämta ICC-profilen från {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Det gick inte att hämta typsnittsfilen: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Det gick inte att hämta gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Det gick inte att hämta {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Det gick inte att hämta 2D-kontext för sida {{pageNumber}}", + "Failed to get canvas context": "Det gick inte att hämta canvas-kontext", + "Failed to insert PDF. The file may be corrupted.": "Det gick inte att infoga PDF-filen. Filen kan vara skadad.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Det gick inte att läsa in Ghostscript från {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Det gick inte att läsa in PDF-filen.", + "Failed to load PDF for cropping.": "Det gick inte att läsa in PDF-filen för beskärning.", + "Failed to load PDF for preview.": "Det gick inte att läsa in PDF-filen för förhandsvisning.", + "Failed to load PDF form viewer.": "Det gick inte att läsa in PDF-formulärvisaren.", + "Failed to load PDF layers": "Det gick inte att läsa in PDF-lager", + "Failed to load PyMuPDF from CDN: {{msg}}": "Det gick inte att läsa in PyMuPDF från CDN: {{msg}}", + "Failed to load SVG image": "Det gick inte att läsa in SVG-bilden", + "Failed to load WebP image": "Det gick inte att läsa in WebP-bilden", + "Failed to load attachments from PDF.": "Det gick inte att läsa in bilagor från PDF-filen.", + "Failed to load files: {{error}}": "Det gick inte att läsa in filer: {{error}}", + "Failed to load image.": "Det gick inte att läsa in bilden.", + "Failed to load image: {{filename}}": "Det gick inte att läsa in bilden: {{filename}}", + "Failed to load one or more PDF files.": "Det gick inte att läsa in en eller flera PDF-filer.", + "Failed to load script: {{url}}": "Det gick inte att läsa in skriptet: {{url}}", + "Failed to load template.": "Det gick inte att läsa in mallen.", + "Failed to load the PDF Editor.": "Det gick inte att läsa in PDF-redigeraren.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Det gick inte att läsa in bildprocessorn. Kontrollera att webbläsaren stöder SharedArrayBuffer (kräver HTTPS eller localhost).", + "Failed to parse CSV: {{error}}": "Det gick inte att tolka CSV: {{error}}", + "Failed to parse signature": "Det gick inte att tolka signaturen", + "Failed to parse the certificate file.": "Det gick inte att tolka certifikatfilen.", + "Failed to process HEIC file: {{name}}": "Det gick inte att bearbeta HEIC-filen: {{name}}", + "Failed to process WebP file: {{name}}": "Det gick inte att bearbeta WebP-filen: {{name}}", + "Failed to read file.": "Det gick inte att läsa filen.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Det gick inte att ta bort begränsningarna. PDF-filen kan kräva rätt ägarlösenord.", + "Failed to render page": "Det gick inte att rendera sidan", + "Failed to render page previews": "Det gick inte att rendera sidförhandsvisningar", + "Failed to render page previews.": "Det gick inte att rendera sidförhandsvisningar.", + "Failed to render page.": "Det gick inte att rendera sidan.", + "Failed to save changes.": "Det gick inte att spara ändringarna.", + "Failed to save the new PDF. Check console for details.": "Det gick inte att spara den nya PDF-filen. Se konsolen för detaljer.", + "Failed to split PDF. Please check your selection.": "Det gick inte att dela PDF-filen. Kontrollera ditt urval.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Det gick inte att tidsstämpla PDF-filen: {{message}}\n\nProva en annan TSA-server eller kontrollera din internetanslutning.", + "Failed to toggle layer visibility": "Det gick inte att växla lagrets synlighet", + "Failed to validate signatures. The file may be corrupted.": "Det gick inte att validera signaturerna. Filen kan vara skadad.", + "Features enabled by this module:": "Funktioner som aktiveras av den här modulen:", + "Field Name": "Fältnamn", + "Field Name (Group Name)": "Fältnamn (Gruppnamn)", + "Field Name Conflict": "Konflikt i fältnamn", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Fältnamnet \"{{newName}}\" finns redan i den här {{value}}. Prova ett unikt namn.", + "Field name cannot be empty": "Fältnamnet får inte vara tomt", + "File": "Fil", + "File Size": "Filstorlek", + "File exists but could not be read. Check CORS configuration.": "Filen finns men kunde inte läsas. Kontrollera CORS-konfigurationen.", + "File list not found": "Fillistan hittades inte", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Filstorleken minskade från {{originalSize}} till {{compressedSize}} (sparade {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Fil {{n}}/{{length}}: sida {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Fil {{n}}/{{length}}: {{message}}", + "Filename": "Filnamn", + "Files that failed: {{errorCount}}.": "Filer som misslyckades: {{errorCount}}.", + "Fill (cover full target page)": "Fyll (täck hela målsidan)", + "Fill Color": "Fyllningsfärg", + "Finalizing PDF...": "Slutför PDF...", + "Find & replace": "Sök och ersätt", + "Finds the best quality under this size. 0 means no target.": "Hittar bästa kvalitet under den här storleken. 0 betyder inget mål.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox och Chrome kan visa sitt eget datumformat under valet. Rätt format tillämpas när du har skrivit klart datumet.", + "First Indent": "Första indrag", + "Fit (keep full page visible)": "Anpassa (behåll hela sidan synlig)", + "Fit Page": "Anpassa till sida", + "Fix Page Size": "Åtgärda sidstorlek", + "Flatten": "Platta till", + "Flatten Forms": "Platta till formulär", + "Flatten annotations": "Platta till kommentarer", + "Flatten form fields": "Platta till formulärfält", + "Flatten forms and annotations": "Platta till formulär och kommentarer", + "Flatten links": "Platta till länkar", + "Flattening PDF...": "Plattar till PDF...", + "Flattening and saving PDF...": "Plattar till och sparar PDF...", + "Flattening multiple PDFs...": "Plattar till flera PDF-filer...", + "Flattening page {{i}} of {{totalPages}}...": "Plattar till sida {{i}} av {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Plattar till {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Fokuserar adressfältet", + "Font": "Typsnitt", + "Font Color": "Typsnittsfärg", + "Font Family": "Typsnittsfamilj", + "Font Size": "Typsnittsstorlek", + "Font size: {{bSize}} → {{aSize}}": "Typsnittsstorlek: {{bSize}} → {{aSize}}", + "Font to Outline": "Typsnitt till konturer", + "Font: {{bFont}} → {{aFont}}": "Typsnitt: {{bFont}} → {{aFont}}", + "Fonts": "Typsnitt", + "Footer Center": "Sidfot centrerad", + "Footer Left": "Sidfot vänster", + "Footer Right": "Sidfot höger", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "För PDF-filer med enbart bilder, som skanningar. Hoppas över när dokumentet har markerbar text, om inte Åsidosätt innehållsskydd är aktiverat.", + "Form fields stop being fillable.": "Formulärfälten går inte längre att fylla i.", + "Format": "Format", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Hittade {{length}} tomma sidor. Klicka på en sida för att avmarkera den.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Hittade {{length}} befintliga bokmärken. Ersätta nuvarande bokmärken?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Hittade {{length}} bild(er) i {{length2}} PDF(er).", + "Front": "Framsida", + "Full Coverage": "Full täckning", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Skapa innehållsförteckning från bokmärken", + "Generating High-Quality PDF...": "Skapar högkvalitativ PDF...", + "Generating PDF...": "Skapar PDF...", + "Generating ZIP file...": "Skapar ZIP-fil...", + "Generating formatted content...": "Skapar formaterat innehåll...", + "Generating preview...": "Skapar förhandsvisning...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (PDF/A-konvertering)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB-konverteringen misslyckades med slutkod {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript-konverteringen misslyckades med slutkod {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript skapade ingen utdatafil", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript är inte konfigurerat. Konfigurera det i de avancerade inställningarna.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript är inte konfigurerat. Konfigurera det i WASM-inställningarna.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript är inte konfigurerat. PyMuPDF kräver Ghostscript för vissa åtgärder. Konfigurera båda i de avancerade inställningarna.", + "Ghostscript threw an exception: {{e}}": "Ghostscript gav ett undantag: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript-wrappern exponerade inte det förväntade gränssnittet. Förväntade loadGS() eller klassen GhostscriptWASM.", + "Go": "Kör", + "Go to page": "Gå till sida", + "Grayscale": "Gråskala", + "Green": "Grön", + "Greyscale": "Gråskala", + "Grid Mode": "Rutnätsläge", + "Group Name (Must be same for group)": "Gruppnamn (måste vara samma för gruppen)", + "H-Scale %": "H-skala %", + "Hanging Indent": "Hängande indrag", + "Hard reloads page": "Laddar om sidan helt", + "Header & Footer": "Sidhuvud & sidfot", + "Header & Footer added successfully!": "Sidhuvud och sidfot har lagts till!", + "Header Center": "Sidhuvud centrerat", + "Header Left": "Sidhuvud vänster", + "Header Right": "Sidhuvud höger", + "Height ({{unit}})": "Höjd ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Dölj", + "Hide Border": "Dölj kantlinje", + "Hide password": "Dölj lösenord", + "Hides window": "Döljer fönstret", + "High (288 DPI)": "Hög (288 DPI)", + "High (Smallest Files)": "Hög (minsta filer)", + "Horizontal": "Horisontell", + "Hue Shift": "Nyansförskjutning", + "Image Format": "Bildformat", + "Image Input": "Bildinmatning", + "Image quality": "Bildkvalitet", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Bildens storlek ändrades från {{width}}×{{height}} till {{width2}}×{{height2}}", + "Images": "Bilder", + "Images above this are resampled down. None leaves resolution alone.": "Bilder över detta samplas ned. Ingen lämnar upplösningen orörd.", + "Imported {{length}} bookmarks!": "{{length}} bokmärken har importerats!", + "Inches (in)": "Tum (in)", + "Include Attachments": "Inkludera bilagor", + "Include Cc Bcc": "Inkludera Cc och Bcc", + "Include this file": "Inkludera den här filen", + "Incorrect Page Count": "Fel antal sidor", + "Incorrect Password": "Fel lösenord", + "Incorrect password": "Fel lösenord", + "Incorrect password. Please try again.": "Fel lösenord. Försök igen.", + "Increase size": "Öka storleken", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Indexerar PDF 1 sida {{pageNumber}} av {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Indexerar PDF 2 sida {{pageNumber}} av {{totalPages}}...", + "Info": "Info", + "Info Dictionary": "Info Dictionary", + "Inherit": "Ärv", + "Initialization Error": "Initieringsfel", + "Initializing Ghostscript...": "Initierar Ghostscript...", + "Initializing PDF engine...": "Initierar PDF-motorn...", + "Initializing PyMuPDF...": "Initierar PyMuPDF...", + "Initializing decryption...": "Initierar dekryptering...", + "Initializing encryption...": "Initierar kryptering...", + "Initializing repair engine...": "Initierar reparationsmotorn...", + "Initializing...": "Initierar...", + "Input Required": "Inmatning krävs", + "Insecure Digest (MD5 / SHA-1)": "Osäker sammandragsalgoritm (MD5 / SHA-1)", + "Insert blank pages": "Infoga tomma sidor", + "Insert blank pages after this page number": "Infoga tomma sidor efter det här sidnumret", + "Interactive Form Fields": "Interaktiva formulärfält", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Varva sidor från flera PDF-filer (t.ex. udda + omvända jämna från en enkelsidig skanning)", + "Invalid Certificate": "Ogiltigt certifikat", + "Invalid File": "Ogiltig fil", + "Invalid Files": "Ogiltiga filer", + "Invalid Input": "Ogiltig inmatning", + "Invalid JSON format": "Ogiltigt JSON-format", + "Invalid Name": "Ogiltigt namn", + "Invalid Order": "Ogiltig ordning", + "Invalid PDF password.": "Ogiltigt PDF-lösenord.", + "Invalid Page Numbers": "Ogiltiga sidnummer", + "Invalid Page Order": "Ogiltig sidordning", + "Invalid Pages": "Ogiltiga sidor", + "Invalid Range": "Ogiltigt intervall", + "Invalid Signature": "Ogiltig signatur", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Ogiltig TSA-URL. Tidsstämplingsmyndigheten måste vara en giltig http://- eller https://-URL.", + "Invalid URL": "Ogiltig URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Ogiltigt URL-format. Ange en giltig URL (t.ex. https://example.com/wasm/)", + "Invalid XML: no root element": "Ogiltig XML: inget rotelement", + "Invalid data": "Ogiltiga data", + "Invalid hex string in content stream": "Ogiltig hex-sträng i innehållsström", + "Invalid page range specified.": "Ogiltigt sidintervall angivet.", + "Invalid shortcut format": "Ogiltigt genvägsformat", + "Invalid: Cryptographic Verification Failed": "Ogiltig: den kryptografiska verifieringen misslyckades", + "Invert Colors": "Invertera färger", + "Invert all colors": "Invertera alla färger", + "Inverting PDF colors...": "Inverterar PDF-färger...", + "Issuer": "Utfärdare", + "It fits the {{targetBytes}} target.": "Den ryms inom målet på {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Den ligger fortfarande över målet på {{targetBytes}} eftersom Bevara PDF/A begränsar hur mycket den kan komprimeras.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Den intygar inte längre PDF/A-överensstämmelse. Aktivera Bevara PDF/A under Anpassade inställningar för att behålla den.", + "Italic": "Kursiv", + "Item 1": "Post 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "De digitala signaturerna togs bort för att filen skulle kunna komprimeras. Signera den igen vid behov.", + "JPEG (Smaller file size)": "JPEG (mindre filstorlek)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "JPEG-kvalitet för omkodade bilder, 20 till 100. Lägre värde ger mindre filer och mer synliga artefakter.", + "JPG": "JPG", + "JSON Files": "JSON-filer", + "JSON Loaded": "JSON inläst", + "JSON to PDF": "JSON till PDF", + "Javascript Code": "Javascript-kod", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Håller en PDF/A-fil överensstämmande. Brotli och rastrering hoppas över när detta är på.", + "Keeps only the characters the document uses.": "Behåller bara de tecken som dokumentet använder.", + "Key (e.g., Department)": "Nyckel (t.ex. Avdelning)", + "Keywords": "Nyckelord", + "Label": "Etikett", + "Label / Prompt": "Etikett / Uppmaning", + "Landscape": "Liggande", + "Language": "Språk", + "Layer not found": "Lagret hittades inte", + "Layer {{number}}": "Lager {{number}}", + "Leave blank for all pages": "Lämna tomt för alla sidor", + "Left": "Vänster", + "Left edge in points (1 inch = 72 pts)": "Vänsterkant i punkter (1 tum = 72 pt)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Nivå", + "Limit recognized characters (leave empty for all)": "Begränsa igenkända tecken (lämna tomt för alla)", + "Line": "Linje", + "Linearization Failed": "Linearizeringen misslyckades", + "Linearize": "Linjärisera", + "Links stop being clickable.": "Länkar går inte längre att klicka på.", + "Lists": "Listor", + "Load": "Läs in", + "Load system fonts": "Läs in systemtypsnitt", + "Load system fonts…": "Läs in systemtypsnitt…", + "Loaded": "Inläst", + "Loaded bookmarks from JSON. Now upload your PDF.": "Bokmärken lästes in från JSON. Ladda nu upp din PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "{{length}} bokmärken lästes in från CSV. Ladda nu upp din PDF.", + "Loading Engine...": "Läser in motorn...", + "Loading Ghostscript...": "Läser in Ghostscript...", + "Loading PDF Editor...": "Läser in PDF-redigeraren...", + "Loading PDF Text Editor...": "Läser in PDF-textredigeraren...", + "Loading PDF converter...": "Läser in PDF-konverteraren...", + "Loading PDF documents...": "Läser in PDF-dokument...", + "Loading PDF engine...": "Läser in PDF-motorn...", + "Loading PDF files...": "Läser in PDF-filer...", + "Loading PDF form...": "Läser in PDF-formulär...", + "Loading PDF processor...": "Läser in PDF-processorn...", + "Loading PDF viewer...": "Läser in PDF-visaren...", + "Loading PDF...": "Läser in PDF...", + "Loading PDFs...": "Läser in PDF-filer...", + "Loading attachments...": "Läser in bilagor...", + "Loading comparison {{currentPage}} of {{length}}...": "Läser in jämförelse {{currentPage}} av {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Läser in konverteringsmotorn ({{percent}}%)...", + "Loading conversion engine...": "Läser in konverteringsmotorn...", + "Loading engine...": "Läser in motorn...", + "Loading fonts...": "Läser in typsnitt...", + "Loading layers from {{name}}...": "Läser in lager från {{name}}...", + "Loading page {{num}}...": "Läser in sida {{num}}...", + "Loading preview...": "Läser in förhandsvisning...", + "Loading {{name}}...": "Läser in {{name}}...", + "Loading...": "Läser in...", + "Location": "Plats", + "Lossless (No Quality Loss)": "Förlustfri (ingen kvalitetsförlust)", + "Lossless (no image re-encoding)": "Förlustfri (ingen omkodning av bilder)", + "Low (Best Quality)": "Låg (bästa kvalitet)", + "MOBI Files": "MOBI-filer", + "MOBI to PDF": "MOBI till PDF", + "Malformed ByteRange": "Felaktigt formaterad ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Felaktigt formaterad ECDSA-signatur (det gick inte att tolka r,s)", + "Malformed inline image in content stream": "Felaktigt formaterad inbäddad bild i innehållsström", + "Malformed signatureAlgorithm": "Felaktigt formaterad signatureAlgorithm", + "Margins": "Marginaler", + "Markdown Files": "Markdown-filer", + "Markdown to PDF": "Markdown till PDF", + "Max Length (0 for unlimited)": "Maxlängd (0 för obegränsad)", + "Maximum resolution": "Maximal upplösning", + "Medium (Recommended)": "Medel (rekommenderas)", + "Merge PDF": "Sammanfoga PDF", + "Merge PDFs": "Sammanfoga PDF:er", + "Merge duplicate fonts": "Slå ihop dubbla typsnitt", + "Mermaid Error: {{error}}": "Mermaid-fel: {{error}}", + "Metadata copied to clipboard as JSON.": "Metadatan har kopierats till urklipp som JSON.", + "Metadata removed successfully!": "Metadatan har tagits bort!", + "Metadata updated successfully!": "Metadatan har uppdaterats!", + "Millimeters (mm)": "Millimeter (mm)", + "Minimizes window": "Minimerar fönstret", + "Missing Files": "Filer saknas", + "Missing signatureAlgorithm": "signatureAlgorithm saknas", + "Mixed Page Sizes Detected": "Blandade sidstorlekar upptäcktes", + "Mixed Sizes": "Blandade storlekar", + "Mode": "Läge", + "Modified": "Ändrad", + "Modified After Signing (signed part intact)": "Ändrad efter signering (signerad del intakt)", + "More": "Mer", + "Moved": "Flyttad", + "Moved \"{{value}}\"": "Flyttade \"{{value}}\"", + "Multi-line": "Flera rader", + "Must be a positive integer": "Måste vara ett positivt heltal", + "Must be a positive number": "Måste vara ett positivt tal", + "N must be at least 1.": "N måste vara minst 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up-PDF:en har skapats!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Nätverksfel: Det gick inte att ansluta till URL:en. Kontrollera att URL:en är korrekt och att servern tillåter CORS-förfrågningar.", + "Network error: {{error}}": "Nätverksfel: {{error}}", + "Next page": "Nästa sida", + "No Area Selected": "Inget område valt", + "No Attachments": "Inga bilagor", + "No Changes": "Inga ändringar", + "No Crop Area": "Inget beskärningsområde", + "No File": "Ingen fil", + "No Files": "Inga filer", + "No Images Found": "Inga bilder hittades", + "No PDF Files": "Inga PDF-filer", + "No PDF document loaded": "Inget PDF-dokument inläst", + "No PDF document loaded.": "Inget PDF-dokument inläst.", + "No PDF file loaded.": "Ingen PDF-fil inläst.", + "No PDF files could be decrypted. The password may be incorrect.": "Inga PDF-filer kunde dekrypteras. Lösenordet kan vara fel.", + "No PDF files could be linearized.": "Inga PDF-filer kunde linjäriseras.", + "No PDFs could be processed.": "Inga PDF-filer kunde bearbetas.", + "No Pages": "Inga sidor", + "No Selection": "Inget urval", + "No Signatures Found": "Inga signaturer hittades", + "No Tables Found": "Inga tabeller hittades", + "No Text": "Ingen text", + "No URL configured": "Ingen URL konfigurerad", + "No attachments found in this PDF.": "Inga bilagor hittades i den här PDF-filen.", + "No attachments selected for removal.": "Inga bilagor valda för borttagning.", + "No blank pages detected in this PDF.": "Inga tomma sidor hittades i den här PDF-filen.", + "No bookmarks found at the selected level.": "Inga bokmärken hittades på den valda nivån.", + "No bookmarks to delete.": "Inga bokmärken att ta bort.", + "No bookmarks to export!": "Inga bokmärken att exportera!", + "No certificate found in PEM file": "Inget certifikat hittades i PEM-filen", + "No certificate found in PFX file": "Inget certifikat hittades i PFX-filen", + "No certificates found in signature": "Inga certifikat hittades i signaturen", + "No changes match the current filter.": "Inga ändringar matchar det aktuella filtret.", + "No configurable settings for this node.": "Inga konfigurerbara inställningar för den här noden.", + "No differences detected on this page.": "Inga skillnader hittades på den här sidan.", + "No embedded images were found in the selected PDF(s).": "Inga inbäddade bilder hittades i de valda PDF-filerna.", + "No existing bookmarks found in this PDF.": "Inga befintliga bokmärken hittades i den här PDF-filen.", + "No items were selected for removal or none were found in the PDF.": "Inga objekt valdes för borttagning, eller så hittades inga i PDF-filen.", + "No page pairs to export.": "Inga sidpar att exportera.", + "No pages found. Please create a blank PDF or upload one.": "Inga sidor hittades. Skapa en tom PDF eller ladda upp en.", + "No pages selected for removal.": "Inga sidor valda för borttagning.", + "No pages were selected for splitting.": "Inga sidor valdes för delning.", + "No paired page for this side.": "Ingen sidmotsvarighet för den här sidan.", + "No private key found in PEM file": "Ingen privat nyckel hittades i PEM-filen", + "No private key found in PFX file": "Ingen privat nyckel hittades i PFX-filen", + "No tables were detected in this PDF.": "Inga tabeller upptäcktes i den här PDF-filen.", + "No valid page numbers found.": "Inga giltiga sidnummer hittades.", + "No valid pages to save.": "Inga giltiga sidor att spara.", + "No worker": "Ingen worker", + "Noise": "Brus", + "None": "Ingen", + "None of the files could be compressed: {{join}}.": "Ingen av filerna kunde komprimeras: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "Inte tillräckligt många filer", + "Not a PDF": "Inte en PDF", + "Not connected": "Inte ansluten", + "Not in trust chain": "Inte i förtroendekedjan", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Obs: Utan ett separat ägarlösenord har PDF-filen inga användningsbegränsningar.", + "Number Format": "Talformat", + "Number of Pages": "Antal sidor", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR avbröts innan någon sida hade bearbetats", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR-igenkänningen översteg tidsgränsen efter {{timeoutMs}} ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODG-filer", + "ODG to PDF": "ODG till PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Av (standard): naturlig numrering 1–N. På: varje fils ursprungliga sidetiketter bevaras (kan ge dubbla etiketter).", + "One PDF per page": "En PDF per sida", + "One PDF per range": "En PDF per intervall", + "Only a substitute font was available": "Endast ett ersättningstypsnitt fanns tillgängligt", + "Only where it does not change how the image looks.": "Bara där det inte ändrar hur bilden ser ut.", + "Opacity": "Opacitet", + "Open URL": "Öppna URL", + "Opens incognito window": "Öppnar inkognitofönster", + "Opens new tab": "Öppnar ny flik", + "Opens new window": "Öppnar nytt fönster", + "Operation Failed": "Åtgärden misslyckades", + "Operation resulted in an empty file.": "Åtgärden gav en tom fil.", + "Optimize PDF for fast web viewing": "Optimera PDF för snabb webbvisning", + "Optimizing PDFs for web view (linearizing)...": "Optimerar PDF-filer för webbvisning (linjäriserar)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Optimerar {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Alternativ (ett per rad eller kommaseparerade)", + "Orientation": "Orientering", + "Outline": "Kontur", + "Output": "Utdata", + "Overlay": "Överlägg", + "Overlay or underlay pages from one PDF onto another": "Lägg sidor från en PDF över eller under en annan", + "Owner Password": "Ägarlösenord", + "Owner Password Required": "Ägarlösenord krävs", + "PDF": "PDF", + "PDF Files": "PDF-filer", + "PDF Input": "PDF-inmatning", + "PDF Layers": "PDF-lager", + "PDF Metadata": "PDF-metadata", + "PDF Producer": "PDF-producent", + "PDF converted to CSV successfully!": "PDF-filen har konverterats till CSV!", + "PDF converted to SVG successfully!": "PDF-filen har konverterats till SVG!", + "PDF converted to greyscale successfully!": "PDF-filen har konverterats till gråskala!", + "PDF created successfully!": "PDF-filen har skapats!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF-filen har dekrypterats! All kryptering och alla begränsningar har tagits bort.", + "PDF decrypted successfully! Your download has started.": "PDF-filen har dekrypterats! Nedladdningen har startat.", + "PDF downloaded successfully.": "PDF-filen har laddats ned.", + "PDF encrypted successfully with 256-bit AES!": "PDF-filen har krypterats med 256-bitars AES!", + "PDF has been sanitized and downloaded.": "PDF-filen har sanerats och laddats ned.", + "PDF has no pages": "PDF-filen har inga sidor", + "PDF organized successfully!": "PDF-filen har organiserats!", + "PDF permissions changed successfully!": "PDF-behörigheterna har ändrats!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF-läsare tillhandahåller själva de 14 standardtypsnitten för PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF-begränsningarna har tagits bort! Filen går nu att redigera och skriva ut fritt.", + "PDF saved successfully!": "PDF-filen har sparats!", + "PDF split successfully!": "PDF-filen har delats!", + "PDF to CSV": "PDF till CSV", + "PDF to DOCX": "PDF till DOCX", + "PDF to Excel/CSV": "PDF till Excel/CSV", + "PDF to Images": "PDF till bilder", + "PDF to Images (High Quality)": "PDF till bilder (hög kvalitet)", + "PDF to JSON": "PDF till JSON", + "PDF to Markdown": "PDF till Markdown", + "PDF to PDF/A": "PDF till PDF/A", + "PDF to SVG": "PDF till SVG", + "PDF to Text": "PDF till text", + "PDF to XLSX": "PDF till XLSX", + "PDF with layer changes saved!": "PDF-filen med lagerändringar har sparats!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} har tillämpats.", + "PDF/A Conversion": "PDF/A-konvertering", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (strikt, ingen transparens)", + "PDF/A-2b (Recommended)": "PDF/A-2b (rekommenderas)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (modern, tillåter bilagor)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF-filerna har blandats!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (förlustfri)", + "PUB to PDF": "PUB till PDF", + "Page": "Sida", + "Page #": "Sida #", + "Page Added": "Sida tillagd", + "Page Numbers": "Sidnummer", + "Page Removed": "Sida borttagen", + "Page Size": "Sidstorlek", + "Page X of Y": "Sida X av Y", + "Page background or layout changed": "Sidbakgrund eller layout ändrad", + "Page container not found": "Sidbehållaren hittades inte", + "Page extraction produced an empty PDF.": "Sidextraheringen gav en tom PDF.", + "Page number": "Sidnummer", + "Page numbers added successfully!": "Sidnumren har lagts till!", + "Page sizes standardized successfully!": "Sidstorlekarna har standardiserats!", + "Page {{currentPageNum}} of {{numPages}}": "Sida {{currentPageNum}} av {{numPages}}", + "Page {{num}} / {{numPages}}": "Sida {{num}} / {{numPages}}", + "Page {{n}} ": "Sida {{n}} ", + "Page {{n}} of {{length}}": "Sida {{n}} av {{length}}", + "Page {{n}}:": "Sida {{n}}:", + "Page {{pageNumber}}": "Sida {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Sida {{pageNumber}} finns bara i den första PDF-filen.", + "Page {{pageNumber}} exists only in the second PDF.": "Sida {{pageNumber}} finns bara i den andra PDF-filen.", + "Page {{pageNumber}} of {{totalPages}}": "Sida {{pageNumber}} av {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Sida {{pageNum}} finns inte i den här PDF-filen.", + "Page {{page}}": "Sida {{page}}", + "Page {{page}} attachment": "Bilaga på sida {{page}}", + "Pages": "Sidor", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Sidor (t.ex. 1-3, 5) - Totalt: {{pageCount}}", + "Pages Files": "Pages-filer", + "Pages Per Sheet": "Sidor per ark", + "Pages combined successfully!": "Sidorna har kombinerats!", + "Pages have been divided successfully!": "Sidorna har delats!", + "Pages have been reordered.": "Sidorna har ordnats om.", + "Pages have been reversed successfully!": "Sidordningen har vänts!", + "Pages to PDF": "Pages till PDF", + "Paper Size": "Pappersstorlek", + "Paragraph": "Stycke", + "Parsing XML structure...": "Tolkar XML-struktur...", + "Parsing {{name}}...": "Tolkar {{name}}...", + "Partial Coverage": "Delvis täckning", + "Partial Success": "Delvis lyckades", + "Password": "Lösenord", + "Password Error": "Lösenordsfel", + "Password Needed": "Lösenord behövs", + "Password Required": "Lösenord krävs", + "Password for all files": "Lösenord för alla filer", + "Password for all locked files": "Lösenord för alla låsta filer", + "Password for {{name}}": "Lösenord för {{name}}", + "Password protected": "Lösenordsskyddad", + "Password required for encrypted private key": "Lösenord krävs för krypterad privat nyckel", + "Path Stroke": "Bankontur", + "Please add at least one field before downloading.": "Lägg till minst ett fält innan du laddar ned.", + "Please draw a rectangle on at least one page to select the crop area.": "Rita en rektangel på minst en sida för att välja beskärningsområdet.", + "Please ensure all page numbers in the order are unique.": "Se till att alla sidnummer i ordningen är unika.", + "Please enter a layer name": "Ange ett lagernamn", + "Please enter a name.": "Ange ett namn.", + "Please enter a number between 0 and {{totalPages}}.": "Ange ett tal mellan 0 och {{totalPages}}.", + "Please enter a page order.": "Ange en sidordning.", + "Please enter a password": "Ange ett lösenord", + "Please enter a password for {{i}} or skip it": "Ange ett lösenord för {{i}} eller hoppa över det", + "Please enter a title.": "Ange en titel.", + "Please enter a user password.": "Ange ett användarlösenord.", + "Please enter a valid number of pages (1 or more).": "Ange ett giltigt antal sidor (1 eller fler).", + "Please enter a valid page number between 1 and {{total}}": "Ange ett giltigt sidnummer mellan 1 och {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Ange ett giltigt sidintervall (t.ex. 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Ange sidnummer att extrahera.", + "Please enter positive numbers.": "Ange positiva tal.", + "Please enter some text to convert.": "Ange text att konvertera.", + "Please enter text for the watermark.": "Ange text för vattenstämpeln.", + "Please enter the PDF password.": "Ange PDF-lösenordet.", + "Please load a PDF first.": "Läs in en PDF först.", + "Please select PDF files to create a ZIP archive.": "Välj PDF-filer för att skapa ett ZIP-arkiv.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Välj en certifikatfil av typen .pem, .crt, .cer eller .der.", + "Please select a PDF file.": "Välj en PDF-fil.", + "Please select a valid PDF file.": "Välj en giltig PDF-fil.", + "Please select an area on at least one page to crop.": "Välj ett område på minst en sida att beskära.", + "Please select an area to crop first.": "Välj först ett område att beskära.", + "Please select an area to crop.": "Välj ett område att beskära.", + "Please select an image file for the watermark.": "Välj en bildfil för vattenstämpeln.", + "Please select at least one BMP file.": "Välj minst en BMP-fil.", + "Please select at least one CSV file.": "Välj minst en CSV-fil.", + "Please select at least one Excel file.": "Välj minst en Excel-fil.", + "Please select at least one HEIC file.": "Välj minst en HEIC-fil.", + "Please select at least one JPG file.": "Välj minst en JPG-fil.", + "Please select at least one JPG or JPEG2000 image.": "Välj minst en JPG- eller JPEG2000-bild.", + "Please select at least one ODT file.": "Välj minst en ODT-fil.", + "Please select at least one PDF file.": "Välj minst en PDF-fil.", + "Please select at least one PowerPoint file.": "Välj minst en PowerPoint-fil.", + "Please select at least one RTF file.": "Välj minst en RTF-fil.", + "Please select at least one SVG file.": "Välj minst en SVG-fil.", + "Please select at least one TIFF file.": "Välj minst en TIFF-fil.", + "Please select at least one Word document.": "Välj minst ett Word-dokument.", + "Please select at least one file to attach.": "Välj minst en fil att bifoga.", + "Please select at least one image file.": "Välj minst en bildfil.", + "Please select at least one text file.": "Välj minst en textfil.", + "Please select at least one {{FILETYPE_NAME}} file.": "Välj minst en {{FILETYPE_NAME}}-fil.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Välj minst en {{TOOL_NAME}}-fil (.eml eller .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Välj minst en {{TOOL_NAME}}-fil.", + "Please select even or odd pages.": "Välj jämna eller udda sidor.", + "Please select one or more PDF files.": "Välj en eller flera PDF-filer.", + "Please select pages to delete.": "Välj sidor att ta bort.", + "Please select pages to duplicate.": "Välj sidor att duplicera.", + "Please select pages to mark for splitting.": "Välj sidor att markera för delning.", + "Please select pages to rotate.": "Välj sidor att rotera.", + "Please specify a page range for page-level attachments.": "Ange ett sidintervall för bilagor på sidnivå.", + "Please upload PDF files.": "Ladda upp PDF-filer.", + "Please upload PDFs first.": "Ladda upp PDF-filer först.", + "Please upload a .docx file first.": "Ladda upp en .docx-fil först.", + "Please upload a PDF file first.": "Ladda upp en PDF-fil först.", + "Please upload a PDF file.": "Ladda upp en PDF-fil.", + "Please upload a PDF first.": "Ladda upp en PDF först.", + "Please upload a valid PDF file.": "Ladda upp en giltig PDF-fil.", + "Please upload at least one PDF file.": "Ladda upp minst en PDF-fil.", + "Please upload at least two PDF files to alternate and mix.": "Ladda upp minst två PDF-filer för att varva och blanda.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Ladda upp både en bas-PDF och en överlägg-/underlägg-PDF.", + "Please upload valid PDF files.": "Ladda upp giltiga PDF-filer.", + "Please use the Download button in the PDF viewer toolbar above.": "Använd nedladdningsknappen i PDF-visarens verktygsfält ovan.", + "Please wait for the PDF viewer to load.": "Vänta tills PDF-visaren har lästs in.", + "Please wait for the form to finish loading.": "Vänta tills formuläret har lästs in.", + "Portrait": "Stående", + "Position": "Position", + "Post-processing for transparency compliance...": "Efterbearbetning för transparenskompatibilitet...", + "Posterize": "Postera", + "Posterizing PDF...": "Posterar PDF...", + "PowerPoint to PDF": "PowerPoint till PDF", + "Pre Flatten": "Förplatta", + "Pre-flattening PDF...": "Förplattar PDF...", + "Prefer JPEG 2000 for photos": "Föredra JPEG 2000 för foton", + "Preparing PDF export...": "Förbereder PDF-export...", + "Preparing conversion...": "Förbereder konvertering...", + "Preparing download...": "Förbereder nedladdning...", + "Preparing preview...": "Förbereder förhandsvisning...", + "Presentations": "Presentationer", + "Preserve PDF/A": "Bevara PDF/A", + "Preview": "Förhandsvisning", + "Preview Error": "Förhandsvisningsfel", + "Preview Text": "Förhandsgranska text", + "Previous page": "Föregående sida", + "Print Form": "Skriv ut formulär", + "Private data that editing apps store inside the PDF.": "Privata data som redigeringsprogram lagrar i PDF-filen.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF-filer har bearbetats.", + "Processing Complete": "Bearbetningen är klar", + "Processing Dpi": "Bearbetnings-DPI", + "Processing Failed": "Bearbetningen misslyckades", + "Processing PDF permissions...": "Bearbetar PDF-behörigheter...", + "Processing attachments...": "Bearbetar bilagor...", + "Processing failed for {{name}}.": "Bearbetningen misslyckades för {{name}}.", + "Processing file {{n}} of {{length}}...": "Bearbetar fil {{n}} av {{length}}...", + "Processing images...": "Bearbetar bilder...", + "Processing multiple PDFs...": "Bearbetar flera PDF-filer...", + "Processing page {{i}} of {{numPages}}": "Bearbetar sida {{i}} av {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Bearbetar sida {{i}} av {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Bearbetar sida {{n}} av {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Bearbetar sida {{pageNum}} av {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Bearbetar sida {{pageNum}} av {{totalPages}}...", + "Processing produced an empty file.": "Bearbetningen gav en tom fil.", + "Processing resulted in an empty file.": "Bearbetningen gav en tom fil.", + "Processing sheet {{n}}...": "Bearbetar ark {{n}}...", + "Processing {{name}}...": "Bearbetar {{name}}...", + "Processing {{nodeName}}...": "Bearbetar {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Bearbetar {{n}}/{{length}}: {{name}}...", + "Processing...": "Bearbetar...", + "Producer": "Producent", + "Publisher Files": "Publisher-filer", + "Purple": "Lila", + "PyMuPDF (Document Processing)": "PyMuPDF (dokumentbearbetning)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF är inte konfigurerat. Konfigurera det i de avancerade inställningarna.", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDF-modulen exporterade inte den förväntade klassen PyMuPDF.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF skapade en tom dekrypterad fil.", + "PyMuPDF: not configured.": "PyMuPDF: inte konfigurerat.", + "QR Code": "QR-kod", + "Quality": "Kvalitet", + "Quits application (cannot be overridden)": "Avslutar programmet (kan inte åsidosättas)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1-signaturen kan inte verifieras mot signerarens publika nyckel", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS-signaturen kan inte verifieras mot signerarens publika nyckel", + "Rasterization Complete": "Rastreringen är klar", + "Rasterization Partial": "Delvis rastrerat", + "Rasterize": "Rastrera", + "Rasterize Dpi": "Rastrerings-DPI", + "Rasterize pages to images": "Rastrera sidor till bilder", + "Rasterize quality": "Rastreringskvalitet", + "Rasterize resolution (DPI)": "Rastreringsupplösning (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Rastrerade {{completed}} PDF(er), {{failed}} misslyckades.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Rastrerar {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Rastrerar {{name}}...", + "Rasterizing...": "Rastrerar...", + "Rating must be between 0 and 5": "Betyget måste vara mellan 0 och 5", + "Read Only": "Skrivskyddad", + "Reading CSV file...": "Läser CSV-fil...", + "Reading PDF...": "Läser PDF...", + "Reading XML file...": "Läser XML-fil...", + "Reading encrypted PDF...": "Läser krypterad PDF...", + "Reading files...": "Läser filer...", + "Reading layer configuration...": "Läser lagerkonfiguration...", + "Reading {{name}} ({{n}}/{{length}})...": "Läser {{name}} ({{n}}/{{length}})...", + "Ready": "Redo", + "Reason": "Orsak", + "Red": "Röd", + "Redact": "Maskera", + "Redact Mode": "Maskeringsläge", + "Redact text from PDF": "Maskera text i PDF", + "Redaction Failed": "Maskeringen misslyckades", + "Reduce PDF file size": "Minska PDF-filens storlek", + "Reduce color complexity": "Minska färgkomplexiteten", + "Reduces file size by removing color information.": "Minskar filstorleken genom att ta bort färginformation.", + "Reloads page": "Laddar om sidan", + "Remove": "Ta bort", + "Remove All Attachments": "Ta bort alla bilagor", + "Remove Annotations": "Ta bort kommentarer", + "Remove Blank Pages": "Ta bort tomma sidor", + "Remove Embedded Files": "Ta bort inbäddade filer", + "Remove Fonts": "Ta bort typsnitt", + "Remove Javascript": "Ta bort Javascript", + "Remove Layers": "Ta bort lager", + "Remove Links": "Ta bort länkar", + "Remove Mark Info": "Ta bort Mark Info", + "Remove Metadata": "Ta bort metadata", + "Remove PDF password protection": "Ta bort PDF-lösenordsskydd", + "Remove Structure Tree": "Ta bort strukturträd", + "Remove alternate images": "Ta bort alternativa bilder", + "Remove application data": "Ta bort programdata", + "Remove article threads": "Ta bort artikeltrådar", + "Remove attachment": "Ta bort bilaga", + "Remove blank pages automatically": "Ta bort tomma sidor automatiskt", + "Remove document structure tree": "Ta bort dokumentets strukturträd", + "Remove file": "Ta bort fil", + "Remove metadata, scripts, and hidden data": "Ta bort metadata, skript och dold data", + "Remove output intents": "Ta bort output intents", + "Remove page thumbnails": "Ta bort sidminiatyrer", + "Remove specific pages": "Ta bort specifika sidor", + "Remove web capture information": "Ta bort information om webbinfångning", + "Remove {{name}}": "Ta bort {{name}}", + "Removed \"{{beforeText}}\"": "Tog bort \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Tog bort bild ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} tomma sidor har tagits bort!", + "Removing all metadata...": "Tar bort all metadata...", + "Removing annotations...": "Tar bort kommentarer...", + "Removing redacted text from document data...": "Tar bort maskerad text ur dokumentdatan...", + "Removing restrictions...": "Tar bort begränsningar...", + "Removing {{length}} blank page(s)...": "Tar bort {{length}} tomma sidor...", + "Render Error": "Renderingsfel", + "Rendering Page {{num}}...": "Renderar sida {{num}}...", + "Rendering page previews...": "Renderar sidförhandsvisningar...", + "Rendering page previews: {{current}}/{{total}}": "Renderar sidförhandsvisningar: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Renderar sida {{n}} av {{length}}...", + "Rendering preview for page {{pageNum}}...": "Renderar förhandsvisning för sida {{pageNum}}...", + "Reopens closed tab": "Öppnar stängd flik igen", + "Repair": "Reparera", + "Repair Failed": "Reparationen misslyckades", + "Repair corrupted PDF": "Reparera skadad PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Reparerade {{length}} fil(er). Det gick inte att reparera: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Reparerar {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Reparerar {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Ersatte \"{{beforeText}}\" med \"{{afterText}}\"", + "Required": "Obligatoriskt", + "Resamples even when an image is only slightly above the limit.": "Samplas om även när en bild bara ligger något över gränsen.", + "Reset Form": "Återställ formulär", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Återställa och gå tillbaka till filuppladdaren? Alla osparade ändringar går förlorade.", + "Resolution": "Upplösning", + "Retain Page Labels": "Behåll sidetiketter", + "Retry Failed": "Försök igen med de misslyckade", + "Reverse Pages": "Vänd sidordning", + "Reverse page order": "Vänd sidordningen", + "Reversing page order...": "Vänder sidordningen...", + "Reversing {{name}} ({{n}}/{{length}})...": "Vänder {{name}} ({{n}}/{{length}})...", + "Right": "Höger", + "Right edge in points": "Högerkant i punkter", + "Rotate": "Rotera", + "Rotate +90°": "Rotera +90°", + "Rotate all pages": "Rotera alla sidor", + "Rotation": "Rotation", + "Rotation Variance": "Rotationsvarians", + "Rotations applied successfully!": "Rotationerna har tillämpats!", + "Rows": "Rader", + "Run Javascript": "Kör Javascript", + "Running OCR on page {{pageNum}}...": "Kör OCR på sida {{pageNum}}...", + "Running...": "Körs...", + "SVG": "SVG", + "SVG Files": "SVG-filer", + "SVG to PDF": "SVG till PDF", + "Sanitize": "Sanera", + "Sanitized With Warnings": "Sanerad med varningar", + "Sanitizing PDF...": "Sanerar PDF...", + "Saturation": "Mättnad", + "Saved": "Sparad", + "Saving PDF with layer changes...": "Sparar PDF med lagerändringar...", + "Scaling Mode": "Skalningsläge", + "Scanner Effect": "Skannereffekt", + "Scanner effect applied successfully!": "Skannereffekten har tillämpats!", + "Scanning page {{n}} of {{pageCount}}...": "Skannar sida {{n}} av {{pageCount}}...", + "Search Text": "Sök text", + "Search languages...": "Sök språk...", + "Select Font": "Välj typsnitt", + "Select a field to edit properties": "Välj ett fält för att redigera egenskaper", + "Select a field...": "Välj ett fält...", + "Select to add this button to an existing group": "Välj för att lägga till den här knappen i en befintlig grupp", + "Selected Option": "Valt alternativ", + "Self-Signed: Signer Identity Not Verified": "Självsignerad: signerarens identitet är inte verifierad", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Egenhostade OCR-resurser är delvis konfigurerade. Ange {{missing}} tillsammans med de andra URL:erna för Tesseract-resurser.", + "Separator": "Avgränsare", + "Separator Color": "Avgränsarfärg", + "Separator Thickness": "Avgränsartjocklek", + "Sepia": "Sepia", + "Serial Number:": "Serienummer:", + "Set custom destination": "Ange anpassat mål", + "Shapes": "Former", + "Sheet {{n}} {{sideLabel}}": "Ark {{n}} {{sideLabel}}", + "Show": "Visa", + "Show password": "Visa lösenord", + "Show/Hide Field": "Visa/dölj fält", + "Sign Here": "Signera här", + "Signature /Contents is not a single DER object followed by zero padding": "Signaturens /Contents är inte ett enda DER-objekt följt av nollfyllnad", + "Signature Algorithm:": "Signaturalgoritm:", + "Signature Intact: Signer Identity Not Verified": "Signaturen är intakt: signerarens identitet är inte verifierad", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Signaturfält är AcroForm-signaturfält och syns bara i en avancerad PDF-visare.", + "Signature has a missing or malformed /ByteRange": "Signaturen har en saknad eller felaktigt formaterad /ByteRange", + "Signature scheme {{kind}} not implemented": "Signaturschemat {{kind}} är inte implementerat", + "Signature {{n}}": "Signatur {{n}}", + "Signatures": "Signaturer", + "Signed By": "Signerad av", + "Signed On": "Signerad den", + "Signed PDF Not Changed": "Den signerade PDF-filen ändrades inte", + "Signed PDF downloaded successfully!": "Den signerade PDF-filen har laddats ned!", + "Signed PDF saved successfully!": "Den signerade PDF-filen har sparats!", + "Simple (1, 2, 3)": "Enkel (1, 2, 3)", + "Simplify large color profiles": "Förenkla stora färgprofiler", + "Skew Threshold": "Snedhetströskel", + "Skip": "Hoppa över", + "Skip All": "Hoppa över alla", + "Skip Remaining": "Hoppa över resten", + "Skip this file": "Hoppa över den här filen", + "Skipped: {{join}}.": "Överhoppade: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Mindre filer, men bara läsare med stöd för Brotli kan öppna dem, till exempel Firefox, MuPDF 1.26+ och Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Vissa filer hoppades över eftersom de inte är bildfiler som stöds.", + "Some files were skipped. Only BMP files are allowed.": "Vissa filer hoppades över. Endast BMP-filer är tillåtna.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Vissa filer hoppades över. Endast HEIC/HEIF-filer är tillåtna.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Vissa filer hoppades över. Endast JPG-, JPEG-, JP2- och JPX-filer är tillåtna.", + "Some files were skipped. Only PDF files are allowed.": "Vissa filer hoppades över. Endast PDF-filer är tillåtna.", + "Some files were skipped. Only PNG images are allowed.": "Vissa filer hoppades över. Endast PNG-bilder är tillåtna.", + "Some files were skipped. Only SVG graphics are allowed.": "Vissa filer hoppades över. Endast SVG-grafik är tillåten.", + "Some files were skipped. Only TIFF files are allowed.": "Vissa filer hoppades över. Endast TIFF-filer är tillåtna.", + "Some files were skipped. Only WebP images are allowed.": "Vissa filer hoppades över. Endast WebP-bilder är tillåtna.", + "Some files were skipped. Only supported image formats are allowed.": "Vissa filer hoppades över. Endast bildformat som stöds är tillåtna.", + "Some files were skipped. Only text files are allowed.": "Vissa filer hoppades över. Endast textfiler är tillåtna.", + "Some pages could not be processed. Please try again.": "Vissa sidor kunde inte bearbetas. Försök igen.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Vissa maskeringsmarkeringar kunde inte tillämpas, så filen laddades inte ned. Tillämpa eller ta bort dem i redigeraren och försök igen.", + "Spacing": "Avstånd", + "Split PDF": "Dela PDF", + "Split by Bookmarks": "Dela efter bokmärken", + "Split pages into tile grid for poster printing": "Dela sidor i ett rutnät av delar för affischutskrift", + "Split pages vertically or horizontally": "Dela sidor vertikalt eller horisontellt", + "Splitting PDF pages...": "Delar PDF-sidor...", + "Splitting PDF...": "Delar PDF...", + "Spreadsheets": "Kalkylblad", + "Standard (192 DPI)": "Standard (192 DPI)", + "Standard Size": "Standardstorlek", + "Standardize all pages to a target size": "Standardisera alla sidor till en målstorlek", + "Standardizing pages...": "Standardiserar sidor...", + "Stitch all pages into one continuous page": "Foga ihop alla sidor till en enda sammanhängande sida", + "Straighten skewed PDF pages": "Räta upp sneda PDF-sidor", + "Strip all annotations": "Ta bort alla kommentarer", + "Style": "Stil", + "Style Changed": "Stilen ändrad", + "Style changed ({{length}} regions)": "Stilen ändrad ({{length}} områden)", + "Subject": "Ämne", + "Subset embedded fonts": "Delmängd av inbäddade typsnitt", + "Success": "Klart", + "Success!": "Klart!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} CSV-fil(er) har konverterats till PDF.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} Excel-fil(er) har konverterats till PDF.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} ODT-fil(er) har konverterats till PDF.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF(er) har konverterats till DOCX.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF(er) har konverterats till Markdown.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF(er) har konverterats till {{level}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} PSD-filer har konverterats till en enda PDF.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} PowerPoint-fil(er) har konverterats till PDF.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} RTF-fil(er) har konverterats till PDF.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} Word-dokument har konverterats till PDF.", + "Successfully converted {{length}} files to PDF.": "{{length}} filer har konverterats till PDF.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} {{TOOL_NAME}}-fil(er) har konverterats till PDF.", + "Successfully converted {{name}} to DOCX.": "{{name}} har konverterats till DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} har konverterats till Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} har konverterats till PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} har konverterats till {{level}}.", + "Successfully extracted PDF for AI/LLM use.": "PDF-filen har extraherats för AI/LLM-bruk.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF(er) har extraherats för AI/LLM-bruk.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF-filen har rastrerats med {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF(er) har rastrerats med {{dpi}} DPI.", + "Supported: CBZ, CBR": "Stöds: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Stöds: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Stöds: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Stöds: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Stöds: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Stöds: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Stöds: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Stöds: XPS, OXPS", + "Switches apps": "Byter program", + "Switches tabs": "Byter flik", + "Table of Contents": "Innehållsförteckning", + "Table {{n}} (Page {{page}})": "Tabell {{n}} (sida {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Målfält", + "Target Kilobytes": "Mål i kilobyte", + "Target Not Reached": "Målet nåddes inte", + "Target Size": "Målstorlek", + "Technical Details": "Tekniska detaljer", + "Temperature": "Temperatur", + "Template \"{{name}}\" loaded.": "Mallen \"{{name}}\" har lästs in.", + "Template \"{{name}}\" saved.": "Mallen \"{{name}}\" har sparats.", + "Text": "Text", + "Text Color": "Textfärg", + "Text Files": "Textfiler", + "Text color changed successfully!": "Textfärgen har ändrats!", + "Text converted to PDF successfully!": "Texten har konverterats till PDF!", + "Text extracted successfully!": "Texten har extraherats!", + "Text to PDF": "Text till PDF", + "That password did not open any of the remaining files.": "Det lösenordet öppnade inga av de återstående filerna.", + "The PDF file(s) do not contain any attachments to extract.": "PDF-filen/filerna innehåller inga bilagor att extrahera.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF-filen har {{totalPages}} sidor, vilket inte är jämnt delbart med {{nValue}}. Den sista PDF-filen får {{remainder}} sida/sidor.", + "The PDF might be corrupted or password protected.": "PDF-filen kan vara skadad eller lösenordsskyddad.", + "The PDF might be corrupted or password-protected.": "PDF-filen kan vara skadad eller lösenordsskyddad.", + "The PDF might be corrupted.": "PDF-filen kan vara skadad.", + "The PDF viewer is still initializing.": "PDF-visaren initieras fortfarande.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF-filen laddades ned, men de här stegen kunde inte slutföras: {{join}}. Innehållet de gäller kan fortfarande finnas kvar i filen.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL:en returnerade en oväntad innehållstyp: {{contentType}}. Förväntade en JavaScript-fil.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Byten som utesluts av /ByteRange är inte exakt en hex-kodad signatur", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Byten som utesluts av /ByteRange är inte /Contents för den här signaturen", + "The compression engine returned an unreadable result.": "Komprimeringsmotorn returnerade ett oläsligt resultat.", + "The compression engine stopped unexpectedly.": "Komprimeringsmotorn stoppades oväntat.", + "The current password you entered is incorrect. Please try again.": "Det nuvarande lösenordet du angav är fel. Försök igen.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Följande fältnamn finns redan i den uppladdade PDF-filen: {{conflictList}}. Byt namn på de här fälten innan du laddar ned.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Följande fältnamn används mer än en gång: {{duplicateList}}. Byt namn på de här fälten så att de är unika innan du laddar ned.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Antalet angivna sidor ({{length}}) stämmer inte med det aktuella antalet sidor i dokumentet ({{currentGridCount}}). Ange en fullständig ordning för alla sidor.", + "The password you entered is incorrect. Please try again.": "Lösenordet du angav är fel. Försök igen.", + "The password you entered is wrong or the file is corrupted.": "Lösenordet du angav är fel eller så är filen skadad.", + "The provided file could not be loaded as an image. It may be corrupted.": "Den angivna filen kunde inte läsas in som en bild. Den kan vara skadad.", + "The requested OCR language is not available: {{unavailableText}}.": "Det begärda OCR-språket är inte tillgängligt: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Den angivna sidordningen är ofullständig eller innehåller ogiltiga sidnummer. Ange en ny position för varje ursprunglig sida.", + "These files are not valid PDFs, so they were not added: {{names}}.": "De här filerna är inte giltiga PDF-filer och lades därför inte till: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "De här filerna är lösenordsskyddade: {{names}}. Ange deras lösenord på filkorten eller ta bort dem och komprimera sedan igen.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Den här BentoPDF-versionen innehåller bara OCR-data för {{availableText}}.", + "This PDF does not contain any digital signatures.": "Den här PDF-filen innehåller inga digitala signaturer.", + "This PDF has no layers (OCG).": "Den här PDF-filen har inga lager (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Den här PDF-filen är lösenordsskyddad. Ange det nuvarande lösenordet för att fortsätta.", + "This document contains pages with different dimensions:": "Det här dokumentet innehåller sidor med olika mått:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dokumentet har 1 maskeringsmarkering som inte har tillämpats än. Tills en markering tillämpas finns innehållet under den kvar i filen. Vill du tillämpa alla markeringar och ladda ned?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Dokumentet har {{count}} maskeringsmarkeringar som inte har tillämpats än. Tills en markering tillämpas finns innehållet under den kvar i filen. Vill du tillämpa alla markeringar och ladda ned?", + "This feature requires {{name}} to be configured.": "Den här funktionen kräver att {{name}} har konfigurerats.", + "This file is not a valid PDF.": "Den här filen är inte en giltig PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Den här modulen är licensierad under AGPL-3.0. Genom att konfigurera den godkänner du dess licensvillkor.", + "This tool has been disabled": "Det här verktyget har inaktiverats", + "This tool is not available in your deployment. Contact your administrator for more information.": "Det här verktyget är inte tillgängligt i din installation. Kontakta administratören för mer information.", + "Threshold": "Tröskel", + "Tile": "Platta", + "Tile Gap X": "Plattavstånd X", + "Tile Gap Y": "Plattavstånd Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Tidsstämpel", + "Timestamp Failed": "Tidsstämplingen misslyckades", + "Tint": "Nyans", + "Title": "Titel", + "To actually fill or change the options, use our PDF Form Filler tool.": "Om du vill fylla i eller ändra alternativen använder du vårt verktyg PDF-formulärifyllare.", + "Toggle": "Växla", + "Toggle style": "Växla stil", + "Toggle sync scroll": "Växla synkroniserad rullning", + "Tool Unavailable": "Verktyget är inte tillgängligt", + "Tooltip / Help Text": "Verktygstips / hjälptext", + "Top": "Överkant", + "Top Center": "Uppe i mitten", + "Top Left": "Uppe till vänster", + "Top Right": "Uppe till höger", + "Top edge in points": "Överkant i punkter", + "Total Pages": "Totalt antal sidor", + "Transparent Background": "Transparent bakgrund", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Provar JPEG 2000 mot JPEG för varje bild och behåller den mindre.", + "Trim margins from all pages": "Beskär marginaler från alla sidor", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Förtroendeverifiering: {{trustVerified}}/{{length}} signaturer verifierade mot eget certifikat", + "Trusted": "Betrodd", + "Trusted certificate loaded": "Betrott certifikat inläst", + "Tsa Url": "TSA-URL", + "Turns off quality, resolution and every other lossy image step.": "Stänger av kvalitet, upplösning och alla andra förlustbringande bildsteg.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL:en måste börja med http:// eller https://", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Det gick inte att dekryptera PDF-filen med det angivna lösenordet.", + "Unable to repair any of the uploaded PDF files.": "Det gick inte att reparera någon av de uppladdade PDF-filerna.", + "Unembed standard fonts": "Ta bort inbäddning av standardtypsnitt", + "Unembed standard-font look-alikes": "Ta bort inbäddning av typsnitt som liknar standardtypsnitt", + "Unexpected delimiter in content stream": "Oväntad avgränsare i innehållsström", + "Unexpected reply from the engine.": "Oväntat svar från motorn.", + "Uniform": "Enhetlig", + "Unique Page Sizes": "Unika sidstorlekar", + "Unknown": "Okänd", + "Unknown error": "Okänt fel", + "Unknown error occurred in worker.": "Ett okänt fel uppstod i workern.", + "Unknown error occurred.": "Ett okänt fel uppstod.", + "Unlock": "Lås upp", + "Unlock All": "Lås upp alla", + "Unlock Remaining ({{remaining}})": "Lås upp återstående ({{remaining}})", + "Unlocked": "Upplåst", + "Unlocked {{unlocked}} of {{length}} files.": "{{unlocked}} av {{length}} filer har låsts upp.", + "Unlocking...": "Låser upp...", + "Unresolved optional content reference": "Olöst valfritt innehållsreferens", + "Unsupported ECDSA curve in signer certificate": "ECDSA-kurvan i signerarcertifikatet stöds inte", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Bilden stöds inte. Använd en PNG eller JPG för vattenstämpeln.", + "Unsupported digest OID {{digestOid}}": "Sammandrags-OID {{digestOid}} stöds inte", + "Unsupported file type: .{{ext}}": "Filtypen stöds inte: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Signaturalgoritm-OID {{oid}} stöds inte", + "Unterminated array or dictionary in content stream": "Oavslutad array eller ordlista i innehållsström", + "Unterminated hex string in content stream": "Oavslutad hex-sträng i innehållsström", + "Unterminated inline image in content stream": "Oavslutad inbäddad bild i innehållsström", + "Unterminated string in content stream": "Oavslutad sträng i innehållsström", + "Unverified: Unsupported Signature Algorithm": "Overifierad: signaturalgoritmen stöds inte", + "Updating metadata...": "Uppdaterar metadata...", + "Upload Certificate": "Ladda upp certifikat", + "Upload Comics": "Ladda upp serier", + "Upload Documents": "Ladda upp dokument", + "Upload EPUB Files": "Ladda upp EPUB-filer", + "Upload Email Files": "Ladda upp e-postfiler", + "Upload FB2 Files": "Ladda upp FB2-filer", + "Upload Images": "Ladda upp bilder", + "Upload JSON Files": "Ladda upp JSON-filer", + "Upload MOBI Files": "Ladda upp MOBI-filer", + "Upload Markdown Files": "Ladda upp Markdown-filer", + "Upload ODG Files": "Ladda upp ODG-filer", + "Upload PDFs": "Ladda upp PDF-filer", + "Upload PUB Files": "Ladda upp PUB-filer", + "Upload Pages Files": "Ladda upp Pages-filer", + "Upload Presentations": "Ladda upp presentationer", + "Upload SVG Files": "Ladda upp SVG-filer", + "Upload Spreadsheets": "Ladda upp kalkylblad", + "Upload Text Files": "Ladda upp textfiler", + "Upload Visio Files": "Ladda upp Visio-filer", + "Upload WPD Files": "Ladda upp WPD-filer", + "Upload WPS Files": "Ladda upp WPS-filer", + "Upload XML Files": "Ladda upp XML-filer", + "Upload XPS Files": "Ladda upp XPS-filer", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Ladda upp en PDF och klicka på \"Skapa förhandsvisning\" för att se broschyrens layout", + "Upload images and convert to PDF": "Ladda upp bilder och konvertera till PDF", + "Upload one or more PDF files": "Ladda upp en eller flera PDF-filer", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Versaler A-Z, siffrorna 0-9 samt - . $ / + % MELLANSLAG", + "Use same password for all files": "Använd samma lösenord för alla filer", + "User Password": "Användarlösenord", + "VSD to PDF": "VSD till PDF", + "Valid From": "Giltig från", + "Valid Signature": "Giltig signatur", + "Valid Until": "Giltig till", + "Validating {{n}} of {{length}}: {{name}}": "Validerar {{n}} av {{length}}: {{name}}", + "Validating...": "Validerar...", + "Value": "Värde", + "Value (e.g., Marketing)": "Värde (t.ex. Marknadsföring)", + "Vertical": "Vertikal", + "Viewer not ready": "Visaren är inte redo", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Visaren är inte redo. Ladda upp en PDF och vänta tills den har lästs in.", + "Visibility": "Synlighet", + "Visio Files": "Visio-filer", + "WPD to PDF": "WPD till PDF", + "WPS Files": "WPS-filer", + "WPS to PDF": "WPS till PDF", + "Watermark": "Vattenstämpel", + "Watermark added successfully!": "Vattenstämpeln har lagts till!", + "Web Crypto API not available in this context": "Web Crypto API är inte tillgängligt i den här kontexten", + "Web Crypto import/verify failed: {{error}}": "Web Crypto-import/verifiering misslyckades: {{error}}", + "WebP": "WebP", + "Whitelist": "Vitlista", + "Width ({{unit}})": "Bredd ({{unit}})", + "Word": "Word", + "Word Documents": "Word-dokument", + "Word to PDF": "Word till PDF", + "WordPerfect Files": "WordPerfect-filer", + "Worker crashed": "Workern kraschade", + "Worker error occurred. Check console for details.": "Ett workerfel uppstod. Se konsolen för detaljer.", + "Workflow completed": "Arbetsflödet är klart", + "Wrong password": "Fel lösenord", + "Wrong password for: {{join}}": "Fel lösenord för: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Fel lösenord eller så gick det inte att dekryptera \"{{name}}\".", + "X Position": "X-position", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XML-filer", + "XML to PDF": "XML till PDF", + "XMP Metadata": "XMP-metadata", + "XPS Files": "XPS-filer", + "XPS to PDF": "XPS till PDF", + "Y Position": "Y-position", + "Year must be between 1900 and 2100": "Året måste vara mellan 1900 och 2100", + "Yellow": "Gul", + "Yellowish": "Gulaktig", + "You cannot delete the last page of the document.": "Du kan inte ta bort dokumentets sista sida.", + "Your PDF has been cropped and the download has started.": "PDF-filen har beskurits och nedladdningen har startat.", + "Your PDF has been downloaded successfully.": "PDF-filen har laddats ned.", + "Your PDF has been posterized.": "PDF-filen har posterats.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Dina maskeringar har tillämpats på sidorna, men den här filen är krypterad, så BentoPDF kan inte också ta bort kopior av den maskerade texten från dess egenskaper, bokmärken och bilagor. För en fullständig rensning maskerar du en okrypterad kopia och lägger till ett lösenord efteråt med Skydda PDF. Ladda ned ändå?", + "Your workflow needs at least one input node and one output node to run.": "Ditt arbetsflöde behöver minst en indatanod och en utdatanod för att kunna köras.", + "ZIP archive created successfully!": "ZIP-arkivet har skapats!", + "Zoom(%)": "Zoom (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "t.ex. dd/mm/åååå TT:MM:ss", + "form": "formulär", + "https://example.com": "https://example.com", + "signature found": "signatur hittades", + "signatures found": "signaturer hittades", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} nod", + "{{count}} nodes": "{{count}} noder", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 sida", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} sidor", + "{{length}} Files Need a Password": "{{length}} filer behöver lösenord", + "{{length}} PDF file(s) selected": "{{length}} PDF-fil(er) valda", + "{{length}} PDF files selected": "{{length}} PDF-filer valda", + "{{length}} attachment(s) extracted successfully!": "{{length}} bilaga/bilagor har extraherats!", + "{{length}} file • {{totalPages}} total pages": "{{length}} fil • {{totalPages}} sidor totalt", + "{{length}} file(s) attached successfully.": "{{length}} fil(er) har bifogats.", + "{{length}} files • {{totalPages}} total pages": "{{length}} filer • {{totalPages}} sidor totalt", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Den var lösenordsskyddad, så den komprimerade kopian har inget lösenord. Använd Skydda PDF för att lägga till ett igen.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} sidor)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} är digitalt signerad och lämnades därför som den är. Komprimering skulle bryta signaturen. Om du vill komprimera den ändå aktiverar du Åsidosätt innehållsskydd under Anpassade inställningar. Då tas dess signaturer bort.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} är inte en giltig PDF och lades därför inte till.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} är lösenordsskyddad. Ange dess lösenord på filkortet och komprimera sedan igen.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (s.{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Det gick inte att läsa in sidantalet", + "{{size}} • Loading pages...": "{{size}} • Läser in sidor...", + "{{size}} • Loading...": "{{size}} • Läser in...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} sidor", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} sidor", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} sidor", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} sidor", + "{{size}} • {{value}} pages": "{{size}} • {{value}} sidor", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF(er) har dekrypterats.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF(er) har linjäriserats.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} sidor → {{numSheets}} utdataark", + "{{validCount}} valid": "{{validCount}} giltiga", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 sida", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} sidor" +} diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index af5fc4ed..90fa9ade 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -5,11 +5,12 @@ "contact": "İletişim", "licensing": "Lisanslama", "allTools": "Tüm Araçlar", - "docs": "Docs", + "docs": "Belgeler", "openMainMenu": "Ana menüyü aç", "language": "Dil", "searchLanguage": "Dil ara…", - "noLanguagesFound": "Dil bulunamadı" + "noLanguagesFound": "Dil bulunamadı", + "breadcrumb": "Gezinti yolu" }, "donation": { "message": "BentoPDF'i seviyor musunuz? Ücretsiz ve açık kaynaklı kalmasına yardımcı olun!", @@ -17,7 +18,7 @@ }, "hero": { "title": " ", - "pdfToolkit": "PDF Toolkit", + "pdfToolkit": "PDF Araç Seti", "builtForPrivacy": "gizlilik için tasarlandı", "noSignups": "Kayıt Gerekmez", "unlimitedUse": "Sınırsız Kullanım", @@ -236,6 +237,10 @@ "aboutUs": "Hakkımızda", "faqLink": "SSS", "contactUs": "İletişim", + "tools": "Araçlar", + "pdfConverter": "PDF dönüştürücü", + "pdfSecurity": "PDF güvenliği", + "mergeSplit": "PDF birleştirme ve bölme", "legal": "Yasal", "termsAndConditions": "Kullanım Koşulları", "privacyPolicy": "Gizlilik Politikası", diff --git a/public/locales/tr/tools.json b/public/locales/tr/tools.json index db74f17e..266bef34 100644 --- a/public/locales/tr/tools.json +++ b/public/locales/tr/tools.json @@ -27,7 +27,22 @@ "name": "PDF Birleştir", "subtitle": "Birden fazla PDF'yi tek bir dosyada birleştirin. Yer imlerini korur.", "retainPageLabels": "Her dosyanın orijinal sayfa etiketlerini koru", - "retainPageLabelsHint": "Kapalı (varsayılan): birleştirilmiş PDF doğal 1–N sayfa numaralandırmasını kullanır. Açık: her dosyanın orijinal sayfa etiketleri korunur (yinelenen etiketler oluşabilir)." + "retainPageLabelsHint": "Kapalı (varsayılan): birleştirilmiş PDF doğal 1–N sayfa numaralandırmasını kullanır. Açık: her dosyanın orijinal sayfa etiketleri korunur (yinelenen etiketler oluşabilir).", + "removeDuplicateFonts": "Yinelenen yazı tiplerini kaldır", + "alert": { + "thumbnailError": "Sayfa küçük resimleri oluşturulamadı", + "noSelection": "Birleştirmek için dosya veya sayfa seçilmedi.", + "mergeSuccess": "PDF'ler başarıyla birleştirildi!", + "mergeFailed": "PDF'ler birleştirilemedi.", + "mergeError": "PDF'ler birleştirilemedi. Lütfen tüm dosyaların geçerli olduğunu ve parola korumalı olmadığını kontrol edin.", + "workerError": "Birleştirme işleminde beklenmeyen bir hata oluştu.", + "loadError": "Bir veya daha fazla PDF dosyası yüklenemedi" + }, + "loader": { + "renderingPreviews": "Sayfa önizlemeleri oluşturuluyor...", + "merging": "PDF'ler birleştiriliyor...", + "loadingDocuments": "PDF belgeleri yükleniyor..." + } }, "splitPdf": { "name": "PDF Böl", @@ -91,7 +106,7 @@ "tipRedoZ": "Yinele (⇧⌘Z)", "tipFileDetails": "Dosya ayrıntıları", "tipEditExistingContent": "Mevcut içeriği düzenle", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Düzenle aracının etkilediği öğeler — yoğun sayfalarda kapsamı daraltın", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Düzenle aracının etkilediği öğeler: yoğun sayfalarda kapsamı daraltın", "tipClickThePageToAddATextBox": "Metin kutusu eklemek için sayfaya tıklayın", "tipSpellCheckLanguage": "Yazım denetimi dili", "tipFindAndReplace": "Bul ve değiştir", @@ -216,7 +231,7 @@ "subtitle": "Belgenize sayfa numaraları ekleyin." }, "addPageLabels": { - "name": "Sayfa etiketleri ekle", + "name": "Sayfa Etiketleri Ekle", "subtitle": "Roma rakamları, önekler ve özel başlangıç değerleriyle PDF sayfa etiketleri uygulayın.", "uploadHint": "PDF dosyası", "howLabelsWorkTitle": "Etiketler nasıl çalışır", @@ -503,7 +518,8 @@ "noFile": "Dosya Yok", "noFileExplanation": "Lütfen önce bir PDF dosyası yükleyin.", "conversionSuccess": "PDF başarıyla TIFF'e dönüştürüldü!", - "conversionError": "PDF TIFF'e dönüştürülemedi. Dosya bozulmuş olabilir." + "conversionError": "PDF TIFF'e dönüştürülemedi. Dosya bozulmuş olabilir.", + "conversionOutOfMemory": "Dönüştürme sırasında tarayıcının belleği tükendi. Daha düşük bir DPI deneyin veya sayfaları tek tek dönüştürmek için çok sayfalı TIFF seçeneğinin işaretini kaldırın." } }, "pdfToCbz": { @@ -619,7 +635,7 @@ "retainPageLabelsHint": "Kapalı (varsayılan): birleştirilmiş PDF doğal 1–N sayfa numaralandırmasını kullanır. Açık: her dosyanın orijinal sayfa etiketleri korunur (yinelenen etiketler oluşabilir)." }, "duplexCollate": { - "name": "Çift taraflı taramayı harmanla", + "name": "Çift Taraflı Harmanla", "subtitle": "İki blok hâlinde taranmış bir PDF'i (önce tüm ön yüzler, sonra tüm arka yüzler) doğru ön/arka sırasına göre yeniden düzenleyin.", "totalPagesLabel": "Toplam sayfa:", "splitAfterPageLabel": "Şu sayfadan sonra böl", @@ -692,8 +708,8 @@ "subtitle": "Sayfaları 90 derecelik artışlarla döndürün." }, "rotateCustom": { - "name": "Rotate by Custom Degrees", - "subtitle": "Rotate pages by any custom angle." + "name": "Özel Açıyla Döndür", + "subtitle": "Sayfaları istediğiniz herhangi bir açıyla döndürün." }, "nUpPdf": { "name": "N'li PDF", @@ -760,7 +776,7 @@ "loadError": "PDF yüklenemedi. Bozuk olabilir veya parola korumalı olabilir." }, "posterizePdf": { - "name": "PDF'yi Posta Boyutuna Böl", + "name": "PDF'yi Posterleştir", "subtitle": "Büyük bir sayfayı birden fazla küçük sayfaya bölün." }, "fixPageSize": { @@ -784,7 +800,7 @@ "subtitle": "Bozulmuş veya hasarlı PDF dosyalarından veri kurtarın." }, "encryptPdf": { - "name": "PDF'yi Şifrele", + "name": "PDF'yi Parolayla Koru", "subtitle": "PDF'nizi şifre ekleyerek koruyun." }, "sanitizePdf": { @@ -792,7 +808,7 @@ "subtitle": "Üst verileri, açıklamaları, betikleri ve daha fazlasını kaldırın." }, "decryptPdf": { - "name": "PDF'nin Şifresini Çöz", + "name": "PDF Kilidini Aç", "subtitle": "Şifre korumasını kaldırarak PDF'nin kilidini açın." }, "flattenPdf": { @@ -808,211 +824,210 @@ "subtitle": "Bir PDF üzerindeki kullanıcı izinlerini ayarlayın veya değiştirin." }, "odtToPdf": { - "name": "ODT to PDF", - "subtitle": "Convert OpenDocument Text files to PDF format. Supports multiple files.", - "acceptedFormats": "ODT files", - "convertButton": "Convert to PDF" + "name": "ODT'den PDF'ye", + "subtitle": "OpenDocument Metin dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "ODT dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "csvToPdf": { - "name": "CSV to PDF", - "subtitle": "Convert CSV spreadsheet files to PDF format. Supports multiple files.", - "acceptedFormats": "CSV files", - "convertButton": "Convert to PDF" + "name": "CSV'den PDF'ye", + "subtitle": "CSV elektronik tablo dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "CSV dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "rtfToPdf": { - "name": "RTF to PDF", - "subtitle": "Convert Rich Text Format documents to PDF. Supports multiple files.", - "acceptedFormats": "RTF files", - "convertButton": "Convert to PDF" + "name": "RTF'den PDF'ye", + "subtitle": "Zengin Metin Biçimi (RTF) belgelerini PDF'ye dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "RTF dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "wordToPdf": { - "name": "Word to PDF", - "subtitle": "Convert Word documents (DOCX, DOC, ODT, RTF) to PDF format. Supports multiple files.", - "acceptedFormats": "DOCX, DOC, ODT, RTF files", - "convertButton": "Convert to PDF" + "name": "Word'den PDF'ye", + "subtitle": "Word belgelerini (DOCX, DOC, ODT, RTF) PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "DOCX, DOC, ODT, RTF dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "excelToPdf": { - "name": "Excel to PDF", - "subtitle": "Convert Excel spreadsheets (XLSX, XLS, ODS, CSV) to PDF format. Supports multiple files.", - "acceptedFormats": "XLSX, XLS, ODS, CSV files", - "convertButton": "Convert to PDF" + "name": "Excel'den PDF'ye", + "subtitle": "Excel elektronik tablolarını (XLSX, XLS, ODS, CSV) PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "XLSX, XLS, ODS, CSV dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "powerpointToPdf": { - "name": "PowerPoint to PDF", - "subtitle": "Convert PowerPoint presentations (PPTX, PPT, ODP) to PDF format. Supports multiple files.", - "acceptedFormats": "PPTX, PPT, ODP files", - "convertButton": "Convert to PDF" + "name": "PowerPoint'ten PDF'ye", + "subtitle": "PowerPoint sunumlarını (PPTX, PPT, ODP) PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "PPTX, PPT, ODP dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "markdownToPdf": { - "name": "Markdown to PDF", - "subtitle": "Write or paste Markdown and export it as a beautifully formatted PDF.", + "name": "Markdown'dan PDF'ye", + "subtitle": "Markdown yazın veya yapıştırın ve güzel biçimlendirilmiş bir PDF olarak dışa aktarın.", "paneMarkdown": "Markdown", - "panePreview": "Preview", + "panePreview": "Önizleme", "btnUpload": "Seç", - "btnSyncScroll": "Sync Scroll", - "btnSettings": "Settings", - "btnExportPdf": "Export PDF", - "settingsTitle": "Markdown Settings", - "settingsPreset": "Preset", - "presetDefault": "Default (GFM-like)", - "presetCommonmark": "CommonMark (strict)", - "presetZero": "Minimal (no features)", - "settingsOptions": "Markdown Options", - "optAllowHtml": "Allow HTML tags", - "optBreaks": "Convert newlines to
", - "optLinkify": "Auto-convert URLs to links", - "optTypographer": "Typographer (smart quotes, etc.)" + "btnSyncScroll": "Kaydırmayı Eşitle", + "btnSettings": "Ayarlar", + "btnExportPdf": "PDF Olarak Dışa Aktar", + "settingsTitle": "Markdown Ayarları", + "settingsPreset": "Ön Ayar", + "presetDefault": "Varsayılan (GFM benzeri)", + "presetCommonmark": "CommonMark (katı)", + "presetZero": "Minimal (özellik yok)", + "settingsOptions": "Markdown Seçenekleri", + "optAllowHtml": "HTML etiketlerine izin ver", + "optBreaks": "Satır sonlarını
etiketine dönüştür", + "optLinkify": "URL'leri otomatik olarak bağlantıya dönüştür", + "optTypographer": "Tipografi (akıllı tırnaklar vb.)" }, "pdfBooklet": { - "name": "PDF Booklet", - "subtitle": "Rearrange pages for double-sided booklet printing. Fold and staple to create a booklet.", - "howItWorks": "How it works:", - "step1": "Upload a PDF file.", - "step2": "Pages will be rearranged in booklet order.", - "step3": "Print double-sided, flip on short edge, fold and staple.", - "paperSize": "Paper Size", - "orientation": "Orientation", - "portrait": "Portrait", - "landscape": "Landscape", - "pagesPerSheet": "Pages per Sheet", - "createBooklet": "Create Booklet", - "processing": "Processing...", - "pageCount": "Page count will be padded to multiple of 4 if needed." + "name": "PDF Kitapçık", + "subtitle": "Sayfaları çift taraflı kitapçık baskısı için yeniden düzenleyin. Kitapçık oluşturmak için katlayıp zımbalayın.", + "howItWorks": "Nasıl çalışır:", + "step1": "Bir PDF dosyası yükleyin.", + "step2": "Sayfalar kitapçık sırasına göre yeniden düzenlenir.", + "step3": "Çift taraflı yazdırın, kısa kenardan çevirin, katlayın ve zımbalayın.", + "paperSize": "Kağıt Boyutu", + "orientation": "Yönlendirme", + "portrait": "Dikey", + "landscape": "Yatay", + "pagesPerSheet": "Yaprak Başına Sayfa", + "createBooklet": "Kitapçık Oluştur", + "processing": "İşleniyor...", + "pageCount": "Gerekirse sayfa sayısı 4'ün katına tamamlanır." }, "xpsToPdf": { - "name": "XPS to PDF", - "subtitle": "Convert XPS/OXPS documents to PDF format. Supports multiple files.", - "acceptedFormats": "XPS, OXPS files", - "convertButton": "Convert to PDF" + "name": "XPS'ten PDF'ye", + "subtitle": "XPS/OXPS belgelerini PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "XPS, OXPS dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "mobiToPdf": { - "name": "MOBI to PDF", - "subtitle": "Convert MOBI e-books to PDF format. Supports multiple files.", - "acceptedFormats": "MOBI files", - "convertButton": "Convert to PDF" + "name": "MOBI'den PDF'ye", + "subtitle": "MOBI e-kitaplarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "MOBI dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "epubToPdf": { - "name": "EPUB to PDF", - "subtitle": "Convert EPUB e-books to PDF format. Supports multiple files.", - "acceptedFormats": "EPUB files", - "convertButton": "Convert to PDF" + "name": "EPUB'dan PDF'ye", + "subtitle": "EPUB e-kitaplarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "EPUB dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "fb2ToPdf": { - "name": "FB2 to PDF", - "subtitle": "Convert FictionBook (FB2) e-books to PDF format. Supports multiple files.", - "acceptedFormats": "FB2 files", - "convertButton": "Convert to PDF" + "name": "FB2'den PDF'ye", + "subtitle": "FictionBook (FB2) e-kitaplarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "FB2 dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "cbzToPdf": { - "name": "CBZ to PDF", - "subtitle": "Convert comic book archives (CBZ/CBR) to PDF format. Supports multiple files.", - "acceptedFormats": "CBZ, CBR files", - "convertButton": "Convert to PDF" + "name": "CBZ'den PDF'ye", + "subtitle": "Çizgi roman arşivlerini (CBZ/CBR) PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "CBZ, CBR dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "wpdToPdf": { - "name": "WPD to PDF", - "subtitle": "Convert WordPerfect documents (WPD) to PDF format. Supports multiple files.", - "acceptedFormats": "WPD files", - "convertButton": "Convert to PDF" + "name": "WPD'den PDF'ye", + "subtitle": "WordPerfect belgelerini (WPD) PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "WPD dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "wpsToPdf": { - "name": "WPS to PDF", - "subtitle": "Convert WPS Office documents to PDF format. Supports multiple files.", - "acceptedFormats": "WPS files", - "convertButton": "Convert to PDF" + "name": "WPS'ten PDF'ye", + "subtitle": "WPS Office belgelerini PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "WPS dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "xmlToPdf": { - "name": "XML to PDF", - "subtitle": "Convert XML documents to PDF format. Supports multiple files.", - "acceptedFormats": "XML files", - "convertButton": "Convert to PDF" + "name": "XML'den PDF'ye", + "subtitle": "XML belgelerini PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "XML dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "pagesToPdf": { - "name": "Pages to PDF", - "subtitle": "Convert Apple Pages documents to PDF format. Supports multiple files.", - "acceptedFormats": "Pages files", - "convertButton": "Convert to PDF" + "name": "Pages'ten PDF'ye", + "subtitle": "Apple Pages belgelerini PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "Pages dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "odgToPdf": { - "name": "ODG to PDF", - "subtitle": "Convert OpenDocument Graphics (ODG) files to PDF format. Supports multiple files.", - "acceptedFormats": "ODG files", - "convertButton": "Convert to PDF" + "name": "ODG'den PDF'ye", + "subtitle": "OpenDocument Çizim (ODG) dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "ODG dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "odsToPdf": { - "name": "ODS to PDF", - "subtitle": "Convert OpenDocument Spreadsheet (ODS) files to PDF format. Supports multiple files.", - "acceptedFormats": "ODS files", - "convertButton": "Convert to PDF" + "name": "ODS'ten PDF'ye", + "subtitle": "OpenDocument Elektronik Tablo (ODS) dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "ODS dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "odpToPdf": { - "name": "ODP to PDF", - "subtitle": "Convert OpenDocument Presentation (ODP) files to PDF format. Supports multiple files.", - "acceptedFormats": "ODP files", - "convertButton": "Convert to PDF" + "name": "ODP'den PDF'ye", + "subtitle": "OpenDocument Sunum (ODP) dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "ODP dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "pubToPdf": { - "name": "PUB to PDF", - "subtitle": "Convert Microsoft Publisher (PUB) files to PDF format. Supports multiple files.", - "acceptedFormats": "PUB files", - "convertButton": "Convert to PDF" + "name": "PUB'dan PDF'ye", + "subtitle": "Microsoft Publisher (PUB) dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "PUB dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "vsdToPdf": { - "name": "VSD to PDF", - "subtitle": "Convert Microsoft Visio (VSD, VSDX) files to PDF format. Supports multiple files.", - "acceptedFormats": "VSD, VSDX files", - "convertButton": "Convert to PDF" + "name": "VSD'den PDF'ye", + "subtitle": "Microsoft Visio (VSD, VSDX) dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "VSD, VSDX dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "psdToPdf": { - "name": "PSD to PDF", - "subtitle": "Convert Adobe Photoshop (PSD) files to PDF format. Supports multiple files.", - "acceptedFormats": "PSD files", - "convertButton": "Convert to PDF" + "name": "PSD'den PDF'ye", + "subtitle": "Adobe Photoshop (PSD) dosyalarını PDF formatına dönüştürün. Birden fazla dosyayı destekler.", + "acceptedFormats": "PSD dosyaları", + "convertButton": "PDF'ye Dönüştür" }, "pdfToSvg": { - "name": "PDF to SVG", - "subtitle": "Convert each page of a PDF file into a scalable vector graphic (SVG) for perfect quality at any size." + "name": "PDF'den SVG'ye", + "subtitle": "Her boyutta kusursuz kalite için PDF dosyasının her sayfasını ölçeklenebilir vektör grafiğe (SVG) dönüştürün." }, "extractTables": { - "name": "Extract PDF Tables", - "subtitle": "Extract tables from PDF files and export as CSV, JSON, or Markdown." + "name": "PDF Tablolarını Çıkar", + "subtitle": "PDF dosyalarındaki tabloları çıkarın ve CSV, JSON veya Markdown olarak dışa aktarın." }, "pdfToCsv": { - "name": "PDF to CSV", - "subtitle": "Extract tables from PDF and convert to CSV format." + "name": "PDF'den CSV'ye", + "subtitle": "PDF'deki tabloları çıkarın ve CSV formatına dönüştürün." }, "pdfToExcel": { - "name": "PDF to Excel", - "subtitle": "Extract tables from PDF and convert to Excel (XLSX) format." + "name": "PDF'den Excel'e", + "subtitle": "PDF'deki tabloları çıkarın ve Excel (XLSX) formatına dönüştürün." }, "pdfToText": { - "name": "PDF to Text", - "subtitle": "Extract text from PDF files and save as plain text (.txt). Supports multiple files.", + "name": "PDF'den Metne", + "subtitle": "PDF dosyalarından metin çıkarın ve düz metin (.txt) olarak kaydedin. Birden fazla dosyayı destekler.", "noteLabel": "Not:", "noteText": "Bu araç YALNIZCA dijital olarak oluşturulmuş PDF'lerle çalışır. Taranmış belgeler veya görüntü tabanlı PDF'ler için bunun yerine OCR PDF aracımızı kullanın.", - "convertButton": "Extract Text", - "note": "This tool works ONLY with digitally created PDFs. For scanned documents or image-based PDFs, use our OCR PDF tool instead." + "convertButton": "Metni Çıkar" }, "digitalSignPdf": { - "name": "Digital Signature PDF", - "pageTitle": "Digital Signature PDF - Add Cryptographic Signature | BentoPDF", - "subtitle": "Add a cryptographic digital signature to your PDF using X.509 certificates. Supports PKCS#12 (.pfx, .p12) and PEM formats. Your private key never leaves your browser.", - "certificateSection": "Certificate", - "uploadCert": "Upload certificate (.pfx, .p12, .pem)", - "certPassword": "Certificate Password", + "name": "PDF Dijital İmza", + "pageTitle": "PDF Dijital İmza - Kriptografik İmza Ekleyin | BentoPDF", + "subtitle": "X.509 sertifikalarıyla PDF'nize kriptografik bir dijital imza ekleyin. PKCS#12 (.pfx, .p12) ve PEM formatlarını destekler. Özel anahtarınız tarayıcınızdan asla çıkmaz.", + "certificateSection": "Sertifika", + "uploadCert": "Sertifika yükle (.pfx, .p12, .pem)", + "certPassword": "Sertifika Parolası", "privateKeyPassword": "Özel Anahtar Parolası", - "certPasswordPlaceholder": "Enter certificate password", - "certInfo": "Certificate Information", - "certSubject": "Subject", - "certIssuer": "Issuer", - "certValidity": "Valid", - "signatureDetails": "Signature Details (Optional)", - "reason": "Reason", - "reasonPlaceholder": "e.g., I approve this document", - "location": "Location", - "locationPlaceholder": "e.g., New York, USA", - "contactInfo": "Contact Info", - "contactPlaceholder": "e.g., email@example.com", + "certPasswordPlaceholder": "Sertifika parolasını girin", + "certInfo": "Sertifika Bilgileri", + "certSubject": "Konu", + "certIssuer": "Veren", + "certValidity": "Geçerlilik", + "signatureDetails": "İmza Ayrıntıları (İsteğe Bağlı)", + "reason": "Neden", + "reasonPlaceholder": "ör. Bu belgeyi onaylıyorum", + "location": "Konum", + "locationPlaceholder": "ör. İstanbul, Türkiye", + "contactInfo": "İletişim Bilgileri", + "contactPlaceholder": "ör. eposta@example.com", "visibleSignature": "Görünür İmza", "visibleSignatureDescription": "Etkinleştirildiğinde, PDF'de görünür bir imza kutusu görünür. Bir görüntü/logo yükleyebilir veya metin ekleyebilirsiniz. Hiçbiri sağlanmazsa, sertifikadaki imzalayanın adı otomatik olarak gösterilir.", "signatureImage": "İmza Görüntüsü/Logosu (İsteğe Bağlı)", @@ -1074,15 +1089,15 @@ "faqPrivateKeyAnswer": "Evet! Tüm işlemler tamamen tarayıcınızda gerçekleşir. Sertifikanız, özel anahtarınız ve PDF dosyalarınız asla cihazınızdan ayrılmaz veya herhangi bir sunucuya yüklenmez.", "faqValidReadersQuestion": "İmza PDF okuyucularda geçerli olacak mı?", "faqValidReadersAnswer": "Evet, araç tüm büyük PDF okuyucuları tarafından tanınan standart PKCS#7 ayrılmış imzalar oluşturur. Tam doğrulama için güvenilir bir Sertifika Otoritesi'nden bir sertifika kullanın.", - "applySignature": "Apply Digital Signature", - "successMessage": "PDF signed successfully! The signature can be verified in any PDF reader.", + "applySignature": "Dijital İmzayı Uygula", + "successMessage": "PDF başarıyla imzalandı! İmza herhangi bir PDF okuyucuda doğrulanabilir.", "internetRequiredTitle": "İnternet bağlantısı gerekli", "internetRequiredDescription": "İmzalama, imzayı doğrulamak için sertifika düzenleyicinizin sunucusundan sertifika zinciri bilgilerini almayı gerektirebilir." }, "validateSignaturePdf": { - "name": "Validate PDF Signature", - "pageTitle": "Validate PDF Signature - Verify Digital Signatures | BentoPDF", - "subtitle": "Verify digital signatures in your PDF files. Check certificate validity, view signer details, and confirm document integrity. All processing happens in your browser." + "name": "PDF İmzasını Doğrula", + "pageTitle": "PDF İmzasını Doğrula - Dijital İmzaları Doğrulayın | BentoPDF", + "subtitle": "PDF dosyalarınızdaki dijital imzaları doğrulayın. Sertifika geçerliliğini kontrol edin, imzalayan ayrıntılarını görüntüleyin ve belge bütünlüğünü teyit edin. Tüm işlemler tarayıcınızda gerçekleşir." }, "timestampPdf": { "name": "PDF Zaman Damgası", @@ -1094,13 +1109,13 @@ "successMessage": "PDF başarıyla zaman damgalandı! Zaman damgası herhangi bir PDF okuyucuda doğrulanabilir." }, "emailToPdf": { - "name": "E-posta'dan PDF'ye", + "name": "E-postadan PDF'ye", "subtitle": "E-posta dosyalarını (EML, MSG) PDF formatına dönüştürün. Outlook dışa aktarmalarını ve standart e-posta formatlarını destekler.", "acceptedFormats": "EML, MSG Dosyaları", "convertButton": "PDF'ye Dönüştür" }, "fontToOutline": { - "name": "Yazı Tipi Çerçeveye Dönüştür", + "name": "Yazı Tipini Ana Hatlara Dönüştür", "subtitle": "Tüm yazı tiplerini vektör çerçevelere dönüştürün, tüm cihazlarda tutarlı görüntü için." }, "deskewPdf": { @@ -1189,7 +1204,7 @@ "workerError": "Worker hatası: {{message}}", "alternateMergeWorkerError": "Alternatif birleştirme worker hatası: {{message}}", "noPdfFilesUploaded": "PDF Input düğümüne PDF dosyası yüklenmedi", - "failedToLoadFile": "\"{{file}}\" yüklenemedi — dosya bozuk olabilir", + "failedToLoadFile": "\"{{file}}\" yüklenemedi, dosya bozuk olabilir", "noImagesUploaded": "Image Input düğümüne resim yüklenmedi", "noWordDocsUploaded": "Word Input düğümüne belge yüklenmedi", "noExcelUploaded": "Excel Input düğümüne hesap tablosu yüklenmedi", diff --git a/public/locales/tr/ui.json b/public/locales/tr/ui.json new file mode 100644 index 00000000..47d4beea --- /dev/null +++ b/public/locales/tr/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(düzeltildi)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} tane daha...", + "- Error parsing XMP XML. Displaying raw. -": "- XMP XML ayrıştırılamadı. Ham veri gösteriliyor. -", + "- No Info Dictionary data found -": "- Info Dictionary verisi bulunamadı -", + "- No XMP metadata found -": "- XMP üst verisi bulunamadı -", + "- No interactive form fields found -": "- Etkileşimli form alanı bulunamadı -", + "- No parseable XMP properties found -": "- Ayrıştırılabilir XMP özelliği bulunamadı -", + "-- Select existing group --": "-- Mevcut bir grup seçin --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0,1° (Çok Hassas)", + "0.5° (Default)": "0,5° (Varsayılan)", + "1.0° (Normal)": "1,0° (Normal)", + "100 (Fast)": "100 (Hızlı)", + "150 (Default)": "150 (Varsayılan)", + "1x2 (Booklet)": "1x2 (Kitapçık)", + "2.0° (Less Sensitive)": "2,0° (Daha Az Hassas)", + "200 (Better)": "200 (Daha İyi)", + "200 (Good)": "200 (İyi)", + "2x2 (4-up)": "2x2 (4'lü)", + "2x4 (8-up)": "2x4 (8'li)", + "300 (Best Quality)": "300 (En İyi Kalite)", + "300 (Print)": "300 (Baskı)", + "4x4 (16-up)": "4x4 (16'lı)", + "600 (High Quality)": "600 (Yüksek Kalite)", + "72 (Screen)": "72 (Ekran)", + "90° Clockwise": "90° Saat Yönünde", + "90° Counter-clockwise": "90° Saat Yönünün Tersine", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "\"{{fieldName}}\" adında bir alan zaten var. İndirmeden önce lütfen bu alanı benzersiz bir adla yeniden adlandırın.", + "A new version of BentoPDF is available. Reload to update?": "BentoPDF'in yeni bir sürümü mevcut. Güncellemek için yeniden yüklensin mi?", + "A single PDF file": "Tek bir PDF dosyası", + "A template with this name already exists.": "Bu ada sahip bir şablon zaten var.", + "ASCII characters (letters, numbers, symbols)": "ASCII karakterleri (harfler, rakamlar, simgeler)", + "Action": "İşlem", + "Add Blank Page": "Boş Sayfa Ekle", + "Add Bookmark": "Yer İşareti Ekle", + "Add Child Bookmark": "Alt Yer İşareti Ekle", + "Add Child Layer": "Alt Katman Ekle", + "Add More Comics": "Daha Fazla Çizgi Roman Ekle", + "Add More Documents": "Daha Fazla Belge Ekle", + "Add More EPUB Files": "Daha Fazla EPUB Dosyası Ekle", + "Add More Email Files": "Daha Fazla E-posta Dosyası Ekle", + "Add More FB2 Files": "Daha Fazla FB2 Dosyası Ekle", + "Add More Files": "Daha Fazla Dosya Ekle", + "Add More Images": "Daha Fazla Görsel Ekle", + "Add More JSON Files": "Daha Fazla JSON Dosyası Ekle", + "Add More MOBI Files": "Daha Fazla MOBI Dosyası Ekle", + "Add More Markdown Files": "Daha Fazla Markdown Dosyası Ekle", + "Add More ODG Files": "Daha Fazla ODG Dosyası Ekle", + "Add More PUB Files": "Daha Fazla PUB Dosyası Ekle", + "Add More Pages Files": "Daha Fazla Pages Dosyası Ekle", + "Add More Presentations": "Daha Fazla Sunum Ekle", + "Add More SVG Files": "Daha Fazla SVG Dosyası Ekle", + "Add More Spreadsheets": "Daha Fazla Elektronik Tablo Ekle", + "Add More Text Files": "Daha Fazla Metin Dosyası Ekle", + "Add More Visio Files": "Daha Fazla Visio Dosyası Ekle", + "Add More WPD Files": "Daha Fazla WPD Dosyası Ekle", + "Add More WPS Files": "Daha Fazla WPS Dosyası Ekle", + "Add More XML Files": "Daha Fazla XML Dosyası Ekle", + "Add More XPS Files": "Daha Fazla XPS Dosyası Ekle", + "Add a new layer to get started!": "Başlamak için yeni bir katman ekleyin!", + "Add a text box": "Metin kutusu ekle", + "Add an RFC 3161 document timestamp": "RFC 3161 belge zaman damgası ekle", + "Add an image": "Görsel ekle", + "Add at least one node to run the workflow.": "İş akışını çalıştırmak için en az bir düğüm ekleyin.", + "Add child": "Alt öğe ekle", + "Add child layer": "Alt katman ekle", + "Add header and footer text": "Üst bilgi ve alt bilgi metni ekle", + "Add page numbers": "Sayfa numaraları ekle", + "Add searchable text layer via OCR": "OCR ile aranabilir metin katmanı ekle", + "Add text watermark": "Metin filigranı ekle", + "Add/Edit/Extract Attachments": "Ek Dosya Ekle/Düzenle/Çıkar", + "Added": "Eklendi", + "Added \"{{afterText}}\"": "\"{{afterText}}\" eklendi", + "Added image ({{width}}×{{height}})": "Görsel eklendi ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "{{insertCount}} boş sayfa başarıyla eklendi!", + "Added {{insertCount}} blank pages successfully!": "{{insertCount}} boş sayfa başarıyla eklendi!", + "Adding header & footer...": "Üst bilgi ve alt bilgi ekleniyor...", + "Adding page numbers...": "Sayfa numaraları ekleniyor...", + "Adding watermark...": "Filigran ekleniyor...", + "Adding {{insertCount}} blank page...": "{{insertCount}} boş sayfa ekleniyor...", + "Adding {{insertCount}} blank pages...": "{{insertCount}} boş sayfa ekleniyor...", + "Adding {{name}} ({{n}}/{{length}})...": "{{name}} ekleniyor ({{n}}/{{length}})...", + "Adjust Colors": "Renkleri Ayarla", + "Adjust brightness, contrast, and colors": "Parlaklığı, kontrastı ve renkleri ayarlayın", + "Advanced": "Gelişmiş", + "Advanced Feature Required": "Gelişmiş Özellik Gerekli", + "Advanced Settings": "Gelişmiş Ayarlar", + "After Page": "Sayfadan Sonra", + "After Page...": "Sayfadan Sonra...", + "Align Objects": "Nesneleri Hizala", + "Alignment": "Hizalama", + "All": "Tümü", + "All files repaired successfully!": "Tüm dosyalar başarıyla onarıldı!", + "Alternate Merge": "Dönüşümlü Birleştir", + "Alternating and mixing pages...": "Sayfalar dönüşümlü olarak karıştırılıyor...", + "Always resample to that resolution": "Her zaman bu çözünürlüğe yeniden örnekle", + "An error occurred during compression. Error: {{error}}": "Sıkıştırma sırasında bir hata oluştu. Hata: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Dönüştürme sırasında bir hata oluştu. Hata: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Dönüştürme sırasında bir hata oluştu. Hata: {{message}}", + "An error occurred during cropping.": "Kırpma sırasında bir hata oluştu.", + "An error occurred during extraction. Error: {{error}}": "Çıkarma sırasında bir hata oluştu. Hata: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Rasterleştirme sırasında bir hata oluştu. Hata: {{error}}", + "An error occurred during sanitization: {{msg}}": "Temizleme sırasında bir hata oluştu: {{msg}}", + "An error occurred while combining pages.": "Sayfalar birleştirilirken bir hata oluştu.", + "An error occurred while creating the N-Up PDF.": "N'li PDF oluşturulurken bir hata oluştu.", + "An error occurred while creating the booklet.": "Kitapçık oluşturulurken bir hata oluştu.", + "An error occurred while dividing the PDF.": "PDF bölünürken bir hata oluştu.", + "An error occurred while mixing the PDFs.": "PDF'ler karıştırılırken bir hata oluştu.", + "An error occurred while standardizing pages.": "Sayfalar standartlaştırılırken bir hata oluştu.", + "An error occurred while trying to remove metadata.": "Üst veri kaldırılmaya çalışılırken bir hata oluştu.", + "An error occurred: {{error}}": "Bir hata oluştu: {{error}}", + "An error occurred: {{error}}.": "Bir hata oluştu: {{error}}.", + "An owner password is required when setting permissions": "İzinleri ayarlarken bir sahip parolası gereklidir", + "An unexpected error occurred during the repair process.": "Onarım işlemi sırasında beklenmeyen bir hata oluştu.", + "An unexpected error occurred.": "Beklenmeyen bir hata oluştu.", + "Analyzing data structure...": "Veri yapısı analiz ediliyor...", + "Analyzing full PDF metadata...": "PDF üst verisinin tamamı analiz ediliyor...", + "Analyzing signatures...": "İmzalar analiz ediliyor...", + "Angle": "Açı", + "Annotations removed successfully!": "Açıklamalar başarıyla kaldırıldı!", + "Any text, URL, or data": "Herhangi bir metin, URL veya veri", + "Application": "Uygulama", + "Apply a digital signature to PDF": "PDF'ye dijital imza uygula", + "Apply and download": "Uygula ve indir", + "Apply redactions?": "Karartmalar uygulansın mı?", + "Apply scanner simulation effect": "Tarayıcı simülasyonu efekti uygula", + "Applying Bates numbers...": "Bates numaraları uygulanıyor...", + "Applying color adjustments...": "Renk ayarları uygulanıyor...", + "Applying crop...": "Kırpma uygulanıyor...", + "Applying redactions...": "Karartmalar uygulanıyor...", + "Applying rotations...": "Döndürmeler uygulanıyor...", + "Applying scanner effect...": "Tarayıcı efekti uygulanıyor...", + "Applying timestamp...": "Zaman damgası uygulanıyor...", + "Applying {{replace}}...": "{{replace}} uygulanıyor...", + "Archive contains an oversized image entry.": "Arşiv aşırı büyük bir görsel girdisi içeriyor.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Arşivde çok fazla görsel var (en fazla {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Arşiv açıldığında çok büyük.", + "Are you sure you want to reset? All your work will be lost.": "Sıfırlamak istediğinizden emin misiniz? Tüm çalışmanız kaybolacak.", + "Area (Coordinates)": "Alan (Koordinatlar)", + "Area ({{unit}}²)": "Alan ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman ve Courier New, yerleşik eşdeğerleriyle eşlenir. Yalnızca güvenli olduğunda uygulanır.", + "Arrange multiple pages per sheet": "Bir yaprağa birden fazla sayfa yerleştir", + "Arrange pages for booklet printing": "Sayfaları kitapçık baskısı için düzenle", + "Aspect Ratio": "En Boy Oranı", + "At least one PDF document is required for export.": "Dışa aktarmak için en az bir PDF belgesi gerekli.", + "At least two valid PDFs are required.": "En az iki geçerli PDF gerekli.", + "Attaching files to PDF...": "Dosyalar PDF'ye ekleniyor...", + "Attachments updated successfully!": "Ek dosyalar başarıyla güncellendi!", + "Author": "Yazar", + "Auto (Keep Original)": "Otomatik (Orijinali Koru)", + "Back": "Arka", + "Back to Home": "Ana Sayfaya Dön", + "Background Color": "Arka Plan Rengi", + "Background color changed successfully!": "Arka plan rengi başarıyla değiştirildi!", + "Barcode": "Barkod", + "Barcode Format": "Barkod Biçimi", + "Barcode Value": "Barkod Değeri", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Bates numaraları başarıyla uygulandı! ({{batesStart}} - {{n}})", + "Beginning": "Başlangıç", + "Binarize": "İkili Hale Getir", + "Blank Position": "Boş Sayfa Konumu", + "Blue": "Mavi", + "Blur": "Bulanıklaştır", + "Bold": "Kalın", + "Bold & Italic": "Kalın ve İtalik", + "Booklet": "Kitapçık", + "Booklet created with {{numSheets}} sheets!": "{{numSheets}} yapraklı kitapçık oluşturuldu!", + "Bookmarks imported from JSON!": "Yer işaretleri JSON'dan içe aktarıldı!", + "Bookmarks page": "Yer işaretleri sayfası", + "Border": "Kenarlık", + "Border Color": "Kenarlık Rengi", + "Bottom": "Alt", + "Bottom Center": "Alt Orta", + "Bottom Left": "Alt Sol", + "Bottom Right": "Alt Sağ", + "Bottom edge in points": "Punto cinsinden alt kenar", + "Brightness": "Parlaklık", + "Brotli and rasterizing were skipped to keep it PDF/A.": "PDF/A olarak kalması için Brotli ve rasterleştirme atlandı.", + "Brotli compression (PDF 2.0)": "Brotli sıkıştırma (PDF 2.0)", + "Browser Note:": "Tarayıcı Notu:", + "Building new PDF...": "Yeni PDF oluşturuluyor...", + "Building page pairing model...": "Sayfa eşleştirme modeli oluşturuluyor...", + "Button": "Düğme", + "ByteRange does not start at the beginning of the file": "ByteRange dosyanın başında başlamıyor", + "ByteRange out of bounds": "ByteRange sınırların dışında", + "CBZ to PDF": "CBZ'den PDF'ye", + "CSV Loaded": "CSV Yüklendi", + "CSV file is empty": "CSV dosyası boş", + "Cancel": "İptal", + "Cannot Delete": "Silinemiyor", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Görüntüleyici denetimlerine erişilemiyor. Lütfen yukarıdaki PDF görüntüleyici araç çubuğundaki İndir düğmesini kullanın.", + "Cannot delete all pages": "Tüm sayfalar silinemez", + "Cannot delete all pages.": "Tüm sayfalar silinemez.", + "Canvas context failed": "Canvas bağlamı başarısız oldu", + "Canvas context unavailable": "Canvas bağlamı kullanılamıyor", + "Canvas toBlob conversion failed.": "Canvas toBlob dönüştürmesi başarısız oldu.", + "Canvas toBlob failed": "Canvas toBlob başarısız oldu", + "Center": "Ortala", + "Certificate (.pfx, .p12, .pem)": "Sertifika (.pfx, .p12, .pem)", + "Certificate Expired": "Sertifikanın Süresi Dolmuş", + "Certificate Password": "Sertifika Parolası", + "Certificate unlocked": "Sertifikanın kilidi açıldı", + "Change Certificate": "Sertifikayı Değiştir", + "Change background color": "Arka plan rengini değiştir", + "Changing background color...": "Arka plan rengi değiştiriliyor...", + "Changing text color...": "Metin rengi değiştiriliyor...", + "Character": "Karakter", + "Checked State": "İşaretli Durum", + "Choose a valid page range.": "Geçerli bir sayfa aralığı seçin.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Pakete dahil dillerden birini seçin veya eksik dili --ocr-languages seçeneğine ekleyerek ağdan yalıtılmış paketi yeniden oluşturun.", + "Cleanup": "Temizlik", + "Click on PDF to Pick Location": "Konum Seçmek İçin PDF'ye Tıklayın", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Yukarıdaki düğmeye tıklayın, ardından yer işaretinin atlamasını istediğiniz yere PDF üzerinde tıklayın", + "Click to Upload Image": "Görsel Yüklemek İçin Tıklayın", + "Clicking this field in the PDF will open a file picker to upload an image.": "PDF'de bu alana tıklamak, görsel yüklemek için bir dosya seçici açar.", + "Clip invisible parts of images": "Görsellerin görünmeyen kısımlarını kırp", + "Close": "Kapat", + "Close (Esc)": "Kapat (Esc)", + "Close panel": "Paneli kapat", + "Closes tab": "Sekmeyi kapatır", + "Closes window": "Pencereyi kapatır", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (Yer İşaretleri ve Üst Veri)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF yapılandırılmamış. Lütfen WASM Ayarları'ndan yapılandırın.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF boş bir çözülmüş dosya üretti.", + "CoherentPDF: not configured.": "CoherentPDF: yapılandırılmamış.", + "Color": "Renk", + "Color adjustments applied successfully!": "Renk ayarları başarıyla uygulandı!", + "Colors inverted successfully!": "Renkler başarıyla ters çevrildi!", + "Cols": "Sütun", + "Combine multiple PDFs into one": "Birden fazla PDF'yi tek dosyada birleştir", + "Combine to Single Page": "Tek Sayfada Birleştir", + "Combining pages...": "Sayfalar birleştiriliyor...", + "Comic Archives": "Çizgi Roman Arşivleri", + "Comments and markup become part of the page. Form fields and links keep working.": "Yorumlar ve işaretlemeler sayfanın parçası olur. Form alanları ve bağlantılar çalışmaya devam eder.", + "Complete": "Tamamlandı", + "Complete!": "Tamamlandı!", + "Compress": "Sıkıştır", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "{{compressedCount}} PDF sıkıştırıldı. Toplam boyut {{totalOriginalSize}} değerinden {{totalCompressedSize}} değerine düştü (%{{value}} tasarruf).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "{{compressedCount}} PDF sıkıştırıldı. Toplam boyut: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Birden fazla PDF sıkıştırılıyor...", + "Compressing to {{size}}...": "{{size}} boyutuna sıkıştırılıyor...", + "Compressing {{n}}/{{length}}: {{name}}...": "Sıkıştırılıyor {{n}}/{{length}}: {{name}}...", + "Compressing...": "Sıkıştırılıyor...", + "Compression Complete": "Sıkıştırma Tamamlandı", + "Compression Finished": "Sıkıştırma Bitti", + "Compression Level": "Sıkıştırma Düzeyi", + "Configure": "Yapılandır", + "Confirm": "Onayla", + "Confirm Action": "İşlemi Onayla", + "Conformance": "Uygunluk", + "Connected": "Bağlandı", + "Contact Info": "İletişim Bilgileri", + "Content": "İçerik", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "İçerik karması messageDigest özniteliğiyle eşleşmiyor: PDF imzalandıktan sonra değiştirilmiş", + "Contrast": "Kontrast", + "Conversion Complete": "Dönüştürme Tamamlandı", + "Conversion Error": "Dönüştürme Hatası", + "Conversion engine ready!": "Dönüştürme motoru hazır!", + "Conversion failed: could not create PDF/A definition": "Dönüştürme başarısız: PDF/A tanımı oluşturulamadı", + "Convert Apple Pages documents to PDF": "Apple Pages belgelerini PDF'ye dönüştür", + "Convert EPUB ebooks to PDF": "EPUB e-kitaplarını PDF'ye dönüştür", + "Convert Excel spreadsheets to PDF": "Excel e-tablolarını PDF'ye dönüştür", + "Convert FB2 e-books to PDF": "FB2 e-kitaplarını PDF'ye dönüştür", + "Convert JSON files to PDF": "JSON dosyalarını PDF'ye dönüştür", + "Convert MOBI e-books to PDF": "MOBI e-kitaplarını PDF'ye dönüştür", + "Convert Markdown files to PDF": "Markdown dosyalarını PDF'ye dönüştür", + "Convert Microsoft Publisher to PDF": "Microsoft Publisher dosyalarını PDF'ye dönüştür", + "Convert OpenDocument Graphics to PDF": "OpenDocument Graphics dosyalarını PDF'ye dönüştür", + "Convert PDF pages to SVG": "PDF sayfalarını SVG'ye dönüştür", + "Convert PDF pages to images (ZIP)": "PDF sayfalarını görsellere dönüştür (ZIP)", + "Convert PDF tables to CSV": "PDF tablolarını CSV'ye dönüştür", + "Convert PDF tables to Excel": "PDF tablolarını Excel'e dönüştür", + "Convert PDF to Markdown text": "PDF'yi Markdown metnine dönüştür", + "Convert PDF to PDF/A for archiving": "PDF'yi arşivleme için PDF/A'ya dönüştür", + "Convert PDF to Word document": "PDF'yi Word belgesine dönüştür", + "Convert PowerPoint presentations to PDF": "PowerPoint sunumlarını PDF'ye dönüştür", + "Convert SVG files to PDF": "SVG dosyalarını PDF'ye dönüştür", + "Convert To Grayscale": "Gri Tonlamaya Dönüştür", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Visio diyagramlarını (VSD/VSDX) PDF'ye dönüştür", + "Convert WPS Office documents to PDF": "WPS Office belgelerini PDF'ye dönüştür", + "Convert Word documents to PDF": "Word belgelerini PDF'ye dönüştür", + "Convert WordPerfect documents to PDF": "WordPerfect belgelerini PDF'ye dönüştür", + "Convert XML documents to PDF": "XML belgelerini PDF'ye dönüştür", + "Convert XPS/OXPS documents to PDF": "XPS/OXPS belgelerini PDF'ye dönüştür", + "Convert comic book archives (CBZ/CBR) to PDF": "Çizgi roman arşivlerini (CBZ/CBR) PDF'ye dönüştür", + "Convert email files (.eml, .msg) to PDF": "E-posta dosyalarını (.eml, .msg) PDF'ye dönüştür", + "Convert fonts to vector outlines": "Yazı tiplerini vektör dış çizgilerine dönüştür", + "Convert plain text to PDF": "Düz metni PDF'ye dönüştür", + "Convert to grayscale": "Gri tonlamaya dönüştür", + "Convert to greyscale": "Gri tonlamaya dönüştür", + "Convert to image-based PDF": "Görsel tabanlı PDF'ye dönüştür", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "{{length}} dosya ({{totalPages}} sayfa) SVG'ye dönüştürüldü!", + "Converted {{pageCount}} pages to SVG!": "{{pageCount}} sayfa SVG'ye dönüştürüldü!", + "Converter not initialized": "Dönüştürücü başlatılmadı", + "Converting BMP to PDF...": "BMP PDF'ye dönüştürülüyor...", + "Converting HEIC to PDF...": "HEIC PDF'ye dönüştürülüyor...", + "Converting TIFF to PDF...": "TIFF PDF'ye dönüştürülüyor...", + "Converting emails...": "E-postalar dönüştürülüyor...", + "Converting files...": "Dosyalar dönüştürülüyor...", + "Converting fonts to outlines...": "Yazı tipleri dış çizgilere dönüştürülüyor...", + "Converting images to PDF...": "Görseller PDF'ye dönüştürülüyor...", + "Converting multiple PDFs to PDF/A...": "Birden fazla PDF, PDF/A'ya dönüştürülüyor...", + "Converting multiple RTF files to PDF...": "Birden fazla RTF dosyası PDF'ye dönüştürülüyor...", + "Converting multiple files...": "Birden fazla dosya dönüştürülüyor...", + "Converting page {{n}} of {{pageCount}}...": "Sayfa dönüştürülüyor: {{n}}/{{pageCount}}...", + "Converting to Markdown...": "Markdown'a dönüştürülüyor...", + "Converting to SVG...": "SVG'ye dönüştürülüyor...", + "Converting to greyscale...": "Gri tonlamaya dönüştürülüyor...", + "Converting to {{level}}...": "{{level}} düzeyine dönüştürülüyor...", + "Converting {{name}}...": "{{name}} dönüştürülüyor...", + "Converting {{n}}/{{length}}: {{name}}...": "Dönüştürülüyor {{n}}/{{length}}: {{name}}...", + "Converting...": "Dönüştürülüyor...", + "Copied": "Kopyalandı", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Damgalı PDF dışa aktarıcısına erişilemedi. Lütfen yedek olarak görüntüleyici araç çubuğundaki Dışa Aktar → PDF düğmesini kullanın.", + "Could not add blank page.": "Boş sayfa eklenemedi.", + "Could not add blank pages.": "Boş sayfalar eklenemedi.", + "Could not add header or footer.": "Üst bilgi veya alt bilgi eklenemedi.", + "Could not add page numbers.": "Sayfa numaraları eklenemedi.", + "Could not add the watermark.": "Filigran eklenemedi.", + "Could not apply rotations.": "Döndürmeler uygulanamadı.", + "Could not change text color.": "Metin rengi değiştirilemedi.", + "Could not change the background color.": "Arka plan rengi değiştirilemedi.", + "Could not create ZIP archive.": "ZIP arşivi oluşturulamadı.", + "Could not create canvas context.": "Canvas bağlamı oluşturulamadı.", + "Could not create comparison canvas context.": "Karşılaştırma canvas bağlamı oluşturulamadı.", + "Could not create offscreen comparison canvas.": "Ekran dışı karşılaştırma canvas'ı oluşturulamadı.", + "Could not create visual diff context.": "Görsel fark bağlamı oluşturulamadı.", + "Could not create visual diff overlay context.": "Görsel fark bindirme bağlamı oluşturulamadı.", + "Could not detect blank pages.": "Boş sayfalar algılanamadı.", + "Could not display the page.": "Sayfa görüntülenemedi.", + "Could not export comparison PDF.": "Karşılaştırma PDF'si dışa aktarılamadı.", + "Could not export the signed PDF. Please try again.": "İmzalı PDF dışa aktarılamadı. Lütfen tekrar deneyin.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Damgalı PDF dışa aktarılamadı. Lütfen yedek olarak görüntüleyici araç çubuğundaki Dışa Aktar → PDF düğmesini kullanın.", + "Could not extract signer public key": "İmzalayanın genel anahtarı çıkarılamadı", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Belirtilen URL'de {{testFile}} bulunamadı (HTTP {{status}}). Dosyanın var olduğundan emin olun.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "PDF tam olarak analiz edilemedi. Bozuk olabilir veya alışılmadık bir yapıya sahip olabilir.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Önizleme oluşturulamadı. Dosya bozuk olabilir veya desteklenmeyen özellikler içeriyor olabilir. Hata: {{message}}", + "Could not get canvas context": "Canvas bağlamı alınamadı", + "Could not invert PDF colors.": "PDF renkleri ters çevrilemedi.", + "Could not load PDF. It may be corrupt or password-protected.": "PDF yüklenemedi. Bozuk veya parola korumalı olabilir.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "PDF yüklenemedi. Dosya geçersiz, bozuk veya parola korumalı olabilir.", + "Could not load the PDF engine. Please refresh the page and try again.": "PDF motoru yüklenemedi. Lütfen sayfayı yenileyip tekrar deneyin.", + "Could not parse signer info": "İmzalayan bilgisi ayrıştırılamadı", + "Could not posterize the PDF.": "PDF posterleştirilemedi.", + "Could not process \"{{name}}\". The file may be corrupted.": "\"{{name}}\" işlenemedi. Dosya bozuk olabilir.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Dosya boyutu daha fazla küçültülemedi. Orijinal: {{originalSize}}, Yeni: {{compressedSize}}.", + "Could not remove annotations.": "Açıklamalar kaldırılamadı.", + "Could not remove blank pages.": "Boş sayfalar kaldırılamadı.", + "Could not remove leftover data from the PDF.": "PDF'deki artık veriler kaldırılamadı.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Karartılan metin belge verisinden kaldırılamadığı için dosya indirilmedi.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "PDF sayfaları ters çevrilemedi. Lütfen dosyalarınızın geçerli PDF olduğundan emin olun.", + "Could not update metadata. Please check that date formats are correct.": "Üst veri güncellenemedi. Lütfen tarih biçimlerinin doğru olduğundan emin olun.", + "Count": "Adet", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Oluşturulma", + "Creating Booklet...": "Kitapçık oluşturuluyor...", + "Creating Excel file...": "Excel dosyası oluşturuluyor...", + "Creating N-Up PDF...": "N'li PDF oluşturuluyor...", + "Creating PDF from JPGs...": "JPG'lerden PDF oluşturuluyor...", + "Creating PDF from SVG files...": "SVG dosyalarından PDF oluşturuluyor...", + "Creating PDF...": "PDF oluşturuluyor...", + "Creating ZIP archive...": "ZIP arşivi oluşturuluyor...", + "Creating ZIP file...": "ZIP dosyası oluşturuluyor...", + "Creating ZIP...": "ZIP oluşturuluyor...", + "Creating table...": "Tablo oluşturuluyor...", + "Creator": "Oluşturan", + "Crop": "Kırp", + "Crop complete! Your download has started.": "Kırpma tamamlandı! İndirme başladı.", + "Cryptographic verification failed": "Kriptografik doğrulama başarısız oldu", + "Custom": "Özel", + "Custom Format": "Özel Biçim", + "Custom Height": "Özel Yükseklik", + "Custom Units": "Özel Birimler", + "Custom Width": "Özel Genişlik", + "Custom Zoom": "Özel Yakınlaştırma", + "Custom...": "Özel...", + "DataMatrix": "DataMatrix", + "Date Format": "Tarih Biçimi", + "Decrease size": "Boyutu küçült", + "Decrypt": "Şifreyi Çöz", + "Decrypting PDF...": "PDF'nin şifresi çözülüyor...", + "Decrypting {{name}} ({{n}}/{{length}})...": "{{name}} dosyasının şifresi çözülüyor ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Şifre çözülüyor {{n}}/{{length}}: {{name}}", + "Decrypting...": "Şifre çözülüyor...", + "Decryption Failed": "Şifre Çözme Başarısız", + "Delete": "Sil", + "Delete \"{{title}}\"?": "\"{{title}}\" silinsin mi?", + "Delete Field": "Alanı Sil", + "Delete Page": "Sayfayı Sil", + "Delete Pages": "Sayfaları Sil", + "Delete all {{length}} bookmark(s) ? ": "{{length}} yer işaretinin tümü silinsin mi?", + "Delete layer": "Katmanı sil", + "Delete {{size}} bookmark(s) ? ": "{{size}} yer işareti silinsin mi?", + "Deleted": "Silindi", + "Deleted {{size}} page(s) successfully!": "{{size}} sayfa başarıyla silindi!", + "Deleting pages...": "Sayfalar siliniyor...", + "Description": "Açıklama", + "Description for screen readers": "Ekran okuyucular için açıklama", + "Deselect All": "Tüm Seçimi Kaldır", + "Deskew": "Eğriliği Düzelt", + "Deskew PDF": "PDF Eğriliğini Düzelt", + "Deskewed {{length}} file(s). {{value}}": "{{length}} dosyanın eğriliği düzeltildi. {{value}}", + "Deskewing {{name}}...": "{{name}} dosyasının eğriliği düzeltiliyor...", + "Destination": "Hedef", + "Detecting blank pages...": "Boş sayfalar algılanıyor...", + "Digest Algorithm:": "Özet Algoritması:", + "Digital Sign": "Dijital İmza", + "Direction": "Yön", + "Divide Pages": "Sayfaları Böl", + "Divide into boxes (0 to disable)": "Kutulara böl (kapatmak için 0)", + "Document Properties": "Belge Özellikleri", + "Document Type": "Belge Türü", + "Document properties": "Belge özellikleri", + "Document-level attachment": "Belge düzeyinde ek dosya", + "Done: back to tools": "Bitti, araçlara dön", + "Download": "İndir", + "Download Edited PDF": "Düzenlenen PDF'yi İndir", + "Download anyway": "Yine de indir", + "Download as PDF or ZIP automatically": "PDF veya ZIP olarak otomatik indir", + "Downloaded {{length}} PDF files in a ZIP archive.": "{{length}} PDF dosyası ZIP arşivi olarak indirildi.", + "Downloads started for all files.": "Tüm dosyalar için indirme başladı.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Ekran okuyucuların kullandığı etiketlemeyi kaldırır.", + "Duplicate Field Name": "Yinelenen Alan Adı", + "Duplicate Field Names": "Yinelenen Alan Adları", + "Duplicate Page": "Sayfayı Çoğalt", + "Duplicate Page Numbers": "Yinelenen Sayfa Numaraları", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA imzası, imzalayanın genel anahtarıyla doğrulanmıyor", + "EPUB Files": "EPUB Dosyaları", + "EPUB to PDF": "EPUB'dan PDF'ye", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ'den PDF'ye", + "Edit": "Düzenle", + "Edit All": "Tümünü Düzenle", + "Edit Bookmark": "Yer İşaretini Düzenle", + "Edit Bookmarks": "Yer İşaretlerini Düzenle", + "Edit Images": "Görselleri Düzenle", + "Edit Metadata": "Üst Veriyi Düzenle", + "Edit PDF metadata": "PDF üst verisini düzenle", + "Edit Scope": "Düzenleme Kapsamı", + "Edit Shapes": "Şekilleri Düzenle", + "Edit Text": "Metni Düzenle", + "Edit tool": "Düzenleme aracı", + "Edit {{scopes}}": "{{scopes}} düzenle", + "Email Files": "E-posta Dosyaları", + "Email to PDF": "E-postadan PDF'ye", + "Embedding files into PDF...": "Dosyalar PDF'ye gömülüyor...", + "Empty signature bytes": "İmza baytları boş", + "Encrypt": "Şifrele", + "Encrypt PDF with password": "PDF'yi parolayla şifrele", + "Encrypted file": "Şifrelenmiş dosya", + "Encrypting PDF with 256-bit AES...": "PDF 256 bit AES ile şifreleniyor...", + "Encryption Failed": "Şifreleme Başarısız", + "Encryption resulted in an empty file.": "Şifreleme sonucunda boş bir dosya oluştu.", + "End": "Son", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Başa eklemek için 0, sona eklemek için {{pageCount}} girin.", + "Enter bookmark title": "Yer işareti başlığını girin", + "Enter name for child layer under \"{{Layer}}\":": "\"{{Layer}}\" altındaki alt katman için ad girin:", + "Enter password": "Parolayı girin", + "Enter password...": "Parolayı girin...", + "Enter passwords for each encrypted file": "Şifrelenmiş her dosya için parolaları girin", + "Error": "Hata", + "Error during execution": "Çalıştırma sırasında hata", + "Error generating PDF: {{error}}": "PDF oluşturulurken hata: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "PDF dosyası yüklenirken hata oluştu. Lütfen geçerli bir PDF ile tekrar deneyin.", + "Error reading files: {{error}}": "Dosyalar okunurken hata: {{error}}", + "Error saving PDF. Check console for details.": "PDF kaydedilirken hata oluştu. Ayrıntılar için konsolu kontrol edin.", + "Error: {{error}}": "Hata: {{error}}", + "Exactly 11 or 12 digits": "Tam olarak 11 veya 12 hane", + "Exactly 12 or 13 digits": "Tam olarak 12 veya 13 hane", + "Example of current format:": "Geçerli biçim örneği:", + "Excel to PDF": "Excel'den PDF'ye", + "Existing Radio Groups": "Mevcut Radyo Grupları", + "Export Error": "Dışa Aktarma Hatası", + "Export Value": "Dışa Aktarma Değeri", + "Export failed": "Dışa aktarma başarısız oldu", + "External processing module needed": "Harici işleme modülü gerekli", + "Extract Images": "Görselleri Çıkar", + "Extract Pages": "Sayfaları Çıkar", + "Extract Tables": "Tabloları Çıkar", + "Extract a range of pages": "Bir sayfa aralığını çıkar", + "Extract all images from PDF": "PDF'deki tüm görselleri çıkar", + "Extract pages as separate PDFs": "Sayfaları ayrı PDF'ler olarak çıkar", + "Extract text from PDF": "PDF'den metin çıkar", + "Extracted 1 table successfully!": "1 tablo başarıyla çıkarıldı!", + "Extracted text from {{length}} PDF files!": "{{length}} PDF dosyasından metin çıkarıldı!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF çıkarıldı, {{failed}} başarısız oldu.", + "Extracted {{length}} page(s) successfully!": "{{length}} sayfa başarıyla çıkarıldı!", + "Extracted {{length}} table(s) to Excel!": "{{length}} tablo Excel'e çıkarıldı!", + "Extracted {{length}} tables successfully!": "{{length}} tablo başarıyla çıkarıldı!", + "Extracting attachments from {{length}} file(s)...": "{{length}} dosyadan ek dosyalar çıkarılıyor...", + "Extracting images from {{name}}...": "{{name}} dosyasından görseller çıkarılıyor...", + "Extracting pages...": "Sayfalar çıkarılıyor...", + "Extracting tables...": "Tablolar çıkarılıyor...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Dosyadan metin çıkarılıyor {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Birden fazla dosyadan metin çıkarılıyor...", + "Extracting text from {{name}}...": "{{name}} dosyasından metin çıkarılıyor...", + "Extracting text...": "Metin çıkarılıyor...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "{{name}} yapay zeka için çıkarılıyor ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "{{name}} yapay zeka için çıkarılıyor...", + "Extracting...": "Çıkarılıyor...", + "Extraction Complete": "Çıkarma Tamamlandı", + "Extraction Error": "Çıkarma Hatası", + "Extraction Partial": "Kısmi Çıkarma", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Çıkarma tamamlandı! ZIP dosyasında {{length}} ek dosya ({{totalSize}}). İndirme başladı.", + "FB2 Files": "FB2 Dosyaları", + "FB2 to PDF": "FB2'den PDF'ye", + "Failed": "Başarısız", + "Failed to acquire 2D canvas context": "2D canvas bağlamı alınamadı", + "Failed to add child layer": "Alt katman eklenemedi", + "Failed to apply Bates numbers.": "Bates numaraları uygulanamadı.", + "Failed to apply color adjustments. The file might be corrupted.": "Renk ayarları uygulanamadı. Dosya bozuk olabilir.", + "Failed to apply redactions.": "Karartmalar uygulanamadı.", + "Failed to apply scanner effect. The file might be corrupted.": "Tarayıcı efekti uygulanamadı. Dosya bozuk olabilir.", + "Failed to attach files: {{error}}": "Dosyalar eklenemedi: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "BMP, PDF'ye dönüştürülemedi. Dosyalardan biri geçersiz olabilir.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "HEIC, PDF'ye dönüştürülemedi. Dosyalardan biri geçersiz olabilir.", + "Failed to convert PDF to CSV. {{message}}": "PDF, CSV'ye dönüştürülemedi. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "PDF, Excel'e dönüştürülemedi. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "PDF, SVG'ye dönüştürülemedi. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "PDF gri tonlamaya dönüştürülemedi. Dosya bozuk olabilir.", + "Failed to convert PDF. It may be image-based or corrupted.": "PDF dönüştürülemedi. Görsel tabanlı veya bozuk olabilir.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "TIFF, PDF'ye dönüştürülemedi. Dosyalardan biri geçersiz olabilir.", + "Failed to convert images to PDF.": "Görseller PDF'ye dönüştürülemedi.", + "Failed to convert text to PDF. {{error}}": "Metin PDF'ye dönüştürülemedi. {{error}}", + "Failed to convert {{filename}} to PNG": "{{filename}} PNG'ye dönüştürülemedi", + "Failed to copy metadata to clipboard.": "Üst veri panoya kopyalanamadı.", + "Failed to create PDF.": "PDF oluşturulamadı.", + "Failed to create PNG blob": "PNG blob'u oluşturulamadı", + "Failed to create canvas context": "Canvas bağlamı oluşturulamadı", + "Failed to create split PDFs.": "Bölünmüş PDF'ler oluşturulamadı.", + "Failed to decode image: {{name}}": "Görsel çözümlenemedi: {{name}}", + "Failed to decrypt private key": "Özel anahtarın şifresi çözülemedi", + "Failed to decrypt. Try the Decrypt tool instead.": "Şifre çözülemedi. Bunun yerine Şifre Çöz aracını deneyin.", + "Failed to delete layer": "Katman silinemedi", + "Failed to delete pages.": "Sayfalar silinemedi.", + "Failed to deskew PDF: {{error}}": "PDF eğriliği düzeltilemedi: {{error}}", + "Failed to download the edited PDF.": "Düzenlenen PDF indirilemedi.", + "Failed to edit attachments.": "Ek dosyalar düzenlenemedi.", + "Failed to extract certificate from PFX file": "PFX dosyasından sertifika çıkarılamadı", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Sayfalar çıkarılamadı (qpdf çıkış kodu {{exitCode}}).", + "Failed to extract pages.": "Sayfalar çıkarılamadı.", + "Failed to extract tables. {{message}}": "Tablolar çıkarılamadı. {{message}}", + "Failed to extract text from PDF.": "PDF'den metin çıkarılamadı.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "ICC profili {{iccUrl}} adresinden alınamadı: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Yazı tipi dosyası alınamadı: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "gs.js alınamadı: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "{{url}} alınamadı: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "{{pageNumber}}. sayfa için 2D bağlam alınamadı", + "Failed to get canvas context": "Canvas bağlamı alınamadı", + "Failed to insert PDF. The file may be corrupted.": "PDF eklenemedi. Dosya bozuk olabilir.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Ghostscript {{normalizedUrl}} adresinden yüklenemedi: {{msg}}", + "Failed to load PDF file.": "PDF dosyası yüklenemedi.", + "Failed to load PDF for cropping.": "PDF kırpma için yüklenemedi.", + "Failed to load PDF for preview.": "PDF önizleme için yüklenemedi.", + "Failed to load PDF form viewer.": "PDF form görüntüleyici yüklenemedi.", + "Failed to load PDF layers": "PDF katmanları yüklenemedi", + "Failed to load PyMuPDF from CDN: {{msg}}": "PyMuPDF, CDN'den yüklenemedi: {{msg}}", + "Failed to load SVG image": "SVG görseli yüklenemedi", + "Failed to load WebP image": "WebP görseli yüklenemedi", + "Failed to load attachments from PDF.": "PDF'deki ek dosyalar yüklenemedi.", + "Failed to load files: {{error}}": "Dosyalar yüklenemedi: {{error}}", + "Failed to load image.": "Görsel yüklenemedi.", + "Failed to load image: {{filename}}": "Görsel yüklenemedi: {{filename}}", + "Failed to load one or more PDF files.": "Bir veya daha fazla PDF dosyası yüklenemedi.", + "Failed to load script: {{url}}": "Betik yüklenemedi: {{url}}", + "Failed to load template.": "Şablon yüklenemedi.", + "Failed to load the PDF Editor.": "PDF Düzenleyici yüklenemedi.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Görsel işleyici yüklenemedi. Lütfen tarayıcınızın SharedArrayBuffer'ı desteklediğinden emin olun (HTTPS veya localhost gerekir).", + "Failed to parse CSV: {{error}}": "CSV ayrıştırılamadı: {{error}}", + "Failed to parse signature": "İmza ayrıştırılamadı", + "Failed to parse the certificate file.": "Sertifika dosyası ayrıştırılamadı.", + "Failed to process HEIC file: {{name}}": "HEIC dosyası işlenemedi: {{name}}", + "Failed to process WebP file: {{name}}": "WebP dosyası işlenemedi: {{name}}", + "Failed to read file.": "Dosya okunamadı.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Kısıtlamalar kaldırılamadı. PDF için doğru sahip parolası gerekebilir.", + "Failed to render page": "Sayfa oluşturulamadı", + "Failed to render page previews": "Sayfa önizlemeleri oluşturulamadı", + "Failed to render page previews.": "Sayfa önizlemeleri oluşturulamadı.", + "Failed to render page.": "Sayfa oluşturulamadı.", + "Failed to save changes.": "Değişiklikler kaydedilemedi.", + "Failed to save the new PDF. Check console for details.": "Yeni PDF kaydedilemedi. Ayrıntılar için konsolu kontrol edin.", + "Failed to split PDF. Please check your selection.": "PDF bölünemedi. Lütfen seçiminizi kontrol edin.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "PDF'ye zaman damgası eklenemedi: {{message}}\n\nLütfen farklı bir TSA sunucusu deneyin veya internet bağlantınızı kontrol edin.", + "Failed to toggle layer visibility": "Katman görünürlüğü değiştirilemedi", + "Failed to validate signatures. The file may be corrupted.": "İmzalar doğrulanamadı. Dosya bozuk olabilir.", + "Features enabled by this module:": "Bu modülün etkinleştirdiği özellikler:", + "Field Name": "Alan Adı", + "Field Name (Group Name)": "Alan Adı (Grup Adı)", + "Field Name Conflict": "Alan Adı Çakışması", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "\"{{newName}}\" alan adı bu {{value}} içinde zaten var. Lütfen benzersiz bir ad kullanmayı deneyin.", + "Field name cannot be empty": "Alan adı boş olamaz", + "File": "Dosya", + "File Size": "Dosya Boyutu", + "File exists but could not be read. Check CORS configuration.": "Dosya var ancak okunamadı. CORS yapılandırmasını kontrol edin.", + "File list not found": "Dosya listesi bulunamadı", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Dosya boyutu {{originalSize}} değerinden {{compressedSize}} değerine düştü (%{{percent}} tasarruf).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Dosya {{n}}/{{length}}: Sayfa {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Dosya {{n}}/{{length}}: {{message}}", + "Filename": "Dosya adı", + "Files that failed: {{errorCount}}.": "Başarısız dosyalar: {{errorCount}}.", + "Fill (cover full target page)": "Doldur (hedef sayfanın tamamını kapla)", + "Fill Color": "Dolgu Rengi", + "Finalizing PDF...": "PDF tamamlanıyor...", + "Find & replace": "Bul ve değiştir", + "Finds the best quality under this size. 0 means no target.": "Bu boyutun altındaki en iyi kaliteyi bulur. 0, hedef yok demektir.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox ve Chrome, seçim sırasında kendi tarih seçici biçimini gösterebilir. Tarihi girmeyi bitirdiğinizde doğru biçim uygulanır.", + "First Indent": "İlk Girinti", + "Fit (keep full page visible)": "Sığdır (sayfanın tamamı görünsün)", + "Fit Page": "Sayfaya Sığdır", + "Fix Page Size": "Sayfa Boyutunu Düzelt", + "Flatten": "Düzleştir", + "Flatten Forms": "Formları Düzleştir", + "Flatten annotations": "Açıklamaları düzleştir", + "Flatten form fields": "Form alanlarını düzleştir", + "Flatten forms and annotations": "Formları ve açıklamaları düzleştir", + "Flatten links": "Bağlantıları düzleştir", + "Flattening PDF...": "PDF düzleştiriliyor...", + "Flattening and saving PDF...": "PDF düzleştirilip kaydediliyor...", + "Flattening multiple PDFs...": "Birden fazla PDF düzleştiriliyor...", + "Flattening page {{i}} of {{totalPages}}...": "Sayfa düzleştiriliyor: {{i}}/{{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Düzleştiriliyor {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Adres çubuğuna odaklanır", + "Font": "Yazı Tipi", + "Font Color": "Yazı Tipi Rengi", + "Font Family": "Yazı Tipi Ailesi", + "Font Size": "Yazı Tipi Boyutu", + "Font size: {{bSize}} → {{aSize}}": "Yazı tipi boyutu: {{bSize}} → {{aSize}}", + "Font to Outline": "Yazı Tipini Dış Çizgiye Dönüştür", + "Font: {{bFont}} → {{aFont}}": "Yazı tipi: {{bFont}} → {{aFont}}", + "Fonts": "Yazı Tipleri", + "Footer Center": "Alt Bilgi Orta", + "Footer Left": "Alt Bilgi Sol", + "Footer Right": "Alt Bilgi Sağ", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Tarama gibi yalnızca görselden oluşan PDF'ler içindir. Belgede seçilebilir metin varsa, İçerik korumasını geçersiz kıl açık değilse atlanır.", + "Form fields stop being fillable.": "Form alanları artık doldurulamaz.", + "Format": "Biçim", + "Found {{length}} blank page(s). Click on a page to deselect it.": "{{length}} boş sayfa bulundu. Seçimini kaldırmak için bir sayfaya tıklayın.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "{{length}} mevcut yer işareti bulundu. Geçerli yer işaretleri değiştirilsin mi?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "{{length2}} PDF içinde {{length}} görsel bulundu.", + "Front": "Ön", + "Full Coverage": "Tam Kapsama", + "Gamma": "Gama", + "Generate table of contents from bookmarks": "Yer işaretlerinden içindekiler tablosu oluştur", + "Generating High-Quality PDF...": "Yüksek kaliteli PDF oluşturuluyor...", + "Generating PDF...": "PDF oluşturuluyor...", + "Generating ZIP file...": "ZIP dosyası oluşturuluyor...", + "Generating formatted content...": "Biçimlendirilmiş içerik oluşturuluyor...", + "Generating preview...": "Önizleme oluşturuluyor...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (PDF/A Dönüştürme)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB dönüştürme {{exitCode}} çıkış koduyla başarısız oldu", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript dönüştürme {{exitCode}} çıkış koduyla başarısız oldu", + "Ghostscript did not produce output file": "Ghostscript çıktı dosyası üretmedi", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript yapılandırılmamış. Lütfen Gelişmiş Ayarlar'dan yapılandırın.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript yapılandırılmamış. Lütfen WASM Ayarları'ndan yapılandırın.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript yapılandırılmamış. PyMuPDF bazı işlemler için Ghostscript'e ihtiyaç duyar. Lütfen ikisini de Gelişmiş Ayarlar'dan yapılandırın.", + "Ghostscript threw an exception: {{e}}": "Ghostscript bir istisna oluşturdu: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript sarmalayıcısı beklenen arayüzü sunmadı. loadGS() veya GhostscriptWASM sınıfı bekleniyordu.", + "Go": "Git", + "Go to page": "Sayfaya git", + "Grayscale": "Gri Tonlama", + "Green": "Yeşil", + "Greyscale": "Gri Tonlama", + "Grid Mode": "Izgara Modu", + "Group Name (Must be same for group)": "Grup Adı (Grup için aynı olmalı)", + "H-Scale %": "Yatay Ölçek %", + "Hanging Indent": "Asılı Girinti", + "Hard reloads page": "Sayfayı tamamen yeniden yükler", + "Header & Footer": "Üst Bilgi & Alt Bilgi", + "Header & Footer added successfully!": "Üst bilgi ve alt bilgi başarıyla eklendi!", + "Header Center": "Üst Bilgi Orta", + "Header Left": "Üst Bilgi Sol", + "Header Right": "Üst Bilgi Sağ", + "Height ({{unit}})": "Yükseklik ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Gizle", + "Hide Border": "Kenarlığı Gizle", + "Hide password": "Parolayı gizle", + "Hides window": "Pencereyi gizler", + "High (288 DPI)": "Yüksek (288 DPI)", + "High (Smallest Files)": "Yüksek (En Küçük Dosyalar)", + "Horizontal": "Yatay", + "Hue Shift": "Ton Kaydırma", + "Image Format": "Görsel Biçimi", + "Image Input": "Görsel Girişi", + "Image quality": "Görsel kalitesi", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Görsel {{width}}×{{height}} boyutundan {{width2}}×{{height2}} boyutuna yeniden boyutlandırıldı", + "Images": "Görseller", + "Images above this are resampled down. None leaves resolution alone.": "Bunun üzerindeki görseller küçültülerek yeniden örneklenir. Yok seçeneği çözünürlüğe dokunmaz.", + "Imported {{length}} bookmarks!": "{{length}} yer işareti içe aktarıldı!", + "Inches (in)": "İnç (in)", + "Include Attachments": "Ek Dosyaları Dahil Et", + "Include Cc Bcc": "Cc ve Bcc'yi Dahil Et", + "Include this file": "Bu dosyayı dahil et", + "Incorrect Page Count": "Hatalı Sayfa Sayısı", + "Incorrect Password": "Hatalı Parola", + "Incorrect password": "Hatalı parola", + "Incorrect password. Please try again.": "Hatalı parola. Lütfen tekrar deneyin.", + "Increase size": "Boyutu büyüt", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "PDF 1 dizinleniyor: sayfa {{pageNumber}}/{{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "PDF 2 dizinleniyor: sayfa {{pageNumber}}/{{totalPages}}...", + "Info": "Bilgi", + "Info Dictionary": "Info Dictionary", + "Inherit": "Devral", + "Initialization Error": "Başlatma Hatası", + "Initializing Ghostscript...": "Ghostscript başlatılıyor...", + "Initializing PDF engine...": "PDF motoru başlatılıyor...", + "Initializing PyMuPDF...": "PyMuPDF başlatılıyor...", + "Initializing decryption...": "Şifre çözme başlatılıyor...", + "Initializing encryption...": "Şifreleme başlatılıyor...", + "Initializing repair engine...": "Onarım motoru başlatılıyor...", + "Initializing...": "Başlatılıyor...", + "Input Required": "Giriş Gerekli", + "Insecure Digest (MD5 / SHA-1)": "Güvensiz Özet (MD5 / SHA-1)", + "Insert blank pages": "Boş sayfa ekle", + "Insert blank pages after this page number": "Bu sayfa numarasından sonra boş sayfa ekle", + "Interactive Form Fields": "Etkileşimli Form Alanları", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Birden fazla PDF'nin sayfalarını iç içe geçir (örneğin tek taraflı bir taramadan tek ve ters çevrilmiş çift sayfalar)", + "Invalid Certificate": "Geçersiz Sertifika", + "Invalid File": "Geçersiz Dosya", + "Invalid Files": "Geçersiz Dosyalar", + "Invalid Input": "Geçersiz Giriş", + "Invalid JSON format": "Geçersiz JSON biçimi", + "Invalid Name": "Geçersiz Ad", + "Invalid Order": "Geçersiz Sıra", + "Invalid PDF password.": "Geçersiz PDF parolası.", + "Invalid Page Numbers": "Geçersiz Sayfa Numaraları", + "Invalid Page Order": "Geçersiz Sayfa Sırası", + "Invalid Pages": "Geçersiz Sayfalar", + "Invalid Range": "Geçersiz Aralık", + "Invalid Signature": "Geçersiz İmza", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Geçersiz TSA URL'si. Zaman damgası otoritesi geçerli bir http:// veya https:// URL'si olmalıdır.", + "Invalid URL": "Geçersiz URL", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Geçersiz URL biçimi. Lütfen geçerli bir URL girin (örneğin https://example.com/wasm/)", + "Invalid XML: no root element": "Geçersiz XML: kök öğe yok", + "Invalid data": "Geçersiz veri", + "Invalid hex string in content stream": "İçerik akışında geçersiz onaltılık dize", + "Invalid page range specified.": "Geçersiz sayfa aralığı belirtildi.", + "Invalid shortcut format": "Geçersiz kısayol biçimi", + "Invalid: Cryptographic Verification Failed": "Geçersiz: Kriptografik Doğrulama Başarısız Oldu", + "Invert Colors": "Renkleri Ters Çevir", + "Invert all colors": "Tüm renkleri ters çevir", + "Inverting PDF colors...": "PDF renkleri ters çevriliyor...", + "Issuer": "Veren", + "It fits the {{targetBytes}} target.": "{{targetBytes}} hedefine uyuyor.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "PDF/A'yı Koru seçeneği sıkıştırma sınırını düşürdüğü için hâlâ {{targetBytes}} hedefinin üzerinde.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Artık PDF/A uyumluluğu iddia etmiyor. Korumak için Özel Ayarlar altında PDF/A'yı Koru seçeneğini açın.", + "Italic": "İtalik", + "Item 1": "Öğe 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Sıkıştırılabilmesi için dijital imzaları kaldırıldı. Gerekirse yeniden imzalayın.", + "JPEG (Smaller file size)": "JPEG (Daha küçük dosya boyutu)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Yeniden kodlanan görseller için JPEG kalitesi, 20 ile 100 arası. Düşük değer daha küçük dosya ve daha görünür bozulma demektir.", + "JPG": "JPG", + "JSON Files": "JSON Dosyaları", + "JSON Loaded": "JSON Yüklendi", + "JSON to PDF": "JSON'dan PDF'ye", + "Javascript Code": "Javascript Kodu", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "PDF/A dosyasının uyumlu kalmasını sağlar. Bu açıkken Brotli ve rasterleştirme atlanır.", + "Keeps only the characters the document uses.": "Yalnızca belgenin kullandığı karakterleri tutar.", + "Key (e.g., Department)": "Anahtar (örneğin Departman)", + "Keywords": "Anahtar Kelimeler", + "Label": "Etiket", + "Label / Prompt": "Etiket / İstem", + "Landscape": "Yatay", + "Language": "Dil", + "Layer not found": "Katman bulunamadı", + "Layer {{number}}": "Katman {{number}}", + "Leave blank for all pages": "Tüm sayfalar için boş bırakın", + "Left": "Sol", + "Left edge in points (1 inch = 72 pts)": "Punto cinsinden sol kenar (1 inç = 72 punto)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Düzey", + "Limit recognized characters (leave empty for all)": "Tanınan karakterleri sınırla (tümü için boş bırakın)", + "Line": "Çizgi", + "Linearization Failed": "Doğrusallaştırma Başarısız", + "Linearize": "Doğrusallaştır", + "Links stop being clickable.": "Bağlantılar artık tıklanamaz.", + "Lists": "Listeler", + "Load": "Yükle", + "Load system fonts": "Sistem yazı tiplerini yükle", + "Load system fonts…": "Sistem yazı tiplerini yükle…", + "Loaded": "Yüklendi", + "Loaded bookmarks from JSON. Now upload your PDF.": "Yer işaretleri JSON'dan yüklendi. Şimdi PDF'nizi yükleyin.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "CSV'den {{length}} yer işareti yüklendi. Şimdi PDF'nizi yükleyin.", + "Loading Engine...": "Motor Yükleniyor...", + "Loading Ghostscript...": "Ghostscript yükleniyor...", + "Loading PDF Editor...": "PDF Düzenleyici yükleniyor...", + "Loading PDF Text Editor...": "PDF Metin Düzenleyici yükleniyor...", + "Loading PDF converter...": "PDF dönüştürücü yükleniyor...", + "Loading PDF documents...": "PDF belgeleri yükleniyor...", + "Loading PDF engine...": "PDF motoru yükleniyor...", + "Loading PDF files...": "PDF dosyaları yükleniyor...", + "Loading PDF form...": "PDF formu yükleniyor...", + "Loading PDF processor...": "PDF işlemcisi yükleniyor...", + "Loading PDF viewer...": "PDF görüntüleyici yükleniyor...", + "Loading PDF...": "PDF yükleniyor...", + "Loading PDFs...": "PDF'ler yükleniyor...", + "Loading attachments...": "Ek dosyalar yükleniyor...", + "Loading comparison {{currentPage}} of {{length}}...": "Karşılaştırma yükleniyor: {{currentPage}}/{{length}}...", + "Loading conversion engine ({{percent}}%)...": "Dönüştürme motoru yükleniyor (%{{percent}})...", + "Loading conversion engine...": "Dönüştürme motoru yükleniyor...", + "Loading engine...": "Motor yükleniyor...", + "Loading fonts...": "Yazı tipleri yükleniyor...", + "Loading layers from {{name}}...": "{{name}} dosyasındaki katmanlar yükleniyor...", + "Loading page {{num}}...": "Sayfa {{num}} yükleniyor...", + "Loading preview...": "Önizleme yükleniyor...", + "Loading {{name}}...": "{{name}} yükleniyor...", + "Loading...": "Yükleniyor...", + "Location": "Konum", + "Lossless (No Quality Loss)": "Kayıpsız (Kalite Kaybı Yok)", + "Lossless (no image re-encoding)": "Kayıpsız (görseller yeniden kodlanmaz)", + "Low (Best Quality)": "Düşük (En İyi Kalite)", + "MOBI Files": "MOBI Dosyaları", + "MOBI to PDF": "MOBI'den PDF'ye", + "Malformed ByteRange": "Hatalı biçimli ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Hatalı biçimli ECDSA imzası (r,s ayrıştırılamadı)", + "Malformed inline image in content stream": "İçerik akışında hatalı biçimli satır içi görsel", + "Malformed signatureAlgorithm": "Hatalı biçimli signatureAlgorithm", + "Margins": "Kenar Boşlukları", + "Markdown Files": "Markdown Dosyaları", + "Markdown to PDF": "Markdown'dan PDF'ye", + "Max Length (0 for unlimited)": "Maksimum Uzunluk (sınırsız için 0)", + "Maximum resolution": "Maksimum çözünürlük", + "Medium (Recommended)": "Orta (Önerilen)", + "Merge PDF": "PDF Birleştir", + "Merge PDFs": "PDF'leri Birleştir", + "Merge duplicate fonts": "Yinelenen yazı tiplerini birleştir", + "Mermaid Error: {{error}}": "Mermaid Hatası: {{error}}", + "Metadata copied to clipboard as JSON.": "Üst veri JSON olarak panoya kopyalandı.", + "Metadata removed successfully!": "Üst veri başarıyla kaldırıldı!", + "Metadata updated successfully!": "Üst veri başarıyla güncellendi!", + "Millimeters (mm)": "Milimetre (mm)", + "Minimizes window": "Pencereyi küçültür", + "Missing Files": "Eksik Dosyalar", + "Missing signatureAlgorithm": "signatureAlgorithm eksik", + "Mixed Page Sizes Detected": "Karışık Sayfa Boyutları Algılandı", + "Mixed Sizes": "Karışık Boyutlar", + "Mode": "Mod", + "Modified": "Değiştirildi", + "Modified After Signing (signed part intact)": "İmzadan Sonra Değiştirilmiş (imzalı kısım bozulmamış)", + "More": "Daha Fazla", + "Moved": "Taşındı", + "Moved \"{{value}}\"": "\"{{value}}\" taşındı", + "Multi-line": "Çok satırlı", + "Must be a positive integer": "Pozitif bir tam sayı olmalı", + "Must be a positive number": "Pozitif bir sayı olmalı", + "N must be at least 1.": "N en az 1 olmalı.", + "N-Up": "N'li", + "N-Up PDF created successfully!": "N'li PDF başarıyla oluşturuldu!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Ağ hatası: URL'ye bağlanılamadı. URL'nin doğru olduğundan ve sunucunun CORS isteklerine izin verdiğinden emin olun.", + "Network error: {{error}}": "Ağ hatası: {{error}}", + "Next page": "Sonraki sayfa", + "No Area Selected": "Alan Seçilmedi", + "No Attachments": "Ek Dosya Yok", + "No Changes": "Değişiklik Yok", + "No Crop Area": "Kırpma Alanı Yok", + "No File": "Dosya Yok", + "No Files": "Dosya Yok", + "No Images Found": "Görsel Bulunamadı", + "No PDF Files": "PDF Dosyası Yok", + "No PDF document loaded": "Yüklü PDF belgesi yok", + "No PDF document loaded.": "Yüklü PDF belgesi yok.", + "No PDF file loaded.": "Yüklü PDF dosyası yok.", + "No PDF files could be decrypted. The password may be incorrect.": "Hiçbir PDF dosyasının şifresi çözülemedi. Parola hatalı olabilir.", + "No PDF files could be linearized.": "Hiçbir PDF dosyası doğrusallaştırılamadı.", + "No PDFs could be processed.": "Hiçbir PDF işlenemedi.", + "No Pages": "Sayfa Yok", + "No Selection": "Seçim Yok", + "No Signatures Found": "İmza Bulunamadı", + "No Tables Found": "Tablo Bulunamadı", + "No Text": "Metin Yok", + "No URL configured": "Yapılandırılmış URL yok", + "No attachments found in this PDF.": "Bu PDF'de ek dosya bulunamadı.", + "No attachments selected for removal.": "Kaldırmak için ek dosya seçilmedi.", + "No blank pages detected in this PDF.": "Bu PDF'de boş sayfa algılanmadı.", + "No bookmarks found at the selected level.": "Seçilen düzeyde yer işareti bulunamadı.", + "No bookmarks to delete.": "Silinecek yer işareti yok.", + "No bookmarks to export!": "Dışa aktarılacak yer işareti yok!", + "No certificate found in PEM file": "PEM dosyasında sertifika bulunamadı", + "No certificate found in PFX file": "PFX dosyasında sertifika bulunamadı", + "No certificates found in signature": "İmzada sertifika bulunamadı", + "No changes match the current filter.": "Geçerli filtreyle eşleşen değişiklik yok.", + "No configurable settings for this node.": "Bu düğüm için yapılandırılabilir ayar yok.", + "No differences detected on this page.": "Bu sayfada fark algılanmadı.", + "No embedded images were found in the selected PDF(s).": "Seçilen PDF'lerde gömülü görsel bulunamadı.", + "No existing bookmarks found in this PDF.": "Bu PDF'de mevcut yer işareti bulunamadı.", + "No items were selected for removal or none were found in the PDF.": "Kaldırmak için öğe seçilmedi veya PDF'de hiç bulunamadı.", + "No page pairs to export.": "Dışa aktarılacak sayfa çifti yok.", + "No pages found. Please create a blank PDF or upload one.": "Sayfa bulunamadı. Lütfen boş bir PDF oluşturun veya bir PDF yükleyin.", + "No pages selected for removal.": "Kaldırmak için sayfa seçilmedi.", + "No pages were selected for splitting.": "Bölmek için sayfa seçilmedi.", + "No paired page for this side.": "Bu taraf için eşleşen sayfa yok.", + "No private key found in PEM file": "PEM dosyasında özel anahtar bulunamadı", + "No private key found in PFX file": "PFX dosyasında özel anahtar bulunamadı", + "No tables were detected in this PDF.": "Bu PDF'de tablo algılanmadı.", + "No valid page numbers found.": "Geçerli sayfa numarası bulunamadı.", + "No valid pages to save.": "Kaydedilecek geçerli sayfa yok.", + "No worker": "Çalışan yok", + "Noise": "Gürültü", + "None": "Yok", + "None of the files could be compressed: {{join}}.": "Dosyaların hiçbiri sıkıştırılamadı: {{join}}.", + "Normal": "Normal", + "Not Enough Files": "Yeterli Dosya Yok", + "Not a PDF": "PDF Değil", + "Not connected": "Bağlı değil", + "Not in trust chain": "Güven zincirinde değil", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Not: Ayrı bir sahip parolası olmadan PDF'de kullanım kısıtlaması olmaz.", + "Number Format": "Sayı Biçimi", + "Number of Pages": "Sayfa Sayısı", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR hiçbir sayfa işlenmeden iptal edildi", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR tanıma {{timeoutMs}} ms sonra zaman aşımına uğradı", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "ODG Dosyaları", + "ODG to PDF": "ODG'den PDF'ye", + "OK": "Tamam", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Kapalı (varsayılan): doğal 1–N numaralandırma. Açık: her dosyanın özgün sayfa etiketleri korunur (yinelenen etiketler oluşabilir).", + "One PDF per page": "Sayfa başına bir PDF", + "One PDF per range": "Aralık başına bir PDF", + "Only a substitute font was available": "Yalnızca yedek bir yazı tipi mevcuttu", + "Only where it does not change how the image looks.": "Yalnızca görselin görünümünü değiştirmediği yerlerde.", + "Opacity": "Opaklık", + "Open URL": "URL'yi Aç", + "Opens incognito window": "Gizli pencere açar", + "Opens new tab": "Yeni sekme açar", + "Opens new window": "Yeni pencere açar", + "Operation Failed": "İşlem Başarısız", + "Operation resulted in an empty file.": "İşlem sonucunda boş bir dosya oluştu.", + "Optimize PDF for fast web viewing": "PDF'yi hızlı web görüntüleme için optimize et", + "Optimizing PDFs for web view (linearizing)...": "PDF'ler web görüntüleme için optimize ediliyor (doğrusallaştırma)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "{{name}} optimize ediliyor ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Seçenekler (Her satıra bir tane veya virgülle ayrılmış)", + "Orientation": "Yönlendirme", + "Outline": "Dış Çizgi", + "Output": "Çıktı", + "Overlay": "Bindirme", + "Overlay or underlay pages from one PDF onto another": "Bir PDF'nin sayfalarını başka bir PDF'nin üstüne veya altına bindir", + "Owner Password": "Sahip Parolası", + "Owner Password Required": "Sahip Parolası Gerekli", + "PDF": "PDF", + "PDF Files": "PDF Dosyaları", + "PDF Input": "PDF Girişi", + "PDF Layers": "PDF Katmanları", + "PDF Metadata": "PDF Üst Verisi", + "PDF Producer": "PDF Üreticisi", + "PDF converted to CSV successfully!": "PDF başarıyla CSV'ye dönüştürüldü!", + "PDF converted to SVG successfully!": "PDF başarıyla SVG'ye dönüştürüldü!", + "PDF converted to greyscale successfully!": "PDF başarıyla gri tonlamaya dönüştürüldü!", + "PDF created successfully!": "PDF başarıyla oluşturuldu!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF'nin şifresi başarıyla çözüldü! Tüm şifreleme ve kısıtlamalar kaldırıldı.", + "PDF decrypted successfully! Your download has started.": "PDF'nin şifresi başarıyla çözüldü! İndirme başladı.", + "PDF downloaded successfully.": "PDF başarıyla indirildi.", + "PDF encrypted successfully with 256-bit AES!": "PDF 256 bit AES ile başarıyla şifrelendi!", + "PDF has been sanitized and downloaded.": "PDF temizlendi ve indirildi.", + "PDF has no pages": "PDF'de sayfa yok", + "PDF organized successfully!": "PDF başarıyla düzenlendi!", + "PDF permissions changed successfully!": "PDF izinleri başarıyla değiştirildi!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF okuyucular 14 standart PDF yazı tipini kendileri sağlar.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF kısıtlamaları başarıyla kaldırıldı! Dosya artık tamamen düzenlenebilir ve yazdırılabilir.", + "PDF saved successfully!": "PDF başarıyla kaydedildi!", + "PDF split successfully!": "PDF başarıyla bölündü!", + "PDF to CSV": "PDF'den CSV'ye", + "PDF to DOCX": "PDF'den DOCX'e", + "PDF to Excel/CSV": "PDF'den Excel/CSV'ye", + "PDF to Images": "PDF'den Görsellere", + "PDF to Images (High Quality)": "PDF'den Görsellere (Yüksek Kalite)", + "PDF to JSON": "PDF'den JSON'a", + "PDF to Markdown": "PDF'den Markdown'a", + "PDF to PDF/A": "PDF'den PDF/A'ya", + "PDF to SVG": "PDF'den SVG'ye", + "PDF to Text": "PDF'den Metne", + "PDF to XLSX": "PDF'den XLSX'e", + "PDF with layer changes saved!": "Katman değişiklikleriyle PDF kaydedildi!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}} başarıyla uygulandı.", + "PDF/A Conversion": "PDF/A Dönüştürme", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (Katı, saydamlık yok)", + "PDF/A-2b (Recommended)": "PDF/A-2b (Önerilen)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (Modern, ek dosyalara izin verir)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF'ler başarıyla karıştırıldı!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (Kayıpsız)", + "PUB to PDF": "PUB'dan PDF'ye", + "Page": "Sayfa", + "Page #": "Sayfa No", + "Page Added": "Sayfa Eklendi", + "Page Numbers": "Sayfa Numaraları", + "Page Removed": "Sayfa Kaldırıldı", + "Page Size": "Sayfa Boyutu", + "Page X of Y": "Sayfa X / Y", + "Page background or layout changed": "Sayfa arka planı veya düzeni değişti", + "Page container not found": "Sayfa kapsayıcısı bulunamadı", + "Page extraction produced an empty PDF.": "Sayfa çıkarma işlemi boş bir PDF üretti.", + "Page number": "Sayfa numarası", + "Page numbers added successfully!": "Sayfa numaraları başarıyla eklendi!", + "Page sizes standardized successfully!": "Sayfa boyutları başarıyla standartlaştırıldı!", + "Page {{currentPageNum}} of {{numPages}}": "Sayfa {{currentPageNum}} / {{numPages}}", + "Page {{num}} / {{numPages}}": "Sayfa {{num}} / {{numPages}}", + "Page {{n}} ": "Sayfa {{n}} ", + "Page {{n}} of {{length}}": "Sayfa {{n}} / {{length}}", + "Page {{n}}:": "Sayfa {{n}}:", + "Page {{pageNumber}}": "Sayfa {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "{{pageNumber}}. sayfa yalnızca ilk PDF'de var.", + "Page {{pageNumber}} exists only in the second PDF.": "{{pageNumber}}. sayfa yalnızca ikinci PDF'de var.", + "Page {{pageNumber}} of {{totalPages}}": "Sayfa {{pageNumber}} / {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "{{pageNum}}. sayfa bu PDF'de yok.", + "Page {{page}}": "Sayfa {{page}}", + "Page {{page}} attachment": "Sayfa {{page}} ek dosyası", + "Pages": "Sayfalar", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Sayfalar (örneğin 1-3, 5) - Toplam: {{pageCount}}", + "Pages Files": "Pages Dosyaları", + "Pages Per Sheet": "Yaprak Başına Sayfa", + "Pages combined successfully!": "Sayfalar başarıyla birleştirildi!", + "Pages have been divided successfully!": "Sayfalar başarıyla bölündü!", + "Pages have been reordered.": "Sayfaların sırası değiştirildi.", + "Pages have been reversed successfully!": "Sayfalar başarıyla ters çevrildi!", + "Pages to PDF": "Pages'ten PDF'ye", + "Paper Size": "Kağıt Boyutu", + "Paragraph": "Paragraf", + "Parsing XML structure...": "XML yapısı ayrıştırılıyor...", + "Parsing {{name}}...": "{{name}} ayrıştırılıyor...", + "Partial Coverage": "Kısmi Kapsama", + "Partial Success": "Kısmi Başarı", + "Password": "Parola", + "Password Error": "Parola Hatası", + "Password Needed": "Parola Gerekli", + "Password Required": "Parola Gerekli", + "Password for all files": "Tüm dosyalar için parola", + "Password for all locked files": "Kilitli tüm dosyalar için parola", + "Password for {{name}}": "{{name}} için parola", + "Password protected": "Parola korumalı", + "Password required for encrypted private key": "Şifrelenmiş özel anahtar için parola gerekli", + "Path Stroke": "Yol Konturu", + "Please add at least one field before downloading.": "İndirmeden önce lütfen en az bir alan ekleyin.", + "Please draw a rectangle on at least one page to select the crop area.": "Kırpma alanını seçmek için lütfen en az bir sayfada dikdörtgen çizin.", + "Please ensure all page numbers in the order are unique.": "Lütfen sıradaki tüm sayfa numaralarının benzersiz olduğundan emin olun.", + "Please enter a layer name": "Lütfen bir katman adı girin", + "Please enter a name.": "Lütfen bir ad girin.", + "Please enter a number between 0 and {{totalPages}}.": "Lütfen 0 ile {{totalPages}} arasında bir sayı girin.", + "Please enter a page order.": "Lütfen bir sayfa sırası girin.", + "Please enter a password": "Lütfen bir parola girin", + "Please enter a password for {{i}} or skip it": "Lütfen {{i}} için bir parola girin veya atlayın", + "Please enter a title.": "Lütfen bir başlık girin.", + "Please enter a user password.": "Lütfen bir kullanıcı parolası girin.", + "Please enter a valid number of pages (1 or more).": "Lütfen geçerli bir sayfa sayısı girin (1 veya daha fazla).", + "Please enter a valid page number between 1 and {{total}}": "Lütfen 1 ile {{total}} arasında geçerli bir sayfa numarası girin", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Lütfen geçerli bir sayfa aralığı girin (örneğin 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Lütfen çıkarılacak sayfa numaralarını girin.", + "Please enter positive numbers.": "Lütfen pozitif sayılar girin.", + "Please enter some text to convert.": "Lütfen dönüştürülecek bir metin girin.", + "Please enter text for the watermark.": "Lütfen filigran için bir metin girin.", + "Please enter the PDF password.": "Lütfen PDF parolasını girin.", + "Please load a PDF first.": "Lütfen önce bir PDF yükleyin.", + "Please select PDF files to create a ZIP archive.": "ZIP arşivi oluşturmak için lütfen PDF dosyalarını seçin.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Lütfen bir .pem, .crt, .cer veya .der sertifika dosyası seçin.", + "Please select a PDF file.": "Lütfen bir PDF dosyası seçin.", + "Please select a valid PDF file.": "Lütfen geçerli bir PDF dosyası seçin.", + "Please select an area on at least one page to crop.": "Kırpmak için lütfen en az bir sayfada bir alan seçin.", + "Please select an area to crop first.": "Lütfen önce kırpılacak bir alan seçin.", + "Please select an area to crop.": "Lütfen kırpılacak bir alan seçin.", + "Please select an image file for the watermark.": "Lütfen filigran için bir görsel dosyası seçin.", + "Please select at least one BMP file.": "Lütfen en az bir BMP dosyası seçin.", + "Please select at least one CSV file.": "Lütfen en az bir CSV dosyası seçin.", + "Please select at least one Excel file.": "Lütfen en az bir Excel dosyası seçin.", + "Please select at least one HEIC file.": "Lütfen en az bir HEIC dosyası seçin.", + "Please select at least one JPG file.": "Lütfen en az bir JPG dosyası seçin.", + "Please select at least one JPG or JPEG2000 image.": "Lütfen en az bir JPG veya JPEG2000 görseli seçin.", + "Please select at least one ODT file.": "Lütfen en az bir ODT dosyası seçin.", + "Please select at least one PDF file.": "Lütfen en az bir PDF dosyası seçin.", + "Please select at least one PowerPoint file.": "Lütfen en az bir PowerPoint dosyası seçin.", + "Please select at least one RTF file.": "Lütfen en az bir RTF dosyası seçin.", + "Please select at least one SVG file.": "Lütfen en az bir SVG dosyası seçin.", + "Please select at least one TIFF file.": "Lütfen en az bir TIFF dosyası seçin.", + "Please select at least one Word document.": "Lütfen en az bir Word belgesi seçin.", + "Please select at least one file to attach.": "Lütfen eklenecek en az bir dosya seçin.", + "Please select at least one image file.": "Lütfen en az bir görsel dosyası seçin.", + "Please select at least one text file.": "Lütfen en az bir metin dosyası seçin.", + "Please select at least one {{FILETYPE_NAME}} file.": "Lütfen en az bir {{FILETYPE_NAME}} dosyası seçin.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Lütfen en az bir {{TOOL_NAME}} dosyası seçin (.eml veya .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Lütfen en az bir {{TOOL_NAME}} dosyası seçin.", + "Please select even or odd pages.": "Lütfen çift veya tek sayfaları seçin.", + "Please select one or more PDF files.": "Lütfen bir veya daha fazla PDF dosyası seçin.", + "Please select pages to delete.": "Lütfen silinecek sayfaları seçin.", + "Please select pages to duplicate.": "Lütfen çoğaltılacak sayfaları seçin.", + "Please select pages to mark for splitting.": "Lütfen bölmek için işaretlenecek sayfaları seçin.", + "Please select pages to rotate.": "Lütfen döndürülecek sayfaları seçin.", + "Please specify a page range for page-level attachments.": "Lütfen sayfa düzeyindeki ek dosyalar için bir sayfa aralığı belirtin.", + "Please upload PDF files.": "Lütfen PDF dosyalarını yükleyin.", + "Please upload PDFs first.": "Lütfen önce PDF'leri yükleyin.", + "Please upload a .docx file first.": "Lütfen önce bir .docx dosyası yükleyin.", + "Please upload a PDF file first.": "Lütfen önce bir PDF dosyası yükleyin.", + "Please upload a PDF file.": "Lütfen bir PDF dosyası yükleyin.", + "Please upload a PDF first.": "Lütfen önce bir PDF yükleyin.", + "Please upload a valid PDF file.": "Lütfen geçerli bir PDF dosyası yükleyin.", + "Please upload at least one PDF file.": "Lütfen en az bir PDF dosyası yükleyin.", + "Please upload at least two PDF files to alternate and mix.": "Dönüşümlü birleştirmek için lütfen en az iki PDF dosyası yükleyin.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Lütfen hem bir temel PDF hem de bir bindirme/altlık PDF'si yükleyin.", + "Please upload valid PDF files.": "Lütfen geçerli PDF dosyaları yükleyin.", + "Please use the Download button in the PDF viewer toolbar above.": "Lütfen yukarıdaki PDF görüntüleyici araç çubuğundaki İndir düğmesini kullanın.", + "Please wait for the PDF viewer to load.": "Lütfen PDF görüntüleyicinin yüklenmesini bekleyin.", + "Please wait for the form to finish loading.": "Lütfen formun yüklenmesinin bitmesini bekleyin.", + "Portrait": "Dikey", + "Position": "Konum", + "Post-processing for transparency compliance...": "Saydamlık uyumluluğu için son işleme yapılıyor...", + "Posterize": "Posterleştir", + "Posterizing PDF...": "PDF posterleştiriliyor...", + "PowerPoint to PDF": "PowerPoint'ten PDF'ye", + "Pre Flatten": "Önceden Düzleştir", + "Pre-flattening PDF...": "PDF önceden düzleştiriliyor...", + "Prefer JPEG 2000 for photos": "Fotoğraflar için JPEG 2000'i tercih et", + "Preparing PDF export...": "PDF dışa aktarma hazırlanıyor...", + "Preparing conversion...": "Dönüştürme hazırlanıyor...", + "Preparing download...": "İndirme hazırlanıyor...", + "Preparing preview...": "Önizleme hazırlanıyor...", + "Presentations": "Sunumlar", + "Preserve PDF/A": "PDF/A'yı Koru", + "Preview": "Önizleme", + "Preview Error": "Önizleme Hatası", + "Preview Text": "Metin Önizlemesi", + "Previous page": "Önceki sayfa", + "Print Form": "Formu Yazdır", + "Private data that editing apps store inside the PDF.": "Düzenleme uygulamalarının PDF'nin içinde sakladığı özel veriler.", + "Processed {{processedCount}} PDFs.": "{{processedCount}} PDF işlendi.", + "Processing Complete": "İşlem Tamamlandı", + "Processing Dpi": "İşleme DPI'ı", + "Processing Failed": "İşlem Başarısız", + "Processing PDF permissions...": "PDF izinleri işleniyor...", + "Processing attachments...": "Ek dosyalar işleniyor...", + "Processing failed for {{name}}.": "{{name}} için işlem başarısız oldu.", + "Processing file {{n}} of {{length}}...": "Dosya işleniyor: {{n}}/{{length}}...", + "Processing images...": "Görseller işleniyor...", + "Processing multiple PDFs...": "Birden fazla PDF işleniyor...", + "Processing page {{i}} of {{numPages}}": "Sayfa işleniyor: {{i}}/{{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Sayfa işleniyor: {{i}}/{{numPages}}...", + "Processing page {{n}} of {{length}}...": "Sayfa işleniyor: {{n}}/{{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Sayfa işleniyor: {{pageNum}}/{{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Sayfa işleniyor: {{pageNum}}/{{totalPages}}...", + "Processing produced an empty file.": "İşlem boş bir dosya üretti.", + "Processing resulted in an empty file.": "İşlem sonucunda boş bir dosya oluştu.", + "Processing sheet {{n}}...": "Yaprak {{n}} işleniyor...", + "Processing {{name}}...": "{{name}} işleniyor...", + "Processing {{nodeName}}...": "{{nodeName}} işleniyor...", + "Processing {{n}}/{{length}}: {{name}}...": "İşleniyor {{n}}/{{length}}: {{name}}...", + "Processing...": "İşleniyor...", + "Producer": "Üretici", + "Publisher Files": "Publisher Dosyaları", + "Purple": "Mor", + "PyMuPDF (Document Processing)": "PyMuPDF (Belge İşleme)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF yapılandırılmamış. Lütfen Gelişmiş Ayarlar'dan yapılandırın.", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDF modülü beklenen PyMuPDF sınıfını dışa aktarmadı.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF boş bir çözülmüş dosya üretti.", + "PyMuPDF: not configured.": "PyMuPDF: yapılandırılmamış.", + "QR Code": "QR Kodu", + "Quality": "Kalite", + "Quits application (cannot be overridden)": "Uygulamadan çıkar (geçersiz kılınamaz)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1 imzası, imzalayanın genel anahtarıyla doğrulanmıyor", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS imzası, imzalayanın genel anahtarıyla doğrulanmıyor", + "Rasterization Complete": "Rasterleştirme Tamamlandı", + "Rasterization Partial": "Kısmi Rasterleştirme", + "Rasterize": "Rasterleştir", + "Rasterize Dpi": "Rasterleştirme DPI'ı", + "Rasterize pages to images": "Sayfaları görsellere rasterleştir", + "Rasterize quality": "Rasterleştirme kalitesi", + "Rasterize resolution (DPI)": "Rasterleştirme çözünürlüğü (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "{{completed}} PDF rasterleştirildi, {{failed}} başarısız oldu.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "{{name}} rasterleştiriliyor ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "{{name}} rasterleştiriliyor...", + "Rasterizing...": "Rasterleştiriliyor...", + "Rating must be between 0 and 5": "Derecelendirme 0 ile 5 arasında olmalı", + "Read Only": "Salt Okunur", + "Reading CSV file...": "CSV dosyası okunuyor...", + "Reading PDF...": "PDF okunuyor...", + "Reading XML file...": "XML dosyası okunuyor...", + "Reading encrypted PDF...": "Şifrelenmiş PDF okunuyor...", + "Reading files...": "Dosyalar okunuyor...", + "Reading layer configuration...": "Katman yapılandırması okunuyor...", + "Reading {{name}} ({{n}}/{{length}})...": "{{name}} okunuyor ({{n}}/{{length}})...", + "Ready": "Hazır", + "Reason": "Neden", + "Red": "Kırmızı", + "Redact": "Karart", + "Redact Mode": "Karartma Modu", + "Redact text from PDF": "PDF'deki metni karart", + "Redaction Failed": "Karartma Başarısız", + "Reduce PDF file size": "PDF dosya boyutunu küçült", + "Reduce color complexity": "Renk karmaşıklığını azalt", + "Reduces file size by removing color information.": "Renk bilgisini kaldırarak dosya boyutunu küçültür.", + "Reloads page": "Sayfayı yeniden yükler", + "Remove": "Kaldır", + "Remove All Attachments": "Tüm Ek Dosyaları Kaldır", + "Remove Annotations": "Açıklamaları Kaldır", + "Remove Blank Pages": "Boş Sayfaları Kaldır", + "Remove Embedded Files": "Gömülü Dosyaları Kaldır", + "Remove Fonts": "Yazı Tiplerini Kaldır", + "Remove Javascript": "Javascript'i Kaldır", + "Remove Layers": "Katmanları Kaldır", + "Remove Links": "Bağlantıları Kaldır", + "Remove Mark Info": "Mark Info'yu Kaldır", + "Remove Metadata": "Üst Veriyi Kaldır", + "Remove PDF password protection": "PDF parola korumasını kaldır", + "Remove Structure Tree": "Yapı Ağacını Kaldır", + "Remove alternate images": "Alternatif görselleri kaldır", + "Remove application data": "Uygulama verilerini kaldır", + "Remove article threads": "Makale dizilerini kaldır", + "Remove attachment": "Ek dosyayı kaldır", + "Remove blank pages automatically": "Boş sayfaları otomatik kaldır", + "Remove document structure tree": "Belge yapı ağacını kaldır", + "Remove file": "Dosyayı kaldır", + "Remove metadata, scripts, and hidden data": "Üst veriyi, betikleri ve gizli verileri kaldır", + "Remove output intents": "Çıktı amaçlarını kaldır", + "Remove page thumbnails": "Sayfa küçük resimlerini kaldır", + "Remove specific pages": "Belirli sayfaları kaldır", + "Remove web capture information": "Web yakalama bilgilerini kaldır", + "Remove {{name}}": "{{name}} dosyasını kaldır", + "Removed \"{{beforeText}}\"": "\"{{beforeText}}\" kaldırıldı", + "Removed image ({{width}}×{{height}})": "Görsel kaldırıldı ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "{{length}} boş sayfa başarıyla kaldırıldı!", + "Removing all metadata...": "Tüm üst veri kaldırılıyor...", + "Removing annotations...": "Açıklamalar kaldırılıyor...", + "Removing redacted text from document data...": "Karartılan metin belge verisinden kaldırılıyor...", + "Removing restrictions...": "Kısıtlamalar kaldırılıyor...", + "Removing {{length}} blank page(s)...": "{{length}} boş sayfa kaldırılıyor...", + "Render Error": "Oluşturma Hatası", + "Rendering Page {{num}}...": "Sayfa {{num}} oluşturuluyor...", + "Rendering page previews...": "Sayfa önizlemeleri oluşturuluyor...", + "Rendering page previews: {{current}}/{{total}}": "Sayfa önizlemeleri oluşturuluyor: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Sayfa oluşturuluyor: {{n}}/{{length}}...", + "Rendering preview for page {{pageNum}}...": "{{pageNum}}. sayfanın önizlemesi oluşturuluyor...", + "Reopens closed tab": "Kapatılan sekmeyi yeniden açar", + "Repair": "Onar", + "Repair Failed": "Onarım Başarısız", + "Repair corrupted PDF": "Bozuk PDF'yi onar", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "{{length}} dosya onarıldı. Onarılamayanlar: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "{{name}} onarılıyor ({{n}}/{{length}})...", + "Repairing {{name}}...": "{{name}} onarılıyor...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "\"{{beforeText}}\" yerine \"{{afterText}}\" yazıldı", + "Required": "Zorunlu", + "Resamples even when an image is only slightly above the limit.": "Bir görsel sınırın yalnızca biraz üzerindeyse bile yeniden örnekler.", + "Reset Form": "Formu Sıfırla", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Sıfırlanıp dosya yükleyiciye dönülsün mü? Kaydedilmemiş tüm değişiklikler kaybolacak.", + "Resolution": "Çözünürlük", + "Retain Page Labels": "Sayfa Etiketlerini Koru", + "Retry Failed": "Başarısızları Yeniden Dene", + "Reverse Pages": "Sayfaları Ters Çevir", + "Reverse page order": "Sayfa sırasını ters çevir", + "Reversing page order...": "Sayfa sırası ters çevriliyor...", + "Reversing {{name}} ({{n}}/{{length}})...": "{{name}} ters çevriliyor ({{n}}/{{length}})...", + "Right": "Sağ", + "Right edge in points": "Punto cinsinden sağ kenar", + "Rotate": "Döndür", + "Rotate +90°": "+90° Döndür", + "Rotate all pages": "Tüm sayfaları döndür", + "Rotation": "Döndürme", + "Rotation Variance": "Döndürme Varyansı", + "Rotations applied successfully!": "Döndürmeler başarıyla uygulandı!", + "Rows": "Satır", + "Run Javascript": "Javascript Çalıştır", + "Running OCR on page {{pageNum}}...": "{{pageNum}}. sayfada OCR çalıştırılıyor...", + "Running...": "Çalışıyor...", + "SVG": "SVG", + "SVG Files": "SVG Dosyaları", + "SVG to PDF": "SVG'den PDF'ye", + "Sanitize": "Temizle", + "Sanitized With Warnings": "Uyarılarla Temizlendi", + "Sanitizing PDF...": "PDF temizleniyor...", + "Saturation": "Doygunluk", + "Saved": "Kaydedildi", + "Saving PDF with layer changes...": "PDF katman değişiklikleriyle kaydediliyor...", + "Scaling Mode": "Ölçekleme Modu", + "Scanner Effect": "Tarayıcı Efekti", + "Scanner effect applied successfully!": "Tarayıcı efekti başarıyla uygulandı!", + "Scanning page {{n}} of {{pageCount}}...": "Sayfa taranıyor: {{n}}/{{pageCount}}...", + "Search Text": "Metin Ara", + "Search languages...": "Dil ara...", + "Select Font": "Yazı Tipi Seç", + "Select a field to edit properties": "Özelliklerini düzenlemek için bir alan seçin", + "Select a field...": "Bir alan seçin...", + "Select to add this button to an existing group": "Bu düğmeyi mevcut bir gruba eklemek için seçin", + "Selected Option": "Seçili Seçenek", + "Self-Signed: Signer Identity Not Verified": "Kendinden İmzalı: İmzalayanın Kimliği Doğrulanmadı", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Kendi sunucunuzdaki OCR varlıkları kısmen yapılandırılmış. {{missing}} değerini diğer Tesseract varlık URL'leriyle birlikte ayarlayın.", + "Separator": "Ayırıcı", + "Separator Color": "Ayırıcı Rengi", + "Separator Thickness": "Ayırıcı Kalınlığı", + "Sepia": "Sepya", + "Serial Number:": "Seri Numarası:", + "Set custom destination": "Özel hedef ayarla", + "Shapes": "Şekiller", + "Sheet {{n}} {{sideLabel}}": "Yaprak {{n}} {{sideLabel}}", + "Show": "Göster", + "Show password": "Parolayı göster", + "Show/Hide Field": "Alanı Göster/Gizle", + "Sign Here": "Buraya İmzalayın", + "Signature /Contents is not a single DER object followed by zero padding": "İmza /Contents, sıfır dolgusuyla biten tek bir DER nesnesi değil", + "Signature Algorithm:": "İmza Algoritması:", + "Signature Intact: Signer Identity Not Verified": "İmza Bozulmamış: İmzalayanın Kimliği Doğrulanmadı", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "İmza alanları AcroForm imza alanlarıdır ve yalnızca gelişmiş bir PDF görüntüleyicide görünür.", + "Signature has a missing or malformed /ByteRange": "İmzada /ByteRange eksik veya hatalı biçimli", + "Signature scheme {{kind}} not implemented": "{{kind}} imza şeması uygulanmadı", + "Signature {{n}}": "İmza {{n}}", + "Signatures": "İmzalar", + "Signed By": "İmzalayan", + "Signed On": "İmza Tarihi", + "Signed PDF Not Changed": "İmzalı PDF Değişmedi", + "Signed PDF downloaded successfully!": "İmzalı PDF başarıyla indirildi!", + "Signed PDF saved successfully!": "İmzalı PDF başarıyla kaydedildi!", + "Simple (1, 2, 3)": "Basit (1, 2, 3)", + "Simplify large color profiles": "Büyük renk profillerini basitleştir", + "Skew Threshold": "Eğrilik Eşiği", + "Skip": "Atla", + "Skip All": "Tümünü Atla", + "Skip Remaining": "Kalanları Atla", + "Skip this file": "Bu dosyayı atla", + "Skipped: {{join}}.": "Atlananlar: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Dosyalar daha küçük olur, ancak yalnızca Brotli destekleyen okuyucular açabilir; örneğin Firefox, MuPDF 1.26+ ve Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Bazı dosyalar desteklenen görsel olmadığı için atlandı.", + "Some files were skipped. Only BMP files are allowed.": "Bazı dosyalar atlandı. Yalnızca BMP dosyalarına izin verilir.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Bazı dosyalar atlandı. Yalnızca HEIC/HEIF dosyalarına izin verilir.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Bazı dosyalar atlandı. Yalnızca JPG, JPEG, JP2 ve JPX dosyalarına izin verilir.", + "Some files were skipped. Only PDF files are allowed.": "Bazı dosyalar atlandı. Yalnızca PDF dosyalarına izin verilir.", + "Some files were skipped. Only PNG images are allowed.": "Bazı dosyalar atlandı. Yalnızca PNG görsellerine izin verilir.", + "Some files were skipped. Only SVG graphics are allowed.": "Bazı dosyalar atlandı. Yalnızca SVG grafiklerine izin verilir.", + "Some files were skipped. Only TIFF files are allowed.": "Bazı dosyalar atlandı. Yalnızca TIFF dosyalarına izin verilir.", + "Some files were skipped. Only WebP images are allowed.": "Bazı dosyalar atlandı. Yalnızca WebP görsellerine izin verilir.", + "Some files were skipped. Only supported image formats are allowed.": "Bazı dosyalar atlandı. Yalnızca desteklenen görsel biçimlerine izin verilir.", + "Some files were skipped. Only text files are allowed.": "Bazı dosyalar atlandı. Yalnızca metin dosyalarına izin verilir.", + "Some pages could not be processed. Please try again.": "Bazı sayfalar işlenemedi. Lütfen tekrar deneyin.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Bazı karartma işaretleri uygulanamadığı için dosya indirilmedi. Düzenleyicide uygulayın veya kaldırın, ardından tekrar deneyin.", + "Spacing": "Aralık", + "Split PDF": "PDF Böl", + "Split by Bookmarks": "Yer İşaretlerine Göre Böl", + "Split pages into tile grid for poster printing": "Poster baskısı için sayfaları döşeme ızgarasına böl", + "Split pages vertically or horizontally": "Sayfaları dikey veya yatay olarak böl", + "Splitting PDF pages...": "PDF sayfaları bölünüyor...", + "Splitting PDF...": "PDF bölünüyor...", + "Spreadsheets": "Elektronik Tablolar", + "Standard (192 DPI)": "Standart (192 DPI)", + "Standard Size": "Standart Boyut", + "Standardize all pages to a target size": "Tüm sayfaları hedef boyuta standartlaştır", + "Standardizing pages...": "Sayfalar standartlaştırılıyor...", + "Stitch all pages into one continuous page": "Tüm sayfaları tek bir kesintisiz sayfada birleştir", + "Straighten skewed PDF pages": "Eğri PDF sayfalarını düzelt", + "Strip all annotations": "Tüm açıklamaları temizle", + "Style": "Stil", + "Style Changed": "Stil Değişti", + "Style changed ({{length}} regions)": "Stil değişti ({{length}} bölge)", + "Subject": "Konu", + "Subset embedded fonts": "Gömülü yazı tiplerinin alt kümesini al", + "Success": "Başarılı", + "Success!": "Başarılı!", + "Successfully converted {{length}} CSV file(s) to PDF.": "{{length}} CSV dosyası başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} Excel file(s) to PDF.": "{{length}} Excel dosyası başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} ODT file(s) to PDF.": "{{length}} ODT dosyası başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} PDF(s) to DOCX.": "{{length}} PDF başarıyla DOCX'e dönüştürüldü.", + "Successfully converted {{length}} PDF(s) to Markdown.": "{{length}} PDF başarıyla Markdown'a dönüştürüldü.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "{{length}} PDF başarıyla {{level}} biçimine dönüştürüldü.", + "Successfully converted {{length}} PSD files to a single PDF.": "{{length}} PSD dosyası başarıyla tek bir PDF'ye dönüştürüldü.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "{{length}} PowerPoint dosyası başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} RTF file(s) to PDF.": "{{length}} RTF dosyası başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} Word document(s) to PDF.": "{{length}} Word belgesi başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} files to PDF.": "{{length}} dosya başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "{{length}} {{TOOL_NAME}} dosyası başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{name}} to DOCX.": "{{name}} başarıyla DOCX'e dönüştürüldü.", + "Successfully converted {{name}} to Markdown.": "{{name}} başarıyla Markdown'a dönüştürüldü.", + "Successfully converted {{name}} to PDF.": "{{name}} başarıyla PDF'ye dönüştürüldü.", + "Successfully converted {{name}} to {{level}}.": "{{name}} başarıyla {{level}} biçimine dönüştürüldü.", + "Successfully extracted PDF for AI/LLM use.": "PDF, yapay zeka/LLM kullanımı için başarıyla çıkarıldı.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "{{completed}} PDF, yapay zeka/LLM kullanımı için başarıyla çıkarıldı.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF, {{dpi}} DPI'da başarıyla rasterleştirildi.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "{{completed}} PDF, {{dpi}} DPI'da başarıyla rasterleştirildi.", + "Supported: CBZ, CBR": "Desteklenenler: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Desteklenenler: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Desteklenenler: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Desteklenenler: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Desteklenenler: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Desteklenenler: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Desteklenenler: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Desteklenenler: XPS, OXPS", + "Switches apps": "Uygulamalar arasında geçiş yapar", + "Switches tabs": "Sekmeler arasında geçiş yapar", + "Table of Contents": "İçindekiler", + "Table {{n}} (Page {{page}})": "Tablo {{n}} (Sayfa {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Hedef Alan", + "Target Kilobytes": "Hedef Kilobayt", + "Target Not Reached": "Hedefe Ulaşılamadı", + "Target Size": "Hedef Boyut", + "Technical Details": "Teknik Ayrıntılar", + "Temperature": "Sıcaklık", + "Template \"{{name}}\" loaded.": "\"{{name}}\" şablonu yüklendi.", + "Template \"{{name}}\" saved.": "\"{{name}}\" şablonu kaydedildi.", + "Text": "Metin", + "Text Color": "Metin Rengi", + "Text Files": "Metin Dosyaları", + "Text color changed successfully!": "Metin rengi başarıyla değiştirildi!", + "Text converted to PDF successfully!": "Metin başarıyla PDF'ye dönüştürüldü!", + "Text extracted successfully!": "Metin başarıyla çıkarıldı!", + "Text to PDF": "Metinden PDF'ye", + "That password did not open any of the remaining files.": "Bu parola kalan dosyaların hiçbirini açmadı.", + "The PDF file(s) do not contain any attachments to extract.": "PDF dosyalarında çıkarılacak ek dosya yok.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF {{totalPages}} sayfa içeriyor ve bu sayı {{nValue}} değerine tam bölünmüyor. Son PDF {{remainder}} sayfa içerecek.", + "The PDF might be corrupted or password protected.": "PDF bozuk veya parola korumalı olabilir.", + "The PDF might be corrupted or password-protected.": "PDF bozuk veya parola korumalı olabilir.", + "The PDF might be corrupted.": "PDF bozuk olabilir.", + "The PDF viewer is still initializing.": "PDF görüntüleyici hâlâ başlatılıyor.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF indirildi, ancak şu adımlar tamamlanamadı: {{join}}. Bunların kapsadığı içerik dosyada kalmış olabilir.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL beklenmeyen bir içerik türü döndürdü: {{contentType}}. Bir JavaScript dosyası bekleniyordu.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "/ByteRange dışında kalan baytlar tam olarak onaltılık kodlanmış bir imza değil", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "/ByteRange dışında kalan baytlar bu imzanın /Contents alanı değil", + "The compression engine returned an unreadable result.": "Sıkıştırma motoru okunamayan bir sonuç döndürdü.", + "The compression engine stopped unexpectedly.": "Sıkıştırma motoru beklenmedik şekilde durdu.", + "The current password you entered is incorrect. Please try again.": "Girdiğiniz mevcut parola hatalı. Lütfen tekrar deneyin.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Aşağıdaki alan adları yüklenen PDF'de zaten var: {{conflictList}}. İndirmeden önce lütfen bu alanları yeniden adlandırın.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Aşağıdaki alan adları birden fazla kez kullanılıyor: {{duplicateList}}. İndirmeden önce lütfen bu alanları benzersiz adlarla yeniden adlandırın.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Belirtilen sayfa sayısı ({{length}}) belgedeki mevcut sayfa sayısıyla ({{currentGridCount}}) eşleşmiyor. Lütfen tüm sayfalar için eksiksiz bir sıralama girin.", + "The password you entered is incorrect. Please try again.": "Girdiğiniz parola hatalı. Lütfen tekrar deneyin.", + "The password you entered is wrong or the file is corrupted.": "Girdiğiniz parola hatalı veya dosya bozuk.", + "The provided file could not be loaded as an image. It may be corrupted.": "Verilen dosya görsel olarak yüklenemedi. Bozuk olabilir.", + "The requested OCR language is not available: {{unavailableText}}.": "İstenen OCR dili mevcut değil: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Belirtilen sayfa sırası eksik veya geçersiz sayfa numaraları içeriyor. Lütfen her özgün sayfa için yeni bir konum girdiğinizden emin olun.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Bu dosyalar geçerli PDF olmadığı için eklenmedi: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Bu dosyalar parola korumalı: {{names}}. Parolalarını dosya kartlarına girin veya dosyaları kaldırın, ardından tekrar sıkıştırın.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Bu BentoPDF sürümü yalnızca {{availableText}} için OCR verisi içerir.", + "This PDF does not contain any digital signatures.": "Bu PDF dijital imza içermiyor.", + "This PDF has no layers (OCG).": "Bu PDF'de katman (OCG) yok.", + "This PDF is password-protected. Please enter the current password to proceed.": "Bu PDF parola korumalı. Devam etmek için lütfen mevcut parolayı girin.", + "This document contains pages with different dimensions:": "Bu belge farklı boyutlarda sayfalar içeriyor:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Bu belgede henüz uygulanmamış 1 karartma işareti var. Bir işaret uygulanana kadar altındaki içerik dosyada kalır. Tüm işaretler uygulanıp indirilsin mi?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Bu belgede henüz uygulanmamış {{count}} karartma işareti var. Bir işaret uygulanana kadar altındaki içerik dosyada kalır. Tüm işaretler uygulanıp indirilsin mi?", + "This feature requires {{name}} to be configured.": "Bu özellik için {{name}} yapılandırılmalıdır.", + "This file is not a valid PDF.": "Bu dosya geçerli bir PDF değil.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Bu modül AGPL-3.0 lisansı altındadır. Yapılandırarak lisans koşullarını kabul etmiş olursunuz.", + "This tool has been disabled": "Bu araç devre dışı bırakıldı", + "This tool is not available in your deployment. Contact your administrator for more information.": "Bu araç dağıtımınızda kullanılamıyor. Daha fazla bilgi için yöneticinizle iletişime geçin.", + "Threshold": "Eşik", + "Tile": "Döşeme", + "Tile Gap X": "Döşeme Boşluğu X", + "Tile Gap Y": "Döşeme Boşluğu Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Zaman Damgası", + "Timestamp Failed": "Zaman Damgası Başarısız", + "Tint": "Renk Tonu", + "Title": "Başlık", + "To actually fill or change the options, use our PDF Form Filler tool.": "Seçenekleri gerçekten doldurmak veya değiştirmek için PDF Form Doldurucu aracımızı kullanın.", + "Toggle": "Aç/Kapat", + "Toggle style": "Stili aç/kapat", + "Toggle sync scroll": "Eşzamanlı kaydırmayı aç/kapat", + "Tool Unavailable": "Araç Kullanılamıyor", + "Tooltip / Help Text": "İpucu / Yardım Metni", + "Top": "Üst", + "Top Center": "Üst Orta", + "Top Left": "Üst Sol", + "Top Right": "Üst Sağ", + "Top edge in points": "Punto cinsinden üst kenar", + "Total Pages": "Toplam Sayfa", + "Transparent Background": "Saydam Arka Plan", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Her görsel için JPEG 2000'i JPEG ile karşılaştırır ve küçük olanı tutar.", + "Trim margins from all pages": "Tüm sayfalardaki kenar boşluklarını kırp", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Güven doğrulaması: {{trustVerified}}/{{length}} imza özel sertifikaya göre doğrulandı", + "Trusted": "Güvenilir", + "Trusted certificate loaded": "Güvenilir sertifika yüklendi", + "Tsa Url": "TSA URL'si", + "Turns off quality, resolution and every other lossy image step.": "Kalite, çözünürlük ve diğer tüm kayıplı görsel adımlarını kapatır.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL http:// veya https:// ile başlamalıdır", + "Ultra (384 DPI)": "Ultra (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "PDF'nin şifresi verilen parolayla çözülemedi.", + "Unable to repair any of the uploaded PDF files.": "Yüklenen PDF dosyalarının hiçbiri onarılamadı.", + "Unembed standard fonts": "Standart yazı tiplerinin gömülmesini kaldır", + "Unembed standard-font look-alikes": "Standart yazı tiplerine benzeyenlerin gömülmesini kaldır", + "Unexpected delimiter in content stream": "İçerik akışında beklenmeyen ayırıcı", + "Unexpected reply from the engine.": "Motordan beklenmeyen yanıt.", + "Uniform": "Tekdüze", + "Unique Page Sizes": "Benzersiz Sayfa Boyutları", + "Unknown": "Bilinmiyor", + "Unknown error": "Bilinmeyen hata", + "Unknown error occurred in worker.": "Çalışanda bilinmeyen hata oluştu.", + "Unknown error occurred.": "Bilinmeyen hata oluştu.", + "Unlock": "Kilidi Aç", + "Unlock All": "Tümünün Kilidini Aç", + "Unlock Remaining ({{remaining}})": "Kalanların Kilidini Aç ({{remaining}})", + "Unlocked": "Kilidi Açıldı", + "Unlocked {{unlocked}} of {{length}} files.": "{{length}} dosyadan {{unlocked}} tanesinin kilidi açıldı.", + "Unlocking...": "Kilit açılıyor...", + "Unresolved optional content reference": "Çözümlenmemiş isteğe bağlı içerik başvurusu", + "Unsupported ECDSA curve in signer certificate": "İmzalayan sertifikasında desteklenmeyen ECDSA eğrisi", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Desteklenmeyen Görsel. Lütfen filigran için PNG veya JPG kullanın.", + "Unsupported digest OID {{digestOid}}": "Desteklenmeyen özet OID'si {{digestOid}}", + "Unsupported file type: .{{ext}}": "Desteklenmeyen dosya türü: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Desteklenmeyen imza algoritması OID'si {{oid}}", + "Unterminated array or dictionary in content stream": "İçerik akışında sonlandırılmamış dizi veya sözlük", + "Unterminated hex string in content stream": "İçerik akışında sonlandırılmamış onaltılık dize", + "Unterminated inline image in content stream": "İçerik akışında sonlandırılmamış satır içi görsel", + "Unterminated string in content stream": "İçerik akışında sonlandırılmamış dize", + "Unverified: Unsupported Signature Algorithm": "Doğrulanamadı: Desteklenmeyen İmza Algoritması", + "Updating metadata...": "Üst veri güncelleniyor...", + "Upload Certificate": "Sertifika Yükle", + "Upload Comics": "Çizgi Romanları Yükle", + "Upload Documents": "Belgeleri Yükle", + "Upload EPUB Files": "EPUB Dosyalarını Yükle", + "Upload Email Files": "E-posta Dosyalarını Yükle", + "Upload FB2 Files": "FB2 Dosyalarını Yükle", + "Upload Images": "Görselleri Yükle", + "Upload JSON Files": "JSON Dosyalarını Yükle", + "Upload MOBI Files": "MOBI Dosyalarını Yükle", + "Upload Markdown Files": "Markdown Dosyalarını Yükle", + "Upload ODG Files": "ODG Dosyalarını Yükle", + "Upload PDFs": "PDF'leri Yükle", + "Upload PUB Files": "PUB Dosyalarını Yükle", + "Upload Pages Files": "Pages Dosyalarını Yükle", + "Upload Presentations": "Sunumları Yükle", + "Upload SVG Files": "SVG Dosyalarını Yükle", + "Upload Spreadsheets": "Elektronik Tabloları Yükle", + "Upload Text Files": "Metin Dosyalarını Yükle", + "Upload Visio Files": "Visio Dosyalarını Yükle", + "Upload WPD Files": "WPD Dosyalarını Yükle", + "Upload WPS Files": "WPS Dosyalarını Yükle", + "Upload XML Files": "XML Dosyalarını Yükle", + "Upload XPS Files": "XPS Dosyalarını Yükle", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Kitapçık düzenini görmek için bir PDF yükleyin ve \"Önizleme Oluştur\"a tıklayın", + "Upload images and convert to PDF": "Görselleri yükleyin ve PDF'ye dönüştürün", + "Upload one or more PDF files": "Bir veya daha fazla PDF dosyası yükleyin", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Büyük harf A-Z, rakamlar 0-9 ve - . $ / + % BOŞLUK", + "Use same password for all files": "Tüm dosyalar için aynı parolayı kullan", + "User Password": "Kullanıcı Parolası", + "VSD to PDF": "VSD'den PDF'ye", + "Valid From": "Geçerlilik Başlangıcı", + "Valid Signature": "Geçerli İmza", + "Valid Until": "Geçerlilik Bitişi", + "Validating {{n}} of {{length}}: {{name}}": "Doğrulanıyor {{n}}/{{length}}: {{name}}", + "Validating...": "Doğrulanıyor...", + "Value": "Değer", + "Value (e.g., Marketing)": "Değer (örneğin Pazarlama)", + "Vertical": "Dikey", + "Viewer not ready": "Görüntüleyici hazır değil", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Görüntüleyici hazır değil. Lütfen bir PDF yükleyin ve yüklenmesinin bitmesini bekleyin.", + "Visibility": "Görünürlük", + "Visio Files": "Visio Dosyaları", + "WPD to PDF": "WPD'den PDF'ye", + "WPS Files": "WPS Dosyaları", + "WPS to PDF": "WPS'den PDF'ye", + "Watermark": "Filigran", + "Watermark added successfully!": "Filigran başarıyla eklendi!", + "Web Crypto API not available in this context": "Web Crypto API bu bağlamda kullanılamıyor", + "Web Crypto import/verify failed: {{error}}": "Web Crypto içe aktarma/doğrulama başarısız oldu: {{error}}", + "WebP": "WebP", + "Whitelist": "İzin Listesi", + "Width ({{unit}})": "Genişlik ({{unit}})", + "Word": "Word", + "Word Documents": "Word Belgeleri", + "Word to PDF": "Word'den PDF'ye", + "WordPerfect Files": "WordPerfect Dosyaları", + "Worker crashed": "Çalışan çöktü", + "Worker error occurred. Check console for details.": "Çalışan hatası oluştu. Ayrıntılar için konsolu kontrol edin.", + "Workflow completed": "İş akışı tamamlandı", + "Wrong password": "Yanlış parola", + "Wrong password for: {{join}}": "Şunlar için yanlış parola: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Parola yanlış veya \"{{name}}\" dosyasının şifresi çözülemedi.", + "X Position": "X Konumu", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XML Dosyaları", + "XML to PDF": "XML'den PDF'ye", + "XMP Metadata": "XMP Üst Verisi", + "XPS Files": "XPS Dosyaları", + "XPS to PDF": "XPS'den PDF'ye", + "Y Position": "Y Konumu", + "Year must be between 1900 and 2100": "Yıl 1900 ile 2100 arasında olmalı", + "Yellow": "Sarı", + "Yellowish": "Sarımsı", + "You cannot delete the last page of the document.": "Belgenin son sayfasını silemezsiniz.", + "Your PDF has been cropped and the download has started.": "PDF'niz kırpıldı ve indirme başladı.", + "Your PDF has been downloaded successfully.": "PDF'niz başarıyla indirildi.", + "Your PDF has been posterized.": "PDF'niz posterleştirildi.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Karartmalarınız sayfalara uygulandı, ancak bu dosya şifreli olduğundan BentoPDF karartılan metnin kopyalarını özelliklerinden, yer işaretlerinden ve ek dosyalarından da kaldıramıyor. Tam temizlik için şifresiz bir kopyayı karartın ve ardından PDF'yi Parolayla Koru ile parola ekleyin. Yine de indirilsin mi?", + "Your workflow needs at least one input node and one output node to run.": "İş akışının çalışması için en az bir giriş düğümü ve bir çıkış düğümü gerekir.", + "ZIP archive created successfully!": "ZIP arşivi başarıyla oluşturuldu!", + "Zoom(%)": "Yakınlaştırma (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "örn. gg/aa/yyyy SS:DD:ss", + "form": "form", + "https://example.com": "https://example.com", + "signature found": "imza bulundu", + "signatures found": "imza bulundu", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} düğüm", + "{{count}} nodes": "{{count}} düğüm", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 sayfa", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} sayfa", + "{{length}} Files Need a Password": "{{length}} Dosya Parola Gerektiriyor", + "{{length}} PDF file(s) selected": "{{length}} PDF dosyası seçildi", + "{{length}} PDF files selected": "{{length}} PDF dosyası seçildi", + "{{length}} attachment(s) extracted successfully!": "{{length}} ek dosya başarıyla çıkarıldı!", + "{{length}} file • {{totalPages}} total pages": "{{length}} dosya • toplam {{totalPages}} sayfa", + "{{length}} file(s) attached successfully.": "{{length}} dosya başarıyla eklendi.", + "{{length}} files • {{totalPages}} total pages": "{{length}} dosya • toplam {{totalPages}} sayfa", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Parola korumalıydı, bu nedenle sıkıştırılmış kopyada parola yok. Yeniden eklemek için PDF'yi Parolayla Koru aracını kullanın.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} sayfa)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} dijital olarak imzalı olduğundan olduğu gibi bırakıldı. Sıkıştırmak imzayı bozar. Yine de sıkıştırmak için Özel Ayarlar altında İçerik korumasını geçersiz kıl seçeneğini açın; imzaları kaldırılır.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} geçerli bir PDF olmadığı için eklenmedi.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} parola korumalı. Parolasını dosya kartına girin, ardından tekrar sıkıştırın.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (s.{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Sayfa sayısı yüklenemedi", + "{{size}} • Loading pages...": "{{size}} • Sayfalar yükleniyor...", + "{{size}} • Loading...": "{{size}} • Yükleniyor...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} sayfa", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} sayfa", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} sayfa", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} sayfa", + "{{size}} • {{value}} pages": "{{size}} • {{value}} sayfa", + "{{successCount}} PDF(s) decrypted successfully.": "{{successCount}} PDF'nin şifresi başarıyla çözüldü.", + "{{successCount}} PDF(s) linearized successfully.": "{{successCount}} PDF başarıyla doğrusallaştırıldı.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} sayfa → {{numSheets}} çıktı yaprağı", + "{{validCount}} valid": "{{validCount}} geçerli", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 sayfa", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} sayfa" +} diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 4d490cfc..2ab9e413 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Відкрити головне меню", "language": "Мова", "searchLanguage": "Пошук мови…", - "noLanguagesFound": "Мови не знайдено" + "noLanguagesFound": "Мови не знайдено", + "breadcrumb": "Навігаційний ланцюжок" }, "donation": { "message": "Подобається BentoPDF? Допоможіть нам залишатися безкоштовними та з відкритим кодом!", @@ -32,11 +33,11 @@ "bentoPdf": "BentoPDF?", "noSignup": { "title": "Без реєстрації", - "description": "Почніть одразу — без акаунтів і email." + "description": "Почніть одразу: без акаунтів і email." }, "noUploads": { "title": "Без завантаження на сервер", - "description": "100% обробка на вашому пристрої — файли не покидають його." + "description": "100% обробка на вашому пристрої, файли не покидають його." }, "foreverFree": { "title": "Завжди безкоштовно", @@ -44,7 +45,7 @@ }, "noLimits": { "title": "Без обмежень", - "description": "Користуйтеся скільки завгодно — без прихованих лімітів." + "description": "Користуйтеся скільки завгодно, без прихованих лімітів." }, "batchProcessing": { "title": "Пакетна обробка", @@ -61,7 +62,7 @@ "subtitle": "Оберіть інструмент, щоб відкрити завантаження файлів", "searchPlaceholder": "Пошук інструмента (наприклад, «розділити», «організувати»...)", "backToTools": "Назад до інструментів", - "firstLoadNotice": "Перший запуск може зайняти трохи часу — завантажується модуль обробки. Після цього все працюватиме миттєво." + "firstLoadNotice": "Перший запуск може зайняти трохи часу, бо завантажується модуль обробки. Після цього все працюватиме миттєво." }, "upload": { "clickToSelect": "Натисніть, щоб вибрати файл", @@ -188,7 +189,7 @@ "sectionTitle": "Поширені запитання", "isFree": { "question": "Чи справді BentoPDF безкоштовний?", - "answer": "Так, абсолютно. Усі інструменти BentoPDF на 100% безкоштовні — без обмежень на файли, без реєстрації та без водяних знаків. Ми вважаємо, що кожен має мати доступ до простих і потужних PDF-інструментів без платних обмежень." + "answer": "Так, абсолютно. Усі інструменти BentoPDF на 100% безкоштовні: без обмежень на файли, без реєстрації та без водяних знаків. Ми вважаємо, що кожен має мати доступ до простих і потужних PDF-інструментів без платних обмежень." }, "areFilesSecure": { "question": "Чи безпечні мої файли? Де вони обробляються?", @@ -196,7 +197,7 @@ }, "platforms": { "question": "Чи працює це на Mac, Windows та мобільних пристроях?", - "answer": "Так! Оскільки BentoPDF працює повністю у браузері, він підтримується на будь-якій ОС із сучасним браузером — Windows, macOS, Linux, iOS та Android." + "answer": "Так! Оскільки BentoPDF працює повністю у браузері, він підтримується на будь-якій ОС із сучасним браузером: Windows, macOS, Linux, iOS та Android." }, "gdprCompliant": { "question": "Чи відповідає BentoPDF вимогам GDPR?", @@ -216,7 +217,7 @@ }, "analytics": { "question": "Чи використовуєте ви cookies або аналітику?", - "answer": "Ні. BentoPDF вас ніяк не відстежує. Ми не використовуємо файли cookie, аналітику чи скрипти відстеження — навіть на робочому сайті bentopdf.com. Ми ніколи не знаємо, хто ви і що ви робите з інструментами." + "answer": "Ні. BentoPDF вас ніяк не відстежує. Ми не використовуємо файли cookie, аналітику чи скрипти відстеження, навіть на робочому сайті bentopdf.com. Ми ніколи не знаємо, хто ви і що ви робите з інструментами." } }, "testimonials": { @@ -226,7 +227,7 @@ }, "support": { "title": "Подобається моя робота?", - "description": "BentoPDF — це проєкт, створений із захопленням, щоб надати безкоштовний, приватний і потужний набір PDF-інструментів для всіх. Якщо він вам корисний — підтримайте його розвиток. Кожна кава має значення!", + "description": "BentoPDF це проєкт, створений із захопленням, щоб надати безкоштовний, приватний і потужний набір PDF-інструментів для всіх. Якщо він вам корисний, підтримайте його розвиток. Кожна кава має значення!", "buyMeCoffee": "Пригостити кавою" }, "footer": { @@ -236,6 +237,10 @@ "aboutUs": "Про нас", "faqLink": "FAQ", "contactUs": "Контакти", + "tools": "Інструменти", + "pdfConverter": "Конвертер PDF", + "pdfSecurity": "Безпека PDF", + "mergeSplit": "Об'єднання та поділ PDF", "legal": "Правова інформація", "termsAndConditions": "Умови використання", "privacyPolicy": "Політика конфіденційності", @@ -309,22 +314,22 @@ }, "noAccount": { "title": "Без акаунта", - "description": "Почніть одразу — без email і реєстрації." + "description": "Почніть одразу: без email і реєстрації." }, "openSource": { - "title": "Open Source", + "title": "Відкритий код", "description": "Створено з використанням відкритих бібліотек і з орієнтацією на прозорість." } }, "cta": { "title": "Готові почати?", - "description": "Приєднуйтесь до тисяч користувачів BentoPDF.", + "description": "Приєднуйтесь до тисяч користувачів, які щодня довіряють BentoPDF роботу з документами. Відчуйте, що дають приватність і продуктивність.", "button": "Переглянути всі інструменти" } }, "contact": { "title": "Зв’яжіться з нами", - "subtitle": "Ми раді зворотному зв’язку — питання, ідеї чи пропозиції.", + "subtitle": "Ми раді зворотному зв’язку: питання, ідеї чи пропозиції.", "email": "Напишіть нам на email:" }, "licensing": { diff --git a/public/locales/uk/tools.json b/public/locales/uk/tools.json index dc56df5e..50120864 100644 --- a/public/locales/uk/tools.json +++ b/public/locales/uk/tools.json @@ -21,13 +21,28 @@ "convertToPdf": "Конвертувати в PDF", "pdfMultiTool": { "name": "PDF мультиінструмент", - "subtitle": "Об’єднання, розділення, впорядкування, видалення, обертання, додавання порожніх сторінок, витяг та дублювання — все в одному інтерфейсі." + "subtitle": "Об’єднання, розділення, впорядкування, видалення, обертання, додавання порожніх сторінок, витяг та дублювання: все в одному інтерфейсі." }, "mergePdf": { "name": "Об’єднати PDF", "subtitle": "Об’єднати кілька PDF у один файл. Закладки зберігаються.", "retainPageLabels": "Зберігати оригінальні мітки сторінок з кожного файлу", - "retainPageLabelsHint": "Вимкнено (за замовчуванням): об’єднаний PDF використовує природну нумерацію 1–N. Увімкнено: оригінальні мітки сторінок кожного файлу зберігаються (можуть з’явитися дублікати)." + "retainPageLabelsHint": "Вимкнено (за замовчуванням): об’єднаний PDF використовує природну нумерацію 1–N. Увімкнено: оригінальні мітки сторінок кожного файлу зберігаються (можуть з’явитися дублікати).", + "removeDuplicateFonts": "Видалити дублікати шрифтів", + "alert": { + "thumbnailError": "Не вдалося відобразити мініатюри сторінок", + "noSelection": "Не вибрано файлів або сторінок для об’єднання.", + "mergeSuccess": "PDF успішно об’єднано!", + "mergeFailed": "Не вдалося об’єднати PDF.", + "mergeError": "Не вдалося об’єднати PDF. Переконайтеся, що всі файли коректні й не захищені паролем.", + "workerError": "Під час об’єднання сталася неочікувана помилка.", + "loadError": "Не вдалося завантажити один або кілька PDF-файлів" + }, + "loader": { + "renderingPreviews": "Створення попереднього перегляду сторінок...", + "merging": "Об’єднання PDF...", + "loadingDocuments": "Завантаження PDF-документів..." + } }, "splitPdf": { "name": "Розділити PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "Повторити (⇧⌘Z)", "tipFileDetails": "Відомості про файл", "tipEditExistingContent": "Редагувати наявний вміст", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "На що діє інструмент редагування — звузьте область на насичених сторінках", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "На що діє інструмент редагування: звузьте область на насичених сторінках", "tipClickThePageToAddATextBox": "Натисніть на сторінку, щоб додати текстове поле", "tipSpellCheckLanguage": "Мова перевірки орфографії", "tipFindAndReplace": "Знайти й замінити", @@ -237,7 +252,7 @@ "howItWorksDownloadDescription": "Збережіть оновлений PDF із новими мітками сторінок.", "relatedToolsTitle": "Схожі інструменти PDF", "faqWhatIsQuestion": "Що таке мітка сторінки?", - "faqWhatIsAnswer": "Мітка сторінки — це нумерація, яка відображається у переглядачі PDF (мініатюри, навігація, друк). Вона не додає текст безпосередньо на сторінку.", + "faqWhatIsAnswer": "Мітка сторінки це нумерація, яка відображається у переглядачі PDF (мініатюри, навігація, друк). Вона не додає текст безпосередньо на сторінку.", "faqMixQuestion": "Чи можна поєднувати римські та звичайні цифри?", "faqMixAnswer": "Так. Додайте кілька правил, наприклад 1-4 з LowercaseRoman і 5-20 з DecimalArabic.", "faqPrivacyQuestion": "Чи залишаються мої файли приватними?", @@ -347,7 +362,7 @@ "subtitle": "Заповнювати форми прямо в браузері. Підтримуються також XFA-форми.", "uploadHint": "Завантажте PDF з полями форми. Заповніть їх безпосередньо у переглядачі нижче, потім натисніть кнопку, щоб зберегти та завантажити заповнену форму. Також підтримуються форми XFA.", "xfaNoteTitle": "Примітка щодо форм XFA:", - "xfaNoteDescription": "XFA (XML Forms Architecture) — застарілий формат, який підтримується лише певними PDF-переглядачами, такими як BentoPDF та Firefox. Якщо ви відкриваєте XFA PDF в іншому ПЗ і бачите порожні сторінки або відсутність полів форми, це означає, що цей переглядач не підтримує XFA. Щоб правильно переглядати та заповнювати форми XFA, використовуйте Firefox або заповнювач форм BentoPDF." + "xfaNoteDescription": "XFA (XML Forms Architecture) це застарілий формат, який підтримується лише певними PDF-переглядачами, такими як BentoPDF та Firefox. Якщо ви відкриваєте XFA PDF в іншому ПЗ і бачите порожні сторінки або відсутність полів форми, це означає, що цей переглядач не підтримує XFA. Щоб правильно переглядати та заповнювати форми XFA, використовуйте Firefox або заповнювач форм BentoPDF." }, "createPdfForm": { "name": "Створити PDF-форму", @@ -358,7 +373,7 @@ "removeBlankPages": { "name": "Видалити порожні сторінки", "subtitle": "Автоматично визначати та видаляти порожні сторінки.", - "sensitivityHint": "Вище значення — суворіше визначення (лише повністю порожні сторінки). Нижче — допускаються сторінки з невеликим вмістом." + "sensitivityHint": "Вище значення означає суворіше визначення (лише повністю порожні сторінки). Нижче значення допускає сторінки з невеликим вмістом." }, "imageToPdf": { "name": "Зображення у PDF", @@ -492,7 +507,7 @@ "dpi": "DPI (роздільна здатність)", "dpiExplanation": "Вищий DPI = краща якість для друку, але більший розмір файлу", "compression": "Стиснення", - "compressionExplanation": "LZW і Deflate — без втрат. CCITT Group 4 — найкращий для чорно-білих сканованих документів.", + "compressionExplanation": "LZW і Deflate працюють без втрат. CCITT Group 4 найкращий для чорно-білих сканованих документів.", "colorMode": "Колірний режим", "multiPage": "Зберегти як багатосторінковий TIFF (один файл)", "loadingVips": "Завантаження обробника зображень...", @@ -503,7 +518,8 @@ "noFile": "Файл відсутній", "noFileExplanation": "Спочатку завантажте PDF-файл.", "conversionSuccess": "PDF успішно конвертовано у TIFF!", - "conversionError": "Не вдалося конвертувати PDF у TIFF. Можливо, файл пошкоджений." + "conversionError": "Не вдалося конвертувати PDF у TIFF. Можливо, файл пошкоджений.", + "conversionOutOfMemory": "Браузеру забракло пам’яті під час конвертації. Спробуйте нижчий DPI або вимкніть опцію багатосторінкового TIFF, щоб конвертувати сторінки по одній." } }, "pdfToCbz": { @@ -645,7 +661,7 @@ "invalidSplitTitle": "Недійсна точка розділення", "invalidSplitMessage": "Точка розділення має бути між сторінкою 1 і сторінкою {{maxSplit}}.", "unevenConfirmTitle": "Нерівні блоки", - "unevenConfirmMessage": "У блоці лицьових сторін {{frontCount}} стор., у блоці зворотів — {{backCount}} стор.\nЗазвичай це означає, що сторінку відскановано двічі або її бракує.\n\nСторінки без пари ({{extraCount}}) буде додано в кінець.\n\nВсе одно продовжити?", + "unevenConfirmMessage": "У блоці лицьових сторін {{frontCount}} стор., у блоці зворотів {{backCount}} стор.\nЗазвичай це означає, що сторінку відскановано двічі або її бракує.\n\nСторінки без пари ({{extraCount}}) буде додано в кінець.\n\nВсе одно продовжити?", "invalidGroupTitle": "Недійсний розмір групи", "invalidGroupMessage": "Введіть коректну кількість сторінок у вихідному документі.", "collatingLoader": "Збирання двостороннього сканування...", @@ -661,7 +677,7 @@ "faqOddPagesQuestion": "Що робити, якщо у скані непарна кількість сторінок?", "faqOddPagesAnswer": "Двостороннє сканування має мати парну кількість сторінок. Якщо це не так, сторінку, найімовірніше, відскановано двічі або пропущено. Інструмент попередить вас перед обробкою, а сторінки без пари буде додано в кінець, щоб нічого не загубилося.", "faqBackOrderQuestion": "Навіщо залишати блок зворотів без змін?", - "faqBackOrderAnswer": "Це залежить від того, як стопку подавали на другому проході. Якщо перевернути всю стопку, звороти йдуть у зворотному порядку — це варіант за замовчуванням. Якщо сканер видав їх у тому самому порядку, що й лицьові сторони, виберіть залишити блок без змін." + "faqBackOrderAnswer": "Це залежить від того, як стопку подавали на другому проході. Якщо перевернути всю стопку, звороти йдуть у зворотному порядку, це варіант за замовчуванням. Якщо сканер видав їх у тому самому порядку, що й лицьові сторони, виберіть залишити блок без змін." }, "addAttachments": { "name": "Додати вкладення", @@ -785,15 +801,15 @@ }, "encryptPdf": { "name": "Зашифрувати PDF", - "subtitle": "Захистити PDF паролем." + "subtitle": "Захистіть PDF паролем із надійним шифруванням AES." }, "sanitizePdf": { "name": "Очистити PDF", "subtitle": "Видалити метадані, анотації, скрипти та інше." }, "decryptPdf": { - "name": "Розблокувати PDF", - "subtitle": "Видалити пароль і зняти захист PDF." + "name": "Розшифрувати PDF", + "subtitle": "Видаліть пароль із PDF, щоб він відкривався вільно. Потрібен поточний пароль." }, "flattenPdf": { "name": "Сплющити PDF", @@ -990,12 +1006,11 @@ "subtitle": "Витягувати текст із PDF та зберігати як звичайний текст (.txt). Підтримується обробка кількох файлів.", "noteLabel": "Примітка:", "noteText": "Цей інструмент працює ТІЛЬКИ з PDF, створеними цифровим способом. Для сканованих документів або PDF на основі зображень використовуйте натомість наш інструмент OCR PDF.", - "convertButton": "Витягти текст", - "note": "Цей інструмент працює ТІЛЬКИ з PDF, створеними у цифровому вигляді. Для сканованих документів використовуйте OCR PDF." + "convertButton": "Витягти текст" }, "digitalSignPdf": { "name": "Цифровий підпис PDF", - "pageTitle": "Цифровий підпис PDF — Додати криптографічний підпис | BentoPDF", + "pageTitle": "Цифровий підпис PDF: додати криптографічний підпис | BentoPDF", "subtitle": "Додайте криптографічний цифровий підпис до PDF за допомогою сертифікатів X.509. Підтримуються формати PKCS#12 (.pfx, .p12) та PEM. Ваш приватний ключ не покидає браузер.", "certificateSection": "Сертифікат", "uploadCert": "Завантажити сертифікат (.pfx, .p12)", @@ -1067,7 +1082,7 @@ "relatedSanitizeDesc": "Видалити приховані дані", "relatedPermissionsDesc": "Встановити дозволи PDF", "faqWhatIsQuestion": "Що таке цифровий підпис?", - "faqWhatIsAnswer": "Цифровий підпис — це криптографічний механізм, який перевіряє автентичність і цілісність документа. На відміну від намальованого підпису, він використовує криптографію відкритого ключа (сертифікати X.509) для підтвердження особи підписанта.", + "faqWhatIsAnswer": "Цифровий підпис це криптографічний механізм, який перевіряє автентичність і цілісність документа. На відміну від намальованого підпису, він використовує криптографію відкритого ключа (сертифікати X.509) для підтвердження особи підписанта.", "faqFormatsQuestion": "Які формати сертифікатів підтримуються?", "faqFormatsAnswer": "Ми підтримуємо сертифікати у форматі PKCS#12 (.pfx, .p12), які містять і ваш сертифікат, і приватний ключ в одному зашифрованому файлі. Зазвичай вони видаються центрами сертифікації.", "faqPrivateKeyQuestion": "Чи безпечний мій приватний ключ?", @@ -1081,12 +1096,12 @@ }, "validateSignaturePdf": { "name": "Перевірка підпису PDF", - "pageTitle": "Перевірка підпису PDF — Перевірити цифрові підписи | BentoPDF", + "pageTitle": "Перевірка підпису PDF: перевірити цифрові підписи | BentoPDF", "subtitle": "Перевіряйте цифрові підписи у PDF-файлах. Перевірка дійсності сертифіката, перегляд даних підписанта та підтвердження цілісності документа. Уся обробка відбувається у вашому браузері." }, "timestampPdf": { "name": "Мітка часу PDF", - "pageTitle": "Мітка часу PDF онлайн безкоштовно — RFC 3161 | BentoPDF", + "pageTitle": "Мітка часу PDF онлайн безкоштовно, RFC 3161 | BentoPDF", "subtitle": "Додайте мітку часу RFC 3161 до PDF за допомогою довіреного сервера TSA (Time Stamp Authority). Підтверджує, що документ існував у певний момент часу. Сертифікат не потрібен.", "tsaSectionTitle": "Сервер мітки часу (TSA)", "selectTsa": "Оберіть TSA сервер", @@ -1189,7 +1204,7 @@ "workerError": "Помилка воркера: {{message}}", "alternateMergeWorkerError": "Помилка воркера почергового об’єднання: {{message}}", "noPdfFilesUploaded": "Не завантажено PDF-файлів у вузол PDF Input", - "failedToLoadFile": "Не вдалося завантажити \"{{file}}\" — файл може бути пошкоджено", + "failedToLoadFile": "Не вдалося завантажити \"{{file}}\": файл може бути пошкоджено", "noImagesUploaded": "Не завантажено зображень у вузол Image Input", "noWordDocsUploaded": "Не завантажено документів у вузол Word Input", "noExcelUploaded": "Не завантажено таблиць у вузол Excel Input", @@ -1295,9 +1310,9 @@ "howItWorksDownloadTitle": "Завантаження", "howItWorksDownloadDescription": "Завантажте PDF із застосованим накладанням або підкладкою.", "faqDifferenceQuestion": "У чому різниця між накладанням і підкладкою?", - "faqDifferenceAnswer": "Накладання розміщує сторінки поверх основного PDF (як водяний знак). Підкладка — під основним PDF (як бланк або фон).", + "faqDifferenceAnswer": "Накладання розміщує сторінки поверх основного PDF (як водяний знак). Підкладка розміщує їх під основним PDF (як бланк або фон).", "faqSinglePageQuestion": "Чи можна використати односторінковий PDF для всіх сторінок?", - "faqSinglePageAnswer": "Так! Увімкніть опцію «Повторювати», і сторінки накладання будуть застосовані до всіх сторінок. Один водяний знак — на всі сторінки.", + "faqSinglePageAnswer": "Так! Увімкніть опцію «Повторювати», і сторінки накладання будуть застосовані до всіх сторінок. Один водяний знак на всі сторінки.", "faqPrivacyQuestion": "Чи безпечні мої файли?", "faqPrivacyAnswer": "Так! Уся обробка відбувається у вашому браузері. Файли не покидають ваш пристрій." }, @@ -1306,7 +1321,7 @@ "subtitle": "Видалити пароль і зняти захист PDF." }, "protectPdf": { - "name": "Зашифрувати PDF", + "name": "Захистити PDF", "subtitle": "Захистити PDF паролем." } } diff --git a/public/locales/uk/ui.json b/public/locales/uk/ui.json new file mode 100644 index 00000000..3f70dea4 --- /dev/null +++ b/public/locales/uk/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(виправлено)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ ще {{n}}...", + "- Error parsing XMP XML. Displaying raw. -": "- Помилка розбору XMP XML. Показано необроблені дані. -", + "- No Info Dictionary data found -": "- Дані словника Info не знайдено -", + "- No XMP metadata found -": "- Метадані XMP не знайдено -", + "- No interactive form fields found -": "- Інтерактивних полів форми не знайдено -", + "- No parseable XMP properties found -": "- Придатних для розбору властивостей XMP не знайдено -", + "-- Select existing group --": "-- Виберіть наявну групу --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1° (дуже чутливо)", + "0.5° (Default)": "0.5° (за замовчуванням)", + "1.0° (Normal)": "1.0° (звичайно)", + "100 (Fast)": "100 (швидко)", + "150 (Default)": "150 (за замовчуванням)", + "1x2 (Booklet)": "1x2 (буклет)", + "2.0° (Less Sensitive)": "2.0° (менш чутливо)", + "200 (Better)": "200 (краще)", + "200 (Good)": "200 (добре)", + "2x2 (4-up)": "2x2 (4 на аркуші)", + "2x4 (8-up)": "2x4 (8 на аркуші)", + "300 (Best Quality)": "300 (найкраща якість)", + "300 (Print)": "300 (друк)", + "4x4 (16-up)": "4x4 (16 на аркуші)", + "600 (High Quality)": "600 (висока якість)", + "72 (Screen)": "72 (екран)", + "90° Clockwise": "90° за годинниковою стрілкою", + "90° Counter-clockwise": "90° проти годинникової стрілки", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Поле з іменем «{{fieldName}}» уже існує. Перейменуйте це поле, щоб воно мало унікальне ім’я, перш ніж завантажувати.", + "A new version of BentoPDF is available. Reload to update?": "Доступна нова версія BentoPDF. Перезавантажити для оновлення?", + "A single PDF file": "Один PDF-файл", + "A template with this name already exists.": "Шаблон із такою назвою вже існує.", + "ASCII characters (letters, numbers, symbols)": "Символи ASCII (літери, цифри, знаки)", + "Action": "Дія", + "Add Blank Page": "Додати порожню сторінку", + "Add Bookmark": "Додати закладку", + "Add Child Bookmark": "Додати дочірню закладку", + "Add Child Layer": "Додати дочірній шар", + "Add More Comics": "Додати ще комікси", + "Add More Documents": "Додати ще документи", + "Add More EPUB Files": "Додати ще файли EPUB", + "Add More Email Files": "Додати ще файли електронної пошти", + "Add More FB2 Files": "Додати ще файли FB2", + "Add More Files": "Додати ще файли", + "Add More Images": "Додати ще зображення", + "Add More JSON Files": "Додати ще файли JSON", + "Add More MOBI Files": "Додати ще файли MOBI", + "Add More Markdown Files": "Додати ще файли Markdown", + "Add More ODG Files": "Додати ще файли ODG", + "Add More PUB Files": "Додати ще файли PUB", + "Add More Pages Files": "Додати ще файли Pages", + "Add More Presentations": "Додати ще презентації", + "Add More SVG Files": "Додати ще файли SVG", + "Add More Spreadsheets": "Додати ще таблиці", + "Add More Text Files": "Додати ще текстові файли", + "Add More Visio Files": "Додати ще файли Visio", + "Add More WPD Files": "Додати ще файли WPD", + "Add More WPS Files": "Додати ще файли WPS", + "Add More XML Files": "Додати ще файли XML", + "Add More XPS Files": "Додати ще файли XPS", + "Add a new layer to get started!": "Додайте новий шар, щоб почати!", + "Add a text box": "Додати текстове поле", + "Add an RFC 3161 document timestamp": "Додати мітку часу документа RFC 3161", + "Add an image": "Додати зображення", + "Add at least one node to run the workflow.": "Додайте принаймні один вузол, щоб запустити процес.", + "Add child": "Додати дочірній", + "Add child layer": "Додати дочірній шар", + "Add header and footer text": "Додати текст колонтитулів", + "Add page numbers": "Додати нумерацію сторінок", + "Add searchable text layer via OCR": "Додати текстовий шар для пошуку за допомогою OCR", + "Add text watermark": "Додати текстовий водяний знак", + "Add/Edit/Extract Attachments": "Додати, редагувати або витягти вкладення", + "Added": "Додано", + "Added \"{{afterText}}\"": "Додано «{{afterText}}»", + "Added image ({{width}}×{{height}})": "Додано зображення ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "Порожню сторінку ({{insertCount}}) успішно додано!", + "Added {{insertCount}} blank pages successfully!": "Порожні сторінки ({{insertCount}}) успішно додано!", + "Adding header & footer...": "Додавання колонтитулів...", + "Adding page numbers...": "Додавання нумерації сторінок...", + "Adding watermark...": "Додавання водяного знака...", + "Adding {{insertCount}} blank page...": "Додавання порожньої сторінки ({{insertCount}})...", + "Adding {{insertCount}} blank pages...": "Додавання порожніх сторінок ({{insertCount}})...", + "Adding {{name}} ({{n}}/{{length}})...": "Додавання {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Корекція кольору", + "Adjust brightness, contrast, and colors": "Налаштуйте яскравість, контраст і кольори", + "Advanced": "Додатково", + "Advanced Feature Required": "Потрібна розширена функція", + "Advanced Settings": "Додаткові налаштування", + "After Page": "Після сторінки", + "After Page...": "Після сторінки...", + "Align Objects": "Вирівняти об’єкти", + "Alignment": "Вирівнювання", + "All": "Усі", + "All files repaired successfully!": "Усі файли успішно відновлено!", + "Alternate Merge": "Почергове об’єднання", + "Alternating and mixing pages...": "Чергування та змішування сторінок...", + "Always resample to that resolution": "Завжди змінювати роздільну здатність до цього значення", + "An error occurred during compression. Error: {{error}}": "Під час стиснення сталася помилка. Помилка: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Під час конвертації сталася помилка. Помилка: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Під час конвертації сталася помилка. Помилка: {{message}}", + "An error occurred during cropping.": "Під час обрізання сталася помилка.", + "An error occurred during extraction. Error: {{error}}": "Під час витягування сталася помилка. Помилка: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Під час растеризації сталася помилка. Помилка: {{error}}", + "An error occurred during sanitization: {{msg}}": "Під час очищення сталася помилка: {{msg}}", + "An error occurred while combining pages.": "Під час об’єднання сторінок сталася помилка.", + "An error occurred while creating the N-Up PDF.": "Під час створення N-Up PDF сталася помилка.", + "An error occurred while creating the booklet.": "Під час створення буклета сталася помилка.", + "An error occurred while dividing the PDF.": "Під час поділу PDF сталася помилка.", + "An error occurred while mixing the PDFs.": "Під час змішування PDF сталася помилка.", + "An error occurred while standardizing pages.": "Під час вирівнювання сторінок сталася помилка.", + "An error occurred while trying to remove metadata.": "Під час видалення метаданих сталася помилка.", + "An error occurred: {{error}}": "Сталася помилка: {{error}}", + "An error occurred: {{error}}.": "Сталася помилка: {{error}}.", + "An owner password is required when setting permissions": "Для встановлення дозволів потрібен пароль власника", + "An unexpected error occurred during the repair process.": "Під час відновлення сталася неочікувана помилка.", + "An unexpected error occurred.": "Сталася неочікувана помилка.", + "Analyzing data structure...": "Аналіз структури даних...", + "Analyzing full PDF metadata...": "Аналіз повних метаданих PDF...", + "Analyzing signatures...": "Аналіз підписів...", + "Angle": "Кут", + "Annotations removed successfully!": "Анотації успішно видалено!", + "Any text, URL, or data": "Будь-який текст, URL або дані", + "Application": "Програма", + "Apply a digital signature to PDF": "Накласти цифровий підпис на PDF", + "Apply and download": "Застосувати й завантажити", + "Apply redactions?": "Застосувати редагування?", + "Apply scanner simulation effect": "Застосувати ефект імітації сканера", + "Applying Bates numbers...": "Застосування номерів Bates...", + "Applying color adjustments...": "Застосування корекції кольору...", + "Applying crop...": "Застосування обрізання...", + "Applying redactions...": "Застосування редагувань...", + "Applying rotations...": "Застосування поворотів...", + "Applying scanner effect...": "Застосування ефекту сканера...", + "Applying timestamp...": "Застосування мітки часу...", + "Applying {{replace}}...": "Застосування: {{replace}}...", + "Archive contains an oversized image entry.": "Архів містить завелике зображення.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "В архіві забагато зображень (макс. {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Архів після розпакування завеликий.", + "Are you sure you want to reset? All your work will be lost.": "Справді скинути? Усю вашу роботу буде втрачено.", + "Area (Coordinates)": "Область (координати)", + "Area ({{unit}}²)": "Площа ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman і Courier New замінюються вбудованими аналогами. Застосовується лише тоді, коли це безпечно.", + "Arrange multiple pages per sheet": "Розмістити кілька сторінок на одному аркуші", + "Arrange pages for booklet printing": "Розташувати сторінки для друку буклета", + "Aspect Ratio": "Співвідношення сторін", + "At least one PDF document is required for export.": "Для експорту потрібен принаймні один PDF-документ.", + "At least two valid PDFs are required.": "Потрібно принаймні два дійсні PDF.", + "Attaching files to PDF...": "Вкладення файлів до PDF...", + "Attachments updated successfully!": "Вкладення успішно оновлено!", + "Author": "Автор", + "Auto (Keep Original)": "Авто (зберегти оригінал)", + "Back": "Зворот", + "Back to Home": "На головну", + "Background Color": "Колір фону", + "Background color changed successfully!": "Колір фону успішно змінено!", + "Barcode": "Штрихкод", + "Barcode Format": "Формат штрихкоду", + "Barcode Value": "Значення штрихкоду", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Номери Bates успішно застосовано! (від {{batesStart}} до {{n}})", + "Beginning": "На початку", + "Binarize": "Бінаризація", + "Blank Position": "Розташування порожньої сторінки", + "Blue": "Синій", + "Blur": "Розмиття", + "Bold": "Напівжирний", + "Bold & Italic": "Напівжирний і курсив", + "Booklet": "Буклет", + "Booklet created with {{numSheets}} sheets!": "Буклет створено, аркушів: {{numSheets}}!", + "Bookmarks imported from JSON!": "Закладки імпортовано з JSON!", + "Bookmarks page": "Сторінка закладок", + "Border": "Рамка", + "Border Color": "Колір рамки", + "Bottom": "Знизу", + "Bottom Center": "Знизу по центру", + "Bottom Left": "Знизу ліворуч", + "Bottom Right": "Знизу праворуч", + "Bottom edge in points": "Нижній відступ у пунктах", + "Brightness": "Яскравість", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Brotli і растеризацію пропущено, щоб зберегти PDF/A.", + "Brotli compression (PDF 2.0)": "Стиснення Brotli (PDF 2.0)", + "Browser Note:": "Примітка щодо браузера:", + "Building new PDF...": "Створення нового PDF...", + "Building page pairing model...": "Побудова моделі зіставлення сторінок...", + "Button": "Кнопка", + "ByteRange does not start at the beginning of the file": "ByteRange не починається з початку файлу", + "ByteRange out of bounds": "ByteRange виходить за межі", + "CBZ to PDF": "CBZ у PDF", + "CSV Loaded": "CSV завантажено", + "CSV file is empty": "CSV-файл порожній", + "Cancel": "Скасувати", + "Cannot Delete": "Не можна видалити", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Немає доступу до елементів керування переглядача. Скористайтеся кнопкою «Завантажити» на панелі інструментів переглядача PDF вище.", + "Cannot delete all pages": "Не можна видалити всі сторінки", + "Cannot delete all pages.": "Не можна видалити всі сторінки.", + "Canvas context failed": "Не вдалося отримати контекст canvas", + "Canvas context unavailable": "Контекст canvas недоступний", + "Canvas toBlob conversion failed.": "Не вдалося виконати перетворення canvas toBlob.", + "Canvas toBlob failed": "Помилка canvas toBlob", + "Center": "По центру", + "Certificate (.pfx, .p12, .pem)": "Сертифікат (.pfx, .p12, .pem)", + "Certificate Expired": "Термін дії сертифіката закінчився", + "Certificate Password": "Пароль сертифіката", + "Certificate unlocked": "Сертифікат розблоковано", + "Change Certificate": "Змінити сертифікат", + "Change background color": "Змінити колір фону", + "Changing background color...": "Зміна кольору фону...", + "Changing text color...": "Зміна кольору тексту...", + "Character": "Символ", + "Checked State": "Позначений стан", + "Choose a valid page range.": "Виберіть дійсний діапазон сторінок.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Виберіть одну з вбудованих мов або перезберіть автономний пакет, додавши відсутню мову в --ocr-languages.", + "Cleanup": "Очищення", + "Click on PDF to Pick Location": "Клацніть на PDF, щоб вибрати місце", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Натисніть кнопку вище, потім клацніть на PDF там, куди має вести закладка", + "Click to Upload Image": "Клацніть, щоб завантажити зображення", + "Clicking this field in the PDF will open a file picker to upload an image.": "Клацання цього поля в PDF відкриє вікно вибору файлу для завантаження зображення.", + "Clip invisible parts of images": "Обрізати невидимі частини зображень", + "Close": "Закрити", + "Close (Esc)": "Закрити (Esc)", + "Close panel": "Закрити панель", + "Closes tab": "Закриває вкладку", + "Closes window": "Закриває вікно", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (закладки та метадані)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF не налаштовано. Налаштуйте його в параметрах WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF створив порожній розшифрований файл.", + "CoherentPDF: not configured.": "CoherentPDF: не налаштовано.", + "Color": "Колір", + "Color adjustments applied successfully!": "Корекцію кольору успішно застосовано!", + "Colors inverted successfully!": "Кольори успішно інвертовано!", + "Cols": "Стовпці", + "Combine multiple PDFs into one": "Об’єднайте кілька PDF в один", + "Combine to Single Page": "Об’єднати в одну сторінку", + "Combining pages...": "Об’єднання сторінок...", + "Comic Archives": "Архіви коміксів", + "Comments and markup become part of the page. Form fields and links keep working.": "Коментарі та розмітка стають частиною сторінки. Поля форм і посилання продовжують працювати.", + "Complete": "Готово", + "Complete!": "Готово!", + "Compress": "Стиснути", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Стиснуто PDF: {{compressedCount}}. Загальний розмір зменшено з {{totalOriginalSize}} до {{totalCompressedSize}} (заощаджено {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Стиснуто PDF: {{compressedCount}}. Загальний розмір: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Стиснення кількох PDF...", + "Compressing to {{size}}...": "Стиснення до {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Стиснення {{n}}/{{length}}: {{name}}...", + "Compressing...": "Стиснення...", + "Compression Complete": "Стиснення завершено", + "Compression Finished": "Стиснення завершено", + "Compression Level": "Рівень стиснення", + "Configure": "Налаштувати", + "Confirm": "Підтвердити", + "Confirm Action": "Підтвердьте дію", + "Conformance": "Відповідність", + "Connected": "Підключено", + "Contact Info": "Контактні дані", + "Content": "Вміст", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Хеш вмісту не збігається з атрибутом messageDigest: PDF було змінено після підписання", + "Contrast": "Контраст", + "Conversion Complete": "Конвертацію завершено", + "Conversion Error": "Помилка конвертації", + "Conversion engine ready!": "Рушій конвертації готовий!", + "Conversion failed: could not create PDF/A definition": "Конвертацію не вдалося: не вдалося створити визначення PDF/A", + "Convert Apple Pages documents to PDF": "Конвертуйте документи Apple Pages у PDF", + "Convert EPUB ebooks to PDF": "Конвертуйте електронні книги EPUB у PDF", + "Convert Excel spreadsheets to PDF": "Конвертуйте електронні таблиці Excel у PDF", + "Convert FB2 e-books to PDF": "Конвертуйте електронні книги FB2 у PDF", + "Convert JSON files to PDF": "Конвертуйте файли JSON у PDF", + "Convert MOBI e-books to PDF": "Конвертуйте електронні книги MOBI у PDF", + "Convert Markdown files to PDF": "Конвертуйте файли Markdown у PDF", + "Convert Microsoft Publisher to PDF": "Конвертуйте файли Microsoft Publisher у PDF", + "Convert OpenDocument Graphics to PDF": "Конвертуйте OpenDocument Graphics у PDF", + "Convert PDF pages to SVG": "Конвертуйте сторінки PDF у SVG", + "Convert PDF pages to images (ZIP)": "Конвертуйте сторінки PDF у зображення (ZIP)", + "Convert PDF tables to CSV": "Конвертуйте таблиці PDF у CSV", + "Convert PDF tables to Excel": "Конвертуйте таблиці PDF в Excel", + "Convert PDF to Markdown text": "Конвертуйте PDF у текст Markdown", + "Convert PDF to PDF/A for archiving": "Конвертуйте PDF у PDF/A для архівування", + "Convert PDF to Word document": "Конвертуйте PDF у документ Word", + "Convert PowerPoint presentations to PDF": "Конвертуйте презентації PowerPoint у PDF", + "Convert SVG files to PDF": "Конвертуйте файли SVG у PDF", + "Convert To Grayscale": "Конвертувати у відтінки сірого", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Конвертуйте діаграми Visio (VSD/VSDX) у PDF", + "Convert WPS Office documents to PDF": "Конвертуйте документи WPS Office у PDF", + "Convert Word documents to PDF": "Конвертуйте документи Word у PDF", + "Convert WordPerfect documents to PDF": "Конвертуйте документи WordPerfect у PDF", + "Convert XML documents to PDF": "Конвертуйте документи XML у PDF", + "Convert XPS/OXPS documents to PDF": "Конвертуйте документи XPS/OXPS у PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Конвертуйте архіви коміксів (CBZ/CBR) у PDF", + "Convert email files (.eml, .msg) to PDF": "Конвертуйте файли електронної пошти (.eml, .msg) у PDF", + "Convert fonts to vector outlines": "Конвертуйте шрифти у векторні контури", + "Convert plain text to PDF": "Конвертуйте простий текст у PDF", + "Convert to grayscale": "Конвертувати у відтінки сірого", + "Convert to greyscale": "Конвертувати у відтінки сірого", + "Convert to image-based PDF": "Конвертувати в PDF на основі зображень", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "Конвертовано файлів: {{length}} (сторінок: {{totalPages}}) у SVG!", + "Converted {{pageCount}} pages to SVG!": "Конвертовано сторінок у SVG: {{pageCount}}!", + "Converter not initialized": "Конвертер не ініціалізовано", + "Converting BMP to PDF...": "Конвертація BMP у PDF...", + "Converting HEIC to PDF...": "Конвертація HEIC у PDF...", + "Converting TIFF to PDF...": "Конвертація TIFF у PDF...", + "Converting emails...": "Конвертація листів...", + "Converting files...": "Конвертація файлів...", + "Converting fonts to outlines...": "Конвертація шрифтів у контури...", + "Converting images to PDF...": "Конвертація зображень у PDF...", + "Converting multiple PDFs to PDF/A...": "Конвертація кількох PDF у PDF/A...", + "Converting multiple RTF files to PDF...": "Конвертація кількох файлів RTF у PDF...", + "Converting multiple files...": "Конвертація кількох файлів...", + "Converting page {{n}} of {{pageCount}}...": "Конвертація сторінки {{n}} з {{pageCount}}...", + "Converting to Markdown...": "Конвертація в Markdown...", + "Converting to SVG...": "Конвертація в SVG...", + "Converting to greyscale...": "Конвертація у відтінки сірого...", + "Converting to {{level}}...": "Конвертація: {{level}}...", + "Converting {{name}}...": "Конвертація {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Конвертація {{n}}/{{length}}: {{name}}...", + "Converting...": "Конвертація...", + "Copied": "Скопійовано", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Не вдалося отримати доступ до експортера PDF зі штампами. Скористайтеся кнопкою «Експорт → PDF» на панелі інструментів переглядача.", + "Could not add blank page.": "Не вдалося додати порожню сторінку.", + "Could not add blank pages.": "Не вдалося додати порожні сторінки.", + "Could not add header or footer.": "Не вдалося додати колонтитул.", + "Could not add page numbers.": "Не вдалося додати нумерацію сторінок.", + "Could not add the watermark.": "Не вдалося додати водяний знак.", + "Could not apply rotations.": "Не вдалося застосувати повороти.", + "Could not change text color.": "Не вдалося змінити колір тексту.", + "Could not change the background color.": "Не вдалося змінити колір фону.", + "Could not create ZIP archive.": "Не вдалося створити ZIP-архів.", + "Could not create canvas context.": "Не вдалося створити контекст canvas.", + "Could not create comparison canvas context.": "Не вдалося створити контекст canvas для порівняння.", + "Could not create offscreen comparison canvas.": "Не вдалося створити позаекранний canvas для порівняння.", + "Could not create visual diff context.": "Не вдалося створити контекст візуальної різниці.", + "Could not create visual diff overlay context.": "Не вдалося створити контекст накладання візуальної різниці.", + "Could not detect blank pages.": "Не вдалося виявити порожні сторінки.", + "Could not display the page.": "Не вдалося показати сторінку.", + "Could not export comparison PDF.": "Не вдалося експортувати PDF порівняння.", + "Could not export the signed PDF. Please try again.": "Не вдалося експортувати підписаний PDF. Спробуйте ще раз.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Не вдалося експортувати PDF зі штампами. Скористайтеся кнопкою «Експорт → PDF» на панелі інструментів переглядача.", + "Could not extract signer public key": "Не вдалося витягти відкритий ключ підписувача", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Не вдалося знайти {{testFile}} за вказаною URL-адресою (HTTP {{status}}). Переконайтеся, що файл існує.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Не вдалося повністю проаналізувати PDF. Можливо, він пошкоджений або має незвичну структуру.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Не вдалося створити попередній перегляд. Файл може бути пошкоджений або містити непідтримувані функції. Помилка: {{message}}", + "Could not get canvas context": "Не вдалося отримати контекст canvas", + "Could not invert PDF colors.": "Не вдалося інвертувати кольори PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Не вдалося завантажити PDF. Він може бути пошкоджений або захищений паролем.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Не вдалося завантажити PDF. Файл може бути недійсним, пошкодженим або захищеним паролем.", + "Could not load the PDF engine. Please refresh the page and try again.": "Не вдалося завантажити рушій PDF. Оновіть сторінку й спробуйте ще раз.", + "Could not parse signer info": "Не вдалося розібрати дані підписувача", + "Could not posterize the PDF.": "Не вдалося постеризувати PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Не вдалося обробити «{{name}}». Файл може бути пошкоджений.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Не вдалося зменшити розмір файлу ще більше. Було: {{originalSize}}, стало: {{compressedSize}}.", + "Could not remove annotations.": "Не вдалося видалити анотації.", + "Could not remove blank pages.": "Не вдалося видалити порожні сторінки.", + "Could not remove leftover data from the PDF.": "Не вдалося видалити залишкові дані з PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Не вдалося видалити закреслений текст з даних документа, тому файл не завантажено.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Не вдалося змінити порядок сторінок PDF. Переконайтеся, що ваші файли є дійсними PDF.", + "Could not update metadata. Please check that date formats are correct.": "Не вдалося оновити метадані. Перевірте, чи правильні формати дат.", + "Count": "Кількість", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Створено", + "Creating Booklet...": "Створення буклета...", + "Creating Excel file...": "Створення файлу Excel...", + "Creating N-Up PDF...": "Створення N-Up PDF...", + "Creating PDF from JPGs...": "Створення PDF із JPG...", + "Creating PDF from SVG files...": "Створення PDF із файлів SVG...", + "Creating PDF...": "Створення PDF...", + "Creating ZIP archive...": "Створення ZIP-архіву...", + "Creating ZIP file...": "Створення ZIP-файлу...", + "Creating ZIP...": "Створення ZIP...", + "Creating table...": "Створення таблиці...", + "Creator": "Створено в", + "Crop": "Обрізати", + "Crop complete! Your download has started.": "Обрізання завершено! Завантаження почалося.", + "Cryptographic verification failed": "Криптографічну перевірку не пройдено", + "Custom": "Власний", + "Custom Format": "Власний формат", + "Custom Height": "Власна висота", + "Custom Units": "Власні одиниці", + "Custom Width": "Власна ширина", + "Custom Zoom": "Власний масштаб", + "Custom...": "Власний...", + "DataMatrix": "DataMatrix", + "Date Format": "Формат дати", + "Decrease size": "Зменшити розмір", + "Decrypt": "Розшифрувати", + "Decrypting PDF...": "Розшифрування PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Розшифрування {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Розшифрування {{n}} з {{length}}: {{name}}", + "Decrypting...": "Розшифрування...", + "Decryption Failed": "Не вдалося розшифрувати", + "Delete": "Видалити", + "Delete \"{{title}}\"?": "Видалити «{{title}}»?", + "Delete Field": "Видалити поле", + "Delete Page": "Видалити сторінку", + "Delete Pages": "Видалити сторінки", + "Delete all {{length}} bookmark(s) ? ": "Видалити всі закладки ({{length}})? ", + "Delete layer": "Видалити шар", + "Delete {{size}} bookmark(s) ? ": "Видалити закладки ({{size}})? ", + "Deleted": "Видалено", + "Deleted {{size}} page(s) successfully!": "Сторінок успішно видалено: {{size}}!", + "Deleting pages...": "Видалення сторінок...", + "Description": "Опис", + "Description for screen readers": "Опис для програм зчитування з екрана", + "Deselect All": "Скасувати вибір усіх", + "Deskew": "Вирівнювання нахилу", + "Deskew PDF": "Вирівнювання PDF", + "Deskewed {{length}} file(s). {{value}}": "Вирівняно файлів: {{length}}. {{value}}", + "Deskewing {{name}}...": "Вирівнювання {{name}}...", + "Destination": "Призначення", + "Detecting blank pages...": "Пошук порожніх сторінок...", + "Digest Algorithm:": "Алгоритм дайджесту:", + "Digital Sign": "Цифровий підпис", + "Direction": "Напрямок", + "Divide Pages": "Розділити сторінки", + "Divide into boxes (0 to disable)": "Розділити на блоки (0, щоб вимкнути)", + "Document Properties": "Властивості документа", + "Document Type": "Тип документа", + "Document properties": "Властивості документа", + "Document-level attachment": "Вкладення рівня документа", + "Done: back to tools": "Готово: повернутися до інструментів", + "Download": "Завантажити", + "Download Edited PDF": "Завантажити відредагований PDF", + "Download anyway": "Усе одно завантажити", + "Download as PDF or ZIP automatically": "Автоматично завантажити як PDF або ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Завантажено PDF-файлів у ZIP-архіві: {{length}}.", + "Downloads started for all files.": "Завантаження всіх файлів розпочато.", + "Dpi": "Dpi", + "Drops tagging, which screen readers rely on.": "Прибирає теги, на які покладаються програми зчитування з екрана.", + "Duplicate Field Name": "Дублікат імені поля", + "Duplicate Field Names": "Дублікати імен полів", + "Duplicate Page": "Дублювати сторінку", + "Duplicate Page Numbers": "Дублікати номерів сторінок", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Підпис ECDSA не збігається з відкритим ключем підписувача", + "EPUB Files": "Файли EPUB", + "EPUB to PDF": "EPUB у PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ у PDF", + "Edit": "Редагувати", + "Edit All": "Редагувати все", + "Edit Bookmark": "Редагувати закладку", + "Edit Bookmarks": "Редагувати закладки", + "Edit Images": "Редагувати зображення", + "Edit Metadata": "Редагувати метадані", + "Edit PDF metadata": "Редагувати метадані PDF", + "Edit Scope": "Область редагування", + "Edit Shapes": "Редагувати фігури", + "Edit Text": "Редагувати текст", + "Edit tool": "Інструмент редагування", + "Edit {{scopes}}": "Редагувати: {{scopes}}", + "Email Files": "Файли email", + "Email to PDF": "Email у PDF", + "Embedding files into PDF...": "Вбудовування файлів у PDF...", + "Empty signature bytes": "Порожні байти підпису", + "Encrypt": "Зашифрувати", + "Encrypt PDF with password": "Зашифрувати PDF паролем", + "Encrypted file": "Зашифрований файл", + "Encrypting PDF with 256-bit AES...": "Шифрування PDF за допомогою 256-бітного AES...", + "Encryption Failed": "Не вдалося зашифрувати", + "Encryption resulted in an empty file.": "Шифрування дало порожній файл.", + "End": "Кінець", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Введіть 0, щоб вставити на початку, або {{pageCount}}, щоб вставити в кінці.", + "Enter bookmark title": "Введіть назву закладки", + "Enter name for child layer under \"{{Layer}}\":": "Введіть назву дочірнього шару в «{{Layer}}»:", + "Enter password": "Введіть пароль", + "Enter password...": "Введіть пароль...", + "Enter passwords for each encrypted file": "Введіть паролі для кожного зашифрованого файлу", + "Error": "Помилка", + "Error during execution": "Помилка під час виконання", + "Error generating PDF: {{error}}": "Помилка створення PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Помилка завантаження PDF-файлу. Спробуйте ще раз з дійсним PDF.", + "Error reading files: {{error}}": "Помилка читання файлів: {{error}}", + "Error saving PDF. Check console for details.": "Помилка збереження PDF. Подробиці дивіться в консолі.", + "Error: {{error}}": "Помилка: {{error}}", + "Exactly 11 or 12 digits": "Рівно 11 або 12 цифр", + "Exactly 12 or 13 digits": "Рівно 12 або 13 цифр", + "Example of current format:": "Приклад поточного формату:", + "Excel to PDF": "Excel у PDF", + "Existing Radio Groups": "Наявні групи перемикачів", + "Export Error": "Помилка експорту", + "Export Value": "Експортоване значення", + "Export failed": "Експорт не вдався", + "External processing module needed": "Потрібен зовнішній модуль обробки", + "Extract Images": "Витяг зображень", + "Extract Pages": "Витяг сторінок", + "Extract Tables": "Витяг таблиць", + "Extract a range of pages": "Витягти діапазон сторінок", + "Extract all images from PDF": "Витягти всі зображення з PDF", + "Extract pages as separate PDFs": "Витягти сторінки як окремі PDF", + "Extract text from PDF": "Витягти текст з PDF", + "Extracted 1 table successfully!": "Таблицю успішно витягнуто!", + "Extracted text from {{length}} PDF files!": "Текст витягнуто з PDF-файлів: {{length}}!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Витягнуто PDF: {{completed}}, не вдалося: {{failed}}.", + "Extracted {{length}} page(s) successfully!": "Сторінок успішно витягнуто: {{length}}!", + "Extracted {{length}} table(s) to Excel!": "Таблиць витягнуто в Excel: {{length}}!", + "Extracted {{length}} tables successfully!": "Таблиць успішно витягнуто: {{length}}!", + "Extracting attachments from {{length}} file(s)...": "Витягування вкладень з файлів: {{length}}...", + "Extracting images from {{name}}...": "Витягування зображень із {{name}}...", + "Extracting pages...": "Витягування сторінок...", + "Extracting tables...": "Витягування таблиць...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Витягування тексту з файлу {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Витягування тексту з кількох файлів...", + "Extracting text from {{name}}...": "Витягування тексту з {{name}}...", + "Extracting text...": "Витягування тексту...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Витягування {{name}} для AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Витягування {{name}} для AI...", + "Extracting...": "Витягування...", + "Extraction Complete": "Витягування завершено", + "Extraction Error": "Помилка витягування", + "Extraction Partial": "Витягування виконано частково", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Витягування завершено! Вкладень у ZIP-файлі: {{length}} ({{totalSize}}). Завантаження почалося.", + "FB2 Files": "Файли FB2", + "FB2 to PDF": "FB2 у PDF", + "Failed": "Не вдалося", + "Failed to acquire 2D canvas context": "Не вдалося отримати 2D-контекст canvas", + "Failed to add child layer": "Не вдалося додати дочірній шар", + "Failed to apply Bates numbers.": "Не вдалося застосувати номери Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "Не вдалося застосувати корекцію кольору. Файл може бути пошкоджений.", + "Failed to apply redactions.": "Не вдалося застосувати редагування.", + "Failed to apply scanner effect. The file might be corrupted.": "Не вдалося застосувати ефект сканера. Файл може бути пошкоджений.", + "Failed to attach files: {{error}}": "Не вдалося прикріпити файли: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Не вдалося конвертувати BMP у PDF. Один із файлів може бути недійсним.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Не вдалося конвертувати HEIC у PDF. Один із файлів може бути недійсним.", + "Failed to convert PDF to CSV. {{message}}": "Не вдалося конвертувати PDF у CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Не вдалося конвертувати PDF в Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Не вдалося конвертувати PDF у SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Не вдалося конвертувати PDF у відтінки сірого. Файл може бути пошкоджений.", + "Failed to convert PDF. It may be image-based or corrupted.": "Не вдалося конвертувати PDF. Він може бути на основі зображень або пошкоджений.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Не вдалося конвертувати TIFF у PDF. Один із файлів може бути недійсним.", + "Failed to convert images to PDF.": "Не вдалося конвертувати зображення у PDF.", + "Failed to convert text to PDF. {{error}}": "Не вдалося конвертувати текст у PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Не вдалося конвертувати {{filename}} у PNG", + "Failed to copy metadata to clipboard.": "Не вдалося скопіювати метадані в буфер обміну.", + "Failed to create PDF.": "Не вдалося створити PDF.", + "Failed to create PNG blob": "Не вдалося створити PNG blob", + "Failed to create canvas context": "Не вдалося створити контекст canvas", + "Failed to create split PDFs.": "Не вдалося створити розділені PDF.", + "Failed to decode image: {{name}}": "Не вдалося декодувати зображення: {{name}}", + "Failed to decrypt private key": "Не вдалося розшифрувати закритий ключ", + "Failed to decrypt. Try the Decrypt tool instead.": "Не вдалося розшифрувати. Спробуйте натомість інструмент «Розшифрувати».", + "Failed to delete layer": "Не вдалося видалити шар", + "Failed to delete pages.": "Не вдалося видалити сторінки.", + "Failed to deskew PDF: {{error}}": "Не вдалося вирівняти PDF: {{error}}", + "Failed to download the edited PDF.": "Не вдалося завантажити відредагований PDF.", + "Failed to edit attachments.": "Не вдалося відредагувати вкладення.", + "Failed to extract certificate from PFX file": "Не вдалося витягти сертифікат з файлу PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Не вдалося витягти сторінки (код виходу qpdf: {{exitCode}}).", + "Failed to extract pages.": "Не вдалося витягти сторінки.", + "Failed to extract tables. {{message}}": "Не вдалося витягти таблиці. {{message}}", + "Failed to extract text from PDF.": "Не вдалося витягти текст з PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Не вдалося отримати профіль ICC із {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Не вдалося отримати файл шрифту: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Не вдалося отримати gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Не вдалося отримати {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Не вдалося отримати 2D-контекст для сторінки {{pageNumber}}", + "Failed to get canvas context": "Не вдалося отримати контекст canvas", + "Failed to insert PDF. The file may be corrupted.": "Не вдалося вставити PDF. Файл може бути пошкоджений.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Не вдалося завантажити Ghostscript із {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Не вдалося завантажити PDF-файл.", + "Failed to load PDF for cropping.": "Не вдалося завантажити PDF для обрізання.", + "Failed to load PDF for preview.": "Не вдалося завантажити PDF для попереднього перегляду.", + "Failed to load PDF form viewer.": "Не вдалося завантажити переглядач PDF-форм.", + "Failed to load PDF layers": "Не вдалося завантажити шари PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Не вдалося завантажити PyMuPDF із CDN: {{msg}}", + "Failed to load SVG image": "Не вдалося завантажити зображення SVG", + "Failed to load WebP image": "Не вдалося завантажити зображення WebP", + "Failed to load attachments from PDF.": "Не вдалося завантажити вкладення з PDF.", + "Failed to load files: {{error}}": "Не вдалося завантажити файли: {{error}}", + "Failed to load image.": "Не вдалося завантажити зображення.", + "Failed to load image: {{filename}}": "Не вдалося завантажити зображення: {{filename}}", + "Failed to load one or more PDF files.": "Не вдалося завантажити один або кілька PDF-файлів.", + "Failed to load script: {{url}}": "Не вдалося завантажити скрипт: {{url}}", + "Failed to load template.": "Не вдалося завантажити шаблон.", + "Failed to load the PDF Editor.": "Не вдалося завантажити редактор PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Не вдалося завантажити обробник зображень. Переконайтеся, що ваш браузер підтримує SharedArrayBuffer (потрібен HTTPS або localhost).", + "Failed to parse CSV: {{error}}": "Не вдалося розібрати CSV: {{error}}", + "Failed to parse signature": "Не вдалося розібрати підпис", + "Failed to parse the certificate file.": "Не вдалося розібрати файл сертифіката.", + "Failed to process HEIC file: {{name}}": "Не вдалося обробити файл HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Не вдалося обробити файл WebP: {{name}}", + "Failed to read file.": "Не вдалося прочитати файл.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Не вдалося зняти обмеження. Для PDF може бути потрібен правильний пароль власника.", + "Failed to render page": "Не вдалося відобразити сторінку", + "Failed to render page previews": "Не вдалося відобразити попередній перегляд сторінок", + "Failed to render page previews.": "Не вдалося відобразити попередній перегляд сторінок.", + "Failed to render page.": "Не вдалося відобразити сторінку.", + "Failed to save changes.": "Не вдалося зберегти зміни.", + "Failed to save the new PDF. Check console for details.": "Не вдалося зберегти новий PDF. Подробиці дивіться в консолі.", + "Failed to split PDF. Please check your selection.": "Не вдалося розділити PDF. Перевірте свій вибір.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Не вдалося додати мітку часу до PDF: {{message}}\n\nСпробуйте інший сервер TSA або перевірте підключення до інтернету.", + "Failed to toggle layer visibility": "Не вдалося перемкнути видимість шару", + "Failed to validate signatures. The file may be corrupted.": "Не вдалося перевірити підписи. Файл може бути пошкоджений.", + "Features enabled by this module:": "Можливості, які вмикає цей модуль:", + "Field Name": "Ім’я поля", + "Field Name (Group Name)": "Ім’я поля (Ім’я групи)", + "Field Name Conflict": "Конфлікт імен полів", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Ім’я поля «{{newName}}» уже існує в цьому елементі ({{value}}). Спробуйте використати унікальне ім’я.", + "Field name cannot be empty": "Ім’я поля не може бути порожнім", + "File": "Файл", + "File Size": "Розмір файлу", + "File exists but could not be read. Check CORS configuration.": "Файл існує, але його не вдалося прочитати. Перевірте конфігурацію CORS.", + "File list not found": "Список файлів не знайдено", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Розмір файлу зменшено з {{originalSize}} до {{compressedSize}} (заощаджено {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Файл {{n}}/{{length}}: сторінка {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Файл {{n}}/{{length}}: {{message}}", + "Filename": "Ім’я файлу", + "Files that failed: {{errorCount}}.": "Файли з помилками: {{errorCount}}.", + "Fill (cover full target page)": "Заповнити (покрити всю цільову сторінку)", + "Fill Color": "Колір заливки", + "Finalizing PDF...": "Завершення роботи над PDF...", + "Find & replace": "Знайти й замінити", + "Finds the best quality under this size. 0 means no target.": "Шукає найкращу якість у межах цього розміру. 0 означає без цілі.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox і Chrome можуть показувати власний формат вибору дати під час вибору. Правильний формат буде застосовано, коли ви завершите введення дати.", + "First Indent": "Відступ першого рядка", + "Fit (keep full page visible)": "Вмістити (повна сторінка залишається видимою)", + "Fit Page": "Вмістити сторінку", + "Fix Page Size": "Вирівняти розмір сторінок", + "Flatten": "Сплюснути", + "Flatten Forms": "Сплюснути форми", + "Flatten annotations": "Сплюснути анотації", + "Flatten form fields": "Сплюснути поля форм", + "Flatten forms and annotations": "Сплюснути форми й анотації", + "Flatten links": "Сплюснути посилання", + "Flattening PDF...": "Сплющення PDF...", + "Flattening and saving PDF...": "Сплющення й збереження PDF...", + "Flattening multiple PDFs...": "Сплющення кількох PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Сплющення сторінки {{i}} з {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Сплющення {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Переводить фокус на адресний рядок", + "Font": "Шрифт", + "Font Color": "Колір шрифту", + "Font Family": "Гарнітура", + "Font Size": "Розмір шрифту", + "Font size: {{bSize}} → {{aSize}}": "Розмір шрифту: {{bSize}} → {{aSize}}", + "Font to Outline": "Шрифти у контури", + "Font: {{bFont}} → {{aFont}}": "Шрифт: {{bFont}} → {{aFont}}", + "Fonts": "Шрифти", + "Footer Center": "Нижній колонтитул по центру", + "Footer Left": "Нижній колонтитул ліворуч", + "Footer Right": "Нижній колонтитул праворуч", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Для PDF лише із зображень, як-от скани. Пропускається, якщо в документі є текст, що виділяється, окрім випадків, коли ввімкнено «Ігнорувати захист вмісту».", + "Form fields stop being fillable.": "Поля форм перестають бути придатними для заповнення.", + "Format": "Формат", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Знайдено порожніх сторінок: {{length}}. Клацніть на сторінку, щоб скасувати її вибір.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Знайдено наявних закладок: {{length}}. Замінити поточні закладки?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Знайдено зображень: {{length}} у PDF: {{length2}}.", + "Front": "Лицьовий бік", + "Full Coverage": "Повне покриття", + "Gamma": "Гамма", + "Generate table of contents from bookmarks": "Створити зміст із закладок", + "Generating High-Quality PDF...": "Створення PDF високої якості...", + "Generating PDF...": "Створення PDF...", + "Generating ZIP file...": "Створення ZIP-файлу...", + "Generating formatted content...": "Створення відформатованого вмісту...", + "Generating preview...": "Створення попереднього перегляду...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (конвертація в PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Конвертація RGB у Ghostscript не вдалася, код виходу: {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Конвертація Ghostscript не вдалася, код виходу: {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript не створив вихідний файл", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript не налаштовано. Налаштуйте його в додаткових налаштуваннях.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript не налаштовано. Налаштуйте його в параметрах WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript не налаштовано. PyMuPDF потребує Ghostscript для деяких операцій. Налаштуйте обидва в додаткових налаштуваннях.", + "Ghostscript threw an exception: {{e}}": "Ghostscript викликав виняток: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Обгортка Ghostscript не надала очікуваного інтерфейсу. Очікувалася функція loadGS() або клас GhostscriptWASM.", + "Go": "Перейти", + "Go to page": "Перейти до сторінки", + "Grayscale": "Відтінки сірого", + "Green": "Зелений", + "Greyscale": "Відтінки сірого", + "Grid Mode": "Режим сітки", + "Group Name (Must be same for group)": "Назва групи (має бути однаковою для групи)", + "H-Scale %": "Масштаб по горизонталі, %", + "Hanging Indent": "Виступ", + "Hard reloads page": "Примусово перезавантажує сторінку", + "Header & Footer": "Колонтитули", + "Header & Footer added successfully!": "Колонтитули успішно додано!", + "Header Center": "Верхній колонтитул по центру", + "Header Left": "Верхній колонтитул ліворуч", + "Header Right": "Верхній колонтитул праворуч", + "Height ({{unit}})": "Висота ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Сховати", + "Hide Border": "Сховати рамку", + "Hide password": "Сховати пароль", + "Hides window": "Ховає вікно", + "High (288 DPI)": "Висока (288 DPI)", + "High (Smallest Files)": "Висока (найменші файли)", + "Horizontal": "По горизонталі", + "Hue Shift": "Зсув відтінку", + "Image Format": "Формат зображення", + "Image Input": "Вхідне зображення", + "Image quality": "Якість зображення", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Розмір зображення змінено з {{width}}×{{height}} на {{width2}}×{{height2}}", + "Images": "Зображення", + "Images above this are resampled down. None leaves resolution alone.": "Зображення з вищою роздільною здатністю буде зменшено. «Немає» залишає роздільну здатність без змін.", + "Imported {{length}} bookmarks!": "Закладок імпортовано: {{length}}!", + "Inches (in)": "Дюйми (in)", + "Include Attachments": "Включити вкладення", + "Include Cc Bcc": "Включити Cc і Bcc", + "Include this file": "Включити цей файл", + "Incorrect Page Count": "Неправильна кількість сторінок", + "Incorrect Password": "Неправильний пароль", + "Incorrect password": "Неправильний пароль", + "Incorrect password. Please try again.": "Неправильний пароль. Спробуйте ще раз.", + "Increase size": "Збільшити розмір", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Індексація PDF 1, сторінка {{pageNumber}} з {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Індексація PDF 2, сторінка {{pageNumber}} з {{totalPages}}...", + "Info": "Інформація", + "Info Dictionary": "Словник Info", + "Inherit": "Успадкувати", + "Initialization Error": "Помилка ініціалізації", + "Initializing Ghostscript...": "Ініціалізація Ghostscript...", + "Initializing PDF engine...": "Ініціалізація рушія PDF...", + "Initializing PyMuPDF...": "Ініціалізація PyMuPDF...", + "Initializing decryption...": "Ініціалізація розшифрування...", + "Initializing encryption...": "Ініціалізація шифрування...", + "Initializing repair engine...": "Ініціалізація рушія відновлення...", + "Initializing...": "Ініціалізація...", + "Input Required": "Потрібне введення", + "Insecure Digest (MD5 / SHA-1)": "Небезпечний дайджест (MD5 / SHA-1)", + "Insert blank pages": "Вставити порожні сторінки", + "Insert blank pages after this page number": "Вставити порожні сторінки після сторінки з цим номером", + "Interactive Form Fields": "Інтерактивні поля форми", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Чергуйте сторінки з кількох PDF (наприклад, непарні + непарні у зворотному порядку з одностороннього скану)", + "Invalid Certificate": "Недійсний сертифікат", + "Invalid File": "Недійсний файл", + "Invalid Files": "Недійсні файли", + "Invalid Input": "Недійсні дані", + "Invalid JSON format": "Недійсний формат JSON", + "Invalid Name": "Недійсне ім’я", + "Invalid Order": "Недійсний порядок", + "Invalid PDF password.": "Недійсний пароль PDF.", + "Invalid Page Numbers": "Недійсні номери сторінок", + "Invalid Page Order": "Недійсний порядок сторінок", + "Invalid Pages": "Недійсні сторінки", + "Invalid Range": "Недійсний діапазон", + "Invalid Signature": "Недійсний підпис", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "Недійсна URL-адреса TSA. Центр міток часу має бути дійсною URL-адресою http:// або https://.", + "Invalid URL": "Недійсна URL-адреса", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Недійсний формат URL-адреси. Введіть дійсну URL-адресу (наприклад, https://example.com/wasm/)", + "Invalid XML: no root element": "Недійсний XML: немає кореневого елемента", + "Invalid data": "Недійсні дані", + "Invalid hex string in content stream": "Недійсний шістнадцятковий рядок у потоці вмісту", + "Invalid page range specified.": "Указано недійсний діапазон сторінок.", + "Invalid shortcut format": "Недійсний формат комбінації клавіш", + "Invalid: Cryptographic Verification Failed": "Недійсний: криптографічну перевірку не пройдено", + "Invert Colors": "Інвертувати кольори", + "Invert all colors": "Інвертувати всі кольори", + "Inverting PDF colors...": "Інвертування кольорів PDF...", + "Issuer": "Емітент", + "It fits the {{targetBytes}} target.": "Він вкладається в ціль {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Він усе ще більший за ціль {{targetBytes}}, бо «Зберегти PDF/A» обмежує рівень стиснення.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Він більше не заявляє про відповідність PDF/A. Увімкніть «Зберегти PDF/A» у власних налаштуваннях, щоб її зберегти.", + "Italic": "Курсив", + "Item 1": "Елемент 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Його цифрові підписи було видалено, щоб стиснути файл. За потреби підпишіть його знову.", + "JPEG (Smaller file size)": "JPEG (менший розмір файлу)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Якість JPEG для повторно закодованих зображень, від 20 до 100. Менше значення дає менші файли та помітніші артефакти.", + "JPG": "JPG", + "JSON Files": "Файли JSON", + "JSON Loaded": "JSON завантажено", + "JSON to PDF": "JSON у PDF", + "Javascript Code": "Код JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Зберігає відповідність файлу PDF/A. Поки це ввімкнено, Brotli і растеризацію пропущено.", + "Keeps only the characters the document uses.": "Зберігає лише символи, які використовує документ.", + "Key (e.g., Department)": "Ключ (наприклад, Відділ)", + "Keywords": "Ключові слова", + "Label": "Мітка", + "Label / Prompt": "Мітка / підказка", + "Landscape": "Альбомна", + "Language": "Мова", + "Layer not found": "Шар не знайдено", + "Layer {{number}}": "Шар {{number}}", + "Leave blank for all pages": "Залиште порожнім для всіх сторінок", + "Left": "Ліворуч", + "Left edge in points (1 inch = 72 pts)": "Лівий відступ у пунктах (1 дюйм = 72 пт)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Рівень", + "Limit recognized characters (leave empty for all)": "Обмежити розпізнавані символи (залиште порожнім для всіх)", + "Line": "Лінія", + "Linearization Failed": "Лінеаризація не вдалася", + "Linearize": "Лінеаризувати", + "Links stop being clickable.": "Посилання перестають бути клікабельними.", + "Lists": "Списки", + "Load": "Завантажити", + "Load system fonts": "Завантажити системні шрифти", + "Load system fonts…": "Завантажити системні шрифти…", + "Loaded": "Завантажено", + "Loaded bookmarks from JSON. Now upload your PDF.": "Закладки завантажено з JSON. Тепер завантажте свій PDF.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Закладок завантажено з CSV: {{length}}. Тепер завантажте свій PDF.", + "Loading Engine...": "Завантаження рушія...", + "Loading Ghostscript...": "Завантаження Ghostscript...", + "Loading PDF Editor...": "Завантаження редактора PDF...", + "Loading PDF Text Editor...": "Завантаження текстового редактора PDF...", + "Loading PDF converter...": "Завантаження конвертера PDF...", + "Loading PDF documents...": "Завантаження PDF-документів...", + "Loading PDF engine...": "Завантаження рушія PDF...", + "Loading PDF files...": "Завантаження PDF-файлів...", + "Loading PDF form...": "Завантаження PDF-форми...", + "Loading PDF processor...": "Завантаження обробника PDF...", + "Loading PDF viewer...": "Завантаження переглядача PDF...", + "Loading PDF...": "Завантаження PDF...", + "Loading PDFs...": "Завантаження PDF...", + "Loading attachments...": "Завантаження вкладень...", + "Loading comparison {{currentPage}} of {{length}}...": "Завантаження порівняння {{currentPage}} з {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Завантаження рушія конвертації ({{percent}}%)...", + "Loading conversion engine...": "Завантаження рушія конвертації...", + "Loading engine...": "Завантаження рушія...", + "Loading fonts...": "Завантаження шрифтів...", + "Loading layers from {{name}}...": "Завантаження шарів із {{name}}...", + "Loading page {{num}}...": "Завантаження сторінки {{num}}...", + "Loading preview...": "Завантаження попереднього перегляду...", + "Loading {{name}}...": "Завантаження {{name}}...", + "Loading...": "Завантаження...", + "Location": "Розташування", + "Lossless (No Quality Loss)": "Без втрат (без втрати якості)", + "Lossless (no image re-encoding)": "Без втрат (без повторного кодування зображень)", + "Low (Best Quality)": "Низька (найкраща якість)", + "MOBI Files": "Файли MOBI", + "MOBI to PDF": "MOBI у PDF", + "Malformed ByteRange": "Некоректний ByteRange", + "Malformed ECDSA signature (could not parse r,s)": "Некоректний підпис ECDSA (не вдалося розібрати r,s)", + "Malformed inline image in content stream": "Некоректне вбудоване зображення в потоці вмісту", + "Malformed signatureAlgorithm": "Некоректний signatureAlgorithm", + "Margins": "Поля", + "Markdown Files": "Файли Markdown", + "Markdown to PDF": "Markdown у PDF", + "Max Length (0 for unlimited)": "Макс. довжина (0 без обмежень)", + "Maximum resolution": "Максимальна роздільна здатність", + "Medium (Recommended)": "Середня (рекомендовано)", + "Merge PDF": "Об’єднати PDF", + "Merge PDFs": "Об’єднати PDF", + "Merge duplicate fonts": "Об’єднати дублікати шрифтів", + "Mermaid Error: {{error}}": "Помилка Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Метадані скопійовано в буфер обміну як JSON.", + "Metadata removed successfully!": "Метадані успішно видалено!", + "Metadata updated successfully!": "Метадані успішно оновлено!", + "Millimeters (mm)": "Міліметри (мм)", + "Minimizes window": "Згортає вікно", + "Missing Files": "Відсутні файли", + "Missing signatureAlgorithm": "Відсутній signatureAlgorithm", + "Mixed Page Sizes Detected": "Виявлено сторінки різних розмірів", + "Mixed Sizes": "Різні розміри", + "Mode": "Режим", + "Modified": "Змінено", + "Modified After Signing (signed part intact)": "Змінено після підписання (підписана частина не пошкоджена)", + "More": "Ще", + "Moved": "Переміщено", + "Moved \"{{value}}\"": "Переміщено «{{value}}»", + "Multi-line": "Багаторядковий", + "Must be a positive integer": "Має бути додатним цілим числом", + "Must be a positive number": "Має бути додатним числом", + "N must be at least 1.": "N має бути не менше 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF успішно створено!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Помилка мережі: не вдалося підключитися до URL-адреси. Перевірте, чи правильна URL-адреса і чи сервер дозволяє запити CORS.", + "Network error: {{error}}": "Помилка мережі: {{error}}", + "Next page": "Наступна сторінка", + "No Area Selected": "Область не вибрано", + "No Attachments": "Немає вкладень", + "No Changes": "Немає змін", + "No Crop Area": "Немає області обрізання", + "No File": "Немає файлу", + "No Files": "Немає файлів", + "No Images Found": "Зображень не знайдено", + "No PDF Files": "Немає PDF-файлів", + "No PDF document loaded": "PDF-документ не завантажено", + "No PDF document loaded.": "PDF-документ не завантажено.", + "No PDF file loaded.": "PDF-файл не завантажено.", + "No PDF files could be decrypted. The password may be incorrect.": "Не вдалося розшифрувати жодного PDF-файлу. Пароль може бути неправильним.", + "No PDF files could be linearized.": "Не вдалося лінеаризувати жодного PDF-файлу.", + "No PDFs could be processed.": "Не вдалося обробити жодного PDF.", + "No Pages": "Немає сторінок", + "No Selection": "Нічого не вибрано", + "No Signatures Found": "Підписів не знайдено", + "No Tables Found": "Таблиць не знайдено", + "No Text": "Немає тексту", + "No URL configured": "URL-адресу не налаштовано", + "No attachments found in this PDF.": "У цьому PDF вкладень не знайдено.", + "No attachments selected for removal.": "Вкладення для видалення не вибрано.", + "No blank pages detected in this PDF.": "У цьому PDF порожніх сторінок не виявлено.", + "No bookmarks found at the selected level.": "На вибраному рівні закладок не знайдено.", + "No bookmarks to delete.": "Немає закладок для видалення.", + "No bookmarks to export!": "Немає закладок для експорту!", + "No certificate found in PEM file": "У файлі PEM сертифікат не знайдено", + "No certificate found in PFX file": "У файлі PFX сертифікат не знайдено", + "No certificates found in signature": "У підписі сертифікатів не знайдено", + "No changes match the current filter.": "Жодна зміна не відповідає поточному фільтру.", + "No configurable settings for this node.": "Для цього вузла немає налаштувань.", + "No differences detected on this page.": "На цій сторінці відмінностей не виявлено.", + "No embedded images were found in the selected PDF(s).": "У вибраних PDF вбудованих зображень не знайдено.", + "No existing bookmarks found in this PDF.": "У цьому PDF наявних закладок не знайдено.", + "No items were selected for removal or none were found in the PDF.": "Елементи для видалення не вибрано або їх не знайдено в PDF.", + "No page pairs to export.": "Немає пар сторінок для експорту.", + "No pages found. Please create a blank PDF or upload one.": "Сторінок не знайдено. Створіть порожній PDF або завантажте його.", + "No pages selected for removal.": "Сторінки для видалення не вибрано.", + "No pages were selected for splitting.": "Сторінки для поділу не вибрано.", + "No paired page for this side.": "Для цього боку немає парної сторінки.", + "No private key found in PEM file": "У файлі PEM закритий ключ не знайдено", + "No private key found in PFX file": "У файлі PFX закритий ключ не знайдено", + "No tables were detected in this PDF.": "У цьому PDF таблиць не виявлено.", + "No valid page numbers found.": "Дійсних номерів сторінок не знайдено.", + "No valid pages to save.": "Немає дійсних сторінок для збереження.", + "No worker": "Немає worker", + "Noise": "Шум", + "None": "Немає", + "None of the files could be compressed: {{join}}.": "Жоден із файлів не вдалося стиснути: {{join}}.", + "Normal": "Звичайний", + "Not Enough Files": "Недостатньо файлів", + "Not a PDF": "Не PDF", + "Not connected": "Не підключено", + "Not in trust chain": "Немає в ланцюжку довіри", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Примітка: без окремого пароля власника PDF не матиме обмежень на використання.", + "Number Format": "Формат номерів", + "Number of Pages": "Кількість сторінок", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR перервано до обробки будь-якої сторінки", + "OCR recognize timed out after {{timeoutMs}}ms": "Час розпізнавання OCR вичерпано через {{timeoutMs}} мс", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Файли ODG", + "ODG to PDF": "ODG у PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Вимкнено (за замовчуванням): природна нумерація 1–N. Увімкнено: зберігаються початкові мітки сторінок кожного файлу (можливі дублікати міток).", + "One PDF per page": "Один PDF на сторінку", + "One PDF per range": "Один PDF на діапазон", + "Only a substitute font was available": "Був доступний лише замінний шрифт", + "Only where it does not change how the image looks.": "Лише там, де це не змінює вигляд зображення.", + "Opacity": "Непрозорість", + "Open URL": "Відкрити URL", + "Opens incognito window": "Відкриває вікно інкогніто", + "Opens new tab": "Відкриває нову вкладку", + "Opens new window": "Відкриває нове вікно", + "Operation Failed": "Операція не вдалася", + "Operation resulted in an empty file.": "Операція дала порожній файл.", + "Optimize PDF for fast web viewing": "Оптимізуйте PDF для швидкого перегляду в інтернеті", + "Optimizing PDFs for web view (linearizing)...": "Оптимізація PDF для веб-перегляду (лінеаризація)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Оптимізація {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Варіанти (по одному на рядок або через кому)", + "Orientation": "Орієнтація", + "Outline": "Контур", + "Output": "Результат", + "Overlay": "Накладання", + "Overlay or underlay pages from one PDF onto another": "Накладіть сторінки одного PDF поверх іншого або підкладіть їх під нього", + "Owner Password": "Пароль власника", + "Owner Password Required": "Потрібен пароль власника", + "PDF": "PDF", + "PDF Files": "PDF-файли", + "PDF Input": "Вхідний PDF", + "PDF Layers": "Шари PDF", + "PDF Metadata": "Метадані PDF", + "PDF Producer": "Програма-виробник PDF", + "PDF converted to CSV successfully!": "PDF успішно конвертовано в CSV!", + "PDF converted to SVG successfully!": "PDF успішно конвертовано в SVG!", + "PDF converted to greyscale successfully!": "PDF успішно конвертовано у відтінки сірого!", + "PDF created successfully!": "PDF успішно створено!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF успішно розшифровано! Усе шифрування й обмеження знято.", + "PDF decrypted successfully! Your download has started.": "PDF успішно розшифровано! Завантаження почалося.", + "PDF downloaded successfully.": "PDF успішно завантажено.", + "PDF encrypted successfully with 256-bit AES!": "PDF успішно зашифровано 256-бітним AES!", + "PDF has been sanitized and downloaded.": "PDF очищено й завантажено.", + "PDF has no pages": "У PDF немає сторінок", + "PDF organized successfully!": "PDF успішно впорядковано!", + "PDF permissions changed successfully!": "Дозволи PDF успішно змінено!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Програми для перегляду PDF самі надають 14 стандартних шрифтів PDF.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Обмеження PDF успішно знято! Файл тепер можна повністю редагувати й друкувати.", + "PDF saved successfully!": "PDF успішно збережено!", + "PDF split successfully!": "PDF успішно розділено!", + "PDF to CSV": "PDF у CSV", + "PDF to DOCX": "PDF у DOCX", + "PDF to Excel/CSV": "PDF в Excel/CSV", + "PDF to Images": "PDF у зображення", + "PDF to Images (High Quality)": "PDF у зображення (висока якість)", + "PDF to JSON": "PDF у JSON", + "PDF to Markdown": "PDF у Markdown", + "PDF to PDF/A": "PDF у PDF/A", + "PDF to SVG": "PDF у SVG", + "PDF to Text": "PDF у текст", + "PDF to XLSX": "PDF у XLSX", + "PDF with layer changes saved!": "PDF зі змінами шарів збережено!", + "PDF {{modeLabel}} applied successfully.": "PDF ({{modeLabel}}) успішно застосовано.", + "PDF/A Conversion": "Конвертація в PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (суворий, без прозорості)", + "PDF/A-2b (Recommended)": "PDF/A-2b (рекомендовано)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (сучасний, дозволяє вкладення)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF успішно змішано!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (без втрат)", + "PUB to PDF": "PUB у PDF", + "Page": "Сторінка", + "Page #": "Сторінка №", + "Page Added": "Сторінку додано", + "Page Numbers": "Нумерація сторінок", + "Page Removed": "Сторінку видалено", + "Page Size": "Розмір сторінки", + "Page X of Y": "Сторінка X з Y", + "Page background or layout changed": "Змінено тло або макет сторінки", + "Page container not found": "Контейнер сторінки не знайдено", + "Page extraction produced an empty PDF.": "Витягування сторінок дало порожній PDF.", + "Page number": "Номер сторінки", + "Page numbers added successfully!": "Нумерацію сторінок успішно додано!", + "Page sizes standardized successfully!": "Розміри сторінок успішно вирівняно!", + "Page {{currentPageNum}} of {{numPages}}": "Сторінка {{currentPageNum}} з {{numPages}}", + "Page {{num}} / {{numPages}}": "Сторінка {{num}} / {{numPages}}", + "Page {{n}} ": "Сторінка {{n}} ", + "Page {{n}} of {{length}}": "Сторінка {{n}} з {{length}}", + "Page {{n}}:": "Сторінка {{n}}:", + "Page {{pageNumber}}": "Сторінка {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Сторінка {{pageNumber}} є лише в першому PDF.", + "Page {{pageNumber}} exists only in the second PDF.": "Сторінка {{pageNumber}} є лише в другому PDF.", + "Page {{pageNumber}} of {{totalPages}}": "Сторінка {{pageNumber}} з {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Сторінки {{pageNum}} у цьому PDF не існує.", + "Page {{page}}": "Сторінка {{page}}", + "Page {{page}} attachment": "Вкладення сторінки {{page}}", + "Pages": "Сторінки", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Сторінки (наприклад, 1-3, 5), усього: {{pageCount}}", + "Pages Files": "Файли Pages", + "Pages Per Sheet": "Сторінок на аркуші", + "Pages combined successfully!": "Сторінки успішно об’єднано!", + "Pages have been divided successfully!": "Сторінки успішно розділено!", + "Pages have been reordered.": "Порядок сторінок змінено.", + "Pages have been reversed successfully!": "Порядок сторінок успішно змінено на зворотний!", + "Pages to PDF": "Pages у PDF", + "Paper Size": "Розмір паперу", + "Paragraph": "Абзац", + "Parsing XML structure...": "Розбір структури XML...", + "Parsing {{name}}...": "Розбір {{name}}...", + "Partial Coverage": "Часткове покриття", + "Partial Success": "Частковий успіх", + "Password": "Пароль", + "Password Error": "Помилка пароля", + "Password Needed": "Потрібен пароль", + "Password Required": "Потрібен пароль", + "Password for all files": "Пароль для всіх файлів", + "Password for all locked files": "Пароль для всіх заблокованих файлів", + "Password for {{name}}": "Пароль для {{name}}", + "Password protected": "Захищено паролем", + "Password required for encrypted private key": "Для зашифрованого закритого ключа потрібен пароль", + "Path Stroke": "Обведення контуру", + "Please add at least one field before downloading.": "Додайте принаймні одне поле перед завантаженням.", + "Please draw a rectangle on at least one page to select the crop area.": "Намалюйте прямокутник принаймні на одній сторінці, щоб вибрати область обрізання.", + "Please ensure all page numbers in the order are unique.": "Переконайтеся, що всі номери сторінок у порядку унікальні.", + "Please enter a layer name": "Введіть назву шару", + "Please enter a name.": "Введіть ім’я.", + "Please enter a number between 0 and {{totalPages}}.": "Введіть число від 0 до {{totalPages}}.", + "Please enter a page order.": "Введіть порядок сторінок.", + "Please enter a password": "Введіть пароль", + "Please enter a password for {{i}} or skip it": "Введіть пароль для {{i}} або пропустіть", + "Please enter a title.": "Введіть назву.", + "Please enter a user password.": "Введіть пароль користувача.", + "Please enter a valid number of pages (1 or more).": "Введіть дійсну кількість сторінок (1 або більше).", + "Please enter a valid page number between 1 and {{total}}": "Введіть дійсний номер сторінки від 1 до {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Введіть дійсний діапазон сторінок (наприклад, 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Введіть номери сторінок для витягування.", + "Please enter positive numbers.": "Введіть додатні числа.", + "Please enter some text to convert.": "Введіть текст для конвертації.", + "Please enter text for the watermark.": "Введіть текст для водяного знака.", + "Please enter the PDF password.": "Введіть пароль PDF.", + "Please load a PDF first.": "Спочатку завантажте PDF.", + "Please select PDF files to create a ZIP archive.": "Виберіть PDF-файли, щоб створити ZIP-архів.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Виберіть файл сертифіката .pem, .crt, .cer або .der.", + "Please select a PDF file.": "Виберіть PDF-файл.", + "Please select a valid PDF file.": "Виберіть дійсний PDF-файл.", + "Please select an area on at least one page to crop.": "Виберіть область принаймні на одній сторінці для обрізання.", + "Please select an area to crop first.": "Спочатку виберіть область для обрізання.", + "Please select an area to crop.": "Виберіть область для обрізання.", + "Please select an image file for the watermark.": "Виберіть файл зображення для водяного знака.", + "Please select at least one BMP file.": "Виберіть принаймні один файл BMP.", + "Please select at least one CSV file.": "Виберіть принаймні один файл CSV.", + "Please select at least one Excel file.": "Виберіть принаймні один файл Excel.", + "Please select at least one HEIC file.": "Виберіть принаймні один файл HEIC.", + "Please select at least one JPG file.": "Виберіть принаймні один файл JPG.", + "Please select at least one JPG or JPEG2000 image.": "Виберіть принаймні одне зображення JPG або JPEG2000.", + "Please select at least one ODT file.": "Виберіть принаймні один файл ODT.", + "Please select at least one PDF file.": "Виберіть принаймні один PDF-файл.", + "Please select at least one PowerPoint file.": "Виберіть принаймні один файл PowerPoint.", + "Please select at least one RTF file.": "Виберіть принаймні один файл RTF.", + "Please select at least one SVG file.": "Виберіть принаймні один файл SVG.", + "Please select at least one TIFF file.": "Виберіть принаймні один файл TIFF.", + "Please select at least one Word document.": "Виберіть принаймні один документ Word.", + "Please select at least one file to attach.": "Виберіть принаймні один файл для вкладення.", + "Please select at least one image file.": "Виберіть принаймні один файл зображення.", + "Please select at least one text file.": "Виберіть принаймні один текстовий файл.", + "Please select at least one {{FILETYPE_NAME}} file.": "Виберіть принаймні один файл {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Виберіть принаймні один файл {{TOOL_NAME}} (.eml або .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Виберіть принаймні один файл {{TOOL_NAME}}.", + "Please select even or odd pages.": "Виберіть парні або непарні сторінки.", + "Please select one or more PDF files.": "Виберіть один або кілька PDF-файлів.", + "Please select pages to delete.": "Виберіть сторінки для видалення.", + "Please select pages to duplicate.": "Виберіть сторінки для дублювання.", + "Please select pages to mark for splitting.": "Виберіть сторінки, після яких потрібно розділити.", + "Please select pages to rotate.": "Виберіть сторінки для повороту.", + "Please specify a page range for page-level attachments.": "Укажіть діапазон сторінок для вкладень на рівні сторінок.", + "Please upload PDF files.": "Завантажте PDF-файли.", + "Please upload PDFs first.": "Спочатку завантажте PDF.", + "Please upload a .docx file first.": "Спочатку завантажте файл .docx.", + "Please upload a PDF file first.": "Спочатку завантажте PDF-файл.", + "Please upload a PDF file.": "Завантажте PDF-файл.", + "Please upload a PDF first.": "Спочатку завантажте PDF.", + "Please upload a valid PDF file.": "Завантажте дійсний PDF-файл.", + "Please upload at least one PDF file.": "Завантажте принаймні один PDF-файл.", + "Please upload at least two PDF files to alternate and mix.": "Завантажте принаймні два PDF-файли для чергування та змішування.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Завантажте і базовий PDF, і PDF для накладання або підкладання.", + "Please upload valid PDF files.": "Завантажте дійсні PDF-файли.", + "Please use the Download button in the PDF viewer toolbar above.": "Скористайтеся кнопкою «Завантажити» на панелі інструментів переглядача PDF вище.", + "Please wait for the PDF viewer to load.": "Зачекайте, поки завантажиться переглядач PDF.", + "Please wait for the form to finish loading.": "Зачекайте, поки форма завершить завантаження.", + "Portrait": "Книжкова", + "Position": "Положення", + "Post-processing for transparency compliance...": "Постобробка для відповідності вимогам прозорості...", + "Posterize": "Постеризація", + "Posterizing PDF...": "Постеризація PDF...", + "PowerPoint to PDF": "PowerPoint у PDF", + "Pre Flatten": "Попереднє сплющення", + "Pre-flattening PDF...": "Попереднє сплющення PDF...", + "Prefer JPEG 2000 for photos": "Віддавати перевагу JPEG 2000 для фото", + "Preparing PDF export...": "Підготовка експорту PDF...", + "Preparing conversion...": "Підготовка до конвертації...", + "Preparing download...": "Підготовка до завантаження...", + "Preparing preview...": "Підготовка попереднього перегляду...", + "Presentations": "Презентації", + "Preserve PDF/A": "Зберегти PDF/A", + "Preview": "Попередній перегляд", + "Preview Error": "Помилка попереднього перегляду", + "Preview Text": "Попередній перегляд тексту", + "Previous page": "Попередня сторінка", + "Print Form": "Друкувати форму", + "Private data that editing apps store inside the PDF.": "Приватні дані, які програми для редагування зберігають усередині PDF.", + "Processed {{processedCount}} PDFs.": "Оброблено PDF: {{processedCount}}.", + "Processing Complete": "Обробку завершено", + "Processing Dpi": "DPI обробки", + "Processing Failed": "Обробка не вдалася", + "Processing PDF permissions...": "Обробка дозволів PDF...", + "Processing attachments...": "Обробка вкладень...", + "Processing failed for {{name}}.": "Не вдалося обробити {{name}}.", + "Processing file {{n}} of {{length}}...": "Обробка файлу {{n}} з {{length}}...", + "Processing images...": "Обробка зображень...", + "Processing multiple PDFs...": "Обробка кількох PDF...", + "Processing page {{i}} of {{numPages}}": "Обробка сторінки {{i}} з {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Обробка сторінки {{i}} з {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Обробка сторінки {{n}} з {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Обробка сторінки {{pageNum}} з {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Обробка сторінки {{pageNum}} з {{totalPages}}...", + "Processing produced an empty file.": "Обробка дала порожній файл.", + "Processing resulted in an empty file.": "Обробка дала порожній файл.", + "Processing sheet {{n}}...": "Обробка аркуша {{n}}...", + "Processing {{name}}...": "Обробка {{name}}...", + "Processing {{nodeName}}...": "Обробка {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Обробка {{n}}/{{length}}: {{name}}...", + "Processing...": "Обробка...", + "Producer": "Програма-виробник", + "Publisher Files": "Файли Publisher", + "Purple": "Фіолетовий", + "PyMuPDF (Document Processing)": "PyMuPDF (обробка документів)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF не налаштовано. Налаштуйте його в додаткових налаштуваннях.", + "PyMuPDF module did not export expected PyMuPDF class.": "Модуль PyMuPDF не експортував очікуваний клас PyMuPDF.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF створив порожній розшифрований файл.", + "PyMuPDF: not configured.": "PyMuPDF: не налаштовано.", + "QR Code": "QR-код", + "Quality": "Якість", + "Quits application (cannot be overridden)": "Закриває програму (неможливо перевизначити)", + "RSA-PKCS1 signature does not verify against signer public key": "Підпис RSA-PKCS1 не збігається з відкритим ключем підписувача", + "RSA-PSS signature does not verify against signer public key": "Підпис RSA-PSS не збігається з відкритим ключем підписувача", + "Rasterization Complete": "Растеризацію завершено", + "Rasterization Partial": "Растеризація виконана частково", + "Rasterize": "Растеризувати", + "Rasterize Dpi": "DPI растеризації", + "Rasterize pages to images": "Растеризувати сторінки в зображення", + "Rasterize quality": "Якість растеризації", + "Rasterize resolution (DPI)": "Роздільна здатність растеризації (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Растеризовано PDF: {{completed}}, не вдалося: {{failed}}.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Растеризація {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Растеризація {{name}}...", + "Rasterizing...": "Растеризація...", + "Rating must be between 0 and 5": "Оцінка має бути від 0 до 5", + "Read Only": "Лише читання", + "Reading CSV file...": "Читання файлу CSV...", + "Reading PDF...": "Читання PDF...", + "Reading XML file...": "Читання файлу XML...", + "Reading encrypted PDF...": "Читання зашифрованого PDF...", + "Reading files...": "Читання файлів...", + "Reading layer configuration...": "Читання конфігурації шарів...", + "Reading {{name}} ({{n}}/{{length}})...": "Читання {{name}} ({{n}}/{{length}})...", + "Ready": "Готово", + "Reason": "Причина", + "Red": "Червоний", + "Redact": "Закреслити", + "Redact Mode": "Режим закреслення", + "Redact text from PDF": "Закреслити текст у PDF", + "Redaction Failed": "Не вдалося закреслити", + "Reduce PDF file size": "Зменшити розмір PDF-файлу", + "Reduce color complexity": "Зменшити складність кольорів", + "Reduces file size by removing color information.": "Зменшує розмір файлу, видаляючи інформацію про колір.", + "Reloads page": "Перезавантажує сторінку", + "Remove": "Видалити", + "Remove All Attachments": "Видалити всі вкладення", + "Remove Annotations": "Видалити анотації", + "Remove Blank Pages": "Видалити порожні сторінки", + "Remove Embedded Files": "Видалити вбудовані файли", + "Remove Fonts": "Видалити шрифти", + "Remove Javascript": "Видалити JavaScript", + "Remove Layers": "Видалити шари", + "Remove Links": "Видалити посилання", + "Remove Mark Info": "Видалити Mark Info", + "Remove Metadata": "Видалити метадані", + "Remove PDF password protection": "Зняти захист PDF паролем", + "Remove Structure Tree": "Видалити дерево структури", + "Remove alternate images": "Видалити альтернативні зображення", + "Remove application data": "Видалити дані програм", + "Remove article threads": "Видалити ланцюжки статей", + "Remove attachment": "Видалити вкладення", + "Remove blank pages automatically": "Автоматично видалити порожні сторінки", + "Remove document structure tree": "Видалити дерево структури документа", + "Remove file": "Видалити файл", + "Remove metadata, scripts, and hidden data": "Видалити метадані, скрипти та приховані дані", + "Remove output intents": "Видалити вихідні наміри", + "Remove page thumbnails": "Видалити мініатюри сторінок", + "Remove specific pages": "Видалити окремі сторінки", + "Remove web capture information": "Видалити інформацію про веб-захоплення", + "Remove {{name}}": "Видалити {{name}}", + "Removed \"{{beforeText}}\"": "Видалено «{{beforeText}}»", + "Removed image ({{width}}×{{height}})": "Видалено зображення ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Порожніх сторінок успішно видалено: {{length}}!", + "Removing all metadata...": "Видалення всіх метаданих...", + "Removing annotations...": "Видалення анотацій...", + "Removing redacted text from document data...": "Видалення закресленого тексту з даних документа...", + "Removing restrictions...": "Зняття обмежень...", + "Removing {{length}} blank page(s)...": "Видалення порожніх сторінок: {{length}}...", + "Render Error": "Помилка відображення", + "Rendering Page {{num}}...": "Відображення сторінки {{num}}...", + "Rendering page previews...": "Відображення попереднього перегляду сторінок...", + "Rendering page previews: {{current}}/{{total}}": "Відображення попереднього перегляду сторінок: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Відображення сторінки {{n}} з {{length}}...", + "Rendering preview for page {{pageNum}}...": "Відображення попереднього перегляду сторінки {{pageNum}}...", + "Reopens closed tab": "Відкриває закриту вкладку", + "Repair": "Відновити", + "Repair Failed": "Не вдалося відновити", + "Repair corrupted PDF": "Відновити пошкоджений PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Відновлено файлів: {{length}}. Не вдалося відновити: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Відновлення {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Відновлення {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Замінено «{{beforeText}}» на «{{afterText}}»", + "Required": "Обов’язково", + "Resamples even when an image is only slightly above the limit.": "Змінює роздільну здатність, навіть якщо зображення лише трохи перевищує ліміт.", + "Reset Form": "Скинути форму", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Скинути та повернутися до завантаження файлів? Усі незбережені зміни буде втрачено.", + "Resolution": "Роздільна здатність", + "Retain Page Labels": "Зберегти мітки сторінок", + "Retry Failed": "Повторити невдалі", + "Reverse Pages": "Зворотний порядок сторінок", + "Reverse page order": "Змінити порядок сторінок на зворотний", + "Reversing page order...": "Зміна порядку сторінок на зворотний...", + "Reversing {{name}} ({{n}}/{{length}})...": "Зміна порядку {{name}} на зворотний ({{n}}/{{length}})...", + "Right": "Праворуч", + "Right edge in points": "Правий відступ у пунктах", + "Rotate": "Повернути", + "Rotate +90°": "Повернути на +90°", + "Rotate all pages": "Повернути всі сторінки", + "Rotation": "Поворот", + "Rotation Variance": "Варіація повороту", + "Rotations applied successfully!": "Повороти успішно застосовано!", + "Rows": "Рядки", + "Run Javascript": "Запустити JavaScript", + "Running OCR on page {{pageNum}}...": "Запуск OCR для сторінки {{pageNum}}...", + "Running...": "Виконання...", + "SVG": "SVG", + "SVG Files": "Файли SVG", + "SVG to PDF": "SVG у PDF", + "Sanitize": "Очистити", + "Sanitized With Warnings": "Очищено з попередженнями", + "Sanitizing PDF...": "Очищення PDF...", + "Saturation": "Насиченість", + "Saved": "Збережено", + "Saving PDF with layer changes...": "Збереження PDF зі змінами шарів...", + "Scaling Mode": "Режим масштабування", + "Scanner Effect": "Ефект сканера", + "Scanner effect applied successfully!": "Ефект сканера успішно застосовано!", + "Scanning page {{n}} of {{pageCount}}...": "Сканування сторінки {{n}} з {{pageCount}}...", + "Search Text": "Пошук тексту", + "Search languages...": "Пошук мов...", + "Select Font": "Виберіть шрифт", + "Select a field to edit properties": "Виберіть поле, щоб змінити його властивості", + "Select a field...": "Виберіть поле...", + "Select to add this button to an existing group": "Виберіть, щоб додати цю кнопку до наявної групи", + "Selected Option": "Вибраний варіант", + "Self-Signed: Signer Identity Not Verified": "Самопідписаний: особу підписувача не перевірено", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Власні ресурси OCR налаштовано лише частково. Укажіть {{missing}} разом з іншими URL-адресами ресурсів Tesseract.", + "Separator": "Роздільник", + "Separator Color": "Колір роздільника", + "Separator Thickness": "Товщина роздільника", + "Sepia": "Сепія", + "Serial Number:": "Серійний номер:", + "Set custom destination": "Задати власне призначення", + "Shapes": "Фігури", + "Sheet {{n}} {{sideLabel}}": "Аркуш {{n}} {{sideLabel}}", + "Show": "Показати", + "Show password": "Показати пароль", + "Show/Hide Field": "Показати/сховати поле", + "Sign Here": "Підпишіть тут", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents не є одним об’єктом DER із нульовим доповненням", + "Signature Algorithm:": "Алгоритм підпису:", + "Signature Intact: Signer Identity Not Verified": "Підпис цілісний: особу підписувача не перевірено", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Поля підпису є полями підпису AcroForm і будуть видимі лише в розширеному переглядачі PDF.", + "Signature has a missing or malformed /ByteRange": "У підпису відсутній або некоректний /ByteRange", + "Signature scheme {{kind}} not implemented": "Схема підпису {{kind}} не реалізована", + "Signature {{n}}": "Підпис {{n}}", + "Signatures": "Підписи", + "Signed By": "Підписав", + "Signed On": "Дата підписання", + "Signed PDF Not Changed": "Підписаний PDF не змінено", + "Signed PDF downloaded successfully!": "Підписаний PDF успішно завантажено!", + "Signed PDF saved successfully!": "Підписаний PDF успішно збережено!", + "Simple (1, 2, 3)": "Простий (1, 2, 3)", + "Simplify large color profiles": "Спростити великі профілі кольорів", + "Skew Threshold": "Поріг нахилу", + "Skip": "Пропустити", + "Skip All": "Пропустити все", + "Skip Remaining": "Пропустити решту", + "Skip this file": "Пропустити цей файл", + "Skipped: {{join}}.": "Пропущено: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Файли менші, але відкрити їх можуть лише програми з підтримкою Brotli, як-от Firefox, MuPDF 1.26+ і Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Деякі файли пропущено, бо вони не є підтримуваними зображеннями.", + "Some files were skipped. Only BMP files are allowed.": "Деякі файли пропущено. Дозволено лише файли BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Деякі файли пропущено. Дозволено лише файли HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Деякі файли пропущено. Дозволено лише файли JPG, JPEG, JP2 і JPX.", + "Some files were skipped. Only PDF files are allowed.": "Деякі файли пропущено. Дозволено лише PDF-файли.", + "Some files were skipped. Only PNG images are allowed.": "Деякі файли пропущено. Дозволено лише зображення PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Деякі файли пропущено. Дозволено лише графіку SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Деякі файли пропущено. Дозволено лише файли TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Деякі файли пропущено. Дозволено лише зображення WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Деякі файли пропущено. Дозволено лише підтримувані формати зображень.", + "Some files were skipped. Only text files are allowed.": "Деякі файли пропущено. Дозволено лише текстові файли.", + "Some pages could not be processed. Please try again.": "Деякі сторінки не вдалося обробити. Спробуйте ще раз.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Деякі позначки закреслення не вдалося застосувати, тому файл не завантажено. Застосуйте або видаліть їх у редакторі та спробуйте ще раз.", + "Spacing": "Інтервал", + "Split PDF": "Розділити PDF", + "Split by Bookmarks": "Розділити за закладками", + "Split pages into tile grid for poster printing": "Розбийте сторінки на сітку плиток для друку плаката", + "Split pages vertically or horizontally": "Розділіть сторінки по вертикалі або по горизонталі", + "Splitting PDF pages...": "Розділення сторінок PDF...", + "Splitting PDF...": "Розділення PDF...", + "Spreadsheets": "Таблиці", + "Standard (192 DPI)": "Стандартна (192 DPI)", + "Standard Size": "Стандартний розмір", + "Standardize all pages to a target size": "Приведіть усі сторінки до цільового розміру", + "Standardizing pages...": "Вирівнювання розмірів сторінок...", + "Stitch all pages into one continuous page": "Зшийте всі сторінки в одну суцільну сторінку", + "Straighten skewed PDF pages": "Вирівняйте нахилені сторінки PDF", + "Strip all annotations": "Видалити всі анотації", + "Style": "Стиль", + "Style Changed": "Стиль змінено", + "Style changed ({{length}} regions)": "Стиль змінено (областей: {{length}})", + "Subject": "Тема", + "Subset embedded fonts": "Створити підмножину вбудованих шрифтів", + "Success": "Успішно", + "Success!": "Успішно!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Файлів CSV успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Файлів Excel успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Файлів ODT успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} PDF(s) to DOCX.": "PDF успішно конвертовано в DOCX: {{length}}.", + "Successfully converted {{length}} PDF(s) to Markdown.": "PDF успішно конвертовано в Markdown: {{length}}.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "PDF успішно конвертовано ({{level}}): {{length}}.", + "Successfully converted {{length}} PSD files to a single PDF.": "Файлів PSD успішно конвертовано в один PDF: {{length}}.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Файлів PowerPoint успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Файлів RTF успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} Word document(s) to PDF.": "Документів Word успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} files to PDF.": "Файлів успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Файлів {{TOOL_NAME}} успішно конвертовано в PDF: {{length}}.", + "Successfully converted {{name}} to DOCX.": "{{name}} успішно конвертовано в DOCX.", + "Successfully converted {{name}} to Markdown.": "{{name}} успішно конвертовано в Markdown.", + "Successfully converted {{name}} to PDF.": "{{name}} успішно конвертовано в PDF.", + "Successfully converted {{name}} to {{level}}.": "{{name}} успішно конвертовано ({{level}}).", + "Successfully extracted PDF for AI/LLM use.": "PDF успішно витягнуто для використання з AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "PDF успішно витягнуто для використання з AI/LLM: {{completed}}.", + "Successfully rasterized PDF at {{dpi}} DPI.": "PDF успішно растеризовано з {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "PDF успішно растеризовано з {{dpi}} DPI: {{completed}}.", + "Supported: CBZ, CBR": "Підтримуються: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Підтримуються: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Підтримуються: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Підтримуються: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Підтримуються: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Підтримуються: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Підтримуються: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Підтримуються: XPS, OXPS", + "Switches apps": "Перемикає програми", + "Switches tabs": "Перемикає вкладки", + "Table of Contents": "Зміст", + "Table {{n}} (Page {{page}})": "Таблиця {{n}} (сторінка {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Цільове поле", + "Target Kilobytes": "Цільовий розмір у кілобайтах", + "Target Not Reached": "Цілі не досягнуто", + "Target Size": "Цільовий розмір", + "Technical Details": "Технічні подробиці", + "Temperature": "Температура", + "Template \"{{name}}\" loaded.": "Шаблон «{{name}}» завантажено.", + "Template \"{{name}}\" saved.": "Шаблон «{{name}}» збережено.", + "Text": "Текст", + "Text Color": "Колір тексту", + "Text Files": "Текстові файли", + "Text color changed successfully!": "Колір тексту успішно змінено!", + "Text converted to PDF successfully!": "Текст успішно конвертовано в PDF!", + "Text extracted successfully!": "Текст успішно витягнуто!", + "Text to PDF": "Текст у PDF", + "That password did not open any of the remaining files.": "Цей пароль не відкрив жодного з файлів, що залишилися.", + "The PDF file(s) do not contain any attachments to extract.": "У PDF-файлах немає вкладень для витягування.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "У PDF {{totalPages}} стор., що не ділиться націло на {{nValue}}. Останній PDF міститиме сторінок: {{remainder}}.", + "The PDF might be corrupted or password protected.": "PDF може бути пошкоджений або захищений паролем.", + "The PDF might be corrupted or password-protected.": "PDF може бути пошкоджений або захищений паролем.", + "The PDF might be corrupted.": "PDF може бути пошкоджений.", + "The PDF viewer is still initializing.": "Переглядач PDF ще ініціалізується.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF завантажено, але ці кроки виконати не вдалося: {{join}}. Вміст, якого вони стосуються, може й далі бути у файлі.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL-адреса повернула неочікуваний тип вмісту: {{contentType}}. Очікувався файл JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Байти, виключені з /ByteRange, не є точно підписом у шістнадцятковому кодуванні", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Байти, виключені з /ByteRange, не є /Contents цього підпису", + "The compression engine returned an unreadable result.": "Рушій стиснення повернув нечитабельний результат.", + "The compression engine stopped unexpectedly.": "Рушій стиснення несподівано зупинився.", + "The current password you entered is incorrect. Please try again.": "Введений вами поточний пароль неправильний. Спробуйте ще раз.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Ці імена полів уже є в завантаженому PDF: {{conflictList}}. Перейменуйте ці поля, перш ніж завантажувати.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Ці імена полів використано більше одного разу: {{duplicateList}}. Перейменуйте ці поля, щоб імена були унікальними, перш ніж завантажувати.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Указана кількість сторінок ({{length}}) не збігається з поточною кількістю сторінок у документі ({{currentGridCount}}). Укажіть повний порядок для всіх сторінок.", + "The password you entered is incorrect. Please try again.": "Введений вами пароль неправильний. Спробуйте ще раз.", + "The password you entered is wrong or the file is corrupted.": "Введений вами пароль неправильний, або файл пошкоджений.", + "The provided file could not be loaded as an image. It may be corrupted.": "Наданий файл не вдалося завантажити як зображення. Він може бути пошкоджений.", + "The requested OCR language is not available: {{unavailableText}}.": "Запитана мова OCR недоступна: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Указаний порядок сторінок неповний або містить недійсні номери сторінок. Укажіть нову позицію для кожної початкової сторінки.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Ці файли не є дійсними PDF, тому їх не додано: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Ці файли захищені паролем: {{names}}. Введіть їхні паролі на картках файлів або видаліть їх, а потім стисніть знову.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Ця збірка BentoPDF містить дані OCR лише для таких мов: {{availableText}}.", + "This PDF does not contain any digital signatures.": "У цьому PDF немає цифрових підписів.", + "This PDF has no layers (OCG).": "У цьому PDF немає шарів (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "Цей PDF захищений паролем. Введіть поточний пароль, щоб продовжити.", + "This document contains pages with different dimensions:": "Цей документ містить сторінки різних розмірів:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "У документі є 1 мітка приховування, яку ще не застосовано. Доки мітку не застосовано, вміст під нею залишається у файлі. Застосувати всі мітки та завантажити?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "У документі є незастосовані мітки приховування (усього: {{count}}). Доки мітку не застосовано, вміст під нею залишається у файлі. Застосувати всі мітки та завантажити?", + "This feature requires {{name}} to be configured.": "Для цієї функції потрібно налаштувати {{name}}.", + "This file is not a valid PDF.": "Цей файл не є дійсним PDF.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Цей модуль ліцензовано за AGPL-3.0. Налаштовуючи його, ви погоджуєтеся з умовами ліцензії.", + "This tool has been disabled": "Цей інструмент вимкнено", + "This tool is not available in your deployment. Contact your administrator for more information.": "Цей інструмент недоступний у вашому розгортанні. Зверніться до адміністратора по докладнішу інформацію.", + "Threshold": "Поріг", + "Tile": "Плитка", + "Tile Gap X": "Проміжок між плитками по X", + "Tile Gap Y": "Проміжок між плитками по Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Мітка часу", + "Timestamp Failed": "Не вдалося додати мітку часу", + "Tint": "Відтінок", + "Title": "Назва", + "To actually fill or change the options, use our PDF Form Filler tool.": "Щоб заповнити поля або змінити параметри, скористайтеся нашим інструментом заповнення PDF-форм.", + "Toggle": "Перемкнути", + "Toggle style": "Перемкнути стиль", + "Toggle sync scroll": "Перемкнути синхронне прокручування", + "Tool Unavailable": "Інструмент недоступний", + "Tooltip / Help Text": "Підказка / довідковий текст", + "Top": "Угорі", + "Top Center": "Угорі по центру", + "Top Left": "Угорі ліворуч", + "Top Right": "Угорі праворуч", + "Top edge in points": "Верхній відступ у пунктах", + "Total Pages": "Усього сторінок", + "Transparent Background": "Прозоре тло", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Для кожного зображення пробує JPEG 2000 і JPEG та зберігає менше.", + "Trim margins from all pages": "Обрізати поля на всіх сторінках", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Перевірка довіри: підписів, перевірених за власним сертифікатом: {{trustVerified}}/{{length}}", + "Trusted": "Довірений", + "Trusted certificate loaded": "Довірений сертифікат завантажено", + "Tsa Url": "URL-адреса TSA", + "Turns off quality, resolution and every other lossy image step.": "Вимикає якість, роздільну здатність і всі інші етапи стиснення зображень із втратами.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL-адреса має починатися з http:// або https://", + "Ultra (384 DPI)": "Ультра (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Не вдалося розшифрувати PDF із наданим паролем.", + "Unable to repair any of the uploaded PDF files.": "Не вдалося відновити жодного із завантажених PDF-файлів.", + "Unembed standard fonts": "Не вбудовувати стандартні шрифти", + "Unembed standard-font look-alikes": "Не вбудовувати аналоги стандартних шрифтів", + "Unexpected delimiter in content stream": "Неочікуваний роздільник у потоці вмісту", + "Unexpected reply from the engine.": "Неочікувана відповідь від рушія.", + "Uniform": "Рівномірно", + "Unique Page Sizes": "Унікальні розміри сторінок", + "Unknown": "Невідомо", + "Unknown error": "Невідома помилка", + "Unknown error occurred in worker.": "У worker сталася невідома помилка.", + "Unknown error occurred.": "Сталася невідома помилка.", + "Unlock": "Розблокувати", + "Unlock All": "Розблокувати все", + "Unlock Remaining ({{remaining}})": "Розблокувати решту ({{remaining}})", + "Unlocked": "Розблоковано", + "Unlocked {{unlocked}} of {{length}} files.": "Розблоковано файлів: {{unlocked}} з {{length}}.", + "Unlocking...": "Розблокування...", + "Unresolved optional content reference": "Невизначене посилання на необов’язковий вміст", + "Unsupported ECDSA curve in signer certificate": "Непідтримувана крива ECDSA в сертифікаті підписувача", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Непідтримуване зображення. Для водяного знака використовуйте PNG або JPG.", + "Unsupported digest OID {{digestOid}}": "Непідтримуваний OID дайджесту {{digestOid}}", + "Unsupported file type: .{{ext}}": "Непідтримуваний тип файлу: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Непідтримуваний OID алгоритму підпису {{oid}}", + "Unterminated array or dictionary in content stream": "Незавершений масив або словник у потоці вмісту", + "Unterminated hex string in content stream": "Незавершений шістнадцятковий рядок у потоці вмісту", + "Unterminated inline image in content stream": "Незавершене вбудоване зображення в потоці вмісту", + "Unterminated string in content stream": "Незавершений рядок у потоці вмісту", + "Unverified: Unsupported Signature Algorithm": "Не перевірено: непідтримуваний алгоритм підпису", + "Updating metadata...": "Оновлення метаданих...", + "Upload Certificate": "Завантажити сертифікат", + "Upload Comics": "Завантажити комікси", + "Upload Documents": "Завантажити документи", + "Upload EPUB Files": "Завантажити файли EPUB", + "Upload Email Files": "Завантажити файли електронної пошти", + "Upload FB2 Files": "Завантажити файли FB2", + "Upload Images": "Завантажити зображення", + "Upload JSON Files": "Завантажити файли JSON", + "Upload MOBI Files": "Завантажити файли MOBI", + "Upload Markdown Files": "Завантажити файли Markdown", + "Upload ODG Files": "Завантажити файли ODG", + "Upload PDFs": "Завантажити PDF", + "Upload PUB Files": "Завантажити файли PUB", + "Upload Pages Files": "Завантажити файли Pages", + "Upload Presentations": "Завантажити презентації", + "Upload SVG Files": "Завантажити файли SVG", + "Upload Spreadsheets": "Завантажити таблиці", + "Upload Text Files": "Завантажити текстові файли", + "Upload Visio Files": "Завантажити файли Visio", + "Upload WPD Files": "Завантажити файли WPD", + "Upload WPS Files": "Завантажити файли WPS", + "Upload XML Files": "Завантажити файли XML", + "Upload XPS Files": "Завантажити файли XPS", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Завантажте PDF і натисніть «Створити попередній перегляд», щоб побачити макет буклета", + "Upload images and convert to PDF": "Завантажте зображення й конвертуйте їх у PDF", + "Upload one or more PDF files": "Завантажте один або кілька PDF-файлів", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Великі літери A-Z, цифри 0-9 та символи - . $ / + % ПРОБІЛ", + "Use same password for all files": "Той самий пароль для всіх файлів", + "User Password": "Пароль користувача", + "VSD to PDF": "VSD у PDF", + "Valid From": "Дійсний з", + "Valid Signature": "Дійсний підпис", + "Valid Until": "Дійсний до", + "Validating {{n}} of {{length}}: {{name}}": "Перевірка {{n}} з {{length}}: {{name}}", + "Validating...": "Перевірка...", + "Value": "Значення", + "Value (e.g., Marketing)": "Значення (наприклад, Маркетинг)", + "Vertical": "По вертикалі", + "Viewer not ready": "Переглядач не готовий", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Переглядач не готовий. Завантажте PDF і зачекайте, поки він завершить завантаження.", + "Visibility": "Видимість", + "Visio Files": "Файли Visio", + "WPD to PDF": "WPD у PDF", + "WPS Files": "Файли WPS", + "WPS to PDF": "WPS у PDF", + "Watermark": "Водяний знак", + "Watermark added successfully!": "Водяний знак успішно додано!", + "Web Crypto API not available in this context": "Web Crypto API недоступний у цьому контексті", + "Web Crypto import/verify failed: {{error}}": "Помилка імпорту/перевірки Web Crypto: {{error}}", + "WebP": "WebP", + "Whitelist": "Білий список", + "Width ({{unit}})": "Ширина ({{unit}})", + "Word": "Word", + "Word Documents": "Документи Word", + "Word to PDF": "Word у PDF", + "WordPerfect Files": "Файли WordPerfect", + "Worker crashed": "Worker аварійно завершився", + "Worker error occurred. Check console for details.": "Сталася помилка worker. Подробиці дивіться в консолі.", + "Workflow completed": "Процес завершено", + "Wrong password": "Неправильний пароль", + "Wrong password for: {{join}}": "Неправильний пароль для: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Неправильний пароль або не вдалося розшифрувати «{{name}}».", + "X Position": "Положення по X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Файли XML", + "XML to PDF": "XML у PDF", + "XMP Metadata": "Метадані XMP", + "XPS Files": "Файли XPS", + "XPS to PDF": "XPS у PDF", + "Y Position": "Положення по Y", + "Year must be between 1900 and 2100": "Рік має бути від 1900 до 2100", + "Yellow": "Жовтий", + "Yellowish": "Жовтуватий", + "You cannot delete the last page of the document.": "Не можна видалити останню сторінку документа.", + "Your PDF has been cropped and the download has started.": "Ваш PDF обрізано, завантаження почалося.", + "Your PDF has been downloaded successfully.": "Ваш PDF успішно завантажено.", + "Your PDF has been posterized.": "Ваш PDF постеризовано.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Ваші закреслення застосовано до сторінок, але цей файл зашифрований, тому BentoPDF не може також видалити копії закресленого тексту з його властивостей, закладок і вкладень. Для повного очищення закресліть текст у незашифрованій копії, а потім додайте пароль за допомогою «Захистити PDF». Усе одно завантажити?", + "Your workflow needs at least one input node and one output node to run.": "Для запуску вашому процесу потрібен принаймні один вхідний і один вихідний вузол.", + "ZIP archive created successfully!": "ZIP-архів успішно створено!", + "Zoom(%)": "Масштаб (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "напр. dd/mm/yyyy HH:MM:ss", + "form": "форма", + "https://example.com": "https://example.com", + "signature found": "підпис знайдено", + "signatures found": "підписи знайдено", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} вузол", + "{{count}} nodes": "{{count}} вузлів", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 сторінка", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • сторінок: {{pageCount}}", + "{{length}} Files Need a Password": "Файлів, що потребують пароля: {{length}}", + "{{length}} PDF file(s) selected": "Вибрано PDF-файлів: {{length}}", + "{{length}} PDF files selected": "Вибрано PDF-файлів: {{length}}", + "{{length}} attachment(s) extracted successfully!": "Вкладень успішно витягнуто: {{length}}!", + "{{length}} file • {{totalPages}} total pages": "Файлів: {{length}} • усього сторінок: {{totalPages}}", + "{{length}} file(s) attached successfully.": "Файлів успішно прикріплено: {{length}}.", + "{{length}} files • {{totalPages}} total pages": "Файлів: {{length}} • усього сторінок: {{totalPages}}", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Він був захищений паролем, тому стиснута копія без пароля. Скористайтеся «Захистити PDF», щоб додати його знову.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, сторінок: {{totalPageCount}})", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} має цифровий підпис, тому його залишено без змін. Стиснення порушило б підпис. Щоб усе одно стиснути, увімкніть «Ігнорувати захист вмісту» у власних налаштуваннях; його підписи буде видалено.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} не є дійсним PDF, тому його не додано.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} захищений паролем. Введіть його пароль на картці файлу, а потім стисніть знову.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (с. {{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Не вдалося завантажити кількість сторінок", + "{{size}} • Loading pages...": "{{size}} • Завантаження сторінок...", + "{{size}} • Loading...": "{{size}} • Завантаження...", + "{{size}} • {{getPageCount}} pages": "{{size}} • сторінок: {{getPageCount}}", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • сторінок: {{numPages}}", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • сторінок: {{pageCount}}", + "{{size}} • {{totalPages}} pages": "{{size}} • сторінок: {{totalPages}}", + "{{size}} • {{value}} pages": "{{size}} • сторінок: {{value}}", + "{{successCount}} PDF(s) decrypted successfully.": "PDF успішно розшифровано: {{successCount}}.", + "{{successCount}} PDF(s) linearized successfully.": "PDF успішно лінеаризовано: {{successCount}}.", + "{{totalPages}} pages → {{numSheets}} output sheets": "Сторінок: {{totalPages}} → вихідних аркушів: {{numSheets}}", + "{{validCount}} valid": "Дійсних: {{validCount}}", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 сторінка", + "• {{label}}: {{count}} pages": "• {{label}}: сторінок: {{count}}" +} diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index c94ad5a0..0bc368f1 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -9,7 +9,8 @@ "openMainMenu": "Mở menu chính", "language": "Ngôn ngữ", "searchLanguage": "Tìm ngôn ngữ…", - "noLanguagesFound": "Không tìm thấy ngôn ngữ" + "noLanguagesFound": "Không tìm thấy ngôn ngữ", + "breadcrumb": "Đường dẫn điều hướng" }, "donation": { "message": "Bạn yêu thích BentoPDF? Hãy giúp chúng tôi giữ nó miễn phí và mã nguồn mở!", @@ -236,6 +237,10 @@ "aboutUs": "Về chúng tôi", "faqLink": "FAQ", "contactUs": "Liên hệ", + "tools": "Công cụ", + "pdfConverter": "Chuyển đổi PDF", + "pdfSecurity": "Bảo mật PDF", + "mergeSplit": "Gộp và tách PDF", "legal": "Pháp lý", "termsAndConditions": "Điều khoản và Điều kiện", "privacyPolicy": "Chính sách Bảo mật", diff --git a/public/locales/vi/tools.json b/public/locales/vi/tools.json index 15269e0e..77afd65b 100644 --- a/public/locales/vi/tools.json +++ b/public/locales/vi/tools.json @@ -27,7 +27,22 @@ "name": "Gộp PDF", "subtitle": "Kết hợp nhiều PDF thành một tệp. Giữ nguyên Bookmark.", "retainPageLabels": "Giữ nhãn trang gốc từ mỗi tệp", - "retainPageLabelsHint": "Tắt (mặc định): PDF đã hợp nhất sử dụng đánh số trang tự nhiên 1–N. Bật: nhãn trang gốc của từng tệp được giữ lại (có thể tạo ra nhãn trùng lặp)." + "retainPageLabelsHint": "Tắt (mặc định): PDF đã hợp nhất sử dụng đánh số trang tự nhiên 1–N. Bật: nhãn trang gốc của từng tệp được giữ lại (có thể tạo ra nhãn trùng lặp).", + "removeDuplicateFonts": "Xóa phông chữ trùng lặp", + "alert": { + "thumbnailError": "Không thể hiển thị hình thu nhỏ của trang", + "noSelection": "Chưa chọn tệp hoặc trang nào để gộp.", + "mergeSuccess": "Đã gộp PDF thành công!", + "mergeFailed": "Không thể gộp PDF.", + "mergeError": "Không thể gộp PDF. Vui lòng kiểm tra để đảm bảo tất cả tệp đều hợp lệ và không được bảo vệ bằng mật khẩu.", + "workerError": "Đã xảy ra lỗi không mong muốn trong quá trình gộp.", + "loadError": "Không thể tải một hoặc nhiều tệp PDF" + }, + "loader": { + "renderingPreviews": "Đang tạo bản xem trước trang...", + "merging": "Đang gộp PDF...", + "loadingDocuments": "Đang tải tài liệu PDF..." + } }, "splitPdf": { "name": "Chia PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "Làm lại (⇧⌘Z)", "tipFileDetails": "Chi tiết tệp", "tipEditExistingContent": "Chỉnh sửa nội dung hiện có", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Phạm vi tác động của công cụ Chỉnh sửa — thu hẹp phạm vi trên trang dày đặc", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "Phạm vi tác động của công cụ Chỉnh sửa: thu hẹp phạm vi trên trang dày đặc", "tipClickThePageToAddATextBox": "Nhấp vào trang để thêm hộp văn bản", "tipSpellCheckLanguage": "Ngôn ngữ kiểm tra chính tả", "tipFindAndReplace": "Tìm và thay thế", @@ -503,7 +518,8 @@ "noFile": "Không có tệp", "noFileExplanation": "Vui lòng tải lên tệp PDF trước.", "conversionSuccess": "Đã chuyển đổi PDF thành TIFF thành công!", - "conversionError": "Không thể chuyển đổi PDF sang TIFF. Tệp có thể bị hỏng." + "conversionError": "Không thể chuyển đổi PDF sang TIFF. Tệp có thể bị hỏng.", + "conversionOutOfMemory": "Trình duyệt đã hết bộ nhớ khi chuyển đổi. Hãy thử giảm DPI hoặc bỏ chọn tùy chọn TIFF nhiều trang để chuyển đổi từng trang một." } }, "pdfToCbz": { @@ -760,7 +776,7 @@ "loadError": "Không thể tải PDF. Có thể tệp bị hỏng hoặc được bảo vệ bằng mật khẩu." }, "posterizePdf": { - "name": "Posterize PDF", + "name": "Chia PDF thành poster", "subtitle": "Chia một trang lớn thành nhiều trang nhỏ hơn." }, "fixPageSize": { @@ -986,12 +1002,11 @@ "subtitle": "Trích xuất bảng từ PDF và chuyển đổi sang định dạng Excel (XLSX)." }, "pdfToText": { - "name": "PDF sang Văn bản", + "name": "PDF sang văn bản", "subtitle": "Trích xuất văn bản từ tệp PDF và lưu dưới dạng tệp văn bản (.txt). Hỗ trợ nhiều tệp.", "noteLabel": "Lưu ý:", "noteText": "Công cụ này CHỈ hoạt động với PDF được tạo kỹ thuật số. Đối với tài liệu quét hoặc PDF dựa trên hình ảnh, hãy sử dụng công cụ OCR PDF của chúng tôi thay thế.", - "convertButton": "Trích xuất văn bản", - "note": "Công cụ này CHỈ hoạt động với các tệp PDF được tạo kỹ thuật số. Đối với tài liệu quét hoặc PDF dựa trên hình ảnh, hãy sử dụng công cụ OCR PDF của chúng tôi." + "convertButton": "Trích xuất văn bản" }, "digitalSignPdf": { "name": "Chữ ký số PDF", @@ -1132,7 +1147,7 @@ "subtitle": "Chuyển đổi PDF sang PDF/A để lưu trữ lâu dài." }, "rasterizePdf": { - "name": "Rasterize PDF", + "name": "Raster hóa PDF", "subtitle": "Chuyển đổi PDF thành PDF dựa trên hình ảnh. Làm phẳng các lớp và xóa văn bản có thể chọn." }, "pdfWorkflow": { @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "Chắc chắn! Toàn bộ quá trình xử lý diễn ra trong trình duyệt của bạn. Tệp của bạn không bao giờ rời khỏi thiết bị, đảm bảo quyền riêng tư hoàn toàn." }, "unlockPdf": { - "name": "Giải mã PDF", + "name": "Mở khóa PDF", "subtitle": "Mở khóa PDF bằng cách xóa bảo vệ mật khẩu." }, "protectPdf": { - "name": "Mã hóa PDF", + "name": "Bảo vệ PDF", "subtitle": "Khóa PDF của bạn bằng cách thêm mật khẩu." } } diff --git a/public/locales/vi/ui.json b/public/locales/vi/ui.json new file mode 100644 index 00000000..9dd784ff --- /dev/null +++ b/public/locales/vi/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(đã chỉnh)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ {{n}} mục nữa...", + "- Error parsing XMP XML. Displaying raw. -": "- Lỗi phân tích XMP XML. Đang hiển thị dữ liệu thô. -", + "- No Info Dictionary data found -": "- Không tìm thấy dữ liệu Info Dictionary -", + "- No XMP metadata found -": "- Không tìm thấy metadata XMP -", + "- No interactive form fields found -": "- Không tìm thấy trường biểu mẫu tương tác -", + "- No parseable XMP properties found -": "- Không tìm thấy thuộc tính XMP có thể phân tích -", + "-- Select existing group --": "-- Chọn nhóm có sẵn --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1° (Rất nhạy)", + "0.5° (Default)": "0.5° (Mặc định)", + "1.0° (Normal)": "1.0° (Bình thường)", + "100 (Fast)": "100 (Nhanh)", + "150 (Default)": "150 (Mặc định)", + "1x2 (Booklet)": "1x2 (Sách nhỏ)", + "2.0° (Less Sensitive)": "2.0° (Ít nhạy hơn)", + "200 (Better)": "200 (Tốt hơn)", + "200 (Good)": "200 (Tốt)", + "2x2 (4-up)": "2x2 (4 trang/tờ)", + "2x4 (8-up)": "2x4 (8 trang/tờ)", + "300 (Best Quality)": "300 (Chất lượng tốt nhất)", + "300 (Print)": "300 (In ấn)", + "4x4 (16-up)": "4x4 (16 trang/tờ)", + "600 (High Quality)": "600 (Chất lượng cao)", + "72 (Screen)": "72 (Màn hình)", + "90° Clockwise": "90° theo chiều kim đồng hồ", + "90° Counter-clockwise": "90° ngược chiều kim đồng hồ", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "Đã có trường tên \"{{fieldName}}\". Hãy đổi tên trường này thành tên duy nhất trước khi tải xuống.", + "A new version of BentoPDF is available. Reload to update?": "Đã có phiên bản BentoPDF mới. Tải lại để cập nhật?", + "A single PDF file": "Một tệp PDF duy nhất", + "A template with this name already exists.": "Đã có mẫu với tên này.", + "ASCII characters (letters, numbers, symbols)": "Ký tự ASCII (chữ cái, số, ký hiệu)", + "Action": "Hành động", + "Add Blank Page": "Thêm trang trống", + "Add Bookmark": "Thêm Bookmark", + "Add Child Bookmark": "Thêm Bookmark con", + "Add Child Layer": "Thêm lớp con", + "Add More Comics": "Thêm truyện tranh khác", + "Add More Documents": "Thêm tài liệu khác", + "Add More EPUB Files": "Thêm tệp EPUB khác", + "Add More Email Files": "Thêm tệp email khác", + "Add More FB2 Files": "Thêm tệp FB2 khác", + "Add More Files": "Thêm tệp khác", + "Add More Images": "Thêm hình ảnh khác", + "Add More JSON Files": "Thêm tệp JSON khác", + "Add More MOBI Files": "Thêm tệp MOBI khác", + "Add More Markdown Files": "Thêm tệp Markdown khác", + "Add More ODG Files": "Thêm tệp ODG khác", + "Add More PUB Files": "Thêm tệp PUB khác", + "Add More Pages Files": "Thêm tệp Pages khác", + "Add More Presentations": "Thêm bản trình bày khác", + "Add More SVG Files": "Thêm tệp SVG khác", + "Add More Spreadsheets": "Thêm bảng tính khác", + "Add More Text Files": "Thêm tệp văn bản khác", + "Add More Visio Files": "Thêm tệp Visio khác", + "Add More WPD Files": "Thêm tệp WPD khác", + "Add More WPS Files": "Thêm tệp WPS khác", + "Add More XML Files": "Thêm tệp XML khác", + "Add More XPS Files": "Thêm tệp XPS khác", + "Add a new layer to get started!": "Hãy thêm một lớp mới để bắt đầu!", + "Add a text box": "Thêm hộp văn bản", + "Add an RFC 3161 document timestamp": "Thêm dấu thời gian tài liệu RFC 3161", + "Add an image": "Thêm hình ảnh", + "Add at least one node to run the workflow.": "Thêm ít nhất một nút để chạy quy trình.", + "Add child": "Thêm mục con", + "Add child layer": "Thêm lớp con", + "Add header and footer text": "Thêm văn bản đầu trang và chân trang", + "Add page numbers": "Thêm số trang", + "Add searchable text layer via OCR": "Thêm lớp văn bản có thể tìm kiếm bằng OCR", + "Add text watermark": "Thêm Watermark văn bản", + "Add/Edit/Extract Attachments": "Thêm/Chỉnh sửa/Trích xuất tệp đính kèm", + "Added": "Đã thêm", + "Added \"{{afterText}}\"": "Đã thêm \"{{afterText}}\"", + "Added image ({{width}}×{{height}})": "Đã thêm hình ảnh ({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "Đã thêm {{insertCount}} trang trống thành công!", + "Added {{insertCount}} blank pages successfully!": "Đã thêm {{insertCount}} trang trống thành công!", + "Adding header & footer...": "Đang thêm đầu trang và chân trang...", + "Adding page numbers...": "Đang thêm số trang...", + "Adding watermark...": "Đang thêm Watermark...", + "Adding {{insertCount}} blank page...": "Đang thêm {{insertCount}} trang trống...", + "Adding {{insertCount}} blank pages...": "Đang thêm {{insertCount}} trang trống...", + "Adding {{name}} ({{n}}/{{length}})...": "Đang thêm {{name}} ({{n}}/{{length}})...", + "Adjust Colors": "Điều chỉnh màu sắc", + "Adjust brightness, contrast, and colors": "Điều chỉnh độ sáng, độ tương phản và màu sắc", + "Advanced": "Nâng cao", + "Advanced Feature Required": "Cần tính năng nâng cao", + "Advanced Settings": "Cài đặt nâng cao", + "After Page": "Sau trang", + "After Page...": "Sau trang...", + "Align Objects": "Căn chỉnh đối tượng", + "Alignment": "Căn chỉnh", + "All": "Tất cả", + "All files repaired successfully!": "Đã sửa chữa tất cả tệp thành công!", + "Alternate Merge": "Gộp xen kẽ", + "Alternating and mixing pages...": "Đang xen kẽ và trộn trang...", + "Always resample to that resolution": "Luôn lấy mẫu lại theo độ phân giải đó", + "An error occurred during compression. Error: {{error}}": "Đã xảy ra lỗi khi nén. Lỗi: {{error}}", + "An error occurred during conversion. Error: {{error}}": "Đã xảy ra lỗi khi chuyển đổi. Lỗi: {{error}}", + "An error occurred during conversion. Error: {{message}}": "Đã xảy ra lỗi khi chuyển đổi. Lỗi: {{message}}", + "An error occurred during cropping.": "Đã xảy ra lỗi khi cắt.", + "An error occurred during extraction. Error: {{error}}": "Đã xảy ra lỗi khi trích xuất. Lỗi: {{error}}", + "An error occurred during rasterization. Error: {{error}}": "Đã xảy ra lỗi khi rasterize. Lỗi: {{error}}", + "An error occurred during sanitization: {{msg}}": "Đã xảy ra lỗi khi làm sạch: {{msg}}", + "An error occurred while combining pages.": "Đã xảy ra lỗi khi kết hợp trang.", + "An error occurred while creating the N-Up PDF.": "Đã xảy ra lỗi khi tạo PDF N-Up.", + "An error occurred while creating the booklet.": "Đã xảy ra lỗi khi tạo sách nhỏ.", + "An error occurred while dividing the PDF.": "Đã xảy ra lỗi khi chia PDF.", + "An error occurred while mixing the PDFs.": "Đã xảy ra lỗi khi trộn các PDF.", + "An error occurred while standardizing pages.": "Đã xảy ra lỗi khi chuẩn hóa trang.", + "An error occurred while trying to remove metadata.": "Đã xảy ra lỗi khi xóa metadata.", + "An error occurred: {{error}}": "Đã xảy ra lỗi: {{error}}", + "An error occurred: {{error}}.": "Đã xảy ra lỗi: {{error}}.", + "An owner password is required when setting permissions": "Cần có mật khẩu chủ sở hữu khi đặt quyền", + "An unexpected error occurred during the repair process.": "Đã xảy ra lỗi không mong muốn trong quá trình sửa chữa.", + "An unexpected error occurred.": "Đã xảy ra lỗi không mong muốn.", + "Analyzing data structure...": "Đang phân tích cấu trúc dữ liệu...", + "Analyzing full PDF metadata...": "Đang phân tích toàn bộ metadata PDF...", + "Analyzing signatures...": "Đang phân tích chữ ký...", + "Angle": "Góc", + "Annotations removed successfully!": "Đã xóa ghi chú thành công!", + "Any text, URL, or data": "Bất kỳ văn bản, URL hoặc dữ liệu nào", + "Application": "Ứng dụng", + "Apply a digital signature to PDF": "Áp dụng chữ ký số cho PDF", + "Apply and download": "Áp dụng và tải xuống", + "Apply redactions?": "Áp dụng các vùng che?", + "Apply scanner simulation effect": "Áp dụng hiệu ứng mô phỏng máy quét", + "Applying Bates numbers...": "Đang áp dụng số Bates...", + "Applying color adjustments...": "Đang áp dụng điều chỉnh màu sắc...", + "Applying crop...": "Đang áp dụng cắt...", + "Applying redactions...": "Đang áp dụng các vùng che...", + "Applying rotations...": "Đang áp dụng xoay...", + "Applying scanner effect...": "Đang áp dụng hiệu ứng máy quét...", + "Applying timestamp...": "Đang áp dụng dấu thời gian...", + "Applying {{replace}}...": "Đang áp dụng {{replace}}...", + "Archive contains an oversized image entry.": "Kho lưu trữ chứa một hình ảnh quá lớn.", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "Kho lưu trữ có quá nhiều hình ảnh (tối đa {{MAX_CBZ_PAGES}}).", + "Archive is too large when decompressed.": "Kho lưu trữ quá lớn sau khi giải nén.", + "Are you sure you want to reset? All your work will be lost.": "Bạn có chắc muốn đặt lại không? Toàn bộ công việc của bạn sẽ bị mất.", + "Area (Coordinates)": "Vùng (Tọa độ)", + "Area ({{unit}}²)": "Diện tích ({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial, Times New Roman và Courier New được ánh xạ sang phông tích hợp tương đương. Chỉ áp dụng khi an toàn.", + "Arrange multiple pages per sheet": "Sắp xếp nhiều trang trên mỗi tờ", + "Arrange pages for booklet printing": "Sắp xếp trang để in sách nhỏ", + "Aspect Ratio": "Tỷ lệ khung hình", + "At least one PDF document is required for export.": "Cần có ít nhất một tài liệu PDF để xuất.", + "At least two valid PDFs are required.": "Cần có ít nhất hai PDF hợp lệ.", + "Attaching files to PDF...": "Đang đính kèm tệp vào PDF...", + "Attachments updated successfully!": "Đã cập nhật tệp đính kèm thành công!", + "Author": "Tác giả", + "Auto (Keep Original)": "Tự động (Giữ nguyên bản gốc)", + "Back": "Mặt sau", + "Back to Home": "Về Trang chủ", + "Background Color": "Màu nền", + "Background color changed successfully!": "Đã đổi màu nền thành công!", + "Barcode": "Mã vạch", + "Barcode Format": "Định dạng mã vạch", + "Barcode Value": "Giá trị mã vạch", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Đã áp dụng số Bates thành công! ({{batesStart}} đến {{n}})", + "Beginning": "Đầu", + "Binarize": "Nhị phân hóa", + "Blank Position": "Vị trí trang trống", + "Blue": "Xanh dương", + "Blur": "Làm mờ", + "Bold": "Đậm", + "Bold & Italic": "Đậm & Nghiêng", + "Booklet": "Sách nhỏ", + "Booklet created with {{numSheets}} sheets!": "Đã tạo sách nhỏ với {{numSheets}} tờ!", + "Bookmarks imported from JSON!": "Đã nhập Bookmark từ JSON!", + "Bookmarks page": "Trang Bookmark", + "Border": "Viền", + "Border Color": "Màu viền", + "Bottom": "Dưới", + "Bottom Center": "Giữa dưới", + "Bottom Left": "Dưới trái", + "Bottom Right": "Dưới phải", + "Bottom edge in points": "Cạnh dưới (tính bằng point)", + "Brightness": "Độ sáng", + "Brotli and rasterizing were skipped to keep it PDF/A.": "Đã bỏ qua Brotli và rasterize để giữ chuẩn PDF/A.", + "Brotli compression (PDF 2.0)": "Nén Brotli (PDF 2.0)", + "Browser Note:": "Lưu ý về trình duyệt:", + "Building new PDF...": "Đang tạo PDF mới...", + "Building page pairing model...": "Đang xây dựng mô hình ghép trang...", + "Button": "Nút", + "ByteRange does not start at the beginning of the file": "ByteRange không bắt đầu từ đầu tệp", + "ByteRange out of bounds": "ByteRange nằm ngoài phạm vi", + "CBZ to PDF": "CBZ sang PDF", + "CSV Loaded": "Đã tải CSV", + "CSV file is empty": "Tệp CSV trống", + "Cancel": "Hủy", + "Cannot Delete": "Không thể xóa", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "Không thể truy cập các điều khiển của trình xem. Hãy dùng nút Tải xuống trên thanh công cụ của trình xem PDF ở trên.", + "Cannot delete all pages": "Không thể xóa tất cả trang", + "Cannot delete all pages.": "Không thể xóa tất cả trang.", + "Canvas context failed": "Canvas context không thành công", + "Canvas context unavailable": "Canvas context không khả dụng", + "Canvas toBlob conversion failed.": "Chuyển đổi canvas toBlob không thành công.", + "Canvas toBlob failed": "Canvas toBlob không thành công", + "Center": "Giữa", + "Certificate (.pfx, .p12, .pem)": "Chứng chỉ (.pfx, .p12, .pem)", + "Certificate Expired": "Chứng chỉ đã hết hạn", + "Certificate Password": "Mật khẩu chứng chỉ", + "Certificate unlocked": "Đã mở khóa chứng chỉ", + "Change Certificate": "Đổi chứng chỉ", + "Change background color": "Đổi màu nền", + "Changing background color...": "Đang đổi màu nền...", + "Changing text color...": "Đang đổi màu văn bản...", + "Character": "Ký tự", + "Checked State": "Trạng thái được chọn", + "Choose a valid page range.": "Hãy chọn phạm vi trang hợp lệ.", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "Hãy chọn một trong các ngôn ngữ đi kèm, hoặc dựng lại gói air-gapped với ngôn ngữ còn thiếu được thêm vào --ocr-languages.", + "Cleanup": "Dọn dẹp", + "Click on PDF to Pick Location": "Nhấp vào PDF để chọn vị trí", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "Nhấp vào nút phía trên, rồi nhấp vào vị trí trên PDF mà bạn muốn Bookmark chuyển đến", + "Click to Upload Image": "Nhấp để tải hình ảnh lên", + "Clicking this field in the PDF will open a file picker to upload an image.": "Nhấp vào trường này trong PDF sẽ mở bộ chọn tệp để tải hình ảnh lên.", + "Clip invisible parts of images": "Cắt bỏ các phần vô hình của hình ảnh", + "Close": "Đóng", + "Close (Esc)": "Đóng (Esc)", + "Close panel": "Đóng bảng", + "Closes tab": "Đóng tab", + "Closes window": "Đóng cửa sổ", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF (Bookmark & Metadata)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF chưa được cấu hình. Hãy cấu hình trong Cài đặt WASM.", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF tạo ra tệp giải mã trống.", + "CoherentPDF: not configured.": "CoherentPDF: chưa được cấu hình.", + "Color": "Màu", + "Color adjustments applied successfully!": "Đã áp dụng điều chỉnh màu sắc thành công!", + "Colors inverted successfully!": "Đã đảo ngược màu thành công!", + "Cols": "Cột", + "Combine multiple PDFs into one": "Kết hợp nhiều PDF thành một", + "Combine to Single Page": "Kết hợp thành một trang", + "Combining pages...": "Đang kết hợp trang...", + "Comic Archives": "Kho truyện tranh", + "Comments and markup become part of the page. Form fields and links keep working.": "Nhận xét và đánh dấu trở thành một phần của trang. Trường biểu mẫu và liên kết vẫn hoạt động.", + "Complete": "Hoàn tất", + "Complete!": "Hoàn tất!", + "Compress": "Nén", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "Đã nén {{compressedCount}} PDF. Tổng dung lượng giảm từ {{totalOriginalSize}} xuống {{totalCompressedSize}} (Tiết kiệm {{value}}%).", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "Đã nén {{compressedCount}} PDF. Tổng dung lượng: {{totalCompressedSize}}.", + "Compressing multiple PDFs...": "Đang nén nhiều PDF...", + "Compressing to {{size}}...": "Đang nén xuống {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "Đang nén {{n}}/{{length}}: {{name}}...", + "Compressing...": "Đang nén...", + "Compression Complete": "Nén hoàn tất", + "Compression Finished": "Nén xong", + "Compression Level": "Mức độ nén", + "Configure": "Cấu hình", + "Confirm": "Xác nhận", + "Confirm Action": "Xác nhận hành động", + "Conformance": "Chuẩn tuân thủ", + "Connected": "Đã kết nối", + "Contact Info": "Thông tin liên hệ", + "Content": "Nội dung", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "Mã băm nội dung không khớp với thuộc tính messageDigest: PDF đã bị sửa đổi sau khi ký", + "Contrast": "Độ tương phản", + "Conversion Complete": "Chuyển đổi hoàn tất", + "Conversion Error": "Lỗi chuyển đổi", + "Conversion engine ready!": "Công cụ chuyển đổi đã sẵn sàng!", + "Conversion failed: could not create PDF/A definition": "Chuyển đổi không thành công: không thể tạo định nghĩa PDF/A", + "Convert Apple Pages documents to PDF": "Chuyển đổi tài liệu Apple Pages sang PDF", + "Convert EPUB ebooks to PDF": "Chuyển đổi sách điện tử EPUB sang PDF", + "Convert Excel spreadsheets to PDF": "Chuyển đổi bảng tính Excel sang PDF", + "Convert FB2 e-books to PDF": "Chuyển đổi sách điện tử FB2 sang PDF", + "Convert JSON files to PDF": "Chuyển đổi tệp JSON sang PDF", + "Convert MOBI e-books to PDF": "Chuyển đổi sách điện tử MOBI sang PDF", + "Convert Markdown files to PDF": "Chuyển đổi tệp Markdown sang PDF", + "Convert Microsoft Publisher to PDF": "Chuyển đổi Microsoft Publisher sang PDF", + "Convert OpenDocument Graphics to PDF": "Chuyển đổi OpenDocument Graphics sang PDF", + "Convert PDF pages to SVG": "Chuyển đổi các trang PDF sang SVG", + "Convert PDF pages to images (ZIP)": "Chuyển đổi các trang PDF sang hình ảnh (ZIP)", + "Convert PDF tables to CSV": "Chuyển đổi bảng trong PDF sang CSV", + "Convert PDF tables to Excel": "Chuyển đổi bảng trong PDF sang Excel", + "Convert PDF to Markdown text": "Chuyển đổi PDF sang văn bản Markdown", + "Convert PDF to PDF/A for archiving": "Chuyển đổi PDF sang PDF/A để lưu trữ", + "Convert PDF to Word document": "Chuyển đổi PDF sang tài liệu Word", + "Convert PowerPoint presentations to PDF": "Chuyển đổi bản trình bày PowerPoint sang PDF", + "Convert SVG files to PDF": "Chuyển đổi tệp SVG sang PDF", + "Convert To Grayscale": "Chuyển sang thang xám", + "Convert Visio diagrams (VSD/VSDX) to PDF": "Chuyển đổi sơ đồ Visio (VSD/VSDX) sang PDF", + "Convert WPS Office documents to PDF": "Chuyển đổi tài liệu WPS Office sang PDF", + "Convert Word documents to PDF": "Chuyển đổi tài liệu Word sang PDF", + "Convert WordPerfect documents to PDF": "Chuyển đổi tài liệu WordPerfect sang PDF", + "Convert XML documents to PDF": "Chuyển đổi tài liệu XML sang PDF", + "Convert XPS/OXPS documents to PDF": "Chuyển đổi tài liệu XPS/OXPS sang PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "Chuyển đổi kho truyện tranh (CBZ/CBR) sang PDF", + "Convert email files (.eml, .msg) to PDF": "Chuyển đổi tệp email (.eml, .msg) sang PDF", + "Convert fonts to vector outlines": "Chuyển phông chữ thành đường viền vector", + "Convert plain text to PDF": "Chuyển đổi văn bản thuần sang PDF", + "Convert to grayscale": "Chuyển sang thang xám", + "Convert to greyscale": "Chuyển sang thang xám", + "Convert to image-based PDF": "Chuyển sang PDF dạng hình ảnh", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "Đã chuyển đổi {{length}} tệp ({{totalPages}} trang) sang SVG!", + "Converted {{pageCount}} pages to SVG!": "Đã chuyển đổi {{pageCount}} trang sang SVG!", + "Converter not initialized": "Bộ chuyển đổi chưa được khởi tạo", + "Converting BMP to PDF...": "Đang chuyển đổi BMP sang PDF...", + "Converting HEIC to PDF...": "Đang chuyển đổi HEIC sang PDF...", + "Converting TIFF to PDF...": "Đang chuyển đổi TIFF sang PDF...", + "Converting emails...": "Đang chuyển đổi email...", + "Converting files...": "Đang chuyển đổi tệp...", + "Converting fonts to outlines...": "Đang chuyển phông chữ thành đường viền...", + "Converting images to PDF...": "Đang chuyển đổi hình ảnh sang PDF...", + "Converting multiple PDFs to PDF/A...": "Đang chuyển đổi nhiều PDF sang PDF/A...", + "Converting multiple RTF files to PDF...": "Đang chuyển đổi nhiều tệp RTF sang PDF...", + "Converting multiple files...": "Đang chuyển đổi nhiều tệp...", + "Converting page {{n}} of {{pageCount}}...": "Đang chuyển đổi trang {{n}} trên {{pageCount}}...", + "Converting to Markdown...": "Đang chuyển đổi sang Markdown...", + "Converting to SVG...": "Đang chuyển đổi sang SVG...", + "Converting to greyscale...": "Đang chuyển sang thang xám...", + "Converting to {{level}}...": "Đang chuyển đổi sang {{level}}...", + "Converting {{name}}...": "Đang chuyển đổi {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "Đang chuyển đổi {{n}}/{{length}}: {{name}}...", + "Converting...": "Đang chuyển đổi...", + "Copied": "Đã sao chép", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Không thể truy cập bộ xuất PDF đã đóng dấu. Hãy dùng nút Xuất → PDF trên thanh công cụ của trình xem làm giải pháp thay thế.", + "Could not add blank page.": "Không thể thêm trang trống.", + "Could not add blank pages.": "Không thể thêm các trang trống.", + "Could not add header or footer.": "Không thể thêm đầu trang hoặc chân trang.", + "Could not add page numbers.": "Không thể thêm số trang.", + "Could not add the watermark.": "Không thể thêm Watermark.", + "Could not apply rotations.": "Không thể áp dụng xoay.", + "Could not change text color.": "Không thể đổi màu văn bản.", + "Could not change the background color.": "Không thể đổi màu nền.", + "Could not create ZIP archive.": "Không thể tạo tệp lưu trữ ZIP.", + "Could not create canvas context.": "Không thể tạo canvas context.", + "Could not create comparison canvas context.": "Không thể tạo canvas context so sánh.", + "Could not create offscreen comparison canvas.": "Không thể tạo canvas so sánh ngoài màn hình.", + "Could not create visual diff context.": "Không thể tạo context khác biệt trực quan.", + "Could not create visual diff overlay context.": "Không thể tạo context lớp phủ khác biệt trực quan.", + "Could not detect blank pages.": "Không thể phát hiện trang trống.", + "Could not display the page.": "Không thể hiển thị trang.", + "Could not export comparison PDF.": "Không thể xuất PDF so sánh.", + "Could not export the signed PDF. Please try again.": "Không thể xuất PDF đã ký. Vui lòng thử lại.", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "Không thể xuất PDF đã đóng dấu. Hãy dùng nút Xuất → PDF trên thanh công cụ của trình xem làm giải pháp thay thế.", + "Could not extract signer public key": "Không thể trích xuất khóa công khai của người ký", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "Không tìm thấy {{testFile}} tại URL đã chỉ định (HTTP {{status}}). Hãy đảm bảo tệp tồn tại.", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "Không thể phân tích đầy đủ PDF. Tệp có thể bị hỏng hoặc có cấu trúc bất thường.", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "Không thể tạo bản xem trước. Tệp có thể bị hỏng hoặc chứa tính năng không được hỗ trợ. Lỗi: {{message}}", + "Could not get canvas context": "Không thể lấy canvas context", + "Could not invert PDF colors.": "Không thể đảo ngược màu PDF.", + "Could not load PDF. It may be corrupt or password-protected.": "Không thể tải PDF. Tệp có thể bị hỏng hoặc được bảo vệ bằng mật khẩu.", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "Không thể tải PDF. Tệp có thể không hợp lệ, bị hỏng hoặc được bảo vệ bằng mật khẩu.", + "Could not load the PDF engine. Please refresh the page and try again.": "Không thể tải công cụ PDF. Vui lòng làm mới trang và thử lại.", + "Could not parse signer info": "Không thể phân tích thông tin người ký", + "Could not posterize the PDF.": "Không thể posterize PDF.", + "Could not process \"{{name}}\". The file may be corrupted.": "Không thể xử lý \"{{name}}\". Tệp có thể bị hỏng.", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "Không thể giảm dung lượng tệp thêm. Gốc: {{originalSize}}, Mới: {{compressedSize}}.", + "Could not remove annotations.": "Không thể xóa ghi chú.", + "Could not remove blank pages.": "Không thể xóa trang trống.", + "Could not remove leftover data from the PDF.": "Không thể xóa dữ liệu còn sót lại khỏi PDF.", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "Không thể xóa văn bản đã che khỏi dữ liệu tài liệu, nên tệp chưa được tải xuống.", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "Không thể đảo ngược các trang PDF. Hãy kiểm tra xem tệp của bạn có phải PDF hợp lệ không.", + "Could not update metadata. Please check that date formats are correct.": "Không thể cập nhật metadata. Hãy kiểm tra định dạng ngày có đúng không.", + "Count": "Số lượng", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "Ngày tạo", + "Creating Booklet...": "Đang tạo sách nhỏ...", + "Creating Excel file...": "Đang tạo tệp Excel...", + "Creating N-Up PDF...": "Đang tạo PDF N-Up...", + "Creating PDF from JPGs...": "Đang tạo PDF từ các tệp JPG...", + "Creating PDF from SVG files...": "Đang tạo PDF từ các tệp SVG...", + "Creating PDF...": "Đang tạo PDF...", + "Creating ZIP archive...": "Đang tạo tệp lưu trữ ZIP...", + "Creating ZIP file...": "Đang tạo tệp ZIP...", + "Creating ZIP...": "Đang tạo ZIP...", + "Creating table...": "Đang tạo bảng...", + "Creator": "Người tạo", + "Crop": "Cắt", + "Crop complete! Your download has started.": "Đã cắt xong! Quá trình tải xuống đã bắt đầu.", + "Cryptographic verification failed": "Xác minh mật mã không thành công", + "Custom": "Tùy chỉnh", + "Custom Format": "Định dạng tùy chỉnh", + "Custom Height": "Chiều cao tùy chỉnh", + "Custom Units": "Đơn vị tùy chỉnh", + "Custom Width": "Chiều rộng tùy chỉnh", + "Custom Zoom": "Thu phóng tùy chỉnh", + "Custom...": "Tùy chỉnh...", + "DataMatrix": "DataMatrix", + "Date Format": "Định dạng ngày", + "Decrease size": "Giảm kích thước", + "Decrypt": "Giải mã", + "Decrypting PDF...": "Đang giải mã PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "Đang giải mã {{name}} ({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "Đang giải mã {{n}} trên {{length}}: {{name}}", + "Decrypting...": "Đang giải mã...", + "Decryption Failed": "Giải mã không thành công", + "Delete": "Xóa", + "Delete \"{{title}}\"?": "Xóa \"{{title}}\"?", + "Delete Field": "Xóa trường", + "Delete Page": "Xóa trang", + "Delete Pages": "Xóa trang", + "Delete all {{length}} bookmark(s) ? ": "Xóa tất cả {{length}} Bookmark? ", + "Delete layer": "Xóa lớp", + "Delete {{size}} bookmark(s) ? ": "Xóa {{size}} Bookmark? ", + "Deleted": "Đã xóa", + "Deleted {{size}} page(s) successfully!": "Đã xóa {{size}} trang thành công!", + "Deleting pages...": "Đang xóa trang...", + "Description": "Mô tả", + "Description for screen readers": "Mô tả cho trình đọc màn hình", + "Deselect All": "Bỏ chọn tất cả", + "Deskew": "Chỉnh nghiêng", + "Deskew PDF": "Chỉnh nghiêng PDF", + "Deskewed {{length}} file(s). {{value}}": "Đã chỉnh nghiêng {{length}} tệp. {{value}}", + "Deskewing {{name}}...": "Đang chỉnh nghiêng {{name}}...", + "Destination": "Đích", + "Detecting blank pages...": "Đang phát hiện trang trống...", + "Digest Algorithm:": "Thuật toán băm:", + "Digital Sign": "Ký số", + "Direction": "Hướng", + "Divide Pages": "Chia trang", + "Divide into boxes (0 to disable)": "Chia thành các ô (0 để tắt)", + "Document Properties": "Thuộc tính tài liệu", + "Document Type": "Loại tài liệu", + "Document properties": "Thuộc tính tài liệu", + "Document-level attachment": "Tệp đính kèm cấp tài liệu", + "Done: back to tools": "Xong, quay lại công cụ", + "Download": "Tải xuống", + "Download Edited PDF": "Tải xuống PDF đã chỉnh sửa", + "Download anyway": "Vẫn tải xuống", + "Download as PDF or ZIP automatically": "Tự động tải xuống dưới dạng PDF hoặc ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "Đã tải xuống {{length}} tệp PDF trong một kho lưu trữ ZIP.", + "Downloads started for all files.": "Đã bắt đầu tải xuống tất cả tệp.", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "Loại bỏ thẻ cấu trúc mà trình đọc màn hình cần dùng.", + "Duplicate Field Name": "Tên trường bị trùng", + "Duplicate Field Names": "Tên trường bị trùng", + "Duplicate Page": "Nhân đôi trang", + "Duplicate Page Numbers": "Số trang bị trùng", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "Chữ ký ECDSA không khớp với khóa công khai của người ký", + "EPUB Files": "Tệp EPUB", + "EPUB to PDF": "EPUB sang PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ sang PDF", + "Edit": "Chỉnh sửa", + "Edit All": "Chỉnh sửa tất cả", + "Edit Bookmark": "Chỉnh sửa Bookmark", + "Edit Bookmarks": "Chỉnh sửa Bookmark", + "Edit Images": "Chỉnh sửa hình ảnh", + "Edit Metadata": "Chỉnh sửa Metadata", + "Edit PDF metadata": "Chỉnh sửa metadata PDF", + "Edit Scope": "Phạm vi chỉnh sửa", + "Edit Shapes": "Chỉnh sửa hình dạng", + "Edit Text": "Chỉnh sửa văn bản", + "Edit tool": "Công cụ chỉnh sửa", + "Edit {{scopes}}": "Chỉnh sửa {{scopes}}", + "Email Files": "Tệp email", + "Email to PDF": "Email sang PDF", + "Embedding files into PDF...": "Đang nhúng tệp vào PDF...", + "Empty signature bytes": "Dữ liệu chữ ký trống", + "Encrypt": "Mã hóa", + "Encrypt PDF with password": "Mã hóa PDF bằng mật khẩu", + "Encrypted file": "Tệp đã mã hóa", + "Encrypting PDF with 256-bit AES...": "Đang mã hóa PDF bằng AES 256-bit...", + "Encryption Failed": "Mã hóa không thành công", + "Encryption resulted in an empty file.": "Quá trình mã hóa tạo ra tệp trống.", + "End": "Cuối", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "Nhập 0 để chèn vào đầu, hoặc {{pageCount}} để chèn vào cuối.", + "Enter bookmark title": "Nhập tiêu đề Bookmark", + "Enter name for child layer under \"{{Layer}}\":": "Nhập tên cho lớp con của \"{{Layer}}\":", + "Enter password": "Nhập mật khẩu", + "Enter password...": "Nhập mật khẩu...", + "Enter passwords for each encrypted file": "Nhập mật khẩu cho từng tệp đã mã hóa", + "Error": "Lỗi", + "Error during execution": "Lỗi trong quá trình thực thi", + "Error generating PDF: {{error}}": "Lỗi khi tạo PDF: {{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "Lỗi khi tải tệp PDF. Vui lòng thử lại với một PDF hợp lệ.", + "Error reading files: {{error}}": "Lỗi khi đọc tệp: {{error}}", + "Error saving PDF. Check console for details.": "Lỗi khi lưu PDF. Hãy xem chi tiết trong console.", + "Error: {{error}}": "Lỗi: {{error}}", + "Exactly 11 or 12 digits": "Đúng 11 hoặc 12 chữ số", + "Exactly 12 or 13 digits": "Đúng 12 hoặc 13 chữ số", + "Example of current format:": "Ví dụ về định dạng hiện tại:", + "Excel to PDF": "Excel sang PDF", + "Existing Radio Groups": "Nhóm radio hiện có", + "Export Error": "Lỗi xuất", + "Export Value": "Giá trị xuất", + "Export failed": "Xuất không thành công", + "External processing module needed": "Cần mô-đun xử lý bên ngoài", + "Extract Images": "Trích xuất hình ảnh", + "Extract Pages": "Trích xuất trang", + "Extract Tables": "Trích xuất bảng", + "Extract a range of pages": "Trích xuất một phạm vi trang", + "Extract all images from PDF": "Trích xuất tất cả hình ảnh từ PDF", + "Extract pages as separate PDFs": "Trích xuất các trang thành các PDF riêng", + "Extract text from PDF": "Trích xuất văn bản từ PDF", + "Extracted 1 table successfully!": "Đã trích xuất 1 bảng thành công!", + "Extracted text from {{length}} PDF files!": "Đã trích xuất văn bản từ {{length}} tệp PDF!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "Đã trích xuất {{completed}} PDF, {{failed}} không thành công.", + "Extracted {{length}} page(s) successfully!": "Đã trích xuất {{length}} trang thành công!", + "Extracted {{length}} table(s) to Excel!": "Đã trích xuất {{length}} bảng sang Excel!", + "Extracted {{length}} tables successfully!": "Đã trích xuất {{length}} bảng thành công!", + "Extracting attachments from {{length}} file(s)...": "Đang trích xuất tệp đính kèm từ {{length}} tệp...", + "Extracting images from {{name}}...": "Đang trích xuất hình ảnh từ {{name}}...", + "Extracting pages...": "Đang trích xuất trang...", + "Extracting tables...": "Đang trích xuất bảng...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "Đang trích xuất văn bản từ tệp {{n}}/{{length}}: {{name}}...", + "Extracting text from multiple files...": "Đang trích xuất văn bản từ nhiều tệp...", + "Extracting text from {{name}}...": "Đang trích xuất văn bản từ {{name}}...", + "Extracting text...": "Đang trích xuất văn bản...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "Đang trích xuất {{name}} cho AI ({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "Đang trích xuất {{name}} cho AI...", + "Extracting...": "Đang trích xuất...", + "Extraction Complete": "Trích xuất hoàn tất", + "Extraction Error": "Lỗi trích xuất", + "Extraction Partial": "Trích xuất một phần", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "Trích xuất hoàn tất! {{length}} tệp đính kèm trong tệp zip ({{totalSize}}). Đã bắt đầu tải xuống.", + "FB2 Files": "Tệp FB2", + "FB2 to PDF": "FB2 sang PDF", + "Failed": "Không thành công", + "Failed to acquire 2D canvas context": "Không thể lấy canvas context 2D", + "Failed to add child layer": "Không thể thêm lớp con", + "Failed to apply Bates numbers.": "Không thể áp dụng số Bates.", + "Failed to apply color adjustments. The file might be corrupted.": "Không thể áp dụng điều chỉnh màu sắc. Tệp có thể bị hỏng.", + "Failed to apply redactions.": "Không thể áp dụng các vùng che.", + "Failed to apply scanner effect. The file might be corrupted.": "Không thể áp dụng hiệu ứng máy quét. Tệp có thể bị hỏng.", + "Failed to attach files: {{error}}": "Không thể đính kèm tệp: {{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "Không thể chuyển đổi BMP sang PDF. Một trong các tệp có thể không hợp lệ.", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "Không thể chuyển đổi HEIC sang PDF. Một trong các tệp có thể không hợp lệ.", + "Failed to convert PDF to CSV. {{message}}": "Không thể chuyển đổi PDF sang CSV. {{message}}", + "Failed to convert PDF to Excel. {{message}}": "Không thể chuyển đổi PDF sang Excel. {{message}}", + "Failed to convert PDF to SVG. {{message}}": "Không thể chuyển đổi PDF sang SVG. {{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "Không thể chuyển PDF sang thang xám. Tệp có thể bị hỏng.", + "Failed to convert PDF. It may be image-based or corrupted.": "Không thể chuyển đổi PDF. Tệp có thể là dạng hình ảnh hoặc bị hỏng.", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "Không thể chuyển đổi TIFF sang PDF. Một trong các tệp có thể không hợp lệ.", + "Failed to convert images to PDF.": "Không thể chuyển đổi hình ảnh sang PDF.", + "Failed to convert text to PDF. {{error}}": "Không thể chuyển đổi văn bản sang PDF. {{error}}", + "Failed to convert {{filename}} to PNG": "Không thể chuyển đổi {{filename}} sang PNG", + "Failed to copy metadata to clipboard.": "Không thể sao chép metadata vào bộ nhớ tạm.", + "Failed to create PDF.": "Không thể tạo PDF.", + "Failed to create PNG blob": "Không thể tạo blob PNG", + "Failed to create canvas context": "Không thể tạo canvas context", + "Failed to create split PDFs.": "Không thể tạo các PDF đã chia.", + "Failed to decode image: {{name}}": "Không thể giải mã hình ảnh: {{name}}", + "Failed to decrypt private key": "Không thể giải mã khóa riêng", + "Failed to decrypt. Try the Decrypt tool instead.": "Không thể giải mã. Hãy thử dùng công cụ Giải mã.", + "Failed to delete layer": "Không thể xóa lớp", + "Failed to delete pages.": "Không thể xóa trang.", + "Failed to deskew PDF: {{error}}": "Không thể chỉnh nghiêng PDF: {{error}}", + "Failed to download the edited PDF.": "Không thể tải xuống PDF đã chỉnh sửa.", + "Failed to edit attachments.": "Không thể chỉnh sửa tệp đính kèm.", + "Failed to extract certificate from PFX file": "Không thể trích xuất chứng chỉ từ tệp PFX", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "Không thể trích xuất trang (mã thoát qpdf {{exitCode}}).", + "Failed to extract pages.": "Không thể trích xuất trang.", + "Failed to extract tables. {{message}}": "Không thể trích xuất bảng. {{message}}", + "Failed to extract text from PDF.": "Không thể trích xuất văn bản từ PDF.", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "Không thể tải hồ sơ ICC từ {{iccUrl}}: HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "Không thể tải tệp phông chữ: {{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "Không thể tải gs.js: HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "Không thể tải {{url}}: HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "Không thể lấy context 2D cho trang {{pageNumber}}", + "Failed to get canvas context": "Không thể lấy canvas context", + "Failed to insert PDF. The file may be corrupted.": "Không thể chèn PDF. Tệp có thể bị hỏng.", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "Không thể tải Ghostscript từ {{normalizedUrl}}: {{msg}}", + "Failed to load PDF file.": "Không thể tải tệp PDF.", + "Failed to load PDF for cropping.": "Không thể tải PDF để cắt.", + "Failed to load PDF for preview.": "Không thể tải PDF để xem trước.", + "Failed to load PDF form viewer.": "Không thể tải trình xem biểu mẫu PDF.", + "Failed to load PDF layers": "Không thể tải các lớp PDF", + "Failed to load PyMuPDF from CDN: {{msg}}": "Không thể tải PyMuPDF từ CDN: {{msg}}", + "Failed to load SVG image": "Không thể tải hình ảnh SVG", + "Failed to load WebP image": "Không thể tải hình ảnh WebP", + "Failed to load attachments from PDF.": "Không thể tải tệp đính kèm từ PDF.", + "Failed to load files: {{error}}": "Không thể tải tệp: {{error}}", + "Failed to load image.": "Không thể tải hình ảnh.", + "Failed to load image: {{filename}}": "Không thể tải hình ảnh: {{filename}}", + "Failed to load one or more PDF files.": "Không thể tải một hoặc nhiều tệp PDF.", + "Failed to load script: {{url}}": "Không thể tải script: {{url}}", + "Failed to load template.": "Không thể tải mẫu.", + "Failed to load the PDF Editor.": "Không thể tải Trình chỉnh sửa PDF.", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "Không thể tải bộ xử lý hình ảnh. Hãy đảm bảo trình duyệt của bạn hỗ trợ SharedArrayBuffer (cần HTTPS hoặc localhost).", + "Failed to parse CSV: {{error}}": "Không thể phân tích CSV: {{error}}", + "Failed to parse signature": "Không thể phân tích chữ ký", + "Failed to parse the certificate file.": "Không thể phân tích tệp chứng chỉ.", + "Failed to process HEIC file: {{name}}": "Không thể xử lý tệp HEIC: {{name}}", + "Failed to process WebP file: {{name}}": "Không thể xử lý tệp WebP: {{name}}", + "Failed to read file.": "Không thể đọc tệp.", + "Failed to remove restrictions. The PDF may require the correct owner password.": "Không thể xóa hạn chế. PDF có thể cần đúng mật khẩu chủ sở hữu.", + "Failed to render page": "Không thể hiển thị trang", + "Failed to render page previews": "Không thể hiển thị bản xem trước các trang", + "Failed to render page previews.": "Không thể hiển thị bản xem trước các trang.", + "Failed to render page.": "Không thể hiển thị trang.", + "Failed to save changes.": "Không thể lưu thay đổi.", + "Failed to save the new PDF. Check console for details.": "Không thể lưu PDF mới. Hãy xem chi tiết trong console.", + "Failed to split PDF. Please check your selection.": "Không thể chia PDF. Vui lòng kiểm tra lại lựa chọn của bạn.", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "Không thể đóng dấu thời gian PDF: {{message}}\n\nHãy thử máy chủ TSA khác hoặc kiểm tra kết nối internet của bạn.", + "Failed to toggle layer visibility": "Không thể bật/tắt hiển thị lớp", + "Failed to validate signatures. The file may be corrupted.": "Không thể xác minh chữ ký. Tệp có thể bị hỏng.", + "Features enabled by this module:": "Các tính năng được mô-đun này bật:", + "Field Name": "Tên trường", + "Field Name (Group Name)": "Tên trường (Tên nhóm)", + "Field Name Conflict": "Xung đột tên trường", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "Tên trường \"{{newName}}\" đã tồn tại trong {{value}} này. Hãy thử dùng tên duy nhất.", + "Field name cannot be empty": "Tên trường không được để trống", + "File": "Tệp", + "File Size": "Kích thước tệp", + "File exists but could not be read. Check CORS configuration.": "Tệp tồn tại nhưng không thể đọc. Hãy kiểm tra cấu hình CORS.", + "File list not found": "Không tìm thấy danh sách tệp", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "Dung lượng tệp giảm từ {{originalSize}} xuống {{compressedSize}} (Tiết kiệm {{percent}}%).", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "Tệp {{n}}/{{length}}: Trang {{n2}}/{{pageCount}}", + "File {{n}}/{{length}}: {{message}}": "Tệp {{n}}/{{length}}: {{message}}", + "Filename": "Tên tệp", + "Files that failed: {{errorCount}}.": "Tệp bị lỗi: {{errorCount}}.", + "Fill (cover full target page)": "Lấp đầy (phủ kín trang đích)", + "Fill Color": "Màu tô", + "Finalizing PDF...": "Đang hoàn tất PDF...", + "Find & replace": "Tìm & thay thế", + "Finds the best quality under this size. 0 means no target.": "Tìm chất lượng tốt nhất dưới dung lượng này. 0 nghĩa là không đặt mục tiêu.", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox và Chrome có thể hiển thị định dạng bộ chọn ngày gốc của trình duyệt khi chọn. Định dạng đúng sẽ được áp dụng khi bạn nhập xong ngày.", + "First Indent": "Thụt lề dòng đầu", + "Fit (keep full page visible)": "Vừa khít (giữ toàn bộ trang hiển thị)", + "Fit Page": "Vừa trang", + "Fix Page Size": "Sửa kích thước trang", + "Flatten": "Làm phẳng", + "Flatten Forms": "Làm phẳng biểu mẫu", + "Flatten annotations": "Làm phẳng ghi chú", + "Flatten form fields": "Làm phẳng trường biểu mẫu", + "Flatten forms and annotations": "Làm phẳng biểu mẫu và ghi chú", + "Flatten links": "Làm phẳng liên kết", + "Flattening PDF...": "Đang làm phẳng PDF...", + "Flattening and saving PDF...": "Đang làm phẳng và lưu PDF...", + "Flattening multiple PDFs...": "Đang làm phẳng nhiều PDF...", + "Flattening page {{i}} of {{totalPages}}...": "Đang làm phẳng trang {{i}} trên {{totalPages}}...", + "Flattening {{n}}/{{length}}: {{name}}...": "Đang làm phẳng {{n}}/{{length}}: {{name}}...", + "Focuses address bar": "Chọn thanh địa chỉ", + "Font": "Phông chữ", + "Font Color": "Màu phông chữ", + "Font Family": "Họ phông chữ", + "Font Size": "Cỡ chữ", + "Font size: {{bSize}} → {{aSize}}": "Cỡ chữ: {{bSize}} → {{aSize}}", + "Font to Outline": "Phông chữ thành đường viền", + "Font: {{bFont}} → {{aFont}}": "Phông chữ: {{bFont}} → {{aFont}}", + "Fonts": "Phông chữ", + "Footer Center": "Chân trang giữa", + "Footer Left": "Chân trang trái", + "Footer Right": "Chân trang phải", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "Dành cho PDF chỉ có hình ảnh như bản quét. Sẽ bỏ qua khi tài liệu có văn bản chọn được, trừ khi bật Ghi đè bảo vệ nội dung.", + "Form fields stop being fillable.": "Các trường biểu mẫu không còn điền được.", + "Format": "Định dạng", + "Found {{length}} blank page(s). Click on a page to deselect it.": "Tìm thấy {{length}} trang trống. Nhấp vào một trang để bỏ chọn.", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "Tìm thấy {{length}} Bookmark hiện có. Thay thế các Bookmark hiện tại?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "Tìm thấy {{length}} hình ảnh trong {{length2}} PDF.", + "Front": "Mặt trước", + "Full Coverage": "Phủ kín", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "Tạo mục lục từ Bookmark", + "Generating High-Quality PDF...": "Đang tạo PDF chất lượng cao...", + "Generating PDF...": "Đang tạo PDF...", + "Generating ZIP file...": "Đang tạo tệp ZIP...", + "Generating formatted content...": "Đang tạo nội dung đã định dạng...", + "Generating preview...": "Đang tạo bản xem trước...", + "Ghostscript (PDF/A Conversion)": "Ghostscript (Chuyển đổi PDF/A)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Chuyển đổi RGB bằng Ghostscript không thành công với mã thoát {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Chuyển đổi bằng Ghostscript không thành công với mã thoát {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript không tạo ra tệp đầu ra", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript chưa được cấu hình. Hãy cấu hình trong Cài đặt nâng cao.", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript chưa được cấu hình. Hãy cấu hình trong Cài đặt WASM.", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript chưa được cấu hình. PyMuPDF cần Ghostscript cho một số thao tác. Hãy cấu hình cả hai trong Cài đặt nâng cao.", + "Ghostscript threw an exception: {{e}}": "Ghostscript gặp ngoại lệ: {{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript wrapper không cung cấp giao diện mong đợi. Cần loadGS() hoặc lớp GhostscriptWASM.", + "Go": "Đi", + "Go to page": "Đến trang", + "Grayscale": "Thang xám", + "Green": "Xanh lá", + "Greyscale": "Thang xám", + "Grid Mode": "Chế độ lưới", + "Group Name (Must be same for group)": "Tên nhóm (phải giống nhau trong cùng nhóm)", + "H-Scale %": "Tỷ lệ ngang %", + "Hanging Indent": "Thụt lề treo", + "Hard reloads page": "Tải lại trang hoàn toàn", + "Header & Footer": "Đầu trang & Chân trang", + "Header & Footer added successfully!": "Đã thêm đầu trang & chân trang thành công!", + "Header Center": "Đầu trang giữa", + "Header Left": "Đầu trang trái", + "Header Right": "Đầu trang phải", + "Height ({{unit}})": "Chiều cao ({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "Ẩn", + "Hide Border": "Ẩn viền", + "Hide password": "Ẩn mật khẩu", + "Hides window": "Ẩn cửa sổ", + "High (288 DPI)": "Cao (288 DPI)", + "High (Smallest Files)": "Cao (Tệp nhỏ nhất)", + "Horizontal": "Ngang", + "Hue Shift": "Dịch sắc độ", + "Image Format": "Định dạng hình ảnh", + "Image Input": "Đầu vào hình ảnh", + "Image quality": "Chất lượng hình ảnh", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "Đã đổi kích thước hình ảnh từ {{width}}×{{height}} thành {{width2}}×{{height2}}", + "Images": "Hình ảnh", + "Images above this are resampled down. None leaves resolution alone.": "Hình ảnh vượt mức này sẽ được lấy mẫu lại xuống thấp hơn. Chọn Không để giữ nguyên độ phân giải.", + "Imported {{length}} bookmarks!": "Đã nhập {{length}} Bookmark!", + "Inches (in)": "Inch (in)", + "Include Attachments": "Bao gồm tệp đính kèm", + "Include Cc Bcc": "Bao gồm Cc và Bcc", + "Include this file": "Bao gồm tệp này", + "Incorrect Page Count": "Số trang không đúng", + "Incorrect Password": "Mật khẩu không đúng", + "Incorrect password": "Mật khẩu không đúng", + "Incorrect password. Please try again.": "Mật khẩu không đúng. Vui lòng thử lại.", + "Increase size": "Tăng kích thước", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "Đang lập chỉ mục PDF 1, trang {{pageNumber}} trên {{totalPages}}...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "Đang lập chỉ mục PDF 2, trang {{pageNumber}} trên {{totalPages}}...", + "Info": "Thông tin", + "Info Dictionary": "Info Dictionary", + "Inherit": "Kế thừa", + "Initialization Error": "Lỗi khởi tạo", + "Initializing Ghostscript...": "Đang khởi tạo Ghostscript...", + "Initializing PDF engine...": "Đang khởi tạo công cụ PDF...", + "Initializing PyMuPDF...": "Đang khởi tạo PyMuPDF...", + "Initializing decryption...": "Đang khởi tạo giải mã...", + "Initializing encryption...": "Đang khởi tạo mã hóa...", + "Initializing repair engine...": "Đang khởi tạo công cụ sửa chữa...", + "Initializing...": "Đang khởi tạo...", + "Input Required": "Cần nhập dữ liệu", + "Insecure Digest (MD5 / SHA-1)": "Thuật toán băm không an toàn (MD5 / SHA-1)", + "Insert blank pages": "Chèn trang trống", + "Insert blank pages after this page number": "Chèn trang trống sau số trang này", + "Interactive Form Fields": "Trường biểu mẫu tương tác", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "Xen kẽ trang từ nhiều PDF (ví dụ: trang lẻ + trang chẵn đảo ngược từ bản quét một mặt)", + "Invalid Certificate": "Chứng chỉ không hợp lệ", + "Invalid File": "Tệp không hợp lệ", + "Invalid Files": "Các tệp không hợp lệ", + "Invalid Input": "Dữ liệu nhập không hợp lệ", + "Invalid JSON format": "Định dạng JSON không hợp lệ", + "Invalid Name": "Tên không hợp lệ", + "Invalid Order": "Thứ tự không hợp lệ", + "Invalid PDF password.": "Mật khẩu PDF không hợp lệ.", + "Invalid Page Numbers": "Số trang không hợp lệ", + "Invalid Page Order": "Thứ tự trang không hợp lệ", + "Invalid Pages": "Trang không hợp lệ", + "Invalid Range": "Phạm vi không hợp lệ", + "Invalid Signature": "Chữ ký không hợp lệ", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "URL TSA không hợp lệ. Cơ quan cấp dấu thời gian phải là URL http:// hoặc https:// hợp lệ.", + "Invalid URL": "URL không hợp lệ", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "Định dạng URL không hợp lệ. Vui lòng nhập URL hợp lệ (ví dụ: https://example.com/wasm/)", + "Invalid XML: no root element": "XML không hợp lệ: không có phần tử gốc", + "Invalid data": "Dữ liệu không hợp lệ", + "Invalid hex string in content stream": "Chuỗi hex không hợp lệ trong content stream", + "Invalid page range specified.": "Phạm vi trang đã chỉ định không hợp lệ.", + "Invalid shortcut format": "Định dạng phím tắt không hợp lệ", + "Invalid: Cryptographic Verification Failed": "Không hợp lệ: Xác minh mật mã không thành công", + "Invert Colors": "Đảo ngược màu", + "Invert all colors": "Đảo ngược tất cả màu", + "Inverting PDF colors...": "Đang đảo ngược màu PDF...", + "Issuer": "Nơi cấp", + "It fits the {{targetBytes}} target.": "Đạt mục tiêu {{targetBytes}}.", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "Vẫn vượt mục tiêu {{targetBytes}} vì Giữ nguyên PDF/A giới hạn mức nén tối đa.", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "Tệp không còn tuyên bố tuân thủ PDF/A. Hãy bật Giữ nguyên PDF/A trong Cài đặt tùy chỉnh để giữ lại.", + "Italic": "Nghiêng", + "Item 1": "Mục 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "Chữ ký số của tệp đã bị xóa để có thể nén. Hãy ký lại nếu cần.", + "JPEG (Smaller file size)": "JPEG (Dung lượng nhỏ hơn)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "Chất lượng JPEG cho hình ảnh được mã hóa lại, từ 20 đến 100. Càng thấp thì tệp càng nhỏ và càng dễ thấy nhiễu.", + "JPG": "JPG", + "JSON Files": "Tệp JSON", + "JSON Loaded": "Đã tải JSON", + "JSON to PDF": "JSON sang PDF", + "Javascript Code": "Mã JavaScript", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "Giữ tệp PDF/A tuân thủ chuẩn. Brotli và rasterize sẽ bị bỏ qua khi bật tùy chọn này.", + "Keeps only the characters the document uses.": "Chỉ giữ các ký tự mà tài liệu sử dụng.", + "Key (e.g., Department)": "Khóa (ví dụ: Phòng ban)", + "Keywords": "Từ khóa", + "Label": "Nhãn", + "Label / Prompt": "Nhãn / Lời nhắc", + "Landscape": "Ngang", + "Language": "Ngôn ngữ", + "Layer not found": "Không tìm thấy lớp", + "Layer {{number}}": "Lớp {{number}}", + "Leave blank for all pages": "Để trống để chọn tất cả trang", + "Left": "Trái", + "Left edge in points (1 inch = 72 pts)": "Cạnh trái (tính bằng point, 1 inch = 72 pts)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "Mức", + "Limit recognized characters (leave empty for all)": "Giới hạn ký tự nhận dạng (để trống nếu chọn tất cả)", + "Line": "Đường", + "Linearization Failed": "Tuyến tính hóa không thành công", + "Linearize": "Tuyến tính hóa", + "Links stop being clickable.": "Các liên kết không còn nhấp được.", + "Lists": "Danh sách", + "Load": "Tải", + "Load system fonts": "Tải phông chữ hệ thống", + "Load system fonts…": "Tải phông chữ hệ thống…", + "Loaded": "Đã tải", + "Loaded bookmarks from JSON. Now upload your PDF.": "Đã tải Bookmark từ JSON. Giờ hãy tải PDF của bạn lên.", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "Đã tải {{length}} Bookmark từ CSV. Giờ hãy tải PDF của bạn lên.", + "Loading Engine...": "Đang tải công cụ...", + "Loading Ghostscript...": "Đang tải Ghostscript...", + "Loading PDF Editor...": "Đang tải Trình chỉnh sửa PDF...", + "Loading PDF Text Editor...": "Đang tải Trình chỉnh sửa văn bản PDF...", + "Loading PDF converter...": "Đang tải bộ chuyển đổi PDF...", + "Loading PDF documents...": "Đang tải tài liệu PDF...", + "Loading PDF engine...": "Đang tải công cụ PDF...", + "Loading PDF files...": "Đang tải tệp PDF...", + "Loading PDF form...": "Đang tải biểu mẫu PDF...", + "Loading PDF processor...": "Đang tải bộ xử lý PDF...", + "Loading PDF viewer...": "Đang tải trình xem PDF...", + "Loading PDF...": "Đang tải PDF...", + "Loading PDFs...": "Đang tải các PDF...", + "Loading attachments...": "Đang tải tệp đính kèm...", + "Loading comparison {{currentPage}} of {{length}}...": "Đang tải bản so sánh {{currentPage}} trên {{length}}...", + "Loading conversion engine ({{percent}}%)...": "Đang tải công cụ chuyển đổi ({{percent}}%)...", + "Loading conversion engine...": "Đang tải công cụ chuyển đổi...", + "Loading engine...": "Đang tải công cụ...", + "Loading fonts...": "Đang tải phông chữ...", + "Loading layers from {{name}}...": "Đang tải các lớp từ {{name}}...", + "Loading page {{num}}...": "Đang tải trang {{num}}...", + "Loading preview...": "Đang tải bản xem trước...", + "Loading {{name}}...": "Đang tải {{name}}...", + "Loading...": "Đang tải...", + "Location": "Vị trí", + "Lossless (No Quality Loss)": "Không mất dữ liệu (Không giảm chất lượng)", + "Lossless (no image re-encoding)": "Không mất dữ liệu (không mã hóa lại hình ảnh)", + "Low (Best Quality)": "Thấp (Chất lượng tốt nhất)", + "MOBI Files": "Tệp MOBI", + "MOBI to PDF": "MOBI sang PDF", + "Malformed ByteRange": "ByteRange bị lỗi định dạng", + "Malformed ECDSA signature (could not parse r,s)": "Chữ ký ECDSA bị lỗi định dạng (không thể phân tích r,s)", + "Malformed inline image in content stream": "Hình ảnh nội tuyến bị lỗi định dạng trong content stream", + "Malformed signatureAlgorithm": "signatureAlgorithm bị lỗi định dạng", + "Margins": "Lề", + "Markdown Files": "Tệp Markdown", + "Markdown to PDF": "Markdown sang PDF", + "Max Length (0 for unlimited)": "Độ dài tối đa (0 là không giới hạn)", + "Maximum resolution": "Độ phân giải tối đa", + "Medium (Recommended)": "Trung bình (Khuyên dùng)", + "Merge PDF": "Gộp PDF", + "Merge PDFs": "Gộp PDF", + "Merge duplicate fonts": "Gộp các phông chữ trùng lặp", + "Mermaid Error: {{error}}": "Lỗi Mermaid: {{error}}", + "Metadata copied to clipboard as JSON.": "Đã sao chép metadata vào bộ nhớ tạm dưới dạng JSON.", + "Metadata removed successfully!": "Đã xóa metadata thành công!", + "Metadata updated successfully!": "Đã cập nhật metadata thành công!", + "Millimeters (mm)": "Milimét (mm)", + "Minimizes window": "Thu nhỏ cửa sổ", + "Missing Files": "Thiếu tệp", + "Missing signatureAlgorithm": "Thiếu signatureAlgorithm", + "Mixed Page Sizes Detected": "Phát hiện nhiều khổ trang khác nhau", + "Mixed Sizes": "Nhiều khổ trang", + "Mode": "Chế độ", + "Modified": "Đã sửa đổi", + "Modified After Signing (signed part intact)": "Đã sửa đổi sau khi ký (phần đã ký còn nguyên vẹn)", + "More": "Thêm", + "Moved": "Đã di chuyển", + "Moved \"{{value}}\"": "Đã di chuyển \"{{value}}\"", + "Multi-line": "Nhiều dòng", + "Must be a positive integer": "Phải là số nguyên dương", + "Must be a positive number": "Phải là số dương", + "N must be at least 1.": "N phải ít nhất là 1.", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "Đã tạo PDF N-Up thành công!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "Lỗi mạng: Không thể kết nối đến URL. Hãy kiểm tra URL có đúng không và máy chủ có cho phép yêu cầu CORS không.", + "Network error: {{error}}": "Lỗi mạng: {{error}}", + "Next page": "Trang sau", + "No Area Selected": "Chưa chọn vùng", + "No Attachments": "Không có tệp đính kèm", + "No Changes": "Không có thay đổi", + "No Crop Area": "Chưa có vùng cắt", + "No File": "Không có tệp", + "No Files": "Không có tệp", + "No Images Found": "Không tìm thấy hình ảnh", + "No PDF Files": "Không có tệp PDF", + "No PDF document loaded": "Chưa tải tài liệu PDF", + "No PDF document loaded.": "Chưa tải tài liệu PDF.", + "No PDF file loaded.": "Chưa tải tệp PDF.", + "No PDF files could be decrypted. The password may be incorrect.": "Không thể giải mã tệp PDF nào. Mật khẩu có thể không đúng.", + "No PDF files could be linearized.": "Không thể tuyến tính hóa tệp PDF nào.", + "No PDFs could be processed.": "Không thể xử lý PDF nào.", + "No Pages": "Không có trang", + "No Selection": "Chưa chọn", + "No Signatures Found": "Không tìm thấy chữ ký", + "No Tables Found": "Không tìm thấy bảng", + "No Text": "Không có văn bản", + "No URL configured": "Chưa cấu hình URL", + "No attachments found in this PDF.": "Không tìm thấy tệp đính kèm trong PDF này.", + "No attachments selected for removal.": "Chưa chọn tệp đính kèm nào để xóa.", + "No blank pages detected in this PDF.": "Không phát hiện trang trống trong PDF này.", + "No bookmarks found at the selected level.": "Không tìm thấy Bookmark ở cấp đã chọn.", + "No bookmarks to delete.": "Không có Bookmark để xóa.", + "No bookmarks to export!": "Không có Bookmark để xuất!", + "No certificate found in PEM file": "Không tìm thấy chứng chỉ trong tệp PEM", + "No certificate found in PFX file": "Không tìm thấy chứng chỉ trong tệp PFX", + "No certificates found in signature": "Không tìm thấy chứng chỉ trong chữ ký", + "No changes match the current filter.": "Không có thay đổi nào khớp với bộ lọc hiện tại.", + "No configurable settings for this node.": "Nút này không có cài đặt nào để cấu hình.", + "No differences detected on this page.": "Không phát hiện khác biệt nào trên trang này.", + "No embedded images were found in the selected PDF(s).": "Không tìm thấy hình ảnh nhúng nào trong các PDF đã chọn.", + "No existing bookmarks found in this PDF.": "Không tìm thấy Bookmark nào trong PDF này.", + "No items were selected for removal or none were found in the PDF.": "Chưa chọn mục nào để xóa hoặc không tìm thấy mục nào trong PDF.", + "No page pairs to export.": "Không có cặp trang nào để xuất.", + "No pages found. Please create a blank PDF or upload one.": "Không tìm thấy trang nào. Vui lòng tạo PDF trống hoặc tải một PDF lên.", + "No pages selected for removal.": "Chưa chọn trang nào để xóa.", + "No pages were selected for splitting.": "Chưa chọn trang nào để chia.", + "No paired page for this side.": "Không có trang ghép cặp cho mặt này.", + "No private key found in PEM file": "Không tìm thấy khóa riêng trong tệp PEM", + "No private key found in PFX file": "Không tìm thấy khóa riêng trong tệp PFX", + "No tables were detected in this PDF.": "Không phát hiện bảng nào trong PDF này.", + "No valid page numbers found.": "Không tìm thấy số trang hợp lệ.", + "No valid pages to save.": "Không có trang hợp lệ để lưu.", + "No worker": "Không có worker", + "Noise": "Nhiễu", + "None": "Không", + "None of the files could be compressed: {{join}}.": "Không thể nén tệp nào: {{join}}.", + "Normal": "Thường", + "Not Enough Files": "Không đủ tệp", + "Not a PDF": "Không phải PDF", + "Not connected": "Chưa kết nối", + "Not in trust chain": "Không nằm trong chuỗi tin cậy", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "Lưu ý: Nếu không có mật khẩu chủ sở hữu riêng, PDF sẽ không có hạn chế sử dụng.", + "Number Format": "Định dạng số", + "Number of Pages": "Số trang", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR bị hủy trước khi xử lý trang nào", + "OCR recognize timed out after {{timeoutMs}}ms": "Nhận dạng OCR quá thời gian sau {{timeoutMs}}ms", + "OCR: {{status}}": "OCR: {{status}}", + "ODG Files": "Tệp ODG", + "ODG to PDF": "ODG sang PDF", + "OK": "OK", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "Tắt (mặc định): đánh số tự nhiên từ 1–N. Bật: giữ nguyên nhãn trang gốc của từng tệp (có thể tạo nhãn trùng lặp).", + "One PDF per page": "Một PDF cho mỗi trang", + "One PDF per range": "Một PDF cho mỗi phạm vi", + "Only a substitute font was available": "Chỉ có phông chữ thay thế", + "Only where it does not change how the image looks.": "Chỉ khi không làm thay đổi hình dạng của hình ảnh.", + "Opacity": "Độ mờ đục", + "Open URL": "Mở URL", + "Opens incognito window": "Mở cửa sổ ẩn danh", + "Opens new tab": "Mở tab mới", + "Opens new window": "Mở cửa sổ mới", + "Operation Failed": "Thao tác không thành công", + "Operation resulted in an empty file.": "Thao tác tạo ra tệp trống.", + "Optimize PDF for fast web viewing": "Tối ưu hóa PDF để xem web nhanh", + "Optimizing PDFs for web view (linearizing)...": "Đang tối ưu hóa PDF để xem web (tuyến tính hóa)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "Đang tối ưu hóa {{name}} ({{n}}/{{length}})...", + "Options (One per line or comma separated)": "Tùy chọn (Mỗi dòng một mục hoặc ngăn cách bằng dấu phẩy)", + "Orientation": "Hướng trang", + "Outline": "Đường viền", + "Output": "Đầu ra", + "Overlay": "Chồng lớp", + "Overlay or underlay pages from one PDF onto another": "Chồng các trang từ một PDF lên trên hoặc dưới PDF khác", + "Owner Password": "Mật khẩu chủ sở hữu", + "Owner Password Required": "Cần mật khẩu chủ sở hữu", + "PDF": "PDF", + "PDF Files": "Tệp PDF", + "PDF Input": "Đầu vào PDF", + "PDF Layers": "Các lớp PDF", + "PDF Metadata": "Metadata PDF", + "PDF Producer": "Nhà sản xuất PDF", + "PDF converted to CSV successfully!": "Đã chuyển đổi PDF sang CSV thành công!", + "PDF converted to SVG successfully!": "Đã chuyển đổi PDF sang SVG thành công!", + "PDF converted to greyscale successfully!": "Đã chuyển PDF sang thang xám thành công!", + "PDF created successfully!": "Đã tạo PDF thành công!", + "PDF decrypted successfully! All encryption and restrictions removed.": "Đã giải mã PDF thành công! Mọi mã hóa và hạn chế đã được gỡ bỏ.", + "PDF decrypted successfully! Your download has started.": "Đã giải mã PDF thành công! Quá trình tải xuống đã bắt đầu.", + "PDF downloaded successfully.": "Đã tải PDF xuống thành công.", + "PDF encrypted successfully with 256-bit AES!": "Đã mã hóa PDF thành công bằng AES 256-bit!", + "PDF has been sanitized and downloaded.": "PDF đã được làm sạch và tải xuống.", + "PDF has no pages": "PDF không có trang nào", + "PDF organized successfully!": "Đã sắp xếp PDF thành công!", + "PDF permissions changed successfully!": "Đã thay đổi quyền PDF thành công!", + "PDF readers supply the 14 standard PDF fonts themselves.": "Trình đọc PDF tự cung cấp 14 phông chữ PDF chuẩn.", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "Đã xóa hạn chế PDF thành công! Tệp giờ có thể chỉnh sửa và in tự do.", + "PDF saved successfully!": "Đã lưu PDF thành công!", + "PDF split successfully!": "Đã chia PDF thành công!", + "PDF to CSV": "PDF sang CSV", + "PDF to DOCX": "PDF sang DOCX", + "PDF to Excel/CSV": "PDF sang Excel/CSV", + "PDF to Images": "PDF sang hình ảnh", + "PDF to Images (High Quality)": "PDF sang hình ảnh (Chất lượng cao)", + "PDF to JSON": "PDF sang JSON", + "PDF to Markdown": "PDF sang Markdown", + "PDF to PDF/A": "PDF sang PDF/A", + "PDF to SVG": "PDF sang SVG", + "PDF to Text": "PDF sang Văn bản", + "PDF to XLSX": "PDF sang XLSX", + "PDF with layer changes saved!": "Đã lưu PDF với các thay đổi về lớp!", + "PDF {{modeLabel}} applied successfully.": "Đã áp dụng PDF {{modeLabel}} thành công.", + "PDF/A Conversion": "Chuyển đổi PDF/A", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b (Nghiêm ngặt, không có độ trong suốt)", + "PDF/A-2b (Recommended)": "PDF/A-2b (Khuyên dùng)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b (Hiện đại, cho phép tệp đính kèm)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "Đã trộn các PDF thành công!", + "PNG": "PNG", + "PNG (Lossless)": "PNG (Không mất dữ liệu)", + "PUB to PDF": "PUB sang PDF", + "Page": "Trang", + "Page #": "Trang #", + "Page Added": "Đã thêm trang", + "Page Numbers": "Số trang", + "Page Removed": "Đã xóa trang", + "Page Size": "Khổ trang", + "Page X of Y": "Trang X / Y", + "Page background or layout changed": "Nền hoặc bố cục trang đã thay đổi", + "Page container not found": "Không tìm thấy vùng chứa trang", + "Page extraction produced an empty PDF.": "Việc trích xuất trang tạo ra PDF trống.", + "Page number": "Số trang", + "Page numbers added successfully!": "Đã thêm số trang thành công!", + "Page sizes standardized successfully!": "Đã chuẩn hóa khổ trang thành công!", + "Page {{currentPageNum}} of {{numPages}}": "Trang {{currentPageNum}} trên {{numPages}}", + "Page {{num}} / {{numPages}}": "Trang {{num}} / {{numPages}}", + "Page {{n}} ": "Trang {{n}} ", + "Page {{n}} of {{length}}": "Trang {{n}} trên {{length}}", + "Page {{n}}:": "Trang {{n}}:", + "Page {{pageNumber}}": "Trang {{pageNumber}}", + "Page {{pageNumber}} exists only in the first PDF.": "Trang {{pageNumber}} chỉ có trong PDF thứ nhất.", + "Page {{pageNumber}} exists only in the second PDF.": "Trang {{pageNumber}} chỉ có trong PDF thứ hai.", + "Page {{pageNumber}} of {{totalPages}}": "Trang {{pageNumber}} trên {{totalPages}}", + "Page {{pageNum}} does not exist in this PDF.": "Trang {{pageNum}} không tồn tại trong PDF này.", + "Page {{page}}": "Trang {{page}}", + "Page {{page}} attachment": "Tệp đính kèm trang {{page}}", + "Pages": "Trang", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "Trang (ví dụ: 1-3, 5) - Tổng: {{pageCount}}", + "Pages Files": "Tệp Pages", + "Pages Per Sheet": "Số trang mỗi tờ", + "Pages combined successfully!": "Đã kết hợp trang thành công!", + "Pages have been divided successfully!": "Đã chia trang thành công!", + "Pages have been reordered.": "Đã sắp xếp lại các trang.", + "Pages have been reversed successfully!": "Đã đảo ngược các trang thành công!", + "Pages to PDF": "Pages sang PDF", + "Paper Size": "Khổ giấy", + "Paragraph": "Đoạn văn", + "Parsing XML structure...": "Đang phân tích cấu trúc XML...", + "Parsing {{name}}...": "Đang phân tích {{name}}...", + "Partial Coverage": "Phủ một phần", + "Partial Success": "Thành công một phần", + "Password": "Mật khẩu", + "Password Error": "Lỗi mật khẩu", + "Password Needed": "Cần mật khẩu", + "Password Required": "Yêu cầu mật khẩu", + "Password for all files": "Mật khẩu cho tất cả tệp", + "Password for all locked files": "Mật khẩu cho tất cả tệp bị khóa", + "Password for {{name}}": "Mật khẩu cho {{name}}", + "Password protected": "Được bảo vệ bằng mật khẩu", + "Password required for encrypted private key": "Cần mật khẩu cho khóa riêng đã mã hóa", + "Path Stroke": "Nét vẽ đường dẫn", + "Please add at least one field before downloading.": "Vui lòng thêm ít nhất một trường trước khi tải xuống.", + "Please draw a rectangle on at least one page to select the crop area.": "Vui lòng vẽ một hình chữ nhật trên ít nhất một trang để chọn vùng cắt.", + "Please ensure all page numbers in the order are unique.": "Vui lòng đảm bảo tất cả số trang trong thứ tự là duy nhất.", + "Please enter a layer name": "Vui lòng nhập tên lớp", + "Please enter a name.": "Vui lòng nhập tên.", + "Please enter a number between 0 and {{totalPages}}.": "Vui lòng nhập một số từ 0 đến {{totalPages}}.", + "Please enter a page order.": "Vui lòng nhập thứ tự trang.", + "Please enter a password": "Vui lòng nhập mật khẩu", + "Please enter a password for {{i}} or skip it": "Vui lòng nhập mật khẩu cho {{i}} hoặc bỏ qua", + "Please enter a title.": "Vui lòng nhập tiêu đề.", + "Please enter a user password.": "Vui lòng nhập mật khẩu người dùng.", + "Please enter a valid number of pages (1 or more).": "Vui lòng nhập số trang hợp lệ (từ 1 trở lên).", + "Please enter a valid page number between 1 and {{total}}": "Vui lòng nhập số trang hợp lệ từ 1 đến {{total}}", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "Vui lòng nhập phạm vi trang hợp lệ (ví dụ: 1-5, 8, 11-13).", + "Please enter page numbers to extract.": "Vui lòng nhập số trang cần trích xuất.", + "Please enter positive numbers.": "Vui lòng nhập số dương.", + "Please enter some text to convert.": "Vui lòng nhập văn bản cần chuyển đổi.", + "Please enter text for the watermark.": "Vui lòng nhập văn bản cho Watermark.", + "Please enter the PDF password.": "Vui lòng nhập mật khẩu PDF.", + "Please load a PDF first.": "Vui lòng tải PDF lên trước.", + "Please select PDF files to create a ZIP archive.": "Vui lòng chọn tệp PDF để tạo kho lưu trữ ZIP.", + "Please select a .pem, .crt, .cer, or .der certificate file.": "Vui lòng chọn tệp chứng chỉ .pem, .crt, .cer hoặc .der.", + "Please select a PDF file.": "Vui lòng chọn một tệp PDF.", + "Please select a valid PDF file.": "Vui lòng chọn tệp PDF hợp lệ.", + "Please select an area on at least one page to crop.": "Vui lòng chọn vùng cắt trên ít nhất một trang.", + "Please select an area to crop first.": "Vui lòng chọn vùng cắt trước.", + "Please select an area to crop.": "Vui lòng chọn vùng cắt.", + "Please select an image file for the watermark.": "Vui lòng chọn tệp hình ảnh cho Watermark.", + "Please select at least one BMP file.": "Vui lòng chọn ít nhất một tệp BMP.", + "Please select at least one CSV file.": "Vui lòng chọn ít nhất một tệp CSV.", + "Please select at least one Excel file.": "Vui lòng chọn ít nhất một tệp Excel.", + "Please select at least one HEIC file.": "Vui lòng chọn ít nhất một tệp HEIC.", + "Please select at least one JPG file.": "Vui lòng chọn ít nhất một tệp JPG.", + "Please select at least one JPG or JPEG2000 image.": "Vui lòng chọn ít nhất một hình ảnh JPG hoặc JPEG2000.", + "Please select at least one ODT file.": "Vui lòng chọn ít nhất một tệp ODT.", + "Please select at least one PDF file.": "Vui lòng chọn ít nhất một tệp PDF.", + "Please select at least one PowerPoint file.": "Vui lòng chọn ít nhất một tệp PowerPoint.", + "Please select at least one RTF file.": "Vui lòng chọn ít nhất một tệp RTF.", + "Please select at least one SVG file.": "Vui lòng chọn ít nhất một tệp SVG.", + "Please select at least one TIFF file.": "Vui lòng chọn ít nhất một tệp TIFF.", + "Please select at least one Word document.": "Vui lòng chọn ít nhất một tài liệu Word.", + "Please select at least one file to attach.": "Vui lòng chọn ít nhất một tệp để đính kèm.", + "Please select at least one image file.": "Vui lòng chọn ít nhất một tệp hình ảnh.", + "Please select at least one text file.": "Vui lòng chọn ít nhất một tệp văn bản.", + "Please select at least one {{FILETYPE_NAME}} file.": "Vui lòng chọn ít nhất một tệp {{FILETYPE_NAME}}.", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "Vui lòng chọn ít nhất một tệp {{TOOL_NAME}} (.eml hoặc .msg).", + "Please select at least one {{TOOL_NAME}} file.": "Vui lòng chọn ít nhất một tệp {{TOOL_NAME}}.", + "Please select even or odd pages.": "Vui lòng chọn trang chẵn hoặc trang lẻ.", + "Please select one or more PDF files.": "Vui lòng chọn một hoặc nhiều tệp PDF.", + "Please select pages to delete.": "Vui lòng chọn trang cần xóa.", + "Please select pages to duplicate.": "Vui lòng chọn trang cần nhân đôi.", + "Please select pages to mark for splitting.": "Vui lòng chọn trang để đánh dấu chia.", + "Please select pages to rotate.": "Vui lòng chọn trang cần xoay.", + "Please specify a page range for page-level attachments.": "Vui lòng chỉ định phạm vi trang cho tệp đính kèm theo trang.", + "Please upload PDF files.": "Vui lòng tải tệp PDF lên.", + "Please upload PDFs first.": "Vui lòng tải PDF lên trước.", + "Please upload a .docx file first.": "Vui lòng tải tệp .docx lên trước.", + "Please upload a PDF file first.": "Vui lòng tải tệp PDF lên trước.", + "Please upload a PDF file.": "Vui lòng tải một tệp PDF lên.", + "Please upload a PDF first.": "Vui lòng tải PDF lên trước.", + "Please upload a valid PDF file.": "Vui lòng tải tệp PDF hợp lệ lên.", + "Please upload at least one PDF file.": "Vui lòng tải lên ít nhất một tệp PDF.", + "Please upload at least two PDF files to alternate and mix.": "Vui lòng tải lên ít nhất hai tệp PDF để xen kẽ và trộn.", + "Please upload both a base PDF and an overlay/underlay PDF.": "Vui lòng tải lên cả PDF nền và PDF chồng lớp (phía trên hoặc phía dưới).", + "Please upload valid PDF files.": "Vui lòng tải các tệp PDF hợp lệ lên.", + "Please use the Download button in the PDF viewer toolbar above.": "Vui lòng dùng nút Tải xuống trên thanh công cụ của trình xem PDF ở trên.", + "Please wait for the PDF viewer to load.": "Vui lòng chờ trình xem PDF tải xong.", + "Please wait for the form to finish loading.": "Vui lòng chờ biểu mẫu tải xong.", + "Portrait": "Dọc", + "Position": "Vị trí", + "Post-processing for transparency compliance...": "Xử lý hậu kỳ để tuân thủ độ trong suốt...", + "Posterize": "Chia thành poster", + "Posterizing PDF...": "Đang posterize PDF...", + "PowerPoint to PDF": "PowerPoint sang PDF", + "Pre Flatten": "Làm phẳng trước", + "Pre-flattening PDF...": "Đang làm phẳng PDF trước...", + "Prefer JPEG 2000 for photos": "Ưu tiên JPEG 2000 cho ảnh chụp", + "Preparing PDF export...": "Đang chuẩn bị xuất PDF...", + "Preparing conversion...": "Đang chuẩn bị chuyển đổi...", + "Preparing download...": "Đang chuẩn bị tải xuống...", + "Preparing preview...": "Đang chuẩn bị bản xem trước...", + "Presentations": "Bản trình bày", + "Preserve PDF/A": "Giữ nguyên PDF/A", + "Preview": "Xem trước", + "Preview Error": "Lỗi xem trước", + "Preview Text": "Xem trước văn bản", + "Previous page": "Trang trước", + "Print Form": "In biểu mẫu", + "Private data that editing apps store inside the PDF.": "Dữ liệu riêng mà các ứng dụng chỉnh sửa lưu bên trong PDF.", + "Processed {{processedCount}} PDFs.": "Đã xử lý {{processedCount}} PDF.", + "Processing Complete": "Xử lý hoàn tất", + "Processing Dpi": "DPI xử lý", + "Processing Failed": "Xử lý không thành công", + "Processing PDF permissions...": "Đang xử lý quyền PDF...", + "Processing attachments...": "Đang xử lý tệp đính kèm...", + "Processing failed for {{name}}.": "Xử lý {{name}} không thành công.", + "Processing file {{n}} of {{length}}...": "Đang xử lý tệp {{n}} trên {{length}}...", + "Processing images...": "Đang xử lý hình ảnh...", + "Processing multiple PDFs...": "Đang xử lý nhiều PDF...", + "Processing page {{i}} of {{numPages}}": "Đang xử lý trang {{i}} trên {{numPages}}", + "Processing page {{i}} of {{numPages}}...": "Đang xử lý trang {{i}} trên {{numPages}}...", + "Processing page {{n}} of {{length}}...": "Đang xử lý trang {{n}} trên {{length}}...", + "Processing page {{pageNum}} of {{length}}...": "Đang xử lý trang {{pageNum}} trên {{length}}...", + "Processing page {{pageNum}} of {{totalPages}}...": "Đang xử lý trang {{pageNum}} trên {{totalPages}}...", + "Processing produced an empty file.": "Quá trình xử lý tạo ra tệp trống.", + "Processing resulted in an empty file.": "Quá trình xử lý tạo ra tệp trống.", + "Processing sheet {{n}}...": "Đang xử lý tờ {{n}}...", + "Processing {{name}}...": "Đang xử lý {{name}}...", + "Processing {{nodeName}}...": "Đang xử lý {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "Đang xử lý {{n}}/{{length}}: {{name}}...", + "Processing...": "Đang xử lý...", + "Producer": "Nhà sản xuất", + "Publisher Files": "Tệp Publisher", + "Purple": "Tím", + "PyMuPDF (Document Processing)": "PyMuPDF (Xử lý tài liệu)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF chưa được cấu hình. Hãy cấu hình trong Cài đặt nâng cao.", + "PyMuPDF module did not export expected PyMuPDF class.": "Mô-đun PyMuPDF không xuất lớp PyMuPDF như mong đợi.", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF tạo ra tệp giải mã trống.", + "PyMuPDF: not configured.": "PyMuPDF: chưa được cấu hình.", + "QR Code": "Mã QR", + "Quality": "Chất lượng", + "Quits application (cannot be overridden)": "Thoát ứng dụng (không thể ghi đè)", + "RSA-PKCS1 signature does not verify against signer public key": "Chữ ký RSA-PKCS1 không khớp với khóa công khai của người ký", + "RSA-PSS signature does not verify against signer public key": "Chữ ký RSA-PSS không khớp với khóa công khai của người ký", + "Rasterization Complete": "Rasterize hoàn tất", + "Rasterization Partial": "Rasterize một phần", + "Rasterize": "Raster hóa", + "Rasterize Dpi": "DPI rasterize", + "Rasterize pages to images": "Rasterize các trang thành hình ảnh", + "Rasterize quality": "Chất lượng rasterize", + "Rasterize resolution (DPI)": "Độ phân giải rasterize (DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "Đã rasterize {{completed}} PDF, {{failed}} không thành công.", + "Rasterizing {{name}} ({{n}}/{{total}})...": "Đang rasterize {{name}} ({{n}}/{{total}})...", + "Rasterizing {{name}}...": "Đang rasterize {{name}}...", + "Rasterizing...": "Đang rasterize...", + "Rating must be between 0 and 5": "Xếp hạng phải nằm trong khoảng từ 0 đến 5", + "Read Only": "Chỉ đọc", + "Reading CSV file...": "Đang đọc tệp CSV...", + "Reading PDF...": "Đang đọc PDF...", + "Reading XML file...": "Đang đọc tệp XML...", + "Reading encrypted PDF...": "Đang đọc PDF đã mã hóa...", + "Reading files...": "Đang đọc tệp...", + "Reading layer configuration...": "Đang đọc cấu hình lớp...", + "Reading {{name}} ({{n}}/{{length}})...": "Đang đọc {{name}} ({{n}}/{{length}})...", + "Ready": "Sẵn sàng", + "Reason": "Lý do", + "Red": "Đỏ", + "Redact": "Che nội dung", + "Redact Mode": "Chế độ che nội dung", + "Redact text from PDF": "Che văn bản trong PDF", + "Redaction Failed": "Che nội dung không thành công", + "Reduce PDF file size": "Giảm dung lượng tệp PDF", + "Reduce color complexity": "Giảm độ phức tạp của màu", + "Reduces file size by removing color information.": "Giảm dung lượng tệp bằng cách loại bỏ thông tin màu.", + "Reloads page": "Tải lại trang", + "Remove": "Xóa", + "Remove All Attachments": "Xóa tất cả tệp đính kèm", + "Remove Annotations": "Xóa ghi chú", + "Remove Blank Pages": "Xóa trang trống", + "Remove Embedded Files": "Xóa tệp nhúng", + "Remove Fonts": "Xóa phông chữ", + "Remove Javascript": "Xóa JavaScript", + "Remove Layers": "Xóa lớp", + "Remove Links": "Xóa liên kết", + "Remove Mark Info": "Xóa Mark Info", + "Remove Metadata": "Xóa Metadata", + "Remove PDF password protection": "Gỡ bảo vệ bằng mật khẩu của PDF", + "Remove Structure Tree": "Xóa cây cấu trúc", + "Remove alternate images": "Xóa hình ảnh thay thế", + "Remove application data": "Xóa dữ liệu ứng dụng", + "Remove article threads": "Xóa article thread", + "Remove attachment": "Xóa tệp đính kèm", + "Remove blank pages automatically": "Tự động xóa trang trống", + "Remove document structure tree": "Xóa cây cấu trúc tài liệu", + "Remove file": "Xóa tệp", + "Remove metadata, scripts, and hidden data": "Xóa metadata, script và dữ liệu ẩn", + "Remove output intents": "Xóa output intent", + "Remove page thumbnails": "Xóa hình thu nhỏ của trang", + "Remove specific pages": "Xóa các trang cụ thể", + "Remove web capture information": "Xóa thông tin thu thập từ web", + "Remove {{name}}": "Xóa {{name}}", + "Removed \"{{beforeText}}\"": "Đã xóa \"{{beforeText}}\"", + "Removed image ({{width}}×{{height}})": "Đã xóa hình ảnh ({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "Đã xóa {{length}} trang trống thành công!", + "Removing all metadata...": "Đang xóa toàn bộ metadata...", + "Removing annotations...": "Đang xóa ghi chú...", + "Removing redacted text from document data...": "Đang xóa văn bản đã che khỏi dữ liệu tài liệu...", + "Removing restrictions...": "Đang xóa hạn chế...", + "Removing {{length}} blank page(s)...": "Đang xóa {{length}} trang trống...", + "Render Error": "Lỗi hiển thị", + "Rendering Page {{num}}...": "Đang hiển thị trang {{num}}...", + "Rendering page previews...": "Đang hiển thị bản xem trước các trang...", + "Rendering page previews: {{current}}/{{total}}": "Đang hiển thị bản xem trước các trang: {{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "Đang hiển thị trang {{n}} trên {{length}}...", + "Rendering preview for page {{pageNum}}...": "Đang hiển thị bản xem trước trang {{pageNum}}...", + "Reopens closed tab": "Mở lại tab đã đóng", + "Repair": "Sửa chữa", + "Repair Failed": "Sửa chữa không thành công", + "Repair corrupted PDF": "Sửa chữa PDF bị hỏng", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "Đã sửa chữa {{length}} tệp. Không sửa chữa được: {{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "Đang sửa chữa {{name}} ({{n}}/{{length}})...", + "Repairing {{name}}...": "Đang sửa chữa {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "Đã thay \"{{beforeText}}\" bằng \"{{afterText}}\"", + "Required": "Bắt buộc", + "Resamples even when an image is only slightly above the limit.": "Lấy mẫu lại ngay cả khi hình ảnh chỉ vượt giới hạn một chút.", + "Reset Form": "Đặt lại biểu mẫu", + "Reset and go back to file uploader? All unsaved changes will be lost.": "Đặt lại và quay về trình tải tệp lên? Mọi thay đổi chưa lưu sẽ bị mất.", + "Resolution": "Độ phân giải", + "Retain Page Labels": "Giữ nhãn trang", + "Retry Failed": "Thử lại các mục lỗi", + "Reverse Pages": "Đảo ngược trang", + "Reverse page order": "Đảo ngược thứ tự trang", + "Reversing page order...": "Đang đảo ngược thứ tự trang...", + "Reversing {{name}} ({{n}}/{{length}})...": "Đang đảo ngược {{name}} ({{n}}/{{length}})...", + "Right": "Phải", + "Right edge in points": "Cạnh phải (tính bằng point)", + "Rotate": "Xoay", + "Rotate +90°": "Xoay +90°", + "Rotate all pages": "Xoay tất cả trang", + "Rotation": "Xoay", + "Rotation Variance": "Biên độ xoay", + "Rotations applied successfully!": "Đã áp dụng xoay thành công!", + "Rows": "Hàng", + "Run Javascript": "Chạy JavaScript", + "Running OCR on page {{pageNum}}...": "Đang chạy OCR trên trang {{pageNum}}...", + "Running...": "Đang chạy...", + "SVG": "SVG", + "SVG Files": "Tệp SVG", + "SVG to PDF": "SVG sang PDF", + "Sanitize": "Làm sạch", + "Sanitized With Warnings": "Đã làm sạch kèm cảnh báo", + "Sanitizing PDF...": "Đang làm sạch PDF...", + "Saturation": "Độ bão hòa", + "Saved": "Đã lưu", + "Saving PDF with layer changes...": "Đang lưu PDF với các thay đổi về lớp...", + "Scaling Mode": "Chế độ co giãn", + "Scanner Effect": "Hiệu ứng máy quét", + "Scanner effect applied successfully!": "Đã áp dụng hiệu ứng máy quét thành công!", + "Scanning page {{n}} of {{pageCount}}...": "Đang quét trang {{n}} trên {{pageCount}}...", + "Search Text": "Tìm văn bản", + "Search languages...": "Tìm ngôn ngữ...", + "Select Font": "Chọn phông chữ", + "Select a field to edit properties": "Chọn một trường để chỉnh sửa thuộc tính", + "Select a field...": "Chọn một trường...", + "Select to add this button to an existing group": "Chọn để thêm nút này vào nhóm hiện có", + "Selected Option": "Tùy chọn đã chọn", + "Self-Signed: Signer Identity Not Verified": "Tự ký: Chưa xác minh danh tính người ký", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "Tài nguyên OCR tự lưu trữ mới được cấu hình một phần. Hãy đặt {{missing}} cùng với các URL tài nguyên Tesseract khác.", + "Separator": "Đường phân cách", + "Separator Color": "Màu đường phân cách", + "Separator Thickness": "Độ dày đường phân cách", + "Sepia": "Nâu đỏ (Sepia)", + "Serial Number:": "Số sê-ri:", + "Set custom destination": "Đặt đích đến tùy chỉnh", + "Shapes": "Hình dạng", + "Sheet {{n}} {{sideLabel}}": "Tờ {{n}} {{sideLabel}}", + "Show": "Hiện", + "Show password": "Hiện mật khẩu", + "Show/Hide Field": "Hiện/Ẩn trường", + "Sign Here": "Ký tại đây", + "Signature /Contents is not a single DER object followed by zero padding": "Signature /Contents không phải một đối tượng DER duy nhất theo sau là phần đệm số 0", + "Signature Algorithm:": "Thuật toán chữ ký:", + "Signature Intact: Signer Identity Not Verified": "Chữ ký còn nguyên vẹn: Chưa xác minh danh tính người ký", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "Trường chữ ký là trường chữ ký AcroForm và chỉ hiển thị trong trình xem PDF nâng cao.", + "Signature has a missing or malformed /ByteRange": "Chữ ký thiếu hoặc có /ByteRange bị lỗi định dạng", + "Signature scheme {{kind}} not implemented": "Chưa hỗ trợ lược đồ chữ ký {{kind}}", + "Signature {{n}}": "Chữ ký {{n}}", + "Signatures": "Chữ ký", + "Signed By": "Người ký", + "Signed On": "Ngày ký", + "Signed PDF Not Changed": "PDF đã ký không thay đổi", + "Signed PDF downloaded successfully!": "Đã tải PDF đã ký xuống thành công!", + "Signed PDF saved successfully!": "Đã lưu PDF đã ký thành công!", + "Simple (1, 2, 3)": "Đơn giản (1, 2, 3)", + "Simplify large color profiles": "Đơn giản hóa hồ sơ màu lớn", + "Skew Threshold": "Ngưỡng nghiêng", + "Skip": "Bỏ qua", + "Skip All": "Bỏ qua tất cả", + "Skip Remaining": "Bỏ qua phần còn lại", + "Skip this file": "Bỏ qua tệp này", + "Skipped: {{join}}.": "Đã bỏ qua: {{join}}.", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "Tệp nhỏ hơn, nhưng chỉ các trình đọc hỗ trợ Brotli mới mở được, chẳng hạn Firefox, MuPDF 1.26+ và Ghostscript 10.06+.", + "Some files were skipped because they are not supported images.": "Một số tệp đã bị bỏ qua vì không phải hình ảnh được hỗ trợ.", + "Some files were skipped. Only BMP files are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép tệp BMP.", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép tệp HEIC/HEIF.", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép tệp JPG, JPEG, JP2 và JPX.", + "Some files were skipped. Only PDF files are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép tệp PDF.", + "Some files were skipped. Only PNG images are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép hình ảnh PNG.", + "Some files were skipped. Only SVG graphics are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép đồ họa SVG.", + "Some files were skipped. Only TIFF files are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép tệp TIFF.", + "Some files were skipped. Only WebP images are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép hình ảnh WebP.", + "Some files were skipped. Only supported image formats are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép các định dạng hình ảnh được hỗ trợ.", + "Some files were skipped. Only text files are allowed.": "Một số tệp đã bị bỏ qua. Chỉ cho phép tệp văn bản.", + "Some pages could not be processed. Please try again.": "Không thể xử lý một số trang. Vui lòng thử lại.", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "Không thể áp dụng một số dấu che, nên tệp chưa được tải xuống. Hãy áp dụng hoặc xóa chúng trong trình chỉnh sửa rồi thử lại.", + "Spacing": "Khoảng cách", + "Split PDF": "Chia PDF", + "Split by Bookmarks": "Chia theo Bookmark", + "Split pages into tile grid for poster printing": "Chia trang thành lưới ô để in poster", + "Split pages vertically or horizontally": "Chia trang theo chiều dọc hoặc chiều ngang", + "Splitting PDF pages...": "Đang chia các trang PDF...", + "Splitting PDF...": "Đang chia PDF...", + "Spreadsheets": "Bảng tính", + "Standard (192 DPI)": "Tiêu chuẩn (192 DPI)", + "Standard Size": "Khổ chuẩn", + "Standardize all pages to a target size": "Chuẩn hóa tất cả trang về một khổ mục tiêu", + "Standardizing pages...": "Đang chuẩn hóa trang...", + "Stitch all pages into one continuous page": "Ghép tất cả trang thành một trang liên tục", + "Straighten skewed PDF pages": "Chỉnh thẳng các trang PDF bị nghiêng", + "Strip all annotations": "Loại bỏ tất cả ghi chú", + "Style": "Kiểu", + "Style Changed": "Đã đổi kiểu", + "Style changed ({{length}} regions)": "Đã đổi kiểu ({{length}} vùng)", + "Subject": "Chủ đề", + "Subset embedded fonts": "Tập con phông chữ nhúng", + "Success": "Thành công", + "Success!": "Thành công!", + "Successfully converted {{length}} CSV file(s) to PDF.": "Đã chuyển đổi {{length}} tệp CSV sang PDF thành công.", + "Successfully converted {{length}} Excel file(s) to PDF.": "Đã chuyển đổi {{length}} tệp Excel sang PDF thành công.", + "Successfully converted {{length}} ODT file(s) to PDF.": "Đã chuyển đổi {{length}} tệp ODT sang PDF thành công.", + "Successfully converted {{length}} PDF(s) to DOCX.": "Đã chuyển đổi {{length}} PDF sang DOCX thành công.", + "Successfully converted {{length}} PDF(s) to Markdown.": "Đã chuyển đổi {{length}} PDF sang Markdown thành công.", + "Successfully converted {{length}} PDF(s) to {{level}}.": "Đã chuyển đổi {{length}} PDF sang {{level}} thành công.", + "Successfully converted {{length}} PSD files to a single PDF.": "Đã chuyển đổi {{length}} tệp PSD thành một PDF duy nhất.", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "Đã chuyển đổi {{length}} tệp PowerPoint sang PDF thành công.", + "Successfully converted {{length}} RTF file(s) to PDF.": "Đã chuyển đổi {{length}} tệp RTF sang PDF thành công.", + "Successfully converted {{length}} Word document(s) to PDF.": "Đã chuyển đổi {{length}} tài liệu Word sang PDF thành công.", + "Successfully converted {{length}} files to PDF.": "Đã chuyển đổi {{length}} tệp sang PDF thành công.", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "Đã chuyển đổi {{length}} tệp {{TOOL_NAME}} sang PDF thành công.", + "Successfully converted {{name}} to DOCX.": "Đã chuyển đổi {{name}} sang DOCX thành công.", + "Successfully converted {{name}} to Markdown.": "Đã chuyển đổi {{name}} sang Markdown thành công.", + "Successfully converted {{name}} to PDF.": "Đã chuyển đổi {{name}} sang PDF thành công.", + "Successfully converted {{name}} to {{level}}.": "Đã chuyển đổi {{name}} sang {{level}} thành công.", + "Successfully extracted PDF for AI/LLM use.": "Đã trích xuất PDF thành công để dùng cho AI/LLM.", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "Đã trích xuất {{completed}} PDF thành công để dùng cho AI/LLM.", + "Successfully rasterized PDF at {{dpi}} DPI.": "Đã rasterize PDF thành công ở {{dpi}} DPI.", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "Đã rasterize {{completed}} PDF thành công ở {{dpi}} DPI.", + "Supported: CBZ, CBR": "Hỗ trợ: CBZ, CBR", + "Supported: DOC, DOCX, ODT, RTF": "Hỗ trợ: DOC, DOCX, ODT, RTF", + "Supported: EML, MSG": "Hỗ trợ: EML, MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "Hỗ trợ: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2", + "Supported: PPT, PPTX, ODP": "Hỗ trợ: PPT, PPTX, ODP", + "Supported: VSD, VSDX": "Hỗ trợ: VSD, VSDX", + "Supported: XLSX, XLS, ODS, CSV": "Hỗ trợ: XLSX, XLS, ODS, CSV", + "Supported: XPS, OXPS": "Hỗ trợ: XPS, OXPS", + "Switches apps": "Chuyển đổi giữa các ứng dụng", + "Switches tabs": "Chuyển đổi giữa các tab", + "Table of Contents": "Mục lục", + "Table {{n}} (Page {{page}})": "Bảng {{n}} (Trang {{page}})", + "Tabloid": "Tabloid", + "Target Field": "Trường đích", + "Target Kilobytes": "Kilobyte mục tiêu", + "Target Not Reached": "Chưa đạt mục tiêu", + "Target Size": "Dung lượng mục tiêu", + "Technical Details": "Chi tiết kỹ thuật", + "Temperature": "Nhiệt độ màu", + "Template \"{{name}}\" loaded.": "Đã tải mẫu \"{{name}}\".", + "Template \"{{name}}\" saved.": "Đã lưu mẫu \"{{name}}\".", + "Text": "Văn bản", + "Text Color": "Màu văn bản", + "Text Files": "Tệp văn bản", + "Text color changed successfully!": "Đã đổi màu văn bản thành công!", + "Text converted to PDF successfully!": "Đã chuyển đổi văn bản sang PDF thành công!", + "Text extracted successfully!": "Đã trích xuất văn bản thành công!", + "Text to PDF": "Văn bản sang PDF", + "That password did not open any of the remaining files.": "Mật khẩu đó không mở được tệp nào trong số các tệp còn lại.", + "The PDF file(s) do not contain any attachments to extract.": "Các tệp PDF không chứa tệp đính kèm nào để trích xuất.", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "PDF có {{totalPages}} trang, không chia hết cho {{nValue}}. PDF cuối cùng sẽ chứa {{remainder}} trang.", + "The PDF might be corrupted or password protected.": "PDF có thể bị hỏng hoặc được bảo vệ bằng mật khẩu.", + "The PDF might be corrupted or password-protected.": "PDF có thể bị hỏng hoặc được bảo vệ bằng mật khẩu.", + "The PDF might be corrupted.": "PDF có thể bị hỏng.", + "The PDF viewer is still initializing.": "Trình xem PDF vẫn đang khởi tạo.", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF đã được tải xuống, nhưng không thể hoàn tất các bước sau: {{join}}. Nội dung mà các bước đó xử lý có thể vẫn còn trong tệp.", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "URL trả về loại nội dung không mong đợi: {{contentType}}. Cần một tệp JavaScript.", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "Các byte bị /ByteRange loại trừ không phải là chữ ký mã hóa hex chính xác", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "Các byte bị /ByteRange loại trừ không phải là /Contents của chữ ký này", + "The compression engine returned an unreadable result.": "Công cụ nén trả về kết quả không đọc được.", + "The compression engine stopped unexpectedly.": "Công cụ nén dừng đột ngột.", + "The current password you entered is incorrect. Please try again.": "Mật khẩu hiện tại bạn nhập không đúng. Vui lòng thử lại.", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "Các tên trường sau đã tồn tại trong PDF đã tải lên: {{conflictList}}. Hãy đổi tên các trường này trước khi tải xuống.", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "Các tên trường sau được dùng nhiều lần: {{duplicateList}}. Hãy đổi tên các trường này thành tên duy nhất trước khi tải xuống.", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "Số trang đã chỉ định ({{length}}) không khớp với số trang hiện tại trong tài liệu ({{currentGridCount}}). Vui lòng cung cấp thứ tự đầy đủ cho tất cả trang.", + "The password you entered is incorrect. Please try again.": "Mật khẩu bạn nhập không đúng. Vui lòng thử lại.", + "The password you entered is wrong or the file is corrupted.": "Mật khẩu bạn nhập sai hoặc tệp bị hỏng.", + "The provided file could not be loaded as an image. It may be corrupted.": "Không thể tải tệp đã cung cấp dưới dạng hình ảnh. Tệp có thể bị hỏng.", + "The requested OCR language is not available: {{unavailableText}}.": "Ngôn ngữ OCR được yêu cầu không có sẵn: {{unavailableText}}.", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "Thứ tự trang đã chỉ định chưa đầy đủ hoặc có số trang không hợp lệ. Hãy đảm bảo bạn cung cấp vị trí mới cho mọi trang gốc.", + "These files are not valid PDFs, so they were not added: {{names}}.": "Các tệp này không phải PDF hợp lệ nên chưa được thêm: {{names}}.", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "Các tệp này được bảo vệ bằng mật khẩu: {{names}}. Hãy nhập mật khẩu trên thẻ tệp, hoặc xóa chúng, rồi nén lại.", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "Bản dựng BentoPDF này chỉ đi kèm dữ liệu OCR cho {{availableText}}.", + "This PDF does not contain any digital signatures.": "PDF này không chứa chữ ký số nào.", + "This PDF has no layers (OCG).": "PDF này không có lớp nào (OCG).", + "This PDF is password-protected. Please enter the current password to proceed.": "PDF này được bảo vệ bằng mật khẩu. Vui lòng nhập mật khẩu hiện tại để tiếp tục.", + "This document contains pages with different dimensions:": "Tài liệu này có các trang với kích thước khác nhau:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Tài liệu này có 1 dấu che thông tin chưa được áp dụng. Khi dấu chưa được áp dụng, nội dung bên dưới vẫn còn trong tệp. Áp dụng tất cả các dấu và tải xuống?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "Tài liệu này có {{count}} dấu che thông tin chưa được áp dụng. Khi dấu chưa được áp dụng, nội dung bên dưới vẫn còn trong tệp. Áp dụng tất cả các dấu và tải xuống?", + "This feature requires {{name}} to be configured.": "Tính năng này cần {{name}} được cấu hình.", + "This file is not a valid PDF.": "Tệp này không phải PDF hợp lệ.", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "Mô-đun này được cấp phép theo AGPL-3.0. Khi cấu hình, bạn đồng ý với các điều khoản giấy phép của mô-đun.", + "This tool has been disabled": "Công cụ này đã bị tắt", + "This tool is not available in your deployment. Contact your administrator for more information.": "Công cụ này không có trong bản triển khai của bạn. Hãy liên hệ quản trị viên để biết thêm thông tin.", + "Threshold": "Ngưỡng", + "Tile": "Lát", + "Tile Gap X": "Khoảng cách lát X", + "Tile Gap Y": "Khoảng cách lát Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "Dấu thời gian", + "Timestamp Failed": "Đóng dấu thời gian không thành công", + "Tint": "Sắc thái", + "Title": "Tiêu đề", + "To actually fill or change the options, use our PDF Form Filler tool.": "Để điền hoặc thay đổi các tùy chọn, hãy dùng công cụ Điền form PDF của chúng tôi.", + "Toggle": "Bật/tắt", + "Toggle style": "Bật/tắt kiểu", + "Toggle sync scroll": "Bật/tắt cuộn đồng bộ", + "Tool Unavailable": "Công cụ không khả dụng", + "Tooltip / Help Text": "Chú giải / Văn bản trợ giúp", + "Top": "Trên", + "Top Center": "Giữa trên", + "Top Left": "Trên trái", + "Top Right": "Trên phải", + "Top edge in points": "Cạnh trên (tính bằng point)", + "Total Pages": "Tổng số trang", + "Transparent Background": "Nền trong suốt", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "Thử JPEG 2000 so với JPEG cho từng hình ảnh và giữ bản nhỏ hơn.", + "Trim margins from all pages": "Cắt lề của tất cả trang", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "Xác minh độ tin cậy: {{trustVerified}}/{{length}} chữ ký đã được xác minh bằng chứng chỉ tùy chỉnh", + "Trusted": "Đáng tin cậy", + "Trusted certificate loaded": "Đã tải chứng chỉ tin cậy", + "Tsa Url": "URL TSA", + "Turns off quality, resolution and every other lossy image step.": "Tắt chất lượng, độ phân giải và mọi bước xử lý hình ảnh có mất dữ liệu khác.", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL phải bắt đầu bằng http:// hoặc https://", + "Ultra (384 DPI)": "Siêu cao (384 DPI)", + "Unable to decrypt the PDF with the provided password.": "Không thể giải mã PDF bằng mật khẩu đã cung cấp.", + "Unable to repair any of the uploaded PDF files.": "Không thể sửa chữa tệp PDF nào trong số các tệp đã tải lên.", + "Unembed standard fonts": "Bỏ nhúng phông chữ chuẩn", + "Unembed standard-font look-alikes": "Bỏ nhúng phông chữ giống phông chuẩn", + "Unexpected delimiter in content stream": "Dấu phân cách không mong đợi trong content stream", + "Unexpected reply from the engine.": "Phản hồi không mong đợi từ công cụ.", + "Uniform": "Đồng nhất", + "Unique Page Sizes": "Số khổ trang khác nhau", + "Unknown": "Không xác định", + "Unknown error": "Lỗi không xác định", + "Unknown error occurred in worker.": "Đã xảy ra lỗi không xác định trong worker.", + "Unknown error occurred.": "Đã xảy ra lỗi không xác định.", + "Unlock": "Mở khóa", + "Unlock All": "Mở khóa tất cả", + "Unlock Remaining ({{remaining}})": "Mở khóa phần còn lại ({{remaining}})", + "Unlocked": "Đã mở khóa", + "Unlocked {{unlocked}} of {{length}} files.": "Đã mở khóa {{unlocked}} trên {{length}} tệp.", + "Unlocking...": "Đang mở khóa...", + "Unresolved optional content reference": "Tham chiếu nội dung tùy chọn chưa được giải quyết", + "Unsupported ECDSA curve in signer certificate": "Đường cong ECDSA không được hỗ trợ trong chứng chỉ của người ký", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "Hình ảnh không được hỗ trợ. Vui lòng dùng PNG hoặc JPG cho Watermark.", + "Unsupported digest OID {{digestOid}}": "Digest OID không được hỗ trợ {{digestOid}}", + "Unsupported file type: .{{ext}}": "Loại tệp không được hỗ trợ: .{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "Thuật toán chữ ký OID không được hỗ trợ {{oid}}", + "Unterminated array or dictionary in content stream": "Mảng hoặc dictionary chưa kết thúc trong content stream", + "Unterminated hex string in content stream": "Chuỗi hex chưa kết thúc trong content stream", + "Unterminated inline image in content stream": "Hình ảnh nội tuyến chưa kết thúc trong content stream", + "Unterminated string in content stream": "Chuỗi chưa kết thúc trong content stream", + "Unverified: Unsupported Signature Algorithm": "Chưa xác minh: Thuật toán chữ ký không được hỗ trợ", + "Updating metadata...": "Đang cập nhật metadata...", + "Upload Certificate": "Tải chứng chỉ lên", + "Upload Comics": "Tải truyện tranh lên", + "Upload Documents": "Tải tài liệu lên", + "Upload EPUB Files": "Tải tệp EPUB lên", + "Upload Email Files": "Tải tệp email lên", + "Upload FB2 Files": "Tải tệp FB2 lên", + "Upload Images": "Tải hình ảnh lên", + "Upload JSON Files": "Tải tệp JSON lên", + "Upload MOBI Files": "Tải tệp MOBI lên", + "Upload Markdown Files": "Tải tệp Markdown lên", + "Upload ODG Files": "Tải tệp ODG lên", + "Upload PDFs": "Tải PDF lên", + "Upload PUB Files": "Tải tệp PUB lên", + "Upload Pages Files": "Tải tệp Pages lên", + "Upload Presentations": "Tải bản trình bày lên", + "Upload SVG Files": "Tải tệp SVG lên", + "Upload Spreadsheets": "Tải bảng tính lên", + "Upload Text Files": "Tải tệp văn bản lên", + "Upload Visio Files": "Tải tệp Visio lên", + "Upload WPD Files": "Tải tệp WPD lên", + "Upload WPS Files": "Tải tệp WPS lên", + "Upload XML Files": "Tải tệp XML lên", + "Upload XPS Files": "Tải tệp XPS lên", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "Tải PDF lên và nhấp \"Tạo bản xem trước\" để xem bố cục sách nhỏ", + "Upload images and convert to PDF": "Tải hình ảnh lên và chuyển đổi sang PDF", + "Upload one or more PDF files": "Tải lên một hoặc nhiều tệp PDF", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "Chữ hoa A-Z, chữ số 0-9 và - . $ / + % KHOẢNG TRẮNG", + "Use same password for all files": "Dùng cùng một mật khẩu cho tất cả tệp", + "User Password": "Mật khẩu người dùng", + "VSD to PDF": "VSD sang PDF", + "Valid From": "Có hiệu lực từ", + "Valid Signature": "Chữ ký hợp lệ", + "Valid Until": "Có hiệu lực đến", + "Validating {{n}} of {{length}}: {{name}}": "Đang xác minh {{n}} trên {{length}}: {{name}}", + "Validating...": "Đang xác minh...", + "Value": "Giá trị", + "Value (e.g., Marketing)": "Giá trị (ví dụ: Marketing)", + "Vertical": "Dọc", + "Viewer not ready": "Trình xem chưa sẵn sàng", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "Trình xem chưa sẵn sàng. Vui lòng tải PDF lên và chờ tải xong.", + "Visibility": "Hiển thị", + "Visio Files": "Tệp Visio", + "WPD to PDF": "WPD sang PDF", + "WPS Files": "Tệp WPS", + "WPS to PDF": "WPS sang PDF", + "Watermark": "Hình mờ", + "Watermark added successfully!": "Đã thêm Watermark thành công!", + "Web Crypto API not available in this context": "Web Crypto API không khả dụng trong ngữ cảnh này", + "Web Crypto import/verify failed: {{error}}": "Nhập/xác minh Web Crypto không thành công: {{error}}", + "WebP": "WebP", + "Whitelist": "Danh sách cho phép", + "Width ({{unit}})": "Chiều rộng ({{unit}})", + "Word": "Word", + "Word Documents": "Tài liệu Word", + "Word to PDF": "Word sang PDF", + "WordPerfect Files": "Tệp WordPerfect", + "Worker crashed": "Worker bị sập", + "Worker error occurred. Check console for details.": "Đã xảy ra lỗi worker. Hãy xem chi tiết trong console.", + "Workflow completed": "Quy trình đã hoàn tất", + "Wrong password": "Sai mật khẩu", + "Wrong password for: {{join}}": "Sai mật khẩu cho: {{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "Sai mật khẩu hoặc không thể giải mã \"{{name}}\".", + "X Position": "Vị trí X", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "Tệp XML", + "XML to PDF": "XML sang PDF", + "XMP Metadata": "Metadata XMP", + "XPS Files": "Tệp XPS", + "XPS to PDF": "XPS sang PDF", + "Y Position": "Vị trí Y", + "Year must be between 1900 and 2100": "Năm phải nằm trong khoảng từ 1900 đến 2100", + "Yellow": "Vàng", + "Yellowish": "Hơi vàng", + "You cannot delete the last page of the document.": "Bạn không thể xóa trang cuối cùng của tài liệu.", + "Your PDF has been cropped and the download has started.": "PDF của bạn đã được cắt và quá trình tải xuống đã bắt đầu.", + "Your PDF has been downloaded successfully.": "PDF của bạn đã được tải xuống thành công.", + "Your PDF has been posterized.": "PDF của bạn đã được posterize.", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "Các vùng che của bạn đã được áp dụng lên trang, nhưng tệp này được mã hóa nên BentoPDF không thể xóa thêm các bản sao của văn bản đã che khỏi thuộc tính, Bookmark và tệp đính kèm. Để dọn sạch hoàn toàn, hãy che nội dung trên bản sao chưa mã hóa rồi thêm mật khẩu sau bằng Bảo vệ PDF. Vẫn tải xuống?", + "Your workflow needs at least one input node and one output node to run.": "Quy trình của bạn cần ít nhất một nút đầu vào và một nút đầu ra để chạy.", + "ZIP archive created successfully!": "Đã tạo kho lưu trữ ZIP thành công!", + "Zoom(%)": "Thu phóng (%)", + "e.g. dd/mm/yyyy HH:MM:ss": "ví dụ: dd/mm/yyyy HH:MM:ss", + "form": "biểu mẫu", + "https://example.com": "https://example.com", + "signature found": "chữ ký được tìm thấy", + "signatures found": "chữ ký được tìm thấy", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} nút", + "{{count}} nodes": "{{count}} nút", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 trang", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} trang", + "{{length}} Files Need a Password": "{{length}} tệp cần mật khẩu", + "{{length}} PDF file(s) selected": "Đã chọn {{length}} tệp PDF", + "{{length}} PDF files selected": "Đã chọn {{length}} tệp PDF", + "{{length}} attachment(s) extracted successfully!": "Đã trích xuất {{length}} tệp đính kèm thành công!", + "{{length}} file • {{totalPages}} total pages": "{{length}} tệp • tổng {{totalPages}} trang", + "{{length}} file(s) attached successfully.": "Đã đính kèm {{length}} tệp thành công.", + "{{length}} files • {{totalPages}} total pages": "{{length}} tệp • tổng {{totalPages}} trang", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} Tệp này từng được bảo vệ bằng mật khẩu nên bản đã nén không có mật khẩu. Hãy dùng Bảo vệ PDF để thêm lại.", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}} ({{size}}, {{totalPageCount}} trang)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} đã được ký số nên được giữ nguyên. Nén tệp sẽ làm hỏng chữ ký. Để vẫn nén, hãy bật Ghi đè bảo vệ nội dung trong Cài đặt tùy chỉnh; chữ ký của tệp sẽ bị xóa.", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} không phải PDF hợp lệ nên chưa được thêm.", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} được bảo vệ bằng mật khẩu. Hãy nhập mật khẩu trên thẻ tệp rồi nén lại.", + "{{name}}... (p{{pageNumber}})": "{{name}}... (tr.{{pageNumber}})", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • Không thể tải số trang", + "{{size}} • Loading pages...": "{{size}} • Đang tải trang...", + "{{size}} • Loading...": "{{size}} • Đang tải...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} trang", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} trang", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} trang", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} trang", + "{{size}} • {{value}} pages": "{{size}} • {{value}} trang", + "{{successCount}} PDF(s) decrypted successfully.": "Đã giải mã {{successCount}} PDF thành công.", + "{{successCount}} PDF(s) linearized successfully.": "Đã tuyến tính hóa {{successCount}} PDF thành công.", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} trang → {{numSheets}} tờ đầu ra", + "{{validCount}} valid": "{{validCount}} hợp lệ", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}: 1 trang", + "• {{label}}: {{count}} pages": "• {{label}}: {{count}} trang" +} diff --git a/public/locales/zh-TW/common.json b/public/locales/zh-TW/common.json index b8650e47..bb801162 100644 --- a/public/locales/zh-TW/common.json +++ b/public/locales/zh-TW/common.json @@ -9,7 +9,8 @@ "openMainMenu": "開啟主選單", "language": "語言", "searchLanguage": "搜尋語言…", - "noLanguagesFound": "找不到語言" + "noLanguagesFound": "找不到語言", + "breadcrumb": "導覽路徑" }, "donation": { "message": "喜歡 BentoPDF 嗎?請協助我們繼續免費提供 BentoPDF,並維持原始碼開放!", @@ -236,6 +237,10 @@ "aboutUs": "關於我們", "faqLink": "常見問題", "contactUs": "聯絡我們", + "tools": "工具", + "pdfConverter": "PDF 轉換器", + "pdfSecurity": "PDF 安全", + "mergeSplit": "合併與分割 PDF", "legal": "法律聲明", "termsAndConditions": "服務條款", "privacyPolicy": "隱私權政策", diff --git a/public/locales/zh-TW/tools.json b/public/locales/zh-TW/tools.json index 34178de7..13a9bed4 100644 --- a/public/locales/zh-TW/tools.json +++ b/public/locales/zh-TW/tools.json @@ -27,7 +27,22 @@ "name": "合併 PDF", "subtitle": "將多個 PDF 合併為一個檔案。保留書籤。", "retainPageLabels": "保留每個檔案的原始頁面標籤", - "retainPageLabelsHint": "關閉(預設):合併後的 PDF 使用自然頁碼 1–N。開啟:保留每個檔案的原始頁面標籤(可能產生重複的標籤)。" + "retainPageLabelsHint": "關閉(預設):合併後的 PDF 使用自然頁碼 1–N。開啟:保留每個檔案的原始頁面標籤(可能產生重複的標籤)。", + "removeDuplicateFonts": "移除重複字型", + "alert": { + "thumbnailError": "無法轉譯頁面縮圖", + "noSelection": "未選取要合併的檔案或頁面。", + "mergeSuccess": "PDF 合併成功!", + "mergeFailed": "PDF 合併失敗。", + "mergeError": "PDF 合併失敗。請確認所有檔案皆有效且未受密碼保護。", + "workerError": "合併程序發生未預期的錯誤。", + "loadError": "無法載入一個或多個 PDF 檔案" + }, + "loader": { + "renderingPreviews": "正在轉譯頁面預覽...", + "merging": "正在合併 PDF...", + "loadingDocuments": "正在載入 PDF 文件..." + } }, "splitPdf": { "name": "分割 PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "重做 (⇧⌘Z)", "tipFileDetails": "檔案詳細資料", "tipEditExistingContent": "編輯現有內容", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "編輯工具的作用範圍——在內容密集的頁面上縮小範圍", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "編輯工具的作用範圍:在內容密集的頁面上縮小範圍", "tipClickThePageToAddATextBox": "點擊頁面以加入文字方塊", "tipSpellCheckLanguage": "拼字檢查語言", "tipFindAndReplace": "尋找與取代", @@ -503,7 +518,8 @@ "noFile": "沒有檔案", "noFileExplanation": "請先上傳 PDF 檔案。", "conversionSuccess": "PDF 已成功轉換為 TIFF!", - "conversionError": "無法將 PDF 轉換為 TIFF。檔案可能已損壞。" + "conversionError": "無法將 PDF 轉換為 TIFF。檔案可能已損壞。", + "conversionOutOfMemory": "轉換時瀏覽器記憶體不足。請嘗試降低 DPI,或取消勾選多頁 TIFF 選項以逐頁轉換。" } }, "pdfToCbz": { @@ -1188,7 +1204,7 @@ "workerError": "Worker 錯誤:{{message}}", "alternateMergeWorkerError": "交替合併 Worker 錯誤:{{message}}", "noPdfFilesUploaded": "PDF 輸入節點中未上傳 PDF 檔案", - "failedToLoadFile": "無法載入「{{file}}」— 檔案可能已損毀", + "failedToLoadFile": "無法載入「{{file}}」,檔案可能已損毀", "noImagesUploaded": "影像輸入節點中未上傳影像", "noWordDocsUploaded": "Word 輸入節點中未上傳文件", "noExcelUploaded": "Excel 輸入節點中未上傳試算表", @@ -1301,11 +1317,11 @@ "faqPrivacyAnswer": "當然!所有處理都在您的瀏覽器中進行。您的檔案永遠不會離開您的裝置,確保完全隱私。" }, "unlockPdf": { - "name": "解密 PDF", + "name": "解除鎖定 PDF", "subtitle": "透過移除密碼保護解鎖 PDF。" }, "protectPdf": { - "name": "加密 PDF", + "name": "保護 PDF", "subtitle": "透過新增密碼為您的 PDF 上鎖。" } } diff --git a/public/locales/zh-TW/ui.json b/public/locales/zh-TW/ui.json new file mode 100644 index 00000000..4309b034 --- /dev/null +++ b/public/locales/zh-TW/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(已修正)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "另有 {{n}} 項...", + "- Error parsing XMP XML. Displaying raw. -": "- 解析 XMP XML 時發生錯誤,顯示原始內容 -", + "- No Info Dictionary data found -": "- 找不到資訊字典資料 -", + "- No XMP metadata found -": "- 找不到 XMP 中繼資料 -", + "- No interactive form fields found -": "- 找不到互動式表單欄位 -", + "- No parseable XMP properties found -": "- 找不到可解析的 XMP 屬性 -", + "-- Select existing group --": "-- 選擇現有群組 --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1°(非常靈敏)", + "0.5° (Default)": "0.5°(預設)", + "1.0° (Normal)": "1.0°(一般)", + "100 (Fast)": "100(快速)", + "150 (Default)": "150(預設)", + "1x2 (Booklet)": "1x2(小冊子)", + "2.0° (Less Sensitive)": "2.0°(較不靈敏)", + "200 (Better)": "200(較佳)", + "200 (Good)": "200(良好)", + "2x2 (4-up)": "2x2(4 合 1)", + "2x4 (8-up)": "2x4(8 合 1)", + "300 (Best Quality)": "300(最佳品質)", + "300 (Print)": "300(列印)", + "4x4 (16-up)": "4x4(16 合 1)", + "600 (High Quality)": "600(高品質)", + "72 (Screen)": "72(螢幕)", + "90° Clockwise": "順時針 90°", + "90° Counter-clockwise": "逆時針 90°", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "名為「{{fieldName}}」的欄位已存在。請先重新命名此欄位,使用不重複的名稱後再下載。", + "A new version of BentoPDF is available. Reload to update?": "BentoPDF 有新版本。要重新載入以更新嗎?", + "A single PDF file": "單一 PDF 檔案", + "A template with this name already exists.": "已有同名的範本。", + "ASCII characters (letters, numbers, symbols)": "ASCII 字元(字母、數字、符號)", + "Action": "動作", + "Add Blank Page": "新增空白頁", + "Add Bookmark": "新增書籤", + "Add Child Bookmark": "新增子書籤", + "Add Child Layer": "新增子圖層", + "Add More Comics": "新增更多漫畫", + "Add More Documents": "新增更多文件", + "Add More EPUB Files": "新增更多 EPUB 檔案", + "Add More Email Files": "新增更多電子郵件檔案", + "Add More FB2 Files": "新增更多 FB2 檔案", + "Add More Files": "新增更多檔案", + "Add More Images": "新增更多圖片", + "Add More JSON Files": "新增更多 JSON 檔案", + "Add More MOBI Files": "新增更多 MOBI 檔案", + "Add More Markdown Files": "新增更多 Markdown 檔案", + "Add More ODG Files": "新增更多 ODG 檔案", + "Add More PUB Files": "新增更多 PUB 檔案", + "Add More Pages Files": "新增更多 Pages 檔案", + "Add More Presentations": "新增更多簡報", + "Add More SVG Files": "新增更多 SVG 檔案", + "Add More Spreadsheets": "新增更多試算表", + "Add More Text Files": "新增更多文字檔案", + "Add More Visio Files": "新增更多 Visio 檔案", + "Add More WPD Files": "新增更多 WPD 檔案", + "Add More WPS Files": "新增更多 WPS 檔案", + "Add More XML Files": "新增更多 XML 檔案", + "Add More XPS Files": "新增更多 XPS 檔案", + "Add a new layer to get started!": "新增圖層即可開始!", + "Add a text box": "新增文字方塊", + "Add an RFC 3161 document timestamp": "新增 RFC 3161 文件時間戳記", + "Add an image": "新增圖片", + "Add at least one node to run the workflow.": "請至少新增一個節點才能執行工作流程。", + "Add child": "新增子項目", + "Add child layer": "新增子圖層", + "Add header and footer text": "新增頁首與頁尾文字", + "Add page numbers": "新增頁碼", + "Add searchable text layer via OCR": "透過 OCR 新增可搜尋的文字層", + "Add text watermark": "新增文字浮水印", + "Add/Edit/Extract Attachments": "新增/編輯/擷取附件", + "Added": "已新增", + "Added \"{{afterText}}\"": "已新增「{{afterText}}」", + "Added image ({{width}}×{{height}})": "已新增圖片({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "已成功新增 {{insertCount}} 頁空白頁!", + "Added {{insertCount}} blank pages successfully!": "已成功新增 {{insertCount}} 頁空白頁!", + "Adding header & footer...": "正在新增頁首與頁尾...", + "Adding page numbers...": "正在新增頁碼...", + "Adding watermark...": "正在新增浮水印...", + "Adding {{insertCount}} blank page...": "正在新增 {{insertCount}} 頁空白頁...", + "Adding {{insertCount}} blank pages...": "正在新增 {{insertCount}} 頁空白頁...", + "Adding {{name}} ({{n}}/{{length}})...": "正在新增 {{name}}({{n}}/{{length}})...", + "Adjust Colors": "調整色彩", + "Adjust brightness, contrast, and colors": "調整亮度、對比與色彩", + "Advanced": "進階", + "Advanced Feature Required": "需要進階功能", + "Advanced Settings": "進階設定", + "After Page": "在頁面之後", + "After Page...": "在頁面之後...", + "Align Objects": "對齊物件", + "Alignment": "對齊方式", + "All": "全部", + "All files repaired successfully!": "所有檔案皆已成功修復!", + "Alternate Merge": "交替合併", + "Alternating and mixing pages...": "正在交替混合頁面...", + "Always resample to that resolution": "一律重新取樣至該解析度", + "An error occurred during compression. Error: {{error}}": "壓縮時發生錯誤。錯誤:{{error}}", + "An error occurred during conversion. Error: {{error}}": "轉換時發生錯誤。錯誤:{{error}}", + "An error occurred during conversion. Error: {{message}}": "轉換時發生錯誤。錯誤:{{message}}", + "An error occurred during cropping.": "裁切時發生錯誤。", + "An error occurred during extraction. Error: {{error}}": "擷取時發生錯誤。錯誤:{{error}}", + "An error occurred during rasterization. Error: {{error}}": "點陣化時發生錯誤。錯誤:{{error}}", + "An error occurred during sanitization: {{msg}}": "清理時發生錯誤:{{msg}}", + "An error occurred while combining pages.": "合併頁面時發生錯誤。", + "An error occurred while creating the N-Up PDF.": "建立 N-Up PDF 時發生錯誤。", + "An error occurred while creating the booklet.": "建立小冊子時發生錯誤。", + "An error occurred while dividing the PDF.": "分割 PDF 時發生錯誤。", + "An error occurred while mixing the PDFs.": "混合 PDF 時發生錯誤。", + "An error occurred while standardizing pages.": "統一頁面尺寸時發生錯誤。", + "An error occurred while trying to remove metadata.": "移除中繼資料時發生錯誤。", + "An error occurred: {{error}}": "發生錯誤:{{error}}", + "An error occurred: {{error}}.": "發生錯誤:{{error}}。", + "An owner password is required when setting permissions": "設定權限時必須提供擁有者密碼", + "An unexpected error occurred during the repair process.": "修復過程中發生未預期的錯誤。", + "An unexpected error occurred.": "發生未預期的錯誤。", + "Analyzing data structure...": "正在分析資料結構...", + "Analyzing full PDF metadata...": "正在分析完整的 PDF 中繼資料...", + "Analyzing signatures...": "正在分析簽章...", + "Angle": "角度", + "Annotations removed successfully!": "已成功移除註解!", + "Any text, URL, or data": "任何文字、網址或資料", + "Application": "應用程式", + "Apply a digital signature to PDF": "為 PDF 加上數位簽章", + "Apply and download": "套用並下載", + "Apply redactions?": "要套用遮蓋嗎?", + "Apply scanner simulation effect": "套用掃描器模擬效果", + "Applying Bates numbers...": "正在套用 Bates 編號...", + "Applying color adjustments...": "正在套用色彩調整...", + "Applying crop...": "正在套用裁切...", + "Applying redactions...": "正在套用遮蓋...", + "Applying rotations...": "正在套用旋轉...", + "Applying scanner effect...": "正在套用掃描器效果...", + "Applying timestamp...": "正在套用時間戳記...", + "Applying {{replace}}...": "正在套用 {{replace}}...", + "Archive contains an oversized image entry.": "壓縮檔含有過大的圖片項目。", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "壓縮檔內的圖片過多(上限 {{MAX_CBZ_PAGES}} 張)。", + "Archive is too large when decompressed.": "壓縮檔解壓縮後過大。", + "Are you sure you want to reset? All your work will be lost.": "確定要重設嗎?您所有的作業內容都將遺失。", + "Area (Coordinates)": "面積(座標)", + "Area ({{unit}}²)": "面積({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial、Times New Roman 與 Courier New 會對應到內建的對等字型。僅在安全時套用。", + "Arrange multiple pages per sheet": "將多個頁面排列在同一張紙上", + "Arrange pages for booklet printing": "排列頁面以進行小冊子列印", + "Aspect Ratio": "長寬比", + "At least one PDF document is required for export.": "匯出時至少需要一份 PDF 文件。", + "At least two valid PDFs are required.": "至少需要兩個有效的 PDF。", + "Attaching files to PDF...": "正在將檔案附加至 PDF...", + "Attachments updated successfully!": "附件已成功更新!", + "Author": "作者", + "Auto (Keep Original)": "自動(保持原樣)", + "Back": "背面", + "Back to Home": "回到首頁", + "Background Color": "背景色彩", + "Background color changed successfully!": "已成功變更背景色彩!", + "Barcode": "條碼", + "Barcode Format": "條碼格式", + "Barcode Value": "條碼內容", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "已成功套用 Bates 編號!({{batesStart}} 至 {{n}})", + "Beginning": "開頭", + "Binarize": "二值化", + "Blank Position": "空白頁位置", + "Blue": "藍色", + "Blur": "模糊", + "Bold": "粗體", + "Bold & Italic": "粗體與斜體", + "Booklet": "小冊子", + "Booklet created with {{numSheets}} sheets!": "已建立包含 {{numSheets}} 張紙的小冊子!", + "Bookmarks imported from JSON!": "已從 JSON 匯入書籤!", + "Bookmarks page": "書籤頁面", + "Border": "邊框", + "Border Color": "邊框色彩", + "Bottom": "底部", + "Bottom Center": "下方置中", + "Bottom Left": "左下", + "Bottom Right": "右下", + "Bottom edge in points": "下邊緣(單位為點)", + "Brightness": "亮度", + "Brotli and rasterizing were skipped to keep it PDF/A.": "為了維持 PDF/A,已略過 Brotli 與點陣化。", + "Brotli compression (PDF 2.0)": "Brotli 壓縮(PDF 2.0)", + "Browser Note:": "瀏覽器注意事項:", + "Building new PDF...": "正在建立新的 PDF...", + "Building page pairing model...": "正在建立頁面配對模型...", + "Button": "按鈕", + "ByteRange does not start at the beginning of the file": "ByteRange 並非從檔案開頭開始", + "ByteRange out of bounds": "ByteRange 超出範圍", + "CBZ to PDF": "CBZ 轉 PDF", + "CSV Loaded": "CSV 已載入", + "CSV file is empty": "CSV 檔案是空的", + "Cancel": "取消", + "Cannot Delete": "無法刪除", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "無法存取檢視器控制項。請使用上方 PDF 檢視器工具列中的下載按鈕。", + "Cannot delete all pages": "無法刪除所有頁面", + "Cannot delete all pages.": "無法刪除所有頁面。", + "Canvas context failed": "Canvas 內容建立失敗", + "Canvas context unavailable": "Canvas 內容無法使用", + "Canvas toBlob conversion failed.": "Canvas toBlob 轉換失敗。", + "Canvas toBlob failed": "Canvas toBlob 失敗", + "Center": "置中", + "Certificate (.pfx, .p12, .pem)": "憑證(.pfx、.p12、.pem)", + "Certificate Expired": "憑證已過期", + "Certificate Password": "憑證密碼", + "Certificate unlocked": "憑證已解鎖", + "Change Certificate": "變更憑證", + "Change background color": "變更背景色彩", + "Changing background color...": "正在變更背景色彩...", + "Changing text color...": "正在變更文字色彩...", + "Character": "字元", + "Checked State": "勾選狀態", + "Choose a valid page range.": "請選擇有效的頁面範圍。", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "請選擇內建的語言之一,或在 --ocr-languages 加入缺少的語言後重新建置離線封裝。", + "Cleanup": "清理", + "Click on PDF to Pick Location": "點選 PDF 以選取位置", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "請先點選上方按鈕,再點選 PDF 上您希望書籤跳轉到的位置", + "Click to Upload Image": "點選以上傳圖片", + "Clicking this field in the PDF will open a file picker to upload an image.": "在 PDF 中點選此欄位會開啟檔案選擇器,可上傳圖片。", + "Clip invisible parts of images": "裁掉圖片中看不見的部分", + "Close": "關閉", + "Close (Esc)": "關閉(Esc)", + "Close panel": "關閉面板", + "Closes tab": "關閉分頁", + "Closes window": "關閉視窗", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF(書籤與中繼資料)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "尚未設定 CoherentPDF。請在 WASM 設定中進行設定。", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF 產生了空的解密檔案。", + "CoherentPDF: not configured.": "CoherentPDF:尚未設定。", + "Color": "色彩", + "Color adjustments applied successfully!": "已成功套用色彩調整!", + "Colors inverted successfully!": "已成功反轉色彩!", + "Cols": "欄", + "Combine multiple PDFs into one": "將多個 PDF 合併為一個", + "Combine to Single Page": "合併為單頁", + "Combining pages...": "正在合併頁面...", + "Comic Archives": "漫畫壓縮檔", + "Comments and markup become part of the page. Form fields and links keep working.": "註解與標記會成為頁面的一部分。表單欄位與連結仍可使用。", + "Complete": "完成", + "Complete!": "完成!", + "Compress": "壓縮", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "已壓縮 {{compressedCount}} 個 PDF。總大小從 {{totalOriginalSize}} 縮減為 {{totalCompressedSize}}(節省 {{value}}%)。", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "已壓縮 {{compressedCount}} 個 PDF。總大小:{{totalCompressedSize}}。", + "Compressing multiple PDFs...": "正在壓縮多個 PDF...", + "Compressing to {{size}}...": "正在壓縮至 {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "正在壓縮 {{n}}/{{length}}:{{name}}...", + "Compressing...": "正在壓縮...", + "Compression Complete": "壓縮完成", + "Compression Finished": "壓縮完成", + "Compression Level": "壓縮等級", + "Configure": "設定", + "Confirm": "確認", + "Confirm Action": "確認動作", + "Conformance": "符合標準", + "Connected": "已連線", + "Contact Info": "聯絡資訊", + "Content": "內容", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "內容雜湊值與 messageDigest 屬性不符:PDF 在簽署後已被修改", + "Contrast": "對比", + "Conversion Complete": "轉換完成", + "Conversion Error": "轉換錯誤", + "Conversion engine ready!": "轉換引擎已就緒!", + "Conversion failed: could not create PDF/A definition": "轉換失敗:無法建立 PDF/A 定義", + "Convert Apple Pages documents to PDF": "將 Apple Pages 文件轉換為 PDF", + "Convert EPUB ebooks to PDF": "將 EPUB 電子書轉換為 PDF", + "Convert Excel spreadsheets to PDF": "將 Excel 試算表轉換為 PDF", + "Convert FB2 e-books to PDF": "將 FB2 電子書轉換為 PDF", + "Convert JSON files to PDF": "將 JSON 檔案轉換為 PDF", + "Convert MOBI e-books to PDF": "將 MOBI 電子書轉換為 PDF", + "Convert Markdown files to PDF": "將 Markdown 檔案轉換為 PDF", + "Convert Microsoft Publisher to PDF": "將 Microsoft Publisher 轉換為 PDF", + "Convert OpenDocument Graphics to PDF": "將 OpenDocument 圖形轉換為 PDF", + "Convert PDF pages to SVG": "將 PDF 頁面轉換為 SVG", + "Convert PDF pages to images (ZIP)": "將 PDF 頁面轉換為圖片(ZIP)", + "Convert PDF tables to CSV": "將 PDF 表格轉換為 CSV", + "Convert PDF tables to Excel": "將 PDF 表格轉換為 Excel", + "Convert PDF to Markdown text": "將 PDF 轉換為 Markdown 文字", + "Convert PDF to PDF/A for archiving": "將 PDF 轉換為 PDF/A 以供封存", + "Convert PDF to Word document": "將 PDF 轉換為 Word 文件", + "Convert PowerPoint presentations to PDF": "將 PowerPoint 簡報轉換為 PDF", + "Convert SVG files to PDF": "將 SVG 檔案轉換為 PDF", + "Convert To Grayscale": "轉換為灰階", + "Convert Visio diagrams (VSD/VSDX) to PDF": "將 Visio 圖表(VSD/VSDX)轉換為 PDF", + "Convert WPS Office documents to PDF": "將 WPS Office 文件轉換為 PDF", + "Convert Word documents to PDF": "將 Word 文件轉換為 PDF", + "Convert WordPerfect documents to PDF": "將 WordPerfect 文件轉換為 PDF", + "Convert XML documents to PDF": "將 XML 文件轉換為 PDF", + "Convert XPS/OXPS documents to PDF": "將 XPS/OXPS 文件轉換為 PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "將漫畫壓縮檔(CBZ/CBR)轉換為 PDF", + "Convert email files (.eml, .msg) to PDF": "將電子郵件檔案(.eml、.msg)轉換為 PDF", + "Convert fonts to vector outlines": "將字型轉換為向量外框", + "Convert plain text to PDF": "將純文字轉換為 PDF", + "Convert to grayscale": "轉換為灰階", + "Convert to greyscale": "轉換為灰階", + "Convert to image-based PDF": "轉換為圖片式 PDF", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "已將 {{length}} 個檔案(共 {{totalPages}} 頁)轉換為 SVG!", + "Converted {{pageCount}} pages to SVG!": "已將 {{pageCount}} 頁轉換為 SVG!", + "Converter not initialized": "轉換器尚未初始化", + "Converting BMP to PDF...": "正在將 BMP 轉換為 PDF...", + "Converting HEIC to PDF...": "正在將 HEIC 轉換為 PDF...", + "Converting TIFF to PDF...": "正在將 TIFF 轉換為 PDF...", + "Converting emails...": "正在轉換電子郵件...", + "Converting files...": "正在轉換檔案...", + "Converting fonts to outlines...": "正在將字型轉換為外框...", + "Converting images to PDF...": "正在將圖片轉換為 PDF...", + "Converting multiple PDFs to PDF/A...": "正在將多個 PDF 轉換為 PDF/A...", + "Converting multiple RTF files to PDF...": "正在將多個 RTF 檔案轉換為 PDF...", + "Converting multiple files...": "正在轉換多個檔案...", + "Converting page {{n}} of {{pageCount}}...": "正在轉換第 {{n}} 頁,共 {{pageCount}} 頁...", + "Converting to Markdown...": "正在轉換為 Markdown...", + "Converting to SVG...": "正在轉換為 SVG...", + "Converting to greyscale...": "正在轉換為灰階...", + "Converting to {{level}}...": "正在轉換為 {{level}}...", + "Converting {{name}}...": "正在轉換 {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "正在轉換 {{n}}/{{length}}:{{name}}...", + "Converting...": "正在轉換...", + "Copied": "已複製", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "無法存取已加戳記 PDF 的匯出功能。請改用檢視器工具列中的匯出 → PDF 按鈕。", + "Could not add blank page.": "無法新增空白頁。", + "Could not add blank pages.": "無法新增空白頁。", + "Could not add header or footer.": "無法新增頁首或頁尾。", + "Could not add page numbers.": "無法新增頁碼。", + "Could not add the watermark.": "無法新增浮水印。", + "Could not apply rotations.": "無法套用旋轉。", + "Could not change text color.": "無法變更文字色彩。", + "Could not change the background color.": "無法變更背景色彩。", + "Could not create ZIP archive.": "無法建立 ZIP 壓縮檔。", + "Could not create canvas context.": "無法建立 Canvas 內容。", + "Could not create comparison canvas context.": "無法建立比較用的 Canvas 內容。", + "Could not create offscreen comparison canvas.": "無法建立離屏比較 Canvas。", + "Could not create visual diff context.": "無法建立視覺差異內容。", + "Could not create visual diff overlay context.": "無法建立視覺差異疊加層內容。", + "Could not detect blank pages.": "無法偵測空白頁。", + "Could not display the page.": "無法顯示此頁面。", + "Could not export comparison PDF.": "無法匯出比較用 PDF。", + "Could not export the signed PDF. Please try again.": "無法匯出已簽署的 PDF。請再試一次。", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "無法匯出已加戳記的 PDF。請改用檢視器工具列中的匯出 → PDF 按鈕。", + "Could not extract signer public key": "無法擷取簽署者公開金鑰", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "在指定的網址找不到 {{testFile}}(HTTP {{status}})。請確認檔案存在。", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "無法完整分析此 PDF。檔案可能已損毀,或結構特殊。", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "無法產生預覽。檔案可能已損毀,或包含不支援的功能。錯誤:{{message}}", + "Could not get canvas context": "無法取得 Canvas 內容", + "Could not invert PDF colors.": "無法反轉 PDF 色彩。", + "Could not load PDF. It may be corrupt or password-protected.": "無法載入 PDF。檔案可能已損毀或受密碼保護。", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "無法載入 PDF。檔案可能無效、已損毀或受密碼保護。", + "Could not load the PDF engine. Please refresh the page and try again.": "無法載入 PDF 引擎。請重新整理頁面後再試一次。", + "Could not parse signer info": "無法解析簽署者資訊", + "Could not posterize the PDF.": "無法對 PDF 進行色調分離。", + "Could not process \"{{name}}\". The file may be corrupted.": "無法處理「{{name}}」。檔案可能已損毀。", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "無法進一步縮小檔案。原始大小:{{originalSize}},新大小:{{compressedSize}}。", + "Could not remove annotations.": "無法移除註解。", + "Could not remove blank pages.": "無法移除空白頁。", + "Could not remove leftover data from the PDF.": "無法移除 PDF 中的殘留資料。", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "無法從文件資料中移除已遮蓋的文字,因此未下載檔案。", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "無法反轉 PDF 頁面順序。請確認您的檔案是有效的 PDF。", + "Could not update metadata. Please check that date formats are correct.": "無法更新中繼資料。請確認日期格式是否正確。", + "Count": "數量", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "建立時間", + "Creating Booklet...": "正在建立小冊子...", + "Creating Excel file...": "正在建立 Excel 檔案...", + "Creating N-Up PDF...": "正在建立 N-Up PDF...", + "Creating PDF from JPGs...": "正在從 JPG 建立 PDF...", + "Creating PDF from SVG files...": "正在從 SVG 檔案建立 PDF...", + "Creating PDF...": "正在建立 PDF...", + "Creating ZIP archive...": "正在建立 ZIP 壓縮檔...", + "Creating ZIP file...": "正在建立 ZIP 檔案...", + "Creating ZIP...": "正在建立 ZIP...", + "Creating table...": "正在建立表格...", + "Creator": "建立者", + "Crop": "裁切", + "Crop complete! Your download has started.": "裁切完成!已開始下載。", + "Cryptographic verification failed": "密碼學驗證失敗", + "Custom": "自訂", + "Custom Format": "自訂格式", + "Custom Height": "自訂高度", + "Custom Units": "自訂單位", + "Custom Width": "自訂寬度", + "Custom Zoom": "自訂縮放", + "Custom...": "自訂...", + "DataMatrix": "DataMatrix", + "Date Format": "日期格式", + "Decrease size": "縮小", + "Decrypt": "解密", + "Decrypting PDF...": "正在解密 PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "正在解密 {{name}}({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "正在解密第 {{n}} 個,共 {{length}} 個:{{name}}", + "Decrypting...": "正在解密...", + "Decryption Failed": "解密失敗", + "Delete": "刪除", + "Delete \"{{title}}\"?": "要刪除「{{title}}」嗎?", + "Delete Field": "刪除欄位", + "Delete Page": "刪除頁面", + "Delete Pages": "刪除頁面", + "Delete all {{length}} bookmark(s) ? ": "要刪除全部 {{length}} 個書籤嗎?", + "Delete layer": "刪除圖層", + "Delete {{size}} bookmark(s) ? ": "要刪除 {{size}} 個書籤嗎?", + "Deleted": "已刪除", + "Deleted {{size}} page(s) successfully!": "已成功刪除 {{size}} 頁!", + "Deleting pages...": "正在刪除頁面...", + "Description": "描述", + "Description for screen readers": "供螢幕閱讀器使用的說明", + "Deselect All": "取消全選", + "Deskew": "校正傾斜", + "Deskew PDF": "校正 PDF 傾斜", + "Deskewed {{length}} file(s). {{value}}": "已校正 {{length}} 個檔案的傾斜。{{value}}", + "Deskewing {{name}}...": "正在校正 {{name}} 的傾斜...", + "Destination": "目的地", + "Detecting blank pages...": "正在偵測空白頁...", + "Digest Algorithm:": "摘要演算法:", + "Digital Sign": "數位簽署", + "Direction": "方向", + "Divide Pages": "分割頁面", + "Divide into boxes (0 to disable)": "分割成方框(0 為停用)", + "Document Properties": "文件屬性", + "Document Type": "文件類型", + "Document properties": "文件屬性", + "Document-level attachment": "文件層級附件", + "Done: back to tools": "完成,返回工具", + "Download": "下載", + "Download Edited PDF": "下載編輯後的 PDF", + "Download anyway": "仍要下載", + "Download as PDF or ZIP automatically": "自動以 PDF 或 ZIP 下載", + "Downloaded {{length}} PDF files in a ZIP archive.": "已將 {{length}} 個 PDF 檔案以 ZIP 壓縮檔下載。", + "Downloads started for all files.": "所有檔案皆已開始下載。", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "會移除標籤,而螢幕閱讀器需要標籤。", + "Duplicate Field Name": "欄位名稱重複", + "Duplicate Field Names": "欄位名稱重複", + "Duplicate Page": "複製頁面", + "Duplicate Page Numbers": "頁碼重複", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA 簽章無法以簽署者公開金鑰驗證", + "EPUB Files": "EPUB 檔案", + "EPUB to PDF": "EPUB 轉 PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ 轉 PDF", + "Edit": "編輯", + "Edit All": "全部編輯", + "Edit Bookmark": "編輯書籤", + "Edit Bookmarks": "編輯書籤", + "Edit Images": "編輯圖片", + "Edit Metadata": "編輯中繼資料", + "Edit PDF metadata": "編輯 PDF 中繼資料", + "Edit Scope": "編輯範圍", + "Edit Shapes": "編輯圖形", + "Edit Text": "編輯文字", + "Edit tool": "編輯工具", + "Edit {{scopes}}": "編輯{{scopes}}", + "Email Files": "電子郵件檔案", + "Email to PDF": "電子郵件轉 PDF", + "Embedding files into PDF...": "正在將檔案嵌入 PDF...", + "Empty signature bytes": "簽章位元組為空", + "Encrypt": "加密", + "Encrypt PDF with password": "以密碼加密 PDF", + "Encrypted file": "已加密的檔案", + "Encrypting PDF with 256-bit AES...": "正在以 256 位元 AES 加密 PDF...", + "Encryption Failed": "加密失敗", + "Encryption resulted in an empty file.": "加密後產生了空檔案。", + "End": "結尾", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "輸入 0 可插入至開頭,輸入 {{pageCount}} 可插入至結尾。", + "Enter bookmark title": "輸入書籤標題", + "Enter name for child layer under \"{{Layer}}\":": "請輸入「{{Layer}}」底下子圖層的名稱:", + "Enter password": "輸入密碼", + "Enter password...": "輸入密碼...", + "Enter passwords for each encrypted file": "請輸入每個加密檔案的密碼", + "Error": "錯誤", + "Error during execution": "執行時發生錯誤", + "Error generating PDF: {{error}}": "產生 PDF 時發生錯誤:{{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "載入 PDF 檔案時發生錯誤。請改用有效的 PDF 再試一次。", + "Error reading files: {{error}}": "讀取檔案時發生錯誤:{{error}}", + "Error saving PDF. Check console for details.": "儲存 PDF 時發生錯誤。詳細資訊請查看主控台。", + "Error: {{error}}": "錯誤:{{error}}", + "Exactly 11 or 12 digits": "必須剛好是 11 或 12 位數字", + "Exactly 12 or 13 digits": "必須剛好是 12 或 13 位數字", + "Example of current format:": "目前格式範例:", + "Excel to PDF": "Excel 轉 PDF", + "Existing Radio Groups": "現有的選項按鈕群組", + "Export Error": "匯出錯誤", + "Export Value": "匯出值", + "Export failed": "匯出失敗", + "External processing module needed": "需要外部處理模組", + "Extract Images": "擷取圖片", + "Extract Pages": "擷取頁面", + "Extract Tables": "擷取表格", + "Extract a range of pages": "擷取一段頁面範圍", + "Extract all images from PDF": "擷取 PDF 中的所有圖片", + "Extract pages as separate PDFs": "將頁面擷取為個別的 PDF", + "Extract text from PDF": "擷取 PDF 中的文字", + "Extracted 1 table successfully!": "已成功擷取 1 個表格!", + "Extracted text from {{length}} PDF files!": "已從 {{length}} 個 PDF 檔案擷取文字!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "已擷取 {{completed}} 個 PDF,失敗 {{failed}} 個。", + "Extracted {{length}} page(s) successfully!": "已成功擷取 {{length}} 頁!", + "Extracted {{length}} table(s) to Excel!": "已將 {{length}} 個表格擷取至 Excel!", + "Extracted {{length}} tables successfully!": "已成功擷取 {{length}} 個表格!", + "Extracting attachments from {{length}} file(s)...": "正在從 {{length}} 個檔案擷取附件...", + "Extracting images from {{name}}...": "正在從 {{name}} 擷取圖片...", + "Extracting pages...": "正在擷取頁面...", + "Extracting tables...": "正在擷取表格...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "正在從第 {{n}}/{{length}} 個檔案擷取文字:{{name}}...", + "Extracting text from multiple files...": "正在從多個檔案擷取文字...", + "Extracting text from {{name}}...": "正在從 {{name}} 擷取文字...", + "Extracting text...": "正在擷取文字...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "正在為 AI 擷取 {{name}}({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "正在為 AI 擷取 {{name}}...", + "Extracting...": "正在擷取...", + "Extraction Complete": "擷取完成", + "Extraction Error": "擷取錯誤", + "Extraction Partial": "部分擷取完成", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "擷取完成!ZIP 檔案中有 {{length}} 個附件({{totalSize}})。已開始下載。", + "FB2 Files": "FB2 檔案", + "FB2 to PDF": "FB2 轉 PDF", + "Failed": "失敗", + "Failed to acquire 2D canvas context": "無法取得 2D Canvas 內容", + "Failed to add child layer": "新增子圖層失敗", + "Failed to apply Bates numbers.": "套用 Bates 編號失敗。", + "Failed to apply color adjustments. The file might be corrupted.": "套用色彩調整失敗。檔案可能已損毀。", + "Failed to apply redactions.": "套用遮蓋失敗。", + "Failed to apply scanner effect. The file might be corrupted.": "套用掃描器效果失敗。檔案可能已損毀。", + "Failed to attach files: {{error}}": "附加檔案失敗:{{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "無法將 BMP 轉換為 PDF。其中一個檔案可能無效。", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "無法將 HEIC 轉換為 PDF。其中一個檔案可能無效。", + "Failed to convert PDF to CSV. {{message}}": "無法將 PDF 轉換為 CSV。{{message}}", + "Failed to convert PDF to Excel. {{message}}": "無法將 PDF 轉換為 Excel。{{message}}", + "Failed to convert PDF to SVG. {{message}}": "無法將 PDF 轉換為 SVG。{{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "無法將 PDF 轉換為灰階。檔案可能已損毀。", + "Failed to convert PDF. It may be image-based or corrupted.": "無法轉換 PDF。檔案可能是圖片式或已損毀。", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "無法將 TIFF 轉換為 PDF。其中一個檔案可能無效。", + "Failed to convert images to PDF.": "無法將圖片轉換為 PDF。", + "Failed to convert text to PDF. {{error}}": "無法將文字轉換為 PDF。{{error}}", + "Failed to convert {{filename}} to PNG": "無法將 {{filename}} 轉換為 PNG", + "Failed to copy metadata to clipboard.": "無法將中繼資料複製到剪貼簿。", + "Failed to create PDF.": "建立 PDF 失敗。", + "Failed to create PNG blob": "建立 PNG blob 失敗", + "Failed to create canvas context": "建立 Canvas 內容失敗", + "Failed to create split PDFs.": "建立分割後的 PDF 失敗。", + "Failed to decode image: {{name}}": "無法解碼圖片:{{name}}", + "Failed to decrypt private key": "無法解密私密金鑰", + "Failed to decrypt. Try the Decrypt tool instead.": "解密失敗。請改用解密工具。", + "Failed to delete layer": "刪除圖層失敗", + "Failed to delete pages.": "刪除頁面失敗。", + "Failed to deskew PDF: {{error}}": "校正 PDF 傾斜失敗:{{error}}", + "Failed to download the edited PDF.": "下載編輯後的 PDF 失敗。", + "Failed to edit attachments.": "編輯附件失敗。", + "Failed to extract certificate from PFX file": "無法從 PFX 檔案擷取憑證", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "擷取頁面失敗(qpdf 結束代碼 {{exitCode}})。", + "Failed to extract pages.": "擷取頁面失敗。", + "Failed to extract tables. {{message}}": "擷取表格失敗。{{message}}", + "Failed to extract text from PDF.": "無法從 PDF 擷取文字。", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "無法從 {{iccUrl}} 取得 ICC 設定檔:HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "無法取得字型檔案:{{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "無法取得 gs.js:HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "無法取得 {{url}}:HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "無法取得第 {{pageNumber}} 頁的 2D 內容", + "Failed to get canvas context": "無法取得 Canvas 內容", + "Failed to insert PDF. The file may be corrupted.": "插入 PDF 失敗。檔案可能已損毀。", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "無法從 {{normalizedUrl}} 載入 Ghostscript:{{msg}}", + "Failed to load PDF file.": "載入 PDF 檔案失敗。", + "Failed to load PDF for cropping.": "載入要裁切的 PDF 失敗。", + "Failed to load PDF for preview.": "載入 PDF 預覽失敗。", + "Failed to load PDF form viewer.": "載入 PDF 表單檢視器失敗。", + "Failed to load PDF layers": "載入 PDF 圖層失敗", + "Failed to load PyMuPDF from CDN: {{msg}}": "無法從 CDN 載入 PyMuPDF:{{msg}}", + "Failed to load SVG image": "載入 SVG 圖片失敗", + "Failed to load WebP image": "載入 WebP 圖片失敗", + "Failed to load attachments from PDF.": "無法從 PDF 載入附件。", + "Failed to load files: {{error}}": "載入檔案失敗:{{error}}", + "Failed to load image.": "載入圖片失敗。", + "Failed to load image: {{filename}}": "載入圖片失敗:{{filename}}", + "Failed to load one or more PDF files.": "載入一個或多個 PDF 檔案失敗。", + "Failed to load script: {{url}}": "載入指令碼失敗:{{url}}", + "Failed to load template.": "載入範本失敗。", + "Failed to load the PDF Editor.": "載入 PDF 編輯器失敗。", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "載入圖片處理器失敗。請確認您的瀏覽器支援 SharedArrayBuffer(需要 HTTPS 或 localhost)。", + "Failed to parse CSV: {{error}}": "解析 CSV 失敗:{{error}}", + "Failed to parse signature": "解析簽章失敗", + "Failed to parse the certificate file.": "解析憑證檔案失敗。", + "Failed to process HEIC file: {{name}}": "處理 HEIC 檔案失敗:{{name}}", + "Failed to process WebP file: {{name}}": "處理 WebP 檔案失敗:{{name}}", + "Failed to read file.": "讀取檔案失敗。", + "Failed to remove restrictions. The PDF may require the correct owner password.": "移除限制失敗。此 PDF 可能需要正確的擁有者密碼。", + "Failed to render page": "算繪頁面失敗", + "Failed to render page previews": "算繪頁面預覽失敗", + "Failed to render page previews.": "算繪頁面預覽失敗。", + "Failed to render page.": "算繪頁面失敗。", + "Failed to save changes.": "儲存變更失敗。", + "Failed to save the new PDF. Check console for details.": "儲存新 PDF 失敗。詳細資訊請查看主控台。", + "Failed to split PDF. Please check your selection.": "分割 PDF 失敗。請檢查您的選取內容。", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "為 PDF 加上時間戳記失敗:{{message}}\n\n請改用其他 TSA 伺服器,或檢查您的網路連線。", + "Failed to toggle layer visibility": "切換圖層可見度失敗", + "Failed to validate signatures. The file may be corrupted.": "驗證簽章失敗。檔案可能已損毀。", + "Features enabled by this module:": "此模組啟用的功能:", + "Field Name": "欄位名稱", + "Field Name (Group Name)": "欄位名稱(群組名稱)", + "Field Name Conflict": "欄位名稱衝突", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "欄位名稱「{{newName}}」已存在於此{{value}}。請改用不重複的名稱。", + "Field name cannot be empty": "欄位名稱不可為空白", + "File": "檔案", + "File Size": "檔案大小", + "File exists but could not be read. Check CORS configuration.": "檔案存在但無法讀取。請檢查 CORS 設定。", + "File list not found": "找不到檔案清單", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "檔案大小已從 {{originalSize}} 縮減為 {{compressedSize}}(節省 {{percent}}%)。", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "檔案 {{n}}/{{length}}:第 {{n2}}/{{pageCount}} 頁", + "File {{n}}/{{length}}: {{message}}": "檔案 {{n}}/{{length}}:{{message}}", + "Filename": "檔案名稱", + "Files that failed: {{errorCount}}.": "失敗的檔案:{{errorCount}} 個。", + "Fill (cover full target page)": "填滿(涵蓋整個目標頁面)", + "Fill Color": "填滿色彩", + "Finalizing PDF...": "正在完成 PDF...", + "Find & replace": "尋找與取代", + "Finds the best quality under this size. 0 means no target.": "在此大小內找出最佳品質。0 表示不設目標。", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox 與 Chrome 在選取時可能會顯示原生的日期選擇器格式。完成輸入日期後,就會套用正確的格式。", + "First Indent": "首行縮排", + "Fit (keep full page visible)": "符合(完整顯示整頁)", + "Fit Page": "符合頁面", + "Fix Page Size": "修正頁面尺寸", + "Flatten": "平面化", + "Flatten Forms": "平面化表單", + "Flatten annotations": "平面化註解", + "Flatten form fields": "平面化表單欄位", + "Flatten forms and annotations": "平面化表單與註解", + "Flatten links": "平面化連結", + "Flattening PDF...": "正在平面化 PDF...", + "Flattening and saving PDF...": "正在平面化並儲存 PDF...", + "Flattening multiple PDFs...": "正在平面化多個 PDF...", + "Flattening page {{i}} of {{totalPages}}...": "正在平面化第 {{i}} 頁,共 {{totalPages}} 頁...", + "Flattening {{n}}/{{length}}: {{name}}...": "正在平面化 {{n}}/{{length}}:{{name}}...", + "Focuses address bar": "聚焦網址列", + "Font": "字型", + "Font Color": "字型色彩", + "Font Family": "字型家族", + "Font Size": "字型大小", + "Font size: {{bSize}} → {{aSize}}": "字型大小:{{bSize}} → {{aSize}}", + "Font to Outline": "字型轉外框", + "Font: {{bFont}} → {{aFont}}": "字型:{{bFont}} → {{aFont}}", + "Fonts": "字型", + "Footer Center": "頁尾置中", + "Footer Left": "頁尾靠左", + "Footer Right": "頁尾靠右", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "適用於僅含圖片的 PDF,例如掃描檔。若文件含有可選取的文字則會略過,除非已開啟覆寫內容保護。", + "Form fields stop being fillable.": "表單欄位將無法再填寫。", + "Format": "格式", + "Found {{length}} blank page(s). Click on a page to deselect it.": "找到 {{length}} 頁空白頁。點選頁面即可取消選取。", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "找到 {{length}} 個現有書籤。要取代目前的書籤嗎?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "在 {{length2}} 個 PDF 中找到 {{length}} 張圖片。", + "Front": "正面", + "Full Coverage": "完整涵蓋", + "Gamma": "Gamma", + "Generate table of contents from bookmarks": "依書籤產生目錄", + "Generating High-Quality PDF...": "正在產生高品質 PDF...", + "Generating PDF...": "正在產生 PDF...", + "Generating ZIP file...": "正在產生 ZIP 檔案...", + "Generating formatted content...": "正在產生格式化內容...", + "Generating preview...": "正在產生預覽...", + "Ghostscript (PDF/A Conversion)": "Ghostscript(PDF/A 轉換)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB 轉換失敗,結束代碼 {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript 轉換失敗,結束代碼 {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript 未產生輸出檔案", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "尚未設定 Ghostscript。請在進階設定中進行設定。", + "Ghostscript is not configured. Please configure it in WASM Settings.": "尚未設定 Ghostscript。請在 WASM 設定中進行設定。", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "尚未設定 Ghostscript。PyMuPDF 的部分操作需要 Ghostscript,請在進階設定中同時設定兩者。", + "Ghostscript threw an exception: {{e}}": "Ghostscript 擲出例外:{{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript 包裝程式未提供預期的介面。預期為 loadGS() 或 GhostscriptWASM 類別。", + "Go": "前往", + "Go to page": "前往頁面", + "Grayscale": "灰階", + "Green": "綠色", + "Greyscale": "灰階", + "Grid Mode": "格線模式", + "Group Name (Must be same for group)": "群組名稱(同一群組必須相同)", + "H-Scale %": "水平縮放 %", + "Hanging Indent": "凸排縮排", + "Hard reloads page": "強制重新載入頁面", + "Header & Footer": "頁首與頁尾", + "Header & Footer added successfully!": "已成功新增頁首與頁尾!", + "Header Center": "頁首置中", + "Header Left": "頁首靠左", + "Header Right": "頁首靠右", + "Height ({{unit}})": "高度({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "隱藏", + "Hide Border": "隱藏邊框", + "Hide password": "隱藏密碼", + "Hides window": "隱藏視窗", + "High (288 DPI)": "高(288 DPI)", + "High (Smallest Files)": "高(檔案最小)", + "Horizontal": "水平", + "Hue Shift": "色相偏移", + "Image Format": "圖片格式", + "Image Input": "圖片輸入", + "Image quality": "圖片品質", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "圖片已從 {{width}}×{{height}} 調整為 {{width2}}×{{height2}}", + "Images": "圖片", + "Images above this are resampled down. None leaves resolution alone.": "高於此值的圖片會被降低取樣。選「無」則不變動解析度。", + "Imported {{length}} bookmarks!": "已匯入 {{length}} 個書籤!", + "Inches (in)": "英吋(in)", + "Include Attachments": "包含附件", + "Include Cc Bcc": "包含副本與密件副本", + "Include this file": "包含此檔案", + "Incorrect Page Count": "頁數不正確", + "Incorrect Password": "密碼不正確", + "Incorrect password": "密碼不正確", + "Incorrect password. Please try again.": "密碼不正確。請再試一次。", + "Increase size": "放大", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "正在建立 PDF 1 的索引,第 {{pageNumber}} 頁,共 {{totalPages}} 頁...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "正在建立 PDF 2 的索引,第 {{pageNumber}} 頁,共 {{totalPages}} 頁...", + "Info": "資訊", + "Info Dictionary": "資訊字典", + "Inherit": "繼承", + "Initialization Error": "初始化錯誤", + "Initializing Ghostscript...": "正在初始化 Ghostscript...", + "Initializing PDF engine...": "正在初始化 PDF 引擎...", + "Initializing PyMuPDF...": "正在初始化 PyMuPDF...", + "Initializing decryption...": "正在初始化解密...", + "Initializing encryption...": "正在初始化加密...", + "Initializing repair engine...": "正在初始化修復引擎...", + "Initializing...": "正在初始化...", + "Input Required": "需要輸入", + "Insecure Digest (MD5 / SHA-1)": "不安全的摘要演算法(MD5 / SHA-1)", + "Insert blank pages": "插入空白頁", + "Insert blank pages after this page number": "在此頁碼之後插入空白頁", + "Interactive Form Fields": "互動式表單欄位", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "交錯合併多個 PDF 的頁面(例如單面掃描的奇數頁加上反向的偶數頁)", + "Invalid Certificate": "憑證無效", + "Invalid File": "檔案無效", + "Invalid Files": "檔案無效", + "Invalid Input": "輸入無效", + "Invalid JSON format": "JSON 格式無效", + "Invalid Name": "名稱無效", + "Invalid Order": "順序無效", + "Invalid PDF password.": "PDF 密碼無效。", + "Invalid Page Numbers": "頁碼無效", + "Invalid Page Order": "頁面順序無效", + "Invalid Pages": "頁面無效", + "Invalid Range": "範圍無效", + "Invalid Signature": "簽章無效", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "TSA 網址無效。時間戳記授權單位必須是有效的 http:// 或 https:// 網址。", + "Invalid URL": "網址無效", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "網址格式無效。請輸入有效的網址(例如 https://example.com/wasm/)", + "Invalid XML: no root element": "XML 無效:沒有根元素", + "Invalid data": "資料無效", + "Invalid hex string in content stream": "內容串流中的十六進位字串無效", + "Invalid page range specified.": "指定的頁面範圍無效。", + "Invalid shortcut format": "快速鍵格式無效", + "Invalid: Cryptographic Verification Failed": "無效:密碼學驗證失敗", + "Invert Colors": "反轉色彩", + "Invert all colors": "反轉所有色彩", + "Inverting PDF colors...": "正在反轉 PDF 色彩...", + "Issuer": "簽發者", + "It fits the {{targetBytes}} target.": "符合 {{targetBytes}} 的目標。", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "仍高於 {{targetBytes}} 的目標,因為「保留 PDF/A」限制了可壓縮的程度。", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "此檔案不再宣告符合 PDF/A。若要保留,請在自訂設定中開啟「保留 PDF/A」。", + "Italic": "斜體", + "Item 1": "項目 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "為了壓縮,其數位簽章已被移除。如有需要請重新簽署。", + "JPEG (Smaller file size)": "JPEG(檔案較小)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "重新編碼圖片的 JPEG 品質,範圍 20 至 100。數值越低檔案越小,但失真也越明顯。", + "JPG": "JPG", + "JSON Files": "JSON 檔案", + "JSON Loaded": "JSON 已載入", + "JSON to PDF": "JSON 轉 PDF", + "Javascript Code": "JavaScript 程式碼", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "讓 PDF/A 檔案維持符合規範。開啟時會略過 Brotli 與點陣化。", + "Keeps only the characters the document uses.": "僅保留文件中用到的字元。", + "Key (e.g., Department)": "鍵(例如 Department)", + "Keywords": "關鍵字", + "Label": "標籤", + "Label / Prompt": "標籤/提示文字", + "Landscape": "橫向", + "Language": "語言", + "Layer not found": "找不到圖層", + "Layer {{number}}": "圖層 {{number}}", + "Leave blank for all pages": "留空表示所有頁面", + "Left": "左", + "Left edge in points (1 inch = 72 pts)": "左邊緣(單位為點,1 英吋 = 72 點)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "等級", + "Limit recognized characters (leave empty for all)": "限制辨識的字元(留空表示全部)", + "Line": "線條", + "Linearization Failed": "線性化失敗", + "Linearize": "線性化", + "Links stop being clickable.": "連結將無法再點選。", + "Lists": "清單", + "Load": "載入", + "Load system fonts": "載入系統字型", + "Load system fonts…": "載入系統字型…", + "Loaded": "已載入", + "Loaded bookmarks from JSON. Now upload your PDF.": "已從 JSON 載入書籤。現在請上傳您的 PDF。", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "已從 CSV 載入 {{length}} 個書籤。現在請上傳您的 PDF。", + "Loading Engine...": "正在載入引擎...", + "Loading Ghostscript...": "正在載入 Ghostscript...", + "Loading PDF Editor...": "正在載入 PDF 編輯器...", + "Loading PDF Text Editor...": "正在載入 PDF 文字編輯器...", + "Loading PDF converter...": "正在載入 PDF 轉換器...", + "Loading PDF documents...": "正在載入 PDF 文件...", + "Loading PDF engine...": "正在載入 PDF 引擎...", + "Loading PDF files...": "正在載入 PDF 檔案...", + "Loading PDF form...": "正在載入 PDF 表單...", + "Loading PDF processor...": "正在載入 PDF 處理器...", + "Loading PDF viewer...": "正在載入 PDF 檢視器...", + "Loading PDF...": "正在載入 PDF...", + "Loading PDFs...": "正在載入 PDF...", + "Loading attachments...": "正在載入附件...", + "Loading comparison {{currentPage}} of {{length}}...": "正在載入第 {{currentPage}} 項比較,共 {{length}} 項...", + "Loading conversion engine ({{percent}}%)...": "正在載入轉換引擎({{percent}}%)...", + "Loading conversion engine...": "正在載入轉換引擎...", + "Loading engine...": "正在載入引擎...", + "Loading fonts...": "正在載入字型...", + "Loading layers from {{name}}...": "正在從 {{name}} 載入圖層...", + "Loading page {{num}}...": "正在載入第 {{num}} 頁...", + "Loading preview...": "正在載入預覽...", + "Loading {{name}}...": "正在載入 {{name}}...", + "Loading...": "載入中...", + "Location": "位置", + "Lossless (No Quality Loss)": "無損(不損失品質)", + "Lossless (no image re-encoding)": "無損(不重新編碼圖片)", + "Low (Best Quality)": "低(最佳品質)", + "MOBI Files": "MOBI 檔案", + "MOBI to PDF": "MOBI 轉 PDF", + "Malformed ByteRange": "ByteRange 格式錯誤", + "Malformed ECDSA signature (could not parse r,s)": "ECDSA 簽章格式錯誤(無法解析 r,s)", + "Malformed inline image in content stream": "內容串流中的內嵌圖片格式錯誤", + "Malformed signatureAlgorithm": "signatureAlgorithm 格式錯誤", + "Margins": "邊界", + "Markdown Files": "Markdown 檔案", + "Markdown to PDF": "Markdown 轉 PDF", + "Max Length (0 for unlimited)": "長度上限(0 表示不限)", + "Maximum resolution": "最大解析度", + "Medium (Recommended)": "中(建議)", + "Merge PDF": "合併 PDF", + "Merge PDFs": "合併 PDF", + "Merge duplicate fonts": "合併重複的字型", + "Mermaid Error: {{error}}": "Mermaid 錯誤:{{error}}", + "Metadata copied to clipboard as JSON.": "中繼資料已以 JSON 格式複製到剪貼簿。", + "Metadata removed successfully!": "已成功移除中繼資料!", + "Metadata updated successfully!": "已成功更新中繼資料!", + "Millimeters (mm)": "公釐(mm)", + "Minimizes window": "最小化視窗", + "Missing Files": "缺少檔案", + "Missing signatureAlgorithm": "缺少 signatureAlgorithm", + "Mixed Page Sizes Detected": "偵測到頁面尺寸不一", + "Mixed Sizes": "尺寸不一", + "Mode": "模式", + "Modified": "已修改", + "Modified After Signing (signed part intact)": "簽署後已被修改(已簽署的部分完整無損)", + "More": "更多", + "Moved": "已移動", + "Moved \"{{value}}\"": "已移動「{{value}}」", + "Multi-line": "多行", + "Must be a positive integer": "必須是正整數", + "Must be a positive number": "必須是正數", + "N must be at least 1.": "N 至少必須為 1。", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "已成功建立 N-Up PDF!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "網路錯誤:無法連線至該網址。請確認網址正確,且伺服器允許 CORS 請求。", + "Network error: {{error}}": "網路錯誤:{{error}}", + "Next page": "下一頁", + "No Area Selected": "未選取區域", + "No Attachments": "沒有附件", + "No Changes": "沒有變更", + "No Crop Area": "沒有裁切區域", + "No File": "沒有檔案", + "No Files": "沒有檔案", + "No Images Found": "找不到圖片", + "No PDF Files": "沒有 PDF 檔案", + "No PDF document loaded": "尚未載入 PDF 文件", + "No PDF document loaded.": "尚未載入 PDF 文件。", + "No PDF file loaded.": "尚未載入 PDF 檔案。", + "No PDF files could be decrypted. The password may be incorrect.": "沒有任何 PDF 檔案能夠解密。密碼可能不正確。", + "No PDF files could be linearized.": "沒有任何 PDF 檔案能夠線性化。", + "No PDFs could be processed.": "沒有任何 PDF 能夠處理。", + "No Pages": "沒有頁面", + "No Selection": "未選取任何項目", + "No Signatures Found": "找不到簽章", + "No Tables Found": "找不到表格", + "No Text": "沒有文字", + "No URL configured": "尚未設定網址", + "No attachments found in this PDF.": "此 PDF 中找不到附件。", + "No attachments selected for removal.": "未選取要移除的附件。", + "No blank pages detected in this PDF.": "此 PDF 中未偵測到空白頁。", + "No bookmarks found at the selected level.": "在所選層級找不到書籤。", + "No bookmarks to delete.": "沒有可刪除的書籤。", + "No bookmarks to export!": "沒有可匯出的書籤!", + "No certificate found in PEM file": "PEM 檔案中找不到憑證", + "No certificate found in PFX file": "PFX 檔案中找不到憑證", + "No certificates found in signature": "簽章中找不到憑證", + "No changes match the current filter.": "沒有符合目前篩選條件的變更。", + "No configurable settings for this node.": "此節點沒有可設定的項目。", + "No differences detected on this page.": "此頁未偵測到差異。", + "No embedded images were found in the selected PDF(s).": "所選 PDF 中找不到內嵌圖片。", + "No existing bookmarks found in this PDF.": "此 PDF 中找不到現有書籤。", + "No items were selected for removal or none were found in the PDF.": "未選取要移除的項目,或 PDF 中找不到這些項目。", + "No page pairs to export.": "沒有可匯出的頁面配對。", + "No pages found. Please create a blank PDF or upload one.": "找不到頁面。請建立空白 PDF 或上傳一個 PDF。", + "No pages selected for removal.": "未選取要移除的頁面。", + "No pages were selected for splitting.": "未選取要分割的頁面。", + "No paired page for this side.": "此側沒有配對的頁面。", + "No private key found in PEM file": "PEM 檔案中找不到私密金鑰", + "No private key found in PFX file": "PFX 檔案中找不到私密金鑰", + "No tables were detected in this PDF.": "此 PDF 中未偵測到表格。", + "No valid page numbers found.": "找不到有效的頁碼。", + "No valid pages to save.": "沒有可儲存的有效頁面。", + "No worker": "沒有 worker", + "Noise": "雜訊", + "None": "無", + "None of the files could be compressed: {{join}}.": "以下檔案皆無法壓縮:{{join}}。", + "Normal": "一般", + "Not Enough Files": "檔案數量不足", + "Not a PDF": "不是 PDF", + "Not connected": "未連線", + "Not in trust chain": "不在信任鏈中", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "注意:若未另設擁有者密碼,此 PDF 將沒有任何使用限制。", + "Number Format": "數字格式", + "Number of Pages": "頁數", + "OCR": "OCR", + "OCR aborted before any page was processed": "尚未處理任何頁面,OCR 即已中止", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR 辨識在 {{timeoutMs}} 毫秒後逾時", + "OCR: {{status}}": "OCR:{{status}}", + "ODG Files": "ODG 檔案", + "ODG to PDF": "ODG 轉 PDF", + "OK": "確定", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "關閉(預設):依 1 至 N 自然編號。開啟:保留每個檔案原有的頁面標籤(可能產生重複標籤)。", + "One PDF per page": "每頁一個 PDF", + "One PDF per range": "每個範圍一個 PDF", + "Only a substitute font was available": "僅有替代字型可用", + "Only where it does not change how the image looks.": "僅在不改變圖片外觀時才套用。", + "Opacity": "不透明度", + "Open URL": "開啟網址", + "Opens incognito window": "開啟無痕視窗", + "Opens new tab": "開啟新分頁", + "Opens new window": "開啟新視窗", + "Operation Failed": "操作失敗", + "Operation resulted in an empty file.": "操作後產生了空檔案。", + "Optimize PDF for fast web viewing": "最佳化 PDF 以利快速網頁瀏覽", + "Optimizing PDFs for web view (linearizing)...": "正在最佳化 PDF 以利網頁瀏覽(線性化)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "正在最佳化 {{name}}({{n}}/{{length}})...", + "Options (One per line or comma separated)": "選項(每行一個,或以逗號分隔)", + "Orientation": "方向", + "Outline": "大綱", + "Output": "輸出", + "Overlay": "疊加", + "Overlay or underlay pages from one PDF onto another": "將一個 PDF 的頁面疊加到另一個 PDF 的上層或下層", + "Owner Password": "擁有者密碼", + "Owner Password Required": "需要擁有者密碼", + "PDF": "PDF", + "PDF Files": "PDF 檔案", + "PDF Input": "PDF 輸入", + "PDF Layers": "PDF 圖層", + "PDF Metadata": "PDF 中繼資料", + "PDF Producer": "PDF 產生程式", + "PDF converted to CSV successfully!": "已成功將 PDF 轉換為 CSV!", + "PDF converted to SVG successfully!": "已成功將 PDF 轉換為 SVG!", + "PDF converted to greyscale successfully!": "已成功將 PDF 轉換為灰階!", + "PDF created successfully!": "已成功建立 PDF!", + "PDF decrypted successfully! All encryption and restrictions removed.": "已成功解密 PDF!所有加密與限制均已移除。", + "PDF decrypted successfully! Your download has started.": "已成功解密 PDF!已開始下載。", + "PDF downloaded successfully.": "已成功下載 PDF。", + "PDF encrypted successfully with 256-bit AES!": "已成功以 256 位元 AES 加密 PDF!", + "PDF has been sanitized and downloaded.": "PDF 已清理並下載。", + "PDF has no pages": "PDF 沒有任何頁面", + "PDF organized successfully!": "已成功整理 PDF!", + "PDF permissions changed successfully!": "已成功變更 PDF 權限!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF 閱讀器本身就內建 14 種標準 PDF 字型。", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "已成功移除 PDF 限制!檔案現在可完整編輯與列印。", + "PDF saved successfully!": "已成功儲存 PDF!", + "PDF split successfully!": "已成功分割 PDF!", + "PDF to CSV": "PDF 轉 CSV", + "PDF to DOCX": "PDF 轉 DOCX", + "PDF to Excel/CSV": "PDF 轉 Excel/CSV", + "PDF to Images": "PDF 轉圖片", + "PDF to Images (High Quality)": "PDF 轉圖片(高品質)", + "PDF to JSON": "PDF 轉 JSON", + "PDF to Markdown": "PDF 轉 Markdown", + "PDF to PDF/A": "PDF 轉 PDF/A", + "PDF to SVG": "PDF 轉 SVG", + "PDF to Text": "PDF 轉文字", + "PDF to XLSX": "PDF 轉 XLSX", + "PDF with layer changes saved!": "已儲存含圖層變更的 PDF!", + "PDF {{modeLabel}} applied successfully.": "已成功套用 PDF {{modeLabel}}。", + "PDF/A Conversion": "PDF/A 轉換", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b(嚴格,不含透明度)", + "PDF/A-2b (Recommended)": "PDF/A-2b(建議)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b(現代,允許附件)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "已成功混合 PDF!", + "PNG": "PNG", + "PNG (Lossless)": "PNG(無損)", + "PUB to PDF": "PUB 轉 PDF", + "Page": "頁面", + "Page #": "頁碼", + "Page Added": "已新增頁面", + "Page Numbers": "頁碼", + "Page Removed": "已移除頁面", + "Page Size": "頁面大小", + "Page X of Y": "第 X 頁,共 Y 頁", + "Page background or layout changed": "頁面背景或版面已變更", + "Page container not found": "找不到頁面容器", + "Page extraction produced an empty PDF.": "擷取頁面後產生了空的 PDF。", + "Page number": "頁碼", + "Page numbers added successfully!": "已成功新增頁碼!", + "Page sizes standardized successfully!": "已成功統一頁面尺寸!", + "Page {{currentPageNum}} of {{numPages}}": "第 {{currentPageNum}} 頁,共 {{numPages}} 頁", + "Page {{num}} / {{numPages}}": "第 {{num}} / {{numPages}} 頁", + "Page {{n}} ": "第 {{n}} 頁 ", + "Page {{n}} of {{length}}": "第 {{n}} 頁,共 {{length}} 頁", + "Page {{n}}:": "第 {{n}} 頁:", + "Page {{pageNumber}}": "第 {{pageNumber}} 頁", + "Page {{pageNumber}} exists only in the first PDF.": "第 {{pageNumber}} 頁僅存在於第一個 PDF。", + "Page {{pageNumber}} exists only in the second PDF.": "第 {{pageNumber}} 頁僅存在於第二個 PDF。", + "Page {{pageNumber}} of {{totalPages}}": "第 {{pageNumber}} 頁,共 {{totalPages}} 頁", + "Page {{pageNum}} does not exist in this PDF.": "此 PDF 中不存在第 {{pageNum}} 頁。", + "Page {{page}}": "第 {{page}} 頁", + "Page {{page}} attachment": "第 {{page}} 頁附件", + "Pages": "頁面", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "頁面(例如 1-3, 5)- 共 {{pageCount}} 頁", + "Pages Files": "Pages 檔案", + "Pages Per Sheet": "每張紙的頁數", + "Pages combined successfully!": "已成功合併頁面!", + "Pages have been divided successfully!": "已成功分割頁面!", + "Pages have been reordered.": "頁面已重新排序。", + "Pages have been reversed successfully!": "已成功反轉頁面順序!", + "Pages to PDF": "Pages 轉 PDF", + "Paper Size": "紙張大小", + "Paragraph": "段落", + "Parsing XML structure...": "正在解析 XML 結構...", + "Parsing {{name}}...": "正在解析 {{name}}...", + "Partial Coverage": "部分涵蓋", + "Partial Success": "部分成功", + "Password": "密碼", + "Password Error": "密碼錯誤", + "Password Needed": "需要密碼", + "Password Required": "需要密碼", + "Password for all files": "所有檔案的密碼", + "Password for all locked files": "所有已鎖定檔案的密碼", + "Password for {{name}}": "{{name}} 的密碼", + "Password protected": "受密碼保護", + "Password required for encrypted private key": "加密的私密金鑰需要密碼", + "Path Stroke": "路徑筆畫", + "Please add at least one field before downloading.": "下載前請至少新增一個欄位。", + "Please draw a rectangle on at least one page to select the crop area.": "請在至少一頁上繪製矩形,以選取裁切區域。", + "Please ensure all page numbers in the order are unique.": "請確認順序中的所有頁碼皆不重複。", + "Please enter a layer name": "請輸入圖層名稱", + "Please enter a name.": "請輸入名稱。", + "Please enter a number between 0 and {{totalPages}}.": "請輸入介於 0 到 {{totalPages}} 之間的數字。", + "Please enter a page order.": "請輸入頁面順序。", + "Please enter a password": "請輸入密碼", + "Please enter a password for {{i}} or skip it": "請輸入 {{i}} 的密碼,或將其略過", + "Please enter a title.": "請輸入標題。", + "Please enter a user password.": "請輸入使用者密碼。", + "Please enter a valid number of pages (1 or more).": "請輸入有效的頁數(1 或以上)。", + "Please enter a valid page number between 1 and {{total}}": "請輸入 1 到 {{total}} 之間的有效頁碼", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "請輸入有效的頁面範圍(例如 1-5, 8, 11-13)。", + "Please enter page numbers to extract.": "請輸入要擷取的頁碼。", + "Please enter positive numbers.": "請輸入正數。", + "Please enter some text to convert.": "請輸入要轉換的文字。", + "Please enter text for the watermark.": "請輸入浮水印的文字。", + "Please enter the PDF password.": "請輸入 PDF 密碼。", + "Please load a PDF first.": "請先載入 PDF。", + "Please select PDF files to create a ZIP archive.": "請選取要建立 ZIP 壓縮檔的 PDF 檔案。", + "Please select a .pem, .crt, .cer, or .der certificate file.": "請選取 .pem、.crt、.cer 或 .der 憑證檔案。", + "Please select a PDF file.": "請選取 PDF 檔案。", + "Please select a valid PDF file.": "請選取有效的 PDF 檔案。", + "Please select an area on at least one page to crop.": "請在至少一頁上選取要裁切的區域。", + "Please select an area to crop first.": "請先選取要裁切的區域。", + "Please select an area to crop.": "請選取要裁切的區域。", + "Please select an image file for the watermark.": "請選取要作為浮水印的圖片檔案。", + "Please select at least one BMP file.": "請至少選取一個 BMP 檔案。", + "Please select at least one CSV file.": "請至少選取一個 CSV 檔案。", + "Please select at least one Excel file.": "請至少選取一個 Excel 檔案。", + "Please select at least one HEIC file.": "請至少選取一個 HEIC 檔案。", + "Please select at least one JPG file.": "請至少選取一個 JPG 檔案。", + "Please select at least one JPG or JPEG2000 image.": "請至少選取一張 JPG 或 JPEG2000 圖片。", + "Please select at least one ODT file.": "請至少選取一個 ODT 檔案。", + "Please select at least one PDF file.": "請至少選取一個 PDF 檔案。", + "Please select at least one PowerPoint file.": "請至少選取一個 PowerPoint 檔案。", + "Please select at least one RTF file.": "請至少選取一個 RTF 檔案。", + "Please select at least one SVG file.": "請至少選取一個 SVG 檔案。", + "Please select at least one TIFF file.": "請至少選取一個 TIFF 檔案。", + "Please select at least one Word document.": "請至少選取一份 Word 文件。", + "Please select at least one file to attach.": "請至少選取一個要附加的檔案。", + "Please select at least one image file.": "請至少選取一個圖片檔案。", + "Please select at least one text file.": "請至少選取一個文字檔案。", + "Please select at least one {{FILETYPE_NAME}} file.": "請至少選取一個 {{FILETYPE_NAME}} 檔案。", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "請至少選取一個 {{TOOL_NAME}} 檔案(.eml 或 .msg)。", + "Please select at least one {{TOOL_NAME}} file.": "請至少選取一個 {{TOOL_NAME}} 檔案。", + "Please select even or odd pages.": "請選擇偶數頁或奇數頁。", + "Please select one or more PDF files.": "請選取一個或多個 PDF 檔案。", + "Please select pages to delete.": "請選取要刪除的頁面。", + "Please select pages to duplicate.": "請選取要複製的頁面。", + "Please select pages to mark for splitting.": "請選取要標記為分割點的頁面。", + "Please select pages to rotate.": "請選取要旋轉的頁面。", + "Please specify a page range for page-level attachments.": "請指定頁面層級附件的頁面範圍。", + "Please upload PDF files.": "請上傳 PDF 檔案。", + "Please upload PDFs first.": "請先上傳 PDF。", + "Please upload a .docx file first.": "請先上傳 .docx 檔案。", + "Please upload a PDF file first.": "請先上傳 PDF 檔案。", + "Please upload a PDF file.": "請上傳 PDF 檔案。", + "Please upload a PDF first.": "請先上傳 PDF。", + "Please upload a valid PDF file.": "請上傳有效的 PDF 檔案。", + "Please upload at least one PDF file.": "請至少上傳一個 PDF 檔案。", + "Please upload at least two PDF files to alternate and mix.": "請至少上傳兩個 PDF 檔案,才能交替混合。", + "Please upload both a base PDF and an overlay/underlay PDF.": "請同時上傳基底 PDF 與疊加/墊底 PDF。", + "Please upload valid PDF files.": "請上傳有效的 PDF 檔案。", + "Please use the Download button in the PDF viewer toolbar above.": "請使用上方 PDF 檢視器工具列中的下載按鈕。", + "Please wait for the PDF viewer to load.": "請等待 PDF 檢視器載入完成。", + "Please wait for the form to finish loading.": "請等待表單載入完成。", + "Portrait": "直向", + "Position": "位置", + "Post-processing for transparency compliance...": "正在進行透明度合規的後處理...", + "Posterize": "色調分離", + "Posterizing PDF...": "正在對 PDF 進行色調分離...", + "PowerPoint to PDF": "PowerPoint 轉 PDF", + "Pre Flatten": "預先平面化", + "Pre-flattening PDF...": "正在預先平面化 PDF...", + "Prefer JPEG 2000 for photos": "照片優先使用 JPEG 2000", + "Preparing PDF export...": "正在準備 PDF 匯出...", + "Preparing conversion...": "正在準備轉換...", + "Preparing download...": "正在準備下載...", + "Preparing preview...": "正在準備預覽...", + "Presentations": "簡報", + "Preserve PDF/A": "保留 PDF/A", + "Preview": "預覽", + "Preview Error": "預覽錯誤", + "Preview Text": "預覽文字", + "Previous page": "上一頁", + "Print Form": "列印表單", + "Private data that editing apps store inside the PDF.": "編輯軟體儲存在 PDF 內的私有資料。", + "Processed {{processedCount}} PDFs.": "已處理 {{processedCount}} 個 PDF。", + "Processing Complete": "處理完成", + "Processing Dpi": "處理 DPI", + "Processing Failed": "處理失敗", + "Processing PDF permissions...": "正在處理 PDF 權限...", + "Processing attachments...": "正在處理附件...", + "Processing failed for {{name}}.": "處理 {{name}} 失敗。", + "Processing file {{n}} of {{length}}...": "正在處理第 {{n}} 個檔案,共 {{length}} 個...", + "Processing images...": "正在處理圖片...", + "Processing multiple PDFs...": "正在處理多個 PDF...", + "Processing page {{i}} of {{numPages}}": "正在處理第 {{i}} 頁,共 {{numPages}} 頁", + "Processing page {{i}} of {{numPages}}...": "正在處理第 {{i}} 頁,共 {{numPages}} 頁...", + "Processing page {{n}} of {{length}}...": "正在處理第 {{n}} 頁,共 {{length}} 頁...", + "Processing page {{pageNum}} of {{length}}...": "正在處理第 {{pageNum}} 頁,共 {{length}} 頁...", + "Processing page {{pageNum}} of {{totalPages}}...": "正在處理第 {{pageNum}} 頁,共 {{totalPages}} 頁...", + "Processing produced an empty file.": "處理後產生了空檔案。", + "Processing resulted in an empty file.": "處理後產生了空檔案。", + "Processing sheet {{n}}...": "正在處理第 {{n}} 張紙...", + "Processing {{name}}...": "正在處理 {{name}}...", + "Processing {{nodeName}}...": "正在處理 {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "正在處理 {{n}}/{{length}}:{{name}}...", + "Processing...": "處理中...", + "Producer": "產生程式", + "Publisher Files": "Publisher 檔案", + "Purple": "紫色", + "PyMuPDF (Document Processing)": "PyMuPDF(文件處理)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "尚未設定 PyMuPDF。請在進階設定中進行設定。", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDF 模組未匯出預期的 PyMuPDF 類別。", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF 產生了空的解密檔案。", + "PyMuPDF: not configured.": "PyMuPDF:尚未設定。", + "QR Code": "QR Code", + "Quality": "品質", + "Quits application (cannot be overridden)": "結束應用程式(無法覆寫)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1 簽章無法以簽署者公開金鑰驗證", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS 簽章無法以簽署者公開金鑰驗證", + "Rasterization Complete": "點陣化完成", + "Rasterization Partial": "部分點陣化完成", + "Rasterize": "點陣化", + "Rasterize Dpi": "點陣化 DPI", + "Rasterize pages to images": "將頁面點陣化為圖片", + "Rasterize quality": "點陣化品質", + "Rasterize resolution (DPI)": "點陣化解析度(DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "已點陣化 {{completed}} 個 PDF,失敗 {{failed}} 個。", + "Rasterizing {{name}} ({{n}}/{{total}})...": "正在點陣化 {{name}}({{n}}/{{total}})...", + "Rasterizing {{name}}...": "正在點陣化 {{name}}...", + "Rasterizing...": "正在點陣化...", + "Rating must be between 0 and 5": "評分必須介於 0 到 5 之間", + "Read Only": "唯讀", + "Reading CSV file...": "正在讀取 CSV 檔案...", + "Reading PDF...": "正在讀取 PDF...", + "Reading XML file...": "正在讀取 XML 檔案...", + "Reading encrypted PDF...": "正在讀取加密的 PDF...", + "Reading files...": "正在讀取檔案...", + "Reading layer configuration...": "正在讀取圖層設定...", + "Reading {{name}} ({{n}}/{{length}})...": "正在讀取 {{name}}({{n}}/{{length}})...", + "Ready": "就緒", + "Reason": "原因", + "Red": "紅色", + "Redact": "遮蓋", + "Redact Mode": "遮蓋模式", + "Redact text from PDF": "遮蓋 PDF 中的文字", + "Redaction Failed": "遮蓋失敗", + "Reduce PDF file size": "縮小 PDF 檔案大小", + "Reduce color complexity": "降低色彩複雜度", + "Reduces file size by removing color information.": "移除色彩資訊以縮小檔案大小。", + "Reloads page": "重新載入頁面", + "Remove": "移除", + "Remove All Attachments": "移除所有附件", + "Remove Annotations": "移除註解", + "Remove Blank Pages": "移除空白頁", + "Remove Embedded Files": "移除內嵌檔案", + "Remove Fonts": "移除字型", + "Remove Javascript": "移除 JavaScript", + "Remove Layers": "移除圖層", + "Remove Links": "移除連結", + "Remove Mark Info": "移除標記資訊", + "Remove Metadata": "移除中繼資料", + "Remove PDF password protection": "移除 PDF 密碼保護", + "Remove Structure Tree": "移除結構樹", + "Remove alternate images": "移除替代圖片", + "Remove application data": "移除應用程式資料", + "Remove article threads": "移除文章串", + "Remove attachment": "移除附件", + "Remove blank pages automatically": "自動移除空白頁", + "Remove document structure tree": "移除文件結構樹", + "Remove file": "移除檔案", + "Remove metadata, scripts, and hidden data": "移除中繼資料、指令碼與隱藏資料", + "Remove output intents": "移除輸出意圖", + "Remove page thumbnails": "移除頁面縮圖", + "Remove specific pages": "移除指定頁面", + "Remove web capture information": "移除網頁擷取資訊", + "Remove {{name}}": "移除 {{name}}", + "Removed \"{{beforeText}}\"": "已移除「{{beforeText}}」", + "Removed image ({{width}}×{{height}})": "已移除圖片({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "已成功移除 {{length}} 頁空白頁!", + "Removing all metadata...": "正在移除所有中繼資料...", + "Removing annotations...": "正在移除註解...", + "Removing redacted text from document data...": "正在從文件資料中移除已遮蓋的文字...", + "Removing restrictions...": "正在移除限制...", + "Removing {{length}} blank page(s)...": "正在移除 {{length}} 頁空白頁...", + "Render Error": "算繪錯誤", + "Rendering Page {{num}}...": "正在算繪第 {{num}} 頁...", + "Rendering page previews...": "正在算繪頁面預覽...", + "Rendering page previews: {{current}}/{{total}}": "正在算繪頁面預覽:{{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "正在算繪第 {{n}} 頁,共 {{length}} 頁...", + "Rendering preview for page {{pageNum}}...": "正在算繪第 {{pageNum}} 頁的預覽...", + "Reopens closed tab": "重新開啟已關閉的分頁", + "Repair": "修復", + "Repair Failed": "修復失敗", + "Repair corrupted PDF": "修復損毀的 PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "已修復 {{length}} 個檔案。修復失敗:{{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "正在修復 {{name}}({{n}}/{{length}})...", + "Repairing {{name}}...": "正在修復 {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "已將「{{beforeText}}」取代為「{{afterText}}」", + "Required": "必填", + "Resamples even when an image is only slightly above the limit.": "即使圖片僅略高於上限,也會重新取樣。", + "Reset Form": "重設表單", + "Reset and go back to file uploader? All unsaved changes will be lost.": "要重設並返回檔案上傳畫面嗎?所有未儲存的變更都將遺失。", + "Resolution": "解析度", + "Retain Page Labels": "保留頁面標籤", + "Retry Failed": "重試失敗項目", + "Reverse Pages": "反轉頁面順序", + "Reverse page order": "反轉頁面順序", + "Reversing page order...": "正在反轉頁面順序...", + "Reversing {{name}} ({{n}}/{{length}})...": "正在反轉 {{name}}({{n}}/{{length}})...", + "Right": "右", + "Right edge in points": "右邊緣(單位為點)", + "Rotate": "旋轉", + "Rotate +90°": "旋轉 +90°", + "Rotate all pages": "旋轉所有頁面", + "Rotation": "旋轉", + "Rotation Variance": "旋轉變異", + "Rotations applied successfully!": "已成功套用旋轉!", + "Rows": "列", + "Run Javascript": "執行 JavaScript", + "Running OCR on page {{pageNum}}...": "正在對第 {{pageNum}} 頁執行 OCR...", + "Running...": "執行中...", + "SVG": "SVG", + "SVG Files": "SVG 檔案", + "SVG to PDF": "SVG 轉 PDF", + "Sanitize": "清理", + "Sanitized With Warnings": "已清理,但有警告", + "Sanitizing PDF...": "正在清理 PDF...", + "Saturation": "飽和度", + "Saved": "已儲存", + "Saving PDF with layer changes...": "正在儲存含圖層變更的 PDF...", + "Scaling Mode": "縮放模式", + "Scanner Effect": "掃描器效果", + "Scanner effect applied successfully!": "已成功套用掃描器效果!", + "Scanning page {{n}} of {{pageCount}}...": "正在掃描第 {{n}} 頁,共 {{pageCount}} 頁...", + "Search Text": "搜尋文字", + "Search languages...": "搜尋語言...", + "Select Font": "選擇字型", + "Select a field to edit properties": "選取欄位以編輯屬性", + "Select a field...": "選取欄位...", + "Select to add this button to an existing group": "選取後可將此按鈕加入現有群組", + "Selected Option": "已選取的選項", + "Self-Signed: Signer Identity Not Verified": "自行簽署:未驗證簽署者身分", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "自行代管的 OCR 資源僅部分設定。請將 {{missing}} 與其他 Tesseract 資源網址一併設定。", + "Separator": "分隔線", + "Separator Color": "分隔線色彩", + "Separator Thickness": "分隔線粗細", + "Sepia": "復古褐色", + "Serial Number:": "序號:", + "Set custom destination": "設定自訂目的地", + "Shapes": "圖形", + "Sheet {{n}} {{sideLabel}}": "第 {{n}} 張紙 {{sideLabel}}", + "Show": "顯示", + "Show password": "顯示密碼", + "Show/Hide Field": "顯示/隱藏欄位", + "Sign Here": "在此簽名", + "Signature /Contents is not a single DER object followed by zero padding": "簽章 /Contents 並非單一 DER 物件加上零填補", + "Signature Algorithm:": "簽章演算法:", + "Signature Intact: Signer Identity Not Verified": "簽章完整:未驗證簽署者身分", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "簽章欄位是 AcroForm 簽章欄位,只有在進階 PDF 檢視器中才看得到。", + "Signature has a missing or malformed /ByteRange": "簽章缺少 /ByteRange 或格式錯誤", + "Signature scheme {{kind}} not implemented": "尚未實作簽章機制 {{kind}}", + "Signature {{n}}": "簽章 {{n}}", + "Signatures": "簽章", + "Signed By": "簽署者", + "Signed On": "簽署日期", + "Signed PDF Not Changed": "已簽署的 PDF 未變更", + "Signed PDF downloaded successfully!": "已成功下載已簽署的 PDF!", + "Signed PDF saved successfully!": "已成功儲存已簽署的 PDF!", + "Simple (1, 2, 3)": "簡單(1, 2, 3)", + "Simplify large color profiles": "簡化大型色彩設定檔", + "Skew Threshold": "傾斜門檻", + "Skip": "略過", + "Skip All": "全部略過", + "Skip Remaining": "略過其餘", + "Skip this file": "略過此檔案", + "Skipped: {{join}}.": "已略過:{{join}}。", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "檔案較小,但只有支援 Brotli 的閱讀器才能開啟,例如 Firefox、MuPDF 1.26+ 與 Ghostscript 10.06+。", + "Some files were skipped because they are not supported images.": "部分檔案已略過,因為不是支援的圖片。", + "Some files were skipped. Only BMP files are allowed.": "部分檔案已略過。僅允許 BMP 檔案。", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "部分檔案已略過。僅允許 HEIC/HEIF 檔案。", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "部分檔案已略過。僅允許 JPG、JPEG、JP2 與 JPX 檔案。", + "Some files were skipped. Only PDF files are allowed.": "部分檔案已略過。僅允許 PDF 檔案。", + "Some files were skipped. Only PNG images are allowed.": "部分檔案已略過。僅允許 PNG 圖片。", + "Some files were skipped. Only SVG graphics are allowed.": "部分檔案已略過。僅允許 SVG 圖形。", + "Some files were skipped. Only TIFF files are allowed.": "部分檔案已略過。僅允許 TIFF 檔案。", + "Some files were skipped. Only WebP images are allowed.": "部分檔案已略過。僅允許 WebP 圖片。", + "Some files were skipped. Only supported image formats are allowed.": "部分檔案已略過。僅允許支援的圖片格式。", + "Some files were skipped. Only text files are allowed.": "部分檔案已略過。僅允許文字檔案。", + "Some pages could not be processed. Please try again.": "部分頁面無法處理。請再試一次。", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "部分遮蓋標記無法套用,因此未下載檔案。請在編輯器中套用或移除這些標記後再試一次。", + "Spacing": "間距", + "Split PDF": "分割 PDF", + "Split by Bookmarks": "依書籤分割", + "Split pages into tile grid for poster printing": "將頁面分割成拼貼格線,以便列印海報", + "Split pages vertically or horizontally": "垂直或水平分割頁面", + "Splitting PDF pages...": "正在分割 PDF 頁面...", + "Splitting PDF...": "正在分割 PDF...", + "Spreadsheets": "試算表", + "Standard (192 DPI)": "標準(192 DPI)", + "Standard Size": "標準尺寸", + "Standardize all pages to a target size": "將所有頁面統一為目標尺寸", + "Standardizing pages...": "正在統一頁面尺寸...", + "Stitch all pages into one continuous page": "將所有頁面接成一個連續的頁面", + "Straighten skewed PDF pages": "校正傾斜的 PDF 頁面", + "Strip all annotations": "移除所有註解", + "Style": "樣式", + "Style Changed": "樣式已變更", + "Style changed ({{length}} regions)": "樣式已變更({{length}} 個區域)", + "Subject": "主旨", + "Subset embedded fonts": "子集化內嵌字型", + "Success": "成功", + "Success!": "成功!", + "Successfully converted {{length}} CSV file(s) to PDF.": "已成功將 {{length}} 個 CSV 檔案轉換為 PDF。", + "Successfully converted {{length}} Excel file(s) to PDF.": "已成功將 {{length}} 個 Excel 檔案轉換為 PDF。", + "Successfully converted {{length}} ODT file(s) to PDF.": "已成功將 {{length}} 個 ODT 檔案轉換為 PDF。", + "Successfully converted {{length}} PDF(s) to DOCX.": "已成功將 {{length}} 個 PDF 轉換為 DOCX。", + "Successfully converted {{length}} PDF(s) to Markdown.": "已成功將 {{length}} 個 PDF 轉換為 Markdown。", + "Successfully converted {{length}} PDF(s) to {{level}}.": "已成功將 {{length}} 個 PDF 轉換為 {{level}}。", + "Successfully converted {{length}} PSD files to a single PDF.": "已成功將 {{length}} 個 PSD 檔案轉換為單一 PDF。", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "已成功將 {{length}} 個 PowerPoint 檔案轉換為 PDF。", + "Successfully converted {{length}} RTF file(s) to PDF.": "已成功將 {{length}} 個 RTF 檔案轉換為 PDF。", + "Successfully converted {{length}} Word document(s) to PDF.": "已成功將 {{length}} 份 Word 文件轉換為 PDF。", + "Successfully converted {{length}} files to PDF.": "已成功將 {{length}} 個檔案轉換為 PDF。", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "已成功將 {{length}} 個 {{TOOL_NAME}} 檔案轉換為 PDF。", + "Successfully converted {{name}} to DOCX.": "已成功將 {{name}} 轉換為 DOCX。", + "Successfully converted {{name}} to Markdown.": "已成功將 {{name}} 轉換為 Markdown。", + "Successfully converted {{name}} to PDF.": "已成功將 {{name}} 轉換為 PDF。", + "Successfully converted {{name}} to {{level}}.": "已成功將 {{name}} 轉換為 {{level}}。", + "Successfully extracted PDF for AI/LLM use.": "已成功擷取 PDF 供 AI/LLM 使用。", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "已成功擷取 {{completed}} 個 PDF 供 AI/LLM 使用。", + "Successfully rasterized PDF at {{dpi}} DPI.": "已成功以 {{dpi}} DPI 點陣化 PDF。", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "已成功以 {{dpi}} DPI 點陣化 {{completed}} 個 PDF。", + "Supported: CBZ, CBR": "支援:CBZ、CBR", + "Supported: DOC, DOCX, ODT, RTF": "支援:DOC、DOCX、ODT、RTF", + "Supported: EML, MSG": "支援:EML、MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "支援:JPG、PNG、BMP、GIF、TIFF、WebP、HEIC、PSD、SVG、PNM、PGM、PBM、PPM、PAM、JXR、JPX、JP2", + "Supported: PPT, PPTX, ODP": "支援:PPT、PPTX、ODP", + "Supported: VSD, VSDX": "支援:VSD、VSDX", + "Supported: XLSX, XLS, ODS, CSV": "支援:XLSX、XLS、ODS、CSV", + "Supported: XPS, OXPS": "支援:XPS、OXPS", + "Switches apps": "切換應用程式", + "Switches tabs": "切換分頁", + "Table of Contents": "目錄", + "Table {{n}} (Page {{page}})": "表格 {{n}}(第 {{page}} 頁)", + "Tabloid": "Tabloid", + "Target Field": "目標欄位", + "Target Kilobytes": "目標 KB 數", + "Target Not Reached": "未達目標", + "Target Size": "目標大小", + "Technical Details": "技術細節", + "Temperature": "色溫", + "Template \"{{name}}\" loaded.": "已載入範本「{{name}}」。", + "Template \"{{name}}\" saved.": "已儲存範本「{{name}}」。", + "Text": "文字", + "Text Color": "文字色彩", + "Text Files": "文字檔案", + "Text color changed successfully!": "已成功變更文字色彩!", + "Text converted to PDF successfully!": "已成功將文字轉換為 PDF!", + "Text extracted successfully!": "已成功擷取文字!", + "Text to PDF": "文字轉 PDF", + "That password did not open any of the remaining files.": "該密碼無法開啟其餘任何檔案。", + "The PDF file(s) do not contain any attachments to extract.": "這些 PDF 檔案沒有可擷取的附件。", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "此 PDF 共 {{totalPages}} 頁,無法被 {{nValue}} 整除。最後一個 PDF 將包含 {{remainder}} 頁。", + "The PDF might be corrupted or password protected.": "PDF 可能已損毀或受密碼保護。", + "The PDF might be corrupted or password-protected.": "PDF 可能已損毀或受密碼保護。", + "The PDF might be corrupted.": "PDF 可能已損毀。", + "The PDF viewer is still initializing.": "PDF 檢視器仍在初始化。", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF 已下載,但以下步驟未能完成:{{join}}。這些步驟涵蓋的內容可能仍留在檔案中。", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "該網址傳回了非預期的內容類型:{{contentType}}。預期為 JavaScript 檔案。", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "/ByteRange 排除的位元組並非剛好是十六進位編碼的簽章", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "/ByteRange 排除的位元組不是此簽章的 /Contents", + "The compression engine returned an unreadable result.": "壓縮引擎傳回了無法讀取的結果。", + "The compression engine stopped unexpectedly.": "壓縮引擎意外停止。", + "The current password you entered is incorrect. Please try again.": "您輸入的目前密碼不正確。請再試一次。", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "上傳的 PDF 中已存在以下欄位名稱:{{conflictList}}。請先重新命名這些欄位再下載。", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "以下欄位名稱重複使用:{{duplicateList}}。請先將這些欄位重新命名為不重複的名稱再下載。", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "指定的頁數({{length}})與文件目前的頁數({{currentGridCount}})不符。請提供所有頁面的完整排序。", + "The password you entered is incorrect. Please try again.": "您輸入的密碼不正確。請再試一次。", + "The password you entered is wrong or the file is corrupted.": "您輸入的密碼錯誤,或檔案已損毀。", + "The provided file could not be loaded as an image. It may be corrupted.": "無法將提供的檔案載入為圖片。檔案可能已損毀。", + "The requested OCR language is not available: {{unavailableText}}.": "無法使用所要求的 OCR 語言:{{unavailableText}}。", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "指定的頁面順序不完整,或含有無效的頁碼。請確認每一個原始頁面都有指定新的位置。", + "These files are not valid PDFs, so they were not added: {{names}}.": "這些檔案不是有效的 PDF,因此未加入:{{names}}。", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "這些檔案受密碼保護:{{names}}。請在檔案卡片上輸入密碼,或將其移除,然後再次壓縮。", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "此 BentoPDF 版本僅內建 {{availableText}} 的 OCR 資料。", + "This PDF does not contain any digital signatures.": "此 PDF 不含任何數位簽章。", + "This PDF has no layers (OCG).": "此 PDF 沒有圖層(OCG)。", + "This PDF is password-protected. Please enter the current password to proceed.": "此 PDF 受密碼保護。請輸入目前的密碼以繼續。", + "This document contains pages with different dimensions:": "此文件包含不同尺寸的頁面:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "此文件有 1 個尚未套用的塗黑標記。在套用標記之前,其下方的內容仍保留在檔案中。要套用所有標記並下載嗎?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "此文件有 {{count}} 個尚未套用的塗黑標記。在套用標記之前,其下方的內容仍保留在檔案中。要套用所有標記並下載嗎?", + "This feature requires {{name}} to be configured.": "此功能需要先設定 {{name}}。", + "This file is not a valid PDF.": "此檔案不是有效的 PDF。", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "此模組採用 AGPL-3.0 授權。進行設定即表示您同意其授權條款。", + "This tool has been disabled": "此工具已停用", + "This tool is not available in your deployment. Contact your administrator for more information.": "您的部署環境無法使用此工具。如需更多資訊,請聯絡您的管理員。", + "Threshold": "門檻", + "Tile": "拼貼", + "Tile Gap X": "拼貼間距 X", + "Tile Gap Y": "拼貼間距 Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "時間戳記", + "Timestamp Failed": "時間戳記失敗", + "Tint": "色調", + "Title": "標題", + "To actually fill or change the options, use our PDF Form Filler tool.": "若要實際填寫或變更選項,請使用我們的 PDF 表單填寫工具。", + "Toggle": "切換", + "Toggle style": "切換樣式", + "Toggle sync scroll": "切換同步捲動", + "Tool Unavailable": "工具無法使用", + "Tooltip / Help Text": "工具提示/說明文字", + "Top": "上", + "Top Center": "上方置中", + "Top Left": "左上", + "Top Right": "右上", + "Top edge in points": "上邊緣(單位為點)", + "Total Pages": "總頁數", + "Transparent Background": "透明背景", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "對每張圖片比較 JPEG 2000 與 JPEG,並保留較小的結果。", + "Trim margins from all pages": "裁掉所有頁面的邊界", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "信任驗證:{{length}} 個簽章中有 {{trustVerified}} 個已通過自訂憑證驗證", + "Trusted": "受信任", + "Trusted certificate loaded": "已載入受信任憑證", + "Tsa Url": "TSA 網址", + "Turns off quality, resolution and every other lossy image step.": "關閉品質、解析度及其他所有會造成失真的圖片處理步驟。", + "UPC-A": "UPC-A", + "URL": "網址", + "URL must start with http:// or https://": "網址必須以 http:// 或 https:// 開頭", + "Ultra (384 DPI)": "超高(384 DPI)", + "Unable to decrypt the PDF with the provided password.": "無法使用提供的密碼解密 PDF。", + "Unable to repair any of the uploaded PDF files.": "無法修復任何已上傳的 PDF 檔案。", + "Unembed standard fonts": "取消內嵌標準字型", + "Unembed standard-font look-alikes": "取消內嵌外觀近似標準字型的字型", + "Unexpected delimiter in content stream": "內容串流中出現非預期的分隔符號", + "Unexpected reply from the engine.": "引擎傳回了非預期的回應。", + "Uniform": "均勻", + "Unique Page Sizes": "不重複的頁面尺寸", + "Unknown": "未知", + "Unknown error": "未知的錯誤", + "Unknown error occurred in worker.": "worker 發生未知的錯誤。", + "Unknown error occurred.": "發生未知的錯誤。", + "Unlock": "解鎖", + "Unlock All": "全部解鎖", + "Unlock Remaining ({{remaining}})": "解鎖其餘檔案({{remaining}})", + "Unlocked": "已解鎖", + "Unlocked {{unlocked}} of {{length}} files.": "已解鎖 {{length}} 個檔案中的 {{unlocked}} 個。", + "Unlocking...": "正在解鎖...", + "Unresolved optional content reference": "未解析的選用內容參照", + "Unsupported ECDSA curve in signer certificate": "簽署者憑證使用了不支援的 ECDSA 曲線", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "不支援的圖片。浮水印請使用 PNG 或 JPG。", + "Unsupported digest OID {{digestOid}}": "不支援的摘要 OID {{digestOid}}", + "Unsupported file type: .{{ext}}": "不支援的檔案類型:.{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "不支援的簽章演算法 OID {{oid}}", + "Unterminated array or dictionary in content stream": "內容串流中的陣列或字典未結束", + "Unterminated hex string in content stream": "內容串流中的十六進位字串未結束", + "Unterminated inline image in content stream": "內容串流中的內嵌圖片未結束", + "Unterminated string in content stream": "內容串流中的字串未結束", + "Unverified: Unsupported Signature Algorithm": "未驗證:不支援的簽章演算法", + "Updating metadata...": "正在更新中繼資料...", + "Upload Certificate": "上傳憑證", + "Upload Comics": "上傳漫畫", + "Upload Documents": "上傳文件", + "Upload EPUB Files": "上傳 EPUB 檔案", + "Upload Email Files": "上傳電子郵件檔案", + "Upload FB2 Files": "上傳 FB2 檔案", + "Upload Images": "上傳圖片", + "Upload JSON Files": "上傳 JSON 檔案", + "Upload MOBI Files": "上傳 MOBI 檔案", + "Upload Markdown Files": "上傳 Markdown 檔案", + "Upload ODG Files": "上傳 ODG 檔案", + "Upload PDFs": "上傳 PDF", + "Upload PUB Files": "上傳 PUB 檔案", + "Upload Pages Files": "上傳 Pages 檔案", + "Upload Presentations": "上傳簡報", + "Upload SVG Files": "上傳 SVG 檔案", + "Upload Spreadsheets": "上傳試算表", + "Upload Text Files": "上傳文字檔案", + "Upload Visio Files": "上傳 Visio 檔案", + "Upload WPD Files": "上傳 WPD 檔案", + "Upload WPS Files": "上傳 WPS 檔案", + "Upload XML Files": "上傳 XML 檔案", + "Upload XPS Files": "上傳 XPS 檔案", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "上傳 PDF 並點選「產生預覽」即可查看小冊子版面", + "Upload images and convert to PDF": "上傳圖片並轉換為 PDF", + "Upload one or more PDF files": "上傳一個或多個 PDF 檔案", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "大寫 A-Z、數字 0-9,以及 - . $ / + % 空格", + "Use same password for all files": "所有檔案使用相同密碼", + "User Password": "使用者密碼", + "VSD to PDF": "VSD 轉 PDF", + "Valid From": "有效起始日", + "Valid Signature": "簽章有效", + "Valid Until": "有效期限", + "Validating {{n}} of {{length}}: {{name}}": "正在驗證第 {{n}} 個,共 {{length}} 個:{{name}}", + "Validating...": "正在驗證...", + "Value": "值", + "Value (e.g., Marketing)": "值(例如 Marketing)", + "Vertical": "垂直", + "Viewer not ready": "檢視器尚未就緒", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "檢視器尚未就緒。請上傳 PDF 並等待載入完成。", + "Visibility": "可見度", + "Visio Files": "Visio 檔案", + "WPD to PDF": "WPD 轉 PDF", + "WPS Files": "WPS 檔案", + "WPS to PDF": "WPS 轉 PDF", + "Watermark": "浮水印", + "Watermark added successfully!": "已成功新增浮水印!", + "Web Crypto API not available in this context": "此環境無法使用 Web Crypto API", + "Web Crypto import/verify failed: {{error}}": "Web Crypto 匯入/驗證失敗:{{error}}", + "WebP": "WebP", + "Whitelist": "允許清單", + "Width ({{unit}})": "寬度({{unit}})", + "Word": "Word", + "Word Documents": "Word 文件", + "Word to PDF": "Word 轉 PDF", + "WordPerfect Files": "WordPerfect 檔案", + "Worker crashed": "Worker 已當機", + "Worker error occurred. Check console for details.": "Worker 發生錯誤。詳細資訊請查看主控台。", + "Workflow completed": "工作流程已完成", + "Wrong password": "密碼錯誤", + "Wrong password for: {{join}}": "以下檔案的密碼錯誤:{{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "「{{name}}」的密碼錯誤,或解密失敗。", + "X Position": "X 位置", + "X: {{pdfX}}, Y: {{pdfY}} ": "座標 X:{{pdfX}},Y:{{pdfY}} ", + "XML Files": "XML 檔案", + "XML to PDF": "XML 轉 PDF", + "XMP Metadata": "XMP 中繼資料", + "XPS Files": "XPS 檔案", + "XPS to PDF": "XPS 轉 PDF", + "Y Position": "Y 位置", + "Year must be between 1900 and 2100": "年份必須介於 1900 到 2100 之間", + "Yellow": "黃色", + "Yellowish": "偏黃", + "You cannot delete the last page of the document.": "您無法刪除文件的最後一頁。", + "Your PDF has been cropped and the download has started.": "您的 PDF 已裁切完成,並已開始下載。", + "Your PDF has been downloaded successfully.": "您的 PDF 已成功下載。", + "Your PDF has been posterized.": "您的 PDF 已完成色調分離。", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "您的遮蓋已套用到頁面上,但此檔案已加密,因此 BentoPDF 無法同時移除其屬性、書籤與附件中殘留的遮蓋文字副本。若要完整清除,請遮蓋未加密的副本,之後再用「保護 PDF」加上密碼。仍要下載嗎?", + "Your workflow needs at least one input node and one output node to run.": "您的工作流程至少需要一個輸入節點和一個輸出節點才能執行。", + "ZIP archive created successfully!": "已成功建立 ZIP 壓縮檔!", + "Zoom(%)": "縮放(%)", + "e.g. dd/mm/yyyy HH:MM:ss": "例如 dd/mm/yyyy HH:MM:ss", + "form": "表單", + "https://example.com": "https://example.com", + "signature found": "個簽章", + "signatures found": "個簽章", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} 個節點", + "{{count}} nodes": "{{count}} 個節點", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 頁", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} 頁", + "{{length}} Files Need a Password": "{{length}} 個檔案需要密碼", + "{{length}} PDF file(s) selected": "已選取 {{length}} 個 PDF 檔案", + "{{length}} PDF files selected": "已選取 {{length}} 個 PDF 檔案", + "{{length}} attachment(s) extracted successfully!": "已成功擷取 {{length}} 個附件!", + "{{length}} file • {{totalPages}} total pages": "{{length}} 個檔案 • 共 {{totalPages}} 頁", + "{{length}} file(s) attached successfully.": "已成功附加 {{length}} 個檔案。", + "{{length}} files • {{totalPages}} total pages": "{{length}} 個檔案 • 共 {{totalPages}} 頁", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} 此檔案原本受密碼保護,因此壓縮後的副本沒有密碼。請使用「保護 PDF」重新加上密碼。", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}}({{size}},{{totalPageCount}} 頁)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} 已有數位簽章,因此維持原樣。壓縮會破壞簽章。若仍要壓縮,請在自訂設定中開啟「覆寫內容保護」,其簽章將被移除。", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} 不是有效的 PDF,因此未加入。", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} 受密碼保護。請在檔案卡片上輸入密碼,然後再次壓縮。", + "{{name}}... (p{{pageNumber}})": "{{name}}...(第 {{pageNumber}} 頁)", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • 無法載入頁數", + "{{size}} • Loading pages...": "{{size}} • 正在載入頁面...", + "{{size}} • Loading...": "{{size}} • 載入中...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} 頁", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} 頁", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} 頁", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} 頁", + "{{size}} • {{value}} pages": "{{size}} • {{value}} 頁", + "{{successCount}} PDF(s) decrypted successfully.": "已成功解密 {{successCount}} 個 PDF。", + "{{successCount}} PDF(s) linearized successfully.": "已成功線性化 {{successCount}} 個 PDF。", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} 頁 → {{numSheets}} 張輸出紙張", + "{{validCount}} valid": "{{validCount}} 個有效", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}:1 頁", + "• {{label}}: {{count}} pages": "• {{label}}:{{count}} 頁" +} diff --git a/public/locales/zh/common.json b/public/locales/zh/common.json index 164ea18c..43b03f29 100644 --- a/public/locales/zh/common.json +++ b/public/locales/zh/common.json @@ -9,7 +9,8 @@ "openMainMenu": "打开主菜单", "language": "语言", "searchLanguage": "搜索语言…", - "noLanguagesFound": "未找到语言" + "noLanguagesFound": "未找到语言", + "breadcrumb": "面包屑导航" }, "donation": { "message": "喜欢 BentoPDF?帮助我们保持免费和开源!", @@ -236,6 +237,10 @@ "aboutUs": "关于我们", "faqLink": "常见问题", "contactUs": "联系我们", + "tools": "工具", + "pdfConverter": "PDF 转换器", + "pdfSecurity": "PDF 安全", + "mergeSplit": "合并和拆分 PDF", "legal": "法律", "termsAndConditions": "服务条款", "privacyPolicy": "隐私政策", diff --git a/public/locales/zh/tools.json b/public/locales/zh/tools.json index 92438621..a18a7a66 100644 --- a/public/locales/zh/tools.json +++ b/public/locales/zh/tools.json @@ -27,7 +27,22 @@ "name": "合并 PDF", "subtitle": "将多个 PDF 合并为一个文件。保留书签。", "retainPageLabels": "保留每个文件的原始页面标签", - "retainPageLabelsHint": "关闭(默认):合并后的 PDF 使用自然页码 1–N。开启:保留每个文件的原始页面标签(可能产生重复标签)。" + "retainPageLabelsHint": "关闭(默认):合并后的 PDF 使用自然页码 1–N。开启:保留每个文件的原始页面标签(可能产生重复标签)。", + "removeDuplicateFonts": "移除重复字体", + "alert": { + "thumbnailError": "无法渲染页面缩略图", + "noSelection": "未选择要合并的文件或页面。", + "mergeSuccess": "PDF 合并成功!", + "mergeFailed": "PDF 合并失败。", + "mergeError": "PDF 合并失败。请检查所有文件是否有效且未受密码保护。", + "workerError": "合并进程中发生意外错误。", + "loadError": "无法加载一个或多个 PDF 文件" + }, + "loader": { + "renderingPreviews": "正在渲染页面预览...", + "merging": "正在合并 PDF...", + "loadingDocuments": "正在加载 PDF 文档..." + } }, "splitPdf": { "name": "分割 PDF", @@ -91,7 +106,7 @@ "tipRedoZ": "重做 (⇧⌘Z)", "tipFileDetails": "文件详情", "tipEditExistingContent": "编辑现有内容", - "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "编辑工具的作用范围——在内容密集的页面上缩小范围", + "tipWhatTheEditToolTouchesNarrowTheScopeOnBus": "编辑工具的作用范围:在内容密集的页面上缩小范围", "tipClickThePageToAddATextBox": "点击页面以添加文本框", "tipSpellCheckLanguage": "拼写检查语言", "tipFindAndReplace": "查找和替换", @@ -275,8 +290,8 @@ } }, "batesNumbering": { - "name": "Bates编号", - "subtitle": "在一个或多个PDF文件中添加连续的Bates编号。" + "name": "Bates 编号", + "subtitle": "在一个或多个PDF文件中添加连续的Bates 编号。" }, "addWatermark": { "name": "添加水印", @@ -503,7 +518,8 @@ "noFile": "无文件", "noFileExplanation": "请先上传 PDF 文件。", "conversionSuccess": "PDF 已成功转换为 TIFF!", - "conversionError": "无法将 PDF 转换为 TIFF。文件可能已损坏。" + "conversionError": "无法将 PDF 转换为 TIFF。文件可能已损坏。", + "conversionOutOfMemory": "转换时浏览器内存不足。请尝试降低 DPI,或取消勾选多页 TIFF 选项以逐页转换。" } }, "pdfToCbz": { @@ -537,7 +553,7 @@ } }, "pdfToGreyscale": { - "name": "PDF 转 灰度", + "name": "PDF 转灰度", "subtitle": "将所有颜色转换为黑白。" }, "pdfToJson": { @@ -793,7 +809,7 @@ }, "decryptPdf": { "name": "解密 PDF", - "subtitle": "通过移除密码保护解锁 PDF。" + "subtitle": "移除 PDF 的密码,使其可以自由打开。需要提供当前密码。" }, "flattenPdf": { "name": "扁平化 PDF", @@ -986,12 +1002,11 @@ "subtitle": "从 PDF 中提取表格并转换为 Excel (XLSX) 格式。" }, "pdfToText": { - "name": "PDF 转 文本", + "name": "PDF 转文本", "subtitle": "从 PDF 文件中提取文本并保存为纯文本文件 (.txt)。支持多个文件。", "noteLabel": "注意:", "noteText": "此工具仅适用于数字创建的 PDF。对于扫描文档或基于图像的 PDF,请改用我们的 OCR PDF 工具。", - "convertButton": "提取文本", - "note": "此工具仅适用于数字创建的 PDF。对于扫描文档或基于图像的 PDF,请使用我们的 OCR PDF 工具。" + "convertButton": "提取文本" }, "digitalSignPdf": { "name": "PDF 数字签名", @@ -1302,11 +1317,11 @@ "faqPrivacyAnswer": "当然!所有处理都在您的浏览器中进行。您的文件永远不会离开您的设备,确保完全隐私。" }, "unlockPdf": { - "name": "解密 PDF", - "subtitle": "通过移除密码保护解锁 PDF。" + "name": "解锁 PDF", + "subtitle": "移除 PDF 的密码,使其可以自由打开。需要提供当前密码。" }, "protectPdf": { - "name": "加密 PDF", + "name": "保护 PDF", "subtitle": "通过添加密码锁定您的 PDF。" } } diff --git a/public/locales/zh/ui.json b/public/locales/zh/ui.json new file mode 100644 index 00000000..02f1e505 --- /dev/null +++ b/public/locales/zh/ui.json @@ -0,0 +1,1644 @@ +{ + "(corrected)": "(已更正)", + "({{size}})": "({{size}})", + "({{value}} KB)": "({{value}} KB)", + "+ {{n}} more...": "+ 另外 {{n}} 项...", + "- Error parsing XMP XML. Displaying raw. -": "- 解析 XMP XML 时出错,正在显示原始内容。 -", + "- No Info Dictionary data found -": "- 未找到信息字典数据 -", + "- No XMP metadata found -": "- 未找到 XMP 元数据 -", + "- No interactive form fields found -": "- 未找到交互式表单字段 -", + "- No parseable XMP properties found -": "- 未找到可解析的 XMP 属性 -", + "-- Select existing group --": "-- 选择现有分组 --", + "/ {{total}}": "/ {{total}}", + "0.1° (Very Sensitive)": "0.1°(非常灵敏)", + "0.5° (Default)": "0.5°(默认)", + "1.0° (Normal)": "1.0°(正常)", + "100 (Fast)": "100(快速)", + "150 (Default)": "150(默认)", + "1x2 (Booklet)": "1x2(小册子)", + "2.0° (Less Sensitive)": "2.0°(较不灵敏)", + "200 (Better)": "200(较好)", + "200 (Good)": "200(良好)", + "2x2 (4-up)": "2x2(4 合 1)", + "2x4 (8-up)": "2x4(8 合 1)", + "300 (Best Quality)": "300(最佳质量)", + "300 (Print)": "300(打印)", + "4x4 (16-up)": "4x4(16 合 1)", + "600 (High Quality)": "600(高质量)", + "72 (Screen)": "72(屏幕)", + "90° Clockwise": "顺时针 90°", + "90° Counter-clockwise": "逆时针 90°", + "A field named \"{{fieldName}}\" already exists. Please rename this field to use a unique name before downloading.": "名为“{{fieldName}}”的字段已存在。请在下载前将此字段重命名为唯一的名称。", + "A new version of BentoPDF is available. Reload to update?": "BentoPDF 有新版本可用。重新加载以更新吗?", + "A single PDF file": "单个 PDF 文件", + "A template with this name already exists.": "已存在同名模板。", + "ASCII characters (letters, numbers, symbols)": "ASCII 字符(字母、数字、符号)", + "Action": "操作", + "Add Blank Page": "添加空白页", + "Add Bookmark": "添加书签", + "Add Child Bookmark": "添加子书签", + "Add Child Layer": "添加子图层", + "Add More Comics": "添加更多漫画", + "Add More Documents": "添加更多文档", + "Add More EPUB Files": "添加更多 EPUB 文件", + "Add More Email Files": "添加更多电子邮件文件", + "Add More FB2 Files": "添加更多 FB2 文件", + "Add More Files": "添加更多文件", + "Add More Images": "添加更多图片", + "Add More JSON Files": "添加更多 JSON 文件", + "Add More MOBI Files": "添加更多 MOBI 文件", + "Add More Markdown Files": "添加更多 Markdown 文件", + "Add More ODG Files": "添加更多 ODG 文件", + "Add More PUB Files": "添加更多 PUB 文件", + "Add More Pages Files": "添加更多 Pages 文件", + "Add More Presentations": "添加更多演示文稿", + "Add More SVG Files": "添加更多 SVG 文件", + "Add More Spreadsheets": "添加更多电子表格", + "Add More Text Files": "添加更多文本文件", + "Add More Visio Files": "添加更多 Visio 文件", + "Add More WPD Files": "添加更多 WPD 文件", + "Add More WPS Files": "添加更多 WPS 文件", + "Add More XML Files": "添加更多 XML 文件", + "Add More XPS Files": "添加更多 XPS 文件", + "Add a new layer to get started!": "添加一个新图层即可开始!", + "Add a text box": "添加文本框", + "Add an RFC 3161 document timestamp": "添加 RFC 3161 文档时间戳", + "Add an image": "添加图片", + "Add at least one node to run the workflow.": "请至少添加一个节点后再运行工作流。", + "Add child": "添加子项", + "Add child layer": "添加子图层", + "Add header and footer text": "添加页眉和页脚文本", + "Add page numbers": "添加页码", + "Add searchable text layer via OCR": "通过 OCR 添加可搜索的文本层", + "Add text watermark": "添加文字水印", + "Add/Edit/Extract Attachments": "添加/编辑/提取附件", + "Added": "已添加", + "Added \"{{afterText}}\"": "已添加“{{afterText}}”", + "Added image ({{width}}×{{height}})": "已添加图片({{width}}×{{height}})", + "Added {{insertCount}} blank page successfully!": "已成功添加 {{insertCount}} 个空白页!", + "Added {{insertCount}} blank pages successfully!": "已成功添加 {{insertCount}} 个空白页!", + "Adding header & footer...": "正在添加页眉和页脚...", + "Adding page numbers...": "正在添加页码...", + "Adding watermark...": "正在添加水印...", + "Adding {{insertCount}} blank page...": "正在添加 {{insertCount}} 个空白页...", + "Adding {{insertCount}} blank pages...": "正在添加 {{insertCount}} 个空白页...", + "Adding {{name}} ({{n}}/{{length}})...": "正在添加 {{name}}({{n}}/{{length}})...", + "Adjust Colors": "调整颜色", + "Adjust brightness, contrast, and colors": "调整亮度、对比度和颜色", + "Advanced": "高级", + "Advanced Feature Required": "需要高级功能", + "Advanced Settings": "高级设置", + "After Page": "位于页面之后", + "After Page...": "位于页面之后...", + "Align Objects": "对齐对象", + "Alignment": "对齐方式", + "All": "全部", + "All files repaired successfully!": "所有文件均已成功修复!", + "Alternate Merge": "交替合并", + "Alternating and mixing pages...": "正在交替混合页面...", + "Always resample to that resolution": "始终重新采样到该分辨率", + "An error occurred during compression. Error: {{error}}": "压缩时出错。错误:{{error}}", + "An error occurred during conversion. Error: {{error}}": "转换时出错。错误:{{error}}", + "An error occurred during conversion. Error: {{message}}": "转换时出错。错误:{{message}}", + "An error occurred during cropping.": "裁剪时出错。", + "An error occurred during extraction. Error: {{error}}": "提取时出错。错误:{{error}}", + "An error occurred during rasterization. Error: {{error}}": "栅格化时出错。错误:{{error}}", + "An error occurred during sanitization: {{msg}}": "清理时出错:{{msg}}", + "An error occurred while combining pages.": "合并页面时出错。", + "An error occurred while creating the N-Up PDF.": "创建 N-Up PDF 时出错。", + "An error occurred while creating the booklet.": "创建小册子时出错。", + "An error occurred while dividing the PDF.": "分割 PDF 时出错。", + "An error occurred while mixing the PDFs.": "混合 PDF 时出错。", + "An error occurred while standardizing pages.": "统一页面尺寸时出错。", + "An error occurred while trying to remove metadata.": "尝试移除元数据时出错。", + "An error occurred: {{error}}": "出错了:{{error}}", + "An error occurred: {{error}}.": "出错了:{{error}}。", + "An owner password is required when setting permissions": "设置权限时需要所有者密码", + "An unexpected error occurred during the repair process.": "修复过程中发生意外错误。", + "An unexpected error occurred.": "发生意外错误。", + "Analyzing data structure...": "正在分析数据结构...", + "Analyzing full PDF metadata...": "正在分析完整的 PDF 元数据...", + "Analyzing signatures...": "正在分析签名...", + "Angle": "角度", + "Annotations removed successfully!": "注释已成功移除!", + "Any text, URL, or data": "任意文本、URL 或数据", + "Application": "应用程序", + "Apply a digital signature to PDF": "为 PDF 添加数字签名", + "Apply and download": "应用并下载", + "Apply redactions?": "应用涂黑吗?", + "Apply scanner simulation effect": "应用扫描仪模拟效果", + "Applying Bates numbers...": "正在应用 Bates 编号...", + "Applying color adjustments...": "正在应用颜色调整...", + "Applying crop...": "正在应用裁剪...", + "Applying redactions...": "正在应用涂黑...", + "Applying rotations...": "正在应用旋转...", + "Applying scanner effect...": "正在应用扫描效果...", + "Applying timestamp...": "正在应用时间戳...", + "Applying {{replace}}...": "正在应用{{replace}}...", + "Archive contains an oversized image entry.": "压缩包中包含超大的图片。", + "Archive has too many images (max {{MAX_CBZ_PAGES}}).": "压缩包中的图片过多(最多 {{MAX_CBZ_PAGES}} 张)。", + "Archive is too large when decompressed.": "压缩包解压后过大。", + "Are you sure you want to reset? All your work will be lost.": "确定要重置吗?您所有的操作都将丢失。", + "Area (Coordinates)": "区域(坐标)", + "Area ({{unit}}²)": "面积({{unit}}²)", + "Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.": "Arial、Times New Roman 和 Courier New 会映射为内置的对应字体。仅在安全时应用。", + "Arrange multiple pages per sheet": "在每张纸上排列多个页面", + "Arrange pages for booklet printing": "为小册子打印排列页面", + "Aspect Ratio": "宽高比", + "At least one PDF document is required for export.": "导出至少需要一个 PDF 文档。", + "At least two valid PDFs are required.": "至少需要两个有效的 PDF。", + "Attaching files to PDF...": "正在将文件附加到 PDF...", + "Attachments updated successfully!": "附件已成功更新!", + "Author": "作者", + "Auto (Keep Original)": "自动(保持原样)", + "Back": "背面", + "Back to Home": "返回首页", + "Background Color": "背景颜色", + "Background color changed successfully!": "背景颜色已成功更改!", + "Barcode": "条形码", + "Barcode Format": "条形码格式", + "Barcode Value": "条形码内容", + "Bates numbers applied successfully! ({{batesStart}} through {{n}})": "Bates 编号已成功应用!({{batesStart}} 至 {{n}})", + "Beginning": "开头", + "Binarize": "二值化", + "Blank Position": "空白页位置", + "Blue": "蓝色", + "Blur": "模糊", + "Bold": "粗体", + "Bold & Italic": "粗体和斜体", + "Booklet": "小册子", + "Booklet created with {{numSheets}} sheets!": "已创建小册子,共 {{numSheets}} 张纸!", + "Bookmarks imported from JSON!": "已从 JSON 导入书签!", + "Bookmarks page": "书签页", + "Border": "边框", + "Border Color": "边框颜色", + "Bottom": "底部", + "Bottom Center": "底部居中", + "Bottom Left": "左下", + "Bottom Right": "右下", + "Bottom edge in points": "下边缘(以点为单位)", + "Brightness": "亮度", + "Brotli and rasterizing were skipped to keep it PDF/A.": "为保持 PDF/A,已跳过 Brotli 和栅格化。", + "Brotli compression (PDF 2.0)": "Brotli 压缩(PDF 2.0)", + "Browser Note:": "浏览器提示:", + "Building new PDF...": "正在构建新的 PDF...", + "Building page pairing model...": "正在构建页面配对模型...", + "Button": "按钮", + "ByteRange does not start at the beginning of the file": "ByteRange 不是从文件开头开始", + "ByteRange out of bounds": "ByteRange 超出范围", + "CBZ to PDF": "CBZ 转 PDF", + "CSV Loaded": "CSV 已加载", + "CSV file is empty": "CSV 文件为空", + "Cancel": "取消", + "Cannot Delete": "无法删除", + "Cannot access viewer controls. Please use the Download button in the PDF viewer toolbar above.": "无法访问查看器控件。请使用上方 PDF 查看器工具栏中的“下载”按钮。", + "Cannot delete all pages": "无法删除所有页面", + "Cannot delete all pages.": "无法删除所有页面。", + "Canvas context failed": "画布上下文创建失败", + "Canvas context unavailable": "画布上下文不可用", + "Canvas toBlob conversion failed.": "画布 toBlob 转换失败。", + "Canvas toBlob failed": "画布 toBlob 失败", + "Center": "居中", + "Certificate (.pfx, .p12, .pem)": "证书(.pfx、.p12、.pem)", + "Certificate Expired": "证书已过期", + "Certificate Password": "证书密码", + "Certificate unlocked": "证书已解锁", + "Change Certificate": "更换证书", + "Change background color": "更改背景颜色", + "Changing background color...": "正在更改背景颜色...", + "Changing text color...": "正在更改文本颜色...", + "Character": "字符", + "Checked State": "选中状态", + "Choose a valid page range.": "请选择有效的页面范围。", + "Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.": "请选择内置语言之一,或在重新构建离线包时将缺少的语言添加到 --ocr-languages。", + "Cleanup": "清理", + "Click on PDF to Pick Location": "点击 PDF 以选取位置", + "Click the button above, then click on the PDF where you want the bookmark to jump to": "请先点击上方按钮,然后在 PDF 中点击您希望书签跳转到的位置", + "Click to Upload Image": "点击上传图片", + "Clicking this field in the PDF will open a file picker to upload an image.": "在 PDF 中点击此字段将打开文件选择器以上传图片。", + "Clip invisible parts of images": "裁剪图片的不可见部分", + "Close": "关闭", + "Close (Esc)": "关闭(Esc)", + "Close panel": "关闭面板", + "Closes tab": "关闭标签页", + "Closes window": "关闭窗口", + "Code 128": "Code 128", + "Code 39": "Code 39", + "CoherentPDF (Bookmarks & Metadata)": "CoherentPDF(书签和元数据)", + "CoherentPDF is not configured. Please configure it in WASM Settings.": "CoherentPDF 未配置。请在 WASM 设置中进行配置。", + "CoherentPDF produced an empty decrypted file.": "CoherentPDF 生成了空的解密文件。", + "CoherentPDF: not configured.": "CoherentPDF:未配置。", + "Color": "颜色", + "Color adjustments applied successfully!": "颜色调整已成功应用!", + "Colors inverted successfully!": "颜色已成功反转!", + "Cols": "列", + "Combine multiple PDFs into one": "将多个 PDF 合并为一个", + "Combine to Single Page": "合并为单页", + "Combining pages...": "正在合并页面...", + "Comic Archives": "漫画压缩包", + "Comments and markup become part of the page. Form fields and links keep working.": "批注和标记将成为页面的一部分。表单字段和链接仍可使用。", + "Complete": "完成", + "Complete!": "完成!", + "Compress": "压缩", + "Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).": "已压缩 {{compressedCount}} 个 PDF。总大小从 {{totalOriginalSize}} 减小到 {{totalCompressedSize}}(节省 {{value}}%)。", + "Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.": "已压缩 {{compressedCount}} 个 PDF。总大小:{{totalCompressedSize}}。", + "Compressing multiple PDFs...": "正在压缩多个 PDF...", + "Compressing to {{size}}...": "正在压缩到 {{size}}...", + "Compressing {{n}}/{{length}}: {{name}}...": "正在压缩 {{n}}/{{length}}:{{name}}...", + "Compressing...": "正在压缩...", + "Compression Complete": "压缩完成", + "Compression Finished": "压缩完毕", + "Compression Level": "压缩级别", + "Configure": "配置", + "Confirm": "确认", + "Confirm Action": "确认操作", + "Conformance": "符合标准", + "Connected": "已连接", + "Contact Info": "联系信息", + "Content": "内容", + "Content hash does not match messageDigest attribute: PDF was modified after signing": "内容哈希与 messageDigest 属性不匹配:PDF 在签名后被修改过", + "Contrast": "对比度", + "Conversion Complete": "转换完成", + "Conversion Error": "转换错误", + "Conversion engine ready!": "转换引擎已就绪!", + "Conversion failed: could not create PDF/A definition": "转换失败:无法创建 PDF/A 定义", + "Convert Apple Pages documents to PDF": "将 Apple Pages 文档转换为 PDF", + "Convert EPUB ebooks to PDF": "将 EPUB 电子书转换为 PDF", + "Convert Excel spreadsheets to PDF": "将 Excel 电子表格转换为 PDF", + "Convert FB2 e-books to PDF": "将 FB2 电子书转换为 PDF", + "Convert JSON files to PDF": "将 JSON 文件转换为 PDF", + "Convert MOBI e-books to PDF": "将 MOBI 电子书转换为 PDF", + "Convert Markdown files to PDF": "将 Markdown 文件转换为 PDF", + "Convert Microsoft Publisher to PDF": "将 Microsoft Publisher 文件转换为 PDF", + "Convert OpenDocument Graphics to PDF": "将 OpenDocument 绘图文件转换为 PDF", + "Convert PDF pages to SVG": "将 PDF 页面转换为 SVG", + "Convert PDF pages to images (ZIP)": "将 PDF 页面转换为图片(ZIP)", + "Convert PDF tables to CSV": "将 PDF 表格转换为 CSV", + "Convert PDF tables to Excel": "将 PDF 表格转换为 Excel", + "Convert PDF to Markdown text": "将 PDF 转换为 Markdown 文本", + "Convert PDF to PDF/A for archiving": "将 PDF 转换为 PDF/A 以便存档", + "Convert PDF to Word document": "将 PDF 转换为 Word 文档", + "Convert PowerPoint presentations to PDF": "将 PowerPoint 演示文稿转换为 PDF", + "Convert SVG files to PDF": "将 SVG 文件转换为 PDF", + "Convert To Grayscale": "转换为灰度", + "Convert Visio diagrams (VSD/VSDX) to PDF": "将 Visio 图表(VSD/VSDX)转换为 PDF", + "Convert WPS Office documents to PDF": "将 WPS Office 文档转换为 PDF", + "Convert Word documents to PDF": "将 Word 文档转换为 PDF", + "Convert WordPerfect documents to PDF": "将 WordPerfect 文档转换为 PDF", + "Convert XML documents to PDF": "将 XML 文档转换为 PDF", + "Convert XPS/OXPS documents to PDF": "将 XPS/OXPS 文档转换为 PDF", + "Convert comic book archives (CBZ/CBR) to PDF": "将漫画压缩包(CBZ/CBR)转换为 PDF", + "Convert email files (.eml, .msg) to PDF": "将邮件文件(.eml、.msg)转换为 PDF", + "Convert fonts to vector outlines": "将字体转换为矢量轮廓", + "Convert plain text to PDF": "将纯文本转换为 PDF", + "Convert to grayscale": "转换为灰度", + "Convert to greyscale": "转换为灰度", + "Convert to image-based PDF": "转换为基于图像的 PDF", + "Converted {{length}} files ({{totalPages}} pages) to SVG!": "已将 {{length}} 个文件({{totalPages}} 页)转换为 SVG!", + "Converted {{pageCount}} pages to SVG!": "已将 {{pageCount}} 页转换为 SVG!", + "Converter not initialized": "转换器未初始化", + "Converting BMP to PDF...": "正在将 BMP 转换为 PDF...", + "Converting HEIC to PDF...": "正在将 HEIC 转换为 PDF...", + "Converting TIFF to PDF...": "正在将 TIFF 转换为 PDF...", + "Converting emails...": "正在转换邮件...", + "Converting files...": "正在转换文件...", + "Converting fonts to outlines...": "正在将字体转换为轮廓...", + "Converting images to PDF...": "正在将图片转换为 PDF...", + "Converting multiple PDFs to PDF/A...": "正在将多个 PDF 转换为 PDF/A...", + "Converting multiple RTF files to PDF...": "正在将多个 RTF 文件转换为 PDF...", + "Converting multiple files...": "正在转换多个文件...", + "Converting page {{n}} of {{pageCount}}...": "正在转换第 {{n}} 页,共 {{pageCount}} 页...", + "Converting to Markdown...": "正在转换为 Markdown...", + "Converting to SVG...": "正在转换为 SVG...", + "Converting to greyscale...": "正在转换为灰度...", + "Converting to {{level}}...": "正在转换为 {{level}}...", + "Converting {{name}}...": "正在转换 {{name}}...", + "Converting {{n}}/{{length}}: {{name}}...": "正在转换 {{n}}/{{length}}:{{name}}...", + "Converting...": "正在转换...", + "Copied": "已复制", + "Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.": "无法访问已盖章 PDF 的导出器。请改用查看器工具栏中的“导出 → PDF”按钮。", + "Could not add blank page.": "无法添加空白页。", + "Could not add blank pages.": "无法添加空白页。", + "Could not add header or footer.": "无法添加页眉或页脚。", + "Could not add page numbers.": "无法添加页码。", + "Could not add the watermark.": "无法添加水印。", + "Could not apply rotations.": "无法应用旋转。", + "Could not change text color.": "无法更改文本颜色。", + "Could not change the background color.": "无法更改背景颜色。", + "Could not create ZIP archive.": "无法创建 ZIP 压缩包。", + "Could not create canvas context.": "无法创建画布上下文。", + "Could not create comparison canvas context.": "无法创建对比画布上下文。", + "Could not create offscreen comparison canvas.": "无法创建离屏对比画布。", + "Could not create visual diff context.": "无法创建可视化差异上下文。", + "Could not create visual diff overlay context.": "无法创建可视化差异叠加层上下文。", + "Could not detect blank pages.": "无法检测空白页。", + "Could not display the page.": "无法显示该页面。", + "Could not export comparison PDF.": "无法导出对比 PDF。", + "Could not export the signed PDF. Please try again.": "无法导出已签名的 PDF。请重试。", + "Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.": "无法导出已盖章的 PDF。请改用查看器工具栏中的“导出 → PDF”按钮。", + "Could not extract signer public key": "无法提取签名者公钥", + "Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.": "在指定的 URL 找不到 {{testFile}}(HTTP {{status}})。请确认文件存在。", + "Could not fully analyze the PDF. It may be corrupted or have an unusual structure.": "无法完整分析该 PDF。它可能已损坏或结构异常。", + "Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}": "无法生成预览。文件可能已损坏或包含不受支持的功能。错误:{{message}}", + "Could not get canvas context": "无法获取画布上下文", + "Could not invert PDF colors.": "无法反转 PDF 颜色。", + "Could not load PDF. It may be corrupt or password-protected.": "无法加载 PDF。文件可能已损坏或受密码保护。", + "Could not load PDF. The file may be invalid, corrupted, or password-protected.": "无法加载 PDF。文件可能无效、已损坏或受密码保护。", + "Could not load the PDF engine. Please refresh the page and try again.": "无法加载 PDF 引擎。请刷新页面后重试。", + "Could not parse signer info": "无法解析签名者信息", + "Could not posterize the PDF.": "无法海报化该 PDF。", + "Could not process \"{{name}}\". The file may be corrupted.": "无法处理“{{name}}”。文件可能已损坏。", + "Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.": "无法进一步减小文件大小。原始大小:{{originalSize}},新大小:{{compressedSize}}。", + "Could not remove annotations.": "无法移除注释。", + "Could not remove blank pages.": "无法移除空白页。", + "Could not remove leftover data from the PDF.": "无法移除 PDF 中的残留数据。", + "Could not remove the redacted text from the document data, so the file was not downloaded.": "无法从文档数据中移除已涂黑的文本,因此未下载文件。", + "Could not reverse the PDF pages. Please check that your files are valid PDFs.": "无法反转 PDF 页面。请检查您的文件是否为有效的 PDF。", + "Could not update metadata. Please check that date formats are correct.": "无法更新元数据。请检查日期格式是否正确。", + "Count": "数量", + "Courier": "Courier", + "Courier Bold": "Courier Bold", + "Courier Bold Oblique": "Courier Bold Oblique", + "Courier Oblique": "Courier Oblique", + "Created": "创建时间", + "Creating Booklet...": "正在创建小册子...", + "Creating Excel file...": "正在创建 Excel 文件...", + "Creating N-Up PDF...": "正在创建 N-Up PDF...", + "Creating PDF from JPGs...": "正在从 JPG 创建 PDF...", + "Creating PDF from SVG files...": "正在从 SVG 文件创建 PDF...", + "Creating PDF...": "正在创建 PDF...", + "Creating ZIP archive...": "正在创建 ZIP 压缩包...", + "Creating ZIP file...": "正在创建 ZIP 文件...", + "Creating ZIP...": "正在创建 ZIP...", + "Creating table...": "正在创建表格...", + "Creator": "创建者", + "Crop": "裁剪", + "Crop complete! Your download has started.": "裁剪完成!下载已开始。", + "Cryptographic verification failed": "加密验证失败", + "Custom": "自定义", + "Custom Format": "自定义格式", + "Custom Height": "自定义高度", + "Custom Units": "自定义单位", + "Custom Width": "自定义宽度", + "Custom Zoom": "自定义缩放", + "Custom...": "自定义...", + "DataMatrix": "DataMatrix", + "Date Format": "日期格式", + "Decrease size": "缩小", + "Decrypt": "解密", + "Decrypting PDF...": "正在解密 PDF...", + "Decrypting {{name}} ({{n}}/{{length}})...": "正在解密 {{name}}({{n}}/{{length}})...", + "Decrypting {{n}} of {{length}}: {{name}}": "正在解密第 {{n}} 个,共 {{length}} 个:{{name}}", + "Decrypting...": "正在解密...", + "Decryption Failed": "解密失败", + "Delete": "删除", + "Delete \"{{title}}\"?": "删除“{{title}}”?", + "Delete Field": "删除字段", + "Delete Page": "删除页面", + "Delete Pages": "删除页面", + "Delete all {{length}} bookmark(s) ? ": "删除全部 {{length}} 个书签?", + "Delete layer": "删除图层", + "Delete {{size}} bookmark(s) ? ": "删除 {{size}} 个书签?", + "Deleted": "已删除", + "Deleted {{size}} page(s) successfully!": "已成功删除 {{size}} 页!", + "Deleting pages...": "正在删除页面...", + "Description": "描述", + "Description for screen readers": "供屏幕阅读器使用的说明", + "Deselect All": "取消全选", + "Deskew": "校正倾斜", + "Deskew PDF": "校正 PDF", + "Deskewed {{length}} file(s). {{value}}": "已校正 {{length}} 个文件。{{value}}", + "Deskewing {{name}}...": "正在校正 {{name}}...", + "Destination": "目标", + "Detecting blank pages...": "正在检测空白页...", + "Digest Algorithm:": "摘要算法:", + "Digital Sign": "数字签名", + "Direction": "方向", + "Divide Pages": "分割页面", + "Divide into boxes (0 to disable)": "分割为方框(0 表示禁用)", + "Document Properties": "文档属性", + "Document Type": "文档类型", + "Document properties": "文档属性", + "Document-level attachment": "文档级附件", + "Done: back to tools": "完成,返回工具", + "Download": "下载", + "Download Edited PDF": "下载编辑后的 PDF", + "Download anyway": "仍然下载", + "Download as PDF or ZIP automatically": "自动下载为 PDF 或 ZIP", + "Downloaded {{length}} PDF files in a ZIP archive.": "已将 {{length}} 个 PDF 文件下载为 ZIP 压缩包。", + "Downloads started for all files.": "所有文件均已开始下载。", + "Dpi": "DPI", + "Drops tagging, which screen readers rely on.": "会丢弃屏幕阅读器依赖的标签结构。", + "Duplicate Field Name": "字段名称重复", + "Duplicate Field Names": "字段名称重复", + "Duplicate Page": "复制页面", + "Duplicate Page Numbers": "页码重复", + "EAN-13": "EAN-13", + "ECDSA signature does not verify against signer public key": "ECDSA 签名无法通过签名者公钥验证", + "EPUB Files": "EPUB 文件", + "EPUB to PDF": "EPUB 转 PDF", + "EPUB/MOBI/FB2/XPS/CBZ to PDF": "EPUB/MOBI/FB2/XPS/CBZ 转 PDF", + "Edit": "编辑", + "Edit All": "全部编辑", + "Edit Bookmark": "编辑书签", + "Edit Bookmarks": "编辑书签", + "Edit Images": "编辑图片", + "Edit Metadata": "编辑元数据", + "Edit PDF metadata": "编辑 PDF 元数据", + "Edit Scope": "编辑范围", + "Edit Shapes": "编辑形状", + "Edit Text": "编辑文本", + "Edit tool": "编辑工具", + "Edit {{scopes}}": "编辑{{scopes}}", + "Email Files": "邮件文件", + "Email to PDF": "邮件转 PDF", + "Embedding files into PDF...": "正在将文件嵌入 PDF...", + "Empty signature bytes": "签名字节为空", + "Encrypt": "加密", + "Encrypt PDF with password": "使用密码加密 PDF", + "Encrypted file": "已加密文件", + "Encrypting PDF with 256-bit AES...": "正在使用 256 位 AES 加密 PDF...", + "Encryption Failed": "加密失败", + "Encryption resulted in an empty file.": "加密后得到的是空文件。", + "End": "结尾", + "Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.": "输入 0 可插入到开头,输入 {{pageCount}} 可插入到末尾。", + "Enter bookmark title": "输入书签标题", + "Enter name for child layer under \"{{Layer}}\":": "请输入“{{Layer}}”下子图层的名称:", + "Enter password": "输入密码", + "Enter password...": "输入密码...", + "Enter passwords for each encrypted file": "请为每个已加密的文件输入密码", + "Error": "错误", + "Error during execution": "执行时出错", + "Error generating PDF: {{error}}": "生成 PDF 时出错:{{error}}", + "Error loading PDF file. Please try again with a valid PDF.": "加载 PDF 文件时出错。请使用有效的 PDF 重试。", + "Error reading files: {{error}}": "读取文件时出错:{{error}}", + "Error saving PDF. Check console for details.": "保存 PDF 时出错。请查看控制台了解详情。", + "Error: {{error}}": "错误:{{error}}", + "Exactly 11 or 12 digits": "必须为 11 或 12 位数字", + "Exactly 12 or 13 digits": "必须为 12 或 13 位数字", + "Example of current format:": "当前格式示例:", + "Excel to PDF": "Excel 转 PDF", + "Existing Radio Groups": "现有单选按钮组", + "Export Error": "导出错误", + "Export Value": "导出值", + "Export failed": "导出失败", + "External processing module needed": "需要外部处理模块", + "Extract Images": "提取图片", + "Extract Pages": "提取页面", + "Extract Tables": "提取表格", + "Extract a range of pages": "提取一个范围的页面", + "Extract all images from PDF": "提取 PDF 中的所有图片", + "Extract pages as separate PDFs": "将页面提取为单独的 PDF", + "Extract text from PDF": "提取 PDF 中的文本", + "Extracted 1 table successfully!": "已成功提取 1 个表格!", + "Extracted text from {{length}} PDF files!": "已从 {{length}} 个 PDF 文件中提取文本!", + "Extracted {{completed}} PDF(s), failed {{failed}}.": "已提取 {{completed}} 个 PDF,{{failed}} 个失败。", + "Extracted {{length}} page(s) successfully!": "已成功提取 {{length}} 页!", + "Extracted {{length}} table(s) to Excel!": "已将 {{length}} 个表格提取到 Excel!", + "Extracted {{length}} tables successfully!": "已成功提取 {{length}} 个表格!", + "Extracting attachments from {{length}} file(s)...": "正在从 {{length}} 个文件中提取附件...", + "Extracting images from {{name}}...": "正在从 {{name}} 中提取图片...", + "Extracting pages...": "正在提取页面...", + "Extracting tables...": "正在提取表格...", + "Extracting text from file {{n}}/{{length}}: {{name}}...": "正在从文件 {{n}}/{{length}} 中提取文本:{{name}}...", + "Extracting text from multiple files...": "正在从多个文件中提取文本...", + "Extracting text from {{name}}...": "正在从 {{name}} 中提取文本...", + "Extracting text...": "正在提取文本...", + "Extracting {{name}} for AI ({{n}}/{{total}})...": "正在为 AI 提取 {{name}}({{n}}/{{total}})...", + "Extracting {{name}} for AI...": "正在为 AI 提取 {{name}}...", + "Extracting...": "正在提取...", + "Extraction Complete": "提取完成", + "Extraction Error": "提取错误", + "Extraction Partial": "部分提取", + "Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.": "提取完成!zip 文件中包含 {{length}} 个附件({{totalSize}})。下载已开始。", + "FB2 Files": "FB2 文件", + "FB2 to PDF": "FB2 转 PDF", + "Failed": "失败", + "Failed to acquire 2D canvas context": "无法获取 2D 画布上下文", + "Failed to add child layer": "添加子图层失败", + "Failed to apply Bates numbers.": "应用 Bates 编号失败。", + "Failed to apply color adjustments. The file might be corrupted.": "应用颜色调整失败。文件可能已损坏。", + "Failed to apply redactions.": "应用涂黑失败。", + "Failed to apply scanner effect. The file might be corrupted.": "应用扫描效果失败。文件可能已损坏。", + "Failed to attach files: {{error}}": "附加文件失败:{{error}}", + "Failed to convert BMP to PDF. One of the files may be invalid.": "将 BMP 转换为 PDF 失败。其中一个文件可能无效。", + "Failed to convert HEIC to PDF. One of the files may be invalid.": "将 HEIC 转换为 PDF 失败。其中一个文件可能无效。", + "Failed to convert PDF to CSV. {{message}}": "将 PDF 转换为 CSV 失败。{{message}}", + "Failed to convert PDF to Excel. {{message}}": "将 PDF 转换为 Excel 失败。{{message}}", + "Failed to convert PDF to SVG. {{message}}": "将 PDF 转换为 SVG 失败。{{message}}", + "Failed to convert PDF to greyscale. The file might be corrupted.": "将 PDF 转换为灰度失败。文件可能已损坏。", + "Failed to convert PDF. It may be image-based or corrupted.": "转换 PDF 失败。它可能是基于图像的或已损坏。", + "Failed to convert TIFF to PDF. One of the files may be invalid.": "将 TIFF 转换为 PDF 失败。其中一个文件可能无效。", + "Failed to convert images to PDF.": "将图片转换为 PDF 失败。", + "Failed to convert text to PDF. {{error}}": "将文本转换为 PDF 失败。{{error}}", + "Failed to convert {{filename}} to PNG": "将 {{filename}} 转换为 PNG 失败", + "Failed to copy metadata to clipboard.": "复制元数据到剪贴板失败。", + "Failed to create PDF.": "创建 PDF 失败。", + "Failed to create PNG blob": "创建 PNG blob 失败", + "Failed to create canvas context": "创建画布上下文失败", + "Failed to create split PDFs.": "创建拆分后的 PDF 失败。", + "Failed to decode image: {{name}}": "解码图片失败:{{name}}", + "Failed to decrypt private key": "解密私钥失败", + "Failed to decrypt. Try the Decrypt tool instead.": "解密失败。请改用解密工具。", + "Failed to delete layer": "删除图层失败", + "Failed to delete pages.": "删除页面失败。", + "Failed to deskew PDF: {{error}}": "校正 PDF 失败:{{error}}", + "Failed to download the edited PDF.": "下载编辑后的 PDF 失败。", + "Failed to edit attachments.": "编辑附件失败。", + "Failed to extract certificate from PFX file": "从 PFX 文件中提取证书失败", + "Failed to extract pages (qpdf exit code {{exitCode}}).": "提取页面失败(qpdf 退出代码 {{exitCode}})。", + "Failed to extract pages.": "提取页面失败。", + "Failed to extract tables. {{message}}": "提取表格失败。{{message}}", + "Failed to extract text from PDF.": "从 PDF 中提取文本失败。", + "Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}": "从 {{iccUrl}} 获取 ICC 配置文件失败:HTTP {{status}}", + "Failed to fetch font file: {{statusText}}": "获取字体文件失败:{{statusText}}", + "Failed to fetch gs.js: HTTP {{status}}": "获取 gs.js 失败:HTTP {{status}}", + "Failed to fetch {{url}}: HTTP {{status}}": "获取 {{url}} 失败:HTTP {{status}}", + "Failed to get 2D context for page {{pageNumber}}": "获取第 {{pageNumber}} 页的 2D 上下文失败", + "Failed to get canvas context": "获取画布上下文失败", + "Failed to insert PDF. The file may be corrupted.": "插入 PDF 失败。文件可能已损坏。", + "Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}": "从 {{normalizedUrl}} 加载 Ghostscript 失败:{{msg}}", + "Failed to load PDF file.": "加载 PDF 文件失败。", + "Failed to load PDF for cropping.": "加载 PDF 以进行裁剪失败。", + "Failed to load PDF for preview.": "加载 PDF 以进行预览失败。", + "Failed to load PDF form viewer.": "加载 PDF 表单查看器失败。", + "Failed to load PDF layers": "加载 PDF 图层失败", + "Failed to load PyMuPDF from CDN: {{msg}}": "从 CDN 加载 PyMuPDF 失败:{{msg}}", + "Failed to load SVG image": "加载 SVG 图片失败", + "Failed to load WebP image": "加载 WebP 图片失败", + "Failed to load attachments from PDF.": "从 PDF 加载附件失败。", + "Failed to load files: {{error}}": "加载文件失败:{{error}}", + "Failed to load image.": "加载图片失败。", + "Failed to load image: {{filename}}": "加载图片失败:{{filename}}", + "Failed to load one or more PDF files.": "加载一个或多个 PDF 文件失败。", + "Failed to load script: {{url}}": "加载脚本失败:{{url}}", + "Failed to load template.": "加载模板失败。", + "Failed to load the PDF Editor.": "加载 PDF 编辑器失败。", + "Failed to load the image processor. Please ensure your browser supports SharedArrayBuffer (requires HTTPS or localhost).": "加载图像处理器失败。请确保您的浏览器支持 SharedArrayBuffer(需要 HTTPS 或 localhost)。", + "Failed to parse CSV: {{error}}": "解析 CSV 失败:{{error}}", + "Failed to parse signature": "解析签名失败", + "Failed to parse the certificate file.": "解析证书文件失败。", + "Failed to process HEIC file: {{name}}": "处理 HEIC 文件失败:{{name}}", + "Failed to process WebP file: {{name}}": "处理 WebP 文件失败:{{name}}", + "Failed to read file.": "读取文件失败。", + "Failed to remove restrictions. The PDF may require the correct owner password.": "移除限制失败。该 PDF 可能需要正确的所有者密码。", + "Failed to render page": "渲染页面失败", + "Failed to render page previews": "渲染页面预览失败", + "Failed to render page previews.": "渲染页面预览失败。", + "Failed to render page.": "渲染页面失败。", + "Failed to save changes.": "保存更改失败。", + "Failed to save the new PDF. Check console for details.": "保存新的 PDF 失败。请查看控制台了解详情。", + "Failed to split PDF. Please check your selection.": "分割 PDF 失败。请检查您的选择。", + "Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.": "为 PDF 添加时间戳失败:{{message}}\n\n请尝试其他 TSA 服务器,或检查您的网络连接。", + "Failed to toggle layer visibility": "切换图层可见性失败", + "Failed to validate signatures. The file may be corrupted.": "验证签名失败。文件可能已损坏。", + "Features enabled by this module:": "此模块启用的功能:", + "Field Name": "字段名称", + "Field Name (Group Name)": "字段名称(组名称)", + "Field Name Conflict": "字段名称冲突", + "Field name \"{{newName}}\" already exists in this {{value}}. Please try using a unique name.": "字段名称“{{newName}}”已存在于此{{value}}中。请尝试使用唯一的名称。", + "Field name cannot be empty": "字段名称不能为空", + "File": "文件", + "File Size": "文件大小", + "File exists but could not be read. Check CORS configuration.": "文件存在但无法读取。请检查 CORS 配置。", + "File list not found": "未找到文件列表", + "File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).": "文件大小已从 {{originalSize}} 减小到 {{compressedSize}}(节省 {{percent}}%)。", + "File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}": "文件 {{n}}/{{length}}:第 {{n2}}/{{pageCount}} 页", + "File {{n}}/{{length}}: {{message}}": "文件 {{n}}/{{length}}:{{message}}", + "Filename": "文件名", + "Files that failed: {{errorCount}}.": "失败的文件:{{errorCount}} 个。", + "Fill (cover full target page)": "填充(覆盖整个目标页面)", + "Fill Color": "填充颜色", + "Finalizing PDF...": "正在完成 PDF...", + "Find & replace": "查找和替换", + "Finds the best quality under this size. 0 means no target.": "在此大小以内寻找最佳质量。0 表示无目标。", + "Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.": "Firefox 和 Chrome 在选择时可能会显示其原生的日期选择器格式。完成输入日期后将应用正确的格式。", + "First Indent": "首行缩进", + "Fit (keep full page visible)": "适应(保持整页可见)", + "Fit Page": "适应页面", + "Fix Page Size": "修复页面尺寸", + "Flatten": "扁平化", + "Flatten Forms": "扁平化表单", + "Flatten annotations": "扁平化注释", + "Flatten form fields": "扁平化表单字段", + "Flatten forms and annotations": "扁平化表单和注释", + "Flatten links": "扁平化链接", + "Flattening PDF...": "正在扁平化 PDF...", + "Flattening and saving PDF...": "正在扁平化并保存 PDF...", + "Flattening multiple PDFs...": "正在扁平化多个 PDF...", + "Flattening page {{i}} of {{totalPages}}...": "正在扁平化第 {{i}} 页,共 {{totalPages}} 页...", + "Flattening {{n}}/{{length}}: {{name}}...": "正在扁平化 {{n}}/{{length}}:{{name}}...", + "Focuses address bar": "聚焦到地址栏", + "Font": "字体", + "Font Color": "字体颜色", + "Font Family": "字体系列", + "Font Size": "字号", + "Font size: {{bSize}} → {{aSize}}": "字号:{{bSize}} → {{aSize}}", + "Font to Outline": "字体转轮廓", + "Font: {{bFont}} → {{aFont}}": "字体:{{bFont}} → {{aFont}}", + "Fonts": "字体", + "Footer Center": "页脚居中", + "Footer Left": "页脚居左", + "Footer Right": "页脚居右", + "For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.": "适用于扫描件等纯图像 PDF。如果文档包含可选择的文本则会跳过,除非开启“覆盖内容保护”。", + "Form fields stop being fillable.": "表单字段将无法再填写。", + "Format": "格式", + "Found {{length}} blank page(s). Click on a page to deselect it.": "发现 {{length}} 个空白页。点击页面可取消选择。", + "Found {{length}} existing bookmarks. Replace current bookmarks?": "发现 {{length}} 个现有书签。要替换当前书签吗?", + "Found {{length}} image(s) in {{length2}} PDF(s).": "在 {{length2}} 个 PDF 中发现 {{length}} 张图片。", + "Front": "正面", + "Full Coverage": "完全覆盖", + "Gamma": "伽马", + "Generate table of contents from bookmarks": "根据书签生成目录", + "Generating High-Quality PDF...": "正在生成高质量 PDF...", + "Generating PDF...": "正在生成 PDF...", + "Generating ZIP file...": "正在生成 ZIP 文件...", + "Generating formatted content...": "正在生成格式化内容...", + "Generating preview...": "正在生成预览...", + "Ghostscript (PDF/A Conversion)": "Ghostscript(PDF/A 转换)", + "Ghostscript RGB conversion failed with exit code {{exitCode}}": "Ghostscript RGB 转换失败,退出代码 {{exitCode}}", + "Ghostscript conversion failed with exit code {{exitCode}}": "Ghostscript 转换失败,退出代码 {{exitCode}}", + "Ghostscript did not produce output file": "Ghostscript 未生成输出文件", + "Ghostscript is not configured. Please configure it in Advanced Settings.": "Ghostscript 未配置。请在高级设置中进行配置。", + "Ghostscript is not configured. Please configure it in WASM Settings.": "Ghostscript 未配置。请在 WASM 设置中进行配置。", + "Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.": "Ghostscript 未配置。PyMuPDF 的某些操作需要 Ghostscript。请在高级设置中同时配置两者。", + "Ghostscript threw an exception: {{e}}": "Ghostscript 抛出异常:{{e}}", + "Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.": "Ghostscript 封装未提供预期的接口。需要 loadGS() 或 GhostscriptWASM 类。", + "Go": "前往", + "Go to page": "转到页面", + "Grayscale": "灰度", + "Green": "绿色", + "Greyscale": "灰度", + "Grid Mode": "网格模式", + "Group Name (Must be same for group)": "组名(同一组必须相同)", + "H-Scale %": "水平缩放 %", + "Hanging Indent": "悬挂缩进", + "Hard reloads page": "强制重新加载页面", + "Header & Footer": "页眉和页脚", + "Header & Footer added successfully!": "页眉和页脚已成功添加!", + "Header Center": "页眉居中", + "Header Left": "页眉居左", + "Header Right": "页眉居右", + "Height ({{unit}})": "高度({{unit}})", + "Helvetica": "Helvetica", + "Helvetica Bold": "Helvetica Bold", + "Helvetica Bold Oblique": "Helvetica Bold Oblique", + "Helvetica Oblique": "Helvetica Oblique", + "Hide": "隐藏", + "Hide Border": "隐藏边框", + "Hide password": "隐藏密码", + "Hides window": "隐藏窗口", + "High (288 DPI)": "高(288 DPI)", + "High (Smallest Files)": "高(文件最小)", + "Horizontal": "水平", + "Hue Shift": "色相偏移", + "Image Format": "图片格式", + "Image Input": "图片输入", + "Image quality": "图片质量", + "Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}": "图片已从 {{width}}×{{height}} 调整为 {{width2}}×{{height2}}", + "Images": "图片", + "Images above this are resampled down. None leaves resolution alone.": "超过此值的图片会被降采样。选择“无”则保持原分辨率。", + "Imported {{length}} bookmarks!": "已导入 {{length}} 个书签!", + "Inches (in)": "英寸(in)", + "Include Attachments": "包含附件", + "Include Cc Bcc": "包含抄送和密送", + "Include this file": "包含此文件", + "Incorrect Page Count": "页数不正确", + "Incorrect Password": "密码不正确", + "Incorrect password": "密码不正确", + "Incorrect password. Please try again.": "密码不正确。请重试。", + "Increase size": "放大", + "Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...": "正在索引 PDF 1 的第 {{pageNumber}} 页,共 {{totalPages}} 页...", + "Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...": "正在索引 PDF 2 的第 {{pageNumber}} 页,共 {{totalPages}} 页...", + "Info": "信息", + "Info Dictionary": "信息字典", + "Inherit": "继承", + "Initialization Error": "初始化错误", + "Initializing Ghostscript...": "正在初始化 Ghostscript...", + "Initializing PDF engine...": "正在初始化 PDF 引擎...", + "Initializing PyMuPDF...": "正在初始化 PyMuPDF...", + "Initializing decryption...": "正在初始化解密...", + "Initializing encryption...": "正在初始化加密...", + "Initializing repair engine...": "正在初始化修复引擎...", + "Initializing...": "正在初始化...", + "Input Required": "需要输入", + "Insecure Digest (MD5 / SHA-1)": "不安全的摘要算法(MD5 / SHA-1)", + "Insert blank pages": "插入空白页", + "Insert blank pages after this page number": "在此页码之后插入空白页", + "Interactive Form Fields": "交互式表单字段", + "Interleave pages from multiple PDFs (e.g. odd + reversed even from a single-sided scan)": "交错合并多个 PDF 的页面(例如单面扫描件的奇数页加倒序的偶数页)", + "Invalid Certificate": "证书无效", + "Invalid File": "文件无效", + "Invalid Files": "文件无效", + "Invalid Input": "输入无效", + "Invalid JSON format": "JSON 格式无效", + "Invalid Name": "名称无效", + "Invalid Order": "顺序无效", + "Invalid PDF password.": "PDF 密码无效。", + "Invalid Page Numbers": "页码无效", + "Invalid Page Order": "页面顺序无效", + "Invalid Pages": "页面无效", + "Invalid Range": "范围无效", + "Invalid Signature": "签名无效", + "Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.": "TSA URL 无效。时间戳颁发机构必须是有效的 http:// 或 https:// URL。", + "Invalid URL": "URL 无效", + "Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)": "URL 格式无效。请输入有效的 URL(例如 https://example.com/wasm/)", + "Invalid XML: no root element": "XML 无效:没有根元素", + "Invalid data": "数据无效", + "Invalid hex string in content stream": "内容流中的十六进制字符串无效", + "Invalid page range specified.": "指定的页面范围无效。", + "Invalid shortcut format": "快捷键格式无效", + "Invalid: Cryptographic Verification Failed": "无效:加密验证失败", + "Invert Colors": "反转颜色", + "Invert all colors": "反转所有颜色", + "Inverting PDF colors...": "正在反转 PDF 颜色...", + "Issuer": "颁发者", + "It fits the {{targetBytes}} target.": "已达到 {{targetBytes}} 的目标大小。", + "It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.": "由于“保留 PDF/A”限制了压缩程度,仍高于 {{targetBytes}} 的目标大小。", + "It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.": "它不再声明符合 PDF/A。请在“自定义设置”中开启“保留 PDF/A”以保持合规。", + "Italic": "斜体", + "Item 1": "项目 1", + "Its digital signatures were removed so it could be compressed. Sign it again if needed.": "为了压缩,其数字签名已被移除。如有需要,请重新签名。", + "JPEG (Smaller file size)": "JPEG(文件较小)", + "JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.": "重新编码图片的 JPEG 质量,范围 20 到 100。数值越低,文件越小,可见的瑕疵越多。", + "JPG": "JPG", + "JSON Files": "JSON 文件", + "JSON Loaded": "JSON 已加载", + "JSON to PDF": "JSON 转 PDF", + "Javascript Code": "JavaScript 代码", + "Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.": "使 PDF/A 文件保持合规。开启时会跳过 Brotli 和栅格化。", + "Keeps only the characters the document uses.": "仅保留文档中使用的字符。", + "Key (e.g., Department)": "键(例如 Department)", + "Keywords": "关键词", + "Label": "标签", + "Label / Prompt": "标签 / 提示", + "Landscape": "横向", + "Language": "语言", + "Layer not found": "未找到图层", + "Layer {{number}}": "图层 {{number}}", + "Leave blank for all pages": "留空表示所有页面", + "Left": "左", + "Left edge in points (1 inch = 72 pts)": "左边缘(以点为单位,1 英寸 = 72 点)", + "Legal": "Legal", + "Letter": "Letter", + "Level": "级别", + "Limit recognized characters (leave empty for all)": "限制识别的字符(留空表示全部)", + "Line": "线条", + "Linearization Failed": "线性化失败", + "Linearize": "线性化", + "Links stop being clickable.": "链接将无法再点击。", + "Lists": "列表", + "Load": "加载", + "Load system fonts": "加载系统字体", + "Load system fonts…": "加载系统字体…", + "Loaded": "已加载", + "Loaded bookmarks from JSON. Now upload your PDF.": "已从 JSON 加载书签。现在请上传您的 PDF。", + "Loaded {{length}} bookmarks from CSV. Now upload your PDF.": "已从 CSV 加载 {{length}} 个书签。现在请上传您的 PDF。", + "Loading Engine...": "正在加载引擎...", + "Loading Ghostscript...": "正在加载 Ghostscript...", + "Loading PDF Editor...": "正在加载 PDF 编辑器...", + "Loading PDF Text Editor...": "正在加载 PDF 文本编辑器...", + "Loading PDF converter...": "正在加载 PDF 转换器...", + "Loading PDF documents...": "正在加载 PDF 文档...", + "Loading PDF engine...": "正在加载 PDF 引擎...", + "Loading PDF files...": "正在加载 PDF 文件...", + "Loading PDF form...": "正在加载 PDF 表单...", + "Loading PDF processor...": "正在加载 PDF 处理器...", + "Loading PDF viewer...": "正在加载 PDF 查看器...", + "Loading PDF...": "正在加载 PDF...", + "Loading PDFs...": "正在加载 PDF...", + "Loading attachments...": "正在加载附件...", + "Loading comparison {{currentPage}} of {{length}}...": "正在加载对比,第 {{currentPage}} 页,共 {{length}} 页...", + "Loading conversion engine ({{percent}}%)...": "正在加载转换引擎({{percent}}%)...", + "Loading conversion engine...": "正在加载转换引擎...", + "Loading engine...": "正在加载引擎...", + "Loading fonts...": "正在加载字体...", + "Loading layers from {{name}}...": "正在从 {{name}} 加载图层...", + "Loading page {{num}}...": "正在加载第 {{num}} 页...", + "Loading preview...": "正在加载预览...", + "Loading {{name}}...": "正在加载 {{name}}...", + "Loading...": "加载中...", + "Location": "位置", + "Lossless (No Quality Loss)": "无损(不损失质量)", + "Lossless (no image re-encoding)": "无损(不重新编码图片)", + "Low (Best Quality)": "低(最佳质量)", + "MOBI Files": "MOBI 文件", + "MOBI to PDF": "MOBI 转 PDF", + "Malformed ByteRange": "ByteRange 格式错误", + "Malformed ECDSA signature (could not parse r,s)": "ECDSA 签名格式错误(无法解析 r,s)", + "Malformed inline image in content stream": "内容流中的内联图片格式错误", + "Malformed signatureAlgorithm": "signatureAlgorithm 格式错误", + "Margins": "边距", + "Markdown Files": "Markdown 文件", + "Markdown to PDF": "Markdown 转 PDF", + "Max Length (0 for unlimited)": "最大长度(0 表示不限制)", + "Maximum resolution": "最大分辨率", + "Medium (Recommended)": "中(推荐)", + "Merge PDF": "合并 PDF", + "Merge PDFs": "合并 PDF", + "Merge duplicate fonts": "合并重复字体", + "Mermaid Error: {{error}}": "Mermaid 错误:{{error}}", + "Metadata copied to clipboard as JSON.": "元数据已以 JSON 格式复制到剪贴板。", + "Metadata removed successfully!": "元数据已成功移除!", + "Metadata updated successfully!": "元数据已成功更新!", + "Millimeters (mm)": "毫米(mm)", + "Minimizes window": "最小化窗口", + "Missing Files": "缺少文件", + "Missing signatureAlgorithm": "缺少 signatureAlgorithm", + "Mixed Page Sizes Detected": "检测到页面尺寸不一致", + "Mixed Sizes": "尺寸不一", + "Mode": "模式", + "Modified": "已修改", + "Modified After Signing (signed part intact)": "签名后已被修改(已签名部分完好)", + "More": "更多", + "Moved": "已移动", + "Moved \"{{value}}\"": "已移动“{{value}}”", + "Multi-line": "多行", + "Must be a positive integer": "必须是正整数", + "Must be a positive number": "必须是正数", + "N must be at least 1.": "N 必须至少为 1。", + "N-Up": "N-Up", + "N-Up PDF created successfully!": "N-Up PDF 已成功创建!", + "Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.": "网络错误:无法连接到该 URL。请检查 URL 是否正确,以及服务器是否允许 CORS 请求。", + "Network error: {{error}}": "网络错误:{{error}}", + "Next page": "下一页", + "No Area Selected": "未选择区域", + "No Attachments": "没有附件", + "No Changes": "没有更改", + "No Crop Area": "没有裁剪区域", + "No File": "没有文件", + "No Files": "没有文件", + "No Images Found": "未找到图片", + "No PDF Files": "没有 PDF 文件", + "No PDF document loaded": "未加载 PDF 文档", + "No PDF document loaded.": "未加载 PDF 文档。", + "No PDF file loaded.": "未加载 PDF 文件。", + "No PDF files could be decrypted. The password may be incorrect.": "没有 PDF 文件可以解密。密码可能不正确。", + "No PDF files could be linearized.": "没有 PDF 文件可以线性化。", + "No PDFs could be processed.": "没有 PDF 可以处理。", + "No Pages": "没有页面", + "No Selection": "未选择内容", + "No Signatures Found": "未找到签名", + "No Tables Found": "未找到表格", + "No Text": "没有文本", + "No URL configured": "未配置 URL", + "No attachments found in this PDF.": "此 PDF 中没有附件。", + "No attachments selected for removal.": "未选择要移除的附件。", + "No blank pages detected in this PDF.": "此 PDF 中未检测到空白页。", + "No bookmarks found at the selected level.": "所选级别下没有书签。", + "No bookmarks to delete.": "没有可删除的书签。", + "No bookmarks to export!": "没有可导出的书签!", + "No certificate found in PEM file": "PEM 文件中未找到证书", + "No certificate found in PFX file": "PFX 文件中未找到证书", + "No certificates found in signature": "签名中未找到证书", + "No changes match the current filter.": "没有符合当前筛选条件的更改。", + "No configurable settings for this node.": "此节点没有可配置的设置。", + "No differences detected on this page.": "此页面未检测到差异。", + "No embedded images were found in the selected PDF(s).": "在所选 PDF 中未找到嵌入的图片。", + "No existing bookmarks found in this PDF.": "此 PDF 中未找到现有书签。", + "No items were selected for removal or none were found in the PDF.": "没有选择要移除的项目,或在 PDF 中未找到这些项目。", + "No page pairs to export.": "没有可导出的页面配对。", + "No pages found. Please create a blank PDF or upload one.": "未找到页面。请创建空白 PDF 或上传一个。", + "No pages selected for removal.": "未选择要移除的页面。", + "No pages were selected for splitting.": "未选择要分割的页面。", + "No paired page for this side.": "这一侧没有配对的页面。", + "No private key found in PEM file": "PEM 文件中未找到私钥", + "No private key found in PFX file": "PFX 文件中未找到私钥", + "No tables were detected in this PDF.": "此 PDF 中未检测到表格。", + "No valid page numbers found.": "未找到有效的页码。", + "No valid pages to save.": "没有可保存的有效页面。", + "No worker": "没有 worker", + "Noise": "噪点", + "None": "无", + "None of the files could be compressed: {{join}}.": "所有文件都无法压缩:{{join}}。", + "Normal": "常规", + "Not Enough Files": "文件数量不足", + "Not a PDF": "不是 PDF", + "Not connected": "未连接", + "Not in trust chain": "不在信任链中", + "Note: Without a separate owner password, the PDF has no usage restrictions.": "注意:如果不单独设置所有者密码,PDF 将没有任何使用限制。", + "Number Format": "数字格式", + "Number of Pages": "页数", + "OCR": "OCR", + "OCR aborted before any page was processed": "OCR 在处理任何页面之前就已中止", + "OCR recognize timed out after {{timeoutMs}}ms": "OCR 识别在 {{timeoutMs}}ms 后超时", + "OCR: {{status}}": "OCR:{{status}}", + "ODG Files": "ODG 文件", + "ODG to PDF": "ODG 转 PDF", + "OK": "确定", + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).": "关闭(默认):按 1 到 N 自然编号。开启:保留每个文件原有的页面标签(可能产生重复标签)。", + "One PDF per page": "每页一个 PDF", + "One PDF per range": "每个范围一个 PDF", + "Only a substitute font was available": "只有替代字体可用", + "Only where it does not change how the image looks.": "仅在不改变图片外观时应用。", + "Opacity": "不透明度", + "Open URL": "打开 URL", + "Opens incognito window": "打开无痕窗口", + "Opens new tab": "打开新标签页", + "Opens new window": "打开新窗口", + "Operation Failed": "操作失败", + "Operation resulted in an empty file.": "操作后得到的是空文件。", + "Optimize PDF for fast web viewing": "优化 PDF 以便快速在网页上查看", + "Optimizing PDFs for web view (linearizing)...": "正在优化 PDF 以便网页查看(线性化)...", + "Optimizing {{name}} ({{n}}/{{length}})...": "正在优化 {{name}}({{n}}/{{length}})...", + "Options (One per line or comma separated)": "选项(每行一个或用逗号分隔)", + "Orientation": "方向", + "Outline": "轮廓", + "Output": "输出", + "Overlay": "叠加", + "Overlay or underlay pages from one PDF onto another": "将一个 PDF 的页面叠加到另一个 PDF 的上层或下层", + "Owner Password": "所有者密码", + "Owner Password Required": "需要所有者密码", + "PDF": "PDF", + "PDF Files": "PDF 文件", + "PDF Input": "PDF 输入", + "PDF Layers": "PDF 图层", + "PDF Metadata": "PDF 元数据", + "PDF Producer": "PDF 生成器", + "PDF converted to CSV successfully!": "PDF 已成功转换为 CSV!", + "PDF converted to SVG successfully!": "PDF 已成功转换为 SVG!", + "PDF converted to greyscale successfully!": "PDF 已成功转换为灰度!", + "PDF created successfully!": "PDF 已成功创建!", + "PDF decrypted successfully! All encryption and restrictions removed.": "PDF 已成功解密!所有加密和限制均已移除。", + "PDF decrypted successfully! Your download has started.": "PDF 已成功解密!下载已开始。", + "PDF downloaded successfully.": "PDF 已成功下载。", + "PDF encrypted successfully with 256-bit AES!": "PDF 已使用 256 位 AES 成功加密!", + "PDF has been sanitized and downloaded.": "PDF 已清理并下载。", + "PDF has no pages": "PDF 没有页面", + "PDF organized successfully!": "PDF 已成功整理!", + "PDF permissions changed successfully!": "PDF 权限已成功更改!", + "PDF readers supply the 14 standard PDF fonts themselves.": "PDF 阅读器自带 14 种标准 PDF 字体。", + "PDF restrictions removed successfully! The file is now fully editable and printable.": "PDF 限制已成功移除!文件现在可以完全编辑和打印。", + "PDF saved successfully!": "PDF 已成功保存!", + "PDF split successfully!": "PDF 已成功分割!", + "PDF to CSV": "PDF 转 CSV", + "PDF to DOCX": "PDF 转 DOCX", + "PDF to Excel/CSV": "PDF 转 Excel/CSV", + "PDF to Images": "PDF 转图片", + "PDF to Images (High Quality)": "PDF 转图片(高质量)", + "PDF to JSON": "PDF 转 JSON", + "PDF to Markdown": "PDF 转 Markdown", + "PDF to PDF/A": "PDF 转 PDF/A", + "PDF to SVG": "PDF 转 SVG", + "PDF to Text": "PDF 转文本", + "PDF to XLSX": "PDF 转 XLSX", + "PDF with layer changes saved!": "图层更改后的 PDF 已保存!", + "PDF {{modeLabel}} applied successfully.": "PDF {{modeLabel}}已成功应用。", + "PDF/A Conversion": "PDF/A 转换", + "PDF/A-1b (Strict, no transparency)": "PDF/A-1b(严格,不含透明度)", + "PDF/A-2b (Recommended)": "PDF/A-2b(推荐)", + "PDF/A-3b (Modern, allows attachments)": "PDF/A-3b(现代,允许附件)", + "PDF417": "PDF417", + "PDFs have been mixed successfully!": "PDF 已成功混合!", + "PNG": "PNG", + "PNG (Lossless)": "PNG(无损)", + "PUB to PDF": "PUB 转 PDF", + "Page": "页面", + "Page #": "页码", + "Page Added": "已添加页面", + "Page Numbers": "页码", + "Page Removed": "已移除页面", + "Page Size": "页面尺寸", + "Page X of Y": "第 X 页,共 Y 页", + "Page background or layout changed": "页面背景或布局已更改", + "Page container not found": "未找到页面容器", + "Page extraction produced an empty PDF.": "页面提取得到的是空 PDF。", + "Page number": "页码", + "Page numbers added successfully!": "页码已成功添加!", + "Page sizes standardized successfully!": "页面尺寸已成功统一!", + "Page {{currentPageNum}} of {{numPages}}": "第 {{currentPageNum}} 页,共 {{numPages}} 页", + "Page {{num}} / {{numPages}}": "第 {{num}} / {{numPages}} 页", + "Page {{n}} ": "第 {{n}} 页 ", + "Page {{n}} of {{length}}": "第 {{n}} 页,共 {{length}} 页", + "Page {{n}}:": "第 {{n}} 页:", + "Page {{pageNumber}}": "第 {{pageNumber}} 页", + "Page {{pageNumber}} exists only in the first PDF.": "第 {{pageNumber}} 页仅存在于第一个 PDF 中。", + "Page {{pageNumber}} exists only in the second PDF.": "第 {{pageNumber}} 页仅存在于第二个 PDF 中。", + "Page {{pageNumber}} of {{totalPages}}": "第 {{pageNumber}} 页,共 {{totalPages}} 页", + "Page {{pageNum}} does not exist in this PDF.": "此 PDF 中不存在第 {{pageNum}} 页。", + "Page {{page}}": "第 {{page}} 页", + "Page {{page}} attachment": "第 {{page}} 页附件", + "Pages": "页面", + "Pages (e.g., 1-3, 5) - Total: {{pageCount}}": "页面(例如 1-3, 5)- 总计:{{pageCount}}", + "Pages Files": "Pages 文件", + "Pages Per Sheet": "每张纸的页数", + "Pages combined successfully!": "页面已成功合并!", + "Pages have been divided successfully!": "页面已成功分割!", + "Pages have been reordered.": "页面已重新排序。", + "Pages have been reversed successfully!": "页面已成功反转!", + "Pages to PDF": "Pages 转 PDF", + "Paper Size": "纸张尺寸", + "Paragraph": "段落", + "Parsing XML structure...": "正在解析 XML 结构...", + "Parsing {{name}}...": "正在解析 {{name}}...", + "Partial Coverage": "部分覆盖", + "Partial Success": "部分成功", + "Password": "密码", + "Password Error": "密码错误", + "Password Needed": "需要密码", + "Password Required": "需要密码", + "Password for all files": "所有文件的密码", + "Password for all locked files": "所有已锁定文件的密码", + "Password for {{name}}": "{{name}} 的密码", + "Password protected": "受密码保护", + "Password required for encrypted private key": "加密的私钥需要密码", + "Path Stroke": "路径描边", + "Please add at least one field before downloading.": "下载前请至少添加一个字段。", + "Please draw a rectangle on at least one page to select the crop area.": "请在至少一页上绘制一个矩形来选择裁剪区域。", + "Please ensure all page numbers in the order are unique.": "请确保顺序中的所有页码都是唯一的。", + "Please enter a layer name": "请输入图层名称", + "Please enter a name.": "请输入名称。", + "Please enter a number between 0 and {{totalPages}}.": "请输入 0 到 {{totalPages}} 之间的数字。", + "Please enter a page order.": "请输入页面顺序。", + "Please enter a password": "请输入密码", + "Please enter a password for {{i}} or skip it": "请输入 {{i}} 的密码,或跳过", + "Please enter a title.": "请输入标题。", + "Please enter a user password.": "请输入用户密码。", + "Please enter a valid number of pages (1 or more).": "请输入有效的页数(1 或更多)。", + "Please enter a valid page number between 1 and {{total}}": "请输入 1 到 {{total}} 之间的有效页码", + "Please enter a valid page range (e.g., 1-5, 8, 11-13).": "请输入有效的页面范围(例如 1-5, 8, 11-13)。", + "Please enter page numbers to extract.": "请输入要提取的页码。", + "Please enter positive numbers.": "请输入正数。", + "Please enter some text to convert.": "请输入要转换的文本。", + "Please enter text for the watermark.": "请输入水印文字。", + "Please enter the PDF password.": "请输入 PDF 密码。", + "Please load a PDF first.": "请先加载 PDF。", + "Please select PDF files to create a ZIP archive.": "请选择 PDF 文件以创建 ZIP 压缩包。", + "Please select a .pem, .crt, .cer, or .der certificate file.": "请选择 .pem、.crt、.cer 或 .der 证书文件。", + "Please select a PDF file.": "请选择一个 PDF 文件。", + "Please select a valid PDF file.": "请选择有效的 PDF 文件。", + "Please select an area on at least one page to crop.": "请在至少一页上选择要裁剪的区域。", + "Please select an area to crop first.": "请先选择要裁剪的区域。", + "Please select an area to crop.": "请选择要裁剪的区域。", + "Please select an image file for the watermark.": "请选择用作水印的图片文件。", + "Please select at least one BMP file.": "请至少选择一个 BMP 文件。", + "Please select at least one CSV file.": "请至少选择一个 CSV 文件。", + "Please select at least one Excel file.": "请至少选择一个 Excel 文件。", + "Please select at least one HEIC file.": "请至少选择一个 HEIC 文件。", + "Please select at least one JPG file.": "请至少选择一个 JPG 文件。", + "Please select at least one JPG or JPEG2000 image.": "请至少选择一张 JPG 或 JPEG2000 图片。", + "Please select at least one ODT file.": "请至少选择一个 ODT 文件。", + "Please select at least one PDF file.": "请至少选择一个 PDF 文件。", + "Please select at least one PowerPoint file.": "请至少选择一个 PowerPoint 文件。", + "Please select at least one RTF file.": "请至少选择一个 RTF 文件。", + "Please select at least one SVG file.": "请至少选择一个 SVG 文件。", + "Please select at least one TIFF file.": "请至少选择一个 TIFF 文件。", + "Please select at least one Word document.": "请至少选择一个 Word 文档。", + "Please select at least one file to attach.": "请至少选择一个要附加的文件。", + "Please select at least one image file.": "请至少选择一个图片文件。", + "Please select at least one text file.": "请至少选择一个文本文件。", + "Please select at least one {{FILETYPE_NAME}} file.": "请至少选择一个 {{FILETYPE_NAME}} 文件。", + "Please select at least one {{TOOL_NAME}} file (.eml or .msg).": "请至少选择一个 {{TOOL_NAME}} 文件(.eml 或 .msg)。", + "Please select at least one {{TOOL_NAME}} file.": "请至少选择一个 {{TOOL_NAME}} 文件。", + "Please select even or odd pages.": "请选择偶数页或奇数页。", + "Please select one or more PDF files.": "请选择一个或多个 PDF 文件。", + "Please select pages to delete.": "请选择要删除的页面。", + "Please select pages to duplicate.": "请选择要复制的页面。", + "Please select pages to mark for splitting.": "请选择要标记为分割点的页面。", + "Please select pages to rotate.": "请选择要旋转的页面。", + "Please specify a page range for page-level attachments.": "请为页面级附件指定页面范围。", + "Please upload PDF files.": "请上传 PDF 文件。", + "Please upload PDFs first.": "请先上传 PDF。", + "Please upload a .docx file first.": "请先上传 .docx 文件。", + "Please upload a PDF file first.": "请先上传 PDF 文件。", + "Please upload a PDF file.": "请上传 PDF 文件。", + "Please upload a PDF first.": "请先上传 PDF。", + "Please upload a valid PDF file.": "请上传有效的 PDF 文件。", + "Please upload at least one PDF file.": "请至少上传一个 PDF 文件。", + "Please upload at least two PDF files to alternate and mix.": "请至少上传两个 PDF 文件以进行交替混合。", + "Please upload both a base PDF and an overlay/underlay PDF.": "请同时上传基础 PDF 和叠加/底层 PDF。", + "Please upload valid PDF files.": "请上传有效的 PDF 文件。", + "Please use the Download button in the PDF viewer toolbar above.": "请使用上方 PDF 查看器工具栏中的“下载”按钮。", + "Please wait for the PDF viewer to load.": "请等待 PDF 查看器加载完成。", + "Please wait for the form to finish loading.": "请等待表单加载完成。", + "Portrait": "纵向", + "Position": "位置", + "Post-processing for transparency compliance...": "正在进行透明度合规的后处理...", + "Posterize": "海报化", + "Posterizing PDF...": "正在海报化 PDF...", + "PowerPoint to PDF": "PowerPoint 转 PDF", + "Pre Flatten": "预先扁平化", + "Pre-flattening PDF...": "正在预先扁平化 PDF...", + "Prefer JPEG 2000 for photos": "照片优先使用 JPEG 2000", + "Preparing PDF export...": "正在准备 PDF 导出...", + "Preparing conversion...": "正在准备转换...", + "Preparing download...": "正在准备下载...", + "Preparing preview...": "正在准备预览...", + "Presentations": "演示文稿", + "Preserve PDF/A": "保留 PDF/A", + "Preview": "预览", + "Preview Error": "预览错误", + "Preview Text": "预览文本", + "Previous page": "上一页", + "Print Form": "打印表单", + "Private data that editing apps store inside the PDF.": "编辑类应用存储在 PDF 内部的私有数据。", + "Processed {{processedCount}} PDFs.": "已处理 {{processedCount}} 个 PDF。", + "Processing Complete": "处理完成", + "Processing Dpi": "处理 DPI", + "Processing Failed": "处理失败", + "Processing PDF permissions...": "正在处理 PDF 权限...", + "Processing attachments...": "正在处理附件...", + "Processing failed for {{name}}.": "处理 {{name}} 失败。", + "Processing file {{n}} of {{length}}...": "正在处理第 {{n}} 个文件,共 {{length}} 个...", + "Processing images...": "正在处理图片...", + "Processing multiple PDFs...": "正在处理多个 PDF...", + "Processing page {{i}} of {{numPages}}": "正在处理第 {{i}} 页,共 {{numPages}} 页", + "Processing page {{i}} of {{numPages}}...": "正在处理第 {{i}} 页,共 {{numPages}} 页...", + "Processing page {{n}} of {{length}}...": "正在处理第 {{n}} 页,共 {{length}} 页...", + "Processing page {{pageNum}} of {{length}}...": "正在处理第 {{pageNum}} 页,共 {{length}} 页...", + "Processing page {{pageNum}} of {{totalPages}}...": "正在处理第 {{pageNum}} 页,共 {{totalPages}} 页...", + "Processing produced an empty file.": "处理后得到的是空文件。", + "Processing resulted in an empty file.": "处理后得到的是空文件。", + "Processing sheet {{n}}...": "正在处理第 {{n}} 张纸...", + "Processing {{name}}...": "正在处理 {{name}}...", + "Processing {{nodeName}}...": "正在处理 {{nodeName}}...", + "Processing {{n}}/{{length}}: {{name}}...": "正在处理 {{n}}/{{length}}:{{name}}...", + "Processing...": "处理中...", + "Producer": "生成器", + "Publisher Files": "Publisher 文件", + "Purple": "紫色", + "PyMuPDF (Document Processing)": "PyMuPDF(文档处理)", + "PyMuPDF is not configured. Please configure it in Advanced Settings.": "PyMuPDF 未配置。请在高级设置中进行配置。", + "PyMuPDF module did not export expected PyMuPDF class.": "PyMuPDF 模块未导出预期的 PyMuPDF 类。", + "PyMuPDF produced an empty decrypted file.": "PyMuPDF 生成了空的解密文件。", + "PyMuPDF: not configured.": "PyMuPDF:未配置。", + "QR Code": "二维码", + "Quality": "质量", + "Quits application (cannot be overridden)": "退出应用程序(无法被覆盖)", + "RSA-PKCS1 signature does not verify against signer public key": "RSA-PKCS1 签名无法通过签名者公钥验证", + "RSA-PSS signature does not verify against signer public key": "RSA-PSS 签名无法通过签名者公钥验证", + "Rasterization Complete": "栅格化完成", + "Rasterization Partial": "部分栅格化", + "Rasterize": "栅格化", + "Rasterize Dpi": "栅格化 DPI", + "Rasterize pages to images": "将页面栅格化为图片", + "Rasterize quality": "栅格化质量", + "Rasterize resolution (DPI)": "栅格化分辨率(DPI)", + "Rasterized {{completed}} PDF(s), failed {{failed}}.": "已栅格化 {{completed}} 个 PDF,{{failed}} 个失败。", + "Rasterizing {{name}} ({{n}}/{{total}})...": "正在栅格化 {{name}}({{n}}/{{total}})...", + "Rasterizing {{name}}...": "正在栅格化 {{name}}...", + "Rasterizing...": "正在栅格化...", + "Rating must be between 0 and 5": "评分必须在 0 到 5 之间", + "Read Only": "只读", + "Reading CSV file...": "正在读取 CSV 文件...", + "Reading PDF...": "正在读取 PDF...", + "Reading XML file...": "正在读取 XML 文件...", + "Reading encrypted PDF...": "正在读取已加密的 PDF...", + "Reading files...": "正在读取文件...", + "Reading layer configuration...": "正在读取图层配置...", + "Reading {{name}} ({{n}}/{{length}})...": "正在读取 {{name}}({{n}}/{{length}})...", + "Ready": "就绪", + "Reason": "原因", + "Red": "红色", + "Redact": "涂黑", + "Redact Mode": "涂黑模式", + "Redact text from PDF": "涂黑 PDF 中的文本", + "Redaction Failed": "涂黑失败", + "Reduce PDF file size": "减小 PDF 文件大小", + "Reduce color complexity": "降低颜色复杂度", + "Reduces file size by removing color information.": "通过移除颜色信息来减小文件大小。", + "Reloads page": "重新加载页面", + "Remove": "移除", + "Remove All Attachments": "移除所有附件", + "Remove Annotations": "移除注释", + "Remove Blank Pages": "移除空白页", + "Remove Embedded Files": "移除嵌入文件", + "Remove Fonts": "移除字体", + "Remove Javascript": "移除 JavaScript", + "Remove Layers": "移除图层", + "Remove Links": "移除链接", + "Remove Mark Info": "移除标记信息", + "Remove Metadata": "移除元数据", + "Remove PDF password protection": "移除 PDF 密码保护", + "Remove Structure Tree": "移除结构树", + "Remove alternate images": "移除备用图片", + "Remove application data": "移除应用数据", + "Remove article threads": "移除文章线索", + "Remove attachment": "移除附件", + "Remove blank pages automatically": "自动移除空白页", + "Remove document structure tree": "移除文档结构树", + "Remove file": "移除文件", + "Remove metadata, scripts, and hidden data": "移除元数据、脚本和隐藏数据", + "Remove output intents": "移除输出意图", + "Remove page thumbnails": "移除页面缩略图", + "Remove specific pages": "移除指定页面", + "Remove web capture information": "移除网页捕获信息", + "Remove {{name}}": "移除 {{name}}", + "Removed \"{{beforeText}}\"": "已移除“{{beforeText}}”", + "Removed image ({{width}}×{{height}})": "已移除图片({{width}}×{{height}})", + "Removed {{length}} blank page(s) successfully!": "已成功移除 {{length}} 个空白页!", + "Removing all metadata...": "正在移除所有元数据...", + "Removing annotations...": "正在移除注释...", + "Removing redacted text from document data...": "正在从文档数据中移除已涂黑的文本...", + "Removing restrictions...": "正在移除限制...", + "Removing {{length}} blank page(s)...": "正在移除 {{length}} 个空白页...", + "Render Error": "渲染错误", + "Rendering Page {{num}}...": "正在渲染第 {{num}} 页...", + "Rendering page previews...": "正在渲染页面预览...", + "Rendering page previews: {{current}}/{{total}}": "正在渲染页面预览:{{current}}/{{total}}", + "Rendering page {{n}} of {{length}}...": "正在渲染第 {{n}} 页,共 {{length}} 页...", + "Rendering preview for page {{pageNum}}...": "正在渲染第 {{pageNum}} 页的预览...", + "Reopens closed tab": "重新打开已关闭的标签页", + "Repair": "修复", + "Repair Failed": "修复失败", + "Repair corrupted PDF": "修复损坏的 PDF", + "Repaired {{length}} file(s). Failed to repair: {{failedList}}": "已修复 {{length}} 个文件。修复失败:{{failedList}}", + "Repairing {{name}} ({{n}}/{{length}})...": "正在修复 {{name}}({{n}}/{{length}})...", + "Repairing {{name}}...": "正在修复 {{name}}...", + "Replaced \"{{beforeText}}\" with \"{{afterText}}\"": "已将“{{beforeText}}”替换为“{{afterText}}”", + "Required": "必填", + "Resamples even when an image is only slightly above the limit.": "即使图片仅略高于限制也会重新采样。", + "Reset Form": "重置表单", + "Reset and go back to file uploader? All unsaved changes will be lost.": "重置并返回文件上传页吗?所有未保存的更改都将丢失。", + "Resolution": "分辨率", + "Retain Page Labels": "保留页面标签", + "Retry Failed": "重试失败项", + "Reverse Pages": "反转页面", + "Reverse page order": "反转页面顺序", + "Reversing page order...": "正在反转页面顺序...", + "Reversing {{name}} ({{n}}/{{length}})...": "正在反转 {{name}}({{n}}/{{length}})...", + "Right": "右", + "Right edge in points": "右边缘(以点为单位)", + "Rotate": "旋转", + "Rotate +90°": "旋转 +90°", + "Rotate all pages": "旋转所有页面", + "Rotation": "旋转", + "Rotation Variance": "旋转偏差", + "Rotations applied successfully!": "旋转已成功应用!", + "Rows": "行", + "Run Javascript": "运行 JavaScript", + "Running OCR on page {{pageNum}}...": "正在对第 {{pageNum}} 页运行 OCR...", + "Running...": "运行中...", + "SVG": "SVG", + "SVG Files": "SVG 文件", + "SVG to PDF": "SVG 转 PDF", + "Sanitize": "清理", + "Sanitized With Warnings": "已清理,但有警告", + "Sanitizing PDF...": "正在清理 PDF...", + "Saturation": "饱和度", + "Saved": "已保存", + "Saving PDF with layer changes...": "正在保存包含图层更改的 PDF...", + "Scaling Mode": "缩放模式", + "Scanner Effect": "扫描效果", + "Scanner effect applied successfully!": "扫描效果已成功应用!", + "Scanning page {{n}} of {{pageCount}}...": "正在扫描第 {{n}} 页,共 {{pageCount}} 页...", + "Search Text": "搜索文本", + "Search languages...": "搜索语言...", + "Select Font": "选择字体", + "Select a field to edit properties": "选择一个字段以编辑属性", + "Select a field...": "选择一个字段...", + "Select to add this button to an existing group": "选择以将此按钮添加到现有分组", + "Selected Option": "所选选项", + "Self-Signed: Signer Identity Not Verified": "自签名:签名者身份未经验证", + "Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.": "自托管的 OCR 资源仅部分配置。请将 {{missing}} 与其他 Tesseract 资源 URL 一起设置。", + "Separator": "分隔符", + "Separator Color": "分隔符颜色", + "Separator Thickness": "分隔符粗细", + "Sepia": "棕褐色", + "Serial Number:": "序列号:", + "Set custom destination": "设置自定义目标位置", + "Shapes": "形状", + "Sheet {{n}} {{sideLabel}}": "第 {{n}} 张纸 {{sideLabel}}", + "Show": "显示", + "Show password": "显示密码", + "Show/Hide Field": "显示/隐藏字段", + "Sign Here": "在此签名", + "Signature /Contents is not a single DER object followed by zero padding": "签名 /Contents 不是后跟零填充的单个 DER 对象", + "Signature Algorithm:": "签名算法:", + "Signature Intact: Signer Identity Not Verified": "签名完好:签名者身份未经验证", + "Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.": "签名字段是 AcroForm 签名字段,只有在高级 PDF 查看器中才可见。", + "Signature has a missing or malformed /ByteRange": "签名的 /ByteRange 缺失或格式错误", + "Signature scheme {{kind}} not implemented": "签名方案 {{kind}} 尚未实现", + "Signature {{n}}": "签名 {{n}}", + "Signatures": "签名", + "Signed By": "签署人", + "Signed On": "签署时间", + "Signed PDF Not Changed": "已签名的 PDF 未更改", + "Signed PDF downloaded successfully!": "已签名的 PDF 下载成功!", + "Signed PDF saved successfully!": "已签名的 PDF 保存成功!", + "Simple (1, 2, 3)": "简单(1、2、3)", + "Simplify large color profiles": "简化大型颜色配置文件", + "Skew Threshold": "倾斜阈值", + "Skip": "跳过", + "Skip All": "全部跳过", + "Skip Remaining": "跳过剩余项", + "Skip this file": "跳过此文件", + "Skipped: {{join}}.": "已跳过:{{join}}。", + "Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.": "文件更小,但只有支持 Brotli 的阅读器才能打开,例如 Firefox、MuPDF 1.26+ 和 Ghostscript 10.06+。", + "Some files were skipped because they are not supported images.": "部分文件已被跳过,因为它们不是受支持的图片。", + "Some files were skipped. Only BMP files are allowed.": "部分文件已被跳过。仅允许 BMP 文件。", + "Some files were skipped. Only HEIC/HEIF files are allowed.": "部分文件已被跳过。仅允许 HEIC/HEIF 文件。", + "Some files were skipped. Only JPG, JPEG, JP2, and JPX files are allowed.": "部分文件已被跳过。仅允许 JPG、JPEG、JP2 和 JPX 文件。", + "Some files were skipped. Only PDF files are allowed.": "部分文件已被跳过。仅允许 PDF 文件。", + "Some files were skipped. Only PNG images are allowed.": "部分文件已被跳过。仅允许 PNG 图片。", + "Some files were skipped. Only SVG graphics are allowed.": "部分文件已被跳过。仅允许 SVG 图形。", + "Some files were skipped. Only TIFF files are allowed.": "部分文件已被跳过。仅允许 TIFF 文件。", + "Some files were skipped. Only WebP images are allowed.": "部分文件已被跳过。仅允许 WebP 图片。", + "Some files were skipped. Only supported image formats are allowed.": "部分文件已被跳过。仅允许受支持的图片格式。", + "Some files were skipped. Only text files are allowed.": "部分文件已被跳过。仅允许文本文件。", + "Some pages could not be processed. Please try again.": "部分页面无法处理。请重试。", + "Some redaction marks could not be applied, so the file was not downloaded. Apply or remove them in the editor and try again.": "部分涂黑标记无法应用,因此未下载文件。请在编辑器中应用或移除它们后重试。", + "Spacing": "间距", + "Split PDF": "分割 PDF", + "Split by Bookmarks": "按书签分割", + "Split pages into tile grid for poster printing": "将页面分割为网格拼块以便海报打印", + "Split pages vertically or horizontally": "按垂直或水平方向分割页面", + "Splitting PDF pages...": "正在分割 PDF 页面...", + "Splitting PDF...": "正在分割 PDF...", + "Spreadsheets": "电子表格", + "Standard (192 DPI)": "标准(192 DPI)", + "Standard Size": "标准尺寸", + "Standardize all pages to a target size": "将所有页面统一为目标尺寸", + "Standardizing pages...": "正在统一页面尺寸...", + "Stitch all pages into one continuous page": "将所有页面拼接为一个连续页面", + "Straighten skewed PDF pages": "矫正倾斜的 PDF 页面", + "Strip all annotations": "清除所有注释", + "Style": "样式", + "Style Changed": "样式已更改", + "Style changed ({{length}} regions)": "样式已更改({{length}} 个区域)", + "Subject": "主题", + "Subset embedded fonts": "子集化嵌入字体", + "Success": "成功", + "Success!": "成功!", + "Successfully converted {{length}} CSV file(s) to PDF.": "已成功将 {{length}} 个 CSV 文件转换为 PDF。", + "Successfully converted {{length}} Excel file(s) to PDF.": "已成功将 {{length}} 个 Excel 文件转换为 PDF。", + "Successfully converted {{length}} ODT file(s) to PDF.": "已成功将 {{length}} 个 ODT 文件转换为 PDF。", + "Successfully converted {{length}} PDF(s) to DOCX.": "已成功将 {{length}} 个 PDF 转换为 DOCX。", + "Successfully converted {{length}} PDF(s) to Markdown.": "已成功将 {{length}} 个 PDF 转换为 Markdown。", + "Successfully converted {{length}} PDF(s) to {{level}}.": "已成功将 {{length}} 个 PDF 转换为 {{level}}。", + "Successfully converted {{length}} PSD files to a single PDF.": "已成功将 {{length}} 个 PSD 文件转换为单个 PDF。", + "Successfully converted {{length}} PowerPoint file(s) to PDF.": "已成功将 {{length}} 个 PowerPoint 文件转换为 PDF。", + "Successfully converted {{length}} RTF file(s) to PDF.": "已成功将 {{length}} 个 RTF 文件转换为 PDF。", + "Successfully converted {{length}} Word document(s) to PDF.": "已成功将 {{length}} 个 Word 文档转换为 PDF。", + "Successfully converted {{length}} files to PDF.": "已成功将 {{length}} 个文件转换为 PDF。", + "Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.": "已成功将 {{length}} 个 {{TOOL_NAME}} 文件转换为 PDF。", + "Successfully converted {{name}} to DOCX.": "已成功将 {{name}} 转换为 DOCX。", + "Successfully converted {{name}} to Markdown.": "已成功将 {{name}} 转换为 Markdown。", + "Successfully converted {{name}} to PDF.": "已成功将 {{name}} 转换为 PDF。", + "Successfully converted {{name}} to {{level}}.": "已成功将 {{name}} 转换为 {{level}}。", + "Successfully extracted PDF for AI/LLM use.": "已成功提取 PDF 内容,可供 AI/LLM 使用。", + "Successfully extracted {{completed}} PDF(s) for AI/LLM use.": "已成功提取 {{completed}} 个 PDF 的内容,可供 AI/LLM 使用。", + "Successfully rasterized PDF at {{dpi}} DPI.": "已成功以 {{dpi}} DPI 栅格化 PDF。", + "Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.": "已成功以 {{dpi}} DPI 栅格化 {{completed}} 个 PDF。", + "Supported: CBZ, CBR": "支持:CBZ、CBR", + "Supported: DOC, DOCX, ODT, RTF": "支持:DOC、DOCX、ODT、RTF", + "Supported: EML, MSG": "支持:EML、MSG", + "Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2": "支持:JPG、PNG、BMP、GIF、TIFF、WebP、HEIC、PSD、SVG、PNM、PGM、PBM、PPM、PAM、JXR、JPX、JP2", + "Supported: PPT, PPTX, ODP": "支持:PPT、PPTX、ODP", + "Supported: VSD, VSDX": "支持:VSD、VSDX", + "Supported: XLSX, XLS, ODS, CSV": "支持:XLSX、XLS、ODS、CSV", + "Supported: XPS, OXPS": "支持:XPS、OXPS", + "Switches apps": "切换应用", + "Switches tabs": "切换标签页", + "Table of Contents": "目录", + "Table {{n}} (Page {{page}})": "表格 {{n}}(第 {{page}} 页)", + "Tabloid": "Tabloid", + "Target Field": "目标字段", + "Target Kilobytes": "目标千字节数", + "Target Not Reached": "未达到目标", + "Target Size": "目标大小", + "Technical Details": "技术详情", + "Temperature": "色温", + "Template \"{{name}}\" loaded.": "模板“{{name}}”已加载。", + "Template \"{{name}}\" saved.": "模板“{{name}}”已保存。", + "Text": "文本", + "Text Color": "文本颜色", + "Text Files": "文本文件", + "Text color changed successfully!": "文本颜色已成功更改!", + "Text converted to PDF successfully!": "文本已成功转换为 PDF!", + "Text extracted successfully!": "文本已成功提取!", + "Text to PDF": "文本转 PDF", + "That password did not open any of the remaining files.": "该密码无法打开其余任何文件。", + "The PDF file(s) do not contain any attachments to extract.": "这些 PDF 文件中没有可提取的附件。", + "The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).": "此 PDF 共 {{totalPages}} 页,无法被 {{nValue}} 整除。最后一个 PDF 将包含 {{remainder}} 页。", + "The PDF might be corrupted or password protected.": "PDF 可能已损坏或受密码保护。", + "The PDF might be corrupted or password-protected.": "PDF 可能已损坏或受密码保护。", + "The PDF might be corrupted.": "PDF 可能已损坏。", + "The PDF viewer is still initializing.": "PDF 查看器仍在初始化。", + "The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.": "PDF 已下载,但以下步骤未能完成:{{join}}。这些步骤涉及的内容可能仍保留在文件中。", + "The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.": "该 URL 返回了意外的内容类型:{{contentType}}。预期为 JavaScript 文件。", + "The bytes excluded by /ByteRange are not exactly a hex-encoded signature": "/ByteRange 排除的字节不是严格的十六进制编码签名", + "The bytes excluded by /ByteRange are not the /Contents of this signature": "/ByteRange 排除的字节不是此签名的 /Contents", + "The compression engine returned an unreadable result.": "压缩引擎返回了无法读取的结果。", + "The compression engine stopped unexpectedly.": "压缩引擎意外停止。", + "The current password you entered is incorrect. Please try again.": "您输入的当前密码不正确。请重试。", + "The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.": "上传的 PDF 中已存在以下字段名称:{{conflictList}}。请在下载前重命名这些字段。", + "The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.": "以下字段名称被重复使用:{{duplicateList}}。请在下载前将这些字段重命名为唯一的名称。", + "The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.": "指定的页数({{length}})与文档当前的页数({{currentGridCount}})不一致。请提供所有页面的完整排序。", + "The password you entered is incorrect. Please try again.": "您输入的密码不正确。请重试。", + "The password you entered is wrong or the file is corrupted.": "您输入的密码有误,或文件已损坏。", + "The provided file could not be loaded as an image. It may be corrupted.": "无法将所提供的文件作为图片加载。它可能已损坏。", + "The requested OCR language is not available: {{unavailableText}}.": "请求的 OCR 语言不可用:{{unavailableText}}。", + "The specified page order is incomplete or contains invalid page numbers. Please ensure you provide a new position for every original page.": "指定的页面顺序不完整或包含无效的页码。请确保为每个原始页面都提供新的位置。", + "These files are not valid PDFs, so they were not added: {{names}}.": "这些文件不是有效的 PDF,因此未被添加:{{names}}。", + "These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.": "这些文件受密码保护:{{names}}。请在文件卡片上输入它们的密码,或将其移除,然后重新压缩。", + "This BentoPDF build only bundles OCR data for {{availableText}}.": "此 BentoPDF 版本仅内置了 {{availableText}} 的 OCR 数据。", + "This PDF does not contain any digital signatures.": "此 PDF 不包含任何数字签名。", + "This PDF has no layers (OCG).": "此 PDF 没有图层(OCG)。", + "This PDF is password-protected. Please enter the current password to proceed.": "此 PDF 受密码保护。请输入当前密码以继续。", + "This document contains pages with different dimensions:": "此文档包含不同尺寸的页面:", + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "此文档有 1 个尚未应用的涂黑标记。在标记应用之前,其下方的内容仍保留在文件中。要应用所有标记并下载吗?", + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?": "此文档有 {{count}} 个尚未应用的涂黑标记。在标记应用之前,其下方的内容仍保留在文件中。要应用所有标记并下载吗?", + "This feature requires {{name}} to be configured.": "此功能需要先配置 {{name}}。", + "This file is not a valid PDF.": "此文件不是有效的 PDF。", + "This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.": "此模块采用 AGPL-3.0 许可。配置即表示您同意其许可条款。", + "This tool has been disabled": "此工具已被禁用", + "This tool is not available in your deployment. Contact your administrator for more information.": "您的部署中没有此工具。请联系管理员了解详情。", + "Threshold": "阈值", + "Tile": "平铺", + "Tile Gap X": "平铺间距 X", + "Tile Gap Y": "平铺间距 Y", + "Times Bold": "Times Bold", + "Times Bold Italic": "Times Bold Italic", + "Times Italic": "Times Italic", + "Times Roman": "Times Roman", + "Timestamp": "时间戳", + "Timestamp Failed": "时间戳添加失败", + "Tint": "色调", + "Title": "标题", + "To actually fill or change the options, use our PDF Form Filler tool.": "如需实际填写或更改选项,请使用我们的 PDF 表单填写器工具。", + "Toggle": "切换", + "Toggle style": "切换样式", + "Toggle sync scroll": "切换同步滚动", + "Tool Unavailable": "工具不可用", + "Tooltip / Help Text": "工具提示 / 帮助文本", + "Top": "顶部", + "Top Center": "顶部居中", + "Top Left": "左上", + "Top Right": "右上", + "Top edge in points": "上边缘(以点为单位)", + "Total Pages": "总页数", + "Transparent Background": "透明背景", + "Tries JPEG 2000 against JPEG for each image and keeps the smaller one.": "对每张图片分别尝试 JPEG 2000 和 JPEG,并保留较小的一个。", + "Trim margins from all pages": "裁剪所有页面的边距", + "Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate": "信任验证:{{length}} 个签名中有 {{trustVerified}} 个已通过自定义证书验证", + "Trusted": "受信任", + "Trusted certificate loaded": "已加载受信任的证书", + "Tsa Url": "TSA URL", + "Turns off quality, resolution and every other lossy image step.": "关闭质量、分辨率以及所有其他有损图片处理步骤。", + "UPC-A": "UPC-A", + "URL": "URL", + "URL must start with http:// or https://": "URL 必须以 http:// 或 https:// 开头", + "Ultra (384 DPI)": "超高(384 DPI)", + "Unable to decrypt the PDF with the provided password.": "无法使用所提供的密码解密 PDF。", + "Unable to repair any of the uploaded PDF files.": "无法修复任何已上传的 PDF 文件。", + "Unembed standard fonts": "取消嵌入标准字体", + "Unembed standard-font look-alikes": "取消嵌入与标准字体相似的字体", + "Unexpected delimiter in content stream": "内容流中出现意外的分隔符", + "Unexpected reply from the engine.": "引擎返回了意外的响应。", + "Uniform": "统一", + "Unique Page Sizes": "不同页面尺寸数", + "Unknown": "未知", + "Unknown error": "未知错误", + "Unknown error occurred in worker.": "worker 中发生未知错误。", + "Unknown error occurred.": "发生未知错误。", + "Unlock": "解锁", + "Unlock All": "全部解锁", + "Unlock Remaining ({{remaining}})": "解锁剩余文件({{remaining}})", + "Unlocked": "已解锁", + "Unlocked {{unlocked}} of {{length}} files.": "已解锁 {{length}} 个文件中的 {{unlocked}} 个。", + "Unlocking...": "正在解锁...", + "Unresolved optional content reference": "未解析的可选内容引用", + "Unsupported ECDSA curve in signer certificate": "签名者证书中的 ECDSA 曲线不受支持", + "Unsupported Image. Please use a PNG or JPG for the watermark.": "不支持的图片。水印请使用 PNG 或 JPG。", + "Unsupported digest OID {{digestOid}}": "不支持的摘要 OID {{digestOid}}", + "Unsupported file type: .{{ext}}": "不支持的文件类型:.{{ext}}", + "Unsupported signature algorithm OID {{oid}}": "不支持的签名算法 OID {{oid}}", + "Unterminated array or dictionary in content stream": "内容流中的数组或字典未结束", + "Unterminated hex string in content stream": "内容流中的十六进制字符串未结束", + "Unterminated inline image in content stream": "内容流中的内联图片未结束", + "Unterminated string in content stream": "内容流中的字符串未结束", + "Unverified: Unsupported Signature Algorithm": "未验证:不支持的签名算法", + "Updating metadata...": "正在更新元数据...", + "Upload Certificate": "上传证书", + "Upload Comics": "上传漫画", + "Upload Documents": "上传文档", + "Upload EPUB Files": "上传 EPUB 文件", + "Upload Email Files": "上传电子邮件文件", + "Upload FB2 Files": "上传 FB2 文件", + "Upload Images": "上传图片", + "Upload JSON Files": "上传 JSON 文件", + "Upload MOBI Files": "上传 MOBI 文件", + "Upload Markdown Files": "上传 Markdown 文件", + "Upload ODG Files": "上传 ODG 文件", + "Upload PDFs": "上传 PDF", + "Upload PUB Files": "上传 PUB 文件", + "Upload Pages Files": "上传 Pages 文件", + "Upload Presentations": "上传演示文稿", + "Upload SVG Files": "上传 SVG 文件", + "Upload Spreadsheets": "上传电子表格", + "Upload Text Files": "上传文本文件", + "Upload Visio Files": "上传 Visio 文件", + "Upload WPD Files": "上传 WPD 文件", + "Upload WPS Files": "上传 WPS 文件", + "Upload XML Files": "上传 XML 文件", + "Upload XPS Files": "上传 XPS 文件", + "Upload a PDF and click \"Generate Preview\" to see the booklet layout": "上传 PDF 并点击“生成预览”以查看小册子版式", + "Upload images and convert to PDF": "上传图片并转换为 PDF", + "Upload one or more PDF files": "上传一个或多个 PDF 文件", + "Uppercase A-Z, digits 0-9, and - . $ / + % SPACE": "大写字母 A-Z、数字 0-9,以及 - . $ / + % 空格", + "Use same password for all files": "所有文件使用相同的密码", + "User Password": "用户密码", + "VSD to PDF": "VSD 转 PDF", + "Valid From": "有效期起", + "Valid Signature": "签名有效", + "Valid Until": "有效期至", + "Validating {{n}} of {{length}}: {{name}}": "正在验证第 {{n}} 个,共 {{length}} 个:{{name}}", + "Validating...": "正在验证...", + "Value": "值", + "Value (e.g., Marketing)": "值(例如 Marketing)", + "Vertical": "垂直", + "Viewer not ready": "查看器未就绪", + "Viewer not ready. Please upload a PDF and wait for it to finish loading.": "查看器未就绪。请上传 PDF 并等待加载完成。", + "Visibility": "可见性", + "Visio Files": "Visio 文件", + "WPD to PDF": "WPD 转 PDF", + "WPS Files": "WPS 文件", + "WPS to PDF": "WPS 转 PDF", + "Watermark": "水印", + "Watermark added successfully!": "水印已成功添加!", + "Web Crypto API not available in this context": "此环境中无法使用 Web Crypto API", + "Web Crypto import/verify failed: {{error}}": "Web Crypto 导入/验证失败:{{error}}", + "WebP": "WebP", + "Whitelist": "白名单", + "Width ({{unit}})": "宽度({{unit}})", + "Word": "Word", + "Word Documents": "Word 文档", + "Word to PDF": "Word 转 PDF", + "WordPerfect Files": "WordPerfect 文件", + "Worker crashed": "Worker 已崩溃", + "Worker error occurred. Check console for details.": "Worker 发生错误。请查看控制台了解详情。", + "Workflow completed": "工作流已完成", + "Wrong password": "密码错误", + "Wrong password for: {{join}}": "以下文件密码错误:{{join}}", + "Wrong password or failed to decrypt \"{{name}}\".": "“{{name}}”密码错误或解密失败。", + "X Position": "X 位置", + "X: {{pdfX}}, Y: {{pdfY}} ": "X: {{pdfX}}, Y: {{pdfY}} ", + "XML Files": "XML 文件", + "XML to PDF": "XML 转 PDF", + "XMP Metadata": "XMP 元数据", + "XPS Files": "XPS 文件", + "XPS to PDF": "XPS 转 PDF", + "Y Position": "Y 位置", + "Year must be between 1900 and 2100": "年份必须在 1900 到 2100 之间", + "Yellow": "黄色", + "Yellowish": "泛黄", + "You cannot delete the last page of the document.": "无法删除文档的最后一页。", + "Your PDF has been cropped and the download has started.": "您的 PDF 已裁剪,下载已开始。", + "Your PDF has been downloaded successfully.": "您的 PDF 已成功下载。", + "Your PDF has been posterized.": "您的 PDF 已完成海报化。", + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?": "涂黑已应用到页面上,但此文件已加密,因此 BentoPDF 无法同时移除其属性、书签和附件中的已涂黑文本副本。如需彻底清理,请对未加密的副本进行涂黑,之后再使用“加密 PDF”添加密码。仍要下载吗?", + "Your workflow needs at least one input node and one output node to run.": "您的工作流至少需要一个输入节点和一个输出节点才能运行。", + "ZIP archive created successfully!": "ZIP 压缩包已成功创建!", + "Zoom(%)": "缩放(%)", + "e.g. dd/mm/yyyy HH:MM:ss": "例如 dd/mm/yyyy HH:MM:ss", + "form": "表单", + "https://example.com": "https://example.com", + "signature found": "个签名", + "signatures found": "个签名", + "{{brandName}} - {{title}}": "{{brandName}} - {{title}}", + "{{count}} node": "{{count}} 个节点", + "{{count}} nodes": "{{count}} 个节点", + "{{fileSize}} • 1 page": "{{fileSize}} • 1 页", + "{{fileSize}} • {{pageCount}} pages": "{{fileSize}} • {{pageCount}} 页", + "{{length}} Files Need a Password": "{{length}} 个文件需要密码", + "{{length}} PDF file(s) selected": "已选择 {{length}} 个 PDF 文件", + "{{length}} PDF files selected": "已选择 {{length}} 个 PDF 文件", + "{{length}} attachment(s) extracted successfully!": "已成功提取 {{length}} 个附件!", + "{{length}} file • {{totalPages}} total pages": "{{length}} 个文件 • 共 {{totalPages}} 页", + "{{length}} file(s) attached successfully.": "已成功附加 {{length}} 个文件。", + "{{length}} files • {{totalPages}} total pages": "{{length}} 个文件 • 共 {{totalPages}} 页", + "{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.": "{{message}} 它原本受密码保护,因此压缩后的副本没有密码。请使用“加密 PDF”重新添加密码。", + "{{name}} ({{size}}, {{totalPageCount}} pages)": "{{name}}({{size}},{{totalPageCount}} 页)", + "{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.": "{{name}} 带有数字签名,因此保持原样。压缩会破坏签名。如仍要压缩,请在“自定义设置”中开启“覆盖内容保护”;其签名将被移除。", + "{{name}} is not a valid PDF, so it was not added.": "{{name}} 不是有效的 PDF,因此未被添加。", + "{{name}} is password protected. Enter its password on the file card, then compress again.": "{{name}} 受密码保护。请在文件卡片上输入其密码,然后重新压缩。", + "{{name}}... (p{{pageNumber}})": "{{name}}...(第 {{pageNumber}} 页)", + "{{pageNumber}}": "{{pageNumber}}", + "{{page}} {{n}}": "{{page}} {{n}}", + "{{progress}}%": "{{progress}}%", + "{{rotation}}°": "{{rotation}}°", + "{{size}}": "{{size}}", + "{{size}} ·": "{{size}} ·", + "{{size}} • Could not load page count": "{{size}} • 无法加载页数", + "{{size}} • Loading pages...": "{{size}} • 正在加载页面...", + "{{size}} • Loading...": "{{size}} • 加载中...", + "{{size}} • {{getPageCount}} pages": "{{size}} • {{getPageCount}} 页", + "{{size}} • {{loadingPageCount}}": "{{size}} • {{loadingPageCount}}", + "{{size}} • {{numPages}}": "{{size}} • {{numPages}}", + "{{size}} • {{numPages}} pages": "{{size}} • {{numPages}} 页", + "{{size}} • {{numPages}} {{value}}": "{{size}} • {{numPages}} {{value}}", + "{{size}} • {{pageCount}} pages": "{{size}} • {{pageCount}} 页", + "{{size}} • {{totalPages}} pages": "{{size}} • {{totalPages}} 页", + "{{size}} • {{value}} pages": "{{size}} • {{value}} 页", + "{{successCount}} PDF(s) decrypted successfully.": "已成功解密 {{successCount}} 个 PDF。", + "{{successCount}} PDF(s) linearized successfully.": "已成功线性化 {{successCount}} 个 PDF。", + "{{totalPages}} pages → {{numSheets}} output sheets": "{{totalPages}} 页 → {{numSheets}} 张输出纸", + "{{validCount}} valid": "{{validCount}} 个有效", + "{{validFrom}} - {{validTo}}": "{{validFrom}} - {{validTo}}", + "{{value}}%": "{{value}}%", + "{{value}}x": "{{value}}x", + "{{width}} x {{height}} {{unit}}": "{{width}} x {{height}} {{unit}}", + "• {{label}}: 1 page": "• {{label}}:1 页", + "• {{label}}: {{count}} pages": "• {{label}}:{{count}} 页" +} diff --git a/public/sw.js b/public/sw.js index 2787608e..7ca3ec9e 100644 --- a/public/sw.js +++ b/public/sw.js @@ -109,7 +109,7 @@ self.addEventListener('fetch', (event) => { isLocal && (url.pathname.endsWith('.html') || url.pathname === '/' || - /^\/(en|ar|be|da|de|es|fr|id|it|ja|ko|nl|pl|pt|ru|sk|sv|tr|uk|vi|zh|zh-TW)(\/|$)/.test( + /^\/(en|ar|be|ca|da|de|es|fa|fr|id|it|ja|ko|nl|pl|pt|ru|sk|sv|tr|uk|vi|zh|zh-TW)(\/|$)/.test( url.pathname )) ) { diff --git a/scripts/apply-indexing-policy.mjs b/scripts/apply-indexing-policy.mjs new file mode 100644 index 00000000..4992800b --- /dev/null +++ b/scripts/apply-indexing-policy.mjs @@ -0,0 +1,36 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { isIndexingBlocked, resolveSiteUrl } from './indexing-policy.mjs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const DIST_DIR = path.resolve(__dirname, '../dist'); +const NOINDEX_META = ''; + +function listHtml(dir) { + return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) return listHtml(full); + return entry.name.endsWith('.html') ? [full] : []; + }); +} + +if (!isIndexingBlocked()) { + console.log('Indexing policy: search engines may index this build.'); +} else { + let updated = 0; + for (const file of listHtml(DIST_DIR)) { + const html = fs.readFileSync(file, 'utf-8'); + const robots = /]*>/i; + const next = robots.test(html) + ? html.replace(robots, NOINDEX_META) + : html.replace(/<\/head>/i, ` ${NOINDEX_META}\n `); + if (next !== html) { + fs.writeFileSync(file, next); + updated++; + } + } + console.log( + `Indexing policy: SITE_URL is ${resolveSiteUrl()}, so ${updated} pages were marked noindex. Set ALLOW_INDEXING=true to let search engines index this deployment.` + ); +} diff --git a/scripts/content-segments.mjs b/scripts/content-segments.mjs new file mode 100644 index 00000000..b1ef8459 --- /dev/null +++ b/scripts/content-segments.mjs @@ -0,0 +1,571 @@ +import { createHash } from 'crypto'; +import { serializeJsonLd } from './json-ld.mjs'; + +const INLINE_TAGS = new Set([ + 'a', + 'abbr', + 'b', + 'bdi', + 'bdo', + 'cite', + 'data', + 'del', + 'dfn', + 'em', + 'i', + 'ins', + 'mark', + 'q', + 's', + 'small', + 'span', + 'strong', + 'sub', + 'sup', + 'time', + 'u', +]); + +const ALWAYS_OPAQUE_TAGS = new Set([ + 'audio', + 'br', + 'canvas', + 'code', + 'iframe', + 'img', + 'input', + 'kbd', + 'math', + 'samp', + 'svg', + 'var', + 'video', + 'wbr', +]); + +const SKIPPED_TAGS = new Set([ + 'head', + 'noscript', + 'pre', + 'script', + 'style', + 'template', + 'textarea', +]); + +const TRANSLATABLE_ATTRIBUTES = ['alt', 'title', 'placeholder', 'aria-label']; + +const META_SELECTORS = [ + 'meta[name="description"]', + 'meta[property="og:title"]', + 'meta[property="og:description"]', + 'meta[name="twitter:title"]', + 'meta[name="twitter:description"]', +]; + +const PROTECTED_TERMS = [ + 'BentoPDF', + 'Hyper Compress', + 'Kura', + 'GitHub', + 'PyMuPDF', + 'Ghostscript', + 'CoherentPDF', + 'LibreOffice', + 'Tesseract', + 'DigitalOcean', + 'Fubarpie', + 'Trustpilot', + 'LinkedIn', + 'Discord', + 'WebAssembly', + 'PDF/A', + 'PDF/UA', + 'PDF/X', + 'PDF', +]; + +const PROTECTED_PATTERN = new RegExp( + PROTECTED_TERMS.map((term) => + term.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&') + ).join('|'), + 'gi' +); + +const LETTERS = /\p{L}{2}/u; +const PLACEHOLDER_SOURCE = '<(\\/?)(\\d+)(\\/?)>'; +const SPACES = /[ \t\r\n\f]+/g; + +function placeholders(text) { + return Array.from(text.matchAll(new RegExp(PLACEHOLDER_SOURCE, 'g'))); +} + +function hasPlaceholder(text) { + return new RegExp(PLACEHOLDER_SOURCE).test(text); +} + +export function segmentId(markup) { + return createHash('sha1').update(markup).digest('hex').slice(0, 12); +} + +function escapeText(text) { + return text + .replace(/&/g, '&') + .replace(//g, '>'); +} + +function decodeText(text) { + return text + .replace(/ /g, ' ') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/&/g, '&'); +} + +function isTranslatable(markup) { + const text = markup + .replace(new RegExp(PLACEHOLDER_SOURCE, 'g'), ' ') + .replace(PROTECTED_PATTERN, ' '); + return LETTERS.test(text); +} + +function normalize(text) { + return text.replace(SPACES, ' ').trim(); +} + +function tagOf(element) { + return element.tagName.toLowerCase(); +} + +function isInlineLike(element) { + const tag = tagOf(element); + if (ALWAYS_OPAQUE_TAGS.has(tag)) return true; + if (!INLINE_TAGS.has(tag)) return false; + if (element.hasAttribute('data-i18n')) return true; + return Array.from(element.children).every(isInlineLike); +} + +function isSkippedBlock(element) { + return ( + SKIPPED_TAGS.has(tagOf(element)) || + element.hasAttribute('data-i18n') || + element.getAttribute('translate') === 'no' || + element.hasAttribute('data-no-i18n') || + element.hasAttribute('contenteditable') + ); +} + +function isOpaque(element) { + return ( + ALWAYS_OPAQUE_TAGS.has(tagOf(element)) || + element.hasAttribute('data-i18n') || + element.getAttribute('translate') === 'no' || + !LETTERS.test(element.textContent || '') + ); +} + +function serialize(nodes, state) { + let out = ''; + for (const node of nodes) { + if (node.nodeType === 3) { + out += escapeText(node.data); + } else if (node.nodeType === 1) { + state.count += 1; + const index = state.count; + state.elements[index] = node; + if (isOpaque(node)) { + out += `<${index}/>`; + } else { + out += `<${index}>${serialize(Array.from(node.childNodes), state)}`; + } + } + } + return out; +} + +export function parseTranslation(text, elements) { + const root = { children: [] }; + const stack = [root]; + const seen = new Set(); + let last = 0; + const pushText = (piece) => { + if (!piece) return true; + if (/[<>]/.test(piece)) return false; + stack[stack.length - 1].children.push({ text: decodeText(piece) }); + return true; + }; + for (const match of placeholders(text)) { + if (!pushText(text.slice(last, match.index))) return null; + last = match.index + match[0].length; + const closing = match[1] === '/'; + const selfClosing = match[3] === '/'; + const index = Number(match[2]); + const source = elements[index]; + if (!source || (closing && selfClosing)) return null; + if (selfClosing) { + if (!isOpaque(source) || seen.has(index)) return null; + seen.add(index); + stack[stack.length - 1].children.push({ element: index }); + } else if (!closing) { + if (isOpaque(source) || seen.has(index)) return null; + seen.add(index); + const node = { element: index, children: [] }; + stack[stack.length - 1].children.push(node); + stack.push(node); + } else { + const top = stack[stack.length - 1]; + if (top.element !== index) return null; + stack.pop(); + } + } + if (!pushText(text.slice(last))) return null; + if (stack.length !== 1) return null; + if (seen.size !== Object.keys(elements).length) return null; + return root.children; +} + +function buildFragment(document, children, elements) { + const fragment = document.createDocumentFragment(); + for (const child of children) { + if ('text' in child) { + fragment.appendChild(document.createTextNode(child.text)); + } else if (child.children) { + const clone = elements[child.element].cloneNode(false); + clone.appendChild(buildFragment(document, child.children, elements)); + fragment.appendChild(clone); + } else { + fragment.appendChild(elements[child.element].cloneNode(true)); + } + } + return fragment; +} + +function significantNodes(nodes) { + return nodes.filter( + (node) => node.nodeType !== 3 || normalize(node.data) !== '' + ); +} + +function handleSegment(markup, tag, context, apply) { + const { options, stats } = context; + const id = segmentId(markup); + stats.found += 1; + if (options.record) options.record(id, markup, tag); + if (!options.translate) return; + const translation = options.translate(id); + if (!translation) return; + if (apply(translation)) stats.translated += 1; + else stats.invalid.add(id); +} + +function handleAttributes(element, context) { + for (const name of TRANSLATABLE_ATTRIBUTES) { + if (!element.hasAttribute(name)) continue; + if (element.hasAttribute(`data-i18n-${name}`)) continue; + const value = normalize(element.getAttribute(name)); + if (!isTranslatable(escapeText(value))) continue; + handleSegment(escapeText(value), tagOf(element), context, (translation) => { + if (hasPlaceholder(translation)) return false; + element.setAttribute(name, decodeText(translation)); + return true; + }); + } +} + +function handleRun(nodes, tag, context) { + const significant = significantNodes(nodes); + if (significant.length === 0) return; + for (const node of nodes) { + if (node.nodeType !== 1) continue; + handleAttributes(node, context); + node + .querySelectorAll('*') + .forEach((child) => handleAttributes(child, context)); + } + if ( + significant.length === 1 && + significant[0].nodeType === 1 && + !isOpaque(significant[0]) + ) { + handleRun(Array.from(significant[0].childNodes), tag, context); + return; + } + const state = { count: 0, elements: {} }; + const markup = normalize(serialize(nodes, state)); + if (!isTranslatable(markup)) return; + handleSegment(markup, tag, context, (translation) => { + const children = parseTranslation(translation, state.elements); + if (!children) return false; + const document = significant[0].ownerDocument; + const fragment = buildFragment(document, children, state.elements); + const anchor = nodes[0]; + anchor.parentNode.insertBefore(fragment, anchor); + nodes.forEach((node) => node.parentNode.removeChild(node)); + return true; + }); +} + +function visitChildren(parent, context) { + const tag = tagOf(parent); + let run = []; + const flush = () => { + if (run.length > 0) handleRun(run, tag, context); + run = []; + }; + for (const node of Array.from(parent.childNodes)) { + if (node.nodeType === 3) { + run.push(node); + } else if (node.nodeType === 1 && isInlineLike(node)) { + run.push(node); + } else { + flush(); + if (node.nodeType === 1 && !isSkippedBlock(node)) { + handleAttributes(node, context); + visitChildren(node, context); + } + } + } + flush(); +} + +function processMeta(document, context) { + const title = document.querySelector('title'); + if (title) { + const value = normalize(title.textContent || ''); + if (isTranslatable(escapeText(value))) { + handleSegment(escapeText(value), 'title', context, (translation) => { + if (hasPlaceholder(translation)) return false; + title.textContent = decodeText(translation); + return true; + }); + } + } + for (const selector of META_SELECTORS) { + document.querySelectorAll(selector).forEach((meta) => { + const value = normalize(meta.getAttribute('content') || ''); + if (!isTranslatable(escapeText(value))) return; + handleSegment(escapeText(value), 'meta', context, (translation) => { + if (hasPlaceholder(translation)) return false; + meta.setAttribute('content', decodeText(translation)); + return true; + }); + }); + } +} + +const STRUCTURED_DATA_TEXT_KEYS = new Set([ + 'name', + 'description', + 'text', + 'headline', +]); + +const STRUCTURED_DATA_SKIPPED_TYPES = new Set([ + 'BreadcrumbList', + 'FAQPage', + 'ImageObject', + 'ListItem', + 'Offer', + 'Organization', + 'Person', + 'Question', + 'WebSite', +]); + +function walkStructuredData(value, handle) { + if (Array.isArray(value)) { + value.forEach((item) => walkStructuredData(item, handle)); + return; + } + if (!value || typeof value !== 'object') return; + if (STRUCTURED_DATA_SKIPPED_TYPES.has(value['@type'])) return; + for (const [key, child] of Object.entries(value)) { + if (typeof child === 'string') { + if (STRUCTURED_DATA_TEXT_KEYS.has(key)) handle(value, key); + } else if (key === 'featureList' && Array.isArray(child)) { + child.forEach((item, index) => { + if (typeof item === 'string') handle(child, index); + }); + } else { + walkStructuredData(child, handle); + } + } +} + +function processStructuredData(document, context) { + document + .querySelectorAll('script[type="application/ld+json"]') + .forEach((script) => { + let data; + try { + data = JSON.parse(script.textContent || ''); + } catch { + return; + } + let changed = false; + walkStructuredData(data, (container, key) => { + const value = normalize(container[key]); + if (!isTranslatable(escapeText(value))) return; + handleSegment(escapeText(value), 'ld', context, (translation) => { + if (hasPlaceholder(translation)) return false; + container[key] = decodeText(translation); + changed = true; + return true; + }); + }); + if (changed) script.textContent = serializeJsonLd(data); + }); +} + +const BLOCK_TAGS = new Set([ + 'p', + 'div', + 'ul', + 'ol', + 'li', + 'table', + 'tr', + 'td', + 'th', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'section', +]); + +function blockText(node) { + if (node.nodeType !== 1) return node.textContent || ''; + const text = Array.from(node.childNodes).map(blockText).join(''); + return BLOCK_TAGS.has(tagOf(node)) ? ` ${text} ` : text; +} + +function rebuildFaqSchema(document) { + const items = []; + for (const details of document.querySelectorAll('details.faq-d')) { + const summary = details.querySelector('summary'); + if (!summary) continue; + const question = normalize(summary.textContent || ''); + const answerText = normalize( + Array.from(details.childNodes) + .filter((child) => child !== summary) + .map(blockText) + .join(' ') + ); + if (!question || !answerText) continue; + items.push({ + '@type': 'Question', + name: question, + acceptedAnswer: { '@type': 'Answer', text: answerText }, + }); + } + if (items.length === 0) return; + document + .querySelectorAll('script[type="application/ld+json"]') + .forEach((script) => { + let data; + try { + data = JSON.parse(script.textContent || ''); + } catch { + return; + } + if (data && data['@type'] === 'FAQPage') { + script.textContent = serializeJsonLd({ ...data, mainEntity: items }); + } + }); +} + +export function processDocument(document, options) { + const context = { + options, + stats: { found: 0, translated: 0, invalid: new Set() }, + }; + if (!options.skipMeta) processMeta(document, context); + const roots = options.roots + ? options.roots(document) + : [document.body].filter(Boolean); + for (const root of roots) { + if (!isSkippedBlock(root)) { + handleAttributes(root, context); + visitChildren(root, context); + } + } + if (!options.skipMeta) { + if (options.translate) rebuildFaqSchema(document); + processStructuredData(document, context); + } + return { + found: context.stats.found, + translated: context.stats.translated, + invalid: [...context.stats.invalid], + }; +} + +export const ENGLISH_ONLY_PAGES = new Set(['terms', 'privacy', 'licensing']); + +export function processPage(document, pageName, options) { + if (ENGLISH_ONLY_PAGES.has(pageName)) { + return processDocument(document, { + ...options, + skipMeta: true, + roots: shellRoots, + }); + } + return processDocument(document, options); +} + +export function shellRoots(document) { + return Array.from(document.querySelectorAll('header, nav, footer')).filter( + (element) => !element.parentElement?.closest('header, nav, footer') + ); +} + +function placeholderParents(markup) { + const stack = []; + const parents = []; + for (const match of placeholders(markup)) { + const [, closing, index, selfClosing] = match; + if (closing) { + if (stack.pop() !== index) return null; + } else { + parents.push(`${index}:${stack.at(-1) ?? ''}`); + if (!selfClosing) stack.push(index); + } + } + return stack.length === 0 ? parents.sort().join(',') : null; +} + +function placeholderSignature(markup) { + return placeholders(markup) + .map((match) => `${match[1]}${match[2]}${match[3]}`) + .sort() + .join(','); +} + +export function validateTranslationPair(sourceMarkup, translation) { + if (typeof translation !== 'string' || translation.trim() === '') { + return 'empty'; + } + if ( + placeholderSignature(sourceMarkup) !== placeholderSignature(translation) + ) { + return 'placeholders differ'; + } + const nesting = placeholderParents(translation); + if (nesting === null || nesting !== placeholderParents(sourceMarkup)) { + return 'placeholders nested differently'; + } + const stripped = translation.replace(new RegExp(PLACEHOLDER_SOURCE, 'g'), ''); + if (/[<>]/.test(stripped)) return 'contains raw angle brackets'; + const unknownEntity = stripped.match( + /&(?!(?:amp|lt|gt|quot|nbsp|#39);)[#\w]+;/ + ); + if (unknownEntity) return `unsupported entity ${unknownEntity[0]}`; + return null; +} diff --git a/scripts/docs-languages.mjs b/scripts/docs-languages.mjs new file mode 100644 index 00000000..317be1e0 --- /dev/null +++ b/scripts/docs-languages.mjs @@ -0,0 +1,50 @@ +import fs from 'fs'; +import path from 'path'; + +export function listDocsSourcePages(docsDir, languageCodes) { + const codes = new Set(languageCodes); + const pages = []; + const walk = (dir, relative) => { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if ( + entry.name.startsWith('.') || + entry.name === 'node_modules' || + entry.name === 'public' + ) { + continue; + } + const next = relative ? `${relative}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + if (!relative && codes.has(entry.name)) continue; + walk(path.join(dir, entry.name), next); + } else if (entry.name.endsWith('.md')) { + pages.push(next); + } + } + }; + walk(docsDir, ''); + return pages.sort(); +} + +export function completeDocsLanguages(docsDir, languageCodes, requested) { + const pages = listDocsSourcePages(docsDir, languageCodes); + const complete = []; + const incomplete = []; + for (const lang of languageCodes) { + if (!fs.existsSync(path.join(docsDir, lang))) continue; + const missing = pages.filter( + (page) => !fs.existsSync(path.join(docsDir, lang, page)) + ); + if (missing.length === 0) complete.push(lang); + else + incomplete.push({ lang, missing: missing.length, total: pages.length }); + } + const wanted = + !requested || requested === 'all' + ? complete + : requested + .split(',') + .map((lang) => lang.trim()) + .filter((lang) => complete.includes(lang)); + return { enabled: wanted, incomplete }; +} diff --git a/scripts/docs-translations.mjs b/scripts/docs-translations.mjs new file mode 100644 index 00000000..06d75605 --- /dev/null +++ b/scripts/docs-translations.mjs @@ -0,0 +1,592 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ROOT = path.resolve(__dirname, '..'); +const DOCS_DIR = path.join(ROOT, 'docs'); +const LOCALES_DIR = path.join(ROOT, 'public/locales'); +const FILE_EXTENSION = /\.[a-z0-9]{2,5}$/i; + +const SCRIPT_RANGES = { + ar: /[\u0600-\u06ff]/, + fa: /[\u0600-\u06ff]/, + be: /[\u0400-\u04ff]/, + ru: /[\u0400-\u04ff]/, + uk: /[\u0400-\u04ff]/, + ja: /[\u3040-\u30ff\u4e00-\u9fff]/, + zh: /[\u4e00-\u9fff]/, + 'zh-TW': /[\u4e00-\u9fff]/, + ko: /[\uac00-\ud7af]/, +}; + +const ENGLISH_MARKERS = new Set([ + 'the', + 'and', + 'your', + 'with', + 'you', + 'this', + 'that', + 'from', + 'are', + 'will', + 'how', + 'what', + 'when', + 'can', +]); + +function proseOf(markdown) { + let fenced = false; + return markdown + .split('\n') + .filter((line) => { + if (/^\s*(```|~~~)/.test(line)) { + fenced = !fenced; + return false; + } + return !fenced && !/^\s*(\||:::|---)/.test(line); + }) + .join(' ') + .replace(/`[^`]*`/g, ' ') + .replace(/\]\([^)]*\)/g, ']') + .replace(/https?:\/\/\S+/g, ' '); +} + +function languages() { + return fs + .readdirSync(LOCALES_DIR) + .filter( + (entry) => + entry !== 'en' && + fs.statSync(path.join(LOCALES_DIR, entry)).isDirectory() + ) + .sort(); +} + +export function listSourceFiles() { + const langs = new Set(languages()); + const files = []; + const walk = (dir, relative) => { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name === 'node_modules' || entry.name.startsWith('.')) continue; + if (entry.name === 'public') continue; + const next = relative ? `${relative}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + if (!relative && langs.has(entry.name)) continue; + walk(path.join(dir, entry.name), next); + } else if (entry.name.endsWith('.md')) { + files.push(next); + } + } + }; + walk(DOCS_DIR, ''); + return files.sort(); +} + +function wordCount(text) { + return text.split(/\s+/).filter(Boolean).length; +} + +export function localizeLinks(markdown, lang) { + const prefix = `/${lang}`; + const shouldPrefix = (target) => { + if (!target.startsWith('/') || target.startsWith('//')) return false; + if (target === prefix || target.startsWith(`${prefix}/`)) return false; + if (/^\/(images|docs)(\/|$)/.test(target)) return false; + const pathOnly = target.split(/[?#]/)[0]; + return !FILE_EXTENSION.test(pathOnly); + }; + const lines = markdown.split('\n'); + let fenced = false; + return lines + .map((line) => { + if (/^\s*(```|~~~)/.test(line)) { + fenced = !fenced; + return line; + } + if (fenced) return line; + const linkRewritten = line.replace( + /(? + shouldPrefix(target) ? `${open}${prefix}${target}${close}` : match + ); + return linkRewritten.replace( + /^(\s*(?:-\s+)?link:\s*)(\/\S*)\s*$/, + (match, head, target) => + shouldPrefix(target) ? `${head}${prefix}${target}` : match + ); + }) + .join('\n'); +} + +const SLUG_CONTROL = /[\u0000-\u001f]/g; +const SLUG_SPECIAL = + /[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'\u201c\u201d\u2018\u2019<>,.?/]+/g; +const SLUG_COMBINING = /[\u0300-\u036f]/g; + +function slugify(text) { + return text + .normalize('NFKD') + .replace(SLUG_COMBINING, '') + .replace(SLUG_CONTROL, '') + .replace(SLUG_SPECIAL, '-') + .replace(/-{2,}/g, '-') + .replace(/^-+|-+$/g, '') + .replace(/^(\d)/, '_$1') + .toLowerCase(); +} + +function listHeadings(markdown) { + const headings = []; + const lines = markdown.split('\n'); + let fenced = false; + let inFrontmatter = lines[0] === '---'; + lines.forEach((line, index) => { + if (inFrontmatter) { + if (index > 0 && line === '---') inFrontmatter = false; + return; + } + if (/^\s*(```|~~~)/.test(line)) { + fenced = !fenced; + return; + } + if (fenced) return; + const match = line.match(/^(#{1,6})\s+(.*?)\s*$/); + if (!match) return; + const explicit = match[2].match(/\s*\{#([^}]+)\}\s*$/); + const text = match[2].replace(/\s*\{#[^}]+\}\s*$/, ''); + headings.push({ + line: index, + text, + explicitId: explicit ? explicit[1] : null, + }); + }); + return headings; +} + +function headingId(text) { + return slugify( + text + .replace(/`/g, '') + .replace(/!?\[([^\]]*)\]\([^)]*\)/g, '$1') + .replace(/\*/g, '') + ); +} + +export function quoteFrontmatter(markdown) { + const match = markdown.match(/^---\n([\s\S]*?)\n---\n/); + if (!match) return markdown; + const body = match[1] + .split('\n') + .map((line) => { + const field = line.match(/^(\s*(?:- )?[\w-]+):[ \t]+(.+)$/); + if (!field) return line; + const value = field[2].trim(); + if (/^["'|>]/.test(value)) return line; + if (!/: |\s#|^[&*!%@`{[]/.test(value)) return line; + return `${field[1]}: "${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`; + }) + .join('\n'); + return `---\n${body}\n---\n${markdown.slice(match[0].length)}`; +} + +function headingIds(markdown) { + const used = new Map(); + return listHeadings(markdown).map((heading) => { + if (heading.explicitId) return heading.explicitId; + const base = headingId(heading.text); + const count = used.get(base) || 0; + used.set(base, count + 1); + return count === 0 ? base : `${base}-${count}`; + }); +} + +export function removeGeneratedAnchors(source, translated) { + const english = listHeadings(source); + const target = listHeadings(translated); + if (english.length !== target.length) return translated; + const lines = translated.split('\n'); + target.forEach((heading, index) => { + if (english[index].explicitId) { + lines[heading.line] = lines[heading.line].replace( + /\s*\{#\\?[^}]+\}\s*$/, + ` {#${english[index].explicitId}}` + ); + } else if (heading.explicitId) { + lines[heading.line] = lines[heading.line].replace( + /\s*\{#\\?[^}]+\}\s*$/, + '' + ); + } + }); + return lines.join('\n'); +} + +export function anchorMap(source, translated) { + const english = headingIds(source); + const target = headingIds(translated); + const map = new Map(); + if (english.length !== target.length) return { map, ids: new Set(target) }; + english.forEach((id, index) => map.set(id, target[index])); + return { map, ids: new Set(target) }; +} + +function linkedDocsFile(target, currentFile, lang) { + const pathPart = target.split('#')[0].split('?')[0]; + let relative; + if (pathPart === '') { + return currentFile; + } else if (pathPart === `/${lang}` || pathPart.startsWith(`/${lang}/`)) { + relative = pathPart.slice(lang.length + 2); + } else if (!pathPart.startsWith('/') && !/^[a-z]+:/i.test(pathPart)) { + relative = path.posix.join(path.posix.dirname(currentFile), pathPart); + } else { + return null; + } + relative = relative.replace(/\.(md|html)$/, '').replace(/^\/+/, ''); + if (relative === '' || relative.endsWith('/')) return `${relative}index.md`; + return `${relative}.md`; +} + +export function translateAnchors(markdown, currentFile, lang, anchors) { + let fenced = false; + return markdown + .split('\n') + .map((line) => { + if (/^\s*(```|~~~)/.test(line)) { + fenced = !fenced; + return line; + } + if (fenced) return line; + return line.replace( + /(? { + const file = linkedDocsFile(target, currentFile, lang); + const entry = file && anchors.get(file); + if (!entry) return match; + const hashIndex = target.indexOf('#'); + const hash = decodeURIComponent(target.slice(hashIndex + 1)); + if (entry.ids.has(hash) || !entry.map.has(hash)) return match; + return `${open}${target.slice(0, hashIndex + 1)}${entry.map.get(hash)}${close}`; + } + ); + }) + .join('\n'); +} + +export function brokenAnchors(markdown, currentFile, lang, anchors) { + const broken = []; + let fenced = false; + for (const line of markdown.split('\n')) { + if (/^\s*(```|~~~)/.test(line)) { + fenced = !fenced; + continue; + } + if (fenced) continue; + for (const match of line.matchAll( + /(? 0) { + const frontmatter = markdown.slice(3, end); + for (const line of frontmatter.split('\n')) { + const key = line.match(/^([A-Za-z_][\w-]*):/); + if (key) frontmatterKeys.push(key[1]); + } + body = markdown.slice(end + 4); + } + } + const headings = []; + const fences = []; + const links = []; + const containers = []; + const tables = []; + let fenced = null; + let current = null; + let tableRows = 0; + for (const line of body.split('\n')) { + const fence = line.match(/^\s*(```|~~~)/); + if (fence) { + if (fenced === null) { + fenced = { marker: fence[1], lines: [line.trim()] }; + } else { + fenced.lines.push(line.trim()); + fences.push(fenced.lines.join('\n')); + fenced = null; + } + continue; + } + if (fenced) { + fenced.lines.push(line); + continue; + } + const heading = line.match(/^(#{1,6})\s/); + if (heading) headings.push(heading[1].length); + const container = line.match(/^:::\s*([a-z-]+)?/); + if (container) containers.push(container[1] || 'end'); + if (/^\s*\|/.test(line)) { + tableRows += 1; + current = true; + } else if (current) { + tables.push(tableRows); + tableRows = 0; + current = null; + } + for (const match of line.matchAll(/!?\[[^\]]*\]\(([^)\s]+)[^)]*\)/g)) { + links.push(match[1]); + } + } + if (current) tables.push(tableRows); + return { + frontmatterKeys, + headings, + fences, + links: links.sort(), + containers, + tables, + }; +} + +function sameJson(a, b) { + return JSON.stringify(a) === JSON.stringify(b); +} + +export function compareStructure(source, translated, lang) { + const problems = []; + const a = summarize(source); + const b = summarize(translated); + if (!sameJson(a.frontmatterKeys, b.frontmatterKeys)) { + problems.push('frontmatter keys differ'); + } + if (!sameJson(a.headings, b.headings)) problems.push('heading levels differ'); + if (!sameJson(a.fences, b.fences)) problems.push('code blocks differ'); + if (!sameJson(a.containers, b.containers)) problems.push('containers differ'); + if (!sameJson(a.tables, b.tables)) problems.push('table sizes differ'); + const withoutAnchor = (link) => link.replace(/#.*$/, ''); + const localizedLinks = (links) => + links + .map((link) => + link.startsWith(`/${lang}/`) ? link.slice(lang.length + 1) : link + ) + .map(withoutAnchor) + .sort(); + if (!sameJson(a.links.map(withoutAnchor).sort(), localizedLinks(b.links))) { + problems.push('link targets differ'); + } + if ( + /—/.test( + translated + .replace(/^(```|~~~)[\s\S]*?^\1/gm, '') + .replace(/`[^`\n]*`/g, '') + ) + ) { + problems.push('contains an em dash'); + } + if (translated.trim() === source.trim()) + problems.push('identical to English'); + const prose = proseOf(translated); + const proseWords = wordCount(prose); + const sourceWords = wordCount(proseOf(source)); + if (sourceWords > 40) { + const range = SCRIPT_RANGES[lang]; + if (range && !range.test(prose)) problems.push('not in the target script'); + const tokens = prose + .toLowerCase() + .split(/[^\p{L}]+/u) + .filter(Boolean); + if (!range && tokens.length >= 40) { + const hits = tokens.filter((token) => ENGLISH_MARKERS.has(token)).length; + if (hits / tokens.length >= 0.08) problems.push('looks like English'); + } + const unspaced = ['ja', 'zh', 'zh-TW'].includes(lang); + const ratio = unspaced + ? prose.replace(/\s+/g, '').length / + proseOf(source).replace(/\s+/g, '').length + : proseWords / sourceWords; + if (unspaced ? ratio < 0.15 || ratio > 1.5 : ratio < 0.4 || ratio > 3) + problems.push(`length ratio ${ratio.toFixed(2)}`); + } + return problems; +} + +function groupsCommand(outFile, wordsPerGroup) { + const files = listSourceFiles(); + const groups = []; + let current = []; + let words = 0; + for (const file of files) { + const count = wordCount( + fs.readFileSync(path.join(DOCS_DIR, file), 'utf-8') + ); + if (current.length > 0 && words + count > wordsPerGroup) { + groups.push(current); + current = []; + words = 0; + } + current.push(file); + words += count; + } + if (current.length > 0) groups.push(current); + fs.mkdirSync(path.dirname(outFile), { recursive: true }); + fs.writeFileSync(outFile, JSON.stringify(groups, null, 2) + '\n'); + console.log(`${files.length} files in ${groups.length} groups`); +} + +const ENGLISH_ONLY_DOCS = new Set(['licensing.md']); + +function checkCommand(lang, only) { + const files = only.length > 0 ? only : listSourceFiles(); + const results = []; + let missing = 0; + const anchors = anchorsFor(translatedDocs(lang)); + for (const file of files) { + const translatedPath = path.join(DOCS_DIR, lang, file); + if (!fs.existsSync(translatedPath)) { + missing += 1; + results.push({ file, problems: ['missing'] }); + continue; + } + if (ENGLISH_ONLY_DOCS.has(file)) continue; + const translated = fs.readFileSync(translatedPath, 'utf-8'); + const problems = compareStructure( + fs.readFileSync(path.join(DOCS_DIR, file), 'utf-8'), + translated, + lang + ); + const broken = brokenAnchors(translated, file, lang, anchors); + if (broken.length > 0) { + problems.push(`broken anchor links: ${broken.join(', ')}`); + } + if (/^#{1,6} .*\{#\\/m.test(translated)) { + problems.push('escaped heading anchor'); + } + if (problems.length > 0) results.push({ file, problems }); + } + const bad = results.filter((entry) => !entry.problems.includes('missing')); + console.log( + `${lang}: ${files.length - missing}/${files.length} files present, ${bad.length} with problems` + ); + if (results.length > 0) + console.log(JSON.stringify(results.slice(0, 40), null, 2)); + process.exitCode = bad.length > 0 ? 1 : 0; +} + +function translatedDocs(lang) { + const docs = new Map(); + for (const file of listSourceFiles()) { + const target = path.join(DOCS_DIR, lang, file); + if (!fs.existsSync(target)) continue; + docs.set(file, { + target, + source: fs.readFileSync(path.join(DOCS_DIR, file), 'utf-8'), + translated: fs.readFileSync(target, 'utf-8'), + }); + } + return docs; +} + +function anchorsFor(docs) { + const anchors = new Map(); + for (const [file, doc] of docs) { + anchors.set(file, anchorMap(doc.source, doc.translated)); + } + return anchors; +} + +function localizeCommand(lang) { + let changed = 0; + for (const file of ENGLISH_ONLY_DOCS) { + const target = path.join(DOCS_DIR, lang, file); + fs.mkdirSync(path.dirname(target), { recursive: true }); + fs.copyFileSync(path.join(DOCS_DIR, file), target); + } + const docs = translatedDocs(lang); + const originals = new Map(); + for (const [file, doc] of docs) { + originals.set(file, doc.translated); + doc.translated = quoteFrontmatter( + removeGeneratedAnchors(doc.source, localizeLinks(doc.translated, lang)) + ); + } + const anchors = anchorsFor(docs); + for (const [file, doc] of docs) { + const after = translateAnchors(doc.translated, file, lang, anchors); + if (after !== originals.get(file)) { + fs.writeFileSync(doc.target, after); + changed += 1; + } + } + console.log(`${lang}: localized links and anchors in ${changed} files`); +} + +function labelsCheckCommand(lang) { + const sourceFile = path.join(DOCS_DIR, '.vitepress/i18n/source.json'); + const source = JSON.parse(fs.readFileSync(sourceFile, 'utf-8')); + const targetFile = path.join(DOCS_DIR, `.vitepress/i18n/${lang}.json`); + if (!fs.existsSync(targetFile)) { + console.log(`${lang}: labels file is missing`); + process.exitCode = 1; + return; + } + const labels = JSON.parse(fs.readFileSync(targetFile, 'utf-8')); + const problems = []; + for (const key of source) { + const value = labels[key]; + if (typeof value !== 'string' || value.trim() === '') { + problems.push({ key, problem: 'missing or empty' }); + } else if (/\u2014/.test(value)) { + problems.push({ key, problem: 'contains an em dash' }); + } + } + for (const key of Object.keys(labels)) { + if (!source.includes(key)) problems.push({ key, problem: 'unknown key' }); + } + console.log( + `${lang}: ${source.length - problems.length}/${source.length} labels ok` + ); + if (problems.length > 0) + console.log(JSON.stringify(problems.slice(0, 30), null, 2)); + process.exitCode = problems.length > 0 ? 1 : 0; +} + +function statusCommand() { + const files = listSourceFiles(); + for (const lang of languages()) { + const present = files.filter((file) => + fs.existsSync(path.join(DOCS_DIR, lang, file)) + ).length; + console.log(`${lang.padEnd(6)} ${present}/${files.length}`); + } +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const [command, ...args] = process.argv.slice(2); + if (command === 'groups') groupsCommand(args[0], Number(args[1] || 6000)); + else if (command === 'check') checkCommand(args[0], args.slice(1)); + else if (command === 'localize') localizeCommand(args[0]); + else if (command === 'labels') labelsCheckCommand(args[0]); + else if (command === 'status') statusCommand(); + else { + console.error( + 'Usage: docs-translations.mjs groups [words] | check [files...] | localize | labels | status' + ); + process.exitCode = 2; + } +} diff --git a/scripts/extract-content-segments.mjs b/scripts/extract-content-segments.mjs new file mode 100644 index 00000000..cb90e751 --- /dev/null +++ b/scripts/extract-content-segments.mjs @@ -0,0 +1,84 @@ +import fs from 'fs'; +import path from 'path'; +import { JSDOM } from 'jsdom'; +import { fileURLToPath } from 'url'; +import { ENGLISH_ONLY_PAGES, processPage } from './content-segments.mjs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const args = process.argv.slice(2); +const outIndex = args.indexOf('--out'); +const outFile = path.resolve( + outIndex >= 0 + ? args.splice(outIndex, 2)[1] + : path.join(__dirname, '../translations/source.json') +); +const distDirs = ( + args.length > 0 ? args : [path.join(__dirname, '../dist')] +).map((dir) => path.resolve(dir)); + +const existing = fs.existsSync(outFile) + ? JSON.parse(fs.readFileSync(outFile, 'utf-8')) + : {}; + +const segments = new Map(); +const pageIds = new Map(); +let pageCount = 0; + +for (const distDir of distDirs) { + const pages = fs + .readdirSync(distDir) + .filter((file) => file.endsWith('.html')) + .sort(); + pageCount += pages.length; + for (const file of pages) { + const pageName = file.replace(/\.html$/, ''); + const dom = new JSDOM(fs.readFileSync(path.join(distDir, file), 'utf-8')); + processPage(dom.window.document, pageName, { + record(id, text, tag) { + const entry = segments.get(id) || { text, tags: new Set(), pages: [] }; + entry.tags.add(tag); + if (!entry.pages.includes(pageName)) entry.pages.push(pageName); + segments.set(id, entry); + if (!ENGLISH_ONLY_PAGES.has(pageName)) { + if (!pageIds.has(pageName)) pageIds.set(pageName, new Set()); + pageIds.get(pageName).add(id); + } + }, + }); + dom.window.close(); + } +} + +const result = {}; +for (const id of [...segments.keys()].sort()) { + const entry = segments.get(id); + result[id] = { + text: entry.text, + tags: [...entry.tags].sort(), + pages: entry.pages.slice(0, 3), + pageCount: entry.pages.length, + }; +} + +fs.mkdirSync(path.dirname(outFile), { recursive: true }); +fs.writeFileSync(outFile, JSON.stringify(result, null, 2) + '\n'); + +const pageIndex = {}; +for (const page of [...pageIds.keys()].sort()) { + pageIndex[page] = [...pageIds.get(page)].sort(); +} +fs.writeFileSync( + path.join(path.dirname(outFile), 'pages.json'), + JSON.stringify(pageIndex) + '\n' +); + +const added = Object.keys(result).filter((id) => !existing[id]).length; +const removed = Object.keys(existing).filter((id) => !result[id]).length; +const words = Object.values(result).reduce( + (sum, entry) => sum + entry.text.split(/\s+/).length, + 0 +); +console.log( + `Extracted ${Object.keys(result).length} unique segments (${words} words) from ${pageCount} pages. Added ${added}, removed ${removed}.` +); diff --git a/scripts/extract-docs-labels.mjs b/scripts/extract-docs-labels.mjs new file mode 100644 index 00000000..586cad37 --- /dev/null +++ b/scripts/extract-docs-labels.mjs @@ -0,0 +1,28 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { nav, sidebar } from '../docs/.vitepress/navigation.mjs'; +import { + DESCRIPTION, + FOOTER_MESSAGE, + THEME_LABELS, +} from '../docs/.vitepress/i18n/theme-labels.mjs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const OUT_FILE = path.resolve(__dirname, '../docs/.vitepress/i18n/source.json'); + +const labels = new Set([DESCRIPTION, FOOTER_MESSAGE, ...THEME_LABELS]); + +function collect(items) { + for (const item of items) { + if (item.text) labels.add(item.text); + if (item.items) collect(item.items); + } +} + +collect(nav); +Object.values(sidebar).forEach(collect); + +const sorted = [...labels].sort((a, b) => a.localeCompare(b)); +fs.writeFileSync(OUT_FILE, JSON.stringify(sorted, null, 2) + '\n'); +console.log(`Wrote ${sorted.length} docs labels to ${OUT_FILE}`); diff --git a/scripts/extract-ui-strings.mjs b/scripts/extract-ui-strings.mjs new file mode 100644 index 00000000..ed8741cf --- /dev/null +++ b/scripts/extract-ui-strings.mjs @@ -0,0 +1,142 @@ +import fs from 'fs'; +import path from 'path'; +import ts from 'typescript'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ROOT = path.resolve(__dirname, '../src/js'); +const OUT_FILE = path.resolve(__dirname, '../translations/ui-source.json'); +const SKIP_DIRS = new Set(['editcore', 'types', 'i18n', 'config']); +const HELPER_ARGUMENTS = { + showAlert: 2, + showLoader: 1, + showAlertModal: 2, + showModal: 2, +}; +const LETTERS = /\p{L}{2}/u; + +export function extractUiStrings() { + const files = []; + (function walk(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (!SKIP_DIRS.has(entry.name)) walk(full); + } else if (/\.ts$/.test(entry.name)) { + files.push(full); + } + } + })(ROOT); + + const strings = new Map(); + + const formatControlLabel = (key) => + key + .replace(/([A-Z])/g, ' $1') + .replace(/^./, (c) => c.toUpperCase()) + .trim(); + + function add(text, file) { + if (!LETTERS.test(text)) return; + const entry = strings.get(text) || { files: [] }; + const relative = path.relative(ROOT, file); + if (!entry.files.includes(relative)) entry.files.push(relative); + strings.set(text, entry); + } + + function isStringLike(node) { + return ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node); + } + + function collectLiterals(node, file) { + if (isStringLike(node)) { + add(node.text, file); + } else if (ts.isParenthesizedExpression(node)) { + collectLiterals(node.expression, file); + } else if (ts.isConditionalExpression(node)) { + collectLiterals(node.whenTrue, file); + collectLiterals(node.whenFalse, file); + } else if ( + ts.isBinaryExpression(node) && + (node.operatorToken.kind === ts.SyntaxKind.BarBarToken || + node.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken) + ) { + collectLiterals(node.left, file); + collectLiterals(node.right, file); + } + } + + for (const file of files) { + const source = fs.readFileSync(file, 'utf8'); + const sf = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true); + const visit = (node) => { + if (ts.isCallExpression(node)) { + const callee = ts.isIdentifier(node.expression) + ? node.expression.text + : ts.isPropertyAccessExpression(node.expression) + ? node.expression.name.text + : ''; + if ( + (callee === 'trText' || callee === 'trHtml') && + node.arguments.length > 0 + ) { + collectLiterals(node.arguments[0], file); + } else if (callee in HELPER_ARGUMENTS) { + node.arguments + .slice(0, HELPER_ARGUMENTS[callee]) + .forEach((argument) => collectLiterals(argument, file)); + } else if ( + callee === 'addControl' && + node.arguments.length > 0 && + isStringLike(node.arguments[0]) + ) { + add(formatControlLabel(node.arguments[0].text), file); + } + } + const relative = path.relative(ROOT, file); + if ( + relative === path.join('workflow', 'nodes', 'registry.ts') && + ts.isPropertyAssignment(node) && + ts.isIdentifier(node.name) && + ['label', 'description'].includes(node.name.text) && + isStringLike(node.initializer) + ) { + add(node.initializer.text, file); + } + if ( + relative === path.join('workflow', 'nodes', 'control-specs.ts') && + ts.isArrayLiteralExpression(node) && + node.elements.length === 2 && + node.elements.every(isStringLike) + ) { + add(node.elements[1].text, file); + } + ts.forEachChild(node, visit); + }; + visit(sf); + } + + const result = {}; + for (const text of [...strings.keys()].sort()) { + const entry = strings.get(text); + result[text] = { + files: entry.files.slice(0, 3), + fileCount: entry.files.length, + }; + } + return { result, fileCount: files.length }; +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const { result, fileCount } = extractUiStrings(); + fs.mkdirSync(path.dirname(OUT_FILE), { recursive: true }); + fs.writeFileSync(OUT_FILE, JSON.stringify(result, null, 2) + '\n'); + + const words = Object.keys(result).reduce( + (sum, text) => sum + text.split(/\s+/).length, + 0 + ); + console.log( + `Extracted ${Object.keys(result).length} UI strings (${words} words) from ${fileCount} files.` + ); +} diff --git a/scripts/generate-i18n-pages.mjs b/scripts/generate-i18n-pages.mjs index 1207fa71..e622aa7d 100644 --- a/scripts/generate-i18n-pages.mjs +++ b/scripts/generate-i18n-pages.mjs @@ -3,12 +3,18 @@ import path from 'path'; import { JSDOM } from 'jsdom'; import { fileURLToPath } from 'url'; import { serializeJsonLd } from './json-ld.mjs'; +import { ENGLISH_ONLY_PAGES, processPage } from './content-segments.mjs'; +import { completeDocsLanguages } from './docs-languages.mjs'; +import { createTranslationChecker } from './page-translation.mjs'; +import { canonicalBasePath } from './indexing-policy.mjs'; +import { applyServerTranslations } from './server-translations.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const DIST_DIR = path.resolve(__dirname, '../dist'); const LOCALES_DIR = path.resolve(__dirname, '../public/locales'); +const CONTENT_DIR = path.resolve(__dirname, '../translations'); const SITE_URL = (process.env.SITE_URL || 'https://www.bentopdf.com').replace( /\/+$/, '' @@ -19,6 +25,14 @@ const languages = fs.readdirSync(LOCALES_DIR).filter((file) => { return fs.statSync(path.join(LOCALES_DIR, file)).isDirectory(); }); +const OFFICIAL_DOCS_URL = 'https://www.bentopdf.com/docs'; + +const docsLanguages = completeDocsLanguages( + path.resolve(__dirname, '../docs'), + languages.filter((lang) => lang !== 'en'), + process.env.DOCS_LANGUAGES +).enabled; + const toCamelCase = (str) => { return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()); }; @@ -34,7 +48,11 @@ function loadAllTranslations() { if (lang === 'en') continue; const commonPath = path.join(LOCALES_DIR, `${lang}/common.json`); const toolsPath = path.join(LOCALES_DIR, `${lang}/tools.json`); + const contentPath = path.join(CONTENT_DIR, lang, 'content.json'); translations[lang] = { + content: fs.existsSync(contentPath) + ? JSON.parse(fs.readFileSync(contentPath, 'utf-8')) + : {}, common: fs.existsSync(commonPath) ? JSON.parse(fs.readFileSync(commonPath, 'utf-8')) : {}, @@ -54,54 +72,18 @@ function loadEnglishTools() { const ENGLISH_TOOLS = loadEnglishTools(); +const contentTotals = {}; + // TODO@ALAM: Let users build only a single language function buildUrl(langPrefix, pagePath) { const parts = [SITE_URL]; - if (BASE_PATH && BASE_PATH !== '') parts.push(BASE_PATH.replace(/^\//, '')); + const canonicalBase = canonicalBasePath(); + if (canonicalBase) parts.push(canonicalBase.replace(/^\//, '')); if (langPrefix) parts.push(langPrefix); if (pagePath) parts.push(pagePath.replace(/^\//, '')); return parts.filter(Boolean).join('/').replace(/\/+$/, '') || SITE_URL; } -function resolveTranslation(langResources, key) { - let namespace = 'common'; - let keyPath = key; - const colonIndex = key.indexOf(':'); - if (colonIndex !== -1) { - namespace = key.slice(0, colonIndex); - keyPath = key.slice(colonIndex + 1); - } - let node = langResources[namespace]; - for (const segment of keyPath.split('.')) { - if (node == null || typeof node !== 'object') return null; - node = node[segment]; - } - return typeof node === 'string' && node ? node : null; -} - -function applyServerTranslations(document, langResources) { - document.querySelectorAll('[data-i18n]').forEach((element) => { - const key = element.getAttribute('data-i18n'); - if (!key) return; - const translation = resolveTranslation(langResources, key); - if (translation) element.textContent = translation; - }); - - document.querySelectorAll('[data-i18n-placeholder]').forEach((element) => { - const key = element.getAttribute('data-i18n-placeholder'); - if (!key) return; - const translation = resolveTranslation(langResources, key); - if (translation) element.setAttribute('placeholder', translation); - }); - - document.querySelectorAll('[data-i18n-title]').forEach((element) => { - const key = element.getAttribute('data-i18n-title'); - if (!key) return; - const translation = resolveTranslation(langResources, key); - if (translation) element.setAttribute('title', translation); - }); -} - const ORGANIZATION_LD_MARKER = 'data-bentopdf-organization'; function injectOrganizationLd(document) { @@ -158,7 +140,13 @@ function removeStaticBreadcrumbLd(document) { } } -function injectToolBreadcrumb(document, lang, toolName, toolUrl) { +function injectToolBreadcrumb( + document, + lang, + toolName, + toolUrl, + label = 'Breadcrumb' +) { const h1 = document.querySelector('h1[data-i18n^="tools:"]'); if (!h1) return; if (document.querySelector(`[${BREADCRUMB_MARKER}]`)) return; @@ -167,8 +155,9 @@ function injectToolBreadcrumb(document, lang, toolName, toolUrl) { const homeUrl = buildUrl(lang === 'en' ? '' : lang, ''); const nav = document.createElement('nav'); - nav.setAttribute('aria-label', 'Breadcrumb'); + nav.setAttribute('aria-label', label); nav.setAttribute(BREADCRUMB_MARKER, ''); + nav.setAttribute('data-no-i18n', ''); nav.className = 'text-sm text-gray-400 mb-4'; const homeLink = document.createElement('a'); @@ -229,14 +218,20 @@ function translationKeyForFile(filenameNoExt) { return KEY_MAPPING[filenameNoExt] || toCamelCase(filenameNoExt); } +let isPageTranslated = null; + function translatedLangsForFile(filenameNoExt, translations) { - const translationKey = translationKeyForFile(filenameNoExt); - return languages.filter( - (l) => - l === 'en' || - filenameNoExt === 'index' || - Boolean(translations[l] && translations[l].tools[translationKey]) - ); + if (!isPageTranslated) { + const toolsByLang = {}; + for (const lang of languages) { + toolsByLang[lang] = translations[lang] ? translations[lang].tools : {}; + } + isPageTranslated = createTranslationChecker( + toolsByLang, + translationKeyForFile + ); + } + return languages.filter((l) => isPageTranslated(filenameNoExt, l)); } function processFileForLanguage( @@ -257,8 +252,28 @@ function processFileForLanguage( document.documentElement.lang = lang; document.documentElement.dir = ['ar', 'fa'].includes(lang) ? 'rtl' : 'ltr'; + document.querySelector('script[data-language-redirect]')?.remove(); + if (ENGLISH_ONLY_PAGES.has(filenameNoExt)) { + const englishContent = document.getElementById('app'); + englishContent?.setAttribute('lang', 'en'); + englishContent?.setAttribute('dir', 'ltr'); + } + + const metaContent = (selector) => + document.querySelector(selector)?.getAttribute('content') ?? null; + const englishMeta = { + title: document.title, + description: metaContent('meta[name="description"]'), + }; applyServerTranslations(document, translations[lang]); + const contentStats = processPage(document, filenameNoExt, { + translate: (id) => translations[lang].content[id] || null, + }); + contentTotals[lang] ??= { found: 0, translated: 0, invalid: 0 }; + contentTotals[lang].found += contentStats.found; + contentTotals[lang].translated += contentStats.translated; + contentTotals[lang].invalid += contentStats.invalid.length; let title = null; let description = null; @@ -272,7 +287,11 @@ function processFileForLanguage( description = tools[translationKey].subtitle; } - if (title) { + const titleTranslated = document.title !== englishMeta.title; + const descriptionTranslated = + metaContent('meta[name="description"]') !== englishMeta.description; + + if (title && !titleTranslated) { document.title = title; const metaTitle = document.querySelector('meta[property="og:title"]'); if (metaTitle) metaTitle.content = title; @@ -282,7 +301,7 @@ function processFileForLanguage( if (metaTwitterTitle) metaTwitterTitle.content = title; } - if (description) { + if (description && !descriptionTranslated) { const metaDesc = document.querySelector('meta[name="description"]'); if (metaDesc) metaDesc.content = description; const metaOgDesc = document.querySelector( @@ -337,7 +356,28 @@ function processFileForLanguage( const localizedToolName = resolveToolName(translationKey, tools); if (localizedToolName) { - injectToolBreadcrumb(document, lang, localizedToolName, localizedUrl); + injectToolBreadcrumb( + document, + lang, + localizedToolName, + localizedUrl, + translations[lang].common?.nav?.breadcrumb || 'Breadcrumb' + ); + } + + if (docsLanguages.includes(lang)) { + document.querySelectorAll('a[href]').forEach((link) => { + const href = link.getAttribute('href'); + if ( + href === OFFICIAL_DOCS_URL || + href?.startsWith(`${OFFICIAL_DOCS_URL}/`) + ) { + link.setAttribute( + 'href', + href.replace(OFFICIAL_DOCS_URL, `${OFFICIAL_DOCS_URL}/${lang}`) + ); + } + }); } const links = document.querySelectorAll('a[href]'); @@ -360,7 +400,13 @@ function processFileForLanguage( if (href.startsWith('/assets/') || href.includes('/assets/')) return; - if (href === '/blog' || href.startsWith('/blog/')) return; + const hrefWithoutBase = + BASE_PATH && href.startsWith(`${BASE_PATH}/`) + ? href.slice(BASE_PATH.length) + : href; + if (hrefWithoutBase === '/blog' || hrefWithoutBase.startsWith('/blog/')) { + return; + } const langPrefixRegex = new RegExp( `^(${BASE_PATH})?/(${languages.join('|')})(/|$)` @@ -510,6 +556,20 @@ async function generateI18nPages() { updateEnglishFile(filePath, originalContent, translatedLangs); } + const covered = Object.entries(contentTotals).filter( + ([, totals]) => totals.translated > 0 + ); + if (covered.length > 0) { + console.log( + ` Page content translated: ${covered + .map( + ([lang, totals]) => + `${lang} ${Math.round((totals.translated / totals.found) * 100)}%${totals.invalid ? ` (${totals.invalid} rejected)` : ''}` + ) + .join(', ')}` + ); + } + console.log('✅ i18n pages generated successfully!'); } diff --git a/scripts/generate-sitemap.mjs b/scripts/generate-sitemap.mjs index 1d7c0ec7..892b537a 100644 --- a/scripts/generate-sitemap.mjs +++ b/scripts/generate-sitemap.mjs @@ -2,6 +2,8 @@ import fs from 'fs'; import path from 'path'; import { execFileSync } from 'child_process'; import { fileURLToPath } from 'url'; +import { OFFICIAL_SITE_URL, canonicalBasePath } from './indexing-policy.mjs'; +import { createTranslationChecker } from './page-translation.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -30,12 +32,10 @@ for (const lang of languages) { : {}; } +const isPageTranslated = createTranslationChecker(toolsByLang, toCamelCase); + function alternateLangsFor(pageName) { - if (pageName === 'index') return languages; - const translationKey = toCamelCase(pageName); - return languages.filter( - (l) => l === 'en' || Boolean(toolsByLang[l][translationKey]) - ); + return languages.filter((l) => isPageTranslated(pageName, l)); } const PRIORITY_MAP = { @@ -78,10 +78,9 @@ function getPriority(pageName) { function buildUrl(lang, pageName) { const pagePath = pageName === 'index' ? '' : pageName; - if (lang === 'en') { - return pagePath ? `${SITE_URL}/${pagePath}` : SITE_URL; - } - return pagePath ? `${SITE_URL}/${lang}/${pagePath}` : `${SITE_URL}/${lang}`; + const root = `${SITE_URL}${canonicalBasePath()}`; + const prefix = lang === 'en' ? root : `${root}/${lang}`; + return pagePath ? `${prefix}/${pagePath}` : prefix; } function generateSitemap() { @@ -170,7 +169,7 @@ function generateSitemap() { const blogDir = path.join(DIST_DIR, 'blog'); let blogCount = 0; - if (fs.existsSync(blogDir)) { + if (SITE_URL === OFFICIAL_SITE_URL && fs.existsSync(blogDir)) { const blogFiles = fs .readdirSync(blogDir) .filter((file) => file.endsWith('.html')) diff --git a/scripts/include-docs-in-dist.js b/scripts/include-docs-in-dist.js index b76b270c..71528e4d 100644 --- a/scripts/include-docs-in-dist.js +++ b/scripts/include-docs-in-dist.js @@ -111,7 +111,14 @@ function listDocsHtml(dir, prefix) { ); } else if (entry.name.endsWith('.html') && entry.name !== '404.html') { const slug = entry.name.replace(/\.html$/, ''); - urls.push(slug === 'index' ? prefix : `${prefix}/${slug}`); + const html = fs.readFileSync(path.join(dir, entry.name), 'utf-8'); + const canonical = html.match( + /]+rel="canonical"[^>]+href="([^"]+)"/ + ); + urls.push({ + url: slug === 'index' ? prefix : `${prefix}/${slug}`, + canonical: canonical ? canonical[1] : null, + }); } } return urls; @@ -132,7 +139,9 @@ function addDocsToSitemap() { let xml = fs.readFileSync(sitemapPath, 'utf-8'); if (xml.includes(`${siteUrl}/docs`)) return; - const urls = listDocsHtml(targetDocsPath, '/docs'); + const urls = listDocsHtml(targetDocsPath, '/docs') + .filter(({ url, canonical }) => canonical === `${siteUrl}${url}`) + .map(({ url }) => url); const entries = urls .map( (url) => diff --git a/scripts/indexing-policy.mjs b/scripts/indexing-policy.mjs new file mode 100644 index 00000000..d711d91b --- /dev/null +++ b/scripts/indexing-policy.mjs @@ -0,0 +1,23 @@ +export const OFFICIAL_SITE_URL = 'https://www.bentopdf.com'; + +export function resolveSiteUrl() { + return (process.env.SITE_URL || OFFICIAL_SITE_URL).replace(/\/+$/, ''); +} + +export function isOfficialSiteUrl(url = resolveSiteUrl()) { + try { + const { hostname } = new URL(url); + return hostname === 'www.bentopdf.com' || hostname === 'bentopdf.com'; + } catch { + return false; + } +} + +export function canonicalBasePath() { + if (isOfficialSiteUrl()) return ''; + return (process.env.BASE_URL || '/').replace(/\/$/, ''); +} + +export function isIndexingBlocked() { + return !isOfficialSiteUrl() && process.env.ALLOW_INDEXING !== 'true'; +} diff --git a/scripts/page-translation.mjs b/scripts/page-translation.mjs new file mode 100644 index 00000000..f9b2544d --- /dev/null +++ b/scripts/page-translation.mjs @@ -0,0 +1,46 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const TRANSLATIONS_DIR = path.resolve(__dirname, '../translations'); + +export const COVERAGE_THRESHOLD = 0.8; + +function readJson(file, fallback) { + return fs.existsSync(file) + ? JSON.parse(fs.readFileSync(file, 'utf-8')) + : fallback; +} + +export function createTranslationChecker(toolsByLang, keyFor) { + const pageIndex = readJson(path.join(TRANSLATIONS_DIR, 'pages.json'), {}); + const idsByLang = new Map(); + const idsFor = (lang) => { + if (!idsByLang.has(lang)) { + const content = readJson( + path.join(TRANSLATIONS_DIR, lang, 'content.json'), + {} + ); + idsByLang.set( + lang, + new Set( + Object.keys(content).filter( + (id) => typeof content[id] === 'string' && content[id].trim() + ) + ) + ); + } + return idsByLang.get(lang); + }; + return (pageName, lang) => { + if (lang === 'en' || pageName === 'index') return true; + if (toolsByLang[lang] && toolsByLang[lang][keyFor(pageName)]) return true; + const ids = pageIndex[pageName]; + if (!ids || ids.length === 0) return false; + const translated = idsFor(lang); + let covered = 0; + for (const id of ids) if (translated.has(id)) covered += 1; + return covered / ids.length >= COVERAGE_THRESHOLD; + }; +} diff --git a/scripts/raw-ui-text-scan.mjs b/scripts/raw-ui-text-scan.mjs new file mode 100644 index 00000000..750f5707 --- /dev/null +++ b/scripts/raw-ui-text-scan.mjs @@ -0,0 +1,210 @@ +import fs from 'fs'; +import path from 'path'; +import ts from 'typescript'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const SOURCE_ROOT = path.resolve(__dirname, '../src/js'); +const SKIPPED_DIRECTORIES = new Set(['editcore', 'types', 'i18n', 'config']); +const EXEMPT_FILES = new Set(['logic/email-to-pdf.ts', 'utils/comic-info.ts']); +const TRANSLATING_HELPERS = { + showAlert: 2, + showLoader: 1, + showAlertModal: 2, + showModal: 2, +}; +const NATIVE_DIALOGS = { alert: 1, confirm: 1 }; +const HELPER_ARGUMENTS = { ...TRANSLATING_HELPERS, ...NATIVE_DIALOGS }; +const TEXT_PROPERTIES = new Set([ + 'textContent', + 'title', + 'placeholder', + 'alt', + 'ariaLabel', +]); +const TEXT_ATTRIBUTES = new Set(['title', 'placeholder', 'aria-label', 'alt']); +const LETTERS = /\p{L}{2}/u; +const CSS_RULE = /[#.\w-]+\s*\{[^}]*:[^}]*\}/; +const KEY_COMBINATION = /^(?:(?:Ctrl|Cmd|Alt|Shift|⌘|⌥|⇧)\s*\+\s*)+\S$/; + +function sourceFiles(root) { + const files = []; + const walk = (dir) => { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (!SKIPPED_DIRECTORIES.has(entry.name)) walk(full); + } else if (/\.ts$/.test(entry.name)) { + files.push(full); + } + } + }; + walk(root); + return files; +} + +function isStringLike(node) { + return ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node); +} + +function calleeName(call) { + if (ts.isIdentifier(call.expression)) return call.expression.text; + if (ts.isPropertyAccessExpression(call.expression)) { + return call.expression.name.text; + } + return ''; +} + +function rawLiterals(node, found = []) { + if (isStringLike(node)) { + if (LETTERS.test(node.text) && !KEY_COMBINATION.test(node.text)) { + found.push(node); + } + } else if (ts.isTemplateExpression(node)) { + const staticText = [ + node.head.text, + ...node.templateSpans.map((span) => span.literal.text), + ].join(' '); + if (LETTERS.test(staticText)) found.push(node); + } else if (ts.isParenthesizedExpression(node)) { + rawLiterals(node.expression, found); + } else if (ts.isConditionalExpression(node)) { + rawLiterals(node.whenTrue, found); + rawLiterals(node.whenFalse, found); + } else if (ts.isBinaryExpression(node)) { + const kind = node.operatorToken.kind; + if ( + kind === ts.SyntaxKind.BarBarToken || + kind === ts.SyntaxKind.QuestionQuestionToken || + kind === ts.SyntaxKind.PlusToken + ) { + rawLiterals(node.left, found); + rawLiterals(node.right, found); + } + } else if (ts.isAsExpression(node) || ts.isNonNullExpression(node)) { + rawLiterals(node.expression, found); + } + return found; +} + +function isTranslatingCall(node) { + const call = node.parent; + return ( + call && + ts.isCallExpression(call) && + ['trText', 'trHtml', 't', 'translate'].includes(calleeName(call)) + ); +} + +function rawHtmlText(node) { + let pieces; + if (isStringLike(node)) { + pieces = [node.text]; + } else if (ts.isTemplateExpression(node)) { + pieces = [node.head.text, ...node.templateSpans.map((s) => s.literal.text)]; + } else { + return false; + } + const html = pieces.join('\u0000'); + if (!/<[a-z][\w-]*[\s>/]/i.test(html)) return false; + for (const match of html.matchAll(/>([^<>]+)(?=<)/g)) { + const tagStart = html.lastIndexOf('<', match.index); + const tag = html.slice(tagStart, match.index + 1); + if (/data-i18n/.test(tag) || /^<\/?(script|style)/i.test(tag)) continue; + const visible = match[1] + .replace(/\u0000/g, ' ') + .replace(/&\w+;|&#\d+;/g, ' '); + if (LETTERS.test(visible)) return true; + } + for (const match of html.matchAll( + /<[^<>]*?\s(?:title|placeholder|aria-label|alt)="([^"]*)"[^<>]*>/g + )) { + if (/data-i18n/.test(match[0])) continue; + if (LETTERS.test(match[1].replace(/\u0000/g, ' '))) return true; + } + return false; +} + +export function scanRawUiText(root = SOURCE_ROOT) { + const findings = []; + for (const file of sourceFiles(root)) { + if (EXEMPT_FILES.has(path.relative(root, file))) continue; + const source = fs.readFileSync(file, 'utf8'); + const sf = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true); + const report = (node, kind) => { + const { line } = sf.getLineAndCharacterOfPosition(node.getStart(sf)); + findings.push({ + file: path.relative(root, file), + line: line + 1, + kind, + text: node.getText(sf).replace(/\s+/g, ' ').slice(0, 100), + }); + }; + const visit = (node) => { + if (ts.isCallExpression(node)) { + const name = calleeName(node); + if (name in HELPER_ARGUMENTS) { + node.arguments.slice(0, HELPER_ARGUMENTS[name]).forEach((argument) => + rawLiterals(argument) + .filter( + (raw) => !(name in TRANSLATING_HELPERS && isStringLike(raw)) + ) + .forEach((raw) => report(raw, name)) + ); + } else if ( + name === 'setAttribute' && + node.arguments.length === 2 && + isStringLike(node.arguments[0]) && + TEXT_ATTRIBUTES.has(node.arguments[0].text) + ) { + rawLiterals(node.arguments[1]).forEach((raw) => + report(raw, 'setAttribute') + ); + } + } + if ( + ts.isNewExpression(node) && + ts.isIdentifier(node.expression) && + node.expression.text === 'Option' && + node.arguments && + node.arguments.length > 0 + ) { + rawLiterals(node.arguments[0]).forEach((raw) => report(raw, 'Option')); + } + if ( + ts.isBinaryExpression(node) && + node.operatorToken.kind === ts.SyntaxKind.EqualsToken && + ts.isPropertyAccessExpression(node.left) && + TEXT_PROPERTIES.has(node.left.name.text) + ) { + rawLiterals(node.right) + .filter((raw) => !CSS_RULE.test(raw.getText())) + .forEach((raw) => report(raw, node.left.name.text)); + } + if ( + (isStringLike(node) || ts.isTemplateExpression(node)) && + !isTranslatingCall(node) && + rawHtmlText(node) + ) { + report(node, 'html'); + } + ts.forEachChild(node, visit); + }; + visit(sf); + } + return findings; +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + const findings = scanRawUiText(); + const byKind = {}; + for (const finding of findings) + byKind[finding.kind] = (byKind[finding.kind] || 0) + 1; + console.log(`${findings.length} raw UI text sites`, JSON.stringify(byKind)); + for (const finding of findings.slice(0, Number(process.argv[2] || 25))) { + console.log( + `${finding.file}:${finding.line} [${finding.kind}] ${finding.text}` + ); + } + process.exitCode = findings.length > 0 ? 1 : 0; +} diff --git a/scripts/recompress-html.mjs b/scripts/recompress-html.mjs new file mode 100644 index 00000000..0cc75813 --- /dev/null +++ b/scripts/recompress-html.mjs @@ -0,0 +1,36 @@ +import fs from 'fs'; +import path from 'path'; +import zlib from 'zlib'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const DIST_DIR = path.resolve(__dirname, '../dist'); + +function listHtml(dir) { + return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) return listHtml(full); + return entry.name.endsWith('.html') ? [full] : []; + }); +} + +let refreshed = 0; +for (const file of listHtml(DIST_DIR)) { + const brotli = `${file}.br`; + const gzip = `${file}.gz`; + if (!fs.existsSync(brotli) && !fs.existsSync(gzip)) continue; + const html = fs.readFileSync(file); + if (fs.existsSync(brotli)) { + fs.writeFileSync( + brotli, + zlib.brotliCompressSync(html, { + params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 11 }, + }) + ); + } + if (fs.existsSync(gzip)) { + fs.writeFileSync(gzip, zlib.gzipSync(html, { level: 9 })); + } + refreshed++; +} +console.log(`Recompressed ${refreshed} precompressed HTML files.`); diff --git a/scripts/seo-audit.mjs b/scripts/seo-audit.mjs index ebcab8fa..5932a50a 100644 --- a/scripts/seo-audit.mjs +++ b/scripts/seo-audit.mjs @@ -1,6 +1,8 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; +import { canonicalBasePath, isIndexingBlocked } from './indexing-policy.mjs'; +import { createTranslationChecker } from './page-translation.mjs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -90,6 +92,11 @@ for (const lang of LOCALE_DIRS) { : {}; } +const isPageTranslated = createTranslationChecker( + toolsByLang, + (baseName) => KEY_MAPPING[baseName] || toCamelCase(baseName) +); + function hasTrailingSlash(href) { const { pathname } = new URL(href); return pathname !== '/' && pathname.endsWith('/'); @@ -107,15 +114,12 @@ function expectedCanonicalForFile(rel) { if (isBlogPage(rel)) { return `${OFFICIAL_SITE_URL}/blog${slug ? `/${slug}` : ''}`; } - const translationKey = KEY_MAPPING[baseName] || toCamelCase(baseName); const segments = [SITE_URL]; - if (BASE_PATH) segments.push(BASE_PATH.replace(/^\//, '')); + const canonicalBase = canonicalBasePath(); + if (canonicalBase) segments.push(canonicalBase.replace(/^\//, '')); for (const dir of parts) { if (LOCALE_DIRS.has(dir)) { - const translated = - baseName === 'index' || - Boolean(toolsByLang[dir] && toolsByLang[dir][translationKey]); - if (translated) segments.push(dir); + if (isPageTranslated(baseName, dir)) segments.push(dir); } } if (slug) segments.push(slug); @@ -218,6 +222,7 @@ function auditHtml(file, knownSlugs) { if ( robots && /noindex/i.test(robots) && + !isIndexingBlocked() && !NOINDEX_ALLOWLIST.has(file.rel) && !NOINDEX_ALLOWLIST.has(path.basename(file.rel)) ) { diff --git a/scripts/server-translations.mjs b/scripts/server-translations.mjs new file mode 100644 index 00000000..35de2aed --- /dev/null +++ b/scripts/server-translations.mjs @@ -0,0 +1,38 @@ +export function resolveTranslation(langResources, key) { + let namespace = 'common'; + let keyPath = key; + const colonIndex = key.indexOf(':'); + if (colonIndex !== -1) { + namespace = key.slice(0, colonIndex); + keyPath = key.slice(colonIndex + 1); + } + let node = langResources[namespace]; + for (const segment of keyPath.split('.')) { + if (node == null || typeof node !== 'object') return null; + node = node[segment]; + } + return typeof node === 'string' && node ? node : null; +} + +export function applyServerTranslations(document, langResources) { + document.querySelectorAll('[data-i18n]').forEach((element) => { + const key = element.getAttribute('data-i18n'); + if (!key) return; + const translation = resolveTranslation(langResources, key); + if (translation) element.textContent = translation; + }); + + document.querySelectorAll('[data-i18n-placeholder]').forEach((element) => { + const key = element.getAttribute('data-i18n-placeholder'); + if (!key) return; + const translation = resolveTranslation(langResources, key); + if (translation) element.setAttribute('placeholder', translation); + }); + + document.querySelectorAll('[data-i18n-title]').forEach((element) => { + const key = element.getAttribute('data-i18n-title'); + if (!key) return; + const translation = resolveTranslation(langResources, key); + if (translation) element.setAttribute('title', translation); + }); +} diff --git a/scripts/translations.mjs b/scripts/translations.mjs new file mode 100644 index 00000000..8765e44c --- /dev/null +++ b/scripts/translations.mjs @@ -0,0 +1,270 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { validateTranslationPair } from './content-segments.mjs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ROOT = path.resolve(__dirname, '..'); +const SOURCE_FILE = path.join(ROOT, 'translations/source.json'); +const LOCALES_DIR = path.join(ROOT, 'public/locales'); + +const SCRIPT_RANGES = { + ar: /[؀-ۿ]/, + fa: /[؀-ۿ]/, + be: /[Ѐ-ӿ]/, + ru: /[Ѐ-ӿ]/, + uk: /[Ѐ-ӿ]/, + ja: /[぀-ヿ一-鿿]/, + zh: /[一-鿿]/, + 'zh-TW': /[一-鿿]/, + ko: /[가-힯]/, +}; + +const ENGLISH_MARKERS = new Set([ + 'the', + 'and', + 'your', + 'with', + 'you', + 'this', + 'that', + 'from', + 'are', + 'will', + 'how', + 'what', + 'when', + 'can', +]); + +function readJson(file, fallback) { + return fs.existsSync(file) + ? JSON.parse(fs.readFileSync(file, 'utf-8')) + : fallback; +} + +function writeJson(file, data) { + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n'); +} + +function contentFile(lang) { + return path.join(ROOT, 'translations', lang, 'content.json'); +} + +function languages() { + return fs + .readdirSync(LOCALES_DIR) + .filter( + (entry) => + entry !== 'en' && + fs.statSync(path.join(LOCALES_DIR, entry)).isDirectory() + ) + .sort(); +} + +function plainText(markup) { + return markup.replace(/<\/?\d+\/?>/g, ' '); +} + +export function reviewTranslation(lang, source, translation) { + const problem = validateTranslationPair(source, translation); + if (problem) return { level: 'error', reason: problem }; + if (/[—]/.test(translation)) { + return { level: 'error', reason: 'contains an em dash' }; + } + const sourceText = plainText(source); + const text = plainText(translation); + const sourceWords = sourceText.split(/\s+/).filter(Boolean); + if ( + translation.trim() === source.trim() && + (sourceWords.length < 6 || !/[a-z]{3,}/.test(sourceText)) + ) { + return null; + } + const range = SCRIPT_RANGES[lang]; + if (range && sourceWords.length >= 3 && !range.test(text)) { + return { level: 'error', reason: 'not in the target script' }; + } + const tokens = text + .toLowerCase() + .split(/[^\p{L}]+/u) + .filter(Boolean); + if (!range && tokens.length >= 6) { + const hits = tokens.filter((token) => ENGLISH_MARKERS.has(token)).length; + if (hits >= 2 && hits / tokens.length >= 0.15) { + return { level: 'error', reason: 'looks like English' }; + } + } + const ratio = text.length / Math.max(1, sourceText.length); + if (sourceWords.length >= 6 && (ratio > 3.5 || ratio < 0.2)) { + return { level: 'warning', reason: `length ratio ${ratio.toFixed(2)}` }; + } + return null; +} + +function chunkCommand(workDir, wordsPerChunk, lang) { + const source = readJson(SOURCE_FILE, {}); + const done = lang ? readJson(contentFile(lang), {}) : {}; + const ids = Object.keys(source) + .filter((id) => !done[id]) + .sort((a, b) => { + const pa = source[a].pages[0] || ''; + const pb = source[b].pages[0] || ''; + return pa === pb ? a.localeCompare(b) : pa.localeCompare(pb); + }); + const inDir = path.join(workDir, 'in'); + fs.mkdirSync(inDir, { recursive: true }); + let chunk = {}; + let words = 0; + let index = 0; + const flush = () => { + if (Object.keys(chunk).length === 0) return; + index += 1; + writeJson( + path.join(inDir, `chunk-${String(index).padStart(3, '0')}.json`), + chunk + ); + chunk = {}; + words = 0; + }; + for (const id of ids) { + const entry = source[id]; + chunk[id] = { text: entry.text, tags: entry.tags, page: entry.pages[0] }; + words += entry.text.split(/\s+/).length; + if (words >= wordsPerChunk) flush(); + } + flush(); + console.log(`Wrote ${index} chunks for ${ids.length} segments to ${inDir}`); +} + +function mergeCommand(lang, outDir, replace) { + const source = readJson(SOURCE_FILE, {}); + const target = contentFile(lang); + const existing = readJson(target, {}); + const accepted = {}; + const rejected = []; + const warnings = []; + const files = fs.existsSync(outDir) + ? fs + .readdirSync(outDir) + .filter((f) => /^chunk-\d+\.json$/.test(f)) + .sort() + : []; + for (const file of files) { + const data = readJson(path.join(outDir, file), {}); + for (const [id, translation] of Object.entries(data)) { + if (!source[id]) { + rejected.push({ id, reason: 'unknown id' }); + continue; + } + const review = reviewTranslation(lang, source[id].text, translation); + if (review && review.level === 'error') { + rejected.push({ id, reason: review.reason }); + continue; + } + if (review) warnings.push({ id, reason: review.reason }); + if (existing[id] && !replace) continue; + accepted[id] = translation; + } + } + const merged = { ...existing, ...accepted }; + const sorted = {}; + for (const id of Object.keys(merged).sort()) sorted[id] = merged[id]; + writeJson(target, sorted); + writeJson(path.join(outDir, 'rejects.json'), rejected); + const missing = Object.keys(source).filter((id) => !sorted[id]); + console.log( + `${lang}: accepted ${Object.keys(accepted).length}, rejected ${rejected.length}, warnings ${warnings.length}, still missing ${missing.length}` + ); +} + +function validateCommand(lang) { + const source = readJson(SOURCE_FILE, {}); + const content = readJson(contentFile(lang), {}); + const errors = []; + const warnings = []; + for (const [id, translation] of Object.entries(content)) { + if (!source[id]) { + warnings.push({ id, reason: 'stale id (run prune to remove)' }); + continue; + } + const review = reviewTranslation(lang, source[id].text, translation); + if (review) + (review.level === 'error' ? errors : warnings).push({ + id, + reason: review.reason, + }); + } + const missing = Object.keys(source).filter((id) => !content[id]); + const translated = Object.keys(content).filter((id) => source[id]).length; + console.log( + `${lang}: ${translated}/${Object.keys(source).length} translated, ${errors.length} errors, ${warnings.length} warnings, ${missing.length} missing` + ); + return { errors, warnings, missing }; +} + +function pruneCommand(lang) { + const source = readJson(SOURCE_FILE, {}); + const content = readJson(contentFile(lang), {}); + const kept = {}; + for (const id of Object.keys(content).sort()) { + if (source[id]) kept[id] = content[id]; + } + writeJson(contentFile(lang), kept); + console.log( + `${lang}: removed ${Object.keys(content).length - Object.keys(kept).length} stale ids` + ); +} + +function statusCommand() { + const source = readJson(SOURCE_FILE, {}); + const total = Object.keys(source).length; + for (const lang of languages()) { + const content = readJson(contentFile(lang), {}); + const done = Object.keys(content).filter((id) => source[id]).length; + console.log( + `${lang.padEnd(6)} ${done}/${total} (${Math.round((done / total) * 100)}%)` + ); + } +} + +function main() { + const [command, ...args] = process.argv.slice(2); + const langIndex = args.indexOf('--lang'); + const langOption = langIndex >= 0 ? args[langIndex + 1] : undefined; + const flags = new Set(args.filter((arg) => arg.startsWith('--'))); + const values = args.filter( + (arg, index) => + !arg.startsWith('--') && (langIndex < 0 || index !== langIndex + 1) + ); + if (command === 'chunk') { + chunkCommand(values[0], Number(values[1] || 900), langOption); + } else if (command === 'merge') { + mergeCommand(values[0], values[1], flags.has('--replace')); + } else if (command === 'prune') pruneCommand(values[0]); + else if (command === 'validate') { + const result = validateCommand(args[0]); + if (args[1] === '--list') { + console.log( + JSON.stringify( + { + errors: result.errors.slice(0, 50), + warnings: result.warnings.slice(0, 20), + }, + null, + 2 + ) + ); + } + process.exitCode = result.errors.length > 0 ? 1 : 0; + } else if (command === 'status') statusCommand(); + else { + console.error( + 'Usage: translations.mjs chunk [words] [--lang ] | merge [--replace] | validate [--list] | prune | status' + ); + process.exitCode = 2; + } +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) main(); diff --git a/scripts/ui-translations.mjs b/scripts/ui-translations.mjs new file mode 100644 index 00000000..c3c8b13b --- /dev/null +++ b/scripts/ui-translations.mjs @@ -0,0 +1,200 @@ +import fs from 'fs'; +import path from 'path'; +import { createHash } from 'crypto'; +import { fileURLToPath } from 'url'; +import { reviewTranslation } from './translations.mjs'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ROOT = path.resolve(__dirname, '..'); +const SOURCE_FILE = path.join(ROOT, 'translations/ui-source.json'); +const LOCALES_DIR = path.join(ROOT, 'public/locales'); + +function readJson(file, fallback) { + return fs.existsSync(file) + ? JSON.parse(fs.readFileSync(file, 'utf-8')) + : fallback; +} + +function writeJson(file, data) { + fs.mkdirSync(path.dirname(file), { recursive: true }); + fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n'); +} + +function targetFile(lang) { + return path.join(LOCALES_DIR, lang, 'ui.json'); +} + +function idOf(text) { + return createHash('sha1').update(text).digest('hex').slice(0, 12); +} + +function placeholderSignature(text) { + return (text.match(/\{\{\w+\}\}/g) || []).sort().join(','); +} + +function languages() { + return fs + .readdirSync(LOCALES_DIR) + .filter( + (entry) => + entry !== 'en' && + fs.statSync(path.join(LOCALES_DIR, entry)).isDirectory() + ) + .sort(); +} + +function needsTranslation(text) { + return /\p{L}{2}/u.test(text.replace(/\{\{\w+\}\}/g, ' ')); +} + +function review(lang, source, translation) { + if (!needsTranslation(source) && translation === source) return null; + if (typeof translation !== 'string' || translation.trim() === '') { + return { level: 'error', reason: 'empty' }; + } + if (placeholderSignature(source) !== placeholderSignature(translation)) { + return { level: 'error', reason: 'placeholders differ' }; + } + if (/<\/?[a-z][^>]*>/i.test(translation)) { + return { level: 'error', reason: 'contains HTML' }; + } + const stripped = (text) => text.replace(/\{\{\w+\}\}/g, ' '); + return reviewTranslation(lang, stripped(source), stripped(translation)); +} + +function chunkCommand(workDir, wordsPerChunk) { + const source = readJson(SOURCE_FILE, {}); + const inDir = path.join(workDir, 'in'); + fs.mkdirSync(inDir, { recursive: true }); + let chunk = {}; + let words = 0; + let index = 0; + const flush = () => { + if (Object.keys(chunk).length === 0) return; + index += 1; + writeJson( + path.join(inDir, `chunk-${String(index).padStart(3, '0')}.json`), + chunk + ); + chunk = {}; + words = 0; + }; + for (const text of Object.keys(source).sort()) { + chunk[idOf(text)] = { + text, + tags: ['ui'], + page: source[text].files[0] || '', + }; + words += text.split(/\s+/).length; + if (words >= wordsPerChunk) flush(); + } + flush(); + console.log( + `Wrote ${index} chunks for ${Object.keys(source).length} strings` + ); +} + +function mergeCommand(lang, outDir, replace) { + const source = readJson(SOURCE_FILE, {}); + const byId = new Map(Object.keys(source).map((text) => [idOf(text), text])); + const existing = readJson(targetFile(lang), {}); + const accepted = {}; + const rejected = []; + const files = fs.existsSync(outDir) + ? fs + .readdirSync(outDir) + .filter((file) => /^chunk-\d+\.json$/.test(file)) + .sort() + : []; + for (const file of files) { + const data = readJson(path.join(outDir, file), {}); + for (const [id, translation] of Object.entries(data)) { + const text = byId.get(id); + if (!text) { + rejected.push({ id, reason: 'unknown id' }); + continue; + } + const result = review(lang, text, translation); + if (result && result.level === 'error') { + rejected.push({ id, reason: result.reason }); + continue; + } + if (existing[text] && !replace) continue; + accepted[text] = translation; + } + } + const merged = { ...existing, ...accepted }; + for (const text of Object.keys(source)) { + if (!needsTranslation(text) && !merged[text]) merged[text] = text; + } + const sorted = {}; + for (const text of Object.keys(merged).sort()) sorted[text] = merged[text]; + writeJson(targetFile(lang), sorted); + writeJson(path.join(outDir, 'rejects.json'), rejected); + const missing = Object.keys(source).filter((text) => !sorted[text]); + console.log( + `${lang}: accepted ${Object.keys(accepted).length}, rejected ${rejected.length}, still missing ${missing.length}` + ); +} + +function validateCommand(lang) { + const source = readJson(SOURCE_FILE, {}); + const content = readJson(targetFile(lang), {}); + const errors = []; + const stale = []; + for (const [text, translation] of Object.entries(content)) { + if (!source[text]) { + stale.push(text); + continue; + } + const result = review(lang, text, translation); + if (result && result.level === 'error') { + errors.push({ text, reason: result.reason }); + } + } + const missing = Object.keys(source).filter((text) => !content[text]); + const translated = Object.keys(content).length - stale.length; + console.log( + `${lang}: ${translated}/${Object.keys(source).length} translated, ${errors.length} errors, ${missing.length} missing${stale.length ? `, ${stale.length} stale (run prune to remove)` : ''}` + ); + return { errors, missing, stale }; +} + +function pruneCommand(lang) { + const source = readJson(SOURCE_FILE, {}); + const content = readJson(targetFile(lang), {}); + const kept = {}; + for (const text of Object.keys(content).sort()) { + if (source[text]) kept[text] = content[text]; + } + writeJson(targetFile(lang), kept); + console.log( + `${lang}: removed ${Object.keys(content).length - Object.keys(kept).length} stale keys` + ); +} + +function statusCommand() { + const source = readJson(SOURCE_FILE, {}); + const total = Object.keys(source).length; + for (const lang of languages()) { + const content = readJson(targetFile(lang), {}); + const done = Object.keys(content).filter((text) => source[text]).length; + console.log(`${lang.padEnd(6)} ${done}/${total}`); + } +} + +const [command, ...args] = process.argv.slice(2); +if (command === 'chunk') chunkCommand(args[0], Number(args[1] || 800)); +else if (command === 'merge') + mergeCommand(args[0], args[1], args.includes('--replace')); +else if (command === 'validate') { + const result = validateCommand(args[0]); + process.exitCode = result.errors.length > 0 ? 1 : 0; +} else if (command === 'prune') pruneCommand(args[0]); +else if (command === 'status') statusCommand(); +else { + console.error( + 'Usage: ui-translations.mjs chunk [words] | merge [--replace] | validate | prune | status' + ); + process.exitCode = 2; +} diff --git a/src/js/canvasEditor.ts b/src/js/canvasEditor.ts index cfba64cf..13de9f65 100644 --- a/src/js/canvasEditor.ts +++ b/src/js/canvasEditor.ts @@ -8,6 +8,8 @@ import type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist'; import type { CropBox } from '@/types'; import './utils/setup-pdf-worker.js'; +import { trText } from './i18n/i18n.js'; + const editorState: { pdf: PDFDocumentProxy | null; canvas: HTMLCanvasElement | null; @@ -61,7 +63,7 @@ function calculateFitScale(page: PDFPageProxy) { */ async function renderPage(num: number) { editorState.pageRendering = true; - showLoader(`Loading page ${num}...`); + showLoader(trText('Loading page {{num}}...', { num })); try { const page = await editorState.pdf!.getPage(num); diff --git a/src/js/compare/engine/compare-content.ts b/src/js/compare/engine/compare-content.ts index 64d92093..7ba7dce2 100644 --- a/src/js/compare/engine/compare-content.ts +++ b/src/js/compare/engine/compare-content.ts @@ -7,6 +7,8 @@ import type { CompareTextChange, } from '../types.ts'; +import { trText } from '../../i18n/i18n.js'; + const HEADER_FOOTER_ZONE = 0.12; export function classifyChangeCategory( @@ -130,7 +132,15 @@ export function diffImages( id: `image-modified-${idx++}`, type: 'modified', category: 'image', - description: `Image resized from ${bImg.width}×${bImg.height} to ${match.width}×${match.height}`, + description: trText( + 'Image resized from {{width}}×{{height}} to {{width2}}×{{height2}}', + { + width: bImg.width, + height: bImg.height, + width2: match.width, + height2: match.height, + } + ), beforeText: `${bImg.width}×${bImg.height}`, afterText: `${match.width}×${match.height}`, beforeRects: [bImg.rect], @@ -142,7 +152,10 @@ export function diffImages( id: `image-removed-${idx++}`, type: 'removed', category: 'image', - description: `Removed image (${bImg.width}×${bImg.height})`, + description: trText('Removed image ({{width}}×{{height}})', { + width: bImg.width, + height: bImg.height, + }), beforeText: '', afterText: '', beforeRects: [bImg.rect], @@ -157,7 +170,10 @@ export function diffImages( id: `image-added-${idx++}`, type: 'added', category: 'image', - description: `Added image (${aImg.width}×${aImg.height})`, + description: trText('Added image ({{width}}×{{height}})', { + width: aImg.width, + height: aImg.height, + }), beforeText: '', afterText: '', beforeRects: [], @@ -207,7 +223,7 @@ export function detectBackgroundChanges( id: `background-changed-${baseId}`, type: 'modified', category: 'background', - description: 'Page background or layout changed', + description: trText('Page background or layout changed'), beforeText: '', afterText: '', beforeRects: [ diff --git a/src/js/compare/engine/compare-page-models.ts b/src/js/compare/engine/compare-page-models.ts index 7564ec2b..7eaf28aa 100644 --- a/src/js/compare/engine/compare-page-models.ts +++ b/src/js/compare/engine/compare-page-models.ts @@ -4,7 +4,7 @@ import type { CompareCategorySummary, } from '../types.ts'; import { diffTextRuns } from './diff-text-runs.ts'; -import { diffTextRunsAsync } from '../worker-api.ts'; +import { diffStrings, diffTextRunsAsync } from '../worker-api.ts'; import { classifyChangeCategory, diffAnnotations, @@ -12,6 +12,8 @@ import { buildCategorySummary, } from './compare-content.ts'; +import { trText } from '../../i18n/i18n.js'; + const EMPTY_CATEGORY_SUMMARY: CompareCategorySummary = { text: 0, image: 0, @@ -54,7 +56,10 @@ function comparePageModelsCore( id: 'page-removed', type: 'page-removed', category: 'text', - description: `Page ${leftPage.pageNumber} exists only in the first PDF.`, + description: trText( + 'Page {{pageNumber}} exists only in the first PDF.', + { pageNumber: leftPage.pageNumber } + ), beforeText: leftPage.plainText.slice(0, 200), afterText: '', beforeRects: [], @@ -78,7 +83,10 @@ function comparePageModelsCore( id: 'page-added', type: 'page-added', category: 'text', - description: `Page ${rightPage.pageNumber} exists only in the second PDF.`, + description: trText( + 'Page {{pageNumber}} exists only in the second PDF.', + { pageNumber: rightPage.pageNumber } + ), beforeText: '', afterText: rightPage.plainText.slice(0, 200), beforeRects: [], @@ -150,5 +158,7 @@ function comparePageModelsCore( ); } - return buildResult(diffTextRuns(leftPage.textItems, rightPage.textItems)); + return buildResult( + diffTextRuns(leftPage.textItems, rightPage.textItems, diffStrings()) + ); } diff --git a/src/js/compare/engine/compare.worker.ts b/src/js/compare/engine/compare.worker.ts index afc25648..9b8b7e5e 100644 --- a/src/js/compare/engine/compare.worker.ts +++ b/src/js/compare/engine/compare.worker.ts @@ -13,6 +13,7 @@ interface DiffMessage { id: number; beforeItems: CompareTextItem[]; afterItems: CompareTextItem[]; + strings: Record; } interface PairMessage { @@ -48,7 +49,12 @@ function isValidMessage(data: unknown): data is WorkerMessage { const m = data as Record; if (typeof m.id !== 'number') return false; if (m.type === 'diff') { - return Array.isArray(m.beforeItems) && Array.isArray(m.afterItems); + return ( + Array.isArray(m.beforeItems) && + Array.isArray(m.afterItems) && + typeof m.strings === 'object' && + m.strings !== null + ); } if (m.type === 'pair') { return Array.isArray(m.leftPages) && Array.isArray(m.rightPages); @@ -68,7 +74,8 @@ self.onmessage = function (e: MessageEvent) { if (msg.type === 'diff') { const { changes, summary } = diffTextRuns( msg.beforeItems, - msg.afterItems + msg.afterItems, + msg.strings ); const result: DiffResult = { type: 'diff', diff --git a/src/js/compare/engine/diff-text-runs.ts b/src/js/compare/engine/diff-text-runs.ts index ac70cccd..cd294615 100644 --- a/src/js/compare/engine/diff-text-runs.ts +++ b/src/js/compare/engine/diff-text-runs.ts @@ -15,6 +15,15 @@ import { } from './text-normalization.ts'; import { COMPARE_GEOMETRY } from '../config.ts'; +import { fillPlaceholders } from '../../i18n/placeholders.js'; + +let activeStrings: Record = {}; + +const describeChange = ( + template: string, + params: Record +): string => fillPlaceholders(activeStrings[template] ?? template, params); + interface WordToken { word: string; compareWord: string; @@ -174,7 +183,13 @@ function createWordChange( id, type, category: 'text', - description: `Replaced "${beforeText}" with "${afterText}"`, + description: describeChange( + 'Replaced "{{beforeText}}" with "{{afterText}}"', + { + beforeText, + afterText, + } + ), beforeText, afterText, beforeRects, @@ -185,7 +200,7 @@ function createWordChange( id, type, category: 'text', - description: `Removed "${beforeText}"`, + description: describeChange('Removed "{{beforeText}}"', { beforeText }), beforeText, afterText: '', beforeRects, @@ -196,7 +211,7 @@ function createWordChange( id, type, category: 'text', - description: `Added "${afterText}"`, + description: describeChange('Added "{{afterText}}"', { afterText }), beforeText: '', afterText, beforeRects: [], @@ -221,8 +236,10 @@ function toSummary(changes: CompareTextChange[]): CompareChangeSummary { export function diffTextRuns( beforeItems: CompareTextItem[], - afterItems: CompareTextItem[] + afterItems: CompareTextItem[], + strings: Record = {} ) { + activeStrings = strings; const beforeWords = beforeItems.flatMap(splitLineIntoWords); const afterWords = afterItems.flatMap(splitLineIntoWords); @@ -383,11 +400,18 @@ function detectStyleChanges( const allBeforeRects = groupFrags.flatMap((f) => f.beforeRects); const allAfterRects = groupFrags.flatMap((f) => f.afterRects); - let desc = `Style changed (${groupFrags.length} regions)`; + let desc = describeChange('Style changed ({{length}} regions)', { + length: groupFrags.length, + }); const details: string[] = []; - if (bFont !== aFont) details.push(`Font: ${bFont} → ${aFont}`); + if (bFont !== aFont) + details.push( + describeChange('Font: {{bFont}} → {{aFont}}', { bFont, aFont }) + ); if (bSize && aSize && Math.abs(bSize - aSize) > 0.5) - details.push(`Font size: ${bSize} → ${aSize}`); + details.push( + describeChange('Font size: {{bSize}} → {{aSize}}', { bSize, aSize }) + ); if (details.length) desc += '\n' + details.map((d) => `• ${d}`).join('\n'); changes.push({ @@ -457,7 +481,9 @@ function detectMovedText(changes: CompareTextChange[]) { id: `moved-${changes.length}`, type: 'moved', category: 'text', - description: `Moved "${rem.beforeText.slice(0, 80)}"`, + description: describeChange('Moved "{{value}}"', { + value: rem.beforeText.slice(0, 80), + }), beforeText: rem.beforeText, afterText: bestMatch.afterText, beforeRects: rem.beforeRects, diff --git a/src/js/compare/engine/visual-diff.ts b/src/js/compare/engine/visual-diff.ts index 00574721..ea357ecf 100644 --- a/src/js/compare/engine/visual-diff.ts +++ b/src/js/compare/engine/visual-diff.ts @@ -3,6 +3,8 @@ import pixelmatch from 'pixelmatch'; import type { CompareVisualDiff } from '../types.ts'; import { VISUAL_DIFF as VISUAL_DIFF_CONFIG } from '../config.ts'; +import { trText } from '../../i18n/i18n.js'; + type FocusRegion = { x: number; y: number; @@ -23,7 +25,7 @@ function drawNormalized( ) { const context = targetCanvas.getContext('2d'); if (!context) { - throw new Error('Could not create comparison canvas context.'); + throw new Error(trText('Could not create comparison canvas context.')); } context.fillStyle = '#ffffff'; @@ -56,7 +58,7 @@ export function renderVisualDiff( const outputContext = outputCanvas.getContext('2d'); if (!context1 || !context2 || !outputContext) { - throw new Error('Could not create visual diff context.'); + throw new Error(trText('Could not create visual diff context.')); } const image1 = context1.getImageData(0, 0, width, height); @@ -87,7 +89,7 @@ export function renderVisualDiff( const overlayContext = overlayCanvas.getContext('2d'); if (!overlayContext) { - throw new Error('Could not create visual diff overlay context.'); + throw new Error(trText('Could not create visual diff overlay context.')); } overlayContext.putImageData(diffImage, 0, 0); diff --git a/src/js/compare/reporting/export-compare-pdf.ts b/src/js/compare/reporting/export-compare-pdf.ts index 749d03c2..9b64c365 100644 --- a/src/js/compare/reporting/export-compare-pdf.ts +++ b/src/js/compare/reporting/export-compare-pdf.ts @@ -17,6 +17,8 @@ import { computeComparisonForPair } from '../../logic/compare-render.ts'; import { LRUCache } from '../lru-cache.ts'; import { loadPdfDocument } from '../../utils/load-pdf-document.js'; +import { trText } from '../../i18n/i18n.js'; + const HIGHLIGHT_COLORS: Record< string, { r: number; g: number; b: number; opacity: number } @@ -99,10 +101,12 @@ export async function exportComparePdf( } ) { if (!pdfDoc1 && !pdfDoc2) { - throw new Error('At least one PDF document is required for export.'); + throw new Error( + trText('At least one PDF document is required for export.') + ); } if (!pairs || pairs.length === 0) { - throw new Error('No page pairs to export.'); + throw new Error(trText('No page pairs to export.')); } const outDoc = await PDFDocument.create(); @@ -139,7 +143,10 @@ export async function exportComparePdf( for (let i = 0; i < pairs.length; i++) { const pair = pairs[i]; onProgress?.( - `Rendering page ${i + 1} of ${pairs.length}...`, + trText('Rendering page {{n}} of {{length}}...', { + n: i + 1, + length: pairs.length, + }), Math.round(((i + 1) / pairs.length) * 100) ); diff --git a/src/js/compare/worker-api.ts b/src/js/compare/worker-api.ts index 919a176a..3368890b 100644 --- a/src/js/compare/worker-api.ts +++ b/src/js/compare/worker-api.ts @@ -7,6 +7,31 @@ import type { } from './types.ts'; import { diffTextRuns } from './engine/diff-text-runs.ts'; import { pairPages } from './engine/pair-pages.ts'; +import { trText } from '../i18n/i18n.js'; + +export function diffStrings(): Record { + const strings: Record = {}; + const add = (english: string, translated: string) => { + strings[english] = translated; + }; + add( + 'Replaced "{{beforeText}}" with "{{afterText}}"', + trText('Replaced "{{beforeText}}" with "{{afterText}}"') + ); + add('Removed "{{beforeText}}"', trText('Removed "{{beforeText}}"')); + add('Added "{{afterText}}"', trText('Added "{{afterText}}"')); + add( + 'Style changed ({{length}} regions)', + trText('Style changed ({{length}} regions)') + ); + add('Font: {{bFont}} → {{aFont}}', trText('Font: {{bFont}} → {{aFont}}')); + add( + 'Font size: {{bSize}} → {{aSize}}', + trText('Font size: {{bSize}} → {{aSize}}') + ); + add('Moved "{{value}}"', trText('Moved "{{value}}"')); + return strings; +} let worker: Worker | null = null; let messageId = 0; @@ -37,7 +62,7 @@ function getWorker(): Worker | null { worker?.terminate(); worker = null; for (const [, p] of pending) { - p.reject(new Error('Worker crashed')); + p.reject(new Error(trText('Worker crashed'))); } pending.clear(); }; @@ -49,7 +74,7 @@ function getWorker(): Worker | null { function postToWorker(msg: Record): Promise { const w = getWorker(); - if (!w) return Promise.reject(new Error('No worker')); + if (!w) return Promise.reject(new Error(trText('No worker'))); const id = ++messageId; return new Promise((resolve, reject) => { pending.set(id, { resolve, reject }); @@ -66,10 +91,11 @@ export async function diffTextRunsAsync( type: 'diff', beforeItems, afterItems, + strings: diffStrings(), })) as { changes: CompareTextChange[]; summary: CompareChangeSummary }; return result; } catch { - return diffTextRuns(beforeItems, afterItems); + return diffTextRuns(beforeItems, afterItems, diffStrings()); } } diff --git a/src/js/handlers/fileHandler.ts b/src/js/handlers/fileHandler.ts index 15aa863b..eb354873 100644 --- a/src/js/handlers/fileHandler.ts +++ b/src/js/handlers/fileHandler.ts @@ -31,6 +31,8 @@ import * as pdfjsLib from 'pdfjs-dist'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, trHtml } from '../i18n/i18n.js'; + export { getRotationState, updateRotationState, @@ -278,7 +280,7 @@ async function handleSinglePdfUpload(toolId: string, file: File) { } }; - const infoSection = createSection('Info Dictionary'); + const infoSection = createSection(trText('Info Dictionary')); if (info && Object.keys(info).length > 0) { for (const key in info) { const value = (info as Record)[key]; @@ -310,11 +312,11 @@ async function handleSinglePdfUpload(toolId: string, file: File) { infoSection.ul.appendChild(createListItem(key, displayValue)); } } else { - infoSection.ul.innerHTML = `
  • - No Info Dictionary data found -
  • `; + infoSection.ul.innerHTML = `
  • ${trHtml('- No Info Dictionary data found -')}
  • `; } resultsDiv.appendChild(infoSection.wrapper); - const fieldsSection = createSection('Interactive Form Fields'); + const fieldsSection = createSection(trText('Interactive Form Fields')); if (fieldObjects && Object.keys(fieldObjects).length > 0) { for (const fieldName in fieldObjects) { const field = fieldObjects[fieldName][0] as Record; @@ -324,7 +326,7 @@ async function handleSinglePdfUpload(toolId: string, file: File) { ); } } else { - fieldsSection.ul.innerHTML = `
  • - No interactive form fields found -
  • `; + fieldsSection.ul.innerHTML = `
  • ${trHtml('- No interactive form fields found -')}
  • `; } resultsDiv.appendChild(fieldsSection.wrapper); @@ -412,7 +414,7 @@ async function handleSinglePdfUpload(toolId: string, file: File) { } }; - const xmpSection = createSection('XMP Metadata'); + const xmpSection = createSection(trText('XMP Metadata')); if (rawXmpString) { try { const parser = new DOMParser(); @@ -431,11 +433,11 @@ async function handleSinglePdfUpload(toolId: string, file: File) { } if (xmpSection.ul.children.length === 0) { - xmpSection.ul.innerHTML = `
  • - No parseable XMP properties found -
  • `; + xmpSection.ul.innerHTML = `
  • ${trHtml('- No parseable XMP properties found -')}
  • `; } } catch (xmlError) { console.error('Failed to parse XMP XML:', xmlError); - xmpSection.ul.innerHTML = `
  • - Error parsing XMP XML. Displaying raw. -
  • `; + xmpSection.ul.innerHTML = `
  • ${trHtml('- Error parsing XMP XML. Displaying raw. -')}
  • `; const pre = document.createElement('pre'); pre.className = 'text-xs text-gray-300 whitespace-pre-wrap break-all'; @@ -443,7 +445,7 @@ async function handleSinglePdfUpload(toolId: string, file: File) { xmpSection.ul.appendChild(pre); } } else { - xmpSection.ul.innerHTML = `
  • - No XMP metadata found -
  • `; + xmpSection.ul.innerHTML = `
  • ${trHtml('- No XMP metadata found -')}
  • `; } resultsDiv.appendChild(xmpSection.wrapper); @@ -495,13 +497,13 @@ async function handleSinglePdfUpload(toolId: string, file: File) { const keyInput = document.createElement('input'); keyInput.type = 'text'; - keyInput.placeholder = 'Key (e.g., Department)'; + keyInput.placeholder = trText('Key (e.g., Department)'); keyInput.className = 'custom-meta-key w-full sm:w-1/3 bg-gray-800 border border-gray-600 text-white rounded-lg p-2'; const valueInput = document.createElement('input'); valueInput.type = 'text'; - valueInput.placeholder = 'Value (e.g., Marketing)'; + valueInput.placeholder = trText('Value (e.g., Marketing)'); valueInput.className = 'custom-meta-value w-full sm:flex-grow bg-gray-800 border border-gray-600 text-white rounded-lg p-2'; @@ -539,7 +541,9 @@ async function handleSinglePdfUpload(toolId: string, file: File) { const qualityValue = document.getElementById('jpg-quality-value'); if (qualitySlider && qualityValue) { const updateValue = () => { - qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`; + qualityValue.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(qualitySlider.value) * 100), + }); }; qualitySlider.addEventListener('input', updateValue); updateValue(); @@ -553,7 +557,9 @@ async function handleSinglePdfUpload(toolId: string, file: File) { const qualityValue = document.getElementById('png-quality-value'); if (qualitySlider && qualityValue) { const updateValue = () => { - qualityValue.textContent = `${qualitySlider.value}x`; + qualityValue.textContent = trText('{{value}}x', { + value: qualitySlider.value, + }); }; qualitySlider.addEventListener('input', updateValue); updateValue(); @@ -567,7 +573,9 @@ async function handleSinglePdfUpload(toolId: string, file: File) { const qualityValue = document.getElementById('webp-quality-value'); if (qualitySlider && qualityValue) { const updateValue = () => { - qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`; + qualityValue.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(qualitySlider.value) * 100), + }); }; qualitySlider.addEventListener('input', updateValue); updateValue(); @@ -768,7 +776,9 @@ async function handleMultiFileUpload(toolId: string) { const value = document.getElementById('image-pdf-quality-value'); if (slider && value) { const update = () => - (value.textContent = `${Math.round(parseFloat(slider.value) * 100)}%`); + (value.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(slider.value) * 100), + })); slider.addEventListener('input', update); update(); } @@ -782,7 +792,9 @@ async function handleMultiFileUpload(toolId: string) { const qualityValue = document.getElementById('jpg-quality-value'); if (qualitySlider && qualityValue) { const updateValue = () => { - qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`; + qualityValue.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(qualitySlider.value) * 100), + }); }; qualitySlider.addEventListener('input', updateValue); updateValue(); @@ -796,7 +808,9 @@ async function handleMultiFileUpload(toolId: string) { const qualityValue = document.getElementById('png-quality-value'); if (qualitySlider && qualityValue) { const updateValue = () => { - qualityValue.textContent = `${qualitySlider.value}x`; + qualityValue.textContent = trText('{{value}}x', { + value: qualitySlider.value, + }); }; qualitySlider.addEventListener('input', updateValue); updateValue(); @@ -810,7 +824,9 @@ async function handleMultiFileUpload(toolId: string) { const qualityValue = document.getElementById('webp-quality-value'); if (qualitySlider && qualityValue) { const updateValue = () => { - qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`; + qualityValue.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(qualitySlider.value) * 100), + }); }; qualitySlider.addEventListener('input', updateValue); updateValue(); diff --git a/src/js/i18n/i18n.ts b/src/js/i18n/i18n.ts index 2b8d21db..4307b74f 100644 --- a/src/js/i18n/i18n.ts +++ b/src/js/i18n/i18n.ts @@ -1,6 +1,7 @@ import i18next from 'i18next'; import HttpBackend from 'i18next-http-backend'; -import { getStoredItem, setStoredItem } from '../utils/safe-storage.js'; +import { setStoredItem } from '../utils/safe-storage.js'; +import { fillPlaceholders } from './placeholders.js'; import enCommon from '../../../public/locales/en/common.json'; import enTools from '../../../public/locales/en/tools.json'; @@ -82,50 +83,21 @@ export const getLanguageFromUrl = (): SupportedLanguage => { return langMatch[1] as SupportedLanguage; } - const storedLang = getStoredItem('i18nextLng'); - if ( - storedLang && - supportedLanguages.includes(storedLang as SupportedLanguage) - ) { - return storedLang as SupportedLanguage; - } - - // Check browser language preferences - if (typeof navigator !== 'undefined' && navigator.languages) { - for (const lang of navigator.languages) { - if (supportedLanguages.includes(lang as SupportedLanguage)) { - return lang as SupportedLanguage; - } - - const primaryLang = lang.split('-')[0]; - if (supportedLanguages.includes(primaryLang as SupportedLanguage)) { - return primaryLang as SupportedLanguage; - } - } - } - - const envLang = import.meta.env?.VITE_DEFAULT_LANGUAGE; - if (envLang && supportedLanguages.includes(envLang as SupportedLanguage)) { - return envLang as SupportedLanguage; - } - return 'en'; }; -let initialized = false; +export const LANGUAGE_CHOICE_KEY = 'bentopdf-language'; -export const initI18n = async (): Promise => { - if (initialized) return i18next; +let initPromise: Promise | null = null; +const runInit = async (): Promise => { const currentLang = getLanguageFromUrl(); - setStoredItem('i18nextLng', currentLang); - await i18next.use(HttpBackend).init({ lng: currentLang, fallbackLng: 'en', supportedLngs: supportedLanguages as unknown as string[], - ns: ['common', 'tools'], + ns: currentLang === 'en' ? ['common', 'tools'] : ['common', 'tools', 'ui'], defaultNS: 'common', preload: [currentLang], partialBundledLanguages: true, @@ -133,6 +105,7 @@ export const initI18n = async (): Promise => { en: { common: enCommon, tools: enTools, + ui: {}, }, }, backend: { @@ -144,18 +117,87 @@ export const initI18n = async (): Promise => { }); await i18next.loadNamespaces('tools'); + if (currentLang !== 'en') { + try { + await i18next.loadNamespaces('ui'); + } catch (error) { + console.warn('[i18n] Could not load interface messages:', error); + } + } - initialized = true; return i18next; }; +export const initI18n = (): Promise => { + initPromise ??= runInit(); + return initPromise; +}; + +const domReady = (): Promise => + document.readyState === 'loading' + ? new Promise((resolve) => + document.addEventListener('DOMContentLoaded', () => resolve(), { + once: true, + }) + ) + : Promise.resolve(); + +const I18N_READY_TIMEOUT_MS = 5000; + +export const onPageReady = (callback: () => void | Promise): void => { + const i18nReady = Promise.race([ + initI18n().then( + (): void => undefined, + (): void => undefined + ), + new Promise((resolve) => setTimeout(resolve, I18N_READY_TIMEOUT_MS)), + ]); + const holdDrop = (event: DragEvent) => event.preventDefault(); + window.addEventListener('dragover', holdDrop); + window.addEventListener('drop', holdDrop); + void Promise.all([domReady(), i18nReady]).then(() => { + window.removeEventListener('dragover', holdDrop); + window.removeEventListener('drop', holdDrop); + return callback(); + }); +}; + export const t = (key: string, options?: Record): string => { return i18next.t(key, options); }; +export const hasKey = (key: string): boolean => i18next.exists(key); + +export const trText = ( + text: string, + params?: Record +): string => { + const language = i18next.language; + let template = text; + if (i18next.isInitialized && language && language !== 'en') { + const translated = i18next.getResource(language, 'ui', text, { + keySeparator: false, + }); + if (typeof translated === 'string' && translated) template = translated; + } + return fillPlaceholders(template, params); +}; + +const escapeForHtml = (text: string): string => + text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); + +export const trHtml = ( + text: string, + params?: Record +): string => escapeForHtml(trText(text, params)); + export const changeLanguage = (lang: SupportedLanguage): void => { if (!supportedLanguages.includes(lang)) return; - setStoredItem('i18nextLng', lang); + setStoredItem(LANGUAGE_CHOICE_KEY, lang); const basePath = import.meta.env.BASE_URL.replace(/\/$/, ''); let relativePath = window.location.pathname; @@ -269,8 +311,16 @@ export const rewriteLinks = (): void => { return; } + const pathOnly = + basePath && basePath !== '/' && href.startsWith(`${basePath}/`) + ? href.slice(basePath.length) + : href; + if (/^\/(blog|docs)(\/|$|[?#])/.test(pathOnly)) { + return; + } + const langPrefixRegex = new RegExp( - `^(${basePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})?/?(en|ar|fr|es|de|zh|zh-TW|vi|tr|id|it|pt|nl|be|da|ko|sv|ru|ja|uk|sk|ca|fa)(/|$)` + `^(${basePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})?/?(en|ar|fr|es|de|zh|zh-TW|vi|tr|id|it|pt|nl|be|da|ko|sv|ru|ja|uk|sk|ca|fa)(/|$|[?#])` ); if (langPrefixRegex.test(href)) { return; diff --git a/src/js/i18n/index.ts b/src/js/i18n/index.ts index d3cd391f..5667eca5 100644 --- a/src/js/i18n/index.ts +++ b/src/js/i18n/index.ts @@ -1,6 +1,9 @@ export { initI18n, + onPageReady, t, + trText, + trHtml, changeLanguage, applyTranslations, rewriteLinks, diff --git a/src/js/i18n/language-switcher.ts b/src/js/i18n/language-switcher.ts index d4e37742..6cbe5701 100644 --- a/src/js/i18n/language-switcher.ts +++ b/src/js/i18n/language-switcher.ts @@ -51,10 +51,16 @@ export const createLanguageSwitcher = (): HTMLElement => { searchWrapper.className = 'p-2 border-b border-gray-700 bg-gray-800 flex-shrink-0'; - const searchPlaceholder = - t('nav.searchLanguage') !== 'nav.searchLanguage' - ? t('nav.searchLanguage') - : 'Search language…'; + const translated = (key: string, fallback: string): string => { + const value = t(key); + return typeof value === 'string' && value && value !== key + ? value + : fallback; + }; + const searchPlaceholder = translated( + 'nav.searchLanguage', + 'Search language…' + ); const searchInput = document.createElement('input'); searchInput.type = 'search'; @@ -76,10 +82,7 @@ export const createLanguageSwitcher = (): HTMLElement => { const emptyState = document.createElement('p'); emptyState.className = 'hidden px-4 py-3 text-sm text-gray-400 text-center'; - const emptyText = - t('nav.noLanguagesFound') !== 'nav.noLanguagesFound' - ? t('nav.noLanguagesFound') - : 'No languages found'; + const emptyText = translated('nav.noLanguagesFound', 'No languages found'); emptyState.textContent = emptyText; const options: HTMLButtonElement[] = []; @@ -176,18 +179,9 @@ export const injectLanguageSwitcher = (): void => { const footer = document.querySelector('footer'); if (!footer) return; - const headings = footer.querySelectorAll('h3'); - let followUsColumn: HTMLElement | null = null; - - headings.forEach((h3) => { - if ( - h3.textContent?.trim() === 'Follow Us' || - h3.textContent?.trim() === 'Folgen Sie uns' || - h3.textContent?.trim() === 'Theo dõi chúng tôi' - ) { - followUsColumn = h3.parentElement; - } - }); + const followUsHeading = footer.querySelector('[data-i18n="footer.followUs"]'); + const followUsColumn: HTMLElement | null = + followUsHeading?.parentElement ?? null; if (followUsColumn) { const socialIconsContainer = followUsColumn.querySelector('.space-x-4'); diff --git a/src/js/i18n/placeholders.ts b/src/js/i18n/placeholders.ts new file mode 100644 index 00000000..c581ef7f --- /dev/null +++ b/src/js/i18n/placeholders.ts @@ -0,0 +1,11 @@ +export const fillPlaceholders = ( + text: string, + params?: Record +): string => { + if (!params) return text; + return text.replace(/\{\{(\w+)\}\}/g, (match, name: string) => + Object.prototype.hasOwnProperty.call(params, name) + ? String(params[name]) + : match + ); +}; diff --git a/src/js/language-redirect.js b/src/js/language-redirect.js new file mode 100644 index 00000000..ac364e87 --- /dev/null +++ b/src/js/language-redirect.js @@ -0,0 +1,61 @@ +(function () { + var script = document.currentScript; + if (!script) return; + var base = (script.getAttribute('data-base') || '/').replace(/\/?$/, '/'); + var languages = (script.getAttribute('data-languages') || '').split(','); + var fallback = script.getAttribute('data-default-language') || 'en'; + var path = window.location.pathname; + if (path + '/' === base) path = base; + if (path.indexOf(base) !== 0) return; + var rest = path.slice(base.length); + var first = rest.split('/')[0]; + if (first === 'en' || languages.indexOf(first) !== -1) return; + if (/^(blog|docs)(\/|$)/.test(rest)) return; + + var choice; + try { + choice = window.localStorage.getItem('bentopdf-language'); + } catch { + choice = null; + } + + function supported(code) { + var lower = code.toLowerCase(); + if (/^zh-(tw|hk|mo|hant)/.test(lower)) return 'zh-TW'; + var primary = lower.split('-')[0]; + if (primary === 'en') return 'en'; + return languages.indexOf(primary) !== -1 ? primary : null; + } + + function cameFromThisSite() { + var origin = window.location.origin + '/'; + return document.referrer.slice(0, origin.length) === origin; + } + + function detect() { + var preferred = window.navigator.languages || [window.navigator.language]; + for (var i = 0; i < preferred.length; i++) { + if (!preferred[i]) continue; + var match = supported(preferred[i]); + if (match) return match; + } + return languages.indexOf(fallback) !== -1 ? fallback : 'en'; + } + + var target = null; + if (choice) { + if (languages.indexOf(choice) !== -1) target = choice; + } else if ((rest === '' || rest === 'index.html') && !cameFromThisSite()) { + target = detect(); + } + if (!target || target === 'en') return; + + var page = rest === 'index.html' ? '' : rest; + window.location.replace( + base + + target + + (page ? '/' + page : '') + + window.location.search + + window.location.hash + ); +})(); diff --git a/src/js/logic/add-attachments-page.ts b/src/js/logic/add-attachments-page.ts index 44aea4b5..96af282d 100644 --- a/src/js/logic/add-attachments-page.ts +++ b/src/js/logic/add-attachments-page.ts @@ -10,6 +10,8 @@ import { import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const worker = new Worker( import.meta.env.BASE_URL + 'workers/add-attachments.worker.js' ); @@ -72,7 +74,9 @@ worker.onmessage = function (e) { showAlert( 'Success', - `${pageState.attachments.length} file(s) attached successfully.`, + trText('{{length}} file(s) attached successfully.', { + length: pageState.attachments.length, + }), 'success', function () { resetState(); @@ -112,7 +116,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -140,7 +146,10 @@ async function updateUI() { pageState.pdfDoc = await loadPdfDocument(result.bytes); const pageCount = pageState.pdfDoc.getPageCount(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); const totalPagesSpan = document.getElementById('attachment-total-pages'); if (totalPagesSpan) totalPagesSpan.textContent = pageCount.toString(); @@ -249,7 +258,11 @@ async function addAttachments() { for (let i = 0; i < pageState.attachments.length; i++) { const file = pageState.attachments[i]; showLoader( - `Reading ${file.name} (${i + 1}/${pageState.attachments.length})...` + trText('Reading {{name}} ({{n}}/{{length}})...', { + name: file.name, + n: i + 1, + length: pageState.attachments.length, + }) ); const fileBuffer = await file.arrayBuffer(); @@ -276,7 +289,9 @@ async function addAttachments() { hideLoader(); showAlert( 'Error', - `Failed to attach files: ${error instanceof Error ? error.message : 'Unknown error'}` + trText('Failed to attach files: {{error}}', { + error: error instanceof Error ? error.message : trText('Unknown error'), + }) ); } } @@ -301,7 +316,7 @@ function handleAttachmentSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const attachmentInput = document.getElementById( diff --git a/src/js/logic/add-blank-page-page.ts b/src/js/logic/add-blank-page-page.ts index e6484da8..c8f586f5 100644 --- a/src/js/logic/add-blank-page-page.ts +++ b/src/js/logic/add-blank-page-page.ts @@ -6,6 +6,8 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { AddBlankPageState } from '@/types'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: AddBlankPageState = { file: null, pdfDoc: null, @@ -61,7 +63,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -90,10 +94,16 @@ async function updateUI() { hideLoader(); const pageCount = pageState.pdfDoc.getPageCount(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); if (pagePositionHint) { - pagePositionHint.textContent = `Enter 0 to insert at the beginning, or ${pageCount} to insert at the end.`; + pagePositionHint.textContent = trText( + 'Enter 0 to insert at the beginning, or {{pageCount}} to insert at the end.', + { pageCount } + ); } if (pagePositionInput) { pagePositionInput.max = pageCount.toString(); @@ -131,7 +141,9 @@ async function addBlankPages() { if (isNaN(position) || position < 0 || position > totalPages) { showAlert( 'Invalid Input', - `Please enter a number between 0 and ${totalPages}.` + trText('Please enter a number between 0 and {{totalPages}}.', { + totalPages, + }) ); return; } @@ -145,7 +157,9 @@ async function addBlankPages() { } showLoader( - `Adding ${insertCount} blank page${insertCount > 1 ? 's' : ''}...` + insertCount > 1 + ? trText('Adding {{insertCount}} blank pages...', { insertCount }) + : trText('Adding {{insertCount}} blank page...', { insertCount }) ); try { @@ -185,7 +199,13 @@ async function addBlankPages() { showAlert( 'Success', - `Added ${insertCount} blank page${insertCount > 1 ? 's' : ''} successfully!`, + insertCount > 1 + ? trText('Added {{insertCount}} blank pages successfully!', { + insertCount, + }) + : trText('Added {{insertCount}} blank page successfully!', { + insertCount, + }), 'success', function () { resetState(); @@ -195,7 +215,9 @@ async function addBlankPages() { console.error(e); showAlert( 'Error', - `Could not add blank page${insertCount > 1 ? 's' : ''}.` + insertCount > 1 + ? trText('Could not add blank pages.') + : trText('Could not add blank page.') ); } finally { hideLoader(); @@ -215,7 +237,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/add-page-labels-page.ts b/src/js/logic/add-page-labels-page.ts index 7c54ff0f..697d151b 100644 --- a/src/js/logic/add-page-labels-page.ts +++ b/src/js/logic/add-page-labels-page.ts @@ -6,7 +6,7 @@ import type { CpdfInstance, } from '@/types'; import { showAlert, showLoader, hideLoader } from '../ui.js'; -import { t } from '../i18n/index.js'; +import { t, onPageReady } from '../i18n/index.js'; import { downloadFile, formatBytes, @@ -47,11 +47,7 @@ const pageState: AddPageLabelsState = { rules: [createLabelRule()], }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function createLabelRule(overrides: Partial = {}): LabelRule { labelRuleCounter += 1; diff --git a/src/js/logic/add-stamps.ts b/src/js/logic/add-stamps.ts index 236cf282..20a747fc 100644 --- a/src/js/logic/add-stamps.ts +++ b/src/js/logic/add-stamps.ts @@ -7,6 +7,9 @@ import { initializeGlobalShortcuts } from '../utils/shortcuts-init.js'; import { createIcons, icons } from 'lucide'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText } from '../i18n/i18n.js'; +import { getStoredItem, setStoredItem } from '../utils/safe-storage.js'; + let selectedFile: File | null = null; let viewerIframe: HTMLIFrameElement | null = null; let currentBlobUrl: string | null = null; @@ -55,7 +58,7 @@ function resetState() { viewerContainer.style.aspectRatio = ''; } - const isFullWidth = localStorage.getItem('fullWidthMode') !== 'false'; + const isFullWidth = getStoredItem('fullWidthMode') !== 'false'; if (toolUploader && !isFullWidth) { toolUploader.classList.remove('max-w-6xl'); toolUploader.classList.add('max-w-2xl'); @@ -76,7 +79,7 @@ function updateFileList() { fileListDiv.innerHTML = ''; // Expand container width for viewer if NOT in full width mode (default to true if not set) - const isFullWidth = localStorage.getItem('fullWidthMode') !== 'false'; + const isFullWidth = getStoredItem('fullWidthMode') !== 'false'; if (toolUploader && !isFullWidth) { toolUploader.classList.remove('max-w-2xl'); toolUploader.classList.add('max-w-6xl'); @@ -105,7 +108,7 @@ function updateFileList() { const deleteBtn = document.createElement('button'); deleteBtn.className = 'text-red-400 hover:text-red-300 p-2 flex-shrink-0 ml-2'; - deleteBtn.title = 'Remove file'; + deleteBtn.title = trText('Remove file'); deleteBtn.innerHTML = ''; deleteBtn.onclick = (e) => { e.stopPropagation(); @@ -165,14 +168,14 @@ async function loadPdfInViewer(file: File) { currentBlobUrl = URL.createObjectURL(blob); try { - const existingPrefsRaw = localStorage.getItem('pdfjs.preferences'); + const existingPrefsRaw = getStoredItem('pdfjs.preferences'); const existingPrefs = existingPrefsRaw ? JSON.parse(existingPrefsRaw) : {}; delete (existingPrefs as Record).annotationEditorMode; const newPrefs = { ...existingPrefs, enablePermissions: false, }; - localStorage.setItem('pdfjs.preferences', JSON.stringify(newPrefs)); + setStoredItem('pdfjs.preferences', JSON.stringify(newPrefs)); } catch (e) { console.warn('Failed to update pdfjs.preferences in localStorage', e); } @@ -301,7 +304,9 @@ if (saveStampedBtn) { saveStampedBtn.addEventListener('click', () => { if (!viewerIframe) { alert( - 'Viewer not ready. Please upload a PDF and wait for it to finish loading.' + trText( + 'Viewer not ready. Please upload a PDF and wait for it to finish loading.' + ) ); return; } @@ -338,12 +343,16 @@ if (saveStampedBtn) { } alert( - 'Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.' + trText( + 'Could not access the stamped-PDF exporter. Please use the Export → PDF button in the viewer toolbar as a fallback.' + ) ); } catch (e) { console.error('Failed to trigger stamped PDF export:', e); alert( - 'Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.' + trText( + 'Could not export the stamped PDF. Please use the Export → PDF button in the viewer toolbar as a fallback.' + ) ); } }); diff --git a/src/js/logic/add-watermark-page.ts b/src/js/logic/add-watermark-page.ts index 0e547929..6da571a5 100644 --- a/src/js/logic/add-watermark-page.ts +++ b/src/js/logic/add-watermark-page.ts @@ -23,6 +23,8 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: AddWatermarkState = { file: null, pdfDoc: null, @@ -58,11 +60,7 @@ let cachedPdfjsDoc: pdfjsLib.PDFDocumentProxy | null = null; const pageWatermarks: Map = new Map(); let applyToAllPages = true; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -145,7 +143,10 @@ async function handleFiles(files: FileList) { const editorFileInfo = document.getElementById('editor-file-info'); if (editorFileInfo) { - editorFileInfo.textContent = `${file.name} (${formatBytes(file.size)}, ${totalPageCount} pages)`; + editorFileInfo.textContent = trText( + '{{name}} ({{size}}, {{totalPageCount}} pages)', + { name: file.name, size: formatBytes(file.size), totalPageCount } + ); } updatePageNavUI(); @@ -173,7 +174,10 @@ function updateFileDisplay() { nameSpan.textContent = pageState.file.name; const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.pdfDoc.getPageCount()} pages`; + metaSpan.textContent = trText('{{size}} • {{getPageCount}} pages', { + size: formatBytes(pageState.file.size), + getPageCount: pageState.pdfDoc.getPageCount(), + }); infoContainer.append(nameSpan, metaSpan); const removeBtn = document.createElement('button'); removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; @@ -1068,7 +1072,7 @@ async function applyWatermark() { if (config.type === 'text') { const text = config.text; if (!text.trim()) - throw new Error('Please enter text for the watermark.'); + throw new Error(trText('Please enter text for the watermark.')); const textColor = hexToRgb(config.color); resultBytes = new Uint8Array( @@ -1089,7 +1093,9 @@ async function applyWatermark() { } else { const imageFile = config.imageFile; if (!imageFile) - throw new Error('Please select an image file for the watermark.'); + throw new Error( + trText('Please select an image file for the watermark.') + ); const imageBytes = await readFileAsArrayBuffer(imageFile); let imageType: 'png' | 'jpg'; @@ -1099,7 +1105,9 @@ async function applyWatermark() { imageType = 'jpg'; } else { throw new Error( - 'Unsupported Image. Please use a PNG or JPG for the watermark.' + trText( + 'Unsupported Image. Please use a PNG or JPG for the watermark.' + ) ); } @@ -1223,7 +1231,12 @@ async function applyWatermark() { const renderScale = 2.5; for (let i = 1; i <= totalPages; i++) { - showLoader(`Flattening page ${i} of ${totalPages}...`); + showLoader( + trText('Flattening page {{i}} of {{totalPages}}...', { + i, + totalPages, + }) + ); const page = await watermarkedPdf.getPage(i); const unscaledVP = page.getViewport({ scale: 1 }); const viewport = page.getViewport({ scale: renderScale }); diff --git a/src/js/logic/adjust-colors-page.ts b/src/js/logic/adjust-colors-page.ts index 2a7e7a0d..aa29217e 100644 --- a/src/js/logic/adjust-colors-page.ts +++ b/src/js/logic/adjust-colors-page.ts @@ -10,7 +10,7 @@ import { PDFDocument } from 'pdf-lib'; import { applyColorAdjustments } from '../utils/image-effects.js'; import * as pdfjsLib from 'pdfjs-dist'; import type { AdjustColorsSettings } from '../types/adjust-colors-type.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -121,7 +121,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -144,7 +147,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf: pdfjsLib.PDFDocumentProxy) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch(() => { metaSpan.textContent = formatBytes(file.size); @@ -181,7 +188,12 @@ async function processAllPages(): Promise { const newPdfDoc = await PDFDocument.create(); for (let i = 1; i <= doc.numPages; i++) { - showLoader(`Processing page ${i} of ${doc.numPages}...`); + showLoader( + trText('Processing page {{i}} of {{numPages}}...', { + i, + numPages: doc.numPages, + }) + ); const page = await doc.getPage(i); const viewport = page.getViewport({ scale: 2.0 }); @@ -331,7 +343,7 @@ function setupSettingsListeners(): void { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/alternate-merge-page.ts b/src/js/logic/alternate-merge-page.ts index e7f141c8..8c956053 100644 --- a/src/js/logic/alternate-merge-page.ts +++ b/src/js/logic/alternate-merge-page.ts @@ -9,6 +9,8 @@ import { showWasmRequiredDialog } from '../utils/wasm-provider.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { interleavePdfs } from '../utils/alternate-merge.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: AlternateMergeState = { files: [], pdfBytes: new Map(), @@ -50,7 +52,9 @@ async function updateUI() { const infoSpan = document.createElement('span'); infoSpan.className = 'text-gray-200'; - infoSpan.textContent = `${pageState.files.length} PDF files selected`; + infoSpan.textContent = trText('{{length}} PDF files selected', { + length: pageState.files.length, + }); const clearBtn = document.createElement('button'); clearBtn.className = 'text-red-400 hover:text-red-300'; @@ -94,7 +98,10 @@ async function updateUI() { const metaSpan = document.createElement('span'); metaSpan.className = 'text-sm text-gray-400 flex-shrink-0'; - metaSpan.textContent = `${formatBytes(file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(file.size), + pageCount, + }); infoDiv.append(nameSpan, metaSpan); @@ -147,7 +154,7 @@ async function mixPages() { try { const fileList = document.getElementById('file-list'); - if (!fileList) throw new Error('File list not found'); + if (!fileList) throw new Error(trText('File list not found')); const sortedFileNames = Array.from(fileList.children) .map(function (li) { @@ -199,7 +206,7 @@ async function mixPages() { const message = e instanceof Error ? e.message - : 'An error occurred while mixing the PDFs.'; + : trText('An error occurred while mixing the PDFs.'); showAlert('Error', message); } } @@ -218,7 +225,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/background-color-page.ts b/src/js/logic/background-color-page.ts index 8ce491ce..f70c8a1c 100644 --- a/src/js/logic/background-color-page.ts +++ b/src/js/logic/background-color-page.ts @@ -6,13 +6,11 @@ import { BackgroundColorState } from '@/types'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: BackgroundColorState = { file: null, pdfDoc: null }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -90,7 +88,10 @@ function updateFileDisplay() { nameSpan.textContent = pageState.file.name; const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.pdfDoc.getPageCount()} pages`; + metaSpan.textContent = trText('{{size}} • {{getPageCount}} pages', { + size: formatBytes(pageState.file.size), + getPageCount: pageState.pdfDoc.getPageCount(), + }); infoContainer.append(nameSpan, metaSpan); const removeBtn = document.createElement('button'); removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; diff --git a/src/js/logic/bates-numbering-page.ts b/src/js/logic/bates-numbering-page.ts index c0d6d3cb..453c91b1 100644 --- a/src/js/logic/bates-numbering-page.ts +++ b/src/js/logic/bates-numbering-page.ts @@ -8,6 +8,8 @@ import Sortable from 'sortablejs'; import { FileEntry, Position, StylePreset } from '@/types'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const FONT_MAP: Record = { Helvetica: 'Helvetica', TimesRoman: 'TimesRoman', @@ -54,11 +56,7 @@ const STYLE_PRESETS: Record = { const files: FileEntry[] = []; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -237,7 +235,10 @@ function renderFileList() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(entry.file.size)} \u2022 ${entry.pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(entry.file.size), + pageCount: entry.pageCount, + }); infoContainer.append(nameSpan, metaSpan); leftSection.append(dragHandle, infoContainer); @@ -260,7 +261,16 @@ function renderFileList() { const summary = document.createElement('div'); summary.className = 'text-xs text-gray-400 mt-1'; - summary.textContent = `${files.length} file${files.length !== 1 ? 's' : ''} \u2022 ${totalPages} total pages`; + summary.textContent = + files.length !== 1 + ? trText('{{length}} files • {{totalPages}} total pages', { + length: files.length, + totalPages, + }) + : trText('{{length}} file • {{totalPages}} total pages', { + length: files.length, + totalPages, + }); fileListEl.appendChild(summary); } @@ -539,7 +549,10 @@ async function applyBatesNumbers() { showAlert( 'Success', - `Bates numbers applied successfully! (${batesStart} through ${batesCounter - 1})`, + trText( + 'Bates numbers applied successfully! ({{batesStart}} through {{n}})', + { batesStart, n: batesCounter - 1 } + ), 'success', () => { resetState(); diff --git a/src/js/logic/bmp-to-pdf-page.ts b/src/js/logic/bmp-to-pdf-page.ts index 97ccd46f..7909c9d9 100644 --- a/src/js/logic/bmp-to-pdf-page.ts +++ b/src/js/logic/bmp-to-pdf-page.ts @@ -3,202 +3,212 @@ import { downloadFile, formatBytes } from '../utils/helpers.js'; import { createIcons, icons } from 'lucide'; import { PDFDocument as PDFLibDocument } from 'pdf-lib'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; async function convertImageToPngBytes(file: File): Promise { - return new Promise((resolve, reject) => { - const img = new Image(); - const reader = new FileReader(); + return new Promise((resolve, reject) => { + const img = new Image(); + const reader = new FileReader(); - reader.onload = (e) => { - img.onload = async () => { - const canvas = document.createElement('canvas'); - canvas.width = img.width; - canvas.height = img.height; - const ctx = canvas.getContext('2d'); - if (!ctx) { - reject(new Error('Failed to get canvas context')); - return; - } - ctx.drawImage(img, 0, 0); - const pngBlob = await new Promise((res) => - canvas.toBlob(res, 'image/png') - ); - if (!pngBlob) { - reject(new Error('Failed to create PNG blob')); - return; - } - const pngBytes = await pngBlob.arrayBuffer(); - resolve(pngBytes); - }; - img.onerror = () => reject(new Error('Failed to load image.')); - img.src = e.target?.result as string; - }; - reader.onerror = () => reject(new Error('Failed to read file.')); - reader.readAsDataURL(file); - }); + reader.onload = (e) => { + img.onload = async () => { + const canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + const ctx = canvas.getContext('2d'); + if (!ctx) { + reject(new Error(trText('Failed to get canvas context'))); + return; + } + ctx.drawImage(img, 0, 0); + const pngBlob = await new Promise((res) => + canvas.toBlob(res, 'image/png') + ); + if (!pngBlob) { + reject(new Error(trText('Failed to create PNG blob'))); + return; + } + const pngBytes = await pngBlob.arrayBuffer(); + resolve(pngBytes); + }; + img.onerror = () => reject(new Error(trText('Failed to load image.'))); + img.src = e.target?.result as string; + }; + reader.onerror = () => reject(new Error(trText('Failed to read file.'))); + reader.readAsDataURL(file); + }); } const updateUI = () => { - const fileDisplayArea = document.getElementById('file-display-area'); - const fileControls = document.getElementById('file-controls'); - const processBtn = document.getElementById('process-btn'); + const fileDisplayArea = document.getElementById('file-display-area'); + const fileControls = document.getElementById('file-controls'); + const processBtn = document.getElementById('process-btn'); - if (!fileDisplayArea || !fileControls || !processBtn) return; + if (!fileDisplayArea || !fileControls || !processBtn) return; - fileDisplayArea.innerHTML = ''; + fileDisplayArea.innerHTML = ''; - if (files.length > 0) { - fileControls.classList.remove('hidden'); - processBtn.classList.remove('hidden'); + if (files.length > 0) { + fileControls.classList.remove('hidden'); + processBtn.classList.remove('hidden'); - files.forEach((file, index) => { - const fileDiv = document.createElement('div'); - fileDiv.className = 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; + files.forEach((file, index) => { + const fileDiv = document.createElement('div'); + fileDiv.className = + 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; - const infoContainer = document.createElement('div'); - infoContainer.className = 'flex items-center gap-2 overflow-hidden'; + const infoContainer = document.createElement('div'); + infoContainer.className = 'flex items-center gap-2 overflow-hidden'; - const nameSpan = document.createElement('span'); - nameSpan.className = 'truncate font-medium text-gray-200'; - nameSpan.textContent = file.name; + const nameSpan = document.createElement('span'); + nameSpan.className = 'truncate font-medium text-gray-200'; + nameSpan.textContent = file.name; - const sizeSpan = document.createElement('span'); - sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + const sizeSpan = document.createElement('span'); + sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); - infoContainer.append(nameSpan, sizeSpan); + infoContainer.append(nameSpan, sizeSpan); - const removeBtn = document.createElement('button'); - removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; - removeBtn.innerHTML = ''; - removeBtn.onclick = () => { - files = files.filter((_, i) => i !== index); - updateUI(); - }; + const removeBtn = document.createElement('button'); + removeBtn.className = + 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; + removeBtn.innerHTML = ''; + removeBtn.onclick = () => { + files = files.filter((_, i) => i !== index); + updateUI(); + }; - fileDiv.append(infoContainer, removeBtn); - fileDisplayArea.appendChild(fileDiv); - }); - createIcons({ icons }); - } else { - fileControls.classList.add('hidden'); - processBtn.classList.add('hidden'); - } + fileDiv.append(infoContainer, removeBtn); + fileDisplayArea.appendChild(fileDiv); + }); + createIcons({ icons }); + } else { + fileControls.classList.add('hidden'); + processBtn.classList.add('hidden'); + } }; const resetState = () => { - files = []; - updateUI(); + files = []; + updateUI(); }; async function convert() { - if (files.length === 0) { - showAlert('No Files', 'Please select at least one BMP file.'); - return; - } - showLoader('Converting BMP to PDF...'); - try { - const pdfDoc = await PDFLibDocument.create(); - for (const file of files) { - const pngBytes = await convertImageToPngBytes(file); - const pngImage = await pdfDoc.embedPng(pngBytes); - const page = pdfDoc.addPage([pngImage.width, pngImage.height]); - page.drawImage(pngImage, { - x: 0, - y: 0, - width: pngImage.width, - height: pngImage.height, - }); - } - const pdfBytes = await pdfDoc.save(); - downloadFile( - new Blob([new Uint8Array(pdfBytes)], { type: 'application/pdf' }), - 'from_bmps.pdf' - ); - showAlert('Success', 'PDF created successfully!', 'success', () => { - resetState(); - }); - } catch (e) { - console.error(e); - showAlert( - 'Error', - 'Failed to convert BMP to PDF. One of the files may be invalid.' - ); - } finally { - hideLoader(); + if (files.length === 0) { + showAlert('No Files', 'Please select at least one BMP file.'); + return; + } + showLoader('Converting BMP to PDF...'); + try { + const pdfDoc = await PDFLibDocument.create(); + for (const file of files) { + const pngBytes = await convertImageToPngBytes(file); + const pngImage = await pdfDoc.embedPng(pngBytes); + const page = pdfDoc.addPage([pngImage.width, pngImage.height]); + page.drawImage(pngImage, { + x: 0, + y: 0, + width: pngImage.width, + height: pngImage.height, + }); } + const pdfBytes = await pdfDoc.save(); + downloadFile( + new Blob([new Uint8Array(pdfBytes)], { type: 'application/pdf' }), + 'from_bmps.pdf' + ); + showAlert('Success', 'PDF created successfully!', 'success', () => { + resetState(); + }); + } catch (e) { + console.error(e); + showAlert( + 'Error', + 'Failed to convert BMP to PDF. One of the files may be invalid.' + ); + } finally { + hideLoader(); + } } -document.addEventListener('DOMContentLoaded', () => { - const fileInput = document.getElementById('file-input') as HTMLInputElement; - const dropZone = document.getElementById('drop-zone'); - const addMoreBtn = document.getElementById('add-more-btn'); - const clearFilesBtn = document.getElementById('clear-files-btn'); - const processBtn = document.getElementById('process-btn'); - const backBtn = document.getElementById('back-to-tools'); +onPageReady(() => { + const fileInput = document.getElementById('file-input') as HTMLInputElement; + const dropZone = document.getElementById('drop-zone'); + const addMoreBtn = document.getElementById('add-more-btn'); + const clearFilesBtn = document.getElementById('clear-files-btn'); + const processBtn = document.getElementById('process-btn'); + const backBtn = document.getElementById('back-to-tools'); - if (backBtn) { - backBtn.addEventListener('click', () => { - window.location.href = import.meta.env.BASE_URL; - }); + if (backBtn) { + backBtn.addEventListener('click', () => { + window.location.href = import.meta.env.BASE_URL; + }); + } + + const handleFileSelect = (newFiles: FileList | null) => { + if (!newFiles || newFiles.length === 0) return; + const validFiles = Array.from(newFiles).filter( + (file) => + file.type === 'image/bmp' || file.name.toLowerCase().endsWith('.bmp') + ); + + if (validFiles.length < newFiles.length) { + showAlert( + 'Invalid Files', + 'Some files were skipped. Only BMP files are allowed.' + ); } - const handleFileSelect = (newFiles: FileList | null) => { - if (!newFiles || newFiles.length === 0) return; - const validFiles = Array.from(newFiles).filter( - (file) => file.type === 'image/bmp' || file.name.toLowerCase().endsWith('.bmp') - ); - - if (validFiles.length < newFiles.length) { - showAlert('Invalid Files', 'Some files were skipped. Only BMP files are allowed.'); - } - - if (validFiles.length > 0) { - files = [...files, ...validFiles]; - updateUI(); - } - }; - - if (fileInput && dropZone) { - fileInput.addEventListener('change', (e) => { - handleFileSelect((e.target as HTMLInputElement).files); - }); - - dropZone.addEventListener('dragover', (e) => { - e.preventDefault(); - dropZone.classList.add('bg-gray-700'); - }); - - dropZone.addEventListener('dragleave', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - }); - - dropZone.addEventListener('drop', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - handleFileSelect(e.dataTransfer?.files ?? null); - }); - - fileInput.addEventListener('click', () => { - fileInput.value = ''; - }); + if (validFiles.length > 0) { + files = [...files, ...validFiles]; + updateUI(); } + }; - if (addMoreBtn) { - addMoreBtn.addEventListener('click', () => { - fileInput?.click(); - }); - } + if (fileInput && dropZone) { + fileInput.addEventListener('change', (e) => { + handleFileSelect((e.target as HTMLInputElement).files); + }); - if (clearFilesBtn) { - clearFilesBtn.addEventListener('click', () => { - resetState(); - }); - } + dropZone.addEventListener('dragover', (e) => { + e.preventDefault(); + dropZone.classList.add('bg-gray-700'); + }); - if (processBtn) { - processBtn.addEventListener('click', convert); - } + dropZone.addEventListener('dragleave', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + }); + + dropZone.addEventListener('drop', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + handleFileSelect(e.dataTransfer?.files ?? null); + }); + + fileInput.addEventListener('click', () => { + fileInput.value = ''; + }); + } + + if (addMoreBtn) { + addMoreBtn.addEventListener('click', () => { + fileInput?.click(); + }); + } + + if (clearFilesBtn) { + clearFilesBtn.addEventListener('click', () => { + resetState(); + }); + } + + if (processBtn) { + processBtn.addEventListener('click', convert); + } }); diff --git a/src/js/logic/bookmark-pdf.ts b/src/js/logic/bookmark-pdf.ts index be4c0b58..94cd26ec 100644 --- a/src/js/logic/bookmark-pdf.ts +++ b/src/js/logic/bookmark-pdf.ts @@ -12,6 +12,7 @@ import { escapeHtml, hexToRgb, } from '../utils/helpers.js'; +import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; @@ -262,21 +263,21 @@ placeholder="${escapeHTML(field.placeholder || '')}" />
    - +
    - +
    - +
    -

    Click the button above, then click on the PDF where you want the bookmark to jump to

    +

    ${trHtml('Click the button above, then click on the PDF where you want the bookmark to jump to')}

    @@ -311,7 +312,7 @@ class="w-full px-2 py-1 border border-gray-300 rounded text-sm text-gray-900" />
    `; @@ -322,13 +323,13 @@ class="w-full px-2 py-1 border border-gray-300 rounded text-sm text-gray-900" /> modal.innerHTML = `
    -

    ${escapeHTML(title)}

    +

    ${escapeHTML(trText(title))}

    ${fieldsHTML}
    - - + +
    `; @@ -354,11 +355,13 @@ class="w-full px-2 py-1 border border-gray-300 rounded text-sm text-gray-900" /> '#modal-color-picker' ) as HTMLInputElement | null; - const titleVal = titleInputEl ? titleInputEl.value : 'Preview Text'; + const titleVal = titleInputEl + ? titleInputEl.value + : trText('Preview Text'); const color = colorSelectEl ? colorSelectEl.value : ''; const style = styleSelectEl ? styleSelectEl.value : ''; - previewText.textContent = titleVal || 'Preview Text'; + previewText.textContent = titleVal || trText('Preview Text'); if (color === 'custom' && colorPickerEl) { previewText.style.color = colorPickerEl.value; @@ -695,7 +698,7 @@ function cancelDestinationPicking(): void { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { initializeGlobalShortcuts(); const canvasEl = document.getElementById( @@ -723,7 +726,10 @@ document.addEventListener('DOMContentLoaded', () => { canvasWrapperEl.appendChild(coordTooltip); } - coordTooltip.textContent = `X: ${Math.round(x)}, Y: ${Math.round(y)} `; + coordTooltip.textContent = trText('X: {{x}}, Y: {{y}} ', { + x: Math.round(x), + y: Math.round(y), + }); coordTooltip.style.left = e.clientX - rect.left + 15 + 'px'; coordTooltip.style.top = e.clientY - rect.top + 15 + 'px'; }); @@ -797,7 +803,10 @@ document.addEventListener('DOMContentLoaded', () => { canvasX + canvasRect.left - wrapperRect.left + 20 + 'px'; coordDisplay.style.top = canvasY + canvasRect.top - wrapperRect.top - 30 + 'px'; - coordDisplay.textContent = `X: ${Math.round(pdfX)}, Y: ${Math.round(pdfY)} `; + coordDisplay.textContent = trText('X: {{pdfX}}, Y: {{pdfY}} ', { + pdfX: Math.round(pdfX), + pdfY: Math.round(pdfY), + }); canvasWrapperEl.appendChild(coordDisplay); currentPickingCallback(currentPage, pdfX, pdfY); @@ -825,11 +834,11 @@ function showConfirmModal(message: string): Promise { modal.innerHTML = `
    -

    Confirm Action

    -

    ${escapeHTML(message)}

    +

    ${trHtml('Confirm Action')}

    +

    ${escapeHTML(trText(message))}

    - - + +
    `; @@ -881,7 +890,7 @@ function showAlertModal(title: string, message: string): Promise {

    ${escapeHTML(title)}

    ${escapeHTML(message)}

    - +
    `; @@ -1005,7 +1014,9 @@ redoBtn?.addEventListener('click', redo); resetBtn?.addEventListener('click', async () => { const confirmed = await showConfirmModal( - 'Reset and go back to file uploader? All unsaved changes will be lost.' + trText( + 'Reset and go back to file uploader? All unsaved changes will be lost.' + ) ); if (confirmed) { resetToUploader(); @@ -1014,12 +1025,14 @@ resetBtn?.addEventListener('click', async () => { deleteAllBtn?.addEventListener('click', async () => { if (bookmarkTree.length === 0) { - await showAlertModal('Info', 'No bookmarks to delete.'); + await showAlertModal('Info', trText('No bookmarks to delete.')); return; } const confirmed = await showConfirmModal( - `Delete all ${bookmarkTree.length} bookmark(s) ? ` + trText('Delete all {{length}} bookmark(s) ? ', { + length: bookmarkTree.length, + }) ); if (confirmed) { bookmarkTree = []; @@ -1146,7 +1159,7 @@ batchDeleteBtn?.addEventListener('click', async () => { if (selectedBookmarks.size === 0) return; const confirmed = await showConfirmModal( - `Delete ${selectedBookmarks.size} bookmark(s) ? ` + trText('Delete {{size}} bookmark(s) ? ', { size: selectedBookmarks.size }) ); if (!confirmed) return; @@ -1292,8 +1305,10 @@ csvInput?.addEventListener('change', async (e: Event) => { csvBookmarks = parseCSV(text); await showAlertModal( - 'CSV Loaded', - `Loaded ${csvBookmarks.length} bookmarks from CSV. Now upload your PDF.` + trText('CSV Loaded'), + trText('Loaded {{length}} bookmarks from CSV. Now upload your PDF.', { + length: csvBookmarks.length, + }) ); }); @@ -1306,11 +1321,11 @@ jsonInput?.addEventListener('change', async (e: Event) => { try { jsonBookmarks = JSON.parse(text); await showAlertModal( - 'JSON Loaded', - 'Loaded bookmarks from JSON. Now upload your PDF.' + trText('JSON Loaded'), + trText('Loaded bookmarks from JSON. Now upload your PDF.') ); } catch { - await showAlertModal('Error', 'Invalid JSON format'); + await showAlertModal('Error', trText('Invalid JSON format')); } }); @@ -1388,7 +1403,10 @@ async function renderPage( ctx.restore(); } - pageIndicator!.textContent = `Page ${num} / ${pdfJsDoc.numPages}`; + pageIndicator!.textContent = trText('Page {{num}} / {{numPages}}', { + num, + numPages: pdfJsDoc.numPages, + }); if (gotoPageInput) gotoPageInput.value = String(num); currentPage = num; if (currentPageDisplay) currentPageDisplay.textContent = String(num); @@ -1425,7 +1443,9 @@ gotoPageInput?.addEventListener('keypress', (e: KeyboardEvent) => { function updateZoomIndicator(): void { if (zoomIndicator) { - zoomIndicator.textContent = `${Math.round(currentZoom * 100)}%`; + zoomIndicator.textContent = trText('{{value}}%', { + value: Math.round(currentZoom * 100), + }); } } @@ -1699,7 +1719,7 @@ function createNodeElement(node: BookmarkNode, level = 0): HTMLLIElement { titleDiv.innerHTML = ` ${escapeHTML(node.title)}${destinationIcon} - Page ${escapeHTML(String(node.page))} + ${trHtml('Page {{page}}', { page: escapeHTML(String(node.page)) })} `; titleDiv.addEventListener('click', async () => { @@ -1734,16 +1754,16 @@ function createNodeElement(node: BookmarkNode, level = 0): HTMLLIElement { const addChildBtn = document.createElement('button'); addChildBtn.className = 'p-1 hover:bg-gray-200 rounded text-gray-700'; - addChildBtn.title = 'Add child'; + addChildBtn.title = trText('Add child'); addChildBtn.innerHTML = ''; addChildBtn.addEventListener('click', async (e: MouseEvent) => { e.stopPropagation(); - const result = await showInputModal('Add Child Bookmark', [ + const result = await showInputModal(trText('Add Child Bookmark'), [ { type: 'text', name: 'title', - label: 'Title', - placeholder: 'Enter bookmark title', + label: trText('Title'), + placeholder: trText('Enter bookmark title'), }, ]); if (result && result.title) { @@ -1767,52 +1787,52 @@ function createNodeElement(node: BookmarkNode, level = 0): HTMLLIElement { const editBtn = document.createElement('button'); editBtn.className = 'p-1 hover:bg-gray-200 rounded text-gray-700'; - editBtn.title = 'Edit'; + editBtn.title = trText('Edit'); editBtn.innerHTML = ''; editBtn.addEventListener('click', async (e: MouseEvent) => { e.stopPropagation(); const result = await showInputModal( - 'Edit Bookmark', + trText('Edit Bookmark'), [ { type: 'text', name: 'title', - label: 'Title', - placeholder: 'Enter bookmark title', + label: trText('Title'), + placeholder: trText('Enter bookmark title'), }, { type: 'select', name: 'color', - label: 'Color', + label: trText('Color'), options: [ - { value: '', label: 'None' }, - { value: 'red', label: 'Red' }, - { value: 'blue', label: 'Blue' }, - { value: 'green', label: 'Green' }, - { value: 'yellow', label: 'Yellow' }, - { value: 'purple', label: 'Purple' }, - { value: 'custom', label: 'Custom...' }, + { value: '', label: trText('None') }, + { value: 'red', label: trText('Red') }, + { value: 'blue', label: trText('Blue') }, + { value: 'green', label: trText('Green') }, + { value: 'yellow', label: trText('Yellow') }, + { value: 'purple', label: trText('Purple') }, + { value: 'custom', label: trText('Custom...') }, ], }, { type: 'select', name: 'style', - label: 'Style', + label: trText('Style'), options: [ - { value: '', label: 'Normal' }, - { value: 'bold', label: 'Bold' }, - { value: 'italic', label: 'Italic' }, - { value: 'bold-italic', label: 'Bold & Italic' }, + { value: '', label: trText('Normal') }, + { value: 'bold', label: trText('Bold') }, + { value: 'italic', label: trText('Italic') }, + { value: 'bold-italic', label: trText('Bold & Italic') }, ], }, { type: 'destination', name: 'destination', - label: 'Destination', + label: trText('Destination'), page: node.page, maxPages: pdfJsDoc ? pdfJsDoc.numPages : 1, }, - { type: 'preview', label: 'Preview' }, + { type: 'preview', label: trText('Preview') }, ], { title: node.title, @@ -1845,11 +1865,13 @@ function createNodeElement(node: BookmarkNode, level = 0): HTMLLIElement { const deleteBtn = document.createElement('button'); deleteBtn.className = 'p-1 hover:bg-gray-200 rounded text-red-600'; - deleteBtn.title = 'Delete'; + deleteBtn.title = trText('Delete'); deleteBtn.innerHTML = ''; deleteBtn.addEventListener('click', async (e: MouseEvent) => { e.stopPropagation(); - const confirmed = await showConfirmModal(`Delete "${node.title}"?`); + const confirmed = await showConfirmModal( + trText('Delete "{{title}}"?', { title: node.title }) + ); if (confirmed) { removeNodeById(bookmarkTree, node.id); saveState(); @@ -1883,7 +1905,7 @@ function createNodeElement(node: BookmarkNode, level = 0): HTMLLIElement { addTopLevelBtn?.addEventListener('click', async () => { const title = titleInput?.value.trim(); if (!title) { - await showAlertModal('Error', 'Please enter a title.'); + await showAlertModal('Error', trText('Please enter a title.')); return; } @@ -1929,7 +1951,10 @@ csvImportHidden?.addEventListener('change', async (e: Event) => { bookmarkTree = imported; saveState(); renderBookmarkTree(); - await showAlertModal('Success', `Imported ${imported.length} bookmarks!`); + await showAlertModal( + 'Success', + trText('Imported {{length}} bookmarks!', { length: imported.length }) + ); } if (csvImportHidden) csvImportHidden.value = ''; @@ -1939,7 +1964,7 @@ exportCsvBtn?.addEventListener('click', () => { exportDropdown?.classList.add('hidden'); if (bookmarkTree.length === 0) { - showAlertModal('Error', 'No bookmarks to export!'); + showAlertModal('Error', trText('No bookmarks to export!')); return; } @@ -2045,9 +2070,9 @@ jsonImportHidden?.addEventListener('change', async (e: Event) => { bookmarkTree = imported; saveState(); renderBookmarkTree(); - await showAlertModal('Success', 'Bookmarks imported from JSON!'); + await showAlertModal('Success', trText('Bookmarks imported from JSON!')); } catch { - await showAlertModal('Error', 'Invalid JSON format'); + await showAlertModal('Error', trText('Invalid JSON format')); } if (jsonImportHidden) jsonImportHidden.value = ''; @@ -2057,7 +2082,7 @@ exportJsonBtn?.addEventListener('click', () => { exportDropdown?.classList.add('hidden'); if (bookmarkTree.length === 0) { - showAlertModal('Error', 'No bookmarks to export!'); + showAlertModal('Error', trText('No bookmarks to export!')); return; } @@ -2072,7 +2097,10 @@ extractExistingBtn?.addEventListener('click', async () => { const extracted = await extractExistingBookmarks(); if (extracted.length > 0) { const confirmed = await showConfirmModal( - `Found ${extracted.length} existing bookmarks. Replace current bookmarks?` + trText( + 'Found {{length}} existing bookmarks. Replace current bookmarks?', + { length: extracted.length } + ) ); if (confirmed) { bookmarkTree = extracted; @@ -2080,7 +2108,10 @@ extractExistingBtn?.addEventListener('click', async () => { renderBookmarkTree(); } } else { - await showAlertModal('Info', 'No existing bookmarks found in this PDF.'); + await showAlertModal( + 'Info', + trText('No existing bookmarks found in this PDF.') + ); } }); @@ -2340,7 +2371,7 @@ downloadBtn?.addEventListener('click', async () => { }); downloadFile(blob, `${originalFileName}.pdf`); - await showAlertModal('Success', 'PDF saved successfully!'); + await showAlertModal('Success', trText('PDF saved successfully!')); setTimeout(() => { resetToUploader(); @@ -2349,7 +2380,7 @@ downloadBtn?.addEventListener('click', async () => { console.error(err); await showAlertModal( 'Error', - 'Error saving PDF. Check console for details.' + trText('Error saving PDF. Check console for details.') ); } }); diff --git a/src/js/logic/cbz-to-pdf-page.ts b/src/js/logic/cbz-to-pdf-page.ts index 2730b172..aa322180 100644 --- a/src/js/logic/cbz-to-pdf-page.ts +++ b/src/js/logic/cbz-to-pdf-page.ts @@ -7,6 +7,8 @@ import type { PyMuPDFInstance } from '@/types'; import JSZip from 'jszip'; import { PDFDocument } from 'pdf-lib'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const EXTENSIONS = ['.cbz', '.cbr']; const TOOL_NAME = 'CBZ'; const ALL_IMAGE_EXTENSIONS = [ @@ -99,7 +101,7 @@ async function convertImageToPng( const ctx = canvas.getContext('2d'); if (!ctx) { URL.revokeObjectURL(url); - reject(new Error('Failed to get canvas context')); + reject(new Error(trText('Failed to get canvas context'))); return; } ctx.drawImage(img, 0, 0); @@ -108,13 +110,19 @@ async function convertImageToPng( if (pngBlob) { resolve(pngBlob); } else { - reject(new Error(`Failed to convert ${filename} to PNG`)); + reject( + new Error( + trText('Failed to convert {{filename}} to PNG', { filename }) + ) + ); } }, 'image/png'); }; img.onerror = () => { URL.revokeObjectURL(url); - reject(new Error(`Failed to load image: ${filename}`)); + reject( + new Error(trText('Failed to load image: {{filename}}', { filename })) + ); }; img.src = url; }); @@ -138,7 +146,11 @@ async function convertCbzToPdf(file: File): Promise { const MAX_ENTRY_BYTES = 100 * 1024 * 1024; const MAX_TOTAL_BYTES = 500 * 1024 * 1024; if (imageFiles.length > MAX_CBZ_PAGES) { - throw new Error(`Archive has too many images (max ${MAX_CBZ_PAGES}).`); + throw new Error( + trText('Archive has too many images (max {{MAX_CBZ_PAGES}}).', { + MAX_CBZ_PAGES, + }) + ); } let totalBytes = 0; @@ -148,12 +160,12 @@ async function convertCbzToPdf(file: File): Promise { zipEntry as unknown as { _data?: { uncompressedSize?: number } } )._data?.uncompressedSize; if (typeof declared === 'number' && declared > MAX_ENTRY_BYTES) { - throw new Error('Archive contains an oversized image entry.'); + throw new Error(trText('Archive contains an oversized image entry.')); } const imageData = await zipEntry.async('arraybuffer'); totalBytes += imageData.byteLength; if (totalBytes > MAX_TOTAL_BYTES) { - throw new Error('Archive is too large when decompressed.'); + throw new Error(trText('Archive is too large when decompressed.')); } const dataArray = new Uint8Array(imageData); const actualFormat = detectImageFormat(dataArray); @@ -197,7 +209,7 @@ async function convertCbrToPdf(file: File): Promise { return await pymupdf.convertToPdf(file, { filetype: 'cbz' }); } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -272,13 +284,20 @@ document.addEventListener('DOMContentLoaded', () => { const convertToPdf = async () => { try { if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${TOOL_NAME} file.`); + showAlert( + 'No Files', + trText('Please select at least one {{TOOL_NAME}} file.', { + TOOL_NAME, + }) + ); return; } if (state.files.length === 1) { const originalFile = state.files[0]; - showLoader(`Converting ${originalFile.name}...`); + showLoader( + trText('Converting {{name}}...', { name: originalFile.name }) + ); let pdfBlob: Blob; if (isCbzFile(originalFile.name)) { @@ -293,7 +312,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -304,7 +325,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); let pdfBlob: Blob; @@ -326,7 +351,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`, + trText( + 'Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.', + { length: state.files.length, TOOL_NAME } + ), 'success', () => resetState() ); @@ -336,7 +364,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/change-permissions-page.ts b/src/js/logic/change-permissions-page.ts index fffabedd..8ddb8a25 100644 --- a/src/js/logic/change-permissions-page.ts +++ b/src/js/logic/change-permissions-page.ts @@ -8,6 +8,8 @@ import { import { icons, createIcons } from 'lucide'; import { ChangePermissionsState, QpdfInstanceExtended } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: ChangePermissionsState = { file: null, }; @@ -129,16 +131,17 @@ async function changePermissions() { try { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Initializing...'; + if (loaderText) loaderText.textContent = trText('Initializing...'); qpdf = await initializeQpdf(); - if (loaderText) loaderText.textContent = 'Reading PDF...'; + if (loaderText) loaderText.textContent = trText('Reading PDF...'); const fileBuffer = await readFileAsArrayBuffer(pageState.file); const uint8Array = new Uint8Array(fileBuffer as ArrayBuffer); qpdf.FS.writeFile(inputPath, uint8Array); - if (loaderText) loaderText.textContent = 'Processing PDF permissions...'; + if (loaderText) + loaderText.textContent = trText('Processing PDF permissions...'); const args = [inputPath]; @@ -220,11 +223,11 @@ async function changePermissions() { }); } - if (loaderText) loaderText.textContent = 'Preparing download...'; + if (loaderText) loaderText.textContent = trText('Preparing download...'); const outputFile = qpdf.FS.readFile(outputPath, { encoding: 'binary' }); if (!outputFile || outputFile.length === 0) { - throw new Error('Processing resulted in an empty file.'); + throw new Error(trText('Processing resulted in an empty file.')); } const blob = new Blob([new Uint8Array(outputFile)], { @@ -234,10 +237,11 @@ async function changePermissions() { if (loaderModal) loaderModal.classList.add('hidden'); - let successMessage = 'PDF permissions changed successfully!'; + let successMessage = trText('PDF permissions changed successfully!'); if (!shouldEncrypt) { - successMessage = - 'PDF decrypted successfully! All encryption and restrictions removed.'; + successMessage = trText( + 'PDF decrypted successfully! All encryption and restrictions removed.' + ); } showAlert('Success', successMessage, 'success', () => { @@ -261,7 +265,11 @@ async function changePermissions() { } else { showAlert( 'Processing Failed', - `An error occurred: ${errorMessage || 'The PDF might be corrupted or password protected.'}` + trText('An error occurred: {{error}}', { + error: + errorMessage || + trText('The PDF might be corrupted or password protected.'), + }) ); } } finally { @@ -284,7 +292,7 @@ async function changePermissions() { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/combine-single-page-page.ts b/src/js/logic/combine-single-page-page.ts index 77127011..fd302d7c 100644 --- a/src/js/logic/combine-single-page-page.ts +++ b/src/js/logic/combine-single-page-page.ts @@ -13,6 +13,8 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: CombineSinglePageState = { file: null, pdfDoc: null, @@ -54,7 +56,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -82,7 +86,10 @@ async function updateUI() { hideLoader(); const pageCount = pageState.pdfDoc.getPageCount(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); if (toolOptions) toolOptions.classList.remove('hidden'); } catch (error) { @@ -174,7 +181,12 @@ async function combineToSinglePage() { let currentY = finalHeight; for (let i = 0; i < sourcePages.length; i++) { - showLoader(`Processing page ${i + 1} of ${sourcePages.length}...`); + showLoader( + trText('Processing page {{n}} of {{length}}...', { + n: i + 1, + length: sourcePages.length, + }) + ); const sourcePage = sourcePages[i]; const { width, height } = sourcePage.getSize(); @@ -273,7 +285,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/compare-pdfs-page.ts b/src/js/logic/compare-pdfs-page.ts index 7cb29655..f848731f 100644 --- a/src/js/logic/compare-pdfs-page.ts +++ b/src/js/logic/compare-pdfs-page.ts @@ -26,6 +26,8 @@ import { getComparisonCacheKey, } from './compare-render.ts'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: CompareState = { pdfDoc1: null, pdfDoc2: null, @@ -389,8 +391,8 @@ function renderChangeList() { if (!comparison || visibleChanges.length === 0) { emptyState.textContent = comparison?.status === 'match' - ? 'No differences detected on this page.' - : 'No changes match the current filter.'; + ? trText('No differences detected on this page.') + : trText('No changes match the current filter.'); emptyState.classList.remove('hidden'); list.classList.add('hidden'); prevChangeBtn.disabled = true; @@ -403,13 +405,13 @@ function renderChangeList() { list.classList.remove('hidden'); const typeLabels: Record = { - added: 'Added', - removed: 'Deleted', - modified: 'Modified', - moved: 'Moved', - 'style-changed': 'Style Changed', - 'page-added': 'Page Added', - 'page-removed': 'Page Removed', + added: trText('Added'), + removed: trText('Deleted'), + modified: trText('Modified'), + moved: trText('Moved'), + 'style-changed': trText('Style Changed'), + 'page-added': trText('Page Added'), + 'page-removed': trText('Page Removed'), }; const grouped = new Map< @@ -497,7 +499,10 @@ async function buildPagePairs() { pageState.pdfDoc1, function (pageNumber, totalPages) { showLoader( - `Indexing PDF 1 page ${pageNumber} of ${totalPages}...`, + trText('Indexing PDF 1 page {{pageNumber}} of {{totalPages}}...', { + pageNumber, + totalPages, + }), (pageNumber / Math.max(totalPages * 2, 1)) * 100 ); } @@ -506,7 +511,10 @@ async function buildPagePairs() { pageState.pdfDoc2, function (pageNumber, totalPages) { showLoader( - `Indexing PDF 2 page ${pageNumber} of ${totalPages}...`, + trText('Indexing PDF 2 page {{pageNumber}} of {{totalPages}}...', { + pageNumber, + totalPages, + }), 50 + (pageNumber / Math.max(totalPages * 2, 1)) * 100 ); } @@ -558,7 +566,10 @@ async function renderBothPages() { const gen = ++renderGeneration; showLoader( - `Loading comparison ${pageState.currentPage} of ${pageState.pagePairs.length}...` + trText('Loading comparison {{currentPage}} of {{length}}...', { + currentPage: pageState.currentPage, + length: pageState.pagePairs.length, + }) ); const canvas1 = getElement( @@ -744,7 +755,7 @@ async function handleFileInput( hideLoader(); const result = await loadPdfWithPasswordPrompt(file); if (!result) return; - showLoader(`Loading ${result.file.name}...`); + showLoader(trText('Loading {{name}}...', { name: result.file.name })); pageState[docKey] = result.pdf; caches.pageModelCache.clear(); caches.comparisonCache.clear(); @@ -792,7 +803,7 @@ async function handleFileInput( } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const backBtn = getElement('back-to-tools'); if (backBtn) { @@ -960,7 +971,9 @@ document.addEventListener('DOMContentLoaded', function () { function updateZoomDisplay() { if (zoomDisplay) { - zoomDisplay.textContent = `${Math.round(pageState.zoomLevel * 100)}%`; + zoomDisplay.textContent = trText('{{value}}%', { + value: Math.round(pageState.zoomLevel * 100), + }); } if (zoomOutBtn) zoomOutBtn.disabled = pageState.zoomLevel <= ZOOM_MIN; if (zoomInBtn) zoomInBtn.disabled = pageState.zoomLevel >= ZOOM_MAX; diff --git a/src/js/logic/compare-render.ts b/src/js/logic/compare-render.ts index ffdc2c9a..98e070da 100644 --- a/src/js/logic/compare-render.ts +++ b/src/js/logic/compare-render.ts @@ -19,6 +19,8 @@ import { recognizePageCanvas } from '../compare/engine/ocr-page.ts'; import { isLowQualityExtractedText } from '../compare/engine/text-normalization.ts'; import { COMPARE_RENDER, COMPARE_GEOMETRY } from '../compare/config.ts'; +import { trText } from '../i18n/i18n.js'; + export function getElement(id: string) { return document.getElementById(id) as T | null; } @@ -228,7 +230,7 @@ export async function renderPage( renderMissingPage( canvas, placeholderId, - `Page ${pageNum} does not exist in this PDF.` + trText('Page {{pageNum}} does not exist in this PDF.', { pageNum }) ); return { model: null, exists: false }; } @@ -280,12 +282,12 @@ export async function renderPage( ); finalModel.pageNumber = pageNum; } else { - ctx.showLoader(`Running OCR on page ${pageNum}...`); + ctx.showLoader(trText('Running OCR on page {{pageNum}}...', { pageNum })); const ocrModel = await recognizePageCanvas( canvas, ctx.ocrLanguage, function (status, progress) { - ctx.showLoader(`OCR: ${status}`, progress * 100); + ctx.showLoader(trText('OCR: {{status}}', { status }), progress * 100); } ); finalModel = { @@ -324,7 +326,7 @@ export async function loadComparisonPage( renderMissingPage( renderTarget.canvas, renderTarget.placeholderId, - 'No paired page for this side.' + trText('No paired page for this side.') ); } return { model: null, exists: false }; @@ -358,7 +360,7 @@ export async function loadComparisonPage( const context = canvas.getContext('2d'); if (!context) { - throw new Error('Could not create offscreen comparison canvas.'); + throw new Error(trText('Could not create offscreen comparison canvas.')); } const extractedModel = await extractPageModel(page, viewport); diff --git a/src/js/logic/compress-pdf-page.ts b/src/js/logic/compress-pdf-page.ts index 9b4111e9..77ce758f 100644 --- a/src/js/logic/compress-pdf-page.ts +++ b/src/js/logic/compress-pdf-page.ts @@ -28,34 +28,37 @@ import { verifyHyperPassword, } from '../utils/compress.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + type OptionChangeHandler = ( key: keyof HyperCompressOptions, value: number | boolean | null ) => void; -const LOCK_MESSAGES = { - locked: { - text: 'Password protected', - color: 'text-gray-400', - field: 'border-gray-600 focus:ring-indigo-500', - }, - wrong: { - text: 'Wrong password', - color: 'text-red-400', - field: 'border-red-500 focus:ring-red-500', - }, - unlocked: { - text: 'Unlocked', - color: 'text-green-400', - field: 'border-green-500 focus:ring-green-500', - }, -} as const; +const getLockMessages = () => + ({ + locked: { + text: trText('Password protected'), + color: 'text-gray-400', + field: 'border-gray-600 focus:ring-indigo-500', + }, + wrong: { + text: trText('Wrong password'), + color: 'text-red-400', + field: 'border-red-500 focus:ring-red-500', + }, + unlocked: { + text: trText('Unlocked'), + color: 'text-green-400', + field: 'border-green-500 focus:ring-green-500', + }, + }) as const; const PASSWORD_INPUT_CLASS = 'w-full bg-gray-800 border text-gray-200 placeholder:text-gray-500 rounded-lg pl-9 pr-10 py-2 text-sm focus:outline-none focus:ring-2 focus:border-transparent'; -const DPI_CHOICES = [ - { value: 0, label: 'None' }, +const getDpiChoices = () => [ + { value: 0, label: trText('None') }, { value: 72, label: '72 DPI' }, { value: 96, label: '96 DPI' }, { value: 144, label: '144 DPI' }, @@ -64,191 +67,221 @@ const DPI_CHOICES = [ { value: 300, label: '300 DPI' }, ]; -const HYPER_OPTION_SECTIONS: HyperOptionSection[] = [ +const getOptionSections = (): HyperOptionSection[] => [ { - title: 'Images', + title: trText('Images'), open: true, fields: [ { key: 'imageQuality', type: 'number', - label: 'Image quality', + label: trText('Image quality'), min: 20, max: 100, - help: 'JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.', + help: trText( + 'JPEG quality for re-encoded images, 20 to 100. Lower means smaller files and more visible artifacts.' + ), }, { key: 'maxDpi', type: 'dpi', - label: 'Maximum resolution', - help: 'Images above this are resampled down. None leaves resolution alone.', + label: trText('Maximum resolution'), + help: trText( + 'Images above this are resampled down. None leaves resolution alone.' + ), }, { key: 'forceDownsample', type: 'bool', - label: 'Always resample to that resolution', - help: 'Resamples even when an image is only slightly above the limit.', + label: trText('Always resample to that resolution'), + help: trText( + 'Resamples even when an image is only slightly above the limit.' + ), }, { key: 'grayscale', type: 'bool', - label: 'Convert to grayscale', - help: 'Reduces file size by removing color information.', + label: trText('Convert to grayscale'), + help: trText('Reduces file size by removing color information.'), }, { key: 'reduceColor', type: 'bool', - label: 'Reduce color complexity', - help: 'Only where it does not change how the image looks.', + label: trText('Reduce color complexity'), + help: trText('Only where it does not change how the image looks.'), }, { key: 'clipImages', type: 'bool', - label: 'Clip invisible parts of images', + label: trText('Clip invisible parts of images'), }, { key: 'removeAlternates', type: 'bool', - label: 'Remove alternate images', + label: trText('Remove alternate images'), }, { key: 'flattenIcc', type: 'bool', - label: 'Simplify large color profiles', + label: trText('Simplify large color profiles'), }, { key: 'preferJpx', type: 'bool', - label: 'Prefer JPEG 2000 for photos', - help: 'Tries JPEG 2000 against JPEG for each image and keeps the smaller one.', + label: trText('Prefer JPEG 2000 for photos'), + help: trText( + 'Tries JPEG 2000 against JPEG for each image and keeps the smaller one.' + ), }, { key: 'lossless', type: 'bool', - label: 'Lossless (no image re-encoding)', - help: 'Turns off quality, resolution and every other lossy image step.', + label: trText('Lossless (no image re-encoding)'), + help: trText( + 'Turns off quality, resolution and every other lossy image step.' + ), }, ], }, { - title: 'Fonts', + title: trText('Fonts'), fields: [ { key: 'subsetFonts', type: 'bool', - label: 'Subset embedded fonts', - help: 'Keeps only the characters the document uses.', + label: trText('Subset embedded fonts'), + help: trText('Keeps only the characters the document uses.'), + }, + { + key: 'mergeFonts', + type: 'bool', + label: trText('Merge duplicate fonts'), }, - { key: 'mergeFonts', type: 'bool', label: 'Merge duplicate fonts' }, { key: 'removeStandardFonts', type: 'bool', - label: 'Unembed standard fonts', - help: 'PDF readers supply the 14 standard PDF fonts themselves.', + label: trText('Unembed standard fonts'), + help: trText( + 'PDF readers supply the 14 standard PDF fonts themselves.' + ), }, { key: 'unembedAliasedFonts', type: 'bool', - label: 'Unembed standard-font look-alikes', - help: 'Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.', + label: trText('Unembed standard-font look-alikes'), + help: trText( + 'Arial, Times New Roman and Courier New map to the built-in equivalents. Only applied when safe.' + ), }, ], }, { - title: 'Content', + title: trText('Content'), fields: [ { key: 'removeAnnots', type: 'bool', - label: 'Flatten annotations', - help: 'Comments and markup become part of the page. Form fields and links keep working.', + label: trText('Flatten annotations'), + help: trText( + 'Comments and markup become part of the page. Form fields and links keep working.' + ), }, { key: 'flattenForms', type: 'bool', - label: 'Flatten form fields', - help: 'Form fields stop being fillable.', + label: trText('Flatten form fields'), + help: trText('Form fields stop being fillable.'), }, { key: 'flattenLinks', type: 'bool', - label: 'Flatten links', - help: 'Links stop being clickable.', + label: trText('Flatten links'), + help: trText('Links stop being clickable.'), }, ], }, { - title: 'Cleanup', + title: trText('Cleanup'), fields: [ { key: 'removeThumbnails', type: 'bool', - label: 'Remove page thumbnails', + label: trText('Remove page thumbnails'), }, { key: 'removeAppData', type: 'bool', - label: 'Remove application data', - help: 'Private data that editing apps store inside the PDF.', + label: trText('Remove application data'), + help: trText('Private data that editing apps store inside the PDF.'), + }, + { + key: 'removeThreads', + type: 'bool', + label: trText('Remove article threads'), }, - { key: 'removeThreads', type: 'bool', label: 'Remove article threads' }, { key: 'removeSpiderInfo', type: 'bool', - label: 'Remove web capture information', + label: trText('Remove web capture information'), }, { key: 'removeStructTree', type: 'bool', - label: 'Remove document structure tree', - help: 'Drops tagging, which screen readers rely on.', + label: trText('Remove document structure tree'), + help: trText('Drops tagging, which screen readers rely on.'), }, { key: 'removeOutputIntents', type: 'bool', - label: 'Remove output intents', + label: trText('Remove output intents'), }, ], }, { - title: 'Rasterize', + title: trText('Rasterize'), fields: [ { key: 'rasterizePages', type: 'bool', - label: 'Rasterize pages to images', - help: 'For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.', + label: trText('Rasterize pages to images'), + help: trText( + 'For image-only PDFs such as scans. Skipped when the document has selectable text, unless Override content protection is on.' + ), }, { key: 'rasterizeDpi', type: 'number', - label: 'Rasterize resolution (DPI)', + label: trText('Rasterize resolution (DPI)'), min: 36, max: 600, }, { key: 'rasterizeQuality', type: 'number', - label: 'Rasterize quality', + label: trText('Rasterize quality'), min: 1, max: 100, }, ], }, { - title: 'Output', + title: trText('Output'), fields: [ { key: 'preserveConformance', type: 'bool', - label: 'Preserve PDF/A', - help: 'Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.', + label: trText('Preserve PDF/A'), + help: trText( + 'Keeps a PDF/A file conformant. Brotli and rasterizing are skipped while this is on.' + ), }, { key: 'brotli', type: 'bool', - label: 'Brotli compression (PDF 2.0)', - help: 'Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.', + label: trText('Brotli compression (PDF 2.0)'), + help: trText( + 'Smaller files, but only readers with Brotli support can open them, such as Firefox, MuPDF 1.26+ and Ghostscript 10.06+.' + ), }, ], }, @@ -303,7 +336,7 @@ function buildOptionField( const select = document.createElement('select'); select.id = id; select.className = controlClass; - for (const choice of DPI_CHOICES) { + for (const choice of getDpiChoices()) { const option = document.createElement('option'); option.value = String(choice.value); option.textContent = choice.label; @@ -355,7 +388,7 @@ function renderHyperOptions( onChange: OptionChangeHandler ): (options: HyperCompressOptions) => void { const syncs: ((options: HyperCompressOptions) => void)[] = []; - for (const section of HYPER_OPTION_SECTIONS) { + for (const section of getOptionSections()) { const details = document.createElement('details'); details.className = 'group rounded-lg border border-gray-700'; details.open = Boolean(section.open); @@ -393,21 +426,41 @@ function describeCompressResult( if (saved > 0) { const percent = ((saved / result.originalSize) * 100).toFixed(1); parts.push( - `File size reduced from ${formatBytes(result.originalSize)} to ${formatBytes(result.compressedSize)} (Saved ${percent}%).` + trText( + 'File size reduced from {{originalSize}} to {{compressedSize}} (Saved {{percent}}%).', + { + originalSize: formatBytes(result.originalSize), + compressedSize: formatBytes(result.compressedSize), + percent, + } + ) ); } else { parts.push( - `Could not reduce file size further. Original: ${formatBytes(result.originalSize)}, New: ${formatBytes(result.compressedSize)}.` + trText( + 'Could not reduce file size further. Original: {{originalSize}}, New: {{compressedSize}}.', + { + originalSize: formatBytes(result.originalSize), + compressedSize: formatBytes(result.compressedSize), + } + ) ); } const preservingPdfa = options.preserveConformance && result.pdfa !== null; if (targetBytes !== undefined) { if (result.metTarget) { - parts.push(`It fits the ${formatBytes(targetBytes)} target.`); + parts.push( + trText('It fits the {{targetBytes}} target.', { + targetBytes: formatBytes(targetBytes), + }) + ); } else if (preservingPdfa) { parts.push( - `It is still above the ${formatBytes(targetBytes)} target because Preserve PDF/A limits how far it can be compressed.` + trText( + 'It is still above the {{targetBytes}} target because Preserve PDF/A limits how far it can be compressed.', + { targetBytes: formatBytes(targetBytes) } + ) ); } else { parts.push( @@ -418,34 +471,38 @@ function describeCompressResult( if (result.signaturesRemoved) { parts.push( - 'Its digital signatures were removed so it could be compressed. Sign it again if needed.' + trText( + 'Its digital signatures were removed so it could be compressed. Sign it again if needed.' + ) ); } if (result.pdfaOutcome === 'claim-withdrawn') { parts.push( - 'It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.' + trText( + 'It no longer claims PDF/A conformance. Turn on Preserve PDF/A under Custom Settings to keep it.' + ) ); } else if (preservingPdfa && (options.brotli || options.rasterizePages)) { - parts.push('Brotli and rasterizing were skipped to keep it PDF/A.'); + parts.push(trText('Brotli and rasterizing were skipped to keep it PDF/A.')); } if (saved <= 0) { return { - title: 'Compression Finished', + title: trText('Compression Finished'), message: parts.join(' '), type: 'warning', }; } if (result.metTarget === false) { return { - title: 'Target Not Reached', + title: trText('Target Not Reached'), message: parts.join(' '), type: 'warning', }; } return { - title: 'Compression Complete', + title: trText('Compression Complete'), message: parts.join(' '), type: 'success', }; @@ -477,11 +534,11 @@ function createPasswordField( const input = document.createElement('input'); input.type = 'password'; - input.placeholder = 'Enter password'; + input.placeholder = trText('Enter password'); input.autocomplete = 'off'; input.value = value; input.setAttribute('aria-label', label); - input.className = `${PASSWORD_INPUT_CLASS} ${LOCK_MESSAGES.locked.field}`; + input.className = `${PASSWORD_INPUT_CLASS} ${getLockMessages().locked.field}`; input.addEventListener('input', () => onInput(input.value)); const showIcon = createIcon('eye', ''); @@ -490,14 +547,14 @@ function createPasswordField( toggle.type = 'button'; toggle.className = 'absolute inset-y-0 right-0 flex items-center px-3 text-gray-400 hover:text-gray-200'; - toggle.setAttribute('aria-label', 'Show password'); + toggle.setAttribute('aria-label', trText('Show password')); toggle.append(showIcon, hideIcon); toggle.addEventListener('click', () => { const reveal = input.type === 'password'; input.type = reveal ? 'text' : 'password'; toggle.setAttribute( 'aria-label', - reveal ? 'Hide password' : 'Show password' + reveal ? trText('Hide password') : trText('Show password') ); showIcon.classList.toggle('hidden', reveal); hideIcon.classList.toggle('hidden', !reveal); @@ -517,7 +574,7 @@ function createIcon(name: string, className: string): HTMLElement { return icon; } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const compressOptions = document.getElementById('compress-options'); @@ -652,12 +709,16 @@ document.addEventListener('DOMContentLoaded', () => { (file) => fileLocks.get(file)?.status === 'unlocked' ).length; if (sharedMissed && unlocked < files.length) { - sharedView.status.textContent = - 'That password did not open any of the remaining files.'; + sharedView.status.textContent = trText( + 'That password did not open any of the remaining files.' + ); sharedView.status.className = 'text-xs mt-1 text-red-400'; return; } - sharedView.status.textContent = `Unlocked ${unlocked} of ${files.length} files.`; + sharedView.status.textContent = trText( + 'Unlocked {{unlocked}} of {{length}} files.', + { unlocked, length: files.length } + ); sharedView.status.className = `text-xs mt-1 ${unlocked === files.length ? 'text-green-400' : 'text-gray-400'}`; }; @@ -665,7 +726,7 @@ document.addEventListener('DOMContentLoaded', () => { const lock = fileLocks.get(file); const view = lockViews.get(file); if (lock && view && lock.status !== 'checking' && lock.status !== 'open') { - const { text, color, field } = LOCK_MESSAGES[lock.status]; + const { text, color, field } = getLockMessages()[lock.status]; if (view.input.value !== lock.password) view.input.value = lock.password; view.status.textContent = text; view.status.className = `truncate ${color}`; @@ -736,9 +797,9 @@ document.addEventListener('DOMContentLoaded', () => { sharedDiv.className = 'bg-gray-700 p-3 rounded-lg text-sm'; const sharedLabel = document.createElement('div'); sharedLabel.className = 'font-medium text-gray-200 text-sm'; - sharedLabel.textContent = 'Password for all locked files'; + sharedLabel.textContent = trText('Password for all locked files'); sharedView = createPasswordField( - 'Password for all locked files', + trText('Password for all locked files'), sharedPassword, applySharedPassword ); @@ -774,7 +835,7 @@ document.addEventListener('DOMContentLoaded', () => { if (locked) { const view = createPasswordField( - `Password for ${file.name}`, + trText('Password for {{name}}', { name: file.name }), lock.password, (value) => { lock.password = value; @@ -785,7 +846,9 @@ document.addEventListener('DOMContentLoaded', () => { view.root.classList.add('mt-3'); const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 whitespace-nowrap'; - sizeSpan.textContent = `${formatBytes(file.size)} ·`; + sizeSpan.textContent = trText('{{size}} ·', { + size: formatBytes(file.size), + }); metaSpan.className = 'flex gap-1 min-w-0 text-xs text-gray-400'; metaSpan.replaceChildren(sizeSpan, view.status); fileDiv.append(view.root); @@ -795,7 +858,10 @@ document.addEventListener('DOMContentLoaded', () => { removeBtn.type = 'button'; removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; - removeBtn.setAttribute('aria-label', `Remove ${file.name}`); + removeBtn.setAttribute( + 'aria-label', + trText('Remove {{name}}', { name: file.name }) + ); removeBtn.append(createIcon('trash', '')); removeBtn.onclick = () => { state.files = state.files.filter((f) => f !== file); @@ -842,7 +908,9 @@ document.addEventListener('DOMContentLoaded', () => { showLoader( targetBytes === undefined ? 'Compressing...' - : `Compressing to ${formatBytes(targetBytes)}...` + : trText('Compressing to {{size}}...', { + size: formatBytes(targetBytes), + }) ); const result = await compressWithHyper(await file.arrayBuffer(), { options: runOptions, @@ -854,7 +922,10 @@ document.addEventListener('DOMContentLoaded', () => { if (result.signed) { showAlert( 'Signed PDF Not Changed', - `${file.name} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.`, + trText( + '{{name}} is digitally signed, so it was left as it is. Compressing it would break the signature. To compress it anyway, turn on Override content protection under Custom Settings; its signatures will be removed.', + { name: file.name } + ), 'warning', () => resetState() ); @@ -873,7 +944,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( title, password - ? `${message} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.` + ? trText( + '{{message}} It was password protected, so the compressed copy has no password. Use Protect PDF to add one again.', + { message } + ) : message, type, () => resetState() @@ -901,7 +975,13 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < files.length; i++) { const file = files[i]; - showLoader(`Compressing ${i + 1}/${files.length}: ${file.name}...`); + showLoader( + trText('Compressing {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: files.length, + name: file.name, + }) + ); const lock = fileLocks.get(file); const password = isProtected(lock) ? lock.password : ''; try { @@ -931,7 +1011,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `None of the files could be compressed: ${failures.join(', ')}.` + trText('None of the files could be compressed: {{join}}.', { + join: failures.join(', '), + }) ); return; } @@ -944,8 +1026,22 @@ document.addEventListener('DOMContentLoaded', () => { const totalSavings = totalOriginalSize - totalCompressedSize; const parts = [ totalSavings > 0 - ? `Compressed ${compressedCount} PDF(s). Total size reduced from ${formatBytes(totalOriginalSize)} to ${formatBytes(totalCompressedSize)} (Saved ${((totalSavings / totalOriginalSize) * 100).toFixed(1)}%).` - : `Compressed ${compressedCount} PDF(s). Total size: ${formatBytes(totalCompressedSize)}.`, + ? trText( + 'Compressed {{compressedCount}} PDF(s). Total size reduced from {{totalOriginalSize}} to {{totalCompressedSize}} (Saved {{value}}%).', + { + compressedCount, + totalOriginalSize: formatBytes(totalOriginalSize), + totalCompressedSize: formatBytes(totalCompressedSize), + value: ((totalSavings / totalOriginalSize) * 100).toFixed(1), + } + ) + : trText( + 'Compressed {{compressedCount}} PDF(s). Total size: {{totalCompressedSize}}.', + { + compressedCount, + totalCompressedSize: formatBytes(totalCompressedSize), + } + ), ]; if (signedCount > 0) { parts.push( @@ -973,7 +1069,7 @@ document.addEventListener('DOMContentLoaded', () => { ); } if (failures.length > 0) { - parts.push(`Skipped: ${failures.join(', ')}.`); + parts.push(trText('Skipped: {{join}}.', { join: failures.join(', ') })); } const hasProblems = failures.length > 0 || missedTargetCount > 0; @@ -999,8 +1095,14 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Password Needed', needPassword.length === 1 - ? `${needPassword[0].name} is password protected. Enter its password on the file card, then compress again.` - : `These files are password protected: ${needPassword.map((file) => file.name).join(', ')}. Enter their passwords on the file cards, or remove them, then compress again.`, + ? trText( + '{{name}} is password protected. Enter its password on the file card, then compress again.', + { name: needPassword[0].name } + ) + : trText( + 'These files are password protected: {{names}}. Enter their passwords on the file cards, or remove them, then compress again.', + { names: needPassword.map((file) => file.name).join(', ') } + ), 'warning', () => lockViews.get(needPassword[0])?.input.focus() ); @@ -1032,7 +1134,10 @@ document.addEventListener('DOMContentLoaded', () => { updateUI(); showAlert( 'Password Needed', - `${file.name} is password protected. Enter its password on the file card, then compress again.`, + trText( + '{{name}} is password protected. Enter its password on the file card, then compress again.', + { name: file.name } + ), 'warning', () => lockViews.get(file)?.input.focus() ); @@ -1041,7 +1146,9 @@ document.addEventListener('DOMContentLoaded', () => { console.error('[CompressPDF] Error:', e); showAlert( 'Error', - `An error occurred during compression. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during compression. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; @@ -1061,8 +1168,13 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Not a PDF', rejected.length === 1 - ? `${rejected[0]} is not a valid PDF, so it was not added.` - : `These files are not valid PDFs, so they were not added: ${rejected.join(', ')}.`, + ? trText('{{name}} is not a valid PDF, so it was not added.', { + name: rejected[0], + }) + : trText( + 'These files are not valid PDFs, so they were not added: {{names}}.', + { names: rejected.join(', ') } + ), 'warning' ); } diff --git a/src/js/logic/crop-pdf-page.ts b/src/js/logic/crop-pdf-page.ts index b1d5b58e..1979436b 100644 --- a/src/js/logic/crop-pdf-page.ts +++ b/src/js/logic/crop-pdf-page.ts @@ -9,6 +9,8 @@ import { CropperState, CropPercentages } from '@/types'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const cropperState: CropperState = { pdfDoc: null, currentPageNum: 1, @@ -18,11 +20,7 @@ const cropperState: CropperState = { file: null, }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -124,7 +122,10 @@ function updateFileDisplay() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(cropperState.file.size)} • ${cropperState.pdfDoc?.numPages || 0} pages`; + metaSpan.textContent = trText('{{size}} • {{value}} pages', { + size: formatBytes(cropperState.file.size), + value: cropperState.pdfDoc?.numPages || 0, + }); infoContainer.append(nameSpan, metaSpan); @@ -153,7 +154,7 @@ function saveCurrentCrop() { } async function displayPageAsImage(num: number) { - showLoader(`Rendering Page ${num}...`); + showLoader(trText('Rendering Page {{num}}...', { num })); try { const page = await cropperState.pdfDoc.getPage(num); @@ -226,7 +227,10 @@ async function changePage(offset: number) { function updatePageInfo() { const pageInfo = document.getElementById('page-info'); if (pageInfo) - pageInfo.textContent = `Page ${cropperState.currentPageNum} of ${cropperState.pdfDoc.numPages}`; + pageInfo.textContent = trText('Page {{currentPageNum}} of {{numPages}}', { + currentPageNum: cropperState.currentPageNum, + numPages: cropperState.pdfDoc.numPages, + }); } function enableControls() { @@ -353,7 +357,12 @@ async function performFlatteningCrop( for (let i = 0; i < totalPages; i++) { const pageNum = i + 1; - showLoader(`Processing page ${pageNum} of ${totalPages}...`); + showLoader( + trText('Processing page {{pageNum}} of {{totalPages}}...', { + pageNum, + totalPages, + }) + ); if (cropData[pageNum]) { const page = await cropperState.pdfDoc.getPage(pageNum); diff --git a/src/js/logic/cropper.ts b/src/js/logic/cropper.ts index be55fb05..e3f76680 100644 --- a/src/js/logic/cropper.ts +++ b/src/js/logic/cropper.ts @@ -15,6 +15,8 @@ import type { CropPercentages } from '@/types'; import type { PDFDocumentProxy } from 'pdfjs-dist'; import '../utils/setup-pdf-worker.js'; +import { trText } from '../i18n/i18n.js'; + const cropperState: { pdfDoc: PDFDocumentProxy | null; currentPageNum: number; @@ -54,7 +56,7 @@ function saveCurrentCrop() { */ async function displayPageAsImage(num: number) { - showLoader(`Rendering Page ${num}...`); + showLoader(trText('Rendering Page {{num}}...', { num })); try { const page = await cropperState.pdfDoc.getPage(num); @@ -130,8 +132,13 @@ async function changePage(offset: number) { } function updatePageInfo() { - document.getElementById('page-info').textContent = - `Page ${cropperState.currentPageNum} of ${cropperState.pdfDoc.numPages}`; + document.getElementById('page-info').textContent = trText( + 'Page {{currentPageNum}} of {{numPages}}', + { + currentPageNum: cropperState.currentPageNum, + numPages: cropperState.pdfDoc.numPages, + } + ); } function enableControls() { @@ -216,7 +223,12 @@ async function performFlatteningCrop( for (let i = 0; i < totalPages; i++) { const pageNum = i + 1; - showLoader(`Processing page ${pageNum} of ${totalPages}...`); + showLoader( + trText('Processing page {{pageNum}} of {{totalPages}}...', { + pageNum, + totalPages, + }) + ); if (cropData[pageNum]) { const page = await cropperState.pdfDoc.getPage(pageNum); diff --git a/src/js/logic/csv-to-pdf-page.ts b/src/js/logic/csv-to-pdf-page.ts index fda37de4..f2479451 100644 --- a/src/js/logic/csv-to-pdf-page.ts +++ b/src/js/logic/csv-to-pdf-page.ts @@ -3,7 +3,9 @@ import { downloadFile, formatBytes } from '../utils/helpers.js'; import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; -document.addEventListener('DOMContentLoaded', () => { +import { trText, onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -123,7 +125,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -145,7 +149,11 @@ document.addEventListener('DOMContentLoaded', () => { const overallPercent = (i / state.files.length) * 100 + percent / state.files.length; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...`, + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }), overallPercent ); }, @@ -172,7 +180,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} CSV file(s) to PDF.`, + trText('Successfully converted {{length}} CSV file(s) to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -186,7 +196,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/delete-pages-page.ts b/src/js/logic/delete-pages-page.ts index 6b711ee3..654ad319 100644 --- a/src/js/logic/delete-pages-page.ts +++ b/src/js/logic/delete-pages-page.ts @@ -12,6 +12,8 @@ import { DeletePagesState } from '@/types'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const deleteState: DeletePagesState = { file: null, pdfDoc: null, @@ -20,11 +22,7 @@ const deleteState: DeletePagesState = { pagesToDelete: new Set(), }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -124,7 +122,10 @@ function updateFileDisplay() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(deleteState.file.size)} • ${deleteState.totalPages} pages`; + metaSpan.textContent = trText('{{size}} • {{totalPages}} pages', { + size: formatBytes(deleteState.file.size), + totalPages: deleteState.totalPages, + }); infoContainer.append(nameSpan, metaSpan); @@ -177,7 +178,7 @@ async function renderThumbnails() { const pageLabel = document.createElement('span'); pageLabel.className = 'absolute top-1 left-1 bg-gray-800 text-white text-xs px-1.5 py-0.5 rounded'; - pageLabel.textContent = `${i}`; + pageLabel.textContent = trText('{{i}}', { i }); const deleteOverlay = document.createElement('div'); deleteOverlay.className = @@ -273,7 +274,9 @@ async function deletePages() { hideLoader(); showAlert( 'Success', - `Deleted ${deleteState.pagesToDelete.size} page(s) successfully!`, + trText('Deleted {{size}} page(s) successfully!', { + size: deleteState.pagesToDelete.size, + }), 'success', () => resetState() ); diff --git a/src/js/logic/deskew-pdf-page.ts b/src/js/logic/deskew-pdf-page.ts index f5467770..6edabdc5 100644 --- a/src/js/logic/deskew-pdf-page.ts +++ b/src/js/logic/deskew-pdf-page.ts @@ -6,6 +6,8 @@ import { downloadFile } from '../utils/helpers'; import { isWasmAvailable } from '../config/wasm-cdn-config.js'; import { showWasmRequiredDialog } from '../utils/wasm-provider.js'; +import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; + interface DeskewResult { totalPages: number; correctedPages: number; @@ -27,7 +29,7 @@ function showLoader(message: string): void { const loader = document.getElementById('loader-modal'); const text = document.getElementById('loader-text'); if (loader && text) { - text.textContent = message; + text.textContent = trText(message); loader.classList.remove('hidden'); } } @@ -44,8 +46,8 @@ function showAlert(title: string, message: string): void { const titleEl = document.getElementById('alert-title'); const msgEl = document.getElementById('alert-message'); if (modal && titleEl && msgEl) { - titleEl.textContent = title; - msgEl.textContent = message; + titleEl.textContent = trText(title); + msgEl.textContent = trText(message); modal.classList.remove('hidden'); } } @@ -90,7 +92,9 @@ function updateFileDisplay(): void { const sizeSpan = document.createElement('span'); sizeSpan.className = 'text-gray-500 text-sm'; - sizeSpan.textContent = `(${(file.size / 1024).toFixed(1)} KB)`; + sizeSpan.textContent = trText('({{value}} KB)', { + value: (file.size / 1024).toFixed(1), + }); info.append(fileIcon, nameSpan, sizeSpan); @@ -141,9 +145,9 @@ function displayResults(result: DeskewResult): void { return `
    - Page ${idx + 1}: + ${trHtml('Page {{n}}:', { n: idx + 1 })} ${angle.toFixed(2)}° - ${wasCorrected ? '(corrected)' : ''} + ${wasCorrected ? `${trHtml('(corrected)')}` : ''}
    `; }) @@ -181,7 +185,7 @@ async function processDeskew(): Promise { await pdf.load(); for (const file of selectedFiles) { - showLoader(`Deskewing ${file.name}...`); + showLoader(trText('Deskewing {{name}}...', { name: file.name })); const { pdf: resultPdf, result } = await pdf.deskewPdf(file, { threshold, @@ -196,14 +200,22 @@ async function processDeskew(): Promise { hideLoader(); showAlert( 'Success', - `Deskewed ${selectedFiles.length} file(s). ${selectedFiles.length > 1 ? 'Downloads started for all files.' : ''}` + trText('Deskewed {{length}} file(s). {{value}}', { + length: selectedFiles.length, + value: + selectedFiles.length > 1 + ? trText('Downloads started for all files.') + : '', + }) ); } catch (error) { hideLoader(); console.error('Deskew error:', error); showAlert( 'Error', - `Failed to deskew PDF: ${error instanceof Error ? error.message : 'Unknown error'}` + trText('Failed to deskew PDF: {{error}}', { + error: error instanceof Error ? error.message : trText('Unknown error'), + }) ); } } @@ -280,4 +292,4 @@ function initPage(): void { createIcons({ icons }); } -document.addEventListener('DOMContentLoaded', initPage); +onPageReady(initPage); diff --git a/src/js/logic/digital-sign-pdf-page.ts b/src/js/logic/digital-sign-pdf-page.ts index 4826fc33..299eee02 100644 --- a/src/js/logic/digital-sign-pdf-page.ts +++ b/src/js/logic/digital-sign-pdf-page.ts @@ -7,7 +7,7 @@ import { } from '../utils/helpers.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { sanitizeTranslationHtml } from '../utils/translation-html.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { signPdf, parsePfxFile, @@ -286,7 +286,10 @@ async function updatePdfDisplay(): Promise { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(state.pdfFile.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(state.pdfFile.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -318,7 +321,12 @@ async function updatePdfDisplay(): Promise { state.pdfFile = result.file; state.pdfBytes = new Uint8Array(result.bytes); nameSpan.textContent = result.file.name; - metaSpan.textContent = `${formatBytes(result.file.size)} • ${t('tools:digitalSignPdf.pageCount', { count: result.pdf.numPages })}`; + metaSpan.textContent = trText('{{size}} • {{numPages}}', { + size: formatBytes(result.file.size), + numPages: t('tools:digitalSignPdf.pageCount', { + count: result.pdf.numPages, + }), + }); result.pdf.destroy(); } } @@ -575,7 +583,10 @@ async function handlePasswordInput(): Promise { error instanceof Error ? error.message : t('tools:digitalSignPdf.invalidPasswordOrCertificate'); - certStatus.textContent = errorMessage.includes('password') + const passwordProblem = + error instanceof Error && + (error.name === 'PasswordError' || /password/i.test(errorMessage)); + certStatus.textContent = passwordProblem ? t('tools:digitalSignPdf.incorrectPassword') : t('tools:digitalSignPdf.failedParseCertificate'); certStatus.className = 'text-xs text-red-400'; @@ -603,7 +614,10 @@ function updateCertInfo(): void { } if (certValidity) { const formatDate = (date: Date) => date.toLocaleDateString(); - certValidity.textContent = `${formatDate(info.validFrom)} - ${formatDate(info.validTo)}`; + certValidity.textContent = trText('{{validFrom}} - {{validTo}}', { + validFrom: formatDate(info.validFrom), + validTo: formatDate(info.validTo), + }); } certInfo.classList.remove('hidden'); @@ -787,8 +801,4 @@ async function processSignature(): Promise { } } -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); diff --git a/src/js/logic/digital-sign-pdf.ts b/src/js/logic/digital-sign-pdf.ts index 9fabc75a..5ee7339c 100644 --- a/src/js/logic/digital-sign-pdf.ts +++ b/src/js/logic/digital-sign-pdf.ts @@ -3,6 +3,8 @@ import forge from 'node-forge'; import { CertificateData, SignPdfOptions } from '@/types'; import { isValidTsaRequestUrl } from '../config/timestamp-tsa.js'; +import { trText } from '../i18n/i18n.js'; + export function parsePfxFile( pfxBytes: ArrayBuffer, password: string @@ -19,17 +21,17 @@ export function parsePfxFile( const keyBagArray = keyBags[forge.pki.oids.pkcs8ShroudedKeyBag]; if (!certBagArray || certBagArray.length === 0) { - throw new Error('No certificate found in PFX file'); + throw new Error(trText('No certificate found in PFX file')); } if (!keyBagArray || keyBagArray.length === 0) { - throw new Error('No private key found in PFX file'); + throw new Error(trText('No private key found in PFX file')); } const certificate = certBagArray[0].cert; if (!certificate) { - throw new Error('Failed to extract certificate from PFX file'); + throw new Error(trText('Failed to extract certificate from PFX file')); } return { p12Buffer: pfxBytes, password, certificate }; @@ -45,11 +47,17 @@ export function parsePemFiles( let privateKey: forge.pki.PrivateKey; if (keyPem.includes('ENCRYPTED')) { if (!keyPassword) { - throw new Error('Password required for encrypted private key'); + const error = new Error( + trText('Password required for encrypted private key') + ); + error.name = 'PasswordError'; + throw error; } privateKey = forge.pki.decryptRsaPrivateKey(keyPem, keyPassword); if (!privateKey) { - throw new Error('Failed to decrypt private key'); + const error = new Error(trText('Failed to decrypt private key')); + error.name = 'PasswordError'; + throw error; } } else { privateKey = forge.pki.privateKeyFromPem(keyPem); @@ -83,11 +91,11 @@ export function parseCombinedPem( ); if (!certMatch) { - throw new Error('No certificate found in PEM file'); + throw new Error(trText('No certificate found in PEM file')); } if (!keyMatch) { - throw new Error('No private key found in PEM file'); + throw new Error(trText('No private key found in PEM file')); } return parsePemFiles(certMatch[0], keyMatch[0], password); @@ -378,7 +386,9 @@ export async function timestampPdf( ): Promise { if (!isValidTsaRequestUrl(tsaUrl)) { throw new Error( - `Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.` + trText( + 'Invalid TSA URL. The timestamp authority must be a valid http:// or https:// URL.' + ) ); } @@ -436,8 +446,8 @@ export function getCertificateInfo(certificate: forge.pki.Certificate): { const issuerCN = certificate.issuer.getField('CN'); return { - subject: (subjectCN?.value as string) ?? 'Unknown', - issuer: (issuerCN?.value as string) ?? 'Unknown', + subject: (subjectCN?.value as string) ?? trText('Unknown'), + issuer: (issuerCN?.value as string) ?? trText('Unknown'), validFrom: certificate.validity.notBefore, validTo: certificate.validity.notAfter, serialNumber: certificate.serialNumber, diff --git a/src/js/logic/divide-pages-page.ts b/src/js/logic/divide-pages-page.ts index 16df79bd..da02ddea 100644 --- a/src/js/logic/divide-pages-page.ts +++ b/src/js/logic/divide-pages-page.ts @@ -10,6 +10,8 @@ import { PDFDocument as PDFLibDocument } from 'pdf-lib'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: DividePagesState = { file: null, pdfDoc: null, @@ -63,7 +65,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -92,7 +96,10 @@ async function updateUI() { pageState.totalPages = pageState.pdfDoc.getPageCount(); hideLoader(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.totalPages} pages`; + metaSpan.textContent = trText('{{size}} • {{totalPages}} pages', { + size: formatBytes(pageState.file.size), + totalPages: pageState.totalPages, + }); if (toolOptions) toolOptions.classList.remove('hidden'); } catch (error) { @@ -151,7 +158,12 @@ async function dividePages() { const originalPage = pages[i]; const { width, height } = originalPage.getSize(); - showLoader(`Processing page ${pageNum} of ${pages.length}...`); + showLoader( + trText('Processing page {{pageNum}} of {{length}}...', { + pageNum, + length: pages.length, + }) + ); if (pagesToDivide.has(pageNum)) { const [page1] = await newPdfDoc.copyPages(pageState.pdfDoc, [i]); @@ -211,7 +223,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/duplex-collate-page.ts b/src/js/logic/duplex-collate-page.ts index c4adefee..2f5a2403 100644 --- a/src/js/logic/duplex-collate-page.ts +++ b/src/js/logic/duplex-collate-page.ts @@ -3,7 +3,7 @@ import { showAlert, showLoader, hideLoader } from '../ui.js'; import { formatBytes, downloadFile } from '../utils/helpers.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; -import { t } from '../i18n/index.js'; +import { t, onPageReady } from '../i18n/index.js'; import { PDFDocument } from 'pdf-lib'; import JSZip from 'jszip'; @@ -28,11 +28,7 @@ const translate = ( return translation && translation !== key ? translation : fallback; }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); /** * Wires duplex-collate page event handlers and initial UI behavior. diff --git a/src/js/logic/duplicate-organize.ts b/src/js/logic/duplicate-organize.ts index be57fb51..4fa63449 100644 --- a/src/js/logic/duplicate-organize.ts +++ b/src/js/logic/duplicate-organize.ts @@ -12,6 +12,8 @@ import { PDFDocument as PDFLibDocument } from 'pdf-lib'; import * as pdfjsLib from 'pdfjs-dist'; import '../utils/setup-pdf-worker.js'; +import { trText } from '../i18n/i18n.js'; + const duplicateOrganizeState: { sortableInstances: { pageGrid?: Sortable }; } = { @@ -133,7 +135,7 @@ export async function renderDuplicateOrganizeThumbnails() { const duplicateBtn = document.createElement('button'); duplicateBtn.className = 'duplicate-btn bg-green-600 hover:bg-green-700 text-white rounded-full w-8 h-8 flex items-center justify-center'; - duplicateBtn.title = 'Duplicate Page'; + duplicateBtn.title = trText('Duplicate Page'); const duplicateIcon = document.createElement('i'); duplicateIcon.setAttribute('data-lucide', 'copy-plus'); duplicateIcon.className = 'w-5 h-5'; @@ -142,7 +144,7 @@ export async function renderDuplicateOrganizeThumbnails() { const deleteBtn = document.createElement('button'); deleteBtn.className = 'delete-btn bg-red-600 hover:bg-red-700 text-white rounded-full w-8 h-8 flex items-center justify-center'; - deleteBtn.title = 'Delete Page'; + deleteBtn.title = trText('Delete Page'); const deleteIcon = document.createElement('i'); deleteIcon.setAttribute('data-lucide', 'x-circle'); deleteIcon.className = 'w-5 h-5'; @@ -163,7 +165,12 @@ export async function renderDuplicateOrganizeThumbnails() { useLazyLoading: true, lazyLoadMargin: '400px', onProgress: (current, total) => { - showLoader(`Rendering page previews: ${current}/${total}`); + showLoader( + trText('Rendering page previews: {{current}}/{{total}}', { + current, + total, + }) + ); }, onBatchComplete: () => { createIcons({ icons }); diff --git a/src/js/logic/edit-attachments-page.ts b/src/js/logic/edit-attachments-page.ts index 1d56deef..9a5a6322 100644 --- a/src/js/logic/edit-attachments-page.ts +++ b/src/js/logic/edit-attachments-page.ts @@ -9,6 +9,8 @@ import { } from '../utils/wasm-provider.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const worker = new Worker( import.meta.env.BASE_URL + 'workers/edit-attachments.worker.js' ); @@ -96,7 +98,7 @@ function displayAttachments(attachments: AttachmentInfo[]) { if (attachments.length === 0) { const noAttachments = document.createElement('p'); noAttachments.className = 'text-gray-400 text-center py-4'; - noAttachments.textContent = 'No attachments found in this PDF.'; + noAttachments.textContent = trText('No attachments found in this PDF.'); attachmentsList.appendChild(noAttachments); return; } @@ -108,7 +110,7 @@ function displayAttachments(attachments: AttachmentInfo[]) { const removeAllBtn = document.createElement('button'); removeAllBtn.className = 'bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded text-sm'; - removeAllBtn.textContent = 'Remove All Attachments'; + removeAllBtn.textContent = trText('Remove All Attachments'); removeAllBtn.onclick = function () { if (pageState.allAttachments.length === 0) return; @@ -131,7 +133,7 @@ function displayAttachments(attachments: AttachmentInfo[]) { } } }); - removeAllBtn.textContent = 'Remove All Attachments'; + removeAllBtn.textContent = trText('Remove All Attachments'); } else { pageState.allAttachments.forEach(function (attachment) { pageState.attachmentsToRemove.add(attachment.index); @@ -147,7 +149,7 @@ function displayAttachments(attachments: AttachmentInfo[]) { } } }); - removeAllBtn.textContent = 'Deselect All'; + removeAllBtn.textContent = trText('Deselect All'); } }; @@ -171,9 +173,11 @@ function displayAttachments(attachments: AttachmentInfo[]) { const levelSpan = document.createElement('span'); levelSpan.className = 'text-gray-400 text-sm block'; if (attachment.page === 0) { - levelSpan.textContent = 'Document-level attachment'; + levelSpan.textContent = trText('Document-level attachment'); } else { - levelSpan.textContent = `Page ${attachment.page} attachment`; + levelSpan.textContent = trText('Page {{page}} attachment', { + page: attachment.page, + }); } infoDiv.append(nameSpan, levelSpan); @@ -184,7 +188,7 @@ function displayAttachments(attachments: AttachmentInfo[]) { const removeBtn = document.createElement('button'); removeBtn.className = `${pageState.attachmentsToRemove.has(attachment.index) ? 'bg-gray-600' : 'bg-red-600'} hover:bg-red-700 text-white px-3 py-1 rounded text-sm`; removeBtn.innerHTML = ''; - removeBtn.title = 'Remove attachment'; + removeBtn.title = trText('Remove attachment'); removeBtn.onclick = function () { if (pageState.attachmentsToRemove.has(attachment.index)) { pageState.attachmentsToRemove.delete(attachment.index); @@ -202,8 +206,8 @@ function displayAttachments(attachments: AttachmentInfo[]) { return pageState.attachmentsToRemove.has(att.index); }); removeAllBtn.textContent = allSelected - ? 'Deselect All' - : 'Remove All Attachments'; + ? trText('Deselect All') + : trText('Remove All Attachments'); }; actionsDiv.append(removeBtn); @@ -346,7 +350,7 @@ async function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/edit-metadata-page.ts b/src/js/logic/edit-metadata-page.ts index 775eade0..5ebc5531 100644 --- a/src/js/logic/edit-metadata-page.ts +++ b/src/js/logic/edit-metadata-page.ts @@ -6,6 +6,8 @@ import { PDFName, PDFString } from 'pdf-lib'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: EditMetadataState = { file: null, pdfDoc: null, @@ -70,14 +72,14 @@ function addCustomFieldRow(key: string = '', value: string = '') { const keyInput = document.createElement('input'); keyInput.type = 'text'; - keyInput.placeholder = 'Key (e.g., Department)'; + keyInput.placeholder = trText('Key (e.g., Department)'); keyInput.value = key; keyInput.className = 'custom-meta-key w-full bg-gray-700 border border-gray-600 text-white text-sm rounded-lg focus:ring-indigo-500 focus:border-indigo-500 p-2.5'; const valueInput = document.createElement('input'); valueInput.type = 'text'; - valueInput.placeholder = 'Value (e.g., Marketing)'; + valueInput.placeholder = trText('Value (e.g., Marketing)'); valueInput.value = value; valueInput.className = 'custom-meta-value w-full bg-gray-700 border border-gray-600 text-white text-sm rounded-lg focus:ring-indigo-500 focus:border-indigo-500 p-2.5'; @@ -205,7 +207,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -233,7 +237,10 @@ async function updateUI() { hideLoader(); const pageCount = pageState.pdfDoc.getPageCount(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); populateMetadataFields(); @@ -388,7 +395,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/edit-pdf-page.ts b/src/js/logic/edit-pdf-page.ts index 23438da6..66a26d4d 100644 --- a/src/js/logic/edit-pdf-page.ts +++ b/src/js/logic/edit-pdf-page.ts @@ -24,6 +24,8 @@ import type { RedactionPluginLite, } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const FREETEXT_SUBTYPE = 3; export function trackAppliedRedactions( @@ -139,7 +141,7 @@ function confirmChoice( cancelBtn.type = 'button'; cancelBtn.className = 'flex-1 bg-gray-700 hover:bg-gray-600 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200'; - cancelBtn.textContent = 'Cancel'; + cancelBtn.textContent = trText('Cancel'); const confirmBtn = document.createElement('button'); confirmBtn.type = 'button'; @@ -241,11 +243,7 @@ function removeFileEntry(documentId: string) { } } -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -417,7 +415,7 @@ async function handleFiles(files: FileList) { downloadBtn = document.createElement('button'); downloadBtn.id = 'download-edited-pdf'; downloadBtn.className = 'btn-gradient w-full mt-6'; - downloadBtn.textContent = 'Download Edited PDF'; + downloadBtn.textContent = trText('Download Edited PDF'); pdfWrapper.appendChild(downloadBtn); } downloadBtn.classList.remove('hidden'); @@ -427,14 +425,17 @@ async function handleFiles(files: FileList) { const documentId = activeDocuments.getActiveDocumentId(); const pendingCount = redactionPlugin?.getState().pendingCount ?? 0; if (redactionPlugin && pendingCount > 0) { - const marks = - pendingCount === 1 - ? "1 redaction mark that hasn't" - : `${pendingCount} redaction marks that haven't`; const shouldApply = await confirmChoice( - 'Apply redactions?', - `This document has ${marks} been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?`, - 'Apply and download' + trText('Apply redactions?'), + pendingCount === 1 + ? trText( + "This document has 1 redaction mark that hasn't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?" + ) + : trText( + "This document has {{count}} redaction marks that haven't been applied. Until a mark is applied, the content under it is still in the file. Apply all marks and download?", + { count: pendingCount } + ), + trText('Apply and download') ); if (!shouldApply) return; try { @@ -505,9 +506,11 @@ async function handleFiles(files: FileList) { }); if (exported.isEncrypted) { const shouldDownload = await confirmChoice( - 'Encrypted file', - "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?", - 'Download anyway' + trText('Encrypted file'), + trText( + "Your redactions are applied to the pages, but this file is encrypted, so BentoPDF can't also remove copies of the redacted text from its properties, bookmarks, and attachments. For a full cleanup, redact an unencrypted copy and add a password afterwards with Protect PDF. Download anyway?" + ), + trText('Download anyway') ); if (!shouldDownload) return; } else { diff --git a/src/js/logic/edit-pdf-text-dock.ts b/src/js/logic/edit-pdf-text-dock.ts index f2a05b40..d80065b8 100644 --- a/src/js/logic/edit-pdf-text-dock.ts +++ b/src/js/logic/edit-pdf-text-dock.ts @@ -1,30 +1,35 @@ +import { trText } from '../i18n/i18n.js'; type SectionSpec = { id: string; title: string; icon: string }; type RangeLink = { range: HTMLInputElement; num: HTMLInputElement }; -const TEXT_SECTIONS: SectionSpec[] = [ - { id: 'font', title: 'Font', icon: 'ph-text-aa' }, - { id: 'size', title: 'Font Size', icon: 'ph-text-t' }, - { id: 'color', title: 'Text Color', icon: 'ph-palette' }, - { id: 'align', title: 'Alignment', icon: 'ph-text-align-left' }, - { id: 'spacing', title: 'Spacing', icon: 'ph-arrows-out-line-vertical' }, - { id: 'lists', title: 'Lists', icon: 'ph-list-bullets' }, - { id: 'more', title: 'More', icon: 'ph-dots-three' }, +const getTextSections = (): SectionSpec[] => [ + { id: 'font', title: trText('Font'), icon: 'ph-text-aa' }, + { id: 'size', title: trText('Font Size'), icon: 'ph-text-t' }, + { id: 'color', title: trText('Text Color'), icon: 'ph-palette' }, + { id: 'align', title: trText('Alignment'), icon: 'ph-text-align-left' }, + { + id: 'spacing', + title: trText('Spacing'), + icon: 'ph-arrows-out-line-vertical', + }, + { id: 'lists', title: trText('Lists'), icon: 'ph-list-bullets' }, + { id: 'more', title: trText('More'), icon: 'ph-dots-three' }, ]; -const SCOPE_SECTION: SectionSpec = { +const getScopeSection = (): SectionSpec => ({ id: 'scope', - title: 'Edit Scope', + title: trText('Edit Scope'), icon: 'ph-pencil-simple', -}; -const STROKE_SECTION: SectionSpec = { +}); +const getStrokeSection = (): SectionSpec => ({ id: 'stroke', - title: 'Path Stroke', + title: trText('Path Stroke'), icon: 'ph-path', -}; -const MULTI_SECTION: SectionSpec = { +}); +const getMultiSection = (): SectionSpec => ({ id: 'alignMulti', - title: 'Align Objects', + title: trText('Align Objects'), icon: 'ph-align-left', -}; +}); const OBJ_BTN_IDS = [ 'rotL', @@ -39,16 +44,16 @@ const OBJ_BTN_IDS = [ 'dupe', ]; -const SLIDER_FIELDS: [string, string][] = [ - ['fLine', 'Line'], - ['fPara', 'Paragraph'], - ['fChar', 'Character'], - ['fWordSp', 'Word'], +const getSliderFields = (): [string, string][] => [ + ['fLine', trText('Line')], + ['fPara', trText('Paragraph')], + ['fChar', trText('Character')], + ['fWordSp', trText('Word')], ]; -const MORE_FIELDS: [string, string][] = [ - ['fHScale', 'H-Scale %'], - ['fFirstInd', 'First Indent'], - ['fHangInd', 'Hanging Indent'], +const getMoreFields = (): [string, string][] => [ + ['fHScale', trText('H-Scale %')], + ['fFirstInd', trText('First Indent')], + ['fHangInd', trText('Hanging Indent')], ]; const q = (id: string): HTMLElement | null => document.getElementById(id); @@ -95,7 +100,7 @@ function setupPagePill(): void { const pageLabel = q('pageLabel'); const app = q('text-editor-app'); if (!save || !pageLabel || !app || !save.parentElement) return; - const pill = mkBtn('dpagepill', 'Go to page'); + const pill = mkBtn('dpagepill', trText('Go to page')); pill.textContent = '– / –'; save.parentElement.insertBefore(pill, save); const syncPill = () => { @@ -130,10 +135,10 @@ function setupPagePill(): void { menu.style.right = '8px'; menu.addEventListener('click', (e) => e.stopPropagation()); const nav = div('dpagenav'); - const prevB = mkBtn('dnavbtn', 'Previous page'); + const prevB = mkBtn('dnavbtn', trText('Previous page')); prevB.appendChild(ph('ph-caret-left')); prevB.addEventListener('click', () => q('prev')?.click()); - const nextB = mkBtn('dnavbtn', 'Next page'); + const nextB = mkBtn('dnavbtn', trText('Next page')); nextB.appendChild(ph('ph-caret-right')); nextB.addEventListener('click', () => q('next')?.click()); const inp = document.createElement('input'); @@ -141,7 +146,7 @@ function setupPagePill(): void { inp.min = '1'; inp.step = '1'; inp.className = 'dpageinp'; - inp.setAttribute('aria-label', 'Page number'); + inp.setAttribute('aria-label', trText('Page number')); const st = parse(); if (Number.isFinite(st.current)) inp.value = String(st.current); if (Number.isFinite(st.total)) inp.max = String(st.total); @@ -165,15 +170,15 @@ function setupPagePill(): void { e.preventDefault(); go(); }); - const goBtn = mkBtn('dnavbtn dgo', 'Go to page'); - goBtn.textContent = 'Go'; + const goBtn = mkBtn('dnavbtn dgo', trText('Go to page')); + goBtn.textContent = trText('Go'); goBtn.addEventListener('click', go); nav.append(prevB, inp, goBtn, nextB); menu.appendChild(nav); menu.appendChild(document.createElement('hr')); - const props = mkBtn('ecmenu-item', 'Document properties'); + const props = mkBtn('ecmenu-item', trText('Document properties')); const propLabel = document.createElement('span'); - propLabel.textContent = 'Document properties'; + propLabel.textContent = trText('Document properties'); props.append(ph('ph-info'), propLabel); props.addEventListener('click', () => { closeMenu(); @@ -221,7 +226,7 @@ export function setupFormatDock(): void { const dticon = document.createElement('span'); const dtext = document.createElement('span'); dtitle.append(dticon, dtext); - const dclose = mkBtn('dclose', 'Close panel'); + const dclose = mkBtn('dclose', trText('Close panel')); dclose.appendChild(ph('ph-x')); head.append(dtitle, dclose); const slotsWrap = div('dockslots'); @@ -232,7 +237,7 @@ export function setupFormatDock(): void { const rail = div('dockrail'); const chipsWrap = div('dockchips'); const acts = div('dockacts'); - const delChip = mkBtn('dchip ddel', 'Delete'); + const delChip = mkBtn('dchip ddel', trText('Delete')); delChip.appendChild(ph('ph-trash')); delChip.addEventListener('click', () => q('del')?.click()); acts.appendChild(delChip); @@ -296,8 +301,8 @@ export function setupFormatDock(): void { }); return b; }; - const minus = step(-1, 'ph-minus', 'Decrease size'); - const plus = step(1, 'ph-plus', 'Increase size'); + const minus = step(-1, 'ph-minus', trText('Decrease size')); + const plus = step(1, 'ph-plus', trText('Increase size')); const host = stepperOf(fSize) ?? fSize; sizer.append(minus, host, plus); sizeSlot.appendChild(sizer); @@ -311,13 +316,13 @@ export function setupFormatDock(): void { const alignRow = rowOf(q('fAlign')); if (alignRow) alignSlot.appendChild(alignRow); const dirLab = div('dlab dsublab'); - dirLab.textContent = 'Direction'; + dirLab.textContent = trText('Direction'); alignSlot.appendChild(dirLab); const dirRow = rowOf(q('fDir')); if (dirRow) alignSlot.appendChild(dirRow); const spacingSlot = mkSlot('spacing'); - for (const [id, label] of SLIDER_FIELDS) { + for (const [id, label] of getSliderFields()) { const row = sliderRow(id, label); if (row) spacingSlot.appendChild(row); } @@ -328,11 +333,11 @@ export function setupFormatDock(): void { const moreSlot = mkSlot('more'); const outLab = div('dlab dsublab'); - outLab.textContent = 'Outline'; + outLab.textContent = trText('Outline'); moreSlot.appendChild(outLab); const outlineRow = rowOf(q('fStrokeColor')); if (outlineRow) moreSlot.appendChild(outlineRow); - for (const [id, label] of MORE_FIELDS) { + for (const [id, label] of getMoreFields()) { const row = sliderRow(id, label); if (row) moreSlot.appendChild(row); } @@ -348,10 +353,10 @@ export function setupFormatDock(): void { scopeSlot.appendChild(scopeWrap); let picked = new Set(['all']); const scopeDefs: [string, string][] = [ - ['all', 'All'], - ['text', 'Text'], - ['image', 'Images'], - ['shape', 'Shapes'], + ['all', trText('All')], + ['text', trText('Text')], + ['image', trText('Images')], + ['shape', trText('Shapes')], ]; const renderScope = () => { scopeWrap.replaceChildren(); @@ -459,7 +464,10 @@ export function setupFormatDock(): void { const grab = div('dgrab'); grab.appendChild(document.createElement('span')); const shead = div('dsheethead'); - shead.append(ph('ph-text-aa'), document.createTextNode(' Select Font')); + shead.append( + ph('ph-text-aa'), + document.createTextNode(` ${trText('Select Font')}`) + ); const fontListEl = div('dfontlist'); sheet.append(grab, shead, fontListEl); inspector.append(dim, sheet); @@ -488,9 +496,9 @@ export function setupFormatDock(): void { } if ('queryLocalFonts' in window) { fontListEl.appendChild(div('ddivider')); - const sys = mkBtn('dfrow dfsys', 'Load system fonts'); + const sys = mkBtn('dfrow dfsys', trText('Load system fonts')); const label = document.createElement('span'); - label.textContent = 'Load system fonts…'; + label.textContent = trText('Load system fonts…'); sys.appendChild(label); sys.addEventListener('click', () => q('sysFonts')?.click()); fontListEl.appendChild(sys); @@ -572,7 +580,7 @@ export function setupFormatDock(): void { }; const proxyChip = (src: HTMLButtonElement): HTMLButtonElement => { - const b = mkBtn('dchip', src.title || 'Action'); + const b = mkBtn('dchip', src.title || trText('Action')); b.dataset.proxy = src.id; const icon = src.querySelector('i'); b.appendChild( @@ -599,7 +607,7 @@ export function setupFormatDock(): void { const togglesRow = q('fToggles'); const toggleChip = (src: HTMLButtonElement): HTMLButtonElement => { - const b = mkBtn('dchip', src.title || 'Toggle style'); + const b = mkBtn('dchip', src.title || trText('Toggle style')); b.dataset.tog = src.dataset.t ?? ''; const icon = src.querySelector('i'); b.appendChild( @@ -614,7 +622,7 @@ export function setupFormatDock(): void { chipsWrap.replaceChildren(); if (mode !== 'idle') { chipsWrap.appendChild( - toolChip('done', 'ph-check', 'Done — back to tools', () => { + toolChip('done', 'ph-check', trText('Done: back to tools'), () => { closePanel(); closeSheet(); editBtn.click(); @@ -622,7 +630,7 @@ export function setupFormatDock(): void { ); } if (mode === 'text') { - for (const s of TEXT_SECTIONS) { + for (const s of getTextSections()) { chipsWrap.appendChild(secChip(s)); if (s.id === 'color' && togglesRow) { for (const t of togglesRow.children) { @@ -633,8 +641,8 @@ export function setupFormatDock(): void { } } else if (mode === 'idle') { chipsWrap.appendChild( - toolChip('edit', 'ph-pencil-simple', 'Edit tool', () => { - if (editBtn.classList.contains('on')) openSec(SCOPE_SECTION); + toolChip('edit', 'ph-pencil-simple', trText('Edit tool'), () => { + if (editBtn.classList.contains('on')) openSec(getScopeSection()); else { closePanel(); applyScope(); @@ -642,7 +650,7 @@ export function setupFormatDock(): void { }) ); chipsWrap.appendChild( - toolChip('addText', 'ph-textbox', 'Add a text box', () => { + toolChip('addText', 'ph-textbox', trText('Add a text box'), () => { closePanel(); document .querySelector('[data-tool="addText"]') @@ -650,20 +658,25 @@ export function setupFormatDock(): void { }) ); chipsWrap.appendChild( - toolChip('addImage', 'ph-image', 'Add an image', () => { + toolChip('addImage', 'ph-image', trText('Add an image'), () => { closePanel(); q('addImage')?.click(); }) ); chipsWrap.appendChild( - toolChip('find', 'ph-magnifying-glass', 'Find & replace', () => { - closePanel(); - q('find')?.click(); - }) + toolChip( + 'find', + 'ph-magnifying-glass', + trText('Find & replace'), + () => { + closePanel(); + q('find')?.click(); + } + ) ); } - if (!alignTools.hidden) chipsWrap.appendChild(secChip(MULTI_SECTION)); - if (!pStrokeRow.hidden) chipsWrap.appendChild(secChip(STROKE_SECTION)); + if (!alignTools.hidden) chipsWrap.appendChild(secChip(getMultiSection())); + if (!pStrokeRow.hidden) chipsWrap.appendChild(secChip(getStrokeSection())); for (const b of visibleObjBtns()) chipsWrap.appendChild(proxyChip(b)); const delBtn = q('del'); acts.hidden = !(delBtn instanceof HTMLButtonElement) || delBtn.hidden; diff --git a/src/js/logic/edit-pdf-text-page.ts b/src/js/logic/edit-pdf-text-page.ts index 70cca668..7b5fcb7e 100644 --- a/src/js/logic/edit-pdf-text-page.ts +++ b/src/js/logic/edit-pdf-text-page.ts @@ -1,7 +1,7 @@ import '@phosphor-icons/web/regular'; import { createIcons, icons } from 'lucide'; import { showAlert, showLoader, hideLoader } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { fallbackFontLanguages, @@ -64,10 +64,10 @@ function menuItem( return item; } -const SCOPES: [string, string, string][] = [ - ['text', 'Edit Text', 'ph-text-t'], - ['image', 'Edit Images', 'ph-image'], - ['shape', 'Edit Shapes', 'ph-shapes'], +const getScopes = (): [string, string, string][] => [ + ['text', trText('Edit Text'), 'ph-text-t'], + ['image', trText('Edit Images'), 'ph-image'], + ['shape', trText('Edit Shapes'), 'ph-shapes'], ]; function setupEditMenu() { @@ -89,12 +89,19 @@ function setupEditMenu() { } scopeSel.value = value; scopeSel.dispatchEvent(new Event('change')); + const names: Record = { + text: trText('Text'), + image: trText('Images'), + shape: trText('Shapes'), + }; label.textContent = picked.has('all') - ? 'Edit All' - : 'Edit ' + - SCOPES.filter(([k]) => picked.has(k)) - .map(([, l]) => l.replace('Edit ', '')) - .join(' + '); + ? trText('Edit All') + : trText('Edit {{scopes}}', { + scopes: getScopes() + .filter(([k]) => picked.has(k)) + .map(([k]) => names[k]) + .join(' + '), + }); }; let open: HTMLDivElement | null = null; const caret = editBtn.querySelector('.editcaret'); @@ -121,7 +128,7 @@ function setupEditMenu() { menu.replaceChildren(); menu.appendChild( menuItem( - 'Edit All', + trText('Edit All'), picked.has('all'), () => { picked = new Set(['all']); @@ -131,7 +138,7 @@ function setupEditMenu() { 'ph-selection-all' ) ); - for (const [key, lbl, glyph] of SCOPES) { + for (const [key, lbl, glyph] of getScopes()) { menu.appendChild( menuItem( lbl, @@ -140,7 +147,7 @@ function setupEditMenu() { if (picked.has('all')) picked.clear(); if (picked.has(key)) picked.delete(key); else picked.add(key); - if (picked.size === 0 || picked.size === SCOPES.length) + if (picked.size === 0 || picked.size === getScopes().length) picked = new Set(['all']); apply(); rebuild(); @@ -232,7 +239,7 @@ function setupZoomMenu() { inp.type = 'number'; inp.min = '20'; inp.max = '600'; - inp.placeholder = 'Custom Zoom'; + inp.placeholder = trText('Custom Zoom'); const pctSpan = document.createElement('span'); pctSpan.textContent = '%'; form.append(inp, pctSpan); @@ -299,7 +306,7 @@ function relocateAddText() { icon.className = 'ph ph-text-t'; addTextBtn.appendChild(icon); addTextBtn.classList.add('btn', 'icon'); - addTextBtn.title = 'Add a text box'; + addTextBtn.title = trText('Add a text box'); findBtn.parentElement.insertBefore(addTextBtn, findBtn); const sync = () => addTextBtn.classList.toggle('on', !editBtn.classList.contains('on')); @@ -335,10 +342,10 @@ function setupDocPanel() { const head = document.createElement('div'); head.className = 'docmodal-head'; const title = document.createElement('span'); - title.textContent = 'Document Properties'; + title.textContent = trText('Document Properties'); const x = document.createElement('button'); x.className = 'btn icon'; - x.title = 'Close'; + x.title = trText('Close'); const xi = document.createElement('i'); xi.className = 'ph ph-x'; x.appendChild(xi); @@ -349,38 +356,44 @@ function setupDocPanel() { const inch = (pt: number) => (pt / 72).toFixed(2); const groups: [string, [string, string][]][] = [ [ - 'Description', + trText('Description'), [ - ['File', desc.meta.name], - ['Title', f.Title || '—'], - ['Author', f.Author || '—'], - ['Subject', f.Subject || '—'], - ['Keywords', f.Keywords || '—'], - ['Created', f.CreationDate ? formatPdfDate(f.CreationDate) : '—'], - ['Modified', f.ModDate ? formatPdfDate(f.ModDate) : '—'], - ['Application', f.Creator || '—'], + [trText('File'), desc.meta.name], + [trText('Title'), f.Title || '—'], + [trText('Author'), f.Author || '—'], + [trText('Subject'), f.Subject || '—'], + [trText('Keywords'), f.Keywords || '—'], + [ + trText('Created'), + f.CreationDate ? formatPdfDate(f.CreationDate) : '—', + ], + [trText('Modified'), f.ModDate ? formatPdfDate(f.ModDate) : '—'], + [trText('Application'), f.Creator || '—'], ], ], [ - 'Advanced', + trText('Advanced'), [ - ['PDF Producer', f.Producer || '—'], - ['File Size', `${(desc.meta.size / 1024).toFixed(0)} KB`], + [trText('PDF Producer'), f.Producer || '—'], + [trText('File Size'), `${(desc.meta.size / 1024).toFixed(0)} KB`], [ - 'Page Size', + trText('Page Size'), desc.pageSize ? `${inch(desc.pageSize.w)} × ${inch(desc.pageSize.h)} in` : '—', ], - ['Number of Pages', desc.info?.pages ? String(desc.info.pages) : '—'], + [ + trText('Number of Pages'), + desc.info?.pages ? String(desc.info.pages) : '—', + ], ...(desc.info?.signatures - ? ([['Signatures', String(desc.info.signatures)]] as [ + ? ([[trText('Signatures'), String(desc.info.signatures)]] as [ string, string, ][]) : []), ...(desc.pdfa - ? ([['Conformance', 'PDF/A']] as [string, string][]) + ? ([[trText('Conformance'), 'PDF/A']] as [string, string][]) : []), ], ], @@ -819,7 +832,7 @@ function initializePage() { if (document.activeElement !== pageInput) pageInput.value = String(current); pageInput.max = String(total); - pageTotal.textContent = `/ ${total}`; + pageTotal.textContent = trText('/ {{total}}', { total }); }; new MutationObserver(sync).observe(pageLabel, { childList: true, @@ -1045,8 +1058,4 @@ function initializePage() { }); } -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); diff --git a/src/js/logic/email-to-pdf-page.ts b/src/js/logic/email-to-pdf-page.ts index 4992c3bb..985b5726 100644 --- a/src/js/logic/email-to-pdf-page.ts +++ b/src/js/logic/email-to-pdf-page.ts @@ -5,10 +5,12 @@ import { createIcons, icons } from 'lucide'; import { parseEmailFile, renderEmailToHtml } from './email-to-pdf.js'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const EXTENSIONS = ['.eml', '.msg']; const TOOL_NAME = 'Email'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -87,7 +89,10 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${TOOL_NAME} file (.eml or .msg).` + trText( + 'Please select at least one {{TOOL_NAME}} file (.eml or .msg).', + { TOOL_NAME } + ) ); return; } @@ -112,7 +117,7 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const originalFile = state.files[0]; - showLoader(`Parsing ${originalFile.name}...`); + showLoader(trText('Parsing {{name}}...', { name: originalFile.name })); const email = await parseEmailFile(originalFile); @@ -144,7 +149,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -156,7 +163,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); try { @@ -197,7 +208,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`, + trText( + 'Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.', + { length: state.files.length, TOOL_NAME } + ), 'success', () => resetState() ); @@ -207,7 +221,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/email-to-pdf.ts b/src/js/logic/email-to-pdf.ts index bc812019..0831091a 100644 --- a/src/js/logic/email-to-pdf.ts +++ b/src/js/logic/email-to-pdf.ts @@ -9,6 +9,8 @@ import { } from '../utils/helpers.js'; import type { EmailAttachment, ParsedEmail, EmailRenderOptions } from '@/types'; +import { trText } from '../i18n/i18n.js'; + type MsgReaderCtor = typeof MsgReaderDefault; const MsgReader: MsgReaderCtor = (MsgReaderDefault as unknown as { default?: MsgReaderCtor }).default ?? @@ -333,6 +335,6 @@ export async function parseEmailFile(file: File): Promise { } else if (ext === 'msg') { return parseMsgFile(file); } else { - throw new Error(`Unsupported file type: .${ext}`); + throw new Error(trText('Unsupported file type: .{{ext}}', { ext })); } } diff --git a/src/js/logic/epub-to-pdf-page.ts b/src/js/logic/epub-to-pdf-page.ts index 8a180766..66029262 100644 --- a/src/js/logic/epub-to-pdf-page.ts +++ b/src/js/logic/epub-to-pdf-page.ts @@ -4,11 +4,13 @@ import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const FILETYPE = 'epub'; const EXTENSIONS = ['.epub']; const TOOL_NAME = 'EPUB'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -87,7 +89,12 @@ document.addEventListener('DOMContentLoaded', () => { const convertToPdf = async () => { try { if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${TOOL_NAME} file.`); + showAlert( + 'No Files', + trText('Please select at least one {{TOOL_NAME}} file.', { + TOOL_NAME, + }) + ); return; } @@ -96,7 +103,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const originalFile = state.files[0]; - showLoader(`Converting ${originalFile.name}...`); + showLoader( + trText('Converting {{name}}...', { name: originalFile.name }) + ); const pdfBlob = await pymupdf.convertToPdf(originalFile, { filetype: FILETYPE, @@ -108,7 +117,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -120,7 +131,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await pymupdf.convertToPdf(file, { @@ -138,7 +153,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`, + trText( + 'Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.', + { length: state.files.length, TOOL_NAME } + ), 'success', () => resetState() ); @@ -148,7 +166,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/excel-to-pdf-page.ts b/src/js/logic/excel-to-pdf-page.ts index 3bb3c278..de8c14d3 100644 --- a/src/js/logic/excel-to-pdf-page.ts +++ b/src/js/logic/excel-to-pdf-page.ts @@ -7,7 +7,9 @@ import { type LoadProgress, } from '../utils/libreoffice-loader.js'; -document.addEventListener('DOMContentLoaded', () => { +import { trText, onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -114,7 +116,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -126,7 +130,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -144,7 +152,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} Excel file(s) to PDF.`, + trText('Successfully converted {{length}} Excel file(s) to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -153,7 +163,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/extract-attachments-page.ts b/src/js/logic/extract-attachments-page.ts index 87e72734..c71aafb5 100644 --- a/src/js/logic/extract-attachments-page.ts +++ b/src/js/logic/extract-attachments-page.ts @@ -9,6 +9,8 @@ import { } from '../utils/wasm-provider.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const worker = new Worker( import.meta.env.BASE_URL + 'workers/extract-attachments.worker.js' ); @@ -114,18 +116,24 @@ worker.onmessage = function (e) { showAlert( 'Success', - `${attachments.length} attachment(s) extracted successfully!` + trText('{{length}} attachment(s) extracted successfully!', { + length: attachments.length, + }) ); showStatus( - `Extraction completed! ${attachments.length} attachment(s) in zip file (${formatBytes(totalSize)}). Download started.`, + trText( + 'Extraction completed! {{length}} attachment(s) in zip file ({{totalSize}}). Download started.', + { length: attachments.length, totalSize: formatBytes(totalSize) } + ), 'success' ); resetState(); }); } else if (e.data.status === 'error') { - const errorMessage = e.data.message || 'Unknown error occurred in worker.'; + const errorMessage = + e.data.message || trText('Unknown error occurred in worker.'); console.error('Worker Error:', errorMessage); if (errorMessage.includes('No attachments were found')) { @@ -142,7 +150,10 @@ worker.onmessage = function (e) { worker.onerror = function (error) { console.error('Worker error:', error); - showStatus('Worker error occurred. Check console for details.', 'error'); + showStatus( + trText('Worker error occurred. Check console for details.'), + 'error' + ); const processBtn = document.getElementById('process-btn'); if (processBtn) { @@ -169,7 +180,9 @@ async function updateUI() { const countSpan = document.createElement('div'); countSpan.className = 'font-medium text-gray-200 text-sm mb-1'; - countSpan.textContent = `${pageState.files.length} PDF file(s) selected`; + countSpan.textContent = trText('{{length}} PDF file(s) selected', { + length: pageState.files.length, + }); const sizeSpan = document.createElement('div'); sizeSpan.className = 'text-xs text-gray-400'; @@ -199,7 +212,7 @@ async function updateUI() { async function extractAttachments() { if (pageState.files.length === 0) { - showStatus('No Files', 'error'); + showStatus(trText('No Files'), 'error'); return; } @@ -215,7 +228,7 @@ async function extractAttachments() { processBtn.setAttribute('disabled', 'true'); } - showStatus('Reading files...', 'info'); + showStatus(trText('Reading files...'), 'info'); try { pageState.files = await batchDecryptIfNeeded(pageState.files); @@ -239,7 +252,9 @@ async function extractAttachments() { } showStatus( - `Extracting attachments from ${pageState.files.length} file(s)...`, + trText('Extracting attachments from {{length}} file(s)...', { + length: pageState.files.length, + }), 'info' ); @@ -257,7 +272,10 @@ async function extractAttachments() { } catch (error) { console.error('Error reading files:', error); showStatus( - `Error reading files: ${error instanceof Error ? error.message : 'Unknown error occurred'}`, + trText('Error reading files: {{error}}', { + error: + error instanceof Error ? error.message : 'Unknown error occurred', + }), 'error' ); @@ -282,7 +300,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/extract-images-page.ts b/src/js/logic/extract-images-page.ts index e5bbf513..822dae12 100644 --- a/src/js/logic/extract-images-page.ts +++ b/src/js/logic/extract-images-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { downloadFile, readFileAsArrayBuffer, @@ -19,7 +19,7 @@ interface ExtractedImage { let extractedImages: ExtractedImage[] = []; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -66,7 +66,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -85,9 +88,15 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(file); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(file.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(file.size), + numPages: pdfDoc.numPages, + }); } catch { - metaSpan.textContent = `${formatBytes(file.size)} • Could not load page count`; + metaSpan.textContent = trText( + '{{size}} • Could not load page count', + { size: formatBytes(file.size) } + ); } } @@ -167,7 +176,9 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; - showLoader(`Extracting images from ${file.name}...`); + showLoader( + trText('Extracting images from {{name}}...', { name: file.name }) + ); const doc = await pymupdf.open(file); const pageCount = doc.pageCount; @@ -206,7 +217,10 @@ document.addEventListener('DOMContentLoaded', () => { displayImages(); showAlert( 'Extraction Complete', - `Found ${extractedImages.length} image(s) in ${state.files.length} PDF(s).`, + trText('Found {{length}} image(s) in {{length2}} PDF(s).', { + length: extractedImages.length, + length2: state.files.length, + }), 'success' ); } @@ -214,7 +228,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during extraction. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during extraction. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/extract-pages-page.ts b/src/js/logic/extract-pages-page.ts index 8e175dbe..50792759 100644 --- a/src/js/logic/extract-pages-page.ts +++ b/src/js/logic/extract-pages-page.ts @@ -10,6 +10,8 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import JSZip from 'jszip'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface ExtractState { file: File | null; pdfDoc: PDFDocument | null; @@ -22,11 +24,7 @@ const extractState: ExtractState = { totalPages: 0, }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -131,7 +129,10 @@ function updateFileDisplay() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(extractState.file.size)} • ${extractState.totalPages} pages`; + metaSpan.textContent = trText('{{size}} • {{totalPages}} pages', { + size: formatBytes(extractState.file.size), + totalPages: extractState.totalPages, + }); infoContainer.append(nameSpan, metaSpan); @@ -197,7 +198,9 @@ async function extractPages() { hideLoader(); showAlert( 'Success', - `Extracted ${pagesToExtract.length} page(s) successfully!`, + trText('Extracted {{length}} page(s) successfully!', { + length: pagesToExtract.length, + }), 'success', () => { resetState(); diff --git a/src/js/logic/extract-tables-page.ts b/src/js/logic/extract-tables-page.ts index e377221b..b13512d2 100644 --- a/src/js/logic/extract-tables-page.ts +++ b/src/js/logic/extract-tables-page.ts @@ -4,6 +4,8 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let file: File | null = null; const updateUI = () => { @@ -117,7 +119,12 @@ async function extract() { const allTables: TableData[] = []; for (let i = 0; i < pageCount; i++) { - showLoader(`Scanning page ${i + 1} of ${pageCount}...`); + showLoader( + trText('Scanning page {{n}} of {{pageCount}}...', { + n: i + 1, + pageCount, + }) + ); const page = doc.getPage(i); const tables = page.findTables(); @@ -193,21 +200,26 @@ async function extract() { downloadFile(zipBlob, `${baseName}_tables.zip`); showAlert( 'Success', - `Extracted ${allTables.length} tables successfully!`, + trText('Extracted {{length}} tables successfully!', { + length: allTables.length, + }), 'success', resetState ); } } catch (e) { console.error(e); - const message = e instanceof Error ? e.message : 'Unknown error'; - showAlert('Error', `Failed to extract tables. ${message}`); + const message = e instanceof Error ? e.message : trText('Unknown error'); + showAlert( + 'Error', + trText('Failed to extract tables. {{message}}', { message }) + ); } finally { hideLoader(); } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/fb2-to-pdf-page.ts b/src/js/logic/fb2-to-pdf-page.ts index 7195a5b0..10f355ea 100644 --- a/src/js/logic/fb2-to-pdf-page.ts +++ b/src/js/logic/fb2-to-pdf-page.ts @@ -4,11 +4,13 @@ import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const FILETYPE = 'fb2'; const EXTENSIONS = ['.fb2']; const TOOL_NAME = 'FB2'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -83,7 +85,12 @@ document.addEventListener('DOMContentLoaded', () => { const convertToPdf = async () => { try { if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${TOOL_NAME} file.`); + showAlert( + 'No Files', + trText('Please select at least one {{TOOL_NAME}} file.', { + TOOL_NAME, + }) + ); return; } @@ -92,7 +99,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const originalFile = state.files[0]; - showLoader(`Converting ${originalFile.name}...`); + showLoader( + trText('Converting {{name}}...', { name: originalFile.name }) + ); const pdfBlob = await pymupdf.convertToPdf(originalFile, { filetype: FILETYPE, @@ -104,7 +113,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -116,7 +127,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await pymupdf.convertToPdf(file, { @@ -134,7 +149,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`, + trText( + 'Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.', + { length: state.files.length, TOOL_NAME } + ), 'success', () => resetState() ); @@ -144,7 +162,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/fix-page-size-page.ts b/src/js/logic/fix-page-size-page.ts index 0328452c..cfdf7665 100644 --- a/src/js/logic/fix-page-size-page.ts +++ b/src/js/logic/fix-page-size-page.ts @@ -5,6 +5,8 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { icons, createIcons } from 'lucide'; import { FixPageSizeState } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: FixPageSizeState = { file: null, }; @@ -105,7 +107,7 @@ async function fixPageSize() { const loaderModal = document.getElementById('loader-modal'); const loaderText = document.getElementById('loader-text'); if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Standardizing pages...'; + if (loaderText) loaderText.textContent = trText('Standardizing pages...'); try { const customWidth = @@ -153,7 +155,7 @@ async function fixPageSize() { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/flatten-pdf-page.ts b/src/js/logic/flatten-pdf-page.ts index 0440ad5c..3f24dbb1 100644 --- a/src/js/logic/flatten-pdf-page.ts +++ b/src/js/logic/flatten-pdf-page.ts @@ -14,6 +14,8 @@ import { removeUnreferencedObjects, } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: FlattenPdfState = { files: [], }; @@ -112,7 +114,7 @@ async function flattenPdf() { try { if (pageState.files.length === 1) { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Flattening PDF...'; + if (loaderText) loaderText.textContent = trText('Flattening PDF...'); const file = pageState.files[0]; const arrayBuffer = await file.arrayBuffer(); @@ -142,7 +144,8 @@ async function flattenPdf() { if (loaderModal) loaderModal.classList.add('hidden'); } else { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Flattening multiple PDFs...'; + if (loaderText) + loaderText.textContent = trText('Flattening multiple PDFs...'); const zip = new JSZip(); const usedNames = new Set(); @@ -151,7 +154,10 @@ async function flattenPdf() { for (let i = 0; i < pageState.files.length; i++) { const file = pageState.files[i]; if (loaderText) - loaderText.textContent = `Flattening ${i + 1}/${pageState.files.length}: ${file.name}...`; + loaderText.textContent = trText( + 'Flattening {{n}}/{{length}}: {{name}}...', + { n: i + 1, length: pageState.files.length, name: file.name } + ); try { const arrayBuffer = await file.arrayBuffer(); @@ -189,7 +195,7 @@ async function flattenPdf() { downloadFile(zipBlob, 'flattened_pdfs.zip'); showAlert( 'Success', - `Processed ${processedCount} PDFs.`, + trText('Processed {{processedCount}} PDFs.', { processedCount }), 'success', () => { resetState(); @@ -204,12 +210,12 @@ async function flattenPdf() { console.error(e); if (loaderModal) loaderModal.classList.add('hidden'); const errorMessage = - e instanceof Error ? e.message : 'An unexpected error occurred.'; + e instanceof Error ? e.message : trText('An unexpected error occurred.'); showAlert('Error', errorMessage); } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/font-to-outline-page.ts b/src/js/logic/font-to-outline-page.ts index 518385d1..c6fb0646 100644 --- a/src/js/logic/font-to-outline-page.ts +++ b/src/js/logic/font-to-outline-page.ts @@ -8,6 +8,8 @@ import { icons, createIcons } from 'lucide'; import JSZip from 'jszip'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface FontToOutlineState { files: File[]; } @@ -117,7 +119,7 @@ async function processFiles() { if (pageState.files.length === 1) { if (loaderModal) loaderModal.classList.remove('hidden'); if (loaderText) - loaderText.textContent = 'Converting fonts to outlines...'; + loaderText.textContent = trText('Converting fonts to outlines...'); const file = pageState.files[0]; const resultBlob = await convertFileToOutlines(file, (msg) => { @@ -128,7 +130,8 @@ async function processFiles() { if (loaderModal) loaderModal.classList.add('hidden'); } else { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Processing multiple PDFs...'; + if (loaderText) + loaderText.textContent = trText('Processing multiple PDFs...'); const zip = new JSZip(); const usedNames = new Set(); @@ -137,7 +140,10 @@ async function processFiles() { for (let i = 0; i < pageState.files.length; i++) { const file = pageState.files[i]; if (loaderText) - loaderText.textContent = `Processing ${i + 1}/${pageState.files.length}: ${file.name}...`; + loaderText.textContent = trText( + 'Processing {{n}}/{{length}}: {{name}}...', + { n: i + 1, length: pageState.files.length, name: file.name } + ); try { const resultBlob = await convertFileToOutlines(file, () => {}); @@ -155,7 +161,7 @@ async function processFiles() { downloadFile(zipBlob, 'outlined_pdfs.zip'); showAlert( 'Success', - `Processed ${processedCount} PDFs.`, + trText('Processed {{processedCount}} PDFs.', { processedCount }), 'success', () => { resetState(); @@ -170,12 +176,12 @@ async function processFiles() { console.error(e); if (loaderModal) loaderModal.classList.add('hidden'); const errorMessage = - e instanceof Error ? e.message : 'An unexpected error occurred.'; + e instanceof Error ? e.message : trText('An unexpected error occurred.'); showAlert('Error', errorMessage); } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/form-creator.ts b/src/js/logic/form-creator.ts index 76c62cb7..d4b66b31 100644 --- a/src/js/logic/form-creator.ts +++ b/src/js/logic/form-creator.ts @@ -41,6 +41,8 @@ import { extractExistingFields as extractExistingPdfFields } from './form-creato import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, trHtml } from '../i18n/i18n.js'; + let fields: FormField[] = []; let selectedField: FormField | null = null; let fieldCounter = 0; @@ -247,7 +249,11 @@ if (gotoPageBtn && gotoPageInput) { renderCanvas(); updatePageNavigation(); } else { - alert(`Please enter a valid page number between 1 and ${pages.length}`); + alert( + trText('Please enter a valid page number between 1 and {{total}}', { + total: pages.length, + }) + ); } }); @@ -389,6 +395,13 @@ canvas.addEventListener('click', (e) => { } }); +const standardFontText = (text: string, fallback: string): string => + /^[\u0020-\u007e\u00a0-\u00ff\u2013\u2014\u2018\u2019\u201c\u201d\u2026\u20ac]*$/.test( + text + ) + ? text + : fallback; + function createField(type: FormField['type'], x: number, y: number): void { fieldCounter++; const field: FormField = { @@ -429,7 +442,10 @@ function createField(type: FormField['type'], x: number, y: number): void { type === 'button' ? 'Button' : type === 'image' - ? 'Click to Upload Image' + ? standardFontText( + trText('Click to Upload Image'), + 'Click to Upload Image' + ) : undefined, action: type === 'button' ? 'none' : undefined, jsScript: type === 'button' ? 'app.alert("Hello World!");' : undefined, @@ -683,7 +699,7 @@ function renderField(field: FormField): void { // Empty state const optEl = document.createElement('div'); optEl.className = 'px-1 w-full text-black italic'; - optEl.textContent = 'Item 1'; + optEl.textContent = trText('Item 1'); contentEl.appendChild(optEl); } } else if (field.type === 'button') { @@ -694,7 +710,7 @@ function renderField(field: FormField): void { '#e5e7eb' ); contentEl.style.color = field.textColor || '#000000'; - contentEl.textContent = field.label || 'Button'; + contentEl.textContent = field.label || trText('Button'); } else if (field.type === 'signature') { contentEl.className = 'w-full h-full flex items-center justify-center text-gray-400'; @@ -702,8 +718,7 @@ function renderField(field: FormField): void { field, '#f9fafb' ); - contentEl.innerHTML = - '
    Sign Here
    '; + contentEl.innerHTML = `
    ${trHtml('Sign Here')}
    `; setTimeout(() => (window as LucideWindow).lucide?.createIcons(), 0); } else if (field.type === 'date') { contentEl.className = @@ -750,11 +765,11 @@ function renderField(field: FormField): void { String(field.name).replace(/[\r\n]+/g, ' '), error ); - contentEl.innerHTML = `
    Invalid data
    `; + contentEl.innerHTML = `
    ${trHtml('Invalid data')}
    `; setTimeout(() => (window as LucideWindow).lucide?.createIcons(), 0); } } else { - contentEl.innerHTML = `
    Barcode
    `; + contentEl.innerHTML = `
    ${trHtml('Barcode')}
    `; setTimeout(() => (window as LucideWindow).lucide?.createIcons(), 0); } } @@ -1090,35 +1105,35 @@ function showProperties(field: FormField): void { if (field.type === 'text') { specificProps = `
    - + 0 ? `maxlength="${field.combCells}"` : field.maxLength > 0 ? `maxlength="${field.maxLength}"` : ''} class="w-full bg-gray-600 border border-gray-500 text-white rounded px-2 py-1 text-sm focus:ring-indigo-500 focus:border-indigo-500">
    - + 0 ? 'disabled' : ''} class="w-full bg-gray-600 border border-gray-500 text-white rounded px-2 py-1 text-sm focus:ring-indigo-500 focus:border-indigo-500 disabled:opacity-50">
    - +
    - +
    - +
    - +
    - + @@ -1127,7 +1142,7 @@ function showProperties(field: FormField): void { } else if (field.type === 'checkbox') { specificProps = `
    - + @@ -1136,15 +1151,15 @@ function showProperties(field: FormField): void { } else if (field.type === 'radio') { specificProps = `
    - +
    - +
    - + @@ -1153,50 +1168,50 @@ function showProperties(field: FormField): void { } else if (field.type === 'dropdown' || field.type === 'optionlist') { specificProps = `
    - +
    - +
    - To actually fill or change the options, use our PDF Form Filler tool. + ${trHtml('To actually fill or change the options, use our PDF Form Filler tool.')}
    `; } else if (field.type === 'button') { specificProps = `
    - +
    - +
    - - + +
    - +
    - +
    - +
    @@ -1219,7 +1234,7 @@ function showProperties(field: FormField): void { } else if (field.type === 'signature') { specificProps = `
    - Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer. + ${trHtml('Signature fields are AcroForm signature fields and would only be visible in an advanced PDF viewer.')}
    `; } else if (field.type === 'date') { @@ -1259,53 +1274,53 @@ function showProperties(field: FormField): void { const isCustom = !formats.includes(field.dateFormat || 'mm/dd/yyyy'); specificProps = `
    - +
    - - + +
    - Example of current format: + ${trHtml('Example of current format:')}

    - Browser Note: Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date. + ${trHtml('Browser Note:')} ${trHtml('Firefox and Chrome may show their native date picker format during selection. The correct format will apply when you finish entering the date.')}

    `; } else if (field.type === 'image') { specificProps = `
    - +
    - Clicking this field in the PDF will open a file picker to upload an image. + ${trHtml('Clicking this field in the PDF will open a file picker to upload an image.')}
    `; } else if (field.type === 'barcode') { specificProps = `
    - +
    - +
    @@ -1315,7 +1330,7 @@ function showProperties(field: FormField): void { const propertiesHtml = `
    - +
    @@ -1325,9 +1340,9 @@ function showProperties(field: FormField): void { fields.some((f) => f.type === 'radio' && f.id !== field.id)) ? `
    - + -

    Select to add this button to an existing group

    +

    ${trHtml('Select to add this button to an existing group')}

    ` : '' } ${specificProps}
    - - + +
    - +
    - +
    - +
    - +
    - +
    `; @@ -1404,7 +1419,7 @@ function showProperties(field: FormField): void { const validateName = (newName: string): boolean => { if (!newName) { - nameError.textContent = 'Field name cannot be empty'; + nameError.textContent = trText('Field name cannot be empty'); nameError.classList.remove('hidden'); propName.classList.add('border-red-500'); return false; @@ -1422,7 +1437,10 @@ function showProperties(field: FormField): void { const isDuplicateInPdf = existingFieldNames.has(newName); if (isDuplicateInFields || isDuplicateInPdf) { - nameError.textContent = `Field name "${newName}" already exists in this ${isDuplicateInPdf ? 'PDF' : 'form'}. Please try using a unique name.`; + nameError.textContent = trText( + 'Field name "{{newName}}" already exists in this {{value}}. Please try using a unique name.', + { newName, value: isDuplicateInPdf ? trText('PDF') : trText('form') } + ); nameError.classList.remove('hidden'); propName.classList.add('border-red-500'); return false; @@ -1773,7 +1791,7 @@ function showProperties(field: FormField): void { if (propSelectedOption) { const currentVal = field.defaultValue; propSelectedOption.innerHTML = - '' + + `` + field.options ?.map( (opt) => @@ -1812,7 +1830,7 @@ function showProperties(field: FormField): void { const contentEl = fieldWrapper.querySelector( '.field-content' ) as HTMLElement; - if (contentEl) contentEl.textContent = field.label || 'Button'; + if (contentEl) contentEl.textContent = field.label || trText('Button'); } }); @@ -2033,13 +2051,13 @@ function showProperties(field: FormField): void { }; const barcodeFormatHints: Record = { - qrcode: 'Any text, URL, or data', - code128: 'ASCII characters (letters, numbers, symbols)', - code39: 'Uppercase A-Z, digits 0-9, and - . $ / + % SPACE', - ean13: 'Exactly 12 or 13 digits', - upca: 'Exactly 11 or 12 digits', - datamatrix: 'Any text, URL, or data', - pdf417: 'Any text, URL, or data', + qrcode: trText('Any text, URL, or data'), + code128: trText('ASCII characters (letters, numbers, symbols)'), + code39: trText('Uppercase A-Z, digits 0-9, and - . $ / + % SPACE'), + ean13: trText('Exactly 12 or 13 digits'), + upca: trText('Exactly 11 or 12 digits'), + datamatrix: trText('Any text, URL, or data'), + pdf417: trText('Any text, URL, or data'), }; const hintEl = document.getElementById('barcodeFormatHint'); @@ -2069,8 +2087,7 @@ function showProperties(field: FormField): void { // Hide properties panel function hideProperties(): void { - propertiesPanel.innerHTML = - '

    Select a field to edit properties

    '; + propertiesPanel.innerHTML = `

    ${trHtml('Select a field to edit properties')}

    `; } // Delete field @@ -2137,8 +2154,11 @@ downloadBtn.addEventListener('click', async () => { .map((name) => `"${name}"`) .join(', '); showModal( - 'Field Name Conflict', - `The following field names already exist in the uploaded PDF: ${conflictList}. Please rename these fields before downloading.`, + trText('Field Name Conflict'), + trText( + 'The following field names already exist in the uploaded PDF: {{conflictList}}. Please rename these fields before downloading.', + { conflictList } + ), 'error' ); return; @@ -2147,20 +2167,23 @@ downloadBtn.addEventListener('click', async () => { if (duplicates.length > 0) { const duplicateList = duplicates.map((name) => `"${name}"`).join(', '); showModal( - 'Duplicate Field Names', - `The following field names are used more than once: ${duplicateList}. Please rename these fields to use unique names before downloading.`, + trText('Duplicate Field Names'), + trText( + 'The following field names are used more than once: {{duplicateList}}. Please rename these fields to use unique names before downloading.', + { duplicateList } + ), 'error' ); return; } if (fields.length === 0) { - alert('Please add at least one field before downloading.'); + alert(trText('Please add at least one field before downloading.')); return; } if (pages.length === 0) { - alert('No pages found. Please create a blank PDF or upload one.'); + alert(trText('No pages found. Please create a blank PDF or upload one.')); return; } @@ -2705,7 +2728,7 @@ downloadBtn.addEventListener('click', async () => { downloadFile(blob, uploadedFileName || 'document.pdf'); showModal( 'Success', - 'Your PDF has been downloaded successfully.', + trText('Your PDF has been downloaded successfully.'), 'info', () => { resetToInitial(); @@ -2730,13 +2753,20 @@ downloadBtn.addEventListener('click', async () => { console.log(`Adding to existing radio group: ${fieldName}`); } else { showModal( - 'Duplicate Field Name', - `A field named "${fieldName}" already exists. Please rename this field to use a unique name before downloading.`, + trText('Duplicate Field Name'), + trText( + 'A field named "{{fieldName}}" already exists. Please rename this field to use a unique name before downloading.', + { fieldName } + ), 'error' ); } } else { - showModal('Error', 'Error generating PDF: ' + errorMessage, 'error'); + showModal( + 'Error', + trText('Error generating PDF: {{error}}', { error: errorMessage }), + 'error' + ); } } }); @@ -2795,8 +2825,7 @@ function resetToInitial(): void { canvas.innerHTML = ''; - propertiesPanel.innerHTML = - '

    Select a field to edit properties

    '; + propertiesPanel.innerHTML = `

    ${trHtml('Select a field to edit properties')}

    `; updateFieldCount(); @@ -2906,7 +2935,10 @@ async function renderCanvas(): Promise { } function updatePageNavigation(): void { - pageIndicator.textContent = `Page ${currentPageIndex + 1} of ${pages.length}`; + pageIndicator.textContent = trText('Page {{n}} of {{length}}', { + n: currentPageIndex + 1, + length: pages.length, + }); prevPageBtn.disabled = currentPageIndex === 0; nextPageBtn.disabled = currentPageIndex === pages.length - 1; } @@ -3067,7 +3099,7 @@ async function handlePdfUpload(file: File) { console.error('Error loading PDF:', error); showModal( 'Error', - 'Error loading PDF file. Please try again with a valid PDF.', + trText('Error loading PDF file. Please try again with a valid PDF.'), 'error' ); } @@ -3094,7 +3126,9 @@ addPageBtn.addEventListener('click', () => { resetBtn.addEventListener('click', () => { if (fields.length > 0 || pages.length > 0) { if ( - confirm('Are you sure you want to reset? All your work will be lost.') + confirm( + trText('Are you sure you want to reset? All your work will be lost.') + ) ) { resetToInitial(); } @@ -3121,9 +3155,9 @@ function showModal( if (!errorModal || !errorModalTitle || !errorModalMessage || !errorModalClose) return; - errorModalTitle.textContent = title; - errorModalMessage.textContent = message; - errorModalClose.textContent = buttonText; + errorModalTitle.textContent = trText(title); + errorModalMessage.textContent = trText(message); + errorModalClose.textContent = trText(buttonText); modalCloseCallback = onClose || null; errorModal.classList.remove('hidden'); diff --git a/src/js/logic/form-filler-page.ts b/src/js/logic/form-filler-page.ts index 47772bdc..7a62f260 100644 --- a/src/js/logic/form-filler-page.ts +++ b/src/js/logic/form-filler-page.ts @@ -3,6 +3,9 @@ import { createIcons, icons } from 'lucide'; import { getPDFDocument } from '../utils/helpers.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; +import { getStoredItem } from '../utils/safe-storage.js'; + let viewerIframe: HTMLIFrameElement | null = null; let viewerReady = false; let currentFile: File | null = null; @@ -12,7 +15,7 @@ function showLoader(message: string = 'Processing...') { const loader = document.getElementById('loader-modal'); const loaderText = document.getElementById('loader-text'); if (loader) loader.classList.remove('hidden'); - if (loaderText) loaderText.textContent = message; + if (loaderText) loaderText.textContent = trText(message); } function hideLoader() { @@ -31,8 +34,8 @@ function showAlert( const alertMessage = document.getElementById('alert-message'); const okBtn = document.getElementById('alert-ok'); - if (alertTitle) alertTitle.textContent = title; - if (alertMessage) alertMessage.textContent = message; + if (alertTitle) alertTitle.textContent = trText(title); + if (alertMessage) alertMessage.textContent = trText(message); if (modal) modal.classList.remove('hidden'); if (okBtn) { @@ -80,7 +83,7 @@ function updateFileDisplay() { removeBtn.id = 'remove-file'; removeBtn.className = 'text-red-400 hover:text-red-300 p-2 flex-shrink-0 ml-2'; - removeBtn.title = 'Remove file'; + removeBtn.title = trText('Remove file'); const removeIcon = document.createElement('i'); removeIcon.setAttribute('data-lucide', 'trash-2'); @@ -117,7 +120,7 @@ function resetState() { } const toolUploader = document.getElementById('tool-uploader'); - const isFullWidth = localStorage.getItem('fullWidthMode') !== 'false'; + const isFullWidth = getStoredItem('fullWidthMode') !== 'false'; if (toolUploader && !isFullWidth) { toolUploader.classList.remove('max-w-6xl'); toolUploader.classList.add('max-w-2xl'); @@ -181,7 +184,7 @@ async function setupFormViewer() { const toolUploader = document.getElementById('tool-uploader'); // Default to true if not set - const isFullWidth = localStorage.getItem('fullWidthMode') !== 'false'; + const isFullWidth = getStoredItem('fullWidthMode') !== 'false'; if (toolUploader && !isFullWidth) { toolUploader.classList.remove('max-w-2xl'); toolUploader.classList.add('max-w-6xl'); @@ -281,7 +284,7 @@ async function processAndDownloadForm() { } // Initialize -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/header-footer-page.ts b/src/js/logic/header-footer-page.ts index d7efe734..9f2349c7 100644 --- a/src/js/logic/header-footer-page.ts +++ b/src/js/logic/header-footer-page.ts @@ -11,13 +11,11 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { HeaderFooterState } from '@/types'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: HeaderFooterState = { file: null, pdfDoc: null }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -100,7 +98,10 @@ function updateFileDisplay() { nameSpan.textContent = pageState.file.name; const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.pdfDoc.getPageCount()} pages`; + metaSpan.textContent = trText('{{size}} • {{getPageCount}} pages', { + size: formatBytes(pageState.file.size), + getPageCount: pageState.pdfDoc.getPageCount(), + }); infoContainer.append(nameSpan, metaSpan); const removeBtn = document.createElement('button'); removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; @@ -167,7 +168,7 @@ async function addHeaderFooter() { }; const indicesToProcess = parsePageRanges(pageRangeInput, totalPages); if (indicesToProcess.length === 0) - throw new Error('Invalid page range specified.'); + throw new Error(trText('Invalid page range specified.')); const drawOptions = { font: helveticaFont, size: fontSize, diff --git a/src/js/logic/heic-to-pdf-page.ts b/src/js/logic/heic-to-pdf-page.ts index 3f2f6c00..b8ce788a 100644 --- a/src/js/logic/heic-to-pdf-page.ts +++ b/src/js/logic/heic-to-pdf-page.ts @@ -4,176 +4,187 @@ import { createIcons, icons } from 'lucide'; import heic2any from 'heic2any'; import { PDFDocument as PDFLibDocument } from 'pdf-lib'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; const updateUI = () => { - const fileDisplayArea = document.getElementById('file-display-area'); - const fileControls = document.getElementById('file-controls'); - const processBtn = document.getElementById('process-btn'); + const fileDisplayArea = document.getElementById('file-display-area'); + const fileControls = document.getElementById('file-controls'); + const processBtn = document.getElementById('process-btn'); - if (!fileDisplayArea || !fileControls || !processBtn) return; + if (!fileDisplayArea || !fileControls || !processBtn) return; - fileDisplayArea.innerHTML = ''; + fileDisplayArea.innerHTML = ''; - if (files.length > 0) { - fileControls.classList.remove('hidden'); - processBtn.classList.remove('hidden'); + if (files.length > 0) { + fileControls.classList.remove('hidden'); + processBtn.classList.remove('hidden'); - files.forEach((file, index) => { - const fileDiv = document.createElement('div'); - fileDiv.className = 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; + files.forEach((file, index) => { + const fileDiv = document.createElement('div'); + fileDiv.className = + 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; - const infoContainer = document.createElement('div'); - infoContainer.className = 'flex items-center gap-2 overflow-hidden'; + const infoContainer = document.createElement('div'); + infoContainer.className = 'flex items-center gap-2 overflow-hidden'; - const nameSpan = document.createElement('span'); - nameSpan.className = 'truncate font-medium text-gray-200'; - nameSpan.textContent = file.name; + const nameSpan = document.createElement('span'); + nameSpan.className = 'truncate font-medium text-gray-200'; + nameSpan.textContent = file.name; - const sizeSpan = document.createElement('span'); - sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + const sizeSpan = document.createElement('span'); + sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); - infoContainer.append(nameSpan, sizeSpan); + infoContainer.append(nameSpan, sizeSpan); - const removeBtn = document.createElement('button'); - removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; - removeBtn.innerHTML = ''; - removeBtn.onclick = () => { - files = files.filter((_, i) => i !== index); - updateUI(); - }; + const removeBtn = document.createElement('button'); + removeBtn.className = + 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; + removeBtn.innerHTML = ''; + removeBtn.onclick = () => { + files = files.filter((_, i) => i !== index); + updateUI(); + }; - fileDiv.append(infoContainer, removeBtn); - fileDisplayArea.appendChild(fileDiv); - }); - createIcons({ icons }); - } else { - fileControls.classList.add('hidden'); - processBtn.classList.add('hidden'); - } + fileDiv.append(infoContainer, removeBtn); + fileDisplayArea.appendChild(fileDiv); + }); + createIcons({ icons }); + } else { + fileControls.classList.add('hidden'); + processBtn.classList.add('hidden'); + } }; const resetState = () => { - files = []; - updateUI(); + files = []; + updateUI(); }; async function convert() { - if (files.length === 0) { - showAlert('No Files', 'Please select at least one HEIC file.'); - return; - } - showLoader('Converting HEIC to PDF...'); - try { - const pdfDoc = await PDFLibDocument.create(); - for (const file of files) { - const conversionResult = await heic2any({ - blob: file, - toType: 'image/png', - quality: 0.92, - }); - const pngBlob = Array.isArray(conversionResult) - ? conversionResult[0] - : conversionResult; - const pngBytes = await pngBlob.arrayBuffer(); - const pngImage = await pdfDoc.embedPng(pngBytes); - const page = pdfDoc.addPage([pngImage.width, pngImage.height]); - page.drawImage(pngImage, { - x: 0, - y: 0, - width: pngImage.width, - height: pngImage.height, - }); - } - const pdfBytes = await pdfDoc.save(); - downloadFile( - new Blob([new Uint8Array(pdfBytes)], { type: 'application/pdf' }), - 'from_heic.pdf' - ); - showAlert('Success', 'PDF created successfully!', 'success', () => { - resetState(); - }); - } catch (e) { - console.error(e); - showAlert( - 'Error', - 'Failed to convert HEIC to PDF. One of the files may be invalid.' - ); - } finally { - hideLoader(); + if (files.length === 0) { + showAlert('No Files', 'Please select at least one HEIC file.'); + return; + } + showLoader('Converting HEIC to PDF...'); + try { + const pdfDoc = await PDFLibDocument.create(); + for (const file of files) { + const conversionResult = await heic2any({ + blob: file, + toType: 'image/png', + quality: 0.92, + }); + const pngBlob = Array.isArray(conversionResult) + ? conversionResult[0] + : conversionResult; + const pngBytes = await pngBlob.arrayBuffer(); + const pngImage = await pdfDoc.embedPng(pngBytes); + const page = pdfDoc.addPage([pngImage.width, pngImage.height]); + page.drawImage(pngImage, { + x: 0, + y: 0, + width: pngImage.width, + height: pngImage.height, + }); } + const pdfBytes = await pdfDoc.save(); + downloadFile( + new Blob([new Uint8Array(pdfBytes)], { type: 'application/pdf' }), + 'from_heic.pdf' + ); + showAlert('Success', 'PDF created successfully!', 'success', () => { + resetState(); + }); + } catch (e) { + console.error(e); + showAlert( + 'Error', + 'Failed to convert HEIC to PDF. One of the files may be invalid.' + ); + } finally { + hideLoader(); + } } -document.addEventListener('DOMContentLoaded', () => { - const fileInput = document.getElementById('file-input') as HTMLInputElement; - const dropZone = document.getElementById('drop-zone'); - const addMoreBtn = document.getElementById('add-more-btn'); - const clearFilesBtn = document.getElementById('clear-files-btn'); - const processBtn = document.getElementById('process-btn'); - const backBtn = document.getElementById('back-to-tools'); +onPageReady(() => { + const fileInput = document.getElementById('file-input') as HTMLInputElement; + const dropZone = document.getElementById('drop-zone'); + const addMoreBtn = document.getElementById('add-more-btn'); + const clearFilesBtn = document.getElementById('clear-files-btn'); + const processBtn = document.getElementById('process-btn'); + const backBtn = document.getElementById('back-to-tools'); - if (backBtn) { - backBtn.addEventListener('click', () => { - window.location.href = import.meta.env.BASE_URL; - }); + if (backBtn) { + backBtn.addEventListener('click', () => { + window.location.href = import.meta.env.BASE_URL; + }); + } + + const handleFileSelect = (newFiles: FileList | null) => { + if (!newFiles || newFiles.length === 0) return; + const validFiles = Array.from(newFiles).filter( + (file) => + file.name.toLowerCase().endsWith('.heic') || + file.name.toLowerCase().endsWith('.heif') + ); + + if (validFiles.length < newFiles.length) { + showAlert( + 'Invalid Files', + 'Some files were skipped. Only HEIC/HEIF files are allowed.' + ); } - const handleFileSelect = (newFiles: FileList | null) => { - if (!newFiles || newFiles.length === 0) return; - const validFiles = Array.from(newFiles).filter( - (file) => file.name.toLowerCase().endsWith('.heic') || file.name.toLowerCase().endsWith('.heif') - ); - - if (validFiles.length < newFiles.length) { - showAlert('Invalid Files', 'Some files were skipped. Only HEIC/HEIF files are allowed.'); - } - - if (validFiles.length > 0) { - files = [...files, ...validFiles]; - updateUI(); - } - }; - - if (fileInput && dropZone) { - fileInput.addEventListener('change', (e) => { - handleFileSelect((e.target as HTMLInputElement).files); - }); - - dropZone.addEventListener('dragover', (e) => { - e.preventDefault(); - dropZone.classList.add('bg-gray-700'); - }); - - dropZone.addEventListener('dragleave', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - }); - - dropZone.addEventListener('drop', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - handleFileSelect(e.dataTransfer?.files ?? null); - }); - - fileInput.addEventListener('click', () => { - fileInput.value = ''; - }); + if (validFiles.length > 0) { + files = [...files, ...validFiles]; + updateUI(); } + }; - if (addMoreBtn) { - addMoreBtn.addEventListener('click', () => { - fileInput?.click(); - }); - } + if (fileInput && dropZone) { + fileInput.addEventListener('change', (e) => { + handleFileSelect((e.target as HTMLInputElement).files); + }); - if (clearFilesBtn) { - clearFilesBtn.addEventListener('click', () => { - resetState(); - }); - } + dropZone.addEventListener('dragover', (e) => { + e.preventDefault(); + dropZone.classList.add('bg-gray-700'); + }); - if (processBtn) { - processBtn.addEventListener('click', convert); - } + dropZone.addEventListener('dragleave', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + }); + + dropZone.addEventListener('drop', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + handleFileSelect(e.dataTransfer?.files ?? null); + }); + + fileInput.addEventListener('click', () => { + fileInput.value = ''; + }); + } + + if (addMoreBtn) { + addMoreBtn.addEventListener('click', () => { + fileInput?.click(); + }); + } + + if (clearFilesBtn) { + clearFilesBtn.addEventListener('click', () => { + resetState(); + }); + } + + if (processBtn) { + processBtn.addEventListener('click', convert); + } }); diff --git a/src/js/logic/image-to-pdf-page.ts b/src/js/logic/image-to-pdf-page.ts index e58bb768..3de5a004 100644 --- a/src/js/logic/image-to-pdf-page.ts +++ b/src/js/logic/image-to-pdf-page.ts @@ -14,14 +14,12 @@ import { preprocessImageFile, } from '@/js/utils/image-input-utils.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; let pymupdf: PyMuPDFInstance | null = null; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -143,7 +141,9 @@ function updateUI() { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); diff --git a/src/js/logic/invert-colors-page.ts b/src/js/logic/invert-colors-page.ts index 92a9a166..f7896c9b 100644 --- a/src/js/logic/invert-colors-page.ts +++ b/src/js/logic/invert-colors-page.ts @@ -9,13 +9,11 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: InvertColorsState = { file: null, pdfDoc: null }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -93,7 +91,10 @@ function updateFileDisplay() { nameSpan.textContent = pageState.file.name; const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.pdfDoc.getPageCount()} pages`; + metaSpan.textContent = trText('{{size}} • {{getPageCount}} pages', { + size: formatBytes(pageState.file.size), + getPageCount: pageState.pdfDoc.getPageCount(), + }); infoContainer.append(nameSpan, metaSpan); const removeBtn = document.createElement('button'); removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; @@ -126,7 +127,12 @@ async function invertColors() { const pdfjsDoc = await getPDFDocument({ data: pdfBytes }).promise; for (let i = 1; i <= pdfjsDoc.numPages; i++) { - showLoader(`Processing page ${i} of ${pdfjsDoc.numPages}...`); + showLoader( + trText('Processing page {{i}} of {{numPages}}...', { + i, + numPages: pdfjsDoc.numPages, + }) + ); const page = await pdfjsDoc.getPage(i); const viewport = page.getViewport({ scale: 1.5 }); const canvas = document.createElement('canvas'); diff --git a/src/js/logic/jpg-to-pdf-page.ts b/src/js/logic/jpg-to-pdf-page.ts index 009aee28..61e7add7 100644 --- a/src/js/logic/jpg-to-pdf-page.ts +++ b/src/js/logic/jpg-to-pdf-page.ts @@ -8,17 +8,15 @@ import { compressImageFile, } from '../utils/image-compress.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const SUPPORTED_FORMATS = '.jpg,.jpeg,.jp2,.jpx'; const SUPPORTED_MIME_TYPES = ['image/jpeg', 'image/jpg', 'image/jp2']; let files: File[] = []; let pymupdf: PyMuPDFInstance | null = null; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -146,7 +144,9 @@ function updateUI() { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); diff --git a/src/js/logic/linearize-pdf-page.ts b/src/js/logic/linearize-pdf-page.ts index 3ce422f3..0d95fbb9 100644 --- a/src/js/logic/linearize-pdf-page.ts +++ b/src/js/logic/linearize-pdf-page.ts @@ -10,6 +10,8 @@ import JSZip from 'jszip'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; import { LinearizePdfState, QpdfInstanceExtended } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: LinearizePdfState = { files: [], }; @@ -107,7 +109,9 @@ async function linearizePdf() { const loaderText = document.getElementById('loader-text'); if (loaderModal) loaderModal.classList.remove('hidden'); if (loaderText) - loaderText.textContent = 'Optimizing PDFs for web view (linearizing)...'; + loaderText.textContent = trText( + 'Optimizing PDFs for web view (linearizing)...' + ); const zip = new JSZip(); const usedNames = new Set(); @@ -124,7 +128,10 @@ async function linearizePdf() { const outputPath = `/output_${i}.pdf`; if (loaderText) - loaderText.textContent = `Optimizing ${file.name} (${i + 1}/${pdfFiles.length})...`; + loaderText.textContent = trText( + 'Optimizing {{name}} ({{n}}/{{length}})...', + { name: file.name, n: i + 1, length: pdfFiles.length } + ); try { const fileBuffer = await readFileAsArrayBuffer(file); @@ -141,7 +148,9 @@ async function linearizePdf() { console.error( `Linearization resulted in an empty file for ${file.name}.` ); - throw new Error(`Processing failed for ${file.name}.`); + throw new Error( + trText('Processing failed for {{name}}.', { name: file.name }) + ); } const zipEntryName = deduplicateFileName( @@ -173,16 +182,19 @@ async function linearizePdf() { } if (successCount === 0) { - throw new Error('No PDF files could be linearized.'); + throw new Error(trText('No PDF files could be linearized.')); } - if (loaderText) loaderText.textContent = 'Generating ZIP file...'; + if (loaderText) loaderText.textContent = trText('Generating ZIP file...'); const zipBlob = await zip.generateAsync({ type: 'blob' }); downloadFile(zipBlob, 'linearized-pdfs.zip'); - let alertMessage = `${successCount} PDF(s) linearized successfully.`; + let alertMessage = trText( + '{{successCount}} PDF(s) linearized successfully.', + { successCount } + ); if (errorCount > 0) { - alertMessage += ` ${errorCount} file(s) failed.`; + alertMessage += ` ${trText('Files that failed: {{errorCount}}.', { errorCount })}`; } showAlert('Processing Complete', alertMessage, 'success', () => { resetState(); @@ -191,14 +203,16 @@ async function linearizePdf() { console.error('Linearization process error:', error); showAlert( 'Linearization Failed', - `An error occurred: ${error instanceof Error ? error.message : 'Unknown error'}.` + trText('An error occurred: {{error}}.', { + error: error instanceof Error ? error.message : trText('Unknown error'), + }) ); } finally { if (loaderModal) loaderModal.classList.add('hidden'); } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/markdown-to-pdf-page.ts b/src/js/logic/markdown-to-pdf-page.ts index 3282f4cd..be73cb34 100644 --- a/src/js/logic/markdown-to-pdf-page.ts +++ b/src/js/logic/markdown-to-pdf-page.ts @@ -1,6 +1,8 @@ import { MarkdownEditor } from '../utils/markdown-editor.js'; -document.addEventListener('DOMContentLoaded', () => { +import { onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { const container = document.getElementById('markdown-editor-container'); if (!container) { diff --git a/src/js/logic/merge-pdf-page.ts b/src/js/logic/merge-pdf-page.ts index 94082978..73331392 100644 --- a/src/js/logic/merge-pdf-page.ts +++ b/src/js/logic/merge-pdf-page.ts @@ -12,7 +12,7 @@ import { showWasmRequiredDialog, WasmProvider, } from '../utils/wasm-provider.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { createIcons, icons } from 'lucide'; import * as pdfjsLib from 'pdfjs-dist'; @@ -166,11 +166,14 @@ async function renderPageMergeThumbnails() { 'text-xs text-gray-400 truncate w-full text-center'; const fullTitle = displayName ? `${displayName} (page ${pageNumber})` - : `Page ${pageNumber}`; + : trText('Page {{pageNumber}}', { pageNumber }); fileNamePara.title = fullTitle; fileNamePara.textContent = displayName - ? `${displayName.substring(0, 10)}... (p${pageNumber})` - : `Page ${pageNumber}`; + ? trText('{{name}}... (p{{pageNumber}})', { + name: displayName.substring(0, 10), + pageNumber, + }) + : trText('Page {{pageNumber}}', { pageNumber }); wrapper.append(imgContainer, fileNamePara); return wrapper; @@ -291,7 +294,7 @@ export async function merge() { if (mergeState.activeMode === 'file') { const fileList = document.getElementById('file-list'); - if (!fileList) throw new Error('File list not found'); + if (!fileList) throw new Error(trText('File list not found')); const sortedFileKeys = Array.from(fileList.children) .map((li) => (li as HTMLElement).dataset.fileName) @@ -321,7 +324,7 @@ export async function merge() { } else { // Page Mode const pageContainer = document.getElementById('page-merge-preview'); - if (!pageContainer) throw new Error('Page container not found'); + if (!pageContainer) throw new Error(trText('Page container not found')); const pageElements = Array.from(pageContainer.children); const rawPages: { fileName: string; pageIndex: number }[] = []; @@ -523,14 +526,16 @@ export async function refreshMergeUI() { const label = document.createElement('label'); label.htmlFor = `range-${safeFileName}`; label.className = 'text-xs text-gray-400'; - label.textContent = `Pages (e.g., 1-3, 5) - Total: ${pageCount}`; + label.textContent = trText('Pages (e.g., 1-3, 5) - Total: {{pageCount}}', { + pageCount, + }); const input = document.createElement('input'); input.type = 'text'; input.id = `range-${safeFileName}`; input.className = 'w-full bg-gray-800 border border-gray-600 text-white rounded-md p-2 text-sm mt-1 focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors'; - input.placeholder = 'Leave blank for all pages'; + input.placeholder = trText('Leave blank for all pages'); inputWrapper.append(label, input); @@ -538,7 +543,7 @@ export async function refreshMergeUI() { deleteBtn.className = 'text-red-400 hover:text-red-300 p-2 flex-shrink-0 self-end'; deleteBtn.innerHTML = ''; - deleteBtn.title = 'Remove file'; + deleteBtn.title = trText('Remove file'); deleteBtn.onclick = (e) => { e.stopPropagation(); state.files = state.files.filter((_, i) => i !== index); @@ -603,7 +608,7 @@ export async function refreshMergeUI() { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/mobi-to-pdf-page.ts b/src/js/logic/mobi-to-pdf-page.ts index d70c2230..b1059906 100644 --- a/src/js/logic/mobi-to-pdf-page.ts +++ b/src/js/logic/mobi-to-pdf-page.ts @@ -4,11 +4,13 @@ import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const FILETYPE = 'mobi'; const EXTENSIONS = ['.mobi']; const TOOL_NAME = 'MOBI'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -83,7 +85,12 @@ document.addEventListener('DOMContentLoaded', () => { const convertToPdf = async () => { try { if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${TOOL_NAME} file.`); + showAlert( + 'No Files', + trText('Please select at least one {{TOOL_NAME}} file.', { + TOOL_NAME, + }) + ); return; } @@ -92,7 +99,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const originalFile = state.files[0]; - showLoader(`Converting ${originalFile.name}...`); + showLoader( + trText('Converting {{name}}...', { name: originalFile.name }) + ); const pdfBlob = await pymupdf.convertToPdf(originalFile, { filetype: FILETYPE, @@ -104,7 +113,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -116,7 +127,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await pymupdf.convertToPdf(file, { @@ -134,7 +149,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`, + trText( + 'Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.', + { length: state.files.length, TOOL_NAME } + ), 'success', () => resetState() ); @@ -144,7 +162,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/n-up-pdf-page.ts b/src/js/logic/n-up-pdf-page.ts index 5b6c527c..bdfd66e1 100644 --- a/src/js/logic/n-up-pdf-page.ts +++ b/src/js/logic/n-up-pdf-page.ts @@ -5,6 +5,8 @@ import { PDFDocument as PDFLibDocument, rgb, PageSizes } from 'pdf-lib'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface NUpState { file: File | null; pdfDoc: PDFLibDocument | null; @@ -51,7 +53,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -79,7 +83,10 @@ async function updateUI() { hideLoader(); const pageCount = pageState.pdfDoc.getPageCount(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); if (toolOptions) toolOptions.classList.remove('hidden'); } catch (error) { @@ -152,7 +159,9 @@ async function nUpTool() { const usableHeight = pageHeight - margin * 2; for (let i = 0; i < sourcePages.length; i += n) { - showLoader(`Processing sheet ${Math.floor(i / n) + 1}...`); + showLoader( + trText('Processing sheet {{n}}...', { n: Math.floor(i / n) + 1 }) + ); const chunk = sourcePages.slice(i, i + n); const outputPage = newDoc.addPage([pageWidth, pageHeight]); @@ -234,7 +243,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/ocr-pdf-page.ts b/src/js/logic/ocr-pdf-page.ts index 08aa57cd..dfafdf03 100644 --- a/src/js/logic/ocr-pdf-page.ts +++ b/src/js/logic/ocr-pdf-page.ts @@ -10,7 +10,7 @@ import { resolveConfiguredTesseractAvailableLanguages, UnsupportedOcrLanguageError, } from '../utils/tesseract-language-availability.js'; -import { initI18n, t } from '../i18n/index.js'; +import { initI18n, t, onPageReady } from '../i18n/index.js'; const pageState: OcrState = { file: null, @@ -285,7 +285,7 @@ function populateLanguageList() { }); } -document.addEventListener('DOMContentLoaded', async function () { +onPageReady(async function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById( diff --git a/src/js/logic/odg-to-pdf-page.ts b/src/js/logic/odg-to-pdf-page.ts index 1d874d48..09f46c11 100644 --- a/src/js/logic/odg-to-pdf-page.ts +++ b/src/js/logic/odg-to-pdf-page.ts @@ -1,189 +1,225 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { - downloadFile, - formatBytes, -} from '../utils/helpers.js'; +import { downloadFile, formatBytes } from '../utils/helpers.js'; import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; -import { getLibreOfficeConverter, type LoadProgress } from '../utils/libreoffice-loader.js'; +import { + getLibreOfficeConverter, + type LoadProgress, +} from '../utils/libreoffice-loader.js'; + +import { trText, onPageReady } from '../i18n/i18n.js'; const ACCEPTED_EXTENSIONS = ['.odg']; const FILETYPE_NAME = 'ODG'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { + state.files = []; + + const fileInput = document.getElementById('file-input') as HTMLInputElement; + const dropZone = document.getElementById('drop-zone'); + const convertOptions = document.getElementById('convert-options'); + const fileDisplayArea = document.getElementById('file-display-area'); + const fileControls = document.getElementById('file-controls'); + const addMoreBtn = document.getElementById('add-more-btn'); + const clearFilesBtn = document.getElementById('clear-files-btn'); + const backBtn = document.getElementById('back-to-tools'); + const processBtn = document.getElementById('process-btn'); + + if (backBtn) { + backBtn.addEventListener('click', () => { + window.location.href = import.meta.env.BASE_URL; + }); + } + + const updateUI = async () => { + if (!convertOptions) return; + + if (state.files.length > 0) { + if (fileDisplayArea) { + fileDisplayArea.innerHTML = ''; + + for (let index = 0; index < state.files.length; index++) { + const file = state.files[index]; + const fileDiv = document.createElement('div'); + fileDiv.className = + 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; + + const infoContainer = document.createElement('div'); + infoContainer.className = 'flex flex-col overflow-hidden'; + + const nameSpan = document.createElement('div'); + nameSpan.className = + 'truncate font-medium text-gray-200 text-sm mb-1'; + nameSpan.textContent = file.name; + + const metaSpan = document.createElement('div'); + metaSpan.className = 'text-xs text-gray-400'; + metaSpan.textContent = formatBytes(file.size); + + infoContainer.append(nameSpan, metaSpan); + + const removeBtn = document.createElement('button'); + removeBtn.className = + 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; + removeBtn.innerHTML = ''; + removeBtn.onclick = () => { + state.files = state.files.filter((_, i) => i !== index); + updateUI(); + }; + + fileDiv.append(infoContainer, removeBtn); + fileDisplayArea.appendChild(fileDiv); + } + + createIcons({ icons }); + } + if (fileControls) fileControls.classList.remove('hidden'); + convertOptions.classList.remove('hidden'); + } else { + if (fileDisplayArea) fileDisplayArea.innerHTML = ''; + if (fileControls) fileControls.classList.add('hidden'); + convertOptions.classList.add('hidden'); + } + }; + + const resetState = () => { state.files = []; - - const fileInput = document.getElementById('file-input') as HTMLInputElement; - const dropZone = document.getElementById('drop-zone'); - const convertOptions = document.getElementById('convert-options'); - const fileDisplayArea = document.getElementById('file-display-area'); - const fileControls = document.getElementById('file-controls'); - const addMoreBtn = document.getElementById('add-more-btn'); - const clearFilesBtn = document.getElementById('clear-files-btn'); - const backBtn = document.getElementById('back-to-tools'); - const processBtn = document.getElementById('process-btn'); - - if (backBtn) { - backBtn.addEventListener('click', () => { - window.location.href = import.meta.env.BASE_URL; - }); - } - - const updateUI = async () => { - if (!convertOptions) return; - - if (state.files.length > 0) { - if (fileDisplayArea) { - fileDisplayArea.innerHTML = ''; - - for (let index = 0; index < state.files.length; index++) { - const file = state.files[index]; - const fileDiv = document.createElement('div'); - fileDiv.className = 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; - - const infoContainer = document.createElement('div'); - infoContainer.className = 'flex flex-col overflow-hidden'; - - const nameSpan = document.createElement('div'); - nameSpan.className = 'truncate font-medium text-gray-200 text-sm mb-1'; - nameSpan.textContent = file.name; - - const metaSpan = document.createElement('div'); - metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = formatBytes(file.size); - - infoContainer.append(nameSpan, metaSpan); - - const removeBtn = document.createElement('button'); - removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; - removeBtn.innerHTML = ''; - removeBtn.onclick = () => { - state.files = state.files.filter((_, i) => i !== index); - updateUI(); - }; - - fileDiv.append(infoContainer, removeBtn); - fileDisplayArea.appendChild(fileDiv); - } - - createIcons({ icons }); - } - if (fileControls) fileControls.classList.remove('hidden'); - convertOptions.classList.remove('hidden'); - } else { - if (fileDisplayArea) fileDisplayArea.innerHTML = ''; - if (fileControls) fileControls.classList.add('hidden'); - convertOptions.classList.add('hidden'); - } - }; - - const resetState = () => { - state.files = []; - updateUI(); - }; - - const convert = async () => { - if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${FILETYPE_NAME} file.`); - return; - } - - try { - const converter = getLibreOfficeConverter(); - - showLoader('Loading engine...'); - await converter.initialize((progress: LoadProgress) => { - showLoader(progress.message, progress.percent); - }); - - if (state.files.length === 1) { - const file = state.files[0]; - showLoader(`Converting ${file.name}...`); - const pdfBlob = await converter.convertToPdf(file); - - const baseName = file.name.replace(/\.[^/.]+$/, ''); - downloadFile(pdfBlob, `${baseName}.pdf`); - - hideLoader(); - showAlert('Conversion Complete', `Successfully converted ${file.name} to PDF.`, 'success', () => resetState()); - } else { - showLoader('Converting multiple files...'); - const JSZip = (await import('jszip')).default; - const zip = new JSZip(); - - for (let i = 0; i < state.files.length; i++) { - const file = state.files[i]; - showLoader(`Converting ${i + 1}/${state.files.length}: ${file.name}...`); - const pdfBlob = await converter.convertToPdf(file); - - const baseName = file.name.replace(/\.[^/.]+$/, ''); - zip.file(`${baseName}.pdf`, pdfBlob); - } - - const zipBlob = await zip.generateAsync({ type: 'blob' }); - downloadFile(zipBlob, `${FILETYPE_NAME.toLowerCase()}-to-pdf.zip`); - - hideLoader(); - showAlert('Conversion Complete', `Successfully converted ${state.files.length} files to PDF.`, 'success', () => resetState()); - } - } catch (err) { - hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; - console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); - showAlert('Error', `An error occurred during conversion. Error: ${message}`); - } - }; - - const handleFileSelect = (files: FileList | null) => { - if (files && files.length > 0) { - const validFiles = Array.from(files).filter(file => { - const ext = '.' + file.name.split('.').pop()?.toLowerCase(); - return ACCEPTED_EXTENSIONS.includes(ext); - }); - if (validFiles.length > 0) { - state.files = [...state.files, ...validFiles]; - updateUI(); - } - } - }; - - if (fileInput && dropZone) { - fileInput.addEventListener('change', (e) => { - handleFileSelect((e.target as HTMLInputElement).files); - }); - - dropZone.addEventListener('dragover', (e) => { - e.preventDefault(); - dropZone.classList.add('bg-gray-700'); - }); - - dropZone.addEventListener('dragleave', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - }); - - dropZone.addEventListener('drop', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - handleFileSelect(e.dataTransfer?.files ?? null); - }); - - fileInput.addEventListener('click', () => { - fileInput.value = ''; - }); - } - - if (addMoreBtn) { - addMoreBtn.addEventListener('click', () => fileInput.click()); - } - - if (clearFilesBtn) { - clearFilesBtn.addEventListener('click', resetState); - } - - if (processBtn) { - processBtn.addEventListener('click', convert); - } - updateUI(); + }; + + const convert = async () => { + if (state.files.length === 0) { + showAlert( + 'No Files', + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) + ); + return; + } + + try { + const converter = getLibreOfficeConverter(); + + showLoader('Loading engine...'); + await converter.initialize((progress: LoadProgress) => { + showLoader(progress.message, progress.percent); + }); + + if (state.files.length === 1) { + const file = state.files[0]; + showLoader(trText('Converting {{name}}...', { name: file.name })); + const pdfBlob = await converter.convertToPdf(file); + + const baseName = file.name.replace(/\.[^/.]+$/, ''); + downloadFile(pdfBlob, `${baseName}.pdf`); + + hideLoader(); + showAlert( + 'Conversion Complete', + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), + 'success', + () => resetState() + ); + } else { + showLoader('Converting multiple files...'); + const JSZip = (await import('jszip')).default; + const zip = new JSZip(); + + for (let i = 0; i < state.files.length; i++) { + const file = state.files[i]; + showLoader( + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) + ); + const pdfBlob = await converter.convertToPdf(file); + + const baseName = file.name.replace(/\.[^/.]+$/, ''); + zip.file(`${baseName}.pdf`, pdfBlob); + } + + const zipBlob = await zip.generateAsync({ type: 'blob' }); + downloadFile(zipBlob, `${FILETYPE_NAME.toLowerCase()}-to-pdf.zip`); + + hideLoader(); + showAlert( + 'Conversion Complete', + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), + 'success', + () => resetState() + ); + } + } catch (err) { + hideLoader(); + const message = + err instanceof Error ? err.message : trText('Unknown error'); + console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); + showAlert( + 'Error', + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) + ); + } + }; + + const handleFileSelect = (files: FileList | null) => { + if (files && files.length > 0) { + const validFiles = Array.from(files).filter((file) => { + const ext = '.' + file.name.split('.').pop()?.toLowerCase(); + return ACCEPTED_EXTENSIONS.includes(ext); + }); + if (validFiles.length > 0) { + state.files = [...state.files, ...validFiles]; + updateUI(); + } + } + }; + + if (fileInput && dropZone) { + fileInput.addEventListener('change', (e) => { + handleFileSelect((e.target as HTMLInputElement).files); + }); + + dropZone.addEventListener('dragover', (e) => { + e.preventDefault(); + dropZone.classList.add('bg-gray-700'); + }); + + dropZone.addEventListener('dragleave', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + }); + + dropZone.addEventListener('drop', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + handleFileSelect(e.dataTransfer?.files ?? null); + }); + + fileInput.addEventListener('click', () => { + fileInput.value = ''; + }); + } + + if (addMoreBtn) { + addMoreBtn.addEventListener('click', () => fileInput.click()); + } + + if (clearFilesBtn) { + clearFilesBtn.addEventListener('click', resetState); + } + + if (processBtn) { + processBtn.addEventListener('click', convert); + } + + updateUI(); }); diff --git a/src/js/logic/odp-to-pdf-page.ts b/src/js/logic/odp-to-pdf-page.ts index b9c7cd22..00c6d5c0 100644 --- a/src/js/logic/odp-to-pdf-page.ts +++ b/src/js/logic/odp-to-pdf-page.ts @@ -1,189 +1,225 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { - downloadFile, - formatBytes, -} from '../utils/helpers.js'; +import { downloadFile, formatBytes } from '../utils/helpers.js'; import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; -import { getLibreOfficeConverter, type LoadProgress } from '../utils/libreoffice-loader.js'; +import { + getLibreOfficeConverter, + type LoadProgress, +} from '../utils/libreoffice-loader.js'; + +import { trText, onPageReady } from '../i18n/i18n.js'; const ACCEPTED_EXTENSIONS = ['.odp']; const FILETYPE_NAME = 'ODP'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { + state.files = []; + + const fileInput = document.getElementById('file-input') as HTMLInputElement; + const dropZone = document.getElementById('drop-zone'); + const convertOptions = document.getElementById('convert-options'); + const fileDisplayArea = document.getElementById('file-display-area'); + const fileControls = document.getElementById('file-controls'); + const addMoreBtn = document.getElementById('add-more-btn'); + const clearFilesBtn = document.getElementById('clear-files-btn'); + const backBtn = document.getElementById('back-to-tools'); + const processBtn = document.getElementById('process-btn'); + + if (backBtn) { + backBtn.addEventListener('click', () => { + window.location.href = import.meta.env.BASE_URL; + }); + } + + const updateUI = async () => { + if (!convertOptions) return; + + if (state.files.length > 0) { + if (fileDisplayArea) { + fileDisplayArea.innerHTML = ''; + + for (let index = 0; index < state.files.length; index++) { + const file = state.files[index]; + const fileDiv = document.createElement('div'); + fileDiv.className = + 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; + + const infoContainer = document.createElement('div'); + infoContainer.className = 'flex flex-col overflow-hidden'; + + const nameSpan = document.createElement('div'); + nameSpan.className = + 'truncate font-medium text-gray-200 text-sm mb-1'; + nameSpan.textContent = file.name; + + const metaSpan = document.createElement('div'); + metaSpan.className = 'text-xs text-gray-400'; + metaSpan.textContent = formatBytes(file.size); + + infoContainer.append(nameSpan, metaSpan); + + const removeBtn = document.createElement('button'); + removeBtn.className = + 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; + removeBtn.innerHTML = ''; + removeBtn.onclick = () => { + state.files = state.files.filter((_, i) => i !== index); + updateUI(); + }; + + fileDiv.append(infoContainer, removeBtn); + fileDisplayArea.appendChild(fileDiv); + } + + createIcons({ icons }); + } + if (fileControls) fileControls.classList.remove('hidden'); + convertOptions.classList.remove('hidden'); + } else { + if (fileDisplayArea) fileDisplayArea.innerHTML = ''; + if (fileControls) fileControls.classList.add('hidden'); + convertOptions.classList.add('hidden'); + } + }; + + const resetState = () => { state.files = []; - - const fileInput = document.getElementById('file-input') as HTMLInputElement; - const dropZone = document.getElementById('drop-zone'); - const convertOptions = document.getElementById('convert-options'); - const fileDisplayArea = document.getElementById('file-display-area'); - const fileControls = document.getElementById('file-controls'); - const addMoreBtn = document.getElementById('add-more-btn'); - const clearFilesBtn = document.getElementById('clear-files-btn'); - const backBtn = document.getElementById('back-to-tools'); - const processBtn = document.getElementById('process-btn'); - - if (backBtn) { - backBtn.addEventListener('click', () => { - window.location.href = import.meta.env.BASE_URL; - }); - } - - const updateUI = async () => { - if (!convertOptions) return; - - if (state.files.length > 0) { - if (fileDisplayArea) { - fileDisplayArea.innerHTML = ''; - - for (let index = 0; index < state.files.length; index++) { - const file = state.files[index]; - const fileDiv = document.createElement('div'); - fileDiv.className = 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; - - const infoContainer = document.createElement('div'); - infoContainer.className = 'flex flex-col overflow-hidden'; - - const nameSpan = document.createElement('div'); - nameSpan.className = 'truncate font-medium text-gray-200 text-sm mb-1'; - nameSpan.textContent = file.name; - - const metaSpan = document.createElement('div'); - metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = formatBytes(file.size); - - infoContainer.append(nameSpan, metaSpan); - - const removeBtn = document.createElement('button'); - removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; - removeBtn.innerHTML = ''; - removeBtn.onclick = () => { - state.files = state.files.filter((_, i) => i !== index); - updateUI(); - }; - - fileDiv.append(infoContainer, removeBtn); - fileDisplayArea.appendChild(fileDiv); - } - - createIcons({ icons }); - } - if (fileControls) fileControls.classList.remove('hidden'); - convertOptions.classList.remove('hidden'); - } else { - if (fileDisplayArea) fileDisplayArea.innerHTML = ''; - if (fileControls) fileControls.classList.add('hidden'); - convertOptions.classList.add('hidden'); - } - }; - - const resetState = () => { - state.files = []; - updateUI(); - }; - - const convert = async () => { - if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${FILETYPE_NAME} file.`); - return; - } - - try { - const converter = getLibreOfficeConverter(); - - showLoader('Loading engine...'); - await converter.initialize((progress: LoadProgress) => { - showLoader(progress.message, progress.percent); - }); - - if (state.files.length === 1) { - const file = state.files[0]; - showLoader(`Converting ${file.name}...`); - const pdfBlob = await converter.convertToPdf(file); - - const baseName = file.name.replace(/\.[^/.]+$/, ''); - downloadFile(pdfBlob, `${baseName}.pdf`); - - hideLoader(); - showAlert('Conversion Complete', `Successfully converted ${file.name} to PDF.`, 'success', () => resetState()); - } else { - showLoader('Converting multiple files...'); - const JSZip = (await import('jszip')).default; - const zip = new JSZip(); - - for (let i = 0; i < state.files.length; i++) { - const file = state.files[i]; - showLoader(`Converting ${i + 1}/${state.files.length}: ${file.name}...`); - const pdfBlob = await converter.convertToPdf(file); - - const baseName = file.name.replace(/\.[^/.]+$/, ''); - zip.file(`${baseName}.pdf`, pdfBlob); - } - - const zipBlob = await zip.generateAsync({ type: 'blob' }); - downloadFile(zipBlob, `${FILETYPE_NAME.toLowerCase()}-to-pdf.zip`); - - hideLoader(); - showAlert('Conversion Complete', `Successfully converted ${state.files.length} files to PDF.`, 'success', () => resetState()); - } - } catch (err) { - hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; - console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); - showAlert('Error', `An error occurred during conversion. Error: ${message}`); - } - }; - - const handleFileSelect = (files: FileList | null) => { - if (files && files.length > 0) { - const validFiles = Array.from(files).filter(file => { - const ext = '.' + file.name.split('.').pop()?.toLowerCase(); - return ACCEPTED_EXTENSIONS.includes(ext); - }); - if (validFiles.length > 0) { - state.files = [...state.files, ...validFiles]; - updateUI(); - } - } - }; - - if (fileInput && dropZone) { - fileInput.addEventListener('change', (e) => { - handleFileSelect((e.target as HTMLInputElement).files); - }); - - dropZone.addEventListener('dragover', (e) => { - e.preventDefault(); - dropZone.classList.add('bg-gray-700'); - }); - - dropZone.addEventListener('dragleave', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - }); - - dropZone.addEventListener('drop', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - handleFileSelect(e.dataTransfer?.files ?? null); - }); - - fileInput.addEventListener('click', () => { - fileInput.value = ''; - }); - } - - if (addMoreBtn) { - addMoreBtn.addEventListener('click', () => fileInput.click()); - } - - if (clearFilesBtn) { - clearFilesBtn.addEventListener('click', resetState); - } - - if (processBtn) { - processBtn.addEventListener('click', convert); - } - updateUI(); + }; + + const convert = async () => { + if (state.files.length === 0) { + showAlert( + 'No Files', + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) + ); + return; + } + + try { + const converter = getLibreOfficeConverter(); + + showLoader('Loading engine...'); + await converter.initialize((progress: LoadProgress) => { + showLoader(progress.message, progress.percent); + }); + + if (state.files.length === 1) { + const file = state.files[0]; + showLoader(trText('Converting {{name}}...', { name: file.name })); + const pdfBlob = await converter.convertToPdf(file); + + const baseName = file.name.replace(/\.[^/.]+$/, ''); + downloadFile(pdfBlob, `${baseName}.pdf`); + + hideLoader(); + showAlert( + 'Conversion Complete', + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), + 'success', + () => resetState() + ); + } else { + showLoader('Converting multiple files...'); + const JSZip = (await import('jszip')).default; + const zip = new JSZip(); + + for (let i = 0; i < state.files.length; i++) { + const file = state.files[i]; + showLoader( + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) + ); + const pdfBlob = await converter.convertToPdf(file); + + const baseName = file.name.replace(/\.[^/.]+$/, ''); + zip.file(`${baseName}.pdf`, pdfBlob); + } + + const zipBlob = await zip.generateAsync({ type: 'blob' }); + downloadFile(zipBlob, `${FILETYPE_NAME.toLowerCase()}-to-pdf.zip`); + + hideLoader(); + showAlert( + 'Conversion Complete', + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), + 'success', + () => resetState() + ); + } + } catch (err) { + hideLoader(); + const message = + err instanceof Error ? err.message : trText('Unknown error'); + console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); + showAlert( + 'Error', + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) + ); + } + }; + + const handleFileSelect = (files: FileList | null) => { + if (files && files.length > 0) { + const validFiles = Array.from(files).filter((file) => { + const ext = '.' + file.name.split('.').pop()?.toLowerCase(); + return ACCEPTED_EXTENSIONS.includes(ext); + }); + if (validFiles.length > 0) { + state.files = [...state.files, ...validFiles]; + updateUI(); + } + } + }; + + if (fileInput && dropZone) { + fileInput.addEventListener('change', (e) => { + handleFileSelect((e.target as HTMLInputElement).files); + }); + + dropZone.addEventListener('dragover', (e) => { + e.preventDefault(); + dropZone.classList.add('bg-gray-700'); + }); + + dropZone.addEventListener('dragleave', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + }); + + dropZone.addEventListener('drop', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + handleFileSelect(e.dataTransfer?.files ?? null); + }); + + fileInput.addEventListener('click', () => { + fileInput.value = ''; + }); + } + + if (addMoreBtn) { + addMoreBtn.addEventListener('click', () => fileInput.click()); + } + + if (clearFilesBtn) { + clearFilesBtn.addEventListener('click', resetState); + } + + if (processBtn) { + processBtn.addEventListener('click', convert); + } + + updateUI(); }); diff --git a/src/js/logic/ods-to-pdf-page.ts b/src/js/logic/ods-to-pdf-page.ts index 24343ece..cb6debca 100644 --- a/src/js/logic/ods-to-pdf-page.ts +++ b/src/js/logic/ods-to-pdf-page.ts @@ -1,189 +1,225 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { - downloadFile, - formatBytes, -} from '../utils/helpers.js'; +import { downloadFile, formatBytes } from '../utils/helpers.js'; import { state } from '../state.js'; import { createIcons, icons } from 'lucide'; -import { getLibreOfficeConverter, type LoadProgress } from '../utils/libreoffice-loader.js'; +import { + getLibreOfficeConverter, + type LoadProgress, +} from '../utils/libreoffice-loader.js'; + +import { trText, onPageReady } from '../i18n/i18n.js'; const ACCEPTED_EXTENSIONS = ['.ods']; const FILETYPE_NAME = 'ODS'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { + state.files = []; + + const fileInput = document.getElementById('file-input') as HTMLInputElement; + const dropZone = document.getElementById('drop-zone'); + const convertOptions = document.getElementById('convert-options'); + const fileDisplayArea = document.getElementById('file-display-area'); + const fileControls = document.getElementById('file-controls'); + const addMoreBtn = document.getElementById('add-more-btn'); + const clearFilesBtn = document.getElementById('clear-files-btn'); + const backBtn = document.getElementById('back-to-tools'); + const processBtn = document.getElementById('process-btn'); + + if (backBtn) { + backBtn.addEventListener('click', () => { + window.location.href = import.meta.env.BASE_URL; + }); + } + + const updateUI = async () => { + if (!convertOptions) return; + + if (state.files.length > 0) { + if (fileDisplayArea) { + fileDisplayArea.innerHTML = ''; + + for (let index = 0; index < state.files.length; index++) { + const file = state.files[index]; + const fileDiv = document.createElement('div'); + fileDiv.className = + 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; + + const infoContainer = document.createElement('div'); + infoContainer.className = 'flex flex-col overflow-hidden'; + + const nameSpan = document.createElement('div'); + nameSpan.className = + 'truncate font-medium text-gray-200 text-sm mb-1'; + nameSpan.textContent = file.name; + + const metaSpan = document.createElement('div'); + metaSpan.className = 'text-xs text-gray-400'; + metaSpan.textContent = formatBytes(file.size); + + infoContainer.append(nameSpan, metaSpan); + + const removeBtn = document.createElement('button'); + removeBtn.className = + 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; + removeBtn.innerHTML = ''; + removeBtn.onclick = () => { + state.files = state.files.filter((_, i) => i !== index); + updateUI(); + }; + + fileDiv.append(infoContainer, removeBtn); + fileDisplayArea.appendChild(fileDiv); + } + + createIcons({ icons }); + } + if (fileControls) fileControls.classList.remove('hidden'); + convertOptions.classList.remove('hidden'); + } else { + if (fileDisplayArea) fileDisplayArea.innerHTML = ''; + if (fileControls) fileControls.classList.add('hidden'); + convertOptions.classList.add('hidden'); + } + }; + + const resetState = () => { state.files = []; - - const fileInput = document.getElementById('file-input') as HTMLInputElement; - const dropZone = document.getElementById('drop-zone'); - const convertOptions = document.getElementById('convert-options'); - const fileDisplayArea = document.getElementById('file-display-area'); - const fileControls = document.getElementById('file-controls'); - const addMoreBtn = document.getElementById('add-more-btn'); - const clearFilesBtn = document.getElementById('clear-files-btn'); - const backBtn = document.getElementById('back-to-tools'); - const processBtn = document.getElementById('process-btn'); - - if (backBtn) { - backBtn.addEventListener('click', () => { - window.location.href = import.meta.env.BASE_URL; - }); - } - - const updateUI = async () => { - if (!convertOptions) return; - - if (state.files.length > 0) { - if (fileDisplayArea) { - fileDisplayArea.innerHTML = ''; - - for (let index = 0; index < state.files.length; index++) { - const file = state.files[index]; - const fileDiv = document.createElement('div'); - fileDiv.className = 'flex items-center justify-between bg-gray-700 p-3 rounded-lg text-sm'; - - const infoContainer = document.createElement('div'); - infoContainer.className = 'flex flex-col overflow-hidden'; - - const nameSpan = document.createElement('div'); - nameSpan.className = 'truncate font-medium text-gray-200 text-sm mb-1'; - nameSpan.textContent = file.name; - - const metaSpan = document.createElement('div'); - metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = formatBytes(file.size); - - infoContainer.append(nameSpan, metaSpan); - - const removeBtn = document.createElement('button'); - removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; - removeBtn.innerHTML = ''; - removeBtn.onclick = () => { - state.files = state.files.filter((_, i) => i !== index); - updateUI(); - }; - - fileDiv.append(infoContainer, removeBtn); - fileDisplayArea.appendChild(fileDiv); - } - - createIcons({ icons }); - } - if (fileControls) fileControls.classList.remove('hidden'); - convertOptions.classList.remove('hidden'); - } else { - if (fileDisplayArea) fileDisplayArea.innerHTML = ''; - if (fileControls) fileControls.classList.add('hidden'); - convertOptions.classList.add('hidden'); - } - }; - - const resetState = () => { - state.files = []; - updateUI(); - }; - - const convert = async () => { - if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${FILETYPE_NAME} file.`); - return; - } - - try { - const converter = getLibreOfficeConverter(); - - showLoader('Loading engine...'); - await converter.initialize((progress: LoadProgress) => { - showLoader(progress.message, progress.percent); - }); - - if (state.files.length === 1) { - const file = state.files[0]; - showLoader(`Converting ${file.name}...`); - const pdfBlob = await converter.convertToPdf(file); - - const baseName = file.name.replace(/\.[^/.]+$/, ''); - downloadFile(pdfBlob, `${baseName}.pdf`); - - hideLoader(); - showAlert('Conversion Complete', `Successfully converted ${file.name} to PDF.`, 'success', () => resetState()); - } else { - showLoader('Converting multiple files...'); - const JSZip = (await import('jszip')).default; - const zip = new JSZip(); - - for (let i = 0; i < state.files.length; i++) { - const file = state.files[i]; - showLoader(`Converting ${i + 1}/${state.files.length}: ${file.name}...`); - const pdfBlob = await converter.convertToPdf(file); - - const baseName = file.name.replace(/\.[^/.]+$/, ''); - zip.file(`${baseName}.pdf`, pdfBlob); - } - - const zipBlob = await zip.generateAsync({ type: 'blob' }); - downloadFile(zipBlob, `${FILETYPE_NAME.toLowerCase()}-to-pdf.zip`); - - hideLoader(); - showAlert('Conversion Complete', `Successfully converted ${state.files.length} files to PDF.`, 'success', () => resetState()); - } - } catch (err) { - hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; - console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); - showAlert('Error', `An error occurred during conversion. Error: ${message}`); - } - }; - - const handleFileSelect = (files: FileList | null) => { - if (files && files.length > 0) { - const validFiles = Array.from(files).filter(file => { - const ext = '.' + file.name.split('.').pop()?.toLowerCase(); - return ACCEPTED_EXTENSIONS.includes(ext); - }); - if (validFiles.length > 0) { - state.files = [...state.files, ...validFiles]; - updateUI(); - } - } - }; - - if (fileInput && dropZone) { - fileInput.addEventListener('change', (e) => { - handleFileSelect((e.target as HTMLInputElement).files); - }); - - dropZone.addEventListener('dragover', (e) => { - e.preventDefault(); - dropZone.classList.add('bg-gray-700'); - }); - - dropZone.addEventListener('dragleave', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - }); - - dropZone.addEventListener('drop', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - handleFileSelect(e.dataTransfer?.files ?? null); - }); - - fileInput.addEventListener('click', () => { - fileInput.value = ''; - }); - } - - if (addMoreBtn) { - addMoreBtn.addEventListener('click', () => fileInput.click()); - } - - if (clearFilesBtn) { - clearFilesBtn.addEventListener('click', resetState); - } - - if (processBtn) { - processBtn.addEventListener('click', convert); - } - updateUI(); + }; + + const convert = async () => { + if (state.files.length === 0) { + showAlert( + 'No Files', + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) + ); + return; + } + + try { + const converter = getLibreOfficeConverter(); + + showLoader('Loading engine...'); + await converter.initialize((progress: LoadProgress) => { + showLoader(progress.message, progress.percent); + }); + + if (state.files.length === 1) { + const file = state.files[0]; + showLoader(trText('Converting {{name}}...', { name: file.name })); + const pdfBlob = await converter.convertToPdf(file); + + const baseName = file.name.replace(/\.[^/.]+$/, ''); + downloadFile(pdfBlob, `${baseName}.pdf`); + + hideLoader(); + showAlert( + 'Conversion Complete', + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), + 'success', + () => resetState() + ); + } else { + showLoader('Converting multiple files...'); + const JSZip = (await import('jszip')).default; + const zip = new JSZip(); + + for (let i = 0; i < state.files.length; i++) { + const file = state.files[i]; + showLoader( + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) + ); + const pdfBlob = await converter.convertToPdf(file); + + const baseName = file.name.replace(/\.[^/.]+$/, ''); + zip.file(`${baseName}.pdf`, pdfBlob); + } + + const zipBlob = await zip.generateAsync({ type: 'blob' }); + downloadFile(zipBlob, `${FILETYPE_NAME.toLowerCase()}-to-pdf.zip`); + + hideLoader(); + showAlert( + 'Conversion Complete', + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), + 'success', + () => resetState() + ); + } + } catch (err) { + hideLoader(); + const message = + err instanceof Error ? err.message : trText('Unknown error'); + console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); + showAlert( + 'Error', + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) + ); + } + }; + + const handleFileSelect = (files: FileList | null) => { + if (files && files.length > 0) { + const validFiles = Array.from(files).filter((file) => { + const ext = '.' + file.name.split('.').pop()?.toLowerCase(); + return ACCEPTED_EXTENSIONS.includes(ext); + }); + if (validFiles.length > 0) { + state.files = [...state.files, ...validFiles]; + updateUI(); + } + } + }; + + if (fileInput && dropZone) { + fileInput.addEventListener('change', (e) => { + handleFileSelect((e.target as HTMLInputElement).files); + }); + + dropZone.addEventListener('dragover', (e) => { + e.preventDefault(); + dropZone.classList.add('bg-gray-700'); + }); + + dropZone.addEventListener('dragleave', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + }); + + dropZone.addEventListener('drop', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + handleFileSelect(e.dataTransfer?.files ?? null); + }); + + fileInput.addEventListener('click', () => { + fileInput.value = ''; + }); + } + + if (addMoreBtn) { + addMoreBtn.addEventListener('click', () => fileInput.click()); + } + + if (clearFilesBtn) { + clearFilesBtn.addEventListener('click', resetState); + } + + if (processBtn) { + processBtn.addEventListener('click', convert); + } + + updateUI(); }); diff --git a/src/js/logic/odt-to-pdf-page.ts b/src/js/logic/odt-to-pdf-page.ts index 1cb1d0a2..f1852633 100644 --- a/src/js/logic/odt-to-pdf-page.ts +++ b/src/js/logic/odt-to-pdf-page.ts @@ -7,7 +7,9 @@ import { type LoadProgress, } from '../utils/libreoffice-loader.js'; -document.addEventListener('DOMContentLoaded', () => { +import { trText, onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -113,7 +115,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -125,7 +129,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -143,7 +151,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ODT file(s) to PDF.`, + trText('Successfully converted {{length}} ODT file(s) to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -152,7 +162,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/organize-pdf-page.ts b/src/js/logic/organize-pdf-page.ts index e1ebd1c8..e3a1a2f8 100644 --- a/src/js/logic/organize-pdf-page.ts +++ b/src/js/logic/organize-pdf-page.ts @@ -9,6 +9,8 @@ import Sortable from 'sortablejs'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface OrganizeState { file: File | null; pdfDoc: PDFDocument | null; @@ -25,11 +27,7 @@ const organizeState: OrganizeState = { sortableInstance: null, }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -97,7 +95,10 @@ function applyCustomOrder() { if (newOrder.length !== currentGridCount) { showAlert( 'Incorrect Page Count', - `The number of pages specified (${newOrder.length}) does not match the current number of pages in the document (${currentGridCount}). Please provide a complete ordering for all pages.` + trText( + 'The number of pages specified ({{length}}) does not match the current number of pages in the document ({{currentGridCount}}). Please provide a complete ordering for all pages.', + { length: newOrder.length, currentGridCount } + ) ); return; } @@ -206,7 +207,10 @@ function updateFileDisplay() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(organizeState.file.size)} • ${organizeState.totalPages} pages`; + metaSpan.textContent = trText('{{size}} • {{totalPages}} pages', { + size: formatBytes(organizeState.file.size), + totalPages: organizeState.totalPages, + }); infoContainer.append(nameSpan, metaSpan); @@ -306,13 +310,13 @@ async function renderThumbnails() { const duplicateBtn = document.createElement('button'); duplicateBtn.className = 'duplicate-btn bg-green-600 hover:bg-green-700 text-white rounded-full w-8 h-8 flex items-center justify-center'; - duplicateBtn.title = 'Duplicate Page'; + duplicateBtn.title = trText('Duplicate Page'); duplicateBtn.innerHTML = ''; const deleteBtn = document.createElement('button'); deleteBtn.className = 'delete-btn bg-red-600 hover:bg-red-700 text-white rounded-full w-8 h-8 flex items-center justify-center'; - deleteBtn.title = 'Delete Page'; + deleteBtn.title = trText('Delete Page'); deleteBtn.innerHTML = ''; controlsDiv.append(duplicateBtn, deleteBtn); diff --git a/src/js/logic/overlay-pdf-page.ts b/src/js/logic/overlay-pdf-page.ts index 53e92c00..d85b2ca6 100644 --- a/src/js/logic/overlay-pdf-page.ts +++ b/src/js/logic/overlay-pdf-page.ts @@ -8,6 +8,8 @@ import { import { icons, createIcons } from 'lucide'; import type { OverlayPdfState, QpdfInstanceExtended } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: OverlayPdfState = { baseFile: null, overlayFile: null, @@ -119,7 +121,7 @@ async function processOverlay() { const loaderModal = document.getElementById('loader-modal'); const loaderText = document.getElementById('loader-text'); if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Initializing PDF engine...'; + if (loaderText) loaderText.textContent = trText('Initializing PDF engine...'); const inputPath = '/input_base.pdf'; const overlayPath = '/input_overlay.pdf'; @@ -129,7 +131,7 @@ async function processOverlay() { try { qpdf = await initializeQpdf(); - if (loaderText) loaderText.textContent = 'Reading files...'; + if (loaderText) loaderText.textContent = trText('Reading files...'); const baseBuffer = await readFileAsArrayBuffer(pageState.baseFile); const overlayBuffer = await readFileAsArrayBuffer(pageState.overlayFile); @@ -155,7 +157,9 @@ async function processOverlay() { const shouldRepeat = repeatCheckbox?.checked; if (loaderText) - loaderText.textContent = `Applying ${mode.replace('--', '')}...`; + loaderText.textContent = trText('Applying {{replace}}...', { + replace: mode.replace('--', ''), + }); const args = [inputPath, mode, overlayPath]; @@ -173,7 +177,7 @@ async function processOverlay() { const outputFile = qpdf.FS.readFile(outputPath, { encoding: 'binary' }); if (!outputFile || outputFile.length === 0) { - throw new Error('Processing produced an empty file.'); + throw new Error(trText('Processing produced an empty file.')); } const modeLabel = mode.replace('--', ''); @@ -184,7 +188,7 @@ async function processOverlay() { showAlert( 'Success', - `PDF ${modeLabel} applied successfully.`, + trText('PDF {{modeLabel}} applied successfully.', { modeLabel }), 'success', () => { resetState(); @@ -194,7 +198,9 @@ async function processOverlay() { console.error('Overlay/underlay error:', error); showAlert( 'Processing Failed', - `An error occurred: ${error instanceof Error ? error.message : 'Unknown error'}.` + trText('An error occurred: {{error}}.', { + error: error instanceof Error ? error.message : trText('Unknown error'), + }) ); } finally { try { @@ -247,7 +253,7 @@ function setupDropZone( }); } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const baseDropZone = document.getElementById('base-drop-zone'); const baseInput = document.getElementById( 'base-file-input' diff --git a/src/js/logic/page-dimensions-page.ts b/src/js/logic/page-dimensions-page.ts index a0d69298..aea845eb 100644 --- a/src/js/logic/page-dimensions-page.ts +++ b/src/js/logic/page-dimensions-page.ts @@ -13,6 +13,8 @@ import { } from '@/types'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; + const pageState: PageDimensionsState = { file: null, pdfDoc: null, @@ -88,17 +90,17 @@ function renderSummary() { let summaryHTML = `
    -

    Total Pages

    +

    ${trHtml('Total Pages')}

    ${stats.totalPages}

    -

    Unique Page Sizes

    +

    ${trHtml('Unique Page Sizes')}

    ${stats.uniqueSizesCount}

    -

    Document Type

    +

    ${trHtml('Document Type')}

    - ${stats.hasMixedSizes ? 'Mixed Sizes' : 'Uniform'} + ${stats.hasMixedSizes ? trText('Mixed Sizes') : trText('Uniform')}

    @@ -110,13 +112,13 @@ function renderSummary() {
    -

    Mixed Page Sizes Detected

    -

    This document contains pages with different dimensions:

    +

    ${trHtml('Mixed Page Sizes Detected')}

    +

    ${trHtml('This document contains pages with different dimensions:')}

      ${stats.uniqueSizes .map( (size: UniqueSizeEntry) => ` -
    • • ${size.label}: ${size.count} page${size.count > 1 ? 's' : ''}
    • +
    • ${size.count > 1 ? trHtml('• {{label}}: {{count}} pages', { label: size.label, count: size.count }) : trHtml('• {{label}}: 1 page', { label: size.label })}
    • ` ) .join('')} @@ -154,7 +156,11 @@ function renderTable(unit: string) { const dimensionsCell = document.createElement('td'); dimensionsCell.className = 'px-4 py-3 text-gray-300'; - dimensionsCell.textContent = `${width} x ${height} ${unit}`; + dimensionsCell.textContent = trText('{{width}} x {{height}} {{unit}}', { + width, + height, + unit, + }); const sizeCell = document.createElement('td'); sizeCell.className = 'px-4 py-3 text-gray-300'; @@ -174,7 +180,9 @@ function renderTable(unit: string) { const rotationCell = document.createElement('td'); rotationCell.className = 'px-4 py-3 text-gray-300'; - rotationCell.textContent = `${pageData.rotation}°`; + rotationCell.textContent = trText('{{rotation}}°', { + rotation: pageData.rotation, + }); row.append( pageNumCell, @@ -196,16 +204,20 @@ function exportToCSV() { const unit = unitsSelect?.value || 'pt'; const headers = [ - 'Page #', - `Width (${unit})`, - `Height (${unit})`, - 'Standard Size', - 'Orientation', - 'Aspect Ratio', - `Area (${unit}²)`, - 'Rotation', + trText('Page #'), + trText('Width ({{unit}})', { unit }), + trText('Height ({{unit}})', { unit }), + trText('Standard Size'), + trText('Orientation'), + trText('Aspect Ratio'), + trText('Area ({{unit}}²)', { unit }), + trText('Rotation'), ]; - const csvRows = [headers.join(',')]; + const csvCell = (value: string | number) => { + const text = String(value); + return /[",\n]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text; + }; + const csvRows = [headers.map(csvCell).join(',')]; analyzedPagesData.forEach((pageData) => { const width = convertPoints(pageData.width, unit); @@ -223,7 +235,7 @@ function exportToCSV() { area, `${pageData.rotation}°`, ]; - csvRows.push(row.join(',')); + csvRows.push(row.map(csvCell).join(',')); }); const csvContent = csvRows.join('\n'); @@ -252,8 +264,11 @@ function analyzeAndDisplayDimensions() { pageNum: index + 1, width, height, - orientation: width > height ? 'Landscape' : 'Portrait', - standardSize: getStandardPageName(width, height), + orientation: width > height ? trText('Landscape') : trText('Portrait'), + standardSize: (() => { + const name = getStandardPageName(width, height); + return name === 'Custom' ? trText('Custom') : name; + })(), rotation: rotation, }); }); @@ -357,7 +372,7 @@ async function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const backBtn = document.getElementById('back-to-tools'); diff --git a/src/js/logic/page-numbers-page.ts b/src/js/logic/page-numbers-page.ts index e478c3e9..cc3a4837 100644 --- a/src/js/logic/page-numbers-page.ts +++ b/src/js/logic/page-numbers-page.ts @@ -10,6 +10,8 @@ import { } from '../utils/pdf-operations.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface PageState { file: File | null; pdfDoc: PDFLibDocument | null; @@ -20,11 +22,7 @@ const pageState: PageState = { pdfDoc: null, }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -122,7 +120,10 @@ function updateFileDisplay() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.pdfDoc.getPageCount()} pages`; + metaSpan.textContent = trText('{{size}} • {{getPageCount}} pages', { + size: formatBytes(pageState.file.size), + getPageCount: pageState.pdfDoc.getPageCount(), + }); infoContainer.append(nameSpan, metaSpan); diff --git a/src/js/logic/pages-to-pdf-page.ts b/src/js/logic/pages-to-pdf-page.ts index 9831c56f..22e45be8 100644 --- a/src/js/logic/pages-to-pdf-page.ts +++ b/src/js/logic/pages-to-pdf-page.ts @@ -8,10 +8,12 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.pages']; const FILETYPE_NAME = 'Pages'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -90,7 +92,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -105,7 +109,7 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); @@ -114,7 +118,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -127,7 +133,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -145,7 +155,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} files to PDF.`, + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -155,7 +167,9 @@ document.addEventListener('DOMContentLoaded', () => { console.error(`[${FILETYPE_NAME}ToPDF] Error:`, e); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/pdf-booklet-page.ts b/src/js/logic/pdf-booklet-page.ts index bb0f1ba2..9550a2f4 100644 --- a/src/js/logic/pdf-booklet-page.ts +++ b/src/js/logic/pdf-booklet-page.ts @@ -7,6 +7,8 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; + interface BookletState { file: File | null; pdfDoc: PDFLibDocument | null; @@ -38,8 +40,7 @@ function resetState() { const previewArea = document.getElementById('booklet-preview'); if (previewArea) - previewArea.innerHTML = - '

      Upload a PDF and click "Generate Preview" to see the booklet layout

      '; + previewArea.innerHTML = `

      ${trHtml('Upload a PDF and click "Generate Preview" to see the booklet layout')}

      `; const downloadBtn = document.getElementById( 'download-btn' @@ -69,7 +70,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -100,7 +103,10 @@ async function updateUI() { hideLoader(); const pageCount = pageState.pdfDoc.getPageCount(); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); if (toolOptions) toolOptions.classList.remove('hidden'); @@ -197,8 +203,7 @@ async function generatePreview() { const canvasWidth = containerWidth; const canvasHeight = containerWidth / aspectRatio; - previewArea.innerHTML = - '

      Generating preview...

      '; + previewArea.innerHTML = `

      ${trHtml('Generating preview...')}

      `; const totalRounded = isBookletMode ? Math.ceil(totalPages / 4) * 4 @@ -234,7 +239,7 @@ async function generatePreview() { } } - previewArea.innerHTML = `

      ${totalPages} pages → ${numSheets} output sheets

      `; + previewArea.innerHTML = `

      ${trHtml('{{totalPages}} pages → {{numSheets}} output sheets', { totalPages, numSheets })}

      `; for (let sheetIndex = 0; sheetIndex < numSheets; sheetIndex++) { const canvas = document.createElement('canvas'); @@ -375,9 +380,16 @@ async function generatePreview() { ctx.font = 'bold 10px sans-serif'; ctx.textAlign = 'right'; ctx.textBaseline = 'top'; - const sideLabel = isBookletMode ? (isFront ? 'Front' : 'Back') : ''; + const sideLabel = isBookletMode + ? isFront + ? trText('Front') + : trText('Back') + : ''; ctx.fillText( - `Sheet ${Math.floor(sheetIndex / (isBookletMode ? 2 : 1)) + 1} ${sideLabel}`, + trText('Sheet {{n}} {{sideLabel}}', { + n: Math.floor(sheetIndex / (isBookletMode ? 2 : 1)) + 1, + sideLabel, + }), canvasWidth - 6, 4 ); @@ -527,7 +539,7 @@ async function createBooklet() { showAlert( 'Success', - `Booklet created with ${numSheets} sheets!`, + trText('Booklet created with {{numSheets}} sheets!', { numSheets }), 'success', function () { resetState(); @@ -554,7 +566,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const previewBtn = document.getElementById('preview-btn'); diff --git a/src/js/logic/pdf-layers-page.ts b/src/js/logic/pdf-layers-page.ts index d37e40ad..a7508531 100644 --- a/src/js/logic/pdf-layers-page.ts +++ b/src/js/logic/pdf-layers-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, trHtml, onPageReady } from '../i18n/i18n'; import { downloadFile, escapeHtml, @@ -41,7 +41,7 @@ let currentDoc: PyMuPDFDocument | null = null; const layersMap = new Map(); let nextDisplayOrder = 0; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -75,7 +75,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(currentFile.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(currentFile.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -93,10 +96,15 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(currentFile); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(currentFile.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(currentFile.size), + numPages: pdfDoc.numPages, + }); } catch (error) { console.error('Error loading PDF:', error); - metaSpan.textContent = `${formatBytes(currentFile.size)} • Could not load page count`; + metaSpan.textContent = trText('{{size}} • Could not load page count', { + size: formatBytes(currentFile.size), + }); } createIcons({ icons }); @@ -191,8 +199,8 @@ document.addEventListener('DOMContentLoaded', () => { if (layersArray.length === 0) { layersList.innerHTML = `
      -

      This PDF has no layers (OCG).

      -

      Add a new layer to get started!

      +

      ${trHtml('This PDF has no layers (OCG).')}

      +

      ${trHtml('Add a new layer to get started!')}

      `; return; @@ -209,12 +217,12 @@ document.addEventListener('DOMContentLoaded', () => {
      - ${!layer.locked ? `` : ''} - ${!layer.locked ? `` : ''} + ${!layer.locked ? `` : ''} + ${!layer.locked ? `` : ''}
      ` @@ -280,8 +288,10 @@ document.addEventListener('DOMContentLoaded', () => { ); const childName = await promptForInput( - 'Add Child Layer', - `Enter name for child layer under "${parentLayer?.text || 'Layer'}":` + trText('Add Child Layer'), + trText('Enter name for child layer under "{{Layer}}":', { + Layer: parentLayer?.text || 'Layer', + }) ); if (!childName || !childName.trim()) return; @@ -328,7 +338,9 @@ document.addEventListener('DOMContentLoaded', () => { showLoader('Loading engine...'); const pymupdf = await loadPyMuPDF(); - showLoader(`Loading layers from ${currentFile.name}...`); + showLoader( + trText('Loading layers from {{name}}...', { name: currentFile.name }) + ); currentDoc = await ( pymupdf as { open: (file: File) => Promise } ).open(currentFile); diff --git a/src/js/logic/pdf-multi-tool.ts b/src/js/logic/pdf-multi-tool.ts index 6761c74d..30d08779 100644 --- a/src/js/logic/pdf-multi-tool.ts +++ b/src/js/logic/pdf-multi-tool.ts @@ -15,7 +15,7 @@ import { repairPdfFile } from './repair-pdf.js'; import { partitionIncomingFiles } from '../utils/multi-tool-file-input.js'; import { convertImagesToPdfFile } from '../utils/images-to-pdf-lib.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; @@ -85,8 +85,8 @@ function showModal( if (!modal || !modalTitle || !modalMessage || !modalIcon) return; - modalTitle.textContent = title; - modalMessage.textContent = message; + modalTitle.textContent = trText(title); + modalMessage.textContent = trText(message); const iconMap = { info: 'info', @@ -162,17 +162,7 @@ function hideLoading() { if (loader) loader.classList.add('hidden'); } -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', () => { - console.log('PDF Multi Tool: DOMContentLoaded'); - initializeTool(); - }); -} else { - console.log( - 'PDF Multi Tool: DOMContentLoaded already fired, initializing immediately' - ); - initializeTool(); -} +onPageReady(initializeTool); function initializeTool() { console.log('PDF Multi Tool: Initializing...'); @@ -514,7 +504,9 @@ async function loadPdfs(files: File[]) { console.log(`Repairing ${file.name}...`); const loadingText = document.getElementById('loading-text'); if (loadingText) - loadingText.textContent = `Repairing ${file.name}...`; + loadingText.textContent = trText('Repairing {{name}}...', { + name: file.name, + }); const repairedData = await repairPdfFile(file); if (repairedData) { @@ -680,7 +672,10 @@ function createPageElement( // Page info const info = document.createElement('div'); info.className = 'text-xs text-gray-400 text-center mb-2'; - info.textContent = `${t('common.page')} ${index + 1}`; + info.textContent = trText('{{page}} {{n}}', { + page: t('common.page'), + n: index + 1, + }); // Actions toolbar const actions = document.createElement('div'); @@ -1026,7 +1021,7 @@ async function handleInsertPdf(e: Event) { console.error('Failed to insert PDF:', e); showModal( 'Error', - 'Failed to insert PDF. The file may be corrupted.', + trText('Failed to insert PDF. The file may be corrupted.'), 'error' ); } @@ -1085,7 +1080,11 @@ function addBlankPage() { function bulkRotate(delta: number) { if (selectedPages.size === 0) { - showModal('No Selection', 'Please select pages to rotate.', 'info'); + showModal( + trText('No Selection'), + trText('Please select pages to rotate.'), + 'info' + ); return; } @@ -1117,7 +1116,11 @@ function bulkRotate(delta: number) { function bulkDelete() { if (selectedPages.size === 0) { - showModal('No Selection', 'Please select pages to delete.', 'info'); + showModal( + trText('No Selection'), + trText('Please select pages to delete.'), + 'info' + ); return; } const indices = Array.from(selectedPages).sort((a, b) => b - a); @@ -1134,7 +1137,11 @@ function bulkDelete() { function bulkDuplicate() { if (selectedPages.size === 0) { - showModal('No Selection', 'Please select pages to duplicate.', 'info'); + showModal( + trText('No Selection'), + trText('Please select pages to duplicate.'), + 'info' + ); return; } const indices = Array.from(selectedPages).sort((a, b) => b - a); @@ -1148,8 +1155,8 @@ function bulkDuplicate() { function bulkSplit() { if (selectedPages.size === 0) { showModal( - 'No Selection', - 'Please select pages to mark for splitting.', + trText('No Selection'), + trText('Please select pages to mark for splitting.'), 'info' ); return; @@ -1167,7 +1174,7 @@ function bulkSplit() { async function downloadAll() { if (allPages.length === 0) { - showModal('No Pages', 'Please upload PDFs first.', 'info'); + showModal(trText('No Pages'), trText('Please upload PDFs first.'), 'info'); return; } @@ -1278,12 +1285,14 @@ async function downloadSplitPdfs() { showModal( 'Success', - `Downloaded ${segments.length} PDF files in a ZIP archive.`, + trText('Downloaded {{length}} PDF files in a ZIP archive.', { + length: segments.length, + }), 'success' ); } catch (e) { console.error('Failed to create split PDFs:', e); - showModal('Error', 'Failed to create split PDFs.', 'error'); + showModal('Error', trText('Failed to create split PDFs.'), 'error'); } finally { hideLoading(); // Ensure loader is hidden if we used it (though showModal replaces it) } @@ -1358,10 +1367,10 @@ async function downloadPagesAsPdf(indices: number[], filename: string) { }); downloadFile(blob, filename); - showModal('Success', 'PDF downloaded successfully.', 'success'); + showModal('Success', trText('PDF downloaded successfully.'), 'success'); } catch (e) { console.error('Failed to create PDF:', e); - showModal('Error', 'Failed to create PDF.', 'error'); + showModal('Error', trText('Failed to create PDF.'), 'error'); } } @@ -1400,7 +1409,7 @@ function updatePageDisplay() { const info = card.querySelector( '.text-xs.text-gray-400.text-center.mb-2' ); - if (info) info.textContent = `Page ${index + 1} `; + if (info) info.textContent = trText('Page {{n}} ', { n: index + 1 }); // Update selection state const selectBtn = card.querySelector( @@ -1508,7 +1517,7 @@ function updatePageNumbers() { // Update visible page number text const info = card.querySelector('.text-xs.text-gray-400.text-center.mb-2'); if (info) { - info.textContent = `Page ${index + 1} `; + info.textContent = trText('Page {{n}} ', { n: index + 1 }); } // Re-attach event listeners for buttons diff --git a/src/js/logic/pdf-to-bmp-page.ts b/src/js/logic/pdf-to-bmp-page.ts index bb53af40..1d499127 100644 --- a/src/js/logic/pdf-to-bmp-page.ts +++ b/src/js/logic/pdf-to-bmp-page.ts @@ -10,7 +10,7 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; import { PDFPageProxy } from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -42,7 +42,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; // Initial state + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); // Initial state infoContainer.append(nameSpan, metaSpan); @@ -65,7 +68,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch((e) => { console.warn('Error loading PDF page count:', e); @@ -154,7 +161,7 @@ async function renderPage(page: PDFPageProxy): Promise { return blob; } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-to-cbz-page.ts b/src/js/logic/pdf-to-cbz-page.ts index 599ff05a..761bca84 100644 --- a/src/js/logic/pdf-to-cbz-page.ts +++ b/src/js/logic/pdf-to-cbz-page.ts @@ -10,7 +10,7 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; import { PDFPageProxy } from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { generateComicInfoXml, generateMetadataOpf, @@ -112,7 +112,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -131,7 +134,11 @@ const updateUI = () => { readFileAsArrayBuffer(file) .then((buffer) => getPDFDocument(buffer).promise) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch(() => { metaSpan.textContent = formatBytes(file.size); @@ -180,7 +187,7 @@ async function renderPage( const viewport = page.getViewport({ scale: options.scale }); const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); - if (!context) throw new Error('Failed to acquire 2D canvas context'); + if (!context) throw new Error(trText('Failed to acquire 2D canvas context')); canvas.height = viewport.height; canvas.width = viewport.width; @@ -233,7 +240,7 @@ async function convert() { const { pdf } = result; if (pdf.numPages === 0) { - throw new Error('PDF has no pages'); + throw new Error(trText('PDF has no pages')); } const zip = new JSZip(); @@ -292,7 +299,7 @@ async function convert() { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -320,13 +327,17 @@ document.addEventListener('DOMContentLoaded', () => { if (qualitySlider && qualityValue) { qualitySlider.addEventListener('input', () => { - qualityValue.textContent = `${qualitySlider.value}%`; + qualityValue.textContent = trText('{{value}}%', { + value: qualitySlider.value, + }); }); } if (scaleSlider && scaleValue) { scaleSlider.addEventListener('input', () => { - scaleValue.textContent = `${parseFloat(scaleSlider.value).toFixed(1)}x`; + scaleValue.textContent = trText('{{value}}x', { + value: parseFloat(scaleSlider.value).toFixed(1), + }); }); } @@ -398,7 +409,7 @@ document.addEventListener('DOMContentLoaded', () => { setInputValidity( yearInput, !isNaN(year) && year >= 1900 && year <= 2100, - 'Year must be between 1900 and 2100' + trText('Year must be between 1900 and 2100') ); }); } @@ -414,7 +425,7 @@ document.addEventListener('DOMContentLoaded', () => { setInputValidity( ratingInput, !isNaN(rating) && rating >= 0 && rating <= 5, - 'Rating must be between 0 and 5' + trText('Rating must be between 0 and 5') ); }); } @@ -429,7 +440,7 @@ document.addEventListener('DOMContentLoaded', () => { setInputValidity( numberInput, !isNaN(parseFloat(val)) && parseFloat(val) >= 0, - 'Must be a positive number' + trText('Must be a positive number') ); }); } @@ -445,7 +456,7 @@ document.addEventListener('DOMContentLoaded', () => { setInputValidity( volumeInput, !isNaN(vol) && vol >= 1, - 'Must be a positive integer' + trText('Must be a positive integer') ); }); } diff --git a/src/js/logic/pdf-to-csv-page.ts b/src/js/logic/pdf-to-csv-page.ts index 97049535..f2c25eb6 100644 --- a/src/js/logic/pdf-to-csv-page.ts +++ b/src/js/logic/pdf-to-csv-page.ts @@ -3,6 +3,8 @@ import { downloadFile, formatBytes } from '../utils/helpers.js'; import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let file: File | null = null; const updateUI = () => { @@ -100,7 +102,12 @@ async function convert() { const allRows: (string | null)[][] = []; for (let i = 0; i < pageCount; i++) { - showLoader(`Scanning page ${i + 1} of ${pageCount}...`); + showLoader( + trText('Scanning page {{n}} of {{pageCount}}...', { + n: i + 1, + pageCount, + }) + ); const page = doc.getPage(i); const tables = page.findTables(); @@ -126,14 +133,17 @@ async function convert() { ); } catch (e) { console.error(e); - const message = e instanceof Error ? e.message : 'Unknown error'; - showAlert('Error', `Failed to convert PDF to CSV. ${message}`); + const message = e instanceof Error ? e.message : trText('Unknown error'); + showAlert( + 'Error', + trText('Failed to convert PDF to CSV. {{message}}', { message }) + ); } finally { hideLoader(); } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-to-excel-page.ts b/src/js/logic/pdf-to-excel-page.ts index 1fb75422..24464d16 100644 --- a/src/js/logic/pdf-to-excel-page.ts +++ b/src/js/logic/pdf-to-excel-page.ts @@ -4,6 +4,8 @@ import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import * as XLSX from 'xlsx'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let file: File | null = null; const updateUI = () => { @@ -86,7 +88,12 @@ async function convert() { const allTables: TableData[] = []; for (let i = 0; i < pageCount; i++) { - showLoader(`Scanning page ${i + 1} of ${pageCount}...`); + showLoader( + trText('Scanning page {{n}} of {{pageCount}}...', { + n: i + 1, + pageCount, + }) + ); const page = doc.getPage(i); const tables = page.findTables(); @@ -112,10 +119,10 @@ async function convert() { XLSX.utils.book_append_sheet(workbook, worksheet, 'Table'); } else { allTables.forEach((table, idx) => { - const sheetName = `Table ${idx + 1} (Page ${table.page})`.substring( - 0, - 31 - ); + const sheetName = trText('Table {{n}} (Page {{page}})', { + n: idx + 1, + page: table.page, + }).substring(0, 31); const worksheet = XLSX.utils.aoa_to_sheet(table.rows); XLSX.utils.book_append_sheet(workbook, worksheet, sheetName); }); @@ -128,20 +135,25 @@ async function convert() { downloadFile(blob, `${baseName}.xlsx`); showAlert( 'Success', - `Extracted ${allTables.length} table(s) to Excel!`, + trText('Extracted {{length}} table(s) to Excel!', { + length: allTables.length, + }), 'success', resetState ); } catch (e) { console.error(e); - const message = e instanceof Error ? e.message : 'Unknown error'; - showAlert('Error', `Failed to convert PDF to Excel. ${message}`); + const message = e instanceof Error ? e.message : trText('Unknown error'); + showAlert( + 'Error', + trText('Failed to convert PDF to Excel. {{message}}', { message }) + ); } finally { hideLoader(); } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-to-greyscale-page.ts b/src/js/logic/pdf-to-greyscale-page.ts index fc0bd933..9712dcc4 100644 --- a/src/js/logic/pdf-to-greyscale-page.ts +++ b/src/js/logic/pdf-to-greyscale-page.ts @@ -9,7 +9,7 @@ import { createIcons, icons } from 'lucide'; import { PDFDocument } from 'pdf-lib'; import { applyGreyscale } from '../utils/image-effects.js'; import * as pdfjsLib from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -42,7 +42,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; // Initial state + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); // Initial state infoContainer.append(nameSpan, metaSpan); @@ -64,7 +67,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch((e) => { console.warn('Error loading PDF page count:', e); @@ -159,7 +166,7 @@ async function convert() { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-to-jpg-page.ts b/src/js/logic/pdf-to-jpg-page.ts index 33a7dfd8..9061681b 100644 --- a/src/js/logic/pdf-to-jpg-page.ts +++ b/src/js/logic/pdf-to-jpg-page.ts @@ -10,7 +10,7 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; import { PDFPageProxy } from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -42,7 +42,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; // Initial state + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); // Initial state infoContainer.append(nameSpan, metaSpan); @@ -64,7 +67,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch((e) => { console.warn('Error loading PDF page count:', e); @@ -167,7 +174,7 @@ async function renderPage( return blob; } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -185,7 +192,9 @@ document.addEventListener('DOMContentLoaded', () => { if (qualitySlider && qualityValue) { qualitySlider.addEventListener('input', () => { - qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`; + qualityValue.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(qualitySlider.value) * 100), + }); }); } diff --git a/src/js/logic/pdf-to-markdown-page.ts b/src/js/logic/pdf-to-markdown-page.ts index 8d166b51..6038397e 100644 --- a/src/js/logic/pdf-to-markdown-page.ts +++ b/src/js/logic/pdf-to-markdown-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { downloadFile, readFileAsArrayBuffer, @@ -12,7 +12,7 @@ import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -54,7 +54,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -73,9 +76,15 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(file); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(file.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(file.size), + numPages: pdfDoc.numPages, + }); } catch { - metaSpan.textContent = `${formatBytes(file.size)} • Could not load page count`; + metaSpan.textContent = trText( + '{{size}} • Could not load page count', + { size: formatBytes(file.size) } + ); } } @@ -115,7 +124,7 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const markdown = await pymupdf.pdfToMarkdown(file, { includeImages }); const outName = file.name.replace(/\.pdf$/i, '') + '.md'; @@ -126,7 +135,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to Markdown.`, + trText('Successfully converted {{name}} to Markdown.', { + name: file.name, + }), 'success', () => resetState() ); @@ -138,7 +149,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const markdown = await pymupdf.pdfToMarkdown(file, { includeImages }); @@ -155,7 +170,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} PDF(s) to Markdown.`, + trText('Successfully converted {{length}} PDF(s) to Markdown.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -164,7 +181,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/pdf-to-pdfa-page.ts b/src/js/logic/pdf-to-pdfa-page.ts index 25a17628..f4a0deb5 100644 --- a/src/js/logic/pdf-to-pdfa-page.ts +++ b/src/js/logic/pdf-to-pdfa-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { downloadFile, readFileAsArrayBuffer, @@ -15,7 +15,7 @@ import { showWasmRequiredDialog } from '../utils/wasm-provider.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -57,7 +57,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -76,10 +79,16 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(file); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(file.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(file.size), + numPages: pdfDoc.numPages, + }); } catch (error) { console.error('Error loading PDF:', error); - metaSpan.textContent = `${formatBytes(file.size)} • Could not load page count`; + metaSpan.textContent = trText( + '{{size}} • Could not load page count', + { size: formatBytes(file.size) } + ); } } @@ -164,7 +173,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to ${level}.`, + trText('Successfully converted {{name}} to {{level}}.', { + name: originalFile.name, + level, + }), 'success', () => resetState() ); @@ -177,7 +189,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const convertedBlob = await convertFileToPdfA(file, level, (msg) => @@ -201,7 +217,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} PDF(s) to ${level}.`, + trText('Successfully converted {{length}} PDF(s) to {{level}}.', { + length: state.files.length, + level, + }), 'success', () => resetState() ); @@ -210,7 +229,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/pdf-to-png-page.ts b/src/js/logic/pdf-to-png-page.ts index 8401ea48..32850971 100644 --- a/src/js/logic/pdf-to-png-page.ts +++ b/src/js/logic/pdf-to-png-page.ts @@ -10,7 +10,7 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; import { PDFPageProxy } from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -42,7 +42,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; // Initial state + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); // Initial state infoContainer.append(nameSpan, metaSpan); @@ -64,7 +67,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch((e) => { console.warn('Error loading PDF page count:', e); @@ -163,7 +170,7 @@ async function renderPage( return blob; } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -179,7 +186,9 @@ document.addEventListener('DOMContentLoaded', () => { if (scaleSlider && scaleValue) { scaleSlider.addEventListener('input', () => { - scaleValue.textContent = `${parseFloat(scaleSlider.value).toFixed(1)}x`; + scaleValue.textContent = trText('{{value}}x', { + value: parseFloat(scaleSlider.value).toFixed(1), + }); }); } diff --git a/src/js/logic/pdf-to-svg-page.ts b/src/js/logic/pdf-to-svg-page.ts index 6132a1b7..9b59cc21 100644 --- a/src/js/logic/pdf-to-svg-page.ts +++ b/src/js/logic/pdf-to-svg-page.ts @@ -7,6 +7,8 @@ import type { PyMuPDFInstance } from '@/types'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { showWasmRequiredDialog } from '../utils/wasm-provider.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let pymupdf: PyMuPDFInstance | null = null; let files: File[] = []; @@ -114,7 +116,12 @@ async function convert() { } else { const zip = new JSZip(); for (let i = 0; i < pageCount; i++) { - showLoader(`Converting page ${i + 1} of ${pageCount}...`); + showLoader( + trText('Converting page {{n}} of {{pageCount}}...', { + n: i + 1, + pageCount, + }) + ); const page = doc.getPage(i); const svgContent = page.toSvg(); zip.file(`page_${i + 1}.svg`, svgContent); @@ -124,7 +131,7 @@ async function convert() { downloadFile(zipBlob, `${baseName}_svg.zip`); showAlert( 'Success', - `Converted ${pageCount} pages to SVG!`, + trText('Converted {{pageCount}} pages to SVG!', { pageCount }), 'success', () => resetState() ); @@ -135,14 +142,24 @@ async function convert() { for (let f = 0; f < files.length; f++) { const file = files[f]; - showLoader(`Processing file ${f + 1} of ${files.length}...`); + showLoader( + trText('Processing file {{n}} of {{length}}...', { + n: f + 1, + length: files.length, + }) + ); const doc = await pymupdf.open(file); const pageCount = doc.pageCount; const baseName = file.name.replace(/\.[^/.]+$/, ''); for (let i = 0; i < pageCount; i++) { showLoader( - `File ${f + 1}/${files.length}: Page ${i + 1}/${pageCount}` + trText('File {{n}}/{{length}}: Page {{n2}}/{{pageCount}}', { + n: f + 1, + length: files.length, + n2: i + 1, + pageCount, + }) ); const page = doc.getPage(i); const svgContent = page.toSvg(); @@ -160,21 +177,27 @@ async function convert() { downloadFile(zipBlob, 'pdf_to_svg.zip'); showAlert( 'Success', - `Converted ${files.length} files (${totalPages} pages) to SVG!`, + trText('Converted {{length}} files ({{totalPages}} pages) to SVG!', { + length: files.length, + totalPages, + }), 'success', () => resetState() ); } } catch (e) { console.error(e); - const message = e instanceof Error ? e.message : 'Unknown error'; - showAlert('Error', `Failed to convert PDF to SVG. ${message}`); + const message = e instanceof Error ? e.message : trText('Unknown error'); + showAlert( + 'Error', + trText('Failed to convert PDF to SVG. {{message}}', { message }) + ); } finally { hideLoader(); } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-to-text-page.ts b/src/js/logic/pdf-to-text-page.ts index b796e2b2..6d1edc74 100644 --- a/src/js/logic/pdf-to-text-page.ts +++ b/src/js/logic/pdf-to-text-page.ts @@ -6,14 +6,12 @@ import type { PyMuPDFInstance } from '@/types'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; let pymupdf: PyMuPDFInstance | null = null; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -135,7 +133,9 @@ function updateUI() { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); @@ -182,7 +182,9 @@ async function extractText() { if (files.length === 1) { const file = files[0]; - showLoader(`Extracting text from ${file.name}...`); + showLoader( + trText('Extracting text from {{name}}...', { name: file.name }) + ); const fullText = await mupdf.pdfToText(file); @@ -206,7 +208,11 @@ async function extractText() { for (let i = 0; i < files.length; i++) { const file = files[i]; showLoader( - `Extracting text from file ${i + 1}/${files.length}: ${file.name}...` + trText('Extracting text from file {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: files.length, + name: file.name, + }) ); const fullText = await mupdf.pdfToText(file); @@ -222,7 +228,9 @@ async function extractText() { hideLoader(); showAlert( 'Success', - `Extracted text from ${files.length} PDF files!`, + trText('Extracted text from {{length}} PDF files!', { + length: files.length, + }), 'success', () => { resetState(); diff --git a/src/js/logic/pdf-to-tiff-page.ts b/src/js/logic/pdf-to-tiff-page.ts index a4b444f3..18c160fc 100644 --- a/src/js/logic/pdf-to-tiff-page.ts +++ b/src/js/logic/pdf-to-tiff-page.ts @@ -10,7 +10,7 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; import { PDFPageProxy } from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import type Vips from 'wasm-vips'; import wasmUrl from 'wasm-vips/vips.wasm?url'; import type { TiffOptions } from '@/types'; @@ -82,7 +82,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -103,7 +106,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch((e) => { console.warn('Error loading PDF page count:', e); @@ -377,7 +384,7 @@ async function convert() { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-to-webp-page.ts b/src/js/logic/pdf-to-webp-page.ts index 93b08e97..2af6ef19 100644 --- a/src/js/logic/pdf-to-webp-page.ts +++ b/src/js/logic/pdf-to-webp-page.ts @@ -10,7 +10,7 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; import { PDFPageProxy } from 'pdfjs-dist'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -42,7 +42,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; // Initial state + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); // Initial state infoContainer.append(nameSpan, metaSpan); @@ -64,7 +67,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch((e) => { console.warn('Error loading PDF page count:', e); @@ -167,7 +174,7 @@ async function renderPage( return blob; } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -185,7 +192,9 @@ document.addEventListener('DOMContentLoaded', () => { if (qualitySlider && qualityValue) { qualitySlider.addEventListener('input', () => { - qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`; + qualityValue.textContent = trText('{{value}}%', { + value: Math.round(parseFloat(qualitySlider.value) * 100), + }); }); } diff --git a/src/js/logic/pdf-to-word-page.ts b/src/js/logic/pdf-to-word-page.ts index c79e6e45..af0bd646 100644 --- a/src/js/logic/pdf-to-word-page.ts +++ b/src/js/logic/pdf-to-word-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { downloadFile, readFileAsArrayBuffer, @@ -13,7 +13,7 @@ import { normalizeCmykForDocx } from '../utils/ghostscript-loader.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -52,7 +52,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -71,9 +74,15 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(file); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(file.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(file.size), + numPages: pdfDoc.numPages, + }); } catch { - metaSpan.textContent = `${formatBytes(file.size)} • Could not load page count`; + metaSpan.textContent = trText( + '{{size}} • Could not load page count', + { size: formatBytes(file.size) } + ); } } @@ -111,7 +120,7 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const docxBlob = await pymupdf.pdfToDocx( await normalizeCmykForDocx(file) @@ -123,7 +132,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to DOCX.`, + trText('Successfully converted {{name}} to DOCX.', { + name: file.name, + }), 'success', () => resetState() ); @@ -135,7 +146,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const docxBlob = await pymupdf.pdfToDocx( @@ -158,7 +173,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} PDF(s) to DOCX.`, + trText('Successfully converted {{length}} PDF(s) to DOCX.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -167,7 +184,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/pdf-to-zip-page.ts b/src/js/logic/pdf-to-zip-page.ts index 1085bf3d..701a15e0 100644 --- a/src/js/logic/pdf-to-zip-page.ts +++ b/src/js/logic/pdf-to-zip-page.ts @@ -4,6 +4,8 @@ import { createIcons, icons } from 'lucide'; import JSZip from 'jszip'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface PdfToZipState { files: File[]; } @@ -89,7 +91,13 @@ async function createZipArchive() { for (let i = 0; i < pageState.files.length; i++) { const file = pageState.files[i]; - showLoader(`Adding ${file.name} (${i + 1}/${pageState.files.length})...`); + showLoader( + trText('Adding {{name}} ({{n}}/{{length}})...', { + name: file.name, + n: i + 1, + length: pageState.files.length, + }) + ); const arrayBuffer = await file.arrayBuffer(); const zipEntryName = deduplicateFileName(file.name, usedNames); zip.file(zipEntryName, arrayBuffer); @@ -130,7 +138,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/pdf-workflow-page.ts b/src/js/logic/pdf-workflow-page.ts index 09b200f0..dafc83ff 100644 --- a/src/js/logic/pdf-workflow-page.ts +++ b/src/js/logic/pdf-workflow-page.ts @@ -3,6 +3,7 @@ import { createWorkflowEditor, updateNodeDisplay } from '@/js/workflow/editor'; import type { WorkflowEditor } from '@/js/workflow/editor'; import { executeWorkflow } from '@/js/workflow/engine'; import { translateCategory, translateNodeLabel } from '@/js/workflow/i18n'; +import { onPageReady, trText } from '@/js/i18n/i18n.js'; import type { NodeCategory } from '@/js/workflow/types'; import { type BaseWorkflowNode, @@ -51,11 +52,7 @@ let workflowEditor: WorkflowEditor | null = null; let selectedNodeId: string | null = null; let deleteNodeHandler: EventListener | null = null; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); async function initializePage() { const container = document.getElementById('rete-container'); @@ -104,12 +101,14 @@ async function initializePage() { try { await executeWorkflow(editor, engine, area, (progress) => { - const msg = progress.message || `Processing ${progress.nodeName}...`; + const msg = + progress.message || + trText('Processing {{nodeName}}...', { nodeName: progress.nodeName }); if (statusText) statusText.textContent = msg; }); - if (statusText) statusText.textContent = 'Workflow completed'; + if (statusText) statusText.textContent = trText('Workflow completed'); } catch (err) { - if (statusText) statusText.textContent = 'Error during execution'; + if (statusText) statusText.textContent = trText('Error during execution'); showAlert('Error', (err as Error).message); } finally { runBtn.disabled = false; @@ -121,7 +120,7 @@ async function initializePage() { await editor.clear(); updateNodeCount(); const statusText = document.getElementById('status-text'); - if (statusText) statusText.textContent = 'Ready'; + if (statusText) statusText.textContent = trText('Ready'); document.getElementById('settings-sidebar')?.classList.add('hidden'); }); @@ -290,7 +289,11 @@ function updateNodeCount() { if (!workflowEditor) return; const count = workflowEditor.editor.getNodes().length; const el = document.getElementById('node-count'); - if (el) el.textContent = `${count} node${count !== 1 ? 's' : ''}`; + if (el) + el.textContent = + count !== 1 + ? trText('{{count}} nodes', { count }) + : trText('{{count}} node', { count }); } function showSaveTemplateModal( @@ -320,18 +323,22 @@ function showSaveTemplateModal( const doSave = () => { const name = nameInput.value.trim(); if (!name) { - errorEl.textContent = 'Please enter a name.'; + errorEl.textContent = trText('Please enter a name.'); errorEl.classList.remove('hidden'); return; } if (templateNameExists(name)) { - errorEl.textContent = 'A template with this name already exists.'; + errorEl.textContent = trText('A template with this name already exists.'); errorEl.classList.remove('hidden'); return; } saveWorkflow(editor, area, name); cleanup(); - showAlert('Saved', `Template "${name}" saved.`, 'success'); + showAlert( + 'Saved', + trText('Template "{{name}}" saved.', { name }), + 'success' + ); }; const onKeydown = (e: KeyboardEvent) => { @@ -381,13 +388,17 @@ function showLoadTemplateModal( const loadBtn = document.createElement('button'); loadBtn.className = 'bg-indigo-600 hover:bg-indigo-500 text-white text-xs font-medium px-3 py-1.5 rounded-md transition-colors flex-shrink-0'; - loadBtn.textContent = 'Load'; + loadBtn.textContent = trText('Load'); loadBtn.addEventListener('click', async () => { const loaded = await loadWorkflow(editor, area, name); cleanup(); if (loaded) { updateNodeCount(); - showAlert('Loaded', `Template "${name}" loaded.`, 'success'); + showAlert( + 'Loaded', + trText('Template "{{name}}" loaded.', { name }), + 'success' + ); } else { showAlert('Error', 'Failed to load template.'); } @@ -675,7 +686,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const label = document.createElement('label'); label.className = 'block text-xs text-gray-400 mb-1'; - label.textContent = 'PDF Files'; + label.textContent = trText('PDF Files'); fileSection.appendChild(label); if (node.hasFile()) { @@ -688,7 +699,9 @@ function showNodeSettings(node: BaseWorkflowNode) { const uploadBtn = document.createElement('button'); uploadBtn.className = 'w-full bg-gray-700 hover:bg-gray-600 text-white text-xs px-3 py-2 rounded-lg transition-colors'; - uploadBtn.textContent = node.hasFile() ? 'Add More Files' : 'Upload PDFs'; + uploadBtn.textContent = node.hasFile() + ? trText('Add More Files') + : trText('Upload PDFs'); const fileInput = document.createElement('input'); fileInput.type = 'file'; @@ -710,7 +723,9 @@ function showNodeSettings(node: BaseWorkflowNode) { } catch { showAlert( 'Error', - `Wrong password or failed to decrypt "${file.name}".` + trText('Wrong password or failed to decrypt "{{name}}".', { + name: file.name, + }) ); } } @@ -734,13 +749,14 @@ function showNodeSettings(node: BaseWorkflowNode) { const label = document.createElement('label'); label.className = 'block text-xs text-gray-400 mb-1'; - label.textContent = 'Images'; + label.textContent = trText('Images'); fileSection.appendChild(label); const formatHint = document.createElement('p'); formatHint.className = 'text-[10px] text-gray-500 mb-2'; - formatHint.textContent = - 'Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2'; + formatHint.textContent = trText( + 'Supported: JPG, PNG, BMP, GIF, TIFF, WebP, HEIC, PSD, SVG, PNM, PGM, PBM, PPM, PAM, JXR, JPX, JP2' + ); fileSection.appendChild(formatHint); if (node.hasFile()) { @@ -754,8 +770,8 @@ function showNodeSettings(node: BaseWorkflowNode) { uploadBtn.className = 'w-full bg-gray-700 hover:bg-gray-600 text-white text-xs px-3 py-2 rounded-lg transition-colors'; uploadBtn.textContent = node.hasFile() - ? 'Add More Images' - : 'Upload Images'; + ? trText('Add More Images') + : trText('Upload Images'); const fileInput = document.createElement('input'); fileInput.type = 'file'; @@ -785,7 +801,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const certLabel = document.createElement('label'); certLabel.className = 'block text-xs text-gray-400 mb-1'; - certLabel.textContent = 'Certificate (.pfx, .p12, .pem)'; + certLabel.textContent = trText('Certificate (.pfx, .p12, .pem)'); certSection.appendChild(certLabel); if (node.hasCertFile()) { @@ -803,7 +819,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const removeBtn = document.createElement('button'); removeBtn.className = 'text-red-400 hover:text-red-300 text-xs flex-shrink-0'; - removeBtn.textContent = 'Remove'; + removeBtn.textContent = trText('Remove'); removeBtn.addEventListener('click', () => { node.removeCert(); showNodeSettings(node); @@ -818,7 +834,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const pwLabel = document.createElement('label'); pwLabel.className = 'block text-xs text-gray-400 mb-1'; - pwLabel.textContent = 'Certificate Password'; + pwLabel.textContent = trText('Certificate Password'); pwSection.appendChild(pwLabel); const pwRow = document.createElement('div'); @@ -826,14 +842,14 @@ function showNodeSettings(node: BaseWorkflowNode) { const pwInput = document.createElement('input'); pwInput.type = 'password'; - pwInput.placeholder = 'Enter password...'; + pwInput.placeholder = trText('Enter password...'); pwInput.className = 'flex-1 bg-gray-700 border border-gray-600 text-white text-xs px-3 py-2 rounded-lg focus:outline-none focus:border-indigo-500'; const unlockBtn = document.createElement('button'); unlockBtn.className = 'bg-indigo-600 hover:bg-indigo-500 text-white text-xs px-3 py-2 rounded-lg transition-colors flex-shrink-0'; - unlockBtn.textContent = 'Unlock'; + unlockBtn.textContent = trText('Unlock'); const statusMsg = document.createElement('div'); statusMsg.className = 'text-xs mt-1 hidden'; @@ -841,15 +857,15 @@ function showNodeSettings(node: BaseWorkflowNode) { const doUnlock = async () => { const pw = pwInput.value; if (!pw) return; - unlockBtn.textContent = 'Unlocking...'; + unlockBtn.textContent = trText('Unlocking...'); unlockBtn.disabled = true; const success = await node.unlockCert(pw); if (success) { showNodeSettings(node); } else { - unlockBtn.textContent = 'Unlock'; + unlockBtn.textContent = trText('Unlock'); unlockBtn.disabled = false; - statusMsg.textContent = 'Incorrect password'; + statusMsg.textContent = trText('Incorrect password'); statusMsg.className = 'text-xs mt-1 text-red-400'; statusMsg.classList.remove('hidden'); } @@ -866,7 +882,7 @@ function showNodeSettings(node: BaseWorkflowNode) { } else if (node.hasCert()) { const okMsg = document.createElement('div'); okMsg.className = 'text-xs text-green-400 mb-2'; - okMsg.textContent = 'Certificate unlocked'; + okMsg.textContent = trText('Certificate unlocked'); certSection.appendChild(okMsg); } } @@ -875,8 +891,8 @@ function showNodeSettings(node: BaseWorkflowNode) { uploadBtn.className = 'w-full bg-gray-700 hover:bg-gray-600 text-white text-xs px-3 py-2 rounded-lg transition-colors'; uploadBtn.textContent = node.hasCertFile() - ? 'Change Certificate' - : 'Upload Certificate'; + ? trText('Change Certificate') + : trText('Upload Certificate'); const certInput = document.createElement('input'); certInput.type = 'file'; @@ -921,135 +937,156 @@ function showNodeSettings(node: BaseWorkflowNode) { cls: new (...args: unknown[]) => FileInputNode; label: string; accept: string; - btnLabel: string; + uploadLabel: string; + addMoreLabel: string; hint?: string; }[] = [ { cls: WordToPdfNode, - label: 'Word Documents', + label: trText('Word Documents'), accept: '.doc,.docx,.odt,.rtf', - btnLabel: 'Documents', - hint: 'Supported: DOC, DOCX, ODT, RTF', + uploadLabel: trText('Upload Documents'), + addMoreLabel: trText('Add More Documents'), + hint: trText('Supported: DOC, DOCX, ODT, RTF'), }, { cls: ExcelToPdfNode, - label: 'Spreadsheets', + label: trText('Spreadsheets'), accept: '.xlsx,.xls,.ods,.csv', - btnLabel: 'Spreadsheets', - hint: 'Supported: XLSX, XLS, ODS, CSV', + uploadLabel: trText('Upload Spreadsheets'), + addMoreLabel: trText('Add More Spreadsheets'), + hint: trText('Supported: XLSX, XLS, ODS, CSV'), }, { cls: PowerPointToPdfNode, - label: 'Presentations', + label: trText('Presentations'), accept: '.ppt,.pptx,.odp', - btnLabel: 'Presentations', - hint: 'Supported: PPT, PPTX, ODP', + uploadLabel: trText('Upload Presentations'), + addMoreLabel: trText('Add More Presentations'), + hint: trText('Supported: PPT, PPTX, ODP'), }, { cls: TextToPdfNode, - label: 'Text Files', + label: trText('Text Files'), accept: '.txt', - btnLabel: 'Text Files', + uploadLabel: trText('Upload Text Files'), + addMoreLabel: trText('Add More Text Files'), }, { cls: SvgToPdfNode, - label: 'SVG Files', + label: trText('SVG Files'), accept: '.svg', - btnLabel: 'SVG Files', + uploadLabel: trText('Upload SVG Files'), + addMoreLabel: trText('Add More SVG Files'), }, { cls: EpubToPdfNode, - label: 'EPUB Files', + label: trText('EPUB Files'), accept: '.epub', - btnLabel: 'EPUB Files', + uploadLabel: trText('Upload EPUB Files'), + addMoreLabel: trText('Add More EPUB Files'), }, { cls: EmailToPdfNode, - label: 'Email Files', + label: trText('Email Files'), accept: '.eml,.msg', - btnLabel: 'Email Files', - hint: 'Supported: EML, MSG', + uploadLabel: trText('Upload Email Files'), + addMoreLabel: trText('Add More Email Files'), + hint: trText('Supported: EML, MSG'), }, { cls: XpsToPdfNode, - label: 'XPS Files', + label: trText('XPS Files'), accept: '.xps,.oxps', - btnLabel: 'XPS Files', - hint: 'Supported: XPS, OXPS', + uploadLabel: trText('Upload XPS Files'), + addMoreLabel: trText('Add More XPS Files'), + hint: trText('Supported: XPS, OXPS'), }, { cls: MobiToPdfNode, - label: 'MOBI Files', + label: trText('MOBI Files'), accept: '.mobi', - btnLabel: 'MOBI Files', + uploadLabel: trText('Upload MOBI Files'), + addMoreLabel: trText('Add More MOBI Files'), }, { cls: Fb2ToPdfNode, - label: 'FB2 Files', + label: trText('FB2 Files'), accept: '.fb2', - btnLabel: 'FB2 Files', + uploadLabel: trText('Upload FB2 Files'), + addMoreLabel: trText('Add More FB2 Files'), }, { cls: CbzToPdfNode, - label: 'Comic Archives', + label: trText('Comic Archives'), accept: '.cbz,.cbr', - btnLabel: 'Comics', - hint: 'Supported: CBZ, CBR', + uploadLabel: trText('Upload Comics'), + addMoreLabel: trText('Add More Comics'), + hint: trText('Supported: CBZ, CBR'), }, { cls: MarkdownToPdfNode, - label: 'Markdown Files', + label: trText('Markdown Files'), accept: '.md,.markdown', - btnLabel: 'Markdown Files', + uploadLabel: trText('Upload Markdown Files'), + addMoreLabel: trText('Add More Markdown Files'), }, { cls: JsonToPdfNode, - label: 'JSON Files', + label: trText('JSON Files'), accept: '.json', - btnLabel: 'JSON Files', + uploadLabel: trText('Upload JSON Files'), + addMoreLabel: trText('Add More JSON Files'), }, { cls: XmlToPdfNode, - label: 'XML Files', + label: trText('XML Files'), accept: '.xml', - btnLabel: 'XML Files', + uploadLabel: trText('Upload XML Files'), + addMoreLabel: trText('Add More XML Files'), }, { cls: WpdToPdfNode, - label: 'WordPerfect Files', + label: trText('WordPerfect Files'), accept: '.wpd', - btnLabel: 'WPD Files', + uploadLabel: trText('Upload WPD Files'), + addMoreLabel: trText('Add More WPD Files'), }, { cls: WpsToPdfNode, - label: 'WPS Files', + label: trText('WPS Files'), accept: '.wps', - btnLabel: 'WPS Files', + uploadLabel: trText('Upload WPS Files'), + addMoreLabel: trText('Add More WPS Files'), }, { cls: PagesToPdfNode, - label: 'Pages Files', + label: trText('Pages Files'), accept: '.pages', - btnLabel: 'Pages Files', + uploadLabel: trText('Upload Pages Files'), + addMoreLabel: trText('Add More Pages Files'), }, { cls: OdgToPdfNode, - label: 'ODG Files', + label: trText('ODG Files'), accept: '.odg', - btnLabel: 'ODG Files', + uploadLabel: trText('Upload ODG Files'), + addMoreLabel: trText('Add More ODG Files'), }, { cls: PubToPdfNode, - label: 'Publisher Files', + label: trText('Publisher Files'), accept: '.pub', - btnLabel: 'PUB Files', + uploadLabel: trText('Upload PUB Files'), + addMoreLabel: trText('Add More PUB Files'), }, { cls: VsdToPdfNode, - label: 'Visio Files', + label: trText('Visio Files'), accept: '.vsd,.vsdx', - btnLabel: 'Visio Files', - hint: 'Supported: VSD, VSDX', + uploadLabel: trText('Upload Visio Files'), + addMoreLabel: trText('Add More Visio Files'), + hint: trText('Supported: VSD, VSDX'), }, ]; @@ -1081,8 +1118,8 @@ function showNodeSettings(node: BaseWorkflowNode) { uploadBtn.className = 'w-full bg-gray-700 hover:bg-gray-600 text-white text-xs px-3 py-2 rounded-lg transition-colors'; uploadBtn.textContent = fileNode.hasFile() - ? `Add More ${fileInputConfig.btnLabel}` - : `Upload ${fileInputConfig.btnLabel}`; + ? fileInputConfig.addMoreLabel + : fileInputConfig.uploadLabel; const fileInput = document.createElement('input'); fileInput.type = 'file'; @@ -1096,7 +1133,12 @@ function showNodeSettings(node: BaseWorkflowNode) { await fileNode.addFiles(files); showNodeSettings(node); } catch (err) { - showAlert('Error', `Failed to load files: ${(err as Error).message}`); + showAlert( + 'Error', + trText('Failed to load files: {{error}}', { + error: (err as Error).message, + }) + ); } }); @@ -1119,7 +1161,7 @@ function showNodeSettings(node: BaseWorkflowNode) { if (controlEntries.length === 0) { const empty = document.createElement('p'); empty.className = 'text-xs text-gray-500'; - empty.textContent = 'No configurable settings for this node.'; + empty.textContent = trText('No configurable settings for this node.'); content.appendChild(empty); return; } @@ -1128,16 +1170,18 @@ function showNodeSettings(node: BaseWorkflowNode) { const controlHints: Record = { pages: 'e.g. 1-3, 5, 7-9', - whitelist: 'Limit recognized characters (leave empty for all)', - afterPage: 'Insert blank pages after this page number', - x0: 'Left edge in points (1 inch = 72 pts)', - y0: 'Top edge in points', - x1: 'Right edge in points', - y1: 'Bottom edge in points', - targetKilobytes: - 'Finds the best quality under this size. 0 means no target.', - retainPageLabels: - "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels).", + whitelist: trText('Limit recognized characters (leave empty for all)'), + afterPage: trText('Insert blank pages after this page number'), + x0: trText('Left edge in points (1 inch = 72 pts)'), + y0: trText('Top edge in points'), + x1: trText('Right edge in points'), + y1: trText('Bottom edge in points'), + targetKilobytes: trText( + 'Finds the best quality under this size. 0 means no target.' + ), + retainPageLabels: trText( + "Off (default): natural 1–N numbering. On: each file's original page labels are preserved (may produce duplicate labels)." + ), }; const inputClass = @@ -1166,7 +1210,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const controlLabel = document.createElement('label'); controlLabel.className = 'block text-xs text-gray-400 mb-1'; - controlLabel.textContent = formatLabel(key); + controlLabel.textContent = trText(formatLabel(key)); wrapper.appendChild(controlLabel); if (spec?.kind === 'multiselect') { @@ -1179,7 +1223,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const searchInput = document.createElement('input'); searchInput.type = 'text'; - searchInput.placeholder = 'Search languages...'; + searchInput.placeholder = trText('Search languages...'); searchInput.className = inputClass; container.appendChild(searchInput); @@ -1200,7 +1244,7 @@ function showNodeSettings(node: BaseWorkflowNode) { const tag = document.createElement('span'); tag.className = 'inline-flex items-center gap-1 px-2 py-0.5 rounded bg-indigo-600 text-white text-[10px]'; - tag.textContent = opt.label; + tag.textContent = trText(opt.label); const removeBtn = document.createElement('button'); removeBtn.type = 'button'; removeBtn.textContent = '\u00d7'; @@ -1226,7 +1270,10 @@ function showNodeSettings(node: BaseWorkflowNode) { listDiv.innerHTML = ''; const lowerFilter = filter.toLowerCase(); for (const opt of options) { - if (lowerFilter && !opt.label.toLowerCase().includes(lowerFilter)) + if ( + lowerFilter && + !trText(opt.label).toLowerCase().includes(lowerFilter) + ) continue; const label = document.createElement('label'); label.className = @@ -1246,7 +1293,7 @@ function showNodeSettings(node: BaseWorkflowNode) { updateCtrl(); }); label.appendChild(cb); - label.appendChild(document.createTextNode(opt.label)); + label.appendChild(document.createTextNode(trText(opt.label))); listDiv.appendChild(label); } } @@ -1264,7 +1311,7 @@ function showNodeSettings(node: BaseWorkflowNode) { for (const opt of spec.options) { const option = document.createElement('option'); option.value = opt.value; - option.textContent = opt.label; + option.textContent = trText(opt.label); if (currentValue === opt.value) option.selected = true; select.appendChild(option); } @@ -1397,7 +1444,7 @@ function showNodeSettings(node: BaseWorkflowNode) { summary.className = 'text-xs font-medium text-gray-400 cursor-pointer select-none flex items-center justify-between'; const summaryText = document.createElement('span'); - summaryText.textContent = 'Advanced Settings'; + summaryText.textContent = trText('Advanced Settings'); summary.appendChild(summaryText); const chevron = document.createElement('i'); chevron.className = diff --git a/src/js/logic/png-to-pdf-page.ts b/src/js/logic/png-to-pdf-page.ts index 134245ed..21998ce1 100644 --- a/src/js/logic/png-to-pdf-page.ts +++ b/src/js/logic/png-to-pdf-page.ts @@ -11,13 +11,11 @@ import { compressImageBytes, } from '../utils/image-compress.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -137,7 +135,9 @@ function updateUI() { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); @@ -180,7 +180,9 @@ function sanitizeImageAsJpeg(imageBytes: Uint8Array | ArrayBuffer) { canvas.toBlob( async (jpegBlob) => { if (!jpegBlob) { - return reject(new Error('Canvas toBlob conversion failed.')); + return reject( + new Error(trText('Canvas toBlob conversion failed.')) + ); } const arrayBuffer = await jpegBlob.arrayBuffer(); resolve(new Uint8Array(arrayBuffer)); @@ -195,7 +197,9 @@ function sanitizeImageAsJpeg(imageBytes: Uint8Array | ArrayBuffer) { URL.revokeObjectURL(imageUrl); reject( new Error( - 'The provided file could not be loaded as an image. It may be corrupted.' + trText( + 'The provided file could not be loaded as an image. It may be corrupted.' + ) ) ); }; diff --git a/src/js/logic/posterize-page.ts b/src/js/logic/posterize-page.ts index 3951203d..9dc3f76d 100644 --- a/src/js/logic/posterize-page.ts +++ b/src/js/logic/posterize-page.ts @@ -11,6 +11,8 @@ import { createIcons, icons } from 'lucide'; import { PosterizeState } from '@/types'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: PosterizeState = { file: null, pdfJsDoc: null, @@ -48,7 +50,7 @@ async function renderPosterizePreview(pageNum: number) { if (!pageState.pdfJsDoc) return; pageState.currentPage = pageNum; - showLoader(`Rendering preview for page ${pageNum}...`); + showLoader(trText('Rendering preview for page {{pageNum}}...', { pageNum })); const canvas = document.getElementById( 'posterize-preview-canvas' @@ -205,14 +207,14 @@ async function posterize() { const pageIndicesToProcess = parsePageRanges(pageRangeInput, totalPages); if (pageIndicesToProcess.length === 0) { - throw new Error('Invalid page range specified.'); + throw new Error(trText('Invalid page range specified.')); } const tempCanvas = document.createElement('canvas'); const tempCtx = tempCanvas.getContext('2d'); if (!tempCtx) { - throw new Error('Could not create canvas context.'); + throw new Error(trText('Could not create canvas context.')); } for (const pageIndex of pageIndicesToProcess) { @@ -397,7 +399,7 @@ async function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById( diff --git a/src/js/logic/powerpoint-to-pdf-page.ts b/src/js/logic/powerpoint-to-pdf-page.ts index 49be9236..6932bedc 100644 --- a/src/js/logic/powerpoint-to-pdf-page.ts +++ b/src/js/logic/powerpoint-to-pdf-page.ts @@ -8,7 +8,9 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +import { trText, onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -115,7 +117,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -128,7 +132,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -150,7 +158,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} PowerPoint file(s) to PDF.`, + trText( + 'Successfully converted {{length}} PowerPoint file(s) to PDF.', + { length: state.files.length } + ), 'success', () => resetState() ); @@ -159,7 +170,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/prepare-pdf-for-ai-page.ts b/src/js/logic/prepare-pdf-for-ai-page.ts index 07d28bd9..80ad76b1 100644 --- a/src/js/logic/prepare-pdf-for-ai-page.ts +++ b/src/js/logic/prepare-pdf-for-ai-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { downloadFile, readFileAsArrayBuffer, @@ -13,7 +13,7 @@ import type { PyMuPDFInstance } from '@/types'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -52,7 +52,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -71,10 +74,16 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(file); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(file.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(file.size), + numPages: pdfDoc.numPages, + }); } catch (error) { console.error('Error loading PDF:', error); - metaSpan.textContent = `${formatBytes(file.size)} • Could not load page count`; + metaSpan.textContent = trText( + '{{size}} • Could not load page count', + { size: formatBytes(file.size) } + ); } } @@ -116,7 +125,9 @@ document.addEventListener('DOMContentLoaded', () => { if (total === 1) { const file = state.files[0]; - showLoader(`Extracting ${file.name} for AI...`); + showLoader( + trText('Extracting {{name}} for AI...', { name: file.name }) + ); const llamaDocs = await (pymupdf as PyMuPDFInstance).pdfToLlamaIndex( file @@ -144,7 +155,11 @@ document.addEventListener('DOMContentLoaded', () => { try { const file = state.files[fi]; showLoader( - `Extracting ${file.name} for AI (${completed + 1}/${total})...` + trText('Extracting {{name}} for AI ({{n}}/{{total}})...', { + name: file.name, + n: completed + 1, + total, + }) ); const llamaDocs = await ( @@ -172,14 +187,20 @@ document.addEventListener('DOMContentLoaded', () => { if (failed === 0) { showAlert( 'Extraction Complete', - `Successfully extracted ${completed} PDF(s) for AI/LLM use.`, + trText( + 'Successfully extracted {{completed}} PDF(s) for AI/LLM use.', + { completed } + ), 'success', () => resetState() ); } else { showAlert( 'Extraction Partial', - `Extracted ${completed} PDF(s), failed ${failed}.`, + trText('Extracted {{completed}} PDF(s), failed {{failed}}.', { + completed, + failed, + }), 'warning', () => resetState() ); @@ -189,7 +210,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during extraction. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during extraction. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/protect-pdf-page.ts b/src/js/logic/protect-pdf-page.ts index 72542cfc..3c599467 100644 --- a/src/js/logic/protect-pdf-page.ts +++ b/src/js/logic/protect-pdf-page.ts @@ -8,6 +8,8 @@ import { import { icons, createIcons } from 'lucide'; import { EncryptPdfState, QpdfInstanceExtended } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: EncryptPdfState = { file: null, }; @@ -121,18 +123,19 @@ async function encryptPdf() { try { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Initializing encryption...'; + if (loaderText) + loaderText.textContent = trText('Initializing encryption...'); qpdf = await initializeQpdf(); - if (loaderText) loaderText.textContent = 'Reading PDF...'; + if (loaderText) loaderText.textContent = trText('Reading PDF...'); const fileBuffer = await readFileAsArrayBuffer(pageState.file); const uint8Array = new Uint8Array(fileBuffer as ArrayBuffer); qpdf.FS.writeFile(inputPath, uint8Array); if (loaderText) - loaderText.textContent = 'Encrypting PDF with 256-bit AES...'; + loaderText.textContent = trText('Encrypting PDF with 256-bit AES...'); const args = [inputPath, '--encrypt', userPassword, ownerPassword, '256']; @@ -163,11 +166,11 @@ async function encryptPdf() { ); } - if (loaderText) loaderText.textContent = 'Preparing download...'; + if (loaderText) loaderText.textContent = trText('Preparing download...'); const outputFile = qpdf.FS.readFile(outputPath, { encoding: 'binary' }); if (!outputFile || outputFile.length === 0) { - throw new Error('Encryption resulted in an empty file.'); + throw new Error(trText('Encryption resulted in an empty file.')); } const blob = new Blob([new Uint8Array(outputFile)], { @@ -177,10 +180,11 @@ async function encryptPdf() { if (loaderModal) loaderModal.classList.add('hidden'); - let successMessage = 'PDF encrypted successfully with 256-bit AES!'; + let successMessage = trText('PDF encrypted successfully with 256-bit AES!'); if (!hasDistinctOwnerPassword) { - successMessage += - ' Note: Without a separate owner password, the PDF has no usage restrictions.'; + successMessage += ` ${trText( + 'Note: Without a separate owner password, the PDF has no usage restrictions.' + )}`; } showAlert('Success', successMessage, 'success', () => { @@ -191,7 +195,12 @@ async function encryptPdf() { if (loaderModal) loaderModal.classList.add('hidden'); showAlert( 'Encryption Failed', - `An error occurred: ${error instanceof Error ? error.message : 'The PDF might be corrupted.'}` + trText('An error occurred: {{error}}', { + error: + error instanceof Error + ? error.message + : trText('The PDF might be corrupted.'), + }) ); } finally { try { @@ -213,7 +222,7 @@ async function encryptPdf() { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/psd-to-pdf-page.ts b/src/js/logic/psd-to-pdf-page.ts index 52278839..773244f3 100644 --- a/src/js/logic/psd-to-pdf-page.ts +++ b/src/js/logic/psd-to-pdf-page.ts @@ -5,6 +5,8 @@ import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; import type { PyMuPDFInstance } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.psd']; const FILETYPE_NAME = 'PSD'; @@ -17,7 +19,7 @@ async function ensurePyMuPDF(): Promise { return pymupdf; } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -81,7 +83,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -91,14 +95,16 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const pdfBlob = await mupdf.imageToPdf(file, { imageType: 'psd' }); const baseName = file.name.replace(/\.[^/.]+$/, ''); downloadFile(pdfBlob, `${baseName}.pdf`); hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -109,18 +115,24 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} PSD files to a single PDF.`, + trText( + 'Successfully converted {{length}} PSD files to a single PDF.', + { length: state.files.length } + ), 'success', () => resetState() ); } } catch (err) { hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; + const message = + err instanceof Error ? err.message : trText('Unknown error'); console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); showAlert( 'Error', - `An error occurred during conversion. Error: ${message}` + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) ); } }; diff --git a/src/js/logic/pub-to-pdf-page.ts b/src/js/logic/pub-to-pdf-page.ts index 73d511bc..5bd3565e 100644 --- a/src/js/logic/pub-to-pdf-page.ts +++ b/src/js/logic/pub-to-pdf-page.ts @@ -8,10 +8,12 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.pub']; const FILETYPE_NAME = 'PUB'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -82,7 +84,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -94,14 +98,16 @@ document.addEventListener('DOMContentLoaded', () => { }); if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); downloadFile(pdfBlob, `${baseName}.pdf`); hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -113,7 +119,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); @@ -128,18 +138,23 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} files to PDF.`, + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); } } catch (err) { hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; + const message = + err instanceof Error ? err.message : trText('Unknown error'); console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); showAlert( 'Error', - `An error occurred during conversion. Error: ${message}` + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) ); } }; diff --git a/src/js/logic/rasterize-pdf-page.ts b/src/js/logic/rasterize-pdf-page.ts index 1d51ef4f..305dacdc 100644 --- a/src/js/logic/rasterize-pdf-page.ts +++ b/src/js/logic/rasterize-pdf-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { downloadFile, readFileAsArrayBuffer, @@ -14,7 +14,7 @@ import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; import { showWasmRequiredDialog } from '../utils/wasm-provider.js'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -53,7 +53,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -72,10 +75,16 @@ document.addEventListener('DOMContentLoaded', () => { try { const arrayBuffer = await readFileAsArrayBuffer(file); const pdfDoc = await getPDFDocument({ data: arrayBuffer }).promise; - metaSpan.textContent = `${formatBytes(file.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(file.size), + numPages: pdfDoc.numPages, + }); } catch (error) { console.error('Error loading PDF:', error); - metaSpan.textContent = `${formatBytes(file.size)} • Could not load page count`; + metaSpan.textContent = trText( + '{{size}} • Could not load page count', + { size: formatBytes(file.size) } + ); } } @@ -134,7 +143,7 @@ document.addEventListener('DOMContentLoaded', () => { if (total === 1) { const file = state.files[0]; - showLoader(`Rasterizing ${file.name}...`); + showLoader(trText('Rasterizing {{name}}...', { name: file.name })); const rasterizedBlob = await (pymupdf as PyMuPDFInstance).rasterizePdf( file, @@ -151,7 +160,7 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Rasterization Complete', - `Successfully rasterized PDF at ${dpi} DPI.`, + trText('Successfully rasterized PDF at {{dpi}} DPI.', { dpi }), 'success', () => resetState() ); @@ -164,7 +173,11 @@ document.addEventListener('DOMContentLoaded', () => { try { const file = state.files[fi]; showLoader( - `Rasterizing ${file.name} (${completed + 1}/${total})...` + trText('Rasterizing {{name}} ({{n}}/{{total}})...', { + name: file.name, + n: completed + 1, + total, + }) ); const rasterizedBlob = await ( @@ -199,14 +212,20 @@ document.addEventListener('DOMContentLoaded', () => { if (failed === 0) { showAlert( 'Rasterization Complete', - `Successfully rasterized ${completed} PDF(s) at ${dpi} DPI.`, + trText( + 'Successfully rasterized {{completed}} PDF(s) at {{dpi}} DPI.', + { completed, dpi } + ), 'success', () => resetState() ); } else { showAlert( 'Rasterization Partial', - `Rasterized ${completed} PDF(s), failed ${failed}.`, + trText('Rasterized {{completed}} PDF(s), failed {{failed}}.', { + completed, + failed, + }), 'warning', () => resetState() ); @@ -216,7 +235,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during rasterization. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during rasterization. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/remove-annotations-page.ts b/src/js/logic/remove-annotations-page.ts index e190eebd..76e1faf7 100644 --- a/src/js/logic/remove-annotations-page.ts +++ b/src/js/logic/remove-annotations-page.ts @@ -7,6 +7,8 @@ import { } from '../utils/load-pdf-document.js'; import { escapeHtml } from '../utils/helpers.js'; +import { trHtml, trText, onPageReady } from '../i18n/i18n.js'; + // State management const pageState: { pdfDoc: PDFDocument | null; file: File | null } = { pdfDoc: null, @@ -18,7 +20,7 @@ function showLoader(message: string = 'Processing...') { const loader = document.getElementById('loader-modal'); const loaderText = document.getElementById('loader-text'); if (loader) loader.classList.remove('hidden'); - if (loaderText) loaderText.textContent = message; + if (loaderText) loaderText.textContent = trText(message); } function hideLoader() { @@ -37,8 +39,8 @@ function showAlert( const alertMessage = document.getElementById('alert-message'); const okBtn = document.getElementById('alert-ok'); - if (alertTitle) alertTitle.textContent = title; - if (alertMessage) alertMessage.textContent = message; + if (alertTitle) alertTitle.textContent = trText(title); + if (alertMessage) alertMessage.textContent = trText(message); if (modal) modal.classList.remove('hidden'); if (okBtn) { @@ -75,9 +77,9 @@ function updateFileDisplay() {

      ${escapeHtml(pageState.file.name)}

      -

      ${fileSize} • ${pageCount} page${pageCount !== 1 ? 's' : ''}

      +

      ${pageCount === 1 ? trHtml('{{fileSize}} • 1 page', { fileSize }) : trHtml('{{fileSize}} • {{pageCount}} pages', { fileSize, pageCount })}

      -
      @@ -164,7 +166,7 @@ async function processRemoveAnnotations() { } // Initialize -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/remove-blank-pages-page.ts b/src/js/logic/remove-blank-pages-page.ts index 540e37c6..d20dbeb7 100644 --- a/src/js/logic/remove-blank-pages-page.ts +++ b/src/js/logic/remove-blank-pages-page.ts @@ -7,6 +7,8 @@ import { loadPdfDocument } from '../utils/load-pdf-document.js'; import { escapeHtml } from '../utils/helpers.js'; import '../utils/setup-pdf-worker.js'; +import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; + // State const pageState: { pdfDoc: PDFDocument | null; @@ -23,7 +25,7 @@ const pageState: { function showLoader(msg = 'Processing...') { document.getElementById('loader-modal')?.classList.remove('hidden'); const txt = document.getElementById('loader-text'); - if (txt) txt.textContent = msg; + if (txt) txt.textContent = trText(msg); } function hideLoader() { @@ -39,8 +41,8 @@ function showAlert( const modal = document.getElementById('alert-modal'); const t = document.getElementById('alert-title'); const m = document.getElementById('alert-message'); - if (t) t.textContent = title; - if (m) m.textContent = msg; + if (t) t.textContent = trText(title); + if (m) m.textContent = trText(msg); modal?.classList.remove('hidden'); const okBtn = document.getElementById('alert-ok'); if (okBtn) { @@ -77,9 +79,9 @@ function updateFileDisplay() {

      ${escapeHtml(pageState.file.name)}

      -

      ${fileSize} • ${pageCount} page${pageCount !== 1 ? 's' : ''}

      +

      ${pageCount === 1 ? trHtml('{{fileSize}} • 1 page', { fileSize }) : trHtml('{{fileSize}} • {{pageCount}} pages', { fileSize, pageCount })}

      -
      @@ -231,7 +233,10 @@ function updatePreviewPanel() { if (!previewInfo || !previewContainer) return; - previewInfo.textContent = `Found ${pageState.detectedBlankPages.length} blank page(s). Click on a page to deselect it.`; + previewInfo.textContent = trText( + 'Found {{length}} blank page(s). Click on a page to deselect it.', + { length: pageState.detectedBlankPages.length } + ); previewContainer.innerHTML = ''; pageState.detectedBlankPages.forEach((pageIndex) => { @@ -244,7 +249,7 @@ function updatePreviewPanel() { div.innerHTML = `
      - Page ${pageIndex + 1} + ${trHtml('Page {{pageNumber}}', { pageNumber: pageIndex + 1 })}
      ${pageIndex + 1}
      @@ -295,7 +300,11 @@ async function processRemoveBlankPages() { return; } - showLoader(`Removing ${selectedPages.length} blank page(s)...`); + showLoader( + trText('Removing {{length}} blank page(s)...', { + length: selectedPages.length, + }) + ); try { const newPdf = await PDFDocument.create(); const pages = pageState.pdfDoc.getPages(); @@ -314,7 +323,9 @@ async function processRemoveBlankPages() { ); showAlert( 'Success', - `Removed ${selectedPages.length} blank page(s) successfully!`, + trText('Removed {{length}} blank page(s) successfully!', { + length: selectedPages.length, + }), 'success', resetState ); @@ -326,7 +337,7 @@ async function processRemoveBlankPages() { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const detectBtn = document.getElementById('detect-btn'); diff --git a/src/js/logic/remove-metadata-page.ts b/src/js/logic/remove-metadata-page.ts index d816456d..0e9cac6e 100644 --- a/src/js/logic/remove-metadata-page.ts +++ b/src/js/logic/remove-metadata-page.ts @@ -8,6 +8,8 @@ import { removeUnreferencedObjects, } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface PageState { file: File | null; } @@ -142,7 +144,7 @@ async function removeMetadata() { const loaderModal = document.getElementById('loader-modal'); const loaderText = document.getElementById('loader-text'); if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Removing all metadata...'; + if (loaderText) loaderText.textContent = trText('Removing all metadata...'); try { if (loaderModal) loaderModal.classList.add('hidden'); @@ -152,7 +154,7 @@ async function removeMetadata() { return; } if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Removing all metadata...'; + if (loaderText) loaderText.textContent = trText('Removing all metadata...'); result.pdf.destroy(); const pdfDoc = await loadPdfDocument(result.bytes); @@ -174,7 +176,7 @@ async function removeMetadata() { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/remove-restrictions-page.ts b/src/js/logic/remove-restrictions-page.ts index 1bdfd0a2..2a6d4af1 100644 --- a/src/js/logic/remove-restrictions-page.ts +++ b/src/js/logic/remove-restrictions-page.ts @@ -8,6 +8,8 @@ import { import { icons, createIcons } from 'lucide'; import { RemoveRestrictionsState, QpdfInstanceExtended } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: RemoveRestrictionsState = { file: null, }; @@ -105,17 +107,17 @@ async function removeRestrictions() { try { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Initializing...'; + if (loaderText) loaderText.textContent = trText('Initializing...'); qpdf = await initializeQpdf(); - if (loaderText) loaderText.textContent = 'Reading PDF...'; + if (loaderText) loaderText.textContent = trText('Reading PDF...'); const fileBuffer = await readFileAsArrayBuffer(pageState.file); const uint8Array = new Uint8Array(fileBuffer as ArrayBuffer); qpdf.FS.writeFile(inputPath, uint8Array); - if (loaderText) loaderText.textContent = 'Removing restrictions...'; + if (loaderText) loaderText.textContent = trText('Removing restrictions...'); const args = [inputPath]; @@ -132,7 +134,9 @@ async function removeRestrictions() { const qpdfMsg = qpdfError instanceof Error ? qpdfError.message : ''; if (qpdfMsg.includes('password') || qpdfMsg.includes('encrypt')) { throw new Error( - 'Failed to remove restrictions. The PDF may require the correct owner password.', + trText( + 'Failed to remove restrictions. The PDF may require the correct owner password.' + ), { cause: qpdfError } ); } @@ -143,11 +147,11 @@ async function removeRestrictions() { ); } - if (loaderText) loaderText.textContent = 'Preparing download...'; + if (loaderText) loaderText.textContent = trText('Preparing download...'); const outputFile = qpdf.FS.readFile(outputPath, { encoding: 'binary' }); if (!outputFile || outputFile.length === 0) { - throw new Error('Operation resulted in an empty file.'); + throw new Error(trText('Operation resulted in an empty file.')); } const blob = new Blob([new Uint8Array(outputFile)], { @@ -170,7 +174,12 @@ async function removeRestrictions() { if (loaderModal) loaderModal.classList.add('hidden'); showAlert( 'Operation Failed', - `An error occurred: ${error instanceof Error ? error.message : 'The PDF might be corrupted or password-protected.'}` + trText('An error occurred: {{error}}', { + error: + error instanceof Error + ? error.message + : trText('The PDF might be corrupted or password-protected.'), + }) ); } finally { try { @@ -192,7 +201,7 @@ async function removeRestrictions() { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/repair-pdf-page.ts b/src/js/logic/repair-pdf-page.ts index cdf7b597..c3b9b3be 100644 --- a/src/js/logic/repair-pdf-page.ts +++ b/src/js/logic/repair-pdf-page.ts @@ -2,91 +2,97 @@ import { repairPdf } from './repair-pdf.js'; import { state } from '../state.js'; import { renderFileDisplay } from '../ui.js'; -document.addEventListener('DOMContentLoaded', () => { - const fileInput = document.getElementById('file-input') as HTMLInputElement; - const dropZone = document.getElementById('drop-zone'); - const processBtn = document.getElementById('process-btn'); - const fileDisplayArea = document.getElementById('file-display-area'); +import { onPageReady } from '../i18n/i18n.js'; - const fileControls = document.getElementById('file-controls'); - const addMoreBtn = document.getElementById('add-more-btn'); - const clearFilesBtn = document.getElementById('clear-files-btn'); - const backBtn = document.getElementById('back-to-tools'); +onPageReady(() => { + const fileInput = document.getElementById('file-input') as HTMLInputElement; + const dropZone = document.getElementById('drop-zone'); + const processBtn = document.getElementById('process-btn'); + const fileDisplayArea = document.getElementById('file-display-area'); - if (backBtn) { - backBtn.addEventListener('click', () => { - window.location.href = import.meta.env.BASE_URL; - }); + const fileControls = document.getElementById('file-controls'); + const addMoreBtn = document.getElementById('add-more-btn'); + const clearFilesBtn = document.getElementById('clear-files-btn'); + const backBtn = document.getElementById('back-to-tools'); + + if (backBtn) { + backBtn.addEventListener('click', () => { + window.location.href = import.meta.env.BASE_URL; + }); + } + + const updateUI = () => { + if (state.files.length > 0) { + renderFileDisplay(fileDisplayArea, state.files); + if (processBtn) processBtn.classList.remove('hidden'); + if (fileControls) fileControls.classList.remove('hidden'); + } else { + if (fileDisplayArea) fileDisplayArea.innerHTML = ''; + if (processBtn) processBtn.classList.add('hidden'); + if (fileControls) fileControls.classList.add('hidden'); } + }; - const updateUI = () => { - if (state.files.length > 0) { - renderFileDisplay(fileDisplayArea, state.files); - if (processBtn) processBtn.classList.remove('hidden'); - if (fileControls) fileControls.classList.remove('hidden'); - } else { - if (fileDisplayArea) fileDisplayArea.innerHTML = ''; - if (processBtn) processBtn.classList.add('hidden'); - if (fileControls) fileControls.classList.add('hidden'); + if (fileInput && dropZone) { + fileInput.addEventListener('change', async (e) => { + const files = (e.target as HTMLInputElement).files; + if (files && files.length > 0) { + state.files = [...state.files, ...Array.from(files)]; + updateUI(); + } + }); + + dropZone.addEventListener('dragover', (e) => { + e.preventDefault(); + dropZone.classList.add('bg-gray-700'); + }); + + dropZone.addEventListener('dragleave', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + }); + + dropZone.addEventListener('drop', (e) => { + e.preventDefault(); + dropZone.classList.remove('bg-gray-700'); + const files = e.dataTransfer?.files; + if (files && files.length > 0) { + const pdfFiles = Array.from(files).filter( + (f) => + f.type === 'application/pdf' || + f.name.toLowerCase().endsWith('.pdf') + ); + if (pdfFiles.length > 0) { + state.files = [...state.files, ...pdfFiles]; + updateUI(); } - }; + } + }); - if (fileInput && dropZone) { - fileInput.addEventListener('change', async (e) => { - const files = (e.target as HTMLInputElement).files; - if (files && files.length > 0) { - state.files = [...state.files, ...Array.from(files)]; - updateUI(); - } - }); + // Clear value on click to allow re-selecting the same file + fileInput.addEventListener('click', () => { + fileInput.value = ''; + }); + } - dropZone.addEventListener('dragover', (e) => { - e.preventDefault(); - dropZone.classList.add('bg-gray-700'); - }); + if (addMoreBtn) { + addMoreBtn.addEventListener('click', () => { + fileInput.click(); + }); + } - dropZone.addEventListener('dragleave', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - }); + if (clearFilesBtn) { + clearFilesBtn.addEventListener('click', () => { + state.files = []; + updateUI(); + }); + } - dropZone.addEventListener('drop', (e) => { - e.preventDefault(); - dropZone.classList.remove('bg-gray-700'); - const files = e.dataTransfer?.files; - if (files && files.length > 0) { - const pdfFiles = Array.from(files).filter(f => f.type === 'application/pdf' || f.name.toLowerCase().endsWith('.pdf')); - if (pdfFiles.length > 0) { - state.files = [...state.files, ...pdfFiles]; - updateUI(); - } - } - }); + if (processBtn) { + processBtn.addEventListener('click', async () => { + await repairPdf(); + }); + } - // Clear value on click to allow re-selecting the same file - fileInput.addEventListener('click', () => { - fileInput.value = ''; - }); - } - - if (addMoreBtn) { - addMoreBtn.addEventListener('click', () => { - fileInput.click(); - }); - } - - if (clearFilesBtn) { - clearFilesBtn.addEventListener('click', () => { - state.files = []; - updateUI(); - }); - } - - if (processBtn) { - processBtn.addEventListener('click', async () => { - await repairPdf(); - }); - } - - updateUI(); + updateUI(); }); diff --git a/src/js/logic/repair-pdf.ts b/src/js/logic/repair-pdf.ts index 547f96e3..cc20acc7 100644 --- a/src/js/logic/repair-pdf.ts +++ b/src/js/logic/repair-pdf.ts @@ -10,6 +10,8 @@ import { deduplicateFileName } from '../utils/deduplicate-filename.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import type { QpdfInstanceExtended } from '@/types'; +import { trText } from '../i18n/i18n.js'; + export async function repairPdfFile(file: File): Promise { const inputPath = '/input.pdf'; const outputPath = '/repaired_form.pdf'; @@ -75,7 +77,13 @@ export async function repairPdf() { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; - showLoader(`Repairing ${file.name} (${i + 1}/${state.files.length})...`); + showLoader( + trText('Repairing {{name}} ({{n}}/{{length}})...', { + name: file.name, + n: i + 1, + length: state.files.length, + }) + ); const repairedData = await repairPdfFile(file); @@ -103,7 +111,10 @@ export async function repairPdf() { const failedList = failedRepairs.join(', '); showAlert( 'Partial Success', - `Repaired ${successfulRepairs.length} file(s). Failed to repair: ${failedList}` + trText( + 'Repaired {{length}} file(s). Failed to repair: {{failedList}}', + { length: successfulRepairs.length, failedList } + ) ); } diff --git a/src/js/logic/reverse-pages-page.ts b/src/js/logic/reverse-pages-page.ts index 7d026ba3..784c7984 100644 --- a/src/js/logic/reverse-pages-page.ts +++ b/src/js/logic/reverse-pages-page.ts @@ -7,6 +7,8 @@ import { deduplicateFileName } from '../utils/deduplicate-filename.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface ReverseState { files: File[]; } @@ -121,7 +123,13 @@ async function reversePages() { for (let j = 0; j < validFiles.length; j++) { const file = validFiles[j]; - showLoader(`Reversing ${file.name} (${j + 1}/${validFiles.length})...`); + showLoader( + trText('Reversing {{name}} ({{n}}/{{length}})...', { + name: file.name, + n: j + 1, + length: validFiles.length, + }) + ); const newPdfBytes = await reverseSingleFile(file); const zipEntryName = deduplicateFileName(file.name, usedNames); @@ -173,7 +181,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/rotate-custom-page.ts b/src/js/logic/rotate-custom-page.ts index f6434758..dd292787 100644 --- a/src/js/logic/rotate-custom-page.ts +++ b/src/js/logic/rotate-custom-page.ts @@ -19,6 +19,8 @@ import { parseAngleInput, } from '../utils/rotation-utils.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface RotateState { file: File | null; pdfDoc: PDFLibDocument | null; @@ -101,7 +103,7 @@ function createPageWrapper( const pageLabel = document.createElement('div'); pageLabel.className = 'absolute top-1 left-1 bg-black bg-opacity-60 text-white text-xs px-2 py-1 rounded'; - pageLabel.textContent = `${pageNumber}`; + pageLabel.textContent = trText('{{pageNumber}}', { pageNumber }); container.appendChild(canvasWrapper); container.appendChild(pageLabel); @@ -204,7 +206,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -234,7 +238,10 @@ async function updateUI() { const pageCount = pageState.pdfDoc.getPageCount(); pageState.rotations = new Array(pageCount).fill(0); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); await renderThumbnails(); hideLoader(); @@ -340,7 +347,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/rotate-pdf-page.ts b/src/js/logic/rotate-pdf-page.ts index 52cf4b97..739337d7 100644 --- a/src/js/logic/rotate-pdf-page.ts +++ b/src/js/logic/rotate-pdf-page.ts @@ -12,6 +12,8 @@ import * as pdfjsLib from 'pdfjs-dist'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + interface RotateState { file: File | null; pdfDoc: PDFLibDocument | null; @@ -85,7 +87,7 @@ function createPageWrapper( const pageLabel = document.createElement('div'); pageLabel.className = 'absolute top-1 left-1 bg-black bg-opacity-60 text-white text-xs px-2 py-1 rounded'; - pageLabel.textContent = `${pageNumber}`; + pageLabel.textContent = trText('{{pageNumber}}', { pageNumber }); container.appendChild(canvasWrapper); container.appendChild(pageLabel); @@ -181,7 +183,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • Loading...`; + metaSpan.textContent = trText('{{size}} • Loading...', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -211,7 +215,10 @@ async function updateUI() { const pageCount = pageState.pdfDoc.getPageCount(); pageState.rotations = new Array(pageCount).fill(0); - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(pageState.file.size), + pageCount, + }); await renderThumbnails(); hideLoader(); @@ -278,7 +285,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/rtf-to-pdf-page.ts b/src/js/logic/rtf-to-pdf-page.ts index 5bffe79d..4b8ae197 100644 --- a/src/js/logic/rtf-to-pdf-page.ts +++ b/src/js/logic/rtf-to-pdf-page.ts @@ -8,7 +8,9 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +import { trText, onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -114,7 +116,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -127,7 +131,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -149,7 +157,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} RTF file(s) to PDF.`, + trText('Successfully converted {{length}} RTF file(s) to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -158,7 +168,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/sanitize-pdf-page.ts b/src/js/logic/sanitize-pdf-page.ts index 739a3f2d..913dbba1 100644 --- a/src/js/logic/sanitize-pdf-page.ts +++ b/src/js/logic/sanitize-pdf-page.ts @@ -5,6 +5,8 @@ import { SanitizePdfState } from '@/types'; import { sanitizePdf } from '../utils/sanitize.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: SanitizePdfState = { file: null, pdfDoc: null, @@ -89,7 +91,7 @@ async function runSanitize() { const loaderModal = document.getElementById('loader-modal'); const loaderText = document.getElementById('loader-text'); if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Sanitizing PDF...'; + if (loaderText) loaderText.textContent = trText('Sanitizing PDF...'); try { const options = { @@ -140,7 +142,7 @@ async function runSanitize() { return; } if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Sanitizing PDF...'; + if (loaderText) loaderText.textContent = trText('Sanitizing PDF...'); loaded.pdf.destroy(); pageState.file = loaded.file; const result = await sanitizePdf(new Uint8Array(loaded.bytes), options); @@ -152,7 +154,10 @@ async function runSanitize() { if (result.skipped.length > 0) { showAlert( 'Sanitized With Warnings', - `The PDF was downloaded, but these steps could not be completed: ${result.skipped.join(', ')}. The content they cover may still be in the file.`, + trText( + 'The PDF was downloaded, but these steps could not be completed: {{join}}. The content they cover may still be in the file.', + { join: result.skipped.join(', ') } + ), 'warning', () => { resetState(); @@ -171,13 +176,16 @@ async function runSanitize() { } catch (e: unknown) { console.error('Sanitization Error:', e); const msg = e instanceof Error ? e.message : String(e); - showAlert('Error', `An error occurred during sanitization: ${msg}`); + showAlert( + 'Error', + trText('An error occurred during sanitization: {{msg}}', { msg }) + ); } finally { if (loaderModal) loaderModal.classList.add('hidden'); } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/scanner-effect-page.ts b/src/js/logic/scanner-effect-page.ts index 22b06427..994e28e1 100644 --- a/src/js/logic/scanner-effect-page.ts +++ b/src/js/logic/scanner-effect-page.ts @@ -10,7 +10,7 @@ import { PDFDocument } from 'pdf-lib'; import { applyScannerEffect } from '../utils/image-effects.js'; import * as pdfjsLib from 'pdfjs-dist'; import type { ScanSettings } from '../types/scanner-effect-type.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import '../utils/setup-pdf-worker.js'; @@ -127,7 +127,10 @@ const updateUI = () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -150,7 +153,11 @@ const updateUI = () => { return getPDFDocument(buffer).promise; }) .then((pdf: pdfjsLib.PDFDocumentProxy) => { - metaSpan.textContent = `${formatBytes(file.size)} • ${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`; + metaSpan.textContent = trText('{{size}} • {{numPages}} {{value}}', { + size: formatBytes(file.size), + numPages: pdf.numPages, + value: pdf.numPages !== 1 ? t('common.pages') : t('common.page'), + }); }) .catch(() => { metaSpan.textContent = formatBytes(file.size); @@ -188,7 +195,12 @@ async function processAllPages(): Promise { const dpiScale = settings.resolution / 72; for (let i = 1; i <= doc.numPages; i++) { - showLoader(`Processing page ${i} of ${doc.numPages}...`); + showLoader( + trText('Processing page {{i}} of {{numPages}}...', { + i, + numPages: doc.numPages, + }) + ); const page = await doc.getPage(i); const viewport = page.getViewport({ scale: dpiScale }); @@ -376,7 +388,7 @@ function setupSettingsListeners(): void { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/shortcuts.ts b/src/js/logic/shortcuts.ts index 49ff5435..19a1a025 100644 --- a/src/js/logic/shortcuts.ts +++ b/src/js/logic/shortcuts.ts @@ -1,6 +1,9 @@ import { categories } from '../config/tools.js'; import type { ToolEntry } from '@/types'; +import { trText } from '../i18n/i18n.js'; +import { getStoredItem, setStoredItem } from '../utils/safe-storage.js'; + export class ShortcutsManager { private static STORAGE_KEY = 'bentopdf_shortcuts'; private static shortcuts: Map = new Map(); @@ -29,7 +32,7 @@ export class ShortcutsManager { } private static loadFromStorage() { - const stored = localStorage.getItem(this.STORAGE_KEY); + const stored = getStoredItem(this.STORAGE_KEY); if (stored) { try { const parsed = JSON.parse(stored); @@ -57,7 +60,7 @@ export class ShortcutsManager { static save() { const obj = Object.fromEntries(this.shortcuts); - localStorage.setItem(this.STORAGE_KEY, JSON.stringify(obj)); + setStoredItem(this.STORAGE_KEY, JSON.stringify(obj)); } static reset() { @@ -121,7 +124,7 @@ export class ShortcutsManager { const parsed = JSON.parse(jsonString); for (const key in parsed) { if (typeof parsed[key] !== 'string') { - throw new Error('Invalid shortcut format'); + throw new Error(trText('Invalid shortcut format')); } } this.shortcuts = new Map(Object.entries(parsed)); diff --git a/src/js/logic/sign-pdf-page.ts b/src/js/logic/sign-pdf-page.ts index 232e8c09..9d0e1ee2 100644 --- a/src/js/logic/sign-pdf-page.ts +++ b/src/js/logic/sign-pdf-page.ts @@ -6,7 +6,7 @@ import { downloadFile, } from '../utils/helpers.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { loadPdfDocument, removeUnreferencedObjects, @@ -16,6 +16,7 @@ import { flattenFormsInDoc, } from '../utils/flatten-annotations.js'; import type { SignState, PDFViewerWindow } from '@/types'; +import { getStoredItem, setStoredItem } from '../utils/safe-storage.js'; const signState: SignState = { file: null, @@ -25,11 +26,7 @@ const signState: SignState = { blobUrl: null, }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -118,7 +115,10 @@ async function updateFileDisplay() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(signState.file.size)} • ${t('common.loadingPageCount')}`; + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(signState.file.size), + loadingPageCount: t('common.loadingPageCount'), + }); infoContainer.append(nameSpan, metaSpan); @@ -146,7 +146,10 @@ async function updateFileDisplay() { } signState.file = result.file; nameSpan.textContent = result.file.name; - metaSpan.textContent = `${formatBytes(result.file.size)} • ${result.pdf.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(result.file.size), + numPages: result.pdf.numPages, + }); result.pdf.destroy(); } @@ -186,7 +189,7 @@ async function setupSignTool() { signState.blobUrl = URL.createObjectURL(blob); try { - const existingPrefsRaw = localStorage.getItem('pdfjs.preferences'); + const existingPrefsRaw = getStoredItem('pdfjs.preferences'); const existingPrefs: Record = existingPrefsRaw ? JSON.parse(existingPrefsRaw) : {}; @@ -196,7 +199,7 @@ async function setupSignTool() { enableSignatureEditor: true, enablePermissions: false, }; - localStorage.setItem('pdfjs.preferences', JSON.stringify(newPrefs)); + setStoredItem('pdfjs.preferences', JSON.stringify(newPrefs)); } catch (e) { console.warn('Failed to update pdfjs.preferences in localStorage', e); } diff --git a/src/js/logic/split-pdf-page.ts b/src/js/logic/split-pdf-page.ts index 6e9d7746..70317079 100644 --- a/src/js/logic/split-pdf-page.ts +++ b/src/js/logic/split-pdf-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { createIcons, icons } from 'lucide'; import * as pdfjsLib from 'pdfjs-dist'; import { @@ -32,7 +32,7 @@ import { extractPagesWithQpdf, } from '../utils/split-pdf-helpers.js'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { let visualSelectorRendered = false; let isSplitting = false; @@ -81,7 +81,10 @@ document.addEventListener('DOMContentLoaded', () => { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(file.size)} • ${t('common.loadingPageCount')}`; // Placeholder + metaSpan.textContent = trText('{{size}} • {{loadingPageCount}}', { + size: formatBytes(file.size), + loadingPageCount: t('common.loadingPageCount'), + }); // Placeholder infoContainer.append(nameSpan, metaSpan); @@ -112,7 +115,10 @@ document.addEventListener('DOMContentLoaded', () => { result.pdf.destroy(); state.files[0] = result.file; state.pdfDoc = await loadPdfDocument(result.bytes); - metaSpan.textContent = `${formatBytes(file.size)} • ${pageCount} pages`; + metaSpan.textContent = trText('{{size}} • {{pageCount}} pages', { + size: formatBytes(file.size), + pageCount, + }); } catch (error) { console.error('Error loading PDF:', error); showAlert('Error', 'Failed to load PDF file.'); @@ -153,14 +159,14 @@ document.addEventListener('DOMContentLoaded', () => { const result = await loadPdfWithPasswordPrompt(file); if (!result) { showLoader('Rendering page previews...'); - throw new Error('No PDF document loaded'); + throw new Error(trText('No PDF document loaded')); } result.pdf.destroy(); state.files[0] = result.file; state.pdfDoc = await loadPdfDocument(result.bytes); showLoader('Rendering page previews...'); } else { - throw new Error('No PDF document loaded'); + throw new Error(trText('No PDF document loaded')); } } @@ -221,7 +227,12 @@ document.addEventListener('DOMContentLoaded', () => { useLazyLoading: true, lazyLoadMargin: '400px', onProgress: (current, total) => { - showLoader(`Rendering page previews: ${current}/${total}`); + showLoader( + trText('Rendering page previews: {{current}}/{{total}}', { + current, + total, + }) + ); }, onBatchComplete: () => { createIcons({ icons }); @@ -307,7 +318,7 @@ document.addEventListener('DOMContentLoaded', () => { const inputPath = '/split-input.pdf'; try { - if (!state.pdfDoc) throw new Error('No PDF document loaded.'); + if (!state.pdfDoc) throw new Error(trText('No PDF document loaded.')); const srcDoc = state.pdfDoc; const totalPages = srcDoc.getPageCount(); @@ -339,7 +350,8 @@ document.addEventListener('DOMContentLoaded', () => { const pageRangeInput = ( document.getElementById('page-range') as HTMLInputElement ).value; - if (!pageRangeInput) throw new Error('Choose a valid page range.'); + if (!pageRangeInput) + throw new Error(trText('Choose a valid page range.')); const { groups: rangeGroups, indices: rangeIndices } = parseRangeGroups(pageRangeInput, totalPages); @@ -354,7 +366,7 @@ document.addEventListener('DOMContentLoaded', () => { 'input[name="even-odd-choice"]:checked' ) as HTMLInputElement; if (!choiceElement) - throw new Error('Please select even or odd pages.'); + throw new Error(trText('Please select even or odd pages.')); const choice = choiceElement.value === 'even' ? 'even' : 'odd'; indicesToExtract = evenOddIndices(choice, totalPages); break; @@ -404,7 +416,9 @@ document.addEventListener('DOMContentLoaded', () => { cpdf.deletePdf(pdf); if (splitPages.length === 0) { - throw new Error('No bookmarks found at the selected level.'); + throw new Error( + trText('No bookmarks found at the selected level.') + ); } const zip = new JSZip(); @@ -429,7 +443,7 @@ document.addEventListener('DOMContentLoaded', () => { (document.getElementById('split-n-value') as HTMLInputElement) ?.value || '5' ); - if (nValue < 1) throw new Error('N must be at least 1.'); + if (nValue < 1) throw new Error(trText('N must be at least 1.')); const zip2 = new JSZip(); const chunks = nTimesGroups(nValue, totalPages); @@ -455,7 +469,7 @@ document.addEventListener('DOMContentLoaded', () => { splitMode !== 'bookmarks' && splitMode !== 'n-times' ) { - throw new Error('No pages were selected for splitting.'); + throw new Error(trText('No pages were selected for splitting.')); } if (outputGroups && outputGroups.length > 0) { @@ -584,12 +598,12 @@ document.addEventListener('DOMContentLoaded', () => { rangePanel?.classList.remove('hidden'); outputModeWrapper?.classList.remove('hidden'); if (outputSeparateLabel) - outputSeparateLabel.textContent = 'One PDF per range'; + outputSeparateLabel.textContent = trText('One PDF per range'); } else if (mode === 'visual') { visualPanel?.classList.remove('hidden'); outputModeWrapper?.classList.remove('hidden'); if (outputSeparateLabel) - outputSeparateLabel.textContent = 'One PDF per page'; + outputSeparateLabel.textContent = trText('One PDF per page'); renderVisualSelector(); } else if (mode === 'even-odd') { evenOddPanel?.classList.remove('hidden'); @@ -612,7 +626,10 @@ document.addEventListener('DOMContentLoaded', () => { nTimesWarning.classList.remove('hidden'); const warningText = document.getElementById('n-times-warning-text'); if (warningText) { - warningText.textContent = `The PDF has ${totalPages} pages, which is not evenly divisible by ${nValue}. The last PDF will contain ${remainder} page(s).`; + warningText.textContent = trText( + 'The PDF has {{totalPages}} pages, which is not evenly divisible by {{nValue}}. The last PDF will contain {{remainder}} page(s).', + { totalPages, nValue, remainder } + ); } } else if (nTimesWarning) { nTimesWarning.classList.add('hidden'); diff --git a/src/js/logic/svg-to-pdf-page.ts b/src/js/logic/svg-to-pdf-page.ts index 4a6cfd2f..2c8daa89 100644 --- a/src/js/logic/svg-to-pdf-page.ts +++ b/src/js/logic/svg-to-pdf-page.ts @@ -7,13 +7,11 @@ import { compressImageBytes, } from '../utils/image-compress.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -133,7 +131,9 @@ function updateUI() { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); @@ -178,7 +178,7 @@ function svgToPng(svgText: string): Promise { const ctx = canvas.getContext('2d'); if (!ctx) { URL.revokeObjectURL(url); - return reject(new Error('Could not get canvas context')); + return reject(new Error(trText('Could not get canvas context'))); } // Fill with white background for transparency @@ -189,7 +189,7 @@ function svgToPng(svgText: string): Promise { canvas.toBlob(async (pngBlob) => { URL.revokeObjectURL(url); if (!pngBlob) { - return reject(new Error('Canvas toBlob conversion failed.')); + return reject(new Error(trText('Canvas toBlob conversion failed.'))); } const arrayBuffer = await pngBlob.arrayBuffer(); resolve(new Uint8Array(arrayBuffer)); @@ -198,7 +198,7 @@ function svgToPng(svgText: string): Promise { img.onerror = () => { URL.revokeObjectURL(url); - reject(new Error('Failed to load SVG image')); + reject(new Error(trText('Failed to load SVG image'))); }; img.src = url; @@ -243,7 +243,9 @@ async function convertToPdf() { } catch (error) { console.error(`Failed to process ${file.name}:`, error); throw new Error( - `Could not process "${file.name}". The file may be corrupted.`, + trText('Could not process "{{name}}". The file may be corrupted.', { + name: file.name, + }), { cause: error } ); } diff --git a/src/js/logic/table-of-contents.ts b/src/js/logic/table-of-contents.ts index 87ee4373..3f829284 100644 --- a/src/js/logic/table-of-contents.ts +++ b/src/js/logic/table-of-contents.ts @@ -6,7 +6,7 @@ import { WasmProvider, } from '../utils/wasm-provider.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; -import { t } from '../i18n/index.js'; +import { t, trText } from '../i18n/index.js'; const worker = new Worker( import.meta.env.BASE_URL + 'workers/table-of-contents.worker.js' @@ -90,7 +90,7 @@ function renderFileDisplay(file: File) { async function handleFileSelect(file: File) { if (file.type !== 'application/pdf') { - showStatus('Please select a PDF file.', 'error'); + showStatus(trText('Please select a PDF file.'), 'error'); return; } diff --git a/src/js/logic/text-color-page.ts b/src/js/logic/text-color-page.ts index 5d6dfe35..5073f3d0 100644 --- a/src/js/logic/text-color-page.ts +++ b/src/js/logic/text-color-page.ts @@ -14,13 +14,11 @@ import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; import '../utils/setup-pdf-worker.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: TextColorState = { file: null, pdfDoc: null }; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -98,7 +96,10 @@ function updateFileDisplay() { nameSpan.textContent = pageState.file.name; const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)} • ${pageState.pdfDoc.getPageCount()} pages`; + metaSpan.textContent = trText('{{size}} • {{getPageCount}} pages', { + size: formatBytes(pageState.file.size), + getPageCount: pageState.pdfDoc.getPageCount(), + }); infoContainer.append(nameSpan, metaSpan); const removeBtn = document.createElement('button'); removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0'; @@ -137,7 +138,12 @@ async function changeTextColor() { ).promise; for (let i = 1; i <= pdf.numPages; i++) { - showLoader(`Processing page ${i} of ${pdf.numPages}...`); + showLoader( + trText('Processing page {{i}} of {{numPages}}...', { + i, + numPages: pdf.numPages, + }) + ); const page = await pdf.getPage(i); const viewport = page.getViewport({ scale: 2.0 }); const canvas = document.createElement('canvas'); diff --git a/src/js/logic/tiff-to-pdf-page.ts b/src/js/logic/tiff-to-pdf-page.ts index fc8eb40c..03137c3a 100644 --- a/src/js/logic/tiff-to-pdf-page.ts +++ b/src/js/logic/tiff-to-pdf-page.ts @@ -9,6 +9,8 @@ import { PDFDocument as PDFLibDocument } from 'pdf-lib'; import { decode } from 'tiff'; import { tiffIfdToRgba } from '../utils/tiff-utils.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; const updateUI = () => { @@ -41,7 +43,9 @@ const updateUI = () => { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); @@ -159,7 +163,7 @@ async function convert() { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const addMoreBtn = document.getElementById('add-more-btn'); diff --git a/src/js/logic/timestamp-pdf-page.ts b/src/js/logic/timestamp-pdf-page.ts index 32c5a8fb..730b8116 100644 --- a/src/js/logic/timestamp-pdf-page.ts +++ b/src/js/logic/timestamp-pdf-page.ts @@ -1,6 +1,6 @@ import { createIcons, icons } from 'lucide'; import { showAlert, showLoader, hideLoader } from '../ui.js'; -import { t } from '../i18n/i18n'; +import { t, trText, onPageReady } from '../i18n/i18n'; import { readFileAsArrayBuffer, formatBytes, @@ -148,7 +148,9 @@ async function updatePdfDisplay(): Promise { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(state.pdfFile.size)} • Loading pages...`; + metaSpan.textContent = trText('{{size}} • Loading pages...', { + size: formatBytes(state.pdfFile.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -172,11 +174,16 @@ async function updatePdfDisplay(): Promise { const pdfDoc = await getPDFDocument({ data: state.pdfBytes.slice(), }).promise; - metaSpan.textContent = `${formatBytes(state.pdfFile.size)} • ${pdfDoc.numPages} pages`; + metaSpan.textContent = trText('{{size}} • {{numPages}} pages', { + size: formatBytes(state.pdfFile.size), + numPages: pdfDoc.numPages, + }); } } catch (error) { console.error('Error loading PDF:', error); - metaSpan.textContent = `${formatBytes(state.pdfFile.size)}`; + metaSpan.textContent = trText('{{size}}', { + size: formatBytes(state.pdfFile.size), + }); } } @@ -236,14 +243,18 @@ async function processTimestamp(): Promise { resetState(); } catch (error) { console.error('Timestamp error:', error); - const message = error instanceof Error ? error.message : 'Unknown error'; + const message = + error instanceof Error ? error.message : trText('Unknown error'); showAlert( 'Timestamp Failed', - `Failed to timestamp PDF: ${message}\n\nPlease try a different TSA server or check your internet connection.` + trText( + 'Failed to timestamp PDF: {{message}}\n\nPlease try a different TSA server or check your internet connection.', + { message } + ) ); } finally { hideLoader(); } } -document.addEventListener('DOMContentLoaded', initializePage); +onPageReady(initializePage); diff --git a/src/js/logic/txt-to-pdf-page.ts b/src/js/logic/txt-to-pdf-page.ts index 0dcc2ff0..09128fad 100644 --- a/src/js/logic/txt-to-pdf-page.ts +++ b/src/js/logic/txt-to-pdf-page.ts @@ -3,6 +3,8 @@ import { downloadFile, formatBytes } from '../utils/helpers.js'; import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; let currentMode: 'upload' | 'text' = 'upload'; @@ -38,7 +40,9 @@ const updateUI = () => { const sizeSpan = document.createElement('span'); sizeSpan.className = 'text-gray-400 text-xs ml-2'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); const removeBtn = document.createElement('button'); removeBtn.className = 'ml-4 text-red-400 hover:text-red-300'; @@ -142,7 +146,9 @@ async function convert() { console.error('[TxtToPDF] Error:', e); showAlert( 'Error', - `Failed to convert text to PDF. ${e instanceof Error ? e.message : ''}` + trText('Failed to convert text to PDF. {{error}}', { + error: e instanceof Error ? e.message : '', + }) ); } finally { hideLoader(); @@ -161,7 +167,7 @@ function updateTextareaDirection(textarea: HTMLTextAreaElement) { } } -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const addMoreBtn = document.getElementById('add-more-btn'); diff --git a/src/js/logic/unlock-pdf-page.ts b/src/js/logic/unlock-pdf-page.ts index 3257cf07..749a8881 100644 --- a/src/js/logic/unlock-pdf-page.ts +++ b/src/js/logic/unlock-pdf-page.ts @@ -9,6 +9,8 @@ import { icons, createIcons } from 'lucide'; import JSZip from 'jszip'; import { DecryptPdfState } from '@/types'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const pageState: DecryptPdfState = { files: [], }; @@ -118,22 +120,24 @@ async function decryptPdf() { try { if (loaderModal) loaderModal.classList.remove('hidden'); - if (loaderText) loaderText.textContent = 'Initializing decryption...'; + if (loaderText) + loaderText.textContent = trText('Initializing decryption...'); if (pageState.files.length === 1) { // Single file: decrypt and download directly const file = pageState.files[0]; - if (loaderText) loaderText.textContent = 'Reading encrypted PDF...'; + if (loaderText) + loaderText.textContent = trText('Reading encrypted PDF...'); const fileBuffer = await readFileAsArrayBuffer(file); const uint8Array = new Uint8Array(fileBuffer as ArrayBuffer); - if (loaderText) loaderText.textContent = 'Decrypting PDF...'; + if (loaderText) loaderText.textContent = trText('Decrypting PDF...'); const { bytes: decryptedBytes } = await decryptPdfBytes( uint8Array, password ); - if (loaderText) loaderText.textContent = 'Preparing download...'; + if (loaderText) loaderText.textContent = trText('Preparing download...'); const blob = new Blob([decryptedBytes.slice().buffer], { type: 'application/pdf', }); @@ -158,7 +162,10 @@ async function decryptPdf() { const file = pageState.files[i]; if (loaderText) - loaderText.textContent = `Decrypting ${file.name} (${i + 1}/${pageState.files.length})...`; + loaderText.textContent = trText( + 'Decrypting {{name}} ({{n}}/{{length}})...', + { name: file.name, n: i + 1, length: pageState.files.length } + ); try { const fileBuffer = await readFileAsArrayBuffer(file); @@ -177,18 +184,25 @@ async function decryptPdf() { } if (successCount === 0) { - throw new Error( - 'No PDF files could be decrypted. The password may be incorrect.' + const error = new Error( + trText( + 'No PDF files could be decrypted. The password may be incorrect.' + ) ); + error.name = 'PasswordError'; + throw error; } - if (loaderText) loaderText.textContent = 'Generating ZIP file...'; + if (loaderText) loaderText.textContent = trText('Generating ZIP file...'); const zipBlob = await zip.generateAsync({ type: 'blob' }); downloadFile(zipBlob, 'decrypted-pdfs.zip'); - let alertMessage = `${successCount} PDF(s) decrypted successfully.`; + let alertMessage = trText( + '{{successCount}} PDF(s) decrypted successfully.', + { successCount } + ); if (errorCount > 0) { - alertMessage += ` ${errorCount} file(s) failed.`; + alertMessage += ` ${trText('Files that failed: {{errorCount}}.', { errorCount })}`; } showAlert('Processing Complete', alertMessage, 'success', () => { resetState(); @@ -203,7 +217,10 @@ async function decryptPdf() { 'Incorrect Password', 'The password you entered is incorrect. Please try again.' ); - } else if (errorMessage.includes('password')) { + } else if ( + error instanceof Error && + (error.name === 'PasswordError' || /password/i.test(errorMessage)) + ) { showAlert( 'Password Error', 'Unable to decrypt the PDF with the provided password.' @@ -211,7 +228,13 @@ async function decryptPdf() { } else { showAlert( 'Decryption Failed', - `An error occurred: ${errorMessage || 'The password you entered is wrong or the file is corrupted.'}` + trText('An error occurred: {{error}}', { + error: + errorMessage || + trText( + 'The password you entered is wrong or the file is corrupted.' + ), + }) ); } } finally { @@ -219,7 +242,7 @@ async function decryptPdf() { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); diff --git a/src/js/logic/validate-signature-pdf-page.ts b/src/js/logic/validate-signature-pdf-page.ts index 2dfa512e..5f4956a0 100644 --- a/src/js/logic/validate-signature-pdf-page.ts +++ b/src/js/logic/validate-signature-pdf-page.ts @@ -5,6 +5,8 @@ import { validatePdfSignatures } from './validate-signature-pdf.js'; import forge from 'node-forge'; import { SignatureValidationResult, ValidateSignatureState } from '@/types'; +import { trHtml, trText, onPageReady } from '../i18n/i18n.js'; + const state: ValidateSignatureState = { pdfFile: null, pdfBytes: null, @@ -254,8 +256,7 @@ function updateCertDisplay(): void { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-green-400'; - metaSpan.innerHTML = - 'Trusted certificate loaded'; + metaSpan.innerHTML = `${trHtml('Trusted certificate loaded')}`; infoContainer.append(nameSpan, metaSpan); @@ -309,8 +310,8 @@ function displayResults(): void { resultsContainer.innerHTML = `
      -

      No Signatures Found

      -

      This PDF does not contain any digital signatures.

      +

      ${trHtml('No Signatures Found')}

      +

      ${trHtml('This PDF does not contain any digital signatures.')}

      `; createIcons({ icons }); @@ -331,9 +332,9 @@ function displayResults(): void { let summaryHtml = `

      ${state.results.length} - signature${state.results.length > 1 ? 's' : ''} found + ${state.results.length > 1 ? trHtml('signatures found') : trHtml('signature found')} • - ${validCount} valid + ${trHtml('{{validCount}} valid', { validCount })}

      `; @@ -341,7 +342,7 @@ function displayResults(): void { summaryHtml += `

      - Trust verification: ${trustVerified}/${state.results.length} signatures verified against custom certificate + ${trHtml('Trust verification: {{trustVerified}}/{{length}} signatures verified against custom certificate', { trustVerified, length: state.results.length })}

      `; } @@ -366,46 +367,46 @@ function createSignatureCard( let statusColor = 'text-green-400'; let statusIcon = 'check-circle'; - let statusText = 'Valid Signature'; + let statusText = trText('Valid Signature'); if (!result.isValid) { if (result.cryptoVerificationStatus === 'unsupported') { statusColor = 'text-yellow-400'; statusIcon = 'alert-triangle'; - statusText = 'Unverified — Unsupported Signature Algorithm'; + statusText = trText('Unverified: Unsupported Signature Algorithm'); } else if ( result.cryptoVerified === true && result.coverageStatus === 'partial' ) { statusColor = 'text-yellow-400'; statusIcon = 'alert-triangle'; - statusText = 'Modified After Signing (signed part intact)'; + statusText = trText('Modified After Signing (signed part intact)'); } else { statusColor = 'text-red-400'; statusIcon = 'x-circle'; statusText = result.cryptoVerified === false - ? 'Invalid — Cryptographic Verification Failed' - : 'Invalid Signature'; + ? trText('Invalid: Cryptographic Verification Failed') + : trText('Invalid Signature'); } } else if (result.usesInsecureDigest) { statusColor = 'text-red-400'; statusIcon = 'x-circle'; - statusText = 'Insecure Digest (MD5 / SHA-1)'; + statusText = trText('Insecure Digest (MD5 / SHA-1)'); } else if (result.isExpired) { statusColor = 'text-yellow-400'; statusIcon = 'alert-triangle'; - statusText = 'Certificate Expired'; + statusText = trText('Certificate Expired'); } else if (!result.isTrusted) { statusColor = 'text-yellow-400'; statusIcon = 'alert-triangle'; statusText = result.isSelfSigned - ? 'Self-Signed — Signer Identity Not Verified' - : 'Signature Intact — Signer Identity Not Verified'; + ? trText('Self-Signed: Signer Identity Not Verified') + : trText('Signature Intact: Signer Identity Not Verified'); } const formatDate = (date: Date) => { - if (!date || date.getTime() === 0) return 'Unknown'; + if (!date || date.getTime() === 0) return trText('Unknown'); return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', @@ -418,11 +419,9 @@ function createSignatureCard( let trustBadge = ''; if (state.trustedCert) { if (result.isTrusted) { - trustBadge = - 'Trusted'; + trustBadge = `${trHtml('Trusted')}`; } else { - trustBadge = - 'Not in trust chain'; + trustBadge = `${trHtml('Not in trust chain')}`; } } @@ -431,16 +430,16 @@ function createSignatureCard(
      -

      Signature ${index + 1}

      +

      ${trHtml('Signature {{n}}', { n: index + 1 })}

      ${statusText}

      ${ result.coverageStatus === 'full' - ? 'Full Coverage' + ? `${trHtml('Full Coverage')}` : result.coverageStatus === 'partial' - ? 'Partial Coverage' + ? `${trHtml('Partial Coverage')}` : '' }${trustBadge}
      @@ -449,13 +448,13 @@ function createSignatureCard(
      -

      Signed By

      +

      ${trHtml('Signed By')}

      ${escapeHtml(result.signerName)}

      ${result.signerOrg ? `

      ${escapeHtml(result.signerOrg)}

      ` : ''} ${result.signerEmail ? `

      ${escapeHtml(result.signerEmail)}

      ` : ''}
      -

      Issuer

      +

      ${trHtml('Issuer')}

      ${escapeHtml(result.issuer)}

      ${result.issuerOrg ? `

      ${escapeHtml(result.issuerOrg)}

      ` : ''}
      @@ -465,7 +464,7 @@ function createSignatureCard( result.signatureDate ? `
      -

      Signed On

      +

      ${trHtml('Signed On')}

      ${formatDate(result.signatureDate)}

      ` @@ -474,11 +473,11 @@ function createSignatureCard(
      -

      Valid From

      +

      ${trHtml('Valid From')}

      ${formatDate(result.validFrom)}

      -

      Valid Until

      +

      ${trHtml('Valid Until')}

      ${formatDate(result.validTo)}

      @@ -487,7 +486,7 @@ function createSignatureCard( result.reason ? `
      -

      Reason

      +

      ${trHtml('Reason')}

      ${escapeHtml(result.reason)}

      ` @@ -498,7 +497,7 @@ function createSignatureCard( result.location ? `
      -

      Location

      +

      ${trHtml('Location')}

      ${escapeHtml(result.location)}

      ` @@ -507,13 +506,13 @@ function createSignatureCard(
      - Technical Details + ${trHtml('Technical Details')}
      -

      Serial Number: ${escapeHtml(result.serialNumber)}

      -

      Digest Algorithm: ${escapeHtml(result.algorithms.digest)}

      -

      Signature Algorithm: ${escapeHtml(result.algorithms.signature)}

      - ${result.errorMessage ? `

      Error: ${escapeHtml(result.errorMessage)}

      ` : ''} +

      ${trHtml('Serial Number:')} ${escapeHtml(result.serialNumber)}

      +

      ${trHtml('Digest Algorithm:')} ${escapeHtml(result.algorithms.digest)}

      +

      ${trHtml('Signature Algorithm:')} ${escapeHtml(result.algorithms.signature)}

      + ${result.errorMessage ? `

      ${trHtml('Error: {{error}}', { error: result.errorMessage })}

      ` : ''} ${result.unsupportedAlgorithmReason ? `

      ${escapeHtml(result.unsupportedAlgorithmReason)}

      ` : ''}
      @@ -529,8 +528,4 @@ function escapeHtml(str: string): string { return div.innerHTML; } -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); diff --git a/src/js/logic/validate-signature-pdf.ts b/src/js/logic/validate-signature-pdf.ts index cb77ca51..5f392aca 100644 --- a/src/js/logic/validate-signature-pdf.ts +++ b/src/js/logic/validate-signature-pdf.ts @@ -2,6 +2,8 @@ import forge from 'node-forge'; import { SignatureValidationResult } from '@/types'; import type { ExtractedSignatureWithError, PdfValueSpan } from '@/types'; +import { trText } from '../i18n/i18n.js'; + const INSECURE_DIGEST_OIDS = new Set([ '1.2.840.113549.2.5', '1.3.14.3.2.26', @@ -118,8 +120,9 @@ function readSignatureDictionary( ) : null; if (!rangeMatch) { - signature.extractionError = - 'Signature has a missing or malformed /ByteRange'; + signature.extractionError = trText( + 'Signature has a missing or malformed /ByteRange' + ); return signature; } @@ -137,15 +140,17 @@ function readSignatureDictionary( const gapEnd = signature.byteRange[2]; const gap = pdfString.slice(gapStart, gapEnd); if (gap.length % 2 !== 0 || !/^<[0-9A-Fa-f]+>$/.test(gap)) { - signature.extractionError = - 'The bytes excluded by /ByteRange are not exactly a hex-encoded signature'; + signature.extractionError = trText( + 'The bytes excluded by /ByteRange are not exactly a hex-encoded signature' + ); return signature; } const contentsSpan = entries.get('Contents'); if (contentsSpan?.start !== gapStart || contentsSpan.end !== gapEnd) { - signature.extractionError = - 'The bytes excluded by /ByteRange are not the /Contents of this signature'; + signature.extractionError = trText( + 'The bytes excluded by /ByteRange are not the /Contents of this signature' + ); return signature; } @@ -156,8 +161,9 @@ function readSignatureDictionary( derObjectLength > contents.length || contents.subarray(derObjectLength).some((byte) => byte !== 0) ) { - signature.extractionError = - 'Signature /Contents is not a single DER object followed by zero padding'; + signature.extractionError = trText( + 'Signature /Contents is not a single DER object followed by zero padding' + ); return signature; } @@ -173,14 +179,14 @@ function getByteRangeError( byteRange.length !== 4 || !byteRange.every((value) => Number.isSafeInteger(value) && value >= 0) ) { - return 'Malformed ByteRange'; + return trText('Malformed ByteRange'); } const [start1, len1, start2, len2] = byteRange; if (start1 !== 0) { - return 'ByteRange does not start at the beginning of the file'; + return trText('ByteRange does not start at the beginning of the file'); } if (start1 + len1 > start2 || start2 + len2 > fileLength) { - return 'ByteRange out of bounds'; + return trText('ByteRange out of bounds'); } return null; } @@ -320,14 +326,14 @@ export async function validateSignature( const result: SignatureValidationResult = { signatureIndex: signature.index, isValid: false, - signerName: 'Unknown', - issuer: 'Unknown', + signerName: trText('Unknown'), + issuer: trText('Unknown'), validFrom: new Date(0), validTo: new Date(0), isExpired: false, isSelfSigned: false, isTrusted: false, - algorithms: { digest: 'Unknown', signature: 'Unknown' }, + algorithms: { digest: trText('Unknown'), signature: trText('Unknown') }, serialNumber: '', byteRange: signature.byteRange, coverageStatus: 'unknown', @@ -363,7 +369,7 @@ export async function validateSignature( }; if (!p7.certificates || p7.certificates.length === 0) { - result.errorMessage = 'No certificates found in signature'; + result.errorMessage = trText('No certificates found in signature'); return result; } @@ -382,10 +388,10 @@ export async function validateSignature( const issuerCN = signerCert.issuer.getField('CN'); const issuerO = signerCert.issuer.getField('O'); - result.signerName = (subjectCN?.value as string) ?? 'Unknown'; + result.signerName = (subjectCN?.value as string) ?? trText('Unknown'); result.signerOrg = subjectO?.value as string | undefined; result.signerEmail = subjectE?.value as string | undefined; - result.issuer = (issuerCN?.value as string) ?? 'Unknown'; + result.issuer = (issuerCN?.value as string) ?? trText('Unknown'); result.issuerOrg = issuerO?.value as string | undefined; result.validFrom = signerCert.validity.notBefore; result.validTo = signerCert.validity.notAfter; @@ -487,7 +493,7 @@ export async function validateSignature( result.unsupportedAlgorithmReason = verification.reason; } else if (verification.status === 'failed') { result.errorMessage = - verification.reason || 'Cryptographic verification failed'; + verification.reason || trText('Cryptographic verification failed'); } result.isValid = @@ -496,7 +502,7 @@ export async function validateSignature( !result.usesInsecureDigest; } catch (e) { result.errorMessage = - e instanceof Error ? e.message : 'Failed to parse signature'; + e instanceof Error ? e.message : trText('Failed to parse signature'); } return result; @@ -597,7 +603,7 @@ function getDigestAlgorithmName(oid: string): string { '2.16.840.1.101.3.4.2.3': 'SHA-512', '2.16.840.1.101.3.4.2.4': 'SHA-224', }; - return digestAlgorithms[oid] || oid || 'Unknown'; + return digestAlgorithms[oid] || oid || trText('Unknown'); } function getSignatureAlgorithmName(oid: string): string { @@ -613,7 +619,7 @@ function getSignatureAlgorithmName(oid: string): string { '1.2.840.10045.4.3.3': 'ECDSA with SHA-384', '1.2.840.10045.4.3.4': 'ECDSA with SHA-512', }; - return signatureAlgorithms[oid] || oid || 'Unknown'; + return signatureAlgorithms[oid] || oid || trText('Unknown'); } interface SignerInfoFields { @@ -708,11 +714,11 @@ function detectSigScheme( digestOid: string ): SigScheme | { unsupported: string } { if (!signatureAlgorithmArr || signatureAlgorithmArr.length === 0) { - return { unsupported: 'Missing signatureAlgorithm' }; + return { unsupported: trText('Missing signatureAlgorithm') }; } const oidNode = signatureAlgorithmArr[0]; if (!oidNode || oidNode.type !== forge.asn1.Type.OID) { - return { unsupported: 'Malformed signatureAlgorithm' }; + return { unsupported: trText('Malformed signatureAlgorithm') }; } const oid = forge.asn1.derToOid(oidNode.value as string); const implicitHash = hashNameFromOid(digestOid); @@ -721,7 +727,11 @@ function detectSigScheme( case '1.2.840.113549.1.1.1': return implicitHash ? { kind: 'rsa-pkcs1', hashName: implicitHash } - : { unsupported: `Unsupported digest OID ${digestOid}` }; + : { + unsupported: trText('Unsupported digest OID {{digestOid}}', { + digestOid, + }), + }; case '1.2.840.113549.1.1.5': return { kind: 'rsa-pkcs1', hashName: 'SHA-1' }; case '1.2.840.113549.1.1.11': @@ -749,9 +759,17 @@ function detectSigScheme( case '1.2.840.10045.2.1': return implicitHash ? { kind: 'ecdsa', hashName: implicitHash } - : { unsupported: `Unsupported digest OID ${digestOid}` }; + : { + unsupported: trText('Unsupported digest OID {{digestOid}}', { + digestOid, + }), + }; default: - return { unsupported: `Unsupported signature algorithm OID ${oid}` }; + return { + unsupported: trText('Unsupported signature algorithm OID {{oid}}', { + oid, + }), + }; } } @@ -868,7 +886,7 @@ async function verifyViaWebCrypto( if (!subtle) { return { status: 'unsupported', - reason: 'Web Crypto API not available in this context', + reason: trText('Web Crypto API not available in this context'), }; } @@ -895,8 +913,9 @@ async function verifyViaWebCrypto( ? { status: 'verified' } : { status: 'failed', - reason: - 'RSA-PSS signature does not verify against signer public key', + reason: trText( + 'RSA-PSS signature does not verify against signer public key' + ), }; } @@ -905,14 +924,14 @@ async function verifyViaWebCrypto( if (!curve) { return { status: 'unsupported', - reason: 'Unsupported ECDSA curve in signer certificate', + reason: trText('Unsupported ECDSA curve in signer certificate'), }; } const p1363 = ecdsaDerToP1363(sig, curve.coordBytes); if (!p1363) { return { status: 'failed', - reason: 'Malformed ECDSA signature (could not parse r,s)', + reason: trText('Malformed ECDSA signature (could not parse r,s)'), }; } const key = await subtle.importKey( @@ -932,7 +951,9 @@ async function verifyViaWebCrypto( ? { status: 'verified' } : { status: 'failed', - reason: 'ECDSA signature does not verify against signer public key', + reason: trText( + 'ECDSA signature does not verify against signer public key' + ), }; } @@ -949,21 +970,24 @@ async function verifyViaWebCrypto( ? { status: 'verified' } : { status: 'failed', - reason: - 'RSA-PKCS1 signature does not verify against signer public key', + reason: trText( + 'RSA-PKCS1 signature does not verify against signer public key' + ), }; } return { status: 'unsupported', - reason: `Signature scheme ${scheme.kind} not implemented`, + reason: trText('Signature scheme {{kind}} not implemented', { + kind: scheme.kind, + }), }; } catch (e) { return { status: 'unsupported', - reason: - 'Web Crypto import/verify failed: ' + - (e instanceof Error ? e.message : String(e)), + reason: trText('Web Crypto import/verify failed: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }), }; } } @@ -981,7 +1005,7 @@ async function performCryptoVerification( fields: SignerInfoFields | null ): Promise { if (!fields) { - return { status: 'failed', reason: 'Could not parse signer info' }; + return { status: 'failed', reason: trText('Could not parse signer info') }; } const byteRangeError = getByteRangeError(byteRange, pdfBytes.length); if (byteRangeError) { @@ -992,7 +1016,9 @@ async function performCryptoVerification( if (!md) { return { status: 'unsupported', - reason: `Unsupported digest OID ${fields.digestOid}`, + reason: trText('Unsupported digest OID {{digestOid}}', { + digestOid: fields.digestOid, + }), }; } @@ -1007,7 +1033,7 @@ async function performCryptoVerification( const authAttrs = fields.authAttrs; const signatureBytes = fields.signatureBytes; if (!signatureBytes) { - return { status: 'failed', reason: 'Empty signature bytes' }; + return { status: 'failed', reason: trText('Empty signature bytes') }; } const scheme = detectSigScheme( @@ -1050,8 +1076,9 @@ async function performCryptoVerification( if (messageDigestAttrValue !== contentHashBytes) { return { status: 'failed', - reason: - 'Content hash does not match messageDigest attribute — PDF was modified after signing', + reason: trText( + 'Content hash does not match messageDigest attribute: PDF was modified after signing' + ), }; } @@ -1082,7 +1109,7 @@ async function performCryptoVerification( if (!spkiDer) { return { status: 'unsupported', - reason: 'Could not extract signer public key', + reason: trText('Could not extract signer public key'), }; } return verifyViaWebCrypto( diff --git a/src/js/logic/view-metadata-page.ts b/src/js/logic/view-metadata-page.ts index 17999fe1..a0f0aaf6 100644 --- a/src/js/logic/view-metadata-page.ts +++ b/src/js/logic/view-metadata-page.ts @@ -4,6 +4,8 @@ import { createIcons, icons } from 'lucide'; import { ViewMetadataState } from '@/types'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; +import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; + const pageState: ViewMetadataState = { file: null, metadata: {}, @@ -179,7 +181,7 @@ async function displayMetadata() { const rawXmpString = metadata ? metadata.getRaw() : null; // Info Dictionary Section - const infoSection = createSection('Info Dictionary'); + const infoSection = createSection(trText('Info Dictionary')); if (info && Object.keys(info).length > 0) { for (const key in info) { const value = (info as Record)[key]; @@ -212,12 +214,12 @@ async function displayMetadata() { infoSection.ul.appendChild(createListItem(key, displayValue)); } } else { - infoSection.ul.innerHTML = `
    • - No Info Dictionary data found -
    • `; + infoSection.ul.innerHTML = `
    • ${trHtml('- No Info Dictionary data found -')}
    • `; } metadataDisplay.appendChild(infoSection.wrapper); // Interactive Form Fields Section - const fieldsSection = createSection('Interactive Form Fields'); + const fieldsSection = createSection(trText('Interactive Form Fields')); if (fieldObjects && Object.keys(fieldObjects).length > 0) { for (const fieldName in fieldObjects) { const field = ( @@ -227,12 +229,12 @@ async function displayMetadata() { fieldsSection.ul.appendChild(createListItem(fieldName, String(value))); } } else { - fieldsSection.ul.innerHTML = `
    • - No interactive form fields found -
    • `; + fieldsSection.ul.innerHTML = `
    • ${trHtml('- No interactive form fields found -')}
    • `; } metadataDisplay.appendChild(fieldsSection.wrapper); // XMP Metadata Section - const xmpSection = createSection('XMP Metadata'); + const xmpSection = createSection(trText('XMP Metadata')); if (rawXmpString) { try { const parser = new DOMParser(); @@ -248,18 +250,18 @@ async function displayMetadata() { } if (xmpSection.ul.children.length === 0) { - xmpSection.ul.innerHTML = `
    • - No parseable XMP properties found -
    • `; + xmpSection.ul.innerHTML = `
    • ${trHtml('- No parseable XMP properties found -')}
    • `; } } catch (xmlError) { console.error('Failed to parse XMP XML:', xmlError); - xmpSection.ul.innerHTML = `
    • - Error parsing XMP XML. Displaying raw. -
    • `; + xmpSection.ul.innerHTML = `
    • ${trHtml('- Error parsing XMP XML. Displaying raw. -')}
    • `; const pre = document.createElement('pre'); pre.className = 'text-xs text-gray-300 whitespace-pre-wrap break-all'; pre.textContent = rawXmpString; xmpSection.ul.appendChild(pre); } } else { - xmpSection.ul.innerHTML = `
    • - No XMP metadata found -
    • `; + xmpSection.ul.innerHTML = `
    • ${trHtml('- No XMP metadata found -')}
    • `; } metadataDisplay.appendChild(xmpSection.wrapper); @@ -298,7 +300,9 @@ async function updateUI() { const metaSpan = document.createElement('div'); metaSpan.className = 'text-xs text-gray-400'; - metaSpan.textContent = `${formatBytes(pageState.file.size)}`; + metaSpan.textContent = trText('{{size}}', { + size: formatBytes(pageState.file.size), + }); infoContainer.append(nameSpan, metaSpan); @@ -347,7 +351,7 @@ function handleFileSelect(files: FileList | null) { } } -document.addEventListener('DOMContentLoaded', function () { +onPageReady(function () { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const copyBtn = document.getElementById('copy-metadata'); diff --git a/src/js/logic/vsd-to-pdf-page.ts b/src/js/logic/vsd-to-pdf-page.ts index ba466010..dd00dd2b 100644 --- a/src/js/logic/vsd-to-pdf-page.ts +++ b/src/js/logic/vsd-to-pdf-page.ts @@ -8,10 +8,12 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.vsd', '.vsdx']; const FILETYPE_NAME = 'VSD'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -82,7 +84,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -94,14 +98,16 @@ document.addEventListener('DOMContentLoaded', () => { }); if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); downloadFile(pdfBlob, `${baseName}.pdf`); hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -113,7 +119,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); @@ -128,18 +138,23 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} files to PDF.`, + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); } } catch (err) { hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; + const message = + err instanceof Error ? err.message : trText('Unknown error'); console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); showAlert( 'Error', - `An error occurred during conversion. Error: ${message}` + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) ); } }; diff --git a/src/js/logic/wasm-settings-page.ts b/src/js/logic/wasm-settings-page.ts index a288435e..4734bb58 100644 --- a/src/js/logic/wasm-settings-page.ts +++ b/src/js/logic/wasm-settings-page.ts @@ -3,13 +3,9 @@ import { showAlert, showLoader, hideLoader } from '../ui.js'; import { WasmProvider, type WasmPackage } from '../utils/wasm-provider.js'; import { clearPyMuPDFCache } from '../utils/pymupdf-loader.js'; import { clearGhostscriptCache } from '../utils/ghostscript-dynamic-loader.js'; -import { initI18n, t } from '../i18n/index.js'; +import { initI18n, t, onPageReady } from '../i18n/index.js'; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); async function initializePage() { createIcons({ icons }); diff --git a/src/js/logic/webp-to-pdf-page.ts b/src/js/logic/webp-to-pdf-page.ts index 2b2e8049..89bf4ece 100644 --- a/src/js/logic/webp-to-pdf-page.ts +++ b/src/js/logic/webp-to-pdf-page.ts @@ -11,13 +11,11 @@ import { compressImageBytes, } from '../utils/image-compress.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + let files: File[] = []; -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', initializePage); -} else { - initializePage(); -} +onPageReady(initializePage); function initializePage() { createIcons({ icons }); @@ -137,7 +135,9 @@ function updateUI() { const sizeSpan = document.createElement('span'); sizeSpan.className = 'flex-shrink-0 text-gray-400 text-xs'; - sizeSpan.textContent = `(${formatBytes(file.size)})`; + sizeSpan.textContent = trText('({{size}})', { + size: formatBytes(file.size), + }); infoContainer.append(nameSpan, sizeSpan); @@ -180,7 +180,9 @@ function sanitizeImageAsJpeg(imageBytes: Uint8Array | ArrayBuffer) { canvas.toBlob( async (jpegBlob) => { if (!jpegBlob) { - return reject(new Error('Canvas toBlob conversion failed.')); + return reject( + new Error(trText('Canvas toBlob conversion failed.')) + ); } const arrayBuffer = await jpegBlob.arrayBuffer(); resolve(new Uint8Array(arrayBuffer)); @@ -195,7 +197,9 @@ function sanitizeImageAsJpeg(imageBytes: Uint8Array | ArrayBuffer) { URL.revokeObjectURL(imageUrl); reject( new Error( - 'The provided file could not be loaded as an image. It may be corrupted.' + trText( + 'The provided file could not be loaded as an image. It may be corrupted.' + ) ) ); }; diff --git a/src/js/logic/word-to-pdf-page.ts b/src/js/logic/word-to-pdf-page.ts index 76202f96..4ef9678b 100644 --- a/src/js/logic/word-to-pdf-page.ts +++ b/src/js/logic/word-to-pdf-page.ts @@ -8,7 +8,9 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; -document.addEventListener('DOMContentLoaded', () => { +import { trText, onPageReady } from '../i18n/i18n.js'; + +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -129,7 +131,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -150,7 +154,11 @@ document.addEventListener('DOMContentLoaded', () => { file.name ); showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -178,7 +186,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} Word document(s) to PDF.`, + trText('Successfully converted {{length}} Word document(s) to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -192,7 +202,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/word-to-pdf.ts b/src/js/logic/word-to-pdf.ts index a7a7f8a9..320c6c54 100644 --- a/src/js/logic/word-to-pdf.ts +++ b/src/js/logic/word-to-pdf.ts @@ -4,6 +4,8 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; import { readFileAsArrayBuffer } from '../utils/helpers.js'; import { state } from '../state.js'; +import { trText } from '../i18n/i18n.js'; + export async function wordToPdf() { const file = state.files[0]; if (!file) { @@ -154,7 +156,10 @@ export async function wordToPdf() { hideLoader(); showAlert( 'Preview Error', - `Could not generate a preview. The file may be corrupt or contain unsupported features. Error: ${e.message}` + trText( + 'Could not generate a preview. The file may be corrupt or contain unsupported features. Error: {{message}}', + { message: e.message } + ) ); } } diff --git a/src/js/logic/wpd-to-pdf-page.ts b/src/js/logic/wpd-to-pdf-page.ts index 04e75fcc..718fd3f6 100644 --- a/src/js/logic/wpd-to-pdf-page.ts +++ b/src/js/logic/wpd-to-pdf-page.ts @@ -8,10 +8,12 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.wpd']; const FILETYPE_NAME = 'WPD'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -90,7 +92,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -105,7 +109,7 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); @@ -114,7 +118,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -127,7 +133,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -145,7 +155,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} files to PDF.`, + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -155,7 +167,9 @@ document.addEventListener('DOMContentLoaded', () => { console.error(`[${FILETYPE_NAME}ToPDF] Error:`, e); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/wps-to-pdf-page.ts b/src/js/logic/wps-to-pdf-page.ts index 558bb7aa..9ebc1a49 100644 --- a/src/js/logic/wps-to-pdf-page.ts +++ b/src/js/logic/wps-to-pdf-page.ts @@ -8,10 +8,12 @@ import { } from '../utils/libreoffice-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.wps']; const FILETYPE_NAME = 'WPS'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { state.files = []; const fileInput = document.getElementById('file-input') as HTMLInputElement; @@ -90,7 +92,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -105,7 +109,7 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const file = state.files[0]; - showLoader(`Converting ${file.name}...`); + showLoader(trText('Converting {{name}}...', { name: file.name })); const pdfBlob = await converter.convertToPdf(file); const baseName = file.name.replace(/\.[^/.]+$/, ''); @@ -114,7 +118,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -127,7 +133,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await converter.convertToPdf(file); @@ -145,7 +155,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} files to PDF.`, + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); @@ -155,7 +167,9 @@ document.addEventListener('DOMContentLoaded', () => { console.error(`[${FILETYPE_NAME}ToPDF] Error:`, e); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/logic/xml-to-pdf-page.ts b/src/js/logic/xml-to-pdf-page.ts index dc4b5cfe..5293bc53 100644 --- a/src/js/logic/xml-to-pdf-page.ts +++ b/src/js/logic/xml-to-pdf-page.ts @@ -5,10 +5,12 @@ import { createIcons, icons } from 'lucide'; import { convertXmlToPdf } from '../utils/xml-to-pdf.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const ACCEPTED_EXTENSIONS = ['.xml']; const FILETYPE_NAME = 'XML'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -81,7 +83,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 0) { showAlert( 'No Files', - `Please select at least one ${FILETYPE_NAME} file.` + trText('Please select at least one {{FILETYPE_NAME}} file.', { + FILETYPE_NAME, + }) ); return; } @@ -101,7 +105,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${file.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: file.name, + }), 'success', () => resetState() ); @@ -116,7 +122,11 @@ document.addEventListener('DOMContentLoaded', () => { const pdfBlob = await convertXmlToPdf(file, { onProgress: (percent, message) => { showLoader( - `File ${i + 1}/${state.files.length}: ${message}`, + trText('File {{n}}/{{length}}: {{message}}', { + n: i + 1, + length: state.files.length, + message, + }), percent ); }, @@ -136,18 +146,23 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} files to PDF.`, + trText('Successfully converted {{length}} files to PDF.', { + length: state.files.length, + }), 'success', () => resetState() ); } } catch (err) { hideLoader(); - const message = err instanceof Error ? err.message : 'Unknown error'; + const message = + err instanceof Error ? err.message : trText('Unknown error'); console.error(`[${FILETYPE_NAME}ToPDF] Error:`, err); showAlert( 'Error', - `An error occurred during conversion. Error: ${message}` + trText('An error occurred during conversion. Error: {{message}}', { + message, + }) ); } }; diff --git a/src/js/logic/xps-to-pdf-page.ts b/src/js/logic/xps-to-pdf-page.ts index e8a10a8e..0b4f89d3 100644 --- a/src/js/logic/xps-to-pdf-page.ts +++ b/src/js/logic/xps-to-pdf-page.ts @@ -5,11 +5,13 @@ import { createIcons, icons } from 'lucide'; import { loadPyMuPDF } from '../utils/pymupdf-loader.js'; import { deduplicateFileName } from '../utils/deduplicate-filename.js'; +import { trText, onPageReady } from '../i18n/i18n.js'; + const FILETYPE = 'xps'; const EXTENSIONS = ['.xps', '.oxps']; const TOOL_NAME = 'XPS'; -document.addEventListener('DOMContentLoaded', () => { +onPageReady(() => { const fileInput = document.getElementById('file-input') as HTMLInputElement; const dropZone = document.getElementById('drop-zone'); const processBtn = document.getElementById('process-btn'); @@ -84,7 +86,12 @@ document.addEventListener('DOMContentLoaded', () => { const convertToPdf = async () => { try { if (state.files.length === 0) { - showAlert('No Files', `Please select at least one ${TOOL_NAME} file.`); + showAlert( + 'No Files', + trText('Please select at least one {{TOOL_NAME}} file.', { + TOOL_NAME, + }) + ); return; } @@ -93,7 +100,9 @@ document.addEventListener('DOMContentLoaded', () => { if (state.files.length === 1) { const originalFile = state.files[0]; - showLoader(`Converting ${originalFile.name}...`); + showLoader( + trText('Converting {{name}}...', { name: originalFile.name }) + ); const pdfBlob = await pymupdf.convertToPdf(originalFile, { filetype: FILETYPE, @@ -105,7 +114,9 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${originalFile.name} to PDF.`, + trText('Successfully converted {{name}} to PDF.', { + name: originalFile.name, + }), 'success', () => resetState() ); @@ -118,7 +129,11 @@ document.addEventListener('DOMContentLoaded', () => { for (let i = 0; i < state.files.length; i++) { const file = state.files[i]; showLoader( - `Converting ${i + 1}/${state.files.length}: ${file.name}...` + trText('Converting {{n}}/{{length}}: {{name}}...', { + n: i + 1, + length: state.files.length, + name: file.name, + }) ); const pdfBlob = await pymupdf.convertToPdf(file, { @@ -140,7 +155,10 @@ document.addEventListener('DOMContentLoaded', () => { showAlert( 'Conversion Complete', - `Successfully converted ${state.files.length} ${TOOL_NAME} file(s) to PDF.`, + trText( + 'Successfully converted {{length}} {{TOOL_NAME}} file(s) to PDF.', + { length: state.files.length, TOOL_NAME } + ), 'success', () => resetState() ); @@ -150,7 +168,9 @@ document.addEventListener('DOMContentLoaded', () => { hideLoader(); showAlert( 'Error', - `An error occurred during conversion. Error: ${e instanceof Error ? e.message : String(e)}` + trText('An error occurred during conversion. Error: {{error}}', { + error: e instanceof Error ? e.message : String(e), + }) ); } }; diff --git a/src/js/main.ts b/src/js/main.ts index 7fe19a61..ba2658e7 100644 --- a/src/js/main.ts +++ b/src/js/main.ts @@ -18,6 +18,7 @@ import { rewriteLinks, injectLanguageSwitcher, t, + trText, } from './i18n/index.js'; import { loadRuntimeConfig, @@ -51,13 +52,16 @@ const init = async () => { applyTranslations(); if (isCurrentPageDisabled()) { - document.title = t('disabledTool.title') || 'Tool Unavailable'; + document.title = t('disabledTool.title') || trText('Tool Unavailable'); const main = document.querySelector('main') || document.body; - const heading = t('disabledTool.heading') || 'This tool has been disabled'; + const heading = + t('disabledTool.heading') || trText('This tool has been disabled'); const message = t('disabledTool.message') || - 'This tool is not available in your deployment. Contact your administrator for more information.'; - const backHome = t('disabledTool.backHome') || 'Back to Home'; + trText( + 'This tool is not available in your deployment. Contact your administrator for more information.' + ); + const backHome = t('disabledTool.backHome') || trText('Back to Home'); main.innerHTML = `
      @@ -126,7 +130,10 @@ const init = async () => { }); const brandName = __BRAND_NAME__ || 'BentoPDF'; - document.title = `${brandName} - ${t('simpleMode.title')}`; + document.title = trText('{{brandName}} - {{title}}', { + brandName, + title: t('simpleMode.title'), + }); const toolsHeader = document.getElementById('tools-header'); if (toolsHeader) { @@ -254,6 +261,8 @@ const init = async () => { 'Repair PDF': 'tools:repairPdf', 'Encrypt PDF': 'tools:encryptPdf', 'Sanitize PDF': 'tools:sanitizePdf', + 'Protect PDF': 'tools:protectPdf', + 'Unlock PDF': 'tools:unlockPdf', 'Decrypt PDF': 'tools:decryptPdf', 'Flatten PDF': 'tools:flattenPdf', 'Remove Metadata': 'tools:removeMetadata', @@ -1204,28 +1213,52 @@ const init = async () => { // Reserved shortcuts that commonly conflict with browser/OS functions const RESERVED_SHORTCUTS: Record = { - 'mod+w': { mac: 'Closes tab', windows: 'Closes tab' }, - 'mod+t': { mac: 'Opens new tab', windows: 'Opens new tab' }, - 'mod+n': { mac: 'Opens new window', windows: 'Opens new window' }, + 'mod+w': { mac: trText('Closes tab'), windows: trText('Closes tab') }, + 'mod+t': { + mac: trText('Opens new tab'), + windows: trText('Opens new tab'), + }, + 'mod+n': { + mac: trText('Opens new window'), + windows: trText('Opens new window'), + }, 'mod+shift+n': { - mac: 'Opens incognito window', - windows: 'Opens incognito window', + mac: trText('Opens incognito window'), + windows: trText('Opens incognito window'), + }, + 'mod+q': { mac: trText('Quits application (cannot be overridden)') }, + 'mod+m': { mac: trText('Minimizes window') }, + 'mod+h': { mac: trText('Hides window') }, + 'mod+r': { mac: trText('Reloads page'), windows: trText('Reloads page') }, + 'mod+shift+r': { + mac: trText('Hard reloads page'), + windows: trText('Hard reloads page'), + }, + 'mod+l': { + mac: trText('Focuses address bar'), + windows: trText('Focuses address bar'), + }, + 'mod+d': { + mac: trText('Bookmarks page'), + windows: trText('Bookmarks page'), }, - 'mod+q': { mac: 'Quits application (cannot be overridden)' }, - 'mod+m': { mac: 'Minimizes window' }, - 'mod+h': { mac: 'Hides window' }, - 'mod+r': { mac: 'Reloads page', windows: 'Reloads page' }, - 'mod+shift+r': { mac: 'Hard reloads page', windows: 'Hard reloads page' }, - 'mod+l': { mac: 'Focuses address bar', windows: 'Focuses address bar' }, - 'mod+d': { mac: 'Bookmarks page', windows: 'Bookmarks page' }, 'mod+shift+t': { - mac: 'Reopens closed tab', - windows: 'Reopens closed tab', + mac: trText('Reopens closed tab'), + windows: trText('Reopens closed tab'), + }, + 'mod+shift+w': { + mac: trText('Closes window'), + windows: trText('Closes window'), + }, + 'mod+tab': { + mac: trText('Switches tabs'), + windows: trText('Switches apps'), + }, + 'alt+f4': { windows: trText('Closes window') }, + 'ctrl+tab': { + mac: trText('Switches tabs'), + windows: trText('Switches tabs'), }, - 'mod+shift+w': { mac: 'Closes window', windows: 'Closes window' }, - 'mod+tab': { mac: 'Switches tabs', windows: 'Switches apps' }, - 'alt+f4': { windows: 'Closes window' }, - 'ctrl+tab': { mac: 'Switches tabs', windows: 'Switches tabs' }, }; function getReservedShortcutWarning( diff --git a/src/js/sw-register.ts b/src/js/sw-register.ts index 682490cd..d2feefab 100644 --- a/src/js/sw-register.ts +++ b/src/js/sw-register.ts @@ -6,6 +6,8 @@ * conflicts with Vite's HMR (Hot Module Replacement) */ +import { trText } from './i18n/i18n'; + // Skip service worker registration in development mode const isDevelopment = window.location.hostname === 'localhost' || @@ -48,6 +50,7 @@ if (isDevelopment) { console.log('Service Worker will be active in production builds'); } else if ('serviceWorker' in navigator) { window.addEventListener('load', () => { + const hadController = Boolean(navigator.serviceWorker.controller); const swPath = `${import.meta.env.BASE_URL}sw.js`; console.log('[SW] Registering Service Worker at:', swPath); navigator.serviceWorker @@ -84,7 +87,9 @@ if (isDevelopment) { if ( confirm( - 'A new version of BentoPDF is available. Reload to update?' + trText( + 'A new version of BentoPDF is available. Reload to update?' + ) ) ) { newWorker.postMessage({ type: 'SKIP_WAITING' }); @@ -104,6 +109,7 @@ if (isDevelopment) { }); navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!hadController) return; console.log('[SW] New service worker activated, reloading...'); window.location.reload(); }); diff --git a/src/js/ui.ts b/src/js/ui.ts index 6f93122f..5460429b 100644 --- a/src/js/ui.ts +++ b/src/js/ui.ts @@ -12,7 +12,7 @@ import { updateRotationState, } from './utils/rotation-state.js'; import * as pdfjsLib from 'pdfjs-dist'; -import { t } from './i18n/i18n'; +import { t, trText } from './i18n/i18n'; import type { FileInputOptions } from '@/types'; import './utils/setup-pdf-worker.js'; @@ -50,7 +50,7 @@ export const dom = { }; export const showLoader = (text = t('common.loading'), progress?: number) => { - if (dom.loaderText) dom.loaderText.textContent = text; + if (dom.loaderText) dom.loaderText.textContent = trText(text); // Add or update progress bar if progress is provided const loaderModal = dom.loaderModal; @@ -89,7 +89,9 @@ export const showLoader = (text = t('common.loading'), progress?: number) => { '.loader-progress-text' ); if (progressText) { - progressText.textContent = `${Math.round(progress)}%`; + progressText.textContent = trText('{{progress}}%', { + progress: Math.round(progress), + }); } progressContainer.classList.remove('hidden'); } else { @@ -113,8 +115,8 @@ export const showAlert = ( type: string = 'error', callback?: () => void ) => { - if (dom.alertTitle) dom.alertTitle.textContent = title; - if (dom.alertMessage) dom.alertMessage.textContent = message; + if (dom.alertTitle) dom.alertTitle.textContent = trText(title); + if (dom.alertMessage) dom.alertMessage.textContent = trText(message); if (dom.alertModal) dom.alertModal.classList.remove('hidden'); if (dom.alertOkBtn) { @@ -359,7 +361,7 @@ export const renderPageThumbnails = async ( const rotateBtn = document.createElement('button'); rotateBtn.className = 'rotate-btn btn bg-gray-700 hover:bg-gray-600 p-1.5 rounded-md text-gray-200 transition-colors flex-shrink-0'; - rotateBtn.title = 'Rotate +90°'; + rotateBtn.title = trText('Rotate +90°'); rotateBtn.innerHTML = ''; rotateBtn.addEventListener('click', (e) => { e.stopPropagation(); @@ -418,7 +420,12 @@ export const renderPageThumbnails = async ( useLazyLoading: true, lazyLoadMargin: '300px', onProgress: (current, total) => { - showLoader(`Rendering page previews: ${current}/${total}`); + showLoader( + trText('Rendering page previews: {{current}}/{{total}}', { + current, + total, + }) + ); }, onBatchComplete: () => { createIcons({ icons }); @@ -484,7 +491,7 @@ const createFileInputHTML = (options: FileInputOptions = {}) => {

      ${t('upload.clickToSelect')} ${t('upload.orDragAndDrop')}

      -

      ${multiple ? t('upload.pdfOrImages') : 'A single PDF file'}

      +

      ${multiple ? t('upload.pdfOrImages') : trText('A single PDF file')}

      ${t('upload.filesNeverLeave')}

      diff --git a/src/js/utils/comic-info.ts b/src/js/utils/comic-info.ts index ef0a600f..d8897bff 100644 --- a/src/js/utils/comic-info.ts +++ b/src/js/utils/comic-info.ts @@ -60,11 +60,11 @@ export function generateComicInfoXml(params: ComicMetadata): string { lines.push(` ${params.pageCount}`); if (params.blackAndWhite) { - lines.push(' Yes'); + lines.push(` Yes`); } if (params.manga) { - lines.push(' YesAndRightToLeft'); + lines.push(` YesAndRightToLeft`); } lines.push(''); diff --git a/src/js/utils/compress.ts b/src/js/utils/compress.ts index 4f51414f..d79886f0 100644 --- a/src/js/utils/compress.ts +++ b/src/js/utils/compress.ts @@ -11,6 +11,8 @@ import type { } from 'hyper-compress-wasm'; import type { HyperCompressRequest, HyperCompressResponse } from '@/types'; +import { trText } from '../i18n/i18n.js'; + export const COMPRESS_LEVELS: readonly CompressLevel[] = [ 'low', 'medium', @@ -127,7 +129,7 @@ function getHyperWorker(): Worker { worker, new HyperError( 'engine_error', - e.message || 'The compression engine stopped unexpectedly.' + e.message || trText('The compression engine stopped unexpectedly.') ) ); }; @@ -136,7 +138,7 @@ function getHyperWorker(): Worker { worker, new HyperError( 'engine_error', - 'The compression engine returned an unreadable result.' + trText('The compression engine returned an unreadable result.') ) ); }; @@ -161,14 +163,20 @@ export async function compressWithHyper( options: HyperWasmOptions ): Promise { if (!hasPdfHeader(pdf)) { - throw new HyperError('engine_error', 'This file is not a valid PDF.'); + throw new HyperError( + 'engine_error', + trText('This file is not a valid PDF.') + ); } const message = await postToHyper( (id) => ({ id, type: 'compress', bytes: pdf, options }), pdf ); if (message.type !== 'result') { - throw new HyperError('engine_error', 'Unexpected reply from the engine.'); + throw new HyperError( + 'engine_error', + trText('Unexpected reply from the engine.') + ); } return message.result; } @@ -182,7 +190,10 @@ export async function verifyHyperPassword( pdf ); if (message.type !== 'verified') { - throw new HyperError('engine_error', 'Unexpected reply from the engine.'); + throw new HyperError( + 'engine_error', + trText('Unexpected reply from the engine.') + ); } return message.valid; } diff --git a/src/js/utils/cpdf-helper.ts b/src/js/utils/cpdf-helper.ts index 32a59aa8..1b5f75f0 100644 --- a/src/js/utils/cpdf-helper.ts +++ b/src/js/utils/cpdf-helper.ts @@ -1,6 +1,8 @@ import { WasmProvider } from './wasm-provider'; import type { WindowWithCoherentPdf, CpdfInstance } from '@/types'; +import { trText } from '../i18n/i18n.js'; + let cpdfLoaded = false; let cpdfLoadPromise: Promise | null = null; @@ -27,7 +29,9 @@ export async function isCpdfLoaded(): Promise { const cpdfUrl = getCpdfUrl(); if (!cpdfUrl) { throw new Error( - 'CoherentPDF is not configured. Please configure it in WASM Settings.' + trText( + 'CoherentPDF is not configured. Please configure it in WASM Settings.' + ) ); } diff --git a/src/js/utils/csv-to-pdf.ts b/src/js/utils/csv-to-pdf.ts index 589ff593..a87135f5 100644 --- a/src/js/utils/csv-to-pdf.ts +++ b/src/js/utils/csv-to-pdf.ts @@ -2,89 +2,95 @@ import { jsPDF } from 'jspdf'; import autoTable from 'jspdf-autotable'; import Papa from 'papaparse'; +import { trText } from '../i18n/i18n.js'; + export interface CsvToPdfOptions { - onProgress?: (percent: number, message: string) => void; + onProgress?: (percent: number, message: string) => void; } /** * Convert a CSV file to PDF using jsPDF and autotable */ export async function convertCsvToPdf( - file: File, - options?: CsvToPdfOptions + file: File, + options?: CsvToPdfOptions ): Promise { - const { onProgress } = options || {}; + const { onProgress } = options || {}; - return new Promise((resolve, reject) => { - onProgress?.(10, 'Reading CSV file...'); + return new Promise((resolve, reject) => { + onProgress?.(10, trText('Reading CSV file...')); - Papa.parse(file, { - complete: (results) => { - try { - onProgress?.(50, 'Generating PDF...'); + Papa.parse(file, { + complete: (results) => { + try { + onProgress?.(50, trText('Generating PDF...')); - const data = results.data as string[][]; + const data = results.data as string[][]; - // Filter out empty rows - const filteredData = data.filter(row => - row.some(cell => cell && cell.trim() !== '') - ); + // Filter out empty rows + const filteredData = data.filter((row) => + row.some((cell) => cell && cell.trim() !== '') + ); - if (filteredData.length === 0) { - reject(new Error('CSV file is empty')); - return; - } + if (filteredData.length === 0) { + reject(new Error(trText('CSV file is empty'))); + return; + } - // Create PDF document - const doc = new jsPDF({ - orientation: 'landscape', // Better for wide tables - unit: 'mm', - format: 'a4' - }); + // Create PDF document + const doc = new jsPDF({ + orientation: 'landscape', // Better for wide tables + unit: 'mm', + format: 'a4', + }); - // Extract headers (first row) and data - const headers = filteredData[0]; - const rows = filteredData.slice(1); + // Extract headers (first row) and data + const headers = filteredData[0]; + const rows = filteredData.slice(1); - onProgress?.(70, 'Creating table...'); + onProgress?.(70, trText('Creating table...')); - // Generate table - autoTable(doc, { - head: [headers], - body: rows, - startY: 20, - styles: { - fontSize: 9, - cellPadding: 3, - overflow: 'linebreak', - cellWidth: 'wrap', - }, - headStyles: { - fillColor: [41, 128, 185], // Nice blue header - textColor: 255, - fontStyle: 'bold', - }, - alternateRowStyles: { - fillColor: [245, 245, 245], // Light gray for alternate rows - }, - margin: { top: 20, left: 10, right: 10 }, - theme: 'striped', - }); - - onProgress?.(90, 'Finalizing PDF...'); - - // Get PDF as blob - const pdfBlob = doc.output('blob'); - - onProgress?.(100, 'Complete!'); - resolve(pdfBlob); - } catch (error) { - reject(error); - } + // Generate table + autoTable(doc, { + head: [headers], + body: rows, + startY: 20, + styles: { + fontSize: 9, + cellPadding: 3, + overflow: 'linebreak', + cellWidth: 'wrap', }, - error: (error) => { - reject(new Error(`Failed to parse CSV: ${error.message}`)); + headStyles: { + fillColor: [41, 128, 185], // Nice blue header + textColor: 255, + fontStyle: 'bold', }, - }); + alternateRowStyles: { + fillColor: [245, 245, 245], // Light gray for alternate rows + }, + margin: { top: 20, left: 10, right: 10 }, + theme: 'striped', + }); + + onProgress?.(90, trText('Finalizing PDF...')); + + // Get PDF as blob + const pdfBlob = doc.output('blob'); + + onProgress?.(100, trText('Complete!')); + resolve(pdfBlob); + } catch (error) { + reject(error); + } + }, + error: (error) => { + reject( + new Error( + trText('Failed to parse CSV: {{error}}', { error: error.message }) + ) + ); + }, }); + }); } diff --git a/src/js/utils/font-loader.ts b/src/js/utils/font-loader.ts index 62e8b007..6d3fd1a7 100644 --- a/src/js/utils/font-loader.ts +++ b/src/js/utils/font-loader.ts @@ -5,6 +5,8 @@ import { } from '../config/font-mappings.js'; import { needsFontEmbedding } from './freetext-script.js'; +import { trText } from '../i18n/i18n.js'; + const fontCache: Map = new Map(); const DB_NAME = 'bentopdf-fonts'; @@ -112,7 +114,11 @@ export async function getFontForLanguage(lang: string): Promise { const fontResponse = await fetch(fontUrl); if (!fontResponse.ok) { - throw new Error(`Failed to fetch font file: ${fontResponse.statusText}`); + throw new Error( + trText('Failed to fetch font file: {{statusText}}', { + statusText: fontResponse.statusText, + }) + ); } const fontBuffer = await fontResponse.arrayBuffer(); @@ -167,7 +173,7 @@ export async function loadFallbackFonts( load = getFontForLanguage(lang) .then((buffer) => { if (!fontCache.has(family)) { - throw new Error('Only a substitute font was available'); + throw new Error(trText('Only a substitute font was available')); } into.set(family, new Uint8Array(buffer)); return true; diff --git a/src/js/utils/full-width.ts b/src/js/utils/full-width.ts index e8359452..5f0e20e3 100644 --- a/src/js/utils/full-width.ts +++ b/src/js/utils/full-width.ts @@ -1,8 +1,9 @@ // Full-width mode utility // This script applies the full-width preference from localStorage to page uploaders +import { getStoredItem } from './safe-storage.js'; export function initFullWidthMode() { - const savedFullWidth = localStorage.getItem('fullWidthMode') !== 'false'; + const savedFullWidth = getStoredItem('fullWidthMode') !== 'false'; if (savedFullWidth) { applyFullWidthMode(true); diff --git a/src/js/utils/ghostscript-dynamic-loader.ts b/src/js/utils/ghostscript-dynamic-loader.ts index 4a843752..cac22e74 100644 --- a/src/js/utils/ghostscript-dynamic-loader.ts +++ b/src/js/utils/ghostscript-dynamic-loader.ts @@ -4,6 +4,8 @@ import type { GhostscriptDynamicInstance, } from '@/types'; +import { trText } from '../i18n/i18n.js'; + let cachedGS: GhostscriptInterface | null = null; let loadPromise: Promise | null = null; @@ -25,7 +27,9 @@ export async function loadGhostscript(): Promise { const baseUrl = WasmProvider.getUrl('ghostscript'); if (!baseUrl) { throw new Error( - 'Ghostscript is not configured. Please configure it in Advanced Settings.' + trText( + 'Ghostscript is not configured. Please configure it in Advanced Settings.' + ) ); } @@ -52,7 +56,9 @@ export async function loadGhostscript(): Promise { cachedGS = instance as unknown as GhostscriptInterface; } else { throw new Error( - 'Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.' + trText( + 'Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.' + ) ); } @@ -61,7 +67,10 @@ export async function loadGhostscript(): Promise { loadPromise = null; const msg = error instanceof Error ? error.message : String(error); throw new Error( - `Failed to load Ghostscript from ${normalizedUrl}: ${msg}`, + trText('Failed to load Ghostscript from {{normalizedUrl}}: {{msg}}', { + normalizedUrl, + msg, + }), { cause: error } ); } @@ -83,7 +92,8 @@ function loadScript(url: string): Promise { script.async = true; script.onload = () => resolve(); - script.onerror = () => reject(new Error(`Failed to load script: ${url}`)); + script.onerror = () => + reject(new Error(trText('Failed to load script: {{url}}', { url }))); document.head.appendChild(script); }); diff --git a/src/js/utils/ghostscript-loader.ts b/src/js/utils/ghostscript-loader.ts index bf1c6b83..45c62d56 100644 --- a/src/js/utils/ghostscript-loader.ts +++ b/src/js/utils/ghostscript-loader.ts @@ -8,6 +8,8 @@ import { getWasmBaseUrl, isWasmAvailable } from '../config/wasm-cdn-config.js'; import { PDFDict, PDFName, PDFArray } from 'pdf-lib'; import { loadPdfDocument } from './load-pdf-document.js'; +import { trText } from '../i18n/i18n.js'; + interface GhostscriptModule { FS: { writeFile(path: string, data: Uint8Array | string): void; @@ -37,7 +39,11 @@ export async function loadGsModule(): Promise { const gsJsUrl = `${normalizedUrl}gs.js`; const response = await fetch(gsJsUrl); if (!response.ok) { - throw new Error(`Failed to fetch gs.js: HTTP ${response.status}`); + throw new Error( + trText('Failed to fetch gs.js: HTTP {{status}}', { + status: response.status, + }) + ); } const jsText = await response.text(); const blob = new Blob([jsText], { type: 'application/javascript' }); @@ -69,11 +75,13 @@ export async function convertToPdfA( ): Promise { if (!isWasmAvailable('ghostscript')) { throw new Error( - 'Ghostscript is not configured. Please configure it in WASM Settings.' + trText( + 'Ghostscript is not configured. Please configure it in WASM Settings.' + ) ); } - onProgress?.('Loading Ghostscript...'); + onProgress?.(trText('Loading Ghostscript...')); let gs: GhostscriptModule; @@ -98,7 +106,7 @@ export async function convertToPdfA( gs.FS.writeFile(inputPath, pdfData); console.log('[Ghostscript] Input file size:', pdfData.length); - onProgress?.(`Converting to ${level}...`); + onProgress?.(trText('Converting to {{level}}...', { level })); try { const iccFileName = 'sRGB_IEC61966-2-1_no_black_scaling.icc'; @@ -107,7 +115,10 @@ export async function convertToPdfA( if (!response.ok) { throw new Error( - `Failed to fetch ICC profile from ${iccUrl}: HTTP ${response.status}` + trText('Failed to fetch ICC profile from {{iccUrl}}: HTTP {{status}}', { + iccUrl, + status: response.status, + }) ); } @@ -157,9 +168,12 @@ export async function convertToPdfA( ); } catch (e) { console.error('[Ghostscript] Failed to setup PDF/A assets:', e); - throw new Error('Conversion failed: could not create PDF/A definition', { - cause: e, - }); + throw new Error( + trText('Conversion failed: could not create PDF/A definition'), + { + cause: e, + } + ); } const args = [ @@ -199,7 +213,9 @@ export async function convertToPdfA( exitCode = gs.callMain(args); } catch (e) { console.error('[Ghostscript] Exception:', e); - throw new Error(`Ghostscript threw an exception: ${e}`, { cause: e }); + throw new Error(trText('Ghostscript threw an exception: {{e}}', { e }), { + cause: e, + }); } console.log('[Ghostscript] Exit code:', exitCode); @@ -225,7 +241,11 @@ export async function convertToPdfA( } catch (e) { console.warn('[Ghostscript] Failed to clean up temp file:', e); } - throw new Error(`Ghostscript conversion failed with exit code ${exitCode}`); + throw new Error( + trText('Ghostscript conversion failed with exit code {{exitCode}}', { + exitCode, + }) + ); } // Read output @@ -236,7 +256,9 @@ export async function convertToPdfA( output = gs.FS.readFile(outputPath); } catch (e) { console.error('[Ghostscript] Failed to read output:', e); - throw new Error('Ghostscript did not produce output file', { cause: e }); + throw new Error(trText('Ghostscript did not produce output file'), { + cause: e, + }); } // Cleanup @@ -262,7 +284,7 @@ export async function convertToPdfA( } if (level !== 'PDF/A-1b') { - onProgress?.('Post-processing for transparency compliance...'); + onProgress?.(trText('Post-processing for transparency compliance...')); console.log( '[Ghostscript] Adding Group dictionaries to pages for transparency compliance...' ); @@ -395,11 +417,13 @@ export async function convertFontsToOutlines( ): Promise { if (!isWasmAvailable('ghostscript')) { throw new Error( - 'Ghostscript is not configured. Please configure it in WASM Settings.' + trText( + 'Ghostscript is not configured. Please configure it in WASM Settings.' + ) ); } - onProgress?.('Loading Ghostscript...'); + onProgress?.(trText('Loading Ghostscript...')); let gs: GhostscriptModule; @@ -415,7 +439,7 @@ export async function convertFontsToOutlines( gs.FS.writeFile(inputPath, pdfData); - onProgress?.('Converting fonts to outlines...'); + onProgress?.(trText('Converting fonts to outlines...')); const args = [ '-dSAFER', @@ -438,7 +462,9 @@ export async function convertFontsToOutlines( } catch (e2) { console.warn('[Ghostscript] Failed to clean up temp file:', e2); } - throw new Error(`Ghostscript threw an exception: ${e}`, { cause: e }); + throw new Error(trText('Ghostscript threw an exception: {{e}}', { e }), { + cause: e, + }); } if (exitCode !== 0) { @@ -452,14 +478,20 @@ export async function convertFontsToOutlines( } catch (e) { console.warn('[Ghostscript] Failed to clean up temp file:', e); } - throw new Error(`Ghostscript conversion failed with exit code ${exitCode}`); + throw new Error( + trText('Ghostscript conversion failed with exit code {{exitCode}}', { + exitCode, + }) + ); } let output: Uint8Array; try { output = gs.FS.readFile(outputPath); } catch (e) { - throw new Error('Ghostscript did not produce output file', { cause: e }); + throw new Error(trText('Ghostscript did not produce output file'), { + cause: e, + }); } try { @@ -535,7 +567,10 @@ export async function convertPdfToRgb( ]); if (exitCode !== 0) { throw new Error( - `Ghostscript RGB conversion failed with exit code ${exitCode}` + trText( + 'Ghostscript RGB conversion failed with exit code {{exitCode}}', + { exitCode } + ) ); } return gs.FS.readFile(outputPath); diff --git a/src/js/utils/image-compress.ts b/src/js/utils/image-compress.ts index 3a0aa14c..baf4d865 100644 --- a/src/js/utils/image-compress.ts +++ b/src/js/utils/image-compress.ts @@ -1,3 +1,4 @@ +import { trText } from '../i18n/i18n.js'; export type ImageQuality = 'high' | 'medium' | 'low'; interface QualityConfig { @@ -54,7 +55,7 @@ export async function compressImageFile( const ctx = canvas.getContext('2d'); if (!ctx) { URL.revokeObjectURL(url); - reject(new Error('Canvas context failed')); + reject(new Error(trText('Canvas context failed'))); return; } @@ -64,7 +65,7 @@ export async function compressImageFile( canvas.toBlob( (blob) => { if (!blob) { - reject(new Error('Canvas toBlob failed')); + reject(new Error(trText('Canvas toBlob failed'))); return; } const newName = file.name.replace(/\.[^.]+$/, '.jpg'); @@ -124,7 +125,7 @@ export async function compressImageBytes( const ctx = canvas.getContext('2d'); if (!ctx) { URL.revokeObjectURL(url); - reject(new Error('Canvas context failed')); + reject(new Error(trText('Canvas context failed'))); return; } @@ -134,7 +135,7 @@ export async function compressImageBytes( canvas.toBlob( async (jpegBlob) => { if (!jpegBlob) { - reject(new Error('Canvas toBlob failed')); + reject(new Error(trText('Canvas toBlob failed'))); return; } const arrayBuffer = await jpegBlob.arrayBuffer(); diff --git a/src/js/utils/image-input-utils.ts b/src/js/utils/image-input-utils.ts index 65d50fa9..40fb629a 100644 --- a/src/js/utils/image-input-utils.ts +++ b/src/js/utils/image-input-utils.ts @@ -1,5 +1,7 @@ import heic2any from 'heic2any'; +import { trText } from '../i18n/i18n.js'; + export const IMAGE_EXTENSIONS = [ '.jpg', '.jpeg', @@ -60,7 +62,10 @@ export async function preprocessImageFile(file: File): Promise { }); } catch (cause) { console.error(`Failed to convert HEIC: ${file.name}`, cause); - throw new Error(`Failed to process HEIC file: ${file.name}`, { cause }); + throw new Error( + trText('Failed to process HEIC file: {{name}}', { name: file.name }), + { cause } + ); } } @@ -76,7 +81,7 @@ export async function preprocessImageFile(file: File): Promise { const ctx = canvas.getContext('2d'); if (!ctx) { URL.revokeObjectURL(url); - reject(new Error('Canvas context failed')); + reject(new Error(trText('Canvas context failed'))); return; } ctx.drawImage(img, 0, 0); @@ -89,19 +94,22 @@ export async function preprocessImageFile(file: File): Promise { }) ); } else { - reject(new Error('Canvas toBlob failed')); + reject(new Error(trText('Canvas toBlob failed'))); } }, 'image/png'); }; img.onerror = () => { URL.revokeObjectURL(url); - reject(new Error('Failed to load WebP image')); + reject(new Error(trText('Failed to load WebP image'))); }; img.src = url; }); } catch (cause) { console.error(`Failed to convert WebP: ${file.name}`, cause); - throw new Error(`Failed to process WebP file: ${file.name}`, { cause }); + throw new Error( + trText('Failed to process WebP file: {{name}}', { name: file.name }), + { cause } + ); } } diff --git a/src/js/utils/images-to-pdf-lib.ts b/src/js/utils/images-to-pdf-lib.ts index 10c97289..e18f3857 100644 --- a/src/js/utils/images-to-pdf-lib.ts +++ b/src/js/utils/images-to-pdf-lib.ts @@ -1,6 +1,8 @@ import { PDFDocument as PDFLibDocument } from 'pdf-lib'; import { preprocessImageFile } from './image-input-utils.js'; +import { trText } from '../i18n/i18n.js'; + export interface EmbeddableImage { bytes: Uint8Array; format: 'jpg' | 'png'; @@ -36,18 +38,23 @@ export async function normalizeImageToEmbeddable( const i = new Image(); i.onload = () => resolve(i); i.onerror = () => - reject(new Error(`Failed to decode image: ${processed.name}`)); + reject( + new Error( + trText('Failed to decode image: {{name}}', { name: processed.name }) + ) + ); i.src = url; }); const canvas = document.createElement('canvas'); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; const ctx = canvas.getContext('2d'); - if (!ctx) throw new Error('Canvas context unavailable'); + if (!ctx) throw new Error(trText('Canvas context unavailable')); ctx.drawImage(img, 0, 0); const blob = await new Promise((resolve, reject) => { canvas.toBlob( - (b) => (b ? resolve(b) : reject(new Error('Canvas toBlob failed'))), + (b) => + b ? resolve(b) : reject(new Error(trText('Canvas toBlob failed'))), 'image/png' ); }); diff --git a/src/js/utils/libreoffice-loader.ts b/src/js/utils/libreoffice-loader.ts index 8321f63f..e6bfbf4b 100644 --- a/src/js/utils/libreoffice-loader.ts +++ b/src/js/utils/libreoffice-loader.ts @@ -8,6 +8,8 @@ import { WorkerBrowserConverter } from '@matbee/libreoffice-converter/browser'; import type { InputFormat } from '@matbee/libreoffice-converter/browser'; +import { trText } from '../i18n/i18n.js'; + const LIBREOFFICE_LOCAL_PATH = import.meta.env.BASE_URL + 'libreoffice-wasm/'; export interface LoadProgress { @@ -30,7 +32,12 @@ async function fetchAsDecompressedUrl( ): Promise { const response = await fetch(url); if (!response.ok) { - throw new Error(`Failed to fetch ${url}: HTTP ${response.status}`); + throw new Error( + trText('Failed to fetch {{url}}: HTTP {{status}}', { + url, + status: response.status, + }) + ); } let blob = await response.blob(); @@ -72,7 +79,7 @@ export class LibreOfficeConverter { progressCallback?.({ phase: 'loading', percent: 0, - message: 'Loading conversion engine...', + message: trText('Loading conversion engine...'), }); const [sofficeWasmUrl, sofficeDataUrl] = await Promise.all([ @@ -99,7 +106,10 @@ export class LibreOfficeConverter { message: string; }) => { if (progressCallback && !this.initialized) { - const simplifiedMessage = `Loading conversion engine (${Math.round(info.percent)}%)...`; + const simplifiedMessage = trText( + 'Loading conversion engine ({{percent}}%)...', + { percent: Math.round(info.percent) } + ); progressCallback({ phase: info.phase as LoadProgress['phase'], percent: info.percent, @@ -122,7 +132,7 @@ export class LibreOfficeConverter { progressCallback?.({ phase: 'ready', percent: 100, - message: 'Conversion engine ready!', + message: trText('Conversion engine ready!'), }); // Null out the callback to prevent any late-firing progress updates @@ -138,7 +148,7 @@ export class LibreOfficeConverter { async convertToPdf(file: File): Promise { if (!this.converter) { - throw new Error('Converter not initialized'); + throw new Error(trText('Converter not initialized')); } console.log(`[LibreOffice] Converting ${file.name} to PDF...`); diff --git a/src/js/utils/load-pdf-document.ts b/src/js/utils/load-pdf-document.ts index ca421b70..a5d6386d 100644 --- a/src/js/utils/load-pdf-document.ts +++ b/src/js/utils/load-pdf-document.ts @@ -1,6 +1,8 @@ import { PDFDocument } from 'pdf-lib'; import { initializeQpdf } from './helpers.js'; +import { trText } from '../i18n/i18n.js'; + type LoadOptions = Parameters[1]; type PDFDocumentInstance = Awaited>; @@ -55,7 +57,7 @@ export async function removeUnreferencedObjects( [] ); if (!cleaned) { - throw new Error('Could not remove leftover data from the PDF.'); + throw new Error(trText('Could not remove leftover data from the PDF.')); } return cleaned; } diff --git a/src/js/utils/markdown-editor.ts b/src/js/utils/markdown-editor.ts index 028f5cf6..4b0e71fa 100644 --- a/src/js/utils/markdown-editor.ts +++ b/src/js/utils/markdown-editor.ts @@ -29,7 +29,7 @@ import mark from 'markdown-it-mark'; import taskLists from 'markdown-it-task-lists'; import anchor from 'markdown-it-anchor'; import tocDoneRight from 'markdown-it-toc-done-right'; -import { applyTranslations } from '../i18n/i18n'; +import { applyTranslations, trHtml, trText } from '../i18n/i18n'; import type { WindowWithLucide, WindowWithI18next, @@ -352,7 +352,7 @@ export class MarkdownEditor {
      - @@ -738,7 +738,9 @@ export class MarkdownEditor { console.error('Mermaid rendering error:', error); const errorDiv = document.createElement('div'); errorDiv.className = 'mermaid-error'; - errorDiv.textContent = `Mermaid Error: ${(error as Error).message}`; + errorDiv.textContent = trText('Mermaid Error: {{error}}', { + error: (error as Error).message, + }); pre.replaceWith(errorDiv); } } diff --git a/src/js/utils/ocr.ts b/src/js/utils/ocr.ts index 36d8aa86..ea4ff589 100644 --- a/src/js/utils/ocr.ts +++ b/src/js/utils/ocr.ts @@ -14,6 +14,8 @@ import { getPDFDocument } from './helpers.js'; import { loadPdfDocument } from './load-pdf-document.js'; import { createConfiguredTesseractWorker } from './tesseract-runtime.js'; +import { trText } from '../i18n/i18n.js'; + export interface OcrOptions { language: string; resolution: number; @@ -156,7 +158,11 @@ function recognizeWithTimeout( ): Promise { return new Promise((resolve, reject) => { const timer = setTimeout(() => { - reject(new Error(`OCR recognize timed out after ${timeoutMs}ms`)); + const error = new Error( + trText('OCR recognize timed out after {{timeoutMs}}ms', { timeoutMs }) + ); + error.name = 'OcrTimeoutError'; + reject(error); }, timeoutMs); worker .recognize(canvas, {}, { text: true, hocr: true }) @@ -217,7 +223,7 @@ export async function performOcr( newPdfDoc.registerFontkit(fontkit); - progress('Loading fonts...', 0); + progress(trText('Loading fonts...'), 0); const selectedLangs = language.split('+'); const cjkLangs = ['jpn', 'chi_sim', 'chi_tra', 'kor']; @@ -283,7 +289,10 @@ export async function performOcr( for (let i = 1; i <= pdf.numPages; i++) { progress( - `Processing page ${i} of ${pdf.numPages}`, + trText('Processing page {{i}} of {{numPages}}', { + i, + numPages: pdf.numPages, + }), (i - 1) / pdf.numPages ); @@ -295,7 +304,8 @@ export async function performOcr( canvas.width = viewport.width; canvas.height = viewport.height; const context = canvas.getContext('2d'); - if (!context) throw new Error('Failed to create canvas context'); + if (!context) + throw new Error(trText('Failed to create canvas context')); await pdfJsPage.render({ canvasContext: context, viewport, canvas }) .promise; @@ -318,9 +328,10 @@ export async function performOcr( const message = err instanceof Error ? err.message : String(err); warnings.push({ page: i, - kind: /timed out/i.test(message) - ? 'recognize-timeout' - : 'recognize-error', + kind: + err instanceof Error && err.name === 'OcrTimeoutError' + ? 'recognize-timeout' + : 'recognize-error', message, }); } @@ -369,7 +380,7 @@ export async function performOcr( } if (!newPdfDoc) { - throw new Error('OCR aborted before any page was processed'); + throw new Error(trText('OCR aborted before any page was processed')); } const savedBytes = await newPdfDoc.save(); diff --git a/src/js/utils/page-preview.ts b/src/js/utils/page-preview.ts index 641aa99c..4d9f352f 100644 --- a/src/js/utils/page-preview.ts +++ b/src/js/utils/page-preview.ts @@ -3,6 +3,8 @@ import type { PDFDocumentProxy } from 'pdfjs-dist'; import { PreviewState } from '@/types'; import './setup-pdf-worker.js'; +import { trText, trHtml } from '../i18n/i18n.js'; + const state: PreviewState = { modal: null, pdfjsDoc: null, @@ -20,17 +22,17 @@ function getOrCreateModal(): HTMLElement { modal.className = 'fixed inset-0 bg-black/80 backdrop-blur-sm z-[60] flex items-center justify-center opacity-0 pointer-events-none transition-opacity duration-200'; modal.innerHTML = ` - - -
      -
      Loading...
      +
      ${trHtml('Loading...')}
      `; @@ -62,9 +64,12 @@ async function renderPreviewPage(pageNumber: number): Promise { const prevBtn = modal.querySelector('#preview-prev') as HTMLElement; const nextBtn = modal.querySelector('#preview-next') as HTMLElement; - container.innerHTML = '
      Loading...
      '; + container.innerHTML = `
      ${trHtml('Loading...')}
      `; - pageInfo.textContent = `Page ${pageNumber} of ${state.totalPages}`; + pageInfo.textContent = trText('Page {{pageNumber}} of {{totalPages}}', { + pageNumber, + totalPages: state.totalPages, + }); prevBtn.style.visibility = pageNumber > 1 ? 'visible' : 'hidden'; nextBtn.style.visibility = pageNumber < state.totalPages ? 'visible' : 'hidden'; @@ -92,8 +97,7 @@ async function renderPreviewPage(pageNumber: number): Promise { state.currentPage = pageNumber; } catch (err) { console.error('Preview render error:', err); - container.innerHTML = - '
      Failed to render page
      '; + container.innerHTML = `
      ${trHtml('Failed to render page')}
      `; } } @@ -172,7 +176,7 @@ export function initPagePreview( const icon = document.createElement('button'); icon.className = 'page-preview-btn absolute bottom-1 right-1 bg-gray-900/80 hover:bg-indigo-600 text-white/70 hover:text-white rounded-full w-7 h-7 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity z-10'; - icon.title = 'Preview'; + icon.title = trText('Preview'); icon.innerHTML = ''; icon.addEventListener('click', (e) => { diff --git a/src/js/utils/password-prompt.ts b/src/js/utils/password-prompt.ts index 6e72572d..35e22b51 100644 --- a/src/js/utils/password-prompt.ts +++ b/src/js/utils/password-prompt.ts @@ -4,6 +4,8 @@ import { createIcons, icons } from 'lucide'; import { PasswordResponses } from 'pdfjs-dist'; import type { LoadedPdf } from '@/types'; +import { trText, trHtml } from '../i18n/i18n.js'; + let cachedPassword: string | null = null; let activeModalPromise: Promise | null = null; @@ -35,7 +37,7 @@ function ensureSingleModal(): HTMLDivElement {
      -

      Password Required

      +

      ${trHtml('Password Required')}

      @@ -43,7 +45,7 @@ function ensureSingleModal(): HTMLDivElement {
      + placeholder="${trHtml('Enter password')}" autocomplete="off" />
      `; @@ -85,19 +87,19 @@ function ensureBatchModal(): HTMLDivElement {

    -

    Enter passwords for each encrypted file

    +

    ${trHtml('Enter passwords for each encrypted file')}

    - +
    + placeholder="${trHtml('Password for all files')}" autocomplete="off" />
    `; @@ -237,7 +239,7 @@ export async function promptAndDecryptFile(file: File): Promise { if (!input || !submitBtn || !cancelBtn) return null; - if (titleEl) titleEl.textContent = 'Password Required'; + if (titleEl) titleEl.textContent = trText('Password Required'); if (subtitleEl) subtitleEl.textContent = file.name; if (errorEl) { errorEl.textContent = ''; @@ -250,10 +252,10 @@ export async function promptAndDecryptFile(file: File): Promise { input.value = ''; input.type = 'password'; submitBtn.disabled = false; - submitBtn.textContent = 'Unlock'; - submitBtn.dataset.originalText = 'Unlock'; + submitBtn.textContent = trText('Unlock'); + submitBtn.dataset.originalText = trText('Unlock'); cancelBtn.disabled = false; - cancelBtn.textContent = 'Skip'; + cancelBtn.textContent = trText('Skip'); modal.classList.remove('hidden'); modal.classList.add('flex'); @@ -285,7 +287,7 @@ export async function promptAndDecryptFile(file: File): Promise { const password = input.value; if (!password) { if (errorEl) { - errorEl.textContent = 'Please enter a password'; + errorEl.textContent = trText('Please enter a password'); errorEl.classList.remove('hidden'); } return; @@ -296,7 +298,7 @@ export async function promptAndDecryptFile(file: File): Promise { submitBtn.disabled = true; cancelBtn.disabled = true; if (progressEl) { - progressEl.textContent = 'Validating...'; + progressEl.textContent = trText('Validating...'); progressEl.classList.remove('hidden'); } @@ -310,13 +312,13 @@ export async function promptAndDecryptFile(file: File): Promise { input.value = ''; input.focus(); if (errorEl) { - errorEl.textContent = 'Incorrect password. Please try again.'; + errorEl.textContent = trText('Incorrect password. Please try again.'); errorEl.classList.remove('hidden'); } return; } - if (progressEl) progressEl.textContent = 'Decrypting...'; + if (progressEl) progressEl.textContent = trText('Decrypting...'); try { const decrypted = await decryptFileWithPassword(file, password); @@ -329,8 +331,9 @@ export async function promptAndDecryptFile(file: File): Promise { cancelBtn.disabled = false; if (progressEl) progressEl.classList.add('hidden'); if (errorEl) { - errorEl.textContent = - 'Failed to decrypt. Try the Decrypt tool instead.'; + errorEl.textContent = trText( + 'Failed to decrypt. Try the Decrypt tool instead.' + ); errorEl.classList.remove('hidden'); } } @@ -450,7 +453,9 @@ export async function promptAndDecryptBatch( } if (titleEl) - titleEl.textContent = `${fileNames.length} Files Need a Password`; + titleEl.textContent = trText('{{length}} Files Need a Password', { + length: fileNames.length, + }); samePwCheckbox.checked = true; sharedInput.value = ''; @@ -465,9 +470,9 @@ export async function promptAndDecryptBatch( ${esc(name)}
    - - @@ -485,8 +490,8 @@ export async function promptAndDecryptBatch( progressEl.classList.add('hidden'); } submitBtn.disabled = false; - submitBtn.textContent = 'Unlock All'; - submitBtn.dataset.originalText = 'Unlock All'; + submitBtn.textContent = trText('Unlock All'); + submitBtn.dataset.originalText = trText('Unlock All'); cancelBtn.disabled = false; modal.classList.remove('hidden'); @@ -510,7 +515,9 @@ export async function promptAndDecryptBatch( function updateButtons(autoClose = false) { const hasSucceeded = succeededSet.size > 0; - cancelBtn.textContent = hasSucceeded ? 'Skip Remaining' : 'Skip All'; + cancelBtn.textContent = hasSucceeded + ? trText('Skip Remaining') + : trText('Skip All'); const remaining = getRemainingCount(); if (autoClose && remaining === 0) { @@ -519,7 +526,9 @@ export async function promptAndDecryptBatch( } if (hasSucceeded) { - submitBtn.textContent = `Unlock Remaining (${remaining})`; + submitBtn.textContent = trText('Unlock Remaining ({{remaining}})', { + remaining, + }); submitBtn.dataset.originalText = submitBtn.textContent; } } @@ -596,7 +605,7 @@ export async function promptAndDecryptBatch( const pwInput = row.querySelector('input[data-pw-idx]'); if (pwInput) pwInput.disabled = false; - btn.title = 'Skip this file'; + btn.title = trText('Skip this file'); } else { skippedSet.add(idx); row.classList.add('opacity-40'); @@ -604,7 +613,7 @@ export async function promptAndDecryptBatch( const pwInput = row.querySelector('input[data-pw-idx]'); if (pwInput) pwInput.disabled = true; - btn.title = 'Include this file'; + btn.title = trText('Include this file'); } updateButtons(true); } @@ -650,8 +659,10 @@ export async function promptAndDecryptBatch( if (!password) { if (errorEl) { const msg = useSame - ? 'Please enter a password' - : `Please enter a password for ${fileNames[i]} or skip it`; + ? trText('Please enter a password') + : trText('Please enter a password for {{i}} or skip it', { + i: fileNames[i], + }); errorEl.textContent = msg; errorEl.classList.remove('hidden'); } @@ -678,7 +689,10 @@ export async function promptAndDecryptBatch( const realIdx = encryptedIndices[localIdx]; if (progressEl) { - progressEl.textContent = `Validating ${i + 1} of ${toProcess.length}: ${files[realIdx].name}`; + progressEl.textContent = trText( + 'Validating {{n}} of {{length}}: {{name}}', + { n: i + 1, length: toProcess.length, name: files[realIdx].name } + ); progressEl.classList.remove('hidden'); } @@ -694,7 +708,10 @@ export async function promptAndDecryptBatch( } if (progressEl) { - progressEl.textContent = `Decrypting ${i + 1} of ${toProcess.length}: ${files[realIdx].name}`; + progressEl.textContent = trText( + 'Decrypting {{n}} of {{length}}: {{name}}', + { n: i + 1, length: toProcess.length, name: files[realIdx].name } + ); } try { @@ -717,7 +734,9 @@ export async function promptAndDecryptBatch( if (failedNames.length > 0) { if (errorEl) { - errorEl.textContent = `Wrong password for: ${failedNames.join(', ')}`; + errorEl.textContent = trText('Wrong password for: {{join}}', { + join: failedNames.join(', '), + }); errorEl.classList.remove('hidden'); } if (!samePwCheckbox.checked) { @@ -730,7 +749,7 @@ export async function promptAndDecryptBatch( sharedInput.focus(); } updateButtons(); - submitBtn.textContent = 'Retry Failed'; + submitBtn.textContent = trText('Retry Failed'); return; } diff --git a/src/js/utils/pdf-content-tokens.ts b/src/js/utils/pdf-content-tokens.ts index 9b7712b6..0c368281 100644 --- a/src/js/utils/pdf-content-tokens.ts +++ b/src/js/utils/pdf-content-tokens.ts @@ -1,5 +1,7 @@ import type { ContentOperation, ContentToken } from '@/types'; +import { trText } from '../i18n/i18n.js'; + const charCode = (char: string) => char.charCodeAt(0); const BACKSLASH = charCode('\\'); @@ -82,7 +84,7 @@ function findLiteralStringEnd(bytes: Uint8Array, start: number): number { if (depth === 0) return i + 1; } } - throw new Error('Unterminated string in content stream'); + throw new Error(trText('Unterminated string in content stream')); } function findHexStringEnd(bytes: Uint8Array, start: number): number { @@ -90,10 +92,10 @@ function findHexStringEnd(bytes: Uint8Array, start: number): number { const byte = bytes[i]; if (byte === GREATER_THAN) return i + 1; if (!isHexDigit(byte) && !WHITESPACE.has(byte)) { - throw new Error('Invalid hex string in content stream'); + throw new Error(trText('Invalid hex string in content stream')); } } - throw new Error('Unterminated hex string in content stream'); + throw new Error(trText('Unterminated hex string in content stream')); } function findClosingDelimiter( @@ -105,7 +107,9 @@ function findClosingDelimiter( while (true) { pos = skipWhitespaceAndComments(bytes, pos); if (pos >= bytes.length) { - throw new Error('Unterminated array or dictionary in content stream'); + throw new Error( + trText('Unterminated array or dictionary in content stream') + ); } if (closing.every((byte, offset) => bytes[pos + offset] === byte)) { return pos + closing.length; @@ -143,7 +147,7 @@ function readToken(bytes: Uint8Array, start: number): ContentToken { return { kind: 'name', value: name, start, end }; } if (DELIMITERS.has(byte)) { - throw new Error('Unexpected delimiter in content stream'); + throw new Error(trText('Unexpected delimiter in content stream')); } let end = start; @@ -228,7 +232,7 @@ function skipInlineImage(bytes: Uint8Array, start: number): number { while (true) { pos = skipWhitespaceAndComments(bytes, pos); if (pos >= bytes.length) { - throw new Error('Unterminated inline image in content stream'); + throw new Error(trText('Unterminated inline image in content stream')); } const token = readToken(bytes, pos); pos = token.end; @@ -239,7 +243,7 @@ function skipInlineImage(bytes: Uint8Array, start: number): number { } else if (token.kind === 'name') { pendingKey = token; } else { - throw new Error('Malformed inline image in content stream'); + throw new Error(trText('Malformed inline image in content stream')); } } @@ -250,7 +254,7 @@ function skipInlineImage(bytes: Uint8Array, start: number): number { let end = dataStart + dataLength; while (end < bytes.length && WHITESPACE.has(bytes[end])) end++; if (isEndImageOperator(bytes, end)) return end + 2; - throw new Error('Malformed inline image in content stream'); + throw new Error(trText('Malformed inline image in content stream')); } for (let i = dataStart; i + 1 < bytes.length; i++) { @@ -260,7 +264,7 @@ function skipInlineImage(bytes: Uint8Array, start: number): number { if (!isFollowedByText(bytes, i + 2)) break; return i + 2; } - throw new Error('Unterminated inline image in content stream'); + throw new Error(trText('Unterminated inline image in content stream')); } export function parseContentOperations(bytes: Uint8Array): ContentOperation[] { diff --git a/src/js/utils/pdf-decrypt.ts b/src/js/utils/pdf-decrypt.ts index f5237eb0..fe71486d 100644 --- a/src/js/utils/pdf-decrypt.ts +++ b/src/js/utils/pdf-decrypt.ts @@ -2,6 +2,8 @@ import { getCpdf, isCpdfAvailable } from './cpdf-helper'; import { isPyMuPDFAvailable, loadPyMuPDF } from './pymupdf-loader'; import type { CpdfInstance } from '@/types'; +import { trText } from '../i18n/i18n.js'; + export type PdfDecryptEngine = 'cpdf' | 'pymupdf'; export interface PdfDecryptResult { @@ -76,7 +78,7 @@ async function decryptWithCpdf( pdf = null; if (!(outputBytes instanceof Uint8Array) || outputBytes.length === 0) { - throw new Error('CoherentPDF produced an empty decrypted file.'); + throw new Error(trText('CoherentPDF produced an empty decrypted file.')); } return copyBytes(outputBytes); @@ -102,13 +104,15 @@ async function decryptWithPyMuPDF( if (document.needsPass || document.isEncrypted) { const authenticated = document.authenticate(password); if (!authenticated) { - throw new Error('Invalid PDF password.'); + const error = new Error(trText('Invalid PDF password.')); + error.name = 'PasswordError'; + throw error; } } const outputBytes = document.save(); if (!(outputBytes instanceof Uint8Array) || outputBytes.length === 0) { - throw new Error('PyMuPDF produced an empty decrypted file.'); + throw new Error(trText('PyMuPDF produced an empty decrypted file.')); } return copyBytes(outputBytes); @@ -145,7 +149,7 @@ export async function decryptPdfBytes( console.info( `${DECRYPT_LOG_PREFIX} CoherentPDF is not configured, skipping to PyMuPDF` ); - errors.push('CoherentPDF: not configured.'); + errors.push(trText('CoherentPDF: not configured.')); } if (isPyMuPDFAvailable()) { @@ -166,7 +170,7 @@ export async function decryptPdfBytes( } } else { console.warn(`${DECRYPT_LOG_PREFIX} PyMuPDF is not configured`); - errors.push('PyMuPDF: not configured.'); + errors.push(trText('PyMuPDF: not configured.')); } throw new Error(errors.join('\n')); diff --git a/src/js/utils/pdf-operations.ts b/src/js/utils/pdf-operations.ts index 3892f67d..825486ad 100644 --- a/src/js/utils/pdf-operations.ts +++ b/src/js/utils/pdf-operations.ts @@ -1,6 +1,8 @@ import { PDFDocument, degrees, rgb, StandardFonts, PageSizes } from 'pdf-lib'; import { loadPdfDocument } from './load-pdf-document.js'; +import { trText } from '../i18n/i18n.js'; + export async function mergePdfs( pdfBytesList: Uint8Array[] ): Promise { @@ -132,7 +134,8 @@ export async function deletePdfPages( } } - if (pagesToKeep.length === 0) throw new Error('Cannot delete all pages'); + if (pagesToKeep.length === 0) + throw new Error(trText('Cannot delete all pages')); const newPdf = await PDFDocument.create(); const copiedPages = await newPdf.copyPages(srcDoc, pagesToKeep); @@ -280,7 +283,7 @@ export async function addTextWatermark( const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); - if (!ctx) throw new Error('Failed to create canvas context'); + if (!ctx) throw new Error(trText('Failed to create canvas context')); const dpr = 2; const colorR = Math.round(options.color.r * 255); @@ -301,7 +304,8 @@ export async function addTextWatermark( const blob = await new Promise((resolve, reject) => { canvas.toBlob( - (b) => (b ? resolve(b) : reject(new Error('Canvas toBlob failed'))), + (b) => + b ? resolve(b) : reject(new Error(trText('Canvas toBlob failed'))), 'image/png' ); }); diff --git a/src/js/utils/pymupdf-loader.ts b/src/js/utils/pymupdf-loader.ts index 0251204b..e05051d2 100644 --- a/src/js/utils/pymupdf-loader.ts +++ b/src/js/utils/pymupdf-loader.ts @@ -6,6 +6,8 @@ import type { PyMuPDFRasterizeOptions, } from '@/types'; +import { trText } from '../i18n/i18n.js'; + let cachedPyMuPDF: PyMuPDFInstance | null = null; let loadPromise: Promise | null = null; @@ -40,12 +42,16 @@ export async function loadPyMuPDF(): Promise { loadPromise = (async () => { if (!WasmProvider.isConfigured('pymupdf')) { throw new Error( - 'PyMuPDF is not configured. Please configure it in Advanced Settings.' + trText( + 'PyMuPDF is not configured. Please configure it in Advanced Settings.' + ) ); } if (!WasmProvider.isConfigured('ghostscript')) { throw new Error( - 'Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.' + trText( + 'Ghostscript is not configured. PyMuPDF requires Ghostscript for some operations. Please configure both in Advanced Settings.' + ) ); } @@ -60,7 +66,7 @@ export async function loadPyMuPDF(): Promise { if (typeof module.PyMuPDF !== 'function') { throw new Error( - 'PyMuPDF module did not export expected PyMuPDF class.' + trText('PyMuPDF module did not export expected PyMuPDF class.') ); } @@ -75,9 +81,12 @@ export async function loadPyMuPDF(): Promise { } catch (error: unknown) { loadPromise = null; const msg = error instanceof Error ? error.message : String(error); - throw new Error(`Failed to load PyMuPDF from CDN: ${msg}`, { - cause: error, - }); + throw new Error( + trText('Failed to load PyMuPDF from CDN: {{msg}}', { msg }), + { + cause: error, + } + ); } })(); diff --git a/src/js/utils/render-utils.ts b/src/js/utils/render-utils.ts index ca2281a7..b66227a3 100644 --- a/src/js/utils/render-utils.ts +++ b/src/js/utils/render-utils.ts @@ -1,6 +1,8 @@ import * as pdfjsLib from 'pdfjs-dist'; import './setup-pdf-worker.js'; +import { trText } from '../i18n/i18n.js'; + /** * Configuration for progressive rendering */ @@ -76,7 +78,7 @@ export function createPlaceholder( const loadingText = document.createElement('span'); loadingText.className = 'text-gray-500 text-xs'; - loadingText.textContent = 'Loading...'; + loadingText.textContent = trText('Loading...'); skeletonContainer.appendChild(loadingText); placeholder.appendChild(skeletonContainer); @@ -101,7 +103,9 @@ export async function renderPageToCanvas( const context = canvas.getContext('2d'); if (!context) { - throw new Error(`Failed to get 2D context for page ${pageNumber}`); + throw new Error( + trText('Failed to get 2D context for page {{pageNumber}}', { pageNumber }) + ); } await page.render({ diff --git a/src/js/utils/sanitize.ts b/src/js/utils/sanitize.ts index ac54f77d..03bd8943 100644 --- a/src/js/utils/sanitize.ts +++ b/src/js/utils/sanitize.ts @@ -20,6 +20,8 @@ import { flattenFormsInDoc } from './flatten-annotations.js'; import { parseContentOperations } from './pdf-content-tokens.js'; import type { ContentOperation, PDFDocumentInternal } from '@/types'; +import { trText } from '../i18n/i18n.js'; + function getCatalogDict(pdfDoc: PDFDocument): PDFDict { return pdfDoc.catalog; } @@ -485,7 +487,7 @@ function removeHiddenContent( ? properties.get(PDFName.of(property.value)) : undefined; if (value === undefined) { - throw new Error('Unresolved optional content reference'); + throw new Error(trText('Unresolved optional content reference')); } return !isVisible(value); }; diff --git a/src/js/utils/simple-mode-footer.ts b/src/js/utils/simple-mode-footer.ts index 42355671..8567dad3 100644 --- a/src/js/utils/simple-mode-footer.ts +++ b/src/js/utils/simple-mode-footer.ts @@ -1,4 +1,5 @@ import { createLanguageSwitcher } from '../i18n/language-switcher.js'; +import { onPageReady } from '../i18n/i18n.js'; // Handle simple mode adjustments for tool pages if (__SIMPLE_MODE__) { @@ -9,11 +10,21 @@ if (__SIMPLE_MODE__) { 'Frequently Asked Questions', ]; + const keysToHide = [ + 'howItWorks.title', + 'relatedTools.title', + 'faq.sectionTitle', + ]; + document.querySelectorAll('section').forEach((section) => { const h2 = section.querySelector('h2'); if (h2) { const heading = h2.textContent?.trim() || ''; - if (sectionsToHide.some((text) => heading.includes(text))) { + const key = h2.getAttribute('data-i18n') || ''; + if ( + keysToHide.includes(key) || + sectionsToHide.some((text) => heading.includes(text)) + ) { (section as HTMLElement).style.display = 'none'; } } @@ -21,12 +32,14 @@ if (__SIMPLE_MODE__) { const langContainer = document.getElementById('simple-mode-lang-switcher'); if (langContainer) { - const switcher = createLanguageSwitcher(); - const dropdown = switcher.querySelector('div[role="menu"]'); - if (dropdown) { - dropdown.classList.remove('mt-2'); - dropdown.classList.add('bottom-full', 'mb-2'); - } - langContainer.appendChild(switcher); + onPageReady(() => { + const switcher = createLanguageSwitcher(); + const dropdown = switcher.querySelector('div[role="menu"]'); + if (dropdown) { + dropdown.classList.remove('mt-2'); + dropdown.classList.add('bottom-full', 'mb-2'); + } + langContainer.appendChild(switcher); + }); } } diff --git a/src/js/utils/split-pdf-helpers.ts b/src/js/utils/split-pdf-helpers.ts index 6e435b9e..346b4976 100644 --- a/src/js/utils/split-pdf-helpers.ts +++ b/src/js/utils/split-pdf-helpers.ts @@ -1,5 +1,7 @@ import type { QpdfInstanceExtended } from '@/types'; +import { trText } from '../i18n/i18n.js'; + export function parseRangeGroups( input: string, totalPages: number @@ -131,11 +133,15 @@ export function extractPagesWithQpdf( ]); try { if (exitCode !== 0 && exitCode !== 3) { - throw new Error(`Failed to extract pages (qpdf exit code ${exitCode}).`); + throw new Error( + trText('Failed to extract pages (qpdf exit code {{exitCode}}).', { + exitCode, + }) + ); } const bytes = qpdf.FS.readFile(outputPath, { encoding: 'binary' }); if (!bytes || bytes.length === 0) { - throw new Error('Page extraction produced an empty PDF.'); + throw new Error(trText('Page extraction produced an empty PDF.')); } return bytes; } finally { diff --git a/src/js/utils/tesseract-language-availability.ts b/src/js/utils/tesseract-language-availability.ts index 16cff309..9b815337 100644 --- a/src/js/utils/tesseract-language-availability.ts +++ b/src/js/utils/tesseract-language-availability.ts @@ -1,5 +1,7 @@ import { tesseractLanguages } from '../config/tesseract-languages.js'; +import { trText } from '../i18n/i18n.js'; + export const TESSERACT_AVAILABLE_LANGUAGES_ENV_KEY = 'VITE_TESSERACT_AVAILABLE_LANGUAGES' as const; @@ -89,9 +91,16 @@ function buildUnsupportedLanguageMessage( const availableText = formatTesseractLanguageList(availableLanguages); return [ - `This BentoPDF build only bundles OCR data for ${availableText}.`, - `The requested OCR language is not available: ${unavailableText}.`, - 'Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.', + trText('This BentoPDF build only bundles OCR data for {{availableText}}.', { + availableText, + }), + trText( + 'The requested OCR language is not available: {{unavailableText}}.', + { unavailableText } + ), + trText( + 'Choose one of the bundled languages or rebuild the air-gapped bundle with the missing language added to --ocr-languages.' + ), ].join(' '); } diff --git a/src/js/utils/tesseract-runtime.ts b/src/js/utils/tesseract-runtime.ts index 3af7ff38..3970d4de 100644 --- a/src/js/utils/tesseract-runtime.ts +++ b/src/js/utils/tesseract-runtime.ts @@ -4,6 +4,8 @@ import { TESSERACT_AVAILABLE_LANGUAGES_ENV_KEY, } from './tesseract-language-availability.js'; +import { trText } from '../i18n/i18n.js'; + const TESSERACT_ENV_KEYS = [ 'VITE_TESSERACT_WORKER_URL', 'VITE_TESSERACT_CORE_URL', @@ -101,7 +103,10 @@ export function buildTesseractWorkerOptions( if (!hasCompleteTesseractOverrides(config)) { const missing = getIncompleteTesseractOverrideKeys(config).join(', '); throw new Error( - `Self-hosted OCR assets are partially configured. Set ${missing} together with the other Tesseract asset URLs.` + trText( + 'Self-hosted OCR assets are partially configured. Set {{missing}} together with the other Tesseract asset URLs.', + { missing } + ) ); } diff --git a/src/js/utils/wasm-provider.ts b/src/js/utils/wasm-provider.ts index d3decaa7..936ec6c3 100644 --- a/src/js/utils/wasm-provider.ts +++ b/src/js/utils/wasm-provider.ts @@ -1,3 +1,4 @@ +import { trHtml, trText } from '../i18n/i18n.js'; export type WasmPackage = 'pymupdf' | 'ghostscript' | 'cpdf'; interface WasmProviderConfig { @@ -152,7 +153,7 @@ class WasmProviderManager { const normalizedUrl = withTrailingSlash(url); const host = hostnameOf(normalizedUrl); if (!host) { - throw new Error('Invalid URL'); + throw new Error(trText('Invalid URL')); } const envDefault = this.getEnvDefault(packageName); if (envDefault && normalizedUrl === withTrailingSlash(envDefault)) { @@ -196,7 +197,7 @@ class WasmProviderManager { ): Promise<{ valid: boolean; error?: string }> { const testUrl = url || this.config[packageName]; if (!testUrl) { - return { valid: false, error: 'No URL configured' }; + return { valid: false, error: trText('No URL configured') }; } try { @@ -204,14 +205,15 @@ class WasmProviderManager { if (!['http:', 'https:'].includes(parsedUrl.protocol)) { return { valid: false, - error: 'URL must start with http:// or https://', + error: trText('URL must start with http:// or https://'), }; } } catch { return { valid: false, - error: - 'Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)', + error: trText( + 'Invalid URL format. Please enter a valid URL (e.g., https://example.com/wasm/)' + ), }; } @@ -241,7 +243,10 @@ class WasmProviderManager { if (!response.ok) { return { valid: false, - error: `Could not find ${testFile} at the specified URL (HTTP ${response.status}). Make sure the file exists.`, + error: trText( + 'Could not find {{testFile}} at the specified URL (HTTP {{status}}). Make sure the file exists.', + { testFile, status: response.status } + ), }; } @@ -253,7 +258,9 @@ class WasmProviderManager { } catch { return { valid: false, - error: `File exists but could not be read. Check CORS configuration.`, + error: trText( + 'File exists but could not be read. Check CORS configuration.' + ), }; } } @@ -267,7 +274,10 @@ class WasmProviderManager { ) { return { valid: false, - error: `The URL returned unexpected content type: ${contentType}. Expected a JavaScript file.`, + error: trText( + 'The URL returned unexpected content type: {{contentType}}. Expected a JavaScript file.', + { contentType } + ), }; } @@ -277,7 +287,8 @@ class WasmProviderManager { return { valid: true }; } catch (e: unknown) { - const errorMessage = e instanceof Error ? e.message : 'Unknown error'; + const errorMessage = + e instanceof Error ? e.message : trText('Unknown error'); if ( errorMessage.includes('Failed to fetch') || @@ -285,14 +296,15 @@ class WasmProviderManager { ) { return { valid: false, - error: - 'Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.', + error: trText( + 'Network error: Could not connect to the URL. Check that the URL is correct and the server allows CORS requests.' + ), }; } return { valid: false, - error: `Network error: ${errorMessage}`, + error: trText('Network error: {{error}}', { error: errorMessage }), }; } } @@ -322,9 +334,9 @@ class WasmProviderManager { getPackageDisplayName(packageName: WasmPackage): string { const names: Record = { - pymupdf: 'PyMuPDF (Document Processing)', - ghostscript: 'Ghostscript (PDF/A Conversion)', - cpdf: 'CoherentPDF (Bookmarks & Metadata)', + pymupdf: trText('PyMuPDF (Document Processing)'), + ghostscript: trText('Ghostscript (PDF/A Conversion)'), + cpdf: trText('CoherentPDF (Bookmarks & Metadata)'), }; return names[packageName]; } @@ -332,29 +344,29 @@ class WasmProviderManager { getPackageFeatures(packageName: WasmPackage): string[] { const features: Record = { pymupdf: [ - 'PDF to Text', - 'PDF to Markdown', - 'PDF to SVG', - 'PDF to Images (High Quality)', - 'PDF to DOCX', - 'PDF to Excel/CSV', - 'Extract Images', - 'Extract Tables', - 'EPUB/MOBI/FB2/XPS/CBZ to PDF', - 'Deskew PDF', - 'PDF Layers', + trText('PDF to Text'), + trText('PDF to Markdown'), + trText('PDF to SVG'), + trText('PDF to Images (High Quality)'), + trText('PDF to DOCX'), + trText('PDF to Excel/CSV'), + trText('Extract Images'), + trText('Extract Tables'), + trText('EPUB/MOBI/FB2/XPS/CBZ to PDF'), + trText('Deskew PDF'), + trText('PDF Layers'), ], - ghostscript: ['PDF/A Conversion', 'Font to Outline'], + ghostscript: [trText('PDF/A Conversion'), trText('Font to Outline')], cpdf: [ - 'Merge PDF', - 'Alternate Merge', - 'Split by Bookmarks', - 'Table of Contents', - 'PDF to JSON', - 'JSON to PDF', - 'Add/Edit/Extract Attachments', - 'Edit Bookmarks', - 'PDF Metadata', + trText('Merge PDF'), + trText('Alternate Merge'), + trText('Split by Bookmarks'), + trText('Table of Contents'), + trText('PDF to JSON'), + trText('JSON to PDF'), + trText('Add/Edit/Extract Attachments'), + trText('Edit Bookmarks'), + trText('PDF Metadata'), ], }; return features[packageName]; @@ -389,17 +401,17 @@ export function showWasmRequiredDialog(
    -

    Advanced Feature Required

    -

    External processing module needed

    +

    ${trHtml('Advanced Feature Required')}

    +

    ${trHtml('External processing module needed')}

    - This feature requires ${displayName} to be configured. + ${trHtml('This feature requires {{name}} to be configured.', { name: '\u0000' }).replace('\u0000', `${displayName}`)}

    -

    Features enabled by this module:

    +

    ${trHtml('Features enabled by this module:')}

      ${features .slice(0, 4) @@ -408,21 +420,21 @@ export function showWasmRequiredDialog( `
    • ✓ ${f}
    • ` ) .join('')} - ${features.length > 4 ? `
    • + ${features.length - 4} more...
    • ` : ''} + ${features.length > 4 ? `
    • ${trHtml('+ {{n}} more...', { n: features.length - 4 })}
    • ` : ''}

    - This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms. + ${trHtml('This module is licensed under AGPL-3.0. By configuring it, you agree to its license terms.')}

    `; diff --git a/src/js/utils/xml-to-pdf.ts b/src/js/utils/xml-to-pdf.ts index 28a9dae3..0e1f1a4b 100644 --- a/src/js/utils/xml-to-pdf.ts +++ b/src/js/utils/xml-to-pdf.ts @@ -2,6 +2,8 @@ import { jsPDF } from 'jspdf'; import autoTable from 'jspdf-autotable'; import { XMLParser } from 'fast-xml-parser'; +import { trText } from '../i18n/i18n.js'; + export interface XmlToPdfOptions { onProgress?: (percent: number, message: string) => void; } @@ -19,14 +21,14 @@ export async function convertXmlToPdf( ): Promise { const { onProgress } = options || {}; - onProgress?.(10, 'Reading XML file...'); + onProgress?.(10, trText('Reading XML file...')); const rawXmlText = await file.text(); const xmlText = String(rawXmlText) .replace(//gi, '') .replace(//gi, '') .replace(/<\?xml-stylesheet[\s\S]*?\?>/gi, ''); - onProgress?.(30, 'Parsing XML structure...'); + onProgress?.(30, trText('Parsing XML structure...')); const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: ATTR_PREFIX, @@ -50,12 +52,12 @@ export async function convertXmlToPdf( const rootKeys = Object.keys(parsed); if (rootKeys.length === 0) { - throw new Error('Invalid XML: no root element'); + throw new Error(trText('Invalid XML: no root element')); } const rootName = rootKeys[0]; const rootValue = parsed[rootName]; - onProgress?.(50, 'Analyzing data structure...'); + onProgress?.(50, trText('Analyzing data structure...')); const doc: jsPDFWithAutoTable = new jsPDF({ orientation: 'landscape', @@ -73,7 +75,7 @@ export async function convertXmlToPdf( }); yPosition += 15; - onProgress?.(60, 'Generating formatted content...'); + onProgress?.(60, trText('Generating formatted content...')); if (isPlainObject(rootValue)) { const rootObj = rootValue; @@ -155,7 +157,7 @@ export async function convertXmlToPdf( } } - onProgress?.(90, 'Finalizing PDF...'); + onProgress?.(90, trText('Finalizing PDF...')); const pdfBlob = doc.output('blob'); diff --git a/src/js/workflow/editor.ts b/src/js/workflow/editor.ts index f702275e..fae2c1d9 100644 --- a/src/js/workflow/editor.ts +++ b/src/js/workflow/editor.ts @@ -10,6 +10,7 @@ import { DataflowEngine } from 'rete-engine'; import type { DataflowEngineScheme } from 'rete-engine'; import { LitElement, html } from 'lit'; import type { BaseWorkflowNode } from './nodes/base-node'; +import { trText } from '../i18n/i18n'; import phosphorCSS from '@phosphor-icons/web/regular?inline'; // Shared stylesheet for Phosphor icons (font-face already loaded globally, strip it) @@ -36,14 +37,14 @@ const categoryColors: Record = { function getStatusInfo(status: string, connected: boolean) { if (status === 'running') - return { color: '#eab308', label: 'Running...', animate: true }; + return { color: '#eab308', label: trText('Running...'), animate: true }; if (status === 'completed') - return { color: '#22c55e', label: 'Complete', animate: false }; + return { color: '#22c55e', label: trText('Complete'), animate: false }; if (status === 'error') - return { color: '#ef4444', label: 'Failed', animate: false }; + return { color: '#ef4444', label: trText('Failed'), animate: false }; return { color: connected ? '#22c55e' : '#6b7280', - label: connected ? 'Connected' : 'Not connected', + label: connected ? trText('Connected') : trText('Not connected'), animate: false, }; } @@ -133,7 +134,7 @@ class WorkflowNodeElement extends LitElement { Not connected${trText('Not connected')} ; @@ -140,7 +141,7 @@ export async function executeWorkflow( nodeId: node.id, nodeName: node.label, status: 'running', - message: `Processing ${node.label}...`, + message: trText('Processing {{name}}...', { name: node.label }), }); await tick(); diff --git a/src/js/workflow/i18n.ts b/src/js/workflow/i18n.ts index e0ba9aaa..a97fcb70 100644 --- a/src/js/workflow/i18n.ts +++ b/src/js/workflow/i18n.ts @@ -1,4 +1,4 @@ -import { t } from '../i18n/i18n'; +import { hasKey, t, trText } from '../i18n/i18n'; import type { NodeCategory } from './types'; import type { NodeRegistryEntry } from './nodes/registry'; @@ -23,8 +23,7 @@ function toCamelCase(str: string): string { } function translateOrFallback(key: string, fallback: string): string { - const value = t(key); - return value && value !== key ? value : fallback; + return hasKey(key) ? t(key) : trText(fallback); } export function translateCategory(category: NodeCategory): string { @@ -46,7 +45,7 @@ export function translateNodeLabel( entry.label ); } - return entry.label; + return trText(entry.label); } export function translateNodeDescription( @@ -63,5 +62,5 @@ export function translateNodeDescription( entry.description ); } - return entry.description; + return trText(entry.description); } diff --git a/src/pages/bates-numbering.html b/src/pages/bates-numbering.html index 09943d3a..a1cf0af8 100644 --- a/src/pages/bates-numbering.html +++ b/src/pages/bates-numbering.html @@ -147,28 +147,28 @@ id="style-preset" class="w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500" > - + - + - + - + diff --git a/src/pages/cbz-to-pdf.html b/src/pages/cbz-to-pdf.html index bcb24f52..7d2c9097 100644 --- a/src/pages/cbz-to-pdf.html +++ b/src/pages/cbz-to-pdf.html @@ -61,7 +61,7 @@ - CBZ to PDF - Convert XPS/OCBZ to PDF - BentoPDF + CBZ to PDF - Convert Comic Book Archives to PDF - BentoPDF diff --git a/src/pages/fb2-to-pdf.html b/src/pages/fb2-to-pdf.html index 0f5c426d..7c92b23e 100644 --- a/src/pages/fb2-to-pdf.html +++ b/src/pages/fb2-to-pdf.html @@ -61,7 +61,7 @@ - FB2 to PDF - Convert XPS/OFB2 to PDF - BentoPDF + FB2 to PDF - Convert FictionBook to PDF - BentoPDF diff --git a/src/pages/mobi-to-pdf.html b/src/pages/mobi-to-pdf.html index 5eb537a1..e5b8accb 100644 --- a/src/pages/mobi-to-pdf.html +++ b/src/pages/mobi-to-pdf.html @@ -61,7 +61,7 @@ - MOBI to PDF - Convert XPS/OMOBI to PDF - BentoPDF + MOBI to PDF - Convert MOBI eBooks to PDF - BentoPDF diff --git a/src/pages/pages-to-pdf.html b/src/pages/pages-to-pdf.html index 5edbd12d..b01f6e57 100644 --- a/src/pages/pages-to-pdf.html +++ b/src/pages/pages-to-pdf.html @@ -61,7 +61,7 @@ - Pages to PDF - Convert WordPerfect to PDF - BentoPDF + Pages to PDF - Convert Apple Pages to PDF - BentoPDF diff --git a/src/pages/sanitize-pdf.html b/src/pages/sanitize-pdf.html index 6c92c291..e35b2152 100644 --- a/src/pages/sanitize-pdf.html +++ b/src/pages/sanitize-pdf.html @@ -150,7 +150,7 @@